muon-v0.4.0/0002755000175000017500000000000014753103257011650 5ustar buildbuildmuon-v0.4.0/.builds/0002755000175000017500000000000014753102770013207 5ustar buildbuildmuon-v0.4.0/.builds/netbsd.yml0000644000175000017500000000075614753102770015217 0ustar buildbuild# SPDX-FileCopyrightText: Stone Tickle # SPDX-License-Identifier: GPL-3.0-only image: netbsd/latest packages: sources: - https://git.sr.ht/~lattis/muon tasks: - build: | cd muon # TODO remove this when we implement rpaths export LD_LIBRARY_PATH=/usr/pkg/lib tools/ci/bootstrap.sh build - test: | cd muon/build # TODO remove this when we implement rpaths export LD_LIBRARY_PATH=/usr/pkg/lib ./muon test -d dots -s lang muon-v0.4.0/.builds/alpine.yml0000644000175000017500000000543614753102770015210 0ustar buildbuild# SPDX-FileCopyrightText: Stone Tickle # SPDX-License-Identifier: GPL-3.0-only image: alpine/3.21 secrets: - 2fe5fef6-db89-4410-8147-07e314589d18 - 18083346-dfba-4050-bc05-413561f99228 repositories: edge_testing: > http://dl-cdn.alpinelinux.org/alpine/edge/testing https://muon.build/nothing ../../../dev/null community: > # must be kept in sync with the image's alpine version http://dl-cdn.alpinelinux.org/alpine/v3.21/community https://muon.build/nothing ../../../dev/null packages: - curl-dev - libarchive-dev - pkgconf-dev - python3 # for project tests, meson-reference.3, and parts of the website - linux-headers # used in a few project tests - py3-yaml # for meson-reference.3 - scdoc # for meson.build.5 and muon.1 - mandoc # for html man pages - mdbook # for book - reuse # for licensing compliance # alternative c compilers - clang - tcc - tcc-libs-static # tcc 0.9.27_git20220323-r1 is broken without this # for static builds - acl-static - brotli-static - bzip2-static - curl-static - expat-static - libarchive-static - lz4-static - nghttp2-static - openssl-libs-static - xz-static - zlib-static - zstd-static - libidn2-static - libunistring-static - libpsl-static # for releases - rsync sources: - https://git.sr.ht/~lattis/muon environment: PKG_CONFIG_PATH: /usr/lib/pkgconfig tasks: - fix-static-libs: | # Because static libcares is installed as libcares_static, and this is # not listed in any .pc files, symlink it to the expected location. sudo ln -s /usr/lib/libcares_static.a /usr/lib/libcares.a - reuse: | cd muon reuse lint - push_to_gh_mirror: | cd muon tools/ci/push_to_gh_mirror.sh - kickoff_custom_ci: | cd muon if [ -d ~/.ssh ]; then tools/ci/solaris11.sh submit fi - build_gcc: | # In order to fetch the meson-docs wrap, we have to build muon twice, # once to bootstrap, and then again when we have libcurl cd muon OPTS="-Dlibpkgconf=enabled -Dlibarchive=enabled -Dlibcurl=enabled -Dbuildtype=release -Dstatic=true -Dwebsite=true -Dwerror=true" CC=gcc tools/ci/bootstrap.sh build $OPTS build/muon setup $OPTS build build/muon -C build samu - build_tcc: | cd muon CC=tcc tools/ci/bootstrap.sh build-tcc - test_gcc: | cd muon/build CC=gcc ./muon test -d dots - test_clang: | cd muon/build CC=clang ./muon test -d dots - build_small: | cd muon CC=gcc build/muon setup \ -Dbuildtype=minsize \ -Dstatic=true \ -Dlibcurl=disabled \ -Dlibarchive=disabled \ build-small build/muon -C build-small samu - release: | cd muon tools/ci/release.sh build build-small muon-v0.4.0/.builds/projects.yml0000644000175000017500000000127714753102770015570 0ustar buildbuild# SPDX-FileCopyrightText: Stone Tickle # SPDX-License-Identifier: GPL-3.0-only image: alpine/3.21 packages: - curl-dev - libarchive-dev - pkgconf-dev - linux-headers # assumed by rizin sources: - https://git.sr.ht/~lattis/muon - https://github.com/rizinorg/rizin environment: PKG_CONFIG_PATH: /usr/lib/pkgconfig tasks: - muon: | cd muon OPTS="-Dlibpkgconf=enabled -Dlibarchive=enabled -Dlibcurl=enabled -Dbuildtype=release" CC=gcc tools/ci/bootstrap.sh build $OPTS build/muon setup $OPTS build build/muon -C build samu sudo build/muon -C build install - rizin: | cd rizin muon setup build muon -C build samu muon-v0.4.0/.builds/debian.yml0000644000175000017500000000175014753102770015155 0ustar buildbuild# SPDX-FileCopyrightText: Stone Tickle # SPDX-License-Identifier: GPL-3.0-only image: debian/stable packages: - clang - libclang-rt-dev - llvm - gobjc sources: - https://git.sr.ht/~lattis/muon tasks: - bootstrap: | cd muon tools/ci/bootstrap.sh build - build_asan_ubsan: | cd muon build/muon setup -Db_sanitize=address,undefined build_asan_ubsan build/muon -C build_asan_ubsan samu - build_memsan: | cd muon CC=clang build/muon setup -Db_sanitize=memory build_memsan build/muon -C build_memsan samu - build_fortify_source: | cd muon CC=clang CFLAGS=-D_FORTIFY_SOURCE=3 build/muon setup build_fortify_source build/muon -C build_fortify_source samu - test_asan_ubsan: | cd muon/build_asan_ubsan ./muon test -d dots - test_memsan: | cd muon/build_memsan ./muon test -d dots - test_fortify_source: | cd muon/build_fortify_source ./muon test -d dots muon-v0.4.0/LICENSES/0002755000175000017500000000000014753102770013054 5ustar buildbuildmuon-v0.4.0/LICENSES/MIT.txt0000644000175000017500000000206614753102770014250 0ustar buildbuildMIT License Copyright (c) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. muon-v0.4.0/LICENSES/Unlicense.txt0000644000175000017500000000227314753102770015544 0ustar buildbuildThis is free and unencumbered software released into the public domain. Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software, either in source code form or as a compiled binary, for any purpose, commercial or non-commercial, and by any means. In jurisdictions that recognize copyright laws, the author or authors of this software dedicate any and all copyright interest in the software to the public domain. We make this dedication for the benefit of the public at large and to the detriment of our heirs and successors. We intend this dedication to be an overt act of relinquishment in perpetuity of all present and future rights to this software under copyright law. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. For more information, please refer to muon-v0.4.0/LICENSES/GPL-3.0-only.txt0000644000175000017500000010356214753102770015521 0ustar buildbuildGNU 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 . muon-v0.4.0/LICENSES/Apache-2.0.txt0000644000175000017500000002405014753102770015272 0ustar buildbuildApache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. muon-v0.4.0/.gitattributes0000644000175000017500000000064314753102770014543 0ustar buildbuild# SPDX-FileCopyrightText: Stone Tickle # SPDX-License-Identifier: GPL-3.0-only * text eol=lf # These files have mixed line endings and we do not want git to perform any # modifications to them. tests/fmt/cases/end_of_line_crlf.meson binary tests/fmt/cases/end_of_line_mixed_crlf_first.meson binary tests/fmt/cases/end_of_line_mixed_lf_first.meson binary tests/lang/line_continuation.meson binary muon-v0.4.0/subprojects/0002755000175000017500000000000014753103257014213 5ustar buildbuildmuon-v0.4.0/subprojects/tinyjson/0002755000175000017500000000000014753102770016067 5ustar buildbuildmuon-v0.4.0/subprojects/tinyjson/README.md0000644000175000017500000000707514753102770017355 0ustar buildbuild# tiny-json [![Build Status](https://travis-ci.org/rafagafe/tiny-json.svg?branch=master)](https://travis-ci.org/rafagafe/tiny-json) [![GitHub contributors](https://img.shields.io/github/contributors/rafagafe/tiny-json.svg)](https://github.com/rafagafe/tiny-json/graphs/contributors) tiny-json is a versatile and easy to use json parser written in C and suitable for embedded systems. It is fast, robust and portable. It is not only a tokenizer. You can access json data in string format or get primitive values directly as C type variables without any loss of performance. You can access the JSON fields one on one or get their values by their names. This helps you to save a lot of source code lines and development time. * It does not use recursivity. * It does not use dynamic memory. The memory you use can be reserved statically. * There is no limit for nested levels in arrays or json objects. * The JSON property number limit is determined by the size of a buffer that can be statically reserved. If you need to create JSON strings please visit: https://github.com/rafagafe/json-maker # Philosophy When parsing a JSON text string a tree is created by linking json_t structures. Navigating or querying this tree is very easy using the provided API. To maintain reduced memory usage and fast processing the strings are not copied. When you request the value of a JSON element, a reference to the original JSON string is returned. To facilitate the processing of the data the returned strings are null-terminated. This is achieved by setting the null character to JSON control characters such as commas, brackets, braces, and quotation marks. # API The tiny-json API provides two types. `jsonType_t` is an enumeration for all possible JSON field types. `json_t` is a structure containing internal data which you don't need to know. ```C typedef enum { JSON_OBJ, JSON_ARRAY, JSON_TEXT, JSON_BOOLEAN, JSON_INTEGER, JSON_REAL, JSON_NULL } jsonType_t; ``` To parse a JSON string use `json_create()`. We pass it an array of `json_t` for it to allocate JSON fields. If the JSON string is bad formated or has more fields than the array this function returns a null pointer. ```C enum { MAX_FIELDS = 4 }; json_t pool[ MAX_FIELDS ]; char str[] = "{ \"name\": \"peter\", \"age\": 32 }"; json_t const* parent = json_create( str, pool, MAX_FIELDS ); if ( parent == NULL ) return EXIT_FAILURE; ``` To get a field by its name we use `json_getProperty()`. If the field does not exist the function returns a null pointer. To get the type of a field we use `json_getType()`. ```C json_t const* namefield = json_getProperty( parent, "name" ); if ( namefield == NULL ) return EXIT_FAILURE; if ( json_getType( namefield ) != JSON_TEXT ) return EXIT_FAILURE; ``` To get the value of a field in string format we use `json_getValue()`. It always returns a valid null-teminated string. ```C char const* namevalue = json_getValue( namefield ); printf( "%s%s%s", "Name: '", namevalue, "'.\n" ); ``` For primitive fields we can use a specific function to get the fields value directly as a C type, f.i. `json_getInteger()` or we can use `json_getValue()` to get its value in text format. ```C json_t const* agefield = json_getProperty( parent, "age" ); if ( agefield == NULL ) return EXIT_FAILURE; if ( json_getType( agefield ) != JSON_INTEGER ) return EXIT_FAILURE; int64_t agevalue = json_getInteger( agefield ); printf( "%s%lld%s", "Age: '", agevalue, "'.\n" ); char const* agetxt = json_getValue( agefield ); printf( "%s%s%s", "Age: '", agetxt, "'.\n" ); ``` For an example how to use nested JSON objects and arrays please see example-01.c. muon-v0.4.0/subprojects/tinyjson/meson.build0000644000175000017500000000031014753102770020221 0ustar buildbuildproject('tiny-json', 'c') meson.override_dependency( 'tinyjson', declare_dependency( include_directories: '.', link_with: static_library('tiny-json', 'tiny-json.c'), ), ) muon-v0.4.0/subprojects/tinyjson/tiny-json.h0000644000175000017500000001450214753102770020172 0ustar buildbuild /* Licensed under the MIT License . SPDX-License-Identifier: MIT Copyright (c) 2016-2018 Rafa Garcia . Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef _TINY_JSON_H_ #define _TINY_JSON_H_ #ifdef __cplusplus extern "C" { #endif #include #include #include #include #define json_containerOf( ptr, type, member ) \ ((type*)( (char*)ptr - offsetof( type, member ) )) /** @defgroup tinyJson Tiny JSON parser. * @{ */ /** Enumeration of codes of supported JSON properties types. */ typedef enum { JSON_OBJ, JSON_ARRAY, JSON_TEXT, JSON_BOOLEAN, JSON_INTEGER, JSON_REAL, JSON_NULL } jsonType_t; /** Structure to handle JSON properties. */ typedef struct json_s { struct json_s* sibling; char const* name; union { char const* value; struct { struct json_s* child; struct json_s* last_child; } c; } u; jsonType_t type; } json_t; /** Parse a string to get a json. * @param str String pointer with a JSON object. It will be modified. * @param mem Array of json properties to allocate. * @param qty Number of elements of mem. * @retval Null pointer if any was wrong in the parse process. * @retval If the parser process was successfully a valid handler of a json. * This property is always unnamed and its type is JSON_OBJ. */ json_t const* json_create( char* str, json_t mem[], unsigned int qty ); /** Get the name of a json property. * @param json A valid handler of a json property. * @retval Pointer to null-terminated if property has name. * @retval Null pointer if the property is unnamed. */ static inline char const* json_getName( json_t const* json ) { return json->name; } /** Get the value of a json property. * The type of property cannot be JSON_OBJ or JSON_ARRAY. * @param property A valid handler of a json property. * @return Pointer to null-terminated string with the value. */ static inline char const* json_getValue( json_t const* property ) { return property->u.value; } /** Get the type of a json property. * @param json A valid handler of a json property. * @return The code of type.*/ static inline jsonType_t json_getType( json_t const* json ) { return json->type; } /** Get the next sibling of a JSON property that is within a JSON object or array. * @param json A valid handler of a json property. * @retval The handler of the next sibling if found. * @retval Null pointer if the json property is the last one. */ static inline json_t const* json_getSibling( json_t const* json ) { return json->sibling; } /** Search a property by its name in a JSON object. * @param obj A valid handler of a json object. Its type must be JSON_OBJ. * @param property The name of property to get. * @retval The handler of the json property if found. * @retval Null pointer if not found. */ json_t const* json_getProperty( json_t const* obj, char const* property ); /** Search a property by its name in a JSON object and return its value. * @param obj A valid handler of a json object. Its type must be JSON_OBJ. * @param property The name of property to get. * @retval If found a pointer to null-terminated string with the value. * @retval Null pointer if not found or it is an array or an object. */ char const* json_getPropertyValue( json_t const* obj, char const* property ); /** Get the first property of a JSON object or array. * @param json A valid handler of a json property. * Its type must be JSON_OBJ or JSON_ARRAY. * @retval The handler of the first property if there is. * @retval Null pointer if the json object has not properties. */ static inline json_t const* json_getChild( json_t const* json ) { return json->u.c.child; } /** Get the value of a json boolean property. * @param property A valid handler of a json object. Its type must be JSON_BOOLEAN. * @return The value stdbool. */ static inline bool json_getBoolean( json_t const* property ) { return *property->u.value == 't'; } /** Get the value of a json integer property. * @param property A valid handler of a json object. Its type must be JSON_INTEGER. * @return The value stdint. */ static inline int64_t json_getInteger( json_t const* property ) { return strtoll( property->u.value,(char**)NULL, 10); } /** Get the value of a json real property. * @param property A valid handler of a json object. Its type must be JSON_REAL. * @return The value. */ static inline double json_getReal( json_t const* property ) { return strtod( property->u.value,(char**)NULL ); } /** Structure to handle a heap of JSON properties. */ typedef struct jsonPool_s jsonPool_t; struct jsonPool_s { json_t* (*init)( jsonPool_t* pool ); json_t* (*alloc)( jsonPool_t* pool ); }; /** Parse a string to get a json. * @param str String pointer with a JSON object. It will be modified. * @param pool Custom json pool pointer. * @retval Null pointer if any was wrong in the parse process. * @retval If the parser process was successfully a valid handler of a json. * This property is always unnamed and its type is JSON_OBJ. */ json_t const* json_createWithPool( char* str, jsonPool_t* pool ); /** @ } */ #ifdef __cplusplus } #endif #endif /* _TINY_JSON_H_ */ muon-v0.4.0/subprojects/tinyjson/tiny-json.c0000644000175000017500000004137514753102770020175 0ustar buildbuild /* Licensed under the MIT License . SPDX-License-Identifier: MIT Copyright (c) 2016-2018 Rafa Garcia . Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include "tiny-json.h" /** Structure to handle a heap of JSON properties. */ typedef struct jsonStaticPool_s { json_t* mem; /**< Pointer to array of json properties. */ unsigned int qty; /**< Length of the array of json properties. */ unsigned int nextFree; /**< The index of the next free json property. */ jsonPool_t pool; } jsonStaticPool_t; /* Search a property by its name in a JSON object. */ json_t const* json_getProperty( json_t const* obj, char const* property ) { json_t const* sibling; for( sibling = obj->u.c.child; sibling; sibling = sibling->sibling ) if ( sibling->name && !strcmp( sibling->name, property ) ) return sibling; return 0; } /* Search a property by its name in a JSON object and return its value. */ char const* json_getPropertyValue( json_t const* obj, char const* property ) { json_t const* field = json_getProperty( obj, property ); if ( !field ) return 0; jsonType_t type = json_getType( field ); if ( JSON_ARRAY >= type ) return 0; return json_getValue( field ); } /* Internal prototypes: */ static char* goBlank( char* str ); static char* goNum( char* str ); static json_t* poolInit( jsonPool_t* pool ); static json_t* poolAlloc( jsonPool_t* pool ); static char* objValue( char* ptr, json_t* obj, jsonPool_t* pool ); static char* setToNull( char* ch ); static bool isEndOfPrimitive( char ch ); /* Parse a string to get a json. */ json_t const* json_createWithPool( char *str, jsonPool_t *pool ) { char* ptr = goBlank( str ); if ( !ptr || (*ptr != '{' && *ptr != '[') ) return 0; json_t* obj = pool->init( pool ); obj->name = 0; obj->sibling = 0; obj->u.c.child = 0; ptr = objValue( ptr, obj, pool ); if ( !ptr ) return 0; return obj; } /* Parse a string to get a json. */ json_t const* json_create( char* str, json_t mem[], unsigned int qty ) { jsonStaticPool_t spool; spool.mem = mem; spool.qty = qty; spool.pool.init = poolInit; spool.pool.alloc = poolAlloc; return json_createWithPool( str, &spool.pool ); } /** Get a special character with its escape character. Examples: * 'b' -> '\\b', 'n' -> '\\n', 't' -> '\\t' * @param ch The escape character. * @retval The character code. */ static char getEscape( char ch ) { static struct { char ch; char code; } const pair[] = { { '\"', '\"' }, { '\\', '\\' }, { '/', '/' }, { 'b', '\b' }, { 'f', '\f' }, { 'n', '\n' }, { 'r', '\r' }, { 't', '\t' }, }; unsigned int i; for( i = 0; i < sizeof pair / sizeof *pair; ++i ) if ( pair[i].ch == ch ) return pair[i].code; return '\0'; } /** Parse 4 characters. * @param str Pointer to first digit. * @retval '?' If the four characters are hexadecimal digits. * @retval '\0' In other cases. */ static unsigned char getCharFromUnicode( unsigned char const* str ) { unsigned int i; for( i = 0; i < 4; ++i ) if ( !isxdigit( str[i] ) ) return '\0'; return '?'; } /** Parse a string and replace the scape characters by their meaning characters. * This parser stops when finds the character '\"'. Then replaces '\"' by '\0'. * @param str Pointer to first character. * @retval Pointer to first non white space after the string. If success. * @retval Null pointer if any error occur. */ static char* parseString( char* str ) { unsigned char* head = (unsigned char*)str; unsigned char* tail = (unsigned char*)str; for( ; *head; ++head, ++tail ) { if ( *head == '\"' ) { *tail = '\0'; return (char*)++head; } if ( *head == '\\' ) { if ( *++head == 'u' ) { char const ch = getCharFromUnicode( ++head ); if ( ch == '\0' ) return 0; *tail = ch; head += 3; } else { char const esc = getEscape( *head ); if ( esc == '\0' ) return 0; *tail = esc; } } else *tail = *head; } return 0; } /** Parse a string to get the name of a property. * @param ptr Pointer to first character. * @param property The property to assign the name. * @retval Pointer to first of property value. If success. * @retval Null pointer if any error occur. */ static char* propertyName( char* ptr, json_t* property ) { property->name = ++ptr; ptr = parseString( ptr ); if ( !ptr ) return 0; ptr = goBlank( ptr ); if ( !ptr ) return 0; if ( *ptr++ != ':' ) return 0; return goBlank( ptr ); } /** Parse a string to get the value of a property when its type is JSON_TEXT. * @param ptr Pointer to first character ('\"'). * @param property The property to assign the name. * @retval Pointer to first non white space after the string. If success. * @retval Null pointer if any error occur. */ static char* textValue( char* ptr, json_t* property ) { ++property->u.value; ptr = parseString( ++ptr ); if ( !ptr ) return 0; property->type = JSON_TEXT; return ptr; } /** Compare two strings until get the null character in the second one. * @param ptr sub string * @param str main string * @retval Pointer to next character. * @retval Null pointer if any error occur. */ static char* checkStr( char* ptr, char const* str ) { while( *str ) if ( *ptr++ != *str++ ) return 0; return ptr; } /** Parser a string to get a primitive value. * If the first character after the value is different of '}' or ']' is set to '\0'. * @param ptr Pointer to first character. * @param property Property handler to set the value and the type, (true, false or null). * @param value String with the primitive literal. * @param type The code of the type. ( JSON_BOOLEAN or JSON_NULL ) * @retval Pointer to first non white space after the string. If success. * @retval Null pointer if any error occur. */ static char* primitiveValue( char* ptr, json_t* property, char const* value, jsonType_t type ) { ptr = checkStr( ptr, value ); if ( !ptr || !isEndOfPrimitive( *ptr ) ) return 0; ptr = setToNull( ptr ); property->type = type; return ptr; } /** Parser a string to get a true value. * If the first character after the value is different of '}' or ']' is set to '\0'. * @param ptr Pointer to first character. * @param property Property handler to set the value and the type, (true, false or null). * @retval Pointer to first non white space after the string. If success. * @retval Null pointer if any error occur. */ static char* trueValue( char* ptr, json_t* property ) { return primitiveValue( ptr, property, "true", JSON_BOOLEAN ); } /** Parser a string to get a false value. * If the first character after the value is different of '}' or ']' is set to '\0'. * @param ptr Pointer to first character. * @param property Property handler to set the value and the type, (true, false or null). * @retval Pointer to first non white space after the string. If success. * @retval Null pointer if any error occur. */ static char* falseValue( char* ptr, json_t* property ) { return primitiveValue( ptr, property, "false", JSON_BOOLEAN ); } /** Parser a string to get a null value. * If the first character after the value is different of '}' or ']' is set to '\0'. * @param ptr Pointer to first character. * @param property Property handler to set the value and the type, (true, false or null). * @retval Pointer to first non white space after the string. If success. * @retval Null pointer if any error occur. */ static char* nullValue( char* ptr, json_t* property ) { return primitiveValue( ptr, property, "null", JSON_NULL ); } /** Analyze the exponential part of a real number. * @param ptr Pointer to first character. * @retval Pointer to first non numerical after the string. If success. * @retval Null pointer if any error occur. */ static char* expValue( char* ptr ) { if ( *ptr == '-' || *ptr == '+' ) ++ptr; if ( !isdigit( (int)(*ptr) ) ) return 0; ptr = goNum( ++ptr ); return ptr; } /** Analyze the decimal part of a real number. * @param ptr Pointer to first character. * @retval Pointer to first non numerical after the string. If success. * @retval Null pointer if any error occur. */ static char* fraqValue( char* ptr ) { if ( !isdigit( (int)(*ptr) ) ) return 0; ptr = goNum( ++ptr ); if ( !ptr ) return 0; return ptr; } /** Parser a string to get a numerical value. * If the first character after the value is different of '}' or ']' is set to '\0'. * @param ptr Pointer to first character. * @param property Property handler to set the value and the type: JSON_REAL or JSON_INTEGER. * @retval Pointer to first non white space after the string. If success. * @retval Null pointer if any error occur. */ static char* numValue( char* ptr, json_t* property ) { if ( *ptr == '-' ) ++ptr; if ( !isdigit( (int)(*ptr) ) ) return 0; if ( *ptr != '0' ) { ptr = goNum( ptr ); if ( !ptr ) return 0; } else if ( isdigit( (int)(*++ptr) ) ) return 0; property->type = JSON_INTEGER; if ( *ptr == '.' ) { ptr = fraqValue( ++ptr ); if ( !ptr ) return 0; property->type = JSON_REAL; } if ( *ptr == 'e' || *ptr == 'E' ) { ptr = expValue( ++ptr ); if ( !ptr ) return 0; property->type = JSON_REAL; } if ( !isEndOfPrimitive( *ptr ) ) return 0; if ( JSON_INTEGER == property->type ) { char const* value = property->u.value; bool const negative = *value == '-'; static char const min[] = "-9223372036854775808"; static char const max[] = "9223372036854775807"; unsigned int const maxdigits = ( negative? sizeof min: sizeof max ) - 1; unsigned int const len = ( unsigned int const ) ( ptr - value ); if ( len > maxdigits ) return 0; if ( len == maxdigits ) { char const tmp = *ptr; *ptr = '\0'; char const* const threshold = negative ? min: max; if ( 0 > strcmp( threshold, value ) ) return 0; *ptr = tmp; } } ptr = setToNull( ptr ); return ptr; } /** Add a property to a JSON object or array. * @param obj The handler of the JSON object or array. * @param property The handler of the property to be added. */ static void add( json_t* obj, json_t* property ) { property->sibling = 0; if ( !obj->u.c.child ){ obj->u.c.child = property; obj->u.c.last_child = property; } else { obj->u.c.last_child->sibling = property; obj->u.c.last_child = property; } } /** Parser a string to get a json object value. * @param ptr Pointer to first character. * @param obj The handler of the JSON root object or array. * @param pool The handler of a json pool for creating json instances. * @retval Pointer to first character after the value. If success. * @retval Null pointer if any error occur. */ static char* objValue( char* ptr, json_t* obj, jsonPool_t* pool ) { obj->type = *ptr == '{' ? JSON_OBJ : JSON_ARRAY; obj->u.c.child = 0; obj->sibling = 0; ptr++; for(;;) { ptr = goBlank( ptr ); if ( !ptr ) return 0; if ( *ptr == ',' ) { ++ptr; continue; } char const endchar = ( obj->type == JSON_OBJ )? '}': ']'; if ( *ptr == endchar ) { *ptr = '\0'; json_t* parentObj = obj->sibling; if ( !parentObj ) return ++ptr; obj->sibling = 0; obj = parentObj; ++ptr; continue; } json_t* property = pool->alloc( pool ); if ( !property ) return 0; if( obj->type != JSON_ARRAY ) { if ( *ptr != '\"' ) return 0; ptr = propertyName( ptr, property ); if ( !ptr ) return 0; } else property->name = 0; add( obj, property ); property->u.value = ptr; switch( *ptr ) { case '{': property->type = JSON_OBJ; property->u.c.child = 0; property->sibling = obj; obj = property; ++ptr; break; case '[': property->type = JSON_ARRAY; property->u.c.child = 0; property->sibling = obj; obj = property; ++ptr; break; case '\"': ptr = textValue( ptr, property ); break; case 't': ptr = trueValue( ptr, property ); break; case 'f': ptr = falseValue( ptr, property ); break; case 'n': ptr = nullValue( ptr, property ); break; default: ptr = numValue( ptr, property ); break; } if ( !ptr ) return 0; } } /** Initialize a json pool. * @param pool The handler of the pool. * @return a instance of a json. */ static json_t* poolInit( jsonPool_t* pool ) { jsonStaticPool_t *spool = json_containerOf( pool, jsonStaticPool_t, pool ); spool->nextFree = 1; return spool->mem; } /** Create an instance of a json from a pool. * @param pool The handler of the pool. * @retval The handler of the new instance if success. * @retval Null pointer if the pool was empty. */ static json_t* poolAlloc( jsonPool_t* pool ) { jsonStaticPool_t *spool = json_containerOf( pool, jsonStaticPool_t, pool ); if ( spool->nextFree >= spool->qty ) return 0; return spool->mem + spool->nextFree++; } /** Checks whether an character belongs to set. * @param ch Character value to be checked. * @param set Set of characters. It is just a null-terminated string. * @return true or false there is membership or not. */ static bool isOneOfThem( char ch, char const* set ) { while( *set != '\0' ) if ( ch == *set++ ) return true; return false; } /** Increases a pointer while it points to a character that belongs to a set. * @param str The initial pointer value. * @param set Set of characters. It is just a null-terminated string. * @return The final pointer value or null pointer if the null character was found. */ static char* goWhile( char* str, char const* set ) { for(; *str != '\0'; ++str ) { if ( !isOneOfThem( *str, set ) ) return str; } return 0; } /** Set of characters that defines a blank. */ static char const* const blank = " \n\r\t\f"; /** Increases a pointer while it points to a white space character. * @param str The initial pointer value. * @return The final pointer value or null pointer if the null character was found. */ static char* goBlank( char* str ) { return goWhile( str, blank ); } /** Increases a pointer while it points to a decimal digit character. * @param str The initial pointer value. * @return The final pointer value or null pointer if the null character was found. */ static char* goNum( char* str ) { for( ; *str != '\0'; ++str ) { if ( !isdigit( (int)(*str) ) ) return str; } return 0; } /** Set of characters that defines the end of an array or a JSON object. */ static char const* const endofblock = "}]"; /** Set a char to '\0' and increase its pointer if the char is different to '}' or ']'. * @param ch Pointer to character. * @return Final value pointer. */ static char* setToNull( char* ch ) { if ( !isOneOfThem( *ch, endofblock ) ) *ch++ = '\0'; return ch; } /** Indicate if a character is the end of a primitive value. */ static bool isEndOfPrimitive( char ch ) { return ch == ',' || isOneOfThem( ch, blank ) || isOneOfThem( ch, endofblock ); } muon-v0.4.0/subprojects/bestline.wrap0000644000175000017500000000025714753102770016714 0ustar buildbuild; SPDX-FileCopyrightText: Stone Tickle ; SPDX-License-Identifier: GPL-3.0-only [wrap-file] source_filename = bestline [provide] dependencies = bestline muon-v0.4.0/subprojects/imgui.wrap0000644000175000017500000000036114753102770016215 0ustar buildbuild; SPDX-FileCopyrightText: Stone Tickle ; SPDX-License-Identifier: GPL-3.0-only [wrap-git] url = https://git.sr.ht/~lattis/imgui revision = cc2565dd8883e7aa0d0a23d2f520a0a2eef91d26 depth = 1 [provide] imgui = imgui_dep muon-v0.4.0/subprojects/glfw3.wrap0000644000175000017500000000036114753102770016125 0ustar buildbuild; SPDX-FileCopyrightText: Stone Tickle ; SPDX-License-Identifier: GPL-3.0-only [wrap-git] url = https://git.sr.ht/~lattis/glfw3 revision = d70ff6cf248621e88793e18b9bbec400730e68d4 depth = 1 [provide] glfw3 = glfw3_dep muon-v0.4.0/subprojects/meson-tests/0002755000175000017500000000000014753103257016474 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/keyval/0002755000175000017500000000000014751453622017771 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/keyval/1 basic/0002755000175000017500000000000014751453622021173 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/keyval/1 basic/meson.build0000644000175000017500000000061314751453622023333 0ustar buildbuildproject('keyval basic test', meson_version: '>= 0.55') k = import('keyval') conf = k.load('.config') if not conf.has_key('CONFIG_VAL1') error('Expected CONFIG_VAL1 to be set, but it wasn\'t') endif if conf.has_key('CONFIG_VAL2') error('Expected CONFIG_VAL2 not be set, but it was') endif if conf.get('CONFIG_VAL_VAL').to_int() != 4 error('Expected CONFIG_VAL_VAL to be 4') endif muon-v0.4.0/subprojects/meson-tests/keyval/1 basic/test.json0000644000175000017500000000047014751453622023044 0ustar buildbuild{ "stdout": [ { "line": "test cases/keyval/1 basic/meson.build:3: WARNING: Project targets '>= 0.55' but uses feature introduced in '0.56.0': module keyval as stable module. Consider either adding \"unstable-\" to the module name, or updating the meson required version to \">= 0.56.0\"" } ] } muon-v0.4.0/subprojects/meson-tests/keyval/1 basic/.config0000644000175000017500000000007014751453622022434 0ustar buildbuildCONFIG_VAL1=y # CONFIG_VAL2 is not set CONFIG_VAL_VAL=4 muon-v0.4.0/subprojects/meson-tests/keyval/3 load_config files/0002755000175000017500000000000014751453622023443 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/keyval/3 load_config files/meson.build0000644000175000017500000000010714751453622025601 0ustar buildbuildproject('keyval subdir test') # Test into sub directory subdir('dir') muon-v0.4.0/subprojects/meson-tests/keyval/3 load_config files/dir/0002755000175000017500000000000014751453622024221 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/keyval/3 load_config files/dir/meson.build0000644000175000017500000000041214751453622026356 0ustar buildbuildk = import('keyval') conf = k.load(files('config')) if not conf.has_key('CONFIG_IS_SET') error('Expected CONFIG_IS_SET to be set, but it wasn\'t') endif if conf.has_key('CONFIG_NOT_IS_SET') error('Expected CONFIG_NOT_IS_SET not be set, but it was') endif muon-v0.4.0/subprojects/meson-tests/keyval/3 load_config files/dir/config0000644000175000017500000000005714751453622025411 0ustar buildbuildCONFIG_IS_SET=y # CONFIG_NOT_IS_SET is not set muon-v0.4.0/subprojects/meson-tests/keyval/4 load_config builddir/0002755000175000017500000000000014751453622024140 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/keyval/4 load_config builddir/meson.build0000644000175000017500000000056114751453622026302 0ustar buildbuildproject('keyval builddir test') k = import('keyval') out_conf = configure_file(input: 'config', output: 'out-config', copy: true) conf = k.load(out_conf) if not conf.has_key('CONFIG_IS_SET') error('Expected CONFIG_IS_SET to be set, but it wasn\'t') endif if conf.has_key('CONFIG_NOT_IS_SET') error('Expected CONFIG_NOT_IS_SET not be set, but it was') endif muon-v0.4.0/subprojects/meson-tests/keyval/4 load_config builddir/config0000644000175000017500000000005714751453622025330 0ustar buildbuildCONFIG_IS_SET=y # CONFIG_NOT_IS_SET is not set muon-v0.4.0/subprojects/meson-tests/keyval/2 subdir/0002755000175000017500000000000014751453622021403 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/keyval/2 subdir/meson.build0000644000175000017500000000010714751453622023541 0ustar buildbuildproject('keyval subdir test') # Test into sub directory subdir('dir') muon-v0.4.0/subprojects/meson-tests/keyval/2 subdir/.config0000644000175000017500000000005714751453622022651 0ustar buildbuildCONFIG_IS_SET=y # CONFIG_NOT_IS_SET is not set muon-v0.4.0/subprojects/meson-tests/keyval/2 subdir/dir/0002755000175000017500000000000014751453622022161 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/keyval/2 subdir/dir/meson.build0000644000175000017500000000043214751453622024320 0ustar buildbuildk = import('keyval') conf = k.load(meson.source_root() / '.config') if not conf.has_key('CONFIG_IS_SET') error('Expected CONFIG_IS_SET to be set, but it wasn\'t') endif if conf.has_key('CONFIG_NOT_IS_SET') error('Expected CONFIG_NOT_IS_SET not be set, but it was') endif muon-v0.4.0/subprojects/meson-tests/.builds/0002755000175000017500000000000014751453622020036 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/.builds/alpine.yml0000644000175000017500000000032114751453622022023 0ustar buildbuildimage: alpine/3.21 secrets: - ead807ad-2453-416b-8ae6-308363891a8d sources: - https://git.sr.ht/~lattis/meson-tests tasks: - push_to_gh_mirror: | cd meson-tests tools/ci/push_to_gh_mirror.sh muon-v0.4.0/subprojects/meson-tests/tools/0002755000175000017500000000000014751453622017636 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/tools/ci/0002755000175000017500000000000014751453622020231 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/tools/ci/push_to_gh_mirror.sh0000755000175000017500000000067114751453622024323 0ustar buildbuild#!/bin/sh # SPDX-FileCopyrightText: Stone Tickle # SPDX-License-Identifier: GPL-3.0-only set -eux if [ ! -d ~/.ssh ]; then exit 0 fi cat >> ~/.ssh/config < #include int main(int argc, char* argv[]) { assert(argc == 2); FILE *f = fopen(argv[1], "w"); const char msg[] = "int main(void) {return 0;}\n"; size_t w = fwrite(msg, 1, sizeof(msg) - 1, f); assert(w == sizeof(msg) - 1); int r = fclose(f); assert(r == 0); return 0; } muon-v0.4.0/subprojects/meson-tests/native/9 override with exe/meson.build0000644000175000017500000000102514751453622025570 0ustar buildbuildproject('myexe', 'c', version: '0.1') sub = subproject('sub') prog = find_program('foobar', version: '>= 2.0', required: false) assert(not prog.found()) prog = find_program('foobar', version: '>= 1.0') custom1 = custom_target( 'custom1', build_by_default: true, input: [], output: 'main1.c', command: [prog, '@OUTPUT@'], ) gen = generator(prog, output: '@BASENAME@.c', arguments: ['@OUTPUT@']) custom2 = gen.process('main2.input') message(prog.full_path()) executable('e1', custom1) executable('e2', custom2) muon-v0.4.0/subprojects/meson-tests/native/9 override with exe/main2.input0000644000175000017500000000000014751453622025505 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/native/1 trivial/0002755000175000017500000000000014751453622021557 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/native/1 trivial/trivial.c0000644000175000017500000000013614751453622023373 0ustar buildbuild#include int main(void) { printf("Trivial test is working.\n"); return 0; } muon-v0.4.0/subprojects/meson-tests/native/1 trivial/meson.build0000644000175000017500000000045214751453622023720 0ustar buildbuildproject('trivial native test', 'c') sources = 'trivial.c' cc = meson.get_compiler('c', native: true) if meson.is_cross_build() native_exe = executable( 'native-trivialprog', sources: sources, native: true, ) test('native exe in cross build', native_exe) endif muon-v0.4.0/subprojects/meson-tests/native/6 add language/0002755000175000017500000000000014751453622022406 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/native/6 add language/prog.cc0000644000175000017500000000013414751453622023660 0ustar buildbuild#include int main(int, char**) { std::cout << "I am C++.\n"; return 0; } muon-v0.4.0/subprojects/meson-tests/native/6 add language/meson.build0000644000175000017500000000027214751453622024547 0ustar buildbuildproject('add language', 'c') assert( add_languages('cpp', native: true), 'Add_languages returned false on success', ) test('C++', executable('cppprog', 'prog.cc', native: true)) muon-v0.4.0/subprojects/meson-tests/native/8 external program shebang parsing/0002755000175000017500000000000014751453622026402 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/native/8 external program shebang parsing/script.int.in0000644000175000017500000000003414751453622031022 0ustar buildbuild#!/usr/bin/env @INTRP@ copy muon-v0.4.0/subprojects/meson-tests/native/8 external program shebang parsing/main.c0000644000175000017500000000242714751453622027475 0ustar buildbuild#include #include #include #include #include #include #ifdef _WIN32 #include #include #else #include #endif /* Who cares about stack sizes in test programs anyway */ #define LINE_LENGTH 4096 static int intrp_copyfile (char * src, char * dest) { #ifdef _WIN32 if (!CopyFile (src, dest, FALSE)) return 1; return 0; #else return execlp ("cp", "cp", src, dest, NULL); #endif } static void parser_get_line (FILE * f, char line[LINE_LENGTH]) { if (!fgets (line, LINE_LENGTH, f)) fprintf (stderr, "%s\n", strerror (errno)); } int main (int argc, char * argv[]) { FILE *f = NULL; char line[LINE_LENGTH]; if (argc != 4) { fprintf (stderr, "Invalid number of arguments: %i\n", argc); goto err; } if ((f = fopen (argv[1], "r")) == NULL) { fprintf (stderr, "%s\n", strerror (errno)); goto err; } parser_get_line (f, line); if (!line || line[0] != '#' || line[1] != '!') { fprintf (stderr, "Invalid script\n"); goto err; } parser_get_line (f, line); if (!line || strncmp (line, "copy", 4) != 0) { fprintf (stderr, "Syntax error: %s\n", line); goto err; } return intrp_copyfile (argv[2], argv[3]); err: fclose (f); return 1; } muon-v0.4.0/subprojects/meson-tests/native/8 external program shebang parsing/meson.build0000644000175000017500000000115714751453622030546 0ustar buildbuildproject('shebang parsing', 'c') interpreter = executable('aninterp', 'main.c', native: true) cdata = configuration_data() cdata.set('INTRP', interpreter.full_path()) f = configure_file(input: 'script.int.in', output: 'script.int', configuration: cdata) # Test that parsing a shebang with spaces works properly. See `man execve`, # specifically the section on "Interpreter scripts" and the one under "NOTES". script = find_program(f) custom_target( 'interpthis', input: 'input.txt', output: 'output.txt', depends: interpreter, command: [script, '@INPUT@', '@OUTPUT@'], build_by_default: true, ) muon-v0.4.0/subprojects/meson-tests/native/8 external program shebang parsing/input.txt0000644000175000017500000000002014751453622030270 0ustar buildbuildsome stuff here muon-v0.4.0/subprojects/meson-tests/native/4 tryrun/0002755000175000017500000000000014751453622021453 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/native/4 tryrun/error.c0000644000175000017500000000003714751453622022746 0ustar buildbuildint main(void) { return 1; } muon-v0.4.0/subprojects/meson-tests/native/4 tryrun/no_compile.c0000644000175000017500000000002114751453622023732 0ustar buildbuildint main(void) { muon-v0.4.0/subprojects/meson-tests/native/4 tryrun/ok.c0000644000175000017500000000016314751453622022226 0ustar buildbuild#include int main(void) { printf("%s\n", "stdout"); fprintf(stderr, "%s\n", "stderr"); return 0; } muon-v0.4.0/subprojects/meson-tests/native/4 tryrun/meson.build0000644000175000017500000000410114751453622023607 0ustar buildbuildproject('tryrun', 'c', 'cpp') # Complex to exercise all code paths. if meson.is_cross_build() if meson.can_run_host_binaries() compilers = [ meson.get_compiler('c', native: false), meson.get_compiler('cpp', native: false), ] else compilers = [ meson.get_compiler('c', native: true), meson.get_compiler('cpp', native: true), ] endif else compilers = [meson.get_compiler('c'), meson.get_compiler('cpp')] endif ok_code = '''#include int main(void) { printf("%s\n", "stdout"); fprintf(stderr, "%s\n", "stderr"); return 0; } ''' error_code = '''int main(void) { return 1; } ''' no_compile_code = '''int main(void) { ''' INPUTS = [ ['String', ok_code, error_code, no_compile_code], ['File', files('ok.c'), files('error.c'), files('no_compile.c')], ] foreach cc : compilers foreach input : INPUTS type = input[0] ok = cc.run(input[1], name: type + ' should succeed') err = cc.run(input[2], name: type + ' should fail') noc = cc.run(input[3], name: type + ' does not compile') if noc.compiled() error(type + ' compilation fail test failed.') else message(type + ' fail detected properly.') endif if ok.compiled() message(type + ' compilation worked.') else error(type + ' compilation did not work.') endif if ok.returncode() == 0 message(type + ' return code ok.') else error(type + ' return code fail') endif if err.returncode() == 1 message(type + ' bad return code ok.') else error(type + ' bad return code fail.') endif if ok.stdout().strip() == 'stdout' message(type + ' stdout ok.') else message(type + ' bad stdout.') endif if ok.stderr().strip() == 'stderr' message(type + ' stderr ok.') else message(type + ' bad stderr.') endif endforeach endforeach muon-v0.4.0/subprojects/meson-tests/native/7 selfbuilt custom/0002755000175000017500000000000014751453622023377 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/native/7 selfbuilt custom/mainprog.cpp0000644000175000017500000000011414751453622025711 0ustar buildbuild#include"data.h" int main(void) { return generated_function() != 52; } muon-v0.4.0/subprojects/meson-tests/native/7 selfbuilt custom/tool.cpp0000644000175000017500000000133714751453622025062 0ustar buildbuild#include #include #include using namespace std; const char prefix[] = "int "; const char suffix[] = " () {\n return 52;}\n"; int main(int argc, char **argv) { if(argc != 3) { cout << "You is fail.\n"; return 1; } ifstream is(argv[1], ifstream::binary); if(!is) { cout << "Opening input file failed.\n"; return 1; } string funcname; is >> funcname; ofstream os(argv[2], ofstream::binary); if(!os) { cout << "Opening output file failed.\n"; return 1; } os << prefix << funcname << suffix; os.close(); if(!os.good()) { cout << "Writing data out failed.\n"; return 1; } return 0; } muon-v0.4.0/subprojects/meson-tests/native/7 selfbuilt custom/meson.build0000644000175000017500000000167114751453622025544 0ustar buildbuildproject('selfbuilt custom', 'cpp') # Build an exe and use it in a custom target # whose output is used to build a different exe. tool = executable('tool', 'tool.cpp', native: true) hfile = custom_target( 'datah', output: 'data.h', input: 'data.dat', command: [tool, '@INPUT@', '@OUTPUT@'], ) main = executable('mainprog', 'mainprog.cpp', hfile) test('maintest', main) lib = library('libtool', 'tool.cpp') checkarg = executable('checkarg', 'checkarg.cpp', native: true) ctlib = custom_target( 'ctlib', output: 'ctlib.out', capture: true, command: [checkarg, lib], build_by_default: true, ) if meson.is_cross_build() and meson.can_run_host_binaries() checkarg_host = executable('checkarg_host', 'checkarg.cpp') ctlib_host = custom_target( 'ctlib_host', output: 'ctlib.host.out', capture: true, command: [checkarg_host, lib], build_by_default: true, ) endif muon-v0.4.0/subprojects/meson-tests/native/7 selfbuilt custom/checkarg.cpp0000644000175000017500000000013214751453622025644 0ustar buildbuild#include int main(int argc, char *[]) { assert(argc == 2); return 0; } muon-v0.4.0/subprojects/meson-tests/native/7 selfbuilt custom/data.dat0000644000175000017500000000002314751453622024773 0ustar buildbuildgenerated_function muon-v0.4.0/subprojects/meson-tests/native/3 pipeline/0002755000175000017500000000000014751453622021714 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/native/3 pipeline/depends/0002755000175000017500000000000014751453622023336 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/native/3 pipeline/depends/meson.build0000644000175000017500000000047714751453622025506 0ustar buildbuildrunner = find_program('copyrunner.py') copier = executable('copier', 'filecopier.c', native: true) cg = generator( runner, output: ['@BASENAME@.c'], arguments: [copier.full_path(), '@INPUT@', '@OUTPUT@'], depends: copier, ) test('generatordep', executable('gd', 'prog.c', cg.process('libsrc.c.in'))) muon-v0.4.0/subprojects/meson-tests/native/3 pipeline/depends/filecopier.c0000644000175000017500000000101114751453622025612 0ustar buildbuild#include #include #define BUFSIZE 1024 int main(int argc, char **argv) { char buffer[BUFSIZE]; size_t num_read; size_t num_written; FILE *fin = fopen(argv[1], "rb"); FILE *fout; assert(argc>0); assert(fin); num_read = fread(buffer, 1, BUFSIZE, fin); assert(num_read > 0); fclose(fin); fout = fopen(argv[2], "wb"); assert(fout); num_written = fwrite(buffer, 1, num_read, fout); assert(num_written == num_read); fclose(fout); return 0; } muon-v0.4.0/subprojects/meson-tests/native/3 pipeline/depends/libsrc.c.in0000644000175000017500000000004214751453622025357 0ustar buildbuildint func(void) { return 42; } muon-v0.4.0/subprojects/meson-tests/native/3 pipeline/depends/copyrunner.py0000755000175000017500000000020514751453622026112 0ustar buildbuild#!/usr/bin/env python3 import sys, subprocess prog, infile, outfile = sys.argv[1:] subprocess.check_call([prog, infile, outfile]) muon-v0.4.0/subprojects/meson-tests/native/3 pipeline/depends/prog.c0000644000175000017500000000007514751453622024451 0ustar buildbuildint func(void); int main(void) { return func() != 42; } muon-v0.4.0/subprojects/meson-tests/native/3 pipeline/meson.build0000644000175000017500000000123314751453622024053 0ustar buildbuildproject('pipeline test', 'c') # We need to run this executable locally so build it with # the host compiler. e1 = executable('srcgen', 'srcgen.c', native: true) # Generate a source file that needs to be included in the build. gen = generator( e1, depfile: '@BASENAME@.d', output: '@BASENAME@.c', # Line continuation inside arguments should work without needing a "\". arguments: ['@INPUT@', '@OUTPUT@', '@DEPFILE@'], ) generated = gen.process(['input_src.dat']) e2 = executable('prog', 'prog.c', generated) test('pipelined', e2) # This is in a subdirectory to make sure # we write proper subdir paths to output. subdir('src') subdir('depends') muon-v0.4.0/subprojects/meson-tests/native/3 pipeline/srcgen.c0000644000175000017500000000263714751453622023347 0ustar buildbuild#include #include #include #define ARRSIZE 80 int main(int argc, char **argv) { char arr[ARRSIZE]; char *ofilename; char *ifilename; char *dfilename; FILE *ifile; FILE *ofile; FILE *depfile; size_t bytes; unsigned int i; if (argc != 4) { fprintf(stderr, "%s \n", argv[0]); return 1; } ifilename = argv[1]; ofilename = argv[2]; dfilename = argv[3]; ifile = fopen(argv[1], "r"); if (!ifile) { fprintf(stderr, "Could not open source file %s.\n", argv[1]); return 1; } ofile = fopen(ofilename, "w"); if (!ofile) { fprintf(stderr, "Could not open target file %s\n", ofilename); fclose(ifile); return 1; } bytes = fread(arr, 1, ARRSIZE, ifile); assert(bytes < 80); assert(bytes > 0); fwrite(arr, 1, bytes, ofile); depfile = fopen(dfilename, "w"); if (!depfile) { fprintf(stderr, "Could not open depfile %s\n", ofilename); fclose(ifile); fclose(ofile); return 1; } for (i = 0; i < strlen(ofilename); i++) { if (ofilename[i] == ' ') { fwrite("\\ ", 1, 2, depfile); } else { fwrite(&ofilename[i], 1, 1, depfile); } } fwrite(": ", 1, 2, depfile); for (i = 0; i < strlen(ifilename); i++) { if (ifilename[i] == ' ') { fwrite("\\ ", 1, 2, depfile); } else { fwrite(&ifilename[i], 1, 1, depfile); } } fwrite("\n", 1, 1, depfile); fclose(ifile); fclose(ofile); fclose(depfile); return 0; } muon-v0.4.0/subprojects/meson-tests/native/3 pipeline/prog.c0000644000175000017500000000006714751453622023030 0ustar buildbuildint func(void); int main(void) { return func(); } muon-v0.4.0/subprojects/meson-tests/native/3 pipeline/src/0002755000175000017500000000000014751453622022503 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/native/3 pipeline/src/meson.build0000644000175000017500000000045014751453622024642 0ustar buildbuilde1 = executable('srcgen', 'srcgen.c', native: true) # Generate a header file that needs to be included. gen = generator(e1, output: '@BASENAME@.h', arguments: ['@INPUT@', '@OUTPUT@']) generated = gen.process('input_src.dat') e2 = executable('prog', 'prog.c', generated) test('pipelined', e2) muon-v0.4.0/subprojects/meson-tests/native/3 pipeline/src/srcgen.c0000644000175000017500000000160514751453622024130 0ustar buildbuild#include #include #define ARRSIZE 80 int main(int argc, char **argv) { char arr[ARRSIZE]; char *ifilename; char *ofilename; FILE *ifile; FILE *ofile; size_t bytes; if(argc != 3) { fprintf(stderr, "%s \n", argv[0]); return 1; } ifilename = argv[1]; ofilename = argv[2]; printf("%s\n", ifilename); ifile = fopen(ifilename, "r"); if(!ifile) { fprintf(stderr, "Could not open source file %s.\n", ifilename); return 1; } ofile = fopen(ofilename, "w"); if(!ofile) { fprintf(stderr, "Could not open target file %s\n", ofilename); fclose(ifile); return 1; } bytes = fread(arr, 1, ARRSIZE, ifile); assert(bytes < 80); assert(bytes > 0); fwrite(arr, 1, bytes, ofile); fclose(ifile); fclose(ofile); return 0; } muon-v0.4.0/subprojects/meson-tests/native/3 pipeline/src/prog.c0000644000175000017500000000016614751453622023617 0ustar buildbuild#include"input_src.h" int main(void) { void *foo = printf; if(foo) { return 0; } return 1; } muon-v0.4.0/subprojects/meson-tests/native/3 pipeline/src/input_src.dat0000644000175000017500000000002214751453622025173 0ustar buildbuild#include muon-v0.4.0/subprojects/meson-tests/native/3 pipeline/input_src.dat0000644000175000017500000000003514751453622024410 0ustar buildbuildint func(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/native/5 install script/0002755000175000017500000000000014751453622023044 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/native/5 install script/meson.build0000644000175000017500000000061114751453622025202 0ustar buildbuildproject('custom install script', 'c') # this is just to ensure that the install directory exists before exe is run install_data('file.txt', install_dir: '.') subdir('src') meson.add_install_script(exe, 'generated.txt') wrap = find_program('wrap.py') # Yes, these are getting silly meson.add_install_script(wrap, exe, 'wrapped.txt') meson.add_install_script(wrap, wrap, exe, 'wrapped2.txt') muon-v0.4.0/subprojects/meson-tests/native/5 install script/wrap.py0000755000175000017500000000012314751453622024364 0ustar buildbuild#!/usr/bin/env python3 import subprocess import sys subprocess.run(sys.argv[1:]) muon-v0.4.0/subprojects/meson-tests/native/5 install script/test.json0000644000175000017500000000033414751453622024714 0ustar buildbuild{ "installed": [ {"type": "file", "file": "usr/file.txt"}, {"type": "file", "file": "usr/generated.txt"}, {"type": "file", "file": "usr/wrapped.txt"}, {"type": "file", "file": "usr/wrapped2.txt"} ] } muon-v0.4.0/subprojects/meson-tests/native/5 install script/file.txt0000644000175000017500000000000014751453622024510 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/native/5 install script/src/0002755000175000017500000000000014751453622023633 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/native/5 install script/src/meson.build0000644000175000017500000000007714751453622025777 0ustar buildbuildexe = executable('exe', 'exe.c', install: false, native: true) muon-v0.4.0/subprojects/meson-tests/native/5 install script/src/exe.c0000644000175000017500000000110014751453622024546 0ustar buildbuild#include #include #include int main(int argc, char * argv[]) { if (argc != 2) { fprintf(stderr, "Takes exactly 2 arguments\n"); return 1; } char * dirname = getenv("MESON_INSTALL_DESTDIR_PREFIX"); char * fullname = malloc(strlen(dirname) + 1 + strlen(argv[1]) + 1); strcpy(fullname, dirname); strcat(fullname, "/"); strcat(fullname, argv[1]); FILE * fp = fopen(fullname, "w"); if (!fp) return 1; fputs("Some text\n", fp); fclose(fp); free(fullname); return 0; } muon-v0.4.0/subprojects/meson-tests/native/2 global arg/0002755000175000017500000000000014751453622022100 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/native/2 global arg/prog.cc0000644000175000017500000000032714751453622023356 0ustar buildbuild#ifdef MYTHING #error "Wrong global argument set" #endif #ifndef MYCPPTHING #error "Global argument not set" #endif #ifndef MYCANDCPPTHING #error "Global argument not set" #endif int main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/native/2 global arg/meson.build0000644000175000017500000000072614751453622024245 0ustar buildbuildproject('global arg test', 'cpp', 'c') add_global_arguments('-DMYTHING', language: 'c', native: true) add_global_arguments('-DMYCPPTHING', language: 'cpp', native: true) add_global_arguments('-DGLOBAL_BUILD', language: 'c', native: true) build_c_args = ['-DARG_BUILD'] c_args = ['-DARG_HOST'] add_global_arguments('-DMYCANDCPPTHING', language: ['c', 'cpp'], native: true) exe1 = executable('prog1', 'prog.c', c_args: build_c_args, native: true) test('prog1', exe1) muon-v0.4.0/subprojects/meson-tests/native/2 global arg/prog.c0000644000175000017500000000146614751453622023220 0ustar buildbuild#ifndef MYTHING #error "Global argument not set" #endif #ifdef MYCPPTHING #error "Wrong global argument set" #endif #ifndef MYCANDCPPTHING #error "Global argument not set" #endif #if !defined(GLOBAL_HOST) && !defined(GLOBAL_BUILD) #error "Neither global_host nor global_build is set." #endif #if defined(GLOBAL_HOST) && defined(GLOBAL_BUILD) #error "Both global build and global host set." #endif #ifdef GLOBAL_BUILD #ifndef ARG_BUILD #error "Global is build but arg_build is not set." #endif #ifdef ARG_HOST #error "Global is build but arg host is set." #endif #endif #ifdef GLOBAL_HOST #ifndef ARG_HOST #error "Global is host but arg_host is not set." #endif #ifdef ARG_BUILD #error "Global is host but arg_build is set." #endif #endif int main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/readme.md0000644000175000017500000000132214751453622020251 0ustar buildbuild# meson-tests This project contains tests from [meson/test cases]. ## modifying tests Don't forget to update muon/tests/project/meson.build with the sha1 of the new HEAD. ## syncing tests with upstream 1. Checkout the `upstream` branch of this repo. 2. Checkout the desired revision to sync to in the meson repo. 3. Run `tools/update_tests.sh` from the muon repo: ``` tools/update_tests.sh -cf path/to/meson path/to/meson-tests ``` 4. Switch back to `master` in the meson-tests repo. 5. Rebase: `git rebase -i upstream`. 6. Update muon/tests/project/meson.build with the sha1 of the new HEAD. 7. Force push meson-tests and push muon [meson/test cases]: https://github.com/mesonbuild/meson/tree/master/test%20cases muon-v0.4.0/subprojects/meson-tests/common/0002755000175000017500000000000014751453622017766 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/197 function attributes/0002755000175000017500000000000014751453622024263 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/197 function attributes/meson_options.txt0000644000175000017500000000026314751453622027717 0ustar buildbuildoption( 'mode', type: 'combo', choices: ['single', 'parallel'], value: 'single', description: 'Test the one at a time function or many at a time function.', ) muon-v0.4.0/subprojects/meson-tests/common/197 function attributes/meson.build0000644000175000017500000001073314751453622026427 0ustar buildbuild# Copyright © 2017-2018 Intel Corporation # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. project('gcc func attributes', ['c', 'cpp']) # For msvc these will fail because msvc doesn't support __attribute__, for # Clang and GCC, they should pass. c = meson.get_compiler('c') cpp = meson.get_compiler('cpp') if c.get_id() == 'pgi' error( 'MESON_SKIP_TEST: PGI supports its own set of features, will need a separate list for PGI to test it.', ) endif expected = {} expected_default = not ['msvc', 'clang-cl', 'intel-cl'].contains(c.get_id()) # Q: Why is ifunc not in this list or any of the below lists? # A: It's too damn hard to figure out if you actually support it, since it # requires both compiler and libc support, and there isn't a good way to # figure that out except by running the code we're trying to test. attributes = [ 'aligned', 'always_inline', 'cold', 'const', 'constructor', 'constructor_priority', 'deprecated', 'destructor', 'flatten', 'format', 'format_arg', 'gnu_inline', 'hot', 'malloc', 'noinline', 'nonnull', 'noreturn', 'nothrow', 'pure', 'section', 'sentinel', 'unused', 'used', 'vector_size', 'warn_unused_result', 'weak', 'dllexport', 'dllimport', ] expected += { 'dllexport': ['windows', 'cygwin'].contains(host_machine.system()), 'dllimport': ['windows', 'cygwin'].contains(host_machine.system()), } if c.get_id() == 'gcc' and ['windows', 'cygwin'].contains(host_machine.system()) expected += { 'visibility': false, 'visibility:hidden': false, 'visibility:internal': false, 'visibility:protected': false, } endif if c.get_id() != 'intel' # not supported by icc as of 19.0.0 attributes += 'weakref' endif # These are unsupported on darwin with apple clang 9.1.0 if host_machine.system() != 'darwin' attributes += 'alias' attributes += 'visibility' attributes += 'visibility:default' attributes += 'visibility:hidden' attributes += 'visibility:internal' attributes += 'visibility:protected' attributes += 'alloc_size' endif # gcc doesn't support constructor_priority on darwin if c.get_id() == 'gcc' and host_machine.system() == 'darwin' expected += {'constructor_priority': false} endif if ['gcc', 'intel'].contains(c.get_id()) # not supported by clang as of 5.0.0 (at least up to 6.0.1) attributes += 'artificial' attributes += 'error' attributes += 'externally_visible' attributes += 'leaf' attributes += 'noclone' attributes += 'optimize' attributes += 'warning' if c.get_id() == 'gcc' and c.version().version_compare('>= 7.0.0') attributes += 'fallthrough' endif # XXX(arsen): limited to clang 13+ even though gcc 11 has it, since gcc # detects support for it at compile time based on binutils version if c.get_id() == 'clang' and c.version().version_compare('>= 13.0.0') attributes += 'retain' endif endif if c.get_id() == 'gcc' if c.version().version_compare('>= 14.1') attributes += 'null_terminated_string_arg' endif endif if get_option('mode') == 'single' foreach a : attributes x = c.has_function_attribute(a) expected_result = expected.get(a, expected_default) assert(x == expected_result, '@0@: @1@'.format(c.get_id(), a)) x = cpp.has_function_attribute(a) assert(x == expected_result, '@0@: @1@'.format(cpp.get_id(), a)) endforeach else multi_expected = [] foreach a : attributes if expected.get(a, expected_default) multi_expected += a endif endforeach multi_check = c.get_supported_function_attributes(attributes) assert( multi_check == multi_expected, 'get_supported_function_arguments works (C)', ) multi_check = cpp.get_supported_function_attributes(attributes) assert( multi_check == multi_expected, 'get_supported_function_arguments works (C++)', ) endif muon-v0.4.0/subprojects/meson-tests/common/197 function attributes/test.json0000644000175000017500000000020014751453622026123 0ustar buildbuild{ "matrix": { "options": { "mode": [ { "val": "single" }, { "val": "parallel" } ] } } } muon-v0.4.0/subprojects/meson-tests/common/5 linkstatic/0002755000175000017500000000000014751453622022260 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/5 linkstatic/libfile3.c0000644000175000017500000000004214751453622024107 0ustar buildbuildint func3(void) { return 3; } muon-v0.4.0/subprojects/meson-tests/common/5 linkstatic/libfile.c0000644000175000017500000000004114751453622024023 0ustar buildbuildint func(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/5 linkstatic/libfile2.c0000644000175000017500000000004214751453622024106 0ustar buildbuildint func2(void) { return 2; } muon-v0.4.0/subprojects/meson-tests/common/5 linkstatic/main.c0000644000175000017500000000006714751453622023351 0ustar buildbuildint func(void); int main(void) { return func(); } muon-v0.4.0/subprojects/meson-tests/common/5 linkstatic/meson.build0000644000175000017500000000040314751453622024415 0ustar buildbuildproject('static library linking test', 'c') lib = build_target( 'mylib', 'libfile.c', 'libfile2.c', 'libfile3.c', 'libfile4.c', target_type: 'static_library', ) exe = executable('prog', 'main.c', link_with: lib) test('runtest', exe) muon-v0.4.0/subprojects/meson-tests/common/5 linkstatic/libfile4.c0000644000175000017500000000004214751453622024110 0ustar buildbuildint func4(void) { return 4; } muon-v0.4.0/subprojects/meson-tests/common/93 suites/0002755000175000017500000000000014751453622021516 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/93 suites/subprojects/0002755000175000017500000000000014751453622024061 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/93 suites/subprojects/sub/0002755000175000017500000000000014751453622024652 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/93 suites/subprojects/sub/meson.build0000644000175000017500000000025014751453622027007 0ustar buildbuildproject('subproject test suites', 'c') sub1 = executable('sub1', 'sub1.c') sub2 = executable('sub2', 'sub2.c') test('sub1', sub1) test('sub2', sub2, suite: 'suite2') muon-v0.4.0/subprojects/meson-tests/common/93 suites/subprojects/sub/sub2.c0000644000175000017500000000012514751453622025665 0ustar buildbuild#include int main(void) { printf("I am test sub2.\n"); return 0; } muon-v0.4.0/subprojects/meson-tests/common/93 suites/subprojects/sub/sub1.c0000644000175000017500000000012514751453622025664 0ustar buildbuild#include int main(void) { printf("I am test sub1.\n"); return 0; } muon-v0.4.0/subprojects/meson-tests/common/93 suites/meson.build0000644000175000017500000000031614751453622023656 0ustar buildbuildproject('multiple test suites', 'c') subproject('sub') exe1 = executable('exe1', 'exe1.c') exe2 = executable('exe2', 'exe2.c') test('exe1', exe1) test('exe2', exe2, suite: ['suite2', ['super-special']]) muon-v0.4.0/subprojects/meson-tests/common/93 suites/exe1.c0000644000175000017500000000012514751453622022520 0ustar buildbuild#include int main(void) { printf("I am test exe1.\n"); return 0; } muon-v0.4.0/subprojects/meson-tests/common/93 suites/exe2.c0000644000175000017500000000012514751453622022521 0ustar buildbuild#include int main(void) { printf("I am test exe2.\n"); return 0; } muon-v0.4.0/subprojects/meson-tests/common/82 add language/0002755000175000017500000000000014751453622022474 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/82 add language/prog.cc0000644000175000017500000000013414751453622023746 0ustar buildbuild#include int main(int, char**) { std::cout << "I am C++.\n"; return 0; } muon-v0.4.0/subprojects/meson-tests/common/82 add language/meson.build0000644000175000017500000000055014751453622024634 0ustar buildbuildproject('add language', 'c') test('C', executable('cprog', 'prog.c')) assert( add_languages('cpp', native: false), 'Add_languages returned false on success', ) assert( not add_languages('klingon', required: false), 'Add_languages returned true on failure.', ) test('C++', executable('cppprog', 'prog.cc')) add_languages('c', native: false) muon-v0.4.0/subprojects/meson-tests/common/82 add language/prog.c0000644000175000017500000000012314751453622023601 0ustar buildbuild#include int main(void) { printf("I am plain C.\n"); return 0; } muon-v0.4.0/subprojects/meson-tests/common/99 postconf/0002755000175000017500000000000014751453622022043 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/99 postconf/raw.dat0000644000175000017500000000000214751453622023314 0ustar buildbuild9 muon-v0.4.0/subprojects/meson-tests/common/99 postconf/meson.build0000644000175000017500000000016614751453622024206 0ustar buildbuildproject('postconf script', 'c') meson.add_postconf_script('postconf.py') test('post', executable('prog', 'prog.c')) muon-v0.4.0/subprojects/meson-tests/common/99 postconf/prog.c0000644000175000017500000000010614751453622023151 0ustar buildbuild#include"generated.h" int main(void) { return THE_NUMBER != 9; } muon-v0.4.0/subprojects/meson-tests/common/99 postconf/postconf.py0000644000175000017500000000062014751453622024244 0ustar buildbuild#!/usr/bin/env python3 import os template = '''#pragma once #define THE_NUMBER {} ''' input_file = os.path.join(os.environ['MESON_SOURCE_ROOT'], 'raw.dat') output_file = os.path.join(os.environ['MESON_BUILD_ROOT'], 'generated.h') with open(input_file, encoding='utf-8') as f: data = f.readline().strip() with open(output_file, 'w', encoding='utf-8') as f: f.write(template.format(data)) muon-v0.4.0/subprojects/meson-tests/common/15 if/0002755000175000017500000000000014751453622020572 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/15 if/meson.build0000644000175000017500000000165614751453622022742 0ustar buildbuildproject('if test', 'c') var1 = true set_variable('var2', false) if var1 exe = executable('prog', 'prog.c') endif if var2 exe = executable('breakbreakbreak', 'crashing.c') endif test('iftest', exe) if not is_variable('var1') error('Is_variable fail.') endif if is_variable('nonexisting') error('Is_variable fail 2.') endif if not get_variable('var1', false) error('Get_variable fail.') endif if get_variable('nonexisting', false) error('Get_variable fail.') endif # Now test elseif t = true f = false if true message('Ok.') elif true error('Error') else error('Error') endif if f error('Error.') elif t message('Ok') else error('Error') endif if f error('Error.') elif false error('Error') else message('Ok') endif # Test plain else var = false if var exe = executable('break', 'break.c') else exe = executable('eprog', 'prog.c') endif test('elsetest', exe) muon-v0.4.0/subprojects/meson-tests/common/15 if/prog.c0000644000175000017500000000003514751453622021701 0ustar buildbuildint main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/101 testframework options/0002755000175000017500000000000014751453622024621 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/101 testframework options/meson_options.txt0000644000175000017500000000041614751453622030255 0ustar buildbuildoption( 'testoption', type: 'string', value: 'optval', description: 'An option to do something', ) option('other_one', type: 'boolean', value: false) option( 'combo_opt', type: 'combo', choices: ['one', 'two', 'combo'], value: 'combo', ) muon-v0.4.0/subprojects/meson-tests/common/101 testframework options/meson.build0000644000175000017500000000135114751453622026761 0ustar buildbuild# normally run only from run_tests.py or run_project_tests.py # else do like # meson build '-Dtestoption=A string with spaces' -Dother_one=true -Dcombo_opt=one -Dprefix=/usr -Dlibdir=lib -Dbackend=ninja -Dwerror=True project( 'options', 'c', default_options: [ 'testoption=A string with spaces', 'other_one=true', 'combo_opt=one', 'prefix=/usr', 'libdir=lib', 'backend=ninja', 'werror=true', ], ) assert( get_option('testoption') == 'A string with spaces', 'Incorrect value for testoption option.', ) assert(get_option('other_one') == true, 'Incorrect value for other_one option.') assert(get_option('combo_opt') == 'one', 'Incorrect value for combo_opt option.') muon-v0.4.0/subprojects/meson-tests/common/101 testframework options/test.json0000644000175000017500000000042014751453622026465 0ustar buildbuild{ "matrix": { "options": { "testoption": [{ "val": "A string with spaces" }], "other_one": [{ "val": "true" }], "combo_opt": [{ "val": "one" }], "werror": [{ "val": "true" }] } } } muon-v0.4.0/subprojects/meson-tests/common/221 zlib/0002755000175000017500000000000014751453622021213 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/221 zlib/meson.build0000644000175000017500000000207714751453622023361 0ustar buildbuildproject('zlib system dependency', 'c') if not ['darwin', 'freebsd', 'dragonfly', 'windows', 'android'].contains(host_machine.system()) error( 'MESON_SKIP_TEST only applicable on macOS, FreeBSD, DragonflyBSD, Windows, and Android.', ) endif cc = meson.get_compiler('c') if host_machine.system() == 'darwin' and cc.get_id() != 'clang' # this will only work on mac if using Apple's clang compiler, but there is no # way in the meson source level to differentiate apple clang and llvm clang # In the meson CI only apple clang is tested error('MESON_SKIP_TEST on macOS only clang is supported.') endif if not ( cc.find_library('z', required: false).found() or cc.find_library('zlib', required: false).found() or cc.find_library('zlib1', required: false).found() ) error( 'MESON_SKIP_TEST Cannot seem to find zlib via find_library, this test will probably fail.', ) endif z = dependency('zlib', method: 'system') assert( z.version().version_compare('>= 1.2'), 'Version does not seem to have been detected correctly.', ) muon-v0.4.0/subprojects/meson-tests/common/244 variable scope/0002755000175000017500000000000014751453622023137 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/244 variable scope/meson.build0000644000175000017500000000030614751453622025276 0ustar buildbuildproject('variable scope') x = 1 assert(is_variable('x')) assert(get_variable('x') == 1) set_variable('x', 10) assert(get_variable('x') == 10) unset_variable('x') assert(not is_variable('x')) muon-v0.4.0/subprojects/meson-tests/common/49 custom target/0002755000175000017500000000000014751453622022764 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/49 custom target/meson.build0000644000175000017500000000404114751453622025123 0ustar buildbuildproject('custom target') python = find_program('python3', required: false) if not python.found() python = find_program('python') endif # Note that this will not add a dependency to the compiler executable. # Code will not be rebuilt if it changes. comp = '@0@/@1@'.format(meson.current_source_dir(), 'my_compiler.py') # Test that files() in command: works. The compiler just discards it. useless = files('test.json') mytarget = custom_target( 'bindat', output: 'data.dat', input: 'data_source.txt', command: [python, comp, '--input=@INPUT@', '--output=@OUTPUT@', useless], env: {'MY_COMPILER_ENV': 'value'}, install: true, install_dir: 'subdir', ) has_not_changed = false if is_disabler(mytarget) has_not_changed = true else has_not_changed = true endif assert(has_not_changed, 'Custom target has changed.') assert(not is_disabler(mytarget), 'Custom target is a disabler.') mytarget_disabler = custom_target( 'bindat', output: 'data.dat', input: 'data_source.txt', command: [disabler(), comp, '--input=@INPUT@', '--output=@OUTPUT@', useless], install: true, install_dir: 'subdir', ) if mytarget_disabler.found() mytarget_disabled = false else mytarget_disabled = true endif assert(mytarget_disabled, 'Disabled custom target should not be found.') mytarget_ci = custom_target( 'bindat_ci', output: 'data_ci.dat', input: 'data_source.txt', command: [ python, comp, '--input=@INPUT@', '--output=@OUTPUT@', mytarget.to_list(), ], ) mytarget_disabler = custom_target( 'bindat', output: 'data.dat', input: disabler(), command: [python, comp, '--input=@INPUT@', '--output=@OUTPUT@', useless], install: true, install_dir: 'subdir', ) assert( is_disabler(mytarget_disabler), 'Disabled custom target is not a disabler.', ) if mytarget_disabler.found() mytarget_disabled = false else mytarget_disabled = true endif assert(mytarget_disabled, 'Disabled custom target should not be found.') subdir('depfile') muon-v0.4.0/subprojects/meson-tests/common/49 custom target/test.json0000644000175000017500000000011514751453622024631 0ustar buildbuild{ "installed": [ {"type": "file", "file": "usr/subdir/data.dat"} ] } muon-v0.4.0/subprojects/meson-tests/common/49 custom target/data_source.txt0000644000175000017500000000004014751453622026006 0ustar buildbuildThis is a text only input file. muon-v0.4.0/subprojects/meson-tests/common/49 custom target/depfile/0002755000175000017500000000000014751453622024374 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/49 custom target/depfile/dep.py0000755000175000017500000000056714751453622025527 0ustar buildbuild#!/usr/bin/env python3 import sys, os from glob import glob _, srcdir, depfile, output = sys.argv depfiles = glob(os.path.join(srcdir, '*')) quoted_depfiles = [x.replace(' ', r'\ ') for x in depfiles] with open(output, 'w') as f: f.write('I am the result of globbing.') with open(depfile, 'w') as f: f.write('{}: {}\n'.format(output, ' '.join(quoted_depfiles))) muon-v0.4.0/subprojects/meson-tests/common/49 custom target/depfile/meson.build0000644000175000017500000000033714751453622026537 0ustar buildbuildmytarget = custom_target( 'depfile', output: 'dep.dat', depfile: 'dep.dat.d', command: [ find_program('dep.py'), meson.current_source_dir(), '@DEPFILE@', '@OUTPUT@', ], ) muon-v0.4.0/subprojects/meson-tests/common/49 custom target/my_compiler.py0000755000175000017500000000122114751453622025652 0ustar buildbuild#!/usr/bin/env python3 import os import sys assert os.path.exists(sys.argv[3]) args = sys.argv[:-1] if __name__ == '__main__': assert os.environ['MY_COMPILER_ENV'] == 'value' if len(args) != 3 or not args[1].startswith('--input') or \ not args[2].startswith('--output'): print(args[0], '--input=input_file --output=output_file') sys.exit(1) with open(args[1].split('=')[1]) as f: ifile = f.read() if ifile != 'This is a text only input file.\n': print('Malformed input') sys.exit(1) with open(args[2].split('=')[1], 'w') as ofile: ofile.write('This is a binary output file.\n') muon-v0.4.0/subprojects/meson-tests/common/116 test skip/0002755000175000017500000000000014751453622022164 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/116 test skip/meson.build0000644000175000017500000000016314751453622024324 0ustar buildbuildproject('test skip', 'c') exe_test_skip = executable('test_skip', 'test_skip.c') test('test_skip', exe_test_skip) muon-v0.4.0/subprojects/meson-tests/common/116 test skip/test_skip.c0000644000175000017500000000004214751453622024327 0ustar buildbuildint main(void) { return 77; } muon-v0.4.0/subprojects/meson-tests/common/30 sizeof/0002755000175000017500000000000014751453622021470 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/30 sizeof/config.h.in0000644000175000017500000000007014751453622023506 0ustar buildbuild#define INTSIZE @INTSIZE@ #define WCHARSIZE @WCHARSIZE@ muon-v0.4.0/subprojects/meson-tests/common/30 sizeof/meson.build0000644000175000017500000000171014751453622023627 0ustar buildbuildproject('sizeof', 'c', 'cpp') # Test with C cc = meson.get_compiler('c') intsize = cc.sizeof('int') wcharsize = cc.sizeof('wchar_t', prefix: '#include') cd = configuration_data() cd.set('INTSIZE', intsize) cd.set('WCHARSIZE', wcharsize) cd.set('CONFIG', 'config.h') configure_file(input: 'config.h.in', output: 'config.h', configuration: cd) s = configure_file(input: 'prog.c.in', output: 'prog.c', configuration: cd) e = executable('prog', s) test('sizeof test', e) # Test with C++ cpp = meson.get_compiler('cpp') intsize = cpp.sizeof('int') wcharsize = cpp.sizeof('wchar_t', prefix: '#include') cdpp = configuration_data() cdpp.set('INTSIZE', intsize) cdpp.set('WCHARSIZE', wcharsize) cdpp.set('CONFIG', 'config.hpp') configure_file(input: 'config.h.in', output: 'config.hpp', configuration: cdpp) spp = configure_file(input: 'prog.c.in', output: 'prog.cc', configuration: cdpp) epp = executable('progpp', spp) test('sizeof test c++', epp) muon-v0.4.0/subprojects/meson-tests/common/30 sizeof/prog.c.in0000644000175000017500000000065614751453622023215 0ustar buildbuild#include "@CONFIG@" #include #include int main(void) { if(INTSIZE != sizeof(int)) { fprintf(stderr, "Mismatch: detected int size %d, actual size %d.\n", INTSIZE, (int)sizeof(int)); return 1; } if(WCHARSIZE != sizeof(wchar_t)) { fprintf(stderr, "Mismatch: detected wchar size %d, actual size %d.\n", WCHARSIZE, (int)sizeof(wchar_t)); return 1; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/182 find override/0002755000175000017500000000000014751453622023001 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/182 find override/otherdir/0002755000175000017500000000000014751453622024621 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/182 find override/otherdir/main.c0000644000175000017500000000012614751453622025706 0ustar buildbuildint be_seeing_you(void); int main(void) { return be_seeing_you() == 6 ? 0 : 1; } muon-v0.4.0/subprojects/meson-tests/common/182 find override/otherdir/source2.desc0000644000175000017500000000002014751453622027031 0ustar buildbuildnumber_returner muon-v0.4.0/subprojects/meson-tests/common/182 find override/otherdir/meson.build0000644000175000017500000000123214751453622026757 0ustar buildbuildgen = find_program('codegen') # Should use overridden value set in "subdir". src = custom_target( 'arrival', input: 'source.desc', output: 'file.c', command: [gen, '@INPUT@', '@OUTPUT@'], ) e = executable('six', 'main.c', src) test('six', e) # Override stuff with an executables meson.override_find_program('six_meson_exe', e) # The same again, but this time with a program that was generated # with configure_file. gen = find_program('gencodegen') src = custom_target( 'hundred', input: 'source2.desc', output: 'file2.c', command: [gen, '@INPUT@', '@OUTPUT@'], ) e = executable('hundred', 'main2.c', src) test('hundred', e) muon-v0.4.0/subprojects/meson-tests/common/182 find override/otherdir/main2.c0000644000175000017500000000013414751453622025767 0ustar buildbuildint number_returner(void); int main(void) { return number_returner() == 100 ? 0 : 1; } muon-v0.4.0/subprojects/meson-tests/common/182 find override/otherdir/source.desc0000644000175000017500000000001614751453622026754 0ustar buildbuildbe_seeing_you muon-v0.4.0/subprojects/meson-tests/common/182 find override/subprojects/0002755000175000017500000000000014751453622025344 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/182 find override/subprojects/sub/0002755000175000017500000000000014751453622026135 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/182 find override/subprojects/sub/meson.build0000644000175000017500000000014014751453622030270 0ustar buildbuildproject('tools') exe = find_program('gencodegen') meson.override_find_program('sometool', exe) muon-v0.4.0/subprojects/meson-tests/common/182 find override/subprojects/sub2.wrap0000644000175000017500000000010514751453622027104 0ustar buildbuild[wrap-file] directory = sub2 [provide] program_names = prog-version muon-v0.4.0/subprojects/meson-tests/common/182 find override/subprojects/sub.wrap0000644000175000017500000000010014751453622027015 0ustar buildbuild[wrap-file] directory = sub [provide] program_names = sometool muon-v0.4.0/subprojects/meson-tests/common/182 find override/subprojects/sub2/0002755000175000017500000000000014751453622026217 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/182 find override/subprojects/sub2/meson.build0000644000175000017500000000015214751453622030355 0ustar buildbuildproject('sub2') prog = find_program('prog-version.py') meson.override_find_program('prog-version', prog) muon-v0.4.0/subprojects/meson-tests/common/182 find override/subprojects/sub2/prog-version.py0000755000175000017500000000004614751453622031224 0ustar buildbuild#! /usr/bin/env python3 print('2.0') muon-v0.4.0/subprojects/meson-tests/common/182 find override/subdir/0002755000175000017500000000000014751453622024271 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/182 find override/subdir/meson.build0000644000175000017500000000051114751453622026426 0ustar buildbuildx = find_program('converter.py') meson.override_find_program('codegen', x) # Override a command with a generated script cdata = configuration_data() cdata.set('NUMBER', 100) numprog = configure_file(input: 'gencodegen.py.in', output: 'gencodegen.py', configuration: cdata) meson.override_find_program('gencodegen', numprog) muon-v0.4.0/subprojects/meson-tests/common/182 find override/subdir/converter.py0000755000175000017500000000037214751453622026655 0ustar buildbuild#!/usr/bin/env python3 import sys import pathlib [ifilename, ofilename] = sys.argv[1:3] ftempl = '''int %s(void) { return 6; } ''' d = pathlib.Path(ifilename).read_text().split('\n')[0].strip() pathlib.Path(ofilename).write_text(ftempl % d) muon-v0.4.0/subprojects/meson-tests/common/182 find override/subdir/gencodegen.py.in0000755000175000017500000000040114751453622027342 0ustar buildbuild#!/usr/bin/env python3 import sys import pathlib [ifilename, ofilename] = sys.argv[1:3] ftempl = '''int %s(void) { return @NUMBER@; } ''' d = pathlib.Path(ifilename).read_text().split('\n')[0].strip() pathlib.Path(ofilename).write_text(ftempl % d) muon-v0.4.0/subprojects/meson-tests/common/182 find override/meson.build0000644000175000017500000000207414751453622025144 0ustar buildbuildproject('find program override', 'c') gencodegen = find_program('gencodegen', required: false) six_prog = find_program('six_meson_exe', required: false) assert( not gencodegen.found(), 'gencodegen is an internal program, should not be found', ) assert( not six_prog.found(), 'six_meson_exe is an internal program, should not be found', ) # Test the check-if-found-else-override workflow if not gencodegen.found() subdir('subdir') endif subdir('otherdir') tool = find_program('sometool') assert(tool.found()) assert(tool.full_path() != '') assert(tool.full_path() == tool.path()) # six_meson_exe is an overridden project executable six_prog = find_program('six_meson_exe') assert(six_prog.found()) assert(six_prog.full_path() != '') assert(six_prog.full_path() == six_prog.path()) # We have prog-version.py in current directory, but it's version 1.0. # This needs to use fallback for "prog-version" name which will be version 2.0. prog = find_program('prog-version.py', 'prog-version', version: '>= 2.0') assert(prog.found()) assert(prog.version() == '2.0') muon-v0.4.0/subprojects/meson-tests/common/182 find override/prog-version.py0000755000175000017500000000004614751453622026006 0ustar buildbuild#! /usr/bin/env python3 print('1.0') muon-v0.4.0/subprojects/meson-tests/common/207 warning level 0/0002755000175000017500000000000014751453622023134 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/207 warning level 0/main.cpp0000644000175000017500000000041014751453622024555 0ustar buildbuild#include #define PROJECT_NAME "demo" int main(int argc, char **argv) { if(argc != 1) { std::cout << argv[0] << "takes no arguments.\n"; return 1; } std::cout << "This is project " << PROJECT_NAME << ".\n"; return 0; } muon-v0.4.0/subprojects/meson-tests/common/207 warning level 0/meson.build0000644000175000017500000000017414751453622025276 0ustar buildbuildproject('warning_level', 'cpp', default_options: ['warning_level=0']) exe = executable('main', 'main.cpp', install: false) muon-v0.4.0/subprojects/meson-tests/common/81 extract all/0002755000175000017500000000000014751453622022402 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/81 extract all/three.c0000644000175000017500000000007114751453622023651 0ustar buildbuild#include"extractor.h" int func3(void) { return 3; } muon-v0.4.0/subprojects/meson-tests/common/81 extract all/four.c0000644000175000017500000000007114751453622023515 0ustar buildbuild#include"extractor.h" int func4(void) { return 4; } muon-v0.4.0/subprojects/meson-tests/common/81 extract all/meson.build0000644000175000017500000000115014751453622024537 0ustar buildbuildproject('extract all', 'c') a = static_library('a', 'one.c', 'two.c') b = static_library('b', 'three.c', 'four.c') c = static_library('c', objects: [a.extract_all_objects(), b.extract_all_objects()]) d = static_library( 'd', objects: [ a.extract_all_objects(), b.extract_all_objects(), c.extract_all_objects(), ], ) d_recursive = static_library('d_recursive', objects: [c.extract_all_objects(recursive: true)]) e = executable('proggie', 'prog.c', link_with: d) test('extall', e) e = executable('proggie_recursive', 'prog.c', link_with: d_recursive) test('extall_recursive', e) muon-v0.4.0/subprojects/meson-tests/common/81 extract all/one.c0000644000175000017500000000007114751453622023323 0ustar buildbuild#include"extractor.h" int func1(void) { return 1; } muon-v0.4.0/subprojects/meson-tests/common/81 extract all/two.c0000644000175000017500000000007114751453622023353 0ustar buildbuild#include"extractor.h" int func2(void) { return 2; } muon-v0.4.0/subprojects/meson-tests/common/81 extract all/prog.c0000644000175000017500000000031214751453622023507 0ustar buildbuild#include"extractor.h" #include int main(void) { if((1+2+3+4) != (func1() + func2() + func3() + func4())) { printf("Arithmetic is fail.\n"); return 1; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/81 extract all/extractor.h0000644000175000017500000000012214751453622024557 0ustar buildbuild#pragma once int func1(void); int func2(void); int func3(void); int func4(void); muon-v0.4.0/subprojects/meson-tests/common/211 dependency get_variable method/0002755000175000017500000000000014751453622026236 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/211 dependency get_variable method/meson.build0000644000175000017500000000755614751453622030413 0ustar buildbuildproject( 'dependency get_variable', ['c', 'cpp'], ) # Just some string that nothing should return default = 'asufoiqwjtl;adjfbpiuqwoehtl;ajdfl;ghal;sdjg' dep = dependency('zlib', method: 'pkg-config', required: false) if not dep.found() warning( 'Skipping pkg-config tests as zlib is not available or is not pkg-config', ) else # Test for regular pkg-config # We don't know what the value will be, but we know it should be the same dep = dependency('zlib', method: 'pkg-config') assert( dep.get_pkgconfig_variable('prefix') == dep.get_variable(pkgconfig: 'prefix'), 'Got different values from get_pkgconfig_variable and get_variable(pkgconfig: )', ) assert( dep.get_variable(pkgconfig: default, default_value: default) == default, 'pkg-config didn\'t get default when we should have.', ) assert( dep.get_variable(pkgconfig: 'prefix', default_value: default) != default, 'pkg-config got default when we shouldn\'t have.', ) assert( dep.get_variable(pkgconfig: 'pkgvarnotfound', default_value: '') == '', ) endif # different from meson: config-tool and cmake are unsupported # dep_ct = dependency('llvm', method: 'config-tool', required: false) # if not dep_ct.found() # warning( # 'Skipping config-tool tests as llvm is not available or llvm-config was not found.', # ) # else # assert( # dep_ct.get_configtool_variable('has-rtti') == dep_ct.get_variable( # configtool: 'has-rtti', # ), # 'Got different values from get_configtool_variable and get_variable(configtool: )', # ) # assert( # dep_ct.get_variable(configtool: default, default_value: default) == default, # 'config-tool didn\'t get default when we should have.', # ) # assert( # dep_ct.get_variable(configtool: 'has-rtti', default_value: default) != default, # 'config-tool got default when we shouldn\'t have.', # ) # endif # dep_cm = dependency('llvm', method: 'cmake', required: false) # if not dep_cm.found() # warning( # 'Skipping cmake tests as llvm is not available via the cmake finder.', # ) # else # if dep_ct.found() # assert( # (dep_cm.get_variable(cmake: 'LLVM_ENABLE_RTTI') == 'ON') == ( # dep_ct.get_variable(configtool: 'has-rtti') == 'YES' # ), # 'RTTI information for cmake and config tools disagree', # ) # endif # assert( # dep_cm.get_variable(cmake: default, default_value: default) == default, # 'cmake didn\'t get default when we should have.', # ) # assert( # dep_cm.get_variable(cmake: 'LLVM_ENABLE_RTTI', default_value: default) != default, # 'cmake config-tool got default when we shouldn\'t have.', # ) # endif idep = declare_dependency(variables: {'foo': 'value'}) assert( idep.get_variable( pkgconfig: 'foo', # cmake: 'foo', # configtool: 'foo', internal: 'foo', default_value: default, ) == 'value', 'internal got default when it shouldn\'t have.', ) assert( idep.get_variable( pkgconfig: 'foo', # cmake: 'foo', # configtool: 'foo', internal: 'bar', default_value: default, ) == default, 'internal didn\'t default when it should have.', ) idep = declare_dependency() assert( idep.get_variable( pkgconfig: 'foo', # cmake: 'foo', # configtool: 'foo', default_value: default, ) == default, 'something went wrong with an InternalDependency with no variables.', ) # different from meson: variables must be a dict[str] idep = declare_dependency(variables: {'foo': 'value'}) assert(idep.get_variable(internal: 'foo') == 'value') assert(idep.get_variable('foo') == 'value') assert(idep.get_variable('invalid', internal: 'foo') == 'value') muon-v0.4.0/subprojects/meson-tests/common/211 dependency get_variable method/test.json0000644000175000017500000000017414751453622030110 0ustar buildbuild{ "stdout": [ { "line": ".*pkgvarnotfound.*", "match": "re", "count": 0 } ] } muon-v0.4.0/subprojects/meson-tests/common/247 deprecated option/0002755000175000017500000000000014751453622023654 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/247 deprecated option/meson_options.txt0000644000175000017500000000260214751453622027307 0ustar buildbuild# Option fully deprecated, it warns when any value is set. option('o1', type: 'boolean', deprecated: true) # One of the choices is deprecated, it warns only when 'a' is in the list of values. option('o2', type: 'array', choices: ['a', 'b'], deprecated: ['a']) # One of the choices is deprecated, it warns only when 'a' is in the list of values # and replace it by 'c'. option('o3', type: 'array', choices: ['a', 'b', 'c'], deprecated: {'a': 'c'}) # A boolean option has been replaced by a feature, old true/false values are remapped. option( 'o4', type: 'feature', deprecated: {'true': 'enabled', 'false': 'disabled'}, ) # A feature option has been replaced by a boolean, enabled/disabled/auto values are remapped. option( 'o5', type: 'boolean', deprecated: {'enabled': 'true', 'disabled': 'false', 'auto': 'false'}, ) # A boolean option has been replaced by a feature with another name, old true/false values # are accepted by the new option for backward compatibility. option('o6', type: 'boolean', value: true, deprecated: 'o7') option( 'o7', type: 'feature', value: 'enabled', deprecated: {'true': 'enabled', 'false': 'disabled'}, ) # A project option is replaced by a module option option('o8', type: 'string', value: '', deprecated: 'python_platlibdir') # different than meson: python.platlibdir is not an option option('python_platlibdir', type: 'string') muon-v0.4.0/subprojects/meson-tests/common/247 deprecated option/meson.build0000644000175000017500000000076614751453622026025 0ustar buildbuildproject( 'deprecated options', default_options: [ 'o1=false', 'o2=a,b', 'o3=a,b', 'o4=true', 'o5=auto', 'o6=false', 'o8=/foo', ], ) assert(get_option('o1') == false) assert(get_option('o2') == ['a', 'b']) assert(get_option('o3') == ['c', 'b']) assert(get_option('o4').enabled()) assert(get_option('o5') == false) assert(get_option('o6') == false) assert(get_option('o7').disabled()) assert(get_option('python_platlibdir') == '/foo') muon-v0.4.0/subprojects/meson-tests/common/247 deprecated option/test.json0000644000175000017500000000117514751453622025530 0ustar buildbuild{ "stdout": [ { "line": ".*DEPRECATION: Option 'o1' is deprecated", "match": "re", "count": 1 }, { "line": ".*DEPRECATION: Option 'o2' value 'a' is deprecated", "match": "re", "count": 1 }, { "line": ".*DEPRECATION: Option 'o3' value 'a' is replaced by 'c'", "match": "re", "count": 1 }, { "line": ".*DEPRECATION: Option 'o4' value 'true' is replaced by 'enabled'", "match": "re", "count": 1 }, { "line": ".*DEPRECATION: Option 'o5' value 'auto' is replaced by 'false'", "match": "re", "count": 1 } ] } muon-v0.4.0/subprojects/meson-tests/common/112 subdir subproject/0002755000175000017500000000000014751453622023703 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/112 subdir subproject/subprojects/0002755000175000017500000000000014751453622026246 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/112 subdir subproject/subprojects/sub/0002755000175000017500000000000014751453622027037 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/112 subdir subproject/subprojects/sub/meson.build0000644000175000017500000000022414751453622031175 0ustar buildbuildproject('sub', 'c') lib = static_library('sub', 'sub.c') libSub = declare_dependency(include_directories: include_directories('.'), link_with: lib) muon-v0.4.0/subprojects/meson-tests/common/112 subdir subproject/subprojects/sub/sub.c0000644000175000017500000000006214751453622027770 0ustar buildbuild#include "sub.h" int sub(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/112 subdir subproject/subprojects/sub/sub.h0000644000175000017500000000006414751453622027777 0ustar buildbuild#ifndef SUB_H #define SUB_H int sub(void); #endif muon-v0.4.0/subprojects/meson-tests/common/112 subdir subproject/meson.build0000644000175000017500000000004414751453622026041 0ustar buildbuildproject('proj', 'c') subdir('prog') muon-v0.4.0/subprojects/meson-tests/common/112 subdir subproject/prog/0002755000175000017500000000000014751453622024652 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/112 subdir subproject/prog/meson.build0000644000175000017500000000024314751453622027011 0ustar buildbuildsubproject('sub') libSub = dependency('sub', fallback: ['sub', 'libSub']) exe = executable('prog', 'prog.c', dependencies: libSub) test('subdir subproject', exe) muon-v0.4.0/subprojects/meson-tests/common/112 subdir subproject/prog/prog.c0000644000175000017500000000006714751453622025766 0ustar buildbuild#include int main(void) { return sub(); } muon-v0.4.0/subprojects/meson-tests/common/164 dependency factory/0002755000175000017500000000000014751453622024027 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/164 dependency factory/meson.build0000644000175000017500000000363714751453622026200 0ustar buildbuildproject('dependency factory', 'c', meson_version: '>=0.53') dep = dependency('gl', method: 'pkg-config', required: false) if dep.found() assert(dep.type_name() == 'pkgconfig') dep.get_pkgconfig_variable('prefix') endif dep = dependency('SDL2', method: 'pkg-config', required: false) if dep.found() assert(dep.type_name() == 'pkgconfig') dep.get_pkgconfig_variable('prefix') endif # dep = dependency('SDL2', method: 'config-tool', required: false) # if dep.found() # assert(dep.type_name() == 'config-tool') # dep.get_configtool_variable('prefix') # endif dep = dependency('Vulkan', method: 'pkg-config', required: false) if dep.found() assert(dep.type_name() == 'pkgconfig') dep.get_pkgconfig_variable('prefix') endif dep = dependency('pcap', method: 'pkg-config', required: false) if dep.found() assert(dep.type_name() == 'pkgconfig') dep.get_pkgconfig_variable('prefix') endif # dep = dependency('pcap', method: 'config-tool', required: false) # if dep.found() # assert(dep.type_name() == 'config-tool') # dep.get_configtool_variable('prefix') # endif dep = dependency('cups', method: 'pkg-config', required: false) if dep.found() assert(dep.type_name() == 'pkgconfig') dep.get_pkgconfig_variable('prefix') endif # dep = dependency('cups', method: 'config-tool', required: false) # if dep.found() # assert(dep.type_name() == 'config-tool') # dep.get_configtool_variable('prefix') # endif dep = dependency('libwmf', method: 'pkg-config', required: false) if dep.found() assert(dep.type_name() == 'pkgconfig') dep.get_pkgconfig_variable('prefix') endif # dep = dependency('libwmf', method: 'config-tool', required: false) # if dep.found() # assert(dep.type_name() == 'config-tool') # dep.get_configtool_variable('prefix') # endif # dep = dependency('boost', method: 'system', required: false) # if dep.found() # assert(dep.type_name() == 'system') # endif muon-v0.4.0/subprojects/meson-tests/common/237 fstrings/0002755000175000017500000000000014751453622022121 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/237 fstrings/meson.build0000644000175000017500000000022614751453622024261 0ustar buildbuildproject('meson-test') n = 10 m = 'bar' s = f'test @n@ string (@@n@@): @m@' assert(s == 'test 10 string (@10@): bar', 'Incorrect string formatting') muon-v0.4.0/subprojects/meson-tests/common/128 build by default targets in tests/0002755000175000017500000000000014751453622026524 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/128 build by default targets in tests/write_file.py0000644000175000017500000000013214751453622031221 0ustar buildbuild#!/usr/bin/env python3 import sys with open(sys.argv[1], 'w') as f: f.write('Test') muon-v0.4.0/subprojects/meson-tests/common/128 build by default targets in tests/main.c0000644000175000017500000000003714751453622027612 0ustar buildbuildint main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/128 build by default targets in tests/meson.build0000644000175000017500000000163314751453622030667 0ustar buildbuildproject('unit-test', 'c', version: '1.0') write_file = find_program('write_file.py') # A test that consumes and verifies the output generated by a custom target. # Should work even if target is not built by default. Makes sure that foo.out # is actually created before the test command that uses foo_out is run. foo_out = custom_target('foo.out', output: 'foo.out', command: [write_file, '@OUTPUT@']) # Also verify that a build_by_default : false BuildTarget added to a test is # built before the test is run. exe_out = executable('out', 'main.c', build_by_default: false) py_file_exists = '''import os, sys if not os.path.exists(sys.argv[1]) or not os.path.exists(sys.argv[2]): print("could not find {!r} or {!r} in {!r}" "".format(sys.argv[1], sys.argv[2], os.getcwd())) sys.exit(1)''' python = import('python3').find_python() test('output-check', python, args: ['-c', py_file_exists, foo_out, exe_out]) muon-v0.4.0/subprojects/meson-tests/common/62 string arithmetic/0002755000175000017500000000000014751453622023616 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/62 string arithmetic/meson.build0000644000175000017500000000223214751453622025755 0ustar buildbuildproject('string arithmetic', meson_version: '>=0.62.0') assert('foo' + 'bar' == 'foobar') assert('foo' + 'bar' + 'baz' == 'foobarbaz') a = 'a' b = 'b' assert(a + b + 'c' == 'abc') # ------------------------------------------------------------------------------ # format strings: # ------------------------------------------------------------------------------ sub1 = 'the' sub2 = ' quick\n' sub3 = ' brown' sub4 = '\nfox' x = f'@sub1@@sub2@@sub3@@sub4@' assert(x == sub1 + sub2 + sub3 + sub4) assert(x == 'the quick\n brown\nfox') # ------------------------------------------------------------------------------ # multi-line format strings # ------------------------------------------------------------------------------ y_actual = f'''This is a multi-line comment with string substitution: "@sub1@@sub2@@sub3@@sub4@" And I can even substitute the entry multiple times! @sub1@ @sub2@ @sub3@ ''' y_expect = '''This is a multi-line comment with string substitution: "the quick brown fox" And I can even substitute the entry multiple times! the quick brown ''' message('actual=' + y_actual) message('expect=' + y_expect) assert(y_actual == y_expect) muon-v0.4.0/subprojects/meson-tests/common/62 string arithmetic/test.json0000644000175000017500000000032014751453622025461 0ustar buildbuild{ "stdout": [ { "line": "test cases/common/62 string arithmetic/meson.build:25: WARNING: Project targets '>=0.62.0' but uses feature introduced in '0.63.0': multiline format strings." } ] } muon-v0.4.0/subprojects/meson-tests/common/159 array option/0002755000175000017500000000000014751453622022674 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/159 array option/meson_options.txt0000644000175000017500000000122014751453622026322 0ustar buildbuild# Copyright © 2017 Intel Corporation # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. option( 'array', type: 'array', choices: ['foo', 'bar'], ) muon-v0.4.0/subprojects/meson-tests/common/159 array option/meson.build0000644000175000017500000000132714751453622025037 0ustar buildbuild# Copyright © 2017 Intel Corporation # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. project('array default options') assert( get_option('array') == ['foo', 'bar'], 'Default value for array is not equal to choices', ) muon-v0.4.0/subprojects/meson-tests/common/141 special characters/0002755000175000017500000000000014751453622023774 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/141 special characters/arg-string-test.c0000644000175000017500000000051114751453622027165 0ustar buildbuild#include #include #include int main(int argc, char **argv) { const char *s = CHAR; assert(argc == 2); assert(strlen(s) == 1); if (s[0] != argv[1][0]) fprintf(stderr, "Expected %x, got %x\n", (unsigned int) s[0], (unsigned int) argv[1][0]); assert(s[0] == argv[1][0]); return 0; } muon-v0.4.0/subprojects/meson-tests/common/141 special characters/arg-unquoted-test.c0000644000175000017500000000075114751453622027531 0ustar buildbuild#include #include #include #define Q(x) #x #define QUOTE(x) Q(x) int main(int argc, char **argv) { const char *s = QUOTE(CHAR); assert(argc == 2); assert(strlen(s) == 1); if (s[0] != argv[1][0]) fprintf(stderr, "Expected %x, got %x\n", (unsigned int) s[0], (unsigned int) argv[1][0]); assert(s[0] == argv[1][0]); // There is no way to convert a macro argument into a character constant. // Otherwise we'd test that as well return 0; } muon-v0.4.0/subprojects/meson-tests/common/141 special characters/arg-char-test.c0000644000175000017500000000041314751453622026575 0ustar buildbuild#include #include int main(int argc, char **argv) { char c = CHAR; assert(argc == 2); if (c != argv[1][0]) fprintf(stderr, "Expected %x, got %x\n", (unsigned int) c, (unsigned int) argv[1][0]); assert(c == argv[1][0]); return 0; } muon-v0.4.0/subprojects/meson-tests/common/141 special characters/check_quoting.py0000644000175000017500000000124514751453622027171 0ustar buildbuild#!/usr/bin/env python3 import sys expected = { 'newline': '\n', 'dollar': '$', 'colon': ':', 'space': ' ', 'multi1': ' ::$$ ::$$', # in the meson test this is: # 'multi2': ' ::$$\n\n \n\n::$$', # but muon fmt fmt'd away the spaces :) 'multi2': ' ::$$\n\n\n\n::$$', } output = None for arg in sys.argv[1:]: try: name, value = arg.split('=', 1) except ValueError: output = arg continue if expected[name] != value: raise RuntimeError('{!r} is {!r} but should be {!r}'.format(name, value, expected[name])) if output is not None: with open(output, 'w') as f: f.write('Success!') muon-v0.4.0/subprojects/meson-tests/common/141 special characters/meson.build0000644000175000017500000000430214751453622026133 0ustar buildbuildproject('ninja special characters', 'c') python = import('python3').find_python() # Without newlines, this should appear directly in build.ninja. gen = custom_target( 'gen', command: [ python, files('check_quoting.py'), 'dollar=$', 'colon=:', 'space= ', '''multi1= ::$$ ::$$''', '@OUTPUT@', ], output: 'result', install: true, install_dir: get_option('datadir'), ) # With newlines, this should go through the exe wrapper. gen2 = custom_target( 'gen2', command: [ python, files('check_quoting.py'), '''newline= ''', 'dollar=$', 'colon=:', 'space= ', '''multi2= ::$$ ::$$''', '@OUTPUT@', ], output: 'result2', install: true, install_dir: get_option('datadir'), ) # Test that we can pass these special characters in compiler arguments # # (this part of the test is crafted so we don't try to use these special # characters in filenames or target names) # # TODO: similar tests needed for languages other than C # TODO: add similar test for quote, doublequote, and hash, carefully # Re hash, see # https://docs.microsoft.com/en-us/cpp/build/reference/d-preprocessor-definitions special = [ ['amp', '&'], ['at', '@'], # different from meson: apparently meson automatically converts a single # backslash into a double backslash. Figure out what the mechanism is that # does this and see if is reasonable to put into muon. For now, just use a # double backslash ['backslash', '\\\\'], ['dollar', '$'], ['gt', '>'], ['lt', '<'], ['slash', '/'], ] cc = meson.get_compiler('c') foreach s : special args = '-DCHAR="@0@"'.format(s[1]) e = executable('arg-string-' + s[0], 'arg-string-test.c', c_args: args) test('arg-string-' + s[0], e, args: s[1]) args = '-DCHAR=@0@'.format(s[1]) e = executable('arg-unquoted-' + s[0], 'arg-unquoted-test.c', c_args: args) test('arg-unquoted-' + s[0], e, args: s[1]) endforeach foreach s : special args = '-DCHAR=\'@0@\''.format(s[1]) e = executable('arg-char-' + s[0], 'arg-char-test.c', c_args: args) test('arg-char-' + s[0], e, args: s[1]) endforeach muon-v0.4.0/subprojects/meson-tests/common/141 special characters/test.json0000644000175000017500000000017514751453622025647 0ustar buildbuild{ "installed": [ {"type": "file", "file": "usr/share/result"}, {"type": "file", "file": "usr/share/result2"} ] } muon-v0.4.0/subprojects/meson-tests/common/141 special characters/.editorconfig0000644000175000017500000000005714751453622026451 0ustar buildbuild[meson.build] trim_trailing_whitespace = false muon-v0.4.0/subprojects/meson-tests/common/1 trivial/0002755000175000017500000000000014751453622021561 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/1 trivial/trivial.c0000644000175000017500000000013614751453622023375 0ustar buildbuild#include int main(void) { printf("Trivial test is working.\n"); return 0; } muon-v0.4.0/subprojects/meson-tests/common/1 trivial/meson.build0000644000175000017500000000154414751453622023725 0ustar buildbuild# Comment on the first line project( 'trivial test', # Comment inside a function call + array for language list ['c'], default_options: ['buildtype=debug'], meson_version: '>=0.52.0', ) #this is a comment sources = 'trivial.c' cc = meson.get_compiler('c') if cc.get_id() == 'intel' # Error out if the -std=xxx option is incorrect add_project_arguments('-diag-error', '10159', language: 'c') elif cc.get_id() == 'intel-cl' add_project_arguments('/Qdiag-error:10159', language: 'c') endif exe = executable('trivialprog', sources: sources) assert(exe.name() == 'trivialprog') test('runtest', exe) # This is a comment has_not_changed = false if is_disabler(exe) has_not_changed = true else has_not_changed = true endif assert(has_not_changed, 'Executable has changed.') assert(not is_disabler(exe), 'Executable is a disabler.') muon-v0.4.0/subprojects/meson-tests/common/6 linkshared/0002755000175000017500000000000014751453622022240 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/6 linkshared/cppmain.cpp0000644000175000017500000000010414751453622024364 0ustar buildbuild#include "cpplib.h" int main(void) { return cppfunc() != 42; } muon-v0.4.0/subprojects/meson-tests/common/6 linkshared/libfile.c0000644000175000017500000000052114751453622024006 0ustar buildbuild#if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllexport) #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif int DLL_PUBLIC func(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/6 linkshared/main.c0000644000175000017500000000027114751453622023326 0ustar buildbuild#if defined _WIN32 || defined __CYGWIN__ #define DLL_IMPORT __declspec(dllimport) #else #define DLL_IMPORT #endif int DLL_IMPORT func(void); int main(void) { return func(); } muon-v0.4.0/subprojects/meson-tests/common/6 linkshared/meson.build0000644000175000017500000000076114751453622024404 0ustar buildbuildproject('shared library linking test', 'c', 'cpp') lib = shared_library( 'mylib', 'libfile.c', # Split to different lines before and after the comma to test parser. install: false, ) # Don't install libraries in common tests; the path is platform-specific exe = executable('prog', 'main.c', link_with: lib, install: true) test('runtest', exe) cpplib = shared_library('mycpplib', 'cpplib.cpp') cppexe = executable('cppprog', 'cppmain.cpp', link_with: cpplib) test('cpptest', cppexe) muon-v0.4.0/subprojects/meson-tests/common/6 linkshared/cpplib.cpp0000644000175000017500000000013214751453622024207 0ustar buildbuild#define BUILDING_DLL #include "cpplib.h" int DLL_PUBLIC cppfunc(void) { return 42; } muon-v0.4.0/subprojects/meson-tests/common/6 linkshared/test.json0000644000175000017500000000016614751453622024113 0ustar buildbuild{ "installed": [ { "type": "exe", "file": "usr/bin/prog" }, { "type": "pdb", "file": "usr/bin/prog" } ] } muon-v0.4.0/subprojects/meson-tests/common/6 linkshared/cpplib.h0000644000175000017500000000056514751453622023666 0ustar buildbuild/* See http://gcc.gnu.org/wiki/Visibility#How_to_use_the_new_C.2B-.2B-_visibility_support */ #if defined(_WIN32) || defined(__CYGWIN__) #ifdef BUILDING_DLL #define DLL_PUBLIC __declspec(dllexport) #else #define DLL_PUBLIC __declspec(dllimport) #endif #else #define DLL_PUBLIC __attribute__ ((visibility ("default"))) #endif int DLL_PUBLIC cppfunc(void); muon-v0.4.0/subprojects/meson-tests/common/232 dependency allow_fallback/0002755000175000017500000000000014751453622025311 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/232 dependency allow_fallback/subprojects/0002755000175000017500000000000014751453622027654 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/232 dependency allow_fallback/subprojects/foob3/0002755000175000017500000000000014751453622030664 5ustar buildbuild././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/232 dependency allow_fallback/subprojects/foob3/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/232 dependency allow_fallback/subprojects/foob3/meson.bui0000644000175000017500000000010714751453622032502 0ustar buildbuildproject('foob3', 'c') # Note that there is no override_dependency here muon-v0.4.0/subprojects/meson-tests/common/232 dependency allow_fallback/subprojects/foob/0002755000175000017500000000000014751453622030601 5ustar buildbuild././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/232 dependency allow_fallback/subprojects/foob/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/232 dependency allow_fallback/subprojects/foob/meson.buil0000644000175000017500000000011514751453622032572 0ustar buildbuildproject('foob', 'c') meson.override_dependency('foob', declare_dependency()) muon-v0.4.0/subprojects/meson-tests/common/232 dependency allow_fallback/meson.build0000644000175000017500000000065014751453622027452 0ustar buildbuildproject('subproject fallback') foob_dep = dependency('foob', allow_fallback: true, required: false) assert(foob_dep.found()) # Careful! Once a submodule has been triggered and it has # overridden the dependency, it sticks. foob_dep = dependency('foob', allow_fallback: false, required: false) assert(foob_dep.found()) foob3_dep = dependency('foob3', allow_fallback: false, required: false) assert(not foob3_dep.found()) muon-v0.4.0/subprojects/meson-tests/common/115 subproject project arguments/0002755000175000017500000000000014751453622026052 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/115 subproject project arguments/subprojects/0002755000175000017500000000000014751453622030415 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/115 subproject project arguments/subprojects/subexe/0002755000175000017500000000000014751453622031710 5ustar buildbuild././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/115 subproject project arguments/subprojects/subexe/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/115 subproject project arguments/subprojects/subexe/meson0000644000175000017500000000063314751453622032754 0ustar buildbuildproject( 'subproject', 'c', version: '1.0.0', license: ['sublicense1', 'sublicense2'], ) if not meson.is_subproject() error('Claimed to be master project even though we are a subproject.') endif assert(meson.project_name() == 'subproject', 'Incorrect subproject name') add_project_arguments('-DSUBPROJECT_OPTION', language: 'c') e = executable('subexe', 'subexe.c') test('subexetest', e) ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/115 subproject project arguments/subprojects/subexe/subexe.cmuon-v0.4.0/subprojects/meson-tests/common/115 subproject project arguments/subprojects/subexe/subex0000644000175000017500000000041114751453622032753 0ustar buildbuild#ifdef PROJECT_OPTION #error #endif #ifdef PROJECT_OPTION_1 #error #endif #ifdef PROJECT_OPTION_C_CPP #error #endif #ifndef GLOBAL_ARGUMENT #error #endif #ifndef SUBPROJECT_OPTION #error #endif #ifdef OPTION_CPP #error #endif int main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/115 subproject project arguments/exe.cpp0000644000175000017500000000042114751453622027332 0ustar buildbuild#ifdef PROJECT_OPTION #error #endif #ifdef PROJECT_OPTION_1 #error #endif #ifdef GLOBAL_ARGUMENT #error #endif #ifdef SUBPROJECT_OPTION #error #endif #ifndef PROJECT_OPTION_CPP #error #endif #ifndef PROJECT_OPTION_C_CPP #error #endif int main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/115 subproject project arguments/meson.build0000644000175000017500000000107614751453622030216 0ustar buildbuildproject( 'project options tester', 'c', 'cpp', version: '2.3.4', license: 'mylicense', ) add_global_arguments('-DGLOBAL_ARGUMENT', language: 'c') add_project_arguments('-DPROJECT_OPTION', language: 'c') add_project_arguments('-DPROJECT_OPTION_CPP', language: 'cpp') add_project_arguments('-DPROJECT_OPTION_C_CPP', language: ['c', 'cpp']) sub = subproject('subexe', version: '1.0.0') add_project_arguments('-DPROJECT_OPTION_1', language: 'c') e = executable('exe', 'exe.c') e = executable('execpp', 'exe.cpp') test('exetest', e) test('execpptest', e) muon-v0.4.0/subprojects/meson-tests/common/115 subproject project arguments/exe.c0000644000175000017500000000041314751453622026773 0ustar buildbuild#ifndef PROJECT_OPTION #error #endif #ifndef PROJECT_OPTION_1 #error #endif #ifndef GLOBAL_ARGUMENT #error #endif #ifdef SUBPROJECT_OPTION #error #endif #ifdef OPTION_CPP #error #endif #ifndef PROJECT_OPTION_C_CPP #error #endif int main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/10 man install/0002755000175000017500000000000014751453622022371 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/10 man install/bar.20000644000175000017500000000007014751453622023213 0ustar buildbuildthis is a man page of bar.2, its contents are irrelevantmuon-v0.4.0/subprojects/meson-tests/common/10 man install/meson.build0000644000175000017500000000047514751453622024537 0ustar buildbuildproject('man install') install_man('foo.1') install_man('bar.2') install_man('foo.fr.1', locale: 'fr') install_man('vanishing/vanishing.2') subdir('vanishing') cdata = configuration_data() cdata.set('TODAY', '$this_day') b1 = configure_file(input: 'baz.1.in', output: 'baz.1', configuration: cdata) install_man(b1) muon-v0.4.0/subprojects/meson-tests/common/10 man install/baz.1.in0000644000175000017500000000041414751453622023631 0ustar buildbuildThis is a man page of baz.1 it was generated @TODAY@. You should not put generation timestamps in real world projects because they break reproducible builds. This manpage is written by professionals or under the supervision of professionals. Do not try this at home. muon-v0.4.0/subprojects/meson-tests/common/10 man install/test.json0000644000175000017500000000064414751453622024245 0ustar buildbuild{ "installed": [ { "type": "file", "file": "usr/share/man/man1/foo.1" }, { "type": "file", "file": "usr/share/man/fr/man1/foo.1" }, { "type": "file", "file": "usr/share/man/man2/bar.2" }, { "type": "file", "file": "usr/share/man/man1/vanishing.1" }, { "type": "file", "file": "usr/share/man/man2/vanishing.2" }, { "type": "file", "file": "usr/share/man/man1/baz.1" } ] } muon-v0.4.0/subprojects/meson-tests/common/10 man install/vanishing/0002755000175000017500000000000014751453622024357 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/10 man install/vanishing/vanishing.20000644000175000017500000000007114751453622026424 0ustar buildbuildThis is a second man page of the vanishing subdirectory. muon-v0.4.0/subprojects/meson-tests/common/10 man install/vanishing/vanishing.10000644000175000017500000000006214751453622026423 0ustar buildbuildThis is a man page of the vanishing subdirectory. muon-v0.4.0/subprojects/meson-tests/common/10 man install/vanishing/meson.build0000644000175000017500000000003314751453622026513 0ustar buildbuildinstall_man('vanishing.1') muon-v0.4.0/subprojects/meson-tests/common/10 man install/foo.fr.10000644000175000017500000000007014751453622023637 0ustar buildbuildthis is a man page of foo.1 its contents are irrelevant muon-v0.4.0/subprojects/meson-tests/common/10 man install/foo.10000644000175000017500000000007014751453622023231 0ustar buildbuildthis is a man page of foo.1 its contents are irrelevant muon-v0.4.0/subprojects/meson-tests/common/124 dependency file generation/0002755000175000017500000000000014751453622025407 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/124 dependency file generation/meson.build0000644000175000017500000000112414751453622027545 0ustar buildbuildproject('dep file gen', 'c') cc_id = meson.get_compiler('c').get_id() cc_ver = meson.get_compiler('c').version() if cc_id == 'intel' or (cc_id == 'lcc' and cc_ver.version_compare('<=1.23.08')) # ICC and LCC <= 1.23.08 do not escape spaces in paths in the dependency file, so Ninja # (correctly) thinks that the rule has multiple outputs and errors out: # 'depfile has multiple output paths' error( 'MESON_SKIP_TEST: Skipping test because your compiler is known to generate broken dependency files', ) endif e = executable('main file', 'main .c') test('test it', e) muon-v0.4.0/subprojects/meson-tests/common/124 dependency file generation/main .c0000644000175000017500000000003714751453622026535 0ustar buildbuildint main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/259 preprocess/0002755000175000017500000000000014751453622022453 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/259 preprocess/math.c0000644000175000017500000000023114751453622023542 0ustar buildbuild// Verify we preprocess as C language, otherwise including math.h would fail. // See https://github.com/mesonbuild/meson/issues/11940. #include muon-v0.4.0/subprojects/meson-tests/common/259 preprocess/bar.c0000644000175000017500000000006114751453622023356 0ustar buildbuildint @BAR@(void) { return BAR + PLOP + BAZ; } muon-v0.4.0/subprojects/meson-tests/common/259 preprocess/meson.build0000644000175000017500000000157014751453622024616 0ustar buildbuildproject('preprocess', 'c') cc = meson.get_compiler('c') add_project_arguments(['-DFOO=0', '-DBAR=0'], language: 'c') # works with either python2 or python3 python = find_program('python', 'python3') fs = import('fs') bar_content = fs.read('bar.c') bar_x = custom_target( input: 'bar.c', output: 'bar.x', command: [ python, '-c', '''import sys;print(sys.argv[1].replace('@BAR@', 'bar'))''', bar_content, ], capture: true, ) foo_h = import('fs').copyfile('foo.x', 'foo.h') dep = declare_dependency(compile_args: '-DPLOP=0') pp_files = cc.preprocess( 'foo.c', bar_x, 'math.c', output: '@PLAINNAME@.c', dependencies: dep, depends: foo_h, compile_args: ['-DBAZ=0'], ) foreach f : pp_files message(f.full_path()) endforeach subdir('src') test('test-foo', executable('app', pp_files, link_depends: file_map)) muon-v0.4.0/subprojects/meson-tests/common/259 preprocess/foo.x0000644000175000017500000000006614751453622023427 0ustar buildbuildint bar(void); int main(void) { return FOO + bar(); } muon-v0.4.0/subprojects/meson-tests/common/259 preprocess/foo.c0000644000175000017500000000002114751453622023371 0ustar buildbuild#include muon-v0.4.0/subprojects/meson-tests/common/259 preprocess/foo.h0000644000175000017500000000006614751453622023407 0ustar buildbuildint bar(void); int main(void) { return FOO + bar(); } muon-v0.4.0/subprojects/meson-tests/common/259 preprocess/src/0002755000175000017500000000000014751453622023242 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/259 preprocess/src/meson.build0000644000175000017500000000011114751453622025373 0ustar buildbuildfile_map = cc.preprocess( 'file.map.in', output: '@BASENAME@', ) muon-v0.4.0/subprojects/meson-tests/common/259 preprocess/src/file.map.in0000644000175000017500000000003114751453622025255 0ustar buildbuild#if 1 Hello World #endif muon-v0.4.0/subprojects/meson-tests/common/258 subsubproject inplace/0002755000175000017500000000000014751453622024553 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/258 subsubproject inplace/subprojects/0002755000175000017500000000000014751453622027116 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/258 subsubproject inplace/subprojects/sub/0002755000175000017500000000000014751453622027707 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/258 subsubproject inplace/subprojects/sub/subprojects/0002755000175000017500000000000014751453622032252 5ustar buildbuild././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/258 subsubproject inplace/subprojects/sub/subprojects/subsub-1.0/muon-v0.4.0/subprojects/meson-tests/common/258 subsubproject inplace/subprojects/sub/subprojects/sub0002755000175000017500000000000014751453622032764 5ustar buildbuild././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/258 subsubproject inplace/subprojects/sub/subprojects/subsub-1.0/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/258 subsubproject inplace/subprojects/sub/subprojects/sub0000644000175000017500000000002214751453622032756 0ustar buildbuildproject('subsub') ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/258 subsubproject inplace/subprojects/sub/subprojects/subsub.wrapmuon-v0.4.0/subprojects/meson-tests/common/258 subsubproject inplace/subprojects/sub/subprojects/sub0000644000175000017500000000004314751453622032761 0ustar buildbuild[wrap-file] directory = subsub-1.0 muon-v0.4.0/subprojects/meson-tests/common/258 subsubproject inplace/subprojects/sub/meson.build0000644000175000017500000000004514751453622032046 0ustar buildbuildproject('sub') subproject('subsub') muon-v0.4.0/subprojects/meson-tests/common/258 subsubproject inplace/meson.build0000644000175000017500000000004314751453622026710 0ustar buildbuildproject('main') subproject('sub') muon-v0.4.0/subprojects/meson-tests/common/195 generator in subdir/0002755000175000017500000000000014751453622024113 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/195 generator in subdir/meson.build0000644000175000017500000000007614751453622026256 0ustar buildbuildproject('generator in subdir', 'c') subdir('com/mesonbuild') muon-v0.4.0/subprojects/meson-tests/common/195 generator in subdir/com/0002755000175000017500000000000014751453622024671 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/195 generator in subdir/com/mesonbuild/0002755000175000017500000000000014751453622027032 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/195 generator in subdir/com/mesonbuild/subbie.inp0000644000175000017500000000000714751453622031006 0ustar buildbuildsubbie muon-v0.4.0/subprojects/meson-tests/common/195 generator in subdir/com/mesonbuild/testprog.c0000644000175000017500000000007414751453622031044 0ustar buildbuild#include"subbie.h" int main(void) { return subbie(); } muon-v0.4.0/subprojects/meson-tests/common/195 generator in subdir/com/mesonbuild/meson.build0000644000175000017500000000050014751453622031165 0ustar buildbuildgprog = find_program('tooldir/genprog.py') gen = generator( gprog, output: ['@BASENAME@.c', '@BASENAME@.h'], arguments: ['--searchdir=@CURRENT_SOURCE_DIR@', '--outdir=@BUILD_DIR@', '@INPUT@'], ) generated = gen.process('subbie.inp') e = executable('testprog', 'testprog.c', generated) test('testprog', e) muon-v0.4.0/subprojects/meson-tests/common/195 generator in subdir/com/mesonbuild/tooldir/0002755000175000017500000000000014751453622030506 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/195 generator in subdir/com/mesonbuild/tooldir/genprog.py0000644000175000017500000000225414751453622032522 0ustar buildbuild#!/usr/bin/env python3 import os, sys, argparse h_templ = '''#pragma once int %s(void); ''' c_templ = '''#include"%s.h" int %s(void) { return 0; } ''' parser = argparse.ArgumentParser() parser.add_argument('--searchdir', required=True) parser.add_argument('--outdir', required=True) parser.add_argument('ifiles', nargs='+') options = parser.parse_args() searchdir = options.searchdir outdir = options.outdir ifiles = options.ifiles rel_ofiles = [] for ifile in ifiles: if not ifile.startswith(options.searchdir): sys.exit(f'Input file {ifile} does not start with search dir {searchdir}.') rel_ofile = ifile[len(searchdir):] if rel_ofile[0] == '/' or rel_ofile[0] == '\\': rel_ofile = rel_ofile[1:] rel_ofiles.append(os.path.splitext(rel_ofile)[0]) ofile_bases = [os.path.join(outdir, i) for i in rel_ofiles] for i, ifile_name in enumerate(ifiles): proto_name = open(ifile_name).readline().strip() h_out = ofile_bases[i] + '.h' c_out = ofile_bases[i] + '.c' os.makedirs(os.path.split(ofile_bases[i])[0], exist_ok=True) open(h_out, 'w').write(h_templ % (proto_name)) open(c_out, 'w').write(c_templ % (proto_name, proto_name)) muon-v0.4.0/subprojects/meson-tests/common/106 multiple dir configure file/0002755000175000017500000000000014751453622025511 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/106 multiple dir configure file/subdir/0002755000175000017500000000000014751453622027001 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/106 multiple dir configure file/subdir/foo.txt0000644000175000017500000000000014751453622030311 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/106 multiple dir configure file/subdir/meson.build0000644000175000017500000000043114751453622031137 0ustar buildbuildconfigure_file(input: 'someinput.in', output: 'outputsubdir', install: false, copy: true) py3 = import('python3').find_python() cfile1 = configure_file( input: 'foo.txt', output: 'foo.h.in', capture: true, command: [py3, '-c', 'print("#mesondefine FOO_BAR")'], ) muon-v0.4.0/subprojects/meson-tests/common/106 multiple dir configure file/subdir/someinput.in0000644000175000017500000000000014751453622031340 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/106 multiple dir configure file/meson.build0000644000175000017500000000031214751453622027645 0ustar buildbuildproject('multiple dir configure file') subdir('subdir') configure_file(input: 'subdir/someinput.in', output: 'outputhere', copy: true) configure_file(input: cfile1, output: '@BASENAME@', copy: true) muon-v0.4.0/subprojects/meson-tests/common/170 generator link whole/0002755000175000017500000000000014751453622024261 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/170 generator link whole/pull_meson_test_function.c0000644000175000017500000000020114751453622031535 0ustar buildbuild#include "export.h" #include "meson_test_function.h" int DLL_PUBLIC function_puller(void) { return meson_test_function(); } muon-v0.4.0/subprojects/meson-tests/common/170 generator link whole/meson_test_function.tmpl0000644000175000017500000000000014751453622031230 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/170 generator link whole/main.c0000644000175000017500000000030514751453622025345 0ustar buildbuild#include "meson_test_function.h" #include int main(void) { if (meson_test_function() != 19) { printf("Bad meson_test_function()\n"); return 1; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/170 generator link whole/meson.build0000644000175000017500000000433214751453622026423 0ustar buildbuildproject('generator link_whole', 'c') if meson.backend() == 'xcode' error( 'MESON_SKIP_TEST: whole-archive not supported in Xcode. Patches welcome.', ) endif # This just generates foo.h and foo.c with int foo() defined. gen_py = find_program('generator.py') gen = generator( gen_py, output: ['@BASENAME@.h', '@BASENAME@.c'], arguments: ['@INPUT@', '@BUILD_DIR@'], ) # Test 1: link directly into executable srcs = gen.process('meson_test_function.tmpl') exe = executable('exe1', [srcs, 'main.c'], c_args: '-DBUILDING_EMBEDDED') test('test1', exe) # Test 2: link into shared library and access from executable srcs = gen.process('meson_test_function.tmpl') shlib2 = shared_library('shlib2', [srcs], c_args: '-DBUILDING_DLL') exe = executable( 'exe2', 'main.c', link_with: shlib2, include_directories: shlib2.private_dir_include(), ) test('test2', exe) # Test 3: link into static library and access from executable srcs = gen.process('meson_test_function.tmpl') stlib3 = static_library('stlib3', [srcs], c_args: '-DBUILDING_EMBEDDED') exe = executable( 'exe3', 'main.c', c_args: '-DBUILDING_EMBEDDED', link_with: stlib3, include_directories: stlib3.private_dir_include(), ) test('test3', exe) # Test 4: link into static library, link into shared # and access from executable. To make sure static_library # is not dropped use pull_meson_test_function helper. srcs = gen.process('meson_test_function.tmpl') stlib4 = static_library('stlib4', [srcs], c_args: '-DBUILDING_DLL') shlib4 = shared_library( 'shlib4', 'pull_meson_test_function.c', c_args: '-DBUILDING_DLL', link_with: stlib4, include_directories: stlib4.private_dir_include(), ) exe = executable( 'exe4', 'main.c', link_with: shlib4, include_directories: stlib4.private_dir_include(), ) test('test4', exe) # Test 5: link into static library, link_whole into shared # and access from executable srcs = gen.process('meson_test_function.tmpl') stlib5 = static_library('stlib5', [srcs], c_args: '-DBUILDING_DLL') shlib5 = shared_library('shlib5', link_whole: stlib5) exe = executable( 'exe5', 'main.c', link_with: shlib5, include_directories: stlib5.private_dir_include(), ) test('test5', exe) muon-v0.4.0/subprojects/meson-tests/common/170 generator link whole/generator.py0000755000175000017500000000115414751453622026623 0ustar buildbuild#!/usr/bin/env python3 import os import os.path import sys def main(): name = os.path.splitext(os.path.basename(sys.argv[1]))[0] out = sys.argv[2] hname = os.path.join(out, name + '.h') cname = os.path.join(out, name + '.c') print(os.getcwd(), hname) with open(hname, 'w') as hfile: hfile.write(''' #pragma once #include "export.h" int DLL_PUBLIC {name}(void); '''.format(name=name)) with open(cname, 'w') as cfile: cfile.write(''' #include "{name}.h" int {name}(void) {{ return {size}; }} '''.format(name=name, size=len(name))) if __name__ == '__main__': main() muon-v0.4.0/subprojects/meson-tests/common/170 generator link whole/export.h0000644000175000017500000000070214751453622025750 0ustar buildbuild#pragma once #if defined BUILDING_EMBEDDED #define DLL_PUBLIC #elif defined _WIN32 || defined __CYGWIN__ #if defined BUILDING_DLL #define DLL_PUBLIC __declspec(dllexport) #else #define DLL_PUBLIC __declspec(dllimport) #endif #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif muon-v0.4.0/subprojects/meson-tests/common/151 duplicate source names/0002755000175000017500000000000014751453622024574 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/151 duplicate source names/dir2/0002755000175000017500000000000014751453622025434 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/151 duplicate source names/dir2/file.c0000644000175000017500000000001714751453622026513 0ustar buildbuildint dir2 = 20; muon-v0.4.0/subprojects/meson-tests/common/151 duplicate source names/dir2/meson.build0000644000175000017500000000005214751453622027571 0ustar buildbuildsources += files('dir1/file.c', 'file.c') muon-v0.4.0/subprojects/meson-tests/common/151 duplicate source names/dir2/dir1/0002755000175000017500000000000014751453622026273 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/151 duplicate source names/dir2/dir1/file.c0000644000175000017500000000002414751453622027350 0ustar buildbuildint dir2_dir1 = 21; muon-v0.4.0/subprojects/meson-tests/common/151 duplicate source names/meson.build0000644000175000017500000000135614751453622026741 0ustar buildbuildproject('proj', 'c') if meson.backend() == 'xcode' # Xcode gives object files unique names but only if they would clash. For example # two files named lib.o instead get the following names: # # lib-4fbe522d8ba4cb1f1b89cc2df640a2336b92e1a5565f0a4c5a79b5b5e2969eb9.o # lib-4fbe522d8ba4cb1f1b89cc2df640a2336deeff2bc2297affaadbe20f5cbfee56.o # # No-one has reverse engineered the naming scheme so we would access them. # IF you feel up to the challenge, patches welcome. error( 'MESON_SKIP_TEST, Xcode cannot extract objs when they would have the same filename.', ) endif sources = [] subdir('dir1') subdir('dir2') subdir('dir3') executable('a.out', sources: sources, objects: lib.extract_all_objects()) muon-v0.4.0/subprojects/meson-tests/common/151 duplicate source names/dir3/0002755000175000017500000000000014751453622025435 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/151 duplicate source names/dir3/file.c0000644000175000017500000000001714751453622026514 0ustar buildbuildint dir3 = 30; muon-v0.4.0/subprojects/meson-tests/common/151 duplicate source names/dir3/meson.build0000644000175000017500000000006514751453622027576 0ustar buildbuildlib = static_library('lib', 'file.c', 'dir1/file.c') muon-v0.4.0/subprojects/meson-tests/common/151 duplicate source names/dir3/dir1/0002755000175000017500000000000014751453622026274 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/151 duplicate source names/dir3/dir1/file.c0000644000175000017500000000002414751453622027351 0ustar buildbuildint dir3_dir1 = 31; muon-v0.4.0/subprojects/meson-tests/common/151 duplicate source names/dir1/0002755000175000017500000000000014751453622025433 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/151 duplicate source names/dir1/file.c0000644000175000017500000000042214751453622026512 0ustar buildbuildextern int dir2; extern int dir2_dir1; extern int dir3; extern int dir3_dir1; int main(void) { if (dir2 != 20) return 1; if (dir2_dir1 != 21) return 1; if (dir3 != 30) return 1; if (dir3_dir1 != 31) return 1; return 0; } muon-v0.4.0/subprojects/meson-tests/common/151 duplicate source names/dir1/meson.build0000644000175000017500000000003314751453622027567 0ustar buildbuildsources += files('file.c') muon-v0.4.0/subprojects/meson-tests/common/269 configure file output format/0002755000175000017500000000000014751453622025742 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/269 configure file output format/compare.py0000644000175000017500000000026714751453622027745 0ustar buildbuildimport sys with open(sys.argv[1], 'r', encoding='utf-8') as f, open(sys.argv[2], 'r', encoding='utf-8') as g: if f.read() != g.read(): sys.exit('contents are not equal') muon-v0.4.0/subprojects/meson-tests/common/269 configure file output format/expected/0002755000175000017500000000000014751453622027543 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/269 configure file output format/expected/config.json0000644000175000017500000000012114751453622031673 0ustar buildbuild{"str":"\"hello world!\"","unquoted":"float","int":42,"bool":true,"false":false} muon-v0.4.0/subprojects/meson-tests/common/269 configure file output format/expected/config.nasm0000644000175000017500000000013314751453622031663 0ustar buildbuild%define str "hello world!" %define unquoted float %define int 42 %define bool %undef false muon-v0.4.0/subprojects/meson-tests/common/269 configure file output format/expected/config.h0000644000175000017500000000013314751453622031154 0ustar buildbuild#define str "hello world!" #define unquoted float #define int 42 #define bool #undef false muon-v0.4.0/subprojects/meson-tests/common/269 configure file output format/expected/config.mg0000644000175000017500000000023014751453622031326 0ustar buildbuild#ifndef CONFIG_MAGNESIUM_H #define CONFIG_MAGNESIUM_H #define str "hello world!" #define unquoted float #define int 42 #define bool #undef false #endif muon-v0.4.0/subprojects/meson-tests/common/269 configure file output format/meson.build0000644000175000017500000000251414751453622030104 0ustar buildbuildproject('configure file output format') data = configuration_data() data.set_quoted( 'str', 'hello world!', description: '''This is a multiline description''', ) data.set('unquoted', 'float') data.set( 'int', 42, description: 'ultimate question of life, the universe, and everything', ) data.set('bool', true) data.set('false', false) config_h = configure_file(configuration: data, output_format: 'c', output: 'config.h') config_nasm = configure_file(configuration: data, output_format: 'nasm', output: 'config.nasm') config_json = configure_file(configuration: data, output_format: 'json', output: 'config.json') config_mg = configure_file( configuration: data, macro_name: 'CONFIG_MAGNESIUM_H', output_format: 'c', output: 'config_mg.h', ) py = find_program('python3') compare_py = files('compare.py') expected_config_h = files('expected/config.h') expected_config_nasm = files('expected/config.nasm') expected_config_json = files('expected/config.json') expected_config_mg = files('expected/config.mg') test('c_output', py, args: [compare_py, expected_config_h, config_h]) test('nasm_output', py, args: [compare_py, expected_config_nasm, config_nasm]) test('json_output', py, args: [compare_py, expected_config_json, config_json]) test('c_mg_output', py, args: [compare_py, expected_config_mg, config_mg]) muon-v0.4.0/subprojects/meson-tests/common/71 ctarget dependency/0002755000175000017500000000000014751453622023726 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/71 ctarget dependency/gen2.py0000755000175000017500000000034414751453622025135 0ustar buildbuild#!/usr/bin/env python3 import sys, os from glob import glob files = glob(os.path.join(sys.argv[1], '*.tmp')) assert len(files) == 1 with open(files[0]) as ifile, open(sys.argv[2], 'w') as ofile: ofile.write(ifile.read()) muon-v0.4.0/subprojects/meson-tests/common/71 ctarget dependency/meson.build0000644000175000017500000000130414751453622026064 0ustar buildbuildproject('custom target dependency') # Sometimes custom targets do not take input files # but instead do globbing or some similar wackiness. # In this case we need to be able to specify a # manual dependency between two custom targets, # if one needs to be run before the other. g1 = find_program('gen1.py') g2 = find_program('gen2.py') c1 = custom_target( 'medput', input: 'input.dat', output: 'medput.tmp', command: [g1, '@INPUT@', '@OUTPUT@'], ) custom_target( 'output', output: 'output.dat', command: [g2, '@OUTDIR@', '@OUTPUT@'], depends: c1, ) custom_target( 'output2', output: 'output2.dat', command: [g2, '@OUTDIR@', '@OUTPUT@'], depends: c1[0], ) muon-v0.4.0/subprojects/meson-tests/common/71 ctarget dependency/input.dat0000644000175000017500000000003114751453622025547 0ustar buildbuildThis is a piece of text. muon-v0.4.0/subprojects/meson-tests/common/71 ctarget dependency/gen1.py0000755000175000017500000000035014751453622025131 0ustar buildbuild#!/usr/bin/env python3 import time, sys # Make sure other script runs first if dependency # is missing. time.sleep(0.5) with open(sys.argv[1]) as f: contents = f.read() with open(sys.argv[2], 'w') as f: f.write(contents) muon-v0.4.0/subprojects/meson-tests/common/158 disabler/0002755000175000017500000000000014751453622022051 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/158 disabler/meson.build0000644000175000017500000001133014751453622024207 0ustar buildbuildproject('dolphin option', 'c') d = disabler() full_path = d.full_path() assert(is_disabler(full_path), 'Method call is not a disabler') d2 = dependency(d) d3 = (d == d2) d4 = d + 0 d5 = d2 or true set_variable('d6', disabler()) has_not_changed = false if is_disabler(d) has_not_changed = true else has_not_changed = true endif assert(has_not_changed, 'Disabler has changed.') assert(is_disabler(d), 'Disabler was not identified correctly.') assert( is_disabler(d2), 'Function laundered disabler was not identified correctly.', ) assert(is_disabler(d3), 'Disabler comparison should yield disabler.') assert(is_disabler(d4), 'Disabler addition should yield disabler.') assert(is_disabler(d5), 'Disabler logic op should yield disabler.') assert( is_disabler(d6), 'set_variable with a disabler should set variable to disabler.', ) assert(d, 'Disabler did not cause this to be skipped.') assert(d2, 'Function laundered disabler did not cause this to be skipped.') assert( d3, 'Disabler comparison should yield disabler and thus this would not be called.', ) assert( d4, 'Disabler addition should yield disabler and thus this would not be called.', ) assert( d5, 'Disabler logic op should yield disabler and thus this would not be called.', ) assert(d6, 'set_variable with a disabler did not cause this to be skipped.') number = 0 if d number = 1 else number = 2 endif has_not_changed = false if is_disabler(number) has_not_changed = true else has_not_changed = true endif assert(has_not_changed, 'Number has changed.') assert(not is_disabler(number), 'Number should not be a disabler.') assert( number == 0, 'Plain if handled incorrectly, value should be 0 but is @0@'.format(number), ) if d.found() number = 1 else number = 2 endif assert( number == 2, 'If found handled incorrectly, value should be 2 but is @0@'.format(number), ) dep = dependency('notfounddep', required: false, disabler: true) app = executable('myapp', 'notfound.c', dependencies: [dep]) assert(is_disabler(app), 'App is not a disabler.') app = executable('myapp', 'notfound.c', dependencies: [[dep]]) assert(is_disabler(app), 'App is not a disabler.') cc = meson.get_compiler('c') dep = cc.find_library('notfounddep', required: false, disabler: true) app = executable('myapp', 'notfound.c', dependencies: [dep]) assert(is_disabler(app), 'App is not a disabler.') dep = find_program('donotfindme', required: false, disabler: true) app = executable('myapp', 'notfound.c', dependencies: [dep]) assert(is_disabler(app), 'App is not a disabler.') has_not_changed = false if is_disabler(app) has_not_changed = true else has_not_changed = true endif assert(has_not_changed, 'App has changed.') assert( not is_disabler(is_variable('d6')), 'is_variable should not return a disabler', ) assert(is_variable('d6'), 'is_variable for a disabler should return true') if_is_not_disabled = false if is_variable('d6') if_is_not_disabled = true else if_is_not_disabled = true endif assert(if_is_not_disabled, 'Disabler in is_variable should not skip blocks') get_d = get_variable('d6') assert(is_disabler(get_d), 'get_variable should yield a disabler') get_fallback_d = get_variable('nonexistent', disabler()) assert( is_disabler(get_fallback_d), 'get_variable fallback should yield a disabler', ) var_true = true get_no_fallback_d = get_variable('var_true', disabler()) assert( not is_disabler(get_no_fallback_d), 'get_variable should not fallback to disabler', ) assert(get_no_fallback_d, 'get_variable should yield true') assert( is_disabler(get_variable(disabler())), 'get_variable should yield a disabler', ) assert( is_disabler(get_variable(disabler(), var_true)), 'get_variable should yield a disabler', ) if_is_disabled = true if disabler() if_is_disabled = false else if_is_disabled = false endif assert(if_is_disabled, 'Disabler in "if condition" must skip both blocks') if not disabler() if_is_disabled = false else if_is_disabled = false endif assert(if_is_disabled, 'Disabler in "if not condition" must skip both blocks') if disabler() == 1 if_is_disabled = false else if_is_disabled = false endif assert(if_is_disabled, 'Disabler in "if a==b" must skip both blocks') loops = 0 disablers = 0 foreach i : [true, disabler(), true] loops += 1 if is_disabler(i) disablers += 1 endif endforeach assert(loops == 3, 'Disabler in foreach array') assert(disablers == 1, 'Disabler in foreach array') loops = 0 disablers = 0 foreach k, i : {'a': true, 'b': disabler(), 'c': true} loops += 1 if is_disabler(i) disablers += 1 endif endforeach assert(loops == 3, 'Disabler in foreach dict') assert(disablers == 1, 'Disabler in foreach dict') muon-v0.4.0/subprojects/meson-tests/common/183 partial dependency/0002755000175000017500000000000014751453622024015 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/183 partial dependency/meson.build0000644000175000017500000000122314751453622026153 0ustar buildbuild# Copyright © 2018 Intel Corporation # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. project('partial dependency', ['c', 'cpp']) subdir('declare_dependency') muon-v0.4.0/subprojects/meson-tests/common/183 partial dependency/declare_dependency/0002755000175000017500000000000014751453622027612 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/183 partial dependency/declare_dependency/main.c0000644000175000017500000000133314751453622030700 0ustar buildbuild/* Copyright © 2018 Intel Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "foo.h" int main(void) { int a = foo(); if (a == 1) { return 0; } else { return 1; } } muon-v0.4.0/subprojects/meson-tests/common/183 partial dependency/declare_dependency/meson.build0000644000175000017500000000171514751453622031756 0ustar buildbuild# Copyright © 2018 Intel Corporation # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. dec_sub_dep = declare_dependency( include_directories: include_directories('headers'), ) dec_dep = declare_dependency( sources: files('headers/foo.c'), dependencies: dec_sub_dep, ) sub_dep = dec_dep.partial_dependency(includes: true) dec_exe = executable( 'declare_dep', files('main.c', 'other.c'), dependencies: sub_dep, ) test('Declare Dependency', dec_exe) muon-v0.4.0/subprojects/meson-tests/common/183 partial dependency/declare_dependency/headers/0002755000175000017500000000000014751453622031225 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/183 partial dependency/declare_dependency/headers/foo.c0000644000175000017500000000121114751453622032145 0ustar buildbuild/* Copyright © 2018 Intel Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #error "Included C sources that shouldn't be." muon-v0.4.0/subprojects/meson-tests/common/183 partial dependency/declare_dependency/headers/foo.h0000644000175000017500000000115114751453622032155 0ustar buildbuild/* Copyright © 2018 Intel Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ int foo(void); muon-v0.4.0/subprojects/meson-tests/common/183 partial dependency/declare_dependency/other.c0000644000175000017500000000121414751453622031073 0ustar buildbuild/* Copyright © 2018 Intel Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "foo.h" int foo(void) { return 1; } muon-v0.4.0/subprojects/meson-tests/common/76 has type/0002755000175000017500000000000014751453622021720 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/76 has type/meson.build0000644000175000017500000000055714751453622024067 0ustar buildbuildproject('has type', 'c', 'cpp') compilers = [meson.get_compiler('c'), meson.get_compiler('cpp')] foreach cc : compilers if not cc.has_type('time_t', prefix: '#include') error('Did not detect type that exists.') endif if cc.has_type('no_time_t', prefix: '#include') error('Not existing type found.') endif endforeach muon-v0.4.0/subprojects/meson-tests/common/227 very long command line/0002755000175000017500000000000014751453622024475 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/227 very long command line/main.c0000644000175000017500000000003514751453622025561 0ustar buildbuildint main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/227 very long command line/meson.build0000644000175000017500000000336214751453622026641 0ustar buildbuildproject('very long command lines', 'c') # Get the current system's commandline length limit. if build_machine.system() == 'windows' # Various limits on windows: # cmd.exe: 8kb # CreateProcess: 32kb limit = 32767 # NOTE: filename limit is 260 characters unless # 1. Python >= 3.6 is being used # 2. Windows 10 registry has been edited to enable long pathnames # ninja backend uses absolute filenames, so we ensure they don't exceed 260. elif build_machine.system() == 'cygwin' # cygwin-to-win32: see above # cygwin-to-cygwin: no limit? # Cygwin is slow, so only test it lightly here. limit = 8192 else # ninja passes whole line as a single argument, for which # the limit is 128k as of Linux 2.6.23. See MAX_ARG_STRLEN. # BSD seems similar, see https://www.in-ulm.de/~mascheck/various/argmax limit = 131072 endif # Now exceed that limit, but not so far that the test takes too long. namelen = 260 nfiles = 50 + limit / namelen message( 'Expected link commandline length is approximately ' + '@0@'.format((nfiles * (namelen + 28))), ) seq = run_command('name_gen.py', nfiles.to_string(), meson.build_root(), check: true).stdout().strip().split('\n') sources = [] codegen = find_program('codegen.py') i = 0 foreach name : seq sources += custom_target( 'codegen' + i.to_string(), command: [codegen, i.to_string(), '@OUTPUT@'], output: name + '.c', ) i += 1 endforeach shared_library('sharedlib', sources) static_library('staticlib', sources) executable('app', 'main.c', sources) # Also test short commandlines to make sure that doesn't regress shared_library('sharedlib0', sources[0]) static_library('staticlib0', sources[0]) executable('app0', 'main.c', sources[0]) muon-v0.4.0/subprojects/meson-tests/common/227 very long command line/name_gen.py0000755000175000017500000000145014751453622026621 0ustar buildbuild#!/usr/bin/env python3 """ generate sequence of filename that does not exceed MAX_LEN=260 for Python < 3.6 and Windows without modified registry """ import sys import string name_len = 260 - len(sys.argv[2]) - 4 - 39 - 4 - 2 if name_len < 1: raise ValueError('The meson build directory pathname is so long ' 'that we cannot generate filenames within 260 characters.') # leave room for suffix and file separators, and meson generated text # e.g. ".c.obj.d" and other decorators added by Meson at configuration # for intermediate files base = string.ascii_letters * 5 # 260 characters max_num_len = len(str(sys.argv[1])) base = base[: name_len - max_num_len] for i in range(int(sys.argv[1])): print("{base}{i:0{max_num_len}d}".format(base=base, max_num_len=max_num_len, i=i)) muon-v0.4.0/subprojects/meson-tests/common/227 very long command line/codegen.py0000755000175000017500000000023414751453622026453 0ustar buildbuild#!/usr/bin/env python3 import sys from pathlib import Path Path(sys.argv[2]).write_text( 'int func{n}(void) {{ return {n}; }}'.format(n=sys.argv[1])) muon-v0.4.0/subprojects/meson-tests/common/165 get project license/0002755000175000017500000000000014751453622024073 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/165 get project license/bar.c0000644000175000017500000000013514751453622025000 0ustar buildbuild#include int main(void) { printf("I'm a main project bar.\n"); return 0; } muon-v0.4.0/subprojects/meson-tests/common/165 get project license/meson.build0000644000175000017500000000032314751453622026231 0ustar buildbuildproject('bar', 'c', license: 'Apache-2.0') executable('bar', 'bar.c') license = meson.project_license()[0] if license != 'Apache-2.0' error('The license should be Apache-2.0, but it is: ' + license) endif muon-v0.4.0/subprojects/meson-tests/common/168 preserve gendir/0002755000175000017500000000000014751453622023351 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/168 preserve gendir/testprog.c0000644000175000017500000000014514751453622025362 0ustar buildbuild#include"base.h" #include"com/mesonbuild/subbie.h" int main(void) { return base() + subbie(); } muon-v0.4.0/subprojects/meson-tests/common/168 preserve gendir/base.inp0000644000175000017500000000000514751453622024764 0ustar buildbuildbase muon-v0.4.0/subprojects/meson-tests/common/168 preserve gendir/meson.build0000644000175000017500000000131714751453622025513 0ustar buildbuildproject('preserve subdir', 'c') gprog = find_program('genprog.py') gen = generator( gprog, output: ['@BASENAME@.c', '@BASENAME@.h'], arguments: ['--searchdir=@CURRENT_SOURCE_DIR@', '--outdir=@BUILD_DIR@', '@INPUT@'], ) generated = gen.process( 'base.inp', 'com/mesonbuild/subbie.inp', preserve_path_from: meson.current_source_dir(), ) # testcase expect_error('generator.process: When using preserve_path_from, all input files must be in a subdirectory of the given dir.') # generated = gen.process('base.inp', 'com/mesonbuild/subbie.inp', # preserve_path_from : meson.current_source_dir() / 'com') # endtestcase e = executable('testprog', 'testprog.c', generated) test('testprog', e) muon-v0.4.0/subprojects/meson-tests/common/168 preserve gendir/genprog.py0000755000175000017500000000225414751453622025370 0ustar buildbuild#!/usr/bin/env python3 import os, sys, argparse h_templ = '''#pragma once int %s(void); ''' c_templ = '''#include"%s.h" int %s(void) { return 0; } ''' parser = argparse.ArgumentParser() parser.add_argument('--searchdir', required=True) parser.add_argument('--outdir', required=True) parser.add_argument('ifiles', nargs='+') options = parser.parse_args() searchdir = options.searchdir outdir = options.outdir ifiles = options.ifiles rel_ofiles = [] for ifile in ifiles: if not ifile.startswith(options.searchdir): sys.exit(f'Input file {ifile} does not start with search dir {searchdir}.') rel_ofile = ifile[len(searchdir):] if rel_ofile[0] == '/' or rel_ofile[0] == '\\': rel_ofile = rel_ofile[1:] rel_ofiles.append(os.path.splitext(rel_ofile)[0]) ofile_bases = [os.path.join(outdir, i) for i in rel_ofiles] for i, ifile_name in enumerate(ifiles): proto_name = open(ifile_name).readline().strip() h_out = ofile_bases[i] + '.h' c_out = ofile_bases[i] + '.c' os.makedirs(os.path.split(ofile_bases[i])[0], exist_ok=True) open(h_out, 'w').write(h_templ % (proto_name)) open(c_out, 'w').write(c_templ % (proto_name, proto_name)) muon-v0.4.0/subprojects/meson-tests/common/168 preserve gendir/com/0002755000175000017500000000000014751453622024127 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/168 preserve gendir/com/mesonbuild/0002755000175000017500000000000014751453622026270 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/168 preserve gendir/com/mesonbuild/subbie.inp0000644000175000017500000000000714751453622030244 0ustar buildbuildsubbie muon-v0.4.0/subprojects/meson-tests/common/40 options/0002755000175000017500000000000014751453622021665 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/40 options/meson_options.txt0000644000175000017500000000212214751453622025315 0ustar buildbuildoption( 'testoption', type: 'string', value: 'optval', description: 'An option ' + 'to do something', ) option('other_one', type: 'boolean', value: not (not (not (not false)))) option( 'combo_opt', type: 'co' + 'mbo', choices: ['one', 'two', 'combo'], value: 'combo', ) option( 'array_opt', type: 'array', choices: ['one', 'two', 'three'], value: ['one', 'two'], ) option('free_array_opt', type: 'array') option('integer_opt', type: 'integer', min: 0, max: -(-5), value: 3) option( 'neg' + '_' + 'int' + '_' + 'opt', type: 'integer', min: -5, max: 5, value: -3, ) option( 'CaseSenSiTivE', type: 'string', value: 'Some CAPS', description: 'An option with mixed capitalization', ) option( 'CASESENSITIVE', type: 'string', value: 'ALL CAPS', description: 'An option with all caps', ) # different than meson: options have to typecheck #option('boolean_string', type: 'boolean', value: 'false') #option('boolean_string2', type: 'boolean', value: 'true') #option('integer_string', type: 'integer', value: '42') muon-v0.4.0/subprojects/meson-tests/common/40 options/meson.build0000644000175000017500000000266514751453622024036 0ustar buildbuildproject('options', 'c', meson_version: '>= 1.0.0') if get_option('testoption') != 'optval' error('Incorrect value to test option') endif if get_option('other_one') != false error('Incorrect value to boolean option.') endif if get_option('combo_opt') != 'combo' error('Incorrect value to combo option.') endif if get_option('array_opt') != ['one', 'two'] message(get_option('array_opt')) error('Incorrect value for array option') endif # If the default changes, update test cases/unit/13 reconfigure if get_option('b_lto') != false error('Incorrect value in base option.') endif if get_option('includedir') != 'include' error('Incorrect value in builtin option.') endif if get_option('integer_opt') != 3 error('Incorrect value in integer option.') endif if get_option('neg_int_opt') != -3 error('Incorrect value in negative integer option.') endif if get_option('CaseSenSiTivE') != 'Some CAPS' error('Incorrect value in mixed caps option.') endif if get_option('CASESENSITIVE') != 'ALL CAPS' error('Incorrect value in all caps option.') endif # testcase expect_error('Invalid option name \'..invalid\'') # get_option('..invalid') # endtestcase # testcase expect_error('Invalid option name \'this.is.also.invalid\'') # get_option('this.is.also.invalid') # endtestcase # different than meson: wrap_mode defaults to nopromote assert(get_option('wrap_mode') == 'nopromote', 'Wrap mode option is broken.') muon-v0.4.0/subprojects/meson-tests/common/40 options/test.json0000644000175000017500000000026714751453622023542 0ustar buildbuild{ "stdout": [ { "line": " * 1.1.0: {'\"boolean option\" keyword argument \"value\" of type str', '\"integer option\" keyword argument \"value\" of type str'}" } ] } muon-v0.4.0/subprojects/meson-tests/common/206 tap tests/0002755000175000017500000000000014751453622022165 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/206 tap tests/cat.c0000644000175000017500000000107214751453622023076 0ustar buildbuild#include #include int main(int argc, char **argv) { char buf[1024]; size_t len; FILE *fh; if (argc != 2) { fprintf(stderr, "Incorrect number of arguments, got %i\n", argc); return 1; } fh = fopen(argv[1], "r"); if (fh == NULL) { fprintf(stderr, "Opening %s: errno=%i\n", argv[1], errno); return 1; } do { len = fread(buf, 1, sizeof(buf), fh); if (len > 0) { fwrite(buf, 1, len, stdout); } } while (len > 0); fclose(fh); return 0; } muon-v0.4.0/subprojects/meson-tests/common/206 tap tests/meson.build0000644000175000017500000000172414751453622024331 0ustar buildbuildproject('test features', 'c') tester = executable('tester', 'tester.c') cat = executable('cat', 'cat.c') test('pass', tester, args: ['ok'], protocol: 'tap') test('fail', tester, args: ['not ok'], should_fail: true, protocol: 'tap') test('xfail', tester, args: ['not ok # todo'], protocol: 'tap') test('xpass', tester, args: ['ok # todo'], should_fail: true, protocol: 'tap') test('skip', tester, args: ['ok # skip'], protocol: 'tap') test( 'partially skipped', tester, args: ['ok 1\nok 2 # skip'], suite: ['verbose'], protocol: 'tap', verbose: true, ) test( 'partially skipped (real-world example)', cat, args: [files('issue7515.txt')], protocol: 'tap', ) test( 'skip comment', tester, args: ['ok # Skipped: with a comment'], protocol: 'tap', ) test( 'skip failure', tester, args: ['not ok # skip'], should_fail: true, protocol: 'tap', ) test('no tests', tester, args: ['1..0 # skip'], protocol: 'tap') muon-v0.4.0/subprojects/meson-tests/common/206 tap tests/issue7515.txt0000644000175000017500000000453614751453622024406 0ustar buildbuild1..26 ok 1 Gtk overrides UI template sets up internal and public template children ok 2 Gtk overrides UI template sets up public template children with the correct widgets ok 3 Gtk overrides UI template sets up internal template children with the correct widgets ok 4 Gtk overrides UI template connects template callbacks to the correct handler ok 5 Gtk overrides UI template binds template callbacks to the correct object ok 6 Gtk overrides UI template from resource sets up internal and public template children ok 7 Gtk overrides UI template from resource sets up public template children with the correct widgets ok 8 Gtk overrides UI template from resource sets up internal template children with the correct widgets ok 9 Gtk overrides UI template from resource connects template callbacks to the correct handler ok 10 Gtk overrides UI template from resource binds template callbacks to the correct object ok 11 Gtk overrides UI template from file sets up internal and public template children ok 12 Gtk overrides UI template from file sets up public template children with the correct widgets ok 13 Gtk overrides UI template from file sets up internal template children with the correct widgets ok 14 Gtk overrides UI template from file connects template callbacks to the correct handler ok 15 Gtk overrides UI template from file binds template callbacks to the correct object ok 16 Gtk overrides Class inheriting from template class sets up internal and public template children # SKIP pending ok 17 Gtk overrides Class inheriting from template class sets up public template children with the correct widgets # SKIP pending ok 18 Gtk overrides Class inheriting from template class sets up internal template children with the correct widgets # SKIP pending ok 19 Gtk overrides Class inheriting from template class connects template callbacks to the correct handler # SKIP pending ok 20 Gtk overrides Class inheriting from template class binds template callbacks to the correct object # SKIP pending ok 21 Gtk overrides sets CSS names on classes ok 22 Gtk overrides avoid crashing when GTK vfuncs are called in garbage collection ok 23 Gtk overrides accepts string in place of GdkAtom ok 24 Gtk overrides accepts null in place of GdkAtom as GDK_NONE ok 25 Gtk overrides uses the correct GType for null child properties ok 26 Gtk overrides can create a Gtk.TreeIter with accessible stamp field muon-v0.4.0/subprojects/meson-tests/common/206 tap tests/tester.c0000644000175000017500000000032014751453622023630 0ustar buildbuild#include int main(int argc, char **argv) { if (argc != 2) { fprintf(stderr, "Incorrect number of arguments, got %i\n", argc); return 1; } puts(argv[1]); return 0; } muon-v0.4.0/subprojects/meson-tests/common/122 no buildincdir/0002755000175000017500000000000014751453622023140 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/122 no buildincdir/meson.build0000644000175000017500000000062514751453622025303 0ustar buildbuildproject('nobuilddir', 'c', default_options: ['werror=true', 'buildtype=plain']) cc = meson.get_compiler('c') incwarg = '-Wmissing-include-dirs' if cc.has_argument(incwarg) executable( 'prog', 'prog.c', c_args: incwarg, include_directories: include_directories('include'), ) else error('MESON_SKIP_TEST compiler does not support bad inc dir argument.') endif muon-v0.4.0/subprojects/meson-tests/common/122 no buildincdir/include/0002755000175000017500000000000014751453622024563 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/122 no buildincdir/include/header.h0000644000175000017500000000004014751453622026154 0ustar buildbuild#pragma once int foobar(void); muon-v0.4.0/subprojects/meson-tests/common/122 no buildincdir/prog.c0000644000175000017500000000006514751453622024252 0ustar buildbuild#include"header.h" int main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/123 custom target directory install/0002755000175000017500000000000014751453622026451 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/123 custom target directory install/docgen.py0000644000175000017500000000035114751453622030257 0ustar buildbuild#!/usr/bin/env python3 import os import sys out = sys.argv[1] try: os.mkdir(out) except FileExistsError: pass for name in ('a', 'b', 'c'): with open(os.path.join(out, name + '.html'), 'w') as f: f.write(name) muon-v0.4.0/subprojects/meson-tests/common/123 custom target directory install/meson.build0000644000175000017500000000037214751453622030613 0ustar buildbuildproject('custom-target-dir-install') docgen = find_program('docgen.py') custom_target( 'docgen', output: 'html', command: [docgen, '@OUTPUT@'], install: true, install_dir: join_paths(get_option('datadir'), 'doc/testpkgname'), ) muon-v0.4.0/subprojects/meson-tests/common/123 custom target directory install/test.json0000644000175000017500000000035514751453622030324 0ustar buildbuild{ "installed": [ {"type": "file", "file": "usr/share/doc/testpkgname/html/a.html"}, {"type": "file", "file": "usr/share/doc/testpkgname/html/b.html"}, {"type": "file", "file": "usr/share/doc/testpkgname/html/c.html"} ] } muon-v0.4.0/subprojects/meson-tests/common/210 link custom_i multiple from multiple/0002755000175000017500000000000014751453622027365 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/210 link custom_i multiple from multiple/meson.build0000644000175000017500000000234014751453622031524 0ustar buildbuildproject('linkcustom', 'c') # This would require passing the static linker to the build script or having # it detect it by itself. I'm too lazy to implement it now and it is not # really needed for testing that custom targets work. It is the responsibility # of the custom target to produce things in the correct format. assert( not meson.is_cross_build(), 'MESON_SKIP_TEST cross checking not implemented.', ) cc = meson.get_compiler('c') genprog = find_program('generate_stlibs.py') clib = custom_target( 'linkcustom', output: ['libflob_1.a', 'libflob_2.a'], command: [genprog, '-o', '@OUTPUT@', '--private-dir', '@PRIVATE_DIR@'] + cc.cmd_array(), ) clibs = [clib[0], clib[1]] exe = executable('prog', 'prog.c', link_with: clibs) test('linkcustom', exe) d = declare_dependency(link_with: clibs) exe2 = executable('prog2', 'prog.c', dependencies: d) test('linkcustom2', exe2) # Link whole tests if meson.backend() == 'xcode' message('Xcode does not support link whole so skipping.') subdir_done() endif exe3 = executable('prog3', 'prog.c', link_whole: clibs) test('linkwhole', exe) d2 = declare_dependency(link_whole: clibs) exe4 = executable('prog4', 'prog.c', dependencies: d2) test('linkwhole2', exe2) muon-v0.4.0/subprojects/meson-tests/common/210 link custom_i multiple from multiple/prog.c0000644000175000017500000000014414751453622030475 0ustar buildbuildvoid flob_1(void); void flob_2(void); int main(void) { flob_1(); flob_2(); return 0; } ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/210 link custom_i multiple from multiple/generate_stlibs.pymuon-v0.4.0/subprojects/meson-tests/common/210 link custom_i multiple from multiple/generate_stlibs.0000644000175000017500000000562314751453622032544 0ustar buildbuild#!/usr/bin/env python3 import shutil, sys, subprocess, argparse, pathlib parser = argparse.ArgumentParser() parser.add_argument('--private-dir', required=True) parser.add_argument('-o', nargs='+', required=True) parser.add_argument('cmparr', nargs='+') contents = ['''#include void flob_1() { printf("Now flobbing #1.\\n"); } ''', '''#include void flob_2() { printf("Now flobbing #2.\\n"); } '''] def generate_lib_gnulike(outfile, c_file, private_dir, compiler_array): if shutil.which('ar'): static_linker = 'ar' elif shutil.which('llvm-ar'): static_linker = 'llvm-ar' elif shutil.which('gcc-ar'): static_linker = 'gcc-ar' else: sys.exit('Could not detect a static linker.') o_file = c_file.with_suffix('.o') compile_cmd = compiler_array + ['-c', '-g', '-O2', '-o', str(o_file), str(c_file)] subprocess.check_call(compile_cmd) out_file = pathlib.Path(outfile) if out_file.exists(): out_file.unlink() link_cmd = [static_linker, 'csr', outfile, str(o_file)] subprocess.check_call(link_cmd) return 0 def generate_lib_msvc(outfile, c_file, private_dir, compiler_array): static_linker = 'lib' o_file = c_file.with_suffix('.obj') compile_cmd = compiler_array + ['/MDd', '/nologo', '/ZI', '/Ob0', '/Od', '/c', '/Fo' + str(o_file), str(c_file)] subprocess.check_call(compile_cmd) out_file = pathlib.Path(outfile) if out_file.exists(): out_file.unlink() link_cmd = [static_linker, '/nologo', '/OUT:' + str(outfile), str(o_file)] subprocess.check_call(link_cmd) return 0 def generate_lib(outfiles, private_dir, compiler_array): private_dir = pathlib.Path(private_dir) if not private_dir.exists(): private_dir.mkdir() for i, content in enumerate(contents): c_file = private_dir / ('flob_' + str(i + 1) + '.c') c_file.write_text(content) outfile = outfiles[i] cl_found = False for cl_arg in compiler_array: if (cl_arg.endswith('cl') or cl_arg.endswith('cl.exe')) and 'clang-cl' not in cl_arg: ret = generate_lib_msvc(outfile, c_file, private_dir, compiler_array) if ret > 0: return ret else: cl_found = True break if not cl_found: ret = generate_lib_gnulike(outfile, c_file, private_dir, compiler_array) if ret > 0: return ret return 0 if __name__ == '__main__': options = parser.parse_args() sys.exit(generate_lib(options.o, options.private_dir, options.cmparr)) muon-v0.4.0/subprojects/meson-tests/common/36 has function/0002755000175000017500000000000014751453622022560 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/36 has function/meson.build0000644000175000017500000001342714751453622024727 0ustar buildbuildproject('has function', 'c', 'cpp') host_system = host_machine.system() # This is used in the `test_compiler_check_flags_order` unit test unit_test_args = '-I/tmp' defines_has_builtin = '''#ifndef __has_builtin #error "no __has_builtin" #endif ''' compilers = [meson.get_compiler('c'), meson.get_compiler('cpp')] foreach cc : compilers if not cc.has_function('printf', prefix: '#include', args: unit_test_args) error('"printf" function not found (should always exist).') endif # Should also be able to detect it without specifying the header # We check for a different function here to make sure the result is # not taken from a cache (ie. the check above) # On MSVC fprintf is defined as an inline function in the header, so it cannot # be found without the include. if not ['msvc', 'intel-cl'].contains(cc.get_id()) assert( cc.has_function('fprintf', args: unit_test_args), '"fprintf" function not found without include (on !msvc).', ) else assert( cc.has_function('fprintf', prefix: '#include ', args: unit_test_args), '"fprintf" function not found with include (on msvc).', ) # Compiler intrinsics assert( cc.has_function('strcmp'), 'strcmp intrinsic should have been found on MSVC', ) assert( cc.has_function('strcmp', prefix: '#include '), 'strcmp intrinsic should have been found with #include on MSVC', ) endif if cc.has_function('hfkerhisadf', prefix: '#include', args: unit_test_args) error('Found nonexistent function "hfkerhisadf".') endif if cc.has_function('hfkerhisadf', args: unit_test_args) error('Found nonexistent function "hfkerhisadf".') endif # With glibc (before 2.32, see below) on Linux, lchmod is a stub that will # always return an error, we want to detect that and declare that the # function is not available. # We can't check for the C library used here of course, but the main # alternative Linux C library (musl) doesn't use glibc's stub mechanism; # also, it has implemented lchmod since 2013, so it should be safe to check # that lchmod is available on Linux when not using glibc. if host_system == 'linux' or host_system == 'darwin' assert( cc.has_function('poll', prefix: '#include ', args: unit_test_args), 'couldn\'t detect "poll" when defined by a header', ) lchmod_prefix = '#include \n#include ' has_lchmod = cc.has_function('lchmod', prefix: lchmod_prefix, args: unit_test_args) if host_system == 'linux' # __GLIBC__ macro can be retrieved by including almost any C library header glibc_major = cc.get_define( '__GLIBC__', prefix: '#include ', args: unit_test_args, ) # __GLIBC__ will only be set for glibc if glibc_major != '' glibc_minor = cc.get_define( '__GLIBC_MINOR__', prefix: '#include ', args: unit_test_args, ) glibc_vers = '@0@.@1@'.format(glibc_major, glibc_minor) message('GLIBC version:', glibc_vers) # lchmod was implemented in glibc 2.32 (https://sourceware.org/pipermail/libc-announce/2020/000029.html) if glibc_vers.version_compare('<2.32') assert(not has_lchmod, '"lchmod" check should have failed') else assert(has_lchmod, '"lchmod" check should have succeeded') endif else # Other C libraries for Linux should have lchmod assert(has_lchmod, '"lchmod" check should have succeeded') endif else # macOS and *BSD have lchmod assert(has_lchmod, '"lchmod" check should have succeeded') endif # Check that built-ins are found properly both with and without headers assert( cc.has_function('alloca', args: unit_test_args), 'built-in alloca must be found on ' + host_system, ) assert( cc.has_function('alloca', prefix: '#include ', args: unit_test_args), 'built-in alloca must be found with #include', ) if not cc.compiles(defines_has_builtin, args: unit_test_args) assert( not cc.has_function( 'alloca', prefix: '#include \n#undef alloca', args: unit_test_args, ), 'built-in alloca must not be found with #include and #undef', ) endif endif # For some functions one needs to define _GNU_SOURCE before including the # right headers to get them picked up. Make sure we can detect these functions # as well without any prefix if cc.has_header_symbol( 'sys/socket.h', 'recvmmsg', prefix: '#define _GNU_SOURCE', args: unit_test_args, ) # We assume that if recvmmsg exists sendmmsg does too assert( cc.has_function('sendmmsg', args: unit_test_args), 'Failed to detect function "sendmmsg" (should always exist).', ) endif # We should be able to find GCC and Clang __builtin functions if ['gcc', 'clang'].contains(cc.get_id()) # __builtin_constant_p is documented to exist at least as far back as # GCC 2.95.3 assert( cc.has_function('__builtin_constant_p', args: unit_test_args), '__builtin_constant_p must be found under gcc and clang', ) endif endforeach muon-v0.4.0/subprojects/meson-tests/common/205 native file path override/0002755000175000017500000000000014751453622025160 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/205 native file path override/main.cpp0000644000175000017500000000012614751453622026605 0ustar buildbuild#include int main(void) { std::cout << "Hello world!" << std::endl; } muon-v0.4.0/subprojects/meson-tests/common/205 native file path override/nativefile.ini0000644000175000017500000000004114751453622030000 0ustar buildbuild[paths] bindir = 'custom_bindir' muon-v0.4.0/subprojects/meson-tests/common/205 native file path override/meson.build0000644000175000017500000000031614751453622027320 0ustar buildbuildproject('native file install dir override', 'cpp') if meson.is_cross_build() error('MESON_SKIP_TEST cannot test native build rules in cross build') endif executable('main', 'main.cpp', install: true) muon-v0.4.0/subprojects/meson-tests/common/205 native file path override/test.json0000644000175000017500000000020614751453622027026 0ustar buildbuild{ "installed": [ {"type": "exe", "file": "usr/custom_bindir/main"}, {"type": "pdb", "file": "usr/custom_bindir/main"} ] } muon-v0.4.0/subprojects/meson-tests/common/11 subdir/0002755000175000017500000000000014751453622021460 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/11 subdir/subdir/0002755000175000017500000000000014751453622022750 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/11 subdir/subdir/meson.build0000644000175000017500000000007514751453622025112 0ustar buildbuildprog = executable('prog', 'prog.c') test('subdirprog', prog) muon-v0.4.0/subprojects/meson-tests/common/11 subdir/subdir/prog.c0000644000175000017500000000003514751453622024057 0ustar buildbuildint main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/11 subdir/meson.build0000644000175000017500000000005514751453622023620 0ustar buildbuildproject('subdir test', 'c') subdir('subdir') muon-v0.4.0/subprojects/meson-tests/common/109 custom target capture/0002755000175000017500000000000014751453622024465 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/109 custom target capture/meson.build0000644000175000017500000000126514751453622026631 0ustar buildbuildproject('custom target') python3 = import('python3').find_python() # Note that this will not add a dependency to the compiler executable. # Code will not be rebuilt if it changes. comp = '@0@/@1@'.format(meson.current_source_dir(), 'my_compiler.py') mytarget = custom_target( 'bindat', output: 'data.dat', input: 'data_source.txt', capture: true, command: [python3, comp, '@INPUT@'], install: true, install_dir: 'subdir', ) ct_output_exists = '''import os, sys if not os.path.exists(sys.argv[1]): print("could not find {!r} in {!r}".format(sys.argv[1], os.getcwd())) sys.exit(1) ''' test('capture-wrote', python3, args: ['-c', ct_output_exists, mytarget]) muon-v0.4.0/subprojects/meson-tests/common/109 custom target capture/test.json0000644000175000017500000000011514751453622026332 0ustar buildbuild{ "installed": [ {"type": "file", "file": "usr/subdir/data.dat"} ] } muon-v0.4.0/subprojects/meson-tests/common/109 custom target capture/data_source.txt0000644000175000017500000000004014751453622027507 0ustar buildbuildThis is a text only input file. muon-v0.4.0/subprojects/meson-tests/common/109 custom target capture/my_compiler.py0000755000175000017500000000054614751453622027364 0ustar buildbuild#!/usr/bin/env python3 import sys if __name__ == '__main__': if len(sys.argv) != 2: print(sys.argv[0], 'input_file') sys.exit(1) with open(sys.argv[1]) as f: ifile = f.read() if ifile != 'This is a text only input file.\n': print('Malformed input') sys.exit(1) print('This is a binary output file.') muon-v0.4.0/subprojects/meson-tests/common/196 subproject with features/0002755000175000017500000000000014751453622025201 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/196 subproject with features/subprojects/0002755000175000017500000000000014751453622027544 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/196 subproject with features/subprojects/sub/0002755000175000017500000000000014751453622030335 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/196 subproject with features/subprojects/sub/meson.build0000644000175000017500000000004314751453622032472 0ustar buildbuildproject('sub', 'c') subdir('lib') muon-v0.4.0/subprojects/meson-tests/common/196 subproject with features/subprojects/sub/lib/0002755000175000017500000000000014751453622031103 5ustar buildbuild././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/196 subproject with features/subprojects/sub/lib/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/196 subproject with features/subprojects/sub/lib/meson.bu0000644000175000017500000000020014751453622032542 0ustar buildbuildlib = static_library('sub', 'sub.c') libSub = declare_dependency(include_directories: include_directories('.'), link_with: lib) muon-v0.4.0/subprojects/meson-tests/common/196 subproject with features/subprojects/sub/lib/sub.c0000644000175000017500000000006014751453622032032 0ustar buildbuild#include "sub.h" int sub(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/196 subproject with features/subprojects/sub/lib/sub.h0000644000175000017500000000006414751453622032043 0ustar buildbuild#ifndef SUB_H #define SUB_H int sub(void); #endif muon-v0.4.0/subprojects/meson-tests/common/196 subproject with features/subprojects/disabled_sub/0002755000175000017500000000000014751453622032164 5ustar buildbuild././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/196 subproject with features/subprojects/disabled_sub/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/196 subproject with features/subprojects/disabled_sub/mes0000644000175000017500000000005414751453622032670 0ustar buildbuildproject('disabled_sub', 'c') subdir('lib') ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/196 subproject with features/subprojects/disabled_sub/lib/muon-v0.4.0/subprojects/meson-tests/common/196 subproject with features/subprojects/disabled_sub/lib0002755000175000017500000000000014751453622032653 5ustar buildbuild././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/196 subproject with features/subprojects/disabled_sub/lib/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/196 subproject with features/subprojects/disabled_sub/lib0000644000175000017500000000020114751453622032644 0ustar buildbuildlib = static_library('sub', 'sub.c') libSub = declare_dependency(include_directories: include_directories('.'), link_with: lib) ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/196 subproject with features/subprojects/disabled_sub/lib/sub.cmuon-v0.4.0/subprojects/meson-tests/common/196 subproject with features/subprojects/disabled_sub/lib0000644000175000017500000000006214751453622032651 0ustar buildbuild#include "sub.h" int sub(void) { return 0; } ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/196 subproject with features/subprojects/disabled_sub/lib/sub.hmuon-v0.4.0/subprojects/meson-tests/common/196 subproject with features/subprojects/disabled_sub/lib0000644000175000017500000000006014751453622032647 0ustar buildbuild#ifndef SUB_H #define SUB_H int sub(); #endif ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/196 subproject with features/subprojects/auto_sub_with_missing_dep/muon-v0.4.0/subprojects/meson-tests/common/196 subproject with features/subprojects/auto_sub_with_mi0002755000175000017500000000000014751453622033026 5ustar buildbuild././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/196 subproject with features/subprojects/auto_sub_with_missing_dep/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/196 subproject with features/subprojects/auto_sub_with_mi0000644000175000017500000000010614751453622033023 0ustar buildbuildproject('sub', 'c') dependency('no_way_this_exists', required: true) muon-v0.4.0/subprojects/meson-tests/common/196 subproject with features/meson_options.txt0000644000175000017500000000027714751453622030642 0ustar buildbuildoption('use-subproject', type: 'feature', value: 'auto') option('disabled-subproject', type: 'feature', value: 'disabled') option('auto-sub-with-missing-dep', type: 'feature', value: 'auto') muon-v0.4.0/subprojects/meson-tests/common/196 subproject with features/meson.build0000644000175000017500000000220214751453622027335 0ustar buildbuildproject('proj', 'c') auto_subproj = subproject('sub', required: get_option('use-subproject')) assert( auto_subproj.found(), 'Subproject should always be buildable and thus found', ) # different than meson: dependency('') cannot be required auto_dep = dependency('!', fallback: ['sub', 'libSub'], required: true) assert( auto_dep.found() == true, 'Subproject is required and foundable, dependency should be found.', ) disabled_subproj = subproject('disabled_sub', required: get_option('disabled-subproject')) assert( disabled_subproj.found() == false, 'Disabled subproject should be NOT found', ) disabled_dep = dependency('', fallback: ['disabled_sub', 'libSub'], required: false) assert( disabled_dep.found() == false, 'Subproject was disabled, it should never be built.', ) nothing = executable('nothing', 'nothing.c', dependencies: [disabled_dep]) subproj_with_missing_dep = subproject( 'auto_sub_with_missing_dep', required: get_option('auto-sub-with-missing-dep'), ) assert( subproj_with_missing_dep.found() == false, 'Subproject with required=auto and missing dependency should be NOT found', ) muon-v0.4.0/subprojects/meson-tests/common/196 subproject with features/nothing.c0000644000175000017500000000004114751453622027004 0ustar buildbuildint main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/9 header install/0002755000175000017500000000000014751453622022776 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/9 header install/sub/0002755000175000017500000000000014751453622023567 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/9 header install/sub/meson.build0000644000175000017500000000004214751453622025723 0ustar buildbuildsubheader = files('fileheader.h') muon-v0.4.0/subprojects/meson-tests/common/9 header install/sub/fileheader.h0000644000175000017500000000007114751453622026024 0ustar buildbuild#pragma once #define LIFE "Is life! Na naa, naa-na na." muon-v0.4.0/subprojects/meson-tests/common/9 header install/subdir.h0000644000175000017500000000011214751453622024427 0ustar buildbuild/* This file goes to subdirectory of include root. */ int subdir_func(); muon-v0.4.0/subprojects/meson-tests/common/9 header install/meson.build0000644000175000017500000000046314751453622025141 0ustar buildbuildproject('header install') as_array = ['subdir.h', 'child/childdir.h'] subdir('vanishing_subdir') subdir('sub') install_headers('rootdir.h') install_headers(as_array, subdir: 'subdir') install_headers(as_array, subdir: 'subdir', preserve_path: true) install_headers(subheader) install_headers(disabler()) muon-v0.4.0/subprojects/meson-tests/common/9 header install/test.json0000644000175000017500000000063414751453622024651 0ustar buildbuild{ "installed": [ { "type": "file", "file": "usr/include/rootdir.h" }, { "type": "file", "file": "usr/include/subdir/subdir.h" }, { "type": "file", "file": "usr/include/subdir/childdir.h" }, { "type": "file", "file": "usr/include/subdir/child/childdir.h" }, { "type": "file", "file": "usr/include/vanished.h" }, { "type": "file", "file": "usr/include/fileheader.h" } ] } muon-v0.4.0/subprojects/meson-tests/common/9 header install/child/0002755000175000017500000000000014751453622024061 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/9 header install/child/childdir.h0000644000175000017500000000026514751453622026015 0ustar buildbuild/* This file goes, depending on the state of `preserve_path` into subdirectory of include root or into the `child` dir of the subdirectory of include root. */ int childdir_func(); muon-v0.4.0/subprojects/meson-tests/common/9 header install/rootdir.h0000644000175000017500000000007614751453622024632 0ustar buildbuild/* This header goes to include dir root. */ int root_func(); muon-v0.4.0/subprojects/meson-tests/common/9 header install/vanishing_subdir/0002755000175000017500000000000014751453622026334 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/9 header install/vanishing_subdir/meson.build0000644000175000017500000000003614751453622030473 0ustar buildbuildinstall_headers('vanished.h') muon-v0.4.0/subprojects/meson-tests/common/9 header install/vanishing_subdir/vanished.h0000644000175000017500000000022114751453622030277 0ustar buildbuild#pragma once /* This is a header in a subdirectory. Make sure it installs into * /prefix/include and not /prefix/include/vanishing_subdir. */ muon-v0.4.0/subprojects/meson-tests/common/33 run program/0002755000175000017500000000000014751453622022430 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/33 run program/meson.build0000644000175000017500000000532114751453622024571 0ustar buildbuildproject( 'run command', version: run_command('get-version.py', check: true).stdout().strip(), meson_version: '>=0.1.0', ) if build_machine.system() == 'windows' c = run_command('cmd', '/c', 'echo', 'hello', check: false) else c = run_command('echo', 'hello', check: false) endif correct = 'hello' if c.returncode() != 0 error('Executing echo failed.') endif result = c.stdout().strip() if result != correct error('Getting stdout failed.') endif if c.stderr() != '' error('Extra text in stderr.') endif # Now the same with a script. if build_machine.system() == 'windows' cs = run_command('scripts/hello.bat', check: false) else cs = run_command('scripts/hello.sh', check: false) endif if cs.returncode() != 0 error('Executing script failed.') endif if cs.stdout().strip() != correct error('Getting stdout failed (script).') endif if cs.stderr() != '' error('Extra text in stderr (script).') endif # We should be able to have files() in argument f = files('meson.build') if build_machine.system() == 'windows' c = run_command('cmd', '/c', 'echo', f, check: false) else c = run_command('echo', f, check: false) endif if c.returncode() != 0 error('Using files() in argument failed.') endif py3 = import('python3').find_python() # different than meson, \r\n in program output not automatically converted to \n ret = run_command(py3, '-c', 'print("some output")', check: false) assert(ret.returncode() == 0, 'failed to run python3: ' + ret.stderr()) assert(ret.stdout().strip() == 'some output', 'failed to run python3') ret = run_command(py3, '-c', 'print("some output")', check: false, capture: false) assert(ret.returncode() == 0, 'failed to run python3: ' + ret.stderr()) assert( ret.stdout() == '', 'stdout is "@0@" instead of empty'.format(ret.stdout()), ) c_env = environment() c_env.append('CUSTOM_ENV_VAR', 'FOOBAR') ret = run_command( py3, '-c', 'import os; print(os.environ.get("CUSTOM_ENV_VAR"))', env: c_env, check: false, ) assert(ret.returncode() == 0, 'failed to run python3: ' + ret.stderr()) assert( ret.stdout().strip() == 'FOOBAR', 'stdout is "@0@" instead of FOOBAR'.format(ret.stdout()), ) dd = find_program('dd', required: false) if dd.found() ret = run_command( dd, 'if=/dev/urandom', 'bs=10', 'count=1', check: false, capture: false, ) assert(ret.returncode() == 0, 'failed to run dd: ' + ret.stderr()) assert( ret.stdout() == '', 'stdout is "@0@" instead of empty'.format(ret.stdout()), ) endif env = environment() env.append('MY_PATH', '1') env.append('MY_PATH', '2') env.prepend('MY_PATH', '0') run_command('check-env.py', env: env, check: true) muon-v0.4.0/subprojects/meson-tests/common/33 run program/get-version.py0000644000175000017500000000004514751453622025241 0ustar buildbuild#!/usr/bin/env python3 print('1.2') muon-v0.4.0/subprojects/meson-tests/common/33 run program/test.json0000644000175000017500000000043414751453622024301 0ustar buildbuild{ "stdout": [ { "line": "test cases/common/33 run program/meson.build:1: WARNING: Project targets '>=0.1.0' but uses feature introduced in '0.47.0': check arg in run_command.", "comment": "This triggers on line 1 -- the line with the project() function" } ] } muon-v0.4.0/subprojects/meson-tests/common/33 run program/scripts/0002755000175000017500000000000014751453622024117 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/33 run program/scripts/hello.sh0000755000175000017500000000002614751453622025555 0ustar buildbuild#!/bin/sh echo hello muon-v0.4.0/subprojects/meson-tests/common/33 run program/scripts/hello.bat0000644000175000017500000000002514751453622025705 0ustar buildbuild@ECHO OFF ECHO hello muon-v0.4.0/subprojects/meson-tests/common/33 run program/check-env.py0000644000175000017500000000014414751453622024642 0ustar buildbuild#!/usr/bin/env python3 import os assert os.environ['MY_PATH'] == os.pathsep.join(['0', '1', '2']) muon-v0.4.0/subprojects/meson-tests/common/86 private include/0002755000175000017500000000000014751453622023262 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/86 private include/user/0002755000175000017500000000000014751453622024240 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/86 private include/user/libuser.c0000644000175000017500000000012214751453622026042 0ustar buildbuild#include"foo1.h" #include"foo2.h" int main(void) { return foo1() + foo2(); } muon-v0.4.0/subprojects/meson-tests/common/86 private include/user/meson.build0000644000175000017500000000016314751453622026400 0ustar buildbuildexe = executable('libuser', 'libuser.c', link_with: stlib, include_directories: st_priv_inc) test('libuser', exe) muon-v0.4.0/subprojects/meson-tests/common/86 private include/meson.build0000644000175000017500000000007714751453622025426 0ustar buildbuildproject('access private', 'c') subdir('stlib') subdir('user') muon-v0.4.0/subprojects/meson-tests/common/86 private include/stlib/0002755000175000017500000000000014751453622024377 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/86 private include/stlib/foo1.def0000644000175000017500000000000014751453622025707 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/86 private include/stlib/meson.build0000644000175000017500000000046014751453622026537 0ustar buildbuildgenbin = find_program('compiler.py') gen = generator( genbin, output: ['@BASENAME@.h', '@BASENAME@.c'], arguments: ['@INPUT@', '@BUILD_DIR@'], ) defs = ['foo1.def', 'foo2.def'] generated = gen.process(defs) stlib = static_library('st', generated) st_priv_inc = stlib.private_dir_include() muon-v0.4.0/subprojects/meson-tests/common/86 private include/stlib/compiler.py0000755000175000017500000000101714751453622026563 0ustar buildbuild#!/usr/bin/env python3 import sys, os assert len(sys.argv) == 3 h_templ = '''#pragma once unsigned int %s(void); ''' c_templ = '''#include"%s.h" unsigned int %s(void) { return 0; } ''' ifile = sys.argv[1] outdir = sys.argv[2] base = os.path.splitext(os.path.split(ifile)[-1])[0] cfile = os.path.join(outdir, base + '.c') hfile = os.path.join(outdir, base + '.h') c_code = c_templ % (base, base) h_code = h_templ % base with open(cfile, 'w') as f: f.write(c_code) with open(hfile, 'w') as f: f.write(h_code) muon-v0.4.0/subprojects/meson-tests/common/86 private include/stlib/foo2.def0000644000175000017500000000000014751453622025710 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/53 install script/0002755000175000017500000000000014751453622023131 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/53 install script/meson.build0000644000175000017500000000235714751453622025300 0ustar buildbuildproject('custom install script', 'c') meson.add_install_script('myinstall.py', 'diiba/daaba', 'file.dat', dry_run: true) meson.add_install_script('myinstall.py', 'this/should', 'also-work.dat') subdir('src') meson.add_install_script('myinstall.py', 'dir', afile, '--mode=copy') data = configuration_data() data.set10('foo', true) conf = configure_file(configuration: data, output: 'conf.txt') meson.add_install_script('myinstall.py', 'dir', conf, '--mode=copy') t = custom_target( 'ct', command: [find_program('customtarget.py'), '@OUTDIR@'], output: ['1.txt', '2.txt'], ) meson.add_install_script('myinstall.py', 'customtarget', t, '--mode=copy') meson.add_install_script('myinstall.py', 'customtargetindex', t[0], '--mode=copy') installer = configure_file( input: 'myinstall.py', output: 'myinstall_copy.py', copy: true, ) meson.add_install_script(installer, 'otherdir', afile, '--mode=copy') # This executable links on a library built in src/ directory. On Windows this # means meson must add src/ into $PATH to find the DLL when running it as # install script. myexe = executable( 'prog', 'prog.c', link_with: mylib, install: true, ) if meson.can_run_host_binaries() meson.add_install_script(myexe) endif muon-v0.4.0/subprojects/meson-tests/common/53 install script/test.json0000644000175000017500000000120114751453622024773 0ustar buildbuild{ "installed": [ {"type": "exe", "file": "usr/bin/prog"}, {"type": "pdb", "file": "usr/bin/prog"}, {"type": "file", "file": "usr/diiba/daaba/file.dat"}, {"type": "file", "file": "usr/this/should/also-work.dat"}, {"type": "file", "file": "usr/this/does/something-different.dat.in"}, {"type": "file", "file": "usr/dir/a file.txt"}, {"type": "file", "file": "usr/dir/conf.txt"}, {"type": "file", "file": "usr/otherdir/a file.txt"}, {"type": "file", "file": "usr/customtarget/1.txt"}, {"type": "file", "file": "usr/customtarget/2.txt"}, {"type": "file", "file": "usr/customtargetindex/1.txt"} ] } muon-v0.4.0/subprojects/meson-tests/common/53 install script/customtarget.py0000755000175000017500000000057614751453622026235 0ustar buildbuild#!/usr/bin/env python3 import argparse import os def main() -> None: parser = argparse.ArgumentParser() parser.add_argument('dirname') args = parser.parse_args() with open(os.path.join(args.dirname, '1.txt'), 'w') as f: f.write('') with open(os.path.join(args.dirname, '2.txt'), 'w') as f: f.write('') if __name__ == "__main__": main() muon-v0.4.0/subprojects/meson-tests/common/53 install script/myinstall.py0000755000175000017500000000216714751453622025526 0ustar buildbuild#!/usr/bin/env python3 import argparse import os import shutil prefix = os.environ['MESON_INSTALL_DESTDIR_PREFIX'] dry_run = bool(os.environ.get('MESON_INSTALL_DRY_RUN')) def main() -> None: parser = argparse.ArgumentParser() parser.add_argument('dirname') parser.add_argument('files', nargs='+') parser.add_argument('--mode', action='store', default='create', choices=['create', 'copy']) args = parser.parse_args() dirname = os.path.join(prefix, args.dirname) if not os.path.exists(dirname): if dry_run: print(f"DRYRUN: Creating directory {dirname}") else: os.makedirs(dirname) if args.mode == 'create': for name in args.files: if dry_run: print(f'DRYRUN: Writing file {name}') else: with open(os.path.join(dirname, name), 'w') as f: f.write('') else: for name in args.files: if dry_run: print(f"DRYRUN: Copying file {name} to {dirname}") else: shutil.copy(name, dirname) if __name__ == "__main__": main() muon-v0.4.0/subprojects/meson-tests/common/53 install script/prog.c0000644000175000017500000000031314751453622024237 0ustar buildbuild#include #ifdef _WIN32 #define DO_IMPORT __declspec(dllimport) #else #define DO_IMPORT #endif DO_IMPORT int foo(void); int main(void) { printf("This is text.\n"); return foo(); } muon-v0.4.0/subprojects/meson-tests/common/53 install script/src/0002755000175000017500000000000014751453622023720 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/53 install script/src/meson.build0000644000175000017500000000023014751453622026053 0ustar buildbuildmeson.add_install_script('myinstall.py', 'this/does', 'something-different.dat') afile = files('a file.txt') mylib = shared_library('mylib', 'foo.c') muon-v0.4.0/subprojects/meson-tests/common/53 install script/src/myinstall.py0000644000175000017500000000043314751453622026304 0ustar buildbuild#!/usr/bin/env python3 import os import sys prefix = os.environ['MESON_INSTALL_DESTDIR_PREFIX'] dirname = os.path.join(prefix, sys.argv[1]) if not os.path.exists(dirname): os.makedirs(dirname) with open(os.path.join(dirname, sys.argv[2] + '.in'), 'w') as f: f.write('') muon-v0.4.0/subprojects/meson-tests/common/53 install script/src/foo.c0000644000175000017500000000020214751453622024637 0ustar buildbuild#ifdef _WIN32 #define DO_EXPORT __declspec(dllexport) #else #define DO_EXPORT #endif DO_EXPORT int foo(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/53 install script/src/a file.txt0000644000175000017500000000000014751453622025565 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/166 yield/0002755000175000017500000000000014751453622021371 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/166 yield/subprojects/0002755000175000017500000000000014751453622023734 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/166 yield/subprojects/sub/0002755000175000017500000000000014751453622024525 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/166 yield/subprojects/sub/meson_options.txt0000644000175000017500000000032214751453622030155 0ustar buildbuildoption('unshared_option', type: 'string', value: 'three', yield: false) option('shared_option', type: 'string', value: 'four', yield: true) option('wrongtype_option', type: 'boolean', value: true, yield: true) muon-v0.4.0/subprojects/meson-tests/common/166 yield/subprojects/sub/meson.build0000644000175000017500000000052614751453622026670 0ustar buildbuildproject('subbie') assert( get_option('unshared_option') == 'three', 'Unshared option has wrong value in subproject.', ) assert( get_option('shared_option') == 'two', 'Shared option has wrong value in subproject.', ) assert( get_option('wrongtype_option') == true, 'Wrongtype option has wrong value in subproject.', ) muon-v0.4.0/subprojects/meson-tests/common/166 yield/meson_options.txt0000644000175000017500000000025114751453622025022 0ustar buildbuildoption('unshared_option', type: 'string', value: 'one') option('shared_option', type: 'string', value: 'two') option('wrongtype_option', type: 'string', value: 'three') muon-v0.4.0/subprojects/meson-tests/common/166 yield/meson.build0000644000175000017500000000057114751453622023534 0ustar buildbuildproject('yield_options') subproject('sub') assert( get_option('unshared_option') == 'one', 'Unshared option has wrong value in superproject.', ) assert( get_option('shared_option') == 'two', 'Shared option has wrong value in superproject..', ) assert( get_option('wrongtype_option') == 'three', 'Wrongtype option has wrong value in superproject..', ) muon-v0.4.0/subprojects/meson-tests/common/220 fs module/0002755000175000017500000000000014751453622022130 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/220 fs module/subprojects/0002755000175000017500000000000014751453622024473 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/220 fs module/subprojects/subbie/0002755000175000017500000000000014751453622025744 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/220 fs module/subprojects/subbie/subsub/0002755000175000017500000000000014751453622027247 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/220 fs module/subprojects/subbie/subsub/subsubfile.txt0000644000175000017500000000004114751453622032144 0ustar buildbuildThank you for looking inside me. muon-v0.4.0/subprojects/meson-tests/common/220 fs module/subprojects/subbie/subsub/meson.build0000644000175000017500000000054214751453622031410 0ustar buildbuildassert(fs.exists('subsubfile.txt'), 'Subproject subdir lookup failed.') assert( fs.is_samepath(meson.project_source_root(), meson.current_source_dir() / '..'), 'is_samepath not detecting same directory', ) assert( fs.is_samepath(meson.project_build_root(), meson.current_build_dir() / '..'), 'is_samepath not detecting same directory', ) muon-v0.4.0/subprojects/meson-tests/common/220 fs module/subprojects/subbie/meson.build0000644000175000017500000000125514751453622030107 0ustar buildbuildproject('subbie') fs = import('fs') assert(fs.exists('subprojectfile.txt'), 'Subproject root file not found.') assert( fs.is_samepath(meson.project_source_root(), meson.current_source_dir()), 'is_samepath not detecting same directory', ) assert( fs.is_samepath(meson.project_build_root(), meson.current_build_dir()), 'is_samepath not detecting same directory', ) assert( fs.is_samepath(meson.global_source_root(), meson.current_source_dir() / '../..'), 'is_samepath not detecting same directory', ) assert( fs.is_samepath(meson.global_build_root(), meson.current_build_dir() / '../..'), 'is_samepath not detecting same directory', ) subdir('subsub') muon-v0.4.0/subprojects/meson-tests/common/220 fs module/subprojects/subbie/subprojectfile.txt0000644000175000017500000000005114751453622031517 0ustar buildbuildI'm not empty. So there's at least that. muon-v0.4.0/subprojects/meson-tests/common/220 fs module/subdir/0002755000175000017500000000000014751453622023420 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/220 fs module/subdir/subdirfile.txt0000644000175000017500000000002314751453622026302 0ustar buildbuildI have no content. muon-v0.4.0/subprojects/meson-tests/common/220 fs module/subdir/meson.build0000644000175000017500000000467214751453622025571 0ustar buildbuildsubdirfiles = files('subdirfile.txt') assert(fs.exists('subdirfile.txt'), 'Subdir file lookup is broken.') assert( fs.is_samepath(meson.project_source_root(), '..'), 'is_samepath not detecting same directory', ) assert( fs.is_samepath(meson.project_build_root(), meson.current_build_dir() / '..'), 'is_samepath not detecting same directory', ) assert( fs.is_samepath(subdirfiles[0], 'subdirfile.txt'), 'is_samepath not detecting same directory when using File and str', ) # More relative_to to test subdir/builddir components build_to_src = fs.relative_to(meson.current_source_dir(), meson.current_build_dir()) src_to_build = fs.relative_to(meson.current_build_dir(), meson.current_source_dir()) btgt = executable('btgt', 'btgt.c') ctgt = fs.copyfile('subdirfile.txt') if build_machine.system() == 'windows' # Test that CustomTarget works assert( fs.relative_to('subdirfile.txt', ctgt) == '..\\@0@\\subdirfile.txt'.format(build_to_src), ) assert( fs.relative_to(ctgt, 'subdirfile.txt') == '..\\@0@\\subdirfile.txt'.format(src_to_build), ) # Test that CustomTargetIndex works assert( fs.relative_to('subdirfile.txt', ctgt[0]) == '..\\@0@\\subdirfile.txt'.format(build_to_src), ) assert( fs.relative_to(ctgt[0], 'subdirfile.txt') == '..\\@0@\\subdirfile.txt'.format(src_to_build), ) # Test that BuildTarget works assert( fs.relative_to('subdirfile.txt', btgt) == '..\\@0@\\subdirfile.txt'.format(build_to_src), ) assert( fs.relative_to(btgt, 'subdirfile.txt') == '..\\@0@\\@1@'.format(src_to_build, fs.name(btgt.full_path())), ) else # Test that CustomTarget works assert( fs.relative_to('subdirfile.txt', ctgt) == '../@0@/subdirfile.txt'.format(build_to_src), ) assert( fs.relative_to(ctgt, 'subdirfile.txt') == '../@0@/subdirfile.txt'.format(src_to_build), ) # Test that CustomTargetIndex works assert( fs.relative_to('subdirfile.txt', ctgt[0]) == '../@0@/subdirfile.txt'.format(build_to_src), ) assert( fs.relative_to(ctgt[0], 'subdirfile.txt') == '../@0@/subdirfile.txt'.format(src_to_build), ) # Test that BuildTarget works assert( fs.relative_to('subdirfile.txt', btgt) == '../@0@/subdirfile.txt'.format(build_to_src), ) assert( fs.relative_to(btgt, 'subdirfile.txt') == '../@0@/@1@'.format(src_to_build, fs.name(btgt.full_path())), ) endif muon-v0.4.0/subprojects/meson-tests/common/220 fs module/subdir/btgt.c0000644000175000017500000000004114751453622024515 0ustar buildbuildint main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/220 fs module/meson.build0000644000175000017500000002325014751453622024272 0ustar buildbuildproject('fs module test', 'c') is_windows = build_machine.system() == 'windows' fs = import('fs') # different from meson: files() stores absolute paths, but it seems the fs # functions work on the original relative part of the file, # e.g. fs.replace_suffix(files('meson.build'), '') -> 'meson' # in muon, it results in '/abs/path/to/file/meson'. f = ['meson.build'] btgt = executable('btgt', 'btgt.c') ctgt = fs.copyfile('ctgt.txt') assert(fs.exists('meson.build'), 'Existing file reported as missing.') assert(not fs.exists('nonexisting'), 'Nonexisting file was found.') if not is_windows and build_machine.system() != 'cygwin' # Symlinks on Windows have specific requirements including: # * Meson running under Python >= 3.8 # * Windows user permissions to create symlinks, and/or Windows in Developer mode # so at this time the symlink test is skipped for Windows. symlink = meson.current_build_dir() / 'a_symlink' run_command( 'ln', '-s', '-f', meson.current_source_dir() / 'meson.build', symlink, check: true, ) assert(fs.is_symlink(symlink), 'Symlink not detected.') assert(not fs.is_symlink('meson.build'), 'Regular file detected as symlink.') assert(not fs.is_symlink(f[0]), 'Regular file detected as symlink.') endif assert(fs.is_file('meson.build'), 'File not detected as a file.') assert(not fs.is_file('subprojects'), 'Directory detected as a file.') assert(not fs.is_file('nonexisting'), 'Bad path detected as a file.') assert(fs.is_dir('subprojects'), 'Dir not detected correctly.') assert(not fs.is_dir('meson.build'), 'File detected as a dir.') assert(not fs.is_dir('nonexisting'), 'Bad path detected as a dir.') assert(fs.is_dir('~'), 'home directory not detected') assert(not fs.is_file('~'), 'home directory detected as file') # -- expanduser assert(fs.expanduser('~') != '~', 'expanduser failed') assert(fs.expanduser('~/foo').endswith('foo'), 'expanduser with tail failed') # -- as_posix assert(fs.as_posix('/') == '/', 'as_posix idempotent') assert(fs.as_posix('\\') == '/', 'as_posix simple') assert(fs.as_posix('\\\\') == '/', 'as_posix simple') assert(fs.as_posix('foo\\bar/baz') == 'foo/bar/baz', 'as_posix mixed slash') # -- is_absolute winabs = 'q:/foo' unixabs = '/foo' if is_windows assert(fs.is_absolute(winabs), 'is_absolute windows not detected') assert(not fs.is_absolute(unixabs), 'is_absolute unix false positive') else assert(fs.is_absolute(unixabs), 'is_absolute unix not detected') assert(not fs.is_absolute(winabs), 'is_absolute windows false positive') endif # -- replace_suffix original = 'foo' assert(fs.replace_suffix(original, '') == original, 'replace_suffix idempotent') assert(fs.replace_suffix(f[0], '') == 'meson', 'replace_suffix trim') original = 'foo.txt' new = fs.replace_suffix(original, '.ini') assert(new == 'foo.ini', 'replace_suffix failed') new = fs.replace_suffix(f[0], '.ini') assert(new == 'meson.ini', 'replace_suffix failed') original = 'foo' new = fs.replace_suffix(original, '.ini') assert(new == 'foo.ini', 'replace_suffix did not add suffix to suffixless file') original = 'foo.dll.a' new = fs.replace_suffix(original, '.so') assert(new == 'foo.dll.so', 'replace_suffix did not only modify last suffix') original = 'foo.dll' new = fs.replace_suffix(original, '') assert(new == 'foo', 'replace_suffix did not only delete last suffix') # `/` on windows is interpreted like `.drive` which in general may not be `c:/` # the files need not exist for fs.replace_suffix() original = is_windows ? 'j:/foo/bar.txt' : '/foo/bar.txt' new_check = is_windows ? 'j:\\foo\\bar.ini' : '/foo/bar.ini' new = fs.replace_suffix(original, '.ini') assert(new == new_check, 'absolute path replace_suffix failed') new = fs.replace_suffix(btgt, '.ini') assert(new == 'btgt.ini', 'replace_suffix failed for build target') # different than meson: custom target outputs are stored as absolute paths so # fs functions working on them return absolute paths new = fs.replace_suffix(ctgt, '.ini') assert(fs.name(new) == 'ctgt.ini', 'replace_suffix failed for custom target') new = fs.replace_suffix(ctgt[0], '.ini') assert( fs.name(new) == 'ctgt.ini', 'replace_suffix failed for custom target index', ) # -- hash # TODO: md5 algorithm, (meson docs say hash supports md5, sha1, sha224, sha256, # sha384, and sha512) # md5 = fs.hash('subdir/subdirfile.txt', 'md5') sha256 = fs.hash('subdir/subdirfile.txt', 'sha256') # assert(md5 == 'd0795db41614d25affdd548314b30b3b', 'md5sum did not match') assert( sha256 == 'be2170b0dae535b73f6775694fffa3fd726a43b5fabea11b7342f0605917a42a', 'sha256sum did not match', ) f = files('subdir/subdirfile.txt') # md5 = fs.hash(f[0], 'md5') # assert(md5 == 'd0795db41614d25affdd548314b30b3b', 'md5sum did not match') sha256 = fs.hash(f[0], 'sha256') assert( sha256 == 'be2170b0dae535b73f6775694fffa3fd726a43b5fabea11b7342f0605917a42a', 'sha256sum did not match', ) # -- size size = fs.size('subdir/subdirfile.txt') assert(size == 19, 'file size not found correctly') size = fs.size(f[0]) assert(size == 19, 'file size not found correctly') # -- are filenames referring to the same file? f1 = 'meson.build' f2 = 'subdir/../meson.build' assert(fs.is_samepath(f1, f2), 'is_samepath not detecting same files') assert( fs.is_samepath(meson.source_root(), 'subdir/..'), 'is_samepath not detecting same directory', ) assert( fs.is_samepath(meson.project_source_root(), 'subdir/..'), 'is_samepath not detecting same directory', ) assert( fs.is_samepath(meson.project_build_root(), meson.current_build_dir() / 'subdir/..'), 'is_samepath not detecting same directory', ) assert( fs.is_samepath(meson.global_source_root(), meson.current_source_dir()), 'is_samepath not detecting same directory', ) assert( fs.is_samepath(meson.global_build_root(), meson.current_build_dir()), 'is_samepath not detecting same directory', ) assert( not fs.is_samepath(f1, 'subdir/subdirfile.txt'), 'is_samepath known bad comparison', ) assert( not fs.is_samepath('not-a-path', f2), 'is_samepath should not error if path(s) do not exist', ) f = files('subdir/../meson.build', 'meson.build') assert(fs.is_samepath(f[0], f[1]), 'is_samepath not detecting same files') # TODO: implement readlink # if not is_windows and build_machine.system() != 'cygwin' # assert(fs.is_samepath(symlink, 'meson.build'), 'symlink is_samepath fail') # endif # parts of path assert(fs.parent('foo/bar') == 'foo', 'failed to get dirname') # different than meson: See the above note about fs functions working on the # relative part of the file. if not is_windows assert( fs.is_samepath(fs.parent(f[1]), 'subdir/..'), 'failed to get dirname', ) else assert( fs.is_samepath(fs.parent(f[1]), 'subdir\..'), 'failed to get dirname', ) endif assert(fs.parent(btgt) == '.', 'failed to get dirname for build target') assert( fs.parent(ctgt) == meson.current_build_dir(), 'failed to get dirname for custom target', ) assert( fs.parent(ctgt[0]) == meson.current_build_dir(), 'failed to get dirname for custom target index', ) assert(fs.name('foo/bar') == 'bar', 'failed to get basename') assert(fs.name(f[1]) == 'meson.build', 'failed to get basename') assert( fs.name('foo/bar/baz.dll.a') == 'baz.dll.a', 'failed to get basename with compound suffix', ) if host_machine.system() in ['cygwin', 'windows'] assert(fs.name(btgt) == 'btgt.exe', 'failed to get basename of build target') else assert(fs.name(btgt) == 'btgt', 'failed to get basename of build target') endif assert(fs.name(ctgt) == 'ctgt.txt', 'failed to get basename of custom target') assert( fs.name(ctgt[0]) == 'ctgt.txt', 'failed to get basename of custom target index', ) assert(fs.stem('foo/bar/baz.dll') == 'baz', 'failed to get stem with suffix') assert( fs.stem('foo/bar/baz.dll.a') == 'baz.dll', 'failed to get stem with compound suffix', ) assert(fs.stem(btgt) == 'btgt', 'failed to get stem of build target') assert(fs.stem(ctgt) == 'ctgt', 'failed to get stem of custom target') assert(fs.stem(ctgt[0]) == 'ctgt', 'failed to get stem of custom target index') # relative_to if build_machine.system() == 'windows' # strings assert(fs.relative_to('c:\\prefix\\lib\\foo', 'c:\\prefix') == 'lib\\foo') assert(fs.relative_to('c:\\prefix\\lib', 'c:\\prefix\\bin') == '..\\lib') assert(fs.relative_to('c:\\proj1\\foo', 'd:\\proj1\\bar') == 'c:\\proj1\\foo') assert(fs.relative_to('prefix\\lib\\foo', 'prefix') == 'lib\\foo') assert(fs.relative_to('prefix\\lib', 'prefix\\bin') == '..\\lib') assert(fs.relative_to('proj1\\foo', 'proj1\\bar') == '..\\foo') assert( fs.relative_to('subdir/subdirfile.txt', meson.current_source_dir()) == 'subdir\\subdirfile.txt', ) assert( fs.relative_to(files('meson.build'), files('subdir/meson.build')) == '..\\..\\meson.build', ) assert( fs.relative_to(files('meson.build'), 'subdir/meson.build') == '..\\..\\meson.build', ) else # strings assert(fs.relative_to('/prefix/lib/foo', '/prefix') == 'lib/foo') assert(fs.relative_to('/prefix/lib', '/prefix/bin') == '../lib') assert(fs.relative_to('prefix/lib/foo', 'prefix') == 'lib/foo') assert(fs.relative_to('prefix/lib', 'prefix/bin') == '../lib') assert( fs.relative_to('subdir/subdirfile.txt', meson.current_source_dir()) == 'subdir/subdirfile.txt', ) assert( fs.relative_to(files('meson.build'), files('subdir/meson.build')) == '../../meson.build', ) assert( fs.relative_to(files('meson.build'), 'subdir/meson.build') == '../../meson.build', ) endif subdir('subdir') subproject('subbie') # testcase expect_error('File notfound does not exist.') # fs.read('notfound') # endtestcase muon-v0.4.0/subprojects/meson-tests/common/220 fs module/ctgt.txt0000644000175000017500000000000014751453622023616 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/220 fs module/btgt.c0000644000175000017500000000004114751453622023225 0ustar buildbuildint main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/4 shared/0002755000175000017500000000000014751453622021360 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/4 shared/libfile.c0000644000175000017500000000052414751453622023131 0ustar buildbuild#if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllexport) #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif int DLL_PUBLIC libfunc(void) { return 3; } muon-v0.4.0/subprojects/meson-tests/common/4 shared/libfile2.c0000644000175000017500000000073714751453622023221 0ustar buildbuild#if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllexport) #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif #ifndef WORK # error "Did not get shared only arguments" #endif #ifdef BREAK # error "got static only C args, but shouldn't have" #endif int DLL_PUBLIC libfunc(void) { return 3; } muon-v0.4.0/subprojects/meson-tests/common/4 shared/meson.build0000644000175000017500000000125014751453622023516 0ustar buildbuildproject('shared library test', 'c', default_options: ['default_library=shared']) lib = shared_library('mylib', 'libfile.c') build_target('mylib2', 'libfile.c', target_type: 'shared_library') has_not_changed = false if is_disabler(lib) has_not_changed = true else has_not_changed = true endif assert(has_not_changed, 'Shared library has changed.') assert(not is_disabler(lib), 'Shared library is a disabler.') if get_option('default_library') == 'shared' library('mylib5', 'libfile2.c', c_shared_args: ['-DWORK']) endif build_target( 'mylib4', 'libfile2.c', target_type: 'shared_library', c_shared_args: ['-DWORK'], c_static_args: ['-DBREAK'], ) muon-v0.4.0/subprojects/meson-tests/common/149 dotinclude/0002755000175000017500000000000014751453622022416 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/149 dotinclude/dotproc.c0000644000175000017500000000025514751453622024234 0ustar buildbuild#include"stdio.h" #ifndef WRAPPER_INCLUDED #error The wrapper stdio.h was not included. #endif int main(void) { printf("Eventually I got printed.\n"); return 0; } muon-v0.4.0/subprojects/meson-tests/common/149 dotinclude/meson.build0000644000175000017500000000014414751453622024555 0ustar buildbuildproject('dotinclude', 'c') executable('dotproc', 'dotproc.c', implicit_include_directories: false) muon-v0.4.0/subprojects/meson-tests/common/149 dotinclude/stdio.h0000644000175000017500000000022714751453622023710 0ustar buildbuild// There is no #pragma once because we _want_ to cause an eternal loop // if this wrapper invokes itself. #define WRAPPER_INCLUDED #include muon-v0.4.0/subprojects/meson-tests/common/219 include_type dependency/0002755000175000017500000000000014751453622025045 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/219 include_type dependency/subprojects/0002755000175000017500000000000014751453622027410 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/219 include_type dependency/subprojects/subDep/0002755000175000017500000000000014751453622030632 5ustar buildbuild././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/219 include_type dependency/subprojects/subDep/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/219 include_type dependency/subprojects/subDep/meson.buil0000644000175000017500000000011614751453622032624 0ustar buildbuildproject('subDep', ['cpp']) subDep_dep = declare_dependency(compile_args: []) muon-v0.4.0/subprojects/meson-tests/common/219 include_type dependency/main.cpp0000644000175000017500000000016414751453622026474 0ustar buildbuild#include #include using namespace std; int main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/219 include_type dependency/pch/0002755000175000017500000000000014751453622025617 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/219 include_type dependency/pch/test.hpp0000644000175000017500000000005214751453622027302 0ustar buildbuild#include muon-v0.4.0/subprojects/meson-tests/common/219 include_type dependency/meson.build0000644000175000017500000000411014751453622027201 0ustar buildbuildproject( 'dependency include_type', ['c', 'cpp'], default_options: ['cpp_std=c++11'], ) dep = dependency('zlib', method: 'pkg-config', required: false) # boost_dep = dependency( # 'boost', # modules: ['graph'], # include_type: 'system', # required: false, # ) if not dep.found() error('MESON_SKIP_TEST zlib was not found') endif # if not boost_dep.found() # error('MESON_SKIP_TEST boost was not found') # endif assert( dep.include_type() == 'preserve', 'include_type must default to "preserve"', ) dep_sys = dep.as_system() assert(dep_sys.include_type() == 'system', 'as_system must return a system dep') dep2 = dependency('zlib', method: 'pkg-config', include_type: 'system') assert(dep2.include_type() == 'system', 'include_type must be true when set') dep2_sys = dep2.as_system('non-system') assert( dep2_sys.include_type() == 'non-system', 'as_system must set include_type correctly', ) sp = subproject('subDep') sp_dep = sp.get_variable('subDep_dep') assert(sp_dep.include_type() == 'preserve', 'default is preserve') sp_dep_sys = sp_dep.as_system('system') assert(sp_dep_sys.include_type() == 'system', 'changing include_type works') assert( sp_dep.include_type() == 'preserve', 'as_system must not mutate the original object', ) fallback = dependency( 'sdffgagf_does_not_exist', include_type: 'system', fallback: ['subDep', 'subDep_dep'], ) assert( fallback.include_type() == 'system', 'include_type works with dependency fallback', ) fallback_empty = dependency( '', include_type: 'system', fallback: ['subDep', 'subDep_dep'], # different than meson: you must explicitly say require: false with '' required: false, ) assert( fallback_empty.include_type() == 'system', 'include_type works with empty name dependency fallback', ) # Check that PCH works with `include_type : 'system'` See https://github.com/mesonbuild/meson/issues/7167 # main_exe = executable( # 'main_exe', # 'main.cpp', # cpp_pch: 'pch/test.hpp', # dependencies: boost_dep, # ) # test('main_test', main_exe) muon-v0.4.0/subprojects/meson-tests/common/187 args flattening/0002755000175000017500000000000014751453622023336 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/187 args flattening/meson.build0000644000175000017500000000211714751453622025477 0ustar buildbuildproject('args flattening') arr = get_variable('does-not-exist', ['bar', 'baz']) assert(arr == ['bar', 'baz'], 'get_variable with array fallback is broken') set_variable('arr', ['bar', 'baz']) assert(arr == ['bar', 'baz'], 'set_variable(array) is broken') arr = meson.get_cross_property('does-not-exist', ['bar', 'baz']) assert( arr == ['bar', 'baz'], 'meson.get_cross_property with array fallback is broken', ) arr = meson.get_external_property('does-not-exist', ['bar', 'baz']) assert( arr == ['bar', 'baz'], 'meson.get_external_property with array fallback is broken', ) arr = meson.get_external_property('does-not-exist', ['bar', 'baz'], native: true) assert( arr == ['bar', 'baz'], 'meson.get_external_property native:true with array fallback is broken', ) arr = meson.get_external_property('does-not-exist', ['bar', 'baz'], native: false) assert( arr == ['bar', 'baz'], 'meson.get_external_property native:false with array fallback is broken', ) # Test deprecated behaviour # conf = configuration_data() # conf.set(['foo', 'bar']) # message(conf.get('foo')) muon-v0.4.0/subprojects/meson-tests/common/18 includedir/0002755000175000017500000000000014751453622022321 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/18 includedir/meson.build0000644000175000017500000000227614751453622024470 0ustar buildbuildproject('include dir test', 'c') inc = include_directories('include') subdir('src') errormsg = '''Tried to form an absolute path to a dir in the source tree. You should not do that but use relative paths instead, for directories that are part of your project. To get include path to any directory relative to the current dir do incdir = include_directories(dirname) After this incdir will contain both the current source dir as well as the corresponding build dir. It can then be used in any subdirectory and Meson will take care of all the busywork to make paths work. Dirname can even be '.' to mark the current directory. Though you should remember that the current source and build directories are always put in the include directories by default so you only need to do include_directories('.') if you intend to use the result in a different subdirectory. Note that this error message can also be triggered by external dependencies being installed within your source tree - it's not recommended to do this. ''' # testcase expect_error(errormsg) # include_directories(meson.current_source_dir() / 'include') # endtestcase # Test for issue #12217 include_directories(meson.current_source_dir() + 'xyz') muon-v0.4.0/subprojects/meson-tests/common/18 includedir/include/0002755000175000017500000000000014751453622023744 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/18 includedir/include/func.h0000644000175000017500000000007314751453622025046 0ustar buildbuild#ifndef FUNC_H__ #define FUNC_H__ int func(void); #endif muon-v0.4.0/subprojects/meson-tests/common/18 includedir/src/0002755000175000017500000000000014751453622023110 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/18 includedir/src/func.c0000644000175000017500000000006414751453622024205 0ustar buildbuild#include "func.h" int func(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/18 includedir/src/meson.build0000644000175000017500000000031514751453622025247 0ustar buildbuildexe = executable('prog', 'prog.c', 'func.c', include_directories: inc) test('inc test', exe) exe2 = executable('prog2', 'prog.c', 'func.c', include_directories: [['../include']]) test('inc test 2', exe2) muon-v0.4.0/subprojects/meson-tests/common/18 includedir/src/prog.c0000644000175000017500000000007114751453622024217 0ustar buildbuild#include "func.h" int main(void) { return func(); } muon-v0.4.0/subprojects/meson-tests/common/169 source in dep/0002755000175000017500000000000014751453622022706 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/169 source in dep/meson.build0000644000175000017500000000021514751453622025044 0ustar buildbuildproject('foo', 'c', 'cpp') dep = declare_dependency(sources: 'foo.c') executable('bar', 'bar.cpp', dependencies: dep) subdir('generated') muon-v0.4.0/subprojects/meson-tests/common/169 source in dep/generated/0002755000175000017500000000000014751453622024644 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/169 source in dep/generated/main.c0000644000175000017500000000012414751453622025727 0ustar buildbuild#include"funheader.h" int main(void) { return my_wonderful_function() != 42; } muon-v0.4.0/subprojects/meson-tests/common/169 source in dep/generated/genheader.py0000755000175000017500000000033314751453622027140 0ustar buildbuild#!/usr/bin/env python3 import sys ifile = sys.argv[1] ofile = sys.argv[2] templ = '''#pragma once int %s(void) { return 42; } ''' funname = open(ifile).readline().strip() open(ofile, 'w').write(templ % funname) muon-v0.4.0/subprojects/meson-tests/common/169 source in dep/generated/meson.build0000644000175000017500000000043014751453622027001 0ustar buildbuildfp = find_program('genheader.py') genh = custom_target( 'genh', input: 'funname', output: 'funheader.h', command: [fp, '@INPUT@', '@OUTPUT@'], ) dep = declare_dependency(sources: [genh]) e = executable('genuser', 'main.c', dependencies: dep) test('genuser', e) muon-v0.4.0/subprojects/meson-tests/common/169 source in dep/generated/funname0000644000175000017500000000002614751453622026214 0ustar buildbuildmy_wonderful_function muon-v0.4.0/subprojects/meson-tests/common/169 source in dep/foo.c0000644000175000017500000000004114751453622023626 0ustar buildbuildint foo(void) { return 42; } muon-v0.4.0/subprojects/meson-tests/common/169 source in dep/bar.cpp0000644000175000017500000000010614751453622024151 0ustar buildbuildextern "C" int foo(void); int main(void) { return foo() != 42; } muon-v0.4.0/subprojects/meson-tests/common/225 link language/0002755000175000017500000000000014751453622022760 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/225 link language/c_linkage.h0000644000175000017500000000013114751453622025036 0ustar buildbuild #ifdef __cplusplus extern "C" { #endif int makeInt(void); #ifdef __cplusplus } #endif muon-v0.4.0/subprojects/meson-tests/common/225 link language/main.c0000644000175000017500000000010114751453622024036 0ustar buildbuild#include "c_linkage.h" int main(void) { return makeInt(); } muon-v0.4.0/subprojects/meson-tests/common/225 link language/c_linkage.cpp0000644000175000017500000000007714751453622025402 0ustar buildbuildextern "C" { int makeInt(void) { return 0; } } muon-v0.4.0/subprojects/meson-tests/common/225 link language/meson.build0000644000175000017500000000034714751453622025124 0ustar buildbuildproject( 'link_language', ['c', 'cpp'], ) exe = executable( 'main', ['main.c', 'c_linkage.cpp'], link_language: 'c', ) lib = library( 'mylib', ['lib.cpp'], link_language: 'c', ) test('main', exe) muon-v0.4.0/subprojects/meson-tests/common/225 link language/lib.cpp0000644000175000017500000000007714751453622024234 0ustar buildbuildextern "C" { int makeInt(void) { return 1; } } muon-v0.4.0/subprojects/meson-tests/common/185 same target name/0002755000175000017500000000000014751453622023361 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/185 same target name/sub/0002755000175000017500000000000014751453622024152 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/185 same target name/sub/file2.c0000644000175000017500000000004114751453622025310 0ustar buildbuildint func(void) { return 5; } muon-v0.4.0/subprojects/meson-tests/common/185 same target name/sub/meson.build0000644000175000017500000000004114751453622026305 0ustar buildbuildstatic_library('foo', 'file2.c') muon-v0.4.0/subprojects/meson-tests/common/185 same target name/file.c0000644000175000017500000000004114751453622024435 0ustar buildbuildint func(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/185 same target name/meson.build0000644000175000017500000000011114751453622025512 0ustar buildbuildproject('same name', 'c') static_library('foo', 'file.c') subdir('sub') muon-v0.4.0/subprojects/meson-tests/common/135 custom target object output/0002755000175000017500000000000014751453622025610 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/135 custom target object output/progdir/0002755000175000017500000000000014751453622027256 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/135 custom target object output/progdir/meson.build0000644000175000017500000000005114751453622031412 0ustar buildbuilde = executable('prog', 'prog.c', object) muon-v0.4.0/subprojects/meson-tests/common/135 custom target object output/progdir/prog.c0000644000175000017500000000010714751453622030365 0ustar buildbuildint func1_in_obj(void); int main(void) { return func1_in_obj(); } muon-v0.4.0/subprojects/meson-tests/common/135 custom target object output/meson.build0000644000175000017500000000046214751453622027752 0ustar buildbuildproject('custom target object output', 'c') comp = find_program('obj_generator.py') if host_machine.system() == 'windows' outputname = '@BASENAME@.obj' else outputname = '@BASENAME@.o' endif cc = meson.get_compiler('c').cmd_array().get(-1) subdir('objdir') subdir('progdir') test('objgen', e) muon-v0.4.0/subprojects/meson-tests/common/135 custom target object output/obj_generator.py0000644000175000017500000000101314751453622030773 0ustar buildbuild#!/usr/bin/env python3 # Mimic a binary that generates an object file (e.g. windres). import sys, subprocess if __name__ == '__main__': if len(sys.argv) != 4: print(sys.argv[0], 'compiler input_file output_file') sys.exit(1) compiler = sys.argv[1] ifile = sys.argv[2] ofile = sys.argv[3] if compiler.endswith('cl'): cmd = [compiler, '/nologo', '/MDd', '/Fo' + ofile, '/c', ifile] else: cmd = [compiler, '-c', ifile, '-o', ofile] sys.exit(subprocess.call(cmd)) muon-v0.4.0/subprojects/meson-tests/common/135 custom target object output/objdir/0002755000175000017500000000000014751453622027061 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/135 custom target object output/objdir/source.c0000644000175000017500000000005114751453622030517 0ustar buildbuildint func1_in_obj(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/135 custom target object output/objdir/meson.build0000644000175000017500000000025314751453622031221 0ustar buildbuild# Generate an object file manually. object = custom_target( 'object', input: 'source.c', output: outputname, command: [comp, cc, '@INPUT@', '@OUTPUT@'], ) muon-v0.4.0/subprojects/meson-tests/common/8 install/0002755000175000017500000000000014751453622021564 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/8 install/gendir.py0000755000175000017500000000024514751453622023410 0ustar buildbuild#!/usr/bin/env python3 import sys, os dirname = sys.argv[1] fname = os.path.join(dirname, 'file.txt') os.makedirs(dirname, exist_ok=True) open(fname, 'w').close() muon-v0.4.0/subprojects/meson-tests/common/8 install/meson.build0000644000175000017500000000054214751453622023725 0ustar buildbuildproject('install test', 'c', default_options: ['libdir=libtest']) stlib = static_library('stat', 'stat.c', install: true) exe = executable('prog', 'prog.c', install: true) dirtarget = custom_target( 'dirtarget', output: ['dir'], install: true, command: [find_program('gendir.py'), '@OUTPUT@'], install_dir: get_option('datadir'), ) muon-v0.4.0/subprojects/meson-tests/common/8 install/test.json0000644000175000017500000000044114751453622023433 0ustar buildbuild{ "installed": [ { "type": "exe", "file": "usr/bin/prog" }, { "type": "pdb", "file": "usr/bin/prog" }, { "type": "file", "file": "usr/share/dir/file.txt" }, { "type": "file", "file": "usr/libtest/libstat.a" } ], "do_not_set_opts": ["libdir"] } muon-v0.4.0/subprojects/meson-tests/common/8 install/stat.c0000644000175000017500000000003714751453622022701 0ustar buildbuildint func(void) { return 933; } muon-v0.4.0/subprojects/meson-tests/common/8 install/prog.c0000644000175000017500000000004114751453622022670 0ustar buildbuildint main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/261 testcase clause/0002755000175000017500000000000014751453622023327 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/261 testcase clause/meson.build0000644000175000017500000000211114751453622025462 0ustar buildbuildproject('testcase clause') # To make sure unreachable code is not executed. unreachable = true # Verify assertion exception gets catched and dropped. # testcase expect_error('Assert failed: false') # assert(false) # unreachable = false # endtestcase assert(unreachable) # The inner testcase raises an exception because it did not receive the expected # error message. The outer testcase catches the inner testcase exception and # drop it. # testcase expect_error('Expecting error \'something\' but got \'Assert failed: false\'') # testcase expect_error('something') # assert(false) # unreachable = false # endtestcase # unreachable = false # endtestcase assert(unreachable) # The inner testcase raises an exception because it did not receive an # exception. The outer testcase catches the inner testcase exception and # drop it. # testcase expect_error('Expecting an error but code block succeeded') # testcase expect_error('something') # reached = true # endtestcase # unreachable = false # endtestcase # assert(reached) assert(unreachable) message('all good') muon-v0.4.0/subprojects/meson-tests/common/261 testcase clause/test.json0000644000175000017500000000014414751453622025176 0ustar buildbuild{ "stdout": [ { "line": ".*all good", "match": "re", "count": 1 } ] } muon-v0.4.0/subprojects/meson-tests/common/65 build always/0002755000175000017500000000000014751453622022561 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/65 build always/main.c0000644000175000017500000000017014751453622023645 0ustar buildbuild#include #include"version.h" int main(void) { printf("Version is %s.\n", version_string); return 0; } muon-v0.4.0/subprojects/meson-tests/common/65 build always/version.c.in0000644000175000017500000000007714751453622025021 0ustar buildbuild#include"version.h" const char *version_string = "@VERSION@"; muon-v0.4.0/subprojects/meson-tests/common/65 build always/meson.build0000644000175000017500000000050114751453622024715 0ustar buildbuildproject('run always', 'c') version = '1.0.0' vgen = find_program('version_gen.py') version_src = custom_target( 'Version string', input: 'version.c.in', output: 'version.c', command: [vgen, '@INPUT@', '@OUTPUT@', version], build_always: true, ) executable('versionprinter', 'main.c', version_src) muon-v0.4.0/subprojects/meson-tests/common/65 build always/version_gen.py0000755000175000017500000000147014751453622025454 0ustar buildbuild#!/usr/bin/env python3 import sys, os, subprocess def generate(infile, outfile, fallback): workdir = os.path.split(infile)[0] if workdir == '': workdir = '.' try: version = subprocess.check_output(['git', 'describe'], cwd=workdir).decode().strip() except (subprocess.CalledProcessError, OSError, UnicodeDecodeError): version = fallback with open(infile) as f: newdata = f.read().replace('@VERSION@', version) try: with open(outfile) as f: olddata = f.read() if olddata == newdata: return except OSError: pass with open(outfile, 'w') as f: f.write(newdata) if __name__ == '__main__': infile = sys.argv[1] outfile = sys.argv[2] fallback = sys.argv[3] generate(infile, outfile, fallback) muon-v0.4.0/subprojects/meson-tests/common/65 build always/version.h0000644000175000017500000000006114751453622024412 0ustar buildbuild#pragma once extern const char *version_string; muon-v0.4.0/subprojects/meson-tests/common/27 multiline string/0002755000175000017500000000000014751453622023470 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/27 multiline string/meson.build0000644000175000017500000000107714751453622025635 0ustar buildbuildproject('multiline string', 'c') x = '''hello again''' y = '''hello again''' if x == y error('Things are wrong.') endif multieol = ''' ''' singleeol = '\n' if multieol != singleeol error('Newline quoting is broken.') endif # And one more for good measure. quote1 = ''' ' '''.strip() quote2 = '\'' if quote1 != quote2 error('Single quote quoting is broken.') endif cc = meson.get_compiler('c') prog = ''' #include int main(void) { int num = 1; printf("%d\n", num); return 0; }''' assert(cc.compiles(prog), 'multiline test compile failed') muon-v0.4.0/subprojects/meson-tests/common/41 test args/0002755000175000017500000000000014751453622022067 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/41 test args/tester.py0000755000175000017500000000034414751453622023751 0ustar buildbuild#!/usr/bin/env python3 import sys import os assert os.environ['MESONTESTING'] == 'picklerror' assert os.environ['TEST_LIST_FLATTENING'] == '1' with open(sys.argv[1]) as f: if f.read() != 'contents\n': sys.exit(1) muon-v0.4.0/subprojects/meson-tests/common/41 test args/env2vars.c0000644000175000017500000000117214751453622024000 0ustar buildbuild#include #include #include int main(void) { if(strcmp(getenv("first"), "something-else") != 0) { fprintf(stderr, "First envvar is wrong. %s\n", getenv("first")); return 1; } if(strcmp(getenv("second"), "val2") != 0) { fprintf(stderr, "Second envvar is wrong.\n"); return 1; } if(strcmp(getenv("third"), "val3:and_more") != 0) { fprintf(stderr, "Third envvar is wrong.\n"); return 1; } if(strstr(getenv("PATH"), "fakepath:") != NULL) { fprintf(stderr, "Third envvar is wrong.\n"); return 1; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/41 test args/envvars.c0000644000175000017500000000116014751453622023713 0ustar buildbuild#include #include #include int main(void) { if(strcmp(getenv("first"), "val1") != 0) { fprintf(stderr, "First envvar is wrong. %s\n", getenv("first")); return 1; } if(strcmp(getenv("second"), "val2") != 0) { fprintf(stderr, "Second envvar is wrong.\n"); return 1; } if(strcmp(getenv("third"), "val3:and_more") != 0) { fprintf(stderr, "Third envvar is wrong.\n"); return 1; } if(strstr(getenv("PATH"), "fakepath:") != NULL) { fprintf(stderr, "Third envvar is wrong.\n"); return 1; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/41 test args/meson.build0000644000175000017500000000312714751453622024232 0ustar buildbuildproject('test features', 'c') e1 = executable('cmd_args', 'cmd_args.c') e2 = executable('envvars', 'envvars.c') e3 = executable('env2vars', 'env2vars.c') env = environment() env.set('first', 'val1') env.set('second', 'val2') env.set('third', 'val3', 'and_more', separator: ':') env.append('PATH', 'fakepath', separator: ':') # Make sure environment objects are copied on assignment and we can # change the copy without affecting the original environment object. env2 = env env2.set('first', 'something-else') test('command line arguments', e1, args: ['first', 'second']) test('environment variables', e2, env: env) test('environment variables 2', e3, env: env2) # https://github.com/mesonbuild/meson/issues/2211#issuecomment-327741571 env_array = ['MESONTESTING=picklerror'] testfile = files('testfile.txt') testerpy = find_program('tester.py') test( 'file arg', testerpy, args: testfile, env: [env_array, 'TEST_LIST_FLATTENING=1'], ) copy = find_program('copyfile.py') tester = executable('tester', 'tester.c') testfilect = custom_target( 'testfile', input: testfile, output: 'outfile.txt', build_by_default: true, command: [copy, '@INPUT@', '@OUTPUT@'], ) test('custom target arg', tester, args: testfilect, env: env_array) # https://github.com/mesonbuild/meson/issues/12327 env = environment() env.append('PATH', 'something') bash = find_program('bash', required: false) if bash.found() custompathtgt = custom_target( 'testpathappend', output: 'nothing.txt', build_always: true, command: [bash, '-c', 'env'], env: env, ) endif muon-v0.4.0/subprojects/meson-tests/common/41 test args/cmd_args.c0000644000175000017500000000066114751453622024013 0ustar buildbuild#include #include int main(int argc, char **argv) { if(argc != 3) { fprintf(stderr, "Incorrect number of arguments.\n"); return 1; } if(strcmp(argv[1], "first") != 0) { fprintf(stderr, "First argument is wrong.\n"); return 1; } if(strcmp(argv[2], "second") != 0) { fprintf(stderr, "Second argument is wrong.\n"); return 1; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/41 test args/testfile.txt0000644000175000017500000000001114751453622024435 0ustar buildbuildcontents muon-v0.4.0/subprojects/meson-tests/common/41 test args/tester.c0000644000175000017500000000134014751453622023535 0ustar buildbuild#include #include #include #include #ifndef _MSC_VER #include #endif int main(int argc, char **argv) { char data[10]; int fd, size; if (argc != 2) { fprintf(stderr, "Incorrect number of arguments, got %i\n", argc); return 1; } fd = open(argv[1], O_RDONLY); if (fd < 0) { fprintf(stderr, "First argument is wrong.\n"); return 1; } size = read(fd, data, 8); if (size < 0) { fprintf(stderr, "Failed to read: %s\n", strerror(errno)); return 1; } if (strncmp(data, "contents", 8) != 0) { fprintf(stderr, "Contents don't match, got %s\n", data); return 1; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/41 test args/copyfile.py0000644000175000017500000000013414751453622024247 0ustar buildbuild#!/usr/bin/env python3 import sys import shutil shutil.copyfile(sys.argv[1], sys.argv[2]) muon-v0.4.0/subprojects/meson-tests/common/111 pathjoin/0002755000175000017500000000000014751453622022065 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/111 pathjoin/meson.build0000644000175000017500000000315114751453622024225 0ustar buildbuildproject('pathjoin') # Test string-args form since that is the canonical way assert(join_paths('foo') == 'foo', 'Single argument join is broken') assert(join_paths('foo', 'bar') == 'foo/bar', 'Path joining is broken') assert(join_paths('foo', 'bar', 'baz') == 'foo/bar/baz', 'Path joining is broken') assert(join_paths('/foo', 'bar') == '/foo/bar', 'Path joining is broken') assert(join_paths('foo', '/bar') == '/bar', 'Absolute path joining is broken') assert(join_paths('/foo', '/bar') == '/bar', 'Absolute path joining is broken') assert(join_paths('/foo', '') == '/foo/', 'Trailing / on path') # Test array form since people are using that too assert(join_paths(['foo']) == 'foo', 'Single argument join is broken') assert(join_paths(['foo', 'bar']) == 'foo/bar', 'Path joining is broken') assert( join_paths(['foo', 'bar', 'baz']) == 'foo/bar/baz', 'Path joining is broken', ) assert(join_paths(['/foo', 'bar']) == '/foo/bar', 'Path joining is broken') assert(join_paths(['foo', '/bar']) == '/bar', 'Absolute path joining is broken') assert(join_paths(['/foo', '/bar']) == '/bar', 'Absolute path joining is broken') assert(join_paths(['/foo', '']) == '/foo/', 'Trailing / on path') # Division operator should do the same as join_paths assert('foo' / 'bar' == 'foo/bar', 'Path division is broken') assert('foo' / 'bar' / 'baz' == 'foo/bar/baz', 'Path division is broken') assert('/foo' / 'bar' == '/foo/bar', 'Path division is broken') assert('foo' / '/bar' == '/bar', 'Absolute path division is broken') assert('/foo' / '/bar' == '/bar', 'Absolute path division is broken') assert('/foo' / '' == '/foo/', 'Trailing / on path') muon-v0.4.0/subprojects/meson-tests/common/54 custom target source output/0002755000175000017500000000000014751453622025562 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/54 custom target source output/main.c0000644000175000017500000000007114751453622026646 0ustar buildbuild#include"mylib.h" int main(void) { return func(); } muon-v0.4.0/subprojects/meson-tests/common/54 custom target source output/meson.build0000644000175000017500000000033214751453622027720 0ustar buildbuildproject('source generation', 'c') ct = custom_target( 'gen', output: ['mylib.h', 'mylib.c'], command: [find_program('generator.py'), '@OUTDIR@'], ) e = executable('prog', 'main.c', ct) test('gentest', e) muon-v0.4.0/subprojects/meson-tests/common/54 custom target source output/generator.py0000755000175000017500000000047114751453622030125 0ustar buildbuild#!/usr/bin/env python3 import sys, os if len(sys.argv) != 2: print(sys.argv[0], '') odir = sys.argv[1] with open(os.path.join(odir, 'mylib.h'), 'w') as f: f.write('int func(void);\n') with open(os.path.join(odir, 'mylib.c'), 'w') as f: f.write('''int func(void) { return 0; } ''') muon-v0.4.0/subprojects/meson-tests/common/214 source set custom target/0002755000175000017500000000000014751453622025073 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/214 source set custom target/a.c0000644000175000017500000000006714751453622025460 0ustar buildbuild#include "all.h" int main(void) { f(); g(); } muon-v0.4.0/subprojects/meson-tests/common/214 source set custom target/all.h0000644000175000017500000000005214751453622026007 0ustar buildbuildextern void f(void); extern void g(void); muon-v0.4.0/subprojects/meson-tests/common/214 source set custom target/f.c0000644000175000017500000000004314751453622025457 0ustar buildbuild#include "all.h" void f(void) { } muon-v0.4.0/subprojects/meson-tests/common/214 source set custom target/meson.build0000644000175000017500000000155514751453622027241 0ustar buildbuild# Try using sourceset with various kinds of generated sources project('a', 'c') cp = find_program('cp.py') source_set = import('sourceset') sources = source_set.source_set() a_c = custom_target( 'gen-custom-target', input: 'a.c', output: 'out_a.c', command: [cp, '@INPUT@', '@OUTPUT@'], ) sources.add(when: 'YES', if_true: a_c) sources.add(when: 'YES', if_true: a_c[0]) f_c = configure_file(input: 'f.c', output: 'out_f.c', copy: true) sources.add(when: 'YES', if_true: f_c) sources.add(when: 'YES', if_true: f_c) gen = generator(cp, output: 'out_@PLAINNAME@', arguments: ['@INPUT@', '@OUTPUT@']) g_c = gen.process(files('g.c')) sources.add(when: 'YES', if_true: g_c) sources.add(when: 'YES', if_true: g_c) conf1 = { 'YES': true, } result1 = sources.apply(conf1) executable('first', sources: result1.sources(), dependencies: result1.dependencies()) muon-v0.4.0/subprojects/meson-tests/common/214 source set custom target/g.c0000644000175000017500000000004314751453622025460 0ustar buildbuild#include "all.h" void g(void) { } muon-v0.4.0/subprojects/meson-tests/common/214 source set custom target/cp.py0000644000175000017500000000013014751453622026037 0ustar buildbuild#! /usr/bin/env python3 import sys from shutil import copyfile copyfile(*sys.argv[1:]) muon-v0.4.0/subprojects/meson-tests/common/276 generator custom_tgt subdir/0002755000175000017500000000000014751453622025675 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/276 generator custom_tgt subdir/meson.build0000644000175000017500000000100414751453622030030 0ustar buildbuildproject('276 generator custom_tgt subdir') python = find_program('python', 'python3', required: true) args = [ # works with python2 or python3 '-c', 'import sys; open(sys.argv[1], "w")', '@OUTPUT0@', ] subdir('include') gen = generator( python, arguments: args + ['@OUTPUT@'], output: '@PLAINNAME@.t', ) custom_target( 'check-headers.stamp', command: [python, args, '@INPUT@'], input: gen.process(test_header), output: 'check-headers.stamp', build_by_default: true, ) muon-v0.4.0/subprojects/meson-tests/common/276 generator custom_tgt subdir/include/0002755000175000017500000000000014751453622027320 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/276 generator custom_tgt subdir/include/meson.build0000644000175000017500000000014514751453622031460 0ustar buildbuildtest_header = custom_target( output: 'test_header.h', command: [python, args, '@OUTPUT@'], ) muon-v0.4.0/subprojects/meson-tests/common/29 compiler id/0002755000175000017500000000000014751453622022370 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/29 compiler id/meson.build0000644000175000017500000000055414751453622024534 0ustar buildbuildproject('compiler_id') # different than meson: fortran not supported foreach lang : ['c', 'cpp', 'objc', 'objcpp'] if not add_languages(lang, required: false) continue endif comp = meson.get_compiler(lang) message(lang + ' compiler name is: ' + comp.get_id()) message(lang + ' linker name is: ' + comp.get_linker_id()) endforeach muon-v0.4.0/subprojects/meson-tests/common/3 static/0002755000175000017500000000000014751453622021400 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/3 static/lib3.c0000644000175000017500000000026514751453622022376 0ustar buildbuildint func3(const int x) { return x + 1; } #ifndef WORK # error "did not get static only C args" #endif #ifdef BREAK # error "got shared only C args, but shouldn't have" #endif muon-v0.4.0/subprojects/meson-tests/common/3 static/libfile.c0000644000175000017500000000004414751453622023146 0ustar buildbuildint libfunc(void) { return 3; } muon-v0.4.0/subprojects/meson-tests/common/3 static/libfile2.c0000644000175000017500000000004514751453622023231 0ustar buildbuildint libfunc2(void) { return 4; } muon-v0.4.0/subprojects/meson-tests/common/3 static/meson_options.txt0000644000175000017500000000015514751453622025034 0ustar buildbuildoption( 'source', type: 'combo', choices: ['libfile.c', 'libfile2.c'], value: 'libfile.c', ) muon-v0.4.0/subprojects/meson-tests/common/3 static/meson.build0000644000175000017500000000130114751453622023533 0ustar buildbuildproject('static library test', 'c') lib = static_library( 'mylib', get_option('source'), link_args: '-THISMUSTNOBEUSED', ) # Static linker needs to ignore all link args. assert(lib.name() == 'mylib') has_not_changed = false if is_disabler(lib) has_not_changed = true else has_not_changed = true endif assert(has_not_changed, 'Static library has changed.') assert(not is_disabler(lib), 'Static library is a disabler.') if get_option('default_library') == 'static' library( 'lib2', 'lib3.c', c_static_args: ['-DWORK'], c_shared_args: ['-DBREAK'], ) endif build_target('lib4', 'lib3.c', c_static_args: ['-DWORK'], target_type: 'static_library') muon-v0.4.0/subprojects/meson-tests/common/13 pch/0002755000175000017500000000000014751453622020744 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/13 pch/linkwhole/0002755000175000017500000000000014751453622022740 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/13 pch/linkwhole/lib1.c0000644000175000017500000000007414751453622023732 0ustar buildbuildvoid func1() { printf("Calling func2."); func2(); } muon-v0.4.0/subprojects/meson-tests/common/13 pch/linkwhole/main.c0000644000175000017500000000020014751453622024016 0ustar buildbuild#include void func1(); int main(int argc, char **argv) { printf("Calling func1\n"); func1(); return 0; } muon-v0.4.0/subprojects/meson-tests/common/13 pch/linkwhole/lib2.c0000644000175000017500000000016614751453622023735 0ustar buildbuild#include void func2() { const char *cl = GetCommandLineA(); printf("Command line was: %s\n", cl); } muon-v0.4.0/subprojects/meson-tests/common/13 pch/linkwhole/pch1/0002755000175000017500000000000014751453622023573 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/13 pch/linkwhole/pch1/pch_one.h0000644000175000017500000000007114751453622025353 0ustar buildbuild#ifndef PCH_ONE #define PCH_ONE #include #endif muon-v0.4.0/subprojects/meson-tests/common/13 pch/linkwhole/meson.build0000644000175000017500000000036114751453622025100 0ustar buildbuild# https://github.com/mesonbuild/meson/issues/10745 l2 = static_library('two', 'lib2.c', c_pch: 'pch2/pch_two.h') l1 = static_library('one', 'lib1.c', c_pch: 'pch1/pch_one.h', link_whole: l2) executable('linkprog', 'main.c', link_with: l1) muon-v0.4.0/subprojects/meson-tests/common/13 pch/linkwhole/pch2/0002755000175000017500000000000014751453622023574 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/13 pch/linkwhole/pch2/pch_two.h0000644000175000017500000000007314751453622025406 0ustar buildbuild#ifndef PCH_TWO #define PCH_TWO #include #endif muon-v0.4.0/subprojects/meson-tests/common/13 pch/withIncludeFile/0002755000175000017500000000000014751453622024023 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/13 pch/withIncludeFile/pch/0002755000175000017500000000000014751453622024575 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/13 pch/withIncludeFile/pch/prog.h0000644000175000017500000000025114751453622025711 0ustar buildbuild#ifndef PROG_H // Header guards for PCH confuse msvc in some situations. // Using them here makes sure we handle this correctly. #define PROG_H #include #endif muon-v0.4.0/subprojects/meson-tests/common/13 pch/withIncludeFile/meson.build0000644000175000017500000000061214751453622026162 0ustar buildbuildcc = meson.get_compiler('c') cc_id = cc.get_id() if cc_id == 'lcc' error('MESON_SKIP_TEST: Elbrus compiler does not support PCH.') endif if cc.get_argument_syntax() == 'gcc' c_args = ['-include', 'locale.h'] elif cc.get_argument_syntax() == 'msvc' c_args = ['/FI' + 'locale.h'] else subdir_done() endif exe = executable('prog', 'prog.c', c_args: c_args, c_pch: 'pch/prog.h') muon-v0.4.0/subprojects/meson-tests/common/13 pch/withIncludeFile/prog.c0000644000175000017500000000044014751453622025132 0ustar buildbuild// No includes here, they need to come from the PCH or explicit inclusion void func(void) { fprintf(stdout, "This is a function that fails if stdio is not #included.\n"); setlocale(LC_ALL, ""); /* This will fail if locale.h is not included */ } int main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/13 pch/meson.build0000644000175000017500000000172414751453622023110 0ustar buildbuildproject('pch test', 'c', 'cpp', meson_version: '>= 0.46.0') cc = meson.get_compiler('c') cc_id = cc.get_id() if cc_id == 'pgi' error( 'MESON_SKIP_TEST: PGI compiler does support PCH, however, PGI cannot tolerate spaces in the --pch_dir path and Meson run_project_tests.py uses spaces in temporary build path names. If this test is run individually with no spaces in build path, it will pass.', ) endif subdir('c') subdir('cpp') subdir('generated') subdir('userDefined') subdir('withIncludeDirectories') if meson.backend() == 'xcode' warning( 'Xcode backend does not support forced includes. Skipping "withIncludeFile" which requires this.', ) else subdir('withIncludeFile') endif if meson.backend() == 'xcode' warning( 'Xcode backend only supports one precompiled header per target. Skipping "mixed" which has various precompiled headers.', ) else subdir('mixed') endif if cc_id == 'msvc' subdir('linkwhole') endif muon-v0.4.0/subprojects/meson-tests/common/13 pch/cpp/0002755000175000017500000000000014751453622021526 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/13 pch/cpp/pch/0002755000175000017500000000000014751453622022300 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/13 pch/cpp/pch/prog.hh0000644000175000017500000000002314751453622023561 0ustar buildbuild#include muon-v0.4.0/subprojects/meson-tests/common/13 pch/cpp/prog.cc0000644000175000017500000000046114751453622023003 0ustar buildbuild// Note: if using PGI compilers, you will need to add #include "prog.hh" // even though you're using precompiled headers. void func(void) { std::cout << "This is a function that fails to compile if iostream is not included." << std::endl; } int main(void) { func(); return 0; } muon-v0.4.0/subprojects/meson-tests/common/13 pch/cpp/meson.build0000644000175000017500000000007414751453622023667 0ustar buildbuildexe = executable('prog', 'prog.cc', cpp_pch: 'pch/prog.hh') muon-v0.4.0/subprojects/meson-tests/common/13 pch/mixed/0002755000175000017500000000000014751453622022052 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/13 pch/mixed/func.c0000644000175000017500000000021614751453622023146 0ustar buildbuildvoid tmp_func(void) { fprintf(stdout, "This is a function that fails if stdio is not #included.\n"); } int cfunc(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/13 pch/mixed/pch/0002755000175000017500000000000014751453622022624 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/13 pch/mixed/pch/main.h0000644000175000017500000000002314751453622023712 0ustar buildbuild#include muon-v0.4.0/subprojects/meson-tests/common/13 pch/mixed/pch/func.h0000644000175000017500000000002214751453622023720 0ustar buildbuild#include muon-v0.4.0/subprojects/meson-tests/common/13 pch/mixed/meson.build0000644000175000017500000000037214751453622024214 0ustar buildbuildcc = meson.get_compiler('c') cc_id = cc.get_id() # PGI compiler only supports PCH for C++ if cc_id == 'pgi' subdir_done() endif exe = executable( 'prog', files('func.c', 'main.cc'), c_pch: 'pch/func.h', cpp_pch: 'pch/main.h', ) muon-v0.4.0/subprojects/meson-tests/common/13 pch/mixed/main.cc0000644000175000017500000000031214751453622023277 0ustar buildbuildextern "C" int cfunc(); void func(void) { std::cout << "This is a function that fails to compile if iostream is not included." << std::endl; } int main(void) { return cfunc(); } muon-v0.4.0/subprojects/meson-tests/common/13 pch/withIncludeDirectories/0002755000175000017500000000000014751453622025420 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/13 pch/withIncludeDirectories/pch/0002755000175000017500000000000014751453622026172 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/13 pch/withIncludeDirectories/pch/prog.h0000644000175000017500000000002414751453622027304 0ustar buildbuild#include muon-v0.4.0/subprojects/meson-tests/common/13 pch/withIncludeDirectories/meson.build0000644000175000017500000000047314751453622027564 0ustar buildbuildcc = meson.get_compiler('c') cc_id = cc.get_id() if cc_id == 'lcc' error('MESON_SKIP_TEST: Elbrus compiler does not support PCH.') endif # PGI compiler only supports PCH for C++ if cc_id == 'pgi' subdir_done() endif exe = executable('prog', 'prog.c', include_directories: 'include', c_pch: 'pch/prog.h') muon-v0.4.0/subprojects/meson-tests/common/13 pch/withIncludeDirectories/include/0002755000175000017500000000000014751453622027043 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/13 pch/withIncludeDirectories/include/lib/0002755000175000017500000000000014751453622027611 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/13 pch/withIncludeDirectories/include/lib/lib.h0000644000175000017500000000002314751453622030521 0ustar buildbuild#include muon-v0.4.0/subprojects/meson-tests/common/13 pch/withIncludeDirectories/prog.c0000644000175000017500000000027614751453622026536 0ustar buildbuild// No includes here, they need to come from the PCH void func(void) { fprintf(stdout, "This is a function that fails if stdio is not #included.\n"); } int main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/13 pch/generated/0002755000175000017500000000000014751453622022702 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/13 pch/generated/generated_generator.in0000644000175000017500000000001614751453622027231 0ustar buildbuild#define BAR 0 muon-v0.4.0/subprojects/meson-tests/common/13 pch/generated/pch/0002755000175000017500000000000014751453622023454 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/13 pch/generated/pch/prog.h0000644000175000017500000000010514751453622024566 0ustar buildbuild#include "generated_customTarget.h" #include "generated_generator.h" muon-v0.4.0/subprojects/meson-tests/common/13 pch/generated/meson.build0000644000175000017500000000125714751453622025047 0ustar buildbuildcc = meson.get_compiler('c') cc_id = cc.get_id() if cc_id == 'lcc' error('MESON_SKIP_TEST: Elbrus compiler does not support PCH.') endif # PGI compiler only supports PCH for C++ if cc_id == 'pgi' subdir_done() endif generated_customTarget = custom_target( 'makeheader', output: 'generated_customTarget.h', command: [find_program('gen_custom.py'), '@OUTPUT0@'], ) generated_generator = generator( find_program('gen_generator.py'), output: '@BASENAME@.h', arguments: ['@INPUT@', '@OUTPUT@'], ) exe = executable( 'prog', 'prog.c', generated_customTarget, generated_generator.process('generated_generator.in'), c_pch: 'pch/prog.h', ) muon-v0.4.0/subprojects/meson-tests/common/13 pch/generated/gen_generator.py0000644000175000017500000000021614751453622026070 0ustar buildbuild#!/usr/bin/env python3 import sys with open(sys.argv[1]) as f: content = f.read() with open(sys.argv[2], 'w') as f: f.write(content) muon-v0.4.0/subprojects/meson-tests/common/13 pch/generated/gen_custom.py0000644000175000017500000000014214751453622025412 0ustar buildbuild#!/usr/bin/env python3 import sys with open(sys.argv[1], 'w') as f: f.write("#define FOO 0") muon-v0.4.0/subprojects/meson-tests/common/13 pch/generated/prog.c0000644000175000017500000000013614751453622024013 0ustar buildbuild// No includes here, they need to come from the PCH int main(void) { return FOO + BAR; } muon-v0.4.0/subprojects/meson-tests/common/13 pch/c/0002755000175000017500000000000014751453622021166 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/13 pch/c/pch/0002755000175000017500000000000014751453622021740 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/13 pch/c/pch/prog.h0000644000175000017500000000025114751453622023054 0ustar buildbuild#ifndef PROG_H // Header guards for PCH confuse msvc in some situations. // Using them here makes sure we handle this correctly. #define PROG_H #include #endif muon-v0.4.0/subprojects/meson-tests/common/13 pch/c/meson.build0000644000175000017500000000043314751453622023326 0ustar buildbuildcc = meson.get_compiler('c') cc_id = cc.get_id() if cc_id == 'lcc' error('MESON_SKIP_TEST: Elbrus compiler does not support PCH.') endif # PGI compiler only supports PCH for C++ if cc_id == 'pgi' subdir_done() endif exe = executable('prog', 'prog.c', c_pch: 'pch/prog.h') muon-v0.4.0/subprojects/meson-tests/common/13 pch/c/prog.c0000644000175000017500000000027614751453622022304 0ustar buildbuild// No includes here, they need to come from the PCH void func(void) { fprintf(stdout, "This is a function that fails if stdio is not #included.\n"); } int main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/13 pch/userDefined/0002755000175000017500000000000014751453622023201 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/13 pch/userDefined/pch/0002755000175000017500000000000014751453622023753 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/13 pch/userDefined/pch/pch.h0000644000175000017500000000001314751453622024666 0ustar buildbuildint foo(); muon-v0.4.0/subprojects/meson-tests/common/13 pch/userDefined/pch/pch.c0000644000175000017500000000006214751453622024665 0ustar buildbuild#include "pch.h" int foo(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/13 pch/userDefined/meson.build0000644000175000017500000000067014751453622025344 0ustar buildbuildcc = meson.get_compiler('c') cc_id = cc.get_id() # User supplied PCH implementation should override the auto # generated one. PCH implementations are only supported for # msvc and generally should not be used at all. Support for # them is only kept for backwards compatibility. if cc_id == 'msvc' # different than meson: User supplied PCH not supported # exe = executable('prog', 'prog.c', c_pch: ['pch/pch.h', 'pch/pch.c']) endif muon-v0.4.0/subprojects/meson-tests/common/13 pch/userDefined/prog.c0000644000175000017500000000040314751453622024307 0ustar buildbuild// No includes here, they need to come from the PCH int main(void) { // Method is implemented in pch.c. // This makes sure that we can properly handle user defined // pch implementation files and not only auto-generated ones. return foo(); } muon-v0.4.0/subprojects/meson-tests/common/249 install_symlink/0002755000175000017500000000000014751453622023501 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/249 install_symlink/meson.build0000644000175000017500000000100614751453622025636 0ustar buildbuildproject('install_emptydir') if build_machine.system() == 'windows' and meson.backend() == 'ninja' error( 'MESON_SKIP_TEST windows does not support symlinks unless root or in development mode', ) endif install_data('datafile.dat', install_dir: 'share/progname/C') install_symlink( 'datafile.dat', pointing_to: '../C/datafile.dat', install_dir: 'share/progname/es', ) install_symlink( 'rename_datafile.dat', pointing_to: '../C/datafile.dat', install_dir: 'share/progname/fr', ) muon-v0.4.0/subprojects/meson-tests/common/249 install_symlink/test.json0000644000175000017500000000035214751453622025351 0ustar buildbuild{ "installed": [ {"type": "file", "file": "usr/share/progname/C/datafile.dat"}, {"type": "file", "file": "usr/share/progname/es/datafile.dat"}, {"type": "file", "file": "usr/share/progname/fr/rename_datafile.dat"} ] } muon-v0.4.0/subprojects/meson-tests/common/249 install_symlink/datafile.dat0000644000175000017500000000002414751453622025736 0ustar buildbuildthis is a data file muon-v0.4.0/subprojects/meson-tests/common/134 compute int/0002755000175000017500000000000014751453622022505 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/134 compute int/foobar.h0000644000175000017500000000014514751453622024124 0ustar buildbuild#ifndef __FOOBAR_H__ #define __FOOBAR_H__ #define FOOBAR_IN_FOOBAR_H 10 #endif /*__FOOBAR_H__*/ muon-v0.4.0/subprojects/meson-tests/common/134 compute int/config.h.in0000644000175000017500000000015614751453622024530 0ustar buildbuild#define INTSIZE @INTSIZE@ #define FOOBAR_IN_CONFIG_H @FOOBAR@ #define MAXINT @MAXINT@ #define MININT @MININT@ muon-v0.4.0/subprojects/meson-tests/common/134 compute int/meson.build0000644000175000017500000000322214751453622024644 0ustar buildbuildproject('compute int', 'c', 'cpp') inc = include_directories('.') # Test with C cc = meson.get_compiler('c') intsize = cc.compute_int('sizeof(int)', low: 1, high: 16, guess: 4) foobar = cc.compute_int( 'FOOBAR_IN_FOOBAR_H', prefix: '#include "foobar.h"', include_directories: inc, ) maxint = cc.compute_int('INT_MAX', prefix: '#include ') minint = cc.compute_int('INT_MIN', prefix: '#include ') # Regression test for the special case -1 that used to fail when cross compiling assert(cc.compute_int('-1') == -1, 'compute_int(-1) failed') cd = configuration_data() cd.set('INTSIZE', intsize) cd.set('FOOBAR', foobar) cd.set('CONFIG', 'config.h') cd.set('MAXINT', maxint) cd.set('MININT', minint) configure_file(input: 'config.h.in', output: 'config.h', configuration: cd) s = configure_file(input: 'prog.c.in', output: 'prog.c', configuration: cd) e = executable('prog', s) test('compute int test', e) # Test with C++ cpp = meson.get_compiler('cpp') intsize = cpp.compute_int('sizeof(int)') foobar = cpp.compute_int( 'FOOBAR_IN_FOOBAR_H', prefix: '#include "foobar.h"', include_directories: inc, ) maxint = cpp.compute_int('INT_MAX', prefix: '#include ') minint = cpp.compute_int('INT_MIN', prefix: '#include ') cdpp = configuration_data() cdpp.set('INTSIZE', intsize) cdpp.set('FOOBAR', foobar) cdpp.set('CONFIG', 'config.hpp') cdpp.set('MAXINT', maxint) cdpp.set('MININT', minint) configure_file(input: 'config.h.in', output: 'config.hpp', configuration: cdpp) spp = configure_file(input: 'prog.c.in', output: 'prog.cc', configuration: cdpp) epp = executable('progpp', spp) test('compute int test c++', epp) muon-v0.4.0/subprojects/meson-tests/common/134 compute int/prog.c.in0000644000175000017500000000140014751453622024216 0ustar buildbuild#include "@CONFIG@" #include #include #include #include "foobar.h" int main(void) { if(INTSIZE != sizeof(int)) { fprintf(stderr, "Mismatch: computed int size %d, actual size %d.\n", INTSIZE, (int)sizeof(int)); return 1; } if(FOOBAR_IN_CONFIG_H != FOOBAR_IN_FOOBAR_H) { fprintf(stderr, "Mismatch: computed int %d, should be %d.\n", FOOBAR_IN_CONFIG_H, FOOBAR_IN_FOOBAR_H); return 1; } if(MAXINT != INT_MAX) { fprintf(stderr, "Mismatch: computed max int %d, should be %d.\n", MAXINT, INT_MAX); return 1; } if(MININT != INT_MIN) { fprintf(stderr, "Mismatch: computed min int %d, should be %d.\n", MININT, INT_MIN); return 1; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/146 library at root/0002755000175000017500000000000014751453622023256 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/146 library at root/meson.build0000644000175000017500000000010614751453622025413 0ustar buildbuildproject('lib@root', 'c') lib = library('lib', 'lib.c') subdir('main') muon-v0.4.0/subprojects/meson-tests/common/146 library at root/main/0002755000175000017500000000000014751453622024202 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/146 library at root/main/main.c0000644000175000017500000000007614751453622025273 0ustar buildbuildextern int fn(void); int main(void) { return 1 + fn(); } muon-v0.4.0/subprojects/meson-tests/common/146 library at root/main/meson.build0000644000175000017500000000011414751453622026336 0ustar buildbuildexe = executable('main', 'main.c', link_with: lib) test('stuff works', exe) muon-v0.4.0/subprojects/meson-tests/common/146 library at root/lib.c0000644000175000017500000000014614751453622024167 0ustar buildbuild#if defined _WIN32 || defined __CYGWIN__ __declspec(dllexport) #endif int fn(void) { return -1; } muon-v0.4.0/subprojects/meson-tests/common/217 test priorities/0002755000175000017500000000000014751453622023411 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/217 test priorities/testprog.py0000644000175000017500000000006714751453622025633 0ustar buildbuild#!/usr/bin/env python3 import sys print(sys.argv[1]) muon-v0.4.0/subprojects/meson-tests/common/217 test priorities/meson.build0000644000175000017500000000047714751453622025561 0ustar buildbuildproject('test priorities') test_prog = find_program('testprog.py') test( 'priority 0', test_prog, args: ['0'], ) test('priority neg 10', test_prog, args: ['-10'], priority: -10) test('priority 1000', test_prog, args: ['1000'], priority: 1000) test('priority 50', test_prog, args: ['50'], priority: 50) muon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/0002755000175000017500000000000014751453622022714 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/simple.c0000644000175000017500000000010114751453622024337 0ustar buildbuild#include"simple.h" int simple_function(void) { return 42; } muon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/simple.h0000644000175000017500000000011014751453622024344 0ustar buildbuild#ifndef SIMPLE_H_ #define SIMPLE_H_ int simple_function(void); #endif muon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/dependencies/0002755000175000017500000000000014751453622025342 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/dependencies/custom.c0000644000175000017500000000005514751453622027016 0ustar buildbuildint custom_function(void) { return 42; } muon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/dependencies/test2.c0000644000175000017500000000015214751453622026543 0ustar buildbuild#include #include int main(void) { if (INC1 + INC2 != 3) return 1; return 0; } muon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/dependencies/internal.c0000644000175000017500000000005714751453622027322 0ustar buildbuildint internal_function(void) { return 42; } muon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/dependencies/main.c0000644000175000017500000000025714751453622026434 0ustar buildbuild#include #ifndef LIBFOO #error LIBFOO should be defined in pkgconfig cflags #endif int main(int argc, char *argv[]) { return simple_function() == 42 ? 0 : 1; } muon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/dependencies/meson.build0000644000175000017500000000560214751453622027505 0ustar buildbuildproject('pkgconfig-gen-dependencies', 'c', version: '1.0') pkgg = import('pkgconfig') # libmain internally use libinternal and expose libexpose in its API exposed_lib = shared_library('libexposed', 'exposed.c') internal_lib = shared_library('libinternal', 'internal.c') main_lib = both_libraries('libmain', 'dummy.c', link_with: [exposed_lib, internal_lib]) custom_lib = shared_library('custom', 'custom.c') pkgg.generate(exposed_lib) # Declare a few different Dependency objects pc_dep = dependency('libfoo', version: '>=1.0') pc_dep_dup = dependency('libfoo', version: '>= 1.0') notfound_dep = dependency('notfound', required: false) threads_dep = dependency('threads') custom_dep = declare_dependency(link_with: custom_lib, compile_args: ['-DCUSTOM']) custom2_dep = declare_dependency(link_args: ['-lcustom2'], compile_args: ['-DCUSTOM2']) exe = executable('test1', 'main.c', dependencies: [pc_dep]) test('Test1', exe) # Generate a PC file: # - Having libmain in libraries should pull implicitly libexposed and libinternal in Libs.private # - Having libexposed in libraries should remove it from Libs.private # - We generated a pc file for libexposed so it should be in Requires instead of Libs # - Having threads_dep in libraries should add '-pthread' in both Libs and Cflags # - Having custom_dep in libraries and libraries_private should only add it in Libs # - Having custom2_dep in libraries_private should not add its Cflags # - Having pc_dep in libraries_private should add it in Requires.private # - pc_dep_dup is the same library and same version, should be ignored # - notfound_dep is not required so it shouldn't appear in the pc file. pkgg.generate( libraries: [ main_lib, exposed_lib, threads_dep, threads_dep, custom_dep, custom_dep, '-pthread', ], libraries_private: [custom_dep, custom2_dep, custom2_dep, pc_dep, pc_dep_dup, notfound_dep], version: '1.0', name: 'dependency-test', filebase: 'dependency-test', description: 'A dependency test.', ) pkgg.generate( name: 'requires-test', version: '1.0', description: 'Dependency Requires field test.', requires: [exposed_lib, pc_dep, 'libhello'], ) pkgg.generate( name: 'requires-private-test', version: '1.0', description: 'Dependency Requires.private field test.', requires_private: [exposed_lib, pc_dep, 'libhello', notfound_dep], ) # Verify that if we promote internal_lib as public dependency, it comes after # the main library. main_lib2 = both_libraries('libmain2', 'dummy.c', link_with: internal_lib) pkgg.generate( main_lib2, libraries: internal_lib, filebase: 'pub-lib-order', ) # This will be built against both simple7.pc and simple7-uninstalled.pc, check # that include directories works in both cases. simple7 = dependency('simple7') exe = executable( 'test2', 'test2.c', dependencies: simple7, ) test('Test2', exe) muon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/dependencies/dummy.c0000644000175000017500000000004214751453622026633 0ustar buildbuildint dummy(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/dependencies/exposed.c0000644000175000017500000000005614751453622027154 0ustar buildbuildint exposed_function(void) { return 42; } muon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/expected/0002755000175000017500000000000014751453622024515 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/expected/libvartest.pc0000644000175000017500000000034414751453622027217 0ustar buildbuildprefix=/usr bindir=${prefix}/bin includedir=${prefix}/include datadir=${prefix}/data foo=${datadir}/foo bar=${bindir}/bar Name: libvartest Description: Check that implicit vars are created Version: 1.0 Cflags: -I${includedir} muon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/expected/libanswer.pc0000644000175000017500000000027614751453622027032 0ustar buildbuildprefix=/usr includedir=${prefix}/include libdir=${prefix}/lib Name: libanswer Description: An answer library. Version: undefined Libs: -L${libdir} -lanswer Cflags: -I${includedir} -DLIBFOO muon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/expected/libfoo.pc0000644000175000017500000000034214751453622026310 0ustar buildbuildprefix=/usr includedir=${prefix}/include libdir=${prefix}/lib foo=bar datadir=${prefix}/data Name: libfoo Description: A foo library. Version: 1.0 Requires: libanswer Libs: -L${libdir} -lfoo Cflags: -I${includedir} -DLIBFOO muon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/expected/simple2.pc0000644000175000017500000000032414751453622026411 0ustar buildbuildprefix=/usr includedir=${prefix}/include libdir=${prefix}/lib Name: simple2 Description: pkgconfig-gen: simple2 Version: undefined Libs: -L${libdir} -lsimple2 -lsimple1 Libs.private: -lz Cflags: -I${includedir} muon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/expected/ct.pc0000644000175000017500000000024514751453622025446 0ustar buildbuildprefix=/usr includedir=${prefix}/include libdir=${prefix}/lib Name: ct Description: custom target Version: undefined Libs: -L${libdir} -lct Cflags: -I${includedir} muon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/expected/simple3.pc0000644000175000017500000000024614751453622026415 0ustar buildbuildprefix=/usr includedir=${prefix}/include libdir=${prefix}/lib Name: simple3 Description: desc Version: undefined Libs: -L${libdir} -lsimple3 Cflags: -I${includedir} muon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/expected/simple.pc0000644000175000017500000000036114751453622026330 0ustar buildbuildprefix=/usr includedir=${prefix}/include libdir=${prefix}/lib Name: libsimple Description: A simple demo library. Version: 1.0 Requires: glib-2.0 Requires.private: gio-2.0, gobject-2.0 Libs: -L${libdir} -lsimple -lz Cflags: -I${includedir} muon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/expected/ct0.pc0000644000175000017500000000025414751453622025526 0ustar buildbuildprefix=/usr includedir=${prefix}/include libdir=${prefix}/lib Name: ct0 Description: custom target index Version: undefined Libs: -L${libdir} -lct Cflags: -I${includedir} muon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/expected/libhello.pc0000644000175000017500000000021214751453622026624 0ustar buildbuildprefix=/usr includedir=${prefix}/include Name: libhello Description: A minimalistic pkgconfig file. Version: 1.0 Cflags: -I${includedir} muon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/expected/simple5.pc0000644000175000017500000000033414751453622026415 0ustar buildbuildprefix=/usr includedir=${prefix}/include libdir=${prefix}/lib Name: simple5 Description: pkgconfig-gen: simple5 Version: undefined Libs: -L${libdir} -lsimple5 Libs.private: -L${libdir} -lsimple4 Cflags: -I${includedir} muon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/expected/libvartest2.pc0000644000175000017500000000027714751453622027306 0ustar buildbuildprefix=/usr includedir=${prefix}/include libdir=${prefix}/lib bar=${libdir}/bar Name: libvartest2 Description: Check that libdir is not an implicit var Version: 1.0 Cflags: -I${includedir} muon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/expected/libhello_nolib.pc0000644000175000017500000000022714751453622030015 0ustar buildbuild foo=bar prefix=/usr escaped_var=hello\ world unescaped_var=hello world Name: libhello_nolib Description: A minimalistic pkgconfig file. Version: 1.0 muon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/expected/simple6.pc0000644000175000017500000000027014751453622026415 0ustar buildbuildprefix=/usr includedir=${prefix}/include libdir=${prefix}/lib Name: simple6 Description: pkgconfig-gen: simple6 Version: undefined Libs: -L${libdir} -lsimple6 Cflags: -I${includedir} muon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/meson.build0000644000175000017500000001615514751453622025064 0ustar buildbuildproject( 'pkgconfig-gen', 'c', meson_version: '>=0.60.0', default_options: ['default_library=shared'], ) # Some CI runners does not have zlib, just skip them as we need some common # external dependency. cc = meson.get_compiler('c') if not cc.find_library('z', required: false).found() error('MESON_SKIP_TEST: zlib missing') endif # First check we have pkg-config >= 0.29 pkgconfig = find_program('pkg-config', native: true, required: false) if not pkgconfig.found() error('MESON_SKIP_TEST: pkg-config not found') endif v = run_command(pkgconfig, '--version', check: true).stdout().strip() if v.version_compare('<0.29') error('MESON_SKIP_TEST: pkg-config version \'' + v + '\' too old') endif python = find_program('python3') fs = import('fs') pkgg = import('pkgconfig') lib = shared_library('simple', 'simple.c') libver = '1.0' install_headers('simple.h') to_validate = [] # generate for systems without a glib pc file pkgg.generate(name: 'glib-2.0', dataonly: true) pkgg.generate( libraries: [lib, '-lz'], subdirs: '.', version: libver, name: 'libsimple', filebase: 'simple', description: 'A simple demo library.', requires: 'glib-2.0', # Not really, but only here to test that this works. requires_private: ['gio-2.0', 'gobject-2.0'], libraries_private: [lib, '-lz'], ) to_validate += 'simple' answerlib = shared_library('answer', 'answer.c') pkgg.generate( answerlib, name: 'libanswer', description: 'An answer library.', extra_cflags: ['-DLIBFOO'], ) to_validate += 'libanswer' # Test that name_prefix='' and name='libfoo' results in '-lfoo' lib2 = shared_library('libfoo', 'foo.c', link_with: answerlib, name_prefix: '', version: libver) pkgg.generate( lib2, libraries: [lib2, answerlib], name: 'libfoo', version: libver, description: 'A foo library.', variables: ['foo=bar', 'datadir=${prefix}/data'], extra_cflags: ['-DLIBFOO'], ) to_validate += 'libfoo' pkgg.generate( name: 'libhello', description: 'A minimalistic pkgconfig file.', version: libver, ) to_validate += 'libhello' pkgg.generate( name: 'libhello_nolib', description: 'A minimalistic pkgconfig file.', version: libver, dataonly: true, variables: { 'foo': 'bar', # prefix is not set by default for dataonly pc files, but it is allowed to # define it manually. 'prefix': get_option('prefix'), 'escaped_var': 'hello world', }, unescaped_variables: { 'unescaped_var': 'hello world', }, ) to_validate += 'libhello_nolib' # Regression test for 2 cases: # - link_whole from InternalDependency used to be ignored, but we should still # recurse to add libraries they link to. In this case it must add `-lsimple1` # in generated pc file. # - dependencies from InternalDependency used to be ignored. In this it must add # `-lz` in generated pc file. simple1 = shared_library('simple1', 'simple.c') stat1 = static_library('stat1', 'simple.c', link_with: simple1) dep = declare_dependency(link_whole: stat1, dependencies: cc.find_library('z')) simple2 = library('simple2', 'simple.c') pkgg.generate(simple2, libraries: dep) to_validate += 'simple2' # Regression test: as_system() does a deepcopy() of the InternalDependency object # which caused `-lsimple3` to be duplicated because generator used to compare # Target instances instead of their id. simple3 = shared_library('simple3', 'simple.c') dep1 = declare_dependency(link_with: simple3) dep2 = dep1.as_system() pkgg.generate(libraries: [dep1, dep2], name: 'simple3', description: 'desc') to_validate += 'simple3' # Regression test: stat2 is both link_with and link_whole, it should not appear # in generated pc file. stat2 = static_library('stat2', 'simple.c', install: true) simple4 = library('simple4', 'simple.c', link_with: stat2) simple5 = library('simple5', 'simple5.c', link_with: simple4, link_whole: stat2) pkgg.generate(simple5) to_validate += 'simple5' # Test passing a linkable CustomTarget and CustomTargetIndex to generator. # Do this only with gcc/clang to not have to deal with other compiler command # line specificities. if cc.get_id() in ['gcc', 'clang'] ct = custom_target( 'ct', input: 'simple.c', output: 'libct.so', command: [cc.cmd_array(), '@INPUT@', '-shared', '-o', '@OUTPUT@'], ) pkgg.generate(libraries: ct, name: 'ct', description: 'custom target') to_validate += 'ct' pkgg.generate( libraries: ct[0], name: 'ct0', description: 'custom target index', ) to_validate += 'ct0' endif # Regression test: A library linking to an uninstalled custom_target static # library used to crash when generating its pkgconfig file. # Copy libstat2.a to libstat3.a to have a static library as custom target. infile = stat2.full_path() outfile = meson.current_build_dir() / 'libstat3.a' script = 'import shutil ; shutil.copyfile("@0@", "@1@")'.format(infile, outfile) ct = custom_target( 'stat3', input: stat2, output: fs.name(outfile), command: [python, '-c', script], ) simple6 = library('simple6', 'dependencies/dummy.c', link_with: ct) pkgg.generate(simple6) to_validate += 'simple6' # implicit variables pkgg.generate( name: 'libvartest', description: 'Check that implicit vars are created', version: libver, variables: [ 'datadir=${prefix}/data', 'foo=${datadir}/foo', 'bar=${bindir}/bar', ], ) to_validate += 'libvartest' pkgg.generate( name: 'libvartest2', description: 'Check that libdir is not an implicit var', version: libver, variables: ['bar=${libdir}/bar'], ) to_validate += 'libvartest2' cmp = find_program('diff') privder = '.muon' env = environment() env.prepend('PKG_CONFIG_PATH', meson.current_build_dir() / privder) foreach pc : to_validate test( 'validate' + pc, pkgconfig, args: ['--validate', pc], env: env, ) test( 'diff ' + pc, cmp, args: [ files('expected' / pc + '.pc'), meson.current_build_dir() / privder / pc + '.pc', ], ) endforeach # Regression test: variables kwarg should listify single string value pkgg.generate( name: 'libvartest3', description: 'Check that variables can be single string', variables: 'foo=bar', ) # without a mainlib, name/description are mandatory # testcase expect_error('pkgconfig.generate: if a library is not passed as a positional argument, the \'name\' keyword argument is required.') # pkgg.generate(description: 'empty data') # endtestcase # testcase expect_error('pkgconfig.generate: if a library is not passed as a positional argument, the \'description\' keyword argument is required.') # pkgg.generate(name: 'foobar') # endtestcase # Make sure the -uninstalled.pc file contains both include directories. # See dependencies/test2.c that gets built against both simple7.pc and # simple7-uninstalled.pc. # different than meson: library with no content is illegal # simple7 = library('simple7', include_directories: 'inc1') # dep = declare_dependency(include_directories: 'inc2') # install_headers('inc1/inc1.h', 'inc2/inc2.h') # pkgg.generate(simple7, libraries: dep) muon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/inc2/0002755000175000017500000000000014751453622023547 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/inc2/inc2.h0000644000175000017500000000001714751453622024547 0ustar buildbuild#define INC2 2 muon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/test.json0000644000175000017500000000350514751453622024567 0ustar buildbuild{ "installed": [ {"type": "file", "file": "usr/include/simple.h"}, {"type": "file", "file": "usr/include/inc1.h"}, {"type": "file", "file": "usr/include/inc2.h"}, {"type": "file", "file": "usr/lib/libstat2.a"}, {"type": "file", "file": "usr/lib/pkgconfig/simple.pc"}, {"type": "file", "file": "usr/lib/pkgconfig/libanswer.pc"}, {"type": "file", "file": "usr/lib/pkgconfig/libfoo.pc"}, {"type": "file", "file": "usr/lib/pkgconfig/libhello.pc"}, {"type": "file", "file": "usr/lib/pkgconfig/libvartest.pc"}, {"type": "file", "file": "usr/lib/pkgconfig/libvartest2.pc"}, {"type": "file", "file": "usr/lib/pkgconfig/libvartest3.pc"}, {"type": "file", "file": "usr/lib/pkgconfig/simple2.pc"}, {"type": "file", "file": "usr/lib/pkgconfig/simple3.pc"}, {"type": "file", "file": "usr/lib/pkgconfig/simple5.pc"}, {"type": "file", "file": "usr/lib/pkgconfig/simple6.pc"}, {"type": "file", "file": "usr/lib/pkgconfig/simple7.pc"}, {"type": "file", "file": "usr/lib/pkgconfig/ct.pc"}, {"type": "file", "file": "usr/lib/pkgconfig/ct0.pc"}, {"type": "file", "file": "usr/share/pkgconfig/libhello_nolib.pc"} ], "stdout": [ { "line": "test cases/common/44 pkgconfig-gen/meson.build:160: WARNING: Project targets '>=0.60.0' but uses feature introduced in '0.62.0': pkgconfig.generate implicit variable for builtin directories." }, { "line": "test cases/common/44 pkgconfig-gen/meson.build:170: WARNING: Project targets '>=0.60.0' but uses feature introduced in '0.62.0': pkgconfig.generate implicit variable for builtin directories.", "count": 0 }, { "comment": "This will either match in the future-deprecated notice summary, or match the warning summary", "line": " * 0.62.0: {'pkgconfig.generate variable for builtin directories'}" } ] } muon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/inc1/0002755000175000017500000000000014751453622023546 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/inc1/inc1.h0000644000175000017500000000001714751453622024545 0ustar buildbuild#define INC1 1 muon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/answer.c0000644000175000017500000000011014751453622024345 0ustar buildbuildint answer_to_life_the_universe_and_everything(void) { return 42; } muon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/simple5.c0000644000175000017500000000007014751453622024431 0ustar buildbuildint simple5(void); int simple5(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/44 pkgconfig-gen/foo.c0000644000175000017500000000024314751453622023640 0ustar buildbuild#include"simple.h" int answer_to_life_the_universe_and_everything (void); int simple_function(void) { return answer_to_life_the_universe_and_everything(); } muon-v0.4.0/subprojects/meson-tests/common/87 default options/0002755000175000017500000000000014751453622023305 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/87 default options/subprojects/0002755000175000017500000000000014751453622025650 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/87 default options/subprojects/sub1/0002755000175000017500000000000014751453622026522 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/87 default options/subprojects/sub1/meson_options.txt0000644000175000017500000000021614751453622032154 0ustar buildbuildoption( 'test_option', type: 'boolean', value: true, description: 'Test option. Superproject overrides default to "false"', ) muon-v0.4.0/subprojects/meson-tests/common/87 default options/subprojects/sub1/meson.build0000644000175000017500000000007414751453622030663 0ustar buildbuildproject('sub1') assert(get_option('test_option') == false) muon-v0.4.0/subprojects/meson-tests/common/87 default options/meson.build0000644000175000017500000000244714751453622025454 0ustar buildbuildproject( 'default options', 'cpp', 'c', default_options: [ 'prefix=/absoluteprefix', 'buildtype=debugoptimized', 'cpp_std=c++11', 'cpp_eh=none', 'warning_level=3', 'sub1:test_option=false', ], ) assert( get_option('buildtype') == 'debugoptimized', 'Build type default value wrong.', ) cpp_eh = get_option('cpp_eh') assert(cpp_eh == 'none', 'EH value is "' + cpp_eh + '" instead of "none"') cpp_std = get_option('cpp_std') assert(cpp_std == 'c++11', 'C++ std value is "' + cpp_std + '" instead of c++11.') w_level = get_option('warning_level') assert(w_level == '3', 'warning level "' + w_level + '" instead of "3"') # FIXME. Since we no longer accept invalid options to c_std etc, # there is no simple way to test this. Gcc does not seem to expose # the C std used in a preprocessor token so we can't check for it. # Think of a way to fix this. # # # Verify that project args are not used when told not to. # # MSVC plain C does not have a simple arg to test so skip it. # if cpp.get_id() != 'msvc' # cc = meson.get_compiler('c') # assert(not cc.compiles('int foobar;'), 'Default arg not used in test.') # assert(cc.compiles('int foobar;', no_builtin_args : true), 'No_builtin did not disable builtins.') # endif subproject('sub1') muon-v0.4.0/subprojects/meson-tests/common/242 custom target feed/0002755000175000017500000000000014751453622023723 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/242 custom target feed/meson.build0000644000175000017500000000127014751453622026063 0ustar buildbuildproject('custom target feed') python3 = import('python3').find_python() # Note that this will not add a dependency to the compiler executable. # Code will not be rebuilt if it changes. comp = '@0@/@1@'.format(meson.current_source_dir(), 'my_compiler.py') mytarget = custom_target( 'bindat', output: 'data.dat', input: 'data_source.txt', feed: true, command: [python3, comp, '@OUTPUT@'], install: true, install_dir: 'subdir', ) ct_output_exists = '''import os, sys if not os.path.exists(sys.argv[1]): print("could not find {!r} in {!r}".format(sys.argv[1], os.getcwd())) sys.exit(1) ''' test('capture-wrote', python3, args: ['-c', ct_output_exists, mytarget]) muon-v0.4.0/subprojects/meson-tests/common/242 custom target feed/test.json0000644000175000017500000000011514751453622025570 0ustar buildbuild{ "installed": [ {"type": "file", "file": "usr/subdir/data.dat"} ] } muon-v0.4.0/subprojects/meson-tests/common/242 custom target feed/data_source.txt0000644000175000017500000000004014751453622026745 0ustar buildbuildThis is a text only input file. muon-v0.4.0/subprojects/meson-tests/common/242 custom target feed/my_compiler.py0000755000175000017500000000056714751453622026625 0ustar buildbuild#!/usr/bin/env python3 import sys if __name__ == '__main__': if len(sys.argv) != 2: print(sys.argv[0], 'output_file') sys.exit(1) ifile = sys.stdin.read() if ifile != 'This is a text only input file.\n': print('Malformed input') sys.exit(1) with open(sys.argv[1], 'w+') as f: f.write('This is a binary output file.') muon-v0.4.0/subprojects/meson-tests/common/118 llvm ir and assembly/0002755000175000017500000000000014751453622024150 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/118 llvm ir and assembly/square-x86_64.S0000644000175000017500000000115714751453622026532 0ustar buildbuild#include "symbol-underscore.h" #ifdef _MSC_VER /* MSVC on Windows */ PUBLIC SYMBOL_NAME(square_unsigned) _TEXT SEGMENT SYMBOL_NAME(square_unsigned) PROC mov eax, ecx imul eax, eax ret SYMBOL_NAME(square_unsigned) ENDP _TEXT ENDS END #else .text .globl SYMBOL_NAME(square_unsigned) # ifdef __linux__ .type square_unsigned, %function #endif # if defined(_WIN32) || defined(__CYGWIN__) /* msabi */ SYMBOL_NAME(square_unsigned): imull %ecx, %ecx movl %ecx, %eax retq # else /* sysvabi */ SYMBOL_NAME(square_unsigned): imull %edi, %edi movl %edi, %eax retq # endif #endif muon-v0.4.0/subprojects/meson-tests/common/118 llvm ir and assembly/symbol-underscore.h0000644000175000017500000000017314751453622027774 0ustar buildbuild#if defined(MESON_TEST__UNDERSCORE_SYMBOL) # define SYMBOL_NAME(name) _##name #else # define SYMBOL_NAME(name) name #endif muon-v0.4.0/subprojects/meson-tests/common/118 llvm ir and assembly/main.c0000644000175000017500000000032314751453622025234 0ustar buildbuild#include unsigned square_unsigned (unsigned a); int main(void) { unsigned int ret = square_unsigned (2); if (ret != 4) { printf("Got %u instead of 4\n", ret); return 1; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/118 llvm ir and assembly/main.cpp0000644000175000017500000000034514751453622025600 0ustar buildbuild#include extern "C" { unsigned square_unsigned (unsigned a); } int main (void) { unsigned int ret = square_unsigned (2); if (ret != 4) { printf("Got %u instead of 4\n", ret); return 1; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/118 llvm ir and assembly/square-x86.S0000644000175000017500000000111114751453622026207 0ustar buildbuild#include "symbol-underscore.h" /* This sadly doesn't test the symbol underscore stuff. I can't figure out how * to not use an automatic stdcall mechanism and do everything manually. */ #ifdef _MSC_VER .386 .MODEL FLAT, C PUBLIC square_unsigned _TEXT SEGMENT square_unsigned PROC var1:DWORD mov eax, var1 imul eax, eax ret square_unsigned ENDP _TEXT ENDS END #else .text .globl SYMBOL_NAME(square_unsigned) # ifdef __linux__ .type square_unsigned, %function #endif SYMBOL_NAME(square_unsigned): movl 4(%esp), %eax imull %eax, %eax retl #endif muon-v0.4.0/subprojects/meson-tests/common/118 llvm ir and assembly/meson.build0000644000175000017500000000744214751453622026317 0ustar buildbuildproject('llvm-ir', 'c', 'cpp') if meson.backend() == 'xcode' error( 'MESON_SKIP_TEST: asm not supported with the Xcode backend. Patches welcome.', ) endif cpu = host_machine.cpu_family() supported_cpus = ['arm', 'aarch64', 'x86', 'x86_64'] foreach lang : ['c', 'cpp'] cc = meson.get_compiler(lang) cc_id = cc.get_id() ## Build a trivial executable with mixed LLVM IR source if cc_id == 'clang' e = executable('square_ir_' + lang, 'square.ll', 'main.' + lang) test('test IR square' + lang, e) endif ## Build a trivial executable with mixed assembly source # This also helps test whether cc.symbols_have_underscore_prefix() is working # properly. This is done by assembling some assembly into an object that will # provide the unsigned_squared() symbol to main.c/cpp. This requires the # C symbol mangling to be known in advance. if cc.symbols_have_underscore_prefix() uscore_args = ['-DMESON_TEST__UNDERSCORE_SYMBOL'] message('underscore is prefixed') else uscore_args = [] message('underscore is NOT prefixed') endif square_base = 'square-' + cpu square_impl = square_base + '.S' # MSVC cannot directly compile assembly files, so we pass it through the # cl.exe pre-processor first and then assemble it with ml.exe or armasm.exe # assembler. Then we can link it into the executable. if cc.get_argument_syntax() == 'msvc' cl = cc.cmd_array() if cpu == 'x86' asmcmd = 'ml' elif cpu == 'x86_64' asmcmd = 'ml64' elif cpu == 'aarch64' asmcmd = 'armasm64' elif cpu == 'arm' asmcmd = 'armasm' else error('Unsupported cpu family: "' + cpu + '"') endif ml = find_program(asmcmd, required: false) if not ml.found() error('MESON_SKIP_TEST: Microsoft assembler (ml/armasm) not found') endif # Preprocess file (ml doesn't support pre-processing) # Force the input to be C (/Tc) because ICL otherwise assumes it's an object (.obj) file preproc_name = lang + square_base + '.i' square_preproc = custom_target( lang + square_impl + 'preproc', input: square_impl, output: preproc_name, command: [ cl, '/nologo', '/EP', '/P', '/Fi' + preproc_name, '/Tc', '@INPUT@', ] + uscore_args, ) # Use assembled object file instead of the original .S assembly source if asmcmd.startswith('armasm') square_impl = custom_target( lang + square_impl, input: square_preproc, output: lang + square_base + '.obj', command: [ml, '-nologo', '-o', '@OUTPUT@', '@INPUT@'], ) else square_impl = custom_target( lang + square_impl, input: square_preproc, output: lang + square_base + '.obj', command: [ ml, '/nologo', '/safeseh', '/Fo', '@OUTPUT@', '/c', '@INPUT@', ], ) endif endif if supported_cpus.contains(cpu) e = executable( 'square_asm_' + lang, square_impl, 'main.' + lang, c_args: uscore_args, cpp_args: uscore_args, ) test('test ASM square' + lang, e) elif cc_id != 'clang' error( 'MESON_SKIP_TEST: Unsupported cpu: "' + cpu + '", and LLVM not found', ) endif endforeach muon-v0.4.0/subprojects/meson-tests/common/118 llvm ir and assembly/square-arm.S0000644000175000017500000000070014751453622026344 0ustar buildbuild#include "symbol-underscore.h" #ifdef _MSC_VER AREA _TEXT, ARM, CODE, READONLY EXPORT SYMBOL_NAME(square_unsigned) SYMBOL_NAME(square_unsigned) PROC mul r1, r0, r0 mov r0, r1 mov pc, lr SYMBOL_NAME(square_unsigned) ENDP END #else .text .globl SYMBOL_NAME(square_unsigned) # ifdef __linux__ .type square_unsigned, %function #endif SYMBOL_NAME(square_unsigned): mul r1, r0, r0 mov r0, r1 mov pc, lr #endif muon-v0.4.0/subprojects/meson-tests/common/118 llvm ir and assembly/square-aarch64.S0000644000175000017500000000066414751453622027026 0ustar buildbuild#include "symbol-underscore.h" #ifdef _MSC_VER AREA _TEXT, ARM64, CODE, READONLY EXPORT SYMBOL_NAME(square_unsigned) SYMBOL_NAME(square_unsigned) PROC mul x1, x0, x0 mov x0, x1 ret SYMBOL_NAME(square_unsigned) ENDP END #else .text .globl SYMBOL_NAME(square_unsigned) # ifdef __linux__ .type square_unsigned, %function #endif SYMBOL_NAME(square_unsigned): mul x1, x0, x0 mov x0, x1 ret #endif muon-v0.4.0/subprojects/meson-tests/common/118 llvm ir and assembly/square.ll0000644000175000017500000000011314751453622025772 0ustar buildbuilddefine i32 @square_unsigned(i32 %a) { %1 = mul i32 %a, %a ret i32 %1 } muon-v0.4.0/subprojects/meson-tests/common/89 default library/0002755000175000017500000000000014751453622023260 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/89 default library/ef.h0000644000175000017500000000062614751453622024025 0ustar buildbuild#pragma once #if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllexport) #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif class Ef { private: int x; public: DLL_PUBLIC Ef(); int DLL_PUBLIC get_x() const; }; muon-v0.4.0/subprojects/meson-tests/common/89 default library/eftest.cpp0000644000175000017500000000036514751453622025260 0ustar buildbuild#include"ef.h" #include int main(int, char **) { Ef var; if(var.get_x() == 99) { std::cout << "All is fine.\n"; return 0; } else { std::cout << "Something went wrong.\n"; return 1; } } muon-v0.4.0/subprojects/meson-tests/common/89 default library/meson.build0000644000175000017500000000051414751453622025420 0ustar buildbuildproject('default library', 'cpp') flib = library('ef', 'ef.cpp') exe = executable('eftest', 'eftest.cpp', link_with: flib) test('eftest', exe) # Same as above, but using build_target() flib2 = build_target('ef2', 'ef.cpp', target_type: 'library') exe2 = executable('eftest2', 'eftest.cpp', link_with: flib2) test('eftest2', exe2) muon-v0.4.0/subprojects/meson-tests/common/89 default library/ef.cpp0000644000175000017500000000014414751453622024353 0ustar buildbuild#include"ef.h" DLL_PUBLIC Ef::Ef() : x(99) { } int DLL_PUBLIC Ef::get_x() const { return x; } muon-v0.4.0/subprojects/meson-tests/common/156 config tool variable/0002755000175000017500000000000014751453622024233 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/156 config tool variable/meson.build0000644000175000017500000000211414751453622026371 0ustar buildbuild# Copyright © 2017 Intel Corporation # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. project('config tool variable', 'cpp') dep_llvm = dependency('llvm', method: 'config-tool', required: false) if not dep_llvm.found() error('MESON_SKIP_TEST LLVM not installed.') endif includedir = dep_llvm.get_configtool_variable('includedir') includedir = join_paths(includedir, 'llvm') if host_machine.system() == 'windows' cmd = run_command(['dir', includedir], check: false) else cmd = run_command(['ls', includedir], check: false) endif assert(cmd.returncode() == 0, 'did not run successfully') muon-v0.4.0/subprojects/meson-tests/common/42 subproject/0002755000175000017500000000000014751453622022354 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/42 subproject/subprojects/0002755000175000017500000000000014751453622024717 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/42 subproject/subprojects/sublib/0002755000175000017500000000000014751453622026177 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/42 subproject/subprojects/sublib/sublicense1.txt0000644000175000017500000000000014751453622031141 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/42 subproject/subprojects/sublib/meson.build0000644000175000017500000000131414751453622030336 0ustar buildbuildproject( 'subproject', 'c', version: '1.0.0', license: ['sublicense1', 'sublicense2'], license_files: ['sublicense1.txt', 'sublicense2.txt'], ) if not meson.is_subproject() error('Claimed to be master project even though we are a subproject.') endif assert(meson.project_name() == 'subproject', 'Incorrect subproject name') if meson.project_version() != '1.0.0' error('Incorrect version string in subproject.') endif i = include_directories('include') l = shared_library( 'sublib', 'sublib.c', include_directories: i, install: false, c_args: '-DBUILDING_SUB=2', ) t = executable('simpletest', 'simpletest.c', include_directories: i, link_with: l) test('plain', t) muon-v0.4.0/subprojects/meson-tests/common/42 subproject/subprojects/sublib/include/0002755000175000017500000000000014751453622027622 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/42 subproject/subprojects/sublib/include/subdefs.h0000644000175000017500000000070314751453622031424 0ustar buildbuild#ifndef SUBDEFS_H_ #define SUBDEFS_H_ #if defined _WIN32 || defined __CYGWIN__ #if defined BUILDING_SUB #define DLL_PUBLIC __declspec(dllexport) #else #define DLL_PUBLIC __declspec(dllimport) #endif #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif int DLL_PUBLIC subfunc(void); #endif muon-v0.4.0/subprojects/meson-tests/common/42 subproject/subprojects/sublib/simpletest.c0000644000175000017500000000011414751453622030526 0ustar buildbuild#include int main(void) { return subfunc() == 42 ? 0 : 1; } muon-v0.4.0/subprojects/meson-tests/common/42 subproject/subprojects/sublib/sublicense2.txt0000644000175000017500000000000014751453622031142 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/42 subproject/subprojects/sublib/sublib.c0000644000175000017500000000010514751453622027615 0ustar buildbuild#include int DLL_PUBLIC subfunc(void) { return 42; } muon-v0.4.0/subprojects/meson-tests/common/42 subproject/user.c0000644000175000017500000000044614751453622023500 0ustar buildbuild#include #include int main(void) { int res; printf("Calling into sublib now.\n"); res = subfunc(); if(res == 42) { printf("Everything is fine.\n"); return 0; } else { printf("Something went wrong.\n"); return 1; } } muon-v0.4.0/subprojects/meson-tests/common/42 subproject/meson.build0000644000175000017500000000173214751453622024517 0ustar buildbuildproject( 'subproj user', 'c', version: '2.3.4', license: 'mylicense', license_files: 'mylicense.txt', ) assert(meson.project_name() == 'subproj user', 'Incorrect project name') sub = subproject('sublib', version: '1.0.0') if meson.project_version() != '2.3.4' error('Incorrect master project version string:' + meson.project_version()) endif if meson.is_subproject() error('Claimed to be a subproject even though we are the master project.') endif inc = sub.get_variable('i') lib = sub.get_variable('l') e = executable('user', 'user.c', include_directories: inc, link_with: lib, install: true) test('subdirtest', e) # I have a feeling this is a very little used feature # different than meson: install_dependency_manifest not supported # meson.install_dependency_manifest('share/sublib/sublib.depmf') unknown_var = sub.get_variable('does-not-exist', []) if unknown_var != [] error('unexpected fallback value for subproject.get_variable()') endif muon-v0.4.0/subprojects/meson-tests/common/42 subproject/test.json0000644000175000017500000000063314751453622024226 0ustar buildbuild{ "installed": [ {"type": "exe", "file": "usr/bin/user"}, {"type": "pdb", "file": "usr/bin/user"}, {"type": "file", "file": "usr/share/sublib/sublib.depmf"}, {"type": "file", "file": "usr/share/sublib/mylicense.txt"}, {"type": "file", "file": "usr/share/sublib/subprojects/sublib/sublicense1.txt"}, {"type": "file", "file": "usr/share/sublib/subprojects/sublib/sublicense2.txt"} ] } muon-v0.4.0/subprojects/meson-tests/common/42 subproject/mylicense.txt0000644000175000017500000000000014751453622025071 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/270 int_to_str_fill/0002755000175000017500000000000014751453622023451 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/270 int_to_str_fill/meson.build0000644000175000017500000000030314751453622025605 0ustar buildbuildproject('test_fill_in_int_to_string') n = 4 assert(n.to_string() == '4') assert(n.to_string(fill: 3) == '004') assert(n.to_string(fill: -3) == '4') n = -4 assert(n.to_string(fill: 3) == '-04') muon-v0.4.0/subprojects/meson-tests/common/34 logic ops/0002755000175000017500000000000014751453622022054 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/34 logic ops/meson.build0000644000175000017500000000216214751453622024215 0ustar buildbuildproject('logicopts') t = true f = false if (true) message('Ok.') else error('Not ok.') endif if (false) error('Not ok.') else message('Ok.') endif if (f) error('Not ok.') else message('Ok.') endif if (t) message('Ok.') else error('Not ok.') endif if true and t message('Ok.') else error('Not ok.') endif if t and false error('Not ok.') else message('Ok.') endif if f and t error('Not ok.') else message('Ok.') endif if f or false error('Not ok.') else message('Ok.') endif if true or f message('Ok.') else error('Not ok.') endif if t or true message('Ok.') else error('Not ok.') endif if not true error('Negation failed.') else message('Ok.') endif if not f message('Ok.') else error('Negation failed.') endif if f or f or f or f or f or f or f or f or t message('Ok.') else error('Chain of ors failed.') endif if t and t and t and t and t and t and t and t and f error('Chain of ands failed.') else message('Ok.') endif if t and t or t message('Ok.') else error('Combination of and-or failed.') endif muon-v0.4.0/subprojects/meson-tests/common/161 not-found dependency/0002755000175000017500000000000014751453622024266 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/161 not-found dependency/sub/0002755000175000017500000000000014751453622025057 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/161 not-found dependency/sub/meson.build0000644000175000017500000000006114751453622027214 0ustar buildbuilderror('should be disabled by subdir(if_found:)') muon-v0.4.0/subprojects/meson-tests/common/161 not-found dependency/subprojects/0002755000175000017500000000000014751453622026631 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/161 not-found dependency/subprojects/trivial/0002755000175000017500000000000014751453622030303 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/161 not-found dependency/subprojects/trivial/trivial.c0000644000175000017500000000004514751453622032116 0ustar buildbuildint subfunc(void) { return 42; } muon-v0.4.0/subprojects/meson-tests/common/161 not-found dependency/subprojects/trivial/meson.build0000644000175000017500000000024114751453622032440 0ustar buildbuildproject('trivial subproject', 'c') trivial_lib = static_library('trivial', 'trivial.c', install: false) trivial_dep = declare_dependency(link_with: trivial_lib) muon-v0.4.0/subprojects/meson-tests/common/161 not-found dependency/testlib.c0000644000175000017500000000000014751453622026064 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/161 not-found dependency/meson.build0000644000175000017500000000114314751453622026425 0ustar buildbuildproject('dep-test', 'c') dep = dependency('', required: false) if dep.found() error('not-found dependency was found') endif assert( dep.type_name() == 'not-found', 'dependency should be of type "not-found" not ' + dep.type_name(), ) library('testlib', 'testlib.c', dependencies: [dep]) subdir('sub', if_found: dep) # different than meson: dependency '' cannot be required # subdep = dependency('', fallback: ['trivial', 'trivial_dep']) subdep = dependency('', fallback: ['trivial', 'trivial_dep'], required: false) missing = dependency('', fallback: ['missing', 'missing_dep'], required: false) muon-v0.4.0/subprojects/meson-tests/common/38 alignment/0002755000175000017500000000000014751453622022157 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/38 alignment/meson.build0000644000175000017500000000163014751453622024317 0ustar buildbuildproject('alignment', 'c', 'cpp') compilers = [meson.get_compiler('c'), meson.get_compiler('cpp')] foreach cc : compilers # These tests should return the same value on all # platforms. If (and when) they don't, fix 'em up. if cc.alignment('char') != 1 error('Alignment of char misdetected.') endif ptr_size = cc.sizeof('void*') dbl_alignment = cc.alignment('double') # These tests are not thorough. Doing this properly # would take a lot of work because it is strongly # platform and compiler dependent. So just check # that they produce something fairly sane. if ptr_size == 8 or ptr_size == 4 message('Size of ptr ok.') else error('Size of ptr misdetected.') endif if dbl_alignment == 8 or dbl_alignment == 4 message('Alignment of double ok.') else error('Alignment of double misdetected.') endif endforeach muon-v0.4.0/subprojects/meson-tests/common/198 broken subproject/0002755000175000017500000000000014751453622023711 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/198 broken subproject/subprojects/0002755000175000017500000000000014751453622026254 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/198 broken subproject/subprojects/broken/0002755000175000017500000000000014751453622027534 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/198 broken subproject/subprojects/broken/meson.build0000644000175000017500000000014114751453622031670 0ustar buildbuildproject('broken', 'c') executable('app', 'broken.c') assert(false, 'This subproject must fail') muon-v0.4.0/subprojects/meson-tests/common/198 broken subproject/subprojects/broken/broken.c0000644000175000017500000000003514751453622031154 0ustar buildbuild#error This must not compile muon-v0.4.0/subprojects/meson-tests/common/198 broken subproject/meson.build0000644000175000017500000000011014751453622026041 0ustar buildbuildproject('test broken subproject') subproject('broken', required: false) muon-v0.4.0/subprojects/meson-tests/common/209 link custom_i single from multiple/0002755000175000017500000000000014751453622027023 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/209 link custom_i single from multiple/meson.build0000644000175000017500000000234614751453622031170 0ustar buildbuildproject('linkcustom', 'c') # This would require passing the static linker to the build script or having # it detect it by itself. I'm too lazy to implement it now and it is not # really needed for testing that custom targets work. It is the responsibility # of the custom target to produce things in the correct format. assert( not meson.is_cross_build(), 'MESON_SKIP_TEST cross checking not implemented.', ) cc = meson.get_compiler('c') genprog = find_program('generate_conflicting_stlibs.py') clib = custom_target( 'linkcustom', output: ['libflob_1.a', 'libflob_2.a'], command: [genprog, '-o', '@OUTPUT@', '--private-dir', '@PRIVATE_DIR@'] + cc.cmd_array(), ) clib_2 = clib[1] exe = executable('prog', 'prog.c', link_with: clib_2) test('linkcustom', exe) d = declare_dependency(link_with: clib_2) exe2 = executable('prog2', 'prog.c', dependencies: d) test('linkcustom2', exe2) # Link whole tests if meson.backend() == 'xcode' message('Xcode does not support link whole so skipping.') subdir_done() endif exe3 = executable('prog3', 'prog.c', link_whole: clib_2) test('linkwhole', exe) d2 = declare_dependency(link_whole: clib_2) exe4 = executable('prog4', 'prog.c', dependencies: d2) test('linkwhole2', exe2) ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/209 link custom_i single from multiple/generate_conflicting_stlibs.pymuon-v0.4.0/subprojects/meson-tests/common/209 link custom_i single from multiple/generate_conflicti0000644000175000017500000000547714751453622032605 0ustar buildbuild#!/usr/bin/env python3 import shutil, sys, subprocess, argparse, pathlib parser = argparse.ArgumentParser() parser.add_argument('--private-dir', required=True) parser.add_argument('-o', nargs='+', required=True) parser.add_argument('cmparr', nargs='+') contents = [''' int flob() { return 0; } ''', ''' int flob() { return 1; } '''] def generate_lib_gnulike(outfile, c_file, private_dir, compiler_array): if shutil.which('ar'): static_linker = 'ar' elif shutil.which('llvm-ar'): static_linker = 'llvm-ar' elif shutil.which('gcc-ar'): static_linker = 'gcc-ar' else: sys.exit('Could not detect a static linker.') o_file = c_file.with_suffix('.o') compile_cmd = compiler_array + ['-c', '-g', '-O2', '-o', str(o_file), str(c_file)] subprocess.check_call(compile_cmd) out_file = pathlib.Path(outfile) if out_file.exists(): out_file.unlink() link_cmd = [static_linker, 'csr', outfile, str(o_file)] subprocess.check_call(link_cmd) return 0 def generate_lib_msvc(outfile, c_file, private_dir, compiler_array): static_linker = 'lib' o_file = c_file.with_suffix('.obj') compile_cmd = compiler_array + ['/MDd', '/nologo', '/ZI', '/Ob0', '/Od', '/c', '/Fo' + str(o_file), str(c_file)] subprocess.check_call(compile_cmd) out_file = pathlib.Path(outfile) if out_file.exists(): out_file.unlink() link_cmd = [static_linker, '/nologo', '/OUT:' + str(outfile), str(o_file)] subprocess.check_call(link_cmd) return 0 def generate_lib(outfiles, private_dir, compiler_array): private_dir = pathlib.Path(private_dir) if not private_dir.exists(): private_dir.mkdir() for i, content in enumerate(contents): c_file = private_dir / ('flob_' + str(i + 1) + '.c') c_file.write_text(content) outfile = outfiles[i] cl_found = False for cl_arg in compiler_array: if (cl_arg.endswith('cl') or cl_arg.endswith('cl.exe')) and 'clang-cl' not in cl_arg: ret = generate_lib_msvc(outfile, c_file, private_dir, compiler_array) if ret > 0: return ret else: cl_found = True break if not cl_found: ret = generate_lib_gnulike(outfile, c_file, private_dir, compiler_array) if ret > 0: return ret return 0 if __name__ == '__main__': options = parser.parse_args() sys.exit(generate_lib(options.o, options.private_dir, options.cmparr)) muon-v0.4.0/subprojects/meson-tests/common/209 link custom_i single from multiple/prog.c0000644000175000017500000000010614751453622030131 0ustar buildbuildint flob(void); int main(void) { return (flob() == 1 ? 0 : 1); } muon-v0.4.0/subprojects/meson-tests/common/23 endian/0002755000175000017500000000000014751453622021431 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/23 endian/meson.build0000644000175000017500000000025314751453622023571 0ustar buildbuildproject('endian check', 'c') if host_machine.endian() == 'big' add_global_arguments('-DIS_BE', language: 'c') endif test('endiantest', executable('prog', 'prog.c')) muon-v0.4.0/subprojects/meson-tests/common/23 endian/prog.c0000644000175000017500000000056714751453622022552 0ustar buildbuild#include int is_big_endian(void) { uint32_t one = 1; if(*((uint8_t*) &one) == 1) return 0; return 1; } int main(void) { int is_be_check = is_big_endian(); int is_be; #ifdef IS_BE is_be = 1; #else is_be = 0; #endif if(is_be_check && is_be) return 0; if(!is_be_check && !is_be) return 0; return 1; } muon-v0.4.0/subprojects/meson-tests/common/68 should fail/0002755000175000017500000000000014751453622022376 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/68 should fail/failing.c0000644000175000017500000000004114751453622024144 0ustar buildbuildint main(void) { return 1; } muon-v0.4.0/subprojects/meson-tests/common/68 should fail/meson.build0000644000175000017500000000015314751453622024535 0ustar buildbuildproject('should fail', 'c') exe = executable('prog', 'failing.c') test('failing', exe, should_fail: true) muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/0002755000175000017500000000000014751453622023703 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/stnodep/0002755000175000017500000000000014751453622025357 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/stnodep/meson.build0000644000175000017500000000011514751453622027514 0ustar buildbuildstnodep = static_library('stnodep', 'lib.c', c_args: '-DMESON_STATIC_BUILD') muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/stnodep/lib.c0000644000175000017500000000012014751453622026260 0ustar buildbuild#include "../lib.h" SYMBOL_EXPORT int get_stnodep_value (void) { return 2; } muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/ststdep/0002755000175000017500000000000014751453622025371 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/ststdep/meson.build0000644000175000017500000000014114751453622027525 0ustar buildbuildststdep = static_library('ststdep', 'lib.c', link_with: stnodep, c_args: '-DMESON_STATIC_BUILD') muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/ststdep/lib.c0000644000175000017500000000020214751453622026273 0ustar buildbuild#include "../lib.h" int get_stnodep_value (void); SYMBOL_EXPORT int get_ststdep_value (void) { return get_stnodep_value (); } muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/main.c0000644000175000017500000000175614751453622025002 0ustar buildbuild#include #include "lib.h" int get_stnodep_value (void); int get_stshdep_value (void); int get_ststdep_value (void); SYMBOL_IMPORT int get_shnodep_value (void); SYMBOL_IMPORT int get_shshdep_value (void); SYMBOL_IMPORT int get_shstdep_value (void); int main(void) { int val; val = get_shnodep_value (); if (val != 1) { printf("shnodep was %i instead of 1\n", val); return -1; } val = get_stnodep_value (); if (val != 2) { printf("stnodep was %i instead of 2\n", val); return -2; } val = get_shshdep_value (); if (val != 1) { printf("shshdep was %i instead of 1\n", val); return -3; } val = get_shstdep_value (); if (val != 2) { printf("shstdep was %i instead of 2\n", val); return -4; } val = get_stshdep_value (); if (val != 1) { printf("shstdep was %i instead of 1\n", val); return -5; } val = get_ststdep_value (); if (val != 2) { printf("ststdep was %i instead of 2\n", val); return -6; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/shstdep/0002755000175000017500000000000014751453622025355 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/shstdep/meson.build0000644000175000017500000000010114751453622027505 0ustar buildbuildshstdep = shared_library('shstdep', 'lib.c', link_with: stnodep) muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/shstdep/lib.c0000644000175000017500000000020214751453622026257 0ustar buildbuild#include "../lib.h" int get_stnodep_value (void); SYMBOL_EXPORT int get_shstdep_value (void) { return get_stnodep_value (); } muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/circular/0002755000175000017500000000000014751453622025507 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/circular/lib3.c0000644000175000017500000000017414751453622026504 0ustar buildbuildint get_st1_prop (void); int get_st2_prop (void); int get_st3_value (void) { return get_st1_prop () + get_st2_prop (); } muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/circular/lib1.c0000644000175000017500000000017414751453622026502 0ustar buildbuildint get_st2_prop (void); int get_st3_prop (void); int get_st1_value (void) { return get_st2_prop () + get_st3_prop (); } muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/circular/main.c0000644000175000017500000000077414751453622026605 0ustar buildbuild#include #include "../lib.h" int get_st1_value (void); int get_st2_value (void); int get_st3_value (void); int main(void) { int val; val = get_st1_value (); if (val != 5) { printf("st1 value was %i instead of 5\n", val); return -1; } val = get_st2_value (); if (val != 4) { printf("st2 value was %i instead of 4\n", val); return -2; } val = get_st3_value (); if (val != 3) { printf("st3 value was %i instead of 3\n", val); return -3; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/circular/lib2.c0000644000175000017500000000017414751453622026503 0ustar buildbuildint get_st1_prop (void); int get_st3_prop (void); int get_st2_value (void) { return get_st1_prop () + get_st3_prop (); } muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/circular/prop1.c0000644000175000017500000000005014751453622026705 0ustar buildbuildint get_st1_prop (void) { return 1; } muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/circular/meson.build0000644000175000017500000000034314751453622027647 0ustar buildbuildst1 = static_library('st1', 'lib1.c', 'prop1.c') st2 = static_library('st2', 'lib2.c', 'prop2.c') st3 = static_library('st3', 'lib3.c', 'prop3.c') test('circular', executable('circular', 'main.c', link_with: [st1, st2, st3])) muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/circular/prop2.c0000644000175000017500000000005014751453622026706 0ustar buildbuildint get_st2_prop (void) { return 2; } muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/circular/prop3.c0000644000175000017500000000005014751453622026707 0ustar buildbuildint get_st3_prop (void) { return 3; } muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/stshdep/0002755000175000017500000000000014751453622025355 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/stshdep/meson.build0000644000175000017500000000014114751453622027511 0ustar buildbuildstshdep = static_library('stshdep', 'lib.c', link_with: shnodep, c_args: '-DMESON_STATIC_BUILD') muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/stshdep/lib.c0000644000175000017500000000020214751453622026257 0ustar buildbuild#include "../lib.h" int get_shnodep_value (void); SYMBOL_EXPORT int get_stshdep_value (void) { return get_shnodep_value (); } muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/meson.build0000644000175000017500000000151314751453622026043 0ustar buildbuildproject('recursive dependencies', 'c') # Test that you can link a shared executable to: # - A shared library with no other deps subdir('shnodep') # - A static library with no other deps subdir('stnodep') # - A shared library with a shared library dep subdir('shshdep') # - A shared library with a static library dep subdir('shstdep') # - A static library with a shared library dep subdir('stshdep') # - A static library with a static library dep subdir('ststdep') test( 'alldeps', executable('alldeps', 'main.c', link_with: [shshdep, shstdep, ststdep, stshdep]), ) # More combinations of static and shared libraries subdir('3rdorderdeps') # Circular dependencies between static libraries # This requires the use of --start/end-group with GNU ld subdir('circular') # Various edge cases that have been reported subdir('edge-cases') muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/edge-cases/0002755000175000017500000000000014751453622025703 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/edge-cases/stomain.c0000644000175000017500000000035014751453622027515 0ustar buildbuild#include #include "../lib.h" int get_stodep_value (void); int main(void) { int val; val = get_stodep_value (); if (val != 1) { printf("st1 value was %i instead of 1\n", val); return -1; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/edge-cases/libsto.c0000644000175000017500000000017714751453622027346 0ustar buildbuild#include "../lib.h" int get_builto_value (void); SYMBOL_EXPORT int get_stodep_value (void) { return get_builto_value (); } muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/edge-cases/shstmain.c0000644000175000017500000000035214751453622027673 0ustar buildbuild#include #include "../lib.h" int get_stshdep_value (void); int main(void) { int val; val = get_stshdep_value (); if (val != 1) { printf("st1 value was %i instead of 1\n", val); return -1; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/edge-cases/meson.build0000644000175000017500000000107314751453622030044 0ustar buildbuild# Test https://github.com/mesonbuild/meson/issues/2096 # Note that removing 'shnodep' from link_with: makes the error go away because # then it is added after the static library is added to the link command. test( 'shared-static', executable('shstexe', 'shstmain.c', link_with: [shnodep, stshdep]), ) # Static library that needs a symbol defined in an object file. This already # works, but good to add a test case early. stodep = static_library('stodep', 'libsto.c') test( 'stodep', executable('stodep', 'stomain.c', 'stobuilt.c', link_with: stodep), ) muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/edge-cases/stobuilt.c0000644000175000017500000000012014751453622027703 0ustar buildbuild#include "../lib.h" SYMBOL_EXPORT int get_builto_value (void) { return 1; } muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/lib.h0000644000175000017500000000067614751453622024631 0ustar buildbuild#if defined _WIN32 #ifdef MESON_STATIC_BUILD #define SYMBOL_EXPORT #define SYMBOL_IMPORT #else #define SYMBOL_IMPORT __declspec(dllimport) #define SYMBOL_EXPORT __declspec(dllexport) #endif #else #define SYMBOL_IMPORT #if defined __GNUC__ #define SYMBOL_EXPORT __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define SYMBOL_EXPORT #endif #endif muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/3rdorderdeps/0002755000175000017500000000000014751453622026303 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/3rdorderdeps/lib.c.in0000644000175000017500000000024314751453622027617 0ustar buildbuild#include "../lib.h" int get_@DEPENDENCY@dep_value (void); SYMBOL_EXPORT int get_@LIBTYPE@@DEPENDENCY@dep_value (void) { return get_@DEPENDENCY@dep_value (); } muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/3rdorderdeps/main.c.in0000644000175000017500000000046214751453622030000 0ustar buildbuild#include #include "../lib.h" SYMBOL_IMPORT int get_@LIBTYPE@@DEPENDENCY@dep_value (void); int main(void) { int val; val = get_@LIBTYPE@@DEPENDENCY@dep_value (); if (val != @VALUE@) { printf("@LIBTYPE@@DEPENDENCY@ was %i instead of @VALUE@\n", val); return -1; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/3rdorderdeps/meson.build0000644000175000017500000000353014751453622030444 0ustar buildbuilddep3_libs = [] # Permutate all combinations of shared and static libraries up to three levels # executable -> shared -> static -> shared (etc) foreach dep2 : ['sh', 'st'] foreach dep1 : ['sh', 'st'] foreach libtype : ['sh', 'st'] name = libtype + dep1 + dep2 if dep2 == 'sh' libret = 1 elif dep2 == 'st' libret = 2 else error('Unknown dep2 "@0@"'.format(dep2)) endif if libtype == 'sh' target = 'shared_library' build_args = [] elif libtype == 'st' target = 'static_library' build_args = ['-DMESON_STATIC_BUILD'] else error('Unknown libtype "@0@"'.format(libtype)) endif cdata = configuration_data() cdata.set('DEPENDENCY', dep1 + dep2) cdata.set('LIBTYPE', libtype) cdata.set('VALUE', libret) lib_c = configure_file( input: 'lib.c.in', output: name + '-lib.c', configuration: cdata, ) dep = get_variable(dep1 + dep2 + 'dep') dep3_lib = build_target( name, lib_c, link_with: dep, target_type: target, c_args: build_args, ) dep3_libs += [dep3_lib] main_c = configure_file( input: 'main.c.in', output: name + '-main.c', configuration: cdata, ) dep3_bin = executable( name + '_test', main_c, link_with: dep3_lib, c_args: build_args, ) test(name + 'test', dep3_bin) endforeach endforeach endforeach muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/shnodep/0002755000175000017500000000000014751453622025343 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/shnodep/meson.build0000644000175000017500000000007714751453622027507 0ustar buildbuildshnodep = shared_library('shnodep', 'lib.c', version: '0.0.0') muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/shnodep/lib.c0000644000175000017500000000012014751453622026244 0ustar buildbuild#include "../lib.h" SYMBOL_EXPORT int get_shnodep_value (void) { return 1; } muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/shshdep/0002755000175000017500000000000014751453622025341 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/shshdep/meson.build0000644000175000017500000000010114751453622027471 0ustar buildbuildshshdep = shared_library('shshdep', 'lib.c', link_with: shnodep) muon-v0.4.0/subprojects/meson-tests/common/145 recursive linking/shshdep/lib.c0000644000175000017500000000020214751453622026243 0ustar buildbuild#include "../lib.h" int get_shnodep_value (void); SYMBOL_EXPORT int get_shshdep_value (void) { return get_shnodep_value (); } muon-v0.4.0/subprojects/meson-tests/common/167 subproject nested subproject dirs/0002755000175000017500000000000014751453622026772 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/167 subproject nested subproject dirs/meson.build0000644000175000017500000000066314751453622031137 0ustar buildbuildproject('gamma project', 'c', subproject_dir: 'contrib/subprojects') # different than meson: nested subproject promotion subproject('beta') a = subproject('alpha') lib = a.get_variable('l') # Ensure that the dependency version is not checked for a not-found dependency notfound = dependency('', version: '>=1.0', required: false, fallback: ['beta', 'notfound']) exe = executable('prog', 'prog.c', link_with: lib) test('basic', exe) muon-v0.4.0/subprojects/meson-tests/common/167 subproject nested subproject dirs/contrib/0002755000175000017500000000000014751453622030432 5ustar buildbuild././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/167 subproject nested subproject dirs/contrib/subprojects/muon-v0.4.0/subprojects/meson-tests/common/167 subproject nested subproject dirs/contrib/subprojects0002755000175000017500000000000014751453622032716 5ustar buildbuild././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/167 subproject nested subproject dirs/contrib/subprojects/beta/muon-v0.4.0/subprojects/meson-tests/common/167 subproject nested subproject dirs/contrib/subprojects0002755000175000017500000000000014751453622032716 5ustar buildbuild././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/167 subproject nested subproject dirs/contrib/subprojects/beta/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/167 subproject nested subproject dirs/contrib/subprojects0000644000175000017500000000015114751453622032713 0ustar buildbuildproject('beta project', 'c') lb = shared_library('b', 'b.c') notfound = dependency('', required: false) ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/167 subproject nested subproject dirs/contrib/subprojects/beta/b.cmuon-v0.4.0/subprojects/meson-tests/common/167 subproject nested subproject dirs/contrib/subprojects0000644000175000017500000000052314751453622032716 0ustar buildbuild#if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllexport) #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif int DLL_PUBLIC func2(void) { return 42; } ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/167 subproject nested subproject dirs/contrib/subprojects/alpha/muon-v0.4.0/subprojects/meson-tests/common/167 subproject nested subproject dirs/contrib/subprojects0002755000175000017500000000000014751453622032716 5ustar buildbuild././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/167 subproject nested subproject dirs/contrib/subprojects/alpha/var/muon-v0.4.0/subprojects/meson-tests/common/167 subproject nested subproject dirs/contrib/subprojects0002755000175000017500000000000014751453622032716 5ustar buildbuild././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/167 subproject nested subproject dirs/contrib/subprojects/alpha/var/subprojects/muon-v0.4.0/subprojects/meson-tests/common/167 subproject nested subproject dirs/contrib/subprojects0002755000175000017500000000000014751453622032716 5ustar buildbuild././@LongLink0000644000000000000000000000022400000000000011601 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/167 subproject nested subproject dirs/contrib/subprojects/alpha/var/subprojects/wrap_files_might_be_heremuon-v0.4.0/subprojects/meson-tests/common/167 subproject nested subproject dirs/contrib/subprojects0000644000175000017500000000000114751453622032705 0ustar buildbuild ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/167 subproject nested subproject dirs/contrib/subprojects/alpha/a.cmuon-v0.4.0/subprojects/meson-tests/common/167 subproject nested subproject dirs/contrib/subprojects0000644000175000017500000000054514751453622032722 0ustar buildbuildint func2(void); #if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllexport) #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif int DLL_PUBLIC func(void) { return func2(); } ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/167 subproject nested subproject dirs/contrib/subprojects/alpha/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/167 subproject nested subproject dirs/contrib/subprojects0000644000175000017500000000022214751453622032712 0ustar buildbuildproject('alpha project', 'c', subproject_dir: 'var/subprojects') b = subproject('beta') l = library('a', 'a.c', link_with: b.get_variable('lb')) muon-v0.4.0/subprojects/meson-tests/common/167 subproject nested subproject dirs/prog.c0000644000175000017500000000010514751453622030077 0ustar buildbuildint func(void); int main(void) { return func() == 42 ? 0 : 1; } muon-v0.4.0/subprojects/meson-tests/common/67 modules/0002755000175000017500000000000014751453622021653 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/67 modules/meson_options.txt0000644000175000017500000000015014751453622025302 0ustar buildbuildoption( 'disabled', type: 'feature', value: 'disabled', description: 'test disabled', ) muon-v0.4.0/subprojects/meson-tests/common/67 modules/meson.build0000644000175000017500000000051214751453622024011 0ustar buildbuildproject('module test') modtest = import('fs') assert(modtest.found()) modtest = import('fs', required: get_option('disabled')) assert(not modtest.found()) notfound = import('not-found', required: false) assert(not notfound.found()) disabled = import('not-found', required: false, disabler: true) assert(is_disabler(disabled)) muon-v0.4.0/subprojects/meson-tests/common/110 allgenerate/0002755000175000017500000000000014751453622022533 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/110 allgenerate/meson.build0000644000175000017500000000072514751453622024677 0ustar buildbuild# Must have two languages here to exercise linker language # selection bug project('all sources generated', 'c', 'cpp') comp = find_program('converter.py') g = generator(comp, output: '@BASENAME@', arguments: ['@INPUT@', '@OUTPUT@']) c = g.process('foobar.cpp.in') prog = executable('genexe', c) c2 = custom_target( 'c2gen', output: '@BASENAME@', input: 'foobar.cpp.in', command: [comp, '@INPUT@', '@OUTPUT@'], ) prog2 = executable('genexe2', c2) muon-v0.4.0/subprojects/meson-tests/common/110 allgenerate/converter.py0000755000175000017500000000017014751453622025113 0ustar buildbuild#!/usr/bin/env python3 import sys ifile = sys.argv[1] ofile = sys.argv[2] open(ofile, 'w').write(open(ifile).read()) muon-v0.4.0/subprojects/meson-tests/common/110 allgenerate/foobar.cpp.in0000644000175000017500000000012114751453622025104 0ustar buildbuild#include int main(void) { printf("I am a program.\n"); return 0; } muon-v0.4.0/subprojects/meson-tests/common/70 external test program/0002755000175000017500000000000014751453622024407 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/70 external test program/meson.build0000644000175000017500000000013414751453622026545 0ustar buildbuildproject('test is external') test('external', find_program('mytest.py'), args: ['correct']) muon-v0.4.0/subprojects/meson-tests/common/70 external test program/mytest.py0000755000175000017500000000025514751453622026311 0ustar buildbuild#!/usr/bin/env python3 import sys if sys.argv[1] == 'correct': print('Argument is correct.') sys.exit(0) print('Argument is incorrect:', sys.argv[1]) sys.exit(1) muon-v0.4.0/subprojects/meson-tests/common/274 environment/0002755000175000017500000000000014751453622022627 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/274 environment/meson.build0000644000175000017500000000262514751453622024774 0ustar buildbuildproject( 'environment', meson_version: '>=1.4.0', ) testenv = find_program(files('testenv.py')) env = environment() env.unset('foo') test('not set', testenv, args: ['foo'], env: env) # testcase expect_error('You cannot set the already unset variable \'foo\'') # env.set('foo', 'bar') # endtestcase # testcase expect_error('You cannot append to unset variable \'foo\'') # env.append('foo', 'bar') # endtestcase # testcase expect_error('You cannot prepend to unset variable \'foo\'') # env.prepend('foo', 'bar') # endtestcase env1 = environment('foo=bar', method: 'append', separator: ':') env1.append('foo', 'baz', separator: ':') test('append', testenv, args: ['foo', 'bar:baz'], env: env1) # testcase expect_error('You cannot unset the \'foo\' variable because it is already set') # env1.unset('foo') # endtestcase env2 = environment(['foo=baz'], method: 'prepend', separator: ':') env2.prepend('foo', 'bar', separator: ':') test('prepend', testenv, args: ['foo', 'bar:baz'], env: env2) # testcase expect_error('You cannot unset the \'foo\' variable because it is already set') # env2.unset('foo') # endtestcase env3 = environment({'foo': 'foobar'}, method: 'set', separator: ':') env3.set('foo', 'qux') test('reset', testenv, args: ['foo', 'qux'], env: env3) # testcase expect_error('You cannot unset the \'foo\' variable because it is already set') # env3.unset('foo') # endtestcase muon-v0.4.0/subprojects/meson-tests/common/274 environment/testenv.py0000644000175000017500000000035414751453622024671 0ustar buildbuild#!/usr/bin/env python3 import os import sys key = sys.argv[1] expected = sys.argv[2] if len(sys.argv) > 2 else None if os.environ.get(key) == expected: sys.exit(0) sys.exit(f'Expected {expected!r}, was {os.environ.get(key)!r}') muon-v0.4.0/subprojects/meson-tests/common/125 configure file in generator/0002755000175000017500000000000014751453622025475 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/125 configure file in generator/inc/0002755000175000017500000000000014751453622026246 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/125 configure file in generator/inc/confdata.in0000644000175000017500000000001014751453622030342 0ustar buildbuild@VALUE@ muon-v0.4.0/subprojects/meson-tests/common/125 configure file in generator/inc/meson.build0000644000175000017500000000021614751453622030405 0ustar buildbuildcdata = configuration_data() cdata.set('VALUE', '42') cfile = configure_file(input: 'confdata.in', output: 'confdata', configuration: cdata) muon-v0.4.0/subprojects/meson-tests/common/125 configure file in generator/meson.build0000644000175000017500000000010414751453622027630 0ustar buildbuildproject('conf file in generator', 'c') subdir('inc') subdir('src') muon-v0.4.0/subprojects/meson-tests/common/125 configure file in generator/src/0002755000175000017500000000000014751453622026264 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/125 configure file in generator/src/main.c0000644000175000017500000000040014751453622027344 0ustar buildbuild#include #include"confdata.h" #if RESULT != 42 #error Configuration RESULT is not defined correctly #endif #undef RESULT #include"source.h" #if RESULT != 23 #error Source RESULT is not defined correctly #endif int main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/125 configure file in generator/src/gen.py0000755000175000017500000000034314751453622027410 0ustar buildbuild#!/usr/bin/env python3 import sys ifile = sys.argv[1] ofile = sys.argv[2] with open(ifile) as f: resval = f.readline().strip() templ = '#define RESULT (%s)\n' with open(ofile, 'w') as f: f.write(templ % (resval, )) muon-v0.4.0/subprojects/meson-tests/common/125 configure file in generator/src/meson.build0000644000175000017500000000030614751453622030423 0ustar buildbuildcompiler = find_program('gen.py') gen = generator(compiler, output: '@BASENAME@.h', arguments: ['@INPUT@', '@OUTPUT@']) hs = gen.process(cfile, files('source')) executable('proggie', 'main.c', hs) muon-v0.4.0/subprojects/meson-tests/common/125 configure file in generator/src/source0000644000175000017500000000000314751453622027476 0ustar buildbuild23 muon-v0.4.0/subprojects/meson-tests/common/163 default options prefix dependent defaults/0002755000175000017500000000000014751453622030355 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/163 default options prefix dependent defaults/meson.build0000644000175000017500000000020214751453622032507 0ustar buildbuildproject( 'default options prefix dependent defaults ', default_options: ['sharedstatedir=/sharedstate', 'prefix=/usr'], ) muon-v0.4.0/subprojects/meson-tests/common/85 skip subdir/0002755000175000017500000000000014751453622022422 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/85 skip subdir/subdir1/0002755000175000017500000000000014751453622023773 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/85 skip subdir/subdir1/meson.build0000644000175000017500000000004414751453622026131 0ustar buildbuilderror('This should not be called.') muon-v0.4.0/subprojects/meson-tests/common/85 skip subdir/subdir1/subdir2/0002755000175000017500000000000014751453622025345 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/85 skip subdir/subdir1/subdir2/meson.build0000644000175000017500000000004214751453622027501 0ustar buildbuildmessage('I\'m in subdir subdir.') muon-v0.4.0/subprojects/meson-tests/common/85 skip subdir/meson.build0000644000175000017500000000005214751453622024557 0ustar buildbuildproject('foo') subdir('subdir1/subdir2') muon-v0.4.0/subprojects/meson-tests/common/32 has header/0002755000175000017500000000000014751453622022157 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/32 has header/meson.build0000644000175000017500000000457014751453622024325 0ustar buildbuildproject('has header', 'c', 'cpp') host_system = host_machine.system() non_existent_header = 'ouagadougou.h' # Copy it into the builddir to ensure that it isn't found even if it's there configure_file( input: non_existent_header, output: non_existent_header, configuration: configuration_data(), ) # Test that the fallback to __has_include also works on all compilers if host_system != 'darwin' fallbacks = ['', '\n#undef __has_include'] else # On Darwin's clang you can't redefine builtin macros so the above doesn't work fallbacks = [''] endif foreach fallback : fallbacks foreach comp : [meson.get_compiler('c'), meson.get_compiler('cpp')] assert(comp.has_header('stdio.h', prefix: fallback), 'Stdio missing.') # stdio.h doesn't actually need stdlib.h, but just test that setting the # prefix does not result in an error. assert( comp.has_header('stdio.h', prefix: '#include ' + fallback), 'Stdio missing.', ) # XInput.h should not require type definitions from windows.h, but it does # require macro definitions. Specifically, it requires an arch setting for # VS2015 at least. # We only do this check on MSVC because MinGW often defines its own wrappers # that pre-include windows.h if comp.get_id() == 'msvc' assert( comp.has_header('XInput.h', prefix: '#include ' + fallback), 'XInput.h should not be missing on Windows', ) assert( comp.has_header('XInput.h', prefix: '#define _X86_' + fallback), 'XInput.h should not need windows.h', ) endif # Test that the following GCC bug doesn't happen: # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80005 # https://github.com/mesonbuild/meson/issues/1458 if host_system == 'linux' assert( comp.has_header('linux/if.h', prefix: fallback), 'Could not find ', ) endif # This header exists in the source and the builddir, but we still must not # find it since we are looking in the system directories. assert( not comp.has_header(non_existent_header, prefix: fallback), 'Found nonexistent header.', ) endforeach endforeach muon-v0.4.0/subprojects/meson-tests/common/32 has header/ouagadougou.h0000644000175000017500000000004314751453622024642 0ustar buildbuild#define OMG_THIS_SHOULDNT_BE_FOUND muon-v0.4.0/subprojects/meson-tests/common/248 install_emptydir/0002755000175000017500000000000014751453622023647 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/248 install_emptydir/meson.build0000644000175000017500000000031614751453622026007 0ustar buildbuildproject('install_emptydir') install_emptydir(get_option('datadir') / 'new_directory', install_mode: 'rwx------') install_emptydir(get_option('datadir') / 'new_directory/subdir', install_mode: 'rwxr-----') muon-v0.4.0/subprojects/meson-tests/common/248 install_emptydir/test.json0000644000175000017500000000022414751453622025515 0ustar buildbuild{ "installed": [ { "type": "dir", "file": "usr/share/new_directory" }, { "type": "dir", "file": "usr/share/new_directory/subdir" } ] } muon-v0.4.0/subprojects/meson-tests/common/254 long output/0002755000175000017500000000000014751453622022541 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/254 long output/meson.build0000644000175000017500000000025214751453622024700 0ustar buildbuildproject('long-stderr', 'c') dumper = executable('dumper', 'dumper.c') test('dump-test', dumper, timeout: 60) test('dump-test-TAP', dumper, protocol: 'tap', timeout: 60) muon-v0.4.0/subprojects/meson-tests/common/254 long output/dumper.c0000644000175000017500000000053414751453622024201 0ustar buildbuild#include int main(void) { for (int i = 0 ; i < 100000 ; i++) fprintf(stderr, "# Iteration %d to stderr\n", i + 1); printf("ok 1 - dumper to stderr\n"); for (int i = 0 ; i < 100000 ; i++) fprintf(stdout, "# Iteration %d to stdout\n", i + 1); printf("ok 2 - dumper to stdout\n1..2\n"); return 0; } muon-v0.4.0/subprojects/meson-tests/common/19 header in file list/0002755000175000017500000000000014751453622023653 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/19 header in file list/meson.build0000644000175000017500000000114314751453622026012 0ustar buildbuildproject('header in file list', 'c') cc_id = meson.get_compiler('c').get_id() cc_ver = meson.get_compiler('c').version() if cc_id == 'intel' or (cc_id == 'lcc' and cc_ver.version_compare('<=1.23.08')) # ICC and LCC <= 1.23.08 do not escape spaces in paths in the dependency file, so Ninja # (correctly) thinks that the rule has multiple outputs and errors out: # 'depfile has multiple output paths' error( 'MESON_SKIP_TEST: Skipping test because your compiler is known to generate broken dependency files', ) endif exe = executable('prog', 'prog.c', 'header.h') test('basic', exe) muon-v0.4.0/subprojects/meson-tests/common/19 header in file list/header.h0000644000175000017500000000002214751453622025244 0ustar buildbuild#include muon-v0.4.0/subprojects/meson-tests/common/19 header in file list/prog.c0000644000175000017500000000006214751453622024762 0ustar buildbuild#include "header.h" int main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/50 custom target chain/0002755000175000017500000000000014751453622024017 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/50 custom target chain/usetarget/0002755000175000017500000000000014751453622026022 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/50 custom target chain/usetarget/myexe.c0000644000175000017500000000012114751453622027305 0ustar buildbuild#include int main(void) { printf("I am myexe.\n"); return 0; } muon-v0.4.0/subprojects/meson-tests/common/50 custom target chain/usetarget/subcomp.py0000755000175000017500000000023514751453622030045 0ustar buildbuild#!/usr/bin/env python3 import sys with open(sys.argv[1], 'rb') as ifile: with open(sys.argv[2], 'w') as ofile: ofile.write('Everything ok.\n') muon-v0.4.0/subprojects/meson-tests/common/50 custom target chain/usetarget/meson.build0000644000175000017500000000027614751453622030167 0ustar buildbuilde = executable('myexe', 'myexe.c') subexe = find_program('subcomp.py') custom_target( 'use_exe', input: e, output: 'subout.res', command: [subexe, '@INPUT@', '@OUTPUT@'], ) muon-v0.4.0/subprojects/meson-tests/common/50 custom target chain/meson.build0000644000175000017500000000162014751453622026156 0ustar buildbuildproject('custom target', 'c') python = find_program('python3', required: false) if not python.found() python = find_program('python') endif # files() is the correct way to do this, but some people # do this so test that it works. comp = '@0@/@1@'.format(meson.current_source_dir(), 'my_compiler.py') comp2 = '@0@/@1@'.format(meson.current_source_dir(), 'my_compiler2.py') infile = files('data_source.txt')[0] mytarget = custom_target( 'bindat', output: 'data.dat', command: [python, comp, infile, '@OUTPUT@'], ) mytarget2 = custom_target( 'bindat2', output: 'data2.dat', command: [python, comp2, mytarget, '@OUTPUT@'], install: true, install_dir: 'subdir', ) mytarget3 = custom_target( 'bindat3', output: 'data3.dat', input: [mytarget], command: [python, comp2, '@INPUT@', '@OUTPUT@'], install: true, install_dir: 'subdir', ) subdir('usetarget') muon-v0.4.0/subprojects/meson-tests/common/50 custom target chain/test.json0000644000175000017500000000020414751453622025663 0ustar buildbuild{ "installed": [ {"type": "file", "file": "usr/subdir/data2.dat"}, {"type": "file", "file": "usr/subdir/data3.dat"} ] } muon-v0.4.0/subprojects/meson-tests/common/50 custom target chain/my_compiler2.py0000755000175000017500000000066014751453622026775 0ustar buildbuild#!/usr/bin/env python3 import sys if __name__ == '__main__': if len(sys.argv) != 3: print(sys.argv[0], 'input_file output_file') sys.exit(1) with open(sys.argv[1]) as f: ifile = f.read() if ifile != 'This is a binary output file.\n': print('Malformed input') sys.exit(1) with open(sys.argv[2], 'w') as ofile: ofile.write('This is a different binary output file.\n') muon-v0.4.0/subprojects/meson-tests/common/50 custom target chain/data_source.txt0000644000175000017500000000004014751453622027041 0ustar buildbuildThis is a text only input file. muon-v0.4.0/subprojects/meson-tests/common/50 custom target chain/my_compiler.py0000755000175000017500000000065014751453622026712 0ustar buildbuild#!/usr/bin/env python3 import sys if __name__ == '__main__': if len(sys.argv) != 3: print(sys.argv[0], 'input_file output_file') sys.exit(1) with open(sys.argv[1]) as f: ifile = f.read() if ifile != 'This is a text only input file.\n': print('Malformed input') sys.exit(1) with open(sys.argv[2], 'w') as ofile: ofile.write('This is a binary output file.\n') muon-v0.4.0/subprojects/meson-tests/common/240 dependency native host == build/0002755000175000017500000000000014751453622026111 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/240 dependency native host == build/meson.build0000644000175000017500000000132014751453622030245 0ustar buildbuildproject('foo', 'c') if meson.is_cross_build() error('MESON_SKIP_TEST Test does not make sense for cross builds') endif dep_zlib = dependency('zlib', required: false) if not dep_zlib.found() error('MESON_SKIP_TEST Test requires zlib') endif dependency('zlib', native: true, required: false) dependency('zlib', native: false) # `native: true` should not make a difference when doing a native build. meson.override_dependency('dingbat', declare_dependency()) dependency('dingbat') # different than meson: native: true does make a difference when doing a native # build. dingbat_native = dependency('dingbat', native: true, required: false) assert(not dingbat_native.found()) dependency('dingbat', native: false) muon-v0.4.0/subprojects/meson-tests/common/240 dependency native host == build/test.json0000644000175000017500000000037014751453622027761 0ustar buildbuild{ "stdout": [ { "line": "Dependency zlib found: YES .* \\(cached\\)", "match": "re", "count": 2 }, { "line": "Dependency expat found: YES .* \\(overridden\\)", "match": "re", "count": 3 } ] } muon-v0.4.0/subprojects/meson-tests/common/18 includedirxyz/0002755000175000017500000000000014751453622023074 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/18 includedirxyz/do_not_delete0000644000175000017500000000005514751453622025621 0ustar buildbuildThis file is to ensure this directory exists muon-v0.4.0/subprojects/meson-tests/common/90 gen extra/0002755000175000017500000000000014751453622022054 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/90 gen extra/srcgen3.py0000644000175000017500000000043114751453622023766 0ustar buildbuild#!/usr/bin/env python3 import sys import argparse parser = argparse.ArgumentParser() parser.add_argument('input', help='the input file') options = parser.parse_args(sys.argv[1:]) with open(options.input) as f: content = f.read().strip() print(content) muon-v0.4.0/subprojects/meson-tests/common/90 gen extra/plain.c0000644000175000017500000000010114751453622023311 0ustar buildbuildint bob_mcbob(void); int main(void) { return bob_mcbob(); } muon-v0.4.0/subprojects/meson-tests/common/90 gen extra/meson.build0000644000175000017500000000221714751453622024216 0ustar buildbuildproject('extra args in gen', 'c') prog = find_program('srcgen.py') gen = generator( prog, output: '@BASENAME@.c', arguments: ['--input=@INPUT@', '--output=@OUTPUT@', '@EXTRA_ARGS@'], ) g1 = gen.process('name.dat') g2 = gen.process('name.dat', extra_args: '--upper') test('basic', executable('basic', 'plain.c', g1)) test('upper', executable('upper', 'upper.c', g2)) prog2 = find_program('srcgen2.py') basename_gen = generator( prog2, output: ['@BASENAME@.tab.c', '@BASENAME@.tab.h'], arguments: ['@BUILD_DIR@', '@BASENAME@', '@INPUT@'], ) basename_src = basename_gen.process('name.l') test('basename', executable('basename', basename_src)) plainname_gen = generator( prog2, output: ['@PLAINNAME@.tab.c', '@PLAINNAME@.tab.h'], arguments: ['@BUILD_DIR@', '@PLAINNAME@', '@INPUT@'], ) plainname_src = plainname_gen.process('name.l') test('plainname', executable('plainname', plainname_src)) prog3 = find_program('srcgen3.py') capture_gen = generator(prog3, output: ['@BASENAME@.yy.c'], arguments: ['@INPUT@'], capture: true) capture_src = capture_gen.process('name.l') test('capture', executable('capture', capture_src)) muon-v0.4.0/subprojects/meson-tests/common/90 gen extra/upper.c0000644000175000017500000000010114751453622023341 0ustar buildbuildint BOB_MCBOB(void); int main(void) { return BOB_MCBOB(); } muon-v0.4.0/subprojects/meson-tests/common/90 gen extra/name.dat0000644000175000017500000000001214751453622023455 0ustar buildbuildbob_mcbob muon-v0.4.0/subprojects/meson-tests/common/90 gen extra/name.l0000644000175000017500000000003514751453622023145 0ustar buildbuildint main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/90 gen extra/srcgen.py0000755000175000017500000000124614751453622023713 0ustar buildbuild#!/usr/bin/env python3 import sys import argparse parser = argparse.ArgumentParser() parser.add_argument('--input', dest='input', help='the input file') parser.add_argument('--output', dest='output', help='the output file') parser.add_argument('--upper', dest='upper', action='store_true', default=False, help='Convert to upper case.') c_templ = '''int %s(void) { return 0; } ''' options = parser.parse_args(sys.argv[1:]) with open(options.input) as f: funcname = f.readline().strip() if options.upper: funcname = funcname.upper() with open(options.output, 'w') as f: f.write(c_templ % funcname) muon-v0.4.0/subprojects/meson-tests/common/90 gen extra/srcgen2.py0000644000175000017500000000130314751453622023764 0ustar buildbuild#!/usr/bin/env python3 import os import sys import argparse parser = argparse.ArgumentParser() parser.add_argument('target_dir', help='the target dir') parser.add_argument('stem', help='the stem') parser.add_argument('input', help='the input file') options = parser.parse_args(sys.argv[1:]) with open(options.input) as f: content = f.read() output_c = os.path.join(options.target_dir, options.stem + ".tab.c") with open(output_c, 'w') as f: f.write(content) output_h = os.path.join(options.target_dir, options.stem + ".tab.h") h_content = '''#pragma once int myfun(void); ''' with open(output_h, 'w') as f: f.write(h_content) muon-v0.4.0/subprojects/meson-tests/common/103 has header symbol/0002755000175000017500000000000014751453622023524 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/103 has header symbol/meson.build0000644000175000017500000000536314751453622025673 0ustar buildbuild# SPDX-License-Identifier: Apache-2.0 # Copyright © 2024 Intel Corporation project( 'has header symbol', 'c', 'cpp', default_options: ['cpp_std=c++14'], ) cc = meson.get_compiler('c') cpp = meson.get_compiler('cpp') foreach comp : [cc, cpp] assert( comp.has_header_symbol('stdio.h', 'int'), 'base types should always be available', ) assert( comp.has_header_symbol('stdio.h', 'printf'), 'printf function not found', ) assert(comp.has_header_symbol('stdio.h', 'FILE'), 'FILE structure not found') assert( comp.has_header_symbol('limits.h', 'INT_MAX'), 'INT_MAX define not found', ) assert( not comp.has_header_symbol('limits.h', 'guint64'), 'guint64 is not defined in limits.h', ) assert( not comp.has_header_symbol('stdlib.h', 'FILE'), 'FILE structure is defined in stdio.h, not stdlib.h', ) assert( not comp.has_header_symbol('stdlol.h', 'printf'), 'stdlol.h shouldn\'t exist', ) assert( not comp.has_header_symbol('stdlol.h', 'int'), 'shouldn\'t be able to find "int" with invalid header', ) endforeach # Glibc requires _GNU_SOURCE for ppoll. Other libcs do not. if cc.has_function('ppoll') and not cc.has_header_symbol('poll.h', 'ppoll') assert( cc.has_header_symbol('poll.h', 'ppoll', prefix: '#define _GNU_SOURCE'), 'ppoll should be accessible with _GNU_SOURCE', ) endif assert( cpp.has_header_symbol('iostream', 'std::iostream'), 'iostream not found in iostream.h', ) assert( cpp.has_header_symbol('vector', 'std::vector'), 'vector not found in vector.h', ) assert( not cpp.has_header_symbol('limits.h', 'std::iostream'), 'iostream should not be defined in limits.h', ) # XXX: Since boost requires custom lookup functionality that muon does not # have, boost will always be not-found even if it is installed. This means # that if it _is_ installed, the test will fail since it expects # boost::math::quaternion to not be found in that case, but it will be found. # # Cross compilation and boost do not mix. # if not meson.is_cross_build() # boost = dependency('boost', required: false) # if boost.found() # assert( # cpp.has_header_symbol( # 'boost/math/quaternion.hpp', # 'boost::math::quaternion', # dependencies: boost, # ), # 'quaternion not found', # ) # else # assert( # not cpp.has_header_symbol( # 'boost/math/quaternion.hpp', # 'boost::math::quaternion', # dependencies: boost, # ), # 'quaternion found?!', # ) # endif # endif muon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/0002755000175000017500000000000014751453622023525 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/coverage/0002755000175000017500000000000014751453622025320 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/coverage/meson.build0000644000175000017500000000005114751453622027454 0ustar buildbuildexecutable('test-coverage', '../test.c') muon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/coverage-html/0002755000175000017500000000000014751453622026262 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/coverage-html/meson.build0000644000175000017500000000005614751453622030423 0ustar buildbuildexecutable('test-coverage-html', '../test.c') muon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/dist/0002755000175000017500000000000014751453622024470 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/dist/meson.build0000644000175000017500000000004514751453622026627 0ustar buildbuildexecutable('test-dist', '../test.c') muon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/test/0002755000175000017500000000000014751453622024504 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/test/meson.build0000644000175000017500000000004514751453622026643 0ustar buildbuildexecutable('test-test', '../test.c') muon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/coverage-xml/0002755000175000017500000000000014751453622026116 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/coverage-xml/meson.build0000644000175000017500000000005514751453622030256 0ustar buildbuildexecutable('test-coverage-xml', '../test.c') muon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/coverage-sonarqube/0002755000175000017500000000000014751453622027315 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/coverage-sonarqube/meson.build0000644000175000017500000000006314751453622031454 0ustar buildbuildexecutable('test-coverage-sonarqube', '../test.c') muon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/test.c0000644000175000017500000000003714751453622024646 0ustar buildbuildint main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/uninstall/0002755000175000017500000000000014751453622025536 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/uninstall/meson.build0000644000175000017500000000005214751453622027673 0ustar buildbuildexecutable('test-uninstall', '../test.c') muon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/clean-gcno/0002755000175000017500000000000014751453622025533 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/clean-gcno/meson.build0000644000175000017500000000005314751453622027671 0ustar buildbuildexecutable('test-clean-gcno', '../test.c') muon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/coverage-text/0002755000175000017500000000000014751453622026302 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/coverage-text/meson.build0000644000175000017500000000005614751453622030443 0ustar buildbuildexecutable('test-coverage-text', '../test.c') muon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/runtarget/0002755000175000017500000000000014751453622025540 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/runtarget/meson.build0000644000175000017500000000020414751453622027674 0ustar buildbuildconfigure_file(output: 'config.h', configuration: configuration_data()) run_target('runtarget', command: [find_program('echo.py')]) muon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/runtarget/echo.py0000644000175000017500000000012114751453622027020 0ustar buildbuild#!/usr/bin/env python3 import sys if len(sys.argv) > 1: print(sys.argv[1]) muon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/scan-build/0002755000175000017500000000000014751453622025546 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/scan-build/meson.build0000644000175000017500000000005314751453622027704 0ustar buildbuildexecutable('test-scan-build', '../test.c') muon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/meson.build0000644000175000017500000000151014751453622025662 0ustar buildbuildproject('reserved target names', 'c') # FIXME: Setting this causes it to leak to all other tests #default_options : ['b_coverage=true'] subdir('all') subdir('benchmark') subdir('clean') subdir('clean-ctlist') subdir('clean-gcda') subdir('clean-gcno') subdir('coverage') subdir('coverage-html') subdir('coverage-text') subdir('coverage-xml') subdir('dist') subdir('distcheck') subdir('install') # We don't have a 'PHONY' directory because Windows and OSX # choke horribly when there are two entries with the same # name but different case. subdir('phony') subdir('reconfigure') subdir('scan-build') subdir('test') subdir('uninstall') subdir('runtarget') py3 = import('python3').find_python() custom_target( 'ctlist-test', output: 'out.txt', command: [py3, '-c', 'print("")'], capture: true, build_by_default: true, ) muon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/phony/0002755000175000017500000000000014751453622024662 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/phony/meson.build0000644000175000017500000000004614751453622027022 0ustar buildbuildexecutable('test-phony', '../test.c') muon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/all/0002755000175000017500000000000014751453622024275 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/all/meson.build0000644000175000017500000000004414751453622026433 0ustar buildbuildexecutable('test-all', '../test.c') muon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/install/0002755000175000017500000000000014751453622025173 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/install/meson.build0000644000175000017500000000005014751453622027326 0ustar buildbuildexecutable('test-install', '../test.c') muon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/clean/0002755000175000017500000000000014751453622024607 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/clean/meson.build0000644000175000017500000000004614751453622026747 0ustar buildbuildexecutable('test-clean', '../test.c') muon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/distcheck/0002755000175000017500000000000014751453622025466 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/distcheck/meson.build0000644000175000017500000000005214751453622027623 0ustar buildbuildexecutable('test-distcheck', '../test.c') muon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/benchmark/0002755000175000017500000000000014751453622025457 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/benchmark/meson.build0000644000175000017500000000005214751453622027614 0ustar buildbuildexecutable('test-benchmark', '../test.c') muon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/reconfigure/0002755000175000017500000000000014751453622026035 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/reconfigure/meson.build0000644000175000017500000000005414751453622030174 0ustar buildbuildexecutable('test-reconfigure', '../test.c') muon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/clean-gcda/0002755000175000017500000000000014751453622025503 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/clean-gcda/meson.build0000644000175000017500000000005314751453622027641 0ustar buildbuildexecutable('test-clean-gcda', '../test.c') muon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/clean-ctlist/0002755000175000017500000000000014751453622026107 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/150 reserved targets/clean-ctlist/meson.build0000644000175000017500000000005514751453622030247 0ustar buildbuildexecutable('test-clean-ctlist', '../test.c') muon-v0.4.0/subprojects/meson-tests/common/46 subproject subproject/0002755000175000017500000000000014751453622024521 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/46 subproject subproject/subprojects/0002755000175000017500000000000014751453622027064 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/46 subproject subproject/subprojects/a/0002755000175000017500000000000014751453622027304 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/46 subproject subproject/subprojects/a/a.c0000644000175000017500000000054514751453622027672 0ustar buildbuildint func2(void); #if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllexport) #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif int DLL_PUBLIC func(void) { return func2(); } muon-v0.4.0/subprojects/meson-tests/common/46 subproject subproject/subprojects/a/meson.build0000644000175000017500000000014714751453622031446 0ustar buildbuildproject('a', 'c') b = subproject('b') l = shared_library('a', 'a.c', link_with: b.get_variable('lb')) muon-v0.4.0/subprojects/meson-tests/common/46 subproject subproject/subprojects/c/0002755000175000017500000000000014751453622027306 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/46 subproject subproject/subprojects/c/meson.build0000644000175000017500000000014614751453622031447 0ustar buildbuildproject('not-found-dep-subproj', 'c', version: '1.0') notfound_dep = dependency('', required: false) muon-v0.4.0/subprojects/meson-tests/common/46 subproject subproject/subprojects/b/0002755000175000017500000000000014751453622027305 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/46 subproject subproject/subprojects/b/meson.build0000644000175000017500000000006314751453622031444 0ustar buildbuildproject('b', 'c') lb = shared_library('b', 'b.c') muon-v0.4.0/subprojects/meson-tests/common/46 subproject subproject/subprojects/b/b.c0000644000175000017500000000052314751453622027670 0ustar buildbuild#if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllexport) #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif int DLL_PUBLIC func2(void) { return 42; } muon-v0.4.0/subprojects/meson-tests/common/46 subproject subproject/meson.build0000644000175000017500000000055414751453622026665 0ustar buildbuildproject('sub sub', 'c') # different from meson: force b to be evaulated first, so it is found when a # looks it up subproject('b') a = subproject('a') lib = a.get_variable('l') dependency( 'not-found-dep', required: false, version: '>=1', fallback: ['c', 'notfound_dep'], ) exe = executable('prog', 'prog.c', link_with: lib) test('basic', exe) muon-v0.4.0/subprojects/meson-tests/common/46 subproject subproject/prog.c0000644000175000017500000000010514751453622025626 0ustar buildbuildint func(void); int main(void) { return func() == 42 ? 0 : 1; } muon-v0.4.0/subprojects/meson-tests/common/184 openmp/0002755000175000017500000000000014751453622021561 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/184 openmp/main.c0000644000175000017500000000051414751453622022647 0ustar buildbuild#include #include int main(void) { #ifdef _OPENMP if (omp_get_max_threads() == 2) { return 0; } else { printf("Max threads is %d not 2.\n", omp_get_max_threads()); return 1; } #else printf("_OPENMP is not defined; is OpenMP compilation working?\n"); return 1; #endif } muon-v0.4.0/subprojects/meson-tests/common/184 openmp/main.f900000644000175000017500000000032714751453622023025 0ustar buildbuilduse, intrinsic :: iso_fortran_env, only: stderr=>error_unit use omp_lib if (omp_get_max_threads() /= 2) then write(stderr, *) 'Max Fortran threads is', omp_get_max_threads(), 'not 2.' stop 1 endif end program muon-v0.4.0/subprojects/meson-tests/common/184 openmp/main.cpp0000644000175000017500000000054314751453622023211 0ustar buildbuild#include #include int main(void) { #ifdef _OPENMP if (omp_get_max_threads() == 2) { return 0; } else { std::cout << "Max threads is " << omp_get_max_threads() << " not 2." << std::endl; return 1; } #else printf("_OPENMP is not defined; is OpenMP compilation working?\n"); return 1; #endif } muon-v0.4.0/subprojects/meson-tests/common/184 openmp/meson.build0000644000175000017500000000342014751453622023720 0ustar buildbuildproject('openmp', 'c') cc = meson.get_compiler('c') if cc.get_id() == 'gcc' and cc.version().version_compare('<4.2.0') error('MESON_SKIP_TEST gcc is too old to support OpenMP.') endif if cc.get_id() == 'clang' and cc.version().version_compare('<3.7.0') error('MESON_SKIP_TEST clang is too old to support OpenMP.') endif if cc.get_id() == 'msvc' and cc.version().version_compare('<17') error('MESON_SKIP_TEST msvc is too old to support OpenMP.') endif if cc.get_id() == 'clang-cl' and cc.version().version_compare('<10.0.0') error('MESON_SKIP_TEST clang-cl is too old to support OpenMP.') endif if cc.get_id() == 'clang' and host_machine.system() == 'windows' error('MESON_SKIP_TEST Windows clang does not support OpenMP.') endif openmp = dependency('openmp') env = environment() env.set('OMP_NUM_THREADS', '2') exec = executable('exec', 'main.c', dependencies: [openmp]) test('OpenMP C', exec, env: env) if not (build_machine.system() == 'windows' and cc.get_id() == 'pgi') if add_languages('cpp', required: false) execpp = executable('execpp', 'main.cpp', dependencies: [openmp]) test('OpenMP C++', execpp, env: env) endif endif if add_languages('fortran', required: false) # Mixing compilers (msvc/clang with gfortran) does not seem to work on Windows. if build_machine.system() != 'windows' or cc.get_id() == 'gnu' exef = executable('exef', 'main.f90', dependencies: [openmp]) test('OpenMP Fortran', exef, env: env) openmp_f = dependency('openmp', language: 'fortran') exe_f = executable('exe_f', 'main.f90', dependencies: [openmp_f]) test('OpenMP Fortran-specific', exe_f, env: env) endif endif # Check we can apply a version constraint dependency('openmp', version: '>=@0@'.format(openmp.version())) muon-v0.4.0/subprojects/meson-tests/common/271 env in generator.process/0002755000175000017500000000000014751453622025063 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/271 env in generator.process/main.template0000644000175000017500000000005414751453622027541 0ustar buildbuildint main(void) { return ENV_VAR_VALUE; }muon-v0.4.0/subprojects/meson-tests/common/271 env in generator.process/meson.build0000644000175000017500000000121014751453622027215 0ustar buildbuildproject('test_env_in_generator_process', 'c') generate_main_py = find_program('generate_main.py') main_generator = generator( generate_main_py, arguments: ['@INPUT@', '@OUTPUT@'], output: '@BASENAME@' + '.c', ) main_template = files('main.template') # With explicit values my_executable = executable( 'myexecutable', main_generator.process(main_template, env: {'ENV_VAR_VALUE': '0'}), ) test('explicit_value', my_executable) # With env object env = environment() env.set('ENV_VAR_VALUE', '0') my_executable2 = executable('myexecutable2', main_generator.process(main_template, env: env)) test('env_object', my_executable2) muon-v0.4.0/subprojects/meson-tests/common/271 env in generator.process/generate_main.py0000644000175000017500000000043614751453622030234 0ustar buildbuild#!/usr/bin/env python3 import os import sys ENV_VAR_VALUE = os.environ.get('ENV_VAR_VALUE') assert ENV_VAR_VALUE is not None with open(sys.argv[1], 'r') as infile, \ open(sys.argv[2], 'w') as outfile: outfile.write(infile.read().replace('ENV_VAR_VALUE', ENV_VAR_VALUE)) muon-v0.4.0/subprojects/meson-tests/common/47 same file name/0002755000175000017500000000000014751453622022727 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/47 same file name/meson.build0000644000175000017500000000014014751453622025062 0ustar buildbuildproject('samefile', 'c') test('basic', executable('prog', 'prog.c', 'd1/file.c', 'd2/file.c')) muon-v0.4.0/subprojects/meson-tests/common/47 same file name/d1/0002755000175000017500000000000014751453622023233 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/47 same file name/d1/file.c0000644000175000017500000000003714751453622024314 0ustar buildbuildint func1(void) { return 42; } muon-v0.4.0/subprojects/meson-tests/common/47 same file name/prog.c0000644000175000017500000000012414751453622024035 0ustar buildbuildint func1(void); int func2(void); int main(void) { return func1() - func2(); } muon-v0.4.0/subprojects/meson-tests/common/47 same file name/d2/0002755000175000017500000000000014751453622023234 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/47 same file name/d2/file.c0000644000175000017500000000003714751453622024315 0ustar buildbuildint func2(void) { return 42; } muon-v0.4.0/subprojects/meson-tests/common/228 custom_target source/0002755000175000017500000000000014751453622024423 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/228 custom_target source/x.py0000644000175000017500000000020414751453622025236 0ustar buildbuild#! /usr/bin/env python3 with open('x.c', 'w') as f: print('int main(void) { return 0; }', file=f) with open('y', 'w'): pass muon-v0.4.0/subprojects/meson-tests/common/228 custom_target source/a0000644000175000017500000000000014751453622024552 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/228 custom_target source/meson.build0000644000175000017500000000023214751453622026560 0ustar buildbuildproject('a', ['c']) x = find_program('x.py') outs = custom_target('foo', output: ['x.c', 'y'], input: 'a', command: [x]) executable('testprog', outs[0]) muon-v0.4.0/subprojects/meson-tests/common/226 link depends indexed custom target/0002755000175000017500000000000014751453622026763 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/226 link depends indexed custom target/check_arch.py0000644000175000017500000000132314751453622031404 0ustar buildbuild#!/usr/bin/env python3 import re import sys import shutil import subprocess exepath = sys.argv[1] want_arch = sys.argv[2] dummy_output = sys.argv[3] with open(dummy_output, 'w') as f: f.write('') if not shutil.which('dumpbin'): print('dumpbin not found, skipping') sys.exit(0) out = subprocess.check_output(['dumpbin', '/HEADERS', exepath], universal_newlines=True) for line in out.split('\n'): m = re.match(r'.* machine \(([A-Za-z0-9]+)\)$', line) if m: arch = m.groups()[0].lower() if arch == 'arm64': arch = 'aarch64' elif arch == 'x64': arch = 'x86_64' if arch != want_arch: raise RuntimeError(f'Wanted arch {want_arch} but exe uses {arch}') muon-v0.4.0/subprojects/meson-tests/common/226 link depends indexed custom target/meson.build0000644000175000017500000000116114751453622031122 0ustar buildbuildproject('link_depends_indexed_custom_target', 'c') cmd = find_program('make_file.py') dep_files = custom_target('gen_dep', command: [cmd, '@OUTPUT@'], output: ['dep_file1', 'dep_file2']) exe = executable( 'foo', 'foo.c', link_depends: dep_files[1], c_args: ['-DDEPFILE="' + dep_files[0].full_path() + '"'], ) check_arch = find_program('check_arch.py') custom_target( 'check-arch', command: [check_arch, exe, host_machine.cpu_family(), '@OUTPUT@'], build_by_default: true, output: 'dummy.txt', ) # check that dep_file1 exists, which means that link_depends target ran test('runtest', exe) muon-v0.4.0/subprojects/meson-tests/common/226 link depends indexed custom target/make_file.py0000644000175000017500000000030414751453622031244 0ustar buildbuild#!/usr/bin/env python3 import sys with open(sys.argv[1], 'w') as f: print('# this file does nothing', file=f) with open(sys.argv[2], 'w') as f: print('# this file does nothing', file=f) muon-v0.4.0/subprojects/meson-tests/common/226 link depends indexed custom target/foo.c0000644000175000017500000000034614751453622027713 0ustar buildbuild#include int main(void) { const char *fn = DEPFILE; FILE *f = fopen(fn, "r"); if (!f) { printf("could not open %s", fn); return 1; } else { printf("successfully opened %s", fn); } return 0; } muon-v0.4.0/subprojects/meson-tests/common/264 required keyword in has functions/0002755000175000017500000000000014751453622026663 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/264 required keyword in has functions/meson_options.txt0000644000175000017500000000006214751453622032314 0ustar buildbuildoption('opt', type: 'feature', value: 'disabled') muon-v0.4.0/subprojects/meson-tests/common/264 required keyword in has functions/meson.build0000644000175000017500000000514714751453622031032 0ustar buildbuildproject('required keyword in has functions', 'c') cc = meson.get_compiler('c') opt = get_option('opt') cc.has_function('printf', prefix: '#include', required: true) cc.has_type('time_t', prefix: '#include', required: true) cc.has_member('struct tm', 'tm_sec', prefix: '#include', required: true) cc.has_members( 'struct tm', ['tm_sec', 'tm_min'], prefix: '#include', required: true, ) cc.has_header('time.h', required: true) cc.has_header_symbol('time.h', 'time', required: true) assert(not cc.has_function('printf', prefix: '#include', required: opt)) assert(not cc.has_type('time_t', prefix: '#include', required: opt)) assert( not cc.has_member('struct tm', 'tm_sec', prefix: '#include', required: opt), ) assert( not cc.has_members( 'struct tm', ['tm_sec', 'tm_min'], prefix: '#include', required: opt, ), ) assert(not cc.has_header('time.h', required: opt)) assert(not cc.has_header_symbol('time.h', 'time', required: opt)) # compiler.has_argument if cc.get_id() == 'msvc' is_arg = '/O2' else is_arg = '-O2' endif cc.has_argument(is_arg, required: true) assert(not cc.has_argument(is_arg, required: opt)) # compiler.has_multi_arguments if cc.get_id() == 'gcc' pre_arg = '-Wformat' arg = '-Werror=format-security' cc.has_multi_arguments([pre_arg, arg], required: true) assert(not cc.has_multi_arguments(pre_arg, arg, required: opt)) endif # compiler.has_link_argument if cc.get_argument_syntax() == 'msvc' is_arg = '/OPT:REF' else is_arg = '-Wl,-L/tmp' endif cc.has_link_argument(is_arg, required: true) assert(not cc.has_link_argument(is_arg, required: opt)) # compiler.has_function_attribute if not ['pgi', 'msvc', 'clang-cl', 'intel-cl'].contains(cc.get_id()) a = 'aligned' cc.has_function_attribute(a, required: true) assert(not cc.has_function_attribute(a, required: opt)) endif # testcase expect_error('''compiler.has_function keyword argument 'required' was of type str but should have been one of: bool, UserFeatureOption''') # cc.has_function('printf', required : 'not a bool') # endtestcase # testcase expect_error('''C function 'asdfkawlegsdiovapfjhkr' not usable''') # cc.has_function('asdfkawlegsdiovapfjhkr', required : true) # endtestcase # testcase expect_error('''C header 'asdfkawlegsdiovapfjhkr.h' not found''') # cc.has_header('asdfkawlegsdiovapfjhkr.h', required : true) # endtestcase # testcase expect_error('''C symbol time_not_found not found in header time.h''') # cc.has_header_symbol('time.h', 'time_not_found', required : true) # endtestcase muon-v0.4.0/subprojects/meson-tests/common/137 whole archive/0002755000175000017500000000000014751453622023001 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/137 whole archive/mylib.h0000644000175000017500000000074314751453622024270 0ustar buildbuild#pragma once /* Both funcs here for simplicity. */ #if defined _WIN32 || defined __CYGWIN__ #if defined BUILDING_DLL #define DLL_PUBLIC __declspec(dllexport) #else #define DLL_PUBLIC __declspec(dllimport) #endif #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif int DLL_PUBLIC func1(void); int DLL_PUBLIC func2(void); muon-v0.4.0/subprojects/meson-tests/common/137 whole archive/sh_func2_transdep_func1/0002755000175000017500000000000014751453622027504 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/137 whole archive/sh_func2_transdep_func1/meson.build0000644000175000017500000000043014751453622031641 0ustar buildbuild# Same as sh_func2_dep_func1 but dependency is transitive. # func2.c does not have any reference to func1() so without link_whole compiler # should throw func1() out. sh_func2_transdep_func1 = shared_library('sh_func2_transdep_func1', '../func2.c', dependencies: func1_trans_dep) muon-v0.4.0/subprojects/meson-tests/common/137 whole archive/sh_func2_linked_func1/0002755000175000017500000000000014751453622027132 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/137 whole archive/sh_func2_linked_func1/meson.build0000644000175000017500000000031614751453622031272 0ustar buildbuild# Nothing in func2.c uses func1, so the linker would throw it # away and thus linking the exe would fail. sh_func2_linked_func1 = shared_library('sh_func2_linked_func1', '../func2.c', link_whole: st_func1) muon-v0.4.0/subprojects/meson-tests/common/137 whole archive/st_func1/0002755000175000017500000000000014751453622024523 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/137 whole archive/st_func1/meson.build0000644000175000017500000000006414751453622026663 0ustar buildbuildst_func1 = static_library('st_func1', '../func1.c') muon-v0.4.0/subprojects/meson-tests/common/137 whole archive/exe/0002755000175000017500000000000014751453622023562 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/137 whole archive/exe/meson.build0000644000175000017500000000011014751453622025712 0ustar buildbuildexe = executable('prog', '../prog.c', link_with: sh_func2_linked_func1) muon-v0.4.0/subprojects/meson-tests/common/137 whole archive/sh_func2_dep_func1/0002755000175000017500000000000014751453622026434 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/137 whole archive/sh_func2_dep_func1/meson.build0000644000175000017500000000045414751453622030577 0ustar buildbuild# Same as sh_func2_linked_func1, # func2.c does not depend on func1(), # so without link_whole compiler would throw func1() away. # This is the same version of the test with a dependency object instead. sh_func2_dep_func1 = shared_library('sh_func2_dep_func1', '../func2.c', dependencies: func1_dep) muon-v0.4.0/subprojects/meson-tests/common/137 whole archive/meson.build0000644000175000017500000000327314751453622025146 0ustar buildbuildproject('whole archive', 'c') if meson.backend() == 'xcode' or meson.backend() == 'vs2010' or meson.backend() == 'vs2012' or meson.backend() == 'vs2013' error( 'MESON_SKIP_TEST: whole-archive not supported in Xcode nor pre-VS2015 IDE. Patches welcome.', ) endif add_project_arguments('-I' + meson.source_root(), language: 'c') # Test 1: link_whole keeps all symbols # Make static func1 subdir('st_func1') # Make shared func2 linking whole func1 archive subdir('sh_func2_linked_func1') # Link exe with shared library only subdir('exe') # Test that both func1 and func2 are accessible from shared library test('prog', exe) # Test 2: link_whole can be used instead of source list, see #2180 # Make static func2 subdir('st_func2') # Link both func1 and func2 into same shared library # which does not have any sources other than 2 static libraries subdir('sh_only_link_whole') # Link exe2 with shared library only subdir('exe2') # Test that both func1 and func2 are accessible from shared library test('prog2', exe2) # Test 3: link_whole can be used in declare_dependency() func1_dep = declare_dependency(link_whole: [st_func1]) # Use dependency to link func1 into shared library subdir('sh_func2_dep_func1') # Link exe3 with shared library subdir('exe3') # Test that both func1 and func2 are accessible from shared library test('prog3', exe3) # Test 4: link_whole can be used in transitive declare_dependency() func1_trans_dep = declare_dependency(dependencies: func1_dep) # Use transitive dependency to link func1 into shared library subdir('sh_func2_transdep_func1') # Link exe4 with shared library subdir('exe4') # Test that both func1 and func2 are accessible from shared library test('prog4', exe4) muon-v0.4.0/subprojects/meson-tests/common/137 whole archive/exe2/0002755000175000017500000000000014751453622023644 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/137 whole archive/exe2/meson.build0000644000175000017500000000010714751453622026002 0ustar buildbuildexe2 = executable('prog2', '../prog.c', link_with: sh_only_link_whole) muon-v0.4.0/subprojects/meson-tests/common/137 whole archive/func1.c0000644000175000017500000000011414751453622024153 0ustar buildbuild#define BUILDING_DLL #include int func1(void) { return 42; } muon-v0.4.0/subprojects/meson-tests/common/137 whole archive/st_func2/0002755000175000017500000000000014751453622024524 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/137 whole archive/st_func2/meson.build0000644000175000017500000000006414751453622026664 0ustar buildbuildst_func2 = static_library('st_func2', '../func2.c') muon-v0.4.0/subprojects/meson-tests/common/137 whole archive/exe3/0002755000175000017500000000000014751453622023645 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/137 whole archive/exe3/meson.build0000644000175000017500000000010714751453622026003 0ustar buildbuildexe3 = executable('prog3', '../prog.c', link_with: sh_func2_dep_func1) muon-v0.4.0/subprojects/meson-tests/common/137 whole archive/prog.c0000644000175000017500000000010414751453622024105 0ustar buildbuild#include int main(void) { return func1() - func2(); } muon-v0.4.0/subprojects/meson-tests/common/137 whole archive/sh_only_link_whole/0002755000175000017500000000000014751453622026667 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/137 whole archive/sh_only_link_whole/meson.build0000644000175000017500000000013414751453622031025 0ustar buildbuildsh_only_link_whole = shared_library('sh_only_link_whole', link_whole: [st_func1, st_func2]) muon-v0.4.0/subprojects/meson-tests/common/137 whole archive/func2.c0000644000175000017500000000011414751453622024154 0ustar buildbuild#define BUILDING_DLL #include int func2(void) { return 42; } muon-v0.4.0/subprojects/meson-tests/common/137 whole archive/exe4/0002755000175000017500000000000014751453622023646 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/137 whole archive/exe4/meson.build0000644000175000017500000000011414751453622026002 0ustar buildbuildexe4 = executable('prog4', '../prog.c', link_with: sh_func2_transdep_func1) muon-v0.4.0/subprojects/meson-tests/common/74 file object/0002755000175000017500000000000014751453622022347 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/74 file object/subdir1/0002755000175000017500000000000014751453622023720 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/74 file object/subdir1/meson.build0000644000175000017500000000036214751453622026061 0ustar buildbuildprog1 = files('prog.c') lib1 = files('lib.c') test('subdir0', executable('subdir0', prog0, lib1), should_fail: true) test('subdir1', executable('subdir1', prog1, lib0), should_fail: true) test('subdir2', executable('subdir2', prog1, lib1)) muon-v0.4.0/subprojects/meson-tests/common/74 file object/subdir1/lib.c0000644000175000017500000000004114751453622024623 0ustar buildbuildint func(void) { return 1; } muon-v0.4.0/subprojects/meson-tests/common/74 file object/subdir1/prog.c0000644000175000017500000000027714751453622025037 0ustar buildbuild#include int func(void); int main(void) { if(func() == 1) { printf("Iz success.\n"); } else { printf("Iz fail.\n"); return 1; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/74 file object/meson.build0000644000175000017500000000023614751453622024510 0ustar buildbuildproject('file object', 'c') prog0 = files('prog.c') lib0 = files('lib.c') test('fobj', executable('fobj', prog0, lib0)) subdir('subdir1') subdir('subdir2') muon-v0.4.0/subprojects/meson-tests/common/74 file object/lib.c0000644000175000017500000000004114751453622023252 0ustar buildbuildint func(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/74 file object/subdir2/0002755000175000017500000000000014751453622023721 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/74 file object/subdir2/meson.build0000644000175000017500000000036214751453622026062 0ustar buildbuildprog2 = files('prog.c') lib2 = files('lib.c') test('subdir3', executable('subdir3', prog1, lib2), should_fail: true) test('subdir4', executable('subdir4', prog2, lib1), should_fail: true) test('subdir4', executable('subdir5', prog2, lib2)) muon-v0.4.0/subprojects/meson-tests/common/74 file object/subdir2/lib.c0000644000175000017500000000004114751453622024624 0ustar buildbuildint func(void) { return 2; } muon-v0.4.0/subprojects/meson-tests/common/74 file object/subdir2/prog.c0000644000175000017500000000027714751453622025040 0ustar buildbuild#include int func(void); int main(void) { if(func() == 2) { printf("Iz success.\n"); } else { printf("Iz fail.\n"); return 1; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/74 file object/prog.c0000644000175000017500000000037114751453622023461 0ustar buildbuild#include int func(void); /* Files in different subdirs return different values. */ int main(void) { if(func() == 0) { printf("Iz success.\n"); } else { printf("Iz fail.\n"); return 1; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/262 generator chain/0002755000175000017500000000000014751453622023311 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/262 generator chain/stage2.py0000644000175000017500000000024314751453622025045 0ustar buildbuild#!/usr/bin/env python3 import sys from pathlib import Path assert(Path(sys.argv[1]).read_text() == 'stage2\n') Path(sys.argv[2]).write_text('int main(void){}\n') muon-v0.4.0/subprojects/meson-tests/common/262 generator chain/meson.build0000644000175000017500000000066714751453622025462 0ustar buildbuildproject('Generator Chain', 'c') stage1_exe = find_program('stage1.py') stage2_exe = find_program('stage2.py') stage1_gen = generator( stage1_exe, output: '@PLAINNAME@.inter', arguments: ['@INPUT@', '@OUTPUT@'], ) stage2_gen = generator(stage2_exe, output: '@PLAINNAME@.c', arguments: ['@INPUT@', '@OUTPUT@']) out = stage2_gen.process(stage1_gen.process('data.txt')) hello = executable('hello', out) test('basic', hello) muon-v0.4.0/subprojects/meson-tests/common/262 generator chain/data.txt0000644000175000017500000000000714751453622024756 0ustar buildbuildstage1 muon-v0.4.0/subprojects/meson-tests/common/262 generator chain/stage1.py0000644000175000017500000000023114751453622025041 0ustar buildbuild#!/usr/bin/env python3 import sys from pathlib import Path assert(Path(sys.argv[1]).read_text() == 'stage1\n') Path(sys.argv[2]).write_text('stage2\n') muon-v0.4.0/subprojects/meson-tests/common/31 define10/0002755000175000017500000000000014751453622021565 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/31 define10/config.h.in0000644000175000017500000000004314751453622023603 0ustar buildbuild#mesondefine ONE #mesondefine ZERO muon-v0.4.0/subprojects/meson-tests/common/31 define10/meson.build0000644000175000017500000000036014751453622023724 0ustar buildbuildproject('set10test', 'c') conf = configuration_data() conf.set10('ONE', true) conf.set10('ZERO', false) configure_file(input: 'config.h.in', output: 'config.h', configuration: conf) exe = executable('prog', 'prog.c') test('10test', exe) muon-v0.4.0/subprojects/meson-tests/common/31 define10/prog.c0000644000175000017500000000034514751453622022700 0ustar buildbuild#include #include"config.h" int main(void) { if(ONE != 1) { fprintf(stderr, "ONE is not 1.\n"); return 1; } if(ZERO != 0) { fprintf(stderr, "ZERO is not 0.\n"); } return 0; } muon-v0.4.0/subprojects/meson-tests/common/35 string operations/0002755000175000017500000000000014751453622023650 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/35 string operations/meson.build0000644000175000017500000001354114751453622026014 0ustar buildbuildproject('string formatting') templ = '@0@bar@1@' assert( templ.format('foo', 'baz') == 'foobarbaz', 'Basic string formatting is broken.', ) assert('@0@'.format(1) == '1', 'String number formatting is broken.') assert('@0@'.format(true) == 'true', 'String boolean formatting is broken.') templ2 = '@0@' subs2 = '42' assert( templ2.format(subs2) == '42', 'String formatting with variables is broken.', ) assert('@@0@@ @@1@@'.format(1, 2) == '@1@ @2@', 'String format is recursive.') long = 'abcde' prefix = 'abc' suffix = 'cde' assert(long[0] == 'a') assert(long[2] == 'c') assert(long.replace('b', 'd') == 'adcde') assert(long.replace('z', 'x') == long) assert(long.replace(prefix, suffix) == 'cdede') assert(long.startswith(prefix), 'Prefix.') assert(not long.startswith(suffix), 'Not prefix.') assert(long.endswith(suffix), 'Suffix.') assert(not long.endswith(prefix), 'Not suffix.') assert(long.contains(prefix), 'Does not contain prefix') assert(long.contains(suffix), 'Does not contain suffix') assert(long.contains('bcd'), 'Does not contain middle part') assert(not long.contains('dc'), 'Broken contains') assert(long.to_upper() == 'ABCDE', 'Broken to_upper') assert(long.to_upper().to_lower() == long, 'Broken to_lower') assert( 'struct stat.st_foo'.underscorify() == 'struct_stat_st_foo', 'Broken underscorify', ) assert( '#include '.underscorify() == '_include__foo_bar_h_', 'Broken underscorify', ) # case should not change, space should be replaced, numbers are ok too assert( 'Do SomeThing 09'.underscorify() == 'Do_SomeThing_09', 'Broken underscorify', ) assert('3'.to_int() == 3, 'String int conversion does not work.') assert(true.to_string() == 'true', 'bool string conversion failed') assert(false.to_string() == 'false', 'bool string conversion failed') assert( true.to_string('yes', 'no') == 'yes', 'bool string conversion with args failed', ) assert( false.to_string('yes', 'no') == 'no', 'bool string conversion with args failed', ) assert('@0@'.format(true) == 'true', 'bool string formatting failed') # different from meson: format does not accept list arguments # assert( # '@0@'.format(['one', 'two']) == '[\'one\', \'two\']', # 'list string formatting failed', # ) assert(' '.join(['a', 'b', 'c']) == 'a b c', 'join() array broken') assert(''.join(['a', 'b', 'c']) == 'abc', 'empty join() broken') assert(' '.join(['a']) == 'a', 'single join broken') assert(' '.join(['a'], ['b', ['c']], 'd') == 'a b c d', 'varargs join broken') version_number = '1.2.8' assert(version_number.version_compare('>=1.2.8'), 'Version_compare gt broken') assert( not version_number.version_compare('>1.2.8'), 'Version_compare greater broken', ) assert( not version_number.version_compare('<1.2.8'), 'Version_compare less broken', ) assert(version_number.version_compare('<=1.2.8'), 'Version_compare le broken') assert(version_number.version_compare('==1.2.8'), 'Version_compare eq broken') assert( not version_number.version_compare('!=1.2.8'), 'Version_compare neq broken', ) assert( version_number.version_compare('<2.0'), 'Version_compare major less broken', ) assert( version_number.version_compare('>0.9'), 'Version_compare major greater broken', ) assert(' spaces tabs '.strip() == 'spaces tabs', 'Spaces and tabs badly stripped') assert( ''' multiline string '''.strip() == '''multiline string''', 'Newlines badly stripped', ) assert('"1.1.20"'.strip('"') == '1.1.20', '" badly stripped') assert('"1.1.20"'.strip('".') == '1.1.20', '". badly stripped') assert('"1.1.20" '.strip('" ') == '1.1.20', '". badly stripped') bs_c = '''\c''' bs_bs_c = '''\\c''' nl = ''' ''' bs_n = '''\n''' bs_nl = '''\ ''' bs_bs_n = '''\\n''' bs_bs_nl = '''\\ ''' bs_bs = '''\\''' bs = '''\''' assert('\c' == bs_c, 'Single backslash broken') assert('\\c' == bs_c, 'Double backslash broken') assert('\\\c' == bs_bs_c, 'Three backslash broken') assert('\\\\c' == bs_bs_c, 'Four backslash broken') assert('\n' == nl, 'Newline escape broken') assert('\\n' == bs_n, 'Double backslash broken before n') assert('\\\n' == bs_nl, 'Three backslash broken before n') assert('\\\\n' == bs_bs_n, 'Four backslash broken before n') assert('\\\\\n' == bs_bs_nl, 'Five backslash broken before n') assert('\\\\' == bs_bs, 'Double-backslash broken') assert('\\' == bs, 'Backslash broken') mysubstring = 'foobarbaz' assert(mysubstring.substring() == 'foobarbaz', 'substring is broken') assert(mysubstring.substring(0) == 'foobarbaz', 'substring is broken') assert(mysubstring.substring(1) == 'oobarbaz', 'substring is broken') assert(mysubstring.substring(-5) == 'arbaz', 'substring is broken') assert(mysubstring.substring(1, 4) == 'oob', 'substring is broken') assert(mysubstring.substring(1, -5) == 'oob', 'substring is broken') assert(mysubstring.substring(1, 0) == '', 'substring is broken') assert(mysubstring.substring(0, 100) == 'foobarbaz', 'substring is broken') assert(mysubstring.substring(-1, -5) == '', 'substring is broken') assert(mysubstring.substring(10, -25) == '', 'substring is broken') assert(mysubstring.substring(-4, 2) == '', 'substring is broken') assert(mysubstring.substring(10, 9) == '', 'substring is broken') assert(mysubstring.substring(8, 10) == 'z', 'substring is broken') # str.splitlines() assert( 'foo\nbar\nbaz'.splitlines() == ['foo', 'bar', 'baz'], 'splitlines is broken', ) assert(''.splitlines() == [], 'splitlines with empty string is broken') assert( 'foo\rbar\nbaz\n'.splitlines() == ['foo', 'bar', 'baz'], 'splitlines trailing newline is broken', ) assert('hello\r\nworld'.splitlines() == ['hello', 'world']) assert( ' leading ws\nand trailing\t'.splitlines() == [' leading ws', 'and trailing\t'], 'splitlines leading/trailing whitespace is broken', ) assert('\n\r\n\r'.splitlines() == ['', '', ''], 'splitlines is broken') assert('foo'.splitlines() == ['foo'], 'splitlines is broken') muon-v0.4.0/subprojects/meson-tests/common/78 internal dependency/0002755000175000017500000000000014751453622024120 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/78 internal dependency/meson.build0000644000175000017500000000010314751453622026252 0ustar buildbuildproject('internal dependency', 'c') subdir('proj1') subdir('src') muon-v0.4.0/subprojects/meson-tests/common/78 internal dependency/proj1/0002755000175000017500000000000014751453622025153 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/78 internal dependency/proj1/proj1f3.c0000644000175000017500000000014114751453622026575 0ustar buildbuild#include #include void proj1_func3(void) { printf("In proj1_func3.\n"); } muon-v0.4.0/subprojects/meson-tests/common/78 internal dependency/proj1/proj1f1.c0000644000175000017500000000014114751453622026573 0ustar buildbuild#include #include void proj1_func1(void) { printf("In proj1_func1.\n"); } muon-v0.4.0/subprojects/meson-tests/common/78 internal dependency/proj1/meson.build0000644000175000017500000000044314751453622027314 0ustar buildbuildincdirs = include_directories('include') p1lib = static_library('proj1', 'proj1f1.c', include_directories: incdirs) indirect_source = files('proj1f2.c') proj1_dep = declare_dependency( include_directories: incdirs, link_with: p1lib, sources: ['proj1f3.c', indirect_source], ) muon-v0.4.0/subprojects/meson-tests/common/78 internal dependency/proj1/include/0002755000175000017500000000000014751453622026576 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/78 internal dependency/proj1/include/proj1.h0000644000175000017500000000012614751453622027777 0ustar buildbuild#pragma once void proj1_func1(void); void proj1_func2(void); void proj1_func3(void); muon-v0.4.0/subprojects/meson-tests/common/78 internal dependency/proj1/proj1f2.c0000644000175000017500000000014114751453622026574 0ustar buildbuild#include #include void proj1_func2(void) { printf("In proj1_func2.\n"); } muon-v0.4.0/subprojects/meson-tests/common/78 internal dependency/src/0002755000175000017500000000000014751453622024707 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/78 internal dependency/src/main.c0000644000175000017500000000025214751453622025774 0ustar buildbuild#include #include int main(void) { printf("Now calling into library.\n"); proj1_func1(); proj1_func2(); proj1_func3(); return 0; } muon-v0.4.0/subprojects/meson-tests/common/78 internal dependency/src/meson.build0000644000175000017500000000012614751453622027046 0ustar buildbuildexe = executable('projtest', 'main.c', dependencies: proj1_dep) test('projtest', exe) muon-v0.4.0/subprojects/meson-tests/common/102 extract same name/0002755000175000017500000000000014751453622023532 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/102 extract same name/main.c0000644000175000017500000000014414751453622024617 0ustar buildbuildint func1(void); int func2(void); int main(void) { return !(func1() == 23 && func2() == 42); } muon-v0.4.0/subprojects/meson-tests/common/102 extract same name/meson.build0000644000175000017500000000153514751453622025676 0ustar buildbuildproject('object extraction', 'c') if meson.backend() == 'xcode' # Xcode gives object files unique names but only if they would clash. For example # two files named lib.o instead get the following names: # # lib-4fbe522d8ba4cb1f1b89cc2df640a2336b92e1a5565f0a4c5a79b5b5e2969eb9.o # lib-4fbe522d8ba4cb1f1b89cc2df640a2336deeff2bc2297affaadbe20f5cbfee56.o # # No-one has reverse engineered the naming scheme so we would access them. # IF you feel up to the challenge, patches welcome. error( 'MESON_SKIP_TEST, Xcode cannot extract objs when they would have the same filename.', ) endif lib = library('somelib', ['lib.c', 'src/lib.c']) # Also tests that the object list is flattened properly obj = lib.extract_objects(['lib.c', ['src/lib.c']]) exe = executable('main', 'main.c', objects: obj) test('extraction', exe) muon-v0.4.0/subprojects/meson-tests/common/102 extract same name/lib.c0000644000175000017500000000004314751453622024437 0ustar buildbuildint func1(void) { return 23; } muon-v0.4.0/subprojects/meson-tests/common/102 extract same name/src/0002755000175000017500000000000014751453622024321 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/102 extract same name/src/lib.c0000644000175000017500000000004314751453622025226 0ustar buildbuildint func2(void) { return 42; } muon-v0.4.0/subprojects/meson-tests/common/107 spaces backslash/0002755000175000017500000000000014751453622023450 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/107 spaces backslash/asm output/0002755000175000017500000000000014751453622025551 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/107 spaces backslash/asm output/meson.build0000644000175000017500000000011114751453622027702 0ustar buildbuildconfigure_file(output: 'blank.txt', configuration: configuration_data()) muon-v0.4.0/subprojects/meson-tests/common/107 spaces backslash/meson.build0000644000175000017500000000271214751453622025612 0ustar buildbuildproject('comparer', 'c') # Added manually as a c_arg to test handling of include paths with backslashes # and spaces. This is especially useful on Windows in vcxproj files since it # stores include directories in a separate element that has its own # context-specific escaping/quoting. include_dir = meson.current_source_dir() + '/include' default_c_args = ['-I' + include_dir] if meson.get_compiler('c').get_argument_syntax() == 'msvc' default_c_args += ['/Faasm output\\'] # Hack to create the 'asm output' directory in the builddir subdir('asm output') endif # different than meson: \ is not auto-escaped in C defines # Path can contain \. Here we're sending `"foo\bar"`. test( 'backslash quoting', executable( 'comparer', 'comparer.c', c_args: default_c_args + ['-DDEF_WITH_BACKSLASH="foo\\\\bar"'], ), ) # Path can end in \ without any special quoting. Here we send `"foo\bar\"`. test( 'backslash end quoting', executable( 'comparer-end', 'comparer-end.c', c_args: default_c_args + ['-DDEF_WITH_BACKSLASH="foo\\\\bar\\\\"'], ), ) # Path can (really) end in \ if we're not passing a string literal without any # special quoting. Here we're sending `foo\bar\`. test( 'backslash end quoting when not a string literal', executable( 'comparer-end-notstring', 'comparer-end-notstring.c', c_args: default_c_args + ['-DDEF_WITH_BACKSLASH=foo\\\\bar\\\\'], ), ) muon-v0.4.0/subprojects/meson-tests/common/107 spaces backslash/comparer.c0000644000175000017500000000061014751453622025417 0ustar buildbuild#include "comparer.h" #ifndef COMPARER_INCLUDED #error "comparer.h not included" #endif #define COMPARE_WITH "foo\\bar" /* This is the literal `foo\bar` */ int main(void) { if (strcmp (DEF_WITH_BACKSLASH, COMPARE_WITH)) { printf ("Arg string is quoted incorrectly: %s instead of %s\n", DEF_WITH_BACKSLASH, COMPARE_WITH); return 1; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/107 spaces backslash/comparer-end.c0000644000175000017500000000056714751453622026176 0ustar buildbuild#include "comparer.h" #ifndef COMPARER_INCLUDED #error "comparer.h not included" #endif #define COMPARE_WITH "foo\\bar\\" /* This is `foo\bar\` */ int main(void) { if (strcmp (DEF_WITH_BACKSLASH, COMPARE_WITH)) { printf ("Arg string is quoted incorrectly: %s vs %s\n", DEF_WITH_BACKSLASH, COMPARE_WITH); return 1; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/107 spaces backslash/include/0002755000175000017500000000000014751453622025073 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/107 spaces backslash/include/comparer.h0000644000175000017500000000010214751453622027043 0ustar buildbuild#include #include #define COMPARER_INCLUDED muon-v0.4.0/subprojects/meson-tests/common/107 spaces backslash/comparer-end-notstring.c0000644000175000017500000000100014751453622030202 0ustar buildbuild#include "comparer.h" #ifndef COMPARER_INCLUDED #error "comparer.h not included" #endif /* This converts foo\\\\bar\\\\ to "foo\\bar\\" (string literal) */ #define Q(x) #x #define QUOTE(x) Q(x) #define COMPARE_WITH "foo\\bar\\" /* This is the literal `foo\bar\` */ int main(void) { if(strcmp(QUOTE(DEF_WITH_BACKSLASH), COMPARE_WITH)) { printf("Arg string is quoted incorrectly: %s instead of %s\n", QUOTE(DEF_WITH_BACKSLASH), COMPARE_WITH); return 1; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/63 array arithmetic/0002755000175000017500000000000014751453622023427 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/63 array arithmetic/meson.build0000644000175000017500000000062714751453622025574 0ustar buildbuildproject('array arithmetic') array1 = ['foo', 'bar'] array2 = ['qux', 'baz'] if array1 + array2 != ['foo', 'bar', 'qux', 'baz'] error('Array concatenation is broken') endif if array2 + array1 != ['qux', 'baz', 'foo', 'bar'] error('Array concatenation is broken') endif if array1 + array1 + array1 != ['foo', 'bar', 'foo', 'bar', 'foo', 'bar'] error('Many-array concatenation is broken') endif muon-v0.4.0/subprojects/meson-tests/common/2 cpp/0002755000175000017500000000000014751453622020672 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/2 cpp/something.txt0000644000175000017500000000010614751453622023423 0ustar buildbuildThis file is only here so it shows up in IDEs as part of this target. muon-v0.4.0/subprojects/meson-tests/common/2 cpp/meson.build0000644000175000017500000000206514751453622023035 0ustar buildbuildproject('c++ test', 'cpp', version: files('VERSIONFILE')) cpp = meson.get_compiler('cpp') if cpp.get_id() == 'intel' # Error out if the -std=xxx option is incorrect add_project_arguments('-diag-error', '10159', language: 'cpp') elif cpp.get_id() == 'intel-cl' add_project_arguments('/Qdiag-error:10159', language: 'cpp') endif exe = executable('trivialprog', 'trivial.cc', extra_files: 'something.txt') test('runtest', exe) has_not_changed = false if is_disabler(exe) has_not_changed = true else has_not_changed = true endif assert(has_not_changed, 'Executable has changed.') assert(not is_disabler(exe), 'Executable is a disabler.') exe = executable('trivialprog', 'trivial.cc', extra_files: disabler()) assert(is_disabler(exe), 'Executable is not a disabler.') if exe.found() exe_disabled = false else exe_disabled = true endif assert(exe_disabled, 'Executable was not disabled.') if cpp.get_id() == 'msvc' exe = executable('cppprog', 'cpp.C', cpp_args: '/TP') else exe = executable('cppprog', 'cpp.C') endif test('cpptest', exe) muon-v0.4.0/subprojects/meson-tests/common/2 cpp/cpp.C0000644000175000017500000000015314751453622021555 0ustar buildbuild#include int main(void) { std::cout << "C++ seems to be working." << std::endl; return 0; } muon-v0.4.0/subprojects/meson-tests/common/2 cpp/VERSIONFILE0000644000175000017500000000000614751453622022374 0ustar buildbuild1.0.0 muon-v0.4.0/subprojects/meson-tests/common/2 cpp/trivial.cc0000644000175000017500000000015314751453622022650 0ustar buildbuild#include int main(void) { std::cout << "C++ seems to be working." << std::endl; return 0; } muon-v0.4.0/subprojects/meson-tests/common/26 find program/0002755000175000017500000000000014751453622022546 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/26 find program/print-version.py0000644000175000017500000000016314751453622025735 0ustar buildbuild#!/usr/bin/env python3 import sys if len(sys.argv) != 2 or sys.argv[1] != '--version': exit(1) print('1.0') muon-v0.4.0/subprojects/meson-tests/common/26 find program/print-version-custom-argument.py0000644000175000017500000000016214751453622031064 0ustar buildbuild#!/usr/bin/env python3 import sys if len(sys.argv) != 2 or sys.argv[1] != '-version': exit(1) print('1.0') muon-v0.4.0/subprojects/meson-tests/common/26 find program/meson.build0000644000175000017500000000303714751453622024711 0ustar buildbuildproject('find program') if build_machine.system() == 'windows' # Things Windows does not provide: # - an executable to copy files without prompting # - working command line quoting # - anything that you might actually need # Because of these reasons we only check that # the program can be found. cp = find_program('xcopy') else cp = find_program('donotfindme', 'cp') gen = generator(cp, output: '@BASENAME@.c', arguments: ['@INPUT@', '@OUTPUT@']) generated = gen.process('source.in') add_languages('c', required: true) e = executable('prog', generated) test('external exe', e) endif prog = find_program('print-version.py', version: '>=2.0', required: false) assert(not prog.found(), 'Version should be too old') prog = find_program('print-version.py', version: '>=1.0') assert(prog.found(), 'Program version should match') prog = find_program('print-version.py') assert(prog.version() == '1.0', 'Program version should be detectable') prog = find_program('print-version-with-prefix.py', version: '>=1.0') assert(prog.found(), 'Program version should match') prog = find_program( 'print-version-custom-argument.py', version: '>=1.0', version_argument: '-version', ) assert(prog.found(), 'Program version should match') prog = find_program('test_subdir.py', required: false) assert(not prog.found(), 'Program should not be found') prog = find_program( 'test_subdir.py', dirs: ['/nonexistent', meson.current_source_dir() / 'scripts'], ) assert(prog.found(), 'Program should be found') muon-v0.4.0/subprojects/meson-tests/common/26 find program/print-version-with-prefix.py0000644000175000017500000000017414751453622030203 0ustar buildbuild#!/usr/bin/env python3 import sys if len(sys.argv) != 2 or sys.argv[1] != '--version': exit(1) print('Version: 1.0') muon-v0.4.0/subprojects/meson-tests/common/26 find program/scripts/0002755000175000017500000000000014751453622024235 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/26 find program/scripts/test_subdir.py0000644000175000017500000000004014751453622027126 0ustar buildbuild#!/usr/bin/env python3 exit(0) muon-v0.4.0/subprojects/meson-tests/common/26 find program/source.in0000644000175000017500000000003714751453622024374 0ustar buildbuildint main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/0002755000175000017500000000000014751453622025706 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/dummy.cpp0000644000175000017500000000000014751453622027531 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/zlib.cc0000644000175000017500000000044714751453622027160 0ustar buildbuild#include #include "common.h" struct ZLibDependency : Dependency { void initialize(); }; void ZLibDependency::initialize() { if (ZLIB && ANOTHER) { std::cout << ANSI_START << "hello from zlib" << ANSI_END << std::endl; } } ZLibDependency zlib; muon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/boards/0002755000175000017500000000000014751453622027160 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/boards/arm/0002755000175000017500000000000014751453622027737 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/boards/arm/arm32.cc0000644000175000017500000000027714751453622031176 0ustar buildbuild#include "common.h" #include void initialize_target() { std::cout << ANSI_START << "a different " << THE_TARGET << " initialization" << ANSI_END << std::endl; } muon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/boards/arm/arm.h0000644000175000017500000000021614751453622030664 0ustar buildbuild#ifndef ARM_H #define ARM_H 1 #include "common.h" struct ARMBoard: Board { const char *target(); void some_arm_thing(); }; #endif ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/boards/arm/versatilepb.ccmuon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/boards/arm/versatilepb.c0000644000175000017500000000047714751453622032431 0ustar buildbuild#include #include "common.h" #include "arm.h" struct VersatilePBBoard: ARMBoard { void say_hello(); }; void VersatilePBBoard::say_hello() { some_arm_thing(); std::cout << ANSI_START << "I am the versatilepb board" << ANSI_END << std::endl; } static VersatilePBBoard versatilepb; ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/boards/arm/xlnx_zcu102.ccmuon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/boards/arm/xlnx_zcu102.c0000644000175000017500000000047414751453622032203 0ustar buildbuild#include #include "common.h" #include "arm.h" struct XlnxZCU102Board: ARMBoard { void say_hello(); }; void XlnxZCU102Board::say_hello() { some_arm_thing(); std::cout << ANSI_START << "I am the xlnx_zcu102 board" << ANSI_END << std::endl; } static XlnxZCU102Board xlnx_zcu102; muon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/boards/arm/virt.cc0000644000175000017500000000043414751453622031231 0ustar buildbuild#include #include "common.h" #include "arm.h" struct VirtBoard: ARMBoard { void say_hello(); }; void VirtBoard::say_hello() { some_arm_thing(); std::cout << ANSI_START << "I am the virt board" << ANSI_END << std::endl; } static VirtBoard virt; muon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/boards/arm/arm.cc0000644000175000017500000000016114751453622031021 0ustar buildbuild#include "arm.h" const char *ARMBoard::target() { return THE_TARGET; } void ARMBoard::some_arm_thing() { } muon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/boards/arm/aarch64.cc0000644000175000017500000000027014751453622031473 0ustar buildbuild#include "common.h" #include void initialize_target() { std::cout << ANSI_START << "some " << THE_TARGET << " initialization" << ANSI_END << std::endl; } muon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/boards/meson.build0000644000175000017500000000071514751453622031323 0ustar buildbuildspecific.add(when: 'TARGET_ARM', if_true: files('arm/arm.cc', 'arm/arm32.cc')) specific.add( when: 'TARGET_AARCH64', if_true: files('arm/aarch64.cc', 'arm/arm.cc'), ) specific.add(when: 'CONFIG_VIRT', if_true: files('arm/virt.cc')) specific.add(when: 'CONFIG_XLNX_ZCU102', if_true: files('arm/xlnx_zcu102.cc')) specific.add(when: 'CONFIG_VERSATILEPB', if_true: files('arm/versatilepb.cc')) specific.add(when: 'TARGET_X86', if_true: files('x86/pc.cc')) muon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/boards/x86/0002755000175000017500000000000014751453622027605 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/boards/x86/pc.cc0000644000175000017500000000066314751453622030521 0ustar buildbuild#include #include "common.h" struct X86Board: Board { const char *target(); void say_hello(); }; const char *X86Board::target() { return THE_TARGET; } void X86Board::say_hello() { std::cout << ANSI_START << "I am a 1996 PC" << ANSI_END << std::endl; } void initialize_target() { std::cout << ANSI_START << "ready, set, go" << ANSI_END << std::endl; } static X86Board pc; muon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/devices/0002755000175000017500000000000014751453622027330 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/devices/virtio-mmio.cc0000644000175000017500000000050714751453622032112 0ustar buildbuild#include #include "common.h" #include "virtio.h" struct VirtioMMIODevice: VirtioDevice { void say_hello(); }; void VirtioMMIODevice::say_hello() { some_virtio_thing(); std::cout << ANSI_START << "virtio-mmio is available" << ANSI_END << std::endl; } static VirtioMMIODevice virtio_mmio; muon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/devices/virtio.cc0000644000175000017500000000015014751453622031145 0ustar buildbuild#include #include "common.h" #include "virtio.h" void VirtioDevice::some_virtio_thing() { } muon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/devices/meson.build0000644000175000017500000000032114751453622031464 0ustar buildbuildspecific.add(when: 'CONFIG_VIRTIO', if_true: files('virtio.cc')) common.add(when: 'CONFIG_VIRTIO_PCI', if_true: files('virtio-pci.cc')) common.add(when: 'CONFIG_VIRTIO_MMIO', if_true: files('virtio-mmio.cc')) muon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/devices/virtio.h0000644000175000017500000000020114751453622031004 0ustar buildbuild#ifndef VIRTIO_H #define VIRTIO_H 1 #include "common.h" struct VirtioDevice: Device { void some_virtio_thing(); }; #endif muon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/devices/virtio-pci.cc0000644000175000017500000000050214751453622031717 0ustar buildbuild#include #include "common.h" #include "virtio.h" struct VirtioPCIDevice: VirtioDevice { void say_hello(); }; void VirtioPCIDevice::say_hello() { some_virtio_thing(); std::cout << ANSI_START << "virtio-pci is available" << ANSI_END << std::endl; } static VirtioPCIDevice virtio_pci; muon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/meson.build0000644000175000017500000000340014751453622030043 0ustar buildbuild# a sort-of realistic example that combines the sourceset and keyval # modules, inspired by QEMU's build system project('sourceset-example', 'cpp', default_options: ['cpp_std=c++11']) cppid = meson.get_compiler('cpp').get_id() if cppid == 'pgi' error( 'MESON_SKIP_TEST: Even PGI 19.4 that claims C++17 full support, cannot handle auto x = y syntax used in this test.', ) endif ss = import('sourceset') keyval = import('keyval') zlib = declare_dependency(compile_args: '-DZLIB=1') another = declare_dependency(compile_args: '-DANOTHER=1') not_found = dependency('not-found', required: false, method: 'pkg-config') common = ss.source_set() specific = ss.source_set() common.add(files('main.cc')) common.add(when: [zlib, another], if_true: files('zlib.cc')) common.add( when: not_found, if_true: files('was-found.cc'), if_false: files('not-found.cc'), ) subdir('boards') subdir('devices') if meson.is_unity() specific.add_all(common) common = ss.source_set() common.add(files('dummy.cpp')) endif common_lib = static_library('common', common.all_sources(), dependencies: common.all_dependencies()) targets = ['arm', 'aarch64', 'x86'] target_dirs = {'arm': 'arm', 'aarch64': 'arm', 'x86': 'x86'} foreach x : targets config = keyval.load('config' / x) target_specific = specific.apply(config, strict: false) target_common = common.apply(config, strict: false) target_deps = target_specific.dependencies() + target_common.dependencies() executable( x, objects: common_lib.extract_objects(target_common.sources()), sources: target_specific.sources(), dependencies: target_deps, include_directories: 'boards' / target_dirs[x], cpp_args: '-DTHE_TARGET="' + x + '"', ) endforeach muon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/config/0002755000175000017500000000000014751453622027153 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/config/aarch640000644000175000017500000000013114751453622030317 0ustar buildbuildTARGET_AARCH64=y CONFIG_VIRT=y CONFIG_XLNX_ZCU102=y CONFIG_VIRTIO=y CONFIG_VIRTIO_MMIO=y muon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/config/arm0000644000175000017500000000006014751453622027647 0ustar buildbuildTARGET_ARM=y CONFIG_VIRT=y CONFIG_VERSATILEPB=y muon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/config/x860000644000175000017500000000007514751453622027523 0ustar buildbuildTARGET_X86=y CONFIG_PC=y CONFIG_VIRTIO=y CONFIG_VIRTIO_PCI=y muon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/common.h0000644000175000017500000000127314751453622027350 0ustar buildbuild#ifndef COMMON_H #define COMMON_H 1 /* * target-specific code will print in yellow, common code will print * in grey. */ #ifdef THE_TARGET #define ANSI_START "\x1b[33;1m" #define ANSI_END "\x1b[0m" #else #define ANSI_START "" #define ANSI_END "" #endif void some_random_function(); void initialize_target(); struct Board { Board *next; Board(); virtual ~Board(); virtual void say_hello() = 0; virtual const char *target() = 0; }; struct Device { Device *next; Device(); virtual ~Device(); virtual void say_hello() = 0; }; struct Dependency { Dependency *next; Dependency(); virtual ~Dependency(); virtual void initialize() = 0; }; #endif muon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/not-found.cc0000644000175000017500000000024714751453622030127 0ustar buildbuild#include #include "common.h" void some_random_function() { std::cout << ANSI_START << "everything's alright" << ANSI_END << std::endl; } muon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/was-found.cc0000644000175000017500000000020314751453622030111 0ustar buildbuild#include void some_random_function() { std::cout << ANSI_START << "huh?" << ANSI_END << std::endl; } muon-v0.4.0/subprojects/meson-tests/common/215 source set realistic example/main.cc0000644000175000017500000000130214751453622027133 0ustar buildbuild#include #include #include "common.h" Board* boards; Device* devices; Dependency* deps; Board::Board() { this->next = boards; boards = this; } Board::~Board() {} Device::Device() { this->next = devices; devices = this; } Device::~Device() {} Dependency::Dependency() { this->next = deps; deps = this; } Dependency::~Dependency() {} int main(void) { some_random_function(); for (auto d = deps; d; d = d->next) d->initialize(); initialize_target(); for (auto b = boards; b; b = b->next) { std::cout << ANSI_START << b->target() << " - " << ANSI_END; b->say_hello(); } for (auto d = devices; d; d = d->next) d->say_hello(); } muon-v0.4.0/subprojects/meson-tests/common/132 get define/0002755000175000017500000000000014751453622022246 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/132 get define/meson_options.txt0000644000175000017500000000007514751453622025703 0ustar buildbuildoption('MESON_TEST_DEFINE_VALUE', type: 'string', value: '') muon-v0.4.0/subprojects/meson-tests/common/132 get define/concat.h0000644000175000017500000000122614751453622023665 0ustar buildbuild#define __STRINGIFY(x) #x #define TEST_STRINGIFY(x) __STRINGIFY(x) #define TEST_VERSION_MAJOR 6 #define TEST_VERSION_MINOR 0 #define TEST_VERSION_BUGFIX 0 #define TEST_VERSION_STR \ TEST_STRINGIFY(TEST_VERSION_MAJOR) \ "." TEST_STRINGIFY(TEST_VERSION_MINOR) "." TEST_STRINGIFY( \ TEST_VERSION_BUGFIX) #define TEST_CONCAT_1 \ "ab" \ "cd" \ "ef" \ "" #define TEST_CONCAT_2 1 #define TEST_CONCAT_3 1 2 3 #define TEST_CONCAT_4 "ab" 1 "cd" #define TEST_CONCAT_5 \ "ab\"" \ "cd" #define TEST_CONCAT_6 "ab\" \"cd" muon-v0.4.0/subprojects/meson-tests/common/132 get define/meson.build0000644000175000017500000001335414751453622024414 0ustar buildbuildproject('get define', 'c', 'cpp') host_system = host_machine.system() system_define_map = { 'linux': ['__linux__', '1'], 'darwin': ['__APPLE__', '1'], 'windows': ['_WIN32', '1'], 'cygwin': ['__CYGWIN__', '1'], 'haiku': ['__HAIKU__', '1'], 'dragonfly': ['__DragonFly__', '1'], 'netbsd': ['__NetBSD__', '1'], 'openbsd': ['__OpenBSD__', '1'], 'gnu': ['__GNU__', '1'], 'sunos': ['__sun__', '1'], # The __FreeBSD__ define will be equal to the major version of the release # (ex, in FreeBSD 11.x, __FreeBSD__ == 11). To make the test robust when # being run on various versions of FreeBSD, just test that the define is # set. 'freebsd': ['__FreeBSD__'], } foreach lang : ['c', 'cpp'] cc = meson.get_compiler(lang) if not system_define_map.has_key(host_system) error( 'Please report a bug and help us improve support for this platform', ) endif system_define = system_define_map.get(host_system) def_name = system_define[0] def_val = cc.get_define(system_define[0]) def_exist = cc.has_define(system_define[0]) assert( (def_val != '') == def_exist, 'The has_define and get_define results for @0@ disagree with each other'.format(def_name), ) if system_define.length() == 2 assert( def_val == system_define[1], '@0@ value is @1@ instead of @2@'.format(def_name, def_val, system_define[1]), ) elif system_define.length() == 1 assert(def_val != '', '@0@ value is unset'.format(def_name)) else error( 'Invalid number of items in system_define array, this is a bug in the test!', ) endif if cc.find_library('z', required: false).found() # When a C file containing #include is pre-processed and foo.h is # found in the compiler's default search path, GCC inserts an extra comment # between the delimiter and the define which causes a parsing error. # https://github.com/mesonbuild/meson/issues/1726 if host_machine.system() == 'netbsd' or host_machine.system() == 'openbsd' # NetBSD and OpenBSD's zlib don't have a ZLIB_VER_MAJOR, but they do have # a ZLIB_VERSION (which is a string), so check the first non-quote # character of that. ver = cc.get_define('ZLIB_VERSION', prefix: '#include ')[1] assert( ver == '1', 'ZLIB_VERSION (major) value is "@0@" instead of "1"'.format(ver), ) else ver = cc.get_define('ZLIB_VER_MAJOR', prefix: '#include ') assert( ver == '1', 'ZLIB_VER_MAJOR value is "@0@" instead of "1"'.format(ver), ) endif endif # Check that an undefined value is empty. have_val = cc.get_define('MESON_FAIL_VALUE') have = cc.has_define('MESON_FAIL_VALUE') assert( have_val == '', 'MESON_FAIL_VALUE value is "@0@" instead of ""'.format(have_val), ) assert( not have, 'MESON_FAIL_VALUE was found even though it should not have been', ) # Check that an empty define is reported as existing. have_val = cc.get_define('MESON_EMPTY_VALUE', prefix: ['#define MESON_EMPTY_VALUE']) have = cc.has_define('MESON_EMPTY_VALUE', prefix: ['#define MESON_EMPTY_VALUE']) assert( have_val == '', 'MESON_EMPTY_VALUE value is "@0@" instead of ""'.format(have_val), ) assert( have, 'MESON_EMPTY_VALUE was not found even though it should have been', ) # Check if prefix array works properly and has the expected order have = cc.get_define( 'MESON_FAIL_VALUE', prefix: ['#define MESON_FAIL_VALUE 1', '#undef MESON_FAIL_VALUE'], ) assert( have == '', 'MESON_FAIL_VALUE value is "@0@" instead of ""'.format(have), ) have = cc.get_define( 'MESON_SUCCESS_VALUE', prefix: ['#undef MESON_SUCCESS_VALUE', '#define MESON_SUCCESS_VALUE 1'], ) assert( have == '1', 'MESON_SUCCESS_VALUE value is "@0@" instead of ""'.format(have), ) # This is used in the test_preprocessor_checks_CPPFLAGS() unit test. have = cc.get_define('MESON_TEST_DEFINE_VALUE') expect = get_option('MESON_TEST_DEFINE_VALUE') assert( have == expect, 'MESON_TEST_DEFINE_VALUE value is "@0@" instead of "@1@"'.format(have, expect), ) run_1665_test = false if meson.is_cross_build() lang_arg = meson.get_cross_property(lang + '_args', '') if lang_arg == '-DMESON_TEST_ISSUE_1665=1' run_1665_test = true endif endif if run_1665_test have = cc.get_define('MESON_TEST_ISSUE_1665') assert( have == '1', 'MESON_TEST_ISSUE_1665 value is "@0@" instead of "1"'.format(have), ) endif have = cc.get_define( 'TEST_VERSION_STR', prefix: '#include ', include_directories: include_directories('.'), ) assert( have == '"6.0.0"', 'TEST_VERSION_STR value is "@0@" instead of ""6.0.0""'.format(have), ) concat_examples = { 'TEST_CONCAT_1': '"abcdef"', 'TEST_CONCAT_2': '1', 'TEST_CONCAT_3': '1 2 3', 'TEST_CONCAT_4': '"ab" 1 "cd"', 'TEST_CONCAT_5': '"ab\"cd"', 'TEST_CONCAT_6': '"ab\" \"cd"', } foreach def, expected : concat_examples have = cc.get_define( def, prefix: '#include ', include_directories: include_directories('.'), ) assert( have == expected, '@0@ value is "@1@" instead of "@2@"'.format(def, have, expected), ) endforeach endforeach muon-v0.4.0/subprojects/meson-tests/common/132 get define/test.json0000644000175000017500000000017214751453622024116 0ustar buildbuild{ "matrix": { "options": { "c_std": [ { "val": "none" }, { "val": "c11" } ] } } } muon-v0.4.0/subprojects/meson-tests/common/245 custom target index source/0002755000175000017500000000000014751453622025413 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/245 custom target index source/copyfile2.py0000644000175000017500000000020614751453622027655 0ustar buildbuild#!/usr/bin/env python3 import sys import shutil shutil.copyfile(sys.argv[1], sys.argv[2]) shutil.copyfile(sys.argv[3], sys.argv[4]) muon-v0.4.0/subprojects/meson-tests/common/245 custom target index source/main.c0000644000175000017500000000020214751453622026473 0ustar buildbuild#include #include "gen.h" int main(int argc, char **argv) { (void)argv; assert(argc == 3); return genfunc(); } muon-v0.4.0/subprojects/meson-tests/common/245 custom target index source/code_source.c0000644000175000017500000000007514751453622030051 0ustar buildbuildextern int genfunc(void); int genfunc(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/245 custom target index source/meson.build0000644000175000017500000000276314751453622027563 0ustar buildbuildproject('custom target index source', 'c') # Test that using a custom target index as a sourcefile works correctly copy1 = find_program('copyfile.py') copy2 = find_program('copyfile2.py') step_1 = custom_target( 'step_1', input: ['code_source.c', files('header_source.h')], output: ['step_1.c', 'step_1.h'], command: [copy2, '@INPUT0@', '@OUTPUT0@', '@INPUT1@', '@OUTPUT1@'], build_by_default: false, ) # test custom target with a single CustomTargetIndex input step_2_c = custom_target( 'step_2_c', input: step_1[0], output: 'step_2.c', command: [copy1, '@INPUT0@', '@OUTPUT0@'], build_by_default: false, ) step_2_h = custom_target( 'step_2_h', input: step_1[1], output: 'step_2.h', command: [copy1, '@INPUT0@', '@OUTPUT0@'], build_by_default: false, ) # test custom target with multiple CustomTargetIndex inputs gen = custom_target( 'step_3', input: [step_2_c, step_2_h], output: ['gen.c', 'gen.h'], command: [copy2, '@INPUT0@', '@OUTPUT0@', '@INPUT1@', '@OUTPUT1@'], build_by_default: false, ) gen_c = gen[0] gen_h = gen[1] exe_separate = executable( 'exe_separate', ['main.c', gen_c, gen_h], build_by_default: false, install: false, ) exe_together = executable( 'exe_together', ['main.c', gen], build_by_default: false, install: false, ) # also cover passing custom target to tests as arguments test('exe_separate', exe_separate, args: [gen_c, gen_h]) test('exe_together', exe_together, args: gen) muon-v0.4.0/subprojects/meson-tests/common/245 custom target index source/copyfile.py0000644000175000017500000000013414751453622027573 0ustar buildbuild#!/usr/bin/env python3 import sys import shutil shutil.copyfile(sys.argv[1], sys.argv[2]) muon-v0.4.0/subprojects/meson-tests/common/245 custom target index source/header_source.h0000644000175000017500000000003214751453622030365 0ustar buildbuildextern int genfunc(void); muon-v0.4.0/subprojects/meson-tests/common/194 static threads/0002755000175000017500000000000014751453622023166 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/194 static threads/lib1.c0000644000175000017500000000025314751453622024157 0ustar buildbuild#if defined _WIN32 #include #else #include #endif void *f(void) { #if defined _WIN32 return CreateThread; #else return pthread_create; #endif } muon-v0.4.0/subprojects/meson-tests/common/194 static threads/lib2.c0000644000175000017500000000006714751453622024163 0ustar buildbuildextern void *f(void); void *g(void) { return f(); } muon-v0.4.0/subprojects/meson-tests/common/194 static threads/meson.build0000644000175000017500000000035014751453622025324 0ustar buildbuildproject('threads', 'c') thread_dep = dependency('threads') lib1 = static_library('lib1', 'lib1.c', dependencies: thread_dep) lib2 = static_library('lib2', 'lib2.c', link_with: lib1) executable('prog', 'prog.c', link_with: lib2) muon-v0.4.0/subprojects/meson-tests/common/194 static threads/prog.c0000644000175000017500000000007514751453622024301 0ustar buildbuildextern void *g(void); int main(void) { g(); return 0; } muon-v0.4.0/subprojects/meson-tests/common/193 feature option disabled/0002755000175000017500000000000014751453622024737 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/193 feature option disabled/meson_options.txt0000644000175000017500000000050414751453622030371 0ustar buildbuildoption( 'required', type: 'feature', value: 'enabled', description: 'An required feature', ) option( 'optional', type: 'feature', value: 'auto', description: 'An optional feature', ) option( 'disabled', type: 'feature', value: 'disabled', description: 'A disabled feature', ) muon-v0.4.0/subprojects/meson-tests/common/193 feature option disabled/meson.build0000644000175000017500000000174514751453622027106 0ustar buildbuildproject('feature user option', default_options: ['auto_features=disabled']) feature_opts = get_option('auto_features') required_opt = get_option('required') optional_opt = get_option('optional') disabled_opt = get_option('disabled') assert(not feature_opts.enabled(), 'Should be disabled option') assert(feature_opts.disabled(), 'Should be disabled option') assert(not feature_opts.auto(), 'Should be disabled option') assert(required_opt.enabled(), 'Should be enabled option') assert(not required_opt.disabled(), 'Should be enabled option') assert(not required_opt.auto(), 'Should be enabled option') assert(not optional_opt.enabled(), 'Auto feature should be disabled') assert(optional_opt.disabled(), 'Auto feature should be disabled') assert(not optional_opt.auto(), 'Auto feature should be disabled') assert(not disabled_opt.enabled(), 'Should be disabled option') assert(disabled_opt.disabled(), 'Should be disabled option') assert(not disabled_opt.auto(), 'Should be disabled option') muon-v0.4.0/subprojects/meson-tests/common/79 same basename/0002755000175000017500000000000014751453622022667 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/79 same basename/staticsub/0002755000175000017500000000000014751453622024670 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/79 same basename/staticsub/meson.build0000644000175000017500000000025514751453622027032 0ustar buildbuild# On Windows a static lib is now libfoo.a, so it does not conflict with foo.lib # from the shared library above stlib = static_library('name', '../lib.c', c_args: '-DSTAT') muon-v0.4.0/subprojects/meson-tests/common/79 same basename/meson.build0000644000175000017500000000060314751453622025026 0ustar buildbuildproject('same basename', 'c') subdir('sharedsub') subdir('staticsub') # Use the same source file to check that each top level target # has its own unique working directory. If they don't # then the .o files will clobber each other. exe1 = executable('name', 'exe1.c', link_with: stlib) exe2 = executable('name2', 'exe2.c', link_with: shlib) test('static', exe1) test('shared', exe2) muon-v0.4.0/subprojects/meson-tests/common/79 same basename/lib.c0000644000175000017500000000070314751453622023577 0ustar buildbuild#if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllexport) #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif #if defined SHAR int DLL_PUBLIC func(void) { return 1; } #elif defined STAT int func(void) { return 0; } #else #error "Missing type definition." #endif muon-v0.4.0/subprojects/meson-tests/common/79 same basename/sharedsub/0002755000175000017500000000000014751453622024647 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/79 same basename/sharedsub/meson.build0000644000175000017500000000007514751453622027011 0ustar buildbuildshlib = shared_library('name', '../lib.c', c_args: '-DSHAR') muon-v0.4.0/subprojects/meson-tests/common/79 same basename/exe1.c0000644000175000017500000000006714751453622023676 0ustar buildbuildint func(void); int main(void) { return func(); } muon-v0.4.0/subprojects/meson-tests/common/79 same basename/exe2.c0000644000175000017500000000010414751453622023667 0ustar buildbuildint func(void); int main(void) { return func() == 1 ? 0 : 1; } muon-v0.4.0/subprojects/meson-tests/common/216 custom target input extracted objects/0002755000175000017500000000000014751453622027536 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/216 custom target input extracted objects/check_object.py0000644000175000017500000000072614751453622032516 0ustar buildbuild#!/usr/bin/env python3 import sys, os if __name__ == '__main__': if len(sys.argv) < 4: print(sys.argv[0], 'n output objects...') sys.exit(1) if len(sys.argv) != int(sys.argv[1]) + 3: print(f'expected {sys.argv[1]} objects, got {len(sys.argv) - 3}') sys.exit(1) for i in sys.argv[3:]: print('testing', i) if not os.path.exists(i): sys.exit(1) with open(sys.argv[2], 'wb') as out: pass muon-v0.4.0/subprojects/meson-tests/common/216 custom target input extracted objects/libdir/0002755000175000017500000000000014751453622031003 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/216 custom target input extracted objects/libdir/source.c0000644000175000017500000000005114751453622032441 0ustar buildbuildint func1_in_obj(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/216 custom target input extracted objects/libdir/gen.py0000644000175000017500000000023714751453622032126 0ustar buildbuild#! /usr/bin/env python3 import sys with open(sys.argv[1], 'r') as f: for l in f: l = l.rstrip() print(l.replace(sys.argv[2], sys.argv[3])) ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/216 custom target input extracted objects/libdir/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/216 custom target input extracted objects/libdir/meson.bu0000644000175000017500000000137314751453622032456 0ustar buildbuildgen_py = find_program('gen.py') ctsrc = custom_target( 'custom_target sources', output: 'ct-source.c', input: 'source.c', command: [gen_py, '@INPUT@', 'func1', 'func2'], capture: true, ) gen = generator( gen_py, arguments: ['@INPUT@', 'func1', 'func3'], output: 'gen-@PLAINNAME@', capture: true, ) gensrc = gen.process('source.c') gen = generator( gen_py, arguments: ['@INPUT@', 'func1', 'func4'], output: 'gen-@PLAINNAME@', capture: true, ) sublibsrc = gen.process('source.c') subobjlib = static_library('subobject', sublibsrc) objlib = static_library( 'object', 'source.c', ctsrc, gensrc, objects: subobjlib.extract_all_objects(recursive: false), override_options: ['unity=off'], ) muon-v0.4.0/subprojects/meson-tests/common/216 custom target input extracted objects/meson.build0000644000175000017500000000270614751453622031703 0ustar buildbuildproject('custom target input extracted objects', 'c') if meson.backend() == 'xcode' error( 'MESON_SKIP_TEST: sometimes Xcode puts object files in weird paths and we can not extract them.', ) endif checker = find_program('check_object.py') cc = meson.get_compiler('c').cmd_array().get(-1) subdir('libdir') custom_target( 'check', input: objlib.extract_objects('source.c'), output: 'objcheck', command: [checker, '1', '@OUTPUT@', '@INPUT@'], build_by_default: true, ) custom_target( 'checkct', input: objlib.extract_objects(ctsrc), output: 'objcheck-ct', command: [checker, '1', '@OUTPUT@', '@INPUT@'], build_by_default: true, ) custom_target( 'checkcti', input: objlib.extract_objects(ctsrc[0]), output: 'objcheck-cti', command: [checker, '1', '@OUTPUT@', '@INPUT@'], build_by_default: true, ) custom_target( 'checkgen', input: objlib.extract_objects(gensrc), output: 'objcheck-gen', command: [checker, '1', '@OUTPUT@', '@INPUT@'], build_by_default: true, ) custom_target( 'checkall', input: objlib.extract_all_objects(recursive: false), output: 'objcheck-all', command: [checker, '3', '@OUTPUT@', '@INPUT@'], build_by_default: true, ) custom_target( 'checkall-recursive', input: objlib.extract_all_objects(recursive: true), output: 'objcheck-all-recursive', command: [checker, '4', '@OUTPUT@', '@INPUT@'], build_by_default: true, ) muon-v0.4.0/subprojects/meson-tests/common/267 default_options in find_program/0002755000175000017500000000000014751453622026503 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/267 default_options in find_program/subprojects/0002755000175000017500000000000014751453622031046 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/267 default_options in find_program/subprojects/dummy/0002755000175000017500000000000014751453622032201 5ustar buildbuild././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/267 default_options in find_program/subprojects/dummy/meson_options.txtmuon-v0.4.0/subprojects/meson-tests/common/267 default_options in find_program/subprojects/dummy/mes0000644000175000017500000000007314751453622032706 0ustar buildbuildoption('subproject_option', type: 'boolean', value: false) ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/267 default_options in find_program/subprojects/dummy/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/267 default_options in find_program/subprojects/dummy/mes0000644000175000017500000000024314751453622032705 0ustar buildbuildproject('dummy', 'c') if get_option('subproject_option') dummy_exe = executable('dummy', 'dummy.c') meson.override_find_program('dummy', dummy_exe) endif ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/267 default_options in find_program/subprojects/dummy/dummy.cmuon-v0.4.0/subprojects/meson-tests/common/267 default_options in find_program/subprojects/dummy/dum0000644000175000017500000000004014751453622032701 0ustar buildbuildint main(void) { return 0; }././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/267 default_options in find_program/subprojects/dummy.wrapmuon-v0.4.0/subprojects/meson-tests/common/267 default_options in find_program/subprojects/dummy.wra0000644000175000017500000000007614751453622032715 0ustar buildbuild[wrap-file] directory = dummy [provide] program_names = dummymuon-v0.4.0/subprojects/meson-tests/common/267 default_options in find_program/meson.build0000644000175000017500000000023714751453622030645 0ustar buildbuildproject('test default_options in find_program') dummy_exe = find_program('dummy', default_options: ['subproject_option=true']) test('test_dummy', dummy_exe) muon-v0.4.0/subprojects/meson-tests/common/75 custom subproject dir/0002755000175000017500000000000014751453622024414 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/75 custom subproject dir/a.c0000644000175000017500000000027714751453622025004 0ustar buildbuild#include char func_b(void); char func_c(void); int main(void) { if(func_b() != 'b') { return 1; } if(func_c() != 'c') { return 2; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/75 custom subproject dir/meson.build0000644000175000017500000000040614751453622026554 0ustar buildbuildproject('A', 'c', subproject_dir: 'custom_subproject_dir') # different than meson: no subproject promotion C = subproject('C') c = C.get_variable('c') B = subproject('B') b = B.get_variable('b') a = executable('a', 'a.c', link_with: [b, c]) test('a test', a) muon-v0.4.0/subprojects/meson-tests/common/75 custom subproject dir/custom_subproject_dir/0002755000175000017500000000000014751453622031024 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/75 custom subproject dir/custom_subproject_dir/C/0002755000175000017500000000000014751453622031206 5ustar buildbuild././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/75 custom subproject dir/custom_subproject_dir/C/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/75 custom subproject dir/custom_subproject_dir/C/meson.bu0000644000175000017500000000016214751453622032654 0ustar buildbuildproject('C', 'c') # libc.so cannot be used, it already exists as a reserved name c = shared_library('cee', 'c.c') muon-v0.4.0/subprojects/meson-tests/common/75 custom subproject dir/custom_subproject_dir/C/c.c0000644000175000017500000000052414751453622031573 0ustar buildbuild#if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllexport) #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif char DLL_PUBLIC func_c(void) { return 'c'; } muon-v0.4.0/subprojects/meson-tests/common/75 custom subproject dir/custom_subproject_dir/B/0002755000175000017500000000000014751453622031205 5ustar buildbuild././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/75 custom subproject dir/custom_subproject_dir/B/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/75 custom subproject dir/custom_subproject_dir/B/meson.bu0000644000175000017500000000015314751453622032653 0ustar buildbuildproject('B', 'c') C = subproject('C') c = C.get_variable('c') b = shared_library('b', 'b.c', link_with: c) muon-v0.4.0/subprojects/meson-tests/common/75 custom subproject dir/custom_subproject_dir/B/b.c0000644000175000017500000000065414751453622031575 0ustar buildbuild#include char func_c(void); #if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllexport) #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif char DLL_PUBLIC func_b(void) { if(func_c() != 'c') { exit(3); } return 'b'; } muon-v0.4.0/subprojects/meson-tests/common/179 escape and unicode/0002755000175000017500000000000014751453622023661 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/179 escape and unicode/main.c0000644000175000017500000000027514751453622024753 0ustar buildbuild#include const char* does_it_work(void); int a_fun(void); int main(void) { if(strcmp(does_it_work(), "yes it does") != 0) { return -a_fun(); } return 0; } muon-v0.4.0/subprojects/meson-tests/common/179 escape and unicode/file.c.in0000644000175000017500000000014714751453622025351 0ustar buildbuild#include const char* does_it_work(void) { printf("{NAME}\n"); return "yes it does"; } muon-v0.4.0/subprojects/meson-tests/common/179 escape and unicode/meson.build0000644000175000017500000000223214751453622026020 0ustar buildbuildproject('180 escape', 'c') gen = generator( find_program('file.py'), arguments: ['@INPUT@', 'erd\u0151', '@OUTPUT@'], output: '@BASENAME@', ) gen_file = gen.process('file.c.in') find_file_list = run_command(find_program('find.py'), check: true) assert(find_file_list.returncode() == 0, 'Didn\'t find any files.') # Strings should support both octal \ooo and hex \xhh encodings found_files_oct = [] foreach l : find_file_list.stdout().strip('\0').split('\000') found_files_oct += [files(l)] endforeach test('first', executable('first', found_files_oct + [gen_file])) found_files_hex = [] foreach l : find_file_list.stdout().strip('\x00').split('\x00') found_files_hex += [files(l)] endforeach test('second', executable('second', found_files_hex + [gen_file])) # different from meson: unrecognized and malformed escape sequences are invalid # malformed = [ # [ '\c', 'c' ], # [ '\Uabcdefghi', 'Uabcdefghi'], # [ '\u123 ', 'u123 '], # [ '\xqr', 'xqr'], # ] # foreach m : malformed # assert(m[0].endswith(m[1]), 'bad escape sequence had unexpected end') # assert(m[0].startswith('\\'), 'bad escape sequence had unexpected start') # endforeach muon-v0.4.0/subprojects/meson-tests/common/179 escape and unicode/fun.c0000644000175000017500000000004214751453622024607 0ustar buildbuildint a_fun(void) { return 1; } muon-v0.4.0/subprojects/meson-tests/common/179 escape and unicode/find.py0000644000175000017500000000025214751453622025150 0ustar buildbuild#!/usr/bin/env python3 import os import sys for fh in os.listdir('.'): if os.path.isfile(fh): if fh.endswith('.c'): sys.stdout.write(fh + '\0') muon-v0.4.0/subprojects/meson-tests/common/179 escape and unicode/file.py0000644000175000017500000000033514751453622025151 0ustar buildbuild#!/usr/bin/env python3 import sys import os with open(sys.argv[1]) as fh: content = fh.read().replace("{NAME}", sys.argv[2]) with open(os.path.join(sys.argv[3]), 'w', errors='replace') as fh: fh.write(content) muon-v0.4.0/subprojects/meson-tests/common/84 plusassign/0002755000175000017500000000000014751453622022372 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/84 plusassign/meson.build0000644000175000017500000000226214751453622024534 0ustar buildbuildproject('plusassign') x = [] x += 'a' if x.length() != 1 error('Incorrect append') endif if x[0] != 'a' error('Incorrect append 2.') endif y = x x += 'b' if y.length() != 1 error('Immutability broken.') endif if y[0] != 'a' error('Immutability broken 2.') endif if x.length() != 2 error('Incorrect append 3') endif if x[0] != 'a' error('Incorrect append 4.') endif if x[1] != 'b' error('Incorrect append 5.') endif # Now with evil added: append yourself. x += x if x.length() != 4 error('Incorrect selfappend.') endif # += on strings bra = 'bra' foo = 'A' foo += bra foo += 'cada' foo += bra assert(foo == 'Abracadabra', 'string += failure [@0@]'.format(foo)) assert(bra == 'bra', 'string += modified right argument!') foo += ' ' + foo assert(foo == 'Abracadabra Abracadabra', 'string += failure [@0@]'.format(foo)) # += on ints foo = 5 foo += 6 assert(foo == 11, 'int += failure [@0@]'.format(foo)) bar = 99 foo += bar assert(foo == 110, 'int += failure [@0@]'.format(foo)) assert(bar == 99, 'int += modified right argument"') bar += foo + 1 assert(bar == 210, 'int += failure [@0@]'.format(bar)) assert(foo == 110, 'int += modified right argument"') muon-v0.4.0/subprojects/meson-tests/common/272 unity/0002755000175000017500000000000014751453622021431 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/272 unity/meson.build0000644000175000017500000000070514751453622023573 0ustar buildbuildproject('unity', 'c', default_options: ['unity_size=2']) if get_option('unity') != 'on' error('MESON_SKIP_TEST: unity builds not enabled') endif slib_notinstalled = static_library( 'slib_notinstalled', # test depends on the number of files being divisible by unity_size ['slib1.c', 'slib2.c'], ) slib_installed = static_library( 'slib_installed', ['slib1.c', 'slib2.c'], link_with: slib_notinstalled, install: true, ) muon-v0.4.0/subprojects/meson-tests/common/272 unity/test.json0000644000175000017500000000012514751453622023277 0ustar buildbuild{ "installed": [ {"type": "file", "file": "usr/lib/libslib_installed.a"} ] } muon-v0.4.0/subprojects/meson-tests/common/272 unity/slib1.c0000644000175000017500000000004214751453622022601 0ustar buildbuildint func1(void) { return 1; } muon-v0.4.0/subprojects/meson-tests/common/272 unity/slib2.c0000644000175000017500000000004214751453622022602 0ustar buildbuildint func2(void) { return 2; } muon-v0.4.0/subprojects/meson-tests/common/272 unity/slib.c0000644000175000017500000000013714751453622022525 0ustar buildbuildint func1(void); int func2(void); int static_lib_func(void) { return func1() + func2(); } muon-v0.4.0/subprojects/meson-tests/common/229 disabler array addition/0002755000175000017500000000000014751453622024723 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/229 disabler array addition/test.c0000644000175000017500000000003514751453622026042 0ustar buildbuildint stub(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/229 disabler array addition/meson.build0000644000175000017500000000025314751453622027063 0ustar buildbuildproject('disabler_inside_array', 'c') exes = [] exes += library('a', 'test.c') exes += library('b', 'test.c', dependencies: disabler()) exes += library('c', 'test.c') muon-v0.4.0/subprojects/meson-tests/common/14 configure file/0002755000175000017500000000000014751453622023054 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/14 configure file/check_file.py0000644000175000017500000000207114751453622025500 0ustar buildbuild#!/usr/bin/env python3 import os import sys def permit_osx_workaround(m1, m2): import platform if platform.system().lower() != 'darwin': return False if m2 % 10000 != 0: return False if m1//10000 != m2//10000: return False return True if len(sys.argv) == 2: assert os.path.exists(sys.argv[1]) elif len(sys.argv) == 3: f1 = sys.argv[1] f2 = sys.argv[2] m1 = os.stat(f1).st_mtime_ns m2 = os.stat(f2).st_mtime_ns # Compare only os.stat() if m1 != m2: # Under macOS the lower four digits sometimes get assigned # zero, even though shutil.copy2 should preserve metadata. # Just have to accept it, I guess. if not permit_osx_workaround(m1, m2): # different from meson: # The file doesn't retain its original timestamp. # raise RuntimeError(f'mtime of {f1!r} ({m1!r}) != mtime of {f2!r} ({m2!r})') ... import filecmp if not filecmp.cmp(f1, f2): raise RuntimeError(f'{f1!r} != {f2!r}') else: raise AssertionError muon-v0.4.0/subprojects/meson-tests/common/14 configure file/invalid-utf8.bin.in0000644000175000017500000000001214751453622026454 0ustar buildbuildwmuon-v0.4.0/subprojects/meson-tests/common/14 configure file/prog6.c0000644000175000017500000000122314751453622024251 0ustar buildbuild#include #include int main(void) { return strcmp(MESSAGE1, "foo") || strcmp(MESSAGE2, "@var1@") || strcmp(MESSAGE3, "\\@var1@") || strcmp(MESSAGE4, "\\@var1@") || strcmp(MESSAGE5, "\\@var1") || strcmp(MESSAGE6, "\\ @ \\@") || strcmp(MESSAGE7, "@var1") || strcmp(MESSAGE8, "\\@var1bar") || strcmp(MESSAGE9, "foovar2@") || strcmp(MESSAGE10, "foovar2\\@") || strcmp(MESSAGE11, "foobarbazqux") || strcmp(MESSAGE12, "foovar2\\@var3@var4\\@") || strcmp(MESSAGE13, "$name =~ s/@/@@/g;") || strcmp(MESSAGE14, "@:@@.@@@;@@@@ @@@@@"); } muon-v0.4.0/subprojects/meson-tests/common/14 configure file/file_contains.py0000644000175000017500000000071614751453622026245 0ustar buildbuild#!/usr/bin/env python3 import sys import argparse def main(): parser = argparse.ArgumentParser() parser.add_argument('file', nargs=1, type=str) parser.add_argument('text', nargs=1, type=str) args = parser.parse_args() text = args.text[0] with open(args.file[0], encoding='utf-8') as f: for line in f: if line.strip() == text: return 0 return 1 if __name__ == '__main__': sys.exit(main()) muon-v0.4.0/subprojects/meson-tests/common/14 configure file/generator-deps.py0000755000175000017500000000071214751453622026346 0ustar buildbuild#!/usr/bin/env python3 import sys, os from pathlib import Path if len(sys.argv) != 3: print("Wrong amount of parameters.") build_dir = Path(os.environ['MESON_BUILD_ROOT']) subdir = Path(os.environ['MESON_SUBDIR']) outputf = Path(sys.argv[1]) with outputf.open('w') as ofile: ofile.write("#define ZERO_RESULT 0\n") depf = Path(sys.argv[2]) if not depf.exists(): with depf.open('w') as ofile: ofile.write(f"{outputf.name}: depfile\n") muon-v0.4.0/subprojects/meson-tests/common/14 configure file/config.h0000644000175000017500000000014314751453622024466 0ustar buildbuild#error "This file should not be included. Build dir must become before source dir in search order" muon-v0.4.0/subprojects/meson-tests/common/14 configure file/check_inputs.py0000644000175000017500000000053014751453622026101 0ustar buildbuild#!/usr/bin/env python3 import sys from pathlib import Path files = [Path(f) for f in sys.argv[1:]] names = [f.name for f in files] assert names == ['check_inputs.txt', 'prog.c', 'prog.c', 'prog2.c', 'prog4.c', 'prog5.c'] for f in files[1:]: assert f.exists() with files[0].open('w') as ofile: ofile.write("#define ZERO_RESULT 0\n") muon-v0.4.0/subprojects/meson-tests/common/14 configure file/prog9.c0000644000175000017500000000056314751453622024262 0ustar buildbuild#include #include #include #if defined(A_UNDEFINED) || defined(B_UNDEFINED) #error "Should not be defined" #endif #if !defined(A_DEFINED) || !defined(B_DEFINED) #error "Should be defined" #endif int main(void) { return strcmp(A_STRING, "foo") || strcmp(B_STRING, "foo") || A_INT != 42 || B_INT != 42; } muon-v0.4.0/subprojects/meson-tests/common/14 configure file/subdir/0002755000175000017500000000000014751453622024344 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/14 configure file/subdir/meson.build0000644000175000017500000000262514751453622026511 0ustar buildbuild# Configure in subdir with absolute paths for input and relative for output configure_file( input: '../dummy.dat', output: 'config2-1.h', command: [genprog, scriptfile, ifile, 'config2-1.h'], install_dir: 'share/appdireh', ) run_command( check_file, join_paths(meson.current_build_dir(), 'config2-1.h'), check: true, ) # Configure in subdir with files() for input and relative for output configure_file( input: '../dummy.dat', output: 'config2-2.h', command: [genprog, scriptfile, files('../dummy.dat'), 'config2-2.h'], install_dir: 'share/appdirok', ) run_command( check_file, join_paths(meson.current_build_dir(), 'config2-2.h'), check: true, ) # Configure in subdir with string templates for input and output configure_file( input: '../dummy.dat', output: 'config2-3.h', command: [found_script, '@INPUT@', '@OUTPUT@'], ) run_command( check_file, join_paths(meson.current_build_dir(), 'config2-3.h'), check: true, ) # Test that overwriting an existing file creates a warning. configure_file(input: '../test.py.in', output: 'double_output2.txt', configuration: conf) configure_file(input: '../test.py.in', output: 'double_output2.txt', configuration: conf) # Test that the same file name in a different subdir will not create a warning configure_file( input: '../test.py.in', output: 'no_write_conflict.txt', configuration: conf, ) muon-v0.4.0/subprojects/meson-tests/common/14 configure file/differentafterbasename2.in0000644000175000017500000000000014751453622030136 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/14 configure file/config.h.in0000644000175000017500000000025014751453622025072 0ustar buildbuild#define MESSAGE "@var@" // different from meson: invalid substitutions are errors #define OTHER "@other@" "@second@" #mesondefine BE_TRUE #mesondefine SHOULD_BE_UNDEF muon-v0.4.0/subprojects/meson-tests/common/14 configure file/nosubst-nocopy1.txt.in0000644000175000017500000000002514751453622027300 0ustar buildbuild#mesondefine FOO_BAR muon-v0.4.0/subprojects/meson-tests/common/14 configure file/dumpprog.c0000644000175000017500000000240014751453622025047 0ustar buildbuild#define SHOULD_BE_UNDEFINED 1 #include"config3.h" #include #include #ifdef SHOULD_BE_UNDEFINED #error Token did not get undefined. #endif #ifndef SHOULD_BE_DEFINED #error Token did not get defined #endif #define stringify(s) str(s) #define str(s) #s int main(void) { #if !(SHOULD_BE_UNQUOTED_STRING == string) printf("String token (unquoted) defined wrong.\n"); return 1; #endif if(strcmp(SHOULD_BE_STRING, "string") != 0) { printf("String token defined wrong.\n"); return 1; } if(strcmp(SHOULD_BE_STRING2, "A \"B\" C") != 0) { printf("String token 2 defined wrong.\n"); return 1; } if(strcmp(SHOULD_BE_STRING3, "A \"\" C") != 0) { printf("String token 3 defined wrong.\n"); return 1; } if(strcmp(SHOULD_BE_STRING4, "A \" C") != 0) { printf("String token 4 defined wrong.\n"); return 1; } if(SHOULD_BE_ONE != 1) { printf("One defined incorrectly.\n"); return 1; } if(SHOULD_BE_ZERO != 0) { printf("Zero defined incorrectly.\n"); return 1; } if(strcmp(SHOULD_BE_QUOTED_ONE, "1") != 0) { printf("Quoted number defined incorrectly.\n"); return 1; } SHOULD_BE_RETURN 0; } muon-v0.4.0/subprojects/meson-tests/common/14 configure file/touch.py0000644000175000017500000000050614751453622024547 0ustar buildbuild#!/usr/bin/env python3 import sys import argparse from pathlib import Path def main(): parser = argparse.ArgumentParser() parser.add_argument('files', nargs='*', type=str) args = parser.parse_args() for filepath in args.files: Path(filepath).touch() if __name__ == '__main__': sys.exit(main()) muon-v0.4.0/subprojects/meson-tests/common/14 configure file/config8.h.in0000644000175000017500000000012014751453622025156 0ustar buildbuild#define MESSAGE "@var@" #define "non isolatin1 char fails decode with utf-8" muon-v0.4.0/subprojects/meson-tests/common/14 configure file/dummy.dat0000644000175000017500000000000014751453622024665 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/14 configure file/sameafterbasename.in20000644000175000017500000000000014751453622027115 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/14 configure file/meson.build0000644000175000017500000002541514751453622025223 0ustar buildbuildproject('configure file test', 'c', meson_version: '>=0.63.0') fs = import('fs') conf = configuration_data() conf.set('var', 'mystring') conf.set('other', 'string 2') conf.set('second', ' bonus') conf.set('BE_TRUE', true) assert(conf.get('var') == 'mystring', 'Get function is not working.') assert(conf.get('var', 'default') == 'mystring', 'Get function is not working.') assert( conf.get('notthere', 'default') == 'default', 'Default value getting is not working.', ) assert( # different from meson: keys retain the order they are set conf.keys() == ['var', 'other', 'second', 'BE_TRUE'], 'Keys function is not working', ) cfile = configure_file(input: 'config.h.in', output: 'config.h', configuration: conf) e = executable( 'inctest', 'prog.c', # Note that you should NOT do this. Don't add generated headers here # This tests that we do the right thing even if people add in conf files # to their sources. cfile, ) test('inctest', e) # Test if we can also pass files() as input configure_file(input: files('config.h.in'), output: 'config2.h', configuration: conf) # Now generate a header file with an external script. genprog = import('python3').find_python() scriptfile = '@0@/generator.py'.format(meson.current_source_dir()) ifile = '@0@/dummy.dat'.format(meson.current_source_dir()) ofile = '@0@/config2.h'.format(meson.current_build_dir()) check_file = find_program('check_file.py') # Configure in source root with command and absolute paths outf = configure_file( input: 'dummy.dat', output: 'config2.h', command: [genprog, scriptfile, ifile, ofile], install_dir: 'share/appdir', ) ret = run_command(check_file, outf, check: false) if ret.returncode() != 0 error('Error running command: @0@\n@1@'.format(ret.stdout(), ret.stderr())) endif # Same again as before, but an input file should not be required in # this case where we use a command/script to generate the output file. genscript2b = '@0@/generator-without-input-file.py'.format(meson.current_source_dir()) ofile2b = '@0@/config2b.h'.format(meson.current_build_dir()) outf = configure_file( output: 'config2b.h', command: [genprog, genscript2b, ofile2b], install_dir: 'share/appdir', ) ret = run_command(check_file, outf, check: false) if ret.returncode() != 0 error('Error running command: @0@\n@1@'.format(ret.stdout(), ret.stderr())) endif genscript2deps = '@0@/generator-deps.py'.format(meson.current_source_dir()) ofile2deps = '@0@/config2deps.h'.format(meson.current_build_dir()) outf = configure_file( output: 'config2deps.h', depfile: 'depfile.d', command: [genprog, genscript2deps, ofile2deps, '@DEPFILE@'], ) ret = run_command(check_file, outf, check: false) if ret.returncode() != 0 error('Error running command: @0@\n@1@'.format(ret.stdout(), ret.stderr())) endif found_script = find_program('generator.py') # More configure_file tests in here subdir('subdir') test('inctest2', executable('prog2', 'prog2.c')) # Generate a conf file without an input file. dump = configuration_data() dump.set_quoted('SHOULD_BE_STRING', 'string', description: 'A string') dump.set_quoted('SHOULD_BE_STRING2', 'A "B" C') dump.set_quoted('SHOULD_BE_STRING3', 'A "" C') dump.set_quoted('SHOULD_BE_STRING4', 'A " C') dump.set('SHOULD_BE_RETURN', 'return') dump.set('SHOULD_BE_DEFINED', true) dump.set('SHOULD_BE_UNDEFINED', false) dump.set('SHOULD_BE_ONE', 1) dump.set('SHOULD_BE_ZERO', 0, description: 'Absolutely zero') dump.set('SHOULD_BE_QUOTED_ONE', '"1"') dump.set_quoted('INTEGER_AS_STRING', '12') if dump.get_unquoted('INTEGER_AS_STRING').to_int() == 12 dump.set('SHOULD_BE_UNQUOTED_STRING', dump.get_unquoted('SHOULD_BE_STRING')) endif configure_file(output: 'config3.h', configuration: dump) test('Configless.', executable('dumpprog', 'dumpprog.c')) # Config file generation in a loop with @BASENAME@ substitution dump = configuration_data() dump.set('ZERO', 0) config_templates = files('config4a.h.in', 'config4b.h.in') foreach config_template : config_templates configure_file(input: config_template, output: '@BASENAME@', configuration: dump) endforeach test('Substituted', executable('prog4', 'prog4.c')) # Test `capture` keyword basename_py = find_program('basename.py') file_contains_py = find_program('file_contains.py') test_string = 'hello world' test_input_file = join_paths(meson.current_build_dir(), test_string) run_command(find_program('touch.py'), test_input_file, check: true) configs = [ # no input configure_file( command: [basename_py, test_string], capture: true, output: 'capture test 1', ), # with input configure_file( input: test_input_file, command: [basename_py, '@INPUT@'], capture: true, output: 'capture test 2', ), ] foreach c : configs test('@0@'.format(c), file_contains_py, args: [c, test_string]) endforeach # Test variable is substituted only once conf5 = configuration_data() conf5.set('var', '@var2@') conf5.set('var2', 'error') configure_file(input: 'config5.h.in', output: '@BASENAME@', configuration: conf5) test('test5', executable('prog5', 'prog5.c')) # Test escaping conf6 = configuration_data() conf6.set('var1', 'foo') conf6.set('var2', 'bar') conf6.set('var3', 'baz') conf6.set('var4', 'qux') configure_file(input: 'config6.h.in', output: '@BASENAME@', configuration: conf6) test('test6', executable('prog6', 'prog6.c')) # test empty install dir string cfile = configure_file( input: 'config.h.in', output: 'do_not_get_installed.h', install_dir: '', configuration: conf, ) # different from meson: install_dir: false is unsupported # test install_dir : false (deprecated) # cfile = configure_file( # input: 'config.h.in', # output: 'do_not_get_installed_please.h', # install_dir: false, # configuration: conf, # ) # test intsall_dir with install: false cfile = configure_file( input: 'config.h.in', output: 'do_not_get_installed_in_install_dir.h', install: false, install_dir: 'share/appdir', configuration: conf, ) # Test escaping with cmake format conf7 = configuration_data() conf7.set('var1', 'foo') conf7.set('var2', 'bar') configure_file( input: 'config7.h.in', output: '@BASENAME@', format: 'cmake', configuration: conf7, ) test('test7', executable('prog7', 'prog7.c')) # Test copying of an empty configuration data object inf = 'invalid-utf8.bin.in' outf = configure_file(input: inf, output: 'invalid-utf8.bin', copy: true) ret = run_command(check_file, inf, outf, check: false) if ret.returncode() != 0 error('Error running command: @0@\n@1@'.format(ret.stdout(), ret.stderr())) endif # Now the same, but using a File object as an argument. inf2 = files('invalid-utf8.bin.in')[0] outf = configure_file(input: inf2, output: 'invalid-utf8.bin', copy: true) ret = run_command(check_file, inf2, outf, check: false) if ret.returncode() != 0 error('Error running command: @0@\n@1@'.format(ret.stdout(), ret.stderr())) endif # Test copy of a binary file outf = configure_file(input: inf, output: 'somebinary.bin', copy: true) ret = run_command(check_file, inf, outf, check: false) if ret.returncode() != 0 error('Error running command: @0@\n@1@'.format(ret.stdout(), ret.stderr())) endif # Test the fs replacement # Test copying of an empty configuration data object inf = 'invalid-utf8.bin.in' outf = fs.copyfile( inf, 'invalid-utf8-1.bin', install: true, install_dir: get_option('datadir') / meson.project_name(), install_tag: 'copyfile', ) test('fs.copyfile string', check_file, args: [files(inf), outf]) # Test with default outname of string outf = fs.copyfile(inf) test('fs.copyfile default name', check_file, args: [files(inf), outf]) # Now the same, but using a File object as an argument. inf2 = files('invalid-utf8.bin.in')[0] outf = fs.copyfile(inf2, 'invalid-utf8-2.bin') test('fs.copyfile file', check_file, args: [inf2, outf]) # Test non isolatin1 encoded input file which fails to decode with utf-8 conf8 = configuration_data() conf8.set('var', 'foo') configure_file( input: 'config8.h.in', output: '@BASENAME@', encoding: 'koi8-r', configuration: conf8, ) # Test that passing an empty configuration_data() object to a file with # #mesondefine substitutions does not print the warning. configure_file( input: 'nosubst-nocopy1.txt.in', output: 'nosubst-nocopy1.txt', configuration: configuration_data(), ) # different from meson: invalid @ substitutions are errors # test that passing an empty configuration_data() object to a file with # @foo@ substitutions does not print the warning. # configure_file( # input: 'nosubst-nocopy2.txt.in', # output: 'nosubst-nocopy2.txt', # configuration: configuration_data(), # ) # test that passing a configured file object to test() works, and that passing # an empty configuration_data() object to a file that leads to no substitutions # prints a warning (see unit tests) test_file = configure_file( input: 'test.py.in', output: 'test.py', configuration: configuration_data(), ) # Test that overwriting an existing file creates a warning. configure_file(input: 'test.py.in', output: 'double_output.txt', configuration: conf) configure_file(input: 'test.py.in', output: 'double_output.txt', configuration: conf) # Test that the same file name in a different subdir will not create a warning configure_file(input: 'test.py.in', output: 'no_write_conflict.txt', configuration: conf) # Test that @BASENAME@ is substituted before checking and does not create a warning. configure_file( input: 'differentafterbasename1.in', output: '@BASENAME@', configuration: conf, ) configure_file( input: 'differentafterbasename2.in', output: '@BASENAME@', configuration: conf, ) # Test that @BASENAME@ is substituted before checking and does create a warning on conflict. configure_file(input: 'sameafterbasename.in', output: '@BASENAME@', configuration: conf) configure_file(input: 'sameafterbasename.in2', output: '@BASENAME@', configuration: conf) test('configure-file', test_file) # Dictionaries cdata = configuration_data( { 'A_STRING': '"foo"', 'A_INT': 42, 'A_DEFINED': true, 'A_UNDEFINED': false, }, ) # merging a confdata into another one should not mark the first as immutable cdata_test = configuration_data() cdata_test.merge_from(cdata) cdata.set_quoted('A_PATH', '/random/path') configure_file( output: 'config9a.h', configuration: cdata, ) configure_file( output: 'config9b.h', configuration: { 'B_STRING': '"foo"', 'B_INT': 42, 'B_DEFINED': true, 'B_UNDEFINED': false, }, ) test('test9', executable('prog9', 'prog9.c')) check_inputs = find_program('check_inputs.py') configure_file( output: 'check_inputs.txt', input: ['prog.c', files('prog2.c', 'prog4.c')], command: [check_inputs, '@OUTPUT@', '@INPUT0@', '@INPUT@', files('prog5.c')], ) muon-v0.4.0/subprojects/meson-tests/common/14 configure file/config5.h.in0000644000175000017500000000003014751453622025153 0ustar buildbuild#define MESSAGE "@var@" muon-v0.4.0/subprojects/meson-tests/common/14 configure file/config6.h.in0000644000175000017500000000231114751453622025160 0ustar buildbuild/* No escape */ #define MESSAGE1 "@var1@" /* Escaped whole variable */ #define MESSAGE2 "\\@var1\\@" /* Replace pairs of escapes before '@' or '\@' with escape characters * (note we have to double number of pairs due to C string escaping) */ #define MESSAGE3 "\\\\@var1@" /* Pairs of escapes and then an escaped variable */ #define MESSAGE4 "\\\\\@var1\@" /* We don't gobble \@ prefixing some text */ #define MESSAGE5 "\\\\@var1" /* Check escape character outside variables \ @ \@ */ #define MESSAGE6 "\\ @ \\\\@" /* Catch any edge cases */ /* no substitution - not a variable */ #define MESSAGE7 "@var1" /* Escaped variable followed by another variable */ #define MESSAGE8 "\\\\@var1@var2@" /* Variable followed by another variable */ #define MESSAGE9 "@var1@var2@" /* Variable followed by another variable and escaped */ #define MESSAGE10 "@var1@var2\\\\@" /* Lots of substitutions in a row*/ #define MESSAGE11 "@var1@@var2@@var3@@var4@" /* This should never happen in the real world, right? */ #define MESSAGE12 "@var1@var2\\\\@var3@var4\\\\@" /* Leave @/@@ as is */ #define MESSAGE13 "$name =~ s/@/@@/g;" /* Leave zero length @@ keys as is */ #define MESSAGE14 "@:@@.@@@;@@@@ @@@@@" muon-v0.4.0/subprojects/meson-tests/common/14 configure file/basename.py0000644000175000017500000000101614751453622025175 0ustar buildbuild#!/usr/bin/env python3 import sys import argparse import os def main(): parser = argparse.ArgumentParser() parser.add_argument('text', nargs='*', type=str) args = parser.parse_args() text = args.text if isinstance(args.text, list) else [args.text] output = '' for t in text: t = os.path.basename(t) if not output: output += t else: output += ' ' + t output += '\n' sys.stdout.write(output) if __name__ == '__main__': sys.exit(main()) muon-v0.4.0/subprojects/meson-tests/common/14 configure file/generator.py0000755000175000017500000000057114751453622025420 0ustar buildbuild#!/usr/bin/env python3 import sys, os from pathlib import Path if len(sys.argv) != 3: print("Wrong amount of parameters.") build_dir = Path(os.environ['MESON_BUILD_ROOT']) subdir = Path(os.environ['MESON_SUBDIR']) inputf = Path(sys.argv[1]) outputf = Path(sys.argv[2]) assert inputf.exists() with outputf.open('w') as ofile: ofile.write("#define ZERO_RESULT 0\n") muon-v0.4.0/subprojects/meson-tests/common/14 configure file/test.json0000644000175000017500000000054314751453622024726 0ustar buildbuild{ "installed": [ {"type": "file", "file": "usr/share/appdir/config2.h"}, {"type": "file", "file": "usr/share/appdir/config2b.h"}, {"type": "file", "file": "usr/share/appdireh/config2-1.h"}, {"type": "file", "file": "usr/share/appdirok/config2-2.h"}, {"type": "file", "file": "usr/share/configure file test/invalid-utf8-1.bin"} ] } muon-v0.4.0/subprojects/meson-tests/common/14 configure file/config4b.h.in0000644000175000017500000000005014751453622025316 0ustar buildbuild/* Dummy file */ #define RESULTB @ZERO@ muon-v0.4.0/subprojects/meson-tests/common/14 configure file/differentafterbasename1.in0000644000175000017500000000000014751453622030135 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/14 configure file/prog7.c0000644000175000017500000000041014751453622024247 0ustar buildbuild#include #include int main(void) { return strcmp(MESSAGE1, "foo") || strcmp(MESSAGE2, "${var1}") || strcmp(MESSAGE3, "\\foo") || strcmp(MESSAGE4, "\\${var1}") || strcmp(MESSAGE5, "\\ ${ ${ \\${ \\${"); } muon-v0.4.0/subprojects/meson-tests/common/14 configure file/prog5.c0000644000175000017500000000014314751453622024250 0ustar buildbuild#include #include int main(void) { return strcmp(MESSAGE, "@var2@"); } muon-v0.4.0/subprojects/meson-tests/common/14 configure file/prog4.c0000644000175000017500000000013614751453622024251 0ustar buildbuild#include #include int main(void) { return RESULTA + RESULTB; } muon-v0.4.0/subprojects/meson-tests/common/14 configure file/nosubst-nocopy2.txt.in0000644000175000017500000000001214751453622027275 0ustar buildbuild@FOO_BAR@ muon-v0.4.0/subprojects/meson-tests/common/14 configure file/prog.c0000644000175000017500000000043314751453622024165 0ustar buildbuild#include /* config.h must not be in quotes: * https://gcc.gnu.org/onlinedocs/cpp/Search-Path.html */ #include #ifdef SHOULD_BE_UNDEF #error "FAIL!" #endif int main(void) { #ifndef BE_TRUE return 1; #else return strcmp(MESSAGE, "mystring"); #endif } muon-v0.4.0/subprojects/meson-tests/common/14 configure file/depfile0000644000175000017500000000000014751453622024373 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/14 configure file/generator-without-input-file.py0000755000175000017500000000050614751453622031171 0ustar buildbuild#!/usr/bin/env python3 import sys, os from pathlib import Path if len(sys.argv) != 2: print("Wrong amount of parameters.") build_dir = Path(os.environ['MESON_BUILD_ROOT']) subdir = Path(os.environ['MESON_SUBDIR']) outputf = Path(sys.argv[1]) with outputf.open('w') as ofile: ofile.write("#define ZERO_RESULT 0\n") muon-v0.4.0/subprojects/meson-tests/common/14 configure file/config4a.h.in0000644000175000017500000000005014751453622025315 0ustar buildbuild/* Dummy file */ #define RESULTA @ZERO@ muon-v0.4.0/subprojects/meson-tests/common/14 configure file/prog2.c0000644000175000017500000000010014751453622024236 0ustar buildbuild#include int main(void) { return ZERO_RESULT; } muon-v0.4.0/subprojects/meson-tests/common/14 configure file/sameafterbasename.in0000644000175000017500000000000014751453622027033 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/14 configure file/test.py.in0000644000175000017500000000005714751453622025012 0ustar buildbuild#!/usr/bin/env python3 import sys sys.exit(0) muon-v0.4.0/subprojects/meson-tests/common/14 configure file/config7.h.in0000644000175000017500000000073014751453622025164 0ustar buildbuild/* No escape */ #define MESSAGE1 "${var1}" /* Single escape means no replace */ #define MESSAGE2 "\${var1}" /* Replace pairs of escapes before '@' or '\@' with escape characters * (note we have to double number of pairs due to C string escaping) */ #define MESSAGE3 "\\\\${var1}" /* Pairs of escapes and then single escape to avoid replace */ #define MESSAGE4 "\\\\\${var1}" /* Check escape character outside variables */ #define MESSAGE5 "\\ ${ \${ \\\\${ \\\\\${" muon-v0.4.0/subprojects/meson-tests/common/230 external project/0002755000175000017500000000000014751453622023524 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/230 external project/app.c0000644000175000017500000000011514751453622024443 0ustar buildbuild#include int main(void) { return call_foo() == 42 ? 0 : 1; } muon-v0.4.0/subprojects/meson-tests/common/230 external project/func.c0000644000175000017500000000006414751453622024621 0ustar buildbuild#include "func.h" int func(void) { return 1; } muon-v0.4.0/subprojects/meson-tests/common/230 external project/libfoo/0002755000175000017500000000000014751453622024776 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/230 external project/libfoo/configure0000755000175000017500000000126314751453622026705 0ustar buildbuild#! /bin/sh srcdir=$(dirname "$0") for i in "$@" do case $i in --prefix=*) PREFIX="${i#*=}" shift ;; --libdir=*) LIBDIR="${i#*=}" shift ;; --includedir=*) INCDIR="${i#*=}" shift ;; --libext=*) LIBEXT="${i#*=}" shift ;; *) shift ;; esac done DEP_ARGS=$(pkg-config --cflags --libs somelib) cat > Makefile << EOL all: libfoo.$LIBEXT libfoo.$LIBEXT: $CC "$srcdir/libfoo.c" -shared -fPIC $DEP_ARGS -o \$@ install: libfoo.$LIBEXT mkdir -p "\$(DESTDIR)$LIBDIR"; mkdir -p "\$(DESTDIR)$LIBDIR/pkgconfig"; mkdir -p "\$(DESTDIR)$INCDIR"; cp \$< "\$(DESTDIR)$LIBDIR"; cp "$srcdir/libfoo.h" "\$(DESTDIR)$INCDIR"; EOL muon-v0.4.0/subprojects/meson-tests/common/230 external project/libfoo/meson.build0000644000175000017500000000104714751453622027140 0ustar buildbuildmod = import('unstable-external_project') target_system = target_machine.system() if target_system in ['windows', 'cygwin'] libext = 'dll' elif target_system == 'darwin' libext = 'dylib' else libext = 'so' endif p = mod.add_project( 'configure', configure_options: [ '--prefix=@PREFIX@', '--libdir=@PREFIX@/@LIBDIR@', '--includedir=@PREFIX@/@INCLUDEDIR@', '--libext=' + libext, ], depends: somelib, ) libfoo_dep = declare_dependency(link_with: somelib, dependencies: p.dependency('foo')) muon-v0.4.0/subprojects/meson-tests/common/230 external project/libfoo/libfoo.h0000644000175000017500000000004214751453622026413 0ustar buildbuild#pragma once int call_foo(void); muon-v0.4.0/subprojects/meson-tests/common/230 external project/libfoo/libfoo.c0000644000175000017500000000013014751453622026404 0ustar buildbuild#include "libfoo.h" int func(void); int call_foo() { return func() == 1 ? 42 : 0; } muon-v0.4.0/subprojects/meson-tests/common/230 external project/meson.build0000644000175000017500000000137714751453622025674 0ustar buildbuildproject('test external project', 'c') if not find_program('pkg-config', required: false).found() error('MESON_SKIP_TEST: pkg-config not found') endif if not find_program('make', required: false).found() error('MESON_SKIP_TEST: make not found') endif if host_machine.system() == 'windows' error( 'MESON_SKIP_TEST: The fake configure script is too dumb to work on Windows', ) endif if meson.is_cross_build() # CI uses PKG_CONFIG_SYSROOT_DIR which breaks -uninstalled.pc usage. error('MESON_SKIP_TEST: Cross build support is too limited for this test') endif pkg = import('pkgconfig') somelib = library('somelib', 'func.c') pkg.generate(somelib) subdir('libfoo') executable('test-find-library', 'app.c', dependencies: libfoo_dep) muon-v0.4.0/subprojects/meson-tests/common/230 external project/test.json0000644000175000017500000000030714751453622025374 0ustar buildbuild{ "installed": [ { "type": "shared_lib", "file": "usr/lib/foo" }, { "type": "file", "file": "usr/include/libfoo.h" }, { "type": "file", "file": "usr/lib/pkgconfig/somelib.pc" } ] } muon-v0.4.0/subprojects/meson-tests/common/230 external project/func.h0000644000175000017500000000002014751453622024616 0ustar buildbuildint func(void); muon-v0.4.0/subprojects/meson-tests/common/130 include order/0002755000175000017500000000000014751453622022771 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/130 include order/ordertest.c0000644000175000017500000000031014751453622025140 0ustar buildbuild#include "hdr.h" #include "prefer-build-dir-over-src-dir.h" #if !defined(SOME_DEFINE) || SOME_DEFINE != 42 #error "Should have picked up hdr.h from inc1/hdr.h" #endif int main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/130 include order/meson.build0000644000175000017500000000255414751453622025137 0ustar buildbuildproject('include order', 'c') # Test that the order of priority of include paths (from first to last) is: # # 1. Target's current build directory # 2. Target's current source directory # 3. Include paths added with the `c_args:` kwarg # 4. Include paths added with the `include_directories`: kwarg # Within this, the build dir takes precedence over the source dir # 5. Include paths added via `include_directories:` of internal deps # Within this, the build dir takes precedence over the source dir # Custom target dir with a built header subdir('ctsub') # Configures a header file subdir('inc3') # Defines an internal dep subdir('sub1') # Defines a per-target include path subdir('sub2') # Directory for `c_args:` include path subdir('sub3') # The directory where the target resides subdir('sub4') # Test that the order in which internal dependencies are specified is # preserved. This is needed especially when subprojects get involved and # multiple build-root config.h files exist, and we must be sure that the # correct one is found: https://github.com/mesonbuild/meson/issues/1495 f = executable('somefxe', 'sub4/main.c', dependencies: [correctinc, dep, wronginc]) test('eh', e) test('oh', f) # Test that the order in include_directories() is maintained incs = include_directories('inc1', 'inc2', 'inc3') executable('ordertest', 'ordertest.c', include_directories: incs) muon-v0.4.0/subprojects/meson-tests/common/130 include order/ctsub/0002755000175000017500000000000014751453622024111 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/130 include order/ctsub/meson.build0000644000175000017500000000047114751453622026253 0ustar buildbuild# https://github.com/mesonbuild/meson/pull/2291 copy = find_program('copyfile.py') configure_file(input: 'main.h', output: 'main.h', command: [copy, '@INPUT@', '@OUTPUT@']) ctfile = custom_target( 'emptyfile', input: 'emptyfile.c', output: 'emptyfile.c', command: [copy, '@INPUT@', '@OUTPUT@'], ) muon-v0.4.0/subprojects/meson-tests/common/130 include order/ctsub/emptyfile.c0000644000175000017500000000000014751453622026237 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/130 include order/ctsub/main.h0000644000175000017500000000003714751453622025204 0ustar buildbuild#error "ctsub/main.h included" muon-v0.4.0/subprojects/meson-tests/common/130 include order/ctsub/copyfile.py0000644000175000017500000000013414751453622026271 0ustar buildbuild#!/usr/bin/env python3 import sys import shutil shutil.copyfile(sys.argv[1], sys.argv[2]) muon-v0.4.0/subprojects/meson-tests/common/130 include order/inc2/0002755000175000017500000000000014751453622023624 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/130 include order/inc2/hdr.h0000644000175000017500000000002314751453622024543 0ustar buildbuild#undef SOME_DEFINE muon-v0.4.0/subprojects/meson-tests/common/130 include order/inc1/0002755000175000017500000000000014751453622023623 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/130 include order/inc1/hdr.h0000644000175000017500000000002714751453622024546 0ustar buildbuild#define SOME_DEFINE 42 muon-v0.4.0/subprojects/meson-tests/common/130 include order/sub4/0002755000175000017500000000000014751453622023646 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/130 include order/sub4/main.c0000644000175000017500000000024614751453622024736 0ustar buildbuild/* Use the <> include notation to force searching in include directories */ #include int main(void) { if (somefunc() == 1984) return 0; return 1; } muon-v0.4.0/subprojects/meson-tests/common/130 include order/sub4/meson.build0000644000175000017500000000033114751453622026003 0ustar buildbuilde = executable( 'someexe', 'main.c', ctfile, c_args: ['-I' + sub3], include_directories: j, dependencies: dep, ) correctinc = declare_dependency(include_directories: include_directories('.')) muon-v0.4.0/subprojects/meson-tests/common/130 include order/sub4/main.h0000644000175000017500000000004014751453622024733 0ustar buildbuild#pragma once #include "some.h" muon-v0.4.0/subprojects/meson-tests/common/130 include order/sub2/0002755000175000017500000000000014751453622023644 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/130 include order/sub2/meson.build0000644000175000017500000000012314751453622026000 0ustar buildbuildj = include_directories('.') wronginc = declare_dependency(include_directories: j) muon-v0.4.0/subprojects/meson-tests/common/130 include order/sub2/main.h0000644000175000017500000000003614751453622024736 0ustar buildbuild#error "sub2/main.h included" muon-v0.4.0/subprojects/meson-tests/common/130 include order/sub3/0002755000175000017500000000000014751453622023645 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/130 include order/sub3/meson.build0000644000175000017500000000004214751453622026001 0ustar buildbuildsub3 = meson.current_source_dir() muon-v0.4.0/subprojects/meson-tests/common/130 include order/sub3/main.h0000644000175000017500000000003614751453622024737 0ustar buildbuild#error "sub3/main.h included" muon-v0.4.0/subprojects/meson-tests/common/130 include order/sub1/0002755000175000017500000000000014751453622023643 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/130 include order/sub1/some.c0000644000175000017500000000015614751453622024752 0ustar buildbuild#if defined _WIN32 || defined __CYGWIN__ __declspec(dllexport) #endif int somefunc(void) { return 1984; } muon-v0.4.0/subprojects/meson-tests/common/130 include order/sub1/meson.build0000644000175000017500000000020414751453622025777 0ustar buildbuildi = include_directories('.') l = shared_library('somelib', 'some.c') dep = declare_dependency(link_with: l, include_directories: i) muon-v0.4.0/subprojects/meson-tests/common/130 include order/sub1/some.h0000644000175000017500000000024414751453622024755 0ustar buildbuild#pragma once #if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllimport) #else #define DLL_PUBLIC #endif DLL_PUBLIC int somefunc(void); muon-v0.4.0/subprojects/meson-tests/common/130 include order/sub1/main.h0000644000175000017500000000003614751453622024735 0ustar buildbuild#error "sub1/main.h included" muon-v0.4.0/subprojects/meson-tests/common/130 include order/inc3/0002755000175000017500000000000014751453622023625 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/130 include order/inc3/prefer-build-dir-over-src-dir.h0000644000175000017500000000006714751453622031445 0ustar buildbuild#error "inc3/prefer-build-dir-over-src-dir.h included" muon-v0.4.0/subprojects/meson-tests/common/130 include order/inc3/meson.build0000644000175000017500000000015214751453622025763 0ustar buildbuildconfigure_file( output: 'prefer-build-dir-over-src-dir.h', configuration: configuration_data(), ) muon-v0.4.0/subprojects/meson-tests/common/155 subproject dir name collision/0002755000175000017500000000000014751453622026055 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/155 subproject dir name collision/a.c0000644000175000017500000000027714751453622026445 0ustar buildbuild#include char func_b(void); char func_c(void); int main(void) { if(func_b() != 'b') { return 1; } if(func_c() != 'c') { return 2; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/155 subproject dir name collision/meson.build0000644000175000017500000000052214751453622030214 0ustar buildbuildproject('A', 'c', subproject_dir: 'custom_subproject_dir') # different than meson: subproject promotion. Therefore, subproject('C') first # so B can find it. C = subproject('C') c = C.get_variable('c') B = subproject('B') b = B.get_variable('b') subdir('other_subdir') a = executable('a', 'a.c', link_with: [b, c]) test('a test', a) muon-v0.4.0/subprojects/meson-tests/common/155 subproject dir name collision/custom_subproject_dir/0002755000175000017500000000000014751453622032465 5ustar buildbuild././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/155 subproject dir name collision/custom_subproject_dir/C/muon-v0.4.0/subprojects/meson-tests/common/155 subproject dir name collision/custom_subproject_dir/C0002755000175000017500000000000014751453622032570 5ustar buildbuild././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/155 subproject dir name collision/custom_subproject_dir/C/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/155 subproject dir name collision/custom_subproject_dir/C0000644000175000017500000000015314751453622032567 0ustar buildbuildproject('C', 'c') # libc.so cannot be used, it already exists as a reserved name c = library('cee', 'c.c') ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/155 subproject dir name collision/custom_subproject_dir/C/c.cmuon-v0.4.0/subprojects/meson-tests/common/155 subproject dir name collision/custom_subproject_dir/C0000644000175000017500000000052414751453622032571 0ustar buildbuild#if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllexport) #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif char DLL_PUBLIC func_c(void) { return 'c'; } ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/155 subproject dir name collision/custom_subproject_dir/B/muon-v0.4.0/subprojects/meson-tests/common/155 subproject dir name collision/custom_subproject_dir/B0002755000175000017500000000000014751453622032567 5ustar buildbuild././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/155 subproject dir name collision/custom_subproject_dir/B/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/155 subproject dir name collision/custom_subproject_dir/B0000644000175000017500000000014414751453622032566 0ustar buildbuildproject('B', 'c') C = subproject('C') c = C.get_variable('c') b = library('b', 'b.c', link_with: c) ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/155 subproject dir name collision/custom_subproject_dir/B/b.cmuon-v0.4.0/subprojects/meson-tests/common/155 subproject dir name collision/custom_subproject_dir/B0000644000175000017500000000065414751453622032574 0ustar buildbuild#include char func_c(void); #if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllexport) #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif char DLL_PUBLIC func_b(void) { if(func_c() != 'c') { exit(3); } return 'b'; } muon-v0.4.0/subprojects/meson-tests/common/155 subproject dir name collision/other_subdir/0002755000175000017500000000000014751453622030546 5ustar buildbuild././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/155 subproject dir name collision/other_subdir/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/155 subproject dir name collision/other_subdir/meson.buil0000644000175000017500000000007214751453622032541 0ustar buildbuildother = library('other', 'custom_subproject_dir/other.c') ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/155 subproject dir name collision/other_subdir/custom_subproject_dir/muon-v0.4.0/subprojects/meson-tests/common/155 subproject dir name collision/other_subdir/custom_sub0002755000175000017500000000000014751453622032652 5ustar buildbuild././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/155 subproject dir name collision/other_subdir/custom_subproject_dir/other.cmuon-v0.4.0/subprojects/meson-tests/common/155 subproject dir name collision/other_subdir/custom_sub0000644000175000017500000000062414751453622032654 0ustar buildbuild#include #if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllexport) #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif char DLL_PUBLIC func_b(void) { if('c' != 'c') { exit(3); } return 'b'; } muon-v0.4.0/subprojects/meson-tests/common/171 initial c_args/0002755000175000017500000000000014751453622023127 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/171 initial c_args/main.c0000644000175000017500000000016714751453622024221 0ustar buildbuild#ifndef MAGIC #error "magic not defined" #endif int deflate(void *, int); int main(void) { return deflate(0, 0); } muon-v0.4.0/subprojects/meson-tests/common/171 initial c_args/meson.build0000644000175000017500000000171314751453622025271 0ustar buildbuild# A lot of stuff was added to this test to make it actually test that c_args # and c_link_args are used. project( 'options', 'c', default_options: [ 'c_args=-DMAGIC', 'c_link_args=-lz', ], ) # Test passing c_args and c_link_args options from the command line. assert( get_option('c_args') == ['-DMAGIC'], 'Incorrect value for c_args option.', ) assert( get_option('c_link_args') == ['-lz'], 'Incorrect value for c_link_args option.', ) cc = meson.get_compiler('c') if ( not ( cc.find_library( 'z', required: false, ).found() or cc.find_library( 'zlib', required: false, ).found() or cc.find_library( 'zlib1', required: false, ).found() ) ) error( 'MESON_SKIP_TEST Cannot seem to find zlib via find_library, this test will probably fail.', ) endif executable('main', 'main.c') muon-v0.4.0/subprojects/meson-tests/common/171 initial c_args/test.json0000644000175000017500000000025414751453622025000 0ustar buildbuild{ "matrix": { "options": { "c_args": [{ "val": "-funroll-loops" }], "c_link_args": [{ "val": "-Dtest_harmless_but_useless_link_arg" }] } } } muon-v0.4.0/subprojects/meson-tests/common/80 declare dep/0002755000175000017500000000000014751453622022326 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/80 declare dep/main.c0000644000175000017500000000051214751453622023412 0ustar buildbuild#include #include #ifndef USING_ENT #error "Entity use flag not used for compilation." #endif int main(void) { if(entity_func1() != 5) { printf("Error in func1.\n"); return 1; } if(entity_func2() != 9) { printf("Error in func2.\n"); return 2; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/80 declare dep/meson.build0000644000175000017500000000126414751453622024471 0ustar buildbuildproject('declare dependency', 'c') subdir('entity') exe = executable('dep_user', 'main.c', dependencies: entity_dep) test('dep', exe) # just to make sure [] works as a no-op dep here executable('dummy', 'main.c', dependencies: [entity_dep, []]) # simple case declare_dependency(dependencies: entity_dep) # nested deps should be flattened declare_dependency(dependencies: [entity_dep]) declare_dependency(dependencies: [[entity_dep]]) # check that [] properly works as a no-op dep in declare_dependency() too declare_dependency(dependencies: []) declare_dependency(dependencies: [[]]) declare_dependency(dependencies: [entity_dep, []]) declare_dependency(dependencies: [[], entity_dep]) muon-v0.4.0/subprojects/meson-tests/common/80 declare dep/entity/0002755000175000017500000000000014751453622023642 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/80 declare dep/entity/entity2.c0000644000175000017500000000007514751453622025404 0ustar buildbuild#include int entity_func2(void) { return 9; } muon-v0.4.0/subprojects/meson-tests/common/80 declare dep/entity/entity1.c0000644000175000017500000000021714751453622025401 0ustar buildbuild#include"entity.h" #ifdef USING_ENT #error "Entity use flag leaked into entity compilation." #endif int entity_func1(void) { return 5; } muon-v0.4.0/subprojects/meson-tests/common/80 declare dep/entity/meson.build0000644000175000017500000000063514751453622026006 0ustar buildbuildentity_lib = static_library('entity', 'entity1.c') entity_dep = declare_dependency( link_with: [[entity_lib]], include_directories: [['.']], sources: 'entity2.c', compile_args: ['-DUSING_ENT=1'], version: '1.2.3', link_args: [], ) # No simple way of testing linker flags :(. assert( entity_dep.version().version_compare('==1.2.3'), 'Declare_dep has incorrect version string.', ) muon-v0.4.0/subprojects/meson-tests/common/80 declare dep/entity/entity.h0000644000175000017500000000007614751453622025330 0ustar buildbuild#pragma once int entity_func1(void); int entity_func2(void); muon-v0.4.0/subprojects/meson-tests/common/266 format string/0002755000175000017500000000000014751453622023043 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/266 format string/meson_options.txt0000644000175000017500000000003714751453622026476 0ustar buildbuildoption('opt', type: 'feature') muon-v0.4.0/subprojects/meson-tests/common/266 format string/meson.build0000644000175000017500000000131714751453622025205 0ustar buildbuildproject('test format string') # Test all supported types in message(), format(), f-string. foreach t : [get_option('opt'), 42, true, false, 'str', ['list'], {'dict': 'value'}] message(t, '@0@'.format(t), f'@t@', [t], {'key': t}) endforeach # diferent than meson: muon doesn't support env in str.format() # Deprecated but should work with str.format(). # env = environment() # message('@0@'.format(env)) # Should fail with f-string and message() error_msg = 'Value other than strings, integers, bools, options, dictionaries and lists thereof.' # testcase expect_error('message(): ' + error_msg) # message(env) # endtestcase # testcase expect_error('f-string: ' + error_msg) # message(f'@env@') # endtestcase muon-v0.4.0/subprojects/meson-tests/common/266 format string/test.json0000644000175000017500000000135514751453622024717 0ustar buildbuild{ "stdout": [ { "line": "Message: auto auto auto [auto] {'key' : auto}" }, { "line": "Message: 42 42 42 [42] {'key' : 42}" }, { "line": "Message: true true true [true] {'key' : true}" }, { "line": "Message: false false false [false] {'key' : false}" }, { "line": "Message: str str str ['str'] {'key' : 'str'}" }, { "line": "Message: ['list'] ['list'] ['list'] [['list']] {'key' : ['list']}" }, { "line": "Message: {'dict' : 'value'} {'dict' : 'value'} {'dict' : 'value'} [{'dict' : 'value'}] {'key' : {'dict' : 'value'}}" }, { "line": "Message: " } ] } muon-v0.4.0/subprojects/meson-tests/common/201 kwarg entry/0002755000175000017500000000000014751453622022506 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/201 kwarg entry/inc/0002755000175000017500000000000014751453622023257 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/201 kwarg entry/inc/prog.h0000644000175000017500000000005714751453622024377 0ustar buildbuild#pragma once #define MESSAGE "Hello there.\n" muon-v0.4.0/subprojects/meson-tests/common/201 kwarg entry/meson.build0000644000175000017500000000024314751453622024645 0ustar buildbuildproject('kwarg', 'c') default_kwargs = {'install': true, 'include_directories': include_directories('inc')} executable('prog', 'prog.c', kwargs: default_kwargs) muon-v0.4.0/subprojects/meson-tests/common/201 kwarg entry/test.json0000644000175000017500000000016214751453622024355 0ustar buildbuild{ "installed": [ {"type": "exe", "file": "usr/bin/prog"}, {"type": "pdb", "file": "usr/bin/prog"} ] } muon-v0.4.0/subprojects/meson-tests/common/201 kwarg entry/prog.c0000644000175000017500000000013214751453622023613 0ustar buildbuild#include #include int main(void) { printf(MESSAGE); return 0; } muon-v0.4.0/subprojects/meson-tests/common/275 required keyword in compiles functions/0002755000175000017500000000000014751453622027725 5ustar buildbuild././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/275 required keyword in compiles functions/meson_options.txtmuon-v0.4.0/subprojects/meson-tests/common/275 required keyword in compiles functions/meson_options.0000644000175000017500000000006214751453622032616 0ustar buildbuildoption('opt', type: 'feature', value: 'disabled') muon-v0.4.0/subprojects/meson-tests/common/275 required keyword in compiles functions/meson.build0000644000175000017500000000270414751453622032070 0ustar buildbuildproject('required keyword in compiles functions', 'c') cc = meson.get_compiler('c') opt = get_option('opt') valid = files('valid.c') invalid = files('invalid.c') cc.compiles(valid, name: 'valid', required: true) cc.links(valid, name: 'valid', required: true) if meson.can_run_host_binaries() cc.run(valid, name: 'valid', required: true) endif assert(not cc.compiles(valid, name: 'valid', required: opt)) assert(not cc.links(valid, name: 'valid', required: opt)) if meson.can_run_host_binaries() res = cc.run(valid, name: 'valid', required: opt) # different than meson: a disabled compiler.run() returns an uncompiled # runresult # assert(res.compiled()) # assert(res.returncode() == 0) # assert(res.stdout() == '') # assert(res.stderr() == '') assert(not res.compiled()) endif # testcase expect_error('''compiler.compiles keyword argument 'required' was of type str but should have been one of: bool, UserFeatureOption''') # cc.compiles(valid, name: 'valid', required : 'not a bool') # endtestcase # testcase expect_error('''Could not compile invalid''') # cc.compiles(invalid, name: 'invalid', required : true) # endtestcase # testcase expect_error('''Could not link invalid''') # cc.links(invalid, name: 'invalid', required : true) # endtestcase if meson.can_run_host_binaries() # testcase expect_error('''Could not run invalid''') # cc.run(invalid, name: 'invalid', required : true) # endtestcase endif muon-v0.4.0/subprojects/meson-tests/common/275 required keyword in compiles functions/invalid.c0000644000175000017500000000014114751453622031511 0ustar buildbuild// The error in this file is an homage to the xz incident :) // int main(void) { . return 0; } muon-v0.4.0/subprojects/meson-tests/common/275 required keyword in compiles functions/valid.c0000644000175000017500000000004114751453622031161 0ustar buildbuildint main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/60 foreach/0002755000175000017500000000000014751453622021603 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/60 foreach/prog3.c0000644000175000017500000000012614751453622022776 0ustar buildbuild#include int main(void) { printf("This is test #3.\n"); return 0; } muon-v0.4.0/subprojects/meson-tests/common/60 foreach/prog1.c0000644000175000017500000000012614751453622022774 0ustar buildbuild#include int main(void) { printf("This is test #1.\n"); return 0; } muon-v0.4.0/subprojects/meson-tests/common/60 foreach/meson.build0000644000175000017500000000243614751453622023750 0ustar buildbuildproject('foreach', 'c') tests = [ ['test1', 'prog1', 'prog1.c'], ['test2', 'prog2', 'prog2.c', 'fallback'], ['test3', 'prog3', 'prog3.c', 'urgh'], ] assert(tests[0].get(3, 'fallbck') == 'fallbck', 'array #1 fallback did not match') assert(tests[1].get(3, 'failbk') == 'fallback', 'array #2 value did not match') assert(tests[2].get(3, 'urgh') == 'urgh', 'array #3 value did not match') foreach i : tests test(i.get(0), executable(i.get(1), i.get(2), install: true)) # Ensure that changing the tests variable does not # affect ongoing iteration in the foreach loop. # # Being able to do that would make Meson Turing complete and # we definitely don't want that. tests = ['test4', 'prog4', 'prog4.c'] endforeach items = ['a', 'continue', 'b', 'break', 'c'] result = [] foreach i : items if i == 'continue' continue elif i == 'break' break endif result += i endforeach assert(result == ['a', 'b'], 'Continue or break in foreach failed') items = [] iter = range(2) foreach i : iter items += i endforeach assert(items == [0, 1]) assert(iter[1] == 1) items = [] foreach i : range(1, 2) items += i endforeach assert(items == [1]) items = [] foreach i : range(1, 10, 2) items += i endforeach assert(items == [1, 3, 5, 7, 9]) muon-v0.4.0/subprojects/meson-tests/common/60 foreach/test.json0000644000175000017500000000045414751453622023456 0ustar buildbuild{ "installed": [ {"type": "exe", "file": "usr/bin/prog1"}, {"type": "pdb", "file": "usr/bin/prog1"}, {"type": "exe", "file": "usr/bin/prog2"}, {"type": "pdb", "file": "usr/bin/prog2"}, {"type": "exe", "file": "usr/bin/prog3"}, {"type": "pdb", "file": "usr/bin/prog3"} ] } muon-v0.4.0/subprojects/meson-tests/common/60 foreach/prog2.c0000644000175000017500000000012614751453622022775 0ustar buildbuild#include int main(void) { printf("This is test #2.\n"); return 0; } muon-v0.4.0/subprojects/meson-tests/common/212 source set configuration_data/0002755000175000017500000000000014751453622026150 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/212 source set configuration_data/subdir/0002755000175000017500000000000014751453622027440 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/212 source set configuration_data/subdir/meson.build0000644000175000017500000000007314751453622031600 0ustar buildbuildsources.add(when: ['YES2', good], if_true: [files('b.c')]) muon-v0.4.0/subprojects/meson-tests/common/212 source set configuration_data/subdir/b.c0000644000175000017500000000016114751453622030021 0ustar buildbuild#include #include "all.h" void h(void) { } int main(void) { if (p) abort(); f(); g(); } muon-v0.4.0/subprojects/meson-tests/common/212 source set configuration_data/a.c0000644000175000017500000000012614751453622026531 0ustar buildbuild#include #include "all.h" int main(void) { if (p) abort(); f(); } muon-v0.4.0/subprojects/meson-tests/common/212 source set configuration_data/all.h0000644000175000017500000000032214751453622027064 0ustar buildbuildextern void f(void); extern void g(void); extern void h(void); extern void undefined(void); /* Defined in nope.c and f.c, * value depends on the source set and configuration used. */ extern void (*p)(void); muon-v0.4.0/subprojects/meson-tests/common/212 source set configuration_data/f.c0000644000175000017500000000011214751453622026531 0ustar buildbuild#include "all.h" void (*p)(void) = (void *)0x12AB34CD; void f(void) { } muon-v0.4.0/subprojects/meson-tests/common/212 source set configuration_data/meson.build0000644000175000017500000000360114751453622030310 0ustar buildbuildproject('a', 'c') good = declare_dependency(link_with: static_library('good', 'g.c')) bad = declare_dependency(link_args: 'nonexistent.a') not_found = dependency('invalid', required: false) source_set = import('sourceset') sources = source_set.source_set() sources.add(when: 'YES', if_false: ['nope.c']) sources.add(when: 'YES1', if_true: [files('a.c'), not_found]) subdir('subdir') sources.add(when: 'NO', if_true: 'nope.c', if_false: ['f.c']) sources.add(when: 'NO', if_true: bad, if_false: ['f.c']) sources.add(when: 'YES2', if_true: good) # dependencies as conditions sources.add(when: not_found, if_true: 'nope.c') # test add_all sources2 = source_set.source_set() sources2.add(when: 'YES1', if_true: 'nope.c') sources.add_all(when: 'NO', if_true: sources2) # test duplicate items sources.add(when: 'YES1', if_true: [files('a.c'), not_found]) conf1 = configuration_data() conf1.set10('YES', true) conf1.set10('YES1', true) conf1.set10('YES2', false) conf1.set10('NO', false) result1 = sources.apply(conf1) conf2 = configuration_data() conf2.set10('YES', true) conf2.set10('YES1', false) conf2.set10('YES2', true) conf2.set10('NO', false) result2 = sources.apply(conf2) # Each target will recompile the objects executable('first', sources: result1.sources(), dependencies: result1.dependencies()) executable('second', sources: result2.sources(), dependencies: result2.dependencies()) # All target will use the same object files if meson.is_unity() message('Skipping extraction test because this is a Unity build.') else all_objs = static_library('all_objs', sources.all_sources()) executable( 'first_via_lib', objects: all_objs.extract_objects(result1.sources()), dependencies: result1.dependencies(), ) executable( 'second_via_lib', objects: all_objs.extract_objects(result2.sources()), dependencies: result2.dependencies(), ) endif muon-v0.4.0/subprojects/meson-tests/common/212 source set configuration_data/g.c0000644000175000017500000000005414751453622026537 0ustar buildbuild#include "all.h" void g(void) { h(); } muon-v0.4.0/subprojects/meson-tests/common/212 source set configuration_data/nope.c0000644000175000017500000000005714751453622027255 0ustar buildbuild#include "all.h" void (*p)(void) = undefined; muon-v0.4.0/subprojects/meson-tests/common/246 dependency fallbacks/0002755000175000017500000000000014751453622024303 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/246 dependency fallbacks/subprojects/0002755000175000017500000000000014751453622026646 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/246 dependency fallbacks/subprojects/png/0002755000175000017500000000000014751453622027432 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/246 dependency fallbacks/subprojects/png/meson.build0000644000175000017500000000011214751453622031564 0ustar buildbuildproject('png') meson.override_dependency('libpng', declare_dependency()) muon-v0.4.0/subprojects/meson-tests/common/246 dependency fallbacks/meson.build0000644000175000017500000000046114751453622026444 0ustar buildbuildproject('dependency fallbacks') # pkg-config has 'libpng' but cmake has 'png' and we have a 'png' subproject # for platforms that have neither. d = dependency('libpng', 'png', 'foo') assert(d.found()) # Check that dependency 'foo' has been implicitly overridden. d = dependency('foo') assert(d.found()) muon-v0.4.0/subprojects/meson-tests/common/252 install data structured/0002755000175000017500000000000014751453622025004 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/252 install data structured/dir2/0002755000175000017500000000000014751453622025644 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/252 install data structured/dir2/file10000644000175000017500000000000014751453622026553 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/252 install data structured/dir2/bad0000644000175000017500000000000014751453622026301 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/252 install data structured/dir2/file30000644000175000017500000000000014751453622026555 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/252 install data structured/dir2/file20000644000175000017500000000000014751453622026554 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/252 install data structured/pysrc/0002755000175000017500000000000014751453622026144 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/252 install data structured/pysrc/bad.py0000644000175000017500000000004614751453622027242 0ustar buildbuild'''mod.bad should not be installed''' muon-v0.4.0/subprojects/meson-tests/common/252 install data structured/pysrc/foo.py0000644000175000017500000000002514751453622027274 0ustar buildbuild'''mod.foo module''' muon-v0.4.0/subprojects/meson-tests/common/252 install data structured/pysrc/meson.build0000644000175000017500000000032514751453622030304 0ustar buildbuildpy_inst = import('python').find_installation() py_inst.install_sources( '__init__.py', 'foo.py', 'bar.py', 'submod/__init__.py', 'submod/baz.py', subdir: 'mod', preserve_path: true, ) muon-v0.4.0/subprojects/meson-tests/common/252 install data structured/pysrc/__init__.py0000644000175000017500000000002314751453622030246 0ustar buildbuild'''init for mod''' muon-v0.4.0/subprojects/meson-tests/common/252 install data structured/pysrc/bar.py0000644000175000017500000000002514751453622027255 0ustar buildbuild'''mod.bar module''' muon-v0.4.0/subprojects/meson-tests/common/252 install data structured/pysrc/submod/0002755000175000017500000000000014751453622027435 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/252 install data structured/pysrc/submod/bad.py0000644000175000017500000000005514751453622030533 0ustar buildbuild'''mod.submod.bad should not be installed''' muon-v0.4.0/subprojects/meson-tests/common/252 install data structured/pysrc/submod/__init__.py0000644000175000017500000000002614751453622031542 0ustar buildbuild'''init for submod''' muon-v0.4.0/subprojects/meson-tests/common/252 install data structured/pysrc/submod/baz.py0000644000175000017500000000003414751453622030556 0ustar buildbuild'''mod.submod.baz module''' muon-v0.4.0/subprojects/meson-tests/common/252 install data structured/meson.build0000644000175000017500000000044714751453622027151 0ustar buildbuildproject('install structured data') install_data( 'dir1/file1', 'dir1/file2', 'dir1/file3', 'dir2/file1', 'dir2/file2', 'dir2/file3', 'dir3/file1', 'dir3/file2', 'dir3/file3', install_dir: get_option('datadir'), preserve_path: true, ) subdir('pysrc') muon-v0.4.0/subprojects/meson-tests/common/252 install data structured/test.json0000644000175000017500000000157614751453622026665 0ustar buildbuild{ "installed": [ {"type": "python_file", "file": "usr/@PYTHON_PURELIB@/mod/__init__.py"}, {"type": "python_file", "file": "usr/@PYTHON_PURELIB@/mod/foo.py"}, {"type": "python_file", "file": "usr/@PYTHON_PURELIB@/mod/bar.py"}, {"type": "python_file", "file": "usr/@PYTHON_PURELIB@/mod/submod/__init__.py"}, {"type": "python_file", "file": "usr/@PYTHON_PURELIB@/mod/submod/baz.py"}, {"type": "file", "file": "usr/share/dir1/file1"}, {"type": "file", "file": "usr/share/dir1/file2"}, {"type": "file", "file": "usr/share/dir1/file3"}, {"type": "file", "file": "usr/share/dir2/file1"}, {"type": "file", "file": "usr/share/dir2/file2"}, {"type": "file", "file": "usr/share/dir2/file3"}, {"type": "file", "file": "usr/share/dir3/file1"}, {"type": "file", "file": "usr/share/dir3/file2"}, {"type": "file", "file": "usr/share/dir3/file3"} ] } muon-v0.4.0/subprojects/meson-tests/common/252 install data structured/dir3/0002755000175000017500000000000014751453622025645 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/252 install data structured/dir3/file10000644000175000017500000000000014751453622026554 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/252 install data structured/dir3/bad0000644000175000017500000000000014751453622026302 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/252 install data structured/dir3/file30000644000175000017500000000000014751453622026556 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/252 install data structured/dir3/file20000644000175000017500000000000014751453622026555 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/252 install data structured/dir1/0002755000175000017500000000000014751453622025643 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/252 install data structured/dir1/file10000644000175000017500000000000014751453622026552 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/252 install data structured/dir1/bad0000644000175000017500000000000014751453622026300 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/252 install data structured/dir1/file30000644000175000017500000000000014751453622026554 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/252 install data structured/dir1/file20000644000175000017500000000000014751453622026553 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/140 custom target multiple outputs/0002755000175000017500000000000014751453622026354 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/140 custom target multiple outputs/meson.build0000644000175000017500000000315014751453622030513 0ustar buildbuildproject('multiple outputs install') gen = find_program('generator.py') custom_target( 'different-install-dirs', output: ['diff.h', 'diff.sh'], command: [gen, 'diff', '@OUTDIR@'], install: true, install_dir: [ join_paths(get_option('prefix'), get_option('includedir')), join_paths(get_option('prefix'), get_option('bindir')), ], ) custom_target( 'same-install-dir', output: ['same.h', 'same.sh'], command: [gen, 'same', '@OUTDIR@'], install: true, install_dir: '/opt', ) custom_target( 'only-install-first', output: ['first.h', 'first.sh'], command: [gen, 'first', '@OUTDIR@'], install: true, install_dir: [join_paths(get_option('prefix'), get_option('includedir')), false], ) targets = custom_target( 'only-install-second', output: ['second.h', 'second.sh'], command: [gen, 'second', '@OUTDIR@'], install: true, install_dir: [false, join_paths(get_option('prefix'), get_option('bindir'))], ) paths = [] foreach i : targets.to_list() paths += i.full_path() endforeach # The Xcode backend has a different output naming scheme. if meson.backend() == 'xcode' assert( paths == [ meson.project_build_root() / get_option('buildtype') / 'second.h', meson.project_build_root() / get_option('buildtype') / 'second.sh', ], ) # Skip on Windows because paths are not identical, '/' VS '\'. elif host_machine.system() != 'windows' assert( paths == [ meson.current_build_dir() / 'second.h', meson.current_build_dir() / 'second.sh', ], ) endif muon-v0.4.0/subprojects/meson-tests/common/140 custom target multiple outputs/generator.py0000755000175000017500000000050214751453622030712 0ustar buildbuild#!/usr/bin/env python3 import sys, os if len(sys.argv) != 3: print(sys.argv[0], '', '') name = sys.argv[1] odir = sys.argv[2] with open(os.path.join(odir, name + '.h'), 'w') as f: f.write('int func();\n') with open(os.path.join(odir, name + '.sh'), 'w') as f: f.write('#!/bin/bash') muon-v0.4.0/subprojects/meson-tests/common/140 custom target multiple outputs/test.json0000644000175000017500000000047614751453622030233 0ustar buildbuild{ "installed": [ {"type": "file", "file": "usr/include/diff.h"}, {"type": "file", "file": "usr/include/first.h"}, {"type": "file", "file": "usr/bin/diff.sh"}, {"type": "file", "file": "usr/bin/second.sh"}, {"type": "file", "file": "opt/same.h"}, {"type": "file", "file": "opt/same.sh"} ] } muon-v0.4.0/subprojects/meson-tests/common/28 try compile/0002755000175000017500000000000014751453622022427 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/28 try compile/meson.build0000644000175000017500000000600214751453622024565 0ustar buildbuildproject('try compile', 'c', 'cpp') code = '''#include void func(void) { printf("Something.\n"); } ''' breakcode = '''#include void func(void) { printf("This won't work.\n"); } ''' warncode = '''#warning This is a warning int main(void) { return 0; } ''' configure_file( input: 'foo.h.in', output: 'foo.h', configuration: {}, ) header_code = '#include "foo.h"' foreach lang : ['c', 'cpp'] compiler = meson.get_compiler(lang) assert( not compiler.compiles(header_code, name: 'Should not include . by default'), ) assert( compiler.compiles( header_code, name: 'Should include builddir', include_directories: include_directories('.'), ), ) if compiler.compiles(code, name: 'code should succeed') == false error('Compiler ' + compiler.get_id() + ' is fail.') endif if compiler.compiles(files('valid.c'), name: 'file should succeed') == false error('Compiler ' + compiler.get_id() + ' is fail.') endif copied = configure_file(input: 'valid.c', output: lang + '-valid-copy.c', copy: true) if compiler.compiles(copied, name: 'built file should succeed') == false error('Compiler ' + compiler.get_id() + ' is fail.') endif if compiler.compiles(breakcode, name: 'code should fail') error('Compiler ' + compiler.get_id() + ' returned true on broken code.') endif if compiler.compiles(files('invalid.c'), name: 'file should fail') error('Compiler ' + compiler.get_id() + ' returned true on broken code.') endif # MSVC does not support #warning instruction if compiler.get_id() != 'msvc' # First check that all tests pass without werror, then check they fail with it. foreach with_werror : [false, true] expect_success = not with_werror assert( compiler.compiles( warncode, name: f'code with warning compiles with werror=@with_werror@', werror: with_werror, ) == expect_success, ) assert( compiler.links( warncode, name: f'code with warning links with werror=@with_werror@', werror: with_werror, ) == expect_success, ) if meson.can_run_host_binaries() # different than meson: if compiler.run() fails then the # resulting run_result() is undefined which means that any # attempt to call a method (like returncode) fails. res = compiler.run( warncode, name: f'code with warning runs with werror=@with_werror@', werror: with_werror, ) assert(res.compiled() == expect_success) if res.compiled() assert(res.returncode() == 0) endif endif endforeach endif endforeach muon-v0.4.0/subprojects/meson-tests/common/28 try compile/invalid.c0000644000175000017500000000011214751453622024211 0ustar buildbuild#include void func(void) { printf("This won't work.\n"); } muon-v0.4.0/subprojects/meson-tests/common/28 try compile/valid.c0000644000175000017500000000007614751453622023673 0ustar buildbuild#include void func(void) { printf("Something.\n"); } muon-v0.4.0/subprojects/meson-tests/common/28 try compile/foo.h.in0000644000175000017500000000000014751453622023754 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/0002755000175000017500000000000014751453622025375 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/0002755000175000017500000000000014751453622027740 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/zlib.wrap0000644000175000017500000000061714751453622031575 0ustar buildbuild[wrap-file] directory = zlib-1.2.8 source_url = http://zlib.net/fossils/zlib-1.2.8.tar.gz source_filename = zlib-1.2.8.tar.gz source_hash = 36658cb768a54c1d4dec43c3116c27ed893e88b02ecfcb44f2166f9c0b7f2a0d patch_url = https://wrapdb.mesonbuild.com/v1/projects/zlib/1.2.8/8/get_zip patch_filename = zlib-1.2.8-8-wrap.zip patch_hash = 17c52a0e0c59ce926d3959005d5cd8178c6c7e2c9a4a1304279a8320c955ac60 muon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/foo.wrap0000644000175000017500000000065314751453622031420 0ustar buildbuild[wrap-file] directory = foo-1.0 ; different-than-meson: there is no packagecache ; source_url = http://something.invalid source_filename = foo-1.0.tar.xz source_hash = 9ed8f67d75e43d3be161efb6eddf30dd01995a958ca83951ea64234bac8908c1 lead_directory_missing = true ; patch_url = https://something.invalid/patch patch_filename = foo-1.0-patch.tar.xz patch_hash = d0ddc5e60fdb27d808552f5ac8d0bb603ea2cba306538b4427b985535b26c9c5 muon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagefiles/0002755000175000017500000000000014751453622032356 5ustar buildbuild././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagefiles/patchfile/muon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagefiles/0002755000175000017500000000000014751453622032356 5ustar buildbuild././@LongLink0000644000000000000000000000022200000000000011577 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagefiles/patchfile/0001-Change-foo-to-executable.patchmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagefiles/0000644000175000017500000000136414751453622032362 0ustar buildbuildFrom b79f6cc4a096f6c2888f73b947b652491885896a Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Fri, 30 Nov 2018 14:13:47 -0500 Subject: [PATCH] Change foo to executable --- foo.c | 4 ++++ meson.build | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/foo.c b/foo.c index 54f9119..468f033 100644 --- a/foo.c +++ b/foo.c @@ -1,3 +1,7 @@ int dummy_func(void) { return 44; } + +int main(void) { + return dummy_func() == 44 ? 0 : 1; +} diff --git a/meson.build b/meson.build index 318e81d..4a281d9 100644 --- a/meson.build +++ b/meson.build @@ -1,2 +1,2 @@ project('static lib patchdir', 'c') -libfoo = static_library('foo', 'foo.c') +foo_exe = executable('foo', 'foo.c') -- 2.17.1 ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagefiles/patchfile/0002-Change-return-value-to-44.patchmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagefiles/0000644000175000017500000000067714751453622032370 0ustar buildbuildFrom c2da2e490b09f2e251c7f4ef7c1240acee215fec Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Fri, 30 Nov 2018 10:15:47 -0500 Subject: [PATCH 2/2] Change return value to 44 --- foo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/foo.c b/foo.c index e4577b8..54f9119 100644 --- a/foo.c +++ b/foo.c @@ -1,3 +1,3 @@ int dummy_func(void) { - return 43; + return 44; } -- 2.17.1 ././@LongLink0000644000000000000000000000022300000000000011600 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagefiles/patchfile/0001-Change-return-value-to-43.patchmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagefiles/0000644000175000017500000000067714751453622032370 0ustar buildbuildFrom 7001dcc738e5ae7dfa8af20ed582b9a985804f72 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Fri, 30 Nov 2018 10:15:33 -0500 Subject: [PATCH 1/2] Change return value to 43 --- foo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/foo.c b/foo.c index 019f2ba..e4577b8 100644 --- a/foo.c +++ b/foo.c @@ -1,3 +1,3 @@ int dummy_func(void) { - return 42; + return 43; } -- 2.17.1 ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagefiles/foo-1.0-patch.tar.xzmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagefiles/0000644000175000017500000000036414751453622032361 0ustar buildbuild7zXZִF!t/ ]3Z1kE爩G=%MOG"B`֑ Xn>xyDY'p9d+Ұ4dXHBݦynsopPw M NM9u kqu!, c2ݙMiv\Ky1+: D!Q0\}gYZ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagefiles/bar-1.0-patch.tar.xzmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagefiles/0000644000175000017500000000036414751453622032361 0ustar buildbuild7zXZִF!t/ ]1J˫#οM&1lZ,Ek;K& 6t(3:OMT*hßhc<KP>e륭Xar1C UHpKm.i|5Ţ NHtFq {7HB5ڻ!C!G-z݈‘;N%|7A=ZS@^bbbC!v+?gYZ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagefiles/foo-1.0.tar.xzmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagefiles/0000644000175000017500000000030414751453622032353 0ustar buildbuild7zXZִF!t/]3\cjz"xIx6EB_HhmDPͶ%T1KCb_]a'U h2ɵ[Bf ΍1ŽP M{F)鵄 5ԗWrN}[?:G@3VgYZ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagefiles/foo-1.0/muon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagefiles/0002755000175000017500000000000014751453622032356 5ustar buildbuild././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagefiles/foo-1.0/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagefiles/0000644000175000017500000000011414751453622032352 0ustar buildbuildproject('static lib patchdir', 'c') libfoo = static_library('foo', 'foo.c') ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagefiles/bar-1.0.tar.xzmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagefiles/0000644000175000017500000000031014751453622032350 0ustar buildbuild7zXZִF!t/]1Jni]jpcJ?|.+yo}i$zZrjź=C=U@(ҽANu mrp>8nH[ÑO~OK'ƩT3kQD !?mph;q}+lX[gYZmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/bar.wrap0000644000175000017500000000033314751453622031374 0ustar buildbuild[wrap-file] directory = bar-1.0 lead_directory_missing = true source_filename = bar-1.0.tar.xz source_hash = f0f61948530dc0d33e3028cd71a9f8ee869f6b3665960d8f41d715cf4aed6467 patch_filename = bar-1.0-patch.tar.xz muon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/patchdir.wrap0000644000175000017500000000037114751453622032430 0ustar buildbuild[wrap-file] directory = foo-1.0-patchdir source_url = http://something.invalid source_filename = foo-1.0.tar.xz source_hash = 9ed8f67d75e43d3be161efb6eddf30dd01995a958ca83951ea64234bac8908c1 lead_directory_missing = true patch_directory = foo-1.0 muon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/.gitignore0000644000175000017500000000006714751453622031731 0ustar buildbuild/foo-1.0 /bar-1.0 /foo-1.0-patchdir /foo-1.0-patchfile muon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagecache/0002755000175000017500000000000014751453622032317 5ustar buildbuild././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagecache/zlib-1.2.8.tar.gzmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagecache/0000644000175000017500000000000614751453622032313 0ustar buildbuilddummy ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagecache/foo-1.0-patch.tar.xzmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagecache/0000644000175000017500000000036414751453622032322 0ustar buildbuild7zXZִF!t/ ]3Z1kE爩G=%MOG"B`֑ Xn>xyDY'p9d+Ұ4dXHBݦynsopPw M NM9u kqu!, c2ݙMiv\Ky1+: D!Q0\}gYZ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagecache/zlib-1.2.8-8-wrap.zipmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagecache/0000644000175000017500000000000614751453622032313 0ustar buildbuilddummy ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagecache/foo-1.0.tar.xzmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/packagecache/0000644000175000017500000000030414751453622032314 0ustar buildbuild7zXZִF!t/]3\cjz"xIx6EB_HhmDPͶ%T1KCb_]a'U h2ɵ[Bf ΍1ŽP M{F)鵄 5ԗWrN}[?:G@3VgYZmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/zlib-1.2.8/0002755000175000017500000000000014751453622031344 5ustar buildbuild././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/zlib-1.2.8/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/zlib-1.2.8/me0000644000175000017500000000006314751453622031665 0ustar buildbuildproject('shared lib', 'c') library('foo', 'foo.c') ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/zlib-1.2.8/foo.cmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/zlib-1.2.8/fo0000644000175000017500000000005014751453622031664 0ustar buildbuildint dummy_func(void) { return 42; } ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/patchfile.wrapmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/subprojects/patchfile.wra0000644000175000017500000000062614751453622032414 0ustar buildbuild[wrap-file] directory = foo-1.0-patchfile source_url = http://something.invalid source_filename = foo-1.0.tar.xz source_hash = 9ed8f67d75e43d3be161efb6eddf30dd01995a958ca83951ea64234bac8908c1 lead_directory_missing = true patch_directory = foo-1.0 diff_files = patchfile/0001-Change-return-value-to-43.patch, patchfile/0002-Change-return-value-to-44.patch, patchfile/0001-Change-foo-to-executable.patch muon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/meson.build0000644000175000017500000000133114751453622027533 0ustar buildbuildproject( 'mainproj', 'c', default_options: ['wrap_mode=nodownload'], ) if not find_program('patch', required: false).found() and not find_program('git', required: false).found() error('MESON_SKIP_TEST: patch/git not found.') endif subproject('zlib') foo = subproject('foo', required: false) if not foo.found() error('MESON_SKIP_TEST: libarchive support is not enabled') endif bar = subproject('bar') libfoo = foo.get_variable('libfoo') libbar = bar.get_variable('libbar') executable('grabprog', files('src/subprojects/prog.c')) executable('grabprog2', files('src/subprojects/foo/prog2.c')) subdir('src') subproject('patchdir') exe = subproject('patchfile').get_variable('foo_exe') test('test_foo', exe) muon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/src/0002755000175000017500000000000014751453622026164 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/src/subprojects/0002755000175000017500000000000014751453622030527 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/src/subprojects/foo/0002755000175000017500000000000014751453622031312 5ustar buildbuild././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/src/subprojects/foo/prog2.cmuon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/src/subprojects/foo/prog20000644000175000017500000000026614751453622032270 0ustar buildbuild#include int main(void) { printf("Do not have a file layout like this in your own projects.\n"); printf("This is only to test that this works.\n"); return 0; } muon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/src/subprojects/prog.c0000644000175000017500000000026614751453622031644 0ustar buildbuild#include int main(void) { printf("Do not have a file layout like this in your own projects.\n"); printf("This is only to test that this works.\n"); return 0; } muon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/src/test.c0000644000175000017500000000024714751453622027310 0ustar buildbuild#include int bar_dummy_func(void); int dummy_func(void); int main(void) { printf("Hello world %d\n", bar_dummy_func() + dummy_func()); return 0; } muon-v0.4.0/subprojects/meson-tests/common/153 wrap file should not failed/src/meson.build0000644000175000017500000000031514751453622030323 0ustar buildbuildexecutable('grabprog3', files('subprojects/prog.c')) executable('grabprog4', files('subprojects/foo/prog2.c')) texe = executable('testexe', files('test.c'), link_with: [libfoo, libbar]) test('t1', texe) muon-v0.4.0/subprojects/meson-tests/common/147 simd/0002755000175000017500000000000014751453622021216 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/147 simd/simdfuncs.h0000644000175000017500000000237714751453622023371 0ustar buildbuild#pragma once #include #ifdef _MSC_VER #define ALIGN_16 __declspec(align(16)) #else #include #define ALIGN_16 alignas(16) #endif /* Yes, I do know that arr[4] decays into a pointer * as a function argument. Don't do this in real code * but for this test it is ok. */ void increment_fallback(float arr[4]); #if HAVE_MMX int mmx_available(void); void increment_mmx(float arr[4]); #endif #if HAVE_SSE int sse_available(void); void increment_sse(float arr[4]); #endif #if HAVE_SSE2 int sse2_available(void); void increment_sse2(float arr[4]); #endif #if HAVE_SSE3 int sse3_available(void); void increment_sse3(float arr[4]); #endif #if HAVE_SSSE3 int ssse3_available(void); void increment_ssse3(float arr[4]); #endif #if HAVE_SSE41 int sse41_available(void); void increment_sse41(float arr[4]); #endif #if HAVE_SSE42 int sse42_available(void); void increment_sse42(float arr[4]); #endif #if HAVE_AVX int avx_available(void); void increment_avx(float arr[4]); #endif #if HAVE_AVX2 int avx2_available(void); void increment_avx2(float arr[4]); #endif #if HAVE_NEON int neon_available(void); void increment_neon(float arr[4]); #endif #if HAVE_ALTIVEC int altivec_available(void); void increment_altivec(float arr[4]); #endif /* And so on. */ muon-v0.4.0/subprojects/meson-tests/common/147 simd/simd_sse.c0000644000175000017500000000101114751453622023157 0ustar buildbuild#include #include #ifdef _MSC_VER #include int sse_available(void) { return 1; } #else #include #include #include #if defined(__APPLE__) int sse_available(void) { return 1; } #else int sse_available(void) { return __builtin_cpu_supports("sse"); } #endif #endif void increment_sse(float arr[4]) { __m128 val = _mm_load_ps(arr); __m128 one = _mm_set_ps1(1.0); __m128 result = _mm_add_ps(val, one); _mm_storeu_ps(arr, result); } muon-v0.4.0/subprojects/meson-tests/common/147 simd/simd_mmx.c0000644000175000017500000000277614751453622023211 0ustar buildbuild#include #include #include #ifdef _MSC_VER #include int mmx_available(void) { return 1; } /* Contrary to MSDN documentation, MMX intrinsics * just plain don't work. */ void increment_mmx(float arr[4]) { arr[0]++; arr[1]++; arr[2]++; arr[3]++; } #elif defined(__MINGW32__) int mmx_available(void) { return 1; } /* MinGW does not seem to ship with MMX or it is broken. */ void increment_mmx(float arr[4]) { arr[0]++; arr[1]++; arr[2]++; arr[3]++; } #else #include #include #if defined(__APPLE__) int mmx_available(void) { return 1; } #else int mmx_available(void) { return __builtin_cpu_supports("mmx"); } #endif void increment_mmx(float arr[4]) { /* Super ugly but we know that values in arr are always small * enough to fit in int16; */ int i; /* This is unused due to below comment about GCC 8. __m64 packed = _mm_set_pi16(arr[3], arr[2], arr[1], arr[0]); __m64 incr = _mm_set1_pi16(1); __m64 result = _mm_add_pi16(packed, incr); int64_t unpacker = (int64_t)(result); */ /* The above should be * int64_t unpacker = _m_to_int64(result); * but it does not exist on 32 bit platforms for some reason. */ _mm_empty(); for(i=0; i<4; i++) { /* This fails on GCC 8 when optimizations are enabled. * Disable it. Patches welcome to fix this. arr[i] = (float)(unpacker & ((1<<16)-1)); unpacker >>= 16; */ arr[i] += 1.0f; } } #endif muon-v0.4.0/subprojects/meson-tests/common/147 simd/meson.build0000644000175000017500000000231114751453622023353 0ustar buildbuildproject('simd', 'c') simd = import('unstable-simd') cc = meson.get_compiler('c') cdata = configuration_data() if not meson.is_cross_build() and host_machine.cpu_family() == 'arm' and cc.get_id() == 'clang' message( 'Adding -march=armv7 because assuming that this build happens on Raspbian.', ) message( 'Its Clang seems to be misconfigured and does not support NEON by default.', ) add_project_arguments('-march=armv7', language: 'c') endif if cc.get_id() == 'msvc' and cc.version().version_compare('<17') error('MESON_SKIP_TEST VS2010 produces broken binaries on x86.') endif # FIXME add [a, b] = function() rval = simd.check( 'mysimds', mmx: 'simd_mmx.c', sse: 'simd_sse.c', sse2: 'simd_sse2.c', sse3: 'simd_sse3.c', ssse3: 'simd_ssse3.c', sse41: 'simd_sse41.c', sse42: 'simd_sse42.c', avx: 'simd_avx.c', avx2: 'simd_avx2.c', neon: 'simd_neon.c', compiler: cc, include_directories: include_directories('include'), ) simdlibs = rval[0] cdata.merge_from(rval[1]) configure_file(output: 'simdconfig.h', configuration: cdata) p = executable('simdtest', 'simdchecker.c', 'fallback.c', link_with: simdlibs) test('simdtest', p) muon-v0.4.0/subprojects/meson-tests/common/147 simd/simdchecker.c0000644000175000017500000000663414751453622023652 0ustar buildbuild#include #include #include typedef void (*simd_func)(float*); int check_simd_implementation(float *four, const float *four_initial, const char *simd_type, const float *expected, simd_func fptr, const int blocksize) { int rv = 0; memcpy(four, four_initial, blocksize*sizeof(float)); printf("Using %s.\n", simd_type); fptr(four); for(int i=0; i #include #include #include #ifdef _MSC_VER #include int ssse3_available(void) { return 1; } #else #include #include int ssse3_available(void) { #ifdef __APPLE__ return 1; #elif defined(__clang__) /* https://github.com/numpy/numpy/issues/8130 */ return __builtin_cpu_supports("sse4.1"); #else return __builtin_cpu_supports("ssse3"); #endif } #endif void increment_ssse3(float arr[4]) { ALIGN_16 double darr[4]; __m128d val1 = _mm_set_pd(arr[0], arr[1]); __m128d val2 = _mm_set_pd(arr[2], arr[3]); __m128d one = _mm_set_pd(1.0, 1.0); __m128d result = _mm_add_pd(val1, one); __m128i tmp1, tmp2; tmp1 = tmp2 = _mm_set1_epi16(0); _mm_store_pd(darr, result); result = _mm_add_pd(val2, one); _mm_store_pd(&darr[2], result); tmp1 = _mm_hadd_epi32(tmp1, tmp2); /* This does nothing. Only here so we use an SSSE3 instruction. */ arr[0] = (float)darr[1]; arr[1] = (float)darr[0]; arr[2] = (float)darr[3]; arr[3] = (float)darr[2]; } muon-v0.4.0/subprojects/meson-tests/common/147 simd/fallback.c0000644000175000017500000000017514751453622023122 0ustar buildbuild#include void increment_fallback(float arr[4]) { int i; for(i=0; i<4; i++) { arr[i]++; } } muon-v0.4.0/subprojects/meson-tests/common/147 simd/simd_sse41.c0000644000175000017500000000160714751453622023337 0ustar buildbuild#include #include #include #ifdef _MSC_VER #include int sse41_available(void) { return 1; } #else #include #include #if defined(__APPLE__) int sse41_available(void) { return 1; } #else int sse41_available(void) { return __builtin_cpu_supports("sse4.1"); } #endif #endif void increment_sse41(float arr[4]) { ALIGN_16 double darr[4]; __m128d val1 = _mm_set_pd(arr[0], arr[1]); __m128d val2 = _mm_set_pd(arr[2], arr[3]); __m128d one = _mm_set_pd(1.0, 1.0); __m128d result = _mm_add_pd(val1, one); result = _mm_ceil_pd(result); /* A no-op, only here to use a SSE4.1 intrinsic. */ _mm_store_pd(darr, result); result = _mm_add_pd(val2, one); _mm_store_pd(&darr[2], result); arr[0] = (float)darr[1]; arr[1] = (float)darr[0]; arr[2] = (float)darr[3]; arr[3] = (float)darr[2]; } muon-v0.4.0/subprojects/meson-tests/common/147 simd/simd_neon.c0000644000175000017500000000067514751453622023343 0ustar buildbuild#include #include #include #include int neon_available(void) { return 1; /* Incorrect, but I don't know how to check this properly. */ } void increment_neon(float arr[4]) { float32x2_t a1, a2, one; a1 = vld1_f32(arr); a2 = vld1_f32(&arr[2]); one = vdup_n_f32(1.0); a1 = vadd_f32(a1, one); a2 = vadd_f32(a2, one); vst1_f32(arr, a1); vst1_f32(&arr[2], a2); } muon-v0.4.0/subprojects/meson-tests/common/147 simd/include/0002755000175000017500000000000014751453622022641 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/147 simd/include/simdheader.h0000644000175000017500000000004514751453622025114 0ustar buildbuild#pragma once #define I_CAN_HAZ_SIMD muon-v0.4.0/subprojects/meson-tests/common/147 simd/simd_sse42.c0000644000175000017500000000160214751453622023333 0ustar buildbuild#include #include #include #ifdef _MSC_VER #include int sse42_available(void) { return 1; } #else #include #include #ifdef __APPLE__ int sse42_available(void) { return 1; } #else int sse42_available(void) { return __builtin_cpu_supports("sse4.2"); } #endif #endif void increment_sse42(float arr[4]) { ALIGN_16 double darr[4]; __m128d val1 = _mm_set_pd(arr[0], arr[1]); __m128d val2 = _mm_set_pd(arr[2], arr[3]); __m128d one = _mm_set_pd(1.0, 1.0); __m128d result = _mm_add_pd(val1, one); _mm_store_pd(darr, result); result = _mm_add_pd(val2, one); _mm_store_pd(&darr[2], result); _mm_crc32_u32(42, 99); /* A no-op, only here to use an SSE4.2 instruction. */ arr[0] = (float)darr[1]; arr[1] = (float)darr[0]; arr[2] = (float)darr[3]; arr[3] = (float)darr[2]; } muon-v0.4.0/subprojects/meson-tests/common/147 simd/simd_avx2.c0000644000175000017500000000160714751453622023260 0ustar buildbuild#include #include #include /* * FIXME add proper runtime detection for VS. */ #ifdef _MSC_VER #include int avx2_available(void) { return 0; } #else #include #include #if defined(__APPLE__) int avx2_available(void) { return 0; } #else int avx2_available(void) { return __builtin_cpu_supports("avx2"); } #endif #endif void increment_avx2(float arr[4]) { double darr[4]; darr[0] = arr[0]; darr[1] = arr[1]; darr[2] = arr[2]; darr[3] = arr[3]; __m256d val = _mm256_loadu_pd(darr); __m256d one = _mm256_set1_pd(1.0); __m256d result = _mm256_add_pd(val, one); _mm256_storeu_pd(darr, result); one = _mm256_permute4x64_pd(one, 66); /* A no-op, just here to use AVX2. */ arr[0] = (float)darr[0]; arr[1] = (float)darr[1]; arr[2] = (float)darr[2]; arr[3] = (float)darr[3]; } muon-v0.4.0/subprojects/meson-tests/common/147 simd/simd_avx.c0000644000175000017500000000176614751453622023204 0ustar buildbuild#include #ifndef I_CAN_HAZ_SIMD #error The correct internal header was not used #endif #include #include #include #ifdef _MSC_VER #include int avx_available(void) { return 1; } #else #include #include #ifdef __APPLE__ /* * Apple ships a broken __builtin_cpu_supports and * some machines in the CI farm seem to be too * old to have AVX so just always return 0 here. */ int avx_available(void) { return 0; } #else int avx_available(void) { return __builtin_cpu_supports("avx"); } #endif #endif void increment_avx(float arr[4]) { double darr[4]; darr[0] = arr[0]; darr[1] = arr[1]; darr[2] = arr[2]; darr[3] = arr[3]; __m256d val = _mm256_loadu_pd(darr); __m256d one = _mm256_set1_pd(1.0); __m256d result = _mm256_add_pd(val, one); _mm256_storeu_pd(darr, result); arr[0] = (float)darr[0]; arr[1] = (float)darr[1]; arr[2] = (float)darr[2]; arr[3] = (float)darr[3]; } muon-v0.4.0/subprojects/meson-tests/common/147 simd/simd_sse3.c0000644000175000017500000000162314751453622023253 0ustar buildbuild#include #include #ifdef _MSC_VER #include int sse3_available(void) { return 1; } #else #include #include #include #if defined(__APPLE__) int sse3_available(void) { return 1; } #else int sse3_available(void) { return __builtin_cpu_supports("sse3"); } #endif #endif void increment_sse3(float arr[4]) { ALIGN_16 double darr[4]; __m128d val1 = _mm_set_pd(arr[0], arr[1]); __m128d val2 = _mm_set_pd(arr[2], arr[3]); __m128d one = _mm_set_pd(1.0, 1.0); __m128d result = _mm_add_pd(val1, one); _mm_store_pd(darr, result); result = _mm_add_pd(val2, one); _mm_store_pd(&darr[2], result); result = _mm_hadd_pd(val1, val2); /* This does nothing. Only here so we use an SSE3 instruction. */ arr[0] = (float)darr[1]; arr[1] = (float)darr[0]; arr[2] = (float)darr[3]; arr[3] = (float)darr[2]; } muon-v0.4.0/subprojects/meson-tests/common/147 simd/simd_sse2.c0000644000175000017500000000142614751453622023253 0ustar buildbuild#include #include #include #ifdef _MSC_VER int sse2_available(void) { return 1; } #else #include #include #if defined(__APPLE__) int sse2_available(void) { return 1; } #else int sse2_available(void) { return __builtin_cpu_supports("sse2"); } #endif #endif void increment_sse2(float arr[4]) { ALIGN_16 double darr[4]; __m128d val1 = _mm_set_pd(arr[0], arr[1]); __m128d val2 = _mm_set_pd(arr[2], arr[3]); __m128d one = _mm_set_pd(1.0, 1.0); __m128d result = _mm_add_pd(val1, one); _mm_store_pd(darr, result); result = _mm_add_pd(val2, one); _mm_store_pd(&darr[2], result); arr[0] = (float)darr[1]; arr[1] = (float)darr[0]; arr[2] = (float)darr[3]; arr[3] = (float)darr[2]; } muon-v0.4.0/subprojects/meson-tests/common/117 shared module/0002755000175000017500000000000014751453622022773 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/117 shared module/meson.build0000644000175000017500000000251314751453622025134 0ustar buildbuildproject('shared module', 'c') c = meson.get_compiler('c') # Windows UWP doesn't support the ToolHelp API we use in this test to emulate # runtime symbol resolution. if host_machine.system() == 'windows' if not c.compiles( ''' #include #include HANDLE func(void) { return CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 0); } ''', ) error('MESON_SKIP_TEST Windows UWP does not support this test.') endif endif dl = c.find_library('dl', required: false) l = shared_library('runtime', 'runtime.c') # Do NOT link the module with the runtime library. This # is a common approach for plugins that are only used # with dlopen. Any symbols are resolved dynamically # at runtime. This requires extra help on Windows, so # should be avoided unless really necessary. m = shared_module('mymodule', 'module.c') e = executable('prog', 'prog.c', link_with: l, export_dynamic: true, dependencies: dl) test('import test', e, args: m) # Same as above, but module created with build_target() m2 = build_target('mymodule2', 'module.c', target_type: 'shared_module') test('import test 2', e, args: m2) # Shared module that does not export any symbols shared_module( 'nosyms', 'nosyms.c', override_options: ['werror=false'], install: true, install_dir: join_paths(get_option('libdir'), 'modules'), ) muon-v0.4.0/subprojects/meson-tests/common/117 shared module/test.json0000644000175000017500000000031714751453622024644 0ustar buildbuild{ "installed": [ {"type": "expr", "file": "usr/lib/modules/libnosyms?so"}, {"type": "implibempty", "file": "usr/lib/modules/libnosyms"}, {"type": "pdb", "file": "usr/lib/modules/nosyms"} ] } muon-v0.4.0/subprojects/meson-tests/common/117 shared module/module.c0000644000175000017500000000454414751453622024431 0ustar buildbuild#if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllexport) #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif #if defined(_WIN32) || defined(__CYGWIN__) #include typedef int (*fptr) (void); #ifdef __CYGWIN__ #include fptr find_any_f (const char *name) { return (fptr) dlsym(RTLD_DEFAULT, name); } #else /* _WIN32 */ #include #include static wchar_t* win32_get_last_error (void) { wchar_t *msg = NULL; FormatMessageW (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError (), 0, (LPWSTR) &msg, 0, NULL); return msg; } /* Unlike Linux and OS X, when a library is loaded, all the symbols aren't * loaded into a single namespace. You must fetch the symbol by iterating over * all loaded modules. Code for finding the function from any of the loaded * modules is taken from gmodule.c in glib */ fptr find_any_f (const char *name) { fptr f; HANDLE snapshot; MODULEENTRY32 me32; snapshot = CreateToolhelp32Snapshot (TH32CS_SNAPMODULE, 0); if (snapshot == (HANDLE) -1) { wchar_t *msg = win32_get_last_error(); printf("Could not get snapshot: %S\n", msg); return 0; } me32.dwSize = sizeof (me32); f = NULL; if (Module32First (snapshot, &me32)) { do { if ((f = (fptr) GetProcAddress (me32.hModule, name)) != NULL) break; } while (Module32Next (snapshot, &me32)); } CloseHandle (snapshot); return f; } #endif int DLL_PUBLIC func(void) { fptr f; f = find_any_f ("func_from_language_runtime"); if (f != NULL) return f(); printf ("Could not find function\n"); return 1; } #else /* * Shared modules often have references to symbols that are not defined * at link time, but which will be provided from deps of the executable that * dlopens it. We need to make sure that this works, i.e. that we do * not pass -Wl,--no-undefined when linking modules. */ int func_from_language_runtime(void); int DLL_PUBLIC func(void) { return func_from_language_runtime(); } #endif muon-v0.4.0/subprojects/meson-tests/common/117 shared module/nosyms.c0000644000175000017500000000006714751453622024470 0ustar buildbuildstatic int func_not_exported (void) { return 99; } muon-v0.4.0/subprojects/meson-tests/common/117 shared module/runtime.c0000644000175000017500000000070314751453622024620 0ustar buildbuild#if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllexport) #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif /* * This file pretends to be a language runtime that supports extension * modules. */ int DLL_PUBLIC func_from_language_runtime(void) { return 86; } muon-v0.4.0/subprojects/meson-tests/common/117 shared module/prog.c0000644000175000017500000000410214751453622024101 0ustar buildbuild #include int func_from_language_runtime(void); typedef int (*fptr) (void); #ifdef _WIN32 #include static wchar_t* win32_get_last_error (void) { wchar_t *msg = NULL; FormatMessageW (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError (), 0, (LPWSTR) &msg, 0, NULL); return msg; } int main(int argc, char **argv) { HINSTANCE handle; fptr importedfunc; int expected, actual; int ret = 1; if(argc==0) {}; handle = LoadLibraryA (argv[1]); if (!handle) { wchar_t *msg = win32_get_last_error (); printf ("Could not open %s: %S\n", argv[1], msg); goto nohandle; } importedfunc = (fptr) GetProcAddress (handle, "func"); if (importedfunc == NULL) { wchar_t *msg = win32_get_last_error (); printf ("Could not find 'func': %S\n", msg); goto out; } actual = importedfunc (); expected = func_from_language_runtime (); if (actual != expected) { printf ("Got %i instead of %i\n", actual, expected); goto out; } ret = 0; out: FreeLibrary (handle); nohandle: return ret; } #else #include #include int main(int argc, char **argv) { void *dl; fptr importedfunc; int expected, actual; char *error; int ret = 1; if(argc==0) {}; dlerror(); dl = dlopen(argv[1], RTLD_LAZY); error = dlerror(); if(error) { printf("Could not open %s: %s\n", argv[1], error); goto nodl; } importedfunc = (fptr) dlsym(dl, "func"); if (importedfunc == NULL) { printf ("Could not find 'func'\n"); goto out; } assert(importedfunc != func_from_language_runtime); actual = (*importedfunc)(); expected = func_from_language_runtime (); if (actual != expected) { printf ("Got %i instead of %i\n", actual, expected); goto out; } ret = 0; out: dlclose(dl); nodl: return ret; } #endif muon-v0.4.0/subprojects/meson-tests/common/199 argument syntax/0002755000175000017500000000000014751453622023422 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/199 argument syntax/meson.build0000644000175000017500000000077714751453622025575 0ustar buildbuildproject( 'argument syntax', ['c'], ) cc = meson.get_compiler('c') if ['gcc', 'lcc', 'clang', 'intel'].contains(cc.get_id()) expected = 'gcc' elif ['msvc', 'clang-cl', 'intel-cl'].contains(cc.get_id()) expected = 'msvc' else # It's possible that other compilers end up here that shouldn't expected = 'other' endif assert( cc.get_argument_syntax() == expected, 'Wrong output for compiler @0@. expected @1@ but got @2@'.format(cc.get_id(), expected, cc.get_argument_syntax()), ) muon-v0.4.0/subprojects/meson-tests/common/263 internal dependency includes in checks/0002755000175000017500000000000014751453622027573 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/263 internal dependency includes in checks/meson.build0000644000175000017500000000032714751453622031735 0ustar buildbuildproject('test 262', 'c') cc = meson.get_compiler('c') internal_dep = declare_dependency(include_directories: 'include') assert( cc.has_header_symbol('test_262_header.h', 'foo', dependencies: internal_dep), ) muon-v0.4.0/subprojects/meson-tests/common/263 internal dependency includes in checks/include/0002755000175000017500000000000014751453622031216 5ustar buildbuild././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/263 internal dependency includes in checks/include/test_262_header.hmuon-v0.4.0/subprojects/meson-tests/common/263 internal dependency includes in checks/include/test_20000644000175000017500000000001714751453622032335 0ustar buildbuildint foo(void); muon-v0.4.0/subprojects/meson-tests/common/17 array/0002755000175000017500000000000014751453622021314 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/17 array/func.c0000644000175000017500000000003514751453622022407 0ustar buildbuildint func(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/17 array/meson.build0000644000175000017500000000016514751453622023456 0ustar buildbuildproject('array test', 'c') arr = ['func.c', 'prog.c'] exe = executable('prog', sources: arr) test('arr test', exe) muon-v0.4.0/subprojects/meson-tests/common/17 array/prog.c0000644000175000017500000000007214751453622022424 0ustar buildbuildextern int func(void); int main(void) { return func(); } muon-v0.4.0/subprojects/meson-tests/common/250 system include dir/0002755000175000017500000000000014751453622023744 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/250 system include dir/main.cpp0000644000175000017500000000005514751453622025372 0ustar buildbuild#include int main() { return 0; } muon-v0.4.0/subprojects/meson-tests/common/250 system include dir/meson.build0000644000175000017500000000117314751453622026106 0ustar buildbuildproject( 'system_include_dir', 'cpp', version: '0.1', default_options: 'werror=true', ) compiler_id = meson.get_compiler('cpp').get_id() if not ['gcc', 'clang', 'clang-cl'].contains(compiler_id) error( 'MESON_SKIP_TEST: compiler @0@ either doesn\'t support is_system includes or needs to have support for this test added'.format(compiler_id), ) endif lib_include_directories = include_directories('lib', is_system: true) add_project_arguments('-Wsign-conversion', language: 'cpp') executable( 'system_include_dir_test', sources: 'main.cpp', include_directories: lib_include_directories, ) muon-v0.4.0/subprojects/meson-tests/common/250 system include dir/lib/0002755000175000017500000000000014751453622024512 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/250 system include dir/lib/lib.hpp0000644000175000017500000000015614751453622025771 0ustar buildbuild#pragma once // This will trigger -Wsign-conversion inline unsigned convert_to_unsigned(int i) { return i; } muon-v0.4.0/subprojects/meson-tests/common/97 find program path/0002755000175000017500000000000014751453622023473 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/97 find program path/program.py0000755000175000017500000000004714751453622025516 0ustar buildbuild#!/usr/bin/env python3 print("Found") muon-v0.4.0/subprojects/meson-tests/common/97 find program path/meson.build0000644000175000017500000000154714751453622025642 0ustar buildbuildproject('find program') python = import('python3').find_python() # Source file via string prog = find_program('program.py') # Source file via files() progf = files('program.py') # Built file py = configure_file( input: 'program.py', output: 'builtprogram.py', configuration: configuration_data(), ) foreach f : [prog, progf, py, find_program(py), find_program(progf)] ret = run_command(python, f, check: false) assert(ret.returncode() == 0, 'can\'t manually run @0@'.format(prog.path())) assert( ret.stdout().strip() == 'Found', 'wrong output from manually-run @0@'.format(prog.path()), ) ret = run_command(f, check: false) assert(ret.returncode() == 0, 'can\'t run @0@'.format(prog.path())) assert( ret.stdout().strip() == 'Found', 'wrong output from @0@'.format(prog.path()), ) endforeach muon-v0.4.0/subprojects/meson-tests/common/253 subproject dependency variables/0002755000175000017500000000000014751453622026470 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/253 subproject dependency variables/subprojects/0002755000175000017500000000000014751453622031033 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/253 subproject dependency variables/subprojects/subfiles/0002755000175000017500000000000014751453622032647 5ustar buildbuild././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/253 subproject dependency variables/subprojects/subfiles/subdir/muon-v0.4.0/subprojects/meson-tests/common/253 subproject dependency variables/subprojects/subfiles/0002755000175000017500000000000014751453622032647 5ustar buildbuild././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/253 subproject dependency variables/subprojects/subfiles/subdir/foo.cmuon-v0.4.0/subprojects/meson-tests/common/253 subproject dependency variables/subprojects/subfiles/0000644000175000017500000000003514751453622032645 0ustar buildbuildint main(void) { return 0; } ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/253 subproject dependency variables/subprojects/subfiles/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/253 subproject dependency variables/subprojects/subfiles/0000644000175000017500000000176314751453622032656 0ustar buildbuildproject('dependency variable resource') files_dep = declare_dependency( variables: [ 'pkgdatadir=@0@/subdir'.format(meson.current_source_dir()), 'pkgdatadir2=@0@/subdir2'.format(meson.current_source_dir()), 'pkgdatadir3=@0@'.format(meson.current_source_dir()), ], ) install_data('subdir/foo.c', install_dir: get_option('datadir') / 'subdir') install_subdir('subdir2', install_dir: get_option('datadir')) install_data('foo.c', install_dir: get_option('datadir')) import('pkgconfig').generate( name: 'depvar_resource', description: 'Get a resource file from pkgconfig or a subproject', version: '0.1', variables: [ 'pkgdatadir=${datadir}/subdir', 'pkgdatadir2=${datadir}/subdir2', ], uninstalled_variables: [ 'pkgdatadir=@0@/subdir'.format(meson.current_source_dir()), 'pkgdatadir2=@0@/subdir2'.format(meson.current_source_dir()), 'pkgdatadir3=@0@'.format(meson.current_source_dir()), ], dataonly: true, ) ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/253 subproject dependency variables/subprojects/subfiles/foo.cmuon-v0.4.0/subprojects/meson-tests/common/253 subproject dependency variables/subprojects/subfiles/0000644000175000017500000000003514751453622032645 0ustar buildbuildint main(void) { return 0; } ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/253 subproject dependency variables/subprojects/subfiles/subdir2/muon-v0.4.0/subprojects/meson-tests/common/253 subproject dependency variables/subprojects/subfiles/0002755000175000017500000000000014751453622032647 5ustar buildbuild././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/253 subproject dependency variables/subprojects/subfiles/subdir2/foo.cmuon-v0.4.0/subprojects/meson-tests/common/253 subproject dependency variables/subprojects/subfiles/0000644000175000017500000000003514751453622032645 0ustar buildbuildint main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/253 subproject dependency variables/meson.build0000644000175000017500000000052414751453622030631 0ustar buildbuildproject('subproject dependency variables', 'c') subfiles_dep = subproject('subfiles').get_variable('files_dep') executable('foo', join_paths(subfiles_dep.get_variable('pkgdatadir'), 'foo.c')) executable('foo2', subfiles_dep.get_variable('pkgdatadir2') / 'foo.c') executable('foor32', subfiles_dep.get_variable('pkgdatadir3') / 'foo.c') muon-v0.4.0/subprojects/meson-tests/common/253 subproject dependency variables/test.json0000644000175000017500000000041614751453622030341 0ustar buildbuild{ "installed": [ { "type": "file", "file": "usr/share/pkgconfig/depvar_resource.pc" }, { "type": "file", "file": "usr/share/foo.c" }, { "type": "file", "file": "usr/share/subdir/foo.c" }, { "type": "file", "file": "usr/share/subdir2/foo.c" } ] } muon-v0.4.0/subprojects/meson-tests/common/96 stringdef/0002755000175000017500000000000014751453622022172 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/96 stringdef/stringdef.c0000644000175000017500000000025314751453622024321 0ustar buildbuild#include #include int main(void) { if(strcmp(FOO, "bar")) { printf("FOO is misquoted: %s\n", FOO); return 1; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/96 stringdef/meson.build0000644000175000017500000000015414751453622024332 0ustar buildbuildproject('stringdef', 'c') test('stringdef', executable('stringdef', 'stringdef.c', c_args: '-DFOO="bar"')) muon-v0.4.0/subprojects/meson-tests/common/260 declare_dependency objects/0002755000175000017500000000000014751453622025465 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/260 declare_dependency objects/bar.c0000644000175000017500000000002214751453622026365 0ustar buildbuildvoid bar(void) {} muon-v0.4.0/subprojects/meson-tests/common/260 declare_dependency objects/meson.build0000644000175000017500000000223714751453622027631 0ustar buildbuild# Test that declare_dependency(objects: ...) fixes issues with duplicated # objects in the final link line, thanks to deduplication of dependencies. # The commented declare_dependency() invocation using link_whole instead # fails thusly: # # ar csrDT libbar.a libfoo.a.p/foo.c.o libbar.a.p/bar.c.o # ar csrDT libfoo.a libfoo.a.p/foo.c.o # cc -o prog prog.p/prog.c.o -Wl,--as-needed -Wl,--no-undefined -Wl,--whole-archive -Wl,--start-group libfoo.a libbar.a -Wl,--end-group -Wl,--no-whole-archive # /usr/bin/ld: libfoo.a.p/foo.c.o: in function `foo': # ../foo.c:3: multiple definition of `foo'; libfoo.a.p/foo.c.o:../foo.c:3: first defined here project('Transitive declare_dependency(objects)', 'c') libfoo = static_library('foo', 'foo.c') #foo = declare_dependency(link_whole: libfoo) foo = declare_dependency(objects: libfoo.extract_all_objects(recursive: true)) libbar = static_library('bar', 'bar.c', dependencies: foo) #bar = declare_dependency(link_whole: libbar, dependencies: foo) bar = declare_dependency(objects: libbar.extract_all_objects(recursive: true), dependencies: foo) executable('prog', sources: files('prog.c'), dependencies: [foo, bar]) muon-v0.4.0/subprojects/meson-tests/common/260 declare_dependency objects/foo.c0000644000175000017500000000006214751453622026410 0ustar buildbuildextern void bar(void); void foo(void) { bar(); } muon-v0.4.0/subprojects/meson-tests/common/260 declare_dependency objects/prog.c0000644000175000017500000000006214751453622026574 0ustar buildbuildextern void foo(void); int main(void) { foo(); } muon-v0.4.0/subprojects/meson-tests/common/129 build by default/0002755000175000017500000000000014751453622023361 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/129 build by default/source.txt0000644000175000017500000000002614751453622025416 0ustar buildbuildI am a bunch of text. muon-v0.4.0/subprojects/meson-tests/common/129 build by default/mygen.py0000644000175000017500000000017014751453622025046 0ustar buildbuild#!/usr/bin/env python3 import sys ifile = open(sys.argv[1]) ofile = open(sys.argv[2], 'w') ofile.write(ifile.read()) muon-v0.4.0/subprojects/meson-tests/common/129 build by default/meson.build0000644000175000017500000000217114751453622025522 0ustar buildbuildproject('build on all', 'c') py3_mod = import('python3') py3 = py3_mod.find_python() executable( 'fooprog', 'foo.c', build_by_default: false, ) executable( 'barprog', 'foo.c', build_by_default: false, ) comp = files('mygen.py') checkexists = files('checkexists.py') mytarget = custom_target( 'gendat1', output: 'generated1.dat', input: 'source.txt', command: [py3] + comp + ['@INPUT@', '@OUTPUT@'], build_by_default: true, ) mytarget = custom_target( 'gendat2', output: 'generated2.dat', input: 'source.txt', command: [py3] + comp + ['@INPUT@', '@OUTPUT@'], build_by_default: true, build_always: false, ) ct1_output = join_paths(meson.build_root(), 'generated1.dat') ct2_output = join_paths(meson.build_root(), 'generated2.dat') exe1_output = join_paths(meson.build_root(), 'fooprog') exe2_output = join_paths(meson.build_root(), 'barprog') if host_machine.system() == 'windows' exe1_output += '.exe' exe2_output += '.exe' endif test( 'check-build-by-default', py3, args: [checkexists, ct1_output, ct2_output, '--not', exe1_output, exe2_output], ) muon-v0.4.0/subprojects/meson-tests/common/129 build by default/checkexists.py0000644000175000017500000000030414751453622026243 0ustar buildbuild#!/usr/bin/env python3 import os.path, sys invert = False for path in sys.argv[1:]: if path == '--not': invert = True elif not os.path.exists(path) ^ invert: sys.exit(1) muon-v0.4.0/subprojects/meson-tests/common/129 build by default/foo.c0000644000175000017500000000012514751453622024304 0ustar buildbuild#include int main(void) { printf("Existentialism.\n"); return 0; } muon-v0.4.0/subprojects/meson-tests/common/43 subproject options/0002755000175000017500000000000014751453622024031 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/43 subproject options/subprojects/0002755000175000017500000000000014751453622026374 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/43 subproject options/subprojects/subproject/0002755000175000017500000000000014751453622030554 5ustar buildbuild././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/43 subproject options/subprojects/subproject/meson_options.txtmuon-v0.4.0/subprojects/meson-tests/common/43 subproject options/subprojects/subproject/meson_option0000644000175000017500000000011714751453622033205 0ustar buildbuildoption('opt', type: 'boolean', value: false, description: 'subproject option') muon-v0.4.0/subprojects/meson-tests/common/43 subproject options/subprojects/subproject/meson.build0000644000175000017500000000014314751453622032712 0ustar buildbuildproject('subproject') if get_option('opt') error('option set when it should be unset.') endif muon-v0.4.0/subprojects/meson-tests/common/43 subproject options/meson_options.txt0000644000175000017500000000012014751453622027455 0ustar buildbuildoption('opt', type: 'boolean', value: true, description: 'main project option') muon-v0.4.0/subprojects/meson-tests/common/43 subproject options/meson.build0000644000175000017500000000020014751453622026161 0ustar buildbuildproject('suboptions') subproject('subproject') if not get_option('opt') error('option unset when it should be set') endif muon-v0.4.0/subprojects/meson-tests/common/51 run target/0002755000175000017500000000000014751453622022247 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/51 run target/helloprinter.c0000644000175000017500000000034014751453622025115 0ustar buildbuild#include int main(int argc, char **argv) { if(argc != 2) { printf("I can not haz argument.\n"); return 1; } else { printf("I can haz argument: %s\n", argv[1]); } return 0; } muon-v0.4.0/subprojects/meson-tests/common/51 run target/configure.in0000755000175000017500000000005014751453622024554 0ustar buildbuild#!/usr/bin/env python3 print('Success')muon-v0.4.0/subprojects/meson-tests/common/51 run target/subdir/0002755000175000017500000000000014751453622023537 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/51 run target/subdir/textprinter.py0000644000175000017500000000007314751453622026477 0ustar buildbuild#!/usr/bin/env python3 print('I am a script. Being run.') muon-v0.4.0/subprojects/meson-tests/common/51 run target/check_exists.py0000755000175000017500000000022014751453622025270 0ustar buildbuild#!/usr/bin/env python3 import os import sys if not os.path.isfile(sys.argv[1]): raise Exception("Couldn't find {!r}".format(sys.argv[1])) muon-v0.4.0/subprojects/meson-tests/common/51 run target/.clang-tidy0000644000175000017500000000000014751453622024267 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/51 run target/meson.build0000644000175000017500000001013514751453622024407 0ustar buildbuildproject('run target', 'c') tests = [] # Make it possible to run built programs. # In cross builds exe_wrapper should be added if it exists. exe = executable('helloprinter', 'helloprinter.c') if not meson.is_cross_build() or meson.can_run_host_binaries() run_target('runhello', command: [exe, 'argument']) endif converter = find_program('converter.py') hex = custom_target( 'exe.hex', input: exe, output: 'exe.hex', command: [ converter, '@INPUT@', '@OUTPUT@', ], ) fakeburner = find_program('fakeburner.py') # These emulates the Arduino flasher application. It sandwiches the filename inside # a packed argument. Thus we need to declare it manually. run_target( 'upload', command: [fakeburner, 'x:@0@:y'.format(exe.full_path())], depends: exe, ) tests += 'upload' run_target( 'upload2', command: [fakeburner, 'x:@0@:y'.format(hex.full_path())], depends: hex, ) tests += 'upload2' run_target( 'upload3', command: [fakeburner, 'x:@0@:y'.format(hex.full_path())], depends: hex[0], ) tests += 'upload3' python3 = find_program('python3', required: false) if not python3.found() python3 = find_program('python') endif run_target('py3hi', command: [python3, '-c', 'print("I am Python3.")']) tests += 'py3hi' run_target( 'check_exists', command: [find_program('check_exists.py'), files('helloprinter.c')], ) tests += 'check_exists' run_target( 'check_exists', command: [find_program('check_exists.py'), files('helloprinter.c')], depends: disabler(), ) run_target('check_exists', command: [disabler(), files('helloprinter.c')]) # What if the output of a custom_target is the command to # execute. Obviously this will not work as hex is not an # executable but test that the output is generated correctly. run_target('donotrunme', command: hex) # Ensure configure files can be passed conf = configure_file( input: 'configure.in', output: 'configure', configuration: configuration_data(), ) run_target('configure_script', command: conf) # tests += 'configure_script' custom_target('configure_script_ct', command: conf, output: 'dummy.txt', capture: true) # Target names that clash with potential builtin functionality. run_target('ctags', command: converter) # tests += 'ctags' clangf = run_target( 'clang-format', command: [ converter, files('.clang-format'), meson.current_build_dir() / 'clang-format', ], ) custom_target( 'clang-tidy', input: '.clang-tidy', output: 'clang-tidy', command: [converter, '@INPUT@', '@OUTPUT@'], ) alias_target('clang-format-check', clangf) # tests += 'clang-format' # Check we can pass env to the program. Also check some string substitutions # that were added in 0.57.0 but not documented. This is documented behaviour # since 0.57.1. run_target( 'check-env', command: [ find_program('check-env.py'), '@SOURCE_ROOT@', '@BUILD_ROOT@', '@CURRENT_SOURCE_DIR@', ], env: {'MY_ENV': '1'}, ) tests += 'check-env' # Check some string substitutions that has always been done but never documented. # Some projects have been relying on this implementation detail. This is # documented behaviour since 0.57.1. custom_target( 'check-env-ct', command: [ find_program('check-env.py'), '@SOURCE_ROOT@', '@BUILD_ROOT@', '@CURRENT_SOURCE_DIR@', ], env: { 'MESON_SOURCE_ROOT': meson.source_root(), 'MESON_BUILD_ROOT': meson.build_root(), 'MESON_SUBDIR': meson.current_source_dir(), 'MESONINTROSPECT': 'fake value', 'MY_ENV': '1', }, output: 'check-env-ct', ) run_target('textprinter', command: [find_program('subdir/textprinter.py')]) tests += 'textprinter' ninja = find_program('ninja', 'samu') foreach test : tests # There is a race condition when running samu on the same build folder # multiple times in parallel that can cause the build log to get corrupted, # so make these tests non-parallel. test( test, ninja, args: ['-C', meson.build_root(), test], is_parallel: false, ) endforeach muon-v0.4.0/subprojects/meson-tests/common/51 run target/converter.py0000644000175000017500000000021314751453622024622 0ustar buildbuild#!/usr/bin/env python3 import sys with open(sys.argv[1], 'rb') as ifile, open(sys.argv[2], 'wb') as ofile: ofile.write(ifile.read()) muon-v0.4.0/subprojects/meson-tests/common/51 run target/.clang-format0000644000175000017500000000002314751453622024613 0ustar buildbuildBasedOnStyle: LLVM muon-v0.4.0/subprojects/meson-tests/common/51 run target/fakeburner.py0000755000175000017500000000060214751453622024744 0ustar buildbuild#!/usr/bin/env python3 import sys plain_arg = sys.argv[1] _, tail = plain_arg.split(':', 1) filename, _ = tail.rsplit(':', 1) try: with open(filename, 'rb') as f: content = f.read() except FileNotFoundError: print('Could not open file. Missing dependency?') sys.exit(1) print('File opened, pretending to send it somewhere.') print(len(content), 'bytes uploaded') muon-v0.4.0/subprojects/meson-tests/common/51 run target/check-env.py0000644000175000017500000000213214751453622024460 0ustar buildbuild#!/usr/bin/env python3 import os, sys from pathlib import Path assert 'MESON_SOURCE_ROOT' in os.environ assert 'MESON_BUILD_ROOT' in os.environ assert 'MESON_SUBDIR' in os.environ # different than meson: MESONINTROSPECT is not set # assert 'MESONINTROSPECT' in os.environ assert 'MY_ENV' in os.environ # Environment has absolute paths and argv has relative paths when using ninja # backend and absolute paths when using vs backend. What matters is once # resolved they point to same location. env_source_root = Path(os.environ['MESON_SOURCE_ROOT']).resolve() env_build_root = Path(os.environ['MESON_BUILD_ROOT']).resolve() env_current_source_dir = Path(env_source_root, os.environ['MESON_SUBDIR']).resolve() print(sys.argv) argv_paths = [Path(i).resolve() for i in sys.argv[1:]] source_root, build_root, current_source_dir = argv_paths print(f'{source_root} == {env_source_root}') assert source_root == env_source_root print(f'{build_root} == {env_build_root}') assert build_root == env_build_root print(f'{current_source_dir} == {env_current_source_dir}') assert current_source_dir == env_current_source_dir muon-v0.4.0/subprojects/meson-tests/common/138 C and CPP link/0002755000175000017500000000000014751453622022510 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/138 C and CPP link/foo.hpp0000644000175000017500000000125414751453622024004 0ustar buildbuild/* Copyright © 2017 Dylan Baker * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifdef __cplusplus extern "C" { #endif int six_one(void); #ifdef __cplusplus } #endif muon-v0.4.0/subprojects/meson-tests/common/138 C and CPP link/foobar.h0000644000175000017500000000116014751453622024125 0ustar buildbuild/* Copyright © 2017 Dylan Baker * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ void mynumbers(int nums[]); muon-v0.4.0/subprojects/meson-tests/common/138 C and CPP link/foo.cpp0000644000175000017500000000171314751453622023777 0ustar buildbuild/* Copyright © 2017 Dylan Baker * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include const int cnums[] = {0, 61}; /* Provided by foobar.c */ extern "C" int get_number_index (void); template std::vector makeVector(const T (&data)[N]) { return std::vector(data, data+N); } namespace { std::vector numbers = makeVector(cnums); } extern "C" int six_one(void) { return numbers[get_number_index ()]; } muon-v0.4.0/subprojects/meson-tests/common/138 C and CPP link/meson.build0000644000175000017500000001000214751453622024641 0ustar buildbuild# Copyright © 2017 Dylan Baker # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. project('C and C++ static link test', ['c', 'cpp']) if meson.backend() == 'xcode' error( '''MESON_SKIP_TEST: overriding link language is not supported in Xcode. If you really need this, then patches are welcome. The only known way is to create a dummy C++ file in the meson-private directory and adding that to the target's source list when needed. The primitives exist but may need some tweaking. Grep for language_stdlib_only_link_flags to find where this is handled in other backends.''', ) endif # Verify that adding link arguments works. add_global_link_arguments('', language: 'c') add_project_link_arguments('', language: 'c') libc = static_library('cfoo', ['foo.c', 'foo.h']) # Test that linking C libs to external static C++ libs uses the C++ linker # Since we can't depend on the test system to provide this, we create one # ourselves at configure time and then 'find' it with cxx.find_library(). cxx = meson.get_compiler('cpp') if cxx.get_argument_syntax() == 'msvc' if cxx.get_id() == 'msvc' static_linker = find_program('lib') elif cxx.get_id() == 'clang-cl' static_linker = find_program('llvm-lib') elif cxx.get_id() == 'intel-cl' static_linker = find_program('xilib') else error('unable to determine static linker to use with this compiler') endif compile_cmd = ['/c', '@INPUT@', '/Fo@OUTPUT@'] stlib_cmd = [static_linker, '/OUT:@OUTPUT@', '@INPUT@'] else picflag = [] if not ['darwin', 'windows'].contains(host_machine.system()) picflag = ['-fPIC'] endif compile_cmd = ['-c', picflag, '@INPUT@', '-o', '@OUTPUT@'] stlib_cmd = ['ar', 'csr', '@OUTPUT@', '@INPUT@'] endif foo_cpp_o = configure_file( input: 'foo.cpp', output: 'foo.cpp.o', command: cxx.cmd_array() + compile_cmd, ) configure_file(input: foo_cpp_o, output: 'libstcppext.a', command: stlib_cmd) libstcppext = cxx.find_library('stcppext', dirs: meson.current_build_dir()) lib_type_name = libstcppext.type_name() assert(lib_type_name == 'library', 'type name is ' + lib_type_name) libfooext = shared_library( 'fooext', ['foobar.c', 'foobar.h'], link_with: libc, dependencies: libstcppext, ) # Test that linking C libs to internal static C++ libs uses the C++ linker libcpp = static_library('cppfoo', ['foo.cpp', 'foo.hpp']) libfoo = shared_library( 'foo', ['foobar.c', 'foobar.h'], link_with: [libc, libcpp], ) # Test that link_whole is also honored # # VS2010 lacks the /WHOLEARCHIVE option that later versions of MSVC support, so # don't run this tests on that backend. if not (cxx.get_id() == 'msvc' and cxx.version().version_compare('<19')) libfoowhole = shared_library( 'foowhole', ['foobar.c', 'foobar.h'], link_whole: [libc, libcpp], ) endif # Test sublinking (linking C and C++, then linking that to C) libfoo_static = static_library( 'foo_static', ['foobar.c', 'foobar.h'], link_with: [libc, libcpp], ) libsub = shared_library( 'sub', ['sub.c', 'sub.h'], link_with: libfoo_static, ) if not (cxx.get_id() == 'msvc' and cxx.version().version_compare('<19')) libsubwhole = shared_library( 'subwhole', ['sub.c', 'sub.h'], link_whole: libfoo_static, ) endif # Test that it really is recursive libsub_static = static_library( 'sub_static', ['sub.c', 'sub.h'], link_with: libfoo_static, ) libsubsub = shared_library( 'subsub', ['dummy.c'], link_with: libsub_static, ) muon-v0.4.0/subprojects/meson-tests/common/138 C and CPP link/foobar.c0000644000175000017500000000141514751453622024123 0ustar buildbuild/* Copyright © 2017 Dylan Baker * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "foo.h" #include "foo.hpp" #include "foobar.h" int get_number_index (void) { return 1; } void mynumbers(int nums[]) { nums[0] = forty_two(); nums[1] = six_one(); } muon-v0.4.0/subprojects/meson-tests/common/138 C and CPP link/sub.c0000644000175000017500000000121314751453622023440 0ustar buildbuild/* Copyright © 2017 Dylan Baker * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "sub.h" float a_half(void) { return .5; } muon-v0.4.0/subprojects/meson-tests/common/138 C and CPP link/sub.h0000644000175000017500000000115014751453622023445 0ustar buildbuild/* Copyright © 2017 Dylan Baker * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ float a_half(void); muon-v0.4.0/subprojects/meson-tests/common/138 C and CPP link/dummy.c0000644000175000017500000000000014751453622023773 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/138 C and CPP link/foo.c0000644000175000017500000000121414751453622023433 0ustar buildbuild/* Copyright © 2017 Dylan Baker * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "foo.h" int forty_two(void) { return 42; } muon-v0.4.0/subprojects/meson-tests/common/138 C and CPP link/foo.h0000644000175000017500000000115114751453622023440 0ustar buildbuild/* Copyright © 2017 Dylan Baker * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ int forty_two(void); muon-v0.4.0/subprojects/meson-tests/common/66 vcstag/0002755000175000017500000000000014751453622021471 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/66 vcstag/vcstag.c.in0000644000175000017500000000004214751453622023523 0ustar buildbuildconst char *vcstag = "@VCS_TAG@"; muon-v0.4.0/subprojects/meson-tests/common/66 vcstag/version.py0000755000175000017500000000004614751453622023531 0ustar buildbuild#!/usr/bin/env python3 print('3.14') muon-v0.4.0/subprojects/meson-tests/common/66 vcstag/tagprog.c0000644000175000017500000000016714751453622023302 0ustar buildbuild#include extern const char *vcstag; int main(void) { printf("Version is %s\n", vcstag); return 0; } muon-v0.4.0/subprojects/meson-tests/common/66 vcstag/meson.build0000644000175000017500000000267614751453622023644 0ustar buildbuildproject('vcstag', 'c') version_src = vcs_tag(input: 'vcstag.c.in', output: 'vcstag.c', fallback: '1.0.0') version_src_custom = vcs_tag( input: 'vcstag.c.in', output: 'vcstag-custom.c', command: ['git', 'show-ref', '-s', 'refs/heads/master'], fallback: '1.0.0', ) version_src_notfound_fallback = vcs_tag( input: 'vcstag.c.in', output: 'vcstag-notfound-fallback.c', command: ['git-but-not-found-sorry', 'show-ref', '-s', 'refs/heads/master'], fallback: '1.0.0', ) version_src_fallback = vcs_tag(input: 'vcstag.c.in', output: 'vcstag-fallback.c') git = find_program('git') version_src_git_program = vcs_tag( input: 'vcstag.c.in', output: 'vcstag-git-program.c', command: [git, 'rev-parse', 'HEAD'], fallback: '1.0.0', ) version_src_file = vcs_tag( input: 'vcstag.c.in', output: 'vcstag-file.c', command: files('version.py'), ) tagprog = executable('tagprog', 'tagprog.c', version_src) version_src_executable = vcs_tag(input: 'vcstag.c.in', output: 'vcstag-executable.c', command: [tagprog]) executable('tagprog-custom', 'tagprog.c', version_src_custom) executable('tagprog-fallback', 'tagprog.c', version_src_fallback) executable('tagprog-notfound-fallback', 'tagprog.c', version_src_notfound_fallback) executable('tagprog-git-program', 'tagprog.c', version_src_git_program) executable('tagprog-executable', 'tagprog.c', version_src_executable) executable('tagprog-file', 'tagprog.c', version_src_file) muon-v0.4.0/subprojects/meson-tests/common/157 custom target subdir depend files/0002755000175000017500000000000014751453622026620 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/157 custom target subdir depend files/subdir/0002755000175000017500000000000014751453622030110 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/157 custom target subdir depend files/subdir/foo.c.in0000644000175000017500000000012614751453622031441 0ustar buildbuild#include int main(void) { printf("foo is working.\n"); return 0; } muon-v0.4.0/subprojects/meson-tests/common/157 custom target subdir depend files/subdir/dep.dat0000644000175000017500000000003414751453622031345 0ustar buildbuildYou can depend on this file.muon-v0.4.0/subprojects/meson-tests/common/157 custom target subdir depend files/subdir/meson.build0000644000175000017500000000023714751453622032252 0ustar buildbuildfoo_src = custom_target( 'foo_src', depend_files: 'dep.dat', input: 'foo.c.in', output: 'foo.c', command: [copy, '@INPUT@', '@OUTPUT@'], ) muon-v0.4.0/subprojects/meson-tests/common/157 custom target subdir depend files/meson.build0000644000175000017500000000020414751453622030754 0ustar buildbuildproject('custom target subdir depend files', 'c') copy = find_program('copyfile.py') subdir('subdir') executable('foo', foo_src) muon-v0.4.0/subprojects/meson-tests/common/157 custom target subdir depend files/copyfile.py0000644000175000017500000000013414751453622031000 0ustar buildbuild#!/usr/bin/env python3 import sys import shutil shutil.copyfile(sys.argv[1], sys.argv[2]) muon-v0.4.0/subprojects/meson-tests/common/154 includedir subproj/0002755000175000017500000000000014751453622024047 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/154 includedir subproj/subprojects/0002755000175000017500000000000014751453622026412 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/154 includedir subproj/subprojects/inctest/0002755000175000017500000000000014751453622030063 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/154 includedir subproj/subprojects/inctest/meson.build0000644000175000017500000000041014751453622032216 0ustar buildbuildproject('subproj with includedir', 'c') compile_check = ''' #include "incfile.h" ''' if not meson.get_compiler('c').compiles( compile_check, name: 'include in subproj', include_directories: include_directories('include'), ) error('failed') endif muon-v0.4.0/subprojects/meson-tests/common/154 includedir subproj/subprojects/inctest/include/0002755000175000017500000000000014751453622031506 5ustar buildbuild././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/154 includedir subproj/subprojects/inctest/include/incfile.hmuon-v0.4.0/subprojects/meson-tests/common/154 includedir subproj/subprojects/inctest/include/incfil0000644000175000017500000000005414751453622032672 0ustar buildbuild /* file which is used in the subproject */ muon-v0.4.0/subprojects/meson-tests/common/154 includedir subproj/meson.build0000644000175000017500000000017314751453622026210 0ustar buildbuildproject('include dir in subproj test', 'c') subproject('inctest') exe = executable('prog', 'prog.c') test('dummy', exe) muon-v0.4.0/subprojects/meson-tests/common/154 includedir subproj/prog.c0000644000175000017500000000003714751453622025160 0ustar buildbuildint main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/277 custom target private dir/0002755000175000017500000000000014751453622025241 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/277 custom target private dir/meson.build0000644000175000017500000000062714751453622027406 0ustar buildbuildproject('277 custom target private dir') python = find_program('python', 'python3', required: true) custom_target( 'check-private-dir', command: [ # works with python2 or python3 python, '-c', 'import os, sys; os.chdir(sys.argv[1]); open(sys.argv[2], "w")', '@PRIVATE_DIR@', '@OUTPUT@', ], output: 'check-private-dir', build_by_default: true, ) muon-v0.4.0/subprojects/meson-tests/common/268 install functions and follow symlinks/0002755000175000017500000000000014751453622027565 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/268 install functions and follow symlinks/meson.build0000644000175000017500000000125114751453622031724 0ustar buildbuildproject('install_data following symlinks') install_data( 'foo/link1', install_dir: get_option('datadir') / 'followed', follow_symlinks: true, ) install_headers('foo/link2.h', follow_symlinks: true, subdir: 'followed') install_data( 'foo/link1', install_dir: get_option('datadir'), follow_symlinks: false, ) install_headers( 'foo/link2.h', follow_symlinks: false, ) install_subdir( 'foo', install_dir: get_option('datadir') / 'subdir', strip_directory: true, follow_symlinks: false, ) install_subdir( 'foo', install_dir: get_option('datadir') / 'subdir_followed', strip_directory: true, follow_symlinks: true, ) muon-v0.4.0/subprojects/meson-tests/common/268 install functions and follow symlinks/test.json0000644000175000017500000000114514751453622031436 0ustar buildbuild{ "installed": [ {"type": "link", "file": "usr/share/link1"}, {"type": "link", "file": "usr/include/link2.h"}, {"type": "file", "file": "usr/share/followed/link1"}, {"type": "file", "file": "usr/include/followed/link2.h"}, {"type": "link", "file": "usr/share/subdir/link1"}, {"type": "link", "file": "usr/share/subdir/link2.h"}, {"type": "file", "file": "usr/share/subdir/file1"}, {"type": "file", "file": "usr/share/subdir_followed/link1"}, {"type": "file", "file": "usr/share/subdir_followed/link2.h"}, {"type": "file", "file": "usr/share/subdir_followed/file1"} ] } muon-v0.4.0/subprojects/meson-tests/common/268 install functions and follow symlinks/foo/0002755000175000017500000000000014751453622030350 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/268 install functions and follow symlinks/foo/file10000644000175000017500000000000514751453622031264 0ustar buildbuildtest muon-v0.4.0/subprojects/meson-tests/common/231 subdir files/0002755000175000017500000000000014751453622022627 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/231 subdir files/subdir/0002755000175000017500000000000014751453622024117 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/231 subdir files/subdir/meson.build0000644000175000017500000000004114751453622026252 0ustar buildbuildsubdir_sources = files('prog.c') muon-v0.4.0/subprojects/meson-tests/common/231 subdir files/subdir/prog.c0000644000175000017500000000003514751453622025226 0ustar buildbuildint main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/231 subdir files/meson.build0000644000175000017500000000013714751453622024770 0ustar buildbuildproject('subdir files test', 'c') subdir('subdir') executable('prog', sources: subdir_sources) muon-v0.4.0/subprojects/meson-tests/common/64 arithmetic bidmas/0002755000175000017500000000000014751453622023551 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/64 arithmetic bidmas/meson.build0000644000175000017500000000060014751453622025705 0ustar buildbuildproject('arithmetic bidmas') if 5 * 3 - 6 / 2 + 1 != 13 error('Arithmetic bidmas broken') endif if 5 * (3 - 6 / 2) + 1 != 1 error('Arithmetic bidmas with brackets broken') endif if 5 * 12 / 2 * 3 != 90 error('Sequential multiplication and division broken') endif if 5 * (12 / (2 * 3)) != 10 error('Sequential multiplication and division with brackets broken') endif muon-v0.4.0/subprojects/meson-tests/common/120 extract all shared library/0002755000175000017500000000000014751453622025330 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/120 extract all shared library/func1234.def0000644000175000017500000000004414751453622027251 0ustar buildbuildEXPORTS func1 func2 func3 func4 muon-v0.4.0/subprojects/meson-tests/common/120 extract all shared library/three.c0000644000175000017500000000007114751453622026577 0ustar buildbuild#include"extractor.h" int func3(void) { return 3; } muon-v0.4.0/subprojects/meson-tests/common/120 extract all shared library/four.c0000644000175000017500000000007114751453622026443 0ustar buildbuild#include"extractor.h" int func4(void) { return 4; } muon-v0.4.0/subprojects/meson-tests/common/120 extract all shared library/meson.build0000644000175000017500000000103714751453622027471 0ustar buildbuildproject('extract all', 'c', 'cpp') if meson.backend() == 'xcode' error( 'MESON_SKIP_TEST: Xcode backend does not handle libraries with only objects, not sources.', ) endif a = static_library('a', 'one.c', 'two.c') b = static_library('b', 'three.c', 'four.c') # libc.so cannot be used, it already exists as a reserved name c = shared_library( 'cee', objects: [a.extract_all_objects(), b.extract_all_objects()], vs_module_defs: 'func1234.def', ) e = executable('proggie', 'prog.c', link_with: c) test('extall', e) muon-v0.4.0/subprojects/meson-tests/common/120 extract all shared library/one.c0000644000175000017500000000007114751453622026251 0ustar buildbuild#include"extractor.h" int func1(void) { return 1; } muon-v0.4.0/subprojects/meson-tests/common/120 extract all shared library/two.c0000644000175000017500000000007114751453622026301 0ustar buildbuild#include"extractor.h" int func2(void) { return 2; } muon-v0.4.0/subprojects/meson-tests/common/120 extract all shared library/prog.c0000644000175000017500000000031214751453622026435 0ustar buildbuild#include"extractor.h" #include int main(void) { if((1+2+3+4) != (func1() + func2() + func3() + func4())) { printf("Arithmetic is fail.\n"); return 1; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/120 extract all shared library/extractor.h0000644000175000017500000000012214751453622027505 0ustar buildbuild#pragma once int func1(void); int func2(void); int func3(void); int func4(void); muon-v0.4.0/subprojects/meson-tests/common/186 test depends/0002755000175000017500000000000014751453622022647 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/186 test depends/main.c0000644000175000017500000000003514751453622023733 0ustar buildbuildint main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/186 test depends/gen.py0000755000175000017500000000027014751453622023772 0ustar buildbuild#!/usr/bin/env python3 import sys def main(): with open(sys.argv[1], 'w') as out: out.write(sys.argv[2]) out.write('\n') if __name__ == '__main__': main() muon-v0.4.0/subprojects/meson-tests/common/186 test depends/meson.build0000644000175000017500000000127514751453622025014 0ustar buildbuildproject('test depends', 'c') gen = find_program('gen.py') custom_dep = custom_target( 'custom_dep', build_by_default: false, output: 'custom_dep.txt', command: [gen, '@OUTPUT@', 'custom_dep'], ) exe_dep = executable( 'exe_dep', 'main.c', build_by_default: false, ) test_prog = find_program('test.py') test( 'string dependencies', test_prog, args: [ # This is declared for convenience, # real use case might have some obscure method # to find these dependencies, e.g. automatic plugin loading. 'custom_dep.txt', exe_dep.full_path(), ], depends: [custom_dep, exe_dep], workdir: meson.current_build_dir(), ) muon-v0.4.0/subprojects/meson-tests/common/186 test depends/test.py0000755000175000017500000000054414751453622024204 0ustar buildbuild#!/usr/bin/env python3 import os import os.path import sys def main(): print('Looking in:', os.getcwd()) not_found = list() for f in sys.argv[1:]: if not os.path.exists(f): not_found.append(f) if not_found: print('Not found:', ', '.join(not_found)) sys.exit(1) if __name__ == '__main__': main() muon-v0.4.0/subprojects/meson-tests/common/131 override options/0002755000175000017500000000000014751453622023546 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/131 override options/three.c0000644000175000017500000000014314751453622025015 0ustar buildbuildstatic int duplicate_func(void) { return 4; } int func(void) { return duplicate_func(); } muon-v0.4.0/subprojects/meson-tests/common/131 override options/four.c0000644000175000017500000000017614751453622024667 0ustar buildbuildint func(void); static int duplicate_func(void) { return -4; } int main(void) { return duplicate_func() + func(); } muon-v0.4.0/subprojects/meson-tests/common/131 override options/meson.build0000644000175000017500000000036514751453622025712 0ustar buildbuildproject( 'option override', 'c', default_options: ['b_ndebug=false', 'debug=true'], ) a = executable('a', 'needs_no_b_ndebug.c') b = executable('b', 'needs_b_ndebug.c', override_options: ['b_ndebug=true']) test('a', a) test('b', b) muon-v0.4.0/subprojects/meson-tests/common/131 override options/one.c0000644000175000017500000000005714751453622024473 0ustar buildbuildstatic int hidden_func(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/131 override options/needs_no_b_ndebug.c0000644000175000017500000000010414751453622027322 0ustar buildbuildint main(void) { #ifdef NDEBUG return 1; #else return 0; #endif } muon-v0.4.0/subprojects/meson-tests/common/131 override options/needs_b_ndebug.c0000644000175000017500000000010414751453622026626 0ustar buildbuildint main(void) { #ifdef NDEBUG return 0; #else return 1; #endif } muon-v0.4.0/subprojects/meson-tests/common/131 override options/two.c0000644000175000017500000000016714751453622024525 0ustar buildbuild/* * Requires a Unity build. Otherwise hidden_func is not specified. */ int main(void) { return hidden_func(); } muon-v0.4.0/subprojects/meson-tests/common/189 check header/0002755000175000017500000000000014751453622022556 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/189 check header/meson.build0000644000175000017500000000401014751453622024711 0ustar buildbuildproject('check header', 'c', 'cpp') host_system = host_machine.system() non_existent_header = 'ouagadougou.h' # Copy it into the builddir to ensure that it isn't found even if it's there configure_file(input: non_existent_header, output: non_existent_header, copy: true) fallback = '' foreach comp : [meson.get_compiler('c'), meson.get_compiler('cpp')] assert(comp.check_header('stdio.h', prefix: fallback), 'Stdio missing.') # stdio.h doesn't actually need stdlib.h, but just test that setting the # prefix does not result in an error. assert( comp.check_header('stdio.h', prefix: '#include ' + fallback), 'Stdio missing.', ) # Test that check_header behaves differently than has_header. The second # check without windows.h will fail with check_header. # We only do this check on MSVC because MinGW often defines its own wrappers # that pre-include windows.h if comp.get_id() == 'msvc' assert( comp.check_header('XInput.h', prefix: '#include ' + fallback), 'XInput.h should not be missing on Windows', ) assert(not comp.check_header('XInput.h'), 'XInput.h needs windows.h') endif # Test that the following GCC bug doesn't happen: # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80005 # https://github.com/mesonbuild/meson/issues/1458 if host_system == 'linux' assert( comp.check_header('linux/socket.h', prefix: fallback), 'Could not find ', ) if comp.has_header('intrin.h', prefix: fallback) assert( not comp.check_header('intrin.h'), 'intrin.h should not be usable on linux', ) endif endif # This header exists in the source and the builddir, but we still must not # find it since we are looking in the system directories. assert( not comp.check_header(non_existent_header, prefix: fallback), 'Found nonexistent header.', ) endforeach muon-v0.4.0/subprojects/meson-tests/common/189 check header/ouagadougou.h0000644000175000017500000000004314751453622025241 0ustar buildbuild#define OMG_THIS_SHOULDNT_BE_FOUND muon-v0.4.0/subprojects/meson-tests/common/218 include_dir dot/0002755000175000017500000000000014751453622023311 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/218 include_dir dot/rone.h0000644000175000017500000000001714751453622024421 0ustar buildbuildint rOne(void);muon-v0.4.0/subprojects/meson-tests/common/218 include_dir dot/meson.build0000644000175000017500000000025714751453622025455 0ustar buildbuildproject('Include Here', 'c') # The layout with the .h file in . and the .c files in src/ is critical to # tickle the bug #5847 inc = include_directories('.') subdir('src') muon-v0.4.0/subprojects/meson-tests/common/218 include_dir dot/src/0002755000175000017500000000000014751453622024100 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/218 include_dir dot/src/rone.c0000644000175000017500000000004014751453622025177 0ustar buildbuildint rOne(void) { return 1; }muon-v0.4.0/subprojects/meson-tests/common/218 include_dir dot/src/main.c0000644000175000017500000000007114751453622025164 0ustar buildbuild#include "rone.h" int main(void) { return rOne(); } muon-v0.4.0/subprojects/meson-tests/common/218 include_dir dot/src/meson.build0000644000175000017500000000017714751453622026245 0ustar buildbuildt = executable( 'main', ['main.c', 'rone.c'], include_directories: inc, implicit_include_directories: false, ) muon-v0.4.0/subprojects/meson-tests/common/24 library versions/0002755000175000017500000000000014751453622023471 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/24 library versions/subdir/0002755000175000017500000000000014751453622024761 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/24 library versions/subdir/meson.build0000644000175000017500000000047714751453622027131 0ustar buildbuild# Test that using files generated with configure_file as sources works. # We do this inside a subdir so that the path isn't accidentally correct # because there is no structure in the build dir. genlib = configure_file(input: '../lib.c', output: 'genlib.c', copy: true) shared_library('genlib', genlib, install: false) muon-v0.4.0/subprojects/meson-tests/common/24 library versions/meson.build0000644000175000017500000000030314751453622025625 0ustar buildbuildproject('library versions', 'c') shared_library( 'somelib', 'lib.c', name_prefix: 'prefix', name_suffix: 'suffix', install_dir: 'lib', install: true, ) subdir('subdir') muon-v0.4.0/subprojects/meson-tests/common/24 library versions/test.json0000644000175000017500000000030514751453622025337 0ustar buildbuild{ "installed": [ {"type": "file", "file": "usr/lib/prefixsomelib.suffix"}, {"type": "implib", "file": "usr/lib/prefixsomelib"}, {"type": "pdb", "file": "usr/lib/prefixsomelib"} ] } muon-v0.4.0/subprojects/meson-tests/common/24 library versions/lib.c0000644000175000017500000000052414751453622024402 0ustar buildbuild#if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllexport) #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif int DLL_PUBLIC myFunc(void) { return 55; } muon-v0.4.0/subprojects/meson-tests/common/59 install subdir/0002755000175000017500000000000014751453622023123 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/59 install subdir/sub/0002755000175000017500000000000014751453622023714 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/59 install subdir/sub/sub1/0002755000175000017500000000000014751453622024566 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/59 install subdir/sub/sub1/third.dat0000644000175000017500000000005014751453622026363 0ustar buildbuildThis is a third data file for sub1 dir. muon-v0.4.0/subprojects/meson-tests/common/59 install subdir/subdir/0002755000175000017500000000000014751453622024413 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/59 install subdir/subdir/sub_elided/0002755000175000017500000000000014751453622026512 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/59 install subdir/subdir/sub_elided/dircheck/0002755000175000017500000000000014751453622030266 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/59 install subdir/subdir/sub_elided/dircheck/seventh.dat0000644000175000017500000000003114751453622032424 0ustar buildbuildNested file in a subdir. muon-v0.4.0/subprojects/meson-tests/common/59 install subdir/subdir/sub_elided/sixth.dat0000644000175000017500000000003514751453622030337 0ustar buildbuildElide test file in a subdir. muon-v0.4.0/subprojects/meson-tests/common/59 install subdir/subdir/meson.build0000644000175000017500000000036114751453622026553 0ustar buildbuildinstall_subdir( 'sub1', install_dir: 'share', # This mode will be overridden by the mode set in the outer install_subdir install_mode: 'rwxr-x---', ) install_subdir('sub_elided', install_dir: 'share', strip_directory: true) muon-v0.4.0/subprojects/meson-tests/common/59 install subdir/subdir/sub1/0002755000175000017500000000000014751453622025265 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/59 install subdir/subdir/sub1/data1.dat0000644000175000017500000000004114751453622026742 0ustar buildbuildThis is a data file in a subdir. muon-v0.4.0/subprojects/meson-tests/common/59 install subdir/subdir/sub1/sub2/0002755000175000017500000000000014751453622026140 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/59 install subdir/subdir/sub1/sub2/data2.dat0000644000175000017500000000005014751453622027616 0ustar buildbuildThis is a data file in a deeper subdir. muon-v0.4.0/subprojects/meson-tests/common/59 install subdir/nested_elided/0002755000175000017500000000000014751453622025713 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/59 install subdir/nested_elided/sub/0002755000175000017500000000000014751453622026504 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/59 install subdir/nested_elided/sub/dircheck/0002755000175000017500000000000014751453622030260 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/59 install subdir/nested_elided/sub/dircheck/ninth.dat0000644000175000017500000000005314751453622032066 0ustar buildbuildNested file under nested elided directory. muon-v0.4.0/subprojects/meson-tests/common/59 install subdir/nested_elided/sub/eighth.dat0000644000175000017500000000004114751453622030437 0ustar buildbuildFile in nested elided directory. muon-v0.4.0/subprojects/meson-tests/common/59 install subdir/sub_elided/0002755000175000017500000000000014751453622025222 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/59 install subdir/sub_elided/dircheck/0002755000175000017500000000000014751453622026776 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/59 install subdir/sub_elided/dircheck/fifth.dat0000644000175000017500000000005314751453622030564 0ustar buildbuildData file in a subdir of elided directory. muon-v0.4.0/subprojects/meson-tests/common/59 install subdir/sub_elided/fourth.dat0000644000175000017500000000007414751453622027222 0ustar buildbuildTest that this file is installed directly into install_dir. muon-v0.4.0/subprojects/meson-tests/common/59 install subdir/meson.build0000644000175000017500000000167614751453622025275 0ustar buildbuildproject('install a whole subdir', default_options: ['install_umask=preserve']) # A subdir with an exclusion: install_subdir( 'sub2', exclude_files: ['excluded-three.dat'], exclude_directories: ['excluded'], install_dir: 'share', ) # More exclusions install_subdir( 'sub3', exclude_files: ['data/excluded.txt'], exclude_directories: ['data/excluded'], install_dir: 'share', ) subdir('subdir') # A subdir with write perms only for the owner # and read-list perms for owner and group install_subdir( 'sub1', install_dir: 'share', install_mode: ['rwxr-x--x', 'root'], ) install_subdir('sub/sub1', install_dir: 'share') # strip_directory install_subdir('sub_elided', install_dir: 'share', strip_directory: true) install_subdir('nested_elided/sub', install_dir: 'share', strip_directory: true) # Create new empty directory that doesn't exist in the source tree install_subdir('new_directory', install_dir: 'share') muon-v0.4.0/subprojects/meson-tests/common/59 install subdir/test.json0000644000175000017500000000153514751453622024777 0ustar buildbuild{ "installed": [ {"type": "file", "file": "usr/share/dircheck/fifth.dat"}, {"type": "file", "file": "usr/share/dircheck/seventh.dat"}, {"type": "file", "file": "usr/share/dircheck/ninth.dat"}, {"type": "file", "file": "usr/share/eighth.dat"}, {"type": "file", "file": "usr/share/fourth.dat"}, {"type": "file", "file": "usr/share/sixth.dat"}, {"type": "file", "file": "usr/share/sub1/data1.dat"}, {"type": "file", "file": "usr/share/sub1/second.dat"}, {"type": "file", "file": "usr/share/sub1/third.dat"}, {"type": "file", "file": "usr/share/sub1/sub2/data2.dat"}, {"type": "file", "file": "usr/share/sub2/one.dat"}, {"type": "file", "file": "usr/share/sub2/dircheck/excluded-three.dat"}, {"type": "file", "file": "usr/share/sub3/data/data.txt"}, {"type": "dir", "file": "usr/share/new_directory"} ] } muon-v0.4.0/subprojects/meson-tests/common/59 install subdir/sub2/0002755000175000017500000000000014751453622023776 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/59 install subdir/sub2/dircheck/0002755000175000017500000000000014751453622025552 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/59 install subdir/sub2/dircheck/excluded-three.dat0000644000175000017500000000000014751453622031132 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/59 install subdir/sub2/one.dat0000644000175000017500000000000014751453622025235 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/59 install subdir/sub2/excluded-three.dat0000644000175000017500000000000014751453622027356 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/59 install subdir/sub2/excluded/0002755000175000017500000000000014751453622025573 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/59 install subdir/sub2/excluded/two.dat0000644000175000017500000000000014751453622027062 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/59 install subdir/sub3/0002755000175000017500000000000014751453622023777 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/59 install subdir/sub3/data/0002755000175000017500000000000014751453622024710 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/59 install subdir/sub3/data/data.txt0000644000175000017500000000000514751453622026353 0ustar buildbuilddata muon-v0.4.0/subprojects/meson-tests/common/59 install subdir/sub3/data/excluded.txt0000644000175000017500000000001114751453622027234 0ustar buildbuildexcluded muon-v0.4.0/subprojects/meson-tests/common/59 install subdir/sub3/data/excluded/0002755000175000017500000000000014751453622026505 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/59 install subdir/sub3/data/excluded/excluded.txt0000644000175000017500000000001114751453622031031 0ustar buildbuildexcluded muon-v0.4.0/subprojects/meson-tests/common/59 install subdir/sub1/0002755000175000017500000000000014751453622023775 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/59 install subdir/sub1/second.dat0000644000175000017500000000006614751453622025742 0ustar buildbuildTest that multiple install_subdirs meld their results.muon-v0.4.0/subprojects/meson-tests/common/95 manygen/0002755000175000017500000000000014751453622021642 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/95 manygen/subdir/0002755000175000017500000000000014751453622023132 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/95 manygen/subdir/meson.build0000644000175000017500000000177414751453622025303 0ustar buildbuildgen = files('manygen.py') py3_bin = import('python3').find_python() buildtype = get_option('buildtype') buildtype_args = '-Dfooxxx' # a useless compiler argument cc = meson.get_compiler('c') if cc.get_argument_syntax() == 'msvc' # We need our manually generated code to use the same CRT as the executable. # Taken from compilers.py since build files do not have access to this. if buildtype == 'debug' buildtype_args = '/MDd' elif buildtype == 'debugoptimized' buildtype_args = '/MDd' elif buildtype == 'release' buildtype_args = '/MD' endif outfiles = ['gen_func.lib', 'gen_func.c', 'gen_func.h', 'gen_func.o'] else outfiles = ['gen_func.a', 'gen_func.c', 'gen_func.h', 'gen_func.o'] endif generated = custom_target( 'manygen', output: outfiles, input: ['funcinfo.def'], command: [ py3_bin, gen[0], '@INPUT@', '@OUTDIR@', buildtype_args, cc.get_argument_syntax(), cc.cmd_array(), ], ) muon-v0.4.0/subprojects/meson-tests/common/95 manygen/subdir/funcinfo.def0000644000175000017500000000001114751453622025407 0ustar buildbuildgen_func muon-v0.4.0/subprojects/meson-tests/common/95 manygen/subdir/manygen.py0000755000175000017500000000347414751453622025153 0ustar buildbuild#!/usr/bin/env python3 # Generates a static library, object file, source # file and a header file. import sys, os import subprocess with open(sys.argv[1]) as f: funcname = f.readline().strip() outdir = sys.argv[2] buildtype_args = sys.argv[3] compiler_type = sys.argv[4] compiler = sys.argv[5:] if not os.path.isdir(outdir): print('Outdir does not exist.') sys.exit(1) if compiler_type == 'msvc': libsuffix = '.lib' is_vs = True if any(['clang-cl' in c for c in compiler]): linker = 'llvm-lib' else: linker = 'lib' else: libsuffix = '.a' is_vs = False linker = 'ar' objsuffix = '.o' outo = os.path.join(outdir, funcname + objsuffix) outa = os.path.join(outdir, funcname + libsuffix) outh = os.path.join(outdir, funcname + '.h') outc = os.path.join(outdir, funcname + '.c') tmpc = 'diibadaaba.c' tmpo = 'diibadaaba' + objsuffix with open(outc, 'w') as f: f.write('''#include"{}.h" int {}_in_src(void) {{ return 0; }} '''.format(funcname, funcname)) with open(outh, 'w') as f: f.write('''#pragma once int {}_in_lib(void); int {}_in_obj(void); int {}_in_src(void); '''.format(funcname, funcname, funcname)) with open(tmpc, 'w') as f: f.write('''int %s_in_obj(void) { return 0; } ''' % funcname) if is_vs: subprocess.check_call(compiler + ['/nologo', '/c', buildtype_args, '/Fo' + outo, tmpc]) else: subprocess.check_call(compiler + ['-c', '-o', outo, tmpc]) with open(tmpc, 'w') as f: f.write('''int %s_in_lib() { return 0; } ''' % funcname) if is_vs: subprocess.check_call(compiler + ['/nologo', '/c', '/Fo' + tmpo, tmpc]) subprocess.check_call([linker, '/NOLOGO', '/OUT:' + outa, tmpo]) else: subprocess.check_call(compiler + ['-c', '-o', tmpo, tmpc]) subprocess.check_call([linker, 'csr', outa, tmpo]) os.unlink(tmpo) os.unlink(tmpc) muon-v0.4.0/subprojects/meson-tests/common/95 manygen/meson.build0000644000175000017500000000047014751453622024003 0ustar buildbuildproject('manygen', 'c') if meson.is_cross_build() # FIXME error out with skip message once cross test runner # recognizes it. message('Not running this test during cross build.') else subdir('subdir') exe = executable('depuser', 'depuser.c', generated) test('depuser test', exe) endif muon-v0.4.0/subprojects/meson-tests/common/95 manygen/depuser.c0000644000175000017500000000035314751453622023454 0ustar buildbuild#include"gen_func.h" int main(void) { unsigned int i = (unsigned int) gen_func_in_lib(); unsigned int j = (unsigned int) gen_func_in_obj(); unsigned int k = (unsigned int) gen_func_in_src(); return (int)(i + j + k); } muon-v0.4.0/subprojects/meson-tests/common/222 native prop/0002755000175000017500000000000014751453622022503 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/222 native prop/crossfile.ini0000644000175000017500000000010314751453622025165 0ustar buildbuild[properties] astring = 'cross' anarray = ['one', 'two'] red = true muon-v0.4.0/subprojects/meson-tests/common/222 native prop/nativefile.ini0000644000175000017500000000020214751453622025322 0ustar buildbuild[properties] astring = 'mystring' anarray = ['one', 'two'] withparentheses = ('anotherstring') # Ensure parentheses can be parsedmuon-v0.4.0/subprojects/meson-tests/common/222 native prop/meson.build0000644000175000017500000000527514751453622024654 0ustar buildbuildproject('get prop') x = meson.get_external_property('astring') ref = meson.is_cross_build() ? 'cross' : 'mystring' assert( x == ref, 'did not get native property string. did you use "meson setup --native-file native.txt"', ) x = meson.get_external_property('astring', native: true) assert( x == 'mystring', 'did not get native property with native:true and non-cross build.', ) x = meson.get_external_property('astring', 'fallback', native: false) assert( x == ref, 'did not get native property with native:false and non-cross build.', ) x = meson.get_external_property('nonexistent', 'fallback') assert(x == 'fallback', 'fallback did not work') x = meson.get_external_property('nonexistent', 'fallback', native: true) assert(x == 'fallback', 'fallback native:true did not work') x = meson.get_external_property('nonexistent', 'fallback', native: false) assert(x == 'fallback', 'fallback native:false did not work') x = meson.get_external_property('anarray') assert(x == ['one', 'two'], 'array did not work') assert( meson.has_external_property('anarray'), 'expected property "anarray" to exist', ) assert( meson.has_external_property('astring'), 'expected property "astring" to exist', ) assert( not meson.has_external_property('abool'), 'did not expect property "abool" to exist', ) # These exist in both assert(meson.has_external_property('anarray', native: false), 'FIXME') assert(meson.has_external_property('anarray', native: true), 'FIXME') assert(meson.has_external_property('astring', native: false), 'FIXME') assert(meson.has_external_property('astring', native: true), 'FIXME') if meson.is_cross_build() # This property only exists in the cross file assert( meson.has_external_property('red'), 'expected property "red" to exist in cross file', ) assert( meson.has_external_property('red', native: false), 'expected property "red" to exist in cross file', ) assert( not meson.has_external_property('red', native: true), 'did not expect property "red" to exist in native file', ) assert(not meson.has_external_property('abool', native: false), 'FIXME') assert(not meson.has_external_property('abool', native: false), 'FIXME') else assert( not meson.has_external_property('red'), 'did not expect property "red" to exist in native file', ) assert( not meson.has_external_property('red', native: false), 'did not expect property "red" to exist in cross file because we are not doing a cross build', ) assert( not meson.has_external_property('red', native: true), 'did not expect property "red" to exist in native file', ) endif muon-v0.4.0/subprojects/meson-tests/common/176 subproject version/0002755000175000017500000000000014751453622024112 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/176 subproject version/subprojects/0002755000175000017500000000000014751453622026455 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/176 subproject version/subprojects/a/0002755000175000017500000000000014751453622026675 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/176 subproject version/subprojects/a/meson.build0000644000175000017500000000016214751453622031034 0ustar buildbuildproject('mysubproject', version: '1.0.0', license: 'sublicense') liba_dep = declare_dependency(version: '1.0.0') muon-v0.4.0/subprojects/meson-tests/common/176 subproject version/meson.build0000644000175000017500000000026514751453622026255 0ustar buildbuildproject('subproject version', version: '2.3.4', license: 'mylicense') subproject('a') liba_dep = dependency('a', fallback: ['a', 'liba_dep'], version: ['>= 0.30.0', '!= 0.99.0']) muon-v0.4.0/subprojects/meson-tests/common/72 shared subproject/0002755000175000017500000000000014751453622023606 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/72 shared subproject/subprojects/0002755000175000017500000000000014751453622026151 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/72 shared subproject/subprojects/C/0002755000175000017500000000000014751453622026333 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/72 shared subproject/subprojects/C/meson.build0000644000175000017500000000015314751453622030472 0ustar buildbuildproject('C', 'c') # libc.so cannot be used, it already exists as a reserved name c = library('cee', 'c.c') muon-v0.4.0/subprojects/meson-tests/common/72 shared subproject/subprojects/C/c.c0000644000175000017500000000052414751453622026720 0ustar buildbuild#if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllexport) #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif char DLL_PUBLIC func_c(void) { return 'c'; } muon-v0.4.0/subprojects/meson-tests/common/72 shared subproject/subprojects/B/0002755000175000017500000000000014751453622026332 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/72 shared subproject/subprojects/B/meson.build0000644000175000017500000000014414751453622030471 0ustar buildbuildproject('B', 'c') C = subproject('C') c = C.get_variable('c') b = library('b', 'b.c', link_with: c) muon-v0.4.0/subprojects/meson-tests/common/72 shared subproject/subprojects/B/b.c0000644000175000017500000000065514751453622026723 0ustar buildbuild#include #if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllexport) #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif char func_c(void); char DLL_PUBLIC func_b(void) { if(func_c() != 'c') { exit(3); } return 'b'; } muon-v0.4.0/subprojects/meson-tests/common/72 shared subproject/a.c0000644000175000017500000000027714751453622024176 0ustar buildbuild#include char func_b(void); char func_c(void); int main(void) { if(func_b() != 'b') { return 1; } if(func_c() != 'c') { return 2; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/72 shared subproject/meson.build0000644000175000017500000000034714751453622025752 0ustar buildbuildproject('A', 'c') # different than meson: no auto-population of subprojects C = subproject('C') c = C.get_variable('c') B = subproject('B') b = B.get_variable('b') a = executable('a', 'a.c', link_with: [b, c]) test('a test', a) muon-v0.4.0/subprojects/meson-tests/common/25 config subdir/0002755000175000017500000000000014751453622022713 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/25 config subdir/meson.build0000644000175000017500000000014414751453622025052 0ustar buildbuildproject('subdirconfig', 'c') inc = include_directories('include') subdir('include') subdir('src') muon-v0.4.0/subprojects/meson-tests/common/25 config subdir/include/0002755000175000017500000000000014751453622024336 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/25 config subdir/include/config.h.in0000644000175000017500000000011314751453622026352 0ustar buildbuild#ifndef CONFIG_H_ #define CONFIG_H_ #define RETURN_VALUE @number@ #endif muon-v0.4.0/subprojects/meson-tests/common/25 config subdir/include/meson.build0000644000175000017500000000022214751453622026472 0ustar buildbuildconf_data = configuration_data() conf_data.set('number', '0') configure_file(input: 'config.h.in', output: 'config.h', configuration: conf_data) muon-v0.4.0/subprojects/meson-tests/common/25 config subdir/src/0002755000175000017500000000000014751453622023502 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/25 config subdir/src/meson.build0000644000175000017500000000013014751453622025634 0ustar buildbuildexe = executable('prog', 'prog.c', include_directories: inc) test('subdir config', exe) muon-v0.4.0/subprojects/meson-tests/common/25 config subdir/src/prog.c0000644000175000017500000000010114751453622024603 0ustar buildbuild#include "config.h" int main(void) { return RETURN_VALUE; } muon-v0.4.0/subprojects/meson-tests/common/241 set and get variable/0002755000175000017500000000000014751453622024101 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/241 set and get variable/test1.txt0000644000175000017500000000000014751453622025666 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/241 set and get variable/meson.build0000644000175000017500000000346614751453622026252 0ustar buildbuildproject('set and get') var1 = 'test1.txt' var2 = files('test1.txt')[0] # Use is_disabler for accessing variables assert(var1 == 'test1.txt') assert(not is_disabler(var2)) # Ensure that set variables behave correctly set_variable('var3', 'test2.txt') set_variable('var4', files('test2.txt')[0]) assert(var3 == 'test2.txt') assert(not is_disabler(var4)) # Test Equality assert(var1 == get_variable('var1')) assert(var2 == get_variable('var2')) # Test get_variable directly assert(get_variable('var1') == 'test1.txt') assert(not is_disabler(get_variable('var2'))) assert(get_variable('var3') == 'test2.txt') assert(not is_disabler(get_variable('var4'))) # Test get_variable indirectly var5 = get_variable('var1') var6 = get_variable('var2') var7 = get_variable('var3') var8 = get_variable('var4') set_variable('var9', get_variable('var7')) set_variable('var0', get_variable('var8')) assert(var5 == 'test1.txt') assert(not is_disabler(var6)) assert(var7 == 'test2.txt') assert(not is_disabler(var8)) assert(get_variable('var9') == 'test2.txt') assert(not is_disabler(get_variable('var0'))) assert(not is_disabler(get_variable('var0', var8))) assert(not is_disabler(get_variable('----', var8))) assert(not is_disabler(get_variable('----', [var8]))) assert(not is_disabler(get_variable('----', {'asd': var8}))) # test dict get dict = {'a': var2} dict_t1 = dict['a'] dict_t2 = dict.get('a') dict_t3 = dict.get('a', var2) dict_t4 = dict.get('b', var2) assert(not is_disabler(dict_t1)) assert(not is_disabler(dict_t2)) assert(not is_disabler(dict_t3)) assert(not is_disabler(dict_t4)) # test lists list = [var2] list_t1 = list[0] list_t2 = list.get(0) list_t3 = list.get(0, var2) list_t4 = list.get(1, var2) assert(not is_disabler(list_t1)) assert(not is_disabler(list_t2)) assert(not is_disabler(list_t3)) assert(not is_disabler(list_t4)) muon-v0.4.0/subprojects/meson-tests/common/241 set and get variable/test2.txt0000644000175000017500000000000014751453622025667 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/48 file grabber/0002755000175000017500000000000014751453622022506 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/48 file grabber/grabber.bat0000644000175000017500000000006114751453622024575 0ustar buildbuild@ECHO OFF echo a.c echo b.c echo c.c echo prog.c muon-v0.4.0/subprojects/meson-tests/common/48 file grabber/subdir/0002755000175000017500000000000014751453622023776 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/48 file grabber/subdir/subprog.c0000644000175000017500000000015714751453622025624 0ustar buildbuildint funca(void); int funcb(void); int funcc(void); int main(void) { return funca() + funcb() + funcc(); } muon-v0.4.0/subprojects/meson-tests/common/48 file grabber/subdir/subb.c0000644000175000017500000000003614751453622025072 0ustar buildbuildint funcb(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/48 file grabber/subdir/subc.c0000644000175000017500000000003614751453622025073 0ustar buildbuildint funcc(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/48 file grabber/subdir/suba.c0000644000175000017500000000003614751453622025071 0ustar buildbuildint funca(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/48 file grabber/subdir/meson.build0000644000175000017500000000022514751453622026135 0ustar buildbuildsc = run_command(grabber, check: true) subsources = sc.stdout().strip().splitlines() se = executable('subprog', subsources) test('subgrabtest', se) muon-v0.4.0/subprojects/meson-tests/common/48 file grabber/a.c0000644000175000017500000000003614751453622023067 0ustar buildbuildint funca(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/48 file grabber/meson.build0000644000175000017500000000171514751453622024652 0ustar buildbuildproject('grabber', 'c') # What this script does is NOT reliable. Simply adding a file in this directory # will NOT make it automatically appear in the build. You have to manually # re-invoke Meson (not just Ninja) for that to happen. The simplest way # is to touch meson-private/coredata.dat. # This is not the recommended way to do things, but if the tradeoffs are # acceptable to you, then we're certainly not going to stop you. Just don't # file bugs when it fails. :) if build_machine.system() == 'windows' c = run_command('grabber.bat', check: false) grabber = find_program('grabber2.bat') else c = run_command('grabber.sh', check: false) grabber = find_program('grabber.sh') endif # First test running command explicitly. if c.returncode() != 0 error('Executing script failed.') endif sources = c.stdout().strip().splitlines() e = executable('prog', sources) test('grabtest', e) # Then test using program with find_program subdir('subdir') muon-v0.4.0/subprojects/meson-tests/common/48 file grabber/b.c0000644000175000017500000000003614751453622023070 0ustar buildbuildint funcb(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/48 file grabber/c.c0000644000175000017500000000003614751453622023071 0ustar buildbuildint funcc(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/48 file grabber/prog.c0000644000175000017500000000015714751453622023622 0ustar buildbuildint funca(void); int funcb(void); int funcc(void); int main(void) { return funca() + funcb() + funcc(); } muon-v0.4.0/subprojects/meson-tests/common/48 file grabber/grabber.sh0000755000175000017500000000022614751453622024447 0ustar buildbuild#!/bin/sh # different from meson: run_command() runs from the project root for i in "${MESON_SOURCE_ROOT}/${MESON_SUBDIR:-.}/"*.c; do echo $i done muon-v0.4.0/subprojects/meson-tests/common/48 file grabber/grabber2.bat0000644000175000017500000000007514751453622024664 0ustar buildbuild@ECHO OFF echo suba.c echo subb.c echo subc.c echo subprog.c muon-v0.4.0/subprojects/meson-tests/common/73 shared subproject 2/0002755000175000017500000000000014751453622023731 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/73 shared subproject 2/subprojects/0002755000175000017500000000000014751453622026274 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/73 shared subproject 2/subprojects/C/0002755000175000017500000000000014751453622026456 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/73 shared subproject 2/subprojects/C/meson.build0000644000175000017500000000015314751453622030615 0ustar buildbuildproject('C', 'c') # libc.so cannot be used, it already exists as a reserved name c = library('cee', 'c.c') muon-v0.4.0/subprojects/meson-tests/common/73 shared subproject 2/subprojects/C/c.c0000644000175000017500000000052414751453622027043 0ustar buildbuild#if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllexport) #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif char DLL_PUBLIC func_c(void) { return 'c'; } muon-v0.4.0/subprojects/meson-tests/common/73 shared subproject 2/subprojects/B/0002755000175000017500000000000014751453622026455 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/73 shared subproject 2/subprojects/B/meson.build0000644000175000017500000000014414751453622030614 0ustar buildbuildproject('B', 'c') C = subproject('C') c = C.get_variable('c') b = library('b', 'b.c', link_with: c) muon-v0.4.0/subprojects/meson-tests/common/73 shared subproject 2/subprojects/B/b.c0000644000175000017500000000065414751453622027045 0ustar buildbuild#include char func_c(void); #if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllexport) #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif char DLL_PUBLIC func_b(void) { if(func_c() != 'c') { exit(3); } return 'b'; } muon-v0.4.0/subprojects/meson-tests/common/73 shared subproject 2/a.c0000644000175000017500000000027714751453622024321 0ustar buildbuild#include char func_b(void); char func_c(void); int main(void) { if(func_b() != 'b') { return 1; } if(func_c() != 'c') { return 2; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/73 shared subproject 2/meson.build0000644000175000017500000000036314751453622026073 0ustar buildbuildproject('A', 'c') # Same as the previous test but use C and B in # the opposite order. C = subproject('C') c = C.get_variable('c') B = subproject('B') b = B.get_variable('b') a = executable('a', 'a.c', link_with: [b, c]) test('a test', a) muon-v0.4.0/subprojects/meson-tests/common/160 custom target template substitution/0002755000175000017500000000000014751453622027367 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/160 custom target template substitution/foo.c.in0000644000175000017500000000012614751453622030720 0ustar buildbuild#include int main(void) { printf("foo is working.\n"); return 0; } muon-v0.4.0/subprojects/meson-tests/common/160 custom target template substitution/meson.build0000644000175000017500000000076714751453622031541 0ustar buildbuildproject('custom target template substitution', 'c') check = find_program('checkcopy.py') config = configuration_data() config_file = configure_file(configuration: config, output: 'x@IN') # Check that substitution does not find @FOO@ and then misses @INPUT0@. # Check the resulting x@INPUT1@ is not replaced. foo = custom_target( 'runcheck', input: [config_file, 'foo.c.in'], output: 'foo.c', command: [check, '-D@FOO@INPUT0@PUT1@', '@INPUT1@', '@OUTPUT@'], ) executable('foo', foo) muon-v0.4.0/subprojects/meson-tests/common/160 custom target template substitution/checkcopy.py0000644000175000017500000000031214751453622031703 0ustar buildbuild#!/usr/bin/env python3 import sys import shutil if '@INPUT1@' in sys.argv[1]: shutil.copyfile(sys.argv[2], sys.argv[3]) else: sys.exit('String @INPUT1@ not found in "{}"'.format(sys.argv[1])) muon-v0.4.0/subprojects/meson-tests/common/88 dep fallback/0002755000175000017500000000000014751453622022476 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/88 dep fallback/subprojects/0002755000175000017500000000000014751453622025041 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/88 dep fallback/subprojects/dummylib/0002755000175000017500000000000014751453622026663 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/88 dep fallback/subprojects/dummylib/meson.build0000644000175000017500000000014714751453622031025 0ustar buildbuildproject('dummylib', 'c') dummy_dep = declare_dependency() error('this subproject fails to configure') muon-v0.4.0/subprojects/meson-tests/common/88 dep fallback/subprojects/boblib/0002755000175000017500000000000014751453622026272 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/88 dep fallback/subprojects/boblib/bob.c0000644000175000017500000000015614751453622027200 0ustar buildbuild#include"bob.h" #ifdef _MSC_VER __declspec(dllexport) #endif const char* get_bob(void) { return "bob"; } muon-v0.4.0/subprojects/meson-tests/common/88 dep fallback/subprojects/boblib/meson.build0000644000175000017500000000072414751453622030435 0ustar buildbuildproject('bob', 'c') gensrc_py = find_program('genbob.py') genbob_h = custom_target('genbob.h', output: 'genbob.h', command: [gensrc_py, '@OUTPUT@']) genbob_c = custom_target('genbob.c', output: 'genbob.c', command: [gensrc_py, '@OUTPUT@']) boblib = library('bob', ['bob.c', genbob_c]) bobinc = include_directories('.') bob_dep = declare_dependency(link_with: boblib, sources: [genbob_h], include_directories: bobinc) notfound_dep = dependency('', required: false) muon-v0.4.0/subprojects/meson-tests/common/88 dep fallback/subprojects/boblib/genbob.py0000644000175000017500000000012614751453622030075 0ustar buildbuild#!/usr/bin/env python3 import sys with open(sys.argv[1], 'w') as f: f.write('') muon-v0.4.0/subprojects/meson-tests/common/88 dep fallback/subprojects/boblib/bob.h0000644000175000017500000000012614751453622027202 0ustar buildbuild#pragma once #ifdef _MSC_VER __declspec(dllimport) #endif const char* get_bob(void); muon-v0.4.0/subprojects/meson-tests/common/88 dep fallback/gensrc.py0000644000175000017500000000013414751453622024325 0ustar buildbuild#!/usr/bin/env python3 import sys import shutil shutil.copyfile(sys.argv[1], sys.argv[2]) muon-v0.4.0/subprojects/meson-tests/common/88 dep fallback/meson.build0000644000175000017500000000267714751453622024652 0ustar buildbuildproject('dep fallback', 'c') bob = dependency( 'boblib', fallback: ['boblib', 'bob_dep'], required: false, default_options: 'warning_level=1', ) if not bob.found() error('Bob is actually needed') endif # boblib subproject exists, but bobinc is not a dependency variable sita = dependency('sitalib', fallback: ['boblib', 'bobinc'], required: false) assert(not sita.found()) # boblib subproject exists, but sita_dep doesn't exist sita = dependency('sitalib', fallback: ['boblib', 'sita_dep'], required: false) assert(not sita.found()) # boblib has been configured so zlib cannot be searched on the system zlib = dependency('zlib', fallback: ['boblib', 'notfound_dep'], required: false) assert(not zlib.found()) # boblib has been configured so zlib cannot be searched on the system. # Not variable name provided and the subproject does not override zlib. zlib = dependency('zlib', fallback: 'boblib', required: false) assert(not zlib.found()) # jimmylib subproject doesn't exist jimmy = dependency('jimmylib', fallback: ['jimmylib', 'jimmy_dep'], required: false) # dummylib subproject fails to configure dummy = dependency('dummylib', fallback: ['dummylib', 'dummy_dep'], required: false) gensrc_py = find_program('gensrc.py') gensrc = custom_target( 'gensrc.c', input: 'tester.c', output: 'gensrc.c', command: [gensrc_py, '@INPUT@', '@OUTPUT@'], ) exe = executable('bobtester', [gensrc], dependencies: bob) test('bobtester', exe) muon-v0.4.0/subprojects/meson-tests/common/88 dep fallback/tester.c0000644000175000017500000000041314751453622024144 0ustar buildbuild#include"bob.h" #include"genbob.h" #include #include int main(void) { if(strcmp("bob", get_bob()) == 0) { printf("Bob is indeed bob.\n"); } else { printf("ERROR: bob is not bob.\n"); return 1; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/181 same target name flat layout/0002755000175000017500000000000014751453622025562 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/181 same target name flat layout/main.c0000644000175000017500000000053314751453622026651 0ustar buildbuild#include int meson_test_main_foo(void); int meson_test_subproj_foo(void); int main(void) { if (meson_test_main_foo() != 10) { printf("Failed meson_test_main_foo\n"); return 1; } if (meson_test_subproj_foo() != 20) { printf("Failed meson_test_subproj_foo\n"); return 1; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/181 same target name flat layout/subdir/0002755000175000017500000000000014751453622027052 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/181 same target name flat layout/subdir/meson.build0000644000175000017500000000010314751453622031204 0ustar buildbuildsubdir_foo = static_library('foo', 'foo.c', name_prefix: 'subdir') muon-v0.4.0/subprojects/meson-tests/common/181 same target name flat layout/subdir/foo.c0000644000175000017500000000006014751453622027773 0ustar buildbuildint meson_test_subproj_foo(void) { return 20; } muon-v0.4.0/subprojects/meson-tests/common/181 same target name flat layout/meson.build0000644000175000017500000000111114751453622027714 0ustar buildbuildproject('subdir targets', 'c') if meson.backend() == 'xcode' error( 'MESON_SKIP_TEST: many targets with the same name not supported in Xcode. Patches welcome.', ) endif # Idea behind this test is to create targets with identical name # but different output files. We can do this by choosing different # name_prefix of libraries. Target id does not depend on name_prefix. main_foo = static_library('foo', 'foo.c', name_prefix: 'main') subdir('subdir') # defines subdir_foo exe = executable('prog', 'main.c', link_with: [main_foo, subdir_foo]) test('main test', exe) muon-v0.4.0/subprojects/meson-tests/common/181 same target name flat layout/foo.c0000644000175000017500000000005514751453622026507 0ustar buildbuildint meson_test_main_foo(void) { return 10; } muon-v0.4.0/subprojects/meson-tests/common/21 target arg/0002755000175000017500000000000014751453622022211 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/21 target arg/func.c0000644000175000017500000000021614751453622023305 0ustar buildbuild#ifndef CTHING #error "Local argument not set" #endif #ifdef CPPTHING #error "Wrong local argument set" #endif int func(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/21 target arg/prog2.cc0000644000175000017500000000031214751453622023543 0ustar buildbuild#ifdef CTHING #error "Local C argument set in wrong target" #endif #ifdef CPPTHING #error "Local CPP argument set in wrong target" #endif extern "C" int func(); int main(void) { return func(); } muon-v0.4.0/subprojects/meson-tests/common/21 target arg/prog.cc0000644000175000017500000000025714751453622023471 0ustar buildbuild#ifdef CTHING #error "Wrong local argument set" #endif #ifndef CPPTHING #error "Local argument not set" #endif extern "C" int func(); int main(void) { return func(); } muon-v0.4.0/subprojects/meson-tests/common/21 target arg/meson.build0000644000175000017500000000033514751453622024352 0ustar buildbuildproject('local arg test', 'cpp', 'c') exe1 = executable('prog', 'prog.cc', 'func.c', c_args: '-DCTHING', cpp_args: '-DCPPTHING') exe2 = executable('prog2', 'prog2.cc', 'func2.c') test('prog1', exe1) test('prog2', exe2) muon-v0.4.0/subprojects/meson-tests/common/21 target arg/func2.c0000644000175000017500000000025114751453622023366 0ustar buildbuild#ifdef CTHING #error "Local C argument set in wrong target" #endif #ifdef CPPTHING #error "Local CPP argument set in wrong target" #endif int func(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/139 mesonintrospect from scripts/0002755000175000017500000000000014751453622026113 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/139 mesonintrospect from scripts/check_introspection.py0000644000175000017500000000071014751453622032516 0ustar buildbuild#!/usr/bin/env python3 import os import shlex import subprocess if 'MESONINTROSPECT' not in os.environ: raise RuntimeError('MESONINTROSPECT not found') if 'MESON_BUILD_ROOT' not in os.environ: raise RuntimeError('MESON_BUILD_ROOT not found') mesonintrospect = os.environ['MESONINTROSPECT'] introspect_arr = shlex.split(mesonintrospect) buildroot = os.environ['MESON_BUILD_ROOT'] subprocess.check_output([*introspect_arr, '--all', buildroot]) muon-v0.4.0/subprojects/meson-tests/common/139 mesonintrospect from scripts/check_env.py0000644000175000017500000000106014751453622030405 0ustar buildbuild#!/usr/bin/env python3 import os import sys import shlex do_print = False if len(sys.argv) > 1: do_print = bool(sys.argv[1]) if 'MESONINTROSPECT' not in os.environ: raise RuntimeError('MESONINTROSPECT not found') mesonintrospect = os.environ['MESONINTROSPECT'] introspect_arr = shlex.split(mesonintrospect) # print(mesonintrospect) # print(introspect_arr) some_executable = introspect_arr[0] if not os.path.isfile(some_executable): raise RuntimeError(f'{mesonintrospect!r} does not exist') if do_print: print(some_executable, end='') muon-v0.4.0/subprojects/meson-tests/common/139 mesonintrospect from scripts/meson.build0000644000175000017500000000054714751453622030261 0ustar buildbuildproject('mesonintrospect from scripts') python = import('python3').find_python() ret = run_command(python, ['check_env.py', '1'], check: false) if ret.returncode() == 0 find_program(ret.stdout()) else message(ret.stdout()) message(ret.stderr()) endif meson.add_postconf_script('check_introspection.py') meson.add_install_script('check_env.py') muon-v0.4.0/subprojects/meson-tests/common/55 exe static shared/0002755000175000017500000000000014751453622023460 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/55 exe static shared/subdir/0002755000175000017500000000000014751453622024750 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/55 exe static shared/subdir/shlib.c0000644000175000017500000000011014751453622026203 0ustar buildbuild#include "exports.h" int DLL_PUBLIC shlibfunc(void) { return 42; } muon-v0.4.0/subprojects/meson-tests/common/55 exe static shared/subdir/meson.build0000644000175000017500000000005214751453622027105 0ustar buildbuildshlib = shared_library('shar', 'shlib.c') muon-v0.4.0/subprojects/meson-tests/common/55 exe static shared/subdir/exports.h0000644000175000017500000000046214751453622026625 0ustar buildbuild#pragma once #if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllexport) #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif muon-v0.4.0/subprojects/meson-tests/common/55 exe static shared/stat2.c0000644000175000017500000000005214751453622024654 0ustar buildbuildint statlibfunc2(void) { return 18; } muon-v0.4.0/subprojects/meson-tests/common/55 exe static shared/meson.build0000644000175000017500000000121314751453622025615 0ustar buildbuildproject('statchain', 'c') subdir('subdir') # Test that -fPIC in c_args is also accepted (on platforms where it's permitted) picflag = [] if not ['darwin', 'windows'].contains(host_machine.system()) picflag = ['-fPIC'] endif statlib2 = static_library('stat2', 'stat2.c', c_args: picflag, pic: false) # Test that pic is needed for both direct and indirect static library # dependencies of shared libraries (on Linux and BSD) statlib = static_library('stat', 'stat.c', link_with: [shlib, statlib2], pic: true) shlib2 = shared_library('shr2', 'shlib2.c', link_with: statlib) exe = executable('prog', 'prog.c', link_with: shlib2) test('runtest', exe) muon-v0.4.0/subprojects/meson-tests/common/55 exe static shared/stat.c0000644000175000017500000000016014751453622024572 0ustar buildbuild#include "subdir/exports.h" int shlibfunc(void); int DLL_PUBLIC statlibfunc(void) { return shlibfunc(); } muon-v0.4.0/subprojects/meson-tests/common/55 exe static shared/shlib2.c0000644000175000017500000000023414751453622025004 0ustar buildbuild#include "subdir/exports.h" int statlibfunc(void); int statlibfunc2(void); int DLL_PUBLIC shlibfunc2(void) { return statlibfunc() - statlibfunc2(); } muon-v0.4.0/subprojects/meson-tests/common/55 exe static shared/prog.c0000644000175000017500000000025414751453622024572 0ustar buildbuildint shlibfunc2(void); int statlibfunc(void); int main(void) { if (statlibfunc() != 42) return 1; if (shlibfunc2() != 24) return 1; return 0; } muon-v0.4.0/subprojects/meson-tests/common/133 c cpp and asm/0002755000175000017500000000000014751453622022526 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/133 c cpp and asm/symbol-underscore.h0000644000175000017500000000017314751453622026352 0ustar buildbuild#if defined(MESON_TEST__UNDERSCORE_SYMBOL) # define SYMBOL_NAME(name) _##name #else # define SYMBOL_NAME(name) name #endif muon-v0.4.0/subprojects/meson-tests/common/133 c cpp and asm/retval-x86.S0000644000175000017500000000033014751453622024564 0ustar buildbuild#include "symbol-underscore.h" .text .globl SYMBOL_NAME(get_retval) /* Only supported on Linux with GAS */ # ifdef __linux__ .type get_retval, %function #endif SYMBOL_NAME(get_retval): xorl %eax, %eax retl muon-v0.4.0/subprojects/meson-tests/common/133 c cpp and asm/main.c0000644000175000017500000000017314751453622023615 0ustar buildbuild#include int get_retval(void); int main(void) { printf("C seems to be working.\n"); return get_retval(); } muon-v0.4.0/subprojects/meson-tests/common/133 c cpp and asm/main.cpp0000644000175000017500000000026514751453622024157 0ustar buildbuild#include extern "C" { int get_retval(void); int get_cval(void); } int main(void) { std::cout << "C++ seems to be working." << std::endl; return get_retval(); } muon-v0.4.0/subprojects/meson-tests/common/133 c cpp and asm/somelib.c0000644000175000017500000000004414751453622024320 0ustar buildbuildint get_cval (void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/133 c cpp and asm/retval-x86_64.S0000644000175000017500000000026214751453622025101 0ustar buildbuild#include "symbol-underscore.h" .text .globl SYMBOL_NAME(get_retval) # ifdef __linux__ .type get_retval, %function #endif SYMBOL_NAME(get_retval): xorl %eax, %eax retq muon-v0.4.0/subprojects/meson-tests/common/133 c cpp and asm/meson.build0000644000175000017500000000156014751453622024670 0ustar buildbuildproject('c cpp and asm', 'c', 'cpp') cpu = host_machine.cpu_family() cc = meson.get_compiler('c') supported_cpus = ['arm', 'x86', 'x86_64'] if not supported_cpus.contains(cpu) error('MESON_SKIP_TEST unsupported cpu:' + cpu) endif if meson.get_compiler('c').get_argument_syntax() == 'msvc' error('MESON_SKIP_TEST MSVC can\'t compile assembly') endif if cc.symbols_have_underscore_prefix() add_project_arguments('-DMESON_TEST__UNDERSCORE_SYMBOL', language: 'assembly') endif test('test-c-asm', executable('c-asm', ['main.c', 'retval-' + cpu + '.S'])) test( 'test-cpp-asm', executable('cpp-asm', ['main.cpp', 'retval-' + cpu + '.S']), ) test( 'test-c-cpp-asm', executable('c-cpp-asm', ['somelib.c', 'main.cpp', 'retval-' + cpu + '.S']), ) test( 'test-cpp-c-asm', executable('cpp-c-asm', ['main.cpp', 'somelib.c', 'retval-' + cpu + '.S']), ) muon-v0.4.0/subprojects/meson-tests/common/133 c cpp and asm/retval-arm.S0000644000175000017500000000026214751453622024722 0ustar buildbuild#include "symbol-underscore.h" .text .globl SYMBOL_NAME(get_retval) # ifdef __linux__ .type get_retval, %function #endif SYMBOL_NAME(get_retval): mov r0, #0 mov pc, lr muon-v0.4.0/subprojects/meson-tests/common/20 global arg/0002755000175000017500000000000014751453622022162 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/20 global arg/prog.cc0000644000175000017500000000032714751453622023440 0ustar buildbuild#ifdef MYTHING #error "Wrong global argument set" #endif #ifndef MYCPPTHING #error "Global argument not set" #endif #ifndef MYCANDCPPTHING #error "Global argument not set" #endif int main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/20 global arg/meson.build0000644000175000017500000000070314751453622024322 0ustar buildbuildproject('global arg test', 'cpp', 'c') add_global_arguments('-DMYTHING', language: 'c') add_global_arguments('-DMYCPPTHING', language: 'cpp') add_global_arguments('-DGLOBAL_HOST', language: 'c') build_c_args = ['-DARG_BUILD'] c_args = ['-DARG_HOST'] add_global_arguments('-DMYCANDCPPTHING', language: ['c', 'cpp']) exe2 = executable('prog2', 'prog.c', c_args: c_args) exe3 = executable('prog3', 'prog.cc') test('prog2', exe2) test('prog3', exe3) muon-v0.4.0/subprojects/meson-tests/common/20 global arg/prog.c0000644000175000017500000000146614751453622023302 0ustar buildbuild#ifndef MYTHING #error "Global argument not set" #endif #ifdef MYCPPTHING #error "Wrong global argument set" #endif #ifndef MYCANDCPPTHING #error "Global argument not set" #endif #if !defined(GLOBAL_HOST) && !defined(GLOBAL_BUILD) #error "Neither global_host nor global_build is set." #endif #if defined(GLOBAL_HOST) && defined(GLOBAL_BUILD) #error "Both global build and global host set." #endif #ifdef GLOBAL_BUILD #ifndef ARG_BUILD #error "Global is build but arg_build is not set." #endif #ifdef ARG_HOST #error "Global is build but arg host is set." #endif #endif #ifdef GLOBAL_HOST #ifndef ARG_HOST #error "Global is host but arg_host is not set." #endif #ifdef ARG_BUILD #error "Global is host but arg_build is set." #endif #endif int main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/162 subdir if_found/0002755000175000017500000000000014751453622023321 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/162 subdir if_found/subdir/0002755000175000017500000000000014751453622024611 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/162 subdir if_found/subdir/meson.build0000644000175000017500000000001514751453622026745 0ustar buildbuildvariable = 5 muon-v0.4.0/subprojects/meson-tests/common/162 subdir if_found/nonexisting_dir/0002755000175000017500000000000014751453622026524 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/162 subdir if_found/nonexisting_dir/meson.build0000644000175000017500000000033614751453622030666 0ustar buildbuild# muon analyze complains that this directory does not exist. I think that is # good since in real meson.build files there it is highly likely that this # would be a real error. assert(false, 'should not have subdir\'d') muon-v0.4.0/subprojects/meson-tests/common/162 subdir if_found/meson.build0000644000175000017500000000043314751453622025461 0ustar buildbuildproject('subdir if found') found_dep = declare_dependency() not_found_dep = dependency('nonexisting', required: false) subdir('nonexisting_dir', if_found: not_found_dep) variable = 3 subdir('subdir', if_found: found_dep) assert(variable == 5, 'Subdir was not properly entered.') muon-v0.4.0/subprojects/meson-tests/common/104 has arg/0002755000175000017500000000000014751453622021560 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/104 has arg/meson.build0000644000175000017500000000633314751453622023725 0ustar buildbuildproject('has arg', 'c', 'cpp') cc = meson.get_compiler('c') cpp = meson.get_compiler('cpp') if cc.get_id() == 'msvc' is_arg = '/O2' useless = '/DFOO' else is_arg = '-O2' useless = '-DFOO' endif isnt_arg = '-fiambroken' assert(cc.has_argument(is_arg), 'Arg that should have worked does not work.') assert(not cc.has_argument(isnt_arg), 'Arg that should be broken is not.') assert(cpp.has_argument(is_arg), 'Arg that should have worked does not work.') assert(not cpp.has_argument(isnt_arg), 'Arg that should be broken is not.') assert( cc.get_supported_arguments([is_arg, isnt_arg, useless]) == [is_arg, useless], 'Arg filtering returned different result.', ) assert( cpp.get_supported_arguments([is_arg, isnt_arg, useless]) == [is_arg, useless], 'Arg filtering returned different result.', ) # Have useless at the end to ensure that the search goes from front to back. l1 = cc.first_supported_argument([isnt_arg, is_arg, isnt_arg, useless]) l2 = cc.first_supported_argument(isnt_arg, isnt_arg, isnt_arg) assert(l1.length() == 1, 'First supported returned wrong result.') assert(l1.get(0) == is_arg, 'First supported returned wrong argument.') assert(l2.length() == 0, 'First supported did not return empty array.') l1 = cpp.first_supported_argument([isnt_arg, is_arg, isnt_arg, useless]) l2 = cpp.first_supported_argument(isnt_arg, isnt_arg, isnt_arg) assert(l1.length() == 1, 'First supported returned wrong result.') assert(l1.get(0) == is_arg, 'First supported returned wrong argument.') assert(l2.length() == 0, 'First supported did not return empty array.') if cc.get_id() == 'gcc' pre_arg = '-Wformat' # NOTE: We have special handling for -Wno-foo args because gcc silently # ignores unknown -Wno-foo args unless you pass -Werror, so for this test, we # pass it as two separate arguments. anti_pre_arg = ['-W', 'no-format'] arg = '-Werror=format-security' assert( not cc.has_multi_arguments([anti_pre_arg, arg]), 'Arg that should be broken is not.', ) assert( cc.has_multi_arguments(pre_arg), 'Arg that should have worked does not work.', ) assert( cc.has_multi_arguments([pre_arg, arg]), 'Arg that should have worked does not work.', ) # TODO: Test that gcc correctly errors out on unknown -Wno flags # These tests are failing because gcc has no option to turn fatal warnings # for unknown -Wno flags. meson has a very dirty hack[1] to fix this in # their code. # # [1] https://github.com/mesonbuild/meson/pull/2284 # assert( # not cc.has_argument('-Wno-lol-meson-test-flags'), # 'should error out on unknown -Wno args', # ) # assert( # not cc.has_multi_arguments(['-Wno-pragmas', '-Wno-lol-meson-test-flags']), # 'should error out even if some -Wno args are valid', # ) endif if cc.get_id() == 'clang' and cc.version().version_compare('<=4.0.0') # 4.0.0 does not support -fpeel-loops. Newer versions may. # Please adjust above version number as new versions of clang are released. notyet_arg = '-fpeel-loops' assert( not cc.has_argument(notyet_arg), 'Arg that should be broken (unless clang added support recently) is not.', ) endif muon-v0.4.0/subprojects/meson-tests/common/190 install_mode/0002755000175000017500000000000014751453622022732 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/190 install_mode/trivial.c0000644000175000017500000000013614751453622024546 0ustar buildbuild#include int main(void) { printf("Trivial test is working.\n"); return 0; } muon-v0.4.0/subprojects/meson-tests/common/190 install_mode/config.h.in0000644000175000017500000000026614751453622024757 0ustar buildbuild#define MESSAGE "@var@" // different than meson: undefined substitutions are errors #define OTHER "@other@" "@second@" "\@empty\@" #mesondefine BE_TRUE #mesondefine SHOULD_BE_UNDEF muon-v0.4.0/subprojects/meson-tests/common/190 install_mode/meson.build0000644000175000017500000000316314751453622025075 0ustar buildbuildproject( 'install_mode test', 'c', default_options: ['install_umask=027', 'libdir=libtest'], ) if build_machine.system() == 'windows' error('MESON_SKIP_TEST: install_mode test requires a Unix-like OS') endif # confirm no regressions in install_data install_data( 'runscript.sh', install_dir: get_option('bindir'), install_mode: ['rwxr-sr-x', 'root', 0], ) # confirm no regressions in install_subdir install_subdir( 'sub1', install_dir: 'share', install_mode: ['rwxr-x--x', 'root'], ) install_subdir('sub2', install_dir: 'share') # test install_mode in configure_file conf = configuration_data() conf.set('var', 'mystring') conf.set('other', 'string 2') conf.set('second', ' bonus') conf.set('BE_TRUE', true) configure_file( input: 'config.h.in', output: 'config.h', configuration: conf, install_dir: 'include', install_mode: 'rw-rwSr--', ) # test install_mode in custom_target custom_target( 'bindat', output: 'data.dat', input: 'data_source.txt', command: ['cp', '@INPUT@', '@OUTPUT@'], install: true, install_dir: 'subdir', install_mode: 'rw-rwSr--', ) # test install_mode in install_headers install_headers('rootdir.h', install_mode: 'r--r--r--') # test install_mode in install_man install_man('foo.1', install_mode: 'r--r--r--') # test install_mode in executable executable( 'trivialprog', sources: 'trivial.c', install: true, build_rpath: meson.current_build_dir(), install_mode: ['rwxr-sr-x', 'root', 'root'], ) # test install_mode in static_library static_library('stat', 'stat.c', install: true, install_mode: ['rw---Sr--']) muon-v0.4.0/subprojects/meson-tests/common/190 install_mode/test.json0000644000175000017500000000135314751453622024604 0ustar buildbuild{ "installed": [ {"type": "file", "file": "usr/bin/runscript.sh"}, {"type": "exe", "file": "usr/bin/trivialprog"}, {"type": "pdb", "file": "usr/bin/trivialprog"}, {"type": "file", "file": "usr/include/config.h"}, {"type": "file", "file": "usr/include/rootdir.h"}, {"type": "file", "file": "usr/libtest/libstat.a"}, {"type": "file", "file": "usr/share/man/man1/foo.1"}, {"type": "file", "file": "usr/share/sub1/second.dat"}, {"type": "file", "file": "usr/share/sub2/stub"}, {"type": "file", "file": "usr/subdir/data.dat"} ], "do_not_set_opts": ["libdir"], "stdout": [ { "line": ".* DEPRECATION: install_mode with the sticky bit on a file", "match": "re", "count": 3 } ] } muon-v0.4.0/subprojects/meson-tests/common/190 install_mode/stat.c0000644000175000017500000000003714751453622024047 0ustar buildbuildint func(void) { return 933; } muon-v0.4.0/subprojects/meson-tests/common/190 install_mode/data_source.txt0000644000175000017500000000004014751453622025754 0ustar buildbuildThis is a text only input file. muon-v0.4.0/subprojects/meson-tests/common/190 install_mode/runscript.sh0000644000175000017500000000003414751453622025312 0ustar buildbuild#!/bin/sh echo "Runscript" muon-v0.4.0/subprojects/meson-tests/common/190 install_mode/rootdir.h0000644000175000017500000000007614751453622024566 0ustar buildbuild/* This header goes to include dir root. */ int root_func(); muon-v0.4.0/subprojects/meson-tests/common/190 install_mode/sub2/0002755000175000017500000000000014751453622023605 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/190 install_mode/sub2/stub0000644000175000017500000000000014751453622024471 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/190 install_mode/sub1/0002755000175000017500000000000014751453622023604 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/190 install_mode/sub1/second.dat0000644000175000017500000000006614751453622025551 0ustar buildbuildTest that multiple install_subdirs meld their results.muon-v0.4.0/subprojects/meson-tests/common/190 install_mode/foo.10000644000175000017500000000007014751453622023572 0ustar buildbuildthis is a man page of foo.1 its contents are irrelevant muon-v0.4.0/subprojects/meson-tests/common/121 object only target/0002755000175000017500000000000014751453622023731 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/121 object only target/source.c0000644000175000017500000000005114751453622025367 0ustar buildbuildint func1_in_obj(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/121 object only target/source2.c0000644000175000017500000000005114751453622025451 0ustar buildbuildint func2_in_obj(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/121 object only target/meson.build0000644000175000017500000000272614751453622026100 0ustar buildbuildproject('object generator', 'c') if meson.backend() == 'xcode' error( 'MESON_SKIP_TEST object-only libraries not supported in Xcode. Patches welcome.', ) endif # FIXME: Note that this will not add a dependency to the compiler executable. # Code will not be rebuilt if it changes. comp = find_program('obj_generator.py') if host_machine.system() == 'windows' ext = '.obj' else ext = '.o' endif cc = meson.get_compiler('c').cmd_array().get(-1) # Generate an object file with configure_file to mimic prebuilt objects # provided by the source tree source1 = configure_file( input: 'source.c', output: 'source' + ext, command: [ comp, cc, files('source.c'), join_paths(meson.current_build_dir(), 'source' + ext), ], ) obj = static_library('obj', objects: source1) # Generate an object file manually. gen = generator(comp, output: '@BASENAME@' + ext, arguments: [cc, '@INPUT@', '@OUTPUT@']) generated = gen.process(['source2.c']) shr = shared_library('shr', generated, vs_module_defs: 'source2.def') # Generate an object file with indexed OUTPUT replacement. gen2 = generator(comp, output: '@BASENAME@' + ext, arguments: [cc, '@INPUT@', '@OUTPUT0@']) generated2 = gen2.process(['source3.c']) stc = static_library('stc', generated2) subdir('objdir') e = executable( 'prog', 'prog.c', link_with: [obj, shr, stc, subdirfilebuilt_obj, subdirfile_obj, subdirstr_obj], install: true, ) test('objgen', e) muon-v0.4.0/subprojects/meson-tests/common/121 object only target/test.json0000644000175000017500000000016214751453622025600 0ustar buildbuild{ "installed": [ {"type": "exe", "file": "usr/bin/prog"}, {"type": "pdb", "file": "usr/bin/prog"} ] } muon-v0.4.0/subprojects/meson-tests/common/121 object only target/obj_generator.py0000755000175000017500000000115214751453622027123 0ustar buildbuild#!/usr/bin/env python3 # Mimic a binary that generates an object file (e.g. windres). import sys, subprocess if __name__ == '__main__': if len(sys.argv) != 4: print(sys.argv[0], 'compiler input_file output_file') sys.exit(1) compiler = sys.argv[1] ifile = sys.argv[2] ofile = sys.argv[3] if compiler.endswith('cl'): cmd = [compiler, '/nologo', '/MDd', '/Fo' + ofile, '/c', ifile] elif sys.platform == 'sunos5': cmd = [compiler, '-fpic', '-c', ifile, '-o', ofile] else: cmd = [compiler, '-c', ifile, '-o', ofile] sys.exit(subprocess.call(cmd)) muon-v0.4.0/subprojects/meson-tests/common/121 object only target/source3.c0000644000175000017500000000005114751453622025452 0ustar buildbuildint func3_in_obj(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/121 object only target/source2.def0000644000175000017500000000003514751453622025767 0ustar buildbuildEXPORTS func2_in_obj muon-v0.4.0/subprojects/meson-tests/common/121 object only target/prog.c0000644000175000017500000000043514751453622025044 0ustar buildbuildint func1_in_obj(void); int func2_in_obj(void); int func3_in_obj(void); int func4_in_obj(void); int func5_in_obj(void); int func6_in_obj(void); int main(void) { return func1_in_obj() + func2_in_obj() + func3_in_obj() + func4_in_obj() + func5_in_obj() + func6_in_obj(); } muon-v0.4.0/subprojects/meson-tests/common/121 object only target/objdir/0002755000175000017500000000000014751453622025202 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/121 object only target/objdir/source5.c0000644000175000017500000000005114751453622026725 0ustar buildbuildint func5_in_obj(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/121 object only target/objdir/meson.build0000644000175000017500000000175114751453622027346 0ustar buildbuild#mesonlib.File built source4 = configure_file( input: 'source4.c', output: 'source4' + ext, command: [ comp, cc, files('source4.c'), join_paths(meson.current_build_dir(), 'source4' + ext), ], ) subdirfilebuilt_obj = static_library('subdirfilebuilt_obj', objects: source4) #mesonlib.File not built configure_file( input: 'source5.c', output: 'source5' + ext, command: [ comp, cc, files('source5.c'), join_paths(meson.current_build_dir(), 'source5' + ext), ], ) subdirfile_obj = static_library( 'subdirfile_obj', objects: files(meson.current_build_dir() / 'source5' + ext), ) #str configure_file( input: 'source6.c', output: 'source6' + ext, command: [ comp, cc, files('source6.c'), join_paths(meson.current_build_dir(), 'source6' + ext), ], ) subdirstr_obj = static_library('subdirstr_obj', objects: meson.current_build_dir() / 'source6' + ext) muon-v0.4.0/subprojects/meson-tests/common/121 object only target/objdir/source4.c0000644000175000017500000000005114751453622026724 0ustar buildbuildint func4_in_obj(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/121 object only target/objdir/source6.c0000644000175000017500000000005114751453622026726 0ustar buildbuildint func6_in_obj(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/114 skip/0002755000175000017500000000000014751453622021222 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/114 skip/meson.build0000644000175000017500000000010714751453622023360 0ustar buildbuildproject('skip') error('MESON_SKIP_TEST this test is always skipped.') muon-v0.4.0/subprojects/meson-tests/common/12 data/0002755000175000017500000000000014751453622021102 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/12 data/to_be_renamed_1.txt0000644000175000017500000000000014751453622024632 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/12 data/subprojects/0002755000175000017500000000000014751453622023445 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/12 data/subprojects/moredata/0002755000175000017500000000000014751453622025241 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/12 data/subprojects/moredata/meson.build0000644000175000017500000000005614751453622027402 0ustar buildbuildproject('moredata') install_data('data.txt') muon-v0.4.0/subprojects/meson-tests/common/12 data/subprojects/moredata/data.txt0000644000175000017500000000000114751453622026700 0ustar buildbuild muon-v0.4.0/subprojects/meson-tests/common/12 data/to_be_renamed_3.txt0000644000175000017500000000000014751453622024634 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/12 data/subdir/0002755000175000017500000000000014751453622022372 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/12 data/subdir/data.txt0000644000175000017500000000000014751453622024030 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/12 data/fileobject_datafile.dat0000644000175000017500000000007114751453622025527 0ustar buildbuildThis is a data file that is installed via a File object. muon-v0.4.0/subprojects/meson-tests/common/12 data/somefile.txt0000644000175000017500000000000014751453622023432 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/12 data/meson.build0000644000175000017500000000221314751453622023240 0ustar buildbuildproject('data install test', default_options: ['install_umask=preserve']) install_data(sources: 'datafile.dat', install_dir: 'share/progname') # Some file in /etc that is only read-write by root; add a sticky bit for testing install_data( sources: 'etcfile.dat', install_dir: '/etc', install_mode: 'rw-------', ) # Some script that needs to be executable by the group install_data( 'runscript.sh', install_dir: get_option('bindir'), install_mode: ['rwxr-sr-x', 'root', 0], ) install_data( files('fileobject_datafile.dat'), install_dir: 'share/progname', install_mode: [false, false, 0], ) install_data(files('somefile.txt')) subdir('vanishing') install_data(sources: 'vanishing/vanishing2.dat', install_dir: 'share/progname') install_data(sources: 'to_be_renamed_1.txt', rename: 'renamed file.txt') install_data( sources: ['vanishing/to_be_renamed_2.txt', 'to_be_renamed_3.txt'], install_dir: 'share/renamed', rename: ['renamed 2.txt', 'renamed 3.txt'], ) install_data(sources: 'to_be_renamed_4.txt', rename: 'some/nested/path.txt') install_data('subdir/data.txt', preserve_path: true) subproject('moredata') muon-v0.4.0/subprojects/meson-tests/common/12 data/test.json0000644000175000017500000000160714751453622022756 0ustar buildbuild{ "installed": [ {"type": "file", "file": "usr/share/progname/datafile.dat"}, {"type": "file", "file": "usr/share/progname/fileobject_datafile.dat"}, {"type": "file", "file": "usr/share/progname/vanishing.dat"}, {"type": "file", "file": "usr/share/progname/vanishing2.dat"}, {"type": "file", "file": "usr/share/data install test/renamed file.txt"}, {"type": "file", "file": "usr/share/data install test/somefile.txt"}, {"type": "file", "file": "usr/share/data install test/some/nested/path.txt"}, {"type": "file", "file": "usr/share/renamed/renamed 2.txt"}, {"type": "file", "file": "usr/share/renamed/renamed 3.txt"}, {"type": "file", "file": "etc/etcfile.dat"}, {"type": "file", "file": "usr/bin/runscript.sh"}, {"type": "file", "file": "usr/share/moredata/data.txt"}, {"type": "file", "file": "usr/share/data install test/subdir/data.txt"} ] } muon-v0.4.0/subprojects/meson-tests/common/12 data/to_be_renamed_4.txt0000644000175000017500000000000014751453622024635 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/12 data/runscript.sh0000644000175000017500000000003414751453622023462 0ustar buildbuild#!/bin/sh echo "Runscript" muon-v0.4.0/subprojects/meson-tests/common/12 data/vanishing/0002755000175000017500000000000014751453622023070 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/12 data/vanishing/to_be_renamed_2.txt0000644000175000017500000000000014751453622026621 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/12 data/vanishing/vanishing.dat0000644000175000017500000000006714751453622025551 0ustar buildbuildThis is a data file to be installed in a subdirectory. muon-v0.4.0/subprojects/meson-tests/common/12 data/vanishing/meson.build0000644000175000017500000000010614751453622025225 0ustar buildbuildinstall_data(sources: 'vanishing.dat', install_dir: 'share/progname') muon-v0.4.0/subprojects/meson-tests/common/12 data/vanishing/vanishing2.dat0000644000175000017500000000023614751453622025631 0ustar buildbuildThis is a data file to be installed in a subdirectory. It is installed from a different subdir to test that the installer strips the source tree dir prefix. muon-v0.4.0/subprojects/meson-tests/common/12 data/datafile.dat0000644000175000017500000000002414751453622023337 0ustar buildbuildthis is a data file muon-v0.4.0/subprojects/meson-tests/common/12 data/etcfile.dat0000644000175000017500000000004014751453622023177 0ustar buildbuildThis goes into /etc/etcfile.dat muon-v0.4.0/subprojects/meson-tests/common/105 generatorcustom/0002755000175000017500000000000014751453622023475 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/105 generatorcustom/res2.txt0000644000175000017500000000000514751453622025102 0ustar buildbuildres2 muon-v0.4.0/subprojects/meson-tests/common/105 generatorcustom/main.c0000644000175000017500000000021214751453622024556 0ustar buildbuild#include #include "alltogether.h" int main(void) { printf("%s - %s - %s - %s\n", res1, res2, res3, res4); return 0; } muon-v0.4.0/subprojects/meson-tests/common/105 generatorcustom/gen-resx.py0000755000175000017500000000020214751453622025572 0ustar buildbuild#!/usr/bin/env python3 import sys ofile = sys.argv[1] num = sys.argv[2] with open(ofile, 'w') as f: f.write(f'res{num}\n') muon-v0.4.0/subprojects/meson-tests/common/105 generatorcustom/host.c0000644000175000017500000000016314751453622024614 0ustar buildbuild#include "res1-cpp.h" int main(void) { #ifdef res1 return 0; #else return 1; #endif } muon-v0.4.0/subprojects/meson-tests/common/105 generatorcustom/gen.py0000755000175000017500000000036014751453622024620 0ustar buildbuild#!/usr/bin/env python3 import sys ifile = sys.argv[1] ofile = sys.argv[2] with open(ifile) as f: resname = f.readline().strip() templ = 'const char %s[] = "%s";\n' with open(ofile, 'w') as f: f.write(templ % (resname, resname)) muon-v0.4.0/subprojects/meson-tests/common/105 generatorcustom/meson.build0000644000175000017500000000215614751453622025641 0ustar buildbuildproject('generatorcustom', 'c') creator = find_program('gen.py') catter = find_program('catter.py') gen_resx = find_program('gen-resx.py') gen = generator(creator, output: '@BASENAME@.h', arguments: ['@INPUT@', '@OUTPUT@']) res3 = custom_target('gen-res3', output: 'res3.txt', command: [gen_resx, '@OUTPUT@', '3']) res4 = custom_target('gen-res4', output: 'res4.txt', command: [gen_resx, '@OUTPUT@', '4']) hs = gen.process('res1.txt', 'res2.txt', res3, res4[0]) allinone = custom_target( 'alltogether', input: hs, output: 'alltogether.h', command: [catter, '@INPUT@', '@OUTPUT@'], ) proggie = executable('proggie', 'main.c', allinone) test('proggie', proggie) # specifically testing that cross binaries are run with an exe_wrapper if meson.can_run_host_binaries() gen_tool = executable('generator', 'gen.c', native: false) c_gen = generator( gen_tool, output: '@BASENAME@-cpp.h', arguments: ['@INPUT@', '@OUTPUT@'], ) hs2 = c_gen.process('res1.txt') host_exe = executable('host_test', 'host.c', hs2, native: false) test('compiled generator', host_exe) endif muon-v0.4.0/subprojects/meson-tests/common/105 generatorcustom/catter.py0000755000175000017500000000044414751453622025334 0ustar buildbuild#!/usr/bin/env python3 import sys output = sys.argv[-1] inputs = sys.argv[1:-1] with open(output, 'w') as ofile: ofile.write('#pragma once\n') for i in inputs: with open(i) as ifile: content = ifile.read() ofile.write(content) ofile.write('\n') muon-v0.4.0/subprojects/meson-tests/common/105 generatorcustom/res1.txt0000644000175000017500000000000514751453622025101 0ustar buildbuildres1 muon-v0.4.0/subprojects/meson-tests/common/105 generatorcustom/gen.c0000644000175000017500000000176314751453622024417 0ustar buildbuild/* SPDX-License-Identifier: Apache-2.0 */ /* Copyright © 2023 Intel Corporation */ #include #include int main(int argc, const char ** argv) { if (argc != 3) { fprintf(stderr, "%s %i %s\n", "Got incorrect number of arguments, got ", argc - 1, ", but expected 2"); exit(1); } FILE * input, * output; if ((input = fopen(argv[1], "rb")) == NULL) { exit(1); } if ((output = fopen(argv[2], "wb")) == NULL) { exit(1); } fprintf(output, "#pragma once\n"); fprintf(output, "#define "); int bytes_copied = 0; int c; while((c = fgetc(input)) != EOF) { if(fputc(c, output) == EOF) { fprintf(stderr, "Writing to output file failed.\n"); return 1; } if(++bytes_copied > 10000) { fprintf(stderr, "File copy stuck in an eternal loop!\n"); return 1; } } fputc('\n', output); fclose(input); fclose(output); return 0; } muon-v0.4.0/subprojects/meson-tests/common/239 includedir violation/0002755000175000017500000000000014751453622024373 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/239 includedir violation/subprojects/0002755000175000017500000000000014751453622026736 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/239 includedir violation/subprojects/sub/0002755000175000017500000000000014751453622027527 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/239 includedir violation/subprojects/sub/meson.build0000644000175000017500000000005514751453622031667 0ustar buildbuildproject('subproj') include_directories('.') muon-v0.4.0/subprojects/meson-tests/common/239 includedir violation/subprojects/sub/include/0002755000175000017500000000000014751453622031152 5ustar buildbuild././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/239 includedir violation/subprojects/sub/include/placeholder.hmuon-v0.4.0/subprojects/meson-tests/common/239 includedir violation/subprojects/sub/include/placehol0000644000175000017500000000012714751453622032662 0ustar buildbuild#pragma once // Git cannot handle empty directories, so there must be something here. muon-v0.4.0/subprojects/meson-tests/common/239 includedir violation/meson.build0000644000175000017500000000051714751453622026536 0ustar buildbuildproject('foo') # It is fine to include the root source dir include_directories('.') subproject('sub') # This is here rather than in failing because this needs a # transition period to avoid breaking existing projects. # Once this becomes an error, move this under failing tests. inc = include_directories('subprojects/sub/include') muon-v0.4.0/subprojects/meson-tests/common/239 includedir violation/test.json0000644000175000017500000000021314751453622026237 0ustar buildbuild{ "stdout": [ { "line": ".*WARNING: include_directories sandbox violation!", "match": "re", "count": 1 } ] } muon-v0.4.0/subprojects/meson-tests/common/204 line continuation/0002755000175000017500000000000014751453622023676 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/204 line continuation/meson.build0000644000175000017500000000040214751453622026032 0ustar buildbuildproject('line continuation') a = 1 b = 2 c = a + b assert(c == 3, 'Line continuation is not working') d = a + b assert(d == 3, 'Line continuation is not working') if a == 1 and b == 3 error('Line continuation in "if" condition is not working') endif muon-v0.4.0/subprojects/meson-tests/common/177 subdir_done/0002755000175000017500000000000014751453622022562 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/177 subdir_done/meson.build0000644000175000017500000000040114751453622024715 0ustar buildbuild# Should run, even though main.cpp does not exist and we call error in the last line. # subdir_done jumps to end, so both lines are not executed. project('example exit') if true subdir_done() endif executable('main', 'main.cpp') error('Unreachable') muon-v0.4.0/subprojects/meson-tests/common/223 persubproject options/0002755000175000017500000000000014751453622024620 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/223 persubproject options/subprojects/0002755000175000017500000000000014751453622027163 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/223 persubproject options/subprojects/sub2/0002755000175000017500000000000014751453622030036 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/223 persubproject options/subprojects/sub2/foo.cpp0000644000175000017500000000016014751453622031320 0ustar buildbuild#include class Dummy { int x; }; int foo() { auto obj = std::make_unique(); return 0; } muon-v0.4.0/subprojects/meson-tests/common/223 persubproject options/subprojects/sub2/meson.build0000644000175000017500000000134114751453622032175 0ustar buildbuildproject( 'sub2', 'c', 'cpp', default_options: ['default_library=shared', 'werror=false', 'cpp_std=c++14'], ) assert( get_option('default_library') == 'static', 'Parent should override default_library', ) assert(not get_option('werror')) assert(get_option('cpp_std') == 'c++14') # If it doesn't build only a static library, it would make target name clash. library('lib1', 'foo.c') shared_library('lib1', 'foo.c') # Parent project is c++11 but this one uses c++14 to build. libcpp14 = library('lib2', 'foo.cpp') meson.override_dependency('libcpp14', declare_dependency(link_with: libcpp14)) # Compiler checks should be using c++14 as well cxx = meson.get_compiler('cpp') assert(cxx.compiles(files('foo.cpp'))) muon-v0.4.0/subprojects/meson-tests/common/223 persubproject options/subprojects/sub2/foo.c0000644000175000017500000000015514751453622030764 0ustar buildbuildint foo(void); #ifdef __GNUC__ #warning This should not produce error #endif int foo(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/223 persubproject options/subprojects/sub1/0002755000175000017500000000000014751453622030035 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/223 persubproject options/subprojects/sub1/meson.build0000644000175000017500000000060714751453622032200 0ustar buildbuildproject('sub1', 'c', 'cpp', default_options: ['warning_level=0']) assert( get_option('default_library') == 'both', 'Should inherit parent project default_library', ) assert(get_option('warning_level') == '0') assert(get_option('cpp_std') == 'c++11') # Check it build both by calling a method only both_libraries target implement lib = library('lib1', 'foo.c') lib.get_static_lib() muon-v0.4.0/subprojects/meson-tests/common/223 persubproject options/subprojects/sub1/foo.c0000644000175000017500000000033314751453622030761 0ustar buildbuildint foo(void); int foo(void) { /* This is built with -Werror, it would error if warning_level=3 was inherited * from main project and not overridden by this subproject's default_options. */ int x; return 0; } muon-v0.4.0/subprojects/meson-tests/common/223 persubproject options/main.cpp0000644000175000017500000000005514751453622026246 0ustar buildbuildint foo(); int main(void) { return foo(); } muon-v0.4.0/subprojects/meson-tests/common/223 persubproject options/meson.build0000644000175000017500000000137514751453622026766 0ustar buildbuildproject( 'persubproject options', 'c', 'cpp', default_options: [ 'default_library=both', 'werror=true', 'warning_level=3', 'cpp_std=c++11', ], ) assert( get_option('default_library') == 'both', 'Parent default_library should be "both"', ) assert(get_option('werror')) assert(get_option('warning_level') == '3') assert(get_option('cpp_std') == 'c++11') # Check it build both by calling a method only both_libraries target implement lib = library('lib1', 'foo.c') lib.get_static_lib() subproject('sub1') libcpp14_dep = dependency('libcpp14', fallback: 'sub2', default_options: ['default_library=static']) exe = executable('test1', 'main.cpp', dependencies: libcpp14_dep) test('mixing-cpp-version', exe) muon-v0.4.0/subprojects/meson-tests/common/223 persubproject options/test.json0000644000175000017500000000015614751453622026472 0ustar buildbuild{ "matrix": { "options": { "default_library": [ { "val": "both" } ] } } } muon-v0.4.0/subprojects/meson-tests/common/223 persubproject options/foo.c0000644000175000017500000000005614751453622025546 0ustar buildbuildint foo(void); int foo(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/61 number arithmetic/0002755000175000017500000000000014751453622023577 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/61 number arithmetic/meson.build0000644000175000017500000000366614751453622025752 0ustar buildbuildproject('number arithmetic') if 6 + 4 != 10 error('Number addition is broken') endif if 6 - 4 != 2 error('Number subtraction is broken') endif if 6 * 4 != 24 error('Number multiplication is broken') endif if 16 / 4 != 4 error('Number division is broken') endif #if (1 / 3) * 3 != 1 # error('Float interconversion broken') #endif if (5 / 3) * 3 != 3 error('Integer division is broken') endif assert((5 % 2) == 1, 'Integer modulo (odd) is broken') assert((4 % 2) == 0, 'Integer modulo (even) is broken') if 2 * 1 % 2 != 0 error('Modulo precedence with multiplication is broken') endif if 2 + 1 % 2 != 3 error('Modulo precedence with addition is broken') endif if 9 / 9 % 2 != 1 error('Modulo precedence with division is broken') endif if 9 - 9 % 2 != 8 error('Modulo precedence with subtraction is broken') endif assert(2.is_even(), 'int is_even() broken for even value') assert(not (2.is_odd()), 'int is_odd() broken for even value') assert(not (3.is_even()), 'int is_even() broken for odd value') assert(3.is_odd(), 'int is_odd() broken for odd value') assert(3 < 4, 'Lt broken') assert(not (4 < 3), 'Lt broken') assert(3 <= 4, 'Lte broken') assert(not (4 <= 3), 'Lte broken') assert(3 <= 3, 'Lte broken') assert(4 > 3, 'Gt broken') assert(not (3 > 4), 'Gt broken') assert(4 >= 3, 'Gte broken') assert(not (3 >= 4), 'Gte broken') assert(3 >= 3, 'Gte broken') assert(true.to_int() == 1, 'bool to_int() broken') assert(false.to_int() == 0, 'bool to_int() broken') hex_255 = 0xff hex2_255 = 0XFF assert(hex_255 == 255, 'Hex parsing is broken.') assert(hex2_255 == 255, 'Uppercase hex parsing is broken.') bin_123 = 0b1111011 bin2_123 = 0B1111011 assert(bin_123 == 123, 'Bin number parsing is broken.') assert(bin2_123 == 123, 'Uppercase bin number parsing is broken.') oct_493 = 0o755 oct2_493 = 0O755 assert(oct_493 == 493, 'Oct number parsing is broken.') assert(oct2_493 == 493, 'Uppercase oct number parsing is broken.') muon-v0.4.0/subprojects/meson-tests/common/52 object generator/0002755000175000017500000000000014751453622023412 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/52 object generator/source.c0000644000175000017500000000005114751453622025050 0ustar buildbuildint func1_in_obj(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/52 object generator/source2.c0000644000175000017500000000005114751453622025132 0ustar buildbuildint func2_in_obj(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/52 object generator/meson.build0000644000175000017500000000233514751453622025555 0ustar buildbuildproject('object generator', 'c') python = find_program('python3', required: false) if not python.found() python = find_program('python') endif # Note that this will not add a dependency to the compiler executable. # Code will not be rebuilt if it changes. comp = '@0@/@1@'.format(meson.current_source_dir(), 'obj_generator.py') if host_machine.system() == 'windows' outputname = '@BASENAME@.obj' else outputname = '@BASENAME@.o' endif cc = meson.get_compiler('c').cmd_array().get(-1) # Generate an object file manually. gen = generator(python, output: outputname, arguments: [comp, cc, '@INPUT@', '@OUTPUT@']) generated = gen.process(['source.c', 'source2.c']) # Generate an object file with indexed OUTPUT replacement. gen2 = generator(python, output: outputname, arguments: [comp, cc, '@INPUT@', '@OUTPUT0@']) generated2 = gen2.process(['source3.c']) # Generate an object file ending with .o even on Windows. # The VS backend needs to handle .o objects differently from .obj objects. gen3 = generator( python, output: '@BASENAME@.o', arguments: [comp, cc, '@INPUT@', '@OUTPUT@'], ) generated3 = gen3.process(['source4.c']) e = executable('prog', 'prog.c', generated, generated2, generated3) test('objgen', e) muon-v0.4.0/subprojects/meson-tests/common/52 object generator/source4.c0000644000175000017500000000005114751453622025134 0ustar buildbuildint func4_in_obj(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/52 object generator/obj_generator.py0000755000175000017500000000101314751453622026600 0ustar buildbuild#!/usr/bin/env python3 # Mimic a binary that generates an object file (e.g. windres). import sys, subprocess if __name__ == '__main__': if len(sys.argv) != 4: print(sys.argv[0], 'compiler input_file output_file') sys.exit(1) compiler = sys.argv[1] ifile = sys.argv[2] ofile = sys.argv[3] if compiler.endswith('cl'): cmd = [compiler, '/nologo', '/MDd', '/Fo' + ofile, '/c', ifile] else: cmd = [compiler, '-c', ifile, '-o', ofile] sys.exit(subprocess.call(cmd)) muon-v0.4.0/subprojects/meson-tests/common/52 object generator/source3.c0000644000175000017500000000005114751453622025133 0ustar buildbuildint func3_in_obj(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/52 object generator/prog.c0000644000175000017500000000030214751453622024516 0ustar buildbuildint func1_in_obj(void); int func2_in_obj(void); int func3_in_obj(void); int func4_in_obj(void); int main(void) { return func1_in_obj() + func2_in_obj() + func3_in_obj() + func4_in_obj(); } muon-v0.4.0/subprojects/meson-tests/common/236 proper args splitting/0002755000175000017500000000000014751453622024503 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/236 proper args splitting/main.c0000644000175000017500000000020314751453622025564 0ustar buildbuild#ifndef FOO # error "FOO is not defined" #endif #ifndef BAR # error "BAR is not defined" #endif int main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/236 proper args splitting/meson.build0000644000175000017500000000016414751453622026644 0ustar buildbuildproject('proper args splitting', 'c') test( 'main', executable( 'main', 'main.c', ), ) muon-v0.4.0/subprojects/meson-tests/common/236 proper args splitting/test.json0000644000175000017500000000015014751453622026347 0ustar buildbuild{ "matrix": { "options": { "c_args": [ { "val": "-DFOO -DBAR" } ] } } } muon-v0.4.0/subprojects/meson-tests/common/178 bothlibraries/0002755000175000017500000000000014751453622023117 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/178 bothlibraries/libfile.c0000644000175000017500000000014014751453622024662 0ustar buildbuild#include "mylib.h" DO_EXPORT int retval = 42; DO_EXPORT int func(void) { return retval; } muon-v0.4.0/subprojects/meson-tests/common/178 bothlibraries/mylib.h0000644000175000017500000000037014751453622024402 0ustar buildbuild#pragma once #ifdef _WIN32 #ifdef STATIC_COMPILATION #define DO_IMPORT extern #else #define DO_IMPORT __declspec(dllimport) #endif #define DO_EXPORT __declspec(dllexport) #else #define DO_IMPORT extern #define DO_EXPORT #endif muon-v0.4.0/subprojects/meson-tests/common/178 bothlibraries/main.c0000644000175000017500000000017514751453622024210 0ustar buildbuild#include "mylib.h" DO_IMPORT int func(void); DO_IMPORT int retval; int main(void) { return func() == retval ? 0 : 1; } muon-v0.4.0/subprojects/meson-tests/common/178 bothlibraries/foo.cpp0000644000175000017500000000024114751453622024401 0ustar buildbuild#include #include "mylib.h" extern "C" { DO_EXPORT int foo(void); } int foo(void) { auto bptr = std::make_shared(0); return *bptr; } muon-v0.4.0/subprojects/meson-tests/common/178 bothlibraries/meson.build0000644000175000017500000000511214751453622025256 0ustar buildbuildproject( 'both libraries linking test', 'c', 'cpp', default_options: ['cpp_std=c++11'], ) both_libs = both_libraries('mylib', 'libfile.c') dep = declare_dependency(link_with: both_libs) exe_shared = executable('prog-shared', 'main.c', link_with: both_libs.get_shared_lib()) exe_static = executable( 'prog-static', 'main.c', c_args: ['-DSTATIC_COMPILATION'], link_with: both_libs.get_static_lib(), ) exe_both = executable('prog-both', 'main.c', link_with: both_libs) exe_dep = executable('prog-dep', 'main.c', dependencies: [dep]) # Try using it in a custom_target custom_target( 'tgt_a', command: [ find_program('./dummy.py'), '@OUTPUT@', both_libs, ], output: ['hello1.txt'], input: [both_libs], ) test('runtest-shared', exe_shared) test('runtest-static', exe_static) test('runtest-both', exe_both) test('runtest-dep', exe_dep) # Same as above, but using build_target() both_libs2 = build_target('mylib2', 'libfile.c', target_type: 'both_libraries') exe_shared2 = executable('prog-shared2', 'main.c', link_with: both_libs2.get_shared_lib()) exe_static2 = executable( 'prog-static2', 'main.c', c_args: ['-DSTATIC_COMPILATION'], link_with: both_libs2.get_static_lib(), ) exe_both2 = executable('prog-both2', 'main.c', link_with: both_libs2) # Test {set,get}_variable set_variable('both_libs2', both_libs) both_libs3 = get_variable('both_libs') # Ensure that calling the build target methods also works assert(both_libs.name() == 'mylib') assert(both_libs2.name() == 'mylib') assert(both_libs3.name() == 'mylib') assert(both_libs2.get_shared_lib().name() == 'mylib') assert(both_libs3.get_static_lib().name() == 'mylib') test('runtest-shared-2', exe_shared2) test('runtest-static-2', exe_static2) test('runtest-both-2', exe_both2) # Regression test: libccpp has both C and C++ sources. The executable only has # C sources. It should still link using the C++ compiler. When using # both_libraries the static has no sources and thus no compilers, resulting in # the executable linking using the C compiler. # https://github.com/Netflix/vmaf/issues/1107 libccpp = both_libraries( 'ccpp', 'foo.cpp', 'libfile.c', cpp_args: ['-std=c++11'], c_static_args: ['-DSTATIC_COMPILATION'], cpp_static_args: ['-DSTATIC_COMPILATION'], ) exe = executable( 'prog-ccpp', 'main2.c', link_with: libccpp.get_static_lib(), c_args: ['-DSTATIC_COMPILATION'], ) test('runtest-ccpp', exe) exe = executable( 'prog-ccpp-shared', 'main2.c', link_with: libccpp.get_shared_lib(), ) test('runtest-ccpp-shared', exe) muon-v0.4.0/subprojects/meson-tests/common/178 bothlibraries/main2.c0000644000175000017500000000023614751453622024270 0ustar buildbuild#include "mylib.h" DO_IMPORT int func(void); DO_IMPORT int foo(void); DO_IMPORT int retval; int main(void) { return func() + foo() == retval ? 0 : 1; } muon-v0.4.0/subprojects/meson-tests/common/178 bothlibraries/dummy.py0000644000175000017500000000024214751453622024620 0ustar buildbuild#!/usr/bin/env python3 from pathlib import Path import sys if __name__ == '__main__': Path(sys.argv[1]).write_text('Hello World\n') raise SystemExit(0) muon-v0.4.0/subprojects/meson-tests/common/257 generated header dep/0002755000175000017500000000000014751453622024164 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/257 generated header dep/meson.build0000644000175000017500000000150714751453622026327 0ustar buildbuildproject('generated header dep', 'c') # Regression test case for a very specific case: # - Uses both_libraries(), or library() with default_library=both. # - A header file is generated by a custom_target() and passed as source. # - A C file that uses that header is passed as a declare_dependency() source. # Under those specific conditions, the static library used to miss an order # dependency on the header file. This happened in GLib: # https://gitlab.gnome.org/GNOME/glib/-/merge_requests/2917. python = find_program('python', 'python3') header = custom_target( output: 'foo.h', capture: true, # works with either python2 or python3 command: [python, '-c', 'print("#define FOO")'], ) sources_dep = declare_dependency(sources: files('foo.c')) both_libraries( 'foo', header, dependencies: sources_dep, ) muon-v0.4.0/subprojects/meson-tests/common/257 generated header dep/foo.c0000644000175000017500000000002114751453622025102 0ustar buildbuild#include "foo.h" muon-v0.4.0/subprojects/meson-tests/common/16 comparison/0002755000175000017500000000000014751453622022347 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/16 comparison/meson.build0000644000175000017500000000570514751453622024516 0ustar buildbuildproject('comparison', 'c') # Compare equality of strings var1 = 'foo' var2 = 'bar' if var1 == var2 exe1 = executable('broken', 'broken.c') else exe1 = executable('prog1', 'prog.c') endif if var1 == var1 exe2 = executable('prog2', 'prog.c') else exe2 = executable('broken', 'broken.c') endif if var1 != var2 exe3 = executable('prog3', 'prog.c') else exe3 = executable('broken', 'broken.c') endif if var1 != var1 exe4 = executable('broken', 'broken.c') else exe4 = executable('prog4', 'prog.c') endif test('equalfalse', exe1) test('equaltrue', exe2) test('nequaltrue', exe3) test('nequalfalse', exe4) # Non-equality comparisons var3 = 3 var4 = 4 if var3 < var4 exe5 = executable('prog5', 'prog.c') else exe5 = executable('broken', 'broken.c') endif if var3 < var3 exe6 = executable('broken', 'broken.c') else exe6 = executable('prog6', 'prog.c') endif if var4 > var3 exe7 = executable('prog7', 'prog.c') else exe7 = executable('broken', 'broken.c') endif if var3 > var3 exe8 = executable('broken', 'broken.c') else exe8 = executable('prog8', 'prog.c') endif if var4 <= var3 exe9 = executable('broken', 'broken.c') else exe9 = executable('prog9', 'prog.c') endif if var3 <= var3 exe10 = executable('prog10', 'prog.c') else exe10 = executable('broken', 'broken.c') endif if var3 >= var4 exe11 = executable('broken', 'broken.c') else exe11 = executable('prog11', 'prog.c') endif if var3 >= var3 exe12 = executable('prog12', 'prog.c') else exe12 = executable('broken', 'broken.c') endif test('lttrue', exe5) test('ltfalse', exe6) test('gttrue', exe7) test('gtfalse', exe8) test('lefalse', exe9) test('letrue', exe10) test('gefalse', exe11) test('getrue', exe12) # Non-elementary type comparisons if exe1 == exe2 exe13 = executable('broken', 'broken.c') else exe13 = executable('prog13', 'prog.c') endif if exe1 == exe1 exe14 = executable('prog14', 'prog.c') else exe14 = executable('broken', 'broken.c') endif if exe1 != exe2 exe15 = executable('prog15', 'prog.c') else exe15 = executable('broken', 'broken.c') endif if exe1 != exe1 exe16 = executable('broken', 'broken.c') else exe16 = executable('prog16', 'prog.c') endif test('equalfalse', exe13) test('equaltrue', exe14) test('nequaltrue', exe15) test('nequalfalse', exe16) # "in" and "not in" operators assert(1 in [1, 2], '''1 should be in [1, 2]''') assert(3 not in [1, 2], '''3 shouldn't be in [1, 2]''') assert(not (3 in [1, 2]), '''3 shouldn't be in [1, 2]''') assert('b' in ['a', 'b'], ''''b' should be in ['a', 'b']''') assert('c' not in ['a', 'b'], ''''c' shouldn't be in ['a', 'b']''') assert(exe1 in [exe1, exe2], ''''exe1 should be in [exe1, exe2]''') assert(exe3 not in [exe1, exe2], ''''exe3 shouldn't be in [exe1, exe2]''') assert('a' in {'a': 'b'}, '''1 should be in {'a': 'b'}''') assert('b' not in {'a': 'b'}, '''1 should be in {'a': 'b'}''') assert('a' in 'abc') assert('b' not in 'def') muon-v0.4.0/subprojects/meson-tests/common/16 comparison/prog.c0000644000175000017500000000003514751453622023456 0ustar buildbuildint main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/255 module warnings/0002755000175000017500000000000014751453622023360 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/255 module warnings/meson.build0000644000175000017500000000067014751453622025523 0ustar buildbuildproject('module warnings', meson_version: '>= 0.56') import('python3') # deprecated module import('java') # new module import('unstable-keyval') # module that has been stabilized, import with unstable- import('unstable_simd') # A module with the deprecated `unstable_foo` instead of `unstable-foo` ice = import('icestorm', required: false) assert( not ice.found(), 'unstable-icestorm module should not be importable as `simd`', ) muon-v0.4.0/subprojects/meson-tests/common/255 module warnings/test.json0000644000175000017500000000142014751453622025225 0ustar buildbuild{ "stdout": [ { "line": "test cases/common/255 module warnings/meson.build:3: WARNING: Project targets '>= 0.56' but uses feature deprecated since '0.48.0': module python3." }, { "line": "test cases/common/255 module warnings/meson.build:4: WARNING: Project targets '>= 0.56' but uses feature introduced in '0.60.0': module java." }, { "line": "test cases/common/255 module warnings/meson.build:5: WARNING: Project targets '>= 0.56' but uses feature deprecated since '0.56.0': module keyval has been stabilized. drop \"unstable-\" prefix from the module name" }, { "line": "test cases/common/255 module warnings/meson.build:6: DEPRECATION: Importing unstable modules as \"unstable_simd\" instead of \"unstable-simd\"" } ] } muon-v0.4.0/subprojects/meson-tests/common/92 test workdir/0002755000175000017500000000000014751453622022622 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/92 test workdir/subdir/0002755000175000017500000000000014751453622024112 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/92 test workdir/subdir/meson.build0000644000175000017500000000022414751453622026250 0ustar buildbuildexe2 = executable('dummy', '../opener.c') test( 'subdir', find_program('checker.py'), workdir: meson.source_root(), args: [exe2], ) muon-v0.4.0/subprojects/meson-tests/common/92 test workdir/subdir/checker.py0000755000175000017500000000011214751453622026063 0ustar buildbuild#!/usr/bin/env python3 import sys data = open(sys.argv[1], 'rb').read() muon-v0.4.0/subprojects/meson-tests/common/92 test workdir/meson.build0000644000175000017500000000026414751453622024764 0ustar buildbuildproject('test workdir', 'c') exe = executable('opener', 'opener.c') test('basic', exe, workdir: meson.source_root()) test('shouldfail', exe, should_fail: true) subdir('subdir') muon-v0.4.0/subprojects/meson-tests/common/92 test workdir/opener.c0000644000175000017500000000031414751453622024252 0ustar buildbuild// This test only succeeds if run in the source root dir. #include int main(void) { FILE *f = fopen("opener.c", "r"); if(f) { fclose(f); return 0; } return 1; } muon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/0002755000175000017500000000000014751453622023640 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/0002755000175000017500000000000014751453622026203 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub/0002755000175000017500000000000014751453622026774 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub/meson.build0000644000175000017500000000013714751453622031135 0ustar buildbuildproject('sub', 'c', version: '1.0', default_options: ['default_library=shared']) subdir('lib') muon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub/lib/0002755000175000017500000000000014751453622027542 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub/lib/meson.build0000644000175000017500000000025514751453622031704 0ustar buildbuildlib = static_library('sub', 'sub.c') libSub = declare_dependency(include_directories: include_directories('.'), link_with: lib) meson.override_dependency('sub-1.0', libSub) muon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub/lib/sub.c0000644000175000017500000000006214751453622030473 0ustar buildbuild#include "sub.h" int sub(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub/lib/sub.h0000644000175000017500000000006414751453622030502 0ustar buildbuild#ifndef SUB_H #define SUB_H int sub(void); #endif muon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub_implicit/0002755000175000017500000000000014751453622030666 5ustar buildbuild././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub_implicit/subprojects/muon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub_implicit/subprojects0002755000175000017500000000000014751453622033152 5ustar buildbuild././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub_implicit/subprojects/subsub/muon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub_implicit/subprojects0002755000175000017500000000000014751453622033152 5ustar buildbuild././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub_implicit/subprojects/subsub/subprojects/muon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub_implicit/subprojects0002755000175000017500000000000014751453622033152 5ustar buildbuild././@LongLink0000644000000000000000000000020600000000000011601 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub_implicit/subprojects/subsub/subprojects/packagefiles/muon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub_implicit/subprojects0002755000175000017500000000000014751453622033152 5ustar buildbuild././@LongLink0000644000000000000000000000022700000000000011604 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub_implicit/subprojects/subsub/subprojects/packagefiles/subsubsub-1.0.zipmuon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub_implicit/subprojects0000644000175000017500000000070714751453622033156 0ustar buildbuildPK{P subsubsub-1.0/UT ^^^ux PK{PS subsubsub-1.0/meson.buildUT ^^^ux +(JM.P/.M uM.<Ԣ̔ԂԼԼJdu: )9E(\PK}y;SPK{P Asubsubsub-1.0/UT ^^^ux PK{P}y;S Lsubsubsub-1.0/meson.buildUT ^^^ux PK././@LongLink0000644000000000000000000000020700000000000011602 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub_implicit/subprojects/subsub/subprojects/subsubsub.wrapmuon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub_implicit/subprojects0000644000175000017500000000023114751453622033146 0ustar buildbuild[wrap-file] directory = subsubsub-1.0 source_filename = subsubsub-1.0.zip source_hash = c073a96b7251937e53216578f6f03d91b84816618a0f1ce3ecfb867beddf1498 ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub_implicit/subprojects/subsub/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub_implicit/subprojects0000644000175000017500000000040714751453622033153 0ustar buildbuildproject('subsub') meson.override_dependency('subsub', declare_dependency()) # Regression test: Installing a header from nested sub-subproject used to raise: # ERROR: Sandbox violation: Tried to grab file foo.h from a nested subproject. install_headers('foo.h') ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub_implicit/subprojects/subsub/foo.hmuon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub_implicit/subprojects0000644000175000017500000000002114751453622033143 0ustar buildbuild#define DUMMY 42 ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub_implicit/meson_options.txtmuon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub_implicit/meson_optio0000644000175000017500000000006014751453622033136 0ustar buildbuildoption('opt', type: 'string', value: 'default') muon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub_implicit/meson.build0000644000175000017500000000121714751453622033027 0ustar buildbuildproject('sub_implicit', 'c', version: '1.0') dep = declare_dependency() meson.override_dependency('sub_implicit', dep) meson.override_dependency('sub_implicit_provide1', dep) # This one is not overridden but the wrap file tells the variable name to use. sub_implicit_provide2_dep = dep # This one is not overridden but the wrap file tells the variable name to use. glib_dep = dep # copied from main meson.build file since subsub is not promoted, but installs # things that cause the test to fail if it is not executed d = dependency('subsub') assert(d.found(), 'Should be able to fallback to sub-subproject') assert(get_option('opt') == 'overridden') muon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub_static/0002755000175000017500000000000014751453622030343 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub_static/meson.build0000644000175000017500000000076514751453622032513 0ustar buildbuildproject('sub_static', default_options: ['default_library=shared']) assert(get_option('default_library') == 'static') meson.override_dependency('sub_static', declare_dependency()) meson.override_dependency('sub_static2', declare_dependency(), static: true) meson.override_dependency( 'sub_static3', declare_dependency(variables: {'static': 'true'}), static: true, ) meson.override_dependency( 'sub_static3', declare_dependency(variables: {'static': 'false'}), static: false, ) muon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub_implicit.wrap0000644000175000017500000000022314751453622031554 0ustar buildbuild[wrap-file] [provide] glib-2.0 = glib_dep dependency_names = sub_implicit_provide1, gobject-2.0 sub_implicit_provide2 = sub_implicit_provide2_dep muon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub_novar/0002755000175000017500000000000014751453622030201 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/subprojects/sub_novar/meson.build0000644000175000017500000000026314751453622032342 0ustar buildbuildproject('sub-novar', 'c', version: '1.0') meson.override_dependency('sub-novar', declare_dependency()) meson.override_dependency('sub-notfound', dependency('', required: false)) muon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/meson.build0000644000175000017500000000773514751453622026014 0ustar buildbuildproject('proj', 'c', default_options: ['default_library=shared']) subproject('sub') libSub = dependency('sub', fallback: ['sub', 'libSub']) exe = executable('prog', 'prog.c', dependencies: libSub) test('subproject subdir', exe) # Verify the subproject has placed dependency override. dependency('sub-1.0') # Verify we can now take 'sub' dependency without fallback, but only version 1.0. dependency('sub') d = dependency('sub', version: '>=2.0', required: false) assert(not d.found(), 'version should not match') # Verify that not-found does not get cached, we can still fallback afterward. dependency('sub2', required: false) d = dependency('sub2', fallback: ['sub', 'libSub']) assert(d.found(), 'Should fallback even if a previous call returned not-found') # Verify we can get a fallback dependency without specifying the variable name, # because the subproject overridden 'sub-novar'. dependency('sub-novar', fallback: 'sub_novar') # Verify a subproject can force a dependency to be not-found d = dependency('sub-notfound', fallback: 'sub_novar', required: false) assert(not d.found(), 'Dependency should be not-found') # Verify that implicit fallback works because subprojects/sub_implicit directory exists d = dependency('sub_implicit', default_options: 'opt=overridden') assert(d.found(), 'Should implicitly fallback') # Verify that implicit fallback works because sub_implicit.wrap has # `dependency_names=sub_implicit_provide1` and the subproject overrides sub_implicit_provide1. d = dependency('sub_implicit_provide1') assert(d.found(), 'Should implicitly fallback') # Verify that implicit fallback works because sub_implicit.wrap has # `sub_implicit_provide2=sub_implicit_provide2_dep` and does not override # sub_implicit_provide2. d = dependency('sub_implicit_provide2') assert(d.found(), 'Should implicitly fallback') # sub_implicit.wrap provides glib-2.0 and we already configured that subproject, # so we must not return the system dependency here. Using glib-2.0 here because # some CI runners have it installed. d = dependency('glib-2.0', required: false) assert(d.found()) assert(d.type_name() == 'internal') # sub_implicit.wrap provides gobject-2.0 and we already configured that subproject, # so we must not return the system dependency here. But since the subproject did # not override that dependency and its not required, not-found should be returned. # Using gobject-2.0 here because some CI runners have it installed. d = dependency('gobject-2.0', required: false) assert(not d.found()) # different than meson: subprojects do not promote # # Verify that implicit fallback works because subprojects/sub_implicit/subprojects/subsub # # directory exists. # d = dependency('subsub') # assert(d.found(), 'Should be able to fallback to sub-subproject') # # Verify that implicit fallback works because # # subprojects/sub_implicit/subprojects/subsub/subprojects/subsubsub.wrap # # file exists. # d = dependency('subsubsub') # assert(d.found(), 'Should be able to fallback to sub-sub-subproject') # Verify that `static: true` implies 'default_library=static'. d = dependency('sub_static', static: true) assert(d.found()) # Verify that when not specifying static kwarg we can still get fallback dep. d = dependency('sub_static') assert(d.found()) # But when asking for shared library explicitly, it is not found. d = dependency('sub_static', static: false, required: false) assert(not d.found()) # The subproject also overrides sub_static2 with `static: true` d = dependency('sub_static2') assert(d.found()) d = dependency('sub_static2', static: true) assert(d.found()) d = dependency('sub_static2', static: false, required: false) assert(not d.found()) # sub_static3 is overridden twice with `static: true` and `static: false` d = dependency('sub_static3') assert(d.found()) assert(d.get_variable('static') == 'true') d = dependency('sub_static3', static: true) assert(d.found()) assert(d.get_variable('static') == 'true') d = dependency('sub_static3', static: false) assert(d.found()) assert(d.get_variable('static') == 'false') muon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/test.json0000644000175000017500000000011514751453622025505 0ustar buildbuild{ "installed": [ { "type": "file", "file": "usr/include/foo.h" } ] } muon-v0.4.0/subprojects/meson-tests/common/98 subproject subdir/prog.c0000644000175000017500000000006714751453622024754 0ustar buildbuild#include int main(void) { return sub(); } muon-v0.4.0/subprojects/meson-tests/common/234 get_file_contents/0002755000175000017500000000000014751453622023752 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/234 get_file_contents/VERSION0000644000175000017500000000000614751453622025014 0ustar buildbuild1.2.0 muon-v0.4.0/subprojects/meson-tests/common/234 get_file_contents/.gitattributes0000644000175000017500000000002314751453622026636 0ustar buildbuildutf-16-text binary muon-v0.4.0/subprojects/meson-tests/common/234 get_file_contents/utf-16-text0000644000175000017500000000022614751453622025677 0ustar buildbuild." E"da = Q, n ! ", " f(i) = " g(i), "x"!: #x # = " #"x #,  '"  = ( (" )muon-v0.4.0/subprojects/meson-tests/common/234 get_file_contents/utf-8-text0000644000175000017500000000016414751453622025621 0ustar buildbuild∮ E⋅da = Q, n → ∞, ∑ f(i) = ∏ g(i), ∀x∈ℝ: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β) muon-v0.4.0/subprojects/meson-tests/common/234 get_file_contents/meson.build0000644000175000017500000000110414751453622026106 0ustar buildbuildproject('meson-fs-read-file', [], version: files('VERSION')) fs = import('fs') assert(fs.read('VERSION').strip() == meson.project_version(), 'file misread') expected = ( '∮ E⋅da = Q, n → ∞, ∑ f(i) = ∏ g(i), ∀x∈ℝ: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β)' ) # different than meson: encodings other than utf-8 not supported assert( fs.read('utf-8-text', encoding: 'utf-8').strip() == expected, 'file was not decoded correctly', ) # Make sure we handle `files()` objects properly, too version_file = files('VERSION') subdir('other') muon-v0.4.0/subprojects/meson-tests/common/234 get_file_contents/other/0002755000175000017500000000000014751453622025073 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/234 get_file_contents/other/meson.build0000644000175000017500000000016414751453622027234 0ustar buildbuildfs = import('fs') assert(fs.read(version_file).strip() == '1.2.0') assert(fs.read('../VERSION').strip() == '1.2.0') muon-v0.4.0/subprojects/meson-tests/common/91 benchmark/0002755000175000017500000000000014751453622022132 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/91 benchmark/delayer.c0000644000175000017500000000056014751453622023722 0ustar buildbuild/* Simple prog that sleeps for a random time. */ #include #include #if defined(_WIN32) #include #endif int main(void) { srand(time(NULL)); #if !defined(_WIN32) struct timespec t; t.tv_sec = 0; t.tv_nsec = 199999999.0*rand()/RAND_MAX; nanosleep(&t, NULL); #else Sleep(50.0*rand()/RAND_MAX); #endif return 0; } muon-v0.4.0/subprojects/meson-tests/common/91 benchmark/meson.build0000644000175000017500000000017714751453622024277 0ustar buildbuildproject('benchmark', 'c') delayer = executable('delayer', 'delayer.c', c_args: '-D_GNU_SOURCE') benchmark('delayer', delayer) muon-v0.4.0/subprojects/meson-tests/common/213 source set dictionary/0002755000175000017500000000000014751453622024456 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/213 source set dictionary/subdir/0002755000175000017500000000000014751453622025746 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/213 source set dictionary/subdir/meson.build0000644000175000017500000000007314751453622030106 0ustar buildbuildsources.add(when: ['YES2', good], if_true: [files('b.c')]) muon-v0.4.0/subprojects/meson-tests/common/213 source set dictionary/subdir/b.c0000644000175000017500000000016114751453622026327 0ustar buildbuild#include #include "all.h" void h(void) { } int main(void) { if (p) abort(); f(); g(); } muon-v0.4.0/subprojects/meson-tests/common/213 source set dictionary/a.c0000644000175000017500000000012614751453622025037 0ustar buildbuild#include #include "all.h" int main(void) { if (p) abort(); f(); } muon-v0.4.0/subprojects/meson-tests/common/213 source set dictionary/all.h0000644000175000017500000000032214751453622025372 0ustar buildbuildextern void f(void); extern void g(void); extern void h(void); extern void undefined(void); /* Defined in nope.c and f.c, * value depends on the source set and configuration used. */ extern void (*p)(void); muon-v0.4.0/subprojects/meson-tests/common/213 source set dictionary/f.c0000644000175000017500000000011214751453622025037 0ustar buildbuild#include "all.h" void (*p)(void) = (void *)0x1234ABCD; void f(void) { } muon-v0.4.0/subprojects/meson-tests/common/213 source set dictionary/meson.build0000644000175000017500000000340514751453622026620 0ustar buildbuildproject('a', 'c') good = declare_dependency(link_with: static_library('good', 'g.c')) bad = declare_dependency(link_args: 'nonexistent.a') not_found = dependency('invalid', required: false) source_set = import('sourceset') sources = source_set.source_set() sources.add(when: 'YES', if_false: ['nope.c']) sources.add(when: 'YES1', if_true: files('a.c')) subdir('subdir') sources.add(when: 'NO', if_true: 'nope.c', if_false: ['f.c']) sources.add(when: 'NO', if_true: bad, if_false: ['f.c']) sources.add(when: 'YES2', if_true: good) # dependencies as conditions sources.add(when: not_found, if_true: 'nope.c') # test add_all sources2 = source_set.source_set() sources2.add(when: 'YES1', if_true: 'nope.c') sources.add_all(when: 'NO', if_true: sources2) # test duplicate items sources.add(when: 'YES1', if_true: files('a.c')) conf1 = { 'YES': true, 'YES1': true, 'YES2': false, 'NO': false, } result1 = sources.apply(conf1) conf2 = { 'YES': true, 'YES1': false, 'YES2': true, 'NO': false, } result2 = sources.apply(conf2) # Each target will recompile the objects executable('first', sources: result1.sources(), dependencies: result1.dependencies()) executable('second', sources: result2.sources(), dependencies: result2.dependencies()) # All target will use the same object files if meson.is_unity() message('Skipping extraction test because this is a Unity build.') else all_objs = static_library('all_objs', sources.all_sources()) executable( 'first_via_lib', objects: all_objs.extract_objects(result1.sources()), dependencies: result1.dependencies(), ) executable( 'second_via_lib', objects: all_objs.extract_objects(result2.sources()), dependencies: result2.dependencies(), ) endif muon-v0.4.0/subprojects/meson-tests/common/213 source set dictionary/g.c0000644000175000017500000000005414751453622025045 0ustar buildbuild#include "all.h" void g(void) { h(); } muon-v0.4.0/subprojects/meson-tests/common/213 source set dictionary/nope.c0000644000175000017500000000005714751453622025563 0ustar buildbuild#include "all.h" void (*p)(void) = undefined; muon-v0.4.0/subprojects/meson-tests/common/152 index customtarget/0002755000175000017500000000000014751453622024067 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/152 index customtarget/subdir/0002755000175000017500000000000014751453622025357 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/152 index customtarget/subdir/meson.build0000644000175000017500000000123614751453622027521 0ustar buildbuild# Copyright © 2017 Intel Corporation # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. foo = executable( 'foo', ['foo.c', gen[0], gen[1]], c_args: '-DWORKS', ) muon-v0.4.0/subprojects/meson-tests/common/152 index customtarget/subdir/foo.c0000644000175000017500000000126714751453622026312 0ustar buildbuild/* Copyright © 2017 Intel Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "gen.h" int main(void) { char buf[50]; stringify(10, buf); return 0; } muon-v0.4.0/subprojects/meson-tests/common/152 index customtarget/check_args.py0000644000175000017500000000043714751453622026534 0ustar buildbuild#!python3 import sys from pathlib import Path def main(): if len(sys.argv) != 2: print(sys.argv) return 1 if sys.argv[1] != 'gen.c': print(sys.argv) return 2 Path('foo').touch() return 0 if __name__ == '__main__': sys.exit(main()) muon-v0.4.0/subprojects/meson-tests/common/152 index customtarget/meson.build0000644000175000017500000000355114751453622026233 0ustar buildbuild# Copyright © 2017 Intel Corporation # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. project('custom_target_index', 'c', default_options: 'c_std=c89') py_mod = import('python3') prog_python = py_mod.find_python() gen = custom_target( 'gen.[ch]', input: 'gen_sources.py', output: ['gen.c', 'gen.h'], command: [prog_python, '@INPUT@', '--header', '@OUTPUT1@', '--code', '@OUTPUT0@'], ) has_not_changed = false if is_disabler(gen) has_not_changed = true else has_not_changed = true endif assert(has_not_changed, 'Custom target has changed.') assert(not is_disabler(gen), 'Custom target is a disabler.') lib = static_library( 'libfoo', ['lib.c', gen[1]], ) has_not_changed = false if is_disabler(lib) has_not_changed = true else has_not_changed = true endif assert(has_not_changed, 'Static library has changed.') assert(not is_disabler(lib), 'Static library is a disabler.') custom_target( 'foo', input: gen[0], output: 'foo', command: [find_program('check_args.py'), '@INPUT@'], ) subdir('subdir') gen = disabler() assert(is_disabler(gen), 'Generator is not a disabler.') lib = static_library( 'libfoo', ['lib.c', gen[1]], ) assert(is_disabler(lib), 'Static library is not a disabler.') if lib.found() lib_disabled = false else lib_disabled = true endif assert(lib_disabled, 'Static library was not disabled.') muon-v0.4.0/subprojects/meson-tests/common/152 index customtarget/lib.c0000644000175000017500000000124314751453622024777 0ustar buildbuild/* Copyright © 2017 Intel Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "gen.h" void func(char * buffer) { stringify(1, buffer); } muon-v0.4.0/subprojects/meson-tests/common/152 index customtarget/gen_sources.py0000644000175000017500000000134514751453622026756 0ustar buildbuild# SPDX-License-Identifier: Apache-2.0 # Copyright © 2017-2023 Intel Corporation import argparse import textwrap HEADER = textwrap.dedent('''\ void stringify(int foo, char * buffer); ''') CODE = textwrap.dedent('''\ #include #ifndef WORKS # error "This shouldn't have been included" #endif void stringify(int foo, char * buffer) { sprintf(buffer, "%i", foo); } ''') def main(): parser = argparse.ArgumentParser() parser.add_argument('--header') parser.add_argument('--code') args = parser.parse_args() with open(args.header, 'w') as f: f.write(HEADER) with open(args.code, 'w') as f: f.write(CODE) if __name__ == '__main__': main() muon-v0.4.0/subprojects/meson-tests/common/94 threads/0002755000175000017500000000000014751453622021635 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/94 threads/meson.build0000644000175000017500000000067114751453622024001 0ustar buildbuildproject('threads', 'cpp', 'c', default_options: ['cpp_std=c++11']) cc = meson.get_compiler('c') if cc.has_function_attribute('unused') add_project_arguments('-DHAVE_UNUSED', language: 'c') endif threaddep = dependency('threads') test( 'cppthreadtest', executable('cppthreadprog', 'threadprog.cpp', dependencies: threaddep), ) test( 'cthreadtest', executable('cthreadprog', 'threadprog.c', dependencies: threaddep), ) muon-v0.4.0/subprojects/meson-tests/common/94 threads/threadprog.c0000644000175000017500000000155014751453622024137 0ustar buildbuild#if defined _WIN32 #include #include DWORD WINAPI thread_func(void *arg) { printf("Printing from a thread.\n"); return 0; } int main(void) { DWORD id; HANDLE th; printf("Starting thread.\n"); th = CreateThread(NULL, 0, thread_func, NULL, 0, &id); WaitForSingleObject(th, INFINITE); printf("Stopped thread.\n"); return 0; } #else #include #include #ifdef HAVE_UNUSED #define UNUSED_ATTR __attribute__((unused)) #else #define UNUSED_ATTR #endif void* main_func(void UNUSED_ATTR *arg) { printf("Printing from a thread.\n"); return NULL; } int main(void) { pthread_t thread; int rc; printf("Starting thread.\n"); rc = pthread_create(&thread, NULL, main_func, NULL); rc = pthread_join(thread, NULL); printf("Stopped thread.\n"); return rc; } #endif muon-v0.4.0/subprojects/meson-tests/common/94 threads/threadprog.cpp0000644000175000017500000000156014751453622024500 0ustar buildbuild/* On Windows not all versions of VS support C++11 and * some (most?) versions of mingw don't support std::thread, * even though they do support c++11. Since we only care about * threads working, do the test with raw win threads. */ #if defined _WIN32 #include #include DWORD WINAPI thread_func(LPVOID) { printf("Printing from a thread.\n"); return 0; } int main(void) { printf("Starting thread.\n"); HANDLE th; DWORD id; th = CreateThread(NULL, 0, thread_func, NULL, 0, &id); WaitForSingleObject(th, INFINITE); printf("Stopped thread.\n"); return 0; } #else #include #include void main_func(void) { printf("Printing from a thread.\n"); } int main(void) { printf("Starting thread.\n"); std::thread th(main_func); th.join(); printf("Stopped thread.\n"); return 0; } #endif muon-v0.4.0/subprojects/meson-tests/common/175 ndebug if-release disabled/0002755000175000017500000000000014751453622025254 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/175 ndebug if-release disabled/main.c0000644000175000017500000000014414751453622026341 0ustar buildbuild#include #include int main(void) { assert(0); return EXIT_SUCCESS; } muon-v0.4.0/subprojects/meson-tests/common/175 ndebug if-release disabled/meson.build0000644000175000017500000000026014751453622027412 0ustar buildbuildproject( 'ndebug disabled', 'c', default_options: [ 'buildtype=release', 'b_ndebug=if-release', ], ) test('exe', executable('main', 'main.c')) muon-v0.4.0/subprojects/meson-tests/common/136 empty build file/0002755000175000017500000000000014751453622023376 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/136 empty build file/subdir/0002755000175000017500000000000014751453622024666 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/136 empty build file/subdir/meson.build0000644000175000017500000000000014751453622027014 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/136 empty build file/meson.build0000644000175000017500000000007714751453622025542 0ustar buildbuildproject('subdir with empty meson.build test') subdir('subdir') muon-v0.4.0/subprojects/meson-tests/common/273 customtarget exe for test/0002755000175000017500000000000014751453622025254 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/273 customtarget exe for test/meson.build0000644000175000017500000000104014751453622027407 0ustar buildbuildproject('test customtarget') # different than meson: custom_target command needs absolute path generator = find_program('generate.py') ct1 = custom_target( command: [generator, '@OUTPUT@'], output: 'a.py', ) ct2 = custom_target( command: [generator, '@OUTPUT@'], output: ['b.py', 'c.py'], ) test('using_custom_target', ct1) # different than meson: custom_target index doesn't add dependency test('using_custom_target_index', ct2[0], depends: ct2) test('using_custom_target_index_1', ct2[1], should_fail: true, depends: ct2) muon-v0.4.0/subprojects/meson-tests/common/273 customtarget exe for test/generate.py0000644000175000017500000000035614751453622027422 0ustar buildbuild#!/usr/bin/env python3 import os import sys program = '''#!/usr/bin/env python3 raise SystemExit({}) ''' for i, a in enumerate(sys.argv[1:]): with open(a, 'w') as f: print(program.format(i), file=f) os.chmod(a, 0o755) muon-v0.4.0/subprojects/meson-tests/common/173 as-needed/0002755000175000017500000000000014751453622022106 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/173 as-needed/config.h0000644000175000017500000000057714751453622023533 0ustar buildbuild#if defined _WIN32 || defined __CYGWIN__ #if defined BUILDING_DLL #define DLL_PUBLIC __declspec(dllexport) #else #define DLL_PUBLIC __declspec(dllimport) #endif #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif muon-v0.4.0/subprojects/meson-tests/common/173 as-needed/main.cpp0000644000175000017500000000020014751453622023524 0ustar buildbuild#include #include "libA.h" int main(void) { return !meson_test_as_needed::linked ? EXIT_SUCCESS : EXIT_FAILURE; } muon-v0.4.0/subprojects/meson-tests/common/173 as-needed/libB.cpp0000644000175000017500000000044114751453622023457 0ustar buildbuild#include "libA.h" #undef DLL_PUBLIC #define BUILDING_DLL #include "config.h" namespace meson_test_as_needed { namespace { bool set_linked() { linked = true; return true; } bool stub = set_linked(); } DLL_PUBLIC int libB_unused_func() { return 0; } } muon-v0.4.0/subprojects/meson-tests/common/173 as-needed/meson.build0000644000175000017500000000141214751453622024244 0ustar buildbuildproject('as-needed test', 'cpp') # Idea behind this test is to have -Wl,--as-needed prune # away unneeded linkages, which would otherwise cause global # static initialiser side-effects to set a boolean to true. # Credits for portable ISO C++ idea go to sarum9in libA = library('A', 'libA.cpp') libB = library('B', 'libB.cpp', link_with: libA) main_exe = executable('C', 'main.cpp', link_with: [libA, libB]) test('main test', main_exe) # Since Sonoma / Xcode 15 the macos linker considers the dependency via the # initializer sufficient to pull in the other other library. There's no good # way to detect the linker version here, so just skip the on macos. if host_machine.system() == 'darwin' error('MESON_SKIP_TEST: the macos linker is too smart for this test') endif muon-v0.4.0/subprojects/meson-tests/common/173 as-needed/libA.h0000644000175000017500000000013114751453622023117 0ustar buildbuild#include "config.h" namespace meson_test_as_needed { DLL_PUBLIC extern bool linked; } muon-v0.4.0/subprojects/meson-tests/common/173 as-needed/libA.cpp0000644000175000017500000000015614751453622023461 0ustar buildbuild#define BUILDING_DLL #include "libA.h" namespace meson_test_as_needed { DLL_PUBLIC bool linked = false; } muon-v0.4.0/subprojects/meson-tests/common/243 escape++/0002755000175000017500000000000014751453622021645 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/243 escape++/test.c0000644000175000017500000000004114751453622022761 0ustar buildbuildint main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/243 escape++/meson.build0000644000175000017500000000013714751453622024006 0ustar buildbuildproject('regex escape test', 'c') exe = executable('testprog', 'test.c') test('runtest', exe) muon-v0.4.0/subprojects/meson-tests/common/45 custom install dirs/0002755000175000017500000000000014751453622024062 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/45 custom install dirs/subdir/0002755000175000017500000000000014751453622025352 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/45 custom install dirs/subdir/datafile.dog0000644000175000017500000000003414751453622027611 0ustar buildbuildInstalled dog is installed. muon-v0.4.0/subprojects/meson-tests/common/45 custom install dirs/sample.h0000644000175000017500000000007414751453622025513 0ustar buildbuild#ifndef SAMPLE_H #define SAMPLE_H int wackiness(); #endif muon-v0.4.0/subprojects/meson-tests/common/45 custom install dirs/meson.build0000644000175000017500000000130714751453622026223 0ustar buildbuildproject('custom install dirs', 'c') executable('prog', 'prog.c', install: true, install_dir: 'dib/dab/dub') executable( 'prog2', 'prog.c', install: true, install_dir: get_option('prefix') + '/dib/dab/dub2', ) install_headers('sample.h', install_dir: 'some/dir') install_headers('sample.h', install_dir: get_option('prefix') + '/some/dir2') install_man('prog.1', install_dir: 'woman') install_man('prog.1', install_dir: get_option('prefix') + '/woman2') install_data('datafile.cat', install_dir: 'meow') install_data('datafile.cat', install_dir: get_option('prefix') + '/meow2') install_subdir('subdir', install_dir: 'woof') install_subdir('subdir', install_dir: get_option('prefix') + '/woof2') muon-v0.4.0/subprojects/meson-tests/common/45 custom install dirs/test.json0000644000175000017500000000126014751453622025731 0ustar buildbuild{ "installed": [ {"type": "exe", "file": "usr/dib/dab/dub/prog"}, {"type": "pdb", "file": "usr/dib/dab/dub/prog"}, {"type": "exe", "file": "usr/dib/dab/dub2/prog2"}, {"type": "pdb", "file": "usr/dib/dab/dub2/prog2"}, {"type": "file", "file": "usr/some/dir/sample.h"}, {"type": "file", "file": "usr/some/dir2/sample.h"}, {"type": "file", "file": "usr/woman/prog.1"}, {"type": "file", "file": "usr/woman2/prog.1"}, {"type": "file", "file": "usr/meow/datafile.cat"}, {"type": "file", "file": "usr/meow2/datafile.cat"}, {"type": "file", "file": "usr/woof/subdir/datafile.dog"}, {"type": "file", "file": "usr/woof2/subdir/datafile.dog"} ] } muon-v0.4.0/subprojects/meson-tests/common/45 custom install dirs/datafile.cat0000644000175000017500000000003414751453622026317 0ustar buildbuildInstalled cat is installed. muon-v0.4.0/subprojects/meson-tests/common/45 custom install dirs/prog.c0000644000175000017500000000004114751453622025166 0ustar buildbuildint main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/45 custom install dirs/prog.10000644000175000017500000000001514751453622025105 0ustar buildbuildMan up, you. muon-v0.4.0/subprojects/meson-tests/common/200 install name_prefix name_suffix/0002755000175000017500000000000014751453622026461 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/200 install name_prefix name_suffix/libfile.c0000644000175000017500000000052114751453622030227 0ustar buildbuild#if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllexport) #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif int DLL_PUBLIC func(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/200 install name_prefix name_suffix/meson.build0000644000175000017500000000130714751453622030622 0ustar buildbuildproject('library with name_prefix name_suffix test', 'c') shared_library('foo', 'libfile.c', name_prefix: '', install: true) static_library('bar', 'libfile.c', name_prefix: '', install: true) shared_library('baz', 'libfile.c', name_suffix: 'cheese', install: true) static_library('qux', 'libfile.c', name_suffix: 'cheese', install: true) shared_library( 'corge', 'libfile.c', name_prefix: 'bow', name_suffix: 'stern', install: true, ) static_library( 'grault', 'libfile.c', name_prefix: 'bow', name_suffix: 'stern', install: true, ) # exercise default name_prefix and name_suffix shared_library('garply', 'libfile.c', name_prefix: [], name_suffix: [], install: true) muon-v0.4.0/subprojects/meson-tests/common/200 install name_prefix name_suffix/test.json0000644000175000017500000000142114751453622030327 0ustar buildbuild{ "installed": [ {"type": "pdb", "file": "usr/bin/baz"}, {"type": "pdb", "file": "usr/bin/bowcorge"}, {"type": "pdb", "file": "usr/bin/foo"}, {"type": "expr", "file": "usr/?lib/bowcorge.stern"}, {"type": "expr", "file": "usr/lib/?libbaz.cheese"}, {"type": "file", "file": "usr/lib/bar.a"}, {"type": "implib", "file": "usr/lib/bowcorge"}, {"type": "file", "file": "usr/lib/bowgrault.stern"}, {"type": "implib", "file": "usr/lib/foo"}, {"type": "expr", "file": "usr/lib/foo?so"}, {"type": "implib", "file": "usr/lib/libbaz"}, {"type": "file", "file": "usr/lib/libqux.cheese"}, {"type": "expr", "file": "usr/?lib/libgarply?so"}, {"type": "implib", "file": "usr/lib/libgarply"}, {"type": "pdb", "file": "usr/bin/garply"} ] } muon-v0.4.0/subprojects/meson-tests/common/148 shared module resolving symbol in executable/0002755000175000017500000000000014751453622030747 5ustar buildbuild././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/148 shared module resolving symbol in executable/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/148 shared module resolving symbol in executable/meson.bu0000644000175000017500000000214514751453622032420 0ustar buildbuildproject('shared module resolving symbol in executable', 'c') # The shared module contains a reference to the symbol 'func_from_executable', # which is always provided by the executable which loads it. This symbol can be # resolved at run-time by an ELF loader. But when building PE/COFF objects, all # symbols must be resolved at link-time, so an implib is generated for the # executable, and the shared module linked with it. # # See testcase 125 for an example of the more complex portability gymnastics # required if we do not know (at link-time) what provides the symbol. cc = meson.get_compiler('c') if cc.get_id() == 'pgi' error( 'MESON_SKIP_TEST PGI has its own unique set of macros that would need to be handled', ) endif dl = meson.get_compiler('c').find_library('dl', required: false) e = executable('prog', 'prog.c', dependencies: dl, export_dynamic: true) e_dep = declare_dependency(link_with: e) m = shared_module('module', 'module.c', link_with: e) m2 = shared_module('module2', 'module.c', dependencies: e_dep) test('test', e, args: m.full_path()) test('test2', e, args: m2.full_path()) muon-v0.4.0/subprojects/meson-tests/common/148 shared module resolving symbol in executable/module.c0000644000175000017500000000061514751453622032400 0ustar buildbuild#if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllexport) #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif extern int func_from_executable(void); int DLL_PUBLIC func(void) { return func_from_executable(); } muon-v0.4.0/subprojects/meson-tests/common/148 shared module resolving symbol in executable/prog.c0000644000175000017500000000210414751453622032055 0ustar buildbuild#include #include #ifdef _WIN32 #include #else #include #endif #if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllexport) #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif typedef int (*fptr) (void); int DLL_PUBLIC func_from_executable(void) { return 42; } int main(int argc, char **argv) { int expected, actual; fptr importedfunc; (void)argc; // noop #ifdef _WIN32 HMODULE h = LoadLibraryA(argv[1]); #else void *h = dlopen(argv[1], RTLD_NOW); #endif assert(h != NULL); #ifdef _WIN32 importedfunc = (fptr) GetProcAddress (h, "func"); #else importedfunc = (fptr) dlsym(h, "func"); #endif assert(importedfunc != NULL); assert(importedfunc != func_from_executable); actual = (*importedfunc)(); expected = func_from_executable(); assert(actual == expected); #ifdef _WIN32 FreeLibrary(h); #else dlclose(h); #endif return 0; } muon-v0.4.0/subprojects/meson-tests/common/251 add_project_dependencies/0002755000175000017500000000000014751453622025242 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/251 add_project_dependencies/main.c0000644000175000017500000000006614751453622026332 0ustar buildbuild#include "lib.h" int main(void) { return ok(); } muon-v0.4.0/subprojects/meson-tests/common/251 add_project_dependencies/inc/0002755000175000017500000000000014751453622026013 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/251 add_project_dependencies/inc/lib.h0000644000175000017500000000004214751453622026724 0ustar buildbuild#pragma once extern int ok(void); muon-v0.4.0/subprojects/meson-tests/common/251 add_project_dependencies/meson.build0000644000175000017500000000127614751453622027410 0ustar buildbuildproject('zlib system dependency', 'c') cc = meson.get_compiler('c') m = cc.find_library('m', required: false) add_project_dependencies(m, language: ['c']) z = dependency('zlib', required: false) if not z.found() error('MESON_SKIP_TEST zlib not present') endif z_c_args = z.partial_dependency(compile_args: true, includes: true) add_project_dependencies(z_c_args, language: 'c', native: false) global_dep = declare_dependency(include_directories: include_directories('inc'), compile_args: '-DDEFINED') add_project_dependencies(global_dep, language: 'c', native: false) lib = static_library('rary', 'lib.c') exe = executable('prog', 'main.c', link_with: lib, dependencies: z) test('test', exe) muon-v0.4.0/subprojects/meson-tests/common/251 add_project_dependencies/lib.c0000644000175000017500000000034514751453622026154 0ustar buildbuild#include #include #ifndef DEFINED #error expected compile_arg not found #endif double zero; int ok(void) { void * something = deflate; if(something != 0) return 0; return (int)cos(zero); } muon-v0.4.0/subprojects/meson-tests/common/77 extract from nested subdir/0002755000175000017500000000000014751453622025316 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/77 extract from nested subdir/tst/0002755000175000017500000000000014751453622026130 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/77 extract from nested subdir/tst/meson.build0000644000175000017500000000002014751453622030260 0ustar buildbuildsubdir('first') muon-v0.4.0/subprojects/meson-tests/common/77 extract from nested subdir/tst/first/0002755000175000017500000000000014751453622027257 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/77 extract from nested subdir/tst/first/exe_first.c0000644000175000017500000000010014751453622031400 0ustar buildbuildint first(void); int main(void) { return first() - 1001; } muon-v0.4.0/subprojects/meson-tests/common/77 extract from nested subdir/tst/first/meson.build0000644000175000017500000000022414751453622031415 0ustar buildbuildfirst_exe = executable( 'first_exe', 'exe_first.c', objects: first_lib.extract_objects('lib_first.c'), ) test('first_test', first_exe) muon-v0.4.0/subprojects/meson-tests/common/77 extract from nested subdir/meson.build0000644000175000017500000000025014751453622027453 0ustar buildbuildproject('Extract objects from subdirs', 'c') if meson.is_unity() message('Unity build: skipping incompatible test') else subdir('src') subdir('tst') endif muon-v0.4.0/subprojects/meson-tests/common/77 extract from nested subdir/src/0002755000175000017500000000000014751453622026105 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/77 extract from nested subdir/src/meson.build0000644000175000017500000000002014751453622030235 0ustar buildbuildsubdir('first') muon-v0.4.0/subprojects/meson-tests/common/77 extract from nested subdir/src/first/0002755000175000017500000000000014751453622027234 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/77 extract from nested subdir/src/first/lib_first.c0000644000175000017500000000004514751453622031352 0ustar buildbuildint first(void) { return 1001; } muon-v0.4.0/subprojects/meson-tests/common/77 extract from nested subdir/src/first/meson.build0000644000175000017500000000006714751453622031377 0ustar buildbuildfirst_lib = shared_library('first_lib', 'lib_first.c') muon-v0.4.0/subprojects/meson-tests/common/238 dependency include_type inconsistency/0002755000175000017500000000000014751453622027717 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/238 dependency include_type inconsistency/subprojects/0002755000175000017500000000000014751453622032262 5ustar buildbuild././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/238 dependency include_type inconsistency/subprojects/baz/muon-v0.4.0/subprojects/meson-tests/common/238 dependency include_type inconsistency/subprojects/baz0002755000175000017500000000000014751453622032757 5ustar buildbuild././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/238 dependency include_type inconsistency/subprojects/baz/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/238 dependency include_type inconsistency/subprojects/baz0000644000175000017500000000005714751453622032761 0ustar buildbuildproject('baz') baz_dep = declare_dependency() ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/238 dependency include_type inconsistency/subprojects/foo.wrapmuon-v0.4.0/subprojects/meson-tests/common/238 dependency include_type inconsistency/subprojects/foo0000644000175000017500000000012514751453622032764 0ustar buildbuild[wrap-file] source_url = http://host.invalid/foo.tar.gz source_filename = foo.tar.gz ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/238 dependency include_type inconsistency/subprojects/baz.wrapmuon-v0.4.0/subprojects/meson-tests/common/238 dependency include_type inconsistency/subprojects/baz0000644000175000017500000000012514751453622032755 0ustar buildbuild[wrap-file] source_url = http://host.invalid/baz.tar.gz source_filename = baz.tar.gz ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/238 dependency include_type inconsistency/subprojects/foo/muon-v0.4.0/subprojects/meson-tests/common/238 dependency include_type inconsistency/subprojects/foo0002755000175000017500000000000014751453622032766 5ustar buildbuild././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/238 dependency include_type inconsistency/subprojects/foo/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/238 dependency include_type inconsistency/subprojects/foo0000644000175000017500000000032514751453622032766 0ustar buildbuildproject('foo') baz_dep = dependency( 'baz', fallback: ['baz', 'baz_dep'], include_type: 'system', method: 'pkg-config', required: false, ) foo_dep = declare_dependency(dependencies: baz_dep) muon-v0.4.0/subprojects/meson-tests/common/238 dependency include_type inconsistency/bar/0002755000175000017500000000000014751453622030463 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/238 dependency include_type inconsistency/bar/meson.build0000644000175000017500000000032514751453622032623 0ustar buildbuildbaz_dep = dependency( 'baz', fallback: ['baz', 'baz_dep'], include_type: 'system', method: 'pkg-config', # if we comment this out or change to 'auto' the build is successful required: false, ) muon-v0.4.0/subprojects/meson-tests/common/238 dependency include_type inconsistency/meson.build0000644000175000017500000000012414751453622032054 0ustar buildbuildproject('test') foo_dep = subproject('foo').get_variable('foo_dep') subdir('bar') muon-v0.4.0/subprojects/meson-tests/common/58 multiple generators/0002755000175000017500000000000014751453622024170 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/58 multiple generators/mygen.py0000755000175000017500000000066714751453622025673 0ustar buildbuild#!/usr/bin/env python3 import sys, os if len(sys.argv) != 3: print("You is fail.") sys.exit(1) with open(sys.argv[1]) as f: val = f.read().strip() outdir = sys.argv[2] outhdr = os.path.join(outdir, 'source%s.h' % val) outsrc = os.path.join(outdir, 'source%s.cpp' % val) with open(outhdr, 'w') as f: f.write('int func%s();\n' % val) with open(outsrc, 'w') as f: f.write('''int func%s() { return 0; } ''' % val) muon-v0.4.0/subprojects/meson-tests/common/58 multiple generators/main.cpp0000644000175000017500000000013214751453622025612 0ustar buildbuild#include"source1.h" #include"source2.h" int main(void) { return func1() + func2(); } muon-v0.4.0/subprojects/meson-tests/common/58 multiple generators/subdir/0002755000175000017500000000000014751453622025460 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/58 multiple generators/subdir/meson.build0000644000175000017500000000023414751453622027617 0ustar buildbuildgenerated = custom_target( 'generated', output: ['source1.h', 'source1.cpp'], input: 'data.dat', command: [comp, '@INPUT0@', '@OUTDIR@'], ) muon-v0.4.0/subprojects/meson-tests/common/58 multiple generators/subdir/data.dat0000644000175000017500000000000214751453622027051 0ustar buildbuild1 muon-v0.4.0/subprojects/meson-tests/common/58 multiple generators/data2.dat0000644000175000017500000000000214751453622025643 0ustar buildbuild2 muon-v0.4.0/subprojects/meson-tests/common/58 multiple generators/meson.build0000644000175000017500000000063314751453622026332 0ustar buildbuildproject('trickier generator', 'cpp') comp = find_program('mygen.py') subdir('subdir') generated2 = custom_target( 'generated2', output: ['source2.h', 'source2.cpp'], input: 'data2.dat', command: [comp, '@INPUT0@', '@OUTDIR@'], ) exe = executable( 'prog', 'main.cpp', generated, generated2, include_directories: include_directories('subdir'), ) test('generated test', exe) muon-v0.4.0/subprojects/meson-tests/common/113 interpreter copy mutable var on assignment/0002755000175000017500000000000014751453622030462 5ustar buildbuild././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/113 interpreter copy mutable var on assignment/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/113 interpreter copy mutable var on assignment/meson.buil0000644000175000017500000000105314751453622032455 0ustar buildbuildproject('foo') a = configuration_data() a.set('HELLO', 1) b = a assert(a.has('HELLO'), 'Original config data should be set on a') assert(b.has('HELLO'), 'Original config data should be set on copy') configure_file(output: 'b.h', configuration: b) # This should still work, as we didn't use the original above but a copy! a.set('WORLD', 1) assert(a.has('WORLD'), 'New config data should have been set') assert( not b.has('WORLD'), 'New config data set should not affect var copied earlier', ) configure_file(output: 'a.h', configuration: a) muon-v0.4.0/subprojects/meson-tests/common/108 ternary/0002755000175000017500000000000014751453622021743 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/108 ternary/meson.build0000644000175000017500000000077214751453622024111 0ustar buildbuildproject('ternary operator') x = true one = true ? 1 : error('False branch should not be evaluated') two = false ? error('True branch should not be evaluated.') : 2 three = '@0@'.format(x ? 'yes' : 'no') four = [x ? '0' : '1'] assert(one == 1, 'Return value from ternary true is wrong.') assert(two == 2, 'Return value from ternary false is wrong.') assert(three == 'yes', 'Return value for ternary inside method call is wrong.') assert(four == ['0'], 'Return value for ternary inside of list is wrong.') muon-v0.4.0/subprojects/meson-tests/common/203 find_library and headers/0002755000175000017500000000000014751453622025036 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/203 find_library and headers/meson.build0000644000175000017500000000123414751453622027176 0ustar buildbuildproject('find library and headers', 'c') cc = meson.get_compiler('c') if not cc.find_library('z', required: false).found() error('MESON_SKIP_TEST: zlib not found.') endif lib = cc.find_library('z', has_headers: 'foo.h', required: false) assert(not lib.found(), 'Header should be missing') lib = cc.find_library( 'z', has_headers: 'foo.h', header_include_directories: include_directories('.'), ) assert(lib.found(), 'Header should be found') lib = cc.find_library( 'z', has_headers: ['foo.h', 'bar.h'], header_include_directories: include_directories('.'), required: false, ) assert(not lib.found(), 'One header should be missing') muon-v0.4.0/subprojects/meson-tests/common/203 find_library and headers/foo.h0000644000175000017500000000001714751453622025766 0ustar buildbuild#define VAL 42 muon-v0.4.0/subprojects/meson-tests/common/57 custom header generator/0002755000175000017500000000000014751453622024674 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/57 custom header generator/somefile.txt0000644000175000017500000000000014751453622027224 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/57 custom header generator/meson.build0000644000175000017500000000157514751453622027044 0ustar buildbuildproject('custom header generator', 'c') cc_id = meson.get_compiler('c').get_id() cc_ver = meson.get_compiler('c').version() if cc_id == 'intel' or (cc_id == 'lcc' and cc_ver.version_compare('<=1.23.08')) # ICC and LCC <= 1.23.08 do not escape spaces in paths in the dependency file, so Ninja # (correctly) thinks that the rule has multiple outputs and errors out: # 'depfile has multiple output paths' error( 'MESON_SKIP_TEST: Skipping test because your compiler is known to generate broken dependency files', ) endif gen = find_program('makeheader.py') generated_h = custom_target( 'makeheader.py', output: 'myheader.lh', # Suffix not .h to ensure this works with custom suffixes, too. input: 'input.def', command: [gen, '@INPUT0@', '@OUTPUT0@', files('somefile.txt')], ) prog = executable('prog', 'prog.c', generated_h) test('gentest', prog) muon-v0.4.0/subprojects/meson-tests/common/57 custom header generator/makeheader.py0000644000175000017500000000050214751453622027327 0ustar buildbuild#!/usr/bin/env python3 # NOTE: this file does not have the executable bit set. This tests that # Meson can automatically parse shebang lines. import sys template = '#define RET_VAL %s\n' with open(sys.argv[1]) as f: output = template % (f.readline().strip(), ) with open(sys.argv[2], 'w') as f: f.write(output) muon-v0.4.0/subprojects/meson-tests/common/57 custom header generator/prog.c0000644000175000017500000000007614751453622026010 0ustar buildbuild#include"myheader.lh" int main(void) { return RET_VAL; } muon-v0.4.0/subprojects/meson-tests/common/57 custom header generator/input.def0000644000175000017500000000000214751453622026501 0ustar buildbuild0 muon-v0.4.0/subprojects/meson-tests/common/174 ndebug if-release enabled/0002755000175000017500000000000014751453622025076 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/174 ndebug if-release enabled/main.c0000644000175000017500000000053014751453622026162 0ustar buildbuild#include #include int meson_test_side_effect = EXIT_FAILURE; int meson_test_set_side_effect(void) { meson_test_side_effect = EXIT_SUCCESS; return 1; } int main(void) { // meson_test_side_effect is set only if assert is executed assert(meson_test_set_side_effect()); return meson_test_side_effect; } muon-v0.4.0/subprojects/meson-tests/common/174 ndebug if-release enabled/meson.build0000644000175000017500000000026614751453622027242 0ustar buildbuildproject( 'ndebug enabled', 'c', default_options: [ 'buildtype=debugoptimized', 'b_ndebug=if-release', ], ) test('exe', executable('main', 'main.c')) muon-v0.4.0/subprojects/meson-tests/common/256 subproject extracted objects/0002755000175000017500000000000014751453622026021 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/256 subproject extracted objects/subprojects/0002755000175000017500000000000014751453622030364 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/256 subproject extracted objects/subprojects/myobjects/0002755000175000017500000000000014751453622032363 5ustar buildbuild././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/256 subproject extracted objects/subprojects/myobjects/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/256 subproject extracted objects/subprojects/myobjects/me0000644000175000017500000000011514751453622032702 0ustar buildbuildproject('myobjects', 'cpp') sublib = static_library('sublib', 'cpplib.cpp') ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/256 subproject extracted objects/subprojects/myobjects/cpplib.cppmuon-v0.4.0/subprojects/meson-tests/common/256 subproject extracted objects/subprojects/myobjects/cp0000644000175000017500000000014514751453622032706 0ustar buildbuild#define BUILDING_DLL #include "cpplib.h" extern "C" int DLL_PUBLIC cppfunc(void) { return 42; } ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/256 subproject extracted objects/subprojects/myobjects/cpplib.hmuon-v0.4.0/subprojects/meson-tests/common/256 subproject extracted objects/subprojects/myobjects/cp0000644000175000017500000000060014751453622032702 0ustar buildbuild/* See http://gcc.gnu.org/wiki/Visibility#How_to_use_the_new_C.2B-.2B-_visibility_support */ #if defined(_WIN32) || defined(__CYGWIN__) #ifdef BUILDING_DLL #define DLL_PUBLIC __declspec(dllexport) #else #define DLL_PUBLIC __declspec(dllimport) #endif #else #define DLL_PUBLIC __attribute__ ((visibility ("default"))) #endif extern "C" int DLL_PUBLIC cppfunc(void); muon-v0.4.0/subprojects/meson-tests/common/256 subproject extracted objects/meson.build0000644000175000017500000000044514751453622030164 0ustar buildbuild# different from meson: no global compiler cache so we have to add cpp here # since it is the link lang of foo project('link to extracted objects', 'c', 'cpp') sublib = subproject('myobjects').get_variable('sublib') mainlib = static_library('foo', 'foo.c', install: true, link_with: sublib) muon-v0.4.0/subprojects/meson-tests/common/256 subproject extracted objects/test.json0000644000175000017500000000011514751453622027666 0ustar buildbuild{ "installed": [ { "type": "file", "file": "usr/lib/libfoo.a" } ] } muon-v0.4.0/subprojects/meson-tests/common/256 subproject extracted objects/foo.c0000644000175000017500000000031214751453622026742 0ustar buildbuild#if defined _WIN32 || defined __CYGWIN__ #define DLL_IMPORT __declspec(dllimport) #else #define DLL_IMPORT #endif int DLL_IMPORT cppfunc(void); int otherfunc(void) { return cppfunc() != 42; } muon-v0.4.0/subprojects/meson-tests/common/172 identical target name in subproject flat layout/0002755000175000017500000000000014751453622031321 5ustar buildbuild././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/172 identical target name in subproject flat layout/subprojects/muon-v0.4.0/subprojects/meson-tests/common/172 identical target name in subproject flat layout/subpr0002755000175000017500000000000014751453622032375 5ustar buildbuild././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/172 identical target name in subproject flat layout/subprojects/subproj/muon-v0.4.0/subprojects/meson-tests/common/172 identical target name in subproject flat layout/subpr0002755000175000017500000000000014751453622032375 5ustar buildbuild././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/172 identical target name in subproject flat layout/subprojects/subproj/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/172 identical target name in subproject flat layout/subpr0000644000175000017500000000012614751453622032374 0ustar buildbuildproject('subproj', 'c') foo = static_library('foo', 'foo.c', name_prefix: 'subproj') ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/172 identical target name in subproject flat layout/subprojects/subproj/foo.cmuon-v0.4.0/subprojects/meson-tests/common/172 identical target name in subproject flat layout/subpr0000644000175000017500000000006014751453622032371 0ustar buildbuildint meson_test_subproj_foo(void) { return 20; } ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/172 identical target name in subproject flat layout/main.cmuon-v0.4.0/subprojects/meson-tests/common/172 identical target name in subproject flat layout/main.0000644000175000017500000000053314751453622032245 0ustar buildbuild#include int meson_test_main_foo(void); int meson_test_subproj_foo(void); int main(void) { if (meson_test_main_foo() != 10) { printf("Failed meson_test_main_foo\n"); return 1; } if (meson_test_subproj_foo() != 20) { printf("Failed meson_test_subproj_foo\n"); return 1; } return 0; } ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/172 identical target name in subproject flat layout/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/172 identical target name in subproject flat layout/meson0000644000175000017500000000114014751453622032357 0ustar buildbuildproject('subproject targets', 'c') if meson.backend() == 'xcode' error( 'MESON_SKIP_TEST: many targets with the same name not supported in Xcode. Patches welcome.', ) endif # Idea behind this test is to create targets with identical name # but different output files. We can do this by choosing different # name_prefix of libraries. Target id does not depend on name_prefix. main_foo = static_library('foo', 'foo.c', name_prefix: 'main') subproj_foo = subproject('subproj').get_variable('foo') exe = executable('prog', 'main.c', link_with: [main_foo, subproj_foo]) test('main test', exe) muon-v0.4.0/subprojects/meson-tests/common/172 identical target name in subproject flat layout/foo.c0000644000175000017500000000005514751453622032246 0ustar buildbuildint meson_test_main_foo(void) { return 10; } muon-v0.4.0/subprojects/meson-tests/common/142 nested links/0002755000175000017500000000000014751453622022640 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/142 nested links/meson.build0000644000175000017500000000027414751453622025003 0ustar buildbuildproject('test', 'c') libxserver_dri3 = [] libxserver = [libxserver_dri3] executable('Xephyr', 'xephyr.c', link_with: [libxserver]) executable('Zephyr', 'xephyr.c', link_args: [[], []]) muon-v0.4.0/subprojects/meson-tests/common/142 nested links/xephyr.c0000644000175000017500000000004114751453622024314 0ustar buildbuildint main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/143 list of file sources/0002755000175000017500000000000014751453622024162 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/143 list of file sources/gen.py0000644000175000017500000000025614751453622025306 0ustar buildbuildimport shutil import sys if __name__ == '__main__': if len(sys.argv) != 3: raise Exception('Requires exactly 2 args') shutil.copy2(sys.argv[1], sys.argv[2]) muon-v0.4.0/subprojects/meson-tests/common/143 list of file sources/meson.build0000644000175000017500000000042314751453622026321 0ustar buildbuildproject('test') mod_py = import('python3') python = mod_py.find_python() test_target = custom_target( 'test_target', input: [files('gen.py'), files('foo')], output: 'bar', command: [python, '@INPUT0@', '@INPUT1@', '@OUTPUT@'], build_by_default: true, ) muon-v0.4.0/subprojects/meson-tests/common/143 list of file sources/foo0000644000175000017500000000001214751453622024657 0ustar buildbuildsome text muon-v0.4.0/subprojects/meson-tests/common/180 has link arg/0002755000175000017500000000000014751453622022502 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/180 has link arg/meson.build0000644000175000017500000000575514751453622024656 0ustar buildbuildproject('has link arg', 'c', 'cpp') cc = meson.get_compiler('c') cpp = meson.get_compiler('cpp') if cc.get_argument_syntax() == 'msvc' is_arg = '/OPT:REF' useless = '/DEBUG' isnt_arg = '/iambroken' else is_arg = '-Wl,-L/tmp' useless = '-Wl,-L/usr' isnt_arg = '-Wl,-iambroken' endif assert(cc.has_link_argument(is_arg), 'Arg that should have worked does not work.') assert( cpp.has_link_argument(is_arg), 'Arg that should have worked does not work.', ) if cc.get_id() != 'pgi' assert( not cc.has_link_argument(isnt_arg), 'Arg that should be broken is not.', ) assert( not cpp.has_link_argument(isnt_arg), 'Arg that should be broken is not.', ) assert( cc.get_supported_link_arguments([is_arg, isnt_arg, useless]) == [is_arg, useless], 'Arg filtering returned different result.', ) assert( cpp.get_supported_link_arguments([is_arg, isnt_arg, useless]) == [is_arg, useless], 'Arg filtering returned different result.', ) # Have useless at the end to ensure that the search goes from front to back. l1 = cc.first_supported_link_argument([isnt_arg, is_arg, isnt_arg, useless]) l2 = cc.first_supported_link_argument(isnt_arg, isnt_arg, isnt_arg) assert(l1.length() == 1, 'First supported returned wrong result.') assert(l1.get(0) == is_arg, 'First supported returned wrong argument.') assert(l2.length() == 0, 'First supported did not return empty array.') l1 = cpp.first_supported_link_argument([isnt_arg, is_arg, isnt_arg, useless]) l2 = cpp.first_supported_link_argument(isnt_arg, isnt_arg, isnt_arg) assert(l1.length() == 1, 'First supported returned wrong result.') assert(l1.get(0) == is_arg, 'First supported returned wrong argument.') assert(l2.length() == 0, 'First supported did not return empty array.') assert( not cc.has_multi_link_arguments([isnt_arg, is_arg]), 'Arg that should be broken is not.', ) assert( not cc.has_link_argument('-Wl,-z,nodelete42'), 'Did not detect wrong -z linker argument', ) endif assert( cc.has_multi_link_arguments(is_arg), 'Arg that should have worked does not work.', ) assert( cc.has_multi_link_arguments([useless, is_arg]), 'Arg that should have worked does not work.', ) # These are Visual Studio only flags # Testing has_argument_syntax is incorrect as it skips Microsoft Clang if cc.get_define('_MSC_FULL_VER') != '' if cc.get_linker_id() == 'link' is_only = '/OPT:REF' is_shared = '/GUARD:CF' else # ld-link is_only = '--color-diagnostics' is_shared = '-guard:cf' endif # requires -Wl,xxx as it goes through the compiler if cc.get_argument_syntax() != 'msvc' is_only = '-Wl,@0@'.format(is_only) is_shared = '-Wl,@0@'.format(is_shared) endif assert( cc.has_multi_link_arguments([is_only, is_shared]), 'Arg that should have worked does not work.', ) endif muon-v0.4.0/subprojects/meson-tests/common/191 subproject array version/0002755000175000017500000000000014751453622025206 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/191 subproject array version/subprojects/0002755000175000017500000000000014751453622027551 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/191 subproject array version/subprojects/foo/0002755000175000017500000000000014751453622030334 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/191 subproject array version/subprojects/foo/meson.build0000644000175000017500000000004114751453622032467 0ustar buildbuildproject('foo', version: '1.0.0') muon-v0.4.0/subprojects/meson-tests/common/191 subproject array version/meson.build0000644000175000017500000000010714751453622027344 0ustar buildbuildproject('master') x = subproject('foo', version: ['>=1.0.0', '<2.0']) muon-v0.4.0/subprojects/meson-tests/common/22 object extraction/0002755000175000017500000000000014751453622023601 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/22 object extraction/main.c0000644000175000017500000000010514751453622024663 0ustar buildbuildint func(void); int main(void) { return func() == 42 ? 0 : 1; } muon-v0.4.0/subprojects/meson-tests/common/22 object extraction/lib2.c0000644000175000017500000000004214751453622024567 0ustar buildbuildint retval(void) { return 43; } muon-v0.4.0/subprojects/meson-tests/common/22 object extraction/meson.build0000644000175000017500000000421214751453622025740 0ustar buildbuildproject('object extraction', 'c') if meson.is_unity() message('Skipping extraction test because this is a Unity build.') else lib1 = library('somelib', 'src/lib.c') lib2 = library('somelib2', 'lib.c', 'header.h', 'lib2.c') obj1 = lib1.extract_objects('src/lib.c') obj2 = lib2.extract_objects(['lib.c']) obj3 = lib2.extract_objects(files('lib.c')) # different from meson: no deduplication in extract_objects obj4 = lib2.extract_objects(['lib.c']) #, 'lib.c']) obj5 = lib2.extract_objects(['lib.c', 'header.h']) obj6 = lib2.extract_all_objects(recursive: true) e1 = executable('main1', 'main.c', objects: obj1) e2 = executable('main2', 'main.c', objects: obj2) e3 = executable('main3', 'main.c', objects: obj3) e4 = executable('main4', 'main.c', objects: obj4) e5 = executable('main5', 'main.c', objects: obj5) e6 = executable('main6', 'main.c', objects: obj6) ct_src = custom_target( 'lib3.c', output: 'lib3.c', capture: true, command: [find_program('create-source.py'), 'lib.c'], ) lib3 = library('somelib3', ct_src) e7 = executable('main7', 'main.c', objects: lib3.extract_objects(ct_src[0])) e8 = executable('main8', 'main.c', objects: lib3.extract_objects(ct_src)) gen = generator( find_program('create-source.py'), arguments: ['@INPUT@'], output: '@BASENAME@4.c', capture: true, ) gen_src = gen.process('lib.c') lib4 = library('somelib4', gen_src) e9 = executable('main9', 'main.c', objects: lib4.extract_objects(gen_src)) custom_target( 'custom_target with object inputs', output: 'objs', input: [obj1, obj2, obj3, obj5, obj6], build_by_default: true, command: [find_program('check-obj.py'), meson.backend(), '@INPUT@'], capture: true, ) test('extraction test 1', e1) test('extraction test 2', e2) test('extraction test 3', e3) test('extraction test 4', e4) test('extraction test 5', e5) test('extraction test 6', e6) test('extraction test 7', e7) test('extraction test 8', e8) test('extraction test 9', e9) endif muon-v0.4.0/subprojects/meson-tests/common/22 object extraction/header.h0000644000175000017500000000007214751453622025177 0ustar buildbuild/* Check that extract_all_objects works with headers. */ muon-v0.4.0/subprojects/meson-tests/common/22 object extraction/lib.c0000644000175000017500000000004214751453622024505 0ustar buildbuildint func(void) { return 42; } muon-v0.4.0/subprojects/meson-tests/common/22 object extraction/create-source.py0000644000175000017500000000010614751453622026707 0ustar buildbuild#! /usr/bin/env python3 import sys print(f'#include "{sys.argv[1]}"') muon-v0.4.0/subprojects/meson-tests/common/22 object extraction/src/0002755000175000017500000000000014751453622024370 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/22 object extraction/src/lib.c0000644000175000017500000000004214751453622025274 0ustar buildbuildint func(void) { return 42; } muon-v0.4.0/subprojects/meson-tests/common/22 object extraction/check-obj.py0000644000175000017500000000106014751453622025773 0ustar buildbuild#! /usr/bin/env python3 import json import sys import os cc = None output = None # Only the ninja backend produces compile_commands.json if sys.argv[1] == "ninja": if os.path.exists("compile_commands.json"): with open("compile_commands.json", "r") as f: cc = json.load(f) output = set((x["output"] for x in cc)) for obj in sys.argv[2:]: if not os.path.exists(obj): sys.exit(f"File {obj} not found.") if output and obj not in output: sys.exit(f"File {obj} not in output.") print("Verified", obj) muon-v0.4.0/subprojects/meson-tests/common/208 link custom/0002755000175000017500000000000014751453622022510 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/208 link custom/custom_stlib.py0000755000175000017500000000520314751453622025572 0ustar buildbuild#!/usr/bin/env python3 import shutil, sys, subprocess, argparse, pathlib import platform parser = argparse.ArgumentParser() parser.add_argument('--private-dir', required=True) parser.add_argument('-o', required=True) parser.add_argument('cmparr', nargs='+') contents = '''#include void flob(void) { printf("Now flobbing.\\n"); } ''' def get_pic_args(): platname = platform.system().lower() if platname in ['windows', 'darwin'] or sys.platform == 'cygwin': return [] return ['-fPIC'] def generate_lib_gnulike(outfile, c_file, private_dir, compiler_array): if shutil.which('ar'): static_linker = 'ar' elif shutil.which('llvm-ar'): static_linker = 'llvm-ar' elif shutil.which('gcc-ar'): static_linker = 'gcc-ar' else: sys.exit('Could not detect a static linker.') o_file = c_file.with_suffix('.o') compile_cmd = compiler_array + ['-c', '-g', '-O2', '-o', str(o_file), str(c_file)] compile_cmd += get_pic_args() subprocess.check_call(compile_cmd) out_file = pathlib.Path(outfile) if out_file.exists(): out_file.unlink() link_cmd = [static_linker, 'csr', outfile, str(o_file)] subprocess.check_call(link_cmd) return 0 def generate_lib_msvc(outfile, c_file, private_dir, compiler_array): static_linker = 'lib' o_file = c_file.with_suffix('.obj') compile_cmd = compiler_array + ['/MDd', '/nologo', '/ZI', '/Ob0', '/Od', '/c', '/Fo' + str(o_file), str(c_file)] subprocess.check_call(compile_cmd) out_file = pathlib.Path(outfile) if out_file.exists(): out_file.unlink() link_cmd = [static_linker, '/nologo', '/OUT:' + str(outfile), str(o_file)] subprocess.check_call(link_cmd) return 0 def generate_lib(outfile, private_dir, compiler_array): private_dir = pathlib.Path(private_dir) if not private_dir.exists(): private_dir.mkdir() c_file = private_dir / 'flob.c' c_file.write_text(contents) for i in compiler_array: if (i.endswith('cl') or i.endswith('cl.exe')) and 'clang-cl' not in i: return generate_lib_msvc(outfile, c_file, private_dir, compiler_array) return generate_lib_gnulike(outfile, c_file, private_dir, compiler_array) if __name__ == '__main__': options = parser.parse_args() sys.exit(generate_lib(options.o, options.private_dir, options.cmparr)) muon-v0.4.0/subprojects/meson-tests/common/208 link custom/outerlib.c0000644000175000017500000000011314751453622024472 0ustar buildbuildvoid inner_lib_func(void); void outer_lib_func(void) { inner_lib_func(); }muon-v0.4.0/subprojects/meson-tests/common/208 link custom/custom_target.c0000644000175000017500000000012314751453622025526 0ustar buildbuildvoid outer_lib_func(void); int main(void) { outer_lib_func(); return 0; } muon-v0.4.0/subprojects/meson-tests/common/208 link custom/meson.build0000644000175000017500000000556414751453622024662 0ustar buildbuildproject('linkcustom', 'c') # This would require passing the static linker to the build script or having # it detect it by itself. I'm too lazy to implement it now and it is not # really needed for testing that custom targets work. It is the responsibility # of the custom target to produce things in the correct format. assert( not meson.is_cross_build(), 'MESON_SKIP_TEST cross checking not implemented.', ) cc = meson.get_compiler('c') genprog = find_program('custom_stlib.py') clib = custom_target( 'linkcustom', output: 'libflob.a', command: [genprog, '-o', '@OUTPUT@', '--private-dir', '@PRIVATE_DIR@'] + cc.cmd_array(), ) # custom_target tests exe = executable('prog', 'prog.c', link_with: clib) test('linkcustom', exe) d = declare_dependency(link_with: clib) exe2 = executable('prog2', 'prog.c', dependencies: d) test('linkcustom2', exe2) # Link whole tests if meson.backend() == 'xcode' message('Xcode does not support link whole so skipping.') else exe3 = executable('prog3', 'prog.c', link_whole: clib) test('linkwhole', exe) d2 = declare_dependency(link_whole: clib) exe4 = executable('prog4', 'prog.c', dependencies: d2) test('linkwhole2', exe2) endif # custom_target[i] tests exe_i = executable('prog_i', 'prog.c', link_with: clib[0]) test('linkcustom', exe_i) d_i = declare_dependency(link_with: clib[0]) exe2_i = executable('prog2_i', 'prog.c', dependencies: d_i) test('linkcustom2_i', exe2_i) # Link whole tests if meson.backend() == 'xcode' message('Xcode does not support link whole so skipping.') else shared_library('lib1', 'lib.c', link_whole: clib) exe3_i = executable('prog3_i', 'prog.c', link_whole: clib[0]) test('linkwhole', exe) d2_i = declare_dependency(link_whole: clib[0]) exe4_i = executable('prog4_i', 'prog.c', dependencies: d2_i) test('linkwhole2_i', exe2_i) endif # Link with custom target dummy = static_library('dummy', 'dummy.c') custom_prog = find_program('custom_target.py') t = custom_target( 'custom', input: dummy, output: 'libcustom.a', command: [custom_prog, '@INPUT@', '@OUTPUT@'], ) dep1 = declare_dependency(link_with: t) dep2 = declare_dependency(link_with: t[0]) lib1 = static_library('lib1', 'outerlib.c', dependencies: dep1) lib2 = static_library('lib2', 'outerlib.c', dependencies: dep2) exe1 = executable('exe1', 'custom_target.c', link_with: lib1) test('custom_target_1', exe1) exe1_2 = executable('exe1_2', 'custom_target.c', link_with: lib2) test('custom_target_2', exe2) # Link with custom target containing a SONAME dummy3 = shared_library('dummy3', 'dummy.c', version: '1.0') t = custom_target( input: dummy, output: 'libcustom@PLAINNAME@', command: [custom_prog, '@INPUT@', '@OUTPUT@'], ) lib3 = static_library('lib3', 'outerlib.c', link_with: t) exe3 = executable('exe3', 'custom_target.c', link_with: lib3) test('custom_target_3', exe3) muon-v0.4.0/subprojects/meson-tests/common/208 link custom/lib.c0000644000175000017500000000007214751453622023417 0ustar buildbuildvoid flob(void); int foo(void) { flob(); return 0; } muon-v0.4.0/subprojects/meson-tests/common/208 link custom/dummy.c0000644000175000017500000000003414751453622024002 0ustar buildbuildvoid inner_lib_func(void) {}muon-v0.4.0/subprojects/meson-tests/common/208 link custom/prog.c0000644000175000017500000000007714751453622023625 0ustar buildbuildvoid flob(void); int main(void) { flob(); return 0; } muon-v0.4.0/subprojects/meson-tests/common/208 link custom/custom_target.py0000644000175000017500000000016514751453622025742 0ustar buildbuild#!/usr/bin/env python3 import shutil, sys if __name__ == '__main__': shutil.copyfile(sys.argv[1], sys.argv[2]) muon-v0.4.0/subprojects/meson-tests/common/224 arithmetic operators/0002755000175000017500000000000014751453622024406 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/224 arithmetic operators/meson.build0000644000175000017500000000040514751453622026545 0ustar buildbuildproject('arithmetic operators') assert(5 - 3 - 1 == 1) assert(5 - (3 - 1) == 3) assert(5 - 1 * 3 - 3 == -1) assert(420 - 300 - 51 == 69) assert(1000 / 2 / 2 / 2 == 125) assert(4 * 9 / 3 % 8 - 3 - 10 / 2 == -4) assert(94 - 30 + (2 - (40 - 6 + 7) - 9) - 10 == 6) muon-v0.4.0/subprojects/meson-tests/common/188 dict/0002755000175000017500000000000014751453622021212 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/188 dict/meson.build0000644000175000017500000000440114751453622023351 0ustar buildbuildproject('dict test', 'c') dict = {'foo': 'bar', 'baz': 'foo', 'foo bar': 'baz'} exe = executable('prog', sources: ['prog.c']) i = 0 foreach key, value : dict test('dict test @0@'.format(key), exe, args: [dict[key], value]) i += 1 endforeach assert(i == 3, 'There should be three elements in that dictionary') empty_dict = {} foreach key, value : empty_dict assert(false, 'This dict should be empty') endforeach d1 = empty_dict + {'a': 'b'} assert(d1 == {'a': 'b'}, 'dict addition is not working') d2 = d1 + {'a': 'b2', 'c': 'd'} assert(d2 == {'a': 'b2', 'c': 'd'}, 'dict addition is not working') assert(d1 == {'a': 'b'}, 'dict should be immutable') d3 = d2 d3 += {'e': 'f'} assert(d3 == {'a': 'b2', 'c': 'd', 'e': 'f'}, 'dict plusassign is not working') assert(d2 == {'a': 'b2', 'c': 'd'}, 'dict should be immutable') dict1 = {} # A variable to be used as a key testkey1 = 'myKey1' testkey2 = 'myKey2' # Add new entry using the variable dict1 += {testkey1: 'myValue'} dict1 += {testkey2: 42} # Test that the stored values are correct assert( dict1[testkey1] == 'myValue', 'Incorrect string value retrieved from dictionary - variable key', ) assert( dict1['myKey1'] == 'myValue', 'Incorrect string value retrieved from dictionary - literal key', ) assert( dict1[testkey2] == 42, 'Incorrect int value retrieved from dictionary - variable key', ) assert( dict1['myKey2'] == 42, 'Incorrect int value retrieved from dictionary - literal key', ) d = {testkey1: 1} assert( d[testkey1] == 1, 'Incorrect int value retrieved from dictionary - variable key', ) assert( d['myKey1'] == 1, 'Incorrect int value retrieved from dictionary - literal key', ) d = {'1' / '2': 1, join_paths('a', 'b'): 2} k1 = '1' / '2' k2 = join_paths('a', 'b') assert(d[k1] == 1, 'Incorrect expression evaluation in dictionary key') assert(d[k2] == 2, 'Incorrect expression evaluation in dictionary key') d = {'a' + 'b': 1} assert(d['a' + 'b'] == 1, 'Incorrect expression evaluation in dictionary key') assert(d['ab'] == 1, 'Incorrect expression evaluation in dictionary key') # Complex types d = { 'sanity': 1, 'host': host_machine, 'meson': meson, } assert(d['sanity'] == 1) assert(not is_disabler(d['meson'])) assert(not is_disabler(d['host'])) muon-v0.4.0/subprojects/meson-tests/common/188 dict/prog.c0000644000175000017500000000017414751453622022325 0ustar buildbuild#include int main(int argc, char **argv) { if (argc != 3) return 1; return strcmp(argv[1], argv[2]); } muon-v0.4.0/subprojects/meson-tests/common/127 generated assembly/0002755000175000017500000000000014751453622024016 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/127 generated assembly/square-x86.S.in0000644000175000017500000000105514751453622026471 0ustar buildbuild#include "symbol-underscore.h" #if defined(_MSC_VER) && !defined(__clang__) .386 .MODEL FLAT, C PUBLIC square_unsigned _TEXT SEGMENT square_unsigned PROC var1:DWORD mov eax, var1 imul eax, eax ret square_unsigned ENDP _TEXT ENDS END #else .text .globl SYMBOL_NAME(square_unsigned) /* Only supported with GAS */ # if defined(__linux__) || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) .type square_unsigned,@function # endif SYMBOL_NAME(square_unsigned): movl 4(%esp), %eax imull %eax, %eax retl #endif muon-v0.4.0/subprojects/meson-tests/common/127 generated assembly/symbol-underscore.h0000644000175000017500000000017314751453622027642 0ustar buildbuild#if defined(MESON_TEST__UNDERSCORE_SYMBOL) # define SYMBOL_NAME(name) _##name #else # define SYMBOL_NAME(name) name #endif muon-v0.4.0/subprojects/meson-tests/common/127 generated assembly/main.c0000644000175000017500000000043414751453622025105 0ustar buildbuild#include #if defined(_WIN32) || defined(__CYGWIN__) __declspec(dllimport) #endif unsigned square_unsigned (unsigned a); int main(void) { unsigned int ret = square_unsigned (2); if (ret != 4) { printf("Got %u instead of 4\n", ret); return 1; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/127 generated assembly/square.def0000644000175000017500000000003114751453622025766 0ustar buildbuildEXPORTS square_unsigned muon-v0.4.0/subprojects/meson-tests/common/127 generated assembly/empty.c0000644000175000017500000000000014751453622025304 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/127 generated assembly/meson.build0000644000175000017500000000421714751453622026162 0ustar buildbuildproject('generated assembly', 'c') cc = meson.get_compiler('c') if ['msvc', 'intel-cl'].contains(cc.get_id()) error( 'MESON_SKIP_TEST: assembly files cannot be compiled directly by the compiler', ) endif if meson.backend() == 'xcode' error( 'MESON_SKIP_TEST: asm not supported with the Xcode backend. Patches welcome.', ) endif crt_workaround = [] if cc.get_linker_id() == 'lld-link' # It seems that when building without a .c file, lld-link.exe # misses the fact that it needs to include the c runtime to # make a working .dll. So here we add an empty .c file to easily # pull in crt. crt_workaround += 'empty.c' if host_machine.cpu_family() == 'x86' # x86 assembly needs manual annotation to be compatible with # Safe Exception Handlers (?) This assembly doesn't have such # annotation, so just disable the feature. add_project_link_arguments('/SAFESEH:NO', language: 'c') endif endif cpu = host_machine.cpu_family() supported_cpus = ['arm', 'x86', 'x86_64'] if not supported_cpus.contains(cpu) error('MESON_SKIP_TEST: unsupported cpu family: ' + cpu) endif if cc.get_id() == 'clang-cl' and cc.version().version_compare('< 12.0.0') and cpu == 'arm' # https://reviews.llvm.org/D89622 error( 'MESON_SKIP_TEST: arm debug symbols not supported in clang-cl < 12.0.0', ) endif if cc.symbols_have_underscore_prefix() add_project_arguments('-DMESON_TEST__UNDERSCORE_SYMBOL', language: ['c', 'assembly']) endif copy = find_program('copyfile.py') output = 'square-@0@.S'.format(cpu) input = output + '.in' copygen = generator(copy, arguments: ['@INPUT@', '@OUTPUT@'], output: '@BASENAME@') l = library( 'square-gen', crt_workaround + [copygen.process(input)], vs_module_defs: 'square.def', ) test('square-gen-test', executable('square-gen-test', 'main.c', link_with: l)) copyct = custom_target( 'square', input: input, output: output, command: [copy, '@INPUT@', '@OUTPUT@'], ) l = library('square-ct', crt_workaround + [copyct], vs_module_defs: 'square.def') test('square-ct-test', executable('square-ct-test', 'main.c', link_with: l)) muon-v0.4.0/subprojects/meson-tests/common/127 generated assembly/square-arm.S.in0000644000175000017500000000046714751453622026631 0ustar buildbuild#include "symbol-underscore.h" .text .globl SYMBOL_NAME(square_unsigned) /* Only supported with GAS */ # if defined(__linux__) || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) .type square_unsigned,%function #endif SYMBOL_NAME(square_unsigned): mul r1, r0, r0 mov r0, r1 mov pc, lr muon-v0.4.0/subprojects/meson-tests/common/127 generated assembly/square-x86_64.S.in0000644000175000017500000000136414751453622027005 0ustar buildbuild#include "symbol-underscore.h" #if defined(_MSC_VER) && !defined(__clang__) /* MSVC on Windows */ PUBLIC SYMBOL_NAME(square_unsigned) _TEXT SEGMENT SYMBOL_NAME(square_unsigned) PROC mov eax, ecx imul eax, eax ret SYMBOL_NAME(square_unsigned) ENDP _TEXT ENDS END #else .text .globl SYMBOL_NAME(square_unsigned) /* Only supported with GAS */ # if defined(__linux__) || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__sun) .type square_unsigned,@function # endif # if defined(_WIN32) || defined(__CYGWIN__) /* msabi */ SYMBOL_NAME(square_unsigned): imull %ecx, %ecx movl %ecx, %eax retq # else /* sysvabi */ SYMBOL_NAME(square_unsigned): imull %edi, %edi movl %edi, %eax retq # endif #endif muon-v0.4.0/subprojects/meson-tests/common/127 generated assembly/copyfile.py0000644000175000017500000000013414751453622026176 0ustar buildbuild#!/usr/bin/env python3 import sys import shutil shutil.copyfile(sys.argv[1], sys.argv[2]) muon-v0.4.0/subprojects/meson-tests/common/83 identical target name in subproject/0002755000175000017500000000000014751453622027035 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/83 identical target name in subproject/subprojects/0002755000175000017500000000000014751453622031400 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/83 identical target name in subproject/subprojects/foo/0002755000175000017500000000000014751453622032163 5ustar buildbuild././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/83 identical target name in subproject/subprojects/foo/true.pymuon-v0.4.0/subprojects/meson-tests/common/83 identical target name in subproject/subprojects/foo/tr0000644000175000017500000000007414751453622032532 0ustar buildbuild#!/usr/bin/env python3 if __name__ == '__main__': pass ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/83 identical target name in subproject/subprojects/foo/bar.cmuon-v0.4.0/subprojects/meson-tests/common/83 identical target name in subproject/subprojects/foo/ba0000644000175000017500000000013314751453622032463 0ustar buildbuild#include int main(void) { printf("I'm a subproject bar.\n"); return 0; } ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/common/83 identical target name in subproject/subprojects/foo/meson.buildmuon-v0.4.0/subprojects/meson-tests/common/83 identical target name in subproject/subprojects/foo/me0000644000175000017500000000027314751453622032507 0ustar buildbuildproject('subfoo', 'c') true_cmd = find_program('true.py') executable('bar', 'bar.c') run_target('nop', command: [true_cmd]) custom_target('cus', output: ['cus.c'], command: [true_cmd]) muon-v0.4.0/subprojects/meson-tests/common/83 identical target name in subproject/true.py0000644000175000017500000000007414751453622030365 0ustar buildbuild#!/usr/bin/env python3 if __name__ == '__main__': pass muon-v0.4.0/subprojects/meson-tests/common/83 identical target name in subproject/bar.c0000644000175000017500000000013514751453622027742 0ustar buildbuild#include int main(void) { printf("I'm a main project bar.\n"); return 0; } muon-v0.4.0/subprojects/meson-tests/common/83 identical target name in subproject/meson.build0000644000175000017500000000032414751453622031174 0ustar buildbuildproject('toplevel bar', 'c') subproject('foo') true_cmd = find_program('true.py') executable('bar', 'bar.c') run_target('nop', command: [true_cmd]) custom_target('cus', output: ['cus.c'], command: [true_cmd]) muon-v0.4.0/subprojects/meson-tests/common/144 link depends custom target/0002755000175000017500000000000014751453622025361 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/144 link depends custom target/meson.build0000644000175000017500000000060414751453622027521 0ustar buildbuildproject('link_depends_custom_target', 'c') cmd = find_program('make_file.py') dep_file = custom_target('gen_dep', command: [cmd, '@OUTPUT@'], output: 'dep_file') exe = executable( 'foo', 'foo.c', link_depends: dep_file, c_args: ['-DDEPFILE="' + dep_file.full_path() + '"'], ) # check that dep_file exists, which means that link_depends target ran test('runtest', exe) muon-v0.4.0/subprojects/meson-tests/common/144 link depends custom target/make_file.py0000755000175000017500000000016314751453622027650 0ustar buildbuild#!/usr/bin/env python3 import sys with open(sys.argv[1], 'w') as f: print('# this file does nothing', file=f) muon-v0.4.0/subprojects/meson-tests/common/144 link depends custom target/foo.c0000644000175000017500000000034614751453622026311 0ustar buildbuild#include int main(void) { const char *fn = DEPFILE; FILE *f = fopen(fn, "r"); if (!f) { printf("could not open %s", fn); return 1; } else { printf("successfully opened %s", fn); } return 0; } muon-v0.4.0/subprojects/meson-tests/common/7 mixed/0002755000175000017500000000000014751453622021223 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/7 mixed/func.c0000644000175000017500000000007014751453622022315 0ustar buildbuildint func(void) { int class = 0; return class; } muon-v0.4.0/subprojects/meson-tests/common/7 mixed/meson.build0000644000175000017500000000015214751453622023361 0ustar buildbuildproject('mixed C and C++', 'c', 'cpp') exe = executable('prog', 'main.cc', 'func.c') test('mixtest', exe) muon-v0.4.0/subprojects/meson-tests/common/7 mixed/main.cc0000644000175000017500000000013214751453622022450 0ustar buildbuildextern "C" int func(); class BreakPlainCCompiler; int main(void) { return func(); } muon-v0.4.0/subprojects/meson-tests/common/69 configure file in custom target/0002755000175000017500000000000014751453622026217 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/69 configure file in custom target/inc/0002755000175000017500000000000014751453622026770 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/69 configure file in custom target/inc/confdata.in0000644000175000017500000000001014751453622031064 0ustar buildbuild@VALUE@ muon-v0.4.0/subprojects/meson-tests/common/69 configure file in custom target/inc/meson.build0000644000175000017500000000021614751453622031127 0ustar buildbuildcdata = configuration_data() cdata.set('VALUE', '42') cfile = configure_file(input: 'confdata.in', output: 'confdata', configuration: cdata) muon-v0.4.0/subprojects/meson-tests/common/69 configure file in custom target/meson.build0000644000175000017500000000010314751453622030351 0ustar buildbuildproject('conf file in custom target') subdir('inc') subdir('src') muon-v0.4.0/subprojects/meson-tests/common/69 configure file in custom target/src/0002755000175000017500000000000014751453622027006 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/69 configure file in custom target/src/meson.build0000644000175000017500000000106214751453622031145 0ustar buildbuildcustom_target( 'thing', output: 'final.dat', input: cfile, command: [find_program('mycompiler.py'), '@INPUT@', '@OUTPUT@'], ) # Test usage of a `configure_file` as part of the command list py3 = find_program('python3', required: false) if not py3.found() # Maybe 'python' is Python 3 py3 = find_program('python') endif compiler = configure_file(input: 'mycompiler.py', output: 'mycompiler2.py', copy: true) custom_target( 'thing2', output: 'final2.dat', input: cfile, command: [py3, compiler, '@INPUT@', '@OUTPUT@'], ) muon-v0.4.0/subprojects/meson-tests/common/69 configure file in custom target/src/mycompiler.py0000644000175000017500000000032214751453622031533 0ustar buildbuild#!/usr/bin/env python3 import sys with open(sys.argv[1]) as ifile: if ifile.readline().strip() != '42': print('Incorrect input') with open(sys.argv[2], 'w') as ofile: ofile.write('Success\n') muon-v0.4.0/subprojects/meson-tests/common/39 library chain/0002755000175000017500000000000014751453622022711 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/39 library chain/main.c0000644000175000017500000000007114751453622023775 0ustar buildbuildint libfun(void); int main(void) { return libfun(); } muon-v0.4.0/subprojects/meson-tests/common/39 library chain/subdir/0002755000175000017500000000000014751453622024201 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/39 library chain/subdir/lib1.c0000644000175000017500000000061414751453622025173 0ustar buildbuildint lib2fun(void); int lib3fun(void); #if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllexport) #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif int DLL_PUBLIC libfun(void) { return lib2fun() + lib3fun(); } muon-v0.4.0/subprojects/meson-tests/common/39 library chain/subdir/subdir3/0002755000175000017500000000000014751453622025554 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/39 library chain/subdir/subdir3/lib3.c0000644000175000017500000000052314751453622026547 0ustar buildbuild#if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllexport) #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif int DLL_PUBLIC lib3fun(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/39 library chain/subdir/subdir3/meson.build0000644000175000017500000000007014751453622027711 0ustar buildbuildlib3 = shared_library('lib3', 'lib3.c', install: false) muon-v0.4.0/subprojects/meson-tests/common/39 library chain/subdir/meson.build0000644000175000017500000000016614751453622026344 0ustar buildbuildsubdir('subdir2') subdir('subdir3') lib1 = shared_library('lib1', 'lib1.c', install: false, link_with: [lib2, lib3]) muon-v0.4.0/subprojects/meson-tests/common/39 library chain/subdir/subdir2/0002755000175000017500000000000014751453622025553 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/39 library chain/subdir/subdir2/lib2.c0000644000175000017500000000052214751453622026544 0ustar buildbuild#if defined _WIN32 || defined __CYGWIN__ #define DLL_PUBLIC __declspec(dllexport) #else #if defined __GNUC__ #define DLL_PUBLIC __attribute__ ((visibility("default"))) #else #pragma message ("Compiler does not support symbol visibility.") #define DLL_PUBLIC #endif #endif int DLL_PUBLIC lib2fun(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/39 library chain/subdir/subdir2/meson.build0000644000175000017500000000007014751453622027710 0ustar buildbuildlib2 = shared_library('lib2', 'lib2.c', install: false) muon-v0.4.0/subprojects/meson-tests/common/39 library chain/meson.build0000644000175000017500000000017314751453622025052 0ustar buildbuildproject('libchain', 'c') subdir('subdir') e = executable('prog', 'main.c', link_with: lib1, install: true) test('tst', e) muon-v0.4.0/subprojects/meson-tests/common/39 library chain/test.json0000644000175000017500000000016214751453622024560 0ustar buildbuild{ "installed": [ {"type": "exe", "file": "usr/bin/prog"}, {"type": "pdb", "file": "usr/bin/prog"} ] } muon-v0.4.0/subprojects/meson-tests/common/192 feature option/0002755000175000017500000000000014751453622023206 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/192 feature option/meson_options.txt0000644000175000017500000000050414751453622026640 0ustar buildbuildoption( 'required', type: 'feature', value: 'enabled', description: 'An required feature', ) option( 'optional', type: 'feature', value: 'auto', description: 'An optional feature', ) option( 'disabled', type: 'feature', value: 'disabled', description: 'A disabled feature', ) muon-v0.4.0/subprojects/meson-tests/common/192 feature option/meson.build0000644000175000017500000001052514751453622025351 0ustar buildbuildproject('feature user option', 'c') feature_opts = get_option('auto_features') required_opt = get_option('required') optional_opt = get_option('optional') disabled_opt = get_option('disabled') assert(not feature_opts.enabled(), 'Should be auto option') assert(not feature_opts.disabled(), 'Should be auto option') assert(feature_opts.auto(), 'Should be auto option') assert(feature_opts.allowed(), 'Should be auto option') assert(required_opt.enabled(), 'Should be enabled option') assert(not required_opt.disabled(), 'Should be enabled option') assert(not required_opt.auto(), 'Should be enabled option') assert(required_opt.allowed(), 'Should be enabled option') assert( required_opt.require(true, error_message: 'xyz').enabled(), 'Should be enabled option', ) assert( required_opt.enable_if(true, error_message: 'xyz').enabled(), 'Should be enabled option', ) assert( required_opt.enable_if(false, error_message: 'xyz').enabled(), 'Should be enabled option', ) assert( required_opt.disable_if(false, error_message: 'xyz').enabled(), 'Should be enabled option', ) assert(required_opt.disable_auto_if(true).enabled(), 'Should be enabled option') assert(required_opt.disable_auto_if(false).enabled(), 'Should be enabled option') assert(required_opt.enable_auto_if(true).enabled(), 'Should be enabled option') assert(required_opt.enable_auto_if(false).enabled(), 'Should be enabled option') assert(not optional_opt.enabled(), 'Should be auto option') assert(not optional_opt.disabled(), 'Should be auto option') assert(optional_opt.auto(), 'Should be auto option') assert(optional_opt.allowed(), 'Should be auto option') assert(optional_opt.require(true).auto(), 'Should be auto option') assert( optional_opt.require(false, error_message: 'xyz').disabled(), 'Should be disabled auto option', ) assert(optional_opt.enable_if(true).enabled(), 'Should be enabled option') assert(optional_opt.enable_if(false).auto(), 'Should be auto option') assert(optional_opt.disable_if(true).disabled(), 'Should be disabled auto option') assert(optional_opt.disable_if(false).auto(), 'Should be auto option') assert( optional_opt.disable_auto_if(true).disabled(), 'Should be disabled auto option', ) assert(optional_opt.disable_auto_if(false).auto(), 'Should be auto option') assert( optional_opt.enable_auto_if(true).enabled(), 'Should be disabled auto option', ) assert(optional_opt.enable_auto_if(false).auto(), 'Should be auto option') assert(not disabled_opt.enabled(), 'Should be disabled option') assert(disabled_opt.disabled(), 'Should be disabled option') assert(not disabled_opt.auto(), 'Should be disabled option') assert(not disabled_opt.allowed(), 'Should be disabled option') assert(disabled_opt.require(true).disabled(), 'Should be disabled option') assert( disabled_opt.require(false, error_message: 'xyz').disabled(), 'Should be disabled option', ) assert(disabled_opt.enable_if(false).disabled(), 'Should be disabled option') assert(disabled_opt.disable_if(true).disabled(), 'Should be disabled option') assert(disabled_opt.disable_if(false).disabled(), 'Should be disabled option') assert(disabled_opt.disable_auto_if(true).disabled(), 'Should be disabled option') assert( disabled_opt.disable_auto_if(false).disabled(), 'Should be disabled option', ) assert(disabled_opt.enable_auto_if(true).disabled(), 'Should be disabled option') assert(disabled_opt.enable_auto_if(false).disabled(), 'Should be disabled option') dep = dependency('threads', required: required_opt) assert(dep.found(), 'Should find required "threads" dep') dep = dependency('threads', required: optional_opt) assert(dep.found(), 'Should find optional "threads" dep') dep = dependency('threads', required: disabled_opt) assert(not dep.found(), 'Should not find disabled "threads" dep') dep = dependency('notfounddep', required: optional_opt) assert(not dep.found(), 'Should not find optional "notfounddep" dep') dep = dependency('notfounddep', required: disabled_opt) assert(not dep.found(), 'Should not find disabled "notfounddep" dep') cc = meson.get_compiler('c') lib = cc.find_library('m', required: disabled_opt) assert(not lib.found(), 'Should not find "m" library') cp = find_program('cp', required: disabled_opt) assert(not cp.found(), 'Should not find "cp" program') found = add_languages('cpp', required: disabled_opt) assert(not found, 'Should not find "cpp" language') muon-v0.4.0/subprojects/meson-tests/common/126 generated llvm ir/0002755000175000017500000000000014751453622023543 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/126 generated llvm ir/main.c0000644000175000017500000000032314751453622024627 0ustar buildbuild#include unsigned square_unsigned (unsigned a); int main(void) { unsigned int ret = square_unsigned (2); if (ret != 4) { printf("Got %u instead of 4\n", ret); return 1; } return 0; } muon-v0.4.0/subprojects/meson-tests/common/126 generated llvm ir/meson.build0000644000175000017500000000146014751453622025704 0ustar buildbuildproject('generated llvm ir', 'c') if meson.get_compiler('c').get_id() != 'clang' error('MESON_SKIP_TEST: LLVM IR files can only be built with clang') endif if meson.backend() == 'xcode' error( 'MESON_SKIP_TEST: LLVM ir not supported with the Xcode backend. Patches welcome.', ) endif copy = find_program('copyfile.py') copygen = generator(copy, arguments: ['@INPUT@', '@OUTPUT@'], output: '@BASENAME@') l = library('square-gen', copygen.process('square.ll.in')) test('square-gen-test', executable('square-gen-test', 'main.c', link_with: l)) copyct = custom_target( 'square', input: 'square.ll.in', output: 'square.ll', command: [copy, '@INPUT@', '@OUTPUT@'], ) l = library('square-ct', copyct) test('square-ct-test', executable('square-ct-test', 'main.c', link_with: l)) muon-v0.4.0/subprojects/meson-tests/common/126 generated llvm ir/square.ll.in0000644000175000017500000000011314751453622025772 0ustar buildbuilddefine i32 @square_unsigned(i32 %a) { %1 = mul i32 %a, %a ret i32 %1 } muon-v0.4.0/subprojects/meson-tests/common/126 generated llvm ir/copyfile.py0000644000175000017500000000013414751453622025723 0ustar buildbuild#!/usr/bin/env python3 import sys import shutil shutil.copyfile(sys.argv[1], sys.argv[2]) muon-v0.4.0/subprojects/meson-tests/common/37 has member/0002755000175000017500000000000014751453622022203 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/37 has member/meson.build0000644000175000017500000000146414751453622024350 0ustar buildbuildproject('has member', 'c', 'cpp') compilers = [meson.get_compiler('c'), meson.get_compiler('cpp')] foreach cc : compilers if not cc.has_member('struct tm', 'tm_sec', prefix: '#include') error('Did not detect member of "struct tm" that exists: "tm_sec"') endif if cc.has_member('struct tm', 'tm_nonexistent', prefix: '#include') error('Not existing member "tm_nonexistent" found.') endif if not cc.has_members('struct tm', 'tm_sec', 'tm_min', prefix: '#include') error( 'Did not detect members of "struct tm" that exist: "tm_sec" "tm_min"', ) endif if cc.has_members('struct tm', 'tm_sec', 'tm_nonexistent2', prefix: '#include') error('Not existing member "tm_nonexistent2" found.') endif endforeach muon-v0.4.0/subprojects/meson-tests/common/56 array methods/0002755000175000017500000000000014751453622022743 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/56 array methods/a.txt0000644000175000017500000000000014751453622023710 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/56 array methods/c.txt0000644000175000017500000000000014751453622023712 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/56 array methods/meson.build0000644000175000017500000000257514751453622025114 0ustar buildbuildproject('array methods') empty = [] one = ['abc'] two = ['def', 'ghi'] combined = [empty, one, two] file_list = files('a.txt', 'b.txt') file_a = files('a.txt') file_c = files('c.txt') if file_a[0] != file_list[0] error('Files are not equal') endif if not file_list.contains(file_a[0]) error('Contains with ObjectHolder lists does not work') endif if file_list.contains(file_c[0]) error('Contains with ObjectHolder lists found nonexistent object') endif if empty.contains('abc') error('Empty is not empty.') endif if one.contains('a') error('One claims to contain a') endif if not one.contains('abc') error('One claims to not contain abc.') endif if one.contains('abcd') error('One claims to contain abcd.') endif if two.contains('abc') error('Two claims to contain abc.') endif if not two.contains('def') error('Two claims not to contain def.') endif if not two.contains('ghi') error('Two claims not to contain ghi.') endif if two.contains('defg') error('Two claims to contain defg.') endif if not combined.contains('abc') error('Combined claims not to contain abc.') endif if not combined.contains(one) error('Combined claims not to contain [abc].') endif if not combined.contains(two) error('Combined claims not to contain [def, ghi].') endif if not combined.contains('ghi') error('Combined claims not to contain ghi.') endif muon-v0.4.0/subprojects/meson-tests/common/56 array methods/b.txt0000644000175000017500000000000014751453622023711 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/202 custom target build by default/0002755000175000017500000000000014751453622026113 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/202 custom target build by default/docgen.py0000644000175000017500000000027614751453622027727 0ustar buildbuild#!/usr/bin/env python3 import os import sys out = sys.argv[1] os.mkdir(out) for name in ('a', 'b', 'c'): with open(os.path.join(out, name + '.txt'), 'w') as f: f.write(name) muon-v0.4.0/subprojects/meson-tests/common/202 custom target build by default/meson.build0000644000175000017500000000042714751453622030256 0ustar buildbuildproject('custom-target-dir-install') docgen = find_program('docgen.py') custom_target( 'docgen', output: 'html', command: [docgen, '@OUTPUT@'], install: true, build_by_default: false, install_dir: join_paths(get_option('datadir'), 'doc/testpkgname'), ) muon-v0.4.0/subprojects/meson-tests/common/202 custom target build by default/test.json0000644000175000017500000000003214751453622027756 0ustar buildbuild{ "installed": [ ] } muon-v0.4.0/subprojects/meson-tests/common/100 postconf with args/0002755000175000017500000000000014751453622023753 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/100 postconf with args/raw.dat0000644000175000017500000000000214751453622025224 0ustar buildbuild9 muon-v0.4.0/subprojects/meson-tests/common/100 postconf with args/meson.build0000644000175000017500000000034014751453622026110 0ustar buildbuildproject('postconf script', 'c') conf = configure_file(configuration: configuration_data(), output: 'out') meson.add_postconf_script(find_program('postconf.py'), '5', '33', conf) test('post', executable('prog', 'prog.c')) muon-v0.4.0/subprojects/meson-tests/common/100 postconf with args/prog.c0000644000175000017500000000015114751453622025061 0ustar buildbuild#include"generated.h" int main(void) { return THE_NUMBER != 9 || THE_ARG1 != 5 || THE_ARG2 != 33; } muon-v0.4.0/subprojects/meson-tests/common/100 postconf with args/postconf.py0000644000175000017500000000072714751453622026164 0ustar buildbuild#!/usr/bin/env python3 import sys, os template = '''#pragma once #define THE_NUMBER {} #define THE_ARG1 {} #define THE_ARG2 {} ''' input_file = os.path.join(os.environ['MESON_SOURCE_ROOT'], 'raw.dat') output_file = os.path.join(os.environ['MESON_BUILD_ROOT'], 'generated.h') with open(input_file, encoding='utf-8') as f: data = f.readline().strip() with open(output_file, 'w', encoding='utf-8') as f: f.write(template.format(data, sys.argv[1], sys.argv[2])) muon-v0.4.0/subprojects/meson-tests/common/119 cpp and asm/0002755000175000017500000000000014751453622022327 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/119 cpp and asm/symbol-underscore.h0000644000175000017500000000017314751453622026153 0ustar buildbuild#if defined(MESON_TEST__UNDERSCORE_SYMBOL) # define SYMBOL_NAME(name) _##name #else # define SYMBOL_NAME(name) name #endif muon-v0.4.0/subprojects/meson-tests/common/119 cpp and asm/retval-x86.S0000644000175000017500000000026114751453622024370 0ustar buildbuild#include "symbol-underscore.h" .text .globl SYMBOL_NAME(get_retval) # ifdef __linux__ .type get_retval, %function #endif SYMBOL_NAME(get_retval): xorl %eax, %eax retl muon-v0.4.0/subprojects/meson-tests/common/119 cpp and asm/retval-x86_64.S0000644000175000017500000000026114751453622024701 0ustar buildbuild#include "symbol-underscore.h" .text .globl SYMBOL_NAME(get_retval) # ifdef __linux__ .type get_retval, %function #endif SYMBOL_NAME(get_retval): xorl %eax, %eax retq muon-v0.4.0/subprojects/meson-tests/common/119 cpp and asm/meson.build0000644000175000017500000000162314751453622024471 0ustar buildbuildproject('c++ and assembly test') add_languages('cpp') if meson.backend() == 'xcode' error( 'MESON_SKIP_TEST: asm not supported with the Xcode backend. Patches welcome.', ) endif cpp = meson.get_compiler('cpp') cpu = host_machine.cpu_family() supported_cpus = ['arm', 'x86', 'x86_64'] if not supported_cpus.contains(cpu) error('MESON_SKIP_TEST unsupported cpu:' + cpu) endif if cpp.symbols_have_underscore_prefix() add_project_arguments('-DMESON_TEST__UNDERSCORE_SYMBOL', language: 'assembly') endif sources = ['trivial.cc'] # If the compiler cannot compile assembly, don't use it if not ['msvc', 'clang-cl', 'intel-cl'].contains(meson.get_compiler('cpp').get_id()) sources += ['retval-' + cpu + '.S'] cpp_args = ['-DUSE_ASM'] message('Using ASM') else cpp_args = ['-DNO_USE_ASM'] endif exe = executable('trivialprog', sources, cpp_args: cpp_args) test('runtest', exe) muon-v0.4.0/subprojects/meson-tests/common/119 cpp and asm/retval-arm.S0000644000175000017500000000026214751453622024523 0ustar buildbuild#include "symbol-underscore.h" .text .globl SYMBOL_NAME(get_retval) # ifdef __linux__ .type get_retval, %function #endif SYMBOL_NAME(get_retval): mov r0, #0 mov pc, lr muon-v0.4.0/subprojects/meson-tests/common/119 cpp and asm/trivial.cc0000644000175000017500000000041314751453622024304 0ustar buildbuild#include extern "C" { int get_retval(void); } int main(void) { std::cout << "C++ seems to be working." << std::endl; #if defined(USE_ASM) return get_retval(); #elif defined(NO_USE_ASM) return 0; #else #error "Forgot to pass asm define" #endif } muon-v0.4.0/subprojects/meson-tests/common/265 default_options dict/0002755000175000017500000000000014751453622024366 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/265 default_options dict/meson_options.txt0000644000175000017500000000026214751453622030021 0ustar buildbuildoption('bool', type: 'boolean', value: false) option('int', type: 'integer', value: 0) option('str', type: 'string', value: 'bar') option('array', type: 'array', value: ['bar']) muon-v0.4.0/subprojects/meson-tests/common/265 default_options dict/meson.build0000644000175000017500000000103114751453622026521 0ustar buildbuildproject( 'test default options', 'c', default_options: { 'bool': true, 'int': 42, 'str': 'foo', 'array': ['foo'], 'werror': true, }, ) assert(get_option('bool') == true) assert(get_option('int') == 42) assert(get_option('str') == 'foo') assert(get_option('array') == ['foo']) assert(get_option('werror') == true) cc = meson.get_compiler('c') # MSVC does not support #warning if cc.get_id() != 'msvc' static_library('foo', 'lib.c', override_options: {'werror': false}) endif muon-v0.4.0/subprojects/meson-tests/common/265 default_options dict/lib.c0000644000175000017500000000004514751453622025275 0ustar buildbuild#warning Make sure this is not fatal muon-v0.4.0/subprojects/meson-tests/common/235 invalid standard overridden to valid/0002755000175000017500000000000014751453622027274 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/235 invalid standard overridden to valid/main.c0000644000175000017500000000004114751453622030355 0ustar buildbuildint main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/common/235 invalid standard overridden to valid/meson.build0000644000175000017500000000107014751453622031432 0ustar buildbuildproject( 'invalid C standard overridden to valid one', 'c', # different than meson: meson doesn't validate default_options if they are # overridden on the commandline, while muon does. This was a problem for # c_std in meson, since the option validation takes into account the # current compiler to restrict the possible choices. In muon, all option # choices are static so we don't have this problem. # default_options: ['c_std=invalid99'], default_options: ['c_std=c99'], ) exe = executable('main', 'main.c') test('main', exe) muon-v0.4.0/subprojects/meson-tests/common/235 invalid standard overridden to valid/test.json0000644000175000017500000000013714751453622031145 0ustar buildbuild{ "matrix": { "options": { "c_std": [ { "val": "c89" } ] } } } muon-v0.4.0/subprojects/meson-tests/common/233 wrap case/0002755000175000017500000000000014751453622022123 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/233 wrap case/subprojects/0002755000175000017500000000000014751453622024466 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/233 wrap case/subprojects/up_down/0002755000175000017500000000000014751453622026141 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/common/233 wrap case/subprojects/up_down/meson.build0000644000175000017500000000012414751453622030276 0ustar buildbuildproject('up down', 'c') up_down_dep = declare_dependency(include_directories: '.') muon-v0.4.0/subprojects/meson-tests/common/233 wrap case/subprojects/up_down/up_down.h0000644000175000017500000000004114751453622027756 0ustar buildbuild#pragma once #define UP_IS_DOWN muon-v0.4.0/subprojects/meson-tests/common/233 wrap case/subprojects/up_down.wrap0000644000175000017500000000010114751453622027022 0ustar buildbuild[wrap-file] directory = up_down [provide] UP_down = up_down_dep muon-v0.4.0/subprojects/meson-tests/common/233 wrap case/meson.build0000644000175000017500000000020614751453622024261 0ustar buildbuildproject('CaSe DePenDenCy In Wrap', 'c') d = dependency('UP_down') e = executable('prog', 'prog.c', dependencies: d) test('prog', e) muon-v0.4.0/subprojects/meson-tests/common/233 wrap case/prog.c0000644000175000017500000000031714751453622023235 0ustar buildbuild#include #include int main(int argc, char **argv) { if(argc == 42) { printf("Very sneaky, %s\n", argv[0]); } #ifdef UP_IS_DOWN return 0; #else return 1; #endif } muon-v0.4.0/subprojects/meson-tests/objc/0002755000175000017500000000000014751453622017413 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/objc/5 objfw/0002755000175000017500000000000014751453622020647 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/objc/5 objfw/TestApplication.m0000644000175000017500000000042414751453622024126 0ustar buildbuild#import @interface TestApplication: OFObject @end OF_APPLICATION_DELEGATE(TestApplication) @implementation TestApplication - (void)applicationDidFinishLaunching: (OFNotification *)notification { [OFApplication terminate]; } @end muon-v0.4.0/subprojects/meson-tests/objc/5 objfw/SimpleTest.m0000644000175000017500000000022714751453622023115 0ustar buildbuild#import #import @interface SimpleTest: OTTestCase @end @implementation SimpleTest - (void)testMeson { } @end muon-v0.4.0/subprojects/meson-tests/objc/5 objfw/meson.build0000644000175000017500000000065514751453622023015 0ustar buildbuildproject('objfw build tests', 'objc') objfw_dep = dependency('objfw', required: false) objfwtest_dep = dependency('objfw', modules: ['ObjFWTest'], required: false) if not objfw_dep.found() or not objfwtest_dep.found() error('MESON_SKIP_TEST: Need objfw dependency') endif executable('TestApplication', 'TestApplication.m', dependencies: [objfw_dep]) executable('SimpleTest', 'SimpleTest.m', dependencies: [objfwtest_dep]) muon-v0.4.0/subprojects/meson-tests/objc/2 nsstring/0002755000175000017500000000000014751453622021404 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/objc/2 nsstring/meson.build0000644000175000017500000000143314751453622023545 0ustar buildbuildproject('nsstring', 'objc') if host_machine.system() == 'darwin' dep = dependency('appleframeworks', modules: 'Foundation') elif host_machine.system() == 'cygwin' error('MESON_SKIP_TEST GNUstep is not packaged for Cygwin.') else dep = dependency('gnustep', required: false) if not dep.found() error('MESON_SKIP_TEST: GNUstep is not installed') endif if host_machine.system() == 'linux' and meson.get_compiler('objc').get_id() == 'clang' error('MESON_SKIP_TEST: GNUstep is broken on Linux with Clang') endif endif exe = executable('stringprog', 'stringprog.m', dependencies: dep) test('stringtest', exe) # Ensure that a non-required dep that is not found does not cause an error dependency('appleframeworks', modules: 'nonexisting', required: false) muon-v0.4.0/subprojects/meson-tests/objc/2 nsstring/stringprog.m0000644000175000017500000000023614751453622023757 0ustar buildbuild#import int main(void) { int result; NSString *str = [NSString new]; result = [str length]; [str release]; return result; } muon-v0.4.0/subprojects/meson-tests/objc/1 simple/0002755000175000017500000000000014751453622021025 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/objc/1 simple/prog.m0000644000175000017500000000006214751453622022146 0ustar buildbuild#import int main(void) { return 0; }muon-v0.4.0/subprojects/meson-tests/objc/1 simple/meson.build0000644000175000017500000000017114751453622023164 0ustar buildbuildproject('objective c', 'objc', default_options: ['c_std=c99']) exe = executable('prog', 'prog.m') test('objctest', exe) muon-v0.4.0/subprojects/meson-tests/objc/3 objc args/0002755000175000017500000000000014751453622021370 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/objc/3 objc args/prog.m0000644000175000017500000000016114751453622022511 0ustar buildbuild#import int main(void) { #ifdef MESON_TEST int x = 3; #endif printf("x = %d\n", x); return 0; } muon-v0.4.0/subprojects/meson-tests/objc/3 objc args/meson.build0000644000175000017500000000020314751453622023523 0ustar buildbuildproject('objective c args', 'objc') exe = executable('prog', 'prog.m', objc_args: ['-DMESON_TEST']) test('objective c args', exe) muon-v0.4.0/subprojects/meson-tests/objc/4 c++ project objc subproject/0002755000175000017500000000000014751453622024575 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/objc/4 c++ project objc subproject/subprojects/0002755000175000017500000000000014751453622027140 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/objc/4 c++ project objc subproject/subprojects/foo/0002755000175000017500000000000014751453622027723 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/objc/4 c++ project objc subproject/subprojects/foo/meson.build0000644000175000017500000000015614751453622032065 0ustar buildbuildproject('foo', ['c', 'objc']) l = static_library('foo', 'foo.m') foo_dep = declare_dependency(link_with: l) muon-v0.4.0/subprojects/meson-tests/objc/4 c++ project objc subproject/subprojects/foo/foo.m0000644000175000017500000000003414751453622030657 0ustar buildbuild int foo() { return 42; } muon-v0.4.0/subprojects/meson-tests/objc/4 c++ project objc subproject/master.cpp0000644000175000017500000000020714751453622026571 0ustar buildbuild #include extern "C" int foo(); int main(void) { std::cout << "Starting\n"; std::cout << foo() << "\n"; return 0; } muon-v0.4.0/subprojects/meson-tests/objc/4 c++ project objc subproject/meson.build0000644000175000017500000000021514751453622026733 0ustar buildbuildproject('master', ['cpp']) foo = subproject('foo') dep = foo.get_variable('foo_dep') executable('master', 'master.cpp', dependencies: dep) muon-v0.4.0/subprojects/meson-tests/python/0002755000175000017500000000000014751453622020017 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/2 extmodule/0002755000175000017500000000000014751453622022147 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/2 extmodule/subinst/0002755000175000017500000000000014751453622023636 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/2 extmodule/subinst/printer.py0000755000175000017500000000005114751453622025670 0ustar buildbuild#!/usr/bin/env python3 print('subinst') muon-v0.4.0/subprojects/meson-tests/python/2 extmodule/subinst/submod/0002755000175000017500000000000014751453622025127 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/2 extmodule/subinst/submod/printer.py0000755000175000017500000000006014751453622027161 0ustar buildbuild#!/usr/bin/env python3 print('subinst.submod') muon-v0.4.0/subprojects/meson-tests/python/2 extmodule/blaster.py.in0000755000175000017500000000041614751453622024564 0ustar buildbuild#!/usr/bin/env python3 import @tachyon_module@ as tachyon result = tachyon.phaserize('shoot') if not isinstance(result, int): raise SystemExit('Returned result not an integer.') if result != 1: raise SystemExit('Returned result {} is not 1.'.format(result)) muon-v0.4.0/subprojects/meson-tests/python/2 extmodule/meson_options.txt0000644000175000017500000000006614751453622025604 0ustar buildbuildoption('python2', type: 'feature', value: 'disabled') muon-v0.4.0/subprojects/meson-tests/python/2 extmodule/ext/0002755000175000017500000000000014751453622022747 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/2 extmodule/ext/meson.build0000644000175000017500000000053014751453622025105 0ustar buildbuildpylib = py.extension_module( 'tachyon', 'tachyon_module.c', c_args: '-DMESON_MODULENAME="tachyon"', install: true, ) pylib2 = py2.extension_module( 'tachyon', 'tachyon_module.c', c_args: '-DMESON_MODULENAME="tachyon"', install: true, ) subdir('nested') subdir('wrongdir') pypathdir = meson.current_build_dir() muon-v0.4.0/subprojects/meson-tests/python/2 extmodule/ext/nested/0002755000175000017500000000000014751453622024231 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/2 extmodule/ext/nested/meson.build0000644000175000017500000000135714751453622026377 0ustar buildbuildpy.extension_module( 'tachyon', '../tachyon_module.c', c_args: '-DMESON_MODULENAME="nested.tachyon"', install: true, subdir: 'nested', ) py.install_sources( configure_file( input: '../../blaster.py.in', output: 'blaster.py', configuration: {'tachyon_module': 'nested.tachyon'}, ), pure: false, subdir: 'nested', ) py2.extension_module( 'tachyon', '../tachyon_module.c', c_args: '-DMESON_MODULENAME="nested.tachyon"', install: true, subdir: 'nested', ) py2.install_sources( configure_file( input: '../../blaster.py.in', output: 'blaster.py', configuration: {'tachyon_module': 'nested.tachyon'}, ), pure: false, subdir: 'nested', ) muon-v0.4.0/subprojects/meson-tests/python/2 extmodule/ext/wrongdir/0002755000175000017500000000000014751453622024602 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/2 extmodule/ext/wrongdir/meson.build0000644000175000017500000000051714751453622026745 0ustar buildbuildpy.extension_module( 'tachyon', '../tachyon_module.c', c_args: '-DMESON_MODULENAME="tachyon"', install: true, install_dir: get_option('libdir'), ) py2.extension_module( 'tachyon', '../tachyon_module.c', c_args: '-DMESON_MODULENAME="tachyon"', install: true, install_dir: get_option('libdir'), ) muon-v0.4.0/subprojects/meson-tests/python/2 extmodule/ext/tachyon_module.c0000644000175000017500000000273314751453622026130 0ustar buildbuild/* Copyright 2018 The Meson development team Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ /* A very simple Python extension module. */ #include #include static PyObject* phaserize(PyObject *self, PyObject *args) { const char *message; int result; if(!PyArg_ParseTuple(args, "s", &message)) return NULL; result = strcmp(message, "shoot") ? 0 : 1; #if PY_VERSION_HEX < 0x03000000 return PyInt_FromLong(result); #else return PyLong_FromLong(result); #endif } static PyMethodDef TachyonMethods[] = { {"phaserize", phaserize, METH_VARARGS, "Shoot tachyon cannons."}, {NULL, NULL, 0, NULL} }; #if PY_VERSION_HEX < 0x03000000 PyMODINIT_FUNC inittachyon(void) { Py_InitModule("tachyon", TachyonMethods); } #else static struct PyModuleDef tachyonmodule = { PyModuleDef_HEAD_INIT, "tachyon", NULL, -1, TachyonMethods }; PyMODINIT_FUNC PyInit_tachyon(void) { return PyModule_Create(&tachyonmodule); } #endif muon-v0.4.0/subprojects/meson-tests/python/2 extmodule/meson.build0000644000175000017500000000364114751453622024313 0ustar buildbuildproject( 'Python extension module', 'c', default_options: ['buildtype=release', 'werror=true', 'python.bytecompile=-1'], ) # Because Windows Python ships only with optimized libs, # we must build this project the same way. if meson.backend() != 'ninja' error('MESON_SKIP_TEST: Ninja backend required') endif py_mod = import('python') py = py_mod.find_installation() py2 = py_mod.find_installation('python2', required: get_option('python2'), disabler: true) py_dep = py.dependency(required: false) if not py_dep.found() error('MESON_SKIP_TEST: Python libraries not found.') endif subdir('ext') blaster = configure_file( input: 'blaster.py.in', output: 'blaster.py', configuration: {'tachyon_module': 'tachyon'}, ) test('extmod', py, args: blaster, env: ['PYTHONPATH=' + pypathdir]) py.install_sources(blaster, pure: false) py.install_sources(blaster, subdir: 'pure') install_subdir('subinst', install_dir: py.get_install_dir(pure: false)) py2.install_sources(blaster, pure: false) py2.install_sources(blaster, subdir: 'pure') install_subdir('subinst', install_dir: py2.get_install_dir(pure: false)) py3_pkg_dep = dependency('python3', method: 'pkg-config', required: false) if py3_pkg_dep.found() py3_dep_majver = py3_pkg_dep.version().split('.') py3_dep_majver = py3_dep_majver[0] + '.' + py3_dep_majver[1] message( f'got two pythons: pkg-config is @py3_dep_majver@, and module is', py.language_version(), ) if py3_dep_majver != py.language_version() message( 'skipped python3 pkg-config test because the default python3 is different from Meson\'s', ) else python_lib_dir = py3_pkg_dep.get_pkgconfig_variable('libdir') # Check we can apply a version constraint dependency('python3', version: '>=@0@'.format(py_dep.version())) endif else message('Skipped python3 pkg-config test because it was not found') endif muon-v0.4.0/subprojects/meson-tests/python/2 extmodule/test.json0000644000175000017500000000151314751453622024017 0ustar buildbuild{ "installed": [ { "type": "python_file", "file": "usr/@PYTHON_PLATLIB@/blaster.py" }, { "type": "python_lib", "file": "usr/@PYTHON_PLATLIB@/tachyon" }, { "type": "py_implib", "file": "usr/@PYTHON_PLATLIB@/tachyon" }, { "type": "python_file", "file": "usr/@PYTHON_PURELIB@/pure/blaster.py" }, { "type": "python_file", "file": "usr/@PYTHON_PLATLIB@/nested/blaster.py" }, { "type": "python_lib", "file": "usr/@PYTHON_PLATLIB@/nested/tachyon" }, { "type": "py_implib", "file": "usr/@PYTHON_PLATLIB@/nested/tachyon" }, { "type": "python_file", "file": "usr/@PYTHON_PLATLIB@/subinst/printer.py" }, { "type": "python_file", "file": "usr/@PYTHON_PLATLIB@/subinst/submod/printer.py" }, { "type": "python_lib", "file": "usr/lib/tachyon" }, { "type": "py_implib", "file": "usr/lib/tachyon" } ] } muon-v0.4.0/subprojects/meson-tests/python/1 basic/0002755000175000017500000000000014751453622021221 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/1 basic/prog.py0000755000175000017500000000023614751453622022544 0ustar buildbuild#!/usr/bin/env python3 from gluon import gluonator print('Running mainprog from root dir.') if gluonator.gluoninate() != 42: raise ValueError("!= 42") muon-v0.4.0/subprojects/meson-tests/python/1 basic/subdir/0002755000175000017500000000000014751453622022511 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/1 basic/subdir/meson.build0000644000175000017500000000015314751453622024650 0ustar buildbuildtest( 'subdir', py, args: files('subprog.py'), env: 'PYTHONPATH=' + meson.source_root(), ) muon-v0.4.0/subprojects/meson-tests/python/1 basic/subdir/subprog.py0000755000175000017500000000035714751453622024552 0ustar buildbuild#!/usr/bin/env python3 # In order to run this program, PYTHONPATH must be set to # point to source root. from gluon import gluonator print('Running mainprog from subdir.') if gluonator.gluoninate() != 42: raise ValueError("!= 42") muon-v0.4.0/subprojects/meson-tests/python/1 basic/meson.build0000644000175000017500000000156414751453622023367 0ustar buildbuildproject('python sample') py_mod = import('python') py = py_mod.find_installation('python3') py_version = py.language_version() if py_version.version_compare('< 3.2') error('MESON_SKIP_TEST python 3 required for tests') endif py_full_version = py.version() message(f'Using python version: @py_full_version@') py_purelib = py.get_path('purelib') if not ( py_purelib.endswith('site-packages') or py_purelib.endswith('dist-packages') ) error('Python3 purelib path seems invalid? ' + py_purelib) endif message('Python purelib path:', py_purelib) # could be 'lib64' or 'Lib' on some systems py_platlib = py.get_path('platlib') if not ( py_platlib.endswith('site-packages') or py_platlib.endswith('dist-packages') ) error('Python3 platlib path seems invalid? ' + py_platlib) endif main = files('prog.py') test('toplevel', py, args: main) subdir('subdir') muon-v0.4.0/subprojects/meson-tests/python/1 basic/gluon/0002755000175000017500000000000014751453622022345 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/1 basic/gluon/__init__.py0000644000175000017500000000000014751453622024442 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/1 basic/gluon/gluonator.py0000644000175000017500000000004014751453622024721 0ustar buildbuilddef gluoninate(): return 42 muon-v0.4.0/subprojects/meson-tests/python/9 extmodule limited api/0002755000175000017500000000000014751453622024320 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/9 extmodule limited api/meson.build0000644000175000017500000000103314751453622026455 0ustar buildbuildproject( 'Python limited api', 'c', default_options: ['buildtype=release', 'werror=true'], ) py_mod = import('python') py = py_mod.find_installation() ext_mod_limited = py.extension_module( 'limited', 'limited.c', limited_api: '3.7', install: true, ) ext_mod = py.extension_module( 'not_limited', 'not_limited.c', install: true, ) test( 'load-test', py, args: [files('test_limited.py')], env: {'PYTHONPATH': meson.current_build_dir()}, workdir: meson.current_source_dir(), ) muon-v0.4.0/subprojects/meson-tests/python/9 extmodule limited api/not_limited.c0000644000175000017500000000323514751453622026774 0ustar buildbuild#include #include #ifdef Py_LIMITED_API #error Py_LIMITED_API must not be defined. #endif /* This function explicitly calls functions whose declaration is elided when * Py_LIMITED_API is defined. This is to test that the linker is actually * linking to the right version of the library on Windows. */ static PyObject *meth_not_limited(PyObject *self, PyObject *args) { PyObject *list; Py_ssize_t size; if (!PyArg_ParseTuple(args, "o", & list)) return NULL; if (!PyList_Check(list)) { PyErr_Format(PyExc_TypeError, "expected 'list'"); return NULL; } /* PyList_GET_SIZE and PyList_GET_ITEM are only available if Py_LIMITED_API * is not defined. It seems likely that they will remain excluded from the * limited API as their checked counterparts (PyList_GetSize and * PyList_GetItem) are made available in that mode instead. */ size = PyList_GET_SIZE(list); for(Py_ssize_t i = 0; i < size; ++i) { PyObject *element = PyList_GET_ITEM(list, i); if (element == NULL) { return NULL; } if(PyObject_Print(element, stdout, Py_PRINT_RAW) == -1) { return NULL; } } Py_RETURN_NONE; } static struct PyMethodDef not_limited_methods[] = { { "not_limited", meth_not_limited, METH_VARARGS, "Calls functions whose declaration is elided by Py_LIMITED_API" }, { NULL, NULL, 0, NULL } }; static struct PyModuleDef not_limited_module = { PyModuleDef_HEAD_INIT, "not_limited_api_test", NULL, -1, not_limited_methods }; PyMODINIT_FUNC PyInit_not_limited(void) { return PyModule_Create(¬_limited_module); } muon-v0.4.0/subprojects/meson-tests/python/9 extmodule limited api/test.json0000644000175000017500000000047614751453622026177 0ustar buildbuild{ "installed": [ {"type": "python_limited_lib", "file": "usr/@PYTHON_PLATLIB@/limited"}, {"type": "py_limited_implib", "file": "usr/@PYTHON_PLATLIB@/limited"}, {"type": "python_lib", "file": "usr/@PYTHON_PLATLIB@/not_limited"}, {"type": "py_implib", "file": "usr/@PYTHON_PLATLIB@/not_limited"} ] } muon-v0.4.0/subprojects/meson-tests/python/9 extmodule limited api/limited.c0000644000175000017500000000114614751453622026113 0ustar buildbuild#include #ifndef Py_LIMITED_API #error Py_LIMITED_API must be defined. #elif Py_LIMITED_API != 0x03070000 #error Wrong value for Py_LIMITED_API #endif static PyObject * hello(PyObject * Py_UNUSED(self), PyObject * Py_UNUSED(args)) { return PyUnicode_FromString("hello world"); } static struct PyMethodDef methods[] = { { "hello", hello, METH_NOARGS, NULL }, { NULL, NULL, 0, NULL }, }; static struct PyModuleDef limited_module = { PyModuleDef_HEAD_INIT, "limited", NULL, -1, methods }; PyMODINIT_FUNC PyInit_limited(void) { return PyModule_Create(&limited_module); } muon-v0.4.0/subprojects/meson-tests/python/9 extmodule limited api/test_limited.py0000644000175000017500000000013714751453622027357 0ustar buildbuildfrom limited import hello def test_hello(): assert hello() == "hello world" test_hello() muon-v0.4.0/subprojects/meson-tests/python/4 custom target depends extmodule/0002755000175000017500000000000014751453622026316 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/4 custom target depends extmodule/blaster.py0000644000175000017500000000137214751453622030325 0ustar buildbuild#!/usr/bin/env python3 import os import sys import argparse from pathlib import Path filedir = Path(os.path.dirname(__file__)).resolve() if list(filedir.glob('ext/*tachyon*')): sys.path.insert(0, (filedir / 'ext').as_posix()) if hasattr(os, 'add_dll_directory'): os.add_dll_directory(filedir / 'ext' / 'lib') import tachyon parser = argparse.ArgumentParser() parser.add_argument('-o', dest='output', default=None) options = parser.parse_args(sys.argv[1:]) result = tachyon.phaserize('shoot') if options.output: with open(options.output, 'w') as f: f.write('success') if not isinstance(result, int): raise SystemExit('Returned result not an integer.') if result != 1: raise SystemExit(f'Returned result {result} is not 1.') muon-v0.4.0/subprojects/meson-tests/python/4 custom target depends extmodule/ext/0002755000175000017500000000000014751453622027116 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/4 custom target depends extmodule/ext/meson.build0000644000175000017500000000020314751453622031251 0ustar buildbuildsubdir('lib') pylib = py3.extension_module( 'tachyon', 'tachyon_module.c', dependencies: [libtachyon_dep, py3_dep], ) muon-v0.4.0/subprojects/meson-tests/python/4 custom target depends extmodule/ext/lib/0002755000175000017500000000000014751453622027664 5ustar buildbuild././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/python/4 custom target depends extmodule/ext/lib/meson-tachyonlib.hmuon-v0.4.0/subprojects/meson-tests/python/4 custom target depends extmodule/ext/lib/meson-tachyonli0000644000175000017500000000014614751453622032717 0ustar buildbuild#pragma once #ifdef _MSC_VER __declspec(dllimport) #endif const char* tachyon_phaser_command (void); muon-v0.4.0/subprojects/meson-tests/python/4 custom target depends extmodule/ext/lib/meson.build0000644000175000017500000000025314751453622032024 0ustar buildbuildlibtachyon = shared_library('tachyonlib', 'meson-tachyonlib.c') libtachyon_dep = declare_dependency(link_with: libtachyon, include_directories: include_directories('.')) ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/python/4 custom target depends extmodule/ext/lib/meson-tachyonlib.cmuon-v0.4.0/subprojects/meson-tests/python/4 custom target depends extmodule/ext/lib/meson-tachyonli0000644000175000017500000000015714751453622032721 0ustar buildbuild#ifdef _MSC_VER __declspec(dllexport) #endif const char* tachyon_phaser_command (void) { return "shoot"; } muon-v0.4.0/subprojects/meson-tests/python/4 custom target depends extmodule/ext/tachyon_module.c0000644000175000017500000000247314751453622032300 0ustar buildbuild/* Copyright 2016 The Meson development team Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ /* A very simple Python extension module. */ #include #include #include "meson-tachyonlib.h" static PyObject* phaserize(PyObject *self, PyObject *args) { const char *message; int result; if(!PyArg_ParseTuple(args, "s", &message)) return NULL; result = strcmp(message, tachyon_phaser_command()) ? 0 : 1; return PyLong_FromLong(result); } static PyMethodDef TachyonMethods[] = { {"phaserize", phaserize, METH_VARARGS, "Shoot tachyon cannons."}, {NULL, NULL, 0, NULL} }; static struct PyModuleDef tachyonmodule = { PyModuleDef_HEAD_INIT, "tachyon", NULL, -1, TachyonMethods }; PyMODINIT_FUNC PyInit_tachyon(void) { return PyModule_Create(&tachyonmodule); } muon-v0.4.0/subprojects/meson-tests/python/4 custom target depends extmodule/meson.build0000644000175000017500000000262514751453622030463 0ustar buildbuildproject('Python extension module', 'c', default_options: ['buildtype=release']) # Because Windows Python ships only with optimized libs, # we must build this project the same way. if meson.backend() != 'ninja' error('MESON_SKIP_TEST: Ninja backend required') endif py_mod = import('python') py3 = py_mod.find_installation() py3_dep = py3.dependency(required: false) cc = meson.get_compiler('c') if not py3_dep.found() error('MESON_SKIP_TEST: Python3 libraries not found, skipping test.') endif # Copy to the builddir so that blaster.py can find the built tachyon module # FIXME: We should automatically detect this case and append the correct paths # to PYTHONLIBDIR blaster_py = configure_file(input: 'blaster.py', output: 'blaster.py', copy: true) check_exists = ''' import os, sys with open(sys.argv[1], 'rb') as f: assert(f.read() == b'success') ''' message('Detected Python version: ' + py3_dep.version()) if py3_dep.version().version_compare('>=3.8') and cc.get_id() == 'msvc' and cc.version().version_compare('<=19.00.24215.1') error( 'MESON_SKIP_TEST: Python modules do not work with Python 3.8 and VS2015 or earlier.', ) endif subdir('ext') out_txt = custom_target( 'tachyon flux', input: blaster_py, output: 'out.txt', command: [py3, '@INPUT@', '-o', '@OUTPUT@'], depends: pylib, build_by_default: true, ) test('flux', py3, args: ['-c', check_exists, out_txt]) muon-v0.4.0/subprojects/meson-tests/python/8 different python versions/0002755000175000017500000000000014751453622025250 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/8 different python versions/meson_options.txt0000644000175000017500000000024414751453622030703 0ustar buildbuildoption( 'python', type: 'string', description: 'Name of or path to the python executable', ) option('disabled_opt', type: 'feature', value: 'disabled') muon-v0.4.0/subprojects/meson-tests/python/8 different python versions/blaster.py0000755000175000017500000000041614751453622027260 0ustar buildbuild#!/usr/bin/env python import sys import tachyon result = tachyon.phaserize('shoot') if not isinstance(result, int): print('Returned result not an integer.') sys.exit(1) if result != 1: print('Returned result {} is not 1.'.format(result)) sys.exit(1) muon-v0.4.0/subprojects/meson-tests/python/8 different python versions/ext/0002755000175000017500000000000014751453622026050 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/8 different python versions/ext/meson.build0000644000175000017500000000020714751453622030207 0ustar buildbuildpylib = py.extension_module( 'tachyon', 'tachyon_module.c', dependencies: py_dep, ) pypathdir = meson.current_build_dir() muon-v0.4.0/subprojects/meson-tests/python/8 different python versions/ext/tachyon_module.c0000644000175000017500000000273314751453622031231 0ustar buildbuild/* Copyright 2018 The Meson development team Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ /* A very simple Python extension module. */ #include #include static PyObject* phaserize(PyObject *self, PyObject *args) { const char *message; int result; if(!PyArg_ParseTuple(args, "s", &message)) return NULL; result = strcmp(message, "shoot") ? 0 : 1; #if PY_VERSION_HEX < 0x03000000 return PyInt_FromLong(result); #else return PyLong_FromLong(result); #endif } static PyMethodDef TachyonMethods[] = { {"phaserize", phaserize, METH_VARARGS, "Shoot tachyon cannons."}, {NULL, NULL, 0, NULL} }; #if PY_VERSION_HEX < 0x03000000 PyMODINIT_FUNC inittachyon(void) { Py_InitModule("tachyon", TachyonMethods); } #else static struct PyModuleDef tachyonmodule = { PyModuleDef_HEAD_INIT, "tachyon", NULL, -1, TachyonMethods }; PyMODINIT_FUNC PyInit_tachyon(void) { return PyModule_Create(&tachyonmodule); } #endif muon-v0.4.0/subprojects/meson-tests/python/8 different python versions/meson.build0000644000175000017500000000176014751453622027414 0ustar buildbuildproject('Python extension module', 'c', default_options: ['buildtype=release']) py_mod = import('python') py = py_mod.find_installation(get_option('python'), required: false) # CI images don't have 32-bit python2 for 32-bit windows, # so this actually gets detected then fails require = not ( get_option('python') == 'python2' and host_machine.system() == 'windows' and host_machine.cpu() == 'x86' ) if py.found() py_dep = py.dependency(required: require) if py_dep.found() subdir('ext') test( 'extmod', py, args: files('blaster.py'), env: ['PYTHONPATH=' + pypathdir], ) else error('MESON_SKIP_TEST: Python libraries not found, skipping test.') endif else error('MESON_SKIP_TEST: Python not found, skipping test.') endif py = py_mod.find_installation(get_option('python'), required: get_option('disabled_opt')) assert(not py.found(), 'find_installation not working with disabled feature') muon-v0.4.0/subprojects/meson-tests/python/8 different python versions/test.json0000644000175000017500000000032214751453622027115 0ustar buildbuild{ "matrix": { "options": { "python": [ { "val": null }, { "val": "python2" }, { "val": "python3" }, { "val": "pypy" }, { "val": "pypy3" } ] } } } muon-v0.4.0/subprojects/meson-tests/python/5 modules kwarg/0002755000175000017500000000000014751453622022710 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/5 modules kwarg/meson.build0000644000175000017500000000142114751453622025046 0ustar buildbuildproject( 'python kwarg', default_options: [ 'python.bytecompile=-1', 'python.purelibdir=/pure', ], ) py = import('python') prog_python = py.find_installation('python3', modules: ['os', 'sys', 're'], pure: true) assert(prog_python.found() == true, 'python not found when should be') # In meson 1.2 - 1.3.2, there was a bug when a python installation # with a different version did not have a module, and we try to install # something with another python version... py.find_installation('python3.7', modules: ['notamodule'], required: false) prog_python.install_sources('a.py') prog_python = py.find_installation('python3', modules: ['thisbetternotexistmod'], required: false) assert(prog_python.found() == false, 'python not found but reported as found') muon-v0.4.0/subprojects/meson-tests/python/5 modules kwarg/test.json0000644000175000017500000000012214751453622024553 0ustar buildbuild{ "installed": [ { "type": "python_file", "file": "pure/a.py"} ] }muon-v0.4.0/subprojects/meson-tests/python/5 modules kwarg/a.py0000644000175000017500000000000014751453622023466 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/6 failing subproject/0002755000175000017500000000000014751453622023717 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/6 failing subproject/subprojects/0002755000175000017500000000000014751453622026262 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/6 failing subproject/subprojects/bar/0002755000175000017500000000000014751453622027026 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/6 failing subproject/subprojects/bar/meson.build0000644000175000017500000000016314751453622031166 0ustar buildbuildproject('bar', 'cpp') python = import('python').find_installation('python3') dependency('nonexistent-dependency') muon-v0.4.0/subprojects/meson-tests/python/6 failing subproject/meson.build0000644000175000017500000000033214751453622026055 0ustar buildbuildproject('foo', 'cpp') # Regression test for https://github.com/mesonbuild/meson/issues/9038 dependency('bar', required: false, allow_fallback: true) python = import('python').find_installation('python3').dependency() muon-v0.4.0/subprojects/meson-tests/python/3 cython/0002755000175000017500000000000014751453622021446 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/3 cython/libdir/0002755000175000017500000000000014751453622022713 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/3 cython/libdir/storer.c0000644000175000017500000000053614751453622024377 0ustar buildbuild#include"storer.h" #include struct _Storer { int value; }; Storer* storer_new() { Storer *s = malloc(sizeof(struct _Storer)); s->value = 0; return s; } void storer_destroy(Storer *s) { free(s); } int storer_get_value(Storer *s) { return s->value; } void storer_set_value(Storer *s, int v) { s->value = v; } muon-v0.4.0/subprojects/meson-tests/python/3 cython/libdir/cstorer.pxd0000644000175000017500000000033014751453622025103 0ustar buildbuild cdef extern from "storer.h": ctypedef struct Storer: pass Storer* storer_new(); void storer_destroy(Storer *s); int storer_get_value(Storer *s); void storer_set_value(Storer *s, int v); muon-v0.4.0/subprojects/meson-tests/python/3 cython/libdir/storer.pyx0000644000175000017500000000062114751453622024770 0ustar buildbuildcimport cstorer cdef class Storer: cdef cstorer.Storer* _c_storer def __cinit__(self): self._c_storer = cstorer.storer_new() def __dealloc__(self): cstorer.storer_destroy(self._c_storer) cpdef int get_value(self): return cstorer.storer_get_value(self._c_storer) cpdef set_value(self, int value): cstorer.storer_set_value(self._c_storer, value) muon-v0.4.0/subprojects/meson-tests/python/3 cython/libdir/meson.build0000644000175000017500000000040614751453622025053 0ustar buildbuildpyx_c = custom_target( 'storer_pyx', output: 'storer_pyx.c', input: 'storer.pyx', command: [cython, '@INPUT@', '-o', '@OUTPUT@', '-3'], ) slib = py3.extension_module( 'storer', 'storer.c', pyx_c, ) pydir = meson.current_build_dir() muon-v0.4.0/subprojects/meson-tests/python/3 cython/libdir/storer.h0000644000175000017500000000025614751453622024403 0ustar buildbuild#pragma once typedef struct _Storer Storer; Storer* storer_new(); void storer_destroy(Storer *s); int storer_get_value(Storer *s); void storer_set_value(Storer *s, int v); muon-v0.4.0/subprojects/meson-tests/python/3 cython/meson.build0000644000175000017500000000113114751453622023602 0ustar buildbuildproject('cython', 'c', default_options: ['warning_level=3', 'buildtype=release']) if meson.backend() != 'ninja' error('MESON_SKIP_TEST: Ninja backend required') endif cython = find_program('cython', required: false) if not cython.found() error('MESON_SKIP_TEST: Cython3 not found.') endif py3 = import('python').find_installation(pure: false) py3_dep = py3.dependency(required: false) if not py3_dep.found() error('MESON_SKIP_TEST: Python library not found.') endif subdir('libdir') test( 'cython tester', py3, args: files('cytest.py'), env: ['PYTHONPATH=' + pydir], ) muon-v0.4.0/subprojects/meson-tests/python/3 cython/cytest.py0000755000175000017500000000054214751453622023335 0ustar buildbuild#!/usr/bin/env python3 from storer import Storer s = Storer() if s.get_value() != 0: raise SystemExit('Initial value incorrect.') s.set_value(42) if s.get_value() != 42: raise SystemExit('Setting value failed.') try: s.set_value('not a number') raise SystemExit('Using wrong argument type did not fail.') except TypeError: pass muon-v0.4.0/subprojects/meson-tests/python/10 extmodule limited api disabled/0002755000175000017500000000000014751453622026120 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/10 extmodule limited api disabled/meson.build0000644000175000017500000000045114751453622030260 0ustar buildbuildproject( 'Python limited api disabled', 'c', default_options: ['buildtype=release', 'werror=true', 'python.allow_limited_api=false'], ) py_mod = import('python') py = py_mod.find_installation() module = py.extension_module( 'my_module', 'module.c', limited_api: '3.7', ) muon-v0.4.0/subprojects/meson-tests/python/10 extmodule limited api disabled/module.c0000644000175000017500000000050214751453622027544 0ustar buildbuild#include #if defined(Py_LIMITED_API) #error "Py_LIMITED_API's definition by Meson should have been disabled." #endif static struct PyModuleDef my_module = { PyModuleDef_HEAD_INIT, "my_module", NULL, -1, NULL }; PyMODINIT_FUNC PyInit_my_module(void) { return PyModule_Create(&my_module); } muon-v0.4.0/subprojects/meson-tests/python/7 install path/0002755000175000017500000000000014751453622022531 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/7 install path/structured/0002755000175000017500000000000014751453622024735 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/7 install path/structured/one.py0000644000175000017500000000000014751453622026054 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/7 install path/structured/meson.build0000644000175000017500000000023414751453622027074 0ustar buildbuildpy.install_sources( 'one.py', 'two.py', 'alpha/one.py', 'alpha/two.py', 'alpha/three.py', 'beta/one.py', preserve_path: true, ) muon-v0.4.0/subprojects/meson-tests/python/7 install path/structured/beta/0002755000175000017500000000000014751453622025650 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/7 install path/structured/beta/one.py0000644000175000017500000000000014751453622026767 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/7 install path/structured/alpha/0002755000175000017500000000000014751453622026022 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/7 install path/structured/alpha/one.py0000644000175000017500000000000014751453622027141 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/7 install path/structured/alpha/three.py0000644000175000017500000000000014751453622027467 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/7 install path/structured/alpha/two.py0000644000175000017500000000000014751453622027171 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/7 install path/structured/two.py0000644000175000017500000000000014751453622026104 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/7 install path/meson.build0000644000175000017500000000154214751453622024673 0ustar buildbuildproject( 'install path', default_options: [ 'python.bytecompile=-1', 'python.purelibdir=/pure', 'python.platlibdir=/plat', ], ) py = import('python').find_installation() py.install_sources('test.py') py.install_sources('test.py', pure: false) install_data('test.py', install_dir: py.get_install_dir() / 'data') install_data('test.py', install_dir: py.get_install_dir(pure: false) / 'data') py_plat = import('python').find_installation(pure: false) py_plat.install_sources('test.py', subdir: 'kw') py_plat.install_sources('test.py', pure: true, subdir: 'kwrevert') install_data('test.py', install_dir: py_plat.get_install_dir() / 'kw/data') install_data( 'test.py', install_dir: py_plat.get_install_dir(pure: true) / 'kwrevert/data', ) if get_option('backend') == 'none' subdir('target') endif subdir('structured') muon-v0.4.0/subprojects/meson-tests/python/7 install path/test.json0000644000175000017500000000133314751453622024401 0ustar buildbuild{ "installed": [ {"type": "file", "file": "pure/one.py"}, {"type": "file", "file": "pure/two.py"}, {"type": "file", "file": "pure/alpha/one.py"}, {"type": "file", "file": "pure/alpha/two.py"}, {"type": "file", "file": "pure/alpha/three.py"}, {"type": "file", "file": "pure/beta/one.py"}, {"type": "file", "file": "plat/kw/test.py"}, {"type": "file", "file": "pure/kwrevert/test.py"}, {"type": "file", "file": "plat/test.py"}, {"type": "file", "file": "pure/test.py"}, {"type": "file", "file": "plat/data/test.py"}, {"type": "file", "file": "pure/data/test.py"}, {"type": "file", "file": "plat/kw/data/test.py"}, {"type": "file", "file": "pure/kwrevert/data/test.py"} ] } muon-v0.4.0/subprojects/meson-tests/python/7 install path/test.py0000644000175000017500000000000014751453622024046 0ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/7 install path/target/0002755000175000017500000000000014751453622024017 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/python/7 install path/target/meson.build0000644000175000017500000000024314751453622026156 0ustar buildbuild# testcase expect_error('Install-only backend cannot generate target rules, try using `--backend=ninja`.') # import('fs').copyfile('../test.py') # endtestcase muon-v0.4.0/subprojects/meson-tests/nasm/0002755000175000017500000000000014751453622017434 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/nasm/1 configure file/0002755000175000017500000000000014751453622022436 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/nasm/1 configure file/meson.build0000644000175000017500000000316614751453622024604 0ustar buildbuildproject('nasm config file', 'c') if host_machine.cpu_family() == 'x86' and host_machine.system() == 'windows' asm_format = 'win32' elif ( host_machine.cpu_family() == 'x86_64' and host_machine.system() == 'windows' ) asm_format = 'win64' elif host_machine.cpu_family() == 'x86' and host_machine.system() == 'linux' asm_format = 'elf32' elif host_machine.cpu_family() == 'x86_64' and host_machine.system() == 'linux' asm_format = 'elf64' else error('MESON_SKIP_TEST: skipping test on this platform') endif nasm = find_program('nasm', required: false) if not nasm.found() error('MESON_SKIP_TEST: nasm not available') endif conf = configuration_data() conf.set('HELLO', 0) asm_gen = generator( nasm, output: '@BASENAME@.o', arguments: [ '-f', asm_format, '-i', meson.current_source_dir() + '/', '-i', join_paths(meson.current_source_dir(), ''), '-P', join_paths(meson.current_build_dir(), 'config.asm'), '@INPUT@', '-o', '@OUTPUT@', ], ) config_file = configure_file( output: 'config.asm', configuration: conf, output_format: 'nasm', ) cc = meson.get_compiler('c') link_args = cc.get_supported_link_arguments(['-no-pie']) exe = executable( 'hello', asm_gen.process('hello.asm'), link_args: link_args, ) test('test-nasm-configure-file', exe) exe2 = executable( 'hello2', # different than meson: objects in target sources are added to the target's # objects, and not kept in its sources. objects: exe.extract_all_objects(recursive: true), link_args: link_args, ) test('test-nasm-extract-all-objects', exe2) muon-v0.4.0/subprojects/meson-tests/nasm/1 configure file/hello.asm0000644000175000017500000000202714751453622024242 0ustar buildbuild; hello_64.asm print a string using printf ; Assemble: nasm -f elf64 -l hello_64.lst hello_64.asm ; Link: gcc -m64 -o hello_64 hello_64.o ; Run: ./hello_64 > hello_64.out ; Output: cat hello_64.out ; Equivalent C code ; // hello.c ; #include ; int main() ; { ; char msg[] = "Hello world\n"; ; printf("%s\n",msg); ; return 0; ; } %include "config.asm" ; Declare needed C functions extern printf ; the C function, to be called section .data ; Data section, initialized variables msg: db "Hello world", 0 ; C string needs 0 fmt: db "%s", 10, 0 ; The printf format, "\n",'0' section .text ; Code section. global main ; the standard gcc entry point main: ; the program label for the entry point push rbp ; set up stack frame, must be alligned mov rdi,fmt mov rsi,msg mov rax,0 ; or can be xor rax,rax call printf ; Call C function pop rbp ; restore stack mov rax,HELLO ; normal, no error, return value ret ; return muon-v0.4.0/subprojects/meson-tests/nasm/3 nasm only/0002755000175000017500000000000014751453622021457 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/nasm/3 nasm only/dummy.asm0000644000175000017500000000007414751453622023313 0ustar buildbuildglobal dummy section .rdata align=16 dummy: dd 0x00010203 muon-v0.4.0/subprojects/meson-tests/nasm/3 nasm only/meson.build0000644000175000017500000000052414751453622023620 0ustar buildbuildproject('nasm only') if not add_languages('nasm', required: false) error('MESON_SKIP_TEST: nasm not found') endif if meson.backend().startswith('vs') error('MESON_SKIP_TEST: VS backend does not recognise NASM yet') endif sources = files('dummy.asm') dummy = library( 'dummy', sources, vs_module_defs: 'dummy.def', ) muon-v0.4.0/subprojects/meson-tests/nasm/3 nasm only/dummy.def0000644000175000017500000000001714751453622023266 0ustar buildbuildEXPORTS dummy muon-v0.4.0/subprojects/meson-tests/nasm/2 asm language/0002755000175000017500000000000014751453622022102 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/nasm/2 asm language/meson.build0000644000175000017500000000401014751453622024235 0ustar buildbuildproject('test', 'c') if not host_machine.cpu_family().startswith('x86') assert(not add_languages('nasm', required: false)) error('MESON_SKIP_TEST: nasm only supported for x86 and x86_64') endif if host_machine.system() == 'windows' error('MESON_SKIP_TEST: this test asm is not made for Windows') endif if meson.backend().startswith('vs') error('MESON_SKIP_TEST: VS backend does not recognise NASM yet') endif if not add_languages('nasm', required: false) nasm = find_program('nasm', 'yasm', required: false) if nasm.found() # verify that /usr/bin/nasm stub on darwin actually works # $ /usr/bin/nasm && echo SUCCESS $? || echo FAIL $? # nasm: error: unable to find utility "nasm", not a developer tool or in PATH # FAIL 72 nasm_version = run_command('nasm', '--version') if nasm_version.returncode() == 72 error('MESON_SKIP_TEST: nasm found but not functional') endif endif assert(not nasm.found()) error('MESON_SKIP_TEST: nasm not found') endif nasm = meson.get_compiler('nasm') code = ''' SECTION .text global main main: mov foo,bar ; error: symbol `foo' not defined ''' assert(not nasm.compiles(code, name: 'Invalid NASM code')) code = ''' SECTION .text global main main: mov eax,1 ''' assert(nasm.compiles(code, name: 'Valid NASM code')) config_file = configure_file( output: 'config.asm', configuration: {'HELLO': 0}, output_format: 'nasm', ) cc = meson.get_compiler('c') link_args = cc.get_supported_link_arguments(['-no-pie']) exe = executable( 'hello', 'hello.asm', nasm_args: '-DFOO', link_args: link_args, ) test('hello', exe) # different than meson: Currently muon does not filter out -pthread from nasm # targets. ##Test whether pthread dependency gets filtered out #threads = dependency('threads') #exe2 = executable( # 'hello_w_threads', # 'hello.asm', # config_file, # nasm_args: '-DFOO', # link_args: link_args, # dependencies: [threads], #) #test('hello_w_threads', exe2) muon-v0.4.0/subprojects/meson-tests/nasm/2 asm language/hello.asm0000644000175000017500000000202714751453622023706 0ustar buildbuild; hello.asm a first program for nasm for Linux, Intel, gcc ; ; assemble: nasm -f elf -l hello.lst hello.asm ; link: gcc -o hello hello.o ; run: hello ; output is: Hello World %include "config.asm" %ifdef FOO %define RETVAL HELLO %endif SECTION .data ; data section msg: db "Hello World",10 ; the string to print, 10=cr len: equ $-msg ; "$" means "here" ; len is a value, not an address SECTION .text ; code section global main ; make label available to linker main: ; standard gcc entry point mov edx,len ; arg3, length of string to print mov ecx,msg ; arg2, pointer to string mov ebx,1 ; arg1, where to write, screen mov eax,4 ; write sysout command to int 80 hex int 0x80 ; interrupt 80 hex, call kernel mov ebx,RETVAL ; exit code, 0=normal mov eax,1 ; exit command to kernel int 0x80 ; interrupt 80 hex, call kernel muon-v0.4.0/subprojects/meson-tests/nasm/4 through configure/0002755000175000017500000000000014751453622023202 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/nasm/4 through configure/dummy.asm.in0000644000175000017500000000007514751453622025444 0ustar buildbuildglobal dummy section .rodata align=16 dummy: dd 0x00010203 muon-v0.4.0/subprojects/meson-tests/nasm/4 through configure/meson.build0000644000175000017500000000126114751453622025342 0ustar buildbuildproject('through configure') if not add_languages('nasm', required: false) error('MESON_SKIP_TEST: nasm not found') endif if not host_machine.cpu_family().startswith('x86') assert(not add_languages('nasm', required: false)) error('MESON_SKIP_TEST: nasm only supported for x86 and x86_64') endif if meson.backend().startswith('vs') error('MESON_SKIP_TEST: VS backend does not recognise NASM yet') endif section = host_machine.system() == 'macos' ? '.rodata' : '.rdata' sources = configure_file( input: 'dummy.asm.in', output: 'dummy.asm', configuration: {'section': section}, ) dummy = library( 'dummy', sources, vs_module_defs: 'dummy.def', ) muon-v0.4.0/subprojects/meson-tests/nasm/4 through configure/dummy.def0000644000175000017500000000001714751453622025011 0ustar buildbuildEXPORTS dummy muon-v0.4.0/subprojects/meson-tests/objcpp/0002755000175000017500000000000014751453622017753 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/objcpp/1 simple/0002755000175000017500000000000014751453622021365 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/objcpp/1 simple/meson.build0000644000175000017500000000020414751453622023521 0ustar buildbuildproject('Objective C++', 'objcpp', default_options: 'cpp_std=c++14') exe = executable('objcppprog', 'prog.mm') test('objcpp', exe) muon-v0.4.0/subprojects/meson-tests/objcpp/1 simple/prog.mm0000644000175000017500000000010514751453622022661 0ustar buildbuild#import class MyClass { }; int main(void) { return 0; } muon-v0.4.0/subprojects/meson-tests/objcpp/3 objfw/0002755000175000017500000000000014751453622021205 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/objcpp/3 objfw/SimpleTest.mm0000644000175000017500000000022714751453622023630 0ustar buildbuild#import #import @interface SimpleTest: OTTestCase @end @implementation SimpleTest - (void)testMeson { } @end muon-v0.4.0/subprojects/meson-tests/objcpp/3 objfw/meson.build0000644000175000017500000000066114751453622023350 0ustar buildbuildproject('objfw build tests', 'objcpp') objfw_dep = dependency('objfw', required: false) objfwtest_dep = dependency('objfw', modules: ['ObjFWTest'], required: false) if not objfw_dep.found() or not objfwtest_dep.found() error('MESON_SKIP_TEST: Need objfw dependency') endif executable('TestApplication', 'TestApplication.mm', dependencies: [objfw_dep]) executable('SimpleTest', 'SimpleTest.mm', dependencies: [objfwtest_dep]) muon-v0.4.0/subprojects/meson-tests/objcpp/3 objfw/TestApplication.mm0000644000175000017500000000042414751453622024641 0ustar buildbuild#import @interface TestApplication: OFObject @end OF_APPLICATION_DELEGATE(TestApplication) @implementation TestApplication - (void)applicationDidFinishLaunching: (OFNotification *)notification { [OFApplication terminate]; } @end muon-v0.4.0/subprojects/meson-tests/objcpp/2 objc++ args/0002755000175000017500000000000014751453622022055 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/objcpp/2 objc++ args/meson.build0000644000175000017500000000022314751453622024212 0ustar buildbuildproject('objective c++ args', 'objcpp') exe = executable('prog', 'prog.mm', objcpp_args: ['-DMESON_OBJCPP_TEST']) test('objective c++ args', exe) muon-v0.4.0/subprojects/meson-tests/objcpp/2 objc++ args/prog.mm0000644000175000017500000000021514751453622023353 0ustar buildbuild#import class TestClass { }; int main(void) { #ifdef MESON_OBJCPP_TEST int x = 1; #endif printf("x = %x\n", x); return 0; } muon-v0.4.0/subprojects/meson-tests/frameworks/0002755000175000017500000000000014751453622020656 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/0002755000175000017500000000000014751453622022470 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/data/0002755000175000017500000000000014751453622023401 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/data/test5.desktop.in.in0000644000175000017500000000013114751453622027043 0ustar buildbuild[Desktop Entry] Name=Test 2 GenericName=@NAME@ Comment=Test Application Type=Application muon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/data/test2.desktop.in0000644000175000017500000000013614751453622026440 0ustar buildbuild[Desktop Entry] Name=Test 2 GenericName=Application Comment=Test Application Type=Application muon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/data/meson.build0000644000175000017500000000307314751453622025544 0ustar buildbuild# Use filename substitution i18n.merge_file( input: 'test.desktop.in', output: '@BASENAME@', type: 'desktop', po_dir: '../po', data_dirs: '../po', install: true, install_dir: join_paths(get_option('datadir'), 'applications'), ) # Use filename substitution for another file i18n.merge_file( input: files('test2.desktop.in'), output: '@BASENAME@', type: 'desktop', po_dir: '../po', install: true, install_dir: join_paths(get_option('datadir'), 'applications'), ) i18n.merge_file( input: 'test.desktop.in', output: 'test3.desktop', type: 'desktop', po_dir: '../po', install: true, install_dir: join_paths(get_option('datadir'), 'applications'), ) # Regression test when passing File object as input and '@BASENAME@' as output # in multiple i18n.merge_file() calls. It used to make target name collision. # https://github.com/mesonbuild/meson/issues/9022 i18n.merge_file( input: configure_file( input: 'test5.desktop.in.in', output: '@BASENAME@', configuration: {'NAME': 'Application'}, ), output: '@BASENAME@', type: 'desktop', po_dir: '../po', install: true, install_dir: join_paths(get_option('datadir'), 'applications'), ) i18n.merge_file( input: configure_file( input: 'test6.desktop.in.in', output: '@BASENAME@', configuration: {'NAME': 'Application'}, ), output: '@BASENAME@', type: 'desktop', po_dir: '../po', install: true, install_dir: join_paths(get_option('datadir'), 'applications'), ) subdir('data3') muon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/data/test.desktop.in0000644000175000017500000000013414751453622026354 0ustar buildbuild[Desktop Entry] Name=Test GenericName=Application Comment=Test Application Type=Application muon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/data/data3/0002755000175000017500000000000014751453622024375 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/data/data3/meson.build0000644000175000017500000000037614751453622026543 0ustar buildbuild# Target name will contain a path separator i18n.merge_file( input: 'test.desktop.in', output: 'test4.desktop', type: 'desktop', po_dir: '../../po', install: true, install_dir: join_paths(get_option('datadir'), 'applications'), ) muon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/data/data3/test.desktop.in0000644000175000017500000000013414751453622027350 0ustar buildbuild[Desktop Entry] Name=Test GenericName=Application Comment=Test Application Type=Application muon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/data/test6.desktop.in.in0000644000175000017500000000013114751453622027044 0ustar buildbuild[Desktop Entry] Name=Test 2 GenericName=@NAME@ Comment=Test Application Type=Application muon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/meson_options.txt0000644000175000017500000000016414751453622026124 0ustar buildbuildoption( 'static', type: 'boolean', value: false, description: 'build statically linked binaries', ) muon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/po/0002755000175000017500000000000014751453622023106 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/po/LINGUAS0000644000175000017500000000001114751453622024121 0ustar buildbuildde fi ru muon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/po/meson.build0000644000175000017500000000017114751453622025245 0ustar buildbuildlangs = ['fi', 'de', 'ru'] gettext_targets = i18n.gettext('intltest', languages: langs) mo_targets = gettext_targets[0] muon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/po/intltest.pot0000644000175000017500000000165714751453622025507 0ustar buildbuild# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the intltest package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: intltest\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-05-31 05:16-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: src/intlmain.c:15 msgid "International greeting." msgstr "" #: data/test.desktop.in:3 msgid "Test" msgstr "" #: data/test.desktop.in:4 msgid "Application" msgstr "" #: data/test.desktop.in:5 msgid "Test Application" msgstr "" #: data/com.mesonbuild.test.dummy.metainfo.xml:19 msgid "This is text with embedded XML tags. Nice!" msgstr "" muon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/po/fi.po0000644000175000017500000000131514751453622024042 0ustar buildbuild# Finnish translations for PACKAGE package. # Copyright (C) 2013 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Jussi Pakkanen , 2013. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-12 18:53+0300\n" "PO-Revision-Date: 2013-09-12 18:57+0300\n" "Last-Translator: Jussi Pakkanen \n" "Language-Team: Finnish\n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ASCII\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/intlmain.c:15 msgid "International greeting." msgstr "Maailman tervehdys." muon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/po/POTFILES0000644000175000017500000000004414751453622024252 0ustar buildbuildsrc/intlmain.c data/test.desktop.in muon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/po/ru.po0000644000175000017500000000161014751453622024070 0ustar buildbuild# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the intltest package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: intltest\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-05-31 05:16-0500\n" "PO-Revision-Date: 2019-04-22 02:38+0300\n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Last-Translator: \n" "Language-Team: \n" "X-Generator: Poedit 2.2.1\n" #: src/intlmain.c:15 msgid "International greeting." msgstr "Межнациональное приветствие." #: data/test.desktop.in:3 msgid "Test" msgstr "Тест" #: data/test.desktop.in:4 msgid "Application" msgstr "Приложение" #: data/test.desktop.in:5 msgid "Test Application" msgstr "Тестовое приложение" muon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/po/de.po0000644000175000017500000000163014751453622024034 0ustar buildbuild# German translations for PACKAGE package. # Copyright (C) 2013 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Jussi Pakkanen , 2013. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-09-12 18:53+0300\n" "PO-Revision-Date: 2013-09-12 18:57+0300\n" "Last-Translator: Jussi Pakkanen \n" "Language-Team: German\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ASCII\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: src/intlmain.c:15 msgid "International greeting." msgstr "Internationale Gruss." #: data/com.mesonbuild.test.dummy.metainfo.xml:19 msgid "This is text with embedded XML tags. Nice!" msgstr "Dies ist Text mit eingebetteten XML Tags. Toll!" muon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/meson.build0000644000175000017500000000116614751453622024634 0ustar buildbuildproject('gettext example', 'c') gettext = find_program('gettext', required: false) if not gettext.found() error('MESON_SKIP_TEST gettext not found.') endif xgettext = find_program('xgettext', required: false) if not xgettext.found() error('MESON_SKIP_TEST xgettext not found.') endif intl = dependency('intl', required: false, static: get_option('static')) if not intl.found() error('MESON_SKIP_TEST libintl/gettext functions not found.') endif itstool = find_program('itstool', required: false) i18n = import('i18n') subdir('po') subdir('src') subdir('data') subdir('data2') subdir('data3') subdir('generated') muon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/test.json0000644000175000017500000000215314751453622024341 0ustar buildbuild{ "installed": [ {"type": "exe", "file": "usr/bin/intlprog"}, {"type": "file", "file": "usr/share/locale/de/LC_MESSAGES/intltest.mo"}, {"type": "file", "file": "usr/share/locale/fi/LC_MESSAGES/intltest.mo"}, {"type": "file", "file": "usr/share/locale/ru/LC_MESSAGES/intltest.mo"}, {"type": "file", "file": "usr/share/applications/something.desktop"}, {"type": "file", "file": "usr/share/applications/test.desktop"}, {"type": "file", "file": "usr/share/applications/test.plugin"}, {"type": "file", "file": "usr/share/applications/test2.desktop"}, {"type": "file", "file": "usr/share/applications/test3.desktop"}, {"type": "file", "file": "usr/share/applications/test4.desktop"}, {"type": "file", "file": "usr/share/applications/test5.desktop"}, {"type": "file", "file": "usr/share/applications/test6.desktop"}, {"type": "file", "file": "usr/share/metainfo/com.mesonbuild.test.intlprog.metainfo.xml"} ], "matrix": { "options": { "static": [ { "val": "true" }, { "val": "false" } ] } }, "expect_skip_on_jobname": ["azure", "cygwin"] } muon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/data3/0002755000175000017500000000000014751453622023464 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/data3/verify.py0000755000175000017500000000034214751453622025342 0ustar buildbuild#!/usr/bin/env python3 import os import sys assert len(sys.argv) == 3 fname = sys.argv[1] check_str = sys.argv[2] assert os.path.isfile(fname) with open(fname, 'r', encoding='utf-8') as f: assert check_str in f.read() muon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/data3/meson.build0000644000175000017500000000251214751453622025624 0ustar buildbuildif itstool.found() mi_translated = i18n.itstool_join( input: 'com.mesonbuild.test.intlprog.metainfo.xml', output: 'com.mesonbuild.test.intlprog.metainfo.xml', mo_targets: mo_targets, its_files: ['metainfo.its'], install: true, install_dir: get_option('datadir') / 'metainfo', ) # older versions of itstool have a bug where ITS rules specified on the command-line # are not read when joining files. Since we don't install appstream in the Meson CI # environment, the to-be-tested entry will be untranslated and the test would fail, so # we just skip verification if the installed itstool is too old. r = run_command(itstool, '-v', check: true) itstool_v = r.stdout().strip().split() if itstool_v[1].version_compare('>=2.0.6') verify_exe = find_program('verify.py') test( 'test xml translation', verify_exe, args: [ mi_translated, '

Dies ist Text mit eingebetteten XML Tags. Toll!

', ], ) else message('Skipping translation verification: Itstool too old.') endif else install_data( 'com.mesonbuild.test.intlprog.metainfo.xml', install_dir: get_option('datadir') / 'metainfo', ) endif muon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/data3/metainfo.its0000644000175000017500000000312414751453622026005 0ustar buildbuild ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootmuon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/data3/com.mesonbuild.test.intlprog.metainfo.xmlmuon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/data3/com.mesonbuild.test.intlprog.metainfo0000644000175000017500000000127114751453622032740 0ustar buildbuild com.mesonbuild.test.intlprog Test Application FSFAP FSFAP

Test Application

International greeting.

This is text with embedded XML tags. Nice!

meson-unittest-intlprog Development Building intlprog
muon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/generated/0002755000175000017500000000000014751453622024426 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/generated/something.desktop.in.in0000644000175000017500000000102014751453622031017 0ustar buildbuild[Desktop Entry] Name=Something doer Comment=Do something # Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! Keywords=zip;tar;extract;unpack; TryExec=file-roller Exec=file-roller %U StartupNotify=true Terminal=false Type=Application # Translators: Do NOT translate or transliterate this text (this is an icon file name)! Icon=something Categories=GTK;GNOME;Utility X-GNOME-DocPath=file-roller/file-roller.xml X-GNOME-UsesNotifications=true muon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/generated/meson.build0000644000175000017500000000066514751453622026575 0ustar buildbuilddgen = find_program('desktopgenerator.py') desktop_in_file = custom_target( 'something.desktop.in', input: ['something.desktop.in.in'], output: 'something.desktop.in', command: [dgen, '@INPUT@', '@OUTPUT@'], ) i18n.merge_file( input: desktop_in_file, output: 'something.desktop', type: 'desktop', po_dir: '../po', install: true, install_dir: join_paths(get_option('datadir'), 'applications'), ) muon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/generated/desktopgenerator.py0000644000175000017500000000026114751453622030355 0ustar buildbuild#!/usr/bin/env python3 import os, sys, shutil ifile = sys.argv[1] ofile = sys.argv[2] try: os.unlink(ofile) except FileNotFoundError: pass shutil.copy(ifile, ofile) muon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/data2/0002755000175000017500000000000014751453622023463 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/data2/meson.build0000644000175000017500000000041214751453622025620 0ustar buildbuildi18n.merge_file( input: 'test.desktop.in', output: 'test.plugin', type: 'desktop', po_dir: '../po', data_dirs: '../po', args: ['--keyword=Description'], install: true, install_dir: join_paths(get_option('datadir'), 'applications'), ) muon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/data2/test.desktop.in0000644000175000017500000000014014751453622026433 0ustar buildbuild[Desktop Entry] Name=Test GenericName=Application Description=Test Application Type=Application muon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/src/0002755000175000017500000000000014751453622023257 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/src/intlmain.c0000644000175000017500000000060414751453622025234 0ustar buildbuild#include #include #include #define _(String) gettext (String) #define PACKAGE "intltest" // WRONG, but enough for this test. #define LOCALEDIR "/usr/share/locale" int main(int argc, char **argv) { setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); printf("%s\n", _("International greeting.")); return 0; } muon-v0.4.0/subprojects/meson-tests/frameworks/6 gettext/src/meson.build0000644000175000017500000000011014751453622025407 0ustar buildbuildexecutable('intlprog', 'intlmain.c', install: true, dependencies: intl) muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/0002755000175000017500000000000014751453622022112 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/resources/0002755000175000017500000000000014751453622024124 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/resources/res3.txt0000644000175000017500000000004714751453622025540 0ustar buildbuildThis file is from the wrong directory. muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/resources/generated.gresource.xml0000644000175000017500000000036214751453622030600 0ustar buildbuild res1.txt subdir/res2.txt res3.txt subdir/res4.txt muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/resources/simple-main.c0000644000175000017500000000135414751453622026504 0ustar buildbuild#include #include #include #include"simple-resources.h" #define EXPECTED "This is a resource.\n" int main(int argc, char **argv) { simple_resources_get_resource(); GError *err = NULL; GBytes *data = g_resources_lookup_data("/com/example/myprog/res1.txt", G_RESOURCE_LOOKUP_FLAGS_NONE, &err); if(data == NULL) { fprintf(stderr, "Data lookup failed: %s\n", err->message); return 1; } if(strcmp(g_bytes_get_data(data, NULL), EXPECTED) != 0) { fprintf(stderr, "Resource contents are wrong:\n %s\n", (const char*)g_bytes_get_data(data, NULL)); return 1; } fprintf(stdout, "All ok.\n"); g_bytes_unref(data); return 0; } muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/resources/generated-main.c0000644000175000017500000000137314751453622027152 0ustar buildbuild#include #include #include #include"generated-resources.h" #define EXPECTED "This is a generated resource.\n" int main(int argc, char **argv) { generated_resources_get_resource(); GError *err = NULL; GBytes *data = g_resources_lookup_data("/com/example/myprog/res3.txt", G_RESOURCE_LOOKUP_FLAGS_NONE, &err); if(data == NULL) { fprintf(stderr, "Data lookup failed: %s\n", err->message); return 1; } if(strcmp(g_bytes_get_data(data, NULL), EXPECTED) != 0) { fprintf(stderr, "Resource contents are wrong:\n %s\n", (const char*)g_bytes_get_data(data, NULL)); return 1; } fprintf(stdout, "All ok.\n"); g_bytes_unref(data); return 0; } muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/resources/meson.build0000644000175000017500000000467414751453622026277 0ustar buildbuild# There are two tests here, because the 2nd one depends on a version of # GLib (2.51.1) that is very recent at the time of writing. simple_gresource = configure_file( input: 'simple.gresource.xml', output: 'simple-gen.gresource.xml', command: [copyfile, '@INPUT@', '@OUTPUT@'], ) simple_resources = gnome.compile_resources( 'simple-resources', simple_gresource, install_header: true, export: true, source_dir: '../resources-data', c_name: 'simple_resources', ) simple_res_exe = executable( 'simple-resources-test', 'simple-main.c', simple_resources, dependencies: gio, ) test('simple resource test', simple_res_exe) # gnome.compile_resources( # 'simple-resources', # 'simple.gresource.xml', # gresource_bundle: true, # install: true, # install_dir: get_option('datadir'), # source_dir: '../resources-data', # ) # test('simple resource test (gresource)', find_program('resources.py')) if not pretend_glib_old and glib.version().version_compare('>= 2.52.0') # This test cannot pass if GLib version is too old. Generated resource # dependencies do not work correctly and Meson will raise an error if the # user tries to use either the 'dependencies' kwarg or a gresource file that # is itself generated. generated_resources = gnome.compile_resources( 'generated-resources', 'generated.gresource.xml', source_dir: '../resources-data', c_name: 'generated_resources', dependencies: [res3_txt, res4_txt], ) generated_res_exe = executable( 'generated-resources-test', 'generated-main.c', generated_resources, dependencies: gio, ) test('generated resource test', generated_res_exe) # Test with a CustomTarget subdir('generated') ct_resources = gnome.compile_resources( 'ct-resources', ct_simple_gresource, install_header: true, export: true, source_dir: '../resources-data', c_name: 'simple_resources', ) cti_resources = gnome.compile_resources( 'cti-resources', ct_simple_gresource[0], install_header: true, export: true, source_dir: '../resources-data', c_name: 'simple_resources', ) endif # Test build_by_default gnome.compile_resources( 'build-resources', 'simple.gresource.xml', gresource_bundle: true, build_by_default: true, source_dir: '../resources-data', ) muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/resources/myresource.gresource.xml0000644000175000017500000000036214751453622031037 0ustar buildbuild res1.txt subdir/res2.txt res3.txt subdir/res4.txt muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/resources/generated/0002755000175000017500000000000014751453622026062 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/resources/generated/meson.build0000644000175000017500000000024414751453622030222 0ustar buildbuildct_simple_gresource = custom_target( input: '../simple.gresource.xml', output: 'simple-ct.gresource.xml', command: [copyfile, '@INPUT@', '@OUTPUT@'], ) muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/resources/resources.py0000644000175000017500000000055314751453622026511 0ustar buildbuild#!/usr/bin/env python3 import os from gi.repository import Gio if __name__ == '__main__': res = Gio.resource_load(os.path.join('resources', 'simple-resources.gresource')) Gio.Resource._register(res) data = Gio.resources_lookup_data('/com/example/myprog/res1.txt', Gio.ResourceLookupFlags.NONE) assert data.get_data() == b'This is a resource.\n' muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/resources/simple.gresource.xml0000644000175000017500000000026714751453622030137 0ustar buildbuild res1.txt subdir/res2.txt muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/mkenums/0002755000175000017500000000000014751453622023571 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/mkenums/meson-sample.h0000644000175000017500000000057714751453622026351 0ustar buildbuild#pragma once typedef enum { MESON_THE_XVALUE, MESON_ANOTHER_VALUE } MesonTheXEnum; typedef enum /*< skip >*/ { MESON_FOO } MesonThisEnumWillBeSkipped; typedef enum /*< flags,prefix=MESON >*/ { MESON_THE_ZEROTH_VALUE, /*< skip >*/ MESON_THE_FIRST_VALUE, MESON_THE_SECOND_VALUE, MESON_THE_THIRD_VALUE, /*< nick=the-last-value >*/ } MesonTheFlagsEnum; muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/mkenums/main4.c0000644000175000017500000000242514751453622024746 0ustar buildbuild#include #include #include #include "enums4.h" #include "meson-sample.h" int main(int argc, char **argv) { GEnumClass *xenum = g_type_class_ref(MESON_TYPE_THE_XENUM); GFlagsClass *flags_enum = g_type_class_ref(MESON_TYPE_THE_FLAGS_ENUM); if (g_enum_get_value_by_name(xenum, "MESON_THE_XVALUE")->value != MESON_THE_XVALUE) { fprintf(stderr, "Get MESON_THE_XVALUE by name failed.\n"); return 1; } if (g_enum_get_value_by_nick(xenum, "the-xvalue")->value != MESON_THE_XVALUE) { fprintf(stderr, "Get MESON_THE_XVALUE by nick failed.\n"); return 2; } if (g_flags_get_value_by_name(flags_enum, "MESON_THE_FIRST_VALUE")->value != MESON_THE_FIRST_VALUE) { fprintf(stderr, "Get MESON_THE_FIRST_VALUE by name failed.\n"); return 3; } if (g_flags_get_value_by_nick(flags_enum, "the-first-value")->value != MESON_THE_FIRST_VALUE) { fprintf(stderr, "Get MESON_THE_FIRST_VALUE by nick failed.\n"); return 4; } /* Make sure that funcs are generated with leading underscore as requested */ if (!_meson_the_xenum_get_type()) g_error ("Bad!"); g_type_class_unref(xenum); g_type_class_unref(flags_enum); fprintf(stderr, "All ok.\n"); return 0; } muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/mkenums/main5.c0000644000175000017500000000237614751453622024754 0ustar buildbuild#include #include #include #include "enums5.h" #include "meson-sample.h" int main(int argc, char **argv) { GEnumClass *xenum = g_type_class_ref(MESON_TYPE_THE_XENUM); GFlagsClass *flags_enum = g_type_class_ref(MESON_TYPE_THE_FLAGS_ENUM); if (g_enum_get_value_by_name(xenum, "MESON_THE_XVALUE")->value != MESON_THE_XVALUE) { fprintf(stderr, "Get MESON_THE_XVALUE by name failed.\n"); return 1; } if (g_enum_get_value_by_nick(xenum, "the-xvalue")->value != MESON_THE_XVALUE) { fprintf(stderr, "Get MESON_THE_XVALUE by nick failed.\n"); return 2; } if (g_flags_get_value_by_name(flags_enum, "MESON_THE_FIRST_VALUE")->value != MESON_THE_FIRST_VALUE) { fprintf(stderr, "Get MESON_THE_FIRST_VALUE by name failed.\n"); return 3; } if (g_flags_get_value_by_nick(flags_enum, "the-first-value")->value != MESON_THE_FIRST_VALUE) { fprintf(stderr, "Get MESON_THE_FIRST_VALUE by nick failed.\n"); return 4; } /* Make sure that funcs do not have any extra prefix */ if (!meson_the_xenum_get_type()) g_error ("Bad!"); g_type_class_unref(xenum); g_type_class_unref(flags_enum); fprintf(stderr, "All ok.\n"); return 0; } muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/mkenums/main.c0000644000175000017500000000220114751453622024652 0ustar buildbuild#include #include #include #include"meson-sample.h" #include"@ENUM_FILE@" int main(int argc, char **argv) { GEnumClass *xenum = g_type_class_ref(MESON_TYPE_THE_XENUM); GFlagsClass *flags_enum = g_type_class_ref(MESON_TYPE_THE_FLAGS_ENUM); if (g_enum_get_value_by_name(xenum, "MESON_THE_XVALUE")->value != MESON_THE_XVALUE) { fprintf(stderr, "Get MESON_THE_XVALUE by name failed.\n"); return 1; } if (g_enum_get_value_by_nick(xenum, "the-xvalue")->value != MESON_THE_XVALUE) { fprintf(stderr, "Get MESON_THE_XVALUE by nick failed.\n"); return 2; } if (g_flags_get_value_by_name(flags_enum, "MESON_THE_FIRST_VALUE")->value != MESON_THE_FIRST_VALUE) { fprintf(stderr, "Get MESON_THE_FIRST_VALUE by name failed.\n"); return 3; } if (g_flags_get_value_by_nick(flags_enum, "the-first-value")->value != MESON_THE_FIRST_VALUE) { fprintf(stderr, "Get MESON_THE_FIRST_VALUE by nick failed.\n"); return 4; } g_type_class_unref(xenum); g_type_class_unref(flags_enum); fprintf(stderr, "All ok.\n"); return 0; } muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/mkenums/subdir/0002755000175000017500000000000014751453622025061 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/mkenums/subdir/h3.h0000644000175000017500000000010214751453622025533 0ustar buildbuild#pragma once typedef enum { MESON_SUBDIR2_FOO, } MesonSubdir2; muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/mkenums/subdir/h2.h.in0000644000175000017500000000010014751453622026135 0ustar buildbuild#pragma once typedef enum { MESON_SUBDIR_FOO, } MesonSubdir; muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/mkenums/subdir/meson.build0000644000175000017500000000012514751453622027217 0ustar buildbuildh2 = configure_file(input: 'h2.h.in', output: 'h2.h', copy: true) h3 = files('h3.h') muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/mkenums/enums2.c.in0000644000175000017500000000165714751453622025562 0ustar buildbuild/*** BEGIN file-header ***/ #include "enums.h" /*** END file-header ***/ /*** BEGIN file-production ***/ /* enumerations from "@basename@" */ #include "@basename@" /*** END file-production ***/ /*** BEGIN value-header ***/ GType @enum_name@_get_type(void) { static gsize static_g_define_type_id = 0; if(g_once_init_enter(&static_g_define_type_id)) { static const G@Type@Value values [] = { /*** END value-header ***/ /*** BEGIN value-production ***/ { @VALUENAME@, "@VALUENAME@", "@valuenick@" }, /*** END value-production ***/ /*** BEGIN value-tail ***/ { 0, NULL, NULL } }; GType g_define_type_id = g_@type@_register_static(g_intern_static_string("@EnumName@"), values); g_once_init_leave(&static_g_define_type_id, g_define_type_id); } return static_g_define_type_id; } /*** END value-tail ***/ /*** BEGIN file-tail ***/ /*** END file-tail ***/ muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/mkenums/enums2.h.in0000644000175000017500000000076214751453622025563 0ustar buildbuild/*** BEGIN file-header ***/ #ifndef MESON_ENUMS_H #define MESON_ENUMS_H #include G_BEGIN_DECLS /*** END file-header ***/ /*** BEGIN file-production ***/ /* enumerations from "@basename@" */ /*** END file-production ***/ /*** BEGIN value-header ***/ GType @enum_name@_get_type(void) G_GNUC_CONST; #define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type()) /*** END value-header ***/ /*** BEGIN file-tail ***/ G_END_DECLS #endif /* MESON_ENUMS_H */ /*** END file-tail ***/ muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/mkenums/meson-decls.h0000644000175000017500000000005114751453622026145 0ustar buildbuild#pragma once #define MESON_EXPORT extern muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/mkenums/meson.build0000644000175000017500000001152014751453622025730 0ustar buildbuild# Generate both header and source via template together. myenums = gnome.mkenums( 'abc1', sources: 'meson-sample.h', h_template: 'enums.h.in', c_template: 'enums.c.in', install_header: true, install_dir: get_option('includedir'), ) enums_c1 = myenums[0] enums_h1 = myenums[1] conf = configuration_data() conf.set('ENUM_FILE', 'enums.h') main = configure_file(input: 'main.c', output: 'main1.c', configuration: conf) enumexe1 = executable('enumprog1', main, enums_c1, enums_h1, dependencies: gobj) test('enum test 1', enumexe1) # Generate both header and source via template individually and overriding. enums_h2 = gnome.mkenums( 'abc2', sources: 'meson-sample.h', h_template: 'enums2.h.in', ftail: '/* trailing header file info */', install_header: true, install_dir: get_option('includedir'), ) enums_c2 = gnome.mkenums( 'abc2', sources: 'meson-sample.h', depends: [enums_h1, enums_h2], c_template: 'enums2.c.in', ftail: '/* trailing source file info */', ) # explicitly don't set install_dir here, for bug testing # See https://github.com/mesonbuild/meson/issues/9472 conf = configuration_data() conf.set('ENUM_FILE', 'enums2.h') main = configure_file(input: 'main.c', output: 'main2.c', configuration: conf) enumexe2 = executable('enumprog2', main, enums_c2, enums_h2, dependencies: gobj) test('enum test 2', enumexe2) # Generate both header and source by options only. # These are specified in a way that should produce the same result as above # (modulo any filename changes.) enums_h3 = gnome.mkenums( 'enums3.h', sources: 'meson-sample.h', fhead: '''#ifndef MESON_ENUMS_H #define MESON_ENUMS_H #include G_BEGIN_DECLS ''', fprod: ''' /* enumerations from "@basename@" */ ''', vhead: '''GType @enum_name@_get_type(void) G_GNUC_CONST; #define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type()) ''', ftail: ''' G_END_DECLS #endif /* MESON_ENUMS_H */ ''', install_header: true, install_dir: get_option('includedir'), ) enums_c3 = gnome.mkenums( 'enums3.c', sources: 'meson-sample.h', depends: enums_h3, fhead: '''#include "enums3.h" ''', fprod: ''' /* enumerations from "@basename@" */ #include "@basename@" ''', vhead: ''' GType @enum_name@_get_type(void) { static gsize static_g_define_type_id = 0; if(g_once_init_enter(&static_g_define_type_id)) { static const G@Type@Value values [] = { ''', vprod: ''' { @VALUENAME@, "@VALUENAME@", "@valuenick@" },''', vtail: ''' { 0, NULL, NULL } }; GType g_define_type_id = g_@type@_register_static(g_intern_static_string("@EnumName@"), values); g_once_init_leave(&static_g_define_type_id, g_define_type_id); } return static_g_define_type_id; } ''', ) conf = configuration_data() conf.set('ENUM_FILE', 'enums3.h') main = configure_file(input: 'main.c', output: 'main3.c', configuration: conf) enumexe3 = executable('enumprog3', main, enums_c3, enums_h3, dependencies: gobj) test('enum test 3', enumexe3) enums4 = gnome.mkenums_simple('enums4', sources: files('meson-sample.h'), function_prefix: '_') enumexe4 = executable('enumprog4', 'main4.c', enums4, dependencies: gobj) test('enum test 4', enumexe4) enums5 = gnome.mkenums_simple( 'enums5', sources: 'meson-sample.h', install_header: true, decorator: 'MESON_EXPORT', header_prefix: '#include "meson-decls.h"', ) conf = configuration_data() conf.set('ENUM_FILE', 'enums5.h') main = configure_file(input: 'main.c', output: 'main5.c', configuration: conf) enumexe5 = executable('enumprog5', main, enums5, dependencies: gobj) test('enum test 5', enumexe5) # Generate template then use as input to mkenums # Simple trick to copy the file without substitutions, can be # removed when https://github.com/mesonbuild/meson/pull/3383 is fixed gen_h_template = configure_file( input: 'enums.h.in', output: 'enums6.h.in', configuration: configuration_data(), format: 'cmake', ) enums_h6 = gnome.mkenums( 'enums6', sources: 'meson-sample.h', h_template: gen_h_template, ftail: '/* trailing header file info */', install_header: true, install_dir: get_option('includedir'), ) conf = configuration_data() conf.set('ENUM_FILE', 'enums6.h') main = configure_file(input: 'main.c', output: 'main6.c', configuration: conf) enumexe6 = executable('enumprog6', main, enums_c2, enums_h6, dependencies: gobj) test('enum test 6', enumexe6) # Test with headers coming from other directories # https://github.com/mesonbuild/meson/pull/10855 subdir('subdir') enums7 = gnome.mkenums_simple('enums7', sources: ['meson-sample.h', h2, h3]) main = configure_file( input: 'main.c', output: 'main7.c', configuration: {'ENUM_FILE': 'enums7.h'}, ) enumexe7 = executable('enumprog7', main, enums7, dependencies: gobj) test('enum test 7', enumexe7) muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/mkenums/enums.h.in0000644000175000017500000000076214751453622025501 0ustar buildbuild/*** BEGIN file-header ***/ #ifndef MESON_ENUMS_H #define MESON_ENUMS_H #include G_BEGIN_DECLS /*** END file-header ***/ /*** BEGIN file-production ***/ /* enumerations from "@basename@" */ /*** END file-production ***/ /*** BEGIN value-header ***/ GType @enum_name@_get_type(void) G_GNUC_CONST; #define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type()) /*** END value-header ***/ /*** BEGIN file-tail ***/ G_END_DECLS #endif /* MESON_ENUMS_H */ /*** END file-tail ***/ muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/mkenums/enums.c.in0000644000175000017500000000165714751453622025500 0ustar buildbuild/*** BEGIN file-header ***/ #include "enums.h" /*** END file-header ***/ /*** BEGIN file-production ***/ /* enumerations from "@basename@" */ #include "@basename@" /*** END file-production ***/ /*** BEGIN value-header ***/ GType @enum_name@_get_type(void) { static gsize static_g_define_type_id = 0; if(g_once_init_enter(&static_g_define_type_id)) { static const G@Type@Value values [] = { /*** END value-header ***/ /*** BEGIN value-production ***/ { @VALUENAME@, "@VALUENAME@", "@valuenick@" }, /*** END value-production ***/ /*** BEGIN value-tail ***/ { 0, NULL, NULL } }; GType g_define_type_id = g_@type@_register_static(g_intern_static_string("@EnumName@"), values); g_once_init_leave(&static_g_define_type_id, g_define_type_id); } return static_g_define_type_id; } /*** END value-tail ***/ /*** BEGIN file-tail ***/ /*** END file-tail ***/ muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/genmarshal/0002755000175000017500000000000014751453622024233 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/genmarshal/marshaller.list0000644000175000017500000000004714751453622027261 0ustar buildbuildVOID:VOID VOID:INT FLOAT:BOOLEAN,UCHAR muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/genmarshal/main.c.in0000644000175000017500000000727214751453622025736 0ustar buildbuild#include #include #include #include @MARSHALLER_HEADER@ static int singleton = 42; void foo(gpointer user_data, gpointer data) { if (user_data != &singleton) { fprintf(stderr, "Invoked foo function was passed incorrect user data.\n"); exit(1); } } void bar(gpointer user_data, gint param1, gpointer data) { if (param1 != singleton) { fprintf(stderr, "Invoked bar function was passed incorrect param1, but %d.\n", param1); exit(2); } if (user_data != &singleton) { fprintf(stderr, "Invoked bar function was passed incorrect user data.\n"); exit(3); } } gfloat baz(gpointer user_data, gboolean param1, guchar param2, gpointer data) { if (param1 != TRUE) { fprintf(stderr, "Invoked baz function was passed incorrect param1.\n"); exit(4); } if (param2 != singleton) { fprintf(stderr, "Invoked baz function was passed incorrect param2.\n"); exit(5); } if (user_data != &singleton) { fprintf(stderr, "Invoked baz function was passed incorrect user data.\n"); exit(6); } return (gfloat)param2; } int main(int argc, char **argv) { GClosure *cc_foo, *cc_bar, *cc_baz; GValue return_value = G_VALUE_INIT; GValue param_values[3] = {G_VALUE_INIT, G_VALUE_INIT, G_VALUE_INIT}; fprintf(stderr, "Invoking foo function.\n"); cc_foo = g_cclosure_new(G_CALLBACK(foo), NULL, NULL); g_closure_set_marshal(cc_foo, g_cclosure_user_marshal_VOID__VOID); g_value_init(¶m_values[0], G_TYPE_POINTER); g_value_set_pointer(¶m_values[0], &singleton); g_closure_invoke(cc_foo, &return_value, 1, param_values, NULL); if (G_VALUE_TYPE(&return_value) != G_TYPE_INVALID) { fprintf(stderr, "Invoked foo function did not return empty value, but %s.\n", G_VALUE_TYPE_NAME(&return_value)); return 7; } g_value_unset(¶m_values[0]); g_value_unset(&return_value); g_closure_unref(cc_foo); fprintf(stderr, "Invoking bar function.\n"); cc_bar = g_cclosure_new(G_CALLBACK(bar), NULL, NULL); g_closure_set_marshal(cc_bar, g_cclosure_user_marshal_VOID__INT); g_value_init(¶m_values[0], G_TYPE_POINTER); g_value_set_pointer(¶m_values[0], &singleton); g_value_init(¶m_values[1], G_TYPE_INT); g_value_set_int(¶m_values[1], 42); g_closure_invoke(cc_bar, &return_value, 2, param_values, NULL); if (G_VALUE_TYPE(&return_value) != G_TYPE_INVALID) { fprintf(stderr, "Invoked bar function did not return empty value.\n"); return 8; } g_value_unset(¶m_values[0]); g_value_unset(¶m_values[1]); g_value_unset(&return_value); g_closure_unref(cc_bar); fprintf(stderr, "Invoking baz function.\n"); cc_baz = g_cclosure_new(G_CALLBACK(baz), NULL, NULL); g_closure_set_marshal(cc_baz, g_cclosure_user_marshal_FLOAT__BOOLEAN_UCHAR); g_value_init(¶m_values[0], G_TYPE_POINTER); g_value_set_pointer(¶m_values[0], &singleton); g_value_init(¶m_values[1], G_TYPE_BOOLEAN); g_value_set_boolean(¶m_values[1], TRUE); g_value_init(¶m_values[2], G_TYPE_UCHAR); g_value_set_uchar(¶m_values[2], 42); g_value_init(&return_value, G_TYPE_FLOAT); g_closure_invoke(cc_baz, &return_value, 3, param_values, NULL); if (g_value_get_float(&return_value) != 42.0f) { fprintf(stderr, "Invoked baz function did not return expected value.\n"); return 9; } g_value_unset(¶m_values[0]); g_value_unset(¶m_values[1]); g_value_unset(¶m_values[2]); g_value_unset(&return_value); g_closure_unref(cc_baz); fprintf(stderr, "All ok.\n"); return 0; } muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/genmarshal/meson.build0000644000175000017500000000351014751453622026372 0ustar buildbuildm_list = configure_file(input: 'marshaller.list', output: 'm.list', copy: true) idx = 0 mlists = ['marshaller.list', files('marshaller.list'), m_list] foreach mlist : mlists marshallers = gnome.genmarshal( 'marshaller-@0@'.format(idx), sources: mlist, install_header: true, install_dir: get_option('includedir') / 'subdir-@0@'.format(idx), extra_args: ['-UG_ENABLE_DEBUG', '--prototypes'], ) marshaller_c = marshallers[0] marshaller_h = marshallers[1] cdata = configuration_data() cdata.set_quoted('MARSHALLER_HEADER', 'marshaller-@0@.h'.format(idx)) main_c = configure_file( input: 'main.c.in', output: 'main-@0@.c'.format(idx), configuration: cdata, ) genmarshalexe = executable( 'genmarshalprog-@0@'.format(idx), main_c, marshaller_c, marshaller_h, dependencies: gobj, ) test('genmarshal test @0@'.format(idx), genmarshalexe) idx += 1 endforeach foreach mlist : mlists marshallers = gnome.genmarshal( 'marshaller-@0@'.format(idx), sources: [mlist], install_header: true, install_dir: get_option('includedir') / 'subdir-@0@'.format(idx), extra_args: ['-UG_ENABLE_DEBUG', '--prototypes'], ) marshaller_c = marshallers[0] marshaller_h = marshallers[1] cdata = configuration_data() cdata.set_quoted('MARSHALLER_HEADER', 'marshaller-@0@.h'.format(idx)) main_c = configure_file( input: 'main.c.in', output: 'main-@0@.c'.format(idx), configuration: cdata, ) genmarshalexe = executable( 'genmarshalprog-@0@'.format(idx), main_c, marshaller_c, marshaller_h, dependencies: gobj, ) test('genmarshal test @0@'.format(idx), genmarshalexe) idx += 1 endforeach muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/meson.build0000644000175000017500000000432214751453622024253 0ustar buildbuildproject('gobject-introspection', 'c') copyfile = find_program('copyfile.py') copyfile_gen = generator(copyfile, output: '@BASENAME@Gen.xml', arguments: ['@INPUT@', '@OUTPUT@']) glib = dependency('glib-2.0', required: false) if not glib.found() error('MESON_SKIP_TEST glib not found.') endif # gobject-introspection not implemented by the gnome module, remove it's tests # gir = dependency('gobject-introspection-1.0', required: false) # if not gir.found() # error('MESON_SKIP_TEST gobject-introspection not found.') # endif # # python3 = import('python3') # py3 = python3.find_python() # if run_command(py3, '-c', 'import gi;', check: false).returncode() != 0 # error('MESON_SKIP_TEST python3-gi not found') # endif cc = meson.get_compiler('c') add_global_arguments('-DMESON_TEST_1', language: 'c') if cc.get_id() == 'intel' # Ignore invalid GCC pragma warnings from glib # https://bugzilla.gnome.org/show_bug.cgi?id=776562 add_global_arguments('-wd2282', language: 'c') endif py3 = import('python3').find_python() pycode = '''import os, sys if "MESON_UNIT_TEST_PRETEND_GLIB_OLD" in os.environ: sys.exit(0) sys.exit(1) ''' pretend_glib_old = false res = run_command(py3, '-c', pycode, check: false) if res.returncode() == 0 pretend_glib_old = true endif gnome = import('gnome') gio = dependency('gio-2.0') giounix = dependency('gio-unix-2.0') glib = dependency('glib-2.0') gobj = dependency('gobject-2.0') # gir = dependency('gobject-introspection-1.0') gmod = dependency('gmodule-2.0') # GLib >= 2.76 removed slice allocator which causes a leak in g-i to now be # visible to asan. The leak should be fixed in g-i >= 1.76.2: # https://gitlab.gnome.org/GNOME/gobject-introspection/-/merge_requests/411 # if get_option('b_sanitize') != 'none' and gir.version().version_compare('<=1.76.1') and glib.version().version_compare('>=2.76') # error( # 'MESON_SKIP_TEST gobject-introspection >=1.76.2 is required with address sanitizer.', # ) # endif # Test that static deps don't error out when static libraries aren't found glib_static = dependency('glib-2.0', static: true) subdir('resources-data') subdir('resources') # subdir('gir') subdir('schemas') subdir('gdbus') subdir('mkenums') subdir('genmarshal') muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/test.json0000644000175000017500000000463314751453622023770 0ustar buildbuild{ "installed": [ {"type": "file", "file": "usr/include/ct-resources.h"}, {"type": "file", "file": "usr/include/cti-resources.h"}, {"type": "file", "file": "usr/include/enums.h"}, {"type": "file", "file": "usr/include/enums2.h"}, {"type": "file", "file": "usr/include/enums3.h"}, {"type": "file", "file": "usr/include/enums5.h"}, {"type": "file", "file": "usr/include/subdir-0/marshaller-0.h"}, {"type": "file", "file": "usr/include/subdir-1/marshaller-1.h"}, {"type": "file", "file": "usr/include/subdir-2/marshaller-2.h"}, {"type": "file", "file": "usr/include/subdir-3/marshaller-3.h"}, {"type": "file", "file": "usr/include/subdir-4/marshaller-4.h"}, {"type": "file", "file": "usr/include/subdir-5/marshaller-5.h"}, {"type": "expr", "file": "usr/lib/?libgir_lib.so"}, {"type": "file", "platform": "cygwin", "file": "usr/lib/libgir_lib.dll.a"}, {"type": "expr", "file": "usr/lib/?libgir_lib2.so"}, {"type": "file", "platform": "cygwin", "file": "usr/lib/libgir_lib2.dll.a"}, {"type": "expr", "file": "usr/lib/?libdep1lib.so"}, {"type": "file", "platform": "cygwin", "file": "usr/lib/libdep1lib.dll.a"}, {"type": "expr", "file": "usr/lib/?libdep2lib.so"}, {"type": "file", "platform": "cygwin", "file": "usr/lib/libdep2lib.dll.a"}, {"type": "expr", "file": "usr/lib/?libdep3lib.so"}, {"type": "file", "platform": "cygwin", "file": "usr/lib/libdep3lib.dll.a"}, {"type": "file", "file": "usr/lib/girepository-1.0/Meson-1.0.typelib"}, {"type": "file", "file": "usr/lib/girepository-1.0/MesonDep1-1.0.typelib"}, {"type": "file", "file": "usr/lib/girepository-1.0/MesonDep2-1.0.typelib"}, {"type": "file", "file": "usr/lib/girepository-1.0/MesonDep3-1.0.typelib"}, {"type": "file", "file": "usr/share/gir-1.0/Meson-1.0.gir"}, {"type": "file", "file": "usr/share/gir-1.0/MesonDep1-1.0.gir"}, {"type": "file", "file": "usr/share/gir-1.0/MesonDep2-1.0.gir"}, {"type": "file", "file": "usr/share/gir-1.0/MesonDep3-1.0.gir"}, {"type": "file", "file": "usr/share/glib-2.0/schemas/com.github.meson.gschema.xml"}, {"type": "file", "file": "usr/share/simple-resources.gresource"}, {"type": "file", "file": "usr/include/enums6.h"}, {"type": "file", "file": "usr/include/simple-resources.h"}, {"type": "file", "file": "usr/include/generated-gdbus.h"} ], "expect_skip_on_jobname": ["azure", "cygwin", "macos", "msys2", "pypy"] } muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/gir/0002755000175000017500000000000014751453622022673 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/gir/meson-sample.h0000644000175000017500000000120714751453622025442 0ustar buildbuild#ifndef MESON_SAMPLE_H #define MESON_SAMPLE_H #if !defined (MESON_TEST_1) #error "MESON_TEST_1 not defined." #endif #if !defined (MESON_TEST_2) #error "MESON_TEST_2 not defined." #endif #include #include "dep1/dep1.h" G_BEGIN_DECLS #define MESON_TYPE_SAMPLE (meson_sample_get_type()) G_DECLARE_FINAL_TYPE (MesonSample, meson_sample, MESON, SAMPLE, GObject) MesonSample *meson_sample_new (void); void meson_sample_print_message (MesonSample *self, MesonDep1 *dep1, MesonDep2 *dep2); G_END_DECLS #endif /* MESON_SAMPLE_H */ muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/gir/copy.py0000755000175000017500000000055214751453622024222 0ustar buildbuild#!/usr/bin/env python3 # SPDX-License-Identifier: Apache-2.0 # Copyright © 2021 Intel Corporation import argparse import shutil def main() -> None: parser = argparse.ArgumentParser() parser.add_argument('src') parser.add_argument('dest') args = parser.parse_args() shutil.copy(args.src, args.dest) if __name__ == "__main__": main() muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/gir/meson-sample2.c0000644000175000017500000000125014751453622025515 0ustar buildbuild#include "meson-sample2.h" struct _MesonSample2 { GObject parent_instance; }; G_DEFINE_TYPE (MesonSample2, meson_sample2, G_TYPE_OBJECT) /** * meson_sample2_new: * * Allocates a new #MesonSample2. * * Returns: (transfer full): a #MesonSample2. */ MesonSample2 * meson_sample2_new (void) { return g_object_new (MESON_TYPE_SAMPLE2, NULL); } static void meson_sample2_class_init (MesonSample2Class *klass) { } static void meson_sample2_init (MesonSample2 *self) { } /** * meson_sample2_print_message: * @self: a #MesonSample2. * * Prints Hello. * * Returns: Nothing. */ void meson_sample2_print_message (MesonSample2 *self) { g_print ("Message: Hello\n"); } muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/gir/prog.py0000755000175000017500000000045314751453622024217 0ustar buildbuild#!/usr/bin/env python3 from gi.repository import Meson, MesonDep1, MesonDep2 if __name__ == "__main__": s = Meson.Sample.new() dep1 = MesonDep1.Dep1.new() dep2 = MesonDep2.Dep2.new("Hello, meson/py!") s.print_message(dep1, dep2) s2 = Meson.Sample2.new() s2.print_message() muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/gir/dep1/0002755000175000017500000000000014751453622023524 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/gir/dep1/dep1.h0000644000175000017500000000076014751453622024527 0ustar buildbuild#ifndef MESON_DEP1_H #define MESON_DEP1_H #if !defined (MESON_TEST_1) #error "MESON_TEST_1 not defined." #endif #include #include "dep2/dep2.h" G_BEGIN_DECLS #define MESON_TYPE_DEP1 (meson_dep1_get_type()) G_DECLARE_FINAL_TYPE (MesonDep1, meson_dep1, MESON, DEP1, GObject) MesonDep1 *meson_dep1_new (void); MesonDep2 *meson_dep1_just_return_it (MesonDep1 *self, MesonDep2 *dep); G_END_DECLS #endif /* MESON_DEP1_H */ muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/gir/dep1/dep1.c0000644000175000017500000000166514751453622024527 0ustar buildbuild#include "dep1.h" struct _MesonDep1 { GObject parent_instance; }; G_DEFINE_TYPE (MesonDep1, meson_dep1, G_TYPE_OBJECT) /** * meson_dep1_new: * * Allocates a new #MesonDep1. * * Returns: (transfer full): a #MesonDep1. */ MesonDep1 * meson_dep1_new (void) { return g_object_new (MESON_TYPE_DEP1, NULL); } static void meson_dep1_finalize (GObject *object) { G_OBJECT_CLASS (meson_dep1_parent_class)->finalize (object); } static void meson_dep1_class_init (MesonDep1Class *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = meson_dep1_finalize; } static void meson_dep1_init (MesonDep1 *self) { } /** * meson_dep1_just_return_it: * @dep: a #MesonDep2. * * Returns the #MesonDep2 that is passed in * * Returns: (transfer none): a #MesonDep2 */ MesonDep2* meson_dep1_just_return_it (MesonDep1 *self, MesonDep2 *dep) { g_return_val_if_fail (MESON_IS_DEP1 (self), NULL); return dep; } muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/gir/dep1/meson.build0000644000175000017500000000135414751453622025667 0ustar buildbuildsubdir('dep2') subdir('dep3') dep1sources = ['dep1.c', 'dep1.h'] # Do not need to link to dep2lib because we don't use any symbols from it dep1lib = shared_library('dep1lib', sources: dep1sources, dependencies: gobj, install: true) # But the gir does need it because it we use the MesonDep2* structure defined # in the header dep1gir = gnome.generate_gir( dep1lib, sources: dep1sources, nsversion: '1.0', namespace: 'MesonDep1', symbol_prefix: 'meson', identifier_prefix: 'Meson', header: 'dep1.h', includes: ['GObject-2.0', 'MesonDep2-1.0', dep3gir[0]], dependencies: [dep2_dep], install: true, ) dep1_dep = declare_dependency(link_with: dep1lib, dependencies: [dep2_dep, dep3_dep], sources: [dep1gir]) muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/gir/dep1/dep2/0002755000175000017500000000000014751453622024356 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/gir/dep1/dep2/meson.build0000644000175000017500000000066014751453622026520 0ustar buildbuilddep2sources = ['dep2.c', 'dep2.h'] dep2lib = shared_library('dep2lib', sources: dep2sources, dependencies: gobj, install: true) dep2gir = gnome.generate_gir( dep2lib, sources: dep2sources, nsversion: '1.0', namespace: 'MesonDep2', symbol_prefix: 'meson', identifier_prefix: 'Meson', includes: ['GObject-2.0'], install: true, ) dep2_dep = declare_dependency(link_with: dep2lib, sources: [dep2gir]) muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/gir/dep1/dep2/dep2.c0000644000175000017500000000515114751453622025354 0ustar buildbuild#include "dep2.h" struct _MesonDep2 { GObject parent_instance; gchar *msg; }; G_DEFINE_TYPE (MesonDep2, meson_dep2, G_TYPE_OBJECT) enum { PROP_0, PROP_MSG, LAST_PROP }; static GParamSpec *gParamSpecs [LAST_PROP]; /** * meson_dep2_new: * @msg: The message to set. * * Allocates a new #MesonDep2. * * Returns: (transfer full): a #MesonDep2. */ MesonDep2 * meson_dep2_new (const gchar *msg) { g_return_val_if_fail (msg != NULL, NULL); return g_object_new (MESON_TYPE_DEP2, "message", msg, NULL); } static void meson_dep2_finalize (GObject *object) { MesonDep2 *self = (MesonDep2 *)object; g_clear_pointer (&self->msg, g_free); G_OBJECT_CLASS (meson_dep2_parent_class)->finalize (object); } static void meson_dep2_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { MesonDep2 *self = MESON_DEP2 (object); switch (prop_id) { case PROP_MSG: g_value_set_string (value, self->msg); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void meson_dep2_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { MesonDep2 *self = MESON_DEP2 (object); switch (prop_id) { case PROP_MSG: self->msg = g_value_dup_string (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void meson_dep2_class_init (MesonDep2Class *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = meson_dep2_finalize; object_class->get_property = meson_dep2_get_property; object_class->set_property = meson_dep2_set_property; gParamSpecs [PROP_MSG] = g_param_spec_string ("message", "Message", "The message to print.", NULL, (G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); g_object_class_install_properties (object_class, LAST_PROP, gParamSpecs); } static void meson_dep2_init (MesonDep2 *self) { } /** * meson_dep2_return_message: * @self: a #MesonDep2. * * Returns the message. * * Returns: (transfer none): a const gchar* */ const gchar* meson_dep2_return_message (MesonDep2 *self) { g_return_val_if_fail (MESON_IS_DEP2 (self), NULL); return (const gchar*) self->msg; } muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/gir/dep1/dep2/dep2.h0000644000175000017500000000065514751453622025365 0ustar buildbuild#ifndef MESON_DEP2_H #define MESON_DEP2_H #if !defined (MESON_TEST_1) #error "MESON_TEST_1 not defined." #endif #include G_BEGIN_DECLS #define MESON_TYPE_DEP2 (meson_dep2_get_type()) G_DECLARE_FINAL_TYPE (MesonDep2, meson_dep2, MESON, DEP2, GObject) MesonDep2 *meson_dep2_new (const gchar *msg); const gchar *meson_dep2_return_message (MesonDep2 *self); G_END_DECLS #endif /* MESON_DEP2_H */ muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/gir/dep1/dep3/0002755000175000017500000000000014751453622024357 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/gir/dep1/dep3/dep3.h0000644000175000017500000000065514751453622025367 0ustar buildbuild#ifndef MESON_DEP3_H #define MESON_DEP3_H #if !defined (MESON_TEST_1) #error "MESON_TEST_1 not defined." #endif #include G_BEGIN_DECLS #define MESON_TYPE_DEP3 (meson_dep3_get_type()) G_DECLARE_FINAL_TYPE (MesonDep3, meson_dep3, MESON, DEP3, GObject) MesonDep3 *meson_dep3_new (const gchar *msg); const gchar *meson_dep3_return_message (MesonDep3 *self); G_END_DECLS #endif /* MESON_DEP3_H */ muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/gir/dep1/dep3/meson.build0000644000175000017500000000066014751453622026521 0ustar buildbuilddep3sources = ['dep3.c', 'dep3.h'] dep3lib = shared_library('dep3lib', sources: dep3sources, dependencies: gobj, install: true) dep3gir = gnome.generate_gir( dep3lib, sources: dep3sources, nsversion: '1.0', namespace: 'MesonDep3', symbol_prefix: 'meson', identifier_prefix: 'Meson', includes: ['GObject-2.0'], install: true, ) dep3_dep = declare_dependency(link_with: dep3lib, sources: [dep3gir]) muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/gir/dep1/dep3/dep3.c0000644000175000017500000000515114751453622025356 0ustar buildbuild#include "dep3.h" struct _MesonDep3 { GObject parent_instance; gchar *msg; }; G_DEFINE_TYPE (MesonDep3, meson_dep3, G_TYPE_OBJECT) enum { PROP_0, PROP_MSG, LAST_PROP }; static GParamSpec *gParamSpecs [LAST_PROP]; /** * meson_dep3_new: * @msg: The message to set. * * Allocates a new #MesonDep3. * * Returns: (transfer full): a #MesonDep3. */ MesonDep3 * meson_dep3_new (const gchar *msg) { g_return_val_if_fail (msg != NULL, NULL); return g_object_new (MESON_TYPE_DEP3, "message", msg, NULL); } static void meson_dep3_finalize (GObject *object) { MesonDep3 *self = (MesonDep3 *)object; g_clear_pointer (&self->msg, g_free); G_OBJECT_CLASS (meson_dep3_parent_class)->finalize (object); } static void meson_dep3_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { MesonDep3 *self = MESON_DEP3 (object); switch (prop_id) { case PROP_MSG: g_value_set_string (value, self->msg); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void meson_dep3_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { MesonDep3 *self = MESON_DEP3 (object); switch (prop_id) { case PROP_MSG: self->msg = g_value_dup_string (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void meson_dep3_class_init (MesonDep3Class *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = meson_dep3_finalize; object_class->get_property = meson_dep3_get_property; object_class->set_property = meson_dep3_set_property; gParamSpecs [PROP_MSG] = g_param_spec_string ("message", "Message", "The message to print.", NULL, (G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); g_object_class_install_properties (object_class, LAST_PROP, gParamSpecs); } static void meson_dep3_init (MesonDep3 *self) { } /** * meson_dep3_return_message: * @self: a #MesonDep3. * * Returns the message. * * Returns: (transfer none): a const gchar* */ const gchar* meson_dep3_return_message (MesonDep3 *self) { g_return_val_if_fail (MESON_IS_DEP3 (self), NULL); return (const gchar*) self->msg; } muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/gir/meson-sample2.h0000644000175000017500000000070214751453622025523 0ustar buildbuild#ifndef MESON_SAMPLE2_H #define MESON_SAMPLE2_H #if !defined (MESON_TEST_1) #error "MESON_TEST_1 not defined." #endif #include G_BEGIN_DECLS #define MESON_TYPE_SAMPLE2 (meson_sample2_get_type()) G_DECLARE_FINAL_TYPE (MesonSample2, meson_sample2, MESON, SAMPLE2, GObject) MesonSample2 *meson_sample2_new (void); void meson_sample2_print_message (MesonSample2 *self); G_END_DECLS #endif /* MESON_SAMPLE2_H */ muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/gir/meson.build0000644000175000017500000000325614751453622025041 0ustar buildbuildsubdir('dep1') libsources = ['meson-sample.c', 'meson-sample.h'] lib2sources = ['meson-sample2.c', 'meson-sample2.h'] gen_source = custom_target( 'meson_sample3.h', input: 'meson-sample.h', output: 'meson-sample3.h', command: [find_program('copy.py'), '@INPUT@', '@OUTPUT@'], build_by_default: false, # this will force a race condition if one exists ) girlib = shared_library( 'gir_lib', sources: libsources, c_args: '-DMESON_TEST_2', dependencies: [gobj, dep1_dep], install: true, ) girlib2 = shared_library('gir_lib2', sources: lib2sources, dependencies: [gobj], install: true) girexe = executable( 'girprog', sources: 'prog.c', c_args: '-DMESON_TEST_2', dependencies: [glib, gobj, gir, dep1_dep], link_with: girlib, ) fake_dep = dependency('no-way-this-exists', required: false) gnome.generate_gir( girlib, girlib2, sources: [libsources, lib2sources, gen_source], env: {'CPPFLAGS': '-DMESON_TEST_2'}, nsversion: '1.0', namespace: 'Meson', symbol_prefix: 'meson', identifier_prefix: 'Meson', includes: ['GObject-2.0', 'MesonDep1-1.0'], # dep1_dep pulls in dep2_dep for us dependencies: [[fake_dep, dep1_dep]], install: true, build_by_default: true, ) test('gobject introspection/c', girexe) gir_paths = ':'.join([girlib.outdir(), dep1lib.outdir(), dep2lib.outdir(), dep3lib.outdir()]) envdata = environment() envdata.append('GI_TYPELIB_PATH', gir_paths, separator: ':') envdata.append('LD_LIBRARY_PATH', gir_paths) if ['windows', 'cygwin'].contains(host_machine.system()) envdata.append('PATH', gir_paths) endif test('gobject introspection/py', find_program('prog.py'), env: envdata) muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/gir/meson-sample.c0000644000175000017500000000517214751453622025442 0ustar buildbuild#include "meson-sample.h" struct _MesonSample { GObject parent_instance; gchar *msg; }; G_DEFINE_TYPE (MesonSample, meson_sample, G_TYPE_OBJECT) enum { PROP_0, PROP_MSG, LAST_PROP }; static GParamSpec *gParamSpecs [LAST_PROP]; /** * meson_sample_new: * * Allocates a new #MesonSample. * * Returns: (transfer full): a #MesonSample. */ MesonSample * meson_sample_new (void) { return g_object_new (MESON_TYPE_SAMPLE, NULL); } static void meson_sample_finalize (GObject *object) { MesonSample *self = (MesonSample *)object; g_clear_pointer (&self->msg, g_free); G_OBJECT_CLASS (meson_sample_parent_class)->finalize (object); } static void meson_sample_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { MesonSample *self = MESON_SAMPLE (object); switch (prop_id) { case PROP_MSG: g_value_set_string (value, self->msg); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void meson_sample_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { MesonSample *self = MESON_SAMPLE (object); switch (prop_id) { case PROP_MSG: self->msg = g_value_dup_string (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void meson_sample_class_init (MesonSampleClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->finalize = meson_sample_finalize; object_class->get_property = meson_sample_get_property; object_class->set_property = meson_sample_set_property; gParamSpecs [PROP_MSG] = g_param_spec_string ("message", "Message", "The message to print.", NULL, (G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); g_object_class_install_properties (object_class, LAST_PROP, gParamSpecs); } static void meson_sample_init (MesonSample *self) { } /** * meson_sample_print_message: * @self: a #MesonSample. * * Prints the message. * * Returns: Nothing. */ void meson_sample_print_message (MesonSample *self, MesonDep1 *dep1, MesonDep2 *dep2) { MesonDep2 *samedep; g_return_if_fail (MESON_IS_SAMPLE (self)); samedep = meson_dep1_just_return_it (dep1, dep2); g_print ("Message: %s\n", meson_dep2_return_message (samedep)); } muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/gir/prog.c0000644000175000017500000000137714751453622024014 0ustar buildbuild#include #include "meson-sample.h" gint main (gint argc, gchar *argv[]) { GError * error = NULL; GOptionContext * ctx = g_option_context_new (NULL); g_option_context_add_group (ctx, g_irepository_get_option_group ()); if (!g_option_context_parse (ctx, &argc, &argv, &error)) { g_print ("sample: %s\n", error->message); g_option_context_free (ctx); if (error) { g_error_free (error); } return 1; } MesonSample * i = meson_sample_new (); MesonDep1 * dep1 = meson_dep1_new (); MesonDep2 * dep2 = meson_dep2_new ("Hello, meson/c!"); meson_sample_print_message (i, dep1, dep2); g_object_unref (i); g_object_unref (dep1); g_object_unref (dep2); g_option_context_free (ctx); return 0; } muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/resources-data/0002755000175000017500000000000014751453622025033 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/resources-data/subdir/0002755000175000017500000000000014751453622026323 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/resources-data/subdir/res2.txt0000644000175000017500000000004614751453622027735 0ustar buildbuildThis is a resource in a subdirectory. muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/resources-data/subdir/meson.build0000644000175000017500000000022314751453622030460 0ustar buildbuildcdata = configuration_data() cdata.set('NOISE', 'BARK') res4_txt = configure_file(input: 'res4.txt.in', output: 'res4.txt', configuration: cdata) muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/resources-data/subdir/res4.txt.in0000644000175000017500000000003014751453622030335 0ustar buildbuild@NOISE@ @NOISE@ @NOISE@ muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/resources-data/res3.txt.in0000644000175000017500000000007614751453622027056 0ustar buildbuildThis content is ignored, but Meson doesn't need to know that. muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/resources-data/meson.build0000644000175000017500000000100514751453622027167 0ustar buildbuildsubdir('subdir') python3 = import('python3').find_python() fake_generator_script = ''' import os, sys assert os.path.exists(sys.argv[1]), "File %s not found" % sys.argv[1] print("This is a generated resource.") ''' # Generate file res3.txt from file res3.txt.in. This is then included # in a GResource file, driven by resources/meson.build. res3_txt = custom_target( 'res3', input: 'res3.txt.in', output: 'res3.txt', command: [python3, '-c', fake_generator_script, '@INPUT@'], capture: true, ) muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/resources-data/res1.txt0000644000175000017500000000002414751453622026440 0ustar buildbuildThis is a resource. muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/gdbus/0002755000175000017500000000000014751453622023216 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/gdbus/data/0002755000175000017500000000000014751453622024127 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/gdbus/data/com.example.Sample.xml0000644000175000017500000000075214751453622030303 0ustar buildbuild muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/gdbus/gdbusprog.c0000644000175000017500000000025214751453622025353 0ustar buildbuild#include"generated-gdbus.h" int main(int argc, char **argv) { SampleComExample *s; s = sample_com_example_skeleton_new(); g_object_unref(s); return 0; } muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/gdbus/meson.build0000644000175000017500000000577514751453622025374 0ustar buildbuildgdbus_src = gnome.gdbus_codegen( 'generated-gdbus-no-docbook', 'data/com.example.Sample.xml', interface_prefix: 'com.example.', namespace: 'Sample', annotations: [['com.example.Hello()', 'org.freedesktop.DBus.Deprecated', 'true']], ) # check that empty annotations work gdbus_src2 = gnome.gdbus_codegen( 'generated-gdbus-no-docbook2', 'data/com.example.Sample.xml', interface_prefix: 'com.example.', namespace: 'Sample', annotations: [], ) assert(gdbus_src.length() == 2, 'expected 2 targets') assert(gdbus_src[0].full_path().endswith('.c'), 'expected 1 c source file') assert(gdbus_src[1].full_path().endswith('.h'), 'expected 1 c header file') sample_xml = configure_file( input: 'data/com.example.Sample.xml', output: 'com.example.Sample.xml', copy: true, ) gdbus_src = gnome.gdbus_codegen( 'generated-gdbus-no-docbook-files-posarg', sample_xml, interface_prefix: 'com.example.', namespace: 'Sample', annotations: [['com.example.Hello()', 'org.freedesktop.DBus.Deprecated', 'true']], ) assert(gdbus_src.length() == 2, 'expected 2 targets') assert(gdbus_src[0].full_path().endswith('.c'), 'expected 1 c source file') assert(gdbus_src[1].full_path().endswith('.h'), 'expected 1 c header file') gdbus_src = gnome.gdbus_codegen( 'generated-gdbus', sources: files('data/com.example.Sample.xml'), interface_prefix: 'com.example.', namespace: 'Sample', annotations: [ ['com.example.Hello()', 'org.freedesktop.DBus.Deprecated', 'true'], ['com.example.Bye()', 'org.freedesktop.DBus.Deprecated', 'true'], ], docbook: 'generated-gdbus-doc', install_header: true, install_dir: get_option('includedir'), ) assert(gdbus_src.length() == 3, 'expected 3 targets') assert(gdbus_src[0].full_path().endswith('.c'), 'expected 1 c source file') assert(gdbus_src[1].full_path().endswith('.h'), 'expected 1 c header file') if not pretend_glib_old and glib.version().version_compare('>=2.51.3') includes = [] else includes = include_directories('..') endif # check that custom targets work gdbus_xml_ct = custom_target( 'built xml sources for gdbus', output: 'com.example.SampleCustomTarget.xml', input: 'data/com.example.Sample.xml', command: [copyfile, '@INPUT@', '@OUTPUT@'], ) gdbus_src_ct = gnome.gdbus_codegen( 'generated-gdbus-customtarget-src', gdbus_xml_ct, interface_prefix: 'com.example.', namespace: 'Sample', annotations: [], ) gdbus_src_cti = gnome.gdbus_codegen( 'generated-gdbus-customtargetindex-src', gdbus_xml_ct[0], interface_prefix: 'com.example.', namespace: 'Sample', annotations: [], ) gdbus_src_gen = gnome.gdbus_codegen( 'generated-gdbus-generator-src', copyfile_gen.process('data/com.example.Sample.xml'), interface_prefix: 'com.example.', namespace: 'Sample', annotations: [], ) gdbus_exe = executable( 'gdbus-test', 'gdbusprog.c', gdbus_src, include_directories: includes, dependencies: giounix, ) test('gdbus', gdbus_exe) muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/copyfile.py0000644000175000017500000000013014751453622024266 0ustar buildbuild#!/usr/bin/env python3 import sys import shutil shutil.copy(sys.argv[1], sys.argv[2]) muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/schemas/0002755000175000017500000000000014751453622023535 5ustar buildbuildmuon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/schemas/com.github.meson.gschema.xml0000644000175000017500000000052314751453622031042 0ustar buildbuild "Hello" A greeting Sample text to test schema compilation muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/schemas/schemaprog.c0000644000175000017500000000242014751453622026025 0ustar buildbuild#include #include #include int main(int argc, char **argv) { GSettingsSchemaSource *src; GSettingsSchema *schema; GSettings *settings; GVariant *value; GError *error = NULL; src = g_settings_schema_source_new_from_directory("schemas", g_settings_schema_source_get_default(), TRUE, &error); if(error) { fprintf(stderr, "Fail: %s\n", error->message); g_error_free(error); return 1; } schema = g_settings_schema_source_lookup(src, "com.github.meson", FALSE); if(!schema) { fprintf(stderr, "Could not get schema from source.\n"); return 2; } settings = g_settings_new_full(schema, NULL, NULL); if(!settings) { fprintf(stderr, "Could not get settings object.\n"); return 3; } value = g_settings_get_value(settings, "greeting"); if(!value) { fprintf(stderr, "Could not get value from settings.\n"); return 4; } if(strcmp("Hello", g_variant_get_string(value, NULL)) != 0) { fprintf(stderr, "Value of setting is incorrect.\n"); return 5; } g_variant_unref(value); g_object_unref(settings); g_settings_schema_unref(schema); g_settings_schema_source_unref(src); return 0; } muon-v0.4.0/subprojects/meson-tests/frameworks/7 gnome/schemas/meson.build0000644000175000017500000000036514751453622025701 0ustar buildbuildcompiled = gnome.compile_schemas(build_by_default: true) install_data('com.github.meson.gschema.xml', install_dir: 'share/glib-2.0/schemas') schemaexe = executable('schemaprog', 'schemaprog.c', dependencies: gio) test('schema test', schemaexe) muon-v0.4.0/subprojects/glad.wrap0000644000175000017500000000035614753102770016016 0ustar buildbuild; SPDX-FileCopyrightText: Stone Tickle ; SPDX-License-Identifier: GPL-3.0-only [wrap-git] url = https://git.sr.ht/~lattis/glad revision = a0a82e90b0a5efcdaf3010f7128c4540924c8479 depth = 1 [provide] glad = glad_dep muon-v0.4.0/subprojects/bestline/0002755000175000017500000000000014753102770016017 5ustar buildbuildmuon-v0.4.0/subprojects/bestline/bestline.h0000644000175000017500000000261014753102770017772 0ustar buildbuild#pragma once typedef struct bestlineCompletions { unsigned long len; char **cvec; } bestlineCompletions; typedef void (bestlineCompletionCallback)(const char *, bestlineCompletions *); typedef char *(bestlineHintsCallback)(const char *, const char **, const char **); typedef void (bestlineFreeHintsCallback)(void *); typedef unsigned (bestlineXlatCallback)(unsigned); void bestlineSetCompletionCallback(bestlineCompletionCallback *); void bestlineSetHintsCallback(bestlineHintsCallback *); void bestlineSetFreeHintsCallback(bestlineFreeHintsCallback *); void bestlineAddCompletion(bestlineCompletions *, const char *); void bestlineSetXlatCallback(bestlineXlatCallback *); char *bestline(const char *); char *bestlineRaw(const char *, int, int); char *bestlineWithHistory(const char *, const char *); int bestlineHistoryAdd(const char *); int bestlineHistorySave(const char *); int bestlineHistoryLoad(const char *); void bestlineFreeCompletions(bestlineCompletions *); void bestlineHistoryFree(void); void bestlineClearScreen(int); void bestlineMaskModeEnable(void); void bestlineMaskModeDisable(void); void bestlineDisableRawMode(void); void bestlineFree(void *); char bestlineIsSeparator(unsigned); char bestlineNotSeparator(unsigned); char bestlineIsXeparator(unsigned); unsigned bestlineUppercase(unsigned); unsigned bestlineLowercase(unsigned); long bestlineReadCharacter(int, char *, unsigned long); muon-v0.4.0/subprojects/bestline/README.md0000644000175000017500000002132414753102770017276 0ustar buildbuild# Bestline Library for interactive pseudoteletypewriter command sessions using ANSI Standard X3.64 control sequences ![Bestline Demo Video GIF](bestline.gif) ## Overview This is a single-file no-dependencies C or C++ library that makes it as easy as possible to display a command prompt that asks the user for input. It supports Emacs editing shortcuts, history search, completion / hint callback, and utf-8 editing under a bsd-2 license. Bestline is a fork of linenoise (a popular readline alternative) that fixes its bugs and adds the missing features while reducing binary footprint (surprisingly) by removing bloated dependencies, which means you can finally have a permissively-licensed command prompt w/ a 38kb footprint that's nearly as good as gnu readline. ``` $ CC="cc -s -static -Os -DNDEBUG" make $ ls -hal bestline_example -rwxr-xr-x 1 jart jart 38K Sep 19 21:41 bestline_example ``` # Example This example will save history to `~/.foo_history`. It's 50kb when statically linked with Cosmopolitan Libc. ```c #include #include "bestline.h" main() { char *line; while ((line = bestlineWithHistory("IN> ", "foo"))) { fputs("OUT> ", stdout); fputs(line, stdout); fputs("\n", stdout); free(line); } } ``` ## Shortcuts ``` CTRL-E END CTRL-A START CTRL-B BACK CTRL-F FORWARD CTRL-L CLEAR CTRL-H BACKSPACE CTRL-D DELETE CTRL-Y YANK CTRL-D EOF (IF EMPTY) CTRL-N NEXT HISTORY CTRL-P PREVIOUS HISTORY CTRL-R SEARCH HISTORY CTRL-G CANCEL SEARCH ALT-< BEGINNING OF HISTORY ALT-> END OF HISTORY ALT-F FORWARD WORD ALT-B BACKWARD WORD CTRL-ALT-F FORWARD EXPR CTRL-ALT-B BACKWARD EXPR ALT-RIGHT FORWARD EXPR ALT-LEFT BACKWARD EXPR CTRL-K KILL LINE FORWARDS CTRL-U KILL LINE BACKWARDS ALT-H KILL WORD BACKWARDS CTRL-W KILL WORD BACKWARDS CTRL-ALT-H KILL WORD BACKWARDS ALT-D KILL WORD FORWARDS ALT-Y ROTATE KILL RING AND YANK AGAIN ALT-\ SQUEEZE ADJACENT WHITESPACE CTRL-T TRANSPOSE ALT-T TRANSPOSE WORD ALT-U UPPERCASE WORD ALT-L LOWERCASE WORD ALT-C CAPITALIZE WORD CTRL-C INTERRUPT PROCESS CTRL-Z SUSPEND PROCESS CTRL-\ QUIT PROCESS CTRL-S PAUSE OUTPUT CTRL-Q UNPAUSE OUTPUT (IF PAUSED) CTRL-Q ESCAPED INSERT CTRL-SPACE SET MARK CTRL-X CTRL-X GOTO MARK CTRL-Z SUSPEND PROCESS ``` ### ProTip Remap CAPS LOCK to CTRL. ## Requirements You have to use an ANSI UTF-8 terminal that supports VT100 codes. ## Changes Here's what we've changed compared to [linenoise](https://github.com/antirez/linenoise/): - Remove bell - Add kill ring - Fix flickering - Add UTF-8 editing - Add CTRL-R search - React to terminal resizing - Don't generate .data section - Support terminal flow control - Make history loading 10x faster - Make multiline mode the only mode - Support unlimited input line length - Accommodate O_NONBLOCK file descriptors - Restore raw mode on process foregrounding - Make source code compatible with C++ compilers - Fix corruption issues by using generalized parsing - Implement nearly all GNU readline editing shortcuts - Remove heavyweight dependencies like printf/sprintf - Remove ISIG→^C→EAGAIN hack and catch signals properly - Support running on Windows in MinTTY or CMD.EXE on Win10+ - Support diacritics, русский, Ελληνικά, 漢字, 仮名, 한글 ## Readability This codebase aims to follow in Antirez's tradition of writing beautiful programs, that solve extremely difficult technical problems in the most elegant way possible. The original Linenoise source code is sort of like an old Delorean where it's simple and beautiful, but has a lot of things broken about it that need to be fixed, which gives you plenty of reasons to sit down and fix things to fully appreciate its beauty. There are, however, some differences in style. Antirez generally optimizes for fewer lines of code even if it makes the binary footprint larger and with poor edge case handling and cultural biases presumably to preserve its accessibility and value as an educational tool. For example, one of the biggest issues with Linenoise, was that pressing the wrong key on the keyboard would mess with the state and garble input since it didn't actually parse ansi codes or even multibyte characters. While this project has addressed many of Linenoise's shortcomings, we've sought to do it in a way that carries on the Antirez tradition of simple elegant hackable code. It is our hope that should you find opportunities for improvement in this codebase that you'll find it equally pleasurable to work with. ## Portability Bestline is written in portable ANSI C99 that conforms to POSIX. We recommend using Cosmopolitan Libc since it produces binaries that work on any operating system including Windows. Portability across terminals is achieved because literally everything these days supports VT100 control codes which were standardized by ANSI back in the 1970's. This library ignores platform-specific norms for multibyte encoding and it also ignores antiquated terminal capability databases. Libraries like ncurses were designed to reduce bandwidth on 300 bit per second modems. They're bloated and huge because they needed to implement workarounds to all the "incompatible by design" engineering practices used by terminal platforms in the 70's in 80's. Corporate America has long since moved on to making GUI platforms incompatible instead. Even the Windows command prompt supports VT100 and XTERM sequences these days. Seriously. It's 2021 and everyone in the world finally agrees on UTF-8 and ANSI VT100 style command sequences. That's why bestline is now, for the first time in history, able to offer you a fully featured experience using simple bloat-free code. ## Contributing We'd love to accept your pull requests! Please send an email beforehand to Justine Tunney saying that you intend to assign her the copyright to the changes you contribute to bestline. Please do not contribute changes that have `#ifdef` statements. We don't care if MSVC printed a warning, and we won't accept Windows torture code since Windows compatibility can be abstracted by Cosmopolitan Libc which does C on Windows better than Windows does considering how there's about ten different incompatible libc implementations, provided by the Windows platform, and they have a history of doing things like adding telemetry. ## License Bestline is released under the 2-clause BSD license. You have the freedom to copy the Bestline source code into your codebase, but you have to keep the license notice at the top of the file. You also have the freedom to distribute your app as a closed-source binary, but you have to embed the copyright notice in the executable. We've added an `.ident` assembly directive to the top of the source code file which should automatically take care of binary notice compliance. ``` The BSD-2 License Copyright 2018-2021 Justine Tunney Copyright 2010-2016 Salvatore Sanfilippo Copyright 2010-2013 Pieter Noordhuis All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ``` ## Donations Please consider tipping the author at since she needs your support in order to keep going building cool tools and libraries that serve the public interest. So if you like what you've seen and want to encourage more, please consider granting recognition. muon-v0.4.0/subprojects/bestline/meson.build0000644000175000017500000000030514753102770020155 0ustar buildbuildproject('bestline', 'c') meson.override_dependency( 'bestline', declare_dependency( include_directories: '.', link_with: static_library('bestline', 'bestline.c'), ), ) muon-v0.4.0/subprojects/bestline/bestline.c0000644000175000017500000041153414753102770017776 0ustar buildbuild/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:4;tab-width:8;coding:utf-8 -*-│ │vi: set net ft=c ts=4 sts=4 sw=4 fenc=utf-8 :vi│ ╞══════════════════════════════════════════════════════════════════════════════╡ │ │ │ Bestline ── Library for interactive pseudoteletypewriter command │ │ sessions using ANSI Standard X3.64 control sequences │ │ │ │ OVERVIEW │ │ │ │ Bestline is a fork of linenoise (a popular readline alternative) │ │ that fixes its bugs and adds the missing features while reducing │ │ binary footprint (surprisingly) by removing bloated dependencies │ │ which means you can finally have a permissively-licensed command │ │ prompt w/ a 30kb footprint that's nearly as good as gnu readline │ │ │ │ EXAMPLE │ │ │ │ main() { │ │ char *line; │ │ while ((line = bestlineWithHistory("IN> ", "foo"))) { │ │ fputs("OUT> ", stdout); │ │ fputs(line, stdout); │ │ fputs("\n", stdout); │ │ free(line); │ │ } │ │ } │ │ │ │ CHANGES │ │ │ │ - Remove bell │ │ - Add kill ring │ │ - Fix flickering │ │ - Add UTF-8 editing │ │ - Add CTRL-R search │ │ - Support unlimited lines │ │ - Add parentheses awareness │ │ - React to terminal resizing │ │ - Don't generate .data section │ │ - Support terminal flow control │ │ - Make history loading 10x faster │ │ - Make multiline mode the only mode │ │ - Accommodate O_NONBLOCK file descriptors │ │ - Restore raw mode on process foregrounding │ │ - Make source code compatible with C++ compilers │ │ - Fix corruption issues by using generalized parsing │ │ - Implement nearly all GNU readline editing shortcuts │ │ - Remove heavyweight dependencies like printf/sprintf │ │ - Remove ISIG→^C→EAGAIN hack and use ephemeral handlers │ │ - Support running on Windows in MinTTY or CMD.EXE on Win10+ │ │ - Support diacratics, русский, Ελληνικά, 中国人, 日本語, 한국인 │ │ │ │ SHORTCUTS │ │ │ │ CTRL-E END │ │ CTRL-A START │ │ CTRL-B BACK │ │ CTRL-F FORWARD │ │ CTRL-L CLEAR │ │ CTRL-H BACKSPACE │ │ CTRL-D DELETE │ │ CTRL-Y YANK │ │ CTRL-D EOF (IF EMPTY) │ │ CTRL-N NEXT HISTORY │ │ CTRL-P PREVIOUS HISTORY │ │ CTRL-R SEARCH HISTORY │ │ CTRL-G CANCEL SEARCH │ │ ALT-< BEGINNING OF HISTORY │ │ ALT-> END OF HISTORY │ │ ALT-F FORWARD WORD │ │ ALT-B BACKWARD WORD │ │ CTRL-ALT-F FORWARD EXPR │ │ CTRL-ALT-B BACKWARD EXPR │ │ ALT-RIGHT FORWARD EXPR │ │ ALT-LEFT BACKWARD EXPR │ │ ALT-SHIFT-B BARF EXPR │ │ ALT-SHIFT-S SLURP EXPR │ │ ALT-SHIFT-R RAISE EXPR │ │ CTRL-K KILL LINE FORWARDS │ │ CTRL-U KILL LINE BACKWARDS │ │ ALT-H KILL WORD BACKWARDS │ │ CTRL-W KILL WORD BACKWARDS │ │ CTRL-ALT-H KILL WORD BACKWARDS │ │ ALT-D KILL WORD FORWARDS │ │ ALT-Y ROTATE KILL RING AND YANK AGAIN │ │ ALT-\ SQUEEZE ADJACENT WHITESPACE │ │ CTRL-T TRANSPOSE │ │ ALT-T TRANSPOSE WORD │ │ ALT-U UPPERCASE WORD │ │ ALT-L LOWERCASE WORD │ │ ALT-C CAPITALIZE WORD │ │ CTRL-Z SUSPEND PROCESS │ │ CTRL-\ QUIT PROCESS │ │ CTRL-S PAUSE OUTPUT │ │ CTRL-Q UNPAUSE OUTPUT (IF PAUSED) │ │ CTRL-Q ESCAPED INSERT │ │ CTRL-SPACE SET MARK │ │ CTRL-X CTRL-X GOTO MARK │ │ PROTIP REMAP CAPS LOCK TO CTRL │ │ │ ╞══════════════════════════════════════════════════════════════════════════════╡ │ │ │ Copyright 2018-2021 Justine Tunney │ │ Copyright 2010-2016 Salvatore Sanfilippo │ │ Copyright 2010-2013 Pieter Noordhuis │ │ │ │ All rights reserved. │ │ │ │ Redistribution and use in source and binary forms, with or without │ │ modification, are permitted provided that the following conditions are │ │ met: │ │ │ │ * Redistributions of source code must retain the above copyright │ │ notice, this list of conditions and the following disclaimer. │ │ │ │ * Redistributions in binary form must reproduce the above copyright │ │ notice, this list of conditions and the following disclaimer in the │ │ documentation and/or other materials provided with the distribution. │ │ │ │ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS │ │ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT │ │ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR │ │ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT │ │ HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, │ │ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT │ │ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, │ │ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY │ │ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT │ │ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE │ │ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. │ │ │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "bestline.h" #ifndef __COSMOPOLITAN__ #define _POSIX_C_SOURCE 1 /* so GCC builds in ANSI mode */ #define _XOPEN_SOURCE 700 /* so GCC builds in ANSI mode */ #define _DARWIN_C_SOURCE 1 /* so SIGWINCH / IUTF8 on XNU */ #ifdef __sun #define __EXTENSIONS__ /* for struct winsize on Solaris */ #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef SIGWINCH #define SIGWINCH 28 /* GNU/Systemd + XNU + FreeBSD + NetBSD + OpenBSD */ #endif #ifndef IUTF8 #define IUTF8 0 #endif #endif __asm__(".ident\t\"\\n\\n\ Bestline (BSD-2)\\n\ Copyright 2018-2020 Justine Tunney \\n\ Copyright 2010-2016 Salvatore Sanfilippo \\n\ Copyright 2010-2013 Pieter Noordhuis \""); #ifndef BESTLINE_MAX_RING #define BESTLINE_MAX_RING 8 #endif #ifndef BESTLINE_MAX_HISTORY #define BESTLINE_MAX_HISTORY 1024 #endif #define BESTLINE_HISTORY_FIRST +BESTLINE_MAX_HISTORY #define BESTLINE_HISTORY_PREV +1 #define BESTLINE_HISTORY_NEXT -1 #define BESTLINE_HISTORY_LAST -BESTLINE_MAX_HISTORY #define Ctrl(C) ((C) ^ 0100) #define Min(X, Y) ((Y) > (X) ? (X) : (Y)) #define Max(X, Y) ((Y) < (X) ? (X) : (Y)) #define Case(X, Y) case X: Y; break #define Read16le(X) \ ((255 & (X)[0]) << 000 | \ (255 & (X)[1]) << 010) #define Read32le(X) \ ((unsigned)(255 & (X)[0]) << 000 | \ (unsigned)(255 & (X)[1]) << 010 | \ (unsigned)(255 & (X)[2]) << 020 | \ (unsigned)(255 & (X)[3]) << 030) struct abuf { char *b; unsigned len; unsigned cap; }; struct rune { unsigned c; unsigned n; }; struct bestlineRing { unsigned i; char *p[BESTLINE_MAX_RING]; }; /* The bestlineState structure represents the state during line editing. * We pass this state to functions implementing specific editing * functionalities. */ struct bestlineState { int ifd; /* terminal stdin file descriptor */ int ofd; /* terminal stdout file descriptor */ struct winsize ws; /* rows and columns in terminal */ char *buf; /* edited line buffer */ const char *prompt; /* prompt to display */ int hindex; /* history index */ int rows; /* rows being used */ int oldpos; /* previous refresh cursor position */ unsigned buflen; /* edited line buffer size */ unsigned pos; /* current buffer index */ unsigned len; /* current edited line length */ unsigned mark; /* saved cursor position */ unsigned yi, yj; /* boundaries of last yank */ char seq[2][16]; /* keystroke history for yanking code */ char final; /* set to true on last update */ char dirty; /* if an update was squashed */ }; static const char *const kUnsupported[] = {"dumb","cons25","emacs"}; static int gotint; static int gotcont; static int gotwinch; static signed char rawmode; static char maskmode; static char ispaused; static char iscapital; static unsigned historylen; static struct bestlineRing ring; static struct sigaction orig_cont; static struct sigaction orig_winch; static struct termios orig_termios; static char *history[BESTLINE_MAX_HISTORY]; static bestlineXlatCallback *xlatCallback; static bestlineHintsCallback *hintsCallback; static bestlineFreeHintsCallback *freeHintsCallback; static bestlineCompletionCallback *completionCallback; static void bestlineAtExit(void); static void bestlineRefreshLine(struct bestlineState *); static void bestlineOnInt(int sig) { gotint = sig; } static void bestlineOnCont(int sig) { gotcont = sig; } static void bestlineOnWinch(int sig) { gotwinch = sig; } static char IsControl(unsigned c) { return c <= 0x1F || (0x7F <= c && c <= 0x9F); } static int GetMonospaceCharacterWidth(unsigned c) { return !IsControl(c) + (c >= 0x1100 && (c <= 0x115f || c == 0x2329 || c == 0x232a || (c >= 0x2e80 && c <= 0xa4cf && c != 0x303f) || (c >= 0xac00 && c <= 0xd7a3) || (c >= 0xf900 && c <= 0xfaff) || (c >= 0xfe10 && c <= 0xfe19) || (c >= 0xfe30 && c <= 0xfe6f) || (c >= 0xff00 && c <= 0xff60) || (c >= 0xffe0 && c <= 0xffe6) || (c >= 0x20000 && c <= 0x2fffd) || (c >= 0x30000 && c <= 0x3fffd))); } /** * Returns nonzero if 𝑐 isn't alphanumeric. * * Line reading interfaces generally define this operation as UNICODE * characters that aren't in the letter category (Lu, Ll, Lt, Lm, Lo) * and aren't in the number categorie (Nd, Nl, No). We also add a few * other things like blocks and emoji (So). */ char bestlineIsSeparator(unsigned c) { int m, l, r, n; if (c < 0200) { return !(('0' <= c && c <= '9') || ('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z')); } if (c <= 0xffff) { static const unsigned short kGlyphs[][2] = { {0x00aa, 0x00aa}, /* 1x English */ {0x00b2, 0x00b3}, /* 2x English Arabic */ {0x00b5, 0x00b5}, /* 1x Greek */ {0x00b9, 0x00ba}, /* 2x English Arabic */ {0x00bc, 0x00be}, /* 3x Vulgar English Arabic */ {0x00c0, 0x00d6}, /* 23x Watin */ {0x00d8, 0x00f6}, /* 31x Watin */ {0x0100, 0x02c1}, /* 450x Watin-AB,IPA,Spacemod */ {0x02c6, 0x02d1}, /* 12x Spacemod */ {0x02e0, 0x02e4}, /* 5x Spacemod */ {0x02ec, 0x02ec}, /* 1x Spacemod */ {0x02ee, 0x02ee}, /* 1x Spacemod */ {0x0370, 0x0374}, /* 5x Greek */ {0x0376, 0x0377}, /* 2x Greek */ {0x037a, 0x037d}, /* 4x Greek */ {0x037f, 0x037f}, /* 1x Greek */ {0x0386, 0x0386}, /* 1x Greek */ {0x0388, 0x038a}, /* 3x Greek */ {0x038c, 0x038c}, /* 1x Greek */ {0x038e, 0x03a1}, /* 20x Greek */ {0x03a3, 0x03f5}, /* 83x Greek */ {0x03f7, 0x0481}, /* 139x Greek */ {0x048a, 0x052f}, /* 166x Cyrillic */ {0x0531, 0x0556}, /* 38x Armenian */ {0x0560, 0x0588}, /* 41x Armenian */ {0x05d0, 0x05ea}, /* 27x Hebrew */ {0x0620, 0x064a}, /* 43x Arabic */ {0x0660, 0x0669}, /* 10x Arabic */ {0x0671, 0x06d3}, /* 99x Arabic */ {0x06ee, 0x06fc}, /* 15x Arabic */ {0x0712, 0x072f}, /* 30x Syriac */ {0x074d, 0x07a5}, /* 89x Syriac,Arabic2,Thaana */ {0x07c0, 0x07ea}, /* 43x NKo */ {0x0800, 0x0815}, /* 22x Samaritan */ {0x0840, 0x0858}, /* 25x Mandaic */ {0x0904, 0x0939}, /* 54x Devanagari */ {0x0993, 0x09a8}, /* 22x Bengali */ {0x09e6, 0x09f1}, /* 12x Bengali */ {0x0a13, 0x0a28}, /* 22x Gurmukhi */ {0x0a66, 0x0a6f}, /* 10x Gurmukhi */ {0x0a93, 0x0aa8}, /* 22x Gujarati */ {0x0b13, 0x0b28}, /* 22x Oriya */ {0x0c92, 0x0ca8}, /* 23x Kannada */ {0x0caa, 0x0cb3}, /* 10x Kannada */ {0x0ce6, 0x0cef}, /* 10x Kannada */ {0x0d12, 0x0d3a}, /* 41x Malayalam */ {0x0d85, 0x0d96}, /* 18x Sinhala */ {0x0d9a, 0x0db1}, /* 24x Sinhala */ {0x0de6, 0x0def}, /* 10x Sinhala */ {0x0e01, 0x0e30}, /* 48x Thai */ {0x0e8c, 0x0ea3}, /* 24x Lao */ {0x0f20, 0x0f33}, /* 20x Tibetan */ {0x0f49, 0x0f6c}, /* 36x Tibetan */ {0x109e, 0x10c5}, /* 40x Myanmar,Georgian */ {0x10d0, 0x10fa}, /* 43x Georgian */ {0x10fc, 0x1248}, /* 333x Georgian,Hangul,Ethiopic */ {0x13a0, 0x13f5}, /* 86x Cherokee */ {0x1401, 0x166d}, /* 621x Aboriginal */ {0x16a0, 0x16ea}, /* 75x Runic */ {0x1700, 0x170c}, /* 13x Tagalog */ {0x1780, 0x17b3}, /* 52x Khmer */ {0x1820, 0x1878}, /* 89x Mongolian */ {0x1a00, 0x1a16}, /* 23x Buginese */ {0x1a20, 0x1a54}, /* 53x Tai Tham */ {0x1a80, 0x1a89}, /* 10x Tai Tham */ {0x1a90, 0x1a99}, /* 10x Tai Tham */ {0x1b05, 0x1b33}, /* 47x Balinese */ {0x1b50, 0x1b59}, /* 10x Balinese */ {0x1b83, 0x1ba0}, /* 30x Sundanese */ {0x1bae, 0x1be5}, /* 56x Sundanese */ {0x1c90, 0x1cba}, /* 43x Georgian2 */ {0x1cbd, 0x1cbf}, /* 3x Georgian2 */ {0x1e00, 0x1f15}, /* 278x Watin-C,Greek2 */ {0x2070, 0x2071}, /* 2x Supersub */ {0x2074, 0x2079}, /* 6x Supersub */ {0x207f, 0x2089}, /* 11x Supersub */ {0x2090, 0x209c}, /* 13x Supersub */ {0x2100, 0x2117}, /* 24x Letterlike */ {0x2119, 0x213f}, /* 39x Letterlike */ {0x2145, 0x214a}, /* 6x Letterlike */ {0x214c, 0x218b}, /* 64x Letterlike,Numbery */ {0x21af, 0x21cd}, /* 31x Arrows */ {0x21d5, 0x21f3}, /* 31x Arrows */ {0x230c, 0x231f}, /* 20x Technical */ {0x232b, 0x237b}, /* 81x Technical */ {0x237d, 0x239a}, /* 30x Technical */ {0x23b4, 0x23db}, /* 40x Technical */ {0x23e2, 0x2426}, /* 69x Technical,ControlPictures */ {0x2460, 0x25b6}, /* 343x Enclosed,Boxes,Blocks,Shapes */ {0x25c2, 0x25f7}, /* 54x Shapes */ {0x2600, 0x266e}, /* 111x Symbols */ {0x2670, 0x2767}, /* 248x Symbols,Dingbats */ {0x2776, 0x27bf}, /* 74x Dingbats */ {0x2800, 0x28ff}, /* 256x Braille */ {0x2c00, 0x2c2e}, /* 47x Glagolitic */ {0x2c30, 0x2c5e}, /* 47x Glagolitic */ {0x2c60, 0x2ce4}, /* 133x Watin-D */ {0x2d00, 0x2d25}, /* 38x Georgian2 */ {0x2d30, 0x2d67}, /* 56x Tifinagh */ {0x2d80, 0x2d96}, /* 23x Ethiopic2 */ {0x2e2f, 0x2e2f}, /* 1x Punctuation2 */ {0x3005, 0x3007}, /* 3x CJK Symbols & Punctuation */ {0x3021, 0x3029}, /* 9x CJK Symbols & Punctuation */ {0x3031, 0x3035}, /* 5x CJK Symbols & Punctuation */ {0x3038, 0x303c}, /* 5x CJK Symbols & Punctuation */ {0x3041, 0x3096}, /* 86x Hiragana */ {0x30a1, 0x30fa}, /* 90x Katakana */ {0x3105, 0x312f}, /* 43x Bopomofo */ {0x3131, 0x318e}, /* 94x Hangul Compatibility Jamo */ {0x31a0, 0x31ba}, /* 27x Bopomofo Extended */ {0x31f0, 0x31ff}, /* 16x Katakana Phonetic Extensions */ {0x3220, 0x3229}, /* 10x Enclosed CJK Letters & Months */ {0x3248, 0x324f}, /* 8x Enclosed CJK Letters & Months */ {0x3251, 0x325f}, /* 15x Enclosed CJK Letters & Months */ {0x3280, 0x3289}, /* 10x Enclosed CJK Letters & Months */ {0x32b1, 0x32bf}, /* 15x Enclosed CJK Letters & Months */ {0x3400, 0x4db5}, /* 6582x CJK Unified Ideographs Extension A */ {0x4dc0, 0x9fef}, /* 21040x Yijing Hexagram, CJK Unified Ideographs */ {0xa000, 0xa48c}, /* 1165x Yi Syllables */ {0xa4d0, 0xa4fd}, /* 46x Lisu */ {0xa500, 0xa60c}, /* 269x Vai */ {0xa610, 0xa62b}, /* 28x Vai */ {0xa6a0, 0xa6ef}, /* 80x Bamum */ {0xa80c, 0xa822}, /* 23x Syloti Nagri */ {0xa840, 0xa873}, /* 52x Phags-pa */ {0xa882, 0xa8b3}, /* 50x Saurashtra */ {0xa8d0, 0xa8d9}, /* 10x Saurashtra */ {0xa900, 0xa925}, /* 38x Kayah Li */ {0xa930, 0xa946}, /* 23x Rejang */ {0xa960, 0xa97c}, /* 29x Hangul Jamo Extended-A */ {0xa984, 0xa9b2}, /* 47x Javanese */ {0xa9cf, 0xa9d9}, /* 11x Javanese */ {0xaa00, 0xaa28}, /* 41x Cham */ {0xaa50, 0xaa59}, /* 10x Cham */ {0xabf0, 0xabf9}, /* 10x Meetei Mayek */ {0xac00, 0xd7a3}, /* 11172x Hangul Syllables */ {0xf900, 0xfa6d}, /* 366x CJK Compatibility Ideographs */ {0xfa70, 0xfad9}, /* 106x CJK Compatibility Ideographs */ {0xfb1f, 0xfb28}, /* 10x Alphabetic Presentation Forms */ {0xfb2a, 0xfb36}, /* 13x Alphabetic Presentation Forms */ {0xfb46, 0xfbb1}, /* 108x Alphabetic Presentation Forms */ {0xfbd3, 0xfd3d}, /* 363x Arabic Presentation Forms-A */ {0xfe76, 0xfefc}, /* 135x Arabic Presentation Forms-B */ {0xff10, 0xff19}, /* 10x Dubs */ {0xff21, 0xff3a}, /* 26x Dubs */ {0xff41, 0xff5a}, /* 26x Dubs */ {0xff66, 0xffbe}, /* 89x Dubs */ {0xffc2, 0xffc7}, /* 6x Dubs */ {0xffca, 0xffcf}, /* 6x Dubs */ {0xffd2, 0xffd7}, /* 6x Dubs */ {0xffda, 0xffdc}, /* 3x Dubs */ }; l = 0; r = n = sizeof(kGlyphs) / sizeof(kGlyphs[0]); while (l < r) { m = (l + r) >> 1; if (kGlyphs[m][1] < c) { l = m + 1; } else { r = m; } } return !(l < n && kGlyphs[l][0] <= c && c <= kGlyphs[l][1]); } else { static const unsigned kAstralGlyphs[][2] = { {0x10107, 0x10133}, /* 45x Aegean */ {0x10140, 0x10178}, /* 57x Ancient Greek Numbers */ {0x1018a, 0x1018b}, /* 2x Ancient Greek Numbers */ {0x10280, 0x1029c}, /* 29x Lycian */ {0x102a0, 0x102d0}, /* 49x Carian */ {0x102e1, 0x102fb}, /* 27x Coptic Epact Numbers */ {0x10300, 0x10323}, /* 36x Old Italic */ {0x1032d, 0x1034a}, /* 30x Old Italic, Gothic */ {0x10350, 0x10375}, /* 38x Old Permic */ {0x10380, 0x1039d}, /* 30x Ugaritic */ {0x103a0, 0x103c3}, /* 36x Old Persian */ {0x103c8, 0x103cf}, /* 8x Old Persian */ {0x103d1, 0x103d5}, /* 5x Old Persian */ {0x10400, 0x1049d}, /* 158x Deseret, Shavian, Osmanya */ {0x104b0, 0x104d3}, /* 36x Osage */ {0x104d8, 0x104fb}, /* 36x Osage */ {0x10500, 0x10527}, /* 40x Elbasan */ {0x10530, 0x10563}, /* 52x Caucasian Albanian */ {0x10600, 0x10736}, /* 311x Linear A */ {0x10800, 0x10805}, /* 6x Cypriot Syllabary */ {0x1080a, 0x10835}, /* 44x Cypriot Syllabary */ {0x10837, 0x10838}, /* 2x Cypriot Syllabary */ {0x1083f, 0x1089e}, /* 86x Cypriot,ImperialAramaic,Palmyrene,Nabataean */ {0x108e0, 0x108f2}, /* 19x Hatran */ {0x108f4, 0x108f5}, /* 2x Hatran */ {0x108fb, 0x1091b}, /* 33x Hatran */ {0x10920, 0x10939}, /* 26x Lydian */ {0x10980, 0x109b7}, /* 56x Meroitic Hieroglyphs */ {0x109bc, 0x109cf}, /* 20x Meroitic Cursive */ {0x109d2, 0x10a00}, /* 47x Meroitic Cursive */ {0x10a10, 0x10a13}, /* 4x Kharoshthi */ {0x10a15, 0x10a17}, /* 3x Kharoshthi */ {0x10a19, 0x10a35}, /* 29x Kharoshthi */ {0x10a40, 0x10a48}, /* 9x Kharoshthi */ {0x10a60, 0x10a7e}, /* 31x Old South Arabian */ {0x10a80, 0x10a9f}, /* 32x Old North Arabian */ {0x10ac0, 0x10ac7}, /* 8x Manichaean */ {0x10ac9, 0x10ae4}, /* 28x Manichaean */ {0x10aeb, 0x10aef}, /* 5x Manichaean */ {0x10b00, 0x10b35}, /* 54x Avestan */ {0x10b40, 0x10b55}, /* 22x Inscriptional Parthian */ {0x10b58, 0x10b72}, /* 27x Inscriptional Parthian and Pahlavi */ {0x10b78, 0x10b91}, /* 26x Inscriptional Pahlavi, Psalter Pahlavi */ {0x10c00, 0x10c48}, /* 73x Old Turkic */ {0x10c80, 0x10cb2}, /* 51x Old Hungarian */ {0x10cc0, 0x10cf2}, /* 51x Old Hungarian */ {0x10cfa, 0x10d23}, /* 42x Old Hungarian, Hanifi Rohingya */ {0x10d30, 0x10d39}, /* 10x Hanifi Rohingya */ {0x10e60, 0x10e7e}, /* 31x Rumi Numeral Symbols */ {0x10f00, 0x10f27}, /* 40x Old Sogdian */ {0x10f30, 0x10f45}, /* 22x Sogdian */ {0x10f51, 0x10f54}, /* 4x Sogdian */ {0x10fe0, 0x10ff6}, /* 23x Elymaic */ {0x11003, 0x11037}, /* 53x Brahmi */ {0x11052, 0x1106f}, /* 30x Brahmi */ {0x11083, 0x110af}, /* 45x Kaithi */ {0x110d0, 0x110e8}, /* 25x Sora Sompeng */ {0x110f0, 0x110f9}, /* 10x Sora Sompeng */ {0x11103, 0x11126}, /* 36x Chakma */ {0x11136, 0x1113f}, /* 10x Chakma */ {0x11144, 0x11144}, /* 1x Chakma */ {0x11150, 0x11172}, /* 35x Mahajani */ {0x11176, 0x11176}, /* 1x Mahajani */ {0x11183, 0x111b2}, /* 48x Sharada */ {0x111c1, 0x111c4}, /* 4x Sharada */ {0x111d0, 0x111da}, /* 11x Sharada */ {0x111dc, 0x111dc}, /* 1x Sharada */ {0x111e1, 0x111f4}, /* 20x Sinhala Archaic Numbers */ {0x11200, 0x11211}, /* 18x Khojki */ {0x11213, 0x1122b}, /* 25x Khojki */ {0x11280, 0x11286}, /* 7x Multani */ {0x11288, 0x11288}, /* 1x Multani */ {0x1128a, 0x1128d}, /* 4x Multani */ {0x1128f, 0x1129d}, /* 15x Multani */ {0x1129f, 0x112a8}, /* 10x Multani */ {0x112b0, 0x112de}, /* 47x Khudawadi */ {0x112f0, 0x112f9}, /* 10x Khudawadi */ {0x11305, 0x1130c}, /* 8x Grantha */ {0x1130f, 0x11310}, /* 2x Grantha */ {0x11313, 0x11328}, /* 22x Grantha */ {0x1132a, 0x11330}, /* 7x Grantha */ {0x11332, 0x11333}, /* 2x Grantha */ {0x11335, 0x11339}, /* 5x Grantha */ {0x1133d, 0x1133d}, /* 1x Grantha */ {0x11350, 0x11350}, /* 1x Grantha */ {0x1135d, 0x11361}, /* 5x Grantha */ {0x11400, 0x11434}, /* 53x Newa */ {0x11447, 0x1144a}, /* 4x Newa */ {0x11450, 0x11459}, /* 10x Newa */ {0x1145f, 0x1145f}, /* 1x Newa */ {0x11480, 0x114af}, /* 48x Tirhuta */ {0x114c4, 0x114c5}, /* 2x Tirhuta */ {0x114c7, 0x114c7}, /* 1x Tirhuta */ {0x114d0, 0x114d9}, /* 10x Tirhuta */ {0x11580, 0x115ae}, /* 47x Siddham */ {0x115d8, 0x115db}, /* 4x Siddham */ {0x11600, 0x1162f}, /* 48x Modi */ {0x11644, 0x11644}, /* 1x Modi */ {0x11650, 0x11659}, /* 10x Modi */ {0x11680, 0x116aa}, /* 43x Takri */ {0x116b8, 0x116b8}, /* 1x Takri */ {0x116c0, 0x116c9}, /* 10x Takri */ {0x11700, 0x1171a}, /* 27x Ahom */ {0x11730, 0x1173b}, /* 12x Ahom */ {0x11800, 0x1182b}, /* 44x Dogra */ {0x118a0, 0x118f2}, /* 83x Warang Citi */ {0x118ff, 0x118ff}, /* 1x Warang Citi */ {0x119a0, 0x119a7}, /* 8x Nandinagari */ {0x119aa, 0x119d0}, /* 39x Nandinagari */ {0x119e1, 0x119e1}, /* 1x Nandinagari */ {0x119e3, 0x119e3}, /* 1x Nandinagari */ {0x11a00, 0x11a00}, /* 1x Zanabazar Square */ {0x11a0b, 0x11a32}, /* 40x Zanabazar Square */ {0x11a3a, 0x11a3a}, /* 1x Zanabazar Square */ {0x11a50, 0x11a50}, /* 1x Soyombo */ {0x11a5c, 0x11a89}, /* 46x Soyombo */ {0x11a9d, 0x11a9d}, /* 1x Soyombo */ {0x11ac0, 0x11af8}, /* 57x Pau Cin Hau */ {0x11c00, 0x11c08}, /* 9x Bhaiksuki */ {0x11c0a, 0x11c2e}, /* 37x Bhaiksuki */ {0x11c40, 0x11c40}, /* 1x Bhaiksuki */ {0x11c50, 0x11c6c}, /* 29x Bhaiksuki */ {0x11c72, 0x11c8f}, /* 30x Marchen */ {0x11d00, 0x11d06}, /* 7x Masaram Gondi */ {0x11d08, 0x11d09}, /* 2x Masaram Gondi */ {0x11d0b, 0x11d30}, /* 38x Masaram Gondi */ {0x11d46, 0x11d46}, /* 1x Masaram Gondi */ {0x11d50, 0x11d59}, /* 10x Masaram Gondi */ {0x11d60, 0x11d65}, /* 6x Gunjala Gondi */ {0x11d67, 0x11d68}, /* 2x Gunjala Gondi */ {0x11d6a, 0x11d89}, /* 32x Gunjala Gondi */ {0x11d98, 0x11d98}, /* 1x Gunjala Gondi */ {0x11da0, 0x11da9}, /* 10x Gunjala Gondi */ {0x11ee0, 0x11ef2}, /* 19x Makasar */ {0x11fc0, 0x11fd4}, /* 21x Tamil Supplement */ {0x12000, 0x12399}, /* 922x Cuneiform */ {0x12400, 0x1246e}, /* 111x Cuneiform Numbers & Punctuation */ {0x12480, 0x12543}, /* 196x Early Dynastic Cuneiform */ {0x13000, 0x1342e}, /* 1071x Egyptian Hieroglyphs */ {0x14400, 0x14646}, /* 583x Anatolian Hieroglyphs */ {0x16800, 0x16a38}, /* 569x Bamum Supplement */ {0x16a40, 0x16a5e}, /* 31x Mro */ {0x16a60, 0x16a69}, /* 10x Mro */ {0x16ad0, 0x16aed}, /* 30x Bassa Vah */ {0x16b00, 0x16b2f}, /* 48x Pahawh Hmong */ {0x16b40, 0x16b43}, /* 4x Pahawh Hmong */ {0x16b50, 0x16b59}, /* 10x Pahawh Hmong */ {0x16b5b, 0x16b61}, /* 7x Pahawh Hmong */ {0x16b63, 0x16b77}, /* 21x Pahawh Hmong */ {0x16b7d, 0x16b8f}, /* 19x Pahawh Hmong */ {0x16e40, 0x16e96}, /* 87x Medefaidrin */ {0x16f00, 0x16f4a}, /* 75x Miao */ {0x16f50, 0x16f50}, /* 1x Miao */ {0x16f93, 0x16f9f}, /* 13x Miao */ {0x16fe0, 0x16fe1}, /* 2x Ideographic Symbols & Punctuation */ {0x16fe3, 0x16fe3}, /* 1x Ideographic Symbols & Punctuation */ {0x17000, 0x187f7}, /* 6136x Tangut */ {0x18800, 0x18af2}, /* 755x Tangut Components */ {0x1b000, 0x1b11e}, /* 287x Kana Supplement */ {0x1b150, 0x1b152}, /* 3x Small Kana Extension */ {0x1b164, 0x1b167}, /* 4x Small Kana Extension */ {0x1b170, 0x1b2fb}, /* 396x Nushu */ {0x1bc00, 0x1bc6a}, /* 107x Duployan */ {0x1bc70, 0x1bc7c}, /* 13x Duployan */ {0x1bc80, 0x1bc88}, /* 9x Duployan */ {0x1bc90, 0x1bc99}, /* 10x Duployan */ {0x1d2e0, 0x1d2f3}, /* 20x Mayan Numerals */ {0x1d360, 0x1d378}, /* 25x Counting Rod Numerals */ {0x1d400, 0x1d454}, /* 85x 𝐀..𝑔 Math */ {0x1d456, 0x1d49c}, /* 71x 𝑖..𝒜 Math */ {0x1d49e, 0x1d49f}, /* 2x 𝒞..𝒟 Math */ {0x1d4a2, 0x1d4a2}, /* 1x 𝒢..𝒢 Math */ {0x1d4a5, 0x1d4a6}, /* 2x 𝒥..𝒦 Math */ {0x1d4a9, 0x1d4ac}, /* 4x 𝒩..𝒬 Math */ {0x1d4ae, 0x1d4b9}, /* 12x 𝒮..𝒹 Math */ {0x1d4bb, 0x1d4bb}, /* 1x 𝒻..𝒻 Math */ {0x1d4bd, 0x1d4c3}, /* 7x 𝒽..𝓃 Math */ {0x1d4c5, 0x1d505}, /* 65x 𝓅..𝔅 Math */ {0x1d507, 0x1d50a}, /* 4x 𝔇..𝔊 Math */ {0x1d50d, 0x1d514}, /* 8x 𝔍..𝔔 Math */ {0x1d516, 0x1d51c}, /* 7x 𝔖..𝔜 Math */ {0x1d51e, 0x1d539}, /* 28x 𝔞..𝔹 Math */ {0x1d53b, 0x1d53e}, /* 4x 𝔻..𝔾 Math */ {0x1d540, 0x1d544}, /* 5x 𝕀..𝕄 Math */ {0x1d546, 0x1d546}, /* 1x 𝕆..𝕆 Math */ {0x1d54a, 0x1d550}, /* 7x 𝕊..𝕐 Math */ {0x1d552, 0x1d6a5}, /* 340x 𝕒..𝚥 Math */ {0x1d6a8, 0x1d6c0}, /* 25x 𝚨..𝛀 Math */ {0x1d6c2, 0x1d6da}, /* 25x 𝛂..𝛚 Math */ {0x1d6dc, 0x1d6fa}, /* 31x 𝛜..𝛺 Math */ {0x1d6fc, 0x1d714}, /* 25x 𝛼..𝜔 Math */ {0x1d716, 0x1d734}, /* 31x 𝜖..𝜴 Math */ {0x1d736, 0x1d74e}, /* 25x 𝜶..𝝎 Math */ {0x1d750, 0x1d76e}, /* 31x 𝝐..𝝮 Math */ {0x1d770, 0x1d788}, /* 25x 𝝰..𝞈 Math */ {0x1d78a, 0x1d7a8}, /* 31x 𝞊..𝞨 Math */ {0x1d7aa, 0x1d7c2}, /* 25x 𝞪..𝟂 Math */ {0x1d7c4, 0x1d7cb}, /* 8x 𝟄..𝟋 Math */ {0x1d7ce, 0x1d9ff}, /* 562x Math, Sutton SignWriting */ {0x1f100, 0x1f10c}, /* 13x Enclosed Alphanumeric Supplement */ {0x20000, 0x2a6d6}, /* 42711x CJK Unified Ideographs Extension B */ {0x2a700, 0x2b734}, /* 4149x CJK Unified Ideographs Extension C */ {0x2b740, 0x2b81d}, /* 222x CJK Unified Ideographs Extension D */ {0x2b820, 0x2cea1}, /* 5762x CJK Unified Ideographs Extension E */ {0x2ceb0, 0x2ebe0}, /* 7473x CJK Unified Ideographs Extension F */ {0x2f800, 0x2fa1d}, /* 542x CJK Compatibility Ideographs Supplement */ }; l = 0; r = n = sizeof(kAstralGlyphs) / sizeof(kAstralGlyphs[0]); while (l < r) { m = (l + r) >> 1; if (kAstralGlyphs[m][1] < c) { l = m + 1; } else { r = m; } } return !(l < n && kAstralGlyphs[l][0] <= c && c <= kAstralGlyphs[l][1]); } } unsigned bestlineLowercase(unsigned c) { int m, l, r, n; if (c < 0200) { if ('A' <= c && c <= 'Z') { return c + 32; } else { return c; } } else if (c <= 0xffff) { if ((0x0100 <= c && c <= 0x0176) || /* 60x Ā..ā → ā..ŵ Watin-A */ (0x01de <= c && c <= 0x01ee) || /* 9x Ǟ..Ǯ → ǟ..ǯ Watin-B */ (0x01f8 <= c && c <= 0x021e) || /* 20x Ǹ..Ȟ → ǹ..ȟ Watin-B */ (0x0222 <= c && c <= 0x0232) || /* 9x Ȣ..Ȳ → ȣ..ȳ Watin-B */ (0x1e00 <= c && c <= 0x1eff)) { /*256x Ḁ..Ỿ → ḁ..ỿ Watin-C */ if (c == 0x0130) return c - 199; if (c == 0x1e9e) return c; return c + (~c & 1); } else if (0x01cf <= c && c <= 0x01db) { return c + (c & 1); /* 7x Ǐ..Ǜ → ǐ..ǜ Watin-B */ } else if (0x13a0 <= c && c <= 0x13ef) { return c + 38864; /* 80x Ꭰ ..Ꮿ → ꭰ ..ꮿ Cherokee */ } else { static const struct { unsigned short a; unsigned short b; short d; } kLower[] = { {0x00c0, 0x00d6, +32}, /* 23x À ..Ö → à ..ö Watin */ {0x00d8, 0x00de, +32}, /* 7x Ø ..Þ → ø ..þ Watin */ {0x0178, 0x0178, -121}, /* 1x Ÿ ..Ÿ → ÿ ..ÿ Watin-A */ {0x0179, 0x0179, +1}, /* 1x Ź ..Ź → ź ..ź Watin-A */ {0x017b, 0x017b, +1}, /* 1x Ż ..Ż → ż ..ż Watin-A */ {0x017d, 0x017d, +1}, /* 1x Ž ..Ž → ž ..ž Watin-A */ {0x0181, 0x0181, +210}, /* 1x Ɓ ..Ɓ → ɓ ..ɓ Watin-B */ {0x0182, 0x0182, +1}, /* 1x Ƃ ..Ƃ → ƃ ..ƃ Watin-B */ {0x0184, 0x0184, +1}, /* 1x Ƅ ..Ƅ → ƅ ..ƅ Watin-B */ {0x0186, 0x0186, +206}, /* 1x Ɔ ..Ɔ → ɔ ..ɔ Watin-B */ {0x0187, 0x0187, +1}, /* 1x Ƈ ..Ƈ → ƈ ..ƈ Watin-B */ {0x0189, 0x018a, +205}, /* 2x Ɖ ..Ɗ → ɖ ..ɗ Watin-B */ {0x018b, 0x018b, +1}, /* 1x Ƌ ..Ƌ → ƌ ..ƌ Watin-B */ {0x018e, 0x018e, +79}, /* 1x Ǝ ..Ǝ → ǝ ..ǝ Watin-B */ {0x018f, 0x018f, +202}, /* 1x Ə ..Ə → ə ..ə Watin-B */ {0x0190, 0x0190, +203}, /* 1x Ɛ ..Ɛ → ɛ ..ɛ Watin-B */ {0x0191, 0x0191, +1}, /* 1x Ƒ ..Ƒ → ƒ ..ƒ Watin-B */ {0x0193, 0x0193, +205}, /* 1x Ɠ ..Ɠ → ɠ ..ɠ Watin-B */ {0x0194, 0x0194, +207}, /* 1x Ɣ ..Ɣ → ɣ ..ɣ Watin-B */ {0x0196, 0x0196, +211}, /* 1x Ɩ ..Ɩ → ɩ ..ɩ Watin-B */ {0x0197, 0x0197, +209}, /* 1x Ɨ ..Ɨ → ɨ ..ɨ Watin-B */ {0x0198, 0x0198, +1}, /* 1x Ƙ ..Ƙ → ƙ ..ƙ Watin-B */ {0x019c, 0x019c, +211}, /* 1x Ɯ ..Ɯ → ɯ ..ɯ Watin-B */ {0x019d, 0x019d, +213}, /* 1x Ɲ ..Ɲ → ɲ ..ɲ Watin-B */ {0x019f, 0x019f, +214}, /* 1x Ɵ ..Ɵ → ɵ ..ɵ Watin-B */ {0x01a0, 0x01a0, +1}, /* 1x Ơ ..Ơ → ơ ..ơ Watin-B */ {0x01a2, 0x01a2, +1}, /* 1x Ƣ ..Ƣ → ƣ ..ƣ Watin-B */ {0x01a4, 0x01a4, +1}, /* 1x Ƥ ..Ƥ → ƥ ..ƥ Watin-B */ {0x01a6, 0x01a6, +218}, /* 1x Ʀ ..Ʀ → ʀ ..ʀ Watin-B */ {0x01a7, 0x01a7, +1}, /* 1x Ƨ ..Ƨ → ƨ ..ƨ Watin-B */ {0x01a9, 0x01a9, +218}, /* 1x Ʃ ..Ʃ → ʃ ..ʃ Watin-B */ {0x01ac, 0x01ac, +1}, /* 1x Ƭ ..Ƭ → ƭ ..ƭ Watin-B */ {0x01ae, 0x01ae, +218}, /* 1x Ʈ ..Ʈ → ʈ ..ʈ Watin-B */ {0x01af, 0x01af, +1}, /* 1x Ư ..Ư → ư ..ư Watin-B */ {0x01b1, 0x01b2, +217}, /* 2x Ʊ ..Ʋ → ʊ ..ʋ Watin-B */ {0x01b3, 0x01b3, +1}, /* 1x Ƴ ..Ƴ → ƴ ..ƴ Watin-B */ {0x01b5, 0x01b5, +1}, /* 1x Ƶ ..Ƶ → ƶ ..ƶ Watin-B */ {0x01b7, 0x01b7, +219}, /* 1x Ʒ ..Ʒ → ʒ ..ʒ Watin-B */ {0x01b8, 0x01b8, +1}, /* 1x Ƹ ..Ƹ → ƹ ..ƹ Watin-B */ {0x01bc, 0x01bc, +1}, /* 1x Ƽ ..Ƽ → ƽ ..ƽ Watin-B */ {0x01c4, 0x01c4, +2}, /* 1x DŽ ..DŽ → dž ..dž Watin-B */ {0x01c5, 0x01c5, +1}, /* 1x Dž ..Dž → dž ..dž Watin-B */ {0x01c7, 0x01c7, +2}, /* 1x LJ ..LJ → lj ..lj Watin-B */ {0x01c8, 0x01c8, +1}, /* 1x Lj ..Lj → lj ..lj Watin-B */ {0x01ca, 0x01ca, +2}, /* 1x NJ ..NJ → nj ..nj Watin-B */ {0x01cb, 0x01cb, +1}, /* 1x Nj ..Nj → nj ..nj Watin-B */ {0x01cd, 0x01cd, +1}, /* 1x Ǎ ..Ǎ → ǎ ..ǎ Watin-B */ {0x01f1, 0x01f1, +2}, /* 1x DZ ..DZ → dz ..dz Watin-B */ {0x01f2, 0x01f2, +1}, /* 1x Dz ..Dz → dz ..dz Watin-B */ {0x01f4, 0x01f4, +1}, /* 1x Ǵ ..Ǵ → ǵ ..ǵ Watin-B */ {0x01f6, 0x01f6, -97}, /* 1x Ƕ ..Ƕ → ƕ ..ƕ Watin-B */ {0x01f7, 0x01f7, -56}, /* 1x Ƿ ..Ƿ → ƿ ..ƿ Watin-B */ {0x0220, 0x0220, -130}, /* 1x Ƞ ..Ƞ → ƞ ..ƞ Watin-B */ {0x023b, 0x023b, +1}, /* 1x Ȼ ..Ȼ → ȼ ..ȼ Watin-B */ {0x023d, 0x023d, -163}, /* 1x Ƚ ..Ƚ → ƚ ..ƚ Watin-B */ {0x0241, 0x0241, +1}, /* 1x Ɂ ..Ɂ → ɂ ..ɂ Watin-B */ {0x0243, 0x0243, -195}, /* 1x Ƀ ..Ƀ → ƀ ..ƀ Watin-B */ {0x0244, 0x0244, +69}, /* 1x Ʉ ..Ʉ → ʉ ..ʉ Watin-B */ {0x0245, 0x0245, +71}, /* 1x Ʌ ..Ʌ → ʌ ..ʌ Watin-B */ {0x0246, 0x0246, +1}, /* 1x Ɇ ..Ɇ → ɇ ..ɇ Watin-B */ {0x0248, 0x0248, +1}, /* 1x Ɉ ..Ɉ → ɉ ..ɉ Watin-B */ {0x024a, 0x024a, +1}, /* 1x Ɋ ..Ɋ → ɋ ..ɋ Watin-B */ {0x024c, 0x024c, +1}, /* 1x Ɍ ..Ɍ → ɍ ..ɍ Watin-B */ {0x024e, 0x024e, +1}, /* 1x Ɏ ..Ɏ → ɏ ..ɏ Watin-B */ {0x0386, 0x0386, +38}, /* 1x Ά ..Ά → ά ..ά Greek */ {0x0388, 0x038a, +37}, /* 3x Έ ..Ί → έ ..ί Greek */ {0x038c, 0x038c, +64}, /* 1x Ό ..Ό → ό ..ό Greek */ {0x038e, 0x038f, +63}, /* 2x Ύ ..Ώ → ύ ..ώ Greek */ {0x0391, 0x03a1, +32}, /* 17x Α ..Ρ → α ..ρ Greek */ {0x03a3, 0x03ab, +32}, /* 9x Σ ..Ϋ → σ ..ϋ Greek */ {0x03dc, 0x03dc, +1}, /* 1x Ϝ ..Ϝ → ϝ ..ϝ Greek */ {0x03f4, 0x03f4, -60}, /* 1x ϴ ..ϴ → θ ..θ Greek */ {0x0400, 0x040f, +80}, /* 16x Ѐ ..Џ → ѐ ..џ Cyrillic */ {0x0410, 0x042f, +32}, /* 32x А ..Я → а ..я Cyrillic */ {0x0460, 0x0460, +1}, /* 1x Ѡ ..Ѡ → ѡ ..ѡ Cyrillic */ {0x0462, 0x0462, +1}, /* 1x Ѣ ..Ѣ → ѣ ..ѣ Cyrillic */ {0x0464, 0x0464, +1}, /* 1x Ѥ ..Ѥ → ѥ ..ѥ Cyrillic */ {0x0472, 0x0472, +1}, /* 1x Ѳ ..Ѳ → ѳ ..ѳ Cyrillic */ {0x0490, 0x0490, +1}, /* 1x Ґ ..Ґ → ґ ..ґ Cyrillic */ {0x0498, 0x0498, +1}, /* 1x Ҙ ..Ҙ → ҙ ..ҙ Cyrillic */ {0x049a, 0x049a, +1}, /* 1x Қ ..Қ → қ ..қ Cyrillic */ {0x0531, 0x0556, +48}, /* 38x Ա ..Ֆ → ա ..ֆ Armenian */ {0x10a0, 0x10c5, +7264}, /* 38x Ⴀ ..Ⴥ → ⴀ ..ⴥ Georgian */ {0x10c7, 0x10c7, +7264}, /* 1x Ⴧ ..Ⴧ → ⴧ ..ⴧ Georgian */ {0x10cd, 0x10cd, +7264}, /* 1x Ⴭ ..Ⴭ → ⴭ ..ⴭ Georgian */ {0x13f0, 0x13f5, +8}, /* 6x Ᏸ ..Ᏽ → ᏸ ..ᏽ Cherokee */ {0x1c90, 0x1cba, -3008}, /* 43x Ა ..Ჺ → ა ..ჺ Georgian2 */ {0x1cbd, 0x1cbf, -3008}, /* 3x Ჽ ..Ჿ → ჽ ..ჿ Georgian2 */ {0x1f08, 0x1f0f, -8}, /* 8x Ἀ ..Ἇ → ἀ ..ἇ Greek2 */ {0x1f18, 0x1f1d, -8}, /* 6x Ἐ ..Ἕ → ἐ ..ἕ Greek2 */ {0x1f28, 0x1f2f, -8}, /* 8x Ἠ ..Ἧ → ἠ ..ἧ Greek2 */ {0x1f38, 0x1f3f, -8}, /* 8x Ἰ ..Ἷ → ἰ ..ἷ Greek2 */ {0x1f48, 0x1f4d, -8}, /* 6x Ὀ ..Ὅ → ὀ ..ὅ Greek2 */ {0x1f59, 0x1f59, -8}, /* 1x Ὑ ..Ὑ → ὑ ..ὑ Greek2 */ {0x1f5b, 0x1f5b, -8}, /* 1x Ὓ ..Ὓ → ὓ ..ὓ Greek2 */ {0x1f5d, 0x1f5d, -8}, /* 1x Ὕ ..Ὕ → ὕ ..ὕ Greek2 */ {0x1f5f, 0x1f5f, -8}, /* 1x Ὗ ..Ὗ → ὗ ..ὗ Greek2 */ {0x1f68, 0x1f6f, -8}, /* 8x Ὠ ..Ὧ → ὠ ..ὧ Greek2 */ {0x1f88, 0x1f8f, -8}, /* 8x ᾈ ..ᾏ → ᾀ ..ᾇ Greek2 */ {0x1f98, 0x1f9f, -8}, /* 8x ᾘ ..ᾟ → ᾐ ..ᾗ Greek2 */ {0x1fa8, 0x1faf, -8}, /* 8x ᾨ ..ᾯ → ᾠ ..ᾧ Greek2 */ {0x1fb8, 0x1fb9, -8}, /* 2x Ᾰ ..Ᾱ → ᾰ ..ᾱ Greek2 */ {0x1fba, 0x1fbb, -74}, /* 2x Ὰ ..Ά → ὰ ..ά Greek2 */ {0x1fbc, 0x1fbc, -9}, /* 1x ᾼ ..ᾼ → ᾳ ..ᾳ Greek2 */ {0x1fc8, 0x1fcb, -86}, /* 4x Ὲ ..Ή → ὲ ..ή Greek2 */ {0x1fcc, 0x1fcc, -9}, /* 1x ῌ ..ῌ → ῃ ..ῃ Greek2 */ {0x1fd8, 0x1fd9, -8}, /* 2x Ῐ ..Ῑ → ῐ ..ῑ Greek2 */ {0x1fda, 0x1fdb, -100}, /* 2x Ὶ ..Ί → ὶ ..ί Greek2 */ {0x1fe8, 0x1fe9, -8}, /* 2x Ῠ ..Ῡ → ῠ ..ῡ Greek2 */ {0x1fea, 0x1feb, -112}, /* 2x Ὺ ..Ύ → ὺ ..ύ Greek2 */ {0x1fec, 0x1fec, -7}, /* 1x Ῥ ..Ῥ → ῥ ..ῥ Greek2 */ {0x1ff8, 0x1ff9, -128}, /* 2x Ὸ ..Ό → ὸ ..ό Greek2 */ {0x1ffa, 0x1ffb, -126}, /* 2x Ὼ ..Ώ → ὼ ..ώ Greek2 */ {0x1ffc, 0x1ffc, -9}, /* 1x ῼ ..ῼ → ῳ ..ῳ Greek2 */ {0x2126, 0x2126, -7517}, /* 1x Ω ..Ω → ω ..ω Letterlike */ {0x212a, 0x212a, -8383}, /* 1x K ..K → k ..k Letterlike */ {0x212b, 0x212b, -8262}, /* 1x Å ..Å → å ..å Letterlike */ {0x2132, 0x2132, +28}, /* 1x Ⅎ ..Ⅎ → ⅎ ..ⅎ Letterlike */ {0x2160, 0x216f, +16}, /* 16x Ⅰ ..Ⅿ → ⅰ ..ⅿ Numbery */ {0x2183, 0x2183, +1}, /* 1x Ↄ ..Ↄ → ↄ ..ↄ Numbery */ {0x24b6, 0x24cf, +26}, /* 26x Ⓐ ..Ⓩ → ⓐ ..ⓩ Enclosed */ {0x2c00, 0x2c2e, +48}, /* 47x Ⰰ ..Ⱞ → ⰰ ..ⱞ Glagolitic */ {0xff21, 0xff3a, +32}, /* 26x A..Z → a..z Dubs */ }; l = 0; r = n = sizeof(kLower) / sizeof(kLower[0]); while (l < r) { m = (l + r) >> 1; if (kLower[m].b < c) { l = m + 1; } else { r = m; } } if (l < n && kLower[l].a <= c && c <= kLower[l].b) { return c + kLower[l].d; } else { return c; } } } else { static struct { unsigned a; unsigned b; short d; } kAstralLower[] = { {0x10400, 0x10427, +40}, /* 40x 𐐀 ..𐐧 → 𐐨 ..𐑏 Deseret */ {0x104b0, 0x104d3, +40}, /* 36x 𐒰 ..𐓓 → 𐓘 ..𐓻 Osage */ {0x1d400, 0x1d419, +26}, /* 26x 𝐀 ..𝐙 → 𝐚 ..𝐳 Math */ {0x1d43c, 0x1d44d, +26}, /* 18x 𝐼 ..𝑍 → 𝑖 ..𝑧 Math */ {0x1d468, 0x1d481, +26}, /* 26x 𝑨 ..𝒁 → 𝒂 ..𝒛 Math */ {0x1d4ae, 0x1d4b5, +26}, /* 8x 𝒮 ..𝒵 → 𝓈 ..𝓏 Math */ {0x1d4d0, 0x1d4e9, +26}, /* 26x 𝓐 ..𝓩 → 𝓪 ..𝔃 Math */ {0x1d50d, 0x1d514, +26}, /* 8x 𝔍 ..𝔔 → 𝔧 ..𝔮 Math */ {0x1d56c, 0x1d585, +26}, /* 26x 𝕬 ..𝖅 → 𝖆 ..𝖟 Math */ {0x1d5a0, 0x1d5b9, +26}, /* 26x 𝖠 ..𝖹 → 𝖺 ..𝗓 Math */ {0x1d5d4, 0x1d5ed, +26}, /* 26x 𝗔 ..𝗭 → 𝗮 ..𝘇 Math */ {0x1d608, 0x1d621, +26}, /* 26x 𝘈 ..𝘡 → 𝘢 ..𝘻 Math */ {0x1d63c, 0x1d655, -442}, /* 26x 𝘼 ..𝙕 → 𝒂 ..𝒛 Math */ {0x1d670, 0x1d689, +26}, /* 26x 𝙰 ..𝚉 → 𝚊 ..𝚣 Math */ {0x1d6a8, 0x1d6b8, +26}, /* 17x 𝚨 ..𝚸 → 𝛂 ..𝛒 Math */ {0x1d6e2, 0x1d6f2, +26}, /* 17x 𝛢 ..𝛲 → 𝛼 ..𝜌 Math */ {0x1d71c, 0x1d72c, +26}, /* 17x 𝜜 ..𝜬 → 𝜶 ..𝝆 Math */ {0x1d756, 0x1d766, +26}, /* 17x 𝝖 ..𝝦 → 𝝰 ..𝞀 Math */ {0x1d790, 0x1d7a0, -90}, /* 17x 𝞐 ..𝞠 → 𝜶 ..𝝆 Math */ }; l = 0; r = n = sizeof(kAstralLower) / sizeof(kAstralLower[0]); while (l < r) { m = (l + r) >> 1; if (kAstralLower[m].b < c) { l = m + 1; } else { r = m; } } if (l < n && kAstralLower[l].a <= c && c <= kAstralLower[l].b) { return c + kAstralLower[l].d; } else { return c; } } } unsigned bestlineUppercase(unsigned c) { int m, l, r, n; if (c < 0200) { if ('a' <= c && c <= 'z') { return c - 32; } else { return c; } } else if (c <= 0xffff) { if ((0x0101 <= c && c <= 0x0177) || /* 60x ā..ŵ → Ā..ā Watin-A */ (0x01df <= c && c <= 0x01ef) || /* 9x ǟ..ǯ → Ǟ..Ǯ Watin-B */ (0x01f8 <= c && c <= 0x021e) || /* 20x ǹ..ȟ → Ǹ..Ȟ Watin-B */ (0x0222 <= c && c <= 0x0232) || /* 9x ȣ..ȳ → Ȣ..Ȳ Watin-B */ (0x1e01 <= c && c <= 0x1eff)) { /*256x ḁ..ỿ → Ḁ..Ỿ Watin-C */ if (c == 0x0131) return c + 232; if (c == 0x1e9e) return c; return c - (c & 1); } else if (0x01d0 <= c && c <= 0x01dc) { return c - (~c & 1); /* 7x ǐ..ǜ → Ǐ..Ǜ Watin-B */ } else if (0xab70 <= c && c <= 0xabbf) { return c - 38864; /* 80x ꭰ ..ꮿ → Ꭰ ..Ꮿ Cherokee Supplement */ } else { static const struct { unsigned short a; unsigned short b; short d; } kUpper[] = { {0x00b5, 0x00b5, +743}, /* 1x µ ..µ → Μ ..Μ Watin */ {0x00e0, 0x00f6, -32}, /* 23x à ..ö → À ..Ö Watin */ {0x00f8, 0x00fe, -32}, /* 7x ø ..þ → Ø ..Þ Watin */ {0x00ff, 0x00ff, +121}, /* 1x ÿ ..ÿ → Ÿ ..Ÿ Watin */ {0x017a, 0x017a, -1}, /* 1x ź ..ź → Ź ..Ź Watin-A */ {0x017c, 0x017c, -1}, /* 1x ż ..ż → Ż ..Ż Watin-A */ {0x017e, 0x017e, -1}, /* 1x ž ..ž → Ž ..Ž Watin-A */ {0x017f, 0x017f, -300}, /* 1x ſ ..ſ → S ..S Watin-A */ {0x0180, 0x0180, +195}, /* 1x ƀ ..ƀ → Ƀ ..Ƀ Watin-B */ {0x0183, 0x0183, -1}, /* 1x ƃ ..ƃ → Ƃ ..Ƃ Watin-B */ {0x0185, 0x0185, -1}, /* 1x ƅ ..ƅ → Ƅ ..Ƅ Watin-B */ {0x0188, 0x0188, -1}, /* 1x ƈ ..ƈ → Ƈ ..Ƈ Watin-B */ {0x018c, 0x018c, -1}, /* 1x ƌ ..ƌ → Ƌ ..Ƌ Watin-B */ {0x0192, 0x0192, -1}, /* 1x ƒ ..ƒ → Ƒ ..Ƒ Watin-B */ {0x0195, 0x0195, +97}, /* 1x ƕ ..ƕ → Ƕ ..Ƕ Watin-B */ {0x0199, 0x0199, -1}, /* 1x ƙ ..ƙ → Ƙ ..Ƙ Watin-B */ {0x019a, 0x019a, +163}, /* 1x ƚ ..ƚ → Ƚ ..Ƚ Watin-B */ {0x019e, 0x019e, +130}, /* 1x ƞ ..ƞ → Ƞ ..Ƞ Watin-B */ {0x01a1, 0x01a1, -1}, /* 1x ơ ..ơ → Ơ ..Ơ Watin-B */ {0x01a3, 0x01a3, -1}, /* 1x ƣ ..ƣ → Ƣ ..Ƣ Watin-B */ {0x01a5, 0x01a5, -1}, /* 1x ƥ ..ƥ → Ƥ ..Ƥ Watin-B */ {0x01a8, 0x01a8, -1}, /* 1x ƨ ..ƨ → Ƨ ..Ƨ Watin-B */ {0x01ad, 0x01ad, -1}, /* 1x ƭ ..ƭ → Ƭ ..Ƭ Watin-B */ {0x01b0, 0x01b0, -1}, /* 1x ư ..ư → Ư ..Ư Watin-B */ {0x01b4, 0x01b4, -1}, /* 1x ƴ ..ƴ → Ƴ ..Ƴ Watin-B */ {0x01b6, 0x01b6, -1}, /* 1x ƶ ..ƶ → Ƶ ..Ƶ Watin-B */ {0x01b9, 0x01b9, -1}, /* 1x ƹ ..ƹ → Ƹ ..Ƹ Watin-B */ {0x01bd, 0x01bd, -1}, /* 1x ƽ ..ƽ → Ƽ ..Ƽ Watin-B */ {0x01bf, 0x01bf, +56}, /* 1x ƿ ..ƿ → Ƿ ..Ƿ Watin-B */ {0x01c5, 0x01c5, -1}, /* 1x Dž ..Dž → DŽ ..DŽ Watin-B */ {0x01c6, 0x01c6, -2}, /* 1x dž ..dž → DŽ ..DŽ Watin-B */ {0x01c8, 0x01c8, -1}, /* 1x Lj ..Lj → LJ ..LJ Watin-B */ {0x01c9, 0x01c9, -2}, /* 1x lj ..lj → LJ ..LJ Watin-B */ {0x01cb, 0x01cb, -1}, /* 1x Nj ..Nj → NJ ..NJ Watin-B */ {0x01cc, 0x01cc, -2}, /* 1x nj ..nj → NJ ..NJ Watin-B */ {0x01ce, 0x01ce, -1}, /* 1x ǎ ..ǎ → Ǎ ..Ǎ Watin-B */ {0x01dd, 0x01dd, -79}, /* 1x ǝ ..ǝ → Ǝ ..Ǝ Watin-B */ {0x01f2, 0x01f2, -1}, /* 1x Dz ..Dz → DZ ..DZ Watin-B */ {0x01f3, 0x01f3, -2}, /* 1x dz ..dz → DZ ..DZ Watin-B */ {0x01f5, 0x01f5, -1}, /* 1x ǵ ..ǵ → Ǵ ..Ǵ Watin-B */ {0x023c, 0x023c, -1}, /* 1x ȼ ..ȼ → Ȼ ..Ȼ Watin-B */ {0x023f, 0x0240,+10815}, /* 2x ȿ ..ɀ → Ȿ ..Ɀ Watin-B */ {0x0242, 0x0242, -1}, /* 1x ɂ ..ɂ → Ɂ ..Ɂ Watin-B */ {0x0247, 0x0247, -1}, /* 1x ɇ ..ɇ → Ɇ ..Ɇ Watin-B */ {0x0249, 0x0249, -1}, /* 1x ɉ ..ɉ → Ɉ ..Ɉ Watin-B */ {0x024b, 0x024b, -1}, /* 1x ɋ ..ɋ → Ɋ ..Ɋ Watin-B */ {0x024d, 0x024d, -1}, /* 1x ɍ ..ɍ → Ɍ ..Ɍ Watin-B */ {0x024f, 0x024f, -1}, /* 1x ɏ ..ɏ → Ɏ ..Ɏ Watin-B */ {0x037b, 0x037d, +130}, /* 3x ͻ ..ͽ → Ͻ ..Ͽ Greek */ {0x03ac, 0x03ac, -38}, /* 1x ά ..ά → Ά ..Ά Greek */ {0x03ad, 0x03af, -37}, /* 3x έ ..ί → Έ ..Ί Greek */ {0x03b1, 0x03c1, -32}, /* 17x α ..ρ → Α ..Ρ Greek */ {0x03c2, 0x03c2, -31}, /* 1x ς ..ς → Σ ..Σ Greek */ {0x03c3, 0x03cb, -32}, /* 9x σ ..ϋ → Σ ..Ϋ Greek */ {0x03cc, 0x03cc, -64}, /* 1x ό ..ό → Ό ..Ό Greek */ {0x03cd, 0x03ce, -63}, /* 2x ύ ..ώ → Ύ ..Ώ Greek */ {0x03d0, 0x03d0, -62}, /* 1x ϐ ..ϐ → Β ..Β Greek */ {0x03d1, 0x03d1, -57}, /* 1x ϑ ..ϑ → Θ ..Θ Greek */ {0x03d5, 0x03d5, -47}, /* 1x ϕ ..ϕ → Φ ..Φ Greek */ {0x03d6, 0x03d6, -54}, /* 1x ϖ ..ϖ → Π ..Π Greek */ {0x03dd, 0x03dd, -1}, /* 1x ϝ ..ϝ → Ϝ ..Ϝ Greek */ {0x03f0, 0x03f0, -86}, /* 1x ϰ ..ϰ → Κ ..Κ Greek */ {0x03f1, 0x03f1, -80}, /* 1x ϱ ..ϱ → Ρ ..Ρ Greek */ {0x03f5, 0x03f5, -96}, /* 1x ϵ ..ϵ → Ε ..Ε Greek */ {0x0430, 0x044f, -32}, /* 32x а ..я → А ..Я Cyrillic */ {0x0450, 0x045f, -80}, /* 16x ѐ ..џ → Ѐ ..Џ Cyrillic */ {0x0461, 0x0461, -1}, /* 1x ѡ ..ѡ → Ѡ ..Ѡ Cyrillic */ {0x0463, 0x0463, -1}, /* 1x ѣ ..ѣ → Ѣ ..Ѣ Cyrillic */ {0x0465, 0x0465, -1}, /* 1x ѥ ..ѥ → Ѥ ..Ѥ Cyrillic */ {0x0473, 0x0473, -1}, /* 1x ѳ ..ѳ → Ѳ ..Ѳ Cyrillic */ {0x0491, 0x0491, -1}, /* 1x ґ ..ґ → Ґ ..Ґ Cyrillic */ {0x0499, 0x0499, -1}, /* 1x ҙ ..ҙ → Ҙ ..Ҙ Cyrillic */ {0x049b, 0x049b, -1}, /* 1x қ ..қ → Қ ..Қ Cyrillic */ {0x0561, 0x0586, -48}, /* 38x ա ..ֆ → Ա ..Ֆ Armenian */ {0x10d0, 0x10fa, +3008}, /* 43x ა ..ჺ → Ა ..Ჺ Georgian */ {0x10fd, 0x10ff, +3008}, /* 3x ჽ ..ჿ → Ჽ ..Ჿ Georgian */ {0x13f8, 0x13fd, -8}, /* 6x ᏸ ..ᏽ → Ᏸ ..Ᏽ Cherokee */ {0x214e, 0x214e, -28}, /* 1x ⅎ ..ⅎ → Ⅎ ..Ⅎ Letterlike */ {0x2170, 0x217f, -16}, /* 16x ⅰ ..ⅿ → Ⅰ ..Ⅿ Numbery */ {0x2184, 0x2184, -1}, /* 1x ↄ ..ↄ → Ↄ ..Ↄ Numbery */ {0x24d0, 0x24e9, -26}, /* 26x ⓐ ..ⓩ → Ⓐ ..Ⓩ Enclosed */ {0x2c30, 0x2c5e, -48}, /* 47x ⰰ ..ⱞ → Ⰰ ..Ⱞ Glagolitic */ {0x2d00, 0x2d25, -7264}, /* 38x ⴀ ..ⴥ → Ⴀ ..Ⴥ Georgian2 */ {0x2d27, 0x2d27, -7264}, /* 1x ⴧ ..ⴧ → Ⴧ ..Ⴧ Georgian2 */ {0x2d2d, 0x2d2d, -7264}, /* 1x ⴭ ..ⴭ → Ⴭ ..Ⴭ Georgian2 */ {0xff41, 0xff5a, -32}, /* 26x a..z → A..Z Dubs */ }; l = 0; r = n = sizeof(kUpper) / sizeof(kUpper[0]); while (l < r) { m = (l + r) >> 1; if (kUpper[m].b < c) { l = m + 1; } else { r = m; } } if (l < n && kUpper[l].a <= c && c <= kUpper[l].b) { return c + kUpper[l].d; } else { return c; } } } else { static const struct { unsigned a; unsigned b; short d; } kAstralUpper[] = { {0x10428, 0x1044f, -40}, /* 40x 𐐨..𐑏 → 𐐀..𐐧 Deseret */ {0x104d8, 0x104fb, -40}, /* 36x 𐓘..𐓻 → 𐒰..𐓓 Osage */ {0x1d41a, 0x1d433, -26}, /* 26x 𝐚..𝐳 → 𝐀..𝐙 Math */ {0x1d456, 0x1d467, -26}, /* 18x 𝑖..𝑧 → 𝐼..𝑍 Math */ {0x1d482, 0x1d49b, -26}, /* 26x 𝒂..𝒛 → 𝑨..𝒁 Math */ {0x1d4c8, 0x1d4cf, -26}, /* 8x 𝓈..𝓏 → 𝒮..𝒵 Math */ {0x1d4ea, 0x1d503, -26}, /* 26x 𝓪..𝔃 → 𝓐..𝓩 Math */ {0x1d527, 0x1d52e, -26}, /* 8x 𝔧..𝔮 → 𝔍..𝔔 Math */ {0x1d586, 0x1d59f, -26}, /* 26x 𝖆..𝖟 → 𝕬..𝖅 Math */ {0x1d5ba, 0x1d5d3, -26}, /* 26x 𝖺..𝗓 → 𝖠..𝖹 Math */ {0x1d5ee, 0x1d607, -26}, /* 26x 𝗮..𝘇 → 𝗔..𝗭 Math */ {0x1d622, 0x1d63b, -26}, /* 26x 𝘢..𝘻 → 𝘈..𝘡 Math */ {0x1d68a, 0x1d6a3, +442}, /* 26x 𝒂..𝒛 → 𝘼..𝙕 Math */ {0x1d6c2, 0x1d6d2, -26}, /* 26x 𝚊..𝚣 → 𝙰..𝚉 Math */ {0x1d6fc, 0x1d70c, -26}, /* 17x 𝛂..𝛒 → 𝚨..𝚸 Math */ {0x1d736, 0x1d746, -26}, /* 17x 𝛼..𝜌 → 𝛢..𝛲 Math */ {0x1d770, 0x1d780, -26}, /* 17x 𝜶..𝝆 → 𝜜..𝜬 Math */ {0x1d770, 0x1d756, -26}, /* 17x 𝝰..𝞀 → 𝝖..𝝦 Math */ {0x1d736, 0x1d790, -90}, /* 17x 𝜶..𝝆 → 𝞐..𝞠 Math */ }; l = 0; r = n = sizeof(kAstralUpper) / sizeof(kAstralUpper[0]); while (l < r) { m = (l + r) >> 1; if (kAstralUpper[m].b < c) { l = m + 1; } else { r = m; } } if (l < n && kAstralUpper[l].a <= c && c <= kAstralUpper[l].b) { return c + kAstralUpper[l].d; } else { return c; } } } char bestlineNotSeparator(unsigned c) { return !bestlineIsSeparator(c); } static unsigned GetMirror(const unsigned short A[][2], size_t n, unsigned c) { int l, m, r; l = 0; r = n - 1; while (l <= r) { m = (l + r) >> 1; if (A[m][0] < c) { l = m + 1; } else if (A[m][0] > c) { r = m - 1; } else { return A[m][1]; } } return 0; } unsigned bestlineMirrorLeft(unsigned c) { static const unsigned short kMirrorRight[][2] = { {L')', L'('}, {L']', L'['}, {L'}', L'{'}, {L'⁆', L'⁅'}, {L'⁾', L'⁽'}, {L'₎', L'₍'}, {L'⌉', L'⌈'}, {L'⌋', L'⌊'}, {L'〉', L'〈'}, {L'❩', L'❨'}, {L'❫', L'❪'}, {L'❭', L'❬'}, {L'❯', L'❮'}, {L'❱', L'❰'}, {L'❳', L'❲'}, {L'❵', L'❴'}, {L'⟆', L'⟅'}, {L'⟧', L'⟦'}, {L'⟩', L'⟨'}, {L'⟫', L'⟪'}, {L'⟭', L'⟬'}, {L'⟯', L'⟮'}, {L'⦄', L'⦃'}, {L'⦆', L'⦅'}, {L'⦈', L'⦇'}, {L'⦊', L'⦉'}, {L'⦌', L'⦋'}, {L'⦎', L'⦏'}, {L'⦐', L'⦍'}, {L'⦒', L'⦑'}, {L'⦔', L'⦓'}, {L'⦘', L'⦗'}, {L'⧙', L'⧘'}, {L'⧛', L'⧚'}, {L'⧽', L'⧼'}, {L'﹚', L'﹙'}, {L'﹜', L'﹛'}, {L'﹞', L'﹝'}, {L')', L'('}, {L']', L'['}, {L'}', L'{'}, {L'」', L'「'}, }; return GetMirror(kMirrorRight, sizeof(kMirrorRight) / sizeof(kMirrorRight[0]), c); } unsigned bestlineMirrorRight(unsigned c) { static const unsigned short kMirrorLeft[][2] = { {L'(', L')'}, {L'[', L']'}, {L'{', L'}'}, {L'⁅', L'⁆'}, {L'⁽', L'⁾'}, {L'₍', L'₎'}, {L'⌈', L'⌉'}, {L'⌊', L'⌋'}, {L'〈', L'〉'}, {L'❨', L'❩'}, {L'❪', L'❫'}, {L'❬', L'❭'}, {L'❮', L'❯'}, {L'❰', L'❱'}, {L'❲', L'❳'}, {L'❴', L'❵'}, {L'⟅', L'⟆'}, {L'⟦', L'⟧'}, {L'⟨', L'⟩'}, {L'⟪', L'⟫'}, {L'⟬', L'⟭'}, {L'⟮', L'⟯'}, {L'⦃', L'⦄'}, {L'⦅', L'⦆'}, {L'⦇', L'⦈'}, {L'⦉', L'⦊'}, {L'⦋', L'⦌'}, {L'⦍', L'⦐'}, {L'⦏', L'⦎'}, {L'⦑', L'⦒'}, {L'⦓', L'⦔'}, {L'⦗', L'⦘'}, {L'⧘', L'⧙'}, {L'⧚', L'⧛'}, {L'⧼', L'⧽'}, {L'﹙', L'﹚'}, {L'﹛', L'﹜'}, {L'﹝', L'﹞'}, {L'(', L')'}, {L'[', L']'}, {L'{', L'}'}, {L'「', L'」'}, }; return GetMirror(kMirrorLeft, sizeof(kMirrorLeft) / sizeof(kMirrorLeft[0]), c); } char bestlineIsXeparator(unsigned c) { return (bestlineIsSeparator(c) && !bestlineMirrorLeft(c) && !bestlineMirrorRight(c)); } static unsigned Capitalize(unsigned c) { if (!iscapital) { c = bestlineUppercase(c); iscapital = 1; } return c; } static inline int Bsr(unsigned long long x) { #if defined(__GNUC__) && !defined(__STRICT_ANSI__) int b; b = __builtin_clzll(x); b ^= sizeof(unsigned long long) * CHAR_BIT - 1; return b; #else static const char kDebruijn[64] = { 0, 47, 1, 56, 48, 27, 2, 60, 57, 49, 41, 37, 28, 16, 3, 61, 54, 58, 35, 52, 50, 42, 21, 44, 38, 32, 29, 23, 17, 11, 4, 62, 46, 55, 26, 59, 40, 36, 15, 53, 34, 51, 20, 43, 31, 22, 10, 45, 25, 39, 14, 33, 19, 30, 9, 24, 13, 18, 8, 12, 7, 6, 5, 63, }; x |= x >> 1; x |= x >> 2; x |= x >> 4; x |= x >> 8; x |= x >> 16; x |= x >> 32; return kDebruijn[(x * 0x03f79d71b4cb0a89) >> 58]; #endif } static struct rune DecodeUtf8(int c) { struct rune r; if (c < 252) { r.n = Bsr(255 & ~c); r.c = c & (((1 << r.n) - 1) | 3); r.n = 6 - r.n; } else { r.c = c & 3; r.n = 5; } return r; } static unsigned long long EncodeUtf8(unsigned c) { static const unsigned short kTpEnc[32 - 7] = { 1|0300<<8, 1|0300<<8, 1|0300<<8, 1|0300<<8, 2|0340<<8, 2|0340<<8, 2|0340<<8, 2|0340<<8, 2|0340<<8, 3|0360<<8, 3|0360<<8, 3|0360<<8, 3|0360<<8, 3|0360<<8, 4|0370<<8, 4|0370<<8, 4|0370<<8, 4|0370<<8, 4|0370<<8, 5|0374<<8, 5|0374<<8, 5|0374<<8, 5|0374<<8, 5|0374<<8, 5|0374<<8, }; int e, n; unsigned long long w; if (c < 0200) return c; e = kTpEnc[Bsr(c) - 7]; n = e & 0xff; w = 0; do { w |= 0200 | (c & 077); w <<= 8; c >>= 6; } while (--n); return c | w | e >> 8; } static struct rune GetUtf8(const char *p, size_t n) { struct rune r; if ((r.n = r.c = 0) < n && (r.c = p[r.n++] & 255) >= 0300) { r.c = DecodeUtf8(r.c).c; while (r.n < n && (p[r.n] & 0300) == 0200) { r.c = r.c << 6 | (p[r.n++] & 077); } } return r; } static char *FormatUnsigned(char *p, unsigned x) { char t; size_t i, a, b; i = 0; do { p[i++] = x % 10 + '0'; x = x / 10; } while (x > 0); p[i] = '\0'; if (i) { for (a = 0, b = i - 1; a < b; ++a, --b) { t = p[a]; p[a] = p[b]; p[b] = t; } } return p + i; } static void abInit(struct abuf *a) { a->len = 0; a->cap = 16; a->b = (char *)malloc(a->cap); a->b[0] = 0; } static char abGrow(struct abuf *a, int need) { int cap; char *b; cap = a->cap; do cap += cap / 2; while (cap < need); if (!(b = (char *)realloc(a->b, cap * sizeof(*a->b)))) return 0; a->cap = cap; a->b = b; return 1; } static void abAppendw(struct abuf *a, unsigned long long w) { char *p; if (a->len + 8 > a->cap && !abGrow(a, a->len + 8)) return; p = a->b + a->len; p[0] = (0x00000000000000FF & w) >> 000; p[1] = (0x000000000000FF00 & w) >> 010; p[2] = (0x0000000000FF0000 & w) >> 020; p[3] = (0x00000000FF000000 & w) >> 030; p[4] = (0x000000FF00000000 & w) >> 040; p[5] = (0x0000FF0000000000 & w) >> 050; p[6] = (0x00FF000000000000 & w) >> 060; p[7] = (0xFF00000000000000 & w) >> 070; a->len += w ? (Bsr(w) >> 3) + 1 : 1; } static void abAppend(struct abuf *a, const char *s, int len) { if (a->len + len + 1 > a->cap && !abGrow(a, a->len + len + 1)) return; memcpy(a->b + a->len, s, len); a->b[a->len + len] = 0; a->len += len; } static void abAppends(struct abuf *a, const char *s) { abAppend(a, s, strlen(s)); } static void abAppendu(struct abuf *a, unsigned u) { char b[11]; abAppend(a, b, FormatUnsigned(b, u) - b); } static void abFree(struct abuf *a) { free(a->b); a->b = 0; } static size_t GetFdSize(int fd) { struct stat st; st.st_size = 0; fstat(fd, &st); return st.st_size; } static char IsCharDev(int fd) { struct stat st; st.st_mode = 0; fstat(fd, &st); return (st.st_mode & S_IFMT) == S_IFCHR; } static int WaitUntilReady(int fd, int events) { struct pollfd p[1]; p[0].fd = fd; p[0].events = events; return poll(p, 1, -1); } static char HasPendingInput(int fd) { struct pollfd p[1]; p[0].fd = fd; p[0].events = POLLIN; return poll(p, 1, 0) == 1; } static char *GetLineBlock(FILE *f) { ssize_t rc; char *p = 0; size_t n, c = 0; if ((rc = getdelim(&p, &c, '\n', f)) != EOF) { for (n = rc; n; --n) { if (p[n - 1] == '\r' || p[n - 1] == '\n') { p[n - 1] = 0; } else { break; } } return p; } else { free(p); return 0; } } long bestlineReadCharacter(int fd, char *p, unsigned long n) { int e; size_t i; ssize_t rc; struct rune r; unsigned char c; enum { kAscii, kUtf8, kEsc, kCsi1, kCsi2, kSs, kNf, kStr, kStr2, kDone } t; i = 0; r.c = 0; r.n = 0; e = errno; t = kAscii; if (n) p[0] = 0; do { for (;;) { if (gotint) { errno = EINTR; return -1; } if (n) { rc = read(fd,&c,1); } else { rc = read(fd,0,0); } if (rc == -1 && errno == EINTR) { if (!i) { return -1; } } else if (rc == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) { if (WaitUntilReady(fd, POLLIN) == -1) { if (rc == -1 && errno == EINTR) { if (!i) { return -1; } } else { return -1; } } } else if (rc == -1) { return -1; } else if (!rc) { if (!i) { errno = e; return 0; } else { errno = EILSEQ; return -1; } } else { break; } } if (i + 1 < n) { p[i] = c; p[i+1] = 0; } else if (i < n) { p[i] = 0; } ++i; switch (t) { Whoopsie: if (n) p[0] = c; t = kAscii; i = 1; /* fallthrough */ case kAscii: if (c < 0200) { if (c == 033) { t = kEsc; } else { t = kDone; } } else if (c >= 0300) { t = kUtf8; r = DecodeUtf8(c); } else { /* ignore overlong sequences */ } break; case kUtf8: if ((c & 0300) == 0200) { r.c <<= 6; r.c |= c & 077; if (!--r.n) { switch (r.c) { case 033: t = kEsc; /* parsed but not canonicalized */ break; case 0x9b: t = kCsi1; /* unusual but legal */ break; case 0x8e: /* SS2 (Single Shift Two) */ case 0x8f: /* SS3 (Single Shift Three) */ t = kSs; break; case 0x90: /* DCS (Device Control String) */ case 0x98: /* SOS (Start of String) */ case 0x9d: /* OSC (Operating System Command) */ case 0x9e: /* PM (Privacy Message) */ case 0x9f: /* APC (Application Program Command) */ t = kStr; break; default: t = kDone; break; } } } else { goto Whoopsie; /* ignore underlong sequences if not eof */ } break; case kEsc: if (0x20 <= c && c <= 0x2f) { /* Nf */ /* * Almost no one uses ANSI Nf sequences * They overlaps with alt+graphic keystrokes * We care more about being able to type alt-/ */ if (c == ' ' || c == '#') { t = kNf; } else { t = kDone; } } else if (0x30 <= c && c <= 0x3f) { /* Fp */ t = kDone; } else if (0x20 <= c && c <= 0x5F) { /* Fe */ switch (c) { case '[': t = kCsi1; break; case 'N': /* SS2 (Single Shift Two) */ case 'O': /* SS3 (Single Shift Three) */ t = kSs; break; case 'P': /* DCS (Device Control String) */ case 'X': /* SOS (Start of String) */ case ']': /* OSC (Operating System Command) */ case '^': /* PM (Privacy Message) */ case '_': /* APC (Application Program Command) */ t = kStr; break; default: t = kDone; break; } } else if (0x60 <= c && c <= 0x7e) { /* Fs */ t = kDone; } else if (c == 033) { if (i < 3) { /* alt chording */ } else { t = kDone; /* esc mashing */ i = 1; } } else { t = kDone; } break; case kSs: t = kDone; break; case kNf: if (0x30 <= c && c <= 0x7e) { t = kDone; } else if (!(0x20 <= c && c <= 0x2f)) { goto Whoopsie; } break; case kCsi1: if (0x20 <= c && c <= 0x2f) { t = kCsi2; } else if (c == '[' && ((i == 3) || (i == 4 && p[1] == 033))) { /* linux function keys */ } else if (0x40 <= c && c <= 0x7e) { t = kDone; } else if (!(0x30 <= c && c <= 0x3f)) { goto Whoopsie; } break; case kCsi2: if (0x40 <= c && c <= 0x7e) { t = kDone; } else if (!(0x20 <= c && c <= 0x2f)) { goto Whoopsie; } break; case kStr: switch (c) { case '\a': t = kDone; break; case 0033: /* ESC */ case 0302: /* C1 (UTF-8) */ t = kStr2; break; default: break; } break; case kStr2: switch (c) { case '\a': case '\\': /* ST (ASCII) */ case 0234: /* ST (UTF-8) */ t = kDone; break; default: t = kStr; break; } break; default: assert(0); } } while (t != kDone); errno = e; return i; } static char *GetLineChar(int fin, int fout) { size_t got; ssize_t rc; char seq[16]; struct abuf a; struct sigaction sa[3]; abInit(&a); gotint = 0; sigemptyset(&sa->sa_mask); sa->sa_flags = 0; sa->sa_handler = bestlineOnInt; sigaction(SIGINT,sa,sa+1); sigaction(SIGQUIT,sa,sa+2); for (;;) { if (gotint) { rc = -1; break; } if ((rc = bestlineReadCharacter(fin, seq, sizeof(seq))) == -1) { if (errno == EAGAIN || errno == EWOULDBLOCK) { if (WaitUntilReady(fin, POLLIN) > 0) { continue; } } if (errno == EINTR) { continue; } else { break; } } if (!(got = rc)) { if (a.len) { break; } else { rc = -1; break; } } if (seq[0] == '\r') { if (HasPendingInput(fin)) { if ((rc = bestlineReadCharacter(fin, seq + 1, sizeof(seq) - 1)) > 0) { if (seq[0] == '\n') { break; } } else { rc = -1; break; } } else { write(fout, "\n", 1); break; } } else if (seq[0] == Ctrl('D')) { break; } else if (seq[0] == '\n') { break; } else if (seq[0] == '\b') { while (a.len && (a.b[a.len - 1] & 0300) == 0200) --a.len; if (a.len) --a.len; } if (!IsControl(seq[0])) { abAppend(&a, seq, got); } } sigaction(SIGQUIT,sa+2,0); sigaction(SIGINT,sa+1,0); if (gotint) { abFree(&a); raise(gotint); errno = EINTR; rc = -1; } if (rc != -1) { return a.b; } else { abFree(&a); return 0; } } static char *GetLine(FILE *in, FILE *out) { if (!IsCharDev(fileno(in))) { return GetLineBlock(in); } else { return GetLineChar(fileno(in), fileno(out)); } } static char *Copy(char *d, const char *s, size_t n) { memcpy(d, s, n); return d + n; } static int CompareStrings(const char *a, const char *b) { size_t i; int x, y, c; for (i = 0;; ++i) { x = bestlineLowercase(a[i] & 255); y = bestlineLowercase(b[i] & 255); if ((c = x - y) || !x) { return c; } } } static const char *FindSubstringReverse(const char *p, size_t n, const char *q, size_t m) { size_t i; if (m <= n) { n -= m; do { for (i = 0; i < m; ++i) { if (p[n + i] != q[i]) { break; } } if (i == m) { return p + n; } } while (n--); } return 0; } static int ParseUnsigned(const char *s, void *e) { int c, x; for (x = 0; (c = *s++);) { if ('0' <= c && c <= '9') { x = Min(c - '0' + x * 10, 32767); } else { break; } } if (e) *(const char **)e = s; return x; } /** * Returns UNICODE CJK Monospace Width of string. * * Control codes and ANSI sequences have a width of zero. We only parse * a limited subset of ANSI here since we don't store ANSI codes in the * linenoiseState::buf, but we do encourage CSI color codes in prompts. */ static size_t GetMonospaceWidth(const char *p, size_t n, char *out_haswides) { int c, d; size_t i, w; struct rune r; char haswides; enum { kAscii, kUtf8, kEsc, kCsi1, kCsi2 } t; for (haswides = r.c = r.n = w = i = 0, t = kAscii; i < n; ++i) { c = p[i] & 255; switch (t) { Whoopsie: t = kAscii; /* fallthrough */ case kAscii: if (c < 0200) { if (c == 033) { t = kEsc; } else { ++w; } } else if (c >= 0300) { t = kUtf8; r = DecodeUtf8(c); } break; case kUtf8: if ((c & 0300) == 0200) { r.c <<= 6; r.c |= c & 077; if (!--r.n) { d = GetMonospaceCharacterWidth(r.c); d = Max(0, d); w += d; haswides |= d > 1; t = kAscii; break; } } else { goto Whoopsie; } break; case kEsc: if (c == '[') { t = kCsi1; } else { t = kAscii; } break; case kCsi1: if (0x20 <= c && c <= 0x2f) { t = kCsi2; } else if (0x40 <= c && c <= 0x7e) { t = kAscii; } else if (!(0x30 <= c && c <= 0x3f)) { goto Whoopsie; } break; case kCsi2: if (0x40 <= c && c <= 0x7e) { t = kAscii; } else if (!(0x20 <= c && c <= 0x2f)) { goto Whoopsie; } break; default: assert(0); } } if (out_haswides) { *out_haswides = haswides; } return w; } static int bestlineIsUnsupportedTerm(void) { size_t i; char *term; static char once, res; if (!once) { if ((term = getenv("TERM"))) { for (i = 0; i < sizeof(kUnsupported) / sizeof(*kUnsupported); i++) { if (!CompareStrings(term,kUnsupported[i])) { res = 1; break; } } } once = 1; } return res; } static int enableRawMode(int fd) { struct termios raw; struct sigaction sa; if (tcgetattr(fd,&orig_termios) != -1) { raw = orig_termios; raw.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON); raw.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG); raw.c_oflag &= ~OPOST; raw.c_iflag |= IUTF8; raw.c_cflag |= CS8; raw.c_cc[VMIN] = 1; raw.c_cc[VTIME] = 0; if (tcsetattr(fd,TCSANOW,&raw) != -1) { sa.sa_flags = 0; sa.sa_handler = bestlineOnCont; sigemptyset(&sa.sa_mask); sigaction(SIGCONT,&sa,&orig_cont); sa.sa_handler = bestlineOnWinch; sigaction(SIGWINCH,&sa,&orig_winch); rawmode = fd; gotwinch = 0; gotcont = 0; return 0; } } errno = ENOTTY; return -1; } static void bestlineUnpause(int fd) { if (ispaused) { tcflow(fd, TCOON); ispaused = 0; } } void bestlineDisableRawMode(void) { if (rawmode != -1) { bestlineUnpause(rawmode); sigaction(SIGCONT,&orig_cont,0); sigaction(SIGWINCH,&orig_winch,0); tcsetattr(rawmode,TCSANOW,&orig_termios); rawmode = -1; } } static int bestlineWrite(int fd, const void *p, size_t n) { ssize_t rc; size_t wrote; do { for (;;) { if (gotint) { errno = EINTR; return -1; } if (ispaused) { return 0; } rc = write(fd, p, n); if (rc == -1 && errno == EINTR) { continue; } else if (rc == -1 && (errno == EAGAIN || errno == EWOULDBLOCK)) { if (WaitUntilReady(fd, POLLOUT) == -1) { if (errno == EINTR) { continue; } else { return -1; } } } else { break; } } if (rc != -1) { wrote = rc; n -= wrote; p = (char *)p + wrote; } else { return -1; } } while (n); return 0; } static int bestlineWriteStr(int fd, const char *p) { return bestlineWrite(fd, p, strlen(p)); } static ssize_t bestlineRead(int fd, char *buf, size_t size, struct bestlineState *l) { size_t got; ssize_t rc; int refreshme; do { refreshme = 0; if (gotint) { errno = EINTR; return -1; } if (gotcont && rawmode != -1) { enableRawMode(rawmode); if (l) refreshme = 1; } if (gotwinch && l) { refreshme = 1; } if (refreshme) bestlineRefreshLine(l); rc = bestlineReadCharacter(fd, buf, size); } while (rc == -1 && errno == EINTR); if (rc != -1) { got = rc; if (got > 0 && l) { memcpy(l->seq[1], l->seq[0], sizeof(l->seq[0])); memset(l->seq[0], 0, sizeof(l->seq[0])); memcpy(l->seq[0], buf, Min(Min(size, got), sizeof(l->seq[0]) - 1)); } } return rc; } /** * Returns number of columns in current terminal. * * 1. Checks COLUMNS environment variable (set by Emacs) * 2. Tries asking termios (works for pseudoteletypewriters) * 3. Falls back to inband signalling (works w/ pipe or serial) * 4. Otherwise we conservatively assume 80 columns * * @param ws should be initialized by caller to zero before first call * @param ifd is input file descriptor * @param ofd is output file descriptor * @return window size */ static struct winsize GetTerminalSize(struct winsize ws, int ifd, int ofd) { int x; ssize_t n; char *p, *s, b[16]; ioctl(ofd, TIOCGWINSZ, &ws); if ((!ws.ws_row && (s = getenv("ROWS")) && (x = ParseUnsigned(s, 0)))) { ws.ws_row = x; } if ((!ws.ws_col && (s = getenv("COLUMNS")) && (x = ParseUnsigned(s, 0)))) { ws.ws_col = x; } if (((!ws.ws_col || !ws.ws_row) && bestlineRead(ifd,0,0,0) != -1 && bestlineWriteStr(ofd, "\0337" /* save position */ "\033[9979;9979H" /* move cursor to bottom right corner */ "\033[6n" /* report position */ "\0338") != -1 && /* restore position */ (n = bestlineRead(ifd,b,sizeof(b),0)) != -1 && n && b[0] == 033 && b[1] == '[' && b[n - 1] == 'R')) { p = b+2; if ((x = ParseUnsigned(p,&p))) ws.ws_row = x; if (*p++ == ';' && (x = ParseUnsigned(p,0))) ws.ws_col = x; } if (!ws.ws_col) ws.ws_col = 80; if (!ws.ws_row) ws.ws_row = 24; return ws; } /* Clear the screen. Used to handle ctrl+l */ void bestlineClearScreen(int fd) { bestlineWriteStr(fd, "\033[H" /* move cursor to top left corner */ "\033[2J"); /* erase display */ } static void bestlineBeep(void) { /* THE TERMINAL BELL IS DEAD - HISTORY HAS KILLED IT */ } static char bestlineGrow(struct bestlineState *ls, size_t n) { char *p; size_t m; m = ls->buflen; if (m >= n) return 1; do m += m >> 1; while (m < n); if (!(p = (char *)realloc(ls->buf, m * sizeof(*ls->buf)))) return 0; ls->buf = p; ls->buflen = m; return 1; } /* This is an helper function for bestlineEdit() and is called when the * user types the key in order to complete the string currently in the * input. * * The state of the editing is encapsulated into the pointed bestlineState * structure as described in the structure definition. */ static ssize_t bestlineCompleteLine(struct bestlineState *ls, char *seq, int size) { ssize_t nread; size_t i, n, stop; bestlineCompletions lc; struct bestlineState saved; nread=0; memset(&lc,0,sizeof(lc)); completionCallback(ls->buf,&lc); if (!lc.len) { bestlineBeep(); } else { i = 0; stop = 0; while (!stop) { /* Show completion or original buffer */ if (i < lc.len) { saved = *ls; ls->len = ls->pos = strlen(lc.cvec[i]); ls->buf = lc.cvec[i]; bestlineRefreshLine(ls); ls->len = saved.len; ls->pos = saved.pos; ls->buf = saved.buf; } else { bestlineRefreshLine(ls); } if ((nread = bestlineRead(ls->ifd,seq,size,ls)) <= 0) { bestlineFreeCompletions(&lc); return -1; } switch (seq[0]) { case '\t': i = (i+1) % (lc.len+1); if (i == lc.len) { bestlineBeep(); } break; default: if (i < lc.len) { n = strlen(lc.cvec[i]); if (bestlineGrow(ls, n + 1)) { memcpy(ls->buf, lc.cvec[i], n + 1); ls->len = ls->pos = n; } } stop = 1; break; } } } bestlineFreeCompletions(&lc); return nread; } static void bestlineEditHistoryGoto(struct bestlineState *l, unsigned i) { size_t n; if (historylen <= 1) return; i = Max(Min(i,historylen-1),0); free(history[historylen - 1 - l->hindex]); history[historylen - 1 - l->hindex] = strdup(l->buf); l->hindex = i; n = strlen(history[historylen - 1 - l->hindex]); bestlineGrow(l, n + 1); n = Min(n, l->buflen - 1); memcpy(l->buf, history[historylen - 1 - l->hindex], n); l->buf[n] = 0; l->len = l->pos = n; bestlineRefreshLine(l); } static void bestlineEditHistoryMove(struct bestlineState *l, int dx) { bestlineEditHistoryGoto(l,l->hindex+dx); } static char *bestlineMakeSearchPrompt(struct abuf *ab, int fail, const char *s, int n) { ab->len=0; abAppendw(ab,'('); if (fail) abAppends(ab,"failed "); abAppends(ab,"reverse-i-search `\033[4m"); abAppend(ab,s,n); abAppends(ab,"\033[24m"); abAppends(ab,s+n); abAppendw(ab,Read32le("') ")); return ab->b; } static int bestlineSearch(struct bestlineState *l, char *seq, int size) { char *p; char isstale; struct abuf ab; struct abuf prompt; unsigned i, j, k, matlen; const char *oldprompt, *q; int rc, fail, added, oldpos, oldindex; if (historylen <= 1) return 0; abInit(&ab); abInit(&prompt); oldpos = l->pos; oldprompt = l->prompt; oldindex = l->hindex; for (fail=matlen=0;;) { l->prompt = bestlineMakeSearchPrompt(&prompt,fail,ab.b,matlen); bestlineRefreshLine(l); fail = 1; added = 0; j = l->pos; i = l->hindex; rc = bestlineRead(l->ifd,seq,size,l); if (rc > 0) { if (seq[0] == Ctrl('?') || seq[0] == Ctrl('H')) { if (ab.len) { --ab.len; matlen = Min(matlen, ab.len); } } else if (seq[0] == Ctrl('R')) { if (j) { --j; } else if (i + 1 < historylen) { ++i; j = strlen(history[historylen - 1 - i]); } } else if (seq[0] == Ctrl('G')) { bestlineEditHistoryGoto(l,oldindex); l->pos = oldpos; rc = 0; break; } else if (IsControl(seq[0])) { /* only sees canonical c0 */ break; } else { abAppend(&ab,seq,rc); added = rc; } } else { break; } isstale = 0; while (i < historylen) { p = history[historylen - 1 - i]; k = strlen(p); if (!isstale) { j = Min(k, j + ab.len); } else { isstale = 0; j = k; } if ((q = FindSubstringReverse(p, j, ab.b, ab.len))) { bestlineEditHistoryGoto(l,i); l->pos = q - p; fail = 0; if (added) { matlen += added; added = 0; } break; } else { isstale = 1; ++i; } } } l->prompt = oldprompt; bestlineRefreshLine(l); abFree(&prompt); abFree(&ab); bestlineRefreshLine(l); return rc; } static void bestlineRingFree(void) { size_t i; for (i = 0; i < BESTLINE_MAX_RING; ++i) { if (ring.p[i]) { free(ring.p[i]); ring.p[i] = 0; } } } static void bestlineRingPush(const char *p, size_t n) { char *q; if (!n) return; if (!(q = (char *)malloc(n + 1))) return; ring.i = (ring.i + 1) % BESTLINE_MAX_RING; free(ring.p[ring.i]); ring.p[ring.i] = (char *)memcpy(q, p, n); ring.p[ring.i][n] = 0; } static void bestlineRingRotate(void) { size_t i; for (i = 0; i < BESTLINE_MAX_RING; ++i) { ring.i = (ring.i - 1) % BESTLINE_MAX_RING; if (ring.p[ring.i]) break; } } static char *bestlineRefreshHints(struct bestlineState *l) { char *hint; struct abuf ab; const char *ansi1 = "\033[90m", *ansi2 = "\033[39m"; if (!hintsCallback) return 0; if (!(hint = hintsCallback(l->buf, &ansi1, &ansi2))) return 0; abInit(&ab); if (ansi1) abAppends(&ab, ansi1); abAppends(&ab, hint); if (ansi2) abAppends(&ab, ansi2); if (freeHintsCallback) freeHintsCallback(hint); return ab.b; } static size_t Backward(struct bestlineState *l, size_t pos) { if (pos) { do --pos; while (pos && (l->buf[pos] & 0300) == 0200); } return pos; } static int bestlineEditMirrorLeft(struct bestlineState *l, int res[2]) { unsigned c, pos, left, right, depth, index; if ((pos = Backward(l, l->pos))) { right = GetUtf8(l->buf + pos, l->len - pos).c; if ((left = bestlineMirrorLeft(right))) { depth = 0; index = pos; do { pos = Backward(l, pos); c = GetUtf8(l->buf + pos, l->len - pos).c; if (c == right) { ++depth; } else if (c == left) { if (depth) { --depth; } else { res[0] = pos; res[1] = index; return 0; } } } while (pos); } } return -1; } static int bestlineEditMirrorRight(struct bestlineState *l, int res[2]) { struct rune rune; unsigned pos, left, right, depth, index; pos = l->pos; rune = GetUtf8(l->buf + pos, l->len - pos); left = rune.c; if ((right = bestlineMirrorRight(left))) { depth = 0; index = pos; do { pos += rune.n; rune = GetUtf8(l->buf + pos, l->len - pos); if (rune.c == left) { ++depth; } else if (rune.c == right) { if (depth) { --depth; } else { res[0] = index; res[1] = pos; return 0; } } } while (pos + rune.n < l->len); } return -1; } static int bestlineEditMirror(struct bestlineState *l, int res[2]) { int rc; rc = bestlineEditMirrorLeft(l, res); if (rc == -1) rc = bestlineEditMirrorRight(l, res); return rc; } static void bestlineRefreshLineImpl(struct bestlineState *l, int force) { char *hint; char flipit; char hasflip; char haswides; struct abuf ab; const char *buf; struct rune rune; struct winsize oldsize; int fd, plen, rows, len, pos; unsigned x, xn, yn, width, pwidth; int i, t, cx, cy, tn, resized, flip[2]; /* * synchonize the i/o state */ if (ispaused) { if (force) { bestlineUnpause(l->ofd); } else { return; } } if (!force && HasPendingInput(l->ifd)) { l->dirty = 1; return; } oldsize = l->ws; if ((resized = gotwinch) && rawmode != -1) { gotwinch = 0; l->ws = GetTerminalSize(l->ws, l->ifd, l->ofd); } hasflip = !l->final && !bestlineEditMirror(l, flip); StartOver: fd = l->ofd; buf = l->buf; pos = l->pos; len = l->len; xn = l->ws.ws_col; yn = l->ws.ws_row; plen = strlen(l->prompt); pwidth = GetMonospaceWidth(l->prompt, plen, 0); width = GetMonospaceWidth(buf, len, &haswides); /* * handle the case where the line is larger than the whole display * gnu readline actually isn't able to deal with this situation!!! * we kludge xn to address the edge case of wide chars on the edge */ for (tn = xn - haswides * 2;;) { if (pwidth + width + 1 < tn * yn) break; /* we're fine */ if (!len || width < 2) break; /* we can't do anything */ if (pwidth + 2 > tn * yn) break; /* we can't do anything */ if (pos > len / 2) { /* hide content on the left if we're editing on the right */ rune = GetUtf8(buf, len); buf += rune.n; len -= rune.n; pos -= rune.n; } else { /* hide content on the right if we're editing on left */ t = len; while (len && (buf[len - 1] & 0300) == 0200) --len; if (len) --len; rune = GetUtf8(buf + len, t - len); } if ((t = GetMonospaceCharacterWidth(rune.c)) > 0) { width -= t; } } pos = Max(0, Min(pos, len)); /* * now generate the terminal codes to update the line * * since we support unlimited lines it's important that we don't * clear the screen before we draw the screen. doing that causes * flickering. the key with terminals is to overwrite cells, and * then use \e[K and \e[J to clear everything else. * * we make the assumption that prompts and hints may contain ansi * sequences, but the buffer does not. * * we need to handle the edge case where a wide character like 度 * might be at the edge of the window, when there's one cell left. * so we can't use division based on string width to compute the * coordinates and have to track it as we go. */ cy = -1; cx = -1; rows = 1; abInit(&ab); abAppendw(&ab, '\r'); /* start of line */ if (l->rows - l->oldpos - 1 > 0) { abAppends(&ab, "\033["); abAppendu(&ab, l->rows - l->oldpos - 1); abAppendw(&ab, 'A'); /* cursor up clamped */ } abAppends(&ab, l->prompt); x = pwidth; for (i = 0; i < len; i += rune.n) { rune = GetUtf8(buf + i, len - i); if (x && x + rune.n > xn) { if (cy >= 0) ++cy; if (x < xn) { abAppends(&ab, "\033[K"); /* clear line forward */ } abAppends(&ab, "\r" /* start of line */ "\n"); /* cursor down unclamped */ ++rows; x = 0; } if (i == pos) { cy = 0; cx = x; } if (maskmode) { abAppendw(&ab, '*'); } else { flipit = hasflip && (i == flip[0] || i == flip[1]); if (flipit) abAppends(&ab, "\033[1m"); abAppendw(&ab, EncodeUtf8(rune.c)); if (flipit) abAppends(&ab, "\033[22m"); } t = GetMonospaceCharacterWidth(rune.c); t = Max(0, t); x += t; } if (!l->final && (hint = bestlineRefreshHints(l))) { if (GetMonospaceWidth(hint, strlen(hint), 0) < xn - x) { if (cx < 0) { cx = x; } abAppends(&ab, hint); } free(hint); } abAppendw(&ab, Read32le("\033[J")); /* erase display forwards */ /* * if we are at the very end of the screen with our prompt, we need * to emit a newline and move the prompt to the first column. */ if (pos && pos == len && x >= xn) { abAppendw(&ab, Read32le("\n\r\0")); ++rows; } /* * move cursor to right position */ if (cy > 0) { abAppends(&ab, "\033["); abAppendu(&ab, cy); abAppendw(&ab, 'A'); /* cursor up */ } if (cx > 0) { abAppendw(&ab, Read32le("\r\033[")); abAppendu(&ab, cx); abAppendw(&ab, 'C'); /* cursor right */ } else if (!cx) { abAppendw(&ab, '\r'); /* start */ } /* * now get ready to progress state * we use a mostly correct kludge when the tty resizes */ l->rows = rows; if (resized && oldsize.ws_col > l->ws.ws_col) { resized = 0; abFree(&ab); goto StartOver; } l->dirty = 0; l->oldpos = Max(0, cy); /* * send codes to terminal */ bestlineWrite(fd, ab.b, ab.len); abFree(&ab); } static void bestlineRefreshLine(struct bestlineState *l) { bestlineRefreshLineImpl(l, 0); } static void bestlineRefreshLineForce(struct bestlineState *l) { bestlineRefreshLineImpl(l, 1); } static void bestlineEditInsert(struct bestlineState *l, const char *p, size_t n) { if (!bestlineGrow(l, l->len + n + 1)) return; memmove(l->buf + l->pos + n, l->buf + l->pos, l->len - l->pos); memcpy(l->buf + l->pos, p, n); l->pos += n; l->len += n; l->buf[l->len] = 0; bestlineRefreshLine(l); } static void bestlineEditHome(struct bestlineState *l) { l->pos = 0; bestlineRefreshLine(l); } static void bestlineEditEnd(struct bestlineState *l) { l->pos = l->len; bestlineRefreshLine(l); } static void bestlineEditUp(struct bestlineState *l) { bestlineEditHistoryMove(l,BESTLINE_HISTORY_PREV); } static void bestlineEditDown(struct bestlineState *l) { bestlineEditHistoryMove(l,BESTLINE_HISTORY_NEXT); } static void bestlineEditBof(struct bestlineState *l) { bestlineEditHistoryMove(l,BESTLINE_HISTORY_FIRST); } static void bestlineEditEof(struct bestlineState *l) { bestlineEditHistoryMove(l,BESTLINE_HISTORY_LAST); } static void bestlineEditRefresh(struct bestlineState *l) { bestlineClearScreen(l->ofd); bestlineRefreshLine(l); } static size_t Forward(struct bestlineState *l, size_t pos) { return pos + GetUtf8(l->buf + pos, l->len - pos).n; } static size_t Backwards(struct bestlineState *l, size_t pos, char pred(unsigned)) { size_t i; struct rune r; while (pos) { i = Backward(l, pos); r = GetUtf8(l->buf + i, l->len - i); if (pred(r.c)) { pos = i; } else { break; } } return pos; } static size_t Forwards(struct bestlineState *l, size_t pos, char pred(unsigned)) { struct rune r; while (pos < l->len) { r = GetUtf8(l->buf + pos, l->len - pos); if (pred(r.c)) { pos += r.n; } else { break; } } return pos; } static size_t ForwardWord(struct bestlineState *l, size_t pos) { pos = Forwards(l, pos, bestlineIsSeparator); pos = Forwards(l, pos, bestlineNotSeparator); return pos; } static size_t BackwardWord(struct bestlineState *l, size_t pos) { pos = Backwards(l, pos, bestlineIsSeparator); pos = Backwards(l, pos, bestlineNotSeparator); return pos; } static size_t EscapeWord(struct bestlineState *l, size_t i) { size_t j; struct rune r; for (; i && i < l->len; i += r.n) { if (i < l->len) { r = GetUtf8(l->buf + i, l->len - i); if (bestlineIsSeparator(r.c)) break; } if ((j = i)) { do --j; while (j && (l->buf[j] & 0300) == 0200); r = GetUtf8(l->buf + j, l->len - j); if (bestlineIsSeparator(r.c)) break; } } return i; } static void bestlineEditLeft(struct bestlineState *l) { l->pos = Backward(l, l->pos); bestlineRefreshLine(l); } static void bestlineEditRight(struct bestlineState *l) { if (l->pos == l->len) return; do l->pos++; while (l->pos < l->len && (l->buf[l->pos] & 0300) == 0200); bestlineRefreshLine(l); } static void bestlineEditLeftWord(struct bestlineState *l) { l->pos = BackwardWord(l, l->pos); bestlineRefreshLine(l); } static void bestlineEditRightWord(struct bestlineState *l) { l->pos = ForwardWord(l, l->pos); bestlineRefreshLine(l); } static void bestlineEditLeftExpr(struct bestlineState *l) { int mark[2]; l->pos = Backwards(l, l->pos, bestlineIsXeparator); if (!bestlineEditMirrorLeft(l, mark)) { l->pos = mark[0]; } else { l->pos = Backwards(l, l->pos, bestlineNotSeparator); } bestlineRefreshLine(l); } static void bestlineEditRightExpr(struct bestlineState *l) { int mark[2]; l->pos = Forwards(l, l->pos, bestlineIsXeparator); if (!bestlineEditMirrorRight(l, mark)) { l->pos = Forward(l, mark[1]); } else { l->pos = Forwards(l, l->pos, bestlineNotSeparator); } bestlineRefreshLine(l); } static void bestlineEditDelete(struct bestlineState *l) { size_t i; if (l->pos == l->len) return; i = Forward(l, l->pos); memmove(l->buf+l->pos, l->buf+i, l->len-i+1); l->len -= i - l->pos; bestlineRefreshLine(l); } static void bestlineEditRubout(struct bestlineState *l) { size_t i; if (!l->pos) return; i = Backward(l, l->pos); memmove(l->buf+i, l->buf+l->pos, l->len-l->pos+1); l->len -= l->pos - i; l->pos = i; bestlineRefreshLine(l); } static void bestlineEditDeleteWord(struct bestlineState *l) { size_t i; if (l->pos == l->len) return; i = ForwardWord(l, l->pos); bestlineRingPush(l->buf + l->pos, i - l->pos); memmove(l->buf + l->pos, l->buf + i, l->len - i + 1); l->len -= i - l->pos; bestlineRefreshLine(l); } static void bestlineEditRuboutWord(struct bestlineState *l) { size_t i; if (!l->pos) return; i = BackwardWord(l, l->pos); bestlineRingPush(l->buf + i, l->pos - i); memmove(l->buf + i, l->buf + l->pos, l->len - l->pos + 1); l->len -= l->pos - i; l->pos = i; bestlineRefreshLine(l); } static void bestlineEditXlatWord(struct bestlineState *l, unsigned xlat(unsigned)) { unsigned c; size_t i, j; struct rune r; struct abuf ab; abInit(&ab); i = Forwards(l, l->pos, bestlineIsSeparator); for (j = i; j < l->len; j += r.n) { r = GetUtf8(l->buf + j, l->len - j); if (bestlineIsSeparator(r.c)) break; if ((c = xlat(r.c)) != r.c) { abAppendw(&ab, EncodeUtf8(c)); } else { /* avoid canonicalization */ abAppend(&ab, l->buf + j, r.n); } } if (ab.len && bestlineGrow(l, i + ab.len + l->len - j + 1)) { l->pos = i + ab.len; abAppend(&ab, l->buf + j, l->len - j); l->len = i + ab.len; memcpy(l->buf + i, ab.b, ab.len + 1); bestlineRefreshLine(l); } abFree(&ab); } static void bestlineEditLowercaseWord(struct bestlineState *l) { bestlineEditXlatWord(l, bestlineLowercase); } static void bestlineEditUppercaseWord(struct bestlineState *l) { bestlineEditXlatWord(l, bestlineUppercase); } static void bestlineEditCapitalizeWord(struct bestlineState *l) { iscapital = 0; bestlineEditXlatWord(l, Capitalize); } static void bestlineEditKillLeft(struct bestlineState *l) { size_t diff, old_pos; bestlineRingPush(l->buf, l->pos); old_pos = l->pos; l->pos = 0; diff = old_pos - l->pos; memmove(l->buf+l->pos,l->buf+old_pos,l->len-old_pos+1); l->len -= diff; bestlineRefreshLine(l); } static void bestlineEditKillRight(struct bestlineState *l) { bestlineRingPush(l->buf + l->pos, l->len - l->pos); l->buf[l->pos] = '\0'; l->len = l->pos; bestlineRefreshLine(l); } static void bestlineEditYank(struct bestlineState *l) { char *p; size_t n; if (!ring.p[ring.i]) return; n = strlen(ring.p[ring.i]); if (!bestlineGrow(l, l->len + n + 1)) return; if (!(p = (char *)malloc(l->len - l->pos + 1))) return; memcpy(p, l->buf + l->pos, l->len - l->pos + 1); memcpy(l->buf + l->pos, ring.p[ring.i], n); memcpy(l->buf + l->pos + n, p, l->len - l->pos + 1); free(p); l->yi = l->pos; l->yj = l->pos + n; l->pos += n; l->len += n; bestlineRefreshLine(l); } static void bestlineEditRotate(struct bestlineState *l) { if ((l->seq[1][0] == Ctrl('Y') || (l->seq[1][0] == 033 && l->seq[1][1] == 'y'))) { if (l->yi < l->len && l->yj <= l->len) { memmove(l->buf + l->yi, l->buf + l->yj, l->len - l->yj + 1); l->len -= l->yj - l->yi; l->pos -= l->yj - l->yi; } bestlineRingRotate(); bestlineEditYank(l); } } static void bestlineEditTranspose(struct bestlineState *l) { char *q, *p; size_t a, b, c; b = l->pos; if (b == l->len) --b; a = Backward(l, b); c = Forward(l, b); if (!(a < b && b < c)) return; p = q = (char *)malloc(c - a); p = Copy(p, l->buf + b, c - b); p = Copy(p, l->buf + a, b - a); assert((size_t)(p - q) == c - a); memcpy(l->buf + a, q, p - q); l->pos = c; free(q); bestlineRefreshLine(l); } static void bestlineEditTransposeWords(struct bestlineState *l) { char *q, *p; size_t i, pi, xi, xj, yi, yj; i = l->pos; if (i == l->len) { i = Backwards(l, i, bestlineIsSeparator); i = Backwards(l, i, bestlineNotSeparator); } pi = EscapeWord(l, i); xj = Backwards(l, pi, bestlineIsSeparator); xi = Backwards(l, xj, bestlineNotSeparator); yi = Forwards(l, pi, bestlineIsSeparator); yj = Forwards(l, yi, bestlineNotSeparator); if (!(xi < xj && xj < yi && yi < yj)) return; p = q = (char *)malloc(yj - xi); p = Copy(p, l->buf + yi, yj - yi); p = Copy(p, l->buf + xj, yi - xj); p = Copy(p, l->buf + xi, xj - xi); assert((size_t)(p - q) == yj - xi); memcpy(l->buf + xi, q, p - q); l->pos = yj; free(q); bestlineRefreshLine(l); } static void bestlineEditSqueeze(struct bestlineState *l) { size_t i, j; i = Backwards(l, l->pos, bestlineIsSeparator); j = Forwards(l, l->pos, bestlineIsSeparator); if (!(i < j)) return; memmove(l->buf + i, l->buf + j, l->len - j + 1); l->len -= j - i; l->pos = i; bestlineRefreshLine(l); } static void bestlineEditMark(struct bestlineState *l) { l->mark = l->pos; } static void bestlineEditGoto(struct bestlineState *l) { if (l->mark > l->len) return; l->pos = Min(l->mark, l->len); bestlineRefreshLine(l); } static size_t bestlineEscape(char *d, const char *s, size_t n) { char *p; size_t i; unsigned c, w, l; for (p = d, l = i = 0; i < n; ++i) { switch ((c = s[i] & 255)) { Case('\a', w = Read16le("\\a")); Case('\b', w = Read16le("\\b")); Case('\t', w = Read16le("\\t")); Case('\n', w = Read16le("\\n")); Case('\v', w = Read16le("\\v")); Case('\f', w = Read16le("\\f")); Case('\r', w = Read16le("\\r")); Case('"', w = Read16le("\\\"")); Case('\'', w = Read16le("\\\'")); Case('\\', w = Read16le("\\\\")); default: if (c <= 0x1F || c == 0x7F || (c == '?' && l == '?')) { w = Read16le("\\x"); w |= "0123456789abcdef"[(c & 0xF0) >> 4] << 020; w |= "0123456789abcdef"[(c & 0x0F) >> 0] << 030; } else { w = c; } break; } p[0] = (w & 0x000000ff) >> 000; p[1] = (w & 0x0000ff00) >> 010; p[2] = (w & 0x00ff0000) >> 020; p[3] = (w & 0xff000000) >> 030; p += (Bsr(w) >> 3) + 1; l = w; } return p - d; } static void bestlineEditInsertEscape(struct bestlineState *l) { size_t m; ssize_t n; char seq[16]; char esc[sizeof(seq) * 4]; if ((n = bestlineRead(l->ifd, seq, sizeof(seq), l)) > 0) { m = bestlineEscape(esc, seq, n); bestlineEditInsert(l, esc, m); } } static void bestlineEditInterrupt(void) { gotint = SIGINT; } static void bestlineEditQuit(void) { gotint = SIGQUIT; } static void bestlineEditSuspend(void) { raise(SIGSTOP); } static void bestlineEditPause(struct bestlineState *l) { tcflow(l->ofd, TCOOFF); ispaused = 1; } static void bestlineEditCtrlq(struct bestlineState *l) { if (ispaused) { bestlineUnpause(l->ofd); bestlineRefreshLineForce(l); } else { bestlineEditInsertEscape(l); } } /** * Moves last item inside current s-expression to outside, e.g. * * (a| b c) * (a| b) c * * The cursor position changes only if a paren is moved before it: * * (a b c |) * (a b) c | * * To accommodate non-LISP languages we connect unspaced outer symbols: * * f(a,| b, g()) * f(a,| b), g() * * Our standard keybinding is ALT-SHIFT-B. */ static void bestlineEditBarf(struct bestlineState *l) { struct rune r; unsigned long w; size_t i, pos, depth = 0; unsigned lhs, rhs, end, *stack = 0; /* go as far right within current s-expr as possible */ for (pos = l->pos;; pos += r.n) { if (pos == l->len) goto Finish; r = GetUtf8(l->buf + pos, l->len - pos); if (depth) { if (r.c == stack[depth - 1]) { --depth; } } else { if ((rhs = bestlineMirrorRight(r.c))) { stack = (unsigned *)realloc(stack, ++depth * sizeof(*stack)); stack[depth - 1] = rhs; } else if (bestlineMirrorLeft(r.c)) { end = pos; break; } } } /* go back one item */ pos = Backwards(l, pos, bestlineIsXeparator); for (;; pos = i) { if (!pos) goto Finish; i = Backward(l, pos); r = GetUtf8(l->buf + i, l->len - i); if (depth) { if (r.c == stack[depth - 1]) { --depth; } } else { if ((lhs = bestlineMirrorLeft(r.c))) { stack = (unsigned *)realloc(stack, ++depth * sizeof(*stack)); stack[depth - 1] = lhs; } else if (bestlineIsSeparator(r.c)) { break; } } } pos = Backwards(l, pos, bestlineIsXeparator); /* now move the text */ r = GetUtf8(l->buf + end, l->len - end); memmove(l->buf + pos + r.n, l->buf + pos, end - pos); w = EncodeUtf8(r.c); for (i = 0; i < r.n; ++i) { l->buf[pos + i] = w; w >>= 8; } if (l->pos > pos) { l->pos += r.n; } bestlineRefreshLine(l); Finish: free(stack); } /** * Moves first item outside current s-expression to inside, e.g. * * (a| b) c d * (a| b c) d * * To accommodate non-LISP languages we connect unspaced outer symbols: * * f(a,| b), g() * f(a,| b, g()) * * Our standard keybinding is ALT-SHIFT-S. */ static void bestlineEditSlurp(struct bestlineState *l) { char rp[6]; struct rune r; size_t pos, depth = 0; unsigned rhs, point = 0, start = 0, *stack = 0; /* go to outside edge of current s-expr */ for (pos = l->pos; pos < l->len; pos += r.n) { r = GetUtf8(l->buf + pos, l->len - pos); if (depth) { if (r.c == stack[depth - 1]) { --depth; } } else { if ((rhs = bestlineMirrorRight(r.c))) { stack = (unsigned *)realloc(stack, ++depth * sizeof(*stack)); stack[depth - 1] = rhs; } else if (bestlineMirrorLeft(r.c)) { point = pos; pos += r.n; start = pos; break; } } } /* go forward one item */ pos = Forwards(l, pos, bestlineIsXeparator); for (; pos < l->len ; pos += r.n) { r = GetUtf8(l->buf + pos, l->len - pos); if (depth) { if (r.c == stack[depth - 1]) { --depth; } } else { if ((rhs = bestlineMirrorRight(r.c))) { stack = (unsigned *)realloc(stack, ++depth * sizeof(*stack)); stack[depth - 1] = rhs; } else if (bestlineIsSeparator(r.c)) { break; } } } /* now move the text */ memcpy(rp, l->buf + point, start - point); memmove(l->buf + point, l->buf + start, pos - start); memcpy(l->buf + pos - (start - point), rp, start - point); bestlineRefreshLine(l); free(stack); } static void bestlineEditRaise(struct bestlineState *l) { (void)l; } /** * Runs bestline engine. * * This function is the core of the line editing capability of bestline. * It expects 'fd' to be already in "raw mode" so that every key pressed * will be returned ASAP to read(). * * The resulting string is put into 'buf' when the user type enter, or * when ctrl+d is typed. * * Returns chomped character count in buf >=0 or -1 on eof / error */ static ssize_t bestlineEdit(int stdin_fd, int stdout_fd, const char *prompt, char **obuf) { ssize_t rc; size_t nread; struct rune rune; char *p, seq[16]; unsigned long long w; struct bestlineState l; memset(&l,0,sizeof(l)); if (!(l.buf = (char *)malloc((l.buflen = 32)))) return -1; l.buf[0] = 0; l.ifd = stdin_fd; l.ofd = stdout_fd; l.prompt = prompt ? prompt : ""; l.ws = GetTerminalSize(l.ws,l.ifd,l.ofd); bestlineHistoryAdd(""); bestlineWriteStr(l.ofd,l.prompt); while (1) { if (l.dirty) bestlineRefreshLineForce(&l); rc = bestlineRead(l.ifd,seq,sizeof(seq),&l); if (rc > 0) { if (seq[0] == Ctrl('R')) { rc = bestlineSearch(&l,seq,sizeof(seq)); if (!rc) continue; } else if (seq[0] == '\t' && completionCallback) { rc = bestlineCompleteLine(&l,seq,sizeof(seq)); if (!rc) continue; } } if (rc > 0) { nread = rc; } else if (!rc && l.len) { nread = 1; seq[0] = '\r'; seq[1] = 0; } else { free(history[--historylen]); history[historylen] = 0; free(l.buf); return -1; } switch (seq[0]) { Case(Ctrl('P'), bestlineEditUp(&l)); Case(Ctrl('E'), bestlineEditEnd(&l)); Case(Ctrl('N'), bestlineEditDown(&l)); Case(Ctrl('A'), bestlineEditHome(&l)); Case(Ctrl('B'), bestlineEditLeft(&l)); Case(Ctrl('@'), bestlineEditMark(&l)); Case(Ctrl('Y'), bestlineEditYank(&l)); Case(Ctrl('Q'), bestlineEditCtrlq(&l)); Case(Ctrl('F'), bestlineEditRight(&l)); Case(Ctrl('\\'), bestlineEditQuit()); Case(Ctrl('S'), bestlineEditPause(&l)); Case(Ctrl('?'), bestlineEditRubout(&l)); Case(Ctrl('H'), bestlineEditRubout(&l)); Case(Ctrl('L'), bestlineEditRefresh(&l)); Case(Ctrl('Z'), bestlineEditSuspend()); Case(Ctrl('U'), bestlineEditKillLeft(&l)); Case(Ctrl('T'), bestlineEditTranspose(&l)); Case(Ctrl('K'), bestlineEditKillRight(&l)); Case(Ctrl('W'), bestlineEditRuboutWord(&l)); case Ctrl('C'): if (bestlineRead(l.ifd,seq,sizeof(seq),&l) != 1) break; switch (seq[0]) { Case(Ctrl('C'), bestlineEditInterrupt()); Case(Ctrl('B'), bestlineEditBarf(&l)); Case(Ctrl('S'), bestlineEditSlurp(&l)); Case(Ctrl('R'), bestlineEditRaise(&l)); default: break; } break; case Ctrl('X'): if (l.seq[1][0] == Ctrl('X')) { bestlineEditGoto(&l); } break; case Ctrl('D'): if (l.len) { bestlineEditDelete(&l); } else { free(history[--historylen]); history[historylen] = 0; free(l.buf); return -1; } break; case '\r': l.final = 1; free(history[--historylen]); history[historylen] = 0; bestlineEditEnd(&l); bestlineRefreshLineForce(&l); if ((p = (char *)realloc(l.buf, l.len + 1))) l.buf = p; *obuf = l.buf; return l.len; case 033: if (nread < 2) break; switch (seq[1]) { Case('<', bestlineEditBof(&l)); Case('>', bestlineEditEof(&l)); Case('B', bestlineEditBarf(&l)); Case('S', bestlineEditSlurp(&l)); Case('R', bestlineEditRaise(&l)); Case('y', bestlineEditRotate(&l)); Case('\\', bestlineEditSqueeze(&l)); Case('b', bestlineEditLeftWord(&l)); Case('f', bestlineEditRightWord(&l)); Case('h', bestlineEditRuboutWord(&l)); Case('d', bestlineEditDeleteWord(&l)); Case('l', bestlineEditLowercaseWord(&l)); Case('u', bestlineEditUppercaseWord(&l)); Case('c', bestlineEditCapitalizeWord(&l)); Case('t', bestlineEditTransposeWords(&l)); Case(Ctrl('B'), bestlineEditLeftExpr(&l)); Case(Ctrl('F'), bestlineEditRightExpr(&l)); Case(Ctrl('H'), bestlineEditRuboutWord(&l)); case '[': if (nread < 3) break; if (seq[2] >= '0' && seq[2] <= '9') { if (nread < 4) break; if (seq[3] == '~') { switch (seq[2]) { Case('1', bestlineEditHome(&l)); /* \e[1~ */ Case('3', bestlineEditDelete(&l)); /* \e[3~ */ Case('4', bestlineEditEnd(&l)); /* \e[4~ */ default: break; } } } else { switch (seq[2]) { Case('A', bestlineEditUp(&l)); Case('B', bestlineEditDown(&l)); Case('C', bestlineEditRight(&l)); Case('D', bestlineEditLeft(&l)); Case('H', bestlineEditHome(&l)); Case('F', bestlineEditEnd(&l)); default: break; } } break; case 'O': if (nread < 3) break; switch (seq[2]) { Case('A', bestlineEditUp(&l)); Case('B', bestlineEditDown(&l)); Case('C', bestlineEditRight(&l)); Case('D', bestlineEditLeft(&l)); Case('H', bestlineEditHome(&l)); Case('F', bestlineEditEnd(&l)); default: break; } break; case 033: if (nread < 3) break; switch (seq[2]) { case '[': if (nread < 4) break; switch (seq[3]) { Case('C', bestlineEditRightExpr(&l)); /* \e\e[C alt-right */ Case('D', bestlineEditLeftExpr(&l)); /* \e\e[D alt-left */ default: break; } break; case 'O': if (nread < 4) break; switch (seq[3]) { Case('C', bestlineEditRightExpr(&l)); /* \e\eOC alt-right */ Case('D', bestlineEditLeftExpr(&l)); /* \e\eOD alt-left */ default: break; } break; default: break; } break; default: break; } break; default: if (!IsControl(seq[0])) { /* only sees canonical c0 */ if (xlatCallback) { rune = GetUtf8(seq,nread); w = EncodeUtf8(xlatCallback(rune.c)); nread = 0; do { seq[nread++] = w; } while ((w >>= 8)); } bestlineEditInsert(&l,seq,nread); } break; } } } void bestlineFree(void *ptr) { free(ptr); } void bestlineHistoryFree(void) { size_t i; for (i = 0; i < BESTLINE_MAX_HISTORY; i++) { if (history[i]) { free(history[i]); history[i] = 0; } } historylen = 0; } static void bestlineAtExit(void) { bestlineDisableRawMode(); bestlineHistoryFree(); bestlineRingFree(); } int bestlineHistoryAdd(const char *line) { char *linecopy; if (!BESTLINE_MAX_HISTORY) return 0; if (historylen && !strcmp(history[historylen-1], line)) return 0; if (!(linecopy = strdup(line))) return 0; if (historylen == BESTLINE_MAX_HISTORY) { free(history[0]); memmove(history,history+1,sizeof(char*)*(BESTLINE_MAX_HISTORY-1)); historylen--; } history[historylen++] = linecopy; return 1; } /** * Saves line editing history to file. * * @return 0 on success, or -1 w/ errno */ int bestlineHistorySave(const char *filename) { FILE *fp; unsigned j; mode_t old_umask; old_umask = umask(S_IXUSR|S_IRWXG|S_IRWXO); fp = fopen(filename,"w"); umask(old_umask); if (!fp) return -1; chmod(filename,S_IRUSR|S_IWUSR); for (j = 0; j < historylen; j++) { fputs(history[j],fp); fputc('\n',fp); } fclose(fp); return 0; } /** * Loads history from the specified file. * * If the file doesn't exist, zero is returned and this will do nothing. * If the file does exists and the operation succeeded zero is returned * otherwise on error -1 is returned. * * @return 0 on success, or -1 w/ errno */ int bestlineHistoryLoad(const char *filename) { char **h; int rc, fd, err; size_t i, j, k, n, t; char *m, *e, *p, *q, *f, *s; err = errno, rc = 0; if (!BESTLINE_MAX_HISTORY) return 0; if (!(h = (char**)calloc(2*BESTLINE_MAX_HISTORY,sizeof(char*)))) return -1; if ((fd = open(filename,O_RDONLY)) != -1) { if ((n = GetFdSize(fd))) { if ((m = (char *)mmap(0,n,PROT_READ,MAP_SHARED,fd,0))!=MAP_FAILED) { for (i = 0, e = (p = m) + n; p < e; p = f + 1) { if (!(q = (char *)memchr(p, '\n', e - p))) q = e; for (f = q; q > p; --q) { if (q[-1] != '\n' && q[-1] != '\r') break; } if (q > p) { h[i * 2 + 0] = p; h[i * 2 + 1] = q; i = (i + 1) % BESTLINE_MAX_HISTORY; } } bestlineHistoryFree(); for (j = 0; j < BESTLINE_MAX_HISTORY; ++j) { if (h[(k = (i + j) % BESTLINE_MAX_HISTORY) * 2]) { if ((s = (char *)malloc((t=h[k*2+1]-h[k*2])+1))) { memcpy(s,h[k*2],t),s[t]=0; history[historylen++] = s; } } } munmap(m,n); } else { rc = -1; } } close(fd); } else if (errno == ENOENT) { errno = err; } else { rc = -1; } free(h); return rc; } /** * Reads line interactively. * * This function can be used instead of bestline() in cases where we * know for certain we're dealing with a terminal, which means we can * avoid linking any stdio code. * * @return chomped allocated string of read line or null on eof/error */ char *bestlineRaw(const char *prompt, int infd, int outfd) { char *buf; ssize_t rc; static char once; struct sigaction sa[3]; if (!once) atexit(bestlineAtExit), once = 1; if (enableRawMode(infd) == -1) return 0; buf = 0; gotint = 0; sigemptyset(&sa->sa_mask); sa->sa_flags = 0; sa->sa_handler = bestlineOnInt; sigaction(SIGINT,sa,sa+1); sigaction(SIGQUIT,sa,sa+2); rc = bestlineEdit(infd,outfd,prompt,&buf); bestlineDisableRawMode(); sigaction(SIGQUIT,sa+2,0); sigaction(SIGINT,sa+1,0); if (gotint) { free(buf); buf = 0; raise(gotint); errno = EINTR; rc = -1; } if (rc != -1) { bestlineWriteStr(outfd,"\n"); return buf; } else { free(buf); return 0; } } /** * Reads line intelligently. * * The high level function that is the main API of the bestline library. * This function checks if the terminal has basic capabilities, just checking * for a blacklist of inarticulate terminals, and later either calls the line * editing function or uses dummy fgets() so that you will be able to type * something even in the most desperate of the conditions. * * @param prompt is printed before asking for input if we have a term * and this may be set to empty or null to disable and prompt may * contain ansi escape sequences, color, utf8, etc. * @return chomped allocated string of read line or null on eof/error */ char *bestline(const char *prompt) { if (prompt && *prompt && (strchr(prompt, '\n') || strchr(prompt, '\t') || strchr(prompt + 1, '\r'))) { errno = EINVAL; return 0; } if ((!isatty(fileno(stdin)) || !isatty(fileno(stdout)))) { if (prompt && *prompt && (IsCharDev(fileno(stdin)) && IsCharDev(fileno(stdout)))) { fputs(prompt,stdout); fflush(stdout); } return GetLine(stdin, stdout); } else if (bestlineIsUnsupportedTerm()) { if (prompt && *prompt) { fputs(prompt,stdout); fflush(stdout); } return GetLine(stdin, stdout); } else { fflush(stdout); return bestlineRaw(prompt,fileno(stdin),fileno(stdout)); } } /** * Reads line intelligently w/ history, e.g. * * // see ~/.foo_history * main() { * char *line; * while ((line = bestlineWithHistory("IN> ", "foo"))) { * printf("OUT> %s\n", line); * free(line); * } * } * * @param prompt is printed before asking for input if we have a term * and this may be set to empty or null to disable and prompt may * contain ansi escape sequences, color, utf8, etc. * @param prog is name of your app, used to generate history filename * however if it contains a slash / dot then we'll assume prog is * the history filename which as determined by the caller * @return chomped allocated string of read line or null on eof/error */ char *bestlineWithHistory(const char *prompt, const char *prog) { char *line; struct abuf path; const char *a, *b; abInit(&path); if (prog) { if (strchr(prog, '/') || strchr(prog, '.')) { abAppends(&path, prog); } else { b = ""; if (!(a = getenv("HOME"))) { if (!(a = getenv("HOMEDRIVE")) || !(b = getenv("HOMEPATH"))) { a = ""; } } if (*a) { abAppends(&path, a); abAppends(&path, b); abAppendw(&path, '/'); } abAppendw(&path, '.'); abAppends(&path, prog); abAppends(&path, "_history"); } } if (path.len) { bestlineHistoryLoad(path.b); } line = bestline(prompt); if (path.len && line && *line) { /* history here is inefficient but helpful when the user has multiple * repls open at the same time, so history propagates between them */ bestlineHistoryLoad(path.b); bestlineHistoryAdd(line); bestlineHistorySave(path.b); } abFree(&path); return line; } /** * Registers tab completion callback. */ void bestlineSetCompletionCallback(bestlineCompletionCallback *fn) { completionCallback = fn; } /** * Registers hints callback. * * Register a hits function to be called to show hits to the user at the * right of the prompt. */ void bestlineSetHintsCallback(bestlineHintsCallback *fn) { hintsCallback = fn; } /** * Sets free hints callback. * * This registers a function to free the hints returned by the hints * callback registered with bestlineSetHintsCallback(). */ void bestlineSetFreeHintsCallback(bestlineFreeHintsCallback *fn) { freeHintsCallback = fn; } /** * Sets character translation callback. */ void bestlineSetXlatCallback(bestlineXlatCallback *fn) { xlatCallback = fn; } /** * Adds completion. * * This function is used by the callback function registered by the user * in order to add completion options given the input string when the * user typed . See the example.c source code for a very easy to * understand example. */ void bestlineAddCompletion(bestlineCompletions *lc, const char *str) { size_t len; char *copy, **cvec; if ((copy = (char *)malloc((len = strlen(str))+1))) { memcpy(copy,str,len+1); if ((cvec = (char **)realloc(lc->cvec,(lc->len+1)*sizeof(*lc->cvec)))) { lc->cvec = cvec; lc->cvec[lc->len++] = copy; } else { free(copy); } } } /** * Frees list of completion option populated by bestlineAddCompletion(). */ void bestlineFreeCompletions(bestlineCompletions *lc) { size_t i; for (i = 0; i < lc->len; i++) free(lc->cvec[i]); if (lc->cvec) free(lc->cvec); } /** * Enables "mask mode". * * When it is enabled, instead of the input that the user is typing, the * terminal will just display a corresponding number of asterisks, like * "****". This is useful for passwords and other secrets that should * not be displayed. * * @see bestlineMaskModeDisable() */ void bestlineMaskModeEnable(void) { maskmode = 1; } /** * Disables "mask mode". */ void bestlineMaskModeDisable(void) { maskmode = 0; } muon-v0.4.0/subprojects/bestline/.gitignore0000644000175000017500000000016514753102770020007 0ustar buildbuild*.o ape.lds history.txt cosmopolitan.h cosmopolitan.a bestline_example bestline_example.com bestline_example.com.dbg muon-v0.4.0/subprojects/meson-docs.wrap0000644000175000017500000000033514753102770017153 0ustar buildbuild; SPDX-FileCopyrightText: Stone Tickle ; SPDX-License-Identifier: GPL-3.0-only [wrap-git] url = https://github.com/muon-build/meson-docs revision = 5bc0b250984722389419dccb529124aed7615583 depth = 1 muon-v0.4.0/subprojects/.gitignore0000644000175000017500000000047114753102770016202 0ustar buildbuild# SPDX-FileCopyrightText: Stone Tickle # SPDX-License-Identifier: GPL-3.0-only * !*.wrap !.gitignore !bestline !bestline/README.md !bestline/bestline.c !bestline/bestline.h !bestline/meson.build !tinyjson !tinyjson/tiny-json.c !tinyjson/tiny-json.h !tinyjson/meson.build !tinyjson/README.md muon-v0.4.0/subprojects/meson-docs/0002755000175000017500000000000014753103257016262 5ustar buildbuildmuon-v0.4.0/subprojects/meson-docs/docs/0002755000175000017500000000000014737503617017220 5ustar buildbuildmuon-v0.4.0/subprojects/meson-docs/docs/yaml/0002755000175000017500000000000014737503617020162 5ustar buildbuildmuon-v0.4.0/subprojects/meson-docs/docs/yaml/builtins/0002755000175000017500000000000014737503617022013 5ustar buildbuildmuon-v0.4.0/subprojects/meson-docs/docs/yaml/builtins/meson.yaml0000644000175000017500000004645514737503617024034 0ustar buildbuildname: meson long_name: Meson object description: | The `meson` object allows you to introspect various properties of the system. This object is always mapped in the `meson` variable. methods: - name: add_dist_script returns: void since: 0.48.0 description: | Causes the script given as argument to run during `dist` operation after the distribution source has been generated but before it is archived. Note that this runs the script file that is in the _staging_ directory, not the one in the source directory. If the script file cannot be found in the staging directory, it is a hard error. The `MESON_DIST_ROOT` environment variables is set when dist scripts is run. *(since 0.54.0)* The `MESON_SOURCE_ROOT` and `MESON_BUILD_ROOT` environment variables are set when dist scripts are run. They are path to the root source and build directory of the main project, even when the script comes from a subproject. *(since 0.58.0)* This command can be invoked from a subproject, it was a hard error in earlier versions. Subproject dist scripts will only be executed when running `meson dist --include-subprojects`. `MESON_PROJECT_SOURCE_ROOT`, `MESON_PROJECT_BUILD_ROOT` and `MESON_PROJECT_DIST_ROOT` environment variables are set when dist scripts are run. They are identical to `MESON_SOURCE_ROOT`, `MESON_BUILD_ROOT` and `MESON_DIST_ROOT` for main project scripts, but for subproject scripts they have the path to the root of the subproject appended, usually `subprojects/`. *(since 1.4.0)* The `MESONREWRITE` environment variable contains the path to the rewrite command that corresponds to the `meson` executable that was used to configure the build. (This might be a different path than the first executable found in `PATH`.) It can be used to remove or replace any [[run_command]] that depends on the revision control system from the build configuration. Note that the value will contain many parts. For example, it may be `python3 /path/to/meson.py introspect`. The user is responsible for splitting the string to an array if needed by splitting lexically like a UNIX shell would. If your script uses Python, `shlex.split()` is the easiest correct way to do this. posargs: script_name: type: str | file | external_program description: | The script to execute. *(since 0.55.0)* The output of [[find_program]] as well as strings are accepted. *(since 0.57.0)* [[@file]] objects and the output of [[configure_file]] may be used. varargs: name: arg type: str | file | external_program since: 0.49.0 description: | Additional arguments *(since 0.55.0)* The output of [[configure_file]], [[files]], and [[find_program]] as well as strings are accepted. - name: add_install_script returns: void description: | Causes the script given as an argument to be run during the install step, this script will have the environment variables `MESON_SOURCE_ROOT`, `MESON_BUILD_ROOT`, `MESON_INSTALL_PREFIX`, `MESON_INSTALL_DESTDIR_PREFIX`, and `MESONINTROSPECT` set. All positional arguments are passed as parameters. *(since 0.54.0)* If `meson install` is called with the `--quiet` option, the environment variable `MESON_INSTALL_QUIET` will be set. *(since 1.1.0)* If `meson install` is called with the `--dry-run` option, the environment variable `MESON_INSTALL_DRY_RUN` will be set. Meson uses the `DESTDIR` environment variable as set by the inherited environment to determine the (temporary) installation location for files. Your install script must be aware of this while manipulating and installing files. The correct way to handle this is with the `MESON_INSTALL_DESTDIR_PREFIX` variable which is always set and contains `DESTDIR` (if set) and `prefix` joined together. This is useful because both are usually absolute paths and there are platform-specific edge-cases in joining two absolute paths. In case it is needed, `MESON_INSTALL_PREFIX` is also always set and has the value of the `prefix` option passed to Meson. `MESONINTROSPECT` contains the path to the introspect command that corresponds to the `meson` executable that was used to configure the build. (This might be a different path than the first executable found in `PATH`.) It can be used to query build configuration. Note that the value will contain many parts, f.ex., it may be `python3 /path/to/meson.py introspect`. The user is responsible for splitting the string to an array if needed by splitting lexically like a UNIX shell would. If your script uses Python, `shlex.split()` is the easiest correct way to do this. posargs: script_name: type: str | file | external_program | exe description: | The script to execute. *(since 0.55.0)* The output of [[find_program]], [[executable]], [[custom_target]], as well as strings are accepted. *(since 0.57.0)* [[@file]] objects and the output of [[configure_file]] may be used. varargs: name: arg type: str | file | external_program | exe | custom_tgt | custom_idx since: 0.49.0 description: | Additional arguments *(since 0.55.0)* The output of [[find_program]], [[executable]], [[custom_target]], as well as strings are accepted. kwargs: skip_if_destdir: type: bool since: 0.57.0 default: false description: | If `true` the script will not be run if DESTDIR is set during installation. This is useful in the case the script updates system wide cache that is only needed when copying files into final destination. install_tag: type: str since: 0.60.0 description: | A string used by the `meson install --tags` command to install only a subset of the files. By default the script has no install tag which means it is not being run when `meson install --tags` argument is specified. dry_run: type: bool since: 1.1.0 default: false description: | If `true` the script will be run even if `--dry-run` option is provided to the `meson install` command. The script can use the `MESON_INSTALL_DRY_RUN` variable to determine if it is in dry run mode or not. - name: add_postconf_script returns: void description: | Runs the given command after all project files have been generated. This script will have the environment variables `MESON_SOURCE_ROOT` and `MESON_BUILD_ROOT` set. posargs_inherit: meson.add_dist_script varargs_inherit: meson.add_dist_script - name: backend returns: str since: 0.37.0 description: | Returns a string representing the current backend: - `ninja` - `vs2010` - `vs2012` - `vs2013` - `vs2015` - `vs2017` - `vs2019` - `vs2022` - `xcode` - name: build_options returns: str since: 1.1.0 description: | Returns a string with the configuration line used to set the current project up. notes: - | **Do not try to parse this string!** You should use [[cfg_data.set_quoted]] to safely escape any embedded quotes prior to storing it into e.g. a C header macro. The contents returned by this function are the same as the "Build Options:" line reported in `/meson-logs/meson-log.txt`. - name: build_root returns: str deprecated: 0.56.0 description: | Returns a string with the absolute path to the build root directory. This function will return the build root of the parent project if called from a subproject, which is usually not what you want. Try using [[meson.current_build_dir]] or [[meson.project_build_root]]. In the rare cases where the root of the main project is needed, use [[meson.global_build_root]] that has the same behaviour but with a more explicit name. - name: source_root returns: str deprecated: 0.56.0 description: | Returns a string with the absolute path to the source root directory. This function will return the source root of the parent project if called from a subproject, which is usually not what you want. Try using [[meson.current_source_dir]] or [[meson.project_source_root]]. In the rare cases where the root of the main project is needed, use [[meson.global_source_root]] that has the same behaviour but with a more explicit name. notes: - | You should use the [[files]] function to refer to files in the root source directory instead of constructing paths manually with [[meson.source_root]]. - name: project_build_root returns: str since: 0.56.0 description: Returns a string with the absolute path to the build root directory of the current (sub)project. - name: project_source_root returns: str since: 0.56.0 description: Returns a string with the absolute path to the source root directory of the current (sub)project. - name: global_build_root returns: str since: 0.58.0 description: | Returns a string with the absolute path to the build root directory. This function will return the build root of the main project if called from a subproject, which is usually not what you want. It is usually preferable to use [[meson.current_build_dir]] or [[meson.project_build_root]]. - name: global_source_root returns: str since: 0.58.0 description: | Returns a string with the absolute path to the source root directory. This function will return the source root of the main project if called from a subproject, which is usually not what you want. It is usually preferable to use [[meson.current_source_dir]] or [[meson.project_source_root]]. - name: current_build_dir returns: str description: Returns a string with the absolute path to the current build directory. - name: current_source_dir returns: str description: Returns a string to the current source directory. notes: - | **You do not need to use this function!** When passing files from the current source directory to a function since that is the default. Also, you can use the [[files]] function to refer to files in the current or any other source directory instead of constructing paths manually with [[meson.current_source_dir]]. - name: get_compiler returns: compiler description: Returns a [[@compiler]] object describing a compiler. posargs: language: type: str description: | The language of the compiler to return. See our [list of supported languages](Reference-tables.md#language-arguments-parameter-names). kwargs: native: type: bool default: false description: | When set to `true` Meson returns the compiler for the build machine (the "native" compiler) and when `false` it returns the host compiler (the "cross" compiler). If `native` is omitted, Meson returns the "cross" compiler if we're currently cross-compiling and the "native" compiler if we're not. - name: get_cross_property returns: any deprecated: 0.58.0 description: | Returns the given property from a cross file, the optional fallback_value is returned if not cross compiling or the given property is not found. This method is replaced by [[meson.get_external_property]]. arg_flattening: false posargs_inherit: meson.get_external_property optargs_inherit: meson.get_external_property - name: get_external_property returns: any since: 0.54.0 description: | Returns the given property from a native or cross file. The optional fallback_value is returned if the given property is not found. arg_flattening: false posargs: propname: type: str description: Name of the property in the cross / native file. optargs: fallback_value: type: any description: Value to return if `propname` is not set in the machine file. kwargs: native: type: bool description: | Setting `native` to `true` forces retrieving a variable from the native file, even when cross-compiling. If `native: false` or not specified, the variable is retrieved from the cross-file if cross-compiling, and from the native-file when not cross-compiling. - name: has_external_property returns: bool since: 0.58.0 description: Checks whether the given property exist in a native or cross file. posargs_inherit: meson.get_external_property kwargs_inherit: meson.get_external_property - name: can_run_host_binaries returns: bool since: 0.55.0 description: | Returns true if the build machine can run binaries compiled for the host. This returns `true` unless you are cross compiling, need a helper to run host binaries, and don't have one. For example when cross compiling from Linux to Windows, one can use `wine` as the helper. - name: has_exe_wrapper returns: bool deprecated: 0.55.0 description: Use [[meson.can_run_host_binaries]] instead. - name: install_dependency_manifest returns: void description: | Installs a manifest file containing a list of all subprojects, their versions and license names to the file name given as the argument. If license files are defined as well, they will be copied next to the manifest and referenced in it. If this function is not used, the builtin option `licensedir` can be used to install the manifest to a given directory with the name `depmf.json`. posargs: output_name: type: str description: Name of the manifest file to install - name: override_find_program returns: void since: 0.46.0 description: | specifies that whenever [[find_program]] is used to find a program named `progname`, Meson should not look it up on the system but instead return `program`, which may either be the result of [[find_program]], [[configure_file]] or [[executable]]. *(since 0.55.0)* If a version check is passed to [[find_program]] for a program that has been overridden with an executable, the current project version is used. posargs: progname: type: str description: The name of the program to override. program: type: exe | file | external_program description: The program to set as the override for `progname`. - name: override_dependency returns: void since: 0.54.0 description: | Specifies that whenever [[dependency]] with `name` is used, Meson should not look it up on the system but instead return `dep_object`, which may either be the result of [[dependency]] or [[declare_dependency]]. Doing this in a subproject allows the parent project to retrieve the dependency without having to know the dependency variable name: `dependency(name, fallback : subproject_name)`. posargs: name: type: str description: The name of the dependency to override. dep_object: type: dep description: The dependency to set as the override for `name`. kwargs: native: type: bool default: false description: | If set to `true`, the dependency is always overwritten for the build machine. Otherwise, the dependency is overwritten for the host machine, which differs from the build machine when cross-compiling. static: type: bool since: 0.60.0 description: | Used to override static and/or shared dependencies separately. If not specified it is assumed `dep_object` follows `default_library` option value. - name: is_cross_build returns: bool description: Returns `true` if the current build is a [cross build](Cross-compilation.md) and `false` otherwise. - name: is_subproject returns: bool description: Returns `true` if the current project is being built as a subproject of some other project and `false` otherwise. - name: is_unity returns: bool description: Returns `true` when doing a [unity build](Unity-builds.md) (multiple sources are combined before compilation to reduce build time) and `false` otherwise. - name: project_version returns: str description: Returns the version string specified in [[project]] function call. - name: project_license returns: list[str] since: 0.45.0 description: Returns the array of licenses specified in [[project]] function call. - name: project_license_files returns: list[file] since: 1.1.0 description: Returns the array of license files specified in the [[project]] function call. - name: project_name returns: str description: Returns the project name specified in the [[project]] function call. - name: version returns: str description: Return a string with the version of Meson. - name: add_devenv returns: void since: 0.58.0 description: | add an [[@env]] object (returned by [[environment]]) to the list of environments that will be applied when using [`meson devenv`](Commands.md#devenv) command line. This is useful for developers who wish to use the project without installing it, it is often needed to set for example the path to plugins directory, etc. Alternatively, a list or dictionary can be passed as first argument. ``` meson devenv = environment() devenv.set('PLUGINS_PATH', meson.current_build_dir()) ... meson.add_devenv(devenv) ``` After configuring and compiling that project, a terminal can be opened with the environment set: ```sh $ meson devenv -C $ echo $PLUGINS_PATH /path/to/source/subdir ``` See [`meson devenv`](Commands.md#devenv) command documentation for a list of environment variables that are set by default by Meson. posargs: env: type: env | str | list[str] | dict[str] | dict[list[str]] description: | The [[@env]] object to add. Since *0.62.0* list of strings is allowed in dictionary values. In that case values are joined using the separator. kwargs: separator: type: str since: 0.62.0 description: | The separator to use for the initial values defined in the first positional argument. If not explicitly specified, the default path separator for the host operating system will be used, i.e. ';' for Windows and ':' for UNIX/POSIX systems. method: type: str since: 0.62.0 description: | Must be one of 'set', 'prepend', or 'append' (defaults to 'set'). Controls if initial values defined in the first positional argument are prepended, appended or replace the current value of the environment variable. muon-v0.4.0/subprojects/meson-docs/docs/yaml/builtins/build_machine.yaml0000644000175000017500000000261214737503617025461 0ustar buildbuildname: build_machine long_name: Build machine information description: | Provides information about the build machine -- the machine that is doing the actual compilation. See [Cross-compilation](Cross-compilation.md). Currently, these values are populated using [`platform.system()`](https://docs.python.org/3.7/library/platform.html#platform.system) and [`platform.machine()`](https://docs.python.org/3.7/library/platform.html#platform.machine). If you think the returned values for any of these are incorrect for your system or CPU, or if your OS is not in the linked table, please [file a bug](https://github.com/mesonbuild/meson/issues/new) report with details and we'll look into it. methods: - name: cpu_family returns: str description: | Returns the CPU family name. [This table](Reference-tables.md#cpu-families) contains all known CPU families. These are guaranteed to continue working. - name: cpu returns: str description: Returns a more specific CPU name, such as `i686`, `amd64`, etc. - name: system returns: str description: | Returns the operating system name. [This table](Reference-tables.md#operating-system-names) Lists all of the currently known Operating System names, these are guaranteed to continue working. - name: endian returns: str description: returns `'big'` on big-endian systems and `'little'` on little-endian systems. muon-v0.4.0/subprojects/meson-docs/docs/yaml/builtins/host_machine.yaml0000644000175000017500000000102514737503617025334 0ustar buildbuildname: host_machine long_name: Host machine information extends: build_machine description: | Provides information about the host machine -- the machine on which the compiled binary will run. See [Cross-compilation](Cross-compilation.md). It has the same methods as [[@build_machine]]. When not cross-compiling, all the methods return the same values as [[@build_machine]] (because the build machine is the host machine) Note that while cross-compiling, it simply returns the values defined in the cross-info file. muon-v0.4.0/subprojects/meson-docs/docs/yaml/builtins/target_machine.yaml0000644000175000017500000000140214737503617025644 0ustar buildbuildname: target_machine long_name: Target machine information extends: build_machine description: | Provides information about the target machine -- the machine on which the compiled binary's output will run. Hence, this object should only be used while cross-compiling a compiler. See [Cross-compilation](Cross-compilation.md). It has the same methods as [[@build_machine]]. When all compilation is 'native', all the methods return the same values as [[@build_machine]] (because the build machine is the host machine and the target machine). Note that while cross-compiling, it simply returns the values defined in the cross-info file. If `target_machine` values are not defined in the cross-info file, `host_machine` values are returned instead. muon-v0.4.0/subprojects/meson-docs/docs/yaml/objects/0002755000175000017500000000000014737503617021613 5ustar buildbuildmuon-v0.4.0/subprojects/meson-docs/docs/yaml/objects/alias_tgt.yaml0000644000175000017500000000015614737503617024446 0ustar buildbuildname: alias_tgt long_name: Alias target description: Opaque object returned by [[alias_target]]. extends: tgt muon-v0.4.0/subprojects/meson-docs/docs/yaml/objects/generator.yaml0000644000175000017500000000324114737503617024463 0ustar buildbuildname: generator long_name: Generator object description: | This object is returned by [[generator]] and contains a generator that is used to transform files from one type to another by an executable (e.g. `idl` files into source code and headers). methods: - name: process returns: generated_list description: | Takes a list of files, causes them to be processed and returns an object containing the result which can then, for example, be passed into a build target definition. varargs: name: source min_varargs: 1 type: str | file | custom_tgt | custom_idx | generated_list description: List of sources to process. kwargs: extra_args: type: list[str] description: | If present, will be used to replace an entry `@EXTRA_ARGS@` in the argument list. preserve_path_from: type: str since: 0.45.0 description: | If given, specifies that the output files need to maintain their directory structure inside the target temporary directory. The most common value for this is `meson.current_source_dir()`. With this value when a file called `subdir/one.input` is processed it generates a file `{target private directory}/subdir/one.out` as opposed to `{target private directory}/one.out`. env: type: env | list[str] | dict[str] since: 1.3.0 description: | environment variables to set, such as `{'NAME1': 'value1', 'NAME2': 'value2'}` or `['NAME1=value1', 'NAME2=value2']`, or an [[@env]] object which allows more sophisticated environment juggling. muon-v0.4.0/subprojects/meson-docs/docs/yaml/objects/inc.yaml0000644000175000017500000000014514737503617023246 0ustar buildbuildname: inc long_name: Include directories description: Opaque wrapper for storing include directories muon-v0.4.0/subprojects/meson-docs/docs/yaml/objects/feature.yaml0000644000175000017500000001265714737503617024143 0ustar buildbuildname: feature long_name: Feature option object since: 0.47.0 description: Meson object representing a [`feature` options](Build-options.md#features) methods: - name: enabled returns: bool description: Returns whether the feature was set to `'enabled'` - name: disabled returns: bool description: Returns whether the feature was set to `'disabled'` - name: auto returns: bool description: Returns whether the feature was set to `'auto'` - name: allowed since: 0.59.0 returns: bool description: Returns whether the feature was set to `'enabled'` or `'auto'` - name: disable_auto_if since: 0.59.0 returns: feature description: | Returns the feature, with `'auto'` converted to `'disabled'` if value is true. | Feature | `value = true` | `value = false` | | -------- | -------------- | --------------- | | Auto | Disabled | Auto | | Enabled | Enabled | Enabled | | Disabled | Disabled | Disabled | example: | `disable_auto_if` is useful to give precedence to mutually exclusive dependencies (that provide the same API) if either or both are available: ``` # '-Dfoo=auto -Dbar=enabled' will not pick foo even if installed. use_bar = get_option('bar') use_foo = get_option('foo').disable_auto_if(use_bar.enabled()) dep_foo = dependency('foo', required: use_foo) if not dep_foo.found() dep_foo = dependency('bar', required: use_bar) endif ``` posargs: value: type: bool description: See the table above - name: enable_auto_if since: 1.1.0 returns: feature description: | Returns the feature, with `'auto'` converted to `'enabled'` if value is true. | Feature | `value = true` | `value = false` | | -------- | -------------- | --------------- | | Auto | Enabled | Auto | | Enabled | Enabled | Enabled | | Disabled | Disabled | Disabled | posargs: value: type: bool description: See the table above - name: require returns: feature since: 0.59.0 description: | Returns the object itself if the value is true; an error if the object is `'enabled'` and the value is false; a disabled feature if the object is `'auto'` or `'disabled'` and the value is false. | Feature | `value = true` | `value = false` | | -------- | -------------- | --------------- | | Auto | Auto | Disabled | | Enabled | Enabled | Error | | Disabled | Disabled | Disabled | example: | `require` is useful to restrict the applicability of `'auto'` features, for example based on other features or on properties of the host machine: ``` if get_option('directx').require(host_machine.system() == 'windows', error_message: 'DirectX only available on Windows').allowed() then src += ['directx.c'] config.set10('HAVE_DIRECTX', true) endif ``` posargs: value: type: bool description: The value to check kwargs: error_message: type: str default: "''" description: The error message to print if the check fails - name: enable_if returns: feature since: 1.1.0 description: | Returns the object itself if the value is false; an error if the object is `'disabled'` and the value is true; an enabled feature if the object is `'auto'` or `'enabled'` and the value is true. | Feature | `value = true` | `value = false` | | -------- | -------------- | --------------- | | Auto | Enabled | Auto | | Enabled | Enabled | Enabled | | Disabled | Error | Disabled | example: | `enable_if` is useful to restrict the applicability of `'auto'` features, particularly when passing them to [[dependency]]: ``` use_llvm = get_option('llvm').enable_if(with_clang).enable_if(with_llvm_libs) dep_llvm = dependency('llvm', required: use_llvm) ``` posargs: value: type: bool description: The value to check kwargs: error_message: type: str default: "''" description: The error message to print if the check fails - name: disable_if returns: feature since: 1.1.0 description: | Returns the object itself if the value is false; an error if the object is `'enabled'` and the value is true; a disabled feature if the object is `'auto'` or `'disabled'` and the value is true. | Feature | `value = true` | `value = false` | | -------- | -------------- | --------------- | | Auto | Disabled | Auto | | Enabled | Error | Enabled | | Disabled | Disabled | Disabled | This is equivalent to `feature_opt.require(not condition)`, but may make code easier to reason about, especially when mixed with `enable_if` example: | `disable_if` is useful to restrict the applicability of `'auto'` features, particularly when passing them to [[dependency]]: ``` use_os_feature = get_option('foo') \ .disable_if(host_machine.system() == 'darwin', error_message : 'os feature not supported on MacOS') dep_os_feature = dependency('os_feature', required: use_os_feature) ``` posargs: value: type: bool description: The value to check kwargs: error_message: type: str default: "''" description: The error message to print if the check fails muon-v0.4.0/subprojects/meson-docs/docs/yaml/objects/runresult.yaml0000644000175000017500000000132514737503617024541 0ustar buildbuildname: runresult long_name: Run result object description: | This object encapsulates the result of trying to compile and run a sample piece of code with [[compiler.run]] or [[run_command]]. methods: - name: compiled returns: bool description: | If `true`, the compilation succeeded, if `false` it did not and the other methods return unspecified data. This is only available for `compiler.run()` results. - name: returncode returns: int description: The return code of executing the compiled binary - name: stderr returns: str description: The standard error produced when the command was run. - name: stdout returns: str description: The standard out produced when the command was run. muon-v0.4.0/subprojects/meson-docs/docs/yaml/objects/jar.yaml0000644000175000017500000000013614737503617023251 0ustar buildbuildname: jar long_name: JAR build target description: A Java JAR build target extends: build_tgt muon-v0.4.0/subprojects/meson-docs/docs/yaml/objects/custom_idx.yaml0000644000175000017500000000100414737503617024646 0ustar buildbuildname: custom_idx long_name: Custom target index description: References a specific output file of a [[@custom_tgt]] object. methods: - name: full_path returns: str since: 0.54.0 description: | Returns a full path pointing to the result target file NOTE: In most cases using the object itself will do the same job as this and will also allow Meson to setup inter-target dependencies correctly. Please file a bug if that doesn't work for you. See [[custom_tgt.full_path]] muon-v0.4.0/subprojects/meson-docs/docs/yaml/objects/external_program.yaml0000644000175000017500000000346414737503617026055 0ustar buildbuildname: external_program long_name: External program description: Opaque object representing an external program methods: - name: found returns: bool description: Returns whether the executable was found. - name: path returns: str deprecated: 0.55.0 description: | *Deprecated:* Use [[external_program.full_path]] instead. Returns a string pointing to the script or executable. **NOTE:** You should not usually need to use this method. Passing the object itself should work in most contexts where a program can appear, and allows Meson to setup inter-target dependencies correctly (for example in cases where a program might be overridden by a [[@build_tgt]]). Only use this if you specifically need a string, such as when embedding a program path into a header file, or storing it into an environment variable. For example: ```meson run_command(find_program('foo'), 'arg1', 'arg2') ``` - name: version returns: str since: 0.62.0 description: | The version number as a string, for example `1.2.8`. `unknown` if the program cannot determine the version via a `--version` argument. - name: full_path returns: str since: 0.55.0 description: | Returns a string pointing to the script or executable. **NOTE:** You should not usually need to use this method. Passing the object itself should work in most contexts where a program can appear, and allows Meson to setup inter-target dependencies correctly (for example in cases where a program might be overridden by a [[@build_tgt]]). Only use this if you specifically need a string, such as when embedding a program path into a header file, or storing it into an environment variable. For example: ```meson run_command(find_program('foo'), 'arg1', 'arg2') ``` muon-v0.4.0/subprojects/meson-docs/docs/yaml/objects/tgt.yaml0000644000175000017500000000013014737503617023265 0ustar buildbuildname: tgt long_name: Meson Target description: Opaque base object for all Meson targets muon-v0.4.0/subprojects/meson-docs/docs/yaml/objects/disabler.yaml0000644000175000017500000000067614737503617024273 0ustar buildbuildname: disabler long_name: Disabler description: | A disabler object is an object that behaves in much the same way as NaN numbers do in floating point math. That is when used in any statement (function call, logical op, etc) they will cause the statement evaluation to immediately short circuit to return a disabler object. A disabler object has one method: methods: - name: found returns: bool description: Always returns `false` muon-v0.4.0/subprojects/meson-docs/docs/yaml/objects/compiler.yaml0000644000175000017500000005313514737503617024316 0ustar buildbuildname: compiler long_name: Compiler object description: | This object is returned by [[meson.get_compiler]]. It represents a compiler for a given language and allows you to query its properties. notes: - | These compiler checks do not use compiler arguments added with `add_*_arguments()`, via `-Dlang_args` on the command-line, or through `CFLAGS`/`LDFLAGS`, etc in the environment. Hence, you can trust that the tests will be fully self-contained, and won't fail because of custom flags added by other parts of the build file or by users. - | Note that if you have a single prefix with all your dependencies, you might find it easier to append to the environment variables `C_INCLUDE_PATH` with GCC/Clang and `INCLUDE` with MSVC to expand the default include path, and `LIBRARY_PATH` with GCC/Clang and `LIB` with MSVC to expand the default library search path. However, with GCC, these variables will be ignored when cross-compiling. In that case you need to use a specs file. See: http://www.mingw.org/wiki/SpecsFileHOWTO methods: # Helper methods to pre-define common posargs - name: _code returns: void description: You have found a bug if you can see this! posargs: code: type: str | file description: | The source code to check. If a string is passed, the code is used directly. If a [[@file]] object is passed, its content is used for the compiler check. # Helper methods to pre-define common kwargs - name: _args returns: void description: You have found a bug if you can see this! kwargs: args: type: list[str] description: | Used to pass a list of compiler arguments. Defining include paths for headers not in the default include path via `-Isome/path/to/header` is generally supported, however, usually not recommended. This is because include directories can also be specified via the `include_directories` or the `dependency` kwarg (if present). The same is also true for passing libraries to link with `-lfoo`. - name: _include_directories returns: void description: You have found a bug if you can see this! kwargs: include_directories: type: inc | list[inc] since: 0.38.0 description: Extra directories for header searches. - name: _dependencies returns: void description: You have found a bug if you can see this! kwargs: dependencies: type: dep | list[dep] description: Additionally dependencies required for compiling and / or linking. - name: _prefix returns: void description: You have found a bug if you can see this! kwargs: prefix: type: str | list[str] description: | Used to add `#include`s and other things that are required for the symbol to be declared. Since 1.0.0 an array is accepted too. When an array is passed, the items are concatenated together separated by a newline. System definitions should be passed via compiler args (eg: `_GNU_SOURCE` is often required for some symbols to be exposed on Linux, and it should be passed via `args` keyword argument). - name: _no_builtin_args returns: void description: You have found a bug if you can see this! kwargs: no_builtin_args: type: bool default: false description: When set to `true`, the compiler arguments controlled by built-in configuration options are not added. - name: _name returns: void description: You have found a bug if you can see this! kwargs: name: type: str description: | The name to use for printing a message about the compiler check. If this keyword argument is not passed, no message will be printed about the check. # Even more convenient - name: _common returns: void description: You have found a bug if you can see this! kwargs_inherit: - compiler._args - compiler._include_directories - compiler._dependencies - compiler._no_builtin_args - compiler._prefix - name: _compiles returns: void description: You have found a bug if you can see this! kwargs: required: type: bool | feature default: false since: 1.5.0 description: When set to `true`, Meson will halt if the check fails. When set to a [`feature`](Build-options.md#features) option, the feature will control if it is searched and whether to fail if not found. kwargs_inherit: - compiler._args - compiler._include_directories - compiler._dependencies - compiler._no_builtin_args - compiler._name - compiler._werror - name: _header returns: void description: You have found a bug if you can see this! kwargs_inherit: compiler._common kwargs: required: type: bool | feature default: false since: 0.50.0 description: When set to `true`, Meson will halt if the header check fails. When set to a [`feature`](Build-options.md#features) option, the feature will control if it is searched and whether to fail if not found. - name: _required returns: void description: You have found a bug if you can see this! kwargs: required: type: bool | feature default: false since: 1.3.0 description: When set to `true`, Meson will halt if the check fails. When set to a [`feature`](Build-options.md#features) option, the feature will control if it is searched and whether to fail if not found. - name: _werror returns: void description: You have found a bug if you can see this! kwargs: werror: type: bool default: false description: When set to `true`, compiler warnings are treated as error. since: 1.3.0 # Star of the actual functions - name: version returns: str description: Returns the compiler's version number as a string. - name: cmd_array returns: list[str] description: Returns an array containing the command(s) for the compiler. - name: alignment returns: int description: | Returns the alignment of the specified type. For C-like languages, For C-like languages, the header `stddef.h` and `stdio.h` are included implicitly for native compilation, only `stddef.h` is included when cross-compiling. posargs: typename: type: str description: The name of the type to check. kwargs_inherit: - compiler._args - compiler._prefix - compiler._dependencies # TODO: why not also allow passing `include_directories`? - name: run returns: runresult description: Attempts to compile and execute the given code fragment. posargs_inherit: compiler._code kwargs_inherit: compiler._compiles - name: get_id returns: str description: | Returns a string identifying the compiler. For example, `gcc`, `msvc`, [and more](Reference-tables.md#compiler-ids). - name: get_linker_id returns: str since: 0.53.0 description: | Returns a string identifying the linker. For example, `ld.bfd`, `link`, [and more](Reference-tables.md#linker-ids). - name: symbols_have_underscore_prefix returns: bool since: 0.37.0 description: Returns `true` if the C symbol mangling is one underscore (`_`) prefixed to the symbol. - name: has_member returns: bool description: Returns true if the type has the specified member. kwargs_inherit: - compiler._common - compiler._required posargs: typename: type: str description: The type to check. membername: type: str description: The member to check. - name: has_members returns: bool description: Returns `true` if the type has *all* the specified members. kwargs_inherit: - compiler._common - compiler._required posargs: typename: type: str description: The type to check. varargs: name: member type: str min_varargs: 1 description: The members to check - name: has_function returns: bool description: | Returns true if the given function is provided by the standard library or a library passed in with the `args` keyword. kwargs_inherit: - compiler._common - compiler._required posargs: funcname: type: str description: The function to check. - name: has_type returns: bool description: Returns `true` if the specified token is a type. kwargs_inherit: - compiler._common - compiler._required posargs: typename: type: str description: The type to check. - name: compute_int returns: int since: 0.40.0 kwargs_inherit: compiler._common description: | Computes the value of the given expression (as an example `1 + 2`). When cross compiling this is evaluated with an iterative algorithm, you can specify keyword arguments `low` (defaults to -1024), `high` (defaults to 1024) and `guess` to specify max and min values for the search and the value to try first. For C-like languages, the header `stddef.h` and `stdio.h` are included implicitly for native compilation, only `stddef.h` is included when cross-compiling. posargs: expr: type: str description: The expression to compute. kwargs: low: type: int default: -1024 description: The min value. high: type: int default: 1024 description: The max value. guess: type: int description: The value to try first. - name: sizeof returns: int description: | returns the size of the given type (e.g. `'int'`) or -1 if the type is unknown. For C-like languages, the header `stddef.h` and `stdio.h` are included implicitly for native compilation, only `stddef.h` is included when cross-compiling. kwargs_inherit: compiler._common posargs: typename: type: str description: The type to compute. - name: get_define returns: str since: 0.40.0 description: | Returns the given preprocessor symbol's value as a string or empty string if it is not defined. *(since 0.47.0)* This method will concatenate string literals as the compiler would. E.g. `"a" "b"` will become `"ab"`. kwargs_inherit: compiler._common posargs: definename: type: str description: The define to check. - name: has_define returns: bool since: 1.3.0 description: | Returns true if the given preprocessor symbol is *defined*. kwargs_inherit: compiler._common posargs: definename: type: str description: The define to check. - name: compiles returns: bool description: Returns true if the code compiles. posargs_inherit: compiler._code kwargs_inherit: compiler._compiles - name: links returns: bool description: | Returns true if the code compiles and links. *Since 0.60.0*, if the `file` object's suffix does not match the compiler object's language, the compiler corresponding to the suffix is used to compile the source, while the target of the `links` method is used to link the resulting object file. posargs_inherit: compiler._code kwargs_inherit: compiler._compiles - name: check_header returns: bool since: 0.47.0 description: | Returns true if the specified header is *usable* with the specified prefix, dependencies, and arguments. kwargs_inherit: compiler._header posargs: header_name: type: str description: The header to check. - name: has_header returns: bool description: | Returns true if the specified header is *exists* with the specified prefix, dependencies, and arguments. This method is faster than [[compiler.check_header]] since it only does a pre-processor check. kwargs_inherit: compiler._header posargs_inherit: compiler.check_header - name: has_header_symbol returns: bool description: | Detects whether a particular symbol is declared in the specified header. Symbols here include function, variable, `#define`, type definition, etc. kwargs_inherit: compiler._header posargs: header: type: str description: The header to check. symbol: type: str description: The symbol to check. - name: find_library returns: dep description: Tries to find the library specified in the positional argument. posargs: libname: type: str description: The library to find. kwargs: required: type: bool | feature default: true description: | If set `true`, Meson will abort with an error if the library could not be found. Otherwise, Meson will continue and the found method of the returned object will return `false`. When set to a [`feature`](Build-options.md#features) option, the feature will control if it is searched and whether to fail if not found. *(since 0.47.0)* The value of a `feature` option can also be passed here. has_headers: type: list[str] since: 0.50.0 description: | List of headers that must be found as well. This check is equivalent to checking each header with a [[compiler.has_header]] call. When used, kwargs that [[compiler.has_header]] would accept can be passed here prefixed with `header_`, and will have the same effect on the header check. header_required: type: bool | feature since: 0.50.0 description: | When used in conjunction with the has_headers keyword, set the requirement of the headers. static: type: bool default: false since: 0.51.0 description: | If `true`, the search is limited to static libraries only. Setting this value to `false` (the default) will search for both shared *and* static libraries. disabler: type: bool default: false since: 0.49.0 description: If `true`, this method will return a [[@disabler]] on a failed check. dirs: type: list[str] description: | Additional directories to search in. By default the library is searched for in the system library directory (e.g. /usr/lib). Specifying more directories here, causes Meson to search in those directories as well as the system directories. # does not work, since all _common kwargs need to be prefixed `header_` here # kwargs_inherit: compiler._common header_args: type: list[str] since: 0.51.0 description: | When the `has_headers` kwarg is also used, this argument is passed to [[compiler.has_header]] as `args`. header_include_directories: type: inc | list[inc] since: 0.51.0 description: | When the `has_headers` kwarg is also used, this argument is passed to [[compiler.has_header]] as `include_directories`. header_dependencies: type: dep | list[dep] since: 0.51.0 description: | When the `has_headers` kwarg is also used, this argument is passed to [[compiler.has_header]] as `dependencies`. header_no_builtin_args: type: bool default: false since: 0.51.0 description: | When the `has_headers` kwarg is also used, this argument is passed to [[compiler.has_header]] as `no_builtin_args`. header_prefix: type: str since: 0.51.0 description: | When the `has_headers` kwarg is also used, this argument is passed to [[compiler.has_header]] as `prefix`. # Compiler arguments - name: has_argument returns: bool description: | Returns `true` if the compiler accepts the specified command line argument, that is, can compile code without erroring out or printing a warning about an unknown flag. posargs: argument: type: str description: The argument to check. kwargs_inherit: - compiler._required - name: has_multi_arguments since: 0.37.0 returns: bool description: | the same as [[compiler.has_argument]] but takes multiple arguments and uses them all in a single compiler invocation. varargs: name: arg type: str description: The arguments to check. kwargs_inherit: - compiler._required - name: get_supported_arguments returns: list[str] since: 0.43.0 varargs_inherit: compiler.has_multi_arguments description: | Returns an array containing only the arguments supported by the compiler, as if [[compiler.has_argument]] were called on them individually. kwargs: checked: type: str since: 0.59.0 default: "'off'" description: | Supported values: - `'off'`: Quietly ignore unsupported arguments - `'warn'`: Print a warning for unsupported arguments - `'require'`: Abort if at least one argument is not supported - name: first_supported_argument returns: list[str] since: 0.43.0 varargs_inherit: compiler.has_multi_arguments description: | Given a list of strings, returns a single-element list containing the first argument that passes the [[compiler.has_argument]] test or an empty array if none pass. # Linker arguments - name: has_link_argument since: 0.46.0 returns: bool description: | Returns `true` if the linker accepts the specified command line argument, that is, can compile and link code without erroring out or printing a warning about an unknown flag. Link arguments will be passed to the compiler, so should usually have the `-Wl,` prefix. On VisualStudio a `/link` argument will be prepended. posargs: argument: type: str description: The argument to check. kwargs_inherit: - compiler._required - name: has_multi_link_arguments since: 0.46.0 returns: bool description: | the same as [[compiler.has_link_argument]] but takes multiple arguments and uses them all in a single compiler invocation. varargs: name: arg type: str description: The link arguments to check. kwargs_inherit: - compiler._required - name: get_supported_link_arguments returns: list[str] since: 0.46.0 varargs_inherit: compiler.has_multi_link_arguments description: | Returns an array containing only the arguments supported by the compiler, as if [[compiler.has_link_argument]] were called on them individually. # TODO: why is this not present here? # kwargs: # checked: # type: str # sinec: 0.59.0 # default: "'off'" # description: | # Supported values: # - `'off'`: Quietly ignore unsupported arguments # - `'warn'`: Print a warning for unsupported arguments # - `'require'`: Abort if at least one argument is not supported - name: first_supported_link_argument returns: list[str] since: 0.46.0 varargs_inherit: compiler.has_multi_link_arguments description: | Given a list of strings, returns the first argument that passes the [[compiler.has_link_argument]] test or an empty array if none pass. - name: has_function_attribute returns: bool since: 0.48.0 description: | Returns `true` if the compiler supports the GNU style (`__attribute__(...)`) `name`. This is preferable to manual compile checks as it may be optimized for compilers that do not support such attributes. [This table](Reference-tables.md#gcc-__attribute__) lists all of the supported attributes. posargs: name: type: str description: The attribute name to check. kwargs_inherit: - compiler._required - name: get_supported_function_attributes varargs: name: name type: str min_varargs: 1 description: The attribute names to check. returns: list[str] since: 0.48.0 description: | Returns an array containing any names that are supported GCC style attributes. Equivalent to [[compiler.has_function_attribute]] was called on each of them individually. # TODO: Again why doesn't this function have the checked kwarg? - name: get_argument_syntax returns: str since: 0.49.0 description: | returns a string identifying the type of arguments the compiler takes. Can be one of `gcc`, `msvc`, or an undefined string value. This method is useful for identifying compilers that are not gcc or msvc, but use the same argument syntax as one of those two compilers such as clang or icc, especially when they use different syntax on different operating systems. - name: preprocess returns: list[custom_idx] since: 0.64.0 description: | Preprocess a list of source files but do not compile them. The preprocessor will receive the same arguments (include directories, defines, etc) as with normal compilation. That includes for example args added with `add_project_arguments()`, or on the command line with `-Dc_args=-DFOO`. varargs: name: source type: str | file | custom_tgt | custom_idx | generated_list description: | Input source to preprocess. The following types are supported: - Strings relative to the current source directory - [[@file]] objects defined in any preceding build file - The return value of configure-time generators such as [[configure_file]] - The return value of build-time generators such as [[custom_target]] or [[generator.process]] kwargs_inherit: - compiler._include_directories kwargs: output: type: str description: | Template for name of preprocessed files: `@PLAINNAME@` is replaced by the source filename and `@BASENAME@` is replaced by the source filename without its extension. compile_args: type: list[str] description: | Extra flags to pass to the preprocessor dependencies: type: dep | list[dep] description: Additionally dependencies required. since: 1.1.0 depends: type: list[build_tgt | custom_tgt] description: | Specifies that this target depends on the specified target(s). These targets should be built before starting to preprocess an input. since: 1.4.0 muon-v0.4.0/subprojects/meson-docs/docs/yaml/objects/file.yaml0000644000175000017500000000067714737503617023426 0ustar buildbuildname: file long_name: File description: Object that stores the path to an existing file methods: - name: full_path returns: str since: 1.4.0 description: | Returns a full path pointing to the file. This is useful for printing the path with e.g [[message]] function for debugging purpose. **NOTE:** In most cases using the object itself will do the same job as this and will also allow Meson to setup dependencies correctly. muon-v0.4.0/subprojects/meson-docs/docs/yaml/objects/lib.yaml0000644000175000017500000000016114737503617023241 0ustar buildbuildname: lib long_name: Library target extends: build_tgt description: Represents either a shared or static library muon-v0.4.0/subprojects/meson-docs/docs/yaml/objects/structured_src.yaml0000644000175000017500000000016114737503617025546 0ustar buildbuildname: structured_src long_name: Structured Source description: Opaque object returned by [[structured_sources]]. muon-v0.4.0/subprojects/meson-docs/docs/yaml/objects/run_tgt.yaml0000644000175000017500000000015014737503617024153 0ustar buildbuildname: run_tgt long_name: Run target description: Opaque object returned by [[run_target]]. extends: tgt muon-v0.4.0/subprojects/meson-docs/docs/yaml/objects/both_libs.yaml0000644000175000017500000000051614737503617024444 0ustar buildbuildname: both_libs long_name: Both libraries object extends: lib description: Container for both a static and shared library. since: 0.46.0 methods: - name: get_shared_lib returns: lib description: Returns the stored shared library - name: get_static_lib returns: lib description: Returns the stored static library muon-v0.4.0/subprojects/meson-docs/docs/yaml/objects/build_tgt.yaml0000644000175000017500000000602314737503617024453 0ustar buildbuildname: build_tgt long_name: Build target extends: tgt description: | A build target is either an executable, shared library, static library, both shared and static library or shared module. methods: - name: extract_objects returns: extracted_obj description: | Returns an opaque value representing the object files generated for those source files. This is typically used to take single object files and link them to unit tests or to compile some source files with custom flags. To use the object file(s) in another build target, use the `objects:` keyword argument to a [[build_target]] or [[declare_dependency]], or include them in the command line of a [[custom_target]]. varargs: name: source type: str | file | custom_tgt | custom_idx | generated_list description: | Source filenames for which the built objects should be extracted. min_varargs: 1 - name: extract_all_objects returns: extracted_obj description: | Acts the same as `extract_objects`, but returns all object files generated by this target. By default only objects built for this target are returned to maintain backward compatibility with previous versions. The default value for the `recursive` kwarg will eventually be changed to `true` in a future version. kwargs: recursive: type: bool description: | Also return objects passed to the `objects` argument of this target. since: 0.46.0 default: true - name: full_path returns: str description: | Returns a full path pointing to the result target file. **NOTE:** In most cases using the object itself will do the same job as this and will also allow Meson to setup inter-target dependencies correctly. Please file a bug if that doesn't work for you. - name: path returns: str since: 0.59.0 deprecated: 0.59.0 description: | Does the exact same as [[build_tgt.full_path]]. **NOTE**: This function is solely kept for compatibility with [[@external_program]] objects. It will be removed once the, also deprecated, corresponding `path()` function in the [[@external_program]] object is removed. - name: private_dir_include returns: inc description: | Returns a value that works like [[include_directories]], but points to the private directory of this target. Usually only needed if an another target needs to access some generated internal headers of this target. - name: name returns: str since: 0.54.0 description: Returns the name of the target. - name: get_id returns: str since: 0.26.0 description: Returns a unique id for the target - name: outdir returns: str since: 0.26.0 description: Returns the output directory relative to the build root of the target - name: found returns: bool since: 0.59.0 description: | Always returns `true`. This function is meant to make executables objects feature compatible with [[@external_program]] objects. This simplifies use-cases where an executable is used instead of an [[@external_program]]. muon-v0.4.0/subprojects/meson-docs/docs/yaml/objects/custom_tgt.yaml0000644000175000017500000000236514737503617024673 0ustar buildbuildname: custom_tgt long_name: Custom target extends: tgt description: | This object is returned by [[custom_target]] and contains a target with the following methods: methods: - name: full_path returns: str description: | Returns a full path pointing to the result target file NOTE: In most cases using the object itself will do the same job as this and will also allow Meson to setup inter-target dependencies correctly. Please file a bug if that doesn't work for you. *(since 0.54.0)* It can be also called on indexes objects: `custom_targets[i].full_path()`. - name: "[index]" returns: custom_idx description: | Returns an opaque object that references this target, and can be used as a source in other targets. When it is used as such it will make that target depend on this custom target, but the only source added will be the one that corresponds to the index of the custom target's output argument. - name: to_list returns: list[custom_idx] since: 0.54.0 description: | Returns a list of opaque objects that references this target, and can be used as a source in other targets. This can be used to iterate outputs with `foreach` loop. muon-v0.4.0/subprojects/meson-docs/docs/yaml/objects/extracted_obj.yaml0000644000175000017500000000020714737503617025311 0ustar buildbuildname: extracted_obj long_name: Extracted object file description: Opaque object representing extracted object files from build targets muon-v0.4.0/subprojects/meson-docs/docs/yaml/objects/env.yaml0000644000175000017500000000435714737503617023276 0ustar buildbuildname: env long_name: Environment description: | This object is returned by [[environment]] and stores detailed information about how environment variables should be set. It should be passed as the `env` keyword argument to tests and other functions. *Since 0.58.0* [[env.append]] and [[env.prepend]] can be called multiple times on the same `varname`. Earlier Meson versions would warn and only the last operation took effect. example: | ```meson env = environment() # MY_PATH will be '0:1:2:3' env.set('MY_PATH', '1') env.append('MY_PATH', '2') env.append('MY_PATH', '3') env.prepend('MY_PATH', '0') ``` methods: - name: append returns: void description: | appends the given values to the old value of the environment variable, e.g. `env.append('FOO', 'BAR', 'BAZ', separator : ';')` produces `BOB;BAR;BAZ` if `FOO` had the value `BOB` and plain `BAR;BAZ` if the value was not defined. posargs: variable: type: str description: The variable to modify varargs: type: str name: Value description: The values to append kwargs: separator: type: str description: | The separator to use. If not explicitly specified, the default path separator for the host operating system will be used, i.e. ';' for Windows and ':' for UNIX/POSIX systems. - name: prepend returns: void description: Same as `append` except that it writes to the beginning of the variable. posargs: variable: type: str description: The variable to modify varargs: type: str name: Value description: The values to prepend kwargs_inherit: env.append - name: set returns: void description: | Sets the environment variable specified in the first argument to the values in the varargs joined by the separator. For instance, `env.set('FOO', 'BAR'),` sets envvar `FOO` to value `BAR`. posargs: variable: type: str description: The variable to modify varargs: type: str name: Value description: The values to set kwargs_inherit: env.append - name: unset returns: void since: 1.4.0 description: | Unset the specified environment variable. If this variable does not exist, nothing happens. muon-v0.4.0/subprojects/meson-docs/docs/yaml/objects/range.yaml0000644000175000017500000000020214737503617023563 0ustar buildbuildname: range long_name: Range object since: 0.58.0 description: Opaque object that can be used in a loop and accessed via `[num]`. muon-v0.4.0/subprojects/meson-docs/docs/yaml/objects/generated_list.yaml0000644000175000017500000000021214737503617025461 0ustar buildbuildname: generated_list long_name: Generated list object description: Opaque object representing the result of a [[generator.process]] call. muon-v0.4.0/subprojects/meson-docs/docs/yaml/objects/module.yaml0000644000175000017500000000053414737503617023764 0ustar buildbuildname: module long_name: Imported module object description: | Base type for all modules. Modules provide their own specific implementation methods, but all modules provide the following methods: methods: - name: found returns: bool since: 0.59.0 description: Returns `true` if the module was successfully imported, otherwise `false`. muon-v0.4.0/subprojects/meson-docs/docs/yaml/objects/dep.yaml0000644000175000017500000001547414737503617023260 0ustar buildbuildname: dep long_name: Dependency object description: Abstract representation of a dependency methods: - name: found returns: bool description: Returns whether the dependency was found. - name: name since: 0.48.0 returns: str description: | Returns the name of the dependency that was searched. Returns `'internal'` for dependencies created with [[declare_dependency]]. NOTE: This was not implemented for dep objects returned by [[compiler.find_library]] until Meson 1.5.0 - name: get_pkgconfig_variable since: 0.36.0 deprecated: 0.56.0 returns: str description: | Gets the pkg-config variable specified, or, if invoked on a non pkg-config dependency, error out. posargs: var_name: type: str description: Name of the variable to query kwargs: define_variable: type: list[str] since: 0.44.0 description: | You can also redefine a variable by passing a list to this kwarg that can affect the retrieved variable: `['prefix', '/'])`. *(Since 1.3.0)* Multiple variables can be specified in pairs. default: type: str since: 0.45.0 description: | The value to return if the variable was not found. A warning is issued if the variable is not defined and this kwarg is not set. - name: get_configtool_variable since: 0.44.0 deprecated: 0.56.0 returns: str description: | Gets the command line argument from the config tool (with `--` prepended), or, if invoked on a non config-tool dependency, error out. posargs: var_name: type: str description: Name of the variable to query - name: type_name returns: str description: | Returns a string describing the type of the dependency, the most common values are `internal` for deps created with [[declare_dependency]] and `pkgconfig` for system dependencies obtained with Pkg-config. - name: version returns: str description: | the version number as a string, for example `1.2.8`. `unknown` if the dependency provider doesn't support determining the version. - name: include_type returns: str since: 0.52.0 description: Returns the value set by the `include_type` kwarg. - name: as_system returns: dep since: 0.52.0 description: | Returns a copy of the dependency object, which has changed the value of `include_type` to `value`. The `value` argument is optional and defaults to `'system'`. optargs: value: type: str description: The new value. See [[dependency]] for supported values. - name: as_link_whole returns: dep since: 0.56.0 description: | Only dependencies created with [[declare_dependency]], returns a copy of the dependency object with all link_with arguments changed to link_whole. This is useful for example for fallback dependency from a subproject built with `default_library=static`. Note that all `link_with` objects must be static libraries otherwise an error will be raised when trying to `link_whole` a shared library. - name: partial_dependency returns: dep since: 0.46.0 description: | Returns a new dependency object with the same name, version, found status, type name, and methods as the object that called it. This new object will only inherit other attributes from its parent as controlled by keyword arguments. If the parent has any dependencies, those will be applied to the new partial dependency with the same rules. So, given: ```meson dep1 = declare_dependency(compile_args : '-Werror=foo', link_with : 'libfoo') dep2 = declare_dependency(compile_args : '-Werror=bar', dependencies : dep1) dep3 = dep2.partial_dependency(compile_args : true) ``` dep3 will add `['-Werror=foo', '-Werror=bar']` to the compiler args of any target it is added to, but libfoo will not be added to the link_args. The following arguments will add the following attributes: - compile_args: any arguments passed to the compiler - link_args: any arguments passed to the linker - links: anything passed via link_with or link_whole - includes: any include_directories - sources: any compiled or static sources the dependency has warnings: - A bug present until 0.50.1 results in the above behavior not working correctly. kwargs: compile_args: type: bool default: false description: Whether to include compile_args link_args: type: bool default: false description: Whether to include link_args links: type: bool default: false description: Whether to include links includes: type: bool default: false description: Whether to include includes sources: type: bool default: false description: Whether to include sources - name: get_variable returns: str since: 0.51.0 description: | A generic variable getter method, which replaces the `get_*type*_variable` methods. This allows one to get the variable from a dependency without knowing specifically how that dependency was found. If `default_value` is set and the value cannot be gotten from the object then `default_value` is returned, if it is not set then an error is raised. warnings: - Before 1.3.0, specifying multiple pkgconfig_define pairs would silently malform the results. Only the first variable would be redefined, but its value would contain both the second variable name, as well as its value. optargs: varname: type: str since: 0.58.0 description: | This argument is used as a default value for `cmake`, `pkgconfig`, `configtool` and `internal` keyword arguments. It is useful in the common case where `pkgconfig` and `internal` use the same variable name, in which case it's easier to write `dep.get_variable('foo')` instead of `dep.get_variable(pkgconfig: 'foo', internal: 'foo')`. kwargs: cmake: type: str description: The CMake variable name pkgconfig: type: str description: The pkgconfig variable name configtool: type: str description: The configtool variable name internal: type: str since: 0.54.0 description: The internal variable name default_value: type: str description: The default value to return when the variable does not exist pkgconfig_define: type: list[str] description: See [[dep.get_pkgconfig_variable]] muon-v0.4.0/subprojects/meson-docs/docs/yaml/objects/exe.yaml0000644000175000017500000000012514737503617023254 0ustar buildbuildname: exe long_name: Executable target description: An executable extends: build_tgt muon-v0.4.0/subprojects/meson-docs/docs/yaml/objects/cfg_data.yaml0000644000175000017500000000717614737503617024240 0ustar buildbuildname: cfg_data long_name: Configuration data object description: | This object encapsulates configuration values to be used for generating configuration files. A more in-depth description can be found in the [the configuration wiki page](Configuration.md). methods: - name: set returns: void description: Sets a variable to a given value posargs: varname: type: str description: The name of the variable to set value: type: str | int | bool description: The value to set kwargs: description: type: str description: | Message / Comment that will be written in the result file. The replacement assumes a file with C syntax. If your generated file is source code in some other language, you probably don't want to add a description field because it most likely will cause a syntax error. - name: set10 returns: void description: | Is the same as [[cfg_data.set]] but the value is either `true` or `false` and will be written as 1 or 0, respectively posargs: varname: type: str description: The name of the variable to set value: type: bool | int description: | The value to set as either `1` or `0` Passing numbers was never intended to work, and since 0.62 it has been deprecated. It will be removed in a future version of Meson. If you need to pass numbers use the `.set` method. warnings: - numeric values < 0 have the surprising behavior of being converted to `true`, values > 1 have the more expected but unintentional behavior of being interpreted as `true`. kwargs_inherit: cfg_data.set - name: set_quoted returns: void description: Is same as [[cfg_data.set]] but quotes the value in double quotes (`"`) posargs: varname: type: str description: The name of the variable to set value: type: str | int | bool description: The value to set kwargs_inherit: cfg_data.set - name: get returns: str | int | bool since: 0.38.0 description: | Returns the value of `varname`, if the value has not been set returns `default_value` if it is defined *(since 0.38.0)* and errors out if not posargs: varname: type: str description: The name of the variable to query optargs: default_value: type: str | int | bool description: The default value to return when `varname` does not exist - name: get_unquoted returns: str | int | bool since: 0.44.0 description: | Returns the value of `varname` but without surrounding double quotes (`"`). If the value has not been set returns `default_value` if it is defined and errors out if not. posargs: varname: type: str description: The name of the variable to query optargs: default_value: type: str | int | bool description: The default value to return when `varname` does not exist - name: has returns: bool description: returns `true` if the specified variable is set posargs: varname: type: str description: The name of the variable to query - name: keys returns: list[str] since: 0.57.0 description: | Returns an array of keys of the configuration data object. You can iterate over this array with the [`foreach` statement](Syntax.md#foreach-statements). - name: merge_from returns: void since: 0.42.0 description: | Takes as argument a different configuration data object and copies all entries from that object to the current. posargs: other: type: cfg_data description: The other [[@cfg_data]] object to merge into this one. muon-v0.4.0/subprojects/meson-docs/docs/yaml/objects/subproject.yaml0000644000175000017500000000163214737503617024657 0ustar buildbuildname: subproject long_name: Subproject object description: This object is returned by [[subproject]] and is an opaque object representing it. methods: - name: found returns: bool since: 0.48.0 description: Returns whether the subproject was successfully setup. - name: get_variable returns: any description: | fetches the specified variable from inside the subproject. This is useful to, for instance, get a [[declare_dependency]] from the [subproject](Subprojects.md). If the variable does not exist, the variable `fallback` is returned. If a fallback is not specified, then attempting to read a non-existing variable will cause a fatal error. arg_flattening: false posargs: var_name: type: str description: The name of the variable to query optargs: fallback: type: any description: The fallback value to return if `var_name` does not exist. muon-v0.4.0/subprojects/meson-docs/docs/yaml/elementary/0002755000175000017500000000000014737503617022327 5ustar buildbuildmuon-v0.4.0/subprojects/meson-docs/docs/yaml/elementary/str.yml0000644000175000017500000002040314737503617023657 0ustar buildbuildname: str long_name: String description: | All [strings](Syntax.md#strings) have the following methods. Strings are immutable, all operations return their results as a new string. methods: # str.format(fmt, value...) - name: format returns: str description: | Strings can be built using the string formatting functionality. See [the Meson syntax entry](Syntax.md#string-formatting) for more information. *Since 1.3.0* values other than strings, integers, bools, options, dictionaries and lists thereof are deprecated. They were previously printing the internal representation of the raw Python object. example: | ```meson template = 'string: @0@, number: @1@, bool: @2@' res = template.format('text', 1, true) # res now has value 'string: text, number: 1, bool: true' ``` arg_flattening: false posargs: fmt: description: | The string to format. The formatting works by replacing placeholders of type `@number@` with the corresponding varargs. type: str varargs: name: value description: The values to replace the @number@ placeholders in the format string. type: int | bool | str # str.replace(old, new) - name: replace description: Search all occurrences of `old` and replace it with `new` returns: str since: 0.58.0 example: | ```meson # Replaces all instances of one substring with another s = 'semicolons;as;separators' s = s.replace('as', 'are') # 's' now has the value of 'semicolons;are;separators' ``` posargs: old: description: The substring to search type: str new: description: The replacement string type: str # str.strip() - name: strip description: | Removes leading/ending characters from the string. By default the characters to remove are spaces and newlines. returns: str example: | ```meson # Similar to the Python str.strip(). Removes leading/ending spaces and newlines define = ' -Dsomedefine ' stripped_define = define.strip() # 'stripped_define' now has the value '-Dsomedefine' ``` optargs: strip_chars: type: str since: 0.43.0 description: Instead of whitespace, strip all the characters in this string. # str.to_lower() - name: to_lower description: Converts all characters to lower case returns: str example: | ```meson target = 'x86_FreeBSD' lower = target.to_lower() # t now has the value 'x86_freebsd' ``` # str.to_upper() - name: to_upper description: Converts all characters to upper case returns: str example: | ```meson target = 'x86_FreeBSD' upper = target.to_upper() # t now has the value 'X86_FREEBSD' ``` # str.to_int() - name: to_int description: Converts the string to an int and throws an error if it can't be returns: int example: | ```meson version = '1' # Converts the string to an int and throws an error if it can't be ver_int = version.to_int() ``` # str.contains() - name: contains returns: bool description: Returns `true` if string contains the string specified as the argument. example: | ```meson target = 'x86_FreeBSD' is_fbsd = target.to_lower().contains('freebsd') # is_fbsd now has the boolean value 'true' ``` posargs: fragment: type: str description: The string fragment to check # str.startswith() - name: startswith returns: bool description: Returns true if string starts with the string specified as the argument. posargs_inherit: str.contains example: | ```meson target = 'x86_FreeBSD' is_x86 = target.startswith('x86') # boolean value 'true' ``` # str.endswith() - name: endswith returns: bool description: Returns true if string ends with the string specified as the argument. posargs_inherit: str.contains example: | ```meson target = 'x86_FreeBSD' is_bsd = target.to_lower().endswith('bsd') # boolean value 'true' ``` # str.substring() - name: substring returns: str since: 0.56.0 description: | Returns a substring specified from `start` to `end`. Both `start` and `end` arguments are optional, so, for example, `'foobar'.substring()` will return `'foobar'`. The method accepts negative values where negative `start` is relative to the end of string `len(string) - start` as well as negative `end`. If `start` or `end` are out of bounds, the position of the closest character will be used. If `start` is bigger than `end`, the result will be an empty substring. example: | ```meson # Similar to the Python str[start:end] syntax target = 'x86_FreeBSD' platform = target.substring(0, 3) # prefix string value 'x86' system = target.substring(4) # suffix string value 'FreeBSD' ``` Example with negative values: ```meson string = 'foobar' string.substring(-5, -3) # => 'oo' string.substring(1, -1) # => 'ooba' ``` Example with out of bound values: ```meson string = 'foobar' string.substring(64) # => '' string.substring(0, 64) # => 'foobar' string.substring(64, 0) # => '' ``` optargs: start: type: int description: The start position end: type: int description: The end position # str.split - name: split returns: list[str] description: | Splits the string at the specified character (or whitespace if not set) and returns the parts in an array. example: | ```meson # Similar to the Python str.split() components = 'a b c d '.split() # components now has the value ['a', 'b', 'c', 'd'] components = 'a b c d '.split(' ') # components now has the value ['a', 'b', '', '', 'c', 'd', ''] ``` optargs: split_string: type: str description: Specifies the character / substring where to split the string. - name: splitlines returns: list[str] since: 1.2.0 description: | Splits the string into an array of lines. Unlike .split('\n'), the empty string produced an empty array, and if the string ends in a newline, splitlines() doesn't split on that last newline. '\n', '\r' and '\r\n' are all considered newlines. example: | ```meson output = 'hello\nworld\n'.splitlines() # Output value is ['hello', 'world'] output = ''.splitlines() # Output value is [] fs = import('fs') paths = fs.read('my_paths.list').splitlines() # paths is now the paths listed in 'my_paths.list', or an empty list # if 'my_paths.list' is empty ``` # str.join() - name: join returns: str description: | The opposite of split, for example `'.'.join(['a', 'b', 'c']` yields `'a.b.c'`. example: | ```meson # Similar to the Python str.join() output = ' '.join(['foo', 'bar']) # Output value is 'foo bar' pathsep = ':' path = pathsep.join(['/usr/bin', '/bin', '/usr/local/bin']) # path now has the value '/usr/bin:/bin:/usr/local/bin' ``` varargs: name: strings type: str since: 0.60.0 description: | The strings to join with the current string. Before Meson *0.60.0* this function only accepts a single positional argument of the type [[list[str]]]. # str.underscorify - name: underscorify returns: str description: Creates a string where every non-alphabetical non-number character is replaced with `_`. example: | ```meson name = 'Meson Docs.txt#Reference-manual' # Replaces all characters other than `a-zA-Z0-9` with `_` (underscore) # Useful for substituting into #defines, filenames, etc. underscored = name.underscorify() # underscored now has the value 'Meson_Docs_txt_Reference_manual' ``` # str.version_compare - name: version_compare returns: bool description: Does semantic version comparison. example: | ```meson version = '1.2.3' # Compare version numbers semantically is_new = version.version_compare('>=2.0') # is_new now has the boolean value false # Supports the following operators: '>', '<', '>=', '<=', '!=', '==', '=' ``` Meson version comparison conventions include: ```meson '3.6'.version_compare('>=3.6.0') == false ``` It is best to be unambiguous and specify the full revision level to compare. posargs: compare_string: type: str description: The string to compare to. muon-v0.4.0/subprojects/meson-docs/docs/yaml/elementary/bool.yml0000644000175000017500000000144314737503617024005 0ustar buildbuildname: bool long_name: Boolean description: A boolean object which is either `true` or `false` methods: - name: to_int returns: int description: Returns `1` if `true` and `0` if `false` - name: to_string returns: str description: | Returns the string `'true'` if the boolean is true or `'false'` otherwise. You can also pass it two strings as positional arguments to specify what to return for true/false. For instance, `bool.to_string('yes', 'no')` will return `yes` if the boolean is true and `no` if it is false. optargs: true_str: type: str default: "'true'" description: The string to return when the boolean is `true` false_str: type: str default: "'false'" description: The string to return when the boolean is `false` muon-v0.4.0/subprojects/meson-docs/docs/yaml/elementary/any.yaml0000644000175000017500000000020614737503617023776 0ustar buildbuildname: any long_name: Any description: | A placeholder representing all types. This includes builtin, as well as returned objects. muon-v0.4.0/subprojects/meson-docs/docs/yaml/elementary/int.yml0000644000175000017500000000145214737503617023644 0ustar buildbuildname: int long_name: Integer description: All integer numbers. See [Numbers](Syntax.md#numbers) for more information. methods: - name: is_even returns: bool description: Returns true if the number is even. - name: is_odd returns: bool description: Returns true if the number is odd - name: to_string returns: str description: Returns the value of the number as a string. optargs: fill: type: int description: | Left fill the string with zeros until it reaches the length specified by this argument. A leading negative sign counts towards the length, and is handled by inserting the padding after the `-` character rather than before. The original string is returned if the value provided is less than or equal to the former's length. muon-v0.4.0/subprojects/meson-docs/docs/yaml/elementary/dict.yml0000644000175000017500000000246614737503617024003 0ustar buildbuildname: dict long_name: Dict since: 0.47.0 is_container: true description: | Stores a mapping of strings to other objects. See [dictionaries](Syntax.md#dictionaries). You can also iterate over dictionaries with the [`foreach` statement](Syntax.md#foreach-statements). *(since 0.48.0)*: Dictionaries can be added (e.g. `d1 = d2 + d3` and `d1 += d2`). Values from the second dictionary overrides values from the first. *(since 0.62.0)*: Dictionary order is guaranteed to be insertion order. methods: - name: has_key returns: bool description: Returns `true` if the dictionary contains the key given as argument, `false` otherwise. posargs: key: type: str description: The key to query. - name: get returns: any description: | returns the value for the key given as first argument if it is present in the dictionary, or the optional fallback value given as the second argument. If a single argument was given and the key was not found, causes a fatal error arg_flattening: false posargs: key: type: str description: The key to query. optargs: fallback: type: any description: Fallback value that is returned if the key is not in the [[@dict]]. - name: keys returns: list[str] description: Returns an array of keys in the dictionary. muon-v0.4.0/subprojects/meson-docs/docs/yaml/elementary/list.yml0000644000175000017500000000176714737503617024036 0ustar buildbuildname: list long_name: List description: An array of elements. See [arrays](Syntax.md#arrays). is_container: true methods: - name: contains returns: bool description: | Returns `true` if the array contains the object given as argument, `false` otherwise arg_flattening: false posargs: item: type: any description: The item to check - name: get returns: any description: | returns the object at the given index, negative indices count from the back of the array, indexing out of bounds returns the `fallback` value *(since 0.38.0)* or, if it is not specified, causes a fatal error arg_flattening: false posargs: index: type: int description: Index of the list position to query. Negative values start at the end of the list optargs: fallback: type: any description: Fallback value that is returned if the index is out of range. - name: length returns: int description: Returns the current size of the array / list. muon-v0.4.0/subprojects/meson-docs/docs/yaml/elementary/void.yml0000644000175000017500000000020314737503617024004 0ustar buildbuildname: void long_name: void description: | Indicates that the function does not return anything. Similar to `void` in C and C++ muon-v0.4.0/subprojects/meson-docs/docs/yaml/modules/0002755000175000017500000000000014737503617021632 5ustar buildbuildmuon-v0.4.0/subprojects/meson-docs/docs/yaml/modules/cmake/0002755000175000017500000000000014737503617022712 5ustar buildbuildmuon-v0.4.0/subprojects/meson-docs/docs/yaml/modules/cmake/options.yaml0000644000175000017500000000060714737503617025272 0ustar buildbuildname: cmake_options long_name: CMake subproject options description: Central configuration object for CMake subprojects since: 0.55.0 methods: - name: add_cmake_defines returns: void description: Add CMake defines (`-D=`) to the CMake commandline varargs: name: defines description: A `key` `value` map of CMake defines to add (`-D=`) type: dict[str] muon-v0.4.0/subprojects/meson-docs/docs/yaml/modules/cmake/module.yaml0000644000175000017500000000027014737503617025060 0ustar buildbuildname: cmake long_name: CMake module description: The CMake module methods: - name: subproject_options description: Returns an empty `cmake_options` object. returns: cmake_options muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/0002755000175000017500000000000014737503617022172 5ustar buildbuildmuon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/project.yaml0000644000175000017500000001200114737503617024514 0ustar buildbuildname: project returns: void description: | The first function called in each project, to initialize Meson. The first argument to this function must be a string defining the name of this project. The project name can be any string you want, it's not used for anything except descriptive purposes. However since it is written to e.g. the dependency manifest is usually makes sense to have it be the same as the project tarball or pkg-config name. So for example you would probably want to use the name _libfoobar_ instead of _The Foobar Library_. It may be followed by the list of programming languages that the project uses. *(since 0.40.0)* The list of languages is optional. These languages may be used both for `native: false` (the default) (host machine) targets and for `native: true` (build machine) targets. *(since 0.56.0)* The build machine compilers for the specified languages are not required. Supported values for languages are `c`, `cpp` (for `C++`), `cuda`, `cython`, `d`, `objc`, `objcpp`, `fortran`, `java`, `cs` (for `C#`), `vala` and `rust`. posargs: project_name: type: str description: The name of the project. varargs: name: language type: str description: The languages that Meson should initialize. kwargs: default_options: type: list[str] | dict[str | bool | int | list[str]] description: | Accepts strings in the form `key=value` which have the same format as options to `meson configure`. For example to set the default project type you would set this: `default_options : ['buildtype=debugoptimized']`. Note that these settings are only used when running Meson for the first time. Global options such as `buildtype` can only be specified in the master project, settings in subprojects are ignored. Project specific options are used normally even in subprojects. Note that some options can override the default behavior; for example, using `c_args` here means that the `CFLAGS` environment variable is not used. Consider using [[add_project_arguments()]] instead. *(since 1.2.0)*: A dictionary may now be passed. version: type: str | file description: | A free form string describing the version of this project. You can access the value in your Meson build files with [[meson.project_version]]. *(Since 0.57.0)* this can also be a [[@file]] object pointing to a file that contains exactly one line of text. meson_version: type: str description: | Takes a string describing which Meson version the project requires. Usually something like `>=0.28.0`. license: type: str | list[str] description: | Takes a string or array of strings describing the license(s) the code is under. This *should* be an [SPDX license expression](https://spdx.dev/ids/), using the standardized license identifier from the [SPDX license list](https://spdx.org/licenses/). Usually this would be something like `license : 'GPL-2.0-or-later'`. If there are multiple licenses you can use the `AND` and `OR` operators to join them: `license : 'Apache-2.0 OR GPL-2.0'`. For backwards compatibility reasons you can also pass an array of licenses here. This is not recommended, as it is ambiguous: `license : ['Apache-2.0', 'GPL-2.0-only']` instead use an SPDX expression: `license : 'Apache-2.0 OR GPL-2.0-only'`, which makes it clear that the license mean OR, not AND. Note that the text is informal and is only written to the dependency manifest. Meson does not do any license validation, you are responsible for verifying that you abide by all licensing terms. You can access the value in your Meson build files with `meson.project_license()`. license_files: type: str | list[str] since: 1.1.0 description: | Takes a string or array of strings with the paths to the license file(s) the code is under. This enhances the value of the `license` kwarg by allowing to specify both the short license name and the full license text. Usually this would be something like `license_files: ['COPYING']`. Note that the files are informal and are only installed with the dependency manifest. Meson does not do any license validation, you are responsible for verifying that you abide by all licensing terms. You can access the value in your Meson build files with [[meson.project_license_files]]. subproject_dir: type: str default: "'subprojects'" description: | Specifies the top level directory name that holds Meson subprojects. This is only meant as a compatibility option for existing code bases that house their embedded source code in a custom directory. All new projects should not set this but instead use the default value. It should be noted that this keyword argument is ignored inside subprojects. There can be only one subproject dir and it is set in the top level Meson file. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/environment.yaml0000644000175000017500000000214414737503617025421 0ustar buildbuildname: environment returns: env since: 0.35.0 description: Returns an empty [[@env]] object. arg_flattening: false optargs: env: type: str | list[str] | dict[str] | dict[list[str]] since: 0.52.0 description: | If provided, each key/value pair is added into the [[@env]] object as if [[env.set]] method was called for each of them. Since *0.62.0* list of strings is allowed in dictionary values. In that case values are joined using the separator. kwargs: separator: type: str since: 0.62.0 description: | The separator to use for the initial values defined in the first positional argument. If not explicitly specified, the default path separator for the host operating system will be used, i.e. ';' for Windows and ':' for UNIX/POSIX systems. method: type: str since: 0.62.0 description: | Must be one of 'set', 'prepend', or 'append' (defaults to 'set'). Controls if initial values defined in the first positional argument are prepended, appended or replace the current value of the environment variable. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/install_subdir.yaml0000644000175000017500000000571214737503617026077 0ustar buildbuildname: install_subdir returns: void description: | Installs the entire given subdirectory and its contents from the source tree to the location specified by the keyword argument `install_dir`. *(since 0.45.0, deprecated since 0.60.0)* If the subdirectory does not exist in the source tree, an empty directory is created in the specified location. A newly created subdirectory may only be created in the keyword argument `install_dir`. There are a number of flaws with this method, and it was never intentionally designed to work this way, please use [[install_emptydir]] instead. example: | For a given directory `foo`: ```text foo/ bar/ file1 file2 ``` `install_subdir('foo', install_dir : 'share', strip_directory : false)` creates ```text share/ foo/ bar/ file1 file2 ``` `install_subdir('foo', install_dir : 'share', strip_directory : true)` creates ```text share/ bar/ file1 file2 ``` `install_subdir('foo/bar', install_dir : 'share', strip_directory : false)` creates ```text share/ bar/ file1 ``` `install_subdir('foo/bar', install_dir : 'share', strip_directory : true)` creates ```text share/ file1 ``` `install_subdir('new_directory', install_dir : 'share')` creates ```text share/ new_directory/ ``` warnings: - the `install_mode` kwarg ignored integer values between 0.59.0 -- 1.1.0. posargs: subdir_name: type: str description: The sub-directory to install kwargs: install_mode: type: list[str | int | bool] since: 0.47.0 description: | Specify the file mode in symbolic format and optionally the owner/uid and group/gid for the installed files. See the `install_mode` kwarg of [[install_data]] for more information. install_tag: type: str since: 0.60.0 description: | A string used by the `meson install --tags` command to install only a subset of the files. By default these files have no install tag which means they are not being installed when `--tags` argument is specified. exclude_files: type: list[str] description: | A list of file names that should not be installed. Names are interpreted as paths relative to the `subdir_name` location. exclude_directories: type: list[str] since: 0.47.0 description: | A list of directory names that should not be installed. Names are interpreted as paths relative to the `subdir_name` location. install_dir: type: str description: Where to install to. strip_directory: type: bool since: 0.45.0 default: false description: | Install directory contents. If `strip_directory=true` only the last component of the source path is used. follow_symlinks: type: bool since: 1.3.0 default: true description: | If true, dereferences links and copies their target instead. The default value will become false in the future. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/subdir.yaml0000644000175000017500000000144114737503617024344 0ustar buildbuildname: subdir returns: void description: | Enters the specified subdirectory and executes the `meson.build` file in it. Once that is done, it returns and execution continues on the line following this `subdir()` command. Variables defined in that `meson.build` file are then available for use in later parts of the current build file and in all subsequent build files executed with `subdir()`. Note that this means that each `meson.build` file in a source tree can and must only be executed once. posargs: dir_name: type: str description: | Directory relative to the current `meson.build` to enter. Cannot contain `..` kwargs: if_found: type: list[dep] since: 0.44.0 description: Only enter the subdir if all [[dep.found]] methods return `true`. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/set_variable.yaml0000644000175000017500000000063414737503617025517 0ustar buildbuildname: set_variable returns: void description: | Assigns a value to the given variable name. Calling `set_variable('foo', bar)` is equivalent to `foo = bar`. *(since 0.46.1)* The `value` parameter can be an array type. arg_flattening: false posargs: variable_name: type: str description: The name of the variable to set value: type: any description: The value to set the variable to muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/error.yaml0000644000175000017500000000046114737503617024206 0ustar buildbuildname: error returns: void description: Print the argument string and halts the build process. arg_flattening: false posargs: message: type: str description: The message to print varargs: name: msg since: 0.58.0 type: str description: Additional parameters will be separated by spaces muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/structured_sources.yaml0000644000175000017500000000144514737503617027027 0ustar buildbuildname: structured_sources returns: structured_src since: 0.62.0 description: | Create a StructuredSource object, which is opaque and may be passed as a source to any build_target (including static_library, shared_library, executable, etc.). This is useful for languages like Rust, which use the filesystem layout to determine import names. This is only allowed in Rust targets, and cannot be mixed with non structured inputs. posargs: root: type: list[str | file | custom_tgt | custom_idx | generated_list] description: Sources to put at the root of the generated structure optargs: additional: type: dict[str | file | custom_tgt | custom_idx | generated_list] description: | Additional sources, where the key is the directory under the root to place the values muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/get_option.yaml0000644000175000017500000000204314737503617025222 0ustar buildbuildname: get_option returns: str | int | bool | feature | list[str | int | bool] description: | Obtains the value of the [project build option](Build-options.md) specified in the positional argument. Note that the value returned for built-in options that end in `dir` such as `bindir` and `libdir` is usually a path relative to (and inside) the `prefix` but you should not rely on that, as it can also be an absolute path [in some cases](Builtin-options.md#universal-options). [`install_dir` arguments](Installing.md) handle that as expected but if you need an absolute path, e.g. to use in a define etc., you should use the path concatenation operator like this: `get_option('prefix') / get_option('localstatedir')`. Never manually join paths as if they were strings. For options of type `feature` a [[@feature]] option object is returned instead of a string. See [`feature` options](Build-options.md#features) documentation for more details. posargs: option_name: type: str description: Name of the option to query muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/include_directories.yaml0000644000175000017500000000361014737503617027073 0ustar buildbuildname: include_directories returns: inc description: | Returns an opaque object which contains the directories (relative to the current directory) given in the positional arguments. The result can then be passed to the `include_directories:` keyword argument when building executables or libraries. You can use the returned object in any subdirectory you want, Meson will make the paths work automatically. Note that this function call itself does not add the directories into the search path, since there is no global search path. For something like that, see [`add_project_arguments()`](#add_project_arguments). See also `implicit_include_directories` parameter of [[executable]], which adds current source and build directories to include path. Each directory given is converted to two include paths: one that is relative to the source root and one relative to the build root. example: | For example, with the following source tree layout in `/home/user/project.git`: `meson.build`: ```meson project(...) subdir('include') subdir('src') ... ``` `include/meson.build`: ```meson inc = include_directories('.') ... ``` `src/meson.build`: ```meson sources = [...] executable('some-tool', sources, include_directories : inc, ...) ... ``` If the build tree is `/tmp/build-tree`, the following include paths will be added to the `executable()` call: `-I/tmp/build-tree/include -I/home/user/project.git/include`. varargs: name: includes type: str description: Include paths to add. kwargs: is_system: type: bool default: false description: | If set to `true`, flags the specified directories as system directories. This means that they will be used with the `-isystem` compiler argument rather than `-I` on compilers that support this flag (in practice everything except Visual Studio). muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/test.yaml0000644000175000017500000000521614737503617024037 0ustar buildbuildname: test returns: void description: | Defines a test to run with the test harness. Takes two positional arguments, the first is the name of the test and the second is the executable to run. The executable can be an [[@exe]] object returned by [[executable]] or an [[@external_program]] object] returned by [[find_program]]. *(since 0.55.0)* When cross compiling, if an exe_wrapper is needed and defined the environment variable `MESON_EXE_WRAPPER` will be set to the string value of that wrapper (implementation detail: using `mesonlib.join_args`). Test scripts may use this to run cross built binaries. If your test needs `MESON_EXE_WRAPPER` in cross build situations it is your responsibility to return code 77 to tell the harness to report "skip". By default, environment variable [`MALLOC_PERTURB_`](http://man7.org/linux/man-pages/man3/mallopt.3.html) is automatically set by `meson test` to a random value between 1..255. This can help find memory leaks on configurations using glibc, including with non-GCC compilers. However, this can have a performance impact, and may fail a test due to external libraries whose internals are out of the user's control. To check if this feature is causing an expected runtime crash, disable the feature by temporarily setting environment variable `MALLOC_PERTURB_=0`. While it's preferable to only temporarily disable this check, if a project requires permanent disabling of this check in meson.build do like: ```meson nomalloc = environment({'MALLOC_PERTURB_': '0'}) test(..., env: nomalloc, ...) ``` By default, the environment variables `ASAN_OPTIONS`, `UBSAN_OPTIONS`, and `MSAN_OPTIONS` are set to enable aborting on detected violations and to give a backtrace. To suppress this, `ASAN_OPTIONS`, `UBSAN_OPTIONS`, or `MSAN_OPTIONS` can be set in the environment. In addition to running individual executables as test cases, `test()` can also be used to invoke an external test harness. In this case, it is best to use `verbose: true` *(since 0.62.0)* and, if supported by the external harness, `protocol: 'tap'` *(since 0.50.0)*. This will ensure that Meson logs each subtest as it runs, instead of including the whole log at the end of the run. Defined tests can be run in a backend-agnostic way by calling `meson test` inside the build dir, or by using backend-specific commands, such as `ninja test` or `msbuild RUN_TESTS.vcxproj`. posargs_inherit: benchmark kwargs_inherit: benchmark kwargs: is_parallel: type: bool default: true description: | when false, specifies that no other test must be running at the same time as this test muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/generator.yaml0000644000175000017500000000631514737503617025047 0ustar buildbuildname: generator returns: generator description: | See also: [[custom_target]] This function creates a [[@generator]] object that can be used to run custom compilation commands. The only positional argument is the executable to use. It can either be a self-built executable or one returned by find_program. The template strings passed to all the keyword arguments accept the following special substitutions: - `@PLAINNAME@`: the complete input file name, e.g: `foo.c` becomes `foo.c` (unchanged) - `@BASENAME@`: the base of the input filename, e.g.: `foo.c.y` becomes `foo.c` (extension is removed) Each string passed to the `output` keyword argument *must* be constructed using one or both of these two substitutions. In addition to the above substitutions, the `arguments` keyword argument also accepts the following: - `@OUTPUT@`: the full path to the output file - `@INPUT@`: the full path to the input file - `@DEPFILE@`: the full path to the depfile - `@SOURCE_DIR@`: the full path to the root of the source tree - `@CURRENT_SOURCE_DIR@`: this is the directory where the currently processed meson.build is located in - `@BUILD_DIR@`: the full path to the root of the build dir where the output will be placed NOTE: Generators should only be used for outputs that will ***only*** be used as inputs for a [[build_target]] or a [[custom_target]]. When you use the processed output of a generator in multiple targets, the generator will be run multiple times to create outputs for each target. Each output will be created in a target-private directory `@BUILD_DIR@`. If you want to generate files for general purposes such as for generating headers to be used by several sources, or data that will be installed, and so on, use a [[custom_target]] instead. posargs: exe: type: exe | external_program description: Executable for the command to run kwargs: arguments: type: list[str] description: A list of template strings that will be the command line arguments passed to the executable. depends: # Not sure why this is not just `target` type: list[build_tgt | custom_tgt | custom_idx] since: 0.51.0 description: | An array of build targets that must be built before this generator can be run. This is used if you have a generator that calls a second executable that is built in this project (custom_idx was not available between 0.60 and 1.4.0). depfile: type: str description: | A template string pointing to a dependency file that a generator can write listing all the additional files this target depends on, for example a C compiler would list all the header files it included, and a change in any one of these files triggers a recompilation, output: type: list[str] description: | Template string (or list of template strings) defining how an output file name is (or multiple output names are) generated from a single source file name. capture: type: bool default: false since: 0.43.0 description: | When this argument is set to true, Meson captures `stdout` of the `executable` and writes it to the target file specified as `output`. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/get_variable.yaml0000644000175000017500000000123614737503617025502 0ustar buildbuildname: get_variable returns: any description: | This function can be used to dynamically obtain a variable. `res = get_variable(varname, fallback)` takes the value of `varname` (which must be a string) and stores the variable of that name into `res`. If the variable does not exist, the variable `fallback` is stored to `res`instead. If a fallback is not specified, then attempting to read a non-existing variable will cause a fatal error. arg_flattening: false posargs: variable_name: type: str description: Name of the variable to get optargs: default: type: any description: Fallback value to return when the variable does not exist muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/debug.yaml0000644000175000017500000000062114737503617024141 0ustar buildbuildname: debug returns: void since: 0.63.0 description: Write the argument string to the meson build log. posargs: message: type: str | int | bool | list[str | int | bool] | dict[str | int | bool] description: The message to print varargs: name: msg type: str | int | bool | list[str | int | bool] | dict[str | int | bool] description: Additional parameters will be separated by spaces muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/both_libraries.yaml0000644000175000017500000000101614737503617026042 0ustar buildbuildname: both_libraries returns: both_libs since: 0.46.0 description: | Builds both a static and shared library with the given sources. Positional and keyword arguments are otherwise the same as for [[library]]. Source files will be compiled only once and object files will be reused to build both shared and static libraries, unless `b_staticpic` user option or `pic` argument are set to false in which case sources will be compiled twice. posargs_inherit: library varargs_inherit: library kwargs_inherit: library muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/jar.yaml0000644000175000017500000000110614737503617023626 0ustar buildbuildname: jar returns: jar description: | Build a jar from the specified Java source files. Keyword arguments are the same as [[executable]]'s, with the addition of `main_class` which specifies the main class to execute when running the jar with `java -jar file.jar`. posargs_inherit: _build_target_base varargs_inherit: _build_target_base kwargs_inherit: _build_target_base kwargs: main_class: type: str description: Main class for running the built jar java_resources: type: structured_src since: 0.62.0 description: Resources to be added to the jar muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/files.yaml0000644000175000017500000000150714737503617024161 0ustar buildbuildname: files returns: list[file] description: | This command takes the strings given to it in arguments and returns corresponding File objects that you can use as sources for build targets. The difference is that file objects remember the subdirectory they were defined in and can be used anywhere in the source tree. example: | As an example suppose you have source file `foo.cpp` in subdirectory `bar1` and you would like to use it in a build target that is defined in `bar2`. To make this happen you first create the object in `bar1` like this: ```meson foofile = files('foo.cpp') ``` Then you can use it in `bar2` like this: ```meson executable('myprog', 'myprog.cpp', foofile, ...) ``` Meson will then do the right thing. varargs: name: file type: str description: Path to the file. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/unset_variable.yaml0000644000175000017500000000036714737503617026065 0ustar buildbuildname: unset_variable returns: void since: 0.60.0 description: | Unsets a variable. Referencing a variable which has been unset is an error until it has been set again. posargs: varname: type: str description: The variable to unset. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/add_languages.yaml0000644000175000017500000000267614737503617025645 0ustar buildbuildname: add_languages returns: bool description: | Add programming languages used by the project. This is equivalent to having them in the `project` declaration. This function is usually used to add languages that are only used under some conditions. Returns `true` if all languages specified were found and `false` otherwise. If `native` is omitted, the languages may be used for either build or host machine, but are never required for the build machine. (i.e. it is equivalent to `add_languages(*langs*, native: false, required: *required*) and add_languages(*langs*, native: true, required: false)`. This default behaviour may change to `native: false` in a future Meson version. example: | ```meson project('foobar', 'c') if compiling_for_osx add_languages('objc') endif if add_languages('cpp', required : false) executable('cpp-app', 'main.cpp') endif # More code... ``` varargs: type: str name: Language description: The languages to add kwargs: required: type: bool | feature default: true description: | If set to `true`, Meson will halt if any of the languages specified are not found. *(since 0.47.0)* The value of a [`feature`](Build-options.md#features) option can also be passed. native: type: bool since: 0.54.0 description: | If set to `true`, the language will be used to compile for the build machine, if `false`, for the host machine. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/disabler.yaml0000644000175000017500000000013414737503617024637 0ustar buildbuildname: disabler returns: disabler description: Returns a [[@disabler]] object. since: 0.44.0 muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/configure_file.yaml0000644000175000017500000001273214737503617026041 0ustar buildbuildname: configure_file returns: file description: | This function can run in three modes depending on the keyword arguments passed to it. When a [[@cfg_data]] object is passed to the `configuration:` keyword argument, it takes a template file as the `input:` (optional) and produces the `output:` (required) by substituting values from the configuration data as detailed in [the configuration file documentation](Configuration.md). *(since 0.49.0)* A dictionary can be passed instead of a [[@cfg_data]] object. When a list of strings is passed to the `command:` keyword argument, it takes any source or configured file as the `input:` and assumes that the `output:` is produced when the specified command is run. *(since 0.47.0)* When the `copy:` keyword argument is set to `true`, this function will copy the file provided in `input:` to a file in the build directory with the name `output:` in the current directory. warnings: - the `install_mode` kwarg ignored integer values between 0.62 -- 1.1.0. kwargs: capture: type: bool since: 0.41.0 default: false description: | When this argument is set to true, Meson captures `stdout` of the `command` and writes it to the target file specified as `output`. command: type: list[str | file | compiler | external_program | exe] description: | As explained above, if specified, Meson does not create the file itself but rather runs the specified command, which allows you to do fully custom file generation. *(since 0.52.0)* The command can contain file objects and more than one file can be passed to the `input` keyword argument, see [[custom_target]] for details about string substitutions. configuration: type: "cfg_data | dict[str | int | bool]" description: | As explained above, when passed this will provide the replacement data for the input file (if provided) or key value pairs to be written to the output. copy: type: bool default: false since: 0.47.0 description: | As explained above, if specified Meson only copies the file from input to output. depfile: type: str since: 0.52.0 description: | A dependency file that the command can write listing all the additional files this target depends on. A change in any one of these files triggers a reconfiguration. format: type: str since: 0.46.0 default: "'meson'" description: | The format of defines. It defaults to `'meson'`, and so substitutes `#mesondefine` statements and variables surrounded by `@` characters, you can also use `'cmake'` to replace `#cmakedefine` statements and variables with the `${variable}` syntax. Finally you can use `'cmake@'` in which case substitutions will apply on `#cmakedefine` statements and variables with the `@variable@` syntax. input: type: str | file description: | The input file name. If it's not specified in configuration mode, all the variables in the `configuration:` object (see above) are written to the `output:` file. install: type: bool default: false since: 0.50.0 description: | When true, this generated file is installed during the install step, and `install_dir` must be set and not empty. When false, this generated file is not installed regardless of the value of `install_dir`. When omitted it defaults to true when `install_dir` is set and not empty, false otherwise. install_dir: type: str | bool description: | The subdirectory to install the generated file to (e.g. `share/myproject`), if omitted or given the value of empty string, the file is not installed. install_mode: type: list[str | int | bool] since: 0.47.0 description: | Specify the file mode in symbolic format and optionally the owner/uid and group/gid for the installed files. See the `install_mode` kwarg of [[install_data]] for more information. install_tag: type: str since: 0.60.0 description: | A string used by the `meson install --tags` command to install only a subset of the files. By default the file has no install tag which means it is not being installed when `--tags` argument is specified. output: type: str description: | The output file name. *(since 0.41.0)* may contain `@PLAINNAME@` or `@BASENAME@` substitutions, as well as *(since 1.5.0)* their indexed versions, like `@PLAINNAME0@` or `@BASENAME0@`. In configuration mode, the permissions of the input file (if it is specified) are copied to the output file. output_format: type: str since: 0.47.0 description: | The format of the output to generate when no input was specified. It defaults to `c`, in which case preprocessor directives will be prefixed with `#`, you can also use `nasm`, in which case the prefix will be `%`. *(since 1.3.0)* `json` format can also be used. encoding: type: str default: "'utf-8'" since: 0.47.0 description: | Set the file encoding for the input and output file. The supported encodings are those of python3, see [standard-encodings](https://docs.python.org/3/library/codecs.html#standard-encodings). macro_name: type: str since: 1.3.0 description: | When specified, macro guards will be used instead of '#pragma once'. The macro guard name will be the specified name. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/add_test_setup.yaml0000644000175000017500000000347614737503617026075 0ustar buildbuildname: add_test_setup returns: void description: | Add a custom test setup. This setup can be used to run the tests with a custom setup, for example under Valgrind. To use the test setup, run `meson test --setup=*name*` inside the build dir. Note that all these options are also available while running the `meson test` script for running tests instead of `ninja test` or `msbuild RUN_TESTS.vcxproj`, etc depending on the backend. posargs: name: type: str description: The name of the test setup kwargs: env: type: env | list[str] | dict[str] description: | environment variables to set , such as `['NAME1=value1', 'NAME2=value2']`, or an [[@env]] object which allows more sophisticated environment juggling. *(Since 0.52.0)* A dictionary is also accepted. exe_wrapper: type: list[str | external_program] description: The command or script followed by the arguments to it gdb: type: bool default: false description: If `true`, the tests are also run under `gdb` timeout_multiplier: type: int default: 1 description: | A number to multiply the test timeout with. *Since 0.57* if timeout_multiplier is `<= 0` the test has infinite duration, in previous versions of Meson the test would fail with a timeout immediately. is_default: type: bool since: 0.49.0 default: false description: | Set whether this is the default test setup. If `true`, the setup will be used whenever `meson test` is run without the `--setup` option. exclude_suites: type: list[str] since: 0.57.0 description: A list of test suites that should be excluded when using this setup. Suites specified in the `--suite` option to `meson test` will always run, overriding `add_test_setup` if necessary.muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/declare_dependency.yaml0000644000175000017500000000473414737503617026661 0ustar buildbuildname: declare_dependency returns: dep description: | This function returns a [[@dep]] object that behaves like the return value of [[dependency]] but is internal to the current build. The main use case for this is in subprojects. This allows a subproject to easily specify how it should be used. This makes it interchangeable with the same dependency that is provided externally by the system. kwargs: compile_args: type: list[str] description: Compile arguments to use. dependencies: type: list[dep] description: Other dependencies needed to use this dependency. include_directories: type: list[inc | str] description: | the directories to add to header search path, must be [[@inc]] objects or *(since 0.50.0)* plain strings. link_args: type: list[str] description: Link arguments to use. link_with: type: list[lib] description: Libraries to link against. link_whole: type: list[lib] since: 0.46.0 description: Libraries to link fully, same as [[executable]]. sources: type: list[str | file | custom_tgt | custom_idx | generated_list] description: | sources to add to targets (or generated header files that should be built before sources including them are built) extra_files: type: list[str | file] since: 1.2.0 description: | extra files to add to targets. mostly used for IDE integration. version: type: str description: | the version of this dependency, such as `1.2.3`. Defaults to the project version. variables: type: dict[str] | list[str] since: 0.54.0 description: | a dictionary of arbitrary strings, this is meant to be used in subprojects where special variables would be provided via cmake or pkg-config. *since 0.56.0* it can also be a list of `'key=value'` strings. d_module_versions: type: str | int | list[str | int] since: 0.62.0 description: | The [D version identifiers](https://dlang.org/spec/version.html#version) to add during the compilation of D source files. d_import_dirs: type: list[inc | str] since: 0.62.0 description: | the directories to add to the string search path (i.e. `-J` switch for DMD). Must be [[@inc]] objects or plain strings. objects: type: list[extracted_obj] since: 1.1.0 description: | a list of object files, to be linked directly into the targets that use the dependency. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/custom_target.yaml0000644000175000017500000002344714737503617025746 0ustar buildbuildname: custom_target returns: custom_tgt description: | Create a custom top level build target. The only positional argument is the name of this target and cannot contain path separators (`/` or `\`). The name of custom target might not be used by every backends, for instance with the Ninja backend, `subdir/meson.build` containing the example below, `ninja -C builddir foo` or `ninja -C builddir subdir/foo` won't work, it is instead `ninja -C builddir subdir/file.txt`. However, `meson compile subdir/foo` is accepted. ```meson custom_target('foo', output: 'file.txt', ...) ``` *Since 0.60.0* the name argument is optional and defaults to the basename of the first output (`file.txt` in the example above). The list of strings passed to the `command` keyword argument accept the following special string substitutions: - `@INPUT@`: the full path to the input passed to `input`. If more than one input is specified, all of them will be substituted as separate arguments only if the command uses `'@INPUT@'` as a standalone-argument. For instance, this would not work: `command : ['cp', './@INPUT@']`, but this would: `command : ['cp', '@INPUT@']`. - `@OUTPUT@`: the full path to the output passed to `output`. If more than one outputs are specified, the behavior is the same as `@INPUT@`. - `@INPUT0@` `@INPUT1@` `...`: the full path to the input with the specified array index in `input` - `@OUTPUT0@` `@OUTPUT1@` `...`: the full path to the output with the specified array index in `output` - `@OUTDIR@`: the full path to the directory where the output(s) must be written - `@DEPFILE@`: the full path to the dependency file passed to `depfile` - `@PLAINNAME@`: the input filename, without a path - `@PLAINNAME0@` `@PLAINNAME1@` `...` *(since 1.5.0)*: the input filename without a path, with the specified array index in `input` - `@BASENAME@`: the input filename, with extension removed - `@BASENAME0@` `@BASENAME1@` `...` *(since 1.5.0)*: the input filename with extension removed, with the specified array index in `input` - `@PRIVATE_DIR@` *(since 0.50.1)*: path to a directory where the custom target must store all its intermediate files. - `@SOURCE_ROOT@`: the path to the root of the source tree. Depending on the backend, this may be an absolute or a relative to current workdir path. - `@BUILD_ROOT@`: the path to the root of the build tree. Depending on the backend, this may be an absolute or a relative to current workdir path. - `@CURRENT_SOURCE_DIR@`: this is the directory where the currently processed meson.build is located in. Depending on the backend, this may be an absolute or a relative to current workdir path. *(since 0.47.0)* The `depfile` keyword argument also accepts the `@BASENAME@` and `@PLAINNAME@` substitutions. The returned object also has methods that are documented in [[@custom_tgt]]. notes: - | Assuming that `command:` is executed by a POSIX `sh` shell is not portable, notably to Windows. Instead, consider using a `native: true` [[executable]], or a python script. warnings: - the `install_mode` kwarg ignored integer values between 0.60.0 -- 1.1.0. optargs: name: type: str description: | The *unique* id of the custom target This posarg is optional *since 0.60.0*. It defaults to the basename of the first output. kwargs: build_by_default: type: bool since: 0.38.0 description: | Causes, when set to true, to have this target be built by default. This means it will be built when `meson compile` is called without any arguments. The default value is `false`. *(since 0.50.0)* If `build_by_default` is explicitly set to false, `install` will no longer override it. If `build_by_default` is not set, `install` will still determine its default. build_always: type: bool deprecated: 0.47.0 description: | If `true` this target is always considered out of date and is rebuilt every time. Equivalent to setting both `build_always_stale` and `build_by_default` to true. build_always_stale: type: bool since: 0.47.0 default: false description: | If `true` the target is always considered out of date. Useful for things such as build timestamps or revision control tags. The associated command is run even if the outputs are up to date. capture: type: bool default: false description: | There are some compilers that can't be told to write their output to a file but instead write it to standard output. When this argument is set to true, Meson captures `stdout` and writes it to the target file. Note that your command argument list may not contain `@OUTPUT@` when capture mode is active. console: type: bool since: 0.48.0 description: | Keyword argument conflicts with `capture`, and is meant for commands that are resource-intensive and take a long time to finish. With the Ninja backend, setting this will add this target to [Ninja's `console` pool](https://ninja-build.org/manual.html#_the_literal_console_literal_pool), which has special properties such as not buffering stdout and serializing all targets in this pool. command: type: list[str | file | exe | external_program | custom_tgt | build_tgt | custom_idx] description: | Command to run to create outputs from inputs. The command may be strings or the return value of functions that return file-like objects such as [[find_program]], [[executable]], [[configure_file]], [[files]], [[custom_target]], etc. Meson will automatically insert the appropriate dependencies on targets and files listed in this keyword argument. Note: always specify commands in array form `['commandname', '-arg1', '-arg2']` rather than as a string `'commandname -arg1 -arg2'` as the latter will *not* work. depend_files: type: list[str | file] description: | files ([[@str]], [[@file]], or the return value of [[configure_file]] that this target depends on but are not listed in the `command` keyword argument. Useful for adding regen dependencies. depends: type: list[build_tgt | custom_tgt | custom_idx] description: | Specifies that this target depends on the specified target(s), even though it does not take any of them as a command line argument. This is meant for cases where you have a tool that e.g. does globbing internally. Usually you should just put the generated sources as inputs and Meson will set up all dependencies automatically (custom_idx was unavailable as a type between 0.60 and 1.4.0). depfile: type: str description: | A dependency file that the command can write listing all the additional files this target depends on, for example a C compiler would list all the header files it included, and a change in any one of these files triggers a recompilation. *(since 0.47.0)* the `@BASENAME@` and `@PLAINNAME@` substitutions are also accepted. input: type: list[str | file | build_tgt | custom_idx | custom_tgt | external_program | extracted_obj | generated_list] description: List of source files. *(since 0.41.0)* the list is flattened. install: type: bool description: When true, one or more files of this target are installed during the install step (see `install_dir` for details). install_dir: type: bool | str | list[bool | str] description: | If only one install_dir is provided, all outputs are installed there. *Since 0.40.0* Allows you to specify the installation directory for each corresponding output. For example: ```meson custom_target('different-install-dirs', output : ['first.file', 'second.file'], install : true, install_dir : ['somedir', 'otherdir']) ``` This would install `first.file` to `somedir` and `second.file` to `otherdir`. To only install some outputs, pass `false` for the outputs that you don't want installed. For example: ```meson custom_target('only-install-second', output : ['first.file', 'second.file'], install : true, install_dir : [false, 'otherdir']) ``` This would install `second.file` to `otherdir` and not install `first.file`. install_mode: type: list[str | int | bool] since: 0.47.0 description: | The file mode and optionally the owner/uid and group/gid. See the `install_mode` kwarg of [[install_data]] for more information. install_tag: type: list[str | bool] since: 0.60.0 description: | A list of strings, one per output, used by the `meson install --tags` command to install only a subset of the files. By default all outputs have no install tag which means they are not being installed when `--tags` argument is specified. If only one tag is specified, it is assumed that all outputs have the same tag. `false` can be used for outputs that have no tag or are not installed. output: type: list[str] description: List of output files. env: since: 0.57.0 type: env | list[str] | dict[str] description: | environment variables to set, such as `{'NAME1': 'value1', 'NAME2': 'value2'}` or `['NAME1=value1', 'NAME2=value2']`, or an [[@env]] object which allows more sophisticated environment juggling. feed: type: bool since: 0.59.0 default: false description: | There are some compilers that can't be told to read their input from a file and instead read it from standard input. When this argument is set to `true`, Meson feeds the input file to `stdin`. Note that your argument list may not contain `@INPUT@` when feed mode is active. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/join_paths.yaml0000644000175000017500000000137114737503617025214 0ustar buildbuildname: join_paths returns: str since: 0.36.0 description: | Joins the given strings into a file system path segment. For example `join_paths('foo', 'bar')` results in `foo/bar`. If any one of the individual segments is an absolute path, all segments before it are dropped. That means that `join_paths('foo', '/bar')` returns `/bar`. *(since 0.49.0)* Using the `/` operator on strings is equivalent to calling [[join_paths]]. ```meson # res1 and res2 will have identical values res1 = join_paths(foo, bar) res2 = foo / bar ``` warnings: - Don't use [[join_paths]] for sources in [[library]] and [[executable]]. You should use [[files]] instead. varargs: name: part type: str description: The path parts to join. min_varargs: 1 muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/is_disabler.yaml0000644000175000017500000000027614737503617025341 0ustar buildbuildname: is_disabler returns: bool since: 0.52.0 description: Returns true if a variable is a disabler and false otherwise. posargs: var: type: any description: The variable to test muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/dependency.yaml0000644000175000017500000002232514737503617025176 0ustar buildbuildname: dependency returns: dep description: | Finds an external dependency (usually a library installed on your system) with the given name with `pkg-config` and [with CMake](Dependencies.md#cmake) if `pkg-config` fails. Additionally, frameworks (OSX only) and [library-specific fallback detection logic](Dependencies.md#dependencies-with-custom-lookup-functionality) are also supported. *Since 0.60.0* more than one name can be provided, they will be tried in order and the first name to be found will be used. The fallback subproject will be used only if none of the names are found on the system. Once one of the name has been found, all other names are added into the cache so subsequent calls for any of those name will return the same value. This is useful in case a dependency could have different names, such as `png` and `libpng`. * Since *0.64.0* a dependency fallback can be provided by WrapDB. Simply download the database locally using `meson wrap update-db` command and Meson will automatically fallback to subprojects provided by WrapDB if the dependency is not found on the system and the project does not ship their own `.wrap` file. Dependencies can also be resolved in two other ways: * if the same name was used in a `meson.override_dependency` prior to the call to `dependency`, the overriding dependency will be returned unconditionally; that is, the overriding dependency will be used independent of whether an external dependency is installed in the system. Typically, `meson.override_dependency` will have been used by a subproject. * by a fallback subproject which, if needed, will be brought into the current build specification as if [`subproject()`](#subproject) had been called. The subproject can be specified with the `fallback` argument. Alternatively, if the `fallback` argument is absent, *since 0.55.0* Meson can automatically identify a subproject as a fallback if a wrap file [provides](Wrap-dependency-system-manual.md#provide-section) the dependency, or if a subproject has the same name as the dependency. In the latter case, the subproject must use `meson.override_dependency` to specify the replacement, or Meson will report a hard error. See the [Wrap documentation](Wrap-dependency-system-manual.md#provide-section) for more details. This automatic search can be controlled using the `allow_fallback` keyword argument. If `dependency_name` is `''`, the dependency is always not found. So with `required: false`, this always returns a dependency object for which the `found()` method returns `false`, and which can be passed like any other dependency to the `dependencies:` keyword argument of a `build_target`. This can be used to implement a dependency which is sometimes not required e.g. in some branches of a conditional, or with a `fallback:` kwarg, can be used to declare an optional dependency that only looks in the specified subproject, and only if that's allowed by `--wrap-mode`. The returned object [[@dep]] also has additional methods. notes: - This function supports additional [library-specific](Dependencies.md#dependencies-with-custom-lookup-functionality) keyword arguments that may also be accepted (e.g. `modules` specifies submodules to use for dependencies such as Qt5 or Boost. `components` allows the user to manually add CMake `COMPONENTS` for the `find_package` lookup) varargs: name: names type: str since: 0.60.0 min_varargs: 1 description: | The names of the dependency to look up. The dependencies are looked up in the order they are provided here. The first found dependency will then be used. The fallback subproject will be used only if none of the names are found on the system. Once one of the name has been found, all other names are added into the cache so subsequent calls for any of those name will return the same value. This is useful in case a dependency could have different names, such as `png` and `libpng`. **NOTE:** Before *0.60.0* only a single dependency name was allowed. kwargs: default_options: type: list[str] | dict[str | bool | int | list[str]] since: 0.38.0 description: | An array of default option values that override those set in the subproject's `meson.options` (like `default_options` in [[project]], they only have effect when Meson is run for the first time, and command line arguments override any default options in build files) *(since 1.2.0)*: A dictionary may now be passed. allow_fallback: type: bool since: 0.56.0 description: | Specifies whether Meson should automatically pick a fallback subproject in case the dependency is not found in the system. If `true` and the dependency is not found on the system, Meson will fallback to a subproject that provides this dependency. If `false`, Meson will not fallback even if a subproject provides this dependency. By default, Meson will do so if `required` is `true` or [`enabled`](Build-options.md#features); see the [Wrap documentation](Wrap-dependency-system-manual.md#provide-section) for more details. fallback: type: list[str] | str description: | Manually specifies a subproject fallback to use in case the dependency is not found in the system. This is useful if the automatic search is not applicable or if you want to support versions of Meson older than 0.55.0. If the value is an array `['subproj_name', 'subproj_dep']`, the first value is the name of the subproject and the second is the variable name in that subproject that contains a dependency object such as the return value of [[declare_dependency]] or [[dependency]], etc. Note that this means the fallback dependency may be a not-found dependency, in which case the value of the `required:` kwarg will be obeyed. *Since 0.54.0* the value can be a single string, the subproject name; in this case the subproject must use `meson.override_dependency('dependency_name', subproj_dep)` to specify the dependency object used in the superproject. If the value is an empty list, it has the same effect as `allow_fallback: false`. language: type: str since: 0.42.0 description: | Defines what language-specific dependency to find if it's available for multiple languages. method: type: str since: 0.40.0 default: "'auto'" description: | Defines the way the dependency is detected, the default is `auto` but can be overridden to be e.g. `qmake` for Qt development, and [different dependencies support different values]( Dependencies.md#dependencies-with-custom-lookup-functionality) for this (though `auto` will work on all of them) native: type: bool default: false description: | If set to `true`, causes Meson to find the dependency on the build machine system rather than the host system (i.e. where the cross compiled binary will run on), usually only needed if you build a tool to be used during compilation. not_found_message: type: str since: 0.50.0 description: An optional string that will be printed as a [[message]] if the dependency was not found. required: type: bool | feature default: true description: | When set to `false`, Meson will proceed with the build even if the dependency is not found. When set to a [`feature`](Build-options.md#features) option, the feature will control if it is searched and whether to fail if not found. *(since 0.47.0)* The value of a `feature` option can also be passed. static: type: bool default: false description: | Tells the dependency provider to try to get static libraries instead of dynamic ones (note that this is not supported by all dependency backends) *Since 0.60.0* it also sets `default_library` option accordingly on the fallback subproject if it was not set explicitly in `default_options` keyword argument. version: type: list[str] | str since: 0.37.0 description: | Specifies the required version, a string containing a comparison operator followed by the version string, examples include `>1.0.0`, `<=2.3.5` or `3.1.4` for exact matching. You can also specify multiple restrictions by passing a list to this keyword argument, such as: `['>=3.14.0', '<=4.1.0']`. These requirements are never met if the version is unknown. include_type: type: str default: "'preserve'" since: 0.52.0 description: | An enum flag, marking how the dependency flags should be converted. Supported values are `'preserve'`, `'system'` and `'non-system'`. System dependencies may be handled differently on some platforms, for instance, using `-isystem` instead of `-I`, where possible. If `include_type` is set to `'preserve'`, no additional conversion will be performed. disabler: type: bool default: false since: 0.49.0 description: | Returns a [[disabler]] object instead of a not-found dependency if this kwarg is set to `true` and the dependency couldn't be found. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/vcs_tag.yaml0000644000175000017500000000401614737503617024503 0ustar buildbuildname: vcs_tag returns: custom_tgt description: | This command detects revision control commit information at build time and places it in the specified output file. This file is guaranteed to be up to date on every build. Keywords are similar to [[custom_target]]. Meson will read the contents of `input`, substitute the `replace_string` with the detected revision number, and write the result to `output`. This method returns a [[@custom_tgt]] object that (as usual) should be used to signal dependencies if other targets use the file outputted by this. For example, if you generate a header with this and want to use that in a build target, you must add the return value to the sources of that build target. Without that, Meson will not know the order in which to build the targets. If you desire more specific behavior than what this command provides, you should use [[custom_target]]. kwargs: command: type: list[exe | external_program | custom_tgt | file | str] description: | The command to execute, see [[custom_target]] for details on how this command must be specified. This parameter is optional. If it is absent, Meson will try its best to find a suitable default command. *(since 0.62.0)* [[@file]] is accepted. *(since 0.63.0)* [[@custom_tgt]], [[@exe]], and [[@external_program]] are accepted. input: type: list[build_tgt | custom_idx | custom_tgt | external_program | extracted_obj | file | generated_list | str] required: true description: File to modify (e.g. `version.c.in`). output: type: str required: true description: File to write the results to (e.g. `version.c`). fallback: type: str default: "[[meson.project_version]]" description: | Version number to use when no revision control information is present, such as when building from a release tarball. replace_string: type: str default: "'@VCS_TAG@'" description: String in the input file to substitute with the commit information. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/is_variable.yaml0000644000175000017500000000031114737503617025327 0ustar buildbuildname: is_variable returns: bool since: 0.52.0 description: Returns true if a variable of the given name exists and false otherwise. posargs: var: type: str description: The variable to test muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/run_command.yaml0000644000175000017500000000315714737503617025364 0ustar buildbuildname: run_command returns: runresult description: | Runs the command specified in positional arguments. `command` can be a string, or the output of [[find_program]], [[files]] or [[configure_file]], or [a compiler object](#compiler-object). Returns a [[@runresult]] object containing the result of the invocation. The command is run from an *unspecified* directory, and Meson will set three environment variables `MESON_SOURCE_ROOT`, `MESON_BUILD_ROOT` and `MESON_SUBDIR` that specify the source directory, build directory and subdirectory the target was defined in, respectively. See also [External commands](External-commands.md). varargs: name: command type: str | file | external_program | compiler description: The command to execute during the setup process. kwargs: check: type: bool since: 0.47.0 default: false description: | If `true`, the exit status code of the command will be checked, and the configuration will fail if it is non-zero. Note that the default value will be `true` in future releases. capture: type: bool since: 0.47.0 default: true description: | If `true`, any output generated on stdout will be captured and returned by the `.stdout()` method. If it is false, then `.stdout()` will return an empty string. env: type: env | list[str] | dict[str] since: 0.50.0 description: | environment variables to set, such as `['NAME1=value1', 'NAME2=value2']`, or an [[@env]] object which allows more sophisticated environment juggling. *(Since 0.52.0)* A dictionary is also accepted. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/find_program.yaml0000644000175000017500000001220114737503617025517 0ustar buildbuildname: find_program returns: external_program | exe description: | `program_name` here is a string that can be an executable or script to be searched for in `PATH` or other places inside the project. The search order is: 1. Program overrides set via [[meson.override_find_program]] 1. [`[provide]` sections](Wrap-dependency-system-manual.md#provide-section) in subproject wrap files, if [`wrap_mode`](Builtin-options.md#core-options) is set to `forcefallback` 1. [`[binaries]` section](Machine-files.md#binaries) in your machine files 1. Directories provided using the `dirs:` kwarg (see below) 1. Project's source tree relative to the current subdir - If you use the return value of [[configure_file]], the current subdir inside the build tree is used instead 1. `PATH` environment variable 1. [`[provide]` sections](Wrap-dependency-system-manual.md#provide-section) in subproject wrap files, if [`wrap_mode`](Builtin-options.md#core-options) is set to anything other than `nofallback` Meson will also autodetect scripts with a shebang line and run them with the executable/interpreter specified in it both on Windows (because the command invocator will reject the command otherwise) and Unixes (if the script file does not have the executable bit set). Hence, you *must not* manually add the interpreter while using this script as part of a list of commands. Since *0.50.0* if the "python3" program is requested and it is not found in the system, Meson will return its current interpreter. If you need to check for a program in a non-standard location, you can just pass an absolute path to `find_program`, e.g. ```meson setcap = find_program('setcap', '/usr/sbin/setcap', '/sbin/setcap', required : false) ``` It is also possible to pass an array to `find_program` in case you need to construct the set of paths to search on the fly: ```meson setcap = find_program(['setcap', '/usr/sbin/setcap', '/sbin/setcap'], required : false) ``` *Since 1.2.0* `find_program('meson')` is automatically overridden to the Meson command used to execute the build script. The returned [[@external_program]] object also has documented methods. posargs: program_name: type: str | file description: | The name of the program to search, or a [[@file]] object to be used without searching. varargs: name: fallback type: str | file since: 0.37.0 description: | These parameters are used as fallback names to search for. This is meant to be used for cases where the program may have many alternative names, such as `foo` and `foo.py`. The function will check for the arguments one by one and the first one that is found is returned. kwargs: required: type: bool | feature default: true description: | When `true`, Meson will abort if no program can be found. If `required` is set to `false`, Meson continue even if none of the programs can be found. You can then use the `.found()` method on the returned [[@external_program]] to check whether it was found or not. *(since 0.47.0)* The value of a [`feature`](Build-options.md#features) option can also be passed to the `required` keyword argument. native: type: bool default: false since: 0.43.0 description: | Defines how this executable should be searched. By default it is set to `false`, which causes Meson to first look for the executable in the cross file (when cross building) and if it is not defined there, then from the system. If set to `true`, the cross file is ignored and the program is only searched from the system. disabler: type: bool since: 0.49.0 default: false description: | If `true` and the program couldn't be found, return a [[@disabler]] object instead of a not-found object. version: type: list[str] since: 0.52.0 description: | Specifies the required version, see [[dependency]] for argument format. By default, the version of the program is determined by running `program_name --version` command. If stdout is empty it fallbacks to stderr. If the output contains more text than simply a version number, only the first occurrence of numbers separated by dots is kept. If the output is more complicated than that, the version checking will have to be done manually using [[run_command]]. version_argument: type: str since: 1.5.0 description: | Specifies the argument to pass when trying to find the version of the program. If this is unspecified, `program_name --version` will be used. dirs: type: list[str] since: 0.53.0 description: extra list of absolute paths where to look for program names. default_options: type: list[str] | dict[str | bool | int | list[str]] since: 1.3.0 description: | An array of default option values that override those set in the subproject's `meson.options` (like `default_options` in [[project]], they only have effect when Meson is run for the first time, and command line arguments override any default options in build files) muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/add_project_arguments.yaml0000644000175000017500000000105314737503617027416 0ustar buildbuildname: add_project_arguments returns: void description: | Adds project specific arguments to the compiler command line. This function behaves in the same way as [[add_global_arguments]] except that the arguments are only used for the current project, they won't be used in any other subproject. notes: - You must pass always arguments individually `arg1, arg2, ...` rather than as a string `'arg1 arg2', ...` varargs: type: str name: Compiler argument description: The compiler arguments to add kwargs_inherit: add_global_arguments muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/executable.yaml0000644000175000017500000000407614737503617025204 0ustar buildbuildname: executable returns: exe description: | Creates a new executable. The first argument specifies its name and the remaining positional arguments define the input files to use. The lists for the kwargs (such as `sources`, `objects`, and `dependencies`) are always flattened, which means you can freely nest and add lists while creating the final list. The returned object also has methods that are documented in [[@exe]]. *Since 1.3.0* executable names can be the same across multiple targets as long as they each have a different `name_suffix`. warnings: - The `link_language` kwarg was broken until 0.55.0 posargs_inherit: _build_target_base varargs_inherit: _build_target_base kwargs_inherit: _build_target_base kwargs: export_dynamic: type: bool since: 0.45.0 description: | when set to true causes the target's symbols to be dynamically exported, allowing modules built using the [[shared_module]] function to refer to functions, variables and other symbols defined in the executable itself. Implies the `implib` argument. implib: type: bool | str since: 0.42.0 description: | When set to true, an import library is generated for the executable (the name of the import library is based on *exe_name*). Alternatively, when set to a string, that gives the base name for the import library. The import library is used when the returned build target object appears in `link_with:` elsewhere. Only has any effect on platforms where that is meaningful (e.g. Windows). Implies the `export_dynamic` argument. pie: type: bool since: 0.49.0 description: Build a position-independent executable. vs_module_defs: type: str | file | custom_tgt | custom_idx since: 1.3.0 description: | Specify a Microsoft module definition file for controlling symbol exports, etc., on platforms where that is possible (e.g. Windows). This can be used to expose which functions a shared_module loaded by an executable will be allowed to use. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/alias_target.yaml0000644000175000017500000000115514737503617025515 0ustar buildbuildname: alias_target since: 0.52.0 returns: alias_tgt description: | This function creates a new top-level target. Like all top-level targets, this integrates with the selected backend. For instance, with you can run it as `meson compile target_name`. This is a dummy target that does not execute any command, but ensures that all dependencies are built. Dependencies can be any build target. Since 0.60.0, this includes [[@run_tgt]]. posargs: target_name: type: str description: The name of the alias target varargs: name: Dep type: tgt min_varargs: 1 description: The targets to depend on muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/subdir_done.yaml0000644000175000017500000000144514737503617025355 0ustar buildbuildname: subdir_done returns: void since: 0.46.0 description: | Stops further interpretation of the Meson script file from the point of the invocation. All steps executed up to this point are valid and will be executed by Meson. This means that all targets defined before the call of [[subdir_done]] will be build. If the current script was called by `subdir` the execution returns to the calling directory and continues as if the script had reached the end. If the current script is the top level script Meson configures the project as defined up to this point. example: | ```meson project('example exit', 'cpp') executable('exe1', 'exe1.cpp') subdir_done() executable('exe2', 'exe2.cpp') ``` The executable `exe1` will be build, while the executable `exe2` is not build. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/install_headers.yaml0000644000175000017500000000445514737503617026225 0ustar buildbuildname: install_headers returns: void description: | Installs the specified header files from the source tree into the system header directory (usually `/{prefix}/include`) during the install step. This directory can be overridden by specifying it with the `install_dir` keyword argument. If you just want to install into a subdirectory of the system header directory, then use the `subdir` argument. As an example if this has the value `myproj` then the headers would be installed to `/{prefix}/include/myproj`. example: | For example, this will install `common.h` and `kola.h` into `/{prefix}/include`: ```meson install_headers('common.h', 'proj/kola.h') ``` This will install `common.h` and `kola.h` into `/{prefix}/include/myproj`: ```meson install_headers('common.h', 'proj/kola.h', subdir : 'myproj') ``` This will install `common.h` and `kola.h` into `/{prefix}/cust/myproj`: ```meson install_headers('common.h', 'proj/kola.h', install_dir : 'cust', subdir : 'myproj') ``` This will install `common.h` into `/{prefix}/include` and `kola.h` into `/{prefix}/include/proj/`: ```meson install_headers('common.h, 'proj/kola.h', preserve_path : true) ``` varargs: name: file type: file | str description: Header files to install. warnings: - the `install_mode` kwarg ignored integer values between 0.59.0 -- 1.1.0. kwargs: install_dir: type: str description: Where to install to. subdir: type: str description: | Install to the `subdir` subdirectory of the default includedir. Incompatible with the `install_dir` kwarg. install_mode: type: list[str | int | bool] since: 0.47.0 description: | Specify the file mode in symbolic format and optionally the owner/uid and group/gid for the installed files. See the `install_mode` kwarg of [[install_data]] for more information. preserve_path: type: bool since: 0.63.0 default: false description: | Disable stripping child-directories from header files when installing. This is equivalent to GNU Automake's `nobase` option. follow_symlinks: type: bool since: 1.3.0 default: true description: | If true, dereferences links and copies their target instead. The default value will become false in the future. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/benchmark.yaml0000644000175000017500000000771414737503617025017 0ustar buildbuildname: benchmark returns: void description: | Creates a benchmark item that will be run when the benchmark target is run. The behavior of this function is identical to [[test]] except for: * benchmark() has no `is_parallel` keyword because benchmarks are not run in parallel * benchmark() does not automatically add the `MALLOC_PERTURB_` environment variable Defined benchmarks can be run in a backend-agnostic way by calling `meson test --benchmark` inside the build dir, or by using backend-specific commands, such as `ninja benchmark` or `msbuild RUN_TESTS.vcxproj`. notes: - Prior to 0.52.0 benchmark would warn that `depends` and `priority` were unsupported, this is incorrect. posargs: name: type: str description: The *unique* test id executable: type: exe | jar | external_program | file | custom_tgt | custom_idx description: | The program to execute. *(Since 1.4.0)* A CustomTarget is also accepted. kwargs: args: type: list[str | file | build_tgt | custom_tgt | custom_idx] description: Arguments to pass to the executable env: type: env | list[str] | dict[str] description: | environment variables to set, such as `['NAME1=value1', 'NAME2=value2']`, or an [[@env]] object which allows more sophisticated environment juggling. *(Since 0.52.0)* A dictionary is also accepted. should_fail: type: bool default: false description: | when true the test is considered passed if the executable returns a non-zero return value (i.e. reports an error) suite: type: str | list[str] description: | `'label'` (or list of labels `['label1', 'label2']`) attached to this test. The suite name is qualified by a (sub)project name resulting in `(sub)project_name:label`. In the case of a list of strings, the suite names will be `(sub)project_name:label1`, `(sub)project_name:label2`, etc. timeout: type: int default: 30 description: | the amount of seconds the test is allowed to run, a test that exceeds its time limit is always considered failed, defaults to 30 seconds. *Since 0.57* if timeout is `<= 0` the test has infinite duration, in previous versions of Meson the test would fail with a timeout immediately. workdir: type: str description: | absolute path that will be used as the working directory for the test depends: type: list[build_tgt | custom_tgt] since: 0.46.0 description: | specifies that this test depends on the specified target(s), even though it does not take any of them as a command line argument. This is meant for cases where test finds those targets internally, e.g. plugins or globbing. Those targets are built before test is executed even if they have `build_by_default : false`. protocol: type: str since: 0.50.0 default: "'exitcode'" description: | specifies how the test results are parsed and can be one of `exitcode`, `tap`, or `gtest`. For more information about test harness protocol read [Unit Tests](Unit-tests.md). The following values are accepted: - `exitcode`: the executable's exit code is used by the test harness to record the outcome of the test). - `tap`: [Test Anything Protocol](https://www.testanything.org/). - `gtest` *(since 0.55.0)*: for Google Tests. - `rust` *(since 0.56.0)*: for native rust tests priority: type: int since: 0.52.0 default: 0 description: | specifies the priority of a test. Tests with a higher priority are *started* before tests with a lower priority. The starting order of tests with identical priorities is implementation-defined. The default priority is 0, negative numbers are permitted. verbose: type: bool since: 0.62.0 default: false description: | if true, forces the test results to be logged as if `--verbose` was passed to `meson test`. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/run_target.yaml0000644000175000017500000000477314737503617025241 0ustar buildbuildname: run_target returns: run_tgt description: | This function creates a new top-level target that runs a specified command with the specified arguments. Like all top-level targets, this integrates with the selected backend. For instance, you can run it as `meson compile target_name`. Note that a run target produces no output as far as Meson is concerned. It is only meant for tasks such as running a code formatter or flashing an external device's firmware with a built file. The command is run from an *unspecified* directory, and Meson will set three environment variables `MESON_SOURCE_ROOT`, `MESON_BUILD_ROOT` and `MESON_SUBDIR` that specify the source directory, build directory and subdirectory the target was defined in, respectively. *Since 0.57.0* The template strings passed to `command` keyword arguments accept the following special substitutions: - `@SOURCE_ROOT@`: the path to the root of the source tree. Depending on the backend, this may be an absolute or a relative to current workdir path. - `@BUILD_ROOT@`: the path to the root of the build tree. Depending on the backend, this may be an absolute or a relative to current workdir path. - `@CURRENT_SOURCE_DIR@` *Since 0.57.1*: this is the directory where the currently processed meson.build is located in. Depending on the backend, this may be an absolute or a relative to current workdir path. posargs: target_name: type: str description: The name of the run target kwargs: command: type: list[exe| external_program | custom_tgt | file | str] description: | A list containing the command to run and the arguments to pass to it. Each list item may be a string or a target. For instance, passing the return value of [[executable]] as the first item will run that executable, or passing a string as the first item will find that command in `PATH` and run it. depends: type: list[build_tgt | custom_tgt | custom_idx] description: | A list of targets that this target depends on but which are not listed in the command array (because, for example, the script does file globbing internally, custom_idx was not possible as a type between 0.60 and 1.4.0). env: since: 0.57.0 type: env | list[str] | dict[str] description: | environment variables to set, such as `{'NAME1': 'value1', 'NAME2': 'value2'}` or `['NAME1=value1', 'NAME2=value2']`, or an [[@env]] object which allows more sophisticated environment juggling. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/range.yaml0000644000175000017500000000213414737503617024150 0ustar buildbuildname: range returns: range since: 0.58.0 description: | Return an opaque object that can be only be used in `foreach` statements.
[[@range]] range([[@int]] stop)
  [[@range]] range([[@int]] start, [[@int]] stop[, [[@int]] step])
- `start` must be integer greater or equal to 0. Defaults to 0. - `stop` must be integer greater or equal to `start`. - `step` must be integer greater or equal to 1. Defaults to 1. It cause the `foreach` loop to be called with the value from `start` included to `stop` excluded with an increment of `step` after each loop. example: | ```meson # Loop 15 times with i from 0 to 14 included. foreach i : range(15) ... endforeach ``` The range object can also be assigned to a variable and indexed. ```meson r = range(5, 10, 2) assert(r[2] == 9) ``` optargs: start: type: int default: 0 description: The start of the range stop: type: int description: The end of the range step: type: int default: 1 description: The loop increment muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/import.yaml0000644000175000017500000000150314737503617024365 0ustar buildbuildname: import returns: module description: | Imports the given extension module. Returns an object that can be used to call the methods of the module. Here's an example for a hypothetical `testmod` module. example: | ```meson tmod = import('testmod') tmod.do_something() ``` posargs: module_name: type: str description: Name of the module to import. kwargs: required: type: bool | feature default: true since: 0.59.0 description: When set to `false`, Meson will proceed with the build even if the module is not found. When set to a [`feature`](Build-options.md#features) option, the feature will control if it is searched and whether to fail if not found. disabler: type: bool since: 0.59.0 description: Returns a [[@disabler]] object when not found. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/add_global_arguments.yaml0000644000175000017500000000256414737503617027220 0ustar buildbuildname: add_global_arguments returns: void description: Adds global arguments to the compiler command line. notes: - Usually you should use [[add_project_arguments]] instead, because that works even when you project is used as a subproject. - You must pass always arguments individually `arg1, arg2, ...` rather than as a string `'arg1 arg2', ...` varargs: type: str name: Compiler argument description: The compiler arguments to add kwargs: language: type: list[str] required: true description: | Specifies the language(s) that the arguments should be applied to. If a list of languages is given, the arguments are added to each of the corresponding compiler command lines. Note that there is no way to remove an argument set in this way. If you have an argument that is only used in a subset of targets, you have to specify it in per-target flags. native: type: bool default: false since: 0.48.0 description: | A boolean specifying whether the arguments should be applied to the native or cross compilation. If `true` the arguments will only be used for native compilations. If `false` the arguments will only be used in cross compilations. If omitted, the flags are added to native compilations if compiling natively and cross compilations (only) when cross compiling. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/install_symlink.yaml0000644000175000017500000000177414737503617026301 0ustar buildbuildname: install_symlink returns: void since: 0.61.0 description: | Installs a symbolic link to `pointing_to` target under install_dir. posargs: link_name: type: str description: | Name of the created link under `install_dir`. It cannot contain path separators. Those should go in `install_dir`. kwargs: pointing_to: type: str required: true description: | Target to point the link to. Can be absolute or relative and that will be respected when creating the link. install_dir: type: str required: true description: | The absolute or relative path to the installation directory for the links. If this is a relative path, it is assumed to be relative to the prefix. install_tag: type: str description: | A string used by the `meson install --tags` command to install only a subset of the files. By default these files have no install tag which means they are not being installed when `--tags` argument is specified. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/shared_module.yaml0000644000175000017500000000376514737503617025702 0ustar buildbuildname: shared_module returns: build_tgt since: 0.37.0 description: | Builds a shared module with the given sources. This is useful for building modules that will be `dlopen()`ed and hence may contain undefined symbols that will be provided by the library that is loading it. If you want the shared module to be able to refer to functions and variables defined in the [[executable]] it is loaded by, you will need to set the `export_dynamic` argument of the executable to `true`. notes: - | *Linking to a shared module on platforms other than Android is deprecated, and will be an error in the future*. It was previously allowed because it was the only way to have a shared-library-like target that contained references to undefined symbols. However, since 0.40.0, the `override_options:` [[build_target]] keyword argument can be used to create such a [[shared_library]] by passing `override_options: 'b_lundef=false'`. Shared modules have other characteristics that make them incompatible with linking, such as a lack of SONAME. On macOS and iOS, linking to shared modules is disallowed by the linker, so we disallow it at configure time. On Android, if a shared module `foo` uses symbols from another shared module `bar`, `foo` must also be linked to `bar`. Hence, linking one shared module to another will always be allowed when building for Android. posargs_inherit: _build_target_base varargs_inherit: _build_target_base kwargs_inherit: _build_target_base kwargs: vs_module_defs: type: str | file | custom_tgt | custom_idx since: 0.52.0 description: | Specify a Microsoft module definition file for controlling symbol exports, etc., on platforms where that is possible (e.g. Windows). *(Since 1.3.0)* [[@custom_idx]] are supported rust_abi: type: str since: 1.3.0 description: | Set the specific ABI to compile (when compiling rust). - 'rust' (default): Create a "dylib" crate. - 'c': Create a "cdylib" crate. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/assert.yaml0000644000175000017500000000060214737503617024353 0ustar buildbuildname: assert returns: void description: Abort with an error message if `condition` evaluates to `false`. notes: - The `message` argument is optional since 0.53.0 and defaults to print the condition statement. posargs: condition: type: bool description: Abort if this evaluates to `false` optargs: message: type: str description: The error message to print. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/install_emptydir.yaml0000644000175000017500000000167314737503617026446 0ustar buildbuildname: install_emptydir returns: void since: 0.60.0 description: | Installs a new directory entry to the location specified by the positional argument. If the directory exists and is not empty, the contents are left in place. warnings: - the `install_mode` kwarg ignored integer values before 1.1.0. varargs: name: dirpath type: str description: Directory to create during installation. kwargs: install_mode: type: list[str | int | bool] description: | Specify the file mode in symbolic format and optionally the owner/uid and group/gid for the created directory. See the `install_mode` kwarg of [[install_data]] for more information. install_tag: type: str description: | A string used by the `meson install --tags` command to install only a subset of the files. By default this directory has no install tag which means it is not installed when the `--tags` argument is specified. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/add_project_dependencies.yaml0000644000175000017500000000065714737503617030050 0ustar buildbuildname: add_project_dependencies since: 0.63.0 returns: void description: | Adds arguments to the compiler and linker command line, so that the given set of dependencies is included in all build products for this project. varargs: type: dep name: dependencies description: The dependencies to add; if internal dependencies are included, they must not include any built object. kwargs_inherit: add_global_arguments muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/build_target.yaml0000644000175000017500000000235414737503617025525 0ustar buildbuildname: build_target returns: build_tgt description: | Creates a build target whose type can be set dynamically with the `target_type` keyword argument. `target_type` may be set to one of: - `executable` (see [[executable]]) - `shared_library` (see [[shared_library]]) - `shared_module` (see [[shared_module]]) - `static_library` (see [[static_library]]) - `both_libraries` (see [[both_libraries]]) - `library` (see [[library]]) - `jar` (see [[jar]])* This declaration: ```meson executable() ``` is equivalent to this: ```meson build_target(, target_type : 'executable') ``` The lists for the kwargs (such as `sources`, `objects`, and `dependencies`) are always flattened, which means you can freely nest and add lists while creating the final list. The returned object also has methods that are documented in [[@build_tgt]]. *"jar" is deprecated because it is fundementally a different thing than the other build_target types. posargs_inherit: _build_target_base varargs_inherit: _build_target_base kwargs_inherit: - executable - library - jar kwargs: target_type: type: str description: The actual target type to build muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/library.yaml0000644000175000017500000000423114737503617024520 0ustar buildbuildname: library returns: lib description: | Builds a library that is either static, shared or both depending on the value of `default_library` user [option](https://mesonbuild.com/Builtin-options.html). You should use this instead of [[shared_library]], [[static_library]] or [[both_libraries]] most of the time. This allows you to toggle your entire project (including subprojects) from shared to static with only one option. This option applies to libraries being built internal to the entire project. For external dependencies, the default library type preferred is shared. This can be adapted on a per library basis using the [[dependency]] `static` keyword. The keyword arguments for this are the same as for [[build_target]] warnings: - using _shared_args and/or _static_args may lead to much higher compilation times with both_library, as object files cannot be shared between the static and shared targets. It is guaranteed to not duplicate the build if these arguments are empty arrays posargs_inherit: _build_target_base varargs_inherit: _build_target_base kwargs_inherit: - shared_library - static_library kwargs: rust_abi: type: str since: 1.3.0 description: | Set the specific ABI to compile (when compiling rust). - 'rust' (default): Create a "rlib" or "dylib" crate depending on the library type being build. - 'c': Create a "cdylib" or "staticlib" crate depending on the library type being build. _static_args: type: list[str] since: 1.3.0 description: Arguments that are only passed to a static library vala_static_args: type: list[str | file] since: 1.3.0 description: Arguments that are only passed to a static library Like `vala_args`, [[files]] is allowed in addition to string _shared_args: type: list[str] since: 1.3.0 description: Arguments that are only passed to a shared library vala_shared_args: type: list[str | file] since: 1.3.0 description: Arguments that are only passed to a shared library Like `vala_args`, [[files]] is allowed in addition to string muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/install_man.yaml0000644000175000017500000000245614737503617025364 0ustar buildbuildname: install_man returns: void description: | Installs the specified man files from the source tree into system's man directory during the install step. This directory can be overridden by specifying it with the `install_dir` keyword argument. *(since 0.49.0)* [manpages are no longer compressed implicitly][install_man_49]. [install_man_49]: https://mesonbuild.com/Release-notes-for-0-49-0.html#manpages-are-no-longer-compressed-implicitly varargs: name: file type: file | str description: Man pages to install. warnings: - the `install_mode` kwarg ignored integer values between 0.59.0 -- 1.1.0. kwargs: install_mode: type: list[str | int | bool] since: 0.47.0 description: | Specify the file mode in symbolic format and optionally the owner/uid and group/gid for the installed files. See the `install_mode` kwarg of [[install_data]] for more information. install_dir: type: str description: Where to install to. locale: type: str since: 0.58.0 description: | Can be used to specify the locale into which the man page will be installed within the manual page directory tree. An example manual might be `foo.fr.1` with a locale of `fr`, such that `{mandir}/{locale}/man{num}/foo.1` becomes the installed file. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/install_data.yaml0000644000175000017500000000467314737503617025525 0ustar buildbuildname: install_data returns: void description: | Installs files from the source tree that are listed as positional arguments. See [Installing](Installing.md) for more examples. varargs: name: file type: file | str description: Files to install. warnings: - the `install_mode` kwarg ignored integer values between 0.59.0 -- 1.1.0. - an omitted `install_dir` kwarg did not work correctly inside of a subproject until 1.3.0. - an omitted `install_dir` kwarg did not work correctly when combined with the `preserve_path` kwarg untill 1.3.0. kwargs: install_dir: type: str description: | The absolute or relative path to the installation directory. If this is a relative path, it is assumed to be relative to the prefix. If omitted, the directory defaults to `{datadir}/{projectname}` *(since 0.45.0)*. install_mode: type: list[str | int | bool] since: 0.38.0 description: | specify the file mode in symbolic format and optionally the owner/uid and group/gid for the installed files. For example: `install_mode: 'rw-r--r--'` for just the file mode `install_mode: ['rw-r--r--', 'nobody', 'nogroup']` for the file mode and the user/group `install_mode: ['rw-r-----', 0, 0]` for the file mode and uid/gid To leave any of these three as the default, specify `false`. install_tag: type: str since: 0.60.0 description: | A string used by the `meson install --tags` command to install only a subset of the files. By default these files have no install tag which means they are not being installed when `--tags` argument is specified. preserve_path: type: bool since: 0.64.0 default: false description: | Disable stripping child-directories from data files when installing. This is equivalent to GNU Automake's `nobase` option. rename: type: list[str] since: 0.46.0 description: | If specified renames each source file into corresponding file from `rename` list. Nested paths are allowed and they are joined with `install_dir`. Length of `rename` list must be equal to the number of sources. sources: type: list[file | str] description: Additional files to install. follow_symlinks: type: bool since: 1.3.0 default: true description: | If true, dereferences links and copies their target instead. The default value will become false in the future. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/warning.yaml0000644000175000017500000000030514737503617024517 0ustar buildbuildname: warning returns: void since: 0.44.0 description: This function prints its argument to stdout prefixed with WARNING:. arg_flattening: false posargs_inherit: message varargs_inherit: message muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/add_project_link_arguments.yaml0000644000175000017500000000070314737503617030434 0ustar buildbuildname: add_project_link_arguments returns: void description: | Adds project specific arguments to the linker command line. Like [[add_project_arguments]] but the arguments are passed to the linker. notes: - You must pass always arguments individually `arg1, arg2, ...` rather than as a string `'arg1 arg2', ...` varargs: type: str name: Linker argument description: The linker arguments to add kwargs_inherit: add_project_arguments muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/message.yaml0000644000175000017500000000066314737503617024505 0ustar buildbuildname: message returns: void description: This function prints its argument to stdout. arg_flattening: false posargs: text: type: str | int | bool | list[str | int | bool] | dict[str | int | bool] description: The message to print. varargs: name: more_text since: 0.54.0 type: str | int | bool | list[str | int | bool] | dict[str | int | bool] description: Additional text that will be printed separated by spaces. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/summary.yaml0000644000175000017500000000614014737503617024552 0ustar buildbuildname: summary returns: void since: 0.53.0 description: | This function is used to summarize build configuration at the end of the build process. This function provides a way for projects (and subprojects) to report this information in a clear way. The content is a series of key/value pairs grouped into sections. If the section keyword argument is omitted, those key/value pairs are implicitly grouped into a section with no title. key/value pairs can optionally be grouped into a dictionary, but keep in mind that dictionaries do not guarantee ordering. `key` must be string, `value` can be: - an integer, boolean or string - *since 0.57.0* an external program or a dependency - *since 0.58.0* a feature option - a list of those. Instead of calling summary as `summary(key, value)`, it is also possible to directly pass a dictionary to the [[summary]] function, as seen in the example below. `summary()` can be called multiple times as long as the same section/key pair doesn't appear twice. All sections will be collected and printed at the end of the configuration in the same order as they have been called. example: | Example `meson.build`: ```meson project('My Project', version : '1.0') summary({'bindir': get_option('bindir'), 'libdir': get_option('libdir'), 'datadir': get_option('datadir'), }, section: 'Directories') summary({'Some boolean': false, 'Another boolean': true, 'Some string': 'Hello World', 'A list': ['string', 1, true], }, section: 'Configuration') ``` Output: ``` My Project 1.0 Directories prefix : /opt/gnome bindir : bin libdir : lib/x86_64-linux-gnu datadir : share Configuration Some boolean : False Another boolean: True Some string : Hello World A list : string 1 True ``` arg_flattening: false posargs: key_or_dict: type: str | dict[str | bool | int | dep | external_program | list[str | bool | int | dep | external_program]] description: | The name of the new entry, or a dict containing multiple entries. If a dict is passed it is equivalent to calling summary() once for each key-value pair. Keep in mind that dictionaries do not guarantee ordering. optargs: value: type: str | bool | int | dep | external_program | list[str | bool | int | dep | external_program] description: | The value to print for the `key`. Only valid if `key_or_dict` is a str. kwargs: bool_yn: type: bool default: false description: Convert bool values to yes and no section: type: str description: The section to put this summary information under. If the section keyword argument is omitted, key/value pairs are implicitly grouped into a section with no title. list_sep: type: str since: 0.54.0 description: | The separator to use when printing list values in this summary. If no separator is given, each list item will be printed on its own line. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/shared_library.yaml0000644000175000017500000000415114737503617026047 0ustar buildbuildname: shared_library returns: lib description: Builds a shared library with the given sources. posargs_inherit: _build_target_base varargs_inherit: _build_target_base kwargs_inherit: _build_target_base kwargs: version: type: str description: | A string specifying the version of this shared library, such as `1.1.0`. On Linux and OS X, this is used to set the shared library version in the filename, such as `libfoo.so.1.1.0` and `libfoo.1.1.0.dylib`. If this is not specified, `soversion` is used instead (see above). soversion: type: str | int description: | A string or integer specifying the soversion of this shared library, such as `0`. On Linux and Windows this is used to set the soversion (or equivalent) in the filename. For example, if `soversion` is `4`, a Windows DLL will be called `foo-4.dll` and one of the aliases of the Linux shared library would be `libfoo.so.4`. If this is not specified, the first part of `version` is used instead (see below). For example, if `version` is `3.6.0` and `soversion` is not defined, it is set to `3`. darwin_versions: type: str | int | list[str] since: 0.48.0 description: | Defines the `compatibility version` and `current version` for the dylib on macOS. If a list is specified, it must be either zero, one, or two elements. If only one element is specified or if it's not a list, the specified value will be used for setting both compatibility version and current version. If unspecified, the `soversion` will be used as per the aforementioned rules. vs_module_defs: type: str | file | custom_tgt | custom_idx description: | Specify a Microsoft module definition file for controlling symbol exports, etc., on platforms where that is possible (e.g. Windows). *(Since 1.3.0)* [[@custom_idx]] are supported rust_abi: type: str since: 1.3.0 description: | Set the specific ABI to compile (when compiling rust). - 'rust' (default): Create a "dylib" crate. - 'c': Create a "cdylib" crate. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/_build_target_base.yaml0000644000175000017500000002755214737503617026665 0ustar buildbuildname: _build_target_base returns: void description: PRIVATE posargs: target_name: description: The *unique* name of the build target type: str varargs: name: source type: str | file | custom_tgt | custom_idx | generated_list description: | Input source to compile. The following types are supported: - Strings relative to the current source directory - [[@file]] objects defined in any preceding build file - The return value of configure-time generators such as [[configure_file]] - The return value of build-time generators such as [[custom_target]] or [[generator.process]] These input files can be sources, objects, libraries, or any other file. Meson will automatically categorize them based on the extension and use them accordingly. For instance, sources (`.c`, `.cpp`, `.vala`, `.rs`, etc) will be compiled and objects (`.o`, `.obj`) and libraries (`.so`, `.dll`, etc) will be linked. With the Ninja backend, Meson will create a build-time [order-only dependency](https://ninja-build.org/manual.html#ref_dependencies) on all generated input files, including unknown files. This is needed to bootstrap the generation of the real dependencies in the [depfile](https://ninja-build.org/manual.html#ref_headers) generated by your compiler to determine when to rebuild sources. Ninja relies on this dependency file for all input files, generated and non-generated. The behavior is similar for other backends. warnings: - The `link_language` kwarg was broken until 0.55.0 kwargs: _pch: type: str description: precompiled header file to use for the given language _args: type: list[str] description: | compiler flags to use for the given language; eg: `cpp_args` for C++ vala_args: type: list[str | file] description: | Compiler flags for Vala. Unlike other languages this may contain Files sources: type: str | file | custom_tgt | custom_idx | generated_list | structured_src description: Additional source files. Same as the source varargs. build_by_default: type: bool default: true since: 0.38.0 description: | Causes, when set to `true`, to have this target be built by default. This means it will be built when `meson compile` is called without any arguments. The default value is `true` for all built target types. build_rpath: type: str since: 0.42.0 description: | A string to add to target's rpath definition in the build dir, but which will be removed on install dependencies: type: list[dep] description: | one or more dependency objects created with [[dependency]] or [[compiler.find_library]] (for external deps) or [[declare_dependency]] (for deps built by the project) extra_files: type: str | file | custom_tgt | custom_idx description: | Not used for the build itself but are shown as source files in IDEs that group files by targets (such as Visual Studio) gui_app: type: bool deprecated: 0.56.0 default: false description: | When set to true flags this target as a GUI application on platforms where this makes a difference, **deprecated** since 0.56.0, use `win_subsystem` instead. link_args: type: list[str] description: | Flags to use during linking. You can use UNIX-style flags here for all platforms. link_depends: type: str | file | custom_tgt | custom_idx description: | Strings, files, or custom targets the link step depends on such as a symbol visibility map. The purpose is to automatically trigger a re-link (but not a re-compile) of the target when this file changes. link_language: type: str since: 0.51.0 description: | Makes the linker for this target be for the specified language. It is generally unnecessary to set this, as Meson will detect the right linker to use in most cases. There are only two cases where this is needed. One, your main function in an executable is not in the language Meson picked, or second you want to force a library to use only one ABI. *(broken until 0.55.0)* link_whole: type: list[lib | custom_tgt | custom_idx] since: 0.40.0 description: | Links all contents of the given static libraries whether they are used or not, equivalent to the `-Wl,--whole-archive` argument flag of GCC, or the '/WHOLEARCHIVE' MSVC linker option. This allows the linked target to re-export symbols from all objects in the static libraries. *(since 0.41.0)* If passed a list that list will be flattened. *(since 0.51.0)* This argument also accepts outputs produced by custom targets. The user must ensure that the output is a library in the correct format. link_with: type: list[lib | custom_tgt | custom_idx] description: | One or more shared or static libraries (built by this project) that this target should be linked with. *(since 0.41.0)* If passed a list this list will be flattened. *(since 0.51.0)* The arguments can also be custom targets. In this case Meson will assume that merely adding the output file in the linker command line is sufficient to make linking work. If this is not sufficient, then the build system writer must write all other steps manually. implicit_include_directories: type: bool since: 0.42.0 default: true description: Controls whether Meson adds the current source and build directories to the include path include_directories: type: list[inc | str] description: | one or more objects created with the [[include_directories]] function, or *(since 0.50.0)* strings, which will be transparently expanded to include directory objects install: type: bool default: false description: When set to true, this executable should be installed. install_dir: type: str description: | override install directory for this file. If the value is a relative path, it will be considered relative the `prefix` option. For example, if you want to install plugins into a subdir, you'd use something like this: `install_dir : get_option('libdir') / 'projectname-1.0'`. install_mode: type: list[str | int] since: 0.47.0 description: | Specify the file mode in symbolic format and optionally the owner/uid and group/gid for the installed files. See the `install_mode` kwarg of [[install_data]] for more information. install_tag: type: str since: 0.60.0 description: | A string used by the `meson install --tags` command to install only a subset of the files. By default all build targets have the tag `runtime` except for static libraries that have the `devel` tag. install_rpath: type: str description: | A string to set the target's rpath to after install (but *not* before that). On Windows, this argument has no effect. objects: type: list[extracted_obj | file | str] description: | List of object files that should be linked in this target. **Since 1.1.0** this can include generated files in addition to object files that you don't have source to or that object files produced by other build targets. In earlier release, generated object files had to be placed in `sources`. name_prefix: type: str | list[void] description: | The string that will be used as the prefix for the target output filename by overriding the default (only used for libraries). By default this is `lib` on all platforms and compilers, except for MSVC shared libraries where it is omitted to follow convention, and Cygwin shared libraries where it is `cyg`. Set this to `[]`, or omit the keyword argument for the default behaviour. name_suffix: type: str | list[void] description: | The string that will be used as the extension for the target by overriding the default. By default on Windows this is `exe` for executables and on other platforms it is omitted. For shared libraries, the default value is `dylib` on macOS, `dll` on Windows, and `so` everywhere else. For static libraries, it is `a` everywhere. By convention MSVC static libraries use the `lib` suffix, but we use `a` to avoid a potential name clash with shared libraries which also generate import libraries with a `lib` suffix. Set this to `[]`, or omit the keyword argument for the default behaviour. override_options: type: list[str] | dict[str | bool | int | list[str]] since: 0.40.0 description: | takes an array of strings in the same format as `project`'s `default_options` overriding the values of these options for this target only. *(since 1.2.0)*: A dictionary may now be passed. gnu_symbol_visibility: type: str since: 0.48.0 description: | Specifies how symbols should be exported, see e.g [the GCC Wiki](https://gcc.gnu.org/wiki/Visibility) for more information. This value can either be an empty string or one of `default`, `internal`, `hidden`, `protected` or `inlineshidden`, which is the same as `hidden` but also includes things like C++ implicit constructors as specified in the GCC manual. Ignored on compilers that do not support GNU visibility arguments. d_import_dirs: type: list[str] description: List of directories to look in for string imports used in the D programming language. d_unittest: type: bool default: false description: When set to true, the D modules are compiled in debug mode. d_module_versions: type: list[str | int] description: List of module version identifiers set when compiling D sources. d_debug: type: list[str] description: | The [D version identifiers](https://dlang.org/spec/version.html#version) to add during the compilation of D source files. native: type: bool default: false description: Controls whether the target is compiled for the build or host machines. win_subsystem: type: str default: "'console'" since: 0.56.0 description: | Specifies the subsystem type to use on the Windows platform. Typical values include `console` for text mode programs and `windows` for gui apps. The value can also contain version specification such as `windows,6.0`. See [MSDN documentation](https://docs.microsoft.com/en-us/cpp/build/reference/subsystem-specify-subsystem) for the full list. rust_crate_type: type: str since: 0.42.0 deprecated: 1.3.0 description: | Set the specific type of rust crate to compile (when compiling rust). If the target is an [[executable]] this defaults to "bin", the only allowed value. If it is a [[static_library]] it defaults to "lib", and may be "lib", "staticlib", or "rlib". If "lib" then Rustc will pick a default, "staticlib" means a C ABI library, "rlib" means a Rust ABI. If it is a [[shared_library]] it defaults to "lib", and may be "lib", "dylib", "cdylib", or "proc-macro". If "lib" then Rustc will pick a default, "cdylib" means a C ABI library, "dylib" means a Rust ABI, and "proc-macro" is a special rust procedural macro crate. "proc-macro" is new in 0.62.0. *Since 1.3.0* this is deprecated and replaced by "rust_abi" keyword argument. `proc_macro` crates are now handled by the [`rust.proc_macro()`](Rust-module.md#proc_macro) method. rust_dependency_map: type: dict[str] since: 1.2.0 description: | On rust targets this provides a map of library names to the crate name with which it would be available inside the rust code. This allows renaming similar to the dependency renaming feature of cargo or `extern crate foo as bar` inside rust code. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/static_library.yaml0000644000175000017500000000171014737503617026066 0ustar buildbuildname: static_library returns: lib description: Builds a static library with the given sources. posargs_inherit: _build_target_base varargs_inherit: _build_target_base kwargs_inherit: _build_target_base kwargs: pic: type: bool since: 0.36.0 description: | Builds the library as positional independent code (so it can be linked into a shared library). This option has no effect on Windows and OS X since it doesn't make sense on Windows and PIC cannot be disabled on OS X. prelink: type: bool since: 0.57.0 description: | If `true` the object files in the target will be prelinked, meaning that it will contain only one prelinked object file rather than the individual object files. rust_abi: type: str since: 1.3.0 description: | Set the specific ABI to compile (when compiling rust). - 'rust' (default): Create a "rlib" crate. - 'c': Create a "staticlib" crate. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/configuration_data.yaml0000644000175000017500000000100614737503617026711 0ustar buildbuildname: configuration_data returns: cfg_data description: | Creates an empty configuration object. You should add your configuration with the [[@cfg_data]] method calls and finally use it in a call to [[configure_file]]. optargs: data: type: dict[str | bool | int] since: 0.49.0 description: | Optional dictionary to specify an initial data set. If provided, each key/value pair is added into the [[@cfg_data]] object as if the [[cfg_data.set]] method was called for each of them. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/subproject.yaml0000644000175000017500000000540214737503617025235 0ustar buildbuildname: subproject returns: subproject description: | Takes the project specified in the positional argument and brings that in the current build specification by returning a [[@subproject]] object. Subprojects must always be placed inside the `subprojects` directory at the top source directory. So for example a subproject called `foo` must be located in `${MESON_SOURCE_ROOT}/subprojects/foo`. - `default_options` *(since 0.37.0)*: an array of default option values that override those set in the subproject's `meson.options` (like `default_options` in `project`, they only have effect when Meson is run for the first time, and command line arguments override any default options in build files). *(since 0.54.0)*: `default_library` built-in option can also be overridden. *(since 1.2.0)*: A dictionary may be passed instead of array. - `version`: works just like the same as in `dependency`. It specifies what version the subproject should be, as an example `>=1.0.1` - `required` *(since 0.48.0)*: By default, `required` is `true` and Meson will abort if the subproject could not be setup. You can set this to `false` and then use the `.found()` method on the [[@subproject]] object. You may also pass the value of a [`feature`](Build-options.md#features) option, same as [[dependency]]. Note that you can use the returned [[@subproject]] object to access any variable in the subproject. However, if you want to use a dependency object from inside a subproject, an easier way is to use the `fallback:` keyword argument to [[dependency]]. [See additional documentation](Subprojects.md). posargs: subproject_name: type: str description: | Name of the subproject. The subproject must exist in the `subprojects` directory (or the directory specified in the `subproject_dir` of [[project]]) as a directory or wrap file. kwargs: default_options: type: list[str] | dict[str | bool | int | list[str]] since: 0.37.0 description: | An array of default option values that override those set in the subproject's `meson.options` (like `default_options` in [[project]], they only have effect when Meson is run for the first time, and command line arguments override any default options in build files). *(since 0.54.0)*: `default_library` built-in option can also be overridden. *(since 1.2.0)*: A dictionary may now be passed. version: type: str | list[str] description: | Works just like the same as in [[dependency]]. It specifies what version the subproject should be, as an example `>=1.0.1`. required: type: bool | feature since: 0.48.0 default: true description: | Works just the same as in [[dependency]]. muon-v0.4.0/subprojects/meson-docs/docs/yaml/functions/add_global_link_arguments.yaml0000644000175000017500000000107714737503617030233 0ustar buildbuildname: add_global_link_arguments returns: void description: | Adds global arguments to the linker command line. Like [[add_global_arguments]] but the arguments are passed to the linker. notes: - Usually you should use [[add_project_link_arguments]] instead, because that works even when you project is used as a subproject. - You must pass always arguments individually `arg1, arg2, ...` rather than as a string `'arg1 arg2', ...` varargs: type: str name: Linker argument description: The linker arguments to add kwargs_inherit: add_global_arguments muon-v0.4.0/subprojects/meson-docs/docs/theme/0002755000175000017500000000000014737503617020322 5ustar buildbuildmuon-v0.4.0/subprojects/meson-docs/docs/theme/extra/0002755000175000017500000000000014737503617021445 5ustar buildbuildmuon-v0.4.0/subprojects/meson-docs/docs/theme/extra/images/0002755000175000017500000000000014737503617022712 5ustar buildbuildmuon-v0.4.0/subprojects/meson-docs/docs/theme/extra/images/favicon.png0000644000175000017500000000760214737503617025050 0ustar buildbuildPNG  IHDRyyIsBIT|d pHYsh,$tEXtSoftwarewww.inkscape.org<IDATx{pՕƿsgƒK4)ހx=xm60.vˑ5JbN(֛,$KA*\C’ e*)Cd ƻ$"82t߳HJ3=cL{>}s5cċyW?8ڧZ[\᦯B7Kx髪EeC?g`;et) 9mr͇h㰓W2h z,yy2i8E5Ƙ= l]~g;t&'L M~LDu֦&WaM0j@e:ӿdɱP*?`áӭpGJaBf3k] {{VcB֙\yAy_lU 3ttC*YerAmLx*+19N3yF~28h!7b'd&ו7g2mp$.'::xS3uTʄ5b ~>$  d`D@2O'\".a`!@řJEuWFRKw_?Х]vLU$X>]yi$!v&[R.C:@2.byǠGe'nav ѹX(x,3l:^\CԄkx%3oްy# 8ZĢ9NM]A$vg6SZ_n̈́x>0?TxiX KۺZ<˩pEe2-KenNKUf@~y[g]gwn< GP4uG: Z!uMg>[;6zFz[.rwb~8|&ו7'vқRpmGw6 qqͯu\L!l=S9.%O#ߏ_4͕(/U^pDMhrMq1#kT^̙az@u։d)&vk%#xDnjkry9:GM2 .[RST1NstwCB@}e ' n3nAc0= mBəٜ7Aw4y0K M HS`1M0^UP1Jv=x&a\QUnxfcTl-UzXC&הEB5ʮ 啊" n/F5]8[0PL~G5jAXnZ]'Tp LG,T︜C3ZDx钑e2Yrxi9;jFש5d=\KBG+UKKrQğe ;&/o%!cc2AR*b&$Pb9@w0 :sd拕b^uQ"3Od<8%|5&'zv= ]_0҄ofS+M[tzovn:x3=9!3Ģ8=\gxy-YhNUMǯ#a)kM b%R" o] LLl21Qn ~`}cfZ~{=¦!* 3%/vS?*8O$?{ &.$ٿy'-D :4(_Q S]y|"B. @k,7 —{ٯd2+#` @/,5lod(R/ wYL)^&@7d* *eD. >&< 5RiXbQU.ALEĹn2@פPӦ Ϋr̘zL~sM,ܸ,d>8}z~͐|UvMbaCs$1# +&IgK)fy NZ LPS8 fWLSsag;'&{G5lRt%e%>` +IjNn1y4** OPlj t# R3J0{{%v:Y׾w}A#t;_חޯ+ KœB>Y7k~鷵R8o_Pz |E3eݻ۽sw#+e릾o'K׌ߕ ?qm9\!77s<R=JxK,x;Vhy> |O_ǁUۏނsS$ܯ5-o}oS`yܸ?r+8'>W|vSDp1!o!`kc#>+)IB)qwMJFpZԹN ﳱ@ (R%4ʹ?57rhT+X^%V̬0jTs-j:Zjfz=nzcp|bgyi6Yye;)mvC*|ʱSO;Kt-n;~D+F-5E,?۵~"NbFbD*$tT| 9GEN1]pU"Q EA#Xn?"J.rN߈S"Ex^TZS.N qҿ;Z]u[-lsõWV؊nJ[8)wp|WTڪgQt֜io}[M WXճvDu2|eg6mZ|ϖg3vfphκK78?+~RT~^`q.Z/AYaHJyG2@ƞ6<&Jss ?6n:dw?w=&R/-mtW-|9e5BcUvs'KP{?J`j[[h_ӷbMTsߟmٟB=s9pKBYSvs;"]sjnDo\'!%.;ζUm]gQBUg02w8@ZebJxZr8%F1XBNpa륀 t ‚jy$okT+ii$9 K$#*H̥mCeY e R+GP0SKp_9.7Tkj'pX.srp jAV)0 $YE]Q CTR,CܿѲcz鸫Jؙ.yE_q<܏$ ɅXTm.ryB=Bv꺐:xga n"eju_H'Jy(' VL$8~1`؇z\-i7O7IwI&GUbQ+*wd2DrE 'QF:W8FuN>Đ{\ Io>6i')&5IHJ~/B\lp$DJ`K)CPl\sK? GQ H"B)UH#xԥ6aѥ^duBnlP^ݯo+ @ϋE0M~C`|転L}tbj5e !-ZD0 r b N9ANxSvYK҈ 4\<+hhHXQ|9ae|ukPHNsƤni\:?CNi>5pHD"A`z& Fo$S& hT,8KC9K7ַpєYdjƚC|.E ųMvrD[~")y? +$"m. k |uB'C\D/,%T"APwG5̏Tbe0$ P/ |C1J+?6Kfm*+͖cP=]h7P@A; v}Yru@;4lRmDe@V(8ʓ9#1L84ȁIRWaG\R|Ee+D%0QWW!@](B# (:"$Фks"@gA*b,hvHEOanı%$UЋdw'`*H:?\FU X=3yŀz&hcB ɉbi" x%lOd:%i s*`2l`&,;/AbqH HUDžFD:%K>8g/pV?kY/|$nڈ{&UC-WfnGNޓ"Nj؊E#@ڔ&XyLзTmNu1^L>s{3e5&"4g2p_1"0 6I/sc Oյ&e9/ $)sX&G;Da(K e%㔟Į RJN;)z]Ю8Ӫ(x"Jp9E?\SeCp(%x?DQ F oz[­P\P-<, bQ  Gyt<^fs6z^7Һ(1dqPýXԻ,jOB?n\?;,5pC-Hh :*R_F^LoEQgC:+V!(o|%ڨD Y%sGuu+X %L_W%xZKmU^8W%?' Tͭp3|kt"^Aj^_Ru 2IR`r|!95P=<$k;/#OY8Q"N <%Zk{`Цd+tY]Ta%7#sɃ9,jRLݐ)9RǪZ, `=޻6agqT7DHPW ֆ )0!Ca'2dڍˊ|SNbF=^>jMRhKq솮BGBj|n#,Ee]rO+uq GSf'Qwq%$ܰj!4Q8Qu|V|e$I e>bè6| Um\>&tD׮ = FP'k*>  Ēѿh@/O.MadyVه jZ@f*8!3a.%ݎ& p˨aW•ڒ]?8sk&̴w6wW_mǷ˭+FQM|ZͮnVӶC姠Ev鈩kx$=-10$>GPkQ' ŭwDu^08,Y*l3~&! w9SvA|KAHa>h䷩Ž5k%e蔐)+`xDF]ڷh0&E]$D]6R~qjO^wf$|B麔 yd@@UgBEN5g5IS5Ԡݟ^qRFޫMMQ:AF z, 'y3d ߊW^/HsA0TXn"&%NibWҧO]8HmL-E4 ==e4=&5]C\vKZAJ+ -"+P Hq1KA.p7\5.l\W8UڇRZqqĴN!QZP}D݁ljӇƖثt­(VlO6)Z֖֮Ԁ ڬPON#+bZBڥls U+Dh,~wY֟, TAM=71=eZMWN :qwK3 sY(D_ 14aD-A D^%a֍ ;ƭ$GKGZT\'q1WIoH/,M$1 pԒ[`fWáf HxG\FCAEX\4 |XF觲Bh%g,Ym8Vi \mjb{Y(beYX dZ]4]% BDzEc͉RjwBS $&v|.46V m چa洅͝jX=%s PmEq&sQ4* [m]oWbct/v&arhXc84c7K`$oĵy|ePJ*Z요p"òFz'T h *A8z%HRM^F|aצz.˰F3Ҧ$'ULV̧pk1eYH)'m5U <bQ DJAZ)qr!qcL 縘18P4ܿQR\UoDiT2"a_2j "Ȏ)yzeLsG'KB=;:JӿKA2pSFYsRB7אZjYg7p{sj;?aFܹxۜ+C Q3*PZs!ٸ>X+Fm̠- $8DZuk~ bYa A.MT%.Xķ81p'W8$xod3*7,ǤFb8 6Βe վ-c^4o}C;Ҩ{!psӌbHnSkY~.SWBAn94t!0:ҕC;E)j1-m^~ѥ!L/k~4;,b \t(i@Y`Km WAΈ  ^Hsl,j>l}0 e '@&v[V yA>2J2 1$iE PVOjԪP ͨ]Ӡ# b~: [ m+K X3_車@m@ք<4ltX[%I- D0pnYb Id*4Gm缑Yf5uXҝp"~~bCS6G[[ʙpa艴G-WhH<rUa+vS~d I* ==QVTt_PYIBN҄GA,g|ʼ98YX}`w و^DO&Yל&YZr/Do;umQ8ڝYW}j8IZm^i ﬈Qf]7O– dRz G;/z $ ijaMAk)TjSˡaVUpx̹t@:"GՍ(v}=R9pY{5RdRu^K,[}6j Ql^(5,g6+!a@΀ފ&hje.F#:ϸ169Y aݹ(Fmx58 $Ncң&M_X$|8\#l,ԁ4aĒ L2Ot"MFA`̗6@KCş%Aq(hV( [W3w i 7EzzzT_8l|J mz`W.Po0[֘Zn{LQU$ŨΕ1W\A5hŚ)N v'-4Bc5ɭ'q6 rIc":e DkJ8 3=9[BR(Fns#ˮ;DAFnf|&|~k2YG䢞zFS@}"~U$6℠48KľaюK]e nM8Pe[:֛)p#%`P%5_|e%p=եճLDF`TBmvmFljZ(+ꨯ4v`:!zA/rh>ryؿZ?S\S lr U I4`k?X@ =]5@?[ `x9QbKjGUo'ِ1Xꚽ:IiM~hwU pWXҷOz糇㧦#$PO hzZ SeO'P)z,Xv=T|֖tkԸNe5-:i~qB!J)Ă2Խw[ȦN? Zz{NW1Z̠(MxFPtx#O_u4RRH⽆dz#FיִB@$n~ekR.X@ԆFx0Tż-ƀ )Ge*)6*?a3bKGDB pHYsIIp[tIME*H-wIDATxy|TUǿ* dKAPTڭ\ݺnŏ8v;qƶvF[qm7mdG vBšJRIX T%U~{Pz:{9BXaVHHJiRNRR/~2RNR~%4RRެ>Bp ))[MRO營XhR^* 鄔>)eL ER l=MJJJyAITU^<;R( ?R'eW"ﳤv:f)RʔD 5ٺ%5[UKRwJtqבv]:ہB C3wZڬ}şȮNGN.g$a`|WxH2]9Ð{n,p0HcnEmfӲ"-3gg1~讬XJ^% 9o [[-vp<ۯ;4Ƚ9d@B攒O!ĉ0 ~RJ*klKʪ7GԴ|>l>!DaO&zs8(7rxGY)≮j QQ>WQynlm/:MMfV21U{cFpcs70pO<)X|v^bʊZ>^*FqȀ0r0|TSV+(Ð{a`7`EQ9r[OΖ3y?g%4-ZJb9 a`;ؑ7,T#O??k(~#h CBvCo0D^VU3=z?&yW "`4N^=!xۂL-|}tEh0);JL{~7F>|w.*'Sˢ-p[wʊZ~c[ :gggnc@oGsۂv֫ٵDgsCZJy! ce) ^_IufHu .pRS,X|e9וj4~v.CҺ] $8xNXr*pMu ^_6-=ﬡQӡ|&! |tsnhhپPַ_M%G}QE Nw)\f3~Fy^/9Q{onF։-ZjnOTU YRJxejM,:3M ڻ?@kkL^!xBlɳq=gǚ2%"M(H`␃,UUٖ??8ȹ&Evrfpu)吐2 xPZTPG ;O*YۮYnU֮f>ymڿljt8\UoCɺUع`gwLkQr@Bv~P1K?7-J>p?-yp:,=|(SՇ4E; 5+w*LUkY35dOlg`< L^\Xꥹa] ۋA}f5dɣGހ#KS5o T__sBi|MmsPzϝ-A`%0興ԵPUHVMⰪfw4<ω2௫ٷ?i:'_}q#6ߪTU*dEQV^e9X^u":"9o`S4$b&2@DD JN݉fFC} uMTU(5QqS6Sԝǿ$\v1Ek۳qyORw gYɊKNT5uL?S1t` t:_vPU(Zj+gU ~̜U#G%s#3xF5+$t@$/^jVlY|5',F1gL8t_ !zHqq1 KNdEvT76㴠1}d&\闆4Yd;yYd!M׎emQ^;;wa4FT #INIUAL7ʚov$~bR~& (dfg=~\C_%S';p{\tqcߖӫ9P5MU?%4z 'K*m=[>?3~2%(I' Y2 s* ؙ{ Y6!֯W+6u?;;Rb+Ѻ5NJ톱~,LV]Uώ[~9}2"o֎EajD_~i#_[-MȃȀt:1Y{TsZ@X MMfm:y{.gXr"!% Y/u'lKJk_Unwûaڕ)n %6k`MRYUU*1fam_^H8BMN50\E9MTi'@!W] !JhWyY ƆlOeyGzyd.jv:]7 ߀G)%{{on_9r8?)J޼ljXN-uu&i=,4%h>!H?ܳdfۦ^}6 Nx&<ƽkW}ܺ>yeTVe6=k_/*!}AWڼ%}VPf#cK ͭ[qTj%kW*gxJN'uCu}1HJINv>YߪUnCV]?f6[(8Rݧ7?*KIE!7Xk^%Ց]5os+Z,OYQT`z\;\к5WM҉4<\RJNWؼ!/%E rbw->늢R_4=?V.=@yYOo[Y`J46hCjo }%lV;JY4WRJve>:'%'*nExZK6VK+~Ys J>[4} +QU)<)t/UwrkPA69->nd70a4;Yî#]ZHp7^/:llvV.FjQYAF;,v5Jɉm#dl90EQؒ͢YA|D-Ӓ#m fr;;VYU%9k}ri >Į 2nwR]L0w^_GYVRJJX>Y[jjLZ_lI~nkPSJ+w[-YW\G Ky/( euF/}WZ[-j섂*e+<-IUuYk/.[Qy U]+?IU '{{M&sH囓rNTx.,8 GvՇgm3kuHBDܩreE=Jy酯9tG1Xc]66S(Qx1 ͦkGv/cX, $$rMB365Xkg .e9)t,l7{k?&c0B󵙝8;9_Ht ([- K忟_uyR';0"$>ݪrO4~d-͡ sUn;3vbccuK'SɌNNU:ƶ+!**-X6KX[¤iLh8cRaJr) NR4zM&-bڢ^CvzMH)YGӜQfsrME Ηk ߌkJaAm;=˨ 'yWUs:9N#?&6fe`JdiILyӒ{{i)**el8Վc L39*A3x\*8ṄҌDEG2±mwf2;k5a(ϾƏ$*#ThdQLp,Əy]` f`wL&LMttTwY'dv!^•<l6;e5lްM<>UJ793nVCR !v !iq^jwmM' f\TBTtd˅>jb>JqQ)goI* [݃!yøq\2u7O02YpȈ!zywN'u&r}QgUS_f ^uWqu1&u811t[FodQt\g$wٺӺV5-f쯢Թ `ԑv.6Lfܸ H%"{6(*!Djwzyj,F \\nL~)hN%[Ƀhf\5Q00'`Z], {@2v.v;NWdi 9E=TFIa#elJZ 0&IICLp )Çgi_p"⌢Qg>}u$ӻU׃AKs+uRTPzKZh-tA8"I#H7aɉii'~r39Ǻ'tY]t:Z47od 'WQ~J3:+{GIR)7ѩCIMK!1)qDGG?ҁSB}%4I)ܐu4vzbvNk&3F35&i7ciib6۱X- 4U*tap zb#$&.ظ( %9e0Cd8∉5iq֥be:. ^ZsꎦL>((NUU]v_ס HV}^^sG׷ǃOj`{-ʅ Ij2~d<>s,gwpwHVEbP!>?u{ MUD== b67 Xݖt[>Gᦺ v R;0cE T?AR'm[4k^$pQ<-&=Gy| ח|3OWH) !;8PynuZϿCqsEF=7 ++? oIENDB`muon-v0.4.0/subprojects/meson-docs/docs/theme/extra/prism_components/0002755000175000017500000000000014737503617025044 5ustar buildbuildmuon-v0.4.0/subprojects/meson-docs/docs/theme/extra/prism_components/prism-meson.js0000644000175000017500000000101614737503617027647 0ustar buildbuildPrism.languages.meson= { 'triple-quoted-string': { 'pattern': /'''[\s\S]*?'''/, 'alias': 'string' }, 'comment': /#.*/, 'string': /'(?:\\'|[^'])*'/, 'number': /\b\d+(?:\.\d+)?\b/, 'keyword': /\b(?:if|else|elif|endif|foreach|endforeach)\b/, 'function': /(?=\.|\b)[a-zA-Z_]+\s*(?=\()/, 'boolean': /\b(?:true|false)\b/, 'builtin': /\b(?:meson|host_machine|target_machine|build_machine)(?=\.)/, 'operator': /(?:[<>=*+\-/!]?=|%|\/|\*|-|\+|\b(?:or|and|not)\b)/, 'punctuation': /[(),[\]]/ // TODO: Handle ternary ?: };muon-v0.4.0/subprojects/meson-docs/docs/theme/extra/prism_components/prism-meson.min.js0000644000175000017500000000066714737503617030444 0ustar buildbuildPrism.languages.meson={"triple-quoted-string":{pattern:/'''[\s\S]*?'''/,alias:"string"},comment:/#.*/,string:/'(?:\\'|[^'])*'/,number:/\b\d+(?:\.\d+)?\b/,keyword:/\b(?:if|else|elif|endif|foreach|endforeach)\b/,"function":/(?=\.|\b)[a-zA-Z_]+\s*(?=\()/,"boolean":/\b(?:true|false)\b/,builtin:/\b(?:meson|host_machine|target_machine|build_machine)(?=\.)/,operator:/(?:[<>=*+\-\/!]?=|%|\/|\*|-|\+|\b(?:or|and|not)\b)/,punctuation:/[(),[\]]/};muon-v0.4.0/subprojects/meson-docs/docs/theme/extra/templates/0002755000175000017500000000000014737503617023443 5ustar buildbuildmuon-v0.4.0/subprojects/meson-docs/docs/theme/extra/templates/extra_head.html0000644000175000017500000000020014737503617026423 0ustar buildbuild muon-v0.4.0/subprojects/meson-docs/docs/theme/extra/templates/navbar_center.html0000644000175000017500000000004514737503617027137 0ustar buildbuild

The Meson Build System

muon-v0.4.0/subprojects/meson-docs/docs/theme/extra/templates/brand-logo.html0000644000175000017500000000006214737503617026351 0ustar buildbuildHome muon-v0.4.0/subprojects/meson-docs/docs/theme/extra/templates/navbar_links.html0000644000175000017500000000370114737503617027001 0ustar buildbuild@require(page)
\ muon-v0.4.0/subprojects/meson-docs/docs/theme/extra/templates/license.html0000644000175000017500000000025014737503617025746 0ustar buildbuild@require(license, logo_path)
Website licensing information are available on the Legal page.
muon-v0.4.0/subprojects/meson-docs/docs/meson_options.txt0000644000175000017500000000037114737503617022654 0ustar buildbuildoption('unsafe_yaml', type: 'boolean', value: false, description: 'disable safety checks and use a faster, but less correct YAML loader') option('html', type: 'boolean', value: true, description: 'build the hotdoc-based HTML documentation') muon-v0.4.0/subprojects/meson-docs/docs/refman/0002755000175000017500000000000014737503617020470 5ustar buildbuildmuon-v0.4.0/subprojects/meson-docs/docs/refman/loaderyaml.py0000644000175000017500000002401414737503617023172 0ustar buildbuild# SPDX-License-Identifier: Apache-2.0 # Copyright 2021 The Meson development team from .loaderbase import LoaderBase from .model import ( Type, PosArg, VarArgs, Kwarg, Function, Method, ObjectType, Object, ReferenceManual, ) from mesonbuild import mlog from mesonbuild import mesonlib from pathlib import Path import typing as T class Template: d_feature_check: T.Dict[str, T.Any] = {} s_posarg: T.Dict[str, T.Any] = {} s_varargs: T.Dict[str, T.Any] = {} s_kwarg: T.Dict[str, T.Any] = {} s_function: T.Dict[str, T.Any] = {} s_object: T.Dict[str, T.Any] = {} class StrictTemplate(Template): def __init__(self) -> None: from strictyaml import Map, MapPattern, Optional, Str, Seq, Int, Bool, EmptyList, OrValidator # type: ignore[import-untyped] d_named_object = { 'name': Str(), 'description': Str(), } d_feture_check = { Optional('since', default=''): Str(), Optional('deprecated', default=''): Str(), } self.s_posarg = Map({ **d_feture_check, 'description': Str(), 'type': Str(), Optional('default', default=''): Str(), }) self.s_varargs = Map({ **d_named_object, **d_feture_check, 'type': Str(), Optional('min_varargs', default=-1): Int(), Optional('max_varargs', default=-1): Int(), }) self.s_kwarg = Map({ **d_feture_check, 'type': Str(), 'description': Str(), Optional('required', default=False): Bool(), Optional('default', default=''): Str(), }) self.s_function = Map({ **d_named_object, **d_feture_check, 'returns': Str(), Optional('notes', default=[]): OrValidator(Seq(Str()), EmptyList()), Optional('warnings', default=[]): OrValidator(Seq(Str()), EmptyList()), Optional('example', default=''): Str(), Optional('posargs'): MapPattern(Str(), self.s_posarg), Optional('optargs'): MapPattern(Str(), self.s_posarg), Optional('varargs'): self.s_varargs, Optional('posargs_inherit', default=''): Str(), Optional('optargs_inherit', default=''): Str(), Optional('varargs_inherit', default=''): Str(), Optional('kwargs'): MapPattern(Str(), self.s_kwarg), Optional('kwargs_inherit', default=[]): OrValidator(OrValidator(Seq(Str()), EmptyList()), Str()), Optional('arg_flattening', default=True): Bool(), }) self.s_object = Map({ **d_named_object, **d_feture_check, 'long_name': Str(), Optional('extends', default=''): Str(), Optional('notes', default=[]): OrValidator(Seq(Str()), EmptyList()), Optional('warnings', default=[]): OrValidator(Seq(Str()), EmptyList()), Optional('example', default=''): Str(), Optional('methods'): Seq(self.s_function), Optional('is_container', default=False): Bool() }) class FastTemplate(Template): d_feature_check: T.Dict[str, T.Any] = { 'since': '', 'deprecated': '', } s_posarg = { **d_feature_check, 'default': '', } s_varargs: T.Dict[str, T.Any] = { **d_feature_check, 'min_varargs': -1, 'max_varargs': -1, } s_kwarg = { **d_feature_check, 'required': False, 'default': '', } s_function = { **d_feature_check, 'notes': [], 'warnings': [], 'example': '', 'posargs': {}, 'optargs': {}, 'varargs': None, 'posargs_inherit': '', 'optargs_inherit': '', 'varargs_inherit': '', 'kwargs': {}, 'kwargs_inherit': [], 'arg_flattening': True, } s_object = { **d_feature_check, 'extends': '', 'notes': [], 'warnings': [], 'example': '', 'methods': [], 'is_container': False, } class LoaderYAML(LoaderBase): def __init__(self, yaml_dir: Path, strict: bool=True) -> None: super().__init__() self.yaml_dir = yaml_dir self.func_dir = self.yaml_dir / 'functions' self.elem_dir = self.yaml_dir / 'elementary' self.objs_dir = self.yaml_dir / 'objects' self.builtin_dir = self.yaml_dir / 'builtins' self.modules_dir = self.yaml_dir / 'modules' self.strict = strict template: Template if self.strict: import strictyaml def loader(file: str, template: T.Any, label: str) -> T.Dict: r: T.Dict = strictyaml.load(file, template, label=label).data return r self._load = loader template = StrictTemplate() else: import yaml from yaml import CLoader def loader(file: str, template: T.Any, label: str) -> T.Dict: return {**template, **yaml.load(file, Loader=CLoader)} self._load = loader template = FastTemplate() self.template = template def _fix_default(self, v: T.Dict) -> None: if v["default"] is False: v["default"] = "false" elif v["default"] is True: v["default"] = "true" else: v["default"] = str(v["default"]) def _process_function_base(self, raw: T.Dict, obj: T.Optional[Object] = None) -> Function: # Handle arguments posargs = raw.pop('posargs', {}) optargs = raw.pop('optargs', {}) varargs = raw.pop('varargs', None) kwargs = raw.pop('kwargs', {}) # Fix kwargs_inherit if isinstance(raw['kwargs_inherit'], str): raw['kwargs_inherit'] = [raw['kwargs_inherit']] # Parse args posargs_mapped: T.List[PosArg] = [] optargs_mapped: T.List[PosArg] = [] varargs_mapped: T.Optional[VarArgs] = None kwargs_mapped: T.Dict[str, Kwarg] = {} for k, v in posargs.items(): if not self.strict: v = {**self.template.s_posarg, **v} self._fix_default(v) v['type'] = Type(v['type']) posargs_mapped += [PosArg(name=k, **v)] for k, v in optargs.items(): if not self.strict: v = {**self.template.s_posarg, **v} self._fix_default(v) v['type'] = Type(v['type']) optargs_mapped += [PosArg(name=k, **v)] for k, v in kwargs.items(): if not self.strict: v = {**self.template.s_kwarg, **v} self._fix_default(v) v['type'] = Type(v['type']) kwargs_mapped[k] = Kwarg(name=k, **v) if varargs is not None: if not self.strict: varargs = {**self.template.s_varargs, **varargs} varargs['type'] = Type(varargs['type']) varargs_mapped = VarArgs(**varargs) raw['returns'] = Type(raw['returns']) # Build function object if obj is not None: return Method( posargs=posargs_mapped, optargs=optargs_mapped, varargs=varargs_mapped, kwargs=kwargs_mapped, obj=obj, **raw, ) return Function( posargs=posargs_mapped, optargs=optargs_mapped, varargs=varargs_mapped, kwargs=kwargs_mapped, **raw, ) def _load_function(self, path: Path, obj: T.Optional[Object] = None) -> Function: path_label = path.relative_to(self.yaml_dir).as_posix() mlog.log('Loading', mlog.bold(path_label)) raw = self._load(self.read_file(path), self.template.s_function, label=path_label) return self._process_function_base(raw) def _load_object(self, obj_type: ObjectType, path: Path) -> Object: path_label = path.relative_to(self.yaml_dir).as_posix() mlog.log(f'Loading', mlog.bold(path_label)) raw = self._load(self.read_file(path), self.template.s_object, label=path_label) def as_methods(mlist: T.List[Function]) -> T.List[Method]: res: T.List[Method] = [] for i in mlist: assert isinstance(i, Method) res += [i] return res methods = raw.pop('methods', []) obj = Object(methods=[], obj_type=obj_type, **raw) newmethods = [] for x in methods: if not self.strict: x = {**self.template.s_function, **x} newmethods += [self._process_function_base(x, obj)] obj.methods = as_methods(newmethods) return obj def _load_module(self, path: Path) -> T.List[Object]: assert path.is_dir() module = self._load_object(ObjectType.MODULE, path / 'module.yaml') objs = [] for p in path.iterdir(): if p.name == 'module.yaml': continue obj = self._load_object(ObjectType.RETURNED, p) obj.defined_by_module = module objs += [obj] return [module, *objs] def load_impl(self) -> ReferenceManual: mlog.log('Loading YAML reference manual') with mlog.nested(): manual = ReferenceManual( functions=[self._load_function(x) for x in self.func_dir.iterdir()], objects=mesonlib.listify([ [self._load_object(ObjectType.ELEMENTARY, x) for x in self.elem_dir.iterdir()], [self._load_object(ObjectType.RETURNED, x) for x in self.objs_dir.iterdir()], [self._load_object(ObjectType.BUILTIN, x) for x in self.builtin_dir.iterdir()], [self._load_module(x) for x in self.modules_dir.iterdir()] ], flatten=True) ) if not self.strict: mlog.warning('YAML reference manual loaded using the best-effort fastyaml loader. Results are not guaranteed to be stable or correct.') return manual muon-v0.4.0/subprojects/meson-docs/docs/refman/loaderpickle.py0000644000175000017500000000116614737503617023502 0ustar buildbuild# SPDX-License-Identifier: Apache-2.0 # Copyright 2021 The Meson development team from pathlib import Path import pickle from .loaderbase import LoaderBase from .model import ReferenceManual class LoaderPickle(LoaderBase): def __init__(self, in_file: Path) -> None: super().__init__() self.in_file = in_file def load_impl(self) -> ReferenceManual: res = pickle.loads(self.in_file.read_bytes()) assert isinstance(res, ReferenceManual) return res # Assume that the pickled data is OK and skip validation def load(self) -> ReferenceManual: return self.load_impl() muon-v0.4.0/subprojects/meson-docs/docs/refman/generatorbase.py0000644000175000017500000000420414737503617023661 0ustar buildbuild# SPDX-License-Identifier: Apache-2.0 # Copyright 2021 The Meson development team from abc import ABCMeta, abstractmethod import typing as T from .model import ReferenceManual, Function, Method, Object, ObjectType, NamedObject _N = T.TypeVar('_N', bound=NamedObject) class GeneratorBase(metaclass=ABCMeta): def __init__(self, manual: ReferenceManual) -> None: self.manual = manual @abstractmethod def generate(self) -> None: pass @staticmethod def brief(raw: _N) -> str: desc_lines = raw.description.split('\n') brief = desc_lines[0] if '.' in brief and '[[' not in brief: brief = brief[:brief.index('.')] return brief.strip() @staticmethod def sorted_and_filtered(raw: T.List[_N]) -> T.List[_N]: def key_fn(fn: NamedObject) -> str: if isinstance(fn, Method): return f'1_{fn.obj.name}.{fn.name}' return f'0_{fn.name}' return sorted([x for x in raw if not x.hidden], key=key_fn) @staticmethod def _extract_meson_version() -> str: from mesonbuild.coredata import version return version @property def functions(self) -> T.List[Function]: return GeneratorBase.sorted_and_filtered(self.manual.functions) @property def objects(self) -> T.List[Object]: return GeneratorBase.sorted_and_filtered(self.manual.objects) @property def elementary(self) -> T.List[Object]: return [x for x in self.objects if x.obj_type == ObjectType.ELEMENTARY] @property def builtins(self) -> T.List[Object]: return [x for x in self.objects if x.obj_type == ObjectType.BUILTIN] @property def returned(self) -> T.List[Object]: return [x for x in self.objects if x.obj_type == ObjectType.RETURNED and x.defined_by_module is None] @property def modules(self) -> T.List[Object]: return [x for x in self.objects if x.obj_type == ObjectType.MODULE] def extract_returned_by_module(self, module: Object) -> T.List[Object]: return [x for x in self.objects if x.obj_type == ObjectType.RETURNED and x.defined_by_module is module] muon-v0.4.0/subprojects/meson-docs/docs/refman/loaderbase.py0000644000175000017500000001706714737503617023154 0ustar buildbuild# SPDX-License-Identifier: Apache-2.0 # Copyright 2021 The Meson development team from abc import ABCMeta, abstractmethod from pathlib import Path import re import typing as T from .model import ( NamedObject, FetureCheck, ArgBase, PosArg, DataTypeInfo, Type, Function, Method, Object, ObjectType, ReferenceManual, ) from mesonbuild import mlog class _Resolver: def __init__(self) -> None: self.type_map: T.Dict[str, Object] = {} self.func_map: T.Dict[str, T.Union[Function, Method]] = {} self.processed_funcs: T.Set[str] = set() def _validate_named_object(self, obj: NamedObject) -> None: name_regex = re.compile(r'[a-zA-Z0-9_]+') obj.name = obj.name.strip() obj.description = obj.description.strip() assert obj.name and obj.description, 'Both name and description must be set' assert obj.name.islower(), f'Object names must be lower case ({obj.name})' assert name_regex.match(obj.name) or obj.name == '[index]', f'Invalid name {obj.name}' def _validate_feature_check(self, obj: FetureCheck) -> None: meson_version_reg = re.compile(r'[0-9]+\.[0-9]+\.[0-9]+') obj.since = obj.since.strip() obj.deprecated = obj.deprecated.strip() if obj.since: assert meson_version_reg.match(obj.since) if obj.deprecated: assert meson_version_reg.match(obj.deprecated) def _resolve_type(self, raw: str) -> Type: typ = Type(raw) # We can't use `types = raw.split('|')`, because of `list[str | env]` types: T.List[str] = [''] stack = 0 for c in raw: if stack == 0 and c == '|': types += [''] continue if c == '[': stack += 1 if c == ']': stack -= 1 types[-1] += c types = [x.strip() for x in types] for t in types: t = t.strip() idx = t.find('[') base_type = t held_type = None if idx > 0: base_type = t[:idx] held_type = self._resolve_type(t[idx+1:-1]) assert base_type in self.type_map, f'No known object {t}' obj = self.type_map[base_type] typ.resolved += [DataTypeInfo(obj, held_type)] return typ def _validate_func(self, func: T.Union[Function, Method]) -> None: # Always run basic checks, since they also slightly post-process (strip) some strings self._validate_named_object(func) self._validate_feature_check(func) func_id = f'{func.obj.name}.{func.name}' if isinstance(func, Method) else func.name if func_id in self.processed_funcs: return func.returns = self._resolve_type(func.returns.raw) all_args: T.List[ArgBase] = [] all_args += func.posargs all_args += func.optargs all_args += func.kwargs.values() all_args += [func.varargs] if func.varargs else [] for arg in all_args: arg.type = self._resolve_type(arg.type.raw) # Handle returned_by for obj in func.returns.resolved: obj.data_type.returned_by += [func] # Handle kwargs inheritance for base_name in func.kwargs_inherit: base_name = base_name.strip() assert base_name in self.func_map, f'Unknown base function `{base_name}` for {func.name}' base = self.func_map[base_name] if base_name not in self.processed_funcs: self._validate_func(base) curr_keys = set(func.kwargs.keys()) base_keys = set(base.kwargs.keys()) # Calculate the missing kwargs from the current set missing = {k: v for k, v in base.kwargs.items() if k in base_keys - curr_keys} func.kwargs.update(missing) # Handle other args inheritance _T = T.TypeVar('_T', bound=T.Union[ArgBase, T.List[PosArg]]) def resolve_inherit(name: str, curr: _T, resolver: T.Callable[[Function], _T]) -> _T: if name and not curr: name = name.strip() assert name in self.func_map, f'Unknown base function `{name}` for {func.name}' if name not in self.processed_funcs: self._validate_func(self.func_map[name]) ref_args = resolver(self.func_map[name]) assert ref_args is not None, f'Inherited function `{name}` does not have inherited args set' return ref_args return curr func.posargs = resolve_inherit(func.posargs_inherit, func.posargs, lambda x: x.posargs) func.optargs = resolve_inherit(func.optargs_inherit, func.optargs, lambda x: x.optargs) func.varargs = resolve_inherit(func.varargs_inherit, func.varargs, lambda x: x.varargs) self.processed_funcs.add(func_id) def validate_and_resolve(self, manual: ReferenceManual) -> ReferenceManual: mlog.log('Validating loaded manual...') # build type map and func map for methods for obj in manual.objects: assert obj.name not in self.type_map, f'Duplicate object name {obj.name}' self.type_map[obj.name] = obj for m in obj.methods: mid = f'{obj.name}.{m.name}' assert mid not in self.type_map, f'Duplicate method {mid}' self.func_map[mid] = m # Build func map for functions for func in manual.functions: assert func.name not in [*self.func_map.keys()], f'Duplicate function {func.name}' self.func_map[func.name] = func mlog.log('Validating functions...') for func in manual.functions: mlog.log(' -- validating', mlog.bold(func.name)) self._validate_func(func) mlog.log('Validating objects...') for obj in manual.objects: mlog.log(' -- validating', mlog.bold(obj.name)) self._validate_named_object(obj) self._validate_feature_check(obj) # Resolve and validate inheritance if obj.extends: assert obj.extends in self.type_map, f'Unknown extends object {obj.extends} in {obj.name}' obj.extends_obj = self.type_map[obj.extends] obj.extends_obj.extended_by += [obj] # Only returned objects can be associated with module if obj.obj_type is not ObjectType.RETURNED: assert obj.defined_by_module is None for m in obj.methods: assert m.obj is obj self._validate_func(m) # Resolve inherited methods for obj in manual.objects: inherited_methods = obj.inherited_methods curr = obj.extends_obj while curr is not None: inherited_methods += curr.methods curr = curr.extends_obj return manual class LoaderBase(metaclass=ABCMeta): def __init__(self) -> None: self._input_files: T.List[Path] = [] @property def input_files(self) -> T.List[Path]: return list(self._input_files) def read_file(self, f: Path) -> str: assert f.exists() assert f.is_file() self._input_files += [f.resolve()] return f.read_text(encoding='utf-8') @abstractmethod def load_impl(self) -> ReferenceManual: pass def load(self) -> ReferenceManual: self._input_files = [] # Reset input files manual = self.load_impl() resolver = _Resolver() with mlog.nested(): return resolver.validate_and_resolve(manual) muon-v0.4.0/subprojects/meson-docs/docs/refman/main.py0000644000175000017500000000727314737503617021775 0ustar buildbuild# SPDX-License-Identifier: Apache-2.0 # Copyright 2021 The Meson development team from pathlib import Path import argparse import typing as T from mesonbuild import mlog from .loaderbase import LoaderBase from .loaderpickle import LoaderPickle from .loaderyaml import LoaderYAML from .generatorbase import GeneratorBase from .generatorjson import GeneratorJSON from .generatorprint import GeneratorPrint from .generatorpickle import GeneratorPickle from .generatormd import GeneratorMD from .generatorman import GeneratorMan from .generatorvim import GeneratorVim from .generatortypes import GeneratorTypes from .generatorc import GeneratorC meson_root = Path(__file__).absolute().parents[2] def main() -> int: parser = argparse.ArgumentParser(description='Meson reference manual generator') parser.add_argument('-l', '--loader', type=str, default='yaml', choices=['yaml', 'fastyaml', 'pickle'], help='Information loader backend') parser.add_argument('-g', '--generator', type=str, choices=['print', 'pickle', 'md', 'json', 'man', 'vim', 'types', 'c'], required=True, help='Generator backend') parser.add_argument('-s', '--sitemap', type=Path, default=meson_root / 'docs' / 'sitemap.txt', help='Path to the input sitemap.txt') parser.add_argument('-o', '--out', type=Path, required=True, help='Output directory for generated files') parser.add_argument('-i', '--input', type=Path, default=meson_root / 'docs' / 'yaml', help='Input path for the selected loader') parser.add_argument('--link-defs', type=Path, help='Output file for the MD generator link definition file') parser.add_argument('--depfile', type=Path, default=None, help='Set to generate a depfile') parser.add_argument('-q', '--quiet', action='store_true', help='Suppress verbose output') parser.add_argument('--force-color', action='store_true', help='Force enable colors') parser.add_argument('--no-modules', action='store_true', help='Disable building modules') args = parser.parse_args() if args.quiet: mlog.set_quiet() if args.force_color: mlog.colorize_console = lambda: True loaders: T.Dict[str, T.Callable[[], LoaderBase]] = { 'yaml': lambda: LoaderYAML(args.input), 'fastyaml': lambda: LoaderYAML(args.input, strict=False), 'pickle': lambda: LoaderPickle(args.input), } loader = loaders[args.loader]() refMan = loader.load() generators: T.Dict[str, T.Callable[[], GeneratorBase]] = { 'print': lambda: GeneratorPrint(refMan), 'pickle': lambda: GeneratorPickle(refMan, args.out), 'md': lambda: GeneratorMD(refMan, args.out, args.sitemap, args.link_defs, not args.no_modules), 'json': lambda: GeneratorJSON(refMan, args.out, not args.no_modules), 'man': lambda: GeneratorMan(refMan, args.out, not args.no_modules), 'vim': lambda: GeneratorVim(refMan, args.out), 'types': lambda: GeneratorTypes(refMan, args.out, not args.no_modules), 'c': lambda: GeneratorC(refMan, args.out, not args.no_modules), } generator = generators[args.generator]() # Generate the depfile if required if args.depfile is not None: assert isinstance(args.depfile, Path) assert isinstance(args.out, Path) # Also add all files of this package script_files = list(Path(__file__).resolve().parent.glob('**/*.py')) templates = list(Path(__file__).resolve().parent.glob('**/*.mustache')) out_text = f'{args.out.resolve().as_posix()}: \\\n' for input in loader.input_files + script_files + templates: out_text += f' {input.resolve().as_posix():<93} \\\n' args.depfile.write_text(out_text, encoding='utf-8') generator.generate() return 0 muon-v0.4.0/subprojects/meson-docs/docs/refman/generatorman.py0000644000175000017500000002657314737503617023537 0ustar buildbuildimport re from pathlib import Path from .generatorbase import GeneratorBase from .model import ( ReferenceManual, Function, Object, PosArg, VarArgs, Kwarg, ) import typing as T class ManPage: def __init__(self, path: Path): self.path = path self.text = "" def reset_font(self) -> None: self.text += ".P\n" def title(self, name: str, section: int) -> None: import datetime date = datetime.date.today() self.reset_font() self.text += f'.TH "{name}" "{section}" "{date}"\n' def section(self, name: str) -> None: self.reset_font() self.text += f".SH {name}\n" def subsection(self, name: str) -> None: self.reset_font() self.text += f".SS {name}\n" def par(self, text: str) -> None: self.reset_font() self.text += f"{text}\n" def indent(self, amount: int = 4) -> None: self.text += f".RS {amount}\n" def unindent(self) -> None: self.text += ".RE\n" def br(self) -> None: self.text += ".br\n" def nl(self) -> None: self.text += "\n" def line(self, text: str) -> None: if text and text[0] in [".", "'"]: self.text += "\\" self.text += f"{text}\n" def inline(self, text: str) -> None: self.text += f"{text}" def write(self) -> None: self.path.write_text(self.text, encoding="utf-8") @staticmethod def bold(text: str) -> str: return f"\\fB{text}\\fR" @staticmethod def italic(text: str) -> str: return f"\\fI{text}\\fR" class GeneratorMan(GeneratorBase): def __init__( self, manual: ReferenceManual, out: Path, enable_modules: bool ) -> None: super().__init__(manual) self.out = out self.enable_modules = enable_modules self.links: T.List[str] = [] def generate_description(self, page: ManPage, desc: str) -> None: def italicise(match: T.Match[str]) -> str: v = match.group(1) if v[0] == "@": v = v[1:] return ManPage.italic(v) desc = re.sub(re.compile(r"\[\[(.*?)\]\]", re.DOTALL), italicise, desc) def linkify(match: T.Match[str]) -> str: replacement = ManPage.italic(match.group(1)) if match.group(2)[0] != "#": if match.group(2) in self.links: num = self.links.index(match.group(2)) else: self.links.append(match.group(2)) num = len(self.links) replacement += f"[{num}]" return replacement desc = re.sub(re.compile(r"\[(.*?)\]\((.*?)\)", re.DOTALL), linkify, desc) def bold(match: T.Match[str]) -> str: return ManPage.bold(match.group(1)) desc = re.sub(re.compile(r"\*(.*?)\*"), bold, desc) isCode = False for chunk in desc.split("```"): if isCode: page.indent() lines = chunk.strip().split("\n") if lines[0] == "meson": lines = lines[1:] for line in lines: page.line(line) page.br() page.unindent() else: inList = False for line in chunk.strip().split("\n"): if len(line) == 0: page.nl() if inList: page.nl() inList = False elif line[0:2] in ["- ", "* "]: if inList: page.nl() page.br() else: inList = True page.inline(line.strip() + " ") elif inList and line[0] == " ": page.inline(line.strip() + " ") else: inList = False page.line(line) if inList: page.nl() isCode = not isCode def function_name(self, f: Function, o: Object = None) -> str: name = "" if o is not None: name += f"{o.name}." name += f.name return name def generate_function_signature( self, page: ManPage, f: Function, o: Object = None ) -> None: args = [] if f.posargs: args += [arg.name for arg in f.posargs] if f.varargs: args += [f.varargs.name + "..."] if f.optargs: args += [f"[{arg.name}]" for arg in f.optargs] for kwarg in self.sorted_and_filtered(list(f.kwargs.values())): kw = kwarg.name + ":" if kwarg.default: kw += " " + ManPage.bold(kwarg.default) args += [kw] ret = ManPage.italic(f.returns.raw) + " " prefix = f"{ret}{self.function_name(f, o)}(" sig = ", ".join(args) suffix = ")" if len(prefix) + len(sig) + len(suffix) > 70: page.line(prefix) page.br() page.indent() for arg in args: page.line(arg + ",") page.br() page.unindent() page.line(suffix) else: page.line(prefix + sig + suffix) def base_info( self, x: T.Union[PosArg, VarArgs, Kwarg, Function, Object] ) -> T.List[str]: info = [] if x.deprecated: info += [ManPage.bold("deprecated") + f" since {x.deprecated}"] if x.since: info += [f"since {x.since}"] return info def generate_function_arg( self, page: ManPage, arg: T.Union[PosArg, VarArgs, Kwarg], isOptarg: bool = False, ) -> None: required = ( arg.required if isinstance(arg, Kwarg) else not isOptarg and not isinstance(arg, VarArgs) ) page.line(ManPage.bold(arg.name)) info = [ManPage.italic(arg.type.raw)] if required: info += [ManPage.bold("required")] if isinstance(arg, (PosArg, Kwarg)) and arg.default: info += [f"default: {arg.default}"] if isinstance(arg, VarArgs): mn = 0 if arg.min_varargs < 0 else arg.min_varargs mx = "N" if arg.max_varargs < 0 else arg.max_varargs info += [f"{mn}...{mx} times"] info += self.base_info(arg) page.line(", ".join(info)) page.br() page.indent(2) self.generate_description(page, arg.description.strip()) page.unindent() page.nl() def generate_function_argument_section( self, page: ManPage, name: str, args: T.Sequence[T.Union[PosArg, VarArgs, Kwarg]], isOptarg: bool = False, ) -> None: if not args: return page.line(ManPage.bold(name)) page.indent() for arg in args: self.generate_function_arg(page, arg, isOptarg) page.unindent() def generate_sub_sub_section( self, page: ManPage, name: str, text: T.List[str], process: bool = True ) -> None: page.line(ManPage.bold(name)) page.indent() if process: for line in text: self.generate_description(page, line.strip()) else: page.line("\n\n".join([line.strip() for line in text])) page.unindent() def generate_function(self, page: ManPage, f: Function, obj: Object = None) -> None: page.subsection(self.function_name(f, obj) + "()") page.indent(0) page.line(ManPage.bold("SYNOPSIS")) page.indent() self.generate_function_signature(page, f, obj) info = self.base_info(f) if info: page.nl() page.line(", ".join(info)) page.unindent() page.nl() self.generate_sub_sub_section(page, "DESCRIPTION", [f.description]) page.nl() self.generate_function_argument_section(page, "POSARGS", f.posargs) if f.varargs: self.generate_function_argument_section(page, "VARARGS", [f.varargs]) self.generate_function_argument_section(page, "OPTARGS", f.optargs, True) self.generate_function_argument_section( page, "KWARGS", self.sorted_and_filtered(list(f.kwargs.values())) ) if f.notes: self.generate_sub_sub_section(page, "NOTES", f.notes) if f.warnings: self.generate_sub_sub_section(page, "WARNINGS", f.warnings) if f.example: self.generate_sub_sub_section(page, "EXAMPLE", [f.example]) page.unindent() def generate_object(self, page: ManPage, obj: Object) -> None: page.subsection(obj.name) page.indent(2) info = self.base_info(obj) if info: page.line(", ".join(info)) page.br() if obj.extends: page.line(ManPage.bold("extends: ") + obj.extends) page.br() ret = [x.name for x in self.sorted_and_filtered(obj.returned_by)] if ret: page.line(ManPage.bold("returned_by: ") + ", ".join(ret)) page.br() ext = [x.name for x in self.sorted_and_filtered(obj.extended_by)] if ext: page.line(ManPage.bold("extended_by: ") + ", ".join(ext)) page.br() page.nl() self.generate_description(page, obj.description.strip()) page.nl() if obj.notes: self.generate_sub_sub_section(page, "NOTES", obj.notes) if obj.warnings: self.generate_sub_sub_section(page, "WARNINGS", obj.warnings) if obj.example: self.generate_sub_sub_section(page, "EXAMPLE", [obj.example]) page.unindent() def generate(self) -> None: page = ManPage(self.out) page.title("meson-reference", 3) page.section("NAME") page.par( f"meson-reference v{self._extract_meson_version()}" + " - a reference for meson functions and objects" ) page.section("DESCRIPTION") self.generate_description( page, """This manual is divided into two sections, *FUNCTIONS* and *OBJECTS*. *FUNCTIONS* contains a reference for all meson functions and methods. Methods are denoted by [[object_name]].[[method_name]](). *OBJECTS* contains additional information about each object.""", ) page.section("FUNCTIONS") for f in self.sorted_and_filtered(self.functions): self.generate_function(page, f) for obj in self.sorted_and_filtered(self.objects): for f in self.sorted_and_filtered(obj.methods): self.generate_function(page, f, obj) page.section("OBJECTS") for obj in self.sorted_and_filtered(self.objects): self.generate_object(page, obj) page.section("SEE ALSO") for i in range(len(self.links)): link = self.links[i] page.line(f"[{i + 1}] {link}") page.br() page.section("COPYRIGHT") page.par("Documentation comes from the meson project (https://mesonbuild.com) " + "and is released under Attribution-ShareAlike 4.0 International (CC BY-SA 4.0). " + "Code samples are released under CC0 1.0 Universal (CC0 1.0).") page.par("Meson is a registered trademark of Jussi Pakkanen.") page.write() muon-v0.4.0/subprojects/meson-docs/docs/refman/generatortypes.py0000644000175000017500000000727514737503617024126 0ustar buildbuildimport re from pathlib import Path from .generatorbase import GeneratorBase from .model import ( ReferenceManual, Function, Object, PosArg, VarArgs, Kwarg, ObjectType, ) import typing as T class GeneratorTypes(GeneratorBase): def __init__( self, manual: ReferenceManual, out: Path, enable_modules: bool ) -> None: super().__init__(manual) self.out = out self.enable_modules = enable_modules def _parse_type(self, t, in_container=False): parsed = [] name = "" i = 0 while i < len(t): c = t[i] if c == '[': (n, sub) = self._parse_type(t[i+1:], in_container=True) parsed.append((name, sub,)) name = "" i += n + 1 continue elif c == ']': if name: parsed.append(name) return (i+1, parsed) elif c == ' ': i += 1 continue elif c == '|': if name: parsed.append(name) name = "" else: name += c i += 1 if name: parsed.append(name) return (i, parsed) def parse_type(self, t): (_, parsed) = self._parse_type(t) return parsed def assemble_type(self, t): if type(t) is list: def sort_func(v): assert type(v) is not list if type(v) is tuple: return v[0] else: return v t.sort(key=sort_func) return "|".join(self.assemble_type(x) for x in t) elif type(t) is tuple: return t[0] + '[' + self.assemble_type(t[1]) + ']' else: return t def print_types(self, args): args = [args] if not isinstance(args, list) else args res = [] for arg in args: t = self.assemble_type(self.parse_type(arg.type.raw)) res.append(f" {t}") return res def function_name(self, f: Function, o: Object = None) -> str: name = "" if o is not None: name += f"{o.name}." name += f.name return name def generate_function(self, f: Function, obj: Object = None): res = [] res.append(self.function_name(f, obj)) if f.posargs: res.append(' posargs:') res.extend(self.print_types(f.posargs)) if f.varargs: res.append(' varargs:') res.extend(self.print_types(f.varargs)) if f.optargs: res.append(' optargs:') res.extend(self.print_types(f.optargs)) kwargs = self.sorted_and_filtered(list(f.kwargs.values())) if kwargs: res.append(' kwargs:') for kwarg in kwargs: k = kwarg.name t = self.assemble_type(self.parse_type(kwarg.type.raw)) res.append(f" {k}: {t}") res.append(' returns:') res.append(' ' + self.assemble_type(self.parse_type(f.returns.raw))) return res def generate(self): lines = [] for f in self.sorted_and_filtered(self.functions): lines.extend(self.generate_function(f, None)) for obj in self.sorted_and_filtered(self.objects): for f in self.sorted_and_filtered(obj.methods): if not self.enable_modules and (obj.obj_type == ObjectType.MODULE or obj.defined_by_module is not None): continue lines.extend(self.generate_function(f, obj)) self.out.write_text("\n".join(lines) + "\n", encoding="utf-8") muon-v0.4.0/subprojects/meson-docs/docs/refman/generatorvim.py0000644000175000017500000000225414737503617023545 0ustar buildbuild# SPDX-License-Identifier: Apache-2.0 # Copyright 2023 The Meson development team from __future__ import annotations from pathlib import Path from .generatorbase import GeneratorBase from .model import ReferenceManual class GeneratorVim(GeneratorBase): def __init__(self, manual: ReferenceManual, out_dir: Path) -> None: super().__init__(manual) self.out_dir = out_dir def generate(self) -> None: template_dir = Path(__file__).resolve().parent / 'templates' outname = 'meson.vim' template_name = f'{outname}.mustache' template_file = template_dir / template_name builtin_funcs = [f.name for f in self.sorted_and_filtered(self.functions)] data = { 'builtin_funcs': '\n \\ '.join(builtin_funcs) } # Import here, so that other generators don't also depend on it import chevron result = chevron.render( template=template_file.read_text(encoding='utf-8'), data=data, warn=True, ) self.out_dir.mkdir(parents=True, exist_ok=True) out_file = self.out_dir / outname out_file.write_text(result, encoding='utf-8') muon-v0.4.0/subprojects/meson-docs/docs/refman/__init__.py0000644000175000017500000000000014737503617022565 0ustar buildbuildmuon-v0.4.0/subprojects/meson-docs/docs/refman/generatorc.py0000644000175000017500000001623414737503617023177 0ustar buildbuild# SPDX-License-Identifier: Apache-2.0 # Copyright 2021 The Meson development team from __future__ import annotations from pathlib import Path import json import re from .generatorbase import GeneratorBase from . import jsonschema as J from .model import ( ReferenceManual, Function, Object, Type, PosArg, VarArgs, Kwarg, ) import typing as T OBJ_MAP = { 'build_machine': 'machine', 'build_tgt': 'build_target', 'cfg_data': 'configuration_data', 'cmake': None, 'cmake_options': None, 'custom_idx': None, 'custom_tgt': 'custom_target', 'dep': 'dependency', 'env': 'environment', 'feature': 'feature_opt', 'int': 'number', 'list': 'array', 'runresult': 'run_result', 'str': 'string', } class GeneratorC(GeneratorBase): def __init__(self, manual: ReferenceManual, out: Path, enable_modules: bool) -> None: super().__init__(manual) self.out = out self.enable_modules = enable_modules def _generate_type(self, typ: Type) -> T.List[J.Type]: return [ { 'obj': x.data_type.name, 'holds': self._generate_type(x.holds) if x.holds else [], } for x in typ.resolved ] def _generate_type_str(self, typ: Type) -> str: # Remove all whitespaces return re.sub(r'[ \n\r\t]', '', typ.raw) def _generate_arg(self, arg: T.Union[PosArg, VarArgs, Kwarg], isOptarg: bool = False) -> J.Argument: return { 'name': arg.name, 'description': arg.description, 'since': arg.since if arg.since else None, 'deprecated': arg.deprecated if arg.deprecated else None, 'type': self._generate_type(arg.type), 'type_str': self._generate_type_str(arg.type), 'required': arg.required if isinstance(arg, Kwarg) else not isOptarg and not isinstance(arg, VarArgs), 'default': arg.default if isinstance(arg, (PosArg, Kwarg)) else None, 'min_varargs': arg.min_varargs if isinstance(arg, VarArgs) and arg.min_varargs > 0 else None, 'max_varargs': arg.max_varargs if isinstance(arg, VarArgs) and arg.max_varargs > 0 else None, # Not yet supported 'notes': [], 'warnings': [], } def _cstr(self, s: str) -> str: s = s.replace('\\', '\\\\') s = s.replace('\n', '\\n') s = s.replace('"', '\\"') return f'"{s}"' def _wrap(self, s): return f"{{ {s} }}" def _cstr_struct(self, d): elems = [] for k, v in d.items(): if v is True: s = "true" elif v is False: s = "false" elif type(v) is int: s = str(v) else: s = self._cstr(v) elems.append(f".{k} = {s}") return self._wrap(', '.join(elems)) def _generate_function(self, func: Function) -> str: posargs = [] kwargs = [] for arg in func.posargs: posargs.append({ 'common.name': arg.name, 'common.description': arg.description, 'common.type': self._generate_type_str(arg.type), }) for arg in func.optargs: posargs.append({ 'common.name': arg.name, 'common.description': arg.description, 'common.type': self._generate_type_str(arg.type), 'optional': True, }) if func.varargs: posargs.append({ 'common.name': func.varargs.name, 'common.description': func.varargs.description, 'common.type': self._generate_type_str(func.varargs.type), 'glob': True, }) for arg in self.sorted_and_filtered(list(func.kwargs.values())): kwargs.append({ 'common.name': arg.name, 'common.description': arg.description, 'optional': True, }) return { 'common.name': func.name, 'common.description': func.description, 'common.type': self._generate_type_str(func.returns), 'posargs_len': len(posargs), 'kwargs_len': len(kwargs), }, posargs, kwargs # 'since': func.since if func.since else None, # 'deprecated': func.deprecated if func.deprecated else None, # 'notes': func.notes, # 'warnings': func.warnings, # 'example': func.example if func.example else None, # 'returns': self._generate_type(func.returns), # 'returns_str': self._generate_type_str(func.returns), # 'posargs': {x.name: self._generate_arg(x) }, # 'optargs': {x.name: self._generate_arg(x, True) for x in func.optargs}, # 'kwargs': {x.name: self._generate_arg(x) for x in self.sorted_and_filtered(list(func.kwargs.values()))}, # 'varargs': self._generate_arg(func.varargs) if func.varargs else None, # 'arg_flattening': func.arg_flattening, # } def _generate_objects(self, obj: Object) -> J.Object: return { 'name': obj.name, 'description': obj.description, 'since': obj.since if obj.since else None, 'deprecated': obj.deprecated if obj.deprecated else None, 'notes': obj.notes, 'warnings': obj.warnings, 'defined_by_module': obj.defined_by_module.name if obj.defined_by_module else None, 'object_type': obj.obj_type.name, 'is_container': obj.is_container, 'example': obj.example if obj.example else None, 'extends': obj.extends if obj.extends else None, 'returned_by': [x.name for x in self.sorted_and_filtered(obj.returned_by)], 'extended_by': [x.name for x in self.sorted_and_filtered(obj.extended_by)], 'methods': {x.name: self._generate_function(x) for x in self.sorted_and_filtered(obj.methods)}, } def generate(self) -> None: prefix = 'meson_doc_' text = '' posargs = [] kwargs = [] funcs = { '0': [] } def add_function(group_name, func): f, p, k = self._generate_function(func) f['posargs_start'] = len(posargs) f['kwargs_start'] = len(kwargs) funcs[group_name].append(self._cstr_struct(f)) posargs.extend([self._cstr_struct(x) for x in p]) kwargs.extend([self._cstr_struct(x) for x in k]) for x in self.sorted_and_filtered(self.functions): add_function('0', x) for x in self.sorted_and_filtered(self.objects): if x.name in OBJ_MAP: o = OBJ_MAP[x.name] else: o = x.name if o is None: continue o = f'obj_{o}' for y in self.sorted_and_filtered(x.methods): if o not in funcs: funcs[o] = [] add_function(o, y) text += f'struct {prefix}entry_arg {prefix}posargs[] = {{\n' for o in posargs: text += f'\t{o},\n' text += '};\n' text += f'struct {prefix}entry_arg {prefix}kwargs[] = {{\n' for o in kwargs: text += f'\t{o},\n' text += '};\n' for o in funcs: text += f'struct {prefix}entry_func {prefix}object_{o}[] = {{\n' for f in funcs[o]: text += '\t' + f + ',\n' text += '\t{ 0 },\n' text += '};\n\n' text += f'struct {prefix}entry_func *{prefix}root[obj_type_count] = {{\n' for o in funcs: text += f'\t[{o}] = {prefix}object_{o},\n' text += '};\n' self.out.write_text( text.lstrip(), encoding='utf-8', ) # data: J.Root = { # 'version_major': J.VERSION_MAJOR, # 'version_minor': J.VERSION_MINOR, # 'meson_version': self._extract_meson_version(), # 'functions': {x.name: self._generate_function(x) for x in self.sorted_and_filtered(self.functions)}, # 'objects': {x.name: self._generate_objects(x) for x in self.sorted_and_filtered(self.objects)}, # 'objects_by_type': { # 'elementary': [x.name for x in self.elementary], # 'builtins': [x.name for x in self.builtins], # 'returned': [x.name for x in self.returned], # 'modules': { # x.name: [y.name for y in self.sorted_and_filtered(self.extract_returned_by_module(x))] # for x in self.modules # }, # }, # } # self.out.write_text(json.dumps(data), encoding='utf-8') muon-v0.4.0/subprojects/meson-docs/docs/refman/generatormd.py0000644000175000017500000004106214737503617023352 0ustar buildbuild# SPDX-License-Identifier: Apache-2.0 # Copyright 2021 The Meson development team from .generatorbase import GeneratorBase import re import json from .model import ( ReferenceManual, Function, Method, Object, ObjectType, Type, DataTypeInfo, ArgBase, PosArg, VarArgs, Kwarg, ) from pathlib import Path from textwrap import dedent import typing as T from mesonbuild import mlog PlaceholderTypes = T.Union[None, str, bool] FunctionDictType = T.Dict[ str, T.Union[ PlaceholderTypes, T.Dict[str, PlaceholderTypes], T.Dict[str, T.Dict[str, PlaceholderTypes]], T.Dict[str, T.List[T.Dict[str, PlaceholderTypes]]], T.List[T.Dict[str, PlaceholderTypes]], T.List[str], ] ] _ROOT_BASENAME = 'Reference-manual' _OBJ_ID_MAP = { ObjectType.ELEMENTARY: 'elementary', ObjectType.BUILTIN: 'builtin', ObjectType.MODULE: 'module', ObjectType.RETURNED: 'returned', } # Indent all but the first line with 4*depth spaces. # This function is designed to be used with `dedent` # and fstrings where multiline strings are used during # the string interpolation. def smart_indent(raw: str, depth: int = 3) -> str: lines = raw.split('\n') first_line = lines[0] lines = [' ' * (4 * depth) + x for x in lines] lines[0] = first_line # Do not indent the first line return '\n'.join(lines) def code_block(code: str) -> str: code = dedent(code) return f'
{code}
' class GeneratorMD(GeneratorBase): def __init__(self, manual: ReferenceManual, sitemap_out: Path, sitemap_in: Path, link_def_out: Path, enable_modules: bool) -> None: super().__init__(manual) self.sitemap_out = sitemap_out.resolve() self.sitemap_in = sitemap_in.resolve() self.link_def_out = link_def_out.resolve() self.out_dir = self.sitemap_out.parent self.enable_modules = enable_modules self.generated_files: T.Dict[str, str] = {} # Utility functions def _gen_filename(self, file_id: str, *, extension: str = 'md') -> str: parts = file_id.split('.') assert parts[0] == 'root' assert all([x for x in parts]) parts[0] = _ROOT_BASENAME parts = [re.sub(r'[0-9]+_', '', x) for x in parts] return f'{"_".join(parts)}.{extension}' def _gen_object_file_id(self, obj: Object) -> str: ''' Deterministically generate a unique file ID for the Object. This ID determines where the object will be inserted in the sitemap. ''' if obj.obj_type == ObjectType.RETURNED and obj.defined_by_module is not None: base = self._gen_object_file_id(obj.defined_by_module) return f'{base}.{obj.name}' return f'root.{_OBJ_ID_MAP[obj.obj_type]}.{obj.name}' def _link_to_object(self, obj: T.Union[Function, Object], in_code_block: bool = False) -> str: ''' Generate a palaceholder tag for the function/method/object documentation. This tag is then replaced in the custom hotdoc plugin. ''' prefix = '#' if in_code_block else '' if isinstance(obj, Object): return f'[[{prefix}@{obj.name}]]' elif isinstance(obj, Method): return f'[[{prefix}{obj.obj.name}.{obj.name}]]' elif isinstance(obj, Function): return f'[[{prefix}{obj.name}]]' else: raise RuntimeError(f'Invalid argument {obj}') def _write_file(self, data: str, file_id: str) -> None:# ''' Write the data to disk and store the id for the generated data ''' self.generated_files[file_id] = self._gen_filename(file_id) out_file = self.out_dir / self.generated_files[file_id] out_file.write_text(data, encoding='ascii') mlog.log('Generated', mlog.bold(out_file.name)) def _write_template(self, data: T.Dict[str, T.Any], file_id: str, template_name: T.Optional[str] = None) -> None: ''' Render the template mustache files and write the result ''' template_dir = Path(__file__).resolve().parent / 'templates' template_name = template_name or file_id template_name = f'{template_name}.mustache' template_file = template_dir / template_name # Import here, so that other generators don't also depend on it import chevron result = chevron.render( template=template_file.read_text(encoding='utf-8'), data=data, partials_path=template_dir.as_posix(), warn=True, ) self._write_file(result, file_id) # Actual generator functions def _gen_func_or_method(self, func: Function) -> FunctionDictType: def render_type(typ: Type, in_code_block: bool = False) -> str: def data_type_to_str(dt: DataTypeInfo) -> str: base = self._link_to_object(dt.data_type, in_code_block) if dt.holds: return f'{base}[{render_type(dt.holds, in_code_block)}]' return base assert typ.resolved return ' | '.join([data_type_to_str(x) for x in typ.resolved]) def len_stripped(s: str) -> int: s = s.replace(']]', '') # I know, this regex is ugly but it works. return len(re.sub(r'\[\[(#|@)*([^\[])', r'\2', s)) def arg_anchor(arg: ArgBase) -> str: return f'{func.name}_{arg.name.replace("<", "_").replace(">", "_")}' def render_signature() -> str: # Skip a lot of computations if the function does not take any arguments if not any([func.posargs, func.optargs, func.kwargs, func.varargs]): return f'{render_type(func.returns, True)} {func.name}()' signature = dedent(f'''\ # {self.brief(func)} {render_type(func.returns, True)} {func.name}( ''') # Calculate maximum lengths of the type and name all_args: T.List[ArgBase] = [] all_args += func.posargs all_args += func.optargs all_args += [func.varargs] if func.varargs else [] max_type_len = 0 max_name_len = 0 if all_args: max_type_len = max([len_stripped(render_type(x.type)) for x in all_args]) max_name_len = max([len(x.name) for x in all_args]) # Generate some common strings def prepare(arg: ArgBase, link: bool = True) -> T.Tuple[str, str, str, str]: type_str = render_type(arg.type, True) type_len = len_stripped(type_str) type_space = ' ' * (max_type_len - type_len) name_space = ' ' * (max_name_len - len(arg.name)) name_str = f'{arg.name.replace("<", "<").replace(">", ">")}' if link: name_str = f'{name_str}' return type_str, type_space, name_str, name_space for i in func.posargs: type_str, type_space, name_str, name_space = prepare(i) signature += f' {type_str}{type_space} {name_str},{name_space} # {self.brief(i)}\n' for i in func.optargs: type_str, type_space, name_str, name_space = prepare(i) signature += f' {type_str}{type_space} [{name_str}],{name_space} # {self.brief(i)}\n' if func.varargs: type_str, type_space, name_str, name_space = prepare(func.varargs, link=False) signature += f' {type_str}{type_space} {name_str}...,{name_space} # {self.brief(func.varargs)}\n' # Abort if there are no kwargs if not func.kwargs: return signature + ')' # Only add this separator if there are any posargs if all_args: signature += '\n # Keyword arguments:\n' # Recalculate lengths for kwargs all_args = list(func.kwargs.values()) max_type_len = max([len_stripped(render_type(x.type)) for x in all_args]) max_name_len = max([len(x.name) for x in all_args]) for kwarg in self.sorted_and_filtered(list(func.kwargs.values())): type_str, type_space, name_str, name_space = prepare(kwarg) required = ' [required] ' if kwarg.required else ' ' required = required if any([x.required for x in func.kwargs.values()]) else '' signature += f' {name_str}{name_space} : {type_str}{type_space} {required} # {self.brief(kwarg)}\n' return signature + ')' def gen_arg_data(arg: T.Union[PosArg, Kwarg, VarArgs], *, optional: bool = False) -> T.Dict[str, PlaceholderTypes]: data: T.Dict[str, PlaceholderTypes] = { 'row-id': arg_anchor(arg), 'name': arg.name, 'type': render_type(arg.type), 'description': arg.description, 'since': arg.since or None, 'deprecated': arg.deprecated or None, 'optional': optional, 'default': None, } if isinstance(arg, VarArgs): data.update({ 'min': str(arg.min_varargs) if arg.min_varargs > 0 else '0', 'max': str(arg.max_varargs) if arg.max_varargs > 0 else 'infinity', }) if isinstance(arg, (Kwarg, PosArg)): data.update({'default': arg.default or None}) if isinstance(arg, Kwarg): data.update({'required': arg.required}) return data mname = f'\\{func.name}' if func.name == '[index]' else func.name data: FunctionDictType = { 'name': f'{func.obj.name}.{mname}' if isinstance(func, Method) else func.name, 'base_level': '##' if isinstance(func, Method) else '#', 'type_name_upper': 'Method' if isinstance(func, Method) else 'Function', 'type_name': 'method' if isinstance(func, Method) else 'function', 'description': func.description, 'notes': func.notes, 'warnings': func.warnings, 'example': func.example or None, 'signature_level': 'h4' if isinstance(func, Method) else 'h3', 'signature': render_signature(), 'has_args': bool(func.posargs or func.optargs or func.kwargs or func.varargs), # Merge posargs and optargs by generating the *[optional]* tag for optargs 'posargs': { 'args': [gen_arg_data(x) for x in func.posargs] + [gen_arg_data(x, optional=True) for x in func.optargs] } if func.posargs or func.optargs else None, 'kwargs': {'args': [gen_arg_data(x) for x in self.sorted_and_filtered(list(func.kwargs.values()))]} if func.kwargs else None, 'varargs': gen_arg_data(func.varargs) if func.varargs else None, 'arg_flattening': func.arg_flattening, # For the feature taggs template 'since': func.since or None, 'deprecated': func.deprecated or None, 'optional': False, 'default': None } return data def _write_object(self, obj: Object) -> None: data = { 'name': obj.name, 'title': obj.long_name if obj.obj_type == ObjectType.RETURNED else obj.name, 'description': obj.description, 'notes': obj.notes, 'warnings': obj.warnings, 'long_name': obj.long_name, 'obj_type_name': _OBJ_ID_MAP[obj.obj_type].capitalize(), 'example': obj.example or None, 'has_methods': bool(obj.methods), 'has_inherited_methods': bool(obj.inherited_methods), 'has_subclasses': bool(obj.extended_by), 'is_returned': bool(obj.returned_by), 'extends': obj.extends_obj.name if obj.extends_obj else None, 'returned_by': [self._link_to_object(x) for x in self.sorted_and_filtered(obj.returned_by)], 'extended_by': [self._link_to_object(x) for x in self.sorted_and_filtered(obj.extended_by)], 'methods': [self._gen_func_or_method(m) for m in self.sorted_and_filtered(obj.methods)], 'inherited_methods': [self._gen_func_or_method(m) for m in self.sorted_and_filtered(obj.inherited_methods)], } self._write_template(data, self._gen_object_file_id(obj), 'object') def _write_functions(self) -> None: data = {'functions': [self._gen_func_or_method(x) for x in self.functions]} self._write_template(data, 'root.functions') def _root_refman_docs(self) -> None: def gen_obj_links(objs: T.List[Object]) -> T.List[T.Dict[str, str]]: ret: T.List[T.Dict[str, str]] = [] for o in objs: ret += [{'indent': '', 'link': self._link_to_object(o), 'brief': self.brief(o)}] for m in self.sorted_and_filtered(o.methods): ret += [{'indent': ' ', 'link': self._link_to_object(m), 'brief': self.brief(m)}] if o.obj_type == ObjectType.MODULE and self.extract_returned_by_module(o): tmp = gen_obj_links(self.extract_returned_by_module(o)) tmp = [{**x, 'indent': ' ' + x['indent']} for x in tmp] ret += [{'indent': ' ', 'link': '**New objects:**', 'brief': ''}] ret += [*tmp] return ret data = { 'root': self._gen_filename('root'), 'elementary': gen_obj_links(self.elementary), 'returned': gen_obj_links(self.returned), 'builtins': gen_obj_links(self.builtins), 'modules': gen_obj_links(self.modules), 'functions': [{'indent': '', 'link': self._link_to_object(x), 'brief': self.brief(x)} for x in self.functions], 'enable_modules': self.enable_modules, } dummy = {'root': self._gen_filename('root')} self._write_template(data, 'root') self._write_template({**dummy, 'name': 'Elementary types'}, f'root.{_OBJ_ID_MAP[ObjectType.ELEMENTARY]}', 'dummy') self._write_template({**dummy, 'name': 'Builtin objects'}, f'root.{_OBJ_ID_MAP[ObjectType.BUILTIN]}', 'dummy') self._write_template({**dummy, 'name': 'Returned objects'}, f'root.{_OBJ_ID_MAP[ObjectType.RETURNED]}', 'dummy') if self.enable_modules: self._write_template({**dummy, 'name': 'Modules'}, f'root.{_OBJ_ID_MAP[ObjectType.MODULE]}', 'dummy') def generate(self) -> None: mlog.log('Generating markdown files...') with mlog.nested(): self._write_functions() for obj in self.objects: if not self.enable_modules and (obj.obj_type == ObjectType.MODULE or obj.defined_by_module is not None): continue self._write_object(obj) self._root_refman_docs() self._configure_sitemap() self._generate_link_def() def _configure_sitemap(self) -> None: ''' Replaces the `@REFMAN_PLACEHOLDER@` placeholder with the reference manual sitemap. The structure of the sitemap is derived from the file IDs. ''' raw = self.sitemap_in.read_text(encoding='utf-8') out = '' for l in raw.split('\n'): if '@REFMAN_PLACEHOLDER@' not in l: out += f'{l}\n' continue mlog.log('Generating', mlog.bold(self.sitemap_out.as_posix())) base_indent = l.replace('@REFMAN_PLACEHOLDER@', '') for k in sorted(self.generated_files.keys()): indent = base_indent + '\t' * k.count('.') out += f'{indent}{self.generated_files[k]}\n' self.sitemap_out.write_text(out, encoding='utf-8') def _generate_link_def(self) -> None: ''' Generate the link definition file for the refman_links hotdoc plugin. The plugin is then responsible for replacing the [[tag]] tags with custom HTML elements. ''' data: T.Dict[str, str] = {} # Objects and methods for obj in self.objects: obj_file = self._gen_filename(self._gen_object_file_id(obj), extension='html') data[f'@{obj.name}'] = obj_file for m in obj.methods: data[f'{obj.name}.{m.name}'] = f'{obj_file}#{obj.name}{m.name}' # Functions funcs_file = self._gen_filename('root.functions', extension='html') for fn in self.functions: data[fn.name] = f'{funcs_file}#{fn.name}' self.link_def_out.write_text(json.dumps(data, indent=2), encoding='utf-8') muon-v0.4.0/subprojects/meson-docs/docs/refman/model.py0000644000175000017500000000404214737503617022140 0ustar buildbuild# SPDX-License-Identifier: Apache-2.0 # Copyright 2021 The Meson development team from dataclasses import dataclass, field from enum import Enum import typing as T # Utils @dataclass class NamedObject: name: str description: str @property def hidden(self) -> bool: return self.name.startswith('_') @dataclass class FetureCheck: since: str deprecated: str @dataclass class DataTypeInfo: data_type: 'Object' holds: T.Optional['Type'] @dataclass class Type: raw: str resolved: T.List[DataTypeInfo] = field(init=False, default_factory=list) # Arguments @dataclass class ArgBase(NamedObject, FetureCheck): type: Type @dataclass class PosArg(ArgBase): default: str @dataclass class VarArgs(ArgBase): min_varargs: int max_varargs: int @dataclass class Kwarg(ArgBase): required: bool default: str # Function @dataclass class Function(NamedObject, FetureCheck): notes: T.List[str] warnings: T.List[str] returns: Type example: str posargs: T.List[PosArg] optargs: T.List[PosArg] varargs: T.Optional[VarArgs] kwargs: T.Dict[str, Kwarg] posargs_inherit: str optargs_inherit: str varargs_inherit: str kwargs_inherit: T.List[str] arg_flattening: bool @dataclass class Method(Function): obj: 'Object' # Types and objects class ObjectType(Enum): ELEMENTARY = 0 BUILTIN = 1 MODULE = 2 RETURNED = 3 @dataclass class Object(NamedObject, FetureCheck): notes: T.List[str] warnings: T.List[str] long_name: str example: str obj_type: ObjectType methods: T.List[Method] is_container: bool extends: str extends_obj: T.Optional['Object'] = None defined_by_module: T.Optional['Object'] = None returned_by: T.List[T.Union[Function, Method]] = field(default_factory=list) extended_by: T.List['Object'] = field(default_factory=list) inherited_methods: T.List[Method] = field(default_factory=list) # ROOT @dataclass class ReferenceManual: functions: T.List[Function] objects: T.List[Object] muon-v0.4.0/subprojects/meson-docs/docs/refman/generatorjson.py0000644000175000017500000001127214737503617023723 0ustar buildbuild# SPDX-License-Identifier: Apache-2.0 # Copyright 2021 The Meson development team from __future__ import annotations from pathlib import Path import json import re from .generatorbase import GeneratorBase from . import jsonschema as J from .model import ( ReferenceManual, Function, Object, Type, PosArg, VarArgs, Kwarg, ) import typing as T class GeneratorJSON(GeneratorBase): def __init__(self, manual: ReferenceManual, out: Path, enable_modules: bool) -> None: super().__init__(manual) self.out = out self.enable_modules = enable_modules def _generate_type(self, typ: Type) -> T.List[J.Type]: return [ { 'obj': x.data_type.name, 'holds': self._generate_type(x.holds) if x.holds else [], } for x in typ.resolved ] def _generate_type_str(self, typ: Type) -> str: # Remove all whitespaces return re.sub(r'[ \n\r\t]', '', typ.raw) def _generate_arg(self, arg: T.Union[PosArg, VarArgs, Kwarg], isOptarg: bool = False) -> J.Argument: return { 'name': arg.name, 'description': arg.description, 'since': arg.since if arg.since else None, 'deprecated': arg.deprecated if arg.deprecated else None, 'type': self._generate_type(arg.type), 'type_str': self._generate_type_str(arg.type), 'required': arg.required if isinstance(arg, Kwarg) else not isOptarg and not isinstance(arg, VarArgs), 'default': arg.default if isinstance(arg, (PosArg, Kwarg)) else None, 'min_varargs': arg.min_varargs if isinstance(arg, VarArgs) and arg.min_varargs > 0 else None, 'max_varargs': arg.max_varargs if isinstance(arg, VarArgs) and arg.max_varargs > 0 else None, # Not yet supported 'notes': [], 'warnings': [], } def _generate_function(self, func: Function) -> J.Function: return { 'name': func.name, 'description': func.description, 'since': func.since if func.since else None, 'deprecated': func.deprecated if func.deprecated else None, 'notes': func.notes, 'warnings': func.warnings, 'example': func.example if func.example else None, 'returns': self._generate_type(func.returns), 'returns_str': self._generate_type_str(func.returns), 'posargs': {x.name: self._generate_arg(x) for x in func.posargs}, 'optargs': {x.name: self._generate_arg(x, True) for x in func.optargs}, 'kwargs': {x.name: self._generate_arg(x) for x in self.sorted_and_filtered(list(func.kwargs.values()))}, 'varargs': self._generate_arg(func.varargs) if func.varargs else None, 'arg_flattening': func.arg_flattening, } def _generate_objects(self, obj: Object) -> J.Object: return { 'name': obj.name, 'description': obj.description, 'since': obj.since if obj.since else None, 'deprecated': obj.deprecated if obj.deprecated else None, 'notes': obj.notes, 'warnings': obj.warnings, 'defined_by_module': obj.defined_by_module.name if obj.defined_by_module else None, 'object_type': obj.obj_type.name, 'is_container': obj.is_container, 'example': obj.example if obj.example else None, 'extends': obj.extends if obj.extends else None, 'returned_by': [x.name for x in self.sorted_and_filtered(obj.returned_by)], 'extended_by': [x.name for x in self.sorted_and_filtered(obj.extended_by)], 'methods': {x.name: self._generate_function(x) for x in self.sorted_and_filtered(obj.methods)}, } def generate(self) -> None: data: J.Root = { 'version_major': J.VERSION_MAJOR, 'version_minor': J.VERSION_MINOR, 'meson_version': self._extract_meson_version(), 'functions': {x.name: self._generate_function(x) for x in self.sorted_and_filtered(self.functions)}, 'objects': {x.name: self._generate_objects(x) for x in self.sorted_and_filtered(self.objects)}, 'objects_by_type': { 'elementary': [x.name for x in self.elementary], 'builtins': [x.name for x in self.builtins], 'returned': [x.name for x in self.returned], 'modules': { x.name: [y.name for y in self.sorted_and_filtered(self.extract_returned_by_module(x))] for x in self.modules }, }, } self.out.write_text(json.dumps(data), encoding='utf-8') muon-v0.4.0/subprojects/meson-docs/docs/refman/jsonschema.py0000644000175000017500000000730414737503617023176 0ustar buildbuild# SPDX-License-Identifier: Apache-2.0 # Copyright 2021 The Meson development team import typing as T # The following variables define the current version of # the JSON documentation format. This is different from # the Meson version VERSION_MAJOR = 1 # Changes here indicate breaking format changes (changes to existing keys) VERSION_MINOR = 1 # Changes here indicate non-breaking changes (only new keys are added to the existing structure) if T.TYPE_CHECKING: from typing_extensions import TypedDict class BaseObject(TypedDict): ''' Base object for most dicts in the JSON doc. All objects inheriting from BaseObject will support the keys specified here: ''' name: str description: str since: T.Optional[str] deprecated: T.Optional[str] notes: T.List[str] warnings: T.List[str] class Type(TypedDict): obj: str # References an object from `root.objects` holds: T.Sequence[object] # Mypy does not support recursive dicts, but this should be T.List[Type]... class Argument(BaseObject): ''' Object that represents any type of a single function or method argument. ''' type: T.List[Type] # A non-empty list of types that are supported. type_str: str # Formatted version of `type`. Is guaranteed to not contain any whitespaces. required: bool default: T.Optional[str] min_varargs: T.Optional[int] # Only relevant for varargs, must be `null` for all other types of arguments max_varargs: T.Optional[int] # Only relevant for varargs, must be `null` for all other types of arguments class Function(BaseObject): ''' Represents a function or method. ''' returns: T.List[Type] # A non-empty list of types that are supported. returns_str: str # Formatted version of `returns`. Is guaranteed to not contain any whitespaces. example: T.Optional[str] posargs: T.Dict[str, Argument] optargs: T.Dict[str, Argument] kwargs: T.Dict[str, Argument] varargs: T.Optional[Argument] arg_flattening: bool class Object(BaseObject): ''' Represents all types of Meson objects. The specific object type is stored in the `object_type` field. ''' example: T.Optional[str] object_type: str # Defines the object type: Must be one of: ELEMENTARY, BUILTIN, MODULE, RETURNED methods: T.Dict[str, Function] is_container: bool extends: T.Optional[str] returned_by: T.List[str] extended_by: T.List[str] defined_by_module: T.Optional[str] class ObjectsByType(TypedDict): ''' References to other objects are stored here for ease of navigation / filtering ''' elementary: T.List[str] builtins: T.List[str] returned: T.List[str] modules: T.Dict[str, T.List[str]] class Root(TypedDict): ''' The root object of the JSON reference manual ''' version_major: int # See the description above for version_minor: int # VERSION_MAJOR and VERSION_MINOR meson_version: str functions: T.Dict[str, Function] # A mapping of to a `Function` object for *all* Meson functions objects: T.Dict[str, Object] # A mapping of to a `Object` object for *all* Meson objects (including modules, elementary, etc.) objects_by_type: ObjectsByType muon-v0.4.0/subprojects/meson-docs/docs/refman/templates/0002755000175000017500000000000014737503617022466 5ustar buildbuildmuon-v0.4.0/subprojects/meson-docs/docs/refman/templates/root_link.mustache0000644000175000017500000000023414737503617026216 0ustar buildbuild{{indent}}- {{&link}}{{&brief}} muon-v0.4.0/subprojects/meson-docs/docs/refman/templates/args.mustache0000644000175000017500000000213214737503617025151 0ustar buildbuild {{#args}} {{/args}}
Name Type Description Tags
{{name}} {{&type}} {{&description}} {{>taggs}}
muon-v0.4.0/subprojects/meson-docs/docs/refman/templates/object.mustache0000644000175000017500000000204014737503617025461 0ustar buildbuild--- short-description: "{{obj_type_name}} object: {{long_name}}" title: {{title}} render-subpages: false ... # {{long_name}} (`{{name}}`{{#extends}} extends [[@{{.}}]]{{/extends}}) {{&description}} {{#has_subclasses}} ## Extended by {{long_name}} is extended by the following subtypes: {{#extended_by}} - {{&.}} {{/extended_by}} {{/has_subclasses}} {{#is_returned}} ## Returned by {{long_name}} objects are returned by the following functions and methods: {{#returned_by}} - {{&.}} {{/returned_by}} {{/is_returned}} {{#example}} ## Example
{{&example}}
{{/example}} {{>notes}} {{#has_methods}} ## {{long_name}} methods {{#methods}}

{{>func}}

--- {{/methods}} {{/has_methods}} {{#has_inherited_methods}} ## Inherited methods {{#inherited_methods}}

{{>func}}

--- {{/inherited_methods}} {{/has_inherited_methods}} muon-v0.4.0/subprojects/meson-docs/docs/refman/templates/func.mustache0000644000175000017500000000273314737503617025157 0ustar buildbuild{{base_level}}# {{name}}() {{&description}}

<{{signature_level}} style="margin-top: 0px;">Signature
{{>taggs}}
{{&signature}}
{{#example}}

{{base_level}}## Example {{&example}} {{/example}} {{>notes}} {{#has_args}}

{{base_level}}## Arguments {{^arg_flattening}} [Argument flattening](Syntax.md#argument-flattening) is **NOT SUPPORTED** by this function. {{/arg_flattening}} {{/has_args}} {{#posargs}} The {{type_name}} `{{name}}()` accepts the following positional arguments: {{>args}}

{{/posargs}} {{#varargs}} {{#posargs}}Additionally, the{{/posargs}}{{^posargs}}The{{/posargs}} {{type_name}} accepts between `{{min}}` and `{{max}}` variadic arguments (`{{name}}...`) of type {{&type}}. {{&description}} {{>taggs}}

{{/varargs}} {{#kwargs}} {{#posargs}}Finally, `{{name}}()`{{/posargs}}{{^posargs}}The {{type_name}} `{{name}}()`{{/posargs}} accepts the following keyword arguments: {{>args}} {{/kwargs}} muon-v0.4.0/subprojects/meson-docs/docs/refman/templates/root.functions.mustache0000644000175000017500000000055014737503617027211 0ustar buildbuild--- short-description: Meson functions render-subpages: false ... # Functions This document lists all functions available in `meson.build` files. See the [root manual document]({{root}}) for an overview of all features. {{#functions}}

{{>func}}

--- {{/functions}} muon-v0.4.0/subprojects/meson-docs/docs/refman/templates/taggs.mustache0000644000175000017500000000102014737503617025315 0ustar buildbuild
{{#since}}

(since {{since}})

{{/since}} {{#deprecated}}

DEPRECATED

in {{deprecated}}

{{/deprecated}} {{#optional}}

[optional]

{{/optional}} {{#default}}

default = {{default}}

{{/default}}
muon-v0.4.0/subprojects/meson-docs/docs/refman/templates/dummy.mustache0000644000175000017500000000020714737503617025351 0ustar buildbuild--- short-description: {{name}} render-subpages: true ... # {{name}} See the [root manual document]({{root}}) for a general overview. muon-v0.4.0/subprojects/meson-docs/docs/refman/templates/notes.mustache0000644000175000017500000000030614737503617025346 0ustar buildbuild{{#notes}}
Note: {{&.}}
{{/notes}} {{#warnings}}
Warning: {{&.}}
{{/warnings}} muon-v0.4.0/subprojects/meson-docs/docs/refman/templates/meson.vim.mustache0000644000175000017500000000600714737503617026135 0ustar buildbuild" Vim syntax file " Language: Meson " License: VIM License " Maintainer: Nirbheek Chauhan " Liam Beguin " Last Change: 2023 Aug 27 " Credits: Zvezdan Petkovic " Neil Schemenauer " Dmitry Vasiliev " " This version is copied and edited from python.vim " It's very basic, and doesn't do many things I'd like it to " For instance, it should show errors for syntax that is valid in " Python but not in Meson. " " Optional highlighting can be controlled using these variables. " " let meson_space_error_highlight = 1 " if exists("b:current_syntax") finish endif " We need nocompatible mode in order to continue lines with backslashes. " Original setting will be restored. let s:cpo_save = &cpo set cpo&vim " http://mesonbuild.com/Syntax.html syn keyword mesonConditional elif else if endif syn keyword mesonRepeat foreach endforeach syn keyword mesonOperator and not or in syn keyword mesonStatement continue break syn match mesonComment "#.*$" contains=mesonTodo,@Spell syn keyword mesonTodo FIXME NOTE NOTES TODO XXX contained " Strings can either be single quoted or triple counted across multiple lines, " but always with a ' syn region mesonString \ start="\z('\)" end="\z1" skip="\\\\\|\\\z1" \ contains=mesonEscape,@Spell syn region mesonString \ start="\z('''\)" end="\z1" keepend \ contains=mesonEscape,mesonSpaceError,@Spell syn match mesonEscape "\\[abfnrtv'\\]" contained syn match mesonEscape "\\\o\{1,3}" contained syn match mesonEscape "\\x\x\{2}" contained syn match mesonEscape "\%(\\u\x\{4}\|\\U\x\{8}\)" contained " Meson allows case-insensitive Unicode IDs: http://www.unicode.org/charts/ syn match mesonEscape "\\N{\a\+\%(\s\a\+\)*}" contained syn match mesonEscape "\\$" " Meson only supports integer numbers " http://mesonbuild.com/Syntax.html#numbers syn match mesonNumber "\<\d\+\>" syn match mesonNumber "\<0x\x\+\>" syn match mesonNumber "\<0o\o\+\>" " booleans syn keyword mesonBoolean false true " Built-in functions syn keyword mesonBuiltin \ build_machine \ host_machine \ meson \ option \ target_machine \ {{builtin_funcs}} if exists("meson_space_error_highlight") " trailing whitespace syn match mesonSpaceError display excludenl "\s\+$" " mixed tabs and spaces syn match mesonSpaceError display " \+\t" syn match mesonSpaceError display "\t\+ " endif " The default highlight links. Can be overridden later. hi def link mesonStatement Statement hi def link mesonConditional Conditional hi def link mesonRepeat Repeat hi def link mesonOperator Operator hi def link mesonComment Comment hi def link mesonTodo Todo hi def link mesonString String hi def link mesonEscape Special hi def link mesonNumber Number hi def link mesonBuiltin Function hi def link mesonBoolean Boolean if exists("meson_space_error_highlight") hi def link mesonSpaceError Error endif let b:current_syntax = "meson" let &cpo = s:cpo_save unlet s:cpo_save " vim:set sw=2 sts=2 ts=8 noet: muon-v0.4.0/subprojects/meson-docs/docs/refman/templates/root.mustache0000644000175000017500000000232314737503617025202 0ustar buildbuild--- short-description: The Meson reference manual render-subpages: false ... # Reference manual This is the root page of the online Meson reference manual. This manual is also available in a more machine readable format as a JSON documented attached to every release since *0.60.0*. See our [IDE integration](IDE-integration.md) documentation for more information. All functions and methods are documented in detail in the following subpages: ## Elementary types {{#elementary}} {{indent}}- {{&link}} {{/elementary}} ## Functions The following functions are available in build files. Click on each to see the description and usage. The objects returned by them are [listed here](#returned-objects). {{#functions}} {{indent}}- {{&link}} {{/functions}} ## Builtin objects These are built-in objects that are always available. {{#builtins}} {{indent}}- {{&link}} {{/builtins}} ## Returned objects These are objects that can be returned by [functions](#functions) or other methods. {{#returned}} {{indent}}- {{&link}} {{/returned}} {{#enable_modules}} ## Modules {{#modules}} {{indent}}- {{&link}} {{/modules}} {{/enable_modules}} muon-v0.4.0/subprojects/meson-docs/docs/refman/generatorprint.py0000644000175000017500000000626014737503617024107 0ustar buildbuild# SPDX-License-Identifier: Apache-2.0 # Copyright 2021 The Meson development team from .generatorbase import GeneratorBase from .model import ReferenceManual, Object, Function, DataTypeInfo, Type, ObjectType from mesonbuild import mlog import typing as T def my_nested() -> T.ContextManager[None]: prefix = '|' * mlog.get_log_depth() return mlog.nested(prefix) class GeneratorPrint(GeneratorBase): def _types_to_string(self, typ: Type) -> str: def _data_type_to_str(dt: DataTypeInfo) -> str: if dt.holds: return f'{dt.data_type.name}[{self._types_to_string(dt.holds)}]' return dt.data_type.name return ' | '.join([_data_type_to_str(x) for x in typ.resolved]) def _generate_function(self, func: Function) -> None: mlog.log() mlog.log('Function', mlog.bold(func.name)) with my_nested(): desc = func.description if '\n' in desc: desc = desc[:desc.index('\n')] mlog.log('Description:', mlog.bold(desc)) mlog.log('Return type:', mlog.bold(self._types_to_string(func.returns))) mlog.log('Pos args: ', mlog.bold(str([x.name for x in func.posargs]))) mlog.log('Opt args: ', mlog.bold(str([x.name for x in func.optargs]))) mlog.log('Varargs: ', mlog.bold(func.varargs.name if func.varargs is not None else 'null')) mlog.log('Kwargs: ', mlog.bold(str(list(func.kwargs.keys())))) def _generate_object(self, obj: Object) -> None: tags = [] tags += [{ ObjectType.ELEMENTARY: mlog.yellow('[elementary]'), ObjectType.BUILTIN: mlog.green('[builtin]'), ObjectType.MODULE: mlog.blue('[module]'), ObjectType.RETURNED: mlog.cyan('[returned]'), }[obj.obj_type]] if obj.is_container: tags += [mlog.red('[container]')] mlog.log() mlog.log('Object', mlog.bold(obj.name), *tags) with my_nested(): desc = obj.description if '\n' in desc: desc = desc[:desc.index('\n')] mlog.log('Description:', mlog.bold(desc)) mlog.log('Returned by:', mlog.bold(str([x.name for x in obj.returned_by]))) mlog.log('Methods:') with my_nested(): for m in obj.methods: self._generate_function(m) def generate(self) -> None: mlog.log('\n\n', mlog.bold('=== Functions ==='), '\n') for f in self.functions: self._generate_function(f) mlog.log('\n\n', mlog.bold('=== Elementary ==='), '\n') for obj in self.elementary: self._generate_object(obj) mlog.log('\n\n', mlog.bold('=== Builtins ==='), '\n') for obj in self.builtins: self._generate_object(obj) mlog.log('\n\n', mlog.bold('=== Returned objects ==='), '\n') for obj in self.returned: self._generate_object(obj) mlog.log('\n\n', mlog.bold('=== Modules ==='), '\n') for obj in self.modules: self._generate_object(obj) for mod_obj in self.extract_returned_by_module(obj): self._generate_object(mod_obj) muon-v0.4.0/subprojects/meson-docs/docs/refman/generatorpickle.py0000644000175000017500000000071214737503617024216 0ustar buildbuild# SPDX-License-Identifier: Apache-2.0 # Copyright 2021 The Meson development team import pickle from pathlib import Path from .generatorbase import GeneratorBase from .model import ReferenceManual class GeneratorPickle(GeneratorBase): def __init__(self, manual: ReferenceManual, outpath: Path) -> None: self.out = outpath super().__init__(manual) def generate(self) -> None: self.out.write_bytes(pickle.dumps(self.manual)) muon-v0.4.0/subprojects/meson-docs/docs/README.md0000644000175000017500000000153014737503617020474 0ustar buildbuild# Meson Documentation ## Build dependencies Meson uses itself and [hotdoc](https://github.com/hotdoc/hotdoc) for generating documentation. Minimum required version of hotdoc is *0.8.9*. Instructions on how to install hotdoc are [here](https://hotdoc.github.io/installing.html). Our custom hotdoc extensions require: - [chevron](https://pypi.org/project/chevron) - [strictyaml](https://pypi.org/project/strictyaml) ## Building the documentation From the Meson repository root dir: ``` $ cd docs/ $ meson setup built_docs/ $ ninja -C built_docs/ ``` Now you should be able to open the documentation locally ``` built_docs/Meson documentation-doc/html/index.html ``` ## Upload Meson uses the git-upload hotdoc plugin which basically removes the html pages and replaces with the new content. You can simply run: ``` $ ninja -C built_docs/ upload ``` muon-v0.4.0/subprojects/meson-docs/docs/sitemap.txt0000644000175000017500000000637314737503617021432 0ustar buildbuildindex.md SimpleStart.md Getting-meson.md Getting-meson_zh.md Getting-meson_ptbr.md Quick-guide.md Tutorial.md GuiTutorial.md Manual.md Overview.md Running-Meson.md Commands.md Builtin-options.md Using-with-Visual-Studio.md Meson-sample.md Syntax.md Machine-files.md Native-environments.md Build-targets.md Include-directories.md Installing.md Adding-arguments.md Configuration.md Compiler-properties.md Dependencies.md Threads.md External-commands.md Precompiled-headers.md Unity-builds.md Feature-autodetection.md Generating-sources.md Unit-tests.md Cross-compilation.md Localisation.md Build-options.md Subprojects.md Disabler.md Code-formatting.md Modules.md CMake-module.md Cuda-module.md Dlang-module.md External-Project-module.md Fs-module.md Gnome-module.md Hotdoc-module.md Icestorm-module.md Java-module.md Keyval-module.md Pkgconfig-module.md Python-3-module.md Python-module.md Qt4-module.md Qt5-module.md Qt6-module.md Rust-module.md Simd-module.md SourceSet-module.md Windows-module.md i18n-module.md Wayland-module.md Java.md Vala.md D.md Cython.md Rust.md IDE-integration.md Custom-build-targets.md Build-system-converters.md Configuring-a-build-directory.md Run-targets.md Creating-releases.md Creating-OSX-packages.md Creating-Linux-binaries.md Project-templates.md @REFMAN_PLACEHOLDER@ Reference-tables.md Style-guide.md Rewriter.md FAQ.md Reproducible-builds.md howtox.md Wrapdb-projects.md Wrap-dependency-system-manual.md Adding-new-projects-to-wrapdb.md Using-the-WrapDB.md Using-wraptool.md Wrap-best-practices-and-tips.md Shipping-prebuilt-binaries-as-wraps.md Release-notes.md Release-notes-for-1.5.0.md Release-notes-for-1.4.0.md Release-notes-for-1.3.0.md Release-notes-for-1.2.0.md Release-notes-for-1.1.0.md Release-notes-for-1.0.0.md Release-notes-for-0.64.0.md Release-notes-for-0.63.0.md Release-notes-for-0.62.0.md Release-notes-for-0.61.0.md Release-notes-for-0.60.0.md Release-notes-for-0.59.0.md Release-notes-for-0.58.0.md Release-notes-for-0.57.0.md Release-notes-for-0.56.0.md Release-notes-for-0.55.0.md Release-notes-for-0.54.0.md Release-notes-for-0.53.0.md Release-notes-for-0.52.0.md Release-notes-for-0.51.0.md Release-notes-for-0.50.0.md Release-notes-for-0.49.0.md Release-notes-for-0.48.0.md Release-notes-for-0.47.0.md Release-notes-for-0.46.0.md Release-notes-for-0.45.0.md Release-notes-for-0.44.0.md Release-notes-for-0.43.0.md Release-notes-for-0.42.0.md Release-notes-for-0.41.0.md Release-notes-for-0.40.0.md Release-notes-for-0.39.0.md Release-notes-for-0.38.0.md Release-notes-for-0.37.0.md Additional.md Release-procedure.md Performance-comparison.md ARM-performance-test.md Simple-comparison.md Comparisons.md Conference-presentations.md Contact-information.md Continuous-Integration.md Design-rationale.md IndepthTutorial.md In-the-press.md Mixing-build-systems.md Pkg-config-files.md Playground.md Porting-from-autotools.md Use-of-Python.md Users.md Using-multiple-build-directories.md Vs-External.md Contributing.md Yaml-RefMan.md MesonCI.md legal.md Videos.md muon-v0.4.0/subprojects/meson-docs/docs/meson.build0000644000175000017500000000770014737503617021364 0ustar buildbuildproject('Meson documentation', version: '1.0') yaml_modname = get_option('unsafe_yaml') ? 'yaml' : 'strictyaml' py = import('python').find_installation('python3', modules: [yaml_modname], required: false) if not py.found() error(f'Cannot build documentation without yaml support') endif cur_bdir = meson.current_build_dir() sitemap = files('sitemap.txt') yaml_loader = get_option('unsafe_yaml') ? 'fastyaml' : 'yaml' genrefman = find_program('./genrefman.py') refman_binary = custom_target( 'gen_refman_bin', input: sitemap, output: 'reference_manual.bin', depfile: 'reman_dep.d', command: [ genrefman, '-l', yaml_loader, '-g', 'pickle', '-o', '@OUTPUT@', '--depfile', '@DEPFILE@', '--force-color', ] ) refman_json = custom_target( 'gen_refman_json', build_by_default: true, input: refman_binary, output: 'reference_manual.json', command: [ genrefman, '-l', 'pickle', '-g', 'json', '-i', '@INPUT@', '-o', '@OUTPUT@', '--force-color', ], ) test('validate_docs', find_program('./jsonvalidator.py'), args: [refman_json]) refman_man = custom_target( 'gen_refman_man', build_by_default: true, input: refman_binary, output: 'meson-reference.3', command: [ genrefman, '-l', 'pickle', '-g', 'man', '-i', '@INPUT@', '-o', '@OUTPUT@', '--force-color', '--no-modules', ], install: true, install_dir: get_option('mandir') / 'man3', ) # Everything past here is HTML resources. if not get_option('html') subdir_done() endif # Only the script knows which files are being generated docs_gen = custom_target( 'gen_docs', input: files('markdown/index.md'), output: 'gen_docs.stamp', command: [ files('../tools/regenerate_docs.py'), '--output-dir', cur_bdir, '--dummy-output-file', '@OUTPUT@', ], build_by_default: true, install: false, ) refman_md = custom_target( 'gen_refman_md', input: refman_binary, output: ['configured_sitemap.txt', 'refman_links.json'], command: [ genrefman, '-l', 'pickle', '-g', 'md', '-s', sitemap, '-i', '@INPUT@', '-o', '@OUTPUT0@', '--link-defs', '@OUTPUT1@', '--force-color', '--no-modules', ], ) sitemap = refman_md[0] genrelnotes = custom_target( output: ['sitemap-genrelnotes.txt'], build_always_stale: true, command: [find_program('genrelnotes.py'), '--input-sitemap', sitemap, '--output-sitemap', '@OUTPUT0@', '--output-dir', meson.current_build_dir(), '--source-dir', meson.current_source_dir(), ] ) sitemap = genrelnotes[0] hotdoc_prog = find_program('hotdoc', version: '>=0.13.7') py = import('python').find_installation('python3', modules: ['chevron'], required: false) if not py.found() error('Building the HTML docs requires the chevron module to render generated markdown pages') endif hotdoc = import('hotdoc') documentation = hotdoc.generate_doc(meson.project_name(), project_version: meson.project_version(), sitemap: sitemap, build_by_default: true, depends: docs_gen, index: 'markdown/index.md', install: false, extra_assets: ['images/'], include_paths: ['markdown', cur_bdir], default_license: 'CC-BY-SAv4.0', html_extra_theme: join_paths('theme', 'extra'), git_upload_repository: 'git@github.com:mesonbuild/mesonbuild.github.io.git', edit_on_github_repository: 'https://github.com/mesonbuild/meson', syntax_highlighting_activate: true, keep_markup_in_code_blocks: true, extra_extension: meson.current_source_dir() / 'extensions' / 'refman_links.py', refman_data_file: refman_md[1], fatal_warnings: true, ) run_target('upload', command: [hotdoc_prog, 'run', '--conf-file', documentation.config_path(), '--git-upload', '-vv', ], depends: documentation, ) muon-v0.4.0/subprojects/meson-docs/docs/jsonvalidator.py0000755000175000017500000002023314737503617022452 0ustar buildbuild#!/usr/bin/env python3 # SPDX-License-Identifier: Apache-2.0 # Copyright 2021 The Meson development team import argparse import json from pathlib import Path from copy import deepcopy import typing as T T_None = type(None) # Global root object root: dict def assert_has_typed_keys(path: str, data: dict, keys: T.Dict[str, T.Any]) -> dict: assert set(data.keys()).issuperset(keys.keys()), f'{path}: DIFF: {set(data.keys()).difference(keys.keys())}' res = dict() for key, val in keys.items(): cur = data.pop(key) assert isinstance(cur, val), f'{path}: type({key}: {cur}) != {val}' res[key] = cur return res def validate_base_obj(path: str, name: str, obj: dict) -> None: expected: T.Dict[str, T.Any] = { 'name': str, 'description': str, 'since': (str, T_None), 'deprecated': (str, T_None), 'notes': list, 'warnings': list, } cur = assert_has_typed_keys(f'{path}.{name}', obj, expected) assert cur['name'], f'{path}.{name}' assert cur['description'], f'{path}.{name}' assert cur['name'] == name, f'{path}.{name}' assert all(isinstance(x, str) and x for x in cur['notes']), f'{path}.{name}' assert all(isinstance(x, str) and x for x in cur['warnings']), f'{path}.{name}' def validate_type(path: str, typ: dict) -> None: expected: T.Dict[str, T.Any] = { 'obj': str, 'holds': list, } cur = assert_has_typed_keys(path, typ, expected) assert not typ, f'{path} has extra keys: {typ.keys()}' assert cur['obj'] in root['objects'], path for i in cur['holds']: validate_type(path, i) def validate_arg(path: str, name: str, arg: dict) -> None: validate_base_obj(path, name, arg) expected: T.Dict[str, T.Any] = { 'type': list, 'type_str': str, 'required': bool, 'default': (str, T_None), 'min_varargs': (int, T_None), 'max_varargs': (int, T_None), } cur = assert_has_typed_keys(f'{path}.{name}', arg, expected) assert not arg, f'{path}.{name} has extra keys: {arg.keys()}' assert cur['type'], f'{path}.{name}' assert cur['type_str'], f'{path}.{name}' for i in cur['type']: validate_type(f'{path}.{name}', i) if cur['min_varargs'] is not None: assert cur['min_varargs'] > 0, f'{path}.{name}' if cur['max_varargs'] is not None: assert cur['max_varargs'] > 0, f'{path}.{name}' def validate_function(path: str, name: str, func: dict) -> None: validate_base_obj(path, name, func) expected: T.Dict[str, T.Any] = { 'returns': list, 'returns_str': str, 'example': (str, T_None), 'posargs': dict, 'optargs': dict, 'kwargs': dict, 'varargs': (dict, T_None), 'arg_flattening': bool, } cur = assert_has_typed_keys(f'{path}.{name}', func, expected) assert not func, f'{path}.{name} has extra keys: {func.keys()}' assert cur['returns'], f'{path}.{name}' assert cur['returns_str'], f'{path}.{name}' for i in cur['returns']: validate_type(f'{path}.{name}', i) for k, v in cur['posargs'].items(): validate_arg(f'{path}.{name}', k, v) for k, v in cur['optargs'].items(): validate_arg(f'{path}.{name}', k, v) for k, v in cur['kwargs'].items(): validate_arg(f'{path}.{name}', k, v) if cur['varargs']: validate_arg(f'{path}.{name}', cur['varargs']['name'], cur['varargs']) def validate_object(path: str, name: str, obj: dict) -> None: validate_base_obj(path, name, obj) expected: T.Dict[str, T.Any] = { 'example': (str, T_None), 'object_type': str, 'methods': dict, 'is_container': bool, 'extends': (str, T_None), 'returned_by': list, 'extended_by': list, 'defined_by_module': (str, T_None), } cur = assert_has_typed_keys(f'{path}.{name}', obj, expected) assert not obj, f'{path}.{name} has extra keys: {obj.keys()}' for key, val in cur['methods'].items(): validate_function(f'{path}.{name}', key, val) if cur['extends'] is not None: assert cur['extends'] in root['objects'], f'{path}.{name}' assert all(isinstance(x, str) for x in cur['returned_by']), f'{path}.{name}' assert all(isinstance(x, str) for x in cur['extended_by']), f'{path}.{name}' assert all(x in root['objects'] for x in cur['extended_by']), f'{path}.{name}' if cur['defined_by_module'] is not None: assert cur['defined_by_module'] in root['objects'], f'{path}.{name}' assert cur['object_type'] == 'RETURNED', f'{path}.{name}' assert root['objects'][cur['defined_by_module']]['object_type'] == 'MODULE', f'{path}.{name}' assert name in root['objects_by_type']['modules'][cur['defined_by_module']], f'{path}.{name}' return assert cur['object_type'] in {'ELEMENTARY', 'BUILTIN', 'MODULE', 'RETURNED'}, f'{path}.{name}' if cur['object_type'] == 'ELEMENTARY': assert name in root['objects_by_type']['elementary'], f'{path}.{name}' if cur['object_type'] == 'BUILTIN': assert name in root['objects_by_type']['builtins'], f'{path}.{name}' if cur['object_type'] == 'RETURNED': assert name in root['objects_by_type']['returned'], f'{path}.{name}' if cur['object_type'] == 'MODULE': assert name in root['objects_by_type']['modules'], f'{path}.{name}' def main() -> int: global root parser = argparse.ArgumentParser(description='Meson JSON docs validator') parser.add_argument('doc_file', type=Path, help='The JSON docs to validate') args = parser.parse_args() root_tmp = json.loads(args.doc_file.read_text(encoding='utf-8')) root = deepcopy(root_tmp) assert isinstance(root, dict) expected: T.Dict[str, T.Any] = { 'version_major': int, 'version_minor': int, 'meson_version': str, 'functions': dict, 'objects': dict, 'objects_by_type': dict, } cur = assert_has_typed_keys('root', root_tmp, expected) assert not root_tmp, f'root has extra keys: {root_tmp.keys()}' refs = cur['objects_by_type'] expected = { 'elementary': list, 'builtins': list, 'returned': list, 'modules': dict, } assert_has_typed_keys(f'root.objects_by_type', refs, expected) assert not refs, f'root.objects_by_type has extra keys: {refs.keys()}' assert all(isinstance(x, str) for x in root['objects_by_type']['elementary']) assert all(isinstance(x, str) for x in root['objects_by_type']['builtins']) assert all(isinstance(x, str) for x in root['objects_by_type']['returned']) assert all(isinstance(x, str) for x in root['objects_by_type']['modules']) assert all(x in root['objects'] for x in root['objects_by_type']['elementary']) assert all(x in root['objects'] for x in root['objects_by_type']['builtins']) assert all(x in root['objects'] for x in root['objects_by_type']['returned']) assert all(x in root['objects'] for x in root['objects_by_type']['modules']) assert all(root['objects'][x]['object_type'] == 'ELEMENTARY' for x in root['objects_by_type']['elementary']) assert all(root['objects'][x]['object_type'] == 'BUILTIN' for x in root['objects_by_type']['builtins']) assert all(root['objects'][x]['object_type'] == 'RETURNED' for x in root['objects_by_type']['returned']) assert all(root['objects'][x]['object_type'] == 'MODULE' for x in root['objects_by_type']['modules']) # Check that module references are correct assert all(all(isinstance(x, str) for x in v) for k, v in root['objects_by_type']['modules'].items()) assert all(all(x in root['objects'] for x in v) for k, v in root['objects_by_type']['modules'].items()) assert all(all(root['objects'][x]['defined_by_module'] == k for x in v) for k, v in root['objects_by_type']['modules'].items()) for key, val in cur['functions'].items(): validate_function('root', key, val) for key, val in cur['objects'].items(): validate_object('root', key, val) return 0 if __name__ == '__main__': raise SystemExit(main()) muon-v0.4.0/subprojects/meson-docs/docs/.editorconfig0000644000175000017500000000004114737503617021666 0ustar buildbuild[sitemap.txt] indent_style = tab muon-v0.4.0/subprojects/meson-docs/docs/markdown/0002755000175000017500000000000014737503617021042 5ustar buildbuildmuon-v0.4.0/subprojects/meson-docs/docs/markdown/Release-notes-for-0.44.0.md0000644000175000017500000001126414737503617025401 0ustar buildbuild--- title: Release 0.44 short-description: Release notes for 0.44 ... # New features ## Added warning function This function prints its argument to the console prefixed by "WARNING:" in yellow color. A simple example: warning('foo is deprecated, please use bar instead') ## Adds support for additional Qt5-Module keyword `moc_extra_arguments` When `moc`-ing sources, the `moc` tool does not know about any preprocessor macros. The generated code might not match the input files when the linking with the moc input sources happens. This amendment allows to specify a a list of additional arguments passed to the `moc` tool. They are called `moc_extra_arguments`. ## Prefix-dependent defaults for sysconfdir, localstatedir and sharedstatedir These options now default in a way consistent with [FHS](http://refspecs.linuxfoundation.org/fhs.shtml) and common usage. If prefix is `/usr`, default sysconfdir to `/etc`, localstatedir to `/var` and sharedstatedir to `/var/lib`. If prefix is `/usr/local` (the default), default localstatedir to `/var/local` and sharedstatedir to `/var/local/lib`. ## An array type for user options Previously to have an option that took more than one value a string value would have to be created and split, but validating this was difficult. A new array type has been added to the `meson_options.txt` for this case. It works like a 'combo', but allows more than one option to be passed. The values can optionally be validated against a list of valid values. When used on the command line (with -D), values are passed as a comma separated list. ```meson option('array_opt', type : 'array', choices : ['one', 'two', 'three'], value : ['one']) ``` These can be overwritten on the command line, ```meson meson _build -Darray_opt=two,three ``` ## LLVM dependency supports both dynamic and static linking The LLVM dependency has been improved to consistently use dynamic linking. Previously recent version (>= 3.9) would link dynamically while older versions would link statically. Now LLVM also accepts the `static` keyword to enable statically linking to LLVM modules instead of dynamically linking. ## Added `if_found` to subdir Added a new keyword argument to the `subdir` command. It is given a list of dependency objects and the function will only recurse in the subdirectory if they are all found. Typical usage goes like this. ```meson d1 = dependency('foo') # This is found d2 = dependency('bar') # This is not found subdir('somedir', if_found : [d1, d2]) ``` In this case the subdirectory would not be entered since `d2` could not be found. ## `get_unquoted()` method for the `configuration` data object New convenience method that allows reusing a variable value defined quoted. Useful in C for config.h strings for example. ## Added disabler object A disabler object is a new kind of object that has very specific semantics. If it is used as part of any other operation such as an argument to a function call, logical operations etc, it will cause the operation to not be evaluated. Instead the return value of said operation will also be the disabler object. For example if you have an setup like this: ```meson dep = dependency('foo') lib = shared_library('mylib', 'mylib.c', dependencies : dep) exe = executable('mytest', 'mytest.c', link_with : lib) test('mytest', exe) ``` If you replace the dependency with a disabler object like this: ```meson dep = disabler() lib = shared_library('mylib', 'mylib.c', dependencies : dep) exe = executable('mytest', 'mytest.c', link_with : lib) test('mytest', exe) ``` Then the shared library, executable and unit test are not created. This is a handy mechanism to cut down on the number of `if` statements. ## Config-Tool based dependencies gained a method to get arbitrary options A number of dependencies (CUPS, LLVM, pcap, WxWidgets, GnuStep) use a config tool instead of pkg-config. As of this version they now have a `get_configtool_variable` method, which is analogous to the `get_pkgconfig_variable` for pkg config. ```meson dep_llvm = dependency('LLVM') llvm_inc_dir = dep_llvm.get_configtool_variable('includedir') ``` ## Embedded Python in Windows MSI packages Meson now ships an internal version of Python in the MSI installer packages. This means that it can run Python scripts that are part of your build transparently. That is, if you do the following: ```meson myprog = find_program('myscript.py') ``` Then Meson will run the script with its internal Python version if necessary. ## Libwmf dependency now supports libwmf-config Earlier, `dependency('libwmf')` could only detect the library with pkg-config files. Now, if pkg-config files are not found, Meson will look for `libwmf-config` and if it's found, will use that to find the library. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Tutorial.md0000644000175000017500000001322214737503617023165 0ustar buildbuild--- short-description: Simplest tutorial ... # Tutorial This page shows from the ground up how to create a Meson build definition for a simple project. Then we expand it to use external dependencies to show how easily they can be integrated into your project. This tutorial has been written mostly for Linux usage. It assumes that you have GTK development libraries available on the system. On Debian-derived systems such as Ubuntu they can be installed with the following command: ``` sudo apt install libgtk-3-dev ``` In addition, it is recommended to have the glib library with version 2.74 or higher. It is possible to build the GUI application on other platforms, such as Windows and macOS, but you need to install the needed dependencies. The humble beginning ----- Let's start with the most basic of programs, the classic hello example. First we create a file `main.c` which holds the source. It looks like this. ```c #include // // main is where all program execution starts // int main(int argc, char **argv) { printf("Hello there.\n"); return 0; } ``` Then we create a Meson build description and put it in a file called `meson.build` in the same directory. Its contents are the following. ```meson project('tutorial', 'c') executable('demo', 'main.c') ``` That is all. Note that unlike Autotools you [do not need to add any source headers to the list of sources](FAQ.md#do-i-need-to-add-my-headers-to-the-sources-list-like-in-autotools). We are now ready to build our application. First we need to initialize the build by going into the source directory and issuing the following commands. ```console $ meson setup builddir ``` We create a separate build directory to hold all of the compiler output. Meson is different from some other build systems in that it does not permit in-source builds. You must always create a separate build directory. Common convention is to put the default build directory in a subdirectory of your top level source directory. When Meson is run it prints the following output. The Meson build system version: 0.13.0-research Source dir: /home/jpakkane/mesontutorial Build dir: /home/jpakkane/mesontutorial/builddir Build type: native build Project name is "tutorial". Using native c compiler "ccache cc". (gcc 4.8.2) Creating build target "demo" with 1 files. Now we are ready to build our code. ```console $ cd builddir $ ninja ``` If your Meson version is newer than 0.55.0, you can use the new backend-agnostic build command: ```console $ cd builddir $ meson compile ``` For the rest of this document we are going to use the latter form. Once the executable is built we can run it. ```console $ ./demo ``` This produces the expected output. Hello there. Adding dependencies ----- Just printing text is a bit old fashioned. Let's update our program to create a graphical window instead. We'll use the [GTK+](https://gtk.org) widget toolkit. First we edit the main file to use GTK+. The new version looks like this. ```c #include // // Should provided the active view for a GTK application // static void activate(GtkApplication* app, gpointer user_data) { GtkWidget *window; GtkWidget *label; window = gtk_application_window_new (app); label = gtk_label_new("Hello GNOME!"); gtk_container_add (GTK_CONTAINER (window), label); gtk_window_set_title(GTK_WINDOW (window), "Welcome to GNOME"); gtk_window_set_default_size(GTK_WINDOW (window), 400, 200); gtk_widget_show_all(window); } // end of function activate // // main is where all program execution starts // int main(int argc, char **argv) { GtkApplication *app; int status; app = gtk_application_new(NULL, G_APPLICATION_DEFAULT_FLAGS); g_signal_connect(app, "activate", G_CALLBACK(activate), NULL); status = g_application_run(G_APPLICATION(app), argc, argv); g_object_unref(app); return status; } // end of function main ``` Then we edit the Meson file, instructing it to find and use the GTK+ libraries. ```meson project('tutorial', 'c') gtkdep = dependency('gtk+-3.0') executable('demo', 'main.c', dependencies : gtkdep) ``` If your app needs to use multiple libraries, you need to use separate [[dependency]] calls for each, like so: ```meson gtkdeps = [dependency('gtk+-3.0'), dependency('gtksourceview-3.0')] ``` We don't need it for the current example. Now we are ready to build. The thing to notice is that we do *not* need to recreate our build directory, run any sort of magical commands or the like. Instead we just type the exact same command as if we were rebuilding our code without any build system changes. ```console $ meson compile ``` Once you have set up your build directory the first time, you don't ever need to run the `meson` command again. You always just run `meson compile`. Meson will automatically detect when you have done changes to build definitions and will take care of everything so users don't have to care. In this case the following output is produced. [1/1] Regenerating build files The Meson build system version: 0.13.0-research Source dir: /home/jpakkane/mesontutorial Build dir: /home/jpakkane/mesontutorial/builddir Build type: native build Project name is "tutorial". Using native c compiler "ccache cc". (gcc 4.8.2) Found pkg-config version 0.26. Dependency gtk+-3.0 found: YES Creating build target "demo" with 1 files. [1/2] Compiling c object demo.dir/main.c.o [2/2] Linking target demo Note how Meson noticed that the build definition has changed and reran itself automatically. The program is now ready to be run: ``` $ ./demo ``` This creates the following GUI application. ![GTK+ sample application screenshot](images/gtksample.png) muon-v0.4.0/subprojects/meson-docs/docs/markdown/Include-directories.md0000644000175000017500000000173414737503617025264 0ustar buildbuild--- short-description: Instructions on handling include directories ... # Include directories Most `C`/`C++` projects have headers in different directories than sources. Thus you need to specify include directories. Let's assume that we are at some subdirectory and wish to add its `include` subdirectory to some target's search path. To create a include directory object we do this: ```meson incdir = include_directories('include') ``` The `incdir` variable now holds a reference to the `include` subdir. Now we pass that as an argument to a build target: ```meson executable('someprog', 'someprog.c', include_directories : incdir) ``` Note that these two commands can be given in any subdirectories and it will still work. Meson will keep track of the locations and generate proper compiler flags to make it all work. Another thing to note is that `include_directories` adds both the source directory and corresponding build directory to include path, so you don't have to care. muon-v0.4.0/subprojects/meson-docs/docs/markdown/GuiTutorial.md0000644000175000017500000001344414737503617023640 0ustar buildbuild--- short-description: A simple GUI tutorial ... # Building a simple SDL2 app from scratch This page shows from the ground up how to define and build an SDL2 gui application using nothing but Meson. The document is written for Windows, as it is the most complex platform, but the same basic ideas should work on Linux and macOS as well. The sample application is written in plain C as SDL 2 is also written in C. If you prefer C++ instead, the conversion is fairly simple and is left as an exercise to the reader. This document assumes that you have already installed both Visual Studio and Meson. # Set up the build directory First you need to create an empty directory for all your stuff. The Visual Studio toolchain is a bit unusual in that it requires you to run your builds from a specific shell. This can be found by opening the application menu and then choosing `Visual Studio -> x86_64 native tools command prompt`. It will put you in a weird directory, so you need to go to your home directory: cd \users\yourusername Typically you'd type `cd \users\` and then press the tabulator key to make the shell autocomplete the username. Once that is done you can create the directory. mkdir sdldemo cd sdldemo # Creating the sample program Now we need to create a source file and a Meson build definition file. We're not going to use SDL at all, but instead start with a simple program that only prints some text. Once we have it working we can extend it to do graphics. The source goes into a file `sdlprog.c` and has the following contents: ```c #include int main(int argc, char **argv) { printf("App is running.\n"); return 0; } ``` The build definition goes to a file called `meson.build` and looks like this: ```meson project('sdldemo', 'c') executable('sdlprog', 'sdlprog.c') ``` With this done we can start the build with the following command: meson setup builddir Here `builddir` is the _build directory_, everything that is generated during the build is put in that directory. When run, it should look like this. ![Configuring the sample application](images/sdltutorial_01.png) The program is compiled with this: meson compile -C builddir The `-C` argument tells Meson where the configured build directory is. The program will be in the build directory and can be run like this: builddir\sdlprog The output should look like this. ![Running the sample application](images/sdltutorial_02.png) # Upgrading the program to use SDL The code needed to start SDL is a bit more complicated and we're not going to go into how it works. Merely replace the contents of `sdlprog.c` with the following: ```c #include "SDL.h" int main(int argc, char *argv[]) { SDL_Window *window; SDL_Renderer *renderer; SDL_Surface *surface; SDL_Event event; if (SDL_Init(SDL_INIT_VIDEO) < 0) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s", SDL_GetError()); return 3; } if (SDL_CreateWindowAndRenderer(320, 240, SDL_WINDOW_RESIZABLE, &window, &renderer)) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create window and renderer: %s", SDL_GetError()); return 3; } while (1) { SDL_PollEvent(&event); if (event.type == SDL_QUIT) { break; } SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0x00); SDL_RenderClear(renderer); SDL_RenderPresent(renderer); } SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); SDL_Quit(); return 0; } ``` Let's try to compile this by running `meson compile -C builddir` again. ![Building SDL app fails](images/sdltutorial_03.png) That fails. The reason for this is that we don't actually have SDL currently available. We need to obtain it somehow. In more technical terms SDL2 is an _external dependency_ and obtaining it is called _dependency resolution_. Meson has a web service for downloading and building (if needed) dependencies called a WrapDB. It provides SDL2 so we can use it directly. First we need to create a `subprojects` directory because in Meson all subprojects like these must be stored in that directory for consistency. mkdir subprojects Then we can install the dependency: meson wrap install sdl2 It looks like this: ![Obtaining SDL2 from WrapDB](images/sdltutorial_04.png) As a final step we need to update our build definition file to use the newly obtained dependency. ```meson project('sdldemo', 'c', default_options: 'default_library=static') sdl2_dep = dependency('sdl2') executable('sdlprog', 'sdlprog.c', win_subsystem: 'windows', dependencies: sdl2_dep) ``` **NOTE:** If you're on Windows you need to include the sdl2main dependency as well; To do so you can modify the above build script like so: ```meson project('sdldemo', 'c', default_options: 'default_library=static') sdl2_dep = dependency('sdl2') sdl2_main_dep = dependency('sdl2main') executable('sdlprog', 'sdlprog.c', win_subsystem: 'windows', dependencies: [sdl2_dep, sdl2_main_dep]) ``` In addition to the dependency this has a few other changes. First we specify that we want to build helper libraries statically. For simple projects like these it makes things simpler. We also need to tell Meson that the program we are building is a Windows GUI application rather than a console application. This is all we need to do and can now run `meson compile` again. First the system downloads and configures SDL2: ![Running the sample application](images/sdltutorial_05.png) A bit later the compilation exits successfully. ![Running the sample application](images/sdltutorial_06.png) # Program is done Now we can run the application with builddir\sdlprog The end result is a black SDL window. ![Running the sample application](images/sdltutorial_07.png) muon-v0.4.0/subprojects/meson-docs/docs/markdown/Contact-information.md0000644000175000017500000000104614737503617025301 0ustar buildbuild# Contact information For general discussion and questions, it is strongly recommended that you use the [mailing list](https://groups.google.com/forum/#!forum/mesonbuild). If you find bugs, please file them in the [issue tracker](https://github.com/jpakkane/meson/issues). The maintainer of Meson is Jussi Pakkanen. You should usually not contact him privately but rather use the channels listed above. However if such a need arises, he can be reached at gmail where his username is `jpakkane` (that is not a typo, the last letter is indeed *e*). muon-v0.4.0/subprojects/meson-docs/docs/markdown/Icestorm-module.md0000644000175000017500000000167414737503617024442 0ustar buildbuild# Unstable IceStorm module This module is available since version 0.45.0. **Note**: this module is unstable. It is only provided as a technology preview. Its API may change in arbitrary ways between releases or it might be removed from Meson altogether. ## Usage This module provides an experimental method to create FPGA bitstreams using the [IceStorm](http://www.clifford.at/icestorm/) suite of tools. The module exposes only one method called `project` and it is used like this: is.project('projname', , constraint_file : , ) The input to this function is the set of Verilog files and a constraint file. This produces output files called `projname.asc`, `projname.blif` and `projname.bin`. In addition it creates two run targets called `projname-time` for running timing analysis and `projname-upload` that uploads the generated bitstream to an FPGA device using the `iceprog` programming executable. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Installing.md0000644000175000017500000001706214737503617023474 0ustar buildbuild--- short-description: Installing targets ... # Installing Invoked via the [following command](Commands.md#install) *(available since 0.47.0)*: ```sh meson install ``` or alternatively (on older Meson versions with `ninja` backend): ```sh ninja install ``` By default Meson will not install anything. Build targets can be installed by tagging them as installable in the definition. ```meson project('install', 'c') shared_library('mylib', 'libfile.c', install : true) ``` There is usually no need to specify install paths or the like. Meson will automatically install it to the standards-conforming location. In this particular case the executable is installed to the `bin` subdirectory of the install prefix. However if you wish to override the install dir, you can do that with the `install_dir` argument. ```meson executable('prog', 'prog.c', install : true, install_dir : 'my/special/dir') ``` Other install commands are the following. ```meson install_headers('header.h', subdir : 'projname') # -> include/projname/header.h install_man('foo.1') # -> share/man/man1/foo.1 install_data('datafile.dat', install_dir : get_option('datadir') / 'progname') # -> share/progname/datafile.dat ``` `install_data()` supports rename of the file *since 0.46.0*. ```meson # file.txt -> {datadir}/{projectname}/new-name.txt install_data('file.txt', rename : 'new-name.txt') # file1.txt -> share/myapp/dir1/data.txt # file2.txt -> share/myapp/dir2/data.txt install_data(['file1.txt', 'file2.txt'], rename : ['dir1/data.txt', 'dir2/data.txt'], install_dir : 'share/myapp') ``` Sometimes you want to copy an entire subtree directly. For this use case there is the `install_subdir` command, which can be used like this. ```meson install_subdir('mydir', install_dir : 'include') # mydir subtree -> include/mydir ``` Most of the time you want to install files relative to the install prefix. Sometimes you need to go outside of the prefix (such as writing files to `/etc` instead of `/usr/etc`. This can be accomplished by giving an absolute install path. ```meson install_data(sources : 'foo.dat', install_dir : '/etc') # -> /etc/foo.dat ``` ## Custom install script Sometimes you need to do more than just install basic targets. Meson makes this easy by allowing you to specify a custom script to execute at install time. As an example, here is a script that generates an empty file in a custom directory. ```bash #!/bin/sh mkdir "${DESTDIR}/${MESON_INSTALL_PREFIX}/mydir" touch "${DESTDIR}/${MESON_INSTALL_PREFIX}/mydir/file.dat" ``` As you can see, Meson sets up some environment variables to help you write your script (`DESTDIR` is not set by Meson, it is inherited from the outside environment). In addition to the install prefix, Meson also sets the variables `MESON_SOURCE_ROOT` and `MESON_BUILD_ROOT`. Telling Meson to run this script at install time is a one-liner. ```meson [[#meson.add_install_script]]('myscript.sh') ``` The argument is the name of the script file relative to the current subdirectory. ## Installing as the superuser When building as a non-root user, but installing to root-owned locations via e.g. `sudo ninja install`, ninja will attempt to rebuild any out of date targets as root. This results in various bad behaviors due to build outputs and ninja internal files being owned by root. Running `meson install` is preferred for several reasons. It can rebuild out of date targets and then re-invoke itself as root. *(since 1.1.0)* Additionally, running `sudo meson install` will drop permissions and rebuild out of date targets as the original user, not as root. *(since 1.1.0)* Re-invoking as root will try to guess the user's preferred method for re-running commands as root. The order of precedence is: sudo, doas, pkexec (polkit). An elevation tool can be forced by setting `$MESON_ROOT_CMD`. ## DESTDIR support Sometimes you need to install to a different directory than the install prefix. This is most common when building rpm or deb packages. This is done with the `DESTDIR` environment variable and it is used just like with other build systems: ```console $ DESTDIR=/path/to/staging/area meson install ``` Since *0.57.0* `--destdir` argument can be used instead of environment. In that case Meson will set `DESTDIR` into environment when running install scripts. Since *0.60.0* `DESTDIR` and `--destdir` can be a path relative to build directory. An absolute path will be set into environment when executing scripts. ## Custom install behaviour Installation behaviour can be further customized using additional arguments. For example, if you wish to install the current setup without rebuilding the code (which the default install target always does) and only installing those files that have changed, you would run this command in the build tree: ```console $ meson install --no-rebuild --only-changed ``` ## Installation tags *Since 0.60.0* It is possible to install only a subset of the installable files using `meson install --tags tag1,tag2` command line. When `--tags` is specified, only files that have been tagged with one of the tags are going to be installed. This is intended to be used by packagers (e.g. distributions) who typically want to split `libfoo`, `libfoo-dev` and `libfoo-doc` packages. Instead of duplicating the list of installed files per category in each packaging system, it can be maintained in a single place, directly in upstream `meson.build` files. Meson sets predefined tags on some files. More tags are likely to be added over time, please help extending the list of well known categories. - `devel`: * [[static_library]], * [[install_headers]], * `pkgconfig.generate()`, * `gnome.generate_gir()` - `.gir` file, * `gnome.generate_vapi()` - `.vapi` file (*Since 0.64.0*), * Files installed into `libdir` and with `.a` or `.pc` extension, * File installed into `includedir`, * Generated header files installed with `gnome.compile_resources()`, `gnome.genmarshal()`, `gnome.mkenums()`, `gnome.mkenums_simple()` and `gnome.gdbus_codegen()` (*Since 0.64.0*). - `runtime`: * [[executable]], * [[shared_library]], * [[shared_module]], * [[jar]], * `gnome.compile_resources()` - `.gresource` file (*Since 0.64.0*), * Files installed into `bindir`, * Files installed into `libdir` and with `.so` or `.dll` extension. - `python-runtime`: * `python.install_sources()`. - `man`: * [[install_man]]. - `doc`: * `gnome.gtkdoc()`, * `gnome.yelp()`, * `hotdoc.generate_doc()`. - `i18n`: * `i18n.gettext()`, * `qt.compile_translations()`, * Files installed into `localedir`. - `typelib`: * `gnome.generate_gir()` - `.typelib` file. - `bin`: * Scripts and executables bundled with a library meant to be used by end users. - `bin-devel`: * Scripts and executables bundled with a library meant to be used by developers (i.e. build tools). - `tests`: * Files installed into `installed-tests` subdir (*Since 0.64.0*). - `systemtap`: * Files installed into `systemtap` subdir (*Since 0.64.0*). Custom installation tag can be set using the `install_tag` keyword argument on various functions such as [[custom_target]], [[configure_file]], [[install_subdir]] and [[install_data]]. See their respective documentation in the reference manual for details. It is recommended to use one of the predefined tags above when possible. Installable files that have not been tagged either automatically by Meson, or manually using `install_tag` keyword argument won't be installed when `--tags` is used. They are reported at the end of `/meson-logs/meson-log.txt`, it is recommended to add missing `install_tag` to have a tag on each installable files. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Adding-arguments.md0000644000175000017500000000430614737503617024556 0ustar buildbuild--- short-description: Adding compiler arguments ... # Adding arguments Often you need to specify extra compiler arguments. Meson provides two different ways to achieve this: global arguments and per-target arguments. Global arguments -- Global compiler arguments are set with the following command. As an example you could do this. ```meson add_global_arguments('-DFOO=bar', language : 'c') ``` This makes Meson add the define to all C compilations. Usually you would use this setting for flags for global settings. Note that for setting the C/C++ language standard (the `-std=c99` argument in GCC), you would probably want to use a default option of the [[project]] function. For details see the [reference manual](Reference-manual.md). Global arguments have certain limitations. They all have to be defined before any build targets are specified. This ensures that the global flags are the same for every single source file built in the entire project with one exception. Compilation tests that are run as part of your project configuration do not use these flags. The reason for that is that you may need to run a test compile with and without a given flag to determine your build setup. For this reason tests do not use these global arguments. You should set only the most essential flags with this setting, you should *not* set debug or optimization flags. Instead they should be specified by selecting an appropriate build type. Project arguments -- Project arguments work similar to global arguments except that they are valid only within the current subproject. The usage is simple: ```meson add_project_arguments('-DMYPROJ=projname', language : 'c') ``` This would add the compiler flags to all C sources in the current project. Per target arguments -- Per target arguments are just as simple to define. ```meson executable('prog', 'prog.cc', cpp_args : '-DCPPTHING') ``` Here we create a C++ executable with an extra argument that is used during compilation but not for linking. You can find the parameter name for other languages in the [reference tables](Reference-tables.md). Specifying extra linker arguments is done in the same way: ```meson executable('prog', 'prog.cc', link_args : '-Wl,--linker-option') ``` muon-v0.4.0/subprojects/meson-docs/docs/markdown/Vs-External.md0000644000175000017500000000427314737503617023540 0ustar buildbuild# Visual Studio's external build projects Visual Studio supports developing projects that have an external build system. If you wish to use this integration method, here is how you set it up. This documentation describes Visual Studio 2019. Other versions have not been tested, but they should work roughly in the same way. ## Creating and compiling Check out your entire project in some directory. Then open Visual Studio and select `File -> New -> Project` and from the list of project types select `Makefile project`. Click `Next`. Type your project's name In the `Project name` entry box. In this example we're going to use `testproj`. Next select the `Location` entry and browse to the root of your project sources. Make sure that the checkbox `Place solution and project in the same directory` is checked. Click `Create`. The next dialog page defines build commands, which you should set up as follows: | entry | value | | ----- | ----- | |build | `meson compile -C $(Configuration)` | |clean | `meson compile -C $(Configuration) --clean` | |rebuild| `meson compile -C $(Configuration) --clean && meson compile -C $(Configuration)` | |Output | `$(Configuration)\name_of_your_executable.exe` | Then click `Finish`. Visual Studio has created a subdirectory in your source root. It is named after the project name. In this case it would be `testproj`. Now you need to set up Meson for building both Debug and Release versions in this directory. Open a VS dev tool terminal, go to the source root and issue the following commands. ``` meson testproj\Debug meson testproj\Release --buildtype=debugoptimized ``` Now you should have a working VS solution that compiles and runs both in Debug and Release modes. ## Adding sources to the project This project is not very useful on its own, because it does not list any source files. VS does not seem to support adding entire source trees at once, so you have to add sources to the solution manually. In the main view go to `Solution Explorer`, right click on the project you just created and select `Add -> Existing Item`, browse to your source tree and select all files you want to have in this project. Now you can use the editor and debugger as in a normal VS project. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Meson-sample.md0000644000175000017500000000461414737503617023727 0ustar buildbuild--- short-description: Simple project step by step explanation ... # Meson sample A Meson file that builds an executable looks like this. ```meson project('simple', 'c') executable('myexe', 'source.c') ``` All Meson build definitions begin with the `project` command. It specifies the name of the project and what programming languages it uses. Here the project is called *simple* and it uses only the C programming language. All strings are single-quoted. On the next line we define a *build target*, in this case an executable called *myexe*. It consists of one source file. This is all the code that a user needs to write to compile an executable with Meson. Variables are fully supported. The above code snippet could also have been declared like this. ```meson project('simple', 'c') src = 'source.c' executable('myexe', src) ``` Most executables consist of more than one source file. The easiest way to deal with this is to put them in an array. ```meson project('simple', 'c') src = ['source1.c', 'source2.c', 'source3.c'] executable('myexe', src) ``` Meson also supports the notion of *keyword arguments*. Indeed most arguments to functions can only be passed using them. The above snippet could be rewritten like this. ```meson project('simple', 'c') src = ['source1.c', 'source2.c', 'source3.c'] executable('myexe', sources : src) ``` These two formats are equivalent and choosing one over the other is mostly a question of personal preference. The `executable` command actually returns an *executable object*, which represents the given build target. It can be passed on to other functions, like this. ```meson project('simple', 'c') src = ['source1.c', 'source2.c', 'source3.c'] exe = executable('myexe', src) test('simple test', exe) ``` Here we create a unit test called *simple test*, and which uses the built executable. When the tests are run with the `meson test` command, the built executable is run. If it returns zero, the test passes. A non-zero return value indicates an error, which Meson will then report to the user. A note to Visual Studio users ----- There's a slight terminology difference between Meson and Visual Studio. A Meson *project* is the equivalent to a Visual Studio *solution*. That is, the topmost thing that encompasses all things to be built. A Visual Studio *project* on the other hand is the equivalent of a Meson top level build target, such as an executable or a shared library. muon-v0.4.0/subprojects/meson-docs/docs/markdown/_include_qt_base.md0000644000175000017500000002116614737503617024650 0ustar buildbuild## compile_resources *New in 0.59.0* Compiles Qt's resources collection files (.qrc) into c++ files for compilation. It takes no positional arguments, and the following keyword arguments: - `name` (string | empty): if provided a single .cpp file will be generated, and the output of all qrc files will be combined in this file, otherwise each qrc file be written to its own cpp file. - `sources` (File | string | custom_target | custom_target index | generator_output)[]: A list of sources to be transpiled. Required, must have at least one source *New in 0.60.0*: support for custom_target, custom_target_index, and generator_output. - `extra_args` string[]: Extra arguments to pass directly to `qt-rcc` - `method` string: The method to use to detect Qt, see `dependency()` for more information. ## compile_ui *New in 0.59.0* Compiles Qt's ui files (.ui) into header files. It takes no positional arguments, and the following keyword arguments: - `sources` (File | string | custom_target | custom_target index | generator_output)[]: A list of sources to be transpiled. Required, must have at least one source *New in 0.60.0*: support for custom_target, custom_target_index, and generator_output. - `extra_args` string[]: Extra arguments to pass directly to `qt-uic` - `method` string: The method to use to detect Qt, see `dependency()` for more information. - `preserve_paths` bool: *Since 1.4.0*. If `true`, specifies that the output files need to maintain their directory structure inside the target temporary directory. For instance, when a file called `subdir/one.input` is processed it generates a file `{target private directory}/subdir/one.out` when `true`, and `{target private directory}/one.out` when `false` (default). ## compile_moc *New in 0.59.0* Compiles Qt's moc files (.moc) into header and/or source files. At least one of the keyword arguments `headers` and `sources` must be provided. It takes no positional arguments, and the following keyword arguments: - `sources` (File | string | custom_target | custom_target index | generator_output)[]: A list of sources to be transpiled into .moc files for manual inclusion. *New in 0.60.0*: support for custom_target, custom_target_index, and generator_output. - `headers` (File | string | custom_target | custom_target index | generator_output)[]: A list of headers to be transpiled into .cpp files *New in 0.60.0*: support for custom_target, custom_target_index, and generator_output. - `extra_args` string[]: Extra arguments to pass directly to `qt-moc` - `method` string: The method to use to detect Qt, see `dependency()` for more information. - `dependencies`: dependency objects whose include directories are used by moc. - `include_directories` (string | IncludeDirectory)[]: A list of `include_directory()` objects used when transpiling the .moc files - `preserve_paths` bool: *New in 1.4.0*. If `true`, specifies that the output files need to maintain their directory structure inside the target temporary directory. For instance, when a file called `subdir/one.input` is processed it generates a file `{target private directory}/subdir/one.out` when `true`, and `{target private directory}/one.out` when `false` (default). ## preprocess Consider using `compile_resources`, `compile_ui`, and `compile_moc` instead. Takes sources for moc, uic, and rcc, and converts them into c++ files for compilation. Has the following signature: `qt.preprocess(name: str | None, *sources: str)` If the `name` parameter is passed then all of the rcc files will be written to a single output file The variadic `sources` arguments have been deprecated since Meson 0.59.0, as has the `sources` keyword argument. These passed files unmodified through the preprocessor, don't do this, just add the output of the generator to another sources list: ```meson sources = files('a.cpp', 'main.cpp', 'bar.c') sources += qt.preprocess(qresources : ['resources']) ``` This method takes the following keyword arguments: - `qresources` (string | File)[]: Passed to the RCC compiler - `ui_files`: (string | File | CustomTarget)[]: Passed the `uic` compiler - `moc_sources`: (string | File | CustomTarget)[]: Passed the `moc` compiler. These are converted into .moc files meant to be `#include`ed - `moc_headers`: (string | File | CustomTarget)[]: Passed the `moc` compiler. These will be converted into .cpp files - `include_directories` (IncludeDirectories | string)[], the directories to add to header search path for `moc` - `moc_extra_arguments` string[]: any additional arguments to `moc`. Since v0.44.0. - `uic_extra_arguments` string[]: any additional arguments to `uic`. Since v0.49.0. - `rcc_extra_arguments` string[]: any additional arguments to `rcc`. Since v0.49.0. - `dependencies` Dependency[]: dependency objects needed by moc. Available since v0.48.0. - `sources`: a list of extra sources, which are added to the output unchanged. Deprecated in 0.59.0. - `preserve_paths` bool: *New in 1.4.0*. If `true`, specifies that the output files need to maintain their directory structure inside the target temporary directory. For instance, when a file called `subdir/one.input` is processed it generates a file `{target private directory}/subdir/one.out` when `true`, and `{target private directory}/one.out` when `false` (default). It returns an array of targets and sources to pass to a compilation target. ## compile_translations *since 0.44.0* This method generates the necessary targets to build translation files with lrelease, it takes no positional arguments, and the following keyword arguments: - `ts_files` (File | string | custom_target | custom_target index | generator_output)[]: the list of input translation files produced by Qt's lupdate tool. *New in 0.60.0*: support for custom_target, custom_target_index, and generator_output. - `install` bool: when true, this target is installed during the install step (optional). - `install_dir` string: directory to install to (optional). - `build_by_default` bool: when set to true, to have this target be built by default, that is, when invoking `meson compile`; the default value is false (optional). - `qresource` string: rcc source file to extract ts_files from; cannot be used with ts_files kwarg. Available since v0.56.0. - `rcc_extra_arguments` string[]: any additional arguments to `rcc` (optional), when used with `qresource. Available since v0.56.0. Returns either: a list of custom targets for the compiled translations, or, if using a `qresource` file, a single custom target containing the processed source file, which should be passed to a main build target. ## has_tools *since 0.54.0* This method returns `true` if all tools used by this module are found, `false` otherwise. It should be used to compile optional Qt code: ```meson qt5 = import('qt5') if qt5.has_tools(required: get_option('qt_feature')) moc_files = qt5.preprocess(...) ... endif ``` This method takes the following keyword arguments: - `required` bool | FeatureOption: by default, `required` is set to `false`. If `required` is set to `true` or an enabled [`feature`](Build-options.md#features) and some tools are missing Meson will abort. - `method` string: method used to find the Qt dependency (`auto` by default). ## Dependencies See [Qt dependencies](Dependencies.md#qt) The 'modules' argument is used to include Qt modules in the project. See the Qt documentation for the [list of modules](http://doc.qt.io/qt-5/qtmodules.html). The 'private_headers' argument allows usage of Qt's modules private headers. (since v0.47.0) ## Example A simple example would look like this: ```meson qt5 = import('qt5') qt5_dep = dependency('qt5', modules: ['Core', 'Gui']) inc = include_directories('includes') moc_files = qt5.compile_moc(headers : 'myclass.h', extra_args: ['-DMAKES_MY_MOC_HEADER_COMPILE'], include_directories: inc, dependencies: qt5_dep) translations = qt5.compile_translations(ts_files : 'myTranslation_fr.ts', build_by_default : true) executable('myprog', 'main.cpp', 'myclass.cpp', moc_files, include_directories: inc, dependencies : qt5_dep) ``` Sometimes, translations are embedded inside the binary using qresource files. In this case the ts files do not need to be explicitly listed, but will be inferred from the built qm files listed in the qresource file. For example: ```meson qt5 = import('qt5') qt5_dep = dependency('qt5', modules: ['Core', 'Gui']) lang_cpp = qt5.compile_translations(qresource: 'lang.qrc') executable('myprog', 'main.cpp', lang_cpp, dependencies: qt5_dep) ``` muon-v0.4.0/subprojects/meson-docs/docs/markdown/Getting-meson.md0000644000175000017500000001110414737503617024077 0ustar buildbuild# Getting Meson Meson is implemented in Python 3, and requires 3.7 or newer. If your operating system provides a package manager, you should install it with that. For platforms that don't have a package manager, you need to download it from [Python's home page]. See below for [platform-specific Python3 quirks](#platformspecific-install-quirks). ## Downloading Meson Meson releases can be downloaded from the [GitHub release page], and you can run `./meson.py` from inside a release or the git repository itself without doing anything special. On Windows, if you did not install Python with the installer options that make Python scripts executable, you will have to run `python /path/to/meson.py`, where `python` is Python 3.7 or newer. The newest development code can be obtained directly from [Git], and we strive to ensure that it will always be working and usable. All commits go through a pull-request process that runs CI and tests several platforms. ### Packing Meson into a zipapp After downloading the release, you can create a standalone single-file executable for Meson by running the script: ``` ./packaging/create_zipapp.py --outfile meson.pyz --interpreter '/usr/bin/env python3' ``` This uses python's native support for [zipapp]. ## Installing Meson with pip Meson is available in the [Python Package Index] and can be installed with `pip3 install --user meson`. This does not require any special privileges. This will install the package in `~/.local/`, so you will have to add `~/.local/bin` to your `PATH`. If you are using Meson only for local development this should be all you need. If you need to install your project in system directories, this approach will not work as executable installed in this way are not available when `sudo` is used. You can install Meson so it can be used by every user with `sudo pip3 install meson`. It is generally not recommended to do this, but instead use the version provided by distro packages. If you must install Meson with `sudo pip3` make sure to uninstall any distro version first. Having multiple versions of any program in system directories can lead to problems. ## Installing Meson and Ninja with the MSI installer We provide an MSI installer on the [GitHub release page] that can be used to install both Meson and Ninja at once for Windows. It also contains an embedded copy of Python, so scripts that use the [Python module](Python-module.md) and do not have any external dependencies will continue to work as expected. Please note that this is a new feature, so bug reports are expected and welcome! ## Dependencies In the most common case, you will need the [Ninja executable] for using the `ninja` backend, which is the default in Meson. This backend can be used on all platforms and with all toolchains, including GCC, Clang, Visual Studio, MinGW, ICC, ARMCC, etc. You can use the version provided by your package manager if possible, otherwise download the binary executable from the [Ninja project's release page](https://github.com/ninja-build/ninja/releases). If you will only use the Visual Studio backend (`--backend=vs`) to generate Visual Studio solutions on Windows or the XCode backend (`--backend=xcode`) to generate XCode projects on macOS, you do not need Ninja. # Platform-specific install quirks ## Windows Python3 quirks When installing Python 3, it is highly recommended (but not required) that you select the installer options as follows: ![installer step 1](images/py3-install-1.png "Enable 'Add Python 3.6 to PATH' and click 'Customize installation'") ![installer step 2](images/py3-install-2.png "Optional Features: ensure 'pip' is enabled") ![installer step 3](images/py3-install-3.png "Advanced Options: enable 'Install for all users'") With this, you will have `python` and `pip` in `PATH`, and you can install Meson with pip. You will also be able to directly run `meson` in any shell on Windows instead of having to run `py -3` with the full path to the `meson.py` script. ## MSYS2 Python3 quirks If you are using MSYS2 on Windows as your development environment, please make sure that you **do not use** the `msys/python` package to provide Python 3. Use either `mingw32/mingw-w64-i686-python3` or `mingw64/mingw-w64-x86_64-python3` depending on which MinGW target you are building for. [GitHub release page]: https://github.com/mesonbuild/meson/releases [zipapp]: https://docs.python.org/3/library/zipapp.html [Python Package Index]: https://pypi.python.org/pypi/meson/ [Git]: https://github.com/mesonbuild/meson [Python's home page]: https://www.python.org/downloads/ [Ninja executable]: https://ninja-build.org/ muon-v0.4.0/subprojects/meson-docs/docs/markdown/Python-module.md0000644000175000017500000002135114737503617024130 0ustar buildbuild--- short-description: Generic python module authors: - name: Mathieu Duponchelle email: mathieu@centricular.com years: [2018] has-copyright: false ... # Python module This module provides support for finding and building extensions against python installations, be they python 2 or 3. If you want to build and package Python extension modules using tools compatible with [PEP-517](https://peps.python.org/pep-0517/), check out [meson-python](https://mesonbuild.com/meson-python/index.html). If you are building Python extension modules against a Python interpreter located in a venv or Conda environment, you probably want to set `python.install_venv=auto`; see [Python module options](Builtin-options.md#python-module) for details. *Added 0.46.0* ## Functions ### `find_installation()` ``` meson pymod.find_installation(name_or_path, ...) ``` Find a python installation matching `name_or_path`. That argument is optional, if not provided then the returned python installation will be the one used to run Meson. If provided, it can be: - A simple name, eg `python-2.7`, Meson will look for an external program named that way, using [[find_program]] - A path, eg `/usr/local/bin/python3.4m` - One of `python2` or `python3`: in either case, the module will try some alternative names: `py -2` or `py -3` on Windows, and `python` everywhere. In the latter case, it will check whether the version provided by the sysconfig module matches the required major version. *Since 1.2.0*, searching for minor version (e.g. `python3.11`) also works on Windows. Keyword arguments are the following: - `required`: by default, `required` is set to `true` and Meson will abort if no python installation can be found. If `required` is set to `false`, Meson will continue even if no python installation was found. You can then use the `.found()` method on the returned object to check whether it was found or not. Since *0.48.0* the value of a [`feature`](Build-options.md#features) option can also be passed to the `required` keyword argument. - `disabler`: if `true` and no python installation can be found, return a [[@disabler]] object instead of a not-found object. *Since 0.49.0* - `modules`: a list of module names that this python installation must have. *Since 0.51.0* - `pure`: On some platforms, architecture independent files are expected to be placed in a separate directory. However, if the python sources should be installed alongside an extension module built with this module, this keyword argument can be used to override the default behavior of `.install_sources()`. *since 0.64.0* **Returns**: a [python installation][`python_installation` object] ## `python_installation` object The `python_installation` object is an [[@external_program]], with several added methods. ### Methods #### `path()` ```meson str py_installation.path() ``` *Added 0.50.0* Works like the path method of other `ExternalProgram` objects. Was not provided prior to 0.50.0 due to a bug. #### `extension_module()` ``` meson shared_module py_installation.extension_module(module_name, list_of_sources, ...) ``` Create a [[shared_module]] target that is named according to the naming conventions of the target platform. All positional and keyword arguments are the same as for [[shared_module]], excluding `name_suffix` and `name_prefix`, and with the addition of the following: - `subdir`: By default, Meson will install the extension module in the relevant top-level location for the python installation, eg `/usr/lib/site-packages`. When subdir is passed to this method, it will be appended to that location. This keyword argument is mutually exclusive with `install_dir` - `limited_api`: *since 1.3.0* A string containing the Python version of the [Py_LIMITED_API](https://docs.python.org/3/c-api/stable.html) that the extension targets. For example, '3.7' to target Python 3.7's version of the limited API. This behavior can be disabled by setting the value of `python.allow_limited_api`. See [Python module options](Builtin-options.md#python-module). Additionally, the following diverge from [[shared_module]]'s default behavior: - `gnu_symbol_visibility`: if unset, it will default to `'hidden'` on versions of Python that support this (the python headers define `PyMODINIT_FUNC` has default visibility). *since 0.63.0* `extension_module` automatically adds a dependency to the library if one is not explicitly provided. To support older versions, the user may need to add `dependencies : py_installation.dependency()`, see [[dependency]]. **Returns**: a [[@build_tgt]] object #### `dependency()` ``` meson python_dependency py_installation.dependency(...) ``` *since 0.53.0* This method accepts no positional arguments, and the same keyword arguments as the standard [[dependency]] function. It also supports the following keyword argument: - `embed`: *(since 0.53.0)* If true, Meson will try to find a python dependency that can be used for embedding python into an application. - `disabler` *(since 0.60.0)*: if `true` and the dependency couldn't be found, returns a [disabler object](#disabler-object) instead of a not-found dependency. **Returns**: a [python dependency][`python_dependency` object] #### `install_sources()` ``` meson void py_installation.install_sources(list_of_files, ...) ``` Install actual python sources (`.py`). All positional and keyword arguments are the same as for [[install_data]], with the addition of the following: *Since 0.60.0* `python.platlibdir` and `python.purelibdir` options can be used to control the default installation path. See [Python module options](Builtin-options.md#python-module). - `pure`: On some platforms, architecture independent files are expected to be placed in a separate directory. However, if the python sources should be installed alongside an extension module built with this module, this keyword argument can be used to override that behaviour. Defaults to the value specified in `find_installation()`, or else `true` - `subdir`: See documentation for the argument of the same name to [][`extension_module()`] - `install_tag` *(since 0.60.0)*: A string used by `meson install --tags` command to install only a subset of the files. By default it has the tag `python-runtime`. #### `get_install_dir()` ``` meson string py_installation.get_install_dir(...) ``` Retrieve the directory [][`install_sources()`] will install to. It can be useful in cases where `install_sources` cannot be used directly, for example when using [[configure_file]]. This function accepts no arguments, its keyword arguments are the same as [][`install_sources()`]. *Since 0.60.0* `python.platlibdir` and `python.purelibdir` options can be used to control the default installation path. See [Python module options](Builtin-options.md#python-module). **Returns**: A string #### `language_version()` ``` meson string py_installation.language_version() ``` Get the major.minor python version, eg `2.7`. The version is obtained through the `sysconfig` module. This function expects no arguments or keyword arguments. **Returns**: A string #### `get_path()` ``` meson string py_installation.get_path(path_name, fallback) ``` Get a path as defined by the `sysconfig` module. For example: ``` meson purelib = py_installation.get_path('purelib') ``` This function requires at least one argument, `path_name`, which is expected to be a non-empty string. If `fallback` is specified, it will be returned if no path with the given name exists. Otherwise, attempting to read a non-existing path will cause a fatal error. **Returns**: A string #### `has_path()` ``` meson bool py_installation.has_path(path_name) ``` **Returns**: true if a path named `path_name` can be retrieved with [][`get_path()`], false otherwise. #### `get_variable()` ``` meson string py_installation.get_variable(variable_name, fallback) ``` Get a variable as defined by the `sysconfig` module. For example: ``` meson py_bindir = py_installation.get_variable('BINDIR', '') ``` This function requires at least one argument, `variable_name`, which is expected to be a non-empty string. If `fallback` is specified, it will be returned if no variable with the given name exists. Otherwise, attempting to read a non-existing variable will cause a fatal error. **Returns**: A string #### `has_variable()` ``` meson bool py_installation.has_variable(variable_name) ``` **Returns**: true if a variable named `variable_name` can be retrieved with [][`get_variable()`], false otherwise. ## `python_dependency` object This [[@dep]] object subclass will try various methods to obtain the compiler and linker arguments, starting with pkg-config then potentially using information obtained from python's `sysconfig` module. It exposes the same methods as its parent class. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Fs-module.md0000644000175000017500000001507414737503617023224 0ustar buildbuild# FS (filesystem) module This module provides functions to inspect the file system. It is available starting with version 0.53.0. Since 0.59.0, all functions accept `files()` objects if they can do something useful with them (this excludes `exists`, `is_dir`, `is_file`, `is_absolute` since a `files()` object is always the absolute path to an existing file). ## Usage The module may be imported as follows: ``` meson fs = [[#import]]('fs') ``` ## File lookup rules Non-absolute paths are looked up relative to the directory where the current `meson.build` file is. If specified, a leading `~` is expanded to the user home directory. Environment variables are not available as is the rule throughout Meson. That is, $HOME, %USERPROFILE%, $MKLROOT, etc. have no meaning to the Meson filesystem module. If needed, pass such variables into Meson via command line options in `meson.options`, native-file or cross-file. Where possible, symlinks and parent directory notation are resolved to an absolute path. ### exists Takes a single string argument and returns true if an entity with that name exists on the file system. This can be a file, directory or a special entry such as a device node. ### is_dir Takes a single string argument and returns true if a directory with that name exists on the file system. ### is_file Takes a single string argument and returns true if an file with that name exists on the file system. ### is_symlink Takes a single string or (since 0.59.0) `files()` argument and returns true if the path pointed to by the string is a symbolic link. ## File Parameters ### is_absolute *since 0.54.0* Return a boolean indicating if the path string or (since 0.59.0) `files()` specified is absolute, WITHOUT expanding `~`. Examples: ```meson fs.is_absolute('~') # false home = fs.expanduser('~') fs.is_absolute(home) # true fs.is_absolute(home / 'foo') # true, even if ~/foo doesn't exist fs.is_absolute('foo/bar') # false, even if ./foo/bar exists ``` ### hash The `fs.hash(filename, hash_algorithm)` method returns a string containing the hexadecimal `hash_algorithm` digest of a file. `hash_algorithm` is a string; the available hash algorithms include: md5, sha1, sha224, sha256, sha384, sha512. ### size The `fs.size(filename)` method returns the size of the file in integer bytes. ### is_samepath The `fs.is_samepath(path1, path2)` returns boolean `true` if both paths resolve to the same path. For example, suppose path1 is a symlink and path2 is a relative path. If `path1` can be resolved to `path2`, then `true` is returned. If `path1` is not resolved to `path2`, `false` is returned. If `path1` or `path2` do not exist, `false` is returned. Examples: ```meson x = 'foo.txt' y = 'sub/../foo.txt' z = 'bar.txt' # a symlink pointing to foo.txt j = 'notafile.txt' # nonexistent file fs.is_samepath(x, y) # true fs.is_samepath(x, z) # true fs.is_samepath(x, j) # false p = 'foo/bar' q = 'foo/bar/baz/..' r = 'buz' # a symlink pointing to foo/bar s = 'notapath' # nonexistent directory fs.is_samepath(p, q) # true fs.is_samepath(p, r) # true fs.is_samepath(p, s) # false ``` ## Filename modification The files need not actually exist yet for these path string manipulation methods. ### expanduser *since 0.54.0* A path string with a leading `~` is expanded to the user home directory Examples: ```meson fs.expanduser('~') # user home directory fs.expanduser('~/foo') # /foo ``` ### as_posix *since 0.54.0* `fs.as_posix(path)` assumes a Windows path, even if on a Unix-like system. Thus, all `'\'` or `'\\'` are turned to '/', even if you meant to escape a character. Examples ```meson fs.as_posix('\\') == '/' # true fs.as_posix('\\\\') == '/' # true fs.as_posix('foo\\bar/baz') == 'foo/bar/baz' # true ``` ### replace_suffix The `replace_suffix` method is a *string manipulation* convenient for filename modifications. It allows changing the filename suffix like: #### swap suffix ```meson original = '/opt/foo.ini' new = fs.replace_suffix(original, '.txt') # /opt/foo.txt ``` #### add suffix ```meson original = '/opt/foo' new = fs.replace_suffix(original, '.txt') # /opt/foo.txt ``` #### compound suffix swap ```meson original = '/opt/foo.dll.a' new = fs.replace_suffix(original, '.so') # /opt/foo.dll.so ``` #### delete suffix ```meson original = '/opt/foo.dll.a' new = fs.replace_suffix(original, '') # /opt/foo.dll ``` ### parent Returns the parent directory (i.e. dirname). ```meson new = fs.parent('foo/bar') # foo new = fs.parent('foo/bar/baz.dll') # foo/bar ``` ### name Returns the last component of the path (i.e. basename). ```meson fs.name('foo/bar/baz.dll.a') # baz.dll.a ``` ### stem *since 0.54.0* Returns the last component of the path, dropping the last part of the suffix ```meson fs.stem('foo/bar/baz.dll') # baz fs.stem('foo/bar/baz.dll.a') # baz.dll ``` ### read - `read(path, encoding: 'utf-8')` *(since 0.57.0)*: return a [string](Syntax.md#strings) with the contents of the given `path`. If the `encoding` keyword argument is not specified, the file specified by `path` is assumed to be utf-8 encoded. Binary files are not supported. The provided paths should be relative to the current `meson.current_source_dir()` or an absolute path outside the build directory is accepted. If the file specified by `path` changes, this will trigger Meson to reconfigure the project. If the file specified by `path` is a `files()` object it cannot refer to a built file. ### relative_to *Since 1.3.0* Return a relative filepath. In the event a relative path could not be found, the absolute path of `to` is returned. Relative path arguments will be assumed to be relative to `meson.current_source_dir()`. Has the following positional arguments: - to `str | file | custom_tgt | custom_idx | build_tgt`: end path - from `str | file | custom_tgt | custom_idx | build_tgt`: start path returns: - a string ### copyfile *Since 0.64.0* Copy a file from the source directory to the build directory at build time Has the following positional arguments: - src `File | str`: the file to copy Has the following optional arguments: - dest `str`: the name of the output file. If unset will be the basename of the src argument Has the following keyword arguments: - install `bool`: Whether to install the copied file, defaults to false - install_dir `str`: Where to install the file to - install_tag: `str`: the install tag to assign to this target - install_mode `array[str | int]`: the mode to install the file with returns: - a [[custom_target]] object ```meson copy = fs.copyfile('input-file', 'output-file') ``` muon-v0.4.0/subprojects/meson-docs/docs/markdown/Localisation.md0000644000175000017500000000505414737503617024007 0ustar buildbuild--- short-description: Localization with GNU Gettext ... # Localisation Localising your application with GNU gettext takes a little effort but is quite straightforward. We'll create a `po` subdirectory at your project root directory for all the localisation info. ## Generating .pot and .po files In your main meson.build file include the `po` subdirectory in the build process. subdir('po') In this `po` subdirectory we need: - `LINGUAS`: Space separated list of languages - `POTFILES`: List of source files to scan for translatable strings. - `meson.build`: Localization specific Meson file ### LINGUAS File with space separated list of languages. A sample LINGUAS might look like this. aa ab ae af ### POTFILES File that lists all the source files that gettext should scan in order to find strings to translate. The syntax of the file is one line per source file and the line must contain the relative path from source root. A sample POTFILES might look like this. src/file1.c src/file2.c src/subdir/file3.c include/mything/somefile.h ### meson.build Localization specific Meson file. It imports and uses the `i18n` module. If not defined before it needs to define the `GETTEXT_PACKAGE` global. ```meson i18n = import('i18n') # define GETTEXT_PACKAGE add_project_arguments('-DGETTEXT_PACKAGE="intltest"', language:'c') i18n.gettext(meson.project_name()) ``` The first command imports the `i18n` module that provides gettext features. The fourth line does the actual invocation. The first argument is the gettext package name. This causes two things to happen. The first is that Meson will generate binary mo files and put them to their proper locations when doing an install. The second is that it creates a build rule to regenerate the main pot file. If you are using the Ninja backend, this is how you would invoke the rebuild. ### generate .pot file Then we need to generate the main pot file. The potfile can have any name but is usually the name of the gettext package. Let's say the project is called *intltest*. In this case the corresponding pot file would be called `intltest.pot`. Run the following command from your build folder to generate the pot file. It is recommended to inspect it manually afterwards and fill in e.g. proper copyright and contact information. ```console $ meson compile intltest-pot ``` ### generate .po files For each language listed in the array above we need a corresponding `.po` file. Those can be generated by running the following command from your build folder. ```console $ meson compile intltest-update-po ``` muon-v0.4.0/subprojects/meson-docs/docs/markdown/Using-the-WrapDB.md0000644000175000017500000000373314737503617024350 0ustar buildbuild# Using the WrapDB The Wrap database is a web service that provides Meson build definitions to projects that do not have it natively. Using it is simple. The service can be found [here](https://wrapdb.mesonbuild.com). The front page lists all projects that are on the service. Select the one you want and click it. The detail page lists available versions by branch and revision id. The branch names come from upstream releases and revision ids are version numbers internal to the database. Whenever the packaging is updated a new revision is released to the service a new revision with a bigger revision id is added. Usually you want to select the newest branch with the highest revision id. You can get the actual wrap file which tells Meson how to fetch the project by clicking on the download link on the page. As an example, the wrap file for [zlib-1.2.8, revision 4](https://wrapdb.mesonbuild.com/v1/projects/zlib/1.2.8/4/get_wrap) looks like this. You can find detailed documentation about it in [the Wrap manual](Wrap-dependency-system-manual.md). [wrap-file] directory = zlib-1.2.8 source_url = http://zlib.net/zlib-1.2.8.tar.gz source_filename = zlib-1.2.8.tar.gz source_hash = 36658cb768a54c1d4dec43c3116c27ed893e88b02ecfcb44f2166f9c0b7f2a0d patch_url = https://wrapdb.mesonbuild.com/v1/projects/zlib/1.2.8/4/get_zip patch_filename = zlib-1.2.8-4-wrap.zip patch_hash = 2327a42c8f73a4289ee8c9cd4abc43b324d0decc28d6e609e927f0a50321af4a Add this file to your project with the name `subprojects/zlib.wrap`. Then you can use it in your `meson.build` file with this directive: zproj = subproject('zlib') When Meson encounters this it will automatically download, unpack and patch the source files. ## Contributing build definitions The contents of the Wrap database are tracked in git repos of the [Mesonbuild project](https://github.com/mesonbuild). The actual process is simple and described in [submission documentation](Adding-new-projects-to-wrapdb.md). muon-v0.4.0/subprojects/meson-docs/docs/markdown/Release-notes-for-0.60.0.md0000644000175000017500000003361614737503617025404 0ustar buildbuild--- title: Release 0.60.0 short-description: Release notes for 0.60.0 ... # New features ## `run_target` can now be used as a dependency A `run_target()` can now be saved in a variable and reused as a dependency in an `alias_target()`. This can be used to create custom alias rules that ensure multiple other targets are run, even if those targets don't produce output files. For example: ``` i18n = import('i18n') all_pot_targets = [] foo_i18n = i18n.gettext('foo') all_pot_targets += foo_i18n[1] alias_target('all-pot', all_pot_targets) ``` ## The Python Modules dependency method no longer accepts positional arguments Previously these were ignored with a warning, now they're a hard error. ## `unset_variable()` `unset_variable()` can be used to unset a variable. Reading a variable after calling `unset_variable()` will raise an exception unless the variable is set again. ```meson # tests/meson.build tests = ['test1', 'test2'] # ... unset_variable('tests') # tests is no longer usable until it is set again ``` ## Override python installation paths The `python` module now has options to control where modules are installed: - python.platlibdir: Directory for site-specific, platform-specific files. - python.purelibdir: Directory for site-specific, non-platform-specific files. Those options are used by python module methods `python.install_sources()` and `python.get_install_dir()`. By default Meson tries to detect the correct installation path, but make them relative to the installation `prefix`, which will often result in installed python modules to not be found by the interpreter unless `prefix` is `/usr` on Linux, or for example `C:\Python39` on Windows. These new options can be absolute paths outside of `prefix`. ## New `subprojects packagefiles` subcommand It is now possible to re-apply `meson.build` overlays (`patch_filename` or `patch_directory` in the wrap ini file) after a subproject was downloaded and set up, via `meson subprojects packagefiles --apply `. It is also possible for `patch_directory` overlays in a `[wrap-file]`, to copy the packagefiles out of the subproject and back into `packagefiles//` via `meson subprojects packagefiles --save `. This is useful for testing an edit in the subproject and then saving it back to the overlay which is checked into git. ## Deprecated project options Project options declared in `meson_options.txt` can now be marked as deprecated and Meson will warn when user sets a value to it. It is also possible to deprecate only some of the choices, and map deprecated values to a new value. ```meson # Option fully deprecated, it warns when any value is set. option('o1', type: 'boolean', deprecated: true) # One of the choices is deprecated, it warns only when 'a' is in the list of values. option('o2', type: 'array', choices: ['a', 'b'], deprecated: ['a']) # One of the choices is deprecated, it warns only when 'a' is in the list of values # and replace it by 'c'. option('o3', type: 'array', choices: ['a', 'b', 'c'], deprecated: {'a': 'c'}) # A boolean option has been replaced by a feature, old true/false values are remapped. option('o4', type: 'feature', deprecated: {'true': 'enabled', 'false': 'disabled'}) # A feature option has been replaced by a boolean, enabled/disabled/auto values are remapped. option('o5', type: 'boolean', deprecated: {'enabled': 'true', 'disabled': 'false', 'auto': 'false'}) ``` ## More efficient static linking of uninstalled libraries **Note**: This change had to be reverted in 0.60.1 because it caused regressions. New API will likely be introduced in 0.61.0 to have better control whether or not to create thin archive. A somewhat common use case of [[static_library]] is to create uninstalled internal convenience libraries which are solely meant to be linked to other targets. Some build systems call these "object libraries". Meson's implementation does always create a static archive. This will now check to see if the static linker supports "thin archives" (archives which do not contain the actual object code, only references to their location on disk) and if so, use them to minimize space usage and speed up linking. ## gnome.yelp variadic argument deprecation `gnome.yelp` previously allowed sources to be passed either as variadic arguments or as a keyword argument. If the keyword argument was given the variadic arguments would be silently ignored. This has changed in 0.60.0, the variadic form has been deprecated, and a warning is printed if both are given. ## `static` keyword argument to `meson.override_dependency()` It is now possible to override shared and/or static dependencies separately. When the `static` keyword argument is not specified in `dependency()`, the first override will be used (`static_dep` in the example below). ```meson static_lib = static_library() static_dep = declare_dependency(link_with: static_lib) meson.override_dependency('foo', static_dep, static: true) shared_lib = shared_library() shared_dep = declare_dependency(link_with: shared_lib) meson.override_dependency('foo', shared_dep, static: false) # Returns static_dep dependency('foo') # Returns static_dep dependency('foo', static: true) # Returns shared_dep dependency('foo', static: false) ``` When the `static` keyword argument is not specified in `meson.override_dependency()`, the dependency is assumed to follow the value of `default_library` option. ```meson dep = declare_dependency(...) meson.override_dependency('foo', dep) # Always works dependency('foo') # Works only if default_library is 'static' or 'both' dependency('foo', static: true) # Works only if default_library is 'shared' or 'both' dependency('foo', static: false) ``` ## `dependency()` sets `default_library` on fallback subproject When the `static` keyword argument is set but `default_library` is missing in `default_options`, `dependency()` will set it when configuring fallback subproject. `dependency('foo', static: true)` is now equivalent to `dependency('foo', static: true, default_options: ['default_library=static'])`. ## install_emptydir function It is now possible to define a directory which will be created during installation, without creating it as a side effect of installing files into it. This replaces custom `meson.add_install_script()` routines. For example: ```meson meson.add_install_script('sh', '-c', 'mkdir -p "$DESTDIR/@0@"'.format(path)) ``` can be replaced by: ```meson install_emptydir(path) ``` and as a bonus this works reliably on Windows, prints a sensible progress message, will be uninstalled by `ninja uninstall`, etc. ## Cython can now transpile to C++ as an intermediate language Built-in cython support currently only allows C as an intermediate language, now C++ is also allowed. This can be set via the `cython_language` option, either on the command line, or in the meson.build files. ```meson project( 'myproject', 'cython', default_options : ['cython_language=cpp'], ) ``` or on a per target basis with: ```meson python.extension_module( 'mod', 'mod.pyx', override_options : ['cython_language=cpp'], ) ``` ## New custom dependency for iconv ``` dependency('iconv') ``` will now check for the functionality of libiconv.so, but first check if it is provided in the libc (for example in glibc or musl libc on Linux). ## Unknown options are now always fatal Passing unknown options to "meson setup" or "meson configure" is now always fatal. That is, Meson will exit with an error code if this happens. Previous Meson versions only showed a warning message. ## Install DESTDIR relative to build directory When `DESTDIR` environment or `meson install --destdir` option is a relative path, it is now assumed to be relative to the build directory. An absolute path will be set into environment when executing scripts. It was undefined behavior in prior Meson versions but was working as relative to build directory most of the time. ## Java Module The Java module has been added to Meson. The Java module allows users to generate native header files without needing to use a `custom_target()`. ```meson jmod = import('java') native_header = jmod.generate_native_header('File.java', package: 'com.mesonbuild') native_header_includes = include_directories('.') jdkjava = shared_module( 'jdkjava', [native_header_includes, other_sources], dependencies : [jdk], include_directories : [native_header_includes] ) ``` ## Link tests can use sources for a different compiler Usually, the `links` method of the compiler object uses a single program invocation to do both compilation and linking. Starting with this version, whenever the argument to `links` is a file, Meson will check if the file suffix matches the compiler object's language. If they do not match, as in the following case: ``` cxx = meson.get_compiler('cpp') cxx.links(files('test.c')) ``` then Meson will separate compilation and linking. In the above example `test.c` will be compiled with a C compiler and the resulting object file will be linked with a C++ compiler. This makes it possible to detect misconfigurations of the compilation environment, for example when the C++ runtime is not compatible with the one expected by the C compiler. For this reason, passing file arguments with an unrecognized suffix to `links` will cause a warning. ## Relax restrictions of `str.join()` Since 0.60.0, the [[str.join]] method can take an arbitrary number of arguments instead of just one list. Additionally, all lists past to [[str.join]] will now be flattened. ## Improvements for the Rustc compiler - Werror now works, this set's `-D warnings`, which will cause rustc to error for every warning not explicitly disabled - warning levels have been implemented - support for meson's pic has been enabled ## The qt modules now accept generated outputs as inputs for qt.compile_* This means you can use `custom_target`, custom_target indices (`custom_target[0]`, for example), or the output of `generator.process` as inputs to the various `qt.compile_*` methods. ```meson qt = import('qt5') ct = custom_target(...) out = qt.compile_ui(sources : ct) ``` ## Waf support in external-project module If the first argument is `'waf'`, special treatment is done for the [waf](https://waf.io/) build system. The waf executable must be found either in the current directory, or in system `PATH`. ## Comparing two objects with different types is now an error Using the `==` and `!=` operators to compare objects of different (for instance `[1] == 1`) types was deprecated and undefined behavior since 0.45.0 and is now a hard error. ## Installation tags It is now possible to install only a subset of the installable files using `meson install --tags tag1,tag2` command line. See [documentation](Installing.md#installation-tags) for more details. ## Compiler.unittest_args has been removed It's never been documented, and it's been marked deprecated for a long time, so let's remove it. ## Dependencies with multiple names More than one name can now be passed to `dependency()`, they will be tried in order and the first name to be found will be used. The fallback subproject will be used only if none of the names are found on the system. Once one of the name has been found, all other names are added into the cache so subsequent calls for any of those name will return the same value. This is useful in case a dependency could have different names, such as `png` and `libpng`. ## i18n module now returns gettext targets `r = i18n.gettext('mydomain')` will now provide access to: - a list of built .mo files - the mydomain-pot maintainer target which updates .pot files - the mydomain-update-po maintainer target which updates .po files ## Added support for CLA sources when cross-compiling with the C2000 toolchain Support for CLA sources has been added for cross-compilation with the C2000 toolchain. ## Support for clippy-driver as a rustc wrapper Clippy is a popular linting tool for Rust, and is invoked in place of rustc as a wrapper. Unfortunately it doesn't proxy rustc's output, so we need to have a small wrapper around it so that Meson can correctly detect the underlying rustc, but still display clippy ## Force Visual Studio environment activation Since `0.59.0`, meson automatically activates Visual Studio environment on Windows for all its subcommands, but only if no other compilers (e.g. `gcc` or `clang`) are found, and silently continue if Visual Studio activation fails. `meson setup --vsenv` command line argument can now be used to force Visual Studio activation even when other compilers are found. It also make Meson abort with an error message when activation fails. This is especially useful for GitHub Actions because their Windows images have gcc in their PATH by default. `--vsenv` is set by default when using `vs` backend. Only `setup`, `compile`, `dist` and `devenv` subcommands now activate Visual Studio. ## MSVC compiler now assumes UTF-8 source code by default Every project that uses UTF-8 source files had to add manually `/utf-8` C/C++ compiler argument for MSVC otherwise they wouldn't work on non-English locale. Meson now switched the default to UTF-8 to be more consistent with all other compilers. This can be overridden but using `/source-charset`: ```meson if cc.get_id() == 'msvc' add_project_arguments('/source-charset:.XYZ', language: ['c', 'cpp']) endif ``` See Microsoft documentation for details: https://docs.microsoft.com/en-us/cpp/build/reference/source-charset-set-source-character-set. ## Add support for `find_library` in Emscripten The `find_library` method can be used to find your own JavaScript libraries. The limitation is that they must have the file extension `.js`. Other library lookups will look up "native" libraries from the system like currently. A typical usage would look like this: ```meson glue_lib = cc.find_library('gluefuncs.js', dirs: meson.current_source_dir()) executable('prog', 'prog.c', dependencies: glue_lib) ``` ## Optional `custom_target()` name The name argument is now optional and defaults to the basename of the first output. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Pkgconfig-module.md0000644000175000017500000001652114737503617024561 0ustar buildbuild# Pkgconfig module This module is a simple generator for [pkg-config](https://pkg-config.freedesktop.org/) files. ## Usage ```meson pkg = import('pkgconfig') bar_dep = dependency('bar') lib = library('foo', dependencies : [bar]) pkg.generate(lib) ``` ### pkg.generate() The generated file's properties are specified with the following keyword arguments. - `description` a string describing the library, used to set the `Description:` field - `extra_cflags` a list of extra compiler flags to be added to the `Cflags` field after the header search path - `filebase` the base name to use for the pkg-config file; as an example, the value of `libfoo` would produce a pkg-config file called `libfoo.pc` - `install_dir` the directory to install to, defaults to the value of option `libdir` followed by `/pkgconfig` - `libraries` a list of built libraries (usually results of shared_library) that the user needs to link against. Arbitrary strings can also be provided and they will be added into the `Libs` field. Since 0.45.0 dependencies of built libraries will be automatically added, see the [Implicit dependencies](#implicit-dependencies) section below for the exact rules. Since 0.58.0 custom_target() objects are supported as long as they are linkable (has known extension such as `.a`, `.so`, etc). - `libraries_private` list of built libraries or strings to put in the `Libs.private` field. Since 0.45.0 dependencies of built libraries will be automatically added, see the [Implicit dependencies](#implicit-dependencies) section below for the exact rules. Since 0.58.0 custom_target() objects are supported as long as they are linkable (has known extension such as `.a`, `.so`, etc). - `name` the name of this library, used to set the `Name:` field - `subdirs` which subdirs of `include` should be added to the header search path, for example if you install headers into `${PREFIX}/include/foobar-1`, the correct value for this argument would be `foobar-1` - `requires` list of strings, pkgconfig-dependencies or libraries that `pkgconfig.generate()` was used on to put in the `Requires` field - `requires_private` the same as `requires` but for the `Requires.private` field - `url` a string with a url for the library - `variables` a list of strings with custom variables to add to the generated file. The strings must be in the form `name=value` and may reference other pkgconfig variables, e.g. `datadir=${prefix}/share`. The names `prefix`, `libdir` and `includedir` are reserved and may not be used. *Since 0.56.0* it can also be a dictionary but ordering of Meson dictionaries are not guaranteed, which could cause issues when some variables reference other variables. Spaces in values are escaped with `\`, this is required in the case the value is a path that and is used in `cflags` or `libs` arguments. *Since 0.59.0* if escaping is not desired (e.g. space separate list of values) `unescaped_variables` keyword argument should be used instead. *Since 0.62.0* builtin directory variables that are referenced are automatically created by default. - `uninstalled_variables` used instead of the `variables` keyword argument, when generating the uninstalled pkg-config file. Since *0.54.0* Spaces in values are escaped with `\`, this is required in the case the value is a path that and is used in `cflags` or `libs` arguments. *Since 0.59.0* if escaping is not desired (e.g. space separate list of values) `unescaped_uninstalled_variables` keyword argument should be used instead. - `version` a string describing the version of this library, used to set the `Version:` field. (*since 0.46.0*) Defaults to the project version if unspecified. - `d_module_versions` a list of module version flags used when compiling D sources referred to by this pkg-config file - `dataonly` field. (*since 0.54.0*) this is used for architecture-independent pkg-config files in projects which also have architecture-dependent outputs. - `conflicts` (*since 0.36.0, incorrectly issued a warning prior to 0.54.0*) list of strings to be put in the `Conflicts` field. Since 0.46 a `StaticLibrary` or `SharedLibrary` object can optionally be passed as first positional argument. If one is provided a default value will be provided for all required fields of the pc file: - `install_dir` is set to `pkgconfig` folder in the same location than the provided library. - `description` is set to the project's name followed by the library's name. - `name` is set to the library's name. Since 0.54.0 uninstalled pkg-config files are generated as well. They are located in `/meson-uninstalled/`. It is sometimes useful to build projects against libraries built by Meson without having to install them into a prefix. In order to do so, just set `PKG_CONFIG_PATH=/meson-uninstalled` before building your application. That will cause pkg-config to prefer those `-uninstalled.pc` files and find libraries and headers from the Meson builddir. This is an experimental feature provided on a best-effort basis, it might not work in all use-cases. ### Implicit dependencies The exact rules followed to find dependencies that are implicitly added into the pkg-config file have evolved over time. Here are the rules as of Meson *0.49.0*, previous versions might have slightly different behaviour. - Not found libraries or dependencies are ignored. - Libraries and dependencies are private by default (i.e. added into `Requires.private:` or `Libs.private:`) unless they are explicitly added in `libraries` or `requires` keyword arguments, or is the main library (first positional argument). - Libraries and dependencies will be de-duplicated, if they are added in both public and private (e.g `Requires:` and `Requires.private:`) it will be removed from the private list. - Shared libraries (i.e. `shared_library()` and **NOT** `library()`) add only `-lfoo` into `Libs:` or `Libs.private:` but their dependencies are not pulled. This is because dependencies are only needed for static link. - Other libraries (i.e. `static_library()` or `library()`) add `-lfoo` into `Libs:` or `Libs.private:` and recursively add their dependencies into `Libs.private:` or `Requires.private:`. - Dependencies provided by pkg-config are added into `Requires:` or `Requires.private:`. If a version was specified when declaring that dependency it will be written into the generated file too. - The threads dependency (i.e. `dependency('threads')`) adds `-pthread` into `Libs:` or `Libs.private:`. - Internal dependencies (i.e. `declare_dependency(compiler_args : '-DFOO', link_args : '-Wl,something', link_with : foo)`) add `compiler_args` into `Cflags:` if public, `link_args` and `link_with` into `Libs:` if public or `Libs.private:` if private. - Other dependency types add their compiler arguments into `Cflags:` if public, and linker arguments into `Libs:` if public or `Libs.private:` if private. - Once a pkg-config file is generated for a library using `pkg.generate(mylib)`, any subsequent call to `pkg.generate()` where mylib appears, will generate a `Requires:` or `Requires.private` instead of a `Libs:` or `Libs.private:`. ### Relocatable pkg-config files By default, the files generated by `pkg.generate` contain a hardcoded prefix path. In order to make them relocatable, a `pkgconfig.relocatable` builtin option is provided. See [Pkgconfig module options](Builtin-options.md#pkgconfig-module). muon-v0.4.0/subprojects/meson-docs/docs/markdown/Qt5-module.md0000644000175000017500000000021714737503617023316 0ustar buildbuild# Qt5 module The Qt5 module provides tools to automatically deal with the various tools and steps required for Qt. {{ _include_qt_base.md }} muon-v0.4.0/subprojects/meson-docs/docs/markdown/Comparisons.md0000644000175000017500000000410114737503617023653 0ustar buildbuild--- title: Comparisons ... # Comparing Meson with other build systems A common question is *Why should I choose Meson over a different build system X?* There is no one true answer to this as it depends on the use case. Almost all build systems have all the functionality needed to build medium-to-large projects so the decision is usually made on other points. Here we list some pros and cons of various build systems to help you do the decision yourself. ## GNU Autotools ### Pros Excellent support for legacy Unix platforms, large selection of existing modules. ### Cons Needlessly slow, complicated, hard to use correctly, unreliable, painful to debug, incomprehensible for most people, poor support for non-Unix platforms (especially Windows). ## CMake ### Pros Great support for multiple backends (Visual Studio, XCode, etc). ### Cons The scripting language is cumbersome to work with. Some simple things are more complicated than necessary. ## SCons ### Pros Full power of Python available for defining your build. ### Cons Slow. Requires you to pass your configuration settings on every invocation. That is, if you do `scons OPT1 OPT2` and then just `scons`, it will reconfigure everything without settings `OPT1` and `OPT2`. Every other build system remembers build options from the previous invocation. ## Bazel ### Pros Proven to scale to very large projects. ### Cons Implemented in Java. Poor Windows support. Heavily focused on Google's way of doing things (which may be a good or a bad thing). Contributing code requires [signing a CLA](https://bazel.build/contributing.html). ## Meson ### Pros The fastest build system [see measurements](Performance-comparison.md), user friendly, designed to be as invisible to the developer as possible, native support for modern tools (precompiled headers, coverage, Valgrind etc). Not Turing complete so build definition files are easy to read and understand. ### Cons Relatively new so it does not have a large user base yet, and may thus contain some unknown bugs. Visual Studio and XCode backends not as high quality as Ninja one. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Modules.md0000644000175000017500000000121214737503617022766 0ustar buildbuild--- short-description: Meson modules for common build operations ... # Modules In addition to core language features, Meson also provides a module system aimed at providing helper methods for common build operations. Using modules is simple, first you import them: ```meson mymod = import('somemodule') ``` After this you can use the returned object to use the functionality provided: ```meson mymod.do_something('text argument') ``` Meson has a selection of modules to make common requirements easy to use. Modules can be thought of like the standard library of a programming language. Currently Meson provides the modules listed on subpages. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Release-notes-for-1.2.0.md0000644000175000017500000001502714737503617025315 0ustar buildbuild--- title: Release 1.2.0 short-description: Release notes for 1.2.0 ... # New features Meson 1.2.0 was released on 17 July 2023 ## Added Metrowerks C/C++ toolchains Added support for the Metrowerks Embedded ARM and Metrowerks Embedded PowerPC toolchains (https://www.nxp.com/docs/en/reference-manual/CWMCUKINCMPREF.pdf). The implementation is somewhat experimental. It has been tested on a few projects and works fairly well, but may have issues. ## Added str.splitlines method [[str.splitlines]] can now be used to split a string into an array of lines. ## `generator.process(generator.process(...))` Added support for code like this: ```meson gen1 = generator(...) gen2 = generator(...) gen2.process(gen1.process('input.txt')) ``` ## Extra files keyword in `declare_dependency` `declare_dependency` have a new `extra_files` keyword, to add extra files to a target. It is used mostly for IDE integration. ## Added a new '--genvslite' option for use with 'meson setup ...' To facilitate a more usual visual studio work-flow of supporting and switching between multiple build configurations (buildtypes) within the same solution, among other [reasons](https://github.com/mesonbuild/meson/pull/11049), use of this new option has the effect of setting up multiple ninja back-end-configured build directories, named with their respective buildtype suffix. E.g. 'somebuilddir_debug', 'somebuilddir_release', etc. as well as a '_vs'-suffixed directory that contains the generated multi-buildtype solution. Building/cleaning/rebuilding in the solution now launches the meson build (compile) of the corresponding buildtype-suffixed build directory, instead of using Visual Studio's native engine. ## `gnome.generate_gir()` now supports `env` kwarg `gnome.generate_gir()` now accepts the `env` kwarg which lets you set environment variables. ## More data in introspection files - Used compilers are listed in `intro-compilers.json` - Informations about `host`, `build` and `target` machines are lister in `intro-machines.json` - `intro-dependencies.json` now includes internal dependencies, and relations between dependencies. - `intro-targets.json` now includes dependencies, `vs_module_defs`, `win_subsystem`, and linker parameters. ## Machine objects get `kernel` and `subsystem` properties Meson has traditionally provided a `system` property to detect the system being run on. However this is not enough to reliably differentiate between e.g. an iOS platform from a watchOS one. Two new properties, namely `kernel` and `subsystem` have been added so these setups can be reliably detected. These new properties are not necessary in cross files for now, but if they are not defined and a build file tries to access them, Meson will exit with a hard error. It is expected that at some point in the future defining the new properties will become mandatory. ## default_options and override_options may now be dictionaries Instead of passing them as `default_options : ['key=value']`, they can now be passed as `default_options : {'key': 'value'}`, and the same for `override_options`. ## New override of `find_program('meson')` In some cases, it has been useful for build scripts to access the Meson command used to invoke the build script. This has led to various ad-hoc solutions that can be very brittle and project-specific. ```meson meson_prog = find_program('meson') ``` This call will supply the build script with an external program pointing at the invoked Meson. Because Meson also uses `find_program` for program lookups internally, this override will also be handled in cases similar to the following: ```meson custom_target( # ... command: [ 'meson', ], # ... ) run_command( 'meson', # ... ) run_target( 'tgt', command: [ 'meson', # ... ] ) ``` ## Find more specific python version on Windows You can now use `python3.x`, where `x` is the minor version, to find a more specific version of python on Windows, when using the python module. On other platforms, it was already working as `python3.x` is the executable name. ## Python module can now compile bytecode A new builtin option is available: `-Dpython.bytecompile=2`. It can be used to compile bytecode for all pure python files installed via the python module. ## rust.bindgen allows passing extra arguments to rustc This may be necessary to pass extra `cfg`s or to change warning levels. ## Support for defining crate names of Rust dependencies in Rust targets Rust supports defining a different crate name for a dependency than what the actual crate name during compilation of that dependency was. This allows using multiple versions of the same crate at once, or simply using a shorter name of the crate for convenience. ```meson a_dep = dependency('some-very-long-name') my_executable = executable('my-executable', 'src/main.rs', rust_dependency_map : { 'some_very_long_name' : 'a', }, dependencies : [a_dep], ) ``` ## A machine file may be used to pass extra arguments to clang in a bindgen call Because of the way that bindgen proxies arguments to clang the only choice to add extra arguments currently is to wrap bindgen in a script, since the arguments must come after a `--`. This is inelegant, and not very portable. Now a `bindgen_clang_arguments` field may be placed in the machine file for the host machine, and these arguments will be added to every bindgen call for clang. This is intended to be useful for things like injecting `--target` arguments. ## Add a `link_with` keyword to `rust.test()` This can already be be worked around by creating `declare_dependency()` objects to pass to the `dependencies` keyword, but this cuts out the middle man. ## Rust now supports the b_ndebug option Which controls the `debug_assertions` cfg, which in turn controls `debug_assert!()` macro. This macro is roughly equivalent to C's `assert()`, as it can be toggled with command line options, unlike Rust's `assert!()`, which cannot be turned off, and is not designed to be. ## Wildcards in list of tests to run The `meson test` command now accepts wildcards in the list of test names. For example `meson test basic*` will run all tests whose name begins with "basic". meson will report an error if the given test name does not match any existing test. meson will log a warning if two redundant test names are given (for example if you give both "proj:basic" and "proj:"). ## New for the generation of Visual Studio vcxproj projects When vcxproj is generated, another file vcxproj.filters is generated in parallel. It enables to set a hierarchy of the files inside the solution following their place on filesystem. muon-v0.4.0/subprojects/meson-docs/docs/markdown/External-commands.md0000644000175000017500000000362314737503617024747 0ustar buildbuild--- short-description: Running external commands ... # External commands As a part of the software configuration, you may want to get extra data by running external commands. The basic syntax is the following. ```meson r = run_command('command', 'arg1', 'arg2', 'arg3', check: true) output = r.stdout().strip() errortxt = r.stderr().strip() ``` If `check: true` is given, meson will error out if `command` returns with a non-zero exit code. Alternatively, you can set `check: false` and get the exit code with `r.returncode()`. Since 0.52.0, you can pass the command environment as a dictionary: ```meson run_command('command', 'arg1', 'arg2', env: {'FOO': 'bar'}, check: true) ``` Since 0.50.0, you can also pass the command [[@env]] object: ```meson env = environment() env.set('FOO', 'bar') run_command('command', 'arg1', 'arg2', env: env) ``` The `run_command` function returns an object that can be queried for return value and text written to stdout and stderr. The `strip` method call is used to strip trailing and leading whitespace from strings. Usually output from command line programs ends in a newline, which is unwanted in string variables. The first argument can be either a string or an executable you have detected earlier with `find_program`. Meson will autodetect scripts with a shebang line and run them with the executable/interpreter specified in it both on Windows and on Unixes. Note that you cannot pass your command line as a single string. That is, calling `run_command('do_something foo bar')` will not work. You must either split up the string into separate arguments or pass the split command as an array. It should also be noted that Meson will not pass the command to the shell, so any command lines that try to use things such as environment variables, backticks or pipelines will not work. If you require shell semantics, write your command into a script file and call that with `run_command`. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Porting-from-autotools.md0000644000175000017500000005045014737503617026000 0ustar buildbuild# Porting from Autotools This page uses [AppStream-glib](https://github.com/hughsie/appstream-glib/) as an example project. AppStream-Glib contains some libraries, GObject Introspection data, tests, man pages, i18n, bash-completion with optional flags to build/not build support for some things. Meson comes with a helper script `ac_converter` that you can use to convert the basic autoconf checks for your project. ## Configure.ac First let's look at `configure.ac` and write the same in `meson.build`. ```autoconf AC_PREREQ(2.63) ``` Meson doesn't provide the same function, so just ignore this. ### Defining variables `configure.ac`: ```autoconf m4_define([as_major_version], [0]) m4_define([as_minor_version], [3]) m4_define([as_micro_version], [6]) m4_define([as_version], [as_major_version.as_minor_version.as_micro_version]) ``` `meson.build`: ```meson as_version = meson.project_version() # set in project() below ver_arr = as_version.split('.') as_major_version = ver_arr[0] as_minor_version = ver_arr[1] as_micro_version = ver_arr[2] ``` ### Initializing project and setting compilers `configure.ac`: ```autoconf AC_INIT([appstream-glib],[as_version]) AC_PROG_CC ``` `meson.build`: ```meson project('appstream-glib', 'c', version : '0.3.6') ``` Note that this must be the first line of your `meson.build` file. ### AC_SUBST `configure.ac`: ```autoconf AC_SUBST(AS_MAJOR_VERSION) AC_SUBST(AS_MINOR_VERSION) AC_SUBST(AS_MICRO_VERSION) AC_SUBST(AS_VERSION) ``` You don't need to do the same in Meson, because it does not have two different types of files (Makefile, configure). ### Auto headers `configure.ac`: ```autoconf AC_CONFIG_HEADERS([config.h]) ``` `meson.build`: ```meson conf = configuration_data() # Surround the version in quotes to make it a C string conf.set_quoted('VERSION', as_version) configure_file(output : 'config.h', configuration : conf) ``` Meson doesn't support autoheaders, you need to manually specify what do you want to see in header file, write `configuration_data()` object and use `configure_file()`. You can also substitute variables of type `@SOME_VAR@` with configure data. The details are on the [configuration page](Configuration.md). ### Finding programs `configure.ac`: ```autoconf AC_PATH_PROG(GPERF, [gperf], [no]) if test x$GPERF != xno ; then AC_DEFINE(HAVE_GPERF,[1], [Use gperf]) fi AM_CONDITIONAL(HAVE_GPERF, [test x$GPERF != xno]) ``` `meson.build`: ```meson gperf = find_program('gperf', required : false) if gperf.found() conf.set('HAVE_GPERF', 1) endif ``` ### Finding pkg-config modules `configure.ac`: ```autoconf PKG_CHECK_MODULES(SOUP, libsoup-2.4 >= 2.24) ``` `meson.build`: ```meson soup = dependency('libsoup-2.4', version : '>= 2.24') ``` ### Arguments `configure.ac`: ```autoconf AC_ARG_ENABLE(dep11, AS_HELP_STRING([--enable-dep11],[enable DEP-11]), enable_dep11=$enableval,enable_dep11=yes) AM_CONDITIONAL(HAVE_DEP11, test x$enable_dep11 = xyes) if test x$enable_dep11 = xyes; then AC_CHECK_HEADER(yaml.h, [], [AC_MSG_ERROR([No yaml.h])]) YAML_LIBS="-lyaml" AC_SUBST(YAML_LIBS) AC_DEFINE(AS_BUILD_DEP11,1,[Build DEP-11 code]) fi ``` `meson.build`: ```meson if get_option('enable-dep11') yaml = dependency('yaml-0.1') conf.set('AS_BUILD_DEP11', 1) else yaml = dependency('yaml-0.1', required : false) endif ``` `meson.options`: ```meson option('enable-dep11', type : 'boolean', value : true, description : 'enable DEP-11') ``` ## Makefile.am Next step is `Makefile.am`. In Meson you don't need to have other file, you still use `meson.build`. ### Sub directories `Makefile.am`: ```make SUBDIRS = \ libappstream-glib ``` `meson.build`: ```meson subdir('libappstream-glib') ``` ### *CLEANFILES, EXTRA_DIST, etc. `Makefile.am`: ```make DISTCLEANFILES = \ appstream-glib-*.tar.xz MAINTAINERCLEANFILES = \ *~ \ ABOUT-NLS \ aclocal.m4 \ ChangeLog \ compile \ config.guess \ config.h.* \ config.rpath EXTRA_DIST = \ COPYING \ MAINTAINERS \ AUTHORS \ README.md \ NEWS \ autogen.sh \ config.h ``` In Meson you don't need have `*CLEANFILES`, because in Meson you are building in temporary directory (usually called `build`), you manually removing it. You also not need to use `EXTRA_DIST`, because you will make tarballs via `git archive` or something like this. ### glib-compile-resources `Makefile.am`: ```make as-resources.c: appstream-glib.gresource.xml \ as-stock-icons.txt \ as-license-ids.txt \ as-blacklist-ids.txt \ as-category-ids.txt \ as-environment-ids.txt $(AM_V_GEN) \ glib-compile-resources \ --sourcedir=$(srcdir) \ --sourcedir=$(top_builddir)/data \ --target=$@ \ --generate-source \ --c-name as \ $(srcdir)/appstream-glib.gresource.xml as-resources.h: appstream-glib.gresource.xml \ as-stock-icons.txt \ as-license-ids.txt \ as-blacklist-ids.txt \ as-category-ids.txt \ as-environment-ids.txt $(AM_V_GEN) \ glib-compile-resources \ --sourcedir=$(srcdir) \ --sourcedir=$(top_builddir)/data \ --target=$@ \ --generate-header \ --c-name as \ $(srcdir)/appstream-glib.gresource.xml BUILT_SOURCES = \ as-resources.c \ as-resources.h ``` `meson.build`: ```meson asresources = gnome.compile_resources( 'as-resources', 'appstream-glib.gresource.xml', source_dir : '.', c_name : 'as') ``` ### Headers `Makefile.am`: ```make libappstream_glib_includedir = $(includedir)/libappstream-glib libappstream_glib_include_HEADERS = \ appstream-glib.h \ as-app.h \ as-bundle.h \ as-enums.h \ as-icon.h \ as-image.h \ as-inf.h \ as-node.h \ as-problem.h \ as-provide.h \ as-release.h \ as-screenshot.h \ as-store.h \ as-tag.h \ as-utils.h \ as-version.h ``` `meson.build`: ```meson headers = [ 'appstream-glib.h', 'as-app.h', 'as-bundle.h', 'as-enums.h', 'as-icon.h', 'as-image.h', 'as-inf.h', 'as-node.h', 'as-problem.h', 'as-provide.h', 'as-release.h', 'as-screenshot.h', 'as-store.h', 'as-tag.h', 'as-utils.h', 'as-version.h'] install_headers(headers, subdir : 'libappstream-glib') ``` ### Libraries `Makefile.am`: ```make lib_LTLIBRARIES = \ libappstream-glib.la libappstream_glib_la_SOURCES = \ as-app.c \ as-app-desktop.c \ as-app-inf.c \ as-app-private.h \ as-app-validate.c \ as-bundle.c \ as-bundle-private.h \ as-cleanup.h \ as-enums.c \ as-icon.c \ as-icon-private.h \ as-image.c \ as-image-private.h \ as-inf.c \ as-inf.h \ as-node.c \ as-node-private.h \ as-problem.c \ as-problem.h \ as-provide.c \ as-provide-private.h \ as-release.c \ as-release-private.h \ as-resources.c \ as-resources.h \ as-screenshot.c \ as-screenshot-private.h \ as-store.c \ as-tag.c \ as-utils.c \ as-utils-private.h \ as-version.h \ as-yaml.c \ as-yaml.h libappstream_glib_la_LIBADD = \ $(GLIB_LIBS) \ $(GDKPIXBUF_LIBS) \ $(LIBARCHIVE_LIBS) \ $(SOUP_LIBS) \ $(YAML_LIBS) libappstream_glib_la_LDFLAGS = \ -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ -export-dynamic \ -no-undefined \ -export-symbols-regex '^as_.*' ``` `meson.build`: ```meson sources = [ 'as-app.c', 'as-app-desktop.c', 'as-app-inf.c', 'as-app-private.h', 'as-app-validate.c', 'as-bundle.c', 'as-bundle-private.h', 'as-cleanup.h', 'as-enums.c', 'as-icon.c', 'as-icon-private.h', 'as-image.c', 'as-image-private.h', 'as-inf.c', 'as-inf.h', 'as-node.c', 'as-node-private.h', 'as-problem.c', 'as-problem.h', 'as-provide.c', 'as-provide-private.h', 'as-release.c', 'as-release-private.h', asresources, 'as-screenshot.c', 'as-screenshot-private.h', 'as-store.c', 'as-tag.c', 'as-utils.c', 'as-utils-private.h', 'as-version.h', 'as-yaml.c', 'as-yaml.h'] deps = [glib, gdkpixbuf, libarchive, soup, yaml] mapfile = 'appstream-glib.map' vflag = '-Wl,--version-script,@0@/@1@'.format(meson.current_source_dir(), mapfile) asglib = shared_library( 'appstream-glib', sources, soversion : lt_current, version : lt_version, dependencies : deps, include_directories : include_directories('@0@/..'.format(meson.current_build_dir())), link_args : ['-Wl,--no-undefined', vflag], link_depends : mapfile, install : true) ``` `appstream-glib.map`: ``` { global: as_*; local: *; }; ``` ### Custom targets `Makefile.am`: ```make if HAVE_GPERF as-tag-private.h: as-tag.gperf $(AM_V_GEN) gperf < $< > $@ libappstream_glib_la_SOURCES += as-tag-private.h BUILT_SOURCES += as-tag-private.h endif ``` `meson.build`: ```meson if gperf.found() astagpriv = custom_target('gperf as-tag', output : 'as-tag-private.h', input : 'as-tag.gperf', command : [gperf, '@INPUT@', '--output-file', '@OUTPUT@']) sources = sources + [astagpriv] endif ``` ### Global CFLAGS `Makefile.am`: ```make AM_CPPFLAGS = \ -DAS_COMPILATION \ -DLOCALSTATEDIR=\""$(localstatedir)"\" \ -DG_LOG_DOMAIN=\"As\" ``` `meson.build`: ```meson add_project_arguments('-DG_LOG_DOMAIN="As"', language : 'c') add_project_arguments('-DAS_COMPILATION', language : 'c') add_project_arguments('-DLOCALSTATEDIR="/var"', language : 'c') ``` ### Tests `Makefile.am`: ```make check_PROGRAMS = \ as-self-test as_self_test_SOURCES = \ as-self-test.c as_self_test_LDADD = \ $(GLIB_LIBS) \ $(GDKPIXBUF_LIBS) \ $(LIBARCHIVE_LIBS) \ $(SOUP_LIBS) \ $(YAML_LIBS) \ $(lib_LTLIBRARIES) as_self_test_CFLAGS = -DTESTDATADIR=\""$(top_srcdir)/data/tests"\" TESTS = as-self-test ``` `meson.build`: ```meson selftest = executable( 'as-self-test', 'as-self-test.c', include_directories : include_directories('@0@/..'.format(meson.current_build_dir())), dependencies : deps, c_args : '-DTESTDATADIR="@0@/../data/tests"'.format(meson.current_source_dir()), link_with : asglib) test('as-self-test', selftest) ``` ### GObject Introspection `Makefile.am`: ```make introspection_sources = \ as-app.c \ as-app-validate.c \ as-app.h \ as-bundle.c \ as-bundle.h \ as-enums.c \ as-enums.h \ as-icon.c \ as-icon.h \ as-image.c \ as-image.h \ as-inf.c \ as-inf.h \ as-node.c \ as-node.h \ as-problem.c \ as-problem.h \ as-provide.c \ as-provide.h \ as-release.c \ as-release.h \ as-screenshot.c \ as-screenshot.h \ as-store.c \ as-store.h \ as-tag.c \ as-tag.h \ as-utils.c \ as-utils.h \ as-version.h AppStreamGlib-1.0.gir: libappstream-glib.la AppStreamGlib_1_0_gir_INCLUDES = GObject-2.0 Gio-2.0 GdkPixbuf-2.0 AppStreamGlib_1_0_gir_CFLAGS = $(AM_CPPFLAGS) AppStreamGlib_1_0_gir_SCANNERFLAGS = --identifier-prefix=As \ --symbol-prefix=as_ \ --warn-all \ --add-include-path=$(srcdir) AppStreamGlib_1_0_gir_EXPORT_PACKAGES = appstream-glib AppStreamGlib_1_0_gir_LIBS = libappstream-glib.la AppStreamGlib_1_0_gir_FILES = $(introspection_sources) INTROSPECTION_GIRS += AppStreamGlib-1.0.gir girdir = $(datadir)/gir-1.0 gir_DATA = $(INTROSPECTION_GIRS) typelibdir = $(libdir)/girepository-1.0 typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib) CLEANFILES += $(gir_DATA) $(typelib_DATA) ``` `meson.build`: ```meson introspection_sources = [ 'as-app.c', 'as-app-validate.c', 'as-app.h', 'as-bundle.c', 'as-bundle.h', 'as-enums.c', 'as-enums.h', 'as-icon.c', 'as-icon.h', 'as-image.c', 'as-image.h', 'as-inf.c', 'as-inf.h', 'as-node.c', 'as-node.h', 'as-problem.c', 'as-problem.h', 'as-provide.c', 'as-provide.h', 'as-release.c', 'as-release.h', 'as-screenshot.c', 'as-screenshot.h', 'as-store.c', 'as-store.h', 'as-tag.c', 'as-tag.h', 'as-utils.c', 'as-utils.h', 'as-version.h'] gnome.generate_gir(asglib, sources : introspection_sources, nsversion : '1.0', namespace : 'AppStreamGlib', symbol_prefix : 'as_', identifier_prefix : 'As', export_packages : 'appstream-glib', includes : ['GObject-2.0', 'Gio-2.0', 'GdkPixbuf-2.0'], install : true ) ``` ### GSettings `configure.ac`: ```sh GLIB_GSETTINGS ``` `Makefile.am`: ```make gsettings_SCHEMAS = foo.gschema.xml @GSETTINGS_RULES@ ``` `meson.build`: ```meson install_data('foo.gschema.xml', install_dir: get_option('datadir') / 'glib-2.0' / 'schemas') meson.add_install_script('meson_post_install.py') ``` `meson_post_install.py`: ```python #!/usr/bin/env python3 import os import subprocess schemadir = os.path.join(os.environ['MESON_INSTALL_PREFIX'], 'share', 'glib-2.0', 'schemas') if not os.environ.get('DESTDIR'): print('Compiling gsettings schemas...') subprocess.call(['glib-compile-schemas', schemadir]) ``` ### gettext Note this example does not include `intltool` usage. `configure.ac`: ```m4 AM_GNU_GETTEXT([external]) AM_GNU_GETTEXT_VERSION([0.19.7]) GETTEXT_PACKAGE=foo AC_SUBST(GETTEXT_PACKAGE) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [The prefix for our gettext translation domains.]) ``` `po/Makevars`: ```make XGETTEXT_OPTIONS = --from-code=UTF-8 --keyword=_ --keyword=N_ --keyword=C_:1c,2 --keyword=NC_:1c,2 --keyword=g_dngettext:2,3 --add-comments ``` `Makefile.am`: ```make %.desktop: %.desktop.in $(AM_V_GEN)$(MSGFMT) --desktop --template $< -d $(top_srcdir)/po -o $@ %.appdata.xml: %.appdata.xml.in $(AM_V_GEN)$(MSGFMT) --xml --template $< -d $(top_srcdir)/po -o $@ ``` `meson.build`: ```meson i18n = import('i18n') gettext_package = 'foo' add_project_arguments('-DGETTEXT_PACKAGE=' + gettext_package, language: 'c') subdir('po') i18n.merge_file( input: 'foo.desktop.in', output: 'foo.desktop', type: 'desktop', po_dir: 'po', install: true, install_dir: get_option('datadir') / 'applications' ) i18n.merge_file( input: 'foo.appdata.xml.in', output: 'foo.appdata.xml', po_dir: 'po', install: true, install_dir: get_option('datadir') / 'appdata' ) ``` `po/meson.build`: ```meson i18n.gettext(gettext_package, preset: 'glib') ``` muon-v0.4.0/subprojects/meson-docs/docs/markdown/ARM-performance-test.md0000644000175000017500000000716614737503617025267 0ustar buildbuild# Arm performance test Performance differences in build systems become more apparent on slower platforms. To examine this difference we compared the performance of Meson with GNU Autotools. We took the GLib software project and rewrote its build setup with Meson. GLib was chosen because it is a relatively large C code base which requires lots of low level configuration. The Meson version of the build system is not fully equivalent to the original Autotools one. It does not do all the same configuration steps and does not build all the same targets. The biggest missing piece being internationalisation support with Gettext. However it does configure the system enough to build all C source and run all unit tests. All measurements were done on a Nexus 4 smart phone running the latest Ubuntu touch image (updated on September 9th 2013). Measurements ------ The first thing we measured was the time it took to run the configure step. ![GLib config time](images/glib_conf.png) Meson takes roughly 20 seconds whereas Autotools takes 220. This is a difference of one order of magnitude. Autotools' time contains both autogen and configure. Again it should be remembered that Meson does not do all the configure steps that Autotools does. It does do about 90% of them and it takes just 10% of the time to do it. Then we measured the build times. Two parallel compilation processes were used for both systems. ![GLib build time](images/glib_build.png) On desktop machines Ninja based build systems are 10-20% faster than Make based ones. On this platform the difference grows to 50%. The difference is probably caused by Make's inefficient disk access patterns. Ninja is better at keeping both cores running all the time which yields impressive performance improvements. ![GLib no-op time](images/glib_empty.png) Next we measured the "empty build" case. That is, how long does it take for the build system to detect that no changes need to be made. This is one of the most important metrics of build systems because it places a hard limit on how fast you can iterate on your code. Autotools takes 14 seconds to determine that no work needs to be done. Meson (or, rather, Ninja) takes just one quarter of a second. ![GLib link time](images/glib_link.png) One step which takes quite a lot of time is linking. A common case is that you are working on a library and there are tens of small test executables that link to it. Even if the compilation step would be fast, relinking all of the test executables takes time. It is common for people to manually compile only one test application with a command such as `make sometest` rather than rebuild everything. Meson has an optimization for this case. Whenever a library is rebuilt, Meson inspects the ABI it exports. If it has not changed, Meson will skip all relinking steps as unnecessary. The difference this makes can be clearly seen in the chart above. In that test the source was fully built, then the file `glib/gbytes.c` was touched to force the rebuild of the base glib shared library. As can be seen, Autotools then relinks all test executables that link with glib. Since Meson can detect that the ABI is the same it can skip those steps. The end result being that Meson is almost one hundred times faster on this very common use case. Conclusions ----- One of the main drawbacks of C and C++ compared to languages such as Java are long compilation times. However at least some of the blame can be found in the build tools used rather than the languages themselves or their compilers. Choosing proper tools can bring C and C++ compilation very close to instantaneous rebuilds. This has a direct impact on programmer productivity. muon-v0.4.0/subprojects/meson-docs/docs/markdown/SimpleStart.md0000644000175000017500000001201114737503617023624 0ustar buildbuild--- short-description: Simple getting started guide ... # The Absolute Beginner's Guide to Installing and Using Meson This page is meant for people who are new to using Meson and possibly even to compiling C and/or C++ code in general. It is meant to contain one simple way of getting your build environment up and running. If you are more experienced and have your own preferred way of installing and using development software, feel free to use that instead. This guide only deals with Linux, Windows and macOS platforms. If you use some other platform, such as one of the BSDs, you probably already know how to install development tools on it (probably better than we do, even). There are three phases to getting a development environment running. 1. Installing a compiler toolchain 2. Installing Meson 3. Creating a project and building it ## Installing a compiler toolchain ### Linux All Linux distributions provide easy access to development tools. Typically you need to open a terminal and execute one command, which depends on your distro. - Debian, Ubuntu and derivatives: `sudo apt install build-essential` - Fedora, Centos, RHEL and derivatives: `sudo dnf install gcc-c++` - Arch: `sudo pacman -S gcc` ### Windows The most common development toolchain on Windows is Visual Studio, which can be downloaded from [the Visual Studio web site](https://visualstudio.microsoft.com/). Select the Community version unless you have bought a license. ![Download page of Visual Studio](images/win_dlvs.png) Download the installer and run it. When you are given a list of things to install, select *Desktop development with C++*. This installs both a C and a C++ compiler. ![Installing the Visual Studio compilers](images/win_installvs.png) Once the installer finishes the compiler toolchain is ready to use. ### macOS On macOS the development toolchain must be installed via the Mac app store. Search for an app called XCode and install it. ![App store page for XCode](images/osx_xcode.png) *Note:* Installing XCode is not sufficient by itself. You also need to start XCode' GUI application once. This will make XCode download and install more files that are needed for compilation. ## Installing Meson ### Linux Installing Meson is just as simple as installing the compiler toolchain. - Debian, Ubuntu and derivatives: `sudo apt install meson ninja-build` - Fedora, Centos, RHEL and derivatives: `sudo dnf install meson ninja-build` - Arch: `sudo pacman -S meson` ### Windows Meson provides a standard Windows `.msi` installer that can be downloaded from [the Releases page](https://github.com/mesonbuild/meson/releases). ![Meson installed download](images/win_downloadmeson.png) Download and run it to install all the necessary bits. You can verify that your installation is working by running the Visual Studio developer tools command prompt that can be found in the start menu. ![Devtool prompt](images/win_vstoolsprompt.png) You should be able to run both `meson` and `ninja` and query their versions. ![A working Windows install](images/win_working.png) ### macOS #### With Homebrew `brew install meson ninja` #### Without Homebrew Start by downloading the installation package from [the Releases page](https://github.com/mesonbuild/meson/releases). ![Downloading the macOS installer](images/meson_mac1.png) Double click the downloaded installer to start. If you are running a new macOS version, it might refuse to run the application with the following error message: ![A macOS signing warning](images/meson_mac2.png) This can be fixed by starting System Preferences, selecting the Security and Privacy entry. At the bottom it shows the blocked app and you can enable it by clicking on the "Open anyway" button. ![Security settings](images/meson_mac3.png) Now the installer should start. If not, double click on the downloaded installer file again. ![Installer running](images/meson_mac4.png) Once the installation is finished you can verify that the system is working via the terminal app. ![A successful install](images/meson_mac5.png) ## Running Meson Start a terminal application. On Windows you have to use the Visual Studio Developer Tools Command Prompt as discussed above, because the compilers are only available in that terminal. You also need to change into your home directory (Linux and macOS terminals start in the home directory by default). cd \users\username Create a new directory to hold your project. mkdir testproject cd testproject Use Meson to create and build a new sample project. meson init --name testproject --build This will create a project skeleton for you and compile it. The result is put in the `build` subdirectory and can be run directly from there. build/testproject ![All finished and ready to go](images/linux_alldone.png) The project is now ready for development. You can edit the code with any editor and it is rebuilt by going in the `build` subdirectory and executing the `meson compile` command. If your version of Meson is too old, you can compile the project by running the command `ninja` instead. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Unit-tests.md0000644000175000017500000002362614737503617023452 0ustar buildbuild--- short-description: Meson's own unit-test system ... # Unit tests Meson comes with a fully functional unit test system. To use it simply build an executable and then use it in a test. ```meson e = executable('prog', 'testprog.c') test('name of test', e) ``` You can add as many tests as you want. They are run with the command `meson test`. Meson captures the output of all tests and writes it in the log file `meson-logs/testlog.txt`. ## Test parameters Some tests require the use of command line arguments or environment variables. These are simple to define. ```meson test('command line test', exe, args : ['first', 'second']) test('envvar test', exe2, env : ['key1=value1', 'key2=value2']) ``` Note how you need to specify multiple values as an array. ### MALLOC_PERTURB_ By default, environment variable [`MALLOC_PERTURB_`](http://man7.org/linux/man-pages/man3/mallopt.3.html) is set to a random value between 1..255. This can help find memory leaks on configurations using glibc, including with non-GCC compilers. This feature can be disabled as discussed in [[test]]. ### ASAN_OPTIONS, UBSAN_OPTIONS, and MSAN_OPTIONS By default, the environment variables `ASAN_OPTIONS`, `UBSAN_OPTIONS`, and `MSAN_OPTIONS` are set to enable aborting on detected violations and to give a backtrace. This feature can be disabled as discussed in [[test]]. ## Coverage If you enable coverage measurements by giving Meson the command line flag `-Db_coverage=true`, you can generate coverage reports after running the tests (running the tests is required to gather the list of functions that get called). Meson will autodetect what coverage generator tools you have installed and will generate the corresponding targets. These targets are `coverage-xml` and `coverage-text` which are both provided by [Gcovr](http://gcovr.com) (version 3.3 or higher) `coverage-sonarqube` which is provided by [Gcovr](http://gcovr.com) (version 4.2 or higher) and `coverage-html`, which requires [lcov](https://github.com/linux-test-project/lcov) and [GenHTML](https://linux.die.net/man/1/genhtml) or [Gcovr](http://gcovr.com). As a convenience, a high-level `coverage` target is also generated which will produce all 3 coverage report types, if possible. The output of these commands is written to the log directory `meson-logs` in your build directory. ## Parallelism To reduce test times, Meson will by default run multiple unit tests in parallel. It is common to have some tests which cannot be run in parallel because they require unique hold on some resource such as a file or a D-Bus name. You have to specify these tests with a keyword argument. ```meson test('unique test', t, is_parallel : false) ``` Meson will then make sure that no other unit test is running at the same time. Non-parallel tests take longer to run so it is recommended that you write your unit tests to be parallel executable whenever possible. By default Meson uses as many concurrent processes as there are cores on the test machine. You can override this with the environment variable `MESON_TESTTHREADS` like this. ```console $ MESON_TESTTHREADS=5 meson test ``` ## Priorities *(added in version 0.52.0)* Tests can be assigned a priority that determines when a test is *started*. Tests with higher priority are started first, tests with lower priority started later. The default priority is 0, Meson makes no guarantee on the ordering of tests with identical priority. ```meson test('started second', t, priority : 0) test('started third', t, priority : -50) test('started first', t, priority : 1000) ``` Note that the test priority only affects the starting order of tests and subsequent tests are affected by how long it takes previous tests to complete. It is thus possible that a higher-priority test is still running when lower-priority tests with a shorter runtime have completed. ## Skipped tests and hard errors Sometimes a test can only determine at runtime that it cannot be run. For the default `exitcode` testing protocol, the GNU standard approach in this case is to exit the program with error code 77. Meson will detect this and report these tests as skipped rather than failed. This behavior was added in version 0.37.0. For TAP-based tests, skipped tests should print a single line starting with `1..0 # SKIP`. In addition, sometimes a test fails set up so that it should fail even if it is marked as an expected failure. The GNU standard approach in this case is to exit the program with error code 99. Again, Meson will detect this and report these tests as `ERROR`, ignoring the setting of `should_fail`. This behavior was added in version 0.50.0. ## Testing tool The goal of the Meson test tool is to provide a simple way to run tests in a variety of different ways. The tool is designed to be run in the build directory. The simplest thing to do is just to run all tests. ```console $ meson test ``` ### Run subsets of tests For clarity, consider the meson.build containing: ```meson test('A', ..., suite: 'foo') test('B', ..., suite: ['foo', 'bar']) test('C', ..., suite: 'bar') test('D', ..., suite: 'baz') ``` Specify test(s) by name like: ```console $ meson test A D ``` You can run tests from specific (sub)project: ```console $ meson test (sub)project_name: ``` or a specific test in a specific project: ```console $ meson test (sub)project_name:test_name ``` Since version *1.2.0*, you can use wildcards in project and test names. For instance, to run all tests beginning with "foo" and all tests from projects beginning with "bar": ```console $ meson test "foo*" "bar*:" ``` Tests belonging to a suite `suite` can be run as follows ```console $ meson test --suite (sub)project_name:suite ``` Since version *0.46*, `(sub)project_name` can be omitted if it is the top-level project. Multiple suites are specified like: ```console $ meson test --suite foo --suite bar ``` NOTE: If you choose to specify both suite(s) and specific test name(s), the test name(s) must be contained in the suite(s). This however is redundant-- it would be more useful to specify either specific test names or suite(s). ### Other test options Sometimes you need to run the tests multiple times, which is done like this: ```console $ meson test --repeat=10 ``` Meson will set the `MESON_TEST_ITERATION` environment variable to the current iteration of the test *(added 1.5.0)*. Invoking tests via a helper executable such as Valgrind can be done with the `--wrap` argument ```console $ meson test --wrap=valgrind testname ``` Arguments to the wrapper binary can be given like this: ```console $ meson test --wrap='valgrind --tool=helgrind' testname ``` Meson also supports running the tests under GDB. Just doing this: ```console $ meson test --gdb testname ``` Meson will launch `gdb` all set up to run the test. Just type `run` in the GDB command prompt to start the program. The second use case is a test that segfaults only rarely. In this case you can invoke the following command: ```console $ meson test --gdb --repeat=10000 testname ``` This runs the test up to 10 000 times under GDB automatically. If the program crashes, GDB will halt and the user can debug the application. Note that testing timeouts are disabled in this case so `meson test` will not kill `gdb` while the developer is still debugging it. The downside is that if the test binary freezes, the test runner will wait forever. Sometimes, the GDB binary is not in the PATH variable or the user wants to use a GDB replacement. Therefore, the invoked GDB program can be specified *(added 0.52.0)*: ```console $ meson test --gdb --gdb-path /path/to/gdb testname ``` ```console $ meson test --print-errorlogs ``` Running tests interactively can be done with the `--interactive` option. `meson test --interactive` invokes tests with stdout, stdin and stderr connected directly to the calling terminal. This can be useful if your test is an integration test running in a container or virtual machine where a debug shell is spawned if it fails *(added 1.5.0)*: ```console $ meson test --interactive testname ``` Meson will report the output produced by the failing tests along with other useful information as the environmental variables. This is useful, for example, when you run the tests on Travis-CI, Jenkins and the like. By default, the output from tests will be limited to the last 100 lines. The maximum number of lines to show can be configured with the `--max-lines` option *(added 1.5.0)*: ```console $ meson test --max-lines=1000 testname ``` **Timeout** In the test case options, the `timeout` option is specified in a number of seconds. To disable timeout in test cases, add `timeout: 0` or a negative value to allow infinite duration for the test case to complete. For running tests, you can specify a command line argument for overriding the timeout as well: ```console $ meson test --timeout-multiplier 0 ``` For further information see the command line help of Meson by running `meson test -h`. ## Legacy notes If `meson test` does not work for you, you likely have a old version of Meson. In that case you should call `mesontest` instead. If `mesontest` doesn't work either you have a very old version prior to 0.37.0 and should upgrade. ## Test outputs Meson will write several different files with detailed results of running tests. These will be written into $builddir/meson-logs/ ### testlog.json This is not a proper json file, but a file containing one valid json object per line. This is file is designed so each line is streamed out as each test is run, so it can be read as a stream while the test harness is running ### testlog.junit.xml This is a valid JUnit XML description of all tests run. It is not streamed out, and is written only once all tests complete running. When tests use the `tap` protocol each test will be recorded as a testsuite container, with each case named by the number of the result. When tests use the `gtest` protocol Meson will inject arguments to the test to generate its own JUnit XML, which Meson will include as part of this XML file. *New in 0.55.0* muon-v0.4.0/subprojects/meson-docs/docs/markdown/Using-with-Visual-Studio.md0000644000175000017500000000362214737503617026131 0ustar buildbuild--- short-description: How to use Meson in Visual Studio ... # Using with Visual Studio In order to generate Visual Studio projects, Meson needs to know the settings of your installed version of Visual Studio. The only way to get this information is to run Meson under the Visual Studio Command Prompt. You can always find the Visual Studio Command Prompt by searching from the Start Menu. However, the name is different for each Visual Studio version. With Visual Studio 2019, look for "x64 Native Tools Command Prompt for VS 2019". The next steps are [the same as always](https://mesonbuild.com/Running-Meson.html#configuring-the-build-directory): 1. `cd` into your source directory 1. `meson setup builddir`, which will create and setup the build directory 1. `meson compile -C builddir`, to compile your code. You can also use `ninja -C builddir` here if you are using the default Ninja backend. If you wish to generate Visual Studio project files, pass `--backend vs`. At the time of writing the Ninja backend is more mature than the VS backend so you might want to use it for serious work. # Using Clang-CL with Visual Studio *(new in 0.52.0)* You will first need to get a copy of llvm+clang for Windows, such versions are available from a number of sources, including the llvm website. Then you will need the [llvm toolset extension for visual studio](https://marketplace.visualstudio.com/items?itemName=LLVMExtensions.llvm-toolchain). You then need to either use a [native file](Native-environments.md#binaries) or `set CC=clang-cl`, and `set CXX=clang-cl` to use those compilers, Meson will do the rest. This only works with visual studio 2017 and 2019. There is currently no support in Meson for clang/c2. # Using Intel-CL (ICL) with Visual Studio *(new in 0.52.0)* To use ICL you need only have ICL installed and launch an ICL development shell like you would for the ninja backend and Meson will take care of it. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Release-notes-for-0.45.0.md0000644000175000017500000001417714737503617025410 0ustar buildbuild--- title: Release 0.45 short-description: Release notes for 0.45 ... # New features ## Python minimum version is now 3.5 Meson will from this version on require Python version 3.5 or newer. ## Config-Tool based dependencies can be specified in a cross file Tools like LLVM and pcap use a config tool for dependencies, this is a script or binary that is run to get configuration information (cflags, ldflags, etc) from. These binaries may now be specified in the `binaries` section of a cross file. ```ini [binaries] cc = ... llvm-config = '/usr/bin/llvm-config32' ``` ## Visual Studio C# compiler support In addition to the Mono C# compiler we also support Visual Studio's C# compiler. Currently this is only supported on the Ninja backend. ## Removed two deprecated features The standalone `find_library` function has been a no-op for a long time. Starting with this version it becomes a hard error. There used to be a keywordless version of `run_target` which looked like this: ```meson run_target('targetname', 'command', 'arg1', 'arg2') ``` This is now an error. The correct format for this is now: ```meson run_target('targetname', command : ['command', 'arg1', 'arg2']) ``` ## Experimental FPGA support This version adds support for generating, analysing and uploading FPGA programs using the [IceStorm toolchain](http://www.clifford.at/icestorm/). This support is experimental and is currently limited to the `iCE 40` series of FPGA chips. FPGA generation integrates with other parts of Meson seamlessly. As an example, [here](https://github.com/jpakkane/lm32) is an example project that compiles a simple firmware into Verilog and combines that with an lm32 softcore processor. ## Generator outputs can preserve directory structure Normally when generating files with a generator, Meson flattens the input files so they all go in the same directory. Some code generators, such as Protocol Buffers, require that the generated files have the same directory layout as the input files used to generate them. This can now be achieved like this: ```meson g = generator(...) # Compiles protobuf sources generated = gen.process('com/mesonbuild/one.proto', 'com/mesonbuild/two.proto', preserve_path_from : meson.current_source_dir()) ``` This would cause the following files to be generated inside the target private directory: com/mesonbuild/one.pb.h com/mesonbuild/one.pb.cc com/mesonbuild/two.pb.h com/mesonbuild/two.pb.cc ## Hexadecimal string literals Hexadecimal integer literals can now be used in build and option files. ```meson int_255 = 0xFF ``` ## b_ndebug : if-release The value `if-release` can be given for the `b_ndebug` project option. This will make the `NDEBUG` pre-compiler macro to be defined for release type builds as if the `b_ndebug` project option had the value `true` defined for it. ## `install_data()` defaults to `{datadir}/{projectname}` If `install_data()` is not given an `install_dir` keyword argument, the target directory defaults to `{datadir}/{projectname}` (e.g. `/usr/share/myproj`). ## install_subdir() supports strip_directory If strip_directory=true install_subdir() installs directory contents instead of directory itself, stripping basename of the source directory. ## Integer options There is a new integer option type with optional minimum and maximum values. It can be specified like this in the `meson_options.txt` file: ```meson option('integer_option', type : 'integer', min : 0, max : 5, value : 3) ``` ## New method meson.project_license() The `meson` builtin object now has a `project_license()` method that returns a list of all licenses for the project. ## Rust cross-compilation Cross-compilation is now supported for Rust targets. Like other cross-compilers, the Rust binary must be specified in your cross file. It should specify a `--target` (as installed by `rustup target`) and a custom linker pointing to your C cross-compiler. For example: ```ini [binaries] c = '/usr/bin/arm-linux-gnueabihf-gcc-7' rust = [ 'rustc', '--target', 'arm-unknown-linux-gnueabihf', '-C', 'linker=/usr/bin/arm-linux-gnueabihf-gcc-7', ] ``` ## Rust compiler-private library disambiguation When building a Rust target with Rust library dependencies, an `--extern` argument is now specified to avoid ambiguity between the dependency library, and any crates of the same name in `rustc`'s private sysroot. ## Project templates Meson ships with predefined project templates. To start a new project from scratch, simply go to an empty directory and type: meson init --name=myproject --type=executable --language=c ## Improve test setup selection Test setups are now identified (also) by the project they belong to and it is possible to select the used test setup from a specific project. E.g. to use a test setup `some_setup` from project `some_project` for all executed tests one can use meson test --setup some_project:some_setup Should one rather want test setups to be used from the same project as where the current test itself has been defined, one can use just meson test --setup some_setup In the latter case every (sub)project must have a test setup `some_setup` defined in it. ## Can use custom targets as Windows resource files The `compile_resources()` function of the `windows` module can now be used on custom targets as well as regular files. ## Can promote dependencies with wrap command The `promote` command makes it easy to copy nested dependencies to the top level. meson wrap promote scommon This will search the project tree for a subproject called `scommon` and copy it to the top level. If there are many embedded subprojects with the same name, you have to specify which one to promote manually like this: meson wrap promote subprojects/s1/subprojects/scommon ## Yielding subproject option to superproject Normally project options are specific to the current project. However sometimes you want to have an option whose value is the same over all projects. This can be achieved with the new `yield` keyword for options. When set to `true`, getting the value of this option in `meson.build` files gets the value from the option with the same name in the master project (if such an option exists). muon-v0.4.0/subprojects/meson-docs/docs/markdown/Mixing-build-systems.md0000644000175000017500000000534614737503617025427 0ustar buildbuild# Meson's policy on mixing multiple build systems in one build directory Meson has been designed with the principle that all dependencies are either provided by "the platform" via a mechanism such as Pkg-Config or that they are built as Meson subprojects under the main project. There are several projects that would like to mix build systems, that is, build dependencies in the same build directory as the other build system by having one build system call the other. The build directories do not necessarily need to be inside each other, but that is the common case. This page lists the Meson project's stance on mixing build systems. The tl/dr version is that while we do provide some functionality for this use case, it only works for simple cases. Anything more complex cannot be made reliable and trying to do that would burden Meson developers with an effectively infinite maintenance burden. Thus these use cases are not guaranteed to work, and even if a project using them works today there are no guarantees that it will work in any future version. ## The definition of "build system mixing" For the purposes of this page, mixing build systems means any and all mechanisms where one build system uses build artifacts from a different build system's build directory in any way. Note that this definition does not specify what the dependencies are and how they are built, only how they are consumed. For example suppose you have a standalone dependency library that builds with build system X. In this case having Meson call the build system to build the dependency at build time would be interpreted as mixing build systems. On the other hand a "Flatpak-like" approach of building and installing the library with an external mechanism and consuming it via a standard build-system agnostic method such as Pkg-Config would not be considered build system mixing. Use of uninstalled-pkgconfig files is considered mixing, though. ## What does this mean for support and compatibility? The Meson project will not take on any maintenance burden to ensure anything other than the simple builds setups as discussed above will work. Nor will we make changes to support these use cases that would worsen the user experience of users of plain Meson. This includes, but is not limited to, the following: - Any changes in other build systems that cause mixed project breakage will not be considered a bug in Meson. - Breakages in mixed build projects will not be considered regressions and such problems will never be considered release blockers, regardless of what the underlying issue is. - Any use case that would require major changes in Meson to work around missing or broken functionality in the other build system is not supported. These issues must be fixed upstream. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Release-notes-for-1.4.0.md0000644000175000017500000001012014737503617025304 0ustar buildbuild--- title: Release 1.4.0 short-description: Release notes for 1.4.0 ... # New features Meson 1.4.0 was released on 12 March 2024 ## Added support for `[[@build_tgt]]`, `[[@custom_tgt]]`, and `[[@custom_idx]]` to certain FS module functions Support for `[[@build_tgt]]`, `[[@custom_tgt]]`, and `[[@custom_idx]]` was added to the following FS module APIs: - `fs.name` - `fs.parent` - `fs.replace_suffix` - `fs.stem` ## Meson now reads the project version of cmake subprojects CMake subprojects configured by meson will now have their project version set to the project version in their CMakeLists.txt. This allows version constraints to be properly checked when falling back to a cmake subproject. ## `ndebug` setting now controls C++ stdlib assertions The `ndebug` setting, if disabled, now passes preprocessor defines to enable debugging assertions within the C++ standard library. For GCC, `-D_GLIBCXX_ASSERTIONS=1` is set. For Clang, `-D_GLIBCXX_ASSERTIONS=1` is set to cover libstdc++ usage, and `-D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_EXTENSIVE` or `-D_LIBCPP_ENABLE_ASSERTIONS=1` is used depending on the Clang version. ## `stldebug` gains Clang support For Clang, we now pass `-D_GLIBCXX_DEBUG=1` if `debugstl` is enabled, and we also pass `-D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_DEBUG`. ## New `unset()` method on `environment` objects [[@env]] now has an [[env.unset]] method to ensure an existing environment is *not* defined. ## File object now has `full_path()` method Returns a full path pointing to the file. This is useful for printing the path with e.g [[message]] function for debugging purpose. **NOTE:** In most cases using the object itself will do the same job as this and will also allow Meson to setup dependencies correctly. ## New numpy custom dependency Support for `dependency('numpy')` was added, via supporting the `numpy-config` tool and pkg-config support, both of which are available since NumPy 2.0.0. Config-tool support is useful because it will work out of the box when ``numpy`` is installed, while the pkg-config file is located inside python's site-packages, which makes it impossible to use in an out of the box manner without setting `PKG_CONFIG_PATH`. ## `depends` kwarg now supported by compiler.preprocess() It is now possible to specify the dependent targets with `depends:` for compiler.preprocess(). These targets should be built before the preprocessing starts. ## Added `preserve_paths` keyword argument to qt module functions. In `qt4`, `qt5`, and `qt6` modules, `compile_ui`, `compile_moc`, and `preprocess` functions now have a `preserve_paths` keyword argument. If `'true`, it specifies that the output files need to maintain their directory structure inside the target temporary directory. For instance, when a file called `subdir/one.input` is processed it generates a file `{target private directory}/subdir/one.out` when `true`, and `{target private directory}/one.out` when `false` (default). ## Bindgen will now use Meson's heuristic for what is a C++ header Bindgen natively assumes that a file with the extension `.hpp` is a C++ header, but that everything else is a C header. Meson has a whole list of extensions it considers to be C++, and now will automatically look for those extensions and set bindgen to treat those as C++ ## Overriding bindgen language setting Even though Meson will now tell bindgen to do the right thing in most cases, there may still be cases where Meson does not have the intended behavior, specifically with headers with a `.h` suffix, but are C++ headers. ## Bindgen now uses the same C/C++ std as the project as a whole Which is very important for C++ bindings. ## Tests now abort on errors by default under more sanitizers Sanitizers like MemorySanitizer do not abort by default on detected violations. Meson now exports `MSAN_OPTIONS` (in addition to `ASAN_OPTIONS` and `UBSAN_OPTIONS` from a previous release) when unset in the environment to provide sensible abort-by-default behavior. ## Use `custom_target` as test executable The [[test]] function now accepts [[@custom_tgt]] and [[@custom_idx]] for the command to execute. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Subprojects.md0000644000175000017500000003636614737503617023703 0ustar buildbuild--- short-description: Using Meson projects as subprojects within other Meson projects ... # Subprojects Some platforms do not provide a native packaging system. In these cases it is common to bundle all third party libraries in your source tree. This is usually frowned upon because it makes it hard to add these kinds of projects into e.g. those Linux distributions that forbid bundled libraries. Meson tries to solve this problem by making it extremely easy to provide both at the same time. The way this is done is that Meson allows you to take any other Meson project and make it a part of your build without (in the best case) any changes to its Meson setup. It becomes a transparent part of the project. It should be noted that this is only guaranteed to work for subprojects that are built with Meson. The reason is the simple fact that there is no possible way to do this reliably with mixed build systems. Because of this, only Meson subprojects are described here. [CMake based subprojects](CMake-module.md#cmake-subprojects) are also supported but not guaranteed to work. ## A subproject example Usually dependencies consist of some header files plus a library to link against. To declare this internal dependency use `declare_dependency` function. As an example, suppose we have a simple project that provides a shared library. Its `meson.build` would look like this. ```meson project('libsimple', 'c') inc = include_directories('include') libsimple = shared_library('simple', 'simple.c', include_directories : inc, install : true) libsimple_dep = declare_dependency(include_directories : inc, link_with : libsimple) ``` ### Naming convention for dependency variables Ideally the dependency variable name should be of `_dep` form. This way one can just use it without even looking inside build definitions of that subproject. In cases where there are multiple dependencies need to be declared, the default one should be named as `_dep` (e.g. `gtest_dep`), and others can have `___dep` form (e.g. `gtest_main_dep` - gtest with main function). There may be exceptions to these rules where common sense should be applied. ### Adding variables to the dependency *New in 0.54.0* In some cases a project may define special variables via pkg-config or cmake that a caller needs to know about. Meson provides a `dependency.get_variable` method to hide what kind of dependency is provided, and this is available to subprojects as well. Use the `variables` keyword to add a dict of strings: ```meson my_dep = declare_dependency(..., variables : {'var': 'value', 'number': '3'}) ``` Which another project can access via: ```meson var = my_dep.get_variable(internal : 'var', cmake : 'CMAKE_VAR') ``` The values of the dict must be strings, as pkg-config and cmake will return variables as strings. ### Build options in subproject All Meson features of the subproject, such as project options keep working and [can be set in the master project](Builtin-options.md#specifying-options-per-subproject). There are a few limitations, the most important being that global compiler arguments must be set in the main project before calling subproject. Subprojects must not set global arguments because there is no way to do that reliably over multiple subprojects. To check whether you are running as a subproject, use [[meson.is_subproject]]. ## Using a subproject All subprojects must be inside `subprojects` directory. The `subprojects` directory must be at the top level of your project. Subproject declaration must be in your top level `meson.build`. ### A simple example Let's use `libsimple` as a subproject. At the top level of your project create `subprojects` directory. Then copy `libsimple` into `subprojects` directory. Your project's `meson.build` should look like this. ```meson project('my_project', 'cpp') libsimple_proj = subproject('libsimple') libsimple_dep = libsimple_proj.get_variable('libsimple_dep') executable('my_project', 'my_project.cpp', dependencies : libsimple_dep, install : true) ``` Note that the subproject object is *not* used as the dependency, but rather you need to get the declared dependency from it with `get_variable` because a subproject may have multiple declared dependencies. ### Toggling between system libraries and embedded sources When building distro packages it is very important that you do not embed any sources. Some distros have a rule forbidding embedded dependencies so your project must be buildable without them or otherwise the packager will hate you. Here's how you would use system libraries and fall back to embedding sources if the dependency is not available. ```meson project('my_project', 'cpp') libsimple_dep = dependency('libsimple', required : false) if not libsimple_dep.found() libsimple_proj = subproject('libsimple') libsimple_dep = libsimple_proj.get_variable('libsimple_dep') endif executable('my_project', 'my_project.cpp', dependencies : libsimple_dep, install : true) ``` Because this is such a common operation, Meson provides a shortcut for this use case. ```meson dep = dependency('foo', fallback : ['subproject_name', 'variable_name']) ``` The `fallback` keyword argument takes two items, the name of the subproject and the name of the variable that holds the dependency. If you need to do something more complicated, such as extract several different variables, then you need to do it yourself with the manual method described above. Using this shortcut the build definition would look like this. ```meson project('my_project', 'cpp') libsimple_dep = dependency('libsimple', fallback : ['libsimple', 'libsimple_dep']) executable('my_project', 'my_project.cpp', dependencies : libsimple_dep, install : true) ``` You may change default [options of the subproject](Builtin-options.md#specifying-options-per-subproject) by adding a keyword argument to the invocation. For example, to change the default library type: ``` libsimple_dep = dependency( 'libsimple', fallback : ['libsimple', 'libsimple_dep'], default_options: ['default_library=static'] ) ``` With this setup, when libsimple is provided by the system we use it and completely ignore subproject options (i.e. we link to a shared system library). When that is not the case, we use the embedded version (the one from subprojects). Note that `libsimple_dep` can point to an external or an internal dependency but you don't have to worry about their differences. Meson will take care of the details for you. ### Subprojects depending on other subprojects Subprojects can use other subprojects, but all subprojects must reside in the top level `subprojects` directory. Recursive use of subprojects is not allowed, though, so you can't have subproject `a` that uses subproject `b` and have `b` also use `a`. ## Obtaining subprojects Meson ships with a dependency system to automatically obtain dependency subprojects. It is documented in the [Wrap dependency system manual](Wrap-dependency-system-manual.md). ## Command-line options The usage of subprojects can be controlled by users and distros with the following command-line options: * **--wrap-mode=nodownload** Meson will not use the network to download any subprojects or fetch any wrap information. Only preexisting sources will be used. This is useful (mostly for distros) when you want to only use the sources provided by a software release, and want to manually handle or provide missing dependencies. * **--wrap-mode=nofallback** Meson will not use subproject fallbacks for any dependency declarations in the build files, and will only look for them in the system. Note that this does not apply to unconditional subproject() calls, and those are meant to be used for sources that cannot be provided by the system, such as copylibs. This option may be overridden by `--force-fallback-for` for specific dependencies. * **--wrap-mode=forcefallback** Meson will not look at the system for any dependencies which have subproject fallbacks available, and will *only* use subprojects for them. This is useful when you want to test your fallback setup, or want to specifically build against the library sources provided by your subprojects. * **--force-fallback-for=list,of,dependencies** Meson will not look at the system for any dependencies listed there, provided a fallback was supplied when the dependency was declared. This option takes precedence over `--wrap-mode=nofallback`, and when used in combination with `--wrap-mode=nodownload` will only work if the dependency has already been downloaded. This is useful when your project has many fallback dependencies, but you only want to build against the library sources for a few of them. **Warning**: This could lead to mixing system and subproject version of the same library in the same process. Take this case as example: - Libraries `glib-2.0` and `gstreamer-1.0` are installed on your system. - `gstreamer-1.0` depends on `glib-2.0`, pkg-config file `gstreamer-1.0.pc` has `Requires: glib-2.0`. - In your application build definition you do: ```meson executable('app', ..., dependencies: [ dependency('glib-2.0', fallback: 'glib'), dependency('gstreamer-1.0', fallback: 'gstreamer')], ) ``` - You configure with `--force-fallback-for=glib`. This result in linking to two different versions of library `glib-2.0` because `dependency('glib-2.0', fallback: 'glib')` will return the subproject dependency, but `dependency('gstreamer-1.0', fallback: 'gstreamer')` will not fallback and return the system dependency, including `glib-2.0` library. To avoid that situation, every dependency that itself depend on `glib-2.0` must also be forced to fallback, in this case with `--force-fallback-for=glib,gsteamer`. * **--wrap-mode=nopromote** *Since 0.56.0* Meson will automatically use wrap files found in subprojects and copy them into the main project. That new behavior can be disabled by passing `--wrap-mode=nopromote`. In that case only wraps found in the main project will be used. ## `meson subprojects` command *Since 0.49.0* `meson subprojects` has various subcommands to manage all subprojects. If the subcommand fails on any subproject the execution continues with other subprojects. All subcommands accept `--sourcedir` argument pointing to the root source dir of the main project. *Since 0.56.0* all subcommands accept `--types ` argument to run the subcommands only on subprojects of the given types. Multiple types can be set as comma separated list e.g. `--types git,file`. *Since 0.56.0* If the subcommand fails on any subproject an error code is returned at the end instead of retuning success. ### Download subprojects *Since 0.49.0* Meson will automatically download needed subprojects during configure, unless **--wrap-mode=nodownload** option is passed. It is sometimes preferable to download all subprojects in advance, so the Meson configure can be performed offline. The command-line `meson subprojects download` can be used for that, it will download all missing subprojects, but will not update already fetched subprojects. ### Update subprojects *Since 0.49.0* Once a subproject has been fetched, Meson will not update it automatically. For example if the wrap file tracks a git branch, it won't pull latest commits. To pull latest version of all your subprojects at once, just run the command: `meson subprojects update`. - If the wrap file comes from wrapdb, the latest version of the wrap file will be pulled and used next time meson reconfigure the project. This can be triggered using `meson --reconfigure`. Previous source tree is not deleted, to prevent from any loss of local changes. *Since 0.58.0* If `--reset` is specified, the source tree is deleted and new source is extracted. - If subproject is currently in detached mode, a checkout of the revision from wrap file is performed. *Since 0.56.0* a rebase is also performed in case the revision already existed locally but was outdated. If `--reset` is specified, a hard reset is performed instead of rebase. - If subproject is currently at the same branch as specified by the wrap file, a rebase on `origin` commit is performed. *Since 0.56.0* If `--reset` is specified, a hard reset is performed instead of rebase. - If subproject is currently in a different branch as specified by the wrap file, it is skipped unless `--rebase` option is passed in which case a rebase on `origin` commit is performed. *Since 0.56.0* the `--rebase` argument is deprecated and has no effect. Instead, a checkout of the revision from wrap file file is performed and a rebase is also performed in case the revision already existed locally by was outdated. If `--reset` is specified, a hard reset is performed instead of rebase. - *Since 0.56.0* if the `url` specified in wrap file is different to the URL set on `origin` for a git repository it will not be updated, unless `--reset` is specified in which case the URL of `origin` will be reset first. - *Since 0.56.0* If the subproject directory is not a git repository but has a `[wrap-git]` the subproject is ignored, unless `--reset` is specified in which case the directory is deleted and the new repository is cloned. ### Start a topic branch across all git subprojects *Since 0.49.0* The command-line `meson subprojects checkout ` will checkout a branch, or create one with `-b` argument, in every git subprojects. This is useful when starting local changes across multiple subprojects. It is still your responsibility to commit and push in each repository where you made local changes. To come back to the revision set in wrap file (i.e. master), just run `meson subprojects checkout` with no branch name. *Since 0.56.0* any pending changes are now stashed before checkout a new branch. ### Execute a command on all subprojects *Since 0.51.0* The command-line `meson subprojects foreach [...]` will execute a command in each subproject directory. For example this can be useful to check the status of subprojects (e.g. with `git status` or `git diff`) before performing other actions on them. ## Why must all subprojects be inside a single directory? There are several reasons. First of all, to maintain any sort of sanity, the system must prevent going inside other subprojects with `subdir()` or variations thereof. Having the subprojects in well defined places makes this easy. If subprojects could be anywhere at all, it would be a lot harder. Second of all it is extremely important that end users can easily see what subprojects any project has. Because they are in one, and only one, place, reviewing them becomes easy. This is also a question of convention. Since all Meson projects have the same layout w.r.t subprojects, switching between projects becomes easier. You don't have to spend time on a new project traipsing through the source tree looking for subprojects. They are always in the same place. Finally if you can have subprojects anywhere, this increases the possibility of having many different (possibly incompatible) versions of a dependency in your source tree. Then changing some code (such as changing the order you traverse directories) may cause a completely different version of the subproject to be used by accident. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Gnome-module.md0000644000175000017500000004264514737503617023725 0ustar buildbuild# GNOME module This module provides helper tools for build operations needed when building Gnome/GLib programs. **Note**: the compilation commands here might not work properly when you change the source files. This is a bug in the respective compilers which do not expose the required dependency information. This has been reported upstream in [this bug]. Until this is fixed you need to be careful when changing your source files. [this bug]: https://bugzilla.gnome.org/show_bug.cgi?id=745754 ## Usage To use this module, just do: **`gnome = import('gnome')`**. The following functions will then be available as methods on the object with the name `gnome`. You can, of course, replace the name `gnome` with anything else. ### gnome.compile_resources() ``` gnome.compile_resources(id: string, input_file: string | File, build_by_default: bool = false, c_name: string | None = None, dependencies: [](File, CustomTarget, CustomTargetIndex) = [], export: bool = false, extra_args: []string = [], gresource_bundle: bool = false, install_dir: string | None = None, source_dir: [string] = [], ): (CustomTarget, CustomTarget) | CustomTarget ``` This function compiles resources specified in an XML file into code that can be embedded inside the main binary. Similar a build target it takes two positional arguments. The first one is the name of the resource and the second is the XML file containing the resource definitions. If the name is `foobar`, Meson will generate a header file called `foobar.h`, which you can then include in your sources. The resources specified are automatically added as dependencies of the generated target. * `c_name`: passed to the resource compiler as an argument after `--c-name` * `dependencies`: extra targets to depend upon for building * `export`: (*Added 0.37.0*) if true, export the symbols of the generated sources * `extra_args`: extra command line arguments to pass to the resource * `gresource_bundle`: (*Added 0.37.0*) if true, output a `.gresource` file instead of source * `install`: (*Added 0.37.0*) if true, install the gresource file * `install_dir`: (*Added 0.37.0*) location to install the header or bundle depending on previous options * `install_header`: (*Added 0.37.0*) if true, install the header file * `source_dir`: a list of directories where the resource compiler should look up the files Returns an array containing: `[c_source, header_file]` or `[gresource_bundle]` Example: ```meson gnome = import('gnome') asresources = gnome.compile_resources( 'as-resources', 'data/asresources.gresource.xml', source_dir: 'data', c_name: 'as' ) executable( meson.project_name(), asresources, dependencies: my_deps, install: true ) ``` ### gnome.generate_gir() Generates GObject introspection data. Takes one or more positional arguments: Either one or more library objects you want to build gir data for, or a single executable object. There are several keyword arguments. Many of these map directly to the `g-ir-scanner` tool so see its documentation for more information. * `dependencies`: deps to use during introspection scanning * `extra_args`: command line arguments to pass to gir compiler * `env`: (*Added 1.2.0*) environment variables to set, such as `{'NAME1': 'value1', 'NAME2': 'value2'}` or `['NAME1=value1', 'NAME2=value2']`, or an [[@env]] object which allows more sophisticated environment juggling. * `export_packages`: extra packages the gir file exports * `sources`: the list of sources to be scanned for gir data * `nsversion`: namespace version * `namespace`: the namespace for this gir object which determines output files * `identifier_prefix`: the identifier prefix for the gir object, e.g. `Gtk` * `includes`: list of gir names to be included, can also be a GirTarget * `header`: *(Added 0.43.0)* name of main c header to include for the library, e.g. `glib.h` * `include_directories`: extra include paths to look for gir files * `install`: if true, install the generated files * `install_gir`: (*Added 0.61.0*) overrides `install`, whether to install the generated gir * `install_dir_gir`: (*Added 0.35.0*) which directory to install the gir file into; (*Deprecated since 0.61.0*) can be false to disable installation * `install_typelib`: (*Added 0.61.0*) overrides `install`, whether to install the generated typelib * `install_dir_typelib`: (*Added 0.35.0*) which directory to install the typelib file into; (*Deprecated since 0.61.0*) can be false to disable installation * `link_with`: list of libraries to link with * `symbol_prefix`: the symbol prefix for the gir object, e.g. `gtk`, (*Since 0.43.0*) an ordered list of multiple prefixes is allowed * `fatal_warnings`: *Since 0.55.0* turn scanner warnings into fatal errors. Returns an array of two elements which are: `[gir_target, typelib_target]` ### gnome.genmarshal() Generates a marshal file using the `glib-genmarshal` tool. The first argument is the basename of the output files. * `depends` [](BuildTarget | CustomTarget | CustomTargetIndex): passed directly to CustomTarget (*since 0.61.0*) * `depend_files` [](str | File): Passed directly to CustomTarget (*since 0.61.0*) * `extra_args`: (*Added 0.42.0*) additional command line arguments to pass * `install_dir`: directory to install header to * `install_header`: if true, install the generated header * `install_dir`: directory to install header to * `install_header`: if true, install the generated header * `internal`: if true, mark generated sources as internal to `glib-genmarshal` (*Requires GLib 2.54*) * `nostdinc`: if true, don't include the standard marshallers from glib * `prefix`: the prefix to use for symbols * `skip_source`: if true, skip source location comments * `sources` [](str | File) *required*: the list of sources to use as inputs * `stdinc`: if true, include the standard marshallers from glib * `valist_marshallers`: if true, generate va_list marshallers *Added 0.35.0* Returns an array of two elements which are: `[c_source, header_file]` ### gnome.mkenums() Generates enum files for GObject using the `glib-mkenums` tool. The first argument is the base name of the output files, unless `c_template` and `h_template` are specified. In this case, the output files will be the base name of the values passed as templates. This method is essentially a wrapper around the `glib-mkenums` tool's command line API. It is the most featureful method for enum creation. Typically you either provide template files or you specify the various template sections manually as strings. Most libraries and applications will be using the same standard template with only minor tweaks, in which case the `gnome.mkenums_simple()` convenience method can be used instead. Note that if you `#include` the generated header in any of the sources for a build target, you must add the generated header to the build target's list of sources to codify the dependency. This is true for all generated sources, not just `mkenums`. * `c_template`: template to use for generating the source * `comments`: comment passed to the command * `h_template`: template to use for generating the header * `identifier_prefix`: prefix to use for the identifiers * `install_header`: if true, install the generated header * `install_dir`: directory to install the header * `sources`: the list of sources to make enums with * `symbol_prefix`: prefix to use for the symbols * `eprod`: enum text * `fhead`: file header * `fprod`: file text * `ftail`: file tail * `vhead`: value text * `vtail`: value tail *Added 0.35.0* Returns an array of two elements which are: `[c_source, header_file]` ### gnome.mkenums_simple() Generates enum `.c` and `.h` files for GObject using the `glib-mkenums` tool with the standard template used by most GObject-based C libraries. The first argument is the base name of the output files. Note that if you `#include` the generated header in any of the sources for a build target, you must add the generated header to the build target's list of sources to codify the dependency. This is true for all generated sources, not just `mkenums_simple`. The generated source file includes all headers passed to the sources keyword argument, using paths relative to current build or source directory. That means that targets that compile the generated source file must have the current directory in its `include_directories`. *Since 1.3.0* `sources` outside of current directory do not require adding those directories into `include_directories` anymore. * `body_prefix`: additional prefix at the top of the body file, e.g. for extra includes * `decorator`: optional decorator for the function declarations, e.g. `GTK_AVAILABLE` or `GST_EXPORT` * `function_prefix`: additional prefix for function names, e.g. in case you want to add a leading underscore to functions used only internally * `header_prefix`: additional prefix at the top of the header file, e.g. for extra includes (which may be needed if you specify a decorator for the function declarations) * `install_header`: if true, install the generated header * `install_dir`: directory to install the header * `identifier_prefix`: prefix to use for the identifiers * `sources`: the list of sources to make enums with * `symbol_prefix`: prefix to use for the symbols Example: ```meson gnome = import('gnome') my_headers = ['myheader1.h', 'myheader2.h'] my_sources = ['mysource1.c', 'mysource2.c'] # will generate myenums.c and myenums.h based on enums in myheader1.h and myheader2.h enums = gnome.mkenums_simple('myenums', sources : my_headers) mylib = library('my', my_sources, enums, include_directories: my_incs, dependencies: my_deps, c_args: my_cargs, install: true) ``` *Added 0.42.0* Returns an array of two elements which are: `[c_source, header_file]` ### gnome.compile_schemas() When called, this method will compile the gschemas in the current directory. Note that this is not for installing schemas and is only useful when running the application locally for example during tests. * `build_by_default`: causes, when set to true, to have this target be built by default, that is, when invoking plain `meson compile`, the default value is true for all built target types * `depend_files`: files ([[@str]], [[files]], or [[configure_file]]) of schema source XML files that should trigger a re-compile if changed. ### gnome.gdbus_codegen() Compiles the given XML schema into gdbus source code. Takes two positional arguments, the first one specifies the base name to use while creating the output source and header and the second specifies one XML file. * `sources`: list of XML files * `interface_prefix`: prefix for the interface * `namespace`: namespace of the interface * `extra_args`: (*Added 0.47.0*) additional command line arguments to pass * `autocleanup`: *(Added 0.47.0)* if set generates autocleanup code. Can be one of `none`, `objects` or `all` * `object_manager`: *(Added 0.40.0)* if true generates object manager code * `annotations`: *(Added 0.43.0)* list of lists of 3 strings for the annotation for `'ELEMENT', 'KEY', 'VALUE'` * `docbook`: *(Added 0.43.0)* prefix to generate `'PREFIX'-NAME.xml` docbooks * `build_by_default`: causes, when set to true, to have this target be built by default, that is, when invoking plain `meson compile`, the default value is true for all built target types * `install_dir`: (*Added 0.46.0*) location to install the header or bundle depending on previous options * `install_header`: (*Added 0.46.0*) if true, install the header file Starting *0.46.0*, this function returns a list of at least two custom targets (in order): one for the source code and one for the header. The list will contain a third custom target for the generated docbook files if that keyword argument is passed. Earlier versions return a single custom target representing all the outputs. Generally, you should just add this list of targets to a top level target's source list. Example: ```meson gnome = import('gnome') # The returned source would be passed to another target gdbus_src = gnome.gdbus_codegen('example-interface', sources: 'com.example.Sample.xml', interface_prefix : 'com.example.', namespace : 'Sample', annotations : [ ['com.example.Hello()', 'org.freedesktop.DBus.Deprecated', 'true'] ], docbook : 'example-interface-doc' ) ``` ### gnome.generate_vapi() Creates a VAPI file from gir. The first argument is the name of the library. * `gir_dirs`: extra directories to include for gir files * `install`: if true, install the VAPI file * `install_dir`: location to install the VAPI file (defaults to datadir/vala/vapi) * `metadata_dirs`: extra directories to include for metadata files * `packages`: VAPI packages that are depended upon * `sources`: the gir source to generate the VAPI from * `vapi_dirs`: extra directories to include for VAPI files Returns a custom dependency that can be included when building other VAPI or Vala binaries. *Added 0.36.0* ### gnome.yelp() ```meson gnome.yelp(id: string, sources: ...string, sources: []string, media: []string, languages: []string, symlink_media: bool = true): void ``` Installs help documentation for Yelp using itstool and gettext. The first argument is the project id. Additionally, sources can be passed as additional positional arguments. This was, however, undocumented and never officially supported. Due to a longstanding bug, passing sources as a keyword argument will result in the positional argument sources to be ignored. *since 0.60.0* A warning is raised in this case. *Since 0.43.0* if "languages" is not specified, a [LINGUAS](https://www.gnu.org/software/gettext/manual/html_node/po_002fLINGUAS.html) file will be read instead. *Since 0.60.0* the use of the positional argument sources has been deprecated, and the "sources" keyword argument should be used instead. The passing of sources as positional arguments will be removed in the future. This also creates two targets for translations `help-$project-update-po` and `help-$project-pot`. * `languages`: *(deprecated since 0.43.0)* list of languages for translation, overrides the LINGUAS file * `media`: list of media such as images * `sources`: list of pages * `symlink_media`: if media should be symlinked not copied (defaults to `true` since 0.42.0) Note that very old versions of yelp may not support symlinked media; At least 3.10 should work. *Added 0.36.0* ### gnome.gtkdoc() Compiles and installs gtkdoc documentation into `prefix/share/gtk-doc/html`. Takes one positional argument: The name of the module. * `content_files`: a list of content files * `dependencies`: a list of dependencies * `fixxref_args`: a list of arguments to pass to `gtkdoc-fixxref` * `gobject_typesfile`: a list of type files * `include_directories`: extra include paths to pass to `gtkdoc-scangobj` * `ignore_headers`: a list of header files to ignore * `html_assets`: a list of assets for the HTML pages * `html_args` a list of arguments to pass to `gtkdoc-mkhtml` * `install`: if true, installs the generated docs * `install_dir`: the directory to install the generated docs relative to the gtk-doc html dir or an absolute path (default: module name) * `main_xml`: specifies the main XML file * `main_sgml`: equal to `main_xml` * `mkdb_args`: a list of arguments to pass to `gtkdoc-mkdb` * `namespace`: specifies the name space to pass to `gtkdoc-mkdb` * `module_version`: the version of the module, affects the installed location and the devhelp2 file location * `scan_args`: a list of arguments to pass to `gtkdoc-scan` * `scanobjs_args`: a list of arguments to pass to `gtkdoc-scangobj` * `c_args`: (*Added 0.48.0*) additional compile arguments to pass * `src_dir`: include_directories to include * `check`: (*Since 0.52.0*) if `true` runs `gtkdoc-check` when running unit tests. Note that this has the downside of rebuilding the doc for each build, which is often very slow. It usually should be enabled only in CI. This also creates a `$module-doc` target that can be run to build documentation. Normally the documentation is only built on install. *Since 0.52.0* Returns a target object that can be passed as dependency to other targets using generated doc files (e.g. in `content_files` of another doc). ### gnome.gtkdoc_html_dir() Takes as argument a module name and returns the path where that module's HTML files will be installed. Usually used with `install_data` to install extra files, such as images, to the output directory. ### gnome.post_install() *Since 0.57.0* Post-install update of various system wide caches. Each script will be executed only once even if `gnome.post_install()` is called multiple times from multiple subprojects. If `DESTDIR` is specified during installation all scripts will be skipped. It takes the following keyword arguments: - `glib_compile_schemas`: If set to `true`, update `gschemas.compiled` file in `//glib-2.0/schemas`. - `gio_querymodules`: List of directories relative to `prefix` where `giomodule.cache` file will be updated. - `gtk_update_icon_cache`: If set to `true`, update `icon-theme.cache` file in `//icons/hicolor`. - `update_desktop_database`: *Since 0.59.0* If set to `true`, update cache of MIME types handled by desktop files in `//applications`. - `update_mime_database`: *Since 0.64.0* If set to `true`, update cache of MIME types in `//mime`. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Release-notes-for-0.64.0.md0000644000175000017500000001553214737503617025405 0ustar buildbuild--- title: Release 0.64.0 short-description: Release notes for 0.64.0 ... # New features ## Add `optimization` `plain` option The `optimization` built-in option now accepts `plain` value, which will not set any optimization flags. This is now the default value of the flag for `buildtype=plain`, which is useful for distros, that set the optimization and hardening flags by other means. If you are using the value of `get_option('optimization')` in your Meson scripts, make sure you are not making assumptions about it, such as that the value can be passed to a compiler in `-O` flag. ## New languages: `nasm` and `masm` When the `nasm` language is added to the project, `.asm` files are automatically compiled with NASM. This is only supported for x86 and x86_64 CPU family. `yasm` is used as fallback if `nasm` command is not found. When the `masm` language is added to the project, `.masm` files are automatically compiled with Microsoft's Macro Assembler. This is only supported for x86, x86_64, ARM and AARCH64 CPU families. Note that GNU Assembly files usually have `.s` or `.S` extension and were already built using C compiler such as GCC or CLANG. ```meson project('test', 'nasm') exe = executable('hello', 'hello.asm') test('hello', exe) ``` ## Pager and colors for `meson configure` output The output of `meson configure`, printing all options, is now more readable by automatically using a pager (`less` by default) and colors. The pager used can be controlled by setting `PAGER` environment variable, or `--no-pager` command line option. ## various `install_*` functions no longer handle the sticky bit It is not possible to portably grant the sticky bit to a file, and where possible, it doesn't do anything. It is not expected that any users are using this functionality. Variously: - on Linux, it has no meaningful effect - on Solaris, attempting to set the permission bit is silently ignored by the OS - on FreeBSD, attempting to set the permission bit is an error Attempting to set this permission bit in the `install_mode:` kwarg to any function other than [[install_emptydir]] will now result in a warning, and the permission bit being ignored. ## `fs.copyfile` to replace `configure_file(copy : true)` A new method has been added to the `fs` module, `copyfile`. This method replaces `configure_file(copy : true)`, but only copies files. Unlike `configure_file()` it runs at build time, and the output name is optional defaulting to the filename without paths of the input if unset: ```meson fs.copyfile('src/file.txt') ``` Will create a file in the current build directory called `file.txt` ```meson fs.copyfile('file.txt', 'outfile.txt') ``` Will create a copy renamed to `outfile.txt` ## Added `update_mime_database` to `gnome.post_install()` Applications that install a `.xml` file containing a `mime-type` need to update the cache upon installation. Most applications do that using a custom script, but it can now be done by Meson directly. ## Added preserve_path arg to install_data The [[install_data]] function now has an optional argument `preserve_path` that allows installing multi-directory data file structures that live alongside source code with a single command. This is also available in the specialized `py_installation.install_sources` method. ## BSD support for the `jni` dependency This system dependency now supports all BSD systems that Meson currently supports, including FreeBSD, NetBSD, OpenBSD, and DragonflyBSD. ## Credentials from `~/.netrc` for `https` URLs When a subproject is downloaded using an `https://` URL, credentials from `~/.netrc` are now used. This avoids hardcoding login and password in plain text in the URL itself. ## Basic support for oneAPI compilers on Linux and Windows To use on Linux: ``` source /opt/intel/oneapi/setvars.sh CC=icx CXX=icpx FC=ifx meson setup builddir ``` ## New method to preprocess source files Compiler object has a new `preprocess()` method. It is supported by all C/C++ compilers. It preprocess sources without compiling them. The preprocessor will receive the same arguments (include directories, defines, etc) as with normal compilation. That includes for example args added with `add_project_arguments()`, or on the command line with `-Dc_args=-DFOO`. ```meson cc = meson.get_compiler('c') pp_files = cc.preprocess('foo.c', 'bar.c', output: '@PLAINNAME@') exe = executable('app', pp_files) ``` ## python.find_installation() now accepts pure argument The default value of `pure:` for `py.install_sources()` and `py.get_install_dir()` can now be changed by explicitly passing a `pure:` kwarg to `find_installation()`. This can be used to ensure that multiple `install_sources()` invocations do not forget to specify the kwarg each time. ## Generates rust-project.json when there are Rust targets This is a format similar to compile_commands.json, but specifically used by the official rust LSP, rust-analyzer. It is generated automatically if there are Rust targets, and is placed in the build directory. ## `summary()` accepts disablers Disabler options can be passed to `summary()` as the value to be printed. ## Option to allow meson test to fail fast after the first failing testcase `meson test --maxfail=1` will now cause all pending or in-progress tests to be canceled or interrupted after 1 test is marked as failing. This can be used for example to quit a CI run and avoid burning additional time as soon as it is known that the overall return status will be failing. ## Incremental ThinLTO with `b_thinlto_cache` [Incremental ThinLTO](https://clang.llvm.org/docs/ThinLTO.html#incremental) can now be enabled by passing `-Db_thinlto_cache=true` during setup. The use of caching speeds up incremental builds significantly while retaining all the runtime performance benefits of ThinLTO. The cache location defaults to a Meson-managed directory inside the build folder, but can be customized with `b_thinlto_cache_dir`. ## Update all wraps from WrapDB with `meson wrap update` command The command `meson wrap update`, with no extra argument, will now update all wraps that comes from WrapDB to the latest version. The extra `--force` argument will also replace wraps that do not come from WrapDB if one is available. The command `meson subprojects update` will not download new wrap files from WrapDB any more. ## Added `include_core_only` arg to wayland.scan_xml. The `scan_xml` function from the wayland module now has an optional bool argument `include_core_only`, so that headers generated by wayland-scanner now only include `wayland-client-core.h` instead of `wayland-client.h`. ## Automatic fallback using WrapDB A new command has been added: `meson wrap update-db`. It downloads the list of wraps available in [WrapDB](https://wrapdb.mesonbuild.com) and stores it locally in `subprojects/wrapdb.json`. When that file exists and a dependency is not found on the system but is available in WrapDB, Meson will automatically download it. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Release-notes-for-0.46.0.md0000644000175000017500000002632114737503617025403 0ustar buildbuild--- title: Release 0.46 short-description: Release notes for 0.46 ... # New features ## Allow early return from a script Added the function `subdir_done()`. Its invocation exits the current script at the point of invocation. All previously invoked build targets and commands are build/executed. All following ones are ignored. If the current script was invoked via `subdir()` the parent script continues normally. ## Log output slightly changed The format of some human-readable diagnostic messages has changed in minor ways. In case you are parsing these messages, you may need to adjust your code. ## ARM compiler for C and CPP Cross-compilation is now supported for ARM targets using ARM compiler - ARMCC. The current implementation does not support shareable libraries. The default extension of the output is .axf. The environment path should be set properly for the ARM compiler executables. The '--cpu' option with the appropriate target type should be mentioned in the cross file as shown in the snippet below. ```ini [properties] c_args = ['--cpu=Cortex-M0plus'] cpp_args = ['--cpu=Cortex-M0plus'] ``` ## Building both shared and static libraries A new function `both_libraries()` has been added to build both shared and static libraries at the same time. Source files will be compiled only once and object files will be reused to build both shared and static libraries, unless `b_staticpic` user option or `pic:` keyword argument are set to false in which case sources will be compiled twice. The returned `buildtarget` object always represents the shared library. ## Compiler object can now be passed to run_command() This can be used to run the current compiler with the specified arguments to obtain additional information from it. One of the use cases is to get the location of development files for the GCC plugins: ```meson cc = meson.get_compiler('c') result = run_command(cc, '-print-file-name=plugin') plugin_dev_path = result.stdout().strip() ``` ## declare_dependency() now supports `link_whole:` `declare_dependency()` now supports the `link_whole:` keyword argument which transparently works for build targets which use that dependency. ## Old command names are now errors The old executable names `mesonintrospect`, `mesonconf`, `mesonrewriter` and `mesontest` have been deprecated for a long time. Starting from this version they no longer do anything but instead always error out. All functionality is available as subcommands in the main `meson` binary. ## Meson and meson configure now accept the same arguments Previously Meson required that builtin arguments (like prefix) be passed as `--prefix` to `meson` and `-Dprefix` to `meson configure`. `meson` now accepts -D form like `meson configure` has. `meson configure` also accepts the `--prefix` form, like `meson` has. ## Recursively extract objects The `recursive:` keyword argument has been added to `extract_all_objects()`. When set to `true` it will also return objects passed to the `objects:` argument of this target. By default only objects built for this target are returned to maintain backward compatibility with previous versions. The default will eventually be changed to `true` in a future version. ```meson lib1 = static_library('a', 'source.c', objects : 'prebuilt.o') lib2 = static_library('b', objects : lib1.extract_all_objects(recursive : true)) ``` ## Can override find_program() It is now possible to override the result of `find_program` to point to a custom program you want. The overriding is global and applies to every subproject from there on. Here is how you would use it. In master project ```meson subproject('mydep') ``` In the called subproject: ```meson prog = find_program('my_custom_script') meson.override_find_program('mycodegen', prog) ``` In master project (or, in fact, any subproject): ```meson genprog = find_program('mycodegen') ``` Now `genprog` points to the custom script. If the dependency had come from the system, then it would point to the system version. You can also use the return value of `configure_file()` to override a program in the same way as above: ```meson prog_script = configure_file(input : 'script.sh.in', output : 'script.sh', configuration : cdata) meson.override_find_program('mycodegen', prog_script) ``` ## New functions: has_link_argument() and friends A new set of methods has been added to [[@compiler]] objects to test if the linker supports given arguments. - [[compiler.has_link_argument]] - [[compiler.has_multi_link_arguments]] - [[compiler.get_supported_link_arguments]] - [[compiler.first_supported_link_argument]] ## "meson help" now shows command line help Command line parsing is now less surprising. "meson help" is now equivalent to "meson --help" and "meson help " is equivalent to "meson --help", instead of creating a build directory called "help" in these cases. ## Autogeneration of simple meson.build files A feature to generate a meson.build file compiling given C/C++ source files into a single executable has been added to "meson init". By default, it will take all recognizable source files in the current directory. You can also specify a list of dependencies with the -d flag and automatically invoke a build with the -b flag to check if the code builds with those dependencies. For example, ```meson meson init -fbd sdl2,gl ``` will look for C or C++ files in the current directory, generate a meson.build for them with the dependencies of sdl2 and gl and immediately try to build it, overwriting any previous meson.build and build directory. ## install_data() supports `rename:` The `rename:` keyword argument is used to change names of the installed files. Here's how you install and rename the following files: - `file1.txt` into `share/myapp/dir1/data.txt` - `file2.txt` into `share/myapp/dir2/data.txt` ```meson install_data(['file1.txt', 'file2.txt'], rename : ['dir1/data.txt', 'dir2/data.txt'], install_dir : 'share/myapp') ``` ## Support for lcc compiler for e2k (Elbrus) architecture In this version, a support for lcc compiler for Elbrus processors based on [e2k microarchitecture](https://en.wikipedia.org/wiki/Elbrus_2000) has been added. Examples of such CPUs: * [Elbrus-8S](https://en.wikipedia.org/wiki/Elbrus-8S); * Elbrus-4S; * [Elbrus-2S+](https://en.wikipedia.org/wiki/Elbrus-2S%2B). Such compiler have a similar behavior as gcc (basic option compatibility), but, in is not strictly compatible with gcc as of current version. Major differences as of version 1.21.22: * it does not support LTO and PCH; * it suffers from the same dependency file creation error as icc; * it has minor differences in output, especially version output; * it differently reacts to lchmod() detection; * some backend messages are produced in ru_RU.KOI8-R even if LANG=C; * its preprocessor treats some characters differently. So every noted difference is properly handled now in Meson. ## String escape character sequence update Single-quoted strings in Meson have been taught the same set of escape sequences as in Python. It is therefore now possible to use arbitrary bytes in strings, like for example `NUL` (`\0`) and other ASCII control characters. See the chapter about [*Strings* in *Syntax*](Syntax.md#strings) for more details. Potential backwards compatibility issue: Any valid escape sequence according to the new rules will be interpreted as an escape sequence instead of the literal characters. Previously only the following escape sequences were supported in single-quote strings: `\'`, `\\` and `\n`. Note that the behaviour of triple-quoted (multiline) strings has not changed. They behave like raw strings and do not support any escape sequences. ## New `forcefallback` wrap mode A new wrap mode was added, `--wrap-mode=forcefallback`. When this is set, dependencies for which a fallback was provided will always use it, even if an external dependency exists and satisfies the version requirements. ## Relaxing of target name requirements In earlier versions of Meson you could only have one target of a given name for each type. For example you could not have two executables named `foo`. This requirement is now relaxed so that you can have multiple targets with the same name, as long as they are in different subdirectories. Note that projects that have multiple targets with the same name can not be built with the `flat` layout or any backend that writes outputs in the same directory. ## Addition of OpenMP dependency An OpenMP dependency (`openmp`) has been added that encapsulates the various flags used by compilers to enable OpenMP and checks for the existence of the `omp.h` header. The `language` keyword may be passed to force the use of a specific compiler for the checks. ## Added new partial_dependency method to dependencies and libraries It is now possible to use only part of a dependency in a target. This allows, for example, to only use headers with convenience libraries to avoid linking to the same library multiple times. ```meson dep = dependency('xcb') helper = static_library( 'helper', ['helper1.c', 'helper2.c'], dependencies : dep.partial_dependency(includes : true), ] final = shared_library( 'final', ['final.c'], dependencies : dep, ) ``` A partial dependency will have the same name version as the full dependency it is derived from, as well as any values requested. ## Improved generation of pkg-config files for static only libraries. Previously pkg-config files generated by the pkgconfig modules for static libraries with dependencies could only be used in a dependencies with `static: true`. Now the generated file contains the needed dependencies libraries directly within `Requires` and `Libs` for build static libraries passed via the `libraries` keyword argument. Projects that install both a static and a shared version of a library should use the result of [[both_libraries]] to the pkg-config file generator or use [[configure_file]] for more complicated setups. ## Improvements to pkgconfig module A `StaticLibrary` or `SharedLibrary` object can optionally be passed as first positional argument of the `generate()` method. If one is provided a default value will be provided for all required fields of the pc file: - `install_dir` is set to `pkgconfig` folder in the same location than the provided library. - `description` is set to the project's name followed by the library's name. - `name` is set to the library's name. Generating a .pc file is now as simple as: ```meson pkgconfig.generate(mylib) ``` ## pkgconfig.generate() requires parameters non-string arguments `pkgconfig.generate()` `requires:` and `requires_private:` keyword arguments now accept pkgconfig-dependencies and libraries that pkgconfig-files were generated for. ## Generic python module Meson now has is a revamped and generic (python 2 and 3) version of the python3 module. With [this new interface](Python-module.md), projects can now fully specify the version of python they want to build against / install sources to, and can do so against multiple major or minor versions in parallel. ## test() now supports the `depends:` keyword argument Build targets and custom targets can be listed in the `depends:` keyword argument of test function. These targets will be built before test is run even if they have `build_by_default : false`. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Cuda-module.md0000644000175000017500000001533514737503617023530 0ustar buildbuild--- short-description: CUDA module authors: - name: Olexa Bilaniuk years: [2019] has-copyright: false ... # Unstable CUDA Module _Since: 0.50.0_ This module provides helper functionality related to the CUDA Toolkit and building code using it. **Note**: this module is unstable. It is only provided as a technology preview. Its API may change in arbitrary ways between releases or it might be removed from Meson altogether. ## Importing the module The module may be imported as follows: ``` meson cuda = [[#import]]('unstable-cuda') ``` It offers several useful functions that are enumerated below. ## Functions ### `nvcc_arch_flags()` _Since: 0.50.0_ ``` meson cuda.nvcc_arch_flags(cuda_version_string, ..., detected: string_or_array) ``` Returns a list of `-gencode` flags that should be passed to `cuda_args:` in order to compile a "fat binary" for the architectures/compute capabilities enumerated in the positional argument(s). The flags shall be acceptable to an NVCC with CUDA Toolkit version string `cuda_version_string`. A set of architectures and/or compute capabilities may be specified by: - The single positional argument `'All'`, `'Common'` or `'Auto'` - As (an array of) - Architecture names (`'Kepler'`, `'Maxwell+Tegra'`, `'Turing'`) and/or - Compute capabilities (`'3.0'`, `'3.5'`, `'5.3'`, `'7.5'`) A suffix of `+PTX` requests PTX code generation for the given architecture. A compute capability given as `A.B(X.Y)` requests PTX generation for an older virtual architecture `X.Y` before binary generation for a newer architecture `A.B`. Multiple architectures and compute capabilities may be passed in using - Multiple positional arguments - Lists of strings - Space (` `), comma (`,`) or semicolon (`;`)-separated strings The single-word architectural sets `'All'`, `'Common'` or `'Auto'` cannot be mixed with architecture names or compute capabilities. Their interpretation is: | Name | Compute Capability | |-------------------|--------------------| | `'All'` | All CCs supported by given NVCC compiler. | | `'Common'` | Relatively common CCs supported by given NVCC compiler. Generally excludes Tegra and Tesla devices. | | `'Auto'` | The CCs provided by the `detected:` keyword, filtered for support by given NVCC compiler. | The supported architecture names and their corresponding compute capabilities are: | Name | Compute Capability | |-------------------|--------------------| | `'Fermi'` | 2.0, 2.1(2.0) | | `'Kepler'` | 3.0, 3.5 | | `'Kepler+Tegra'` | 3.2 | | `'Kepler+Tesla'` | 3.7 | | `'Maxwell'` | 5.0, 5.2 | | `'Maxwell+Tegra'` | 5.3 | | `'Pascal'` | 6.0, 6.1 | | `'Pascal+Tegra'` | 6.2 | | `'Volta'` | 7.0 | | `'Xavier'` | 7.2 | | `'Turing'` | 7.5 | | `'Ampere'` | 8.0, 8.6 | Examples: cuda.nvcc_arch_flags('10.0', '3.0', '3.5', '5.0+PTX') cuda.nvcc_arch_flags('10.0', ['3.0', '3.5', '5.0+PTX']) cuda.nvcc_arch_flags('10.0', [['3.0', '3.5'], '5.0+PTX']) cuda.nvcc_arch_flags('10.0', '3.0 3.5 5.0+PTX') cuda.nvcc_arch_flags('10.0', '3.0,3.5,5.0+PTX') cuda.nvcc_arch_flags('10.0', '3.0;3.5;5.0+PTX') cuda.nvcc_arch_flags('10.0', 'Kepler 5.0+PTX') # Returns ['-gencode', 'arch=compute_30,code=sm_30', # '-gencode', 'arch=compute_35,code=sm_35', # '-gencode', 'arch=compute_50,code=sm_50', # '-gencode', 'arch=compute_50,code=compute_50'] cuda.nvcc_arch_flags('10.0', '3.5(3.0)') # Returns ['-gencode', 'arch=compute_30,code=sm_35'] cuda.nvcc_arch_flags('8.0', 'Common') # Returns ['-gencode', 'arch=compute_30,code=sm_30', # '-gencode', 'arch=compute_35,code=sm_35', # '-gencode', 'arch=compute_50,code=sm_50', # '-gencode', 'arch=compute_52,code=sm_52', # '-gencode', 'arch=compute_60,code=sm_60', # '-gencode', 'arch=compute_61,code=sm_61', # '-gencode', 'arch=compute_61,code=compute_61'] cuda.nvcc_arch_flags('9.2', 'Auto', detected: '6.0 6.0 6.0 6.0') cuda.nvcc_arch_flags('9.2', 'Auto', detected: ['6.0', '6.0', '6.0', '6.0']) # Returns ['-gencode', 'arch=compute_60,code=sm_60'] cuda.nvcc_arch_flags(nvcc, 'All') # Returns ['-gencode', 'arch=compute_20,code=sm_20', # '-gencode', 'arch=compute_20,code=sm_21', # '-gencode', 'arch=compute_30,code=sm_30', # '-gencode', 'arch=compute_32,code=sm_32', # '-gencode', 'arch=compute_35,code=sm_35', # '-gencode', 'arch=compute_37,code=sm_37', # '-gencode', 'arch=compute_50,code=sm_50', # nvcc.version() < 7.0 # '-gencode', 'arch=compute_52,code=sm_52', # '-gencode', 'arch=compute_53,code=sm_53', # nvcc.version() >= 7.0 # '-gencode', 'arch=compute_60,code=sm_60', # '-gencode', 'arch=compute_61,code=sm_61', # nvcc.version() >= 8.0 # '-gencode', 'arch=compute_70,code=sm_70', # '-gencode', 'arch=compute_72,code=sm_72', # nvcc.version() >= 9.0 # '-gencode', 'arch=compute_75,code=sm_75'] # nvcc.version() >= 10.0 _Note:_ This function is intended to closely replicate CMake's FindCUDA module function `CUDA_SELECT_NVCC_ARCH_FLAGS(out_variable, [list of CUDA compute architectures])` ### `nvcc_arch_readable()` _Since: 0.50.0_ ``` meson cuda.nvcc_arch_readable(cuda_version_string, ..., detected: string_or_array) ``` Has precisely the same interface as [`nvcc_arch_flags()`](#nvcc_arch_flags), but rather than returning a list of flags, it returns a "readable" list of architectures that will be compiled for. The output of this function is solely intended for informative message printing. archs = '3.0 3.5 5.0+PTX' readable = cuda.nvcc_arch_readable('10.0', archs) message('Building for architectures ' + ' '.join(readable)) This will print Message: Building for architectures sm30 sm35 sm50 compute50 _Note:_ This function is intended to closely replicate CMake's FindCUDA module function `CUDA_SELECT_NVCC_ARCH_FLAGS(out_variable, [list of CUDA compute architectures])` ### `min_driver_version()` _Since: 0.50.0_ ``` meson cuda.min_driver_version(cuda_version_string) ``` Returns the minimum NVIDIA proprietary driver version required, on the host system, by kernels compiled with a CUDA Toolkit with the given version string. The output of this function is generally intended for informative message printing, but could be used for assertions or to conditionally enable features known to exist within the minimum NVIDIA driver required. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Wrap-best-practices-and-tips.md0000644000175000017500000001410214737503617026714 0ustar buildbuild# Wrap best practices and tips There are several things you need to take into consideration when writing a Meson build definition for a project. This is especially true when the project will be used as a subproject. This page lists a few things to consider when writing your definitions. ## Do not put config.h in external search path Many projects use a `config.h` header file that they use for configuring their project internally. These files are never installed to the system header files so there are no inclusion collisions. This is not the case with subprojects, your project tree may have an arbitrary number of configuration files, so we need to ensure they don't clash. The basic problem is that the users of the subproject must be able to include subproject headers without seeing its `config.h` file. The most correct solution is to rename the `config.h` file into something unique, such as `foobar-config.h`. This is usually not feasible unless you are the maintainer of the subproject in question. The pragmatic solution is to put the config header in a directory that has no other header files and then hide that from everyone else. One way is to create a top level subdirectory called `internal` and use that to build your own sources, like this: ```meson subdir('internal') # create config.h in this subdir internal_inc = include_directories('internal') shared_library('foo', 'foo.c', include_directories : internal_inc) ``` Many projects keep their `config.h` in the top level directory that has no other source files in it. In that case you don't need to move it but can just do this instead: ```meson internal_inc = include_directories('.') # At top level meson.build ``` ## Make libraries buildable both as static and shared Some platforms (e.g. iOS) requires linking everything in your main app statically. In other cases you might want shared libraries. They are also faster during development due to Meson's relinking optimization. However building both library types on all builds is slow and wasteful. Your project should use the `library` method that can be toggled between shared and static with the `default_library` builtin option. ```meson mylib = library('foo', 'foo.c') ``` ## Declare generated headers explicitly Meson's Ninja backend works differently from Make and other systems. Rather than processing things directory per directory, it looks at the entire build definition at once and runs the individual compile jobs in what might look to the outside as a random order. The reason for this is that this is much more efficient so your builds finish faster. The downside is that you have to be careful with your dependencies. The most common problem here is headers that are generated at compile time with e.g. code generators. If these headers are needed when building code that uses these libraries, the compile job might be run before the code generation step. The fix is to make the dependency explicit like this: ```meson myheader = custom_target(...) mylibrary = shared_library(...) mydep = declare_dependency(link_with : mylibrary, include_directories : include_directories(...), sources : myheader) ``` And then you can use the dependency in the usual way: ```meson executable('dep_using_exe', 'main.c', dependencies : mydep) ``` Meson will ensure that the header file has been built before compiling `main.c`. ## Avoid exposing compilable source files in declare_dependency The main use for the `sources` argument in `declare_dependency` is to construct the correct dependency graph for the backends, as demonstrated in the previous section. It is extremely important to note that it should *not* be used to directly expose compilable sources (`.c`, `.cpp`, etc.) of dependencies, and should rather only be used for header/config files. The following example will illustrate what can go wrong if you accidentally expose compilable source files. So you've read about unity builds and how Meson natively supports them. You decide to expose the sources of dependencies in order to have unity builds that include their dependencies. For your support library you do ```meson my_support_sources = files(...) mysupportlib = shared_library( ... sources : my_support_sources, ...) mysupportlib_dep = declare_dependency( ... link_with : mylibrary, sources : my_support_sources, ...) ``` And for your main project you do: ```meson mylibrary = shared_library( ... dependencies : mysupportlib_dep, ...) myexe = executable( ... link_with : mylibrary, dependencies : mysupportlib_dep, ...) ``` This is extremely dangerous. When building, `mylibrary` will build and link the support sources `my_support_sources` into the resulting shared library. Then, for `myexe`, these same support sources will be compiled again, will be linked into the resulting executable, in addition to them being already present in `mylibrary`. This can quickly run afoul of the [One Definition Rule (ODR)](https://en.wikipedia.org/wiki/One_Definition_Rule) in C++, as you have more than one definition of a symbol, yielding undefined behavior. While C does not have a strict ODR rule, there is no language in the standard which guarantees such behavior to work. Violations of the ODR can lead to weird idiosyncratic failures such as segfaults. In the overwhelming number of cases, exposing library sources via the `sources` argument in `declare_dependency` is thus incorrect. If you wish to get full cross-library performance, consider building `mysupportlib` as a static library instead and employing LTO. There are exceptions to this rule. If there are some natural constraints on how your library is to be used, you can expose sources. For instance, the WrapDB module for GoogleTest directly exposes the sources of GTest and GMock. This is valid, as GTest and GMock will only ever be used in *terminal* link targets. A terminal target is the final target in a dependency link chain, for instance `myexe` in the last example, whereas `mylibrary` is an intermediate link target. For most libraries this rule is not applicable though, as you cannot in general control how others consume your library, and as such should not expose sources. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Release-procedure.md0000644000175000017500000000527614737503617024742 0ustar buildbuild# Release procedure **This page is WIP. The following procedure is not yet approved for use** # Trunk Meson operates under the principle that trunk should (in theory) be always good enough for release. That is, all code merged in trunk must pass all unit tests. Any broken code should either be fixed or reverted immediately. People who are willing to tolerate the occasional glitch should be able to use Meson trunk for their day to day development if they so choose. # Major releases Major releases are currently in the form 0.X.0, where X is an increasing number. We aim to do a major release roughly once every 3 to 4 months, though the schedule is not set in stone. Before a major release is made a stable branch will be made, and 0.X.0-rc1 release candidate will be made. A new milestone for 0.X.0 will be made, and all bugs effecting the RC will be assigned to this milestone. Patches fixing bugs in the milestone will be picked to the stable branch, and normal development will continue on the master branch. Every week after this a new release candidate will be made until all bugs are resolved in that milestone. When all of the bugs are fixed the 0.X.0 release will be made. # Bugfix releases Bugfix releases contain only minor fixes to major releases and are designated by incrementing the last digit of the version number. The criteria for a bug fix release is one of the following: - release has a major regression compared to the previous release (making existing projects unbuildable) - the release has a serious bug causing data loss or equivalent - other unforeseen major issue In these cases a bug fix release can be made. It shall contain _only_ the fix for the issue (or issues) in question and other minor bug fixes. Only changes that have already landed in trunk will be considered for inclusion. No new functionality shall be added. # Requesting a bug fix release The process for requesting that a bug fix release be made goes roughly as follows: - file a bug about the core issue - file a patch fixing it if possible - contact the development team and request a bug fix release (IRC is the preferred contact medium) The request should contain the following information: - the issue in question - whether it has already caused problems for real projects - an estimate of how many people and projects will be affected There is no need to write a long and complicated request report. Something like the following is sufficient: > The latest release has a regression where trying to do Foo using Bar breaks. This breaks all projects that use both, which includes at least [list of affected projects]. This causes problems for X amount of people and because of this we should do a bugfix release. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Hotdoc-module.md0000644000175000017500000000356314737503617024074 0ustar buildbuild--- short-description: Hotdoc module authors: - name: Thibault Saunier email: tsaunier@igalia.com years: [2018] has-copyright: false ... # Hotdoc module This module provides helper functions for generating documentation using [hotdoc]. *Added 0.48.0* ## Usage To use this module, just do: **`hotdoc = import('hotdoc')`**. The following functions will then be available as methods on the object with the name `hotdoc`. You can, of course, replace the name `hotdoc` with anything else. ### hotdoc.generate_doc() Generates documentation using [hotdoc] and installs it into `$prefix/share/doc/html`. **Positional argument:** * `project_name`: The name of the hotdoc project **Keyworded arguments:** * `sitemap` ([[@str]] or [[@file]]) (**required**): The hotdoc sitemap file * `index` ([[@str]] or [[@file]]) (**required**): Location of the index file * `dependencies`([[@build_tgt]]): Targets on which the documentation generation depends on. * `subprojects`: A list of `HotdocTarget` that are used as subprojects for hotdoc to generate the documentation. * ... Any argument of `hotdoc` can be used replacing dashes (`-`) with underscores (`_`). For a full list of available parameters, just have a look at `hotdoc help`. **Returns:** `HotdocTarget`: A [[custom_target]] with the following extra methods: * `config_path`: Path to the generated `hotdoc` configuration file. ### hotdoc.has_extensions() **Positional arguments:** * `...`: The hotdoc extension names to look for **No keyworded arguments** **Returns:** `true` if all the extensions where found, `false` otherwise. ### Example ``` meson hotdoc = import('hotdoc') hotdoc.generate_doc('foobar', project_version: '0.1', sitemap: 'sitemap.txt', index: 'index.md', c_sources: ['path/to/file.c'], c_smart_index: true, languages: ['c'], install: true, ) ``` [hotdoc]: https://hotdoc.github.io/muon-v0.4.0/subprojects/meson-docs/docs/markdown/legal.md0000644000175000017500000000165414737503617022454 0ustar buildbuild# Legal information Meson is copyrighted by all members of the Meson development team. Meson is licensed under the [Apache 2 license]. Meson is a registered trademark of Jussi Pakkanen. ## Meson logo licensing Meson's logo is (C) Jussi Pakkanen and used by the Meson project with specific permission. It is not licensed under the same terms as the rest of the project. If you are a third party and want to use the Meson logo, you must first obtain written permission from Jussi Pakkanen. ## Website licensing The meson website content is released under [Creative Commons Attribution-ShareAlike 4.0 International]. All code samples on the website are released under [CC0 1.0 Universal]. [Creative Commons Attribution-ShareAlike 4.0 International]: https://creativecommons.org/licenses/by-sa/4.0/ [CC0 1.0 Universal]: https://creativecommons.org/publicdomain/zero/1.0/ [Apache 2 license]: https://www.apache.org/licenses/LICENSE-2.0 muon-v0.4.0/subprojects/meson-docs/docs/markdown/Release-notes-for-0.52.0.md0000644000175000017500000002235614737503617025404 0ustar buildbuild--- title: Release 0.52.0 short-description: Release notes for 0.52.0 ... # New features ## Gettext targets are ignored if `gettext` is not installed Previously the `i18n` module has errored out when `gettext` tools are not installed on the system. Starting with this version they will become no-ops instead. This makes it easier to build projects on minimal environments (such as when bootstrapping) that do not have translation tools installed. ## Support taking environment values from a dictionary `environment()` now accepts a dictionary as first argument. If provided, each key/value pair is added into the `environment_object` as if `set()` method was called for each of them. On the various functions that take an `env:` keyword argument, you may now give a dictionary. ## alias_target ``` meson runtarget alias_target(target_name, dep1, ...) ``` This function creates a new top-level target. Like all top-level targets, this integrates with the selected backend. For instance, with Ninja you can run it as `ninja target_name`. This is a dummy target that does not execute any command, but ensures that all dependencies are built. Dependencies can be any build target (e.g. return value of executable(), custom_target(), etc) ## Enhancements to the pkg_config_path argument Setting sys_root in the [properties] section of your cross file will now set PKG_CONFIG_SYSROOT_DIR automatically for host system dependencies when cross compiling. ## The Meson test program now accepts an additional "--gdb-path" argument to specify the GDB binary `meson test --gdb testname` invokes GDB with the specific test case. However, sometimes GDB is not in the path or a GDB replacement is wanted. Therefore, a `--gdb-path` argument was added to specify which binary is executed (per default `gdb`): ```console $ meson test --gdb --gdb-path /my/special/location/for/gdb testname $ meson test --gdb --gdb-path cgdb testname ``` ## Better support for illumos and Solaris illumos (and hopefully Solaris) support has been dramatically improved, and one can reasonably expect projects to compile. ## Splitting of Compiler.get_function_attribute('visibility') On macOS there is no `protected` visibility, which results in the visibility check always failing. 0.52.0 introduces two changes to improve this situation: 1. the "visibility" check no longer includes "protected" 2. a new set of "split" checks are introduced which check for a single attribute instead of all attributes. These new attributes are: * visibility:default * visibility:hidden * visibility:internal * visibility:protected ## Clang-tidy target If `clang-tidy` is installed and the project's source root contains a `.clang-tidy` (or `_clang-tidy`) file, Meson will automatically define a `clang-tidy` target that runs Clang-Tidy on all source files. If you have defined your own `clang-tidy` target, Meson will not generate its own target. ## Add blocks dependency Add `dependency('blocks')` to use the Clang blocks extension. ## Meson's builtin b_lundef is now supported on macOS This has always been possible, but there are some additional restrictions on macOS (mainly do to Apple only features). With the linker internal re-architecture this has become possible ## Compiler and dynamic linker representation split 0.52.0 includes a massive refactor of the representations of compilers to tease apart the representations of compilers and dynamic linkers (ld). This fixes a number of compiler/linker combinations. In particular this fixes use GCC and vanilla clang on macOS. ## Add `depth` option to `wrap-git` To allow shallow cloning, an option `depth` has been added to `wrap-git`. This applies recursively to submodules when `clone-recursive` is set to `true`. Note that the git server may have to be configured to support shallow cloning not only for branches but also for tags. ## Enhancements to the source_set module `SourceSet` objects now provide the `all_dependencies()` method, that complement the existing `all_sources()` method. ## added `--only test(s)` option to run_project_tests.py Individual tests or a list of tests from run_project_tests.py can be selected like: ``` python run_project_tests.py --only fortran python run_project_tests.py --only fortran python3 ``` This assists Meson development by only running the tests for the portion of Meson being worked on during local development. ## Experimental Webassembly support via Emscripten Meson now supports compiling code to Webassembly using the Emscripten compiler. As with most things regarding Webassembly, this support is subject to change. ## Version check in `find_program()` A new `version` keyword argument has been added to `find_program` to specify the required version. See [`dependency()`](#dependency) for argument format. The version of the program is determined by running `program_name --version` command. If stdout is empty it fallbacks to stderr. If the output contains more text than simply a version number, only the first occurrence of numbers separated by dots is kept. If the output is more complicated than that, the version checking will have to be done manually using [`run_command()`](#run_command). ## Added `vs_module_defs` to `shared_module()` Like `shared_library()`, `shared_module()` now accepts `vs_module_defs` argument for controlling symbol exports, etc. ## Improved support for static libraries Static libraries had numerous shortcomings in the past, especially when using uninstalled static libraries. This release brings many internal changes in the way they are handled, including: - `link_whole:` of static libraries. In the example below, lib2 used to miss symbols from lib1 and was unusable. ```meson lib1 = static_library(sources) lib2 = static_library(other_sources, link_whole : lib1, install : true) ``` - `link_with:` of a static library with an uninstalled static library. In the example below, lib2 now implicitly promote `link_with:` to `link_whole:` because the installed lib2 would otherwise be unusable. ```meson lib1 = static_library(sources, install : false) lib2 = static_library(sources, link_with : lib1, install : true) ``` - pkg-config generator do not include uninstalled static libraries. In the example below, the generated `.pc` file used to be unusable because it contained `Libs.private: -llib1` and `lib1.a` is not installed. `lib1` is now omitted from the `.pc` file because the `link_with:` has been promoted to `link_whole:` (see above) and thus lib1 is not needed to use lib2. ```meson lib1 = static_library(sources, install : false) lib2 = both_libraries(sources, link_with : lib1, install : true) pkg.generate(lib2) ``` Many projects have been using `extract_all_objects()` to work around those issues, and hopefully those hacks could now be removed. Since this is a pretty large change, please double check if your static libraries behave correctly, and report any regression. ## Enhancements to the kconfig module `kconfig.load()` may now accept a `configure_file()` as input file. ## Added `include_type` kwarg to `dependency` The `dependency()` function now has a `include_type` kwarg. It can take the values `'preserve'`, `'system'` and `'non-system'`. If it is set to `'system'`, all include directories of the dependency are marked as system dependencies. The default value of `include_type` is `'preserve'`. Additionally, it is also possible to check and change the `include_type` state of an existing dependency object with the new `include_type()` and `as_system()` methods. ## Enhancements to `configure_file()` `input:` now accepts multiple input file names for `command:`-configured file. `depfile:` keyword argument is now accepted. The dependency file can list all the additional files the configure target depends on. ## Projects args can be set separately for build and host machines (potentially breaking change) Simplify `native` flag behavior in `add_global_arguments`, `add_global_link_arguments`, `add_project_arguments` and `add_project_link_arguments`. The rules are now very simple: - `native: true` affects `native: true` targets - `native: false` affects `native: false` targets - No native flag is the same as `native: false` This further simplifies behavior to match the "build vs host" decision done in last release with `c_args` vs `build_c_args`. The underlying motivation in both cases is to execute the same commands whether the overall build is native or cross. ## Allow checking if a variable is a disabler Added the function `is_disabler(var)`. Returns true if a variable is a disabler and false otherwise. ## gtkdoc-check support `gnome.gtkdoc()` now has a `check` keyword argument. If `true` runs it will run `gtkdoc-check` when running unit tests. Note that this has the downside of rebuilding the doc for each build, which is often very slow. It usually should be enabled only in CI. ## `gnome.gtkdoc()` returns target object `gnome.gtkdoc()` now returns a target object that can be passed as dependency to other targets using generated doc files (e.g. in `content_files` of another doc). ## Dist is now a top level command Previously creating a source archive could only be done with `ninja dist`. Starting with this release Meson provides a top level `dist` that can be invoked directly. It also has a command line option to determine which kinds of archives to create: ```meson meson dist --formats=xztar,zip ``` muon-v0.4.0/subprojects/meson-docs/docs/markdown/Python-3-module.md0000644000175000017500000000264714737503617024277 0ustar buildbuild# Python 3 module This module provides support for dealing with Python 3. It has the following methods. This module is deprecated and replaced by the [python](Python-module.md) module. ## find_python This is a cross platform way of finding the Python 3 executable, which may have a different name on different operating systems. Returns an [[@external_program]] object. *Added 0.38.0* Deprecated, replaced by [`find_installation`](Python-module.md#find_installation) function from `python` module. ## extension_module Creates a `shared_module` target that is named according to the naming conventions of the target platform. All positional and keyword arguments are the same as for [[shared_module]]. `extension_module` does not add any dependencies to the library so user may need to add `dependencies : dependency('python3')`, see [Python3 dependency](Dependencies.md#python3). *Added 0.38.0* Deprecated, replaced by [`extension_module`](Python-module.md#extension_module) method from `python` module. ## language_version Returns a string with the Python language version such as `3.5`. *Added 0.40.0* Deprecated, replaced by [`language_version`](Python-module.md#language_version) method from `python` module. ## sysconfig_path Returns the Python sysconfig path without prefix, such as `lib/python3.6/site-packages`. *Added 0.40.0* Deprecated, replaced by [`get_path`](Python-module.md#get_path) method from `python` module. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Yaml-RefMan.md0000644000175000017500000001477614737503617023451 0ustar buildbuild--- title: YAML Reference manual short-description: Editing and maintaining the Reference manual ... # Reference Manual The [Reference Manual](Reference-manual.md) is automatically generated out of YAML files in `docs/yaml`. This allows the Meson project to enforce a consistent style of the Reference Manual and enables easier style changes to the generated Markdown files without touching the actual documentation. Additionally, multiple generation backends can be supported (besides the Markdown generator for mesonbuild.com). The generator that reads these YAML files is located in `docs/refman`, with the main executable being `docs/genrefman.py`. By default `genrefman.py` will load the yaml manual using a strict subset of yaml at the cost of loading slowly. You may optionally disable all these safety checks using the `fastyaml` loader, which will significantly speed things up at the cost of being less correct. The following python packages are required for the `genrefman` script: - chevron - strictyaml ## Linking to the Reference Manual Links to the Reference Manual can be inserted *anywhere* in the Meson docs with tags like this: `[[]]`. This guarantees that links remain stable (even if the structure of the Reference Manual changes) and are uniformly formatted everywhere. To link to functions, the function name should be put into the tag: `[[]]`. Methods (for all kinds of objects, including modules) can be linked to like this: `[[.]]`. To link to objects themselves, the `[[@]]` syntax can be used. These tags do **not** need to be put in inline code! A hotdoc extension handles the formatting here. If tags need to be placed (for instance, to include reference directly in code blocks), the `[[#]]` syntax should be used. Examples: - Functions: [[executable]] - Methods: [[meson.version]] - Objects: [[@str]] Now the same in a code block: ```meson [[#@str]] [[#executable]]('main', [ 'file_@0@.cpp'.format([[#meson.version]]) ]) ``` ## Directory structure The directory structure under `docs/yaml` is important, since it determines how the YAML files are interpreted: - `builtins`: Documentation for builtin objects, such as `meson` - `elementary`: Strings, lists, integers, void, etc. - `objects`: All Objects returned by functions and methods but **not** modules - `functions`: All root meson functions ([[executable]], [[project]], etc.) Finally, modules are defined inside the `modules` subdirectory. Here, each module has its own directory. The module itself **must** be in a file called `module.yaml`. All objects returned by the module are then located next to this file. The name of the YAML files themselves are ignored (with the exception of `module.yaml`) and carry no specific meaning. However, it is recommended to name the YAML files after the `name` entry of the object. All objects and functions whose name starts with a `_` are marked as private and are *not* exported in the final documents. The primary purpose of these files is to make inheriting functions and arguments easier. # YAML schema The YAML files themselves are structured as follows: ## Functions ```yaml name: executable # The name of the function [required] returns: build_tgt # Must be a `name` of an existing object [required] description: | The first line until the first dot of the description is the brief. All other lines are not part of the brief and should document the function Here the full Markdown syntax is supported, such as links, `inline code`, code blocks, and references to other parts of the Reference Manual: [[@str]]. This is true for **all** description keys in all YAML files. Defining a description is **always** required. since: 0.42.0 # A valid Meson version deprecated: 100.99.0 # A valid Meson version example: | Similar to `description`, but is put under a different section and should contain an example. notes: - A list of notes that should stand out. - Should be used sparingly. - Notes are optional. warnings: - Similar to notes, but a warning - Warnings are also optional. # To avoid duplicating documentation / code, argument inheritance is supported with # the following optional keys: posargs_inherit: _build_target_base # Use the posargs definition of `_build_target_base` here optargs_inherit: _build_target_base # Use the optargs definition of `_build_target_base` here varargs_inherit: _build_target_base # Use the varargs definition of `_build_target_base` here kwargs_inherit: _build_target_base # Add all kwargs of `_build_target_base` to this function # Whether argument flattening (see Syntax.md) is enabled # for this function. Defaults to `true`. args_flattening: true posargs: arg_name: type: bool | dep # [required] description: Some text. # [required] since: 0.42.0 deprecated: 100.99.0 default: false # Is technically supported buy should **not** be used for posargs another_arg: ... optargs: optional_arg: type: int # [required] description: Hello World # [required] since: 0.42.0 deprecated: 100.99.0 default: false # Default values can make sense here next_arg: ... varargs: name: Some name # [required] type: str | list[str | int] # [required] description: Some helpful text # [required] since: 0.42.0 deprecated: 100.99.0 min_varargs: 1 max_varargs: 21 kwargs: kwarg_name: type: str # [required] description: Meson is great! # [required] since: 0.42.0 deprecated: 100.99.0 default: false required: false # Some kwargs may be required ``` ## Objects ```yaml name: build_tgt # [required] long_name: Build target # [required] description: Just some description. # [required] example: Same as for functions # Objects can be marked as containers. In this case they can be used in a `type` # like this `container[held | objects]`. Currently this only makes sense for # lists and dicts. There is almost no reason to set this to true for other objects. is_container: true since: 0.42.0 deprecated: 100.99.0 # Notes and warnings work the same as with functions notes: warnings: # Inheritance is also supported for objects. Here all methods from the parent # object are inherited. The trick with `_private` objects also works here # to help with more complex structures. extends: tgt # Methods are a list of functions (see the previous section). methods: - ... ``` muon-v0.4.0/subprojects/meson-docs/docs/markdown/Release-notes-for-0.38.0.md0000644000175000017500000000745614737503617025414 0ustar buildbuild--- title: Release 0.38 short-description: Release notes for 0.38 ... ## Uninstall target Meson allows you to uninstall an install step by invoking the uninstall target. This will remove all files installed as part of install. Note that this does not restore the original files. This also does not undo changes done by custom install scripts (because they can do arbitrary install operations). ## Support for arbitrary test setups Sometimes you need to run unit tests with special settings. For example under Valgrind. Usually this requires extra command line options for the tool. This is supported with the new *test setup* feature. For example to set up a test run with Valgrind, you'd write this in a `meson.build` file: ```meson add_test_setup('valgrind', exe_wrapper : [vg, '--error-exitcode=1', '--leak-check=full'], timeout_multiplier : 100) ``` This tells Meson to run tests with Valgrind using the given options and multiplying the test timeout values by 100. To run this test setup simply issue the following command: ```console $ mesontest --setup=valgrind ``` ## Intel C/C++ compiler support As usual, just set `CC=icc CXX=icpc` and Meson will use it as the C/C++ compiler. Currently only Linux is supported. ## Get values from configuration data objects Now it is possible to query values stored in configuration data objects. ```meson cdata.set('key', 'value') cdata.get('key') # returns 'value' cdata.get('nokey', 'default') # returns 'default' cdata.get('nokey') # halts with an error ``` ## Python 3 module support Building Python 3 extension modules has always been possible, but it is now even easier: ```meson py3_mod = import('python3') pylib = py3_mod.extension_module('modname', 'modsource.c', dependencies : py3_dep) ``` ## Default options to subprojects Projects can specify overriding values for subprojects' `default_options` when invoking a subproject: ```meson subproject('foo', default_options : ['optname=overridevalue']) dependency('some-dep', fallback : ['some_subproject', 'some_dep'], default_options : ['optname=overridevalue']) ``` The effect is the same as if the default options were written in the subproject's `project` call. ## Set targets to be built (or not) by default Build targets got a new keyword `build_by_default` which tells whether the target should be built by default when running e.g. `ninja`. Custom targets are not built by default but other targets are. Any target that is tagged as installed or to be built always is also built by default, regardless of the value of this keyword. ## Add option to mesonconf to wipe cached data. Meson caches the results of dependency lookups. Sometimes these may get out of sync with the system state. Mesonconf now has a `--clearcache` option to clear these values so they will be re-searched from the system upon next compile. ## Can specify file permissions and owner when installing data The new `install_mode` keyword argument can be used to specify file permissions and uid/gid of files when doing the install. This allows you to, for example, install suid root scripts. ## `has_header()` checks are now faster When using compilers that implement the [`__has_include()` preprocessor macro](https://clang.llvm.org/docs/LanguageExtensions.html#include-file-checking-macros), the check is now ~40% faster. ## Array indexing now supports fallback values The second argument to the array [[list.get]] function is now returned if the specified index could not be found ```meson array = [10, 11, 12, 13] array.get(0) # this will return `10` array.get(4) # this will give an error about invalid index array.get(4, 0) # this will return `0` ``` ## Silent mode for Mesontest The Meson test executor got a new argument `-q` (and `--quiet`) that suppresses all output of successful tests. This makes interactive usage nicer because only errors are printed. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Additional.md0000644000175000017500000000026714737503617023437 0ustar buildbuild--- short-description: Misc documentation ... # Additional documentation This section references documents miscellaneous design, benchmarks, or basically anything concerning Meson. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Release-notes-for-0.57.0.md0000644000175000017500000003334014737503617025404 0ustar buildbuild--- title: Release 0.57.0 short-description: Release notes for 0.57.0 ... # New features ## Project version can be specified with a file Meson can be instructed to load a project's version string from an external file like this: ```meson project('foo', 'c', version: files('VERSION')) ``` The version file must contain exactly one line of text which will be used as the project's version. If the line ends in a newline character, it is removed. ## Support for reading files at configuration time with the `fs` module Reading text files during configuration is now supported. This can be done at any time after `project` has been called ```meson project('myproject', 'c') license_text = run_command( find_program('python3'), '-c', 'print(open("COPYING").read())' ).stdout().strip() about_header = configuration_data() about_header.add('COPYRIGHT', license_text) about_header.add('ABOUT_STRING', meson.project_name()) ... ``` There are several problems with the above approach: 1. It's ugly and confusing 2. If `COPYING` changes after configuration, Meson won't correctly rebuild when configuration data is based on the data in COPYING 3. It has extra overhead `fs.read` replaces the above idiom thus: ```meson project('myproject', 'c') fs = import('fs') license_text = fs.read('COPYING').strip() about_header = configuration_data() about_header.add('COPYRIGHT', license_text) about_header.add('ABOUT_STRING', meson.project_name()) ... ``` They are not equivalent, though. Files read with `fs.read` create a configuration dependency on the file, and so if the `COPYING` file is modified, Meson will automatically reconfigure, guaranteeing the build is consistent. It can be used for any properly encoded text files. It supports specification of non utf-8 encodings too, so if you're stuck with text files in a different encoding, it can be passed as an argument. See the [[@meson]] documentation for details. ## meson install --dry-run New option to meson install command that does not actually install files, but only prints messages. ## Experimental support for C++ modules in Visual Studio Modules are a new C++ 20 feature for organising source code aiming to increase compilation speed and reliability. This support is experimental and may change in future releases. It only works with the latest preview release of Visual Studio. ## Qt6 module A module for Qt6 is now available with the same functionality as the Qt5 module. Currently finding Qt6 is only available via `qmake` as pkg-config files aren't generated (see [QTBUG-86080](https://bugreports.qt.io/browse/QTBUG-86080)) and CMake support is not available for this module yet. ## Unstable Rust module A new unstable module has been added to make using Rust with Meson easier. Currently, it adds a single function to ease defining Rust tests, as well as a wrapper around bindgen, making it easier to use. ## Meson test() now accepts `protocol : 'rust'` This allows native Rust tests to be run and parsed by Meson; simply set the protocol to `rust` and Meson takes care of the rest. ## MSVC/Clang-Cl Argument Changes/Cleanup * "Disable Debug" (`/Od`) is no longer manually specified for optimization levels {`0`,`g`} (it is already the default for MSVC). * "Run Time Checking" (`/RTC1`) removed from `debug` buildtype by default * Clang-CL `debug` buildtype arguments now match MSVC arguments * There is now no difference between `buildtype` flags and `debug` + `optimization` flags The /Od flag has been removed, as it is already the default in the MSVC compilers, and conflicts with other user options. /RTC1 conflicts with other RTC argument types as there are many different options, and has been removed by default. Run Time Checking can be enabled by manually adding `/RTC1` or other RTC flags of your choice. The `debug` buildtype for clang-cl added additional arguments compared to MSVC, which had more to do with optimization than debug. The arguments removed are `/Ob0`, `/Od`, `/RTC1`. (`/Zi` was also removed, but it is already added by default when debug is enabled.) If these are important issues for you and would like builtin toggle options, please file an issue in the Meson bug tracker. ## Buildtype remains even if dependent options are changed Setting the `buildtype` option to a value sets the `debug` and `optimization` options to predefined values. Traditionally setting the options to other values would then change the buildtype to `custom`. This is confusing and means that you can't use, for example, debug level `g` in `debug` buildtype even though it would make sense under many circumstances. Starting with this release, the buildtype is only changed when the user explicitly sets it; setting the build type modifies the `debug` and `optimization` options as before. ## Passing internal dependencies to the compiler object Methods on the compiler object (such as `compiles`, `links`, `has_header`) can be passed dependencies returned by `declare_dependency`, as long as they only specify compiler/linker arguments or other dependencies that satisfy the same requirements. ## `unstable-external_project` improvements - Default arguments are added to `add_project()` in case some tags are not found in `configure_options`: `'--prefix=@PREFIX@'`, `'--libdir=@PREFIX@/@LIBDIR@'`, and `'--includedir=@PREFIX@/@INCLUDEDIR@'`. It was previously considered a fatal error to not specify them. - When the `verbose` keyword argument is not specified, or is false, command outputs are written on file in `/meson-logs/`. - The `LD` environment variable is not passed any more when running the configure script. It caused issues because Meson sets `LD` to the `CC` linker wrapper but autotools expects it to be a real linker (e.g. `/usr/bin/ld`). ## `gnome.post_install()` Post-install update of various system wide caches. Each script will be executed only once even if `gnome.post_install()` is called multiple times from multiple subprojects. If `DESTDIR` is specified during installation all scripts will be skipped. Currently supports `glib-compile-schemas`, `gio-querymodules`, and `gtk-update-icon-cache`. ## "Edit and continue" (/ZI) is no longer used by default for Visual Studio Meson was adding the `/ZI` compiler argument as an argument for Visual Studio in debug mode. This enables the `edit-and-continue` debugging in Visual Studio IDE's. Unfortunately, it is also extremely expensive and breaks certain use cases such as link time code generation. Edit and continue can be enabled by manually by adding `/ZI` to compiler arguments. The `/ZI` argument has now been replaced by the `/Zi` argument for debug builds. If this is an important issue for you and would like a builtin toggle option, please file an issue in the Meson bug tracker. ## Minimum required Python version updated to 3.6 Meson now requires at least Python version 3.6 to run as Python 3.5 reaches EOL on September 2020. In practice this should only affect people developing on Ubuntu Xenial, which will similarly reach EOL in April 2021. ## Packaging a subproject The `meson dist` command can now create a distribution tarball for a subproject in the same git repository as the main project. This can be useful if parts of the project (e.g. libraries) can be built and distributed separately. In that case they can be moved into `subprojects/mysub` and running `meson dist` in that directory will now create a tarball containing only the source code from that subdir and not the rest of the main project or other subprojects. For example: ```sh git clone https://github.com/myproject cd myproject/subprojects/mysubproject meson setup builddir meson dist -C builddir ``` ## `custom_target()` and `run_target()` now accepts an `env` keyword argument Environment variables can now be passed to the `custom_target()` command. ```meson env = environment() env.append('PATH', '/foo') custom_target(..., env: env) custom_target(..., env: {'MY_ENV': 'value'}) custom_target(..., env: ['MY_ENV=value']) ``` ## `summary()` accepts external programs or dependencies External program objects and dependency objects can be passed to `summary()` as the value to be printed. ## CMake `find_package` version support It is now possible to specify a requested package version for the CMake dependency backend via the new `cmake_package_version` kwarg in the `dependency` function. ## `meson test` only rebuilds test dependencies Until now, `meson test` rebuilt the whole project independent of the requested tests and their dependencies. With this release, `meson test` will only rebuild what is needed for the tests or suites that will be run. This feature can be used, for example, to speed up bisecting regressions using commands like the following: git bisect start git bisect run meson test This would find the broken commit automatically while at each step rebuilding only those pieces of code needed to run the test. However, this change could cause failures when upgrading to 0.57, if the dependencies are not specified correctly in `meson.build`. ## The `add_*_script` methods now accept a File as the first argument Meson now accepts `file` objects, including those produced by `configure_file`, as the first parameter of the various `add_*_script` methods ```meson install_script = configure_file( configuration : conf, input : 'myscript.py.in', output : 'myscript.py', ) meson.add_install_script(install_script, other, params) ``` ## Unity build with Vala disabled The approach that meson has used for Vala unity builds is incorrect, we combine the generated C files like we would any other C file. This is very fragile however, as the Vala compiler generates helper functions and macros which work fine when each file is a separate translation unit, but fail when they are combined. ## New logging format for `meson test` The console output format for `meson test` has changed in several ways. The major changes are: * if stdout is a tty, `meson` includes a progress report. * if `--print-errorlogs` is specified, the logs are printed as tests run rather than afterwards. All the error logs are printed rather than only the first ten. * if `--verbose` is specified and `--num-processes` specifies more than one concurrent test, test output is buffered and printed after the test finishes. * the console logs include a reproducer command. If `--verbose` is specified, the command is printed for all tests at the time they start; otherwise, it is printed for failing tests at the time the test finishes. * for TAP and Rust tests, Meson is able to report individual subtests. If `--verbose` is specified, all tests are reported. If `--print-errorlogs` is specified, only failures are. In addition, if `--verbose` was specified, Meson used not to generate logs. This limitation has now been removed. These changes make the default `ninja test` output more readable, while `--verbose` output provides detailed, human-readable logs that are well suited to CI environments. ## Specify DESTDIR on command line `meson install` command now has a `--destdir` argument that overrides `DESTDIR` from environment. ## Skip install scripts if DESTDIR is set `meson.add_install_script()` now has `skip_if_destdir` keyword argument. If set to `true` the script won't be run if `DESTDIR` is set during installation. This is useful in the case the script updates system wide caches, or performs other tasks that are only needed when copying files into final destination. ## Add support for prelinked static libraries The static library gains a new `prelink` keyword argument that can be used to prelink object files in that target. This is currently only supported for the GNU toolchain, patches to add it to other compilers are most welcome. ## Rust now has an `std` option Rust calls these `editions`, however, Meson generally refers to such language versions as "standards", or `std` for short. Therefore, Meson's Rust support uses `std` for consistency with other languages. ## Ctrl-C behavior in `meson test` Starting from this version, sending a `SIGINT` signal (or pressing `Ctrl-C`) to `meson test` will interrupt the longest running test. Pressing `Ctrl-C` three times within a second will exit `meson test`. ## Support added for LLVM's thinLTO A new `b_lto_mode` option has been added, which may be set to `default` or `thin`. Thin only works for clang, and only with gnu gold, lld variants, or ld64. ## `test()` timeout and timeout_multiplier value <= 0 `test(..., timeout: 0)`, or negative value, used to abort the test immediately but now instead allow infinite duration. Note that omitting the `timeout` keyword argument still defaults to 30s timeout. Likewise, `add_test_setup(..., timeout_multiplier: 0)`, or `meson test --timeout-multiplier 0`, or negative value, disable tests timeout. ## Knob to control LTO thread Both the gnu linker and lld support using threads for speeding up LTO, meson now provides a knob for this: `-Db_lto_threads`. Currently this is only supported for clang and gcc. Any positive integer is supported, `0` means `auto`. If the compiler or linker implements its own `auto` we use that, otherwise the number of threads on the machine is used. ## `summary()` now uses left alignment for both keys and values Previously it aligned keys toward the center, but this was deemed harder to read than having everything left aligned. ## `//` is now allowed as a function id for `meson rewrite`. msys bash may expand `/` to a path, breaking `meson rewrite kwargs set project / ...`. Passing `//` will be converted to `/` by msys bash but in order to keep usage shell-agnostic, this release also allows `//` as the id. This way, `meson rewrite kwargs set project // ...` will work in both msys bash and other shells. ## Get keys of configuration data object All keys of the `configuration_data` object can be obtained with the `keys()` method as an alphabetically sorted array. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Release-notes-for-0.55.0.md0000644000175000017500000002653714737503617025414 0ustar buildbuild--- title: Release 0.55.0 short-description: Release notes for 0.55.0 ... # New features ## rpath removal now more careful On Linux-like systems, Meson adds rpath entries to allow running apps in the build tree, and then removes those build-time-only rpath entries when installing. Rpath entries may also come in via LDFLAGS and via .pc files. Meson used to remove those latter rpath entries by accident, but is now more careful. ## Added ability to specify targets in `meson compile` It's now possible to specify targets in `meson compile`, which will result in building only the requested targets. Usage: `meson compile [TARGET [TARGET...]]` `TARGET` has the following syntax: `[PATH/]NAME[:TYPE]`. `NAME`: name of the target from `meson.build` (e.g. `foo` from `executable('foo', ...)`). `PATH`: path to the target relative to the root `meson.build` file. Note: relative path for a target specified in the root `meson.build` is `./`. `TYPE`: type of the target (e.g. `shared_library`, `executable` and etc) `PATH` and/or `TYPE` can be omitted if the resulting `TARGET` can be used to uniquely identify the target in `meson.build`. For example targets from the following code: ```meson shared_library('foo', ...) static_library('foo', ...) executable('bar', ...) ``` can be invoked with `meson compile foo:shared_library foo:static_library bar`. ## Test protocol for gtest Due to the popularity of Gtest (google test) among C and C++ developers Meson now supports a special protocol for gtest. With this protocol Meson injects arguments to gtests to output JUnit, reads that JUnit, and adds the output to the JUnit it generates. ## meson.add_*_script methods accept new types All three (`add_install_script`, `add_dist_script`, and `add_postconf_script`) now accept ExternalPrograms (as returned by `find_program`), Files, and the output of `configure_file`. The dist and postconf methods cannot accept other types because of when they are run. While dist could, in theory, take other dependencies, it would require more extensive changes, particularly to the backend. ```meson meson.add_install_script(find_program('foo'), files('bar')) meson.add_dist_script(find_program('foo'), files('bar')) meson.add_postconf_script(find_program('foo'), files('bar')) ``` The install script variant is also able to accept custom_targets, custom_target indexes, and build targets (executables, libraries), and can use built executables a the script to run ```meson installer = executable('installer', ...) meson.add_install_script(installer, ...) meson.add_install_script('foo.py', installer) ``` ## Machine file constants Native and cross files now support string and list concatenation using the `+` operator, and joining paths using the `/` operator. Entries defined in the `[constants]` section can be used in any other section. An entry defined in any other section can be used only within that same section and only after it has been defined. ```ini [constants] toolchain = '/toolchain' common_flags = ['--sysroot=' + toolchain + '/sysroot'] [properties] c_args = common_flags + ['-DSOMETHING'] cpp_args = c_args + ['-DSOMETHING_ELSE'] [binaries] c = toolchain + '/gcc' ``` ## Configure CMake subprojects with Meson.subproject_options Meson now supports passing configuration options to CMake and overriding certain build details extracted from the CMake subproject. The new CMake configuration options object is very similar to the [[@cfg_data]] object returned by [[configuration_data]]. It is generated by the `subproject_options` function All configuration options have to be set *before* the subproject is configured and must be passed to the `subproject` method via the `options` key. Altering the configuration object won't have any effect on previous `cmake.subproject` calls. **Note:** The `cmake_options` kwarg for the `subproject` function is now deprecated since it is replaced by the new `options` system. ## find_program: Fixes when the program has been overridden by executable When a program has been overridden by an executable, the returned object of find_program() had some issues: ```meson # In a subproject: exe = executable('foo', ...) meson.override_find_program('foo', exe) # In main project: # The version check was crashing Meson. prog = find_program('foo', version : '>=1.0') # This was crashing Meson. message(prog.path()) # New method to be consistent with built objects. message(prog.full_path()) ``` ## Response files enabled on Linux, reined in on Windows Meson used to always use response files on Windows, but never on Linux. It now strikes a happier balance, using them on both platforms, but only when needed to avoid command line length limits. ## `unstable-kconfig` module renamed to `unstable-keyval` The `unstable-kconfig` module is now renamed to `unstable-keyval`. We expect this module to become stable once it has some usage experience, specifically in the next or the following release ## Fatal warnings in `gnome.generate_gir()` `gnome.generate_gir()` now has `fatal_warnings` keyword argument to abort when a warning is produced. This is useful for example in CI environment where it's important to catch potential issues. ## b_ndebug support for D language compilers D Language compilers will now set -release/--release/-frelease (depending on the compiler) when the b_ndebug flag is set. ## Meson test now produces JUnit xml from results Meson will now generate a JUnit compatible XML file from test results. it will be in the `meson-logs` directory and is called `testlog.junit.xml`. ## Config tool based dependencies no longer search PATH for cross compiling Before 0.55.0 config tool based dependencies (llvm-config, cups-config, etc), would search system $PATH if they weren't defined in the cross file. This has been a source of bugs and has been deprecated. It is now removed, config tool binaries must be specified in the cross file now or the dependency will not be found. ## Rename has_exe_wrapper -> can_run_host_binaries The old name was confusing as it didn't really match the behavior of the function. The old name remains as an alias (the behavior hasn't changed), but is now deprecated. ## String concatenation in meson_options.txt It is now possible to use string concatenation (with the `+` operator) in the `meson_options.txt` file. This allows splitting long option descriptions. ```meson option( 'testoption', type : 'string', value : 'optval', description : 'An option with a very long description' + 'that does something in a specific context' ) ``` ## Wrap fallback URL Wrap files can now define `source_fallback_url` and `patch_fallback_url` to be used in case the main server is temporarily down. ## Clang coverage support llvm-cov is now used to generate coverage information when clang is used as the compiler. ## Local wrap source and patch files It is now possible to use the `patch_filename` and `source_filename` value in a `.wrap` file without `*_url` to specify a local source / patch file. All local files must be located in the `subprojects/packagefiles` directory. The `*_hash` entries are optional with this setup. ## Local wrap patch directory Wrap files can now specify `patch_directory` instead of `patch_filename` in the case overlay files are local. Every files in that directory, and subdirectories, will be copied to the subproject directory. This can be used for example to add `meson.build` files to a project not using Meson build system upstream. The patch directory must be placed in `subprojects/packagefiles` directory. ## Patch on all wrap types `patch_*` keys are not limited to `wrap-file` any more, they can be specified for all wrap types. ## link_language argument added to all targets Previously the `link_language` argument was only supposed to be allowed in executables, because the linker used needs to be the linker for the language that implements the main function. Unfortunately it didn't work in that case, and, even worse, if it had been implemented properly it would have worked for *all* targets. In 0.55.0 this restriction has been removed, and the bug fixed. It now is valid for `executable` and all derivative of `library`. ## meson dist --no-tests `meson dist` has a new option `--no-tests` to skip build and tests of generated packages. It can be used to not waste time for example when done in CI that already does its own testing. ## Force fallback for A newly-added `--force-fallback-for` command line option can now be used to force fallback for specific subprojects. Example: ``` meson setup builddir/ --force-fallback-for=foo,bar ``` ## Implicit dependency fallback `dependency('foo')` now automatically fallback if the dependency is not found on the system but a subproject wrap file or directory exists with the same name. That means that simply adding `subprojects/foo.wrap` is enough to add fallback to any `dependency('foo')` call. It is however requires that the subproject call `meson.override_dependency('foo', foo_dep)` to specify which dependency object should be used for `foo`. ## Wrap file `provide` section Wrap files can define the dependencies it provides in the `[provide]` section. When `foo.wrap` provides the dependency `foo-1.0` any call do `dependency('foo-1.0')` will automatically fallback to that subproject even if no `fallback` keyword argument is given. See [Wrap documentation](Wrap-dependency-system-manual.md#provide_section). ## `find_program()` fallback When a program cannot be found on the system but a wrap file has its name in the `[provide]` section, that subproject will be used as fallback. ## Test scripts are given the exe wrapper if needed Meson will now set the `MESON_EXE_WRAPPER` as the properly wrapped and joined representation. For Unix-like OSes this means python's shelx.join, on Windows an implementation that attempts to properly quote windows argument is used. This allow wrapper scripts to run test binaries, instead of just skipping. for example, if the wrapper is `['emulator', '--script']`, it will be passed as `MESON_EXE_WRAPPER="emulator --script"`. ## Added ability to specify backend arguments in `meson compile` It's now possible to specify backend specific arguments in `meson compile`. Usage: `meson compile [--vs-args=args] [--ninja-args=args]` ``` --ninja-args NINJA_ARGS Arguments to pass to `ninja` (applied only on `ninja` backend). --vs-args VS_ARGS Arguments to pass to `msbuild` (applied only on `vs` backend). ``` These arguments use the following syntax: If you only pass a single string, then it is considered to have all values separated by commas. Thus invoking the following command: ``` $ meson compile --ninja-args=-n,-d,explain ``` would add `-n`, `-d` and `explain` arguments to ninja invocation. If you need to have commas or spaces in your string values, then you need to pass the value with proper shell quoting like this: ``` $ meson compile "--ninja-args=['a,b', 'c d']" ``` ## Introspection API changes dumping the AST (--ast): **new in 0.55.0** - prints the AST of a meson.build as JSON ## `--backend=vs` now matches `-Db_vscrt=from_buildtype` behaviour in the Ninja backend When `--buildtype=debugoptimized` is used with the Ninja backend, the VS CRT option used is `/MD`, which is the [behaviour documented for all backends](https://mesonbuild.com/Builtin-options.html#b_vscrt-from_buildtype). However, the Visual Studio backend was pass `/MT` in that case, which is inconsistent. If you need to use the MultiThreaded CRT, you should explicitly pass `-Db_vscrt=mt` muon-v0.4.0/subprojects/meson-docs/docs/markdown/Manual.md0000644000175000017500000000034214737503617022576 0ustar buildbuild--- short-description: User manual for Meson ... # Manual This is the user manual for Meson. It currently tracks the state of Git head. If you are using an older version, some of the information here might not work for you. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Pkg-config-files.md0000644000175000017500000000237514737503617024455 0ustar buildbuild# Pkg config files [Pkg-config](https://en.wikipedia.org/wiki/Pkg-config) is a way for shared libraries to declare the compiler flags needed to use them. There are two different ways of generating Pkg-config files in Meson. The first way is to build them manually with the `configure_file` command. The second way is to use Meson's built in Pkg-config file generator. The difference between the two is that the latter is very simple and meant for basic use cases. The former should be used when you need to provide a more customized solution. In this document we describe the simple generator approach. It is used in the following way. ```meson pkg = import('pkgconfig') libs = ... # the library/libraries users need to link against h = ['.', ...] # subdirectories of ${prefix}/${includedir} to add to header path pkg.generate(libraries : libs, subdirs : h, version : '1.0', name : 'libsimple', filebase : 'simple', description : 'A simple demo library.') ``` This causes a file called `simple.pc` to be created and placed into the install directory during the install phase. More information on the pkg-config module and the parameters can be found on the [pkgconfig-module](Pkgconfig-module.md) page. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Continuous-Integration.md0000644000175000017500000002011614737503617026011 0ustar buildbuild# Continuous Integration Here you will find snippets to use Meson with various CI such as Travis and AppVeyor. Please [file an issue](https://github.com/mesonbuild/meson/issues/new) if these instructions don't work for you. ## Travis-CI with Docker Travis with Docker gives access to newer non-LTS Ubuntu versions with pre-installed libraries of your choice. This `yml` file is derived from the [configuration used by Meson](https://github.com/mesonbuild/meson/blob/master/.travis.yml) for running its own tests. ```yaml os: - linux - osx language: - cpp services: - docker before_install: - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install python3 ninja; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then pip3 install meson; fi - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then docker pull YOUR/REPO:eoan; fi script: - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then echo FROM YOUR/REPO:eoan > Dockerfile; fi - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then echo ADD . /root >> Dockerfile; fi - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then docker build -t withgit .; fi - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then docker run withgit /bin/sh -c "cd /root && TRAVIS=true CC=$CC CXX=$CXX meson setup builddir && meson test -C builddir"; fi - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then SDKROOT=$(xcodebuild -version -sdk macosx Path) meson setup builddir && meson test -C builddir; fi ``` ## CircleCI for Linux host (with custom Docker images) [CircleCi](https://circleci.com/) can work for spinning all of the Linux images you wish. Here's a sample `yml` file for use with that. ```yaml version: 2.1 executors: # Your dependencies would go in the docker images that represent # the Linux distributions you are supporting meson_ubuntu_builder: docker: - image: your_dockerhub_username/ubuntu-sys meson_debian_builder: docker: - image: your_dockerhub_username/debian-sys meson_fedora_builder: docker: - image: your_dockerhub_username/fedora-sys jobs: meson_ubuntu_build: executor: meson_ubuntu_builder steps: - checkout - run: name: Configure Project command: meson setup builddir --backend ninja - run: name: Compile Project command: meson compile -C builddir - run: name: Run Tests command: meson test -C builddir meson_debian_build: executor: meson_debian_builder steps: - checkout - run: name: Configure Project command: meson setup builddir --backend ninja - run: name: Compile Project command: meson compile -C builddir - run: name: Run Tests command: meson test -C builddir meson_fedora_build: executor: meson_fedora_builder steps: - checkout - run: name: Configure Project command: meson setup builddir --backend ninja - run: name: Compile Project command: meson compile -C builddir - run: name: Run Tests command: meson test -C builddir workflows: version: 2 linux_workflow: jobs: - meson_ubuntu_build - meson_debian_build - meson_fedora_build ``` ## CircleCI for Linux host (without custom Docker images) This CircleCI configuration defines two jobs, `build-linux` and `build-macos`, within a workflow named `build`. The `build-linux` job utilizes a Docker image with Python 3.12.3, while `build-macos` runs on macOS with Xcode 15.3.0. Each job involves checking out the code, installing Meson and Ninja, configuring the project, compiling it, and running tests using Meson. ```yaml version: 2.1 jobs: build-linux: docker: - image: cimg/python:3.12.3 steps: - checkout - run: name: Install Meson and Ninja command: | python -m pip install --user meson ninja - run: name: Configure Project command: | meson setup builddir - run: name: Compile Project command: | meson compile -C builddir - run: name: Run Tests command: | meson test -C builddir build-macos: macos: xcode: 15.3.0 steps: - checkout - run: name: Install Meson and Ninja command: | python -m pip install meson ninja - run: name: Configure Project command: | meson setup builddir - run: name: Compile Project command: | meson compile -C builddir - run: name: Run Tests command: | meson test -C builddir workflows: version: 2.1 build: jobs: - build-linux - build-macos ``` ## AppVeyor for Windows For CI on Windows, [AppVeyor](https://www.appveyor.com/) has a wide selection of [default configurations](https://www.appveyor.com/docs/windows-images-software/). AppVeyor also has [MacOS](https://www.appveyor.com/docs/macos-images-software/) and [Linux](https://www.appveyor.com/docs/linux-images-software/) CI images. This is a sample `appveyor.yml` file for Windows with Visual Studio 2017, 2019, and 2022. ```yaml version: 1.0.{build} image: - Visual Studio 2022 - Visual Studio 2019 - Visual Studio 2017 install: - cmd: python -m pip install meson ninja build_script: - cmd: >- meson setup builddir meson compile -C builddir test_script: - cmd: meson test -C builddir ``` ### Qt For Qt 5, add the following line near the `PYTHON_ROOT` assignment: ```yaml - cmd: if %arch%==x86 (set QT_ROOT=C:\Qt\5.11\%compiler%) else (set QT_ROOT=C:\Qt\5.11\%compiler%_64) ``` And afterwards add `%QT_ROOT%\bin` to the `PATH` variable. You might have to adjust your build matrix as there are, for example, no msvc2017 32-bit builds. Visit the [Build Environment](https://www.appveyor.com/docs/build-environment/) page in the AppVeyor docs for more details. ### Boost The following statement is sufficient for Meson to find Boost: ```yaml - cmd: set BOOST_ROOT=C:\Libraries\boost_1_67_0 ``` ## Travis without Docker Non-Docker Travis-CI builds can use Linux, MacOS or Windows. Set the desired compiler(s) in the build **matrix**. This example is for **Linux** (Ubuntu 18.04) and **C**. ```yaml dist: bionic group: travis_latest os: linux language: python matrix: include: - env: CC=gcc - env: CC=clang install: - pip install meson ninja script: - meson setup builddir - meson compile -C builddir - meson test -C builddir ``` ## GitHub Actions GitHub Actions provides a versatile platform for continuous integration (CI). This example workflow file, `ci_meson.yml`, is tailored for C-based projects utilizing GCC on Linux, macOS, and Windows. Triggered by changes to C code files, it automates building and testing processes using different versions of Meson (1.0.0, 1.1.0, 1.2.0, 1.3.0, 1.4.0) across various operating systems. Each job in the workflow handles checkout, dependency installation, project configuration, test execution, and optional test log uploads upon failure. ```yaml name: CI Meson on: push: paths: - "**.c" - "**.h" pull_request: paths: - "**.c" - "**.h" jobs: build: name: Build and Test on ${{ matrix.os }} with Meson v${{ matrix.meson_version }} runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] meson_version: ["1.2.0", "1.3.0", "1.4.0"] steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: '3.x' - name: Install dependencies run: python -m pip install meson==${{ matrix.meson_version }} ninja - name: Configure Project run: meson setup builddir/ env: CC: gcc - name: Run Tests run: meson test -C builddir/ -v - name: Upload Test Log uses: actions/upload-artifact@v4 if: failure() with: name: ${{ matrix.os }}_Meson_Testlog path: builddir/meson-logs/testlog.txt ``` muon-v0.4.0/subprojects/meson-docs/docs/markdown/Release-notes-for-0.50.0.md0000644000175000017500000002604614737503617025402 0ustar buildbuild--- title: Release 0.50.0 short-description: Release notes for 0.50.0 ... # New features ## Added `cmake_module_path` and `cmake_args` to dependency The CMake dependency backend can now make use of existing `Find.cmake` files by setting the `CMAKE_MODULE_PATH` with the new `dependency()` property `cmake_module_path`. The paths given to `cmake_module_path` should be relative to the project source directory. Furthermore the property `cmake_args` was added to give CMake additional parameters. ## Added PGI compiler support Nvidia / PGI C, C++ and Fortran [no-cost](https://www.pgroup.com/products/community.htm) compilers are now supported. They have been tested on Linux so far. ## Fortran Coarray Fortran 2008 / 2018 coarray support was added via `dependency('coarray')` ## Libdir defaults to `lib` when cross compiling Previously `libdir` defaulted to the value of the build machine such as `lib/x86_64-linux-gnu`, which is almost always incorrect when cross compiling. It now defaults to plain `lib` when cross compiling. Native builds remain unchanged and will point to the current system's library dir. ## Native and Cross File Paths and Directories A new `[paths]` section has been added to native and cross files. This can be used to set paths such a prefix and libdir in a persistent way. ## Add warning_level 0 option Adds support for a warning level 0 which does not enable any static analysis checks from the compiler ## A builtin target to run clang-format If you have `clang-format` installed and there is a `.clang-format` file in the root of your master project, Meson will generate a run target called `clang-format` so you can reformat all files with one command: ```meson ninja clang-format ``` ## Added `.path()` method to object returned by `python.find_installation()` `ExternalProgram` objects as well as the object returned by the `python3` module provide this method, but the new `python` module did not. ## Fix ninja console log from generators with multiple output nodes This resolves [issue #4760](https://github.com/mesonbuild/meson/issues/4760) where a generator with multiple output nodes printed an empty string to the console ## `introspect --buildoptions` can now be used without configured build directory It is now possible to run `meson introspect --buildoptions /path/to/meson.build` without a configured build directory. Running `--buildoptions` without a build directory produces the same output as running it with a freshly configured build directory. However, this behavior is not guaranteed if subprojects are present. Due to internal limitations all subprojects are processed even if they are never used in a real Meson run. Because of this options for the subprojects can differ. ## `include_directories` accepts a string The `include_directories` keyword argument now accepts plain strings rather than an include directory object. Meson will transparently expand it so that a declaration like this: ```meson executable(..., include_directories: 'foo') ``` Is equivalent to this: ```meson foo_inc = include_directories('foo') executable(..., include_directories: foo_inc) ``` ## Fortran submodule support Initial support for Fortran `submodule` was added, where the submodule is in the same or different file than the parent `module`. The submodule hierarchy specified in the source Fortran code `submodule` statements are used by Meson to resolve source file dependencies. For example: ```fortran submodule (ancestor:parent) child ``` ## Add `subproject_dir` to `--projectinfo` introspection output This allows applications interfacing with Meson (such as IDEs) to know about an overridden subproject directory. ## Find library with its headers The `find_library()` method can now also verify if the library's headers are found in a single call, using the `has_header()` method internally. ```meson # Aborts if the 'z' library is found but not its header file zlib = find_library('z', has_headers : 'zlib.h') # Returns not-found if the 'z' library is found but not its header file zlib = find_library('z', has_headers : 'zlib.h', required : false) ``` Any keyword argument with the `header_` prefix passed to `find_library()` will be passed to the `has_header()` method with the prefix removed. ```meson libfoo = find_library('foo', has_headers : ['foo.h', 'bar.h'], header_prefix : '#include ', header_include_directories : include_directories('.')) ``` ## NetCDF NetCDF support for C, C++ and Fortran is added via pkg-config. ## Added the Flang compiler [Flang](https://github.com/flang-compiler/flang/releases) Fortran compiler support was added. As with other Fortran compilers, flang is specified using `FC=flang meson ..` or similar. ## New `not_found_message` for `dependency()` You can now specify a `not_found_message` that will be printed if the specified dependency was not found. The point is to convert constructs that look like this: ```meson d = dependency('something', required: false) if not d.found() message('Will not be able to do something.') endif ``` Into this: ```meson d = dependency('something', required: false, not_found_message: 'Will not be able to do something.') ``` Or constructs like this: ```meson d = dependency('something', required: false) if not d.found() error('Install something by doing XYZ.') endif ``` into this: ```meson d = dependency('something', not_found_message: 'Install something by doing XYZ.') ``` Which works, because the default value of `required` is `true`. ## Cuda support Compiling Cuda source code is now supported, though only with the Ninja backend. This has been tested only on Linux for now. Because NVidia's Cuda compiler does not produce `.d` dependency files, dependency tracking does not work. ## `run_command()` accepts `env` kwarg You can pass [[@env]] object to [[run_command]], just like to `test`: ```meson env = environment() env.set('FOO', 'bar') run_command('command', 'arg1', 'arg2', env: env) ``` ## `extract_objects:` accepts `File` arguments The `extract_objects` function now supports File objects to tell it what to extract. Previously, file paths could only be passed as strings. ## Changed the JSON format of the introspection All paths used in the Meson introspection JSON format are now absolute. This affects the `filename` key in the targets introspection and the output of `--buildsystem-files`. Furthermore, the `filename` and `install_filename` keys in the targets introspection are now lists of strings with identical length. The `--target-files` option is now deprecated, since the same information can be acquired from the `--targets` introspection API. ## Meson file rewriter This release adds the functionality to perform some basic modification on the `meson.build` files from the command line. The currently supported operations are: - For build targets: - Add/Remove source files - Add/Remove targets - Modify a select set of kwargs - Print some JSON information - For dependencies: - Modify a select set of kwargs - For the project function: - Modify a select set of kwargs - Modify the default options list For more information see the rewriter documentation. ## `introspect --scan-dependencies` can now be used to scan for dependencies used in a project It is now possible to run `meson introspect --scan-dependencies /path/to/meson.build` without a configured build directory to scan for dependencies. The output format is as follows: ```json [ { "name": "The name of the dependency", "required": true, "conditional": false, "has_fallback": false } ] ``` The `required` keyword specifies whether the dependency is marked as required in the `meson.build` (all dependencies are required by default). The `conditional` key indicates whether the `dependency()` function was called inside a conditional block. In a real Meson run these dependencies might not be used, thus they _may_ not be required, even if the `required` key is set. The `has_fallback` key just indicates whether a fallback was directly set in the `dependency()` function. ## `introspect --targets` can now be used without configured build directory It is now possible to run `meson introspect --targets /path/to/meson.build` without a configured build directory. The generated output is similar to running the introspection with a build directory. However, there are some key differences: - The paths in `filename` now are _relative_ to the future build directory - The `install_filename` key is completely missing - There is only one entry in `target_sources`: - With the language set to `unknown` - Empty lists for `compiler` and `parameters` and `generated_sources` - The `sources` list _should_ contain all sources of the target There is no guarantee that the sources list in `target_sources` is correct. There might be differences, due to internal limitations. It is also not guaranteed that all targets will be listed in the output. It might even be possible that targets are listed, which won't exist when Meson is run normally. This can happen if a target is defined inside an if statement. Use this feature with care. ## Added option to introspect multiple parameters at once Meson introspect can now print the results of multiple introspection commands in a single call. The results are then printed as a single JSON object. The format for a single command was not changed to keep backward compatibility. Furthermore the option `-a,--all`, `-i,--indent` and `-f,--force-object-output` were added to print all introspection information in one go, format the JSON output (the default is still compact JSON) and force use the new output format, even if only one introspection command was given. A complete introspection dump is also stored in the `meson-info` directory. This dump will be (re)generated each time meson updates the configuration of the build directory. Additionally the format of `meson introspect target` was changed: - New: the `sources` key. It stores the source files of a target and their compiler parameters. - New: the `defined_in` key. It stores the Meson file where a target is defined - New: the `subproject` key. It stores the name of the subproject where a target is defined. - Added new target types (`jar`, `shared module`). ## `meson configure` can now print the default options of an unconfigured project With this release, it is also possible to get a list of all build options by invoking `meson configure` with the project source directory or the path to the root `meson.build`. In this case, Meson will print the default values of all options. ## HDF5 HDF5 support is added via pkg-config. ## Added the `meson-info.json` introspection file Meson now generates a `meson-info.json` file in the `meson-info` directory to provide introspection information about the latest Meson run. This file is updated when the build configuration is changed and the build files are (re)generated. ## New kwarg `install:` for `configure_file()` Previously when using `configure_file()`, you could install the outputted file by setting the `install_dir:` keyword argument. Now, there is an explicit kwarg `install:` to enable/disable it. Omitting it will maintain the old behaviour. muon-v0.4.0/subprojects/meson-docs/docs/markdown/IDE-integration.md0000644000175000017500000004243614737503617024315 0ustar buildbuild--- short-description: Meson's API to integrate Meson support into an IDE ... # IDE integration Meson has exporters for Visual Studio and XCode, but writing a custom backend for every IDE out there is not a scalable approach. To solve this problem, Meson provides an API that makes it easy for any IDE or build tools to integrate Meson builds and provide an experience comparable to a solution native to the IDE. All the resources required for such a IDE integration can be found in the `meson-info` directory in the build directory. The first thing to do when setting up a Meson project in an IDE is to select the source and build directories. For this example we assume that the source resides in an Eclipse-like directory called `workspace/project` and the build tree is nested inside it as `workspace/project/build`. First, we initialize Meson by running the following command in the source directory. meson setup builddir With this command Meson will configure the project and also generate introspection information that is stored in `intro-*.json` files in the `meson-info` directory. The introspection dump will be automatically updated when Meson is (re)configured, or the build options change. Thus, an IDE can watch for changes in this directory to know when something changed. Note that `meson-info.json` guaranteed to be the last file written. The `meson-info` directory should contain the following files: | File | Description | | ------------------------------ | ----------------------------------------------------------------------------- | | `intro-benchmarks.json` | Lists all benchmarks | | `intro-buildoptions.json` | Contains a full list of Meson configuration options for the project | | `intro-buildsystem_files.json` | Full list of all Meson build files | | `intro-dependencies.json` | Lists all dependencies used in the project | | `intro-installed.json` | Contains mapping of files to their installed location | | `intro-install_plan.json` | Dictionary of data types with the source files and their installation details | | `intro-projectinfo.json` | Stores basic information about the project (name, version, etc.) | | `intro-targets.json` | Full list of all build targets | | `intro-tests.json` | Lists all tests with instructions how to run them | The content of the JSON files is further specified in the remainder of this document. ## The `targets` section The most important file for an IDE is probably `intro-targets.json`. Here each target with its sources and compiler parameters is specified. The JSON format for one target is defined as follows: ```json { "name": "Name of the target", "id": "The internal ID meson uses", "type": "", "defined_in": "/Path/to/the/targets/meson.build", "subproject": null, "filename": ["list", "of", "generated", "files"], "build_by_default": true / false, "target_sources": [], "extra_files": ["/path/to/file1.hpp", "/path/to/file2.hpp"], "installed": true / false, } ``` If the key `installed` is set to `true`, the key `install_filename` will also be present. It stores the installation location for each file in `filename`. If one file in `filename` is not installed, its corresponding install location is set to `null`. The `subproject` key specifies the name of the subproject this target was defined in, or `null` if the target was defined in the top level project. *(New in 0.56.0)* The `extra_files` key lists all files specified via the `extra_files` kwarg of a build target. See [[executable]]. A target usually generates only one file. However, it is possible for custom targets to have multiple outputs. ### Target sources The `intro-targets.json` file also stores a list of all source objects of the target in the `target_sources`. With this information, an IDE can provide code completion for all source files. ```json { "language": "language ID", "compiler": ["The", "compiler", "command"], "parameters": ["list", "of", "compiler", "parameters"], "sources": ["list", "of", "all", "source", "files", "for", "this", "language"], "generated_sources": ["list", "of", "all", "source", "files", "that", "where", "generated", "somewhere", "else"] } ``` It should be noted that the compiler parameters stored in the `parameters` differ from the actual parameters used to compile the file. This is because the parameters are optimized for the usage in an IDE to provide autocompletion support, etc. It is thus not recommended to use this introspection information for actual compilation. ### Possible values for `type` The following table shows all valid types for a target. | value of `type` | Description | | ---------------- | --------------------------------------------------------------------------------------------- | | `executable` | This target will generate an executable file | | `static library` | Target for a static library | | `shared library` | Target for a shared library | | `shared module` | A shared library that is meant to be used with dlopen rather than linking into something else | | `custom` | A custom target | | `run` | A Meson run target | | `jar` | A Java JAR target | ### Install plan The `intro-install_plan.json` file contains a list of the files that are going to be installed on the system. The data contains a list of files grouped by data type. Each file maps to a dictionary containing the `destination` and `tag` keys, with the key being the file location at build time. `destination` is the destination path using placeholders for the base directories. New keys may be added in the future. ```json { "targets": { "/path/to/project/builddir/some_executable": { "destination": "{bindir}/some_executable", "tag": "runtime" }, "/path/to/project/builddir/libsomelib.so": { "destination": "{libdir_shared}/libsomelib.so", "tag": "runtime" } }, "data": { "/path/to/project/some_data": { "destination": "{datadir}/some_data", "tag": null } }, "headers": { "/path/to/project/some_header.h": { "destination": "{includedir}/some_header.h", "tag": "devel" } } } ``` Additionally, the `intro-installed.json` file contains the mapping of the file path at build time to the absolute system location. ```json { "/path/to/project/builddir/some_executable": "/usr/bin/some_executable", "/path/to/project/builddir/libsomelib.so": "/user/lib/libsomelib.so", "/path/to/project/some_data": "/usr/share/some_data", "/path/to/project/some_header.h": "/usr/include/some_header.h" } ``` ### Using `--targets` without a build directory It is also possible to get most targets without a build directory. This can be done by running `meson introspect --targets /path/to/meson.build`. The generated output is similar to running the introspection with a build directory or reading the `intro-targets.json`. However, there are some key differences: - The paths in `filename` now are _relative_ to the future build directory - The `install_filename` key is completely missing - There is only one entry in `target_sources`: - With the language set to `unknown` - Empty lists for `compiler` and `parameters` and `generated_sources` - The `sources` list _should_ contain all sources of the target There is no guarantee that the sources list in `target_sources` is correct. There might be differences, due to internal limitations. It is also not guaranteed that all targets will be listed in the output. It might even be possible that targets are listed, which won't exist when Meson is run normally. This can happen if a target is defined inside an if statement. Use this feature with care. ## Build Options The list of all build options (build type, warning level, etc.) is stored in the `intro-buildoptions.json` file. Here is the JSON format for each option. ```json { "name": "name of the option", "description": "the description", "type": "type ID", "value": "value depends on type", "section": "section ID", "machine": "machine ID" } ``` The supported types are: - string - boolean - combo - integer - array For the type `combo` the key `choices` is also present. Here all valid values for the option are stored. The possible values for `section` are: - core - backend - base - compiler - directory - user - test The `machine` key specifies the machine configuration for the option. Possible values are: - any - host - build To set the options, use the `meson configure` command. Since Meson 0.50.0 it is also possible to get the default buildoptions without a build directory by providing the root `meson.build` instead of a build directory to `meson introspect --buildoptions`. Running `--buildoptions` without a build directory produces the same output as running it with a freshly configured build directory. However, this behavior is not guaranteed if subprojects are present. Due to internal limitations all subprojects are processed even if they are never used in a real Meson run. Because of this options for the subprojects can differ. ## The dependencies section The list of all _found_ dependencies can be acquired from `intro-dependencies.json`. Here, the name, version, compiler and linker arguments for a dependency are listed. ### Scanning for dependencies with `--scan-dependencies` It is also possible to get most dependencies used without a build directory. This can be done by running `meson introspect --scan-dependencies /path/to/meson.build`. The output format is as follows: ```json [ { "name": "The name of the dependency", "required": true, "version": [">=1.2.3"], "conditional": false, "has_fallback": false } ] ``` The `required` keyword specifies whether the dependency is marked as required in the `meson.build` (all dependencies are required by default). The `conditional` key indicates whether the `dependency()` function was called inside a conditional block. In a real Meson run these dependencies might not be used, thus they _may_ not be required, even if the `required` key is set. The `has_fallback` key just indicates whether a fallback was directly set in the `dependency()` function. The `version` key always contains a list of version requirements from the `meson.build` and **not** the actual version of the dependency on disc. The version list is empty if no version was specified in the `meson.build`. ## Tests Compilation and unit tests are done as usual by running the `meson compile` and `meson test` commands. A JSON formatted result log can be found in `workspace/project/builddir/meson-logs/testlog.json`. When these tests fail, the user probably wants to run the failing test in a debugger. To make this as integrated as possible, extract the tests from the `intro-tests.json` and `intro-benchmarks.json` files. This provides you with all the information needed to run the test: what command to execute, command line arguments, environment variable settings and how to process the output. ```json { "name": "name of the test", "workdir": "the working directory (can be null)", "timeout": "the test timeout", "suite": ["list", "of", "test", "suites"], "is_parallel": true / false, "protocol": "exitcode" / "tap", "cmd": ["command", "to", "run"], "depends": ["target1-id", "target2-id"], "env": { "VARIABLE1": "value 1", "VARIABLE2": "value 2" } } ``` The `depends` entry *(since 0.56.0)* contains target ids; they can be looked up in the targets introspection data. The executable pointed to by `cmd` is also included in the entry, as are any arguments to the test that are build products. ## Build system files It is also possible to get Meson build files used in your current project. This can be done by running `meson introspect --buildsystem-files /path/to/builddir`. The output format is as follows: ```json [ "/Path/to/the/targets/meson.build", "/Path/to/the/targets/meson.options", "/Path/to/the/targets/subdir/meson.build" ] ``` # Programmatic interface Meson also provides the `meson introspect` for project introspection via the command line. Use `meson introspect -h` to see all available options. This API can also work without a build directory for the `--projectinfo` command. # AST of a `meson.build` Since Meson *0.55.0* it is possible to dump the AST of a `meson.build` as a JSON object. The interface for this is `meson introspect --ast /path/to/meson.build`. Each node of the AST has at least the following entries: | Key | Description | | ------------ | ------------------------------------------------------- | | `node` | Type of the node (see following table) | | `lineno` | Line number of the node in the file | | `colno` | Column number of the node in the file | | `end_lineno` | Marks the end of the node (may be the same as `lineno`) | | `end_colno` | Marks the end of the node (may be the same as `colno`) | Possible values for `node` with additional keys: | Node type | Additional keys | | -------------------- | ------------------------------------------------ | | `BooleanNode` | `value`: bool | | `IdNode` | `value`: str | | `NumberNode` | `value`: int | | `StringNode` | `value`: str | | `ContinueNode` | | | `BreakNode` | | | `ArgumentNode` | `positional`: node list; `kwargs`: accept_kwargs | | `ArrayNode` | `args`: node | | `DictNode` | `args`: node | | `EmptyNode` | | | `OrNode` | `left`: node; `right`: node | | `AndNode` | `left`: node; `right`: node | | `ComparisonNode` | `left`: node; `right`: node; `ctype`: str | | `ArithmeticNode` | `left`: node; `right`: node; `op`: str | | `NotNode` | `right`: node | | `CodeBlockNode` | `lines`: node list | | `IndexNode` | `object`: node; `index`: node | | `MethodNode` | `object`: node; `args`: node; `name`: str | | `FunctionNode` | `args`: node; `name`: str | | `AssignmentNode` | `value`: node; `var_name`: str | | `PlusAssignmentNode` | `value`: node; `var_name`: str | | `ForeachClauseNode` | `items`: node; `block`: node; `varnames`: list | | `IfClauseNode` | `ifs`: node list; `else`: node | | `IfNode` | `condition`: node; `block`: node | | `UMinusNode` | `right`: node | | `TernaryNode` | `condition`: node; `true`: node; `false`: node | We do not guarantee the stability of this format since it is heavily linked to the internal Meson AST. However, breaking changes (removal of a node type or the removal of a key) are unlikely and will be announced in the release notes. # JSON Reference manual In additional to the online [Reference manual](Reference-manual.md), Meson also offers the manual as JSON file. The content of this file is generated from the same source as the online documentation. The two versions are thus identical in content. This JSON document is attached to every Meson release since *0.60.0*. The JSON schema is defined by the class structure given in [`jsonschema.py`](https://github.com/mesonbuild/meson/blob/master/docs/refman/jsonschema.py) # Existing integrations - [CLion](https://www.jetbrains.com/clion/) - [Eclipse CDT](https://www.eclipse.org/cdt/) - [Gnome Builder](https://wiki.gnome.org/Apps/Builder) - [KDevelop](https://www.kdevelop.org) - [Meson Syntax Highlighter](https://plugins.jetbrains.com/plugin/13269-meson-syntax-highlighter) 3rd party plugin for JetBrains IDEs. - [Meson-UI](https://github.com/dreamer-coding-555/meson-ui) (build GUI for Meson) - [mmeson](https://github.com/stephanlachnit/mmeson) (ccmake clone for Meson) - [Qt Creator](https://doc.qt.io/qtcreator/creator-project-meson.html) - [vscode-meson](https://github.com/mesonbuild/vscode-meson) extension for VS Code/Codium muon-v0.4.0/subprojects/meson-docs/docs/markdown/Java-module.md0000644000175000017500000000465614737503617023541 0ustar buildbuild# Java Module *(added in 0.60.0)* ## Functions ### `generate_native_header()` *(deprecated in 0.62.0, use `generate_native_headers()`)* *(removed in 1.0.0)* This function will generate a header file for use in Java native module development by reading the supplied Java file for `native` method declarations. Keyword arguments: - `package`: The [package](https://en.wikipedia.org/wiki/Java_package) of the file. If left empty, Meson will assume that there is no package. ### `generate_native_headers()` *(added in 0.62.0)* *(deprecated in 1.0.0, use `native_headers()`)* This function will generate native header files for use in Java native module development by reading the supplied Java files for `native` method declarations. Keyword arguments: - `classes`: The list of class names relative to the `package`, if it exists, which contain `native` method declarations. Use `.` separated class names. - `package`: The [package](https://en.wikipedia.org/wiki/Java_package) of the file. If left empty, Meson will assume that there is no package. Example: ```java // Outer.java package com.mesonbuild; public class Outer { private static native void outer(); public static class Inner { private static native void inner(); } } ``` With the above file, an invocation would look like the following: ```meson java = import('java') native_headers = java.generate_native_headers( 'Outer.java', package: 'com.mesonbuild', classes: ['Outer', 'Outer.Inner'] ) ``` ### `native_headers()` *(added in 1.0.0)* This function will generate native header files for use in Java native module development by reading the supplied Java files for `native` method declarations. Keyword arguments: - `classes`: The list of class names relative to the `package`, if it exists, which contain `native` method declarations. Use `.` separated class names. - `package`: The [package](https://en.wikipedia.org/wiki/Java_package) of the file. If left empty, Meson will assume that there is no package. Example: ```java // Outer.java package com.mesonbuild; public class Outer { private static native void outer(); public static class Inner { private static native void inner(); } } ``` With the above file, an invocation would look like the following: ```meson java = import('java') native_headers = java.generate_native_headers( 'Outer.java', package: 'com.mesonbuild', classes: ['Outer', 'Outer.Inner'] ) ``` muon-v0.4.0/subprojects/meson-docs/docs/markdown/Getting-meson_ptbr.md0000644000175000017500000001146714737503617025142 0ustar buildbuild# Obtendo o Meson Meson é implementado em Python 3, e requer a versão 3.7 ou mais nova. se o seu sistema operacional provê um gerenciador de pacotes, você deve instalar o Meson com ele. Para plataformas que não tem um gerenciador de pacotes, você precisa baixa-lo da [página inicial do Python]. Veja abaixo [peculiaridades do Python3 específicas de plataformas](#platformspecific-install-quirks). ## Baixando o Meson *Releases* do Meson podem ser baixadas da [página de releases do GitHub] e você pode executar `./meson.py` de dentro do *release* ou do próprio repositório do git sem fazer nada de especial. No Windows, se você não instalar o Python com a opção do instalador que fazem os *scripts* Python executáveis, você vai ter que executar `python /path/to/meson.py`, onde `python` é o Python 3.7 ou mais novo. O código de desenvolvimento mais recente pode ser obtido diretamente do [Git], e nós lutamos para garatir que ele vai estar sempre funcionando e usável. Todos *commits* passam por um processo de *pull-request* que executa CI e testam diversas plataformas. ## Instalando o Meson com o pip O Meson está disponível no [Indice de Pacotes do Python] e pode ser instalado com `sudo pip3 install meson` que requer root e vai instala-lo para todo o sistema. Se você já baixou uma cópia do código do Meson, você pode instalar com `sudo pip3 install path/to/source/root/`. Como alternativa, você pode usar o `pip3 install --user meson` que vai instalar o Meson para o seu usuário e não requer nenhum privilégio especial. Esse comando vai instalar o pacote em `~/.local/`, então você terá que adicionar `~/.local/bin` para o seu `PATH`, e `sudo meson install` vai estar completamente quebrado já que o programa não vai estar disponível para o root. Apeas use uma cópia de usuário do Meson se você não se importa sobre instalar os projetos como root. ## Instalando o Meson e o Ninja com o instalador MSI Nós provemos um instalador MSI na [página de *release* do GitHub] que pode ser usada para instalar tanto o Meson quanto o Ninja de uma vez para o Windows. O instalador também contém uma cópia integrada do Python, então scripts que usam o [módulo Python](Python-module.md) e não tem nenhuma dependência externa vão continuar funcionando como esperado. Por favor, note que essa é uma funcionalidade nova, então relatórios de bugs são esperados e bem-vindos! ## Dependências Na maioria dos casos comums, você vai precisar do [executável do Ninja] para usar o *backend* do `ninja`, que é o padrão no Meson. Esse *backend* pode ser usado em todas plataformas e com todas **toolchains**, incluindo o GCC, Clang, Visual Studio, MinGW, ICC, ARMCC, etc. Você deve usar a versão provida pelo seu gerenciador de pacotes se possível, caso contrário, baixe o binário executável da [página de *release* do projeto Ninja](https://github.com/ninja-build/ninja/releases). Se você apenas usa o *backend* do Visual Studio (`--backend=vs`) para gerar soluções do Visual Studio no Windows ou o *backend* do XCode (`--backend=xcode`) para gerar projetos no macOS, você não precisa do Ninja. # Peculiaridades de instalação específicas de plataformas ## Peculiaridades do Python 3 no Windows Quando estiver instalando o Python 3, é altamente recomendável (mas não obrigatório) que você selecione as opções do instalador como a seguir: ![passo 1 do instalador](images/py3-install-1.png "Ative 'Add Python 3.6 to PATH' e clique em 'Customize installation'") ![passo 2 do instalador](images/py3-install-2.png "Funcionalidade Opcional: garanta que 'pip' está ativado") ![passo 3 do instalador](images/py3-install-3.png "Opções Avançadas: ative 'Instalar para todos usuários'") Com isso, você terá o `python` e o `pip` no `PATH`, e você poderá instalar o Meson com o pip. Você também vai poder executar o comando `meson` em qualquer shell no Windows ao invés de ter que executar `py -3` com o caminho completo para o *script* `meson.py`. ## Peculiaridades do Python 3 no MSYS2 Se você está usando o MSYS2 no Windows como seu ambiente de desenvolvimento, por favor se certifique que você não esteja usando o pacote `msys/python` para fornecer o Python 3. Uso o `mingw32/mingw-w64-i686-python3` ou o If you are using MSYS2 on Windows as your development environment, please make sure that you **do not use** the `msys/python` package to provide Python 3. Use either `mingw32/mingw-w64-i686-python3` or `mingw64/mingw-w64-x86_64-python3` dependendo de para qual *target* do MinGW você está compilando. [página de *release* do GitHub]: https://github.com/mesonbuild/meson/releases [Indice de Pacotes do Python]: https://pypi.python.org/pypi/meson/ [Git]: https://github.com/mesonbuild/meson [página inicial do Python]: https://www.python.org/downloads/ [executável do Ninja]: https://ninja-build.org/ muon-v0.4.0/subprojects/meson-docs/docs/markdown/Release-notes.md0000644000175000017500000000002014737503617024060 0ustar buildbuild# Release notes muon-v0.4.0/subprojects/meson-docs/docs/markdown/Windows-module.md0000644000175000017500000000342614737503617024304 0ustar buildbuild# Windows module This module provides functionality used to build applications for Windows. ## Methods ### compile_resources ``` windows = import('windows') windows.compile_resources(...(string | File | CustomTarget | CustomTargetIndex), args: []string, depend_files: [](string | File), depends: [](BuildTarget | CustomTarget | CustomTargetIndex) include_directories: [](IncludeDirectories | string)): []CustomTarget ``` Compiles Windows `rc` files specified in the positional arguments. Returns a list of `CustomTarget` objects that you put in the list of sources for the target you want to have the resources in. *Since 0.61.0* CustomTargetIndexes and CustomTargets with more than out output *may be used as positional arguments. This method has the following keyword arguments: - `args` lists extra arguments to pass to the resource compiler - `depend_files` lists resource files that the resource script depends on (e.g. bitmap, cursor, font, html, icon, message table, binary data or manifest files referenced by the resource script) (*since 0.47.0*) - `depends` lists target(s) that this target depends on, even though it does not take them as an argument (e.g. as above, but generated) (*since 0.47.0*) - `include_directories` lists directories to be both searched by the resource compiler for referenced resource files, and added to the preprocessor include search path. The resource compiler executable used is the first which exists from the following list: 1. The `windres` executable given in the `[binaries]` section of the cross-file 2. The `WINDRES` environment variable 3. The resource compiler which is part of the same toolset as the C or C++ compiler in use. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Disabler.md0000644000175000017500000000311314737503617023105 0ustar buildbuild--- short-description: Disabling options ... # Disabling parts of the build *This feature is available since version 0.44.0.* The following is a common fragment found in many projects: ```meson dep = dependency('foo') # In some different directory lib = shared_library('mylib', 'mylib.c', dependencies : dep) # And in a third directory exe = executable('mytest', 'mytest.c', link_with : lib) test('mytest', exe) ``` This works fine but gets a bit inflexible when you want to make this part of the build optional. Basically it reduces to adding `if/else` statements around all target invocations. Meson provides a simpler way of achieving the same with a disabler object. A disabler object is created with the `disabler` function: ```meson d = disabler() ``` The only thing you can do to a disabler object is to ask if it has been found: ```meson f = d.found() # returns false ``` Any other statement that uses a disabler object will immediately return a disabler. For example assuming that `d` contains a disabler object then ```meson d2 = some_func(d) # value of d2 will be disabler d3 = true or d2 # value of d3 will be true because of short-circuiting d4 = false or d2 # value of d4 will be disabler if d # neither branch is evaluated ``` Thus to disable every target that depends on the dependency given above, you can do something like this: ```meson if use_foo_feature d = dependency('foo') else d = disabler() endif ``` This concentrates the handling of this option in one place and other build definition files do not need to be sprinkled with `if` statements. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Build-system-converters.md0000644000175000017500000000220114737503617026126 0ustar buildbuild--- short-description: Converting other build systems to Meson ... # Build system converters Moving from one build system into another includes a fair bit of work. To make things easier, Meson provides scripts to convert other build systems into Meson. At the time of writing, scripts for CMake and autotools exist. It can be found in the `tools` subdirectory in Meson's source tree. The scripts do not try to do a perfect conversion. This would be extremely difficult because the data models of other build systems are very different. The goal of the converter script is to convert as much of the low level drudgery as possible. Using the scripts is straightforward. We'll use the CMake one as an example but the Autotools one works exactly the same way. cmake2meson.py path/to/CMake/project/root This command generates a skeleton Meson project definition that tries to mirror CMake's setup as close as possible. Once this is done, you need to go through these files manually and finalize the conversion. To make this task as simple as possible, the converter script will transfer all comments from the CMake definition into Meson definition. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Simple-comparison.md0000644000175000017500000000743014737503617024767 0ustar buildbuild# A simple comparison In this experiment we generated one thousand C files with contents that looked like this. ```c #include #include"header.h" int func23() { return 0; } ``` The function number was different in each file. In addition there was a main C file that just called each function in turn. We then generated build system files for *Meson*, *CMake*, *SCons*, *Premake* and *Autotools* that compiled these files into a single executable. With this we measured three different things. The first is configuration time, that is, the time the build system takes to generate necessary build files. This is usually called the *configure step*. The time was measured in seconds. The second thing to measure was the build time. This should be limited by the compiler and in the optimal case should be the same for every build system. Four parallel processes were used in this test. The third thing we measured was the empty build time. This measures how much time the build system takes to check the states of all source files because if any of them could potentially cause a rebuild. Since CMake has two different backends, Make and Ninja, we ran the tests on both of them. All tests were run on a 2011 era MacBook Pro running Ubuntu 13/04. The tests were run multiple times and we always took the fastest time. Here are the results for configuration time. ![Configuration times](images/conftime.png) The reason SCons got zero seconds on this test is because you cannot separate configure and build steps. They run as one unit. Autotools is the clear loser of this test as it is over an order of magnitude slower than the second slowest one. This configuration time includes both autogen and configure. All other systems take less than one second to do this setup, which is fast enough for a human being to interpret as instantaneous. ![Build times](https://raw.githubusercontent.com/wiki/jpakkane/meson/buildtime.png) Build times are a bit more even. SCons is the slowest, being almost ten seconds slower than the second slowest. Some of it is work from the configure step but it still has the worst performance. Premake is the fastest Make-based build system narrowly beating out Autotools. Both Ninja-based build systems are faster than all non-Ninja ones with Meson being slightly faster. In practice the difference is minimal. The advantages of Ninja can be seen by comparing CMake's times when using Make or Ninja. It is possible to shave off 3.5 seconds (over 20%) of the total build time just by changing the backend. The project's CMake configuration files don't need any changes. ![No-op time](https://raw.githubusercontent.com/wiki/jpakkane/meson/emptytime.png) Empty build times reflect the performance of regular build times. SCons is again the slowest taking over three seconds compared to Meson, which takes only 0.03 seconds, a difference of two orders of magnitude. Even Autotools, the fastest Make-based system, is almost one order of magnitude slower. Ninja holds the top spots just like in the previous test. Conclusions ----- Build system performance matters. Even with this extremely simple example we can find differences between various popular build systems. As the project size increases, these differences grow even larger. (The author has witnessed no-op build times of 30 seconds for Make versus less than one second for Ninja when compiling the Clang compiler.) Keeping incremental build times low is one of the major keys of programmer productivity as it allows developers to iterate faster and stay in the creative zone. Original scripts ----- Those who want to run these experiments themselves can download the scripts here: * [Generator script](https://raw.githubusercontent.com/wiki/jpakkane/meson/gen_src.py) * [Measurement script](https://raw.githubusercontent.com/wiki/jpakkane/meson/measure.py) muon-v0.4.0/subprojects/meson-docs/docs/markdown/Creating-Linux-binaries.md0000644000175000017500000001112314737503617026003 0ustar buildbuild--- short-description: Creating universal Linux binaries ... # Creating Linux binaries Creating Linux binaries that can be downloaded and run on any distro (like .dmg packages for OSX or .exe installers for Windows) has traditionally been difficult. This is even more tricky if you want to use modern compilers and features, which is especially desired in game development. There is still no simple turn-key solution for this problem but with a bit of setup it can be relatively straightforward. ## Installing system and GCC First you need to do a fresh operating system install. You can use spare hardware, VirtualBox, cloud or whatever you want. Note that the distro you install must be *at least as old* as the oldest release you wish to support. Debian stable is usually a good choice, though immediately after its release you might want to use Debian oldstable or the previous Ubuntu LTS. The oldest supported version of CentOS is also a good choice. Once you have installed the system, you need to install build-dependencies for GCC. In Debian-based distros this can be done with the following commands: ```console $ apt-get build-dep g++ $ apt-get install pkg-config libgmp-dev libmpfr-dev libmpc-dev ``` Then create a `src` subdirectory in your home directory. Copy-paste the following into `install_gcc.sh` and execute it. ```bash #!/bin/sh wget ftp://ftp.fu-berlin.de/unix/languages/gcc/releases/gcc-4.9.2/gcc-4.9.2.tar.bz2 tar xf gcc-4.9.2.tar.bz2 mkdir objdir cd objdir ../gcc-4.9.2/configure --disable-bootstrap --prefix=${HOME}/devroot \ --disable-multilib --enable-languages=c,c++ make -j 4 make install-strip ln -s gcc ${HOME}/devroot/bin/cc ``` Then finally add the following lines to your `.bashrc`. ```console $ export LD_LIBRARY_PATH=${HOME}/devroot/lib $ export PATH=${HOME}/devroot/bin:$PATH $ export PKG_CONFIG_PATH=${HOME}/devroot/lib/pkgconfig ``` Log out and back in and now your build environment is ready to use. ## Adding other tools Old distros might have too old versions of some tools. For Meson this could include Python 3 and Ninja. If this is the case you need to download, build and install new versions into `~/devroot` in the usual way. ## Adding dependencies You want to embed and statically link every dependency you can (especially C++ dependencies). Meson's [Wrap package manager](Wrap-dependency-system-manual.md) might be of use here. This is equivalent to what you would do on Windows, OSX, Android etc. Sometimes static linking is not possible. In these cases you need to copy the .so files inside your package. Let's use SDL2 as an example. First we download and install it as usual giving it our custom install prefix (that is, `./configure --prefix=${HOME}/devroot`). This makes Meson's dependency detector pick it up automatically. ## Building and installing Building happens in much the same way as normally. There are just two things to note. First, you must tell GCC to link the C++ standard library statically. If you don't then your app is guaranteed to break as different distros have binary-incompatible C++ libraries. The second thing is that you need to point your install prefix to some empty staging area. Here's the Meson command to do that: ```console $ LDFLAGS=-static-libstdc++ meson --prefix=/tmp/myapp ``` The aim is to put the executable in `/tmp/myapp/bin` and shared libraries to `/tmp/myapp/lib`. The next thing you need is the embedder. It takes your dependencies (in this case only `libSDL2-2.0.so.0`) and copies them in the lib directory. Depending on your use case you can either copy the files by hand or write a script that parses the output of `ldd binary_file`. Be sure not to copy system libraries (`libc`, `libpthread`, `libm` etc). For an example, see the [sample project](https://github.com/jpakkane/meson/tree/master/manual%20tests/4%20standalone%20binaries). Make the script run during install with this: ```meson [[#meson.add_install_script]]('linux_bundler.sh') ``` ## Final steps If you try to run the program now it will most likely fail to start or crashes. The reason for this is that the system does not know that the executable needs libraries from the `lib` directory. The solution for this is a simple wrapper script. Create a script called `myapp.sh` with the following content: ```bash #!/bin/bash cd "${0%/*}" export LD_LIBRARY_PATH="$(pwd)/lib" bin/myapp ``` Install it with this Meson snippet: ```meson [[#install_data]]('myapp.sh', install_dir : '.') ``` And now you are done. Zip up your `/tmp/myapp` directory and you have a working binary ready for deployment. To run the program, just unzip the file and run `myapp.sh`. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Rewriter.md0000644000175000017500000001504114737503617023166 0ustar buildbuild--- short-description: Automatic modification of the build system files ... # Meson file rewriter Since version 0.50.0, Meson has the functionality to perform some basic modification on the `meson.build` files from the command line. The currently supported operations are: - For build targets: - Add/Remove source files - Add/Remove targets - Modify a select set of kwargs - Print some JSON information - For dependencies: - Modify a select set of kwargs - For the project function: - Modify a select set of kwargs - Modify the default options list The rewriter has both, a normal command line interface and a "script mode". The normal CLI is mostly designed for everyday use. The "script mode", on the other hand, is meant to be used by external programs (IDEs, graphical frontends, etc.) The rewriter itself is considered stable, however the user interface and the "script mode" API might change in the future. These changes may also break backwards compatibility to older releases. We are also open to suggestions for API improvements. ## Using the rewriter All rewriter functions are accessed via `meson rewrite`. The Meson rewriter assumes that it is run inside the project root directory. If this isn't the case, use `--sourcedir` to specify the actual project source directory. ### Adding and removing sources The most common operations will probably be the adding and removing of source files to a build target. This can be easily done with: ```bash meson rewrite target {add/rm} [list of sources] ``` For instance, given the following example ```meson src = ['main.cpp', 'fileA.cpp'] exe1 = executable('testExe', src) ``` the source `fileB.cpp` can be added with: ```bash meson rewrite target testExe add fileB.cpp ``` After executing this command, the new `meson.build` will look like this: ```meson src = ['main.cpp', 'fileA.cpp', 'fileB.cpp'] exe1 = executable('testExe', src) ``` In this case, `exe1` could also have been used for the target name. This is possible because the rewriter also searches for assignments and unique Meson IDs, which can be acquired with introspection. If there are multiple targets with the same name, Meson will do nothing and print an error message. For more information see the help output of the rewriter target command. ### Adding and removing `extra_files` *Since 0.61.0* In the same way you can add and remove source files from a target, you can modify a target's `extra_files` list: ```bash meson rewrite target {add_extra_files/rm_extra_files} [list of extra files] ``` ### Setting the project version It is also possible to set kwargs of specific functions with the rewriter. The general command for setting or removing kwargs is: ```bash meson rewrite kwargs {set/delete} ... ``` For instance, setting the project version can be achieved with this command: ```bash meson rewrite kwargs set project / version 1.0.0 ``` Currently, only the following function types are supported: - dependency - target (any build target, the function ID is the target name/ID) - project (the function ID must be `/` since project() can only be called once) For more information see the help output of the rewrite kwargs command. Note msys bash may expand `/` to a path. Passing `//` will be converted to `/` by msys bash but in order to keep usage shell-agnostic, the rewrite command also allows `//` as the function ID such that it will work in both msys bash and other shells. ### Setting the project default options For setting and deleting default options, use the following command: ```bash meson rewrite default-options {set/delete} ... ``` ## Limitations Rewriting a Meson file is not guaranteed to keep the indentation of the modified functions. Additionally, comments inside a modified statement will be removed. Furthermore, all source files will be sorted alphabetically. For instance adding `e.c` to srcs in the following code ```meson # Important comment srcs = [ 'a.c', 'c.c', 'f.c', # something important about b 'b.c', 'd.c', 'g.c' ] # COMMENT ``` would result in the following code: ```meson # Important comment srcs = [ 'a.c', 'b.c', 'c.c', 'd.c', 'e.c', 'f.c', 'g.c' ] # COMMENT ``` ## Using the "script mode" The "script mode" should be the preferred API for third party programs, since it offers more flexibility and higher API stability. The "scripts" are stored in JSON format and executed with `meson rewrite command `. The JSON format is defined as follows: ```json [ { "type": "function to execute", ... }, { "type": "other function", ... }, ... ] ``` Each object in the main array must have a `type` entry which specifies which function should be executed. Currently, the following functions are supported: - target - kwargs - default_options ### Target modification format The format for the type `target` is defined as follows: ```json { "type": "target", "target": "target ID/name/assignment variable", "operation": "one of ['src_add', 'src_rm', 'target_rm', 'target_add', 'extra_files_add', 'extra_files_rm', 'info']", "sources": ["list", "of", "source", "files", "to", "add, remove"], "subdir": "subdir where the new target should be added (only has an effect for operation 'tgt_add')", "target_type": "function name of the new target -- same as in the CLI (only has an effect for operation 'tgt_add')" } ``` The keys `sources`, `subdir` and `target_type` are optional. ### kwargs modification format The format for the type `target` is defined as follows: ```json { "type": "kwargs", "function": "one of ['dependency', 'target', 'project']", "id": "function ID", "operation": "one of ['set', 'delete', 'add', 'remove', 'remove_regex', 'info']", "kwargs": { "key1": "value1", "key2": "value2", ... } } ``` ### Default options modification format The format for the type `default_options` is defined as follows: ```json { "type": "default_options", "operation": "one of ['set', 'delete']", "options": { "opt1": "value1", "opt2": "value2", ... } } ``` For operation `delete`, the values of the `options` can be anything (including `null`) ## Extracting information The rewriter also offers operation `info` for the types `target` and `kwargs`. When this operation is used, Meson will print a JSON dump to stderr, containing all available information to the rewriter about the build target / function kwargs in question. The output format is currently experimental and may change in the future. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Release-notes-for-0.40.0.md0000644000175000017500000001171414737503617025375 0ustar buildbuild--- title: Release 0.40 short-description: Release notes for 0.40 ... # New features ## Outputs of generators can be used in custom targets in the VS backend This has been possible with the Ninja backend for a long time but now the Visual Studio backend works too. ## `compute_int` method in the compiler objects This method can be used to evaluate the value of an expression. As an example: ```meson cc = meson.get_compiler('c') two = cc.compute_int('1 + 1') # A very slow way of adding two numbers. ``` ## Visual Studio 2017 support There is now a VS2017 backend (`--backend=vs2017`) as well as a generic VS backend (`--backend=vs`) that autodetects the currently active VS version. ## Automatic initialization of subprojects that are git submodules If you have a directory inside your subprojects directory (usually `subprojects/`) that is a git submodule, Meson will automatically initialize it if your build files refer to it. This will be done without needing a wrap file since git contains all the information needed. ## No download mode for wraps Added a new option `wrap-mode` that can be toggled to prevent Meson from downloading dependency projects. Attempting to do so will cause an error. This is useful for distro packagers and other cases where you must explicitly enforce that nothing is downloaded from the net during configuration or build. ## Overriding options per target Build targets got a new keyword argument `override_options` that can be used to override system options. As an example if you have a target that you know can't be built with `-Werror` enabled you can override the value of the option like this: ```meson executable('foo', 'foo.c', override_options : ['werror=false']) ``` Note that this does not affect project options, only those options that come from Meson (language standards, unity builds etc). ## Compiler object get define Compiler objects got a new method `get_define()` that returns the given preprocessor symbol as a string. ```meson cc = meson.get_compiler('c') one = cc.get_define('__linux__') # returns '1' on Linux hosts ``` ## Cygwin support Meson now works under Cygwin and we have added it to our CI test matrix. ## Multiple install directories Custom targets can produce many output files. Previously it was only possible to install all of them in the same directory, but now you can install each output in its own directory like this: ```meson custom_target('two_out', output : ['diff.h', 'diff.sh'], command : [creator, '@OUTDIR@'], install : true, install_dir : ['dir1', 'dir2']) ``` For backwards compatibility and for conciseness, if you only specify one directory all outputs will be installed into it. The same feature is also available for Vala build targets. For instance, to install a shared library built by valac, the generated header, and the generated VAPI (respectively) into the default locations, you can do: ```meson shared_library('valalib', 'mylib.vala', install : true, install_dir : [true, true, true]) ``` To install any of the three in a custom directory, just pass it as a string instead of `true`. To not install it, pass `false`. You can also pass a single string (as before) and it will cause only the library to be installed, so this is a backwards-compatible change. ## Can specify method of obtaining dependencies Some dependencies have many ways of being provided. As an example Qt can either be detected via `pkg-config` or `qmake`. Until now Meson has had a heuristic for selecting which method to choose but sometimes it does the wrong thing. This can now be overridden with the `method` keyword like this: ```meson qt5_dep = dependency('qt5', modules : 'core', method : 'qmake') ``` ## Link whole contents of static libraries The default behavior of static libraries is to discard all symbols that are not directly referenced. This may lead to exported symbols being lost. Most compilers support "whole archive" linking that includes all symbols and code of a given static library. This is exposed with the `link_whole` keyword. ```meson shared_library('foo', 'foo.c', link_whole : some_static_library) ``` Note that Visual Studio compilers only support this functionality on VS 2015 and newer. ## Unity builds only for subprojects Up until now unity builds were either done for every target or none of them. Now unity builds can be specified to be enabled only for subprojects, which change seldom, and not for the master project, which changes a lot. This is enabled by setting the `unity` option to `subprojects`. ## Running `mesonintrospect` from scripts Meson now sets the `MESONINTROSPECT` environment variable in addition to `MESON_SOURCE_ROOT` and other variables when running scripts. It is guaranteed to point to the correct `mesonintrospect` script, which is important when running Meson uninstalled from git or when your `PATH`s may not be set up correctly. Specifically, the following Meson functions will set it: `meson.add_install_script()`, `meson.add_postconf_script()`, `run_command()`, `run_target()`. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Release-notes-for-0.63.0.md0000644000175000017500000002173314737503617025404 0ustar buildbuild--- title: Release 0.63.0 short-description: Release notes for 0.63.0 ... # New features ## `add_project_dependencies()` function Dependencies can now be added to all build products using `add_project_dependencies()`. This can be useful in several cases: * with special dependencies such as `dependency('threads')` * with system libraries such as `find_library('m')` * with the `include_directories` keyword argument of `declare_dependency()`, to add both source and build directories to the include search path ## Coverage targets now respect tool config files gcovr >= 4.2 supports `gcovr.cfg` in the project source root to configure how coverage is generated. If Meson detects that gcovr will load this file, it no longer excludes the `subprojects/` directory from coverage. It's a good default for Meson to guess that projects want to ignore it, but not all projects prefer that and it is assumed that if a gcovr.cfg exists then it will manually include/exclude desired paths. lcov supports `.lcovrc`, but only as a systemwide or user setting. This is non-ideal for projects, so Meson will now detect one in the project source root and, if present, manually tell lcov to use it. ## D compiler checks Some compiler checks are implemented for D: - `run` - `sizeof` - `has_header` (to check if a module is present) - `alignment` Example: ```meson ptr_size = meson.get_compiler('d').sizeof('void*') ``` ## Deprecate an option and replace it with a new one The `deprecated` keyword argument can now take the name of a new option that replace this option. In that case, setting a value on the deprecated option will set the value on both the old and new names, assuming they accept the same values. ```meson # A boolean option has been replaced by a feature with another name, old true/false values # are accepted by the new option for backward compatibility. option('o1', type: 'boolean', value: 'true', deprecated: 'o2') option('o2', type: 'feature', value: 'enabled', deprecated: {'true': 'enabled', 'false': 'disabled'}) # A project option is replaced by a module option option('o3', type: 'string', value: '', deprecated: 'python.platlibdir') ``` ## Running Windows executables with Wine in `meson devenv` When cross compiling for Windows, `meson devenv` now sets `WINEPATH` pointing to all directories containing needed DLLs and executables. ## Diff files for wraps Wrap files can now define `diff_files`, a list of local patch files in `diff` format. Meson will apply the diff files after extracting or cloning the project, and after applying the overlay archive (`patch_*`). For this feature, the `patch` or `git` command-line tool must be available. ## Added preserve_path arg to install_headers The [[install_headers]] function now has an optional argument `preserve_path` that allows installing multi-directory headerfile structures that live alongside sourcecode with a single command. For example, the headerfile structure ```meson headers = [ 'one.h', 'two.h', 'alpha/one.h', 'alpha/two.h', 'alpha/three.h' 'beta/one.h' ] ``` can now be passed to `install_headers(headers, subdir: 'mylib', preserve_path: true)` and the resulting directory tree will look like ``` {prefix} └── include    └── mylib       ├── alpha       │   ├── one.h       │   ├── two.h       │   └── three.h       ├── beta       │   └── one.h       ├── one.h       └── two.h ``` ## JAR Resources The ability to add resources to a JAR has been added. Use the `java_resources` keyword argument. It takes a `structured_src` object. ```meson jar( meson.project_name(), sources, main_class: 'com.mesonbuild.Resources', java_resources: structured_sources( files('resources/resource1.txt'), { 'subdir': files('resources/subdir/resource2.txt'), } ) ) ``` To access these resources in your Java application: ```java try (InputStreamReader reader = new InputStreamReader( Resources.class.getResourceAsStream("/resource1.txt"), StandardCharsets.UTF_8)) { // ... } try (InputStreamReader reader = new InputStreamReader( Resources.class.getResourceAsStream("/subdir/resource2.txt"), StandardCharsets.UTF_8)) { // ... } ``` ## Support for mold linker added The high performance linker mold can be selected via `CC_LD` or `CXX_LD` for Clang and GCC >= 12.0.1. ## MSVC now sets the __cplusplus #define accurately MSVC will always return `199711L` for `__cplusplus`, even when a newer c++ standard is explicitly requested, unless you pass a specific option to the compiler for MSVC 2017 15.7 and newer. Older versions are unaffected by this. Microsoft's stated rationale is that "a lot of existing code appears to depend on the value of this macro matching 199711L", therefore for compatibility with such (MSVC-only) code they will require opting in to the standards-conformant value. Meson now always sets the option if it is available, as it is unlikely that users want the default behavior, and *impossible* to use the default behavior in cross-platform code (which frequently breaks as soon as the first person tries to compile using MSVC). ## Added `debug` function In addition to the `message()`, `warning()` and `error()` functions there is now the `debug()` function to log messages that only end up in the `meson-log.txt` logfile and are not printed to stdout at configure time. ## Compiler options can be set per subproject All compiler options can now be set per subproject. See [here](Build-options.md#specifying-options-per-subproject) for details on how the default value is inherited from main project. This is useful for example when the main project requires C++11 but a subproject requires C++14. The `cpp_std` value from subproject's `default_options` is now respected. ## Per-subproject languages Subprojects does not inherit languages added by main project or other subprojects any more. This could break subprojects that wants to compile e.g. `.c` files but did not add `c` language, either in `project()` or `add_languages()`, and were relying on the main project to do it for them. ## Installed pkgconfig files can now be relocatable The pkgconfig module now has a module option `pkgconfig.relocatable`. When set to `true`, the pkgconfig files generated will have their `prefix` variable set to be relative to their `install_dir`. For example to enable it from the command line run: ```sh meson setup builddir -Dpkgconfig.relocatable=true … ``` It will only work if the `install_dir` for the generated pkgconfig files are located inside the install prefix of the package. Not doing so will cause an error. This should be useful on Windows or any other platform where relocatable packages are desired. ## New prefer_static built-in option Users can now set a boolean, `prefer_static`, that controls whether or not static linking should be tried before shared linking. This option acts as strictly a preference. If the preferred linking method is not successful, then Meson will fallback and try the other linking method. Specifically setting the `static` kwarg in the meson.build will take precedence over the value of `prefer_static` for that specific `dependency` or `find_library` call. ## Python extension modules now depend on the python library by default Python extension modules are usually expected to link to the python library and/or its headers in order to build correctly (via the default `embed: false`, which may not actually link to the library itself). This means that every single use of `.extension_module()` needed to include the `dependencies: py_installation.dependency()` kwarg explicitly. In the interest of doing the right thing out of the box, this is now the default for extension modules that don't already include a dependency on python. This is not expected to break anything, because it should always be needed. Nevertheless, `py_installation.dependency().partial_dependency()` will be detected as already included while providing no compile/link args. ## Python extension modules now build with hidden visibility Python extension modules are usually expected to only export a single symbol, decorated with the `PyMODINIT_FUNC` macro and providing the module entry point. On versions of python >= 3.9, the python headers contain GNU symbol visibility attributes to mark the init function with default visibility; it is then safe to set the [[shared_module]] inherited kwarg `gnu_symbol_visibility: 'hidden'`. In the interest of doing the right thing out of the box, this is now the default for extension modules for found installations that are new enough to have this set, which is not expected to break anything, but remains possible to set explicitly (in which case that will take precedence). ## Added support for multiline fstrings Added support for multiline f-strings which use the same syntax as f-strings for string substitution. ```meson x = 'hello' y = 'world' msg = f'''Sending a message... "@x@ @y@" ''' ``` which produces: ``` Sending a message.... "hello world" ``` muon-v0.4.0/subprojects/meson-docs/docs/markdown/Creating-OSX-packages.md0000644000175000017500000001475114737503617025351 0ustar buildbuild--- short-description: Tools to create OS X packages ... # Creating OSX packages Meson does not have native support for building OSX packages but it does provide all the tools you need to create one yourself. The reason for this is that it is a very hard task to write a system that provides for all the different ways to do that but it is very easy to write simple scripts for each application. Sample code for this can be found in [the Meson manual test suite](https://github.com/jpakkane/meson/tree/master/manual%20tests/4%20standalone%20binaries). ## Creating an app bundle OSX app bundles are actually extremely simple. They are just a directory of files in a certain format. All the details you need to know are on [this page](https://stackoverflow.com/questions/1596945/building-osx-app-bundle) and it is highly recommended that you read it first. Let's assume that we are creating our app bundle into `/tmp/myapp.app`. Suppose we have one executable, so we need to install that into `Contents/MacOS`. If we define the executable like this: ```meson executable('myapp', 'foo1.c', ..., install : true) ``` then we just need to initialize our build tree with this command: ```console $ meson --prefix=/tmp/myapp.app \ --bindir=Contents/MacOS \ builddir \ ``` Now when we do `meson install` the bundle is properly staged. If you have any resource files or data, you need to install them into `Contents/Resources` either by custom install commands or specifying more install paths to the Meson command. Next we need to install an `Info.plist` file and an icon. For those we need the following two Meson definitions. ```meson install_data('myapp.icns', install_dir : 'Contents/Resources') install_data('Info.plist', install_dir : 'Contents') ``` The format of `Info.plist` can be found in the link or the sample project linked above. The simplest way to get an icon in the `icns` format is to save your image as a tiff an then use the `tiff2icns` helper application that comes with XCode. Some applications assume that the working directory of the app process is the same where the binary executable is. If this is the case for you, then you need to create a wrapper script that looks like this: ```bash #!/bin/bash cd "${0%/*}" ./myapp ``` install it with this: ```meson install_data('myapp.sh', install_dir : 'Contents/MacOS') ``` and make sure that you specify `myapp.sh` as the executable to run in your `Info.plist`. If you are not using any external libraries, this is all you need to do. You now have a full app bundle in `/tmp/myapp.app` that you can use. ### External libraries Most applications use third party frameworks and libraries. If it is the case for your project, you need to add them to the bundle so it will work on other peoples' machines. As an example we are going to use the [SDL2](https://libsdl.org/) framework. In order to bundle it in our app, we first specify an installer script to run. ```meson [[#meson.add_install_script]]('install_script.sh') ``` The install script does two things. First it copies the whole framework into our bundle. ```console $ mkdir -p ${MESON_INSTALL_PREFIX}/Contents/Frameworks $ cp -R /Library/Frameworks/SDL2.framework \ ${MESON_INSTALL_PREFIX}/Contents/Frameworks ``` Then it needs to alter the library search path of our executable(s). This tells OSX that the libraries your app needs are inside your bundle. In the case of SDL2, the invocation goes like this: ```console $ install_name_tool -change @rpath/SDL2.framework/Versions/A/SDL2 \ @executable_path/../FrameWorks/SDL2.framework/Versions/A/SDL2 \ ${MESON_INSTALL_PREFIX}/Contents/MacOS/myapp ``` This is the part of OSX app bundling that you must always do manually. OSX dependencies come in many shapes and forms and unfortunately there is no reliable automatic way to determine how each dependency should be handled. Frameworks go to the `Frameworks` directory while plain `.dylib` files usually go to `Contents/Resources/lib` (but you can put them wherever you like). To get this done you have to check what your program links against with `otool -L /path/to/binary` and manually add the copy and fix steps to your install script. Do not copy system libraries inside your bundle, though. After this you have a fully working, self-contained OSX app bundle ready for distribution. #### Qt Qt offers a [deployment tool](https://doc.qt.io/qt-5/macos-deployment.html#macdeploy), called `macdeployqt`, that automates bundling Qt's libraries in your application folder and optionally create the final `.dmg` installer ```console # cd into the folder that contains the `myapp.app` folder macdeployqt myapp.app -executable=myapp.app/Contents/MacOS/myapp ``` This copies the needed Qt libraries to the correct subfolders within `myapp.app`. The `-executable=myapp.app/Contents/MacOS/myapp` argument is to automatically alter the search path of the executable `myapp.app/Contents/MacOS/myapp` for the Qt libraries. One can also pass the `-dmg` argument to create a `.dmg` installer from the updated `myapp.app` folder. More information is available on the tool's documentation page. ## Creating a .dmg installer A .dmg installer is similarly quite simple, at its core it is basically a fancy compressed archive. A good description can be found on [this page](https://el-tramo.be/guides/fancy-dmg/). Please read it and create a template image file according to its instructions. The actual process of creating the installer is very simple: you mount the template image, copy your app bundle in it, unmount it and convert the image into a compressed archive. The actual commands to do this are not particularly interesting, feel free to steal them from either the linked page above or from the sample script in Meson's test suite. ## Putting it all together There are many ways to put the .dmg installer together and different people will do it in different ways. The linked sample code does it by having two different scripts. This separates the different pieces generating the installer into logical pieces. `install_script.sh` only deals with embedding dependencies and fixing the library paths. `build_osx_installer.sh` sets up the build with the proper paths, compiles, installs and generates the .dmg package. The main reasoning here is that in order to build a complete OSX installer package from source, all you need to do is to cd into the source tree and run `./build_osx_installer.sh`. To build packages on other platforms you would write scripts such as `build_windows_installer.bat` and so on. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Conference-presentations.md0000644000175000017500000000223514737503617026327 0ustar buildbuild# Conference presentations on Meson - FOSDEM 2014, [Introducing the Meson build system](https://video.fosdem.org/2014/H2215_Ferrer/Sunday/Introducing_the_Meson_build_system.webm) (jpakkane) - LCA 2015, [Making build systems not suck](https://www.youtube.com/watch?v=KPi0AuVpxLI) (jpakkane) - GUADEC 2015, [Improving the way Gnome apps are built](https://www.youtube.com/watch?v=wTf0NjjNwTU) (jpakkane) - GStreamer conference 2015, [Done in 6.0 seconds](https://gstconf.ubicast.tv/videos/done-in-60-seconds-a-new-build-system-for-gstreamer) (jpakkane) - LCA 2016, [Builds, dependencies and deployment in the modern multiplatform world](https://www.youtube.com/watch?v=CTJtKtQ8R5k) (jpakkane) - GUADEC 2016, [Making your GNOME app compile 2.4x faster](https://media.ccc.de/v/44-making_your_gnome_app_compile_24x_faster) (nirbheek) - Libre Application Summit 2016, [New world, new tools](https://youtu.be/0-gx1qU2pPo) (jpakkane) - GStreamer conference 2016, [GStreamer Development on Windows and faster builds everywhere with Meson](https://gstconf.ubicast.tv/videos/gstreamer-development-on-windows-ans-faster-builds-everywhere-with-meson/) (tpm) muon-v0.4.0/subprojects/meson-docs/docs/markdown/Release-notes-for-0.51.0.md0000644000175000017500000003002514737503617025373 0ustar buildbuild--- title: Release 0.51.0 short-description: Release notes for 0.51.0 ... # New features ## (C) Preprocessor flag handling Meson previously stored `CPPFLAGS` and per-language compilation flags separately. (That latter would come from `CFLAGS`, `CXXFLAGS`, etc., along with `_args` options whether specified no the command-line interface (`-D..`), `meson.build` (`default_options`), or cross file (`[properties]`).) This was mostly unobservable, except for certain preprocessor-only checks like `check_header` would only use the preprocessor flags, leading to confusion if some `-isystem` was in `CFLAGS` but not `CPPFLAGS`. Now, they are lumped together, and `CPPFLAGS`, for the languages which are deemed to care to about, is just another source of compilation flags along with the others already listed. ## Sanity checking compilers with user flags Sanity checks previously only used user-specified flags for cross compilers, but now do in all cases. All compilers Meson might decide to use for the build are "sanity checked" before other tests are run. This usually involves building simple executable and trying to run it. Previously user flags (compilation and/or linking flags) were used for sanity checking cross compilers, but not native compilers. This is because such flags might be essential for a cross binary to succeed, but usually aren't for a native compiler. In recent releases, there has been an effort to minimize the special-casing of cross or native builds so as to make building more predictable in less-tested cases. Since this the user flags are necessary for cross, but not harmful for native, it makes more sense to use them in all sanity checks than use them in no sanity checks, so this is what we now do. ## New `sourceset` module A new module, `sourceset`, was added to help building many binaries from the same source files. Source sets associate source files and dependencies to keys in a `configuration_data` object or a dictionary; they then take multiple `configuration_data` objects or dictionaries, and compute the set of source files and dependencies for each of those configurations. ## n_debug=if-release and buildtype=plain means no asserts Previously if this combination was used then assertions were enabled, which is fairly surprising behavior. ## `target_type` in `build_targets` accepts the value 'shared_module' The `target_type` keyword argument in `build_target()` now accepts the value `'shared_module'`. The statement ```meson build_target(..., target_type: 'shared_module') ``` is equivalent to this: ```meson shared_module(...) ``` ## New modules kwarg for python.find_installation This mirrors the modules argument that some kinds of dependencies (such as qt, llvm, and cmake based dependencies) take, allowing you to check that a particular module is available when getting a python version. ```meson py = import('python').find_installation('python3', modules : ['numpy']) ``` ## Support for the Intel Compiler on Windows (ICL) Support has been added for ICL.EXE and ifort on windows. The support should be on part with ICC support on Linux/MacOS. The ICL C/C++ compiler behaves like Microsoft's CL.EXE rather than GCC/Clang like ICC does, and has a different id, `intel-cl` to differentiate it. ```meson cc = meson.get_compiler('c') if cc.get_id == 'intel-cl' add_project_argument('/Qfoobar:yes', language : 'c') endif ``` ## Added basic support for the Xtensa CPU toolchain You can now use `xt-xcc`, `xt-xc++`, `xt-nm`, etc... on your cross compilation file and Meson won't complain about an unknown toolchain. ## Dependency objects now have a get_variable method This is a generic replacement for type specific variable getters such as `ConfigToolDependency.get_configtool_variable` and `PkgConfigDependency.get_pkgconfig_variable`, and is the only way to query such variables from cmake dependencies. This method allows you to get variables without knowing the kind of dependency you have. ```meson dep = dependency('could_be_cmake_or_pkgconfig') # cmake returns 'YES', pkg-config returns 'ON' if ['YES', 'ON'].contains(dep.get_variable(pkgconfig : 'var-name', cmake : 'COP_VAR_NAME', default_value : 'NO')) error('Cannot build your project when dep is built with var-name support') endif ``` ## CMake prefix path overrides When using pkg-config as a dependency resolver we can pass `-Dpkg_config_path=$somepath` to extend or overwrite where pkg-config will search for dependencies. Now cmake can do the same, as long as the dependency uses a ${Name}Config.cmake file (not a Find{$Name}.cmake file), by passing `-Dcmake_prefix_path=list,of,paths`. It is important that point this at the prefix that the dependency is installed into, not the cmake path. If you have installed something to `/tmp/dep`, which has a layout like: ``` /tmp/dep/lib/cmake /tmp/dep/bin ``` then invoke Meson as `meson setup builddir/ -Dcmake_prefix_path=/tmp/dep` ## Tests that should fail but did not are now errors You can tag a test as needing to fail like this: ```meson test('shoulfail', exe, should_fail: true) ``` If the test passes the problem is reported in the error logs but due to a bug it was not reported in the test runner's exit code. Starting from this release the unexpected passes are properly reported in the test runner's exit code. This means that test runs that were passing in earlier versions of Meson will report failures with the current version. This is a good thing, though, since it reveals an error in your test suite that has, until now, gone unnoticed. ## New target keyword argument: `link_language` There may be situations for which the user wishes to manually specify the linking language. For example, a C++ target may link C, Fortran, etc. and perhaps the automatic detection in Meson does not pick the desired compiler. The user can manually choose the linker by language per-target like this example of a target where one wishes to link with the Fortran compiler: ```meson executable(..., link_language : 'fortran') ``` A specific case this option fixes is where for example the main program is Fortran that calls C and/or C++ code. The automatic language detection of Meson prioritizes C/C++, and so an compile-time error results like `undefined reference to main`, because the linker is C or C++ instead of Fortran, which is fixed by this per-target override. ## New module to parse kconfig output files The new module `unstable-kconfig` adds the ability to parse and use kconfig output files from `meson.build`. ## Add new `meson subprojects foreach` command `meson subprojects` has learned a new `foreach` command which accepts a command with arguments and executes it in each subproject directory. For example this can be useful to check the status of subprojects (e.g. with `git status` or `git diff`) before performing other actions on them. ## Added c17 and c18 as c_std values for recent GCC and Clang Versions For gcc version 8.0 and later, the values c17, c18, gnu17, and gnu18 were added to the accepted values for built-in compiler option c_std. For Clang version 10.0 and later on Apple OSX (Darwin), and for version 7.0 and later on other platforms, the values c17 and gnu17 were added as c_std values. ## gpgme dependency now supports gpgme-config Previously, we could only detect GPGME with custom invocations of `gpgme-config` or when the GPGME version was recent enough (>=1.13.0) to install pkg-config files. Now we added support to Meson allowing us to use `dependency('gpgme')` and fall back on `gpgme-config` parsing. ## Can link against custom targets The output of `custom_target` and `custom_target[i]` can be used in `link_with` and `link_whole` keyword arguments. This is useful for integrating custom code generator steps, but note that there are many limitations: - Meson cannot know about link dependencies of the custom target. If the target requires further link libraries, you need to add them manually - The user is responsible for ensuring that the code produced by different toolchains are compatible. - `custom_target` may only be used when it has a single output file. Use `custom_target[i]` when dealing with multiple output files. - The output file must have the correct file name extension. ## Removed the deprecated `--target-files` API The `--target-files` introspection API is now no longer available. The same information can be queried with the `--targets` API introduced in 0.50.0. ## Generators have a new `depends` keyword argument Generators can now specify extra dependencies with the `depends` keyword argument. It matches the behaviour of the same argument in other functions and specifies that the given targets must be built before the generator can be run. This is used in cases such as this one where you need to tell a generator to indirectly invoke a different program. ```meson exe = executable(...) cg = generator(program_runner, output: ['@BASENAME@.c'], arguments: ['--use-tool=' + exe.full_path(), '@INPUT@', '@OUTPUT@'], depends: exe) ``` ## Specifying options per mer machine Previously, no cross builds were controllable from the command line. Machine-specific options like the pkg-config path and compiler options only affected native targets, that is to say all targets in native builds, and `native: true` targets in cross builds. Now, prefix the option with `build.` to affect build machine targets, and leave it unprefixed to affect host machine targets. For those trying to ensure native and cross builds to the same platform produced the same result, the old way was frustrating because very different invocations were needed to affect the same targets, if it was possible at all. Now, the same command line arguments affect the same targets everywhere --- Meson is closer to ignoring whether the "overall" build is native or cross, and just caring about whether individual targets are for the build or host machines. ## subproject.get_variable() now accepts a `fallback` argument Similar to `get_variable`, a fallback argument can now be passed to `subproject.get_variable()`, it will be returned if the requested variable name did not exist. ``` meson var = subproject.get_variable('does-not-exist', 'fallback-value') ``` ## Add keyword `static` to `find_library` `find_library` has learned the `static` keyword. They keyword must be a boolean, where `true` only searches for static libraries and `false` only searches for dynamic/shared. Leaving the keyword unset will keep the old behavior of first searching for dynamic and then falling back to static. ## Fortran `include` statements recursively parsed While non-standard and generally not recommended, some legacy Fortran programs use `include` directives to inject code inline. Since v0.51, Meson can handle Fortran `include` directives recursively. DO NOT list `include` files as sources for a target, as in general their syntax is not correct as a standalone target. In general `include` files are meant to be injected inline as if they were copy and pasted into the source file. `include` was never standard and was superseded by Fortran 90 `module`. The `include` file is only recognized by Meson if it has a Fortran file suffix, such as `.f` `.F` `.f90` `.F90` or similar. This is to avoid deeply nested scanning of large external legacy C libraries that only interface to Fortran by `include biglib.h` or similar. ## CMake subprojects Meson can now directly consume CMake based subprojects with the CMake module. Using CMake subprojects is similar to using the "normal" Meson subprojects. They also have to be located in the `subprojects` directory. Example: ```cmake add_library(cm_lib SHARED ${SOURCES}) ``` ```meson cmake = import('cmake') # Configure the CMake project sub_proj = cmake.subproject('libsimple_cmake') # Fetch the dependency object cm_lib = sub_proj.dependency('cm_lib') executable('exe1', ['sources'], dependencies: [cm_lib]) ``` It should be noted that not all projects are guaranteed to work. The safest approach would still be to create a `meson.build` for the subprojects in question. ## Multiple cross files can be specified `--cross-file` can be passed multiple times, with the configuration files overlaying the same way as `--native-file`. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Dlang-module.md0000644000175000017500000000271214737503617023674 0ustar buildbuild# Dlang module This module provides tools related to the D programming language. ## Usage To use this module, just do: **`dlang = import('dlang')`**. You can, of course, replace the name `dlang` with anything else. The module only exposes one function, `generate_dub_file`, used to automatically generate Dub configuration files. ### generate_dub_file() This method only has two required arguments, the project name and the source folder. You can pass other arguments with additional keywords, they will be automatically translated to json and added to the `dub.json` file. **Structure** ```meson generate_dub_file("project name", "source/folder", key: "value" ...) ``` **Example** ```meson dlang = import('dlang') dlang.generate_dub_file(meson.project_name().to_lower(), meson.source_root(), authors: 'Meson Team', description: 'Test executable', copyright: 'Copyright © 2018, Meson Team', license: 'MIT', sourceFiles: 'test.d', targetType: 'executable', dependencies: my_dep ) ``` You can manually edit a Meson generated `dub.json` file or provide a initial one. The module will only update the values specified in `generate_dub_file()`. Although not required, you will need to have a `description` and `license` if you want to publish the package in the [D package registry](https://code.dlang.org/). muon-v0.4.0/subprojects/meson-docs/docs/markdown/Release-notes-for-0.48.0.md0000644000175000017500000002465014737503617025410 0ustar buildbuild--- title: Release 0.48 short-description: Release notes for 0.48 ... # New features ## Toggles for build type, optimization and vcrt type Since the very beginning Meson has provided different project types to use, such as *debug* and *minsize*. There is also a *plain* type that adds nothing by default but instead makes it the user's responsibility to add everything by hand. This works but is a bit tedious. In this release we have added new options to manually toggle e.g. optimization levels and debug info so those can be changed independently of other options. For example by default the debug buildtype has no optimization enabled at all. If you wish to use GCC's `-Og` instead, you could set it with the following command: ``` meson configure -Doptimization=g ``` Similarly we have added a toggle option to select the version of Visual Studio C runtime to use. By default it uses the debug runtime DLL debug builds and release DLL for release builds but this can be manually changed with the new base option `b_vscrt`. ## Meson warns if two calls to `configure_file()` write to the same file If two calls to [[configure_file]] write to the same file Meson will print a `WARNING:` message during configuration. For example: ```meson project('configure_file', 'cpp') configure_file( input: 'a.in', output: 'out', command: ['./foo.sh'] ) configure_file( input: 'a.in', output: 'out', command: ['./foo.sh'] ) ``` This will output: ``` The Meson build system Version: 0.47.0.dev1 Source dir: /path/to/srctree Build dir: /path/to/buildtree Build type: native build Project name: configure_file Project version: undefined Build machine cpu family: x86_64 Build machine cpu: x86_64 Configuring out with command WARNING: Output file out for configure_file overwritten. First time written in line 3 now in line 8 Configuring out with command Build targets in project: 0 Found ninja-1.8.2 at /usr/bin/ninja ``` ## New kwarg `console` for `custom_target()` This keyword argument conflicts with `capture`, and is meant for commands that are resource-intensive and take a long time to finish. With the Ninja backend, setting this will add this target to [Ninja's `console` pool](https://ninja-build.org/manual.html#_the_literal_console_literal_pool), which has special properties such as not buffering stdout and serializing all targets in this pool. The primary use-case for this is to be able to run external commands that take a long time to execute. Without setting this, the user does not receive any feedback about what the program is doing. ## `dependency(version:)` now applies to all dependency types Previously, version constraints were only enforced for dependencies found using the pkg-config dependency provider. These constraints now apply to dependencies found using any dependency provider. Some combinations of dependency, host and method do not currently support discovery of the version. In these cases, the dependency will not be found if a version constraint is applied, otherwise the `version()` method for the dependency object will return `'unknown'`. (If discovering the version in one of these combinations is important to you, and a method exists to determine the version in that case, please file an issue with as much information as possible.) ## python3 module is deprecated A generic module `python` has been added in Meson `0.46.0` and has a superset of the features implemented by the previous `python3` module. In most cases, it is a simple matter of renaming: ```meson py3mod = import('python3') python = py3mod.find_python() ``` becomes ```meson pymod = import('python') python = pymod.find_installation() ``` ## Dictionary addition Dictionaries can now be added, values from the second dictionary overrides values from the first ```meson d1 = {'a' : 'b'} d3 = d1 + {'a' : 'c'} d3 += {'d' : 'e'} ``` ## Dist scripts You can now specify scripts that are run as part of the `dist` target. An example usage would go like this: ```meson project('foo', 'c') # other stuff here meson.add_dist_script('dist_cleanup.py') ``` ## Fatal warnings A new command line option has been added: `--fatal-meson-warnings`. When enabled, any warning message printed by Meson will be fatal and raise an exception. It is intended to be used by developers and CIs to easily catch deprecation warnings, or any other potential issues. ## Helper methods added for checking GNU style attributes: `__attribute__(...)` A set of new helpers have been added to the C and C++ compiler objects for checking GNU style function attributes. These are not just simpler to use, they may be optimized to return fast on compilers that don't support these attributes. Currently this is true for MSVC. ```meson cc = meson.get_compiler('c') if cc.has_function_attribute('aligned') add_project_arguments('-DHAVE_ALIGNED', language : 'c') endif ``` Would replace code like: ```meson if cc.compiles('''into foo(void) __attribute__((aligned(32)))''') add_project_arguments('-DHAVE_ALIGNED', language : 'c') endif ``` Additionally, a multi argument version has been added: ```meson foreach s : cc.get_supported_function_attributes(['hidden', 'alias']) add_project_arguments('-DHAVE_@0@'.format(s.to_upper()), language : 'c') endforeach ``` ## `gnome.generate_gir()` now optionally accepts multiple libraries The GNOME module can now generate a single gir for multiple libraries, which is something `g-ir-scanner` supported, but had not been exposed yet. gnome.generate_gir() will now accept multiple positional arguments, if none of these arguments are an `Executable` instance. ## Hotdoc module A new module has been written to ease generation of [hotdoc](https://hotdoc.github.io/) based documentation. It supports complex use cases such as hotdoc subprojects (to create documentation portals) and makes it straight forward to leverage full capabilities of hotdoc. Simple usage: ``` meson hotdoc = import('hotdoc') hotdoc.generate_doc( 'foobar', c_smart_index: true, project_version: '0.1', sitemap: 'sitemap.txt', index: 'index.md', c_sources: ['path/to/file.c'], languages: ['c'], install: true, ) ``` ## `i18n.merge_file()` now fully supports variable substitutions defined in `custom_target()` Filename substitutions like @BASENAME@ and @PLAINNAME@ were previously accepted but the name of the build target wasn't altered leading to colliding target names when using the substitution twice. i18n.merge_file() now behaves as custom_target() in this regard. ## Projects args can be set separately for cross and native builds (potentially breaking change) It has been a longstanding bug (or let's call it a "delayed bug fix") that if you do this: ```meson add_project_arguments('-DFOO', language : 'c') ``` Then the flag is used both in native and cross compilations. This is very confusing and almost never what you want. To fix this a new keyword `native` has been added to all functions that add arguments, namely `add_global_arguments`, `add_global_link_arguments`, `add_project_arguments` and `add_project_link_arguments` that behaves like the following: ```meson # Added to native builds when compiling natively and to cross # compilations when doing cross compiles. add_project_arguments(...) # Added only to native compilations, not used in cross compilations. add_project_arguments(..., native : true) # Added only to cross compilations, not used in native compilations. add_project_arguments(..., native : false) ``` Also remember that cross compilation is a property of each target. There can be target that are compiled with the native compiler and some which are compiled with the cross compiler. Unfortunately this change is backwards incompatible and may cause some projects to fail building. However this should be very rare in practice. ## More flexible `override_find_program()`. It is now possible to pass an `executable` to `override_find_program()` if the overridden program is not used during configure. This is particularly useful for fallback dependencies like Protobuf that also provide a tool like protoc. ## `shared_library()` now supports setting dylib compatibility and current version Now, by default `shared_library()` sets `-compatibility_version` and `-current_version` of a macOS dylib using the `soversion`. This can be overridden by using the `darwin_versions:` kwarg to [[shared_library]]. As usual, you can also pass this kwarg to `library()` or `build_target()` and it will be used in the appropriate circumstances. ## Version comparison `dependency(version:)` and other version constraints now handle versions containing non-numeric characters better, comparing versions using the rpmvercmp algorithm (as using the `pkg-config` autoconf macro `PKG_CHECK_MODULES` does). This is a breaking change for exact comparison constraints which rely on the previous comparison behaviour of extending the compared versions with `'0'` elements, up to the same length of `'.'`-separated elements. For example, a version of `'0.11.0'` would previously match a version constraint of `'==0.11'`, but no longer does, being instead considered strictly greater. Instead, use a version constraint which exactly compares with the precise version required, e.g. `'==0.11.0'`. ## Keyword argument for GNU symbol visibility Build targets got a new keyword, `gnu_symbol_visibility` that controls how symbols are exported from shared libraries. This is most commonly used to hide implementation symbols like this: ```meson shared_library('mylib', ... gnu_symbol_visibility: 'hidden') ``` In this case only symbols explicitly marked as visible in the source files get exported. ## Git wraps can now clone submodules automatically To enable this, the following needs to be added to the `.wrap` file: ```ini clone-recursive=true ``` ## `subproject()` function now supports the `required:` kwarg This allows you to declare an optional subproject. You can now call `found()` on the return value of the `subproject()` call to see if the subproject is available before calling `get_variable()` to fetch information from it. ## `dependency()` objects now support the `.name()` method You can now fetch the name of the dependency that was searched like so: ```meson glib_dep = dependency('glib-2.0') ... message("dependency name is " + glib_dep.name()) # This outputs `dependency name is glib-2.0` qt_dep = dependency('qt5') ... message("dependency name is " + qt_dep.name()) # This outputs `dependency name is qt5` decl_dep = declare_dependency() ... message("dependency name is " + decl_dep.name()) # This outputs `dependency name is internal` ``` muon-v0.4.0/subprojects/meson-docs/docs/markdown/Run-targets.md0000644000175000017500000000325414737503617023601 0ustar buildbuild--- short-description: Targets to run external commands ... # Run targets Sometimes you need to have a target that just runs an external command. As an example you might have a build target that reformats your source code, runs `cppcheck` or something similar. In Meson this is accomplished with a so called *run target*. The recommended way of doing this is writing the command(s) you want to run to a script file. Here's an example script. ```bash #!/bin/sh cd "${MESON_SOURCE_ROOT}" inspector_command -o "${MESON_BUILD_ROOT}/inspection_result.txt" ``` Note the two environment variables `MESON_SOURCE_ROOT` and `MESON_BUILD_ROOT`. These are absolute paths to your project's source and build directories and they are automatically set up by Meson. In addition to these Meson also sets up the variable `MESON_SUBDIR`, which points to the subdirectory where the run command was specified. Most commands don't need to set up this. Note how the script starts by cd'ing into the source dir. Meson does not guarantee that the script is run in any specific directory. Whether you need to do the same depends on what your custom target wants to do. To make this a run target we write it to a script file called `scripts/inspect.sh` and specify it in the top level Meson file like this. ```meson run_target('inspector', command : 'scripts/inspect.sh') ``` Run targets are not run by default. To run it run the following command. ```console $ meson compile inspector ``` All additional entries in `run_target`'s `command` array are passed unchanged to the inspector script, so you can do things like this: ```meson run_target('inspector', command : ['scripts/inspect.sh', '--exclude', 'tests']) ``` muon-v0.4.0/subprojects/meson-docs/docs/markdown/Release-notes-for-0.39.0.md0000644000175000017500000000055714737503617025410 0ustar buildbuild--- title: Release 0.39 short-description: Release notes for 0.39 ... The 0.39.0 release turned out to consist almost entirely of bug fixes and minor polishes. # New features ## Extra arguments for tests The Meson test executable allows specifying extra command line arguments to pass to test executables. mesontest --test-args=--more-debug-info currenttest muon-v0.4.0/subprojects/meson-docs/docs/markdown/Shipping-prebuilt-binaries-as-wraps.md0000644000175000017500000000677514737503617030333 0ustar buildbuild# Shipping prebuilt binaries as wraps A common dependency case, especially on Windows, is the need to provide dependencies as prebuilt binaries rather than Meson projects that you build from scratch. Common reasons include not having access to source code, not having the time and effort to rewrite a legacy system's build definitions to Meson or just the fact that compiling the dependency projects takes too long. Packaging a project is straightforward. As an example let's look at a case where the project consists of one static library called `bob` and some headers. To create a binary dependency project we put the static library at the top level and headers in a subdirectory called `include`. The Meson build definition would look like the following. ```meson project('bob', 'c') # Do some sanity checking so that meson can fail early instead of at final link time if not (host_machine.system() == 'windows' and host_machine.cpu_family() == 'x86_64') error('This wrap of libbob is a binary wrap for x64_64 Windows, and will not work on your system') endif cc = meson.get_compiler('c') bob_dep = declare_dependency( dependencies : cc.find_library('bob', dirs : meson.current_source_dir()), include_directories : include_directories('include')) meson.override_dependency('bob', bob_dep) ``` Now you can use this subproject as if it was a Meson project: ```meson project('using dep', 'c') bob_dep = dependency('bob') executable('prog', 'prog.c', dependencies : bob_dep) ``` Note that often libraries compiled with different compilers (or even compiler flags) might not be compatible. If you do this, then you are responsible for verifying that your libraries are compatible, Meson will not check things for you. ## Using a wrap file To make this all work automatically, a project will need a [wrap file](Wrap-dependency-system-manual.md#wrap-format), as well as the meson.build definition from above. For this example our dependency is called `bob`. The wrap ini (subprojects/bob.wrap): ```ini [wrap-file] directory = libbob-1.0 source_url = https://libbob.example.com/libbob-1.0.zip source_filename = libbob-1.0.zip source_hash = 5ebeea0dfb75d090ea0e7ff84799b2a7a1550db3fe61eb5f6f61c2e971e57663 patch_directory = libbob [provide] dependency_names = bob ``` Then create `subprojects/packagefiles/libbob/`, and place the `meson.build` from above in that directory. With these in place a call to `dependency('bob')` will first try standard discovery methods for your system (such as pkg-config, cmake, and any built-in meson find methods), and then fall back to using the binary wrap if it cannot find the dependency on the system. Meson provides the `--force-fallback-for=bob` command line option to force the use of the fallback. ## Note for Linux libraries A precompiled linux shared library (.so) requires a soname field to be properly installed. If the soname field is missing, binaries referencing the library will require a hard link to the location of the library at install time (`/path/to/your/project/subprojects/precompiledlibrary/lib.so` instead of `$INSTALL_PREFIX/lib/lib.so`) after installation. You should change the compilation options for the precompiled library to avoid this issue. If recompiling is not an option, you can use the [patchelf](https://github.com/NixOS/patchelf) tool with the command `patchelf --set-soname libfoo.so libfoo.so` to edit the precompiled library after the fact. Meson generally guarantees any library it compiles has a soname. One notable exception is libraries built with the [[shared_module]] function. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Release-notes-for-1.3.0.md0000644000175000017500000003215614737503617025320 0ustar buildbuild--- title: Release 1.3.0 short-description: Release notes for 1.3.0 ... # New features Meson 1.3.0 was released on 19 November 2023 ## Clarify of implicitly-included headers in C-like compiler checks Compiler check methods `compiler.compute_int()`, `compiler.alignment()` and `compiler.sizeof()` now have their implicitly-included headers corrected and documented. `` was included unintentionally when cross-compiling, which is less than ideal because there is no guarantee that a standard library is available for the target platform. Only `` is included instead. For projects that depend on the old behavior, the compiler check methods have an optional argument `prefix`, which can be used to specify additional `#include` directives. ## Treat warnings as error in compiler checks Compiler check methods `compiler.compiles()`, `compiler.links()` and `compiler.run()` now have a new `werror: true` keyword argument to treat compiler warnings as error. This can be used to check if code compiles without warnings. ## Compilers now have a `has_define` method This method returns true if the given preprocessor symbol is defined, else false is returned. This is useful is cases where an empty define has to be distinguished from a non-set one, which is not possible using `get_define`. Additionally it makes intent clearer for code that only needs to check if a specific define is set at all and does not care about its value. ## [[configure_file]] now has a `macro_name` parameter. This new paramater, `macro_name` allows C macro-style include guards to be added to [[configure_file]]'s output when a template file is not given. This change simplifies the creation of configure files that define macros with dynamic names and want the C-style include guards. ## `c_std` and `cpp_std` options now accepts a list of values Projects that prefer GNU C, but can fallback to ISO C, can now set, for example, `default_options: 'c_std=gnu11,c11'`, and it will use `gnu11` when available, but fallback to `c11` otherwise. It is an error only if none of the values are supported by the current compiler. Likewise, a project that can take benefit of `c++17` but can still build with `c++11` can set `default_options: 'cpp_std=c++17,c++11'`. This allows us to deprecate `gnuXX` values from the MSVC compiler. That means that `default_options: 'c_std=gnu11'` will now print a warning with MSVC but fallback to `c11`. No warning is printed if at least one of the values is valid, i.e. `default_options: 'c_std=gnu11,c11'`. In the future that deprecation warning will become an hard error because `c_std=gnu11` should mean GNU is required, for projects that cannot be built with MSVC for example. ## More meaningful description of many generative tasks When a module uses a `CustomTarget` to process files, it now has the possibility to customize the message displayed by ninja. Many modules were updated to take advantage of this new feature. ## Deprecate 'jar' as a build_target type The point of `build_target()` is that what is produced can be conditionally changed. However, `jar()` has a significant number of non-overlapping arguments from other build_targets, including the kinds of sources it can include. Because of this crafting a `build_target` that can be used as a Jar and as something else is incredibly hard to do. As such, it has been deprecated, and using `jar()` directly is recommended. ## generator.process() gains 'env' keyword argument Like the kwarg of the same name in `custom_target()`, `env` allows you to set the environment in which the generator will process inputs. ## Target names for executables now take into account suffixes. In previous versions of meson, a `meson.build` file like this: ``` exectuable('foo', 'main.c') exectuable('foo', 'main.c', name_suffix: 'bar') ``` would result in a configure error because meson internally used the same id for both executables. This build file is now allowed since meson takes into account the `bar` suffix when generating the second executable. This allows for executables with the same basename but different suffixes to be built in the same subdirectory. ## Executable gains vs_module_defs keyword This allows using a .def file to control which functions an [[executable]] will expose to a [[shared_module]]. ## find_program() now supports the 'default_options' argument In a similar fashion as dependency(), find_program() now also allows you to set default options for the subproject that gets built in case of a fallback. ## `fs.relative_to()` The `fs` module now has a `relative_to` method. The method will return the relative path from argument one to argument two, if one exists. Otherwise, the absolute path to argument one is returned. ```meson assert(fs.relative_to('c:\\prefix\\lib', 'c:\\prefix\\bin') == '..\\lib') assert(fs.relative_to('c:\\proj1\\foo', 'd:\\proj1\\bar') == 'c:\\proj1\\foo') assert(fs.relative_to('prefix\\lib\\foo', 'prefix') == 'lib\\foo') assert(fs.relative_to('/prefix/lib', '/prefix/bin') == '../lib') assert(fs.relative_to('prefix/lib/foo', 'prefix') == 'lib/foo') ``` In addition to strings, it can handle files, custom targets, custom target indices, and build targets. ## Added follow_symlinks arg to install_data, install_header, and install_subdir The [[install_data]], [[install_headers]], [[install_subdir]] functions now have an optional argument `follow_symlinks` that, if set to `true`, makes it so symbolic links in the source are followed, rather than copied into the destination tree, to match the old behavior. The default, which is currently to follow links, is subject to change in the future. ## Added 'fill' kwarg to int.to_string() int.to_string() now accepts a `fill` argument. This allows you to pad the string representation of the integer with leading zeroes: ```meson n = 4 message(n.to_string()) message(n.to_string(fill: 3)) n = -4 message(n.to_string(fill: 3)) ``` OUTPUT: ```meson 4 004 -04 ``` ## Added 'json' output_format to configure_file() When no input file is specified, [[configure_file]] can now generate a `json` file from given [[@cfg_data]]. Field descriptions are not preserved in the json file. ## `@GLOBAL_SOURCE_ROOT@` and `@DIRNAME@` in machine files Some tokens are now replaced in the machine file before parsing it: - `@GLOBAL_SOURCE_ROOT@`: the absolute path to the project's source tree - `@DIRNAME@`: the absolute path to the machine file's parent directory. It can be used, for example, to have paths relative to the source directory, or relative to toolchain's installation directory. ```ini [binaries] c = '@DIRNAME@/toolchain/gcc' exe_wrapper = '@GLOBAL_SOURCE_ROOT@' / 'build-aux' / 'my-exe-wrapper.sh' ``` ## clang-tidy-fix target If `clang-tidy` is installed and the project's source root contains a `.clang-tidy` (or `_clang-tidy`) file, Meson will automatically define a `clang-tidy-fix` target that runs `run-clang-tidy` tool with `-fix` option to apply the changes found by clang-tidy to the source code. If you have defined your own `clang-tidy-fix` target, Meson will not generate its own target. ## Meson compile command now accepts suffixes for TARGET The syntax for specifying a target for meson compile is now `[PATH_TO_TARGET/]TARGET_NAME.TARGET_SUFFIX[:TARGET_TYPE]` where `TARGET_SUFFIX` is the suffix argument given in the build target within meson.build. It is optional and `TARGET_NAME` remains sufficient if it uniquely resolves to one single target. ## New environment variable `MESON_PACKAGE_CACHE_DIR` If the `MESON_PACKAGE_CACHE_DIR` environment variable is set, it is used instead of the project's `subprojects/packagecache`. This allows sharing the cache across multiple projects. In addition it can contain an already extracted source tree as long as it has the same directory name as the `directory` field in the wrap file. In that case, the directory will be copied into `subprojects/` before applying patches. ## Update options with `meson setup -Dopt=value` If the build directory already exists, options are updated with their new value given on the command line (`-Dopt=value`). Unless `--reconfigure` is also specified, this won't reconfigure immediately. This has the same behaviour as `meson configure -Dopt=value`. Previous Meson versions were simply a no-op. ## Clear persistent cache with `meson setup --clearcache` Just like `meson configure --clearcache`, it is now possible to clear the cache and reconfigure in a single command with `meson setup --clearcache --reconfigure `. ## pkg-config dependencies can now get a variable with multiple replacements When using [[dep.get_variable]] and defining a `pkgconfig_define`, it is sometimes useful to remap multiple dependency variables. For example, if the upstream project changed the variable name that is interpolated and it is desirable to support both versions. It is now possible to pass multiple pairs of variable/value. The same applies to the compatibility [[dep.get_pkgconfig_variable]] method. ## Machine files: `pkgconfig` field deprecated and replaced by `pkg-config` Meson used to allow both `pkgconfig` and `pkg-config` entries in machine files, the former was used for `dependency()` lookup and the latter was used as return value for `find_program('pkg-config')`. This inconsistency is now fixed by deprecating `pkgconfig` in favor of `pkg-config` which matches the name of the binary. For backward compatibility it is still allowed to define both with the same value, in that case no deprecation warning is printed. ## Support targeting Python's limited C API The Python module's `extension_module` function has gained the ability to build extensions which target Python's limited C API via a new keyword argument: `limited_api`. ## All compiler `has_*` methods support the `required` keyword Now instead of ```meson assert(cc.has_function('some_function')) assert(cc.has_type('some_type')) assert(cc.has_member('struct some_type', 'x')) assert(cc.has_members('struct some_type', ['x', 'y'])) ``` we can use ```meson cc.has_function('some_function', required: true) cc.has_type('some_type', required: true) cc.has_member('struct some_type', 'x', required: true) cc.has_members('struct some_type', ['x', 'y'], required: true) ``` ## Deprecated `rust_crate_type` and replaced by `rust_abi` The new `rust_abi` keyword argument is accepted by [[shared_library]], [[static_library]], [[library]] and [[shared_module]] functions. It can be either `'rust'` (the default) or `'c'` strings. `rust_crate_type` is now deprecated because Meson already knows if it's a shared or static library, user only need to specify the ABI (Rust or C). `proc_macro` crates are now handled by the [`rust.proc_macro()`](Rust-module.md#proc_macro) method. ## Tests now abort on errors by default under sanitizers Sanitizers like AddressSanitizer and UndefinedBehaviorSanitizer do not abort by default on detected violations. Meson now exports `ASAN_OPTIONS` and `UBSAN_OPTIONS` when unset in the environment to provide sensible abort-by-default behavior. ## `_(shared|static)_args` for both_library, library, and build_target We now allow passing arguments like `c_static_args` and `c_shared_args`. This allows a [[both_libraries]] to have arguments specific to either the shared or static library, as well as common arguments to both. There is a drawback to this, since Meson now cannot re-use object files between the static and shared targets. This could lead to much higher compilation time when using a [[both_libraries]] if there are many sources. ## `-j` shorthand for `--num-processes` `-j` now means the same thing as `--num-processes`. It was inconsistently supported only in some subcommands. Now you may use it everywhere ## Unified message(), str.format() and f-string formatting They now all support the same set of values: strings, integers, bools, options, dictionaries and lists thereof. - Feature options (i.e. enabled, disabled, auto) were not previously supported by any of those functions. - Lists and dictionaries were not previously supported by f-string. - str.format() allowed any type and often resulted in printing the internal representation which is now deprecated. ## Subprojects excluded from scan-build reports The `scan-build` target, created when using the `ninja` backend with `scan-build` present, now excludes bugs found in subprojects from its final report. ## vs_module_defs keyword now supports indexes of custom_target This means you can do something like: ```meson defs = custom_target('generate_module_defs', ...) shared_library('lib1', vs_module_defs : defs[0]) shared_library('lib2', vs_module_defs : defs[2]) ``` ## Automatic fallback to `cmake` and `cargo` subproject CMake subprojects have been supported for a while using the `cmake.subproject()` module method. However until now it was not possible to use a CMake subproject as fallback in a `dependency()` call. A wrap file can now specify the method used to build it by setting the `method` key in the wrap file's first section. The method defaults to `meson`. Supported methods: - `meson` requires `meson.build` file. - `cmake` requires `CMakeLists.txt` file. [See details](Wrap-dependency-system-manual.md#cmake-wraps). - `cargo` requires `Cargo.toml` file. [See details](Wrap-dependency-system-manual.md#cargo-wraps). muon-v0.4.0/subprojects/meson-docs/docs/markdown/Build-targets.md0000644000175000017500000000677314737503617024105 0ustar buildbuild--- short-description: Definition of build targets ... # Build targets Meson provides four kinds of build targets: executables, libraries (which can be set to be built as static or shared or both of them at the build configuration time), static libraries, and shared libraries. They are created with the commands `executable`, `library`, `static_library` and `shared_library`, respectively. All objects created in this way are **immutable**. That is, you cannot change any aspect of them after they have been constructed. This ensures that all information pertaining to a given build target is specified in one well defined place. Libraries and executables -- As an example, here is how you would build a library. ```meson project('shared lib', 'c') library('mylib', 'source.c') ``` It is generally preferred to use the `library` command instead of `shared_library` and `static_library` and then configure which libraries (static or shared or both of them) will be built at the build configuration time using the `default_library` [built-in option](Builtin-options.md). In Unix-like operating systems, shared libraries can be versioned. Meson supports this with keyword arguments, which will be ignored if the library is configured as static at the compile time. ```meson project('shared lib', 'c') library('mylib', 'source.c', version : '1.2.3', soversion : '1') ``` It is common to build a library and then an executable that links against it. This is supported as well. ```meson project('shared lib', 'c') lib = library('mylib', 'source.c') executable('program', 'prog.c', link_with : lib) ``` Meson sets things up so that the resulting executable can be run directly from the build directory. There is no need to write shell scripts or set environment variables. One target can have multiple language source files. ```meson project('multilang', 'c', 'cpp') executable('multiexe', 'file.c', 'file2.cc') ``` Object files -- Sometimes you can't build files from sources but need to utilize an existing object file. A typical case is using an object file provided by a third party. Object files can be specified just like sources. ```meson exe = executable('myexe', 'source.cpp', objects : 'third_party_object.o') ``` A different case is when you want to use object files built in one target directly in another. A typical case is when you build a shared library and it has an internal class that is not exported in the ABI. This means you can't access it even if you link against the library. Typical workarounds for this include building both a shared and static version of the library or putting the source file in the test executable's source list. Both of these approaches cause the source to be built twice, which is slow. In Meson you can extract object files from targets and use them as-is on other targets. This is the syntax for it. ```meson lib = shared_library('somelib', 'internalclass.cc', 'file.cc', ...) eo = lib.extract_objects('internalclass.cc') executable('classtest', 'classtest.cpp', objects : eo) ``` Here we take the internal class object and use it directly in the test. The source file is only compiled once. Note that careless use of this feature may cause strange bugs. As an example trying to use objects of an executable or static library in a shared library will not work because shared library objects require special compiler flags. Getting this right is the user's responsibility. For this reason it is strongly recommended that you only use this feature for generating unit test executables in the manner described above. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Release-notes-for-0.43.0.md0000644000175000017500000000716614737503617025406 0ustar buildbuild--- title: Release 0.43 short-description: Release notes for 0.43 ... ## Portability improvements to Boost Dependency The Boost dependency has been improved to better detect the various ways to install boost on multiple platforms. At the same time the `modules` semantics for the dependency has been changed. Previously it was allowed to specify header directories as `modules` but it wasn't required. Now, modules are only used to specify libraries that require linking. This is a breaking change and the fix is to remove all modules that aren't found. ## Generator learned capture Generators can now be configured to capture the standard output. See `test cases/common/98 gen extra/meson.build` for an example. ## Can index CustomTarget objects The `CustomTarget` object can now be indexed like an array. The resulting object can be used as a source file for other Targets, this will create a dependency on the original `CustomTarget`, but will only insert the generated file corresponding to the index value of the `CustomTarget`'s `output` keyword. ```meson c = custom_target( ... output : ['out.h', 'out.c'], ) lib1 = static_library( 'lib1', [lib1_sources, c[0]], ... ) exec = executable( 'executable', c[1], link_with : lib1, ) ``` ## Can override executables in the cross file The cross file can now be used for overriding the result of `find_program`. As an example if you want to find the `objdump` command and have the following definition in your cross file: ```ini [binaries] ... objdump = '/usr/bin/arm-linux-gnueabihf-objdump-6' ``` Then issuing the command `find_program('objdump')` will return the version specified in the cross file. If you need the build machine's objdump, you can specify the `native` keyword like this: ```meson native_objdump = find_program('objdump', native : true) ``` ## Easier handling of supported compiler arguments A common pattern for handling multiple desired compiler arguments, was to test their presence and add them to an array one-by-one, e.g.: ```meson warning_flags_maybe = [ '-Wsomething', '-Wanother-thing', '-Wno-the-other-thing', ] warning_flags = [] foreach flag : warning_flags_maybe if cc.has_argument(flag) warning_flags += flag endif endforeach cc.add_project_argument(warning_flags) ``` A helper has been added for the foreach/has_argument pattern, so you can now simply do: ```meson warning_flags = [ ... ] flags = cc.get_supported_arguments(warning_flags) ``` ## Better support for shared libraries in non-system paths Meson has support for prebuilt object files and static libraries. This release adds feature parity to shared libraries that are either in non-standard system paths or shipped as part of your project. On systems that support rpath, Meson automatically adds rpath entries to built targets using manually found external libraries. This means that e.g. supporting prebuilt libraries shipped with your source or provided by subprojects or wrap definitions by writing a build file like this: ```meson project('myprebuiltlibrary', 'c') cc = meson.get_compiler('c') prebuilt = cc.find_library('mylib', dirs : meson.current_source_dir()) mydep = declare_dependency(include_directories : include_directories('.'), dependencies : prebuilt) ``` Then you can use the dependency object in the same way as any other. ## wrap-svn The [Wrap dependency system](Wrap-dependency-system-manual.md) now supports [Subversion](https://subversion.apache.org/) (svn). This support is rudimentary. The repository url has to point to a specific (sub)directory containing the `meson.build` file (typically `trunk/`). However, providing a `revision` is supported. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Project-templates.md0000644000175000017500000000262514737503617024771 0ustar buildbuild--- short-description: Project templates ... # Project templates To make it easier for new developers to start working, Meson ships a tool to generate the basic setup of different kinds of projects. This functionality can be accessed with the `meson init` command. A typical project setup would go like this: ```console $ mkdir project_name $ cd project_name $ meson init --language=c --name=myproject --version=0.1 ``` This would create the build definitions for a helloworld type project. The result can be compiled as usual. For example it could be done like this: ``` $ meson setup builddir $ meson compile -C builddir ``` The generator has many different projects and settings. They can all be listed by invoking the command `meson init --help`. This feature is available since Meson version 0.45.0. # Generate a build script for an existing project With `meson init` you can generate a build script for an existing project with existing project files by running the command in the root directory of your project. Meson currently supports this feature for `executable`, and `jar` projects. # Build after generation of template It is possible to have Meson generate a build directory from the `meson init` command without running `meson setup`. This is done by passing `-b` or `--build` switch. ```console $ mkdir project_name $ cd project_name $ meson init --language=c --name=myproject --version=0.1 --build ```muon-v0.4.0/subprojects/meson-docs/docs/markdown/MesonCI.md0000644000175000017500000000313514737503617022661 0ustar buildbuild# Meson CI setup This document is aimed for Meson contributors and documents the CI setup used for testing Meson itself. The Meson project uses multiple CI platforms for covering a wide range of target systems. ## GitHub actions The configuration files for GitHub actions are located in `.github/workflows`. Here, all [images](#docker-images) are tested with the full `run_tests.py` run. Additionally, some other, smaller, tests are run. ## Docker images The Linux docker images are automatically built and uploaded by GitHub actions. An image rebuild is triggered when any of the image definition files are changed (in `ci/ciimage`) in the master branch. Additionally, the images are also updated weekly. Each docker image has one corresponding directory in `ci/ciimage` with an `image.json` and an `install.sh`. ### Image generation There are no manual Dockerfiles. Instead the Dockerfile is automatically generated by the `build.py` script. This is done to ensure that all images have the same layout and can all be built and tested automatically. The Dockerfile is generated from the `image.json` file and basically only adds a few common files and runs the `install.sh` script which should contain all distribution specific setup steps. The `common.sh` can be sourced via `source /ci/common.sh` to access some shared functionality. To generate the image run `build.py -t build `. A generated image can be tested with `build.py -t test `. ### Common image setup Each docker image has a `/ci` directory with an `env_vars.sh` script. This script has to be sourced before running the Meson test suite. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Release-notes-for-0.42.0.md0000644000175000017500000001222214737503617025372 0ustar buildbuild--- title: Release 0.42 short-description: Release notes for 0.42 ... # New features ## Distribution tarballs from Mercurial repositories Creating distribution tarballs can now be made out of projects based on Mercurial. As before, this remains possible only with the Ninja backend. ## Keyword argument verification Meson will now check the keyword arguments used when calling any function and print a warning if any of the keyword arguments is not known. In the future this will become a hard error. ## Add support for Genie to Vala compiler The Vala compiler has an alternative syntax, Genie, that uses the `.gs` file extension. Meson now recognises and uses Genie files. ## Pkgconfig support for additional cflags The Pkgconfig module object can add arbitrary extra cflags to the Cflags value in the .pc file, using the "extra_cflags" keyword: ```meson pkg.generate(libraries : libs, subdirs : h, version : '1.0', name : 'libsimple', filebase : 'simple', description : 'A simple demo library.', extra_cflags : '-Dfoo' ) ``` ## Base options accessible via get_option() Base options are now accessible via the get_option() function. ```meson uses_lto = get_option('b_lto') ``` ## Allow crate type configuration for Rust compiler Rust targets now take an optional `rust_crate_type` keyword, allowing you to set the crate type of the resulting artifact. Valid crate types are `dylib` or `cdylib` for shared libraries, and `rlib` or `staticlib` for static libraries. For more, see Rust's [linkage reference][rust-linkage]. [rust-linkage]: https://doc.rust-lang.org/reference/linkage.html ## Simultaneous use of Address- and Undefined Behavior Sanitizers Both the address- and undefined behavior sanitizers can now be used simultaneously by passing `-Db_sanitize=address,undefined` to Meson. ## Unstable SIMD module A new experimental module to compile code with many different SIMD instruction sets and selecting the best one at runtime. This module is unstable, meaning its API is subject to change in later releases. It might also be removed altogether. ## Import libraries for executables on Windows The new keyword `implib` to `executable()` allows generation of an import library for the executable. ## Added build_rpath keyword argument You can specify `build_rpath : '/foo/bar'` in build targets and the given path will get added to the target's rpath in the build tree. It is removed during the install step. Meson will print a warning when the user tries to add an rpath linker flag manually, e.g. via `link_args` to a target. This is not recommended because having multiple rpath causes them to stomp on each other. This warning will become a hard error in some future release. ## Vulkan dependency module Vulkan can now be used as native dependency. The dependency module will detect the VULKAN_SDK environment variable or otherwise try to receive the vulkan library and header via pkgconfig or from the system. ## Limiting the maximum number of linker processes With the Ninja backend it is now possible to limit the maximum number of concurrent linker processes. This is usually only needed for projects that have many large link steps that cause the system to run out of memory if they are run in parallel. This limit can be set with the new `backend_max_links` option. ## Disable implicit include directories By default Meson adds the current source and build directories to the header search path. On some rare occasions this is not desired. Setting the `implicit_include_directories` keyword argument to `false` these directories are not used. ## Support for MPI dependency MPI is now supported as a dependency. Because dependencies are language-specific, you must specify the requested language with the `language` keyword, i.e., `dependency('mpi', language='c')` will request the C MPI headers and libraries. See [the MPI dependency](Dependencies.md#mpi) for more information. ## Allow excluding files or directories from `install_subdir` The [[install_subdir]] command accepts the new `exclude_files` and `exclude_directories` keyword arguments that allow specified files or directories to be excluded from the installed subdirectory. ## Make all Meson functionality invocable via the main executable Previously Meson had multiple executables such as `mesonintrospect` and `mesontest`. They are now invocable via the main Meson executable like this: meson configure # equivalent to mesonconf meson test # equivalent to mesontest The old commands are still available but they are deprecated and will be removed in some future release. ## Pcap dependency detector Meson will automatically obtain dependency information for pcap using the `pcap-config` tool. It is used like any other dependency: ```meson pcap_dep = dependency('pcap', version : '>=1.0') ``` ## GNOME module mkenums_simple() addition Most libraries and applications use the same standard templates for glib-mkenums. There is now a new `mkenums_simple()` convenience method that passes those default templates to glib-mkenums and allows some tweaks such as optional function decorators or leading underscores. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Videos.md0000644000175000017500000000341614737503617022617 0ustar buildbuild--- short-description: Videos about Meson ... # Videos - [Lessons Learned From Porting LibreOffice's Build System To Meson](https://www.youtube.com/watch?v=asB_hx_jJSw), CppNorth 2022 - [The Meson build system overview](https://www.youtube.com/watch?v=rewhp5o0xZg), PyCon US 2022 - [Behind (and under) the scenes of the Meson build system](https://www.youtube.com/watch?v=iLN6wL7ExHU), Linux.conf.au 2020 - [Behind the Scenes of a C++ Build System](https://www.youtube.com/watch?v=34KzT2yvQuM), CppCon 2019 - [Compiling Multi-Million Line C++ Code Bases Effortlessly with the Meson Build system](https://www.youtube.com/watch?v=SCZLnopmYBM), CppCon 2018 - [The Meson Build System, 4+ years of work to become an overnight success](https://www.youtube.com/watch?v=gHdTzdXkhRY), Linux.conf.au 2018 - [Power through simplicity, using Python in the Meson Build System](https://youtu.be/3jF3oVsjIEM), Piter.py, 2017 - [Meson and the changing Linux build landscape](https://media.ccc.de/v/ASG2017-111-meson_and_the_changing_linux_build_landscape), All Systems Go 2017 - [Meson, compiling the world with Python](https://www.youtube.com/watch?v=sEO4DC8hm34), Europython 2017 - [Builds, dependencies and deployment in a modern multiplatform world](https://www.youtube.com/embed/CTJtKtQ8R5k), Linux.conf.au 2016 - [New world, new tools](https://www.youtube.com/embed/0-gx1qU2pPo), Libre Application Summit 2016 - [Making build systems not suck](https://www.youtube.com/embed/KPi0AuVpxLI), Linux.conf.au 2015, Auckland, New Zealand - [Lightning talk at FOSDEM 2014](http://mirror.onet.pl/pub/mirrors/video.fosdem.org/2014/H2215_Ferrer/Sunday/Introducing_the_Meson_build_system.webm), The first ever public presentation on Meson muon-v0.4.0/subprojects/meson-docs/docs/markdown/Vala.md0000644000175000017500000002645214737503617022256 0ustar buildbuild--- title: Vala short-description: Compiling Vala and Genie programs ... # Compiling Vala applications and libraries Meson supports compiling applications and libraries written in [Vala](https://vala-project.org/) and [Genie](https://wiki.gnome.org/Projects/Genie) . A skeleton `meson.build` file: ```meson project('vala app', 'vala', 'c') dependencies = [ dependency('glib-2.0'), dependency('gobject-2.0'), ] sources = files('app.vala') executable('app_name', sources, dependencies: dependencies) ``` You must always specify the `glib-2.0` and `gobject-2.0` libraries as dependencies, because all current Vala applications use them. [GLib](https://developer.gnome.org/glib/stable/) is used for basic data types and [GObject](https://developer.gnome.org/gobject/stable/) is used for the runtime type system. ## Using libraries Meson uses the [[dependency]] function to find the relevant VAPI, C headers and linker flags when it encounters a Vala source file in a build target. Vala needs a VAPI file and a C header or headers to use a library. The VAPI file helps map Vala code to the library's C programming interface. It is the [`pkg-config`](https://www.freedesktop.org/wiki/Software/pkg-config/) tool that makes finding these installed files all work seamlessly behind the scenes. When a `pkg-config` file doesn't exist for the library then the `find_library()` method of the [[@compiler]] object needs to be used. Examples are given later. Note Vala uses libraries that follow the C Application Binary Interface (C ABI). The library, however, could be written in C, Vala, Rust, Go, C++ or any other language that can generate a binary compatible with the C ABI and so provides C headers. ### The simplest case This first example is a simple addition to the `meson.build` file because: * the library has a `pkg-config` file, `gtk+-3.0.pc` * the VAPI is distributed with Vala and so installed with the Vala compiler * the VAPI is installed in Vala's standard search path * the VAPI, `gtk+-3.0.vapi`, has the same name as the `pkg-config` file Everything works seamlessly in the background and only a single extra line is needed: ```meson project('vala app', 'vala', 'c') dependencies = [ dependency('glib-2.0'), dependency('gobject-2.0'), dependency('gtk+-3.0'), ] sources = files('app.vala') executable('app_name', sources, dependencies: dependencies) ``` GTK+ is the graphical toolkit used by GNOME, elementary OS and other desktop environments. The binding to the library, the VAPI file, is distributed with Vala. Other libraries may have a VAPI that is distributed with the library itself. Such libraries will have their VAPI file installed along with their other development files. The VAPI is installed in Vala's standard search path and so works just as seamlessly using the `dependency()` function. ### Targeting a version of GLib Meson's [[dependency]] function allows a version check of a library. This is often used to check a minimum version is installed. When setting a minimum version of GLib, Meson will also pass this to the Vala compiler using the `--target-glib` option. This is needed when using GTK+'s user interface definition files with Vala's `[GtkTemplate]`, `[GtkChild]` and `[GtkCallback]` attributes. This requires `--target-glib 2.38`, or a newer version, to be passed to Vala. With Meson this is simply done with: ```meson project('vala app', 'vala', 'c') dependencies = [ dependency('glib-2.0', version: '>=2.38'), dependency('gobject-2.0'), dependency('gtk+-3.0'), ] sources = files('app.vala') executable('app_name', sources, dependencies: dependencies) ``` Using `[GtkTemplate]` also requires the GTK+ user interface definition files to be built into the binary as GResources. For completeness, the next example shows this: ```meson project('vala app', 'vala', 'c') dependencies = [ dependency('glib-2.0', version: '>=2.38'), dependency('gobject-2.0'), dependency('gtk+-3.0'), ] sources = files('app.vala') sources += import( 'gnome' ).compile_resources( 'project-resources', 'src/resources/resources.gresource.xml', source_dir: 'src/resources', ) executable('app_name', sources, dependencies: dependencies) ``` ### Adding to Vala's search path So far we have covered the cases where the VAPI file is either distributed with Vala or the library. A VAPI can also be included in the source files of your project. The convention is to put it in the `vapi` directory of your project. This is needed when a library does not have a VAPI or your project needs to link to another component in the project that uses the C ABI. For example if part of the project is written in C. The Vala compiler's `--vapidir` option is used to add the project directory to the VAPI search path. In Meson this is done with the `add_project_arguments()` function: ```meson project('vala app', 'vala', 'c') vapi_dir = meson.current_source_dir() / 'vapi' add_project_arguments(['--vapidir', vapi_dir], language: 'vala') dependencies = [ dependency('glib-2.0'), dependency('gobject-2.0'), dependency('foo'), # 'foo.vapi' will be resolved as './vapi/foo.vapi' ] sources = files('app.vala') executable('app_name', sources, dependencies: dependencies) ``` If the VAPI is for an external library then make sure that the VAPI name corresponds to the pkg-config file name. The [`vala-extra-vapis` repository](https://gitlab.gnome.org/GNOME/vala-extra-vapis) is a community maintained repository of VAPIs that are not distributed. Developers use the repository to share early work on new bindings and improvements to existing bindings. So the VAPIs can frequently change. It is recommended VAPIs from this repository are copied into your project's source files. This also works well for starting to write new bindings before they are shared with the `vala-extra-vapis` repository. ### Libraries without pkg-config files A library that does not have a corresponding pkg-config file may mean `dependency()` is unsuitable for finding the C and Vala interface files. In this case it is necessary to use the `find_library()` method of the compiler object. The first example uses Vala's POSIX binding. There is no pkg-config file because POSIX includes the standard C library on Unix systems. All that is needed is the VAPI file, `posix.vapi`. This is included with Vala and installed in Vala's standard search path. Meson just needs to be told to only find the library for the Vala compiler: ```meson project('vala app', 'vala', 'c') dependencies = [ dependency('glib-2.0'), dependency('gobject-2.0'), meson.get_compiler('vala').find_library('posix'), ] sources = files('app.vala') executable('app_name', sources, dependencies: dependencies) ``` The next example shows how to link with a C library where no additional VAPI is needed. The standard maths functions are already bound in `glib-2.0.vapi`, but the GNU C library requires linking to the maths library separately. In this example Meson is told to find the library only for the C compiler: ```meson project('vala app', 'vala', 'c') dependencies = [ dependency('glib-2.0'), dependency('gobject-2.0'), meson.get_compiler('c').find_library('m', required: false), ] sources = files('app.vala') executable('app_name', sources, dependencies: dependencies) ``` The `required: false` means the build will continue when using another C library that does not separate the maths library. See [Add math library (-lm) portably](howtox.md#add-math-library-lm-portably). The final example shows how to use a library that does not have a pkg-config file and the VAPI is in the `vapi` directory of your project source files: ```meson project('vala app', 'vala', 'c') vapi_dir = meson.current_source_dir() / 'vapi' add_project_arguments(['--vapidir', vapi_dir], language: 'vala') dependencies = [ dependency('glib-2.0'), dependency('gobject-2.0'), meson.get_compiler('c').find_library('foo'), meson.get_compiler('vala').find_library('foo', dirs: vapi_dir), ] sources = files('app.vala') executable('app_name', sources, dependencies: dependencies) ``` The `find_library()` method of the C compiler object will try to find the C header files and the library to link with. The `find_library()` method of the Vala compiler object needs to have the `dir` keyword added to include the project VAPI directory. This is not added automatically by `add_project_arguments()`. ### Working with the Vala Preprocessor Passing arguments to [Vala's preprocessor](https://wiki.gnome.org/Projects/Vala/Manual/Preprocessor) requires specifying the language as `vala`. For example, the following statement sets the preprocessor symbol `USE_FUSE`: ```meson add_project_arguments('-D', 'USE_FUSE', language: 'vala') ``` If you need to pass an argument to the C pre-processor then specify the language as c. For example to set FUSE_USE_VERSION to 26 use: ```meson add_project_arguments('-DFUSE_USE_VERSION=26', language: 'c') ``` ## Building libraries ### Changing C header and VAPI names Meson's [[library]] target automatically outputs the C header and the VAPI. They can be renamed by setting the `vala_header` and `vala_vapi` arguments respectively: ```meson foo_lib = shared_library('foo', 'foo.vala', vala_header: 'foo.h', vala_vapi: 'foo-1.0.vapi', dependencies: [glib_dep, gobject_dep], install: true, install_dir: [true, true, true]) ``` In this example, the second and third elements of the `install_dir` array indicate the destination with `true` to use default directories (i.e. `include` and `share/vala/vapi`). ### GObject Introspection and language bindings A 'binding' allows another programming language to use a library written in Vala. Because Vala uses the GObject type system as its runtime type system it is very easy to use introspection to generate a binding. A Meson build of a Vala library can generate the GObject introspection metadata. The metadata is then used in separate projects with [language specific tools](https://wiki.gnome.org/Projects/Vala/LibraryWritingBindings) to generate a binding. The main form of metadata is a GObject Introspection Repository (GIR) XML file. GIRs are mostly used by languages that generate bindings at compile time. Languages that generate bindings at runtime mostly use a typelib file, which is generated from the GIR. Meson can generate a GIR as part of the build. For a Vala library the `vala_gir` option has to be set for the `library`: ```meson foo_lib = shared_library('foo', 'foo.vala', vala_gir: 'Foo-1.0.gir', dependencies: [glib_dep, gobject_dep], install: true, install_dir: [true, true, true, true]) ``` The `true` value in `install_dir` tells Meson to use the default directory (i.e. `share/gir-1.0` for GIRs). The fourth element in the `install_dir` array indicates where the GIR file will be installed. To then generate a typelib file use a custom target with the `g-ir-compiler` program and a dependency on the library: ```meson g_ir_compiler = find_program('g-ir-compiler') custom_target('foo typelib', command: [g_ir_compiler, '--output', '@OUTPUT@', '@INPUT@'], input: meson.current_build_dir() / 'Foo-1.0.gir', output: 'Foo-1.0.typelib', depends: foo_lib, install: true, install_dir: get_option('libdir') / 'girepository-1.0') ``` muon-v0.4.0/subprojects/meson-docs/docs/markdown/Syntax.md0000644000175000017500000005504714737503617022663 0ustar buildbuild--- short-description: Syntax and structure of Meson files ... # Syntax The syntax of Meson's specification language has been kept as simple as possible. It is *strongly typed* so no object is ever converted to another under the covers. Variables have no visible type which makes Meson *dynamically typed* (also known as *duck typed*). The main building blocks of the language are *variables*, *numbers*, *booleans*, *strings*, *arrays*, *function calls*, *method calls*, *if statements* and *includes*. Usually one Meson statement takes just one line. There is no way to have multiple statements on one line as in e.g. *C*. Function and method calls' argument lists can be split over multiple lines. Meson will autodetect this case and do the right thing. In other cases, *(added 0.50)* you can get multi-line statements by ending the line with a `\`. Apart from line ending whitespace has no syntactic meaning. ## Variables Variables in Meson work just like in other high level programming languages. A variable can contain a value of any type, such as an integer or a string. Variables don't need to be predeclared, you can just assign to them and they appear. Here's how you would assign values to two different variables. ```meson var1 = 'hello' var2 = 102 ``` One important difference in how variables work in Meson is that all objects are immutable. When you see an operation which appears like a mutation, actually a new object is created and assigned to the name. This is different from, for example, how Python works for objects, but similar to e.g. Python strings. ```meson var1 = [1, 2, 3] var2 = var1 var2 += [4] # var2 is now [1, 2, 3, 4] # var1 is still [1, 2, 3] ``` ## Numbers Meson supports only integer numbers. They are declared simply by writing them out. Basic arithmetic operations are supported. ```meson x = 1 + 2 y = 3 * 4 d = 5 % 3 # Yields 2. ``` Hexadecimal literals are supported since version 0.45.0: ```meson int_255 = 0xFF ``` Octal and binary literals are supported since version 0.47.0: ```meson int_493 = 0o755 int_1365 = 0b10101010101 ``` Strings can be converted to a number like this: ```meson string_var = '42' num = string_var.to_int() ``` Numbers can be converted to a string: ```meson int_var = 42 string_var = int_var.to_string() ``` ## Booleans A boolean is either `true` or `false`. ```meson truth = true ``` Booleans can be converted to a string or to a number: ```meson bool_var = true string_var = bool_var.to_string() int_var = bool_var.to_int() ``` ## Strings Strings in Meson are declared with single quotes. To enter a literal single quote do it like this: ```meson single_quote = 'contains a \' character' ``` The full list of escape sequences is: * `\\` Backslash * `\'` Single quote * `\a` Bell * `\b` Backspace * `\f` Formfeed * `\n` Newline * `\r` Carriage Return * `\t` Horizontal Tab * `\v` Vertical Tab * `\ooo` Character with octal value ooo * `\xhh` Character with hex value hh * `\uxxxx` Character with 16-bit hex value xxxx * `\Uxxxxxxxx` Character with 32-bit hex value xxxxxxxx * `\N{name}` Character named name in Unicode database As in python and C, up to three octal digits are accepted in `\ooo`. Unrecognized escape sequences are left in the string unchanged, i.e., the backslash is left in the string. ### String concatenation Strings can be concatenated to form a new string using the `+` symbol. ```meson str1 = 'abc' str2 = 'xyz' combined = str1 + '_' + str2 # combined is now abc_xyz ``` ### String path building *(Added 0.49)* You can concatenate any two strings using `/` as an operator to build paths. This will always use `/` as the path separator on all platforms. ```meson joined = '/usr/share' / 'projectname' # => /usr/share/projectname joined = '/usr/local' / '/etc/name' # => /etc/name joined = 'C:\\foo\\bar' / 'builddir' # => C:/foo/bar/builddir joined = 'C:\\foo\\bar' / 'D:\\builddir' # => D:/builddir ``` Note that this is equivalent to using [[join_paths]], which was obsoleted by this operator. ### Strings running over multiple lines Strings running over multiple lines can be declared with three single quotes, like this: ```meson multiline_string = '''#include int main (int argc, char ** argv) { return FOO_SUCCESS; }''' ``` These are raw strings that do not support the escape sequences listed above. These strings can also be combined with the string formatting functionality via `.format()` described below. Note that multiline f-string support was added in version 0.63. ### String index Strings support the indexing (`[]`) operator. This operator allows (read only) accessing a specific character. The returned value is guaranteed to be a string of length 1. ```meson foo = 'abcd' message(foo[1]) # Will print 'b' foo[2] = 'C' # ERROR: Meson objects are immutable! ``` ### String formatting #### .format() Strings can be built using the string formatting functionality. ```meson template = 'string: @0@, number: @1@, bool: @2@' res = template.format('text', 1, true) # res now has value 'string: text, number: 1, bool: true' ``` As can be seen, the formatting works by replacing placeholders of type `@number@` with the corresponding argument. #### Format strings *(Added 0.58)* Format strings can be used as a non-positional alternative to the string formatting functionality described above. Note that multiline f-string support was added in version 0.63. ```meson n = 10 m = 'hi' s = f'int: @n@, string: @m@' # s now has the value 'int: 10, string: hi' ``` Currently only identity-expressions are supported inside of format strings, meaning you cannot use arbitrary Meson expressions inside of them. ```meson n = 10 m = 5 # The following is not a valid format string s = f'result: @n + m@' ``` ### String methods Strings also support a number of other methods that return transformed copies. #### .replace() Since 0.58.0, you can replace a substring from a string. ```meson # Replaces all instances of one substring with another s = 'semicolons;as;separators' s = s.replace('as', 'are') # 's' now has the value of 'semicolons;are;separators' ``` #### .strip() ```meson # Similar to the Python str.strip(). Removes leading/ending spaces and newlines. define = ' -Dsomedefine ' stripped_define = define.strip() # 'stripped_define' now has the value '-Dsomedefine' # You may also pass a string to strip, which specifies the set of characters to # be removed instead of the default whitespace. string = 'xyxHelloxyx'.strip('xy') # 'string' now has the value 'Hello' ``` Since 0.43.0, you can specify one positional string argument, and all characters in that string will be stripped. #### .to_upper(), .to_lower() ```meson target = 'x86_FreeBSD' upper = target.to_upper() # t now has the value 'X86_FREEBSD' lower = target.to_lower() # t now has the value 'x86_freebsd' ``` #### .to_int() ```meson version = '1' # Converts the string to an int and throws an error if it can't be ver_int = version.to_int() ``` #### .contains(), .startswith(), .endswith() ```meson target = 'x86_FreeBSD' is_fbsd = target.to_lower().contains('freebsd') # is_fbsd now has the boolean value 'true' is_x86 = target.startswith('x86') # boolean value 'true' is_bsd = target.to_lower().endswith('bsd') # boolean value 'true' ``` #### .substring() Since 0.56.0, you can extract a substring from a string. ```meson # Similar to the Python str[start:end] syntax target = 'x86_FreeBSD' platform = target.substring(0, 3) # prefix string value 'x86' system = target.substring(4) # suffix string value 'FreeBSD' ``` The method accepts negative values where negative `start` is relative to the end of string `len(string) - start` as well as negative `end`. ```meson string = 'foobar' string.substring(-5, -3) # => 'oo' string.substring(1, -1) # => 'ooba' ``` #### .split(), .join() ```meson # Similar to the Python str.split() components = 'a b c d '.split() # components now has the value ['a', 'b', 'c', 'd'] components = 'a b c d '.split(' ') # components now has the value ['a', 'b', '', '', 'c', 'd', ''] # Similar to the Python str.join() output = ' '.join(['foo', 'bar']) # Output value is 'foo bar' pathsep = ':' path = pathsep.join(['/usr/bin', '/bin', '/usr/local/bin']) # path now has the value '/usr/bin:/bin:/usr/local/bin' # For joining path elements, you should use path1 / path2 # This has the advantage of being cross-platform path = '/usr' / 'local' / 'bin' # path now has the value '/usr/local/bin' # For sources files, use files(): my_sources = files('foo.c') ... my_sources += files('bar.c') # This has the advantage of always calculating the correct relative path, even # if you add files in another directory or use them in a different directory # than they're defined in # Example to set an API version for use in library(), install_header(), etc project('project', 'c', version: '0.2.3') version_array = meson.project_version().split('.') # version_array now has the value ['0', '2', '3'] api_version = '.'.join([version_array[0], version_array[1]]) # api_version now has the value '0.2' # We can do the same with .format() too: api_version = '@0@.@1@'.format(version_array[0], version_array[1]) # api_version now (again) has the value '0.2' ``` #### .underscorify() ```meson name = 'Meson Docs.txt#Reference-manual' # Replaces all characters other than `a-zA-Z0-9` with `_` (underscore) # Useful for substituting into #defines, filenames, etc. underscored = name.underscorify() # underscored now has the value 'Meson_Docs_txt_Reference_manual' ``` #### .version_compare() ```meson version = '1.2.3' # Compare version numbers semantically is_new = version.version_compare('>=2.0') # is_new now has the boolean value false # Supports the following operators: '>', '<', '>=', '<=', '!=', '==', '=' ``` Meson version comparison conventions include: ```meson '3.6'.version_compare('>=3.6.0') == false ``` It is best to be unambiguous and specify the full revision level to compare. ## Arrays Arrays are delimited by brackets. An array can contain an arbitrary number of objects of any type. ```meson my_array = [1, 2, 'string', some_obj] ``` Accessing elements of an array can be done via array indexing: ```meson my_array = [1, 2, 'string', some_obj] second_element = my_array[1] last_element = my_array[-1] ``` You can add more items to an array like this: ```meson my_array += ['foo', 3, 4, another_obj] ``` When adding a single item, you do not need to enclose it in an array: ```meson my_array += ['something'] # This also works my_array += 'else' ``` Note appending to an array will always create a new array object and assign it to `my_array` instead of modifying the original since all objects in Meson are immutable. Since 0.49.0, you can check if an array contains an element like this: ```meson my_array = [1, 2] if 1 in my_array # This condition is true endif if 1 not in my_array # This condition is false endif ``` ### Array methods The following methods are defined for all arrays: - `length`, the size of the array - `contains`, returns `true` if the array contains the object given as argument, `false` otherwise - `get`, returns the object at the given index, negative indices count from the back of the array, indexing out of bounds is a fatal error. Provided for backwards-compatibility, it is identical to array indexing. ## Dictionaries Dictionaries are delimited by curly braces. A dictionary can contain an arbitrary number of key: value pairs. Keys are required to be strings, but values can be objects of any type. Prior to *0.53.0* keys were required to be literal strings, i.e., you could not use a variable containing a string value as a key. ```meson my_dict = {'foo': 42, 'bar': 'baz'} ``` Keys must be unique: ```meson # This will fail my_dict = {'foo': 42, 'foo': 43} ``` Accessing elements of a dictionary works similarly to array indexing: ```meson my_dict = {'foo': 42, 'bar': 'baz'} forty_two = my_dict['foo'] # This will fail my_dict['does_not_exist'] ``` Dictionaries are immutable and do not have a guaranteed order. Dictionaries are available since 0.47.0. Visit the [[@dict]] objects page in the Reference Manual to read about the methods exposed by dictionaries. Since 0.49.0, you can check if a dictionary contains a key like this: ```meson my_dict = {'foo': 42, 'bar': 43} if 'foo' in my_dict # This condition is true endif if 42 in my_dict # This condition is false endif if 'foo' not in my_dict # This condition is false endif ``` *Since 0.53.0* Keys can be any expression evaluating to a string value, not limited to string literals any more. ```meson d = {'a' + 'b' : 42} k = 'cd' d += {k : 43} ``` ## Function calls Meson provides a set of usable functions. The most common use case is creating build objects. ```meson executable('progname', 'prog.c') ``` Most functions take only few positional arguments but several keyword arguments, which are specified like this: ```meson executable('progname', sources: 'prog.c', c_args: '-DFOO=1') ``` Starting with version 0.49.0 keyword arguments can be specified dynamically. This is done by passing dictionary representing the keywords to set in the `kwargs` keyword. The previous example would be specified like this: ```meson d = {'sources': 'prog.c', 'c_args': '-DFOO=1'} executable('progname', kwargs: d) ``` A single function can take keyword arguments both directly in the function call and indirectly via the `kwargs` keyword argument. The only limitation is that it is a hard error to pass any particular key both as a direct and indirect argument. ```meson d = {'c_args': '-DFOO'} executable('progname', 'prog.c', c_args: '-DBAZ=1', kwargs: d) # This is an error! ``` Attempting to do this causes Meson to immediately exit with an error. ### Argument flattening Argument flattening is a Meson feature that aims to simplify using methods and functions. For functions where this feature is active, Meson takes the list of arguments and flattens all nested lists into one big list. For instance the following function calls to [[executable]] are identical in Meson: ```meson # A normal example: executable('exe1', ['foo.c', 'bar.c', 'foobar.c']) # A more contrived example that also works but certainly # isn't good Meson code: l1 = ['bar.c'] executable('exe1', [[['foo.c', l1]], ['foobar.c']]) # How meson will treat all the previous calls internally: executable('exe1', 'foo.c', 'bar.c', 'foobar.c') ``` Because of an internal implementation detail, the following syntax is currently also supported, even though the first argument of [[executable]] is a single [[@str]] and not a [[@list]]: ```meson # WARNING: This example is only valid because of an internal # implementation detail and not because it is intended # # PLEASE DO NOT DO SOMETHING LIKE THIS! # executable(['exe1', 'foo.c'], 'bar.c', 'foobar.c') ``` This code is currently accepted because argument flattening *currently* happens before the parameters are evaluated. "Support" for such constructs will likely be removed in future Meson releases! Argument flattening is supported by *most* but not *all* Meson functions and methods. As a general rule, it can be assumed that a function or method supports argument flattening if the exact list structure is irrelevant to a function. Whether a function supports argument flattening is documented in the [Reference Manual](Reference-manual.md). ## Method calls Objects can have methods, which are called with the dot operator. The exact methods it provides depends on the object. ```meson myobj = some_function() myobj.do_something('now') ``` ## If statements If statements work just like in other languages. ```meson var1 = 1 var2 = 2 if var1 == var2 # Evaluates to false something_broke() elif var3 == var2 something_else_broke() else everything_ok() endif opt = get_option('someoption') if opt != 'foo' do_something() endif ``` ## Logical operations Meson has the standard range of logical operations which can be used in `if` statements. ```meson if a and b # do something endif if c or d # do something endif if not e # do something endif if not (f or g) # do something endif ``` Logical operations work only on boolean values. ## Foreach statements To do an operation on all elements of an iterable, use the `foreach` command. > Note that Meson variables are immutable. Trying to assign a new value > to the iterated object inside a foreach loop will not affect foreach's > control flow. ### Foreach with an array Here's an example of how you could define two executables with corresponding tests using arrays and foreach. ```meson progs = [['prog1', ['prog1.c', 'foo.c']], ['prog2', ['prog2.c', 'bar.c']]] foreach p : progs exe = executable(p[0], p[1]) test(p[0], exe) endforeach ``` ### Foreach with a dictionary Here's an example of you could iterate a set of components that should be compiled in according to some configuration. This uses a [dictionary][dictionaries], which is available since 0.47.0. ```meson components = { 'foo': ['foo.c'], 'bar': ['bar.c'], 'baz': ['baz.c'], } # compute a configuration based on system dependencies, custom logic conf = configuration_data() conf.set('USE_FOO', 1) # Determine the sources to compile sources_to_compile = [] foreach name, sources : components if conf.get('USE_@0@'.format(name.to_upper()), 0) == 1 sources_to_compile += sources endif endforeach ``` ### Foreach `break` and `continue` Since 0.49.0 `break` and `continue` keywords can be used inside foreach loops. ```meson items = ['a', 'continue', 'b', 'break', 'c'] result = [] foreach i : items if i == 'continue' continue elif i == 'break' break endif result += i endforeach # result is ['a', 'b'] ``` ## Comments A comment starts with the `#` character and extends until the end of the line. ```meson some_function() # This is a comment some_other_function() ``` ## Ternary operator The ternary operator works just like in other languages. ```meson x = condition ? true_value : false_value ``` The only exception is that nested ternary operators are forbidden to improve legibility. If your branching needs are more complex than this you need to write an `if/else` construct. ## Includes Most source trees have multiple subdirectories to process. These can be handled by Meson's `subdir` command. It changes to the given subdirectory and executes the contents of `meson.build` in that subdirectory. All state (variables etc) are passed to and from the subdirectory. The effect is roughly the same as if the contents of the subdirectory's Meson file would have been written where the include command is. ```meson test_data_dir = 'data' subdir('tests') ``` ## User-defined functions and methods Meson does not currently support user-defined functions or methods. The addition of user-defined functions would make Meson Turing-complete which would make it harder to reason about and more difficult to integrate with tools like IDEs. More details about this are [in the FAQ](FAQ.md#why-is-meson-not-just-a-python-module-so-i-could-code-my-build-setup-in-python). If because of this limitation you find yourself copying and pasting code a lot you may be able to use a [`foreach` loop instead](#foreach-statements). ## Stability Promises Meson is very actively developed and continuously improved. There is a possibility that future enhancements to the Meson build system will require changes to the syntax. Such changes might be the addition of new reserved keywords, changing the meaning of existing keywords or additions around the basic building blocks like statements and fundamental types. It is planned to stabilize the syntax with the 1.0 release. ## Grammar This is the full Meson grammar, as it is used to parse Meson build definition files: ``` additive_expression: multiplicative_expression | (additive_expression additive_operator multiplicative_expression) additive_operator: "+" | "-" argument_list: positional_arguments ["," keyword_arguments] | keyword_arguments array_literal: "[" [expression_list] "]" assignment_statement: expression assignment_operator expression assignment_operator: "=" | "+=" binary_literal: "0b" BINARY_NUMBER BINARY_NUMBER: /[01]+/ boolean_literal: "true" | "false" build_definition: (NEWLINE | statement)* condition: expression conditional_expression: logical_or_expression | (logical_or_expression "?" expression ":" assignment_expression decimal_literal: DECIMAL_NUMBER DECIMAL_NUMBER: /[1-9][0-9]*/ dictionary_literal: "{" [key_value_list] "}" equality_expression: relational_expression | (equality_expression equality_operator relational_expression) equality_operator: "==" | "!=" expression: conditional_expression | logical_or_expression expression_list: expression ("," expression)* expression_statement: expression function_expression: id_expression "(" [argument_list] ")" hex_literal: "0x" HEX_NUMBER HEX_NUMBER: /[a-fA-F0-9]+/ id_expression: IDENTIFIER IDENTIFIER: /[a-zA-Z_][a-zA-Z_0-9]*/ identifier_list: id_expression ("," id_expression)* integer_literal: decimal_literal | octal_literal | hex_literal iteration_statement: "foreach" identifier_list ":" id_expression NEWLINE (statement | jump_statement)* "endforeach" jump_statement: ("break" | "continue") NEWLINE key_value_item: expression ":" expression key_value_list: key_value_item ("," key_value_item)* keyword_item: id_expression ":" expression keyword_arguments: keyword_item ("," keyword_item)* literal: integer_literal | string_literal | boolean_literal | array_literal | dictionary_literal logical_and_expression: equality_expression | (logical_and_expression "and" equality_expression) logical_or_expression: logical_and_expression | (logical_or_expression "or" logical_and_expression) method_expression: postfix_expression "." function_expression multiplicative_expression: unary_expression | (multiplicative_expression multiplicative_operator unary_expression) multiplicative_operator: "*" | "/" | "%" octal_literal: "0o" OCTAL_NUMBER OCTAL_NUMBER: /[0-7]+/ positional_arguments: expression ("," expression)* postfix_expression: primary_expression | subscript_expression | function_expression | method_expression primary_expression: literal | ("(" expression ")") | id_expression relational_expression: additive_expression | (relational_expression relational_operator additive_expression) relational_operator: ">" | "<" | ">=" | "<=" | "in" | ("not" "in") selection_statement: "if" condition NEWLINE (statement)* ("elif" condition NEWLINE (statement)*)* ["else" (statement)*] "endif" statement: (expression_statement | selection_statement | iteration_statement | assignment_statement) NEWLINE string_literal: ("'" STRING_SIMPLE_VALUE "'") | ("'''" STRING_MULTILINE_VALUE "'''") STRING_MULTILINE_VALUE: \.*?(''')\ STRING_SIMPLE_VALUE: \.*?(?ĥZ3.ݵ(ON#(Y`B#"奝?{:N}qVLPtZ)_zU_ +'S^nXӷM;3{N^76~zCݷ7eϔFq"Ьmcqw/RT GtyYˮ_zkf꾹w6B'z6~7O読ӨFWZ[ zF 3dgV*D䑳WNp;Z~0}[wE>*սއ[;5\a ܅ּ+wD]:ť~䶗XDtSJY?.. xUw5Z6֮U|0f'~itٳj6»EG,ZPR T"P$ݟw>jS MEК}ENS)Rz]1R0֯ 3_8iZ[Extj/bΜj$\a1Y9jW\}Wvϧ(ՒuŒPbp)-^?>p֫J(5ȆBzoeSdM?~C"ֶZ$F~/ KxE;yԧm\3|m/w"P?3;sVV3'w FVrGwߴƢ)M9f+0e) fkZWZq/LlݵVO&|~֣fѧofL^qiszfy@@.E2^8uִ˟O1Be~Y^}fo{nsZk{k+ԯ[}:tI|7V7SJUwwM8w3Btٲ/*)j1w Pp}\@"E$r\@"E$r\@"E$r\@"E$r\@"E$r\@"E$r\@"E$r\@"E$)~݄n|EQ*5{)V!F9np앋yK?QWM"\{>E5{cE/c({)%5f<,3+o5ߑ`91Zq=E׾U#?kPT`\i܄’9WmR~뻭[#Fz-uҟv*RPTUm dO ju!z!~E‰]Iӕr4e[Psb K΅4BǻIůn9{aaa7,Bחժz}Y-~ZSN}n޳]w!5ymm6 !P]ܴ*v~ԳuL~~j-<:oCqok0ztKt[;>ۘH0{OwV&G<s4fۺ^B!4՚5r;'h }vƚmpc\SY0)`wƞ Wsb K΅4ZOŘiDZ՘ir >TUa)zޞEI.ADGG)ή~hMN'=ֺ!\+5nꗴ? aN>zrm a)z^٭H"qyؗBCCu[In gTKfn9[9.2#ޞ}ݨ^vg\=4w_'8_Is:̎ZWK|rҐ+D.Nfyugڎ]}l}N=pH"D. H"D. H"D. H"D. H"D. H"D. H"D. H"qvpykNvskTwttn P,rB0W έ!dvnPG@"읋+F5 }@9<I;ps 65 Ikbkէ 6x1we91Zq=E׾U#?kPV~%6Kq |n鵼_IfۭnΣj=d.>!Ę `]| 'RUzYQDG';qiI.ADGG)ή_T} WI圽WB\Űf:qC%v:A:]gր|;.oRhhNsk?IA9s}뷝v(B͊;vr^92]*VIK2#ƽ-q5!#֬}ږSOh(ݯ/j{lH;+sؙ{E$r\@"E$r\@"{eqSm[5"Th&,sk0-zG@"E$rnTP2]έa'|5/ q FZN޹5( $-R3A1E<*D. H"D. H"D. H"?4'&ѹ5~v[I_mqn >@.݂HEMyXլË5W+).Y<<Şh8t؃=U 5qr>๕HF@9b\Fc>o d۱W@ DP~/߼&kZьmz !Tkܞx*v~TWmp"C>bMU=Yn0X'**JUUwzEDG'z޲ri>˹5Ї|$ S[}Gnixj=cњj5fgNniVj/i|'Amj{8/-rm o>nT@A~#g64dŊ/]K^?cWkA(\@"E$r\@"E$r\@"E$r\@"E$r\@"E$r\@"E$r\@"E$r\@"E$r\@rp.OoHځ[E8t4k_]?,X#>|ZErbΉъ)^(Csm_[o}ukHN3ۑP4Guo2Hxob?Xgz.,[sExӯn9{QQQ0^/xɥ>}ZwE!}(!ɹ!@ч82kEw[xfZim a^J=Ѭ]b_ t[}GEs:έ>gNn.ZvytޤM^`8MȈ5k_6@Ԥz8닚=gnA()\@"E$r\@"E$r\@"E$r\@"E$r\@"E$r\@"E$r\@"E$r\@"E$r\@"jE+ؔM,96vMz|b܀{&xnP84ֽ?cuCg㳍#pd.Zbfl[K!ZFnXESTUuXyjj?rBdo{ޓ+}oQQQe[OђipskCL%>yxPLʤM,d\<1h?L3Mn0^/Uч|AЄB!}ȧjQ]~L/y>nh#*r S)J?]>olWE/xdJ}nHI߫YU7EQ>7g|fWz?vQO[95'3yL{lGĘJ?-oۘq[39BEE!p^-w]z%;+Ʌ.mKpj.qӻug*쿦 3= qwX%Rn!eϽ 6k}^[o p 06x־ 1dǝv&?7<,D1]۹>:>>>\ܩC&i̓wg;*Dz\QC.>R̡%"3 *)jgočKb<ܽiKʶWrQ/GU0Z>Z>]ğ5*Vݰ%2Ua:>ic?ܨv6$jkqvⷯ_"F`};ŮudȎu4hwqmjY^{aO6(w<] A^￷m>ͱůzr)Ozj 0dxPLWK ރoڵkӠEQ<[ҎW#S؈/]7ެV׆vj\ֿQ߹?-9v&.5 me!y>uZesc8Á !?=TTW?\1ۦT޶b^xУ[[UEs;Ny}Ο 9 ?OhSȞmbZdKWUc'm<@1'I_=6pi=cwE5\ޫ9[_uMkj8:-މ$洽6l[شޝ#/[нrհO䨪j'٪jIZXmYnꆚG7<4YUUU=fOSuuՌUO[ փcYvRrq_1U f5/vq<5-j^aCi#闁=>7kŖbUUU5jjQ\FfxoIǦ5hEUUpz>֧ouRmL\c"GB=ޣ_nL4aYj-x"/ә-<LKKv0j=Ҹwooykш;*^-']ul#}{k_xyyzy!=_港'G goxV):.( 7[ܢ'=4;`mn!4u[Co ,6n]ɫRpC[&q;"T]mc[@pF5jXvU (BM* mY~/U{̙3gĞ;챌 E 2'fB`mi ( rT\5{i.4>\SkkjK-Glʄ˿k|\Wm`PoU_W>C>iy ZǮRǬw[z:p⏥ƘCϷXSjٽRw%/yǧSW]1BhEtu}K XSlA\TmA1ǭ;ԭ/0 ,Z{"=Gy6WoLС Oagl:aZ.~C4qܨjju&UKeB &U=|5܅ݓfQUU5%X}!{>+ݢ^j8nG~EUUUKW6 pBZdtߪㇴ ΐ[D=[խC96z]%X׮/dnPx}EtC)57uͫߞ^-]]lzÓvP&_ȷ[vKpxjMc={G ̃FJ4_6䍣B݅jiW l=(eߙx{3o=pQrENIqv)"T=[^nZ!<*NjH"D. H"D. H"D. H"D. H"D. Hiz1rIENDB`muon-v0.4.0/subprojects/meson-docs/docs/markdown/images/win_installvs.png0000644000175000017500000056327014737503617025724 0ustar buildbuildPNG  IHDR )zTXtRaw profile type exifxڭi$)s9r@Adn0ǟUUKTTGzpKt^G#N|}z_F^|߯a]F}`F׃F}h|( gZ~:ׯ?o";7V I1gqiT_#aAn/rFwDeF.(~>xŬ?^P~[_~o@\{{gv3W~M{;>MrzU ߷5݄F,py;l㉍wL~Zq+j!e}[R'Z&ލ?s{[1p3E=:7w%b֊qE%P7" ~Qy k"-sgӯ-V _q$:c9yΓ'sŕV^eV_cMˮӢ%'Zn T:SO;3/vͷzw#j}?j;jEJl?ƥ}"NbFbD)$tT|9G)f~DDFY 'rÏoqs9#9"׸MLl}r/B*C-OQw 5ăNK@YnۮgOOd=Y8h0b |n}Df'`]V(z5VDʾ7ϮYLg84UZ eV,К rb0vcŹ-pwpőwkn,Ofd; k f)iJ:^ 5w n$9=,v2Þnܹs\vڞ˘"V݅6ؘ5˶[Xz\9\iLc$Ө2Ż.Vy&:ܱb85}w8.Och-J9rkeҸax2y5OssN &9oXuV*TR2ze H@Z")֦ ¸?PJżRmQ''=3PgxZݫkP1L;QҪjPsIPƭQ12S~[|JEt[$@\a D̝ CwO)9APKQ.,X'pINڬ Vnf\,xwKH!3I7 ha* HIeca.J>;D&c.ŽWyjۇuɐ{O@p>gQlr3HODeF=ևu*f2pr~f Hevΐ+޽o6}}Xj@8ˁH= lr_UG4ϭ)1*FU*KӆMxi<0FUF>?/@;t.eΤ~9ʍȋfڢB'&~&_r2L({~~p{8 ,kY'6y2어8<\Hp&HKVIHOIJ5(ltŇ#yILa ?:>n`6{a?z*.+)3Q1. ` @gr!rwf="+s t‰2אG+cdܒ@\IJ+(X F N$wJN.C0sJ L1n %kv`JpS#v1F>Mpg(P(-#5EnTPCȍ#w+ (dD4EVa?,j`vYc pT/ ;`6gsM0m.(qmJt)\$; ZQFāb,C܄kVB6P+(u CXZu'ȡYL[&XBuy!K Z|oTLqEmgb@̢Jz%YDC("Gr\j 5[%Z*P Ozm[#*$l`裂DyEِ'Nm#q:*u0[L%\ hi1/;*Qia@0JDBXǿt̀)pF|e.ȗrhF>lKܑo=N^bxP p/`QBS^>Ɏ9.H'ʁ= :R3v@pt#a<@40zQ:bBgP_P@RD$pH. Kw =Պsf!d9y񓽬E""-օAtRKZYG%" YYz Rv[2hp5k͋Mdm As^10&41}&봎 OD::l`㩛 / 7}D`.%":) /%N8_p`2_Àax5χraErT4sm,Pzt$ Z)؅?+#D(*/mj)IM !ԣ"9K\hLbX̙e`ވ0n8ޅQEσ3mcx3s= #/C(|ܵOH;04JmGe N))X8a!b^ P[0mIE!Vu\8\^@[4Cǰ1PRdD^!cF1&_&P+/(F4ÅʅsoŃ&b6!z1 zꇐcꕠu w0IcR\ǥD@REtmm^ovt jI{9ŸˠͰ)PPg5vgA)|.aztu NdjtIPsdfχKQ j xR"Nb +Lq;L6U@*ΧĨ\E=~bxɸY!Tٷo+@{8ŮSʝdC6>缓eBq:7;7c.6 y n 'f3!b6Q" &FK VQŤN:;jS5F#ZhQvQw"ǚ ̵kr!ZWU'Bhd0|3ˇ#P`z@ q2uha>pIKЕ&Gj ?"Ȅ0%Գ"m_t?Ya2R _5}=#HXb$<?:m`'0p:Bߪђr|je X;Lhp,)X$s=ϡ7&zvuEa0(N @̦_ ]#sE@0 ST| D8-%N׍][M-f*cL:[j )AE`PRO` ԦzM˺/^`SPB$꺲t+J-KiZL%T@Ù{ځ"0fH:ի533V%QФS1XhN1ǁjÔ5qnӄX<`QP)2 +[zV%Ӫ EZ1࿿F udReۥCQ 'GwhF׳Fj <%[þ?#u9p纠(tMM_4.'aԌv~J= TT8HF5:U\騯G;fܩb1̗#5ȜE"$rl`.V6/bƨ^y31jebS/CE8s >Iܒ8\:b GF Ayl1ٖ PiS3E |Q uUW{[ȋ~ 659PDB0a`%/!ku&(v#tL{p&dK`kk`,: v-qsx.,e=2ǽb}z@6hGlZ ,cQFCϡ%E_G/fsUuCi%!+9 _McFy?E *c/?q\%_(O)'ggA1b*@YF%5jWԈTxC<|s32* Q>ڂFjҗa\,K-0G; A. ,&foo]UA7Գ}ZYTJ$4 Q'h#*La myPȺf&ր(HH[ۍ$0?T Ȗ)J" >OeDL~2WmAR($nPk1'\9R0qT?%Rc\bδyCH_jڴTr8e@ ) tٳ^q^lEiWy|V#S;*YCVA׿BKI PѭD+7HsEڱo91*xXMJXqe.rj!IW`o]~ zu;\'׽, Bʵ7I@piN!Ɓu+I3?yӵ9q< k/l_7LX*Z gӻr8镅P4/J&2dg= ȏK82=;m+8XԲס(:(Hc 8uC=Xrza2 =}u8ck  ݆CNՙɶDLڿ$t ="#1XHV:Yh5ϥu % p⥜NqAO Y֠:mh+tP}"2i~nd ɵZP yVfz$p-=EsC= ΞMi !cΪjuHx@V8U j:/Ӥ^~dq-ηAW?C*+ee:kɰ_G(I+y[qiRKh:fz8 &`8]GTȔj_ - &E}:Я0Ph=JZÍOJ ?[W?K y,>wt~iCCPICC profilex}=H@_[*-qP;Yq*BZu0 4$).kŪ "%/)=Ff8jN&lnU"ACL}NS_.γ9JdO eaoOoZ:}+I 9A$~~12yP`YPQ?yZ= Cyme4G" BʨBViOxH.\e0r, ݚ 7)_lcͺmv<WZ_m3Z.ۚ\COdH/30p qd ppĊ=Uir2xiTXtXML:com.adobe.xmp Screenshot ibKGDC pHYs%%IR$tIME  8e IDATxw\Wv9*d$f1bPljxЏ?'Ϭ={,ɒEb"%1gI$"B,r߃^([bwo-.UuO>}HwںM T*@ @DEQ4@ @ :@ @ ^Ј&@ K*b||JG)y&''~, @z*R((E ?+e*O-gYr>2?k'+y?B!zT*E"bjY(]]][B,cnnj5X,R@xS$IX,͛71LOOSYY֭[ \xl6K}}=Z6"~`0ŋ&˱m6ewW$I"Ns-f3N3gt:po>f3`ٰX,ڵ-4Ka2p:S__Bټy3/^$ Yr%466RVV ccc477sI466qoTv;~|>OOOd2L& aFիWU˗DvMMM~.^H?j֭[q\.zGGz-[`X$I񟜜̙3΢Vgݺus}"d`0H:fbbJvŃvh4JEE| <v"NsmyF#7onjpf9V+/### sn4 Z͛7d8z{{" {nΝ;(Dr9-[hdnnwID vseEQ)++cnnJzd( h'N+ jb(]XL@ 8  RB w,ϓfٲe *s ͛7c0f$ $Ib͚5d2ZZZp\2<MPP((ֈN?j\zl6Z|>4 ljd2ɽ{pݼKr9\ \V /.]bhZ.^Ԕ{g9s wfƍ={1LfAr$f3<' -[0;;˵kHRLOOx<.-[NF#N>N'* ^Xrj5*jdRD"%&-yXPՊKN+300i*b픖*իp,m룿B@uu5FQ@ Bx1L?y&o&W[)X$)'bQ nˊrV$I9<333JÄ3IYYfC.#b0p\   ^łJN@ TUUaٔ]{yz.U]]j%y^/6xg``wyI˿K*++ill__QT477/PB4O},uJB(1 {۷onݺ\[[l߾(O+FekNcvvvXz5Z/ѸmFSRRBGGV L&;/I>]v1<<իW' R)rtttB*kI%Hj5 x<.]B'IZ-$H$]9we!\~VV|>###TWWr\xdzP(LLL055TݻD"\.>Jͷ(EQpVKEEz|>S$p8j\~ WY}}}T*(^ǩ#b4Pܶ@ ɟٟ)͗}>A6]p !>9NARa0g6P(D{{;d{ PZM0drr!L&p(Ȃ[PfaZh4jd2JlP(DR]]we7* hjj60k֬!`2V+**$ R)|ukWWH+VP[[b! d(//GVO*bn⏗J\QB<f:;;qA{I`iz{{ BTTTP^^#X~W(KVP(xtlEorne|>O0 ɄVUf3z^9lvvD">Ux)cbbժStuuRXn݂2 6M91<֭S|Ljtp: 055ի"ϣhF߿$OVp8a``bȦMjy@ i K] IyػC]lj <rdyY9|I_'Y|+redB"ʕ+~ZZZѝqX|6W"w܋v6?}ֆK7mgo槵X@=?Hz'e~-~muXj Os~x(ݻ,,Uu\~Vi.Ĕ<-^jl @ |<13XrTK gϞerr\.GEE OM_`)mq]*7}Ma=L\Wߦx>{~q,56~(uxxToߦk*w|=lҖO{}m7a^[.U?͹!@XēX@5l7_[iS,.@DhzOX]0B A0@ M@ M)F@ ߗB@ ߟ"@ ߛ"@ C @ |o @ @ |o @@ ߛ8K @ | @ @ |o C@ '> $!I@XX,RGMjj&iw$ O1[ZZ`xf;Xqn~?*DaN'6qh4K>dEQ B!N'NU,czzߏl~tcSUE"|X,?tQF#'Z3 ccch4~C'yǩ|jo]@ x)Lrun߾M: r}Ν;bB0W^errRL|>ϗ_~111\.ǥKxw{tmtO-Nj֭[d[H%7n p>3CF>|gϒf(/ݻwOzfP(3gΐH$8'Ns5;F,{5,pyS_C|VHR6oތV]2L&}]cX,299ɹsx&peN<)h`tt>'.w"˴frQ8b( t:376 ]d$ NT*EPPƆnKL ) F,0LYAbh)e׼/rUUU8pZzzz?P__O>YY ###:t( dwrtg\.]]]sܹK/_|AEE:|gܼyIyy9|0dl6K;/R.]˗+:u1?O3g022Nc͚5ٳ͉'tk׮98F… /gG֮]K< YrvyB7k. 1477s]fgg9p;wDR)cqxx /իСC455111ijjG?HQzzzسgի$I/_ΏcN33.+%8qXj VÇKCCw!/}vT*|'LOOl2Eq?3:;;|2o`}6nȆ x'Od``ZΝ;پ};zwrhhhP~Nkk+gΜall ˾}hnn^0'I>#FGGijjam޽{qvU)++S{.'O*1T͗I=J$_X,r QT+lڴ{1xKo[zzzX|9mmmDQ^z%lBXŋ\xX,FMM ۶m?W, E zzz$={<Ԫ IHs50`W_}F;Õ+Wcxx={p9D$ܹӧ BhZZZZطofO?{.+رcAb2 :u>j5+V`޽L&sNbjj O~8un"(uQ|ܹsp8LGG{ѣkFt׮]#t:ٵk6l LRp\ܸqoʕ+ɓܻw}m۶g:6R ) Rxd2f… 8pReY# lر>̕+Wp\\xϳk.***q333`D8N\.mmmlڴ JŽ{(--rDH$qΞ=˵kػw/~+W)Ǖt:4\N1|饗f?~'NPZZulkkwU^څBʃ裏^`||> Ix饗H&sϱw^ ٳs>S/_N6% Ν;Yl'Nȑ#~裏xؿ?CCC>}N͛I$ܿ˗~N>Ncc#\Ç ٺu+8,CCCt:oߎĉֲ~z^}U|MuuX,Fgg"vvvrI~?8N^{5RǎO?{Gss3'p8P|7tr!8x ZLpN:ʼn'!N'i&x<vIOOMMM߿G([ιsM -oB믿N<O>>__fzz 6ct:hT̾}ĉt:vޭ'`}qyeWUU-i,SRR[oE4O?%w_իWs vb7 >}ر.^{56oތZ^N>}˗/{nʸuGQ6fffW_W^Ü9s.\@[[F$)* OXVc|| -[F0D08NFFFxƍ{zի| 5;;r9 ^:t6T* T*'L222,LMMǙ㭷RskM.cddr-[q?hGj4i&"mmmiooWɄn ^$aXX|9|r2 ۷o_PH$Bgg'---޽ٌdb@~yt: B!8hD"]t:Mkk+^^{uʕ+h4^~eʈLLLɶmې$R6l@yy9vZV\IP9Z-jZiK>`pp[nzyz188HGG=lٲR,}p!޽h$211ccc8NL&[lan޼ l6TTT(֦aYl3}Z$I8N<###LLLǙR\۷oH$xwU7|e˖)>8h4L&&3>>2z-V\}}}R)Z[[pF' 155EUUՂ1sN^/@z{{iiiLY+H$LOO+cW_+natib|>` 366ƚ5kP\5W `˖-x<2 oI$ (uuu455aQTl6~?t:mddDY0%%%K `2(--P(ܜ<)w:rx)))!H066Y~=$Q^^ζm(//'D,u}/2UUUd2r CCCRVVƏ~#n24@AI$LNNjr*++6,k.L&^.p8h4V\͛ݭ˦R)Yv-@g$t:qw%SZZ㡼6"eeefffj5$a2mYX0LT*ŗ8(q&ew$-yh4X, cccܾ}p8LMM ^V=* łZV|4VZ$I\teռkgNГS(>rFvf]x<@~fypb0yZ(bϳ%NDV5GV+Z(Ffjkklzg6kH6SNzxzŪUXf +V|k GD\.G0l޼W>3GAÑHD3==͝;wpl޼s/?EcsssLLLG6UvelFs5jkk6V+t"9>::JII &iv~K%(*w 2<9$?яX,n]F4errT*Jj~ӃVell @&Ν;ܹsJ?@L,u!$|u|yw{i 9{,&e˖JV/,pjhhҥK|֦bIӜ:u MOOϷٴi?MMMH͛YjI$Z@ O{{;)V+jl61Ѩ,\.KEd2JlZ0?Smj*Z[[ywXb"DرzOOOs1f3TVVsK"̙3J͛1؈$IlڴIqQwyO>sM8|IZZZ00yz{{9{,6pF˹p555F_N:fjjJ9yaXvD">}Ȉb2x<9st:MssrNctvv;P[[P,6jVZEww7}w!L255K/DEE7n_444hXf 61N:`  z픔p1ʺaپ};韔 @ @ss󂍧ŤR)]*1D@ xj7,*jZ9oڵͫzKss3MMMJeeoZyٸqrfQz455)~%%%ANS(//g444`)//Grhii!@YY@ӉFaٲe^@ @0`0(JMMM޽gS=PXVS*++)))VeڵRWWVĊ jrJE󬪪M6Ar).\ J$I{*3TUU AaZ)PWW罹F>^xťQ[[zh4R,q8דNz*Sv w B>={P]]9)Njůp1+7;lnluuJ(d ;UU*mՊ`XBqmy稫# RRRV@ ̺\.|JzӪ6n܈ٌ`ƍSUUhZ\.ب8Z"eY֯_+cNCC^wA;gY0 ر|>O}}={χC$jkkYz5JcX(R[[ltRSSCII G:l6b: 6ugbcDG\TՔSUU`.ˮG2|>l6+VЀ^W6>jjjra4 *)) <$Q__ϪUՊd2v J|Uyy9ch4HDII @@ίRAvjjjp:r9|>wfʕzN' X(++n7Ze˖|r @Jyy9fE0jRSSCEE~*yժUJ#o1I&m6P@8]lj <B@C[ny=#]KB@EEoOX,2::??P^^oȧKq%`ZI@ xVxS?fWpXqɑ$[n1;;+D"\pAq qsssOнT@ @`2Xr~߹Nqݼ⋬X;ɧU閔+|%t#@ ߌp!]<]<ާ? |\|+ +K@ Y@ EU:0X<;wO$(zZo~j狟)Y2}C!IOww7W^/}ҹT,O?Vܶn7[lA?yvbGR@T*TTT<ԭT -j!ZN $< N,T NG6U|&ifI$d2T*& NG$abb &''jXVT*L6EV+i>rJ$')I%CRL&tJ^Bt:M2P(R0  JdHt:ru:7TTR)U$JGf6h4r9fgg Bh4lX,RRvN<7L&jk, JBFl' 3@ | MMMLLLN2d۶m߿A,ڵk\|)T*{eÆ 9r?qfgginn7Dre\B8F$n޽{lKeОdhmmɓf?1ng"g?`0p!֮]ƍKə3gKI5 +Wd޽TTTP,䷿-VbddS(ؽ{7vzh@{2ۜC2 :N Ξ=ˑ#G ۋ$Il۶7nSQQ5kwfŊ77Ǐ~#v;|v/"dFqzzzzjYpyL;`%bIHhPl-ؕN$TR.72W*I\vEvٱ-$M" `̾v R$%Ѳ=U oW_`0pY;林L&C88u+vDv,S@MC fȲݻٻw/fn޼4۷o'( TUUa4 OQQ^* PUyQ IDATn^&&&صkצXkalp` BzkI$,//ܬhi3ZEQX^^fpp_˅$I樨 n:-&&&z{aٹs'o6?ٳg;v 77W("G@ Y0K,˺]\\=_΅ O~i7m/L駟r ~?[l`0܎]?)V*yiBfl|M[k{Y6*TߪRRR.]~AA&>4ÿ* 5o̞={())ҥK|G\t|;lݺU dDdb@A0 }I'~/BNNN8h4JWW8x]ǤA{zzX,|{ߣd2I `nnn8ɤq<\B vVE4ұ5^шlfrrD"dBUU0kX,_g}$ It$J K/c ]]]w];b2O~)//) t@ L&axx~?lH$ҭ&EnܸA8j4wU Z:a(s2b1z{{IR~Bzcc#.]7ߤ"| TTT ܠnwy\XBe*++|;a~?dUuw-FWW7n 77t:M*bddK(DvX7o"I^Ep,Q@@ f3v]@eYpzd0'N bX(//gZy7ijj_7xSWWGMM V$IYhEF#&{1~_villY$I`0PZZݻy>?ш$I|'N UUq8رzQUU_ r޽qΟ?ϹsS__f/s ~8nܹ~򓟰o><ȁ㏹r STT.E _,( ccc\pCkk+wJbTʅ+EQY](k2qo_sJӸ\.F#TX,NVp8`tN äi=zҢ( HX,lv*HD" Z>өcXld2(& ͆(DQbާ` Jv1(B<'#2+JZ(b1=JSTUpf B4Ld2zZ!CB{6%Ff³VRjN'TH$B&jbXb[6nӉh$NFL&(hTUY;oU@zZ@𧬀Bh@ * "] @ <2K @ V=5cۉD"R)rss1L'@ +j|N$B!L&a6[ ?vJJJ0 ("pR,Vt0b1|>wfgaaR$l6@ 6N|2V렪* ܸq;v0<<G| @"$###d2$IN@YYCCCTUU+@ ߛ"qS}-$a0mGU'JfMuu5$@__###RXXȵkݻx< ,OYYsNf3.]"Ͳg<W\aaaP(366IKfxxgRPPaeee@O^^fY8\.^/|X,ڐe+W Qp8LUUܼyYbKKKE M0h4E,xuul6ǔF,gϞg~~@~~>LP((@ +8o0tkFeHQu~&a``D"imm\zǃjc>&r8===Jaa]cZ.fufk drQ\\'@EfIR ^u&''I~_033'Odyy F[o199X,G}pU^dY.^D8~8W^%ùs)\hJc,ĉttt?& x"K y4Zl4 QYYIYYq lV///'[:]va4D"Arrrx< `Zl6[(&''bD"ey80pǃ$I,//r6fe0>8pNSaZun<233$@EQ|ިv;EEERXXdBUuٹf3m7n݊d"( VUdV>]F__?8w&̔$Jf3TUU*8<ݎhVl6#Itl6? S.yhw`0ȵkصk79}4^WOk2Lux0Lw<5y+ͮ($ ,DBOd4ill$H 2ccc<3b6d2R;NkD  bW177VݻwSYYj?׮]CejjjfcǎHDAA͛,,,PTT+$吝N>", 7n JQWWGee0L477@e***زeZUPP[Tn7Jmm-LJ=6D۷.>^/{e^$---d2t:|nvIGG~)Vukz1A\.ܺu EQYYXXd24@ hwyӧO!\ rssaxxfÍ7x"/KKK?~17A$… |_s1::K/h䣏>D"Ǒ#G)k1LXV&''inn0o! o~~ yꩧ?e޽.]r]F"{Rz{{y |IH ʬNzJ FQjw\<^^^&bc4QU F#^xAרX ɤp!V+,Aj֌v}MAQuFV |IdYF$lBqq1 |3Ȳ̖-[(--h4].O>&.B&'')**b۶m4660z ~qq_@ < Z#Ouu5 xQU^{EN<餵x)..9$I{gdYkS8Gvcɹ#rm9z( pҥuN$s-ضm}]VWWu$Lr-ٷoEQ:= HII ׯ_gjjVVVdYdY3 aوǙW^`0֭[9ikaXpXVrrre[nQSSÎ;M_zOCC.|6+ _css;Ǻ xw{_^ xf=&sxF.Rvp{.L&p:tuuoK/ -=J. ug6{i~sss9x xa"`h5@cX'͒d@|-;ZEMRdY=&jቱ6E Ņh}j0f0l6NGRSSN0l6v;>={lzZ9miY@:nL&fA?k$'"~QUYE/MwV+|ᇘuZ[d eee\~x<'NsEjjjd2fa~~{D7*ssstttrH$SPPfd2ǹy&555x^zzz8x^~?ϟd2177̌nДN}}=/^$77Dgg'۷o_a6رc|lݺ笠O>mј駟f{kmLLLr(--eqqá_I6JJJl6~?eee={EQX\\djj;i vp8._Lss3999͉l/7σ$Y@ ~?$dYb1}M)EQߘ?MJ+Ļk.l6 HTUUD8s cl֭[$ ϧ~=Y PUUjkklN6H$ؘ^+ 266'??jzҗb)--p8bkL&^$---ǔeϧg&77Z***\rH$B{{;---L&qTUUa6"ܼyIuu5v]WVv;I4e֭QTTD `tt"rss)++UV+555\.,###sN\.Ԥa~ %vf73Օ#?z{!`ixy,XS5Ԇ\ IDATz +#:pS;w䩧"JoٳѸ.jmz'ZQP(S@:O?ezzW^yE"zpfjcECƭic_Zi,pX/.nqZ+\o{6e|MnʡC0w~k篽'2d|ߠD"A$ыnv=Eaffz |>G?.299,ݡ*B  QVVn./3}4WOs lsҺ"q@ xh²l^J*Dh4]'IDNNX,JJJ܌d͛\~Iؽ{7q:::pp!]0,W\!??EQ8qsssȲO?fqf3---דdx"&t:Ą3N^]]ʕ+z L&룫 @KK [lx<Z[[IR\xIss3@+WDeΝ)T`.0رF$ϟrL&ݻwftd2I `۶mv]hNu===R)ZZZhll$ r^/@x<޽{ԩS|_gee>jkk Bttt~ǎ#//>#L&>O_p8|;v`yy_dYJJJOQ`69v& \2fee{vse$Icdd7c8y$VI8q[lMuu5PUUh֧N*++QwyVJJJnSYYIOOرjhll( t:9}4'xBW R333mT0pd2I0v5dh4J(" `f}a1=/?,XDyVDF䰼L(tbpfa EaaᦾXp8LNNgj6jtV+.]+++\/OV dYb_ ѣG1 曼_}_h֑HK.a6l6.]ؘnZp8̷-*++u`0P[[}}}+455 onܸA^^uuu߿%ػw/fUU Bk.~iBcccF8R) I&ܼySJ377FO__رӉ,w^} p!C"g?ׯ_!2uuuOG111`ҥK߿#G`6v$Iٵk=J+|i*B4|ϔ}ӉlFQF#Xl] D*"Jr0L籺 YzP^^NNNׯ_'Q^^%233ٳgf'IEtb41Ll6R 2L&Ae*d2zXVvA2 haTUl6[,n1X,du12"77W_]v1<<̍7Z;䓍-,d2aZG12::ng4ٷo͜;w̞={p\f$Ibǎlݺk׮1??O wx<=J6_' //oHk LA8ȑ#.=.\__OAA?O AKK [k XVV+X,X\\ H*bpp)$466bXtpzEhjjl6SUUE<ѣx<(~M}}=~!>Gr(//'| >xNrrrBֆf#^YYavv]1Aʖ-[B<)((  պ">O_+Jyy9ǎ-[yp$u $I$ NaXؾ};۷E,<]qX,|>:XSȼ^/D\eZF]dR Uʰ{l棸V.p^"?яD"~xm6z<xح[Cd2i}wEeV+FQ=X_XXs*gϞell ۉD":uevڥ H^-룏>֭[x<rssOz ͙3g XvuL,ҥKtvvp8X,իWv.322AFGGimmeddk׮a2hooVU%.\@__nCQTT SVV'|B2300@&駟A>cRxi ~C;x ]]]9s)^/;v~@y <=lZl`0`2dll Iyy9/zpɓ'y70LQ\\4gΜ!SUUESSdCyy9۷o7O?g7or }Y{9N>͏~#=}(d"L())a߾}.v?믿Nuu5EEE8Nl6wfii7|JUUv]SScS뙙̙3HDQQh4r#GpY~#2޽[ߤd2ب{8,n 4 baϞ=pqdYÇ#˲~ SOke4)++nS\\Lnn.EEEvlقj%JHII Zg4پ};$m"IUUUނD{m6! n]f,K(k,aklZw`Pנ ȲkP2رI:;;)1t'OGKK _})yFGG9qO?4B!^x=ge``UUy'8v+++8pgى(>}|2 gΜ!CYY=Nb``:jjjhkkJ` o~t:} v~⋺pR^y(p8p\vJJJn7L}{N__455{^]`M$ȲfR8pYq:8;')--%Lbtp/DPUݎF$JKK;F#^Ix<<3۷L&j񠪪>'Jss3[l!¿ng~~^}0 EW^ݗ{nN'.^zIclnEǡ|L&`Z;RoVka6X,T*f֭d2=^@;¶mۨ]uԮ`f]-__ɻz %jx%U,6 -}<#N2f G N!n\z_Ǐ?^űcx<h<38Nv>kI$LLLLCC2;;K(ڵkD"BnݺE?Ckʷ-***XYYN_N4E$***yG"FFFػw/MMMx<n޼2f&q\H$0Lz}7crrR줰pݍjRWWG}}=,//SWW&//@ >Y+onn=zwx*;68F=E+&{5lA)_Y;'-3XkX, ֹKn-,֜\MמŐ|9ژ׮ff6k'I=um:kl<泞/K )^q MEdh0dUQQmuH݇nCjZKRc@YY WnݗfQDn7XPy(&|ZZZ8|0dݎfǏ{uVrrr ؈,F$$aZTwCZd2D",,,70KjZFA={$I\.ַl69wEEElٲyԋx\̪sssa]ɲdYVVVzv٬ljHnb{N%҂Ԁڍ1Leo/|lz3AS^((('`vvVl۶ AYYGҥK|ǴSZZ'|cϞ=9sNV+_%r D"8p@]0r ~STT_ݻwy'z peZ[[eΝLLL|>Z[[)((nx8x >dbϞ=~TUeppgB!q1͘L&$I6 f,oxQюUAyy9ϟm6q|.!@{X,uξ}r8t萸?gnwZ_[~_(b1FFF]pHss:sƵ+2m۩y  -{ߜc*Ou,/x뭷;̲f BN|(҃ʹ,lC(>M&l6=ޑq)LL:֕ nGfxbB!F#>UUbzl6%l6B"f?PϢf D"}\ZXjI&j|hC^VKjkY)ɤ@ޮ+cF`0 k\.pEQpb1VVVPU˥a̾mh4m"|B!)--ʰQՈnL&#.]#'O R+ЦCd(ˏ( 6&uպpڈ, F~~>wq-5?l|m׺sl?ؾrQVV+Ƚ|t78GY7=nm\T*$I8JKK׍k_Zumkr7]@ |uԬx@hU/ DcG}U0466R]]-v\x㗗=)> -qJ4CSSSN)5 ȗC( zCSpΎ;REV+`ݢ8@ H$dyy۪233ùs[Ab?^OY,..r5bHW/5 dijI6aجo@6M"U!2R 7d>:fL&C"@QF~ֆ1͒f1Lz)\xUUI&i=1,dY@ + _#Sݞj;^79@$OFQ&&&(++n7oVD .P]]֭[gpp68ǎczzr=1L(?ѣGfttw}X,FNNuGWM(6F TJ/6}}} ei&''X,2;;"DQ,3.Js}kMQ,dvv/[[[ fz\W7P(uӉƳvjIH$_s]X,T&! uR 0ub(2dlۉ믿N0#add2R*<{j JPYHϜ?/'rQn߾M"a7\.6=&ma&.|5M#1;;KP`ff4GeyyX,! /bG677QΞ={`=MdSl6(6 M( y1{^V+|t:M> F2 [MTrtZ߼̅KRr94MlfTז)"Y 4qQ\C>޽{B!0ǃb:pxJҞk1ǛerVb(v8NbxJxF].x>gbt:e:him'*( 244D0&+zekkKX>z{{ H$p8DQ uuubNHܺuQ 8^"<<,X =soj;#>@*zbR+B2䣏>_jЀ &_躎Sb#HDž%LR]]fQUUC (gNw!HL&9t@|>ϕ+W"J:D7|>s>s4M/_fddEQ8qꫯH__fff`0ȅ Ps=i TTTp].^H&![oQ*z*d6loocXhnn}_R({<ϟ\3ƻ,XLOOsMR9r[n qGGǞgfkk˗/388H$7dss_dY"?Op8{Y?r7oڵkqz-n7|XVΜ9󹼼իW{.^wyGO.D|M#HNy7 ;;;,//cZyw:/_>#n߾M07dee+WٳgB ȑ#|g|(BWWϟgff>B@"୷ޢ?7oRYYOS͛G?P(pUzzzX^^… x<O(ǎnoo_`~[HBӈ"nRDSS?x"ktͯ~+hhh`0yk:Dww7~H$/l>}ӧOs9{=_Ncc#Gi%g]yʉ'^.lllp%:;;|@kx@I&Ad2a61'Iя~DKK }[[[{75ϓr9dbb\.G0bᅬ|>"󌏏duX,X__5YXXĉ"r9<ܽ{*;^/388//)\rU2 KKK:+++XVVVV^buq"---0o6uuu qu:;;?\v ~3\B2իWYXX@u"?F,0bM033C&!gglnnۋgzzo-p˗/quV+euuAyjkkb``я~o2sss˜9s΍74"0 |>/B F9z(cqqYެ$JQ]]sS,BS(/%H055 _+Ο?O8ȑ#=_6K.0 ſ,,,p=H$ꫜ:uJ!Rh.ll6?^ |onnri~'0==9v'O{I?p)r8j\.UUU S(! 7fr]ŋرc{ ccc Y\\$bXhii! +HJ1TjO[[[[b1|>V]׉bTUUx`~~^\G]]VU9sq.\ɓ'u63bYU ZjkkE ofaap8L2$͢( A~dp\555̈%htE"VMnܸA>'133# 1BiMMMDQ\.N8o8wߡ餧~~_ /iliirHRd2Z[[x<԰$gy)Q.,YZQ\Eyh"=v$ɳ(|1Zۿ[kn߻pwAQJgϞ?(3Y__j 455 f|ý{eppPl'@ |>8.]I6%+FQUMyf9ѪJ$᷿- ~*++Oqx^r܁d.nq\܌nΝ;x^"[[[477ǹx"XÇsE(@0hkk#166FGGnA#<`*w 155EsŝWsss´?99/)}>LMM{nunq*++|X,il6ہRSS(ܸq4MET*#NcZ Byq8{b@ 0ֲ"ejjzŵe2ܽ{`0&vR[[K VRf^O*"NzܸqP(ngyy=XMhhh@Qn߾ 8N#˱Z|qTTT'(mRvfDA+I$LNNrq, 6 ,]OdEMM dw}EQ">[V9"7C$?)Gŋ\pa Bh&%]yE.\.sssq\TWW w}vo)\~g}Fmm-. VVVn7? ש7Duax<8   B餦K.Q,D"~b4551??O>ZP(D:ի6*B0?~k׸~:PӧO la, BTUU|'~!H$3?ph:;;;v5]]]OQޞΣ07_tf,*4Φ~bf1o[-J"b MӄUEgha,,,0==͑#G; slʯBey{aˌ0\~  iiiϰLS)b>ρ&`i^("h.ojk5?3U} t>GbD]_W;vz>e^yN^ST'Y0rX,=ρaTsl^'3gy8.3͛r9Ν;eiL&I$HsWX QX^KH$8Lml&U,o& 0]/)}憺/믹Q*lV/|t:iI˿_~ڇ_kZa~x/}P{aϪl8=䗧*.ԧ)<W svP;UV>.f7n  I$D"vռAE!  `|@\Ə/3k9܏ hV65J&~(_\fjg6PAof*tپB!Hl.*Td2b5#@ css_|H$yX,2;;K<ߓ!<kkkט\.hƑ#Gp\ H$ltvvRQQd2|Mee%{g &''X,277ǽ{PU6X[[cppRDKK3]י`yyY|>ZZZH$R,btttP(>|-\."Ь5::*jUWW3:::p.l6LMMH]Rɤ(7@X5P{{;p8[NÇ奔%cG)@๑A {oM8fkk)Qìh]ٜ`ii^xN6ح! =);;;ܸqcO}B+Wvap1ztX__͛7"]ܸ`J%FGG9 hdyyv 'sOiH>v ###{nL(,($ϐ<8UdYfggy@4 |?wr92 $խn7KKKB!x<I& S,immLeeجqVVV>R6nqUUqx^YaxxM BUUFFFX__x<555r9FGGܤ=s"RYYIKK dReYڨ`ss_4;{^l6\~]&&Vx67o0 T2/'*d*j[|>^@ B^{x<(„%LXv,KKK$I"`1Q7|QVVVptvviyVWWinnBbEpE__!reXn~7ZG"|PӉcfv[oS,*mD"/xnTjOaW0Zxj1gǙemm#GX 7 ` {v3 BǛ1]Mj}}a1N@Jy&mmm َ IDATOCf YӅt/2d>gffD" 0\.C=q>Ssu]geeEGSwчے?v9dY"'F#NJuu$BCC`7nܠYƨcgg%RhEHP`kk5xW췩mwD"jjj~fO>j***ڵkܿA">,6'''q\,//D" Lri\2XqZZZTݾ}M*++9{,gϞ%`HRtwwDPU\.G__ D"ǏS[[ˍ7c~~Cfd2ڵoD&V ittt033B~uuu>}FaP裏X[[011!N.\@<b0>>.,&\.?ɰF;(J%>#(l "yCCg``zYPڵkP[[ٳgD"ybN'::tPC:~tNh48>h4*b"(jnݫ7gu~ff ٬% s0q8Bg7ۦgiit:MP`aaX,#s)aݱX,J%Μ90333TVV ctt)6RI`cc>O[[[x<ZUYV***Y\8Lgϲx\.G:FQD"{%UU|v]cy&A9̂UV}auu_W`~QYYG*4h4ʝ;wXXX`ccǏ2 ===|>VVVl Ϳi,//s}4MFjkkY^^޽{:t]giib\vܤX,/а4d2)4]]](BCC?X]]ehhvvvxw\rT~E2l6 `jj??fJ&''1 B:&Ht:>pqbܼyzx >\~?NO?t M(Ri*L/l'H$¹sZR)N'lǏggnnp8L   t:o~:=z9>ÇjLmɓ'oVF7BGH$ɣ CF FSCchFkk+g*VV***sv_Q***{?v#GŋZ?~p(pY\\@ @]]x8~8HD(X^^ŋB444|iqcee"|nbԩSB!n߾(lllpV+P.asCCCX,N<묙0t۷ppaB E 7nܠ g}n0H\~Mhll$ 2<bi]]]bVEd23V0Jgϒf{D2 aSp4M(ڂpnkk3rq tСCVrᣳSXjkk  d=1 ix<8q!|=\. xWr"&ɓ"&a?byj8N:::z0e2jkkb0 CUhn7@?OPb(XTVVBqu&''Ԁg2vvvuwﲽ4 DH$X__' դR) 1M| +++B;ds(B"`kkKL v\vp8,qZ^=>@@ *;wTJȌxaׇ봵рKKK"EnPWW'\S|ᇬº:4|UUUܽ{v*&333#&rawggd2Ɔx0 \.P[nNYXX`qqqO2En߾Džff``@&bIn7.F(ȅA"<)U1ݨV̘rjl6BЗ^Avte,EyV֢k2ca0XMt-WnX M$'>fmB ғX4}6Li<ץP(Dkk+`jᰈKHRܺux<Ǣ*p8LKKHiPEFGGx<:uxgvv*p077:tZ- BKFY]]essS-JQ(Kᠶ*VVVGQ4TH$G1??O2|> tRYYI4ebbM:::hllfxF("BhOfs]]X,&R:N***p\"l<' Y3FVEDnv~?~_H$X^^ỈvtlmmHMgg'555TTT033 "5yiiYrUUU‚zIRBXloo4 Buu5hT* HNmDF"v;XLXLj+HJ<7b?11۔I$a@./EnzggwOMxH Wjf[N~Ggt=^Tbgg aR3͔LYr̬L|{7kab%I&$Ǫq#<lmm e:Cx;s Z5^%7N&eggW.ll&TJ(@X,XO(BmV~l6>,ZK$3̮ǁN6w&\8@.3Wmu}s%D"H$E&H$D"H$OL)H$D\%仇H$DD rH$YB&H$?^d,D"Hxl\;ˎ)aq8lllzf.j`'U_!N d$+ D"H$OQ0 K7f]UU([.\,,,( S( ǹy&b ÔJ%y<MMMUD0 Tu$<HD"H$/,PWWG8z XVBaP*B4t]gbbEQB8NJc=R$) nحlӬV*( |fH}0X,h&lI$ T"H$2 0 wImo )%la١X,r1"### ;"wܡX,Ncc@Xdhhx<ν{hll F>X,`jj EQhmmhytuL:zzzp\!H2M"H$)b|=r+lV" r,}llnRW[C,}"Afuu0x饗`ddgގ;vT*'Ntrƍn1 ӉTUUalݻwYYY^֭[An7>|X,Ƨ~JP LrڈD" 0==M[[ HLBD"H%[A0NE/9N2d}mHviۉFa,(fCUU4Mc}}n7mO򀀠: 455 P VWWfJ%8nv H`dmm KTDdD"HxPCMM5l;wtގ}ӍKUUTUncZqÁ餳X,vm6bd2)2ݩf_?/t2-*vNkk+555^I$BH$DY475Q(߿EU J~3U.t:D"B!^K0$ ۋbIXr}"!DƘ'r}t]rTUUiv]Z?$/Q,XD"H6`iinT*b٨iw\h|>ᶥi>J]]7n`pp.jjjuRp8̑#Gw- @&2\\.9| a9vp0QUN*++Q6@40s|>'N B"y|?ph{,DTbgg rdlDܓL&I$C( E ٭/v߻5Y^HjRey?.bUU)("EZuEA4Lb2bu]OQV+y_4a(<雙gc3ySUUB"`I$D|OgU(w]2r (/)yJ$+RDH$C%/Owy0 %H$3r.HD"HGywx<{̍τߩD"|BD"He`9=4=D"<.H$Dr0ړq͢@D"H$Dx[JK*H$ɳP?Dl#MD"H$@&E"H$g k|*H$Ϻ"D"H$DT1D"H$D"PW"H$D"<]~vJ% àT*qH$ f=/D N TBkA~XLAб;+&P0XV[m$a3 "Ta!o,gc3a<&QUP(f|,Xƾ}}.[+9VsîUc{T6 <7BS d27b`$IuD"իWI&>-,,p HQb-HGD0`| 6߽EQ>.+Ty !yn\B"bP,ikk{>ADQ waaa??!okEw-:$IŢI3Ȃ_P`3e){wcb'N`QN !e\IΉorHR\zH$o`mm~bp] gΜ!Jqe1??ѣGQׯ355_qVVVH&lll /B*O?eqqp8̫a2 D#%LwlK__IN"%p `yyt:ɓ'|l6(===̰˗L&õkPU멭%NK*):;;,//3>>{grU677I&hFWWKKKܸq]wGP !ɳ-E/Ǥ0P%OEfJU*H&X,v;VݎvNBarX,hi N'rpݔJ%z*kkks )|H$߁+`)2b $'D ]wk¿C,~K69IŰX,ܸqd2I>gaa^jjjL&azzZR*Dal6Ji$T Ϸ'((B:Ν;444W_b%ɳWJ? q~T[IegM fZZ=QJ% aX|hy|[ fszؽ3 ]űOz%/+mz xg]p"\K1 XT[J<|7V+SNqaRR[n駟*?|DQ>S^J}}=ǩStv=Jmm-ˢFi}q:~4MUUlD.ɿ' ֗[A>#d}, JMGqETUvsQN>M$҉0 o˙3gl6byIHӼfqf}/VqYHXn-v;vv LL`n\  "O2qbİ;nu[h߸JDR,Ūb{}Us!_[VMU}9;u=>vb61R"IE2 BKPpB7X,;=q^JP`߾}?~TWH›}Pcr+-p*8~9 [{ǶnVc ]qz D"2:׋F!H`X8pшFCT*fzNF2DVSSS``߾}J%A9u&Z) Fz=zۍjN*xN4Ok|J%X'1_%JeO IDAT"nod2Μ9C {,//300 >F7wgi(lllPWW#6d_o߾'ڕ*A(MMM\pIx"^.I&r @|>/򔫨by!F`7\~>3M:]"**.Ɠ9!NZ nmkVAl6^/^w* J~0*xNsS(xkQ,|p{=hZ2 +~\58-& UYXh8pSjf0LhZ~_ YB^G.cjjX,FGGX<%Ibee5b1P[["KKKz|>N9$I x<ay{(St:FH$XYYTl3s~j5ݸnܹC.#͒,&gyyrݻZan߾MPaۙCTFtvv2==G}D2SFtttN,󱱱!^ z@ )J8N% RٸFVT"ɕ_bϟ굢ҨXYY'? lvGCF6fi5 JBFY]]eaa(Th4(Js <VUԓEiii399ɩSx$^YXX7pP*XZZ׿5NF&bY\hd}}Mj5 ?dvv[n~nܸb!ٽ{ޣd2)gΜ!Hw^ܹ :gΜT*ĵkhll1rv…  <۷_PWW$ەk9繾ΥK0|,..k׮t:{.JÇڛ BNT" jijj_bd2͛7ijjbڐB@ ŋl68\ۄ:{E= ޽j؎UTݓϼh8|p5\EU|uiY FWǓDpf|<_O~{tuu{wxg|>T*JxwD"FDTDZX,8Nbd3gΰw^^y2 mmm ziiiBۿ0}>Ǐ>xVK__CCCi0~DJ^vχ9y$zFbWjg}}.AP@$q$i[*yo'NR& @:F$8}4 E" $qWngdd<x,^P*\."333l6j5$h>F(J?N[[W\ɓx<z}ux &PN2ӰACy߿9Gt8XEUTQEçbeKE_U ɄZȟ# ]?U"~!bU9B[[}}}p8(ˢP(v_b,..~V+Ӵ8j5kkk8p>{=fffD͂ЀhҥKܺuKD\.p${,[VUsbb̌`"tdD[VS__jeffF:,֊v'o>, >>"'Zfbb"P*4440<<ٳgX,L&/6 ^ݻq\x<qT*ill2fG~M+ю(:7iV-B*G9; +NR.֩'ԡJ>2\GVs)Bx<, lll SN0n_}UQ=<<`vyW0 hZZ-tDGRӧY]]vf\.Zwq:t:~Q4k.N'ǏÁNcii /,VL&chhѣGZFp?R6299)kkk9q p8k,,,D$CVׇFa׮]h4؈``eAV) F:^u׿ujkkYXXT*zE4CղgϞ#hnUMxTv8(φ>W* 4Bj HEşxoNE2%꪿*|T[FΈ3dvǔ3g^|/bl|݌ T*/k`,vcMܣ Baii~f?x뭷ۿ7D"~ũSX F*?1|߮\WQgJ fG[$TZOk䔉ŒB(KvGV Q^0{1bHTz@VnRi½"1YI"]ٗ+J\lL#~x<.6Kp8x,JlvO!2==Moo$yM}d2Y{kU>'X}ێZzzޝO8^TT*nc' ^*TE&-4٫)XU|xnި{P;jDVҏB| "26.^hd޽$ n޼I$AI.bՅZ&322l NLPs-9vNSG"Ο?Okk+ݬ122B6{>;P(pmb۷$ D!:;;Esܽ{Ia׮]e`Ϟ= ~:np]FFF444wm,rt:͝;w\.cXؿ?555>ϣ0h"BNƮ$IlnnrMAA  vZ0Bi17wJT*:p8,UMM Bٲrk?b@ hvn\&H}GTNᳶFggc LNNGmmt<= }/g!L_f|M@~WUQE ,EتcQŋJ2Wm{,rX OkkUuHRr94[[[,/c,--133ݻ%NH$9$ID" FbH<`0@4%n&+ ϳF]]=v$qynLPL{{;F)V+G!=P)3HkAƨA$6668z(T Q977G>'^yv3>>:Yr8vfh4JXX4eaa\(tvv>@4T*bel6DI(Emm-FsR) "!xr{0BɄ,Tm2H:Y>K&CT>T [EҩWJ[ 2?&;̄#ӉR$cXfp80 "Gf5>F*D^Ɔ޽K__mmmT*aɆ$ILLL`  r-:D__555\|y&( rCSi.b1L&Pl6$ 29RiF|>J|>VX,FX,x<>.wDb/G0jp8L&ƍt:JV={RDFS*)B91Lt:h2${+ T,XmƓE@EUTQ \-C NwBcq 4;`t$F\h4b6ԐH$( x<J%:줽Ӊb!c6Ɩ$I±Z|5XIY/#0;;KGGZaJXv[}A,c||L&C}}=>O·pN0b`ZfbbsNGG8Ҷf~aZY"A FQ*bSfѸm,8Fx<z{{Q*D"lllPSSА Vմǹy&z6fgg 8r###KDQB"}M@ 륱t:$jN622nd2H0ђQ:#ng߾}t:nܸAlN#-;0DQ=Nի"k*VU__ύ7cppbŋ HD&ȑ#XV466'{n1er9 6/%yJxz+QEUT 2$U*[3 OGarRhhhP(ښ=inݺZ%677) 444jàT*hT`ߏ\.4& JPiQ|9f]]]а-5G:@X,FSSŹaqqmwGGG `49?ruP NSSϟ緿-_%)]AWW `zzzض.ֲESS&rL}}="077ǝ;wz m JEB2D@2d}}VH$bx^юoٰX,zn7|~nۣP*HӘL&f3:۽8aT5E:j%dZl6Z-v|>/ NG{{;@{@ VDNC}^y" Q*0Lxkdd2hP(`X3 lV"J>+,"4,R>*DD$IDQL&zb֖ ff8džKh^`|H$Dm}֐j>o0{'S:"*^ a3 ?P m.n@j211Z楗^" J* ~511F!m޽f`04!9R<֭[\.l6(6D:&F# a0P(ޱ\QWW^6SeY H===fܾ}LWW:BVekkl6K.#`\ؽ{7>d2$5558V(nȴ:׋RR5F6Cx<V+hTPږJ%"HM"eN'@Պdrr} h49pv1(3% f)Jr9ֶ3VTirF=ܱF#ITJ?' 2 Jt:-]c][[ɓ'YXX`ddL&T*H$DqPh4NQƂFTbttٌd7ޠuGnX,V%=*BUrY>}e nܸhdOL0qFFFG$^/ǎMd2;w5?a|/L?pɓB-⻡ֹ\>^1wzI} yO3o6`9yy<22•+WxWX, tV TQg?_ #!/7wO뇬dw~J%LMM `0(+VVV( h46 R)j9z~tuuz7ʹMNnΝ;tuu=;/}v^{M8nsf3(J, OL"ONN2<#d/T#^j4\.ڵe0w477wܶ!+ % ?[y8WUλʹRZ>|x[+oS\m||^Elqi^e1ݧʹ\9?7Ͳ/R@9&RЩ:*Bj V/܋r\u_A2 @А,李Rɾ}B: By CCCml׮]DQ\.`pS*cjbZٿ?~BS9ىd" hm;pKKKHDkk+MMMy1A2 &6A kE nv;b^h^gȂٍ nۏ~~~ΝOdbi:;;Ea=>>. [[[ttt%V+o555"&MMM{D"9q333lllǏ̅ (r8}4vs166FKK Of7n> o}h4'|B:fϞ=9rE.Dww7J"DX,ơC"jL&|2{ebbd2f??Y7obL&ٽ{mݲʽ$Y[[,..R\pũShllDP$ &&&ZT*~_j9v^[n#BsiJ%| XV룵UGi,|t:r:oD"s [+\rK.aZyhjjNgϞeccZN82o6uuunZZZH$x3 Rd?ք!7,NNG9+y"o618p|> Q2T*.@"ڵkp1.\@$A>BTk_PYjjj8w#G0==͵kdbbÇc4yw(J__PWR[[oNgϒ8v͉XѐCԕlmm . ˅^' )Bv ޽{Y[[Ν;,N_z)\.:SSSLNN_hoo?PZMww7{ȑ#$InܸCX,\r)4_b|O2h4*TV"+++cǘazz'N@$}]QF?CbW\Ud}}Nq\"}gۢ'j$ϳIkk+YYYQ9r7nɥ%^{5$.\E<'yIR-ﱹŋ)\rnP(~z{{OR;wZ1o޼I__^skeeEHz.^(οsW^݋$I V۷oo|箮$娂Ng0ŀ\?!Q*?)oҦ/?^xzq4PO{i {~?i;v'iV:n[Ӵqy|gi>\+wx(G@>+ ֣W)?X^^//x77qqrBo~={0??ŋz JRrґ#Gd2fgg{zz`~~BV6Eӱo>aП={͆eppP ]zUS.顳R$2{zzd2BGV Y2e+ ΒL&>}.xwcll.SV't8GOOdM9r 333hl}}˅@ш#)hCVX]]bT~C]]: qm\RIgXfD" Er|>R"mhaarLss3˂S}kk ^/v}}N󳦦)BVut:C }ł$I_n5772R'̻˅ P*yUTE&%Vy"RtV>;V}/2 }5_W_}UVN jǏ^:5G޽ٿ61 Q H|UB*^ IJ*: nc.(UO?F>7%hK. p\CA5*$;#2 /SsWd?B, /_Eʐkb_kHFuIFGRd*?-vN* @Z!;JKKm2ۯV`YakL R~cQ);Pyn@,Z9nu+?8;&u+Ek+qge*e}\*m*oCPų~s4B*ÿ m:)VZ^Wx Ts;D@tJpj}- BGP`ddZ[[$۷o YF' Յ,}CP`eeE/>.mff`0ȁld2&&&XZZd2o>jjj1su VR.x"dR DT֭[444rX__gff]v >mtF,444:p8˗r+KK`k׮dhmm[=\:>>NGGF^XX`||r̮]իW ØL&8F$~?HDgg'>ܹBSe㶲|.ZZZĸ455}3_)łUEUTUBUgj]%N4a6 {~$IbqqX,Fgg'65o%zqJBA(?t:$I"Hrb\~WWc6tit:jd2R rTC Cdc?1::J("JQ((Jܽ{h4ѣGgll#G`4)lmmquvڅ!J%^z%l6[[[pP.YT^677.rt:mmmL&FGGX, jQ8&nT*r x^AN3==M?J;wvj2007f{.bh( h4^~ebv!8FV(#W8 _ۼ/o jP>}GEFv:ߏg9W>뜪~U~lKxT* Wg)hW_.U  уQ (H0?N7%0(J\.[[[r94bQhWiZ0B!fggٽ{7###yk.  J%\6"ϟ륻i^/\|^`h4vEKKet z*pocc&<r+WFC2Ϳj!>jnc6$Y<RH$ݻwillsm>g~~ǃdd2aٸvxq$IVSTb1ۤ S(DTSS./u_oݎZFVS,qX,JNBAP VS(Swww+wL$AЀZfee-(K5_ԟrv/kT$ illܦCrv>NLOO*,..VihhxdX\.Dx^޽KCCnZ*XZZ" /F$(twwF~:TZZZؠY@A(DQFFFHR4551<<εP˗/inneZ[[X,|qo޼60==MGGP)ئ._scccX,D:V:֭[vb~~^޽{q8RۚNY\\vf)J2AޥzQUU[WbiWZL~q^ ֣L>³. VK :@NX,& RYH,..H]]M(񓓓8ك$I\v`0``}}]PiLv9M]d2zRiiia||`0HGGǃ jÁZ&ɐfEtc!; :tBMYDv;HD8fDB衩jfTKn }bb'bk(,.. )JtwwS(X]]P(P,IRajy666h4\.J%$ zX,NfHUy9#_\.F"2iRlBI9~Xp8۷$I~ڱY\\̙3DQΝ;$[[[\|D""LǙ`ccC̰4gΜF߿^.Zl@ ͛7V>KqΜ92N&ps155%^\Wdv[ZZݻO> <7oO>cS*={eܹ^O$!111AXDPpuIӼ㋋,,,lWXd~~j|աRNS}TbA6'm???a# ?T6p8L8t:d2`2xi4/[e2 Cº\."d& & L&jfYYYtHDMM LOOsUC׹,"6+Zz{{&qBЎ.Jđl6r,GT:#NǭXd2Vr4Eߕ$%l6ܜ`VUU24n2dX~{] IDATkg:&KV `kkABx<!ܾ}Y=zny\.'Սص{^.\@, R,Y[[{ ="q%N:%'7}/!bPTD,L:bn4Ec}r.,F?ub_277Gww7",-Q,Y\\d2صǦcrd'O^~I& _b1:~gΜa}}w裏nsn߾M{{;:[[[P(p ^};4O楗^bnn8R˿dhh˗/?+"4kkkLOO/c49s >,BX,v d2Ξ=7 677 NNy78r| ΝGZEQakkT*beeEl].fS.bŋrix;;;EEF"~zU~ߐH$7dbbeשT* ===LLLp!o%Xn޼{R~7xӧf/ `۷oO,#LbPUP(;ç~*kbQdlx^/ygvbQf|\t ՊOe&.1KD: xEd*v5o}}6\.xR)ѻm2v;>콳j7oRDSSv K%@"ju+݄~n޼dJ9]PгPRI(>b͛8N2 ###ċ/(P(D4b"R .KXDn߾-bft Jp8b1VVV8tHYf3\NML@ O4I㌏c2D" ^|E<.\`mm7np!&''977G //X,DQ{=)exx=̚Q(j  sssv~F8`0ͬnnann_~Q\hOS677u>%~ӟӧ)wY("133C8d2I$\.q}xhF4%NrvBUj&*X(B0d||9DEQGn߾ V7nx^~߉~\.Wױltww3==&J.,+>|EH$j5ԩS_d2IOOHitm˗wKOOׯ_gbbGR*xW'5VWWY__2@ww7:˼A<]J%9smm\.??( OOSP B<"$*jnx &lj~?>pR>a]y f 7odyyɓ'|tvvb05ddf B\.l6ccc*+++p8ʱO?V(ֈ^/{|h4*@z:JB0d}}}WrsrjBq;vYaV*vǑ 1  ަZt:zgKK dV> :::5? 188 d2 j(6Vvsar~H$Gt:Ea8|0~xYt=睝ttt*\.l .i}_,d2 t:Qr"uЏ@Z,innu^/X;2}05M#c6v{3 e""a͡ 011A*>V+ bK[[SSS8Nze^pMz b"Y5_-..,.M455;;;A~˓ȶАpj,tD"\t MSSTΒH$"iܺu~1 e|>`6iAkimmevvJBssgzh#G#?).\`zzǃ.mmm={V,\7f?\.G uK]=yELtA<%≢۴+POdд/ Acppر=϶=755LJGn[$(Z$fZ"f\ jʵk0ͬ`0DZ7ٌfcff&l6FOOfv;bqOU LeX,lfkkGR.YXX9uBʅ".:::|ss3J)Ŧv{{d2*NΟ?Oww7---XV:;;9w677 x<=nυ p8XVqMJKK ,,,r!`Zj*2ř3gq"nq8a?WWb󬭭100bmmMG>,j3>>f!?UUd2LOO@Ŭs122"j‚X 3_HRXVE4F,..Aw} aVHO5m}A\{}n{mNvnhdnIcɽaA m|96̚?Onn}t`0H\&d2IKK \x{X,Ƌ/H(N_{ׅIٳ|loop8n\fss. D@Cj={Io~wvvxwD"455 sqyN2 ]sP*HӌR(8}47nU6׭$vAosel6*dp8Loo/&P(D&w/^rP(6o|V0??f\I  Q(Z_[nQT^, . ͻO2ڬB@GG 1*o*ܹsD"^/CCCqaffff sΝ;~9fhTUf;pyJ*6t:}GhwV7M[Vz{{ q<.7$ ^y*Gq:::8qNWT@DPhӧOH0Ukiig?Wb9c0H)DKsJ?e)TIOUUVXFkU4a`0` G6zH/jJeY]'Q^u>fA46U6vˏ _Oig]5jUHJ%&[1׳. fh[X,--9|^9~w #q;tO/"6꺤XUݭgKjGw+ҋ>C8vp5y5UoCkc\niԂ7f҅9D&=kl}1r94 1s>yǨ/>F+~[ĄO>hzEQ)x_Zz4T~m}~D6SUR|5N*TbjaT\.܀I$NP$/=Drtջ|FӓK,ꍦ\^ߟũq]ׅ+~mܜ7}v[&R/gtE~mԮ?oX6ܯk#mv5kX,駟$ Vuvvm.Woo.65W0sGc\78/9(CA@5ȔeQ  D*KX6 3(>G^W_20=t:I|*dK@$yI$?sa,H=͓=VA"y\8u@$RS[UHKDr' lfFr.$n~wr\*\ X؆BuQV,JEl  ~l6X,Dhmml6 B4mq%`0b͛pbQ*rh5M)UU5T*"zRƴ&IUT"E 6S7oczi|Qd,D"yD,A蒧7Z;R%a?;Zw%C$ԭ+++:D<cp\LNNFX,vaaaW*8d 6׮]C40Ǐ?0]DɂH$WH kiN }(wzh~rhWXف U}+^dWgYbpCaX(  !˱FV#Pk$_.f+ >S4m9\.S*jr9=JKK .oI1LMMCww7/_fqq#G:kF>CjDQ^xTUիlmmf\|Y\* lnnb0xr\pJB<g~~^z Χ~J.#Ns-z{{ʕ+v'Qz{OQ @Mp8T**|j90h}UgAKK nGkk+. %u D-Fx<( mmmE4hT!HԄvX,\.rL&C loo`vD{{;x|>O$P(E"aDݮK$G>$lEf<CQpج7 _?X 'PnP*(((B_ըjFڰ,..2999|8qB [[[w̫a20 x^?.EQXN혢(vZ[[x `&,Kn[Ik;R IDAT}ݱ>)sux¹R?xbz?_\ط*\=xx&JDgiil6ہ‰^[TL&.6E*FJdvFGGEH$BVd2%6J-( ZMWRoR۷1455a6xz&Ix\oG_i{ΓH:eH$D"O"6*[[[ttt333j5$^'N`49<( ,//088KKKܸqUU1Ld2Z[[P(077륹O?gy"W^h4l?~HRavv)Ep"7oJpmmm8q7nܠV3<|ƶ$l;vJ$D"LVhu`5/v޾x<  b4ZurlllH$X]]V$I۬xX,GTbiig}'Np n޼IWW1<<"[[[LLLzȑ#8Nz{{z8Nq tɄ%ͷ-&&&XXXyf31rYX,dqq{sssn8~8MMMp-_byH6H$D(_m+_nHTL&۷bdYF#x<2+++DQ8sssADQ8NYXX\.rhooGUU666( $ ~?f"ܩfhhχX,ŰX,477*b=c4Lff3Iss3p@ww7 En7XV8`6innfuuy 'H$D"|8[AxV= }dEf\.EA4E@ @$!r1f3t:9y$TIN8!?FVz}ϱ)F^g>zbR.7Lttt`2X^^P(0>>~`|D i$DweeH*ݢQ i(|H(baak׮1<ukqo|Q[iG]I66xPk?P(ʔpLR`0􅪦K$O"o}D"uz60D"p8p8_v;ːHY$rp6]3(BRvS"H${ D"HjƁ@@O&D"H$CEH$Ĵ7D"Hxm@Az;zQn$D"yT5ȗ}D{ T*.$ O V^ZSh+5JNzd#A-H$b3`dtXx2f=(Z\.dJ\.fgEB@:d2xZ rl6x`յq$OUm럩LꟍAQjZ\JX%S+V*lgʬ%KDwlJlJ䫔ku?C ōtF/s/8FnϣMDAhj8R;|2T"H:!R=0vZ {UVblooSq:,s[gX,F"@4n7PL&C6%g2b`qGbK.|}\&xl~dY.^(w=V1;;>|X١P( 0 r98PFTbkk UUܤr̵khiiOZK3"FךrTJ:_!uluO։&KIJeb2|bECƮVoHFV՘^322hdeeX,JxÁR62ǏvSTRpQ:׮]\.sq v{>X:x:HsuVWW)\.hkkի\., -Fjׯ_gdd/rk6͛A:::>}}}~eB$dnN/7ߔ1??AUU$v`0iR)2 mmmw Bh4J[[ہJ"wݘf4 ===,/^?v%Џd}mr9&''[T;oT5*:^T}3 2<A\.ח묭0<<^DJo["===X,?rq8j^x~Ͼvvv>k?cggz|駴100pR*DQ=J6ٳ/8SXdbbq?w;t?+OŚN|2`0H$ jkv V?\ـWfb18|0FgY&!rz\TXYY! !kUUrB(b1ڰZd28fY}u8&SN~:dׯNGGSSSDQf3ccc( b[n177G:^f}}@WW###LOOL^=X,իW) 344T*nc6|LMMN1?~LjА1dYl6f$b1L&rI$ Qz{{)JLMM6taR033"Zv' ͛74CF) x<ftww322"+ɓyRFQh5eTx\ݵ5VrVohW5M#NSďvcX8|0.T*d2b!Q,X,8N* |^o0fMH&\.c6b:F6١Rd0 qV+rNfm^f *P(HRȚPU˅( q:hFTl6T*vN!p) ?ܣI vzI6X,:::&222jj3fY|f) hcN4B@6_*;* b)JJ%:a4x\sk{ժ8f( VU;nDX$r0Ld2ET**NM?rQ:;;q:%L"<χ!H~x*|{~Qv60Nf$INJy$\d2iv4 n7}EZh4B.cggf677V~`Bt:͛LMMqa0LAI&9rmp\8Nf3]]]200@ `ii-0 ܼyS/>| h%E=z!3UU tuu܌cvv'Oõk8v N:EssX;, ŰldYIr9677 j5hkk#H7M,SSS|>677d2=zL&˗c}}yDV,//P(5, 8=,$_GS|ʍhb=E L{_,X,_Ml6[[[nݺkF?o6>6.\&n}{lnn_6ƍx^^uV++++(›o)̶H(d2ARZu,0!;wFoo/?dmm~򓟐o~66T*%ܾΞ=K$h4r)Z[[ywя~D"̙3k׮j'O/45kP('p54'OvsETU% Ř񰱱K(477}D"ѣGY\\nr+++?~h4J$7J<cIR22;;K\رc! nݺū$hK/D0 %c!脿=GZ&%LJwݰ~9 ,ZFEVj NNNH$$ P(pe׉9v>oO;6@OEQDH$l&J,JjJ6d2Q*ƍB!ob4YZZJJB*P(t:1Bxzb[NPeYDUUtˍfX,R,+"Md2?~P(c}}d2d"}ld2bd2 V@ gb0hoot:*TJuttP,bj5VVVtwwc6a{{K,cssSXtj6au*Jx<i"- _2*K(/ D|AEo^'rx7ywvMMMdYn7@7ot:١gioo֭[aa__ ükd2 \.^/$IT*ST_5q1^z%۷oDp:->}|>ŋ1L?3kkk9sÁje~~rL>geebf#R.H$oMTvիWPJRܸqg 8^{5IR|;AUU>~ίk.\@KK wioog~~w]~߱ȏc.]۷9qfjʵk׈g?R_MӸvdY>Ǚ' L|CCCDQΝ;}{y<w"gΜbG?"L[oJPrk[okN>͍7HR{Q*p~l6< /D"<3,//s)>,DxN&a(olO$AQB]=*xz]WUU`2T*!]h=R_c4 b1VVV{`aa h4b0X,B.sTUA$D$5551;;4DÇ?P`l>X 4rYh%C |>rrEQlNG"QqTU|;AQz-r SSSa`Zacc^0,,,qCp D@z2dgg`0륹A\&Jى' 9ƍyX\\dmm^z%xwy+T:NN<ɏc~[[[,b!r8Z[[uUۍd2a4ijj]ww7---"kiv9Z mnnp8W_7dll ˗)Jtww at``o"0QwJRT(PU1NF\`0 hjjv---e<00/C^/fp8LSSNSms)5A_ }C HEl ޚ_߄J :0,ew}P(D>gzz\.GP`ccmVL&L&X+ ӵZ6,ׯ_'Q*D"$IAnjj^sUB,,--a7A[[xΚf:DR{G g8;j*Ub||>!ɐH$|{Lf#GƆpsߗbZ(YJ%Z?]_sKKKbq,,,x{& tX,F4%{f";.D %*.ܯbr9[|, _f;}O1?{o}}X;)QUz y?!@d.{3ӹžvbID/"YEK^*%-9<<9 nܸ`rrR' !K)I@Zͽ{xW|QVinnX, "j 裏"QV6vh4477t:E~CXΚPۯܖ^vH{{;a4 LOO`0q8_p:B d2144D>gee/m>>_|A'E<8::P[ IDATqRTpcc#\&~]FY\\$ϳ---rpy\.`w\t@ @4emm ׋j% /h677n" (J8:U>`k@>шŚ>3JV^@(9 Z-h@rYn(P3A8Fwa!lAJ%Μ)9<<,z8f3###p8\pw{R%JBssq2477399.:˅$IL&/`aa6q^LMMQT|hZ8uRl6'|J &r;;;Ht"`@bfrru gΜnc0<8"tz" |>asnjۑdy1L+F:>vt:iV+6MeڢRӃfS^ğ~ ټoYI$N>M4ebbjJWWϟh4DR墹DkkcaaNV+o~!ovZZZD'|2411`0hmmTU*@gZFz{{f- r|GGldIoo/H{\r?7\.^~e d!Z[[innKXqZ^x&L[[&q\ y& cX㣏>bffND"k׸y&tuuqvww\V3Y`x<“c) b,jaZ q>cz=/_n666I~H36/vݴ'l6]&XD,1RW"KFCCCAxtL&dY>SZ-/^6azf}}}LOO\| S|ns+-< eO'k0wG]Dߣ`0aA:NT*:LGrn׵kV׾^l6 ڦ&!WUDžA=:gϊsիK/0#3Sk(JVҥK"`0<<|^+Ʌ I"C288ZFՊ-B$qu:Q*(({08Ņ tб ^zI$sj9{HQV3pU炙[̗v7=-!5400pa'[zN߾ʿzkG3Kl UWC /U?:߃T$3&/ 6$VKT9S$rQ)ly) -/HU*VT*ȿ׎[eaE/B0ǨVVbl2ܞ]*h4J%7.[=j-rms%y?yc[^ yy ^ш&KnK+ K]^3y~vjTՒfo~C6׿`vjF|t|\m޿A"yaJ(ER%O}>VjHFoJXd|K-Jآnfsd2y!O shKT4u$@-$j%I6ݮz*:X]yJJV3yPjcEܼV>'$kL5'%EӘ9j?q׶QYN=ն/>ͺtd!v]vR?{ںxNIυlqie+^kiss>ig[ /LU3jQ@Yf>lC_ o_yw ӪGwt~c]곚&bmT#`W_k (s (ǯ }% :5WBGT*S*3ZUatmK(?Bȉ (P@ d{goP*Wpv+I*nq?KIɗ*u~x[vhՊF (P@~ Tă$'icUJLo%H=QŦZUU (P@;4|d7Q:*לO}3* |^-[%3&}s2IzjT* Joiuk;k#_4R?9Lte'& ?yP@O*J<P%(P3F,c)Ldb-{=ikk[ \NpR(J,--FabbgBtRP(hfܿVZ[[<ﳵ;CGGsWXDӱ,W\ʪݛ7oJ#IOJiJccc˺q$ RT`gg3g`0gcc_~NhZiooZAX,2??O2… ߩ2ߒJp:x<fgg? `P(G›oIWWR#C?cTo$2LQ^z\.y(^ \jDgk $}F?% cEXI;J:NPg_rJbH ڵkD"n޼ɕ+WիW9::"x^EPLnib7xT*EZh4brDłVH(p8D}(@Igg}hŋ\gC>/}bz0VRD"d2=Ib1$InVdYRvVK,#J92͢W,;qMGGt:jVU|Ǒ$ L<޽{gz,CaX+F)ukR%k 9JE~YT7,Z%P(Et:Q)+ -TurIϴloosh4v* {{{D",mmmiEQzܿX,^f1;;K".|9vvvZ a2&#v;CCC ֺۣ  ztvvvӧO۷ y|>ZE1L p8ܤX,1 P(&Lriڐ$\.,󴴴`6988`eeJEoo/`mRt\޽^vfknn&0==M,C7!ňF$ :;;ikk# Q.IӴ`XۣZt:YXX`oo@ @OOHh4J&]B~N677l63<<|b1yӔl6aooK,cxxp8,P(D*"Lߏ%377GT"͢T*199IX$ A8V6L&BZ2 NS(mrVW1cqnnJBWW.{f#N3??O jFYZZZMKK ;;;$ R,lj㴷stt>JA? ~P=Lo5åg7?Y\\gz=n!g2PJd#VCCSk_eיdhhv tuufb9s=Rpxxf… X,ժYkO9TUV*,,,9s Fkۗd2ɭ[痢N "˿ 333n\"JeY\\ڵkl6H&r9v;5, "ZR^/R$ޓ,Y4MMMhG͏ܯϫժ5>>|b2W** ,,,>{,afggT*L&FcXdff]$Il63>>.E]Tfyyjnl6=gΜO0wӳާ[(-ޓoRARB-XysΝcyy}* dRą ĆEZ~_ZZr̽{0LuaNoqqA>#j5-$It Zg}Ƶk L&}6P{Յ<|PKJܹs3??OCCiFGGI$4773==d"L2;;Dq/>tR.q/"<`ccQqM\.b!NsppkHDgsw}"p%D"A.{veyy^$,--100.o&ATbnnZ}b`h4Jd2a8::E d2{O<X,t:Y__h4~;a){.lMz{{X,{\x&n޼fcww ˏѠTV988`ffX,FCCahood2bNOOOZ6Ȇ,IGdqqQXI&,,,P(蠥#) ~4£ֆJ"IWW&]r^^/|D"lnn%I}ܹC4d2՝T;wP(hnnCrxJB$Ç",KViss*&^=zj`0(P,q8" ӧExTbmm ՊfÇf3+++XV0477333ãGX,Bkk+jȓRD4ܜ'@ xSNB|>vwwp29bfqqQ(IN ?d+ F-6iIJU*dWkC9_.ٚ[ Hӧ/ƍ ,|Q* lmmRN'o9::BӉ YlB!`XY677t444/p8۫TU2 ۜ9s!4 \L&#"O:sg4% 188===9sb.A.\ "ӧfD|˔J%>cvww~:D^O*uc7ZZ, ꫯR.τ[bKΣx<|'LOOt:) x^j5}}}\|p8LZ!<j O<{Z/s0F2v._lxX]]%`2fل5@ Pl 2.W_}";J6KKKFΟ? Z1bpa666hiiŋTUnܸ:JӧOsEz\rJ§~ŋ|gT@?^h0n A< y|݆D^_D{{#ZfI",H31S$IOea;jv6779<<&Jj |>J*zb(,~PB@.h4$x<r`L&fR]L&mmmXV.\.W}mllAtssSN"HH$ꔈE èT*aHV"4 [V9<<$DXZfggvvv$Rn[dxV bnn7 HD vt:[[[t:<l6Y__g~~^* kkk VArD"0 BZ0::NdPl6988 C^/,D9n/IjVJVѣG"n>0~j5kkkhZ|>񰳳C.+ ? ogO:ssDy"BlBjIc| (^¦&t:BA kCN8w(SSS曄aج^/W^ V+J dccH$"XZ,`J$8. dYc񷶶կ~L][ʓJJZBGׇ?ԩS\zUX+evڱ{R$IX,, lV\zPNg5VP(Dww7rl6}L&<i ܹC0fay@Ѡ阜h4hjjʍ7x!|Ǚ[S㑟3y frX@70j 4"{@2F^l6K(a2 gggC|9sYg\Y[[fz9<<|^{&} nrfcyyYJD"`_ѝuB񶚛;I.r!`P(rކZl6cDGcc#6M܋dpttd"qbdXdyyP|Gλ\__vcKRFF9<<!t'f9sF\looyjl6666x<"r$D788(ΜZu_\F$L&.&&& rD.K<[DK.a2eggSN /|R)H&dٺY c6ѣGR).^VevvG!I>}ц,+|>7|x+U*ȗE"EXv+++lll`|E8P]}V}}}X,VWW)vރh46PH)Hp=١L8Ν;h4#ֽ-<.D"A4eggP(ltuuQVE2N(VVVMNF'b1jl6_|TrL$Wbš.e=:j ~~ k6$'RãG0LN:%6|>.LFܛJbww6n7.:˛]tl6+,S fJEаZ8ϗ_~)!e+l1RX^^²$3rgΜ!N_ O,cnnNxer9nݺ2 իWbܽ{ӧY^^fkk Vᠧ-vwӋ$ 0OP/ JdhH$###$In޼)''YW*&&&@ш1*_|HJ.cllrCCC,--`~~%HZVΟ?/dJ2tttGGGjOr[fY(_ߧB`dYn߾p0==MGGAD!d2DhDʊ s^p8_|!)Q-\.FGGq"8 122xD L N'===a_|"@6#y bCph HoO3?cV)UT*06$_|Ot:޽{uɿ (PT@b*je4!Y) Hq^/byPZ.T*a4›Ri& uX,R.5]&GT*EIh4iŢC)JbY,AF#'g0r"צv<\J`ky2鉜+ S&.+\.LJQ7A2FQ g:FV\O9gRNWT :Ol+$-u#kkk#/+3T*PPbH2wRg]< =ʞB@Pd2gB{m1 |/^o<\vA.W= rY-*@Q@~ H8P)|U! USeedNh?%al }߭rQQhfDiCV+ʜ (IZxD L&Ν{J륱G3  (P*@VAO?.ũ (P@ (A`H)KemRL&ER PHlllI[tVKREk=!)-HVE~hJ%D?f,ll6+('P=mbHj* (P@?5)ͅB!z{{E=Jݻwill|*s@*̐fx<\r&! fcY&''y71dYnܸfcaaMl6[?83VXdoo˅ZfqqWJ&''|2waxx* 2ݻw`0000(P@ (QVT*] L [nqE(VNR$x^kkkDX\\ҥKQբ~;666gQ*x!nl6oz.}}}~jY,qx<^pl2lllzy6 &BdgzbOY\\passIx饗hhhRppp|@k׮a0/f,..kY___'2::F֭[[oE0ݻdYl[ }]vvvzuljee1n7C288FRcsHS0 >QJ |{T=L⅊'IKQQGT~PjJPRC ~6,XJP(eaaN:Ɔ#F>}3g0>>arrt:ͥKXZZb~~ǃZP(dp:OXz=Á`Z&b/,֢P(p-Jկabb .oL&~: .۷tuuo399 팍1<G*-T5 ?,ݎ^g{{D"AWWE<xZnt1Lv:;;RGTFC4EhܹsN>E$XZZZ$ /ƍ366Vw4>>Nss3N=f&<E(f7nL& ;w`0H"  q:|>!˖!zzzd2pppjN,t#fgg:o\Q%f3FQx*VP(DX;dՇ~&333;P,{9::bss_eS@U}?T*|2zJ333DQ< 066b* C?,^aqqχ~v;DMM)]$mNz4`E*oI0ǹx"FQ\_YVl67oʕ+vr$jjy*b(;x\rk.CV fjd22`ߒIr/#Ibp8L[[Td2I{{;$hDG\TUܾ}čQ`2=z^ܹCCCT*"si>sfcce^z%L&Ryv](Pk~UizpOh4rsLWWb9$*[[[D"f36er&:@>gooFC$^/H`vwwd2"|zssCZ-mmm&RV$IbiiCf3y666pF$L&n& 8<<$Dcc#dRl6[Zr)Μ9kkkS. hpC(\.Hss3DQV+&%(|6>|!.\l6FަR zb1666T*444H$gήg_Vx>ǃhfaXGCx jxjukV188H"ooj444K/r8wrh$3;;Kww׋ZD"͆ˬjWCQT+j ywh4hZ^|ELw}ɵkװZh4+Wj1 477{qj5cccVVVDrVﳽMP̙3b첒$M&|>S_^gttj5VqhW^@ fd2Vf ( paR%x ~5f=lD!_:E%WI{}}]Y]]$x<L&:N(t:Moo/[[[qFaPJ6% aXxdAfgg9<<\.ݻw!O???O6fV%099Z B333*ӌŸu"b2KPl6 2r9&''9wliJP(BSSSݘdH>Se#,j2 sss̟Mj5. NN2)sU@~Fʧ嗿%F/~ 4 :NZ[[X,_d~Nww7ºRp8+ R,1x<4M]QZ%FP $I`0fC$, DIp8XVVVVnN'LNA1V*Mccc4551 466hhh```͆tRx׈8N:bWWi$IyW1hZVhZ|>ZhZfW^yEĘjU;nFCOOnd2)5h46ZFWb6@ Hl~aJ JLGG`t:.^W9nIdYZZZR$IP($Mz=jŢPzzz!RIxC) |'y~?$ 9}46D"ZFrf3TUw`aܹC8FvrS\fqqQg?\M su0h:Yᰈ8|vqJDssSëx<$qttD$X,rhnnl6c2x<Ց(9gȂ%  vv;l~&a6vO A2 uZ2PljY?Z/K-zpʑ܎m ND;[ö>]9VWQ(X__gkk7@Vx? (P/A* &HRܼyzzzBƕϳ-(F#[[[AJ&IzRD:fqqP(D"$Iu{٨UgT࠮fa_ǰ%:l6ч\l6C$N:0tY7* tRjFR~l6immj*eYjmm199cccBQ2 ?T*@@$V'п+ :::0!ɰ@kkk݁@ ~܈d?̂WlbwS 򇼐Zn$Ig9snܸQgTє)crR*8::h\.J"|l6o&|%J T*Eww7XL  <;;gP(DKK !k٥T*,YvHӴQ(888 ͢I$ v;gΜsppPO: ( mmm={*T*ny)I5 (:oCw|>80?ن`yE ( *,ON =psJYC&01ʹ033z.ΔfX,X,jCFFF7ckk.QX,r=vvv%suZ-?{o[Gy^;)⢅RJʬʴnWy`q4` i4alWw]vU.R*SIZI-U="2n)QtUA{qo=?lp8cuuA٬}|X,F(0 &''}6}}}A^IOzuNOO7o… (㡡x<.4)nx^!2:: aP__Omm->!.^(2z{{YYYaff|>/(2>>+",M9q~Z[[Y\\$S,iiit:{F l L-{N>gzzRЂZ9xcwDN455ICZ IDATA*ςfsM U +a>Z/N|eӫ*T ÁrY$3&a  TU8Pfib2mֱd2EBtt:X2x<*ϯ^bjMZ%HiXJB"ZbZbTU* @`"a JDI&R)=0ð `p[di("(MH$"̙4@ @  <6Jx D"H$aW$D"H$ɗgԃH$D"H$_V@K$D"yf @ۣhbyG"H D"H$fOFo{xKyaV-7 Ki,,yD"H$g [P2fȊ?r'Rj*>X,8l6SP.1 ݾ^426m[!PVqݨT*躾kO#pU* Ǐ'M4}.0DU',..r-2 R C]]'O޽Payn޼Ikk+MMMR+H$Dg; ٸT~?'!\.gΜ!reb@PR[[ :tӉdvvbH0uפ\.@6%؈n`ccD"!&VUL4V\.dRDXDujjjcuuP(D{{;JR!d2dYJnX,(yfE*dM(@B@2RrAQ `eeaؿ?aup8 @>gyyMz`( PTX, \.  D"((477SWW4% J#+eTH$Di)Wl='P}Db`۱fCUU>n\.Goo/2::$ >Ɉ\xfžd2BLa4MjJKK B `cczqx=* @n7mmmܸqP(dyyUUx< U*"0r ;v 0y&^DD"H>bU3)HZ x g 4D"T*hjj"N{G{{Răp\T* 444P."3??O:&=,Y|>4m[{r%6667K19]j&`׋2O6vE_ŰzBaD";իWd2TUjjjp8TUd( @irVU|l!eI(BZ% ;m$I I 3;;ˉ'p:^z d}KEbH$hmm NwUr8a樯 qݨb+fn3??O>Nl8N"|%>m6MMM ñPbr.Kb<{q]>ؑ"C˼I t=jK$ɋFP yuI .+q`Jgcx<뙚"p8hll$ɰH>y#>enST'N*j˗/Dkk+KKK\v F<`Z) LNN&&1??j%Nr0b߾}nljF8NfWGG7o`Q__/+BWWnbpph4a ::: 344fT* ᅅ Biڨayy7nDXZZ959B!\.ںܧ9FGG|x^X^^&JdngzzG4uG< ioD"hv@*0P(נ' @lq8p^^/BA,x^ۉb&ڊOfH6G oK/x( tvvq:l6(^GKK n4MC4<GaqqJ"D4}b!rl477cY__GQ v\.׶s`0ȩSx|BOObfcWWH}kϣi cZE2dYN'}}}\.˲HZ02n رcBΘ>hiitr!ן[ /V,#Fww L H$O_Hy"RmJN{fko!e_Yz8XB5ɭE ~<.BO>ϱcǾS.Wի/ Jre6텇rA!X*H$g` Wsbp_߲X,288߶^i|H D"H$6P jGF89\_u\.!RcHC"H$dGU(W~}""w?,TU4M'H$[P* mI$_uE 5§u@NE /N*h{GuVWWY[[3KEx ydҵDbg3`A\e2a۷$^G;ne نl㗭 sRWW' ɋ3x0q\V [a$ fffDsʷ~^) 399466TI$J(9Â)\(J%P[[NSD"yfR)91~0L%}*t*rLTbZn'P,lB!!:KKKsbaRDZX,x<|>rT*i8NNs P(fZl I$_EESxydvyJ$saF"yш9mt#駇z?_j<`aa8qHOWYCÇ*&?Dn BTUt]gyybH>p9Zb/xq>N,3==Mcc#EQammA.}kTU>cRP_~0"ŰX,8pfl;wuijj" A"yVD"HaN2|̨x4u`0(&)ɋM&?j:T3,/Vϱp8hhh`ee]ױZ|>VWWYXX`nnbZ #vsVVVʕ+?~B4i^jnˤR), 8N d2kkkeERȋ@",|mJ$`0Tr,NB{券@-ay >ZEP:(x܌v?JKK O>t:m1/L211Akk+`۷o?łСC߿Պ(ڔH${5@!H$Ͷ6&W?%/<߄84;gPd2LMMx[׋ngss^<,,,`ٰlDQu^t:Bvwj Jt:-mV+uuup8,,D"H$砤å%^zOcأ&DU__O*"NxraPU>RpJoo/uX,E!YYYAQ?N80 B N$!2'vv( TUׅű$^  t=- H$DKb:`uL=yđh{qĉ[nnnYr߿m ѣG~qz `Ƕ7 xKOOώmJ$ :+*9 ,/*>7ߡuH$䗀hB1!{ y4k/KC"yȗ)Uu>oY/-88T /D<Ϟ:$ jkkR]V¥k>t]P(`X( jjjD0 T*EX$J|sA4skF.tnRD"d2 $I4MH$HRxU `ssj*^(^=~DB[XK$gC?* ɚ7 J&ՅN `bğ]KrkBjd`%]ƣq>Z''|>PUOwL&+ _5KKK ~Pʕ+$IFGGpܳ"i\|UȨ\.Qz{{&fqU|>ߞ !B4q:$I/պoftvvbZ?&HH$p8\|>#H`XhjjE5_`4vӹ"JEȥR|>TY"yRkaםD"ҩVT*3`eK渕(&MƳ ;rYMӰܹsӧOF!LUs0DTS\.S.?|9*/2JE(ih(jRuj*u?΀4M~ng\4MT5%mcu]Ź+"bk^\;gnZeX]]w~wB=MıvwSS6 w(bL9EmY֭[ߏibEW_[NUU9x nbppߒD"H$//-D7 'J3chݬD My- T*bnn2p333|>^uuD"sطo466n@CCoVLOOsy"bχiŋI&c}}Ƿm<˜?^{B gϞE4FGGdxx6>FFFp:KJ%FFF}6҈RWWGcc#W\QV&괪vj_rP"H$EJt~6c6i=R-xmBjc`t^\+0Z3xF3::"RV+d{T*ŷ-8<hF\߿ϳefpx6fggz曛?o|ۍaq~Q.p}X^^fjjl6t:ijjիLMM o(?7`zzׯL&q^_U_wޥp8O~N' 1;;/B_Ν;wXYYatt.|9rGrfX1<<ˋ^W'J\Z,ӌmGOƹV7΅*~X,$t5Ξ=KOO.i677QUvߏ֭[ycdsLT*j>|HLx<ٳgdqqYwnxnݺE"x̳!E!q Ο?O\7xz ++J$s _u1lRMiH$/AVU~|/+X BKخ_z |8ߕux6&ZX!!]UUx<\~"p`Y\\5V+nMH$lnnj1if8x q0'6 EQX]]%HZp8v'NT*p8xatɇbD({rGbc@YvMdD"<X{}r@*bjjJ</&X+>vu('iUzdYQTVzTU<@]Em^j%NSVEA0jdQ.R N0!L&AQ|>jd2IRHmERrzE R(HQ444x8E~ߏiy^8rS*Vl/n êT*rd2X,n:*T ]|btNXZLFfBixyfs铣?Bq\#|0Lns #;$rU"pA8VĬؤ4r=8u944=z.\"1>>h  >-vwxg٨T*r9 ra) eTUjr%jdp8ՉwfZ) ٮn'cXH&\x>:::=}X3yRDRAugzT&''Y\\d``<jEP͆fP(h.Kxi*BAvt]pPT4J(\.qNn[jbl7|>χ~磿K>ZbZx#)Jlnnrq½B|/Y-|8feǕfpiVݜlv^s*Z9Huv,Cb٬&s?Qb[4(PUh4fN^?h?UU}H$Vy^wbfxS8f!f@1ٵ;fv[nozT(ܲ[kp8L8u["H$q%!;^Ap%n+++EN|ZFFFPUVZ[[Y^^ݻdٳPbٳ0#7*pX>tMKK ܹsG:gΜ0 >_'rm BH$ɓ'`aaA̙3ܺuyΝ;G*444k_LNNK6nn߾$'Od~99,V>,w%HFKKz]YY!000@0$LbN b DQ, kkkv<HN7#RV133 |P($r"6/(BYYYd[TЄ lV fJH$iAad}S1 jjjHͱJHD(V*J8`0(^moo&x#yHZRўiIg# P ޟ_d!o3 N_^Rofi9W\ fvJv}-ߡSSSܸqjJCCNB2 u樯'*\QX__ Ѩ~V*qa=żVHF"En7ӋU4!;66q]YXXtuu7e:;;Zܹs1, t:d2\tI(mYdx`MnN/T NN۫%>/4KM3`$^ÙP}V&RtkWYXX ,~' .KMLLPWW㌍KaTU&''iii t[\r>BwܡRL$ 1pxQZehhzQyKKcccA8+Jj۷2|Oy'jd0CCCv5Tv* O} lqB4@$}UGb3Q{gzxtb6Ow^Kx^6~8vc OO&rNi??-wiy%l6]]]"DKd~ tFKEsUX)I02nxf.{ oy:Par( mmm9rUUܤT*~EW8"/+岐b{trd2XV|>S*D3DÌWu8c4&r}ffR$ 5 :^/Tw2XX,i$IDgRI[jR$ [n1f.`sx{nZ}nZ b\123 |^y"E"YXJ'6>~N(hq4Ki"CVUQHt󛱦`L&0OEQX^^ҥKͱΑ#GC]4M#S__O.#LrV"VR8aEX_lJ 9f̲YIӴ\.qmɛfX OHl_ˁxl=Ӝ_(ebw,|hb+./v;MA3(iC+%,GU sKOWQgZݸvAȹsH||fqEZ[[QU1ڀ Hw??Z$)NrxgbbH$y&XVΜ9C?.]bhhFz-r?яZ|_g``@xYt]ڵkܾ}RgϞѣ<?яXYY~I]F"W\.SWWǯx"r* Ӥi\.t8(c>?\.ydzzB@>筷b߾}|lllL&q8|.l6+2 ;0??O{{;׮]Ν;7M b1.^ݻw1 G+p-&&&H$ cVWW~D4~!A׹r J.o;#_i9 j\|rLWW׶B߿YbLLLp2 D'OꫯrMΟ?/ 4d:dcc[oE[[/_Ϗ~#HbJTƍ?^TU~`9t'OJ$ \¹De+Rke j<11S3T*EfBp\+4.x࣏>"Lck$b5|dd:|M.]Dss3ۿM&… B!9{,Ofq%0FquE_K\ŋ`0Çl,--YZZٳ444p8+W}nݺիWٷoRo}[D"}BwxwX,> -V`rrCQ,x<|{cuu+W H000;wu?{ou0D NEVE֤%۲Ӳ^ɋW!ku~C%JV^+؉d-Tk<b= "ke%Ze{CCCn4T*vvv?,tr666xxwgjj?X6-N>-* zbuggR>cx"?jH$kV+ofyyYG?"˚VQR^ Wt:>{{{|;yuL&IRl6errRm?jq]// |OV^|>7xK.Cfڵklmm9/P(< h4?P߉ *TP -Q u?߈ \y{ԎQuz~˿dff*tN7DuC uH$hǷm###8aXFґfx#[oQT?p||,S?<\*TPBt IDAT7 zRl^˛VĪ|tX;SE'^SB.2Jԣ]r,nQ@R0<<̓'OzCVK `~~`0(t:&>z.=EiU*bll):D/288(uvwwbґu\RP0G̈`xrx<d"LL8f}}/"JD"7d m<<<5rc2zlo2X,,..ʞAxet:dR-yTH  Brmf3f)-?l6 2W B\.f3}}}|' \.6 /DQ~P,.V} ZVjzI^Ȍć~lf``@fG >S޽|^_y<<###˿ wƸqV'x<1DQ~_hp88[o}h4JZg6 R)>c /_& Iۋ{Za._O~E^crrT*: {&N'կ{Z-|rGEŋ(̠ji4AdjY__Gxd&088(|A024ܺu'ܽ{ᅬz?)x^gnn_TU.\o)3#*- _?mFvYdzCFgjrvBE֖Pzj0>(,bY.J́ȈUMV+)?,ZM\C(tfS:GQyRV'|BZ7ߔ_F^WS8٭VV%Yļx>IHqĮizf)߾}. l_LOOހc F#+l(J}u:vf94MiwqhWa7M98nݟnV+"s")^oZܹsQ-}nsa1w^r֚Oo6N+ӽ>fγϙTU$y8bQC CyDS!.P(R%Zt:y!J?#2gfI2ϻ^"JI\.npsj}k(NNN(s_B(strjZx-/wkK$gqV?4I8mNk5z_ YD}s\=5S8{r܅3*b ѳѝt>Yr޽wDG(kY?FͿHUL1z~ϲK>y_/TPbaxxy!˞ JucNԔ}g-Zw%d0=A M2`6RVY__'ˡjfhh:+++$Ifgg_a,sƍnwwWVdsY(888xavM:fgg~(lmmn^BTp099S\eYү7Mt:jǏsGkkk ko 7o|\!y*XLt( ,//S׉D"=Uz m`9::bkkVhTn6prr8WY:B5T V.;z} 7Bw1n0PB5Z"}Bk* cfT*lmm111qfEF\fiid2E|O>P(D__l6Yj6) ܽ{Wt:M(N}VP(0<<ZVuW\J"n{2J8NY F~VK.cyyYwg]x<⢴ =| `h4J*`0000+++\zUn%W8?!:N )>n}VTMY^^l4=6(Zb3P.m.Vx\Mdt:i6<~M8t>C+Q,@k&ammM we>SZX__D:,Q]֗MBs-ؖTPB7b6]_\ jnZ-lNI bۥnBlottT:w Fn޼)F!EQXZZbmmX,bh4r=Ed2k 6``jjݻyz=׮]舍 RS4Z/299)%2, rTdDNeoo\.r9I322BVɓ'T*bfχbƧ?FA@R(X[[cvvV~rYjDžB!ܹz]f٫[FQ)#311J6jB *TxH.fvC.zJd#4|>~?Vd2I&mI;~Y (388(Z&Z-L&l6xOKwNҥKׇwLLLH)NZEQnݺE xqS===q.^(1<<ҞZnݒnz[oE w8J%JFR& T_!&ORX, *V^}Y__vh4KZYtxfp:\zzέ[<\5v;x{FÇ2R.R3;PB$ ._b!LMѐtxjJ2ŗ.]ɀFjobHӥAd22h١VH$PK.166!\I,Zl_&l*TPB+ f9J"W D\.'K`2 GGGETJuC h4eQws6%L&%˳E WV(n_jZB:Z6jbV%5DL&CGXDrd_ wA&2A)۝Qe&I:A__,4r9NNN0L4 jP{k׮qppУ3h4X__;SVe)H033lV1>>ΟregwwWEL Az%/(F#k Ms8_6[_, zPBZ-6d2IRp!DWJ]$^,hrڵ3i !յ56/^q2f3,J2S04666H|> ™ N +o`0 888@266֓j5ݥP(Vgccl"HdNt"l)N3E>\q|θ(2LβN 8 7M&jU:u:x :wAaZeVbhR7 OS%[Su\\.L& H9::P(H/S$| Bv?OfZ-VWW裏XZZݻTg^Jկ~EPx!/VMܹCV\ΎTn6jv-Ň CCC lG8jʝ}Q&uZcR5l6v .rX^^`0pUY]|>*###2!]. /I"Z F׆Nd2|NQr#Nm7iG7X\\(I`,hUgͣ^SVjh4Pɉ7eee5vwwDR Ӊ󱱱*N+W`٨T*lrrrNu677X,x^dPc4D"dYޖLHceeE3b.n[R =n723j( |>n7VUh#assd2I0>2jׯ0 qVWWn__fݎRD"i߳ŸrzFb1(J\|Yfr sYh4p8ܿ%4 /_ɨ'J:f199h$J1>>N6ɓ'qHR,..t~zgFZLNNJ~t:b=K&Fbjy,3l}i_*_jett_$ 昙?9'fk,VJx"HFhZy1 ,.. \tI.N>vM&jH$rqev Hf阝jQq\qB1::J4jB< y\ࢹ޽{zFGGr jENNND"LNNR*d_ՈFr`ff:l6._h$Hfq:p|(/%ڤB#T!BBub*ܝ&Xl|1]FX }~+ʄo:F\^bܳh'wnnQZ1pyb1O-u ~<;t۪;!C\[E>b,1gMm[\]uf2i[tRyEl*exv/bݗ_!t"<</9O1ϻ==K%{{~ >:٧_d]s.w{u;EuV5Y؟N:I3ŵl9 才 $6Q߿~a0~F&!o233._JV}{B!YYY!q:L&ժTQu\Ez*=M'z=.]j8;#^?u[ӟݏ,ZR瓙 o:dsoLM8fH$[P{Hƪ?bR*TPCKS;~:@Tq| ###smq\RD""Gݎn5Jh4z(*E( DB lmmɚǔex<( VK*v:N}'{R!l6|>ue#ؽ{l_?$. ՊhMqjwwU~Bfa6{z&bQPBcvڙ.Q޿n/}B HCeC}?+u: x<ܻwOrgiV+'''ܾ}[D"0~x<,Fs5EX6[ 6 IR7\.S(h4mS.mTh4Rݻޭ[AV`% g BJB<Ju;Hf x#kT*ܾ}y*TPB)1,XYf#F1 02rzRFc0$ GGGa.]D4e``@ %suA r| l6eRd2I~\zՊaZs0B!BZx<.KRg!NG$B7&2 z)(6 ÁCc$NC2 8q:x<,h$H/QL/ * _E,*T,XC,X!ݻGRwߕ,X*Tb`}UdRBǂ_W_?Z-gJH??WE*TPMm emUUP͆^>j77R8H-mRB _$:<¾gw:~YtVyx=RVq:="z1Oyϰ^S*p\/T( \*PNgOYQ"k~g(f/x[ϲ|DBy? *TPBгs$[yyttԣ5<

:=EQHRl6l6ԸjZL&FGGj4 nft:3Ij^%ZT @ УQ.~NҥK*18Zߢ\.H$|8N,XVE?PHگso> C IDATc }3O2Rp a!d ޽kNz.\._:h4xLNN>kLQ0N}z==cgY4rcXb1ǫhd2hjrttl_~yPB *>?'<^>@*t iy){ڙV044ZXdccQ2 +++XVbD"A^'vt:i۸]x)qnEsqi%^VY>o6lmm MPݷmKvu`vbN+lwK`mm]:PH o[oc28<7o$ J^}ָ|.f3.]ptt$m+!]p:hbb1<6).5S2j+++ ʿp:pG%я~${r2:<<ƍl6>|(2 333$Ir/_n45QB *Tt:btj]瓓$O]C쒇jq||``0#(FFChvt(dʕ+ujSSS2BQ䮿ƍTUPl6ڵkx<Jw!c2y&nuj\.)z*fb<[[[m|M2OgggL`00>>jZrmr~'Xj<|R^V+{{{4MYXX`ddD>NCXO?%zt:D1 \v|>GP׹qNwh4YXX  W *TPUAYV[,f3jU:n|#ld2Q($Тjd2^/JNC$d2I{֣k,d2y&wBT*%:j|>wi6,,,PTpȬ"lǏc0xwt?&ˑd899͛q%;˗/3>>͛7t:011ヒbyyYJ hZn޼>˄2FA<lb2|\]r~_Rt:wRTtxާ2`Jw]F#>\.QEfJN{ ,vOFV266Ƶkרj<~i}]4 dYh%8ܺu~"@s0YWNB.p8a7F2 $ d2Q.?kM%PB *^% S_XX`uu}?~vZ: b1G͆^'Q.{n?\d,$b8akZ$ 666nn]ec04ͯ]eRB *T2h4f3tZ&ws b1W^ 믿NPѣGRXl6I8NVtrKROx8^*KKK4͞O;FtRXYtH}8يX,:A6tF6eyyǏeH Z H)V9yL3r^e5.5 >K.Çz*@@֏x/HJ("HXYYn˵ߧH$Facct:;C1\p+WKTPB j Bu) d2YQvFEӰxO8'''d2ɤzÜN)$I,VT*Nej255b!Nc2(  btZ:b=ϳh4R,e#ǃ^gmmb(bj(rCt:.7oR888 IT{.BťK0 lmm_ÁEף( Z&^ .j,//n7ӲΝ;+V+Wxd( Bܽ{ل.ałN .C6~k׮g:FO:~Wcj>+*I&b1j277'\.X\\p077nv駟R7łVnc00LZ-333|zeVVV>\xO?,vl6sss<|5N'׮]p`Zs}j`>t:Bd rMtBF|$z&''&F\.SVZT/d399nnSTޖ@zUa[ xE4_vBs5 z/_lZŤfy(J;b`0|{:99Ν;hFqAMj1 ʵ{WtHkZ.]>uppǏy7q8~7nvgӡhȲ+(J-oբlwO쌋s.g~O=9VK~ZQ[b{ ~"$~l{vٞ>A,Dp=i{r+1*"c fNCV;W^ *)H*T|^VYPM(Z]j\J^FAVfI<(ɉ艿He)yLfmm db&jb^B$pnnjt>5V"Jqrr^' JFA:f[.\Wz޳=Et:+y !5B g|G ^*IwZm#>AjB9[[ Qjgrq v;NGP>S`uu>~myLÇlooVRƍ=B%nM}?pP((R\/܅{7*gtt t:v[βPYyl6˃r vG}n:NVv/r sss2ަV1==bsR}?~n??! H$X[[C`Zϥt~^׽N?n;_4'B *TPqNdbbh4NeNB@"=3t:XVa1ʹm+Gqrrb~c4i4\.8Za6x<X,@P 033``yyX,dff-mL>l6355E,cVcccdYi4vfff0il6G!zeC8vd2I"FQ%&I)=V7^366F4%ϓdGȀV bASVylnnh4DQ988`xxXNAݦd20/^d~~#, D0g?3uttfa0ۄaN'|>^IK *TPj `L4d2ҥfIZ\.SV)Jl6L&vzNT EH=|>j]u=z(ΒH$X^^իi^3??O?BR vcF^Vejj}ױZ0==fe< H$B*b{{[%ah4133Hb1B^=Z ˒E"HH MQvS}Vt:믿Naii B L2::F!H`)$ `-U>𐅅^/oKEVVVz8N666d༽WWqTPB  d&NC"`~~t:MZ%H0>>Ε+WVܻwxT*k ܽ{L&>@Q'RK!rYՒp:gsf%-C<zv;>O:*/ʛpx<ɤ|OQ$[[[?t:(ccc9R.ew>h4F!kZ\.׋dbH$Z|>O*Vt:Dh48<<^d2xP)NjvFb4z*{{{[oax!;;;l6.\`{{[^^L&z8V+tǏsE1,//_P(X,R(x7}\ *TP*h0LdYgyppP(!GGG\r,wyBGz*̦hFX,I^gxxHa0zEx]jd ~}4A6Hg FjZ6ZFݖ2}3dY~l_Pr9RvH$LLL000pf}wdvųz;N]Eųt:Z^O^nc2d`)b~/_ɓ'ܿqO,Ab8MNX,F\,3h4TUYRt04M, JYÇ$ ln V{{{yi[QONNFc0p8j&N9!}PB *^Z-`M֘DQ(0 x<Yoo00 =ΰpFs- p?ߏ#Khpppf#ɠhp:dY$###TU8~HRRP.9>>= "xw1ò$VK6e @>l6'aXjk!HDFףhPJ.^WfN'r9v;| Zf)$EQFۓ|>vww1 hZF,{SELVK6)p^0/ sss2-766lb1v;Vxcf3VUf%, .h4ʓ'OX\\j233Fɓ'T*|>p'Ff3&!ٛp:shٞ>BNT*EdhhH:|^^gnnA򗿤h022"u:1v&!zsĽ d}(@?LNNr}>cZ-DQ#rmZ-PI*fZ&4 rLfDl6!N,|h4~?LLv?{o#Ǒi>}fDF7dzzz|ƆXLtuut}Oo,)H$ad A"l6+>;6s2s39o4M}uEVR\.p+,+Z *g0("l6 bp2t]GQ1],EГikmx<v;ZM,dߛx^?Q.L|XUlܧX,:ZM̺;]TZBpdBs[;dzvUU"C/a h IDATv\\.1C{xvy̒?f``@9v àP(:}nXX[[ÇKx^1~Lai*jҿQ(x|; s8j5!Ţ(i*RVq8.Y*)B{=}/.@:_R"H~3f\U @* /d]bavyZ0^Gt _ }ֿ}d نlj 6!_^DK$ȸ\.^zkIQ:;;w-)UV)\_̅$ { !Az$r,gk Y%, @ $j6%D"|M"HO[=kerK"H$*@$D"ů~j`D"H$ u DNu]2̒^WzB$EAK$H$" _jK$TUxRw0$ (sݑ筠}[Vs3Va۟X7W 2WV7WHv D"H$a(BKKs t:MZcazA Qr]w: x8p7j$uס:ѣGXlnnrq_ZF>vcu\.fvSŢxXV"^3??2ǎVaVhsGχjc.> Z0PT]}glRf#  - X,|>XlPu<+JjFTv?վdYqP&'/bi>{-J$D"(f{1cٞ+@jˌU=$ C\. jK4R0e̯p}d߾}bl41CLOP17SǏY^^ȑ#|>,ˮ6v^Ǔm& 3m~T*~xapi|> S.j .V_YYBOu?.^͛7Ž8p/$BI*bddbfc߾}$I, LsFy饗p\u֘]}ɭ[VyFGGd2XV:;;)R)9w>:n|R*fH$D}Jw`rЮlmmS!@Rq>L0aIRJT Noo/`Y* \ZF__HB4B@ nC^'011:!4McrrR餿CP`rr|>ᠷwWqj'HPי`aa)q(XV ,--駟ryq8~U[UשdW<exwikk^c%DZ&;z%ܹ&r%zzz8x b[n6kkk$ 9"^.ng8o-B2 }}6kkklllpP[n:&SVI&y2 G!Jq?fkkL&I Nűb1.ަyv;vEaaaf^/==="<~$azz ap/,,,&ꀦmt:ٳgmmme鴰;Fu6e}}]lsR 0X[[(NcZY\\а˾1ռj5a[,8zNZ!y;m 3$jO"W\!Jw6|>^388HVcss(333mmmlmmW]Y]]Di޽KWWdRO?JMhjjb~~288H0daa]׿/&@v`5* WfLn|`SpdeeE$Qx<8NjbC?6nEQp:(BTnM#לX,455Q(vxÇeZ#V+6m$b YYYV<9v; O}UUvczT*Qn85fa۩$ VWW|tuuXYYrǩT*#=**ByTU;yLcnOzϞZi&nG_`0v0[[[a:;;d2VVVDu4>t:-~z}o&ܺub1nf^W) oEojIQ`)<=GCwO˩S( \]Vq9.]ď~%@̇xeev;333466D,磿_T>R/\`uθφߏg[[[ܿb({}Rx^2 }}}("\n蠩iW?366FZnepݬDطolyl6tf* tuuITᖖz{{Y^^fccMp677ihhɓ8RSSSissstvvbpdžB!* }w! CV|Gn˼T*qmzzzxzcΜASSSU-Qd2)%D=( <~Y:;;Q\.jt:q:v^7Y9N\.׮05=>EQH0s3<f~~/%l6vݬ2v&l6* kkk"0 B+++xd2r9o&*r%dz^ffff|>s&3ƍtwwZ cٻwS3Okދ\.'^ZZVa(ˬDU*ߏgjj Fww7d2Qx<۷! *`۩j_x^V.쒍 133n>Z]]% c=zY]]%;=ROڮG\.3??OCCVT*f# q[(X^^fssSLfK&accܜā@ӉtJzr9o( *G$#m; }=/'*;T*>|+ԄfrrM&Ǐ2v366p233 :.]b߾}B1`="p%4Mb;wU:::X[[fuT L<gaaA?:胏>ӧOcq9n3gΈ /9}4~?PK>}i>CN8)cccB}}'Od~~Ix bع[TO>?LȿMӘfhhgp8R.nc9z(P,7vu]\.311AZ% ,3xll **(H$69FLLLrۄBdLNH~h~޽ˣGPUO__b9rxp8No{?ڭ?߿c;{}CEQôHss3bQ|f}}&0 '#ڄi|>y^W̺b119w F099)\}}}tuuGt:O墥⥩bV+]]]twwkt:…  8z(nbjj 0xWP7nNill7ooigϞeeeEQ8|0ǎcxx<:tGny'%D"H$IVcbbMߢ( W\abb&_[oE,T*aطo:<`~~W^y7xL&éS ϓ#r˗YXXX,fyw;wrD"H$D"! d2 BA2dccJ4%LvTU{hhh@QV+6 UUErbH?~I("J( ]]]DQn7ZF^D"H$D" @ΕJETVJVP(:a:LMMq!r:STD-]Erbb`ZO#D"H$D,@^tizl6Bw% bXZZb``ǭ[~:x]Y^^Fu`^հX,v4[[[j5dH$;wPUjJ>gϞ=yy$D"H$ƨ!>׋i?fbbGQ,fqVVVKcc#gvvH$B__kkk*djJ,CQ].cddL&ñchjjZvI&"\+HJXD"H$?,w'mq/Y CEٵ@(Bu 23ٹM^GQ]ߙ?D"H$D"煓MzXD?) hm$D"H$.҂H$D"H$ߝ>H$D"H$V=l3W~8!_;v+t]^Wy2o3oڢk&]}mWŋlmmԄn'pY>CܼyS,8<VH$" \.O&!Lx\oج묭qep\\~χ\vd2)geek׮H,~mó^S(vx|}HR9s>7orp:\zEQ/OJ1V+d@ <;;HD-}Μ9$xK.7 ~!KKK466r(ˌH$ze._;wvIRD$alllpΜ9Õ+WH&ߨqbXp8A\BZ%ްzTGz EV:+3eTBW̆"=XD"|K"NƿW F:&NS.oj"W^RpyI&TU2@&rA,p`TL&px0 |>inZD4l6iXut:M0$ 6I?s vNXۙޑj&R`0H(0 677) x<b0ju t:jettnzzz|2 s=0/p8x^J BB4q\1 Yn߾E666jB!|Zdd2(B4ie~?HjJICCaD\FUU4~Xr&ZrDR:aq8Eb&bZihhuMj7nܠ^T*4Mceeq!͙w<^WL&C^Z^UQ]ŹX,bnUr=zGܿk׮qi0 T*Be24MT*rxN̰&SeΝ;$bD"A:FUU;F&;v '|6jJKK 333mΜ9C>GQy饗3p8hkk"i{{[ʉ'hnnP(0< 9‰'}6R ]יdkk Ǐ9y$C^}U-yQbJ_[X R"JxPd|۩hrZsen<,cNS{C^U$D" <PhW,(x^D(B/rF*b5!,0?τwi"wܡQ{lmmV 8N~ӟwjrY666l8~m*9u>A,,,vC8ZDb(㴷s|H__yXq:dbb7|yٳΝ;GPϘ`bb64MSNqEVVVxX]]ƍ&/{i`w}%._́D \.(ˬX]]B?|NO%RAU,(J c>-VBRO_nyYáZwZ[תXU K) 6Qlx|] QH$DhẔb``@r%^/s-&''q:>|6VWWI$8N܌$l6q:aHD""0 Ο?ӳPVX,hkk˿djjK.OPP(Ľt:B̙YüH$N]fw^87n`dd3=1::J6X\\|RcppMMMO Je4M&ˡ:RM4M#P4Mx n7OdGe35bv,)Vkuv^U`U,e ϕyk-XصbՂXTШ ,4ErCأ(u(dK:X@X(:>U+H$yc Μ9Coo/6 0|ܽ{SN;wdDhCC.K̸ BA.^Hoo/TJܿ_>mll>ŋx<]Aww7"\.:‹Fq8\tVlnn0==M(unVF.\={wjǏJ(x<\.qUv;= 0f,--,^f cM x<N'vbHcY[[#Jt:iiiadd0( ?.d28OH$x댏&LǍ7d~~c.J,..fY__Q655177G.c޽Vww7𹗳ioo'FO'Cl3( xWS?T)H$B<+/~Pqʯn8ĪXV :6|%Vϫf5| ur5BvnZ'jb3 FW4$Vl +#bd BW|:QA7m ϒH$*p8Dlx-#&KϮڪTu,G $_-:<-5n=3eo3Xȑ+V֭TSjDa-ST|>jtMj=z: *h&զj/QmK-՞UUelle^*k{--‹!5\EQcbb~//oUԑW.oowdaWUuP[S/]އ-p^/Ǔ IDAT2;;o&V1(/X^ ^cR(VB ^ېJ}6sssRhllwjMMMՅVʕ+ttt( SSSpUY|]qEUU7n`0?5 'N… + VATPATP>y.]NbQW㌌ fL&f \.|~(.`XZiY\N`0Bddat:M2p`6I&iz=.kOkEQd2(8 DFh4R*byYd2IϐlT*d0Lv, X,&EQH$8N, Rx<."<?V tN"p}l6,kQ*X\\dbb7|˅T* RIAF}6F?V\bHXt: ôЛSQ@* * *0P*zB!^/}}}hz\ru?~HWWpFL0|;"ܹsl6ˉ'8t9fMZ-o&fvvt:Mmm-|F3::N_w2777СCI|>Ξ= CCCh4._D"^/f˗/NXܹsqݻٳgY^^&p>STUjr%fffT*qyΝ;_5[[[nN*+++x<N:%feYz(B.Cc08s >G=BӧOX,\z͆ԠhD"XVBIrxDU=ܮ?%3d>c&PWx.Jh4ŕ}~3r}WW'?d\j狞|?W_+o׏ojz|5,) ~9(J3<,䝝('O?fnna~?NT*石FP LOOt:鍱l+KKKRWW'Mp1N>ennGb+\%?UUl6f2s@yBTUU+2l64 r9>LTbttwyvww+111ɓ'tqQ:::3|ֱ>_kf"`vvvwwtXV677immbԜL ###466:.$Ihllt~iFGG`9ZXXX,Ǡ_lH$p\b6ijj"S(hduu[nESSs:ȑ#G>+++[h4N'nSWWB̽{\x1$x<giiX,l&I" b4Y__gppD"(D") p8}jЀ^g}}Q)$IjjjF={Jmm^xT꥕F# c`l6( 266@0|%OB~vwwwȟt:4L\.GOOy7a~H&LLLHAczzEuuKͫ,//4Dq7$۹*6zzzXYYֳMrnfffH$?>!ٗ/R~phIaaee{ ~9h4dY R(dA*jqY>;Z;C ޽{$ dY޽KUUΝZt:-RnԩS\t>?9eܛk2ҥK\~EQJ.1"Ff|REƒWJz=\pׯ^ LFƱXJ%vvvҨ\,fz NшlJɷh4#|2 x뭷xz~|RYD@Rgg'6YvwwepЌf3E.m2 NE"`wwVd2Jd2, NSjN TLnxHRL&t$Fl6|>dY, F&J$vF#dbd"x^n7Z@UU- [[[\.&bT ՊfT* T*n'JFh423~ t,h4ֆ 211@P(nT*L&yQd2VEJk*"8dzgr92@-N#Fᩩ) L&Fqw@<gllL IV!ךlp8[TJW>*:˳~ggG-^WrE{, t:V%ˑrx= h49&Ih4J<P(+odm<mllP]]-+++Gn2H&jډ20vW<&3>4>I>|HXDQz;333@UU=`0xx [[[d2||gLMM100`e?2;;4:tH* `0p8mssXZZ P]=zD J><`ff6daay_~%SSSx!}}}an7tww300UUUvTUezz7oǩbaa{111!P\"4D" z1L<~iݮ`0U&7 ،Z:>M=a9X)pYf- xҿ5Och)')"\6giz3/XT;hx3srLfqqF"/`~~ݎ#Kooz,,,' eza"5552Fa~~˅Vebb&ݥX,g166&왙%%^-ꤠ뙞 ^Ooo/O>Eբ( @8]]],..d2C|> "fyy/NM?|>?~Lww7KKKlnnJ~ddDZ766I͛7all UU1L|LMM188 X^^ݻ`355%JG(R@/X,a||FGGd2|>|r_gii7o2;;FaiiǏˬ)###ܻwII=ꫯess-at:lV*F >}^--<޽{[ #L֭[LMM! B yMOOƃPBÇIӸ\.FFF>SSSF</1~2 chhfcttTR)ݻ Ũƣh4ʝ;wx1sss`uu~6~hTkllLzӓ$huBXxdnDZZzn߾ SSS2!Dd[immeii;w099UUU055EMM gϞ4f3,..2>>륮P((|=0>dww/xd2199fҥKaS(@?:tfvvv`qqBUU Huu5ÁVJA昘ٴjkk"066:Y~0$S[[rQ,( B!VVVrLcc4Dw4 444`KCw0ܣh4v; 388՜|XzTB:2'_T?rjwc%jl: +9=;|9anҮBOoر?,nhtG9:&f-\xQrPyebbaq ;wL&|sss{Jww7|x<n7 J/JD ,..`8z{V VK(QnXqxj}]?~9}4Ν`0p5677%G<{kkx<{n7nݒ\.XАx-n$bRf|ML&'NYJԩSqܹj%sIx葴  DQyE"<|%&D07xǃ`0ȠDqH CCCq_NkkG+ \t5>|H[[ Ȕ/B.O>9К%5F"El6K$awwP(ē'OX]]Fz%x<tttHT"ڵktttY]]?V jjjp:weN>˗y7lEHCCC9sNǛoIMM'ϟD0\~V_|>F#:uJ^6"sssIkJ_}ϝ,=y$ۜ:u Kww7hT}>Zŋijjŋ  oK6>c}}fTUeqqo~8o.pwyfggy䉌M5Uԅk׮IE/H 27nܠQilii!1334F._ߋ??h/)\|h4ŋpG1??twA2dxxATҥK/T_.^/.]&=%VxZ-sԧK.qEmz=/^Vz5)N .p9 FÍ7СNNFdٳ9sfO{- ݎ IDAT/C9N>=\&W^3 k={vO{l6sca2pžy<\"77ŋ* _6o՗R@Z-\vL&í[eokk@\.G68xkkk1Lx<`p\]']9 l6CY(peYEɄ90hSczz@ !J+PŢ+DJWe.#zl6KFjJM_8~8Ǐdؠ I\ۍ^<c,CTt8$IrUUU`X}+T]ͤAӠ&6LC&f-NUl'8^g$@᠁fnf~bHJ~I9:^/lVI*f3uuu{uuu Cssh 2::J0쯪*XQZ-RI9=rxeffCɾL?b ZKBvǃh4t:سbx8qBEQX12*Ux;5IQV ^ncZnuuD"kF8Kړ Jq- ~\8SSSB!n7---XVI}S]]ѣGt2OkP( hiiM_¢$peB!b?~h4<|NZ-raZ.--Sjkkfrի߇4:Ʉc)JRtRQs*yjjjhmmS$x<+x^ /)I|Ass0 :(2|SS󗅧(ɼ:,[t: NillU~. l6۞} Bb)˅\.VVVHR8qe֤GG*B1x0d~~:q'!)pbE{%3ٷ:&N4yhkkTe| u޸zAu|m~~w}˟0}/zCky_ߕw= L$R BMM$gOX,z8y$ӧOldYRͤR=Z8Q&?/ N=y{?Ʉjeff^/c&EBxA355ŕ+Wix<~?pp8,y8aeঋzI!b!0+ ,ǵI(@jxJ[QG}>ٳqt[SSTn`4hh?S 4 :F%UcrVRa#Ynְ)3`5iq赚5t:LOOt:Zn$Fe]ؙfQ__/ϩ"l:!P/` `sse'J͑#Gh4LLL<8 VL#:1 *xڇfccYN'Ӓ)@VWW~?AJ$333bajjj>H$R1BfYƂjzxX]]e||\iww99r>gttd2hHRd2L?,E=|y.=tn7& UUt:M8><{,eۘfɡ3dz*緦=kG(q|^m<Ez1Eࠌއ.YLKĈtfYl6!! WFQD r/:txz:?P(rhmm% qx<wȣGxҒ,.xAf2tO)ƭmϔ0`d%͡[-i01ps4EbMGȥG}f]j\.>իWjҊ)b{DWVVo-`0۷%N B9|T$9t)Ξ=KGG( `F B^#bB须X,[oEUUJ"޽{$ jkk9z(Zw233CUU I{]tI*š?~GAUUn߾--UUUnYHUUL&ammz@ 1p8d.222™3g;wɓ?~N'c]MMMD  rUz=]]]ԍ\`0H}}=ܻw%ZZZN'`ccc2˭[`0J,R[[K}}LP!w$---ҋFill ݒ+f6gxxNGKK ^Bh͛ QSSŋq:-ltZ02EPFą$2W]-O\B TׯX]k9Er. blX1/)Ƭ|\V3T@˳8EU45hӀEXtZ(3$_T~9 g^F,8Z9bjT(1nbLŸh81iwb.Ŝq/SlAZ>Uї?b|ϗ[{"xxaak׮I%;ֲh[*k<>ߵOT^_bNʹfǧ|]P"K*r;|\߫TPA?rB"----?SCz1Lo-9"c@"Ν;r9ie{UcK:ns5")0z9}h2?SFW m:֙]W\.G__\v_\- ~szzǏ¹sb *RfVD_%D Q~[MWEmN`׿qFi~c_F]4 D"!S^WCTPA wτ?X"^zcۊݼ19iO5UKaνrusծg_9_'TP_^)!ƒmmmZF,#ɠ^@Vue6RUommQ*H= vvvdjXԾmmm2D"XVEb6("pX|>:CP(hB>+,XtZoiYRBDl"/}LRb1^< %&lVGkMX_@%TUHdNj4 JJ$Ydr%ON)a5i9Von~2A*Wbf#ߡ#ңjI**U݁w9Mƺ?"Ex4I)}f* ~xJ/{!cF#BAfstxb`ȗ\Xdmmp8,X,,aEQD"2}mzzzd2L&)TԳbƆsPۓ$oɠR'Q@DE垞^Z}J,B@#N% 3Q(#=g4>gfYLErpcyo5dJ و)<]-iX(|9HAKIo_NNDOAyJ^h1_/3PB8=zEQp820ɴTJ <^v%p1^/EQd{EQYn+/&e:;;9qbl6ӧOqD;BB@&AQYܳR(dE$iooj 9qℬfh4"Ų^x1r}`s*\a0hoo'c2˶%U5h\.'3(o7?QM̵hSObDV1nߍF#tqjjjdU./rd83ϻdڳgD;_f r|>^d'"3b?qdzVGdh4rE^d#J %jR)9srX{ԊN3Yo2@,cA!(ELAE){1h5pyVKr>eXzz JR,jTg6CSNǨV Tox:RE62ݕ)%U^{wzYN=UMJ6rbg-JI%WPQ7.?׾hEB SĹrF a6eT*})&H;hZOOw8k#UWyMAd$Ky _Ɋ\+Sf Vq?Gͬ&s^"s"ϳ~PhZg`#RE>,ׯ_>z{{QU_P(ݻwYYYa}}!EԠ˗/8W\!n֭[i.\C듅N8AOOSSSTWW (Jpd|>ݻwƍy=z"RZ@MM HD 6_|Nbyy.v;.HѣGfmmv+ws@ `hhA(bss{Q(X,hjjbzz:;;}6333l6dݽ{g``/r嗢v ~.]  noZ4 T>IZ[[yw믿^Jww7ckkx<,L@ ӧܾ}'N룶n666hll?djjQf3gΜ!ׇ?VK*֭[={VT*_J֑BJ.cppNGGGO>޲~l6ikkF$N7$ga0xwq8ܺueZ[[yf 677'|BT7ߤ^#,j\zǏ#0L|G8?~6l6zzzj\vb_|! Y,ܹǎ… 322q3YLƍR)$ R]],}29ddFdRNjZ:C&Iq8XN{ KYOfHKm1+ݳYhTxNep)Kbll:;;y/H';7 VO?p8Lgg'W^eaa;w`4yw1|lmm{縎339' iA" F$-K׫u־[[ ػU[w־k"mJT0  09n@Piɚo9t~NoJ&`}}ӧOt:tri9_RUU+ 333,,,V9usssTTTPQQ0ibRfccW_}ܹCWW:CMM _)ѷgaLCb\XŎU\\eoq(Xx,y;uۗuYק$Z"Vy U~m._L^^G!Aii)XV_* ϳphmm۷oNss32DJTb2XZZh42??O4񰴴"Ѐ茶0pZMaa!CCCllla4۷4 sss8 p88p4*r۷Zͅ (//{NCCw%˓`0ȃP>n2 Ph40Xr: Kuu5R;`4)//gee۷o)X,TWW399@LEE6J cDc(..fvvGMMLwܬB!YN >VuׄbF#Cܹp<^|f3tO  LJO餡_R)ݻ,hN'R{FAii)*&&&X]]% P.--ϝ,--Fe})..9w$b`h43^OYY,//hx<'dIFFFB!RA޽ښ4Vl6eeeLOO300gcc`0H<T]L&-Bp:nl6@@Rq[B @.qF*<-~?[[[\.62BA{E.5WF##i,jkѪ4 Ku4i'3)FTi'2-*lj(?Ȏ|74' txPzMGGGQTСCx<?K/Dss3ӧOK.q@!r0gΜ! ޽{… ruQ#yYxvCb0h4d2U2yqqcW ;!?9DS\ {ÙO"'XL."4GZQ{fh4*DJ"˅_<[jA%XYO$dRnd "YEbsIL>x\.n⹢^4'L@mDYDBƩjz|_V;VFm&PM6UvghWA ,XD`G)BvD{E"oz^^~l@=f! ϙSUJBhKcQk`3o(ؤǼg񎂕FQ*r숱P(dd_cFqR*N3;s=::0'Nf?il1- v6C%Ɯ`.]^LLLP1_>Qwq 6tX7& BGC8ӲxfRe+5HR$Hϥd8K) ^Bx*$ciP+AT`*D*AZ&DHvkﭭ-ݻ*ǎ&Bd>#D?i(g[F̭%d5Oy~]ܧq,'\?Pe`-T}%Zփ)F#ۘLH_=)< JՓ'ݮv~vn> Wfy[x֬gb1СCaq*ʎD" &Fzsx|(C۞PHx&dڵk⋒7xj!b;Cgg'{eRot:?ӻ|>^ʫ?g=>ǎCRI?'*~Z ڒOk(vO䭮rq>$Qҟ 4C_/biNH ((//m\>V[d31hQVfnJ%TTT<ȤiN'*."nnnjJbl핝:K*J2Mxۄ!(wF !BP~\E!H\.lK=Ee;NNNr =Ęn/o 9g呗66Cm;OVy P%>68Dz0.s>{t:ZZZ>ӷh4iooI6BŋT*>|Hii)o&*n_nԩS\|s177OSL&oYZZW_}urfggٷo~Wr1, W^H$µk8s ZXV._Lss6`0;# XH3QΝcyyBY@ +Wy&TJY PVVƍ$ ;466E쭭-?ӃFɓKti+~d2ɭ[ oݎNz^yI4zzjDMLL{t>ILP#={V2 ?E \.}:͟@*xJIT />ie2L$s/5LiyyAYYY!Nܜ[s!Vm>.I|>+++8NF#n)ͪdssD"!ñvS|(hZ9|x:{&D\`6 QO>b糕J%D]ޛIDAT)nܸA(ɼ v' lA#lO$$#JE0OuK#3 ---in߾ Ǐv ]]],//KqOSA[A599I]]h> i p}V+N377,HW^yEww7CCCrI&pQjkkw5BD[2`0p]<011!4>?-Gcc#h4:;;)--޽{iK.100Ĵdff:tɄ裡!SSS&/^dmmjv;mmm&eFGGiiiA388('>OUUREuhllh4d#SWW'cD|+WX[[FFFqdV8 裏X\\ /T*v###p8gnn%J%mmmߏԩSh4_l62 \pt:^W2;;_vP(\rwJ&/HӜ:ubpPZ>:7BOڵkzG68CCCt:wv^|EVWWرcG$"fllׯc49qyyy\r dff.'O(gC9J%---\.\ƆSFLOO+ ۟+6kkkn>|db``Igg'366Fyy9hE0߿F4Za)F?t:)))6u>HfJ%ccc111A8 FC իmZXX0sss9rP*ܾ}JEKK SSSvN'*J&aXtv&X,cٰlR)ZPfFZ[[`0/fff|o;HR2QP088BZ[[Y^^fkkX,磪uFFF(//t^3??n' Iϑ#G(++cyyNMM (J\.<Rnzz'Nd{.eeeVimmeff ,,,I(Әx<륮nz=G!H0;;Kaa_gg'`))|dK .,,rqav;ׯ_'LRTTCRIMgffd2gffNjkkY]]Rm}~~µk477399ZFoGGf.REEE,--I6\.3c!rKG:!Ipq|>h4|>555FVVV~3{=<Ǐl6裏{n߾`2_汹}jj{RRRB0DTw^'*))nDYYJO}}=%%%2aƍL& G].]BvillY~_sM>LKK ZVG8p@ZZZp:lmmEee%:Z-6M&䗖2::o~zzz蠩I&_pGaa! p}]RnZ< B$ 8uII LLL_`6)--ϺҞ9Jؗ{ dJ@K0$LRYY)=V!~q=ٻw/eaat:R|>n[|*J,I=My'dB!:&LOOL^zq:\~V+s$،j<϶0?x mmm2<w}WkFL&zlj)Xe6/)OݻwEիW1mUܹsOEELLL Ff矗IF۷o磸ŋGqS^^·~(HGG\r`Z줬Lkׯ\ˉmdd4Y\\ʕ+mcGVvW:@GG<|h4J]]P*l3:ڊ|2}R)L&Y^^T*)((h4WT`ZeY`el6fE"m'KDBKeYVbPA0diiT*%s}hZ h4,,,h4x<% F#hRhgY]]ctA cw.B!Ɍ 1_I97 duT4,3g(#TdD4D8|Ss1U>11!aE__MMM6Vs`mmK.IC=3r!rgvQz@)->u#QD!nU?u**C9;)>=z2vۏ?G;W ap톯]4uV Tr!r0׿gB禞r!r!rYAɵA9C9C9 g9C9C9 \C9C9C9$r!r!r:ic'IENDB`muon-v0.4.0/subprojects/meson-docs/docs/markdown/images/sdltutorial_01.png0000644000175000017500000016564314737503617025700 0ustar buildbuildPNG  IHDRJ!zTXtRaw profile type exifxڭgvc9c=3ص zmP.eWh(1;?kѢV[x{x߃O_)^yo 'Bm}=1|cl?]F)| a]](3-_zOa)~]ij|j_/\6b<)$gIK'"K{H9+SV礤y?ۿ}?i}5oS|?I{[WsT"/?ZHZnan8qs<"Q[K5w&+XSO|ŴHo񯱄wnB;Xo/tJ>}R̸a(sΫHH^}OyMd^~~.1-|Ֆ(D'^h<~z-uBĽ9|@\4q`79BrZԽyO ﵠ`ThFSs%fVZnRjjVK^GK-7k\mh[} n:݃1L3OefcQ>+/[ek'vu8PJ';N?Rj7|[o'|y·ŗ)5ZK)gd,@ƫ2@AG̷stJr{+,2JSrvP`>! _!o.osJ#sNdmmOeHmD]s(Ǧ.3 b/SVǷay8%m,ǟ}̺o q{OfmxIeO3qZlTHFK̂Ync+lqYv8[RV=-2ߝ0Aa0c_Wgڕ::}<܎[ͧQc\aW{: L0!rvX㲪5;=lmtuIQXyElu}\jG6 R&Lۈ?{G%\`Bys9Fv[Eksx#I1x$@VO7y"jS2g1`Ϊ;dc s^4,O"o~J[\ID]ߤ6JL<;"-.?.#X]:tOL1g%C[nݕ9$?5]"ݱTDM<ĬRQO[hG.].Row󀸁Sbd}6b$ٖ.5^1b;蕸Dg4=ҢRن^=0 E |rpƭĒ]ܷ?/ًK/k;:n5zn3ѿ5wsn?k/p?be$.|&e$.$O[ 8^oVYE2ӻFJGuw~D &onHNvQc_A&o .ziD+p&TTOsbP09(BHa+ەbE+Ũ,BCWA.#WHLԆ1u$)^V ε!Q63@.An0@"LL LB}Pͳs̹džD"3P`5Upb ?}NυM򡼣M&H15!fTԝ̢pȅ;w#=.:#+TKV .7 ,=TPKLMXwư,yNARK =g2:%@::CEM߰LYj*\kDfqA`\ae0N -c:0CIpO(/vŪx޴a\: ǁes y[CީRЊyv)d>[b0J 4wq6APO s7P@ |%x%i\9d~@ @ӡEp o7-dcd) ?bš4AMPdj:SKOvuR_U%"t V(|7^20[c2{J"a^Nx) ZBؘ -T)C0 j-@w< `Ŏ@RZniQh7"s#%ACAFP8p#X}2DaRgg .=C2arϨȯAO2@}"TDkP?Nsٝ>^8HD-p|M.v!KxIk[@u+- uqr离;Zg i(TuVI :KåE*OI9`t@6P\HZ# H.bF2K&D&*56wm(ك\p B@WPܠ+bCht-tmpv%%)1t\mK(4ݽM p&bet4ޔ8n֛MrPd$lGZ8bqF t)H|MiHj;j`z @)ű" ~c:HhxǮKi!J#'r 0>KEh 1! PV@P9 VЫv pēx/` ܶA梺lY`1SAkm,=E.` Kc9M5A#B:A*&Y@ o훻y,UG'cskDj-ƵS'gJ̈{so ; L &@:Ax~b`}?)Ҕ傱6[ RWub>0~L{HAZӅ}Us8Z1[ymh^褸Z_WrHGU%FD~8'иZʧ$ImN@:Ns9pt/(r#Q7S iz╯ƈeA՗VS!J!0Q%$YǠgrŰ&\sCjGr(!V,Z@؂l4)}clR#^^jAU{BaWJ9IREwQ-GCSy3L%#τ*@#PܓFƌ<deDV^v.\mЬ;A=I!OtM$`44T&~p+67 %br| \><nÐM!G1a\F&sE`֘>ml">T+-F+ېd[¶d#NG> +6Sn$tFGK ۼVڏGH1"/2bɳ0UHADr60dL9-ͻQZ?2釓1R8-PX%Půju@k(5ɸhACǓS5zAa{AU/ 8Ei5Bh 0]4KLÀۨaHR99◅KTڢ A'@PyvZEShgʮAqQ:<4/<㳁}:^-Ԡt@X̯<.L !?.N敞!a8 ּ"6 a;99 <BE&M@L˙" .9:ˈ5lKi%;-NqLђ@|'0@vVanхѩ'JOzZhm5Pun>h폗RU 1(1b0HK[g"`LJgtב)8AN~5 V -SNMZvBpeL3a)K,ȣcZ kZrF0]R:uMT@07Bi[+Z֪_ b J XDj!Ӭ  x#Pfy.R*Dr~p MXiZ @x5i/,^ l9F)ĬXi MdB?-W:: HgӪ5Z4S\Ca /0+=)"pF" '10Q$2p^  CK ެ s]D5ش/ֵCWvt6/".6*3 G%N1,ɺZ`<ڴ6H 0w)G! =B5@GTA J8N 7,@*>ʎZf,im~W8r-OJ`% 9tvA&vG  NdH`p&N?(#Hԣ`M MFŠ.E^#o2Q'*NB9$(:k&ꍺQ?fQZ\o-3 5CMߎ(NҴY;j`ЮcyX=#^~ZSD՚HrAGQEv'H4`^MVNnNc"&RpJo,ax*6Mzz'FJ8*tl6hjj)+еӅp$b0UǕjкч@{Hߐpԁ+R3V*?BоHpJ> i<=MрRZچ\ۋF wxێ:욀Ǥ@J, 0ղIsjhK+NT, '1\;֎fzc,LM[4 s jU-Km]Цf[d;:s¦]Ju.7:W>+uQ˖2:VV[X@Q 7WJmjx6$\ET3EwmCD$͇ÆV-vE7~KtjKxg$y8DJRCs0Q1;A2_IACx VtIIEK^k4հ*bASsQrnv P:j5 T[:g0HDiy ~Qk+k)>:q6oH2 ~gcږڔ|+Hc- )7ԋ(]|:w9ʐ{5 :],KMlb+ 4#cWhAzķ5 Uv4tlͿ/;r.0`h[Ejfk G2ڴѴ0#kUl0':Z+.<"F֏vt -ryiP1ld-AbD@(oȸCf2[%*O-(i-ˁ^r1z@A+3 Hҫ]Di[[KfxQV4;xGT*d>ۺU=6A,"Α[_h+fQ"1U> ƁR&> <$mQvjl/NB|`6kjٴ uPo_\a ;t<FDbHu/:2ˈw-P%HP[`(e!r m! ^.^Mjm=#6%kVoI{쇃Ü"yH@v%'y }bpD`:.}aմlo⺈N hϔ1k  Z.>!`2TPBPl=̳hJ:E ݴe,(l: ([tyG]JH:Y̕hx#>ӒE!2.TJGjji3k wzmjGIڱK8+ .YK6֒L#ߪ0 K8BS+uAZ3c|Iq cb|fqҴQEIuMh#sYAF&-- h;n,Y3:XxdљsMV [u + F"2[K:_5u2fTF.):o.Iw/DנćGY'oPUD[:ʬ#\p];M "$ZN<<$i\8Q@ h*=:o}FASYr@/a6߰k40Lz|+.+13A(: B@byq֮QY8L]Z!^Z+ ḫWx>k-LZ (Ԕ hQϻ3?.6iO4,pI䱡PIժ!= Tupwtcz&6Uzga0C5ұ pb>TarR# x mnub֖ kJu(6±Wh]0CDNA{b&t|85T X6-X~hNN5Qkw(+3.iy6t>rOu5E0֡TMPr|νte;jFDBj;W)хMG٠3 Ċ'†MPjyWzK֓?UJij:ʐKc>ut0;ZkOA['O][!:-<S{ͱu ^=k~>XO6wph1u#Eb$~콍km;u =_Ui{ǯ;=滭VJ~NH?nG7~{dݯguM:6Y'ɺ?IL66E'/BWOW4[@5G1M~] #iCCPICC profilex}=H@ߦJE+ !Cu *U(BP+`r41$).kŪ "%~Zxpw}wШ2463˯WA@֘,cV_.jb@@$aiOm}(+*9I$~όqX,uljēqU)_yrUkuOpA_^:!EH ]'BΓ>ȥFyl@woĸN/1 vfqy+hӟZlmM.w'C6eW E) ^Z8}ԫ pp({=}տrxbsl iTXtXML:com.adobe.xmp @bKGD pHYs+tIME N IDATx[l'o 43F4,iova`gHrEcQd@`eDW9fDb]lC6&P9ކ%.mnl7yڇbx* $f]~UNMR "":L^{ w ?OGO~#G@0[DDDEZOj~##8rH_f?5/F~_6\8OO"""""""/O@DDDDDD`hiUUY DDDDDDD v1f7`=DDDDDDD޼6e](&"""""W+=8ί ?cM e9 _x뭷o~_=+4߿5wAS׃q* ;M~oO[O#ua v<Oq=hY~Ӻ;LZAm Zǝ&mθ88Qۼ,Zo5~JDDDDf @07M@0_=[`[u |ƓچZ'?4N?bNډްl- . 8kOw;cOASK_w^ެ'׀cyݍ; uctν{?>on»mrvil5j彃qcZo9=>=_z뭷PZ/6z ]Z/(>xUp<WO\m~~{_{IESxx||_ ?؆po,^o|cqon\<?~^7. m9$ri[~z鎃V]^-wƵt;ƛ?",%u)%c|E^߁փ [ S-EӭVCmX:m2 6MQ'5H _9,怨r §Ƴ3OA-yx&sobN(h2{TZ- =yx< &w"xKaV7_fÏxIHזjʹwqNuxq[i\oXyO+ll/iޠ(n{mM{/{R xx>u>^׃w3/ۧɾj_l&ӾN?||OzhYDDDDpzA~aeMn {w7H_?\z؄/.u KZl/ezk,Ox,Oj}.;1UKkX|tT^/jݓ{b kO,];m51`Rn3f4۷ytNB ?6FDDDD6~뭷Zl_i=[OnDâ18DkI{ג? .bzaN'oA>aj}),+1@N#-O`IR3Ԧ5bvÚIxrLZr w/':''A~] oUgoGp.k؏xt^h( 17ߵkc.)mڇtˈ=Y4ޞz51_ŹE#( ^jYuU{nY!&=Nnj7svlۦzXR Sϝďzsm_5~!p# c=Dkij5~t}[MEwӞbfJ )72śEw/~ecz@_wu#͛/vk_f?O-.~g '1ѫ5A1iسLDDDDDD1&faQ=j """"za1&""""""b0MDDDDDD`4i"""""""b0MDDDDDDwADDDDDD//^]̓=DDDDDDD ^`ZJP( >SPm -{ jRՄ[iqADDDDDk?LeU#0Mg%dU Ne!6;$C}ڿU&'Vkk/pcٳ[K&.H)es2wsq:ܚ. /cgy(0wvS̐Тf 9/vL7#2D@l Acb%zppqyɕ ZhP- H"mƐ|rrMDDDDD{H;mX {ˏUl;Xڂ9rea %13> P@3~-P!7 @bZŕW,GxKK9`c[JkЫb`j7F:lio #zv_^o6شgs_O7g<s.~gcONq&"""" [۪@2B҈,٭nAf1ֆ R?De7̖JD2y*}Pcp+V?L x&vX?q$UIKx$r:N(lVm&N 'pli]5sܱhok׮z]L[_@68E.l M{́^E^i  R 3pX^%+f2̀!= i˲M1aIo&{ Xuml+gu Ȏs?CUrwa:+p཯pv;|;4] VjZ4SID__E`l&ׇ>wUg~-PV8SZP߿-w'.M4 :EFʪ TP5#Ȏ+ k(AXӖAB(@^d( W1_Zƽub vsLPDiM[W7k[?Fk.뷔>oOe ڂmV;63Z0g7ۿq/y6aA0eQZ&bRkAa=Ϻ|ѫ@2B҈٭nAf1ֆ R?De7?}`A @D G6@*~ be*R,*zsW>cZ<DZL>^n{Ώ;o倷S'qϐ{n1* SE,'""""W;̓m(b?qq 7D[Bz|ӞgsufQ,%9C,9ϭ(fv!wu{ jxϰ$xO9,_r(?Rz=+L9$imY3Fvlmƶ݉\@(hhT>>{UM^@p6^-^^[|y^>M?1o!w|ѫ#e,O?AAσ>?&J#T4ih/~Spr0L>0B,A 9 VdZ Oj˩ߩ~;w/av;;sbRZć_?hdi~hN~Ϳ$޿~p,VN;-M!@/=.ڼ,ʋ-`^ mIP2֪gfUo^HKs}XGߺ|ןR$7~yO;Ǐjz[ϴ?|rr:wDgg*{i)|~X/<ÈDfq9I2THD?bFt7m'lHkH\bƹEmjLxP`cJqWQǙ (/v[5;M2LzYИ׮~\M-ʹiצݶiM׿|Ni۵_7:oxLAqf'c`)}:>w{|sғ$Q5@i}=Jk y{D|@]j[Uxp8~Q{%e't{Κ=H %_WM.ס~^k?ڇS&|Egl 1\ Dlc7BLqt/o5kM"P۞cd$]E,G>]yG+X6Uzx~s:>w{|se;mm[czp}]]wl^_~hrHiןJm~Iϖc>?G- Ħg1;z|Z//j`l~靓:D2yg meyJS~v{]\(XE&GR;3̻}\C}a'rv}UD^8JdjXQHjENPD #k=,(Ɛ(̗Uc9?HqSmQ(zWPV(V^B^,H]ܞ@Si* ۮUPbտ 13ٶÝzO7`^z*=[ˌ>Vk3ƍz?sEI@n~>s>|Y>(,\h爅6ךh.fՕ%ezb1;=UѓP_ovurRHaOjN%8 R o'OMkZ[bMUwsi.c.R|8 IDATf[_W6 AE^v;\dҾOzvcڕ~q3?6m ٪zq:nMddHIO3>;I48_ovtxAm_2߀JA^ [/ $QТ-s[Nן/7XZ3==Z~g>h"Dfv#'޼KrLF--'6<ͣrJ#>΀E7cr]?`Ӽ*Ta/uf{DKu o}"p}:}Ƿm'ޥb^N PЀ-m֘*) VڿC{JSV#3FnϿazYR?EUBuhyCpmo=:?ts|6k/itǷ'^MrE=fo.YV:LvY-!z{q8!0G!zV`bkWERKiIW/7t˖杝 c#%Cuyס!fڗp>ewJ[I7kw8k8 ܥ8W2Ѻen0Ծ~z2ql-c9.C'i@#ڿńshߑPDVQ0WmsQB}.1}9w'-u($!"m@n HIȈWܨd2G-نo@FOdIX'm;MoXf*nnGǷ^=>z?Ƣ .B>s}UBGm_8mnjϐ&-W^p4b۷ۗןMdkw_N||~y~>ݎxJ)| \C@RHȸPɂ+[U>J)8rPc_ґY7EU[g0=ǜDrdʪ :*@y* 뻷)6: P~`r\ɘϊq܎񲳥 `ZU˘ cńjv ?A2S{ARĪHGr}""""""b0H ~L @G/#""""""δ4Q:jGXDDDDDDD O0OP(h)8Gbj~A4)Uj¿&X׳p@Tה$tn׿ۆf[3g0;( ADDDDg)|2`[/Yy~y8Uf31Tf%jRmyo?ݿB-Ξ8x; Acb%XB:r+DEF._( z{mUdbm|<Al>@n֟hWib ǟH!邧/߲>|@ k[UJWXAB>9Y.6t R ‷g R[LnI2TJ-{6v7WI A8n(L#qO I qkLOˀ'"""#\\DTvifB_hyњXmGJ*V~[9ziIKAi@eڤ,ehvnB;p3mt 1iu36};mL#o/cYgVg-]8nߞґXjwLL#KnodQ,> (jpUqUv*lú""xWz"PݪWCqձODDD`Zq-bky~pqYi9N 9x66] VM#5})U@iaa1dfӋ 2u#D2vu1_31 2L<ʄ-tzݥKZ^@2~ML׶Y/ݮ_пA8dEDqssK[Ǹ9N}/\}bt -n܇x*OkH_>g }P?ȅN5M6O`:WPƜ?@ k 9EC =5Ra4YUX+HqKm2>3^٪u=p aKe\,wrK2@h}ή H\=]` (Z.NTP0:gX36~:~E~{dsQۏ?Y? 1Lz+D5\ֳ^؆wZ (*XsI>o^ZZ9=KAdF眷.?Q4o43m0.R/jvJ{2cU+ɽ a] `diRq /Zƽug H|'H/۽4lkc]n=Og/GSaۻ"G쁴 /HKmg F&ZZ GbKku0}h Ri m, GەkkUd,Ǩ/I I#iWFp&ZOR+m=J%V2ΧџϠ`V^ϿZY 91{DDDDD5V7Zhj1r s8(}L//۷?}U04x6)}.!\rű_v4o#HɮnM) 2u)B*a?%IH (K36EgYۥizo(_fi삔yzwI2+^kOvv1,8q x1a -OƁE wH/1E|@ӂJ\04bմ1<c*])|CTNۯ4=+"g|m3A5̗ծ_oK óX>-U8;6\q` RU0g7>izs^GmDDDDD{L[$fdXBŌ_P/@ 35E@XM WWtĘGe z FK P@dvd(smn$.CA 4O!iue, ۏ3Aba0£(ނl|5֢V\og*P9`RD996׵m7O\DDDDDDґKFp$f#ڠml޳Xւ8V";o=] dbmvm]ԴoGiv]QJoA28ga,Ʊ3{Ť(6׊$޿Uc_6'ݹqnzz>`4>mllCqG`aG7 )I@-~LL9p-YRD*wvA nR,$FpA`g'.g_?6o>N쇘 ->~s3/z8vYeﻓbiQs_@Vu% 3%7:D@YǽJ{J\1Rq{8EUwf򈱱KCw D3ަ^X bBUت|~vJnIbӘVm$XN. /#; &qkxp )s 3<~-g?l|qv;|o?o-.Id MDDDD\Lj gP (*2yd(\U!̣rZƀg! |'q(ʟJFNaz78ܒL(!12ݻNM=+1Īk /C;<2`"޿DgctobQz6>p 'ϚǛjr鉈wG7oW_}8lEl/c=ٽxϟ?jGX2ML#DDDDDD5V Udb"7/cI2Fk}#8xyѫiDDDDDDD4NI:N1dO`d ABwA*`5gͿa;;1L83q C3(`8!!""""mja̳*<E }Wf~y߾*|dzI}0_ݻ8vۅ:)Hq.=ʹibB 28)ݲ 1$!U(Ps.ZϘ|>:筯Crizo(_fi삔j(Cizo'xxy;;~8<{y-'ouY+7ӟ%Ʊ/j"""""ڋ`ZX G8F8F\@re|ӈUp8ؔG.l#AJ!7/̠-R[? 65EL`;|z)U@f1dfi'e{lz ޖ/13$@g7(}[ U/7qv{m0aDn;|6 ut^G}"""""]0@27z=$ *ؕ5 5"c)ll+@i zQ}F+lGC(U̗[\c*00)-N/B%[x/o}Z{xte[z >Zƿ_kQ+7qJ3g(0)"TKWZ϶ze""""""D3%#Q a6? :QƆm l=e-c|I-%J&oŏZOM1L1 kn]~|b>/`]L"n=|(؉N[16ms9ܝ'Of魧˘;IQσ668n_Tmϛi$?&cG,H)tn"PB ,;T~ P^ߧ.g_?6o>N쇘 ->~s3/z8vYeﻓbiѫ *02a Gg($XS2+Mbrb.<{"PݪԂk @CyYKjo{/t,TDVUelU@H[O`R?֛~G[^Fv&?L9,1S8gxP[~x\թwi?o-.Id MDDDDD޹V2ΧџϠ)+2PVU':fͱVd_\Y 9A&_IRU5K< IP e XzС %^MņKPHz*R+m:ݔ?`sK2F2rt\to0 e,NfdʜexŎ9E$>ko.B}6ˍn'"""""r=zHy&+aސ`-b{ ٽxϟ?jGXDDDDDDD޼*N2Fk}#8irI>˹n~e""""":8MDDDDDD`4i"""""""DDDDDDD 4i"""""""DDDDDDD Li"""""""DDDDDDD L1&""""""b0MDDDDDDD L?$')&'VQ(tY/Ǯ?^6 +Ϗ"<%] 'ATd/R$t0};|Ÿ?:y , oUu]׏;\Z-O"m)r>z# vfY~""""=ȅ1O?&cJ_&d# 2[Oe{Ws_\\ٿ{/wn[_>x$""":` mC!&tH&9~e Z| +X;J\BVUakr-2[#63T h`y%&a~FZM 9VUQNEs3 p~KUq/ ÿߴw1sirn'V1i=Vom)q*ǿn]lm3A!iӳe`omehvӫK0]П # IDATc{:ʵ'g)kϧobjlˋzŘ?6/!99Tv5ż@2#gU;3%\Lml}h1@/r|£!PEbk%o/ ¿PZwӟh \T98MBGxՋ?Ij?YF1AFe?&Fy,T|mﲪ":1o=x  #o9׏񩬪]cjm4v맖q>s{c#rܼ^h_@X PZB-0=KfX[BR+3%3PYXCI 6{b*[U``Ӌll=A"Jo/iFO 7HFb|mnz(M`P@>z<Y0s< EҾmēP?;Ϟ~~jNWH&S,$͗t]tq,_ݶ?/O-~ bh=/ @q?:?u8<~fT*YN;_"""3ӾA @D GijY]c|Iu;QƆm l+sZ95ĀgŬҞwEE1d2s'~Lz=]>3?.??xwmJ]?N_]?ת[MUbm2@,ZO뙠e}eNWЩ~O-}VBY-v~t0]B aB 6loh(dKY߮؆-7K>U7qq_*:{揀xg$M._7߁$ yc:;^Ow{n?]FZߙV,%4Nb֕F&̜lem_%.7ALvjoQ/#+Y\JOBr>GDDDD{MxzM|W W@q=?LЖF,fI ;$""""jŋxyW8j$]w IA }g^cnSS"c{[1& vkM^L&""""""b0MDDDDDD`4i"""""""DDDDDDD`4i"""""""DDDDDDD 4i"""""""DDDDDDD L1&"""""""DDDDDDD:  (V~W4yx RpR RlgXWdeg0TkC3EhÞ/C)`yX8Z.Seo^_""b0m: BAl&j:p8p8iÈJGû?"h|Ry;042-a;E  ʯ_[v\Wa֯[iqs_m[s^a "z%iߙ !#3J(X$nfPbQׇ>|O{w' p(: l.JZ>IrЬ˰|U+>ྪ\cn0-~ npovM7,e4R )HڟiAJ٦R͗o֟1| ׺Y֡qz{mկSpelU# 2a|2~ w'ƕfrKUWwq.֧z04SDqfClEq;+sg={R׾Y4s7ڭ_ Y1ʾ<3-o]n?֯s:(Yxa?2g .28MODD$ ֫X٪B qLF>|Ӏ?&V2Ǎ<ʄQ b40"8dP8zh)|rry ?P.l@r۵2zZ@25mHXf>R$1df=n][}#钧iW#钶qSYw3?uGq]69=%LelXܑ w" M&*Pv3'q@(w-tӉW@mdȈ Xf2kbAh (:7Q:fފX3g&IHUFqluA2K2)5gkmW-4d>zEQBep۱|7,Y5h~/< %]U]nI0=>=X@<ջli(("%Zy7]FFYSycGA` k˪Zqh&>/kԶ}h3`_>ᮂb<`l#S@n k: ̇4oӿߺ-'3=:]M?3 "8SAIJ oũWDףFW~u^m?$^Ypھf(}ٷxuyxY ۦӜYr?, $8U=§ Fyco?ͣU-?,YIDDt˃z,(ŁzhcCsXxsEИ>hQl,߶ak_S~Ũ0 yaҶ>&0}#ydnr}?3p6ҬXEG>'Hk=*^Viۯ13T:ODD7<P#*K֞RNCORLɐX6fK[nn}U-aqULQw(Z!6Ml΀Lnlު*yoT[Z*_/ݚ]6'Ԟ>~%UODDDDtAӐbQ-`Pr͒IiN]mqGDDDDkcC`ꩪ2>tx}- A*H0̇4ϛG'g:,pZzҩKnm~J`2׹4>ds(`=:vy-C-* }=ڡտ_~9#r8z@:-m{NΡC3݇0$*8?N]WyBFϲz"1;}lPh~ S Ux1h䵎/hppZ?gV;o[~ݰ۵8T R̘ R,dx]{ m?- U- x}Z[O[Y=_""""_%[^$)uVI1KГ\OXyX%7 ןl5L0gU;)S끠xkhܾ7j_}Vn]춯%lNc*YF8$oL4̔ީ?qCmlhzUsSD< g}kn9ٿ|}KDDDD|{߿| us[ǘ.͏?Lv#i"""""""DDDDDDD ~`Z&R^sQXd&W mڗ5ٲ""""""P0-LP, X`LfyqdCx5ۿ V}p\R[ۆM>&"""""z ˅,PIIp\p|X=wNHhiz۬Y.:?~fpרּl}?IHUト%Q#kiٳTzvM `s?otl,v\~M<ă,޾2 =~H޾ܾ^{d1#[OO,F-ifKo%7{@[ȾE}W\EXI1Q , *Z0y䠌ӯ8Rw9Mٷ78V}P(Hh1鹇7,>y|}>ѱ7p{]CDDDDDS_q l )pV}pi7TFc=7ZϹs'u@ݲ.2='<h$?S3@kg_k#'._Ui'Wf1c3}K: =LbU=S`&_\.'Z'nB^c6_ޛzpjIw~[EOCDDDDDt+i]Bj$a}OuRw[~~ӃW-4tb$W}LB1ʇ5Y{X"[)zi0 >ת}^jS}dvg G1zߜYQ>~E;Aֈn?~}qHݘxǾ """"_irdrP{;%qDDDDDD T<i""""""" x#]DDDDDDD7*bycRW%kz2#Xv~[NDDDDDD]әB 7AB*%_G-H#Zy`+N~~륁/,n%1uwG`n9L#S@^̱0(Kw9Dn942#&Y4jڼ~Lb|кG}% ү7PRUj PsMh'4X?>)~SbcqjZkr"""""">VUtMA, FXQQxyT %:FWi B_ T5>ߏpZiHGVϹZÁr 48 EgZ}<l%C!bhy0~`16o'P!9YNDDDDDDӀ5[<o}1LҐ%cmt3Ty-'Z IDATFV8qcc|VÖ`4r'KN0F~3 "\32 !#[NDDDDDDm ȢQ@ca!›!d01<oLRUUƲ_?YZGHrj/˲ ATqb Εm zK !T^Rhr3B9,_Ue<c+C>ZV< %:h9LkQD}AOA,)(ð1ۋg)%٘k C+詓s(jF:~-/]Njiu))Mn99i-{/L)F-dU-ఋ/Z^]J:ZZNh w,7>Z̒ή?nZ|qN7S!3=-'"""""9F1ל]_<$Zav}$:d~HWI#8fyTN|U-aqC$!W1!u\]|ʗbyD lX [NDDDDDD_|Q߽{߳7|2L1&""""""b0MDDDDDD`/AbM=7 +v_uM\V0Y;N'W m׍2Yɼo;a/]e?iD_{oRzpe)wrMZnb󢀕ɛqӠSoFK07vѪ. R/egggŭ$/!ZuTJ=RAJrrt>[6}R$Z?]rztkGDDDDD(6s C"P=+pu Rm,&FҨ=mlG_kS2q#"g9{dGDUxN#OvUK |tG0 >$Q(u߻o׾n/.e FDDDDtFZGgǧ1%a\7vP0=47EAJ5Kj`^ϫ !-! G;i~O:_)cF|LUs[QUuoRB3AsF"8SAIJ oũWDǑnm>]6@ Uy~Y >rQ䷇~D'OpWW=ӃLUknZhS0MF`h0ܨP&9Ĭ.U$ + q(fd *?hW=W]W>#(JH$ٲh?Puk?_0""""LDe*^-np- ompV>fV_ Cbi˴mnZPA!ޡN@dg3+456b85x 3}|:nU#|گ4okm߯~5'W F FDDDDtMA'd|0JxP.|rd|@ps/W>07'!<cx+Y+>ZUKxTV%pHAVF|]ka dS*q%%w+<ՂE"(\W& K|VIAqq0>0I&O`=SkGgUR|G~m_UȵWRYCiDDDDD!W'϶sg7өvJiA`zJDq\XiR,(x8O %:D8@ B/ 𛸏d볜 p* ֑'%IXtustA`(BR_z@fW~{\rť{oZX?ZR;7I>cWCDDDDtY7FusIq,WF)|^kY_~PmXsF|.UUw&,;l< ,3ޛ* JW:,pOtٽ۶n%2b'm߾IDDDDtYtiߏz=> 78+_u3=HVUynsǟ<V}R#H(Js}` b m NA˧w,EGv)_qo}` 0_-Cʍu 09z<{b=MV%FF@wX&Gu-@e߮}NLj-Gzd !""""`}[Ss@Ko>^6` *Pbnq\+_!n}zLUw3ϖg8'W6-{,FͯA:SX0SǧV9§JCF{O)߶ak_S~Ũ0 yaҶ>&0}#zLn0]Ny8h߀҃?3絉|HCFgC 4>W5n: Zsw1vۿ O\R7A$UNdlh~7=#{m{;d/ScČ6T7<3]o>^jW}d|˼0jC_c/%˫Ǵg{x+Pq}vs _|Q߽{߳7nΛK? /Q~߿LG=8強DDDDDD`ډd{` """"""&&"""""""DDDDDDD'fOd[햓WR R9qpi\)tJ+av~`p~~nyoli}~ri bylG<4޽9ZrAJU&""""Kur?,*ŭ$kg/ˎ TXgHzU ?Q?ܹ2(>84F#1nL6)f^շb(Tv~G筟o_Niiгج*_2i-cvHelm 0 Lw-LаVl -M}ӰMn\%1_"""""-ky0=%X8.4n)Gq~~Ů/J:pXzIFx bQ\ t$$ҕ?Y`F[rAKL ⼔*)Iɮ~4Oد #}}|:6.@ɸVkt~CNi܍ """"hN%Ʊ,WRA*H\JZN4i,W6^LܹsL7^#\YkU-Hndnqk2Hwq8kyTu/e1PgBT\ǯ@ 2u}싋 -I{ R# $FEKH$Lw?vLi`k+=n)6ӹ$N@FDDDDD=?Cg˿˯v~.?~* |/@i\ҤDDDDDD 4ٮ=]D/Lm}c;Ѫ. R """""i6bxϲ#[!xkyODDDDDD?C0mƜw J^5^E5Sc~@^Jk@yuy#F5VCN}WICzv@4 m X/}R 99B"P˱a۾z?y}&򳌅Qo%Ov2f7/1Tcey%W8RUPߐY(]Z ̠VbI|0]?3-HN" Nx=: #v# 诞/ PʖbyD?\ 6n3@>Sr'7:Z4zjlن`l;^Vah'x^NiEИk_X8]50K7._:]{+b) $$!U=q#/Fd OCCM4P}|Sb;Ƈ;(S Hy?de>x}sAJexЊqc|Vz\ZS S(ZWVNzW0w_jTXm| ,3/vZ&>o ?ܟ&hop-p_T"""""YҼQ=adzy*cٯ-!9N,>y}ddSa!›!dP1<e@P<l%Cd+Vim8pꃄdEAKp=NN9p'c,XTpI0칇ʷn([mG u8ku`;GNI;I$ 1}2L#OoΚǔl,Ŧ]ʤuFziڎyy)ԓ+c6w^V۷?1nI %:D8@ B/za~~ѭExAq/ PʖbyD?\ Z\ԍt8]Z)JڨwYp4>=Q9AY:/@j,sie ݩ9'BOWz@$$rAJ > ,rrA\6K ?>ʊQ (vjۭ ~;?1,$@I#x%Ug'"v67vP`O >̇4O} Pү^ZqjA90=%I:zta)U%oj̯kuoX==z ܯ\"8SA^߼|M fAE) XZP]oW"""""4=3搏 #3=SU~m ATqb Cc"B ʗC>(׃׌k?66u:r>fӿ~MN9|3˂ O8u>lODDDDDv0m+'P!X1 ODgBaqˑ(  k6s>Y@oz7Kپ0iS""""" =*^-9(iY3zvi4s#UB^_AےmWw=WտM& S#|=fj >w3'Wf儶&QSdG-0_%ԟ~-w8\za'0y氤B7IClNkHBM;璈"pMV?δYնS+߮{wЕ7)<HbIJ_΃W@qL.M IDATgV~Mv 'w/?0Z=o}''""""_ݻwxnX!7wUMDDDDDDԯ?~}q:*.,y-uwjC'dzsDDDDDDDZ01_gѭw]@DDDDDD`t7:GF>Ť뫣'z=ylG<7bp+˿-ǥ]{}M0RŅos-Xw5& mDSI8ޔ۰>?y|үqI 4=3-H1^|_~ԒCc"a-B5|3K<}&;Z|Gnl⋈C6տ]]N(04m|(FRo\s a-McliZ}1m܌eMvCUKة"\Yw^Ej>ׯy)|?s0;LiOdp~~$>~f^Í" W =˷Vb^Ŷ'0~?0hWweeQ %-R,;p k+-_I2~d\q ܢjYrC s(LM#EɾWp~vLJ*/#v#q`XB7nD:B{&\ߏLx}Lǚ Hy^^g|?qszQ[4֗ ŌT!|=C_ӿ܂C>ї$ |^O3d7 "Fאlc;lg) ׉z1O:4uߦ۵y6}_7kd7ir_\29^}Dit|hE [s@<giLFQ"ZpEBp._kwUi(޹.&/|yo`*"kK0$3cCsZ:X/6:qm odߍNLJs?oNoV n:;(vy\vs}}8<(]zxOh^#ߝ쿎N?cdg";6lˮ:?D0U?ŝS>/# w~;bm@A pr?j> ڴ~_wEjwv>ƙi( 1g:,Cx~AV;>3}--aXwy!S(:?;~ҬgPIգIRoE('=NG}L(9=k_ͭZȔs/b;G.9ðvAz[F:d?ע72"!.Zc):OqP7m/W4wrt7D^7FU_OJkQXF?yoXFvԯWj5~O^>;~x~uNkX{|wwnZ(Sa= \o d!L4e&n_ZGHrjW:qq0G-?0#iқbN%QA1r;+*yx[Qmi(f'֘bɤt8]tY~ʯOc>'4Ɋ'WA:l6yv \y3TjsP0=:> RoNW>i# r}W>SPSF8q*xȇ9:.==9Wkt]\{r#QPo\կp)2' *|EOy5SI1؃n/G߸]R&ckƌT@gBuj?a?| WPT"CnO Gڔ~񡥺.&02]2> eQ9| Ɣ~Fv3h7]/ndzL/HΪ8=ݠ>|Hc.ELʴ 4ǵ;γc^}^(˵Y_Q.k=cr*0}е 4{}3R/krHoy-т1}lw|S?E}AOA,m5hE#@c;gTr⍻1drBO[ypx18n5=M萣緜Ј|04i}*=Mpe n>,ϐhn^e^' S#|گ`tO^RNsPVD綤]FšS%>J1 UZ"31~ώ^vM~)UT3TDs`}D6a}n˯PtֿoO:MM2^4?k*fy"1fלן9hxbow_o*־*3<:ЩoVq|ݱ?l#iJPa;Д#KUKxPH2;m7ZOÀ%;-0Ɲцm\n0ԹP=>ھ43ٝ}Ei@9gǿńy#-YQ[= Lg O'pqKp=7JItu@sIDFˉ@Fs9DMmzdwUSyr[O!K*awM{,+x_?Go:?SipMԟ;_^7uQx)~kcM枟/;?SO1c ˗/3{7Y` ܺQw'n(v|?=m$v$ί1-^~O[)KO糯OxIWlboэyG5h ]Ӝj7Hd42&{|nܐ9cli{nmf4m$ԞsݞSdNuOaҼ߽DDDDDD\71&""""""`z:Oه2`ZUKXc F-`o""""""U* {L҂snÏ!s1""""""b0mOK#gѭv]@DDDDDD`Ӟ6/& x#G*_\{ ߐ:5& i9/Jڿ6JLvY V&ADDDDg)\ԫc~䨰VZww~?ŭ$Bb) !J(9lQamkl#-7!rQx۔߸P?zHDDDDLkK@:/p<"]]tͻoaQE?GXmrQ7"lZ,BtwWl <\i'6P8H,_Ynע@<n(@@ Qak{"HXāÀ .D֑NiFBGh{n3үSA=mlG"zqh^Nm.3Sx={sv\2YK黽8q۱!M"}^Z੪%lNC9U//*"kK0$ճ!qc~[~"""%N+m?<}= J"T׃})Gq~~ī!$׬닡$S@腣|./% i0o?v#h zz~EmtQo4+I__WvھΕ ah'x~VD W/z-GgG:o O?'uorC)ݴۓ6'>iS8BQCeۅonĉsákp 9k!|x! ܻqb;a%hdhy..N_'XfK..FiGI7yfgy87n(^Q0[~ݩAˢ.ƍI=||g]Su{FZIJ֣u5a.lVI3vs~_g)jӲl)5edmS00=>" T{dqДFǎww-obk@iӒ>v_g8P3%[5ځ;2 ˩j愼:6/pPlK%iЖj;jW=VuF$ccG=ՙz|ӜsKVҷ^8~[˯-T}40s7)9iL(4CG]\^*+\HY#=fG̬fk?CrM% ePk# tc()[֣cC1TP>v9wBPȴ{p_ы?A_)meeAwf?D56*59/| 7ִ71蹕Ⱥ龮9zI aDo/ [:X4L̖?.YҌVeU&C| KU2MH+m4pWe[\gql\vh:g\#+q?Bޞj[PZHdUneCf#oK)Цx_ǀf&cSS a5efݑl^"2 9?_-T);X֝VnJW@/^jL[Y0(ow{A5me/NqٽЩ[k$?L՞bgN;qOC?eNL^|'d={h a$uv}݋>scŗC[|??U\r/Wj @Zy.xf8vjRlsݤڎ?^p'UF"{jXԽ ZuUBVkm4JG2T2T~χM.5)Kil;N]9 t:oAm?5Q茀hEOޢ`7ۏhMz^^=TBUZ23~s>͙rY}pE}~1hq*T?χ} _?OݻʸF7@0 a4NلuW>WѴ+UZЏiMo{d.?L)DW1m p> j݇y9q,==:ґWՃ[Ʊ҃j5Bƭ@>|v.qŕ\; 2QմS/FB7$zPU}۟qdz]2u~7[xAo_/y%4oo 7H;ӦSt31LBO5YUil"lʱDyj^ӌ;:cYӦЧA Ӹݙ>sNovyzcggw_6A:mnӆVA{)ozoUfk %%9x<ſ=E7WlSF|FvI̬S)YN؝vj1_DV̨ScFvZ퓒wgL3vulEu'L:*HFueq(at˅LŔ)O~ 4=tڎug;ĆXn2n=Џh#9~xk/;zR\6~3Ǒa7~szg!twH\(I&0kYotj愺<1<4͒hK2:X;KRZm>3m=j)AS Fky #ɘ-k3dXڴd?S;N,٪)7*:Nw N];5ӭjzTZ:\\Nz6OMzSƫ2jh˶פ%S)߮Z7nƍ>il{{w_'55y0Z-ϺOȴ{#u7LB<ȈUHV[tdL2+'LEٶˮAef5YWCӚGC矴ۢ;OvLSضftgW/;Dq2hWޣУ|s.iIk*> ǧ}KCk,7U4hp>7s[y[E{Q/s_ t kjώiv3%wf5i=Ln{Sqk\#|g&e֪*:toDꟋiIL4}$t'ܸTŅZṞN׿nMgW8Tz!woo?r{o"5IDATow ͆&AGFUmKuNv-ldMT( Tp)^nRLY$ٲrFFFOLCZ$l_FJ&TKR*۵>Hc^O]ڴ4[h[5RfWcAcW{vRw0w^KfgyiF2HtQGm$m^zCB_,vFl(ѺmVn`x/7> #;SE{޽{7PF|J"+J]5.uhz[)wE/0mDڮd Pttx1h;?CqGOtUq5yM追q끪GG:>-~pԕ+OW_ˍn<|%Iӷ?ȸ@/ zdƳq0n}B78PӼ)ΕwMG۪T*$3Y&DVl+?H([rl<=~^9];9JjvNwgx^'?QsL?4v#=QNcovyzcgG/H }| 7kAPa0Z*hb/x>[z_eG=\nAi* ]~d:mkv] 2=;ΜՌbvO kS}J&eNL_u1AZNL޽i=8NQ՚黆:?s7)VUq8u4ؤ#VWt(qhwVK?<iWMlJ7VJ/?nWu͟AϾMvl(aw !ss)TiS-Uwo$:=ڶ/X$kBUȐ;NQr*gʪd$ɖ452}bЎ/ujP<Ѿ*L4Upk }Ǽ,iiЪjʥ,ͮ D2yÙ߈i "L*Lz^)UTܿlYw9>WI"[Q{@0}0ҾPg+9 p=mɝ]=Tj~]uQ4BlP!-(z> o߱*IZ58^+zGZʲu_ws}sFN+P}pݝ㗓2Ue敯/?_]'P{A:Yv?JKz4ɇ33'LvJ ϷBH$eS<^ V4{ pduJ໵d& *ؖRSjDUXQz 3%9^KtWي7~̬Ԕ뭀wF?z2rS[ۯ,j7@7"^[mU?nD:ֈ^ ңRS'~ pWz8[>WO޵aJr AGEe MlY G=?kOZ;Ɓ]?.Jjܑ{sd6-ٱph}}H\g$qДFB]=RXQ͜t)2 Sq~ߙɘlQCs>?{hz[1ոD4#w3)Lț^rQۺRrrF*{{obtRV\V=*?#1">Ծ:M>k4;j>LwkNh\eDبáeQ-$%384rO,J%+^:\[0?6s5b:}mpgVFMθ%֖o5vg4nJ_2-sb1AZ QwqM)q+:NQ՚ݙsϯ=*Y z|%if5a_zw{N}\#ӱLY%6-#5RfW:!ĿsuwY(VZ-rR!qc d`&UgY Xiv`uM.Kil>|m)5~;,#DَS|N#宕p+f_MWÝGZmkM/dg\ |R M=pxz_/:*Va70Z-ghʭ.tn{{n2эĤȘF_ 1bfp\ qJm[Mږ5ch++|2 Ӽyp  L@0 a L@0 a L@0 a48ôȪV0WUz2plEJV! +h;su^fƕn0MoR.+\|rΠo{7ĴB"H({ƠHd}6-ibz?\!wz}~m+5+@O3)7xёMkuʄBRRS^{՞ ;O-0]Oϯz~N2+ڝ_WC3ZTMύO{5#ŭS{*:ΔN'*5 o#;9)QLdJX"[Q&ֵS0Tz-/?vO{VMͫ4:K0ٲR;Y(*- ՞tDz=p=߱TI 7ݤy"˪vRjSSyvQђG4„ηv/v<g謹(ivF2r_ችR֨2[2:LMwg_ʟB7W\q;9n)KK5Y^[Cg&SS uL?5bJv$cG #cUMҠ9YGkt}~ocW{ #2k;םeA`8?#Ed& lY%C ӱAoAȴ&̚v;ᩱijHW))jUؾFRZG>~dQەʅ RꑋzY(f[ s.Gd!\726O љy}G}5ɆZt+ woG9+t=[?rh ~LPuhF6$2Q5Um|س4־̤ ۻ0ZO>ՂfMμ޾Ý=p;8_[0uۯu>cܹlO ^üp޿w TuAjq6&5OS\V>,.}\/&_iU]͔;V?294kt#i L@i L@i L@0 \0V~CHdUN+jhz[J&xwôs2 Q%\*mZĴ|Fڮdz0VW3zտFxhcw߯}ǕlY>0-_,gFeHwƮݙ7ԿI&VEwx\sGӾv|$w´a$t7iW}6ەSCԵSSlv\+kd7>Vhz[o{d_y׾/gbk&U(F*곂/L+2QT- RU5sBӑFWlGv/ey>Lf5&Tʒ+z.vSZ6JYʔ~8{i`ǩ+?W|.|Q<\䩣d̖IMKۖRnj,xٽm_W=?\SB9|ݮK3=مI%^!+mee$5ɑ1TPVҷ/;NQbP(*_←jcH'l)SVn)UUd49#UShv1b9[Ur]@MK>O`=!P~ ?mQIMomԽ$]kL;NQ՚eZ[Z}ƁivsndqV1{Ov:N]{v׿OS~ꊵ_NOcW{vF"B DBT oz J*)8cI9)Fc2\Z.S0K)$T3xO:&ugµub`}ܺ ,;oYs4mj?I& Gn]VL&$uNRJ%IByu/3z={t٭JLc1"~`t{"T+{ 47^:eܫ(|1hANA\8e^:R۱C!N8ɇE4KSc %BXPQ@#v<KR! %И N(Qx-2 1 ,h('CL-Asd3DW$[ZZM6*ҟ;vx2}5ZUWe2q7 ' LVoR|ݵkN;]xCI {^?^:N>y4+9OY_I)B2?}JXr/l%LH(ISQnV,o(.QPyJb;4T(DQ|P'"?Y믝/P* QEQ2:w@c:99 `G.efe=>xRt`@d{ Xvc:9TIՍf@K Ҕ>"#P*&u^~X| & ۬_p)'Yz%N?]<eFkf4{cS@kϮc +s L[Vtl|CwNh˰F@A$a&QA=]X3 NO]̷r,ipp1J*׭~yﵛ` t ֐P"N`uz:FnZ 3'IBD$(M֬"XfZA\A#Ma-t43HjS]VU ji4B\l)M˵B!NSgݿDǻ/>=0dw9?ZkR֘J2fҘub>+bbXqOcAP*<~& uM!"pN400P[+:gs---_ SXw/KDA$q,byޮJԱRh̎f i ß;lx1&C:fzirw) FH-q*:3sZ[/QkkkZr=]tN}|Xzz=sG.[>00 0H)9Orh$W+/H)eaH)+aZkI@$I8N8I5JjcsY$qJΩi*Wݕ\KK'RJj W*q;rRJ eE%buX9*VnԢE}kWhsgwdzАd @* I4M^ca@02٬dfNNqAIdGy03= cLRVCCÎ]$AYn ׎ zQaG1Qq}&)ȑȂcD2Z ezxKoyQ|rLx]kZnۍO|CR~馛N;':}~Ʃ~z9+^V ̶$eCYMZ>8lm!̜i^'%_E{Aۿ=Q{^]uf?oj߸M5.j~ ۶#:z!Y3yO ];AL1%(`"bU+2@4uB\mt@ %sfJqqnsp&BPR;KDD/(Y ڀZ묓y# ϥ6_f2-ٰ%2**!H=0xYL@~H!T옅A:f)h.m6LƨzGrDlTciLs=Se ekFB!LJo[4[)/Bh )cK9rBе'REg7|5on{7^WJoOoA6}8,sUX[5_u09WKX|0^AdUAx| "g&gg^pnpbTSkry'S$j &Iph"p7:I W?+O=yk(CB0d&` ATs鈂6t 4GC̉fx܂}tE4f09,4FGd7co:[7=΋;[ 7\63sѯsshFYTq\d*VRBHRJi*lRm4Oc/Hz*EHf$E2LF(2k BJM&%">YYa%1a'HR:2.%RiZr= @)] @Lh7AhJ&"^4C u0yB jgMآ|ER| uk<*Qxa:ILa4 0#&fQqڜsG'i:B׏IR+oCO 2p@l$m>Os_cytQ-|Ku]̷2vf%79P}'6_OnCN1; X ژfw6f:M0EpSG 6%c&av;#(ێfAZZAB 'Z\w}ޟ_{& `6dΐ&"uEֽoo9{H84ITa:k9"8f1^{M i^g ?K |PyD/BR=Z1lc|~*vPjF;J6f 0 @dT=s֬Ys뭷tI_t=8}#p5Kk;woƎKDpx" %4d:{ZJ)|2s3q| t ",kKvܱ}۵8IJ$P3 fa0M3:Oc 4fJsD\\:g`,o@k)AYI-2/:5 VʽeY0f0 0aTӲMm޽߷]t{ٽ=~REz~iQ%~:rR[  ۷o=ݻg}*JR7՛oulk>}՛Ϭz-q޾ob-n/zm0۾jf޴} G^e7mon_w&MWc۲n]ߖu _i;37?^cK#}SԄmj%Z !Nz"DBJg-H }L\J腹`i …WA2f2RJwR*M":gFJx AcfoKZkmXZ#Iu-؞50I.;]cAFF,Ow PJ)H)1* )ZZ[g81\g&A3 CXaM?OC/:cHc?կ*ˋIx|ԇ PAX4{rӡt4`C6tx|2P:8;VJjc| 䤐$Eևbf"v+6tL&MSQ*! 4̈́a#4̞ԭ׭sm&iW’f1>6IZgٱs݈;Is6-,;Z1#Luu*r1%m|aI\.gafR*pi̼ݻvݳ˻zkǟ|\.?޽{޵{Ͼ}Z$MLesY)e.SA轧fφzm٨P*Kރ\}iJȇ҅?Y4QT(/DQ!'EϺǩ/מBه++یb|?RxV)YgbRlnZ;4IsXct10#@TAH Pu͠Zr8Q嵫۞M2s`; b"p;tw#kiX71:Yk4e憫k$~o.ZĂ6ES0,z}L__ߢE<8k,c W{S!*q֤_'Z_O׫8גD\. `&$5Hȡa$C2,/D_\x֯/~s IDAT~ v}_>]G_?t~_ySߩ(7o[=#}xNo$$ɵ䪕q@) )G%yj>9D ZAꐎOQTcAZBsRlB?}?-y(L@)P'@B:2Mr"#[*/DR1mh =]q݇TTD`" Pk=00ıOq0ߗ;ij9s2N xxԱEQThJ啭B|b|T*4/}Zny}мk>ߜ@l4"ջ[a׻WE#qb(,Jq9ya^NBJJcȤI$9uy|- YAGgJW)iAn!nXA&]z"w{מ|g?Vm-]Q ]T344뮻_Z{{R:@aG_WIg?{eo};:d|e'>z"xO]0M׭uBk_կ~u{{.\yʯ貹/}K9p9ofji%N964*PR0dSr3bxx8l.wc^h1ayGN$)P @Ӭ AdAM*df(I NLʭNgrlvyg+*?o+6D! H1BfrN ֒u$>c=&n~ϻs7-_{i*x3 J2;)ZZ GTO}wi%S()owy ~sO{{;kggzO Btv^yg8lB?ݲ]krտ?=%ǭ/>;CIl?jloxU4Ӓ%K6=K56^~ %K<{'~wad~k^wo\y9 @JyM讻hw;zWD}[޳积༷wu+kl횗Hc8pE56l,J6iM?x4qGrw\td -Gn{GqGnK.#]3^feO4b?(HNɍ3IqJZ !(PB͡ ?emj+GQ{4ƚMs:Qg6|/πIW-B EGz}b1љ}=iw62 MB۶m;t/c?>3w`xS'Vaff̼7wv 7OD ys'jЉUvr': ĪUv֟;7 =dc΀՟K=G17 v/sCfްEivnX?ո͵;7s3:77cjuQpƑ|af6C7R3xl00X/{/8eK_8Xgv "L`V[ !BJuD8VY~Dg3CzԲD䬥zU|Gbv$;HA;i>R1PJ2k0 s9nг@h>$$ vñ윔RP-7>WgL  l&B U Dl(H8< ""%%yԻf2N>aXԭ~n342(Ğhc*Y1% Ys )s5y8f\Ą @nqp$` pLS݈~D0K $JJ();H>RAYmȳ^MRJD^gYڹacL{ 9{04({~dwc#7tet%cm,Ӹg *`f6F4]Aqt-}i w\{ qFa=O7:={zSuiLoϿyAH?(JJc]m%6ںJy¥KK@TsNI /彾|v28w^{]5pӤ~_`5ގ5m5|yC'֤`k96v8NSv 5֩_pŷXK1@l?q3z{}V߆c}8YfkaM$pܷO_X 4M9)LƧ>|O]1 'V[$i8'r٩Zsa=X'c?:ߙRr{ ,H0i82ٷ駟>m+x9%}xkJ)es/sֺ2{JG얬ҳm|3;c1B`c BJu·s9HkMD5G+f g ˕R'08TftBWjU")z]$|1)Ԍ1ADDB IB[RTJJ)$"!§LH|$u>fp^t$qcB)DJ85Í'\̏yr%eBL~B$Zul8焔 {烘ɧaO-^8Gw+U3iy9Yf='nVG|i~(&'^ H!H0uZcT(b>3k ?m%Eް@aySQtڵg7GQ(*cy`W|\۽"hl/<5g2"3[|6PfZg͚bN}{{R>{= =G9ϸ7Fk(}8839yM7J]sOY`qk/z_i6>Q֭[7 39V2 L&lx۷𓝻:ʚ5kjٱԼ {f7=e7V3Yi8K6}ڵY;B .ƾ| gV;s`[}/uj#p)953;ϭFM۔-9 fr'(f[Z@0JI"B3ccbY0 bVDVUQ"@J$M1O;vrLjGvH+~otі\w~.3;_DJ@p X9S;kU8ossnG%,嚽ۧ6)&R!*(|L㤘G5cxsFZrqDQ^aP,(D2|((J(bB (_ls!*DQ4PF)@$=R@|d & la53 6 X ^܍W\y+ѽvTwtby[Juwݿs!wt_E[VhC9_Dߝ?7= R7n$2pVAK~ 7^qk|5pV^UScBkaB:ZXr#T ^wg@ ! k$ g` vu~r0Z8}z= Bǎ'rκT˟'d1U'7p~SNd5of8ClN&Cy7>dpfgvBI:7JjΨTϽV XXD-`p>rD:ܜwެ؀k*JSJ!3n}krVɯav-4M?mOY8o ->EO8>Kcgx 10hZX csֱv6n `nl0b&xĄ*V 3;-U/y%` 80 38 fN*LF`Ƿtul)xD#COƏz263K%6a̚qQ^1I]/]: 1;gsBָS8 9z̋tk]X0ɬ2גd2l6̄a&̤;sy&I;fB5zvIXYDƚPkA p gG9Am_~Q93ǕS=4RJDٌ Ʋsw l,+WZcyN;WƂ6ƞk&9%Q!\ƅ4x 9|x&g-}FymÃY !Dķk!"5֌pڹtIah&e%2s3U5*PJ՜be "V7+;4[^ݲ ^, ϣ/5S>_|;o(oM;q;эa_Wt<ں xVuo \)EgZ] M\\iH֬bfֆ5xzcK"qbMоZ?\.'T*F8#'.6(E׹4;Aߝ@oCk+bu E6DQll-?Pδ5Frڿ@ޮ de&u /^:d2>x1 ̣\8΄{i*BJYZT6(5NMֹ2}?R*k ٻVRгr%ס`VZ뱥A7Zg )~JY^n!R> \ 8{3 xo4M3/ʕ d3p&a Qc cfߚ/riDRw,km#30p(3Ѕ2Z+Za AAzmhRo/c[N` NvkW.8MRckq$I01֫DHӴyu֯?,jnO ;aPA$ ZzpFkK%ՊщYV}g@}>?N_s۴΁:%9&i&UJBI~6f taM&&t GT *vgpTgYM(|oLEcQZ%"1FIYV3٬LDqd2> 丂76"v3wW cZ(eUJ: ^$ #sP`Q5Gn%34E6v`a!\L&Xe@ZkAZDB&I"dAQ' pu RZB0fSr$t1J9a&GikuzW$PR:khS, 0$MR $ h-0 M%3 S  319W=j5V+}|ٻo*pW87*D9e90hAAKR (=TW' QB([H(Rq"HJ᷹4RJ9[V>Aܹsd@a(0 3 yNJ C@B0#/P*DЁ#\}J` Jm %<PB >m+Ww1{ajeY"2xP(?iI68kT & B*R*R`Ĺ15amii9IyriW՚ej f14Mc緵9g}Z7K)R^ \ fh7攴A5"yg=k∂xSù)5Ұxf9$N>?9MRc #u83,?:|O-)m۶9h\gT5w}(Z?{ur}q5J4o0r5j"rf=찈W ~!W^8kfYOW,~gxW~gxg³j/v7Wڨ;6x>u?;U-lpm?!_9Vv+(Z_w=6^s W/lbYgGY\Smw6FV~ŕՂx)NɃ/.D88 4I1Ư3LA úLYt;ԁsO@1 $(S_i A vjvV'f[j.$@)BPxV5us9cK,Y)Ո朕20d2%H9g_!쓘 r>hD <\1$I4Nh9_K󀛵Љ$BΆ }e2*G幈>b<6/Mn>9B >C|HP(ӓδ/Zutt̲(IY`2II8D* (͛7\pOAۿx(i>c/\@Brf 3 18.MW:: bt:E3S3+uE}a|>%\G$"{O<qMfO|^w`-Y/雾Sk:|Mj %@ 1SKx=w~OKxfu5-ZwvZiӦ+>oKι~k7Y"/{鿳GGno?^x;~tGV'|D.(kE 4P\GZV{hҝW}sont~]_շu;>N_y/Ap.8qݧf͟yhho|};orggG' vSIZ_2Q}K>d> !.txj-I=&I|0zö̊~#|;ΫZww oS. ]wP(}MW,#?hnbjՋ$ۿ/M}| +:W[7acA1pbt "t]yއ^yͷyrՏ{ςzW6J}axgrs:sOi?TxѬh)N"qTp q$.EH+QŵS4.m )FRQ!MREVOͧGo^~p: Tx"*u( ղdEymorgO~ʦ忸xg rǘ2+ϟHk֬ؿţӎ&Z=Lk~P_ֶiW_l*ԒgT8G#fK4ùQ8+>=?v>;{Fuٴ7~ozp&5ꋧNu)7^vJ`g` |%oǞ.O#4d9rc9Gk" !"3IH H,(f1Q(Q Vk 0[pF 9(@a@@DBf@B"x'HV 0"AZx3 LJk=)+g C{N\/dzGA,D!$@R(V8H| Nvͮ[1#i","!>W֚Hdd GgcsD=#aR$B ݬi,!0QMN@E 'D!u (0 Q#!{'9m'BٞՑh((фFQv)2Z!&Bfԧ>Z邉${G0a.MQR& 9"bWr344]Oׅx|ppcP_W]gbhJih&DEU&{/,@zx-]Y A-U +{JkA"aVD(98 "-Wwľ.̻k+]]]]]c2b!m5Cd@䁞iUjV5. ]]]=9߅.ו`&䡙#0AoCE|fC,,huxyKxagdkD'(C;@0t!DQZg:Νt lGsOwku/ٲeK[tOo2VOKC$qK=4 VAFq[nl59"֭["Ddzغg6voܲd\}Є%Gv)y򎙷ٟRFkuBD☝$uiλJ}ث]-|cb̺b+"HD{RJD{& "p0}5ZCsxf-M{&@[70k |ת7nqUlW=[uнn-[Μ1; bhk۞W?Yɡ۸fFxZOٴo᲌Y̒:o'Ap^aQI*''X|IK{VޚsDD!s.c^DXj4.Z8AZ5N9~e^re:D9'`319kUxRyD&,ҚzlS/xf|N!~36'~z# {'jFVFdqVt {̱KFF 7{J+E*҂Nc}hqRH)3ϑ4 O4;`K.&Fh\6B|Ҋc,?a1.^GHyZDFDapzfED8,톂ÌR `fM]woLg*ϙ@M@Ҥf⃐@QGDfNb^I:W؅I+:-ZlqqK,,j ̃\izftpDTXGq sb[ +!"CrkGԧ>$bkǺù43Ɓfȑc<_<"KzΎX;]|bK;BcRy"9u +5i8kmXNSD4(F">x„ cZk =!H^ ^|7|~y{qlY07;`F=нkݖ-C}]mUV7#";V[55EP `HӃ=om9 9eϮ | nTB/,ZBy^HY$|6 ^.!|E) T$bD+"D lRi( qam."Ӱ`|ܞc~ɉlHEsH)fijHDsmx ^-*d l"ZkN$ g,D Tr3"1{5_N灟a0DD  Ҥ[݌ 'QBH,HDD2la\8^1: F8fGZ@sn a+;\Y4I~nv΋F)$bU"̞I5E!D0 H<ϑ"jGбbEqD|>D BED|` ^³gzwp9 ܵ\.o[r`o\\.cB #{{'oNowp Kr<r+ݶ=\.˽S̾ok`\v:6m *U.OlZ^x|FGFGۻgȾ={۷odddttt=#Ⱦ}{ٷodddlll||/-cw֮mk7ȦDm˾LVܱ~HVfQ-ݴizm l۴MYvMҷmy_wlުD{mjdn6YmۚO :l3sF)wvkb1p_ }ګW|}[ʷn)u|-?X;/˾;6~5/ \ ;&i3'(хx{.'VX} fP Bm"|CB"2Z;g-ӏ;[n5޾{)]i{K5mWJoo;wd1O ^Ji31g_ Pm[ p "Pީ/TrFmͅ$IBsXD"g 9gAsZۀo/n}kV^N8 Nv r pچ 7{UWm5 opj\ozӌ*dX~bŊ`9[ްW5 pͶ$J~śt9SOzE\~{H-W;;9\u\`/M{D+9Wm(S”?xZ] ǝs {ahPrnnp7wj{pᴷu@@rD3kͽ1Ttf/$"mmڪ\7ԗ\pFs"٥?jٳg 0샄 кi"1f9<#̊?o-`3nҐ.iHtaVIx[.v; pϾ +lgmXlG4MC*cLxan4DHsykBޒp`8`TӮ.vŶ."v ma3.Y0zZ`y3÷)cI)$PB*IfՔpAD,9/, +3'1[*YyY "xdlx6= (V^<-@E&ܜ];vޅԔZ)BB"gS ED+f"IG^s7ˁDG4Ϭ$,J 03b , ,h_{g጗4 SʟyoG3pEo3H)`5F#"9g{/:"aΙyÅ AY!l0ұ]m&:~-Jky9ZcO>EE \ "QÙEb= n>/I/Wg!+U0 =ss %>^ b"idgvG$F\(xٳBl擝>y u[u!.LaR4ǡ!ogffQ9MB!wj!S6?c`id7cKDL\0 fMc{W 4nQ:oo7#yv,fSڲxh$ HD R s/>q{xσmD 9 k!Bπ"Hϗ὏!$\ { Ȍ 3"M3Xay;ۙ3bK"ZM#c/2D 5*4EA)e;ĩxNOgdzfژ(jz+Adj-6D)"u""]_TJfHw/XP{Q(ݦyH}W&YKa?C] j*BjuEqP(8(܌1 trx&{キ^!M 2Ę1I`#E4MඏsŒ/6{ lzx v;Il@X2M3VK>=왙mjEdkY\!dzJ2IiE" ڣ!PT*ggfMSyk%ؤ2f'FS=gl:w-7+k_WWt\lp H&W1 p H8>޾339{ 6M6MFPi {JL^>S]&M%0`,2[Vh@pz_%SYhh^._oyxULVx_}1WϼS8K?tFM+CyEJl ֹ IDAT}LjjƘ&6SՔG7\?mo+BQJKS ߤ¨^)$VJZZkH 0#)Dm7iB%c5HۚY'^ KވnQ x 3kֿ/Z1ދpP mH}W(ĈVJ%73c1u}]yֈhh:f&KGaZ (ȦZJ.9o| Ё9y&=2DCי?)fEM^4K,Mݐ5M^Z ֆXԤ1Z\Z2]>о oo9j{":2+"BIBZpw.MRD, 6h}pE >Kؗ~׾˾oW쟻/*^j^F~;ݪO}?K_{{׹ʻ={@)EƦ1).8J(12Q+F̊cLH5sU}}CvȎ`g `kP_@_ C]}C}CЅ=00+/P'9kK$PIQƄ1&I8ZX̄l8N$cq8JB'@ȾYh%VZYk8E$&\Y8 Α4Q;k#cZksq`x.s: jݖU"{zz6ni:uf7\~S;VM>Evju7 6jJw]׽Y^&KȑcV)-RZkkVy2Clgy/(!M*̷ @9̟AU֑1OW_Vv9pKŰ 1I-"hcH)Bt֒R/ZǛ6Faű"r (!Hx硟t)އ-H13!i@df@dC`w3a"C-4a6hLM  XQ흋86Bш887RGG9#IFQFT*9k)wЏ/'yg ϭs֞T0i@k\1MmG"h$b0IAԦatCJ1$Ipwa| AGgֺP( bbsy}E$0KamOvLI !1PȬ u=1E \"lٟdmSϖ@O{&7ǑZ)DK1Fk98ERhhcljA:4M1bX,)BR:tڄR)GQTRCq,: 2C =L;(1D(J!o,鴻oSlGPؐT)˽`Ōqr|U2 K-A6gPNg;CQ_\.g'os"08L׍DdEQ!ghrZ|-=>L= D\X*c܂%D2 AYMb#nh%\Dޞ#3׹`"a(x"$#@vx͡o<sL!_zP#l",BvZDJRHb?k2"<1y>w(l.QQ1j9UU@f \.ƨ3͚C3\\nU+oK`sn7dJ@ 1K$." EFР(@:.X8#!rydԚ(fkZ'IEq`rZ#E!ZZ+ Z!6i-Yh2 s!xVQp`TD,#H!#dzDHZ)kmPY7@ȹNbO0\qb  LƯt79\\BĒ`XB,!1`snqv(X$䁫' s"CMdB z\(&fv΋Hd"T( s4 +ʏz>_.hbŨAZz)@ Hv?IW`&~Bp,ݕrwpRT`R!l)v5It'kؼPK UᰩA:bv64fHH;LMJa5%Il5z\] 犭[{MFGjZ^޻w|bRٳgbbb޽QTDe2w={FFGW9Qi;}+~J؟'noʷ}9yGs: ""֮)~В=X[ǯ]4Qv 0M t&ѶBlj^۝nhTۙp0AF5t)٤&. ml**!nj\sŝӊ}&4l6M ŢTŋW*u0 2a*?wkF)7F|* Fhv2QQSK1udW \uL-{υBU+M-d kF#,Mӎq4bP#ff{Qd\ǤCM'^^  c 1oa"Ǽc"km֝ hZyjqVX**;::/3 xEIcy70^.-D X-@1QO8k"RGPJ<)Vz4+`30C[Uv aX1BRY-]Gs.C,& ['"g7/\r{t.XZkfǎZ }Sg[>']s_ې`EZށ˯,!|T?ېc>$uf}L$][>'Gy.^x KaX`/Z8#Efi!2ZDЊ ;/Dy۟Ǖ|"ŋHVZ(G= /?T 8)nLsc 86=*Dh"̹Jyݟo!6jQ>cP(A'~׽~?T:NP(yf4(.Kj89!*O#4יhy c^"Kln4 !%K bGggPX`AXx;lP! =_>@͢a j$-"4xB y1Q@f&RJY9T*@gg LX,%rLTo~9؛HH̜4q\JSkbrz%A> ޓu)ӡsE?? U7oNUz Ww^BA7L,FfISP1zqPNuYED$_?1=#W^y妿9 (ozӛcU DCg&ʤ6-JijRk&R(M@pVJ)س DU3op y÷.\Nv¢ .`|ZswOȬVZwxxN?H=oz]vΉhll졇 ۜgq::2222DW2"a(@{N"&j׃I4N &v^u42IJJimb)Q&Ou]7<< կ򫮺*[nyGsWRK/ٵk+W2^ZTjڻ|pʕ}sC<66ve8dɒ%K/Jg>#ET,W0>;ᗾ|^dbD0jYZ*8KxS,h _,JEαrK|iֽ_Ѹx:o-Yw~h]wyՉwޝ`y~5(/|ᯣ(Wڻwd>cWՓO>`hŦ( @;gv;{'{oos^~ş'?\{Hp;M}kaT?s=bZwD("H&I I#ZH3u8t߻cp'xwNݡ!tՏݹbF?U4_WxKB'6qhx|k9z?O[n-^Sky7h46c#8_m6}$ C#uYgw5zs?~%`]ggi5\ܹ{`?/?ϝX딎A&2):9g@#tNoڜy3KWB7Y"я~[}Px޷xѢ R(>pg!6>}Q/U*u^xỿٛ~=~3zYg>D3$e}`yOD_/=aPh&IEu,BK>ZNeOZuG$c"D [#aN/˟c'Oٴ|?vԮq{x:^)mB۰ Q؋umbEhiCى@EJ鉉Bh#"ǼGy` !űFdDH(<BKX<3i_I@s!-h)UA #PȜc#<~9rkE.W#1oyf͚~~o5k֬Y3DDy~lkJ@dQC}]850=74˵Z@DĞG4SqS6N=e!og~{ {ӟ9-o}ӎi\Ʃ91<`IEdKώADG^ Dy?]`p&g6v[p~Ԡ4T=ؽqGЪ-vq'8 uwVmqS#3k-?z}HZ?OF 5ېylŶnVkcSqc7`toBouaW }C0ԇ/C}_zzF:Dl!0mmF_۬ t_:=,!Gg4CO՟l2[|+n8^U17jݪ#S0j8kDπlZ([W$dz /_1L'P̓)s'<-u1o1po¼ԹH%*D+̏ W}E;>o٢EHZhѢm1oy>wu":!D"E E@$dl ,D>ȿȑ y~DY1.y" YgBDᦾh1?y,YDg$bψHY2[f(ZR 11y G@ 9 dz  Έ-D̜ T9#9pFRifF̒8CyY;"ָ#jDApz01bˑ:¥ aP=!),a<K@lD`f~pDDslӔ׹1/dz?#6@b3  [B E@@ZuAD21b$DDD9aVZ{fgmE9LY)EJy'0|ܞ#9pG$AP D2 wftoV! ,6陕 J!wB;:E IDAT1 "٤1\r}g/5l:[ DD" ArA';gED(*PBI#cs 4IH)aVJB2D9GDyZg+ϕ:RCYOLMPDsN3x%DE K-4hVu5QkvJSѦ6U AY^08I8IVL:~e[ uow}sI H[ݧO>|ߏkȻ[rn#!:BO VUX@V rRrqJ8V{pʲ@@E@mYVclb69'ncq=؉V8[fuo,N?GaD"#ӝ#4bUUu,MՇbTUĪ>̌D9 قa@?>۟cܞ?BDyׁ>dž7-!R=֫u DADT TFT5 X 3,4 j߅bޓQs*bGbT'O؉킪ƾ9ފ"xGHaEE-6W\&wwC_iTW ?qDOy؂k^ғa>Icc'Ο>iq8rc?}ض^h [>24]o9M @9DB$P:ncH+v+R[v:9DG$"l  Dd 3گ%DO$hpSbSO> )ɗVv~%AOL=i}^?5;G}~~LOOLL#\-?8vax_9&QM,I8BQ2]FzΪգ;cK!Sh99GD )%qS/_?7 )cc<}7; ɓ6;u'UU7i6濈*ەYY4Q*EUt wޱ,| QQAS2lb/MrK F敱qtYW ϝ/oo9/l\*O!i=/7m? _+IJEXWr]Fc+d)<~NV^?py[|x?utosN)jzˋ*;ǮshN#'䮩6 :E8VR7ySUP`aU%r"x,l[[7CPaղ׫/wE+ww޹{vw]#-+2cܠP\@ˆe9 [;Dx엦)95XDm TO nMOHq )0 soiA9E޾Ţ[Z\\_XX_\|e.6;;i]{~;vm+@bF"H@@FKq%JP9JW4^@ '·z??gEb+17 o9܀s/]x}n[^<{.^2;+Wٹ.n3oG{w;ΝVIx֯*y5>ĕڈE9!"9pj-٩Sn4؉i3'؉m;q`y81z'*CN!?1v6>ƶ_ymцe"س3{Ͻy s]Y޵{GCȐ0PB8%#l,sD.HBTXDc'V2We=cG/mrLɓp> ӿm :EGǣp{# ŏ#:q`kl+;zsDc$ܵsGi߹kTsY=z!0Ӯ>XU-!H2DL)@ h@Ya-~]?Oo9Ə?1'}ǏOy`Û՞=}8 ڝRckŏQ#O9rvml_=؂ DωPDvvQ{^'$m"f5Wwpk(DT,li2sPvlΝ66>z# 'Ro;'\1sf Yʘa[5N h'[FU"0An VCY1% RbE2>wߧpDکYmUcDD}*rdy Kc5647jzV)EK_3)-dJD9PQs f"bkxlfQ!DyRPT&;lH5vGsUM!":{_CPaNLU h݈UEH"b9"L|Jn WV1uLm;^m.tf1%qٸ\ > ̢YHTɹbF꼱VYjY,,:4E$rDY h";Vy2'"kws)jvb;vqئY2ՙ8sf=/\ܢo>30sv}zyc:S o9νs˳ɪAެx2OE`dVU{(f0.WBs޹u̱cSN3et:g:/tt:<l`T8dp HL9`0tbYӱL5{;S5L:ԙFt:̋3^tTәZ9t:aQ[ׁW^:Yx^٫W_:7;7777;;;7;;???{+W\rܬ7p}g؅SϪg?.>g8㫯feU{^8uAUgO/^PUgm/>O?z٧U٧_Tէ_|u]VZnVnϧɺKv]3zp ŧ_ S>(]YwD{{ou,"Ynn\UV="UUڬIR:Er|ʤ׵lڡp'G?6!l҅{wx`|rK6]xc7s~{(˲ Ts{j% #"ot:x^t\x7? o G#NsHؾN39Ï4ջóu}Pt:yZ! ?9K[,*6p dUru *ծFwfmCSnG)15N,\o: 7lo7u]:km>o7Xcc_y,8WSXĚfݪl k쭆~V 0EdsިoyGE:q|w=ٻ+۵uݻQU-dY{V&'\"KKKPc<8+.dy%BP!dU){:M##a-lttS-(k*-G/| "lz,Tcoj9u:uׁ|s&Ƣi89>|pj-a/~?߻L(Њb$ U\ү?u ,ؤM5='? G$ O'?q|j[su]\8 5nL?g3TAT% wCmaA$Gߺzo'ԧ?':<?16լZw~m͑SX/~W.HŦ( G0 $Sw?䭠Z3o>= 8qNm띷b"߹cwED{߽߯` Ǖp'D_kx50HI!oDtD@,(Zco'qʂ6^Y(OQEHYAarI5UAXHcD4M^EbJlg!S*F|bVUk|^lkƾNv_ sǯϟ$L "A@eYVR@N,")zH^T@wOf<S%h?}3;Z ؂ln38̿.1&BfD",jc|PBa'O?܇㹿ݟxVa Y1.8Ԛ%?y9MuHJ)ƘeU]؛p]6Í0l7VV֎4[ڶn5_}"V 78̈-Ng9*IKWq;w߰޼w{jD@ V\|\- h"+k;Y-1hQDB D,+ r.˲T5 nDa35ߧ=c@_dpa93z :skλ!nMV5f8sftpkZ$(< wֽٰ-4'|qC8Lt:Z|/[ھ-...---//ݲ(G|'޿y?|偣ȑ_|/8 |ӟy|~g~?O??O?}Ǒ}?O^_x/O^vWO~~(~aiiiqaa~~˳Wf/_6ɇŅ+W._<77g;,ϿKsssW._4XyW}LV\8O[#'5WZꐊB3.]%ðpkkbÇ֞ZnKöTXsoMPj} o9{U]8쳫7jE©[!Tq: HH?^v6 ;hVؑю܍Hwmg#yؙhFwh+JDU n>\!:h۳w!s"EQLtVV"fY"0l=3^9gf^:{6?vfopa/tk 7vK߰U  Jb<^z 64';9qqF٧C-텩[?EM~) \_V0?qT1$@RT@"BI pj)lҚ}p*%6DC2Nb̲^*S*FDi:NsjeϥNC~i߇a^yt.nFfox[ϊ_H1nN9ni} VmI'ظ5'V[cm`\t:<$\ݕ-˃w/u$+cVWA9$iQA (=T~Dz);j"1U]:d2ؔzDbV"#bUUwyLO^8иF6ss:Ng|rV_CSD?}3op4(&! \;y*^y1HRVgUP΢‚H׊l̈dyェƪ YsҶ]""9EG7<2"Xj rUT~nc# 2ab7E6@P.*BDfQQQAEQU眈{l'{[֥ȲX)$K< IRD!Y r9l8p9"E] fȥT9(hUH< c)VF])5?r`Kfߪ$vq$SDׂ\75;m(~!xuA{OY0"pJ>s`u!M k1Dvj\!uCRUدNae]U&uZ\ 򪋰ip+ #(?Z;ۛZsy)tPPSJHDWk94 ^<x@AAEH~LԊ#W JߕXտNL8}٧4: }|F?FA^ȇ""-w޹cU8ݭ{0o/-! 0"#"VUt|YEYHU$MD ~ <|OY!N>}zp?OOyN$6 3C䠪5C|ǦBq}_ӊ!F/ mv{.}՛{"./gyZ-f [Mװ;7Fsl ]K 9" ZVYt$$9^x]/kZ!WohT {&R+]lXzL! ,CYf1(V+:.7i9O:rFi;O8|ߏ)Փ81'Gxy[}'̪|c]+E13!s[CLTվy%N9xh'0\q%* |\ 0r{;7WK} eUU̪˲ !XpJQN)?cG/mtx8:ɡU_; 0#'7/psZ)@=kF TbʢYf6r]Ȼ~TTA-8*9U?W!|P+{pR.xVToT!U^J;bn%pJ:"!BGNAcwu}ٖ}Xc=4sQ,hEBD>`>]߲~5a=9bՓBpGِ>H}Alu#L; h!TeP!`JQUm),bL)UYZֵzG]n9sv!āe PLsj?`;Ca( Dߔ.H5:uՂRɆ{; E)dW5 WC9癪6 2+ U;GrGNK;:!&*j|0/J3QH[VM@1<[0XumJIUCOyeRBDQI%o^OU60""3?vuJX U9]yswo,:'NF^hX걍wNi\Bek@"""^xRc^U;NLlHg}wh㳊A9Iӊk} ߓ M%eA ;wM(0L<XJ19G![y-``PY $0:d?g{E Z ha8F y A23y#3L T5'H)#$"H$6Y9"Q9sJy) i*#rQ2"Xr FTs؇xc\YvLJW8G1F,˲./[, ѾvstA3uւϱiXs-βMB3S_3| O}pHTUw>孖HȲc2+I) 1&N)W}krQu-c۫{UTNV!AZA\ji x"pޭ>фEʪ !e"y%"eQ3b%uL8ՙ8s ^ya _93”|mCŠ6z{xw,u:6+l&0۵>CgULa<[f^`JW\:;;pUfO]re~~~iivUpׯ\2w.wr?%P!/~{Bq;Wu꽶իx*^ʥҥrRtpayJ{Ev痖^zlp__X\\^^}^T_B4Z3P}Wu-P36Wl_(TYZ7BXqðA.lڐdתOwuu-hq/, Q*@lU5p~eȲ)jUUH~1mv|b| ʠ $nJ%p;NL;+iEITeU!xдEEDߓ[Y9Ї8gqKnݩZEDnja@6}2I)ƈ{AHE@{SRU0ꥪRh4" Bi0D`_~rՂ܂gi-V>}!b+c*VeXUXUhUUS^j˪<"݌ڱN$#Ngrc/t:xCc 83cg!< SL? ľW:WG`NطoߣkEjsC.|a?0=}BX?䁽^<0ycg\<ʓ?{VnV ξS_թ? z>p~~ޜp;fV@mh#!"91% 2 D+>Ai0W@%^ҷZQDUuȈ-uGEB@,ϫJUZNTCnwdtʢ{j)L{hj'D1H#bT# l-#GRAUAEȹ ̫ QdQĊJPf.h`: ",5HY>23MEeYz!&0FFFއ,u!##ͯMoERJ*BH{HLQI@զz|HBPPcYCDEpD HD伣U$0iPRgoy 䦪ه@VUYBb XUCD4sQǪxQ*˲nȆ{;᜽Dfp.%BYV,f. 19geYenUUHd3|UECA Nkq>{P"$lUQuE!d"LU@@yg;R9BB3s֟7筼bౡ;d4{nD;})%@`fel :XԷU)׽S~PUŀ9bsNE 9O GŪjyw 2Uzv9TUD(F5ΫS&hMl5Tqe)&'2TWU卡Emhu` n`k-[5[myuP%OW~ (D(Ymf^UQTw>xIL's>R"$="e;wbfI1"ZՌ獽qyl2K8HD,B(H"Vb0LޗeeY. v"B"hZ0) D i([.E??pQr_FsQY̜YH,gY 輳P_eYeIT 9%5hύ5v5z F5AD1&β SbUQ, UBH1~HbU픒^DMpمlՁA͹P\6^7 4ܙ[V_U67ը]{bMfϦAJJdY644R*>HUyRJL@ȜoOc1AU0ɔe;.>G@ʂ`-Q0 |' EUSbށBU2fQa$g1z`~UH*+[BsjшFJ Sh3iC5bP6zӲ(U8%Bg!PʤB),,戺]i$+pE]߮nE C@K宴>oToXW֑?罪)%HUUU;j,+N)kյ􈈀ZE[W>| ;(O_n5VU9rqJyWU|Dȉ}Yq%*z#SZ-T5iar.oh+q"u`IzҷT=kPyHv~@v|+?;?/]W0p BSC¢*-RB<! C2[6!UbQa:u+_ cїia?Gy!88!2O!L?1 kw ~|9sUYy> btޓ(U$sUzYg[8"jFj,4)03Q{g{P+@{jXBpbb5LnQ2lK1@n;1en{.s\!B'ae3du޹0策 QJY. 伷ApΪwk5[o<2K1~Bpjd"Hm1eHU3#ŷ%VK %b%e&$T.C~U\QVYcF @!1FB)픒QJy*K$1Z2˼F@$A hfŮn-bC7"fY ^eEv{N,z,EYLL)V1eʢ(cⲊR1V_+WeEW*c^wɅazEJITZVY"C`,+*C[-f4u4-ݰ[Ӂpu*(lљk4x+p/ Z|\귬,dلxR = JJFf*6lZMޫZywUv[UEgC:@f"uU-+a_w2ř|MxϭV+˲jԁ;vj<sDey;DD@+o7]<7#t:Ԝp:c36:4 tf` >]gu:NP68O>3OJo?w:W}KkV1pA3\\\L1,wiUY"#*Y|לG٫nkԴXFjUU\[7Q~TP4R!-heD$7<ܥZnxo:S׾sɟ)7jo~=oٳf?ۥOƽN?ڛ?{~vtMNyx CS|I88Y- <U+V/=ҶoGj`O^ hEqdyѧEpB]x n5Jm76ʯ|}յgx>=<~3uvr@O>7sͼ-4d5DYcPST%rY%M  eYfyn(VkPz}Z IDATy㪪_{~.]T7kWEH [W_]\\g-әVviM)%8;uiPyv۳g:.|uƩs:lxg6U}fJ<733G3pils3\:>zО){̥Y75s)8;4%鷳ϡB:Sk/ܾҀBݶ쪪,]AEZ%޻<˲TKJEBUUmJ TR %HW0^Nc~xc|呴# w&<޻GQ\{>93#aca3#;Xx.+μJ'v/[Ko?͛,k‹`ٲe;c+7.[,ٶ_v?}Ml+=y3/f?'z훿s8{>}uolٲV_Zzkɒ5pfB}7-w pܳwAQi}i06K}b`3Q ^e1MEKdFGÞ[Jwq9i<A;@[4gsLftClYUZ,\ptmpkzfMל s~8yM>o f͚^\o.:*gn|h7Y3w2]g_sӚ5k&f]uL=]_}hyR''N~וkԚ M/y!» pccJ:^ صjDhRz##_ :$ ttN̉SҝNLFUB,%@UPGlOvm[%;qY}{>nЮ3y~:l!kwy5_ћb\5.X\( zE6P@Ügb_@It 1* F Hi@cX0gewk.<~_؉v㑹 oRK#{;̉HGi,6*KY\(0ZRʋx";U;Bxӝ*q] @`  2f4SϭD$zND̜Y(2yuq$I\,ijP'"<>N6%:;@ł%@T01RX,0J+T$1LTX,lfZ ^irHN8P\t'&@crBͺn0!c"@A4n 8qNNDiiqe(4)Dkm4:*R*m4HXLdF# PBW%Kg*Yl1F2`X*D@(&|s0Α1#Rd3giEiZ%m ;YH^(MSTqYܰ/lCSLij@nP,b $p 8xxQ4|nV\B:)ıs1E$MEĨ\`ʳM"s;SYR*F4H%PHPЪJV=2,{=ZДn`*!BU⭭׃8ƹRqs,LicvN)R^ QkUٱ*mrH)Bep!셸 R,#j`F@ ܱm [-f6Մ-[<غlٲ=e:] 5 &$^ާÔajBd׷.0r.ՍUzyZFʕ+nVlmSr)5JnCSZl]ɇZVёݻw#{^{={xu||xxW^ۻwﮗ_޳{H㠑N{ߺҾy7|>Ǹ8}lr(x#"wpuȖ{nhy 7p [DDv޳EDlٲE;:P;m;xPv>EOƃ;p˖UpϖVo'oblr9nΖ{;9ӅL|NLjlㆼ͛02'nפ+m?y[4XpY֦+K8cGG/~ F)E\71f3wvvIh4 Eb2"5v#&:4SPF@4i; ޺qpQ[.kl͚58$9w.@KAaLTLihٌhM=|7Zj-Ys@m&-Y/х'QSW5[aW#So>٧IJ;-=YzbAZ+:8AN+ i>=*.ˢȡH݋n(t) FԀ<^ۡ%kVܒ5ЦRff˖-[jەg߁ PbJ%|(ŒD)?!ǿ~˙ҍ) p֕_Y?rRܵ~ٲeg\U%`JO[|zǽ{:1Qk({WJJ$IR<66V*z\dk]91 Aބ ETB soD;Xlْ5EyID;.X?_zigWWgbƌ,-!~ur^gY$IgWA33e?űg8u)> D K@ xc`0M8Y"V*FYGI\ni!xbk3@hk{R sX=jٽ{†.v \MA%P - ԅD₰W+>w-MSN:!*ōzR( -*9}wKzS ׵ 2QEȯ{1qH+:@6_/OL)׫Jhm8"Ks@I#6'p$dHpA$";>IDZYpqT"i;>54-i`8Q@28@>~kipc$5dYι$IABjY)ZZXuP(|(/hS$Ҁ xU ǟ1< 8v:J)_ݭZio|ofEīꫯ"C|7Ro?3<[nc=v=% ۿ9Gsҳ/ڏ}$:-?}?$.6ε1YtT1FK_;q=q;s}K/q!Nԯ9ֈOߺ|[oO%ܟ~wݷ~;?[;} >ៗ/ix'WϚ[Õzs"|z_|;s*bz}Nͬ "s)ʈ=o޼m4:lޒv/{_~坝ݳsy_]U.W{/^4(wY˻wFSG ,K}Teؓ4JG/޳5k-3Q$DDZ1f_V{xs@t{Gg@\f. ਍sT(H|R D(j5DUD}?ȖR 02gz#J_ A jdNda,KMdXgRYU_|T*ek-j5"bѓvv򲣣T*>|p_Zc{Jf<[@)>\\:$ivaE_BNbv, QII b68B Iȹ,< }Ƙ,8ƘFbT*wϚc>>>>f}=7T[陧^P@lֺXBe1 Z H(*iʂJcYŅ(yRKFQ,sh9JֺͿ=]i2<6iR1HĂ"61r(w6(*"JTNU]C;;:: ͜CRD22Z:>jml 4qw7=hbDhCi>˻^\m&@*iT#SfXju|zGEPP(fHkLye}vG?U)/|Y/yڿ4Moӟg_u͚5_'rw |ӟ|Iws_Y?{6x;M@ FFj_~w{JHԆ5͛Xo< lSLRdT#uD)w*Zi5)i:_Nrxxy͛ro{{xN@<{?ϱץ9c>Cq|饗nذo"."*Hs_9?O8C=[,o6?/?/DKjl?~Yz{??'raۓ/ϙ#O^}eGC/s~~ZQXR̎H\\5^m(H+H @ֱ(,ر^0|N|>7= Kj|xǎ3?OFGG$_ُxRgql~t{_^"&X?q*%]=t緿~gãuDMHfdnCѨT fIi@;,L;EÑ7o޼/ w }ʇaH W zۿ1mᕏbUc3oh{ĐpY?Om|`dd4˲Gy<@6d熇G=xDVٝ53(iJ& ?]zW.[4q޶=\|d8ms_ʷ MQD6ZR:JZ=i4\r\7z1kldY;vرV> W̛7/ [?oÎ aToԯYrۧ\k[}~ݷsL~ksm&O= .yGᵏyss>#?}}8k֬,˞{۟;Q)Dz;"3hk]c4綿߷uk~wc/zvhrْo"EQ#I 2sE Z)J njхB^:"I#GW^W=+ -ppŇ.~c^#ǦG+/#;vpݹGyя~3O.׾w15$.'q=c93O7N]{7'Ioy Q*IwO J;$qRVO1sEPD-Kz.+:E IBYE:t_j{݆+vlvXpVs;VGK,pޟ]p٫Z$~cg#\?7l5WXu4;J2?y.k}s?}ٗ^6 7rاn|3q]C̙uZ7>}c{C~b[c$TjFkU %p$rV)m xØ(#RȈ?lf{9]]>>"2 FF|̗]9s8.|U"_|Stt6qi|SرGwtQkWKVo{e_0>"B5gR*uXHV,K;+Z=!Y2HZSRKqxNp'+m Ugmo1Ԟ'=M9i? "\wTiƑQI=E\VT6q:V|qWҪV*e`tiUo3K IDAT?9ۧ?<q~nĔqu.ӎi=AM"LhR @db,ISa*R'H c(R VeDLyi$$.X?WA"N9鈲h"STD(2ϋe,r2 4Kl sJӑ e!!iia 6ӼL_ 8a,(xRH{ 2@3AZǤ|k' ~&Dq(pש]GAD QiU(߁r< 9Kv{pyXN 8O:Ǜscti󀀀Η.]:2 @}7+Snahu_i'Zz`u;̤[h됚?~oDFgy~?{UǞO~~v W=[Wn:Џ}}}xl^ыo CDlc|N5Џ}W#s,ZȟK]4+zg3O3ph{?~yό'Y|{q^'Iwgݻdr=V[d@?vo^?\r%i=@ڨ_r%G[{GiԪIzߦz`fϛ]+,ߴ{FM6ƥAMJ]IDdKV }fq}mJ3ɃmLn~w1L&'7'޵2&q-L).Z;\1I}^VdOVlnvbq?~g}8NLn//⣛w$D>[s-_ ˒G30 "EkϿscuStâkd#uѵKsnkzhm~gq~\I6.hbbк9E&7>:^[O<3=i{OVpl [MΗ.]zus6s?x^@|TA63Џ]{3%~MANf [x+{->^zMqLu3k5p594{;t@ p*y p#y@@@@@I N+q"" E("aΊ(" QXT  ̣x}|||ttl<]ڝ1ٕݕ*EIH)nF@@@G'/I B(ֱ0cSY-  ,LʄD/Pq3P)%,!Rpu~tnOZ:bEv@n3 x"GfA$"``AD! !" 8fFT'4 \$! 8['%5XAi# {srO"̀N<zwH!CDf&FD$"$E@$KS@FD@ pܹ:GDΜ(BB$̖ !A~ 0 0@" wD@Dd4s zHHpy=)Ecy ? 7u~rruN+D@ro_8Єbf (Da@$fY @,q2ai9 DZPkp5ET>@148||tPBtαZ+sWƍ""3 * "vLy :1N cȜރg!Ec"R "fnkE9avDHD>HK9"iH!~@@@OΟ~fɣro78H!b"Bެ'VRMCz2H BRD49$A"Rʯ#bf(s"% lso~ ̀HD("w)A:?r P|!BnJ&1,(y y8"!9Y "ʧ,.~YZ,aqn5< HZd"̌H,y7mtSϽ-NXv,JDb'>A#d% %@XTSRZicm>@f'֚-:3fR*])ɗ1=8<ƷZfKeuS4[ntu^(h#DBR"K׊4QdyRFk%kфHI(6f#Bc"W.!f笏z4ለuZkY;EuD2v.7EYlkqWE$2"2U}o yrC}V˖O0|Wla_bN4m{29"ܹC<QHdOJ)"TUnd0رB@@X4OX*IfeP4TbE4)t\ȯ# c{HZsڼ ajMD9Q=wY֪:oñ~b>b3,dW"ݴi߼`1h,4_cuۓ׮4a﮿{Ïnn n\} m`':+2'VL?Xx@~9oۦ]́w7w g]?ɩp} >χpdt~!)D˩X  slHj:!jQOmڨI1 ͮ˱bXBThwhEaa"Q-ZRE9gu._2P b|XuM Dv7a'{0GpK7N{mECXQ6M,WN;;'ugMr'!zs!p|Kz;\NfHǢ{>|lP6Mj<ܯgE9 @"9^lڔ@Dcp4YE{w: CTת:K+x<\+6o|Ch=p晸@g`!.! -v:= T;CLZu^p!B?~yŒ{g…r,wsM|hI/hk#'(Dڤx  w,j"ű03;q^W:멫'Xۨ*RX*DbwTB!nLf(65(DAD<%{xAt-4C|_7 8358u:5[J OY{{Wl^?ځ޹[73Q$c}kg2r?Hj K7ʦESo>f{BͰEy>}0emہŽ!/ ߴRFk/2yNcXH$qj,IƉf֍7\bjvdt||xw%+fNϘ1T)۔S|{ֶ)H(9"MϹ 37K(s]3^Z˭O "qX5 t1Uӂ|:".^K7yE/lh|=ӸgK-74s;uMm3r 8f!cL_G'_9V@@@g)αc̎2gNR'։e,q:k d"b&6čFul<呑>*bGY.1sVgbg02}9-lyx_Ƨ!R@S҉Y3h/H3֬Z?u1}ԏsӳ1 |-iO^rۓ<`wʦ\+ym𱍃3|`Zܸta3{M>TDo>%mKߙdpKXۊ]ی+;vXVD7.wI{~_MNy3gA̡^;¾/imX<8|{_\h5O=#"[q >d]DclZF:$sbYбY֨UGiVH0tzweˋ7s΂3S6˺IϽZ,BDZ/nJDK%x{;:wJ}\~}{ ⋽8q NDXEĉc," , ' cɜX)2$&xkjUDΙ],ų:Js+*;KRAM+}eIiǽi>YzhĻ}Ls> @3=93'!*ѡ m7AٯGpu^"-qca/ue1q",iȲjbFQ&WY]ΎraV)*@Zf[P)tmsa_Q '{|7ȌGD_).MTQTx442>a'0H4ҝW\YlN-K1+$uN\eZ5iZgƷ)vuħuuTΎ*Ůr%^eߪyf WY!4E/UMBDfq>vYN$>B۳2 J39 XASrO [H]?(dLRG:I-gZjI6YRKI`vyR!fWJ]]sŨPZGL2r Zʿ+@HFk3eD A"%"Jkg-6By1vFB6RZk4fdy@@@@hH-p;YA]0?8п/Ӿ:idn#>2<ED$A74i$6c.GTE5gVeVQr).SS({׽\kinDl1n#`O"bDEy0$&mΫ$c 5aID#bۋ?|bY#i-gsZ' "ԜMzIlƫYjRifVGiVR)DD ZM8v",cηߓcהGMo_aM:m,Q૛6' jtѧ!x "bآx@P,,bm$Y,Nx=M2U2oS,\Y* qYp5[Ih-624KFǣILFfh>ND+߀ :fW0. ِMABg3p,eIjd6MF.5,wΨY0RQ*tbQ QT Ҿ|*oJk=}\|!/ ,yz.wֵ[3@@@y!9c7 MFwkvi%囸K{#?& 9IuȅY$+9dl._o)"l@ZDF M$D Ͳ402ϪKG*.*Ÿd: &R:*b,KA, NZ<@! 3;P9_9qH,,MN韼!>(/ O'^Xt+5Џ?Q8?xߵp@02:Ҿjc㣣#mǫѱQXojmZٻݻw޳ս6gʞݯy={Wwzѱz#^ϭ\|nf_36sri=gueNyNwGXP@5#R0 aE͛cLEÉro)$BDD)kѰ6SHZ)ߘy XkY8?ĸ-Z~vÆ W]uYId#,nUyѶbm'^ [=<)}[;[{Vz>\WwM|4ߴc6V@@@Ѵ·=a'Y"ž>ů݅Y!;q!& qd r\";EH1DE: ӢҜs{>L)8,/ "c%#Z"B|::ˌk>P++A]'?g}vݺut;oÆ bPN{O'oHZ7-ŰqRZ};MI7}}{7-f@?=3id3uM2=-?Џvc&<3]N> @GγFĥsbDFVQR,IVh)"(U.Ÿ+%SMl"DZo9X-c^k@jw3+إiF6 fw\;y! b~04[1~!8BZsv eWPHh243XZQ@H  i*tc&YVH쬵yJ>69$fgwn!:6&2,CD$B$r,%d; 8@{Ի|YDi)8й/J)QD]!9oJf3dYU IDAT i¹98@kW[cfv,"H"Yjc1޻u)D,Қx]5_K Y9n)H(|Q陙\Si\Q̇}_uQJ)c9OPY T֚<cėfX8_޵ݸt@!"/{m"L {3gDsYXGR9} ;kJё^qF*?:WJ9g}"󣘽q=q jRW` ?3Z릳 37")jʇ# lυ`>y9J)q P#y?!FYS9{C~D3g"DZ7R(sf!D,޲Dw 9̪n/b$(rHBY/8z֫Ya.lnX nĆm=@jYl0;0 Z!l,RzQ"h"Us̪n4@ʼyQdN5fQK:F_Y9AKLsP|H(e y!QeQrBHDhi 5mG$UXɺ"a'B"DEu޳HE-ZUuV+ыd{.x0.iiҸD̺ZڽjrP"29B7v>" (" $1|߅E@2z =cf=3k ܷ{Թc_wY ~PdpQ1?;gsW{ 7< ;6unM[dJ*IOwwdi$-GTaE߃t-fQU"" j\l2o*e+9BN?o!_7oʄӲ^m69/Ƕ왹R9-Z4 pDYYy{PO?'欫.*u_TbbMԥ"Y6GvPAvd{*˯jʊ("Xes9"v/.ոX|]\W c}1ßaQGCsOmwngƃC/%o/r7߳sP1uV\ko+z:k>2-Z:Lb*Ʋ>$I&CHD )%`I"gzISaJzZ)pX'>?; vl>X拝>qT=qւ-Z;mӳ[]g{v޻wFC7혙ZMUعژSKn߸{6Mymka}M_s8}{mٳuϷԭw|B]X/f,DMQD,@M$RQ ϋ(sD#ׄ/>&׭kyYLز@-.*g^X!{pf:5x!pD(Y[J&1J ު +9Z"K3[Ǐlfw֢EϕjKC!H,X(6qؼkf--ZhR$xW tsݢE-.ZE-Zhglن[hѢEK(y#"UMmd-ZhѢܵk7nEb&ɂY ֊Mݥ-Zhq Η8U{t[ibDN hnXkֶUE5V3=h13;gy۴hѢE @gYFHdt#"G@^Tҏ ~{?^xGϏmfh~֋Hc7 OҊzt˯hSI׎>oQiQAaU"WDP%Z O@DTѻS8/h] Z'7D"DfVUN BJotb [uP[hѢŹ26&7c//^&In(Pd~"c#"jj*0ȑ@yU(_77Z2=/l֤:TyDdaG ;>TU)yXnJH(quy_-ZxMed ;|姾һryض$DOW?y(#D XeÐ=LTM, @˖injrDXYq F?sNEm>","y|z'T`YT UQӢE-_LcjT ڤ_ݡ'|7Kw֍W.ұğ}?^D %.l:U3RȅF<@D9{SŁ7\9\Ti:"D5(y@ 曏]SRr. "X.:%f*/{Gd~+ZhѢ @I\t\}o6C$3ODФ]AG4vTAy@mRC3 3 .s$eF{baT9qD,b+e)pL! b(C:?;|y:y\􂍼qۦ-͟wb7C]R"w,;/|o|oo~o|o|oS_ç?'?wbO_?fUѳgg_`'<ēenPŠUl4 ~uPL}_HX<N~y/٠fT9'"1%!Nee!xTebv;8~ov:;Q-"dֹs.X\tm/\ ];]mL Oc7X\۷o߾I_7~ann~]]ѽ]󲡚 9䡓Qot=WvGoͅ{JvYa1r!C.[0w-;MްUi+a)!\]sD _qp 70puE򩧟/}7ϼkH. A8G`l֤èL#>j @MyAf _ IT +_5he7+y$"9 0#D9%an1Z;w_9wNDcJϲjz6S7߳s3ozq-k;_-/1(<ΖLg3n0v|{ggy-}s ow޷k3=yaj۶)X[}{2k>xp!yM󭇝wgWۚqXۀ)].˚d C{}qaly߶3}V={v;;?kc[޼˲)!\S+sc;g]ylC+%pۙo%gFwHWo8<ꕢ%I4n–fQ"IZ&P5 ND.U2ݬ4"uiRaQ! j- @&Bݗt'C'ssy/"VBYHeL*HXc!sb,,!HD!9(. ,1ܭ}~vmgfffl<" 73333gs=>dF<q7Wݷr߶)|ϖc?}ϖVĈqV{ʜa`0wM;M]aر_inH}岬&lܹgy)=y0w槢lܹgfgDonO=FcVhߔۿ\!:Mf7utq) @*L &Aj%j0Fj]u6޹ܷ?6:~H|{NjaqN?^Ob,D؊ӌ}SJ4uȑy0qf@t;"JL𔒪ΫQy$qH gt9Nhq|?osQ)8\ L tʋ(fV8*D≯UιuYa Wb.ngȤscD.2P?/  VEP'fUpDw:`YTNgy*R ~cEhqe?Jz[۷l2_"pߔ>eɖy],^%-#Ef :DfC J%)UՓ}B֥"UUDji*xoY  @D,d2@& HD (JADğE-(\p$JhϿOLDhj .#x] @:/QU-&n\$IkM:uz"W(dAdEFoŧ`}qNQgff:gaU@ィUJNy5^AQTkJHUr7shѢE. 7ƚ$%D.k\tA*[RS>k@\VMYrl꧌Dox ox#UWHiSMՈ~DKݘD?[DI+IP$DeT{oC նYDcYS""ʳj@UkѢE·Q7*1 ቗N$Q NA:YC3S_B0Lnn6>R"Wd,Y~:;#xh{X4A=+༪4l)1 ;1e{oխ>Y 9B4G,LTNyME-Zt#oD>(M)ejd̆sч+ +JRW]\؉onxPG#^p#t}3joF^ONx.2%rcYFv1 hM$*H\˲dZWNEV֢E-Z:oLޭ[!&w_6&S qSֱ1mG=&egwPs櫫.M{wNUѽ|jas0DAt1"'XH(")&"ʲ,nsa&w JJ{U1#dSQ(xo)*b),(]-Zh|`" _~2B#|Քu!>sʺh b: S*X,(jPm7~gn򮷿)OByapm4o,xs* ;w@":A2K*HY(s^JJeU!r{KbKwGQU RU_gyf볖mZhѢeC0Th "e *ȑua.bdM7\u6nXWw pXITh"9k֯_A$aasX|SkЍïH٠ʢZ4QM;! TcJjR0Rs9R%":[4oU(^ <?<#Wu'ݺ鹏#xt.=-I]af"6߾xɉGnzW;]Zhy,ޚXiF6p9 w/MY%r5U1;n{ӎrǻޒfB4Z4Lӱ`3w+j_E~0| ~2Αy^:oj|1%f&$O^(, "eQz޸T(1 sQ#XEYU Z|O~8.]݊Kw2< 8͇Ƴ}n}0<`>=[:y>u-.:GU$33#ߦ5@li C)05A]uLTUw|'"zU [{XʢKaR]WNC>pl W·\GM^m70^95@4I$s,,=hMBBTt" 'Uɲ噈ErZzGy?p w됑}AG:#oz%;?uӧ>|1۾~ȃ'ݺMGQN"x`5)*K1 OLNxceY ޙ{f-ύc=&.~v GףFw'|ק>||wg.?Fڙ_$රpO?ixafnKviqZhq{jOPw0PkB Dщ،W+bny MeROgϽ?ʵ=>Z6¬u]'s[C" r2]!j=ۣNp̃Ҳ6U}w[޼nuf_ i*ZퟧD쪲]Uea**$F@@@$QTNTv+pvݺuǣx|1`h[ߢEKf; Tmș9BTMA w*j${gfߧZ"~1#\7trLHg6toleS/㒶 #6vK,U+9 EBa5&W| 0 ŇκAܤHaaa ,8 9G@*S"Rjs!6lB"F`KmRx-.#xȲlq!†[nFRL9ʳ\UY( K²涻NzJ uv) WxeQ[ -e=LV5hXz,"f%[4Ug8+jO[:E@t"o+Śqgsu(}l4|յfqΥ'g#7bUE+RsswXt0\@4 ikfH @}ТE3[Wcc|y'KSL,Z9;cT `&""& >5ӿ_[Q+ D&^13j +CX(#B՟ä+Fpps&}y딥̫7[i ˿aWxczURd}- Xx5-ZhCI3TE_ b Yᔘb,-zbrSJEQƘsޫjQ1K;_6\}޴A*@d(jP[e1)Tɛ-| 5M+J%"#5f\|VN|K iYRX.= Zl)CUë 4ؚ-Zhqy9h"$޻]$$*nbY}+i˳U{BpbY2<ϳ,#GD8EQTx׭E DT(:R(ϲb4K堰jWvJR̸q7sÕi 8U|,uu[(4,҈ϠYdؿ>sE= $X4GJ˲קOhfx^i[7=;m^-,rzٛ6:m{%~4Wzh\ʏeٮWS,#9}_%h?bD}wbb*ّ1ڢ}x[yu_<@•|hq1~.\E&+K2>Ywgo}OK%;媭rVYK&5k> WowxNr>NWߕ9Gqӿ,~K ,HA!X8Gh㔬̇@3sW<<&`wͩ ,a8?ؚ 5^FiTW۹ܾq'ұFg䡓k:>*WpELmoc_?ÁW6W:qM] vԼn;XXC|>XN}^퉺Xg"ZewBYA%! 1spJ"Jm>fH,9RʶD(,!le@Xjǻ NLLg;*`ZiTsPelĀb$ /UM_b/yݰ;UzEUAVǫ"bH ] IъF[,ZSbDrDA,&at8UA ۥ)(qܾu4?;sso~8l߅~l3ݣҹ0mr g/A@8wviLgSw5=:{s+Yy}Tv srw|s9q|& jY뜘|UtX1yqȄh*WR!cA(-? M,9gqe >p;*4DtΧTΏ~jʡ% a'sihTW pPu68UU!)J^O*5h){2OQ)z!"bICYx˲gyujET4O(OyIJd 6_Wn++!̫Q2!:$frK~F^v!2f9N6Y}duN.E?S8. ƯDĹ$($tRJeY7Uaf뛢brdJ:WTU,*MJcP5K)-Zhqҹ(J]Jl&\F6$J.WUaT[) "kFR"eYdYaQs@cTDvMLU,mnp^mÀ4Pj7P SN);vR<ŪӉ[Īj\eY, T/D, Z% HWM1!bgyȁEQU!UB X);1a3٤!BJlfw:yhѢEƲXT8Ufb{o4R"-CeYV 7kI21VBf2XO,Xnb1ZpBB*螈MjkibXkx[&@!1MJP੿v_ *^l>Fߚ+@2{HDgCk}V-K)z}, v5B$@;seYZ9"ωcLpӮ_((bLt9uj-XY8 ugyea-ZhѢ%j R2厙99bqHw!!RL H9*21( sncёprYDSdj';[U84P1O7{!0acJx z> P (.4l7ާ7p䵬~Ry쪖eU#rsSEsF5ϲ ";U%BPXN2sYF<.%&L˲,.f{-Zt^=['U2hJ[Č;`Y8[wREM/ʗ+R*/``MQh>xT;3^4g>lƥ- 9G _޼ w06nvitXhx8ԗ :iRe;M$snWxQMUY9cB4%L)|!aUDY1vUU,sUs sNDL{5ƘY۝!8*>+:Y̋)(rX0y!eY,˲`7뜟^xaO><[=1c/G?N!P(donB@$ߏ1Ʋ ձ,0Qv8g7<s~_sGp`0yJ&n;~hh04G5v*(W^q-Zhvx, ֫bP̽^{oV%)>Iz礖$$E,:tBfZsNMɄC TIs[=,c&me2GșD|G`} C"T-R6Q1®N#SztM94D1%OFK_H)HH*’,G,IЪˢȆ:Yv:9RXN'mbyȫT]3"r["BYL^#<xo~'*{=&|^>pX!~k[7=xpѭ;>[O߫/zчn9M}tp?N2r$ . 52g[ز hEB`c1y4I"U{,sY%&,^ʇ/BM]s[AXR^#갊Ta9{9gA[HG }ؾ_WPͭ;%5o|shѢEt#.rb,KYAYX* Ǩ"5pއ,NL(@c,( Q!5YKRUQ>/K"BP~W(@HFeM\%4 [~}BV紓rDp3n>+¥*=oh-t:(K.ˢ(eYs!X)ՈZr\{y';3/>]%!z筒0d|և^,3gY[\4om|pb2Y+˒|eQHe s,Ix0˂s.Ũ"h*O^/t,},J繰$NhnX)E@OLL_-Zr&&'i," sHϼ{-krBU@Y\gO<tG:_iQ'DU%G,4J]\D~9CEarzMakx|Ǟ`pZ齯5n7U$тYVL)jӡy2UˢȲ@QMt]1Y@D+ ::(@Ȳ(S87Y'JS%\iѢEU[l\gU&<ڮ5/*()&fVPrRL)MLLcM=OC>H׏4Leai>d**e_<}[dNx/bR՘RcL_^EY,bQ~oq9b//(cSQ^xԩSOS{ƶo_E_\,~/RJ;z,-(/$" ERboS"C0\+坪DEa}!gheY;sǔPn;19Y*8L7TE\7=;m^-\b_2g~vz>>uap-Z\ֹIYS#gwY4ʎ:FDfW v   \ZHYMAY5 qik{M=q4>jJIm"K" H͝X Ta-̈w~{v,$b~NdFFF/{"A*N][\$RB}l$`<ϙF"gmeژTry`ZtYBMYա6=pXqkg 9 4ů6մ!Tm ed,#R"G4u![eCz<$I;TZI],=ֳrBZW#p1r8>/\vs3Ukמ?=N:ϳ\Q(ϳ,-qy>8<˃]A 5Y}gxGAT%@:4^aZ v` bwa"$`3km! @k#EF퍑<[kjV;Vhk[zMCtܳvՄ"xNW}m7:vNܙPh[S:$pbZXѾDUz}O{UttncэLZ]{]Oǚ7'rN\ V(pӹ< QTA=M`gJ"V*LG15NmT.!cJrd $eY0:,I+qLlѺRRbE+#մ֡hJR`0ZCd\ޘ4ijL^]׬j5LRtوT l57IH#h3k迮ד kMMMy[#HĞ1&6ND\n#PSZ){Z<":?Ե6q|%"(AށԱQ$uxuv?D>ґ02oB?dK!_^=]]D(Y?]2:dr¡= ̉;D+KzxPPkbj5љI)jxŵb4kAG#UdX0gi[wԣSL D@\ uZE p3jXzaGHA=D]dHh MōQ@u^nn֡EDrǖ{ߨ*F5"P ]n`%+3* |RP %Nkt\{hpAD0LG+5]m]+.Squ<=χSnq/A&8 :/P@z~B=-Χ-^qTSgak AC`< b`X1k x= ~iT1- ./P@=J1SQ\{MX?-ޏY¯/ @Eu{ (F׺F~Z1|GuZO} (PH2zZ;kCt)IiB󧚧ԉVFUEKK,NR7F t~$sJQ&B5U$y>3s0VKq  [`R+6;fI w6J&{6cU@MH]Mu ʩ)@Ck,J J'IH#BBA@͹e xQ2Ls U%$RbDēOiDj;s@`bkWcMoc_|q7|m]ϿEgu?o9Xu?;OI7LpMϓΟ޵psmfIQP222hD$u}Q! FsAR=)Tf5Hk휳yEN9_i*.n 8G;U!Kj|. kߏ 2p!xFIPcue 9-^k;ρm]~}?w}Oww?5~`޵5[i_%=a/t=9S;7G:{qGtqޣ{rN`NXFqQN0,]5gF[4Yo|W\ xuR~9H=ᄉO~Ou߷vq~sߝ~)6yONy&5m$'3,}kT[%w 5b _٘:u?ɟ_wNz;.pWd}k&k D?Tx ڷ5:gRu޳wBRA=ȯ-Z3#"@BuQUFWZ<-X>\*ic[ʢYJ0Dף}{Gnҷo/]q:[X~׊}w]5Tqi\XNy$`4"zvsYtM.bUsRcLdȒu{VJiC@1Jk@TZRGQJ$I*JYs@(9L# #?ʜb4` L lHa3OM Կ>-[vқuu>M6E}~k+V7G`{$o쁆'sIm9'̍H;{[WC;s{:a&1$eoE/ch9wv }wrǭcL&6LP;7hM'"HcI_Vܵ ?ㅦr*OӔƄtcL nHi=Za1A`+Usu<{LX ,nIU=)"U_e((:vfBRe rD "4 $cQh@P!`TK"'Mf7im8a?+ /F9 LƈĹ6zǻ'ܳ}_'ڤ{ jDž_m;BuPv.Ǒ93;^), ī@X#oϲL1.ZPJEj!oeF08;qp,bWQ=]?rG &I*RH` ԗɕ  !THn) 8\"!Baa`˝zZ{CR*sVK91Өg4)ǁﭵ,,ZksN+*,KE1{o gtDؒ =*_Q%M($@ h5 F 'P ABиB@ `O;{FBA0k9Uc^]*s'4K(RJ Dx׾bm\w;ѣs'Ng -:GDT2Q@"#"!ښ"A-,Y&̾.rҼD#9ϬP9{@+D.T=(^iʠb(#h hj1uqqe :xOs;3g@ʼnx/ I3k$Yt(YcfkR*czZVYȘȍ1Xk{fsk ob-yei&"Rϋ;\.vG~%$n=M(8؛`  %@ b?i `,߻etvm=%nmswoY9i6sy[qu6G2fw]=܋lsIh4Ll}]# [߰TuNtLյuwOt{8z2Wdcmxnvږs՛{&iLp{M'Սvcg:E"쬓Lhm[<:,c\ MMMA.F)ϭmzE<'DT$:s+DT/75~]?C=Gt XLH?Z0B`xK@@ 4̅^Po;jϴ5uv> qU `熺鹭wyۤGXnB-kEϺm+Զ O;EPggA;j'f+BMۢph4&mwh_ жudW'i>N<]#v|Opc{8i;ŃXWYЃ][׮Z5sN{UttncvuD8KX1}ڵp)xbǝmvuuǏIzN{{;#n쁹ם|;:zR mWM Nyzzt5FwεN7%>k:z/zW{:p3*\lyAM=Ĭ9k+ QմZ.0MSJ8Ci;>s\Jj*I`KS*Q{3B?~Q`'( GDS bL [h UKKob ]aIPSc8$s$YDjֆ}1IYiY&Bb:`>`Lyy#:ef'N;TG`DHe`"%A P"JP( M_#v&% IDAT?`c㞓,b^&G{:Yk8uEMDDT*@eIqC$KI"JԍJʥdYFT`jm$A&IV"Ƙ(F7-Ѝ?i\@,c= }wJA pL:J@  @C"0 XzO&%ōQ@u+CV@8FQǎ ӦM a!lְ.BC@DD1,cfu޹Af6Qqe٣~9{s=mmm[|<$n@\?A(M"&s9F$ XSpCBA Wh (P9|H)E{gm,M DQ*c: Kٱ Z,˘$䲓0yB,9j"W_y͛oXTy?7faL % xHT͠ f"H"8'E[ 8<)̬ y "'IPd%Qu9fiZREXk{6F:.Y40HEI\JJ|M68uڴFۨV8wb$C7@x@Zˠ"#DzԺb琠_@ t̂RD=67`Iaר.)DJkB=(Y-,J+kmeqD;y8*MS)J"w\)P# "6lػy.g͜=},˶n}aݺu7tG~78 eҿo~tS(6+Ƙg?O[[[?Oϙ3{ppW_ݵkWرcӦMkiYZJ][{Z}}ͻ_ڽ{gͷ緷YT =~D:MH<}eZͿq#㛶?G҅WX7756ganz/я~d;$&.J&ĐB`֬Y~{OsO?t$|3g Vxp~i+WKrXSJm?Xss'j^oͻ Yqo|W..[uV'7/f" ^{c?7gϙ݂[@%Ps}E:g{)"S/=H$yn6AXO~|~asZ"@eY[kZܘ4v 9\Do*]0/c3ћ_7eVι^ryK8^-y߂.ȷx҈(߇0󥒹kW (p^ZkmD Ik$"ϞY \Ys!=I\RJfΜ"p .<;jzoz=YRf凗444ק&YʣQlZd;tݢc pn" +P@ueYzJ$J)@Yʓ08cϜV000p`L'II0i2)KPRd/;WwqR G3@(%ꒋA (PyBZkuS@YЍ1A3q.wcs:OՐVT}v33/^|ݬ3T*!bݻCunp`@)5eʔ ::.wW_/0\v7~Q0PR:͘,]vze_g 2ѷf (Pi4&gW?}u7^76c496/::>k2ip0\s63 +P@pW~;/!ժ6T*طkA/ܵkz'q|G0ԩ.}MMMǎP/;罷۟@.`3Zpyf>|CRN:Uk-AlϱfOLk+7MӦ$c oYj.6oP)=59) ŋV:=TUZH~j-J)lB~yX!-Bz(*9mm *1!7Xۗ_?o_qtzP:uu#`O4)#o 5*%>˭1F)sZa9HbM*TFVY/y^@)+H1{=q<χ*qijrD)JRZ;88h }$qLpm]x`[g(l۶__ݬ~|WF|8 2Zjj{ȐFﲜ&1&m[@$cbCdPMmsEQlY|t 3m۳gܹMͧ=ml\5d\iUxtsy/ B(nr.6&@C@"yO|9q޽׾eٟ/ZD"nٲe{˿/\z饡{=+۷oݣݳڶ^p4CL¿T6tcߋ.z]p֦\.= fqɥW\qJ(Ro;yۯı}npOxsuMw{z;LsK v;vlH<#kXIsD2 US&"-HlR"2(LnZq[Ȁbp9iƑ1ZGC{i/]w_^?9) v(P=7w羻/߁ =w9'i/|cfCcu/yfڞt"vAHSTE=XކͫT*onzꩧϟt0ICfY`k9g9mmzYJm=3vu wP"=p3g]w}:yDܾͿ/+>>k<{K-w?l<?o E\8/Ԛ}#G+f=/l?xp[f{jâ_~]v«Б/omInnsKxϜٹ)SZCpN*YVHXɝ h߻_75ʎ]xMcnћ(P`fWVʎ#6B~䤞Je˖]qZ ߰w^[oyR?+WV*m۶9hӦ ͛wHoվ SW_}7^Kt4ҫ&|aZ}?G_l4ƨJ ^pta9xO|1*%ѣ~煭;,h?c=VǶ:*@z)ŋĭ/m]VWg׿o 1w?πLT"%Νp#QX'qJ5y殔QwYU JJMsU>IrAR9˳,<v?z˛w[Wo2_^qc++ʂvU (0!.wӖ'cl=-{[To}t#o\x-?翹i_qὛ|w쩮9 0i3拟\@BV_˻nǎK.1c_|-t,[/Rޱ.I`sQ%IrsYU6܃ BetHPDZMMg>ySsSOj΃CG~U$Zvɔ^sjۿ`z~֞ܲKuѭ\/}fǗ]{U+?{/z:c 5=)Mi,:Ir)#Es!ٱ=]0xxn!,D89~3?o_ǖ V'~_qZO{sHi>0pZ@gVIH )#ԩq`e`08H)kР(]6ƈ8r"DZ PjI}|}ϟZT}yV/Ԝ_G( <v\+ o{;ya_;ۗ'?55t)-n߽~aN>mGףBc>y #[ɕoƫaÆy~L3t׾Z~.q>vl`O/X*udÇi JQŻ?Ѽ9sf͛w]]񏾿u4pCK]~K\ Y)3oޜ|M?{_1"}3=wLqDynI7ԋ9vB!RSKdYJEIDATHd$Vqb֖{IR^ϛɭ;_H+(bR{qΦi8HPZ.q|ϟ?oΝ;^w}=4bׯq]<  K-|i '~ܱfOuȯeex0zs5ϛI6?[ƾ䓳q toygu۷x K4oc7\/:gN… [ZZaI+jDQU"j|2}G$I>]v/MWuccҥ_lkk qq-[Ew?c/dmӌ1{ ?jsT ?<"̞3_Hv\} 8d'nٺR.^xQ9L-ݨ7^=&SΘ|HH?"^yy'g٥W]ȩlr@z\$yimJ90.LIǑA1&IlҊ41Q(fCCCԒԝ"RwFR.:2;w, lS}Ϟ~?s[p@9*^$$e`("zw' 0@??5r:l¨34-P1!̘z枘  Q}e1 #'Z<{+y"2SdF"`1VDDu8c:8}1߻ n̄gJl_~7A9t3YXd[o+""On+;eZf"Z[Bއ{;e?,i c̍JED7f(<FcrIENDB`muon-v0.4.0/subprojects/meson-docs/docs/markdown/images/sdltutorial_06.png0000644000175000017500000006261314737503617025676 0ustar buildbuildPNG  IHDRP ^zTXtRaw profile type exifxڭi9sn p}on0ǟ)Ǯ{K]R9"7*j i|5/z}}f4{;ʾD=Qɯ/{:Vl#>{' W=ӿ-Sr>%{.)w6K߅\{'{q_*|ʗ>e޻{F.|ד|? W+\_#w8:Ӎi{_ <5^ʯ>]|'zʤ妚v|b'+9/׬hyRWYK/Zp5Kzr+ Ȝ,qG'^?^|JL'V+{Q Ϝ3#yy-dP0qr'х֒P0OKERKQs֔DFI H2Rɱksgl g)(e "DŤh&5mN~CVmjuXjb,Xs/ֵ[} <{0`gulS>>.Ym鲰;ݶn}P:iG~jz嶫nKRx/ZZ~2KָUct"32k"s-՚s{*$Kd ֓%w7y VG悧Od.x~;Yۮ6+dЃ w91\9d{zudՍqΣXI"-)1Q۩K]vں:Y[]5OYi88C9_iNiaıNZObVVK^T^I}mRʨݼMAq:R gTMtfkyLKϘ {zGZT-h.-;宲u`Tr\RRd52]ڶC&ΰɴ0UN2V6tB^G Ф:;Q ׆(v)=FpmdkN37J#T;:?{.M Dg[5鉳mʱ"s6זqy*!x #h5ANiܣrW9Ẏ|YUP(L]ݚ)<( 9ۦB(bv9w7ImU0ccVφ;jTbZu4څaTf nCV2p2hZs! ^MF2>)'p0+P( WQl EA stvDS#"e߁nN&p[ﰽ4:k5OX$ }JFl,ȉZEH(AvesZ[G A:xQa-@sc=h%&pP^G=8x} :}MUPE39U!A TS?hHtDNH֥@ .PVW@8ytrR;tA4Qf_˹|e_B-nؽ JⶳbJ HZJn֓ 썄K\"TT0 'e3o GJ1;q*N踄)̀Ns~!-nq4zZ.*u0#çUCrnAFarFGR ;^µDjē8׊vyڸz(8q%$q6-QT2BOW%ȋٍ8%U19~˚{d0m.a|7b1& ' NnŅF%Ȯqzgº "efEsF0!.מ ArYՄu#3xB&G#W)Ch'",ctWn'2ـu|׽00Ct=:;ET6Xkgu_|D\0uL86roش\a@uvB!AX w= I UEg;3zHgu#HpP 1c3n4 IDz Q6'za*Sѣ `{EME_q:hw(9+jZ0-JD&"iR)m{NcD~Z` 5ɣk. 6ԫyP!T1V|絪A/?e cm,\qRcn;&+‡EX@k FW {GzЬо[ Y{44JtS^BXz`"$GsD۔:}UFQ05}Ph`qAf_5 bYxfJQsEb!]3Ȣєl "b၂}cRՀyH@A.uxSx݀ ǃNZu%]-2cbȱ5'=U9_n|а@psg"1:R5X(a2 %v =,u/.\(;ǘ)l$.&Z'j7QFcCqQ/ٍ ,ݮ{A8Sɉ@Q A`k.<{J|)n(a|C7!ˍf!t610п&O{EPˣg8  ?`OĘ(\׭rR\2PUoIǝadγ遢:r3Saӻ"Tn!+{Ҹ~}igNоdx*FD ]lōbw_e b!3IĘ#1g^d_4QsO֛D! zIiʺ!].? % #솸 } vJEdU$ޝ^]LEV&^iő]80[aXhP}7no)/RM4Z$7o^_wI=V g[(Z(yC.|@m{Clzr HL("Z۽QSmËfMܩ :S7_s'ЁSy?1=i~Mۼa7Ng<JaP SM0 ]H.ZU  8OJ Eҽ)@3@])p Z# މi2M,աIe⚴V2*O7v?”W $ÇWug^@XMG vM6B][A!UqU1 hdT-l.a }ΦVn\Tf?g.هZC)ʯ/_~MZ ӂPGd'Z1g~w?3.~'D#בCFGȧ݅EvϋWGuA"X*C&_W{?0s59)<%&cns"\t灿)oῺNiCCPICC profilex};HPJE+vqR,B EjVLn& IZpXupqU nnN.RIE.\@fnXTLW+C/0.3˘8Z=RExV?[X ij0m MObyY%>'5ď\W<~sY!3'&VMx8j: )U[b_+\5 "Q@6"XHyKRU#J ~?=[+;9%@| ]VqcǩgJoKU`JC =uCSɐMٕlx?oJ}@79N$*~#9^oSrug4 iTXtXML:com.adobe.xmp +bKGD pHYs+tIME  IDATxݽoXVn gn f"R"R,BYNPac\y`*~&]-t ;j뮂4 jA.`KnA=z )QS/ I$:_Cò,K7dD@ A4DG~_x*eDK?>?w0aeYw.??L~Dž;t7;w/ !Hgg$d$Vzi2^ny?w<ǹ$ǟwɴ<蕿1ܭx<޽P޽1 CR|k_m>Ss峠 a.?xbC?'Ć,x3O`wzt_;W<~z.d`]{vW~Sd"g .՟:*T}P0?^m 2V?,YhO=V?.T׻O:^z`[ǿOP,Լ8 t|(҂ *d˲~e=G٧N?gvWL>yX7wMw듲7bhZ_t´ݏ-yz=.7.sTi&4oP?5)m#8g>?ْ=^M*k:P0?Y{yc0dNAr?EA~m{(zl0OQ}S^o8>>zӀ<}Lo4-ܧU0O2Yɬ>믏Sğ藋~P=>|VgжűǿYһ?>*0ߪ/@~ t兺+IHj=:;(>GԌo_ÇWoUE]d̵'~U|Qo~lyp5:dO~хeX[GGs, W ꯏ7|'ee*SΑ]w]9~5; |cbwӷӻ')Im˫-lϧǬ23O}o?0u ӸӺWIsrL7?ߝOk}]~9~iLjsU)Y,l~_A“z;nm17 g }z=:_ȣ7޼8 1O?w} >- yfӂ=bk(h0 AFNo  h nǏyO4P`$hA)5tZ-d_SᴡRƸ)5h1;[ܿv8-(SL)CpFa)ez,#VuǮ*Č[?,>oa :U7>iy[׷ WxSgmZ֌C:0b>(~k2bT8w,+SuMܵ/Բ EGn~;VGMS:%}]{^yp׾+|u|YZJҹ̎FF:X>y?j謣z@W#aAe)>N6ZGRWf[Va'c1n2UNпwwYx}ѩ$U~4qWrjv\o:ERj:-{* }PqT>u>rp ;2ͦ ۮ߲Z:L+A g_QU3?#$ɪ(vAZ؇yUowZp N \[?޾BEWĚb ݝfCagj呾)3$A;:S>]f;7{tlΏ\^~>MkA57bovDrʕ9Nt{slfW.{>L ؿ;cX7HhZ ҿ Ҿ>Ya3տ?a_*$}})巨5-}Ao ?_8?/^ׯo.noigSSVrs+ûٙ`j_myQdGUnQ;:6+rGja ΑHK>5O4&eUu,Xr@xޠ' yY>g/⎽ma?ǟPg EzviG}+X4n_AnF5/qRr#sbh}Py6;Kׅ˵}Ցq}>dS[i?t]#Fd^?+c3JD:ju`kOdohi?ruG:akm^A7~+l ^_OFƼ/A/HJ\1Q<`z;Nk>]|^,Už_$^bӳDD)PqLԪ֢?oIY9r;־RgػS"ԙᨉϻvl8F\]s?3^>՝R'I:k]Fuh^I"ٽ ]πg#3 c {}ݕuh^|5 ɴ7]?}"<)tI_lחuy=xRnn\^茜b2V|گ40:L L۾~,W&d߱m2V֡ΚR<=;aW rySSfiv^D Lw'Էz]ψFF_S>;sS_97'O =jc+!]U;(wmt74L7!ŋ'p۫s$MڏUk*M?m_ι+gÕosW~C77۾f e?_tV~ˮ_A7}z~sA Z]>#^D/d$zڢ1;%߳㞫4UΛިftϽ EY+un3nYk24 _}/3Qm$<TU.x_\"YhDom6rl?gg{g]P+Oya wLfL^^W|Y 6<#*o;͎򳬪v_]eSW"[|neC6V^o}. ѾD7UޕsuEśn ׉ y?5eTk&pf}VWo{o/ԏj~}i_7ye/^wcr[ǒ7{z~^(l__ߍǏ[2!zN׷4i+zBDCi;_3yt˟햵Qt5{Q9U##&]Ӫ&7D?yt:iHv'h 5X-LꝚ{g򴺣{*v:43;7؏ ;`ӹ!  zK2ƝHDzsXTFSʌm-ѻR wb.ddJ7~ ޣ Δ@fh#V]ARi!ɔϛ27L&7s}~ s|~蠒Uμ~A~χ/)3ettQr0S\5OO*\ʹ2aĴUTdu/,ͤ/郢Vͼ6ylt rJ)y}ndJWeM9uW=HʊI #xWf}SJNXMGI%+9~2ʩ+G{T|E 9TE©* 5?cpZ%]܂?`'lg1mZwgRGaZ.ӶrVR {p t*7k#SR=w=8Fp=k_{sqvJ>J_.χk.߰ׯwB?A~xMg._;|$u]^?e/vi}>j;'S/TKL%I35v~H y{ye]zN*{*#m+;~dce%3|J&w7<]Oxŋw;V8Ue+cSmqtNu(1V8Uee~_HQ> Wb)A?^̧/eׯ0{_Oyd+t{1A{ 韖h?^Yߒ^j/ &w_~{/H9o;"$E%iM1~e?&l/t֟mwH*{/h IhݧjpsPUyܳ[_:~&{N + ]r>joJٽe%sgIыd+II> [;6Սo,#]UGZ]u ^;o|I,|ů| #Uy^u4ZzUdeѾm_fZDNoi_C+u~4ߩ#LHSgGp}tf$gWT~ya_s֏}1%"^_^>wR9?Wi^w}_LF]9W2T2Tuэ+=>(*޽v_n4}wQgaGX~^ IDATO-_w]G> ZiQ1Y$vZ; G6˩ޏnU Ջu係=t!tI#?]eS{w{O\k*gleUulS)'|Ae_D*꾵cSJrTnoql~òZ:zQJݱa7\~>Hwgaڷ _[Pƨ-.t|YfkA?+"w1au iez]I+A;gXwc%a +褒pM3Eit}v\'|?ݝJsPlD(+[tMZ3pvd+G?Gss;ʯZu|CZUtXA,>| *0D AtpFa9-,}^2N ;aT8m &sPv-ef>W~2O#Srcݹ~Q~opOhII%7E; ~h@Ո7uvt|#Vic_|fY-n&L&Un6f :T2Tqod,3z`)/:)^\i6Xq+tot}lĻ29Fe戚+k<n6UNjY kYe#R\E{9jG}RYߥWAhoͲ;uU*`{_::%5@w韜3_/ܯoymy4)yJ$ugڷ_Ӿ780/7H]w/Lx](?qW7Bh{rx[j4TG'swSyǿԤ}?R{`9]Ӫ:ywy%{XTm]8R[YS*oU,dޫhe]R?/ m}/hn*ydx1'3Nw{A`lfu:>홿Ŋ?#SRrԮ##vP2d:{jfJScuRC ^N 032%gQU$)5OIeOÛL ^_Q3zDdLHBϢ{ kuWjյ`7Yh_u5 CڪfY-*0HvV V6]W77WwYk%mLY`<}Or޶ aGZ7ށm=WZ~ǒ7<-f7#ڹŜ݉i|Dt}vN)LIUS"ku\ ;˲ZHٍT߰]Ӫ"W#tdtΗWZTz]E;bF״Η];5,w['׏ѾDž8 }hׯAc^5ъ@)NuOLoĥH\ m}gY,wyndE_JKI7EFhMonyN*xM;#S.d_>~FF+xwkՌ ,ׯ 0@#ѣ+u+vZ; G{GV<,Hlja7eTǔѮf˒ыVꎕ ܟn/Բm#I^ϴo=|'#XA'H]wm7 #;a/3Wh J3n{_ yŜVzz0)+cL*AZr&;XTgf\œmHJBTJ)eTg<(ɪr>:78~X8~jgŢTv^׉+Ô_ZCp'VP.ޕ l< zd= JđUg,Qv+ǿmp}ՑVF^3~7V5wjEWDpl Ast}^xo0QcSЦo+pLHBϢ3%"5ۇ- koJٽڍpC-rg ;{LIUS]1=ݺvKǿ"٢ܯ-tUGnjup3{q+)ģӝ;g-dFOkZUDJ}dWkQITz]E;ȈiU/zM#HZҺu7uj,߀>ڗmع( p/h{8fcz#.Eԝ]hѷF\݋㹟 {kjKʉ4yPE5Ee%[ n2}}XFFISgDV%]Yku#+ZwţZtu} )eU9 pS665:t=KNU>5 `ꦎ_XyyE؈7UNz^xuIʻ5vjƋ*e/D<\Utl/5> 8~Py65hX"uvam+:2roD9߳̓ŕV)߲:6sé}3?w-źЮ̲Հ#AWk2ii'l51|hT[k*_*iO. f{jEY+uկ×WگYNﰼKoT)0?~lIWx02:t}G{fJ 宇y VI%nkZmW\-\zPxt'^D 7n}EckZUW \[ᦏ* k:7:{T==|8+ |`:7"sC6@ A2FLӆUpFa)efJ_**SrCZ"e˔uM Lil4tZfJ7̠ZJ&ʛ]jWwr#NUJf>5X8V(۽3+[VKIтTwyAadYNZ {Oמ*Luͼ6[gJ 㽿Lxs5UNjYxE{~e%w ?2v_bQ!ܯ}E voxo(i? ͜ވtRI™ͻh޹ӧ! R~~3>wbZɿ0$orޏow02%'/ ˑ"+9cNCM@&-:wtMjHJBTJ)eTNJ&J&*w]Ayjy3ɶb1 Ynw %Ŝ郊;}T^f>"hN_Qrz.+w{]t#J<YBYNnt{o?cSy/_?H\ N\u}( ݯ ^;o;)~0];@=%֡^8+(̻o W =PJA';xW0 7ABpա7~p}ՑV3Nڪ%_tYYтt Ԫ֢8loY-5I<dzDdAߤ?35# = ?gJD:;jޔOW߰ވk/wd+Ajjߔ{:JnУ;`zeUGzؚVQRWٝS] Ið:Rv#-U {qyJzJy Xk2 S"-ź쏻2˦VGF+kg{#.WߵpHpM_|pi3Us6Svʿ]Sg0M%*e 󧥣e+3Vw߯|o?҄_~.7˩ucXKJix1dW<dBχv9/;]WXgp}Ew}|C64iVg:2ra\ܵ,Ǫ(枪.ue,P g8*k/[GWg/`}PsLD@ A4D@ A4  h  h@ A4< :SjpgdJj3 IRpFa)ehU~mdJ@1[U;6ijAP b6J8>3JSbƝPgތ r$_XM%I.- cSՋ2)%I%Ik+x~ eꎝ'5vT_jyL&yغ7l#p_=25)9@ÈiL_e kY-5Um+Vs(;ISک)5Tu!V8՞=Uz;A d.oKR:Y7WTNz ]Ӫ:S\bNϢGj8SSVr:LJ&W\lE|HN*{*Ökw~ȔTv՝. Oa7Z_Q$-ͤGj-cS;g8zn02ڈweڱ+uq/.e;u7:TQR=xȝ_[Pƨ4euNUU5*xk֢`yj[VU;j/ ]8?~GUkuW@ vfTۙ:YvTjn*y8|>QȵQW!OֲO_tmUǏNUJf>tn7UySO\q % #iwySW(vtm^MjEΛY7aݱ;iEw~#S,^6LJr_$ǢO)]3yڱ\E[#T p7%+j w>x~wgwZ;(pt{Vc+}ձoѾD|Yo/32%WEFogrV 0?~aA{WaݛLOG |E h1l Gdn#F  h  D@ A4D@ A4  h  D@ A4D@ A4  h  h@ A4D@ A4  h  h@ A4D@ A4  h  h@ A4D@ A4 h  h@ A4DjoIDAT@ A4 h  h@ A4D@ A4 h  hA4D@ A4 h  hA4D@ A4Dh  hA4D@ A4Dh  hA4D@ A4Dh  h D@ A4Dh  h D@ A4Dh  h D@ A4D@   h D@ A4D@   h  D@ A4D@   h  D@ A4D@   h  D@ A4D@ A4  h  D@ A4D@ A4 ;wl0PܳޅQX1@" t_w @D h @D " @D "D4 @D "D4 @D "D4h@D "D4h "D4h "D4h  "D4h  "D4h @D"D4h @DD4h @DD4h @D h Q9["!}!E4t< 興%\ZZ+a y"ptun^b}I4h -g\_irdIENDB`muon-v0.4.0/subprojects/meson-docs/docs/markdown/images/win_working.png0000644000175000017500000027026314737503617025362 0ustar buildbuildPNG  IHDR 7zTXtRaw profile type exifxڭu# ބ`Ÿoh;z&`e+ML斳+|j~: w?oz~y%eսu~K? T_+zM"gk(?۲~^_?aя<݈{}XJOpЅ){|'Ӫ笼)+l~Jፏ߾77?{9|x?G>o9s3!ͯMmƅ{[?{ߍjIʗv=]snu߾$z⛟ʚ QZXˇIz;oMWx9uoˁQ;`zw㼊e(sU$ĝ:J7oߟ@ seݎgܫTG&:pa5WkB܉Ÿ@l]vx_#t>D?HK/VcT{Oy")PHM \E)RC=SJ9TSK=s9,%XRɥZZ5XS͵jjr+zgȝ;>#4(6|fiYf5; XyUW[}M)λR;ēN>NϚ3OZ|y[͔.,YRކp1/3[](uʙmHU&%g9e |:=w?2!o&ƿʛ˜Q3J/25odmm fHm@bEr#c'! q\hnb닖Ŭ- s]N\_Ѡ~Z^c&*!0Z;Z7TŰhI /JBA #cmsg,lo[V,ίkȶ<Mݮ vM?O!SDXN2{T,E1^'EpYwmLPhf3TǡM4{FV[@%]1hI@E6Ӷ?>Β.|\m}5ʙJ9Ǐo%n*E*vze|Q;It#2\aHSwk*MgEF:͇¢N׼ uhDr?l @a! wfD ;a~ &!5$5HπDfӉ?ygFWW K JA=NV?Os{K>lW3kOCGk/~/?2mˤƾB@| (]p7ad|%Aλ2r9 1S@"lv{1K~>?E}"ݷ2: @/!zr%R+ lÏŅB*< } 9a=cFH-ЎtZM!&aBjmYx  "Ɵ _?B +l;H.)l; In,nc͊3A _F2P/ VM0/B"udI@ڸ"i i(HW]2- |(ʾz9[3 9X45@<McCKѴǪPZ& lRpe^v"KC "wn8Hoyxn)Ϸ}Qٍ npNU* |Ex,fF2 TSxwh!ΩMˑb) OS(Ơ߼Q^Yݭ`qX$AOG :+ ̐%#Ɇ1I@9KxC9!cmnaHĖb;F[3]!&P'1 A} hBuW2rtӰC)a+6G c">"FxՇ5X%Y0nUmqhƊj<!N,vF)݉%I.ҮJ26Y Ê|HfFÚ֔n1{Ebm>éb %q*BɌ)V,u*+U{Y[4;TW EtU$R8F}Mj]-S%gRs nȅ7 ¡Wm@kkUWVRʦ"]*CGt\$!x ;B}<#%8Elgj@i e Nf6=%(~R I1ΪL`eQάhH 1 DJ͘-L=ߘ=Tp,),M㧏,`Y~p8C`,&lOWqW3>^c;D C+JچNMI^p 3bp{zɃC*i_)Y^qxB`%و#(Z `bCƳQZaTA9ەhu"!zpyP<"!Ģc$@BVeq Kow4%#AZ0DC6G3aت Ezs_d.x}+{|`F1uSEtzt^P.MG(AA.Na5q-ؐMevk}y{FrA?ڌuފQ@8ˌ8jZ&yB@gτ5Fb9Hs4( 3]RDgLP5h=+;ց& dE=]MA0U7}$\Y{)Q/2BQ>B.sJLwX G{ҁAMg7$X=Q K<2S `2+2%t&+m zPEbjn?OƐj#h=-zyib R1i"k!3`1"TdצCNڑ.[t¤Ǒӊ|#$9"5喞~ҾM@nRkN1)'9>MRGF dd\]r$4H¢SFTlt2h&\_.6v47Gƌ>!∞!R3VQsY"*:ud7 |RI38!8k /p 2Vg%IH72NբnNش _G+p7nnNtdV:`E>1 }a=On>9 yS@9C5X شfV9WRt 4P8L\,6}! `=wId"{@D%QBW%2EҍPpۣ @g4#1+W)H9x칊7=\xUdlfڿy5v!2r}"̍${+SH ikI77׻MW/nd6Ѕ_/G.8.7$z$ ±9'ԟ~FSi¶Eھact^1ctJ[:6 5O tې$OuetT ޕ]bhwB4>eRA6'rR!z<7Qf[ӒgImyxӼO(23cväM>f˄m_nHacBs9(y딟1S{@ajPwvCViCCPICC profilex}=H@_[*-qP;Yq*BZu0 4$).kŪ "%/)=Ff8jN&lnU"ACL}NS_.γ9JdO eaoOoZ:}+I 9A$~~12yP`YPQ?yZ= Cyme4G" BʨBViOxH.\e0r, ݚ 7)_lcͺmv<WZ_m3Z.ۚ\COdH/30p qd ppĊ=Uir2xiTXtXML:com.adobe.xmp Screenshot y %bKGDC pHYs%%IR$tIME  :/ IDATxw}9t䜀AN@D`N z'eNo޷c״Փ( )"f D9T?1 LRYso ߺu=jEQQUUf2L&6l@$t]Gu`sr266ƻK[[Ȳ ϓH$ll6ALP(Oٽ{7fyi<>| A +q$aZQ\.nGu46BbP(H$p:X,t]Ge JrX,V+tB,x<#\o<<y~k'szuӉ(2 t_q9¥Kf p8d2rY䵴D"v{yL[u \ɄbAuly>6=FIdBQDQ,e<|AZ9d*7͈X2 #"V|4l6[- j/c:Ǧ6](H.+iZziKL&V^M0,uH$B8tm}ttCUT JL:C*siiZfNZg!td2I[[Ǯɚd*`ZI/ UU9|0lٲYA\dY .2y! ,t ~ddl8ddbbAbZr9+XtaAQ.\ % }9X<n#w}bt]kjBMf >\|x}~Zj3̲"m`````+;6^™+'g* |!~D6|дbl0sEAU3Joo˖-3j3E4LƯO2>>V~3 @BЇ>l``````````` ###r_swM3vc(mu P`VAϟg2YxDI*pohN"l6_rfEܴ aԮGdrrY[1|ins_4q:xX% #Ory]ꮡ{aU^ߟ MD}^?sztS}zǹ04CdmՄQ>O*'QQAOw-v!񣌥%| kœs)y*Z2яIGxlEj|wO4+XLw I4v300000"i/2=ͥ^@^OP`@C4xc%r0X}͇FGxŗ"P Lg:k>|RO;a*+CVTMGs~뗹P3:vn>?}ؚ_UNY-09Kt-"Y@3b]HFg\8b$QZg fa#5~gxs *+EDѼ`# v=_* @w}}',1z97>ɴF>}7~ m~Si^hV?A<l q𩇱l±8:hP\6DG@P3Dr8 ^DFbc,/a.*cx'xj/뷩Ҽ<9e1;iC|~9]ؽ{w4K$o??0v~~R_WǪU>r v/DQߏnŋ( B!&''X,<;Xu d*y2yQz6JN6 1)K5SFJW(ˋOEw:jm:j L#l,#^婧{:oc*Ѭi$AC#c5Y h`[bg_99@vn֋J.M* b:EM!PP4Ib*:j!G2EEdq`HI~a+ឯl'A>J4@4 ,ٜPJ>ZzQ Y fvϣZ0Jَ"Z ͢h l8"JNTtDV;VI$ b.tnkNkY^VPAZ%,E-ՑxW C@-( 0K\͎E2VH"zg9}al,#J 7gCP$y4@2۰YdPTDdItIg+WOx<뜲EB_Wiii.Nd2<eZA)xc#7 !^;ko 8&gY@KGdv36s:Njrw|.Z͗W湓c^~{cOľ1wbrli]ֶ?9=Y {w6Zm2X( J$&.?#f };]kkG_'R[\ר#iξ<x?Vbts:fKh`]~Pe-N.S^?1E$2F4ofҕν˿·jsqLќHuQcI*}߹m!=csy(U7 0u){13Vp$QfnB&O*uǾ'ΆeK'#p(O11r4|ִ98t &sNmn[g?>%I;i2WŻk_b|?q3<1ƥniq7 ?.WOhĞx25vWߏr7]2D IQU9<^`*aZƨ``````{C* \pucc#7X,FeP JPWyDM>K& A8wLLLy뭷صk/2я ȸ<=,ixPOѹ ~=9Kc?G!4+Hӌ0ůha)/EZwdeSh ͊f!DD@KgGvŒp\UC[P2,:VUwh*ku. )8鴸iif.h>$ 5Bv<hɏ_Y↟Nx'_Mwk#o  jxt7 V/lMx]43tm(I9C^% 5ej4FTd ݽ]į5ZoxHrz\I+U j UR{j?4,u\y fZ!3C1  +6]OC}rK-Gf@bspرwDɌfjSq,SL \gDLE l"G9~5Fl1! kDGwX@@!>>yNn~ELN.Ce2,6܍`[yC~ mfW8ϘK`k~."f٨R@σ<à ?]1X]K'z7X,9Ȳ$I<#}Ǟ={@g/UҩN]$*&dKUm*woO׎d$3 "0ѵp ٷΓ˥:/aI{A|U+kI=SG_ PÎi~?[XCRmHp j 6qyRN1y")O(J7iY3r5@NыK,!^?;E*&>Ki }rɉΎH$X\&&Ż'8Ny H IN{w3~fR'"B"́pL8z%;7M~㮵[M'G?B" :r)IB%A,jҍ/A]12!cp(a( vUpbׇJ^LƊ Bq܌Rt^yQƫ'.rfp*a(:NgL ؾf.nK\ m>};#%rחgK'.+YlX,'Ard٫4,uaA{w݅*<ÄYh Is98pcccl6>E'OxBO=hM|'3/Bu0\l+l_ތE 9'־v3"::VEFDQ7n.'P;C9-ciF3#_^m], BxUrVܘlnXOټ6T!NOL Ӈ*#Jvg8.:7š:rpWK\}-1ؕ0>^ 9fٍ^LR(h%fK~jհUt^e[eAl<Id^IAJlFtَ, wOu{g}.;VYb1d;؜lZQ;Nd [JXnv8}In-_ϩ?cl!uM~DS1[294LŃ|n/-ƕ16TxTdQQ7{WwqWG5ҐW$^i~ }=?7H&͖CݳL)mnfqQ%%o˥C?b[ad4mw{DU0BS(?4SJ~t X,kV]IR9JR=(RUzlق.?~#믳m۶կk\a2?оJ~DqI;Nh$yYe*tcӄ ϏkzY-O"E0pئU-$P\4lp,!則dt,a yaD.YaURIF׉$ pL^ɌWnHFfg1@2%́d]Q*&ʩHf;J?1G"Bt8rSDy,x~fy3$ D G%rh@6'/Xq:$ɄLx8u!f4. IqσE15B1)I$$a2]V\dNM1M "&Ɍj嶗%(6\.+;Zx8Ƞfr َ‡M.L"8=lJÂmE˧H$4̶K< ͿNN߇ETHDƈ%vgRRZVEl?>-"pX*X+F2= |Ͼx̝˪IF*"?u†~QIbmP{[ ~ jh`Y!nhTN|.H #10000000000<EC]@Ybﵞ=As_⹎9>q#_s_s@ݟox- _O|@~20000(SYYI6EHg_H8ꩡ*ux^(@0-xۮc~P#Ρjl⬠k)8ьkl_j:iAu:cL) 04@;Zk1edUU$fD5( JɆ 2A "WȓJѦuX\4w-^'TYيq1}u6 $u67U[ƙLFIwuH9n3fLUzz]a&S:umX}utu)LRJiD dy=+$ VwqbyԢnيy)}&4:Vn.g趇zT yUb&г^)f7ތ#?AFP4A1d*KO ݞ m  iY`: IDATN_@6ᣡk-q"ٺuke6[:=y6,-5`MUK%&uNKi襲&+Vo EO$ jgz4%4JDlXz'j:Q([0[Tw:Dg%OTʺ&_z' eOӞXM_ed<ݷ\M髵RȤPDM*:>lOTvc3Rj=.V˞M:oOXZ;퉐\jOvmOB5Ug(L{B6c6[\OcjOT4ބ#?I Sifx >',xZW ˞yuvkO\퉪zWxB߽>oh]=aC:A u:*t5}k}LEٷD@Zk0e#d8ѳy(ᴆ]2A0z[Dd0[΅ԉʺ nsN\uUbD7 d[JSGmT|"*M XBhѼb'8j2QCHu4xjj8BtO^p#+JUہ+?LLdފvRWlBc2ѺzXb 'I t^w}5* :IMM"b||խ*Xkb1ӲbK-8 X j-,]P:I'.ֺy, CmsL@[CCou+m~pwVa 4!3}Xo$ RFjbQ/vXChDh[Ef\uW9 Pm,[`j; Kɉ*_m30IK- W9)]N/DzVtUceq #M>DEmV[#Jf*T :qt(G9̥JuYk9!T'GwlR GsY`I{]i[V1XEKȁNo$y7 km/Ky.aOtW۩*@K@$ڴ}8jYbG4p:ł_}+UkxBZ36T7*3UZHs4djjAk,C=txR\OSpK|Xk籸J]^Dy+6Q u3)mױ{mYyԈ$'*ꛩ TQ__DeOأEOŒ':6',_EMP$'.7ֺy, hx=aoڂ^j}xhL\ÊZlXRVCPc,g{' 8BV,S@kh>MJX\kUA[EMMe˗ U#bG+ʼn˞93LZki ×ep"IezVtyn*Q&7=+[m+yJX4a +t u(O<ŲeK 6H=u'S6kI3ԅ0BXw&BuTV7R֦kaqUo=z j,[i &KRQ'bOi^yK-8骲=!jf V=QC'ʼn45 7ՋU*v˞vS_[ pgjVc4NMt^5V*ꛨ I}X<ou y؊h]uf\3<&F B.(FlcHFvj7s{P`0BTbq˽{6qzD$U0 Efl{ۺd#IU%>6ظ{wg4[Œ0xgl_'6'SIO/Ynx EҨJ 5=;ز=%VI[ٱF6k FRE< oݛոѴJ>!Yu'[pU՘Ժ{o7Qo 3P($L%3p3nJjRܹ;d+p,Onܶ͝g'[W6QHňeT2Q2&vm eUuH M-ַoܽg nX]K۶e=lj15zk6ݵ [Q-H2 }slgg,$WHN \];׳vt:"(8k=غtbXF#!` ^W Obܵg+//\"DR*djf喛ضnv O&QUh?b %O)z"YĆ[ٳf-I4ғ*uʞh("LŢ{mqSSq*9pZr'<~UBs 1^~1&6N ^A3GPx)TX Nؑ8:`#Qrz4s?B}Qݍ.TX=<%6^;]UuM~8׹qSᔉJn*=c' xvfkEO4<# '~+)_e'ySbeɸ+cTM7%z$dB$GqU⎿CO%Ox LĎ>#g(VKO_~'}>5N&+pǤB8&sjP*kQ~R?;- N⽑Z5M2YT^%1nY𵭤!GӨRz،SCK\JhE݂,p7Ӝ a΄8fb 4f@s/Cͣ(*:E֪vg/6d|+OPUQZ!Zk$/e8tȲe%-1N& 6*io@=}a1maٷlnM]"os|PPnWRZ~ /5M&eݕd O6-qtyB.4Q W2Zs?Ü 3c 3꠲`^V+D&m%w8:4'* eJO,U;ͩK123ִ's&[Yƹ8046'˞.d` +y"R(?Pn׺aJ)՞h]Ar rWyikxb=awl}cWxvOssxbiY0i : g*OpcI sxB~% d\Mh.rv`b'^jP//\qo^H(qù9 C [Μ ^s J zW.0?{וi>{OIT*4U]]]s1kYjUJJhE{O]}3IIỈ\Ċ'wo?|sMu.c="yuqAжIQ R<Y% 8h)"["nUYfEIDSJ$H[i}~$Toc$Zhiߺz2߬F~e w}MQMۚ**ڿAL|sNHU<{=h(ʷI4y 2dȐOgAQ $Qwɇ) gH'O۪i,DWjU֊n>G{Vgq9t]N_ V1:۾eNY(a3AX!"Hvu/e0>=z$)matٻ8}w Mow?5(=%l͞Osvט[#!.ib~V2>#\'=h/s|15tW:1 &^µDU6JZe /D@gtӲsUyX3×9ys> WUlL\b?pp% 8h] Aiv׉ĖpU&ג\A9ʎ*crxhesP]}Y4UEI/s 6y'ݹ o_c)(O>8s*O^rG,'lUObNߙ#vI(q&|9Bh3P;C9%H~sNh 2d]x=S-xʷ@m-$H M[_/JM4b+gPbbx~GN }{{hj1gLDg_4X[`5*D|"iV'L,!͆Y$=wNu o ׼x]WVr`6IfhrP`%;ze9_`8#;deȚ!eb2 DL,4>?@2ƝeG/A|, ʩAgMc[WW8=qLJcB;@:@wVAicn/4}= FIri9hi़wQMgWGo.ydYuJ߆HB`ub3ARle$U+l"'Q^/~7n` kgD,v3:A!Aز͆^K\G[6.;FI!EQ0XXu ˢ#`=}$ 5;LJ;*IL{PXϞYlhIi>;sף7:asd]] Lp r݃wTVR?j:Ӈar:RSL)nzw`k6Sb᪈`S?]GbdS>r`N&~˕ /WgIVrzɫ>U]D`,_Cd;?KOgSU!n^xE,Ń-yF- g8G߬qW?Κ'LXQK/t3~y*^C[o#"`s:'!sϞF+)1,.4ix4g!8c?Sӷ=3 w~y/ٿ ;wnr'~M Ub.kT#ۛ(k|_F"=\[WϟgYc&ꠦJeeeyP#5 58NSR[0v@P .бCv[@* D" =QfjLuFLo}?P{zidyl5BN.E OYɨa?~HYW/C=3~0lgE/3졧/98e7'E^ \XNqN|%Ig5a:fOpfSGPޫp c6Z'0Pm{\w4mL(0hILvm5x&/O۷&ؾȕ_鄟ܦCvb/)p2n>Z ,4\kj͡N'ˍ?%w*dN9͂/Nhc@I 9:i)ITk2+gO'[wqK(`7܌f9g'n3_r˄y4á8"O//7vˀ J--Dck!C 4~Ϣ:˳4U}%"YRl<쯥$_ȩd[8sst9WB'Eq2wi75$`;ϝGhjxLItXZ*mVQSV]%hl\6j ƲrrM4B3sVQl~$M<$W9 +NĒ W3Re'];]@I,169rbF:j SqN25Z"iC gO :<ͤCұw4&ͅӚXTg0b 4\,Ki\Ʈ_醂CՈ-r>J8I~V8)31R72==˴cFl6"GB<L!ٹlQ$dw7kYbfRrj5}2j2M*+7g ~u׋n?v<xI'`#UAYmib8F LQMUf: یo=ː!C ˆ~;Gs54lQ7ԚV3.Ey^g`NQo-) y+< sQzF=[|ĉ_rVЇsp6&n>^t3|&- 'E@@RՂi_A+"h k4T5W!9pm⣜9q_ "B6oUJ=y\Zxycd[H*AQi͋O g !h x@ B+QfVXYXN^'40h dPOR ܘdqlVnTM iLAc˪WPd Vqr:A8'W -&C )R9| y}lm Љ[i|]%6]M'&UEUUT =mpCOnNvt\WR=ОC"#;FANL!˄aC7-i)4#Wp)CPaB !/FPb5D%MMTgOزT4ENRlf3&!7DQ^o;S<_$2OxKGm|DSIW>|B9&+bZГ&Mz\jA| 3~m*g/TE :A&Kla:ѿNOaۡ&jG[f2dȐ!ßbNSn к>XʹaB$,.yy8&ze,/J[sgIφn7fC?.šNs7MTf>{ U{:4@ounDo) ?$̉&7ljAu:I9# 肁0R*k1}xAI=eUMTvc&̮TTP۽Ar'5y{d䑟cd6=ƣSؚj-O!k"g;OߥJ}/_0-m@oD sD2*1:}-G^#n-P=|&$DIqz)J%gttw!n,\*++pK8@g]K?q1]Ct5TSJ8ű_hfߪS]wuX9bga <7GIo 5-wi>::6yS :44OF rN4l"eڛ K12!e`uq՝K<⧨*L&Y3:!u.O"H"j5fFy<YTǶ}T9B_f--&NoG'͕VϝI) QC`(7Y ' 9 |/xz;(-q)n=]#d$H 2dbpan"w͸p?ndjՑ ˛>zو^*''"Țjfm>F uD1Y,z9I2.& T$ x Ecs1[BJ:&_,,& Qi aٱl;7cwlZ")DI!K"bڰ(8T66aK5(hEنjDPTp4@K@;ϷA@Ic(PFS (a:- 9#LXL:9!N!-D@gⰛPHyA0;]:VK E[fJ<#~,zq3MNGQ4N*XpRWh`QGD*Ye|?p8zwt"/*@'3Yp,hhrDC_G,2QQ<0ǭ3 -e,C 2dAFd3G#_gz+>޺ 2dȐO16Mi$IB{+D| 7JDx"XrȗYY%&)ǙxSV9mmULrp'S' %!b41tx73ͮz! GU;ySq͝tbQ57xw`BEgQչr'F!=nܝ"ɫho ]xśY*:e*Y~ȕcWBik2co1uP߳ b!*.m5#ʅtxuJlM8+)׸5۔VrzRA'[֝;nAm ١;~@ :<]OX-ٝ!C 2dx%Iv4&M\nΥWܴt4G;\u!r]"APJSN*7d ,= 5Blt-tL4 0Ymx UЙX Hh,(zvD:IhbX~t/|^ ¾U9M# #F:w$@ǙSHcnzIP%4W8s)gD .At4?DӒ=yRû w?VmyUwS"A-D}5ĽRsP#!C!4ʣ6,syRľɋzlM7'MG U'l8-:dP8FJu&Y.&$M5݅b@dP0DJQ2bzĕ"".+]AOO'7f*Bnq)CozbH2b#,l;_4Rwb ̳S ʨ-Ya=0C\0raUT%A&hz 6BJq¡0 E|HnhsbЉ*D` d9il914t/j_B۶/Y"a)M`|Paz5W+Y8zDA! $ ́NP0HL$ ʜ,ϐ!C ȷExfPVKJ UPK,d{wczj.m̟\'{"z~,,4+#8:v>D+2cg~ʼnzzaS1ӽ ˜>v S؝BF]5~SZ{sytk+Lqևq鱘uiS.kzT`Ź?q!Z;UGW8u'.&H 1q2]A@`p6P9m2WGmM>ekSy_9)>ޣ9 IDAT&ZI]g o/?ӻgr5z{19̚ߡmL_r:F!@0YF98ż,zþa_m|wR9b/ 0ZK]O5Qۻ];5"<{9[x-6NJ-'9`SDNq_pS\r"te?!>{ߜrb=Xӳe⒣Ȣ=юǨώrq|w!ժ UdCh˧r_C(R^̉ʼnkĭ%;ȶ,$' PY%j.L|*|~QHUucSHOuC`{mZzz:;1cs"'&CG78%&u|e Ky%v1oldȐ!C G J:*z̝旫9Xs(vR~+s*)* sΞ2 /pIwxbuY̩i;U)%-V`+K0Vc[O=~kUT6' Y\ dg$ZhgFTV#[+ĚmINJxDի騏)h86qZj*+b*۩khĆbb *fG(T暐ǂ , L H:Źls m+bSX}rzu*.Lq8Kk(SL"79{ u;nodlcR_bO^`a(mHymܹrmlFW˂KGݴ [rsgM9%fb2FIPE)?L @TH_OCK\sPTMw㧏At5qc|F"͐!C 2TYf9󨪪DzHLF ?ܩylIG?J4EyՊ^9ۍC\C9 !bwF~Gi m5Iܽ g/Nc,tGq{xk:()+g-XqE%M?LGP1dBA-vb9djc$L!<ع\NQaf_,94,ޜN"IrI^5]W3޸G0*&%Z$Yˉ'(n=DA޷ W{["_!O;l<:1hFHWxp.9? XMVĹq֊hE IԈzyjޑËrT/|;kWɀ*ĖF9s WDRvriV- eSwۨ-6p-'hqYjʜy{~kfj[Q8ȃn?2g\]#Лh$`}G'J,JJFNIniOO&??R[9OT>?{1v*LQRHҿʽp Ƣ,z)..X$rWny+TO99f+$P/Z *<:FIf7 Dט3N-2>[n sO, UYqSlR_,viqWX^})B|cr]2ySQ 2dȐ!ß\~/HDA_PjP N1Ey;&$sqTM@DIB'he3IQ jkl0`c)KwUZzq@VH},b$iPddz| :(J2!RvX,v63rPt"BZ3lVP]}|xK]$yUZ(J"N\Q,>w8<(%IPD&puttZW;ߣ=;S_0@IsiLs?c#ߧHJ4$W+T2ɂVKcL{_2 Ɇ VzT 9c=!%GovZ"Qͮ*2*!I{|_ 2Zȯh*)*VT4 4EFV$tJ̿L#,/,;k\!|I+N")DAE Q7wo[U%t H(9}\eh9W1?/*haSX ):K88'i Twnvåᰛ‹a@@巷$ ISys^(2^D7:T  2dȐEQ뾙%TYִsx2M{u)e4 ^Ycg rjۛh"%t2Z(.- ɴ{s;h61uk`Byh%TtYɎ'I7bq B.:O& O,Wv l X(2J__U#۝ͦg% RIKI%%:͈_ 5tU 8P^Ki81<]QH 6Jjq^h}-8v }`$43U ?f>;*c׎qDAc2;sY1Lu*JEK;5%e![#=49_#$RAyE9}YI#L(kOt$'o>!e.D;ͪ\B[Ke4 Q.]_-&өdgQEfK~2@C uR^ZJeg?*io־^L([bٵ,oNA1XPڂk}/)l6UPTOsC)o ؚܒJraܕ1b,؊(),8ׅI/"-d ,v7Nl,1PTSIeMum48.NJ' 't 2dg(/Ϻ,j"jJ"?"_?`M8denm-NIT@!oθ?NZHEUvPç+ 5R*sWCqWv>ex5cx:)$;ǃBb6d'v|w w}{@"E::`wnk,^}&M%iDbB49o#{aaiPBA•P wodfW;)g=-dIuqvCg8~iC~;{P,*+#{17OW]>+|r. !=2Rg|X,!8Kn ܸ+ձ8 !FUuր+1bGQ#fclD]h fΣs.;کvn''3j;Cl6-^f"vzp7]4Ÿy475kMYFŬJF*zv1Nkůí{ M3ӱ'OltIG6/g?=ͽY?Zq'Y$`kv ;jZNiu- cNt@&R<|ND4=EPF8{3ITtulgR +K Y^ۓKqEEuN m|78u6c%%g0ĜWC' œ!C /{X}^xp ,ﺫT!{fgIIj B!E(>Q/AT6Xvw7զM3L ώzWr~/P ǹs?EF#/"`+ G{YگRqy%*m GA2TXBG(h.%g4Iʵ&w;d qHY"]z N VJ&Mv_>G퓟UNaZ%4V*r5Ɂ[_a7&GW\ɔxYIWWN i$r*f+r5eoAkxѨi6DWfjwJQ} 7cs1U4z ܠ^˳r,g/.:Lnj@$ QLzL:WBo>4': ~lrLMpFIC>_@!cq4 >RDIg~z=v#PMKYNzCtf8ԫA0ԖհNuyYFjh{`O~zA2W!b}$+iu ]3ty= 6%r"jg){ ~RdI=p^w7T9dAwĥ-&3|<"Y[f_؎FoeV0Fٱ w儐!] D&B>d 1G*ƖNtvBe,gk`QSWn93v$[NLcrQoihΕc'|FA'NrWa| YkhfjMCۉ><ډ9F'jf]f\y$e&[50M5V\"tc> OOG zsR! HwNG !儽9ycmG3u}~FzkD"w?'x̝l;%U:O<ʉ]N4pw [ hr0qLm'*ijU}v:F#r.'X ;Nxs˝bFL#`2jN t CgE&H7Bc ^gB4!!z*ě\ɮp Rqc6#1d݃t ̞`9Q pMzmrz'-'.D)cs09  (j\'m'm'%[,\Hpc3gxm'Yfa38XҮ?`5"<=LaQznis+Hێ2syvw"Vz#ub[`6{t ߠ Y L08{s3,l0= N Ո7W_e^]{_.U=֙?R_'Õ$vN ү\`|h \-kpb I6^CC4Ԉ7]ajgz4DSC%͋(=Ä%5έ7ā AuڄŖ+# yh` @GIM7 '$l)Zg76]  P#XBzh>Daw }ˉX!v!,\|(E.>OؼLtvse IDAT]'` XDQ*1e1>&;EV5z&FzNd")Ma=AU֓uJ-VI!Fǧ ̮ũĖ/15<@_0s8kk;G^cm3J vB8kFԪEP0=1Fk"E, c5-``dÍ4zdtL  $L)%Ybdl>zݥKbjd 2 k=#OLo+C z~B+F YQ051Nح#&o۾jFd <@4^"JSZH8᠛B|HNqoX_ c3^x=!Ba {u*(k[QLa&XXۥPmXfP?}cKEKT)֖giv091A%&QhݼZV@?#Ӹ[ngl_$ofz|p\lhN!^@CtkHҨ׉.^ cjt^uʩ-V#1l]í2g[Q6[v}K,"8G$h!Ul^j^IvU.v"䷒m{ˉT T;: 3=:D7@-zF)j430 acٵ8No;-3[vbFLAj kEs+&騬2SX_B:aHA(}w9' =Nla3>1EVbq}ev c-/3-P+eY_N>vBK[7XH ?r!줰N$Ӡ_e5^34'./rˉtaK]+lV]L 0)Q-X[ejbK$!QhۼjN@?7u6.031JllhAawDAfVǸъ;p& UVNErbv-F`o [N{,#FftAz2ky'qיl,\hi쳐l9]`5U/|܊,\$gz:&;I\!FgR֮gj:BvbDfLAj kE c MQ]a6RVɳ>}"~<>!>OٚHF?0n/ GBPڢk4}yI$"F9a2ï2]Nq`fjbN5ӎW73W?en_fye儈C#773TV>`^f3a؋t績M$B} GlFȭe'/Ppem"v"ġ mbm'rbF9d':i1dX]e1Sas'} u5ʭ[yHg F"GȠfۉ0 .re-NbsئfXϙK,92chˉq@z63l,_g>ëN}m'>, 5GSYdneXrG#)J+Xqوl0tsuuHjr Z|~a}Ř~+ir V BNmr4gu渺1كA 'Yl9obMbp4YzqֶYψ e'CR dȝc ;,ʄ°fED%IX,Dt75rKC` $*Q}IoZj!M.a:1Ì..̕vF5,GKe4d׍!\ڌͬ4pi"YR:z Վ` gm.D[qW=CAWIe$ MÏJ5*4gqD)̕6& g/G4 ; ze)Q%/TufZҥz A ;\ޭQ 3#W>I:#U5;tg g7T M fo ׉eK$s$Iu4c7pJ5&W#Hg*dr%dIybJlu?~=ksyjو1txm'9ሼh+*}N$yR0p =F8&oT3f#h'ap+rgKe,K | Ycjj;Ӕpbֻ-'r9ń(38a6j9NǙtYAzV!3|'ػ Imն&턉y6SeRvsLVb턽Pifjd*6IfTW8'߉}ov"]Nt ?@3UxN,n V=Jr7-!4k-Q DI$q1*@܏-5*c$ IjP_[G4qB¸nn}rk wNRrs?ʭG~oUPPPPϾz̿a!wE= ]lòoSYTZWx~Ox)¯΢6攑SPPPPPPPPPP7 192r _Q߫n\Y@U\ANR6BuAcӬaq+A)_Z*$Dҕ/VL.?&9ICǩ|g;>;S/|/}t6A>Rf% :mkWY8ZT4WXsy~ƞ_gi=ŗ*|'Jf"wR+e g 琧ܵ MCygxLڒ||}, ='0gXHU /}nDtMMNE|` ZE%H@ZyĿ_ǧI1™sK=: Or4 -n<5v bRnmVKl[ $ 7qߊE=V:2 "41 BXɷeQfŻ[Njd?/uj!Ed3B2[q׷9W+fnE$T[MDp5ĹV @!PnV~#u~'5j{"4D7ur޵ÝP\4[)LXL:T_rB8 yo./TgR&'|1D {)h04eFY$o,YMn;j,hʠwÓV Wgi-Q.U 5͞o9_w*W?ofHFQ!4廛!z)C*[w4Z/>-:Rk9l s' ;%\;(٘9"scR*ʵ8FL||eYdͿϟdȍ:8zg cհ=)ry>NVz86BZ!/PoUpq,(D(D|Mί1{8ctD 3qq1m(~;J=Ź7bN;ʫ.j"BGo-G8zpN}rbͬ'NGMo.%>:{3<{ln:?$x Gr#~<: yb܇.^:GU-]SǙXл*uΝyIgxfc)X g9}b~ts8FO~";1 =J r=ʧ?y4Zd2EDִuiNyЦ77vGqE$*sn}8nbe }̥(UAk0 /A H* :Jq=K2$hP5њ|L?~ZUE>|I}Ham*fgUHNp>q7)lTYw*d`JOV0<>yz7•r *": VuW#z1+g@k M/Ag10}6FrhЁ 5Ήlom(We&#S98؉FgwFhD:vF>SGz1.ރ81er(;g:[LM`}<1Qcg(_~jݼ}(vbkkh@ !5 v2ޞAB^Sfg'*DK4'gQ Md{NNJ>%KKٍl!."2lxug?!*mնa-"]$1^q|z5ݼw^A\-"1JZ7vJ$C}'E O~~^8uK#6;^u6c?gSo,}z76 DMBOrp&c^ l< zB~Lbթ*4:+~ɏ߻HTdzlԓpbzaSKѤo('+G<9F/I؂3:CǬ$j4dg;+ ¯U^)7T(O"k+.s6j&G9߽&;%dȍ1zb> vTr&jFPPzpvPl #H*""ŀv=. &P"|ٚ:ؤE@QS&_ hdc}zu.G#2e[i.]pn*sV:U _ t3u.?q: l~ GwӍ/ҵd5җ''t2bw[x "r1>1swj1p߼͙8,(=v 2k\|nw{0dj%}t/, ^7<=|nD j"'.MwxwX2 {|W`/|ƻ5׃@JvtX>Yuj"ʘ!^H>c@FE͙egEj?z'JfZ`G~G]W'v6f >sYks0>%w |~!L/y92y gnS/Bp.*ٵxzDx Iߡw5D!Or g~zjK$*QDd dGLo7=?}Rjxe,x u?Ot<Ƴ=M_~q'Ǖ9 H*XZf iU;9n0MT*[q8I]wW_2Jȸdz1 -<(&LC2sK MbiJs_QK%n" IDAT) y~򎑗Q||_kI^=\#:k1U (=Qgrk~I!)Ш֨edd1yiQ*ɨ> GfG:8OX%,SV(䲔F&$!Ue~sF Mz*V$B™Ȝ^e<|fI&WckZH.p#r+fBNZVR$Ihӄk 55,˔s9 *5]JnAׯ̡zMnZwk-r{vC>|p֌g4?|!#G]g~4|=ˡãK5TV:,x_CP" fA"^CJ5/\BnHn/_ʣNx*q@;ۥ"L%Wl6Шr\zxr3oRK$iP%LoL%* j]"*MK$h׋w'v09ʅm 5$u`JQ,8 ̸0Pzd&#U+PW)WkqGoz}DD#'1%8kNuWf& RqŷqNϱU3sdWz~wVJDZF6dDZ*hEZjڞб#LX~c.iDHGG"K!G:ڥ,STQ[M Fj7-dFD&c7[Q+Ӑ/, 5<1g!}}x]hT" J**(fm5U"žxpTh.TFËG_r\be5+liM,R/hjJhq`_2G@գDDA@4*J_Rlj-( FEZR!4L6L:jj[:( -o(ýfwa滿˳V $44քQDVQ5iȠJc$i$J&c U% FZvh_?]@^& TPm|c JTL٩q;6Iz #{f,WHYZTٙz:udNU8g8~G 4}<>Q*T!^6WRZz$xN%D(Ҁ((((((&P ]}c~IԠ)t?~yLn۸[RFjc3cv.-Ur(9j|U'h"M:z㾎JG1NS/ JHpyarzSZHgAN>u>:-~^xLgoϓL~=#~<`w(OP͵=*4>w]ch-ٛD}9Y?(Д2L^!:{?ٷyՂ/~o Vo]=ϛ}hPh4ơQZ#(eٜJw㋯]X<{I&z x huyywfN&ݻ4\#>矆9kwǫv.FGzzMXjufj[VhШը֫$W2-ZQVQnRըJm7c/'Sf߿s? B|-a?Dъ!ki zE ܯJėY= ԉ$kǟ1% `>.|;lg'?)Q$WДL {gコ8D/x[Tޢ' H(̕u{f~0Oz=+RH C eO79H$t5 U2;";xp[-MT ًnN}q7=֎?|㉣{x}:QX)EGŖK\Hͦ]٩13vfXBA hqOGG<ef ǹx~ΝTsuԷ1vW?'RQQQQQYKM9F_qLjziY^ qAnʼnA!2=3G(#Mgk\$kU#[6ɦb10<]eS-<5T5uٌ]/\ :ED tףĂ$k+A :{;pŊPJ9B)ƽ9s*LO3]ݴ7hO 5}t7Uc։PH0j4\}lAD}$,̮.ˈ -C,M2Xpm:c^v̙[|D vx0j+NK.Ե%rzkmSsur]['+FosKvu2-t ln,Ƥi5.Loo`֐M[:q5ȹSc3Eldye3Սibnjt]Yi[3n%Rcm']4 \$2bnlUct8)|,hq4wфMS&_ ܲ]e\p =ԚVIVj"̭ƊVTG*ŖY&)Ul{]nJwzsdDA@JzFGC{/"HJ0k6ΙdN21N)+*9)AQ '8,af@TTTTTTTTTTTlq5UI7]+QC***********}WUGˀ"SQQQQQQQQQQ_q@3䰨"PQQQQQQQQQQBhh(%qA:T*QdQ^G#T*R(I_C :T.# ""\E%zFC+BTBiTi^E@A*)}Dt:"b'ANG\P*%ŽK"Q.(zkPJ%Jvt/4Z=_T?DMCh4[*߰>OPQQQK }蚶mj䨡΃Īw]L ±A uju Vpحzʹ<%MКvt:9J/*ʲ/$8<ʈ;չu Q<}wD^w5SrQe7C1Gac!'Z< {葋99;?V@|w:cnXŀSM'+ vj<.(%맰}Y}=4>@9rIgi3# _p  ۏUE[&W1y?ؠeҟ_ MoނFm]5n#b9O YD Z=:Kk KAou0(ѥ(7mUM0 jt<=ْ֘߾ʇ禈5F E M;?Xɬ\<(Ɉ^q"Z7C.:|]YG<KX h l;xGT oWNNtof xlB|KMɦPLD$@2>:^%YIg;9btɟx_}P>u[o",juM&ZQ{y5qLyb).ZK3;>[1I: ˗?b.T:'_`Gҕx,ö݇8|+/}[ZyyӬfĢvn3ћZK·xU& L'^3$߀U1nMuۂKɺ [,F’WoލfT #VdĠ |Mh4%l~LB؊SgA/cqh^w cEY">l9o7N 'WzœrbYs[ದ2 ]==vL,KX[:@Q@]\ $hJoK F h4"iWfvKv c$ M u02k\dnTe4s :emW?<ά?\HMtc1'/)nT>Gvs[$Qouӻy7.cUIdAOC05 L3,aMnچ#<gedc 4bpS !v$yJ];i[ASGS{u2 DYQ ŏNFǫ$K ,c9A@t87JZivYYh4tz{.s<뉛6̞ztZ\xI3=ELffg\ Po Dl}K׈K`q0}QY"0sх0EDSf<2gD{ m!<LCK[#4_\R@8Ǿuy"kel}5|o}M7[;~8[V RmP2O[Jckɔ{mlZtTE=tTk,KWF)RqlSVqBG]hc׳)e\"ha˖-lm Fx3J"ÖO1hZ{+Oޝl=t!,c1XVy_~G9̑;xx"x55{}+@0ѴO#r5~{iAÉ ҷ}+6;v45m}t5lXqcF XA&B:\$93ƔZz-\d!Ml+putS0F Dž˨'\f8!HC%f|\Zk5=5A͞C0e2ngF2F d̍lDvakY'{m;ǙX ST@tL:\ >5ؼmuCx2*/NH6:cE'@:U[M+#T0ݮE)}L\z z\ͽt7j^ŗ2i`:َAȲ>?5J: }rhmx" eOM oхAT}L~ZF{ &QY#K2ۨkBWJ.TTTƘ W,m.G6u2-0^!]G+)ɠ9::(U“(_]e:<((,ISa|ktSKjGZ(J )0ѳJfK83}}xQ N$> qh0ݴ <#{s\3vZ뫱94uQJ`L-rq.|o!oiB(kdF-=uwb*h!L:Ui̪B rsJ\|MH &ZG0_Lځ [蝜',2+\sᱧۀlS1mXMJrt"KIQ4VHi2%NZpstv:ߊ5^;G2SO`hs;th aο6s^06Fj>z$ 22bӗE8ȏBn؄EA|D`@q %. F"ʢ $9;H$߇QVvaπV%@A*DE8))l@c 2WGG d«r l,>/nߦ+ܒ z{#-u~=e9۬CZF ǎkw>a1ǂQd ɤvW>cˏSK ζV7`-/p$ٶyDtyD/>HW7Neʣ2zF-gbn*(A.Z߉&ꔊd\ٶtKH7:H?a%_/l(W}/'kx$ 'fj`}ϟc? #Ŧx)9D "0.K_Mӷ^c2s\((,(||1c`]uŘ|?HTY,9ܚ(ǼL?ERL[pZZ 7tTt3aA@cqS+|a__)Uٻ#:MGC';GV~o&IH Ȋ\CYFa=A–AEgZG'KSD%X\1[qWP0@Nۍ!@LlRp3;i9̵t?4f'{呝5?WH=YpNEJG.9ȩQN=@6t$SV<4mz"L@5Z-e\ux(c(\ŗ=HJLɓM Ǫ)%„e:E zΠI"$zzVZ-Tz:<ԶRRd=Z@ʔ,-Y/xTT> ?'H3+FIdx`^TaN&$-`ttvm E%o~!$㵓s8JDܿLZ XY[%QrQ$t={nS< P&~G&ͻj@P\yM9>F»\ԕr{KJ}uu~Ծ:l K, ƚF8d ]4ۋ,M/oLJ>)F:24T'>N g (k8e(e IP(.ʹ8$ VYjqL'KTrQȥY(˔EN᝜poѸ-Gf59/?٧P΄Y(W$Jhx*TfK\=3vбC`K7*TqGP,bUa2[k҉f 6`.xW0 !]Ҍ==@"Â٬EբDRbvM@ϩ*#K\j 67.!:[;WUya.mŔ|,54TJhDl,odd"&D;:] E(K0M446F{ #- T4Jv:DI6!Ƶkl̦,\\G}o?4D[u2 /bJ3f^6PX EJ]xՄ& 6J]ctf/ nyr$]{(6tZnc-L ]t麓R dME& 5v-yrQà"1+EiW1H%F 5t8b~Ι%uO',/ϳ\QP(ӄy9N2W{'H$t2Os8+d'̘0'`uԌL1 *( i^ &HC9c~&G3tS̄HD|$HG$t +(r%[ 0h2-Nj[x<m8 Hf h.v bnW-A@`u@1ggyd<\3kYcYb4#/p3+?WNoFR $}4(2Rtd _ PdIo_yb3Lu'pnDefHhme⠽I[BVJsiX"!t:2,W,KJ[3w7 u M_G5H#g^mlyǎHL\>Ϙs>%"KjcdID)&DǩYzoH< 3qK<> 8_e-ŦGsz2K$>e-}{KF8bN*$H&\2 bjAͣ "Q*Pj`6/}alֳ2{G9r`H&0ϥK ) FݦBU.] plV~Y4S.3Ur [z. V!r|*%/{yE;&#k. T"⒬|a^[!@>K@ًcϻRNÁ!7]!!F32IWWNzD`EeDDX[ S(f.fcߥzfa2|[۱5x{[ ѵgrOwnm3FڱjEQVcy#e%OpqGpxr3Va"{?ɷ[ {P0J1ؕ0=lwkZhj ] @g 䄇x|/33:O~{lk4 \|Y_Zf}{?M]N5pԮsG/4S|r<킑3k] >@w':J;9"8euضYD㬢zzoW,y&V=R;CQD:>}Glo {M#U5.] awJE$E+㔬l V$ |oijp#(Xϲ3yy`ڻhlnP:S9_F _^ };>@<\\cs}_eni5lٳ]mg_N.@充[nF2ih۾Hl}&1ۈE+5)"Y8WsTu!M_fz%W<_aH`,"*ꩩvaXrH+{-MCIsWVHVjD=LB*̒\qÁDr2:Z{pl1+֘]H48Z̈8+r2T$R0}iT AVun'F%"%^ZM4?R(E#P[[Y,6"V+Qgru7* ہՠ[en=qψˑ)H'|*ˡ,hMGc \_N[a6"+DֈiAJq,xE zj1|3WڒJ_<(kwv-vz{1ty gJ(Rt,BbRrH0X5 s |!5N ˜>7m oTw-xTQĂY^FZ0`e3x|,M* !/WcY1 (8i/^: NÆ'rn&줹sVă!%ENvmFW{3nw@ )L|vAhmד8f4,+\Xmhc6dV\ zY%)|{s)V ,.IXL,ɔ1;XO]d~mA!\fy5LZ%Ohu_ZOCoM6DƲ7@+,'s_dS$E3I|"I\Ի,k^"%%ɛuv:ۚpYM"'9qiFm"»cͻFF0ᩫ"JOeDB;J(GYqVV& j_ O<L;~|g(ǽQ67>qQ;b*2~/PDEg;rCQEjxcXOŦ݇% 'l~*T@Ey@\Pܦ/m7ycLB ""sld]n]e pSB@ >woYNpxex>,K_rk[ᡦ̕'P69ޭ}LeYC=W;p/]P>׷;~?EIwrvߪ ܧ.)ٸ{]Y]zO[نbx ";6PnϏ[6ysOjl: lƦ]oN)ٷ}7gau*N_yܺ<[Kk****!ӞVOR-}sRvb1h*|.E$5㰉JҟuF,V#dNl**+hN<.+&SPlr~b/MH/U9K,=_.IUT(gcgc TTTTTϠ D54rX$FthUeAqOK)J:݂N%3{^,Ie5͡Mr~A}COD|=:9F.l}/JY^LX]l}p/ۓ RD4GJF+pwxtUEEEEEEEEEht6v{A$UCNO"U8c-RBkog~O ^$ZȌܱ6Qsx5Z}#QƼI<_?"( t(L>ÕY/`C&w7R L)&''[ -i]K1Qs=J4jD{m+ft1@$=6'fQ**********D3 Z%Òm /ތR`4j]Zp[A5zLbftq;O:d ײ;mTKFJuo}^KqDha}}q FDF,a)ʠ` U B(3={ef_jmFj%D $@HPޛʬ6>dyAVU͸qoߵܼ| ꔧ-Cc)+x+? Je&.#* IDATl*Y_tXq) t(`;7n\DvS(b   ѐB£s⍓ }D" 2$(onkjJԕY-}8o~:R[2t ́PٴL SVDKw%04 K q4r(fAAd@`IdW9q oo{e fk_-'u}f]'muHYX̨:XillbR)}e~kKps5mggf.se"DZ  ;e\z緸Oҹ~=Dy3\`cnt $ I*XWKmy^{OǖOw?mh{\y$MS-oMaf" ۰6l6da֗<UmDV6ՎVnaRjW4D ;GR)kȮ#,I]=Ξhp'cZfmxWѻL(L2g|[v;XɓU X::zcZwW[QRD浬(.(6,Iвe7bDBD9RۊXiɦ\IarMv/+*dqˊSIϞlhPZU4m!Ě2WKIQvT[d6kWY[j$Б)`MYS_{hy,P||[U쪊{zTIVPU"c*`u|q斓|>uͦ2XwV(if׮n 0K4}MۭIrRVxxk_~D .Nwʄ 橧klw9O)m[㱮*d"6)|)3/hJ2& 5_yȔ4v^Z<&ia |;\[Fw PxwSӲH-X"jFh('Xx7 p$ķu$?I2׬xh)F4zu>'k)|lyb?]5˓\$Wf2Q߹BW߸߰Vb2ںR"3w~ŝ-q-ykI ;9.Aj|@;ԐpP%,iP~}.}z2O[&y̙8 k8^ua=ў8ˍnv21t G&6Tq{ߏ좩]ʥo~:i-޿8H4hioʪ"Fq]ecp$H*1IY¶uvf5^%u};ضagoJؽt~ͅ8W޹A&4togJfϼdP]et=UxNsQLIQjd -CE-dS@3ad=JNp{.%H, 6Ĺx68)*-ơFXJJ<(Ri'Ey7f2㱃;[8=JcED,$7/ҲMtݴ1cZjo01]Vgv#FaW;v3xEE.C{{]LuUSQeҦ.=EUT8@ <Q$T,L0o( |/t"4O(ôdEe{Q%l2R UMٗ8K\i Jji^m>IpHFi60%ΊfzkLMp3gPXIn'~ӄ{yJ*i-LhbN2#kx|>Vp,),c+Cx1H,C O;Dm 496>,LKEu;Y1 C$t_3"9}!G,{vQ2 **EQ?3${#l2J t?BYJ[^f9R+7-h#LHl =cJü Z>:_h'SQE"0{U'~ɯ޾H(2B-2t ".`a ]^mG->l4¾GX[b`p-N|xme}yvK^M^B708 kRž矧yc}dcy~DZJ$EꩧMr k$"Dbz>ZO1u==4 21nNլildM >|u-$c+nﳻ,89lde䤴J%bp-|]%I D_|Lp={zbUN}+ Y: Tt,={?sEml}ul:t+Zi-НvVL٩8{N]Jae%xh$3c~xմzmND(ZƪBb~`֞< K1p'I}/<^Ȏ'޼OsǞz v,CNr'̥).ū|0^~ =>e9 _{?qZ}Y~LX= v$?4?˟mZInN𔵲u7Ӝ嫜^${7S;h$?b qXb+/gX)Nsi?ϖm%)p9uߍϤZ:֗8+Ҷn^fqn7nkRF{fjI?uƒӁvG薱92L}7?npg?{ddl1j*)q8=66ⱥzOfNsEHzP_$>r} V3=[˱c~%{Rfxթ{e=ζ Mlb~uvmLaSlt.ZH |kEy *g+'"V~I4~\19nCLGYds#-e f|c@TCguxW'j-[aNθ6ԓ.dK10 K&:Hjq[z}D`ׯ[_?7\*n!fG6Nus,7t1K@N]N~i M2XlTɁv޵XSxcyP{7<OoKOO]}v83AF=o)Y&clH]UeL Cdͪ:%,gͲcc:ѰBa)6G\p]YQs)\83.LDd,G4lUvJj[騝+/s2csH;ТO>b;ٺi@Mc~ k:1vYԿZ{wp+L]F.7/ÕlϴW\H-?4)X} C4iƼ6C i~<Ζ'~^zwQZ\M.*ӗ/ q˃ơX`=YVOOǥ5[6omtŁŻ#L_cAF=l / 175k'>_ fY$pUN^/Æ$IN7>eJL9A1F>x RH[N6|`4SD΃=1O j ]%_]İYđ7k[)D1:i&\h(%/@ SP~˺דc*n\vŮVl 8|#LLβuuHGy -0Xݒ !a/`;q^_YobRTYfyKa*.^CMEzb7e|!}:׆"VVzI9T$ T'㣼I_p%HG{-Oq_^w[(_U~)#()djE_G3ז)[Aa:'KA24&g(<ַ#^N>ɭ%_Ea}gV7B#-ܾ2G,ҭwG^ 7~NַUs0G|dQ6MA$ŵ8÷xgo.XO`ε |LH䕍l`wI-'a`Yb ZFr_=xx]/>Ecn8߲QTD o=ʻ^koo> MljF5t3ǁ>ۃ-Lh|`4S̆Od?S?2)75XWX8GNFImL]Ayɦ?jLfrg'bkzʯ30*6+jv ?`@û"0{PtqO*"'KI|D$I'SY044SB2҄Fn;k\`a͇IG@wv{USX± [&zj#A (3WXG[U K`SBIdYM2~ۂI&"Ϣ_'խe6\E7h(f`|ɘNO~ 8tIj_{夼xtޚ3>jϞE]tc?8HT!")b#7J{OfIrb_*d#; Kl(K eRKwt>!YOX:HXJi쥥\=tmX W?Ҝ_*cgqFgJƻ6R-sxjbxb2|fɊRM˖_vG?x:E2B,bzN#[b~!-8Bjik:6CZ31ˑ(ɜ]:߿@n#>ĉ??v/5H#TK-K2t1拜{! T`180͢LA,mY&Ǚe͖6n,d \ Wv&`qnMH'{Y 38Ņsȋe= K2>4Fs]-\AqZXs/Zhp`J&S;ک)fL\gxR;\v<'zj%$"uR=dsw /sMFmvX%^XD˄-Hł$2F.K"g>J?*ssLG1/]y)y9nhL^=ۣ*[ڪLTtH2a8h:stv/It!?qnKaXݯ kaSTd/^Ʀݻ^Xpg"^<*cs08hijrTcuWoTy2]OTIn*˱WS4[f9NL8Pc*o>HC{JHYTOLW9ֶci.Oi; \( A3l ,(o(9:P-ߥG("I=),ctzF.C40RlpsW k^LH3D>#67M}{mE6 -RB2c"iW҉llfpk&%[VIefӲ̻_ 3-R37yk\a&)߷蕇$ɲ5- K9f,f34H2eb.-eS<#/a']d)dB /:)*)ERRT̎Z"g~/΄i}yۘ&Ģ %!D,CƉb+7"c%$s!e}#llexqMI 7x%;еl+e IDATybpleI?ش4\2N0Ȇx7{;$$[>0zE6u;9yYLņrod00,D00 l"J4 >H\Fvq>>sHu M(e^p¿eYH+ې*0 PUl|m\VKֽYd8ax+\NOgΗ|ڐUve%ᰃi@mxOe+y#E! Z#snf]U#,ICP'>`:_Ex\\ZH YF'p:)vvL#~?a3Y0s]l[8Vi9U 6UE1 tdl+[* l𑯓Lİ|JLw&l\?d dW'@-Z|峇JY"%O϶Hfq+84oͶ>F/ 93~ϯ;\a`wO${hڸ]Y}J}8xPU2HFXYtd% .דi)FgXDuKR4S#[ba6@Ɣx@K&0fLKȉc[QQVMρg̗y콝dȗ IL 1tt*U+w-Ж5{ǁ fopqlTJ}QQ.-6LOMi=MkVQ4t &"L]|bw L\8li'аy;̌_bij%0B8zoY)*L18t1֭N J=>M@8*v%UԖpJjhJ1HJSHC}-<(#q(c2L#K(Rs,L Vy=\ -,A!H"7~ç_; cNSPTEqNVב$ 9b~bm}kY׹%Mfn`º{TsDcZc20pjO(YLN8 ت)bNWRXDgW,&;wu/3 9<ЂD7'Il)!y'v[1 5/$ [SPӖ!ǻ-M&:+i($v6C6zl-"'Zj̇SO*(,!ٜ`Zh%"Zp ׺&VZwyO&!Ѵ9]kqobiie]3RZ[CuUn 0S3A:{Vӳmt6|H)Rilm7~lz:Do_%SSk#)W-mQZʫp:\XR+Y2,N;(ڎS[sc$4en ͱ54W2veq6? Y1FB}t3Sغfmķ5u_}h5X'߷ [=X6eUTWr\`&E,GY&?8RY`sѶ O?x쇌EsHjlnsPVSMuIaY Y#q,VZAnĆm^xG|UG8C۩E{s)en9M126x3#RngLX)@uISZ]CuU1n (03!:7föyJ3lظ #斡N|i}I' 3GcU-/GYF];г:}O5]ԭ0ȍ,D3%Y*;XrmBz =;vu5W974B*Ǧu5$>[XLR񶲵 {vk蒝5FLIpuphJGkZ(H gR\46Pa-retk ;wi֖όʹ,Gru~K[uu$SZvOxjV6tg5&0hYK֍4}5szlI&g-EqBKp%7!a=/aS8v bu\+Ey_?9 "ȟr<   8 Bv;6EQM9> Pl]WgAu%*⢰"52 dWi-=]׹1C|egYPIPnSQ>jJq" AA?6٦Ҿ9\GQu)~y1$wA n=s;VSRũ_{(1N^ 4.p_e PPTB 7ʈ-}K)*t#o98/ǹ2Ey%  9 ݓmf"#I"4$ _Yn|fqTPQ򙆑&DB3Q^*p&z"|(2?L]TjqBK14 $Y[ZC[L$ ,#2G|;@؛؋DI,ىq&g͝u׺Of>ϒ? |3+='eTHJ")6;Nml6% #E"prgEDDDdmIwD[`h8xp|Gl?ύ232 _sXbQPDDDDkj]DDDDDD~]%"""""Rz(`ȚQ,Y35c+ """""vEC """"" """""y:Y5qVԊWDDDDDDVmEUa^PEoy=PVLp|ɅK/L92z%QZh2=6KW?%LwKRfEY~B3V>2+(r!l;k2 J:,7ףK C3$~;1S)-(ˏ5?­)lݍ/|'C$gPZ53t/ݒ *r.ފa+&56\ t2H)|C:Z|@|]?8kȯ޶MP dh<<-aΝ lڽmuVSY=3G(3 64kg+ꨩ,/xhp0ҩ?!Rfz1L*[9~ǏfGA7Yf&<3af mecm-U%$EfXxnNKs#Up#, 74r3T{ -`-Ov~=wOdL_ [Ȉ1#m-Md ̇/dw;QOd:F|p3ۻ &V\UB"2G%6)oNm|_rm &H/j?N7O }RaN쩀Ar Kض:j*Kn6sQVɼ:N?0tOT{0=S$g$?ǣ[ GY;fIT6ѶjLEp<0ɔnM4ԔB.`Iohp0}i5mK3 %dJh='" ~ r+J瘋X世JG ;G,rg7Ѵ!P(I4{1*++[f@ mG9s| i!%4Y$q _b[K!sƻ;q6Pva.|(<>\#(  LL~\^&g P|y}?˿L\º}0 XAg~|x3q- |LyCx c=L Gl~n<` Sip0p, a}Kؖ+O Oi(aEcx~LZ>xCjAO<žlEl|:p[NI!>MbEB L803?#Hem#ٷ30 do[r_e?&{1{їa176@?L0v0}$Cbyv4}g*-m=3Nm \ۺ3q6.-Nl,8ɵI MێL~mKl@|6{|2wo2,ęgޱ0fb${W}8V01Mp׫aztg2<섍y$&y`d<[Ug&Y%M9u57}$?#fO/}T(Argy6|LYHJ&5-t/ L4ݽ̈́}bcYc3OXrYAjA={9$#^O?P9u$d%/Eݶvc{7o=ĩ'Ad>d|`=4]ӑ;G,[q]byz<\b4 $3 \l^Vͥm0[^3 0Z 7x<,14cc/o3 $}ɌEpn'I<͓O_d`¶mul[^NZ1-5$pcH S۴:dג}/mΰ8oǭ 0ŵ]YIxIbnv¦3 ;s)l) s\H[çRfy||7I—EˑSTAz$1)$Y3D򻾙w IDATTJx"oCy!FaClsϿGWji+)"ϳ$K]xLCWy嗸<:ض^Ȧ8PHcaaywu0='`f| ϧc$HqՓaă|\|ieWp->K0ff O>D}whld{tu4o[?Gg<f޽N3cD +ܡ)>?15>ΦtCbnh!Ʋ\[1 4ҽib雩+&%!d{&j>t59㗉X39mG8u;{D1۶m$%FZi&^El;vLt_.0noș#TxE߅8{u懎ok>[{C" 2rRY ̌Xq|9|ӇPYX`ǝԁJ|L,}_#<<;A9{mlYpKپ ?*f'VϷwqj/A'AxaH|i{(("^!_v="{Ge sg鎗s7^|o썇x;9á*22)+fᲁOv#<8j2i}ud-sݼ9:Mtqcj';41 ca{黼0CefoynN&zxY†woo#nĘ$-8Bu~g+ɷXfvnoc! #]81oo~6L<-,$!'i}>:IyAv6da@'b2"|*1J5 &ɬ)e|fF{雲(, /_dg8T'N4m<@pv:z Z$6eeda)yVy]xhG;gSq2P8C!޶ڭl-!F}c_ynl>߿4Ggnjv;; ~q@d6ZȖ S)$u:7FD'\NK]ɟӖ\Zg"ĝd iXC^KEC3-E&gP0Uv/]]LyU>syV|8X Ҳ;7RYgnl{ [dmak̒FvQJoat& N#dl,si1Ҩs{눏u;[( >?^6R! -01D4:j멯(!#>FGoҥ~ n@ʥ 7$84s1̒2 0Sm6ϿRU='t3yCO}֌Yz:Oclo*t>m '=OPOy7ul?ryͻxhg#47PPTJ1}JRC^j% }eqz(neR ;DcrKڐ8yfajڻzYGAnn&#)*4]$'I{9mfCݑ%" + $[WE]gљj33>s0ԍ06Nh=v5p{s_IiVq *Z+_wʂJk~ ShHYDm"87G~EXY@GI >{Krӷ|"sĠưYϿHg@L܅ zS(OB]$=|ri \KC$!u>,2:$mOe\Þǟ;[7Qvcdge, Sy Ja$&iz}ӗB}sɓʻors4zgK gKN^u3FF)[ȇ|ĄQgfkS3}?ƿ}$ҪT1sSĞ3ڶK/Oh{}029_s~{\|/Gi:HQc4~f![*qB\yeړ7YZB=0y4* FJ>uM$-K/gԡ?b|4-FfOcg ^%ܽ.}4tߜl"6Ȩ?faMuL;es@}ÝfYYEуDUl\ׯ0 fi꤭v^/tsI3@I-6o__Fy|0׹_O~>BkY-9ر] xm#?KW:;юx7bo!0Ee^e"l*|gpst\Ԫ66Z\= _?l Kginh&ٲpqT4dD|#~Xl1\#L8fcRIrǹtcdCT9^IpaBqX \'AAsh4xo'=һoVW^gFvR6̻=;o[~k~zz(E?xϏ3`mBo&q ܛOh,&'ua9N8EF?9>w#II-{ @ߏJxx^X, f`tVڹ<ְQw1ĭqpkٺ_aǷ&,lUa]n|_Gmopp v(J[ js7XA,h42%x⣎\/sps/lDEn ?1cuSlY:/9 "3{Y R>LXM+ſtH&-= 4} ?:EB?gQfHgc~2x 9iI_m)b8D2r\'Ck^>ONvY|f,Veiq 3G^f nh{ !la F|wq|E|7^jKmE󓜖Ni|R&q7b0J^e:sBX(Ѹ<\4Q?%eTC}E.B;s1ƅˁ4ZSN6q *,Ơrc]LwCF,LO&+Lx,B:y9Pn+ q_R*)|&#-5ˉb9't?hkjhԔ,2sJh:$^I=AcOQvѱ4KJJ 3L7Bo̰uo).xr3Yű}o +HI;B*r((-" jb`tg?21)dF\j#L,$C2O`oH/p(N }Ln 1417F$f_.L8'4~~6̹d 7H]2t1.]d}<oN;Aۑ6v1r3R_]Y5[ɲYIҶBs]$,~Q0LI 0L?̔Q <3%'"}tu9냌[NEM{8󭓔x_KL?g<qX\\u]}j|xckYH؄8n??쩛cUz'H?=ln6E"X۟<\"nY?GK0uO>зϏZ|xksdDZןK] ^2m'%~)!{6H8. lƲ-ۊO_NOXw:ܞy,jl(gP&.7mT7xO߽cG"M"/)6NGE7υχ/ Hý}L+#lc?zU^={boj呃#<5g)=`&3tt9Np;V޽XvJL13ޛH +q+ɏ.uJ"R?9}&%gZZy>x*>zMo`ϩ~l7g~_1,/1ǥ/2o:ii&{~xNXCtD9UWGZL68͑MTVoϞ-;orm>g$rBs?`!7ȂeM;[O5K$ pA+)(r ~abRr3'71 1>~Ϙzr/FS][\h3~ܺ@l.B(F">=4>l# Qlea[_NeIvwI>oFϩ-:??99>}<\7=TW7Rumpv?JE3?~^o3՘NOyb'Vv%N<ɮ%<ϔƏ~N!Nl$#y.O9c&=6RW[ #ǜ棷z9sItEJte>1IYa86mOXXM"ò㖃i%[^x"Adf(?v/2Xq,wD퐔S3 9g?Cn;_u980ogC$g$w-z&K>mMdwƫpmh9y}W twwSXD8cϽs84SWGdq.DAM=Y}}~r6;AQi>[L=M4Hʭ!extSa]FndL<ܳΚNJjwP6w{?@$PSWOUQ:V" dhOuI*rHLRL/H(2)y }?)-)\n%D&{5IZq եdo2?-MMe0Ju~N;QF9y 2mG 0 r6Rd3SQWC~yN.~2K\GrG|nfT6{"|-"A喍TgwbL3ϠzʳS0 ':Mn&xR\ }[z LV5Ԗř&LQM=U>&{ *ꩯ,$Ϳt؍B[(J^Z7%55PZer$g14H:ZI9Oa;AFHS__Ex{3]p'{C ŤK7Z%Guk9ed (J?8I  3$Ԑo06:M̢.[RtbS}|9ԾLlc3UYEFz FӁyp5//,m;ITol[/??M+ }/SXDk //8ί~ԝbs)i`G F_'vɵ.^*UTy_֬ngOS1VrQGzOy~@Ѿ'-3 3|ՠʚSL<d1j* |)dDױ)jw#w=2up@DD9rrr_;W#LG7W .j6+oCל].3x&"c7y􆿠ckY!"k35. 2:^_Acc=)sxK-]+[͊|M W7d>𖞄|S lmײF qIDATgc%~>o?*kLED& ;m)K++:N!:$+8BED~@DDDDD@DDDDDd[s@DDDDDdVtlDDDDDDD~V҂WDDDDDD֔j@DDDDDdͨ [ """""@.X"""""VKDDDDD-Y5u5.X"""""n)`ZQ,Y@DDDDDdKDDDDD֌`ȚQ uX4"""""""""""y+QUsgEx@DDDDDdT.""""" """""" """""""""""럺`ȚQ,Y3ijDDDDDD.hDDDDDDg`{*||>ua`"""""" """""]DDDDDJ?@DDDDD7b+ """""j+i""""""kJDDDDDDVM5 """"""""""" """""j%"""""kF]DDDDDdRUS u@DDDDDd}R u.X"""""n)Ȫ u5Y3%"""""7hDDDDDDDDDDDD=VT""""""8ΊZ*Ȫ]DDDDD@DDDDDD@DDDDDDDDDDDD?u5.X"""""fL ] !Y\U ]Q ϧYahDDDDDD'Qu]Y+P߈i,R(Ȫ)Y5Հ((Ȫ uuKDDDDDDVM5 """""f\UIDDDDDDV(KDDDDD֊`Ⱥ"""""".X"""""fKDDDDD֌j@DDDDDdͨ !Y<[Q8+jū"""""""tQQYKDDDDD֌`Ț1MS3 """""vD3 """"">@DDDDD@DDDDDds]W5 """""vD5 """""&|>f@DDDDDdmY@DDDDDDDDDDDD?u@DDDDDDDDDDDDfKDDDDD֌`Ⱥ"""""" """""]DDDDDJ?@DDDDD7b+ """""j+i""""""kJDDDDDDVM5 """""fKDDDDD-Y}P,Y+%"""""`ȚQ,Y3QQ5"""""".X"""""fKDDDDD֌j@DDDDDd͘"]`{筨DDDDDDDVqUU3MS3 """""vD3 """"">@DDDDD@DDDDDds]W5 """""vD5 """""&|>f@DDDDDdmY@DDDDDDDDDDDD?u@DDDDDDDDDDDDfKDDDDD֌`Ⱥ"""""" """""]DDDDDJ?@DDDDD7b+ """""j+i""""""kJDDDDDDVM5 """""fKDDDDD-Y}P,Y+%"""""`ȚQ,Y3QQ5"""""".X"""""fKDDDDD֌j@DDDDDd͘"]`{筨DDDDDDDVqUUS(( ]Q,Y>O3 """""6 O """"""""""" """""""""""_3%"""""kF]DDDDDwA@DDDDD+ ccc;_s]a"/{yטu]zzzxǯ!zV>˗/cYw楗^"ci={0==˗SXX""""""<#AGG'O߯""""""_,yټy3~RUgdddrmZU.X2 n25""""""kfJ&J`?G^zœ|];tϞy8iiizˮp|S}#"""@_k+L9˿;ͦƽv]G4%P]])F-ߋ{ۅyR'Y <Ɣ? HoOxE,85^ǟJȟz[VRsRR\߃Y=s+3Uwv~߻snJHwS?[|_q"齭_xo^';xX ZmӮYb'6ctzjqDO!OYvcK#ɖħZwӹu&ƕ̸#>zwˁUɛ)b]QM29=r SG ?k" sg3طTGMt׬ jXblfı@X)qʘS$G=kc,QR: *lO˝%\J^F5\KUlVZm6^z>G p,6cN&<{r+*k:ًWo>wi{;ɧzgy)nn_Yf?Yota5nmg匌ld)tTB)gaDDVYmb+wGwdQE?dmm<͐PA Kxfm~oXLwPZMEleUwA]Vohs֞c63 ZiS1s;[A\y@z-wS[7 Ӝeg-Y|imA̶Z6WvBτs'Y3hq}ޑ;uG:1b W6tL5EdsWS^[`w1K#SqJ'Y`n'w(CD‰AuWzXC}m嚫_ +JИ t ϣ-}=4Zݬ}BiOC,|uk/u[oV->Q6ƤzY[=E-wCߥ"K6\?;~2Ve]z\m Dzv.aƓty&J}7i ^iBb7G8d3B}εWH&+돕NZǺu&}D(:c.F^Р}b~Bn 3ڑ`U+)1ө0%f玕?`ݘAP>%d p4XliX\s(;G7+h u NUM"Cuz#|@ۡeFv'I`io$?ғY;awڋyb5=P{54ӥu@ V(dO1)ۼ[Б_ˡj3G#=Z)mLfY.&cD&+dx8$hv3L+F [s \k_ỡxkq3+8h1c ayTTO:7;0OQW.~xG0ƨϊTo;-7o{4mU'Fktpb؋[6mH)P_VR6S{F.cNGN+Q+ kHpSyG#P(tu R"lOYd;_KMeQv$&{ K[` S[O3[Y.P&BIbRL/䢈;B?K D8^0K|T72+%z7C^ a8W {^v)dkOY 3ZHHa̮U?hl.BŌj4x:@޽ nZ;cF4[Qlu3 (6aO'N\Wm̀2QoP$5?0} гKvbGZ%+(%KU3w4J`_z) d5 H&EoڤEd:W Y# l"^[`1H8lL~j*_({EE jRCtDQ6sҥvA9+Jz)g=#f w_.ӌκH^|P߸f Ќ9+|BD0 ~i,ƭ²6ҤД*ADA HkI<$(bz-sض&n]PQ@BPҢ}Q_I" ք/Hv*4YE~h9{$+2^ AYB'F69$=CaN\ZzΔ(GA+U,.O"] B[ E=2-c8jN//H6rd['A; ]\xCC ,Z !}xWM [ ń{ |DxOdLW>Y`-:>CZx=UA4m'zPm3`$]LT0(9"V2t0Ձ"_ !LN4FR rQ7lp'Q}-ҁ|]Ռ@fL%P|qb'F1x鲄б.Y%gҔ [{-Q#/0teӰF`t-n[Ns*ߥxP5+`R)B+s huuyt<b C4WFPlw)Bp Z*Aƞ+_QӠ$S#a(s`s >"S,ӆS%Yr* +E8J˸e*g= !F[& (YF^ZK(]0X6IbB| BhkܺkL. ըjX$t9) ; AE< v涹:, 0v1UbH’#E}٤,vfbY|I:B 1nՍTݛ2.zcuu_oh&#"$_ߒzm)%蔀+,d6ʎt$ZI(Ԝa䩟/t  f#$uxq1m&u_=ȥFyl@woĸN/1 vfqy+hӟZlmM.w'C6eW E) ^Z8}ԫ pp({=}տrxbsl iTXtXML:com.adobe.xmp  bKGD pHYs+tIME @hIDATx흽nZ_:7q NcAaRDJk]0RHCF )ܛ2v-"E@s 0ƆHS0g嵗?y6!\/ !B5!0XBa&`M! քB !0XB5!kBa&`M!Bh忴~Bgԅ(;8&w֕""#'k!i ]z]ߎp0N=~5 ]>3BWsL0Em#w 'oІ,PM&OR{%ͿӧLZ`kj,Ce)}0}` O7zK.F=+!W_New,|AaЖ!)_/gC5d r%:Bu (0>cwvq<̼cĮښze#</x7uL?EOϩ~>HX=u] +2 BYQWM^쐤Z{8/wZ,]#[LPqWɚfc-p~W2q'Ê&G}+.Xz \'pCdy2!+ :dZ6~}BI1`&jo3Ŗ4~^rn:ne`o;d$enCZ0Ugd;#ܬ y [CBL BO9P(;,Ir/rQڑM7 򹃏tɅ7hC91ۆcG/N.Drt5ʥ)(T*,rY[ZP]ac5X,ky_լMO/y~ }Ű7:>>cZ땻jz;sf͆pK5WB2~$("A]eWC>X7;D3}%Q=$xXVk2H)|0tmmhǧ*(A2l(񕏻2Z0HXV GƼKIQI>$HLaS?( |ƅ/-3<;0/UܕU|}$]JƜ}a L$'>Y8i! `H-4C@Laz|.-[5Y+&gWP. Dx /"Z*Lo5Y2HX^~ug4cb/!թFG-H喏;O剄}ܸ.۱S#on&ew`(srV;$9C~5x2GN&)Ms~RPr'Af}.k+~5yu 9b)_a <= ѳgeGGjw.ߏ&{38ZC vo/i1;߭~Iዉ7:dߕ" >Z1;QGmy B 5 ;IoXak60uSZi|T _` 1I$-5(2]qOog~Xq; .-'"Ԍ9uٺ]ܺ5!a#'Bչ BYB5!듸tswA_s/er~~E;wM~ gzӿg;ݢ}:UfmW%^y;?iPaB+_ >l7߼NMe4:抑79ߥ>Ȼ#SklS~9Žl<_lj2N ?jB_494#񋆅vCu$dԭV^_J cYVu+SXmkӫv5<mгo<+w_B-Kz_C)#>sm.$yb}WUʎ st[uKQ2$B>柣M>tA%[vV{&A. ք vA}=q~ᇯtg3]Sg6j*u{^ߤw_úm(- ^IlmRdo5yrgwJ?1NiO$g 0ukWA9Æ 1ٿGǹ-55~S rn 5 t`r}oc Hf}LA?q}&2Z( 6rA%rRJH|~Iߔ3~-_Y{lC߿O^ wNrؒb'ʬSk>=9m^W&8g$gzBl,h6c<r*XߵW>?rȉB2!kBa&`M!B !0XBa&kB! ք`M!B5!0XBa&`M! քB !0XB5!kBa>f+ެ!n]K'4pF]#8orgr`-4 dWݯ7ol\G3 4wFUaf;(łՖA$ ڐesWr`-vG LY!2^>>0DVoi|S]ڨg?kɲv&N_a - 7 f@ q/|6< ]حqT9} jAjT3ifg?IH_`vz' ۗ"Xz \'pCxj\ܶ!4eknK76U;x3x +^έ~Y}حl:Z= wc,1 )(&; < 2`o^M@9-cuMD]an&W 'YU韨_OP ;}3}Lu4q7hCmC[7Yc 6ط|Uuflqdk?I Z$ }Sɉ \MC|ﮃV + 6oІc9|Ls_Ed?I4YM*# ` AZ  b{-"#'x}Ll9$:f S|[>~>qK'O?qOo>LBf߁̡7X&2O*ڧl+̖!z2llfu}uߓ#5ڟ* 8fcf$c{~I>'4x+}C]!"C,o~AHv7ϳهZavvs9ms}@`1}?u{~u]~@~6vu=MOG|~'EWok_]׺^߾]גuVm%?:׌8t"mrkP\ʻe"_^u߳Faeƾ~3]Erc~ɾ>\ߏq}+?t]CWWޖyMoûN'KC>y}v_=sǽXn5}ږ٪]%_xݮi=N}{ '=.=`}n[un@s_K{\ѹ'vczW_lno+⡮=n@{=n){~?g9{U='%@jΝZnAkw/id˾6ٟ`[OF8Xt/cqsMP(9=NcGӼ9mԚ 6 `0 ?\gbHK"^k](p+њjR#㼿A b)Sf>`0 5S0[BJ&Ia`0 `/PH9"+`0 `&f`Rk@ϟJw `0 ðs%঒Z#P5BSznjsG^x-œ0`0 1wZdRH vѱ#d1.>6G\9t6`0 È3\FjK\Axɉ߆!KĈ`0 0`W:[G̈;.̉ :߫#GF `0z F"Oo<\ ~ N{udIT-`0 C/JzY(gz ml1SaF> `0 qRH>Ө{[FCq1N`0 8>9ZZZ,H!1ͺQ plg 2qQ򨎽@a D#,C#' $DAw!baY~=Lt`0 ػw/K.% q0Q cȀ ҰD9"Shɠ8o"s!V]Ķ#zH4_m3?Kbѐ!d2"O=y3 `0@MM K,+_ #!c!LPЏ(%(YMdn\vT@Ïc@G@$749j~ŶL$K%p~?? Po~47\+W}s0 `wG?| _K=Ø1cFdݖ@* A(@Xte9$?cs4@෼XgC%Hdm?~2E8A*DmA#x4;k@Fy#iȣ>o~oPVVf`0 ŋsw ZS]]׿uOGlW3%N";WdWіGO#wu,pM XuO G8Z=C\?yt:?WUJJJU`0 aضu6 ]j{Ǐz,u:ӯ~%Mw"'(HFJ@q1D;7}`0 a>F8ι#`^h$jqPVIvOG(IFڳb_}o@h qh 8=*D.2n&oQ__o`0 ęgY[u$Ⱦ V5:ݍsXnьoYu![\*Z}1Z*ͤtzhNQFFzk8ŢEWBccZ `0 gU `B >fJwoJx%s bLILOho7S(YHG4zXkrboѨېBR˸0@y߃eݴdG6 /*JKK͕`0 aL<_|ǔ+5tM#fś\K?w'ɓQg'sAT(ŏZ[D+hٴ'vR:@QdbCc~^N`0 adqqFlK~<5㱕VG^7P{B@EєBJ(쩤jp#?DY_Ab0 `=t/U#Bg;Hz8zCn"G~`0 `SJ W9B)f+xNG-2v1uk}Y`0 0<(`LAKjW3aⰣ"yDDe_ kȈ`0 h^VF^vď7u}mg`0 }9Lz61hw{z4yz߈`0 CW9@l G"{T?%ng+9`0 weU|Snw9y=v6?a0 `x_"lQqXs1120 D#`0 (Zk[hg~v}FjwBdDRw 1 `0GQ`L11L ct<}3A`0 w;Z *GXA+^o05"*ALk  `0K*-Jd2Cp@5  q0rH>68P(8`0 @ M{iMgg'J)C\:~Lag8mh ffI*"NŰmۜH`0 !$J+"d2z=cy819r@!TʜD`0 TZ#A4g2^ef}d_K[qQTLtOo"`0 Gkù}hDܣL_pPSp]kZѶJ&`0 p,ф",d˖-KD"C*Xx1(FFN`%Zav!d(FN9ʶ̲,]vq`J&NH`1 `0fiδ=XJI]]O<wqH={ Q2uib̘~42Ӧ)Dlfٲe_租~:GNe`0 a()QP)ҥK?N,C)S\?v):ep~c;58#޲,¡y`hǶm?0'b<#Y&k(Bo|~^S_ `0N0.tz\߿x<΄ z 93HӸn氎y¶l4=Clɯ~(oò,֦<ص3+>Ū5o\BN(A$~wֺw=9N#Da?k>tb~_]I:^x3_x|&繗̂' ,) /$ݸܴ!zC_? '{ pO~ R hooܜ9H2$LAKJDbh<{N `0hΐv\lF dS3d*ɮݻnYk׭% go?>H)~/O0c4Ι3H8̿~|ʫ9eZk^_6׍0X4KoƎݻo8}{IRU\ye}H ! Mto8<FQ(Zk"H^wxp]5kֱeV$A#EgE Eƌ)e L>-ke0 𮤨Q0[ Zq4{7x#?8W]uUUU(رc<^{-@KLeAmt$\qBxe[K(’LDZI$D9A@";j"] anm8)--%> .ò,J/_8fAkc`˦mt&R(4Rb8%%SK rY4;w/o0~NɄ;bTS__*ZoG>k"`ܹ`0 h!>R!BݏuLW_~;Z3k,ϟϊ+7n}fsp}3n~M۷/onp9goya݆fTϫWH&4~gv.GnTW\ gJYYg}6?<>h~-_L&E]Dii S+Ҳ2Z[Zݽ%庠q,ƔSRR´)3DlbiIDFӱi+[$2a8>Əɷ=DN(馛,3g|篿:wqt ٴir m裏2gs  p" 5X>k'TRڏ+H&XoEEE,Xpϥ^œ9s8I7a̙} X$Ν q)'qYgLd0k ҙ K.+*`ʄIXRrUb,Ņ;g.Lip YV%FbۭOT*߿]t-꓆W)E4=8qZ0ÉAx׿C(p̚5Ӧ3}tWEhii`(g}? r#d}fGaAx>܉&֬YCmm-՜vi}޽bz!Q[}c=Fc `0+_+IS 8-gn ?]%s]" Otqށ>H0'mIRi@+2<;,?MKw۴nS|WRiMuLG% P#8D)M$S ˊ 7$IR$o[COHʱT;ضm2nYE1&u9ՕA2 u]lO/"m|k_D㩧YfqWi'x&&L5\Gp% -[֚]v8c=Z#g&LG>Q! `x#.*j+-c; &UtrmƲ|:bsycƔ+]DӒQljy%/ \M+QTΙݺD 0[ȅP)ѾGen ;A΀F߃ My/SP=v,%%ED"|ݛY$ŗ_Ys@;_nm.2}Y\e޼y,[ |[?!H$ ~iӦ=DQ~ӟrEsq뭷bYA8wu?BȫmF*ʯϲ,~h"sg0 8Ӧ|-~ydz(Jd:tp~/d߻@!qIiSZ0`)?wS|+-u08(",Hw8BxFh}l"g|sX"'S6G##}AJˉZvN:i:M ƍcϞ=l޼m۶d˖-ˏ=c{dB!,X^˦M_[n=w}70~x֯_y<\|TTTp7yF 믿" /t:yXx1`0 *(ƒGt#i#pd:V[AgYItc]S|vMmCH ߑ(,cHe #> 27B"FPJB%A*Q YadgCTf=p$B$!8iYA>A.__&о~qUWpy̘1x˲={6s477# mg}۶>Ƃ <_|qرc|_*/flS۶<@UU^z)]wdժUL2 `1V: 6}Pp;!2@Q8Ah<::JnIg[ !G GcC!"9A%DAJɺӟM1'z_x)0c˖-L2%mYhQ>VqZZZZs%4:u*;v`Ϟ=;8֚ŋwmqw秭Y۶q|3A֚vl޼ `It6.Y숿-(( 2Lt`86c/ǁh4wkhmmZQH4*Tkթx lNhO;'ɩՎyDx~($|_+|E>Aﻄ\tUS.eRq i'I8! GIE#D||Hzɓ'~_>d4P\\¢K?@eAM<jkkYt)PQQپ};{8H)b=}~t-E&0?E5cƌ`0 yhc8ZSps}m/[mhV>z|ٚ˛l"CpaSJxlC#}F/@Z1h6BfUzq+-,T i8HKyxZ!B*,$)Nsg hG4un;OvEBTkd\R$ph,F:#ini~^, ̙s3f$>4hlj;vS]YǮ0E;>j<|Sbݺu,X.SqFV^wߍy<!ॗ^ʷn~jUuu5f}"/B~嗿e֚SO=_~uYbEf͚en `0 w/9?Hat4r$k%T*1A!Ĺ#5W״() x2/=z [Z6 '>H-,((-3`cL&llIAaLfLpHvlVDtl|_2xyQ IDATil $vqZ sN&LRFQOCCq}Q\\ҥK7oZkryqo~/~QVVFee%W]uWtM|{<gΏccÆ '?OS0_~9ڵk,]Ԝ'`0 rm;֧OZl|%2ImCB( VώaNϩo欄Zj5/C- Yqʄ+]IM²HȾ,i-W:dEkJ٥#cUq"|B+@))@mDzC(QJ"<2KSS3sg+&-#2dʥD"Rp8L$a‹6}t}뮻d2,\/}KB!(?<{A)]wŖ-[Xv-[n駟&HŸO'+:::oԹQ5kְ}vzVZp L>iӦOc=ƪUH|ӟĈOM3 [ofluf-}f7Q6aGnxϏWghQq#TNxҗHEHi*E m͒ %BmYtfWB+B6I>B^'V^LLH$:I& q71Өo%.\P.;LK{ 'v[_OUe%cǎ嬳b„}q=`Y_|qnF8A]~nvx ژ9s&7tSC_Wkxhnnfx= a.Ysbɒ%TWW3sLL4 f Yt){aܸq\}L<ٜ(`04B BR]ٿ`p'h!ێ.ڨ}~R9* *kKq3(+/6\GBjj;`la`g%,,[',-$HRx(4!a(T.$+Lt~ʥT tn-#Ղ]24N:Zٲs'^QO:>hEyS#!㔔.|l`0 ~O[+=nPc;3Ljp0`͏~A̎4S6.NT[ $oBI,lv8/o(^hJ CFC d Ѧ%JF~.6^@G{NH"A!0!'x;!q'-{%y%C&$1QkvoyPt*ESC#_|13fL%a0 Zg֎P&B(*z1rN12X1GȒF>umi9mL[:Z :Nku:]ia逓*;ncBhMnBOu i IQZmKsʸlwe7VL[k' ߡ.揍aI:x$lK7H$B m"(-iۃp $cq > ?IDWBVQCd>EaA][D`0 û/ GPt pFD΃A+$JPWfS vƂLb:HJF)c#q%ۊs<56Z^L{J !VnilΆNRB@k@bm_OuاhMQ+md[|*TV;mY4(ј!KVsvvqTPXX`F? `08VB?n ^zDVQ5bH$>Fnb_SX"UZ!| b0MI:@٬X\a߁vkO)aS}3u%Dci/ٚ#D. 4/kOцV-)/ppZ$0EDy@89bI3,!ʶqΜXě6dƣe89mJKʨdz2 pblu|4ȰT ?a$-G:d8v67FUm^jR)O+G#XHW"@l^_hfje x25UUmd!ҝ &S;j~٣#QY 'PҦ]#E;3ʊLщ 4%q&i(Vˉ!r"-gr%8{lPdHQQ>R (..6`0NqPR_dR?Q#-۵Yz(.$%VF!W !;D* .5dGtv* cM$(!,XP ]b7va{S;mC"Vq>?"jl!u mL(SoVq7D!eў hUbGH)̎DTuV쐅*&PXX`b? `0XDH tp|x'&}>bGma:>@)IXZd4*PA*EDhj HhP,/ v)%T@Ui#=H k%ôBI]& JBؤZ7Fh/P8E}T9DQ#U1j"h!ċБ"p" m1`0 ÉGX $0|O;N\~1Omz mv6IXX,uhԂʂwf ,MۙДc3J:ᣴDjBMl>t&Joĕ$;]:3Jb\4B-5 H8D:ũa2ZT-H)B`^uڕR~3gˇN;ӧvXm5APSS\066oLSS9 `l9)*[ah8PG2qeE?}5vɱBe F#Z ӖRh!@) !j9P!A yYPV+n=맥& Ό8^č46<@nFhPʇͯpqtIK4%̞BHNmcB:()#(F:nSJ)nʢE ,d29,' <袋Xx1eQRR… 9ӏ ud24 [2Bb"d$1{ŏPA:@)5‚WԔǩoJN3D nDIngȉy4ܙ3:8 J=Cm&DXluRRA$df;&#?AȲxiAS8D(p8TS`IhBȬBXI8# u*--K.A˹ٸq#/2J)fϞ\+K(..'xn{ݻw#+z^xlق֚y1w\^}U|ߧNϟϜ9sDyy9> Xt:͵^K4F㔕n:^u&O̢E{;v0|8>sݻ95k99 mc$GCiF+8R4Q!D5! Ɋ$QN@iumTlv6" ҈@B)MiVwؼ?AՓ3FCWԂ_VpvET'!3 :C#POyI o6BZFN6ZR˗/gɒ%|3aݺu466R]][oU(,,^cΝz\q,[GoWoo駟&L믿?qnV\I&7}nvϟϯ~+jkk9䓹p۷+VdnVjkkٸq#6l`q|ͬ\D"_7rM7qWP[[R `0ޏH@:pb6_~H#)]hMɂI:3H,$Bj xWwFkMb2ZM"ў$rIf9"P(?852l&h#XNaҢCVv;y}?:|444 `ڵ\ غu+3f`ڵ_/M68< o$hNmm-#D8餓!]teŘ6myb޽yhcYGw^jjj(//ǶmN?t6n޽{KԩSinnq|ݻwsZ,`xzehrve}Gĉ{?CBWkUW]رcIӼ444|rX`7oXz5wf,[ !J)R~^:?jΝtI!xٲe oSO=+W xsS0}txضmWfԩr cziEҕ(d-iA4"Qi҂8::sd#rX R \γ¼O1$OX{i#$H$Wtxn{;d OXtR i/M*"Dywh(Lg$HXBF "[Жь\>)CŶSBXN踋D"Acc#}aΜ9l޼:hRRRB8fΜ9lڴ{r3qDJKK8q"o&\s5"0n80o6|H$bA`x.(BjK|W~F;r)n (zsq)%O>,x9&G:H$9wY$S)\Ͷ/3۰r#'JJ)RZht~ SM)#0JZޒ٩4B2Gqo}L{ރf"@"QZIرhNv &-a@[XFCmEp=PlL?"I )]$P" __P¿~^JOg "sT v!BY4FʳAXh- m 쨇& P(}bХ,ZpW]ϧL”)Sz|vgk}B~m={6g… =UqWݤI4iRϪOO6w`0}>/@`Kk۳ڙ5' YP RV:*N?/qLjƽߌf().ʅ}E$_`=s\N: )%wkQZR‡.[̮=ٶs' ?p!Zkm؀ ϛǪ7d=$Οw ?p^r)r@Oq9i+:*2К6RlEܿȄ\gՄ> E"T9i2i1v6 B2;вa_"ell H'Бq‹#x~vj9`bD3U;٬ `0 Dh@`C$&–gtsY팉lnvҶΙ}*ΚŶZ6o֡_b7m{?XĢ1?ٺc޽(X;|_x4ֶ6|ǗV|<p[_= V)B3H$ + ӹFTRY4Ӯs59Pٔ!֌VYZPZ݀<^PZRHiM{{ M . Hd Btv#NbK|ߥi)#V8 P%Z@!qs7 at*[t))cAS}n}:o_؂#6>kjHSl Bo줦r,W.ZD2v^_~PTXm睏@]˹]Zصgdyܳ_79| wm8i(u:¨}sJohh@jApNXJ3<.n{6d, A{2q)kA@BI\vT2, $Zkr"eܴ C " ddY,b$ G94{9^YfYC#a$u$X[;x?@.'8\u\Ɏnw|;`4S(ҿ\.-00} IDATeO¶6٫^o__$bqx%q͉<9 1IbfY VQl*Kz+ #FʜG3! _pBw(3Sd\I4#?ZUJ=tnK~\\qB)C*Q.t7U1T鰳(gX,r68BN!qkYRe94ghLZ˯ҵa1 RJJ2V`|>NHretR<cXd _- L$Ak_T:IrB[| +&N1hmƁR`@0\6Κgx:(x|X$ǯ{Jg]:aQ+aWp {ҼeaƉT  -BOH0@CEJ bXf" |P 4o0nQG۱'8\X|{,~: Ȥd֋.--eX\a; qeT:z^Je"W  5BK3 @@"hM,CFE ҥޡxZHQGt>Iw3JPa*}dyDf12Rpb(EBH „fƩy$]."!"$b)|J.B 6$+'* *XbX,) R}[:mBĜ ?RɎ!%Cb')ce1a5E@ \ (\ S. (s顄@ PR!BblH>ڄ4|&BIǹO7]8\@ ^1xE 4~508FZ`t1:A`*9 Zz@,b, 6'g0nۜz SAW߀$gK-1!avP6^~I~~\SƠDc\?"s` PJB!+k iR R@`PKF2Ē w_ .HCK=ۯ54]6=  +$tbX,3JizeիȍnB^`2 &00At%5EDJ};h(hn |6a蔿abݿ R T(pBAPHE(QQ/@\)+&qIA"*;P`#,bD;4>RkN:;Ep! /!_ ~hF(4IFŒdw(y>|@PrCGOQ* wA)aGBJ@{4."AB:eM]r!]}M0Nr F",1\))C!@p"bX,L3$Zs2aRS{9OncJgi!CXK\]cBRjՅ5A25Fc`_K3"` KaCm݂UZKdࡴF|Hq4HG"|XBNbDWP*c4!nm7ûI1@GhjŒ/#)v hn-^#_lvv!Q\)JBP$ER-H#F:$$k$2 <M0T (gGY(ʮM]:ʪ6ͿbF+}M ۰ư!ʶ9I`KC,@(9c![0"gXs'A[-hbX,J#Bad.w!E~3F}Oc<}9\!aVɛ `NOkͿVn7xp&Ȧe}=Gns!XP 0(iݎ(xA3h3QuwzU&1{Gav }GP*A:^&S)RȊ#W*Q"8Υ9Ce.YIzK%Gh?yDb^j)=zG'&2,2 -a4v]j {' +CQx_#!`N2z/b0P)9ەr Ws|%}Qe('nnX,ؾk'sϝ1==dR)dBJIbTbļٳq]\>Oj35aY!ANbg͚Bph9\H6F`<M)I_ATdz:ZH"in>̊׊XD6A]:#*A !*!Xb@.6Om tě DDp(umxt=yB0]_ " J9Xc(3>zs@ d3tS}pͿo7b2V#P@0aG5|{s]-b'x>{B8opz\'6obyx'?QWSCmM |ӛ 'N3˱f5;?G7nx-dGG͟dάYd?I:fppW]^qI|.oyY4ĩq| q`A;@@Fqdc4}jؾ{Shew T d~BRo0PĉF BW)iK_rQ:4A%ߣ* RkwO)0EMQT m?ܲY2ƅ[#F+B,b95\CӂnI]q67b ndn:Zk9Wz$w^U_Ï?`(˼g?1~߱m>_gg!|g|Ow}/b;v۾ˊv>w)%Rnɏ(;8,Ax(e'zE}2̙HHG o`211m$e_k`KhLj ĻyRz@bHs@EюQ(y "(S2 g= 1ZVeÖH߼,ɏ&0R "N7큷},v ;~dbX,ʔ *usNLT)S.bmM{ȡ%qa,x#5=\4ħ%\>~{~_oe}Ho͍EpݕW=w.CcoΎR,ٳ?VT.Fin'3Cd83g9=Y sAwo|JbXV" KJɯ~w[Zkr%\B8kdxj;"cvʗo4A e}()){| s/}o~|_DT:"H1bǍWH"Hʝye_%a,UbLhM?, B6ҿ\!5RJ8N!Dh(J%||wHt"IcBx+(=PNPAMa$Fx8ț/'$ LH_ { |''=SU/Du9DnCCC0;w,b~"p>A1Bt~-*HWSχ֍p";>P-s2>`ޜ◻|I!"^WpɚZm>y_+⣟4?8H*sK,k߾|Ho?W| x^{oE>ap:cPNg=.p]>>qBb!>ZoZyW1գ\:,o;:!4c%SyQ*/4I@"|5/P$sG#p>2tF(Fcu11!** : 7.Pĭ] Ǡy_5o +=[* ?vcF/=ᔸm;asn> ZabL0z[OH} Y%v:7]:v%4O ,q@5|AlGhM:ujkjhnlEmm,ۆR^pȎÕ/a$5kp*1g,Xln_q׭mjkyWfY`ox+Oٜ4>icpk2#BTJ{lߟgg% }PB83] yria@/Oψa%WkE`HGkt1t2ÜTvz(gW0: aus}YƆj;50YNj_J#0\] }=~zG?cWR_\?`{<tzPn '9 NËgbX,߾x2xpU?@zɢ *@QHW/]#DhYbmUiK  <74mB<~!RH }è*+h Bo!4"xA@m.u 3昌1 8 =;Dd! 6=V,6$=C6|;w/|8q\ &  ?}p;B[a/2t+|%p g"?b;[0|3\-x` o bX*dZZq1I>@v5ϟ_Klwy@k A`ŠYG[!p,0alGA$9#?/| Tͯ[$@yCk͓ L[opDoS/bX,i 8"Ws #YiHaZȗ 3>kdmކ? -㡔"H0wv a~0+Î"D\vk2~1AX^0I"F>CʊwMk `87BטlJ"#5 (HV"ئ6g7R"AH R5,[T*}J$v =@9/]=o=<A_e?!)S)bX*F,"ڀ0}&k1zC48J9t}+ ' ye3|HpЀ4t@,hVHZ*nr'W.D0h'(" =$DHA Re+Ѡ5B@DE%m/Yi85D"3*>mfJU;.aq=< |P@Ea0LMIX3 J|Ax:X3g糢bXNNe&&2pVX!xH%/]a__l"ق(_|"7nY p ?#%B^Gf"A(FBO@ͣ<#0㑎Ccu)h~KL:x%}`v~"Df<?>.xpdkĎ{èʅvX,rJ,\iZ>!RHB?0\[nNz~VX31 }I` Z>AǸ IDATS.+E @r7HvR8XG92ͭ|￾N$"4rTo4%T8*f `忄6&X#H*bc~nSIV=4XN9agX,$,o"=-f6&2:fzCDb1E<VSZV AA>x+D r{@!R>wQW_O&fcލ$8dE+bܱu*'ʱ='j&Tr@[aX,)} 8LUx$Eg+Dμ9?VHS&"}::;Q.H$\qe\b2 jx+fz1\fbX,a`$'L+1NȉN'd2fX񅜻۶ӱu|9sZillxΊ]aF_,ѫ}nX,˩Xi0'X5kBۛ>Oqv"3H$B]]d֭c huI&kblD?޸_SmX,˩#om㉆eh[f;Y{} rP*bRÛ ;>Vz=aW7owÁ3AR^|0ƎbX,þuםtXcr k1/DؼpiX,bFWSW&csOu3^MSmbX,ezp0"qD81:QEu[SLNx蘑YbX,99ς8s5$jBd0udRi>ߋtvvVJ:a8SB.ܻW9'WYeO)bX,˙0'0 l!ڨ6%p-rQېRK_G\ g {>A@?W^O~DPdŲsyՋP,rO R+=]aÓؽ=\{|Ϯ}{ɤӼu6n=)bX,asi j}\VS uV/_A.BȯJ*1$qݰsfJ]g΁6m;Jؗ!+<ؽl Zk;bX, 5M~W|X!_~,2׵x叛y%ݯa~?:elw)%ݽ/Zy ^LKc#v+#,w.Yt)Wb(_x1vO^|,?,;k.< mHs]/y L!\!9w/HΛG]Ci9(bX,ecL@T?Ae6!u M/\P֎$s>KFAss3{^Bm)%s̡n:;;BDhoogǎ,_ 6xbvMTBAmm--˗WB-[(bo#VZE:7(sP__φ k?V˗/ghhu1{l"bc֭UcCgg'bƍؼy3s\pGfU`˖-Xkײ~ FFFφ|>r99ٶmra</@\~:6mĪUXf Y+WZqg1kגJT*faݺuY\.G&!|߯V|<i0hHNl!BAxEӧif2555\p7AqFV\Y.Fym Qbq={vc1z,Ї^.\HchooCKK 7ofUC wfɒ%J%J$ $,Y$%!lBGGp'֚&֮][WUuUlyٳgOuB>buos\ux1BPז-[ظqcul A81fݺu>H$BJ^0ƐfT+駟f(L&C,cxx%KT=;vI3d|I8s=c=ܹsd2=(M&,ky ߚpL(sLUW]!\h5}}}̚5F;v*> w簾s=rLww7xgyO\·(cRbuomme$^R̚5qߊ*<2T*裏L&YbZk(/-{ndhhXdhh2bZk-[ƃ>H<Rލ]vUCӡ󪻻 1|;IC*/ס/z{{RpwH{rԃ#@i{c-c}1rƵS!<' F"/{<-tñ,gljD"twwcZ3::ZEQ۫lXt)˖-cxx#=AH$hiisa۶mWcc=DQ"Cfq,YB{{;a5Rj؄e !HRtttpA~zzz0Ơ"Ū~gg's-"JUCkkkYbB8k]3fGGG^fJ\lAFGGN2tttÓO>Icc#D+Yn]H<(hrl^8@6eǎ477Ƃ سgOU$J)iooc tvvVf|߯>KOO]]]477ׇ뺜s9\t:ڵ*/^q8x Oƍ՜#y˱MsV3_NiB(z[~_m[MkַѵܿL*c`V]Q9`uR[:tGq9х:'?Ϛ[cpkj'ʹdH$444PWW6$t4ϯȅH)d2d2L&C*C&<˖-#WzڷZSj(Hcc#DVWJI*h4J:T*EGg;MW}31ǰ{< .n-q8)@>7K.\?;{>̚S,ywQ\~fvWҪWDH$!@1ͽFbljNq;v8k؎ c#0U @FB%ԥ3+-]ie6sgs=F% *`Z-T_~FNŢXRjv7XxL@P`&l $@7@h\;fNh7Ң_? YUTm˞7Ja[c~)j2wė51oh jV˄Q;NT~>ߋ΍DEWx=>YUQjlJlھNDIi+κ*^LQ9]-@']_x%:=J"3~J0K{c9EkĬH<-K+1[4[/ݤ1c9s UU}r,=L|t E#U5o,K棵+ UX~UV W"[L@ @w*hQqj, ?jC➸FK*fC} Eho[NhdNb\Ǹ}a Kfg܅hZVB5,3YRXNϨn9粪nҔֺiBgVȂV@ =ҥKڗЀe<<<I3WE+:镜fb֠ L2ϟW2s2]@\0aT_AP@A̞<{B$"FPԀh`TsO΂ zQɓŰaÈ9ɞ={ aŊN헔lٲ:{5h@ X}x@T$z[ ]a Oh0?xzxì~n`ijnB#kgn:**z~󣟢5H$\ Q+;{,ujeƍ?7XhQ۷ .ń D 1ͬ_r͛Lj#Ġ"ׯ_~444^sӦM=złMMMddd0`yħ\tM5+9wG!44iӦ{ '77Ǐ$Ŷmۨ⮻j#cD/),,d˖-p-%f7R^^mFhhh}322nw e֬YRP\+2RwOhH+I2z}wokid >^ MlBkܥz qVDH.Co _^mرcOyP(ѣGkӇb… zϦM8q7ϋAZ[r}0j IDAT{???UV+t7[n.]СCC1dyw)..̙3Ĉwb/v%dÆ t:;FVV=X$e]je߾}\x^`ni4 :'NȎ;馛EEE!L&RSSIIIAQUUł իWS[[ @^^^;bZʲWr+;;Eˍ5+*ZUvaJ  qwzԾDuצ###aљSҦ/W"Do xnfF#>3|p{[YyG1LvMJJ qa;Fdd$%%%vxu/r)fΜ)f{?sO?eϞ=$&&yY777yΞ=ƍׯfPSUooo{ubG}}}+8 :xjٺ:onnnnp!La\ FM7İa兢(vaFdddg];wd޽h)))?FUU%Wh;hnn_/zj bʠqWm EoڋSqڙAj/җ} \Nll,,ZOOOaE@@qqV+&Lc׮]`NgnUU%--{rE1p=DQHLLdΝ={.KKKdѢE3i$BCCϐbbbfӦMrΞ=K```DǩmWO$#00 څJfF^{ wyϸqx'$I$&&ܴgElG}KgE+Cdddn:~AP''|Bpp0w$[RWWEm h뮻h#V^^{aРAmVKvNʲܮСCDID|||9pQMnn.,j1cSpYrm6aZ^^{& f$88*jkk+\/%Ib ///1Dڋ^DնY`0`2쿅TUeƌzthHgd,۾دm:^.ua:KFji=Պ਩p匀dY fBBBQ~%ZmU;p=Ӛ4|#xl L&t:wqoү_?/_ΦM8|pߟV.eee|>'p NeV#j|||:\:Y炛 h̾V+G7$&Tz+uHһEYa1],N.@ u̘1SNG} FÁPU;Ӿ@ te`V%kʾ'+][fސw!HیO>$۶m#''Y0`'""B @ < q̸$ԪT4k8\$1!DՑ;tBҝhHO|$Gk8@ www-[Ʋeˀ+>Gy~N" ;n+vo7j`? e9=gjuz-RULl{N;ix;R񱧋+@  ^@X6&j^ E_S$dB=UbR\66MWU,b6|ƎUvs.NZ]y7:68^oC1oAI @ iu")-=*DxH̍0p&:CEb#E Z^5/2ڭ( OϿ\ǤXV|LþaQ]_7CA"ܽ@" :U+DQHGqc_YEuھuӨV~|w[ },3?J "q؝ك WٲZL3/44ki-KN)2O`0+[ld2 !K͛ٶmwhJ9BEE߾};/^ o`_ff&֭cƍ9s͛7¦M8~03GUEQLgA̋0[ƫSk(0Q<2o7yz,*6Ox{y3&v4g _Hww~u+ٴs$7F Vˆd@#w!m;_-Q[!^8Mmm-'NdvI8x0lεiCvv.SPPHNI@"'طnnn:NޙTVV髰<TVVR__OayΞoӦ|n.˩Sg8{u752e [njN@@55.NN8ѣGinnT}*Brr2/[o%00;w( zsA ÷6… 6m}{FF.\@UUmODvvv'332-BQEQͥq+**HOOjbX=<q]3ݻKpB Eyl2vm&|mqovSNn?Ψh^:5T:3u I5u"=cX6{+Ͻٌb&~x,QszgK; /DU!kkBgZ23ٵkPTTW_R5[lI-=\p‘#9xfH=յ^SQQɘ1={55\XܦMCC#_ &f8~~~RTTƈQ $${sb4ٰa!!!YEQؿ?_UUYn֭[8ppn5}}}`TVV+׳a\:\spp0ϟgժUh48}4 9tϟM6=dffhxweS\\LQQ7od|}}裏hlld͚5zZgU%Ibk.HMMZP^^ξ}nso$233:u*VٌbaժU466r)>L~~>۶m#00Wjl޼OOO233).. 'h4?~pIJKKٴi~~~|(¿/z=deeٿﵵqA hnnY)((@ӱj*1. ##t:%%%,_^=--dC fT,/'LXL ]uXVc[e Ye#)ws-w0kpsgΜp1V# DFSRQ۹y"LfUF|w jFAg ^)BzT3ĉ$w V' .^ر '++ӧk{~B󣠠z|}}ڴ1>[///UU:t(,YZz=c͚5v1Ǹq󣪪 ٌ(EXX`䶊H¬Y(,,˫ScJQW<3f Oܹs(Zh$)) ;wbŊb2$ bXHJJ" De2dhZ{\ll+=uuuhZt:]﷢(9r+W̙3C{FG}DTTC ȑ#( X,xw/#d<>7='ʗ~iLx?ͮA|rҋڠ!ϖT\HĉS963qXLfGTTVBƩln_ۿ$LݴnO LwgKZow}4:0:T6EU+<551cl!88MŊ;s$6vᎻ{;2ztÆ _~X, ,˜?ӧO3c D$$77#F0vX N#77XBBB+IDUU.]ݝjȑ#4440b$IСC9s Ν#..FoFCVVTVVrM7ѯ_?V+ <???EaРANl DDDɀˣyrss)..fܹ7\DSS兗Z<1L>"Ei|K@@V` ѣGijj"""BqEQ(// ((BHHCLJCRZZJDD???4  ==Y5k^b.V%:H>Lii)K,UUpUUU;01X]I}}RԈ~OlT7eAq̍{)55'*hydK(UwE%MF AQ/QTV˜x.Vs4;!&" ݝil۷|]/hZDkD̘@`ZA@P i=`\Cf3+Wo͍#Fl޼EQgلA|#k GP˲F w6bȸktWcJMRFJxP[\^||l1ͬIڄgJ6}W}AQM*^]&]Qc;+F׃X@$ZK 5Fq=6rH10אŋc4h4"K#(wSxmF VUbPCL=&Յ ;7z'K򿥳|ȲfISC"'?(.HFWE, }bן+\+|ȶp^*I١*H̗g1h4K]W[=^^@kRU/RzWvIb"E @{$IET22 TE\:nD3:#(6XK @ ^BB r/(..;4{ Y^ԫх':jEhWWWEP @ h5!%Iulj_v g3vYqA @ W"(h$Nl$Ug"8N{BxYEO.8"@ \mI*$#+*PN XNP֓!3vCبN[O ^yFD@ V$J 2d@ Έ IDATޭJ-g ƿ6#uv[:)Bz**N^B@ \*@T4HhA "?FoC\]hUoлZ귻% E 9UU @ Ć:H-m¥٩ղI"MWE #9;nȟqEGw!aAACł`w@ 'zL *|GQ ~"EuvpWk#:NTO@ ΑZE*=8[ҝpIRkCiq%@E@ ڛ *uU]+>Xˡ]$;P:П#@ *N~ȗ1,jhh#!L_p#m߮?葢pĩ$@ 8l6l[NVQ'E"P̊ď7ƬjzܛRVmGTˁSv}^Ρx0zq!.@ n$YFJRRôZZH/&J^Jcl|=Fk{$I?if68.BҲu!I?3?Kq]ΛƃխԫΡO&@ UYU%9@HpsT36WlmR-:ڽy}fW}F[yG?c\^_PTD1wݽQqh[sA'Bđ-gtpW#r<@ .Z[3xq-"oy/ӋK:ޝfԭ.KFǾ4۟dK5I㇑eNޛd75PY](,I?M_ F˘x$IbҘqٺF4M'ܑ.wɐ3l}>"@ Z4Sr~kxqkn$ĝg=XDRF /NKva^>ddC̞4ww'2sTGeY|z3udt:->>]x=e YִQHVl1܌,Ih5ZTh2VŊ\' vվKpUCGA)._{>@ 8[zZr@$ dIm~̛\Z-ob* ˶M.UUJ+ٛ~M!!nÇcpͧxPVQƑ ^xzz0-Ϻ_;ԝ bZ1M̛:ϿX̉Hޓ˜xZ,ٲĉ|k'OMdt@4Fm8bJ @ J~ 'ЍA-!Kp^˟ҽl%5<Ȧ۪^e*ݬ( 5(ʭs0l?C'#?N3"2XFSR^JNI&%L`d"&r8Gh6ؑY,V _|;LzqĎ[ cm!zp.sU$]q:UT]zO @ H;/ZEk V˯R}qw%ՉrUUIDVEUhq3b$F& &52*X,t:n_ YX-XTU[d^-6E3cU,X,Tf#:~2Vju R5t^J8OHy @ X2-I貃FBG7n:hjvP1mUCYrTx\iqł}NǫOg!WIB&$䎨"K] @p*lbƔ0,Zz&܁>nwч!(<}88(D/v@ f$Ih%-bU$u`tR8Dlw:7pСGh @ A"!*r˂'ƲkO{9%pg?+ԥ+:.&6@ 7.eYBV$G fWדq3J^dFH^˕{*@ [t=묑M!>oӗތ~D@ (- ypMBz7O±gǩ7c+]z}$ć@ Qل !:wW~>ƴ7tևt@@ HWg`8΅ Yεq]O :=Z]b@ C !ŵtז9#Q6P[[KQQQMMMa0jx())q9filltxJJKKmohh@ 4b3evcou}OK"Z y\I֭c֬Ydddطg̙ڵ˾… L6+WΝ;ףc>cرIJJ";;ۡEga…m`̜92q@-6l"h2~HvV8z.>eq?1V%55վB$KTYt)eLss3օ*f[9y}ɓ'e'`Xhnnbtz+Ҧjl6ۏvWjO~W#US_}Z(opu>,WEX[D CZzD!.J\ԳqC:k'J"##UU)--`mFdd$ ,/_?n*))ᩧ;;g?O@@V`0Œ%KHNN`ٲeX͛7wz:GꫯvfΝX[n|>#^{7rmQYY s曹xx ށ+ć|>]~NjD } ᫳dUh";g,tdnv<"}?Uu rpE{Gii)/&cǎk..\xyb/ aaaw^x z)Cbb"QQQ|bFUUwqeeeKbZyG8}t34*|{?fΝmh4pRQQ9s(**ghvMAAᇜ8q7yf4hx VH;y2oj h~&Rj lCelkl4hm7vmPg/vvJ3^_WUmBh󬴊,y\, 45e UUUIBuLQBwϻs f-mh4thdM7B~:th5>!}%Dz:N^!r뭷lxb/EQfΜf^x|'ߟ,y6l~;|Mؽ{7׳`ydYc466RWWԩSwʕ+g?O`` /rsVˋ/HLL )))g?cϞ=԰vZׯ)))X,233 gڵ|L>]<@p|ǡ_c`ֻWؑg3Ǽ ރ5pӇCH+ FwQ~Ѷwaԛ,0/߶ؿ4}Wwwᖏ!~|yl-L~ m; MX3ޱ7\ b[)[7qsԝc| `;'xqϻ#K'MhNF eł8Dg_!4.!}B#F.]D~~>[no͍sAmF`` Cmc1a0GMzzziG5իW??WZE~~>?M466RQQAii)'O&((vݻ… ˔)SSH 7I] 6cO۷Ep}NVj={`0Cq=xŸ‘ᩉpg6OHYr.> ӣku&zϵGPRokZ*|rz !{`C|9sĖr V>e?}k$KHV+AQ/h0I|IIC/ѩxTʛ;O1* y0zxw|;yлjh["łޓ2[#*VtZ-I$sCUU dMC$ VŊ$In(FCLp|}PUl'Zdv^ѓ.O?ĉ,^7x7:$$I%KC|}}FMMMWɺuػw/l۶ `N;d~ӟkq9$IBeTUeݝx -nl9 fwXt-i^m߄0Cř=&+-َ@Lm ( _$1o N6̕<5| #c r:0em/[,r?Yp4 T$st[ fDEF+)R'FelۀlǞŪXuR|Yf2yvG#E0;Ĺl% ɗu&ĸ%ªXb՗k#jp$MM̟23k?u6qbTs ;I,&%b#IUܼF]n%/EiVN1~T"On XP]UB_[.\G}DXX]hz?%K؍h4>}J~_1rH =mGmmmsrry'>}:wӦM#%%KիWsYȑ#=CfΜɨQX`7n{???"""Oqwwgȑ)$IN'@?m{<O%]nk*7" v&6^ 7  %keжغXUW2n~o9<[ռ`d< W̉6@+m`j[(e,Ue1,뀘pp?K+vP/+9 {9Tc\"TU%t͵7 :vyHg8ͦ΍ ` b|7h2ۿA/O6|ΉSY ktnL=|'hljbgRN̦2~_32:a#?_d6}.0l:#YǑ%ݰ:{ou~uߜp${rxX%>>nV{[EQ0 mªZ5j{>~]^f# ۷s-SOq}a2x衇6}\777F#F?񏸻h"z!&M_|ᶻׂ hll ロB x QPmyڶz.z~'<F֞b<|u&i{``(zEfkK1lO@0ÍYfu6g|'56X ?f91_qoX6@"Ys&kQ$njdD,j Ce\@+cm^ j|Q:ޤWFSXϥKΛn勝[9q*Q1,>O/;NDž垼==B~\`ľ'J3@ sJj`9`u-}32A1vAO0yN^i$elLLNfʋItJ#oee@(g.BytI+,"@ K!_jkzs׭Dqwֺx%?MH_NCdKo|JGH߼+)N%m @ j!‚trDFoSG{(֐܌Aa("867 PJ@ O%$=*(=USdk ɻ]ɲ]ʯ[Va+"VDf-@ A"( 3Ϣ-a^>7tahK_(ڊ@ AH 5Q)?1YqJ)m5$RKT@ Kd%}?y^ml^E+"X'B?@ SK%lʍl a"%pɒX-R@ 'cs~ ƘktMʏ,e )n!NJB@ L^ )W !ؐ%5D@ `QdD6FGG]zaז`0nݺBKN9uTO<ɹs8^|{`6WoyGDD;<9;,,K. ATs?]$))dkRK⫐=z-Z H[Ceb޼yPnJӦMY`s̛7&Md: o&=zGtL0LݻoooMV`00u\Nȑ#0|ڷoٳ4h=z %%uѤIfΜIǎs7nܠUV?&ضjՊve;ߟvک=~'ҥKqiO=ҥ ͚5˓"d1L|駴iӆo>}0zhUh_f -[dΜ9+,[,[[Oۛ?d0`L{w>O曧^OJJ ݻw̞=۫mJɓҥ _5M4!00|SiԨY>kƌ3wРAtڕ=zеkW8`g900??'n7Lo9*>!!!ԫWO>O?f͚qyzȠAhРAy૯R[nlْ[ne_7oN^%իWKz;v,m۶UZlĉ1b>>><|7oV!))$>~̙3֭[3{l^{5m\דСCy})4i'|m &o3l0xBWśx-ZD`` z}t((پ&33Lfr#e֐G #Vܸdf\/׊%RBRJIΝiԨ&M`믔)S 6fUk׮xbvܩ~<ˉCժpBUʊ+عs'-[D0qDV\ɶm1b'Nv\ӦM9vǎĉ/_^+xs|Oz='k׮U-'۷oWWܯ\BPP>dܾ֭}E @rr2DEEh"N}F/M6k.vŞ={,iqqq|g7.1}tz3r]~g;s27sN֯_OPPCŋR ǎcϞ=_\N>Ν; dϞ=,]EA닢(İj*U茌dƍlݺu-[Ν;ՏV%==~s;w.|_]|3e~w>㏜}:;wd޽C>}5k[=zooo{٧)SȩSR 'O͍Çm߾+W)&7n`ѢE9rݻwvZ֯_yApp0iii:tWeE#GҺukjժ9s&}6w%119񇐺*>d,YFÑ#Gp .$!!x?nxsq͚5lڴ;v`28y$6l`ݺuO2 $\XD(R"t)7ԋYlHXD :RPc7-[F@@#G͍-[N8~8mڴ!""Wҽ{wBBB3gF$~G&O̵k̄M61p@n߾{wmk׮,\gggSNѠA՚RZl+yj^z]eft:;vTI&Vݻw~z?~>www3%???Ufm6bcciݺu{<|>E=-*--k׮p׮]oUgcǎUsOOO:wʕ+TjHLL^f)U[lRJf1yd^z%t:L&.\࣏>b˖-އ>|eJղb w,glٲ *d7˗W-$&&-n3P///Ο?͛7Qx];+еkWTٳg|2$ѿwν{e'Nп틯o\HTG*K`Q|U[ b%NMKdRpψ@ )9 k+kynxUGr9*QYBבLYPW+"YyhR0b&Lٳg$I]߾};δiڵ+:u̯/uaϞ=5 iӦ_ꫯRn]Nʆ >jOg[)y&gϞgϞ[on:֭ kO"))3i$ڴiCXX,˲jf…Ӹqc>s,Y$I̛7jժѮ];fΜɲe QW.Xd &MÃ;vފ+6mZ@&NζHi 7s˴dϟ?ŋӥKdYf;꾎9ɏ?իCʃڵ+۶m_~^:Je9vFm۶*888ɐ!CP˗f֭Kxx8ڵCebcc)W9*T}}}駟ҥ 2욭ϋL6;wgHعs'&M⧟~ʶ 'Nd̘1̜9{1}tΝ/uƆ4g jժ9rWWW,Yŋ)]4ӧOaÆOsÇ?~&55DΞ=[o?L\\֖'+W&$$5kPvmNܻwC2bzꥺe2m4^z%:t耯/͚5 EQ]bEh׮3f૯Ν;TXYfQJǡL24m0ydUzۈ#puu%!!AiZjԨ?Lrr2dԭ[ӥK߃3gRn]ç~Jݺut;vzꩫO_gժUl޼5j0n88|6Zh:$s`ȑ#fȲ,f%''~/9wԮ][H݂1LTXd9Bǎwwޥm۶f.GTRErr2+VTlmmIOOW%kkk숋{Q )C*)n*@Jr ̚ҐQM鹣$a2$+CJ,lKLB,ޠږً啦-he3X%$Z-mk.xyb2W$N;ȻthSV &׊HA(#?]p!͛7gƌ̟?$j֬ꫯCVKٲe~:F]T( =?3ww\ڵk 0M6`^2s{ `߾}4\\\_>}:|}/x,}\2wEeL&j ***Uڵk$Ȉr?Ve݌;yѱcGfϞMXROOl֞+?̜9 .ЩS'ڷo[U& UVEe1LcmmaѢE-ZQFDFFӞ+Eatԉ۷oӳgOL&ʕIHIIlٲub2pqq!""L +++<<< 7aÆ/(fUVѻwo`0U2siҤه+'EQF#TV{h"booo֭[s/g+zOI|7̘18HII!55Uusuu5sZ*FQٳ'OϏ~?Hdd$ݻw'-- wwwzՂt}ڴiױcGu{+iii ,,2e`4i۶j!>{r֮]KTTvvvk۷U!d2ӧ[Aͼy`?U:v:^Ono\h~gzѣpۼysL&Ypww'&&3ffT۷oc4:tj|*%Iiii)SoHJJ7PY _aÆ{n3?_~@ƍǬY8r/^$ 43st:z%KWm۶ܾ}K6m8s W&˲:uU1n666۳yf{ěoɪU̔W_} Y7n܈hT]rBCCy!x{{W_1w\;w.F1@ҭ[YHNBuR믿zj垆_5={ԩSsakkwV߿~-ZpA^dW'GVc,W^}ָ}pUjժ& /GdIBA(R׹eI!8Ɗn:R (H1H8ۘ(ek"1]&o:$I"A4Jͥ 7OP3fLn ODL4$_츳/_#"&d^{y>+y31Q|lq-}1g,%y:Eyi Iuڵkj*oaÆq6lH&MpvvF0x`>#|MvAXX.|w 4 c` DӦM W?E;iii 6 EQprrחv1m4zɧ~Jpp0h4ȑ#1 ,\P5?j,^ŋ#I͍~1`Vy7UdsOJJ ,3k, a֭ҩS'^}U<<L&^xKfh޼9.\\r̝;jժEӦMy|2E&|y ~ƌȑ#r =zȑ#k׎޽{ӬY3?)[,uW]ldY6;GV6mϙ3gHMMNرc([*UйsgU9$)<= &믿U7볯hT<уQF~ԩS3f jR=z4;wqƒ޽{?~<={dr޽l٩lll1cK. V^Mzzz-Rc>lm4j;;;iРOfܸq.]]2h TBDD]v69cޭ[7~m&OٳСvvv>5={)#+We˖9oV6U֭/_IZ*UV-Z뎤( ꯴6r*H(:kq-A/g\#InҨҕC`܀ zlml`4i;s~ς/Ɔt}YẁHIKG1!ԪZ^G \} 61Ylص૗1 ܹwo3[;c"ߥ7o҆s-ÊGnmK lOR )dݼy*U Iw븹Qn]hݺ5ښ3JBCC,XYH~FDDM6͛T\YK. 5RCIxoxrr2111TWܾ}7oAZHIIa9]#44TM+zܲɜ:u*T`eZVZ....t:+DFFRfMʗ/ѣG9tqo߾M h4Ƣg;ֆ7׮] FChh(iiiԬY@PP%Kz(­[Tt1NJJR-uUBڵH3ׯ_7(Q"[ӭ[R V">>cfkܹs-[^iiia2~z2^xpU|.CBBVVVVܹswwwZ-ȲDEEQ^=g322P*T`6ܽ{WbkkKƍ޻xj f2x|ڪi˗gPF 5ժU=#jҥKt:jժEBB...=QpS7n%#%%OOOqttDL&t4h ǘ(DGG=5kXT[ }]aWm4 9h_TQ+$ 4t50y5WyL*2k'26ǫ ȗ?OUx_8d6wӓhg zmpr*OScߟ\~}O~hqlml F&WBDL-_|!=>ZL3LHH={Fvbe:~<]쿙˗/{nƍKRjUZnN>!C1+[~&?h 'Οd$KGPѣZ#-='ZʅKCqw$!cnݭ,-=-%y3{^-%wcUVZqf͚K/_]s͚5Y- 81V>lBRR3R E3K-H(佪B!#Fa[׌@*V@NJ( _nŞyQ_WmUˍ#C>FdXadHץ#I/4r'.wCqsͨPٳkgު_ש7ACohS0{\6ނ+6p,E뵼jb2DJ.2/n[G+d>< %@ x3b@YQ<7U SX>?ڒARFi6I~!Wu:d)#NkYʹfLigkG:/ :S\F0`r1)&LʔS c=j=z\("yrXҢ >[oO ,@ >>DlȔ!IM1!Q0Aoz&E{%ayb3O"%%%KаaC^uEaѢEPR%n}(--'MDɒ%nL,[ www@ [Y|9޵kvvv9}Lf܇/J,INg888ݻ*(ڵkeEQ(]Z22QJ$I5_XTH7J˲- z^kls ԫ2 a!22~Z… 8p mWT)['ꫯ-ZĮ]WX0+o>zygʕT^qƙ,`7aʐ!C͛͊: @oW^Q{zӼysz=:u H~IN>ͽ{x!SLٻwz,d fzmh޼~:vH~pss͛f}w4|}}iڴS$JVӡzh4Gngυ0jq`1OF$''FLLZ|8::r]|}}IMMe۶m$&&jYf *T˄5RSS?>΄燢(lذ4̊fOvqqQ}EQ t[EQa֭矄۬9r$%J(Ba_huW%DzAaɝE$mCYsp#f⣤(3g4-I)))7iӦO?O?i9 L&.]ds BTT=;w֗uCϞ=2eZxW^k׎ Η_~ɺu8r֭cĉz.]^gÆ hтsΡhرccÆ ߟˋ6mڐݻZ`O?W^1˄ZNG߾}IOOWWX.]C5" 6݂aqWxVӿAgw7@ OZK!]Z gFCH ,= ~F+iTVM-\K/N#66FCHHiii,YVZ$I8q^xAC#2ׯ_qƼt֍HF#jZX3&Sy\6+)I5jԠ}lҬgqʀ5J["m^c&sμK&rvaP`%'%h&M͇~HjՐe#27oF$9pmڴOOONlj5{h4ҪU+Q7n|~VVVjHDD8880{l ĉ|ԬYN<?,˴lْUj9x ̙3{{{"##bŊfUN,[SNi&aԩ@F}={[o/@  4,e=4pw'(zR:l}-4' %ma_T=D$'QvmN>MLL $''@F0 T\F~WeYfܻwpխYeRSSն3]߿/fSLlٲzRRR- $9ˌ*_XJ~yfʺ%V E/›oITT...XYYQ!C`ggG\\sΥA3{sgeuOIx"`˖-t҅_L& (XYYY0ӱF՚MRiiiڵk /* ɪ{n6o̖-[7fccCΝi&G2@ VL/FR}btF0)JFƷKU`֒[e(&'S\9BBB jT] +VN:L&tL&ԩ&{Qn]Zz(9{**+v4jԈm۶ѰaCcرC]̬ShV( yrd\K4>W{% ۢϊrf}iN8oAjj*GΝ;5ׯhV˶mFDÙ7o*U[nٓRJѰaC,Xٳgݻ7?:t/ ((۷ m۶e̘1\xHz=;v_~!**SN1|p3E%JsA{=9~8+W$((ȩS8<+W7̙3o9N@ (M44 oMJ0tPVJFxwpppk׮ё;ҠA_>$A۶myh߾=$L֭ɉ_~:u;兗NNN.]m"I ocooO׮]U+;7.YM(iY/kjS+JEy% (-\0I`tF#2M4L2PbE4h۷oܹsߟMAƍ^OϞ= IIInݚиqcʔ)`@Q++WSNlْWRBåKؿ?۷gРAԬY///֮]KLL f͢dɒԫW^/-Z^z4lؐڵkIHH`ʔ)fhY%JũSpww'**k׮q ^{5^'uԡI&X3f5kFLL IIIԩSG]h4Ԯ][|IՃ' >=Ò!)Ю:N 7{+Jjd e*\nb|Y&LIpwwWSkZo58;;`ggzȲJRg777ܰC$uV|j$I\#NHWtr(*BmSP+LnxJ F+++ @ AlPnhMRXKŒF~cƈr}-QXq"+@ %$EAL#|wi领P@ AQ}.PZ7.q|af겴EIRXG@ E_rF>^%X#}"^X}웰@  ZEP#Zf^oJ^D|E^(Ӕa@  ` Agm ˈ@ 4zhZk(ʊPxV籈Z@ AvR@H+D||Q)jy|},'@ (eQE^=K yVcy#@ A, _dT@d Y~@  @-$͝,ÂRT'i#/|&+@ z\1Po@ r#:J((h-n,(Niz ][*+2JA᫴N'^j@ <( .1j|B?RD2R @ {yM*di!҂?N ɯ_PʈVEՊZ ( KR>F٭@ EH  VqtB?iAWkc#@ G|+"ťEʂ,+?ɳd: uc@ ܈2(Tx"\3NQHOOGQ2'@;Ʉ2`Iϒ}%}!c֫7h^$\\\(]4o&=ץK?~< _~bF@ xF$Tix Z D;koG!cҥhP7|öm(WeeeEtt4b6@ r$Gs#k'PqieTH IDAT]V֭ ̚5HfϞ @ll,ŋDGGDGGdvRRԨQЭ[7u` $$[nF(ƒHKKSIHH >>^J@  "#ddI\ %+#LlllprrL2tڕ&MޛGIvw{{GURi-I ’0ih mmxC-wxxfG4mz, !B$J%վWe{-ddVV*k#̌x]~~7Y~~;3}cT*|Az~~o=yQJE~׻G?Q<ȭ</ȍ7//rwwrɓ'x?Jsurws#F1bĸ_.Τȅl\j"K|Iz{{ZH$xꩧygm~~̗%~;w266Çy?jZtF>!֯___sk.al·m}Q<̰o>>#F1bĸ4@j4LFͅ~Y;v=wu*z;]^|AVX>)ַO}y100E>ϳqFnV\4MPVg?]wŇ?a>/Jذaw_*~;z裏200M7K1bĈ#ƥi LM=]N&օT~&zk. !CCC|N445 gGWs]Cۊֵּ//QJ!49 d2I6CCCh>GyxZ]w*RCf͚Bӟ4@6媫⮻'gw~wb#F1bx} (X.a,KEeYsN~ կ211޽{?g>RJo5z׻ھy}{j|scllSNGGw}l޼~կf<G kR1bĈ҇%n#ˣ.#\o9和,^u݈vѭ#'? W?y0 />N} ˲ڮ.Wӟ4#< _Bt|哟$]wtqرcG,bĈ#F /Ɔ˭ ythgxd?0xN[yd]ϲvZ6nB{9G__sO&''y馛~ /6mbڵ۷^xT*-ptBΝ;[rhٹs'z7#F1b\滯`0/l  1bĈ#F Yb8F <l]+F1bĈ#F FJ! օFH1bĈ#FOHuDKz+ٓ/6BbĈ#F1bX44H Q l"1bĈ#F1b^u7@ *r61F1bĈ#FK ZD ύsa|#F1bĈ+$RkNd8,ņH1bĈ#FmP9]nBO 1bĈ#F1Un-hn Y  1bĈ#F1$9-"1bĈ#F1b ׂ E6"1bĈ#F1^PIYlDx.`lĈ#F1bx];̋tsR_NxuaghJ4ʵ.uih bcBA Bmak Bw|R/`tdS-ְnw7&X`s琈? aߢ-9Lz:38!qRxq󬹮Iшh3~n)`ժ!2zSEvz"P e }Ӻw .}'y;Sv0Ύb[HP?^a\.΂XN# .k:6F?}u5BNk/T, p=z)3g$I M*DkMmhZ*R:.a>=T¢ְZ5ҐR&mX*!DHM]PbZ& 2 a4(0D"0Tv|C( 'ZwaL8jH4$뢴 d2@7(I,ӤR)\@7 "Lrn=?ZkLD. q<qZ ФS)kjiR>x"s=B|k10e+yeffaOy ]ӨGG~Ov =Li><&<&^&vpqFOBH384}}sJk֬b5_uV"A&ZRp!|?3̄vx;oګgTqz&'&7w) lFYbBȁ8uj!|YG>O<[| i0E.k$p'1 ohT:Ż&NΓ?zFT.g8|bl>E{Xq&'i-wR,~6@4~]\o߱%rTaTGTZ7Ӭ&ߓa1,:[B I6`^39Q"ͱ~zl(* zhhUE#0Z"Dࡵ°sK S<?1@ ZsFFiӐh%V"H!pʩbF&[hCF2ҳO50aH]S.ZIgC222ŠAL DDmh<<'H#"L4Ң*Fk )7Ը DH+ _;v ːAzruo@ɮԊ(폭RN4p?s>2iZBH+aU2R P 5Gj'QN"m)u\PBm[~ =^ĎM8 iE`y~)焆9X^z׹ R;HZJhz2c=BjAz.iLS #yi&M<3%ᓼcjadۆT5skBSD@i<J#SZ!P5ʳ3i 9nT Z"L#&Z x0 t۞ѸNT)ўq1  )$F:ў x~CiV8nXGEʂʳΝGkEPIX,̗u{ẸbH,b yvm6鞮A+QM`DJvV4MP/^u;P aZ :"ZPEk!RADb&[4Lо,0 y֮]qtć+FعV~=/kfuE2dվ#8Q/ލ%?kGd8P9dr0[?ԓ2Z uh+-oj!rB+R #Pغ6ɉcn?q4r{JZ=a52C(;͗MEJY.7yl7YoFM?Loπ 6Z'oBR="sؼh^BknfkZ1֭Mwl||36T;wp-ѹ8ZgȒg*WԔ8KRFa ,+(q]J9Jcr:*&]EngXEC @)4GWX?0P4S%оTk?N$,8"I"­y2ZDʘEӣ=Y,E-e: :/>L(OK t:ͦMf<`f#-njtcIJ,Lbhd۶y qѨ322(T q"\4)hle=z4R̒)_H{T]x3ħj]f5+W:.3@!7㸬Z)L$LNv|#G&LRq͔DqlX*RH!ql'rRKdYx> ui}:F.݁Wf||MhNJ` pۙb۶u:DP@J\ Z ^*F]X  Z D IDAT4Y1YJej*f)J `xx˲$DKR7\wJϻN\s B^~eL~n6<8q|>Q@aj!pH$umdwt 8IRX,#B)-ёV~DIz7B΅Q_'P@Z{.Sa_>UFK[͛f}ޞ n"Άٵ4 ʥJѓ'Yn-ca 3i)xt{0׵iY$,jE\un[B+Fزy+\T2~'tx3vKhO`LȷYӟfÆj5n&@%zĚ5kRH&zUz ;@BCK.lL6lCغu d>\eݘf뮻^ P(h4i2 {졿T*EOOJuI\Si^ٵ^V\ATo7L$WXA^'ˡbzz\.2~D7:jLOOE)%}}P(D0zFgzd z~"m4s+˜9 V~ 4[)F$%8 5ȑZ} ؛֮[K2NS^, &Ɛ&~LOOGM:.jJ~x_ڋ|va)[ }׶9zLOiF#?}\V*cGiR~zY':Lkʨ ^|R%A!gj?D))RJlFATuQJla2hhPי0 ,ȑc$8\a<i4lyA35O95=J+ ғҭ5;v\˺u8qDGlm0T'BCFQ(,BDXD)JIJRF>ghxD"EĖ%GRw؍SS~=b]K%F;yJ155L=N瑒J`br|.Gn4}>X,FcW.}'tY4rLNO&"#\rj]ò,mGJϙmŸJ1SF ôJ`H~4Fmm\GTMhxIq/ixs?8^z$3SGAH }Ji d8w7|'Jk d.'ߪk,wt>a-)6IGO ^(p}~z)$Q-,la8 kFDy-L!, I&F1ZpilE+ D"GGdSA`:!E[wHF8E-o1Vo !94#0HSqZˆ1r4R9ݗE69Jn9MV_^f`t: A֐N'9xL2v;Qw? @>9֬9gЛvd449"!g[I?KnQ(/ R($@:۠!0(2~6\G~'1a$B-2`!;FC&5VQŦOrf_4 d[o'NʎZnRS8j TNSl7nw-g5(X]I],{ҙ5݌ߝmِ0_.ZAZdg=;蠲[pەWc"֣X]~I aQ6cK׋!u:GuLRiQ5)C#\=Pr gyʏZLIZsR-P]:׺<*1|:  *lSw##K} omxASw 2uaS@dAO!_sǗ b,C=b=(3vQWwVLcwfn8G-T,b&T< cQ*iMXIo-%5j4#eH%pxAC1Q(:07%^hT"*dRAs1&JϤ*`#*-TwB6xʱBeHz#@2BZ<1x !hT-+'GGBxf3 f:BDk SLLϙN z%c^it3NiT*EaHXskӯ/rk$Tx-~Ok(I\(C+$h4(]Ô0j1 eͷϚEYaݕy~iH+ddԵpxs9[Vdm}N9JSq+=*rW(\~a %VN{7Jn؆y!$ILJTͦiFd#mulaq{ݶ1O1oy NwL)0,뺝/r~G,nzI+*9 \ϑ'uG\)ΕpXcz 車ܖbW*8{5E^33f hu7sNOT*4^&''پ qi4~1$r1piNs]KUOUNyӖchh "Cg֚ިGx*/qpuPjF0IookP$ M|R￟mFg=1W_Ww##C)E2"HFN\533(JL&R\. fgg8tuQ|ù60^f/ƻFD|r̪U+9r_-~1!B222@W#c$;8]a|ؼy3Nqp cTU{eQhJ~I'F8]8ZkLJ33;)CCCc; hoesYrN@)ofaň4NJR%C:X,R.{N@62M $F2 Jkj J%mr~A~Ŷa{97M|Ұ].`Y p=t*E>s ~zd4JGtR SRϓxᇙRH$" )%BC8djeYvmض?ʕ+)L\gQCkMZXµJ&q]d"XʐBP )_rd%M,`ŊgB:<B 1ꪫ"6W_}4#9:Dl] Vq@0Mٶ~GZH@!o5Wc%%k D@"0Dxrwvw 5J[nL4\:}}xE=#X~څԾߴ9K>&L_I $m`p`a֜T*ERMvdHjHvݿ6BFpVO?moSFH@.ajٳw7]cdd{~yY֯_Köў$do{#gؾm 4ft|-mS`ȠaZ4|qV^MOOWB)ѣǸkQZ3]+`vv0X~[l)< GZa1l1$zrvlݺ5: {1&&&4Mju* B|>ϱcڙZ(aavSFw*6mZO\\.( ?~m۶RJjjFR0f˖-|ȑ#gzF/i F'&Yf \s5Sd2$8T*8|T*E:fݬ\t:KuIT*nS8*O?śx=~Ix;IT"HxgLnW^y'FA?*\#GDL?h-%"#E2c}ZdHO)X~PJaDdAUN@c"۩4PRt#2\*¶mtd8H)5ad81]3r4,+@ш)%lb+ȦI*Nl%d|T_Hh8Ҵn(ΔV'JIH|fffZ𑃬Yj򠚬bY&Td2)|JP(Lug N#hJb 0T۶IRdYRT*4tE54f!ѐu08;K^o"yˮX.E9R̀7~TJe&1-bS-jpl3]v \RHT (m sjn yLOOc74fy=zL&)B H5.ȉ)^fc%:Gp]-C6ڣOݻ40FҥawЂӼ@ [OT߿Z h/"mJX+~%JꫯD9Rs8fZRfjx?lKz4q0M4{`MsRM?3kv|xy]י>.dҗYjR?X H&AڏÐ4mJq]xW_Gw^8D\HI5k>%?ΐO)׏ +Sg)RJN8A`ttZFwdZPCqy$qc_S%kaX ?kQokoR[ MXTa֞[WxR{z{]gNp<+ }}8 W|P&j}]Zq(,D"ٌ07WJhj19i]aϦ(Rf 倔r$4}E_ֿuy)4g\_ GsG԰1dP"hƀsh)EN%/QGBvOђCsXƝ9ꁼ%Jm.1_ Htfn#*9h FMڨr&V;҅.-^wP0:EM&aDDtsKm]1y:hz EA_BV:궐sdpR;¾}{.RPVlܸfgg9p`_JR7̾}XVQ.WLY˱yf|k$Ri,#.=oͯLj^9il޼;w211dKZqTE}n|*nJtV {\,evMS_fxxO)h]AZu+ ֯_F߻2i4("' MJms#I8Uxh`YVTWbY3 359-[HQ,R)148y>B2IR!HIQcve ǡ7C^%r) (P= B06>y{~ۅ ;ߊc!3ٌ )PI*.jV~o%:%hʫƍqaz#&MI'$H)*&~:LdʕѰm;ʲ}͕sUgu@P !1 c{ ` 3cgkz1qx̚5[f<ƞe0A H PBA+֍眽{V]ݒzkRUt m)!OZhfff$Pc4OU]2z) !?X,v:;:ꡫL$d"5kY~CXjm!r!,KD2x'O<cB͛Y\DaWhc6V{߹JA\oepTSl+TaB-jHQJ(m(˨ +f8 "H4zZH$@D(MKHjW ;F̶pD}.$aYx|k/ fFBE@'Rbh 333Ke퐈ʼn.j˶)I%H)I&R),iEb >HB8\$12C:8mK)q]uFM8<4RϫJJ^X,q xܲקnTK(=A*}tjiףv%\bZjI6;dMH"/W/XUS[B)^7[a5ʭ6t%<(b@N$˺0)\'BZ˴Xm8#* ua$vCHŊzЮ]{׉FۧIR[]Ij%2%LBle'#˶/~a9gp5Eb{et$39cհ"o FCJ k\ab], 2=I]cĉLOMc0ۻfzzzrWېLzjnwȆ=϶qT%[rەesb1@^eۢ0X'.a&;[^;憽,ٰBk[[Y Ӏt]@Пv셽\.sȲ,+ (H)%4Wԯy5l޲ :]WHQ8 UPč {Xrp/,u0Yɷ,-8.hY 6 <õD,F8j*Q5JOof7 &޽ p i5p?M]|* TR6F1S Fb̤&5 띓%SR&3Q@/dԕͺa$,Bϱm|?X|0|N//Xzbٗo9ֱoCF51,/X)4CwLNs\۰mgpQɇAT*؅)},0Bvٽ[^\5Ū݀iWBH<vd"#-]qb R "biuIvzuJVi[L~.d5}]!bN{[ ? ીjZ'm3i쳟CU{_~8 u9{m+1?CO?3t̹%{":EyS 8֬6aή~iЯd_MbW2 :6a#~4֫ѸNx$S lK07WF6Ջ5SSc[6B ?@BidXۥ Ը_h[x&5n ZD AWw/~CȐ=:6vu, 43a2-gITT}'{>7=Ό352B:\г~=27W`ILMOQDūb Lv 7ndǎ҅⊦ s1K)і庤S)?Puu].lk#$|>.47W }sɞEFMPB_aVvc1t&vDm <ÉJ + 8En!hnirl,+tRgVZaEIJm{`*W*dLWKIj|+ zޗ#?aU:EFSMrmctf:$gxoffZ:evzow] wd*fojnQ A#@pXJ8}PXR,(92;C A]a4?_B[bAQ|0UI3̪!>O=%ʕ<H\ !p~,  Ia1a[LMMsAs.PJ133 7mq) \+CgW']e~P\" !j>5wMqB/ u(KHv؉$ ׬YsO}LT+Qg{PhE^rV\Ayvz::5;v E腮{p4)]o:*R.@Mp^4]m^ Įګ'|&=W5~$%!\ZX R<:xuְq&/to=m[$Siٴib>wsx 2D\H4@5Q-kPX sG:(.-e:-U6֪s],iS N2I)NW[Sa(S(ɤZT (b jF_KDĄMpR1RX@噝"D ]lٺqm۱"O8wPT(  ůwpog /aR* 6^oKr ؜KJ^Kݐ0~} :AZWa9V__1ōetXw9uB]/EJ0HiqI,۪+lԤ¥%͂b1 SG5RD^E6tuv8yo65wqcbt~LK{xK'"݌}8}H+)6{jٙI?Ȯ]Ц̦M[ٿT knƲ9|!\3O(,j.U>G1$I,idHRJadtt)%\t:MP#Hc4I3tvu3x$7r7F(Jlܸ x(EuJ)ڸ뮻hnnfrr?A-QJ19150UKn: 9Xu#$:ZXggdbrx"Fgg7n=YzI:x߄%bخO|R++ ͿY  @. !xsW+l;T_u,KNO? Bϰ$mooGiE>;nhc:+;vB@_< )fgfp ڵ+֍6b u>hء IDATMeCs1BdBB"CU=b!x -H&twwq ۳\>@ B6eut5o\ã1y|#73<ǿ2bLpVW|.'yg0mmm>/~a[&P曶RuT~LM򰱭(Xt4 ҩVC.!MH\֭[G\FZ=oe345J-(צJ)O: ] rbM ϤKGQnz$m8׻_"i"n+/޵d Kqb"[8$ohJ)qc6n̮^,nPff 2&ϯxp2q FaԲBP(ذa#lL[.H>'O _ǏGH4Fʥ}5t:` !rwu&2 273C<G-7FPb.;AwL{;}=:p-FecO{w ng#'ͷQ**^~ylc'\\AKxK6B,.b-qD鋇0HiMsss|3!qM7bzlܸ~Z:RJ^yz{{+Ritؠ^ 8jW]3|<(4jS!"nYGќWG{8CCLH$ubr3l޼ |=dciRQWi0]ECeF,ZJ<GHqa-wchNw#2<5՚A iRk< [xI6MxRsQYP(YaGZ8H)l㺍ocGO컖\qj«XP!Y,j+ \Σ6״uϥNxDv-c5gH%]|2#08#F ̮<܏-m 쁯B?tVfffB)lk(W $g~~X,V7"/¡!b¦38?C\rmsHeYLJ+1tR l07:F1eƱ@@6;8'O5v oBXpamڶ`0%ZG`,ڂ?g:{WPij9̜EDqsw?8۷oX,fChl߾qm|~:d~ #6m7O_ "k5?ɮɭ)ZW R Jʣdx&@ZHf8L#A2?e_xD(/06杫ߏ˜ 0@vIށiLz+i}j0J&Ff # !TabkAX~kp5)B! nFJ?ݰm j{MT?ך fN 𚺟xU֩1K%=j]AXz wԒo%L>¯ tob@Cl~R<88> {W5:tbkqHW\Z VWrMϳhcVXh1:~|ꫫ(< ޅwxgBH6C ѡRT#Wò,TMk{0;;{ZMHX=&jC&<8}Q0 t7RCYSvj~ޗ5e51c!5`K6%Rt{&(FEZ@U/'ŹTig~j. 2$qq޳ڸ6^/ǚ@+mEꯚdJW൝jq! Hcd@#4z)U.R~8`pw>/@GGGc0;vfg㩧o|y)~g2}ع~_m+4,#(zgVpƭ%U&*.eL=,Wqf$YYiIX6ݟx_٫ftAt[[YT*36:>mYuARaÆ v¯WH 5't#Ϻeٲ8|<'ٵkk_`ttn{r73s]z!>sbjüK|_, Zk\ۡ\AUQJDxI6!_H8^˄ Uԁ Wboaak.CJvC^Ȳ5e4QJЬPoF9!Ν/ǑC'p,ͻy;ɤ˽Ma-7!X|~IN駞fbbkU/aVЊ%!X*R,/e0B}tmʝX e ]sfn-iKKI:46\BN}oO}S]?Қ@C,O~^ZQRwc MMM@aAbIK_wBPT|BEXJqnw@CՍqioog{l.om4e;;?17nwTػw/O?4##MP(P,(XbFSq ip>ceu5-ICau:2wqlێBƮpcBHB!a׊م`%EI4|1}g~̙~5$E,+ ]K CU:n_H*{t"uDh,4"(RשxHџ~d2 4?Mh B{ue +A@E dHp׺ơ+d Y|J/Fߘd$K!+B Z{-8r)~ҙ BZqe.J-hhrc_Ms򚦂2%zɂG)eJz׻?s/@%ۦ͛ٹ}g1;vcK*C~F<GkM,qE|υ@jĢ X-c[j988Mm&Cy+P %JJz֑Ͱv<H A Juh6RIRTئg!PжÅuGkSEo& PA݋ڸbs{QB\f͔+z_ }|M1 \o4FZ\):2Vݼ m$HWXvc ǎ#VȃD A$\/-YKJkf͚5(:$=8q2#=&Z;p _*jnc}$RMR2d:)LOTJ|:ڳRe Hya("9z|xsyWg妛o?.9eӬ$c; \ȊhH;yɟ\.G ]DHP k,)ftl$*! D 2J2V)u"d=B0;7{otMw`K(mXv-GߤLsýa.?pZ2GPcb1l>%%dpxM;v koηBD[W?eͺ5QDW!~M5vGJ3Y1n;~ )%J)84_.ZPjDDIr9OLD.5ԃƄ !:4]^`\SEG()lz!BG1auۓf qGD`: !L{3]s̄? Ha-:P,?Ž>U)477_]7]:4DŽ"=d{~T1!I&H)I\hĂsz-Zc6JH^RK>zoAoa\{_ے'(XOZXiLS#xlMR.Ktc8ŋ;D++b21>DOY582P^u)w'NI$ wsN<m-Ak <ŏ~8 JNťJ8Z2ưKc8< ,aaaIp\ey& 8bAP/bthFp$'E*0Do5'%[dZBP晞;tyخ"t#7[UzW3h(:B X*ljXRWB1oiD<|ӿ݌O2==p-o;>3e6lH"X(ڊ8<fuٰq=> LԬ APX, L#YNMլ DZȏ0=tbRb[ lB|['4bB6[:vX^S#hj5r @EƺƜaz$yߣR+:sq[hF;$-Gn~Wid(W4 , <|b9- ILj^RyUeW=/LB–RJ Yq?1q4;w<'?ZWU 4- 1Ha9XhT Uڌ@Aq]D"F_O7miz9A@.ҙ^#JV?JC[{##-rAa(6vICWW~#$1>6~AWN k6ήwfRH{:iDR [h^|q;eA=P8r/k9.2.cLW4rpRqPaKb6/4T 7|fÆ .3i$4e+K!N{saU1uΕbT* Os.̬\*֭[Ν;au)x\ס ׫%n *أq stThOXD%0Ξ${ʔm Wit2Dh TJ^34=ol vCqc!LK&KCm"Ts̟`jn/X&Ռ%m~726XeilyN6cLv7j _]H1H F NYQF"so<@ h+Uk5 BXh pZ#",eYZ%Q/Y8ͭ[}T2M*q&'.n`HS{t'X[nIG!>/0 _8\X5AӁ%1¶-4*_ 1#~b4]qRRcQǣ r`+t[% 1T^CTK|c |?PU!l#nFys왟&Ial5h38%A+i2꾅˲*s3+1:pE1#$#3wp4mo[︃|L}h,'FX[oEu֑LH%6( iZqFn#J155ũSxϿzh3+.ngz{{ZOOTU\ץRp7i&կ|}~jd2>1}Q~~/| f܀_f%\Ug̓亮3߽ܳvT*@HQ$!jEIVjimݞ{#"d:u]%z|'P1}~7ٷoіgz=e9r ^:@ T*uK}AI8ˬGKI{ٙ H(~_‹/dlT.Qc?_6T }|>}RYA?KH`%}fqR>(fJ*b`pK( lݶ5k43׻@(ȑot]A:Wѓ<7)vHTc Z W^C&AcccTU @)aضij5lfqqɾ&X湮Woߎi!__5fffG>I&M&~*]]]˿˼<޽)l7~7D"ڶE,оRD0_0 Ɔ3TK lۢPD(hhRɉy) o[XSCX@0t]z!⸮h,>t;2F;~b']PߑnjYt4Ļ\:TE4)nrE]JSq׈tVٴ0&-VRhh$B)_A0BցR Vͼ+괚K7y{~YjsJ,U* R lM@_4-),Kg]V\-0#8Nl <ݽ;5=}B~fqlE0a}022  T5H& >W,&A\\*^?d+EBR5C-&J n RlHxT62C:J@2k<\{bUVk}UۿW-2^S"uW_}37!s)_k_:;vYb9۾.Q,4;\,r.{d|!H<;|٧q\f؉WX۷l6c`B0vͦR6>Af\MJ4miH}fVH,EH ?&5CCgz$ JaB.iPvsql$f!2MjhRotuwߋTUnʉ'hiiQ)WCX5{rVv Z/y[gIYwdYzѲj],\Y zO\99"| (&s5&G* çBөL/5:sp)c&\PJr֔ReՏ+Xa>|>75m{>]t4 4aoEsuɫ՚&qAx w$RΪ4ϯ~Pخ rA^{5oH ks4uzSxB0EOMPVql.U 5]bpsKRM[[t GoV44\B W8C,]Bu_ow*V2eff XUpaf~D2@ ⸊h$ݻfڵ;vq6mڄ8Ar]]ضuVM#fYSNQ:< />H2$ "_fn\*1>1nNJLD--.VtQREt[Ж'P"SI3:OGK,52;j(Qj\pM*ED0n"}7/mE0Z*/$) .nͮR^Ks!eK@=WzVJ/ r7unv]% F.]Rkz!Ә1p W)b\W111q[ח̌7ԽsG6A)ta!y5)AgZ ,,] 7%uiu=<7*~Vy3.U.uiiǨ H$f"A"M.RFy! I8~8B=jw41 ˶PufH񴶤.oLH~8s qaΟɟigΜAJɛo۷)%a+D4k^J/V!+1KM`: t*< e`}}Q"+t>$&hO$augϢEl{|Y$8`:|6܋T$RIrs ^P5B!,uXu'u"d rw: ʭqBfh.sWu3IwLJK|곟ñ^{ xHP,YqBH4zM*~3hjţ,pj8~ZͼcY`0Lk4ΆGI%̌ E AkB)DžKp]2#Ԥ&[jYڏ V]Z@7 (2hlޟ,8;6Rw5uڰ._06)%~ݸVT3|g hS.n:nDQ2R7$i0Bඃ룣B1YeHg0|_b9Шy\ǩfddKǧ?h5KLpҿv-+/iblp~bxE9+@g5fEz{/lᄡ`O7R#G\&8LrBoo/Ht:M0Dضͅ o:^5MӚ{YfŨ7VCq* /}ix{;_ÿCuL*qly]ڋTZ W XGF^.HMr+ॐ=NV,T:Mz\j*!B :[% D]`aد^r=[Faw! c"tC3\Nr95?7f_2[u >O^5Ǘ[[n_[ J-?SW=tXϒH$8rk֬駟Fa=ad9\7Ӵ]w&QZ;R,!Vղ^G( ,/4쯆XZkB$UU !@m[100@Pdnn{wivIP`ffl: c16nӟ_=H_̓>JeqlnZ GߎR,,,Յi۟===T*֮]4|Mejj~)̇xQ\ץR߽{7NjVi q\%4M$LuVN>Uvt:M__AډIGWD&CtR,'0PE&oyCgAت@aC U W(Mْ7Ǟ^*Y#X+|z-RpQA3 Zm|4>23+wIpȭbzOΉ۟+7{T={Ge}Ey|apkdr..#g&(UJÜ9~r"}kѤD.dSJ!8hQ7RXf .pBg㶍,σpqxxՁ[YrXӋcYK"$#GN"OcaaMӚcJOOO/M׽CeudR)4(MBL6yQ5\~R5?X*!z$`&B]}muP5I5i2hp;iԭ0>Y .p9Nb&%ӻ7O _i,>}R(۶mkx-kg%p;BXu.lڰ$SJ֬YC\fzzχeYAvɦMLNNO~C1=='?IR/Gرgֆ?'dll'Ogٷo6l`ݺuTU8{,;wdtww$4 v 6I,2HH4BRP3Nz6e1ʳPU.eJ AtYlutdrAcdb.^ML K8k6n(|Cq~4N&!sse:;;G?JK$R/"rd*PEC ns?J_&ҩ4=/Co@=/Qfhh>EY6\::B %V}1KBmEr{ϭ4hn 勛6)(ަl)Ѱ}e99e=7Gӵ;k/lUJGGG3r7+R xg># |ǙbӦMH E6mD X,QVi S)f2ͧ{BURT*Ǜ簸 uIm5x}a[zy9!D|u(cK>=t]_2>({Q${/>Bu8F!_m4͗qko\DLMM!5cGm53*hT] ӡxBASYV[l\4.jM{!B[nN͸XǯP)֊q]u*33>4|<+,|+4B`66{noٖ+Zl6[?Z2;;lV`~kDqHKB1K<Ο\ᥗ^$z'N/ >?BV# ]=h]Tl7& [j2N*Sj9t^v<[Ox,bqqrdSSIJ,jbD,qjOϚ5T+ZH!<Y54lY*r&B4\Vf Y.\D 5lbK]8sL3RJ1S̐[g<9ˊ{^ל4]uJit=ZpG-zӪ4>I #V8S,5~˲MzZ_9KDRG )^|E*_/8u#X4B?a:::8y$={ H"pmc1 ozh+:PkޣrSTz˶-2/VPJ Lj(*KeαaFFQR`\9Kl%m]SA5B-®ti^;B JFZ2#$G֭czzz=mcY^!6^ZrMۘXUV:)uGTW** adp]j @2D)ռT*iH)Y\\l4(kZZ)E2%ˏᵻUArvliHt` d)&ы$R޾8v,V˰hQ,8[ BͥQtu) GJk011Dž3|xؽ~{rqs)~zOC FSdJ޵1tYO -ڮY4lݯ)*r+B)DRnQ4l.5:9ő!JeӖ-}/;پgx{}< SS]74]ݝ86x#{1-X,Η*?ɟP,aff{XoeJՙQ# 177wnj&NN)Emq\,R~ccemBr1!5Zb12sH6V|/֋f+XʢV,H\.Nِ:T\O2.fx?Wvy0*KbB,ʇ_g[9?tcԧ>eոޝlذ|#GsP/c|$ \.x+_቏j,&lܸѫhob~:ccwSBP*x=ܿk/3 b|rή6qΜ8s};8s ZЪYl͌R#͵ڕ- /}+-6 ݹQNy'x駹{ c=Ɖ'8vH ȑ#ϳuV0 (|j5ٿ?]]]T^w:7o;6mj}I)ٹs'b l߾#G`&###M, N1 EeIUa 0sy$k FHxkhKr&֪aE0ziqmMMh8I4Ǻ Dkp8C Gt<]Q8~U0႒wetR)hx-qLj)[5--fn*̻+d(okr X,TPr-a?yTbn|So,9x흌s0!α81Oww7BaD§YLM gKJ x'{,ù3X )y5$ZgB0?;{Z^2!N>EWW+Ųc+|~?hLv$%=dZq;X8V 4%ŝfW؆ko|\+\Qĭ07k/ ~nQ '3Ʌq4]㥗~lecDff|$I#` 8 nddd`0#G3ZH$ /@&{J)9B0V\ ;|4AyzzI%BqMB!? 34a_ kդ\|8} L֓H$صkbd2qAg500@[[`ݺuؽ{7'N˲p]D"8tuu]vg?N&s M}YL' yrybr9x*J۷!8TIИiRꒉct70ؽ(Tjӗ879e<­18r}m!Y$Fvوrrz[iW>͇L{9~"ۙ`M:Z  m^gPO޽TQљQ (u]u8Kŕ,Xq<_o\MA;yo.&pQL^)RHS*Jۍ0HJlt*[w81gi-ۖDSDu]Bz\.K>G)wVs5NSC9y5oH"He)hޜ1spesiz.&ø{,xmU륢Vqwfxm),%$"#WI[ %k^r]y~WTCnD]X n 8Ӊ{{T*_?_?qHf򖙹2333k* y4c 4ߋ+Tn32ҁFM,NwRS[[Dpq _llb[ µⱛj[֯?o]olڗ2ԊU*H,>ԖrҥK&te}32>1r|>N8A\ƶk_HR\p˲Ջ64J˲T* &+7 EZ//ikkupy\_0 FGGIXٳgrضl`vvL&C:&pϓdBP(H&+֮ ‘>z=ʺ h?-vr,qtI"]$]A_+bΏ~.qirCkEV6Y-:p21d@xKXk?:~iQ"aG t-B(jr5} 3ǭUD"ػ(@kZԹyTÁ/BaAl}n O e{z@WN#Cpe]]kFCj6b;p8оCSЖuVXg0?@5F$jVܹ'OK5(`~M[3334_K&?u5 Çbrr+ n|n(`bbBag-K{Eco@7Y{B5FBS.H(-L9=[K\@׋;r{u]fF0 yctt!ƉF5jZ$+%:Щ <>$2RwX,f*!DsmYe I_mT^_3>2oر7(UJE(t@4Bմظi3lRLLLя|sPRT.d;f3A[g'}"g ճhK FZ`ښʰLA\cOwg/N}] Idg0) !|b+j68{v}ؖ 1<| w޺SG\,S1p]վa|>?"]]]lݺ .`;|di4AnDn}#\ܨΈkU\躆:RiJhcq\x.t]0=x5BI}s3H9 C˲mF ~^*oL&C.D"A(Rf(SSSTUz8\ kv}-z%77a)jE[v1Z-uV7Xyl.{{6,R5tɳ5 !U ɞX.Rhj{|8qM716:ݻ&L0?Ν;9z*Yۖ҆ p]Z~^8.\  !0x8R4`\w^<8ϿmF\$P+Q[Q4TBxFlSǬJHj{|SA]zn'(5Sas O%|E"7G8?‰$h!ڢ3MMIB1CӰ] &$Iٻ W{ @onw=ٖ r3/8Ru F [,ũ7jg8Ѷ8kF#t!=2mq3ţSO|y;[|h/B;yridE\B5Υ"RYQA6%{יyU f˲H$I=rsK)1*?HK6B&kdIʕRHMDZ BIlƩRܹ>Ta߫£ntL\op]oqqq8zÂH4x"Vnʖ6U.3aWO`f ]$DGKZBO\fbbGD"aCD"zpל]c76h$P Yv4U8:^`>6mD[[LӬ>ڵk$կ~/ϓvڵ??Ƕm6mķ-Ο;{W,4Y\\|6wa6^\YĶ,@Ḋh8|]P,{7zj /'Iжˆ Z?2p"إR}q"--1,Y50|Ņfr`P7о.H_HۋqT sDIW +!w"r7mO!7pcEDX6$ma|d ׶?Tttt ]L6.L<pt*EKm H)HYr 0!+ P 6g.jCl Wpn`VKXF2qbz!*UeX4QuKQW,&R R PBKe27WX4P80BcRW05V543+s9^I&R)<#lxu rIǢ~Õ5knLk_tp3C"X(сgjj ӬD",,,%b|;A~@41 0[M ꕮJwraMz4=#.f-j{F`E\霚I}3C"Sl߾Zƹs瘞Fu*\Ezݠu]2LSHpllkr)m]cB B(@RhZ;I'}ʕ;E"3 $"?K4buH-BHY}+墅VԊ C,&]2 XUȃ(Mhي0 * 芀/Re,7O,0L9៮UZ[TD w"r=>j7d (~{R"ԪUjUB6[o̢VW t JTJT抽uF6 dC@]xRzkMwӡk~x :I@XnKl|Vc.8TVnM:  /Yҙq6܏k!wZN Ch{BJoT/@ Y(5j]GD]^PWV-4f,^R`mI |/kc5sN\xq}T*soj)$+~Y)%8/^|WUAtvv v`zw t@j5u d>t3^<:z)Ϛ`)%M. mo-Yyꩧmq.\w۰a +`7sGGGί>+~c !|?Z Ah^hn7nܹsMAua6c‡)Mss,8|ꣿW߸4<#~fFqefFlt,U+'H!'X"2PX#_YKwjgmf'i ` i9̾@+,X7eo+@Pyǻ~=tqڲ4(v߾W?#_pôj>qm$() 8jlؼJ4BH\GDi5G%%TM%Ut pĊt׀/|KL4'D"!z{4~b5i;b-,L o!RFC.$huP.E*ŶJER \[cUG Ƨ. 4۴U[.ՃD}m(%ض_jPՏloj:l)y5&˛)$BhU%6Q] %v]4ɧ?iygk̉,] b]u Hև:J? Rku6D;0R)$822l [rBPť1{@R46}$sSDZ-jL\-K,Y?h"!Yok|m9|pDW6j@.bAeuJ2]]LOOXLюc{|qR 8gff¨>h.gΜi+qڃǏ_~6ܱ*m(2 |cN>Ƕ-xQ)dJ{8OOq%E6W`a,ndrftؼÎзC翉f' IDATFUʤ%?##l޼g|dG>QĖ6{Z]ϥoѫ[JVQqEtMGMBUHFhf8} a?g0;5Ú lG$\Pq]Nz*zm&mZ(0ʫV _w MgXjV^V>A5zY:u~ S/?y\X,8}}}LMMNl޴?e%  Xz57?q,pݜ>uWոuݐ'j-HdQA-MIbsRH ydr@/]AIiNTqI;I&tttB"X,˅kpGw745FWGH(M_Y]]H|F{UwmJvIr{$Si 磏>/gfj fJұZUN:DY @,FD-ܰ[7m#>['Hē8*d$[ ?z-J5"*7-B r_]N\֍lZ֞/jeC |ں;832LҖz-Lfh蠽'z;;ҿv-9taF#x#iH Xq s,vf(B"XY'9&wwz.iGxaHr8zd?x -} C㔉FX j~h,E<J'1E:6R,ep>ɓ9|pHmhbŒzDc6A`lL4A* e}o:Yn*֘FTPM0ƛ 3*YJqeRR-xeXNZ [[vx %cVSO?4_xشqc}H5QYufj:kݔ^%Wv[ d,͜?mGغe \6V_gҩtSjrjvɓϓJB6"o>ӧ]x2YR'M,n[n *(mw 1u|Q%IMk8RaVHJ̙3g 0M08q RA9ؤlJZ-lj!$1?*(iioU›ߠ.Jwl~ ȣ|@jF'f8}r 7R%I:'kI,Lf mmxm׽q} FҖB ׃H,JPfw?} pQV Bpn$eq7"vbt W4 R8|O !i>A0YU޿|7P@sp>3a`u|QxD!•+(<IJS C)ZzEAf9Q9=蟹PMc]]6ͥ>ZZF.7 &9ɓѐyהe^}U<!LæVEV%KS..I}.V!!t?W3f%--!d;Jn%MkL͟">ݛپ6V)m6l@.W#o'ĩS&L@&;A% B Wc4$(VԻd@`6mW|2W UZ 7' dnMR=a~o[hÖ& A؈ꆁRZR6+)RS"]#q4q)e tЯ;).#J,"|-}<{pnSx|~ #I:DLDSH̨u8X 2f?Ei$En>9BKW3tEhyh-tTG\ ]]IѬ܀ʫ7@EeVE _zDO4cppUzz936F[{;mԪvʗy?zN8_?H._ݏsLOS.himahmO'if`zfGɖ hL4Md:o'k'932rU##pC z$Tpp^h_R:٫-}V|իW#:%VAw_d"^I{G+mˢ$#@ŘΓJ&E"h1 vf0ī)JUyϟ=#}v$ X_/o{v/e]AA_[},2O,4=/~زu ֯V188Hoo==y `zf֯_]veC$axx#G}L&CKK qwͷ6+ttNPޖQ!,ղf舭Ǝ8n.* B$W=~B,M0W3 &=}l޼^~%>O011b($r {a;3g077xg]2eY @!f(:S$(@H>3 Ѻt GHUĒ&2'8z-LOqjJKK_;,nb8lI(cw?0ɰ¼!Rm+nyI RG1MIhZ2y[5Y 4ʀ-$Ꙑt$CfMOv>%|\` Ag{P5rGyw=c'M[G__2J%Zp_ָ֩mZ7+N׿Q #čs=;lJ&a^0lܸB] ca099IRa``bHkk+Dc1}+q)2+?eKz#"n(Puki9ij@<i;Lz*NdR$6JVTLCYKdkBDLX, x3cg֯[G2B 7 V CQd2V| b8/sdolD 1 Y "fC Zu09eұ3N#t GT,R( â\.cZR®;d2mRAJ!MAiF32d GGJxwKi2`-ӕVF. cq"|y악  E0Tg5v/P!҉A>Bc[aph7oaD/̰ChBpH:\hBYa4֡lH?"]?u]AZ ߊym-O8ᣓI $R 9eP)h0 |>G, ֨ M1|,F q$ m"P ?XL x(e֫L x%t6 Y|uɿoD,5S `Q7G!>h4J@\>,V%qzc n|-(ϣ-misYffƦmhlj(c,O'Owau]|. !BhKQ/mِiX7 ^{56oCN!^kkyn%ۿF\nh^-74Ը^׭{Ѳ*+$c=֪H"B: R5x2gAu ke^yp*_ Jx7=)9q"c駟FR")ÿѣGyP駞 ϷzHjRb u^i"- JL$QӂSax[\AZ@n=neA@$I"XջBa֖4~aHJvZ|V`J/̖mX { sBU[SkqUk]փ٬xԹWXq])#`Ģ&2BFXU M$ +bΰgasnU0xu6)Efo ͋F_ - ˺:jFK: Vb`X<:4Sn) g /]eɸ]mĈ%$rF$*(x(-iNrI$TeJ^-lf]A#F.p}j? a#KNOq5T\S*6L93`Ix"{ +Mͭµ`D!Z`&X,gurB"!R*c[S gUQ~[XGׯ}}p]oUP:7@+\i"ӸaH KEZi6iXZA\ﯴ*X,F*B?:(z;},`.dmˌSfMthzg}6-H[(UʬZE0Ikg 335@jyC)Zӭ!ryLL09>κuXv-tRf?_ochp3ŝ>$RuAlXCvnqс{UB 5=Ba Xtr,Șfݣkи0TP.hmkŶ찪L.w+CgÕ4$1JNh4@3p=~TR(z>#NH$IڰT(H$xk(zrv|VC0Ǫ58C:m(Ҟ$73͆ ʺUJ%$L>,ӤP,߿B1tmiMҁd}l3I:E1" eH,#nuMW_dFѮ_WD*\N8B_$ 3|uf*kl -0$JSPZ9+h%&F:$Xfݤ =4+g8R =7I牴g&(\]VcL#zg?MOO4"5Jfayu0rȶ Yr1. AHARu]vʦvuw_ĉl޼7u!Q6MӰL~V'*4R #g;#eiD0B ѱaڂJFf[l' ҸZ M: S4) Z(8pnBvAjt<7g ~c~]XpiRrGZԅǏc`VO>`g} K07_D+@J@ 8:2FHFQJ[h$@N8ƛ -6 )8=8p ijNz\,S.Րbs-C8L "$* |'_4E۱D +͇.곫y"ANW!fjr;ޅm37<*ڢ4 ] )Mu]44r~n>o>ڍ sRo<ԷX$t(F'eT4(aP-R2BG튷`h.(D_UJ5,`6;vy\O~zCd2Zf}h,uk1MT2|6#GۨV<^>D}Ғ}f\}.-4'QJ ho鸌(*-0:{JJ$c)J<S.(UE&fs+a<8*P<D**..M! \ +p7U D]B?<ý0A`b6ܡo׽H$N,%Њ<ѨLv"  H"Hi{PTk ΁ģQ\aˆ[6 vn) 9<|3L' 1\ tإ җҪ4{UU|?=.U7 6 3ROPd4as/IM:MVC?( T)o౷ЎW\Po,Թe#U14Qneֳ,䳋՞h!R [.)*P,Qݲ*G&/P4 @>Z\4Y Z83u@X,ix߼m>4qkx͏qHGA%\P'3b-aVaY-rHP*W#iSO߳w0OxUz::R`cljhǩɖ[~֎U ݚx$B̧|y,b#'Uhm{^J -+l(Wq=H\IX͡w_{ބ=c> j{!08>4KV]ôxj5&&&>p 7F)PN5 rB) ) V HaPDe `Kخ-{<82lwѿj+X !/ԍ/\j_ic%@DsS2>ug, 6h:%@H5|˲Z&ib4L- X&0Cѕ8JZ_ XuE ' S|L)I4@&ZJ,"1 @ eE BDBzbBr9"Q=ɬу)>dTuq=G+̆^7a=P^ⓝO9Wb438-]زo׏' ;1?`"xxEi^FV5WÇO/`HКH<{{Z3  ݻYxI^C{yEQ89)l8|s"P&aRHa3 F31ڬxsFIW_Ce>eiH@&6g)X=/ٴpMEj4 D(v/ٹ"`ȗʟVI^(b"Ci_CJ\ߣT-&K* {Mk7ߵx}ظq}κ5 @yμ5F,8嬻kz8/Xb0}O"749%]eBk(Aci U7 pA !VJp^tqssBĽgi>Rl?CKef Lgf.eQ,x 3rWq.-=_TsF f\/0j[Y}sf%$1|6B@azSϫBHW7֮Y_zrt >BҒHPUm~_Yxumo}w?|.eE2|ƃe<|[FX^vnɞS\L#p%nMk"煥5)39904`YVQ.im|%RwBh`ZVTm|oeCB4&zxzFPț( +w4MN5eƓ2 Ǐ# !>wA BiBg3(x؏|),*IJ=! p\됈0Mv>Gx|_۟߉m*=9Rwug n>/697n%W2?yO'9qAP9J8d > Je:}U^Y*Vs0-Ds.O4]lan͔AY۲Sl0|j;)F0L@2 K$j8ǝ~haBܰٹk0>Oq6wY,/d) O,{_SJCr qB U=4BsAеn]:zz?awp& ~ |e ňD2)H4`'0A*. J!5=yJ)o188x] "Na[6su'Gf@aPSsMuem>5bsT7^}-s TÈay>ޏp`DXaH$(K0oH*D"tF8Bmۻ/17Xt׬ef5Z: ۬+_F(E x?Ύ 2:r5k6ٙZ.VU|@!%L$ܨ 4xWfut\~E2}.~\A^,Ke6 x}k/~ JiZyG*e&dHA@O[yRISeCCtvu}f mDQffT4jIVE2`>E)7 Mlj4p=۶h<#fT$c ټy G >f3 RH:]#'rs. ΍$ 0t|jB?)L;k+l=Α7y m؆IԴ?:i[?2x$RyKggӵn-cϜDz^DB{7 Tk˹v l!"6\--Nb0cccLLLJz.FFFf$IƮ>\evvYY7فd]] OĩUe àT.)o-Ij(Wj|ɧfVK[(VHy oA_o.34:%-AVC>nsYɶ85x"`>]w,O1昚8Ů;n!c?#>D +Ldhr $fFW> sgЗga n>foDb9z$Lhs01w'&r7DCDy4%oieQ.sp軃&WDP(|ZmS]}F0wJi>А0`BcrkYI4N8$o;\)T]"Fgټu;wok?x[u2_z]?LW7= :tuF$v)Da =ԿkZ\ibKא(7GCR ب@D 0p2RRV.W,ikk0 bx'OԍhyGxg.r!UiW0*rqS`1xNj!je&2R6. hVAW0}?gN4Dg[[kCCt~WDJ}\aXftCK;_tz5B(U25 X* QQ&0USyTwUx\0^Dϒꁪm"dC֬XyTk#BLo /s`6ũTG(Ɛa<'I؜z E>*tgB'}TjnԬJ|>@i_E&`nn!B`jj |]ԢXMڒpF3V_vٔAmbvV&ƉJft ozEm#iC`f3Z7w%c{J̖[8pLL>^߇Wևh݄M㢮'Vwϧ;JB 4 4AIQ"i{Glڲ=f-[]{z%sf]ke壼GaljD" BD 0D sU/UUW7NFUz_~6i/ٳg|'<,|RbrjR غu+qAoOfǎd22 |͘׿5,^pL&SuzUuL&3->fFW %w޶7bU<Uf`'l6a{9G]w)wxu,˪>:9'{/'N Lrm;vZpb{c'A]qzKHJE8h>k `n _ HIS}3Xn`ăxK*$$ rSs+C뢸D?o8lݶ}/L?6mZU~BH>_KEݯFm}R\,8)4#pPC`{R׭Ztފùk[ 1ES}=hVMm:AZM @oСu'>APdmosםw/4O IDATm۶n:6ܰ&$Ro|~YD硇"H0<ۺ6#R`_"\!4ys+/srB,v<++;٢<޷zƗ MM{ad&.Pbiض /i~B@ l&ٷ啉8 ˶b郟a/_ Mx^ϳYdrzd*ۏ0q b"jYǙsyoY}wF :GX_xu X;ր' 10ҤSk{4 GQJL&X,288wyx3SSSDQ&&YӾ˲HM V8gΜAA}}=H(d2ɦMpl6K}}=W@}]7z6\VJ40 BHL$cn2  2 m 0uH$@0q +lck.n}}>dnM8w16R,xXf=!M VW\[1EYXqÕdj$fMs8&%ϙ3(Q-(0{OWnKȄfHJ"J)R*G| +EW=O/?=KdHP YN\ru~ӟfdl4$`h[QLMs|';G?~z">P ?JNO9}!"h9!}bVZ8~9}>eSͦ$ yv  BR4\!p5I.MR*Vpw1 h#ᵷSyoEjK__ymoNyЇ>%]ݻ: yF.0Ia 9e 7(OlێQ,.%ݟb@R"YHu{/, A)U|>{B۶}qD]smIͺ7йnKN;r@@#ufpÌn*BS}3'gl #+RvUƟ̽?y;:'il4+|Da Քr8Sr2:ŒMj2PP.\ ^}POS" dzmʢf؎}̙3UV7u9}4B~ia޽yWbNIx)Kz3?D0cB4kMAp\.8(W#)4JVp| `H$e9w[nesC =M޶F8o*bTZf+BK8" Jїr]UZ G Ɍ\j7ŝ1@" 7*.  ӠT,SRY,T.gjΈHfRDbQ\Oa6p\R@ ی5 q#e JK\]:*܁"c+JX.uY%%X8 p\ 'X J2\/HI@' cG,Y峟,Z5(z=!{{ G{L FNMq\gI X>IG6k'$/qLY{b#'fs^.qJp5+PD&?4Ls^y8 ԕYVWA p t| OHNXs5l!ġ8/Ԏ mBuD1RAR)r,SSi6mDX+_ <$ L$ b6LP03>G0L(K@aYE.2ĵ-INh~2c(Ft<ݤ~50_~&ӼOٰ,˦ )%pL&C0?g"Z8uGT*yLMLR(YveU51+SK2}@)*c ͫf_uݠ{P-G kjA AD ƒ}ܖrsq|1M }x0į-W2JeEޅރF3Kk}M!(cciCF,GYBAA3kش@0H_nu=gYq#ccr`kԷ6sK]sU>Ӄ)54i,Sfjv)ȥ<ZZR0>>Νw͡Çڹx]=mJ5kװb(}7bHgB-[صkuuudK=ˏ ?ܹsׁ "عaL ֑1`&glﺃRHQAE#kbMfrHrWPRUfvF<ĵ^E Y݋x5kc]z?JeϩRBȾ}( 1}K9UR FjUt A$Cud2SPȱnmZ<8z_ѣ(ތ0շR tO.8 f:#WX)Jٙ#j`RO\OEj3gD9b/wQoG{֮_ǁx'/oX, 9*5`rYgc!D\J- ;|)(Z%\Y6S^ώM[EC F2_l ,!+3̺D,^G4a<밡K~tݺutuuݿ3 ۶mG.xG8_8 ըi>gppR8< ??{ԵQbFs'x~UsqQxG+HarHbilunK467sq ;NZrmq `bK/4MrgΑc~Q<铧J0MGYVCBq\:*ضm; ̦ XE<:D)N6vsvugh#/dd'RM+ۯLxΠlnOfu;Bhx7sigo =D7躉 $ "4گ}O~SDa>ͦMɩI"鴯$rkSTh~^cqa>YzwIy U.n|ՀOWU=-kS "% Jix\Y_QZ0t,1_c2TYl p;D#Em̪o~|*WMy\}I\bg.W%f¼lo]COrT!ͽ;HOL\umnrš|{lhiV4^;Ek$aR*X/ c9!׏yT 3hNbBS6(9P SUaVKL3H&e&h⋎ٞ_Ul@Ә(yj^-eZ  F0& 47]z'x|3H)'?I0$c=F<h(D"<#D"|V؅A1ۋZh۶X{B~dY3Q TK@oYmH)fsV5M B B>{ضcgQUUh*\J)JV; Bp ݸRLgy?v+0zoيl!q\\ǥq |[J 19@jEB!k簬kS(h)nM:B GF~eD~P>[r"۶9v8GC 9r*`YK?M׵jz}&U5^AgysWu@IףŢ@ZktVd13,QK=~l}S^1{vA?ay ]HS>f݆VX,Sq ^Mu8dSӑ .J0I (9O A3ȫO`y.n]r Y?"B'r21˦:$9Yh4zR:/Or<J3 Ҋa! IͶqlTT; cjAw}ᕄB_wuq_t)lV.$j)_d/LO"nuleG_DY7fzZ=C;+24o~)|}9~7?A(ULڶL:U, I8Aj:沬n_Tr1̾ܪdF܋+H)!5Ώ #FɱNTMh5BX̖CUndnP3T:'E48j>JYtʬ;K/ĥlp͎HˮxU`0FȨC G T V\ЉzrIAO͛7y>@//+>Osϱ~nfb qk׮E9\Fysv%~ BzڻT K-1b.V{oG|#^c7B`0Ț5k"LB( .MIX䩧szuMˍK͚bu$ $"`qBx0T*PN8IB3**mUr,kxJyԜ{|U̺XzَTdUs)|Dk!\EI+4E_RVH6 IDAT̪K<wc, Hb،(r& ɻmncU}2*CX#,,eLEYjk9W):;k_t2Cj׶pmSq$` eu/ݒc௖aPH _I|F0=U4 K-jvET{qcSP38aZ"X;W{^W5:0"ql %$UuG. ,IL}ssO轺.$`HRM%Vf\*yRDcBlS@\/G@T@%SWSQϾ1jPԅVDvJ-_Lٹ"o+P@\_6 ,x~IW{%2; -%eg͖egkyϫ~~ ^*xΪ s_BGu<ϫ fu~o0WyT'3Y.RM-Z?/˺BD2<7~7q\'S)8L@(ďQ́{܀aɠzYS9=&ӳGxv&^Vs.rӕsU0^Uv1SS6& Gi5 pfH[+xeH$'W?Ԇ|er蚉p«(o=%$ }oM%ULam۶?ԧx@ӴjL(dMZFFG䮻&~eQJL(¶m:;;y5e^ݻwɓ'x*JIK J!AH Vbt~؛ǸP€d2I>m90tE}a~vf/h'?).7`gKx6QEr J*lH+fY>!cO1[ ҁ-۶mTQ_VSX,"dʹp)D4 uyxBN6wDIYv@\ jgG .y ^w"R;\c#^Q]qf uy=<,|x5gaV@B9() ZZhmi|D"A4!_(`6u8̙VBFt+] e8hP]Jh𨩉h|tޟP,) ]7qK Prʙzy hljfp`qU$ΝkY%zM/3͟R,QXJTGy{~5kְ{nG9r(;6شi/'˳qF&&& _ap $^_GcC#`ǎ$I~acRi~ӟO066ɔْg:~EUЯVSJ1>@wqZJI0W-1R(0 bP֐M*&006 |`u%¶s7It-/E[Mbόαvm FFؽt5#ޡdh 3>EHuBnl 'eaQ8=<]uq4MvEWWCCCXEkkk]ȑ#ڵ t]'055Ŗ-[x1M>bzj4ww뼹Β\MȲ?*W.#Er\Pygү~À#-yr,k9{ αv:j1Ty;#G2fks)/bQB*)42[ O`v(9i׫xnC#S5 ә5tQ*RNMһh6ϝG~\m [Պ@L< C#>‘S y¡E) ~{{{b3t"`uP. 4۶q]`0x2 8}EBJphpW'!:g@ n9q6gaEg'uRJFʫr9&''Yv-={5RPc;DaGsGٳVRʾ}A:Tv7z<0 `hx誕8ͭ7Tp0BS.<>df{>q]Um8~8v?OKs %uZꘜp@oUo1Ilrcr2ƺM=Ʌ)2GnVGyhF&(oJMu[n [H bvyC;c q>T M8z(`x<(;v)Du}JVض$g{1,"HŨ{IyWZ¹rJ|Ǖ`-s ݵq0/@La9n$ !ʛi8;@tN9կZrR\`5S4S`:)a~0m !|םQ=gVuH)dettڏ7 L~9TT JQv*`0H!{4 l۩aeg)"@HKLeLy躎:nl{2*^V14Wyo_$IuW775/0`úEr MSSea&mmm H$bjjX,F,;wr|0 ]שT*fٸq#gϞŲ,mƚ5k.kSS w;e*J(/yܦjr.iƿ-,"bo4n iPx|,ff):  S\Bn%OwڒwgA1}b")BZk!j-0V*k؞hVBS"v5*$n[GiصЉcD׮w$x&Idu 0tܪd&''gҒ䌿﯒.ۮ&t."hY+He~~ZhVJfI5!ݫa],rg|Le=M̛odxR s\=kr7@ >\edth4F>C)!ˑ CylbhhCISLMNahZ |  IXB!ώ7r ش_c͚v HP8ěoI}Cyr q$Lp8D3 B`l:Cjb[1<2L>dxx 7'NJ6` !A Ҁ&:um۶s S/73443>$g1 kʹA]G*d*x:U)gj\Wц8^_xB4aP__?+pqm0(JI}}=ŪFrujåڟ0JN9s&JD*P K e],"3),~67|ӟW^axx:]47ʑ#G뮻x׸~\|P03.{/aٿŐR1 %_.NGgoւ`/s3OӭTכrRjg%tAF6U:q7):7F&~Q q \"ZG+|vGOnn #Ζ?ı7bQ%hڹ$JҀDG"מ%bUy;{ԾGv= J԰`ᅲuH\IGd>'c ˕6S og4Nbٹ~7v+7SOq=q߸X,oʾ}R_͈]֠SϥYb:N>RD)#aFGF($&ns]: ZٶM$7䮻ѣwlٺݻw32cEowߍy/|6gqx^~~uzE]vl6 *ڞKl3 BֳqA6vlgp,_2Xv=:yN2Ach'13o#@~2 )mNF xEߡהw,c=?b쉚pluR!nH C^ӞTx%sYAj.ts/ R>T6XQxHCoMG91yK ( Zq՜] !R]SM!PZkOy;P,zB,nU_ 1 pD+=&6I$' =^{?Ώ1;n|>˺u<̳&(߽ Ƕkf/2?0/"<(r;veB(XDrdbmJT[RfQ |>=y睘I4eppS'O~:N9nuXV ~~iIWA1+5q<^4#B'ie34 WWJڊVRc<|{ﺝի-bl۶ ˲Bl&a6^"`cxJ`96n`%!_}et_ =u?,GH:C=1|:7`bbh4J4ett== 388@WW>,Vܹslٲϓf[H$?~`0H(bjjt&C4ghTUh||WR_BJ)9pO|VA\r^HQnRkn)wrg&c`C}H%i[COA]!>`z.^2E%meWЅf?bRN;2蹜Fʦ7h~˺^Ng*( ϝ%i_E'i;k: * zB UEDQ*(Jnj$b7k5 F UqVJ"ȹ3yI~w=ȮF0K<}v=!ŴrX=ڴV(B-B(Kh100=!%ӎQsz#s1ډ|xfD,?dIEd%R=Ḑ|=JV?ܫgc;97:G4R s(%Y$c{l˳UVaf=ޑSXSv9HNcL%(A:~9pq{ݍ$|P('S(hnjBbs/>b6÷}R-W8qeSu="bmT*U^+!|(PVAk**)J2oqHIR|~4) j,lw >$3vm@)JKYUR{/?s׫xEWW׆/8&!6FvpN|Sr?A8lY;F(.*xNeY|8i/}lĉG,FFFZsQ #>3tfR!pc Ẏpm&IbSSS 8bbx1ZolkagO> V"NOw 2߿irn6h!ʗF84N%Bl,|At-f}O"S304%PY/.@i<&ЬuM'.hצdWQE+PD',JB+!kH2fm+QUvq>H VL:TDIhJEtwwc[,QzydY?V\o V(jʒÆᮮN,.-8oݙ IDAT455eᮻvl D :9n #r099o6ѐGa&T*ba5&070٥7d8.i*cWBZ%gY P(WW)N,t#3 }z/?0??|;!DعbX&FGؼ9D Kn\[Bm 54Vkꉕz@ҴԏD(b4o;B}c5O\U$}evҹ#asvT"--zb[־Qk"| U,?w%0e*)$~FSM5Q+C?T xk1[k*5ڭkT@2apm<\3-n[ʼnD*Ҩ2F8Rc"W* yY(˔pGx J!ĊXv?¡ǡj}*^5 rT` WoRi}x+quR^=V;4HG??$lԂwxz缚Ճw DaUR+@Ҙ1-7qIF Z_8Hi4e߾#YpeOrӭ?3cdԌ.f|˒XՄ0T+^a %8֚B@\ndjjQJ2;fj8HUQ)0L #BOSՂb{ヘ|!O4%J1tfjJ[ZHRy% ===KEHwUD{?u~Z獭]]| YR0x_. \J4RJN>MKk ۷ 0 6fggG?O{U½"kb}x'XAc$Rͨ D+t B.fL!$P h2M CpL>MXX*J&SVx[s Hil6N,WB!!uUk-PN;Є%Zz.-ysYZV:8Ởg3h2 8PN L5!Zr~tSmQLRdjr ) >zݻwz:ⅶo}!Ƅȉ @*2<(@!xV 7!Kʐ!H@O 6xHyG.ZfY[Bpر..;V_^@\5 w 0R\!5 .L%- uX=?|x, 7j677G3sE])A6T۶Z0ٔѪ0_*7cor`u<ǎ{n,ˢ|nV~(m}xG,SNu]<3o6os4NyéSgUOD!9WkmnTlƾ6}D1U~w~P҂x$,=<Ss.&{NKo!C"b.?G< 7JRX̢ZQ2TͅD+^˶WMZrbUp9aUr#z$c6JEԁ 3WVW h q @ l2MڛTE&Yǔ$N4҈<054E=ѨUy`ڵcW`^*׌ц_uNH֘J^+ATH6{;Ug֥;ZFZL&%xH59aGyٳgtp0c jWc¬F Xլ@ބe#*!U6K6~[Κ;zZF6fXrB{`?;]H.) DgV]9˃ 󂆲5 Qss-LJ&i _G=|~כG/2=a%+R 2hmf)WàUuB".9#7]IRO>CO_?Ԑ]7&r "(l;vÏԪ9'iii&YbiiT*I< Jfimme~~j?Ξ=BfggimmZ244B022Ytm ˲ 1~x7OkݾղRo4! P33!ɆCڭKx Q~G|E#K⡕&_<BerD2}'N3HC^)C_?aadDr7 9UU\ 7?i ࡇj4M< ̪c[tzz9Upj˲xneYc9QSϰo֌=Ng=f'? JH@!h @谷TYJ绪?C 9#jacߚCrЌ%rzQZ\!!71M# z8RW)Z:3F.!d6=+6ŠJ$%5$FZq^Ok~uҠZ #ZQ%YRbzU+ҀU-H0y-*#p͕-JQ~1<{>d湇0M-drjNهĉB݌Dl>)jja)l1i.gx6ԍik6&VصhE1PhMS*IX P 4dx_v_8wwSy{*!ɵUZ!c:W%(U\Ѩw+7I*BT@̶H5XѻscG9s4}4#f /}xZ`I;6)RfL"eac v3Z2=HX\QXhJ.eKXR|Ǿi455Q*(ˍ "T<TS|HRli ޫaӘH$H&cY֦rD6r#c;|[ 1җ͎ j?{Yn;ϑH! c.\/!ώתbUsgנ2 EP'I\*rܒX1jd |:&2htװT) $ |B^%@FUEkEw u#DRVоKQ)v䝎U}=jJ[[2eښ*hP5v#dX5o(^I*iWqu3j$j'mU_z#z7䜋W ӗ!,g$nʮR "o<}Htni6 h94}[H&*7r Ͽf0۶0=Cs:D?a^ze{Y*'bP.-2Pb5N=H%8v--ݦ6ٟILj<_eqz{{fϓ8p},,si,buYðha(hkk!ٳgoe5{β^վC#\quF^^5U5A KiaʁH,n=HB;,fZ$Db6٩h-5V Pk vJAR .V(}#^ހK .´c奼׵|Wk ̻4h來ZeΝ OLʼn86=}޿T*EP\*HX,JkK+AG[Xn*I k)Wk Qb@zMc^aP$aejr0eXɹsTm#GEi'ykz ! i1[rls9R֓ )erXC{t -TEEOj0F,`!9}|nbD%E>; M!Ǿ}n~_ܵm۷֚\x4ŀB8[GQ O0ؿ6ZZKeVN y}Z}[Q=/ ld%)žq PDFM-B՛nӧOe{4L|L&ezDc1*刺 l۶t3HRϦ&ߧX,FPXnX|O^\4 )~=nNЏytCInŌA1N"Ekk+'ODr l Q,K?O>'Od~ >X UacK<ib"d"JM2jZu>8$Jf\In ~;B,S򮄣kq3`]P͸\یsb+\B_.?uc?B$g0DۿưPA0 <7idb/  JVC"se^3N#-MZ\, ,8wvdT os /*0Lsx3gB`j4,(\Ͳ,<ףT-z!B/ʔb#HE)V ES*D-B_°q FN wDejj7C ԪL%xRV@#%f4 ,xAss+ ,Y+ |=דqNnq;=86ҷ,h8BK^Ċfo|wD'&m~иQf=߽Fׄm42ZF8!RJ"x<Ӯx:SnD\ †S՚%jEh9i(V׊u{ȦX\ g[ωacohb %>] * 8h rSV0MB! ؽ{jm03|KT:D::Y#VMp@XyT--)"ʼnh0 I mq9&3$caIe8h0$ibg\P]`f\{g=LϡY0 FkeAL*u|ek]8_J5eqc|OAX2MN~8 G"(j~UYz.` etͫ ] Q|~V~'⓼r àv #Ôe^Μ%]ts Ϝ&8x/ǵ M$\.WDbl9;5JrB)sQA6 b<CG6u+S׿ΛGp詷a{kb2~>&,2 L@#j$#L m8 i0H&ö>#/#?1n<i1|zc&Wbj-6!(tϨV^/qqBp7A4 Rrt~WZmU< m\Xa[,'/gq?R!̯6i&@hnPVJDp94ʶI$,rfZ]E7iJSv+XVjkp '}dC c1[ )j\]Ws!]uճ_Yv|Dmr[w3T千CJb:߻65R JRCx2y X,B'? !?3L˼v'c#, f 0`L3K4a ;?KӶZ Ü,vSMʼnƣ$"c1Fs+;[chzo1( $mCjC0 |UT-s6UKƚWe1™Ma]Gy yպOr* Fıo_ '8v|6?H55DBF| ʅR^ĉMGӲXfLX=mGxɧʍnx[2>1!%-q:;--R6^(iJ̚mTBhnm"aBczf[eT![ΰmk͡*Ӽ}#bx|ys&_) w6c|B#>4H_lnn&---KPh/W;Bxb̦N\%҂VQ mGѾfxflc"=;(Uޜa#}ݍniGKzUhh\]ǓO|t[ = 29mDc1Ta~ho)0+~2#4ut]<*+(קY\@R%ʜ>sj$|ޠ][҄M&Rb4#^>I\ ۩{0E%=܃211Akk+رY:zno57|,kp\)M |T nդ(tdAa|b-;biڡ9APNJhCI`:&7H$D4mISP]Di#Yz-r6m ҫҢ 3Yt< IljVBV5R^!&+א jJm "BkgsXmۨLO)}Q1- V$R Ns3`BDs&عe+e0Jh Г_ϑx,hO4UsQx1:bƅRD14yY.TT\75LQˮ5-/TR4B.[uRk2_V_]V;"} [X)L%!J5n3|4-& aW9eHVAu-#Ȃ:B>V]!x#kwl\}iAoꚾmhJf]˕{>&Bj€U Ӣ) p}"8ؖAѫ>>hhݻ'O0 2v&w(E<Dz,fgeMMM޽Fխ?z1Jhxuu + Nc1S]4'^pC9JO2!c YJ{sp}z5_S9|Nי+-LR4jF c-`cs2ɍO1cs}3/1 2w{- sS-#p0`G"Ρc}m[qvbݷ7^e`kbV3;{ya&u74C"$Eq2dM2k!|l)lfl!g!ˢ)M{S] .앙Qչz𿏷D,IƘ!HſPįئ4m|saFkqP2ƚMY * p?)uGj=^#'ŒAq1Dû%;C.ucr_D:B%_ėPOZhbUQÄKmflHK*NO{3ӳ< ^|;+zUoԴ*0"D"P*iIJ r2<(MԴH5),$OqQh2KDQZ[[]Hۮem7?p *u eƲ,~WOb8ssD"> (ԲVaH )yU!%O= DC=PI>D"pl)$lyگek@TX1mћje.Hk{+gf&Phr2q=/=Ns4Ew$J'=x DT."v2Eq~W"ji6,ifzw~ 8mXLqlV(VOac_Ea3Yh$]lya '3, OAs<0Md*R`Xݻvs噟'Nyikk#Lcq˭s #$bZ&bq}ʮk} O!پsW#s.msV' YZ"LMΒl1Y=dE1?^Pƴ@P(>Ļk@RxXM"n`t':]; *Q?QEn|dR.K,)Xzc[9tpю(,fut"Oscqz_Z:y[rE T*-l]о‰ǙeNOѺK|ɮ2r|HP-G{0m8|h$VB[o-(gnDnL '|z3xmǚ]( y us^fɮWϨ+]Fb%nŐCQCZ}2 aV򥄪L_BZ*A2r\/QBQz~!D7ě՚Lꕜ Gg%Oy㷋O΋ YD\,X+NPӪ JF/kU䘬W)k*׉$ hE,҂mP%@(6dqH7-ꂞ1vhMz9n|Mlc?z4ԓOQlˢY|7aiӐ~;q+jŒGGs3$[BGڌe i5) $K!@=V0&tqުGFFBD kP˲6.r{ s4MZZZHdY BhUÏ^w;s·|3 ۻyi IasK|9>̂_!W)'"jvN̞ŴLR==42pgDۚ(M1x8E''}`6X(-[oCU=ʹ- ;BCťCG}¹ -i@RHᚂD5ZdTR9ϋ/>6_{)M*fMDu]l&g^ -PrG `>o8lP,r zvJEx8ٻ90|ݻ27Z367ɹ) Zg_z˱Ճz rM/.sp]Pg&X-~$cQ[щ|>OR1e9u aV*H))JbZ&d )%-m9fla ]WnJ8T3CC!g5@Rk xG4PFfRJ`1pD"RbbP<"ZIh$qBqĦ2{UN"JF8CPbHZŲ,JN-..b&!8EeYֺA ,4-RiRJ.]]]TUJR"DZ)֡b|8Zk&''Z>X,|5ԒW4My[DcMFZU(ʵq9_ݐg+VaBJ!)BtJu^z}7-xwߍiX4wq'J6Nm__겲;wጠvm|_'\e$ɰZȑ#_A@WW ;vX4Ζ-B4yDZ[XZ\;d~a^xIO$@)j:bsFٱc;KKKD"*SH.Yzzy'| |.e~x "qZ[[y駹ۘc۶m|{X,bY&CCg`f&.DP*lvi=z'NyyLC^E\ )J,*dtt#Ehr,KZ-a;&N !jFѵVh<{MF"?k |m]M7cohѩ)ˤ9D*ëVUR$abER/)U1Gh nm34D1,ӤFNTSmS P/GZ)m4;~_3yX,FZ%Lfpl۶q]28pRDss3H$8y$;wP(>M,..r> ?ɓ'yrqz{zG hq]F \~oIchn!EB!jF/f#8B0b+bKsHi`d2K@QZ\BeFjK196BHL2(sX ;X(0;?m;-߇r=|]Aم X~)** `hE쟳T,aXc6^;jGkidxDQQ201:I_%?Avם_nA RW-bX;#Tf*=˥dJN&3gbU(˙$TdY%" .A썵}?}_(yxF~}o9sw-@a˦m$ $>}"BNUlU^_Dzɺ&xH3Lf%L =&f)̠fA-fpv/0L9 6l?O&HB/ɸzwWD{{G|EOƶmV^ת`xE>g?@0aJ#ѝ{@ z mڱٴ}O?NL#M0oWÊVؒ*2苰T.a+5 ;ګ]oBV[YĐO˟yߋ dCA4Wg2"KhӤes c!LX,+Z3=30Z[%2|GTB)(Wd2YΝ?G!_&aPTq* eDpD"A^<(|Zwf9w#\R8B H,jriڨD1:D>f/AC58#CChBPVyK mMVOQqJue+-^ Q_kA<c|3 2E"(VQNv숍X dߩP`8!d7Ώ|]4 =JRfǎxGVC :;; sGT*x˕+Wطo}}},.-aⅣ4|."/]Zrr,F0jsgn4 4R ._|=&ZԠAl mخОݗBOw7gT(kW8tjmxWgV(q}H,ʵhK(xR^=M*^-d[B#?WVV~(m 9Ƨ/W"Ƴmz:8pպǹW3Ռǃ B2>'j70G`ZRiq̙_hF0 7{~套PJHVa4 ,?x$!CObT@44p~$~rԆa-~hCECA*mĞ<| %QA1E#$i&=kch ĺUUQ*2pkQӢj*JYX9>rG%}БD)MX #baDl)0nт m J A!%f&:.JJk +u4=) T{K\49ɮ6)5=ca]xS 4پ>2rϨBmYJ85ZPrRoBfp#)fԺп9)seZM[FT} O %}K:tavC6 O3p"Qb1gG{{;CCC\~wf:D6DЬ޽+W8`pp˗/cxYj(ؼy333$ ;XXDz,ؼygΜASO=IX+Apy}Q{Ȭfk,/efNZ &3;;d"{ܹ!.^dh[pO<8ctvt{N 1C 1;5L "a{1#.j0L`av!C*C3'0N)$CMԶ *iyZ} g59nz9G [6C-YiqCvXu3 $6]\iWp/Wީ򝫧0`HF `H"Ǐ׏u\ 0,FFTTRf)dsLM 0,I&.]%tu%%i.ש#$Di]]"1=$@m7t_`;%"965◆FJ[ sKT+u|_c ’vă~FPZX,ˢA#P\$iRwnw(c=R <ibiŮ>txzx4l̈iY&m$i[`zm}w0uz)JH9J+duH'Y]\ڕ+MO ˧T O!OK'pEP`E_K0p!k-0^bW^EJI<gxxat*a0ȫ+,,:,ǑDQ8s a088}lnqNmYCd 2ﱴ<ǥMVPkaffX4FVŶmjzkR , %!i-a֚7W (8w4 ~ʯB#فp-ҕ /66%<ʅJj=8 a)%"\5ԙNCéZBM]k#* iFI$,-~-[#¦4AiMZVu rKtwwi`xB!Dz, W>y˶8uO>$۷o[BEΐ/֡"]=xG-[wYX\BЖNNN> 27?G^H0:j6K*X^r8y<)m;LEF{=sڴv2R+82y/dʴgW>-MS?w>ɏ1;;ˇ7ޞ+LLL_5j>e1~Qؼb.L&LOz8S8cɭbEbؖ2|ُ+Ŗg~4UGNg>q"o_sp?#Eq|lj'صk\x< L5|;b&#cػJʹsx'twڱ7طo?L{{aP(q]nh\>G2_*h*"^K0uYJ5` Pךq#$,bE\CZ!)fFZ֊X$&ҔMWiB)4A( Ai%㨛8AR,P-N"<;i0)A)L“`&M,\*1}vދXhD)-(]ϩ0=>ldM#,H-BZu_Zio,4. ^]' y'T|0:c?MĎP *[nҥKlٲM6~Z|g?\gHb8 }:W\,v4U;֤m0S*}_}VIRl߾m1?vێY%LevNǦ^f&H>dyͶ;(5Rݸ:sl/C={,αC4#|Efy F4J+t/10Oazq&ΞͲ3!WqTߏzȑ#_%O>$f|b* Ο̎;(Jwub[$XMA²m8]jh4DT*E$+4p5JRy MI0  iJ<#fL-dͶ$I;Fmq|L$  _zuIt:AR^<7ɷN1:2֭1:[b^'ljb/]1^|}j]Ζ-q"ÓOmF [:Y+06vo-y&=i*&o /eW,W`=8A]2u? h9n8TM#x;X'HrÏM,envB&8]9s_k ׮cGLztJrB0965m{.BxrS㺜=C<o~xN@!, I\#j ;NN^/_B/"r0WlJ>6IDkK8Gyx.zjVq4.\gce5;~8+++| m?3vX-[VLLL2q#Y h!ЪvXAThؖX,"i` Q@W5UQ\0$ z+TE,!Q( QX(!4vJBDM)(MS.^KЬ}H4[a5gfzR@ ׯ! Wx釙kpɎ(DLSz]-?'bh];+*%AwWG5O.فЅ!djR֍nDl,kyY_T'>8 6$K0M48{4>7T k@γsMcP>F74NLp?IJ 5Jh -0C&Yk>a0oMe*Z8>umf| %9Ujy/0fq*B* LCΡѬ6hS)QA٠pyy|> *E_5o1ɯo8[{f:'}cCfu]~|뵢ji"._RJX1"FhJ )8CT{5}*n(#A 96lh 9 k6$1M$uk(ԈFV6L\WZ|juj;QAW*&{55/ia{(4ab ɉ'nrͿ?7;w{hj6\f cI)C66VnO-]J$B)%V97,[G>wJ¯GvV+e! lk)HtR*a~&+C)j S3w(0x?g(%c|f!ѡؑx$1\A+_/~U^x1Gk5ucǎeT'![Vͯ:A 8dЃaJh 9!#TP6u6#aGst6^Xi> OuXix(#>E?߹_kRb%GZ%-\[,mǯP-G^" Rj_{ {!VNwD QJގ{'YhPu7xva d"EpKBCgZy㭂!+VdP B DxI髛}sC@0h) U6%Wbf{DE)?R^fi;ΠG E?/0;;K?x\Osy *V,֪SiLӼ?@VYN}uq\۶7 joZОJP(g dcW+!x奣 $|X4_,ᕪx:Jqwng8ց%<<:Hj{azoKK%4O&{bH"eOf Ri(Z׉GIZ0[^^'8_Z}ؾ};ccc낏K]#:> ! Z!E h%$(EP.>V}v&F1ANSPڣ_(J,.,}vE:wbY{t/ernc \.s0^0kc aYXn3s+,4O2[1Zbp^eLeG1Ï0PW*._L\byyW_}vJR0v! D*p=:D"$ n{ap"Ȼ5C]k [42)>o, >dagb-Bd M缯c6ӯ1(\ E*ϥ3bl'XBә`̯y1| IDAT4QEPZ4ˏx?s&N!ˑLNNج.Ж-l4?W^{kWޅE>m|kc99GvR$ʳ=RBYv(|1׬/,1~tps3}{sK:ׯ M79LgE,|{/mVV2SӬ./3ovWx2 a1駟X,rcLLmT4y>zNVar ).a{{};Ahj6c #QQeiO'Ȗ$=JƷ=v^v۸:rǒ'iU;e#:{QD_\a>4TKm̾u1lݚmQl4` I%(܄=N¾[0h 3zSE֎؍MAh5=R #rp 8 ?󳘦Kl;Wk#Kttv_}o!y.3e'#q~aW1}tDS dRfbI-HQV 9}B;'5-ń.];-]^dR9ԢۓX2-"SV,4MڒI>;sNd3 2::J[[˼|ga!`r=JB2d~n_M /28,Mx2Ο}K.c,.۷HԠ^8@q{27#.ux54X]&333@ ֘TqRi9 D GQxXIK53<:h4Ꮧ+Lu?CԔ\˲0(8u |\lcZi _>N^q7j=т܈kYff¦-b(((HGV(qjUߺ7d* Aq fv7`e*B g+h{fZC*zQ`iu_:"X;Tc_K_nNۖB`~Q `ii sacccyR /J0 rGݐ[z˲JU1[f:C[Zn.y;D4L0Md"A^ghpH$(eMMaz vt8>.2D \tt}TkuoѤSi_NPm\grj}a6TWjSdZ ;کT*[R=vL;0( )d:#BL^4XK2R(Ha"C{xNLAj'C=D.u ND=븘uזi0& t(B?Z%P$;3{u_OuCaQѝ 7p<9ő:z"uXʼnǩ],%ؼ%kdt['GðAGXK; [0l}I&inqc1DȮ2?~ޏ&xw7 iUb6B*FQFPriBT BBS$ FV0B&Zkv$IPW 5a{z@ 2 k.)âXwHqjW/bRFl*  Q,,TT aH,&1- tZu:FCFXj62J!֕(D"M%h4FZmn[;&K5re-)dsH)( T^Z6tFϖ4w6ڛiH,7%,epn[f@Lpcݢ0iCa2{h_S d [z!sQ:55F؃ Z"\/-cTJ}m}j5JuAOhr|%R,C9'V)^yM"dkP ~Z #|`߾~E,JgիR]J,,x_ )Nޑ,aH,ۢ|.^Ⱦ}q tuuHF>0Zo=3:?|zPkA Ǜ=M+VkDX[$XC3iSȩ SEͰ@T&( m g--M-[˔R7J)5 Drf !"ZP6BAJ "$&`}Ϟ] aLNNS(_GDJ9|EL 0y ˋͮ1>: 7Mn 4E>Kp;Wuv=si|?2|~rx!fzǞ8*v6 R4_P,<=;0LbjUPΕԧ~hYT RHF@- cl7h4-[?ϟǩQ~Gԧ>CT`yex,N<'ϓسgtW $Ïƫ23#ϣ$|c%z}v&^+"Sa~y6ꛍںL"/-)gpUaX,.,cKE,d|lx,NRaeqrF<en~H$|Vy2|v OkS$rZkA4LΟ?mz[t^xfW^ettvB.cll ,,,P*`뿦2STX^^n%9z(yJM``㱲mr&X6I\ 8|OĶ`ue# LNMؾ};Hٳ5@0Ip:J WZÏ[oQ*EcwXoʩ[C|͂'VOK$LT*=έC$L>î[&j@0T.vj3`B0::V <+a{{׳]^>= >(!0UCY?,/?9!f'wߓz~fÉspODn""'W\W "05R0uLGfp]/Oq6O?yo=tg_ךʭ wmRִMxV.ju\e!j.j󘟙# Kaj5UKp23g{FӴŋS㪔+!d25ofStPJ <:uXrbp%)Za!K('6Gšz"ǯ:*KR(7BQ'bܠm6o0Hkj]R7Pm<)'nH)+yꖽ!kn) 2d'$*,R=t?Mţ\.G64$ocD {->7s*{>ѣG9z(iɷObH\.#j&C\FJ#*6l?!j5 8D}@7$inn!_Z 15TzXߣCw7eYJqC9G$"ҪQZ+PEkRXĺ-(޿q Nkn4ȡ[t ^}v!hC!X((\=?n[8O{Ta-b-xˌi4J\z KK0X*A>x%Jhh<ἷ:Hz T}s=a\8nLs}&'&عst.]B@aEޤ7kwt@0-nؗ]܃kH"S{:|jFᨖzFћq/wr/B 3tޅׂc}mѭwC`{g\uy׻w@l$]$eJ-drŌŎԩӦu$LL/n5$q3MıڎrlI$EQ$-Q.H~xク .Zft5#by.=9r3ͩKjEGD=m 2* wɲRDfV;jcBD/kIkIZ<^vM2= aS\tZ+qf8/bThRv1B5|`L(ј 4PH)Ka*$J V#FP<@ !K O30R)Xћ!t P⍥|]qQ'ب6RJ1:;qDûͨ7|SgNoˆ8\ *noș &;zWpg['+>C =`RIj5i CdduF:Kؾ3 CقT|mumϵ5LaY\\X(Jeۄu2 BT,̶-5\;tiAAX9妴/ZEDKpݼ g&Vԯhy6\f"Wu@qV׳To`)o" ]1jYV[y{,--Qׯd{d{\LSUcMآY+X qtk޾^ }pXI;LP`b)ǽ[0lSrLyx^ćv܃0t^x!GznjO"ٍY$ tu%ҽs)ڵWShhjٳd{ٺo'1a0? &琡x[`0\#'"zz.1 b[z.QEH|uј ]Uc-l;Q>ޭm }bt6DCO\Psٱ:)n]5z+pq L#'sXʧi ^Cl|N|Sa`xɉ 2 KE.O_}+Țt{Flc}iͼ =}jmh DBel40M;ڵH0Viwï~gUGg6VDab! HxX]wdǶ>5,Zxk۲ɤ2lFoIwy;s7sؘ_y+w|`DU-, " 4=}=i޿W^>l>OETݸ]Ќ)Ԧ^B;2WRbBhC:+ &3㭄X2/nÌ[ u9{zV,7)e0c"ppjjerٽ @i gRulꍪJ#zzEsQ4{cZ ,)ˀϑ)REʼX i1$'pYaQ)yd}T*ncvv1qb cc޹bOZ:u4 q#EWO4xy*kr2D*BϠn+%\fG΢,!ԐPk2(h1<Jv,yif˲ ^ʀtOt}+ѺnGxxϡxc, èїW*J-0?O, _'Odxx J)o8~A.]yiLdbbBȟ²6c)$=zY}R7+.-"HP=oSٛƱۇ}x[d2nYڿN͜V o'N]Hƿ1A(/hzi8꫌~ޠVR[*s{<]== ~@p@Rsݽ~cI9Zg BD ^w$ I`$JI:Ai).cۇ(V4f'ƑA{GAx>9^{5F.P,OElޔQdKJiTad=VJ rKfp=׫'Y_D3ع׻{g7U)WNuJA6t"? Pa'+  M?DRntᣜ={0B140c<‹<!u ~gMT>?  La1ڶ:.ذ+-rCզz6JܴlGy]$e4Q]+BƦ>$I4Xl Wڜ+Au,qڹs&J[rG}FBDlo ^zi׵֛F|1Ê5MNs~w?️1n~Ӌ&gz0hSoP>9}ϐ"ޝVJBR4t=ga؁y]6@P$;v`zf=;0=3ܹ /O$%7 JE~f ՕPX0tL"BLDh0,$V$cN#.Ÿ{8ye ;F,\.JR(mPk.fg"& }LD9wݵI8P.4Q,ٲe J|~ϳ 25=S'ػw/gϞ%=2 JX,p[D&! Ғ6)rrvŭ4L7 ha9T%.;{f}=W ÌͰT8Ǟ}{0 W.۶oc|l4 6)"]'67{Z%E 5fs|k_AxA%$Sט%yr \<*I|G5G0cHG z:]I* o߇ҋl߶ݻp%FjqM?;ݑ=doo:^E~uij 젯g.7'Wϴ߿]>bDB*7O< w?~崒jXM{ロsg_>=}KOϲ㮻h+W*/?#BƯ7j~b&'~VR4Ke lݶ~\%aY0L'^T*ǩV+K%Rsr%ݝb~.|0 aN:<~%;F6enn.JǿѣGp\/pl߾r̮]#駟f]l:s}ǎ4LRdxm]y7iFivlo?h1Ps (¸:n`/lT^|Ez>5gפ5 Z*<*X!Z#1Ne݇k'R5P*D "P6k切R5x-{1re>?O|-,p044y}-J4.b9Qd !¤7i! (J1<sbaa! m0v ߩj5D #C $eacvv0IX6L T TD( ;MW ܚ$bC :i ]VK'>U7Z0?}nLiz+`zjB u\8J)Ν=j$[Blln:+~Ǽσ>8eYAK $Ngy_Էb=ٳeű,Mh}eh87c-: m<{=wy@"Vvm9;AqqQs<*%J:73CO:M+I5a(OsDXW?CxA,0daB?`vr0He3(--bm_,FO=$!'5]Tygm je @I8APo Dupu=O>,kض8wwhZLOMG,vZiM'| ]<'xӴ2D p2M`&lbRLMNQ@,.s04"ج4^(`^/Zz*P#v#aI(=/L%WF.#3q}|>Ow*ERfxx4d2A@Tj*ߩC?1rJirqo4]r#G8q_/SOTO1fgfIگϝǷ]t':0ށGLC& mx@ߺ7R^LdHlou:+mc*y[9`v!;4MkpXzuU4ÿFeq^{5N>C  /Or)dANe8[q=o>F.p(Cҕb~~2ɦ3FȅySt%@?bMӈ[BbtŅO5t]ǝtNXϒ(X"{;$B-LL2?Rbd+Wc~fgOqȑ:hB'Nz<2-|!طn.]a.F3t XH(=W9*X4 O0t ndut*MZ!ϓ_s𞃔Ke_8Z2ߊ9 X*277G~Μ9áC^"IL&6}KXS)Hē|3㛏 Z4_&"xFdw=޸K>} gJI0/pۆص}Tu4Zufז==k$+V/b-nerju/^tx:e?k8ѳ6ˬF-Ij/FR?v&_Ty_jshjQ^xg]Yx"myZ*IqYo %(t1MTyYԹ{e!'2}EU"*nl;atCAji6fJM rJ<'fLNMa[zA(̰g]UXI2ٵi+[L7 %l k|E~߈PxJpj} BGS %T;^[iY^ۍ&#Sk~| 'oVex!;YzTZ eL{kVRZIE(C|ϧZP(9:+:F,kWn208(իaG?Q=xJBMT$aӧ{J@8UD{=gtCt?z,EǰKqZ3 R=ǶmBPRB\ xm!㼶;;1-s$n4euB\ -h+M#2=$^RTgjV4H$☆r+RZMBkVo]P ˴җU Coo7jä6/;brVir.O,aK!Sl$JIENDB`muon-v0.4.0/subprojects/meson-docs/docs/markdown/images/py3-install-3.png0000644000175000017500000030530714737503617025342 0ustar buildbuildPNG  IHDRWD pHYs.#.#x?vtEXtCommentCreated with GIMPW IDATx{dUu7[{sNU\. gP2$xxKzdD>DЄ.F}%z@>$QPz: :] efzR眽Z6304OwթS>kmf-۶x6 Ћ^#^Y$m۶m۶9:lf\ 0Rlo} ݋bs}DY{y@~u})ur:YX,eQD6ϽZkJkv.JEMy`Y1;;bQ4hGJ(1J)J(t@-\#*U+)q|!ҳĈJHZkt*,՚ϢLTZϥ (Q/Pjzvccfbh 6 ̪I"ϬuDhH[5dxE[75NDT* ZY/\E<u,9n+pRyf 1Q+W,Vw=gm{ܽ bFR)==7~UOocr/)Fk6y6eK D(S#TTk~E?Jx F%IL Ϭc,#L/_XLn})sZ4 DIkZ=q6F+ű𺽷.W-5gxUJDT)QkSRDUT+2#$R)쀕T R*֙295-)RDz&sٲ 6_3t=d87wt-o SJҕz\8$ _L?r?[:H11riQn/:ӧدi/ :^DWɉi=" ۞J)۶m{g9e7.>g]JP Z&T@ϔɿS`R9oi"᝗g;bċ ^"Y9Ewn@dzj5L9R @ߵ;O6hAR:޵-_C3ƈ4]o|~?gyă__3x1n!yFk眊vGdiӀHKV(VwӋAh뿶kOY_gD$yz8w6rwa7^;{ -ZcLGGbs8"8gasdyg[di!gmn6yAnfw nw287Eq ֚y;p֍t߱ahhlkTP_ SП7˲#[3g~'=Z)RyR," ;(s{ ϐ m˟C{f,b<Z8$(I,)߲d S"2Q$Q smRJAN4UzV!*\B "*%Ny0~^=$izFQzb J*Qcc̼gl:/"IR:;$ K],OӔ/AΩuy6>1iD+AP,_eI,^{^C8ϲ(8.̜iGGo8$i-`õ-,i߸򼣣cX4!_R,s~Fl&3P]@C|:m1F\D3{X;eeQnm:3Z} 6zTFVz)v/p ;:8VZOK%H2 =KoK[RPPM?a$`ddS5FR0+@)xlYJ0NTQTJRZT u(WgzMŢXn-]zͳAic~>gt6k {soP b|oo^x[ޒ$Ii_Jt}㐑_ҪU+zիW6l8Y}E,)~=M?_uU 8Y8׊ٳ,NmSZk׿zRy֪zJ$&eȨΗ-V_Wwʎd$ZGHE<hg{! 3O1iݗ~ӫ>嫳'+ `oяAO?qǻ.$DiFg x$lqpv%#NMMزyݖf_?;/~gl" WZ~p͚'~')N}zD},6I,jNQ{i|csi+ڏ0ٔ`Ll ,wXGLЅGics\p-I&@ ,"͜蚉}_b 2@0tci{ыnY,By LnVPM3)wm?%+fcO4PMpsfw.h=Z|#_V}\O1Rh11F,qL33ߥEuHSMlTl4=rIOba A!5=PZnC"jjh`ff6gjX@\͜;]o?ghۂJEDCCd !2i HDJ% 'l~h={d4mb&Eĸ:8uAZ׫4xP-%rWkQẮ*ޫ7a`R F1MIvǠwy}J[P֎9"OzWZ8y{[{`$%+)oWtlݱG}3G^u֊unʖ;;o>x-dOf|.n~-[.i˛;>zjEhYk헫Jj?W66f(96&23s9lH H3x? 0/V yn!Eywx*']c"<Ѵpū#<2x1Fk]g~73" E5kZg@*5ls9ծ>4Ck@WX,ԶcN TQAPEz5ٳ83bGG=g6w~'ًҍv:(,M6Y8y1Y:28Dir l{ֺ`pEq,D,2In#=2::gϞG~^gYyY<ЃݹsXXEeXnx"[e?tw`/{ۋ^m.F3zd{gsNk-,~pbD%yQ^QJq'",s4K,Dm/ ˖uRD1&hm3/vti{4MX,cԘbA;Q-^gC?w>#y DQ z*EdB_(Mei#`8\D=wtmnx:XYwH&YZaRcT)PHmKM߾ Q k+Oz嬈F(U۴4"j(58 \w*9IӲ~>9*z ̓Y|m۶͛70֊y~Z9Y*:z5d|/XTz{LU6c/:D)"R <8- tEa!XZjR)T!=@ s9[hu@>՛Dul^[.]7% vڭ<7&(cc˖/?sǒkEr)_1{nw3o' Z|ܺ #O9ڳgZ Z#<2Db@ ifVq+\=3͝1fՓuP4[J%tb/VrmU'M{YXiU\uƢ\l_g8Vڛ6̬ru}JXXp> 3Ro|}w4F"oa&EERHbH˽L(`eJg8ݷ~M_Ҁ|~͗|[7O{h+bÆ]G?tē?;gDHtfyrhҼ19tg'YN"ixƢpm|a]4m @oo=^%ޮ]VTjKl$^U)hf*U*59 (Bo5ӿtZc˖7O;i>& @D‚_x矖$ \APc33"BD§f: T|kemsϊh"G&&dia!{yٳ63鯔JEV˴˶L8E['_PAZ~}jfk~w΋3gfN׳xjr~{Lf@Q!o6Q2;9'~T"PGv^GѤ[o"!92$oP7lͲGGxaf"g-)PBV)uZ'#%Ag@<>c]u$;]~G>BF9V2lǍ1"Zihz|TpԀV0yz97\!T˵w͜2p0EZc_U`FZDQSDh$)ڇ^7(={c"\ij,,HxE$QZZtfδ&8ViY=)(P 4Rֺ(pHGQdq$=#9kAPDiEhrVk5hin *Vsk2kmJ~RV/6E:N;lfF1*WCH` i/^j9[vf h܏-ҴwR BR4|U'i1B3l]}K|/}^zW^~WK/{kc뚭Yr뭷> $/5L1U˓jlZSZmrTzQT4<^-SoTN6C(a8.1/So^|aaۛ>zunZHCyq#bzHqVV܋.*DN a؂HdmDžT(rkJk"t nZ?8W|g\~="T"m'Pls;_"R,g&c^"k '*FL;3G5RZnpƧ9V[V3sgRrR*iJ4V*UTxxMAUy:0O[%B؉bGaaqi=wEmsO^YX)(BӥXCb+=>#oIr)\T'S\|Bۉny|;w Ti\d)buf#[o[įUe2"R#{*aʷZ O8IB6<ȜSonk00\)m:PoUZ)msk M- <4M?M\꾡ۦZ'v2x6]zgՏaCoݼyR(gZk~]'p~.^m/ AgۙyCeށ%>{XuuhYd"!E"Щ|8P0 II5bǚ O=A_sx,{o i͐e :RT(Ld:;;$N Iq|h%? ,͢(D=gcg=)?sDF\f&5S 5ܮĞ ,,Yr;HR(<7Q4#R*]uc/pJgfa. XOL8}[J骋n9\>Wzji=6k O4="UJEODHiއ(FTȥBRǀLqhE b IB{cLeDtD3Aia `n|Xu M9R$"+1{g-HEqǿ$;p$Zyވđ!*8{q|Ыmf5Ts Rj:Tq&2@ a>$=z'!ϑǣD w̲,H D>D (.TccyF.+~߭d8Vk [s!ͭLpz'!HJs:cqiљ:9D6hibrbN<(bl&6ϣ(&"1dN){D͉Z<;[k2GQX$B!CRT(suZv[|9&KX`j4Dn+{^DYZZH&4DĘHE!mbu3qYNE;Զ%;p׹$jefi]D Q#?h%b,VHԖeؘ~||<2E'Ѱ4խYȍ7䞋'Aa[ti:{v+vSwKRwjW U˭d)vM?#"i673TeŎb}b"nJwd[y2Ĭ&hT'3pq%>@^1ι(RJN)f%9!=^Y'JZCz|K1ilMrRqbND!({42==qtIN}QE wib IDATJTFHT[OhX'MlrRZT Qмp5nnݲy7;l޲coG&MSIhfgYeW4(y@z9}TxR^nyEzltwC%DǷm> [^#X}ͧ?`}۞=ͤK|ڣIMFw ?;wiwyγ,3|ӟ>s_׿MskVoșKYҜb-5G?T*s1Q=yuB _sN﹕6Vf~>,΋VgDFk$-4գ{'?Ixbq͚5ι=isL8ڱ㤕@ Fvͩyg CH\t'D%J˗/_^, U^\\owE #EY+]H ޓgR_DѬ->O]7$\?絯?yO՞Y}b"CDZ"UxIe/?l> P=yՏ"aN[K?Soo?]}|SO]׽uo|O9婅BJ}3Ux/][h@ӧO~/ͳE% $PJxu[Qmݺu}olG7n0e;k~rNm~Ōo'~jf>u}sh/M//x z{:wۿ}7zŗXko喿y^_;Obq͖|_AED:ɭP^2eٻ-W|uh+á߾eOU:krwKwlټePjǖ-f?Ysmc2 ~<[v@Mz1ut,4#crkRdddtժk_w[ڗVF}HQt򒐵pq5kE%0ᨩw&zd]2cgzjԖhkbrvmͧ/"w5rƕ_Fnt7`o/ЍnQ"2؋{?, o p,ߢ0D .x;gO! p.?ܠb4MPVS6w KXzo۶`^7,q%m=њZk7 {F'~ڙO?acד*x$zByH{(WZ[k(Zz( 20ЫQ "ߧ_|?>$/EH)ahEc6m "Z>cѸ7Gz?V9 4'aE¬V(-@Ĺ/U{]p7!kNӚEuJ+f63@λ@Cxa#OpLJrJ'!D(4˧P{9gZ+/aT5Ozv$b jS3,bjHű:s,-;cDYFmW޳;]5,o!E.SQ>R)1Q1]B)tD0s3j[e.*+SPteY'*ud {gR-;hM@[I29ZuiJ"^ *v=y䑍7RaCה"*ilR岡PbJmX;񲾋{BM-kŬjoh)Sц! ‚M~LW\RZ υT7Mۂ@ozsy?%ynA v/6#gPUs{{Ԫj]MCrn C6]݀ զz4iOqy5t%VlHnp9л[lUK>>]s43B[hV|sV̡3/BmUyDJ)R VYg#Vl! y $EnX{ݍ|Q07,"TJY9mmDC" {(oH᰾E<8dZV8i-q0=)c aDNFr BAf'Z<<ώ[֮>U]GuO<;l190Yp#gQc,oYgI45$i▻@$?_a%,-g=)y:@' 0D? !!h쬍D)e|&]*8R;̮.TJt97\έmmlU0)7]lgu~kJmq۟ث;߰ p$NIlaƑ 9 °Dȳ?^ZOVhuq-;2d`ioUޠ1 "Y]/!Eef(ݠ.3m ,Tpe]Z;I 8$cYI!ɲ 5#3!rւ6 O2s"xVa?J,zy 8B q W wfnp@o!@P_ <ˬJɥ Ry7{1xy5R: &)͜v:k&3Ϯ @SRƘC^ 眹qC՛ҷD.+Wre@߆r笞Zφ.l*W{tGwƭPD"D4,QwІVpJ_φ*zZΣ3dDO4\a8JfZgYR(d^O n"_<N9+ bh0d^@MW\\u9ԀjYDP-\Ft z C=Z# E֗*׊/U5TA`R@rε}8RbP(wvo&gDg&$҅_&75o=("w>3[k$ {sl`{iJsZ>UހCc9$pU1g.n?)*,Ak익 9îQix[);CQm E|c-myX3:Pz->RcB"5őo >22!_8V(fY2vÍ~͹W?ȳ,wu62FX,˲LDA\'Bm۶-U^[+t:Kmh*W@ʡ,xvtDY<&8RVYk `qmt>l|=gܚ?s~r {69.yR(cDH)eI?纹3i`IQKJdj6OZ8.BDh&"ixsRiC2Pjbeg=pNC2`u5`& [8ƾgϞة[f0{ۤPpEq$"1AoIvP4u"8z=)Bf"J(JQ{1&I1v*We֧ƹ9eitϞwl`,Zk}ds{ƾ,˨;#s& 6p$ɗ)iygi1)X 3"}PQnx陋9I@teZP4KeDSWJ8 npUf1gi'IX dyh?fya,8N|ZkTYqqYE5Y)FHF;$1dYND".EY5[睳"QP).2DJ)"Ŏ=b(6ǥ$ZɝsQdXk,<un]׽!TDQTW\ɬ, qE=$6'V(.k]rq(kHs$r|iDDdș6&49-[F^Rz zn-DBƤۢi3cScZ7Q`!{f_,v,Qb7+T=$QxoFZ)OlSZOH$IYH5:tͲg P-3ͭ ԈNΕt ~W.QbHSmtpI*gZ`(Vi~\AZS]Jg 0 y h{ C(p ӣ`OHQZOq$ޓ< Jv?g(by>YVogoѣkf C9ZBnQȬvS/>>0dYye-$єƌ_jw'/;rR+CG>M46hFqL.UZڎK|!y|Yb 6aqfmt7\82EHu@H~ }_/5C}hWjReޖQ޶H[*moE8Հ*PH.5TN^TTKR%D\;Hh*ѡ"y۲yvl s`7_-;/ɃߌEi$< J8c%GbA' 5#zg 9hF)G. '\{u TDua}RD4ЃAln(UMU2,zߴn:_Ћw}/\hݺ9ܹ"b1r[ۀi BP>/}K#U~"* ԲH.o 'i R-y[ 73Ƽog?'m5?!nī@EbNm޼ߴ DQ?|ɻ5xjKm!I$,ϳ,۽{w$ιUV}k_ Sӂ.O׾ G/l?z=I?UBVb轿?򑏄8s GS~hJǪH#pQawY/^E&sQκPv_r)tޮkf(ŁH \={E} 1=/*=$I21Q(޵k{slN{҃XyxV""X"(^y%nkuzd~M+ \D5G{w?;Ok3,EuDYűa6Ӓ-.1fٲebq>?;>ͳD,rW( : IDATYDXRx®r2e}ڗsN. '"xEL[{*"m',[25^TJ-(m0UDz"(!"%! {?֞9s.!'W~>99{^{͞{{m6'<:ZR`'\_%~]]]|J$,1&dYN F>%1PNau+v-{^+}^iGn_'h؁G|q1 3 bd-GQq]1:6օp̤;ͣ۷}S`]>e?3{_pWD~{{ҿ[p!_uH6<W[ RO?vZmuKŷh2VRhzUԀHJAxpwB2'h 34GL'&77~K/_MnO~~uZt@o?yMg:)xN/ȟT"ˈ(SԺh&jR\rkop@bg/_8OkòS޵lZb݊kv7͟yb/.jo?q'I>K+}qG]x95NE 9@ A2eJ!. tq\iZuf-Xpl%w;e~oۋxjYiM48Y+2 Y^ef1 17Ҩѥ[o!3(>~ܝh6SP H(-Ci=! R|ƾf;ᐣTǬM8.8j$"$altrywO;G!bRmKvHkPpݿTAt_|B11bU|OW$GI nټcø0?,GondJژ|j^Zqg-̬Q74%b}+P)zǔ+# K#;RKr5rx=?3/׌{LTW]QJ[Z_o~8rÇOe(I8j9dS}fÖ/:jt쟴ũS7DIs/YcaN#AK1ĥ1XCZRϘ#G=jHgFsD "q.+#YN cTʏlZÞ#A}%( HH VCg,eh/ιLFċ'R>+=ΚԹ6_A_,D!0@R(FK| [2#iDYD|9Z\&5x9.G>/v>-"Dx"fd (0 K*/Jk1ƯRDsD#9m'Bٞ`@վxi0P(ԁ&D#EV!`=ueilZM*:ּ$/Ʋ_MSj@a @ ZR;)!8A7 !h]JZ;9xѾBsE⅁VZ)@"* HM-[)HOs1{E7nmy/][ 0+vIk-nr.NTJRix9P-wWûVCr)ة #JngEGSiqIFD3a>9盳ˈ|*@TZpFT*ZtՃjG <n#TY Xqjbt,]!U3sWeYh鳶D~3߱}`F" Di:"9ѧL26* kDze\yp^ 2>J W_&}PB\.j꒕+Ui8fq"rEGfR/O2[WHqme<F}Wx.ve`ޚ5yKw<JZZ-D :NKRIsm)8Ml(6")M#Dl.*< @NM;g#@Y o8cxZtObo```pNWtMY+и=.YYs=35cz[9ACuk<9$"09a sZM|axkf< d1E,1ˎi\j9loklX'Vsf:3֩ DZ?{oy+va&sZ+94lMbرeH, 4H>qk}zc8l 8lj70ӄqADE"$""J)yTDrQ3ϟyÓmV8#p7RO$ݾyP#us?>}Jh!ԊfOTiHzNAMAaA @XNNi"|OE-ZO5j^TjJ+tM}Tl>2m 7wղoTF ˔ Ĩ{F J [kZhTz̧[g֓jM3IoھPVsY2J [yc_ate\^MRZA@a "Y: FYjՄDDsjٲesLZ-F9}}gQų={ۿ18g g s߃%xY/׀\T̾cmosG +?(8(?(g!"7e9ϢQ}\3+kdž;F|Q^9kʈ8gPz\^?2cvuWD'etlM"䘴9rLn}BZC_4b̾_VPx."K4+X!?z߼o޿S=sUWW!B՗p[jY=e_Xw+*kٵ]UU;=_@}s}F"ZUç*]z[~zʇo7C𽇯^/l+֋o;7mA}۱s>x'-Z4*Jo`Sͳ[s Zjf.Uj*љ4j˰[UJ5J)3ݵ|NJ19-of?;Kv=I5o|rpHRJ=,Yձ5k#wןb%;kN+о2+KlgNa'y?63M}Ug)<0³O:ɾoZuj/k(Q}Fc¤\mG_3uʨU)a{,UZj^ߎZnrZKjQA敪c>R*1xt[m_͛LW˘8UPxپ?Sq绚ѶkEGQE%Bt`K"Ăġ@l N]ۿ%dc xS9@ YJmg, 3$IZ`E"" ZHJ.Zhɒ%ՑiZʠbYDcZ~?/aA@JVQ->:KxSz:QRI"+nv ۇ@>(Rz[[fl 3쫖k9E2 "e,XOD*%;Gu[Dʈ9gwaIg^{w=u~}Mlko̐ i6QmCמ{b } oEcθٱc/y 馵NSAk{{ׄ˱H}; %A6(@aC! ҅b :pal׶16jEN80a΂s eo{g5ƫ5!bdU^l!!9$,MrsBΐg8`lUˮ6Ŵ#[U]&w̧ӧ_N90Z`~/Bl+ @$T4 P|)IfՒpADc 9&|f,F 2~irG*gCJ!CD@ W~u<9ϏH=y>&~vYN9:u֗JYZ;ǠPDR~%igVj^5dyg%O+s!vϼI^1c4m.$ ;?s lOճC@6˔"5W,1&4 Ɖesh fgm0teZ{(NȰ\\J`>m+Z;̜$sw;(R`Sd Ll9%-d̹{.|G]opsO<<x]YwO^hYp;`Ƃ#Zk6քAΑRZ 03 z_h-Zhl;f g!X ' `UJZ=0LQuj*3Jv ! ۸Q͝hpRըSnY|;33Rią0=~Y4+$2[\AX(n(b::j63@˄06#yv"idR7aq&I84IH0QZ;mڴ6oU$qϽm*wYű1Ic@Bz?z !$^ ;A9nF! M:iE`ҌꞮmV~fv"#AD x ^AZ"~UJcR"9$ vAahiRc<&Jl~>-ScʆqdtK p܌C6l@5M Ύ0 ϭg]WU${R oq,_׮ZaqQaLiʑ@s9gѨ#IS/2Ř1Io#Eι4M`;rz8Ѯ2^~nR0)"pɦ~ o=ab38 1L?̐=|ػcv3I7~Er _-MfvևڏYʚru(RTPځcrdžk?y{1}Th(I~C˒_8PR΢9DA̎]acīxI3fIh4D/=tW-Γذv^;7Xs|o'x/櫭6M$EIb!"v. 4Z'ͦsY%!b^ ڟwo p9ҩ%!Wwu+E z?cOԖo #ZRt(B "a3y3 uV+EDm]HŽP!f.Ji(@1&t?S IDAT@9"X+fe0hSK*73MSՂ:\$BA)4efUEi"x'$G"3\q rfBNuk鹪~Od]ܷOO폁3gT9D8c/("ZknjرVkǑ_(g(J)f(W9Zc: +@@+5tFbLpO::$F"̝{#Fk6- 1Zb Ġ\T**q@?{<{yQ]#"r8;Ȅ1!,1?zjRJkmJY|e(mZ["$2QZ"dP@|$: r};ΜZ BШו R1KYf ðlIbQqEq|`5bUjR2|RARZie%$R Nė|TL^9K[mj0`mr7b;uěӈuuQ~pFbr-zEbo6ŮP֯G4 fX(R,{_̺Q9kuH(RV,=)oZJ$#1MM"l&"0IAԤ,"^ ؗ0zVWkLX0ZchkLEVku.c>OkmADg6 ֹrA}h0 Z뇻f3) i:f("or3 $Iɜ fkI sN\ Mvxر-aBbaօQh4(M"]MM'Ձ&F}BD*@G6݅zYW(|$i6= T0~;Qk]==z P>X(( ⬯,"ZYTXnlsqaq0>MF~>WsU?\s˙U{]#Pǀ0RXQK1l2Y=<Ǒ0;"lf *Q{:I ΉZ)ٺgA"9rLB$I$clQ/uH8d+∇veH Ii'7DIs78{["YDLakZk0ng- `~gr守"n3:趂8p &?@CNl~C䘔|4x$If44M$O"H9fvV)ju`fo'&4?RCVn6~MS%?Sc4u`(%Ţt_#Q[ޙQ[:'s._Z]> }l'fuH/TKk mPRǩՎCZj38Xxl6k 24$EQ"IIpEFYw{$q>GCЦԆi۷x<}O#(A =zNcţ1:ћw|;'<.^%r*ȝ EWμyȼEyKv5"2Ї~%2Ҁ96^w|fSWX%"qHֈUXZqg;ҁ2;̳s\(^Zal&Z+cA&G29E,6B;yD=LT !`"jE Y1ia&Cgڤiu$ay&ׇ(ckL}⬸b3I `ᴞL:ud7rsjDS8a0 0P9rv8&BRdJ"mo>("D6Sja18Nv &OBW[re\Ģ`XD," ` ۗ^z>ȱ{XbŸ}<ϣ0M@ki$I,bCB$̊a Eq=q> B$l4bqs@@q|%X*PEлɑcwpizc 3(RRȋZFu95iqD.:? 4 T0`^;)Zs -1J jj w:"bRTJҰ1-X2}wԙV[vr^:Ka5} ݮ8֖)UZZv@4J(h++q%33gp3g\tM=̙3gμ.9s̙sDt6!Ea$IN)eADgsVAjP=_!zfvq)$oT!`|$`T "@ MΙQ!;c0_d 3kY9n˪-k^= "k ZBQ zI sʥ ^| ]R蝳鶯Vƒ wDR9""wd }gt`Q;)Fb^ruNV[n?uoZ?\q?^uֽnݺuv\Y(8cR4}+Iyy.q1iյuV4W#efw9a&&OIs?$gG c0#Ea|ʮkj@Λ-#z/'/Uj-vs*Nj>wsy_9uwOZ眫YM.Q( łҺ1sVBl~Ӥ9`n݂F \j  x&DrE&"N1vNvw%hGc)kB#^$#8j4^!i&Z ~ fōTnmSX!%F ėDV7_#7Q=PB$~֊.ȇ^pϭ_ӃZK/t͚5Fa,\aÆz/// `W^ycNe_9똓fP,#@QgC=ċ#b\(I;Ҷ; FHVgp͝;7ImmL$7#$ԇCCŮ._yhvԷV~k(5\s5CTDWm/7}/첩SvqE"Ξ=+/[>H}fc/M6l7ѴHZ˘y x3~zo1ZD -Z]d3"t4gm^ä_?mڴ2,}~GYܧ\$MzPjA+V{ov5-Mӣ:mӦMz1<;˗{1 qNM)nzF`AbA0v:"PRh1"̹{)ǤWW4DQ44T*nܸCbfƘ8j|OVi Y GPu$i&a Kj( 9!(KB5יM3"Ǥ/l6A MS6}t/{qOOwI5(_s9/9 o}Ph`5Jiq3Eq: кARʸ|<1bG<>HP Iu柾W|wC7"i"a1slFQ1MM59KS,sa;GƦ]Zr~pWX"M׽u,Ck_+*1K%MAQ4@P(v.0Hazmnh" ~]D("G>;ݰaˡN%M<)QGhhBDӤt&$iFaM4MSaĐׯK_|_*?v҃q>-"roܸ~_]|E\r'7O_/Ԃw;f͚ ,ؾ}{^?sYf/2-[/puӧO~̭~R[?}7_ 0{}e7cuTD7R`fc(FQO0X0h6]!.Sehd710sM~zӋҐ_=ޫ. s[?1lww82軃?z^/&ݳWxA}ٗ^zR[+_ _RjÆ oxvVoֹsv éSL Dڛ~{.?oߺ?>Ounw ~O~G֡Ҁ+⡆% FA ԊlfV$ꍆyp%̟9s̙Ac7}#[/o濽~ի;>kk,8N]vхS*⿼PѺmQaMk;n-| }.SO}s_jQrb޼y74Mֺ7|oq.Pvکyy׭x!^}]}kgrء츻+ec5f[*)vM(8Y)Yf++V. +- Ce׾ΝpӷMO5:?Yx*#y Բثovۜb:n"E+wtq}hԩGy$q|N?m]]]AOO喯ۿo~bm@OO]t/UouW>.,6g*)5W;gVġmn=1_tqi;ocY9eCCۺF[뒤iY)BD MG0'boAm<?\ *<hOFt CNi RB4m d"Rz۶qal6 RsJ䘔02t=^ءBGy,"Œa@ACf?>}VuOtnjD:!$}{Ӝ](Gp "i|[w0Y 9&= 9rLrKם#Ǥˏ̥s{ߖ_9&-.\xO_q3 .\pݪmUQ(qFp[F*%OՁSk\J{s8R,G&\rwpjd<_rK==:&pAEY " ,8 "r7?8NY,i??ֈ t>r/Mׂqa"$1oGn[|{nԮgfxj|jejekZk!#suaIо6V/]y.e;j뎒]RG;V#T"QO7O}[2u=_ݧw fյ-XCmY}}0ցPW8siзz @U}k*ޑ"zG8*%}Μ>e'-q`2㷔~/m6&:{4wϩ$o<8{epU"5"bi` %(!ʳJ jD\y*\<{tE:D\}Y:P]aDVOo/Wm!G~$o/#叼ȯxյJw_)Y*%?kkD*.(ci@[$A9^}0ϓ)s$</1i1o D~WQUFڸuOh?Г^qaS!i.ԩS!ǤvhYs8aD$D_U 5) "!"R9/#G>u11 0H8!!9ADn; :gz|a2@9F"v,Ĝpo"  )rAUs<ߧ*@ 9 d~ Έ-D̜MwT?#r}9qFRifF̊X2SΓuƱx1vDTy;CԈ"8QtocfŤ#K [$%P;"BRY* :"4؈X+܎ለ0[k٤);sc^v<}6@b3 s[B E@@}AD bv."4I¬v֘0 _0Rr";G~",B=}9qG$AP D2 wftxlV,陕 bJ!8vr00HG'Fn?D\ IDAT幦}2=` "ND!R2"0 Hb8kM!3JO!:0 4IH)aVJcC"Dd%"uQsRDz+^ :;Dt5Z"Mͱ"w/KR Y*9BU`~ :GΩ* s1%6ɳkgO."NTM9Ff+!/59G8`4~k۷S=a[Ocȶ{90g~u? ]8jBs@=:lv{6Y\5CWU"@$`*pwvtϡWTPU2#AET'̑شs (k[8{EҚ'`cyn``F\c:yj{E].O; '_#*l,Wscf_Nufa:6{g_Z[[X896vgvӞ[XUdbݜy;{EBp!"aT@h.mW"2wMO4o6j}.U)U#CtD"VJDV0N[BDzcN{anB<umkJ aJGQP}y`3晥'vz˭[~V+ImU?_^-clA HPD&fp&rȽQSPB6qZ(;gvCMߔfky2z;3sPx{mw=ȩB)ӪgL!^T JUzI^P4i҈ @df|䈬) T!bJQDBPEAUY޸Ry=D$eM38DUSa"UxD\@,2s#16*EGCw> {19ssn },1166N hoZFU"0@n)1!C,d})"S8 T+u"gٸ"ڪ>ƈX䜽*jmğ7jFV)E+_3)*,dU-U."3mceff Y{Q5 (JJCP7WP#Sa$Rkj90~|?O_`կ",DHΩ'F*mssΞIYySMF9DYFd o s_E"s䈔UUB{SY sHW^ysvi!w>|se~ū97Wv IV6` vPa8:oa8wou"NSVT1ɧ"+O|⩧ixL3򦯲h5ƾnIG$6gqN2FfNgv_ܺZsiܬ~;γydc`sc:ñٷhVXiL}MGn>-vC9:`+Ws8gNߡ::,0s, faDD)"B*CAwӾN۝7(m-WeaQuQTTč7bfnl>qvV>X5N3|3&4wd7l>Rs;F]-kg;yvcuC\}A1{ U|ioWBއ4H""9Go47 lnegՅv:7 ",΀=>?Zy`D{α+_gc6W䱳==8=}j;l, ~DD|zmO͖#W"u<-O "y_OkU.|+^|v)15NRz57lSS3&WZv\i~sVkeֈxu6[+p::m_s5?7nV-y]OR[mw8;7u?imqwͮ )ְUq@/VP"Q5Vv75oTm5ίVyG{i_Ջ *СT{IUᬎM96 7\ٜM}3s5^U}j+Y8-յ ?Nk-G?O|)Σ( 'N/ '{?c7|c۝kLq_rް:у6xCzwpڷA~n)ȉn?xr>+{ͬAEHB&~?w37i7FU $H&ZXiYJkŁl_aG&k6쨨+ZK;+-avn1Vko[aY?z]\Y}y697|_\}&YdUĚI))"ϟcgY0i婧'>쑍fsb}iqJka}X+xrmQ {|,io|`m"h `fԙ<0^Eąq8 +{c0z|esQ-E_2mz|0cGč^Zσ*G5SFaP~GCmaA$_;?tO}cY< 3+8cZ G:t0#XS=r|GQs,=I3GflzEՍm!˰ds.wiRX{H6aO$ymT+oAw`U:+Ww'?[b߭ ,O+]RDUEI9M q8pNow}4~[-?99KSۯF۵d?-۪.!=" R~T$8!'D_+x5퇊gJEs*.յIvkj/r_T@VrJEJ0 $±L"Қb"U 1%g!S2F|bVUڨ(% ۽t?sG^/J(28(W*3EQRU8)X wD "{QUB ?jL4S+Ȃ\`uW Adj>\bL;G9zYL>XEfUJ(,gv{/7n8ȖIr):F2!ȣe߮zlx1zab4mbL16Mfff}Ȝʘ7P[=o?a~ۅ%&Q%+eaĬ)2 U 7ms;ALJ;22#*cJE!G+ Pm4rSVڟdÕ+ NDG'·]鿖>dAXHQ.8Ԏãy/)!-9eYѴ1451QdY&EYBm?V\y稗`%73w?oz޼'uo=q[yM%tM<9K%f=" !sQz\eeYjBY|٫4;Vj]oˍcTᖈ=v+p>@#rD]7c~C?~;==|>~?g>>3O'Vm~kq/d?;ߗ}{#t&G=,oU,攘9gFbht*3?P`҂ #  ɀv0"f00Pi`p@Cbs\,a^ TQɇJa.E!P^~uᓿ_>M4Thr70&0d&M4 ?&+5=]QG'h4s? ;_E9cz>]Ul-$ȤŽamVlmz?d#X 8 ؟%2G(/J@Mm[\ ,p;' Jy QbC4,),+$NEw3\NCU_>[: ;xO-wE|ï6B≠LPKo?-T(ULi""*a5Prk5S_2 x9\ "rީjJ9 !TyPPBU]ID}ywZtt"} #^V;uSzY\;Ud kg*$VcB 6vk wqNDι/~FpdfS>bÚ>ȫOG@bw,;~eN HRVgUPC?ނHWl"̌HV!WX!˦o8Ʃ͵i""9E~ *#bߓW."#{aP {zSaU4R\DʮJYTbDPQzlT9'")Mlj%5k%Awd\*$+<#6EW B;EA '=$l`3 &r)%UaN ZzH< c)F]Y_ IDAT)?jqV,UK*ImIѝ =AE{?@Hive #1 9 Ԡj!|5V HQ7FPVб4zN۸ *wzr{3t9֠*s#@JT>iuPFPPQ$䤟-Sf;kjE^É%\߀GWt1#B #S Yzcs޹BYaw08՜s|Av-Ƥ xY&SnJSTk޿+_Q@cqn Gܴ33"819tHBs,OfռQMqnp!M8JEؽwOKZn|wOHޘg-AA2:G>X,zXHY$}D @7'Gi̮4 }t p.Z[{u rPՊ@>cS!?5o޻ȿC˿*mv{o>MERb=nomey4 f Mw;-o-άnFZk~u}gMQv'14<:9J9)A΃j*'r3?uxޯʥOOȥrrrr}\w}1|E~,>j?ϥ9dXDEs!us9V@ݗNCߖ֏ F u:ȁ@ PQzJ'G@Ma 0zMԤn֥om."䈙 ;bzйh4s5g մf-RH!sYYC|EQXԜҮSO=я~K_Ҟ UMTXZ%DXX]e8 6< =U8{$3}X_:K08}QujZ &,/u* 86觻ll_a3Pn9XK#yY1ۇb3ߝ #tI ?s_Q83S }P\@YDT!9Gn}JI9jsrbe: {.%V\z(`ED+G`Ow.5.qf_z[pk*e @,xUPAqD/U)4UPgd3 j3~ XVrHq[ ~7&ɝs1+pJ:"!BGNAcsϛoCzZ9:Sc-k?$YHQm}(}|{ӿr@b- upGKA y6 $J; h!EPa `JQUm),bL)Yx&,Zg; ^]y&q`#S3FG$x)PX9J{S R*C-1*O62W۱<2WgaPѫ~J_UTxbιBcYqQ7T yMU%=خX& GYX65dmwxyeOKe̒7n*XFsDCu4H (`Z7trsYnsuN:걉GEs.d!2aq ǹH5ޅ8W^w V!¦deYZeCt#kl Y|c|З ʠ $Jpx84t)Mu'^QH"{faf"4EQ,XZ-Ѝݻ#s g;G_zD ˈ13;&[$n*Z1u U].][5Ս#G"ݡ'18C ܼHb L-¦O&)y"(xcJFTX Th̠0×؂ܒgi->} c2Fa?XXdYSnh6<"]g7^aEg?}t۽XD]c%;[gK{c};mY\h#B /~]j9dPXB󾚠bؑYD*,"7@eDU+JUc!w>)Frno{!dE>Z#U /D8FYz^/s~֗f;==8=}j/ƇQ1qDְwdt˘dP`4!^S0ԊyW "23TܯΕ1Y}\;mƉrԩ`;μ pTWZV;apT2HV-1*:e6V4-qg㨠Owy}'@FaFg7 DG]x.v]Qpş|LZu1[/,䜱z&;{0SB"G$YYݩ8'm¹XX)`df+x*Q9!Ei# eY`rŻVuRyr+k5?DQOAvJ'Ǫ@=:WSYjdqDP$rs9s ܞvyE(d4{nD;})%@`fz&~.mtY:H~( *@Tg\ B9M,<9˲Vc_ʇLn$r(HceR(Z7[F keY eYzchQsޑ l mb-( Tw(??D,YCZQTw>xIL's>R"$="EӇ13\JDFިymw4Α0ϳMf[DEBE QD]D{o(mR5{Z;!߽f0*z@}o_@p*y^lը5}+V[Nb>sM HklDhlީP# 9T޴TUNɻYa!)Rֶ̲YXU= 9& t_5%h-~/?[_U[5V^Db{UUSJ,whhQR֨zU,zy_WXYUWuݪWc_=XX(ȫɪ0xvAAHa᪪3/3KU;Qo @:GXsˣE0p BS'%҅EUZ&yB%"`ml1B"*c)XIc`+(lVb _I&{T072RR:eTa(0b-sl$;\錹3{*RV6!~:#МXXt7VafXOV"< /o,"/;~7nFkfS((oZ%9WE֩> FjRѲYEY"QYֽ*ј[W$M%IϦ*o-ޏ7ʥAEaN)e!=qb,C@ee9#1dŲD,˲^DFyNA<s~/.*T K 3l_ +nX_E\8}fsTVatvSˣrǞ#9 '7K뀈'aP׆>Q˳v"E[5ș}&=37͉!BZ0ܮozY޽]5v{GZo0:snD is",㔺,BY7"U(KN;&edV-Eo DE'9M) s,B~}"b {s.f(80gy+ N,"f t̋[g=}w3a 6W.Ό*TC>eLa(pd$? {+1`bN{Mw3{66+6Qp;5'_\Xz⬭mˑa|aKi*+h/1W߭`1*=R=<}[};̳ ygh&&&zEaNBٶ $f$BUa!rH ߣن=JףuΊHѰ}Y91sD4N;̩lnooj9QEYf po :;O[; +(/S{afF+#N`F&œepJ,b1"Вp4FG1( ~RJYqU2%mxr("s#綷|*"211ɜpطPmKp_{۴ߑ t%T|E Y݋UZ J҆7OΥqv fo891El6Dy"r1F >;SѰ0pJ{{ymQThBV۹l4l$B"b4Oڱ_mc.hXZF,˲l QW@7z**E"sDQsJEYNNMZm(w'S}m{{[DfxGaքk5_fw~bR+W e6^h6&M4xBH""1X v]WدlfYFD!d")kh`}OO)u]磬;yQB.^(&''MÐ0\@c95=}Vh-;GsisĕWs9$}PURB5E sl#f^jmw8{ݮ5EqСnk6[#Rar{gq5S 9 -E(xf`tYu"m0U^ Vm)111Q:8$S1,e)*"A*9pbp9g+Q3*+7MU Ly(TDԝ~u}gn)Q׷v"aUɷ̳,뷘ebȑWA,h /}a(@F8AllfTS7,Z[mo l7^VM) CDDF^"PEH^m D7YlSm7b 0R|&8zs^rQ0XJse!t{f! #-HA브Po͘\jq^-ՖޗebJ7Q~TPJOG &BDR.q^۝XFcpqbsxjgK[5^siߎM*;QВƋ$/t Pd|r /]+]}P۝jXcTST%rSKdh?GP IDATgVEֈh4pݸDSq{u^W~[;W* ~_E.5-TZ{Opڷ;1Ak#˗.YI*G֔89%ZL^*dQ,[gq檪˜ι&nmtſܫO:uNߣA jx_~|x19?t} `~u\o298`'h幹9DlW``QkgM,ey}A'qy_ᥫ-o$tXh{Wu'ڻ/ɲ-w #`B XaxDcdrGF-8wq5/i18@XFKq^UZ]釤,z]{S~ksFpVŶjy[DF+]LX(|@JYkLOAબΆgmK4b2b,E @@Np ^aVOf#Їw[c"[zD'˳X䆭=02p0@։ͭEok`^"8r¹; 2:׷ys#mYNnkoɵqYk0 b<~$Uq'Q\(V::ŏCWRuEAql?\|޿D{6ok|`)//빋HT㜡_#2Y?y0՚{&̎ş GZkZ*a&qKIrOI E}sRXypzmB]A-%j'7c] D>爸mNشm\Vz#"߉x$yAx#7[W8Mf?|/""}l,{BRR#;>GBX ?c$~jO%& %ƐRx3˹cQ0S?0~RE?!B9D4Ho: _= H\}6&QZk4J1&"avy'Ibfԃ0HKTb`Da}2?pQ$ZA J)0TUA".̘$FfM!H%sIh`4dzkz.crraXT|?H$}]RjNӺ^znryP,.L<P_΄Hi>T%,5WZT)ooፈVuk߶թ>1twmwbsգпLzaݿ׻wʬ3u5"by/t6=2Mk^g/1bKwww5߸n8vXwkZRUZaXў[iDcsxETJQy\(zð."?S˗/[䙶Q*)D]j(@ @<8V 8C%]220±P G{2L{4  ǁn'j d.ݾRj5"RJe?m\ikowkq4tQ)ע02.rk '~?yz ״ ǨQ9$;DO7-rAE֞%@?lh8\.gvcL9Y5V(iXDk/WXD(ZONNyO"LB$dW-PV4CΑ\V&1njW1MHDzә$IXn]qG3I,emAHyXf~1N{,dbsQy^J0 ](ABJޖ*ZX77%vӞ~.hbҀ3y"l-OG牦r~*վoQJnJUk+_JD|[ߺa?H_lAp_y{뭷R~wk`|w/ZI>a}E]H'񭟀M7dM 'lkAq,"J)?oyկyl?{/(?狟?9x?p+ +o{S_G~7^֖~ N]6E+ "vtvvwwjO4E]0 ](XݻjooU{xO}BM_ye~z✂A!Ya x9{2Qp&s$t yĞ6ʍ1QH[pe<1("" yJ˧OMM+W>VWtME < !Ĝ<#gpsT^?^\R D7VUDV*Db: J)I=d%PkB ^}򣇌e*t#å2[-ed =CAEq[ŶJ{O|o;^ו7-w}P(==E%}mzW^}M7իWo3Op[{ kVKe@aVDp;'B0d8Z}zjUM;կx5I ;wu|^׿nt/FDW>\EchBM Xv <%)1VNc+"cY)!TJLy;!K33j&I޸:y..Vi}ߟƘݻrsX*-@XtjF D99aEZ!B+DD@# ǦϞ g~^(fff< Δ"R]d"T*aLBO<o~[$D<­pcLb@ "V)YZژl<'I>)JGQtWZk5b[-תvD|/]vٯ_53/qkMD$n'ҭ[ IžZRCʳ6ZbY_%E@2;\3\?9'rjB!_Vs,%uwxvcS׿th_WG=?{F@rZzdJ@~1 *E$٣LS6Jz.ֺpϓ[h;G+w9"19,  Ml^W|?/"(a*= u^,1cx_.*W-)E$&S=/oeIyIA6qm٣L^Nn? #Ȋ+t=ԁZ|ͅa^8rǠ ")^ZJ@` `I 1UZpMr2MP,Gd*~رn1 3|{XLFaؖ$qIA8N|OHRߐ= H\}%a?@# "XB*&AGqH.׎(cq$ C? ̿=.1#ѷGɺZOgCjh.Ba iQQT}? )0@Z-b;^_kͥ׶Sd&ϛNgчGR_ד$ꪫpi*Bz` O:a?Xf@ |f&8IH)`zvmzѧ1Csx>?dm4Um~sq\|I-"x/bgfj\l*N<^O{[c ޴+/zyLNN60<3oa~W>T]|lC$o_BUJ}c|3[?я~__?Ov϶n:222>A5k~ȍ~0]p=_i;f9M-}`H eص?~Þ7MSSIz՚ېZjUo<"V*e8wY8Î}+^G[g.[.~ʁ?xgo? ,H@ D=Q)TJjj\6PkVw-[$-|K.yyA'#@3qβ{e=zmE]pBTJbUOҭF8c8l>zy: ՚Z6E jaXݱV]cws:Xu*$jbW-OWw `|h\u*>}!U/> Վ#qǺf[;v\k;q"%\ֶ.{_oxݬZϷ}w}NOOG'{{^n}_<=y(2O?[A }Wj7Xcy'ȃykoLa UV =a,EQXU+U0,̔~nr<rl=O#w})?{cg3c7ZDlxӛի׮];5uUkR.+3_yVXa_˿w]yk?6mm7t޹El=yK?[vNW IDATuy^b[;+. ^҉'{|JۿW Қ$^@IT@$Z8$ZDD]m"$l98N5`UZ(ᓅ ZbhK#w~Ab[5&NTT\Z[r&:P\rWOkUZQ _#Ve 2><Lp_o&R(mY*GUWm6[SCWoJj՛RnL=1e[ߵZg׻=|dGeyAAR>%Lw|d(^φk=гzm]@kvsmɈ9dȐ! 9"{ҪjKlj;ߴiu+/ye?p߻OhS'```χ U\0#xGQ#O9L 6ѥ 0#e ~2dpZ0uixC]q',9Le  **ۗLFܷ5#gȐ!Y,+\ 2dp&y.C 2d8y 2dpC73J Bd+DUgE(,B`E\BdJ}\+3th{nWⲶ9mrJ"3(ܢ#[2dp iP5 00"!,ب,E ,̉Dq !"RJXE"ԑ!C ^<:7̧-E1eq"HH ] U# -AD" !" XfFTs i(p'IȐ!C 'Y;?-)'AD", MDXةӐr:!f"䘸i>wڻMD|M-"231""!ѬF/"I5"bF2dȐskOS@Q8 3 6 (B;EĂS""q"MvZg'5xy=MAĚ!C gv~zrV+D@Onq i,D!A @Ec}&1, Ȭ-?ֲxHD1 gYSWJ؄El ABZhΞ 2d83qODEtEhvܜYYW7D u{p0LDuZDM_z[+ 1KԤ4*uDZ}"3dȐl"@@ w@j@Bǜr= 0:_9DBQDHכHlH)ATH:3@EHDJyDLS-VD1ӡ;.$aD"Dq긵Vi "?=C 2PD@sxsj*-"D@mXQ~0Ar&pDEB1N=ւ=fAjE6;5"Zf$Ok-(eJ%мYZ_` 2tNW AЀhAPI,8^!X;6qtT`j=.עȊ@&|_iZ3R6"iB鬵1 V.ϼcqavdnfy"p̢L5ϐ!C Ziv(TDV QV@ /)T}"R<^/I1mI(=/=w<4!@4'0v!֕վ}ϙߓ$DZc󔻄Nwv l-[+cMBJisqR"ٳNK(!Φ_'CӚ.!R)rtHzlI&DE)M [AI [LI$) P/0H"IjJ9PDlEܞ8u]n6kZr둁ci>ܛ *n޶v,m}U'۲y"_gE ;W@DGgY\F8B@"TD٬ROPĊ2*q@52QKRJ-Z\. |O^> 0֘Q{7֘2z01nbQjlaf"ԝ_3KRH)Y el~=;7l[$}bdhT4K#x8;KC;l=ib(/>M,-Ύ/Hwwm9LQ7ֻ>9ⅻo4k~tKq!\isRBDArh!BQ; s~-/Dn\I923DBΣ|tsPrikDf yH,sU0<::^#6[\tڹmSݲnzy {[lΧ%^awnM7i͛`l.}ls UigcGS`M7g}a\rnhMo_[:C%TDzၤK 5.b-dz,H(ֲ1" "ac+z-6qGQz-Wt[!ȅ\~jNlZʵ@#"qSܭpv#(M .y9(#(HIT͝o97xf659Դ}a 2opxpʚ ]}[(=ã;7-MIM;e,xM7Krɋ K{[ӻ_w]n9OHLfYx+[L[_\P 2,ε Ի;BKzƮf-Xvi"," P1QlL=JITW(k{ЛSp,Tcr>us D1ܘ 3;7p"@0;JkvEZg8VTkAh۪Mwlzi/|V=uXTxa޵Oҵۼ[=qɋ݅ =-؜zVxxϱr]38*2s==C6{J|VJ+'6vFlTf+Ukj-3uSW|QCl? Vd+̞M&8xky6DcevGF&yJ).bZ@2~\~ ޢ^7w羚'FJmc-[vo612MkN@,uYfw@ihdWǷj \\l"]rϳuǑw`<12Tt'F]_O*<p!٨iuf ZDo^:+-<~Dϵ2aϝm[ڝ㋜?,;75\[ݥܻ}&_OOJZL]SG†@,sYk2붩Ѱ0+%Nz2]k*ǵzlVvŰ?@/7jր˸3SZ1Y%sU,"QYMDwi '\/ohi\ fm g.ݾR>ivq^8t+", "b2IJ$VuMU\GjR AW1mY{-֜cw1 8D$y5R3"yZ9qx9Qu N А \' 2dpC@SZ)oe e׺i Oe`$ILՓ^Wӕ6BW?^l/]y?hiݳf @ѵIfN P4}G.0ild<:u:[lNb0J[ϐ!C g5>elNF=[WU RbApb|%bQ[f+6NSLVK81W:b[.l/.ouBS"ssi(9rfuUu#C3qjZ+"&I3s#fR9ne'Dv{Զdx?,2݆ 6:i^,)1A8O ئ[D(a2M(6ԪFI\'Q5GeEe0;;:Vts~`%DGTCoiGoӞ1I"HC"%"Jkk 6Bi2vFB4&RZkdu3dȐ!h p+YA]3cz$п˗ROB#23ƉAD$AI,8G&Vke,:sjEW[W[B>t.S(Yם\knDl2n!`GYnn M|1 2dpD:Dy ;bMR4C)U Dmy/x#uʴk- e~yب"l-(T,,ɕl8Z#QbL1R+=3IR~(f XE"c &Ip|0̶"}ӟvHG ERq# s&s{!C =Y"jbiI(DO\COkO( _{@LbDUUk) LJG.w)%:#VZ]|\(ef87@J%FY3HT `C#RJFU)MIb5B@ }T&Jꦛv:r7_\mзucXddq}[GGψ{J(-'-ru?2(XUEI 2~7%D`aBTdIp,"RO)Bъ|% IDAT)б)4jVE< 0s_ZH܈pDo-DYc1IZk`4t\8"cDm+Pj齠hkkƢbSR7C &Ҋj/9HhY+R;_n:W(., !j7[ seWPH;o2k-4"k] 4 $1V$ .ln7ħVHl1iH"Z؝YXC{kL"?{dIVs^u0?Z-2u-Ǣzjz^mAlѶF+[іmT%+䭎ژve[ZBiTsaaae{?Nf|ޫsJޣ3{"Qg!JDf\j$tYJ#rcR}uzmZkm"sވLD$qBDGĕҸ׃ҾUgU E-qZt iE^ŢޓNY?&V?ƠFMUZѻ64UMTDB>dQ 3SGd!˘S20K+W ʜ!9N#  "!(@2$K}cUrs{g?ZkLN ;ᄉw)xeP@X+v҃qN; ~vJ9u0&;$Ws.o|Z.(g{#7g)[Xi%l5jyAWW8vפkqhz1הʯhmXve!d!t{W.~Y=!W]Th)xFԥ"*;r,l "v%Y~(+"rJ`9۽ qf|;'f.>0w^^(Q/͹|ܱ U]__ߣ+z]ڨ ]_^>fsy8Vc~A k= [D༵^isle9aeFjUl5-OT:gn bd6ZځT ?z{ 䦿_`uUMɳ[7}yb^[N1hz{!;_ml.evG3 gs.Lkwvܽ?k-OT[0顝4˺,n';-CCZSk, 1!0qht덙:"&.<~Ic+.ヌz=yOKRGC;3xL/o>eaݲvz6* 酳Kp͝,8֧<_w:x!c!g҅5sϮ?7asԅ=:{'^xtN/QV6Ua' ~!"Kg+_z츭^z酳KG/+*{ߔOKz̩}߂=}Ⲯ13|Zkщs{Bt΅#t:֮ j{PÙ9$,XқUՓwD*̜8 s!˲ $nČ}mmmmmmw #ڴ6?q;wa=0 {?yȉ9g3M'ԗ{Ώ٥ f;vvaz';^}V6 s3 0:`h S=>zTԙkpS3s`܅{ ??)|Q{eYcQE+V3>W`f ӁWp x*0 tӤLun.\|D6k]kj/[puw'mlo vS;"!H xC-8}c!~ئ[\;o]Zk^yvZkZk7},k9[kZk ވ {*бZkuCn9XLJU2SKFS[kZ{I&^&2VU ɑCgrgT嘨ɶH9'*-wƪ'=ܳgr~iZk9ݐ qZUlj]]n# ħWg_~姶|3[g~?YL$Du?\O}~}>姞eU 4o&m}7=o N 7ggL(`oxEۤ=pc~jnl;>4 l;{>c/3;ݱQO29bG>f`w d`yylpw^۱h#Cale"bܫSs?#oտ+}?qMͼwdԪȑ@T@*"ALȉ$"4vS ]{o?{?yҚ3o'f{{|KeD[GOV^jۃg׌dXUc't`/BhŪ7P>^S_@_rՅh5Ďn,5&Ε}ulW7sŎ}{<$Y|zDߣS_xt,ArScϧhh5i5 gN}ǟ8?<嚷yǶVװ\6ldnʶ*:.$P m_?wSso|"/Tysc'OzhɥS3Ǘgy<,EƅMksOlxbWq]=_7np7.cpߗ eh~n7Z|/G>g#Q GO叽tT9p#WIȑ }ˍȰ\T@Aq$?EKw}?*= _v ~NIVt鑝z'blˏ6v~D&{Pܙm{+<\4!t`ִJ!x-:{0q+8|tTo|GmԱӇk}.o)Mlkixw}Go5tU'+H׻wu':bFJ#܎Ϟg=p6 >ŕT8* "*u|m"ȕV>=I"i3)!QAUzB$=s"Xf!Sb1#r3'fsKCES'ZkpyO&ZW-52@D7t@I A*D4lH䜊lc*|섄Q{ODZPr̙!D$s$RB <\Q!x,)Zk+8&͖)ĮQ; 2R@w*^z TO?Mci=\ut. ~vEc;WI ^E#Sda]7U1Ey"J)^9C "9 ǘRr'T( Pw{$֖Zk[G TWǯ;렐=_7W[<2eʵ1e]IP!u 5sDV49~/"{IBvNP{BŢH)sVNR1"SyQܠz"o.,مdck8wdӮ!uyp9-|my[k-?@^Tz~/|}뉧.=uV)h}Xy9 .Pcl 7 $ $6ч(Wl#[o|1DfN@DLDMp9a[ 9%Uދ0VR*{oE9PvEEb#Q9!˲+1׼5O2>kWY=6ٮ[Go+ pG|b6%#"ǿ _L3jԮJk4A.:l fd:e`d4_ Pמz9q~9:RQ. XT|p4c};(y$""HT;MpC1hADYS#_}W ~E(q(]%a]Ҏucl3U$A=Que%RDՄQ-0)nK8GbN`%C?%`3@7Dr )༏1y.ˆ`Lp6C!hQ'r۝ Y&lx(T9EتSb"r,}\M۾||P>=p򝻹||}6 s3U%X(_<.K里'VR\:,!uu/J{{y6lp5y󙹆Z܅oSik7 1_ėV\1s\{Dj#cv>WO`1͔ 5&.VwQ;=C\CNƨ\WT3_/ pbUhSV. nP0vrT5\<@vs$ν[&] >mZkپS O>3VȍuՔN94K8,SsfМb6\&֘dP*HyRZc^:%+!wEk@{RP|J MBEGh^>"Dt*b:܋_VX6tZk}5R0'z~"  xt8#/{P49J">.BR$juD JT$r E<I[u{ffNѼjVދpB)([(RYov7koEunZ8zfa5@Ho>hA@E4:!Jnf:ĩLYo$Ii욲.ؔ/^^i˿Di [vW6 6x$U;  {SB3A3crhR[PӺ6 Ra@Αs۫_Nې;\ePj4$jLPs, p9J229 IDATnԭd/...ixƯKsΞ$f?TD5UN$*DFrPQĊu@W*Ȼ_?WG4~}ԽzM}-{ονwgͿs+5/K]BzO/ر03¥Rsa.?Nڹ@ va(BS*s]縕Dwn5h)"!0pK)tH8&\BƜW5l1Fqއ,c(ݩ(DbBNuE$c !ۃ}*vu&=<3_eORvi MP۟ڸxHcP&{h|?y_9wlek/.̎H)1sȥRJ}v{kKҭdgL^RzҪ3/ARU2Gȕ9Gfу]~{~ߌ%<J,d)AC!!PAfܮܜ()+Xzih9"fYf0>x~?;)O TYXn1Ƣ(yvwscea8W8[Q}G_E#6CvlgƇΜX8Q{'rˏ}핮2>:XثI^UVVai֮޵' *e M)1sMM*1{]z0b?\|~C\y)UjCZ% wݷ(ҿB x*C:ER3Q].#mݔfzvu8}$wD-NDtT6(6, ;@@EQDIEա-(µM7t5IdC{ul{kv`aaRc!)LyObojc6>UzFto`Keh}3-jrVNe/'{o4n8Y'՛@^͐頌X7]5ԛ M\/A`57u߮{tsE #`ZB*&a  NMEDwC;߿ fLԼaZk2Y/"\]E-^33R)1;G%afnoa[׏|!ݳaH)"^q-/"/B9FQ=>pIWj:ռQED#?SSB:kez33]I*))tyKƷ*^pCsƘo,ZkX K(v22j k0 ‡ܘqumd@Η-u6;ΫU.=8w)"zpZ_Rs}w,:h& @dW1/whZT= -b)FD!tYJbbB|9HJ1FEr~j*Q7WK`M? |_a 22v֌SKX* R,6AWfySܬ`)<ߛd yj9ϰf~%HcH-V/M5ZkpV*i+4CjԗS ˥ԊdSEЛ^uQ5М]eڕ[Zkڍs̈́qDԺbQDDpO){22."eBVP ?|og~?}}@%9l/C˜l]:YH w BDG5GP^MxiƷEnhxqp:wo'$.YT ")!~223KPt{d {ZZk|,:H:-3",3?( sbDԁCpRhlh>{~Gw_}˙RTI@UbR qifPxN\o3"0|.Á8c4`͜tm=zymowJDJ93 3!8Ph62dV_P?p~$XFܙתZj2}}qE rlk>. yEޞ0Nt%%"-P8TD1E＀S0׾}ן~O?ŏ=K|:O5($PD [ZQ.w1#@(W= T讍d{KjúKRgFŠZp(TXQ@1@r{7jS%wQPQLlmo[A8S+{q|nsy/+J$Zk";G!ˬܒ9qa8%%GM@-LΥ23Ga Yȩ*9b10CP~^'QkQSNJ1܍$ x#s e? ڄ*vj}ZDL@8PH*pDCa)"9r" WUN2c1ǔP5t:UTEDX,b5 ^8tnᵕ^osyvF\=~<u˳3K/f֖g)6Ăvz<,3vC:V}o+ƺٙEXѱI0 XҴzq9ܙjnl`N о[k99H)XD cBU@BVˈ&EAEs( _jJ9JDXsNInRL(ڀ$,xey^9;033L鄬hER !F⵵GΝ?zl`",mT7pvG6z'N̯G;vvtvv+rՓKG? NLjvz,bs~b`vPwr ^<pl.,ЂBoeZ>ٛĴ2Ըuv㰟7g笯[X_ӕѥV P~sC>ZkWjd\L:YFDlhMe9 ( *!HLIUE{oXĉyG(:W+:\Qy'NS:˺EaR`Y{Zf_#8@Ty3Y`ҬM}*uD T<۟Oc_%,0 ǰx /l3ƭ///. .c,BjZ"y8ْy? 0u`glU9!u@{]"uEomm]gnmq⃺0 ;3'#.L/ f;vvaz';^}O8zBkxΪRn{1*/=pF]}P9gg`8sSu#8pm~~ca]Uu𩒕~za}g.>x+wݭFO#mwFqJHXȕeW#-SҚ=:r@brD0"_Ki -\,9"(CQ PO6e}3TD.QAоlڑ6;T_~ &UBḺ(:byo^ɷqF)%B"ŞML/,/:.EaM! X酀&%]qe\1hn+9 K!ZЛ sD_֎ Weym*`Jj.>s>Ht\bd9dXN8Q,\\AKcGX$ ((d-o9zO Gpa~5-B8v,꞊ kuqMQDJ19:WTU,3WI12w UEb!,nrΙNQ(s 8}ggjjS|+np;pbU[ZQ>c$u[W;\%BZǑJerGIhbFU 9UubLuW)z$lnAe3"3"Leb| K킗j AUIߎ qk+Эe犛fEɸW nD"g*֐#¶P %Ybz]nɏEdԉЖUA%MHApakZk7w."H̶@[GڽM>26ٹ{UbV15Xs1J!71즰tbJ)Ť"!9J975eXDt$\!Qp.Ŕ4ۉf96T줗'=~vt R׊)e+2]Ej;O~ AhBs w+ޡ/qᤕk.8ULODTT}DD ř9*Sz 9%β ";U%BP0 &e梈;%{Rbr{g,,/Zk]?8/"d,ȅ, AxUՔ,Z9! y'J Pk!yB VUGNkΫ̦\ڴ@%!umɇܥ *`(\JG +zsQNӤ|e?A/AT*ڄB5 s.ƄhL>yC說Z Ҭc j*EڙEX8%vrFo7%(%N))h ,Br=쇳MoZfcty!Z.%O lʼƲ]%9",:Neȉc3VwƈRb!bL yH1mmmŢ RLZkIoKQ "z#` әRK!%$Sᗼ=t_[ެU`>nQDaNZB^V1&af:BpU|9"L)mmm,enUn̼bሲcK?fȼE8D(SeYf]lmgKJ#lk6\mvJݸm~;m7)\qw7gc7gq엑GG<_W\-6lZù^jN8`Z^mqD"BB ,‚YιN8)JsD11D/Ry7Uu+I㙻SSVycRaBݔ|N>^{{&xLݭ+ߪT򧁷@ }mHTUk8:ru7%Dzr| ~oʫ~Zo{BEaއ,ˈPE( sD9ȑ's++ } !BQ$xlMMMc(By.EDa.(5-\0º*5^UFZ\|)J)_cma'nd74Ocm4ˋt6'ɘK\]^_ʘi Ρ\=uxfzo6;ip^߭:X0`m>+;ht?v£vm m7;>y;C@ӝ9-\Ź3pfqΡi|zХvcdYΑv˺"68˲2& Ւ_/ݘVD'~:nSY5Ԩ[#"$4R4te*gTh*nU/gNzP<9;x>?H=>W5_Y i* Xh^0sV`ыRJ TqΑSP(KSĒ8#GW9"Ͻ&mn) F2C(X8]LEYSADYg$R^p3aoӇk]ބk`em~VoފqMhytsy~ںr}qѓ߽ݬtmsܘdVp6r6/Bc69S bލU0W*rLgd7gOZ/y6.8Ol.N Mzz޵ @}uX-7>}18H7[( IDATKRLYȌ$р\0%1գgYjRgRRHeYkIA5xC )a[)\be,%.9vM@@)alipR.ʿTSRRQRԭdV,tMݷwNȉ!3= !syΜjג6 > |c, @,˲N vԍٳW-lGܞ酳͜:|va2oN.=3WvOսG68vފ:]h&=rhg>n[i6hp|Llsϡwɻw\ ;wꎓ6b' jY+;# !0?xʁlފ|tv(:sD'S\=pO|hG:sk/ #?bJXV@T9ljEK2\U~ˈsEQ Z:wjE#Qee7%9"(CP77ZȻrّ Xf:At1nCGqs~{kKU;ݮ<7ffql sD$* 8q KjU2jQ l<9%t:e ;iwYsit?u'hr cq8*{ϾX`5cTGцh:\yM@H@  T /-E16;DK{q^ ݁GvKDM$<y$眽j5c HB}c؏ڵIշ\s~R,(#rh~ X&[YD>xR BD5Dmq9r^'!g&XA)󕝔e9R`i}Qrʺo21bG_y"4EUK"! >xJExj`^ڒmq&Y_=p.&cz\ 198IXP)ѺPBΙC̑"gvC(B*Gz.DžA(+\Qf2";x5'{?ң3]Gʹ3?EZKM y^sЮV~n F {@DB ʲj6c#nQ( h)hVZ(>ȉ(S}CWmcV!o묈phaDqNzhh(lE]gfL,(H:ѕ<ZF`k<!af.6#"1V{Rd93UQB %+XE%г,hpB(9@ZHl2QbcJN8GmţR^9"IyJC"$q@fHXC.ˆ \@]ٮ^Ϋj;8AX;LeF#beZmvG@aRX0asB=|fYo7Jt !JiSj'Ǒ Y *T؟ε֪Ȳ<˲؄{ǝsfXI sCCZ-;zpȋH$;g"46144 Fk\Zi!3>Q"V""Yt({wP3BQEF~Zk"$xd~EdI-HD^ G"Q3 ba$Uh^B ' y^*< \D8=a,B@|>"|%*DU}ި. *T8s?(ԣ(V #։ ѷ :R~ H#aA<k#f-1ovV_y>Rpy(WPqMFK (۾d=]'Y?.[ru  *TPQ p) uF~T="i=z_hӬPB E:(睋g4mehc N*i +^8<yPB_ I%f1RT3GmӴ,kq*/I'.$'`a@Y8 d=DFviuaTPGH:#UP`xdBDB$1IGND(Eێ5 9(AZJH% *8 H!҈ּD "ĕWPqH.w(*~G I[_F}wm@RƦD!RQܡ"V:}(kA:MIX`>X+k2U9%'^Ͽ:s~žC N:< NeBj4B$Gtc-"9Bx|Z+D(l*kB2tV1DT"Zh.( @g$ raHqF<(n Pl# `B,?Hpܹ\n91K×2*T8!l!EƘs>ϲ<˜sheY403c}YeyE_$IZV!ZV% Z+|hs.(4M-zn3hػg*Nh^0a7 {8~|[l9e*FP)4KD#v \N宓k"~ت| KwG,h>,9_\ϱB 'Rtšte(45ш9{ҥ0Ҫ#o6c 9rއJ)m>gD'5 6-UVVijVK_a:R`% ߍa^=V@L@wQ]bU[U \Sk ;kF{΃0? Si[n}?\/]{ez-̝vC^|Z-?ӃW.{ka?xsوU`duk{ipƒy9V N<B=,j6:}8|G_Gd>^|pWt2xa~[DD|#zu7=# ,9_9:YB8WY_!xRc},QE oܼx#nk˼tc *^~ZX2}9#C5I|/?:<sd{yz]a魓G֥'* V)q`cmZ( RJS ,s s`n4#snE92i|EcfT h@a}?ob'$}tqRc3^.@#b"Y$%vAPGxLyٰ޲G̽s͹?>{AG.1M#U< ޹hu=wvι0&/y_cth0wr+FpP̼߄[wByVdEQ8mb4IvEj(Nj6w DiMX6Ipk;E;WZ 0/ "RHd&$3B:(B8駰G~-$Au%kr d a`Mo' q9GLWv;紛q]{nY~gnV`鵷_>B|8ӎ~_%Clú.x#c#x%_egT^q8veSƣsͲkooY_<0vgf%pأt [(B\ #pO̭X+,q @y'S{yá{yGKomٷp޼y} ut} ɯ܁Qoc`p``p<˘S@dhp"vuwk!ֆ[͡<}ZyZCĬٌ^I2aQJDV:JѢ9jq907A2(!n7 ;l^:h+]6% IDAT  UQ@bDA 8RL?w߭9dO|$m_״e7hma;,mhց p?͡'sCΈzgC3{ȚT8EW?3orvw~n{ s)7~6X|=[B-ˋ>w,샾w<}9Sn\;b̉Yՙ=|;j}޽̒iXo @Z{MDZ4M:h[BZBh "iEQ01h5[YuEr !gދa3#; &XD%Bp-~T:P}ߕw WIN}'- f^w[>Љ?pCtr`u7_2Mkk__00iب438LӤ!Ěfi%<ͧiC{LDkjD16IFw8[ء8{$(b#洋t @"@ Q >4E`$ ZEӟK;+G7:v<_hLgΡldgϟi+K8fѢE;Ñ)5ۙCs Hh"ʲl޽#|Q<6!"J|KDYsfVZ'Idfc$ysZ J//~_/[lĉFWa9 xH~QpT&hs9Z, .i7/[vthtܾ y9GG{|7+˪B"w&(Q&26I]"cwܹ~P4=d Fׁ-[6^a"q1}Ν۶neqƍ;jmٲe]qްqӦV7~\`?|<~„4MIPls`V&HX m' ٲ%ۺeg3ΞU_ RTP±K W(J%"fγ}ŋoܤIu&36o|===^zlF~]|~&cb/_sIW^aÆ[nѣg4}nݺ'NtZڸqSpoo|D=*GWҟ߭v_p)֪ƒK6G|ΝuI! r=qlNy&Ԋq ˧s4*TPXsfN<ֵiB$ [kosÆ]wUW]*\"|+zW9箾4MH)l|kklj  b"㯼U~Ci7y1 |!5z޼ygqf^kJ+^dIobƼ]]]۶mя~ģ^Sw[ <7xt׽oW<洿xEnxn[>?$D@UQB etnqJشFJ@" YsȵerO{q!عS'Q.B0FKBT""Q~|JCCC[nUJ}ē2ny2te/XWWB Z{l> f Ǐ===Z 7n՝J(z`tS^"`6}嗿94ϗ0# 5O#"\r 7P՜sVo~޽{z衻wތ'ȳϮ{ ƌ94M:kYg3<3*;t&&LxѳOɿ? O:m1v|3.8缉 ;~pl`U WB !oNşؒ%K}{gΜk̼k׮;wܱCsm4̼{={XFe˖f3j(DqVM{wsZ}!5*5&=MM$ @–rZm:Mߓ&x9  HV@BH&ZބDH޳0*TP8Bi\AĎ?Edq$>ĨZϲ<[V7nܘ1cN<9}&ce Ɛ0 c9fD:%`&[B /h3fs.ϲ~u- 4EZF K;(19C4M,+ BкgɁf멧ZK.dʔ)іm?*9bP8 Yl"F30hMDL(ZCf C4U.WiRUPJ{6Z&!`$ BJE8kmHgYZFaC.VeY&===[߽c͛w=cƌkf„ M^Q@)Fb<~D^Rhf)\PJ`B񁅡K7Ek^XD)E=GwABVE *tNB1B@B gژVZO3YQE)&m;٬ ZɓOkI'2~bE~'6iS3u A b_p& &@$3(5pY@+riIE'`4 hE%FR*TpҹRZ| $ۢ(Ib]]]V+ϋzfE"UVSJ91QCH4I1D ׎iMpr"ژ[6(IɈ@h8k¢RmOb h >/X+mRcD2&1!@̥)yDqf ,֨YPB %Dz5c 8w1yjZ=I,j<AZcꞒzO޳߳5yIodkܽm'^M )6Y󋇷Go YgLh0\H)+(y$)Y煈hmĄ8twՑ 'FFyј**TPḤso+6F_ !("244\Rі4V1RsJ>3<+֦";jLuUTPqI睵}ڤKF8Q@s.'Hmزn~ݴ1it0+eAD)PXD ,Z[9I@y DؘZ!"Tʔk f<Z1ib1p *T839xByCB]y74g(00=1X'!x"6s$\pQV C$qXąH0 h *f`("QuaTPqRD`pG 4MnwESmVK~,0@2BLY %H5ưx"2/#j@DH)}:9H&p`WC$kDZUj*Tp< (`p/5ɀ;Xj;OZ('*bCHHVyfaf!(BDVĀ$V."/O<6KcQm[f ',QlB *Tt?Ϭ]Ow7f>Fqt1 P"h }# C`.#E>)#$F+%Иf|`Ji SJljTJ(FI;-Z4k֬uryU GZW.x5#1떻T|#yēOᆿشi):m7˕ϱqEmT%\/Aؤ}""l@<G@"` Q4Iw95X+CJ9V֯*;]C5DtsC9UxDd<`!j׿\pA|y gXQAGyșp0D(@$D+bmB$8D@ =  aXudA X$˕6Jw IcS!xuWWI]xyL_ٵgݱqnt>얥?3N-3C\\Oo e(}1fszc$0VEEdxE*5>sfAF^T{`c|`M"B*U" k|w>3]ks`˦˦OlPU T k#5jŊwW_[lr.]vͨkDʕ+?lٲ~3?wo{ۮ]]߼_/w}w?|c-"\rѢE7o>≮͛{mۦDND"㟿ty| `~\=yCy֦^=f3:4UϮx 43n^J6/C+]9S>뻺={$a&BVAk͌ͬ@$R+c"iAb,zpj6$- 5`l>c LDxܫNcn>_>/Tp1s@X@!z$N'O-a4]k>#D?[';3Gaz+| s^׿<> @~wߖtbgYv3gN4l~_ wM'M7s R?=?6n7^O-ңI'MЇn<Ӽ"[엾ŝ;v]<}D0]8cڟcsN]ǾtbRtiZ7=MTU۱cp[a6m\U§Ooxy'xD޹t_xJWwSNvDŽ2󬅨FqmFP8/y!{LoOW3+Z-I,9 ڐ1ISCfl>tUDߺaWv%-'ߺtgM+T81~SXK:gטC9?L͚T5FPon9fM6qt-7_?r?-7oa_烑wBtDJٳgZ'\|vwҤI=܊j}7nҗjժ3gΘ1#IK68L4 #i} '>}¯j1!t"r֗˪.eƿ9>SZί> +7:󵕛?؍ź5f^CAyN]tB18=W+g7 =<ȣ>{_5kرcL򖷼{ko~GD0 IDATV}O?[^.I`/ 4M<Ϣ*m:mQQX2*q#b\Kɏۍw xH4ޞg{1V-g_zM8q^s{w>u^O>xD@DJSV0NӤ^o$X(!l9z!YVZSVP͡f @Ģ{Ƨo+>8;0\(s:ywʋ]ٙACy?j-Wpӧ׾u?c>߆F}3ǘ'ӧyFk7Õ1Dynַa޷ZяϜqӎњr7{_svy.;Na:{׼g>z͚ŋO4+퍍g׿=w}=㜻N? #ŕW^w޳|'|򬙳̼͂k׮,@)xӦM7VgNJ:%Uqf[bï0팉 =cGȁoԆǟYMlԘVLtz_λH~)1Qnp&Im: Pjz Hd^6A"bB#1_ &.tAB6h1 HT@mh|{MZJ Jfλ3s{̳*hYU-bT`ClbԢLU*L9 CMBsD}UU~ql߼ysjjjz;,n{[5||6q6齱gӍuђ>=ܴ|؜V#Q3/o6[eRh#U߇:GDb~K߻gODn7>~.:440::tDz QsdxtUͲȑ#۶m?uLd;wޘ뷋cc;6<<\yxe_}q3_^#OXkw-RЫ;~ޝ[NA?>7}iّMC勿3o† 88==7=3;z<,7)`@U cP,̀VA*Ve(P2Ye#`yk0y^uuYr΋YDd4[&( n׾Dݵ<8?~pϮÛju[//*L/8Zި=,ki:YUzxonT(@0=l#WrPV}ލCs^̤a@-(JC!TYB2<ۃ"bn^0a@¤7oeY*za1E kfn5 3"nZA@".g1?EpJt!%yEΡU)Qd7Zj*eY5ƱHR9"PT@D `QU,Vǰ`%TfkDcD!QEnE$Uڸ? D"XE<>Ri6`" N"#zbC0ƈ;Pv@!VZEETrmNhU eUGPEHZQDʲ@fӋH$5"@렬 DUQE*@$G:"F"BK =E5;oUJ*PH$5u2>I-p$j1͌mMr9RUwV$ĪTo)OMUoǡ+ #'4_ !zZD"H$^p d }:4 2d'DAiD"X_V?IENDB`muon-v0.4.0/subprojects/meson-docs/docs/markdown/images/meson_mac4.png0000755000175000017500000022667614737503617025066 0ustar buildbuildPNG  IHDR >Dn7fzTXtRaw profile type exifxڭi,^r s Yi;˕vRR}&{DŽlZxxtO[}_|=ZS_{r۽H(̍b;J{z ڏg㌓#v|ǧOIJ1OH9Wn+ O%vsV;g?v7R!(>c0px]VxU~2y5?O^*]Y9N,rd_*Sء(;b =h<%{ 5b#ۯ4AL/r稅H,^ pawF9wם~VX*W~>Y^-${BĽ3H|!TH`ޘd@rVWC vor 9`&Jnz$+LԨAs57{%Tr)QcM5RkmbK-jkC``zc7`fiYfm9ѤYVmu&VYu6Hλ{jēN>N?㙵;^5LٸG]SIW,gIJ2g9=9lqK,c0m 3wQ\n2,u9R=o?dm镱GZL}N4 \f9x6"v2b\˷X8+1e+aqKy\H ffkƀhV\%eN&ymj:5  ўw 6 `ʕ," 'Hm}E]k0DyZ%҃K'}%ڨHW<&af<߇^uR=v~)tGk-V:גRkfkeִW X E(zRV(#p(Zzֺ}a;.Gw):JPK?KKZMNzx\}VITbVpщw*}46B=){~f'MG <5HCBo)uO *eQK t`B)xLJA.$J3JE%ȶ9~Z#DH6ukU`P>bȧ>@s[!GhS ~yCjOC-"/؛I( &F$%d#>ԀB8CZ!f*d<@98+YW y.FG_1#BHžP`8z rl d:Y :L Yb;bJ;RM?Zj.͆Ν 1'esk mi.,r*3]=h:3`7kVHMHEwz&Öʹ'| U"K:QHg-yU{82#gSF#84o`c-tUSY! "2 FFQiw&GCwD>:@gXvW,*3 Ҍ/!=°KbE{J#2ɔRoTPQ,e^m}a1\Dvq7{ .Ty ]bk@[Px$& l<1#ѬRɁ {\R7Dp,]L:>@e,$4rвJtf2@5tEn &v@oBN*$#$Zמ'ԙg-ZE [ω_PMZU?jV4,7 uw=7~Dwf|ۃyiH_x] a)HQ !0wqh?ݚ Y1!8ޡ;ф֨eOxOZ1-Ն4]e@ŤA,{*AjꭌЏ|=v1zb %{:HŞB?O턵w=ÔP$nX:;κt(I^:/z?t}^@N-?/[w:})_og؂@Pؚ֝y \ Ϳ>͜ՠϟ? 7kO$-@8ZC!uH) N+ѹɂUhow~]W7 ýUsEtzq2PѢdPqpyA!E~8e-n*cX۶+c웭6mDI~qDpUB>MSy v}tS]ƵvKG1iB.U7~%MaAXo+|&ÈR]؞DyDQja^̂7>"⾢2e4l뇹jc2LX?'EYD"#0U{F傽 /H XRsa5a+:tMpP C:NXN].quכbDŽS7 sݜ b<_Mj LQ>pֆ ǞQ8B$nt3z! u{|t~.ǝV_Nf}*o=n`ahͯW\ώ w#βb.- 3˗B#jA? ox oYZk-eZ5ZT,n.FDrG$-0K_M{/zb+qK?M+{!؝{Zo BwmZg~ +Couįug~Gsa}F3{ky/tcVc$k) 7ݿ7O+ӃiCCPICC profilex}=H@_["vqP,*U(BP+`rФ!Iqq\ ~,V\uup77'E)IExwq7*L5‪YF&r!#3YQLs|׻>+>xEN&C1t >B!81Nx"f_ UUtZ54qq8vTU x:tttt @KCC16[ m#D!|G뎊7 )/+#2*ؘT%N4A4f߾}D9ONF |+DB!BGt%%$cZ-kj(zI$# >B!ߑ A4 CJufiii!$)>B!B|A(dgerq{ywWH21t+1:QbhwODJ[ZQTC%iDDz=8.ښ\.-x^n7|\!^w'pZl(bGGS5QG\L$,.D =#4V2dN0\/=@QUYv~<{pƴiꗿ;.ɯ/3OF!WAӉX,]|8 ><7a< ^ /o.VтhߞGG=ѶQ(*69ަ- Cg ?hkk8"#0 r8DGGvٹs'YYY8NB|-lvJ`:lѭckt7ЂGja"PvFTG:>W;$(7{ܯ^:.B&EhnnIh֬:v1t]z{B"##iniAu, ja>uyV,%FЍ/ PPp8*}R -gADPA {-Vb.Uqx3tttPZZJbb"6 0СۼN8JJJ|rF !j!>s [Q[ 65l訠Xl؜X5}Aݞwql](N9@UU|>_ ۍ6v)6I(xTVVF|^or=U5"EQ?r_r^CooGK-(`)t j]\g݇8=;^GآTAyn qq.˟@K%2Wiդy<fJ\|< !D_5?5e4o`]cI،U7bWWyC&KE9I̋/変|[͈ùILLCS?ߴM[w^6lgNƀ_dC8lƌ_ؾ};  :e Ç ,Q$Au6 BqS9at+|Udx7s=!(vSQ{1){h tG-U!ʶȹC'hko7B-~]bIqD|-B|- àdݛXj?Ǯ8pCӾ~%}UmCU@wXPP|[nHC7jI}?7ŦM457Ss'MMMx ]jeoi)׳5/O6l7ߌf-x`Op{G_{-, jjk)޹Fb&<s?RXS{nƍ˼nco>N;T~0kIIIn c's=OSs3}1Y]*BHH.mz@WCUעz!EquқyP L oFZ>6 -gOE%sOٽD߄@c\O@Һ/ } 7?E55eȩ8ZEQ8笳z)yy:;;qDFF'v簾$?X,RSYex||<ӱZov|h0f$C!5чI(˗5{04 C?t򶁁;ܻ z 8@;-~ׁWPB5Ng j`h|I0 `#aSP֯ 2cCQUd$c@9_DGE1㬳x?àA2y239bI}|5ioo(5!Wf9\V!8)aP/Hfqb%!*E<Ղ;@-tGRF|hNMӰX,/L(Gb7?IR".Bg[s#ǏnMQ@YIQy ~{2&+b3 vRXTDqq1Vf@B,4pSggikך )a~&Bq M(jIJ~wpEA<M]EfڱģAޤhh cbb;\Qn7J؆EJ^|h+N+ՊE%LNe] [K*qHtF~e^C+=%xxppތ|LZmaOʦ9 vH\.WW@&_UUҟqm| wfmOAS=TU1!>.D Y|9.ɓ&1edTUnq$%&xoZVVӧcؚG4s$"2BBe=ʽ{?rdE_=ZZ>__s8ٳt5N|| I|WAhG)Dց4]vaZֺ=|AZZZSX !D_||~<7{/6@aFq6哮ڽMӈa|>+*0 D^uM Jtt4S[WG}}={%!>Rڊg$%&zسjbbb< 0@!1i۶mçޚGTd?x=gGVVv)4M;9zjB @=^/m_JJ`Z#Tbч}P e%ע@kl@uFC?SPcc:o `Ub^{,l`KDݢrhhhrxPNtt4III8Q !AEE9oxOg #ϸq'O_J ^.(BciVEUQ EQxP!B0hB @{.yy$''cٰ*\I&A &~SQP?[!HQbcc@!8akZ`@ \QV*B!B>bvpoR̯.G!BчT5.m B!Bh*W' D!BG( cuD*"B! ԄX-`B!B>*aXB BB!}6Áb ȚB!BAשxC^/{iZn1@IO#8oׄ!嫞;ڿ?}vb/甜S䜒sJΩcSU=[~hiX =4bЯ4YB!Bq<^/5WfHjTB!B>a}W RQ$ D!BW4@QU3}!B!(B o>L+B!KxC7 uvEQ$C!BѧU5 kE%B!BU#PH|!B!f- ]!B!LPCCSd !B! iUUu]VAB!B)% nٰtt@B!BMaukM~ *H!Bg`a5)>y]2 B!τ 00tnC4j: B!B @(YŸB!B( WBB !B!\0աˢ{BD!Bg’Ё: _'!B!.` zB!NsK ,VkLGGw8n|>zr!wnd#A!ĉeM{{{;;;yᥗ㏻]>_z̳=ǭ.[q~V~?>qnmk7z똔[o*^ "GюO yy\sTVU+ dJ_UUEQU9BB`+*S]Sݥ妛xi 4 ^b㏣o蠼"8m0 ]y IiVfo.CuL5kxq}Nn;=Wюv؁[p. !} (]{@xBqB8aqP0x7hmme֭@Yy9SLfu) ~esxf45M;d`A}`!uzzkZ*a_Xȧ7ti36pӍquvћq{wz8ka]Z㶃eJ7$:!'E1WC0n,`XPTU!N0iidfdoV~?KK7v,3h Er?cZ1 Q^QAjj*dgfv! nlR, C aԈuPZVF]}=CeXv6C AUUt]'Crr2v零Æ1qZZZ؞OYYYYY;s~BJv|Mbbbƍ߿>c"#&]eRbcba ʪ&+3 H]}=[m|nɌ1og޽DFDʘ1cp:c`XOnwɈIKK36Itd$;v'B[ß|qZɀx{@u^M~!LYy9?я's?, 6&MxZn;(YSNwA|||ci>?^{ubbb`\npϫHMMjk..n_eS`lmxg7r΅3gRgIIcZyt"FXJ|\O>4/(ڱ'~=FAm]ΞMdfdIŞ=˸ftUQ`/௷܂ʊ'$+3EO|̝?M\l,Oc)8Pd΂qY7 !ĉwa_8s&(޹ʪ*4]gȐ!yTTTvxoFAZj*,^yGY,_Ƃɬ$Z.|-\WK|g<>>ogLӏ?βGehjjbμy4m{'?a,_SrCÒf٣r?ٽ{7̻NN?4[Krws>Θ>)CgcXXc~ӟ,_﹇Bqmlϛǂ; 1! ~q#cb2x嗩O?ٳKy|RV,[o\oǺ [ ~>0Ky0X|9~͢ŋf.C~_;nKϊBSa9 nK($ǓH]}=n?qc28= /r 4[1t(QQQt,6ii׿Mh&U+P>`ȑ\ҿ3ja'dff[ IDAT1cؼe ufey\pyǓE^x,I'ى+`zoILLn3uƏ|D GFFt:1 O6l`a\w5 0Θ>fb444n?4{#.b)CRRSN9N3)>#**__~918NΛ1l;鶮SXW]!Cb 2$0 UpȖi\.:].4Mc <'?fn?2͆|3y_q8pُ~Duu"(J=[ٳgI4ư\f^pכsϼΛ1#B fCYxb1%e*^!N7l@Q~:'Nc޽䘁C}a `O6 v;͚te^uůi!PE8KIz N>|@JJ C>x(S` p8H4/ _flR 4@!k#:C+]qO<4N(X,sPK/̨#ay4M2XQ.(ӌ?$Nѣ|a`uMSBa*UUI]26,7dV9}:ְ5>Ndn?\sHPTTӧMg-Qo?$TTT*Ds9",[Fmm-z5plAQN?TV+K-cݴ-/;&?8 aX]Z{Zr*7;=DYy9mu\?t1>EQ[Nŏwc9^1|RzjXl8 `߾}\t,nۇjcXCv領 m>z¢"V<6{FW( 蟒}OQQmWTp\y466لBt]LFl̲ZnP!ĉnsԩs%`Ѐ NO4"-fZJ}}=fF%=Tke%,Y{w.N2W2ơ/ =-ݥ 8ysh)r>k1曙`$''S]]MDd$o=>C|㍜2y2-\Ȍ;d#DFF)'堍4#F0h -Xs|yzl>,oOƼ9sx`">ٰ8ˠz=S}P~`vс($&&rGrRso~8vȠ˟Gp\ BT]Q]P -iSX[!NPaPg555dgwYB4v젣ѣFuY[0 *Q\̞={8`iii>\)hZ?nظnogXV̈aú-DXXTDiY 2ܜy$E;vr;f9k޽TUW3jHs 0tP",,*bݴ2t22HOOrGюix^3\. |N4JvUUr)(|4ݥ 6,0]/ (ٵ CСdgӿ^~ =R8aP.0ؖNBUU|> ̡C:AoooF5jQPXHYY.dJQq1IKMҲ2rsrHJLrFA|\1 ;]ZJMm-Cfpz:YYYX,^/[n%**ѣF.'{kג$//0 C!ai9+^oz1j.vo麎a0odhOžw8H޷Wԣ:ڡG= !8~y^y}CF)v1$=L"gVwG[~ 8껕\D!тKT~!B!D_ G #0 2R!B!B0 TEA Ә^!B!8Zb@z,!B!/=s-KW$B!BCRq0 Cu$]!B7Ba`%D!Bї ]GQa+~!B!f% =!B!13+=8 !B!!5DheB!.B!}"!>Eɿ&_΄eF`jp!Iu4M#6!!pP恏?g_B};VsDllsx>園sJΩo}甡471ÄOzeÿT!qIQUe:!BUfks1V  =)yN!HޑcQ7 @wCkU!GA z:V= fa2;u'!"Fz@Bq4acfATUE>!B!}KH#Y9BB !XB!8ڈWh]0PCFOz !B Bqe(R@`sytIn/0̄%B e%<QCIfF*5BB!8NZQXPTk([.-0D!GNë(8v;U (Ti8 C!G8t]@@8 +B!GX7faj7w(5@!h"c쨪9p< B!Bi9 ] |~Mх8ޯ+BqB꺎ajъq\2]B!αuǧf~?iyo! !hTU5PЉÔ" P`Ez{10zCV``ӿA%//6IOO膟]+QXXHCCC !##[MxT>_',đj!B]׻trX/tǓx~ >8 `qJJJ7oxZ(p`Z7oC֭[trvcIIIa}r̙3;ddgg^#Fp3vX>,Yp;w.ֿoٳ߻\.{HHH i+V`TVVży8묳AHqq1G4~ق]w݅baٔc0 ߏo'77WNq\; fRL!QJ!BF8m 8n>x]vuyn3sLӱX,hY{[FNNv'|2.%%k?Olذ||c?PSSÓO>w͈# kinn6/GӴCnbpR]]M7g}f>7qD|>߷q?38[S9W^aO>$SN%**GͪU>sL4M#""/ٳgr.{M7J1-!oZpj.Iԑ|ѣ+yO<:XrejrÇcۿ=**ɓ'?oz<~ 113g2cƌ#ڶ0uT..\r?zoU?nG+u]ݻz3~jeرWP$CvOzԫNb01'UAfxoV Ƙ1ctlذ?+^u^}UILL\BB#GMh+@$M{3ϤS2s̯ܟmi6nVX/_wIعs''Nd֬Yf@Mdܹl߾\2Pׄӊ1=OIUAӺr"8N Tꎦ /d޽}1bĈnݺurJwyfj ahbgu]׻TB3KCsh+~UUjx9> *t*r:ޗe 5p@ ~pX| o> Uhz[x86CH޿"u ezxA*''FїFhHرc9(((0ożkdggwkW_eڴiv%4+444P\\LSSddd0h ƌcjss3yyySWWGnn.QQQ$&&::{e׮]R[[ˠA 77.lDVVS\\LTT9wp84bJKK)--%--Fe(O~~~9ǏtO{{{SRRDQJKKﱢ9dȐc_u23dݶt:{־}(((V&..-[0}tOAAAsTUe„ QRRҥ☜LVVcJbb"444y睇婧⮻֞={O$&&2lذnN~~>---3p@رc6. 6l񔔔PQQΝ;INN&55q zf6oLee% 䐛KzzzːJrss줰6 &A^^qZ[[ٺu+ƼΓgȑ1Jn&)$??nIII] bbb4hYYYj8mTWWSVVF}}=dggưaú[uuuxsrrhll$//" ĤIHKKq ap^5lk(rV!]`en5kZ-KUO^^wq9C !77|0袋ۺog͚5dddpI'oRTTDbb",[KrxxOekp'sWr饗Sʮ_~]ve(\wuuY,XNuh"233; l,_>-[-ڃ 3;`С'^۳X,|G 2>ru[nUUy뭷x駩3_i7x#7pA[{ 4Mcڵ,X ӧOvlnw{t]gƍ̛7>1c0|p^xJKKINN^xq^us?C-&&SN9ŋc.\H~~>hZ:::?oA}}=ӦM#""M6p8ؿ?s{.VbΜ9466vW_}kbZȃ>h.bܹYg>޽{9묳2^z%7oU0 x /:`?|^/saTVVgɼy:ujʐ>~={7 ,X*.6mڄ3_3f./^̪U1aԨQ̝;Yfu93go6iiiL2~ihh`ѢEdggs}r-t:yꩧ8ؽ{7g 8aÆܹsq݌1ӧs뭷v+t`B~oz@<-b˖-?d.\H~~ 7`7nWsaժU\.V+]t˖-; <=꺎h5z!y B}m*N04i&M|QQ:-[Fzz:?0 ,W>o{jkk9r$<ƍw.㡇EOSS7|3dŊ;Vx ,Xu #c=ƝwI}}= bŊ=.B֮]Kaa!mmmjr֯_ono͚5\UU7n[nrˀXdaXr%7p^{-< k׮J}YӉn#..;{ 2{l ٴiS$\y啤r7v `ν?۷\{ddd+C=>QWW_ϦM';;F^x.\hNɜ9s,[vJ.\Htt4SLaٲez<3<(s=ҥKiii;fQPP_WmfL4zsvt%pcۉ6ٶm۸Y~=+WrS\\Ygų>KEEO=Obfazٺu+YYYL47b8N'++l04{EQx4h!e]FZZ7pyyy^0a̛7{|>22ٳg{n iףi1m4[o+Wt:Yb'tmmm^sxaKW\qfs鲿{/&L@UU =y;v,˖-#;;N}Y򗿰i&<7 IDAT3<5p8-Z$yCBB|/wA`0кukV1 ^(**bP(:u*s^`Æ |!_~Tn]6lVf͚7QFIB <> yQ!.!!KJmҠA :t^zl2IS4o's f͚E۶m=zAedeEr!ld5DFO`wtC; ۷]vٳD)K@Rk[:v(`%YWWXj%77b_H1ZaÆ-h4Jqz#EVsJ^BBs̑*A իaaar{F#YYY|j׮M6mPըT*իǐ!C<@*r-juYn(t:_4h?z=* ;RyHKK~gkoaø뮻<_ڵy'=^ǎ#11Q;++pp)IaðDKsv=7߷oׯnժtU*͛7~֭RGe1bO?4~~~Sn]hΜ94k NG֭=BPTy'7nܘӧӸqc߿BrbV\nd2b sQY$0]vy 5kfI/_Lp88q"ƍɓL&裏ԩPG?K  DZ?aPU*eeet+cR<F#%Y9s#7F2l+o/66\3)*ef lW^ٳf4iҥK=*t:atXV)FBwou1tPoNVV 0}tL!ٳ#O*""˅jn{gϞP=J$xxvMYKi`` !!!En3`/CE5jǏP>CzqSsURImڴ >9oe,s+++~8PV+VA<W^_72::͛#ݻw/d˖-,Xӕ^F*t:˫`)J$?'tJZS4B+,,dwai׶--*a5^vMޭP jq'!KV"%%E$$$F\\/$X,LoNLDO8x RRRBrrTHrKKKYn?> #G]v!xwnff&RwwЛPjVf<) z^ooVYpv=7n`<Ē%Ky衇xiѢ:߹sgڶmQiL4 ^ϖ-[h֬GJk׮Gnw^n%zB'qqW¤g7rԩsP(h4>ek:D^] K~fBV"P]׼NrJrTج TjD;okLp8xaںY;n|Wp)((Ma?( .+))a[Tr?s6>JY;j=^!!!<̙3Gܹs|79suһwoA[H"FѧRd"((H@>cV 'LT)Ȓ%Kdǎ1cu֥sJ%mڴK.8p(ٻw/ q=YX,,Y\Oh4,^X+"cX|HON``Ǽw7b~V``ǽ{'s\sVp5*yt:fϞM@@6lByhҴig\ts*633{]vq9ڶmoALL ƍ_J3P>.۷W_ȽVުZ|܊!LQMrWxy v2{= pA/R0uq:;7fLZsHLJVI~~>yyW$]$''Iii)YYdeea0$x5\rNq.!J'KH:^ T* EE͕UInn.>I̬,N9CbRƒw& ̔=22#Fԫr$ĝ>MFF.Lrssq8w4iiӱcGШQ#:w!@V3 seA@Ѡj}/Qse<>ٸq#fuzKe؅X$<<\RDzVx+|x+:k)5N'& %_#lUy@n4lrł XfG駟(rjբG~z>y w逸bŊ̛7ϣx>H*Lu`0Ɉk^O{pTJ%7浩S bp"dbu];q.`c[EK&Ѓ'if3^311˜'"5*2ދl. } ?KÆ y{,z=g<.]LΝJHۗAO/QV˓O>͛=ֆv8^Qϧv>d2t|gl6FKxXr%[lnϏZjIqeeezE-bʬU op"*/--GEET ZIe\>A4 EO07Jt:7o-[O>tڕ~+W7HcS* 4+WJ6Pv:9s;w.5bĉ 2˗yf)W ==T -*Ghz* T*w@@B*6l.V5׼$nֈq#^AwTx.?lƍG.]h׮#F`Ŋl޼Yz&ϟ?/Fr@L&sagSRC{ׇk&00:uHd(-**QJeeeIJ ՈP wU<3exkR&J(8xr/,UոLŋ,\ l6W33_n݊fCף8\.Z%s`"%WAa!ݻ#"2A$i=~\>\+Xf  l&%5V.E\t *%~~=>K. wR{'Śq%%шp,Ys',4tܺ˗Kl&E<[b6)))K|WĻ%܁Kɾ]D;FPлwo:vD;Gps:>Y,VJbb"~t:|Ԁ+77 6PX|zÇ~K/$[zBAӦM=d2ytw!cǎ4k-ޖ[)t]˻_vv3&&F*ժP(<ܹ Jw96\:wi`ʒzk{.q|ot:`Ŋ"~~~<|+Cy_׮]=>k߾=:tTϥ$tFCݺu9s&/ )~~~FoeJ\Gv;;vʕ+-^g̙|~ysBzy\./˓=z`ѢE9Vދq\_b4ٳg63kڵjrQTj5OƏ+Y.̙_EICqcڷÅ Yz5={ȑ#ۿRӦfr>Z-ZO>¢"v=N>ڕ+Yb;t#IKYLEYYmDYYO+XjO<8دFŋxvܙK0'ŗbed2jZ qャ]˖1rpv;daS)|v-P*Rm5_'--VF }YIx}0p8<54 JJJk{gQQQo^ٳ5^ϨQ$B`РAUzesrr=Kjbbb^QQQR_o9|۷{lLǎ\N:I@Rӓo%55ٳgal6OϓŋY|98OLNN%X,XQ|nxgYիWy뭷ػw/W^%--_~@dpeU ̟n5.T9RjPhZ}aNUXƊ^^UI.??L- BRˑ#8NԮM>}jԻ.bڷGP(HKK#;'saXt0ztyGZ | }`PXXVeO?/?<+6RLp,J%O<8A <bX8/At??w`VV`IX-v;cǎm6ٰa?3%nC ЧOZlNc/|1j͚5]9zիWAI¹xbL0<Ο?ܹsYv )nFYfn:F#fl9jcǎ 0RDPЦMImڴ)ݻwj̘1xɓo>$}{!007xN:Il6^u~a D޽INNfԯ_LllOȯh< ^^挌 ZX,?Nzz_kjRgs8 X,_{|UΝ;':uJj>(k|RVVhh4ҪU+*)Jܚ5k۷/[laҤIӺukmπo=g.UV1fΜ9CrrԽ^X,a7[n[߾}1br z) #<3ٳg9r$ .>cڵd7ҥK7tt:cǎgΝ,[cǎh8~8F3i$ CkFnn.rqe._L޽?>f͚4oޜڵkKŋ3sLo_͘1c*U,O:/۷/J1cʻK\\ ̝;Fȑ#i۶-GFTҲeK4h@dd Wkܸ1 iӦdѣՋ3fШQ*_V-^<ѠFC6mصkwAjN: L̈#8p 7o槟~>;;ɓ'My}III!66E:uY&fbԬYLQ!*DwLI7Cj@=;mkJ*QѨ䡻r:},. a=ARPX[* VN תh),,TRR!V( M-˻QÆɤ`Ʉ\."*-Kr @`)fiq/'TP) Zqm֬[lt?bZf޼y8{0f]!h4ӇٷoDDDҨQ#)Cׯϼyx(**"664 SNs>D駟桇~رcX,y7 ${1x͌3* 㣏>⩧ϏN:1~x{Ο?OLL 111t֍*֭[8}ѽ{w ̝;VZR*q1zJ RdذaS t 2}?r1۷/ZҥK,]zHZAh޼9>(111dee_N@@׿ԩ| ?0K.GU_k/P(8xe0`ݺuI&>[.+V`ѳgOZha]W*}|L8{?={M6HU)_uO^3P(c۶m˽˰a*eU 8Gy. <Upر* ???֭oc=h$66+WR|H߿?k02>|ʵ5}JhR ],ujIHQ+]L]e`e|gPT Ϋ}MhoU4ˍ KUu˾d z%"VpHT*bڷgdeg}}RRR"L]wZFVSVVƢ?䅱cZ|i%&NPP*OJj*GUt4'N*YB]u1Llؼɓ&ߥKݹF |Zt._jf&uԑ^6N'6$88 >]fMb0KAa!JAKE}I8JTO89 .Z*yZ1 T(ѥK)kR( 87ǏRFRyꩧ,ݻw{H_ԐFL:tP~iM0xW$]T*XhZlyVƍ'.((#\rrrhԨ4Ͽ;4h@߾}<^DD=G}Db?/vQqhժU[SwSת""<4AAA}޳R뮻1boQ ը_>SLt3tPww ѷo_x^ddDp:K ꝼ>dni]6jם\G,aP(_3iӺ5gbܹ3ݻu}X|T +==ڵj1tԨ<@Ν|$$&b(+++r:%W֭ h427]WJ 7bWo˸\.~ZT(5/]bҔ)c<4Ċ ;,(/ Μ=  < x۫a= _g7{]VN_Zum壏>"33}2k,L&駟RSf6'Hĭͮ%+k|eP\50W,IPx0EVַ%$$!`A ""V+!aa !W{^3;vPT\,U)+jSpPW$9z (Vь;6|t:/hӘL&ի{-6IhܨÆeΝFJL&0D''Ka**aO?fc\IIATRvm? }zOS\\̑G1ILZ-aaaK%Uje'UQF34$aرeȠN-ϏK-dd*͛7wГ'Oo%77GyD^ddddej@j֔Bqqq.Áf#';^TըJ υ{ܱjUVfPK6Ÿj[VCUb)VHRrVnlBCA -sEs윜r"4Vql1U]YVsrsZDFD/ݻϋǾ2UXf&522JKKyYz{'8udٲ"###&]>[gu3X,:EDDD,qO7'N[TVZ`R*QgnAUh4ʫ_]VKwli%VTx Tu*kvUjAfNTro<229O=qqq={ׯSLw!Fp1F% 22222JAo߾Ԯ]8QQQts?ddddd,buKY!##sV`*{{*dddddW~\\b.__݂ +2222222TS^D{IO[Z?ᒟSU [IZٲ*#X0doPfPJFo`ϪmPIJJ EEEI '\ KF`?@:h̴ԬY & v.xedddddddddddjqơys@ܓB?6R^[)AiӦ;Nb7tr.~ECFFFFFFGu6oADt)+22=2222222Eu ##ZMv= T*@*>c.!######s;Tg^Jѣ GRyV!#'X0dP l޼Br@T*"#G_0@V>dddddddnٰa {@D|UCNDe;bЯ_?~Tb(B@P*˅"U9?ӂQj!######sTT*1b5kDRֈp:b٪jL##########;!*oWT*5j]."),,l6߶B`Z;s̬*PPP + 2*F2222222MuFSq\8Ap:cZ=łV!00\)ŋt8*71DGGjednP!X2222222T_^*RD_%CQQ:`\.1[,~oZ)..&883\7zv, vNJQN'VłZFxl6[vRa)3j4j}vUfaXp:9Yi[/r^ /UR^zԪU A@ |ܶBPM) &y>#vUՠXnCRfFO^A$%% \|ܼ(- ݎZ ?,BRrWfΜɣ>֭[3f Wfɒ%L:WV-[FnntL222Xd 3gˍRRRի9|06_7x;v`ZIHH_g޽U iǏg…v /Ut:to6lnc2e^U6LZsJ1;|0&LСC> HII ;v`ȑ$&&̩Kp]pp &MѣG$͛i&V^-}gX|2Ǐ'::_~qߺu+ݺucdffVi_-nGt^u/_dt]vT*/% y.\Q͍+pTJ^dv f,f3fk]T$q+ [ ਰ,) 5lH:uE24$͚V(((HZj%%kZ^+ V|T*i٢5(5pЬiSԮ-))-7'"<2Q*hޜ5koqϩgfĈiӆ0 ԩSYd JaÆIe*#&&]vQ^ԫWGyReJpp06lgAVs}ѬY3ѦM|AJJJ>}?~[RTTG}tMaCZh?bAT@iҤ57RRRB`` ?9d~3Rݛ&Mj}+88иqci΋sjذaw|裏n[hSTtԉ~aXsNZlINؼy3Ǐ O>j Ɋ+||ii)Wh4ҫW/:utb %''i&N'cרQؽ{7~~~gt{n8_g |((_HQV{6VZ-ڶv[Q֩#U*",,PNCTZ*Sn3ѣ"l h44k Y1Vlݦjbt:v?RFqZ*X:<<\jT*j5U*\.%%%dddPfMjOqFt:3'22RگړIdd$5jԐG$vnn.RnR . ,yb #<<p85>yyy|nӉFAHEZMPPXVQ F#ZAh4R(U&K\?N'EEEJ[Aff&5kj)++w!-- шZFTRRRBZZDEER9\E?m4zZFk)rW|FQTT$5uGVBBB*m67n䫯b%+bP\8CCC=FAV{ϧp6\)[Tr0dffd`0Mٻwo>ٳgi׮W_}E5hܸOq1MTz'NFF.0 t]v7\]1!$$;fkr!ƌ?* ӉlLTVkFN0LҘkFII &IG. ZMYYCߜ Sn=!!!n^ⵈL~~>hZv;EEEKpPRRN|J IDATbP\@U:=wo???Μ9ٳ2e eee;J\j5ul6JJJ#??_z?e< y,.vƌF?q%Vx})p+!.o+A>UttЁ999̟?W3ϰyfrss1bÆ rҥK_>رW: tON'}4FũSxwQ4k֌'NPTT;Cv|wl6.^Ȍ3hٲqٴiNbժUtޝVZ駟?IIIC5kFbb"L:Fç~ʯJPP^zѦMt<,^>hZ->|3o޼,sy…p1ڷoh4,ZłΝ?PV- _'**5kְm6 ±cHJJvڼ{{cشiYFl2 0 $%%1l0zl6{8nG/.]"33!C0b裏gڵ viذ!W^M6>s2++ AFF&z Xnk&##NԩSjlܸ;w?@8q"+V ##^;CYY .4jԈWBϞ=6m?˖-gϞ ܹkұcGNʎ;8x sϑҥKӭ[7F={Ohժ$''fjժT*½\.BVu̟rUnJhDT2g^}UٳgMr}M4a1RHHm۶ݛdzi&lBaa!6lࡇbs=l۶ ̅ xx0az/P:gС3ggfa:vݻ7۷o7ryƏ' nݺҥKyyW OwXX#G$>> ЪU+FM~~>-Z@R^=bbb뮻hذ!! DT*7̙3\.h߾='559s0x`bcc,XaÆӵkW>ڶmKtt4'N^z|DŽ3|px -[Y,=~9n"<Ä1qD/Y(95m4iNYV/^L.]x?~X,lْ^zΞ=KVV*W^aԩ$''3k,l6 6$))3e.\Ȯ]?>/o% s=gq{1L tytr .B\s5Kpmۆ~ntvv÷mo}[H&83ꫯk_n&E__߂Ogk_2֮]|on|瞋~ؽ{wu:>ϣGqW|Չ uYя~ø稾{eކ 'qe D: ^{-.rchhccc馛O} ]wzOȲUVa׮]xp7'? ~u]7b``;wI'?ϸ i&|K_, $ >Oyql6\}ըg>| _@"C|׿u\p;044zOj\{{@uA BN;4֢ N-EqMM S왊bկ~-[?!x viZ{c|(hllwߍSO=H$ 3`jj p: P[[:hllDgg'RF#QSSO?v\.>O{<~<: 7pB|Mi b%Wxgcjj gy&xGyy9 qxVE;?|^xd2p+< ) kXpeajj > Rx\~:c7??/CǙ[n >n7K/?l}K/ļnwۘ¦R>|ɰt袋t:C-eQx]ڊk񠻻PvEUCkkkqFG>-80pCZ /с[BSN󨩩y睇_|sss`??񠡡X~=Ғ+J ioog?YtttW_eaZGW[|>^|Ev{54?9, a2 ¼y-L|>XV|_gQ0p8d2YdLBe\3<r FGGQ]]TV&$I*xq%p0o¦}WWo$Ib!4,iswq N#N# /ą^X=M_,~(h4e$ . H(KUU lذzd<ϳ>Zڎ<=}އ .۶mC[[, X>6'>+_JѦ(0͸[qF\|'|k_0+~z$QNM3 u_c6QQQQ4/}NQer6n<_|1nsGhppkgu.LNNc+ 8 thiiʿcP{& jUU1>>|_-z/> +Ozyl<݄wC:AwqTᅱ8G~?>wpb||?яXD(B,[vŎNӃ&qkPUHp,ֻi>H~῵+g}7ow455Hm C3Bf3K/|&|(J[y$lQa4`Xel6B!Vwk]UUvxt3L'E{ ڳq2 b~cӦMxWqm-^x+2V낄ޙB[G?9%hk:#fnb`׮]ƽދ. _~eaL@.UUUcXviM[ OLL dUUQQQ}TU10MQ&>ӟ>{9w+K;22RFH$ۋfh(?S# <ϳwL[-iPkcek^[oylh /Snhq,r1ehdrQJt:-Ib3}Qx^{7%EQq( χ/}KYժ>qdY|[oox7__lNRq-}݇T*@ /l{E4eQ^}U[nW\N;k׮Ŏ;@p8tuuᥗ^E]uaE劢 Ͳ~F!# -YT3@5<djqn+ixffxǎ;DL&o##N#L]FIRKZ,dY$ VeLgJUUXV~O^';x@v;۱i&޽;dat:޶m>򑏠=lF3` Oɲ<O<"N H$H$s_8G0įkaLOOc||SSSDhI](B5 X,p8 q)`֭,yhh?$Ak;H=\r vr s^z)qYgᩧbq$$IB&s<.7x#Qxgvc͐$ ,cxxЇP[[rL#JaffU;묳p)`8{+ W17nD?BKxC=j|_ć>!d2q?'xرmmmdf̐ޱhD @4E85\۷ƫpKI&{ rژg?98?y\pXp\.<n6add6m(ذa^uȲ YNaµ.Jk m\ߐD"EQ011@ /ݾ>DQLNNb||333LsiX,n$fggq1lF"g?+8a74KT7oT mkopcIx d E$d% ΂2! a֭x177*v# a_ шua˖-_Jlݺv$IhhhΝ;ꫯBQرp/;p~W.R}b~_bxxUUUصk|V?^ 2 yp:X~=كLuuubۋ c޽8sׇ[o?0~_GCWWa4q/~^ty455!H$DQDEEv;>m۶gA((n݊cff> B 5+!~;ݻ1=dnǓO>}j7x#V+fff000/p:otuu!H'+3<g O?4^/ <lق^z 333gms=-[g۷odZLtI8Sm6lڴ ovqUW- X,Xz5lق<."{XjnF a߾}aX۷oG:Fcc#݋Vعs'6oJ6رcQ^^g}oԄݻw'(Xv-O駟 X,ӟX,JG188ۍ38xekG*BKKKQp8g}=xGKK v܉g}jCCCF8# !ɠeqXj, {Ƶ< !ₐ2YXN1==1tvvn/ƔL&P]]ͼf+|h=2 \UUE<\YRNFQnNikS}<}{wA@]]3l fp8H$0ͬWM,C `(2/Lik$IDee':f%fl{ev."A+Wq4.RDb۶mhnn~G266+^Ќ͛7rsϥ bOnã>Je FxD A!~$ E(bFFF.;dBee%j477fann>6lmsR)ݷNmmm%=d`X fv/z(,r=o'DEA UQ}p Kxݲ,#H Aq z=,f3QD3j-BaL&s]Ԣmq0>>*4568LLNbrrv HpM(802p8l& Xm6ܹeXV-"jjj>PSSt:p8 ˅fp8pYx<}hnnFeExG&Ʌ=HXz5N'$Ijm2NL&$IٻpRu:# b]pݰYt(,<99P(TWU15:: D!l%iAELzx<qMMatt^/ݍݻwCE('\5"$ bh~)< `Uxv ҙ {g~L&TWC&pܢO_S] a6P__IO$a6^Z^ #̀LBAA,/Ŗ&0o9c9 (rQ k)f NEQǑ$2Ȥnfabr3~?V+\p\ sĂ08C:4b8YCǓH&*8AhD4e%9 }[ӡ H$EMMazztk;;!r;þ!O"( Ҿ0LU(*A@uuk8& 8,J5—e$>_2 ƣ%4UUx6#FuI  YƑXH|BP<}vf  E||rfCee%z{{ d0tL i5Ͱ-#Edlf,KQ;5$ XYٖ QmzGw aDXhS9vt㘞^7"0Pq4 M YvF6'& PQQq%\8Q&Aup{iLLN.*2 F I,HR(//ωG5EQEX,Vn`0@àףS!IҒe-f3xnG]A='zh)KJE'D*T  c Jg8|cT 8z+q:N粼̨fNYČߏH,X[˅t:##HӐdp;z ,a[o3W3r E qEH&CC+*S@3Css,j)AHT:!2\.R͆H$H$XX(ŒQɸ].DQx}>dYHߏ؁Eo4a41199Hl6c" Dcccd2f|E8bssQݣ^x  G)7cYԋBEA/`z=] cRGUᛚŒ&YZԄxg8MMa`pj^eee,tH ? a]C}]7gi333~t0QV(2L& z=f~at/hq:;;gA}eup/A:łں:^ܵ+k@C,&&&X_ɄE<:۱w>2Ȳ,vfbz1=3faW2ӎp:{nP*@ex X((a 0l'@\d<^Ͷ@y-p:FyrϚL&F D" X,Eyǚ5kX<[I@sStjVIKCV Dtuu! Nd4 b ^QXTh0`]WfggL& v;kBZq\0LKy-MM(/+C$A</Z,(//mthoG d-~"7͹H%D΂(}ֈPGsݎx"tT  k5"s]v ?3s<=[P1s|Xӡ G;xJE*B4Gck+  EQ028uܝt/psm 42hoJ=O|sPԀxc%ޣ>ALJpP(by9T V[5h" 8jJY7dEbivV be/U&  ԛZ":H  Xh,HaE'AנFAA,_ΎPT|7 _WD^ tH|A,JY8v8s\.DX   bZZ_U BF8! *KA@n3S-ѹ8ۢ(R*A AA, ]i J+Ƚ4AA=%, AAA mS57B5Bʇ:A|UP:_EAǽB^8A֋/AA(_BXr6 (  b/RշEɕ"Æ VAAA,WZs`<B^0h  劂R5"!j.nIn.rx<`XDj,k"@EX.&AsKAD lcih j(L/Eoqxg(GK:0\.*+*xeY,EƩ( s֭[0<N o%AABöԡtX ,3UX- Ea60<,r8pPUf Fd2#b=0Lسw/R4CݔA@l6i ?; tu:-=ڳw/0f3 zzzؼʲh41LMMbBazzG,U7EdYLMM%IB!bJDׇx<EU1>> iJC lh !I{lH|AlAP2jQ%zEq(0,yNUUt:ttz=dY} Iz=>ANzHѱ1HZ:(p8q8V+*n zz{1 2I =jjlDmm-xG2Įݻ1FYy9&PVV܍±(9a%8U 8V{:6/}}d20 =|QDUUǙPU~ǡfBQQftCH^LLL ccH$ `ffCCC.>AAGH)kޏq NQ`kǪ^ϕE8NȲv y|E<hmiAkK qb$ t:1ġ(h_PyA@*%| Y }*>X,Ύ\B"7chh. 5D`޽H$NCkk+ z=8GooFա ad ?t\LL<ǃAR)gg!tY ++Guh^aZҒ(Љ{#@ex 8[iOW zDWS 5EQX֎bm"H@yX,XVTVT`޽F,v n qhmiaEsssGts$IBkk+k·^-Rpt:zD"dYV*"]*eeH$p ,ì# J ɄT*̮GQE%AA+i5@.TZHtR IDATEfB'(jw/HTCCCعkfd2b1iFpy]CUUx^&Lf3TU4C| ("(x`0`0X$s*$I ߏH4P(޾>Hcn/umX,Ǽ` ma`4bbD(žh֭CMM "Ht8 =J&oODvTVVbzz`04r1o}^ )AsK ++ +Iz0illdI#K<ʊ B:? 9 2hogBr!Ѐq޳yo%^4 xQ$t%ogUqg( ,($Av,C$gr2,4t:o,ˬJ)-I2 2 F#z=,xA`:,B\.r&A*N`F|$I`  ]D2]W ]!Ib%c޽hG}}}GGGp00L !G;w T xvFAIJA]n}ik-Dk<UUy~ъZWqE:ؼ #28 ***_6C}% bD"9VK3U-'P8_X8A X%mD\%E*J5Z5!!ıfzFqq7$%&AAIJ("< (0f2C~_bjDHAIJ(qUoA~ ׋R/AA(!v# g  Cj0fJ)8"(b첍t:w13AHt"뛚 EQ077x"~&2''119Iat AA5K.x^f|T;"annX Dx9DeyTUE:>.x8Bo_c@&A_?gftmmXQzAAĻR6"̋.%H@|.Ll611ܵ{HYIЉ₼q&8Ee(EQ + dYl䎭(tE;\q%IN EgceȲ̒yKt: ^^I TU$IPc|^A|J񊚡R IyT Fz荴uq۷UUÈbPU& kVfc $Ip8̳p`߾}E뺺`6 xT*'nzաY9d9ABkK DQĤ׋QȲ ׋)a FFF `@KK \8d;z 555H$Bш5k`Z]  勝Cj£TWL!ΥQuiIFhhh@*,T'_zD"84778466FlPVšի0<>N0 Ӊ]varr6l6c͚5y J#l2 < AA,O |1B0Rí\H"`X`:dJA/m\uuuxZZZPUY 㐕$l.e0FQLNN--2]˟KT:`  A($IEh @! q^hjjBOOgc#I;7"3INXgW_ՇZ-e˶ֶ,-mv k  +؀ ؚx2#J_GS]uUgDȬ$dE%ݨ*2fD= /ha%.*c8q%:kvz8ݗ UUk޽ׇ xT%X P1zG455ׯ_&''um4:y8=VCt --/_7ȩSaѻ)^QaWEQ=Òs=_qȈ.j~~>$q=&y kzfFjU?FG\_J^ γ֦m4gInիz;ޱ+oנ~0SӓNGq]5}>2NODqw>{z`wyX0ad*5Xz[YYҒNf*V$IOk;nʊk_Ąl)Р=ImE/)1䋿7[~_6|'$`wn뽗5F6>ۓ`x,'( °CsNtxvD ̃G_xI6~0 Ubgf5|vM_0`EA`\&$)؉I[\nq, vP;SbJVZ.غ;36_N lQAeА*IRVVV\YsN몏 $xuMt:iƕ%Y#NRÎ DQAY%]b2`7$nͩn}MR{aA+ͦݫ8ܫz{SEzh4$._Ӻp?yvfڝu`-5ttI8p ɓ'ljii)ߋxyyYZMj5\FGGeZFj5jiyYz]QIZZ^Hzj6$ͦ*ZZ\VccT*Zm /ittTjlZjƴl(qNz]87ΞUȩS$-,._ʊ1rΩRG%IgguYMNL뒤G}TgΜQzo{ѳ=F7? JK>+bkm (m۷eYh1:Zn6555FCZM& NGI-O>)k^=}ZӪzkddD33pႮ]G|aaANҞq]vM^=}Z8I5WV/󚘘$]pAI+7޽{|adСCV$iiiIVK?w8;v9)XZu:%p8RM=gh~~^7nPEj:|OM)u0DTd}ݧ1I}'N蹹9MMMi߾}cGjffFKKK$IСCx8֑#GDZժۧ|C=fq,W*:nVe{uߓֵ5::*ヲgfTVڋ  R&]*& 1=t5&UFCOZYYuUy5_6Q^HڮkXL1Ze="U|ѿ1FjUܜNO=^^:vsϓ x6`0eok]i1O-AVMCWႆ|^)za4RҥKJdF\Me@އ|=Ir^z%]t)_<^/Y:49%m+IMNL쒀A`mxC#kn[HE[7[ن{˗/kt=Ȉ'}"N!kZs(;jիڿomo-zk||| GX>;;7nZaCl O~-^Q)I%mjjvɶ]X\s++1F64338u|rׯStmիWuxj*rwvvvd߄dL%riqiI7nX?QTo^MC%˕8|FHBݫLkm o8='HTU%I"で ߷Ouu$bv#<(סI]|Y>*=!TZjltT׮]J(l6NMM2tm30%w, B佺8^PTҥK97UEQ>h~~^t15u*|Ą”JI FַqkbbBFc[++ ҝUzu--/zHv[ HFСuh6mttEd͟;vׯ{ZnKx6>Ϲr94;;gԩS:tO.%Cژo&WVW_/4- XI'UĻc6}Xnetlg4uMpLX.زRl$$mB,-r7vZGرc,>mWDSf;ڨ&,B/fA/5 =7q!vq %%DXLFl( /`QQAcC᜻ܛ!"fm6LZ`'ċv]Ÿ6,fMUPwp0H8` /IsY#&]nÈs΄mxLkm:}<[/B70xZ-02uzI9'kk#:`0Q6u-xeJ$a yAs_Ĺt V~H C0*3Ә| Q6P̃mzւ}Æv`8",@7Yޑe#bb0v2 |vz VI~U`8 ̵i2(lQA{pY8k^zVAya5,9x9 z Ufgf6἗OןxY {(;h pHqJ^9)6`'q+ueF?hCmxJކ9ϴ79^0b S6]kW '= F@ ܆Wbb$Lٝ>ۊKIjZab.ز2;3M״/}׿ 0#\u%wfܶm?_#׾Iv|';{HW/o#? {S⠃/"^xQ zޫ{p3a% =;+;[;#__s7a B0hNP"tk]<%Yc^N?g4y`?wZ`eDh^{uvB` sZ+w^yGǏn0ҨdF[s>pR2FZ>7 A`[-[keoHW)q+J )@^}~^xvvBf )m=3U>]vM/bڰ! V؆YA /%رc =/#xދ@݆WƤ罬^ۻWz쀀TI0261Fب1e`,)Gm~/ɚ0b-S;0Ҩ[Vf$>sNiB6kYyuA0Æ I g`Jt (E# ,02\m/# vPA9`H/F.XS02"tIYK9YkO `# `eDy6J$`j0#\0PRPb#$ΥS3A IDATt0}9IQ6=`lz`?J.- *T)u6,@/ /$jؙ֙,wʲѯ {`^0RN@w 0BUA 5F6{=}$"0Cb L|@G8$4f&s!׀HnXƘt H؊7 `F{eewfQ~ү `[s#!u8Td*s6E9'Q&v/ S@|~# a,;'`Pg \nMלf 0mx US'WF .زR;3ャ1ZYeee C0Ҩ%e&;.@'q.=0 ds;!'ڈ1F9C^;3 mx,IA+1 H%HHLf[Zniv!`' "ȧDZTcc;7[Gjd#`DzȈj##H$=pVM`',hlEZȈFj5EQր/mi0J˅[W6^(HXbLpWL#9'\zHI0mxYAɭl_<0-a z 91aK?!% #̴rIޯ-B~C0XQ6?dL:`g *D:w5  0׀#]՘gA=*3Z+ YI/=p )TFgYy)] |< SOrS{V[j;C/ S@B{ߗZtc押jZn|; `ܲyȗab]Sn$k=$!P 02"${$INt}Q:bQ\an0Ҩ[WAy/} oXxf_1_J eeϦ֛xs@ yA*)Xybn=~U`FA>dGͬb^-x0؆ IzlI5ƤҰ>`0J J܆7 rx39l+OBp 0R;3іذV(`F[Tfg/$=,BgjF5`61&蚂eQE`8֖ys@$I9 jL+q68,Vl ,02tGx|z$= )Dt(K3ЈQa HE;$`PO <%Iކ*D$I@U` ̃mf 7fuC0Ҩ[Wb{;DWUխ^?c4jlg|xe}h,ֵvyF?aiMB+q61F.l|1$iy`EA>e:xv2FvߨՃG2jwU>`4S掚]̭$UjL*A ov5&=Z+Z;"`0Q6a#9ceTW<`H$K>ƤSB:r!w #.,ea {Hk2l]m~}ډjbk|bDcBۙl79zlLf/grá"3 vDawN)i+.aCR6YƆ-=rLvD`^0{ sN (5l 섀6`e8Js(9bs.-U0 ˅[WA׵db&Z+IyfB*08  ̓еv̇5 Ra  ``@en`kO`{4R|,im 7`PO >0nTeU$; `PO ܆7^wcS $ m6LY%9rΩjjs7aiԠ ׎֦1ߘS✒U0#Iز"4F{>tPInK # 9^֘0#TPӚ̅[WA;nys@/ S@ކ1]J ({ [\ `G@׀8h;!`QI ^+_bA*2Vٙt]?<$MD'IV`'Tb)DyS1XZn0v2sk $w; s(9hݧ̍l6:Q1]0`enZ6I!z Q6QF k@(U`D=){ HHzzF@Yv@z^b!Y<` L_>WӨN:kQ$yF,`+qZ`B;&?ўXzD=!NPTNa^:o_l꯿v@ @# sdV^̥$)Q%V἗=r ֓eeY !iMB+s,wHژW1Z[sK~$Nl 9gs cdC*ejz`)XRzds ;c 0CTf>*߮Q% ` ( | 0eס~dEur` F@ <0圓W,Izte,5`Hٙ霓NC1,_E yHlYZ9ދB ` ^׆ $UZnCVR<b XKaxa()u^I޹߶XvFA { 0`3NX,k$g z /(J%!-<` Lc䝓6a[,F?l'ke4)` /X)OG@| vC/J`e xcd$Q$rkA q(9hݧ5faG<{jw:ZX\^; ( y#œ%/ZM쀀ѵn yԽQ$k!L;`H$`6qCR.X; `z9:V,n<` Ue'~^p`(L:纖yteF@0XQ660iC&M@fqѳ 쀀nu`3IK$I[섀A=etiFQ12*kq! YؙF@Lk$- =:NCDI6``%C[t`EA>ezrڏwXc$G@ yS%`x֦I1J[ۆ7U``eDX\a0 QAQn=/0`P%vf&#.FR|m!|FU`Gċ4HBV؎(W_HwSCZ_vgjgjc0*>Zc'G#wWUl:$Jqhlk锃N?7W^<)>S|l|v{]R6ާ "tェ ++q<Bfg 1FQ5\!ZWMX✓O"t.fl-{69p$k I?lkKך0^1j.ӵݯ.XأkW/meuRzGt*@lG|J];|iDZ#%I9kF`{eÂ+ @ɷ׀tMb:m/B>=$~va9paX'$"/Y,ەx/e1Fq떵 Q~gʙ:=xwz,$?`'aĹ[h\Z6_W|ېp8$s{!A4ϴ'mwoޠ?ٲݥtFET**+ )~&LH@*##4ts2qEQ$ShЅ>tMn>0-t\YҒV*$$ԯX2ug4HD2Fܫ46}ŲX{jǛJBB2jсCTV6T4gpF$%$!ky9?ZXs>0h^Q~$I'%4:>.IZyXa]'%+:$wQVSبaF?VVWupjd1nV:al8 =*XJj*m 8d]fQ\Sݤ ;$c]ݣUӹ뻎v" W;JmT*'1v;9nCp ntt$]lhffFv{۞3Tv;zߓ$477f'?eZXXпWJgϞ1Rmp[X;cXZ+~xﵴ͛iϽ뚚ґÇede~~^/i佌j4:tH2 :}NЂF[I7nWU_N'|R??|wt ]xQ>$>i~~^Q'(ʷ:s^]:IBvm-6K/ڿ/]C{yvVo# tD{i4h4Ғn޼7nGܭ 6Ӧ}qqQ+_w~n>^ԧ4::ퟣۿoo7I?_U؏؎Ic8lXvJ( nH@@;kj:uꔦ{>^{MggudaAg;h!~!eѱ5%{̥K$ 9u:8]̏0.wG>O}Se|K_?zꩧ֖dӵݫ8EfittTj5\n┍#HҩnVK3u ]ZZUUNz8Η &I9@REMNLdWjllL??O8 眞}YZ;wNY>?W_=\rE7n7 o&&&O|B}{3wwx(Kr*v-6[F8f"(ћx"Zg|\{e]|Y8ѿa->sLR+sС|^ZM=MN*|kׯkuuUjUgϝ1Foz|-Ą^~ݜx ӹstᆳ/ڿ˷9eMmp~Hq__mGGO~R_k^'wSQԩS?o}[=䓚VSO=72hyyo;'O?>v)} _>ob0սl$$!`W}cz U[*Z;qkW}Rh~~~ݡ)Qz=OxZt MOO2hrrR0E;lF$JDfSccc_ollL>==+Wѣ:y׫ ͔1I9sF=x>'Ǐ IDATOxL 1KR믿|P/rXuڵE9M7m7[!#!lFEz衇dO97䖛M9zQՕY\.k^yUpAn޼3f)c(U*Lߪj ]~SSĆ^j5*I Gjͦ]Çw]scN:e]rE'OT [GQZ&W8Jx _ W|ݨajZ^siyyY?G}[ʊ*_gjr瀘pH-ۧ +[iIccի"skm>j%K(Fz.kVz׻hܶ$T*:49ׯkȈΜ9N-O>z.cuŵ'zˈKhw;qBla{ctT'aT裏4??w}uuU<٣w:pfffnI^{5hbbböp%TyhZ}G?_\577'*ǎؘ~~NGdžڻݮwZGkOOB*0.t^.\W-I;wN{>g4n{};W|^v[<~7~C+++H>^|E+{^ZZҟɟĉ:~Ѐ0~>a}bNLLhnnN׮]vEݼy3kddDSSSzgeFGGo~tRbKIƬmDZ?yR/^|E>|XSҕ,)ٿ8?رcz7/ԔZQRᩩ }9]|9ZiusnN sx5229]xQz]3.iaakQ/_zIǎMhʷ-H=}9>}Zz}Q˿E]|YЇןٟg6Vo~S3?3:tݿwz饗KKV ӛ:~/T]˱^8U>|rUo?qo>ZPA*ݿ_} i۷OO>N9K.izz:op8qBǏ{1:vsxN>-)أ޲6q'¢Ǐש+gdg;zTggg=:}^uyeӗy8Y0###:uꔾӧv.|՗e}3|PFC=P`rrk#b^G//K_~~Iq''U׵w<|߯%}+_O?J_x`q^;4&=aҕ+Wc?Fv0g1>~Ǎt:ZYYEa7pyǷֶ82azv*'L?T*>XEa!}[ڊ{ݸvM### $IEF3Fэ7tҥtUTnNGWZzN'?X5.>j9Fguu5iOCt:vݫ|9͛TqVڻgnXY]՟kyKO$N]hЩ6[߱F_hxI/ɸ]yo{w:o]}8&''o{m+:s;{vѮߍFk4f`)ޅ8tzl vw_ek=W8ާl2dawK1ݘ|XkʶZ]]gjZQEZfDVVVob/[UFsW(Ba+VŸsZ]]U\ޤ0c$<ܧ׮RljAlf%\Oދ6!\c--,SO M07'+ݶQ:G ]'._7/x3br+jwؒ$$"Ej6Lģh ${o0VJE###:k~K}jۺp566vˎ_w ;e0\n=;`]]L9--,:2 \l6zm/|umZ-[-j5ju&wO8h!k._Kw>5FG}ʖOc1yvBm,vv7FC{Uuv=/ \GrI6`'!"kIWWyhʮgH"(! i4TZ]YnFCٺ;"jP5;'p{Ϧ:Th,T2-pGQjޝ&!ZUd$$~2ҐpΟϽ?/Sg~s^y֚c_ayy+^7,Q߫DZ˹tP] _eV~L(b#m8Wu! ;6UOR>U4hQs LZg?'g44Mm17?v6]ۭ Tjq EUX޹@:DZ*M9Ztl}Z+/cjUoܐc!:xuʕ*.HTq]ξJ@.̨^ЍI`"={gtj͛zj~5 юZJϞLwleuU}9ٻw,aCi6"c٣+׮ŋ,Hiv[X~#k@C2DZ833zy9 UfScH!ӯ(R$ޫRthltt:]~]>8֞q(Z;<1wSB⽗sNIhqqQe6:~ۧZy~!WNGgϝiVW566j*Ei ) k?+ GxҐWv[+++Z^^VVVHQg?'c[){ 1r[|a|xO6 =<1F0 oqe-fpOP(W>-+GH֊rqkwu V&{Q-\Ϯ|ܽ#XwT{QB^(cxuܳ~_{ -Y1ι>Zޥ.~%. YkKF!75$=)kc9$2^֮3Vx0Z>72 U(cR0VBˆ q2=zk 0,ԇlĹ1>>}rb'QgB]Y%V[-ի=\te4siqV1('=ӭzI> I*Ua4dB {ҧ_3&$+ő8G7#^+oX97.G(sbE X(c>d ]/ʘ^2:c7,c !|ךYZo2~σֹgGk~~vtKn^gKB뚚ݷbl;Ͽsl6GVSŪ=?{t}=lvR+/M\w{ހ/Nfe]eTf[Tƞٷ+me3}2[_nSy2gRu.f*f?5`奈5*-~Sjn7mupxXV\Scʼn,zFR͚(ޗuĆ[3}wԢ7!in$%%%u=Oq -|-nGv*NJqUY5x)&#@oU{L{̲8wzs҆2pd8!ZozW+ڨvef2}{+o~w2W[v|lG:~Zq}H:-?u{)*.6C 93nu/\^..zEXk6|W =)cf-w2ڞiYi-co]EQ`ە1^Ų(/2pL(wMzk)M,뽎Mqx{'uw' vqDך2cY 9W 3pBZX@qƛ$6m^.Sgy1xL?yy 7B}o}ǍRB)~?KoSOӷj,VB|Z:?seݶ:\7K#c'e?x&=gOw!0]T͏?ʴKM3J߹> ".z{8/Q?/2"e_߻۽3 S.IbpN%{[s}_F,rl'_+ 90uVX1+1sXnM ĴHij^Kx~+4/)+/w_Bx%2-*C;/#"~5!M27&8\bZWnOq?ׅ26!%$ %zB64o18@0AƜR!6vh<(I$,TMO`lO͍,YjͺJvTX)nGM5WjjkcOuʱspQgfii:s,gekӦwuHSN=3.vnoT߈ZF-Hugxϣ{E3"s U b[9*r MPbv)톟WV\6nF)t0r/noQۢ"BOTv8{\Iso_l^Ϻ![V>Ѻ@Qy[)\vc<x l:XG些 c̬q͸X̚Mn߶jfx1agZ'#K~3أYh'$ǒ`FRVv\;p0YZ}ʹZu6bl~uSJ{J^5wZv+cxFO@m̬lLoVvge@"-fKaVhF뷷K{`(`ۧ {!_jaI:מC]&wP?-dHfy絳 Odny^-Efե K0l-+w>wmP*;1nMDA4]_%Q ]?Kּ@ FA:#I;3%U{ՉvFZ!u6RP]OOE[cPC;$0L%$(bv^;qdDwGp(WF u˴UNp[s⣜UgLf 5;PC&/Gbvp 5ZIqKB̓$֘_[뾛JOrCpcYZRb0/ K H7Zjdͭ$N"†a@C f“Vl+hQ,u*f(QS&XxuȳDʛDgUk*[2<[ָ%Q-0C";[/(O߭CoҪ\p# Hմ q(\ZU|ݰ&[#Y"F vD@ ?C!TJd-H ?yvMp:B6X=:ER@Vgҋmy6y7l]$9VRc̥ ;Skz;eF$cp j ɲV/-y3W64{\We(!g\u6  c6W Ɗ2MWV~+U޹ l=d>NmF_꼨3ƭaV&׺ k/)q 3j R\ ^p,c"J$./aMtxbEz[s4"( ǶG~Pqy{p-@G6YEXaA:+ TGN5 K{҅![F&β;c'YG7N o>xF~b] )\[b"Vz( gS˻w&?e",e@\h%_ȩ+${-*Arq84n, idCCvL^5FI,v(1 5%L"@s5b>Z#)/l@CxX*Rh7Ahxt yQ!Mf}1rX4dm$lHH)}0b6F* mPs%b\1x pHHM CfHVX cQfIJҖ}HM?xbVaOC8"ؙXs *kH,3Tc>iQ*dЯ^D PQ]JHIܣhWA!_} #Ynsh^#nY84 j(|ߑ,UAKeEYtsD E S $Z}}ù&  GhG&@OGG҇|A@X ʆQ2ycxJ!5{7ә΄lU8#X4Sw2n a°&x(r-qkuim5džQ3cPeV;AD0gNs;8$gpdҲy 7a,#(.XfK3 >u6fc)"Mt^0?Q"^xQc N)\Tu o!XR6-Ve)/#w[ j'fVA \uq"nFnXQbۯoN5&u4퉏Ht|H$8J TjŁsL//@pX<!HFDQa)6XJ@V)M?hrf,h%M1nS.>MXf808"XOV^H=0,YF6)8k\.'2I*iN%.D,(~jK 2£ݶWH&*lhbF &(wV2*bDp΅"@0; R))bGrhp&5ɨE *ޔxqI8%oZ(PQ^c̀% @i-IY P%H &^iڽK|;MM7;DRACo *+S͵ŵe1DŽ fyIO+nGf&7cRqBߖձX<MJu' 7&{)C^bhj~jSY%8s6t% -"Q-VFL` { l&/3땩m;`L:zP Tg1UC?e}X:9:YDVıvu^I"+:d9":焃׮d?An$nLP&juy! UaFC77ZǙzq yǦ8z*Bloj+12?u78JŷX Q o O,6j>j<M4bYC!kPTQTn)q{] Z\貢!BjT=/"SFpk7#/Z+Lxi1:n4& N ]B$< ۊz6^³&8PъF]ɟ5ĥ#,D= qxH.tog^4?@֓`(fDvw.2v<^ljy9jɥ.$*Ӈ bC6IKDT/5ؕ<ux3h>ۧۯ%ezy 72I}wkVg`R!A}UL]-~0{ o^G[X$˳U 3UZP6"5GJnc$vsVC5u۲ jA¹0Q؇2RVH,5!Z=%$  *g! OI o:CoADWQh]Y@)RfY; qs\W,Ҙ:ove&Y=> k EQm. V-(bGk f G4 9e7{3$q$d5/ ?&%]PcwEmX,euY+*2z8u*Y;K[Ob7ߐ:CwTy29Crq16 *. Aj(*ƘWS5C\:^`6n-7-w][#ŭF1I֊l"H>vhmBω4apƘE(֨ !cLvkC]xM{BZ <=Z$* h"Ȉkˣ!Bk@( %PZ:յnu,;cP&Cot{Ն.[gClvpԯHi[LGZuDifqDL' I4='oweۻ2hkhU֊5Y!zL Q:y"P:^F|L:kC N 8oCfi39„V T 2Df!+J>Xlv%!1co(u|Pǽ~%JÈdfa8]U$^gzHp>֙+^$D塤+-e)`P37꡸5'IT(T28$BTHur^(Gp?1y EʢєH&AEaneIeڠb iQmPߎܮPBu81 me@~a(KZ_0,N#@p Jb|d Vʛ~'CYd2Y+o|d5GmGKNG {b`鐄W͘ҮoA VTN؄t@®M5(2۲h/VD0RVGmo MnDP)!E ?VLAIlf+=f!eM,z5jY:*x(\\zm S. IFKf=_n'To$VɐQnx$W@DI(հJ51\܏Lc#z&"P"ŘRy0PUP: ҦשrŊOСdT;stY?1&7>`0+!Hi>HF֝ޮ,!Ht#CV(@ ꏁ+ n- "bA>$Wgyy>>?|N53e[R$wLI1>S$S|"unc7xnl/ "N0JlQumb7(8|A:8J򶪭u-;z:W`:L\qsDUƮea;>\S]U7!x(sD 5_fD‚uD^/~ Q:MܦZgTE),S]2 FdJIe0'2+Zd}9/:d8>;(/EH|SҙWճ,u8!g&/5S =Y ҁƜ:~_t\@cedE/#!DF b棺 }@ ] yS'kQ(8O9~a Sc~S_DlBx'hsJ`t [ Ůt$NX7MuGrX L d>*:9bMsu2'[H ׀^֗>Ϊym:T`362"S1W"3^y~Gn !GVP5:2Qq&# -FbIjIj,0D V",VRWg #pݽ qļ/SGvVz0b ~N j~\A*4yX:/JO|'@Jꭠ_M@oiM : P { tX/ 9YtbBCq<j'!A9s6\g|$:Xrx 0:[WJJ̒m!lǎ}d#;`3C++ddփ*:aHB{wz( ױe8$O-:IjCK^8 I YBS-胰YcmDR:0>@J4QB9;yJY$dc 9dɂl#({$7İCUtm՜G'Ȩ:莨<.! pN/stI~2 A˅no~6ԁEx5NΠ~2ON-{UM`\HE$}"468{L:}ҾC[Uw `ẅu#(tޭ/zG::PhG]jjh;:[B!vAؑ2~p|R]ߴ@60[<^TrfOȕB%$dk:rͫ QX6h Zs>>J14~% 1:DN~Xi<=}@Jtɨ1}Hdr^'x^!l23 ,qX YQ f'DB-\_սnO#iCCPICC profilex}=H@_S"8dNDEt*BZu0ChҐ8 ?.κ: "ƃ~{ӬQ@m3zE}A2YIJw|#׻?Rs" 3Lxxr68GXQVωGL #8\xfL#bfES# NBcgTa{si",Bl1ZuR,h?prmceh]?ʏyI88C@hWq'@қr $ԢG@6pqԔ=r2dSv M!蛲@-й7!0\5wwF?rXbKGD3'| pHYs+tIME  վtEXtCommentCreated with GIMPW IDATxy\TA@r7r%\senVފhR.uZ)i*KZz5s QEs~Hj3#>zn<圇YFW~ !B!14B!(PQMPFO$舝у9*۔3pv'?m[ڴ?]CA+LA:zR u[$Փ}A|C{"3CZ7$9[MSu{9pM{}YS {@0rB<}>C#Yz!9}4}/pOߥRSN7'0e:V]e4 #2x'GotTprC٘w"{ӞS{zL!x ]>b#c)qrcg`e{-Qk_b^O-H(iOQYo3tżw\Rӊ㾎bZfr,v_amO\3:=LJ jfZnD~g;cԅm-|GG٧ɯu`F{>8x;VbƂ ¶a\k+zbIČՏiIHL 9&mp,̾v? 9%Ky8]ٯvDFjb1~MGPZB|Ϝp&o91)~[)<%2*{SX)ǰ*|߼ԐJ}fc;Qa~ְ-iOӑ~[4 1ڸz^b(Vr/XM cbּ ALL8y4>:3}vv%?}nbעlN`_n6>`Ĺjvg"b7M!cocR5Cxby>XG.MGhsw:!ăVe|ɟ9w yevZMB={1j.nHOѥDB 'JLF2ҍ6~z}+oJ2FKr,Ym W2_RsѬ]L_c7OV9"`7;Ȍ!!'1јҦێ/4gu>wq35V]66 Hj^6]÷Cq`[L7℮6}6~,\7a1|r_Lÿ?ܯY,YeGMaJ[Lxw?]hӡ)c)S}'I{5OX?KP:֨[Ay-P0@^m`\ q+H3Yg 2 7fp. Y8{c҅SYpg TNlbo;<0T+ף#&u߯zt)d 9-δsT5=a1\T9_6{yԌ("ץS;o_a^mw>iW6"KVbf[µDNciU:Ք2{&w)RpnE*Y*p5g`hJ^l[sW\NDP޽Į hJ`BjD${X%^GJЄ? T G 9u,f@w7Θ@ϵz2dBQ7zgz*xa9qrIo쭠OѓyNnQGٸ!כaJ6+} yӸg W&OW8/>Na؇Sp3,LટmUSMU1kSx;fBH89ۑD6oޡzϧ2}1L\.B5rݩĘǕ43&3KvUv/puwEG:X ?x2{tA9e>92RUn[lyu()gWJSҍ `ƫq<]0CYr,aLhteOgq|^. q?ts%.fM-̬<СlAl$@^I-x( S܋kTAWtjPUQx"*حFE#f IlşJ?@GŪù5hdi1y`kmr.߼dst6>o&=T8-+'\@ixvdmh.hS%+;Va |ջe@猧9d|M'[s1پ䈦bh4 84+F4gEZL׀ y<tnSY}ڌ*&Ҏ<+iaLMU64B^r08MU_Nmn;6&.xzn>&08'V^,#p7 x˥|!Ϧl;1>=Zش-".L[qEa5W1]Ԍx5a'P ҈Nb[QlLfɐ*:G:cNzb`쎿p0f۶@z]A[X2s5hբT=c6֧=|7z M+zŋcG]z^\R%iiLa)ǧL ȧWT@gpnN4xƄC$j:'8Ҧkk< {fmٓuoJZ7+4%.=^LyB^,xX SR> t~v?oŁOoWv._FG -*T`o~opȇZb,x}شYh'9U3vXMY;%iܿ7rYDغi5 z_=C?gSF)/ߙOrCL)ױhL[*)׺˭Pf$)9V'r rlMDR<[k{ʇ?gcyq%/ť95%=9TV0_?#_$g{8U/|Y>㷒7C}l%~O#3V]ƚvΥ_AҌ㣴N弐9 ^%ynbs/X֞DIr|Z̡}2p3%5vƠِÝ`>ήÏ1',0g*_3C䒯3H_Wx-΢% CZb0 (<)A_\MBtUhBN*?3eOfnXzR24cY(}%;u1+2&Fi@"7fII[!OQ˭>x!<|jm2VDS}7eO!Є>E*_Mi,֓68˨]q;ݾcH1"tTprBߦuS{>Usy}P;~:]Ȝaa\ L)DjzRx_s[Y,7#!ĭk#Z*cBYǢgDFő5#|oڤҐ3@\ŽPو?~Ey;V %9-oձcXo^jH>رuTgML&yg3s}婤,nЌ[h<{ w}ضMObb™ `_VEL֥/8tfDJ`$r}/fKtvQ4u. f'IJO>bq\t|MrB 6.彞5*Oe,ή kײX :V<-X,{4^*3uv2Gbyv>1_R,:.ڶ8t37|=[:z 4dmLjUF`hhX T=;ϞodoK9meݤ,ڥ(mc_VvB\.-ޥ~0?.w5ӭT";j¯JG+2]]]%Nߡ)+5ƢgaA&{ ^n>={1j.nHOѥDB4Pj2bG@Ǖ׃'\46/̜DIh۞smuG.y/ͱ/W[ xAf _9YgC%ՓX1Ɖjqb15f2֐n[};T][U2F2etjaZ3Q/ѧWc syYWaZҜ.- j4^){ǧuˡx>͆,]?X>ZNĕfk?1Avml.:(+fczuӤ[',*#RWti}%r\ka ͧI)SǢjtwT.X/K~ZqQWA͈"p]:Ѱ$[J \<>T+S4r.[6iIVДٶh1 箢š;Ӟ:grv)͸Lc ^[ȝ z,jQڵj 2 7fp. Y8{c2>o(  ~[;_ Oӊ+G1yA֐K &$|-g);GC}=x|V#!=`w&ihxV2ӿ{1">l8q%h˚IK%< Y\,*,.f8ߩ ܻ2?.8]\M׋˗L#ZZt/wn&#E5r =QK>ٟ~._"uc41yx;NkP4TMT4UŬ]_:EA8>oVz._u]˱܉9}s=ljkR[~_\ޛ1hQ/q1* gʐ{),KVlLیd+)`p(3y $rU?Cm㉸Wv E2Mxy! :7O瀻[gߘsi`[>*1'mf|TLjlj8dyacbgVX0w^8sާnٛNUsBf *+\k>ojЪE%nlOeWJ5<OŀOAtJ1GSwO Rk|*ۻSMOWWlȯm^;:q0spewA͈'X|ŀ <]-+ AK9O1B.h\цJJ2jb^)z M+zŋcG˅jq|4a}[=eņ9]r]c 4X3>dJ>JƠ3O#BG3mDDZ5?Il|=Yeoc;JjY>X3M4:'ȃlLfɐ*4B܍OZJfED%'65̙JЯf@[\IRr߭N/|Y>㷒7C},O^"[f@B ߳e}2I>ZH/hdF}êXCιЁ+'L!~ ?${ƴ Ms:1skI9r6Il )-PEcuŒkclȡMmdqݕ!m͸O>>J$\ yK5-_Ís--s\~K)cd !2_Ȋir3GcP!rWQqN$OŏO}{mv~9aĭ?S5c8d34hi4TJe裒rfG^xSп 繗0ܼyi#SC!wG YdbKLWC!+7,I!s)_!BJIN?$(<Sa*e *sS!F>^_.֘xeۗJ{7nYQɉ %}cwS27a%Q |N%x5-ծJe~dw1:8TgldD}LO`Oӑ~[4 1ڸz@iۘԪ66frxo4\(ǰ*|߼ԐJ}fc;QatxKdTii_3_R2vzfȗBʗ#)tgҪ$ǰWm:ڕ!ݏi"HNI&aRkӯbY~_I -&m͛ =Ą3: W8g<;b!#yW.r4:m?eʘ/MK5,Y3o¢ ^K/w IDAT3 c|pۉڕ,i_>%:}I(:XB!tʃ+51#J_P^{,W)z0St=F 0t?^ߊہROCѳ։]zO$4K4ӭT"jW%#Mxy.}'Nzu啈tmnWXڼ0sMS'ѣm{=CScKXKY}+ݯOv{Ehٟ.O !_Ҩz&G~9ˈ13}Sp UP ;Oέ6u*8{myَ vEANzrT9}+8ӕt UT=zK4y婇3tŢdmh.hS%+;hAiX6To-_[,68tuZ>[_,m,s/yX_ǒw0OO;rgR烥8 ddySWf柦Za!#bBQ>tj-:uڟ &x_!; :nӓ+'3;7/ڏyts#mHg/WԳ'9ޔVVqx>U+g\ ZdF䧲+kb ZO& xZ)WJKi_9q1'n? lR݁t8HxIcA l|,w4'4"^chS]:Ѹm ɿ٘͒!UF\37>5үp-k2`)$䇘$RvcјTrӌ㣴N弐9 ^C䒯3H_V=4c8d34hi4cQ߰0Ds.=n:Խ,cģ]dHh!{vO&G m\A+!qVNHgK`MvO第XpG8Kl|Ea$';qYX,naXcw`,I>^[]ғӟNe +K;,YEcuŒkcа8QGn^WV!(/tu7TҘ0i>$HFcf0 | En3˅B W`h[:>ꂂז촗_L},՞l'9-7} !CI~G Ydb$hOm&n!ސ] S!x(ɥ|!BQ.ȥ|!B> {M=?%u4m?\e׻?]C)_i)ykS(-J7m /ݸv)vXR2v6&;B t6}9m'9-ݜԻS)z= Z z{/YVr~oyӅH$Φk{7$9[+XBq~؞wuXz W=*B71C۵5P.q^bX?um4sRMh{V1"XB`bTiB.O Q3=MGm$'İkRY;bo\Z9 ۾q-+^{-,:ൄn9`C`Je~dw1:ֿgeضMObb™ `_VEL֥Ư9tfDJ`}-_̖%fhJ1 7/5RDNTlp!mZ˯8K[kqM.MGhsw:xӈjJAA&h (((UYX3}F8//Z39<7(s#-kF+amWTxҐ3@\ŽPو8ux `yx?D䟍oT!wajN?Ox%p8=ӟf2֐n[};T][1F2etjaZ3Q/ѧWk˱JuZD2!1צ1Q+%Rs? ol0q%n/(5M 3'4u=ڶg3t9>E͓}_sL5N{Z,f1ğ~}x#$f-fD^Zv['ңSt=,k/H(yg}k1NK۴kƿfêk7ƆzOKB!”Xf4ݎ= \JBz>g t |p-;X{բNk'd9o\F!Yptq-(ΫfDq.YyF}.҅8[wbkxOkY۟)VW38y6O{:?D2ͅ gZҹƳ)}{9mb]ESs9Cey-,.?ioK]'wڍ'W/q`:R .e |b׆p4O%H0!i{G TrؤbÞ.PʯJM߲frRٛ_ڕ Bw BpLgV=oY fJ5 p(5@)ʵ'o\._2 x;fBHovdX4c:sdBvjQz.&NC%|ϳ?6>c6Rzn4}|9n.,s-m]YTjydf醎w]n[7^J~QܚIP*Q% Sի !waz$OzJ0[f` -H`S䩠sMZ:tNz7#g˅iC2b ga)ٿMUvR$/W\@JVvbg2 IMnjh}g!NAW}[\i$۹?١,m]/.xzꀻ[glG N:sU+vƵe[XK-% Tr/e_be:!o:7MJTs!oѣFLϐܔWh?9Zptsa<DZ 6> Iκ7U-_1AoxTСwvyŞ3>ք#C1OWK#:]YӴЈ|zOtvD7N9lOU[ߝcujo6cj5;h@KQlLfɐ*e$[ƉRAc! j~tT5giӵ5G=33|ՠUJ{ЪqmCXȒWdAmȽt8t,Bq}[H揺pa$Gi7?ĝy!o)sRitcxbSYujf gђl!-1 OrCL)ױhL[*r.sfsl"XS>d9+m,`ߢ:܌bI1X*&3V]ƚvΥִ[R-i),$o=ϽNK[摛ǕpCi軻?ƜxV |} ZK7ψ[Gw"]6w3~+{Y:*v\.c-iK)mȽt8r,Bqթfh PGLw>;?A!ܘg&I&Xlqk,f,"lƵh3|-vm\{=k`g5?.MGhsw:7`WV@rL(+p(gEL_ &7 !W)z0St=F ڼ0sMS'ѣm{=CSSmzGh~UJڈC8kƸyџgu~Ebd5ٌזt? C[ .҉mk[?CsS:>^hmpegpi4t O\֑f *+\yX1B!Pb>I9r6Il )܍ 1EK`nz,mSMgBO'E] +/|Y>㷒7C},']dHh!{vO&G R-ˬ͘.M\f[*͸O>>J$\ yK5-WxSп 繗nvk<#IJcՉԜrB!1] 2s1oa|IFB!=PNhh[:>ꂂז촗_(B!( SSg(0d͓A BQ<B!D"oB!R !B!B!T!B)LB!B!BHa*B!0B!B S!B!B!R !B)LB!T!BHa*B!B!B S!B!0ev;ӻQ֦P[J1m |S3pv'?m[ڴ?]Cb'B!K/YVs ^Irz?X0'9m B! W:*89Q~5 !Bӊqk,f,"lƵRٟ_'61AxEߵՏiIHL 9&mp,̾v? 9%Ky/ Ґ3@\ŽPو6mi%ũ4êm|RC*MĎDͦZ,1UQnhhlay%t\zjvg"b7ii?Ȩ8Ҿf:\b8%`u`'n\ZL`ۚ78z>![# g^?;+B!tT0F2etjaZ3Q/ѧWc JMF2Կ-0.-ޥ~0?.3RfNi$zmπg6s |v¯JG+2]]li%i>={1j.nHOѥDB4뭤TK$Bpzm#Ulh]_:{}P^Vfh7[ϩDBO5_aڵlcCpY̆)uaJF^`Qj.!Bܹ gYh1sd]C.҅8[wbkx٤Xu}!4~SCL!\ȹop%[o9 ȡ^?+qC\hUP38\Nmf.kC8{$Zt#7*u}k7 _āH)MLI|",ɳy2sBqSUSMU1kSx;fBHhHwAi?7^fwPU=FS&WLF.dF.x;gy\/L3c2)Vm%l12Ps6._2t+߻̢ P#37O7tn8_&(Lg6tdB!],Lӡe1fb 7X~uT` gGN&نxzO^ddW=o!<"ЍsE7 Uj5ab0Gu YSkr8 C93zeoxg >j2KVF_رR^:Lb{P0 i$>{VDd2n&q| 6fH6m~]oW#*Vofx(FoFӿ'ڮՓ9ˆ4Uy,X{o)ož=Ln_E>B!LA6y;#{|CpL{mF,'}ˉܴM{ƥVR{LO돘|3Zw+j84hkrH^;Za&mzG©TJ~SAujJOt< PKSi;Չ/tVteQl|g8X5xO;°v/mE]65= LHJ]'mVO|Q7J!O]0+̕\C `,ќ6;m'42Ncb4m lp(^pQΐ<Ҭr<+Ep͜å Ys/˛OطiI䜉!>$e= KF/ڵv`ل^Fnp:h'/4v9-+bP@= ű0Az9q ,2V+6>~[{L:qVS6X:? ȾL…  !O{֘jh蚆YtEUQ7٭egD'α,!, 7O`*⊳)ysZZ2W 8 nfm͘L*Ƃ+&bxʵۧh7HM,ү(RG ҎxoԱgYA lڏ HwiI dPę驤u̵,mГ)\!()$_ dZz߹_bOɗc>lKFE(pUE4RRoh56%q9%=UH7[h`pXQ;JalHMk? ]3`xЄv>gs^ږOվyʙkw M^qq%p*:6e#E [jLjRouvJ۬9ir^!xJYu%WKFF[ 뷢aipjǠƜqf.D :jģ;^*7ƦXdҺG4E1:Qy3+'8иk9p&gW; Tzݹ?/iErvl.=watz {{W7H*֔H㎾T7PoJ`oH"Hy@7:]Ґbg(LξԵ)x5B!͢A# <{ˆص5]-Ό_`.o~"$0b 3-a!lR]#Dzҟ|Ł;\oV%j:t,Q3'~7wN+oO5#k>61p#Q!q@I}D_Aj}̜Z}7¯jMwOp5&n !xk$4'̠},6U )-D?ts=r anJ̫mVO!O/B*reXkP~oB!DB!`*B!-r)_!B#ȌB!`*B!S!B!T!B B!BB!LB!S!B!$ !B B!BH0B!LB!`*B!$ !B!T!BH0B!L Ż0b>݊U~ $hW(B6M۽^eTe !B<j=ϑDX^Q+HK CS4S~+8g~=L!BS1~Xj@vQS?>|Nl_㙏vOL!B/n6a6ep%f'l9{P2`f˻ofD?[Il &:z=Փ9ˆ4{ eUj5ab0Gu K _=l_F, ¯B!Ŀ-B[zO}JijffӦ&qqw^x UXWZa&mzG Pi7t>#iӂ[ТR!B_0U+wu,GwA7Mei9Z M]dj׉[+wطiI䜉!>$e=UCsYt?I.lme}B!Ŀ/UI#m<<3 E)J)deV̼1TPq5t-/)$ɍSB!`zn"NI50a2`kwHw5+khi)ɤv%o٪R W;2tI\3R-H3nljco~mB!1SE5v)}Hy@7:8{ js.$pŋzS{ NiHe3zg_X_eF3ukj7iyXjOY7s:CuB!xT'+ g8=C~>YOcYmARl?[[{j>61p#Q!|g 9t^+WU8f\ea[$5| = Z},15p nddp3kguB!Ӕ OmbD#_B!?SwU4~ EEHBI(B!3>m RodW#؛!-BOt_B!rB!SL8̡;STuP,?xqyT뿎6U[Rp8CGpNͣ{Z40 vx|`B2/t}FU*Yő勫Rᣕ9z Iϰ_(&: [Z]1TW#B'Oi7ha,Fox ٱ 2u'stlk@]mPt@̑Yh dyiv>$ؒxݫ[acOB!x)a RuK{7ޏ pvšl%::u_@vO&q1ؾ1)dѵ3JE xEN%܊Tpkws0ӎgZP ,Bdt4[2 CrCDʐEAƄՆ)>| `֌kOY#(ξ̋;B6ߚ>`fdP j /ب-Lj!8!BLaz|сjҥR=gI~OmWp"cT}L-z(_1̲^ 7ḇU5 NNM_HF U _#(`7 RS7qȖs,6{k耎`4'N!IAZR2f&a3`vTtl+J0_ `t0e$[*S#1h윊k:?MLMJ&6.S3(PRHF? ,EQ\*YRNfZ*3v.L98b;srr@^w=:fŁR1pReJZ9Hhؓނf}↧8_nEs9/ʷB!X0M޽ആС M2Iĕ^>>Z)T; >9[U%;"߃_էL{O \;vsY2 iջ?'K"L(h9s &c |ދ}W]!ewI.qoV`*U5~aW;T)+..(`?HNfƫt|43!w2O>WB!)hklj_MOSȔʅz#?r\I/Nn1ScQ3̄~cPGunY8x4?ecyAh5ԊDVz$tS LLá/ѼY+wϞi;f19MRW!02l̜^9 n/̡k LÔϛZ̜/ZQKtnŵvQ8z35+3lk}A#oΚ>[B!Rr]qmSX!B(_Ui޼ͺIɛ%QBB!$T|f[We\!ҝ'SٕyGr0j&/}0s ^=ּUKۄB!`z|oמo@[TPA%NpIfl_c/(μ4؏W Rޛ؟V$sjvّ+{ư4z+C~;V:4 NwS/2O/`B!LsjMjy7K ś2N%{ 6/^S߸={ܾ( `S=?=,W4[Il &:z=J+ߞыNƹ|'*ZV3f.g[P3{T]f fu,eZBi8"7SJ.aMKԴ&"++lS^vY,;ǯ|Q'H- ֥](ן9eM3^aM! dF'0ˠjޣfP}ҷ8Mдj\n%N|Q7бiԉK>>)^~ -[bjy?Ҡ!M:O#y#j9|J1Ǜ齎}H 7PvUgS,ΗūQ=hل)>ZT$|xgqPz'M!) :)!{9Z>uݨ]{ ŊSޛA[ڶmonÝoD.ah&ȲWfi/Ϸ"(+Φd޺%s5ـc^3M7c2fֿ(#L=$$\e 3#W޽g9{B&)s66x*\(_ K@f-aA79&7ᄒnKeW۝[iC}{U5^/V[c06С˸n4 0:N)kfN;MqEWjSݞEi&H!0ē]_F7PQWn <եr"8kC5?a.`B!Ŀ}s97B"y(o%(i !Su.dm^:3lJ1s)ߌ$$Cc1f#Qߘ8Ţ(_cȯY}IF1]^S:qǏ`m8Li= nf 8/Ęp9Of dal-!; ca2Aͻ736M*'p\6!B7B*݊Mm3E15RgVӧXwn-myێ2 Bm EfҭGGkK'vt5XK vhĸP~z}>u1 O?ݖcױt/U<20?{ sL 5)(2m?Fk5)8Wۚ7>487hԧnIi B!nϭ%jP)+㸚ECXyqv3z# 8^}ֽZ73^^5z3"ПUrZy-Esgvl6@.艗}^}7eٻ?KzN^=>lH.+u`i%$51c_V}22C zJttF|U`̢-DFGe!_=*U!v|l !d&_Q[ .{2ŌH!+b["hL bJdx'c=EzL;JLOf5ąld])J>߮t޿R͙qє IDAT9C(ؘлnj cB(wG˜ܶ2}>a#n6Ǵ2-'F|Ѹ z=8̼Jb<~R:].bGX40cQ !/x{HWUǻZw+j84hkrH^.aڿB0=:v7kd\iK oy9q6iո݂c0. /2!*unEKij3C.ws06%ɴ26ضXzPj^)vSRE17C&e^|0/- E0mW ~%W,i?o>ÃM <'?mP|O|str~f$vѠqhhmʻڣ*&V-7;oG߼ܼ{MQ ,i6wgʔTqڮ]g2 {KDm\;24*`낛MBvB"2PBߓɬ;eߢ1=p\ZhQ7^kUT>xVEEU44-6!M02N2uP S{wvO-=]de{v-kP ݋@'\ (@.R]G5t@GGu0^(FŞ#661{` %W.tdM"8cbf>Q#m.hnXyN\-nL-=b23w4mq :oHo=k5?Z߳ecp;gAc$ܪn,S!?%Ih$F`C|/|+FE(pUE4RRolM^d4:R@io1%q9%=U|3d2HdY-%¥p1vGY ]3`xv|y ? k;|򜕳ډs5VFR7tA)UFҕdLMJƬ$l̎ʾڤd?R]BeieSƨm2LĬˊph 'NN-Mq?LߍawrKKa+|P]mYREsX.S#1h윊k:?ML6SL%s"9a i$e)97 FmB!;i_~yw YKdLC}{U5^/%pށ-q3:PN4rȦXdҺG4E1:Qy3+mmDU0عP~+|j/) ء,vTKo,6_2ԫC= ֘*-EdlG ~НrI֭RLٳ4{jwBRz]^z/7?b]n#ի7S&:abH:5M]h̗A7r+yIs:g%m*iV%3mHNfƫto;y*TG{^XGIFnL% ӣ}z>̜1O~w &mB!p0ճ|?o 426σS,>u&%, CʲkXV_@OcYmARl?[7wS:Ǩ,4CX']Q J9q Y0Hv%ޗDX&<n$*2=Zƴ.IFM+, a} ̄~c?J˞amy5 3MI`Bc>}r+%ZX&lH"klF.Fn|weX O-'0m>q ~Ry[YOD=lƫ&LEjʼΕxoM feZO ۠c\Fvc|/5ͧ9u{6!ORrYU$aT*/-M1sLjۍ f zt`]ӛF##~> !62B[!ίs(-.gnC9ʼeÿO !`*b0XncPH#+'eOÿtB/B!6[!BtSC,Owiŀ_ J/eiMSv/WXms&Gϝ)y:Cr4ޟ>ҾÿtliovtW#P'"l\cOJx0jqFq nrN=‰ytvS40#B!`Z-sP j /ب-Lj=p`bVum-Gp4&|X1Rjx'c=EzL;JLOf5ąld*R9|h/?] {K,iۜ3! pH,?+b}9q$Im (SfM8oL;1X.bbAϠsñ{$| WP(e"vE >A~vAFf\{Aqe^⧵}Vq6ћA 'bo aR{tDoI7 !(~RK4,~C~ -[b{C٦&qqw^x U Z |ѫ+4iӣnܙQ|׎R~7:cʓ"5/n':K% 7ḇU5q3c #/8M Cs@oSU0QjIԐx7y;cmR`L[O=TkvB8kWǐdݫ]"j7-aT[loVd RsNf-='BZ臦dz8nUдPy`̀! l~#/lwZ IT}6 NueC/*URW_9[!3cEjRbO`|'L)Cg 7A's-Kbݎ`ɉ\0=l(oУEV. 'hגdee+TG8 0rlKn_:::bE1*46*=n"Y%W.tdM3N>ا\Xͨ`V3gepEaXysffgEZz:74t=w (t- Te=l>4AiwWg~Ϻ'NZYnsQAc~CnƬZ'.k`xf(89;79! 3'$n !d3;Y 51& 6yHGiF0t̀A_ܺ$Z.FJa7\ n~E״|oLR˿ͼ5>YyʀjOݮ(1O[sRFR7tA)UFҕdLMJƬ$l̎ʾk2(ُT;Prx|1da[ 1kbZwɠzW1ۓ2u~7} 1/q[,(A}vO]sgI9bLĠIs*о8Fڏ711ڔO3{Okω$ 6dyV0k0hhR**YT,T̴T2ug4[;W7?\7rqO{~]OYqT)w \T:!/SE5FKxǃK{1k$w} o£q{f[/pRvg+#.$p#u"|j/)ء,ITK])Vg.{#wkLז`G\r&*+|=/G}N2k}fg#i yCd+e|( } FWo|[sU^:;Őt 4܅V gxVn=o )bӷu`r\۝ o62TIЌxnp&dQEƾ+\ή^Ļ$F8O7+b,r !Sޫje>YE|l8Ƒazl ^ŐbْpߗK؄DE0%zr y>_Ur=r anJ"MYX kF$ʯ>M+, a} ̄~c?J˞amy5 3MI`Bc>}r+h%ZX&lH"klF.Fn|weX {o@ѓ68ŋA)C<­,hn"z 6c&K5ce^JzqZ7|KZcQ2- m1~;^W>ЗӜІSԊDoO$D˴͜*м#W'=vbri|h X5ױ+0;*ϴq1Eq}c&r΋Zmz.I.BRryðIsٓ!B,/B! B! ]Y1nwX+M_R^B/k` .O{'`hݵ>k2p̒W&vĭoʀWw8;0 AJ bVR֭mCDʐEAƄn˹mTi w,؂*ض#خmcđ0&57#9Nľp%r"p$3Yz~M)KLub8}1c|+RڑrAFf\{Aqe^⧵}Vq6ZgA{Gu&j!`Dl)Z%?AI^?F=!lSø;/˄u*8gӽUkz;Bơ4o3lIkBzy/hdǦDh?ZitnڀVϏw+^W+džM('Tڹ/]*cvA1n8mK{c= ut2x7z)~5v\T:);.DcS<^'dg$3~`{)?TI:JvV\֓Fwv zp2ĨmhgӮ,ZwyB!x:Zc9 am*+N?j&4uokO]'n*"krظ%&S0>- Al{Fp@W4.pEP c洩i;qzignwÿV^ɴ0fœP4 x(Ǝfpg/TgV-r!z %6uhIey΃&ܽPYf:gsM;%c5̛yYFW=C3h|2 t !l % !!XcoGS(RO]qg b V\Ø9[µWNlN^K,ү(RXq{3 ݪ ҵtnh:ɄP v>ا-gԈ$2qt[lG22pBv.){Ũx&F%6b:'pYs\4+T*c?#Pa|JBd0ELɚ_0q 0mɋiFG8H7k ZNkh=ӳZJ2KbMFJa7\Hz]Eӄ-l>6MĶ!/3Ŕ$ IDAT: yUq}޳ H=vKw1ĞcؕXkFM1*v" "b+(ʡ~K|p5s_W>ego3cggBDx?vJp'f͆-˰7^ 'QDIl5ڳmlۍD} dffb?~'&8ҨsKl998UAӡW _>UQO OҍEkNRURIU a&I_,222@2\T@~}%ŋF],&&?c*Zdٌ%Ց;7oWnsӒzbhd#ŵ;%S0zSV lSK  GFA5b8Jhlp׆%^ts-5IbWd*A&]e3Gf4K..EE.GezrT#m'}g4BA7)UwPPydNN=rW~k5K6hjc;D&=on1׏cf23)zJ Ѽ5Nr&̈́C0}f)'v?kL ŹmH?c$~Z5dqc-}pMԉPVww|\cOt|p$CVM݌_ $mlR%>p={5(C d+=6u㯢H:_OWSџpil6JX 'N O|i~>㫘~9}:ɉ4 EIs^O~SF8C+Yw>׃i]+ee Ŵ5\"zVMۻ?t>qexAcX_yh1UNt}==g\QҬ;뉞+;*EڍflF6wۘ9Ϗ+fƖkqG/nR@ +He+T|9j|/:'?^v6=|{2S@ ;TKN~.t@ 0'}!$nbZC@ o |@ [ѳ@ eL|OT_V&yR7sn԰z49OR @ ^15mgsqQwbd$?]-TX]]ݔef*KopFF$4W@ mLU*5]i7LngR}2U~o9&ZLdrߨ/R @ c D{ʌ J Z? X?~,htd&""#^͘Ov2o t7>+d'7F#8AҴAa ?¾nr!leJnx&,Wb]x M bEXd]oa޳ImJbX[D5v2{f|leTm5/Zܨymqɴ1s,hf Hq)Nlbfr$ cŞ N=Ùف"ejgsy3}k0gC5Y^iM q3$Obhˊ3s?'9῁>n[N '2dɏ_*ruezȡhΝ8_RK\@ ,тf\rb[A,z*wdGMut^ps1Lkߊqr),Vݭ>nva>ˀܗMFmA/*iK5=-[ѬDHʥq-Δ~n^ y=0[ 깺v7_OYMuL7dn@i߶ ZVg0y7l{ #j\3"0M3\2\fv`(C ZƊT6 ?+sLΓ *X7bŠY|Z7JXF5z{,aDͬmg3og)<nPTf~dfjC]],i$X%`]mѪ9kpG[c*"سL{wލg H}҉&60' h9 `gLxmKɺfe8JFZfF\ +6Gc/8R}3G070ɋK/rь[}@&޿~A>:'ط7Am)n4iG6N//WrAH2(9k@.S;ƏRIDr?6wRYTЖB:%fNh4N8e? i hsӷ_M)$fSՓ)ՀTS|Jt8x*_^yvtUTEA$Ȇ4<VС=ZɜS|H#&>JS{1hNCg'OK J=tD0{,6W=Xǒ BHׯqS) 5 R/Ẹ: @ S$NFUjR<ښ ; :t~,0gkeMlŜe8gWU$2[S"8tB.urФPI2!٥7k6 $mI_jVD8z5YI: l]jql|Nϭ>̡̋'FӢTi5p %*iI<*HƄ%"sxI qw h4!5.qi`^%C\gYFAQE@ ^G %bU{[Y[_>*MPd1ֈh*1^!4^uB}GS$m5kB''Iy { E)worۺ:D#pH/jͱeI"Ő&;osLţhÁڥu%tAބ$SS>\ߧZM*W担ӯ# ceRIy!~nFS>EN{~'i 0-b$ YȼDZأKwg}5$cρX*CY|_ u YDc@ yc2'{pP#SgN.A6JX 'N Oa F2| fgb'ǝ[Ҽt:=g?C_!x--Ə3-! jfehdؠ._} @ v*|rEw<bn9R9o&wPcJܹ Xɓ^WΕ]zKp +7j.dYI4hWJٌ˗{_FN 6d4zߏ>}Lˍ ؚZeYCTمs&S=j27󂛴3ΎEfZVO͖Kgnq |V^̨径ojev77jgg z VѧM[8nيf&`8e'PӄE=Z5 ŀvq:ik!, IEo,-L#lin1KZ4)>DOƼms*w^^HjIN;ud?IT k5^H0vh\<>6d( =[)hҤ9m$^ Yu, _h3UbJSHpkT:ZlawQ\ <̹Y 3,54i^x9 8pYo.3,S Ur zn1S8LWOq.Xȼns*[`!SdI J[XznfRbY@ vHT'4͝gRA[ e긗{: 6Vhx@NFy]y3ѿ{06w9}eANmAem]P.sJ:b3rӘAsj8f)$fSdfhm+zcfQ3 S$Ŭʽ@ 7՘'%t7=]5)DmM JpOv 1hStXa*Ϻ85 s!UUE34BjQ6P]<p~Zɜb-'!4cϧ*41Uқ5/v ejS,˾((%sSWs:C|1@ ~^xqM%6U}le-n}x4AɆRA5b8Jhlp׆%d<*m݇PI[r͚PK%b^^Ti=zM>ZXRI :Q3IKMGL^ZkwJRV9'N9osLUQ"1o2%f3` {x­Zd~odީ8mFNc^ԶubLQE9@ p={5(C dkEjU'! zcb8|tgίGo| fHh:bbzu"7fS>uNҩ哂X|3}o&>%05;tg&1toTR9@ ^:R _x.+s@ Rv @ ๎_o~Vvsh֎˜ @ k/@ B#B @ E*ԓ ) ښ͏#aUȎ0".{_ЄB6V\*J]LE2 ix]Ǵ #KoA}2 Xm$'Wa^/&zGǥw߲l?j zb_ѧ"9c!=odHDSV3Yң -ݷqCRei݀:񼧾&+s;GDGs B`Ax-dܢYpЙxfi 7dO^G؞ Y \NdW@(ё2j2ꡛf%t*Julh򯴟\s~nvX|=|ՌKo}I(mHO g}TF$ǎ_]k|jTTXϜ=;ѠA>_NK!"q! x4:8SXw_t] S++Lr3hxy]Ɏ4/@RxuMKTa|n1y#H-C1Fֽ~8anz{һ'rԠ>Uv4jԊ^_o^\V_'LJ]id_ Sm5>Ws~NGJrGҴAa ?¾-̥#7Aj4uF,-"tVm;sd3>2hk0v~M[mvvBt:8NnaGGqh3?*-@[k[G'8؏ 1LrYw@t~I{~'W&?_D<@l7m}wq*ҟ>Րn4ϤtGo#x^ltQ-7 "‚9g5ڔ|j@?+1r.a@\ ܽ@> =FMi?BsȄ:|PĨg4MK6ǪTsJԙfr_752]33.3Qi]!ܤŜtvdo!%]:kӾm4\Zi7:}aSFTtҢ4ŒKgnq |VI>Ftl-,X1}+Z ЦڍcNE{?>myOuV4k7QcF|0iHP!} OtuŵĢ7Fkݭ\h;'aap4/~&Ƶh8S}B{2:["٤٭)OlOJ/ >mz 2{l|@gUc\ˮf;-ypz:2gx::^Ezg/aD-W!ۺDq3S-t8 sSiڜ%i^$1+#*wwͧpOy Poz:Twŕ[(bҖ+S:<1,x9[9ϱcE+L0C~tƳKzY#Y] 97q&~{t_ʭ-koD2-jj9*d܍%>C]],i$X%`] wAM"+ tkϗo~hW!_V W05*OndQf8[~"Ac1g;e;PQAH&Ͱv%?e>4/}Sy9řou;kEOe-.CRHv(.Cb3+|}K1`)Υ&5Xgm)zE:qB} _~ z@%1IB,KǞq5G2TrDnaڌHSRYƶj'ؤ\~ڟ(:tw'#|r*!)>kӬu|z8nߍe2x<B IDAT̈^zsfYXb!#fKs s$0* reWN/OXn//r= fAF/ψvO.(6<ՙ}oށ>V ˯yf%MgH%) 4oIthLxF.o럓$P{VtiBEUUQЫ"Y$!~&m "q;F gԣ33!6w^\BC5%mP:NTw/\kҗ;)$fkWdfh5Zi co"ijYCw m[610oz{LL :)- U k4vG+xS1i~5=硅#td@al g[5D%ۘBsMbbnkuʼ}L 2EqEbS9=U5ߕgXJM!>!BvrΛ'4|~&~SmZ c{߈w踻{v[G9`) ^S9Nj_8b(,䩒oIľTaoh$e=5p7zIٙt:TEy&BUPdx?vJp*K ! Ys({=UU$]r*q7߄V2XIUQO'/]Kp\ z?L[4v4Y/_SWhOX5z"jr%&gY5# |i&sg3zy,#-4h?d4Ԕl3)mdM!S'bESEkEA+ I/4*/T' ~S_^^bf!Mҥ{(%iS"r߶E]Itb-. & ޙO;"i PYXJŪt>G|T ^1x`]M%4f6kCfفҞQJ%b^Ō\Uh7ϒJMZPIZj:d`.worۺ:D#pH/jͱ4 O゗s?w:4{"Uʊj[@"$TlՃ6M0fXKY2 \ߧZMkx˗#R!.EYF(5Ñܫ>vǦ /-ffȀliV=9:o;E!ZW9O݊>=SŃ%|L035ɞa<#wcbC)qNyZѤeHv f GCo(iIuZRn4|E|Dݷ9UIJ3z ksF=4"foPFOsD|&R)z.o}a~l\-r'dy{Y /qgk{ 82u\9ޡ 7Ʀ+Obbzu"Qu~,)}|d_a㸩Up"dِ~Ua\J׳)[ 9N؛Wݠ> tgίGo| fHh h0/Ϳ@E~?)ARh Ot9ls F$ʴgɰA]cW1u Vs`ui:cbLCC݌:tj u4'_$컮p.}8q2{8Q80omG',_(2RxBrqhAyR8}2'1Cs\/ϼh?VM^M|eF3.͛1'_:q.AM"৕\s[L`N&8,nR| zpj:wy̋=L7~+i?X>Jo>?rV`tۓAc ~շ|orFvG?%Ɣ ˆLؓ3F" c*@ &eS caɂNN7@ x\q!MwL0@FffL@ 94"@ wØjk27?qkj>grƩ'"30~^:g'nHXGB6V\}}_LC^7F{|K0{Tn ̀, Wa^/&Ҿؽb@ x1l{B> Q.uLYң -ݷq#UHD6ԇ|&sZ7Ncw<﩯4z`oD߷Ge4Gv́-V_v4Ei?m>G8}a^?3XhoC4~.D/lU*ڞES~BTXO;1D:-(2 vLa>|n%L~P{{4%}iyh y#ro}eQ\0Ck|2;t7t5at@Egܝ걶3j8ꚤ!& IT[OU&j\ӑDžm"i N  !:z}Jʕs'b'Xѯ2)æhJYGe'7F#8Z? X?~,ho8b43Eg}.,3LODdaޫ.@\e|Y?{>tkZ0NEUŐ"2 3)ݑ;FDaicn{ְjo%9Q-3[oADsxj&)$ceVcW?(Gط?sӗ>[eʮōr"YWǬ ܉#_% JWz : dRt:ɣYܻ2+^Z?D]ؖ-Try+Vx"w?wHgxRQ2HKK#--LŨٷYT -cqJ5DIznXZF2ri\3'!h^Y1*~_b) ςoiu{)6`6s\cXnd@|Т/ˢrٕ&=[z^n_Xπ6hnt*.3Qi]!ܤŜtvzsӦ-ADZlEvJPhP9o?nQl(R\9iH9nCS;z<-]]qm;E!`o `jt%sOUТ'FwkA=W7 |XX̨径ojev77jgg z)}:[Ji6Gfvzʓ5Ӫ H|9sРA#~q,ʘ5f5>=E< _35<8+I &N8ZRObi;1gmF Q^z[i )Wn<Ζ_HPXbnBcCT8Ƕ37kӴSe;PORT'R$=eO`TrΖQ'2.;$K zR-k1lvgHڗlqehL󼵨E:qB}%_~9EKuo|"7clsT>g~Id}vO.(~H£<fd}]B|B !q\}L <ぎt]=ڭ{CqksSZT^HxMN xc=ǹ{é] |̭R,hTy {*oS&GMСci=_(/m:O&%{;ć(d{=UU$?uUn8k gdNy?%r~V\ZTȅNZni8b(,Ĺk٥7k6 $mI_RK2(!@F>St$ZF ddmo+5#$Dsl x>`?7zt4?F9zn=34>LEBk@ x<3Oۖ>nU07ťaWT4I܊Mu6{CNś(w}34 '> ^1x`]M%4f6kCfD%6U}le-n}x4A/Z2IDTk- YRI :Q3IKMGL> Mn[Wqhd{E]9d?Ch-@fMbalg[4*yc|=b e |5| -gcАJar.Grկs<}Ҋ]P\en|R3\#-.Kj afj,T6JXpVat-~ШHv5i׺ `mWhJܵka" ffFf@)z.o}a~l[#S Ώe?%}1oýS#/,q7Q'BY1 26JX 'N OW_fd?<Jqd,vyJ|z6`kP0!6{ PJw@xDƗ `Ə}ȗ_"?ZKߔ͠D)4qrH枯G:E]]k4"yc&qhPm?NO B .W qUS7WBw3Gn?o3RxBrcO(!tF4]E1{ Ђ+^FEqdOcӻT;13q} cӏјΧqhgnJݯW-7e=5.Ei1i6H@ Fat2̥#7Aj4u~ILG0"^K@2M~X=?x@:NY[D5v2{f|leTm oa޳ImJxҴAa ?¾n$wg_"*Xd]>OEȝ><9Ŋ~yX. ffTsC=5?˦-dxy]gtm]y2"ݹLݘ}uH;@|:Ii r0Oލjϡ<ڳHv/ZܨjRa0ۣͨ9֋?χ[14j*)*߉dII,㣒$yOeԟٶe%3=s󥹜'jX\/|Olv)5 }LzdZoH7i1g*59nCS;z<-]]qm;E!UiӖk {"[Yx%䖱00 BJuާ}*h{| m{>,ej/g͍ڮhP9o?nQlPK6H}Ҹ gJOh7x/CѼ ςoiu{)6`6s|n)\)VF}ڍN_ljty҃Ѿ hӊfƱOxj\b'}@:T[VMy3_i޻?>-&JfǮJ{?뇔$I|I\!`?Fhq,mN 'a?&6wpMR@ iLMݘc!?]kҤ9m$^ Yu&3,S '&#d܍%>C]],wb3H Zb:Ϻ4/M2hӡ%Vv'UyȕÜKyTCBvC=IQAH-OIO0q d\=ŹbrmF Q^z[i )WnvSM"+ (/Gji{AzX*-i ;#'ޚYl)F@ mL3t1?ȪYV-2uKt*:4X!c553r<`3s{Y6((^TIh%¯_ѡeKqכL06wy;;>$~YP3HOL!95['3SFuObN3L, 66SyHb#Sƃ)JV5 @;.z.ۨ-&Tm /3 ^Oس;4 F7WWr6t"jۏ gr^΄DT2&dRkEA\3P< dLTE>ߛ.dr,O:@o͸aPc+ ZHefhdundbah4Z-R49>k{rFhY^6@ ɘ %bU{[Y[_>*MPd2`I&-hF$-5}J2'%Iy { k(worۺ:D#pH/jͱ4 4^uB}GS$m5k'NM1ֈh*1^)YҸg޳`YT{(mbnZRy]촖qK7/3V lS3s |} M?gl|"̈́CFw\'UP IDAT,E* Ucj$רD (Ě~mXb (T5JPwXy^xfyf9F)cinAK474>0{ U  }zƼ?)3QKDtY, mwۇPZu*WNZ1I%Z~KB!^D0E 9YߛHy켮Zjbbb#;,!ӿ%-RBݛ-aDKWϞjY,$jddv@e;%KF1t!ԧ#ϰi~\Uɑ2*>`H'd2./$4/h.A)b Ɂ,YFGIʈ+rTyr!Svɉ=Y%I/݃i46(>G@b~ɲSz0`tOVĨ7w_O&x8:O N!*Uf2Btu5 er7<7[?~ܗo_WEhnPѫB!^J ?+׵.`(EK90 qOB!Tϸzx\F,d;_|\Lxʡ_&SBRȥ|!BJJ B!?(agoRoיV1Je}.BS(ѹÔF5lPUKKSUMeݜ Ħ]ɖj_?|zhC>˼<A忒O[>\ǬBElF4 Pj'0uVD'oߛƧu\@U,zCfŢ?ˆ |־ܣXTrEq<0{DmG!١VF}\+>Iw:(^,ApKIJRҝQHt,7;4駮d<6n݆߾ݣm>};!w0ڣTW<ͪe[2Ju=tzFk$#  Ur5;H)ce||BnKiq8O~ "\ !LTd̉ԎHM6*3E Xx'n " =?;0hO@6miq~=@yrSN'[3hm:u=IѫӃFntX/.,7b䋞w?gHwbAJL+{=h?g= H[& |C4loJy;17mO?Գ attF?Fӎh9IߞPF{Tv|^E͍gR.wX7_~~ѣJUi({M]x; 0eb;$ !`jΌF}doޟԺ4eSlG>au>ܿ1PbU ]JV;s#dn$'q=)ԛwGLz|x!(:URt%ˉA˅CzR]"r0ebIR!9Y RX5q-K%uƽk~4 ԤPNWeg>Et9O5Sk:OjUcgļϦh.MF{Y-XZZN%w'Qd<i-ޘQ;rs |.ʫS!GӜh{nߥۻpu.7iy3j278[%llMDldVXcAT  hs6n?W] \op59pyǐCvΤ eݠ'7WAsI-2nG cfk3̬l%-A0\lmM~SƜޕ@!~)UӵB,߱E37c&tkUmv<9wff5r-s۽CA|).>/A؞߭)T!L Y]N$&$=~3s6/iqrTIM 7bX=yjI/qh%]FZѠF(L TRF ")ՙҮJ!wbPhMlnHM&9%miO-i㳕SkS^ь4 07˫['aA18cǍ0Ʋ"/+:thg ,4Uk 3341\YYYQX;Nּ<;/+ JfnSE^B!?.>/L$Ev}I ,`ErDk%+3}=4,_J Uצh'GC%V=_P&F 9 [LJ׸t lߥf !.TlԞei_?5V4ۛYkkpMT5WhVCuVTyT{Lє:ax5zLKs[ _=bHLo#6>fL1Z$# ;ÍCQ:Ur٘}d -?%T!Bv 9YߛHy켮Zjbbb#;,!ӿ%s~ '7[‰88=5$՜4YH XʖwFKǗb:L=B=,Qϰi~\Uɑ2*>`H'd2./$4/h.> zS LDҞŬMdO`yy# ]|y|?d)=ng'+bTʻ'p_B!4V3H^!:x2_~HE>ÇAE&B )x~o dJBr)_!BR!B ڒ}Y~%ۤ. $p'ܙL}vh^2<(3ʫ[O!BiN,9~x;d^'4Z&ξ1i}(otg7;9K|N%, U4@ cÈFXPS(ߝxbCX:.l},:[;f u؅i>A忒O[>Z˲z(q{Pϫ乜}aQ9ޯQ2zB!\U$~=?!/Lg#s궡is$ߔ佞xJHAf>@ӟ&M\7mҟZN'nO]8T')zczz͝qۏM)ߥwiG ,ASvj bhP9ު%m˽1wb?bWQ%~xڸa "LX)z*p+äq -ꭔM6b4R3'R;~"7ܫx̜B7&S;͐{2F,br|ӝn"zM~A,?.|g2$ !`Te|8GCm[/_ʎ-p?ʶTof_rU=Vx6B`Q4u@2ݎæ5@vee}Z7Mp-xOZRX5q-K%uƽksUJVܽB_*t 9~ϩҔw5v C:~PAM %teZ6q~4gEҔUOuC)gj`|ht%ˉA˅C2qE҂. =U^B!īM,>|K>Y̳螺N2)YEx0iQbyX>6JCr"3nW]*Rҋ![i*sI-2nGŒD|f2 [CSJz*w+b8^f^ zrst\V`, ϯvL۟d-hњJbB!az%C:2UkB s(ZKqE;X<1è&V : 4q0)-UYQxL T*< o뀓NQIN dq)gF 'ǰZcI6χ2 fԳPpvxPlH?<.)d:䨒vcFk+NR3]/P==H֢| 2*B}nMP l6 ׯ&WxՊFo5QgEw{髹k\^JtR]}mTx!")=B[󦙩VION=X6߰E8tX?,'fs( 5Q=#,_ZGg9yhS" ;W^A>w$g|{5=_P&F 9 [f1`[{Leh?j*3~1 J完6kʫ_!xRsD,a[&P맯Z}!˸侐_ zzKM OHVryqCr KVkQ29?|FLT.>sω1Bٜ3 l7^l!/K5b/Ůf/fn!&62["M ϯg=_Yў+lDϫ<`|њeq|(ft#Âgަ zu;onAqmH>լBWRj])5;ݔw}_<:x2_Q`;fuIL>B!(>uB+cDeBT:v+rçB!*#fc~qJ>ɶɓ8!u1v4e=!5՞MB!@. !BW\B!LB!`*B!$ !B!T!BH0B!BB!`*B!S!B!T!B B!BB!LB!S!B!$ !B B!B};62RA5+YYOT0agou&cUOR%9wBBSsZk_΄O Np;5)FkDip^TFB"<; Vd̉ԎHM6*3ńJJ0i{taCx0O4wru޴11dmFSZV=Qq ]W7ѪAMpns*Ӄ GY*ٗ3&/Lzx.IѨ:lqr0w_>]1+,,2sK,%xlai}$*sjΛx[bU ]oW??ȍaӚxRU ;L]l ~ʎ!pse٫E9̹+BTt-NȻ47h*;`ʹ&s3Y SkgГӂ֎wH{4I&%ٶgoex0iQbyXm>X] }{nAKU.^ƽ$3,- 3#lgtEdV'}J;薉9dГ#0}ӧVTMSh FSfC~]޹'sICVK} oFn4sZ>Xh,3'-9\2WB! oIEopq;ej"Z譆8ꬨnOY!")=B[VAE~ԕz*k [M+K˜Vf aaa)0V,x^{1DuP[fڭ L1Mn*iX^ӺvٸO|0z.YQ\,rFq{"kN%K-VU{^݋L|tE]!U ϳa7'{>2U0b዗s4AMx;S6f"w1'0ϰi~\;c ]ABZ>6j`ي=ʼnɸ=jA . بp^g=qUoքGMrzMjJaMPB{Eh;ɑXbnw*a GO>x;d^'4EZ&ξ1i}(wڃX7ljɣ+Fbt ǎE:y.g_XcAԶ̿0'ظXWi+ׇ=/Z2斏>StaQfe:Nch1yt Ք|Yc$B' a8tNÆ 佞xJȳV zn; S;͐{ UA#7w: uoxD%VŊaeOo߁A~ڵiKK5Rsmbz7}NG*.*ߥwiG ,5Ӕ󄩸B{T:߬Ix'WMU˧/ѱ[Po"&9=ݩ։;.Wϊ 9i׸)^ch%tA- /jҶ*+F~Mh>Ӟ8o= ~_dyBz0U9?[*=2KSՄ{ NOU=>^ؿvM*P̣v۸oX5i157ՔBS[5Ƴr!ed\Öθ7{Qrcش&TNⵌ̲>^fhns)Je da/q981cզs+,'z6.Bq*k]Ҳ)n#EZV iѡ]6 ?!/ٶ*wʎ 4ss})0>0gS܄B&`0ٽNtuЀM!c;˒a)nsj h0:{6's~`h]|xÉjbtY_2Y0GGEty 9YߛHyn|o)UyTCDFSY{NtBV,BB#|r&a#4$dE6%!z+#+#!LSj?&7v,cVJM/\MF7|/-˷R!ozREQ^oLmPb[ yFB)(׵.$R!N7h>tV{7 R1cCVIMđZϝcuel碜GB!v)_!BcdAD!BSmɞ,?NxBq-sf^;p`D1Tɾ[C?"7ݼ(|PI,ruxea2Ų|wņoGLZʬƗQj'0uVD'oߛ]@Qڽڗu^  M>}QJ3ꛝ%Fxcx*taO QQĆaD#ۦd<6n݆߾ݣmE.L "6.(|Le+ P'B'ء36,*s9¢8s_e)BH05ªZ *'m~t˦{ $ģTBnb4=:݃Ӱ!ed(?"phQmjJyTNM[ *[u_Rj9w`Ъ?vmҺR UA#7w: uoxlj`/Jy;1(c0?OO77: cAD|(eg>=X<+Td̉ԎHM6*3%eyfZ=~,7b䋞wk(t=B ϡscnXǃok̩MWŪd*Z+,> ԤPNWeG>.ZzHp=l=֧UAWXԻ\=ĩ F!OaYsFx>KeV'}J;u7̼*贏JQqER`y4Cᷩ).[)y5r+Mxz`Ң>d}/]Ҙ!9O{~_%qlȸA~,HJy)7+-d!L)s}=;Nջ=X+;sECb]n27h5Zr1Jb2B򂩮 o1n|oDhEd{YT mne&1bwu~7-0Pc!`4ܾEJNZH׃G; ͓P[>x 4vTRǵ6kP}00Cj2),<,R1仿1j%|>FO2g' 4qt4#D@󼺤n@눓Jj]AWTgJ*pQB)Bݙ.xLY,⿋q s3Vk'7;΢/@"u\1scC_r4W@asQo0s NQSmfs( 5Q=<\M *iX^ҏ}tPo\%xmaVq~4Ybe)t_Ԍ6\žӴb/YQ\,rFq{zƊ}{/k-Vߣ{ͳi4`IEopq;eg<16ea0PuKjB!$G VZLh|<'s^<{MO2]Q5j' y<yxg ӟcR% ㍘'M!i>ω1B &!%t>ٽNtu`H9gi 胫9-\/az=<þ,֘v Ůf/fn!&62["M>Uɑ2*>򹜮?φޜMPL$sx v^fcQ:]G?=*3B!ߟRj2X=9mݙgׇfOE zo+F{VZ覼Üs//fLƗ_xj#رĎYf+i!/˓mld6䳽cð^Vέͦ36k2Gq7U\uB+cD/z)U]*B!^cm@95[ t0o[\ٍ318d%dIɐU^&cYOgHM`n~`*BTO\B!Ϣ!BW4uOJʟө2rGbh߱JMë^N-ٗqkWç˨ =ʼnc13wfmdp9Sv//cYOTcB!aZ AOUJy0a]'_ʈƎ1g{(GV3PԴX@lc7=&w{ڌʕ",:C)w)c{݋fr~ΗBu BÂi.KfYy֕? -y.ع3rxGɦׄT&3 g3_P4H؄skk_~^6|?bA!S_r짟"3eU]>ıgە߈yq?b^B9}{6ߡ }w?|>^b;1zm('"EŬP%-XPӏOGgi7j[б5a :Dk:60 ++ i/dAUVQ4],w (3 kȤ%$47y%) 6doǣՒjj{9d(5S7AMgUJ3ꛝ%Fx'*taO QQĆaD#g:xǒظu~cv*7-}vȼ.Nh]Dl\,Q+c`ي=ʼnɸ=v1`QNz-B!^@0=i&HʓK9o~C>y{/bd]Ǻi eI꽆ӻbw.\:..݂l9_^_,bdG۴onIEGSй#}9IߞPF{Tv|^54R"T~;wÅs(_&W b8WʍgWy#ZWU:7?O*Y{=h?̖f}Χ?Mt;:oh~^m[]_6߸rU?qڴu @)O_6q1>x'#fS?a;X4z+ܻ>b] ۦ܄ɸkQoCf5ڗ~^3o~OhF1|X@VF6aAAebFCbjl{tYIjr c!+3aHR-fIFL/XӼGw*Yjړ^Hd"ūV4z!:+ۓfO__r4Ww.r;6 *<"Rңky,ũѫ;o> k'7;>#'azUJ?1F1KaC\5h-ب=M*[zP!l7M4V4ۛYkkpMSM$\-z |E)@X=GrOIhbFgC-Ȳ1!SG|Ύ_7Y?~$]lߪD4wIyaO5؅NU1o[KN&0I{6!K^>ilƶ)^=f׎TIc9e=g,c6,{}͞|.s?5Hv*kNȊe\r_Hh/^==c?æq'X$+{<<@Hƣ$DoeDur~`ޝEY? {Ȣ?-MӓKYN I%S'uHB 4-RL%55PQJ@@D7J((<d~]s\_HMYvwe~zORb,sS IDAT$LC_HX!qW/}\#lfғY JMSG!m#wX"sLV{Ifqi) iH˜9e3v "|_+ƯFhA>!(~MK#3g.SqTќ 3cEߊᨣ_U?i Q3]#(BGSqRmu/vqIΗPZөTEL&怱iE sB!T߂`Pp)$ɣqj_W˸gB!տAUȄdrM3a45QkJyšݨyȊUUM jW5,B!Duzl,`0`01a*7`0(+3^^uG} 6+#ylkdfPߞviԝqHݞJzz&DԷ"x:f7+V~ݷL+[`z}:QHJ(OwEƑN\b%Ό=[S?׬'hmO'}7|a׈๬KLegZ1CܴEo4=`q?|O|$Z> mmTO5kx?BQn̦9"eNU{^ &A zg^͢ıX:ݨ ilz3c8e#F{+9׻grNECb4ՇW>eP|6#Yoҭ ؊Y9jȠ)?u{3%"ȜzZ~V?0;lՆF⨀i\=77"Y`ώI&v8skkv?BQnᮢbW`Dvç;SLF3и#璹pҷ]S+"y}<Oܾtz³ 4.(t^Oo+dpTΩŬ |VW /e1c+' fJrY'BoI8s.oe]znŹH?BqGLb _^H+LEo5Y0ˆK|Yc;i. G.7Bޥ*To(n 8]xqNpsuB*7GYOcؕl{EΫ,΅\B!d*3Yj5X|5a6Wrj\<@Z6.D@3~,pVZx2sK7k (8Ɛt}?@9OpaJ4֯8sJRؠ#B !N= tcxkYpYG1a*E=8Ԁ<ñKj~È9?C-_pSxJzY$f\>^8Ȳ,OL"yzJY~ZKMgy %%\,KB{Ik{oEp/NcW5Ӆ0ҌOB!nF6s(rS!]:sY,B!-ϩ|!B&GL{* !Bܗt7ʪmB'{OofR罤}65Mi!B ׿S}tkZ+ܝE/ l_ khkǸ { !B[ FvNMq>y/̿ڑ=9. 6G,c<":f|B!$v+5-5̈́%qbGbKy,gT:+Ppm=naOع9 pmsٝڏPoy.6~o2k/?/_Վǂד/}->K4/s43?1wvvFPx ه(upJUU$ !BA05[ɸQvJ>Б/'r l\Fj2s>v%)8=4?|ҟU) r$ݽX~ě~}5]DG!;XȨ/v' fˍ8No⴬] BQ 1l<ѝ~C2% 0sb~H H.z'zdpa8'Kz=ͱT=ϖݜO/|.;χຟY}^{#lcSE;B=Cl>J+ebTTlT`*BqnId&N ].nykdb睑՟ٗS|9Ι9b!;|gb_D&?ҹl(<ȏY)̝">$+DŽ{@Df n6X8|=fɜޔ|5|Y]!V(~MK_3g.Sq$]b{p^B!T=DnhNj]|% !B N3L Dtd#MB! N !BQt!B!T!B@J}!9IENDB`muon-v0.4.0/subprojects/meson-docs/docs/markdown/images/win_vstoolsprompt.png0000644000175000017500000047043314737503617026656 0ustar buildbuildPNG  IHDR  )QzTXtRaw profile type exifxڭYrE -83@׹*>N-Ld2#_yȣ\ZVW?g;.zwow #ۅn4"FׅׅR |]`~Ϗ`iu 맿=7fob<)$ϟ1?o }I?}_#aB6OQWeo(~^w>6׿'߽)i/ݽt3W~=x1}}{#zKƯF, 90 }]a1Ol|q^V-_ƖFک~M%w:7ށwŴǯн |aah'bA&i]+X4wpz\J-Qz xc'B_`wa0!bl!0\ǔe)UGݛϴK f%U@r'fI%RjiQfM5RkmU7[jV[k6{깗^{#eFcM'W|z9-ZlŪ56l.gUV]muƚ;]w}=O8ɧzgy nnKǯUochkߗ5cbx Qk{9:-̏HV(g+Oke\u+tsZX?/'VHiI=IF:sձ.v2i0`Z9~wy׬@&VO-exk)Jk\Xqֹ',4`e ͑z4"OAV'.fq>XZZME83ekb6T]*]>53mZ9:kes'! LNeUu⨏X#<0X,Z}ʓJ a÷Lr@;T> j>Zr:mMtyazPyl\ <^.LvKG<}8+A|b'4qyGJ']]]Ewk+!#D­u9{o̞neՕ#qw3.?5}+gW$2c[#ՔÜՔ "LdϤ2hrh<*3[ͷɺՎM-ڷI\k2^K3p {/&]Ҋ Q˚wC\rUMeߏ؟2q"čLʛ2ϫwoT.% vc^igV8փCMh xΪ.4HB,.0ܷ *'U\@1= t,S6RL R 셬߬PnNJ%k _>)gȴߣ<%MXi@ &(ỹLp3(Ki* 1Y擝'.~S 3 (eAHUڛVj~Z,Eݱ?dvdbWʈ>xgtO`!%%@WyeݻSsd*`HKb,j9qWסg=`l [5䝃جc2]2@TҘ&'Ϟi$܈eH9hw$r\#"O\+'oxC X,P2#.l5XCC.{^!4vKp꾥xvrFBd6` {WnaDŅ*D4UdOyAGcYr Tfh2׭ <`[V'B!3b0?YDgQ<#D;E[4(&,\ 0Fa|ŭc 2%tgH,ߐ3r C8<aٱ&2A .z ܯ"1  AqWNˠe"9D0)LI7HcP6n@Sτ"m8H ia 6t%_.272#dO SVvIZn(vUt9qV(Յ#_vKq bRqu˂T\;~xY|-ٌ!'ox]d)7~YR?5%3-;`U#<#BC'_BB☨ Ȯ `[&SM9Okm+鸊CKzHvÐSY5cqYyoXM$р#4}GJ/NZXhMj6 %9XTf\R ȩ8JarH#aXGSM b׼pg!W@o+#E6JmFCh#c|e6ÍxДVGOغ3%LLLb3L& Nc*};3w$/gf +48;HVeFNTHŒZx9a a!AR9>ϮU1s-eD:u՘W L:FAc9j$l(  z\(E ;Ÿ2IX n1'pEBNnhNf> 4c5OOH: LE'`Y -y t}eB=bƅMXs`&:|(aV`&dLC $0M([$s ʣW&V4~ )x/>8X1au5cY_׶3nda@gX [W`W5ʉG0`6zBI`xKkH ehHX "_##7pȈK؋$"K%xң墪%zT:bf4GP'cFUrW("fCN Ko?49#x9c*IKL'O)I70$?ڌzW†=lo=>㪔[ /hr߅+ 򬸴0rQܞAN]! }ICK8À\Ud99jI$+ 0ú` RK@"{;.*(G> eDB(~ Joi͈PadHq\H 1r y"xyAvafyBa9L0d$ V%S[t? 0'^xģ!'E#v<_'FýՄy1a) ۴ Ext#,,D>&T'[tT9^,MVAb^"yH"6è̻ыTG`V 嘸Ug7Rw8Սc(+P\Ν; XQF @7@lBdU&Y'8IJ(,E2Gټ(NТ]/F6GR"oIpڇA5'E&"t 8+{ iphDwUUFtjO`]?彄Hzm Y7 e/&Z, ږyX,W+=HoqGQ"@$ x6Ux$F¸.Pw_RlzkLd_7 jо$)/Qܐ-`6Yۖ"\*D:<#1ݍ**Bn@^;\p sHݳUh 9XJ5%/+{ W=9(R=Nb+, 3jkpS*s+ј,[z=ɑ]~6a*ǥR>s,Ip?JT]!T@ E{LyZ¤N$|n6QQ.XPk7Cvzj'dbaS Mx<5b"k{lYLV1qpޞ)vPowRbHj$7S>I|O(!.KxTB]u˲1@MoC1!QD$oڠ{fcEM n 6*tBM$] z \6zmh3W(JXZE5Gh%k!I`uWht.xQ%CE@fUTrL9C@ k!mI4=aX$t @ЌNZT `aQ)%LvXb_[ ߈W[N* E>ڔU! 426\i5_`0zKPB@NFU59ƻ# o|W&2Px. Hx-!|ԼH20(QѳI&Bd<1ocSadĨ^4hxV~ưy *=9Nă:@ށkP˗"?GLS8!"XFEb$P!G.ýAZŸH kyE3OjF[΀2 @AKK` 4DЖJ<&k1kd &VfEfb 1b7aյQD"^ T! ]Sڈ=Pb\tIhDi e'twP &Rv19T@ ox'biŭfT 2WdUq3 S4 9Dd{J!IN֞ [թDفZVMЉ$C4rZSCΏR"ZY :!y@ӂR2d%xOOr؜ŝU*yx䓞23Uma'߼l*rpb. pZ~bd"_]MhZ"DXM3յLM`0m2BVn,H TA8s6*ԡkCe^A;hfRj G.<&-Bdu1k dvnDQG$dH{; X],GE+6yH!(l\%dF`1VUǠGf 0 i:mvԟ8,,8ӓe*'e 6_]Sy#RTC{LI(B2zW W#0OTBBjA}Оҭ SG) W.ڛ-R@Ew@ ,r.HpW&XX3iF^Oz FU;(m#<띯9Rh׀CbKqqQ9r8` \;@yGݐ7NT ӝ@ff/i"/Tq{'H{^õ\ :OY|HX(Y pceu S&OܿGܶ*R 5hBH_*1Z;ƒ7/ eG"Z,ŭ1leVqJX!cUmw$ ~@85 t0u Li 6r.(ZD~W%p[ilKK$4Il*Լ#q/J'N MwY+X\M ݦʉ:ׯӞ ncd|u#9ݦ)v$yY>xA.Vuau0OYZ~cӾcuE;ƣy.qݮslH! ry㵵 ʞ4b9'E(I0FTsvƞfu5o(ŊEuJ^Y,"3@<8(DEXiKs3rUFCRWmAEhr5"^ |P ?]CSFEkz5 #a5G(RNL:i{򳽍qȉ"G;ǁ7U$X B{`; 3(U\9S~C5\#$[U}@ttU6%˭6hmȓ)C[xLmB_jX NǏRTxȓJ2KǴ6E!h3SJXRvcno>t>-8v/l<*22:_ɕ,FL%QZ/f;K[ywEH [$N^_*#K{iK~zKU7Zwmr\:<ϙVX‚)i@<@juᄢj)3"v4]YR2T`Szq-9W?Nή9\juVdOev{y._kr|P|{özٰ~;^^KTYs79tO|jY?j7!kZ5)Ŵ pIq|_6/f­*EOFno_4 >PV*`=HBqh C$>DŽeGoBL*S}Q 7!1>q"+W15ګ1V|Ʋ&&iY9bf6IU_x@r,JQT :Fx6t*y+5N{ix [_ԑxa|yU1+})O4ቹP{3a1B̋/b{*R_ ڬwߑ (JWe#k54+RZ5{j1GsmT;Q 'CիFqQlxPnA'%#k[ *:o0i]"2N$B<" ŝؤ dя8RhԵ smugfnږڨZJ$wl9 \6l4X[N-P-՗uѡ%Ђ~cg捷tZPy(ëӨSOv~]Ȩ^#_Tl& %0V"LU@qw&bk.%/a)Qc{xrR ItToz ?r_E-x?^DrՓkNS4$kIL5/"yT$JP~!-:Cr&J:ӡs^7/^) 5J ,B&:Hu;DI9uף}F~P!$4to~Q­G'?u!)guF5A$7J=yFiCCPICC profilex}=H@_[*-qP;Yq*BZu0 4$).kŪ "%/)=Ff8jN&lnU"ACL}NS_.γ9JdO eaoOoZ:}+I 9A$~~12yP`YPQ?yZ= Cyme4G" BʨBViOxH.\e0r, ݚ 7)_lcͺmv<WZ_m3Z.ۚ\COdH/30p qd ppĊ=Uir2xiTXtXML:com.adobe.xmp Screenshot +bKGDC pHYs%%IR$tIME  9 ; IDATxyp\}9 +AII(*Erlʖy85VzɿWjy5U#IM*&OUf*8-k,ɲ67H ov7 A(SE6N{|o9(Kb]V`m3~\Gcmn9cieg5 !.vZwt.Y p.W):]OXo_o}[3X> v3宥e6E4ob#hV,pף׹2A\棳LV9jzgΖ$)F8ȸG힝yW'\![@&QC'{\uF.qyGf(Znf:wk1u:qT8ydžp:w5 *_쯆0Ya-g9v {vmk M4پӼ=MjCBOxϺ]^C&>aJZ/}_0}t6(ɳr0iwq 5iƶ;hKN2hT!$]Jׁ}liH:ex\ӴzKvng,^>9}Ky;GJ͍- GuYU5EK)_o_ה[?ֵǎs׹L*E)hW'Zԩؖ9>- w:dD*DbViRIuٖ:sR9VweV'Pz񎴋ե2@EA|ehkVIG[3GU38R( ݄~H$4Z)bh 驹C#tB?׍+ #v0~/j_XLǷߧnx]岵v}R 8Q6($5:" z (/}U x[R 1aH`ߨv=\R`>Q.TZPHyOh堔K"P6$ #|y.SUQH:OB"" %ṸZa"A彮(0y-סLAP KViWa .F;U쨣+A~bRp'l;[HF"A`K*~!.r[RӜ/RVF ?Xmg-yoh/P^h_7-,%9cy"%7ZcǺk~]j |qg䚏Dup:2 "z AXP!MDLA"b, "Ƃ  b,    pp u&fdqm\V6ȸmAɭ;؎nη01ł\wEO_`F ݍI7cl7uT`'7Ha#1ś+ 7 "w=+U ( EԋֵQ?]m͖^W ,.` rnMU@պ$R.04!&a!Lz]A ƋVv 2 ڪ*,҄_4S , ="U$5)5I716vE[ 6&he8)OE-%1cA{Faz &I%EmڍE֘x1` X5ghkI:P,( Z 1cA{ŌjLRۚ&` Kd X06H`H( eTlw[!E-ycVC5roAD5C%IS!Ơ%m\X&OQ@i&r#˹"&v!A1$7%f, b|Op)AʋMd13XG/w6!M҅X&r>'{ɉ,pURtӀZ:"wA =fa8吩wqAE`("??']O"`Νٳ5\b ([- e!0,xQHW&TkT^j&u x~&\ œDZ.B}_^c֭<3?07߬ABmy`,iS4}5 @(xhЖ[ax[4---LLLinnu]ǡk-b~ T62 Z%?0O?4 'O~hhhZ˦Mp]k-7ñcػw/ijjZ ?8zaJL&IӨrh}I\Mb|aOr#˯{rcǎ77dTU Xb040d!Iι[-ʑ(D,ۿ<԰k.yg)LLLpeE *ↆ>466{7xA[cGs//Weroo/8 x!1HhJ3oHqa<;eU܂ְLdh5 0F-xahh_W?͛7e:;;fxau~z/#G133R&ûᄏb.GG-b|9Ν;ww b$,pw.ҵ&Eub ,GxruJb^V'#Y5Jʿjy~u``K.EB֯__^lݺz/~Aoonزe O<.]>W\A)XTGy6pႌ@>=!q eag|:7ulos5i0-+s~iWuR TrKk-555d2Rhiii'OÇkk j/q288Xk.֭[ǚ5kؽ{7Ӝ>}:mF}}})+KŸv(椔=/t:QlǏ++FFi 5x >Co.i~c@}%JJNsA^7' ^ U"DbyaHX$R)#<£>Z!oSOU:QϟNVeH$|>`·R2W^g~5wlܸG}^{bڵhyyGhmmIӴsq x'xiiiСC<3-W^1^,'OjYJyddb |*`#K(scؘ6q X>t=cLE.&[n X<Z._}ǡctt~1hwehh(O>}^{5zzzxw/Ԃʈ5TjN[4GA?O6mFSSr9QJeN8G&d2I*bll\.G>gtt\.޽{ٶm[JhjjbbbE1^$?wjCRV5>khqRtqy$GFA"Vj%_8444T<Ç9pDl6KG ͛7Oϱj)>u'N ˭ZiŨaOxշiq Ð00aHAȱ&ViT8":&#Y^A. ?Co(w/1wm>U ~055Hek-}}}|{OO8tPx"?yGajj(|2333aٳgٵk;w$"^z{'|0 r?~K.b:;;%d2lذw(ͼUN$PJ155Eʱfzo0Ku;"`#Da r))-Vұ/E D[Nq\ZAn*s]Z[[Ĉ"CCCEZZZPJ1>>^Fhkk#N8J)rhioo'LV涎WR(d2y SSSCKKKer=[68VƜޝ>%> JuIQPM\ HCOa@``B72V# p!W\ʕ+~Ee7Bh 333sޛgn>[=/8IN.L.jj#82aBɜ "j0dqV1s5ܚOc"Ȃ "Rtĺ}%/AAxhrdeM HKhY'%1cA!LA~g< r XCrOXV,e;0`mqVu\Jfoܲtn $fzIdWlgAA1g,dAAXn$KADAAXAcAA1AAXADAA8cA{1&Eg,V-Bc-jQeM<+*~Y}c]K=֭ǺMש1AezיXǃEg-gIuӲ*igq[x,cA{0VDF E 43A'M%* w2^ykŠ , [b7EAA1A'ČM-b, iU*1^IRjm JX1^e455裏i&mLÇE"ADo![E{{{}xxg8tLF*KČEW+Aػw/mmm;::җRAAX-,U b7ߤJ.#%Fb"ƫIN Xڪ,ձ0dddql͛r}!LOOKE ZXY,I:u ꢫ]v̌T TUDPѣG au 1cn0>>Nmm-w&pQɢa^)H(/|x"lVAXmj,,ӧO8N" CAV( b2(ԩS?3rqŢT g244Ŀ˿HeJ tJ@Ԃ y!U b, aY@XA3ČEA;lKXXAX)&T pgEX\"Ƃ bbcA!1ccAaEȂ pDX\"Ƃ bbcA!1,! &*DܦQwzDqRD-h\PLظ (Q;`A*l*'ޗ J֥}R9awͱTGKS ,VaW*ofhK״߯TIۿg hr?Od|c_7p^*?++-ʾ+OM~oq)O m6O=]h**O[&߾b;zkǺz0"݊/Nr Da[1Z[Wht2RjV;[Ukni h5k0) ½mjP!fullIu-8DX7;:6uI,=Ogy_:gtfM,,bլZ\B*Yqf&{籘]7NA6WjxE\8w,5Sf8|I,KY+_9D9{5 .h]*ŗDK[8Ν;q]W2441"^wuuun:֜9sko֭188g:fyBK.Cs>dرc ar a(ϭ %m,(&\MQQm[;k7|p<OXݤQblZK׃kI$h$@{1^6XxѬ!٪0 L$nؕuKSmM6>d3p%IIu\Gc&a զYVdX7Q,_jb&k]v\QQ< CD8_[d%tpA5$pnesPmsq8JX,hkIX1O0W=\ 1QI&:tP(8q:oˡCxI&(hnnF)UI&k֬A)./IR|+_aݤR)ajj3g5Rb!' aR 6p:;; uORK]]][oq)Ţ ^.rҖ bp.4}m &Z3k 3B6Uۯ566xAYBc \Ypl)LԟZޣ~]tWõpM,ƎX0l ̼~PEɓ'aΜ9CSS>αcǘK_;v`ǎ?$ C1Xk+t:M6gttL&COOT c i&ZsN֭[(gϞ%͒fy?Ν;wN o/2::J(x'3gpi رc#>fFGG?O) z{M[{-\.8gS35ѕWSm|[ɬ,,k|j-,3JHk0>=wʺ1s07+,֒0qb[g␃[ [[={Yjr>/𜙪>]v3XkL';;۷\.G?~}{k}E?<ΝZpJٳg?ݻwyjkkq2}ߧkqQ|IկVbLLL\Sp+u55P]uyʊmA<뀙#se52UaEe|h+OEt62 D81)%H([Ʈ(;v;4mФᓁP}P38魷ޢ+WS6<<̫8q{Vfdd^xt:M&|f=zصkT 5###\B uFRjB}EK_[UJ̾}u%bxեi_N(10:E 裌Aa1~spCCf.L :r g߲!r"*$,Q1d}GTb ,Z`;#; C yI2I.ŀZv7;=6')D| #%5irً~k8F|LEfvJk0E䥋8AȆv -D!Q&:8J߂6DiB=`%H[Uܑs$U愂ktd<ꒊeC-Ccc}5),\2ȸlnhI)rfKGAq޼Ʒ buW1m,2?r9~˃11v6mK2{ /&ӊjqHChT1"٘ \7;|ID \8cACZ\ԥklCU] 5ǃP|j+ɯ%0?<%KPn1&sͺ{D?+SB+֠?(Ơfxf?ebjSM8^iЧ7:rqSUaӓ/7_ e֕>֒"8=#jj! 7*h+rd|frc8$a.P).yȐA$vU-­ij՜nehXSκi^xo"D+-LD0c͛!Nx*$0 1 ~5a螉HDVbն2q}k 3>Ea_;B1Lk,lV|s0br* KRH+9^x^Nh5p$I7fȏ]V!Q%Yߌ03Sy_]W+)9:ً= `x4xZK6RD6ve j%h|eɇq;mPheHkKx6GsKbw1ck%:OچllLŰb o5(kK[5LMA;IV 2'㠋be?d}o2g^ɍD~p~vR m**&~m!GCܑ!=\_'5|qMҴxτ1>&⩍ ?Qn \5'9~6l8#14TDv? }7iIi.dG䁃R<јt1\81aZ y9kkθ85؅4nɺa"& 戩֍l{MNsԵn"ո髗 f:2+L\k-k6ekż<;bx$*; # l 0Ri ' 4yPpn< [.|jHG*eh8;01-k#h4`7Թs}-WAxOIvsuq[]Q:$ply{"ӓ`"^zːʴ&Rhૈbڛ3|)1c% Lw~hID RDm#|m$kѮ֒$L}vz.y?dj vhq'o 6mƌK Gzf : #>hмv5`(Ӑ4 ',Fcм=374-pb65!=hH( ɐ|e@xb%ioS/[v%K'jE}_y=FDY ϱ4& dZS۶_˕S۶NDx{gUaxug% ےhH;+rDlN$ p. QS|}S5)DbO "k$uρ"Υƌ˳Xkg&=zټ;~Cpqq5dGȍLF!u$gI74NYXVv榶VI-IMkZZ6ŒR&]6iHh X$5j4iִ1Dւ)́]6Čźp?I}:c1ygzͻiظ/Ez>b_0w"ݴ9&Ҳ!DɁ("wqY[`1%_```"C.4DB`<D.X?2ƫM" aM:2SfV Gxј# |&tCqz4ZW<QP & sw6/`D)FΟM0} ?;O& ֈ r^JuUW[97ƂQp5D!uICLĩ KŘռ1hlHcFr!DLDQ39>k3!px!N*,oN'޴4]O1?^Qb쌜?)2VP:v×? h)[qx2KdnkAXZ?L߁^vD`P A2g-)+Q+:aIcp-D 5$UbjB{k:X`|Ξ IaLʴ&b/AWdq 1ck D=}g B*",MS%X5Us4 |U)dlMV3jV2.Z FbJ= L RLaeӱ\ր5Z<ʹeCmuC۹FJ]ڋ-jV^E҃Z, eثPX-} A)r=L4rJǙ6b-kwc)d vmƌJ.tDž| KTMfAۮ];k\I0?+8|l'b؊*̫QzBe pQ0.`SUaPZc^ů4gX2KPU3CeJ`U0@hA%M経sM/;)v%",§1@Wr̸$e+T'aj3q\ie.8^T*.k*{DAmU^SC-d&dݬBws=󧭼Ų*Ŭu 8{Z{%I1n(ʝumP(]XP4b&WYjA٘ (=u NdIK6^ͺqbQvvg+OCxQD]yv} TI˃MU/,&vQY5#.WzNJYkJ K@Wp҆2ݒ@k2B*ZK͵Y\Zi(*[,Y"K}jPvMGVhAV[Jkw9ϧ7f竵>nvԅp/i+4f<o}]e_'yӖo(Ue^Jx-J]BO8۷uc``SZXkͮ]hjjbxx| .׳k.r===?{o$uy~^f]]}_ qqA$H$S׬4le;썰z76fa{v&vbm3ZdɠDBRZZ[o(۶m#Hյ 2V }QV^iKee%;w0 <NW^y~?mmm<<#E^{ݻw%m}EQD"+WH$0!߇MfǓ?ex~ObB5x.Dw a% @Q@ᳯ( Ƽ)FؿK)eժU\H$PU+VPSSC(ȑ#xUm(+++_ ~_|NXf .+W}/~Xx@QnE #V竲|A^[oE:|3TVV200Ν;ٶmǏgd2^z%,Y׿u ),,X{=Jss3?8_J<6~5[i&0/2${ pOgM~>~9$_X`m$">(PPT5Kk*&*%L&}q/fJx7ijjb8kXz5^P(D4%XTQÊUR)%kD!c p*`&TRr筱jM(,,K. W\!z)**H&12 i( YI)QU˅x<9t:8RJk|rpɤ#pI2 333wEyy9K.X,~3B|K_ ˗/ww477Vl 6pIN<0466t:S2y _$k.TUx< ixl2c!(9PEfj%0EA(*H9[HnQp,I=)BNz#GPZZJ""vڅi=z#"%KuVb`zzz[fA8f߾}\vm!miL&P(8DN(s Ο?iN@ ̐dfllKr=EQ#Hp._CUUz!n7gΜ ~͖vK{yo<8ʼn*E DLKn'לych&''I&<R__OAAPWRPPիYf %%%NӚhMdffd2i|2dD &^l&|>;vtEGGDIN8A8flܸͯY"_̳XoZTT2u8l̹*\VDoP~U]Fyy9~#`ppH$B0p!z4CFGG9|0+WG]]k׮ٳ:D"eZ`0H*̙3曔S]]ʕ+qs)?.Ş={P|;>}__YF(qx>G"G?>@---lܸbՊݻ)--СChNހ;%똙I6mD 6 ð˛^4.]Ӫe*7n DĆ >OD%O L&42%)Q %|2w捻V|[|thh4ٻw/dio##@UU-ZC=OG>ŗ71Y\4%v:uz<mi˗/<_pT*iV=wII ]Yd !cvL:rAN8a%=h eus]6ADG;f|O<׍3O7ŬgW4ץԅG:66F4eǎ\.lJ5-Fyr1>>: ZTL]),,$|SZZ6l@QQ^UUq8D"uχFJ8A %%%,Zr qZ[[y)--%KPTTd%L0 immeΝRQQm۬{7n]v( W\0 n7n.^Hww7@kRSSæMHR\~jh6 !,MRPZZٳgokb/a6طV:Mu+o~Nyy Jk2oWnپ};}}}B!fc0xy'-844D8444~Kb&~Rt__b&^t:==}87 <><Ν#JFyᇩѣlذ=_4ͺt:͛oɞ={?#ǭU~7D?җ7M^x뽟g9sfAw/^%KEQ8O~yjkkm$Nsĉ;'U~EEYhZIN8A46 ۮjv1c+S}f,VH4%لlDbb.%r333;~FGG^C4q:K 3M{\\Bm/#u8LLL*Fr:L(*"TUQ@0ى*+]OzfKT󿡦Ɇ bʯ3Ӳ7FOvx~l<Ϙ3ֶ퓖r^s>+~b6lذqlmaOֲ3G7>L)je)-dK53c6lذq; /`AB!HĤ)L.?iN H$xTpA$nܗM~n/eMs3nBR닲r7y ]"m"a/?ܚ`cϮ2ə${3)*\F[)]bx.<XUGᅵ @?#na"b3 []&"WU\l(6`z RglÆ T.UsIJ7'ClYح|WRR)Hݻ S@CAVʳ]@Ę=eZbWZ Uzq옏 6~)(U/nr1Ϯ$S SIq3/A޿M@Ua9yžPr=N! z?;ذo?~P4As \aJJW):Em h4jǿɦ'.SIPkʜyT*|04I)xCm@CU^&5A-u.**XF9 4eSa"fr;t2d|է-Α&K4[^帐'XTtX?Z]T`F_ )D21,bl,ؽK[ UM g 4B[},-s*GR5Í^OУOttH2}1`JX 2s0Vi\3\mg2W#$?H͚71բ im~É7\,/8v/X`}Ѵ5ӹ5ָ9֛8l,=a&޼Վ(ϭ a- .<䅍 F i&2u>[:i %^GU+x4Eܬ!ݾ E_m V!.yb,]nhږ@oXk$ų+}, *DeN.IK/4$k\7ә.DOK ͅѬ^)$k/HQ 2H-]D-DFzpOnd$._`9niaƆAl| 84nR[Fe #)-өr5A7zXg"iri,MƐL_SU⧶*{Xӝ 4Kcy3bSL\#:(*tPp049'$M& 4őIь΅ݓ\xDl5vpjX1 z$r!1\\XXNPd=K!3i('z"*7SҰc$zwx K ]}W#tJُ &YH8,s;KCtIܔҹ4D!ХDu)apbC´&r6ʁܚ"0%ML e \3ד & FLf"d\@ڔr?x1{*!0D0KFt]1.sK2ޟAtFdW3~_i N_,. 11w:Q 1RQ|%U(iZ;P7 T._QpcH#@Ć{]/77$7>lRJn-Ya]OݲnJf!]BJ~b$!L˹ǺW`ױ]hɏHC%r"MGV qu_e Yo:!<Љ9)n\I@Q8H@ϐ 53JuD8CW+U罰 6>Q6f[W{\5ISg&ZAtpnVP԰#H'č^e-rƻϡ(kYp:fÆmd|_:bSzdx,[,%1/M&1I'czw_i5 ="53d3_= ΑNhUskmظ紅Ōmd|G_,(f?M6lظ l&{Ma1)T2Eynf_瓫=;#u?XDff/Ɇ 6l2tt[ue^6Qgm(#}%6lذa*Oɽ5,=<% 6lذq 94y6lذaVƿN]"??#AQ-!4N^,oRJ^K݋{*b=wK~aÆMƿNY|6_H1}>;v젲!b&:td29cS]]͹s瘘爸K255E{{m\.~0䩧L&C4EJI[[hN2/1~zvOSljF||+_^zw8<<Ӵ=9ذa񯍉N{ݫNLOOSWW޽{}+؇JErxPUs`Hnm.(sTU39I[[UUUhFkk+ H)~:&93<Þ={zLNNsnJCC]]]O 9vW\GeΝ$;66i?RSSWUPp8L2$HSUU$IΜ9Ç-b[r%{Gqq1gΜѣsH4Mn7[la͔!dbbΙgcqR/f477[yy8@(;wxbEaff^{mQ\\޽{ɓ{n4 OS:`0a044D4W_%ϲi&E!Hp!n#b4B44 ]q<Aww7LIKK < -N~xسgUUU$IPU~z Yf k׮qA]Fmm-=-BQ+,2==w]Ldݬ[׋aܸq& /B*ppΞ=K846Zu5FX7?&`5!UVd~D=!e"t3Hֆ墵G}iRSS֭[y뭷PU`0HMM ===Ikk+NV$hii/~zvɢEvirJ {׉D"F(B4SSS رsgQQph4JII {% q9ٱc lڴX,f;rQYYIUUǎƔ?N0byjkkAJ̌g6m 333$ -dl8cccݻe˖188Ԕuw}~m۶b eLmڴ/Fq\~rJKKijje˖Y(tSSS lڴSN( mmmN<M61<<̵k׈D"t: ܹ͛7E"e˖O0dɒ%]>Fl‰'Xt)6mWذa}24вK 5.Oa%^IJ7dt=GFxM0MtMSbbibj`a`8Z0KI)Ybghoogpp0ؾ};Nɓ'ٿ?ϳ|r,3[i可:VbѢE>|}i1M:Z[[.ܹrݍ粒B~?;T/"/_fҥ.Yǚ5kŋ}vz{{q\RRijjp8L{{;/_d2Iqq1n׊+hnn_ X̺'+Wj*~?.]_oͪU(((`ѢE455rJz{{پ};ǎW^app}s,]`>K/˗)//gϞ=lذJtǺ B]F"$bٿ?/_F4yGټy3~BМXoAOORJǹ~UVRRBEE\E!RXXHaag4M|VBktJQUJ3Wg!EEE x^ÓO>ɦM$ }UUp8Bh"tt]RyOaݥKxnŌN'_G?gϞyzoDr PQQAoo/^[eOL&7 PU]IRV!,a?e߾}VN B H)I$d2֯_OUUlذ+WvIRܸqKUUu?ض a+O#1c ʩZS|g"M5T6,q1<`x*s-%`dɬ*F9U Bq],ڵ[N-o>N8A<TTTCY 9sƚy~i p_|"7oKk*TTTw^}QK]:to|ٟTjNN&a``;vD"~UǩOO-ӧpU'cǎ?̶m۬{oraoo-#J188ȪU-ѨUd&.l߾RJ~`;;;_"ۿͩSHR77VN,CQ9rO?4۶mHhxx2 6_R2::F+Wx̙3g'Jͮ]?8NKުLg剉 L^si,w׾__XWxh_:|Iv@8f?36l27BE%.Xap$arTl[)9vgDƎs$lZ]944:HKLv|0::??QYYiŁ3 ;D"K8pD"aR)^8'NƍnN"ŋqVO"QG$)++#J8rPRRb)ݥKNIxxxE7n`bb}{vQUL&AuN>8PD"}X|9~2\2' %5/29e294RJB꫌PUUdkazzBUUU 355^)%hh4J?7nD"F0DG{{9ȫ[F~АUN7Ξ=K:KVoI("X|BUUoTBHoo>*aRr5x(**rVXaY_rX'HK<x<mBizK0A/e~4z { ͜'ja['׹(/TI8Й(#ө;4iX ]&[E"-E\{)XP[[R\\yL/~{!ڮ5[XXEvŏcڧs=?399i6lel&SQʘH_JPMvPVmd*k73>[. $>%*jkk```.n7 X!WZiuxX|xҥKV zmZeR[lA4:;; 6jd3VSP-&`!s_3#3i6YاP]Nj.:'n 4bRA-p(ªUxgYRJ}^}U\Buu5?8;v"o ne˖Y+===Jeeeر'xJ䭷^}ndxQ62JUJw L#G9Burgēiw 1 zwtm\iǨiy+ZORtPr.G~pXpH$b$(((X;7 R<UND"w߮-m] Vlن [[G% Xzai*&'YTC&#Qx禘J"WK"P$L#[g|҇Au+iG#)]aUSf7DB塥N6.qQSgt.t sa\әy{VӏY2)42aaÆ -N1c!Q2FJ"^K4LtԴdfs1뛱1 Tg4u掗PD%{KBڰaÆM6~eX |BAɑ&Ɍ!q) ]Z.lHxDg4cM4sBCQ*1Łi?rL%aO(#&2ҋ+bCu%[@uT,݈9@ƻ/0%MAwHE)[5\z fdmذa&cwC-Ak9%(I!t 4U)D* Q!f6DHbw~1A`Iƙ囨^AZМn+Xɺ~ kZ4 wQ%J& A--^KrftT7\~zlذas I FɓN. ":2[ 4 bƍ]/C"C] KX눍]XFYKE !/z1H)^IDO%(ld{*HL0{!gdذaÆM6 XuprE|3κM4 BW+|n$ \%J.qL]f&M5ⓣ wa4/([Rؕ w1c6ldl߂͌$_P:x%rh }6z|%5./+;T\}$F 412Iu|e(hdIn<2J[ڲu鸭mذalFwUKzR,i$&~mx*A*"-(EF:IbS!< A2%MI1aÆ [*4ngME&8Ei:!$)Z%;i|IL:˧LޛQ{oՖ%y-[d!!@ @2̤25IeRJjR3LMj  K016Z-k!u`9y<FQD.Bq2˪J3nL 0v6o#]#B>xh/gՑ 9JH-(GLJ$#@G w{MTE;N,f%TEfoҘ3 0B0C\y{IxD2`ˠ_  `o)ԨByF 3/${$YgXY@$ 0 ŜĪ'Wuh(X|3"!0`Q-I`K%PM6  ܮaAfϷ]T㜱 ϔo%Iҳ6i"TUE?P "AEDf|{EI{Yoq(NW瓘ڵ/1`g p5}'&??Qexx^{P(l6SXXHEE׮]AI Áx<^u&&&pSjn:N']]]tuu!w͊+[(ߦX,tP[[KRRݜ?lݺw}q> شiǏgxxX7 dl`!233HNNvF1TWW gttT_\n%v;VmCf |Arssx IDATbHD$g PtR[[K^^.sngVXA?fݎf baٲe~Aٳg555|>(vcqAA> xcǎ4vEuu50*B P0"q$) gC@EA@^<-YQ:fTqTdl ڌE̙3:tEaa!> 8x :###b+IVrHK.68qd֮]KQQ}(L&V]l455$~a6nHWW###t-8/2W\3oA 77&&&O^/@c  PPP@yy9>Ok Oo1'Vk?+؄8L8j-txja<1vuQ.ieEQgvSP-GI,|Uan7LNNvE 6044ġCHMMd2ljFD"DQbPEPDQHHH@$(`PΙ&L&f3np8(XVL&~](PH$L&VEQFbVDTUE$]2T{1b*G066߯KI><f!"^H$Bzz:$vf~~?,c1ȲɄ,˄a0,cZ$IoDQ^6 Ӊ(8=>hDQW_?dff$ Ib$I/I055E<GEl6& Q1(GN' Bq_Efv|m%&&SSSZsL-|RRRp\ȲL4յ3 PU}6p8X d`ER QUjTuG#wXUAIڤ"+2=c$D;`?acrO׊iF2~ڌ5Blh4 _,f3VGpùsHMMe?4sNjkk9s ---|Qjkk)**7%III x<L&<۷od2ұ6of;i[Xh4f͚5^Däk.222Ex<GΟ?ORR]h4oN>M8Doo/lڴznJJJlD".\@SSc՘L&rss_DUUf3k֬cݺuDQL&z+VǑe>^x&''@QN' 9r!9y$wqEEE455a6Cm6` V5@&"I(3צ(39ECPgbԅ , $ db'ebtww~zV+Vb׮]qa(--e۶mcbb2nJcc#{ٺu+\~t6mDff&DQٽ{7^n7 >xajj@ @OOP|J];Ć ,YjhllddddŘ$SZZJff&锔ujj,b3T)wgpH?0NSPTTYQPYg~W8qYFLjĢQBpApe_DeцݬXS++2G- )Byy9s 2999XVaǎtwwLnn.ø\.o Ix<)--eժU}R$VZEaa!9rsWSQjE2旿%XB~b zzzE`0ŋ9z(;wԥMNN$!2###l6x ximmEUUYn/2׮]### $I"-- YjpgorJ}Q6nHkk+uuub1x N8Avv6c&DSOիiiiڵkTWW׿5po~8NN XV6eQt)b0ͤr.^ϫ(޽{e^^|Er188_zz:`!bHFHOO'??x<Nۍ,~RRRHNNp) ѯkߝ@>S dee!"ׯ_ YݻwNm477sSXXH}}e OfqҐ@FFI4Ă/y/OW+7 ]u X[4, K.eÆ nzzzXl'?ԚCO4ロ+WRRR{Ǒ#GXv-SSS>}w}W' EQX,رC'v=IIIhzyyX,*{NN`[ lGWE'$$6MB- 6 (3feQ2}#Jz!\[oEzz:_qISI b3M>}4N$!N{AQ+\FGGlN08[seY֟ٷQ5}4[m@8 p8HHH!I 99444w^ u‘%K`AeLLL7l`*nF8OY*b jƍR\\LQQ)))RVVFBB¢;~樣oAK3799tV\w]8~8.]brrP(Į]HLL۪I<QnJzz~f9011AUUs YekגCVV;v젼\BA ''GɭYzHnFQFiiiIwwVbd}hFrJ6oެiA<555sum6?8ڵk)--x衇b?dn O،%9irr2Ns!^p8ےضm1*km֪4l܆MS9qRRs;w⩩){9Ξ=K(ܹs㏳e8~Ç/x8{, L{\ |__D"tvv_BW)\|O[b1kծk2׋_*{/`bA{9~\?$mgChjRn(dffR]]ͯ~+_|EΞ=KJJ>5ўATڠZj?#bDaTVVγ>;GbVEQooя~)7ߤ' DMM SSS={Vbd2{'&&qC3 |z:[Z]j4bx^ZZZ(..r9RfMZ?U)AFGGyg֝4 t[8GH$Bkkjv횾8]|g} =N$.z|>a233#4mmmt}}}… wohkkcjjs1>>eZt~|rA villrmhTog,LLL0<:DJJ ׯ_044D$w.\ J 9x HdApUUgddC8FUUIKKCQ"Nbdd@ GN'nx<ΡCp8Ǧ~vaUU|;x^A`jjƐ$?όp8~(\~#˗/"}g_(6bR G,^`=*H7EN {glE8 w~@} 0`?SxX3&}*l| !n3ҝj#-Ȯ܊  0` V8lFۀ[a3-{j5$@$AB2ۑLc 0` V,^f$ӜƖIvy +6뛦bEŞIƲuT0t53LVÍH[=9Gfd")a N j# 26pyir- P ),Zt9TW#OdQM7ѭjĨ*XEsXh3P8HH_ՙA=9  GQlSz|8 &h|#]) dlt-ʌo|2UE "6` oOX.ֺX4c]6ݠle :Ȅ\L4QZEBZ''bwbKBET9"PQH ,$HKprhKzZb!?Sڀ `69ϰa7i32Eih9K$:D{=y)$uT9N={0|WO "1"~!0YeoD=n 0ӑoVݤ:8ꛠ lj((>OKB2h@;]' 4o9Btu N,e9HWwQߤ1] 0` -lIaxC\}{5,"9j5` ؐ 0`g CM}+*Bgyg-h ܲ:K;'*ޙv<郞hYBFc =E&CM} X۳PMڙ_U&Xؑ*O+&axv:&R%(1R dX" 0` / TD$3g췳tYU45,OM0ؒg̰)39r|z3 ΫKU1;1FA2`PL LV>J ,dE Ӣz}Quhh^z@K{hX(..f477fjϔ-[`bbW_}Q(,,D :\. b &͹?##{w,9u٢d2QTTDMM ---\rE'O'p8Lkk+۷o'##C6|N<'!!ߏ(ndY @eiooGe")))LMMaIKK###$8@oo/,_jhnn?)vXVBQ\ŋq81b1bf={sN(yW9y$@eGyy9ͼkZgϲgo߮o*^ʡCHMMeΝTVVFkϩSȲdb{ԩSRWWGmm-6 Qx"=Mi=$IbŊ޽-[`6ۿ[^yzzzؼy3[lAdYfhhCqeV^HMMcǎD<'L]]餪 Y蠣RN'O?4/D"KA K^4JKKqx<qel]8 b1V+ QF(B0d```&Ҁ?U>`U%%IX$ꙘT-cL˷ ʌצ 0]Ԏ,) ']l\ xZ] M{{;hR֯_OWWرǏ#2dggo>hoo󑑑 hkk=xAG}"Ο?,˔qF$IѣsNhii> HDmm-f˗/#+WEff&x^#,  //bbk׮e{ァԞ={$&&RPPee˖155($''S\\իWٷoK.˅$ITUUqDQrΜ99s :~iv3b9yS'  hooG$Yd R[[\9 21ckR]pX:UrQ8@PTUFEAP59Z3,ϐ((&8ZIa vTCe]ݨIY0|rvMKK ^DAAIIItww 55lqܹID"233)--eժUs[r%K,^zIJKKyGپ};---Y__{xgݺusVV"Iwycǎ155542eǎR3gfqy^x$IbӦM_+V Dرc$%%!2vm۶gddASS@u$Y^H$ .;vO)..{@J|Ђj103j%;+ ". z)V qCI, S$FIJ1Y$4&&&Fddd苔ft\AL&XL' ͮ:>>餫+VAQQIBB@@?񐞞addEQp8s5N'6`0H[[dggDhjjCmoo4N^s^t"2MMMBrrBHHHmTTTv9}4픔000@__yyyb1&&& 11@ "55TǙl6i&L&l6lڴIoC4%;;QexxKnnNüY{C  JKK Hf,X;w$FQUӉ",ˌ "D"}v^/hҥKQf yyyL&:::p:$$$p8匿 BAA3Fnn.LMMݍnX?{l67)++cllh4:G-kRYY /_FeLLLc$QPP@$b099>{Muu5`qEb}?JyK+ߊ6H/ fڵȊJdB5`cF@PIUAYebuY]&!ȱ/P8 :&6mNlu/z,0BUUV;AfD"jAEBݙKkl^P,DQ]5?l6i)Ő$Ia8;.i6ZY1LѨz~[EQUQѨ>>Z[.VmnbAgc4D#wFg,=g|mV6fXiv`ňaV=m4濷6km,EEI+h6ի_w5$dT=5R2kW8Pg?f¼Q7/?0k???+4;=?>\LUu}Y=`冣AƷ$20`K&hr"nd4$ 2 26& 0C*6`dlH 00l  26& 0C*6`9[DƷZ:"iϟh~`I7g~ (V|]m _ǭ qfnva'oԇg}Pf\ 26}n"wMff&x^N<9'ή餬T? l&;;366'teeeGz׌ VZEJJ gϞe||cKIIa֭苕pB!^Jgg'`/z~AA9'l6yfJJJPccc;v/n팄 Xd W\s1kX,RTT/^s144v@ii)֭fϹsdkʕ+Φ9ߍBV\Iss3lݺ+V/]Doo>ZP\\b!F}}sTUUiD/_LWWPhz7ɡn:;;N]v \pׯojm3 ۆoضmuuul6B pY *Il͛"55۷SXXH,# b| jrw{ݺuLLLOJJ {a͚5:WTTAVV+V;w255pm6^E~ӟnmm,_{ׯ'wybo5j 2buɄjEUUBb0L,]Z&''u_$n+Uz _͡C|Fˎ3 (8HJJtFl7(D Y&if&,P& FDQFGG111ժ<P[XlI("2`pQjf雩x< {PII ?0`W^y{H$b``QHfl6ukelqL&$ PEx/2~p8~,Xj>SNN$sN8<ׯ_KNNj+Ckk+ٔP;a36$nffx< f|>=~K.q=jeejݸquk y7Ynմpevޭs\[<@~~><ׯ̙38NJJJx"[l7ޠ 2կBcc#6mbvb꫌PӠho~"bX^^y&&&l|+_a֭OLL?f] ڵcZ 477sQ&''vQRR›o/p&@[0EQdʕQXXipT97u}ž F`%1NfԝfnkjVݩԝL<;q|c 6`d bIhAZ[}!&V:<_,SNaصkPZZbٳSOzg۶m444d2122yyy9rׯ_`۶m֒'N011Yv7JOOo6333$%%3HRRX EQ|*m޼"rsseYz-hnn&##C\[[mmmL&GYYG\`׮]DQy7p8<z-v;---!2?8y$mmma0ga~Nww7=EEEb=oz9pEEE$%%a6>p( vMSS. MZZ۷8sVzcp*eY\>nܸA$p8HMM%77A\.)))B[. n"hTOyyy }^##|P%F6o3O=<#޽IPZZ*;;++&V+SSSX,lBmm-@Iuu5?8LMM hKK MMMdggS]]͆ (--vSZZʋ/Hii)6 ۩b?̆ RPPO>Iaa <#W.,,[ IDAT033C4;a&''F]~lʄujjj ñzDp:ɡbN'333\.N8A8g??]\]s%%%c1.]%uECZMFlݺ4#99$h53y&>wسgtttpi1>>~;8|0{졹6lŋ`߾}w5Sb1Ξ=Knn.l%~@ fchh, YYY$''ϙ3g\|ĺuLNN200@]]LNNRSS`pp_~deeQTTĚ5k`rrRj>-,,v{=l6⋬Y>6l؀`_T~P]]Muu𹫚E,cj]5 QRRկ"//?uuuܸqC˯]Ʊc8p{f_RZZJ^^^#33;>'O255O?MCC`$55Lff&ɢܹs?Gcc#ر`0ȉ'8b1V7ι>ɡ-[3rӠ,Ց"!UTTvλヒnn3==fcffFff3FNOO.~ctFؾ};bݻ%9\p fggqXVF#066F$n-;ݣ*˖-[pݼl6$Iv9Q#Œ:>>," ~ <3ɑ#GDF4l6,H5`}\.#}vt\.fg3ŴĠ'ш^M,ՀX,bAeZZZD"撕q\x<S\UK.QPPSO=%|:;wLww7oiii kyEQxNp8d2Fb1$IMU8X-V2z 8ܸ%y~WEpX+߿dNFGGq\Z2إ楤xB r1/r~ONN/N7twwu( . jjjd2EWW6mzImhhDד /@FFZjFNZmcc#TWWn: QSSC^^dYԩS_Qvͣ>ʿۿ188APav;6l S^UkzztѨ ,y8U•+Wg۩^A0j I^|>3<ټy]E! r+iF"L B+W- _h\|2#&0??OYYV#@ bΝnn޼ɚ5kpQ\i~s=# DxEE---|' EYY`6KOOgͤql6& $7oRUUźuXXX`ժU"nG.ݻwJWWגl |;vg>^__;p)^~e~tvژY`lذH$Ą n>~ MMM<lڴx=\2M[[>_|i3SSSedd4??-spps- FK6$-DR8۷7 +y\^ sW9~#~&yg"ڵkٺu+:H$™3g&%%e[dvx5㺺:_B:y$.]B188Ν;Α#G8uԒ5E/Lgffx7Ds ioo>w\77z۞ ªUDs='O˿ G>{eϞ=B!>4Z1,?>|Bz=${wϹZjFrĉ(>N@^{,F#sss2;;{܊@7n }>mmmRS=*\.V7nB qz ~`2D@(JaUs _W("сb!77NG0dhhHT= ى8NTdYrqҥ;c6t:999t:q mmmSXX(t  8MJJ cccwղAz{{@1??OqqWr?fbb 25J-Trq0LA.]Dx`_ΊT9Fwww3==,4LA|EP__OwwĨA ȏchmmk?"ܪ6pڟ"hͧA7C4|[k _3t:ED&k{F4XHz (jJkF)4h|+fhР,ԐDR^nQjN 4h+h4hР>(L_daiP {5hРA5hРA _> ޯȥA?'h&j(t: c(ĭpj]+jq-Υ !|ێq):|l:~[ѩs/TE-Fo@w/s'~p^g{j'|^_YEbw<m :4_~WҜ˲,/R]뺾9UkZ?u}u$''hEF_; v;ɂ7cs%ƣX;Jw;N}ve;BRRWf|v 1 \vQEAQYYIii)O?Z7P[[˗ Ľ\g``˖-kVQnܸ~j +}jMoo{?$Q]]ͦMDGkk+_:X\:R*++ƍK5(† X~=A׮]ƍՎPsH$ |n[T Q}2g&$>RK{|!*ȚB?,zSTT^rv`nnN|nժUձn:N:mIJJfgg裏F$%%Q__OII n MMM\.&&&X,deev L&Wvc2'))~B LMM1556b***lx%6!}Ld |d+nZZ,v XV, : }}}x^ dYFl6VuER_  /K,c4fp8%hj+zڦX,~~ج~^YIOOV{.7mGQѨx]sA$IjN<Ge0 lsFn|>m^DZZS#lt:}Z[[5^t NG$AaX`$IpXdee 0L&~? v<gaa/H4b`0ĜF$ ˅x ł^GӉ~ ,$`d2 2^B^<'r|2[l(㤤`2xb➄atn999➫j0HMMF\.AjkݗZqvY_O)I+ D~n(qGt$<>̩ILL".oiR?䔛ˡC0͜:u~ZZZhllueF3;;lȱcB~)"%%{$:9rׯb;۷o<ׯ_'S[[CAP .p%ٴi?8iiiq8y$bLzUV144˗j***xx"ϟ~ٌ(ddd M__Hfx $''hAXX,%//fHJJV?Nyy9,ǹql66nO?$994.]իW9|0P(ěoI{{;Wgrr V+,388ȯ~+5hdG$-!?{X@ۂMbحT%ҚqEh hh,FAA'$`N)EK&,ǗeK +r޽{ijjb BӑիWFÉ'زe twwcۉD"w;ѭ][[ݻ[@MM ;v\rZz*6dFzy&rܼyIزe vo0#Uo[):;;Zl۶'xh4Nca\B$a͚5l۶@ |xJ0 9sX,d~~~X$Ih42::ĔΣ>ڵkgrrYٴivp(f>0 dggsMٲe ׯOP(N4kOR\*zYQPbBR_EBP-[p$B8"  @H. Xw)Y\sijj"== ?& 9{,W^JjkkD"TTTzr e)q9$9nnܸ.Z-INN&55&$,9B{{;HݻY~=ccc|jd(}>~䤤$ ÊEEETVVFyCӑGEE  ԩSPXXHZZΝcvv")++cjj y._L?V>S۷og՜>}zg6Y>su?Nrr2bشi&v=*z^WXq!A9s<(v3g000?LAA###8qp8,,-TVVz? .m6 HJJԩS(–-["77W &&&8{,l߾4֭[G[[F42KL1B>-L,5%FߑHH$B0yUaދX޸q}N{{;CCCXVB"3 HII'fzٱc`7oERz*eeelݺ&Yݻw733#Υ!5Vp(--&_$ׯzEE;_oWcX0L>.5 IDATvĽ b`n|>: vѫ睚BQٶmsuǒqB!)**b``6KVVVӹR1==MAAiiit:W^ehhv;:Y^4!`afff>99㡣ǃn~Lٽ{7A?UP}}}}LLLPTTn^Ojj*vN&T *-?:DII }]FGG&cۙ'+t:%++KG\..]brrP(SSS"G@}n3;;KFFzjNK|X|)))`0DJ,DQ"0ŪQwS8KwԽ)&:χd"%%J<F^^CCCF9i?٤-hnnӧOԄlMy뭷p::t%@5'4Ǚ`jj"֮]l)$Ib||ӧOseދ{\ B(b!==Yt:nx<Fz=yyy0BJJ ӹDcΝcxx{[$^W?FzH$Ib6EАljeU랜טH;zdSPP={k8Ol;3:Vԍ}ƟGzB~az{{IMM%??6lrrrHIIʕ+;w#|vg?7"hW.Aoo/;v@QKU 2))j~?b3[~ޙF#6mbnnG$attr6mDOOnXpU sssTUU裏ֆl`0H?iiic  ZBX,¿l6),,BZp>̆ p\pIXv-099IMM Wqq1H>E*Dw*>HB+Y)L&UUUKߝK&''ٸq#wf~~ڵk|(eS6::* ÔիW%''~y0ͬY+WFill? 8w y饗xwOя~ ڷ.=MF_b,ݮJK5cup:bÐeLy\.B!B0E"횛yX,N>`߾}<ȲL~~>۷ogΝZ2TNsEDQarWKyy9"5ݻwS__ 33S4qٰa?Ox(jv (LhӧOx穮o'%jpw>|~bsss;vN=͛7 7Å D`zJvͺu0 =JGGbСC˱Z FaaTDrr2eee agttI(YYYrM~?dggU:Fmm-?яdpp`0H(brr$I@ IIITVV211fժUB!FGGE‚VC#c,'^^2;xúuDQ7orL&e={WW̙3_%&&&Oϓ]PeFDIJ4h?ظq#?9uW65052IYZN˂ٶA |GdggԚĈj5V5z_wi5m+U ӠA#+Qb(~)Ν;',dz痿0NMMrYPL$f?i x<D L,+K󌣊D< {'zn|W `{  /~A8  cx'lKY|./աѰ _Ԩo 42&Xx|?,I w\gA 2$ד)d,/뉬rʯkРAM3~0p+u3ZG"\զf2Wo$=]3*CcH$`5a< J 4h2ЛS߰GU HH:Br&iQC֠A ?p .|+_q}X73[ɨ\KrQ-NXZ_4akРAL}XT=D,=օ3U p0%YYoD6XVx4 #(0G &J<$FGG 4hd>,Y,ơ1$XRSZƧҽzPG1D<7;h")5f.$/AZћZMH΁kF?%r=s=v2kQVCURR> %ӠᛀN#UDQ.)Ih6Р7ϲ%[>T,-TQԚ^XAP2cq$Vde8%6Mi Z҈*Ҋ= (ģa#Q՛͎(LRH-k;3J,CRZ6RyN% $YGzZRkύpLc-”EpaZ[$4|hhhॗ^"55UT\vKS6Llݺ:8w6X3^$ŘdDNa.Xv--3.?;փ!K*$~ P*b(3 6qhg6P Ӹ'0&gz@A0d^VOrj"~7(1d2dc Ւ.׌$A[n "I)ED<[EM$i9LI5-U) Hsǎa-ŘG$]_ARj.{/tNiFo7xQtR;̩?kdb"I}c?*^$IE!qKn9"F zM`{"L6L3q:'H,$)\+A7mj<JVU~&Q\\l!2fdBV1 `4 99YE1dY&++f3:ۍf,t:hݎf*7/UQP[vL]9%#'])-{x$`#Aijˑuz"ib)ŵ!^4h,IBӑLFFP(ĪUwKJJ N'/"Nee%&$RRRp:۴-!{^Omm-?OKgx 6l@vv6hN}]:Dcc#IIIb1nܸ??aۿUF,?0CGn#I)E7$-0t Kn9;,J|>{hykE{6R0{{^[34<dɓ'9<;,S\\LOOW^^+WFrr2vO?Thuuu+Ȳ̯k7o'kX,֬Y9q>={P^^αcǘ5kְ{nN8XÝg󻘸QH}K9tL1Qt& $h}ɋG1gQhG`nbQB ӌ{E!o'?3BĿ- AQx<>} bl6}+$%%ɓ'E{IΝ;LJ~(<  VVV˗9, ˉFA0h {9IMM{.z=ZP(Ė-[شicccBkUudd@ ֭[cnnf! .N'ڵJ0tj\f/5CȆ{cN)!K'N| _ӎ5hp~?F^xp8L<p`۱ZB!~mnJrr2HϡC8x >~_v nB]]]W?)X ҥKI bl9rb<(uosypPi;2t:t_l{ M4hK}QRR^' !rq%Z[[9p͚51??ΓBKK 7nl6044[o̷+SZ]jxp=̙3\v[WQL}XzjhdΝl޼Պ%QRR³>)))Z-[عs'b1֯_ρ(--`0PQQC(,,47ʺu8|0999q iiiܹ+DQinn&''G\D"B 2SYY?w^ZZZ0L|>iii,_@ f5`"U C!"ǐС,8GBDc,xa2=ĥ۪m}֎z ^x~?/B__mfᔔhhhv L&դOOLNNwwlذ~^/;v`|GX$***pY~=[lF4FFF0455>7xCo~YZ_5klfӦMb1\.Ȳ<@,EQ(//'xHt:.]Jcc#===XkjD"0zBz=& D8fllh4J  ''DEEMMM(((t266F q\Dkk+{#G011(|>}X,fa2tB!^/yyy8t:$FQN'&JGNNxׯgٲe{ QPP@kk+O>$Ü?@ s?~NϟTDG2dP__O?hdΝx<hii _:_ܹsɳ>z^`۹9rqƮHZX,iJI׳sNe͚5l޼^z8y$۷ogݺulڴ1>dblذ_~ƒ%Kڵ ڵkg׮]tuu|r8z(?~QErq}Q__O__*(Ž;(++cɒ%̟?ϳyfسg԰fU 2.]JVVNnS[[K*btttPUUŦMf׮]LLLP__ڵk BmԠYQFEޛ*SD:VN%$)=N.5&td*E"'L'Pg~ y\N(b1} Yr%N/?h4J"v{n;ŋilld.@cǎpðxxxy衇رȊ+[@ii)̝;8>qcccTVVœ9s8zd믙( H^ujkkٴi^rI5惡Brss tuuq5rx麟#yM?կ~Ş={ t:ill,Yv^xtDeexǎĉ+ &EQtX,Yn|M^}U~?4773g QΝ;yq:ZA|MRM Btwwm6Xx1`ׇlfҥL&DQDSZZJAA9992 [ok.󩯯';;jjjgtuu` jX,Q^^o߮zߩT>W^y7b69x {!JŨÇkdA#㛂Y4dᠪ͊H8VDITҐ$D"A:VÓPa<'&FbJr4 !wvvct:ٷo.]"++D"8PH;3Y6m`0pE}QvJ8u`p"˸nq\8NΞ=aÆ N4塇{eٲe\xX,F__B!FO$QslllV]~?H$hfM$AQ$p8hoo'N__Ν;9y$%%%p`2x3LG{Ѐ`jݭN B9ssA w^Yd 'O3&&&0 ZTTTNd|| zؘgddCAAdRtt:}}} DQ篷a5[?fYE>@@ YYYj BHݔ]S3Z\.$'O^# ^===QWWG~~>`K<G"`Pn 42YɡNG0vԬ䌗0222kVoFtC:V NF322hl6fY3pA ;;I<'LRRRX,t:,x^F#E5Vjkky X,DQT իWxzZPP0CGV < 3 S.\ĉܹz~?'? mmm|g͚5X,FGGc_ 㬼\srr"˅l6SRRB,#}~QVVƽޫ&uttd,2]]]477DCC'NP'RVVF$Ap8ZjBWfԍ*St,Yٲe |߼. 6ce\(((f$qz-Ux6RM&jlz$Ibq@KK x^rss)//ٳt:***$si^kxWh:'j͛0NSͲ,--n=ԈxRΔü@e0bݺutttMQQ+Vhjjbv;bΝASUU?ٲe vB+ڵkYp!OfɤJ8a:fժU|>5:, R)N<9C $gϲb ֯_ϹsCe.\Hss3[lQ2ZҥK$QSSCCCh, V .{n|A #H022Ylj`qe̱}>ccc|K_BFFFX|9uuu8q`0ȅ hii!pA D!gTe٣fO~eY… ۷Fo_!t:sΥ={DX|9!(++ѣjQUŦ׊̈Ld"?}>O_ }>Ty1oȄ3TlVVVSOa49vccc<<Ȳ̻KII mmmZX,ƱcxgL H@ 0k'NDzeشi7V|;l޼7|m۶cOO\m۶k ~}ot:0o]]]3(>}gEQ*]EeR|=Jkk+wmmmHD2$t03,3=w,˄B!&aHl^0'Odǎ_ 6Nլv fӍMt,͚I=YKN&N~Lm:&겱~=l8R-I+|c_X7:'勇 dt0b/%|$+W[ILd2磨zR^x|{ƙOQT>ʧu-'u:Y/nYYYա( qahhQ***(--h4v_ad9;wx<>Cx9{,zL&$IdD"AWW###(l˥kOO~A`0PQQVD"3::jj(h4R[[KAAQ:::7oEEEq(**ɤzcOn j6 C>(r{{{ruuuj(IzjvQQD"immUep8L__óbpdYVۊPM:ol.^H"\~?nNEEߏr CS__O$QCyyyՅ$I̝;"U###&ΉI&\p̂ T!!2'O=[, xӟZVQTT4cx&IaX3gv\TTTpYDQTԝ7%L,k+Ӷİپھ>jiРSKhdTp8 W# *ä(!S^ӥR)9'20Z y@352=w9XNT=у3{D-EQHZ%&f91>~yO[v fec52mxdY" 3vN|*v.AX4hHYFƷSL3F#ћQY4hnkD_o<Ғ7W30ϢeYOA@u(֫AmkFƷ) YiU4cmaSp-v"}S?:pi&9hAß9kOڱ>fl9)[zVG!C>R0N-tI#c nRp+!jF0P> 2V=׭+2:=V\s">\zPD!q 4yxfyƷ[|IM%ߒcOPtQ3v8z; # M% ƅ0Wg`9RR r"h Qd тl' S:=: 9DJDAç<h!jocx0NoZjM;I=D|,]9"Eg0b-d'v^|1;U7Bo2 2r(S0G&e5WM8*țJh(6X[EhkksD=EwDLM>4Ԯ- u{T&+o ȗ}_l$哓(R(nL tԂ`0q]HfݧHrK0g9ȟE)@ȫiYVG` :LYB1 42BFƷ_LM F+, ?^@Z@P+X-9QNՌY021s\7 ((ّOnu1R&{^K GVlb +DrJj٘stzr@Pd,Dpr:IvQּ2!yX]Ep&6> niαrWNUz2\yG< +љ'ÕI ^vn!43($F[6>,"K \"Ǟ_N^"EFJŵAg‹pMm kS͢t‹y)2_/$EJ#:>њ- 5N{J'bG:D=pwdtWUHTLˢ֠֓<-6_X(k*; NBO*2A2&26ȅ]/7ۈ!<}ty{A%B*%<ҍ"%E!4C:f#=$>hpltM3v>q$Kf'%cL t219 '<2D|mqhР2.ֈX#TSD5ۿ N #-yA 4X#%mРAßCӌ5hР/PߎPBVfm tˬgA$.ֈX#۱mF"+m<3g;}َ%,amY S6kd|B[t~Gd8+3;ng*|}jq\Jcm$ 4\"k4tF>S4h4F-,BKҠA 4v4J,֦?y hDl6,JHwt:nr]dIH&9΢(b4}zt:{z@2D$uOr^ 0͹P?M&z|zz/A@et{J:^a0TO52F,a6ٴiK,fxغu+Ν#H "UUUlܸ:$I~/(TTTaf3vI0 ,Z:FGGٹs"dʕ+Yx1;v젽H-hXx衇Xx1YYYȲ,˪qAD.zϑ#GXĴl2~eK/ĩSn;1 Ѐf3QXf E5vC|!_- @ S6f k… ;q>BEϟ?yjkkaxx@ @2@rss뮻xǸ;1 `[SSòehjjRd2xbV+ z?[t:M((++@ & }"/ppw؈X+ؼy3 zX,455QZZzu1@ee%˖-Qh[uuu,XD"naZ[[gD5\aN541ѡF@DAPI:HcL"aY0:>aZ^Ȟ={xٴi+W]wEmm-Ge˖-bkz(p8hllΩ虀(f]5g? $۶mc466裏/~ n7$}"28;tjjjxG)((g׮]477SSSC^^_t:D>NSS%%%os=Ν;gb >dBQyٿU!| _`ݺu<66K/ġC$V~""tx<ݻyf\d;G!77I8{,/2OV)?uGQI_Q$d^Oee%=wuj}v}]̙Ï~#n7*Μ9s=׾5rssE[S]]O?M(bΜ9v\.eeec^x&&&?>< .K}~`۶ma, ,O<??hoo'Lf}Qf3 Z>ټeA$P(DQQsjąa^|E"<,˜Cڵv dx4ȅsCdr*ȓԬ(Ȳ,I((( Ȓz R:$KL#HL, ёEZ'_qb"}<<<ݻyYh .a;(n:>111K/dgg#"cddkײ~z0oGQdY&LICC?===3X,ƅ /~+Xjo6[neΜ9k.<eee8N0HrJN:Emm-UUUֲpBΟ?ѣG~ pyճ|`eYk2x'Xp!Gv6ọ>,z6oL?;w$~zRǏW:bDP(D__ߌsE^ ###S^^7n۷ݍ(;UV{n?>رAXz56m"P]]ͽK0<999fGg4{泌^&&&(++[с^_"FsJH$PUUE2d׮]׳f***x<3,ZSNaX(//^x/_ٸq#/2@G4X#>V=-l&+agGӈHB&X$鴪w% ij(,! &LH$'$ _T=;NNm6'Nt:9{, ~M6|b0|1 D"ؾ};cccB!~iJJJfB3Sq.]ľ}>Ǻuf|We$Ib̙3yb>}p8رc$IJKKQp8Ç뮻Xl+V`ѢE211AVV P]]M4YI.3eFSXXܹs B*dggSYYw tl6#GJtlڴF5YE^/T***xWWhlX+I*++&{Ӄ^z,XS޽wy2ϟ`B~~>#I8qӧOc۩W_d2ɺu먪RRüyTWe07rQRRܹsΦN޽{ٵk:-ZN_t:*++7I4ꫯR]]M*bhhpy6nHnn.]]]b1hmmZA`||7|( 555ȲÇQ͛7p8(,,T]]]>|#2455;z24cog.6%&8Ca&AF#:`0H:VCW"PfJi$xX,F4Ըt,UN<Ӊ㡿իqݼ?^MikkH$B P{zzHRfDO~ ǎ5kK"@Q Xr%mmm\ I_eϦ9rF*++dVZE2$aNUrtM2''磯IHRdv;H$x"h^8bddCCss3EEEgseh4ʼy󨬬3;L&~?@Ix^bVA;w> |8TJfAHӌ (zu~~>mmm3H$¥KT/ ":ݎ̙3iAvSWW7ьEQuVn7jE<WsdYV3sssghJznj-D .O.5XF7+ޙԝN'H8^O:&H?!X@h4RVVF @ө \O&L&b$ )..fxx22F{nV 5k011{|>O>$3`ш` H8nj/_hٳG52z-8p8L:&;;b|l6F#!I:{+ {}ǪU&眹gϞ 6@ h4GYYY%IRCӯj5[eO<`0Ȗ-[+_ gk2ȅ(lsΩ}ke4hɄnW6 Á刺_MSs;L$`B,_h4ʥKZs%~?'sEM֗PFƷUҌ'`*++z)--%''p8CZʼL_⪃iFZ֭[ YjRUUŪUZTTTťKfxxe˖qFN<ɺu \1dB_^cǎqFAٳ3,1o<LKJJLU2:KO4Uɬk200@<W !w!LF ---<۷Jss3pgt:Y`= YbE g4hBQQYYYoLw}R.\H(b… 1OKK ˖-p 2eeeb1Ξ=fS%aNߞ/5wӟ_aa!555477 w9Yʲ&OmܸQ</^Laaj^N&F( 2= ˲(..t:MEEyyytvvrTcjFDZ2/… jxbjkky饗0 |ve***^x==ՠ94X#9L}% |XVL&O ޕ(deezjB$e3%3gtP=]_G9̊ x EѣvZ8wE6oL"⋸noߎgDQǏVD"3|>?0w\***Fx^??L]]^:b opA.^H(Rdԅ  HRl۶ ?VgW_)XDg}z 6p=Jpݼk8qID"?d2oyyyabs=,^Ʉ(UDTC(#dyz=<'Nj%6Mg8=yfA%}2甹 b15a,^fgyF9Ž;ex<IRj)#AVF;Z3UVVjOA2:Yb/%|$+WW_}U3u^/lڴ*^x^}UUs gxQ)*eS 1ϒ}q5Pl̝;@mfddG]]CFFFy@4̙337Al6ʈF3KHRj|+`xxIE&lGnnun0-{GC%ס!zf" 2gWTa΄)Bhpo/2^!/P0[ EN"LC455܌磣Çc6IR( w}77xW8p˖-#??N7Cex<r+|>2?5hpcj*{ov?{<7I0me0n;3χ,j';;[^/$] z'u?fA hFƷo VA@eZ!S j eUGvjt8NJ&h#4c4hz9qZ<ϴ6ӊJ2ݍ'2# Z{Upp5hg?p"4ZP42z&E E" ]bF3F3֠A'G؟ ߌ6}yy>Y&nؒ~{j .5" A#_ɺҊ){[3DP4DQ(AßiƟH&8)(ڥ7F3[(_| 0uHTa-&o g  4@4~Sa D+ J[bu7[ yIFzVg t1}$5h'a-TY݂AiGjuOQo@o[LnbDaqfMk6hCo|Vd.׌?pXEdG-֯48YZDQDgcʛܷɰ)Fo,7[IEȩlGN%HBh2 >m442~)1SP.5a2z7ҕ!O:{^91xlnjcV.wRtzsRYY[B:Q́h0[BN\j{qbؑI-A-%a-T}HcClW!WeLq3WZӂ f)V&,ORS7e)EP/`u<`vQr'Kg&?e,rZ,IB\]jb+`!i^7٥?LVxB֠ᖑFğhd|^07eb^s[:#+Nz3QȌ_<-yKzTXocr( W1f)PN!>EN'*Ė_AlM|bgE=LY.aQhp+i5xD 7 (\Egl E!g8:[쀂JN-/"(іMh{n1 G* ERq}hp5hd|;/S!i29ݪ%Ly_[QduxxI*>іN#Q2*R d9'q£8Dx8@dlddWeT, ng)-TON)!RZ%Dȇ*"yt\՝oqFʯ0;5lb^f׉v~Mri(d.$}llz0,X`EH_*;_q!1WELO&kdbt%6ll]-'nۋdc:j>K:҃*dc}a F&>Aґn 5g,X$ϲ`g +$NL+H$9xrf@-;:e _LIIT2}?>Ux8O @`-2l)Sd!$0j1I1 "L4͇BZj ,Xd|CV3TyCr\j"0g[`"PX`!`mh a_[SsUƇ+Ͷei% ڐ g(֚`HIJTUhY_>hj{`9 _&e7ʗ\ZSJg$LEb[`tR`e3IҚn,Xpƺ`/%X\~_}*$[`‡ %[e⒕6?{!NݎMhfn*!2NmrjjEIr!2BTUP(, (rɲF&]sۙcu:.Dl6v<'9ϙϺ,s~ !fgՙ@Ӵoll /_fWU֮]exxz#G$&o΢EPUv^x:::>̚5o|̝;If׮]8px={/NիW/2L ٺu+k׮ I```S W*|>֭[ҥK|֘o|& ꫯoS(~Ud _$@AY,rXz56l`dd*PVV$I477s]wQWWG{{;*2B֭[Yx1}}}4]|97x#W]uuuu{:6m{AAWW V\WMKtuu8-Bu;ɓ'D"Z $VI IDATZ… ZoΦMFֆ(\yxfn7ٶm3Z7.}_B_`\^Q"e)dt4Ҕl!GئHTҼe-0!3Q.M]Ƙ /aӦMl6|M͛ellM6Q__޽{/9͛Yz5b3 7t y$I2͈ )++?) ˱tR֯_?&}Eww7e˖Q[[ݻ/~qY IfPfctM:u~^dYfٲe,]xs̄,'m۶dFFF ? eT`ӥMи7_;´=0 + fC5FVxx3Y|Trhhh@T*BByljD"r9^/Pp8L*ĉ*$̚B~?uuur9eN' ;v :݌`v:0|tR~?/9x |v:;;Q*Sg``Md"l6&ɓyjjj@e }}}DicQ$"q.8.\A(ߏHٳ H$I:;;Bejjjp*cccSt3F~0=|0y<EallE P0pi:::P 6 ׋,$ s~Eh4P[[k[2L&ìY(++# eT*E?v;v~yYlR)zzzbTVVR^^άYp\HD.`0H]]N\. ccc_JaW:D:k jto|Q1U]KI,5ya_M7fܤ39IA' G3IX[f{sA/j*x  D&!Luu5|!I?ٵkhtHĢE?!^o}[|>8@Yft:e_ N3{lzzz0 cF"@SSs!A*2*RVV-ի B(y;Yd v=vs}f믿N2HL_55577:apA~F BرիW:66==jޣax^nV6n܈!{T*e^{Ŕs)4-8Vve˖qh1#ömذaHsx'(--e|>FGGGzzzkYj>2N'QSSCcc#l{_פR)nnF>22#BwFe< r7~z$o&[nK/aK,1lf0 r9MB^//w_P(pM7?ΩSg|nsJ*b||[n*v;C>gppp v\Ԑ?#r=[M6q}Op}Q[[+¾}~<jkk;;yGq̙3X,uV/188O?nnnL<gr|z^xvɍ7ڵky뭷bڵ"IP}k,X.$Iz!?>G_*sWX[dIȒ$!2^%K~z|`Z,[o{w}t:ٲeN/.oe%3zU7HeRIӦY7t4U0t4M3Ӄ?u]uM4rs9$QA_6#hر ;믿Η%JKK9x =d;R~4i͎댍wCUUՌq^~el67XhO<*֭#DطoHķ-.\HP7xN֬Y$IvӜ~:5s2}>|~ŋ3o<hkkȑ#8qǵ^KKK ~rr{ĉx<<@:y:;;r3&fV0L ߿t:MP`֬Y̙3R.]ʞ={xljD"SWWǚ5k7t+ i)gie\P(O?+B*"Hi& k.Z[[ill$ oACCׯχ,b1N8oA0d˖-b1O?555lܸÁnM6QYY狀@ f1883<Þ={(++cÆ ~*++cxx6?N2|rزe -fxطo/ !`Ϟ=gժU,^z%K2[d|}: Tdj!iK:%IB4s'Ig[2̤ŭ9*C(QxN:E,#ϓL&IR$IE!7op ( VbqWL&yM\SUUE8fdd䬀VJyv;nAǜH$D"d2#HPSSýKOO= P__}GOOG"l6ccc SZZ,8 ɪU d_dѢElٲ7rv=?xN}}A_.JEatt4Bv0|>O" HFb֢*$aِ$d2I,#~١!FGGrDQSZf 7t$I,N8pj,eeev2 === 3X(NDCCCtR:"I`UUUTWW3<7|׳}v*o˃>Ț5k뮻Xr%d\ŋ J Bd23*"TdffP|Ijjjټy3 ݻ쏮봷pB֭[ڵkٻw/d!̞= ~RNE35⿧u]7ETcٲeʣ>˩EiL-0 s~I(:gZ{o~Liqr98/& ~m׋4#7l@6TUU1g}dYfܹ(XD"gMlakMN.\Hww7uuu PUh4J]]PT*E.3_QK. Lzq>>cIss3[lȑ#x<jjjزe u]Gkk+Agg'\ql߾CqWzpoKJ"`˖-!oKww7 r-{\ydYv͋/hno~˗k.^ziP]9ts=qH!cܹg?&$dAǏyfxQ; j*x%Kp]w~Xr%X^43y X|4uNz-/_7M|>N}}=p^{X,ƺu( {1g""Q~:Ng~~z䴪ZZZشiyߝ~;::J:f޼y^JVXMKG2BL3r!6nȪUBL&3g^CQZZO,Xv-sOf;D4ӌ~q"K_}FP@vd2ijEso&h|>oq1rh>3w||uuul۶|>ρD"vm[q~ӟ~n뮻|>O{{;O>$CCCڵR6ŏ H;gl6ٸq#}}}G?"\y啌{n07ndڵ$I^|Ev9 JLsڔattt۷s]wx<oAP NO jg%p뭷ԝ?3l{իWzM[oźuؼy3`YgtttƱ/ q>=ر4{=.kQ. 477a-[(q3y58L^~WWu]&~O:to+M̨6***H&$Id8i鞹heZ-544XOAs0|RWI[(n3ϸ 0>>NSS[Z(chhUUq:TUUQYYi:::u}`P(8]]]l6 dL3g'i *|>XX,6f٨$l6А  l6uuu!˲wvv"rl63$ N:5B.vSWWG$a||2ϟoyFFFLҐ$Y+|||^37 f3Ut sT(cN0 n7g6*BaFGGQUYfzGQJJJ())abb1n9O4H9fi` 3]$P0D"b1tuuf醆E9sL&c`Nۙ0%34 7+> -/ zxxxb ,XʂEƗ6i\C`211AWWcccor&"Fck?H0A@`L+ !dc-X}3nRV$I"rl?'AR>5c0 z,\*/3=g,ax!Tjǿt6Y6)B''cن;rb};z-X:e/X>cK5>{RH6PF?#$ !ic f|J3\̹g,^1r]N;uBz!MCB $Ǐ+X16o T CS{ؽAcJ(GH[`( EYdc!ngM|L[ޕlv'邼V *Yu}FBH8![fٕ؜nCm{9%A>O6:H-T-HgulN sW2o fu!  [@ ! ]YWDlps*N#jps . U9'Psn=J36 AU>%S5Y-aD;[6ʅHNo lNoGvz631KWQh/QB- E($ּ` QglZdIͯO1t!`yr_Mh.[4)Wy *=2}cq,2z='$1 [F-ܼ#M0jiƗe.fO3iOVV@-ѕVԹ%lOOޙ`oohNgB)N$ 8{,re^zK-ƏM#*1\%,c$yH/v8ؾ_m.!Dyg(%5Mn7qqq!n^y3!8ϴexp" Hp~>|b5$M :0AW F8'<!`ٱ> M!o0 2}G$%3ևNXsƂ/ϋ^GUʽpls\t'tYU@9-$Y pH*plP`{Luc  &5}2M`0x-M8`gQjۛ}+tR*`cow]9*I;<;ɜFV5HtU<2NVMLdO`plT!I3Z^[IdurPBe @ ۛ{\AU :'evtT&4^?a" O{ߥtD$OL?Vɓ&==XƻO'( +h˂K?ZHUAn2`w):F d,.&cYyѬNR& 4àoLA `,IjTz$:'Tk85.+v*yd d``Ta)κ|eh]*C)}m膁t%P4ɀsiNdTdJE BLET3`I|T UܸXZDT!f,&/'B6YR1-j:v!hHB\n:(3шgt<{L/O8hgl7ق<2BLeZ4DN]k$vN~^9EKILΏHtB~8m`dT\6_f)f %.F_Bp^K3 أHZa ⴶ `HdAS4E|8{yy|,XpB|>"JܴˮGF Y0$vǸF’YN\e"ph0;2Àשܷ:,@U vcw ^8>ǃ&xѡ-NxuCy,vrx0Ga;,KMj_Y'6Z`,˫|gÀE5ny") q]" Y> 엚P ,|b@BkC*?;&]gpJi3t: ьNG\?&˫Jټ$ y#þ,}*2ޛ#.č>tC+Жⱶ42-Sa`0]{ &W0Zn1о S*!;bN_kY\f`p,Ԡw Nu##y>'QK\O~0Rܹ $,z;T؈5YK444\4ۥIBu} ,XDtI|$mqKB7c.@ $A!p x$AS0V0W Ի$! T:NK&):SٕeA[)MFduN`}2ѬnПI dnԅӛ p5AF>]q |`\zo. f9InhAg onYlI͠7;<%MLŅv }9Ed, |x<N'BE!͒NI$$I4M ,XXro6y[?-\|\' tRVVFYY>Á,ȲMJ8&Dd2!X` qj~~X$pp8f;Ebv:x<<.H$B"@QKn$IfsiCtT`d ,|ZˉeY& RSSCYYv}rФ].\.bKeNT X~w ,|Z˅x^QvʰlA$z,XpKZ..HN("#Gh7>)|>x< kZ`r-eKD(>#i ,NIӨzֱ,kc.W W6dɆ+|~/Be Y>yӉfC4Ӫ. !pA>1`raRRt!( O@xp8S}yvcO*= pt:fӞf I >b'cM(C/&J:DQN8qVJ###$?k[P^B}<(LJe<=e,?^cw:u]~8`fc۶mâE$^x WWWsJؽ{7gfݺu|>$.O=xܜ#_n/8l۶l6100rBL&ٹs'oX Yٴiw}7M:47o 7K/+byرc  #eeex<ctt&G1:{tt!cqQ"@Bȹ)lBVp|cO2;I^~b@QÜ9s;w׷lX ;FkkE׸NIeee\s5b1z)9Bee%6m"ϳtRnf}yOU(F4$ʼn'>guM6ggTUU100ƍ硇/lܸl6ˉ'B!@u x?>+Vॗ^gҥs=\Zdl3:qo%lv\ls8n^8F$yʥ8pS-P'%fuDsgQ:Gx. 'f>^ʺشipT*n!l6ϟoA4~X466b0 Ν7ۺg_8FGGٹs'5k+W$HR)< hFww7BZM4BQQUFjjje0H&dP({nt]71g>l6W_}5CCCd0 fnϟO]]q8iۍᠻ\.7x#MMMlݺ#M£򗿤͛7sC;ikkW.{˅>Sf3}>wXd :;wvwwx<r6 Ӊcٹs'w& rwcv;~z:::r(E8tAeddVnƍFr5hj f;C >38ڟڞ]uz3ifLp8L.cxxUU)//p|d(ʥ]Y!(sQO#\71s1墉&FJD-630kR38ea|>… Yl@ŋ9uBa[Tp8իyLͺLN'.\EFII ~;%%%f$pIIyޙպ300+BOOW\q ,yi8'N$b_N?fc… 裏288H0`0 ϛ/`ѢEDz׳ex뭷wqC[nN8]D",YlHtVjS窪200}hnnfNyy9X B^wILƧ_3qP@Ӵyx^hkk#b )--%mN.dӚ~Fys-x4C-88*ٓgh2!9+(sH07Q1LAha-[ƼyXl;vqBo>eee-ܹsڵkkFip\};@$})$E$GxK8lgRI$3oɗw!ēy8I,DZ,)cG-ɖ$.4K)p@<*ܾ}=R,d)!)%p>ϱo>N|>RJo0_)l`ddWdwYܵR<99I4XYJinn桇 .K/100ar9o«,p0 D"q0 @"'? lz/,.giAvwSWE\axxIo/ضM{{;RzQK&YM?4|&t"ل_fx=E`]t;iVKl@ ˍkXlv]e˂krs 7nd˖-:t6Rey۶mqy_/GCC= b&yH$:tNN,lڴ-[i}}}D"o7<|xQvyf$:z)ɤ %ƗrLOOS]]T&h4iN!?XT*lqK])u4VA}l;:N}j1␕3:q YhܷtR222?ώ;8s玅r?{xVoM?466|K_'R(-*\X…ސ|>{@JI2g g/ /om6Ǯ]ms155E:' _{e֭ض DurqtСC[u'ԩSƲ8r9zzzxGsŢ}ꩧxWihh`޽\.~~y*LLLJ-N>ىiLMMG.] jJww [>.zzzŎ+.+YD8Xs]01M@եҠF԰,V#i~$.'Tv+mbAttl9 uOP)7ջ`eאM?__H xٶE>)C&arr[ eOOOSWWG[[LOO3==eYy5ʕ\.G,X,IRdYZZZ,ˋ)Wup8Lss3>M(DQ/LSS211A:Kt*J_---477{eqH$8LLL`6xVtP4:::Wxϩ$,x a߁匿)SaVbz+JljōOp8b1|===466^wŋDee/c! ڋwT؀@}P5'۵(mҩVBHpŌ<ǐq9DIfH7OBeώ߉爱M>QBPb|sS+":22m%233sdJTj2h]iu C3 uD A*`}-@Am˚2̈́{T"}b7eOT!d` Ccheu73fHu9aM7cPpBG9V6u+]"'owb8oTyЅIښ{0j^EF˗yn1K8, 05DS˅_;v)\BPbIb'ppGXP(/We\48Fٌ[HF8̴<=lɖyF c`jA. u-fMxkmdG'&=P( B񲶓]Q4jDEdD!e,1Z8+\$E/!JYc e%l\FUI%Z V|U~]$=EpJ#)(eb %4G>6 Bm#$@VF11KIf͟@JVaBF 0 +oZ:heX[ 4to{ ٝ/!M? YaZzN)$G؅9UM+Bj#?/jxJ9BP(1Y~c\,JXdfVĖ9&92XIj644-q-286sHcc_iL?n5ѳ12C\|wN~u|!"PD1s4$P[O)mP( %7o~mܒ!Z8Eʪ=MH[vSKʮゕ!>K䊉YQ ı bQCuƶ m:k_Iuc;U  Mgl-uQ ~5=k"= vQ%) RP;a$.y;YپԮ+)XYFqly81+V]2|Ku%?U8v E"pl(SM4JUc;g:ՍmB3hBPrd3`04h l\T?b$qliǵɦ\׶H &@mKrFt]\ c ,v0kUMWp#@uSnRHM#]G} B& -ڿPV-xP3H`Ig_rKtJ̜Pk/u}dGyڶԯJ)DZ-\ + =>HÊT5v:O;KC*V( %7[%e^zY햰]ٚ)(RV.Lv1]S&|iv|Ҷ"zΓi.~B ćN)XP(EcU#%`>[*׃m[%YP_u(Uv=#fUV\&;1|[C;f,ܮC15C>>k6R$?3J)GMN.XE5hen`aה+nC13̍P(+n=*z(S( ŭBŌXV^eBP(1Cq6P:P(J?V( TP(3V( BBP(ozM4},.g6LP(J?be۶T<[P(ngQXEX_P(+>dEP(;M,\Chv,\y6[NTTc8FyH ,˺?M#,\(p]w @@p]RcS=ifipBp `0HPm|>ifUB _a c-qW U4]mikYAdwbu]m_=+{{s=hxb}￟{1O" ɗe֮] DbUUU<|k_ӟ4~<]Nٻw/RJZZZ?NIRK>;GgЂzXf H.#Nscq[ BYs{X:ԷF6Vձk'8?.AJN-e!Ç)J!Xz5۶m_$!`bb▼ߺ:֭[PxV^hP(DSSUUUk.x嗯K}>===455qN8oeY$+5kѴTUU/}Ǐkh׳a9dÆ a)>r,'ϭX(18(tXtkm^VVӸk:řӌ̜`e'~Z*x饗Xr%+WDu*޾};HSN;| ʏjᏫ={033SO=ɓ'ijjbϞ= 6māü+kjϟ)č@eY+Ƌ}WL/}3EY(>Էҩm/BRjDQWĶi{9'_`eٳ ~Z[[fAww7Øʕ+B0<<磷p8 cNP(D,\k֬0 FGGq]uQ[[Y/gi0==/~ Z[[顾.K,Cu L&fʕ8)j*t] ׫ ˲8M<B "8[Wb|Z2 4j=4R#ZK - ]Ө 6}5̜͌,xݥ r20 :Q[[4G/}K}?Mss3RJvڵky7yꩧ0 ߥg}d2Ezzz|B!~i!7|>?qRma^V^M{{;>}|>O>$/2k׮+_ BoLOOO}G}˲pt:M:u]֯_?y) |ض%}^X,.CRR[[ݻL&4M__֭[y'T*qE]]WW/WJSSeqz]YTb麮D-C(BJ7x"_Wظq#h]g>L.S?cŲܹAZsʿ+;)ەh+BC')ay\nahhVwU*_deL-B n4kф~;::B!6l@MM ގ0 t]g_xRD&a޽a@dK8#<™3gx}СC]9}4?яlP,3u4lLE\4 %8@MMhDJp]I"ǎ R| RC.ApeM >-Hc`]Uh Pp2Nx<\Ţ2M5koi}GOO]S?y7ĪH$}[~fff,JxQD"9w=sFw(#r,.L|~" ouRy  YbkNz^VVm6P#mwNb/ U2(zѥ|U°쾾L"`bb‹nٲSNq̙B~_#`llg}2jý @9[x)RJ8ŋJ%<ݻ1 q.\ dzzq8N{ Ǚ\ãK.RR,!ɐ( !(<3lܸ3go}tttcrH)ill_- 255癜DeYDQBJB]sX+|bkڪ+!W;^lޔ7 WGZq]!nN-|b+5 |SgـMPep5Eà^ҭQ".9(-)} RMh]ɵ h4J.DQ;ϲOyD"ŕߏ8xcj444p}155E40 I L&9x +Wp96mΝ; Btww@4qذa_9y$B)JGJIT7`ǎ<;v 0'>8'N\4 immEu.\@UUHxEF-V|ZaЅq"ŐyA dyQMWÜ'򧫎(/۷o̙3y۶$aP(;yRbYQ"_xqIΟ?O4Ji*-^wB@4%H\VӜfb۷d2O?͉',~>O_z[e6l؀mۜ:u 4??Ϟ={ŶmΞ=K*²,/*HJw8eqq>8:u;wr=/~RRa1tq㌍yWdx8z(d2lV36+^%N{7SN܅oJؓvwӧRz$ ׿ƍywz-RԲdT]rJ>R"дj ťdΎSL ;i DVNsy1$%bEz \6 Ÿ1##tttf=rl$_kkkinnD%DZmZ:::<7o>'{Vvss3`M( 2 |H$BT"LiPF/CT*199ujllu!DC4!bYX̋yG"oVZ*qymForrf%>[WWGX$Lhhh`bbRɫ,x<>:uD"A&4b Bb^r\uur'{5ʕV6KS||B S258N(=1#Mv-'WBix}*aecW\ü{>˲bll}s]r#Hb?v"i E5VuS,R VHi0EBc,r+-\ r( \vm^SqWj0N9}_chh͵e2==}5EѫўcsgffYҤfyAǙwW~dd-}ޭjuP*dD^}7`)/(5}3-*ƕr]\徑^z%8C=K? 0M ʹj$ƺ`b}'60c uab5jؒhP#%Z B4oe>[[- |J40w%,K]ǬXEǤFMln%-"EP0ZVb&@YŒQ䭪"'#INdewBP|XJ@^i1벌縭5qČ6P["f;+-n@/F:T::h .4rn6NQXӊOH'kwt;|uHl^i! jgBqB"DJqI#5&uaZַH BC IQk=t׫m [4fq0S@u(fv`4"^Q&C:][S&BqJTZP,CMbp=Kb+J1ĕ0 UpKN0I;8mt-@ : IDATVI/՚ϽCQ\Ep.s,hYœ{fU-k虜mEB zDy/v|G,f|%ͺ>(4 3Sg~V"+eFv*U2^%-fbTxY 98G@"I8JRKYAl ְ5PCn_pumi󫌢x('HSMMjJT1#PE0҉:\vHj fU_KQLϠ>[z i ';9tU™Bi喬5,f؁b F`:Pgk>ȥ@R/pnQüv;H!2n*JWxdRlmb&Nqjg36BhXYJ.P&gKlK*dIFhw܇]ȐO *OtUu=hA)ݧI>f.QGX?Ç븬76p?'lBM Wݫ`90g^^Ǚ&t%,' ʛR8n&\[ƩnYM㊋zK/o1W&D2F&3cx*>H95 dmSUBs ՍOP۶m=&D]̫YDPܰ!_-kp%V`$Ţ0", g.Up.o0Wޖmz/l䣎V(Q?L'ktw%>:IS'ba ,+pfShF'ȘArih?C4Juc~AuH;F(Q*/Wx^E,$fۊ)gpKbl6@{>^5 o6y_?p%5+"P[E&/l9̱i#9e_>OEjԵ!4P&Kb08|yJ FjHM5dTG:tBbtP(7aWjy9溦+;KKjcܵfzQ>u63f$ 8 *oS2> /K7^2+; uANS36Mݹa,& KZ3&ԺPk/btHe]2 bR6A!9E2zMT5xR>Mb, V3up9}QP(nUUbײ;G]p]-/R̸6`m4ndE&`*ӧ?%od2`vL>9|RI^AE2G3sQQLpsI3kkإ$%o3Ɓt7;+Ƴ1⊛ +1^߾O|^}sXP|$YoWG!*rұDdWUB1H5޻M+?ޑs-/.>ND\ó(B]"imrK( Ňd-T;[S58픛whl8llAؘ^Y+Xrd|k_kh@5 Ӈi6Džb0tGE  #̚aFY4}޾sm {|z +נ:ߒ~Jzש.ӇXpcy=,cBߊVՕR's {~\[׾AgqW$Çsy ‡*ab J Q i6qJlC Wvd9]K.P*hIk@1Nq]1c4ٹs'ׯ7G?\! <#30>>~E1^f 7osql۾a3s=|1\% f~p~],޽ݻw[oq…E?BPb4kH¡V/RL.8~)~<]J۲shFmЇ+L%Ǩ?f.hM6yfy:6l ?eY#W_}L&sS6MX,P,ٵkPX4L$ b( %/.Bq$BiH mq\X\P!KŌK?,Jy!bb4ib6BMNUU3ԅ !Q^Ph^P(\qP(Jٌ[Z̸\m1(N j9DHYB!iq:sIqIXRJ$SSS|>?H$B.w!mW644ij>8;wdƍ/Ń>Hoo/L&yW9z(+WM8v_P(ɧ>)Jl@ @oo/駟P(,&:;;?sJUUU/9tdY u]  yrdYRw}ڵ !AoN&瞣8wbM6q(===TUUaY(b3gؾ};k֬aϞ==~ӟezKK 'Jw}+V/|siض8mռK?$ tuu!`ڵ8pRѣG)J۷͛7311_y}Y.^~: ޛqwݳb߈\II )YV,7]n)W>*JU*'ܸؖ, -DqHQp @:Owa0M)!u~U xf0==`ʕ|>n7@ .D0 28yci:ulrrr7oB^xsim 9rQ(Jd4llƲ% $Ilx"#YN9XBa"1&a$"!kvbilfttqoN}}=o6c6n۩v|IWWc !RLt+1MP(Dss38er4% ]=I1c)%###֯_ٱc [o222XEEE+TTT\Yߏ% :nH$,RbYhp8LbMH$svM(BJix^~l۾ZDP(f*3s5Omp- $=lk+o,g#{cI۲fkQgw]]a8ǣ(D➭(P'''n;һn|>^gwһ7p\SKu^g>3Y:Kq-¥v6$m ll )4lpɎaۗS3K)x"'N`,v?/dgg/Km;sسg= @ wޡV^y^z%Ldxx\K1Ų,ٲe ֭c׮]|ꯈ!8{,/‡~Ȓ%Kرc/"=o_w+l5/~KXnN[o&*/O>D?eAkƩS(//ooH&9rN\ Ž,Z{E9ήrQSSÎ;tttL .d۶mD"}]FGGgo& AII <˖-c466:ؼy3iw^g,🧇Kϙ[-m .)s~KV|Ձ-m@E,gY$"sat`cǎ: .v##G !\B?>hR  Igg'/Xr3K tttL^ruao$ߧ!N:墰+WD7ޠ\ qա:d>9B0СC\x>8ir~_҂aX.\w}Ym:msEFFW۷#رcξe˖Xt);wnhjj"OJGmm-HwbEUU7n0 zzz @^^-"Hz?|>/{2>>8>cA\B(duQEIکקQK[65z% Ƅ`v14?Qy)fڿȑ#ja=z㍍466:7|'Npĉiۻw/{'O^eY>|Çxݼk7|Y/{0oiTTTxhhhQgϞ=3M.YHjjjhhh`ddqǛ7z{<-ZĶm裏߭x ?z0Y#RH["IF %M9~LS 0ycnn.EEE Cuu5QQQA0$RN33B]$IN>Ͷmhhh  r 裏@~~>yyyTUU_9sz|6oΝ;1 d2L p5kְf'P^^ODOOelO~ڜԼRJt]gttz??~JapOe'`"%lܸ-[7 .\{Gii)O=/op)֭[ǫJsLr Yxz8 ٖ:\L,ayq|^ IDAT|Hl)1q+L0ɗ%mի8vzTWWo>g_:{aa!<Vb׮] ,YHi~aOطo-⥗^P(Dii) ,`hhi H) ?+Wzj aOvZN:{gfΝر={~<6m?1Yu4;w@ee%\t~)?w1N/ 2 1qA6OX,W2$>ƥokf+bH 9ɓ԰m6xwTilAA-//x<Ι3grN$NII >N8&??|iN2x<Β%KɓB!xGT/_vp:Қb&,\jzּy(-- ]Yx19%VCa8 bP'T^AKK ?8Si @ aL4,,eMIn뺎a?pfI-NRj$r¶2&ӶE~&V()555TTT066F__%%%NӴZ4х>ٴi> /_&L:MӤr}!ʕ+$Iذa~?::JKK V±(++c֭Nvv67ofdd>'_zV?TWWf'~:}Z߳axr~ߴ[YYm2k貲22ev>qwѥB09վpo5f6)C4ȑ#|`NHq``:Q[[ 9׏>Yv-dq8qQlSO=Ł8w/_I;UvM{<).'ORPP۝8ᅬfӦM|_v@* </_f߾}߿g}zѺ}1::ʆ D4$o^Ovx^VXs=GNN/9uH:A.//_dϞ=\tCP(nʯ:~18CCCXʼn'hkkr뿈F$ N>&gRZk6===ڵ ]קb>Y3sr1 իWd9ŋ(ͨc+U)))?N[8ږUL-:14҃3^BqOց ɓ9sfN/ p!TѣGI& lݺۍ|ّs3gblڵC122<766WWU\.~ .j*lSRJ'3{HhoogN4]&۶$//7:)Z[[3/BPcLCqUUUsv\I%IBrU+ BYƳbBP(w@ Bq"-b"}vz BHb$iI %&~nvF<5c_=cB"5poJO<1!$"4Ӷ о*2ӵm ~5fyO9R'c9ǞcTbP(_DN"d};P@P(qZեPbP(;J+ !&OW(1V( ŝ6J BqDX+ jb% BscBPdèXAQQXP(Tx<ňD"XadeexRU ErUgz~~_03VXO?~@QQ/_&PSSWUvAcc#pX]@B9X:EKeT170+^+VPTT@ii)w/b4McrT)HBEdllJJJa&EEE"`A[[XL]>}ZY BĊOEgmی q$LM<G40}}}ض.BP5V1c%w1XFL… N˴ OY BȊ UUUjZt x^^/HG,:iFՅR(܌/h.S]l_XJI$QGP%2KP(jYBP(2GJ B+1V( E&EXP(wZ +1V( E戲BBP(>_TXBP(ANPbP(;m"KXP(wDV@BP(AbJ Bq b3$nkM0 QRxp\XE"pJf$R3/OD3cR(:Kp/B֮]ڵkb7ccc<ӬXn8@wwwfђ>4@HHMf-&mi#HLn h7=>z ?CKjQ VDXY1v\]7R]]MAA.^"[nilld셲JI/Շ ~OZFx% bZc0Xd ?XcǎQYYΝ;q r <6mvs̙c6cS}V۟{ r1)[TcüyBFgg'd7gg'gV^… innFuF "euLAJPC1Z .'$Hp%$.q7attH$eY֭NvE4ͰKegV ŭph8W]|h&Rm, m]m#'Ğxo1ޓe Cy&.s&Zm۶ٶm`{b6nxطohP(DGGܹ2t]' q!?sJJJRaٸq# @YtYdk1V6<ܺ&%rz%$ L^YP(2;f6JH8JL󩭭K.҂mTVVR__Ooo/X2|I(Ǐܹsj*rej))t@-;T(щ!mH[#,;RŜ[՜׀4fupӖxu3~x ̜qSS|Gp\ٳ.LTVVC:./}Kq~pK1c%XX_Y+aؘ tu6ǒ`L-Rœnk.%ny˜e|>Bbm)%\|!#H IJ,pݔPTTD___f-Mv e9ߗ'vQdhI&\="t[?Y=w3ѥF3l޸B1͉f)Գ WY]4-nD[R͙ɵvZO|M=mtvvb&>,˖-cѢE|_fL$ oo\|g}^z wj*_Կ(q) ҼDNw.?ٞ}dB B9hh̟3vc]]]>}P(i=zΝ;۶9qop[[.]כyI?nb溂l/?ȓ%SbMt-'儵<2Nݶhɬ}j8%儹f' [Pʘ1cMzwBL^+Wy1M?Α#GD"innf||/}KTUUXd `cǎe^_+u ݚ*Ҿp +ա1{m6rWOsr1 Zs&B':#,q!c6=wnp!!U(;3g<*s&Ɲet\l߾ٳgIJ, `˖-NK.9նqZZZ8~ q]]/ .dy ]3T{6kW 0o 1gbhjj׿5i2::O'%LuK_v, ky,']N-IJzMrnjK."^u(<,^^{Nt]gժU<3޽xb,D"yillKBѧvGbwjj~vލ)++c…|{#77>z MӰm =mL&3O2" u蓭^{[Sێ8kď$ZćM"g3N/[d uuuvEQZZJII hcʕI8UZZʫJ,g?ϟGFT[c$sSWY~$t[X;999R^^ηmhiia||2^~e8twwiZf[J7ei1>4s皘t)QDE`xŌ.J(ISSk׮˅UVL&D"a> 222.\\.ŜЂaXmۄB!$~ àv!0 ^/e D"!x$%%%NGGN4W_ر8 j`U(nM3Zb Z*Smޯ5$)c4hCҔr?K.F9{,dzJ8wwu3}lL >Y'ǃu\'"\XHDZlޅu i>& u: ,gllzjx!Lƍ9z(<㌏C~~><߿-[Fss3O?3C ])ʙ됼-̀<uy:^ mzc&7[$lO_0Qb&s9Ο??e;ɓ'illDJd<7gcc[Tˉ_#R@5/-B ˲R^ Q`#y\f3N3::8ׯ'HiXn]]]$I .dӦM!hooR2KKKikkw,^MNNyyyhƇ~ڵk9szX,F 7ޠ˿+VPZZʺu8{,cccض͂ 7o- r!~`rQ+n5q7ČS1(([g]2 =Si8at %9K1uJN]9@A"6ՀV!JA{D5{mŚ yY::[,%f1%K066###^+VK$! `Bu֔Ȳ͛y)--0 @1eq\qiFGGkEEE̟?j~?˗/64'H`568 IDATY===΄nYqPdAP]<+TE'$qƶd&hH|ߞٷG~6WP2X%+K`j ҿskі| =%ؚ {›*W,)(r]S<3'xZZZؼy3/>Fu9eKss3?ϜجeYNr122w]***I=H,"&|NI1˲ô;~ZxN B1WcZ36].x};g-9ٓĴ%:ܬP͹,,qG7Pb|'h>ڙ(x[=qik]c叢C9Z1N6n6uV|20RJhmme``aBmmm G204M9GA" )++e^ b ͛Gvv6###ضiSVsY}F&0y͖9ϯx!gz1wLThīCWs Y]00M 9.xZYڨcJx"t",KbIGInOҴ$,UݳFFFʢp8%-++g+ɓ{=z??oob~z{{mh4JGG/˗/9EzFinnz'xD"A8ѣwr g2?f,0flOy|l`OK=4Fc A-v:Lא*/ܐ˿7L{dníJg+/hIg}{!6mK aGƑ7Uz|#Q,`\2" oŌ.]ď~#\.>}H)###ٳ> 4 4.,`&X! {\rυ  oyyy\rA^uN:Evv6mH$axx_WN[[91& \zjWd`,&}*)&,K9;xo9nWyuS>>( yeC/sbK]?%sLس,gq[ةV'X3#1&-ZG{;4ˋ2󘱔a8ps;}__}}}7|_7|)uwwOi755Mi777<;vLuCbǴgkentc.&W$aD{Pn繉[%k0 r7ژJt4aKy'ƕy|vg~zwj1&v'$ 12@RLZ)/ Ҷ&Rh" 'z5t7P_BsCN%D˪2 &a^NdMSmK\0x" 7>4%8~%N(n}&&%__^&??t_iJN&9+sX_أq%w@v^;B/g'x U%+(ѺF#fRb ʾeKEg%-|6>ppGD"bBq+cZfnj㒳1m#q.A_د#čGhH1DJxTzcq \TЀ$qY;7g} usD'W51em|VaO䲠X"KjK;ak2MUNlMnj "5|Lf}a1Zx &מچ+|}M):+04 Y%RZO61?S!~?<[g,bǃtX& AGۉ9u "~x"*g O.8T%z'i` H Eƛ{Zf̦3nڀ`aN̔zJ-;UK Q "1|YlWat~T Щx;F,d%Q!v\blbI6BJltF<ڍE\4Vp^QE@+TK|$A ŭi"Os)R Cui KJ st<Q.D@>sSvKQc#kDZN> KJ Wbx6nfOq 7~C5.Ph(PcPӨ)pAGqW{y8M+ G,v ۖ0kqixOm >j1SMZPv"5Ų7%~!y+raIɦJl_Qbeon=݋QbǯOb \.|)gg1x9L@+9xțIŌ ŭk;~[krl=NLCdya rtVTxxRy|<6V6"]TyNj+ٲKܔk ZcWb<c涉׶ssVV(W;f+J=Tv LK20'A hK$-)iHkYQ+ Ylq%h0+5(u1/Kg,f|_er (1gp y-Gj53پ>]{^UߑB,&]G”18$)!aI6&A@&bکDcH&\3yiɗWfnuݬ_!aI,)qk!+1\5m\JU3RYQ-ﵯm!M(Ifd_\j]>)3-%$p pU.COuAܔ MZI>s/HľeϸjB {͉mJ$gO$$ x5kxuᘍIXO};QbP(_D}Ƴ W'*x)ͅ4|@LtўI43n*BYLd;wx%3AjDm`n'^HgHq5VD[LԶӯM=Z*c#Вa=)Y(;beÜwJͅ܀cBPb|o kD[hNbҲABͰ6ydžNKP(_pcC@κu^RPP!gM=dzGfBM-Sޠ-y6@LjRଔIP(Qx&nqElm9Կ űRBؖ%UGPʰbJ:Jyuv"#3X^\ 1eA! pMI~f ?gVBPC]ǟūIjB4xNIZ<'ǺMuד:IP1cBqkc+1+'3!l4'P,{ &[r-ѰфIPܪAƏLAU33@-T'L1aJPܒCYwr5^rIP|VQV(3L z>IŌ ŭi*fu]Gm]VX33:d+x,$6H9@bѵ7 !e9 !0 ˲ڶg ##RbY¹]43}?/A\_81x̉'H&$[^&SsAAXEyy9x<]{Zݻٿ?x\YG溺D"Awwo/B|>lݺ]ٽ{7l֭[ٷoMMM̎#4f(CCC?~6LDAvv6ׯz{{?ɔ(=,Bxرceeev.^;CVV[ʕ+$p8ӧyq8|{c(B__o&qk5\bA>Ν;پ};]]]\.֭[ǖ-[hooСCnq,l@T30TcyE. hC][" t&!"HK,!Řg|d| sQN<*.\pPSSc=(܋:Eیkqz ,.XQ $QZZJ4>$Z 0<<̎;(**vVXի9uGj8fW^!''#G IW '+KKK h|~7_򗤧ͅ p\<ZM6qi|LMM#099Igg'He˖QTT? .~A 33/| رK.122@__n~O__hؽ{7;w -[fn(6oތ7%~ٰaHEa``]yWc||Vl6۶mk_?OȠH$bӦM,[ Onn.AZZϟgll+Wzjٺu+> .peLCQZZZp8ر;wt:dtttpa&&&>a&Ȕ=bǗy-2/)۾ [ccc#x??fÆ \t{oX.fqMfҍB DPTe؜9DOT,;ZX cppJǙxD"D"ĦPv̮.ۙ6|>999a\D9!D>T aR r8y$[n%??MӈD">|{ 6B0 /Ξ={)**bڵ/UU)((uVq8䤍ܹsu:l,[ χ ahll$//7ϲrJ:::pi)..^RSS蠩 )$%%P(D$ҥKq֝f#55܀$7P ș3gfʕ˴p &&&LB>}4aSO199l?5m)?)6,)|x)T8Xc&(B4sƯp ) "]&/Fׄk'vIY{$qZ2F* O'kF/U  Cqbw^R2e\|g 4$و\t3gΰf6nHkk=Fwb3N|m6C e>W]w'7,nɎ;(--aFFFe݈ѣG I:I|*)e%$\(a233qf Y+W4%ض6/vZ \rG|~e˖K~~>v|rZZZ0 tVO!ICBW\g?Gy 34?9}4?<>,CCC?_< {x<αcn9~­vt]gzz2&3a4T;P܁%;^дNH& N(tIPt k\hMHEBŠjlʴE :tMi\TDXYH@աZℂ(@E097TBnL IDATT5Q@d:E|.>U6.L(ʵgB TaEK:d2vT :CamQK 55G{n{rrA? r)VXA~~>Yg,\To/eS &U5iؘbΦ9d̝f?'0TWWSZZJ^^aϳrJj*++ B!zr ;v@uG$!PXX}}}Hdz׿vXr%cccg>Jqq1G'? HMp\999dff266Fii)˖-cxxxFEn 6Bq_8?DhUxy ]?ݛ(f[ l"ߨKcJ'n@D1׎ #Of:ۆ,&8+|MM56VfN;p dHu$FsH& d%tx̍,U4I`cdbbZ-a~|:H,f|d,2n~5DȲ477OzA2⌍YmCCT^So20Va0667m@ FE̍(:nv(iw'ODey MӘ2 '77^z~(>mmmvӦMHDkk+H>Ӄk~"$I"s.^hjUdYӧOmJ$vnXj/2ַw(466kQI>̉'__F8z(`[b  33}{Z F$a߾}\rۿW_k_/M>klGG) k|3#G,|a,!00Vxe+N(ϕpE:'bj>IHxR8duYv4 <2t+]a ({;x:vg ^Zf[t>툰g&iW n=#-E͆Ic9xfDH6Na.U~rlMwvH9-!CsY8]Ӡk\Mq4[slOiqjΞrۋS8;M`Y܁+@W3uIbzzTmޓdH>xD| 9y1ęƒ߄lofl 69;w6GсEQLɹG 188H gJ.~4Mwy/qƁ@v&&&0 SN.\ _Ç344D(b``wy׋(A FQ}]N'sBTU׿5N" K(Áif[.\E$(twwoRTT4U}}}b1|MMM$ ôzӧO~?Ν3j~)gϞebbH$BKK fɘlf0`3E4]xrq=.F":bw֤Id:eZN^q%puټ2SQ( /v"K?;(f- w'6Ov>PUL g{!BO@կ`[48y.i@׸JDŽ QŠy0ξa6-K!/UBQt1Ķb\ӊΊ vzFLĦdi!(bQҤ(,h6ی9Rf}6~ ٱ¢Z\x?~ccc8p룯̙3sD"sFBPEI)'f1 uN_?qĂ777ܼw?΋\|ygshTɓ'-pu WZG0T/qR.p9Lp|:;%ÀƔj\'k0Ҙ'YjtPDֹPʳ糓/tbT8cLE.)NN@ 9/~I`xJ'cɮ YyX&'* ihAPXc8,BfZR2LMMQ[[K[["V֭[q\g>Y)JŒژ/ÍC0HF"hJig&ٌ)0iEPa*f1g:v5T6۟IU}: .w!x%r<ch ˕nT< ɶ"2Iw0ӉjƜT 1AN`6.u29v%λMS n: Uv Wb;pd0Fud<>>NII Wfhhh⌌ n݊,IA޼55'0{6`TZg2,"`msmITHx5_UMWœ J*;Op2TthsVC}̈B ol"WtY!%rRٖpEWbgɨ@(WXcJcTپIרB T .ِo:N׈BkP!>JD#/ۖA4 ϮqT LD4uT;cZPM^ږGGG9p_ٶmCCC]zGGr{\Cӓkn$4|[[`c6cCiXLG3 *?>$E89MτjĴxVtFA_ow||.ApL烋aNtM36&fZt&/ͭ%ߟbGw*kK[+~w{*<΃t LiȀѰdLG`BSQ.sTdȏ<`|Z'7 =lY`rR%h}Oڑ:#{ Fs?V  A7ici%kͦ#Woo^$aNVV;w3߃ g`Ё&UgԘÿ& *ٹZ,XpG" 1n01th}c5 ՠk\E  E3M\60F]DNGt5ǘT F_Wٰ!(@T5kDAH! Ud;$A@7 Fb=*U`4O5B]d4se7cX'&qј@T- $4Ca7O;3IG(!h\~4Gu]gxx_Wl6***Xz5ǎӴc˖-f㉉ ~mZZZcg3k"LJ|M4݆ fȓ6glz7Q0 Pu :qn/aq-X`ZՀ ksT38tO]jNiMY!As`}êqG4# n>D:ͳqS :k0Bf_FPպ:g]"E_lٲS[[KYY@<)-- NCC={OwGMyC[($&>c1 h#qnqtt/`]7E,Xp㮜g*--- MCA 2::Jss3'N`hhugltL~l,X:'$9sAEi$(ނ >7Xa(r]ojޓh/o ,X@Xk%` dE=ITb,Xpf%`A6Qfz8m,Ϩg)/T6Óf"MŸW-)#J8m2014ɅB,<{Lt0fg6rE^TFR/4#P&ެg5i(u4 Y]u0$i11/bۚ]6 UUlnfyR睌a~Kc0kLODck4w#Y5rVݱ48Jċ?ÿyK8;e *cHUlU½@ A\Mij nl꫿͕O2P v<ϒaGYt+W |z$| |ށOƒ$MKOtC7A oj*vMnaqH3%0җ$tf,,9!GQ8qH,jkkIKKc||˗/si:::ؾ};MȒ$ݷ,X… ޽{ahmm%%cUՖH–YVXHVf&i^-,%ˆaeEx.DA 3G^n.nq%Gwx=v4/nΑ44e*\7zkkgȲ̆ (//';;N4etts'33"U ,o-Rٌ'4-a5O4u}) N_O6420g`d1$rJxE,w pVZڵkz oFFՌ@uumf… >|H$BOOvBN'yyy8N >W2b|'DQCFF=xȖ`||300-2~ޔCa;AVcF$I00PyfCa*ã~JK|YS#'" 7&ۤ/e cɸX@HDQػw5D<qy4lgooA^^< H4cF^|ZZ{1RSS0i׺' ߍyT6lht4qFly唔\N)>=K_|?FD._Cε^-mu( >q r 3 RSSIMMfp8HMM%-- UUbhFJJ9u]GQ8)3q+bnn)0 ~D\EajjjF}#`qԛ-)v;vAPUxH07Ygi='c9gK֟nϹƂ s2;ן-a%S7l p8xF###9s{}vg?###f|`mm-O?4999݀LOOL$1} ׋444~WUVZ a;ѣGMg+Wk.*++1 ? 8Xr%< 444ADQrӉ D"Ξ= Bmx饗<lͿ6$q=a_P}MtEx<DSxd*?DAdIBu @|!k͆'RIhCDtMBG'^’Lvڮ./_NNNu'(ܶyD#K+"ciii!p8ĉ~zyt}t]gD";F}}=EEE011AWW/xWξn_{{{㔗SZZJoo/ 8N}Q^/{Ȳ̶mHMM}r())! 07ndΝp!N8)++CQ9p,STTd(RYYiﯬAss9۶mpŋ_"YYYؘCGҥKPPPzkIDATSSSԩS:u Euu5XӧOo>Kii)twwS]]`xx.>CIKKcbbsa6l`֭aO9x .M6*sB.hjjb8Μ9Ccc#YYYl߾5,,9 ׸Xf2)݊0e`Gc̬3]wav:Ź: Iq8msb pf^JMeÆ 455QRR]p! \xvJ+G[ahhχ$I0==MUU٬( n͛7vZt]g?~bB$//ݻw|r0䗿%x<՛Iuoaa!O>$>n~EUUq9&''WByy9\x N>M^^(( ^۷S[[ tuuQ__W^!;;h4J0" د^/q\BEE{%55ٳg&vyimmk8)mʲΝ;Yz5@l6~'N I/%%%(BZZ~!cYn6lv366{Gss3###nedd#vZ9vv^xJTUl9n={vIKK>l޼"c KH$ŋͽaLMMMYYn״!c3i$"&CfPp`lNmb[KBƲ,n /6<ߺ'r)r ̽OaF~}knmy!PXX'|b...&-- F<' rΟ?餺ӽLFii)477STTc֭3m ***LnMM 1\|0r \tA  5k$c0(,,d͚5|>vcljD)Ne+W0==(!W\1,SRRBEE$( ϟOgg'===(B$!munbڵ#;; eƍܳ$Ix<S vc͚5hF?}}}144266D"p8L<'iNg]IF466"5556+W"I<-;??t,oPÇ{E] 9z(yyyKBKYt`v ( lټsr'n=ct~|3;"))7A*I /a,X40cccvBJ211A{{;vvMaamnf3Gqq1/_& %==RSN@ϖ2==M0DQ&&&s\.N6UUq\x<~m6np8L,3հ!˲$2ȲnN)룵N\W5[u=[!IyyyXr\zD"7n-[[o[oٻw/$PSNe&H>Cg&E3m͏! N")))sbUUehh{-|K͆릳[0’#?2{wvR&|Z*< ŦJ33dr N=V a~D@NV&+WXrIzm@דMx #d ( ^GN<ɮ]f``g駟:,ϦM&++dfv!1@jj*9r$aEUUʐ$|)$\%L6].uU ͘u]'77c~Ae3W֬YCee%۷o]ҋz=/7ġ`X'Or1/2^|El6<ݻwNI'I>c>Luu57IMMȑ#?~\oo~%mqO%++M6X,$6͜{PX,6'WRA["jhڿJogWLnɶ05 HHDrW㌍$òCn.e,ɓi&lق㡬tnH 8/BJ?ΥK@V^=p8L86wIOq|>l6$I" T1HHA$ nӤrrS'~FgȍB<3]0T@f7K}QJJJؿ?gϞQȲLff5] 0<n}~(gεp03alW\ZZZTWWoNdS[[Z EQ8vxb233MG}Dqq= r9jkk,c~~z9{,k֬xMFFƂ;eQ)..>}rʀ#S  55'~r#'EUV΁0MMMLMMQWWS(TTT%a|dffܵx^ѨzHD[[ D">wΦM8w'O TUŋ_Y,vnYp;H:eRTTDmm28[LJͭ.#QMfz_xI/KA3i/̑̉#~zzzOy z/i[8z)mwB~ǏOee%uuushu:TTT;t:YbNN>I0䣏>UUplٲIFF{۷ӧO##WUUuK$oݺq>:::zLNN"O?DQdŊܹzx Seڵlݺkχ㡩x<ΦM(++cƍ~>:::p8 DxGXjՂhcǎ܌"1::֭[Y|9iii<|Ǽ[Q5o޼ JKKOxqֳÞN,,_G}#Gost]gjjg}֔~RI'm,,5N'555ߏZpu݌_~mĠmRزi#]tάG3'IZd玭,+\kWm7#wuݠR7N7q# "ng 6I&Yo'mƚ111ɓ'ill]v6EUU zF)++cs١iii\.zzzXbw令H؟|IgϞŋȲLjj*555Mr"2WFQlJKKfp\{ 322$InQQQAFFB|ڵ9bއyݱLz-744)..f͚5oreS]^WWǓO>yЌdN4MC3+ұm6 twwy2n:55:өM4ٹs'`l6YYYlذ9 QٵkNpEVɚ5k-XXJvVZejzFGGuiYbLNyy9+VX|w3TM㭷_Amf9k\%y;{UUyOoh$3#a+-#==Tzz qTO*,#,cȒ<qi;G"hiiϜgK|_DkUUe``tpYW _[K]"ܹ$d?l6un={LbNmٳg}{s7&"Vbfrcm۶9,=cǎF'wwHIzҗ4ANkRh&KA[֜x]IltJJJ$Ilٲ 6dzQAسgO"f|DQw^ӳڂ$ISTT(~FGG$;;Kff9ϗ 4P>Bas?畧Qzz '>'EQ?c㈢H녋Hb‹LQUTU?×Nzzi^/YdgMuSXHDDM}'6dҎuֱyf>gٻd|6Wα/$lMۍzYI^jk+V$ʅ)I-7 ("Y_^7|Io2^7jcM wy;00#G4 M8q:<% .Ѹo`ε]pyhĔ/C|6d$`/24°ܔmHo#8Eļݶ8##_~='||\t}ݍf_6f$%4Vb ,|(//`A]MD뜮i\쾼5UbwFƃy,3'|݁n/8y>k$n{16oތfժUHx$yfJKK|`^G.DG(~暄u,Ud9%|( ,X۸_CX2^8ݻw[,X`p,i=pdz,X` I'?b榶` E/n3` X2Nm,X`a96^\ N ,XIE`ddkbZ`?7$t؂ iX2O` }*=M؂ 6ܷK MLj٘Cp//TʷBm tCj9L} 1I.VBmn[1~mܱӑQj֮l`e#:k@1fk!Aղ'2Z"9,}V9ГV YlAmamkf>>ca34nT]bN?FWIENDB`muon-v0.4.0/subprojects/meson-docs/docs/markdown/images/conftime.png0000644000175000017500000002475114737503617024630 0ustar buildbuildPNG  IHDR]Te~)IDATxyNי}76ƾP!-F%IoMTTڴ-HeRjT e'daf>s 19=<55}ܟsk{33Dy .\@p .\@p .\@p .\@p .B4_?_FJC Ru8r+e[v*֘s\ZMA#ǩ3tgGWLSr xruMϛ6:~ (-,YsmZI}B>JoMt >+ڱ쏉j~ zaS˚WPI]׉HׇI8b^?13·>ϣiuf~{vt lAm묏W T_MGߩkؓ.Eӯݨ?V N( 89ɣc#}aK_c5W#]dݥF PZ/C>/hƶsay 7nia'@v)7cUiv\S l^SJgWK^N:$~qRսk圡JitKEG -qU|6Jo \W ^ U 2)jx^=zf{1}Oؕd jooɲuڻMzu{Cu6)s7m?/]eKAmwwm Nsp (2 kE9fn%zLK:< )Y! -@>J?=S,@tj.65)o#DvdkWb^szhޟ϶/-|M4s%=M8#Q?M~]=*y5qZuL1/Z*mڛ#‚=ڰGRJ<)[DFmޛ-JT%ﱟ#f9{#n=^ҺKפI795("n18ES"9?*RM( ctc}uFZnkdtzϴ7]WGgh&SRNqF?tRUQ 9ZIҵ|$;/TQ!R5J:p %iW 񅮦SDtՓ5HES*]xL#?rU@GeJM othy?ͪoC|LP*8*e}>/]R_-VWꪙlZZE׎P}(sFڿI+zZ[ZMlϓRY`~q+ٶ_GWI H=te6L>T!G [fiϩ+T6h֧/jm{$)R}F6v﫞u$/.=j1Lwoyt QS'gUJG8}|v]V.P&\z;{7{R_kQ-t|a?}o7d>n?XrUQu>يre/b $ʟ^u(vF&nifdRM5:Ũk#1EL^Za3L!؁s,ҖnLxTIis.;ɾ,T{l[;ٻ>ќ7[:Vj_{ܹ"|#=ISG;Pz{壶vn=r?./8!CN O^*8ڹp^|t|Oj@/8aP/襊N>pj"tB ]. tB ]. tB ]. tB ]. tB ]. tB ]. t ]Z7qV8?\]7O%y]@\貝StKU~<%eghZ@O=0ۥυ.F\q8~_`"oWPl.HNtNW,E$IٺQK(6 ]٫FgotiހJ}_H_Rr)RlٖTop\ccf"Ѻך}d ͸zz&hçQ+..ku&]Fj_^[".ccK'FtBtIY]Lm%=t½]@1Xܦ/]/Tt`WFDz TP}r 8i|LB ]. tB ]. tB ]. tB ]. tB ]. tB ]. tB |2teB.0Ǒ^WqO'hw(> ] 4첾?kNԮnU7!ە[ 8R_ޞ*邻O--&H&vcgrϿ\ \gW-u;jآhկBυ)JJwfɏ6Oם?y<bˋ~ ѨgׅaQS'؅JVNHHPJJJKwbJe[R]qILSj>T:lYQ@]^lӦMKW\\\ !z&ioQdʕ-c|I9(m}Y> +n:Wa.|.t9:i/ޗ=Uo%eHJ-(I"ϽU̽Uxt]. tB ]. tB ]. tB ]. tB ]. tB ]. tB ]. tCgS!Xm&v)'wCWVMv%'GCW6Ul쩾5C] Е}T N5v] ЕRou] IeިQO~5Y^ JII)(Sʲ-.$&)x ]+5?axáW7Њmo6mxŕh l&vEV\;Ɨt|\W4sL{:bХ@EWT._ajz/pb|,t!,Oop|ES .\@p .\@p .\@p .\@p .\@p .\@p .`҆/}p9#lc]¯v]s+{;qlJɽeh7[BWDպY CNQ#BhTڷrpoH-A!A}cGzbs̼]!n z-kjHR_]]}fLK?%$$(%%KSM\\\-tlF6O2rvjLQMGݦM_v}K[hߒE,ڷdǗ}lL~uF)Z> _{n zPj\RdK vR8`Sҁ.3] {ę.\@p .Pd.){: t#',NwMRPGNҵf3۪9r`4?nWN^e-{J/WI)2[x=\>QO1vJGMծ>O ե_'y]U0ۺXL|A]B#qY"0bv?s<%}Kw'D1굹I{ %n}ueF.fk4bEɝ T2]m -'O Yo+юhqSGVsz|$_mfj%Tz}2햳YNq RΒvAw}]S{R x24rcjv*cGDܬqֆu뻧/!c̺@UtXF='.׆ a:pW٩.tW/ޠ^"#ݧ{g[Xygv8nշP楛e.(cFa;2lw:v}{eV}cc`nIf%kRz5vgنaw.K_:Ϛm{s2VUӼ&?\m-ui%CașPN˶;9k\2zamm6C9M;S,׶}zNvup {6em6vOkރr(;cjMUgXPcm5'Y9oZ~T ,o7YH6<@os.{nԻ $P}ڽ&WQjzݣzZKוS+FkuvQ>njb_)}XB+Vֆe h'0Z"U- R# _"r+l%'ڴCu(5/.7J;ڋT? ,X/nu,']NHtEMO4.r?7\N磫E+QZm23j \.zJSP}}Cm_V/Mk`ֿwʿbEޤ.SctW2j]6|/jz4^ZOk5ojC[iݎ_ۻuՅюzOv7>kyDE+L;?wZYq\6Cҋ9~ە켽H]O{EB-|jtݯgSyΒX~uY*n*B^|CcuUrJ͛e&E{x+N;ɗu^Ѭ7j@˚R|`9\Vh+i&@hڑ_TBs)пym:8ffQ;ZذeffǒYm~]ްaÃ_,3K_irUIV5ʜFm!T'$YPͿ,)bffK쉺a+23ܽ6o̝vihL ~av|햳{M)"*Էi/^eu]dɇ\M_ĞZfGm?F-mޭ'icɱ_r uLWag7y,m@\7)M'c|_)E HECNDrpw6+qe~2e,Xg#KIg?2<)vNZ/ؐs?+w}{[C c翺ʲ 5o!6Ƭo̻'2>3/[[oWLJˋJN5+QMޮ @)eϷPU;t^Ep .\@p .\@p .\@p .\@p .\@p .?8]IENDB`muon-v0.4.0/subprojects/meson-docs/docs/markdown/images/glib_conf.png0000644000175000017500000002174214737503617024743 0ustar buildbuildPNG  IHDR]T)#IDATxy\T 0  ()V%ٵr͔ifa̖KfWsi-o`V-rEEsMPٗa9@e0>9?39gFQUU!.]@Ht. E$D"]@Ht. E$D"]@Ht󨎞"j˵G kVW( v_Z}(b>`BQϡ툞щ쫓L6.y>lݷ`m%[|g;vmY@Zի#9<ꥒ=FWPGNpJr5-s~b}?{>lQ6MTG醮Zsi-;pG}7J橀Gv{vIWOGpNGE`j'W=`_(p>'v'!^Bj)x'!X-/=SQMCukѡu秊m_4]'(uw;m9 17jGAL+uG,WZM[:5OQ.[^11(W~C^_壟m口{!O(n; ( [r8?9N5g=\m54_l]nh4pժ/4:{>J'>fzКk;~b`1UU_ }/.Z1:z !![1O}~x:OW v'ІRTi?K2£$cǩA­UU)*>Mg(([) _[z3z%wǩP;^Bm%?}zۇ+-JzaWm9qTMW~2I4z*^)Q{G=Lݲ3*65+;V7WE5kCaek̐?7aMhVeo$mtׯjX,w= (YCJUu%lg4v 'R :?3?c i]Z@_!r,B/ǝ˙ b>ӯVTSFz|3 7|)&˭^\4eess3tqٶ |~v5+ar3_qRE,Y)YB4EUDl/O4KϹB!pQl%,nK7_?kѕ_UߴޭVJQn=78!\g1I[ҷz~u{iÛ0rbUp,.hC{NϘ~"B5G~>51]]|?//LUE"T_9yV6܁_D ޚi?Lx`3;Vn8V04g4OXkq^oO[k[ZxеS?Tbڦ+z5ܝKgZEYrjl[=] zwٻgܩCkelntO̙7z7Ћ- -I̠敘-m9 ׽6{sw?:}_(Ng3omM1jɜ^O~[`ᾉsr|TUUբ fo#Ptx yZ3,_#ռ̵߼ѶܒgͼB y{2*<;0ic!DY9]O+M.;CK[pnŖM?yGSXl?|(hTۧ_ > 8 .ruy絡)׎lrGCB"P}>fL9B{tZ7=)E$@Ht. E$D"]@Ht. E$D"]@Ht. E$D"]@Ht. EjEsʦ齚z)}ꝝ6!-I?t{jѥB}Eх-W5b僇5xu_xy㐟<6ΐ2~}k;ϥH^%0iYc\u2*vќ2C} zajg]“[}#uwܢ&/wpڂ77k+P9մ^*6V!i:=$mcg;včӭ>ko^܀MtB!4C[j/O19tqn–8{{-]ʱi.^!ĤeK ȎFCQwo7snF#:vYOuZxjG'8v!YCŻI)d+Z_{7`0P {G–㕞fe}M܄klyђjY~mjv0H!ZiS` wN̪iX5{s.^ɶ`֊#9丗$68}cj7Μ^r.7tuNzvxd yۧ5k\!cn`y>_w}WҞ^m]xl&_o6">>2:TkCUEz/t. E$D"]@Ht. E$D"]@Ht. i=@[;e3]Y1ղ̃__is)%y=̼0dsZah!#W]J]4ڱ{1se'&+nfGtХEL^JصoDuom3#xW#rmZM6Z6dNI!C۰njv[9(|޼SIBhꇶ^ܟbrشM W}p"ܐ[WMs!&-[UFv4zҾxxsln`4oX`Y-BMk]YW&m d*{(h=me.Lz~;dvpj)Tk فO|1~ܘ/ke-p[EgVv`X_;"rD _t}q !z}Wf.}~qccFE{&/K_\Vk \Wmy[PMة~W]P>"I{Ŗr~gXϜjK~ըO'Loa p[{&gP5컿hyf6*zdo/S7OwtVBۊ4î],~%plLd>: @հqT϶}76'e..']zR[O yzӣ˷ESLU3$mѮy]7Ş6ujym֯oXz zs(NĮ],>staav%˟_~؞[඲kwZT "kԁ;Nn+vQSto׏5ZFk<;Nouvl#}ϻqo3+5Q33mM86v5t7>\2W$\36y]u5BlF`S @#f}T]`>zj$s_G8{Yx_Λ":7i$z|T3>&}O^w䛗|TQN#룃TEh=pS@g>2_ەmK+]6E;TTK( 3{[w v|jM{ɫ“ʮ͖{d.;c,N=̼0dsZah!#W]V<@sUOiL=똹kͱpڂ77k+ F@::A֓sJdw 32 osZ|a|5c#zp[soïG_ݚ<:W @`w. E$D"]@Ht. E$D"]@Ht. E$D"]@Ht. E$DT$BG QEgtg p^NE[ym織KüDYf^90kw쐑.SF@%9U OnMV͎֡Kqܕñk "ވ@.2fF[F@8S)?dhَqt+ڛ}*)7sBMЖڋSL)Yi=[cy\<5BI˖|2ޣ.n"C p^E!7/ϲz7iWx SyC1l%6SY^~/8!!h4ް"P53P9bP(ku{;_]5,[N;R$r-)pB{߰"QSp4+N 3 T5}mcѝE{$-H9/9)'Nl_ڍ3'%ǽs ]=Wr. Mص&X޽]Wua1E v`@\ {s۹7=9j(LpqEn7D"]@Ht. E$D"]@Ht. E$D"-bOiYEu*Bɼ{w&]r,jjDHt. E$D"]@Ht. E$ttQ?tX(>[=!r.5`! G{2eTwpڂ77k+P9E[܀MJ5VS?gpVGO/ޣ.n"[%F 73 U5C{۵֨=ѽ+Eޠ&6ѓyѾ.zŔgLyf{nc0"""phG aǢ;qTڭzL)Bat)8+gj?fvEyq/ǜ2CWG ज;,f5:}~p0w@B\|:G9iοx|||=hG aLJ @Ht. E5܋rk{n3[^S3bu:EizۀGhݰK_^8nf)>zS^3٥C~Wthzc?loo**|K?_Pu"n6!?.:&^{s}KВrHsUzQz_M{|VxtnщBO/0pK;2L>ut#mɰ Q}gȼβ~[oLL'>wj)-wC̗W~Aנg78qٍ0_y !P+|*E2Mߞmqd4|ѕq]%Y^޼8/t ;#>HmŮّ7t}ڕOƏyu~/Bw0p3 ;9_qXQ=(mFOlo~aG $&Ut) /RtN豱w%}Jd{cgn>;nEQE1;5%Z䞭x6>,3/f6+J0-Z^) UǫauQvvj V] <==mXp%?v|hf|/pnUè*EQ %n~U\z)eAXUUUU?ﭽ׿铻r^B*b)2˒s%"ޚ?^ anUT|u'漸ȶ k̛VʴXs>}OUW~oi] kjի ?>]lLߛQq"T9˅?jLX [b6ZZ7hɜK-EIKW ]+~dvʻt> /TO]߽i"U.Z=aRU5s݃UU-Nߜ}3_Uxz帮nB_ڟmUUU5~1O3/![@1ǪiЦlUUU(=?vŝ+5%9]v!fr \/"n<^E69{ QdykcKΣSo}٣p"n<<~:Di=-qɸ^hu?]zU6RcgZ+[`ߊgZ)x7k~ͳ a^78PQL>_B[M7W|ⒹD)6ݨV@!J~Hi;un4Yxqk7wGCQwM؟?ֱFQC+*go]^zuvu \JO,(Dɿ\vS~-c 6޵j\[!|p^a6˩O/3K+]Y׺h{`N?sG=U8Mc,\Kx^YM}kNq^"=DaتZ`α EIK%Gv!^û>"DۗLUIi_?!$9t"putשkb=/|G(8WTV7yزa-`>1TG}MUm綌 5o߫_u0D~8#hwT˺W~8aeڳ?Sq 2JngUD-oHY|}Wg.b7 !UJ4Z ~N]ܱ|7m[5- !I߶aM{2[yBxP{ gɯe;bja_)nԵqDU t|eM6:"k?{A\R+޵ tWkB}ݕߎ~w5+Bɭ5wOӼ)#Oto{/}Q[߸7(7O;6ۆe^֯xcZoxtɉÛy^q|7cU'Wl^8I'{q?@(;rSSr/=o .ޯd3!k7;SUU%wriJVgݵxl>B!5k]6{B4l6c띄/Diz/x{TdCE۞-i>U_v>jI"DN[\ŕU-I[@Vfʞ)ʛ3~}y/g_x. qE$D"]@Ht. E$D"]@Ht. E$D"]@Ht. E$D"]@]:u~rZފ(c].(g>s؜:bK]_1ξ0eJ-<,!,C8CZk'l.<'~ȈՙPMu_tm.ђ{ CyzJ9eg}k_!&nz[#zl>]FOu\1-tBaޖpa#i!<BhEѝL>evҠN\78^˓UnzwK^a椤$X8SttCSgx%jɑ&?) Ns^k7Zt.Y`p UgV~~=oym7sBhڶN9UvªlZ9K\G=gfddddY:[?cSYqǻN uѸ+Iۦvk4L)Fnq煯0;{xbbLCmE8pB8D"]@Ht. E$D"]@+E/6;{7D"]@Ht. E$D"]@Hus['n^SُjQҡ~x63gk:E{Z>h3N ٔ]r!yO3mOZlLmy]cѯv7=|-YM$ꩳ]tow?_S>Şw$ $Bm6'T2_f p%0!Db3Us7D75c2 uƕit. E$D"]@Ht. E$D"]@rtmy~`SRܧ^>5Iȅ1,_5`ԗ-(lx,Rph~ jc鰕6|`Ŏ\5ʡ]K 597uM^fWUG.zw1uѝά?zcjC_Ԅ=W~kw+xnݭ37 8r (vQM@ǁ: !| ..~71^68f%4uɋW>a-N]zޘpw_\XԷc@-pP5EVd];,y4Ep%(33nly-鸨:Zz]|jl{fʔy#4'KQVѯkBEKF)ټϜ96Gpcqޜww|H "m'?ٗ4ށ7 ͋}7 ns?]381dSvɅ>CFΤjruBno~^j=V J|m@SO!N۳C݋ů-N)b/e񖬡clP_fm-k7"7_?77j{^#i!<BhEѝL>ev:7/Sޘ)|#uB[]a-),I~_w,Ygz=v`NQqv+@8i裳B!tZ2|%Dm^;tUڬ{l/ -:{IIIFe "GZ=F.z|SgnT2^:=77st[?olLt=bck0.Fo6a#-ڠuV {C'VD2i|!u8%G3 w˾Sx`o%\5ʡ]XR)C;f |Tp1%wt2:2Tdy GG:56 k}M p!>ʩnPw:} | #5k] #gM~ygݡ+F9#K'yg_lh3᫞Zx5PGw !ܼ<:Qmq>7:{F&Cn%MjcӸuX==斞~AÞfSn: p&naGYjCh3<3}uK{IKnydOvyV@sPm?} *zCzxi\pbɡMG;L[xذ?xptSu`3;jZ-]?wVnNRdRq@ªozrÍi5P t>?Ӽտϒ?N0Ûj\p9s~ѽ8Q̖>_%ڷƢh?qxC.!PRSųy9[2P}.;gZtL¹9`Ɖ!K.$2bu&eTuњ8AO4+?x_Wcyws,bcOeDWR(d)3pa.EK#_S^\1_Fn3Uq}-&Fpq.tw\Θf:z\h%n.=*>))hˑ C@5YKmp.|Mt#ʧ<ڠ񈤽d2MK7MlQ~QQQ,`0DGGҰTvEp@msm:]iv!(=ۧZ7覆z@] vlgw?T\tQ7/ jP/DD\m#611&܅nq̈́}xvn~k:s<K @ Ht. E$D"]@Ht. E$D"]@Ht. E$D"]@Ht. V-֫(J@ģokBEKF)ټϜ96g\ǖ c!}`!W-5sC6e\H?dL&W%|aӇHsΌG=ӿCL𝋷dF@R#:>N!lxv;x$ $Bm6ɧN'ui=갟1Q?ZϴШ}}w[ L 3'%%K`0jkZjunDl vQ-9ф'%ӒaZi_b.4v}Bߣ^pTT%0 ѵ8fL"]XxKсEwBo3/<-yfBM@>)LB!ga]x8wJ],=?8=9/(?3####+i@ v '̊;uBP pQ.E$lڭe2f}ŭ&:ӷ቉1.wpPWPB<{Z}["cO.@Ht. E$D"]@Ht. E$D"]@Ht. E$D"]@Ht:Zth(ٚcsKϊv0S#$oȈv7oqjĘ7;Qp>Pg@-q._[=SM_t-YCDŽ]a _avĘpW?8 p !n~k:{/^;???g%qpK]Q9nE. E$D Nȯ^:2kM(Wsj{*Ji{MNQs7<(-ʜ%co3Tƴoz \ӝP#"4}s~?ږlOU\yWu]55y`xXeaemY~˓o!MQCMLH7B~hm5Om2Y_3(ண/TWڇ;G&>ݟ*Fm(=ٻ?܁U >il:Уkϟ^|wˁϫKO^eUT*}AVjgٷ9v!-sS+B!>_J}ms~)>Iۺ'KR$>3{G.?=\rlU9.DidvNLۿz=3z<gFʺ{&c|P`3ۏXzzas /~!j/MtLИoͶ +[E[;&-xa}fM_ܺ2~eg}+JO_y٤ϜEOhZS£Q]܄Gx!ysc5藥 Y_y3wꭁ+aGZe?E[ j]ĵ5~`Mil2_|1P{EQſgݣlzل=j5e)(=2#E`Wi`=UlB]߻eѹv>5M=ûOA^^^)>hɞC3+٪tuqѷ*jІpV'[8ݿEKUUUUV޺[|3 7ڪg mZٽ_J~_jElP>;6%G5Yq{[m%g}o5a=i+Wj؄~oxjw~ ~rtf!eB ȰklKYš/,e˭gJ42C˧|.sǐJ糿ܣv=s"c2 k^{Ci]`^~w}ަԶriM̃\u1gѻaN]Ut.-:Z"Fn>ez}keC.qTc2wPs>TEQ*mG>>+:*ӨijnKӟi(:B&>a;!PZ~{LUEi1?ƒ [nJMfF-}a'Eq >yi MGTWƍ{OT :EqfQ,-%!-aSEv{m"rw#kg潄gRl֍k^zn憣Q;bXO"-aߺ5>#ؒz |-u{?V?x+/VEg.y[ }Ken>ڣ _9oxI.M=}21w~ݐ~}3Wn/dվO7bZÚ[W֪n$+PƩ]%y}"Yyɦ;V"p UUUBV_YTUUU㑷k zY-e{3s>y !g7[Ƚc~ !jM=dTUU5IczQn{pE!|.ZscdMNyi_ڞSk)k}jNc!ߓSjK4dGu x@ut[1[ʶ¹筷de)M\Z{);oW=O9'QIC_ǜ{{a0U}n?ڥ8~+uAO|og a:\;XDu]@qx^_M~cúZ>yйo'9K|&/n ^ yP:7UW]R9&~qeU ^$l_NFן^7);ѭ\.kLְ֞?/`[.ǣ?iiDzguޔyqBT*5׾AJϏ}jVǍ33'/;~-pg"qW:o2;}Nw~u^npTrn ӆ7~cW!Sg?3_gҬ3o PI7!/E}99 7ϳva_{rZOoԑo_U3}Z|7 XYXk rs8'~:ߢ4!lV*+OGpblɻpXB(w4rR~>Z;Ap#>H"D. H"D. H"D. H"D. H"D. H"D. H"D. HvE53j+;)Q 0GΨH>[U %c\4ԫ>Mt%g_u\h0Q Z{ةJ^θݳ;Wu1[\"ئ(yהVM[vRDg&v;]A^e s9v$G'ض-lҞ'̰W1Ym5a봮! 믉 /UsFN^k>b̻;""¾"ҏTz)po?03Oqpӫz=LB\mR3PZ  NQmßlaBՒeT]}Vr\>PBvE#?`) 0-5r#SmI#s&->bN 3z{aÚ3vdnt5 n!W&oNKjxa+bzPGyL0.NPBvTq~PR \@"E$r\@"E$r\@"E$r\@"E$r\@"E$r\@id53j&~3^zvڮUsҳV5xѣ,MGf=]FީB1mz5i罟"vm /-f9θN41[hU 9?spj>a;QbBmVbM:kkB+\(""Bڀڌ1{bҴaÈFIhhhu.J+{`0jkb@h9 gk5q$BdU+hK$ri? &R-0~{ kT 94C&||\#l;-=*~^PW3+8D. H"D. H"D. H"D. H"D. H"d\4Ǯס(Og?+VA䌺5nP"腽9\xӻ 1$[.rcsD-hab(!{9r~5haw)c]SB[5myg{L.앋-Zh@M'!o ; | ̱&9<:aŶmaCܖl?igt^Oa'|:7z8mN1k {Fv.5K_ ݢ{\W{.x`g=$1!AآQ/mo*Nۺ{x3}㵶k{z޾E5=nZx` []EL5E{,]zzQ<ۣRʹ fՖ͑6Ӥ9L1EaM܋;S.f;㷴ԭc[תɤ}Yq"6[]|+ ]{qTsΪs cI봼EwywS@"E$r\@"E$r\@"E$r\@"E$r\@"E$r\@"4Esqjz(4|lB\̎^ث_ۻ΅>?CU5!4Esޛٯkc´8V BՂ=ZEaݚ rѪUۧ?9pgU.p6K_ ݢ{^[KDD(PZ NBjѪ XPRv_f%gzupr6mZ87z8mN1k {Fvy """TU-Я`O=1iZ ߯bN 3z{aÚ1vd/z>3hUhe7}-[6 H'V 5lElWj!o}W-d/ r-F::\N[w~np8$r\@"E$r~Dj[ÀNׯZ^y;mêbqT$r\@"E$riN{<8lbwmkE$r\@"E$r\@0C 6,(['`ծrhM>1f ^G7>WQzp/YDŦamjXh M =ao@u{:gKq.N!Ā )& yaO Prі|Hn9UTjXݱ]QWo[%E7ri9"cK5Z~fy-"""J,KYCgB?hYbaѲ!uN_ji289kW2-l圵-mKxй4"SPnRV[U1l9Lif'oS#$$c CiA BA0BA!`(zS/+~_Q!U9Жf;Mp cZT؛O|kWAmֳg o49eciEZZutvPН=pʕӺ1A8A !JueѝH"D.aM=r-^E֊_RcW7E6nQn((K@&Xnu5͑3z)>aEnDzJ GoKW;k@SnܡZ:7A:bl׆EQ?.Y坅-vJ~-lOFg&4{*F5}Ex c<0fM7^E!pn?k-ׅ;eY*z.smѡ骰jZDh ۰╙"q 'x YشESPK6݀-ϩؘciyt,Q̨ќ\{& 7xj sϾ:\5= 3w{5v{.p.LZ/lZx~ƚ}vF>zh؉,Uɥ(L$\Vh=(N[\x0MG zn^ml`w׶L_~O1jCT)Tk+bMl5}߬6*uxV"5a뚔ǞReIC7 |/\'r3fS=iQ ?N׬Z~faŌj'ێt~UVT_}* d1r_'pq >uO9rF*Gh[\g>ݸtc(fq;f{i>r΁SZ_g?wzv峟?R{bЗJcK {إM}UUU˙ZW꛶.AcegiY;qQk̮.jŖyrS5w{I͓Wkutzldj<1[a2.[tl-MbjI~sJNX:V XHZ?Q۱;f(Ԥm]ypnkr!KU5s*dT 1\uɅskӣ,g?]zal}%DZɟQ趣u9)o`-'|4h[j<4ph:uˉG]tN#KYχurm?=a_޵\+;2nl/jr%:ǗYwݘ e[\5מ9c>dvcFlemܻ8 ZE͎`AYK}YMkM=diw%Y8dZm4]3Ԍ_e}u\Z,>gUUU5|GvZՏ8z5VS/Fi:/۽!ttz]+Ԛ'Eɰ] ^۱;g(rsq<<;|}\h.^7CbŔ`싻fҭe /!DŦ}f}QɟRȶupS^Ϳ>k)rtzf_ZTU5ZlUǫӆ"ҝ]!/j<͊2jX~{ {ԅerGB8U6#_o`<]^n{GvҩKS3w9!%<99s>z1lʻWkƏf}LK`Mr[x!&GyutrPz/g\˱B]߼ mөL*T!l\/ nC)u>ͼ;n(p5ůOvPRd1vd5e]ѩ椣 WoU6]ŚzxQYeLcOg9˻<+z::1 8rƸ%gg.UPwvi܍c.s''wQ3 +AF=*Kٛ!mّ{QU :z3#M^;ۤL^B8a}YUN,`eg!ηQOw'[UUUq'>QCjXիTUUGޮO:jM޷u¥ʃ}Gbv VӒeңBYn1_|Cx륈+:5q0IFp뫧 ,4W/dIX׷P _n\=Xh1R(7`PQ'OALn\!tSjBi:_sa{ Q,c3ߙ7{xvMQ2BH>Y[u)=\4g*_6ֵ< D. H"D. H"D. H"D. H"D. H"$IENDB`muon-v0.4.0/subprojects/meson-docs/docs/markdown/images/gtksample.png0000644000175000017500000001624014737503617025005 0ustar buildbuildPNG  IHDRrsBIT|dtEXtSoftwaregnome-screenshot>2IDATxyxT̒d5," ("R]BqEuA-X*B!( "agr?’ x>H̙gssf""""""""""""""""""""""b0o q@8HHHhx<)!OdLLL䤤 G$""d6$'Ay'!dY²,k֮A|qt:(F""*۶q; P5H`}E@MۃN( 9 un۶-BG"MW+9FU +gpD5C073'EsR"~$ͨߴ;Xщe$Nn:d'!pq<5$ ;en9-c,lɘY31 9_;Ίo=Dwfy wݜ˯ɕ=.Ej=ym6%znF4UZ3\fk֭&iQǦb%B{"YYǽkΧ>ŗ:gd9WMת-y-؍`W>-땝CwgKRٲq >,,+q ]˖>˰ƇJi5t@-ˉq8r$t}hDtgx g pDz_ KHνyN"Qan£iza_n/qEy `؍]>rEbP6r/G/2|jQȺv\ఠK7 e+"f$$d(H "%8qAx,7;w fR͛Q߂ؐI;a}=PN1-H(=ƛ<{3L Aʋ (o@]ϊ]Եi[NY25-rK[p6%ieSQOa0mqk%z$e_#bE;Ne]N}!* ^]?ȳKڰ7C 2% >ņZ뼌a*YEH/rsz ^?>[0%Dc$@>ImX4m=Nԁ`D`H -E̘ISCxU%lyI!; o36bYDO玱]6vEF \VܯbWRon۷qA\*V=]ٓc<Iږx<2~U?_!fWUّq]fU^n >{jKt蔁 p?cRrOb8mA`'kO"3kso8?& IJz&|Ed| ^Î@[qnF 5!W6Sj/2WzkZYWGSΥXqDٵ7vf6f`y~8 Nquƈe=_u՚_W;pv,*g8_?H/a ܒ!"ۇgG+cpTW a{xCڹ 0o>퓙}Hs1vJ?m8;%T:wgoN㢎)ٱ:]С},lw||-),om`!{ z[Q|gqv "zsRy~O(HrWӹv,cŶ{>fUa_vDkl*}ΚB|z}q A%%%B߲߇0W*7NJ+߉=RX^C[ʦv^_Hc./Bs\.0YmM)^|,-Y/,Ĵi,<לּ=hwcU0Y)me32݅ `Ee]FYioCeivx)e6"*ڂSqä( \MjS 6T;.>]$ |NJ\Ncl 5|O 8l?[?]ɏAYC42[U19nCg1l8g.exO =O{)uDq]f9 9^.qGGᦌ ^%;-Ě%OGߠ]n%KwK'cȒMK t߆f1b O-/a O46r8pqښaİ7~s ecVx. |6l<.3u**)"+p~LXu'{u=`y8uv?HSJF ]Wn[,;i9$9 ~|Yyx'O><~Yyt`+2e, GlXmb/r~#EO?PRSv.l""](iw3a{lWt:y)I(c)x%O<ʜ"W/ 6Fyw1Oش'R?Xo.6zvK^Z{r0c4ȥO7/Gne̔YQT6rf0{Cqr}6XDFU|X8ãr"msobN#FǺŃOoBB}ti߶migٍM*aP|G͂uVh9H>Ο8¶x`oOO`Q~8+ WN(I5ξ;wYf~^8nGAL?a) >;o8g$""G>}Yv""bIDD $1$""FPDD !!3/""F 9H6o)!""POhĪCv""bIDD $1$""FPDD AA#(H""bIDD $1$""FPDD AA#(H""bIDD $1$""FPDD AA#(H""bIDD $1$""FPDD AA#(H""bIDD $1$""FPDD AA#(H""bIDD $1$""FPDD AA#(H""bIDD $1$""FPDD AA#(H""bIDD $1$""FPDD AA#(H""bIDD $1$""FPDD AA#(H""bIDD $1$""FPDD AA#(H""bIDD $1$""FPDD AA#(H""bIDD $1$,ɜ9g&X"b,I~Y|dd2캾c)Hb;wπRZ㪲e@󟜟/)vNVzn+aDt[x|޹C~o5!j{iv>oΕ3h(~yn-\yd{zYDZp[Yݻƥw ^{x]ȏm~?=t?ϭOXI.?lHv)]q??FA3?'s>X -ro~À(Pnak3x| M/bcmB X,F>WF{\7fmI&9'ohED(c+Oh_ n:k~g_~)--tjAR*{17k w98}lY8/bRiTV@A~8ZA+1睇+oo!;1WQAE_R^xIKpD>11k>yVuDr6k&0yx>{sz[+j/^%%:&g~exʯ{ުK]# =gБnDWШ(wWa镌"UfGЏ*#-.o}\9'nph F"k CL}vJ^_rwNedX,ٝY=j6n.kڑa-k`_i[q |Moe~4]Sev=1-z>m.p'ߦĂjr?G~JAs?.f[⻷?9ӱtw7wn’I}Nm_ߙ?9w헟Z-kɶ ve!pB{@kaES/wllȧX콷-kxWaǯ>^V+("\E@~ˣۯS\#o~~1}(@G.|ԚwgC$bbPXF|jCrQc!8-S]r| f  V `#jj1s5(K)F5\K^G-JG1ko1xɃ1Ì3<ˬ>"}VZyUWsÎev!N:SO;Kxͷzw|OXG;E-H=jZG$+fD,$#U b曥BeVp)bD+rK-rNS~?Qb{RjQ}nn=ו@T9ṭ׶99}>{vOLȝ=ltQ'֩^N_{o+'X\>wl?tM]}\'x֢]"=gOvKr2w~Fz/>X=sb"nw=2kj(YP=E 9I3O@B#j8i+=(udOc-5(Ň?9E]XdzH UXVVe!5#0-wጻZ y2{1ݶ$l|ʢ3w{۷\LN}[y g7bOҝ#i'C6Vi=ծHi4Gy[PH~i/k.$QR[+;f'֡´I#V}0{.@$'|򦰉MVvpZ,vݻ5wnLղFdƞn\73pܩCG<2&bةRH8A!Cl͓) ދw4ctmwS%pjAM龗ٝbH*ũw"qfEGKa9Uꮍ$`bԐSqXbE.#{s+2t{4BpphlE 1X q-g}m &j!H2 H\ ĩt$,/ed^Wr3>D~>+F/gdn@|'ԹGټ7?!qGv@i^ Y`ڌ.FC$, f Jb8c6XH<h僯 "04ٷ5N(BdzqTlJL}Iut-,7k!{N/X-cXexQѬ$ ##D٠6$V:iIBšUh5ffhMO,YZ1+ם$>mŊЌhz㘝#$BmgH0GaD)0Tz ӥ*A_$]RSv>9%,7\kT.J綫qNt9Ql'a{}xXAFŐ +:gBy'{ZzMŪ,MS>õH #x]2d+"b'͙&S`w#S%кQIbq@Rn,^]Fq(J52I\4q!:*dꐵ'ĸ*Bk7-=lGyEp̻ieO-! (;"8U- C#D 9Ȯk܏;dCawQ)ÓR,F>xutߴܦe/}ΪVSא^XL*-_BCvk#^Ig0k&4U;),5B>B; cBCr3Ar (-ϗ=_K /V@(X!.fvR2pAu fި& v&I_bz!qn0eXkXXmvm/*rX}<'2Ɯ3 MS7$k5涗gG ʘp‹J@kW\X;2u %?ə>#QT (d9FPUK, ߒdȌ*47  H4N([+e1V,+^G!=hAQӜ}AV ́ž= zlA}2ᦦB;( P@02fE@mLnC€*@ʠ*2M  lY=)BbIxq@;P˭DaFPy!(g ZG.@<5lzHdY8bY* +\ gF&VtS-U*jvw^ƠnXja& C j  KѭV#x4D#c<ƴ\.cqB,x7CILLXnTYk cM:U AI=vƔUObڼAQIX] M*)P4`^ܽ3~F!QZ2p55q |^jF.Zˉ Ȅ<*:!f!\cID9>Ee*a "@8(Щ2 WH- I3Ql"z[05'HyA (a2BjO8ho/*Ue(Hm\ QfG FL„Qad /AE%:u JNp+zhdN҂S- 1+1v⚢m0I@!T -/e6y8r声5K8"bH]M]̺0:xj(#{ K!_;oGgcR#u]hPAq"Nq^yYgJǧRҠYQg8a"A ^]A9opi.EaאC/%h`k=$ (3`W`@b]Ǵq"LRLE4Hy A~U}-} 'gg"6KOFQD%I Jlgg+lV%H٠x9Z>ڻWkg@SL}QdDs"D7ĕh AOߞ0t<yWQc"ea K8@-_PHiP[H%z| !Տhi-ĉ*L`}/e,uؗqENpItLAZcDM40'YW{;.I &i"q[ϓ5AG##b:Q^~6@+ko%[lr@-ʚnQ5t6GFWuz zB'H "Qc]R.\. J\0[:tCQ * gy-/8&>ȐH̬rr!=61.D@iu!N*6^#8ўNSw|aqؑ(:R hd6AU + ^YB0RWPI.gbUmJ1<̰SodPNH8c0DgQ#@4Qø(2.0@HpKMd-@ QN VDJGeMwC.eɝ |R+4c" G^P͒!3?y- v0PErt8#3P KPϗg)bs~nTU@.d>QmJBԊ҄TuBGvu-kDyY`N4;ECOOyI' v @F#!!@+'^q$up ȥHB)nOEѹU\&nW{iٰܿ uNYKy*(BŎr(uvu , r.1HD0__v9uIF( FRh9I$*ۦUtp0Qm$:$1iRRDbgT"'[bU֙18 r!'+ @ qx8*P[t@d(0S+wkYNZM=u(#W WuL<,7Sw%Lj 52Qf8XA%a] wK]U3Պ Q:ĤP]˘iY‘) ɇcb &4N!dB؉F\w#Tuh/y9Ur(G$i y# 49ţv=ᴗWS:;@h$,EW1锜^WS ɹfvS`=}Y\ m#n"2$ef w}L!9t ?yt*Ev(a ~lk5D%UCٟ1.*,`Rbd#,Nik3y$WCF1|zeb؄uN3)E?w@![Ƨw4A@ASn̅>t-T ݷ)p'~#GTq<ߙ߉=eщyw&[d veYܮvosx`&A3z{0xH6Hi2xa#t$ p ~B>e} =$4&uX2^A"aJ(W$Tmxy׆F"0dO wN(0@aGaPw ~PoR ʼn+^]:o*Jj)qO!!VFR-}=J]#HFa>1DyQ<^_u^-qyH5sG8E/סвQSyM3/ |߾a&A?Ds-jOWwϊ:iCCPICC profilex}=H@ߦJE+ !Cu *U(BP+`r41$).kŪ "%~Zxpw}wШ2463˯WA@֘,cV_.jb@@$aiOm}(+*9I$~όqX,uljēqU)_yrUkuOpA_^:!EH ]'BΓ>ȥFyl@woĸN/1 vfqy+hӟZlmM.w'C6eW E) ^Z8}ԫ pp({=}տrxbsl iTXtXML:com.adobe.xmp cbKGD pHYs+tIME GW IDATx_lY'o Vlq M5BYQlK֤h[0yt,^#އM-5_fFhPD]Iż\PdHVdI~aƬS眪bWWDDD??U\~i}__>#|G8u>#SNA;;;})):u*4U*[~߰'l8. """"""b MDDDDDD@4i"""""""DDDDDDD DDDDDDD"ud{>@: 7^&""""":A(G޿o駟\Vo۩|Z߽k/@66!acV /GpWMv5\C[GnKqR_(f>/%Υ~(C ~8GMe5~^niJDDDDz\(o J.w7~6lןWKpoi_G~yeYWX޷]N<Q\oUg7yR/y<Fϛnz Pp7撿_THr~~2r-_ߗk>/~r4z%"""O?Efyi_0]3KeG4>/G|| @p~C܆З~5xOJCxk?}d\|o>2ytkK#^<9k̍GjZiP|\E(+G|PUu/̧K߭fRo(Qtbc=ݏkAq:JSeZY1]F%?/K?_O?~sk7D>7m\?^ҵX4_|/q_ @ZQ~!p5G> e!5>Χ&x J-^jJ~-m\DԘzmW\Ǔ c~?oB;^6_Jvhvn=2ca|nlDKuqD:x(P+z? Au>/[)œ>Hz?~EA]W84u7EҐ|z}C?7;'U;[f1& &+[n9ǧBk]^ܰ|~F<+5_R?:~NsR" +x!@cЍG=ȋ&>He zmd9kjy"u.8 v墈ua+|sGbُqe?7AY>H9<|R'x-pĸ:^9)#7gku:;Vu/.Xtv|\+g6|9Vkq__8z^~o~Pa5iQ2szf#w'{G~ď#Țpv?8V_ ac y;6}>>R7m駟BJw!Ż\mJaf?ysC}?"jQ!Ο7gk4NGG}o B9|'Us T⚍G0ITe%cey\|39| IPkWG-Es O;$0G c?{V cogz&1{H~Ķ>J^U)vCFDDDD'".8`Jyj,:u?."ƇYp#$P o~$Ns1YAp'|-ϯJ'F."!P)l[ko~1DY/3/\gGZZVkt4Rsʂ |Rрy|5-[Ⓞ~+S OS!9-ox+,'o> R/[NǧUZm~Ӹ%^?yʹn"""21qz׿uى ȈJjo)|H'KoØCr Q&"""""""&R."\d7}`N H1&""""""b MDDDDDD@4iv}OODDDDDDt{o߾ H1&""""""b MDDDDDD@4i""""""mdd4Q5AU0@DϕiDDDDDD :Ç4i"""""""Cm HU4E\sDDDDDDDU` MDDDDDD@4i"""""""DDDDDDD .Apbx6$40,,˒B%ˡ58G~G`"""fss?8.';9ϤDǨs3D9)dR(+O[+sg!/o-n ÿoE\/^qkO6sxhL08=RQ?Bi ?gY"""16P,&=|O'n@lGh9@Ё"o\8_]\XkK=pX`e}D$""":B Eda  2b+*zVfS8 f =WmY\amOg з7G !54"iPU f]L>-.[jkL]b{A >b^ ߸oğSAE;g[u?~k7ƎVhQeƀe*m=8b_.WRmXO)d XU+tn"HPyZ},[]LJR4DDDDH?`|h ܝB08X 4pBO\!e Nx<bYDfye k* f6Ur#@v-$ll[okq0nX` kgWso7\Қ^LЎa !?n([lmCϏQz_?YDn!X}D|Cf"1 :*^YE~D @O7׬)(u}˟FWjĕ! dR4DDDDMlLYܕAYsK>LIb]ݐQR_Q3+ `mjэ j>4T5ii( q)7b* ͎!̦HEXގ_ ocE7t{}[om-?ڽU%pwlWP+]uΏ׏eJo)u}Fa׶c'ZRB;_-Tqσ__f ak=iEc)#w {뫩WX]pxU HHC)A2s*PuDխ_pc4P?DоW)/M<'Qh{At$2k`H{1~M,iϾH o~s~qS/|,W Y2Me/ ==y~3nR}jK rߟ2Dm;Sl[ $nqk~\Xտ"""fW[D%@K+9#CLԕ0RY67+Vij" nʶϼ\Q d';㣍jD/7ݿYH.E5n+9v7o }lz۷VO/q}U8 *]@bzZ/Ǿ`؟۪__#nXSkؾlpOJHSU^6addDy){C(zLmJ SA |0$""""*ݻw_gΜMDT7M%w'w"""":N )"bZF׈H t?HNv1&""""""b MDDDDDDi""""""9s9"MDDDDDD@4i"""""""DDDDDDD 4i"""""""DDDDDDD H1&"""""""DDDDDDD I -81N#v9R( w|6_{/3UM/<ΨǼf^Њ$ u $pM;|yDba7}6EHQV[ztWdϏމ8?7ԛ:k}GcIw6$ \ڝ_.!EI[&E[19T+ q(!S37 mcV_;׆)ƐQ359D/0(1;.!fW h?hbAT;7ִ֦>'ZL>gYQx,Cl:c{n=Lf}h KLRU H,!ft6wdĞ9ىg1Ȯn[7B,Eگ͜hUꬢA=?0{%'A臷7=_xEx\gwպcfDգE~UZX?9*BI!԰۾E`nc]U?n=i;?;/-DžB}/4fo]aA¹V (+xC[q׺6WeϿ/MHDDtBZ(Ʊ}i(b&veMgy{pu{a/ywI5^+Nl׵&~#ዤG|Aoc꿃 k}gWa6w0?mZ\So~Z[Z(~ V,Ү<o>oa}Tǯb;іۀyZ,6 #rÖ7*_QVz/{҅K}mmd_ߺ!wDE_]@" SH K/9rnBp0 DXDA0-(}V(ITztgإơ_Myvv8{t-2nxmawۛo*p~kߺ|(&m"@M>Q!У?#Ak?#aWX]K^ƫB1ecaH]+*}M>b-pxa2h>sݨ(*_B**h7wЏ<Iw3]cӦWl'f|:Ћw: ?n7꣦.ְg˷XڷV_`1_Fv`'Л|e\~rǧU{~T{_2OY_MNbTm=?[~.LVz4<+ۯ9/(M=@킼< rһgn&b@3:G|b~Wj%+afd62b͆IP Q[QTR (\[Ě5FB:?l/O "Pdcvmb!R8U:Ѕ^e(BŖaxߢ+ ~ol@2Le>o\J}7QS>:Omc)[-jW Vf>&Z VTؿl!m_/vD/b2/F蝐Mt퉈FFFO'*us3)Y$O^DuNOI~'} g9PfܼR&dشHqpPGGDd=*7a |!pe YE_WQ 50g¼VU([4ƥ=ˑBi]:8gqp"Z0kU~;<[k}J&iDRMB$Q,&=@ODDDDt$it%,-Lp:r0c6|;ax%K4k6 "r )u a&rï`2X_ouj_Rյ1~ӃYDR3h \1ݴ){A !սX>Ȅ@0d eT`u`5 h5m P7)v)N[!"""":)3Mm\ NU8_însZ0%HvɈ=#ij6vl߸MHW,߲}UVAwˇ3+8@1YDә ?~CwMC}q^hfgLi~{8Gjx}qyYnUO8S:V}D'|-KDDDD'4nW<B ֌`*4C/҂Th0MϠ6jXgiVtlB̴ó+9La&Ccqn1)qkSsȈn\0Z}zm{hnyoS|b x@,""""c>D+PNb.PUtf'G !k؁i+ߠo>;v޿ =uxIg4IYDR) 7< :QŦ9na{]"KkuSɾ9q4 ?x2+8c92koKW-mc. nCpxUdjY6;XW:m-_#~럵WX RHN R(o+ MͫE)==Ě.d gLA(cw7D_Cr #{r,Z3"͸"Hk)&Ruo2A:ױ9ْ+տj/(޿+h_a~Y_Q;C Do Dh]D6pdI1{cxvA2a*|9+t0U!"WNQ>}f>vs'N(JֲAi=6 'o7 zK*]&Gigzj81' mޕ)cVm-ڇ|9\"Em΅Tó4vs萼{o߾=4QSNM """"":ށ)v#ó}1&""""4w1&""""""b MDDDDDD@"AO1tkl {{{tuY%!"""""B Ao c] B?4U8n8HܱmC@ZYGÁ$Jp8p81r3'wCk.]B @p>(+v=XMDDDDDtt*"^5hua4E,nR'Kh_|Ţ5*EFԍO?>_J~^W]ުjƂ??}m@?^厯?1|81cx ;Gc1b l &0v`tˏUUEb }:y/W~җ;\W q-J2)ڊމؐJG?ׂu+n8@ ,wS_RڒJfvpquGcqё o} \^ lG,$5nU}ڒx|W/tc$#Z>Ccj,$D+uA,?5)h3޷!X}-w|sQ]mf-BbA ~6-ÌQHmkz'd|Sg~v<(m@~R+\QVp(o|cRY9`oCV~/qYw~CDDDDD(ȈS LMFDDDDDt{o߾Fw# i}ADDDDD.dkl)ubcቈHӉS8i""""""": 81Ӈb!bm;{+^߮UXCFtBZ&|Y58_[Lv].6;0N#qc9@%F@Ox}?)(@ӃgDDDDDDdiS0 $6k!nhA3D")%Z:TE'DRQ/<7jy MӇؕ#kSXYE FM7"P%[DRH l-'"""""i5;`-n9-[]G|kgRON`/6!sA(cwzis2\1x2m?g|%;AϤoA gHͷZNDDDDDD#w![ņ=s(YZ"/ze}ʞ """""ݻwxm]eb71&""""""b MDDDDDD@4EB']{=,uq4y5=olDDDDDHkAdZv3փQX4M7 1qàR oFS YGVx7ha҂L<78:CQ38꾻Ɩ O"*p8p8_V_`~|}vE篪}2rQI敒Z9t1 3h+Aʏ$È_QsxN8gˎx R∸2쿆k˴XtHڷט.߆g_ BƖL)M}D;5zjeFtF5.ȰqDݪz_nUݿ#QE!}vW:l߸OT}l_'""""~&+ ~E_<_\(QPG;UqFFFO'Nځퟆ|cCg޽۷oHV }HDDDDDD@4i""""""5e,˒BUjZ|Oai؞hǽ>%U~{̭g>""""cHkf`3;9ǃ@L`;[փQRC4M7 1T!4Mq@f Ԋ(ߪ}Zͽ[?""""Hd=x< "U(YLzD}֯kl D+Á/@oחfQj&\TRyw+Ǧ}'an|51.pZG #!0W:]mv)RHO] ު~Y;M;MԚ.߆g_WJU}D;5:jeFtS}MEu[Xid8nU~Aߪ}_:ȵNCRզQO| -N\p,%lToJ#0<:*4t{;}D'|1l@yH"Pg9 $p*-yL@_>GyxGo(B;-*}VvhGD|[ǟ+7u!#"""":+RGsSv¸?MA{x/kWԴm-95َ6Y*<Dޒ ۛC/<"W~. 鳻jVױene-}!$Zq0ƴH҅g=7uG }ζ +J7=gAW_,lXmń,OD:W=#]5}ߪ}VW2 /؀d˸}ߦC_so׋τOX"gsV˭GDDDDt###ӧOOIa+֟V޽۷oHV }HDDDDDD@4i""""""5ej-;Pk&c=~5TkC""""":A=_ <1#Ҙv~ZfeR4ǫi?2܌+'f"߆fva#IQV08ODDDDDTSWqa:$#ũզn"Te{¾.@ECpc6=aIiWjľRj{%zs? {K2?/M?BZD/揗Lq,tah>3N55}RSM.XyW?5.'.Ed 7u[ D=Lg9F^aYСmq 13ɬ} pO/C侷w6$1 l uh?A hiͣI uW+>b }:RrxG*Gc +n_M'""""iW0"q3J%ABKFY@W,27 65ƅKQoBI\a_ODDDDDTI,ҳ-\AעA(Lp: p#{j'IgZ @1ana} IDAT 'KkKq!,81Sd`^aYva`H}YBĪܕRb6nw07Ubf qE"|׼omYs Z_KLӳkH{4h5n3=]'Л|-׫/tFN^ܸө݄xQtt:{+SڨLpP}:҄@ rqNp~=ml劒Խq;5@i=C$*={x~1qG DĭbAkZ2/F蝐xڭջ_" ?lݺ0+ޞ@Nzh'}!!:a5ٳ Oe M}Z-_㱤ϪVew8HQ>}a46~즹Dj>'"""""ݻwxm]e:c6|&'"""""3{jz5Hg',g"""""""+DDDDDDD NN -HCe?1]cKU֪x{"""""*6Y;~JcvɣZn8H;dce)F0u蹅xg ξ'"""""H%0r@V}m=οJ c NfC3A}Ք_f^^ c\1JBHi+_oAڧu^_\AF,p23O !սX>Ȅ ˰l_up8mgQW20k(Qbiy. 鳻XQӐozCT +J'1*~y}D'|1нA ֌^'\TJ#NxLJ}oQ݌XG[g'm2jp]Xn'6r/?|;gѽ;qiS7iLb3W;5 á /G/^>Ge}^?M7!Io-JR?3DDDDDt|i5Dy GQ׶SbsSkSsȈn\谮 HvɈ=Kh% 紽.ȱ{F˄E Z;$2%]̡- NV5^<jK-_xEX\FH>Us@%%!ջlåN^DDDDDtR]A-ghDwg[ %u 5AwiZy٬E-:Z H >st@XsYZ{o%81.آ}cx7$,!.˘(WՅЊ-$Vk,jshEz29;і(,6#XJDDDDDG46N6V]b142v7mlX.z&Y b͍: 'nX3RXQVƻSbV5˴:by7!, n sD{[Y^DDDDDt4=k,00q{*N /CQXʈg˳x,C]J]rÜAlk >c>"ү8;]c Υ vj`tuWemdpX _5&I,(@:i `dF0o}(*;LE`eDLwS_>/yҮxz//)#5m`ޗ&?|-V3Uz|&L=j!2dYFވC;ARVLހ5TRl@CɛUdAt]givy˙,cPߪeHm&?%6S:7} ;_e߿yDOk_Oԇ+ݙ?X[[r<۷ 9cmm kkk R?~_ V>[V?},_Ͽ0'""""">T$2>D۶)`)L1_l: (HKڱKJ{ٴGwcm1<L0Ou SEX پfikEmV٩㒽~<{_{ {~m~ EE~W#J˟U"""""ޑ:A^xmW+; J y`s, J#^z:IǁnTqZy7}9 z۾a{7foe|/~U ?xs|̨?}H{1by(]Xh8@Ժ\]EԐ5 k3V5'^F5MH,x {V\UH7ؘmoSe㇟qGw}B;Wigԟ>/wnhOX?rHI3ѝ})z]?\%ath0D߬v;ݖvm~w~>sX9#kGAy T{k߽ ѾU b~=C?kaODDDDD_xq Uzm""""""E}>|X/҂NN EDDDDDDt[ܹNt^rԔk"""""")ele6z_ H1ew \_Tz47݊p+˿-;7M\^^:^>Xm@xϫEEhTPH s[]eid^Jf\[om?NߤgH JuM;ͷYuH* W?bRl t~7ٛgi=sW9Fnۨ(eȷ#Ǟ3' ʍ!  X0(%loN}e܌oeqȾ=f6O:6B/;, '8}ҙk՞ܿ#x}[ou*4^o&Sy}u?H' Ե8|,Ce=A^n%C*̛:0ѬGp'ٽe'ZA)^Z x,d0Z];/g2%tU=S>T+-2^,. (9זL=ⴏyIv"\X8>ZDR IlĎ+L;>?iqhyO)8(_w-8-^ 7QkAAZ+\? z0K' n'Jq2mux[Ph EEA#{HQ $ T r0}];&Oiix'4Y? U:Moc~Y?m > =x9H߾D^ܞN3mp҉q(RfvMz9s&~` " ƾڶ87`In$WQ~uW_3,D D{1,1un%oܶ=Bf)ZcΑYEoa_s Y#wf23-:5RƳ^'5_;À0o#3ǿo^,c㳾5aBB:;=Yd_g yͽ>_g㦓wP28i5'Od% J& i9yoKIvywkRw􉎨S-S072u] ZYBwۦd=J]4S_>FjY&f;{'<8îM ]2@a7kugVm=G5!r;6Stg1za/j?iߝ8&.뜐,DW!"x)_mcÂo\^E5Hm&،wv? L:?/z~5RΏ1:yrn2{2;9Hi0@析zj7n;vfͼ~8NIt{J&`Y ^L&r5TfҌ䋤E?;}Nx}vqd?Ywi ?{艏dZ8y8= 0ONИwp̿ӐvlJ wй@7dI$7`D)ތ0 sBl9Ɍ] \jM3?kC=db Wy:x(P $F>=q1*z s3zz˦d=d4H?GfJ]zsú!z8,6m3/Wq|w޳?j 7~bjoB?C+h/~JyP Fg~ݯ>NyB'?>Mv`O|wgY8mv&sy,1!u{<]yI4jU/YoGz9^ |B|=|%vOb9<㞸kgU<ɯD9(hTweTբoEngPn@z.R;`d@dM`wJq.5dqP^1޽@ۮՐ`sY7L?? ʂ緰ׇ+0tQ h,P:] eB|ox*H: xz5=Y5 p&KLw^3C_}&LMC: ΃׿e,YgŷU>_>\#S>Ȫ K|]/MbbbpyO>],޷s.,kYsV>!= "$vPCv_WPB}}7ެtUiiֿ@ll*n9pH|_dB9O;=X#DJ0ך&4-xLO){4ʽɡ-uߌ\t7sn!LԎ t E66L8O%gń?ɦ%XrgoWwޓ{N] KΝ3,:U )ih8mY?럖"h=KZg75^hA?Xj ?x:Q F?G}8>s%!<ٔ|(Fz_+IF ՚kOYxdxgIo>6fo?/r:_]H织]IsS/HFcfY@I'2VMoūF^UcwJkK[Y'4Z0' Ͼ^D+hjYxۻ#go U趏wSYϤ9?=-1Jx=hwHON'k`~3k-zugTZ3Q.plE?o_zt4 ?{ _qU^W+)"2˹/^&swi}_]N8> RAPpPϡw]ffOp6uǾ6'ѧǏBe|f$/5톈-3֭ GN#2F i" 4 '_IDtˋ/۝S]z@ڶ(o(ɮB3Љ$mu-]25<1D I0ۨr1""""""b =:'"""""[ 6i""""""H' 4 _Q; $Q4ШH+*7,gԩ߮EEta{=m%.Oq/bD=?p??7JuM2*C.oA.;7zS * W?`Rl MnO}ӛgi=sW7~!IPE̓& Nte }vȁbSso`+.?Y@W2AA]4 F~A\dHwws,QH>t3MoUHua_ĺj IDATOp7x^3hQ0 P{* 1ꮌj Q`N)6 3 ꕕ?j@JU0a3'Pv@hy  ]"""e½z0KvywiAAꬂ6]A!)La-TFQdJ!2S=ur,i<>%6hMkO&?kGJ_ANXGSyLM۟ؿgmUOKvS_>x4M<7질O&?;9Ŕcg* 7}`PE /MK}'6 XR.T蜡eHm&n &݋7}Ka#ԹuODDD@im]ނ,i$-^>ӟPfԞP%+4 2dYFB?/:T L{nܛB^cnRvx]v%r1#i:b/L20o3x]S;͠dQ%"1؆ffL36}ݿ}YkkkPM؟xo?QţƳ78L<(oMM!:>KLKʦ! 71ؿoRÁmWqlX mYzHx*\tP&dy=ǃ'c:߫\&>7`D)[&R@)÷ U~gCEb8= 0OVuk=fjMs^]eO &w6[ky7x?_~=4(YrD֜?!Pf? qAybFu=V>)VR~ [dJVD@?L U^w#'"""Z;/ U *,C]u!BC/ZXOp׺^bUKވAz8=Gt˟%lp-Q^Cs+}qЋ9w$ث>Wxw8o辥w,cV 4cDT7 $s廃r#~% h#3P,u4KX"""Pk4@byl_puK>7;޺y[cQ]9yL0w0L2Xv& g`G7^zуEhGUoQBMwJPi4K7YxlDDDDDt}7|P| ((6*($0*^t* dY,ˡ dYFްnhpDй@ZR#?8;lmW4568C hGu囟~QO/HN^{kQO'澋aq&m>p>#_Xl""""""?.u]P#u7u?xy˗x .Ϸo o#߽Ua_Gߙ&""""E DHe,#oġxWbgj.2vNP.oAeL2eȻ5TN3(aX"b@7xeL)P?A)alEh:bìyÚ\E-^~J )uUHAk@ɷ+y~ QG=½;)mö_ww~>~+ۆ <@;=y=p)~yx㞈HKu^ S%6Mv;06H.= 4p޳nU /uw5ٴG=,e2:] )5K^AAZ`BkϬ.oѶ oG_~ůNĊgoey=U-Xsైt?qamm kkkih1}~:X'"""""yv(eAA=hp=GyTМ.Zd' 1|z6;ʉu!BPOpo]wCz_x#(>xy_(7|_- XUw8 o,}B%y{ER){61b/n "$$vTC; JsWkl8~ -RkOX?ѝ\S[Ѳkrz0Q-g'>^?=Ώ[x ߽r{:HKz|GukJXa,:?QgKckDDDDDDG|a2!ՙ趺&LW9Oo""""""Os^5DDDDDts0(J & """"""@zw .K)="߁IbFZMDDDDD*ߒvy ,#oX+ *or>unAK\^> """"d3Kww s*]ŧ][VgKXϿkE""""&dg- j$ةhNu=C~mFPnD)w)4j% c,D)U>eylہ6p3a|67|ّ`hۯh*Z0(gf7hm>׫RDݷxh~x,}+h""""1$6S"Z-~@^؀d ԣ-[)6 @3@';8LC 3$vppjy\V>D^~%v%-#n?̢၇i0K{;8 ~^rݓ t=B־ :#y8ao,SS>y_:u'h (AP,ǵ-] OiN\{f89=blcbk,)mGd=ȝ._sx SLa31DJ4qz&;c}i }r@V9to4}~L uYu-눣 rdw/ʶؕ6.ժco}!u !:@-Q^Cs6\jB J y`s,3}&"""" :g-Xj #|X/،!l0hXG!hA{N \FDDDDDtafWw_@mXpp1#ˉaMDDDDDD v]1DDDDDDD H1&""""""b MDDDDDD@H1&""""""b MDDDDDD@4i"""""""b MDDDDDD@4i"""""""DDDDDDD Ѩ)$Q4.W)6h,ntbBz~YT~<~dFw] T 2f0!APP\h'(Źڱ6&W~iBRW?yɮmQޒQ^ꮌeQ0 P?Rl@gA;':;{ !Y6mR WdBI:vЂC|&?_Jm,4 f)7>* IPETm-vnvۃ-vZ4 bJM-E۴@K{9F-{95 (HK!ڶ })=B* ?3,vzNjt4h (x#Q}n[ So3d'z -IKPq/~7 t]Nc$j @DDDDs {#j!2dYFވC;ى**i90F+?S2#̴߭=q^KI*H734%S >Ns 3Ϧ!|A "b,q10}mS2c{DhՄ){c};ghY"R))m;I0jx {Mí<~#U<)Ud8ODDDDK %-7Qb) pN), z:] zLTU.oyNbެ-mpA@]OcJL4U@dV>18ȐʁYu<.Aƅw{{;ȂfJ1BwˏI/cg?㇈ǏÇʸYcKF $vrm2]Uw'|v֏Q@Vu?<0G%g6N;{Yy'?/^`K'o_H1&""""""b MDDDDDD@4i6i"""""""DDDDDDD H1&""""""b & """"""b MDDDDDD@4i"""""""DtE!B",F,+Yh8첔rM3mDDDDD} !n{zA]vy ,#oXl """"yiA)FvlͱNBJ ((6*($oF/մm@ 9~7ag[mQޒ!oѶ+_^>Jd@eȲ}< uЂ[3_uڤdwh,ym'2[~WD~_ '5@e\*iiO*i>""""qnye4ݪaӭ` }Aby/U_8\Zz.Jz T}" UR 4H`䷽}rϪWة\C^lۆ;Ƒ4(e Wm\db䲳oh %rur᧙|Qա[Ct;8DDDDt9=҉uaY[Zf"=`H葉 ;zcj! 7uU_ԪE]~dF^ꮌV?퉕TN3(aX"bZ@9{8@Lw@]VWaF q_) Ғ㸶4St.nU bY;vNj R:ڱkxY7_^;G\^\˟WL U2p\{`9ob)ĩ[(C4\trRC_7JbqtqYpiyĶؕMDDDDÝe9kPZ }7LGz͉j 'IC e9sI7p/RMXY7{]4;KI{ A꧙,6OF y=KX/!Yfs$KkMtV+nqj6Iq-J7Q u.ЅւN,I_ԪiEd]}}!b{6| D l;]Ɩ\㒎,amh Bd'm~{wרּ}˦ HZdwY/ך&D:BBngGAZ8hm,W4ť:\/ܬ~#9C "R jLQVtB/[kI{ hf<8u=ӼŰޱh8}?zm}Pu\gM3|""""L/^o+?{=i@(Qxw܈aFe:#A SX=nCep[Yje@4=C~$F3sol )2Oν¶f`Ry:h>~>,/^j@J0GDDDDDti""""""O1HDDDDDD@4i""""""O5YbFʲXV..Jq7~7MPA@]]~o5s]Q ):ゞYCsۿ]B&SBWկdYFް.ö۸^hDDDDDS܉z]ޒQ^p]X[yzc7ƲsOrODDDD9҂Ήi 4H F~3,T؀tBPn\U?LpV?!YBߞc GtzѬ_t!-H햴zL?EPf¤NIe_&o`dt3MS2%h';W^2˭HҠ]A6PS-3dn_P3< ˩k WL ~oV8AtF~AwTk[ވ?9CL BDtA4 iNo~zESgm_"""""36K޷EG d] }荾o덖;Ã?[AP,ǵA XR:({a;F Bqlּv:kYcWLX0MK&RÎ)L1_l<~ 1fJsY&LıXAKDDDDD"#қd'@f#ռ#XG"$5Y:iӺD,Pz:P.+2a:΃؈Az9zF5aj9l&&R0ĝھDDDDDtsiAHbgO<~:-i>$ 6xh{?9zлq;で`1l@L ,hr !?鑫}>37W@FEab} -(e2cߞ螡eI$e >^*p;Ó= Y-E腭;M梁4Uh`Ri!YɘݾDDDDDP=ң#"{>*mU<)Qp:T-%eH{l1:xpFJ^'(ֿ$=P~Y}mc#^!mH-疷gO<*u>߶8.!Vm1{ -K= ݿGM@NwO^KDDDDD?ŋ]Ч}h&AA]"|o1"""""OǏÇʸnAHb''~m0XG& 85Ms%Ƚѳ?Svu H*wM2̒ """"1uv][MDDDDDDt1&""""""7N*h4οլ_~y#/cu >km }h94g 0YU $ p, '8=섞߶(oɐe%ssTvy ,#oX<ꉈhɁIJ,#7u5cT}xW ևܖ򉈈UuWZfv;0 (x|gWe#|~K9;- Gӫ`E\Y`j_7IGCz(4+aGP=,c]@)f&~^mlEy9Lä(9@L_;9HOU¤JZ|?>N%򖷞=p˔aXN&r]2ydIBfdJNvCOdFfO)64(B?Ȇ,=o ڷH kYp`F<оlYk'Y@N`䇂  e6dnD\_74\t; :B8|AHb=l1 h{); dmڱKJCY;wsx SLa31}DJ }v`O}_m""""ĝF!Y@,1iهPa _sNT5`/ mqtVV|ipé ov`FCס#s',!{]B:4'hZY"b^pl>M\[8xk )¤Ri)Hi\0RH9q)pe@WS`T&@2dI# fyef+zc!Tt!zsᓣڀ}ΞshC2[I8xLP 4R;?ATfkkhʀaVo&|V9H&L;x w)[Ӽo>__J(76U_yEة:w;;u|WTzy ) t(:r*v Î=LFσAAՋg-=N+ɟ+%Iw摚?h/jT@2do^ ^2;-,^i*tbdf^2cfI?ەݺYti&Î~4Գ{Or gԯ3q]Qu8:pe\*:WVSr޿fpz 'GNn_P.o&ϻ$@2?%M^ܧ0ʺUrSyU>Ct#Ko}:>E:_~[oWӖ?E~ڪo˓S!z9w?~<_۫="KS_~}G2ebi7_AtAx nir4)4 H@ A4i@ A4i;Rnxj#>{?}F!]S0$IZ[45QnÐ.xuo]x< Vr5 FY Z؋Ti] Kk߶S) ̍jmOvW>ay 5 ' Z[=;+*4M+'zU'퉘w>iRZ>wYߙӴ% m۰x@7i<;z^o ׵ #;Gn4׆@7z iٙ\ZR3/d&?:km]JW3)$pY+o4߹qK}I /<,P7 jjPoxFc34H+w|w,(߮8wAť*Id)~v"™#'pen4]ιTLA[{?}ioUӵS7֖ӻӡuYjiNyy6gW $d`579ڔl["A*?2Xڐ, "P:l/~Lmik/aѭ+U޺~pGiߎN۾ATH 8,9z3[.{%sr?5qT9žRI%˕*ALQǹ , ^ztmY_\^D{-oBrooYw\;J`S5G9p8hl>@׼x{ޡCuK,7+{}(RPYeTqzs*(1z0nf6KzG:iPǵ/#= w!@Rzj_pd($` :~ bo_uuu3p,0:Jcw69<Zr嵮/+{5'R6 ,pҽzS'a[֩|)xyI#]e;޻qK?lϒknNM [^ɫAHeC>hR[N'{:`3}.i˺eg9zI\ #bFAgQ Jnqr~BO~ ?Rҝ5"?'j)'TPb>ŕ"Lg?wg޾:ok׾W3|P?(7{S(7<9 k3\v'פ~N"ӥY{Xm]4+~>+(:]@ϋYy/N|di-_-N~ o0sNfVnՙB(I=G޼A# \Yg 1X:syJ%)S!pvXQaҎH2ǵ/a8͕3jJNu]Na~F!;;>-!O'׶ ~SA(iif3_ӝ]Hur~fgAkv0aW9`O'_?ȑNo'o<_4uvMlzv!{_ˋ~ArZ)FOCsOགྷ7/a.O,]zCe(yc!HxA0zȵ8 K_.vE7It FG`|Kݫ_JWtau\hC_*ZQ.yrv-TyyF1E7/W?m7_ڝ;V1+ F_-.ض,4MYT\&}s2MsI7c8r}YJ gk}'_k_OYK%Kn ; ҹ2:a(ugZ$, o_] G*ow;pehIoç= Ľ #ì?v%Ia8C?P;`Az{:z3ݿ۠u*.5zI=xz|}4Y-e<{7C W3wFz)97i5wd;_ily7e|v?P&peJ%Uaiye ocyEf|5مyHQQWs@0ae&I'GٲgIAqN7Y⌵|^_3̕o&32^~:{Lg|}5-W]ݺU9 c2HS^ǖ)_ӝSTߚFfe]ƧNG{2;TV8o >7`öo 3+IDAThi7v H@ A H@ A4 H@ A4 OZvgG(7k$)_kFYF6ʍy+g*RnPy5(U{? }#Arq֠u*4e| ճrLӔiy7|P_|Ҟ>/5z'zߜi:m >M 6_/i<;z^o5g/ZφW Da8ͽBMaiVŒn-'2+T|v-^Q+o4߹qK{]HվSWsTӻ>u!z;TV[޹(?Sq.[s3N q7G9LőS*T\r9Q+o׾/5mMYnVvnorxA2 ÁZӖan]ÅQQ!{;O[W+f\F ]3KqNUjTqzWaz}u}ΑFWa{SԖɖ{s*S%@9IӭȣYÎf'Y;6k_GzCY eݛ2a:I|щlwpҽzS'a[֩xŝ#q>i@}+-aue;޻qK?Sìr*kn G0ї vtjֈ鰱EG_ůZ>i͹ A_+f9p~sG~Kcʏq{?yrCN%'2RtFa:liwng-gapZ:}Kʭ::?Q3?Juϑ7/|w:f+laOKw<Ϟ_p)u7gU&X/p-q틻tsLS]׿~XQnκJ,ˠ ï>[|*///~i }߶䯩14IENDB`muon-v0.4.0/subprojects/meson-docs/docs/markdown/images/meson_mac2.png0000755000175000017500000026052614737503617025054 0ustar buildbuildPNG  IHDRUdwU$[zTXtRaw profile type exifxڭivc^a9#/AU,/'J$3;m1jTjn9[[lj]qݤzs)3:qz< {\ wP8w|F w 5cz~G+~e~( .uo?^2\B6z~fc&UQּAXOĿSm/;tyrnt!F}DZ 7?_B +Tr96!p*O^zw/'9S!r>q.W]3 eN.+o~Q?*L7̕ v;[k+<ޗ3en@xvb0.]H.;[/J:# .%!do^3eD$:Ɋ1Q?%VjbJ)I-r)\@PbI%RjiPcM5Rkm7ZnZtԹW+Ï0H#2hOgƙfef_~Lʪ Ŏ;ˮ~N:2^ +g2idRnr)tW3fRWy9dΐY[y3tbjwi]aYfhgz&2m!va<챼2<09lb;k']Fn9tL}ҮN9<@>m3y.~=5 oj~KC%s߯du~11a.+Cm5#fDFsŏ~2Z_ko|~ 2QK.^[0fy h+ۦGL n]¬7u5Bkrǒ;T;9FT)Q84;CF]0):ہ4V [$QTRD1Ž1+AR`jVH&8B`%>LJ{ڻ#֜|bs9rMa鸕=n]gM&[Y3$H c'I%q' ߠVqyO'[B>W̭X-0!/B Il&aҘl'!8AITXP X%fLLNl3m^蚊cLh| Lم9BZt 7.>0X ɱ[Sg$b1Fii@8?6$iXhCO 7js:f>oSoP勧@6wZ_XqRI iӡ|myC`lIw_?!{JF]E_%t½i&PmӄX₲ # bR4; "HP_\ܬQ*hA0g+A߹'"A%/:5r_o&[!DjqH]96AHۤh@b0z ^2:r~JIޝA M#y.{ņ\:X!ZE R@Խ%ņs6ϽEQ3xcO\5܀'wE!WyTcRK|QN&P6B` gé\ ^6]>mZJc`rA@+E`15.a3R<;G%(U+5L()$1z7"ʦ}8ւ/zk HOu-Q~u<H`]r%K㠭Lq```ZReQ dJZ}?mI)c歖QM#by!&R2\&V6"ė ,Xsu ,4,vR=TK 4єH0$xDEs,~`YNZ83,ǚ b*X^2ٵi%f AKaShQJ@2 Kl!Fl$껦;8ɏ>V!躞) )D^ևp$B9뇻&K]܊q"Arl!&hx`$y-hBǏLϭNw @'y7W[5Z4xL}4[綵A4üFϘJY%5 픏+KZ-ce*g㳰 ϱ,g+k$$'RіXt6t6]JOCd1R7TivC琅>Sj)ܯYt\L qz@{RbE&M"RZ8P' 5#aX,L"*| ^`cālF- =B !w1ա$@07uߝSo' YA,=Y7\WpC-t!4-%4z>'-H-끝 L< 4|2}œz<#t-4@lW3C'u4R`V"!6t@:/M ruH =86wxd xZI$ A69|mclpܙ]ZQIAQ($S!P**c=n>#9砩_Hv-U:-H=EmVΚG{!t8]!EViaI#ut$ VhTe\1AlD n,Ĉ!:p,q(S\e6hoLjmQp b%g0}V/GpTRS*בJP[ڠN$k@VN$>}{*YCT䄶gvDe#EYgmUFh{y:ɥ 77 s`Is \G[1F(议y ,/=gQ Fd1NK5L7{L'tEioaZq!GHʣa:(@0b d28ZX*62bM2 ^hHA#a&al7Gʢ$~W?^hAn8A'K:5LDkݍ ϨpZEZ=ұ[B[%lc'L8lApaSZJ`CҤZԈ] .&0k w9ab1.ưݼo`c?HX>+H3?H;0D8MsѲO8\.]BP,6AiV9݈U@\,V 8BҀ[L'lh_j n31E $PtBrK6UĪR`bj%,*@蘵VR7FMpbv 4/A``+SÉFP3A?=XKEɺ0Jwx$0k&P&u r2`Twz@2K+\lFC0aִqiex$_ZҶMF{c (Z=/ŽO=jC7pzBa0Gd8 QY))$ld׫]J~#j rH zjNNK`&d ;B ۍ[ktNGMWϪ\ hTHMPͽlyTgEMOQh~])vaB͞bL*U=k@.uJ&XUwϼ-"ouߜZL!H:6E0{tX L1f Gې{ڊ&Ι5:ut{ڗ@2E|HsY>Zo ŝ3`C-r ZqR ;-KE -CrJ#_nc^*l yҴV تVrZܹ+j%~v+MܤX:œOn:2YgK9*ϊwT,!bmvh7"2wRcm$K!giU .pi>M<|C弑}\fgEl Bc)6 UKK}-#QvZCD&f7X0,4kQ j9vf ؄ ;LB`:Gj{`qlBhau:axAB5EFlVZ!/\$לA[ mA#vdHB:\qmou(czje1@s~߻ uЭ2{!=  ZH#[;x}H%,-Ee AuK3Mb( ωΠ ׮aEu( HP;5#npr*c.W;Q$*t4='K#6z6j9@) V̸%4:NȽA25aüaB 4E BյМJMˬZY]w{OVO%#k$ڐr,#^9t&)ކh3Bu>;ʭ$y)Pޞm t|0<ҹMnDPF"Amn:~aYlڊ>KVO,?F.F nKlφ;Su4 @os3+)N;ܝCW2-9vԁ Hlј8Ytfuxx:\t=Mj:NLiJ` Mw`0hjjMPǽh :t^/# u؅չ$IKl槡E}CؽֱSɁئ+v)5n\3V/>pF&n-?WFh o2ȤMuƭR;@k֩ұٖ= ,_@IIdHлe<8-E|-94Zdis!SJZ*> vJg|}JMίS͏/#+꽊G2֮n Ht=*Z@d歃9^mYD gw%tBTy5ES!Ece+[Nk1y~('m 8r[wC㙎Ԉ-Se0Cշخt%ܙ~eǷJ_B]+ tmqU3O`lUudb# a%O XI=1y䓝qGm8* )l3tboZɩD8K0y:MEҗюs}(`JǷ2uK>]:1"C߷{K_w ^xIq1#| ]֔?Yk_@Qة:܎\.TVxB ybr$ĶegK~6{qmח/т̓vF2hv؇TPPw&Ow~nWc'!"L|xh/}k{zvю8O 𺻑٘:IdȮ]8>*tLaqʭ _>ZQHH\f·"3ݘ]e|߅vg?/nuP}e󏛚:or2H|'_|U|LjbZ.|9sgk}3~/5^2'.=tO4}Mŗ  e.Pxt0)qiN+>xEN71HVJ7O^ }/П/y&4zyR5~}#^_gK>y%)ԯ 녇IO(e7=㸿?%-?F?mtR)Y<G?BOC%~/_tά YGѯoB?]B.qYIr\MhY"Sh&`Rn(UBŲ,eCNE/T!>~*BJ3>GѯB@;pē~SCrRToZB_ }4:OOjӬ?ѯ](O'i7S<ǔRꚫuɔKi: YE1Q-g_7I9[VrbGѯseM;-z'A,B_ }_n4'I?aA>~jQ_@*ez~:h25Gjڒj~ zZhڢ!aj:N/M׏b6RS4{zSmu-ܓT%B,Piu Mw%WD׏ҧI&HkyW!{`fF#Eh`hISSuQh2 SjoZpEZib#T(7OˬKS:/N?Bivob*:dYVV.t:t:ȲrcR%ϦLR txxGٺI0  >,CAEFիWeFV\R@~\%B_ } 'mB W>WOV 51O)Pj=i/ 1MEF~^kkkc:Efԏ9"oJ&7<vww ?];U0l-Tj6@ 8N/>Ki,#˴KL@.?xQ1XM>@GQc0p*>LpADx!,[fd N)!\1LtgOU)i0 [/`0מz^\éE* FESqFj2{{{>79O[á@ oFBuT'C`b}W$2D}C3A#53;w[ S(R@ LL 4 >P"NZܧ1,Fx't>IZk>JHEǏ۸7 @ XfC) j޹q d) 3#KM?RYiܾ}Wqu@0agưƀ,r pm(Yq,?S(bu\ܻ̌wV q+\@ XBp'۸{.aſS@?S @ 9/({{{8oȟ@ ,$Di^%p} Ê.e2\scWLݻx[ނ`06U r!/0 <=3Q,Wp1#aFB HB-wcFB;sT=w4vww׾&q)`D7>Z<EQTt,ShiiwB_t@ S4mna?23*``:\Z@B8oau5Ryȣ( 5c@ su vw1IhTu!-[ Y`Vp~͈ZG"`n-+0dD E,FG:. c r @ V'0D^M_pQģ*әZeu@0 eKYkyhBc $sG 5`io>ŵem9>!N0@i-/@ 0L,*bLo-81ѣ@ H& pq4(`fB Z˧|(e$"0R aJr7+kӲ@ h4rQ%~[⫵Fݎa TU.!: ʗ?9RID=V@ fc2E6yc0pz֡ep Sp&$MDsE̿~c& $@ Mbwwހc}acc--\ht$,?Z9e]B FÂz88ģ&V2snlmmMFpf䄁_ǿ|߀2y2!Gaggg*nk-vvvѣ1JgL~ _ʐ3ADX Ivvv4Slooϟu/p02ЗR*c%6@ 03F"`0`gg9t( G+RRZ#b3!ãGHL¹9G3ZR?u`-Cۖ3aAe8G,9@8<<ݺu =n߾[nmo}n޼znQ)Eʋ&i>E%l^UH + k확!|scµ7o|穙GT|<\&vBy}=uP@ 0vwwds=wl|3xϟ4I :E!%tp_f]NLHP@ ,$ԩ9>[nx;U_Uxꩧp-1y<'}pp~qOtz=@ذ[L)("<֥kP@ VgTU$z׻w#y&n&n޼~xG"\ 677/DJ.hEQDPK`Uqxxxg7nTO=TEWⳟt,p秊>4)Xf(bljz1Kh4:Y2_+M'ux׻ulX#=9 FB`'^b GN`PYO~=ɪۼPU/oܸqM?t7R 8Z*Tdى1J$@ fbRLo3I NLQ:Q9l HM`R)CQS?3_u_7oRZpD.bqXI&2n0Y<E1 V\iǡD$zUŤ#gosf>K E<`Z( `y(\V vT wG bFj` `Qt'3mLn4t)3ȍuVv,`(`l?q J 1(&}ʝ E5DؾDv uuř~޸q__{q qu 0);4JLQCS ,Bܝ'A/)0i2%piwdh}I2Ô ҸvSDB9 oܸQyśL\w"࿦QŇj"3{DwB XWV2@{? mv kMƕ+x:Oɺn9:w= eL*%PDe8eێIxs#(Y@(Z6<<\uǒpPEKhz׳fzS1D?pH(@;fZ %_ XF<ϱ(M@WHz%LU*o ~#ĝV;Cw}]; 5֎Gp-#%:VJ.P~2nGεv;xN$_ X f0Zl]+ /A@Ys-s(p&h_6Hٗ֕)̄`ѰQsv,k?cv`q:ZKѾ"sllmyD,zM&!я~w`a=~ -.3y'WR [[[9ymo |)OW5[aNi:bbH%zpu.:0#0,1^bI!2@֕tovwQE!, zFϜ͛x}'e~w!_7!H`ptըt 0@g w%'.a \1e~\:nnnμn[[[m/r.˾Y7smC2F+^iUTӒed2B4߁~i>.Z饡0Dmt:Nj(ER3#]J.Bwb ``W}ߌΚ#5 $b@RHLA[8?r-l=Hu#,`{D8~3H'gի-rlmQK`Ceѧ@`BSQfGeI"M@PR(yJm㥌㏖$ Ep,ϙ|?ᙀ h_V.@}B+WP@eHX0!D8ZUX#H&Y $HĬ2= ArU`d Rcjy\0@? YUTLE+)'h+np c AT @R o ܬkϣ?bt UJ,^?}?N+f/{F 1:AsR CFD;  k`>*Ɔ t~Ht#nQ+BrT%*im@'J5x|}P"斑ǒYǙX3*Gkߙ-f* t־zۡceY34xvLLELDPX0Yp`0~?Ç)(WF'R !ǣwIgG8C_` |\!hXBqۮ$;Uؼ#+^ѶZJdpBkş%P*P }w=憘 ٘e&"H0s ;;;O+g"`>(]_s^S%? IDAT`g"\ǕE=]ݵQAXYu*"Zc2MeyI@pR o '${R=2*`vb +X;G$ҎA@+:A?} vB4K0TTUf6N- W cLLc_o֖)9˗JxSеF6%f&;!M\g{gS$R [r4}.fs?KcZ_LEi04G'B#0*؋.!BGΝ~s@ ̊ U8 3 ҫU^$+ xtzRdo3z GDt&ZCkyZvH%Fyf~1b}(eÁÅ?s=9Rn^~d4R'k?xT$[[".p\41 Lĉk4n7n`$@FjU$ qwGsW81AP f\1DFՔ*+qFB3p@PG/ I,tTTP{Wh?6OJiZJC#pDR Tf"ol4}Ox %Go~14 (H:n8MR#?N!0->w0-weSV91Kʺ:{Fb**̔Io9tRhaeJ%^]Ď N8k<$ip: y,mC<{bsJD 1,~垚ny" JDSP.p6x]AĐ;iB9tv$ѱǜ 93ԟ#MGQ}1S wu1Tߧ?7F:(UZrZV#TSn_I%z~\&;I3ۖq76/>B9ze)–~&jΣ'̉Rk#~_eL˵~_zLQ9E-,"+ (Nۼxv( ,@!Ċ#zL‡(yχ 71,W㋪4$GxL] P(%˲80[<#D7J]\ G3H-&UL8?S:yUQ3 &tg~nDTX؈PRYJ'NG~>IJ)g" &Q!fHZtA厞|`TpeM!M]$* ~&p5Mȉ%x!ey D{ehȋ2@   Dzw9 L`fD[Ju%R>,O6 eʔhwG $HzYq3`ZnoP,{ª{~EQeLI(@DQW"2Kk 1 f+st](E\ 54jof ' !sR/' m2 aǼd=+ %ETT6t?:oHKU7LyeI% [t׽^_0} uޯ9_ u8H)l^k"U!O'U^zUUXN=%=Jlaw~v𧑈3Ks\g, H?fPSߍ1Py#2wJ)N3Jc;[)-/*Q:^BVu]="&y E%X]3l%"jaCRߋG-ʺ $4:<"XN%CA*Pe߄(` SEj t M~"u l#A4!u2'>$ +pwTᎌBL"qeKz@[XJ9ʺ3.O4c).`y% <#:GM,ϠryW`jH :>CX߇!uKndH߳B4oڢ¶02hDRWЋ"a+ˀevPxYhH8h kc&RF"pi@0y/yQ k,eK7|0;Q`<[G86.[İIesț#3I;ybo$U ȓG/mWO%2h05/R@׃e;8)23HXp1H(BhQE$Q 0#aA讯&taGWO'U[[* t̴T ~,(2ci󩡓($ iQ  =nP7?Ripoo}8Ufq)~D\k2voMY/Miu 1~H'oIOO:2|:3>޸utj!"˲ht& c ޚgtSx:f9=|Y+[|Ο:-PPu!( v =>N1 cB/BVt{= TT\ԤSZ^„(K姵YEFQ @$"AbJ!k4G%Dȳu-Ɲ[Cmb O6_TJ9/`5mNkQ$BM*<.QZDƵ!^ uΏ& A?蘰v & |?z7Gj>@p# ŊJ$x@k-#c30jcq-[mQ_ߥE0B^ 0sL ki"` uCT&gѰ0cRU 'iRwSzym|58/2L 튩2K!.*Y W琑K {?]#V-HfQߔM`B5ond[_ *G .=cuƎcZP1 tL=mz?\8e}O(50:Sхc6NKe$xM)wAR3(" .BNn;U1S,zǷ~=\,'QY&QE':.Mo1S lv MNBtQViG25!kҸJ[=Ҽ4,Or(nꪵ4c:x6> t12%[O)E8EysL5/Mu/HADQY)5q^yRSfU{g9Bo9 ez:Qz1M0VWM:SfY K0)c_K HT R {0ڷz:nwy r;gLl2 =(]k y"HβXFZ(t:Ds }\\3S ɐ/}$B+7) p1¨39 ӊ}VZPmd' ן1^>9K%jm"B&^pNz t2uFbĠ<ޒ* kmtF!aU=^{pI\)h`&R W/3ٚɦH 4*U;-1Χ` 9(piw> kF 0Y2&Z2XG~ uk\݂aȽ{o9{80%2.s]3)!B#382)8QTY _Bi2x,8'Ļ$yrlmEϑe~ŝO+app+JO wpo" 4JHz&09Â^4?*O[TU<_H~rb[1읟j|Ff*,>s$!gT.S8_:}Dzđe2QUHdE*|̂`R k-Fyz&{"̭ʈ 5#Xk e ȓ' ^[5kw¿Qq_ͷ@5ト_5/WH)AVRN1HӚ6G~1U&i,,~#кzQbv,gL^֟gTy.YU0} CdYbɱpP,5E^8'OZ> VvPFƿH#Sq=p4eq,Nho/?G֟ tמ)`o~5kn@cuꗣ&1 ( AR-uT4 Uyf]h4ʗa824err \ g$!8&N*vG ]فSh@+-#d "D;Ƶ+~[~. (s~w7]c.[_F8J:Lc;4n2͵Cm%1Gw֏^ֵ‘ʙk4yVœ0svtu .ɔ.0Q@W˜F1LT|D8(7p!b:@S?&.ԡwC6Y"I8`rz|I cTXyXٺ`0@Kh/L]DsZGQhZΝv3;Ov&yeY^ %WW&Xc ƩqMpTBn0+16*Q#{ヘ;0lbak9Rڙ ּw^T4Diupb~}4>tk>/'cN ڞ/,"}. (fpg+ G%Sա\'()"hUBQNqH#Jo^&ERoOuG  Tc-w1/egSK%./ 9 0Ø?ʞh(O8ڝ{L<5 ٷJ)C*X}ŗ~)Z-c׃R4y%Y=IfŢ+!la&@_C8MΜ&ڐ-"DM(zQ?"Ϗ$3*1݄2.Mcuue=k*7hm z~v }cߨTyyye/9Q? o|ӛcܴ aa1sáa͂?yR1 s8-"@)h8DA.y Cfl8DK3(0<8D׫0۞_=D=& &Ң ]@1)G-% _K:=x,@s4L#MӠ+|[asY]Wڋ;1]̏cr"J9PvޘJMH@$[Nƶ}}vT.ZYNZgnɢh&=3T &IJ&6]I]z4֩F篛VZ 8>=Z =ԆzeT9?NLC)JXL|*Sj0o]7ߝ~бTJ:G^:/)*s"LK2d0Kj8Ȳ v1cq!o]ퟃy0$`5"bݯDc45ચI;h A*8W[P']t@=͘Kxp+GH&=IYW3,s"`hQ @VVZ(HR`Jx套tvZ.p/[* zzMAZoPJ#Lln+S0smϓA4oϻaZr)ԟPdZz/^7$JPGfMKMI9H,i * <.% Y̓ é L.Td\A:R)DŽ #I]־/iGxnN,,B @ɂg4N4 傂*h1"E)\{[0,)G޾eu^׈g?׮''(jNB _ylA SPs^Ę XcZd`Zsn,H:c\C9"nhqq]}z=[-_$ Yѥs]b:َG.r:3(#J"ŵs^K Rv_qvqulm_qG.A1$rUJƖstβ-.#N2r -> Ç.ڭ6Y p$/*RL89͋Dd2]Ϟn.y| 3~I=pqNj1`Ⓘ`a 3#˲8R_)1HqbQ=[. 0G˩.M.)]kg<7H|3_/NkOLG/Df^Lڃʢ/)\h_(aXgҪelzN] Z54(+a:Loǐ%2 tʂe8}yӋ1"r̄6Jkh%O ]WŔ\|TJ b1ƀ@>FR.GȴF^XgamV2]ī4(HȬe,]2m\TuyqWdJ"od hH@>Vw0-T6#^F D+l=5Y*`zG9򢈯Һ"(; $X_BbγⴚK2=E삁2(t昉V!/ tt6xĩʰcruB5^ٰTҢmC&~, 9&j '<9[hsPJ|M/=?cw`xr.b+Era:^3N %Q+ ZA+,8 VarWDi'𰥯g}?h:__|zz ' +#U{PVJ?|gX[[:zva3Ϊ51Ǽ>1&n*3yB>ggݶle:.ڝغ? Be;wY9/K񊐧RV_SȔV( v0 _좇33o5. yW'w2!\Fjh}l c&Sey脊Kft ۷}rV` Y"eHϏz-u;ci,rW B/f/L(`aǝmE &/槡4gīҋ74]O:/lSQtrւ `J}KmaϮ%:>ӳucVsಭtoaR cOkxŻm*-t^ҥK>y$KuJi:Hr9>Tl7Kj߾XeLKТspry@>Ae~.Cu;{Se-,<_e~d^gZ9ܧ>ďLkuI&ȅ _y+G-{ NX恹Y~9&"X*Q" \Px'լE'ϖGYg,y\zr^!4H A@+DD)RېH Jo" 齑ys%$p>۞ݙYlw,6z'w87(֟B&WdY#dqbF*%= JD+ 4j? EƊ h2nIqB޽1ahB1-j<= r8* @&̄BH˽8FaF8t 22=zl޼հǫjb-|~GQQ0prrBN0fxzz֫k׮… F6lxzZZΝ;D$&&"''..󃯯/z__-%%bAwJJq „ YRwݺuCXXI&fJ).)'4ސ0ф}<*pJLFaw)dYR rrMif3gpqqx8rr jغu+>Nyy8yN:3fu.[8qu ??mcضmd˗/`:th=CaϞ=ZutڕWhj { Ǐ 4]D"55ٳFQ «/~gȑ#e|ɜ⚗y=L.[aG+ShjԘj&j敫WIp:LK9vލCWлw:_TT\.q۷oof0ouu lيL>hL?&L3HG^FF:T(⩧:ҥKTC"#nN{f.X߫w/jr'Qb,B.!(/R8b:աv=&n dvwwqr ![c◟DII N<22!oۆ.] fH$Bhhޑ@HNN>Dyyyaʔ)hӦ 222k.>K$*O|||puuEdd$xKzz:n޼ xxx $4{L6۴ w!"?q#F0zX|yd{J'q 077ڵ`Xz5&Mr"šM+7oRx@AA ՟GNn.b1BCCmXECUi 233H\PPE~cbb|# pqqKʐ֖̐[:VCkӆFӆ۷oE)w i߾Aci]quQUU777\h!x(w2 :!d2RPHJKrQe<+W>`ffSk"ě6m½{Hxݺup5lX#((7nI5!9'O敗8}A,cΜ9СV555صk>@,,,0m4SܿJjiiSgZUn뢭OpqͰ @!P(E8,<*˲PR4dSYUn"ãV[AX9xH$TXٳ{7V|A~>>S|cN8Ư _Ʈ]PUUڶ`OHyCtD_`Ϟ=Z=[ J_knݹk.+#8:|`VΚAiӌ}|+b􁽽8())ŭ[ߗ_ox?C)Ρ޽T\``UVa„ &A|T㘓˵ޝ;{vԓ̌Ld%[9cHHO[UU۷c<<$Z]F6 "--Mg_a֬YHII7n܈(//W?{͛jT[Ç a׮rV-ABݻwǮݻQU][G~A/_FQlkrprb!/eR)Kc#//Gvv6fر7n?KNJBUe%,,,qv~b_~ƍ#+5kŋb\8cƌQ7nF x}vj Сޝ;)mFHH>cD"HR[Z ۷/O\=a…@NNKm꿢"*kY,+p*dMƍ%%k?jl 1c o&ڷo;w"33ؼy3룭8F[[ mdBPKԭ # !.,,L *MI$nj?݅3>:5z4~GW,ɐ6m >!999j;v,Uߌ3pEG~Tp%DFF[i 7eL2E{޽\PΚ58ӧOGiUU\(^5bpDW;VݣQ#%%Eouޝ/%%%Է:882`a`ooZ!("*]qd+B6u/;cĉZe B&Cǎd5JCl&4!44ӧO'駟Է†"iyf/-ZDJ񹹺 g;C ١}th߁zocmɯN Ba&!>C AH\`@"N:.]0` 8@KQAg d0ʨÇ#<<cǎʼn'&2.lllqn!9uZ<3wgjn{@(rPfC#%Zʩ9VR SLTe)ܗ{-^ *PlF}Cݻx{t"88m۶O?OȠK$pH8[[ƍ$NǰBBC%kjj'Oj9҄7TT'!@4 kkkJ[w Sڞ3`+0⧟~tq:7|acT[=`^r†"qx!IJJl2"tߧ¾>>psumjcǎRP]DB=۷bn'N$5dffS]eee(++ShYԵ8*4[\\.qVuM5aZ*/zF:]w;gckܾ}RaeѧOJP Uu嶊}b/`aR0 C&"S8q>u݈K QXX<չ3Jl\8۷mC۶mte>q:56ò* ˘iT*X/--ղ̫ b1|ꩧLDCVVXd/='79puuUh+ ?#U0rHxxx 33;%H:|.>|xXC fopwPrr2Qy;z3a.ᕃ$#%Qҽ4Z @ll,K@PJ{_@{;{ J8OOܸ~j1N0J*M amm5dpߊC>|hvwKܪh J\d)\do },5#*ԑFݡ ;;;Q 0xw'N 66L ;11;o֭[DPH ʪ*a/43ө# er4/(P z a.7/YpS+^k&}XΜ9S8bb>uӨ(xHo?}bi&gBxu5A3ܜ2f?]/Q ,OFfqN C;uT%^P((\HZvdL PUx֌ R QQINeܩ FVZڪCZ5t!a- W9N1pP nf*NcKRQ"tpS&$&vӀ1PHJJBݩ"90d(;tl۶ 3f qTDٙUWWf_: D~C e$]=0h B$!::R2z.PjO;t^6pj}4ӗ"77D89_'up^Ć\.W8@*B4sreF85Дv,,Lg 9 7.$$$\ c*M6xG<ݣ&*>3ʁJuYon^]NY[?xP@hxxx_ƀ (&*++/P"""ʺsd2:t@i6)H?֝}6WWYŹ=]3:1Qky3Nc4TF9n>~QԷ~Kqww'F|~֭رcuOɟ< u',,,/*||pvvFII 6mڄt+]q JK8q8Ӈ`͚5)e˖sΈp1}trB^RO͂Z]iܼ\\~ mЋQo={`֬Y$\\\Ln&„򴓦gϸ88bx'W U2Lq7'WAtD1P41>ĪU0{,8::B&ilܸO(q_&U^А+ߟrc̙ C||/0^za۶mDqQXZZbĈABB+uuuEPp8p`,||)/7GΝ;?LMOOOXD$N_;=Ky|dR < =~MGf _ &NHJJ"D _!$8b  080pvvF~~>؃olDy} 6 BgϞ {{{t,B$QjӧO^˲p3Tt3D߸vun]69) 7mS$a/-33!̙Yf%Ob 0 ɯMFJj V*h׮bbbG3at {G8ZrTTm|[nw}xm/gPІK.56(W2mZ&%%ᣏ>`;mpi>}t]"w|7ob+4mU/f1@ݿQ^=d2lVX5G ?M!²K!sQUYIō5 }Hپ}%"W"==52ybexH?,bܹةuNs ?=}O9_r! ^C5A(bܹz(,.]J.RAII ݻ%HXZZ3ЧO0~/ݚr~gތw߅QB P\X믿 ܹs%*[: }OEp(gue駻W&0XOyy**ph׮-ŃpRVxi+`1w\tQ?qnCB(Ď^({Da4pf(bCj4AXb:v ,_'MYDXt)6%-H$BXX֮]{sfpp0/_Ν;jBBBpBtMqW㯚qvvD]Kg?""6l@Ϟ=x(w놯6l@\v$:}XNwd`` "##IC ;wEiU#޽zт6 2fݻw### ,Ɩ[pB{Xz؎AASm!*` 2r6<==/cHpp0VZr^_|ɘ0a-#2]3vL);fChZv- @EP(4NM! 1o1ՔPQQ4 $m"UAUURRRP^^777R(++%\\\ [4 p}+僂 HMMU999Gaa!lmmeo}2Zz Fwwwܿ.] a({G, ٦ <=Aw Br9v:~@iOóvvu` \ꨆC%89FR|pRY֢Q0 GGh0|]_o.I8(j /Tb&0~DV*i+ݦɕאsLtF&0A"cܓ ~1tOzDYعs;W8( Ix <:[U?&ҘֵL` P~1,e-BL֐ˉmelqLc~I{O-}u ml)$ACe0)`YV\Dy&U5u 暧΄n/, ]d2 B`ȤR%76|1aյ Z3iΖ3]\Ӭ5h<G8?90,& [ҍhA~*ȼ0 M? im6 ;QAd2ò rB P#+NtZۊkn11lӊaPs'2P PV΂e]0 ɛo6}3M`piK.wo)"r9^Φ9k'ZFGL.#;Ns(VAq?}oO&hIcrE0曰2ѣ{. 2t.)] _AAxuH >SLiTm۾ݷ;w4~ƀܼ<\r)))HKKq !7θhc&nļ{ۜQ^2ɰ NfB!jRQPBh[4x2{3(,,$W&L/pDDX5)? 8u4^k$aB'O$Cg IDATkjjpE <۷j*S+@N=|yDz4=J9Faw)dYR \Ni{$I9՜wBpR0u?6dkG1А*'F]۶mm6"Hp B*ǜ66qҕ6N.U8S1Z4ZiH2$LpO3_AA:mN:OOOKrrsqq QTSx̼ IIIT=ǏG^`y 6[[ k92J6`YB*EA-bZ]h#u* mf$  AԆWKZi<<=Y1q fDƎQg?[dZÄ4*)e9K.+l&XEuM51`rnFJ\rYYx!lmmH~F||I T$%%+ڴiUT*EJJ X>>>󃻻;12f}bz_?\UƐ!C0e^Yȑ#عs'P̚=6|ۇJۮ][,]T)`߾}z'1gtA'a\by߇`ѢEppp;;w7oTTfΜ ssse鉅 KXӪkԨQXd 9I~wŭ[#//Ok^^h:7"::-ϟ;l1cd99sh(kM}1&'( UHc ʝv=ѣغu+ Aq_~ݻc8q*ٳعsV|QQ/^hSN>>\gΝ|2o±c7n`˖-U+Wvk?-/N >3*Vؽk7kcH*7';.DzZvݍYBæmBEyAy9̟7_m .sCvV47o3ENN.IEEXx AUUֻL^Sc|r4!"9`*\.L*պH?%sOW.G#F@$… ꫯǣЬPN3""SLD";wn:Fֿ;!/cܸq5kbty 2>YŊ+޽{ڵk(++5^ J}9ܽ{s!~~4Ex t(..&o½ , ".. , c.;;G tңo߯=쌕+WB" //sEnnnP\vjI5>#b[~ڂ+//KG###1{lD"\z6llb4O4A1B{pV< Y%We+;֭[dWWWիdS qxsT|aID\x? vr"qA 8xQTU!)9Sj?|GDW7'N;3+66/Pnk!v ~aZHJN?xuduӯ?Xpuu!+N:`ѢEj{YH$BBBh9"_>sxGR_Hh(F}4/\x0'kkkL6FG4^~ 8N׿?ݫF/Z'xy!0()LԴ4[(⃹s -ֽ;\D5cxC03fmW'@2 1M8# =#•;)b`ccܸqeddԦѠ{e>{c $B=|{{{dSiލ%Suqq_$dffʌ {v.D}3`4}u2 ͮ]Z-Cǎ@<)tOa߾Zf +??J_Dq8;#55Jl蓆@uu5p} $]\?_-5%t Խl18- 9i'&\.WxĬc7`P?6RӃWk u~/o/R9(;"??Ǭ,deemVia{{{^P7*VΰVBF3 ;QXP;%9!!87V!>߻Oxi/y D]*TiocѢEZ11CX5T9YY?ԶIc3ckyiZBll bcci|81LOqR EEŰӢGff4Mc X*(IƮ]pQ#4Iuj.tQZQ\H3336F *K2 @Ue'hƛ tʊJ24OZ BpjG*! @;FonaҲ2RnL?ΌB;]eUozkWFﳳ5S[K+K((7Zw%^=PElV^̈́5-?[ƹs(&"|w(--믿lUU\ƃ匐~،3v:(**w}R3o hRVZ8-kPOɎ8̛;:N9ukٮŢTYBBq%g\>Tf\|-[Ν;#f4Uw48ܺ}Kz\s*.6UUıq%^.(//'UyƐ!C R5z<֗js sF{Ǥ :TDFFC( CiZǏsQx1-cM$\vJӧ34֊J$$Yk< v?SQ„ U28dj H<$I_|3g",, w_SѱCC,]&GC yqQ{w~ ;w@T]r~TL{֍E™gw+NO%K1p@ҥK }C;bbboQi}X䅅r*̞=d8x vMϒAT7ow`ذa 8{,}ԩ3GN /eqAߟzWU]+V`_q]|M\ g2% Z Hd"*\XX}W^'G"|ԣCB"q`8swb`כ1bѣ8Vl5>%&: !QTTף9iX[\ 2 T`,̜,X@(((ҥxӚaaY[}M7!$OH |y;vtիaii kkk-^^^ֽ{l&߾% >?P~)V^ݻУh6R]"..kHrreYd*{͛ј8H1IN:w^~+o}DA PKv؁ʷmV|w8Nko@$Vo :NBާ]#(vDAbk- My @ll,Znݻ#<1u3x >Cý{a}<9+ 0c 0]DKDב#ȑ?xGDD`k׳ޚ;Qi1q$boLOڕM RL uc냏>Z2ENQzW{wƌS iջ7WQ^\*K,=;(@^nU#,YJV͇Xg={c81<R7WI&㛪 K.^MFBTT}.׽{wL0 Չ+SVVF+ڶm,.]y,M k++'A\l,nFGZ ?*ڴiݻ7W^^^rY%Kz)˷s=$YViSʚoiqq}reGyg:zۇ@(4;mƓ89 7Yuk~?>յ`Fu8Z߾ |Gԩ/Ƈ~]XݟEA!❜ΌwЫw/XAѣGrG$aȑشi+f[9|qߨ~p,E"97m+T#.YR|0fh7s&X#hС/_j\cҤW1|~ +бc'  | L8I+@ ĂbȐ/</ U @Hmll1yk0,ZHy/^ Rb̛7wbnݺcÆٕPo;FՍ 3z hFMzXi0m4B(-)Uru _m@dHXY[0j([nFgMA:gߟ1cZﭬ1h`,^ffzǑfXw酮g=z4b1?...:Ƒv]Tٯ oh^+3x{{s*?|@1V4%#;;eee^:駟"88ё=ヨTleYH$mրKKK333ގXPRRL41&,{b'(~&h1cCթ$ ydr&Lxre4 ȕ U?͡~4t4DwL`&>&PðDV5TKsO6P^^N> tҥIbhI^.իW}ٹY1ih3Bl&6&0`㠠oRJl2eJʸs?N:uB߾}[]l߶ۻ;w=u -- !$$'N4\#0ٱc|MXYY5ʸlξnSXXݻw3&L q56Aj+}&1sAN>]ga"55'O$a@* oŋ1x`*۷j*S񕕕F(v$Ϝ9B0XZZ5J)8}@gZl_^f$Ʒ(v49L/[j)눰0*؍t8p===1zhqӶ];$.8$DkT 5u>W8gYSJj**cǎ*ik<˵)hpr&DMr98ӶPT&{22M9tGrr2 ӓJSPP$HWWWiPRRĝ;wpmXXXDTeee{V~>ARRJKKvA,׉ʕ+Bii)b1@^U>n(YZR׮HHH CCCaee!%%.Kׯ]b,PbDGG#;;EXX VW_EpE||}L Tde35b:tc˖-$]>*_99V)/ ސ̧=k?VdzUu֭_lQڹsvhZDiYa\:6oBNn(Eӂu}}V~Ҵ#z?)LҚ"s ~;...}a׮]qvoQp9O?ѢVKkW_a'TP;>ށ~=ڌ<';?$a'Ъi񳮪ƺu둝cTii)maF^|g=W={./˹#G1cL 5Xf ZJQdp燨h Q(FTt4ؤ@Y4:: ;rh$>>3gDxx8wOVc͚5(--UVVb܈ |#سgh`A*Fkע'&M1cՅ?>EJŋhjjKII6sal߾]3f`ܽf^W^5SyamRC]p/_~iU.^$ن|ǎ~s@Va{.x8:Iq]l˘/J@;ƀ5Zɢs9sꊣGwށ,=>>>8{,z-qHHHaL^7ЩA 3Fcww7<#:t(|||P__KҹHBoak]uJIr< pL.Ǹ1z̮YjכV!Cd‹Vb99(~+sSOq[Go\uVNN***:cꩧw5UK,0sLw}R<CaZ C L&CTTVZ?+6Q/yApb5ٖ /s'ON4锔sߩitǏ\Wpc#gCҥVd} ]Fq3,rO<<<48uE a ARa xlRA)LFLHaݺu1cWWW^o:H3A!L#ѶwDtT4\]\F fyfreAZXX $탑7D}QR\"x ץ:~s֜ -9ZzDpHЂ? xNAA)S`MK޽Z-:7ߌxg~Dݻv臘 ~_t11ɓ'aǎo;1<JJEY(I#{:[#^**ZB\\,Ν3իY5aIeoM<:G~Wꫯr .^m}6#n֢ y(L.Hw: bl bQYxy{._,H TB}A #ER)l[L\`-K@*465sϩ[ZDiu:i uqu3&O|S _c/<mTW[̌ {yzb\8}ր2<cf\Fsr de]}9ſŮ({CUU{{  fͣr[f!vtDFf&.deK>3ϟGZz:ء02ST55,LC9֗pSZ-֭_ٳg~-xA|.H|&\\]2.?@Ee b|h3{#4,q1c Xb7`מy~zum>3L4 >>>lf 6&Yx.,4xޏ>:třچF^g涆A###CCCS6H 6r@S\;e6RgtD8njR V:u{cWXbLhUDKkw/5=6'T;wd]2rAVvͲ#MO?I>zh`-psQյwbqM0wAV+8y3|Y6l>3x饗Шfjv뒴PE}/x(3eߖ< CZǗ{9C \j*nf{̄U2jVh3sfX`ٲ-NDYa+iGƂXB35kE0~ ֯[aC,4:֬-'3㩌aDz`|<ֽ[0nX0a^yiB|}䲥 ]U?㩭>|"EV:$v] h^}&h{:N``r !!:\6oIRYm o3Z3}drxݞ Ggkym|^^XF5 oox{X|bs]k0 [mÌL 1;Xd&QI@-\jTђ#&}=6wsHJGE#'AQPRtRƝ4Y$ b)3@aF47r[D}cǍo%QgL)tZS CiDEM;%T^b^ 9sM߼T2G_nXj>%ڳSPO,h.]縮x{{t:xxxPb1#//sE@@ Ckk+nVvk};*=aaa=_)5UtMA{;6,.$''D^A~\L4n67eeeϐ5 IDAT:twC||<DEEQ"rTVVÏwpyoF kĈݮ\׷GOO.{&Xka֭8{.U2=7;3/_R)zܹsۢjKKǹt,{Q$&&Rہ;wӘ5knSnEXAɓ'9:}T :ѝ^r] `֭P(ץk/mGx\>>psuEXdS#Mb4d{Aޣ@{^d2ɜws"EWw X$&&bȑHII#GgS|rZ3$||tRC.#//|˱m6l8|||.lEGUu5HNJo{MMM䑗zˆ 73tHgd)GuUCuքe T(mn,δCf){BNzåڕf~ Noi8},'kVCfΘ5 ưD|$gd7СC Rno&iÇKt:]>ߑz:>A|tL1)J3uy4,/{?bU|+:J>V 6#V,4,f˩%~آ5쮿5XJECDa}+Ɗ+Ǐnn3gfϞr޽RSAcɸEiZ|8u!6l~%K.ȑ#HKKCUM <9s{Oww|b ܌Դ4eK1qD.رcxo[ڐu"6nS˟864ԣ.GJYiMi_-;a㛂UÇKΨt0u add$2_%YmS G-[.Am}=22qI3NJJQޑVۆ8wJYٳgPUS*?ac#Wn{F?A8h/ clzs# `CȺx YWcc#בamm{:=A \ (II19@SSVZ: \Ň},^f`SF#ˆk8o)5 77Vf{JQ1###WEh~Y&8qNݻEEEX;w| J%I$NCRرcؽ{7l2#wD͛yIf )̖Yo 'N@uMr:ֆ_;̙c$CrS˟0S{Pxϟ7bC.Ƹqq|egx2g!>.-Bdd$G܌o#pĉɆK4 siYpB,!{nΐx1rH477r|k7o=cY{i cYveL3ibf͚R OOO,]Kk\;rx)6 :'_֮q㸼fΜ-aG J/"bbb 0h X.*vdpӢ nnnظq#rix?ᱥO>CYYݴszK,/ʕ+aYj)ZyA|]d2dVXaꋊ:αc^Xr%0 rJx{y  =zp!G+W",, rի KXycƍ7n:Yc=___c̙{zؒ%Kr aX̟O4p]N(ݢ[… lG5tPKJ%͛gy O={'@焄 P*"ilBCCڡD6.*a x{y`xt &&.0f)rL0 v¢EAp~}::k*Oয়~ #GĴi0vS b=%؆k2І~¸|j=;F)O //m&Mn߾~~>m]N\.P{޶3vBwM u7رcضm;V" =odvя!4& xKL* 2C ܹsO֓ۖ1a17ވF5kP\|OOO(JYً6Ԯ\@63r$7ww1 8v;R$N\ebZ_וD oXtpx7iZ~gSRBR%SObݳ&U^MkkԱ5BqE-T7l@rr2Ǐ'0a-[fSޏ;m`S*IOqMa+ :Vaƈ ֠T( m.̌6nȣIMEd-[%ڦZFeU5"@'5=KST\cN&W=_|>*Xyqqt)6C_6"PXx'N_o\ v-266rTj 8P 3fЦ #;;;v=RS8ElR5 ...:]ULL4 `=֋]dK  FٵrMIF!Q j-)HRِ/b8sb҃RZ8f~(U*$N)Sp|'9GjTl:,^yEz=dfFhu읨hbl^l`H)M[dgx L< C[I;Ic7nh;1NSSf=_5KkQ|_oGXh4Q^qǎMMM6cժOLZE%سw*}(,1ka=:q6 >?~ mm4 7oK/Bzz 0>jh#{]N<N+XG8q$M[F (-3gN>ޞӧ ##]a lKJfF{ d~rHׄ P-_xh ] ;;)1tP+PWrrs%7 rVp2&HO5)8uǏIRKɢ---8s47l£ xg վ-DEr.^[__tdg_L6yCp6G%9<>r֦íK0n{9s`ǎDqq o>I׏BxKz~G0eJ3g9?\Ow}S؝kuR0ΪYy_vDDDeǥl|uvi̘1\>#puQVV.x///v%- uuɞL& wy!}ƎˮbΝh4ߏǦoe<%\Fa{?KDԅ]{{ô4;b]y=#Cr .8x \]]8#GsVۆw7x埙={>:: ˖=m۶̙8s,|}Q[k1gmLk׮Ecc3~~\]U @1XriPc?Kǟ?#...ZjI'dmtT4-} ߎ3gRp2xW;'@7Νl^z~>hiiElkN|\<~A|=zG'~AvV n'Ѵ't3f4't)S~bE.!!xg򤉂ic[K=֞]O8\ȺhPա5^ooТi_6SY;]KCbxo{,9sJQ /yQhkkCqI) 4$ I)Sp9,^ BwU%XEUֽc q}| ɧ鎆F,Bp@Ν3ɕb,^ " 4jI? 8DG;7 *2=SL5uT̾uMj;@`8')) K/BdD8Gg@EUۢgi__DoZG}7y55sޙ8q"_|}ؙ+(.)M <[gŤ ﵨKwC3$n1 `.K,\ ~AٱoM.䪁&S-ycڵ;f4\]T ;nr#6P{+10񱄟mk{ L#88]mmm(++CPPņi>jiiiAqq1*++Auu5 @Add c{`w=`r(ֆ3 ׮]CHH]Gczag:tf#X*nL'c=GQ=]\.2& i9 L׷g'X6`İC!YIB cd=eO2cr °IIVFv*NTnzmyW&gӳ?h *4} MMM!~;nwpQ)ׯZr~rr9`c ?XX Smp^eShzdGALSO-sA`ؙ -" IDAT3A 3=:659(b )m#}'aL+ 1N_lis2Om}M{ AL9PJ+52hM@Zof "q;C†lPCGP*I/61J>Ƙ۴QPP٢pn#]$ 56h .!A0U}',o㊵cNm  FQ!Bh j"`Dqq1.\RDDD8tHNN7wju");CS G LL9L[<;;dfh3 <ʴ{hllֶ6(J4㉻ۭ,m-Qtw:L}Ke!aկ!ӗ7566x&Lؿ>ARr,h3ϠOa7-+Ƴ>ÇhVkp׼9gZ/HOOGNn> >.Æ ìYDayX8~8pQ)0g̞=ؽ{73|}0yd}vױO?2 66s!Cl7@II ~a9_SS_~zjpiϟ^,:JYxVk0CơCcĈ_hzc(46x.XaV+A>=!hhlkjnq|.*.!>@yy@aif#rr󑓛tryعEE%}M 74`LV[׀N Uαc Gz ;'6_qƉ sq6%7󌉔s.5MIٳEiq>\>Re끜[nEvv.~O,èQVo#?ۘzڵqc=@aǎ())W_}%0rH:u)))ƄQFu,xX^^70-B~-[7oڵk{v[(:K|8IxÇ؉Çbҥ J%t:OoN xxx`ԩ>3NN> N's5kJ%<==ǝwގcB.> ;#s^ǒ%Kc`ʕ 0׮Ui8PSS&!0,V5^1e!9r+W",, rի{j&¿ qQEHaۚ0z\ʌ;>`:ÁˮsϘ1Cοci]|?,,١w; &L@BB\]]tF~q%#4}… <5f@VVv-|||eqqxiѠ_0,M"ޏ;NR.rs T(iQQpuQrsrwSII1϶ p?M;-sLp)zI?K+Ca~vWt/'턼<$=r9<ЄDFF ҽ-~ORj/:;:?#Μ9˗]QFa߾1cٳѣGCPsHIIСC.qyO\,R<\¾~^^Izbzn{P7d2Lɘ`~Lf=q~I^ةtRai ,M̼4F5k֠K󆧧'J%/KE$9f22M 3go8 ,eLe1aiMQ2p#1;ZOT[1Pڦ8}8ɧ='uI1:C$8!z=jj=0FmwSO=k7ccUUBٵr XJEArqc>".8\^n NS)S܂<wd^8tkh׍z^ãNξ}Y'nÊZMV~yֿ!8( rR,%a1 n|%#0(^rySY&E}$--BŬ.>5N>Bddtz+M'spve}[7gC00ON2CaJىw}s&we40jEgGDDJHw|p~eSϊ O1ec /aΝh4ܠjX?Q]]ͽG}6lvPAt6V'v~1&a%eee@z)v sᥗ^BMm=֭Ct 7}]Ǒ#Gb_Y oO@Ӫ-6曱ݒ3<؀X|㢫Ģ-Į{qQ:|^o0N0^PV-.eRv6%}FgjsΑ@Ъj6xc.%c((z?lh3&[z k׮Ř#Rp6J1Gb͚5psss(O" {Ӻ;z!i"6&JȉRߏufyp3ƙ O7 S{萔E[X!! <`6q$+bcc{@=tCx ZMiGA S~jG,K[[cu[mkk+JƝ3^PWW702`fB!9Ph/z e(`G1:z!IKAAAAѧA{ )DԴXLR j>J `g&ĦB,BUtw}mtN5>=Ơb l jTP#$1o ߘO]((((⨝PP8b<f&xpȰEVRC8y((:Md)((((i&)(let3tF–iI?]`Lha /PPPPPPPu0vȘZt;=0Ԛ0[ ؤ0@3 lL&.trzYRY~{AOLO~3{ԨՆ1Rᴁ^}W_8VN!6~1m:©ԨIAWco?(3!:5׵LF g7l E1 o0T(QAAAAAчsXPIN[)PÂ}v!< *-H*}OSςc1#T:WS!wIh7# ,I4m ,Z(,%jaTsP]71=TWO)^o1A(ypRPSu!P;qA۪bg&Ѱ!zJ; 9:гETTPPPPPP/"]E9LB)((((ĸ _o2-řPG c=-{9(((((m~*SS^OV(UAA,~NPPPPPη/ZOLo}&dL6' 5: bJ˜,wuȠ能9^Ӈ|M&4hZdU?k ֳ&Ft}y@-^"fLж@`d9(wgӏt!k@V#22]^fTTT۩X:w!aF{U\.GHHEJUף555hmm*j쑯~/_FYYÇL߽x"jkk9Q(0`BCCm7hjjBnn@A@@%n!ic|2\\\0rHJII1*++r1 ///ծeqq]m}$jyyyhhh}:b(.`hh###)y*qܹt099i`rrRՔդn~b-|p1QN \X&1be%hN:)&/GFFrK[kCqO pcC0dc/%S]KI7B!5 P9 i$I S×PX$ZurKd,زe |>dYAh bttӘelٲǏ⢭։'**"(N8icaa333жo kP d}%s ׇ 6sIY-?pvvEgߏ:`hhG}}=Z[[Ԅ12\D:{Á۷bii cccOOOvPU3N{䒗bK]vpP tR8&Ou}``PU7??.\.|> ':b1ϟ-]Á+ 8qDZHEuu2NEt_ܼ͑@!g9#GVr.ĨNqsΔF,c9,:\ktp~ ΪnC 7SD4‘\.dqF/(E㚋i; b޴ip|tiyCw:c;wȑ#F_GV457kX,H+qp$`H+^YYAL omͶkMSs\nx !4{yD8Pm6 h]]8{,bj pH4| |5c=zTodMVH*$U{<lݶUFpyV[`%0v +2zzMPW_}gtlŽ;4KSs3؎'N "meJ2ޝÑ[]6XvG" )vQveݘD8@[["8 H0d#tB.{cVC7o,%&m(%3/[o@1+ 1,og7IL؝kȃi*pVg@z,ZNXLB6ms|DjLtDveJA YԄI,--Gf0ưytvvfH.rk5y 044騪*>ɰZE)(ba;ݘG(qݶ6tttey boc>?]o*BR*p:Sۗtcbb9M}ɲVLOO[: 1a7jP<=f1axRȗƲ̱ٙ8]v#RI,=u$Z;%/5 CL~h&MMM&&ւ`0Gc yɧBW1YKN'ߏP(Q`Ϟ=e^o.|N%!2:::!籴`0ٴbc~oy璿ȯ.Cʯݵ4M~^ j'N'"fgg-KP99&j)6+H0>9/f9V#O[֗zib9ąF]]8.gROaaR7?,ˢ1e8zK6-$ Ӳ$I谘0' AFUH:Rc011!:MI܌;wfQSo4MF}&X^y.-`rasPHL͵ZFSm!#WDIu~yM`RSP Yk/r`ddBbɓ'122":lo*1Xx^ļ.dGFF pfW|-*v8F0rQxFX,;w NP j$ѣ9+J|>_QfeI†xKJ7]c?<aֆpʫ_#`/RA&o,$Ӊ=w MMMػwo|b:Nڵ mmmz@S:mmؽk%#Ң͛-:,${ݻ5gٯ7'*s k4-߁(F!=xeWF8]'6ڵ}]]vޝҙ644`׮]i^oo/zzz,c}mǓ[N'vޝroW!d]]CQ ;O_ ۷iz(w`,$ӟ."]f)sؾmȗltuu;BLiܛ]]}}N)ہtvvZ$I͛!]g^nnteYۅU**a`bcLۻqb1|@U!g9UY%@48,#NYMD r^ "p, de/JOb1b)r( a䳘ͻQ$Ik?R46-/ץ4g#suC?ٳg155Ip饗潁\&L0Hg=? IJ䑒Z`%/$iVpöȽ;XSF$ݺ=)j\!,cnnN%[}\Ge)w`Z4G|Pg¼Uo3(ʷ\Y>^+bآakR ?VwXwO363wӗ2\淗Tdh`x㦽9_&]oW^Y0?7\ƌ@ DM7V;PUUpZ__<-(d"Ir_XewJ`(FѯaϺl̨ hiiIzj|"# 0i}&$VjͫbEjHD nʔD+X{1$e}mR8 -,%Ҫ@wX-?z}1O14dL\?P(.Xgwk_{Y>/Cv $.A1+?!mRʌfu0-Vkë襥qVddZ*|cc V,1*zYwj\h cY&("aҘ2H\&0j ٳ֭y'.jx!bw8~8h5 wޜckI)k'z{{P9C,ǿݍ}sQ/+_Q^7B!BQ,..z?gyyhhh@ZkP__EQ'Lݝ?ho@oo覆'֯Ce3a>NRHGOO6mڄTƍ67~6FG x3,cӦMbp>|ݑ#GDǸgπ.!fVVV022%1=#2|>6mڄzK:AGGFGG-۲e 144de}}}hoo?x衇0= ۽c>oK}E]p8??֏ýދrIqwbp]w_>o=7GQJ|Ÿvӟхˁ~i{ſDȀC'>񉼷я~Gmg?ϣ wy'Xg?Ԡy!Iɡ8yD&^/ك͛7<4 oud<w\5`H|)S)(61]ϝ;g3Fa8qUUvJ(xߝ9sǏ ٳg-#Lw[<}ke)k?x=X{'-Bbx^]wݕ׵}"EHi|>/ʯ<!C#c ΝK=cW~)B~ ԰yq֏ t\.mg1A $Bޞ25sӭp:ȔW\q+Kp!ˈLkk+ۇ/\d8qBq饗K/H$'Nۍ.֭[% KUW wm-Mx^( X\^ݻm8#{߆w^6455nSf}p$R'>7Թw>_Ţ_[kt痖vB ΍CDZl kk H>%" άե!W3t:||ضmEB!ƍ)uvv"bll `po.ⶵaffF;v!.ba$\{2g0>>Ч~?2Ýwމ&؄3~a }O?Ǹ?<݄E72ꫯZFj_G^oG(K/d߉)G}?=ɓ'm>o%Ȳ!|&aQpw?'ةS")7fLp 8[pJb-YJZZZR*S;7g痢(J?xR,:n[98U={w]]>%:$,K/_'Wvlb \s 6u'DPN1_6ڍ7ވ??DWtMϵkɎ]v( ؕ(_Si #lY[-ȉǔ9~C)v䜋)LΗ`7Uc Ym^N'dY)N39I>#x! !bP.,6nXlby}eDk,--!KNyo ߏ@(97`bj&%!y tCډK(2oO;BIĖH$.1:%Ѩ%R]tzhmmtƅ^"TF"1j_ Yjti VyK\sc"/lB>CĪfj-DY#`r΋6Adm^Zqs3cMMMp8~v޽kbB4HUL47cLQjEGT ?|غu+|K/J|~gȈvff&ߝ9s&w}^^ A666f9F믋?p`)iI۷-w,c;}Dw?裸0Xbkt _W,~e?7m|m_zE8o!&XmCNW~YTM'k i(ncd(B-w]#x,طoXSS:;;-VsM˅ܹsB-]]]b1˅z\CQǎ^M C$b9->}pN۱m6vm ExPv Sg۶[y]܍'#Y}qsGw~U<ÕW^i0.sssB^s5x#% %į!c\~7::1(r^VJ+1M$Nttt hGKKkE<$Y33(/۳1~ܹ3m B֋^ÇAOwwΝ;EC=::Çvsǎ5yr ⲔV5/z`$#o(ʪ=)wSCnV}/p4EHw[ja//EH2>ZJ 3:C>bU(~ڊvttt:<>2aGk+u ;X>s' 5n7vڅgϦ[hjj@^!kk͈J/Nv8ut===)+= h^}G'qA9r_gNǃ>xq~r:y4tvCQZ|ꪫp-XνJ|ԖƆK7 Ӊ{NֵO}*eō7EQ3୑߄{-܂_ Pyּ('k@ Mq2$ *r(fw|Wjëitf͵,&]MNNwò\{yǂLhjexcccb.8瘞ʸcm(D(FFFxN%*FFFPWWgԨXVԐ-n7W.H &Y7JUBWnW. TY7c/cc6zW͖>뮻8r$>_(zYgaӦMF.vu8 rQv,-dUR Iw,:`J,UoBTTRXFw<JLq)p:ȇnϺD)íJ P5 k05BL*ڼ []zQ.\ZJ~%^W=7a'=gmsC+݋Ih ,H@T "K0_rΡAejeK|MUH=n݊;6---E\k}5枌W\ d5畔ÜsȒE IrBL$~#,4JZ֦F,^ldX1477S&(y^V-6#_i]U08!Ӓ]JlŔUmV\^A^x> Od]\6-S,؛[\ՠȥFX:&@n*D~<\r_I,=uO8`_Y #jl,_V4m]$(˲4IjK#P 3'Joy*IeiVңZ6ul=g{ n0*j_M53"m0,ܕUIJSyވTk}GuCC(,94#QUy{Z`%GN?Q477EQ I"ဩg a$jL zDmV09s>iFCP/Hڛœ0OG6o!9A5 7B}8o{_nP+oYz 0 6 [=vHHAb^. (MlN6Wx._ NAz-D Bޟw<:aoXҼxp Aĺ3+yW)Vߙre¼Q  BӸA b eQ:d m6:`>/ @9 ueV[pntwǗvh2AEeoa?~9  *g|9_}4ABcH !ⱥ ÀיnxL@4}+cC܂QGr W mKBl|!zQ 0I)n` ܴlXS1Aj *$K[X9=|Knw1[=뀛$>Փ'( V1|'$rPsˠiE+7'>sw|}^y) ,"(5WPL_%pӎĿO?Ɓ{71bOQ&ZDJ aq4<,V RQ8%͛1ehqq̆R.n;#]<D-`3ħ9,MtVA:jӹխr$eYiwPor Yxaa` 4}o5ZPLX=Ġ2Z]}'e_'_}{( 6O~)U7AT= Do$I" =V6) I8C1oeޓcWsМ+A@ᔁ]q\NYn=|Z^7- %3L+:8ryr? ֜G4Ӗw&D(LO8߿`ryǻQk$XFK gQ0.Bq&8<{~߿雀~InoAE&ڽzλD`JqLvEC 3A 1[__|5LQ/9i_yR= 0|gO? 3AԌeI藜 `E(PPj(8?J`p s?+'{L_jkܰ̕ jMS-!9p,fUNyQ8*>0u'LoA7ni"y4?= (Z˓dt;!44OAA>Q<^n!ӃMe?;a2izq]_*3 ((pj ;"`DM~=Lv2Q/  1]Tѕ?I &.JЍkf,KLAH5}8FK ^௟*/K"0|C@QKI6;*jTƇc)AD0FyA$(򸜱JBH/iW5AATH@S%{B>AQ|a !#XNE ,tl5GRn  q&X\/XL*`0J  /(VoO jRTZ1Xi  *BP,'yIPئtKBD/  85AP['_+_ 40VJAAi%'%D|C,JFc$& `kZ"(o$IlaɸFr8ᙤRCA&V7TeʹY(Xz=MX=rI9p" `pA}j^?3@UU0ƠI F%]rK{hQsxK% X\0femMRCCH@唿rt'ŨAÿo;\Mieɖfm/Ή$A_Bvu ΅i|`x7w8AAG>. M4>*0BZ'_k:VGߚ ~UEA<>)wKZHfB 2+-`5S)GwR/  j a:7Faj(B]$Y&*EDivpk 0~ɕ0s#JۙAUihWZκ 8pe C#$iŬ0%J7qC뛕sS5B-J2NwJ0 +S$J% bR%Wi*n%UmVCR|Fp;*c-ȓ9h\":U8WMyAD6kᲺDpKӜ_3Wj(aUw*wD$ɶYL,UYdNB  rS,=y5Q]#h_u-I3e*}A ;ADI4>yIyfM*~ZzAŒH+jU";1h7 NwI$T֌وH~KA6AAe">!,>9 a#"Iqm"IfffcXgˆ5aM09LD:ڜǦM_p+{fhE4aU` &/nMN5ݴ#$& bÑ#Gs0|&KBb  ֹe~5=:g  S$ ,˔AN898Ch xG!I  uc G<Hvw&cxׯ`jz; b!2&ʫB`6y*w&$pq~šu  ֑d?U"b"d&I=AAQx#Vw @% }(,Ixs$I$( F$ Ͻf!4aKnjj"%<:A6©+a,PϿ"|!0Ƅ$3T,]U5#Ǐ# bݐmNAb !I$Y>G 0Iq% zq4 z6ڡ*8d - *T12: YŪ c&˜ CĿCB$\~ex{n!,cjHILP:P2>}( cׯ s} )%H;DW$(qV Yk\veh~Ȳp@4h& c$&(jЧ*"Ceb1ׯP{85.igq(i@`v"K~&Q5 PݝF[[ZZZk;Ҷ S+1hC+%!Jijq00qx$k O6}%}= wRҗ4 T#3L$߿V(sצWOX\\<1>1 I7|"q,3aBItpMZ0LN0p|.օ%u4w"Y\ܝ6&5i^ XQO K?W>J7{vM-8 7یyqճc>4JW#< r ݏ6c9߫GABٔ7X~z48']0l"5q3w`&sqn:|ALghI0HXი<# OR)3?4 6`E;f(]Tq^r==_@!0&`9LGW>77[r13kXgㅍLϴ/xqLDgݮ a:/ hu. sG-ãlA.0))P/Dz:WmIZx=X o,Ѣ܀0LaKtMߋm>\?l 7LHٜ+8$O$u!\?8-] !>: iȚj)lu",0uV)v0;x>MvcRb8EQzxg~xX4@I9nZSR V0d$J.#mEjt qtsAY':P\9Pb"mDE0 `}:K1,j/a!LES-aE.VkP.8pmp GfX+1U_#ïqu0܎v0,ŸwyQu2@ r\R јlyzKdEIy~kGXnr*r#J;Bj8,R6@PʿL0vt:kaٮEdeS 6b#`HO39M&ӌW:1`9&Z=7Ap ?fa;MxT5Kya>C lfljbf׵hPwː$'$>c"fw4-I E5_8fYc0<+8u@bnH5 Q,1#`9zDh1Ir#h\l6(Ĝ.i3|A)K)S3N ksiגugP5 M9";i`Yrq˜@X{ݮ)u^sgӏiql#OgLW5a i3$HLYbL_$B|%$FX1uKч,ǎZүs @xQu!>?,?w"NXsa\L^YrBb.p-̢#dڂ,<|XxNEAr'iVA26 OVSRGmJFv-iН|s[;IENDB`muon-v0.4.0/subprojects/meson-docs/docs/markdown/images/sdltutorial_05.png0000644000175000017500000020100014737503617025656 0ustar buildbuildPNG  IHDRJ CzTXtRaw profile type exifxڭi\c,9^~Y)i,|1!r_ͻ\^_7?|~߿|z;wzik } od5OounaQz?_o0>[q |-}_LKhzO?Fv:)ƓB|)n z7d|N[Lȯ+sVSV礤y?~Cu?i}}ao߻{>7>)澢PgpQy?5l,pyYWmKt≅^ m!څr5j-q43x#i$˘S$ǢkZxύ%~HDIv24Uب%\J+jڪor+ T,[jYcOc鵷n1~VNi׫Jc9c){Z_Vܥd,`{U (:[s7;--LWgߘ˺[CEr3Q,9QZl`7e(J3}F@k$Uܷ2Y 2lrjw i {i`rw<.Y.(VO=5q79e.;,JeM ݦftN8:Qt4_ NՈev"4x_ <%' b̭61 4:&k,t ephЁBBc!.6ŃW*|zD11Ѯ۷hբ;;c)`r.cCtK&\"W^S$ R6Wd9(mD倗*~ 4ѽΐY 2L$D`D_ħHت  }U ] THyBɔڹAcꇢQ@©MPiJK8ڦ._D,u,ڏdL{L$@z>:Np\r8XD6tּIywqϥg="܍|*Y[bFF̌y_UzĦPB_&#»5JEGo!LDblΠvV{VF׶FY$$e#.A(üzq9W]HلM)`##`#>yDٚ%jǚKR :7y[ Q0c3 WJq#rpMIrVF-H5{#記p%H"3 L¬@۰"IҒH.N-06Y"W_]oCl}8>2ר'n 1j5BGF![qvDoI1kw@wrߞY]fu̍+tH<#b#U*2eerh9#qț(:[b3Ն5t\{ٓ\$l Lxt J~d^BHD wh&ʘ8sSgn-5Do@ kߊ6(n64iHJY?$DXI>ey =IO5 KBH2:(kskSAj Ɓ*uQS)ŃFNw| bπFd@ /ZhnpGsL䜍x갋Laîo9-jjT/s*AT*|=|Hy L9áaÑ=,d~mjX ')BJ{H7m9Jgn:p㒑JB h=C֩ ͐"f?L Dόڅ,t}be5҄&E-mF0 AϨщwma2) DJs9吭Fi kfTI5uztZai8Cv7,9 &j1Y6GX!s,#+ki|Uw]D8A\#?Oyt~.̳R&ӖKN!^<@/!6L& sX/'q\ 2HQIDH?Λ7R}xKxZihqSI#&ta:B{kz &"( {4g$dF[#d뎧:ɯ4g@-Xpd#fڡ@t :RHI8:)#늎?) n;J%ܥm Hku EɚӲ:@D8ɇU%t5fNJ0hP sIlqϟ l߽ S;h"$!pvC7Ҳ6%6ujh Vq>|$ѧ@JQ~Ee0r#:~>dUluX:C rTB N7Myea!TQ5Е*EzA$ ? @@Gb|$Jt\BDsX¹;΢AR$Wیa _<%r.ӂȹ"jJ1-[,9n&mt~fҟ^Vs\ׯ}$cлVix:QCw G_͢#@c Wtfifa(ah2sX``waLx/uYkk?wNtXĿi2WOi8~VtE}Qa%V αAuHgwCw]{ht\ Ny0P~pgѝ:cQg%ul8)R$:\ֱ_=FXcË_#jڌ %I\ô߇i`Qsͅ!Ho$u>:fNLT@HDz<5SC#TC>WsC@@q@78"}_C, d>8}kaL>5e;]p:H$3. ,\kV$!gS>-\Q ޸COhH:k^~Hyq)J]rX: Ax lx ՝ꯎZ H̿܎%I_TР,`aEZ@^ G%4OYIa-Gc]GLjaDnۻWm4 (BP%e#p &]'G:lDY+Y]~Dn)87"'dfv툁[w  ?@Qa M_Ljpŗ sb|j ҉% hD.NCj8 zL`jufm#p:6utb|W~o>PNcX .jnX~]Zot`d@diCCPICC profilex}=H@ߦJE+ !Cu *U(BP+`r41$).kŪ "%~Zxpw}wШ2463˯WA@֘,cV_.jb@@$aiOm}(+*9I$~όqX,uljēqU)_yrUkuOpA_^:!EH ]'BΓ>ȥFyl@woĸN/1 vfqy+hӟZlmM.w'C6eW E) ^Z8}ԫ pp({=}տrxbsl iTXtXML:com.adobe.xmp `XIbKGD pHYs+tIME @ IDATx]l׺7O޵"$bq[&R P$;.zQ2Ҩ1xa#a;0/y ,Q/ȒJ +@$(t=(^gb8_d![5kz5ׯ_c{{QUDDDtۿ[_~0g!T4hV?D*ЬnRk @Bm4oPE___? hZ~ՎQx P~@ `BmBvo6PC$^C Tl?hk@l@U9vs8Y}4a[4ohxP 5>|fƇF3Ԧ7ZUޠIߛ_o+ҌЄ&BM IFlGTM;:~`;]h¸ѢjF &4oBo-k!m45+h~jTBq Uh},TeI &@4+?-ۿUhBЯ]sޠhZ~>ME^m @ TVWwBچ&hMvDT9G7 7 1~݈C_./Rs7b[ afU ``@IP!q |w3`"ǒ*"T3U Ta|B NdkjjQ aMzuѴ})~U5ͪٶhPBkP@F3@4CfB*_oOs?,Ecasӈє6$ZMmMomR - uP[1k"m 76bxs *6}؆h7o$ZׯfzPwZ]hoPh)_WLm2/dkcDZO{ DDDDDDDa0MDDDDDD`4i"""""""DDDDDDD JvC}fOLgq}ne"""""@Q~zcC]qώ?Z<B@/nڷBxobuQbawSMx=l;?ޚ -XME )/J;u_Ew@?bQ[Ycڿd9{q}}%""""3P._򗢁ß熞`j%@ oƞ9(> baZ7Xqo$QxXoU,74x~>~~;6{*B] ? O~yn/ڵI??}nޣ!c-ڿd9{t}}%"""2 ;j=,.`ztWo~ܸeJ}wO?裯 q>I:n<9}{#YG,#qrGWCtX-!"""Pf ]S0]jh^K:a-O/KI^ӿ|))}2%r>m qO03/nj)Ҷn:yhKǺc Qn5Xg5I>?4?̧Hfbo)fbk=7fXx1<5.]V잲on3rFD*!t6~zX$>9zR{sV=QKu#+3(],(|8\[~!"""z UU5׃ZsYL⓱)z8 4U<-#lHTTS[qs8ia\|WeoЅHF(_W5 |_qiZ < zے۬E0Ix1Uk#U`{`ZU&iL,]K|^{=!vE*!H]fO?Nn]]v۴uEӐBG٪yoOOcJ}Q2ָ47"4i|} [(],w~/n9Oxz4?`5!4"""Tzn c* EHZ3>sBWobNqL%?Xa( + ps|ejiV>(DvѻR3ɗoi^Zs?ֽ@VgO Sǻ͢p/%Ts}|J}wec?G>*?=E;2J/Q= zTbsE0]82{OT~Bl i#l1l2=Ǎ8"7X=$KZ8˺b<55vIKB2a+7Fu40m_0L.>ž[律?= A:.!_|Lс ?\zz]* bpIܒWOa8z;܅ooi2j]i5IJcɟ;=X:OpnkڱFlz GV4NZfi)ʅn>< QKw'OƠ'ZjOt7>]BXp oZWAk0w;3>l =Dl,?r[jRy}}~+:V'wA =O_FDDDDD ̀ryiW[67za$͏GpcHӿcq|UŢmshqL=#ıEi> HFzrm\룱)#רi@:^yd;U~޲*_NY$Xj`}?_TwpxSvp;лb^;Ujy}~~+;K O̔.)2śDwx,ؘPll?ӟt8iaޑza=>~wOZ T* 9LDDDDDDTe0MDǔz@DDDDjb1&""""""b0MDDDDDD`4i"""""""b0MDDDDDD-OO """"""zz /_L1&""""""b0 p"Nk?QRQؕGB1:~{x h v)i̎k:6;1ߏԴ}skSk?`gd: X^UL'\=OEX~ .`}FT5!?CȪ?)F]F8@ ׂR`1s`om^7ߏ@ \(q""""j@0]6ȏE%٬}sXS#Ȣu{*⩪roDs~KXT\uWV7(f W{tn[:utϩNi;7%߮(N"P,&P<A7FX$&7_JO[Q_';DDDDXi'2p N#s#Ō fۨwȷ{t- rwas+h#LUk#ʷ;6\l"Yw.eW*@{.jN/.#w.FXnqA 9mթ Il"WaD7+sȸ:Z۷=t0vkz~M+s}Q_>2yDDDD>ҥ~/Ҩg',"_U͹6GLCtw.x)L#]jwܣx9dB>/ '5iSU8O4nKš5l) p+LdUm4u5ׯn[]9?:DDDD#pqmƍLP'̴t*#BB܄EjA[D Ȗ=/ڵR{t hG9<|A 62 ȜCW[v-YZc՚om Qti12-Eն8!TDCEFɫqSd|H (c2KA:1wat܍kk3{v+21 ^ȸSwnp!dK 8_br`);OU<C[*?zO{RH*HIs}+[߮),""""RsZwa;իWxe]eSMDDDDDD.c0MDDDDDD`4Ѿ. """""Z>|G`4i"""""""DDDDDDD Li"""""""DDDDDDD L1&"""""""DDDDDDD L1&"""""":ZDn܍m.s rB>9jE<~?(_EjpkG9)w~""""uѰi)vA^OHQgG<C ;`ZHQ3 JW|%egWrݣMG!Y !!Ũ[싎(W=Mah & o?ߩ} v_=߯ZjC~&ʨ>?ѮY"~~\ʃXD'8I,(rX´L;ߏiߞM߯nE7FgӈJd7"[)TOGg1;.gѻE\ XYs(;qpGUbr.Fe}M[]=: `U:_o6wNlU>5q1_TbHX/(R-!\@&"x@4rwd ]ߵU'bOk Gf'ύn- ?a^q:+G\Lb{w!LDDDD62݁vd2./?{B9@X.?νe ts*kԾjencaݝ#eOd[0dŅÕ\`ٻ6vDFʵہP~h$A;:Bϣ@NֵOY"+c"""":p6*i&0]O=9-C)7ۜXk ~hc8CrSQdL'-arE}2 29B&fDlƤWW;Ў6Wܧܦ&pQi"""":8jNjP>H"iK$ cT -1$ww.x)lG)(]o@Q~9?$k[P'rXl/[mp)[XW[w%ܣY̎tV;trH HW\&n$\Kc妣M`9%oPwj_%SoФaDZ _k[P\m8lyFKZc}"db8UdBB{w#汗XT}"6_r""""wTb.dO>= *sr!5L+3{de j ,d\ ZXcLWڷVcQ1oMUiC9=N7h~DRƴZ6 o\X6X㻚NkJ_Uif1yUBq- ;S|""""HNcmtqK*"1THhr`8ЂZ*Y1Jvat܍#TV]IJҞ|; ꧯ>A7"#⃥7 )Hrs-+kE?C[/Z/}}rAz1_8s>2g'翿DDDDt1Ν;/Xj#U'5S?GDDDDDT̫W˺gv/&""""""zW&v%QuL1&""""""Gtr"EHbQېHOoܣHӘuQIOa0.;֟bCjB C.+uN #,+5Yl6;jvz7m%H^=Ҩ}_'s} pcnms1 @DVr"r J׷ A,p M#)(rCߏT[=qCŃs[{ݣ FYDA([,WJ?@ז W;oOGq7Ţ?|Vnuh3U{{k['2p . Nm:^Q@XFa)Y>#{:wT2ZqG Y\kA[Pq"a][ݿG(?CVVH[el+_9HC;zma}S~+6>/\Ҁ'Z_x݀zӸ/Lgb(fh*Đ-K.cʇ&jDls BHyI2,YGcW6'@f!iE[5)ѾJ'@v`nrherdT5ɹ \>?.?Ŗ%\@/yî/ZKElYEPfvgtw'B]jlYةkB HVEsXX"%'GhrVp\]ÖB ?Ld}ݓXAq]=u}hB1r!aڜҋ+Aix"H#|v[{?}CֶpvalUd vvcQ`px/\ɬNcNC\ kxEC*6@hoȴu;WvI&BO哕-OnV~Soj " Ux~lEF8w';10fmm(>_U<C[ʲҷRÊ+Vo;MrZ`\?3e ^;]_"""""Sܹ'-xٟ^$$\KE*^cWTѻիWxe]eS{-#bPTmؑ݁vT>g A&"""""'{َwkU8p,ղo{A=:CA,l """"" }iDDDDDDDoÁM&"""""":LLGgN:,EӘuW9=~O~ި$v{7*9%Ekl}s2I4"/e+ܣd0w~eG07X]ĐT ܝEm>h[ս;]"Xn=p-B.Pڋީ8[i!#`}қU FI뗄p:,W,12' ^iNj B0r#EGdbK?^?m.D"vjrw*._Ӥ=2ێ9o 'tȨe`ۧ W?D07o%(R[FU<֧/[ ^ 䰙Fv \'3g "sݤ.(4b#kqr1sd[тY[ ]xD#,A{p+Gܻe tnaky|ƃaP3st:}rwJx"Z_TJZ?_xJ_n\rب6x;T@Ge*?(P%y e\&_a}U56JyN;֧hsu!$\?P5NSൈ1^ƽtHjVcQ`px/\ImޯUz}-MDDDDD40:OQ LpeJ!-\I9J!nmt:IK7FV-mPA3`Ŏj9^U8!IA;\^022yw5ڹt~;O%'!"""""LLY_Ӵ SY=\JMCcqj t"""""֚MDDDDDD.kTw: v#^`fyp  /^h?3e -LKX5.~0&f^¥ނqo,]m`Z] _k+Z[[qvXڊV./j=Gph}8vB@^8_CUp׊Ve,\%h_UDZrQ˨v)ƏhN9G`r)Җuk3oik#䵏biiզqcec`mNlg+fbQy@DDDDD O+n -v+n #UUArNDVdt]Y=Fw=m!|T}?zӸ uvehN8[FBٳZz^O0npv^Nhg]Fl8t$=`:7} ʂIw:~Ǿŷ]xlnR9cu,t-wG}j?<H_bSKrk4N'Wt|-q}קp>]]oA 4#8N' 6kRel<ÒzɍqYe'(Pk9B*cXG6U9C@v?蹂e1LU_CDDDDDNϰu<>{{Z`6*_Ce3 ..mq]X;!UECr~gNޱHZShijD!ZYc{Wܡ#=UKx2xEsѿȖNH_8bU]³ ?_^U.V>O 1Y,迼קñ [|gW׍TF?DDDDDD2_J:4nOuRW[~A],6,+I镆\1ˇ=Y_It4=ܴ?1 +־bUu WSάBb2H➥*=~ט0ؘzUt_Y[Xhy^|YWTL{ """""z1&Gsqx""""""NW&""""""M4L lQ ELDDDDDDi)F:*XM# e̎V~aمi;UL'2 !2 =f11h}bM#.# CFkʃ](h ch"ېpcn0~v|{֝Q 4 5v@;2FNݣu=:[tuh:d?ܨFoJYE2(N"P,&P<;QJt8P_~w &Ws}Z;Q& N-b)F1cT59r .ja]0 ~-N #,+EiȪ_;"wGl'2p 6>xJ>Q܍ m+q0Y>UWW{ny]F1r:mS'e(PdOjXDlW`dV&qymDV W6s@{-خ+\Zfi^,(Bmx_3 2 pcB QUZlY$_HW=v@;\S#LttЧ6 UU8O{f',"Z De<5ۇkR#+{Sqr8E㶇ZjWgpSHGP"mm'"""""i-;//\9#[eV6G~kLNGQY@mII6:6=襵-( gF,V||ݝB"dIwNDDDDDDgZKKh6YUxXEc,* 9kxE""""":4pm. Rrǝ#QHQ6}[TQGg1;{tȷeGƥ5b[OE ךK+6ouL]7ק^Ohu[~ o\ˎ;bc?q|^KE@$VlavXlM#T`v PO<=EG7hG +uV'a=Ā{UK}`s{:џP0l;jGzS7Aé{߀LNs>h(j,UM|XNka?ƒbYƒG=ڡ|kߩ};g3H w_/""""~!K`d1y2TPxt@ W$;10fO1N6!Kn<_~^&9TkUb o<_EF8 xnf|oG7½S^Z@’J>%T:_\{Z0 QIY1W^\9[|>S/%9/}*Lr p XQxq[֧$./;+_OX"_)HgęR:މ!SܹÞx. 3X?GDDDDDx^|YW}2zwNnhb1&""""""b0MDDDDDD`{ݣHOTr.KVfk}~00 zv3^Z/ί|f@.s9@F48N #,+mg3xQ]upDC^‹  `.`\`7A-X+~k;L2~?0d0Ubbݹo~”Bkk+Z[[5<[~GƷ_;͡Ni}rvX>:UFߵwy]8.Ჯ|761.t>^4Gd+H6)j"T?,fGݶfGݶ}jMbwb째d!KO~/FKrkg.4hm-Lԡ.F#N[zvW]/^my%iсpBf!YqAqK4"kLC~Pq"a]_<,~p*\ST[3sٍa$~sv'84 `dN[/.ߩ}՞uvGx]\70і_Ni i~ =6#\boR9(ox"#|rRK_D`si.tVS)`\`I1u݌_zS>m6*,q/;ؾ*_ ϟu$qGzݘ`Z3ܻU;Ў6Wܦ$jC *tiegnB'FgaUN47h[lSϿgoU lѾ V/Bq[XwG[='1~8tqbCz%aи-?mi?;ŚoPwj_%cƟ` 5h͛9VQܭa0ܱx08ҭ/E պCr6ǶҌr cytZ_ P=Ϡ,%g_6 zw؉3=q ` Dq<0?~Qe躥uvÉNM.9ݮEwڑn(Ld}ݓXAq5YM\S6(݃~N j_r A,ycϞ#8N' ێZׂ}~!l /<B0mxJ ƯV&`=Ab--|ы? SZ/kr {HΏ#p]O?ϰu<̑!jR=}^-AK_6GXGq<Ƣ6YHQCYRTb2 &?"Y@BU AȜ l<[Οg?Y@+jj~r/E-%Z ;msŏ蟿K*Tu 6V轄@BZgg9-@YiDR׀y$u = UrZƠNjnYRpWq!)@FGƑ5TZ s}NQdO_c%(RW_đO?k3('1-Q?k(R-!\@&c/ñ}z?a66 w͟u=ZtmO`IU!fW1uhÝٳ8)S\^Rg]__cFDDDDDPUs]8E2Q0@b~~a#p azJP ʖiD3B_ c=N id[^I m b+_~XBGg[0xi6@,vի8VgG s|t F/u˅@J;6{$KS0E&""""LORxu4ue9>x]M;L!۹BHyI 3m}(UHqeb(fh0ĐɅ`EtXRh讨}kDUf@S1u~Mt|OaZ)\dWׁ[}|Hs:qK[<=cKDRHGܦjv!laͶ٬C-;<B݀Xq-Q܍`TW*;ء}S>HX@BQ0gzꞶa w: ö 8RI0BjA7dDDDDDidUYۂj=n>6 _D  (l~pQgpcBsĥ(RоFYCe3m ̀zG{j Xǣ" ˮb ٍuf%%""""1^yEŃ3;x-Oax BelߞE鲯ZR0\@ns%\KfYY4ҳuAUWhg.jb` JeNW{Hwb/jpAŏ_҈BT5ɓ1,+i+խH<F8F9lqg',")wmyՄ40찬k$wL!9=*Yі cYنf`mpL:`]h7=kfڽj8LKﶄn}Gʶ4߁liޫz/JUC"z?z~(Ar>2`B&B(Ɲϣ HhڏN6ws@nWptb'Y}:5ռGs6o_ >O>9݅Ji_DDDDDDD4/_ŋ㭟v)ͻ@Zc6 fFDDDDDDt\9Rz3ѥ *ëm""""""^c1&""""""|.PHw}gȭL_uQq }0ťqKcxtVrbq[2b22d/ЈRxiL70;s"B8<q0mϙ泚|˻U:j \NgMѐuLm(PŨO?6  ~frkq~>[OnIum2IK*A']F/t[Ғ}nvRiIB^vMPf˺*"83?M!%V[ovZsp8lfX!mnk7';SmL+w$bdd:0wm 022sOZUsg}-PV3Ij#Tc=p|;)?1Dl$@UCԚ'b;kWvPħ P@3?m(P!5 @U`VnI_oLEwuuRcF ~˙[fTkwl75W2۸)D'ۿ`2)A0eQZ`NAmU=/(?rytu%5l38Bxx@V5MzL>\@(hkKUw}}N~7%N6s`2n#\ S|v0nOm";s2G=f{4\~ѫ[ڭ O>9݅Jim""""""A|/^hoKi҂m.""""""i,D'%`f1~MDDDDDDZeU6] L1v{m /-]Il(zKK…Ei?Ɨ8::6G.`cjZ Hi H NrSIIqn=/?az^}ҫq>O[lL RT8_diW9e9Z&d. /6}<ۻ}=^wgh7_F&-sF)]l=1rr {@Պv,S//\[h/n-mMд vj8ׯgy) H||v糎'Oy$"x;v' Vty!es<l =`+Hi@$,%$xS}ݕ·r$A-&2t)D$1S$ya82%PآynGƴOfPQ_z@p~A 1Tp~ۿSвH(^h'>Mev|7z-ci^f]8ׯ+@ P(Y|׌NLD9cPY΃n7S<-HiI$!](z4YBKi4RRc(6~rLQV?.ߘ&Ęܥ|2u{SZiׯKڮjֿ[ul6GG(.{3z֪}onCO-:}suX-k{]%Yˀwg0Rr|s2;.wK*miյl\JM+=D;zoBR ;w'ۯ6A_N1Hx?sE@(=d_qx=?ec[uPw f O;<;d@ G=XV ռ{rHeuzY ;ǙZ1&C?81 `FdNKc dxv,{'WiN7h7w~׽p۟?Pٶ3倭|ڿu~r o ՕXD`dd{vM!S{lnXZqdu>9esgZh`[r "2'gMbCQHm5.^t㽋-7A}w}t:>z|5}+^gF-@} l=H>ߨ8VoVayAyq6٣he@9cN]nG" (2zlWh<{ԏn{~>G|O"P$\xccS4Y7,=VZ?>2і+|;c=bcsow"SbP@^/HOs^.i=FF251Q 75?}87S~CߐF+~i^4w|?qm'>sx|~x~>hU`>0W繧C_k*Q?zʱTw4-(< )}(jhad'ִedY`}sXOZY' PSmQ,(\khYk)pgAp Ơ5RT( doa p;AA8U(Ě~߫tg4Ux>h3捛\_ ן"ʩBQ o?zm!_V|Ske~r|GP7NWccNz!jPQ:]{Yv8\`8ڸS %肔F>_pM{C]A[SMWӟ]]v6*#WP@̠oAQIGXF*eߧ;ݚve\đ\m Z1ΉǠǷst~pR q9kh;γc^DC^ø.k?bv{k@Pߗ#@7h|ýq<(Ta HG3z0洎{^T( hbyyqi'>;7|Jx!Ccך;̜]g2i9;<(g};3߄9z~Ft Ӿͪ'Taܸ~nٞ!SOI Ӵ=|SCZS̫ $"RN{=a` }` }@yVb gaϿezYҝ_EU=D Ǟ@<6It#86KAڋh.h^ ,WDYaeS){] ObݽoVK=sϧ!Cn!r hp~i0ې-û-ih}iZk2QwHiñq^@n!-yg2 ubF~ì{Ls_B&|ʞ;k/&zϳ>i EdU+%Aq,f^ d#qL-AC\_)NrP2RP:?~9q=|)˻d[qo[?Ւ%a'iο֛O1[*Q?Ɲnxe^d} z|s0SNt Eg6Ju}ӱ\^ |^o3)KwkGq۾o}yiIxpk{_uyO|@Opp%NzQ?mȞWA~Vif'%mi6՟>:'KxbyۍѼ΁Bz iMs> G‹s2f Q GT%]SN=`9o'<iDDDDDDDn`7a0MDDDDDDtVObP@Z Hi ۶w>:V0sc\N5USCL^Br""""""5Hޒce"wx 1C\m UuhGbtrY7_FODDDDDDt̞$7l[*nk;(L&"""""L P@E wgI,,PӲ(E'|}""""""NDSD8F8F$cY~ж_ubpga0B5+ /F} *xVuek.+( br>fT9u;Q/P+iDDDDDDt1i9RYskh|q6@e> ۂF>^Gډ1Ub[H`tKn>ʉn6}""""""U:ƪ<'|Mo6@yxO !jDry""""""b03{$n!ˁLjtoz4k.XDDDDDDD .F0OnP(iov$tIWObX9)S^Ӓp!9]A/qttmNu(8G8*.aOm42lL RT$yc IDAT0Zq44«E칬Ae9Z&& םo沯Yڻ}=^?AcvKFL,#Yh;ObKAT$npE)]k)ߟ܆mC$,StJVxE ODDD4`ZXDļ'H馟wYKQxQE}kFp$KiS^(Ju c?;FxHF0߸i' Hy$"k‡-!S 7Ճe&D ^%pczr,vă?0f\\݉(g=yni4Z i3zI5)L> Onc;鷕ʹf4$oL bL볔Տû k[oM;_΁N!4lG]DZyh߽0ȻߛSS4~sTx.7mߞ-v;f7 ( ~C=Դ (PqG?gf`.J<"P;9:DDDDFkq=ia$o8Hw@N햌X-px t)d /ۧc2` H]y9y[@f)XJO(^fmAIo]8+H촯?'K;Ybc?u/\ 2e%"bFFB]Gೂi|I,ޘ'֘S4j0bQ3}""""71sPkxxG5/-sѼPBGsvC$(#1oArq 93_3mZw}./_Wof\|z=Uy5oHsOɳO6ϞWo o?07DĀ#3!.TbP@^H}ߖ5%;"B?ZL 19|^O kl֟mW.RaX 1PB 9qF>5[ B4-KcjQ7zF^׿:!Hϩ>Ͳ_7cbl)6`1hے sRBڲ1Ȳji!~̞⬁Am*s}0FdQ,(8DDDD sES)@* :~>Gu~|#v8\H-q*10, Rw޳\Ϻ`]~ 59 ZЏ ofGXF*WP@:oAQEǗA+J U( c,ؒHs֟ ig`^/Zv^RnU/ vQR6sTv]ܯ}>5s5ݒfS$,[dG^ <\G穳6ذ·mcDiA0HKwmgg3Eb gwb;uo\4S)6n,HƣE砻+ 6dK$0bU ~)rFOn!-YR5[x2 s=յPrfZo|smz Y Dڻ"YD~G/ӜBM}ZՒEam'77bG1z-LJ{ ODDD4,|}' """"""^|/^ 4~v179`4i"""""""DDDDDDD /8iIpߡו?BvvhW䶹BZb%"""") taI{Av7Ӿ aY #;z*H(9)l+bi\8q,). K(ᨸWi*pN*XcU((c'=|W%/>}Ci%|9#`zAǽg\hy)f7ӦTcr麂F!4矖$ K35EgY7črNRw*Kc$[ϬwNoZ{6pt)AkgO~] . i߼1fr<`Zݒ,%ބEjk J|2pYH͔Ui#_f>~zԊ{yA{ U]D)ߺkFFF}vzϵLDDDDD4b>Nmae D.*s9ō,+W!>i""""3دC=}c*:j3-ƩԂb P7R) ^$r!jPQJ(FE ;aҴ,>"{c氂gf|<x<{K㏡p4pnF'kȪ3O?O6ul.JjfJnt9Zn]`SnImf*aIXNZ# / g'ڞoX."iд k@ /_'eaim(@lk S<{9<\TcO9᝟lN࿎kxgOM{`=uU7g}GGo= pId MDDDD4,z5[x2 F qk M3{c_UA=϶JPoĥTpMb!B>G!*g% `hNޓܺ~) ʟ[H`tK֧31ownCA\ned ,Uԯ혏+Aڄ2'sby. uE&D~dDgqdv`]z{{n|mCj6ˉA'"""""w |'&.Flm0˗/ŋn;4y]D DDDDDDtU@? 9&B~džIP]d<NDDDDDZiDDDDDD`7a0MDDDDDD`Ӓw'yO1]`Z']HC !]F^( NY A̿"ƅcRx=0K """"":!M`u:UVEAWpu]=Rُӷ?ĞA_<1ѸL/ ?ykW]y)xOi6 R@ߤ%g˖(Ӓt±s)ݹ||,k%Y>ocڕ&nu US{-] [p4vZ?fgH SN3kx{za| Ƚ`:T>oz)|eU_WvPYPKokT9`E` W,&PXt,g"<5;W0Z2o^$*fhnCG}]vۧWPHcOCPZq9!s1U+P#[w 3sH=Nt^ﹶ,L, Ar>5恨ֱotug lC#z$ؒcmx.~zZz6"r1ng]~~>b>Nmae D.*s9ō,+W!>i"""""r=bU`#["4«ʹBP 1@I H}4{uAE)qkr/}7 /j8潏1|sXA33P> <{ |kw8ywId˧̉'~N^] m GS% 4ݒ&&W!'<"P;6k ˩@Ky؝ᥡwiYˢ;1"MB[ޔ8{MdgcxL`s1o6'_5<dz=B 0yb3|It3[OCH8ִ ne(yʪĭ5T4쉎YsU[akeL\J״,2!SyRB(Zz[Сv|bP(*n!-YN0׿u޹ qQnI(/ӈM+x2'6{PWTlBGFOtGf֥'f:ktz""""">@OXy#6}N6ٽ|/^hoL 3ACu~:"8irx?\G=`y1&"""""":Gt?!W|ۅ Ds9.׏:o׮ӒJ _/?W -9kzibW²C-4_1u,iZ58D|?߫^DDDD.oD4ŅQ$n~@W6|𢌝\Kbc#""""g˗/YEA9 *܆k]w赖ԺBg'RgBIjE&fv7[2 1t-It['v}LlU`a/ 4m~o_~6a;[r%k{l٠>,'աxc@9c>bTv>,_%"""3]T :p8. 00"r߅ '";Qۅj0PHm/f2e@ڟFP@^AD|dR^߭O X8yQ_ 6YHUJcpK i7'óilbc&;^ßFجL9`@ 2ec> (X /G]=X e BFn3͞a þ 2v֪Xme1K|sbƅr$@Eq>l={^4{گX39s>E}VnIhDbDCʃө~7x"WD^;ec"(}7ڠ5lQl w`Tw׶}6 o폈.+7 /j(VT1D}ۇ=ss^î1B * (٬ fBgON+k yrESqLPP 1}y8F}  }*J'z)~=nGTQ׫O]Uuxyy h3H<86.PKuL=WP?;1bKן f3Vcwڧ ;>2nCbX l)ŃGjgI/ڞ6?"""":,=;~3Fn4FmI[UrܝBjZk2-#uJP+EmwT~'ʣ@]YFې<<Yl(qȖoMF79.Jj N_; 2!P2 }B[rgw:폈.!k~)kN>:EqoGDDDDg˗x@xg͛ι1Z}>s~]D ʬuUpiy$Fh*?xƽLd͵'3yZ^geL]`Z(l']{g.`;L']( .ZoDDDDDD KM{\}X@,jzJXce">Gw7?}e~A gK󱂯P=yE o޼mğveʖwJRe2ԾQxQNW3iZaIWa oc7w_l Sc@MDDDDD-vfϯg Rx[k>Rh)]@*`YZ?6AT:K {z:[VڳO7̂67E(HPuW?>׿U/zA*HDDDDDg +XJ ##xښ@*z"Ҙ݉idG2塬02`5l|F$pJcpK ݫ:Տ?BR|4tj ~k|%^k?tk |Ͻ.x0H[ FP@P,cgjĄʙfOkxGP@smŢwbvOǚVbU[R!zƜ//^f2c4^7@jۡQ~M|b ~oqW% (w_EDDDDDh|ɫ] $ JoAO}GDDDDDt|/^ho4ñr(8g~DDDDDDVA9Q=;f~Bi7H׏4@WYF~DDDDDDL&""""""b0MDDDDDDt^iajG%74Tё9ua+D_BX#ƛ X*.Phm'gSRzM]V=3w?zP&8P]dBW -LavDig| r LӗuU~5/Cc]p_F AucP=&""""sũ,݇+:01Y'=n~h#Fes}^B@/b?. ,ԇb8`4F %ysLm6SW&ZУ#m>\;?9-SGXA{q5}UKY#M\q,L2֯b{g'W:0wm5LbEU[tmìY(a@Oe ]ܟX9y[,~nH(^f j8Hcz v'j SȘd?~ce-[^7}DDDDDtidQ3xX+ } &ލN`}k9޹a38?ɵw`~29gρ70.f,J8̉F~s 8n\45m~vkם VY؄ed"FP; 2v֪4յ &|발Պ>m\KT(50ӫ(]o77׿=.f0w?T7pGGrGKEL`mEx]zqKT!*<0s`2Yޟs _VYZǾ}U15V_W_|~g}=.X0fOC+JXW7o\=Q ֥[zYR _ʗ8vُV<䊞.)߮V_*z`U*Qn<,~m1AWR""""":tn#MS|v0`VDvZ_ ҧiHi3n~|J>}:J#ȽTwQR6s)vza g[ms:AJCmsȚv7/k^⭟ ~GDDDDDt\ xuHo7uhkYǧ_ d#on=U1c. =w? EdU+fwUk>|{F䃾]i#|~V6}\ 5[x2 Ƈĭ5܆BPF& (ʍ @}}=_[@U m00bWo|4C_YT>Ͼ,0nm'#z|/^hoi:!u$߼8gT\a N{tҍ"=NDDDDDD _{Cz """""z0͛`4Q{])>帨x6qT\xcƗ8::6\ۅ $u8y|p~ٵy:^q䶹NaFϻDDt\1Nt[2bc1> Rx=UM1Y_*"{]lkjg`9 ?~w?oc8x/HA  ~1X(ZǏ-ϸ\UYFxUeOVN yyd5/""l=Ӫ@8F$*U:FxzT|}{dd|>{I|b2з1̿! w_~\XgZt9 ԣ}~Yy$/R캂hW:wK*bQU0%ó1/)|ĭ5 B@͡$na܆ltdb/糭|n%T!&Q{tyw;o߫~\~4!ؒ(Y~na>b's"n?jN;yID_:vn񟧟ⳃ󛸿ʎԚQFӬ^,NU ~[~#ͱ:~Xj~WO?oXȟD)wl;ׯ;<B }8n VwQRE'|}AL7}s1Zi4 ~ x BR|4$A0/4fM(^fzq?~ce-[^7}dzDbL,! @3ڿmn j]6>kdz]ש}jNWcbs2.sڿz[7El?W]`ZI?_lU9Ӽ_=HEU*PZ; HT(܆52/f^hoE,1g^:oh(Uy68֟+C N_A~'ڥO!:yT}Ƀu8q1I(PQF&b\p끡oAfuھ0XߨoWoo:7ڄZh7{9^v~{owX3f~za/Ffh 9mW`*}en.{}\:y ""دU6)]@*YR;Y.FᅈGX0Pq2} _|ճ-q1W+var* @ qmw? EdU+d#7o*#t0T֥V@T밇U7o/W?KoϞ}-;VؼIiẎ8c)ĠB9chZ5 87Jazd8Op ;}gV=A^|% ͸hCA\N!-\(Hb:z6kY=D w]yͿ x vvaAQcDnM4cn޸ ˾?TDvX=oסد+U xz(_4o~Jo3?_5W !oOUuxyy hW@ B e>ԱΠգ݂$i1Nw;>#"KNNg;PqĖmbi9}b|%5ϼГ-#d;1X>{5 cw6X5[J`ç4?x)>;{7D:R mG%V1cZ7Sϵ_5%o?ن~aݿme[z5xG^m  vk\^1π{#WFq9;5g22 EcP2|#1hHrt,$0%7[bk큂 UUrRy_<4؆ØuEY N_F:lG3NӯhL)U1c. hM`VecE8پ?zķ8[`a=bT9Iȵm[w~m%9O&lJܶoGWDմuc!Bެ?JF7~ze^WWw~~6o/m]""S k/+y0+ͫ*뉾7 ˍ t%_rgD=DDDnz%^x1q'wB |T$<4tc]Rnϥl߰uQ.۶)Cc7|#o+շovsogDDD4?Y/JK-ۻqAbeײˈdW ?nQ_[-WaL҂j^&7%_∈]0}j ?~b料㦗\E }:#OiA`u7*2k.^V+fy&w}߳R)t{Ƣx6^2 $x7xv(zɤts]e/#7-N4J/^gnn+LiNcPݶVJ+ˤ_ڎ`8zq_!gO,MP~K$ z3Xjv&~{ŝsl[fj|uO`Xƒ:f4ib*t@$A$AEjwAp󢺙A$l^Hղ|JrSKh%9-a,3h4]̹ K8D*g>Rn!:B"E4Q/ {&1#\T="unSZ@D4m^v!E!@8/a {eiS@>_kN0E(9/ӌ#tzׯqe1c֑@G?nosH[fCnC)"Bs8Xs}μ+k0ik#7~+"""=!v]}kU19v tj݋Q?k^@嗪j G DϴZRE&j\>zn7~V.ۂb:Լ?K@*m_,Rxpq=ZA0<Ҡ]sPfpPA];Ųb3?ov j?w~Wz/ߩ}j [{U9|=k1,|K;y~miqDDDtK@TZ8}x"BWb<8ތJU 1@͋5d<+v}hi*Y}=aHe/7Ce~je$GTBJ ƖZ!H.Wߛ]>x!"+!n4Wpġ}iWsu+0BsaWaH@Vl&31SБ<^|k|^LدNi~iVHrgL\Nifר'8PHe֞S {˨H;.qyS3U?CJO<\32h  aPRUj Ks~"ƈ;hfO:g+Wm;Ҽ8RXZmd6R*G8niv]?OI饑IClL#ͳ=6RD^V;c& kπ $vǾ}=?CV 6b kuߓb7Xg;߰'Hh\\]}i5m)ï?5|Oy<}9mdHen~CwH=b%|GxJrm:M3Sns%x2QD- A:oWoGJPo57ې~`ׯƂ,|EOͿM3U\^|EVbkg7Nވ^^$lqj,"`jK]]5^p;w|me.Ӽi>xqM$g@ EtW_ YDDDt;t6B!~I 1UН#ȉ.(hW2numH&""""""riDDDDDDD?i""""""Lye/-])r>i{' ̗>W1svsog-H"ordǗIz;­ŝsTg/<9d=./ko?`3֪]F$Ap\0&&& m7\/bǸ<\:" |5yvO M7߼-̮rnyàʸXܱ@Y,v;w.LkD "MM݈qRDnه75m` <>xQET3s~}xD9b]~Ae,|011a_[:E ۓCGqېDQ+?V >^܁|:]`Tn)@C?fF {=RZK5MKy$ߺ>Kmڠ4s7.3љjlO~#>5`fo۠Ӯ?;<ɀm?tX Rڶ?ANRtҜnGT̋E#usZzӐ;Ũ/E|J]'i.͸ovҮ߻Nl:oޱ~ܛNWcs=ze~AXDl?_XU*Y| }imEDD(q!:J鯉U& ^guZ>?s Z+L5h.H!cNfuI3TFfݳJ!gޗ`t3a^?hOF  IDATx s?c7x(aF)E!;sfq6ܵ/#@.DTyC_\m0^ю(("<{oE=XK1R\ƶw{wΝf@>]xoXu=S`~瑧4cN"7/ȯtJۓΦVd Ŏ޿e(a62hZ~׳4z؞~0oaO~UGTHG94q :W0)s1$xL>گc 8~̌v/]e0mj=TK`bFT3i?ׯXZ.% FW~c[z~px@&RX׳`Z;N~m `qE) hKKi ޘo[|Wү)DqHd\~wEथ=_Wh^@ /ʶoqէ}/z9 ,,LoPsz+,a'4X8$\=”ޞ 7wԲOozꈔwophbWa[px0Wmc-HT.} GCI}nѧ1M` "'Wߚ@TZ8}xѳVs8Eq hl7-Zv +, Lv{|V]Ue<vo}BD0WBX+*/`҇!ө{8#00q~1?ƗS`%7Ƨpe+Eqtyvo=t\aǘ&e~{q~?GWoE?0Yn`[Xղ!.)_|NC||8]?<~~6|c2݀`?E`L#v9xZP qL B/@!+Hi/h6))ՌYa.'^.w7`?  -7)di4e_d\?C z\_:un3VͣN1` MuNehLCpojț 8?c5L:n N Ygؖ2 ;P?.vUuH񯼀3}Xj{`z WQqf(of7v>Fp;ڣL&"VC{EXӂ! V) EI8Xi"$ oWo9| Hذ01 cZӃ#^ 0Ҽ1/gUyej2.BHcw`X{Y$1'=ӶUUF*~ը}m`jAo V0uP>- uX5|mL"3>OW foӍJ}u,,_jZs{^:,)soVKw}~vSaԿ ,⽼cf~K=~3^QQ|~} {=~ez7ѵd^UQDU3zCȣ>?Κ"*2f*`wlǷzJ~3aR%h K`lM>R@"ܭbMƻR;f%]7!~Xei;z*Ŗ;y_t>grF}DK/;̡ f BV|o7 GW5b{A{#ic:ͩ}|VZVq7akQwͻ׿អ/\TYUO)F+{,wW}b׶1;mvkylZ`MZiۖe|~X߹6ڶ?}NG12C""Ͽ~XTb \Ȗf,6J) u=7izpx)#jπ>׾i5o?W^9bMM?r|߾}ihi>xCw`< CPgc3w}}(]o q$?C—G6!ݯ@6>""nMDDDDDDwƸҼê$""""""i""""""Lye/-])r>'+$/NqW^C-HV sq $ci/ߕ+1.#zA{_us|unODDDDDt=Ԕ󾮀Sdij-H;0ƙc;#//օRs4 )rw>\?C W7VRE*eSWZD5;PFGwI hZ2fJH?}ODDDDDtzy \buO Z8RXZmh^:&BOv&_j R5QPaz;һ˓Q? ^Ƙ  Պ\>Y@VeWKfbO,DZ>eT:7z'"""""j RF 3EZ֣ <F=55EăUd@T jEG~a r9eR;_LT ((d .߭7rJ s9Yw]9[[SŋzLE+^|#ѧWzs"nKEoN(Yv;z0;ODDDDDt]^+&;}62~cy4i"""""""DDDDDDD LA G\ҥO]k{v 1ރl;ݪejAuCDDDDDD<֣gd!*!yPS;QZCv9, A֛B[`q;zztKm9x2@* @A!ٚ@}KNy䌅wTM """""ۦ3C)"Bs~3 %DD(x]E@P?k^_猛guZ>?*~#WL5h.H!cNfuԲrTFh4(H]sUmbs~'-!h G> Sʹ{rC_kRAwő*_mVj G Dϴm~#[$lXG_@K#"m?bZ$eiH=Ӊ3DTޯj& ְ(O)r\bxsJ!XpkG{xQ/y&RcXA!SWnNϯ%ww2ԟ^Wn""""""Ͽ~XTb \GWeI(˫;}62~cy`t%}k6""""""V~bN!#+!n~`&""""""ԡ]F$z """"" MDDDDDD`ӁdrYKK>AJwy@_%aqu]\YU/ii}"\F>79voϻwQYt|sXdy~iG/.>q/DD: 0*eD((+p* Hۍ>?h1. HDDD1@w=Ϯ޾|tO7*8@{e>eq=En7sw1峕p~ "LT 2 ԍ'U!Ad9zF~~X111QVS**Ei7CN馞?*<+}{;G>:96'!"DQ6V >^܁|:?Ą'k8]FDtgi{PE aίX)fuh=FOd;MWBڜ?d٠[vz)Mfܦ&覆:wǕv <?ħ UN_u b<׿{:8 $'v`]'HiIsz-㌥ T̋=#EssZ5쬽3Ť7(E|JSkOzY[jg/;f_ usv93Wer~3ԧp`?گ0Jo:>|ƱBUm4柺:a/koxr~}0y׹NwÜLJ:F9`P?đ""4 C(a& ^vWϚ׳yV7L-'1ܠPNTR2hj[4Amof= x&;=w'&,?&ŵQBGܛN Le_n3UNDɶ@蟂Lr) RR.b<\hQm qxTv@Av_2tL`/gH\;RiA.Fok_L5ٚ1(zz0l \%*(-_mêZqH c=/^;N~m j&j0F,Rxc֯h?F0MXgDA^)$mi)34hP xWNZ P݃UDjPyQ~:g?Ek4^AŃ)?)gz+YܟX@coZ>iG0g .>\o:?>qIw۹o -3=m4:G3 S^`7"WiF0<~upu#KTϡ $ie=33ef{>/y~߈~\}kQi ZF[ M1i48u2R: C~Ei^4Q_N%j gM  A`.$B9rǯP(~yw~gc(a< 6ؖ^Ɓx1݌h^ryf>+2EsArh/`҇!ө{8#ZNmVUx3bf/]u!31) V;=L5žQWg6bi8oqCg#x0woÅZ,7-xujq5[xzg1+t7>\~CkGDt!$*8:k=Ϣa#Xz BO#6q6a8`I!Lڼnqt⒖=HF:(J؞LLW yؖ~xYb0WmI pk0gGǾN1"`&{S { `IAtLs_ NѰHjaqwԾ1u0{S7#nT'u~_9yAt|\߇ ϯgX3'lAS_!l;:7mEK6Ӡ]us㏈.+Ꞗv[?đj;؉mTpX^:/OBYJ'axz.qA†u)\\[%jia21/+aqpe\_ $ZӤߌIl3->kиk]v*E.Zy߳Y~:6&kX+ɮ~@ "; d _ov=~PZ 6BY-g fWf_} uG=dWʵw)]7ǯ~W;>s|Olޖ)3hiiXŞ=9www~㏈큙J%})= TeдĜ/ҜEMC DKHɹh=;_LQ%29nctrZHd|q#]kjwuS^3V4_!Y[W;ќ)J;0\s37cҭ7( QOeA,u#IjW?W(JTo&)Nύ }sZ6S?P<,Nk)S|]F~t|9?{v>B ]IDAT|]}3zϚ|ov:Ow[ k)JhW'79iݜ->5e>ϼ9`^oG>{+>|omvn=ݞ?GDt ?VbMR$vs!% Y{nf|x]]L+O_tۏm?K>ͮ_y,ӵyѵ/Qo߿ǷoFZ/}r2lڃq^(8:a9ذӉnr˧>Еt?shSGDt1Ǐ _\ qSKO5Mb}B`;ǐW Fnm#R+MDDDDDDwŸҼê$""""""i""""""L_)5 AJOvxerz 0^H]mG*Բˈd:7)]F*RH`9[G.@2ADDDDDti=zF&.}f0DTrkX6Yƭ9eZb9qfk; OpMœf#2R|2`Λ$HܧBZu}nݬZiAi휿=RǕF2*U_tA*(+#""""L8RDfOu(H$H$D*Yzxͳ`j DT?dfÕ9=S ڦk=sz4S/oD"f-G"H7'4m.e $Um/eu ߱MDDDDDw0EGs੾s}҂By7/ydXׯXZ1]Cy^XArBFw) w,cƶH{s Zϳ=…GsޡMPJ B/@!:m2D"F(xSCKH DԖF,_ZtQ{oEk"{rR) AF.x~#%SKEI8Xi"$ oWo9|J; ^4 UH.$ۑ^JUt||\ BKAy3tWlzsjg8ugI"e0f=Z֣ <F@ gM`PA3BZAMU唙J~3aR%S)~+$2@niV>cEW7zEVT|9mGѫJ!7 ^ET3ݽn'"""""I]^+&;}62~cy4i"""""""DDDDDDD LA G\ҥO]k{v ރl;ݪejAuCDDDDDD<֣gd!*!yPS;QZCv9, A֛B[`q;zztKm9x2@* @A!ٚ@}KNy䌅wTM """""ۦ3C)"Bs~3 %DD(x]E@P?k^_猛guZ>?*~#WL5h.H!cNfuԲrTFh4(H]sUmbs~'-!h G> Sʹ{rC_kRAwő*_mVj G Dϴm~#[$lXG_@K#"m?bZ$eiH=Ӊ3DTޯj& ְ(O)r\bxsJ!XpkG{xQ/y&RcXA!SWnNϯ%ww2ԟ^Wn""""""Ͽ~XTb \GWeI(˫;}62~cy`t%}k6""""""V~bN!#+!n~`&""""""ԡ]F$z """"" MDDDDDD`4i"""""""DDDDDDD 4i"""""""DDDDDDD Li"""""""DDDDDDD L1&""""""b0MDDDDDDD L $eIƕ;-]2K24T]u:fm]\YODDDDD /_B\ɀy׽7uھ6e) G>Ճuuzo{wE\X{ϱh_N{9?xG|jLa *DDDDDw(N?YZQͽ@B9dU52Dd3[(($ֆej\j%N G{9 (T{ObmofY!:J쮬LLY+s)Td8|x9Dt uj{D $j=B ݎJeNf^5L{N_9&01Mw<p3(DDDDDw,H=T^Yśq AB8h~%6{7c =T,ӡ0f?XVj6w>+7M715gMR!oA!C$,>x!"+!nCu-XmVײT&Y뙞 PN\/]FyJ%\hԪ*Y5@TZo Z4k_!YQ kxR$NQCGz lKqyi""""P iJOe eKzA%4:> P.7LG6ҙ4rP} WI =nGTrsWaLҞ~3'|:Wm)xϴ 7y^Dy`LWUXyʹiFp0/M{Ą !1WFD`c{>F ^ߴؓ8j|f}p0|#%U}ng;1/Ä+SõDDDDD*:{=6X6TLTd<τQJoyݜm~ksWe RXDK/:bB=xtcA`u)ȟ~b _9h }ܺut \}CGDNDDDDDt⨟ݏDDDDDDDC˧IENDB`muon-v0.4.0/subprojects/meson-docs/docs/markdown/images/win_dlvs.png0000644000175000017500000065470614737503617024662 0ustar buildbuildPNG  IHDR U&葮(IzTXtRaw profile type exifxڭi:8Xߛ"6V͈T/f9_jzSl[lEϯ~t6?/omx}MJٽKlWˍ|`|A7z=(hEZzݨnA^VW gG{- x ?}τ<.t!uz}VA~*+_8攐+ nwwk/Oh}:Y՜1cz+ޯppp?]/u!z'._v}n/~⛟ Q%B[?s}t/Ǖq3y7:G! B!O(]%ܖ+/عH[p0dWg'w}q;VӹQ! \J~JC8z=w?pD 9\BW`#~JPO!ŔRN%R!ǜr% z %Tr)Vz 5Ts-jo1JyhΝOw.}FiQFmI8̳jf}8*vPqwuv‰'|ʩ5g{ͽ毧ta-} '8I"^>\'ɊYes`Χ>|o~31ߞ3rsF _Tm zHi(@'ɚeMX9lǛ, P+Xd"U_*yu&JK"s<ޮ1:;ņp̜6uṄ葛'pѣcqfBزNJ{`\MgLZWCVa,?N- wW{D}pv5Eup{{_:a'KU1f˲q !>J;ƄX0n}_).%vb,ZVkJ`Hk'@ \̀g2۵cgl2}*҇W@iG#@)Hahl=2rogγ=,yϺ3lTH"iE&Mn<*u_1+{SiE:<ݥ*oU)T\N' TY|Zǖ{vOBB17^yQ1π9Ja'a3nF.jECBm+&2^den%t{!͸Bng G,|zq84_/kTom(8 *@A0BZԞސ pP =Hɷ:BH^ӶiT xʡlˋ¿O$Bp}ci#E,yUd;Ғkxoa@G\YGSّ̀LF[Kuj~S[p|R@fsu+*QRVzd,j$,4e6 H˸#x㪘]#~GT5(wUp\ f:h1CjO"$ րJF`xpShgD,H, K78h{|h8>BڢP$ a2-?uj8IN$;%r%4h́+1>$zsCx58va=FQcC@! XXã A"H[fd>G=Mɏy՘,o6=>.ԺYcQh>Y$UԀ`)9Ƞ$%iT;*-2{* cuT[S6=M i8%4J Sy YrID[ˢ-..R_SČm+K]Q^$7' EQXWGy{4.y5 \AYՕq((\3Q(Ε@DQCN&OCSVBu:!B8 TeVW| 0|DMї+ eX; 5|O9RT/&)}K1s6O9KL}"'-'JQ.h\F u9Hb6&ǗX~ZP1XZ^H|Fm҄6c0򷋁\? @#jUfK|\ O١$q!O@`yt*[}Bl ݶ;!):մ_a?&@'EB"}PtnԾSnGe#0$GDb¥;a[d4 sZT/(.M#,p:E(.bXt$HORDPE {N00IR(]]3m18Esh 7DJq\S1Dtw"51^d4M}t:-J2&2/e`G 'Bމ&YG=XsE{́G.({#C tbWh^])u尊喸?2j#3)`+¸8m sr,@ 9 $ 6TrBH\qRN5@&oup\PA'[aa8(>z0Sp`np &^4;)3~ ]3 Yix5bx Qt>ǽnyv!QiWєTH OC(P ;(.>КE P8VF4PP.-dmR"@ U%-~AK* Iz!o'Xx|܅|`vpcNm.zIjn9E͝B(U/ ל VBj*ԁ:ѭ!I (nk/pKWxT Q>Njpp.Ԏt1֩Yl΃Cj$9X2y#1[&t B;%\дAEB_;'Zkc)EXg/XUYT@%졸pS"!FhC );gO>!Kg pމpgn"º9-F(f]u³h0JB OI;}]W*B{F/*QQ|G۠e8gjKnu4!ϳ!R0 S fi@ѪYCAo]nz& Ԏۖɥ }uPzul׀gw@Pkޠ#٘IWtAQe@a B9:ZauŢԡ)q}wo}y8\d׳D,86 @(ӫ#AZ^)2Pzk uQ#zJy>J@@L6B_ @P@(ƍPJs#} >j.5|7k@HjjYbuQJ仝?T" pMՎ,`  F'">|0 (ڞX xOzl[̱#$Qݞ#:v5uUy\is{'*6Q#+1`70_Cu[j#X:09M7&D-nyFȡ6#;<ZYImu+TS%4h^eԋ^XU&I+N(8V&9?Y#V#|jBniitV.v eIei΅,.,¾ԉE@fݴ1hQeT:$)7,>+wW%j `I!OSJS< ":C6V{ l1nTIi> *fAJS!x&l6VCU6%J ۷sZ&) uc5}$ Sdمɲ¶ R)ٝ^]ژ ڼvqƫWM<4BMZ ),!Bo83֔#EhE\C ZW÷(xYּ&~d8﷍i)G,E'Ŧ!pNsHg?:nQRѦ`8f\y}M<nPt KVw'_VLuF Z"8/ Ps_yUb93$<>H&H0(Jxu`dg S3Tc<`|^ظȡwrijeCY (zMw)T;\-ʸ Q;RupZ~MCl)*XmͿVBM9M=WP ?zGC"_Ka6k~+?_4PPRq ׾DEX:$PST NT⡶A?F9S5AvrMi,ْbp3@΄KuetVrh@xYoci`OΛMT€Lpǰkv)Wt{M5AM}1b 7` lUAyc`ըz)Ɲa[  À[KC8toÃah=DqtvwXF!YqEoJULei; &Q5@ƙ")Ǝ#y<a~@ܦm?9d&!v7>*ck?6{:$ !)sxfZ)bWţa @<,5d5D iR҇!=`2)n ?ͯ:y(&<(7DfΚ:'Y9Ee]OQiNm#G'{Bz]d'ihjG6F+$#3C4\"*}6嚧AnMZ]()G HeKH sN 4.o?heUŽԎS6@-wРBxQ#uR ^U$tirB@X9:l "2w&rrhL Y}cՠJECqN D.mP|t*/"?.]uPfm2E0`V!E:j鍠i7eRO[HQwm"`&K_U`8Tzk0;oԜ&!j9~JB"F[S\BNXBC,B5nzIk^%4DMtmH[D;qjVx$#: @`D?f : $h%dMFZg54hxzXb myx8 [ʪs)ᡖ $62h%"**Ä0ӜAiv@={D7wYNH-NsRxng(tb _W9QwA-I$ j ( <Ԅ-f:CVOa.2ڥN6IYsjI 4L@[x~HO57tp|{fQ~EgU''dyISc.GT?C1;%3CMj]A(Z˼2fVu}$ j :z}Z`S4+|<me)5HfvM2M#v_#|~KjD~p3ᆹ~/^E / il|t;: Y2z@{d-Xepyq 2ёY8ɖ(:@j0W&nRn׉#$ Z=Mcy:4nBeS , O:tIJiL4ަ3[A#0{v^pXt U#ڔ2qNj^9k#lr.k:i @NA1Ɏ- A)TxX.θݩ%]f57} N>LM#ʜ5fCrU[CU ૓pp]1M8/(7|T_"C$Gy:dt1/!h\icgj~ 8tqh=l9 [I"aE٥k&fJ,EY# K:IC.j$ :*i[{$&JݿP_^Kw,_M1JaQ FXik')mQq:Y(}]*tI0L_8uϧVx>lqy'azsTKH ĈbTHu 1Ftl rx##V(\ڐԴ,2 ūw䬦NŨ_&oSG#q(1/[%@ !KE'#L[ȭdy@jIg],8MbyהO[u ,[ҿEUY.Z&]tYmמ瀠N"Xaӿ Q~26Md|:ɒxSl”Q `F #ё~X)Y{u)#Zg Yl4urv딖w̕ć Ni{s%<̐ht}$Żvgޢm=lH{2c9`B*G!s0@Es'zmߩ/yhMA32? N?JGљq[=Y*VRGh%gePZaAf PiCCPICC profilex}=H@_[*-qP;Yq*BZu0 4$).kŪ "%/)=Ff8jN&lnU"ACL}NS_.γ9JdO eaoOoZ:}+I 9A$~~12yP`YPQ?yZ= Cyme4G" BʨBViOxH.\e0r, ݚ 7)_lcͺmv<WZ_m3Z.ۚ\COdH/30p qd ppĊ=Uir2xiTXtXML:com.adobe.xmp Screenshot pubKGD pHYs%%IR$tIME  4Vp* IDATxwx\WTPB@9IH%s3^۞^g<3;3 =cwnG,QT )Q "9rս$AH#©ss;G? 9D"H$D" (*6l Ć/!&_wJY*V%'''wOWH''''w+c 3ts ŶǾ"BQ<{Lod!\VV=eMɭ,r!yʒ3EGl_Vؤ/3tV9v<‡d~HD69~fY3!?yq9kٱk-@uz]UK{4<A̶Qm)i^~@4 >6%58=N7}+`~nF-vlSҕeuԨ29}{І9y&Ʋzٮ&^;=p_#gZl}Aj*>)!8^pҭ6 iRP4+a!5,79X~[E+V3quH3?u6RSBb'NL&n~C1qFI,mX"3`t4)T^?>s,'2KWd l*W M!='8n"^4&Ocv)de06q\[˲xضEgg'[ne8] umeycp5u&]YeiCᇿh|sG% Gb\L%Fl쁧+dUJ7HgZi>{Ye('w}wNl9՟ضQbŕۅx~j}}0:-y,xΌPQ+gxx={ ?ׯeoaY6i("/4l;7Rbl6_i$D",pi:;)wө2*w2SD49qt+BGRuE;M TȫFCSxo~Lsr*~ >XTKًK 412 P+( 6@,0WȒۈ7r|EMD \_K?wؾ]KPv3: m 0IƆIGn73-8ed8Ͼ:̶lwDJJ3f:(QژwReޛ4m$O&U!S$a5c: 222`tth4ḱks,bϫ{*h>KqLsna5tF~H$3C,Bm_ϩvnO]~Dlظ<:6nX[ohn zYP84vcC@W8-yu2\N"|bNvUqx_ w9JŋfEɎ)Uӌ\<[t( FTg7?o>Ftq:ȌK~> +F)]a}.sj`7J(+4@% {㛭+dd$]bɜ+4 g8`1R¶FG8+p66B[2Fb0]sD<̙3B`Fep!DY(aP2o3;?aMdmL`,gEXY97m4tpp;1JU^pTaEGsiX8sq>G U%8}&m GN4\DC¥eX tDϾ`F  lĴ,l[e Oxs(ױp~;S-쥩#go(}G8پv /DWH]|mq0p:[eXU 8پv}N)͐5-ۃꦫ7g4M.Bj|GrRR&1m#CCCk4m6l0t~mn7۷o`!y-W’H$Ei*߷9 '?EnP0"|>/c?9?ʤpn22#: ~*U?(L1:hRXk?Q23WWσp4h7ĭ*nk\y4\^7 owO;'D,oF _3T|MǗYF@SSŠWx.yJOj n ,R=t $PN.](?EEa&G i٠8Ŕ*"\($H08%k+A^42$i4{}.`vB`Y&+'fI$\+4LۍӂO˞lz y7!D"(W ?F_#K5]hJ#T:+p%sWUV_܄fjnBe_~Ojfs,#y_]8.]PpPSPrEI_EW,gvp_U0܅TΞSkUgR(|Oހ2bZZwB.Wߠ0t:opDzl?ʑ#"H$6N' qzs{\C*"G(9~Հ.c%@dO1nbhΩǸ.j|PO'B0#K%ewH$D"ȭk(ەƔREW dK>w[RJu־ UL)U!H$D O^8kkbVHQH$DrrEzD ׂD"H$)@$'%D"HH$3 D"HRtȅ|a “_zLz17T(ffvH EAXI~S[t)tYU4V%''''''O[Se mm(*36cUlXUkuHT&)[܅-Iטf\ωef^Y/mtY~~~~~~~tEsyiZ1A\k) 4MFI>۳ g܆KLE7g`oUY7r33(vk$=viwi' !fi(d̒fuۋtbq1QxH"H$ɧ+>.8~ݍeY$ |>m:^qF'N˕&;JfI$47t:D"1!,,˚4c&H$EU4MG4)B>>iM}r`MC5])JKK Bi6L"]rG< I$Dr(z)**B )B$VW3M~ TWr3ٯ91*r9  L&M(14Tٳgp8A$D"Md2NgD"mOYN|122JEE97<{*JŶHD\t:*Z%D"|8N-*t;%(K> \eY PYYA )R50сiB! 4M4G<%D"8; [@B&P SԦ/6#"p cTTܼGUU eՅᠠ@:wcm;/@$D"3{/ p: vtB*k" Np+^ c&B[:i*Px'(*ߏ颬|'˲hiiW^L檂MQtRnJIIɌ{\d555D<4-4MPQWG,2A,h7b1:;;E? . N  R)uEeY\xϳi7J*8~v( mmmضMii-!iry^yZZZ)++c͚5c7|'NIggMod8y$/"L;vly`3E(Fss3O?t~-S]]eY ѣGiii+_ʌ<_&LR__O,>4MvAAA˺.\.Eru<GQPoYTcB!lc9c[h蚜Hlۦ۶Yf$hǦirQZ[[gQD"'࣏>bTVVukB3gG8v(k_*=c횑O*L&)//#*@tvК%^mU*Eƭ ?!} |;߾A2!(gsqB6֭[q>!EQp:|>FGGbFL[[PRRrS"d\utwwcǃ,XR8v?###7}qgYN8?O"`׮],_a}9ۇ6[n#EF =s!(,,$344įk:;;ojO۶9{,<,[xW>:$:8lRTYMkٱnΜ pt  uD }ݘFE@din ˴sälB<-5tvYrO>$̛7mpPXXH4E9٬9sdddup8xw)ܹsYj%oukU- ]vZF<+ԞSVԶmzzzӬ\իWiX?ˍ:f[uzTTTL{{M̈́ ?Vʋ=̳tvv044L2rTFٳgyhmm'Ɗ+jZ4***ص1z Pعs`\>=88Hcc L$LL&D"y?N&Sөp!,$@tN%=CEnETF\PT0&p`*6f6CƴpklB5$.2deSdFL&m0-3En.MGSlL)00t3cm1mTMGW630paF΄md1mN%cZ /NCZ(>YFQs6I3MQiEE(u 4fd-l@U Nc"HbL\dҤs{ i"tC˝c2 cـD-l%gEwq, u)`gRēzkσCl*A"FEѝN&noV/\B](ũqp(Ȏ |fV6M2$kh|^E*>V_vr+K&B́͘ǭc%SMfh|f:uCQ^^ڵk477~^/6l.G6eÆ TWW3?oM4{A4N>͞={?~~s#Զms)ݛ_ȧ˗3w\ [ntvvܜ|Zy!w^t:rYVXAYYٌɓ8N5f~!hkk# S\\L,+mS(/*bE5չ^k>iלR(N2L>OCsscǎ"S4t]Dz,|>yGio(3ܹsӃʮ]y' *]|{"]~;@oAd_W_a?ٷΑuQ }1ɓqNx n8)T*RPyɷYʶ xo)c`+||qh#/ՏhF9}~G!NZkyQ|FݻFΟ?OII c߾}>|Ág:tw}7?8ݜ Mpqx t]pꫯr0 l۞b?bIB?ɟoͯ~_塇Yq|+),Pr7x;K_b93tf_"vϷX'_`_e{"):ݣ_w?ދibe䳋/it:yt:a8N,˚vD"۷+/#  }vx"hi=TU;vg}BK.>F9x lڴuM֝ǸO?@zY`viy] 0%K^b<3M41MQ̙m  3ghә#Y_Z8JJ}gv\7e[E2IYN6(S^TlqUe ǦU]JҒKFS |b󿫪 %_B/w^|2:fY=== GP(WU|>5qQ 9< ̞=;ΖeD4e7t.ܮ 'e-."&*+EFq9 4]t5ÉiWL8皠ʠcZUC!C0?Lq؇M29JJx 2.=ADB, B _qUS\2c fӘ68{FhLYaaf.;ɖ7Y>%DHJQP@Yi&( ذsU/Y ,ː? } qDU@fH;9ub!/J(@QsB_KU$+EGs6~s+YݻBœ: to7uRr;KUQ- [?άRG/.^7y]`=!Cl?)?YBQ%Օi%4(,MÖTF Qy]̅a!>۷3k,pyf0.%K:k֬p`&˖-Vi̞='Orq*++3gw&Ͳ}v.\g222ڵka444 'DViȉ'Xz56l`ri`p /--gϲzε4ie,Y~~R0dpp.~ibsa޼yK/zx'6 3*--[5@8>mXrci:xعspAGɉus!_k:UTI?8 B3vV˗/Ӽ{ 疋J$"LF;hv BE&9kbDz%LB555oxέmPzŋq:]| Ν;?-^.Yrڶ%hnfPKz^FFFrƧw܁k۶yoxŲ,CLӤ64Mw$uydb;i{֢*SZ(T#>ʬeyC)rv| ڏGkh1;}J2稪MNQ8Wm |8`2qNWW*C6LeN6Èa|TTTpQiw܉al߾ϧ?]zHY㚼^Μ9q\a;49tTTT" 044L[&L%gpy*++3~頣 .d/K̜9o>H$YkH^Y2` Tm wQ@MloMuJ1ױGX w31T-ZUpwaJuuj "h4,idmu9guD(?D#>74I0PQC`i[nC@VLGն1CŎD93x^ .gpck2ז365Z8˛yik<OE@ky\wu? ⯭KƽP8W0sR.䝍OWȊRMOUeU$yB_RhC˩l>O# ĝv+U5 .o IDATD5#ww UhX_^K}([?:<)ng?o)|7oLj/DUO!*6yC|t=B`z_u }b@2+Ab?Κ&0<~Yʩ=drE4Ν=æMعs'dZFb1ذa/s24"r:;;D"N{{;D& @eTn !3x+4ٳgsQFGGL@ ˖-c׮|{Kex,Y׾;2yZ y9h‚c<̙3ܹgYl˗/wiM FJf͚g?"kDЅ`0L5HtFG(,H C`杫3%(ApЇJDLE P^VF@&sh^7rm[myUk}u+!_"e(j(/'쓠t"#1`x8J(/'CdE8$24L$a"|>4 6_xJ/DUE8>8p SQBQ>Kw|#ah8y߇~>1T D?LeEIK!Hj~ 3:@L./'S#C FT cʩ(Ct% ATPJvg(B545V3c ?G ihRg_R`FI !RW?Fڪ2"ChTi$"\8@QPCPD#j( P[_OUyGWSGFtaFjjjz䋮q =JOOJ)jkkY`ͣ~\.ƺsa~LӤ}԰{nO?k׮+N魫"fv%k% }1FFFXv-/W_D"Cgͤ6uW^yC~1N6nѣLjb60TUUrUW~*"p8@WWh`0HSS#˖-yLEu]ghh1o<xF%%mI`q_$-0HJ-eP Ǐ`֬YMLW, u#ҵ)4Mˤ{uVN8Y`'@b,Z芏Igz1I(i'k0:xmϝcGodvЏ,{=8~$¬R{ 52 ϳO<= 0ulڴV-[!XNvɌ3Xf+e$ V| 6H$u`08.DItMcBɕztF4.LBXK@&KrB˩P(T%n…ND&KҾ Mwߝٗl_&I 䖪4_mR FU׃L| \_ȸy'xr%4Nt |4 ̞=;SW%y,/+daR&$Jda`̙3tvv1cF˄m^]$+P\i/+I[ $Xk`Lh@y3'x^uJZ~oȕŤȳAhllK.Ώ|tww?W|,'L4_1F'x'wF{sa>?Ȅ+sA)EWEצ"HE__?E=bݓIMO<O~5hof8 _k]K:汵=eAPVl,v1@JY ѡ"$TVAyQ #1/2O$ Q2@@E`y328BL`e59!2(ÃZ B^+FFPJQUUM'8DO FQf~St唂TQ>3,[ 0-[?χ9pBirV+_`>s;:AZb.g0B],fcH-i*BẗdbPKiBRi&aZUc<,L[ɶ7ML%IX7IJ@FUXT 3d-2Sp VݢU~*DD<}CT]¼J>ʥOPh2|0:訌b A ׵lnFSte4PJimMr|ip2z q҅SOƓ(dl "'}M,*K>2P~RZ4S/P}eV4cb9UJ=,c1YRNH(%T.d6jfJJes6󔋑h:гʬGPHF V&+9{E(Rz;n}1G9zUQ\aI,s RL8D帗ps[xDKA^,ɔPA \;eC!N\4Qοc*ӋX6'zw~Oǎs'[3~S M-0oFy?mc_c̈́}&F;<ÿὭC#0NʿyvF ݀K|TʀRi!1x׶\EKh _P5c+OG jAr!xE7|O?p Bpr}N?YF:xiQꗲh4f"aF¸??x_kw90Lװ@rz~mD# 6+}h |>GU N-fޢEl:RJa-?Ͽ_ \8[po >jb1&(CȨ| 3(.xedˏ=#+XP'x2%ze'@nfn҆2iզIКvWkr&Z0b,竰RNeTfi22A8+-v׆-dqwW"111,"KPD,:3 qOXHR& "ʦz!CfHd *P\4@Dd%M ?א8n¦T-%6ˣp*Zk&^HDgwimrb;~;F['^͎~f.ֶCd{-ctUngq}e*&WK1D%s} R[_4 u͢GƜ%yϰ'7'嚶e4Ğ^ |T {=@p<n=[_K!s,gwٽ}#n`Χ0ןzixO<22cN@ = $U,duik}:Ԣ@ZuZlM.RRKQfqIaI5r|OfFpcl!2ֈ4N;9#mn ]|.[!S";U`=d  'Ҧ<Ϯ *?2T "k]?^""\K^)fP6wq87h@ &Iע)j#HMk7'8{J_ V|dlI!B3Y&n?_'Xy]|X1+ 3MacJd* 2S \8G{=wyb 3GCI[[Gxg[XqʃOÐ9R&MY"̠L"RD=m.cq[5~˩5UE$/D*S @vy0Z񎫙5MrZ-aټ3fxO<"16@sKZDn<`"ճ4~ҦRrnY3XĘĵ9ȱC e$l\!x  rEvU^73ks$m1+Nr`h"?ZEL5ĪskӞ1 ?VW|A6(ya1k.~?+WB@Jq#ұ=,o\ѝn1N*Mˆ b2fuF9TA*f̺K*sd{pf.K]KM+} mݧYx^z0/}_ !%:J7d =%C)}z;H,P˴iԆ+)/ oLz Qd$:f/s*i;lC,*ՆI%&P G#`ebTP+$i#\CӲϡiWO<:]_Vb&4k#p\zISZpVkGfܱ$,7>h|wb1#Xd,-MW2O+lcOZ-LɼX!bRV!]6y"`޽jg8GmGӾ ٮp|n%]H[J}v˧752`)5ԉշ\Myý.Z-f'o~;| >4yGH \Fu=YΟP zNp|}ͬEˤX$аvTZS39I>EAJ{)a{BQFEm9Ago Su.nc/WBO<*IȏW7, m8@=3l&)> ␶XY`flYBYЇ$"lJ,FkJ)Rըt"kv̲׉T24R!se2K25̴e'_栮Z H%o>|I4M4M{1:k}Op T8'c~(_\H[J9_|D)zY} O9Id&xL ˚Yִ>/1m9pSc;ۯαK4U^G1BT”V,AKKܿbEL&W2L ۽Nك^%lE3@b?+~>kڨ Gz8!vvj,|#dai?O-f¥52m[?i~zOlWO"~ L ܲixQh r}v"7'Ȫynn_9[=˧frU5UbBb3T ^ꃤ8뇛DCB.dRclМ^ΛLXA~&;dez

w|%~P0n`AKRd)_ _~GU]s0T4|½9Aj7\_;'olzw#U,ikV0~)@iq#_/LµY,@(#X(y?_+ҳx'S>&:|n^eIxl$v_"LX IDATU!s!Gn}Ȕ{YmJu담({n:VCZNj"|YTJS3< ?i2]KGXJdZ 6dɒ$4|͜lB~,' ~X- ʦh7OE@p5(]Xq9OSj֢ jxϻP8Mb9p*Ze46@C¾7q9Wuc$# 2(#A_d(FU1p Ce,i !hIhRDGjhtTūY_Ws"Dbl(dyu"x{VBf2zgBq&Si6s/}Mx'xdɣ=|:~ĩVբpI:Z~FOHjG(iˁw14BCSjH#!پak[ԧDDeSzV]\ F a5\R"Ty@!%AE|,qӌ"ZqənP.^!' r0B㛨{B2ͧBMѪpdDtnv:='x':E$Ғ9^Ho-nhf)=UwƆK [0K FnΒ|As ҉S]*`1r@A<+-Db'I]\~*]J-j2 ⩸./dR tZ@:ɳ4hlj*;X^w[=5x'x2LQ9|/rhHZ'OFۮ F'XJum:aB"V"uƑ̻?VvieSm8,6U>|<'x'SA&(Pm9yzLBV/\ԲmH|DN,L1]+rH=0^bdkҮbqdF¬:rKMl'ے^RKy殰A)~ &S6xbDe~2'<[_`ꪂȅg#ɜB^^jO<O<+ 0&=װRXӱI Ub*\%YME 񭓜81nz 7kߺڏ)'xKG~*ORx[ d9HDNVx0ݺ%a;r*[GdSکIi T*[$$87Y*5frt.=#l y:%U K_8sօ_ewPUarrp2Nowr ,Rc%" 36m}8 x'x{[&}Z.(@׉JD2|i}ZcM^Y\̔k Dl$]~QJVA~UV(*, h)^/,;! ~-tӊb ͚:rq^ tQpq ˝>j ʕ)ʦ*_,7wq²B/O<ē)eZ ȍs T6}rݚ y:K Qr|xPj^TAlŐܝKW[oM I_;3_ZuXұວ-Ji&TN▂WR[g­Y!@vyD{&vF,J|ʶŇ(ܗ:bWy`y'x2E"zYzxS)]H2#+ ͚)+/i.RߗbvlfTyPKR=-,` T6?k0RșXEJ80y1͂58ޘ wn9l>7ң90)O$TpɚJMz{'x!i~8)i{'9`\025ZZ87/C+QQsLfழe!W,DAӜٳx]TD̬\+- HdBZtЊM[DR rۼr Z!P'-*&~C6N}û)dMlݬ c*R ̱^'x'S|rN1guJ\׫8SºՒȆ%RZ]as( d6%AfI$e]20\!t"5^c'I.wH?LfpK&T gO˫VH)I OUErL]jV'g҃AAKTko>q|$m̋O>KxNzY$(5'e}dFj$S-* Q6e!}@N Nno46Vyݰs\+',5:8myT b:f*_iD!vch3لZ*G{^E|X1nps*VϗPyXx'Lݩ9&qݥ(]J Q@,;V6/d YAJJ)H(3.cHK/3ʵ4N3j:*S2I2cf  8Keg`NjN&&aeuR&#=8m:IX^бδ>oTF\Ǟ7呧w0dI݃9v4?eztcH$~̎ o ~O@T-ɼO6H;3WYv1m3|ωH".j e細deʟIm-&E8Xxieƥl$,; --Cf!Q tze&r%"t?6̚0O#X5k>ؒ-SLHw'Õөb ::Hc¶B8}=}P"-$g:r{]WYIeYh|FH?xIkLJ/g~beN lM284H"H]gU2r$&qKQ[ Rw'erNU $Cs-L79VBtG~nٲҤkGd+溂Iiuɶr%0 1 WDO ݱ2_:m^ ic~” >GGgKB#})ͰaibFu2~!xI< _I^TY%A) >:J+Y]2755Q.I<(Y_0@Mc_s_߯A|P}k,f#'SDo-kjo2w;|0>"7ȵ g៲J&%1VB!)ԔJEVN"m}_K|3*Tɝ@n$=݋ʩ-TT| d`w J'{jFy[ZZi{;KT|KM*=k4RyHXs-, ܘKG늠hnWF~ؾӃJͣ"G zme Tg0OfQ #6ʹ㕣=D 3]-V+-G8s14jňJ37"Os۫N fV4"r譍s4ÆFYB*:(cvk~@CGF =2±mϲ @r:KZ1eNmg7y)΋ּuwi6s N`Z+W>D;_|Pªe P6픟>%װWt3da&t|rϬ7xFp3gN3dm^mᅳڀsl?~QGmM.àe*Cgn^{k/ T(*O=1lbs 4^ Ш~mkk;N+a_Nv:N@Une<ˮ12.(=9~k?-?=KehwkRoGWPJn*Z9J=v]7\?ӲnzB*;o$8azZ

?|.3Ĵ(>ÛOo~Ńy/q1>z8gO0T~S<-ShnibZ9^zdgc*Ι^mT74Wy HG'i#}^N3ˏ4<JꩫFctj|xg80`'mѾ'_}W)B/EYu5MNCC5LءwhTNsS=#yǏs8;ɮ÷ψLr'x^>Ƀ 6Rl|Kx=<9磹0lb; iēm=s=POsK9v %$_eF+Gfɇ~ΡϠ5Gz}}m :.PJp1uS˾S]@Cm%-L > o] n"~(CuMwCܴ*L }a3f'>t*$6|'~!&,? 4@4P&Y^ AjZͽ!Lμ4tV\qp'۸mqf:nSq5A3rqO< w.eɆ919z˕|baC4I\8_o|UιYp3lE+pÍ70<FsYwrh.] r;Ao& yMϔgsS,0=ȭ{^BXsqgEϜJ^}}o,h2xc/㤗wU=vfׄf]s`7o@u_;2_f[?wI"ȧ?}#j=v&Ng7| |pY-!$7_< A ԃ2umqh0u"# ] *TƬUY Զ.`UvzАT;DC2T[%053f: ]JMɽ.~faI]RϬP,Z6Ϲ=|˨FhjK, Ӕ7>K1էsOLT.^ˢՋ eȝ@,Cy(y4V6dwGE.q̨# XU˜kRIBYN~GiF5:-}%s$hU,GsKYDŬZZG؟}>afNd  &̛Y'Rc]̲85J,(4cOvA}j_>~|hTW 2BL_\]~Hu+-sZ.]7 "DQKbra"!ȴ~ݬ$XURI||BYоb'YKo`)-*tӦ_媐$S|ą2P%Ā?# 8B5fyb@Le91]-r21 M\m1j3蓖*ٞ>}{Gɕ{߫97FL 8!8e%J$zYx׶LKHJ ")è$AΩht߽GW^f꽛޽/}@J_,O(Çio֙5!<~W3E:!Z;6pV$-&+qϽR*G~A/DO!Qw3~yn2էb?ڮ'9:7R\P%PBA亄O)Ha̭)>ǿs\ےf_M0 WVECj7w7ةOp-϶ `,\q_?2o64ˡ$@K8펑}o2"9ӄ:70`X%Q"K[Ppȧx낿96jcݔSSK>>Q@7lv7UFadߜ$bJiʡ RfT'vMZpyYה.XO(dQ ^Ԏrm&B$ i]pi< ~"7\ S;ڐB4褣ΎaMf}G3Lj ?mmmQgR\87ࣟOo+$~3V@/2Hb) n&qn|lB 01YʵE̶6"df:Jζ8WNez1J0q_̒ҥ .eaY}~25zi ηr,DZ@Rqb),`+ 'IgvG XK>; XE"1ԢA[ιRDNq.5mY.%s8I-JyIV"b)B<\r:g9 W>3XV6:LO$%L(5dRRK\}^ DlK ljӡb\|$V|krZ a^&H;{3'">gnJJqS^6u0>v-!c%c,[.oag<ƵN"g1$e)TbWrvqgﰴQgcO [ri*j[Vh) mWѺtoܹtGI8I'=Dz,^ώr' wY0 YhS$ KVBMvI8:BsXW6E֟^Cz"RՐmxxoM S,1h?>&&߿}`b['HE>߉}ZC?gM`ab&\HWS|~#Bbg6u6|o;h3?oN'Yf\I3]b%<ٺS@bG9L@"-Rw׳sN|/|/>*73LM#w~淿S_`-I-yK_̎>LsO2F:_;_Wز,85:@kx7_3b7M3ϳ!AlF~rNcI sn/;Ai.(R'Y8w|G7kz1yw(_o]~Wo0L'{tN/Σ56O߁bw7s?3,]mb7_xXqeR ! D~#7-&ua0ycmlt. w<ٿ~%Mֵ>ѱ/-zcm&ba O?\?k&aN_t ~zNMo6N7Vx[{S0v&枏pWA;bS ^ \y7Ok[݃& I]k٭ϳ{C+ ɄXtƕ%da\^\/W@ZTLǥ`Y\Wpȩ]}]A*Y̯Ne[+PΜOLP9pXJ *笆WJQW -FM`xn}uI\PVШϊ]M?2?X_偑6 И#aMUomtLn,$фܵ utG"9`W(,Vv9UA~֬!O( 1v;a`x5rh"gyF gݶD$][mfZ B}}DBk`-At&B GZbuI{<чX7ᾖe!{/$PQ e)G dzMa` M2Bְn6B B=RKhkwkEx4"H>CLG ˚ՃDYJI6̚>֯K(?ڇ@J=!^-sD餙kٽuK{xMt#gt#;L5JwxtN֭5khѓ&4Jχ 1u [Gsh͏|Oo襧G*ѳ1~ -Ls(-#H_5I8Bs>3DWIbI7lYNt)A"V7lgz}InL#o" G&2;C_(O=fL?(O] wE?Hk֬Ͽ@,2Y1>~,S5CsDS&m<'=ױ=B"NJhg@|xv $fOo A)34DGiPS`])*g}xrs>.6e &YXv?3lȯ!nF#ģq ?݃ԳypP!:~ M= t2aqۧce]@(wYJ-rV94_A*Jޚ|z!@E+ۄϑJS:(USRڣEBECSW^WltU )j=9םO:;S—נ8颢tM>r-NJb8Nˌ*qMcS2Qͽ˃fP\G '6/X $_0PGOޛZS+OGWE2 !3 ̾]z8ʞgvprOΖlY$5å/ӳ/o!lǞi+A*z[JpEnG`S!<_gg+I~㹯1~>LFEeKd:߻ ױ"h‹f·^۵ӣ y ugKݣY=ֵӘ1' fg9鵥XK((Gom94x̕y倾ahV{U3I"ْKLMM ?Gu;Z!EƯ]wX9G%1TpK7 [ b[XD8ƱQrF]򩗭p}dz A%If9 ȐQ`K߫9D:QIbV?)ո4˓JO|^3`FJ|\G%EjgɁEqNJ{Hp,6NTq/O<E($C~WxB,}z/݁2RM1 ; WЛ2?i<ŋu~:/|b=Dƴ">2_q4?g?õM. @g,ML5dFk%\ I$Bkbꈚ.F:gn.x"U\!Nt_ Q۬)M t2`r7 |EUX`uqgŠS9dT gOYr[+6OMA?1HHO/ha?PCaB$ ۽qskdr {YUQI摆|ze^˨pKS@(<unFD?`ַHh-ҬUQ ]%EM@l""\ՕX# 1eW9r='B8e ̱vƱv='{~%LG0wh y*[(m$DMV-NB/CXD;pI3bh`Ip]eu>=%jժ2NHъdX>]:"sU7XԽczԲ<嫞W uϕsp*`eTps MGDkRe|JH&S^X'x=*Zgc@ʁw4TkJQ/yʣ;q*rjH-*ٽ flj^?*Zj:>S.eXv-yǨT}]!NP:C Zːr)mV,/uk|5T7_|=|>ڎwJOi}³/y'8sikn4S얘jg\*JQD4KFݳ=J`j.6g+akia*eLt)R[5ܻrY+˪87hu,{C v…ȸf+ff˵g9nʅdîYjLqe*;I4Twm:3O/X^i-ߜ?5{,#JG/mOCµXpKc&YpDq*ʻcITgB^#?KlDS}LFse|ם*+ej&UR߳[TE]U?Q\~^wBMLť|˯& Ѷy6oޅ]J9}msw(x'4 oU1Gb]Ԇsw6ߌIJ'ީ] IDATueJkIt3rW.*jWaC(h 5ojapJݴ ¥_ż} (Տl,vq!.ȋ ׹z2$3căX@;ݰ?m5Z+n]ܭ9aBW8}8'GyV:oYՄX?$1WgI*a7-\dvv%ũqtZF" ffMk-X%5~k1,wp Bs'&4Z B Zt> Z#Aִ"DHA+Dk4ʭ$4/&X O(f-+Q浤%s)R +HH26`6(|)FH6X˷SC"aGXIO&Kjtl1y)<ҖFsQSYj pۅnMȑ.})=ur3K.WXQD)V5pC)^ܼbT - @Ϭe u9ZNuu4bi*BSmc Qb1W^)tfnW _'_$z-F_d'1zf_%Lg_oz {>y 卟q1{{LԻqSM^{̴%@-N,ɧ^w??Negy%Wc )ٷo'3h_9D!nkbKM<@<6OoqcQfjޢwm#1~m6wط 5mg91ſZ&[߹w'<"\qe*AhՒ{U|2U!؅nQ {GF䪢+5KU@^i26lƂ5B,ʖ -UouI@ ˙DI/3s!e$nij6)~uNbū`Iچ6?Ć ]78d\'Dc׆/Ȼyu]RχiZ|>|>0MLAR]0܃ 0{wS/.\o6FJ 68O!4ؼw;ΌGG銄*ª$⠃%ԖJ8t|syޜ$$RgnQ;tkI$+n'PhA__j/(I.5 %2IJ0S B2x-•i~r-C ߹ȍ$c4g`($5pc_v0cvYK>>YMx|7f$ɔ i0`x #eU.6M ؎ҧ( 8^5kĽ\D$K&JpyT?ҁ=i4[ZUꩂ^Qi)X&Ru+#qu Nw VЗJk܃V|g+ MؚLC t:+O/O3nh] F8Zl!hE<=3|@ppwӟ^1>FZ%b@4S1~?[6Dx (0DC,MN']-lsx,E*cV@obi&ӐR>Pz-g uK C7LB+n g_g aʐi|7DDxl ų~x'd/.S WUQwȨ>mϽ+P8GTjdFZQ"sa>f9v#{K5h H-b<1 "R-/WCئG֪$w]|Xe AE@u%KsoͰ -fi "tB}a'~όrtM"5:FJK|r_gtGXd$F@|~3,|M#}9 Jk ~`LBSfh] !>6ɋ_g ;#uMHk ;:3(g!m}ͤ _g4f$Ho@4g[ئ$(צ-]- ,] dKI`Faa13<'xަC+6j^IDU.WTyaӗ׎!uTwxa+X?~.`6nal kX9OM jy wULJ1lG,4ύ\Lr2qnA1nm\n1Q8-!)vCj^?"ߔdgřGHfr;έ)֞9ɛ/3VBS/҉afMNKei]'?"Kϲ'IyXK+ק״er8*ttJ1;$f}d-oejϯ=1@O8@^ͳ,,ޚL\6gѺ6-It2-֮} !P)H G[ 3VX;~x2EgOFio$Fk]ִ,cV40J)Vk[b`  tb)`p#-o%ta>.L66u HIC~> Dط*Lg@z='|'YλNW5,ps.emARPTjzw(Oyd3wSmJ {(dםO:;P5:}dii^.YVP*a,2.Z۸;hEÏR1i2Un5{d]ug>T.`%:=_`ߏ!!e&pK3Hte_5fϤerUQkQ:hRXJFa{hB]Z뼫Ftv)BbbY~Y7gH)"=LouJ)"ג".ɦ7\&RfګtFۗVk ye 0ͺe'xr$o2~19 ܻ$D $v׬Fj0U1Mmd6:RY>_GUvI &TA(4߿CTͽ5]].D@OXm;Is+9'U}[&s!.&uYԾ4}H)|Ž)S{, B4pUBd5!ْ)(Qr es[kK4)Qr3O5}ON8j}x{}Uiݭ XK~O<2inNzQl^-T ZFzxi"M@bɇȇ՟eCUݧ<03JVjQ5 !ɂ%j\ N7n (K,Z-6';c%6C{ӤXJդcK@Wc*T-'O5'x}*Ρsi(YA*2L:T"J`ܽ,h,V&ڛ+'xJCvE¿7ZnH{Wq(~n]UԳWi|w:ñ^ U PZiBeK:5;xw9͕܍jB,iKvkn5Ww66hPK8'x'+IAi]Ib+0<.% sa(pGj []w[>btNH-'6l*J֚Kr g7=(ܮ9 ^? qJY9r֪f+EsvU/{f> 'x'+%Zqпw*7+pKŧ?wtBΏR1'>İ W#VV! [++iF=QמYKvK{V-˧(S62 ;3E.'x'(/['A8gۮÅnX9+V_n yYfF_։ _*s&ƀqsq)}Ƃ grڕAq є`j&47pm z YzO<OV:0rmkK՛}W: Y  Z$m4Zq)C@ģpTUCB6:MV#ofǶ4|dMJpV~eϳj-"q܋W$2c?TUH:t#rΙ8zF&ii$FD$:BTS <6FC$d5& ^868X4}d8%"3w2Sվ Au]{1 x'  n.::GD?PݣD. rj5ZY/ĉ/u Wg 3x],6+N\Fm#/pi>vWFBm̕'x wJnXnzDD^"EkpE)vitS񣛄*, ,_׮! s$*[&h Gh#$Y,Dsլ/kjO<OVVJIzxO2|O}'d&MJ,3Ș˞9z)&vHK.Ejg'+`9‹[N k4Zj9CfTS!?{# x'(Uޭr@]>H%qE6GaQDUE6h}e"m9PҜiFkǵ$Aͬ!tx6SsӜ5 +%'x'vk!IV;.u<){Yeosd캹ʫVITE,mc\[;oY޷Km"I҅ksNmmVh 1zu@<OUW=h#d'HΊ-^8pZ5bx}m^R+ۨ[Y4Ģ~H[#y'x,W9ȘׯF&UKJF ]^!Kcd놸% Z5K`ōЮ]{ 4v C͈^Ǡn[+A~n#-J̗mfA[gCK-'xsZ,n8ɮ*EWN/rځ 2,ynƿ87_*Éut,{MϢSl6vQ5ME#3<@uX 7ـ[Uz{wsR$ ֵ`%O0=2'xrONN Q;Ӆ2Rn IDATFȍr^;`<1E.5PH RraV^偡(`A,'Id|4֝ZnK IԨ(%F|A%e4*:,Et*ɕW;2_Ad8x'xrHwvHvpDWv`? =h^<ʒue'5d80s [L.pbyŬnVfc/ggڵR{[Yޜ Ukd ֢zk}gFjGD8*Ǻޱj'ʐZ_j,e~ZC|.f8@*j"6mM@'=%'xI-2oJ"_?8tS:PY#r"P쑒XW ũy|Eq%w/M`RůehM}Jl "IB#i-3]ox}wrm&Jt'dRJX3ĦSW (c^/O<ē@Dzq9*5+nsE",2gt-6fik[Z#s-ZgG>[]fWQ1L|rfbYԴz ^ uvYisAbuj8 ֓JҜwXֺKel(mL4R,g9w8w-0uaok+ZvHF-=;sX:K`: TaY0$H P"i >?XnkRaӤY b)IPV i1 [_ьvX(K! 3wlۄV$31Wʲ@LAmUM0LLP&`i +ۇ)(aIX$Q I*~|lR&O^OLGֶNT%֙vL*~9=/˰γ* k+A<04QTZ_yd\V(+}.U•O][g\ R6JRkʗԎF sgCTTɍmýhZx'εfX@WcLoYbd_''?1Ǎ7fIY e 2w#Fl*UiNbGbN1 Clrmajػ} cLX:72Ka uqߞ=ùNM_$Vw\Eok:{ }Zxm^{|~@xGyuZVfpn'xo .&hhm Wb|ꥳ_3O%H[߄F_ᵿ.ݹW0&6+8~~}7lrǹζ r!Ns DSCFZ7~ɮ- xe-/L\LO0ME{[6i 3tv ,+q4;?<!j*ZsCoO22<򞄛i =7Y̳f@ƿ#8I8W}jB4rJ4f wVW"Des+ƪ& *]ԥZ6^@yΕ i$8GF4E%>>&R;!;ĖfXߏV)KpŖCD&:6y?lg iMd&>DwO?N_G+>C$1`#[BKAd*ei~B()7ض>XgibaI#%J)-%~SŰ4C>0tKt2+$b~P.)R 8v!"3>5Ýgd~?iom)&ZY$q 3o'47};Q*>8MnXHc>$玝/́dH/X p1qaq~!! 3CJNL*|>_"[il:#l…3\8=}=O$Y\#I(Jdx"B ~4oGdPќزR;gBO:LgJHZmP|~Кht ˲0̴eɊpQ!Չ/B R),eR)Ja #x0 JƀhZ:=LCp\E7E]t(#S({A@N`e.3j-"r>)y+EQ@qed0i@k…WWĀAtjR8uP3f FuByb&_\FRFIvY[Pkf}İGʼn8:`%ӇOP M[?nƋj=4_ DwmiWc|y6˸q&O_d1`ڸC6B-tۚ/LϿؼAg`Y6XU\:G9E"܋x#]7!wme8s{5R}ɄAp:#WƧ8=ǹquc͜z;г{pInX߳q#7 !ZS$ߺѓ1$7ʶa7^}C{ymnZw`?)ν> XЏύYnKq\0@Oq&RϟV͠4[N_7_fd#lHp#n3`W8z,RݞDm&PԴF:B>Z=$^ 'Lv,z~fO().y;W eSgcWV/Bl&ofmX2m:i  _.ɩIAB).x*ݫ9Or!N]iO l^h'DgWcs'qS7+[kN[+S9$sxYG-%n~6.h[A֨Dd&KQt |[:}PT.$xFb4z tUlvG:~`F6 9v7dk$g5;f^5y)ֹhKA bҷ>:i և\&=c Gqׯ]abr8W%JfXC? 22vb)9],7] M,:,gKK1cPv63п=2ۆlFU[~ģ(k6f#?(W.ʡcL]$ L:ϑǙg;Td<>C78w:Nfrͣ$Lαq!=u|/+/Unse7>ɦm06?̎d(5ģ ܼqkƈB]Xi&gQZ_c͡SL-IeYݹՉ(w>aˀ$34 Ij69=Ks;֎r䝓.JDY(C-Q~L2?{hܜbaa1=پurjb,orvmѢ8z~3odxx}u2!VmcʹD,ܸMCôo01>V[8a6ƶ'??hE' HEOO^bivybaW`O6l5?3wnqn]ױ> #)^=>šJmwG_:Lg M01 pm"s ff`k>B!vG p{7iV|@66؎% Lpƪcqn_- 62ꋜD!o¶͛ظC/fqP`bQnd1>"asB,P\9 a XT趍C5gLUk2DOo'InY ZXÖ5k1Szwɛ.&YF@ iBیGGww~%>ġ7i]n0?'Y;/8% \KP{pIm#an0?;rI~5%cf ԩlP̐;-4l#֏J9Jaq;B2Z8S/ ӈ !gLG5Ƴ]lQ~9?_iDu]HTf_ Z`a彩ɴI%ע^4n"MAl&Ji-q9tmQ@Ϯ'6K hGR,.H(J."y!=C{1HZ&4YQѺ4g aN~ɖʹe>;R,-Z,E2ktj_%[GBL_>ɹ{4Q~?] bdx HLnSHD&RJ>?TNE,"T2Ak0?A .0M3fSts)L͏ڑ;ҙt" (,Ja(jjf;(,?{o,q߉}2>wΛ7'\(" XZ:v Y+ u/8c#ddžc?H-QER<"q`xwU;++ߛS!b^wWUVVV=>IvN p4(l\>OcLkH.J!Y(SFI8SskQ;< <Ž kWq8o tGgn7K8 nC` ô[ҕwq{C"VN:a(s/~nL=pWB)<ׁi[x!LȮ-Pv/ qҭ ^~E!KrѬA l"~ԮH$w`401e|K%š&*Hr/Ke dD8k> } F)rHb%f8Xm 0tMpuTT=x}5݅Ƚ$b !>h@eYYܽJ̑$VAiq t \kbq]4&GgY x$1 Gho\@VM 0^/!YHA^XT39yTI"!0Jͩ4 aF IR;~쐼Rt1ObL貐 .mx*X"(CmԱGR!^5u6 S0?=OOaf9|7q{B>iz -0`ʠ1=_߹?Z>ch%,,ܾ1~qms|׾#OPBv~'a°`nAMoؾyCƃja<9~oy}`xw7j"! ܨށWçF {ɀ!&MC|&UL.H.;ČUJSVcJް<4dA\!r@{Sw=Q)*HDKt豊nEV:O A$#SWbF K;@+hܶTC(GYqw"_$&z3P! vqw5TU WD h7jh9.8 "*E0J9-ԫh{ij o[SG^Giù.Cs(Zc!v -σV}z ̴P,OkQU`(swѬm%! sjTlh90/R(AGQ1,ضU8 .Q 4MX" wA4);q a#g\gÙ;8 8:ROT#Ǖ<ҝx=~3J^J辇f2nnC,+\/] B[k"m øPLξiLP"֛l-h #0i2P 0Wy"{H xB,B:kd9 "iauDE:L9!{M0F.ʶ4B4,bmEGʶ sοwQ]Qf=m3Pٛ˸{ƲǶJ6J;rjuXjص0ò K ׯh^xBd&ApX[vE2cZ U/d%, <N#rFNRPly'AzB)p$DH9)^]W"xjtS-I\/|@! Yǜd$s8\C[>-W6qY6ÕW <y)a c2n~MsqB@xbbP8)(L28ǦT>Ea$~Nސ0 _ƢKG$WAb9GtwZ3.6eS&אQ$__Fl>n >8zJ0|AY9lBQͤC?umT2mJ"L\p هІE'*eB3mn8^]$KuN2w_9wÂ?`1Y @=/ȗ{Y7.DlUb 9⠽% 2( 'J<4]Iw>XVaVy'bo$"tI'O٠%}H_6iٻ]s@L1qqJ P++kE dh|? 4S"BPv#CDW{fbK,\͝N}pL$tNs4sU4R;LP SRսp0h. %D'#5!2 iᓐr\D-c " $Ad"j kmIIp]dz9,6<#nHF&>qqqԵ^1^3^u^۪;p?V"A]5Zͭ ຼOW| yP\}\!Dv>&}:\ ߋ*d3)HtI܃&8/UN+DR52B RX}! LhoChg2,\/%/Fm2хg' kvIl.!K%ty 1˄LdG1qqlO aEQy xB 8@ !!ׄPϐB"^\ /$EĨ('ǡY}1MʞT.=xr|=+k#j,*(ǫE2⃃!,B<}#x@tq: Y-4 ?$jVBytYϠ~,镽TCS30A%A3n6n6n㶵-PpC,:{8'DN̯'eYK*(F>9I=*ңo'ݫ=s1t$DN' yy82ɠx) DAsD,UETK/G4os9M [ZuyȲI "UD/ i6DrDz\lje>SH)=@Ga<1n6n9f[DwE=*4Pg00BR TRi̯okN &"%i&Ƀ%:9#A-{xʱE Kj&נWhl' =J\4&A{jX7@P/c0tWBqn$-,SN*IH-(ˎ\k#c/Os`x㥶'<0@K-'DvEȘޯ x<8]E0N%r8 pn?$nlhBo!i,ɶsUAdoPi!λ9DDx1B m}/Ht<A`It'J-Wr/{T8Ƀ=DuITA18DԩX*.{,~Pq p)r9#\32A,xXsO\)m(QR)%L CAE-8:.a( vBOpɓ( x!ӏBZkjcTmmF uL`gniqmTELOcA @)GPg=j-Zi⪄c(R|K :\ r>CAWB.u/зF qzBs_:ݸӮ'zaJ$q1{ ` !jUӻnp;].W~c()H&z92~R:2&{sЬo[0Pkk80*`0zu( &>kjPmѽM/Bs @!I_HT#*5IW3[.M%p=vI@'-|ﴪ)'`?n' "F4W2 U_z!43xZ"&$ Qv$~N^dlPK&O')5 O4:YCtGY v6ճ[5Nc2 .cuu'OmY5L 1A8t[Xb:&CT88 b;j %I../-;Urr>e3A5Lx ܉UAudvACC4CJ/<&|4* gYfNSuw/dwxd-$361iApBaZ9v}. pu |QZ- f'yƶCGo<M[-iz-3MD,+)$oy4v{e^pFkXHC;0&ZD\v|mRժ,,< ":Q/6ԥVaWxJU,z*<0r1I"wWRBM*,YwZp 2{ZQVu,uf:#`m `yy}t>8 Nq8v,O}3;F{|qfKPmoK`_r?:<{)T9s*E3G3hggn:>FMx;'Qo>;ط0m^A`)6۶qV !`9LMO#_!!jq]xJ2T*(X^b 1F"uvl$Ͷ6nC,*r ؝Sp.X -lBDrLu4H7w<!\J'CfE3SZE\J}?\#@C5 .PȞ.fL<_%$ T; D$4g;L8pYXsIk!d!m]g6P %X\܁D jKK+xC0 Or\!޽rVBQ=ΗOa21xg֪X]]A݆a@qq095xk=7.FD~Ԭ}17~Ɨ-JCy}0(~UZ8o of78c# Թ{! 9@`4(x~yr xkYlf&8`Ml+cp62 t*`6 îj*VW`Y ",ӄyjjh6h6!Lo& 0|4z0b!qhKFP:5Ep8~P2GTR+ܷ7>> U{KHkL&q )=D&yW"$KB,tm{ۢGK:$uKJDLAjr9UG8AO\9pO5~H}侺}P?WCt)?7SN\M?g,kKa> M~i[+5=Hu~ +2 !xMY;okGf4;gR juݻ eƂP!K\A1.,Wpc}*҉Q*F|PU}_rbbZqP(Y<ex7VJ<oc74an)LUq'X[2!got{||{g&Y5a`ԳzԀ+!V"F {F>jIRB`2[&ޥI4EG&,WY<8 B Jp]Z ӆa R)Z6v؁|'dyyzֽФ3[xh\0]LҀr7ojw?ӌqlwͲm EkZE^1!sRBZ-TkU d 9o!r<̹pKh6099j+ !Ph{BP(畅 -Sx \yo :JhC!UІh0p>LpxEр8) l\-T£a_?8{%!U]pm ESŕ~>Xÿ_A`gjcOО>çNZ-w_z oſQ\<^{}<4&sn w?y=^ sKINޜ2͎EP5.hBa߅ ߃tSxݸэP|_!@g^ק۳x]ؓ]yT$<0?_˕>Rxz*c R|=pM D@b'˲>jdlfW.BDj {Xc͉q!}9hRZ’4tJh->K3ՆGvI6̺Lp8.L6Z |㑽Q[y?+qw\{}m??FN?4N<ɉh8v0055#$7 Z- y1 f.:uSx`uzi~vô<|rcg?ƍ[7`z?$=G'W`րyp&J,j \!ׁRQ.oB PY;k~Jq% 8owZf&m>5_wxU c ߢLDP= ]Amc;W@8k5# f(' 8Km<{Ai 0 a&dUFxQDTB` N?x}ve'xj ܽYPT]4]VFf+ETW`mb~~\z3?׮^AV )LOA!Ps}x{<"lwWEMhj&ѪUp)fJpnbIsq' iW޼oo`nrചi8F]k'(i#^[mdg܎CQ'^8k. *ϨL.<%ٔ+v])h z@L}5R_"Ppu@TP@-2c:KpTNUAP]#mEb4BR^S%=(j0n9 `qťWz"UDnhNXiry=?֬oIV6K'5KX-lԨ5hEgU`YpU\ǐ mUlD?""Ϧjl(82i8![D!-*.ۿEm"Pݨ2윍i,[e;wG@5`3J_>q/h],7 R,..oVWW B12M(lF*cT*1^Uò,0f&(zzsObiu E`<J ڏp%}X|><߂mرcOJ'w¦5joI R8;FVJtHY7\JkW=!zg,myෟ{-X[ۖ:  5;6PUA(s} oGXC'P,Obrrs {b(J\͙!!$ %?x\`Ͼ ïi<#nWίc+pWc>2gvWnѼ#1e!Ct1#ۨ#Sw@#2LX޽exS(Nw΂ ;4 r ??{5|Kҭ5|%r{f۶qgbFj]Ɛj CX脺4KI5mf 7_F<P7;SRX3O?;9GBYc%h;EmSDu޻%Xk:xpR9pr朻h7X]YFq0UT5̾5 an~ b~-V666y&+STR4{ i$^IO1;-4A11=4aye9#ǟ{ X2L0)E(Mpr(8H?WQ1?W Ec8z88s}ZQb׾yZuԛn|;i`r& y3w3Dv a^Qp?:3P#Pൻ V }1VV@/Hi$bv5X@hx *ipXHFS;ҾQ/ J$K'9K# 'Z6OG[Uns#F6*ElyߢYjX/p= &!N,w`[{F-"q,TT{^:*<"I*33З Ͱr69J ,/`}dx x~\{:~uqBc*ݙ{_?'?`G0j"g9yb0Jf{kN5uF(&rAR i䱗Î 񕥈RtI %~T# ӹDEeg>1U%}z^ ":*h8DJ3[>vjCB4Sw Lк]5wQ *AX4hI7  HaLIfcCX]G& V]lI&/OZP֒4TU ϵIRI5Džk =exo߾+WСطw/^q#V{[I|x.޻tMdw M&D8 ;_:B) efAFZ#8Aez_qyfln7:*y=j9os!BL'c@< |I߄s*E}hLadどBRK[(sQUa0b / avn66ֱi#ǏIG/s_͉s8(,˂a`Sῧv[<^ ->yàOڷ v~rSG:3BH\o)Gn>"ı'ޏ׺ GBdwB QsCžև\Ș& &γ!g;]"E ď"b3Ag:{m2^{RNGj_:D*& gKh韤֝][I*Ws9EȇA{.a?[j*K;HpȸJ2蕴$^<9%"ɒIUHH|QO@pF f1H%Oz_$I(LDd{<49($Q)m.ctۗ1b6cp\\ߏd8C )]t5~PX=ܯ_4\! [ǘD:DH2FtD :gFBD(Kdx#2SgA/&PMDo K2&yG}o K!<D&ϋM笞$FVܦ) H  'Б<G۸۸}~zrI"B)*nRHV/Kp*/ b0hޯ[ѣ A Ёջ5Ӊ.9, *-"ĮUHn?ċ}؜ }/O"$N e0+M4](R}x$侒U _JLʹ"/rȘ}۸۸e@D{yP# { DSܰY@'՝I(Ư7H޵k$ڻ*I\=  UBzgߜB:%' Lhթ/iCR\Ć-FFǂW]t8"kmmܶ.xc`'e# $@^!Pwj]2eCCyDQ<R~J ě]IGB8W_k)E Dt(2 A8BUYKK3+낐J"%kôI,Ie(Dln!¤VzK3Ҁ]M-T"mH*utfVVyi4'rU!jQ0n6n6nۣo+q Yy%]2 [UoJ*wZks*O&BR peHRԏNяV%=xaOJ"$<H\sdP8)`R %ViHMs.imG c7|; RjT3qq}?D`ਜn6HZ]o?](F ުr""b'!#FRٷoB#$;cFѩX"$#93P&A>>-5iIRfʣ|04CI=gX/ܬ0-y׽&!IiROMཱ Ց]$_vT>&DgVu.%M?s (ϕ<קiǬy>mKg1^ hDAFL !1xL͚eJ!$uPHt%T8ElHըyVZJIIAR>zxIӜe|ylm`ڢ!KwzR2D研csX{̠=_=Q#qD;ɹg=WJu>Wm|r$[Fح>קy.B|L!ՙ>?yIv]^dO&!WKi 2h ]|kry #JtN IDAT9SV]pFMP!4qXJ b`rixR6i}еIG;,qinI?h#[x,+f3!=8ԪK6E;:J`tVE[`Ǥ 26d[V)ḻր5R)L iݪs}ZP)h=ۡdm dHD'P 5RZ89uV=!]1-ˡVqzT0W1(l^˔e M8ĪĊ>%:`e֣$I,MlDK>AD_;1H[0ƽ`x&tˇ* s˷eĖ#G`\B5;w;SqKpU-ocgy|[z“? y*ߑXp]=f _CHD9i::5F P *y2zM:#.Pd쓈_f@t!ѣJA#2ېtQHdjI$笐!H yc+D(4d K4U/ h[ .=cyi/S0]h*qq leQh.G/` }H$#P D$TB##K4E?(ѧn]BL\ h"RH١a U =,tXmd@>IZ<9Q%nڂ4X_Z@g#8Ms`k7 +ly:j 1ꕻyc{!ķT XH>n6ʹ:n6!W\o%]Wf9O\>CEyr a:-!Ү-$)^D'"tzT'{.$GJz=Ede0OH'gl$9 4e)I~Gڤ/k6hKI*ae)#*^O3HgtL퇲!رg>w'07_ҝx8]xu5ᣭ32>kcBp1qB|ǝ9ڟz!Yꞩw )HH/%nIojv[YI+r\($Cz4y>\4)Lb BO4}º.A'fxj(Ca@q@,0輣N6~NA$| DI0P8-,Y" L"',!Yeu=n s@X+r 58wb$:5`[l#pDt8Gцa0M6(@yb9cV6\BQ-:,4h4#`yf eL]c,txH]d)w@ 4ۮ2r&( If3i` Z˸|=>"1K6m?0ޛIg~?sz3$k)QZd5=P&3I'=HzҒKj 1̺pC^QWUu,7*wߟD,Hv?G?O&BklۿiH. Үϖ(F4EIDwϥ!_ą33ORpTdh,]{[pWLTk{ VyV8dHnӼpThX_W4SLci on!.dW\xJB{üz t CQXq2'1cdux=9^b/0QHt:klAZCcD5{;# 21NbaؖO)!6Q ݘrсyk>gu+Ͻ$S\Nj4yR6ݝa杲m~N=.1F,/xh~CbpbY_IFFz 1΍UMl ad,g )rc0hr$MOM;YC>$^%ΞXcnp@z+gYxn-Л~2}>Z*g\_aup7_'{)d/fK  }IпgBNe6ݿszP`)DR\VU*a\L&vŢ0W^:0zӔFɾP CbQCJd|v7{#@ 0heSJO40.Kh*]RRbJ;s[]h\MCdҗ4 4H6eUJa(YK9B Ce+,KcmUc C?@0 3uz}j)ֶN M^z֧=7@7wX,ĥ˓tuҳ PRJ&ez^r} 0ITYܶM6Y[Ygm0 @H]> i hr_D HJ)x< Ei8"h|HK .«Z_[/7*#=sj40%|)ڭ}Ǖ孲|ʧ?cUesP 3n?$IQ>  ҙǀgmeͣZ˥DkAQfy~{g3 Numz;I+dŵ=e9?J=K8`𣏗Mpv0|@gOCX[f?'po-p6iͅ." Y Oїv Pk %жZwV t&$ȱ*r! tHd |ts}a21g+Ew&:0}|dJ%797/шb4ض"ccc5+/&BbKA$++)=Xd2(^D_`!&;0 DG `E2׮z.MOozx!Ki0aX..NMG:_RlwrnklC0&b&Y^~x=2X}ClvzA e1E$ͅS#, œ-J#}Ã\<Ccu;6!GtwG1x7#݄Zkz&{ɮ8QePf%/?0 FS#ŰlMh5Kx.Tʻ=ßpiPwѶܺ^ R"D=P#,.ŋ0olnTю.t'7n΃eL>2V}:ǏWmgyp/vO$`ktk[)"Ya<>ةqwwl,,q&+c|Nwȅzx47k΍r7JĔL{GFLm0oac;eP3S۟+*H$ZI&RmRyM(sd֗яo`kw$usOYɐ磦F5$3"P" "AI g<bk!7ko\d>}J0 ]ԙ.v.ҹWwx^g"-,[Ti>;\&[_&֩Pk*1{yhJЦ{} Խxd|zݘf(md6NA=}k"?-"χQ0vflQ5ع}> #؂RmO"̹v?\bo/ô / 4 cLE7YW"CT]>[ʠ-M&Go Ч(k )Iu39օafe=Mn|3,10?-y.NpG*kgXAǫ#B 2+[0)9=To (<9}n`/$"wW2dp큚>k}>1nm5edW_;d2X";$W%B m̤wl.Nre<#l~-y6>-mϐIpjrG,K'FÇ~u# ]!x4"EtE+eTW8{/풵i"*X3s!0}>vwl,mvkru0I<Tl.dɪ0VK/,I/=b/_ 1 at6M*)3E]F Yry*yסPYBf'due;o-6yd2` THQi 6eX8F9 !IMBZ |BXOe)ڥgvx?Wcmqwg6JᠿTMW$. v=yd ׯU)\(zP%$UHD>7~h E]6Mj(hIC&"(NYVjS01zfgܶ44U:dsidVM')wz$fD"Q-xBުQ~$DU5j$D Ի.^)_Qe5.]%"fC`7Zմ">Si8NrÇ+\ ǒpcWQץ$#pG2#~Z7 hev {̭q/ξojBG}ӱ vG6JFz\$bwtMBBH!lRX/fi@nbgwgzd;!LF<#=""Hqq1:!wƹN! 6C}̰mUzxGPy6 \h\DüY::"H)Wx`'+hhILԸ`ywxT'`Cls7ߤS".JK}Ü5{ضK.۲PJaLfۼ|,?z/1y&gwk8DkMhU*ߎb""}C!"G󆨪$;'bvg|„R-ӞEQ?ZMna4*K-8>Jn ' qB=]caN }=FB`aE:d-r#9HOw}x4ɩK`a" ea$^gm5D@x$087#,MPft2`n}`zUڠgw x,Fؤ0YK˦c a{s[k/t"ee0DSPaIWϤ)d-3IF`C,YOJ`/ŽOnmE,_`-eJqw>ʙ~&旖XZnG|,Χ-Yf;]w) NO݇d \'$Rt[Yͱ#y cuo~op1/tLA&6s셷`Yܼqq&&G IDAT{Lt3ayn}j=Zc$wpZ@GZR(DkR~Y#hF'\:PD9(lJM3]rW{.Оg"6]zq} XY[zI1mkϰkۇOBƛnbtWҨZE2Z|T[$n0-=\6\05VAkl Frѷ4/Gk{ B&ɮ$`5x3xixXgxjK.k{0$֥⁺T(K*]J ,X*$[UPX+*IAj)0dɂ oo?KC$g,MZje*>~-VK!Vcyt-t-_))Ke*ջeEbX a*+5hUr?k ARSٶKĆa`*Q]ƕ>_Z[W7,A.?UZ')A+pfpדּo0 (V/dlU~HYvWSV+,=.U6dILP֔dUzaȪYR%2W^7k}4ll竉jxPZ_ZEvy<6BfI4mlan5T9ObVg z %YǞɜ?,=ܣ"3"w#Yǘh8sPIDeZ;W QR4IFhTd#1"f9;ETޙFx4(*GJ;}IHck~4 ~NUj&pPOƖf7a{'v Ku>€y nR$妁 r7shàgAS"{-BzjSb.M=j:_NƝr~}0`eT~Ks0gζm\E|Z*[o*pd;]`w9ER5Zk,C,էDrjh) m񟏧-wNe?QMs?-4+I/=Vżb0(W i_ P¡ }uhGz*e(O5}7ݢڿ *[N/R |ꀴ *5s/IZL^$nߺq(\>$Pׇ b|8zy;ACd{֕3$CC.MKdR>ߟ'|4]1FApNQb[t53k kEto*AQ):#'iQ`@ _4V[04{7DSgЎn˾3@:ǚ[j]I5bˡYҧ AjM›#פ2>*:,Qɺ7#!0hOڗިZ57]?jH~r >J]Z]k"MM&%|2uA5nW[GXtS9h%LΒ|~1ǻB~kK뚈J/0WC+fαAk} '<43b|r>-TW|_d/ '|RkaP'صFkĮCD]򿪼IOE`wDCTqpQNOJZ_ {pҧ!w+>ǥBGjcHv4]&HqN]ɇieG~_?;NcӮ_[EcRHQ FU ڬy]?ku'[vqsf*-jyj+}ʇ4"—h-9JWZ@J/R(1he)Vضt`˄ԫ!/˵^'5}='wy̟g~`2l!Vl FC|]Ym$eB Qb +^H7G%$x:f/fs@Zap1hlA14Gȴyh]dPl嚆KdCSltwU>i' IgxO) ɪ5: \"Ɓ ]SՋ.+I?.x{@zUXtb|7N؜`ݿ~i{FRy$TkAӕ!tXS8ᄴrU\?xZL˿5\4y؍מw#m+c9tC87#'uU5tg u'u:Rx~:n0ek~eX-T8::J|IGu\|^u2'w2OZ@!Oa>{_ <(椫Ax{k+ nNjG6zkp@p.'r#7(g5mڕ/&$ Rէ)\c:q!9 #,%HV$h/>K™n[3*/8m7fĢY(h3q=,t}qX]gSR blHAn΢,d'R A,T}E==sh@kk߳3$ ZrJgb[̦HJ 2T!cr^GVM|%Y'1[-,]_1g ]…*Y'C7JH(A5`vgĜwkVj駑Bz8`,pe[-ךU`^%LAr>-ԗ9o(_YQXݳ8=9įOO4mɍ[vY֐Y[Yr ՟u$4o|dNZ~>VU@ܷF~&<]&5JjaAxLNw WzcW~Y@^<Q;jTI3 FT<5φh-maaNq9,:[>yS9泰:_tj+4%Fnpl?+F#i^u ̏ |h~3xvM5JkL?cɖeZ>zAv7[`R֚dggi4 ~5xM8'vҎI +Qeԅ'!^`jZwo㴵+_LcG)}%1w2Ut!9,ڼIcKw>񸦐e{С2ڃE7lYP8Ġ"׈ k8tՇT9z]-UCzAsm{acx{[x W 0It&pv,0q)D}yffzT,r51 SؿdUm4OgE*0e[(a`:sMDI;ie/HŚ>Z`WζkR–BW Ш7IDCTRO ߪ2yUzp㠷"[ TT9^@ЬąT5񼕚!| <&ZА>uDv M*qΣr{}xc@:eܛ엷!9IF$F~p1V0Gq^ }vyS9|@|!Vc|4E*)%C # 4h][M8v.K*Uk0Ctw*ٶM.' 0-3)%*!abo}'WD"}Rl9u>mVj "4_k?fj):5co{-@YDb16Hϑ 2,jʆJNI;iG} e`zjrj#X`JRͶ^.9#LU]F ՊTb9ÆahkziW٫<ÀCLECo|g=9#eL@ZΗ٣29?Po[mOzɱNd6^_JK1(r-X@?i'=&J!*NU' |dq-+ D(mY%,ԣ{xyiB[>`i3G$ >E7LSL b巘0G}"2>!j8RԯѪR}i1qZ8GЬ*cU|Ƕ9~,S:'%"[ȰrCu,ЧX0:ŗ2B8$ʰaKV~pVsLAwH7 ?N0-1" .?)Q_`Oe|׾:S=EUtŹY$/FBbRw~/rf+WJ95ڶﰵ.no+( X` BѵNa?q,oo-rmz"/hY/_gzrbzlRd{">ga%~t+/ʵk39ի_ £d5L%6] fsm?)1<~X rګ5[{K,e]tsk\UvR:m|#sjlSK-mE:g`|믾FQ;l(s펱βŕN$ϲ~I;i mtZ+%pV#c_ԗrƮh`J!BۧsgWsb;CE968Dwk9dsZ8X%_?K+)|=YGCn0VYHcEiO ̣DxñDjvâߊW[hZqڭZ%s+<g:R\z/L$xgxfsg&mnwuZ)) ll~ͳKuJ{Ho~ꗹOob/]!C# D']a @" xą7FضMg A\Y%NzH*ߞEkX[Nsʹiİ  DKoB@ÜOb4Z.X$W~µU}`j2J.Ľ& if"D1N'ܟ!7IXZ,f&Be\`nS~7Kp~r/Lŕўs|훿Jo"R ݽC|ͯi.,ƗǑ4fO2{]#h`ILl|!@]aℂvV{+>Ahgիy&Z+}P+wxOײ IDAT5:D+E8B~򶭂VǷ X(j\Tԛ;/R-dO4#&ob{y- ] MzB[ܺ[ߘfW1s7-w kysAXKۜ 23}hM&G.2|; O[$/L,%hUyP8HR04{]ݢ`٘0$q}cIt`3`Eos= +װ̽/OnG%E&ϓ`G|{ F+_c{1c>EP7}L*kD1}!.}ވ6\3a0GO kLMt?_ݟq7fA43w0 t5?CN|o^dwwSIO~~<ٛ:wGŅ9DOr=ȥ bDJBRJp DHub|f87e}B_`kIwGΞύ9⤝ФFCSGpY>?`t[X+*K`V™*WUЫ\A|TJLkvhwAS.W9^2ܪrOJ5J+GVܹ]]7d25ᮻL Z\#^]eixEWQ!a կ. qa9Vt˸rѮİ=v¨!k5:z9,~B7n`z95i ~^򋧑ϠBPG?]Nj&FqTUݤ#فTT\dlΎ407y i݂?j`.knN>axhaf(DWO/1rM"aNO([16OO(9Y:$)T$\f=]q==ăM6[ 3HOs ǞsNlS_~Gx?o[^Ϫ !G;InnsmZcIK>^L8>1.>A,X(@6xePPIP,&_A{ރI!%ҭ/ 0λ#+@x{o)jB 9>͍s.ā1oyP Uc[kvbW16ЉiHv>/M˜u9\ ǪOrVmw&u-*q$͟\attU}T#Ù,9x]Auj +P'2U;U]g{ FpMGK#Oe d4^4^t{:0OzIGl=s?PQt/vdgVS-p,~dFյ7uM ױiWBPa[4 ->^Guj]dC mg%㿮[=Gw:}:L?Z a066RZ  OdR_LR}Q=~U||//D;r/j~0V膬z?MԘxD8Կ#ș^]c:!p~.Im׎l1 WrC/, vS q}ՙK? ]$PXBg˱11~j`k7Cel[?Bڕ%s5nvi$ilCձWҘ/o)вtm{9/eTkmIFo4Y7. ~n-_~ZuiN%kV@-X?w2^K8?+|6{AO^Ŧ{pKx(+\W GBXv]  6x˪RQC`Xe*8<,g` 39HBE%ŁJ>XU IW7o9<p$̎*b$kM+@h8Jdy4+szF窖+,!@7\Qz?q\+$0FV<+;!l3O◹-LUߴ RHZ(Xheg?G&px4X"ei tA `fs-M0"(lDggc,;9:ǙɘD HAH(QEJ+VWvlZV\[v?WT+YHIePRL A"D{:Ǘ==7=RXjA*B\oQueQ-SqdL&f8$)ҙI `9%%ucYw 5REMyzPy4 t4H` a_Y,|IcAdBue}ܺj4vu4ٔ5|hE:MԾZFq"Po;t L,etZ-ޟBztDDǜnKl'x5 i1Xªb"ա*(m[ߨKEuXCis(x: BK*a8BZWVdn3s%M0&I39$q3t&(*3$#}Yduop1l[R^[dfn#6ӳ :~TeBMϤYR z94:ĵ3  O%Ёq0$kYfkjA>qrڀg+b}*_, LsAlÙknEp^(ɒR&Es&xSgcf~!:@G^,I3inu \;gI6r@~8(l;,J}9`q &[5!bVy~-~sBTchBx50K蒈tnj^VWM|_a\ئ:1~{]F*h6 SYY _CJ%}զ|/aK(%+iEJ ؝C 3yƏ`NN!8|h1 ɄDrij aY ,H l["SLdKhT:U?Qq&N#2)$d[eNaQXvT2c8LL;p=tl/e7hԴ4T{DULH0;̀_N5S{:ɈDHBH9x;jg2D׸R^=Y1SW>V^D5o斥VV ADJL4jktI[Dml'oQs7={W 𺈋$·sJ+X$ipq7 h+DOkh 6RoTUI{2$}T߬PV0M3Ks+=~޵.1ȃU 2aH슮=Ȭ; jDn !q85zy` J@XrR*@"͇6~H6 kh[g$@bDt !u ]˜Kqù^/|`r|?fzi2UjX/G-[/Dfb_8O:TTO}+?$ݿvk+T&iY -Fzsfr1r's~\v\[#\+<~qg9wb=wVX*qmuXRrl>+gn/ݔdPhY86ght_MIv[6d)cvf"X7\P('G~ (9!m|e`GGs DLA&dW|@.Hv n_+>KϤlU?sUQk_ZbFED:c[p÷?,]'n'%1S<oW.0b8!myđm8+4ZYXgqmɿ,A8Μ/$&He c$NLNef׊l0p7aP&HY`ّ1ƕeO3Ao&,yKP*Ij 77+ɥBSո+,f&mC}|ofiqx|s\j\_^B>e'MRkUEObPA'ϒiȧ"CR/b>w+3mɡ !be!͂!iD%{$Y(𜸣U9xELVFBsfn KzC ^7nD#K LD&ulF1g2v݈'O)2K !.e#JEv$inUYJjKL?B+T"'C +mwnA>SۉH].6Χw61) ),N>,kLo4Yn$#}},l];{@o??|{S50^[JQ A0s%/gD8CCCiZj0S,f8exg\W[_f x g`0ܓ'."Lo~^Veِ T-_#󎑊/k8v6Z\Ws {' k5/sa*_7V1Gcpu <?3#k < ؽ_ dEȼ&$OOFi_y:O.dxx4]W8w(<1xnfP7޺g忼p*ǪUͥ%F9D&,b?g Ղ} =1·.\K7QqsjӼsCr.\ۗ昫[1,J<{%mE.W%s/NE5Nr:'N3usy|CdTnߟ-wqI KJl%BlKbԪ\>{يfrd?wc2cY7~᳜϶\"<_x~8{ʄ IDATmr|geDl^C Xҭ#+"$H+bq hõj" )7m8IaEeJ*##b,DF.@HĨS)]\%ton$$hIP+LgitmHMhkkl‚3L,=S Qmw[);$ n~D$DX 1ZDݵwz*y F&Kw A[{ Au#=-o1X"r^w0ޟXۇ l&Mƭz`D4"O]\wM_^W.ZmAؘ*¶y?ѴosWa̅uܩks G>yxY͋7j<B'1<^P`>QȤ;m=CTrƓEvR{ |o9x!x<§~FQ6S+㟄#0893fauPJH_ZcSk#JE%lKK\(K~S橩~$Wer*߸Jv0x(G_6CZ 6e˜ͦHZ>PJ1=}jw<;|qOȲQ=w*]ǹ{9L6ᬍbXjw=|wʅ3W*|3X<:@NlR.7n\籫<|(ť%^J bJ~Tx"+*52a)})Fz|Ȥ{]4uLPGQ"-Lpɥ]_ Qd0T@Tl+NJA,;g'Z S4¥_[ԧ=Z;RP7rACnwZ1T<ՠ@:< ="kgզl5sͶu=n̋}wi.ح UW*" Y&t61yslHj= 4 %jnpj vJ<hq]03k5~))XsjJIȽ֚y~i2BNN8|KIOOϞ]h虅gn5ԉW 8s<6 avI3$>Îf1QkWG8'fD+__f+NFqT%m21DF$mN>rIƫmn@ 4nDd2!q8 / Lu*OhD?.#ğżth D, jt(C7h{4+S e4~'l!<}7q4, H($V㜨͑ Qg-,W= nԭfVt AȮtN)[lxMr" >nb :и$~m^z,;49!T¬2p|bϷq4|kʫ_~rs/x$I4nvA`AF^tI1Q^K ]wVrT0?JȸP{bH,\o&*-H?C:٪r+S|ã{f6=*_h19;O_&oD*/Z^?kI @6r 2@FkPo6 fѪ7Ĝ 1?n4A.t C#~D:~3٬-C$/ ~nW^g袼-̄GhGx}4ψH_w^ERXsn*dx+jS@wfcv[eN,$t%C2%n6 HvPǸ %r=yΜn)AIi[BqRywH@Vy7IxyzT˅М28T &=4`nqOd=# ^(|pz.wmc> _1A0S_3O?XU+W=po©0q~W _o>Ccp_wό-<w\)o~Vv8?H>]wƩ<لѳxjj,ЗN1Ir@{ǫ $IsiNf˝r<0K\cjA#l<#ܑՍJV)DC1sUF6KK|`,W|)*- MXe@N<מt#@ԁfkٻɭںnAD†A.bJeCwp~4^<,mA*? @7 h<ݘ2"DBD t|L;9"+9p^U+bL p F_ Aǹ]18pbgٕ9}k Ց4Sʼ6ײfp|6+U ] T§ɇ?ލ"Ͻz]²"LQN7AR.3K\ZZk}'Џܽ)%} ǥ8M.)HaVҤmE WZ.e&Lz> 㰲B&!\*/k ٟlJӓ4yQ)$$-$eTHY%NUS,BB6J5`Y\^` .JS^osva VBַU,i*aXM>'p(悰DR A)UZB.WA)!c\s:hkʒ>$U:$eRh\zoXM",I两lBU~!mKhRS\_xa2*5>Y~CCEzm6뺔j.ۖm^&јEڶ(jBX.U]m$e?z3iPދR՟i"eKv)U]jMIK:.WyBH'lD)E6^?M8N}ĖZjMN%U>w! Ә~ W\=x \\37]˃fz3 bzJOfSl/ŕ}?IOY@铌9(NFy3dۤo;>H!G?sj͹gN Y?Sb$[MPW_(z H8aՈz v}"*foE!f}"2aϑ&X߉B>\#"?Cjvvm Ɔ$lAqJB}T]E*A(i[av6%ۨ/WJQ*Rdb Y__ߞ 0Jq꿉 >줠Bfsmq֞‚趲A63OfL̵;!ma^M:*C"I%$D4hY6=V ekѶ,zYD~²HXPuY^q qb -"U޲,[% AJAZDɄMۖȶ8~+fߤ$cm۸$-~1iY$3;N>Sf!>1ˑQnn-eM9( ˊd)__ƿ[C(2,OSIA@Y$)jZ#%L"VoI'ΣXs"B2D$nޭ1p(ȳgeppL jx+p> 3!ەա`/l퉈IjfApcB-22\6[`}V\թT8uDK_q0h d5ۂuHI |M/<(鶡 1]?^eKapm)F+eV V pBfz?AGcb"e^č^ @1sB2ݚDH 5*]x[1eX+ڔVm{B%|7΂sv8v`}"ЍuED[\c\T| YЁtY% wSi}=ĭq^ڿ.1ưn\s!z҂^gn"6T,D@fS)mXMOJI6Ŷ=, UZ;M>h8 RI@SR\hwބPQ5d}EZ'(icvɍjPϩ(@ܸN0=-Kt T#YVk*C(ͦk[F *т ¢;ekmn|&צqSoKQ4PeA{)vV`,OrcN_&vM)p=L P,֖\qQ+Pli#=cHlAZtPxMMm$au̿[ mw< Jg^JSuX/;ۺvrƐRr>rKSfL&lHH[ukAouԈ$jBHf&!Z`T[&\׆%`~s\E4 ]BFG~n"*耀jnc &ۀȄ- IDAT)<\a&tjr!3\L%.WPyJY{MYhRi\Q!ḡy!]q61[101ݻ?SQi'OqR-:%DK}$Jڨ1#':$X%b>McP(7_ KөmĈZ l C\d-" J!cnY%yyzHzI=O:NT2Uce5cJxze9Z y@\> m|e"( ÆLL]CTlyT`QՄVLQĊk"0fi 9`x*ڠ*qOLGmm-5ɥQubB pN}@ve#|ݻ#V;O+ykocco\YuHSp'$x:K阕ѫ~/jVZwBl厛k*.ZiVxUoDez@k`l_@6;g,}T>9:0D1!NF,5߷>@SȺ{~U߇y@IkuC5S4q )|I4&B=/0_2hcoW FK2p)OL߽-Z7ْ/eRTk/:݂]Q(e"1}h ̴^vDا0<7Hl˳M9Aab1> h^hZS,pԝ\]Wj4RhiH$94ϘBy6 G n&)%==={F@,;ه>-?Ai} 9M:F U:5%KS?%iVaft0kҩamTEXo%T"pLm5hs *bYW$8/?*}0hPwN-TknIDY!ܔ߾:>Dd&f z+$ ᄾ8[Iү8y:7h;(;Q숯! t)VG|VGF6e$g 5UfY٢ ,ߙen,sYs&xq t/o!ԁ-c4-Trx^9Khml_yf^Z cQUC&6PzHHC7wWȘw2_R =s ,4&^Gͣ y~r'XAsBif(E A2Ғŀ.Y!i#h0W^^iI(Dfl`a](x{@! y7HnCzm6;+1s&mIHYܕ-ν\ĜpYlA4# Umݑ[DJN9QX s4_ܚ -ԄEO CP@UCy I3ibcct:M6ݻCJ섢Pds@.ٳ8fg KT[@A@B`VމЦ~SkHTIѭ$jnZ%A"V`w;idT Iy^Wy+hlױ*Y3F:Zoe,aU­+= ݀m>˼MkEnpVA_aigڳ3%"z\D5Z"jꀴ"Qmϝ>[h{kO * ҙ C"ŀ5n)%Gnc$,l|Z,IupoV+C_|3 q0LCęs$eF2D"W&/$=#s0=Cĭ ]Pvጌ e`YG_^zm[慒`p?:ȸrn&՞h[RC%7jEB=\[$WH3eYj= FU6ضpzjn #nI7oz7Qw1uQ)aa<|;rI#G-]?B`'dIlWH&ȦRyrb6H6Nŭ<ض! N#W[<`3{ ET8jʩĽwJ4dV,iM墥a^4˝†p2$Ԩ|.BY:_W_ d|N~e; 2jf2*0gi֛b2KZe1snDnh ex,!vEHW7پTlgRG.ﯝ Wx?a퐟V aͭ8XF/BrnETm^Br#cnLxп2ɃoxV 0hR ZupP<"㰥01FRA.Nِv$ Y t;aw ~Z3w},EBԿoi]csҕ'8QqDyNs",2 9M:4 ޙ}!BataEȈZ J~V˾jOoIMf Nތ KHH}"K%ZEh΄~'Zzpn ve{W[Wh|S/_'& YE#=~BGy6{FYf2dVۿ?(cy{ ك83djR IH$ګ/+_nZu.⹮:)e^}0bIFlB)"Dt:/{Mykbgۼ~+t xMJ䷌X1/4ah NIdDEYa~$&@61~&E Q+CDȝqq/ar=d n6ǵa "+kN^'~hMjԤ#"p4i}E>j]fڕ„qe/IQx%aϽ xyB0|ŕƙsVviT׍EZ0bH6SRTX[[wωVGq]V A*'+FWdhΎW5oz;h>^sԚrJfSQ@(Uj8@6;GN۝-4 nEmR7˵ @pAW %?ɮ0#qĬ@2q`IXP%+hl'Ca%AuS/I -F$(EFH6Hhq@QF]xilvD7;n ^i+ 9zG m7IQ5Րwӿ>ߑ蚋6H.My-N8>e{D^t-]AR"/O ^QjҲȧ^GiE\TL¾e.@JY 5r\.wK; q߀ӣZiVNEW"§#,\+^w|=Z2Ioef+$ܝҭUR`m}y-u9?ugJ|;IVsxe?r ֶNRaTc\CJtC4Iwb}ӛKx- £ uK4vEYHOyԘaElHY(,rC4&n&§0w$A$boA0mA0wDOqƌB1͟6 ZcLi(JĻ ^p3efvsNB&vi:0/n7Ɛ{x>TJcѹ-vVyy# A&$M~d\NաXRS stZkyrjOqxbO=p^Qll/j O?pe"RJCH$n+>ki$ ?$㞽٨T<ݭS^yLs*jfccotr/~ :pz}h\Y-,)"#(U*|xrƽG<ĕ*;j(hRL'!> mh#+!9>n `8$=vѰ ^)*4W6ꇡc{rAdHpXuQ Xos7CD}*2\,? c\p'ȭl;% a*^N`}_i1 Uv8!'/R5BtV#&ڒ.>tb8saueX 5V׹Ry noҟFnUSyMjNNr$p_*B`Y{mf``ޛOקaʭ?1zq(,luAZp씦G> yo2 ;ISPM0337gg47/(U|Oh?ހEp\306 ԏgbsC,܄Pv@0tHst'I*GksWaa j ._Jh.4l8:%(HIĐ aX܄U8q rYX^UEhKZ1eGQ0IRd2&mV+\Zܠցho40 嚃m'͓U o?uA]{ 6ԴƩU(P|,Idj4’7i{FZk ,&fnu 咤UkUuŽ%\]cX`S>7˜91NqGW_a0Z0_1ڛ!#\׊dr9Ib2URrbtr_[GAUI0 {p1c@PFŽ2D2$T2xDfIߛ%Am+2&h^W"!VL2@Ozi:ĭZ8$'ʨslJ)+CD7C)bْ cnژ9kؿȃԊ.cH`Jvf%b5ޚhAj]\vP1{g}2ù{|ݶDG1ͭY),%̵ |x6[Fȧm$(CJCL p%8J8?ɇng0Ēl֊kT*Xfe,_ ~* zX|~(}Cy7{W?2[;߄^ {OC_ |' ˗oޑ,ݗab^{/~CYpT08i>'@A6|kEAB:<1_}WDDUaYӐrq_.|x# ~50sA&As1k /lgT# ҽ;㶌ՙ>{iKey#$K|/P%q><(}aSBRk|YT]-$3]8(]$ö:>O4zWnr^;'7Ƶ%Ɔl)/N{sOz*.m:|?`3=٤m27 ^W9L=4_{82cvmO?x{t&F {AKXWĆ^aWLH@_WŠ \3aWs#qٗcykU tiD }ͥqv} (u['kAJ JjC y3֙p _лNIŐ7f 6Lw7"%"]!(p=0D}(ץRYAHr9Iq̆Jz I]d"ARjOvk +kZ`<=6lkޱ~r?M5u]u2̞Z&lT*뷂W?+ٿB#O|4΢#ȇT?c,8:X\C0GXR0 バ`` O5&snp5p,4,^h / t \2\z\B =@_/T]HPks~Fg x#}{ N|I/'?f icw;W)~fGt6ELE LC2)/̲\0IwoT9%5eNy$םy/"Ϫ̺ټ)-Ii43xֻl60X  x׋f]iD") )R꺯=/"_dfu͎@uUVFċ~Ǘ qa~&#5|f\SS,9']KզykN/ܵ|z ~2y{&͐GHNϫZU'EMo:GZvX>{tpKkeLIFK+S~$U"{z8Rj[%B'"c%jzE,eM0ߞs$DǬNtt/bRlp֨F"*JBLG~tMUu+B6'-^HɜeF[@ 6$tIN;Վt.ߜsh*-j%OGi6˱j52GSm|x4O:b}98qN-qxPFnv~F=ciit:'s0՚L^0\ZF9ڡC(jVsS GoX{{\F`l N#(> C9Xk02(X{) *(᧭ݼAZÞ}P>׉x(j>CŸ\&_켨)=)ՔMҡ!8;_?r27VK)9pDb+ ziq]CX[,ϸqq@=H0o\[PnwDLs82G x'pԪ>,~W"Z5wԭrόRS=GW94^ٻm?}S}51wqysE.Ĥmٲ^[yxe Rud4UKK.d00W+?|w`8z^|phD Ce&4<|z {_6!b'dB3)25o8i@42 M /m'5o : WV2P,[08(Ç = #C>ZJڟ3!w߻&7}dP!=C=9^#&5 Btky0^ft1.֡0SMrC _"YZjV}-3(vl f =>, `1E"ŗ[8_:m㙈#b*r 9Z 경ĮLeK3,xz \k׸\VYхr*kU˚eR~Whz#hf(9wHh !&"u8}}}[E ~K0q/@\6OO^NoB6#7z .o!%A{tJ +ػJ?xsp>ÿ|&ڐC~ޥ p2~:^K3 y)xuKhQ;=Y_int4jF&zr6 G!\> ?x_=x CL^0; /[{tws%Fy` Y9?Kp9y,)y^;S%/C<1qzd#%J*2gC1PHIz+U2R{ѓNm;w~91!jf?hFvUF܍N^6eN~ZV˫#˒ ; iԄRMN8QG82Y0[(e?MKiD8r>p|^hZ+{ \z{DXk( #cu :QT}ŮhsUwY Jڒ?Lڏ 5ҧAϱ!-$ds T?f]F*w-ÿU'@9 )ZM5=d]yQv\ ^c `HҎDhMp7$᫕\~LSTHIV5*!ZC:咖QSI9~B~}vxJ)Ir[RN7?ݫ~HB LAXoM>MCm{Lƴ=Bs2< tq 8lpIu)e,`[HI6Fuܘ{2Na\]\qFBHI.-Z!QU޹4ENjΗ:@''TZnhOL:TL1߹`9 1Y]dz  7WGueP""uBtI@Z׺_QMmY6> ^Ԝ3D3јa͘1k4DL,l؊?D{SfN4(.E|½YDjxF[CY̲I)Xmqz'3Z/Na6%P;iݐ|w`n{! =>adSeo]wFM=/)cU'{H* 7}xqi59 /~U#\*΀]2pt(L>suqŊ`gw &@-! Q1 mzYiQ~[Ah]hw&QQp. 2]mHXVzor (mw}ȣH2Z'shWFsgdowA&P/3[+u?GQ,xlqe~iCw/yLOvn;tA 雼37å <ʛGm,ޮ*[[B w k~Q4=#䲟Nl:=c<rSe\CXN98-Gh w힄DH#PQl#,]LjhvaPXv ""Dt=MLps_NSbV!2pW'DtB[q S֋4;ά6Hy(uE?Ѥ ΧUbX""Ix3=;6t߽6"U@Vϗe^D%H[ {sK3rd.++%jik3,ӀQ;@.ܒD4[FtRi=>gΜ;A>!Rڗ5ÞyN0e?ߑFk Ui.1c#Y@7UD^ꭅ腴_.'<:2Jsb6&s?1 ?rlwSւz -w~;@Ks{Ӡt"eѴ2aa̺La Wo̦Tֱ Zrn.2T:=jE3>9)ϸQ)嶨m%D$;9")*&{l {EACr6o{Ecv##1 6k#YF(Dpo~6Ɂ יRJfa,9Nc [K5EKkK&ր絠qCV>W`SGss,nl#^B%,Dد\a+\l !Z=g5 rʩqDJ˜BUU=njsssr9z*7*EVu-7Y A6?J0|jg[^L anK+k`72_J)JxRReo0i׹[Ǭ[jO.6cf06,/bMMz7*Yɏt8iŢA G"u ]tQ%A6DY2h]ݫ_m)9|GӲ#ҘsŶ[91ȍӋrsVtzilEG[!{ovvL913 ⤀F".BТFE:'5PӚl6Pʥ-6k[Jf-{92RpsvK+UʗZ3X,r?[ koֺ?ojWPoKA|iX p|Η{VY+)G"}In{\8q}bC}8BS-k`R#}Gj5\~T*e=}l//}[=oY+qqn&%%GGmO1O{Fʨ!DFlE ܚ;G_c&/{ڄNsݳYikX  "= cqDTtȮGDC `z)chFZg'z)XUI>kDvCRH7jS/w/W11td>HV2gI,lm]/OǕ2G}oGgxֻHnyⓋkox.RКU.ϕj@W ({rhGF}wBZSVQJm1Td-lt'TB(F]$D/< Y'<mt}[#d~A H69G/Z _i~QqjzF7w9*Woʼn3=e85 1BEP`Z?Z\>{Ҥ ϛhK9tpL/.K}zsNoYk ӕ#dlT.Rn28 P'N;b2fo<_xtӓvԙXV5>«66hNhdJV(#Lo0inv WDfYrb&Cc͔,Bflib9b. dcɴWv#k&T@tl@>NNLu ۵ TW~D9.czx3 > ZSY^ɥJ+\@/Z+JW D_~04WRC{'90鿺/N&{rY']tiQ[ }ͫ˫ |k,,7aȃo95x񳐗0|>~3XA(<(?| ~?[g>᭷aj FjXj^yKp4(><\: g! ϼYW^>{_\ka?e+? k ^\s)wO$đ[K)EW`t>9?{^|D%VWeÓ#<W̵i^@9g'r,Y:uL ri:Tj5^=ytcC,.-򓫫<0WGWd{ɔxgfeB9\R)e ڑ8g =9dc{@_ ҡ^ב4iavX)e( BO4ynJ( ڌ9mOYIe̱E$ΤhmjҲM#eL#ncLoL"> c;ۀ0m>LN#{g`fQ+ΝY3>Sec4Vpy̯<#Ԯ=k\SJmM?=/yavɿN[1?UjIkzGƳpu קn_~ 2o]>Y]{@>p'p57.Oqr)^8<߇4JO<{ $,H)1p81߁k><&k?|Cw}?yKss5mpkSAA׾[=()!\u/MY-UX*-+N'F$$e.c"+&kF_=:%҈[ ]A@ʘ̋LITl*I; mtz9lEڷ.;TF(^o_m JܜM/C;@ior‡XJ<%.vdTky[Z~===d٭A>Ɔ`tP>"PFO,}?O{>P}p`*s~ t ,]\})Bc#wܱ=QY5  H =9&xK~jW00G|p`uP(@ZBz~=t`buyqO:z |a}z>f'ō{u)d|cJq*4Sȑ7g+KI28..S.TbBE sir$3qqdS. 2\c\=Rs.kJF-ғvɻ|gلW^$ dB„Y)RYG9qWw|\W0Bm$E}ugMsTښ暕V0Z:h͠2E[pTɲK 67u65,'朕=酥ĿǎTAALeQb,7]MdvTh8b@y:ah9קoǶԈm:qhZq4rLsh C=..ԁ CոFVR IDAT&f2NGYrCkL}U)fTCBfc#Uވlk&cOwrgHI'8{@@zy6%_Sp`$+P1Axt+T56|X߇__?:}G@f|?/ *X 3`` k%U<<을{?_^x.qWsas(w{GύQB (XPuqp/cR#/X;;$pc}{Uޚ-3v'!OL1scv#"k|3.+TX?yWNE 7Ü)MRc*7c ,I 23Uȹ a9χkY,_ЎQ:|g]!Г!iƒ>)iGZpe@n@W7͒vQ][#!4G^Qe-67; ʝ:j(e!v)ywTLhFddqOA;'gu>뺔n9:3RXY7~z^~ћz_8S=p=jeSvHo79٦T/SWG8?mUk!c9 S-tSt=iehӔRtSS>rܳ MywvcCV^JD+;nٶv4uaU+Z oߝz 0_'ݿj^Pm>l:pޞW ߫zrq UWr=)w`޶Aku^WP74y5Bpݔ?%"Ϡ}}U74EGȈ?#>@BiU[(TBԷ>QZ58RKDؿS[ݡ;?g/yjJOd@m(:E@ٴ_cdœ]hEn^'b}6(37WUH뾂zҒD cve PuhūQTvb:E7NȖߘ-Q)EȭvۃUTKϺHkD$}!|}W.roaƻG8ۢ B:^h+#$d8`hWzܱܶ&v#^X}݋Uܾb5߆ſedƒP?kp>Yhxȳ+vf{[8^t|D~H9l*rmʑq)!7a:9upYj&TX5v^&y3)2+\#g)Y&y1W0{yč<':"$:F>Q.k( B N`$ŹίqahO#91TEtM,K,sG/E^wmB7QՌ_K$P&koC8F Sk;FTj0/[!?o*iR0hD /y<^(4]hh-"J~-٥RYg?#S{³lF5jgyS;|>26)g:'Z)IZb%XbhΦF`lMePjGjPe &H4^{`_e:hحb\b|tx5gB׉.yh RmFMHLoBgGVӆPgDVwV!5NYeq؝Uwxm9QMt(6"$3 "6cіsQ->K,vJu(*\ZzMBkufPVTb]DzYmotm=QGtT5SuSDfGEk +>L6L7{wRKq|kyƍ1{-!-5īmv,WYyv3<8C6rcx̼(p"¦wޑzkXb%6z[}A6aTe&8o_?`C^흼:B=&YWpS,r9 TLd*TABTK+lZ]h}oIK#G?cxv(7s(ES4gH$#ܯj: ڌW܃[v!IJ,KlLdΊM#!)ƭ&nhyZsNPoڴi'V㋤$K,^9.,֛p$ &;U+wc.R@憆W7sfjgݏ]ljRQǂX` 𥍼xmȌ bd) [@w[|uE7m?tzJգ6s%AK,Ķ}ߣH҆?PEݭB[E[ǡ0@,WڕNfdfFЉƼfU6> 腅4T< jf^W"`ڊ3U̾< TWIすrD6.-)O(nI׷5^qI Hb%Xb۽(v5ZY ~!$_))BHACw(\a +Ѫv c5mlXlH!9YHzDb0r|{t LG)mIQD Ǭh煢)ecGՋ߅xM@)TQOF7Ӵ^hVDք2UF9PavPbc*! [`}]׳Od@7v߉NmEg._=A݌ '%!$%Xbmx&=VhM5Fs6D6"8h IFڈHcl~tNͫ[ǣ.jQ`iЋA̽G $+YkCd ! ga=6^?Bqc o܌B&={)mn6g#46 RuTLE"QJ,KlHؽ8%-ld}8YH́ODdgM O=х񏫮5J4$_87{u6[ICTvc@Qd360S96RJ0.$p| r$d= [m@-a&1$][v#tvbHGb%Xb;@Bn9Au̚{GBd=^EX>O  @ןlDBP]M4*\yxML&"D6##sh>g'!ܰl:I JȖ{6z0g ȅ!d²3FbߚD:K,Vxb16k٭fY6i$(i"VAѼpTd22shبa2'[ZiEzV%닄hdL탙Oj@XmI; pWi'z%1EE$K,۾\;EVl7$meҡFbZ 0D|ib*B6Zk3h6;A~\QDmֿi &! }!{'ҡvW&]DID^WI$K,m+û^lu#(T! n] *1L;)^D~Ɔ2reB=S[I;uZbO{<œ!ݩk7ilK#+zC}@r6c@~fuҩc+tH,K,MѢh[xwڬq aDDp Vn&&pGM^WȻQT-@ΡU*7\_C f kRԣ3%,I G{'5E]~/Di \Y[1wD0|l.!)VWu[ﲋ}iEqu/w>v_ݞs2%_s238ضY+) G簭袥2B5 UZ Sѐ8.kJ kB~uhiu<Cl)^_6ӱ=yBw;-ZUӼuV<aߵ񐛿i.n]s+dKz羹ܶNF#"$ozER/] 1AED<{rDzAZ=JWȈff䨵y`cK$ 5OHb}ў#uɿm\sHG'z 3zBmZ:ղmW2%_} !|zs,Km$ lce; lʷ RGXV[" ;EfDÚ[ҠӤ#-ѱT3Am̓kKFI˵2ֿ5:k-Ķxt|C0m EP={9fZ6sU/ع}B9p}}zt iD"jSs#ӋOctFrbc -މ^" <_%Xb;BGӠLUJ|ΆHDAt5J-kJ٪8FF~QхBV+s y-6 LH̆Y{"𭒼JyIs6O;qk@TzH2K,vp ة;dKejDC< n , a.mG|xuH BSO,muyllZZ<;Mڞt"ÛXbmfK 7K6I 6uܿ ѷz "C~[ Vc$bi]D9FCe aǜ9R1.'BT}Vdz'2MJV}!gj@!o!zGRd kCnƥ0*aҜGm@I;8(e3vJc~FZPXQ*i+IZR$|8;6ޖ8J8 ]FV7GP=$f6Q9aі׊zNen;mEy2f- (Uoݖ(Qޚr#mn(R ;k@^=YrؼLyىKx1.y"+<4)^i..==r’ e *sW[;K/o>6]b7Wrj!r@!tJ hOvs4mf8#u+;9qJ1pGrKHHbwjMihQHz5!`}N(m 8Jx'4ih;~8"ݍ 7XlRԖ>a]Nopd1Jlx~cdSz]M|'|cX)*$ӓGVC\^ND,fky~ɹpW^Yf?<>s\EM/IpL!Eҵap8gw~z k2 bse62 ۛ"wHn:˃/34zk?\AՒBbؤI dUQtPT+6"`qց_"dD!!>aލ7a[G7=<5eA'w'f;4ApZ.gcnzM&)Xi@8)ZĻ ,-)DJ7V`1۟Kk՝ubmw*sWTgWXQ_0y(d/2 *Y[MzS_{Rѹ*- Ȣ{x}wx qj ƻӧ(ݖrgsdR= 8h'/SEh u-DB!!]iwe}SH*P_ݍRYhTh.Znh46 n&v)C3*Ij@K"C@V*Шr*GNp">7ĥ׸0+qhOU(J꯶đɴ@j 8KXӂZ^4u+q`q*^xSDϫaҭGRy WL]^B&.sFOi :_a~_!ƫԗ QiOjDi=%JS5]ќVu à@27ʜ+Ad +Tp)JuH$nUS> IDATRJG[ ϟk ʫr\k*#3l=v=/PSWڤ$5 ;Lwqq [GHrS ,VV-t*Ȑ_Э-+\Ԣ e(1ֽP#BNDըٌDv\cbX?_`]=W4Wg*0g<=iZ6ȉWor`1z4G%~l/L=/_wר{y[Z%Ǝr8;g<ImnZ |}q=s%>ymӧ*T <#Tқy5֪ i?9CzI UV 7.W'ϡC./V)y.F'YpE8y>SL>>R S3syޕ^,咦Ax~4qUoTŚԀN}[wIP:pDm](Z+FZEF"Z:!: z2:3u|ñHBր$ا5 ii5kTLޕoLr {y^2^y7<)RvŴd@(W}i~{5٩>9Wbmo?GA}D4!*+ҽ9)k,.dz>>)Zd2IxHoL 1 | ga:ЩC9G%ydq!{+ʹ<#\r3_jaV(gh/7JTi-#ʜiF2P\ WGXQ}#izrGL)e\WPF2v@.)>xQQ*i,'sa_Oq]Oy_59NS{i?|x+hG/~)R?W̙ ǽ_x_ΩO.-XOgf#aK;uUo tQ":DL^n7a`D1c,$$:,wԀ$خDb+]Ҩu7Oȯ,wѩ*n_90ᇖx* NJLd/02() K Wq~:6xb7>l8}/8+y~\S/_⍟Pv<7Uf(0ȾWiLnpGVO_,2=N k0hP]r]Ps$A Ń&LqMJS߿Hu~c3r0;SN zX=>Od~ݚq=Pdx~dKKL/$vg88{O>"s8}'*TX!|Eg&FE3@jE<+ l 6Qb6+o,D| ҩZ6,ipNvnJ I`5KmXcF'EPgN6iÔ"f'aM&6M,;0IiZT; g ;sU5S$74s`tP+rgBVX1Am2C վ gdͭ9(1IDryɴ "/`M=_OSYWq(p^_vbt !D<'Ջʹpy %z4ڢm‰yTLrtjx ].mM00N*D1(aB+sjY#-H) -B1UN.C|6(GYF5WZر+a;h1I(j*QQ TvчeӶ$b!&:CɸMH/ƻO5ʧ2nPƴsR8nJ+}K(#_hG9e`I8͓^ό%LDג1;iF8@$|B68|MM+1l̀pP2эTCw;US^%fxM@Ϧ/l(v[wQVS@Bab!P8HH=Ğ7~;lfy3~.7 ƒ4aZ"ԓ?!GBbd>54  FB$Zs2dʟn!tWAa2Dz2?dK<,Z5رNpJ Kt2QzXkv.H{Wp.Hwt|ʋ Ѷ'D-Gm!ڼD &2;L[ET7)h;hpVv~fT5>wM΋ɟP}킠m:vu5^ZH||}1Z9l1^3F$ҖD1= J~GT7n6*SYIB@32'4[Ƀ vw~#=Di-st0"M sz{,$d LI2n0ҟe]bأH%,n@茹Ϊs3wYt]?uL~=8/OÈ|I5F^C){1#^X,LJ x|"eoLz,̴|'~0,&WC6+rƢ4%84=a`2'.&aMDdʛœ "}WDk F AjO_ HIPj>':pWP8_u2"ebx5\DkE-"&HLuW7xݭ&=RhxxiAͯcn7_n32-kx xČ"%k']zb$_V"OCL;,WЉDl,]%lB=&S##μ}z"1c"kC¼˨gөYxZ=a5IwU]!.cIO79lZد@LxbH@D& Ld6Su]ŷs;RZ'ܿJp^>axS> c6(*[z52 :Y1VsM3F4`k4I :zbĆ2rKodavA ږE%m24 2C&=!sP{P@}-Yq6!nɒD:c)?~6kғg603zFFР;hAYt]S%c\z#yz)1|NodN2%YOd$87$;jOReJ^I9+kϙ Er3*((((E"2,9U k;X±%"u #u~Pۤ#=<VI] ڮx,U,dgD3dĜ Y3\[ć1:[LӗDAA O֠%NfS+{DD$W\$k(BH,:~T&X >$ 3B|y@dw&dvNž9i'YcRKO$DZ¾M..9wC3X mbaT&t y^֭ʧXDT1&}/Ea}Kn㹌Fr?鑻'ni6 L?NΜqraK?>*kLY?Nj0b(>3E9%xc@B |_"w ;X#0J'iЯѲK̤rt&K iё/)%=P_AAA !p۲by9P> gdg78E5ɴDZM2M314mn'w~m:Sm#6 h& w~mH6WDA!~iXhömn㽗fst}>Os8\,ˊBuAN On'C[R"D"瀕CВ~F5fL\ד# Mu dBQ8/"D\N,Zܑ 9@f8k9v!;iw>7+9ZNӁѲdz_ 1*|@΋Tk?lۢtGX gll,BӴS? Zp 3T=x 9$ ΛlFIS:'D ;28!HM|@'˲Ri gll>mkg3AK~͉FTldL#b{"rUGvڗDߍb|kj0*8> Jpy`[j=8 %QA t"Ӿ;e50tC;A2!K$3~!rĖBKb9y@kQ+'3 ,"LTNjdB'Y׉_2gTzu+dN~dNUa ]AkNg)0t&* Y'2N47}JO\8r-~ qvV"B7dd@ t](( O N'QPPPPPꂳMyLMe丰o 5x~~2!1B!!3}:D +~Ḧ́p- Zr,rB9ȹO#!.'GDdH2?%3rYwRՇo'O@y!Qz ӸB8S8BD.F.N fzO$"u,G4'"d ᳘FRD}1&((((JQmoP]+uV6ѶlzڔVl͛rE:(YID"#Ŀ0y_EYs]>T,M?y9:G-ɮhmiWsI*l Oo<+ؾu}hƺpv?#')"+Ov9he>QfLl5dDb_;B DݐXd{[N*ǕOx2]iXv0.Yz5M;,[-˖leJ H.Г='(uFAȍib&geY47+o u\!7$ͯo9 +Wc{uv6R!J,K9+( I hǟj\9 qigP޼ΐeI4̵ٗKR>7ZlfOv{3o*w\X[LSj8d`dHo3*n'd" c}i8?szC]qq9H#,3"t=4ne<6+þqULw7 G7#qa[|\21 Wvl-olEnQ16l|Ÿܶq_m(O j0kRU ziKB}!lKx擙s}|^}u~c3m!E>1XB #_at;)ȴCG iJjgl-Lfޓ{̢*ύ" X*B IDAT Q^ DӖh)”4JS&_]jj{_ۈc|oY4l.}K^w-n5h>~#*NR+%=_:<+J+?}{vm6oWݾ|r7~WYfN?~>ENh2.F`o1OyE3)wr'$6BpοC4۹ID$6Ąfeeޛe|:E@ΣKl A@nvpa [ ;7`|hċoDٺy^a Qk[W|j-;75rh;i7<^|#q0y7<mx-ya;Y9=/ヽ ̻^yu,3Wq1Mᤉ^?<.ʽ#|/NW.h&,[VƗ~o~uϳpO]K~vR -HW=>b=7r%K{GXuܿd[kymB|y ej9̑mYpu|uE'=k9&.ছoK{oyWX4DCtjvj4#t"6ޮ-+EWu3eڗ5 _HbQ:zj>&]ϝo({p%sPκ3;!<-ā sUsR6g}=:p/a5 |ZbԅC "X Ӆ}RMש]4Wck\K(v;lkg%SP8pxɟ0 ~A"17;^m#5#ѥNc(?EMIBF$j =d#2A E2K7ߒR2 tE@ORd4E4݅1Ӳ$ma9uY5 fӷ?`7& R<:>ϳpy\e&M%ykz q(eʅsgbR^Er?x7ۯgZk3~z@+1SӖHtMo.0MC] HY*MCQT.Z 8T9K.[)NzGrƛQ4[㩹.$RĊt?د nqA9. ZLh:%4|_Ogo.e?ǹQ :y3`?,ϼ"M,.>be-LJl]ПmN\K.,Rc_#"GC=dcnF%qBUl)|"Ș/6|r= "6ymdaQ|WBh 27}=LGssyL(؃++qMv2ˍp|yxH 3ȕBbE/#4;K~=Nz1 V۶0ח6J$2%h8Yv㗙fQ t'H=j_GAL:i\w}ʹo2̣; D|J3;QAaHHhn3 HiH&$3b։xCo[_JD0fm?`p0q"ͮyS(]kS`Y:X}};'&f } w-Ld hz"T)$ ;n)z8D~ӥ7 %# @Gqa6RJP&&#%Bױl")&RI@GKSWqa}[m>@5Lk#4g弄>V]<"3iS^XCM~bHl1yi5Ҽ|V {4w7|#?/ȌrauC> /%Y>fAU&۟m_ph8$"tm()sxƝWMTP/SϞwQJ&>h1' s֖ۙD !L"9z0j&VR^=%KٺgKх_?$F/>[G ZAZ<Ǐf"T{/yMZ_0 eL9>]]qM˯lǷ>YWͪ `N56q1aK66GٸI!ҥT; eg`92B=XI# Khl>xT*(E"#|!%33_^^'М84pXW~so7Y#k쵘>}hBwk,dADA"H7KL3SHԜhg*xr2t-Vټk/;xʩD)#484-H/BtR-]gq; 2WS^>Y^Ƅ~{.+X1-DlI_w/<]lS9%_gUͧ▻hX/ya|kͣ$=p8 $q!ktrYy&Z*( QZ>ϯ'j}7UNg55CZ׏F`RP8y"UMN,@NfPT1rGdNdH.|@62w9(]g4y .f6& <㙻d:E^CaL[/S/fvu`T WWSpQT;V6e&e. ‰"xjfs@^WzsG7S3knUg%04N蠡fn˦r^i»"*(gp1}լ.cܸ<s{>: Aɸ]:'1,CE+jn ^g)-f٭EFb?(\.UPI_,de7q,@ I,p 3+|SK[L5q:'q-w3ay/ d)j:dpJQ2m~{U\`JH> cA!` Ĩl]gH;| fJ˗ey1:__dqǘv 'oY3GNz˲0L3imgD"kLRb=6e#4 -Od=]בSѤoߐƲI۲RZWP7|߯^qH(G X& '8=iL-$QPs"UVWW󥿺?>1~1!zX$BI;UO*lҏGX-+G#(K4 =c17Ye'D,;v4 ǣ^wV]pIHg@9sd@KK=x"гۘ;brJS@@|Ԩnڳ-]6Ӌߟǩ:GAA(fN !r?}yIHlB(*0ư-[Ԭx P:B&*(Q150PC2p92-V@OtLETP8sGBD R:Oa{Q2WH6ʨ_((1y/*!*(Na'pɶ i%jY2GIJn2R8O ySCAAA%c!`0z>6se5%=dz%') "c V> gp7:ixz%C7X`;dZb#24 _tiҀ(WC|ǒȌЭ gi6}rT8яLa0>v2c%Fm\Z~U͊(7t0yf3f{- CGeH[;a,+R&knZuׯų).)L'NO$NM*M213m fLŭ)(((56w}3HNddITe_4Ck#(ݷ?8AZJ=-M-EcR_I~N$3(OfV'A(p:unRL61 +eC @hbLW8a&۶m# PP8E8)F@B{:`Y6Sfcy\άJH yy(%EʴTxbeɸp'4l5(" H@VD׊hc\HheӒfh" Hfϯۮa8j+{n̙C^^^FXS:dzχTK?<: -_Zҫ9VLYP5noP/:Y筴#M(8r ڨU8^BeڌZE>N)\.fPPP8ׇV&XI,$ rJd`D DseBcBM%J(T8=Pw g劘0R+zzt _#$Hz<,PJe00>۩:CAAAA<^E3YMG]CNq"|D{THV8/i)&l 1[b)BXO m']މζm g`%2H5OvEUߞ }/J BE:J&J#(jI'SyFC@V8q*aİltEydgFR[?xyxYv-3zB㶷?455h1MzGr1|MBP>c6oL4ͨȑ#lܸ0NHhܺu+;v4͜D"֭[GggD4y7ihh8'H$ڵk: B՝y<ƍ9x_}$m[ޟdD $4wIKWA\}O aKIĴɭ߀ذa m۶cǎA.h~IJ,^y?~g}.Cu~?/ڷIJɛoy)%ByEF2fɌƺD(GBθ-mǃ<al!Sa) =^{-P(xb׋iI$A2I]]^K/"L$#pv4-uNh"\.i- ӉB4(X ˲R(++(|-I]keQSSjeYcX & t:q:ix2X Gu=eNGQ cFH$Gǃa8N'mFSSurMjqN'n;$aIg02Hi8N(RJ\..kP/$dzr=z3*پ$!KiI>(4Mιnn7pGy&LCǣ,I"Hs4Ŷزm;{L;{4TYxRu%ߗgl;kzc2i6|^iZsIdXl, 0RO'B.+d;zr|K/#$-FW'8RDGKE[B_Xo 0t'i5Ҋ馷/-\Uw:~6]woea:1=K H)1MƔh4JII ?/"6m"//x'~z֮]s=,]ɑ#Gxiiir=o~,b„ s=TTTɄ XzuJg,G3|V^[^z)Sp9š5kXt)GoPVVFgg'ihhg?. IQQaCj*.\Ȗ-[ظq#_ywX~=H.~ia͚5|֦Lкy饗xwzlڴ..Fy:x0 kk]') B]k"`u]~P^^N]]Ǐ+_ %%%[q̞=x^*++;w.=RJnfVXɸH$£>ʎ;Rrwpį~+={6s;v_&3w\ yؽ{7'ON%ᩧb˖-`<lٲ PRR͛1M/zK/ .۷裏"nkk.>4M?saF˹kٳg?8ej*.r|IvIYY_5kրGyJJJ7a?fҤIڵ)S|b6lO= v1hg%3wR dUG~w7^[p=m-v1l**Jq&6(mm!\>JSƑw+qLKg/@`PC=DQQ˖-㪫 p 7w^vʕ+ihh^`Ŋ\z3ydƍGmm-vtfn&ϟs=ǻʕ+immeʕ\)S-۶imm%bY{k?9A}]x(۷oOQUUŶmۨvc/^̱c顧~+W2k,}ٔёtttpvgÆ \yY'|BKK wc˖-ض֭[innfÆ TTT{qw^~?m,\]M9:tM6PTTį~+vEYYv_2Ν;0a˗/' an7Z;prJJKKs\. &Nȶmؼy3㩧~QPPܹsBpQ֯_ϧ?i>0́ؾ};aGqajx饗Xl۶mK//?1 ,dӦMl޼ /B/Xp!ܜ |O^/y̛7gy}JKKq\ Ak}ݗaz9G5#.;JF>bj4挊(L Ő;2A>ݡ/yMO^Mco[&"ĴG6#?oa$1rf_6.3(wlz?aWxlcNG~/2[]Btix q&=@Fiܵ?< tW> EEi;<(?>?kL/"(cl{~M j(2?k㊫wwwL81erXhEEEqMR?Mֲg>,X@kk+vr(,,dʔ)466k.;wf6XEKK ===PSSÊ+(,,V:;;x<)R;cƌ gԩ̘1`0Haaa*0˙7oaPUUž})3f:ӦMK.Ix~?ƍСC3sL8aXEmm-ǎX$MޒǕ̟?!gڴi!hkkc޽>|8e! oMv#"%hQP8 )%]0.PJh xmOsHghw=G]3Eg'}K,m;h\%8Z9!|&XVS ly)gNbս+)sw˟y_7|ߕTf{w~>3 o#_qT*8e^xy-i;6RFi;G~/<)>{더AvDJMe'wu]tRRRyS۷ogڴi^my mf tL|r9 %]S>MOOaۛ! _̳>3Ll&//4imm%//n7Ѐ.l]wE(N_:N' imm%p8())aΜ9g&3s}Ϝ|y")) MشiS.[' .u1|x<444P[[i0tDT}}=Hdkn p8l6 Pӧru}b)@N`CHX!]qPI#DrNrӂu&mʤGpN,C3uecMԷ[PT$Nq eÁ GI̸f6h)drJϠLaPP #fhe<8UUCS, !y|v%:iĈ̎-PU4U$a&N̍gXRixM c)\V4ihjqkb1La`X ib]WQ:Nˌ3njqCHA5J]FbiQ0-AtdH&;š- TG XKyU8]ubJ6J6E/~ČAcYҧ@vmws~~=_2;l":b YYYrgBuE!##38odee_Lrrr"H|o:} 7`iNzz:i?Gmmm frQWW0;+ 2h yө ++ UU>VP(؉x+Fq4j-Z}ݗp: 8 &v&OLQQ:viiib1 #L8Ӊn_~׋(1vjjjxgC%))>}Cvv6CM ,\,_f:Dw{ؓO>Iee%|>.2ϟ۷/&Lo$n7<*iz1bK, )) waiL0?3fƌ(# <|ǬY:LAA'}%==~vZjkkloAAAL~{ʄ@lBHurrr$''}nt2ydΝ˽ދKYY֭;B!eɒ%LmK ŕ`~$;bڰ7_^V H)U'_i__P11U7EsC|6~yISo;S\˻/Ȓ&Xg^% Iq0}Ͼkӆx2*L|N. "b=}i1%5͠}9}tN:+` (h@bD6-csN M4AbzPŜz1ZO?̺/? X f%@fS-BZZZ=6nLTU%779sPQQTBgϦ@ -hy'V/ D4%55}( 7|3ݮnsM7eY\{ i֬Ydeep8[rqYgip /H$B(Bرc `ڵu#G"#++ ΍7ވCuJ |ر#swA1g4z8p SLAQrss\.n6499ٳg4q8 8q"C pp׳m6瓖i̞=[Cuf͚CUUF봴vz 6[nEI|JN#ǂZςa%)@$'طWS Tph4FIT0Rc|;hj`t|B'۹lxY.#烂DW;c4=}(INz&.|O˳YFukg4ꍛyi5-.xEKְ?dZJ8X1Z[i4-b-լ~4{B mT+fd}ϚIWHf^OEd5>j#~`ͻUlg#LEiܽ~?<=TH+L^w]3[s?~?ˢ4I -RfKhb FA?Vvּk@*".;PU_%H6X K[8{pIrl8I$)q|8tJR4U@3Mn"E,Y3 wΐ!COUnnHaa!ޗCNN~MOO'===3}oTUeРA>I'??w}O>} SRR] }:x 㪪*+ĺ3lذȑ#=%77w:ׯ_B<~^_rrrڻ[RRǏo[[݆W]ѢEHMM{G>`{z?w;yIMMeȑξ\TTO[ږ.tvkdggOIu#Fmp ! g.";!EC ph ۰D)mj'fXT4y-aiѶ0ib!PUA΄ I0ʼn"1jCLb-Ul-و?E91奣 "ԶsOPʳ/.l`m šݹ_7k~} kZ{.=N}ۋ<<}r$M3i_$|3>|]]`'_nq:sTۖd?kOF$лG?3 y'w4l[urw_dY9Fn:95_ Q}xrr= ~>݃y5O_]$({UZDr#"*o>B44#@!tP"-AR<6!_#61<ēN7reg30UNA8o{0SZG]

<6-+ٰ<޼m'?Ġw |) 0BM#-g(SaqɃ(X%ںA ma֯A]p'M8$Tat|l(uMLNd"5 97EAiŒE(Mu;x筷Yv7FM"Z,b9eFi(]k_قs̹2Q8*b.Ktņ!PD|,"7JT F0›>j΄x%##o=qݡ(JG}lᛨq%N<~Τ2DrhbuO$<H pVa{EܓNQtmT_`KA ˦EzNƌ&7ى&:3*H*`X1L+;_8\.0,k?D"X3+;ch*}{Y!Eϼw 'x,}>~.os,2LōHAUeApL{:Z,O_OTMko(;{>yg`ogsE짬= *+̏βZ[hokc vo$lуihkƈ90lS$݁%vhBPcu72_EE 3>ij[)NJ _]:ˍCP ֯)y:4;v!Lsϩ=1v+Fcfjnb\3g8囖BdOSsSݫ IDATw_a9t)nid\h׳TOPRWaKLNڳ"LEl|4;4lu XJCxej%m_̈L;!bhV4YqK,ؾp[KZՁ}eXJ4l L8.D,+.H֏2F ^_S+)mPld,qHa<[zx aZT9>h wgOG+_-+YQ׏n><eIMu)~<~U4ԶjvV0p-L4?_Ⲛ(l§WKO9)n5[n $9=屰< R&~G}>Zw}F_g;~U f)}l[ JCAj%:b?烥ۈ:R~֊eaլc٪%(oxJ^f^W<ϡ_.=w8̓Y~>Q~M˲og糴ُK4Qc˷r8wdUq- b^*ư[J!d|4MvnCݞ8hQ kwPVR˅$ߖ>ޟXD" !:}+G}k:6շ`&Bc7RmjɊvj#vJ .)Q=ݲ'AB+3IGjFzwG3og*=6{EUq{3ᱫUOz>MLe߿+oS 9)ݏAkpbVFB͋`#QW92dG~:Mp%WN-zLw3"04| Np&0MɳuY#s{2>E÷ӆϦj:I9Irb Vk]ӯj*b1,|/E 1qܭY̻$9;f_92::,\dr 2HlYEkf>e"|9LdH@\xЎ]VCrZD_.q-#VO]즽EGơ uҏU6);x{:ͦ{oswتzJZA SX >Ԅ#{|{MTRf&LH%/ho6&-%æsF,M0ŏM3ڛk g@rn"XSM3.܎i#LK}-,! ."JC]#-Xu2>SŇoNI~E[S mh I'Eh-w#xI\[R,7T?@jL')~:UQDq@8L$&p!JcmORsD&kh:I &rhXfZ1,$pٻM4Fмxux]vܣן%Iʻع"9D)|pfaBV"91IIu+„c&׭38G16*+e6*XE,fReyuBY")Qz-:{X]C>{.XHLJP5xWd%ݭryZ]iEK4.BL #H$o28@($GӲh3-ZonA;̯DrBߎz# Tdf1o,qVH$7cCєU.9~x ">lScW8ЁS]x(H$c"}%Gڞ,e H : B+omS-|Vgv{֓H$I/2}vTܓ+r[`IN r仫"+Lȱ*g .%MrCr\whRHNzr NEpr[Q"HzdplΔ9%GZ+Y%tDhL%H$c"I[#@zO ȡZ?Dqc.%p2D6gzO uXrDrZYD"9D>5 l")@$' pb@$D-/w$GҞs g^XVu^8')@$oH$䛘[4=YRSam ,ں0p44!⨥H$ɷЂ;fD6/I$e[8D.BS8FC Q!7E#R(In  D"H$ǁH:Y˶5U朚MЫGxrrS\>*)B%9x((]fkYk8̅-}D"Hz՜ Db.?PLK|H`Ol%ee57E8fRa]MSGrTUլ X!c@$pzTʷ, 4E(tD"e`۰zT}rAJrdmd.8oD*SYZQ:2N JVpz 㼳YRU !;!Q$-5eh q|\~hQ  "iCg Iat|7lnIJ1iVPd Dr.{L9)HHc/}>1;k\+1Qk/Q۫rqɨ4:4g$5.L.KRHWSxN`ZebĢDQ F LWFjڢoukb$(FO=u>ciSϖʮ$JXX$zHc1[ Q$IӢg1 {]}Q;ft:4’=6f 16DA1 g/S,南_geu4-ug]t)rݟiĈD T͆)&eH|'},]>7?aK]+aC3/ʰL yVbR'r)JuiƧpS(r`Fٽ|{ jZv?yIH٤D ^$+_2 HY4VBPJ6xz3pIi zt(mgmu;UaWsXRHNN #zFQLne礳zxVvxG_Li2mr1,h]%e%h;)uDW-귮㹿gW iͮڷYﺖ~p*<ԴLl(}#7w]>,[+U;VƓ̛ ؞z ':ˈPu&inDk/|ExmrX"mƽ%!)Hר86/8gX*^9vj[T785R5w-o7Q  2YItCs}728?9RkiD797tP &?:w~429! ky?Eh%My)o2FbSsOU=65R^R4Dh<^Zsm 7?3/''O%\dc'qIocWk0,1.Doc]yuR\%|,}kR$V}+c@,ah.)i l*gZ29(;+j `󥓛Cic׆/ٰ;K6z~H1]& vw*9*JKw#-4qUl/D4PYLRqRNǥuђOJ&~zT^(.ggEB6 :Pvn` w 4ܶ}ȒBT*4$§a1¥| v\s2Ch2~)\MhLLCI4w)̈)pA<&{O_ŧ+8e M.H$fps-/i-y#̌XOԑBЭc"sH9s1 4M}YG̴dTgN!T$;h&|ʴ7D{Y  X̆m|Tm(:l 1GGsŠ^ZݍpFO<*kM{w|8n~LccYYL<j\yv>ּɯ '׾[bG\m`yPwcԷ+}>7~FB2f,mE݌,每Ks2ynzZ A&pQRö$ux݊ X&ׁ?ݎU]Ĝ'SDU@q$!.`NCΡt0a-턛c &j56SURuj2gDM 6|\xDZ9o~VBaJ_ ,싒#iH:tc{M-m'+>^RT5$"]$t^aв%~_ T E1ZKX#Fᰫqԭz_x0̋.ň^<'1"A_Q2kz:zd ~ 4g4rw;YsχkycQ&.MV(!=þ,By-ì(-u[X>i>h+T];bBk-[で3ur>J %ÉhbVg )J¬/%&gj׬g&C.Ĕ>m0 tH !Z0,!n B-#_h˟"+47ė33̟)&#vz,~= 1 o3GE5 m[[ ]@؂A2\c@K˟RrBt^b2( oz.Y&ә5:ƆqS}^] E9!A뺧qfظ)7u m} lcXq=wHa\%Bup yҰ*YZ/gGWv@V|Wlbf9PHNóq (X c {8QAlFdj>{5TjlGF[1aPZRLHge24C??;̹z*> ӲK!,@:NUoedNVni||>9^?).iCJ$߸ȴzI$~յ\q(Ҝjz걚`rCr lYq޾e Dr^{c@l(3QذN#7*sR U {*inlm#XN x{2KZdO7$u\|~#dRRWFsQu;B4Q})ﻭkh1̽oxjZ *D+r ͼX?nҙ\uHҝZ3edwc7HW2D"9rA1UEE:sP0- UD$V𭎕#f2躊Vڱ~*F?J\)f-L'l`bPZJġP,;=">* F on^ǂ?tb1Sśˍ"Vw~VNь殫bX[e\[Ɔ6NɵT.aZenzGYbKsU (tmVh cPUٍ$a3pM0 >ū2DrD1- qb@2  B 8a" kO&Fs%[6o@;z` ~g^tUS@t(nCP͛Cd%'3bx6cSr(maf?_80MRm V~o*͸ʞڣ, "͍.'Tċ&tzJwpG}r!K^p(I6T689q^Ni2^~Zfq\ƝlXxC%1b`2^y/dc4O'b\(E⧡wԥr3+M\v3Z*'ͺq>L+|W]lH,ŊRm#̾z/䈶#P\92.:7LHgCy+_U!c@$LfZBGbѶ?J,f&d躭 @ce!0ps?eϏ㖿gg-!i&^x^AAK8 ghb vQVO~iv˲0y\<.s ;{*TsຏQ[qƬk"?_!]t5>ZQj|vmه..7\Q.?$o^Ӵ3^zf%ua#clZwF10)OA=+c@$^r&`&aSi%CL*Jb[o]$#=WCʴ td{ &0emrȐ%\Nv|~<6m䎺(vJ Y9|wEcVPdĩ't8f aG Kޥgg\q5&l~Mb\<:B9sm 0b*}Xf=ď?IkP$3tHz6ݓ̐ūj3/TN¯uTnY? 83 L?s v| $D&]> #dEşs3oPA0&OJkRzJ$'4sO.9XjZҿ]r?r-gS8}Rv=6xomhYIm*% {~ ]އȌ/A=Jea&X6<NL kAEQPE0A(jQne TUoZiWڄ*LTiyV]_3 ĿKwr՝ۙu߯}h|ABQQ;&,s,ӈUTq&i%b. =2MLiOe'Kf/_>u׵J$`^,jkk8 K IDAT:[llo=iC!9dR;8 [h5zf+|"q4$1c|&uQiool6b= )~vk 甜(O[PMq'j(P-z@♷w~J+BMF%اC׋$kRoHzy\ߥye ].]᪱!3+eQ&)@$'11VStlt$aV%c7,ƛ_;E 0, 5iųCnRa8I"9!:l\/toZ_G8<><H$Cǒ; b|] 7wS?:A| 3' 'H#D"9c+Sm$9&;YTڜH[rV֞C@.qJNUqLM"H$S0cr&^=$ߝ:DP ǣMo=P"H$S1󋲰dvQnڲL@Ug,Q޳ 1 xG=f.XD"9Ů;I$GFv5eҔT3_2ߝh*fbAM_< ]"9X79!D"`ߴa6#abł3~(TUJljq> RHN(B :ӓ"D"HzYnHz#Ԭaɖ.Wm1-1"_#ao)@$'ت<M0 04S,4 yXv_&yY~TF6cX:ee0)AUsWz>9IvaaEUVAcj2k;>ٰ*F"%COb;eu (]ZM}[&l+%I"6AO.! Ek.vUazr𡫀PV\dyuTE umod2Ʉ22&%lg7]fw9I}uu^gԵh({GawcnRrIuKuܵ,6-?kT}W5m>Iu(eȉfik`綝A23D*شpQŞ:i>tE|oqO7eXUht.ivO@> HPc5@U`;[YVwp7,d Dr@~c@:'H$B8qr^|[뇰ElpO~v4FE-z{Ͼ2 k,cgYzV.\v .6.>0_Ksphwǟs0[/i =>)v<_۹d?ɳ3pڵz:vSGٌIifCww2b5A^?{S7M*$?عWd1pnv 7fi\4ئquwN'ɦt,]vVB}/)YO!ӠqOv6i|sysT SU~R3~0"zYەD3U5;`!'.K$86 !PU͆fCQ}ќ$#gtb~&A̘Ik[4խ!Hع,[VݣQd Drc )@l6b+dICp,o<ҭaϸHr ֮b#Ff¦\&ח1XԼf2btZol<|Z+7maT!4/m!e&ͼ* _gE^^7vŤiw >ˆԻS5K)3_:]Fhj'ui @ aQ^N}fwT-ԖRJ7-g[tmeelZ-5vۜ=V,[)/ bRmD{݊Q_B73gg,y{1g %-}5`4>^'؇ù?7O,ĕ=~}X+J6PhH!YGf\وme,[_C% Q5/fٲ 8}"Y}UӱlTPTl6;6[ajl䍿>gW(]\&ͨ~4R})k?g#¾n'iC )RTYTUʍ-Mӱd8 O}Z+c4V~v1UqrV]k}Qw $0 6m0`[;Od&ܙ$I'xXB }AKz߫Z?խi |j:s<1 3i(il޼}IieUu5ÁwrH~v3O͂o#?|9~*c>4'E&|kO[n];#vX|' JK/ۮ¿m~}^M{'U1<~Ǯ^Y@ԫbejKr]͊*S dHE 9!m$26E! *#3q'"\怌/nBPLJ.db%Ws3 |0UD#~4or|*m+%>srb~>v?.^}R 3J㧴v%~zڋrͭ7*7uO H #t]Gק 5\@R2;^;M^/[˝wld8{;wWLpzҟy_pW|n*`= Cz-OMV_Z_({5tPU_F4@LП(.~l{s - `U]dɍ|,[k{b3}.ME%X{.*3@{_GymVf,YƧYUI㭻yy6^k*|ɍ|x,KX{ &z bYSl 3t4HfMYh2 ]2cx9 hg-2UCeyqlxƕ;hBD{wcy`Qb_gF.~f0̡JʋLa2@ARQ%5I 14K29'G*+ŕ!Wj~u4I9?>sBn!kyTF3 <206[+um!XKCP #VZEnB%U&)-!=FJHᔗ`!#\;- EguS` ѼOi(eU'“W1}pR Ó^iK xC1CSX?'beS~P0rJz1*19Q% U&K.@6?O@Oï$,3= AɴŀD"H$s,21LUyꋽ׳l$io126\\H$D2]32Q k& ߼#I CW)/a$B22'9"9 D"d-wɬM9 pMc{{3u-rr.h3߲ %H$ 썧Y BpQQGНuymM;b=3uJ"D H$dnEǑ/Sx,y0UP]`9Zs@$|D"%!w@$l(4Ma}X]~27QW:LN53?P"W"H$7UHfќ9bSʉ){U)xuE^ޘF@`|K"d&D"H$s+A$?M/?քSNQؠ KbPgD"H$s̶=#y[M!GU\.)y1reFH"H$D2ɬb_o!7P74Y͏SSS05_l?{Dr)J r!H$̦93)d\̹Vpˊ"6Iso #\NBo)@$@!H$ɜckDd%_JF<90+P]$>6s@$PhEH$dȤyضQ5i\gxu}ҐLR0mg93Dr2D"5hI$S82'OZԖ{e~͋xnLrdҘrH$ɜi0 (l!JB>R?XXdoێ'=UEH$gEH$D2t~I.@Nj;F(ClK;=7-Dr&1}D"HL} "93 9 h'\A[a_8_͓GFaZ)8B"?gD"HX} efL}4dqH۷0؏GWxfg;[DE>LL$t->{Aֶ6wFpȍv x'#Y;H0GJmDY'MOCr^2vW./2[:LYiloߊH>M:ͥ޷]IlWZu79ĝC&{q =-'j Dc越ih&r!^a1+~ƍ}<⧸|^9̶Yz}+sRtM%}gc϶$2BTK.ԗ!4,+[+*β$;WbQ|hI.y#s@$0 zs4ƜiٙVygENI$@usefRyּQ#Ųϴ`Y6BdC T.l+vڬ^]iXC\:4:\DZq!u8U|Cr7x1A 0Թwª"6=3;D*(Jhqzu{|Nn.)Dr)@$kB9Vs~FA@%uzGs6!"k`͟~-plv`)PCy ń#\K *.-TcRT @u,yͣBvjl8vn`:*Ƕ*9;oO~ s8.gN.5qq9C5_4T:v̘ST}yL:@WBZc s**X9 7 xԡvU5 DWǻjvXYcs01b[6({,,O CGSN߯V.7o f`\q(ah(vU4M[BA^yK/%0@-yൄҭv; >:? Vy*N{{TMS0Ʈ.?\K4UA!ȍ}F +Qb&Fc{Ws:m/7kg1b鞇iM#<,x籲l7,24AM׻I9Ut'^[K/ yX\'$OarjW>Oޔ-^n!mi: ~W{Xr#cØ [MaD\ ʡXr^<h08y9sm&BaKQ"1LxrA,L1h,XT½k )7~{:>s'|JXHvӛQ)_WRU&SlR$l,[Z]#6GBR>CwOi4.F?]ZvDr?CNyoWC`akG3]?]Brs<6JPՏ%g=į}^ Ż8H!r}Wrޕ~׸*:ě?;jy覅({x/|cU'ݏ>ɓ-l鿲EY}}%*l}ab x~W\7?}Orx+n|[T)>=~WQBn&Eos3NCzh?oH\~4F`Oks _?}w!!^Gcčܴ2Ljp]<_{;)~G ? Ásq$w?ǮT*0~ͣ"$T7frw5vQzRWOXU=,,aMGYW#o!ƪ\-[ش_- Ay9i4Ӥ=^c.G-ɧ6 򳤏?~_Z !~x K*]CŁ7og,\Aa6bL5Un[2b7h` ow"]:ѾbFD޸H@CXQ-'=ZMf ^X]_*D?MP3C tH1Qlyq'x%ptk(."o;bSEPTaӹyy` j[ƺqp)]kj(%wrޝ E9"YYX2}4#KwH-/\rRUx25Quwp'>y eaiOm]%7-Z %!4Tu<=@G @}`AS¶ގ2[ޖduEZP/c0uu &h{#rzj #|hO'Je^gwYTznNau9IAα)6lޔu M2. ܷ,LmI O8ob8T̟ȋ7"8 WNBUxPAUJgۉwCwx H{l?׶VGa(ceLU \%7f`%Ǫ])HCCm)yX~@/F"wu`'vs9@VDǼ*ySR F -1( 1;YW -G) 5h&E(!5 * Ψy%19EWU\PB(]50U\.&{Dj~[Z7)-,xD=43[HQY^|hf) _4.;jBr7^wM8N$kmPUB5WCU診 +} $ʪY}:N&C#bbPeѪ<_çLr5T3L$VMtweJ:'nd&P5})4~ڻ*x:ͻ:3$cA1v?K2bY`Mm hׯIqE0_BO9JЄLq Mfqukno}z)PI|_."=E>psr9,>E-Sc%ɑhi1pp5He gJKESOM,U/Aӡ39@瓙,)=id'c%ɥRgIf-LSc慦"#"W^B:glyo\OJTNU 0$S[+#gx,:Oܿ$oe瀗ZϘ`Vu@jnGo_ J1̳܊ .8'UO#Ul0+#8~}yWVzH])*ʔ 'Yzʤy6V́1 S#99'CF<1Wk J8 U\[/GLDkB6.+Eo B*b.ƹɃ%[~pql\.G.ga>Wky7ɤI7<ΗV"C6Kֲ9aIw'܉/@QAz(\$Ld.vS -MВRF$Z&1@`ex)24oS;KTO3뮣";^E2!ng_a,_PemoXW:bw?;'Hgs[vҝ:!N;?8RT+&%Hf2$Zoptĝ)E۰ Ͼ4Lx{FJ}'m(gAzr"^7yo)W&!o7[թ_Yt&,^` VT\ OʣK* z.grޏx|Hj]G?-& a9ܣ5o=(gɪ:&H"OopudAqp-wCs7jUUSƠ* z ƝKʰO/C ZPyT]TYTM F`x4UU#:OQxu MebS75 }*:&$4OG34"Q?7׺xN*mXϯ U3x O;Xn\^Wm~~ ο U"T4 B3ӓ%S-Ѿ 7D% b^UVeݚ!E["ڻHj oFӴnbDnbZ)ؼ b>N*AoW#9z Bt+(plZubQ} 87JHߝ[&3ȥF&e  #?__u->-m!1P}^~?~""nh!H'%*"tOEI\.`* AJGJI"j*M̌r$S8b Dn8&(2^pI[.y+] 衭kd,|C3?cϲ܆!VXp|'潛ãP1}㢘~6=+yk$$z[N㸠yB*U\'`,wLpZ#-H$W:ҳtqLoH@(d7 *0:8DF #e~~/kA3FAzxr\w+PO=3U4OU|0== 2#S@g݃9dm(2 X.ǣSR ̺(Z^d.fXd5: ²2TD :dsY:\|A'ceHB>U0:R=ļ N&KLjkz a8e b P5pC_CUCYYBAcLd*ٱ{ݣWgX9r{CZb@J$Cqeo՟F_M:]+c|RJC&9GЛ]<-:6E)cZbn'rCT/r 1VSxK)r?bYIR t% (5Ӷ[Z:KPTN|1alZ^JNi7 DnXD@#\4&~h9uyhJ Fc^Q=Ck-7Y _Q5Egy!ZF+Ԕg&NILdB'YYl>^0^ _0?т^YQ sbXK!}Sf,)'9eZ3 ,r,i3df\ +@>sHZ9|8pI~u /5.^ܾ&q}3LK:+b`wh?xъ5\Q\F`t@(9?Z9W@m%>g5|VH$;VNɬ3)W>]֖x) }]+7T\|J_ kX.Bxb[7|\')@$1)yA"D"+c|D2{l٤ԕ&a By{if&%RH.I+D"̩X!dIGbWzVǷ:"H. dD"H^/, ƮaWH.VH$ɜ.M|ƕ3^pJ"\B mD"̥y&w%i|r@>j&,ɥ3i%D"3 V^@[9 LX鉒H$J"BBH$g%2D"H$srݑ̮9s倸2D"9" s@$D2"r]26ƅ"C$D"̭ DrU "H" H$ j\W:$<SU(lul g{-`"KQND *ʹ]KWQ,)@$Ą9 D"Kλdǔ cc*+.3ZLNz={}k,)M[ t3VH$dQ.UzS<ijM|bs'©^+X_KUU 6^XV~^" %H$ ɬa6EY$]Uw%,)@$" WD"8+;B288v:vH"$V;.Dr.s\֑Dr ̐SsA&ge```b;$=x^q\\םqc{kqך֙}$yNoټ)m= c8iB\Ua?ndtiuuu L˸x<|\z5Yd ۷cǎM =U|T@̽chɇSDrI*p!&o à@ qHRSXX8bF%XaU( {Ŷmjj,B Cgttd2Eaa!iy.## )//#҂\ץ 4uAeA28hZB鱗+.#ؾ}۶m;'b:|~:;;f3TUUimm߰qhn>N.xD"PZZ>*++ BOqq1l\.GMM Յ#ގ(~, \?~͛7 ?>]]]9rBp˭˕W]a``Vi~P(a38K0  N87VIϗDPU)@$L_hkRQQA.%Li:K.%s.*++ؿ?^e˗w^,ˢmۆcrze˖144%مjTTT|2e]Ngg'`ٲe[W;Xb9^_~eꪫر&9gYPGL,*w/R& Q",:/#;-dƍTTT288ĝwށᩧ!>8?ﱲzLd``ݻwSRRB]]EQ9t %%8^>L6:TU%#`^M eqt*B]]W{o!W^Sرgy[o>i‹TVUt]vn։6::ҥXh!;v젵t:}J{,?aJxGٺukyy9 ,i젯z"lpH$;RH.1exg"xLӤt,~r(xnΣM/>CCC {nJV^űc  N$3~`FGضh2ɺuxw4EQfc|>/9zG__@ "!Ihbzzz'B2,h˲땻+): z|JT"05:zpiy'hmm%J188D:cx<&$Gu2re388磴χCEE%@ }TTTMoo/TxgcXrq9aoۮJ' Zebe2Y^*]]4>xPUt:E!ɠ( /"md?SU@ כdhkkϺu4T*ESSph4!f``GOO/~bRT3FBs4,XDXf m6X20 ػgǛ-D"VXW_^{b8/^Lee%MMMg 4ŋs71HAmm /$qh\x_K__r-D5^/BsNK_I.jjFe\C2!|w6 z.\ڵkBw>r9\ep0Nkk+CCC$Ib-UU47GMܹk"F>Jk.Yd1}8Ö-[eq o͟?d2Iggee3p] ֭[9v8˖-X6Kkk />->˲imm;$tz䝎qAz955541Mp8ePMPU`08`ƄUqhkkeddP(Dee%s,c``{wݻ E xꩧyw(`ݺٻw/ 4nz^m_nƉ{ SaijjG:hj:5 Ru/_N(uFdhhu:Dh4J `KSS~g*\ DIٹ QK80 !X$@֬YC__u],BԱrtvvr1j)(H&rJd~4M#L2::J{G;ŀB:~«=|!YbiMOo/Pl6Koo/c .cA]Ɠgcղ,ԇ 8ir9\͇]cY6`>JKKQZZJ.C ˲<\V\!x8~^4]c;v6jkkٹs' hk$u]8-L[[ Vټ5t]gPv{,-[H$hii!-ur ޳D"ʈF H&% 5d 3سW"瀜6,Y+W2:::| ڢ"47oA Yj\i5k)=iőm;lڴiL`d)9lB"1ڵk2eټ 3,jL=iW<@A%RDJ$EjuOw9gDl^WO0WllĉsǩI-$![WfUڽ(C)JȪ73|\vI$,SWWG&ad6Zt噝vz*\bH8&J_ I2L4 \|EQ4YvsN:T:VUU9u?pJū(y0 LOGsP,XXP,I&Jcc# v B$I">MBE%O2d2A,{lƂ]9qD5V g~~BɓҥK륦\.ٳgikkcrb&q$4fLLL ;xD"y:erq&|˲jpܼyt:D3;ƚUV4=>lic@~Π$#IO&[z}|477saΜ9åKٹsXnh4XmӴfKv*DwE9(>(!ˑߵ/U_AfK˕+Ń "iVO$v黮9d3b/ ]`ffXE.Q!e-J&.4ni||MӪϚN, EQEQKQ>Rd2߱X2+KU% \u_`94$.Ƀ2V52-y%v?QblXӪŊbl,/@yYxd2%JOIhlld;wSNsua2|wrO)e=`ۧyyTgaTlE4i}#:N+V0p|FE>?yׅ_~M@l0ӳJx%KVgg'cccLO~bcl j(O< "Z6޸c@lxybYN5kÆ 6rhݿmb$*Ti|^l޸xX[~Z׵,,p\ dɪW"( HH$ZZhEid2E;=ֈ{ !\k^ѵ,|>G>dObcMK%;Ć\ CBy1sؚ~ڰұ_((kFI(ǽ(ah+kO|ik+6B@|«+hUݯ|K\**UUB6/3y>5j=5aǨLWԟ, }AFoǟ>aֳ:.X6l<EF4bA0 $IbY5)` Bן^qYFdUUW$ZB{]lEUD I0,Q QAYЌ΁$HȒnQ%M  R4Tṁ P(`YV5`p:UH .MߴO2$ڭ슘FdI.%CBD$A´LD$S ݲ ?6k۰5Ӳ.sa\pIjjkJ9Wfgf~==on7^lڰFrpI׋0EH>Dnj<5L'uCws7;F2 Nz_o=˨Ʀ3p'r\1Gֺux]M5HC2 첤~ALSSu,pEY~=uuuɓ'HR)4Ɩx..O_%㔜t6SG 30as&4buU0d":1f 6*`EsM@lqK~P F ?IlOJ vf?žZFCQ^c(Ժ4tiajݵlmڌ!9HDM- '¨n'Һ즣`gcC7vM(>C2pux^j],˴  lذ@OObvb[lȑ#bCQɜӃ-;>DAqhԸLD'P o׻uy1 ZO[JpDJIh"ۃĆg6"6-M.l.acm{}0aиCru#YJle&9KkM3OE\N7{7BZ _qtvwsqoF/qLLAsES87~q aJ%Dx^HdY8}4c֭~$IٳHϕ+W# 1<7LW}'52=h!GϷԳe#4чb!ۏ(O˲XsJ6>% 6l<s=JeYhiYXIeW aȢSv" 2)fe b2*B]DQcǎe B4-b( EQ( hZyjSc%پ _TMӲ)ł5DA2PY y.Xvsk1e/' <)?ƚ͟r.&)F ByJ$o9D fɺXXYb5YW)/%[bH6tVͻ\. AZ[hl,}i*DĴ*3R}Gm;h5PJ)r dI-_6+ vat<*v*\.7wp80MYK[\ӌ,J67fnRP ZD.A%Kp8|>|?]T>ő'K!ULWD1+iܞM[M wC?0-0r `?I#J"l޼D"W_}ő#Gp:|(J$.e-fKٷD0 Q~)0v6G%Dߢm+| "[!K9džU+8& 6^Q&x =rJmx<477z4T*E, "ʲL[[v*{Q,S33҅4?J˶n(ZM<㈎d!ӄaR '53HRIMkn/K7_$/P(EErib 1M?4o~xA/riDXBIOWrVN+:g's;z $Q'/cX(S z&i}X6\M@l*'`_P @ `˖- $BOV3inܸibPn7333)ܹjpLNNp8vZ< pd!UWM"T]J=hN{yU[mbQNlt%"p8ر`0[n%N,8|?ivikkC$n߾tfoߎ,ܾ})Z[K;|LOM1<6TUur,Y]5M0 t]Gj:*",UcA* (I>'LVr9{3Wornj<5].UtC륫eﭮ%G$I\lNg5ap8tvJabk|]ծb(OV;y]V"t:BH$BOO---@ssׯ_gnnIؾ};}}}p8BE;sss@[[;e2gaaEOO۶mrU+[@4\.555ϲ-/<Mmm` \1֖-ni\߲e}֖mmmܹVz-݋z蹍; O܎aϻÎ 'N$9}48%'nQ4W貙Am66nH{{;uuuȲ̆ hii!1::Jmm-GSS3CCCXEgg'Dh4JGGT)ĦM0 EQhmm>`ff+W駿͛K\:=pp8\kllD"Amm-xkmaϻ& 6AهKITe,d2۷oxa 2apu1M7nd2(###(J\.a 1 a&jeY8qI"0j7{E72Aزe N BlX9w%%bk1 RqeYPp8|_`i= V3*0 X,dQ. @"X{aԃ$I{q8MQxZ\T4$IT*E>gllx<֭~$HTJ$x<|%9s 555fX,rm&''d׮]n2 DbXӚ7lac-Îa',,i 6ւxhhh$`&(N(մRoB7ƒ>@#^ 9}t֯0 LD@R퐻lБ@ xg IDATgP|>_*&"IR:zh41;;͛xhs%Ɏa#?{){~̆a(; TKs->ssvu^QwV.>^h.8yS2yX;oLwZIP,ۜ7goc[(nA%K'.FUw"wU,]H.! dEA/D'vMI*fggY* BTEڭ[AuT)zƗ/Bi:믿Ιk]|C\< bÆ x1!(OkvArt:J:*W~f[[UU++ zn޻U9(%%cof-]DYr-#e3ww}|^e]Nf1XwrO;6<,a\,9JBcZXƲ$AmZ0q.N]V rxtt/0$,9o=eϞ1ʰc@lUJXYذrQ_d۶mr9QU1ƈb.,:]]]n,"yٱcW^ehh|.H׳ڰ␐7@lڰG)M@lx2,^;vݍ ܼyQ4>~֯_˻w#K2/_ٵ4lذ|BdESHD  ,dNh Pd-U;+տeZ֪=-gC~T,"EU^}U8ΝcffUU ?mmmbdd'+-BDO,DQ*B,G{{JXy[AVM_GeΟ2<)9H)Uݻ/2;;D.`2Aer+ՕO646l<Vdxv5{(ea&$$a%"XiYHb4M,DIrكڪm㾶 iPNea&PR*kkd@0 cU@EIgdgK46Q< .ɭW?x"#*[Tb`Q'= 6 2/}UU ̕$V$I棏>.jPxmUUUe"kq[Ifq[Y~,>~p[}.n"GylyQ- Xm=踒=r-0)gV@*r:u[nR- q;x.xd7^^%9I8%(pMd>iY\>jR4iȢ,ɸn7l 4)ZaY2֭[ @"P(P__ѣGcrrD"fx^&&&_0t@ࠛp8($VE~?iD*"V2Kޙmf;+$E_&r}fwϤDQ0LK_o7҃yxW^`4sSW^ٳ̴pBhVw>#VЮZBSI0-w }}\'Bh6Jn!4|AUSa8N^ߴh6N4E35̦ZZMPL>BPQ!K֭[x}7 $L&!~jkk&Iv @V$.jkkp@mذaÆ˖\02I+\.:ڹ8yKOZ`cSw͛53餷x6N+SW9|u\H[W^I&(*H<%Ѝg3MT*EPȑ#dΜ9K6ennP($ILOOJؼy3wիW9<~)\vZ!:.ve˲-C|>/ۉF?|>޽{ioon +# irlذaÆ" aYI%IŴ̪X^Fh7Q2\~DA 3y :I:jim!EQ$)h EFGGeUUeh4BP  ud2I$A40T A(e20$QSSY(Ba̲ eYc16/fp7nܠfnfvܝ5 AJ (  6lذJXQuzqJNN(Wrw)FpJj=. @34dA@/Y r{k:$w bԗ%EP*DXqZLhll$aXCSSSj 8N4qKg:6lPpƍ5ӴqaP(d2'ٖ]k[1 6lذwY\7MTEQ/*E饭wvE9lz76෯|Jd,:A^SP VXB0,"rK=eSuݠX,V (_pC??377K*ѣܹǏ*(Gkk+D%i-b~~rUzMH& %Q!3dӧO4XX ǖĮ ^؋,KřygURUaUaV!E8<[C%0XJ p-mTOp'-ksLaK+ET3lZAB' 35Bt̎=NVfYYn}A|WWif9vJD&n%TxMu>qp콫#zLMFf1jG]:M=9كf<^{Х 0#߉Ƙd|H5R'H.06@ yL,b|"N3ȵAF'>>7Ғ>c~|hAsp0 c24GB!?cYKWLNx>$̟x/z.b&eRWȃL NQwIsebdsʈN-jxTtbٳgX5Ih4W2$9I%E^I2v⒝̧Mqn<\ ;=E ,Ilz)%*upr^G.XQUUg~~Y<T;(B6EETUejj ݻIRLLLpq/eY l|>P770 `&DYٿuq#KOy*~nc@Ͼ^lei.1qN|~YG_ZhyF.Ok5oS޼/.iҹ8JK 5zMm5,1 X&Z!K*%Ӵ"[L'fXdLLn(SFX"ǿx1RIw:)-L-O:©XHw T׽N} q[_B}"5uWSύ6ֵ:TRD YJe !9QJ538 b SLݒ]+ `ib! %˔Y./`&T0R Y.={Md5 1:%QB,4A\CӱP ô=MlyKE 0u+Ȓh/}ow\J,ðrtwҫ2P:0 L$^:% I]+]E$Ɂ$Z^"ri5 0J["q=o|6-85h f^eDLg "2XU]KY$E0nꢭ&Ïw)d)`0-Q!KX Hw߻Vz[ Nr? %,H~j H`w}ehij躁鬈RG;+SJ2%0)E(JR@e*ݳ@.$,r1 TU0LLMp]/M1gZ=Zq'h=@-ey @7aϫC2t{YzעPy.QS"ˀ`U9(֢*(/iowp:徃$! `:aiZƌmiwnw TMs=Ⱦh 5X%c8M(ǔi-U_1g"YD8=IkS.QR\J4}UKcMXԷLD,]4&K54,Ce LӴJs^eNtiO zq+ߟYG{$"$R@IJ&B-yi<: &zHBa8lzBg J(1ђcoHߎݛ 1ř|`Ԁ3F6 2;[Qgr!TñclKY+7N}dor .&0%Ñ.+Yc:5o~@{eDoo(9eNon5]/s~䑯y79ǕnY_nXpdsq[;pL#7Ci-=onQʏ'N2>j7f*[PnqƖ#I9\H(`yvcDקOxhT*;v&JrK'zc^ijM;̜g;.[$7~J_}gbl>v@ _C}-"C? #=HWPU)9N \6@zAGɿ˛R =H;̩sa^n1BhS@r $a:1wHz 7tRCm4zXuF9/Qp6oeߡ^ @%@&v؅_ͩ/i8#";8Xvѿ%!Z7>LI2n?;nTpN,%SyΏїivMq.6=ev7*\9LRsҵ׼`fm}){L>Tp&C.oж|s@Ksm:%LGc;lo0)ೡoL]S__4жioՠ18L:?mLi{m[:6'||l/e{A?؋ߕed`:뜹6e.d[xا|{52fcLGtv c\SCmMC2RFn A] bP(Bf6 #vwYB3q if"ql{m9} 1 OÑzt7[{8zt?-"I"2P2œ) y6,0MXxTD2~9Dk{$'oW3:8'N ywQ37ĕ9jIJ|s!oxm٘XW۩r^W~,?B*=>ӏ?UajGv7 |dۖ=:G{-]}=l)Ozq39~>_񑽬s_7{7_3ϒŹ Izd[o=N(~cs\f(b ̧YM{ڹWN$Ac6fndi*z}/pq2I*12>~wt'e(gv^ѣEXXOGBGS( ##8LyIDATDW-˳1r93q ad WQr)",, S7j^5vm§FX %OќĥArʍq"qrh8 # n'womȍhdqn8FGnDu|M]z mG8yrF#m9#I!@hr'i`S0[X񓄤>y\!](KX'McnriFaTWnäÌɯ~f IJ B,n?viΏqexR8:\ye6>|0b-qc!j &garh&\'.&~CȡbbHg|k&\ % 8õ:-="In0ʛ_lGůNOe䢣Shdo#Jz\a)&Hd^q,kPgډj9Kn}7cۜ93G[Q87vsjۗ9zlūXSRs!f"4BŠI*'Tv9G۝:D1K.5LTgnl+HzyTC!iA ut\ <5SH I.2me}˗x\LNKb5Nhk_ʽ&0LDך9~قak#6/26l]{w=/]W_}E6%Ng100pߎh`(k;>M[7M8zj|h 4qd$5-l2=]"L|yPONvnR1Ir"s;90䆇n#$VM^<i!xjipZ)ՠ0p$RV]]pz,/YHo$PIJ:A$[$EZ͍j)~qcd.%%RA q`3=gu?TL`e1U]2^|hgvV,S*2Ȱm{=eiܚ* ±hYIy= &8:;F!n-Q Mz?2\Kj,3se;h7I]*ԄB(a/Gbd 9.Lecz+LL^#ս,NPs= fH4l;ߙtǂH(!p,FhL86$|tD^켗YruLa]wם`G;=MTȦYfbM>NR D*e!;GѦB0e|D,Uix'pG,s'90$3r7SDY.Ǹrޝ0!Vm*8.V,s틣YmX`Q)tӟ24ܰR7&0wf^ʹ?rSe r!i}, JY 5glBy EK Jr—cP oz߻RLirD(k}~?"3û{U4TopA><5呟G'v .LML PHCVNP`4J9A޺44z\ʙ#8xdSߣ'#\%0 J8J,:&ѠZ&>$A;\(,1{]';K7I~ufJًF㓀V}drD:`s3Әa?v sq_$K̴j>t?;3BCTX*/SmB@ssĶ,]O#s6Aᣰs'#x ]=^dvB=%EsݷBHL01MdhsQ }>b!@c>?pXC~ >~yz}JiCaq8D*P2R%kF.pETjS{!7}hōIntZ_;-$ishuKH)uǀltLUd}O?֯sF9|0'|0߀ׇYk$׫(MUBg!\B [b3y|F.˯>ʟdU2I<#A>9|E}OcTk6V^:R@TJ15@GWΗHh),TE"UjuYVk"T"ϐ=>< E&&Np>ğ',PT Go;.\Is4˔-/;E!~j?"@W*./Q[]1igqiT$BUQlD8ʕVæ^Z?öm7NCW=Cos) zKO8̾}y[A6 Uƹ`*ŏ#a6'wls}UE ~W8s/%xD*VƩY77^)Sm|2FuWǍPXu۲Qfi.%<φpoQU o4SB!]mcYKM2v,קK4ZyEBB|g实0^YVYZ -Vo}JK\w]U&7vj HEEW%BJPT %%M~c {<ΰICh-S&.my9OrJ_F$}]qR 8 s\@qv䣫 D{C%W 5ۢZ*&B&b@$Z [|!a<3<;8?׸_8JEo)@%N~=D|(~aO֢<Ƀ<0$.(}S 9*U6kPm@3s#uÓO$ RňJS,hj@HÔ9|x r)OWZ"0H \i]YD(E֎s;R zEa$u= ٖZ7_kT1[p%Bfqw2bwPs=K߶S*:ڷƪHЂdHLɘңY>DYyrVwrώ~5 M`}d#<]"j_c&G%RFey(}T={EP2H8>\c-B&N"W N• =R"DuN}#IV<Tj'Os%/m䒲='B J098{}yd"5)QG7q4J ߛטL}q7J B  M6QnG+ D9y`Zu }ʱ_c1^ev^Rd@c/pj2C"GXѢ 7᣼ZWN)y/{&~RǏK=/P"^ڲEJEqi*XK7Kdy2D}"%+*u(f8{fgofP1']2󜙜#Q sG`+Ns2RApJsTW M{Ie$‚A(h{}D8A}lf{_e{+ QK$%R~߾P#BV&")o2zryBxLKbCCc k g[*ԝ\(Fyb@v3c}; ׹x Ֆpb"v5?ɾŗ.PVdtF6o 6dz^z ]y'F7mYxu4pl=tT<0T`4G!"`hhQOL"ӷm7c7x zMƉ\8>K]B*E>?v?hI(B0sI|~fdTDSc=ޅ!${5:Bd2I#4#CdAb4)3@cyJScx/f0J8c&R仳FHtst*M6«٨ ;ٛ'63Y|i5Pqv`$'U$t&JchR'NͥzTtKD$D$"ɐJd!dM#b)ҙ8n` GIFص}Sfn$kT4E2Fyn>4 H2#x5H@4xX"E2ag(6x0D|WncKXv]G0=*_T:Eyi!bxܹ1^p;M>o H!1Bp@GH⎑!zg||1FɄܓ0 T 'LܹvNʧy#$Rï&u‰4I@Wb2X&NaFP4I&ƌ>!Uv&$)$DQWc)̄ϣ &H dwhx|q04(#9̽eۏm")^OtDFt4_tLtu0<:Kё!26!Ix0ш%䮑 VrA>-7?:O?4l[o~,oj߽&vu@A<###$ O9(?;^zt?fZCК9JLlW?ǀl]j[m7o@`~qs5uͧ-3j/QKS Ͱoi`Vv8Ӱ~6 ev*EE[ܤc}y_^`b] L?Qu4WZZdT zt,*R`s_ou&npY_vn@ :XEW/= 뛄?").r~:/jN#I4. nZZiqZѮnD+{ݮtkvߕdEz+qB4[j,!Z; a|8XMͶӮ VkrR85ڢE-qfJejBbD*4?q]! kM갖gp3[,Z8EbZɵj ܣ |UXcE J"iRD,kqM/Kt,IENDB`muon-v0.4.0/subprojects/meson-docs/docs/markdown/images/py3-install-1.png0000644000175000017500000030660314737503617025340 0ustar buildbuildPNG  IHDRWD pHYs.#.#x?vtEXtCommentCreated with GIMPW IDATx}{\Uuw93I D!ɨE?A;E(V۫֊\˴mP(g ^3" d$@Hܼc朽Z?ܹ$7Cn39}9XkoY,}BVm ]u!YY%ӄ6nܸqg߲+7j O*"]td]WWiDg߲>}f ܷ2{X,eQD6˼ZkJkv.JiБ&-#M4<4ő:"cRR DT "EBn  ŖEx\'-c?<2{F=q -_ *6W76.pkV. Sl8}7޴цKL,8b}h`g/ ̪gVz'*^@IaeƋ)F+\p#{'[>rֻ:2ݞξe-/Ÿ%~`a{ͯPJ;R "a6&j֟5{t~};*cyddx/7ڐ"h 'E}S*|`?(;<_޻\\l{k3elL&1r>Ջ዇tei"_y=_K)_=M,M4:k##/#k7` bfұ:[Jcwgx|ᵟWT6\Bq6A 0gΜA~ey\ʏv_k>l@Y:w usegk7p"س `سгycqF(B `}_6냫س68<|oo^;/*xmGna-/zRDtLuތG;< -ܥ \ w&rN.K803[%)7cB.9EZCwrMX,rq133˴p6{:)͔Rژ$c手ԳYi}dq;vF];X^8xȘZ1z-falVt(,<%ORÿ,`43kcJ=Ws"M31֚D6m:E89m4u̽GVCؓR4M!nEn=>:"ʲDƞd)<ûdy l5(lOZ>zQOXجb/d %Iy:"=sTwQι`Tpcǎi؋-j<1DBD 1!o3뼈$qDJu( {6ZT:,jZ85k6:r1&wIt 8l8T+̝s¼̝`'dɒN;iO{Ν=4XAkQo>r{8X t -L%UB'a1O$IWZ^DD|Q%X&S㛶\;pvt7m{ ?e)R͌1,Gec_W2g)lIԘ}tPhBQn_Hf42aʷyRZkɲ҇HoUɳ<@;'w93k8Is?}wS`fj`g$jZZZn1?|2绺__ye$eU0d}xK_9;^ DQT3_veZO~#HC azoZ"f,Sy OI0wn|{wBѸRKi~z{{{3vݳ@onkׄ+ݽ}k7j7۷kgr~W%`gX딢82tIuX:B(9zꩧQyo (o~Po교R=kP+Ik1T.;=Y|nh->@/}KD ֏=y'cmO3(z|>?wHu(6I-Y"rLG=ѥ};wJ8: ciax/zlf=u}l+Ej˨]]]u"5###%:eUxLWmiYׅ.,iHwA2m'LT7LJy/~@MǛSMps("5{Cc1]IinE(L͉1@lZ Q7iIaBZNf8RP,ԯYOMHMlTl4޻%Occ) 4ދ"lAX.Q1,U@D-w(J8]E",] ` ̻.-5ğ|RG\壨=ٖ|79<=D& (re)V^ZCwN[DWFy5^9z]˕BP,Uzݯ(hd6V&3ǃt`0<%Ϙ33s%dL5ƦO菣hG kv#{Z9N%E1#R}d۝-3_moPXs $2H,t"|Vpr> BWWJ+WD9"ưqtu⹳;[gf8(iLN֤"9ST n0T( gYi; T*Pi`^E*JfelSh,˜s}~ۜ\ˈش'4 ?<v?͗?sm7]uwE2Q5 K]gGQ'q8 Xz4vmVXf'3b-#2uǘ,EC ժ=dikooFNOMa.(Ϛ3ʥ~PiGan߿c޿ ¿»3HOY8Qx,`. As z<RH u~mCɲ!6FY6o޼i9Σ(jHViaaQ$Zy CDep6 Zkaf^)EMRJkmH+ EQJq'"4uVkVK3KD|>NJQV3dmpaTYkHf߽gc>k=HZꝏZ;Nb?TY'qnIY.s̞5EN^x%KN:餅'tܹgʷWMYA!e;֭n[n~3\aܤ&È<8^9eymy(Gc6{Cdrڪֿn}=?/j^pp[qM8pS7Q{LcsrQ (JwG>Φdvqy1Ϸ9笳JQ[~|KU qFFFlR0Edv ;߃&eӒ!j:g\ֆX$uG\ur!_dj4648hLQGg  utvJBAue9z%Z(yAWq%D~-+׳K..fV ֺ̺ lӳΘqܙJΟ_7=$y-Z:ٯ|gf3̝;w>tb+҉u ;w߳ ,z,R5۽&ۅ{9T=SD4^22b&"*?rφp׿'zh*=XN?gƍ/袺+W[~+omOEyR9HbHmmރw*z v!m=-r/=ZMYIuF>?|.[vOxy߸m3:}9ϬdD4i0?t{;9mLK%7-W}S:iS}{|煿r\RT(5&r0ŬB,6-[bSTeJ =Qر;fqO{ZbIrQ "a+#E$IuAMcԭ? :c)$3"ZDhR?p/Q+걙a MpYv~bB"=kS<1Il"d{$G?rhLd "J(YD+ZKJA^\`8eL̍T)[/h8uk7-.oK'X\[~5a=3sq5ͪP'/|f R+iE,~]>˲zűۦ?kTzNZvڹ眮&Ez4G6L:G>ȏo @Tʃ#ݿ=?G*.Ms RJD"gw[!0{!f,=TR\nu55EņnR*_ݐ "*`Bs]/ hq "(xR)qQ *Bq{X*UJh4rAZ *?!Dg߲rswhKf%'sUGFs69?ֆ76s^^֤?xa}ZAŕay?s|RpL@BBc"o xBY}E:d1Fڼ f8Vƺֺx]rwO?kbmoExaG #ڎ(j}Yf RHHfF8{a&Cq!C]:1Ea 0XeL#~L5ybkHDck6"LtZHfnk1/P VJcd+vĞ WkN/sTO^YX)(B'ɖf|K Dh8&ƺ"?ixS+W#iWS≭qU6Hrw,-%_$kCI58yx(W3G "-;yt#QW@2 ۪l.'g@;dj!SD.˴XHZ|̅a|ă݉jGR3a53UJV#?Vȣl=j=Z{ z>朋LD Ed=;h`#^֖er0DRC3զPgs3Ugkycg\h Q=[[n<^uoKZ-Irڰ*(>sF["zgOl"`A}} . nX" Dvr 2i|ki(JkiŁ#tsqyGwc3M6[%GKV&caISWID\fYs_YٱEŞ"㜧w! W ϰ`^I]H%c?v#RLlQ:q(O7p9Wg 6 /d]tgVV6J)R'"Ef1V*jxgg y#qe]` \2c4%giR#E$fZk罝u:Ge;aR ϲ,t c9EQm3J4G]ƆJPD& 1 }vט~8,CVC6j_~/MS65r@ "Qrcf,㟄u;c ]4(բ8& Z31 K>%Da-쳑BZi,cs^Ց!fpxPgNQ@ЙX’r9f8 0{l>HJ39a &}`1lfm0-k|vq5|>LlEQLD2&bɜRj}6#"k\T5QZ"2'I.Kb97yk*UvtvB)km2Q^mfnq(Ͳ,kho\.ű1:tqrAZkc8;ۓ\.6 ǠZrIHOt|;p5[WCJۀlF~'99sm*Z;ξeoJհ=ZW0KlEyRi\nf?j3 9kZZfY-{$[m:1D^n}[fw_$c|?o2Wdv7rAZ-" s @v)om6'(DsS]if}fUnw`a+1!V&,9,MP sXFZ3t$bqEQTVRMTXXݠƳ!s^\yL wq~ifIQתjJD&xwT^ IDAT}#ɉ́Mz.(RH:fuԃL DFk$,M4Uw43=?g 9b!vNy=˲(rUW]?'$I~_\yoCx;?[DS򕭦}![5f||e=փлj{Zݰa{ /s,M1ԧ.7M_~}}㺫eZw>Wμ遺\yE/* ;餓(:.XvsN1o#m_K 8/ZQZՌў\.Ja7os|&;n= (#0S`=W9!@(NbƂ~#Z{ͤz5i;{ cf9s`";w5-(:dA,BZ\{LZqٟ(ztwwwww"n>5-kt]}}4>6|N4H<S׌aǨno<뿼xu=YC)dA:6Ze!@GD(կ~~EP ~B@D>}wu7~y7-o93s]}_w+ _oz)?u3Ny̳D% $PJxlwŊrU.b{' ,52& I7?h7=wf>du/k{ƍcf@/~]s5}߽+jݽ~~z}Zks~]~y>-ܼgv߂4Hh:X'U՚ڼLfdAb@ 2Q[eQ)+W\A_cb}϶/!TfKjոq )Y-⸖f1DJ)DF Ro9(~~Tgxms CkP|o#Hm9g9sgh#ͼͧ=u<3m}`4/H%g@k6L;{*^ƿ|ٻg=^W:u XZN&.tmY\Du~U]Xjt+L$]X|Ֆd*=EInW\que1:ٲj EZ'Q f˪Ut߲ ]BPaƍ݊o-gط:Ȍuh.vG~zҧd:!w|x70 A@E"$CiZ;  ."$`&]={[07@>KbfRJZ6G6ugEB}Ǟ'3z'Hh!&X HxfA$ 0kx x5g2=ڷ$ևSLG$bMUnD\HW7 7Fk ^J P$hCRHSUJ"*' DߪTH1{a>D 0) t`J*"@Dm*BP7V|E#^P YzBΥBa׍'. p?A~h:@Z9~l0۳o偭+E,#"k pK#\#$V4G0Ql) ʔާ{G=tI/>#ȲT)u"Zf@i-?ڊ>0olY iYKNnEjJ_! irZJiJ"_TplXQrQDZ\C?QFFKQVHe(,XAuFtr]ޏȖ>!Rዲ,kp5̛HpJ33zZ.:KWn`5Z nUi XAn+f*&X*u-=N6zܬ䴅N?( ]1vSlyQ{(j$IdB &;^N3;X+} \REw9Y QWJ98NӔRZO{?ζYmYm|k☁G5yf~=@–ֆ2$"LFa B 2\G[([>3 7ƄHQ4dV$\EƘ(I6F)D 2&VZ6b(\^+pWm{V&e;,C)*M*R _/JT(]@qV(T,TcO"">2f ƄPDw9mC8Pipo| ]e>4K'Y+|W{i ~8k,^s<, }U Fi"ZH|`k%(#AIh=0)I)kmE/t{LilN"uX 熗|"0gGQϟYbd(NSH0E<8Dʆ[ӑ8iq0=)c <i8L3oT@a|a-@Ouuk^瞾0zx&zX Ϭ(KS@E@~!Gv!qV| ӵ/8X!oox_{6Z<;k$QJ,PGbmč'$j>C_y.~[_U.BL ꃛwpRYY֞fw>k= prj׆)FG#;jp$cfˬ;"{ak/I?DDl]ù: {8" AQ$(%AlQ*mn4X|cmSSӞlx$0Şͅz,lMp>mL=gGvyU!@ZKz.ګ4Dw 200;[βim$Ir\qx;\iM:iKfu_as؝ pe9>ܓ/YJ@҅φb%gm -I.q4MdYr1ƌTIh75TRuf́C/n8|@h㘽\.gumg1mf=z;GJyZ+EqsZk}>395f{;Qdt$s.hUsL0$p&RJkyD住H D1JꋷgΟm1{;EDk익c``:RJ pX3t 7AJVJc|K; 3:P!( Cf6s d 10sG?3t}k,˒$ܘ9t'kmK._9/A ZR2kѡcy1&D3D8 WRZ9DZREs}i*u c]" ;8 ~+s/yͭ1’i":,I$b9 J=բ( #Vښ;1MdֲgfaaEdRrs.lok go=5p5)DZMӐ3Eِ#C,33{fu0+Z&&2JkZqfV̜e9=d+1-PJ9#hAOWp 2AwB$@.#!w>N=q'V÷OwD-CῈ(8&ܘ1L(VRҊ A)49!40&2ƘȰRHQ4|/x?劔3&̶V!zo,`?RK#>gd8iiRQiǑVqZ ic! G{bg"F{ι8I1i"`emk:qdZ 6Z|[H1sAx;Z|ƌ1D䜋"cfj @e@}+j9WmPe!f,ց B(ql,$Ip` [.p_wijCnm\4O:Q숓hE:ZYs9o\I%ImLz#utv6%S~7Kox^SHop.a 7m6`IaݶPi;n^ʒ*>wk -p$ǍZ{9 {Y c"T3o1&c\\p#mcv,~MҚByɿgw/ _^(u7x~SsN;[>S W-)zspک| n濦p cg}dz2[H".FpCROь(N:`$#sO8aFH;zTnHkiiN X+,GPUZ6RS6LBDy7ɯ~bO1ޱ)z2)z7?u!Uk谙&a+X@DʹSg=ZEն*ψL%(7 ;qʹ)`%_ppeon,] |̖^SX/\l)nܭ,͒\6D$y6B)H[{AfraV!N1%ܠf}f-?zkya4kCVZEQ>O(%l1|}ŏS(w" - wMi- WL|8Qg50B {jDğKjt' ",DKлVk9$1ZM"jd<:O|蹠 Ed::HAH6Nuș9"jmmmVKD" K_KsAyQ1 Af4 e5ZsUJfJiq|`U\$9"hAYfhB6& YYHq+{c̕W^ NGx((3}e2 DQ>{_pI|8?_CD͛-di^aX0cctyAQd,Ιvq jguZj;3@"> 1==݉h#"\g,p$Zg=9]v٤C6;Y̳v{(ݳ&{=GyEz{I!`ZV#?x\URj;>}dKYʋR:yQJ BZ\Ӻ NH`0ܳ{ Yۋ]}k2־]nm;zCWk71'v5{go[Eȃё>")`ѩD!:)H {0R\ P"főJbEH8*2F)=Kc}ؼrlJQҒ M0DF>!,p5DXkMQk{}TKO*. p[N4Po48RjU]Xhht*ãf|(;'JUmrkԪ4<vN:_ArFFk5QIdVRzfaq,ye;ݕ,W 齼w1L.VYX{!Y+>MFJjhkU" TہjZ9utonqU1W}j۪o6mۍ}# VD=gg/W*23orVGLrs/Yﺷ'k+@ox#re1_kjǐP">WC?022 ڕ u +ɕn~to;ۜ:wBd/}d3~9 cvSUYIn>JDhWe=>udLdL(QJ☝4sYλi˶'d\ϙ#N80ʇb+"gf"K>i0Q$R9 !9QjOoȺ['"###A50j>{.rVGĥzϪκiboO*{L3 .< !NDdyDZhZwP5 80svN#̒zfy8u ɦnۼe>xI,,zw& ];nMsM"ι8I{a=1͗TW!m?~۝۟p,ȭcEs3[Ǟi}8uĖƦy%}ʉGcN|aڤHAC yX7QdȌ0cf^&U!1(=qlz6oEسc:bH D;;OXp̑ <#t"Ԛ+RA%Y[DD{R*0| (:bddF >lKm؟jzf6O6ғ`)G/:Ώ##EFٳ,Fk"-( 34S  , ukP677a}[De2v2uo1}|7ްaͧ?:UgSOzч$Ϝe Y=nhp{e:Ͳva1lFvF~3njqFAu6[f)3h~ X XO}u#3W wR?D(m{OE{R=8Y9KYlLx|>lL'Ƿn۾cǎ6~noN9Ug/3?9G$Iۢ6:FhaDZZ{瘃 X8HjzG{'Gz3wxWXGk@unے{ mFG}p=ócx77<4-EjU c&Cvy)> o'LO8ŝi8͸鏥oWhڃfά2}x_YX6GÎ^8R.wxEy"9cL0\S9vea-Z4n$NH)>X„ ccDD)ͲaI)D, n"Z Y}ޞ{'"uDϺ+{w jU(_:TkjM+yҦdw4f#S ;:ɫjdh:!F֝JD׭ܞm:]M'cg Wӧwޯ\= Wūa)EY,U+U)ǑV$_Iѥ8셽1Hط6 V.}Ek *)Ş|U\"afVJS('ei6I3sckI)AE{;;(fY"HyέoaȈS2y5dFƤi'Inb+RBFQi3?0 39D"E)JZkc*81Idm2J+EE@JLdL>f8炱0GQD19gZ<)""c"mt'#6(P<ԍ9{j{~FT]yT=DQDZ\:mtR*Ȅgt~iEJi^H+= )A53pjiT}Vkm& %s_k*bf͐)h'Yoogi:S<ܾujsRyYv>Y |uV.x0+ LkAy0 K=L+ޢs@Cm<)~h" PзAY1,(Xks7FnHsz-q"Z4„ղܕ;Ev"*8@;gi6p;G~@ (`Jbq9)axC |ގhRɉ'l:|l*"/뮒9b~cDy9( /Q@M+ඵO,_uJu3- 1ug,:wY%Brvb 9 ɕRZcu%o^}OF oHSy^&V^(CgR=wuu=OqyӼ[|RD[׏MX| {+;㯋zIS@b'b h4a9fs[笝LM{/{6ѶN~7 kwVQ%;cmk\] _/&/3 tDȤ[R[bpkvD!;aGb{،g 9眵OT3Yk)f*#" 9oqXI s"\x`#%z;'Y7s .Y:qg .kc7;{ .7~H%oX-Ϥv^}հw˚ k:˓ioCX Ӕì||i\s.T"hR:كHeYf v֖J%"JԘ͟G^oz`'V)p:/w[سx lǢC:"\d TG(I\j@dCO->ҥk-+06gaV1G0 Yл )VhFTKk mJco$mp}b;hag4ZRI$J,c=(BC0Yq\ l<@Exml^Q8{|z`ni^8[+֏ . -ڜPM@i.7Y,9;-m< i]dgtgm'<(Ȭg ޺d4 ߰v=S-W/KoX߹S 82g[_+d^J90/J9USwL]*]I{{ 7٤1Tp UʺҦK+]@d\fcLE,6uϑsZiٷڬ .yhH6M5g1xuM\}^o^1o`}?ȫ~}36 ll Sm^%!@u`=0Nvk .9}mikݏpzv:-C\r7bĠqlTی73znsyƖ4n(Fx~7ÝO%h;`gѹH ܿWX{'8xoZ_v% ~C8'򙒠?{H'᭰#q$-: ":4X̀Yxf0Z{"$I 2RJ+yH7xXӲH-zl04x Zpϣ4kk;\xz v\FCFlj7-;f? @,CT@r׎/Ɓdߺhzk) %CV[Kq矑 m.]ZZ(Ok:^]L84v 4u]xzjfyq-Qeޥ+ֶO.;^x٢ot<ឳa]s~;lːblspqZv)ooMqϣU.g^w:Rߏ-[|b.R+q BDa,o^kjMV\"4|8lѣDB._0Tvם{a&), !(֚3c 8V D|o8¸ [%;"p {yI/&σъ ā O,ھZ;oqޅДFkEr6ID'Ͳ"LCeoD^3k@.;Φ?氋_u֟dI;/0v3ݦ?O\H@4=AX'oJ;6 D9ic{/D:@0{碽]BD)=EJec{Q "[c8Ug5gr%\CrxNEwyS[[C)p >\QցH0@ZQeqyf}EiJ{(c9f!6Z ohe#WH@Hfqo3wGO%Yn3\?>]K=>3g(gyޟYzI)g%H"y< R}RA};1eXM!`|}tlpG͝oo`gN>'RHiH9盍3ia/O~Xx4\ "l`Q$.o[tJ΁f` N,iA<=u䇜eR#G r9tgqh"}! B1T}Gyms^62f}kzYV[۹^ͮlvyzmf7P;|hj:3.:Ear{~+)Dh˥9Qp "c 3៾=(=,y^~jfߒXs'0by[Dn)<(wH.߱n.䨿D "{ h]TW6i;[{キ֖ѨQH*[ɘGV,7+\*a+0\0d0~ے00X`].,7 v-43{Ϟf60ܝ94kkCBfVڰ8R!hp#T*"{YDlf~GkxgzjӉv|[Ypΐat4b~JPMM"7 ;;n G:_Ds:q99͗ktαe>$Qn6޹Fa wV'Fmn7ܓU^mko 6;3`}Z\fΛlu@`UX[] ]70Hku [m9%S$M#c v48}z[NRY4)3GHaTl"a,+JO=R!rCE-B"DN J{ UV1A%R9b[kD RYDC&I$˲&Y%I>y+i2x\z" IDAT@%66o7k/9wM>Yo} Ƶ1T'|29SkcyǓ;`f\p/g$!PQGQ W;j&(jژ; 9V$R$qYT"aZijVsc@g!TkafRa,[pɹ2EȞxܸzZ=6kjg$VTWW^RJ-`U3K}j!@YtH (Hlк%(p([k8 ų,-x眵 xie:2f6FIe)HUySa<\N9䰹5?DM pzAX(|*¥R)^cg&CGcLFkic҂ZED'kCz~>K5gkm$A!g hmtZ#18uI) ##h[fg.䂺)%OUre;*>f >,y",DYfLd"N RԢjC,q|)cJRA8R)25("aQZYk1q[" iTRF6{Fʥ,͒R6S4sQ߫ }fy,<a R,6Z#K(sqq{@ ޹6q\""Z)DQHTL |i,K☢(-Q伏(M$Iz\ϬLC)eQfȳ48m6KR,"EDu-]sbf)0! iS >HAo6IF@SZeYGރKJ%kmk<|$(n+"8jidLeʘ,Z+E60Z13li d4"28-dik nYf"ϬfJETP+f@ֻ`flQ91c{8<9EJiMއ-B)̊HFK@PTe.#Lc0 m&!lLV@u"2%IYgIIVz$Ipi6X+\fYDl6+V+͒+f?c}_\|".yw|n3 RJ;q@X{GhҤ,IH {R*њi*"D*YڙY$]l&"lr qdf&28I1\E6`wfEqpV"wY|7"ld2 Hq΅L+re!jh4 r'@sM4KIvVH { ZrA,mZ۬\k-Š s>Nb=D6,R)%Y*YԴloeDF)h4QDD9#t{p%D!|j,[kA8 kγÒxF9罟L̅?65if]lVOf111}ӱe˖fl6w4;4 .!aY+ R SBV*rRJB(2{DZs :NNaU+6΢K6ۿ chi(1rC8Z7\'']JeQUr)m€c_TB8QT$TTđQJByxi - (8(D&c6]"1.d/]bοEeQ _ʢptU+_+UWsOB/=qoYT]w/]"/ %60U>EUhpN6rPꓓI"5D$1Z(N)k-{ {u%)%=p.y9.R͛7" gˠci9WS*4#^W~W]8Ne+Nks$.V ']t;֏\Vje.c/ḿp^zґKp;?tٕܱTWV~GZ- Mz҂gF+S=pQo@'S7[H !\ ly>y.\މt+tVJiZg--W 9h'(𻣇۩}߷#9K{/": ShiFE{ewΟ='U 4߱#x<_B`aQmQ=7A0 S @+{贉{TmHmul{6>ؓND [a*2kmsi@@,CP}=/fզ̦oЛ7}eؗJ=5w|%w֏\vl,S^W n[{nl_;^mtU>^*}_91n\ 󐪡hPi4mYei<7ED+;sO!žQ&a>M7śVFdh=h[RsJEu}|߹kkqI Y;O7+^͋,X ~+Y?u_ٕ+2/sW̪+.|oW*EoNm_dŢK~]5:#K ÁyŢm\`p+nXl*"t6,Qo${l6diq> fnI~K&JVUJt QDJS)c7{+P&2Z 0s\ &r}!~V,X<2&%&$d IUJ2"Ȁ" R((0`3űwc,2&M8NJ} R6(fFQY=`^r8+tsJNˠyDLT@(ŀDmX|">"shm 8v΁qcJsg-J)d҇|U'%D TJ zx;3裏HCe'"g3 3;xbb"f@$IBEY9咵62QXZS&GU7y/JxD@]Z@ @,Pi~BGEl6!! jtP*˲Fy{9L.B GTss|E TVi@AP 7(y1cz[œ$IH\)kc63|gisy$2a igb+P8p!sbBY+!B{˥h,i3 >?O_Z g-Փ4dDbJ [_PrƍJ)gws>`wɱy0|[.F;&uOnڴh|s'"я~ 2uk?/c/~w6oԔZk?28()nPPJ{e:gb#<9~6!&\=;#ؾ}ll7{^"qKg-y!Aƽ/Oi42T}:k(p(yp>IYf\,%!yQg#89Y ѝ''&߹;lk$i4Wiiڞxe/㎟._+X0~^oWTJ/^_ÓmϽQ޴yްLbFInz ZyCtc~vo9J,KR}{څ xDYMsiJ mo'?yXGĥpX&AxId:$<(K%8Re`rC,W?+pycV"\.?W)5>>^ד$ZQcWZL.زusBES9 +iX0##T((f(bчR4w} g(p0񹵖8FY*/\0r<11?Ò$1tww3ǓO>i@VΟ}1R" H)̔X72%̙uγH5SYfusxYĭWW-_|P|{˗/_V-_{oUW: ܻjF˗/_|{/_^Ozk.w54up-̾J!;/umgS|ս]2O۾VhoŴܻ|UD^pl߾lnݺuirǶħ>zg ׊pm߯o9=_Acj;>زىhlYerwۇ[nml]]rs6~kct஻%"-"r`x~+.]\dV[9h~Vg%ԟmzoyuV];%uv՝\%o}V~lWi8@ahov+Ҿov͏nN_yOOr؜?hx˦׿~iE 16I*YfX9kQ)+(q彷.KȈ/_O}`_}go}yN1Tx㍯=$I|EMl|>cu!}ZUF#Akevuql.MȈ0Qv(pH{෿?_r˜*mho L˽|s睉bfJ%2uf&*KS6Zk(lHWL5__=#뮻.9pU{)d^oݼy~ɉ{#nذo:WJm߾}Æ 7n48۶u֭ND͓!1OiӸ"R۶|2+6"h% diSPDyOI1Q"0Y@*JJن2_3 ?ir<|޼y3|?000 _?<66vZ_r;>N:/䒉ze'tR=bTl߾K/p~… __?TħÿTʕ~-c@dr_Ϳ-:8J"`FFfVJy$eU', 5\T* chdn6iOox/ZFԪԮOZ+:hmtPFnQu 6K̤a}т%8񩝷f9(7~CZ8i7m͉>:$Z7qꩧv ~ >5߿qэܱ^w_qշ=CV%f}7u꛿!:7繑J4pJƐiDHv;ё@c,)FC9m6룪e-WD0wʈҙ%-Ev0(>i 1/8Oc/j9wk}Ǯz_R剐7~ _񫮸#^w?7G^ؕu//y΅=+3G??<㔿X:i4$711^ DT9MYJ֦"#fvRe Jh?+9geUqWϟ| m6wy{wya ,>w(-]4yowy!ۿ7T.?~hg;֛³O޿q}I[= VSѰEP.œJѨwwo43$Nvww;̕Kq4S[JbaN/fe|~j~Lܧ$X't>E4um"6ǚX0QYY4QDDZf||G)l6(hC=I&`O4d2[W*f.(Aw7iD1xfR8t98|_x\}L$'PDt @a t  WS<q> 86|?4k>qyo[fԻn\S{#"ËDd$YDUX 9Z 9vNDd{$@فւĥ2,ٔ~û_vû_}Gw>>hs{rWG>`o8i><|ͣhRtp=j.\A@V[7WuõQ`o:Z-(p#k6ﶳmT>p#=ojL8Әx_1Xwꕣ+GZltV a{{P:Qa @p~Ԡu@ϴjzF{F;³n߅0Zbg} 8gƞĚQG>><+in=WUzgR%"^QCU"6t~bn"_ C+Z{nB5=j2ۺw돎p4+z8c6s`HU԰ڈaݵ}T) W;O1x@ |>I(pȠ+PЇ} yʜ %!&"(IODXD9Rֳ"b.$,BDJHkօoxtY!D "R*De""p+r(E=@C=r:R "3)Ş@9o8$F+baQZsQmV vPDbfAHGBoJ_Zt", 1&glRs) >Un?@keD(.8H19 IDATV'gZ13 P+ cJPu!EMR4 h:yPJKcg`f~gpDDsl72v<&ʊH֚arC@ mZHE%>JBRJ)fmgvq4Jk={ED}*V>?;yLD)aAzg9N:3=}Wv;|$ApIpZ &xvlnYJcn%*kyi+6LjbNR܂tW5RNbb{-8ŨHZ"0y{N8޼$@\|^M}}=#{sDSPZ9%fTE?G~|rqXnh3e &"jVuu.%!* h4b4G編0Q)BH)Ay*vNE Xd2T9̌QH>8wv1p,>sRb&e D(`JSrsN$EN1B 9"D əAH)F2Ow㘂c` ޱgr "rLN{cRr31X{sSQ영#1+"PiP oxq߀SDF3tt:Mw5ӹ;"̆g2>Κ9Ґ?Lf;;Ӵ>y3F?.IP>8&5_,NF?'@2D@(*' k-nbi>um؜9gbvYH >?s,j³w&vuZy9Ugyek!7xAUUVs{j_ֽA=vly|2ڱ}C//>п@̈tM ̎Y{f"baD4*^q13jns( 4pާ-U^rvΩsckߙ{=5ెo9Zmc6 9&{xSco׾]6Ȯһt9ܙǟut z;>DbV(xGDALQgQQ ):fy։vMՔR( DňPUv. și3; bbJ dLfglھ'NS;΀~ˬ4f:43Ns t:ay0;Y>gj Y{tնzaS&䯇Na-s̚󯾲+cjvV, pt6Y]c*3D,EϢ \e]T%߳e 2꼷ĸgDd"JLMŋIol?vvOcS=3DSyln#͹Rخ^?C4V4c8]887!zvnns+&05{,uv^oY [SDũSXfw㕧::u {[M5;☝uSCd߫gLM,gv}ǟuӊv;nPS0yfGDLS*:KH9wMof}.M*e#r"sXD-aFLz?LOwĩCf6S3SN8S}Dxι>ec' ;#x]ͩꙣ{Wvg׮އTcv3O2+gvAg^{x?~׺ɴw/IDTS$9fQUEWu 4Q[ўUsVɹloU!~;Us̬RJۧD౽86<{׿sg=x :w8ַ6d~? w,*bvY4eEuR-ݿ%l:튢l| Q@rsIwO D*EBf]qt;v;gʩg+70S8p9z|~je5~r G.}ޣlʪ N"Wp {5I;xZl?OIO$d*zKmlɭdSR"KtmYNCsA8u:S8Cwѓ{oDOY^H?{:k{pNSNl&v~"{sSC8zf:&!cs!XLlC8JgH6r _jпs>QBtVEDYRZ'͒{uAsE,^zq[lz4oPs.fuxJHG?'CT "̬"꼷]W-ꖭ[>yw@}N1"m.9H)UQ$YrJ9ksRKuU.5lok=A J%}Uv.d9;+MQU[囧XRQ( ZQ1sOۮsӇZ3--&Yr1IYUbֺK׺n{r=[/B~C(bι&(414g?ys!QBk9?~ {7rB}Ԯ΍:,2n[g[p JY%eQ՘&1KD U9/-]t•O]nw너XZ{ube/)"3K)(6[sLڕ}ķG2*ZGUNBLFDU4eQb/Эs3\[rySwOw=;MuQ9eD9C|J9DՎHF/H? BDċh Ƭ:& ׮]YޥvqݱU'eٲd e1fqp1 Q;8knr)*G28ҍhnxXobDꏳTv^R"Ĕb-\vꖱsM>Ч>}[mobrpB`$yVCX6TxT8TrYLdm(R$ YznZrBN~{۶e>(T]D(2Y֭ ҫ#7*BHp^b^ƥ^?Qb*%ERzKW^|.vO|{?}&{" EĈPus7eN)EUTXߗ)"3S+7nPL`y/ۛktVdt6kv͝_Cpnȇs- #R]r/]8ҕһg=;wl~mwo!@՚ @Lg *9XGɒbL)-.s*Sj1]5 :ODDSw, !l"֍BPzg:M 씽w:C6hSvRԙ1[u.3Y`A݇NTggWv՝kv\O>|830Ç]7dq's^*9|[Z--t-,\r•k.^z޽t2I'w}Swyhgo2V LXD,,ŕ9D q1/P0#dQ7I|Luv:32Nnl+zLOX/2OU`~U=8)zsH}sTU_t;1 Om=?ᇶ>RYRJy2XNYiULiUBE T3J,7i}泊}Ǟ'Z62~չnn~8S"M'"'_}p^xaRP "Ϋ>?7>f&'+e_{+V֙F7j߱爈:{W b0} Ȭpp#w8p|=j}ǞwpК?F7dp|[8#*g {DO2sw>ڇ`56 zum2vNDT%RJ7bQkڄcQ4Zw|rrr]+3:8wǗNYg>O1 x~Vfܖ;nJo"37=yL- /J38dKs 4:HF|~zcgVpN6|M BP[7H4)Z#*lE-" 9;SN٘*93;"J)HAuUTUrVfbbbi$#ϖ I)E|6sNT5% >Yʉع@TuYFcl05 $8c!9'vj VZUum̰drV *Z sUo}rf߀$X P(V|)e%kO TA :q7"!y뚝/EYr hOsSD)ޒ%o7pA Ƌn |R"y&ÝgP\QE` D2E?+>E[VB0l -Ik]TuƲIR4?LoSώ|pS@rVU>0̆7bʲtA%[c:%+̱Mu "w^DrJvqYu_~tY̮Ԡ3į -gs ;`33̮ɒWƐLfe33b6e<<;Mo,wm[V I]sXm9^g7$s!DfMsrf![C5; "H9KQ1 @FH97*S$:! ş9.ʓCK}ԡD_yu%\f7xeehϽ}}Ddĩā\)Af1ppՄ=st=ED;\̇O:t:bXmyָ- F>|H옝QU V"J9eu w+ァM?UPbngJPiZEueuIa= ##/<9,yg{O %>MM״&N9cTslHFrg!ӂ,Jbպz@DEԮ03 njd$m`nK?(T-Vo$TdQuȈ%w$#MjJ*ؒ%F,j#H>8G9$gkbkxshM>|p>,VvFz$#c#HF8HFBV#jYt7Hu~V#*.f+b#G B/Ϳ}•^T-Ŗ֎m[?}\U{ujj,}iU߾~_7]-$ e&dJ<Ǿ#ȭbkH>B׮]} 5&Z^+3l# lX8G0*kV ~3hpi)ۈįۋe%l %iN.LJ>u^WrFqη 3o_=w~ nJ??;]u̐ @UH@m $ !߹_kCn[[2˧?G2* w2 /KGtO]s&Z*1)Gꃜ&oZ^}/5 ~޲?o¯_Yg f ;ɳ4}v-0|tq0U1KD؃SN9y>태%909D#Sus):s1ƺ""zмw.tNV4}A}f4>O3-6{;'/4BH_no\߹ W+iՉk Ef%*k> J`$r=i*7=T@LRP(;rVUorW?tZ?yv۞:rUl;4sQnsN>yiӧmٹNc8w^۲kx$׹qT//?<λW~yL%" <dtDfW". HT3˲*"Pe"iv3ӧׂ +g;g_>ךmSӧ9gϞ"*`.>׷Ϣzgwߑ0Uc~;`$* 5s} S>:\:!UEJg"uv;"L$KCh\wc5edk{x: |\{'xu_|Q ;}s3yt亟W8saۿL9)I "Ua)̃eGspL[ZǬ=]\bol}*؝cv;svcΩe~ #"&\U%KRM묰/%KDW\AnD6&'!R\(s)F\׵iRc1 VizG 'j}>̏{͜v`j{LM=l;ͯ͘c &Fhw7_ }?=<|]?}en4ǁOYs7ffNzQ4}zh=MS;/?R8s91k'b&LX+LGY9nGޣfcN=o9n$S3k{s|7}9 -C{|o$ ffQ: IDATv$&fW|Kqy{N`;K@3lF(r(&/S:Fy>ז]o[7 ?i fod,yn@5t8EKbjCx7z|y gcF3ybfjO9˟?y+ۛC\z']HmvX~!Xz+mYyb#gy qYzo_>mWKmOg9}wW g89W?k\97KqUH?Ij2 @%e9I)[OD_e?yn̾|z'xv:3+7'3(Yj%Q&4AUnK ]uL9 ;.*9'&&@uGL3ۂ9Ƙbmu9OFxeٙQ9}7r7rwGF̒e*P+&Uuz돧,yhA~G:RDeٱ)"z19Q%;B{=5܊HF37Α7Ͻ (>ZER t7 Pz\_?EYhŹ nRr眉ȇSfGBh{_:HF^s&H!DDR6~ĊK5h|[[_xsHٚЅW6A9E,DLDT9!:e`+"uUyIGM FIy\ȇ>ȡ0FM?#V 1B /¯Bnv3*R*"̴X%唲H97kts"J1AZٹUm }M_y8>g[ho!1P ,gS(Tz)uy*MK @9!眳@ՇsczJG.u$w4E眙RV-.AkrU9g|veP.RA짩V׍mn ,7ݾ!v4r(\Q׵iP)%BUU>rJRG JU J1kwmMNk:Exyҹ%_ԙWO`>p^ ^>,*B(s̮ާHr9j{|끨( P[au9`a<ҹjS[)/ފ2 1s]G"26KCR^ؔ {~3+׵I\T;>N~kEzJ}`z)6wiׇhg[SrߞO ER(1Lއ%T%GG+m6?m՛kaՎV<'I)ea4v\^&&*YS}ByLrT"'W|Pk t 0܎/Hcι-0̎,90S^DIukx&J ׫֜Z.Ƽҍ EMYa+ϻ\Vi;rǁ*Ni]5g+霬w]avUH>t䜫˲ "̬P1:ǪSã*""&@N ~i f~zyA\^*+jTV)@, m*E(Ҩ -^Z e]Zݲ\[t?%jզr1栒tPJ^y{}ytͯCU@_8WtyG'|\U ;\Ys$61ei)%&6HuUj(y3 OP( )ccM왖An}a+CEi961˲]">5ŬVgBYPef\J)ty ՚c?[6߇1ԕ輪^tkDjPI>=М.VXSǺ\nH>dWZKJN(޻^EQw%v{yw'\.iиUe+|o</hXSjOuf >26'V>lvx%"}J9W^We;r9gh5YEhZ ,IӲk}ߓ^q]K,eu]V}c˦*T@>vY`)ņk֫B%z(ZU_Uմ0wFyJ,݇i>ɇn*CU-̟3Lb:J)H$d$w2΋pF9RY*M2 U=ؿثX3a,Ş+JؠtYe۰mA[J^(5~g}W#^DUU--.Uu-oj&}ߟTthZ0`UԋHF(UU׵w>ؕH(c( OK)eUS1R羲㞉^Tť*vBi&mjPҨ."^C}E^@6UW K"n"k` !TU"e%"UWVmgg:s//LMy+xޙ>m1Nߓ75}OE=qã'[9y/!!_͘33L:Xy 3r08#ŧ ! (RR(ATI?otzIU ܫci9/4uٿ:[nµ|xMb RtC*$ 1rb]]㨪!btq>_Wڅc|$_{ks-3bo] ڽxl>>9s b(=^N1r<^/o1;߆c2߾j#UCsx{ԝC95<;S񱮍yoY29TkKyv{~Ullm[6Z6p?B34A↟T!J[M Ofn {%uSݫꚘT{䜙z/eI@yiq1{{n5mЀeޟکsgٻgmsM:n}8񉕌G0bUg<+4 sg"g*^[/lɇ.tʕTGM-9$*p>*#f7,DDDTZu>AuʪU!ζX+{iʨ=b0ƘVe3a{Yny_׵YDTz\a|||4䎔h$Y B9'=O:!1Z{sfrdg ax߂.&PxAn)Fv.-yAH)YTr̾?7yJSSjU4>zFr'ϙHEN{G@[,ŜM>cǎS9b04jmZ0#34"⽯JclU|9gSD"s1%rN)z=}(R($If$#lui"L4U;N9[mwOLVf,kD,9CAl+YQLXEJW 䦪)g;c,[-}LjUV:f-RTn*[zj"QWHn9γ5lΥ% 7,+3 !sKQUQt&u_[^j.$7 A%M_Dq/IFE9>3b0S+UM9@yg+w1sLLd9nEHFylHT ʞ/~\9&JVJ:/)㔓s9ohL7&,yr˖sI11"D[V8',RJfrNd$w{gʼ*+Ҏ1((*(Ph(MY̬XWv;7)`Z[G@&0>9i04ܝ~;Y}]>BAL*j@5=,!1{7 Rbs1Ƣ(bLR>;T>콏u]u`c{SJ 8爴Ujy:sjnu]C%)zn;/*UeVR!yIbݬҥq Ҏo_|U9Ј*11,93s.BM;Ԕ,뿕ԪkS)f 1XNsʪ}S(,EB2u0-"EYE*-:un5 @VՑ?!9ZDMEbL;s#`ْ! wyR1Hc0!Uj8۷"n$#sXeYz(|*TSJu"&UV2Xl1_Vf.-dqA*VCQ?9u$MٹDd4UH\ER9!x5U5x?zFr'ťS9gDTuވR{f*\vݢ,躮}Wa,4)F0;" !}<\P yD9WW wWDVksZ`DqUeu}+G|$wcgim g$%" ES.uEaUDdĥɖk‚y)y` ؈L9c{m5,D9nu?پuj^9Xe]8EYk[Vٍ#ӅT4wΉBmC0 7yB Pm9*Z24Mԝ(TUВsmԭVժGS5Vx.-˖,--uޯHFr'\rN9D`9ƑjιV-.eLr9%u̪2,3%e 2GD sXPVS*xUE{Ue""ccjG2;]<9WѮ,^QUYCu]s>ZzbT"X}ߟDUUOLt칈1,3'R-Bfۏ 3,;F&sFH>[o}K_Zs+SKuBWb&gCY:khRAJdU"̤MwcB1@>G-7bq]?ʲ\ZZjYܤYc/hYFMJ( yR""v.XBtýG2>gz.;W*XeiFh;wI$1%`a"Q ŔsI;r.(C5j@UEAB7z3go{јmc"&(ʢ""bj@ Ddiq(KKsU-g`9 88_Z\leV[sl~{&fsVvEQĔu#ꅢ~V"*k0Fs<zݥVMĪeڵVeL29qZ9E٤zv;/uH^n:XcTU#$|r˖cHђkuEaYhDdh'ŷrX.b4W+)㑂d/$KNVֽU:zU]+[cucEڈDcv;]Zje*b1Z2˲&1ۋ`s[zM\_Ѷ :(b^UuzE [sNT]@I1z>z#QGDumK5BD^K5ekEtsNAn ,fQ-C sj@}\5 `ѣ0; 4 ->s]UVYWND;b2^"vViq/uJQ*r9bK\5ڰ5iWҢz! ,^jTD9gV5S8)Ah00OpjNc"u]Jϒ9Hiن۫*v9eIJY$Ֆv9/--uW眭&.--m mŐDekQr]yFJ6I\>_՝#;Gs#;;Gjvgowv_>a}KC^V~ŝFsdgpuΑ\s!Yـ՗.GhVU!,^299YZUU[GtcD%T2kVH]D$xo6,L$9{Je>9zgwL}@>\vQi IDATU[N ?;g~n~3yviO<_=?΋ߙųsO֑_ױ(?v^jųsO^(׿{o|vvN?|mV'5gkg/{/H\qv-[t{=\2w2JfwVj.)99 `llVl9gqYf@r7G;(^+%pC @ۺðsz<]G-%,7Xo{?9 rm/]3_g3:MGg.v{p~t;]w?= 5_Ye͋xhv ͋-6ھzn_y~ޓW}l|U9޻U]k9gF3elIM"9i<4% l~4H _I}C,7@h 268㶥8eB2SMpuJq.RϜ]w43zVf[ՌP֭k(PUʜܶQkkkCLG)R,͋$N'1JkzNNDJ/"ƺe9Nr[g~KJ)N=|JbfcIqqY)9I"iNa@R)!5KqZh1T,aZ'9F*c|@d,E`\<r5 gv7Ӟ"ӠsV8B|!?Z'aQ@ȱ2#L!q(L Q0vis%_>t,5[73tw5z+I)4I8ksUsN#$Ir:82ٌ$.\aCpHJۡ<ңUzǰVm_zr?5kLxv?uoxHvoi5r[2C<n: {Uݰp~mfԠs0"$ItkMB"G!3GQ,W̢(|%<@H$ԭ#)A<Td"z ]#8x0C1zhǿ]w{eg<^vbs;켶Ͱ{[Fᚻ=P02Igl3.bR ժw?|?@ۧxjSt>6:\cdXMbJIq-1Y*q(ӺΒ-2zQ4(?2H~gBg"gRq#9ݒځw8pC8 7[uùΫi ke`ٹy.{3~?ҕ{LI_X 7}NV>Ӆ~fwLj38/%SXT Yfa:,(A& .LTr.JEdm6őR (:3, _9Lc? AAϱN_|k5)d\|sT,;R\*i RJJVBd'&QJP)ՔEQT\ӑ8P(W ~EE/c ϢB Vd($Ng3J~\ўvN.ϩD WʡJ)UsO*KJ8#dna#ia=E s@-6EѹVJi(]r8` f|q9ɑTĴSW2sbLIZE@d2V*QJ)DZzv@S󺮼$g%VY4#jY,0p>) |ZbҨ\rBDRZ$k-)$ҒYp3=`#y!|FQ"z>BH}&u,W*)8=WRq\ #gLAؘ֘RJi 3${yUBb3P3I"őӹ$Z6e]\ղRDT 8Nbfnnn.@2g2e1"ufE"= yGMa%d\.;={.\*J.uI&.Rql Xͺ(3'r!%95!:TJTn)R#BTZ?6VTJ֞W.Rl!_T\ %}&ZW*̌s SSe7!x@Pئ&E9J%liiX,f)ؘqg3! ^.RIh0l\:DObqevA3:@=:pQT8) u^X 1χJ'|>&9I)Pxw`c i {>!'6[fQ0+@[ "i+B)eXɖ|s]EREQE JIa% 2D.8% {/_$Rg2e2sHQ&}0)R̩|L%-oni6Ƅa´q"TJRj$1+}w9"p6u@1}w`6!r$`# 8ퟑSu;:D$KM)I$qLI^y(j59t"J8q}ndx09rfG#3 $t")Nc~n(IK) pN(F@!% ,L&S*XWLl ҳ \yFD@ǂ= P!Oyts&IOs# D $EAbp¦l"̛dɒomh558I-ߺ̲e\rIssyoy;~njK7ϻ]|;?CJ,\)H/k1_=G:Rz8N OXky!rɕ8b|]z׾}1D(H`+NVw}ddX*Ҳ3ḿ#EM3 B Ĥz)Υa2L0RyrRI \.bK*+FƢ*Q#*%mSϴ)ͺ]5%I=M.ׂ3z-J/R665crYQT2cl|\.f{Zq_6ym=)F3#EӘ岐2glvBA&E3<ۿ;MKQ͟?hhsh}BM^YOOϳ5 *wxcN =ErI8ds|TO~{ >}{?x޽|SSS.mk[Ƽב 7p_^lٵ^/)ܕ˖->w=kEg/*ZDrȅ(+)Hqz+ptd8RQulfbfgf0(?#w 7`q2UJ!K .1hHF/M CDOhY,Ll,I0V [lHqZіy($q{R/ՅGg,X@Dbd2/^~սVfޛ[""a- Nc, !C,.W"`TZ3sb,310{O?=66VڽyӶm77~ ^_t1G/ছनҹc繐Z+"BFQ2X,FQdLy^ ݻwpFJ)'xnk@i' (IGIA&1R }SJRiE 駟?~>2uww; ڽ7ڼ `_d߽yۤゥynnjUny͵m۽uj??lpO)g6'G4CSolϿF$  R9pWL]z"\e2je=uKLI+/]uS0^ˤڔ*.Xq[2s| ~yJiX~}).cj>'ʈ8;9ذh>sD> $Zcb!uĞM@{56L6?(ux".3.|[߽~Bp~`Kwlp+.XGxԓٸqB/XXwݸൃT7]ɵ4z׽]pi/ pƍ6o+;w|{$߽{]FFF붱 W*?P*TGvbm\F&c QϼXM6`F2 K86 "~֪T*y @ Rio8:Ov>/:BR~_|q|_WpƍgFGGɟɆ / \淾۹?Pw/@ GFW~hd??gXktoܷuS[3qR, 2mM-c(N@%0qhQ w{tuuMbwh]iPC˨k2ĕ9ͽ z )=O,Ydɒ%fs5K:}.;\ć~yBr˷8c__vvv_{R~L&aÆ~_ڙHOW }_G?U-#m v!@< \~C/+oZOWMU+%clTZ$)c 9(+_?H:}}}*#b0s:>{ i.DDGxCGυ==}kgLrabSP"^x^XzB9}駟hddK.'G.H)f<뙙V9M5ޱf}?m2'3 -Oq"q5[n%`ג%׸%îOܲ [v#b~۶'>&IrmH,]eK"9}'\6cwҢݯwǑɃy mo]uGy],!̬V D)eR)W(͔+Q8&0l?@FI1Yd2wqT"Z, n}3vܶQmo۲ WwOͤZ&<ʼnĹ;}7`ɒ% |up;>.}^K]?5gtxx'*.nmmMdΝv|_ICD/WDZ+`]n]r&o}?ˣw?%~{ۡ"%^ IDATv!ly^EAqlJ%!V@I!ϠbqLkMJɒaJ72"vNJoeW?p>4~+qeO@gm@#"vLBu|_@ #"_?ng_Ⱦkz Z>u"q_6+Whk6IL_^ܒsi[{/x?ō$+Lg$VJHPRJ$A6IbkMd*JϜ? `^|U[Igjzyg-va^??_{)Գ/4ahze~]v>s/J{[W]u/~W<)?7K~|Xp~qgގa J)} VDQkʔKet4C= ٜY8F`S(/~Ss\ =߯T*vR)hmre̥Ryҥg}EV(vw{|ssggg =-|඗vz 9U$oySK,{[%}|E6Ew|[wC=we1 Vbl fHi( dJ3C>a$1 FXgޔΆsUuKKˤ3xӯہb(65&ܤ3LPމŧ>CMy 3]a'f*skLeTLZ[)WebXJ.VJ*Y.Ծѻ ) '};6/V,g"sN{f!'M{7QJAFDDd!C&on&6!Yk<ϗRR4!bF/)!XS~D@f@)'8DԞH%F܋455$a!D:5SP J݋Eb-({~k\'l`|?LRIRBS!LǓ17z1"Q&H B(Rk0ׄDoJAӜOP TR4JD$nO";6/州WұH"E)N]vn'H"E<Gs,)RHfSv"E)Rj켳sdx#kG;2<:2<9It *:~Gj”Ƈ ?iP:C}~5:^̈́kVUH"EqAos_&2[;D{^ 5ڎI#ж mcisv1YS ̾ieMi1}RH872Sh.~_<F> ;ߴiS˼yOl{?OOw`]grПX<]+6 :Xg2}-tu֞yf!ۖ-Mwk7MCMwD!*5EM=Իvӊ+V5O:H]531ovaab浭b]tё-qfF~Llep΍3fNGbCTNRv"EoQRH"EӁQRH"ES);O"E)Ny(8 zb%"1[fB3쬈,"Xf*A  h+bqttel-oZ0/F>#`@!N#w0RHc.ƪ Y Df0kٞ# 3R5:01`'xB"/(fp,PJ L֢(RUG)R8q B V8["f(jr;CUT'@pQΐ%Td1@DdD('.2&8HB)R8)r1Qfb(ȉP\1ZfLDY8N\W;&̞B HD(ĸD I"bSH"1g֞9#"SbY qz"CZ d`d2@kX0T݁Q'@/ݮ3Ycᛩo "" v_ >Dž1vN2Q:3'#Q( B ̼]0-ut|ֹ揷uݙ#=KpTtym!"Dx}en@f!~bbXD)ˬLД A@.!9c!J:.,8u5;c>f& ֎vk !ȩ]ly; Vo1@I}ݽvͦy_ajB:p_ǩ՝#B[L$׬D8wMb x : v'r <gޝ!|3qϏ}7i3˺p%>5,MƖΝ))q cR8p" RtNqĪ:"2[fcZݞt92QshBL{Z t6 `N֘{Dd\>Bq kR#"c 96Zjgd')4jh"6\plشvA,24^,tz[uOˏƇݙ vܦȬV;v>[G>j_:̸IiƶUW=#&;m:7غ=SLT)sd)Y\cBJ!F(ʪ7ssv,9/DC14T -İMBFeٔQ(&3۽FD&DP[8u U 2ZcAf.4,31K)m[ u]$GspbӦ]}n93e9lZ>}-\]7o>)f +:.KDU} ^ԚIuw+XV}lZ9ر:۝q+8nWLo>oWdc&OdfhhN=_f+@SL^N8ob,VlCk7tn9 =bW yl'[״O|e|S.o lغfĮ9? ٰ:n׷uL7'B0m=8Tןk` s OxQ-A;.z)?OQgJp![jD]]Y i313!ȀXF(6aX ъ)˔D-[)k\'$\qm@c-pcQ.fk ՚Rw*{gΘDnRVs0rZ8ió-oo?"PoD[Bsܑy &qh'72ts`>6t[IӎAT3y"}U4BVrcNlk髭XVN8Hg՝jn7횂jWm˖ÑS.*<LXM[$TcbĖȲuyUJlrXL$l6heܔf}/FK3"["fȈ(%Y 5f9f"ĹP3.J+Hu["Q &cB,TA)1kkj_پ tNй:&ߺg`v\ku8״kntgtz*?J=vl>vk1sמ-[0NՒs sǡgqϑ9qs*ARΥPRjR.|0%k-sb916LLb)6F&MPdFrqbqxoDZsLCԪdn? }ܘz08Zvı9gD&Zqq[Hc~Lg~9 [[l ZsfΎ- !P ]-\ ! !Rq*Z5{E"dYS^~ҡB;`| n)&@@Z(% @5a׺iU7bb`&2Kgl !IGa"aX.y5-hiלkn Z^W\RJWc&Im%I)9ӝ.GgBǸYo-k`2'T"Xѹe;˓ƁK{tfarn: ej*R"6䒠Bl(1҉ز%BD%l$1Ȕ+$qߺ0Ӓh3LKSdj5 Zu%Ρd`pƨZ8"] 5TJM8c:glk!kyم`g!(td[r}0H$bcPL>iP<97sw0խtw#s2(6Tʱ-GIIT(0?CNom. tUTjܻg$`M8ðֆr`rT[7O|3hì>!Y6O׸?cV3d`|}D]d+"|q5 T.ҞAV/Adu~L֒%%#J!50*Z ٺ̧N@ZCh&QZr}]u>><dHM UVPqNRe˚It& 6 ]g: 5u zRK.G +đ `)"($$=gVX o0{{ξw{s&" D(Y׽HJɀ7⮯|l&tۖMܷ}vH=7v{?]\<{Jص */G1Y\Lwv|m#7Rkb֭-7Om|G>K/gJ'at؅v|2f/v=񏥋[3|Yݴeۣ,~fG?9y57.&e4]Mܱc e/ό]_W~ʥs"S,l~P@y\9Wp|+c DpSG"b`n h4ts`t]{sv18hC|$ۼ̗~X[nH6,ͽXvB +}+W?kF'üXlC+ !LAYHS6SwU0EjMTAEܒ p0SIzPUU6L"ښ!@kD !rY"`CFM~ga.!%"{@@ޘp{\!_V}/~ߛ_v>b=J%")!2SR@ P B[ nfI$2x ,0!r`t6JMB`/o[\" oi`h ѻ طW陘$gDnT9o TiWE#BY ,0@gdbyѣs H(j輥`.t9ʯLDCVh}Y$P IB\YQ]S:Xv]՛fcK^ơ\ 0B>0=z\t"De :qzlqpBBLgQ9|ڈ9@NH cM୪6L^BQTMcd"B[93bVTגs#NdXH$*PekA)lfHxEG{GxwYD3%V|vQx^Ygv.421QLƬ9mةuO̼ن}~5S{=Wfܤ{titq;nz9u.S+}Җx=ze\\$KVU0@# Qe\f^>c12s1``f&9@+ 0 )pMQWQ 3@C,T%$9Q/MCT2RN"j!z乧 W9a_:$O석O4]܎`[xc_7glyd6eJv3Gm۶p`n3Y4\0:X;f}6uG'͝kgρOdWعѥ-vw /:f``f=`*ݨ .q:T4p*LSS3T 7.ͭ{jM$#B33Ǣ|DB3E0D"$Q0Sfޒtn93ԩ@F*bvIJ/#=Frl-m9W*:9Wg݋ysۖM֎<4l9=K3sz'm \=<zݙ3B SBQ Uiysj֟S*0zj0 !*쐸+k f1t**;Frn}QrܱsG/O 'Z-vvȯ+;xv!(:ѣG=9#ѣG=z:"T lmf1=ѣG/?s Hjx'3k5V֑[=zʡsp L "t*Nč+62o\TTT5ez`lGzѣǛAWgGNmm8+KW?|ީw_~K'_yԙ3pXUbO%o<ז@"+拷]zs\0X0w5] 9@/ӣG=.3_D>Qֺ""*K,=+s{Ω001  5faP3,e! ք*)ͯZ7gM7_wÚ21f|O=zѣPΕ'O &.Vswf$j 5K谈GKOCl/]]K m9ѣG=O]ȿs{7*B ={h~ mEOw0CwT"*?s}_xt[ѣGg8??>$$jLyύ\LfTo8]ݏ|,"qm9#"jfq?7~eOGh%?/?y¥%Vѧmzэ.^ȍѣǛc&r$rGAc"QGuai kڼG~יH"SD&/4_yPQ39!ȱ)j9~w;eeMM0RYD$Y94\ZJUETW^R__޴qKzOœGߨӭ_wKo {/9Ny}tF&=rӺx[ _aaK["Ҍhf"fDAQE_n:>7,YruRP$K&BDS5Ӕs5Y8Ar&QM)hsJIETRܻkx~ø*8ka|tCaOfܣO_<1v=69֝gh~K:>]{ #ѣG7W~g͹J?Wʳ{;nnUYgi,_;kU@2x,Me;Z7D/'bb;x}v54rQ hT ;f6U jb)H:@*fi Yy|oޱ3g^o; ?Nx`a,wGׯ;{펻|-woSɪ}_{m=kSC}f{7',w=/ںym/ GzُnOO~lZxGn|zӹQ)XW~̀3?}zϼGnikU{x,Pte;HCզf^DD4I9߻",EG-#@RJj8G 0  INU18wx"*v Y"F;~>}k|^O\ux`='Nnܩڸ{cލvG6=yW[ؿw}n,/ڰP{^^ZkX>{'aC WO=z:?84聹Js>ܷG!9J='"Ү`;f`l6#*ZWRl[ 1*)z!*z݀bQ, )#bAe)"Y*!Y-ptDn{71ggkH KRP[){u"rQLiĚY`O# M̾ j5 3C` E bRnwl]^<!3ŔpAfR/C>_f=RY )@̦Z5Q oG'ޣG7Χ(| Ug_V9 ?uA{ߨA7o/HjClCy[kfB:0QՆáBDC `]̱(R]MʩaC#"攪u{ѣ".vֽ4|g~Z3F?<>Ia7]h1A9V"rEI l|C f673^e|E$Iξ!fU =UBPlo9"HB03ɹNln0P3QMUD1$nu0EQ=zqҹ]z! LP}/=z ܱv+ޱ)j-wgc*Ja:IuM9W$ypߓRl)xV|>-Z-nqnEe/4_jQgfRf/?wA KI@M.ufmayaVn hMHF,#"JVx.}='J+ , r9"FYꔙNTH9% !Ģq3@,*bf#o6W<_v:Ckwn1u 7<\s6Ƶn~HyO_<1kT+K_{[1BZs .n?CȩH$C:ʼn=\11Fb3WD,(ѻUP\݉'"&.b,˂Y5VU%9uk~A=qrc ?jHk;ۯ78ܻѧmuVhmmLӗ\U|AYs_z?̚VҀ[>y'6?R7:Ks IDATkٷܽaw_hgo0>ӻ{кm?m~O}L\}ןzduKrvu?!_ s}nZ>΅,ߵO̷":0m ;zjѐq|޽{sxt^ :.!<׹&*. -1O5OxycF2An3HWllalR|Oxmc1G/#U»]jQM7u=@Df*MWLE2h`dfLFy93wnuV:>oi; {cߢflgMJz\\sGhYxH8M[7i= Нǻh{fբO5d]&̀t NQ5'1RWx#x !ySC""Ȋ @AM}SB@nc``^-jffjHMȂv_-9+֌(\q}m*oz仓,Eתw?L-MGަؘoW6tU]&eYMe$iB&K_ρPm݉FazoncrjTj:0)dj"9Ęs( n0zѣە"tf$D~ULRK TǝY>J.Ysk拇]dƼ.BaD>QU B0C:1`1FYR]Cک3] Q]EESn)%ח-=zqU2v%!s&Mc>(d:4U#w3sAi~Z v^t9 S]Ow:<`> tĆѝ=4Bn"Is &:\9猀 R8* cYH]Bpu3{ѣPw[VHY3!XAܨhF*0W]h;q  0S/ir֫ k{?׶N̐Oz@j`&s0F.5 D>:̰`fH9e"*mT 9f<bdDC021!` 1/EѣG'qH`W(,D~֒u%9wɺZNjb:PD(\ (7C?~Op}YINp`</6y?A6 ͻޓ ЄL^1LDS3E"4+RMUiuR3%[1s/wG53U 23*zѣiFQMZ"ى MfD(`vɺT) uku7]p5se99w5EԺ)޶GTXz&OJ=,[ Gnb'Bw]X#^Nwa#ּƭy9.66{U%/Y6%3!R 1"ِBÖR2UnWssu]!08jN)c177IѣՈf:s2 0sίҙ3^nm4m#9o6 nT}Tu3ĒxVnD@EV n"hR䲯W]{->u=GEwa:<6ŸϭkѱVN+s&8fsroP7jr3P''j_6+Lk 㧗өgga-B@n!")'0Ccf\iiqu6>!bAt;~Uז9{ϬNe]riõ}^)^ɉb)":A25sO8pڼQ80q]8Kw2R16* Ys ̕ @\Vռwc,jW't{Gɋ[7֟<_Za6ON.GjwKBqڃ{:iy>cx3//~d1SY>Qe4û`/d›1޵Whw䍛f {ޛa!fN={z^Ys+xGf9WáE̹& VU-"eQELUUuAy h607(~Û#UaJ4e3-#߼pD-<-Ҟ3u2)GAz2-Mv>>N]8J{p'I3<=8 䆟縚YqcQa 8ϗeB &7QEDz,%c*k˾:_{~񻫺byo 'Xv1ȩ4']>øxh>w߹4aT5W"䉨 Vm+y\o҈)TZoq"#? Ft;65_ǙR ֦;s3`_n2)ތM+zYwqݿH6k }oxC7;ؼ=z\bZf!`nPs"C1^0VUe!0WivJ,#:Gh6a2PpV:%r-gĒii8u\5&%ۦvǻcGm}tI,W-[U=+ȥunMYRcaޅ}G=f@Rrx定sVӹ9DHu=,bYS2﩮ErYEQ7穪*䜄`V+瞿wߝׯ.U5vr̵PYXQz!գnhS9ZѺnk|l3m|7 %OV[r֕B^;joz_r[.KwXhΩ W9u?n?ۅxyŃW'sTM'iø;ffVO>^ވzK{jOU2ϫ\UƲG*rӕ^.dnu\aL8ϩEDEC V0??_S2GSu8!tTw#^-.{wozځK_ўX~!/3nc֣G6:w55u]d $&63ɹc`!EYeouR#jCfr25/g՚x>sg??qז7n{][nx;޹ZO 2BJiyTFelq1~Y^nf::>]]{zgܥ wuN]]lׅmpSٮ~P^]]NCz55m5wu?-HYOW[~^3@kO{@RZM,-I`bDwOʲ*wđt+'^m3ܗh:>Y>3\vmu/<]t<o<cq1AYÛQ~,옩qN{,}68pi-ՐbQxC!D"%{"JΪMP]'"* `HDĜsN&D(|e@L m]S?NL |]խI1gĜ*2eQVM_^ ̀b Ъ!RU"%$$P>4Dmp.$gQE$&VU= wБlRKm]3I9Y,KTA3.^p|$׭}3k p~5bmkff"R BY90%ґzs FI.uoIFtX^8f9 a"sN1XP UDU}9C1#%d! F@"c̬3mK`TUr0Xzu]o]ErJg^ztF=z VT:W4-w"r``NMp,HUsvkU4"ߑ53fJ)#qjjI `vO 3#k jj4[7i^S>UG~hnޔ/zߖA>$~)AP%SUD)~V031#dfSMu'bb&}⬮YbD$un<DHezcQx>Aedz㪥s,D #baܿ\Tae`"Jsss9&o2[JV" AYEQFG=z\ѹ9gd b\RJZƝSJ!/t1fĜsN)0ؐYJԐd`湹:!J@ȜSΖ]5Po{N?o XzOXCɝ0\)z{z2%Tsg Ӽ _  MA*kO> y#/e/]gyQpQܴLS}׼(nd΁-u 9D@ϨsB̮/"u]@QWf{=z@:ڛ̼ u1`-X.Y )buU4]`7^1x^cЬ 0y1kADnP%y=z\tKU8E!*^@!΀n]Ԛg7!89%'ԤctS&;/R*sD%4~t(c}U]ZZz#ƪc*p33 ~MڌwmBciVf|\YU!033 @#SUUE 3NɕsԬ,ˮ]SEQ QU.緃DDs6X =G,"1X9% {-@JbJ9IΈ}ɾqn¢뾥,CeIDR)@nBĬppVWIK)eP--`0}5jF|W/,%mM;V. u1Mhc@;5-dUUwoWU_BU}o;̽Xs]&)91C[}݇|n"gΜ1 3 ;\M/hѣGΉ9IDksWوC; `J)uM>L$oߚa^DB"OPǢ00oU̞>(@D%g5%$ L39e5186˲}6ED KgΘY9 @LU%9w:@ĈlTU"f5%/I rv53UUTGnKzFCffs}'̫{ѣMM.f!PPQ3nyzWD=mfDLDꤦHD(<6{0^tUU{@< 2lYv N{>':6=G v`@1lA 11$#LXQ[H$|нvUu~V[ԑ.V@eA&@1X,cM1Z⇺,=Z(1n5"f1IJiqO@J05$Is9BJRDe:w - J%i*V؍gTxSlL׬YSf*TPMƂ DJHVW,bsPƒ^zheX'EsHX» !FO͎$ZkR g]ѣ@H!B2cV?ytL #,er1FbivnXx6cr1RD)nb)- "2n!&{aeD,9 na!)*{IۄTZtS,ӎqs1!DhE;_m;s AH :=`d[IZmDVE{tG¹h|'6&IJy֯s}ǫY *!_"f3GCXMKx:Y\b00J)gm`3Qy#Fʉ=Q}Ee-:2C]k ;k4R6Foh0[|u tzC<B$1f3z;b3"@|iCެE$/q:6$F)fb11o,K$0{]aISmQ{Zz^*TPCHTo4ӘHb"V$Fsb*s4Ic6ʺ `7j+P"u}.E#Z+E(qy25KGC&R}|ېκxH$&vXX[*d} 4-$IIEN^s9!00s^ohO[qL,S1_ j$AA@PJ(T V)j*TvKRbP\sudˊj|<&EZRTםs:mt IDav|FD(Zbm,YME[:":[|,cYYJq%W9Fu3nG/.ɷR|ߢl<΁sRX|$ژxX2yQ)IE^f"4F+ eFqD!exYB ;ϲ Q>3Kd֙]'[JR*W#p}77Q9aTPG綰bGJ)RiZ*DLV:䙽w.M$FqGsl_ v45K)x),PBcR[[uޗ\I+3"u,&j۲n*+mLw4\-J*֕I @@TD; qvjtFI'k0sc2*h!cL\y1|RB Y*ZNjgQy@$ZEw 3 x9KvN5.=" ,އc6:l-P1ZVbncT簼CNeۑV+~vPkPQ~ Щ9ãޮ]~Ky!$F)EZ+dv= ~;}{x?7*ҨEj> J, !}ڣpo'._=szMs-[ylV^+[tr[\߻#g*TO\D-bU@&:G!ڱwIukJiUGdwN^Aq<ӗk׼~7;߱ek^6ka<և2w,>pvn *uK"(lQ@Ҝsy^DUQ숿Vk"" bQXct,ͥ;:kcFa Z'iDcRӑס͈"eByƬ AC`PH5H:fF$8F$im4;%U'û-}CڀKi6u,}9; ~ co[{\.\W|;OYօ|bvNuՒ ?s{xû`ɇەzN\qun_}{~nܾ `N[8q>ݹ _=/yeRb}!w8] B o.hxJ$MXLTl%ZQ-mu"@Ԙ!>IL&囦iz4PNzc)E#_#:ҊepL a9CbfbI5P-XJ6Gxڍ{pi9h x(IwT\qٿ,{KыNk?F-=NC#+;Jj\n^k&/ğ3,X% L]: oy4Ż~8-'_[W]m_t0[ Ɲ]6)r]5!| uDjHMd~= bPwۂlgg<aw6"`j[!s>;2p8䱖 i|,((xz/>ߓ"|`l^o;DnO\us+o]xybt-ZyBÖI5;6ʰ H_^p?^k *t~C#,Ͷ1Rde4Muβlu`݇{{vaDqYOl `a2ˠfoljk᱋/]'2|c}yg{G7}o u,zWP9z'u )AGk,LHbpL, PzGy4*YHq@)xR@ -Q)!RiXjs@Oc[JW,H=b/^veOգl,FvOWvXuՋx'\zu6;[Ջs0Z=o eY|Hn回X{^,;MuՒ Fv:WPMsW8RL Z`qǼcxB/mS R HXP{MDg:}(cA:N8#g آ4=p$79[Q AB@`u9|B%46HI kYJ4ƮI~'RDݒ4J"D,czma3 r ($n^B vJHu&f&!(5Ѐ&r;[(ƦMM *t9@fe "zk};,0[k$y1J"k3s$MQDM'Z"2ZcX"|pa7越݆&ֻA$2PuT D &m[\Ds\}v4B *etP))eDEC@DB"t"1=ۢЖj9i!"҉F}`JA "J!)bz圫0_r"5@.f:h%J@6J IDAT1Tm<_WPBγ,s"BAcy$QE)fVZ%x3"$݆Z4͉#1FBEdatbVʲq* [ w߮VpH `R P h(ŕ`d:tbUz *Tx\XLw^b2IBt:: `eňF#*|ֹkXZKQ9wγu"HJEz1a}?TۉGt7TJLL?2q!h0>%B \}*TPA)H4zYƘTXlVKX4%s(Lk]$SV#sn]Zk5"5 :u4]@?]%PH6bH2TTRr9&C aRo8 |*TPȠF5[ p twuw uMP?WJi{<ƻkQjfVy,=0h(jYB:vVzGfrf ndnm@˱:HAD0 Cʚh9@eWPB#`4M,UJ9$J%"yHJk!VCژ,b"/"$Z$ICCC-B61 ZkC{&L)" }%OF]FIRt`MT #+*TPskݤIuyy!"&1==PE,4Nf,KC0DIL$Ki&IZ YcZ31f vIh?nn P=@u: (TkD㌀ U[ *T8B94di&B*TP‘NYjc4-(RiEEVbnZ $",򜙵6Ji$Ip!Qlu\[y&q';O՘y֭+W|饗+8iRT~:q 섭M#]HXĐu0 8 *TPሥs`ϔR$":kx,®IlQ Қ0JkdF 9g"Mz!"km*sjژ<"Euw}]]]Tm!NX ()_%@ h (T)s0>p:@B+TP‘N"+Җ0I(sЊ>"l߾ /7e駟h4 o)I(:00ys_Q0AX1fiwl߾N:eVy;w}ÆW_mZJӦf,Z(m[2ӳ,v'q@"75O)@&/:"(Ddo9]='2o*TPᨤsDY@IQ D"z_s=7vǝ|IӦN=iwv! wu߰mg> Μ6czvM}i?yɓ߻褋?tZPB G"3s$yQĸ6T‚$I/+>NW:"|֙g[~ܒ%K,%}򭵮ղf&ĘxG$6m5k|G,{{3uڴhGg>&Nt%p‰z=f)V~쮻~R3Cڲe~pϟ:cnڱdg,8fS;={v-V[N1WPB G(ҹ!IRJDs;f!(EPJlI$sֺ&*"̜9~kܶuDSZj(Z\T1[XJOx٠Q{̱iz9ޜuY&L`V_>zggi&"":]s3OޢFDE>} 'M{{p@_PB:78b$ZLZ# ,9}Z}lܳ,glԩ(۶8c}`}mhiG@*P__RMu .V PذiYgLe˺XWWB @(N4˔R"Ldf&4M40 lݺ5YV"AmZzNJyV+Ao6cL?T0sWW1gܻ~' Eŀ_B-S'WB *%tXDs1 [srEʝ!ՊkfW3g5mj߿aÆPJM0!ʵkGoctn { @M=֟?i3g!>2B *e(#ۅB"٢$iccq$IVX||;,۶m[o ~jιVgݏ>~O?}̙3E䥗֭]ɓ;ɲO:ׯ_7?ÏxqW1b#tf:ӧ?yY,|g8n1v\솧_<9H8wpu6S PB Gpf!䭖6Vط6J\w+?s=7K;vع'Nt1&Oh4v^j>׷%s s)S<˗/Zт |lwر}۶$=:3ܹs׮]z}ڴim޼lL8Qk-QֹWZCfT:qr6if1IHf1V3#ؼ}Ji=YG`JR-6 # B"$9aTPQw>KsHi2uTgmdq$>D7I}jԩS'O9s/ ]]ZRJ$Hd)Y"bOKZk9svQȓD4uԩS⩧B[L2eʔMf̙#hT+m&M(uKκ!ը0 1tܱ@mAztu12@BcHˈfc9fD:#`&[B .hgOng#-TFL9F"mj(`fPlPfZ+e``є$&Mphk$eV d^ާ~;y|fÿW]uk|]>[qc"]vTr_C7qc0{޹^3x+l[ع_ߊðGܥс~+)a.{Ϭ%%o;kDz&koꪫ0SCчqՁ?\X{=6Ì ̺޵Tw\kۊWCJ$IDdhh(:bYH̢TzLɇp≧}K_g?Z&{Y9 ^|?x:HGT C )c2$%T@#)Fd)3adksHŒ7HȈB@$MjNz4:{zݻwgyʴf/ٷm3f̸+׬񪫾S4gW]qAMC|h#\{=й 3.pm_ˍvw?Bc#r'oY߅8}?]Mg}`v8j3Y絷krg=}p Cq_ ٷl.61k+T7:O$6EE0*www@L=>"£*smڱg@{zA,@xa D)PJ+@'TJVhMI$3gBi HLhte  'KEׯ~;|+\XZM}W-u-(ϙi?{g̚fيq 87|;83:HV5F͛p.gYKn:fw}| cˁ?g B·&>kAߊK6agOٗW\^a|of>FᒣxN̫Vk?zBvyʻNO?zQOOG$1xQJYPP$)9EX$) xRFD 5"cbLF1N뿽QU-h^ PĻn7(EC ߪeg M왬{&q:[3p"'R!j9{Oiji0LE\4^mt1;fQAE QY>wF *]t6I,԰MNl6HHTX?W@y 9R @!fi,ly@$5ưx"s/R j$)R{99Hp`g!BJGB BdeRrIF[5k|^ֲl# x$cfB63Z9癅HkY4 !7[ IRӭ]D0x$y^X.M.}̅u+TPBE#Uow7[m:yho0<"EQ@  Gh90&rR2@LjR"I?~WgϞĶrc,e\6t# A|$ IނHY#GTBdu $EtҴ]D`tͳʐ҈"?*TΣW6\g|L*<2`!jw]Q5,/(XQvߝA/w'!  !! QYM6!IJ$G=@<=  aXudAR-"I8P *v)$1Q 0|(ZMӚ2B@@`"l |Jik5ƭO}=Lg̜|9=Ο>ɐ>=+[xXkS~W̲O>8P^zaz/^MS3ДeQ1W:ke7GxwknEi! 3fμO>M)?"{6yWru,k͘1˯8"[_׶oq>M9VCY1~/osܴ|;ݹ]u۶ ^w2kn"*_lxW~O wynKOwvY{$͞5S0;: eYy QilFP8/F=yBOW3# 4Z&{,kCƤzfL -;ش>УiwE]aÆ_tE_Wo~#tXo-%ozykmv` |σW"^|X?'{/T27/ay1v^#JI IDATāWU#77_^{װf Q3uᤃ/y Gzɜo/w.hsʫ甸7\r Wܻ9{]L)MK)hѢO>Yk}ܳqFkzZ㓟%\l6׬YvZ=\y c=^a8wDq Wxǜ^IuAV^ܲe[腿1l4ƤJsL<e۶]?^LR>po6jjm>]k?{yY\vn?߾KFg17"tK`QUoo\kx H$5 "zDIS ""I}--PeFbRPj:,jZ$ [뮯~]tX<Вo÷ "oa_|6]/lGso_,ry؋1t}E__۾o >wG|WFxoMK/,>h<Y{ǿ ^\`ϫr?{~ᡓ~s|k]/pʫ\ Wqt>~ǻ{z9SO_sΙ2e{OEQlڸǟ8SO:yú$QZIdYvQ뤹"P(q#b~ /o5/ Ѣdz=Ln|\^q‰yHo~_t3qݿ~3}͵8!.KHi-,KF&"Ykw|ꍆEZ{jiWO=Itl5[:˒.@6/ZEH)$5TI9V}\|Lmq2ٛ,"^>O{& \y'C;K_={0ڱv{{yKc7ܦۿY}b0y ʿQvՇfT/8is^C;5{֢E=C<@\y-Z/_♭[w}/w~QG;vg\R u; hQ+A6AJZJ"E < US'R TBUXij*$4iRbE0ƾ; ~{{ggwvf٭]vѢ)?v$ZxQ[[ە+W.^~ֺy˗/qg]Z bx ckc%v\(We"'y'_w-}8>8\D+Qq1tt#};J@~؇~d)7߫03A ZZBc\E$DR)Xcff$-":"lkcuQ :ZBԸ4M(RJ lM))[j{s-Cӫڣfn0oyꥭ?Z}&{w? >U#xuc]fϔ<67ߘB<̲#;ᣗ}{FnM |0gOYt==T?חL5zsc̶:tk'[[[gbgÇ4ݾ}{wwMy79;':;;sW^wŋ/~׿ɷjY leѷO>o[ κӟ:{5.P]]_۸3CBݲdB6.Htbj](VLU S.9W( n0sG(D ju15iN2I@!'ڤ2skc |Nֲ1iH!L49u7Ц_:ǽW㙦AzᑝU?\U#{g*%wT߆:GDb֭ .[v`͚%r֝˩3gζŢs*B)IJDՒ=}tfpǎ+^}ZZ)5>s/*صkWGGGuaV+bR?Wr9͛InG_Z6~#X.JpS_9׏K}ݝ](Ԕ>v}-rZ"\6| siI  1&/0$TP9C!0ImŌONNHZ)!EQJa 휝DBV¸2se{_T/XkxwkgX6gDJwU:gZ<{Ȕ=򉫶SmdvSP~s58NPzK_{ a X`![jE,C>{EpvZy920cfMu&#D!cL9$lE|9B9a>::A|c"0ԁ8ցqTN][2hM[Oex9|כpժdPi ZgWnNS" @HYWU;4 *FP64|X&&A0R)$aL H68RbEu(d$J Re",#DT*@(JJ*ȅ-9rR9瓰x<{[ ]~}53)؁ wW*Y+k" DؔS#y99 bvt3[g@ʀ s4c[FRJbsI# 5<gs 5}S cFA5HV`u@JPQ0@?#'zV˦9vƲޓc=@s6ǁ}@*I)B G .ؙ lflf ,N4t3'9런SP;BIqQQOxx<:G ;C @Mb|o_x4 iIENDB`muon-v0.4.0/subprojects/meson-docs/docs/markdown/images/win_downloadmeson.png0000644000175000017500000026447014737503617026556 0ustar buildbuildPNG  IHDR yZzTXtRaw profile type exifx͚YrܺE1f8h#jo6iK{Q )LN0?[Sl[l_ ^o= ?s<<}7>7 >x_0LîPϛj8xP@,Di%n{gaܗȧ_OA~3_׈%#|KÍÏ /y9Y]WEYa ព)&ޗIʗv3]s[}n2/z?}j(w| -PIۄac.޷MWr )1o~9S!r faSi(s(+oJPX*L7̕v;K~VyK>-LY " dfsı \?ȀK/&cٛ׽9;'M$"L?U2IV)RC=SJ9TMjcN9rK*RK+kZkr+zsε:;GađFeFό3<ˬ; XyUW[};Awy]wPk'xɧz?/?5ʚҸ#k5/'I9#c>:2^ +g2dRnr)t܏ܿʛI_SR9C~7Y[y3tbjw|'2byq1̻ZMu]Vsje_F;)$&.Vv\ j) X9UCӞDAMe"Z pj>Ί Lu;qZ9N"y(gGCt8Rb&|ѩyܴpH\)Sk~جhaʔ'ih12k17W2+z J 3Sa>۶̱.suW*L"M+M:!ix80Y0'&&P#= ^fIO)]=V?UEOsAuUc3 ćd tHE˽̙`cS6] JW[Z.mD6;=J錖rT.%,յe䣭ȑa&gOTc/n=WI˷m;R {n۝LH;0d!i86Xw!S`:h `lگ$m}횱R#WA=Tk v{#my1~J bS}LNPbg>EVkA@uMB*E}MI_Ρ5IIg ̍3WraUM c(A>HK;6-:XPL*w` x9I Mue6[;ف +7K'Pk }2Erwv>ἯVE͌&Yg,57u&g@Y0D7|`MMAh p]jüq:(p Z%`jZ3;aPhQ (lX mL'$ 1,tP <ͦF6$ؤKRdB\w (Op"(#qz4$%tYTMލSAXS.*R40nq|:MSXilH:r^>BF"–|KWB<~jw' F S&}a.3ty󰏖B2u&A݊Op Xe\#xXU҈.O\vg9 mH% /NYt4(1k z &A@BSxQ]A)&sǧ9rAs 2PȎ۽]1LVt? ,$,Er }!d}wd " = ( 4Yz\:U^S2A%kHO؀PxJjƁ'g#:Lsҏvh Bƀuc 4B-:h>tUBB;!kPK@R/J&DO6soy2-uHz-9܄{ KM#/gi?f(yWG3Is+jq/3FO|7V]? 6O`,B͉\bRO"1:, U- g0msP()ylq.#$y81`Ǔ݊y6B!5 m"aH eZ2Z#"{`#1 ! uA4ЖX(B4}u3yJņVx7@9QQS8O螚 Awq[&B M6. )mAB0K&5Y=Z.""V:3=pH:Z?cR^w<~ m.L A-lDD`)y q?ը50t`j0( .b phA݉z@#6TA|-m9ISٙAs0j=fЫ; %$bjJL!Sm !} Rػxڄ0tHp ,(=$!IMz7 ԛ*6qqn< 踵U׈anMɗ<l%'D^s6j6pKpR+:6:BX] mALD&)6o [&M;*pcr:Q풫PȢLX1&Ž)| 2*K0jj`I'Oo˘ʎ s|ʀMGoOKVH&3 6&*k0{&Xp!I3ErJn4ÐMEDOtJ(!*j-kz "P jPn8+$ށ4 sżyzB0#k~jܻ^@d^܏L|wOkxdx*{hq"8jI,XA;Џe@V5.[ڥZv5K3j"hϹuaR@B+1E|&DeNdqy5 ;O3yC9Th}PơD@A tN+Z{2Fb~@qJ`CmXu ly483.ƏAd/TpLL@bkm49oF s;[⦿FazzZbj2TVLcai5!:ez Kc/S6ҰJ;EB y&jQwIkWaY˃u;rY '*kS TUJrJ #G 3sJbf(9 |`yqT%oE 7S:0ZR.D( )ڻT4Jpr>HbE RΜoMR(A,',IC{1vÄS.ԓZސFm .}Z)$bm ܅en63<,͔o b&͸%e嵻g;m̢8q 3, P +OGٶIdV[u&TV~]9YlB~M#bj&!Ă~tcE 16Hyv[*4X x ߝ6bޯٞh'GHLMDV ,$L롚XT˷;%i?Ҭn.z$5;)IQ* p`%6I)7@g{޻[0 PS)b2+A0LJ{f%@v0@#CBNbM{tJ\˄ Ig/=H-WYb Kjq+ji_]aA.sҬe.*&ӽ8N<,cr4'njOn'ID-`53 xw\9̻l3tI]t4awGdqᮼJmLUpgv=ns_hH tFk'Ϸoߍu(3.M_ax*"1XYJOU w`>Y __S w/9utVA+u  w)js ?%THb A@Ci#bHfx ~3t2X/h*Jap 1mWj(ITnwT!<,ZQ6r7V 7 70ȩ GqF}Џh{<4]!oi48D9,>cA~7C&T>&qv}]vPdr+iHWI#6ER4='2׿7"뾯zYd4+j |TNF90~A-AT#"4BKͧ(^󠹐j9}{8󻳙7 ₱NBH+jHfF 0Z*28tf(m̽6rQe*1ȗ9pItAJJצGo2v"M ۻ݀>#Pu? 2QNzӣ@}D߸ܓbl0~P=Rẑ85yг\h1 O=~D@i.hX 2UFOpW@i*… 9Uj6ɍ/W7vst Q}ﶍ57W}G1=+[KA7s_}T vc#+0TŸ}ZBXiXYE<%/<&y @1Q~qCNi\4Jb`E3]B cl!׻Tpd-zV ~u^h wC ?xO̿OwZ}=+i4ġ HAam%|:*bRDvݏLyA.}8D_b]N##dDI!\QBiIXv9i,XKC{\6;qQO15g}}v?5Pwz7 {iohwM6_9_^ZُМ597qiCCPICC profilex}=H@_[R*,*␡:Yq*BZu0 4$).kŪ "%/)=Ff8jN&lnU"~D0L}NS_.γ9z@ xf>I.ۚ\OdH/3w Z8}2U88F=7wr1iTXtXML:com.adobe.xmp Screenshot !ǭbKGDI맋 pHYs%%IR$tIME L IDATxwt]ysn/((@ NJHRHɖmN=_fee2$/eǫM[2Ȯ 0yґbD=D:.2`T);졾nt*UU̚Y$mq:Uӧɓ b``Pb6<:FEDQDQ~?bK)|T dBd]@MP%EQb`2 `]*lBIBQV7 }m74D$EuDA`8j/[_M-](ޖL*$]WTUEu$IJ[mVh|<|X&L Ϥ,f*9j5Uuw߉ #"H|\yA | ̈8@G@'7CD2O'MW8q$yMUg!1݅1fEjV<#C"(ڍ OXWo#3فp$ Wb"t7C!]4gU촢}xCdb8PH! J"mncѢD19C4HrӘ2hk~ 9u;vfgK8|(@D,#+33Ѧ~AJJ Sc(CLV' i7*L!ˆDx:?Þ.?>WJOLv1J7DxB( *8ItYiiiTUUQ\\<&2Ǐh"na<#~uߧ$ϭAhag $QSD2E9ZEU=r]{Z3/9^k蚎 V|m->j &t:/.d&(l_au§=?>/3I0ؾE=+ϟ QZ^3t쇜NZW^Cu }c/?EUG^os+|cI#q.$Itvv+BII ,s 6mDEE0~c_Ah`Mݦ,Fss}}}hgw k$c{y%JAKjcw? 0cקˆa먚YO/]&lN@S4]@8UGAA@F5}dIG>MfP/汸$ ]4aİ0cwڱ12I/ F>TmdE`B>DQ&UG::WQGIrxbz| #׎Kđq]Gtteqd[`GNf }BZz2.#IDF! " Ɩ#uEՑÎgFhh4^˿7*%M~7SlP(Qelujby]l'~66PLםWm]{{FutM&" #hW?/]lDt4-JTVG}dͫ70'ΌɄ &O.fʕ= Aсx7(2kvp8s  q@eEMi?:>KO(Wֲvr4MI{ǕGl(14%"G 龌 0Y.~(nډUtknlX_Gth>A3|qnr,Y8k5qR [46BBd#;wr-%A\T0?=uVAD2pe Ty5/wD˄?rhf'">gU}|$d_FK$~=jזvԳ -lZ?ӺGSeXKxX9X6+IQ9ǼزYz2q'Oql7h@gåLsTбZ\HI/ uq,^kq f1" D[N tmN˳r̈́Dy3<: ^8ħG._ hhTRNΞj'Դ 'gd[ v~mϊ 7w  ٲe/lK__$yYh!f%SQ>UӹL(ig) . 8 ڱjsiP%)o6+ץL 2CG鋹([%s 3"lP6YJ~6vDfƳ_aQVswe4s!˾IpM (dxU *It:74D5̰ԱX-/8y?JB,V:>v?̀fYQl^@XșUUh To|Oų[R8:9`#`X80˩ OIӟvf WjM 5 yhsH_܎cK"] bcEXZwqR 5JO>^WIb +Y`w8‘]+)4jZ}Q4*$%B۹f"Jo"`*^5(.._w'? STTȚ5kIIIy`mdYp%WX$Axv򫌍/}10xbnwtX5L&c4|3v;7ݘ~O*Qۄ J$*Gw;痆Y8]*F@ G&vCUnw Id/BFxSvORǙApԆ%<'j!]^eo<'4R&? _Ŭ@ [3m>&Q cDBF)_?祾Nώ?ִ~3Y6w2`¥\V<  If-[A>UJ} Ssy<%3gqQ8Xn6:DЇ|Y/!ФNf!Fޢ6a:ϤyGԆQ r1 !O ΗYHi _]Dd^+ɼ*Z(_[A LЉ3W0{KMq:W/ f^M_k?ҙL#Jv0Ä*RS+.9fƈbH麩Eèg.T?G.g:,+/'ƎӶ.W`G@,R{髙ijDY rIM+2#yg7SظԂ &g$ Z\:]|x ݼ浧 q%b~y ?*Ǜ94e +{]~ϠUp3ĎAv;6E$`~G {5'7RGF7@< YYRyul-[FQ~הOX?ƊD`-;o -?C8y% 4rdJ_f \8.?NWpgݷynr*CVo1{ߎp5B{i-vBUUŵ|o!)B]eGkDĆ@7"|q̤9#jGׅi뺍ek K!}"M+bjƟb ?x;CS h;x]/ṒI*S8O}&r 56Lݼ_a^ ӻO5G07 SX0{*bJbYCݸdqWVʼYy[<8LԣbUeQ!#X}mӊ(= i%CȮFw^yM)ĥMxXϟ`W̔5ŷ7qܞEO;EYN.Tݶ ;ȀWdR 7[xii5dti"Բ"4f#Zj.ᯪ-~q/03߃cq>e>I$_XɒuXUG[>2Kn/N|x )f3lSjeX1dګ˙^[eH(dŚx*;~ e"q,]gr#X*W7 x+Wl2}3/gG4዇{m?AEJK&n{uU2ĆiB!)MnGcq7X$om= R=ˎ> -~Ÿ?29gkΆnw 1uI\Ih((LLQnkhf f3fSTC9/L%q38fN,.$My T[q$E>g96#u x}1nlFɆlb/\;&F `JtƳycJ $ګN9H{/z\**8Ēl7.Y<=lC{81)OakNMcv× $wVN;Gv 7wsN81Ɂ79QGjg.!zSYoь-}NhfE_L'l" YLʏrH%?jI fj4ݺ!H͋[ĥojjbǎO)(+Jrr2)))|ogRRRHLL4,'M~7nijj&PJJL7#L ;vsj;~O黝6^zKp8RR@|@ xѰ]#I&^{X/m"#oo›;@,麗) JrvpnmQJBf~6_N)aJ*tu#;tzЯbsbsք<,F>ٸ!3Y.^Wrax2ёܘlNܮ2Sc2yfxdꛇ0%(t<͑^d[ e%)D7r*$p >,,t\f޳0LVd*J( [6ų Mly8y4O:ۼR1 >A45@zXU )4 l,x4(r|ΈOZN]l+a2--\<{sMʹT,EI;za9!ɝ;pVNJH IQYN%D[Tl IDAT}+CQaĬ#{kQZ[8.>`$][[Á ==BͺF\Vzǁ#T͘NzZYY`2IȲw#0ͼ*ֽ$NMSI28`{ +W9G9Ѓ)9\GF1'2uJM{wqNw L"}jh&1wV!ũǻO1hZK,4#DSws4=ŎwvrY˗QUU8xdD,D$$ds@x R0**҉aD mTEfL"#97qQf֗4,r调2m2~OY9n-9k%/NCٵꀙəeTΪ$/Q@ɟ9W8=%҂b* ENZ*bnL7;xD%D4"z)I(niL-H]8~6X.ۨ$i2V,Ayq8~Ǣc׉ SI" j!!= ۸Xį( qqq,Z233IJJ"==A&'Oe㷽aR\N-|"]a>>ݻM(^/'O^۸imCf*'QXXfE*_?Zrs34__4?@Z|  jmul|I\7R :5/kO\UTD&]G^IG]GUT}l裡ju]CU#к:M#&E&MLcj5de,tYUVQ`ĭ}4 I4dYC MjLE*1 >/E}6us\c!* b+D姩tD]@4}~%?&8WTTm,Hx_Dq<4XhdQh`YIMŮiA}N߬fhšܲ+={غ}qnΝͪ+o^V?×&O.eۻJ8i]ٻpm 0!H ?xBڕ„xC~hW5a+ᠯ~[G׵{\%,HtOAU8Y%mmobۖߏ x5ei 'nwܕ9x<5~AbϽe˖p80W۲m> 9.IlbN; !-7 {CL$V2Uofɋ D(lrIq:b|$N^1WT&iE֫$IQ^fyuiU9Ftco34kIפ1r1kOZo>{ƱZFlwlJ`2RM&/#%%cc&VxΟO^nm Mb߬jזϸ~u7LE>n\~/|g7/ۦsM>'(1gy][m [_w[;| >('2xRp-W:FQUUQUul(X,V, Obið6000000ĈEQF}ss:HdtzUUȊ,Iqqq?nk``````pu!H$zb1XVnŊ$aX4XLFUB0AIMM%..XyćiaAE5 ,3l6۸10xa@UU:;;n^ZZZlddlH.+$0^:::&==lԈ'@|H瞞nZFj`````px "77IV nn-@t]ghhvHMM+#REN'6jIkk mm2YYYXVM< HdCxJoo/!!> KDQv@ ==Ll6=5 IcFGG,oɑ"K&+G03HܙEY70 EbԴD.6CnFv;IIIF2x C0.ك'4GM*AM4u"ep=bn֘ |^&O|G~cnYwb $--އ>D\&><*/^$&&-AeΞ=ᠴ(2;G$z&iiiaݺILL|l;+?288!11d222]~gՅ 0uԇ2> ٿ?]]]w<>[,2e=i |Gx<zb\:ȿ=R'b1mۆbaŊ,躎dBQDQm]رj::FϽPxFII}7tvv"2O$3Ӥ=ԭAOHA;4~#(a6[y}!*+ݲVJ>hd̪2V+nGjj={`4md-[8h4:݉'cL4;w2o<ϟ_TUF{}~?TWW(26l|xǏgpp˗_70000x<Ȏ;FwԿ[56ܫv!|?'jDa8 eYf\n,Y-ix^VxM61}t,Yr_zl޼ TU!p85.^W_pbfϞlb``SN:},u*0&P*ayPرcGe(ܹX{ 6d tݷ4"dm޼RZZK/tWSE\.CC~BmW[nDnn.X{%Duxhlld)̙38u駟"gEQg?9PW^@AA7~ɓ0ͼ8tiii̚54ҰX,tuuNMM bɒ%%@9y$<Ȳ<Q\\|'5%Eb!}FC8,%hvL7 m"OLߋ,ޡ߮"*8j+1юbsDd8`b1Iw\R:4Y8\5D1tjO[Sd1;|G*Պl2| yF\EU&0@x\5Lݴe.`QaVQ\CMNٌY9njx8[NrzC4Y/]eəI!J{<麗L*Nr/*PCWWΝ#55*, qqq6l PWWNj/H,&'pr3l6.ZD8hw-=oH^$H6<ȓDQgᩧexhAtǫc'?z b롡!>SKee%6'==Fƣ$IHtIN'E455 X,6d r&O̜9ʀmiiAw3ŋyͷW^aOIIIhݻE^x͢Hgg'[l!hѢr_ʉ3T8Z@,:~7f 2w m \{ALVVLh!/=]idLn/Cl=_+tHQ.VPuM!l\Q\ij" "RtVUQULGWU +׾ee}N&;騊_EA<ϸ; ===n1~:::X,deea^H;wOxPUF`bٳj ӊ M李 .pQA ##˗`Fx\ TkٮmLHC4h]gJzqqn8vV5_G0p`ohhumرTTTIMM hpVZŴr9BZKZ\/Z;.; D"lܸ"cPm۶}vTude߾T>$2i$*++3%t[ߏÍc ??6!A:::xIII껎~c#.\wL0~ ܹsصk`ݺFt%l6#I >Ǐٳʾ}UU9~8`9s̔\s %Y%$>.54W>3\hlc$UQk[1/(;:è"&%4%x f=FG/Lҝv$44j;{~ܤN'/;ʩ'߮#iTٖC8cd˧ڀ(c☾r%KfMBᏺ)zm!٢wUT.~jvpdIH`溗XTmfTc^n}}Ue YdX#^FbR6<_AUa:SZȟJ{7HuKRvc%Ūu4!J =IɌ"]E`uS:I&B}mlg8*`seP2b 67OX&S^ۤ3r!p{6w'/y LJ 459!⥥ss|&aO)OZtԟHo88Al"~zOOCim)&3e8YH;@C]aO/#'DuE35;Y.躋Rr<`?IM-$=FfMT`FYqQW?olRl;%>l3g. .AU*@N5P5ŔMmAt]"!tӜoiVR )KErD=1K|:KI;s"NΥdj.MW 7nҥKa[n̙3~zrssٳgrvZ*++ʐA8|0|rؼy3@&Ƃ|>RRR;w.zxXv-\x#GO$y>^ /Oy}Փs1xFNl()KU~i.JDZZ*9sJ233;`0Hww7qqn_J5Myb2p8$''9*,g hF(M:gϞMSoY6l1t Yh4ɓ'Ǘ:tۛX,V^MEEu \DDQDQnp^;g*ܓ4H$弮rrr7~U~A 99܃._ b"2IIIYfB>Ο?ʕ+b2HLLgWP(tժ244G}D0D8p:uԸLwmi$yVy|]}߫]6KdKޱĐ@R m$L;}Lڦ.3I:i $@a5` [-ɲ֫9laclc1Ⱥ=sg p{tbR^!DqRpk쭣^oނi,1ͽϦ<Ǵر&vr|a iNgX`V nr{xMǯ- _KY+oAkU"7y?#OPSh]<D,-MuDҳ~c i\wS\kT;|wq2Lf+{xv]U~fooup}˨Kmxe\Ο7K ]'C$Jwx.$a"6fD܌8g ;4,sp>Kkya_)3J}h ٽW^;NH^+,e`sgS4ٻ?-`Yx9y͔yS u`nѳ(JbnJn.uʂct<-1 ;7@Mة!O,y:#}0*n8Ȧyڛ:stϨ^Y:#Ϟ{H+Ipxf RʳGؾgr87Dg R1[ F9%&j3kf5}[ٰů2F;&P8U:Ck)'S:{4Zg`f.\VU)ڸcZ 6ǏcaN$J܉~ۏr3=׎Feiȑdp&v˘dt8{8`難)4P(V4 {;$'sQ2 o>\qjjj8x $uoGUU~?l۶[d˖-211A6了TUQ˗L&9r0=pPSSbϞ=(-¼yJaIŚ#*خQ65r5={JnihYa &N ]s9ɇm,[}(Ͽ@II W+n[o%]7.Aee%CCC(BeetRvzlppˮS۶)vDQKXxnb֜vfUJ6 ;Ҳ2B43 ]CE N_e!(ᢦe-8 1 qUe & U*fu0 5ȊV P&TáB>axph-RyA:zU77L$7b`A1\7tmRTKtbjYOqm yM Ɠ((~UX{NJ{l+,͇jV^,?JIs4ȑZP WLpoѳ~| 1 7si$GFI^fF#8a gvԨ)iJ]ώ/Nd P7:?t1ܪOq jM3m [6^d0[:g2 No(:%shom Ielf(>17*G樻Y5tDs4~m%PɠSZ_K[[>̛S1IF>NZ^ODϒ=M4]KQ:n:}>rϾʉx#^_FY\fWy&}%iB%9:JJsSTQ HC;-#<ߝy>q:,?1j&b`GI*[5 }$$H3:.vie|Ivu3+eTt;I+Su=RʬEQ;wqm_l*):QŽ;W6R(q:]J>P(dI˲p:|ޫZXwxX)0!ŢE |۶-ZD",X0[AEE. 4dm>|z誜a6ͣr\m6^z%>p=`YH$BKKurNi3237h"/GFfΥ{~}/ћ[1z2x`sbVB PS3qN=Jm;xccFr2I:s:-)0>,'st`!OnZx,OPg<ۄQ$36DħA"1yU~)CGwW16pS#cֲF 郬slWᶲΗ2N8U(^>N14¬+i.t@*]EP -Vƺe$)J'!m8dJ8s P@AAA;Fu[n`a}T]((vOhK?ڠs:ygԧ( SQYU?NM}'.vmerRTb5?_TE;~SBqůg'\Rp444ƍ1 ŋ6YjL~~_i7|3pGEQ(8NǧY4mP(u v* ۋX/釥1& +-wqkJZZyɧ饤uj;O9.~5McfO-FHʘe8ݩx?=r:jChy;L]d|A7L'KwP2ʩ ff mJPj>wǘ]8'z$IùiN>ϳ*-TŇo^R6qtdtbÓ?ìt+?o|4ȗZK'DU؃/X U`r|VAsե=P%͍l߷g2ˡ QdL͏8?L,QMi4N/m}gxAj':ډdgXlܺ .9Oo$jGfRmCؙ,Jjmqeg8h"}7CḾameYF.U^<32n-mndh&c^] 1>F kޢ4m>N(jQBsx &]Ei]5^o8@<7B$M&ᝬ?`F"1l qUT0f@}U1URJ) S)0!LaVZ(lذCH(X,r :;dŗGXE2$pqvÇq8Ǚ83zMBb6dfX,zwӱl}}=p-[6(w:(ü 0ӛLo&]]]|^egټy3U\I,vr&0k֬w|k׮P(\h UV_V>?aQ.CCӇuj~;wbrr \t%[e]vpM6+]㡪h4(׳c,n`sSi%K MIIl{jݻ'OpW$˲\:Xp8vرcj*:::.8azd2ɖ-[GN~?7|E$*N_`ЇCO4Ew:qҙ,ZhCױ aɽ)Iē 3;ڨ- +L_EsS=>#p1޵Di?* 3Y0+SSQH2ȠiN_E-%\jZj<8=~8o51  5T@s$qڔϚ˒Eh-RLKcI`;{f|8 Ϡs)+3HUtb Yv\ ܷ "VUME؇PRYOE(%V<0U3|B@1Bw|84 O, O1D2M&G1<ˢ($yAI\:j|x!t*E:o.ienk٩O D7u(h8A!7~قNI]+qcP3I<o:"!nEs. pF>E"CFLYȏ2]tV>EEs F {h,D%q1ܚN6>J:gb4TI%\EMM2`hoo$w2+<cQh` i&i,wzˣ}~ 9x {졳bȬYۘ?ed28pCݍ{^Fii[!NsM/OC;Tv +tM(WyBeIB]WE^}uрzǂ %Ͳ|r\0˖-zu8vŋ/eƍl*wfppp7mz͛73<<ҥ7rM7]6 |E2%K\(.xjf3gΜ33~;ccc?$LNoڿ[AQCB24o[i\Ç`:' $ ]VecY`%V d2TU#QYYy](@xgxRZZ/֙A}P#̝;mtyq`j:\YY۶[I9r\“{n7MMMWqYⅇ ?I*k/;h 91 lV2pjꊍYS(Z[˿m?y^nbIٖ9ή_"1k 74ҔkaXIĵ%'ˡ*^w:\.ƍٸq#R]]MP{S|8)ɰj/W_UI^`v;.7kF,S5xt:Ck>i(CEEEo$IOnCii)|-T ۶/;1xsr77q%&ǏP(P__G4 ŷz=^/~H@z*b7~tq^늅 ɉ"`9&G28"\:uʬ9Ɩ?^xe*]Hu=16f!C"a?dvh=mXoc3$&̩6+ũ@R`5ZE" ND`k0…6UrZN@s]M,c``{{b_lǙ9s>Jfдn醇PI2E ~y,M*|[ s\u{E{qjӿJ0=W|XK äR)z{}/`||^jjj$W~znzP !B\OPAXpMddd>JKK 2!X"I!CG=Cuu5tuuS^^F00m&#w|>!B\Yw*:s"۱>Qzq㡦aN044LU.PoD 8'Op8 JJDN>&S!U:=I@B7VyW] _躎&WE4TI>Bf? q\;fbۋ$!B!ٟW}]s H>'J]7M6-˖Dd׍iRB\Wԑg$  ?HrƩe)ߎ Xۿf*}_TeqYsCQu=IR Dt$1=%W!3 a%X,;~K@2WŋY~UA /{oީ,LL[]Ms}PRjτ-S~ξ'G`c٠ Zx>3ǻ&_4x<8ܕB|@~)!& ui agWJK}BkT>Ϋ+VGh mN}R{) '=/**UB!׺kr<=ɁǷ'4; 6eaòγ;y:#;TS?gPB"Y$k/ CѨNtoLQRb*mvfo7{RtofѢ{(ڞ59ܛgc$?dVͲ;'{OM{=ZmsgE`m=| {QJ !6*Y޼CeA.g~@D~Gz|#DjY"B!.2UR|FxI&~_O_у?7> 7¸E׀X6ZaIg$9N[||ߟBRP5穜Au9m!9p(Y> |UG%B!Ls=UUm_K]*6Ã$Lpxgqw2'&e#B!;\ETϗB!Yy,.-g !B:QS}﷧W]X@Ab!BI@.9^*2r=,L6ԵB!xCSA>$0e&Lir:QUI@B!Ź*U!o2ɑ{t`5ʲIerLL&woݶm,@U|7C1B!qP0 =,Y|F*5t]V, *iTB!6S7B!B6B!BI@B!!B!$ B!BI@B!B!B!$ B!BI@B!B!B!$ B!B! B!B!B!$ B!B! B!B!B!J@ۆL&iYRB!B Ct\ꌀ(`KX2a|2eKKB!ĵZN풚׵\>i(p$ B!BXO-" e[dyi5+(ht'"˞B!݀LQ[BS| Nf";#e$=eF_͂X+ZN?$"B! M7h8NI@wmqh_c47A{ōT{qz DVaLtoc'+j@B!v:hȚ8Yi BD.yIE."_k 5 x KJq23B i,B!w/O2o E9wQA ŷY`<5 'xuOxx!8`9',^ݑEQ#L"B.5 ש~{ѯIO51Bpxwp(G)^hayy YA$TIuP'},ΡcѼ숕rKy yC$-eUx "h53XYF'8>D54F+LN<@DsQNptXQmwJw)i,B!w*UHQƩ]sL}8x[Tͱ~Y 07ާY ibm(xԄKO1 h$~QSY*{S!|nrc S~a|C6+?ƝۖWp#í}aFME5 ڍOsWApTF@B!U2:]$4ybN)DagH2m7t|q|NݽÜPQ vљ*RUy_?iͲy,m(NaXE%7/ Qq:v4wp;O=FpOBE'rhrdY'yiq僯Fm\fRug~ot ć)ZfִhMכ.fQ}EXHSMe(EQjOo_pdd 6& nm/-ڐt坽i+I]f̶Mh7ڥMUUp S8u=_Su]VG`mEm{_ugMAT;F*C]Up)l 6*zeO˲<}I( TV/ۏ {-n\3Tz0:Ù8aWMg]Xds)EMC rt"CiS#mN^(hXfD.RO1&4CP3b!M2D7P Jl{*(Li i=>ը_0ècN25FJةT-@}lJ#G-4Sٛ Qm"4u׹?c '{!6ݯt/-ކ wH YzwǮvX,$I|>!., & ^""(B,_^gQ2mm&=m|o{ X -C-.#۴M.0XTZ_-MU|2Mr3˃Z_#ĢRedU]4?m*NԮNhOJO%!nƒ6/-5p}m'ݓc<3aW\0 ϯrI=4ʕL6 R육rB| !$gk S*T SxjظMG}%>9qIImY<>ɿ"w;MF*U.{9cGG=+ E:Z %!B! PŪ+k'2e qhS6V!Z_Eá;Ъ?˟}KuZFrB?7>q7`+:.Mᆦa6jT}Ɲ~z H3C/Wlk]=Uw`(.n%ST'M&AAEEtte6_+_m+hS7P 1RlÞ#|#{p 8uE ij 2/b|a5gM ]̼)9P'_KM zzˢkz> -^ym:$O珍2 eU/z:Vj7=L _er>_gLFۖ`$O%Vkaw^}/Ŧɲ%|S9R_`(ܿݓY6Y2*x9ѓ?7h9cs~|W`|Gf(=O=v$ȱew*Tŕf~jY ]cNx.~zq;Lfi%>Oxxxx`Ql4EcS.evdDF3*XO5~o6^Nhhx| Vxv{;RW4YAnR=eȩ.79Xe$DMpגQVNͱvc{^+ 㘬Va3FyB>n}r4îJUB[`kc_+KL Gxjv;=(OS-i^mvk(#+pUޖ`Ջ9y.kG+S~aa$=m~6}Sb㥬a\t ]'Z ADj(~"GnGƂ i8sf!ǯƫHo)2d2S V_>OY)/ u5Ůz|HR@NmLEqL6^F,'`0K WjU;'2?ϮJiv=%BOJ.j>Qx+?FGWlT_bPa?Ne," 2?p%q.B< % WQ/V;ec mr=݌:{xxx#T:TAy ̲dD]jD/&q\:;Ҽ%ņŧ0sZ'W1 ;ےtwyqKۋ *-qX r /e0Y?̖u͹tpLV.QWؓq8n;HWԢǔU&\._LVCoph8K@3k}U.r)Ftvp({m PQa0bB8bn|5' zy͡/eqؑp*ɟ~?K_T?^4BJR%A :-Ԝ >zd,~`r̂S]Q|\R9.d I^o(О.M(ܷ0ʊ>F |zw[Lht ҬښaKBxGTD2{rآ*FՅxTG!dzoBM2zJ$4iNJP.,a^:tyvSm. OeO/3dOR-ÿ{*B%U v'4d\uZɁ=|]! `A*ۦ'Ǻ)<^8'PK<2OUPdaߓ㭝I,Qc<4Y:.T-{Ҭn2iIʳac>Vcx1LY8`Ձ< yY^Jx#A;x"eE?lag *h lE_B%^c6?;&ؘQ*8OrSh;h>W`߶~nIarM`.?VŒ ܷiKZ K T:IHmĕp%eCY@+PFJlSjC0B \\p ݠ:$@d3Y J$(]xh uQK)932qHCF+I\TA+,lYU+ɸ4Qqt:Ͼv'IQBB/HN̳`%Kc%,)B̤y wuB$Oy%O 4?:; |S/>[c4Νs9[ͣ9Lf;mJ}ҖpyDm'-qu'7REAYp94yA2;zXw -&oh,/($sL;d*m$2 0M8];r4b~ 8>' /yk@RTep\ypuSCWwж,H=k t$ykR`s$x9u\9C9t517HיS&T0dM-֝{H˦|]b4<ݕ4tYu4ǫ3|8KJ&VeBio>aiJz ǪI~| Ϟ ^dfECҶصba>kY1An)~oP^ͥ~7Q؎KVB@ҧw)JP0\&7b" jT_BU*ҕX?*cKTBK?B M$ % *0P/qNW8t$'xʲ9xtACc| |ٮ˶_ip gqio )liƕwA`645T ^߀tZ%>c<0/sT.=&oH3 IDATU'O0-*.㝽y][`ܤZb^I>N|c ]e-~b}I!ˆ)|SW0|1JO&*)s#6f~2ͷŧJxV4yicƺ~?O 6~JSH4t-?9Pr\J̼C$d(W&̔CKcL-csݖV+Ӽ;˪/;T^J:Gi?=pkklܛrG;0~^KZ O r׌wOSd;I9Q_ x|N6 |oG U Gg[#YY;ͳ3;WGҽ7'@<<<.J[ezY _[ga"i|G|iv{:êY::h(HY`hǗkL0N'lܚ\? psf$iq*qjJ,[< ~{+4Ztgͼ̵%e]J5 BbI> ш(*QJi̠2^H9[YWnQ+&SY`t{ћ`w~iPq%-a6]+Tq]/\&ۛG`Rn e<.ļ+ivBU,8.Uqf+UK}.^GLx%_Y* 1Lǵ\Nc4 1:R OVS |]uGl>UΧ' oE5t捦_#vBMSTqczc ܯؒ^6n-wDR lo5j*rCYGeyU9\ٟAV֪iɚ-I~<|".SUJӗl4~(W+<ɣT"H*|?Cȳ'ʇDEOwV:Q]3'r<9{R<Ɣ+O4;kr<27ʯ{ 7k|\\JExy3 buNU;6Ҽue>;'De">V1}y6vqBWd`I$ ~oWiq2G\\}> q =gc/T+`_-h8ۏPZ1, U5-%})~`C੥1ԢA((@:?'k{67":̋27 q+Dx`(<9=XYǪjs@E (y~"8{ߧ`x,IU'+III5r]i>ͷdYuWo-V0l蒴β?*o.06(ІB ΄Q -&m+@O78DƆxra:4`$?F ziihUa}zJUT[r׺`HIlcKtU9[Y65[1(hʧTjĸL)֕'^<N9VfMӄJ~F2\6v1-pR by;[0ƊP%.wH9LLǑ`%P׾&t߅I~Mer dj4 ;zUBKɸI>fT~a Ylq*uQɵ:1JD.ً" \(@((S1& BIÇJ}j;{smvw|"/.]" ˞C d%ώD5Ӽȸ)Xl8L8s&q$yۡ?XM{Aө:]켊 KjӼؚgڍuEA5lhI@ny^pYI`ٚ+ ZaM_bryE!dK.u(87Q!R`IҎ䎅:$vw( C~3퐲@i(P2X4nyY4/z"â+'A8R P𧙼/eIPQ^ϙs!ԋ@Zw4@LgjҖ9wYxǘظFUe) SjTb\zC_& E!z1>Q\ :C>B$zQ>ʼ)Ap]2L5߼Gk{(eyY> db>2H&6i+ǁ[LXi9|BO =$i3Ϟ|wWc)>S$#1%?7 WB@?>Vkxgwɣ ! +hMG_[\l{ô]Z:cyabqI!3$]>1kM1@@3Kk׊ 9K[ y~3ǰץ"?g\t4 Rv5/Ÿeq?Nwzǵ9+ * ;ڠ:?Im~?eSÚ{eCu.F8)ʏ 0Gu*'@<<*ԫB@IDwP).!%'RIP _ z8#lo*ö ݐec*ub9ۂ^WREgP 0ʪYmY^ٞc'OU{s ]- .aRRG ,;z3-ųL9-~8BPU;ؠr0o_P(Gɤ3 r!nzv`W(ghM\8faBmuťWQ(! Y9ti- %>W+5@Wׄd8XJw^}3/0{Z$='3HKf3J7@:Mg_+d( ~n҂xl_gHs{|L3&08`t@[W=">cLzy~Oma4JU2oqgwؒ)ƯF_!.$''xA3.q?u.4͋-Yv5x@YwF9֚5oya *.}966l:e1inq+!bA3k?ɰnW6Xq:qťrl18Y~U0gh4ۣ̍I&wCy6g(+g9DI{XTY~3!O pKt(JUOV[={wO0뒁[l;Gc/ ׁ/; $^ndCSIa!$ÁK2`?IhYXM5$ Iɴ10,0_~ܢ ='ϴ-q1K|1WQ23[~7˪ 0)(Hg,&$8ƂsQ?&N7MVm#iƆS0>c*5wMOfHJ,^VPW'U&l;e"J1a 񜋅¨9a!sES43Ɵ|ҡFWlųfΡߡM|rrG_`43S/v J|u 2qv 'oyq[\/=44eUdL]N|kj ]c8{&/MdbplΡi]h1!Ycdž0.{3 +XyX3CϮ ."JԪ%e}X`^P%9ӡiM'ǯ0Bc6.okA U@Ld]PW!*:Ҹ,+O,'[4dS_ K< q6uZAĢsj#eB >X1 5}.I bq<ƓBL+ yqTMcڌRK~oNCQ>}[kuƅXjpS.DފYfvO0qםUT2sI%%7SBq̺ ˔J&t 'aƲQqy"2C̞c4k>s:[  ϋrc#/}TFgY+ɚ&KBnQQ_uʴJ 7~ #Xc:VøhTCLF>q:ac\ +tnC#|HQƜQ:*-4AY\ւJT;SKǧy/KC$:p:IQe:*tl ҙ)dJ|jfNivvdE/#Aea>5MeBN0q R xxES'y~KKAXqKYRj+_8+U৻d\*|+'âˑTqMm/? mrLIL?73CL)F̭@bʬmL!qO%a\cIg=+k3_`Te9zc\XEb䱃pIEkpŅJlGt.94Ƅ?lq'tϖI5U|#:Ry8*+b[_I\P& U8^>sAy@UP[-:.Q)~P,v[,~(b\r 3#R۟_$q@xnR TL۝ib}.5.Q1B`߾7@E*?.>+@.`LU)yeqj]=t;ŰoǑ֙**(v]WzVUq</NL!."_BbYO?4]]]ה!0__M(q}µ7LBR!c>L˗(<ԮZ74h]h\k+q\%&OT]~,qs>Pc2ρk-rm"лyvqZ |v8qu#qAӷAtvuMttt!@[.d֌i}2.c  r.spΞB!GS<<<<<<<<< Ezis4>HLi=y; \.Gey,X3ap0y卷X8%vB\2='{G|"oDυ!1K` ~}b בҡeobC3 ֦nvRi/*[FWP%cmsBp(a(B{{'TV̜>^{={ /9z{Zq:NiKɜ=@(\B,! p'l9Ω*=C.*ANꣲvI*c; b)L.9/!_0RLjcT1s??\S*RA} xD"a(&*/-,GTV]Y4.1ݱq&ǡ&eYעoLr|j4}4 Ɩ [v/惷3"Zn(nW kWsBB!:O|Ӧ0{ ^c=wb6nDuU%?hdr E0"Ϡ%Wc ;9QGi@ f,d827ѝfZiSy D3 OxxxxxxxxTTU2yŃ!X8o]ݼu(Efss 0jgKSZ=`LlbNF54! \dPHH/:9Gry"ɹE8n zq3qAKƉ#>˄!Ţ|>KrQll6ǎ]{ذyKclݘa$HIhţ ؾcy[/wVB IDATs?/0U1.(!/)PE6+=<<<<<<~ˡCFbYO?4]]]!C,uX{Tq ne1+h45eeYض]pٸ6:u4]E44MCU AAYiﻛu6xﺝ %, 4blˑSd"u*S?|>4͛@AI,n!3 a.Ƕɛy\9X:\K do۱ /?wlRb9?h\oı L#Дs~.VU5 MH˲p0t y GWF Ĵ|e,9 DB |(t,L3Oq 4Գ0 TP ?!v%)%R@HI2X)}JU)$,GϼTA,=!%fD}qu8QG1_.?s~s)z<<q"$  ym/]rd (H.21tw϶tm"-{I7Exx5{]+O[~B/w>OSs]C,bv0ESjF\aOE`I,t_!0ly=ذ䗎I_Zl/P޵2teË8jHFq}K;i4K *`fEXFw׮`@U%'SRq;HqK) PpD:{9,{[C <¿}6DJpwСf\| SYh9kv/- Q#l:MQ* lk(#T7R%zٿqy;%M('PAB>wS-\(unc|FA,^º2%<OxxxܸhM!cHJI\ea"c4h|&V%W5<|9N-*q]/|cI&,wqI2X8,$o;ȏ{I^q. o4%O8K^QNen]l*& cR}iO#cf||g9R(˔\#<>JF1i| !&ZҸA٘:&ҴZ8΄ISQp;NW6tq'Ak1/@<} des&1&棐åjJ jIwC RŔy' l+"R&OGȕKNo0vS2~DjÁa$t[זy|eI+]1qc͝F.H+mBgWN)m]&OAM0cG8~:I^1sJeM3GWki7(c8;м$ %:ևe "UL%8%Q79y>ɳ3ɓhR5*&cJF鬏yg\o3wSbw"TU5,8Jѩ0Rr0]yALgLJ&NHe\8 'p)ybƇ`1{deq&Q`e{hk:;HU2e~lP=E|8tZ#iŒ<1b$S 4jVV-2GݜqU&0iL~,N`{SU? 5q4CWK8ʠw_"ĕ.BE A.Hh3 B6tLxGX0])W+sl$襭u9m{}$l!|i-?q7W14m_^Eg&`=ؖEu<|Л!W5ѕ;=tw6hjO;_}w7E7yu!lyd7n=L$ʟ{|مA>.P=Mr8q|7ɮ{8ܕ&7ƷlIzHYN[3ni` XyZofrd͝/XPʎ;_%IFN,:[6{Qvs|@rxJ ײvWuI:iO2]l}%D+i>ok&WpG" fL(f Ud &H4jMX}MGi)).81qAnW5;H]̢qȤ @xTMS"L̫ਪL3CL\hʛf0S clwvZfҐ0qi}m8`qk?ŤPpxS\ս ;wxE>my kNظCî~V)Оv=43i4t%"\p\EcCl=IG=۱kut/+ȶl1?W`9oūGCE$[XW)%'Ngq߱mId+l+bAwhc6mٰa}9)Ddgo}-m{s(sp.ݜ&GF!e'i|5^\\y=t .kwR(ؤ[Z9; iڎcֈաbc8]4nta oli"˓M4kavfo{U E7#cX(IƲ3ۛI9m[}ֹ1^0{9i>nƁd6ǎ1hYȁl޲}Y}nl4)'ͱ4mM{ٵ彉=_-! H9=+.R 1x=|_K@9&P(geuG'iY;O,橙5,c }'] [sY= 47DZṁWrߒq}qy>iW;z'͍ٝ۸b/..6B;;3KEIE't mЍ|@)"@WW̧c2Kٖr"d}{R͌Ҵ`߽ZNͯ+[6RE8yujV^6E>eq[~\'yظ5ɶgwp|a=Y ,/k,e[#1 a8;hKXU8&6Ύ3qmޣA7U.ی_e1e^e Q#}VEAD 8f CAM;Ga4;Y#liH=+Oé&D 3gj6/'SYLȺt7|#iM.{g61 PLpZU3xqD(tLw#1Kׯ_^C8|jG_7藗$NJY~ug}?f T M$\6=^ƷLL'_cy&+Cc:_ݐ`}Cl?#Uo)W7ȏlE~G?#ȅK,̝0n E1Yqcja͂|6G8ԎZZI9~wdZ{9аUY5 Uhp:ʝslvqU)-(wsnIF8ۯzJ%t|z(@M~R1v9Hq+lO>'1TlUٗ_#=)bKְv^d崚, Ќ0ճe]# gx`eO<֚(c< ʆ QV+lZZ^#:o+bdƆЭ8Eh a! znb*BC^ʙeWrJb+6i~9S 6L L!H(pl>}9Us)k]GU,"{Sa9bݢ5, =yuױ.@l?qUDM,$j\Aykg}p(5C}D%M= 0d337^ScYh5C]T 77 ƻعՏ免Dt?9BWxzv<}E" hFҤ3i?i"ð(Τ/bih*&=ǞS}ecl9tv`ݼxs*<)dXִd3į~Ŗ;53H'$,/!ŒnzJ#Xql\^ّ85e*Iֆ(LTa|~ҋmw|\j\s iZ"ʂ.yDTTD#/eW ZL,wѼsE*Eܿq߲wB6Ü8Kϯ~ʮ j)]O B|FqOu %v\ )|F^Ru}76M>bb/W |G;*́PFꖥ9Bj=Jj0/׼~֛4qe]xc'˛_DW [9 hEco?-EfZI( k B|(uj7X34υpǣc7PtS ,&)_wب\>]Gqf3O?G4zͤiV駟#Z,ׄlXHeK;_yKLj1{Z>ə>S":lbFf>W^uZK}j[ sbb{ꬻgU%-WsFCx0 (S1A{o 3c8?)c 1wQph;=FZWn!cysWN5ԓ4y$NXc{$5$rh-=k>=Nb?f[A;q=7!F~V=g_{4FpM"SPxm1jjjX_C^@m8ݳ0-4M?J~jEg//.bA8u agiixM]nDjHp9vGz&b0[a6ύ{ڈ-*2L%ÁʰjbE0CY~FOLxFKXxRMB"*# @S+vb!)*ƴ(?K9:F=2orw=˪}ƳFn6++ΰ{OEEEP( ŭ{5+_P3!3Y%]l0dAۓ4™֧˟9nuV} E{YYT#|O7zQ 啕nn"P#¬y-,Zрg`(CE hOqr^UQZUKD}?D:*6n.M.y͕$ζǀuQ }]l%RSKi@UF9~>r&.Jkhj3~'<7Y^FE}=s<{ޜr6Gp!7YXWJݼJSk뤳k6NŖe h :v0w&(/O2!*JIvsY(;ǧRV8ӧ9@MR_סPPՑ#Um(%rVysqOྲྀnugЭogYMS3UPb9{$m=[U,[IDw9u~ЅCn3GOp>mschJ.+t)Yv7[Z) IDATby>O̢&r)PR.Zdn}s!.*Me)8Г#o%Ez{}]9$uXeu=9( Pewș&ͥ&arͲ]=bq ^lSVK5[ob|tˤ$T;+$9p켃=;w. ^rD*in.!:'Wuu+<'㙔V5n64C:..h{e\Zh)8ౣjb uJ!Bvrg Jq;E[W/}C͕D\ߌPZ^BPvCm;1U.0-(vQѼF f{}Nt7kS?{W<.:pCq*Omh]g R[l9xm-EBy9R9º)o*#{'=!޺$.s;2zJ:J Q;|t5@ U)hU9UU:|]='XWEyU%6NwOF+) )ϩ*V\@se ȝ8Ʊ.: FTV$##}A\׽e4MO;nƵʴ7stN?WszuˏG.B]qgٿ4MLc<|yޥӚ65!Դ{o7i=r+wqS+kژ:7ZZ-jw˽u?]~rp57Zr3{rpվ]۾2<+{cZ 3-čǞ^踃n`ָziGRAoeS}=lbG/ʬEظK3o;ɳs70-=Cӈ64E@믳/Ϭ @/:h΢y%o /b]ױ,\>s~'x3CEp8/0)[`aM,Bi:Cϙxs U:iA*)\V9b .@^k=ӮZ|ϴ?ff(۸>j}όs}3댇3Cдʟ5uׯ?ڸkJ]qq]]k}/G7pMk>rI{m2|w_B,@u˯qA4?8=pEk/HTn )N8]b?%l*ѺfevH,1٧sd~hXBE"6UR;u]GhXݝtNQ-Y3;'w!ꗯby8H(R})m yw\ ʿp M LӜʢwWʊQS Q?Ew~B!$[}&)g)E'Ov./h2}e 0Nui8%$ IpfqĴ v,Mҹ4a&P/>KDl:Oi@#RRfI%-[KYa3qqtJR:Y% +ļRXMH1ä3~&@'->Zr2V AM\B!"> O?=y3Yki!B` = R9ͳ7#3r~9Xk*`2&z95H8 ]i^q*7>c-a;kԔNvR*ZstpCzC^ а>]_GM -y.S=5C7P4 !B] hۂ>NOyY)J)zfslٸY ((-)4 j%s^6זa~-xQWG:=3PCq"ĴY} _&)m՗Sj*k h,X |lݻ_˒[_4Y٥"B!>ӔG+$++ u46Li=^|5tPVZ̝[7QVVz MǴLLCC3L,¼8uAw*QJe m-^LCg/-fc:n63H m 0C$ehvK)xʅ(B ]iU*0&D\_"޻ncϾw8P())ti]gd!BOAWkG@iFC]-%$Si}0pUEJ\ !JY,dc\o0 _ͽ%d PTZAYnJ8h1Lb'TWv(AEyƹ)i`;l^ƝFyͰV !B| 9Ɉ#c@ BC4r_S&jb3-`E^H)uߞ(If "%DJfX&,'S!'B!BFZ@B!߃D4%D!B r]Eya tB!B~ D!BqHB!BHB!B| t<<B[@1<]0t!B <l|BhN61 CB!ćS)E$!|eFFF$O뺤29\u, t}p]\@2,BA[BB!ćT\\yjq yT󈆃Vc:i/8$Si||"8!BL@6F0JH7FIf%K|\7 )қ`&"B!@|'ˡi^uR;'7Wpw{3)\'d:=HO.S?zo}9=@oe"y7q4MaY&JAP(BqI,{ ,1fX='k"4U.%d[\KMLx Z?H ¸qU|iԅiy m9B!">3 p(tsN2+ ƷPl`&8Z=~!Fel]#O01.H ?ϞKyüS`^2Jtx7]Vn_yv1J)8#'P!&.X>6ðs bUiI;"Fyyh3TE=NH?z@]I q,P9e8ōGM&RxQ!:2:(l?˾S/4F#G93>D)2D!{lI||L3Jc|d"MUB:99[XT_X6{%kKik?.m!VW%{'Z\?bǨI G x9e빷8#&B!">cQpƁ(.j<:F5], ٽ3ۓ?:Tt,oל؛z@aH#B!bLPFD','kx_ZZM0⳰e>vƖ dj,ƅ>QK/O;e-y1Z,a;Dq,Nch"5zg30qp\P@ 7͢ȵόO'Vq ]A!M_4ںb¦~:$G8?uUTă$B @)Edsd9¡U f_'SBכytaj{!sV@$N<:"#œƕ 5.O\+c/3~M>g:.h;CvhRm]lC0[QRxtDUUhf!.}'xo0Q@0+P_E9z#ݤ|`hEϸx'{^΁%NRs a B!">3!$ dѲ9zhUpJw k| TMn_/+Z=X-]: !DW ݶ-Ӵg|jPҲy)r~d|%_ek^oh:|{|fq P[fJ+Nnm^ۖdzJD!BH?K#tͬ[Ƹ|<$&]uBb¦G.} _F$.! S 5KMP0hY h4BHp,r3lbQl}rR&ett3}+ H`YLtB[ƃ"}BXRhfxMSHNʺhFDQK.#I2:XHDV.!BH7M!CߐO>53B 4Fʶg hKGkyq'D?͟T[C|X<7ԑ>Hd.ݳ"rc(?[o_ !@η(ppo{ t([Ϣf!._7\F԰;Zmt9/-&lͰ|_Zuܵq>! B!"n_71- By} ?"g=r $ykz}0uCdK;;t RZNeHTnoX%5.x/OGK}͑Xt.PzN] k{2)4'A&捷w`Ywq;_cTV;IN7Xʁ9 c$v4/dOwx~E92x``Z0;JXaV[d!fm4Byu)/QaL5B +L(I(:顳~%Q<4^Dey͛)xɉfD.>}oO cqihe LYs;e ώTg8<д| *,FO7G!ڸM`y݃눏bۮ6r 20͚yB!@'@B46Wp7y_ZGD2>>lk٬6z,)RRMƇK+T9ʣ he;8\|?jW|_w Z*v]&B!qSir;r(æbzZˢu8  4'o+M XS75 5@rNK>?DqVwfє} & t4al |-B%{0z @ɢ{֦Ɂ\ST i&ͱ;_2λ x\OZJiء"ɳq2GSU_òeTɼtXY.|W,]ӈY.],>V<!BH7JQ\Kq'CD DЪrW9J3ǢXG;3S[MaM+bCeǰ# -1h4s߷ n`q>Е(mW6WG—* S]4|(\RtT}1M3..z.t ѥ !Fj/O2\4V IDAT[[>((s,<|߿Rղ:OT8tkL4tC% cƇ NGq= 0~iJ!(>LӤP(P(>OqX%B! l4HR+duIR(ۖ"BqI)]׉c122B(4/X ݮH1 )B!@M)eY$qҙ T 9]lۖB!$3ضaCяd됦i>B!$Oz$B!n=.B!"B!"B!@B!@B!BB!BB!BB!BHB!BHB!B B!B B!B B!B!D!B!D!B!ÐC >ʁB!RJa!G.cI9B!@EPJIB|4aPZ!B/$"B!"B!"B!@B!@B!BB!BB!BB!BHB!BHB!B B!B B!B B!B12!nu)u=||tMuLu9HB!!xO>#M}4 =ö-.AD!"-|x21y88D! !B!甌BܲqU}gO,#qޣپc=h'cV }[|2<ۖXB!猴99;'X{FK|\.Oq|=kq <|]d>~`!ypes<gz;8w> ca:WrRBisc^mmhOvbqf;q]wG |g#4,⡯}%'ytN/8?%;80tQ`)'^)ɡ܇W57\1@ȦMf/[֥m]:xORrvB BE.g||ʺ" Ѵi y)YX\gd_IW%(:$gS?Y}8*_7F'?_N~qv]?)b9Mk<c?2 ??l)-[wM&$!@ӧ~91|0<藉7?mZ/qg8ӑ 2൷OR.V4SV@w?ϏzXBZ*S3=nQE "G8ֳ6x,۶C!?얣<$IR"ĭfV/O*oPUYyNd;7S yg9r-.'OK8}u}O^]iUͶܛ ܴnr-rB  $1q7neޥjUV>ei%c0X>C[33=Ovr@+7GzN?Y[ٻfjkZij?ku|f|UZ>~Lљ?\O~ܷ7i ڵJ4Ҁ}]INǨM)LÐ!B>RB,d456 hlhx]Bi ][nT#D73!C!Vo@BHB+#` yS[ٶeX% ׅ!@orv}tN`т`]Ç/sBHmu]GF0O?`0@]M5wf\setuN'Nm*$|!"޳vXh-}ؾsO]ϮXbg  Љ}C:u|8~>|m,?-3| -!E<Õ4L]H|NKL/Q))ݞ`"=7ketǧ8P-j2+Do~#Ǟmc|de~D‡"ٴa'E.i ua6oҲt)낔v^el5%3<ߌ.rdMviy=zeLr}|Ldig=ዬE.D }O>[ X65a:lݾB@|Je} 05se{>ڬS#ضOə:R0T%S@iS^npwbyeq>9Ǫ!VğbZ\"QUXvc$KF7{e6`S"'hLtsϞ" }`oo4<ʎy|c2hyƼ+>v Bwϔ S;SuEYyy5.j4>3--1^|,{"ehg:N|vP h ]H42w^ ޸LU .f6}qhfMq~;Ȧgw1y. j4jf8GXeU5 fU.i%q!x> f.׾.[ٳgu.vKU:ke=xv|?l Z(Wxļy^k0jjxEP;wgypԸpIh:ρIE8qM|'|mM2rs֍> VLL>|KkWX/nNV8qD&M}X'dkZo;+ Sq<.  Bb'{4F\ 取3`S҉]_`?CCchBO[GdK'}|G[և|u2W>=:̇:Lgbj{C$Jrm>lpi>!Bw;\cw:ďͲ9l%t\GQ[4E ]vܳU+5^c_#|hMϵ詸; \Z+´D]*E@MH$ .E)o30fK|FvwqGQ> n)mc%oMp7ԣu[=ܝy2o棳zD|t8:cOM Յ<擰(ī=>JfH 3/L&=1S:R,&}8[Ϥ.YgũNΜ>N 'j.I:hwx T}osgcYbu:-Q5Y9;@SNk NWHW88Tu tCEt)HN5H]cťa_/qhe>օѤ%dƣقɉ G\lEL'秃iGyOYkƵ6sRFjYp(t$9u?ho47瘄W"Ιu}\]p9SdUDb^ЧP9R6_K1p~6Cu`# ֤ rep#E:-qŏY,j 13iQ6kpBl(7Zͱ1jQ[mњ%J!Dhb]cI=q#7>̉ i }3harn*ٓ:Ұ|SCgO1'aRوO)ޝB\Rb(Px4eY? ) RJaSܚ>\g1>RfoOc:w^c(^Qşu±|dydB!~1j\XǎqҭeV"M:3Vnh 6^ZU X᧻Os|t:ےKӈ_ qoaGE$# B\,bd4K`4_Р}۶9=0vC``Fɡ@_ϖ|<+/!N*qd$BU*11`B2Y<Ͳe,ס%Lb]}cTxϬ0 2џN~YM&FSeE-҈, {`gN nl s,kx;,J}W- ҕ~(w^k1;ρ\XХץ.Ȫeq,Nq_6-<6NݬP?Rd&o#6/sr<$C!*ʥWTly9XuWe'ܹk5j_Ζ>xm΢&0:q9vY[&.\O~wZ/U0_IZzGY'TZgF5"q8mqtΕmjG+hTEf'6>\=/‚*3 BIBS;6v[7YG#ܺ5W$Opa"tt Jv<\J~괭JДBiɦ%*uEig]䆺y;975.kHY _,BɌQ*WhF_Lrfb2Ou:k|aph s>"QsZC##LLXd+-*|׍C&o`t%uJAu@t4SQ\N:Wv tqL3S :Ssph71>0ThJ4r4Rgbܡa)q9=P6M#06j3zfZ#Ӓԉq<GmT 12+*R&)#q(xJǵW]Ûy8:M5IQ(: Aus ,ҚK#0kLU(+k ŽИ03=NMM CSQE&c3bkt4Fߠ2KqQ(M3+aES,!?тDAtS!_(:%&%$!Odo(*f&39F&xD$8թ >\5v|^nvPJ"0hl7\]`=m)ط!lK|CRBoXKDV}E4~:KnHՄ^:XjcigSxULj"OD(pY3;ikibC?qӧ1{ 4)'`()}`jFBB BW"a/YȲ PJi\d"BuxC !B!.6BHyMQB B!~!D!"BBB B!$!@pȔz!!D!HvM`;c9$ KI!įyoxIM4uD!B(ێ!p:PHB!^5 BYdB!.B@B!@B!@B!&Ѕx }=M4;B!!/)|yv?}̘3 (B!$!ިQ(9v$O[by,h$PG&SHK, (p0cɔS~B B\=c}VS5 IDAT*(555T.4ػ y"w?anRg9<$zfͽ1)n[PIŬz3<8ɗ(p3^bk6ğ > G +6w$p泸eCݓ ]Aj$![e9|M:{8Çyfo?%-UfxNR=iiE.3{}tϟFmdDϥ9enF}7i5Y-U/I @ٶM6Zxb:>elڲ H1lycqYѷ3,8:u}ɼϴ*fwJf,1 S /xn+lޖ!?nL^);-f5$8@܊ÁU=]BOm8z'[? dC%qZ̨0gg{/>O9>x^pj^xhBH$b2gfgt=aɌf3-ev%YyXҹ4w6(J#t\<͇fM@0sյhv?S!A,drU\U{8l br˕Ԥ0^f>gsD6IKX'b(N =87(yaKai>BÒk´`aMg-ߦjZS'YoQ;ҟ%ukG~}L_^#3W8]ܹ:Ε 6߿wuFs#0']G=&'#U! KOrQ?-|Gƙ핅J3kn(]ngiiI:dQnRx-_u 6:ƢjSaʏ` %꘳x) qE󐫝h4¬|Uɰ溫xϭ9p83(xO)+&_ddm׷y,=󡫒XK;1e>S)BMB#l)*Xcd={DW?_erO9[q{>j]Tp(V4:4h")>ni,X::IWU%a3|{ge#Eove, *"_g0rslښgw#nJrSbZTLv2B_3ZEfe)'pRәVPfU]O^@UK<~}{ä?jϩM2pj6EM8p5%qF*x,FC}-xoktǸ=eWbAN [UhD4H*ʮO*IgGnNMk*AvmwL9U3'3rcc6G+p4b>/ZR/|Ȱtn|O+e+*~oaCqܡ5Q>Fqɮ'1 0s]Ag/HMC UT,F[Hehm1i0ҩ"Gi.i@Ƞ R*̖oHKT@19:#äϮ?YN-gaƋr8p4Oԇ{C7ο=G""/)XB\C'/09'N P _y9 |gtMS 450uP 4m!>Q/7 xt-33M1MlrC|a=0`Fupn*Ma*>x޽fB)#|daz+kquc/\gZS|aViVσi9qZѹAqŞn]a{G<*.xO6$¯P dnˉn׹i 󼗏O΄ M;SFL%p>1ZcfX!C!Qa,dխz_Q=k v?[Y:¸i)vKFq,sϱ>Xх@:O\務~~=Gٰyin51,x1MD߽-~l[VɁkM=r..qiI+|L.]]=h4718wh2l6h2ײٶX4̲ȘOGVڜtLH4\=O0LEceIәd1}V̮KghJ:,{.)a$/͏W*y>{[ g׏Nruvپ#gJ (ȟ<3>eT8B'.[LM6`î1N#7iˬX!MG8'BOb8~JuIe^Pk4ڗ\β1`|gf23yd3x na^d_O.El$3F\]}rfb2Ou=_뺌f8SϮgt4KT"Q[S͵WfiלyGOؔju 6# Ah:osaHTXXch6'\ʀetY$Hz-WiHlׇGf±1HdA8PeNW!Zęqkrr@4lQo)&Jt4<8JQ6lD (!tk5ö+,M WpÄeZc`̀g0 Tk_j55|Q'p9Q ̮3IB_~TE,e#J:g":b/~ݳˌOxa2Ic2L:=DYbG'Q]Gm2rn츌fǩN]murx^J) B\y0[w즧8gvx<0 ļNPMLC!@"βL q0M4>q3 ~kMk[ B!.z@x Д"0 [gIfB!$!/%4JB!^)E B!"B!"B!@B!@B!@B!@B!BB!BB!B% q}BimW!@o۶9?O>KLm3kf']u955UB!"K&;m;زmipM9=IV-_ʲ% Hh[Fe)>&8] >uORc,c+P&^8RT*8dF:|T!B'Oq}r/˗N0 ՗k oƒ>NwOy ͍ o\.8"l+Wh@ԡ%lU yz"C4EJ0^as=ʻh 8<:\۬+lܛc$+̍kR !."ezyd.'YuuL8Է~Lg[~|eiV0'*p#W~'çxɝ<9L }FX=Gz8rpm"-9 ٷ8cNŋQtr;='zY_TSeb&}y o~n}y{;eu46ԽƑ|쒊%f]z{}c9ѷeO=6ξÑq>vw3>1ec1π2˸S:рB3:20qþ9 mߧ8^`O';R o~878'2i1 RT f]Q "m CSBsxap橧3χ8Ԅ8e(PP99jS5X|7óu*>b<̨1gxnf Ȥn(sxcb'ZdrpB\l|S(^$FTRUTU5G]c5`L:ST\Xtuh+sǷd{2Cl߱1?@2l|zGu֯;p@vw `֦.t qK&456XϺ [xv&\w%˖,3MiQ޷"iaI:愹eI],sb@牝%Y)V/RoyVv ,hp+۞s&_d^ ~ ͵T%ܸ8ei7ϗ+|J.x)"gZ!K|ݯ!v}AXu}#]C&fl}.Aoq[~|]4aisŮ",caf=tA;3q|lF&JӘ7VhL#?P;\9;{T$n ؾee (scTV 5|X6Zᡒ¬ר d7[BD*.) V~m8f-KZJauϭcko\>/ҀlܰMGs _=)T)~mA̅\#8ͽtP/MMgUm>z wlO03qs sC |o32-W&(81fMC[2n!.pP_GG[ {dvjk_=@4E8lPe(LQ0u͆~y1+].{#6Y A ]H5[4Th KDOűyj}j}<&<@ҘC&HB1D"Jq#:m1Y 1?3D\T\]   +{g'm\e`#\o*856öbuJGSp Q 9Y.wJ$s&_ +/BA,#S|:w$i)KyG}ur!.Q]vrƻy 6H- /%6=#:$?| z殺e<ʃ;ChylkXq-, l>E3SG2%Aq O&xTwq+Q.w4av -\û.K]LB!.@J)ʕ R?꣔BiRhJC)ye*ݐPseUݥajLJ35,ҔGS%UKL0}7k+υ[!]mR0Zri1\rx M>|ʮ+,C ҩd't||)RfQT[-INmcƠr9>bDL*)7o?P`;[2>Wxsp=O&>kl|ٟzнe4wv C϶F.?z!nI|V-c|r[*"GacT<")فEqѨrd*Ә֜Okm}X*bIҙ(C"i.K&ONak瓗i<.O(!8+cUz1UVܵSwrò8[;;)D1Yul+[Xڠ]f"\akF -<3gcN)@a8ώ.<{K RFv٨@ֱ2:?^X=Y;H0a,5hJ{GyvQsi9@4Ek< _U9If*6ɩ#dE5/ϩC Y6\-]{c1GWWU hh|)$pKw]ga{eʝ>ҌF% ^6! #Mץ0wg2p&nX-Ƃ&ĈX!qv]@|[쉒NhM|VW P0di2F=e5g4q\k:}Ij#5aμ>{A9YH̥7IVc8￲#hIDAT], 1V$X8'ΜTOɏr鹍\0 -AeqO%m.MM.Ր YdU)qO7Nc蟕deo'`M_^d_J@$%RؤϘe+gGh >ٶgI/A3pD0g~\)ʂ12eG}qZ\QDJ-8mAa/QYp%,&9o?#S KŴ]<{12UoX--0Z)dоt g.%l% }WpnoǤicɱh~-SÌ')Tt4B۟`D-/ ;7vZ*Tiu'M>oX,N?h?ɏ(%Z"av[!1zKTFKgGK-e,^8kV1x͂%r 2>g`>*13N_o몲DDDDDD~>aУyl)8MYͦj2Q={\x׮gv7<|?3V8zRDDD@D ! ,Mgg۶dSrpr]NXx!ƘW# ,^` 8xĜ>uZ8!YXQp6D 3U *""r2tTMV38tl6K{H$MLVF=ȻE~iU/y?딃*dۆ>I}=61s|oǦ a}E  f|z@D* ;v@o,:ڻF"4d2y>1 6g'}~}\ JPc]z!>:G{y^W*qv{ޑ=b51ܼ91fhMr*ۘ#Ϩi%̵W]37q׽!cf[ uMqfH;8$ `{!u s?'AW$`5FL]X+ ;12 qsHUTq*[yLX, ZCjhlK%ↁ"kxu3zW#gQ[c"Dy <$krvlI9݉EN<kuBPy+:÷% |anz:U)2-Gٶe|`onԯU?ːL>5K_!umwߖ'HpŹ)Zm0bmg\~Ns[ Z(1Q9=GFH&z)a~ ?m]㴤"yq(_gD1$b 3vF}=%Åt .26XEpiW@KwN 18ʹC[K.eȡ&q!~q0`_~XRw fa0R= 2g*S$9V-I0/1jJ2?VhD2k""""r:j<&~r=5.B"aîYB!%0Ϗv%$ՐzֵT&|MO+xӽk@!xb1[jpVKYT,!jH?"d\r5$JT)$3XLh֧ PC:]n+; RFhN,%]r6d̛>S3># C*5 iU=Ҵ`ɥ-cZ"""'N 1xOVc^V,_Eo?aGZ^O~Oly+<KbV3ybn.=\gg/3%ByWGyboo ?c,K|'Wٴȶt+R43XZ )-&zzwp*[xP4uу5|cCwf2 c *,Nз:р/Tz!eUS'&ˋJ5`)~E94\cO586emZf VIR\4 )CTW^yݺ/vq1+WA@69ɕ VH%tYkٻcǮuKO} ,?{ !#UZ㉁*xН2+aVwXȆ5WǶeOW5 O 9w8gM$gGCbq.ss15@]5%Yғy|g^p/[/u韗i;kqE(^)7Eb_0T5ҩ)Vؓ|8s7S,1`g?0:Zފ\Gb1U(њkz2tha'w'kYf%_N6mJhCV,]BkkޔU[&o-CnƷ{'ٚJsӴ/2?xDjI#W͏V_;I[Obڏ֭chhcƀ1tuvف\p9Eh-gfTQ?D+/iwA3};^y8.KVdQ9I "E79=_4Wwޫ\Vn`qiz_2qjV=(847PE +""""""""""" """""" """""r t7bmZGDDDfh/ "2zcd,+Ps7@,!"""3ɂ18""""3r, BQQ4 )T*36>| !%׌()B~l==q}dt:8tu.f~\Uțn ٲm|`u\y%46d༳}S[~̶TY"""S6XrM}a}\~Ʌv$qbU ص6Vp 4gO:zW>{"$N薊<7kfh6`!Kqq3ܰ4FBW""7t\3 eݻZ3O'-vō|$686Ug"C\,ֆUZ_'Fx n~+FqVmyQțTyU+d$mV1 eP} >8]c=B1df ue\RNT9KkR.Csʅ Bl%@5`R 7J9`b $. Ǽ2 XE B iƄ㓖R8BO%]~ghc({Xܥ-i/Z)v$ͮ( ؛3Қt0PXH]SQc)+92/  XE qhH\?`l CkCϞ[;\'^QSM[kZ6=z;{1Cc%~xIuGF 26V[1aH rkC>7h6ͫ3[n&q~!xg4B44Ł^̥+!ǢR[~ݖSk/.ϲ>~ .1c}sѶA!?o\Ěƀg5"UXūyzcσDpS/#݆9@|6 #Zvls5Y §&7ՐtGO_[;Ǝ(c- Wdշ4>;vk Mh1ァ`r-ȿ^{n]%ω15Z&1ƅv%15w{" 9g_JWEV sk$|ϋܩ"_^wU r}ow(_e5|g{F2Xȁ)U.>?nKS:EKA}}%ά!tY}f+H7sbX /4'R:zW'Tҡ\Zh䫟{)4'+|G:}ơcQ R-ǪLRvt `nToQSB8di * -9x^FO[{vW2 y,]HsD,dɚ;}'^g14t9طċY.1f3AokzB!yQPBKeQWXտ1w[r87}ؐc0Yg8B[hb9$u]Mɾ1th Bcӽ=S| )'apP1%c򇅠2xՀzHxa$|$-5 }EDG`j:O={wy Iynas[_/|NXfbk' E_gp+8q-ђr(kc`]χㅓT-Jo0PcD{Y<79Ҝd68nz!CK?%h,ZTk<4bXџbMW (Mq#|csr{ yc̎* 22^{}fiuBƫ?'JE-""o=9A@ZcێE2gp!2K|bg{p踰|!7ww wC3S}kS<2TOo:DG*•QbC627~dU3OF|-ύLj!DcOЂ{_z|l棫GB|"x/lckR̶1p(dl2o^\ܥgVpϟ?7c^vŘ(3 NcaV E>#˺1[C b1Ί\ u 6Phd2;퇸}ňMOwv:g+R5bKZity 2_ڍȫ1t'בX{LJ暘o.J~|]8!*^dzGge-[ĢhN7o{=1!1s4J]}j+Z|z[=?`lbSnX,Im700uS8\ty?"XxpMb$#nD_H:9;wY 8xH}5\ޢ!""oM " c }sv5Bk?l6˻~*g\z7_bvccuOMuo ,Ի "" "rF#,Y%2NAXU"""'D`Ϫ DDD5Z g[ADVDDDDfbC L "b 1=O!"""3jĢߐm_2uŢT*5_ETB0Tj5Rx@D "L:E*8mg㸧s76 y,U(((((((((((((((((((ț|m>IENDB`muon-v0.4.0/subprojects/meson-docs/docs/markdown/images/meson_mac1.png0000755000175000017500000017134114737503617025047 0ustar buildbuildPNG  IHDR8= zTXtRaw profile type exifxڭi9s 8\ߛCJUm/#*&W, ?_H X+GW%߭_3qUauA{k2n}'D+E}e$.=Q?7r=zw|mJtT4>Z~Xj0W_[?·ַiƻ~c?{C7~raQ_;snFX#1|LCljVyo{ޝw#.\Yn^%$˖!Ws]bN'ה򶦖zZ~LnmrYyzK+ok&;毼ýn[7&5p7pܷc"T`y85,Wlg_Ƃ`=&bfD@T`dž;ORJl2e՚|mƘ<}SI5y3؄# eY9r#FђK)Xi2\Kժ0lŪ56JZknHa`AALSgei>"|V^eeN[70vH8 ɧzϸ՛om鵷WkO>>c) 7gI=>=% [c0IʧO-S~Ks]\uwWM}v3y3Yg=k\!#bZ:duNsMt۽n?;&{`X~Lo>V;;Ҍg29+>ծݛ3x;cs-\h‹ΰ3n.H>F'rϙ<\wJ˒t9#gc. akVRIuL Xs( k]Jo\~Bm1K!}7>Ji 7+ك6{zJs8K)"" uޙԵg>"}:p,c]?YH2=5θqP$抄w8F&"A {εFb-T,;uwgKf%,c E0:s5VU.6_$ԒѳqMZg_B|g&{y*`@d{'<$j[hj>>A8CzqHο7Սr5}QH./^i8M @~xexS@0@ȭu d6EP=}QƅVͩX2掓3zW?L3eZ_'qƆ[*ĞjMe? ƜT\Q>蹽2YX.J54$-p1jۜ݅0G"7w3H 2 Xq7t{s?~g#}&LWLE֤1` s%`·^ɣC;q*#7:{N՜I82KOqڕV] p>J6](Jma#h]ӮMcˮ)ZL-I_CV,seRfGtcA{ g=lNf"dPVŬ}a"2WTkiY(X%,W?Ɔ2P-L_#wбٜ7Q64dzձQ *L=#7vtG_{AHzQ8Y`^zKƺ[8j+51=K&ls.q uUg>PǩmQ%ג=TӫtMs>.D}>m7xi On*u-28`,!Ya@.z*gI(Fಱ;2y=dq)r2rS$6ξ H6D, Ј}?A|̡x&*>-wß n~)rjJnVTZm8"*q  ֩\8C(c[[d@(8v.R;(,<^f" qVu6|8~,%N "z5x@&ὶJRPRf1ﯾq ^WFRr(Ř0_ 1s]N9OS\W(()S]H8dBg%5 GvFvp;o"\~7sb2V>X3C5+>xENB!BGC B!BH@!B!B!B!$B!B! !B!BH@!B!B!B!$B!B! !B!BB!B!LXr,B!BB!B!$ B!BI!B!BB!B!B!B!$ B!BI!B!BB!B!B!B! !B!BH@!B!B!B!$B!B! !B!BH@!B!B!B!$B!BI!B!BB!B!B!B!$ B!BI!B!L(r,B!BB!B!z+ ¦)8ʗׁeAذu E`)cB!B!$>pp juND蕠1"N^ r}x\|GݰXvb]\e+ ph+G#55yYoODQaUQ<2d\B!B! /.fvOۛ7M'hV7 Y+XZ_}[QW7%v0-8Y๏Ys:ِe.oq^>3^)\δ|X ͮ0') !B!_@}KU['S[.lq&`RxHsulz>snn3 Ѯ% ϵ7W>PPQ&o59497ͭ* {L0XV7씀B!BeH#&W࿿Ck^&D;:;[ycC{[MVlN/<̤ۗnP32dvS~׿t ؛tX?ҧ[74D; !VnbVN- .ՇX j^oZR_@!B!ė"p[EL ES绒yxz*Ύ}R fDϪdQY[w6-ihjC6H4rQIJVGsT/uڞxz^?xHoUM6hղ:dQyjjˊl)B! OƎ> q0npܘw4Sق`ߠ#08ӁMkhsq /pnuv*uMvEL^^Y `Y-[d:~q}<}/dZA/B!K8Y|0ZnFLߟgan :~VteLİ:fa|/ zt'8Q(0(AOF.ۙ /$\B!B!,> ci֮~MxV&0LG]M *k'1) QVՠ-d'Ɇ/|n 6>77SX{4]o{ckl`*@S_ǥQS !B!1 sN7.KMtآ!`2 aZ6]#~NU{9fML^ƏLeX6"9'{B!B0-{{OB\h$z>Ӣ1p82ŢZ=!B!/64/H@Q!lpMmр_ɠ N q &1A0hp-lm08fS{mJqqnoޚN[Vu5zU'.[''wI$!B! ˂%wU/|IG:3ݩ5Q3\ʈs+>*{,-STHs(T-JCͺ/V6r$>EvO/%B!B|iNBb([ݢ,̎vgz%۹?-ܬT^.^])&u)/ h7xxF w݄SU!0gg+L^( RƯ݇\r<B!B*8ʦ%! R >gϺ;*V,-ו2]pO Μk@{W1ڣ+9N~T6NK6'#|/S&woVNg޹0j=_E!B!_} \G{:@UG եu|<. Kj!A1ct\-&CE]3 q*^J_`RI,`?5MB!BHv1>_!rA? (-1 =ՁֳpӴnW8(佘(~Z;qk?Ϋ.k}Cx٤9D B!sf8!CMUXW!LLeڮŞz{0!'?}ŊN]\W =֋|NG]Ue B!BE{$lܒ_ü|`p+[; v_ZNmUFXyOU ∭kXߋI: -W_QPxdB!B%>^>c7&y{(>Voyyi /ԷDG՜ E7jBF% fB!B!H??k0tr:>f%;(9JqAEGɊWIK)C&glN%+-5,R#&l;~.R/갟 [´T!^^R͋[7&y|Rl˩T`Kyt{i(/Á۩aSop\;?['Cуܑ< k7s+XdJN= bfu½ p)B!sc"'1 !WVԳ|4\Uϴ8/W@B!B|2\ >) bX,<^Udwo׏JROS.vK+ǥHj¡v]g=˳duS9) YT->fY6i<6-nL4 4"I!B!_ jji#>Kbs]Eʽl-jFoPj ӒIMt]apcK3}xݴ8Wbv rQ-b)טkar-NUY3A74L4E!٭0"Ƙ<MH$3%qaYH+Vաߞ!q u5ՅQUTu)B!ˑT0b (8*nzՖoĮ)8Wo&I$bbYul ^֩UG u#&iP8a*WB!BQ?׊\vª>W?~ןt+ x]*?bY"B!B !B!B!B!$B!B! !B!BH@!B!B!B!$B!B! !B!BH@!B!B!B!$ B!BI!B!BB!B!B!B!$ B!BI!B!; Pa躎eYhfCUUE3!B!B9_T c$hbݥTUpp8$ B!B|e B⏚h<I$d9bIH$FӴ+.; er>5MEQ./ipY 4,^p#UE~mBEBB`S``,֧ ߏW _xeϽ:~sƦ&_1nv>X1ko?_&{gPze+VBaVY3gݟp8g6:k& 2~>YACKphjr Zn c_Pa]Q ~iiyeQ%grQ=W >= ,_~~GY\I)׮'bB!{D"BP]E4M^Ciii0M"zpd:<뮝5 dzƌM3iOtѡTu+x*L?PDKk+ND"Z=wd@Nנa"[1l6[.s0;oGn*/?%11 -`h\L ՜fRc%~en%&ܘ=Rq bV}^5Al*8U]iT%l 'ENAm)yϼF`dm]=dQYyIv;̛gz׿ik>,b4Mb||& k~4McA_6VVV|]3݆B!$xo#}kB(Y^5ǂfX8y^1M8L0tTUEUU0pػtu}nbwce#Vi:ޣ:z,0MLÈ-+t=w81-f؅VmEQD"ѯ0 ÈX.9Ԗe:t$_xfu{q[74MtfӺOibJpnY)+d䉱Mxwvu/4NUU[iƴQ2 y _\{ eu&B8ݝߎӆG.{>AfycׇiYZ2L;òzҀkns+skz<$ƆMrYz(RQo߮<Oޙ)_nSWL9)x^y}轆KED.HDn{݅sݱoB!d H$B^?GOLңovg=z;HaV^>L2ZK6{ L gزu'%e$Q0v$'ZG>\֛o %%S4GRČi0b?ɶ)-+'!>1#J<:s ؼuUUU̘> EQ(>rEijjf`N?&OOJrrخ=hkkrq.ӧMEuCCcÇ bN'iri=FYe5yQ0v i)(?`_ yGٸx9[ƒ))卷gMIcc#davZ[ZSXěs؄iZܽfKr4UeOa/1s%{ y뽅,de5^šGx~a=v,]~?YI8fyN23(*>s/Ϣ|Y7>/"=C\=v[Zα`re!^z}Jp]lܲ_Ee+_ݦkR;?E &`S`{I`ȤiS:NJK2D4jleKeOZC-<Ώ(gN6~V9窢Ȓ/XuoR_;0ao}P˲m X7GΒF~v%#G[ɑ IDATUe<؎ۣu{&߮hM@]h!dA(b+yaM#9J Uɾm]:X?? cZx卹aYa znمE,Y˲Sx?/>o;[wpY~k=qD6ns/Nkkid ޛ8άgmA.?  cYO3hyg~?iqv^.W0MO8[;!}|x[ֱxjpe{~<7ߢ˲WxWfͥ0Xl /&M̈́#-YμKuFޘRkIJ  I?{O8aGD$v -g{ G"C!@iieeGx= `{ YrmMN:RЈnYoú[:r^MIns׮Ȝiy]0ioofbFneU*{ rˍ>';?(^ Εb4,[f}L Xz=O}nz.&--xٸ|CMm?yNwC=pƍqԩ(;뮝LN~a!nN:Sg}Njdhϼ8g:NZ7ϳt*{.}M$ p8T^wNLrnjұk KD,f_l`fn((na{NS%_n(/E(lҢ*P%OѨmZk s+fMq>_&x L*cQ?w]kV+&pZ6ǥ-g$=ll'oI#+NKc~<3`wlR,:֛gp)n:J EK)=GAyE%lٺ;nk"췿IzZϜ~&6t׿c'Nr Qok rr5Ikk+Crm`lL4.Kȴ,<í7͈w/\DI hni4nY{t2i)~ijnEaŌ6'{A2~o>5D":Gd1OVtZ ƌԣfӸ8vwvbIݱ*}{gҕKJt؟{ M:u{a盏? \TUeuUӟ]V^[a46l²Uvdft=zeF(׿{C_0IB|<؄i+={`}k5bXB)\Xգ1&?o N Xf=MXIJ;s1-VKz=iov{.WÉ%>wRraaQVVG%]ZMDbbBa8o gJBTTUSS߀(ZFKk'Ϝ# wCFF:ْx=n8J4p8}\Ϟ=W(/+1ں o^@Q(:TLD #02(o d28Ay$''a&Μas14M4ML\i~ں:搞-ZLjaC^v>zp^үoovps i [xw4n,e{!q|Z|^S&ON>K͆fػCǩ3gٹkiRr@ :ShrΕL5&5%RWWO>m13Ơ\N>1 :ZZ =J~skd庎`#Leu-ñgf3tp.eY'|2ls2]tQ=;N5E\}E>n~2#ZPf~n[ױiQR,`wk̓0MPPy{0$ Edwb[gI8~NlBv^~\*i1]'z9ݦHf9HFS<ԆkU% thL u5K֥衢(EuWP̽ÇDaLzeepqnqF+)4mnn0tN`a҂aFk[8gۮ} zo%)1MSchJk[23(A Goh1#HIN@QĂExk=r}ΰ^r|E4M45rӌiGhƺ uzvݑ8nsaXvFfcQs1t [8:%w8ۛ;21ly-xAVFraGQSYS\.'c ~H?@ye5rɓ9y*:t g߁ü9=f@NF nc_AwV7 ;SƄB/[튵N46M(ʶon!vhRUSG <Bu]=O`hEaێ]`11Nf)JcTUU>$ĄriD[thKn[npԙCDi&{ 0wއyINJql6vcێnyӧM0LGOf&110#Qex9R;=z$?|l۹OV`n1TUװ{岭r9;L&%]ܟP(̜wߧ12SI1Vc̨alں{pLIoؽVo 3='.F{{;9gKH#!>Z,P5Pu*BcY/n+f=n7^G{n:]SS9?>no%6Q5C23A5xy*vk1> 9IB $yXK@Kź.\S=Bt 5eScK?GGpӴǩϏe`3K1og N>Aq\-H~]+ Z*|؜۷w$%&bבfeP~.[wãXwƵS'uYo(B ΗUƦ2(zܮ&EakIOKa=,^`0ĔIx辻?Η4\ܻ@0 ;bIi08u$,Ç`YfEQ:x_im iݷs5sg`v#b%̌n2*jb7cYuu<C!RSR ^Lt_3uI lߵOV2qh}C!Lz53f0)(B|6#Um.Gʧw$cF1nZxYn'zxvh^yQ]SG(t`&O>꺎ql =euyy6tP56r&];]ײk2y+.?-5=iii%11!:zXog<ģ,d95Fwvf`P^n,@71=Ws/#_U]á#S3j0Lbλp1Ea¸1lٱN3t t`uT ƒ~Ζv ϡCӁ9WIѝ7G تx85j>FxGU*C.]24JC =gi pA{d q> bZA"DnZ-eb22殮 χSCbyttuOMIaS]]= #7ߟ\l-igDlTVV%ɸ1LW@Kk+s}71y8DžKϋb1|i45q{TB홡C1b0 Kdmvˍi4ΗUӿ)>|vq\}L @0OjJeuqi:cF1 z}9Xqc2oF^B!xlPֱ|n&2ұi6n23b ?A!_#Jr!6!'`δ:=^xU)= (3(w LfNC8a74zݦn ) Ȕx_D^l7Ox_?ͦoq6B&;53vX³/pHLL )n0pdؑ,_8III*II-*.VΕ[*֕_!99;o#f*>_t#xzee2e8VL||ٽzq56w3rЫɆ~@k[y8Xx={s)o>S?+HqΖi[5w$&&ylL8uqϼ):ڍ<̓=!B&TUYSfW>KKEv&w܊o})>z}{N|nszJ O]C%ؽ}۩r(b"`p An'=% {G fns=w ):|ǢU'pmt{|>oӮB}C,_ӱ_ G kĂ i|sTdq70xm;FJ>l].ft= -f*>/_y^n#G {`ulٱ;Z3 w8MSW0ҲroƆ-;H1*>e> :#Np2e(ARbZCbBv΍Olh#eh@aq6ze]_<=,^#Nyt֬ߌxs&mdKCc%]r݌/Ţe:i|,PeQ^pe;23s ߼;vc!TVV&_@e݋_!@x{|'@tɯ=tÆ q2ۛ Z;cg2c}0hD?8cZVg}94_ZNJə8l MO DpkGǣ*ఫdki}N3 >00Q)>b2AU$Eb1!I/vH/ndFy?܋NOb֚yڥD['wT-gg.H`]M4_LwML$(%+6"tQ6MeaxΙϽ3}=wo3uU|+9I<';4՚Ea4)-)pQLmۜz7v}|> @Mm=e8c3|]XIaa{mS֩v]~ N:X$>\;h3N͸f⃓=c[msgF6%Efk@]R\t*iqg>Ï> A8༳N[Em1o=`[E9t[;ykVÏ1SVAIqK,ӤSIq& C;h}n.,"VܳNjM~_fA{i<܋}zk (_vy3!e 8봓ZٌM~:@LlݸIm"V0/⎻ò, c\pY-a45ǽ8 c/Lub&D$5kÍ  _Q圳O'vOvS4--B 㴟lLu0۶dhnn![g5  lA뵺Nk'(**$o]:ikp>'H0F(׶L6hP!NL($ylDZmH8L8$S)FD¡y[ZHa6N]6y32 `@O:MmLX~f)ɒL%fs ۾nt|%`0H6%6;$mm~6忏=ɒqu&te*%NAA` ͡yi}WWF IDAT1d[ hhldko2j0:u²,,\ͷ_~sJۆ0o<4E1^I>0Da͆-ie :NvzH6GW lp}ׅx*O}ܡ8l |ڟ{$SHhS0˻vA* uq=P"xd.KRi4p[?g^fN'CAA@0[oAL&3(,R*˲ڿKec=2,p˲fV` xd26۶[es9\٢=Lhjn& >xfi[oX ڿ,x\>OQa!bfoQ:!HtX7'McSi(@ """?ZgRN~)v]ف7(j# uw=K/:y _pUdw[rS^wsgqA?[Zۨ@^=?QÇpɅ<K.#j=ؐ_}:^~i lqƪYߡ#SPe*-~2;dgDT, Q٭#oqY;ͥp(DN1?Qy|`;aPhC7l-ey۝vW.zw)3J'!˲ۯuXHhcW(s7m>I0 d@""""""".(u]\%˵xruEDDDDDD`#41Ms.oZ|Q """"""" DDDDDDDD("""""""@DDDDDDD"""""""@DDDDDDDQ """"""" DDDDDDDD(Q """"""" DDDDDDDD("""""""+C"""""""@DDDDDDDbޠyRi,B r9f~lN>P0in~JqP(iQÏ" ӻgs3Xe\5"K>gKʴױmuwQqoJ{syekI+(О;*HrӫG%' />0ZBЧL<,0 *vj} Ly9F7g_dؾC(TmkoŋLkZS :@Ss3k֮SN$+>^EK<]B*u{e7I$n߮ۇ]ۧ7lO߮a}~3O;@DDDDDDv>a}>7P^VX_/ؖAأ ѫgwfRS[Nн[Le=`?rLM.Z3w\.O9iܱXžCs'|dsy;0)|(ҹסMuIRĢEE|;ADDDDDDhj{q "Ƣ_xLP8l68I h<ɰxbbQ~|))."bVtmޔk8C.h0 t@DDDDDDDL@DDDDDDD("""""""@DDDDDDDZ|Q """"""" DDDDDDDD("""""""@DDDDDDD"""""""@DDDDDDDQ """"""" DDDDDDDD(Q """""""_2P>Լ{[y؎GWؾ۱vo- V۾7|W}w|G^A5S?{O~Ush6-Jc4 E*"""""""i|Pe'&_{DDDDDDDd9DDDDDDDJZ|Q """"""" DDDDDDDD("""""""@DDDDDDD"""""""@DDDDDDDYrd*i #"""""""imYŢ#"""""""{  """"""@DDDDDDDQ """"""" DDDDDDDdj!""""""DDDDDDDD("""""""@DDDDDDDQ """"""" DDDDDDDQ """"""" DDDDDDDdwֆyjjjtTJ$ރ2w<\eac۶L٩/]'K/yӟoྉwϘEL`x8xr9""""""qfϞMM]=a SHR[,iiO$psLhnn&ny$ d2^'?{sJڷyLUy:2EDDDDDd+ǚ'I^:0jMU @^M7R٭n>g7<#ӧwoŔ_O >f̨?,(O0M  ߯v*MD#Qw׿0c+y`҃q3=r?O,3fOpir3QWWO4ݲ6K ,`)+Vҏ? DDDDDDd/Lq'dz:---t*-`jYp~ѣFҥs9KLgڵ5Çqء8h쁼2u߸Z5CpQG50 /7L$fs8.al2Z Pzί~|iۗKۗd@L&/f~|{178q ::EDDDDDd~2 ;wŀ)).ޣW?29P][K/O>G˗H֕Q#G9`\---3l.ޚ5'LN;Mm8y>Zŋߧkr0>! & e,Y!`+&\ m>]ͦiر2bJp̝7'ssYg E~…xg6}JK:2EDDDDDd˛^cs‚XuqI6vyyRm :8\l&K8¶!뺤i,pϷunsH҄BA|>g?)L>HEDDDDDDS%Q """"""" DDDDDDDD("""""""@DDDDDDD"""""""@DDDDDDDQ """"""" DDDDDDDD(Q """""""_Rx-6e0ޛۮ檹jUWxQUUs\5W?WۍϷW>W3K:%J+iomjv檹ڭx񢚫ݪjm7 O89]ryLH8gaȻ7Uhj檹ڮj檹jǴi;^D8 V0Xwjw(C_q"""""""_E6H(H}CN)N(  /""""""Eۢd:C.3qD¨/""""""BP0@2C0 LSwٙBln6Nr""""""";i8g.a섋5^_DDDDDDdO+w#ވoͦ ʘ#D""""""";<H$u9󨩭Gg% ߛǟIXVk+ɲ`b}Y74rġr|;Y-w8p`A!#[A?e/);+yO&sy,GQG,eД% g9p@A -I~X梛Ws`r=WsK ?^IuM-#k's\ ,X`0>+(}=cCCl2,kd2ŢDQhjjg`@ ' m%| Mt-/D֬[gGJ0L gӋN)^m_[U6  * ms:a[A8EiԦ)Gqi LbLݕXdZ7jf xrN[_qܹy<|^='vslS"5UܟgEh4 JC&Af*nm~O="'p {#xǘ9>p W]~1o5I}ʮ'L~i٣0XQQѵC80ݹ~\vx<}%^>\cCC#J5_Kxg_{\uU5lS^izDS^f-vF*z򛤳.ٜK4da[ټG"f:GKs=Aky#v&hwSHFZ9}/I}y&okHg\A mwZu9?2YWTQ ޷מfM\4(?lq6s.Dž^EIN?Ƭ-Y.WLy?EGq%ؖAU}f <PSbum_>VW-kUkN4`İc,#,8`(8`y x`'4F öm‘0={TR]SvRz˘á 3ߚG~kY긼g |B!J >;-ݤR.<&?. GSK j8ќ28:u*eKnv=lDDDDDd8?iJ||ݿ:H$I@ pᇶgE|ޅ>y,X825Fk;,_uUsw;E=_gނEuCMI8 )`zXx75997N2?\كౙ4*e,ݢ&WЉ.%>yBl%3y}Q /NsZo?7_݃Pu\h5 6]92[o59R2I$.~`dCSe%~Q9u'Cޅ??]~]}4&\~e׻S;NwᔛVis;E׷p;[z$x`ECS wHנAbVesqÄq嘦AXBϵsz)'\ʻ%85Tk{ڔ?gmUbr.Nt* pq9PP)'{-Tj˓aw7&7Ag$zTV0rİ-&ܨa曳3j$MM,h9W\z5Oӯ[4_ZدGnU89e/sBgϬSxa؀*07&wG0谎gq~9Z9-;vqޝ;^={pzR=.ar9l|h{IH$敗RTTmuwt>^c=0 2YreeO$]~>\mց3H2^hq e&9^ AN~)7&E}iN:5~]pʁE34ͱOd`LdNgÓ㮉ds9v.c%hI&0Bҡl{PWʊrޛ.ã}zt<]\\D8O>^=SP<>_+  6ѽ3NG(7ӻC c̨yg Cr\|a]zyEޝ>=+wA^={^>J&L.`Sнi], 03E(N08mtyw ;S^7xbnσޅ&>+39,FM ~> Z_kVߎ+ʰMolq'>e>&ӹGA"uO6- :؜~'˄+}D7H>_\Ѕ;aI\FU2zXU>z0 """""{XOx{y#qq=M,x!@,d<0-,,خ&kɓκlA}ʺD<\|,׃Ґp0mژʺf3:1in9¶8GSʡ!P(X5=y^>9v2Y]zzm˴Khj~A_j74ҵt Z;g.Uy`1~ޟ5~JKZ!""""""";SV=""""""" *Q """""""U """"""@DDDDDDD|z뺟c ֽ/v|wݴ-sW5q_檹j滻;5T6vr'{{iڥ6Bus+]s/>j-Vz_p;;5lJoW޽\V2pG5qڭxQUs\,S W}_!>#"""""9yQꉈο{i}Lcyavw = g=Lv&e?϶FSskl+P M-t.+\I<=b(gze0) r<>^cO>3b_::~eb׃عcvCgv5߅aT70ޜ5L6{5e:,Mx"AyuL c\ dI,Z!孷!Jqѻg3obGߥf{[o沋Wg0uƛzT_gN;-?su C!z%[8#).ڔx8KAkd2˓,'l e-p6_auUe3$Me3GL)_歽1& ԸfZ1-sլeL[wu``/ax/1c^2,ӡp9,\ xHVT5%e>3 SAS(5 & s{[Ml+2q9UBiY1ǡ5@ys}ŸB'?+9 *LsfSĢ[Jubt"oo sT:=DDŽԋ$B!Ic*hi}Ҵ( Zl"8S((蚎4}4guq$Ptzvrp:zf>, 8o晌{ Ͻ8y A{{i'0e)k6x~H3tsѲ+jg;Rm1jcDSwTp!5a ):~eqDWy>\CtáO`8qט%Wc`O !Wl0]Pޛ=x1޶`vTzxp{椧_eEAG<*ؒ@U൵!o)b+[(pp4N[4h*آf4N@?"n(X)c`6;ll5QgrO' zۮ=t&1xf{?`w h in7-DLiiBH@! '';q;f gqԱŖ$';:1p`E[Iƍ_m!8_rAw&:`톍L04yE1};v*}llilno\NJNv6~L޵;y ndgLjSR?+6r]U+rc/EeKopi7'?C{A W?Qǣ LU=%HaY30 ZyqOKxŸ*5ݧyrq}KU9fnPT6t,U-q4[#ŧ2*~讹۩RSY``[GaËZI0Ӛ68{gf'8,]Ei/$E< &]S|FSߚ}=ʯڍcT19MSX}1QD6| !B!:EcQ4 MU4ppÎmJhJk[P(#R]SF(.wR0~ ~1=ʹoDuaAcSb\o(< ?FTӲx98:7]|^/p;Ͻ8믽wVzqϾ }J{vUU<oMnv&9QW݊۳p8uxѧ9lN'ˑrxϡ%;]㜱-(pr(rI>3FGxuE3[cfY7u-%ɊhА$ #)a^Czc$CO*.Ld q,;"Q=!ҠC?߲1XMjϭ1v EL| uyz&2T;ʙv _tiٝT,[/[W,n4:~pA]!ק1!:_WskTQ/LB!'I}C#? /7=ʉb(jr:eY76nt^ #Kp8HKM%O$Ldѷ',@E3> ul8e]ؼe;H#39mܽ~rCK<uKi̚ɴ)$L]Wim7y~E !\V=?eV J=5EB m IDATb kZB=~rQ,ᩨ L(QR8 %MTF-N$ūf0gU ۶SUl߁e%wFX5D PFM܂HĶyMK3oo#sͺ]쨈$v,F8j:ʚ)C雋qϲ6Voz6mnٕ!am$B!c* ǎb z)/g,\}Kq]<<lܼf<+,_*Kihjǟf},XٯϧGb<4MccY= d.k`,^6Ͻ8}J{zOz_}>I̋Yv]|>ݺ0~fU::"̺blj~䦑>~"},9jȍӋXo͸* 36Ճ[Ǻv:GO好qg̚YaI帹|]΍,0M絝Qƥj\sv {?j3\N̺)=\ԆL^.{4`&i0-x}W 8cT 50^EΊWUAK_{1F3/ȡ1m eٵ{/Ͼ 3l.<.b'%ZuKnr?p׹w+\[/'Rdžv5R3݋*s}RKyAK>; |l!b=s$L|ϝ,PZW#w9T~tY>~-KEXY`RwןMAVCfd)mglU#}xa_vzEn^_ĎzUQ٧1]S5M= ܝePl+;9}=*  3u?=7WVrq9T\Nܔd9Pqlr+]r|.Fsɐol]; s7 !Bi1_N.9+9Աbq\.'SU}{ӯO)X @?|qy\.Î;?}dO^㉈ֶ ZZCds"+Weii a&aZ݋ sѽQ&xNm&, |N#bm%ۡ+6D^eC[a=nrعㆍq9 ӦDUwuM Qe~|.aڨ hBEc T3?ǥ0m*74VƗ55v=Y8X)RN7G%$ B! I}S y"2x`{:y"cG+]|(|zE-*ӎy#]SH?ϱuǗ8r8ڡ)]NP>3FY>,i㎥!MKRwrߜU UB!B/hE(Bu|>3lc@NGM쨉 :Ls~uq$B!3ᘦbq 9OݎϭP3 ϚR B!P !B!$8yWB!BH@I!B!$2%B!BB|R B!"$$tB!B!٘m|D'IM'溿n[!TsJWsʿ9n#b<0LZ,8t0!B!ħfc|}] 8:ٙi22BmYB!BO0L[? )폵|&B!X[v&B! DB$$ B!K_!B9KqB!Bq">R B!B|H@!B!g0 ÐQB!B!ND]p2|>/SN@~^. !B!_eY1wVZG~n6*Yvӧ1("#%B!B|m Yd9o-ZKg$ ,^7|*= ,| 4MAU>)lWהB!BMeyS4-TU9qƇ=~cOrӄ`Jk[ni L ?qCx9Y7dz/Ρ)2 ;_eYTV7Yv#=J(*,qfî0s״a1Âd]v;Cᔲngr=aзsCwmJK<主<.aضB!BWTVQQQɠe|Dرcv"3#=S\T94M>{v-b˶D:" <vP\\H~^.;w*y'ؽqGcn^~uߚu'd̙mma~|]&\m7@Ҟ=t ~q6bXMXEJ7\;~aFfFں:Ξ145yW:Hs^3+455V*q,Ե&0mLihKaRhm7jJ h5Yhc6yR}aQ8yi;Qa =%پmCc HD]_CW&ܚƒ-?ZɽE{s7$\Ct]Sz٬yo7Ў?>/EQaƮjY](7͘,懌UY8Iv@,aQfnISMfN8b2qԄH̢)(9[D6): UQG%B!rY~#/:S&+s<-bmr㵔E"'e[(ׇa̜1_ws)@$k٣[g@{G+WaPԳ[ߞu%Ƹb񲷿 ]չor_9u("(+W0s5{g;]ði48od :b1'gpu7S4Ο*T7,Ha HɅٌ@Q`vn q5wv&Q]'XV bA'1s|:jX#R;EYlRTlN9Nn ]7oD!B!IJ2`s5ME5BvL0L(nEQ(,7}]י39Bvf:k7lSIOKG(܁yx(i8t]~&re Py,YXÆyX'h ̫5xoIa0wot__cTO7\ϯ51ux?T9-`rC5~Z˪ IӘuv^i=0cDKclǶGj.=5WV02N`ŀi[h[e%^UI!Br(xk|;5ϴ)QSS 0x@?23J'41F$3=}zuy\EU s^i446~6_ܳ Xq3wò!PWչop8u8r fN_N-DG^@nMѩh,(Ɗ.U tPR1)eyOGavyN1-|~XffZuw<:fd*jnkIpy̜Q}_5 hy: Δ4> rf,<Хpii]0O:Иj)(e>Xۼfvpw7s?ЬZGOT tXk`Z j[}v#mͦ8?{? v\I>.B!+p2yhEӈ$#=[ /e}̘:{NƍN rtjAQ׷7ٙ/ib6 @", j;x}:9qcND8q]i<zؽw?޽b|>TU徇gM=e8߼ J !_Έ)8tX"0[gqNwss#x{W,b„n~rir|Se?E°T˭䑗D(v'S5<|\J\@{[*ױmh`h<.؃l5-Q.ϧ(˅)&OH';A^b;[Lt]ڑ~n OGQø2P4}|ܲl\ymCG´l<.sKma:b&>56DEN#_.@R9dvП㦍S;r|Nk фod(OMcpO/vG MոB!B|I}S y@,c& Y/[aƴ 43)_<uǪYR'?2/$B!5yTMs "!B!B e@!B!+@B!B!$B!B! !B!BH@!B!/B!B|imƈ2*B!B! ."v&.^ጩ(!#$B!B|'xa޻9]{)[J[(GpdefTB!BH|e`esuлWO k1gݰi'0~h))_m&,, \].2 4';qal[#B!'5Iuys5MCǏg6 G;Jk[ni L ?qCx9Yzi,}{/֬͞]={͡>S75l߹L̀~onaŻٱky9 ПҞ=4$ .YF8FUUTUҿ_r?: HxNZ_I}S y g?Gcq.'n7dX_p(;Msk' |f_y[冷1G5P_ 摹u|q '{ms|dg?P˞8۫+*?xa\zFVfv_3ah*+kxa\ Gj0xع=< M-)4jzVZCY>|;wsda'm-;˲DIy?q˲hD^\ȂٿsϞA:;*nF^M-de;m[#ag:)QjPV!ӨmN*JAlNhk7x"J,nQ&/Á* vD1L"3w$Z% ݉CWm8#f a&FA,GWVh"ҜJo(oL`w\KCoM70Xn3/IA=/ӅmL^uy*-Wu(L+t*6쩍.U1zd;QUpɾ -N 2 ݁8mL'MmM v*ձIն ynڢ&Eq&uEUz##&Է$(rRmu쪍j7"7Y`a"9dR B!'TWWG}C#Ce- XF("H~ F ʁ*^~}{SЈi\IOKe`Y(.*첺|)Ù4q<( ---n` ;Sګ3ľa{5u^BqQ!xwL0_>.:::ؾc7mmmgӻWO\? _H$Ks^玻e)8cdB0s^wQ֯7ߚumƢeWˆaÚ^ZNSfRNK lj5)v)̚[gTGU7Hͣ㙙9& UQX?TOyaCK{9wBnW;xU1[eָ1=MSZap=1,J}*qʱkvⷧ3σ7gdn*%NY):>y.`[SEU!;UGS8znLܰ:S2yjQ1egynGÂ߾U[jVU'h5!Sy=ϩ cv4vÝzz*bJTƱNt]t'ٙ1m( 2`ǫx2AÏ/'ٰ۞fsk 3q9UTGՃKK19+KB!rhFUu >ͭm <ggeEQcB42| (qZZ[im ѫgw8r?Zi(D"Q<66Ͼ8sϜ1,w]ņM[y4mLG$ʲwakXRim 1tP]re#Opt*5b^tq-o}\.zA%ZW51MLnv}zvرsj=jdDgVcGc=*&Yʥ2T_=TwI E3tw-^m/q<6V2vpUQcլo442=PbT"qm&ō ~zNq~2lbT|6ضͪ R:=R46hnM*pul?%a=UG2Mc3fWn)oq^#(+|4U9f@UAUG c|RQ8 .h3(vr&XL yB R)ߞች1~n/iɲOgaX6 s״qv&pφiFj[M~8%^.[:^Qi=?v4@rQ@Mckذi u Xƀ}vf8 M6݊q8:e+V1b0LdŪuL0}¯q#O\CJ}˙p7-p}ǎnV~V\DUu-UU$qڄqכ?q7y9|+I?Ղe/ȥgV>nvZ ֺ/a[6{bW H. };bQO"E* 4eͶaKUˆ } h6*h3Ҹ&}Ro#Y:ƤZD-NjCOflx)v+BFgPHMO;4K$Lzء3yU"*-"ABWd\?/H:0LůtK ӝa9RGE}T@$ |Є.7l:2.Rtrt&ؖOOPaq5ysjj=Kl%S2R^lfJt.1쬉aِuh̀L[!B4M/XW\0 {+0;ضMio(gg{$^(IHBKRIz^+WQTJUB/$@Bʦn^f.NK_3gw gضM<fݱLu3z$SL&L3ۮC76fHka=|3#dr=y""|Jl|>88dYr<0g.~>"\%_7M_~0s8]ƶ۩ayRtJt~{/|^> 3J 3Ͽ̄㨬 ˲tb1$WaIs/y~{'TI8frܿEEyFlWP(i g~~vm4Tyy~e ꊽzʣ_;)㢴vya\ay8GQDy^佴ÅcC[ߚc[}mc&Oq˼6μDR0(opIjCӛyeN׀F,IWe$O__)24 [ٹqNػ!Um6FѰçc..Mͻ&L,&3Ώi i;M/tu~ܶ87~݄i@Kcd7Ot,{|W\Mwbo5ey)ˤ \S<4K~ ps먊yiF،a|Cq^nXaB{fy&ndz⼾0I$hNkck|erz薵ԇM٧ i[W\̢KXz-u5TƏib|o0g|V\Mue9\5Ə @qqo_q1s-`+b}b[ 9x<}=:ܾ8#0q CgԴH$̅wz:Ǝ)'Geerep._^S'3e%wH{w[K=} b0gQ67NUEn8]x9|{Uu<6j3ze z,E_aZ{܏a@os{Xޚ#oØ{O CO^i]7륯/ƨ+Q]^||a[,㷹La^;01R].O^NؿU~gxcN/.5 aVBd`ׅ3,X59v( .X`֢O-q` -øQF7HmHȽJy YYl {Ǩ* vyg]&zgb1U%>"""""۩P(`Y6?n]O=U^D![l&p]۶zluaן6]=T}oʦ<,zol4T8 7"O`.?f~knǽ{.d >Ђ$lq!w09 eg ߭;4ћf0r:z,W.YA6?c_/n!]wJij ("""""_\o}63~؇ߧ?5J3[_~p(ȑ̈x_`|ԇ_?ds9L%)uHgm:6E~Eo0"""""#}{;<A]O$7 MJ|zd*""""""@DDDDDDDTZ|Q """"""" DDDDDDDdgّ;sl6޴ȉ6_݁GOE=w\5WUtE5>/jlywzIDDDDDDDdq\w뱨,/ѝف ڇ@DDDDDDd(7KP """"""@DDDDDDD?N>͒Lp]w 20MH$]fsv׽| +a@ !>|T:9 輯2qtoaC9XR؎ͩ'@DDDDDDdg >UgfHC=5դiFlP8ĞS&xG108>QPp\R4MLC7C})xEqvDžx`")$2yb/܌җ( YBDDDDDd >-w t$)~t/pC 8ᘣ1MsǷߋf7 48 * xbv/{<5A}x=@MoَOu90bma{p oDDDDDD,l5fی)-)K{Μ 8#8.Y*Kiwd9k:;3r}g GOQQշSDDDDz- IDATD|vZZד/2y"^0x Svc \tl%i9t /a!EqCu"/i;t)zKX>2ե>|(hDM^^}K`/:dF+˹64F?uq<09rXDtQܛ,p}g^ &[gTsnEz:. ͥ 7-?Nլ$6 +Mf<׀r Ξj,d掵Z4Ȁ- -s%ͼe&1)wZK$h9͕[k62/7PQ7i{iIUFEI4  ?S +RD0GŲ @ʻ"Pv^S\2,_՜OOI)+q1Ux,=̚lj{`i<06mg9}Eb"q9~e[g撻[9jT7 0eB#krǓmߞ#Yќ۹1<wxUBׅN78.{myn8uLG6&asY sdzgQ~v_3s ~f#jl'~ ~w&u-MJ|n`ڄ>{w73cD&ik ?8_iN{'W-ˏ9XrqQX{zGZMyUʼXVkczP\l7ZeaXsy$L3or.&^] u( Z fmυm|bMRZRB,V gX^//cb#gnNa5jZrobd=K9b; ߜT7)}f ow>*aJ0"wΨKkxmU⡬O5eTټ!3g~;/Yv/uH4(:Ǣ֦yMʵNbBei^]GKg7fUamG<U~X/JKӻI^]ؿi᫿^[KD^}]9yG QPu2oEw,daÒIB&m3ڹ7MR/k;8 @N^]L2ygpR-~<Ɍ ^Xgёmg\!ADDDDDD>ϵmߖVj*u?'o-l;(X\ql=3M93)\qR5-kqV&Yq *Jdrg rgܰǠ(ft񡲘K*;jK.'3ylҨ^wo&`:2ADZϿUnok0?p NQpݙU\qW ޳´W}\qJ kGV0wE{ex׫ x J7}-W=w/AןVAuz-=(I.|М7x{y\stS*0ˀrޯ( Yiqڸ^O~} /!""""""_0M .fHC=..aB7ߚD"lkN@48lrQ~N3kYXA4F(-'Xܜb°AΩāwkSY᧣-CrȤ(%Me2,ȢUi]lؓGGݥ ,X.u>F SSX'X΄W]v31L,ܿ)cs+،%]ˊlzg.MБ$әԏa@mNoe oXadC5I671Ld4{Rs++bpʞ12G{ pԂάa}gkL?IcBIxeM_S""""""_ s_!0~Gg7/\S|[%/p lT-`xmƚ Nu1 l[Q%0?p|⨇&në[=cKc¸i0! bG2|`+1ӀAF 0h0WVt M)R5Օz9d\Y1:ByK~̐V4K)7 4ɰ!}3EDDDDD eY~ȁnCH8oΦP(D0K/ m]귶14_b{sgORkraH+ks4V?coc8ux^>GLK=} b0gQ67NUE~8؅FE1;#<S%/VC ׅ\19ADDDDD_U`CueŴSj}ngyY檹j-Rjhg-r t&Â%K :T*F4Ob+p8lg\ǥҒJc⮌1 v3j$s:.>@2D\: t' ؎6XG_+So~ KkGDq;GOosyvH3(/߹ϋe䉬]w-v,⽶W:_; #syhIV+0.T,v\~WKǫ Z4;^aւ>Za辉;M`3[:OM$86Ppy|V n"lͅ@,Ӡ/e8u^ 3UgBCw'YәgڈMmYK Lֵxf^TfqĎ r<=ξSG2*<ֵexrnLFm?ׅk3>"G6x"d[vIxeQfRݣyy_ayͿ-Gsgu+}ybtX&CC2sI-Phj˒w`1M9Z, PQ쥥3G}eԚa~ѐQxdV/NjK&\x$I~Q_W՗}cO Xa}GTM8hq%{`/5x-2N=.%sʝ-\35<<wpaŌ]|Gzy%nEGN$WiiPAzJLrmc$aVE!k zV|AvF'zba5-k{4=]GWe77Ъ0NUoh߮ၕYJ}&]9_憋/o5X:EϠGvv^%rZV/l ƖXt*&7^@C' d ._$~@37`˔[b5C($2F\KsFz x$}ʴNd2{!W>q18bJ{8.8dJ1CDBr_sY'…_dUkoʯD? ./\V?y?0` '߷ir.\ZLj?w>oę6ܨ,̼a>nzIr;2o̺c01mOsqnxLϴЪgókX՞; Mmɦw\YL_=Oٓ,5^,1jZycY]1]9ri[ϫf͕7Y\r|5Yk+J n % n{;mgUqQRu‹H͗uq]^g#m\|LO!\; DDDDDD]MP4L ܶL*㦳8s6?y+a7VԚ!qXؔaTc3m|f |CB}\9ZDu99`t㊨Sk{Pva Lz. f).a0cnlnӮ]Ycs0E _g1皡0!J/ϋmyЉ1jL?Qrt m5ڳjh rE?12xɴ͓KҔ Bd0&>y:[N8. {0OkxMM|J??!V29Rc^M?o-s`'(x+1 63cE&w>7.eQ"!h@.[7\DDDDDvf;E`0 %Lru?.{&']SYӑYW#}`p+'MswQm44?Xx >́baX8)z ǏaЈclqDqk Zҿr.L>>xfMܡk ZSc`s\YOubǎ AV pB#'֋l~p .J1o^gC6<dSʂ ċc|w:v}J6ڟc\["*HҼ0V5f8ЃloZDCVNURWz- Z|2$l2Y]:;r h("ouvJYMY 4ߔKQĈu&ǥ/eLRgѠǀӿyMiKB&>VwdrI:*n34d [ YmMDʆֶd \iB,`P7z*c^ץ7ec[v7M(XtVl\K<0'=QW0 sk',J/m=yjJ}؎?yFD6pˣO!Y/޴M,]3˯c3"JmG?[/J]dYKsϳ$m)CE=LdE[Yќ׺xfE=LhbZ~+8λ9=GTl1sYG_bEsݳSnYǺ4[e& /__^v7keeJ=nfu93nYǒibE>q,ISk_)#G(zVqw0sA|{PP񻄘gĬn y-ww3zVAC5ya@oOsaAidMkm_]Fqix rKn}{pqk<8/'U$2Rȓu!."""""2`>}gwIC] }N7l~tPӫO\T7L7 .\k31*{~a"”7\XKqC.or vo^Kdtck׍.$['VrmL `b(E!?8o\Ol#? vPMkN,s}m•{ϯ߮ҿtPhLSjLQUin/˷!h[1`qլ*pKrqe~\9Aߖ2I292 qˋ=\{B9SD~~!1xHdnڨɾԔ:~zCms9fI_>M"ދ1~x^e~}Ic&aZ&pYo͐zp0 ,`x|̞3m SGG[CY>kK==2HUH ~tAdXܒ*at}u}XE J <\oUqMF&5%ƤALPU'<0T};²Z LS[''ԦM)ad]&*vuUOk3S&HQxZC_E2'l,R<À"?zӛ,mXeHb6m +{ FFxhSWWeUKTel}Bc?s%Xf] _oc}KRD$4yh0ٜE)&|@4ἳNߤKk;~/d2YN*+8ǼǼLEc^ @d{B_ar2VoIDAT~jaƖ%P9?w&uo:a,ds,r0/cQ^eP_駾rCm>Sx(x6d |㖵9~cF?^mcKg-&YWf%ܞE0Eϼ\.OwoOOp 7K8x^viT8MSOrw-9nk |Qہ%d; `H-8.~ gQ /Bʲ/^yqn5wnb'5Y9K1 ,4>0>""""""*N1MacegZצi}""""""`#\"""""""srq u1""""""",9?l.;#""""""8K2&iD!zz !.Dqw  yh!Lc&s|@gwd(}M aƊH$S%%x=<\ Y|g9w\5WͿwTs]E\5W[q]rXy}}QiP TDDDDDDDYXƎ*< """"""";("""""""@DDDDDDDQ """"""" DDDDDDDDQ """"""" DDDDDDDD|nZ|Q """"""" DDDDDDDD("""""""@DDDDDDD"""""""@DDDDDDDQ """"""" DDDDDDDD(Q """"""" DDDDDDDD(""""""" BDDDDDDQ """"""" DDDDDDDD("""""""@DDDDDDD(/D_[IENDB`muon-v0.4.0/subprojects/meson-docs/docs/markdown/images/glib_build.png0000644000175000017500000002376414737503617025123 0ustar buildbuildPNG  IHDR]T)'IDATx}\Sm PD|HB2-aв-5ˌ4̔L473 V03DSLIQ4y{c:JmyS|9;v>s6p Edt]@FEdt]@FEdt]@FEdt]@FEdt]<\ز;%= nkToS&;g Vo~P+=pol:|]ƋVZR{g6 j(Ӵ}H:i\2 wN-..]nϣSZ! ].+4SkrLw^Qc:\QNO WA҄DŽ  Vn֚4t_SH_8y q*6]׈H=Vb?OEtţ{VIon+IRHe{WkܳjbR Iph"pY'>}C!5yې߆/'5K% qô-}3^+Dqk[ Ϧwg>+t׍xq'~8?"pY_>z?!X|cٙ8DBnKW o"iB"y.0Eનcn$v# Zk^;fa 'ڪO9y!IW\/8T-|Mmׂ(}_l;'oUhjQyW~lv(\Ce}KkxG8lрVOqC[t:Yof"pYgv(5nZ]cJ}ٽBޤo?y^͊7-u)EËoW%se}ô7_[v|#Co}[}}뷾rkV3~ihUC4 t,esw'Uؤ o_06^-]_lO?&y޸$mWfOs#VZCozh]J٢qΛ9 x­#gxcCiUB4}RaUW8S&Edt]@FEdt]@FEdt]@FEdt]@FEdt]@FEdt]@FEdt]@FEdt]@]|d U !pT.$I&MeKE[O%jz3o(5͙6|ړ64'wz<}$ZSs͞5)4ɩӣ-XRl0sX{tsjT'$^q(2"qrN9,6mp.Rc/IsjXat,A5eeeƜ;t:3h:Eڅے}Zd2r*2Xq2:/8))邵zW<^wժ<8 }Ŏ/FQJ9 [~bKwBXO# s2FGvQuô-GzJ~k1C3eg1~P+A_w?uk|âZ蕚`l.|^u(%hp{Oƅv< Edt]@FqIO4oMbu,Wu܏.D?uhltQpEdt]@FEdt]@FEdtvaJIN^{$/vd7W ]>".H$ML9l;{yhyuw=Wou|l ^._+@To9xF 9ӆZ{2CxN6ja5j0ܘ/휣kePI5{'Nڶtc a4vQ: ^Kl4,s gpF٪lIyhU*#5B!-:*4_0earykll~n> !Ĥ˾dGr7CUGg4[IVVh`znQxxHzn]K^נKj_+)0KaWW-]_ʢ VtZzNkGa Dn]Xt".H$ML9l!6_VQ}E7L>jIACxN6ja5jR͞5)4ɩӣ-XRl0C(|i%6vI*#5B!-:*r2Xlv^L \_); 6t]ccͯ0:Zu}}ԁ~Jɠ~JFk4)4ElwQ߈޵5y%s^k7WYA{IIIUt{bUHcm Q3h}uCVɡv ,]lBa=W`6`fnE"csN.ը7H3D9cQv*?}V:ux)PČ(i=C G앚 j.\]:2##9J|؄(,p}SOh_-"2. "2. "2. "2. ".H$ML9l:{yhk W{(=셝g-Ɠ8|7%]m-,W>sJ gsf $e4vr<桿/x(.XnM4vl81_9Gwkƽj-L ONmhb@kӒ)V9}QRqgL`˖q&QUq(2"1Z#B2XN٭x/'poeNPb> !Ĥ˾dGr7CUGg4:g.: Ϥi/BH~vK}Ւl,`{YYYFUFyZku"ƒh/V9nZ!'Co}̭/ܨQ]lhlNM]3! ̑ڨ[QRR: XU ,*ؼw¢{Gӆ ћCZ;y%~yg{R>'NLh0f2sƢ2SU~ԣ=jgvѸ*7OվmTkcƮd*m҇?OU^ 5٥#32zVgmBqS\P^`%\{ɽd>y3nlT+\.V +۽}otcniuOk I[؅#$I&.5@Cvo.ۼ]+Vtz{Ū•J{aYd_;NQ}E7L>jIp:@: !t8a?˙ࡸ`S&WͤXGӆ ћCZ;y%1C3eg1~P+AN4K]\y5E7_̪S{Z?6~{۽R3MօϫT a9s8_װ㩚O8;Mbʺ) r2@C: GOձEXWv\| sFW>H+kʥ]4l?IIsߞRЅH\EEH9w'~ݛk$p&x )Nl]^bpy7.ӾY5"Q^n~pծEu[)\c_A<ڿMlUY'9M\|>#& :P=}Cpi 5 OR@S_~r+kʥ]TDXrC/Q =?%oQflj萠6'/꣜:{y>B_È>eּEF ?}ׅD%~m;ri-O?},F8ע{̓Wהk?7NB7=\{F6?7xlC딮)^uX_|z;~mwWxמwww>y=M;4C~2h9bGI}ps#$Ih\EsNQ~: {UoHoJZX\'yQ}E7L>jIh uѐ=BnB9n]Fe6x͸n}awppcs֮={k9@%I[_[;L:=jҍ%0._>;y,\_ ~nu~x'6d)ጲUlْ>NФ;*UF$FkB(ZuT)6Awc8HOkܡ>,RRTZItn{ڨH!DyC~]BLZ쫘Kv$w3:Zu}}ԁ~J&hua8~eNQB8,&ItGI~*Fw 5*%s^k7WY /.V)/?)4Em~gXkV7mkeQXtco܃ӟ 3pJGum;.6v̈́+0GNhs'%%]"^\5ƔyݳhrчGm|U©K¥Ew_vј5rԞ7N(h]!/"oU{Yӧ<}ĉ - QfX]fOzA|6p>w.Sul~:uy{ A1c2z`6anŪD`QtmґQ|2\uhwauj|Qq?)" 6(1eWs"2. "2. "2. "2. "2M;t~'Sݏ#$IvAƒhܻjmV6:G@xl1 z7m5{'NڶtcIAh_g=#Cy!qrN9,6iop.W)Gl CUקGg4 (++h4^v^ ~͔u|wlݳhrVwO)mkyl/֪%s^k7WYA{IIIHtƛn^#~q,>wiY49U["K¥E XTsdaNۨ9O.1C3eg1~P+A+ '"Wj您up6~vȌ(AEnq:@Cx"]@FEdt]@FEdt]@FEdt]@FEdt]@]]x$>ZGuqA$ibTfs,˫h/MIy[ / ?ز%}I3wTUʫH!P@?K~ޭF4i*/?)4Em~gXkBSF. !]B ʥj\eUeत ֢u:]صR7Ը{MN;Ǵp,Ūa-FҢ{qTOo8? hضbKwBXO#Qs/E] Ix檽,USɾ~Ą c(3g,.3UJ=cV+KyQ"fO&X_&-}CX앚 j.\]:2##9ʻ:X>K7O?9qˑ?n6 |yt'B ]USD{Wn* kgKݢˢ䆥a=uK &Իd =iuں-CIZQ[z_=~sM9KbnFw>wFT2]\Ru=r d9oN^/hTtWOޱ7kc|[_Ԟ9ȂՒ$I<0_Ҳ o9>N&=qEԖPE J0YO؅ hPU8|L!5GwמagٷdُC3?m_"gmQFEA2[^3xom7-9Zp83Vrۋ_2cglVDO߂Kmь#|<%#G)MOߦj7;pݭ0;PEMmt8_9H!cqa,x-~BEh7r*la9~~s6yp8 7>^r^AUߍNtgWykM-Bt웯m<簝8.>lq4?=K^x)dG@FEdt]@FEdt]@FEdt]@FEdt]@FEdt]@FEdtV"IENDB`muon-v0.4.0/subprojects/meson-docs/docs/markdown/images/sdltutorial_07.png0000644000175000017500000032100714737503617025672 0ustar buildbuildPNG  IHDRezTXtRaw profile type exifxYr\9E^XFA/E$Ҫ:U+̗V:??~ޟ~ܕ]#}7W] ?h>=Ybx_zJy c-*2!ß!~{;?p|>i ZӨ[TϿ%.fww?9w5}:YٯTXw\8Xxo+|_/sd$r<#'CLa&gkha_[\ш$OÏv_72x#8:G)sVqP'W>(?5|٘`#wn) t7H~KĻ3΃ b!X{׆^Y"B9*lOMFs9\{%\JEkZjV[-YbYBcnfyiɝ;>ˆ#<ʨF}>3<ˬl'VYujoIvem~HO:Svy OyG.?ƭ~< NbFBD*$tP))fO TE2+8+bD0m?bWͥo-|D)t9o"s~%Ot7B*C-)] PVHÔ JilVϹňz!^fF󨈳y'sF\ $w0靘Ƴo>|KF=ZuZ}Y toxZN"Jt[!v,5fn/_Hsw+(a ))d6GYe'?ۮ9=i01ˋ laqqew昌P>}1;[n1Cbk/s(WmI)ď ٿM,)ʘǴY:yT %SW_3I)z:=?ʅ0窨%X {\Q>F>H^Ggf)\Y :=a`ѸRv[؋ob:[f=VHp.D1k8J2V*-R)mC! W@fUւQ4f j覴}R%ALfO̠ qCOk0 yyAntm*nKHoF(釼1Og0k1j=v[h;BPD .7B#cNd"V4(c!͛akZN`Edves64am}u>jd; w{q(VBGgZ h+mHV_~+rin|yu>߯P袈1avdCкOmy3xb70Ѐ/í  t nuթD5A:- rs#  ܯ"^,| '4bI02d3.bq eiwlebn,+R֜ɤ^`8iY֓ 4IvȢǠE0X NEC n)uؗ9;~0;]ɡAi B/wU}ɬ1O V]h=ŀt6z/OļމIaRRT#z#I%XLYFRbڶCFjCzb9?:ܯx~p#6](a`]f #b ~.3I>B~[-e)9* ޷1N"˶-EA8:fP9zϘֽխnIFfp T񴖡ATaXEgt+) QY4[l̇<|x 3K6TЪTDU\K2TEdukrIovuK5 \6;"[ /G5XQ|K¶Kz\~GM2ĉ'z'}~.90P|/7yi#^>+ג I9B֐c 6p7H(A=_S/Gш,v]gǂw8 MVc gS 5щi X3<rMY+C9M|!F+J}uMqh:1L}3eۓ,n"xNF0Yuږ`51njA#ŝJQ$vMWG`6&JC=;YE٪Y;7WMpGR(+<ꟕ`h"5J<م6X\$cl'νv<8 5XDGFSd" ~ JH>TԦe' -Rwٛ '^<"KXMyWt=\^CD@ib,S dG0Ud-E Ӛ3? o2s~y0QP9 MZ<Fͣ)t@O%#]XV5>aC|%_!ײU,7#xbv4YHk Cm@c,LE\x:nUȖaΩ , .j(PZZV[H=&"%^ Fn Z3#ge-t^b,F/-U!WҍbWF7^7K%2knuQw-ӸP6x/I!!‚k3v̝=pB8!4jG˒S$3lb`1 2X৫NOHT* k<|0! "!50UM)a"H*Zq ieNRu7Dh_T^I-!};чWQ=UO wewG" Z;$<@xfwMz= !eU#;Hga! B¦iRy@?HDyD7-\FTb}oE}#/J"d.<'e-XQ_!b> @w@R0^6$2#m;ᔡI">?>1 ~iP`!Ρز6xN`_vjY5sX偝|D(uepP QW,FvL q4otx21{,Xv(NWa[  u4 Vg {Lpspw/y7ڬQlٔ-eN, n8"Vvoo$1 \ߓ:̓TșJà!FQH0&UGV"Ա"!՘("\7N$ĝ]٩juLR9 DFFQ2GcM Є2(õ*XƗN |.8ET$PUp@5EN„u#< XGlWd΍2sl&RmC`oqqjOix4-ŸAsu=;t) |Zb2"P+8PH$AZ.T=~yAEH~FVU_\}t®@fJCӕZ^fY.Іߴiv[V+Lu@ JeY6kI Ɣ$. 2zbicɧHN{-!e#(qk"OrC&Lht#sWt.ijvf_9^"ެ3 {̡X8[LHI{ɔTS░$5Ue4*MZDHZi$ޝA3 d¡dhr<2?(mښm>uLjE~sʏ*)q^A0t ZɉGʨYoC{hYғ{ P]Ž0ٱhT@`uxFt*B:'o)`5sAS,QpJ]bGɑ*  ֘X`N| SOr$zU&ЬIG)zZ(-J22K=bJMЁ4#Y9KF.!NW=^^t 1Q4U?iRq&E @W"Amqw޼axy.`ROjZ- _#NfL\#)—tݕKJ@P&5$*ʚWTǟD(?]hބ X-IWDbGH <Ӵ a~FMUNvk~Au?J̻g鷩S6}6 (_#!w`,@/ׄ55ܩbTĢ˧gQLa⢀ $<9䫓zx6K:QڧT23^_2&|Q qz@t- ΐM+uVx^d)& Ϙ#YOJ,.P5ww葙@ ȯV#I.?<_:/5Wt=:uK-+Dn`$ Z_B^X3q؁_I@]| H` RJ8OoЙ 70ؖ[e`k*ݳܰ+{*I"}m)b0QpPzKO@HΓ*$k.QfA֢ΐm9]deF)#R1z٫P`;6zfFM$m@\@OG{URӘP5bEvc@$yb#IA\^Td_@'ݧZ:ɒ$Xޖe^Ɗ*jkSD:G¬QZvCeéƫ3ȥ&tMKTpZ3Hg1Rq >vP3,DnI]xW 7-3[#xJ Qq@ 9FmrѦ>EeMQhp ,%o꫽qs 5]Cm؂VdrPsIw6I&mMBH*vVwI90$.ƮHdj >%Xm,J*F ҞAwY|"zSg ^N0g;۫>MVŎwQy H^尪ErAtf~ "]\A8pj)#/uJ,[WLSeOKG+rX:gHE%G/?t|C]LJNqjgχ?;˭/R}b')c#8Bژa.7Q~&܃QQPKQM_jW*Hr)zKCe+o_K7#ўsz9Cm 7~%u'P/~k|nM3՞*hN%&`N7ak Է,I`'מ*q=`oxJܬCM>[}A/:7iCCPICC profilex}=H@ߦJE+ !Cu *U(BP+`r41$).kŪ "%~Zxpw}wШ2463˯WA@֘,cV_.jb@@$aiOm}(+*9I$~όqX,uljēqU)_yrUkuOpA_^:!EH ]'BΓ>ȥFyl@woĸN/1 vfqy+hӟZlmM.w'C6eW E) ^Z8}ԫ pp({=}տrxbsl iTXtXML:com.adobe.xmp (bKGD pHYs+tIME  0 IDATx{`TɝK2C_L(P .xU[E{Y`vݥ+U[mW ºn"(DE1(p H>3sL2 !̐^6f̙s$yFDDDDDDDD.Z  GXADDDDDDڤHdB i n>[!IE@!EEB!FED!DH"HDDDDDDKƗ8m/dN7iO . n]hh<~7hlNg I$$&M/t=}xWwЙ9G ? es㹂=5a07}şQ^]1Oxa$&0r?&# UU5d\~B K\\a=sCq>>tEL !1E.%)QC] t J1Am@Nf0f@"""Q4~(oOfOʔ՜C');S}f;rUE%qjR"/s1ݛ:^yu;lʥg #Gqلp:f""r{$""ҥŬ\GȦ?6LvjU{=z|N}n?yťά\""jjk#k߫:aKA""rYELSǑd_Iv8?-v+}Z_ fpi-{5\jk>#oud?FGDD.ag#r#{HhF ޢLKHLp$aPkOQ}QqF_0aw>slߕ:@"""A-hD|lHwakgZ2 OdVք~؁6`Q*UHvX=UƷH5j" \x!> DDD\P %R$""U0j[z&sTbׁcT4vSߌǘ8,*? ~CD"F~MOe/0eװkah+͟iDE$fP]NiKSr/0gO@""r =G wZA b-gĀ^~AZ _[]_g:C]]m`IVYDDDD$ڰ^F`( HDD.1 Jx1l?ȶ@/%- 2,+w{Gm \<4kExS0lGX$""rqmTӲU J\X0Hؖa& kR$"""rI 698ذB ZVtc1 Dtݔ~lZ_"pmF'ٜ(7Lz=ږF6x5"U$""T;6#hZۦ o2o&0 X/ u6DDDD3` av* %A""8bч=V5}_+uDDDDX&N(C\lb^vUs;uݟۢ ^΄t?F"UH~z+bD'{P>euy-v$갨7Cl~\3!""""26 mk408:?5^NT(,>¾[I\b?QȪ:hW!u3T .""""$e=""ry۫:g\//GJ4wV&p[?o͘^dSzm9ny: FnY#nWDDDD06=6l %""@GLDhވa>.7(-k_!R09z?ɉ>{b8xM/cӆ1I 7"0iGf0xż XYm>^NdUAw,6N)IyAIٗkGߢ:Ʌ+g)=镞ƈQ\u(J>KgC/tiMJ͙gtS1*n =I>>kʙLW>KͲD0}$v,08i ‡FeXt- HȘ2<9e9YV~3-"""vͷ`.#33oY&ۭTGDD.~qCI}y=2'u>y5$pej6MϬx= ͤHR:/U67p9Tzv7MpO[ M(bs& s`Zv+8PMWs`e/gexs5_ /}qh6yH`; g4؜wb_[y&>ȝ-$ioHt!͛7?]Wmk7o^֬HDD.nq Dr갆|Z iԱp*EOc=װDOһg#+|D}۴i8m@#]=`/5 Žm 6pgWE6F;w"w&`U'(B"6D^yXS_*$ nf*!RE[n1-;J*(q.W`RnwPb{\ E;n9D^1l{6++HWWmßh# =Ruzn/ А:۷{NLIl𑖒m=|WM@à)ka'vQk39`Z^#//_~+dz`:l\1 ):DaNXRYNMFM}.[ʹ&.<ڼ %{Zx8EwE%(.5q"Þ !'+z:3a"q.`Qve3~b%"""]RxTZZGDD$RTuimg8|{KOp81| ^ɣ}/2kżƁII|vLMqOϡp _<+IQu>>Z Ntԑ;nhKVR h]/on{~8n]0]/WTSxi*}ع2skeVAaV:InZﴉtZ_1.&2pQجUV3<;9 ș֎fgbKl.~Y7j$LDDDh}DZDDDJ1=0aD2R8y-/g0 M?GS_m߻w,w.ud職`($ytrE1W,rܭ/5Vn覢s.s(|)C m"{ QS&رiddvѴ 1)bK;pMљ6KDt<4U2p`GyV¸i9|TΫعNEDDhCȹIׂ7EJjZ̖9[c/|{2l~zƑr**3(M(ߝ\ Љ9lT*奼!V:eL_4›0}?q/s.״ǭ regPGׂ,?zx_=Ni6D4r#BpOhu.r ~ᴻ()Xɴ:i;s/PA""rioE]ɚ5k7o^*`f59GscHlz3qXmBJj*)ihfQx6jY[>ş;c(i))2Rp3&u|TR!h,tt1pN493a9$p$`80#wn$n@,WSP}R,TRRSIMM=9,bMcs+%=9қ$+DI xWz`l6(&""""""" \xqr/osY.Kd /*L$)9d,}#9l&{P7x}5`C!=kuUɲ1%\09\wl%0D^Nx3fE+3a(I茕8?&{Zҙހg,>M 8q\\\\\%˶m$()%|%R!1UGPDDDDDDDk=C0o&3&o׻Z(ڨ(n,ȃ@5ЅjM4{ _!-%3V-\%3?96|m`cضzsVcё68qLf3ޓU y>+y}bcKYw"yZGUDDDDDs0^Xˆ'cP6_Xb{p4omsl,!ضSZpgAnqC8ϸ@*?|bxCg /aeo=B!_,zf0^\7'-׳xg=|i s[?gI Hs64fj֤Ѽɯts7@UE9kIG3hlضY, 4kZuayGRN}f<cM۵gjj^"_1#fzȺuvMMM"Ŵf.'byh:9{6׭ {Ψ׃LܳfNk_Z6CXmgkԅr֮֟g{""""""1lr.yʂ yal\WC6A'nA)z mw_~ʬ/~MzuKaҝ_{VS=3Sc)0;}cs=f@/ JN[?%˗F[[6^p516=Y,_~gګq'cʺX%͏ٖb?_6p ˗=x>ڵq>9."Ǽk*2bKD4 xg1w.+`\E3f,1 F|0}}o=?_1^yv)iwIJ8A~qtw-$%fsw>YLX>gD IxA̾;Ёo̚]βNRBX%H b́ǎcG< UUF>> Zu`1ߗs<Μl T]4[ι^""""""kg-ˊCɒ W5zo0|o<ߣOꩍɏ 1kϯ E7ba7'a`}۾c+SYߎ2Y2{%'cxO}ʦ ht=e_sf;BV.QӮҁYDDDDDD"^i{ίXzzO'wͿM2̾b47u6z tH=˝Kfҥ,l4/nB3wD;; 쌺=&< 4;Y~*.\4!gL  O^u;, ,c^Ag F1g&D"x0 }={_ږhǹ 9N/^`l<vVgi/9FJC? +o]Ԧzֆucז~S^!# RҹVlD#zpb_y8 '`x.""ҍ^ iMOx֧) Z @X4r_.7=zCr΄H,nZi!v'Po0URS!5iT 8Ik > )˝Cz&.JL@@ )6$|TWWlAԦ,mlelABWِt 8HJSUU3"""""ʕ+uDD!)))%tORP$?J~ IDAT?[@obpeߓz}|2\ Dbk1}t^/?[?*""""r6PFF}999|x<>̿뿒qQd28qb7u7^?|:Zti̖dɒs~ϟ' nubK.=qk՘|u<3TDDDD֭*sDYYB$񼡡恵=tҥK6m^zͲ, papqRAn[?*ȁQ{4ض͍7Ȗ7ֱ P4*jŶЍm4662h YbELn`\ ^yw\}U-^{aڗ&~+*5_K+jEkY466rL Mw8X5|x^Μ9CUUU٧4 K.eʔ)mgK._rLõI&ѯ_g6q J#L$11n p ##q -}^ crrb}/tϦgVeuy?bՀj棏>0 z;s[C΀(igtnߴ6mjkkINNo߾| _;|3sWW(uX a}e.}SRR8|HV.ibRt}ClTlx3<+h\U6K.[n.,))aè,IOOruϜ1kx_HEe5 -s:|8 j,k *"""""@nZ #PaxBgs1PleW2,{u%Kzjrrr(// 9qDٷoirUW~RRRB?6lh1[G϶+ƌoO߇gF?zd6aYIQ85kV?߽jkx$RRjh6daZ6>IyE:vesV׶m^o¦'O222۟zme} Onn.n}0G<Ʊ4z#GoذI&6It(EK^'|)6 pbiџ>z,/re&M™$996"""""ҹe< >6L?Ͷ1MTRSR|>}QԡY_ӟwx?V*9W{Яjں QILL2:``nT}H/svhɒ%&;;ӧOtRә0M/eGhlۚώߥGLwND&0m?m)h5i+9sL\`B)zp8::zM¿Q{b7ysaK9ܻw/ 22\.UUUXѣG}ٿ?ǎ DN,˩ ''B\.nɓ5ŴCEPSjj*w./駟kP2:GMM>}p8(=]J41M3&"""""yo0cG0 dۡ4}{vk7gdf#3_^44v,):\†WƏyi++at ؉'0M!L&*:>/ thɒ%,]3g2rH ,w}7.?(8J!CZvX Oة~׾=]w](Yxq>)Seyzjkp=SoFF>*ю}@=g)yЅ)(x<{ɾ}v<7d& 뱩9_7;IsWK,C/}K 4w}7 ٶڳgi2n8KJJJ'| ҿŴ$Zp!uuu<@bS}/aۛ1W|Dk>-!P&&& ނׅaXl>Ӊiu!Z󹌌 n:>ա.3[o1x`\.WLj>Ǝz|WF7|}0^ (عC~xox%Pg~̙7S[[֭xM^;b~|d1  4}Lg 4 `Zfa_|[iDe[8 ebY6NW`x=Ec#'Ӛ)/ -_e2[y(xܽ^x> ))йM}>$55@юYy;?2mhF:Ķl*+ٵk=0+ =eӯuhĺ(zпGDXEUU$%%Q[[Kzzz Z;Nf9X\ڥ3+9bZ ~lz<j#5x"*n (Z?CIOizIHtЈa8NbSw|W<ˍ7Щ~MMl6 ix+l`307_hk$5-z|>3.5,_?n|^|74_ɉӼmN:ݡ(WCYpաy2]=CUW%<LӤ_~8N>PȕW^_m\.N?CSSSӧ={b`6뿞{'$'k0n[@'TC WB۲n1|>ϸ½|kGk # cZ s1Fvòȴ\L,9|uDBBB<;j222xoyv i-i<О}Ex<>,'4aPДP5b0JHH[瓑Oߏ2nwNDDDDDnԄ߬+9@;5XG>ZGbbOǾYOZ: y@ò,#mq:M}>_ 222X#1]'(9WkN{扇 PݙbzwPh E )) +/4+Gʪ*z n[@ǎ#wZ'faX0~5n66`:ht#^tmowI^`3@M-"))^aaW(:WI#Xh_E'q!*9ﮡ3~@ u:ЧAEE%IIT$""""-uh#-?eӭ`uH&Ƕ`箋֑7בt%K,?9 114*++IMM%;;d@BBazCݢtԅW^ힷ礭*O>QF{y|I x^=>Nvޣߜ"""""ݐgcϹaCn2lǃn^U|1\r`u Ww1n|?dÅt.Xutk!#OH""V\Iޖ+OG"8rwEDDnU$Õtg n] I"""""7"""""""ra%z eciaYf^'eeN 8Kd6wqGe&>x:""""""""q&`* 3Ya-[ ċ# ! """""""raħ X׭[J@`>'Odٲe:""""""""q&`aMfϞ zxر[fjszTWWêZGޖ@%!NM HgS'M+lv 8 [fgO ;i:$_ï,!@vW'h#Va2H)d_uKooc[1_0]~OLY7Iپ7[a??NJ|x9w;80ql[] @)p`(wEkXQ1S"rÖz|{<{Wpd?Yâ<Ȥx ٰu6~ryh\NY/{(q i OW`Zkˁ{q׊m .O5b;#ky ?aoLb9$fAM))g0n=uwMmcA38)\{Fc0w"raEDDDk<:"""m0;4X^FdGAF;iɃlHm~LT<Ȋ3[w7b:?adx)/<4᭛a ?۶okx7$sqۼ6_<_x0_}w!dCd2>a2%g>OgP^"9(-8kccGj,\Gx{voH{-^8⻈ȥ.>M.5 Իg3)P3L^<|%aʆu2ӮP%I?Ζ7{Hn\B;}م[&_Y58&`y'mx8*&!+~¤ Jy#d2W<;9hcg (Mpls4;/8|? kvHO|Iض|_ªynAw8*gB_S>r`aMQ:VuØ|Ng]|YF~DDD>"""~q_(`NJJɺ|=ca# t OO!F;jYfN vwo8'CnL###yC?'yG:Zf~60IKҿ0s?/ɍYUR髿{OLanWV޻ʓiz@'Ox&6rEÊ&DCH4}+DDD.UscHsַ >X5ի:$_ïcKDDDD}XUUu^<LGB @a|`bH ;z 0`aLf0iNH{u07sWض̙OXlzz=LDDDDDDDDΝ#~6f^vM}DDDDDDDDVd*6 -:""""rN ;ޜ@dĩgΚX3,ׇaj&"""""""/qif["eUmذ]MP00v-Y5v]""""""""]F*^U0NaG63ÚYx=@t&DDDDDDDD$>MB@͆#_(`"""""""" ׫6 j&""""""" ^`,=ؖulƶ-@u,ˤGZ k'Mh f^ XM&L`OצuEDDDDDDD:I ۲|zom6>1,bk H'Pd 38_~FW["Ȳmf|V5 Hu, T-3Pف2em<ο|z]VXMbbBaȶ8 8Ph` pa&9ӹڜPόYM뿞῞ygyg}#o 7}9u9^m`_βɓYv;>]Q<Ï :[.}:l2a`ͯ gheLDDDDDDb2 %wXGϔM_ӗ ooV`w,W ^Gx 3绐 x̏/OW=i-3g:qnX+-g p f^O5lMho|?cĆE<7SלH,u t2qWXm? f^*`AG] ^gKEm3f|ؿ2" IDATf`oOru}xW}y X\:G,x[ ` a\@f=ǂ?exbQd{LwS#Vp}\ v/Tdዿxala8_p}̙wp#~ě[?/0U2~VsO3f>ȝ{݁YV0wc-@ ~c.(u9ܻn ˶h3q <; _]%_ͭ帾W Y%t1-l]_d,Mƺ:i 7omFۭ"ʳv7>h3rO_?lޠ2\6?VW-<z?/Ng΢Zl㝬RԞ7p( \Ν;;+OG"8rwEDDU|pځm7=OߜL1ee1\oJC#C'lzs[ł 0?c࡮v| V+ 2k9a!7ps3s{ߵ#73eeM |SVWKg=m3 VL1M%Y"f^f^'T{t` 1 gTwQw߷$lƀP&ȪBIvcj2H֞lLg٣=EvXHNheP(x&j\RIh' IUwPι{>n\N u<.X{ h62ggsoP`FN|g7<v5zNVm;DkjkԬ{)ڞ]Gy"EI%u%";`]B#||{&>Tt7W?Z:EGn2|kŻ&bPillqOQ:?]ӑ=%"""""R*=j&*-X.Gc/;EǎwLgWa E[<G^DDI%`*Qk~֙gQWbMz3'|:J}{9U ܜO^0܃>-x WEOu= 2DDDDdVRH(HDDDDDDDd"`s>Ll4SWBDDDDDDDdL\y{aᷩx/u(ǦCګ*- 3R[@/N8[jm:o}FouxZ&:0ţ8I[:}U{sPPKŒ2Ctn{[57@qS%쪡UCZo,c"{.OҸ7^C<}n |k߮?GV]-G9V m'{)F64%<+}EDDDDDdSuvѸl7g[Ӊ8 \z̜Vp $d f 7W3UҚV*3*CbPԡ@lmmg;VW}>J<̞ ~k^,K*u wZU4D׫B.O]N|pƿ3g_? 0|~u< IѣeyȆgf9#'K OЙDBT^/BjI˖eI4dí\ɺg񉈈ȭKqkr1PBn:lro+]gR ]V2.u";5LQ衵ˌ2]M> \B\\5[++?Wd=|8ژ? \~p/W>Ϊ ńu.Lx0 c*ÜLFPg9vX$@tosėXP%9vEs9<͒;'K۬6K'ѥT/KٳS%vא}M:(4P PSM9]ȣKɹ2rA2v"܋wWY,-Gj $""""""3Ơn~0M{ DG3_Yr7}wԭ.YDWK.d߇?'/MH F`؏G9D@"3IT3ȌS yN@Ao?/?4=+eMn|Œ2K`M ȅVW ݻ ct`UÉ{xy=tP2OWKWՠ3m#rs""""""" ꤇]e4FysF5T`}C0Co+Me4\^&f.fө+k\YB`WIQRM(hmΡ=|/j#qS] B/[ZWA΋_~kx&>ZU#/Vp$m/}oxY \=# EGY~{*GTo\ЅcZ (h"!>T!gzzXgE.!K@S3H8Oe 5p9`{#'Σx2;2Zl:>6wIt6 u]\Bǩ 6{dfq9ZA|Ag(}^_o~W_ G_gc+GBs{'i{Gz&~ W~OƳܺ4!lk`'Tɦ8S`ef h>Qm2hJvM" 7e{A8k&#\4=1T`eLuq cA/]mB@{W r_5 zw2hwVzw~c/xG\qŖd}k3__sS=׏q x,"""""rKQh ])i>lZ_L Щ5GOʁsxקpߚNʚ[9llt6Lƺ[ޜ0?FVeɭ7X p!.U+(۟a`xZ'-"""""r 1(k34LӞgь>!2W\CuK,MJ~?{">AIq@džf!ph\AYVvo/U4lġG~vtQmO=,ϝaÃWp_ɏ޳^YOѻ"бu;ް\ WġG)ևZTYDDfO>d߇?'/MH F`؏GcHdc6LMDDdRHDD$uTH DDDDDDnA$"""""""2)h6~PkF.6-"""""""2 f2wDDDDDDDdZL[_wR-,"""""""rMKK_m;_yt忟y_RIifA;9k1t]sIVD滔g}n0D"I-SUQˋȬ *6oqL"24veI|73D9\=+xU9oM \rѸlBΙ%j(B46$,ˉ]edj)\LٹQRHk\.}ޜ_mٯ'LDD-: ̮k Ӿ5M@D,"L@2ߥ?0#†/ dc { d/(8DNfu(n]5j]Cks1ex)'~]-~+Zrx 3w_ .7:1XQ hv\^f>Vr+3#,h`~;[)s/ P4\ȣa/5"=qV*!o^|Ɵ,}(xb?p_/ )zqɑ#3lx.6X=z/ZU#/VHI*mLy~)6<1.+C&,{u֭.o O@S~rjؗȭTl*4{@S2aȏWTHVZYF_r+ ߯{"9 - w?(w/{p̉^\A2:2G^KGg fgo[J/׏iƋiȰ(nbneM<|[s uǺ6Wp˞6G^^/_U#L|!)#̽S.X]CBjDA6!As4^wњV'iq=ZAGQWaX3DDdq ~kH%5JYi|c4c̷`PBGI?"sƔ"/>am=VOabin}@_iWy?ޞ#V*%tWs摃/87%ƷPƆԝ~o7lZ/@}\gl|mPfON:Nz^gݗ+_}U^hJ/+\ܻ z?͹z$mϮ4>9~Z<iѷDnGx؅(1:E k)Z 7d3Ѥi~LI{340m$@m z%?HCzsA3- b=EiI$ii':kɒ% 5+r/\"yezm+HɈcgJVX"y MBUE<d>O[ɷ\*Z4:~q~6%^W4X5W"σT~`g v \$~g=Z IDATFoZ`rBf-,"2H#=qHj|駣.;yw'l6=sc-#H#j0<9~+88oc[#E?d.H@ "ḁ_c.209"}&+ ;7O/抿 QPpg""2v-3o<">Jcf~@v}dy7F)$2kMПxY?}/\֨_ii1fN2u>Gt%D DD&iD^(7Ecuu`PfLa&4.?ZS - ScSpxQhF/EpR^+!""")5̓kD%֟ I <OmfL~} (2g.xchqg3.4ܮ-&S~kNб~pD X~5şߪKDDd Szƒ A4 ޮN__ߘ'~HغNbW0;A@P40RGd6|i$wJ1R ,fA:?X?fs6W!e4L~z0pxؑYcw@87 Xe 5?#'Ws,p`˺"""2-S9 ñnE|ܸqcS ݸqEo]M|gH~ ; :@9vۥLDfI .`փAd>^Ao暱>"8a] Iݭÿ 5,0V t>Io;$J7_}%M>\o2;4, EDfI.I$ҌG!okiD^njD@"""2F^~e5ܒ"08$wX=Fl3Q >%6/Cg|z6}D&3L$F8 ̹!\rykJ]er,!PTCA$!a^N*#{{>]̦SÔK.h]F MeT)jc Fi(GdqLvųw.GKa ->z>woo+w3 _o:}_'sPtƗ/(b˻\*ipн<>M?9pyop3Gy a6KXb""g$aJ5A}"2[L:jz:]3z߇8Hw`}IDGTH3?t{|w;fU4Hϙ뤇]e4FysF5T`}v C*q=9sOи@<(%JeS ًof)s V&Sf ]NL%ԸyOҷ9o\i6zg)p{{ԽdX4/>>Wk|C5"y,%MC~ L<.n RԗȼhhC 2F|dXff@%|壻XJB X|loOcCZއetD(edgΊ\::{:Nm"ۺ9YL>g5tCqfh?ΓRf[aD1An 24xeU8TIN4(4Ag~#6Dg\Zòg\}Czzd&kfw AY@ zS 'dA>дA?[yo1;"])i=ΝtZzNWRqUYi:|rw-})xU+['B\h=z*&.n`E"">fpxɶS} 2\d̂I4_Df)eaKVK#]NL3AEw}D͗km4XF{8ьō @9v10< OfIoM <ϦK^&* rǜG^߶m?!z s®+ܹT|>OԌQԕ|ۚ~g=FF޵Ǒ_?E]sg@]D&ް ;]:~VW -Gj "2=Í5' <]o/>]7s7+VYejǴ?=FB1J $r³/|¥Wp 4!bD8L"0I؈6"?]Cc,YDWKY ^%"2wYFkpyǍ7_u??>$yc^f$;~Wpwb8Gm _">\t{J# {0a} ynxFBpHTHfTЉgqHiq>bbUHp8l|0c ~aNj͠ADdh@i\g$0)HN~KO;h8ut-DfwA,D1 0y0oO g?!ü۩n蓄hyDI1byQ?@ hw1Yp#8>=W?ő Bm G0͡u~nEd¾fԐ P43\`(ߐd/-"sڤ@]p``Wy &&?WLzzbN4'(7@c7]3rioa2}&;vz}O Gn@)qau,Ot!Ddi ľ4!^'HE"ؤ@I9+|zPGMl$ieVA[=(e4%~>|Fan -;;}BZ|Tm'"7#"@ ]jFvfP<״H80 "A0&aDDDd\3>%}I_`M֏~! {Ym'O`nTUM XK7}׎98:ZKc"8&iM v[/q.QHvf^b.`"2L.P𕆷K@`e ,+i\ܶ(LQ_x?2>`"2?0@x@EEdr+<\ahLfh O~Lo@i`:pl} aA?.Iו9Ǚ9G#p5 aw$($"7h_#&"2)؈`o$d J*#H4軑N_ ["&ܟeg984!=6s 00HCEn.Mx~a< Oq0Q S (rX]Ӕjww q_3w.\aIᰇ`-4u wk|5ӮJȜRo+WL0,[L ("""3j]:iiip4:Gzzz,ȴ[ *t`qv] C-ZĢE"""2'LtD""I$ߋDa"p8L8bwvZшGz(`""""""""eRԴӡM3?~+-O*`~q;H."""aj%}oD>p7 鋭aA5 n` !3i4Ia:\ vMW@#?E;<G 6>kʻJLiw~fmJX|'`@sv XINW5_~Ks.J(?.=}B?Ln?~W.7a`no/&-AtMxZڸˏ{J]~n&C>:>-S7 """""r@]'iWX#@a ._~>'XIKTe[JQy {ι4,g)=KgI*Rήخ۾6%xʏŖuk.o k1McB&fЋsTXkm7'Q[8S+5 z#u>ֶG 1C>}I}Ӱǁ9c{ /'d:3M.j˫J 8TU%5-~+2R f}$7St|]Go@DDDDDd׮[D7.<3\Ѕ=W+Gf}v>HBrz z2  n')28e3lvaP~- $#%͵ڱ'5 xAG(d{^}re;00ĈׂFS#X[_7ȱA=>:e=^l9 ZKǑk7m"X^9/ҞlO7[־쟥p;jl{9NoUg)MB3ƝsugC4  Y,pi+N/Aė_αhi2|kTQSgGR@cHc2}PW0-cc^N]$i. WS[ODDDDD&J]hBXxW 'd:!+2RozݰKpOyoѕH}5v XJ˫jwnS pKoBˎ;姺cdu;F[L8&*=Ajy&w|PZU[KDDDDDfV @a:xWּa/rŠΝ|g%,@Wӕ|vώZ׺F!uiQh8gљooUG:ZO^w ιu=#[LICuύ? 6L`'ou/}-u>V ̰V{iq4 ݵ2\ᄌ.]-x 7Ļo:ʷ\㤫}yTͩbYʃ ͔VA}3=՗RZǞ&ʌbEnOKzl :ζ3JLnFu gxܞ¸ ZՓ7ODDDDD&J](},΄_l 5e8]vsa~G"G]s.8haO.92L"#!KR-ǽ ܒQ[SYvU?&UnzIU-vƖWaǓ7 Eoʣ>>W=Tj5ڧ߶V{}nv㌒g0LQ?FEZSbֆBG[zLKm:+zþرWZ*'"""""r3M`ڏi3hF+K%KZWŃqdYWܽGT{_BCL#4cS$2I8f``~~:@ϧ[җ&.Z ) 0pؓ~n<#~)"7CM0K9E}䦰S8ϏNIj >Y}Ig񉈈B@buII2tLODDDDDDf e%ūv'""""""cP<<<М҅u{<~{0Zäx-3ԧXgw_8z~4 l>]$XvǗ=qxZZr]G}>:Qp Z|{~{?g<%G?%'G]>}d5ƒIQV?sJ_gٟS¡ń7\$TiߟS¡ÄJj?dyN&*sp?Ժi QHnr_ٵuim__ ?[/F*ιs}Z<."djm=.wMv)g Z˃{rc"MR{ۣܳHm8W?$V3Y1z JtzŮc@c7xr9=?gKcu8a^y&t^SXkh^Xe2LJ2rYXxO>vw7?r}x{W9Lx'7~BS< WMVN9IO<<dv awz EUAknP?h<'_緂& 痘X5c-^?_}st- AU%| a`0)5L^4I?:ZO^yJ ّw:=>8J U-gTC#M>-cƮ$>;:U?#}Vm?9LN,dd}c 3.r:1Cp,X(f *Ǜ铠-K'g2*`I Gap ;.d0FˀA;x+{iymdrz:[Mib1!hORgԭHB]*_~A} l81 ]Kt kڃ]ںZ&wq~fk~S>[kifCf4e2bE,kpUr%xx: di`w`-+$`or9{it:}zOqBVZYN(x8o sa qhP92y^;<_Id( u1:tS?KBs^ oUX]CQ>ʮ}uVڇ9cOtt}&dPTe\>od{^7]?S9~+d`J9[UBjR [bnC~Z>_T(ܳ <ȶY 8xwl0rwZƂZ\-\Ao[ڜ5즦Ek*s|[L4""""0gv2=X/]"Lmn딮τs?:AV;ؗȮ)gy.nnfl|>81M:GG>R' &wiI~~f 2cKݎz?/CO?9n'>;e{,"""rQhhct%F(>r7Q5)N/;:ujH:$_}pGжVkSW/wgu鉶OKr^~}r=<(RG:|B˾#SX?>Zvt%e9~>f1㭂 ڇ4'YkQُ &זybO|Ӊ>=ofuBVХnk*k "bۿH@K) \ಽހC9~zg'y|=r^6rY!"""6SIL4y&c"|eUR~dZZ }T <-lmTIߍ}s̬<~{cxO <J\67O-/QW8ZTr@>2Ii=V3_ 瞏/Llo{^h9D=|G9a.*_s um)5b}ɟx '5]:ı?I\7V7ŃQ־Vv|xo`e,(s%N5 31܍ƻEs -Ϸv]9XM G%*vB {'~؆v|i*_ϛl4oz+ώq|8Qo_ BQ;8Mm7pؾƋ&XYo50fEqO)"$D'uwNjVA\Q+1Mu|fTAjIޠwޜKPTdpz j(H%f|}DDDDDdSrU;yJ@""""""""@""""""""@""""""""ܬ u]ISjucYn^4L!W0-AtMrnwt~wJ/@=Yt]~ܣXEDDDDDDdX*O.)ga&iR}m|KX9-7R]jSXi+21^llĶw?$'GlxȫL: *7ҐIc-a͚P4'MA(A, 2zKݎSCuj "N'`<Ղm$d(%dJْ6҂Z ⱷ2Jc-A'^?_}CQ=rXˡ z[B""""""",6Tpz:[Mibe sugCSy,:[2V,J{j&"""""""#ʠS(0W^_{"pS1L)>R_EQ@U|m<>p*ήM.qʿЉN}1eP4l.Vk KvF֌c>v~M9ps|EyYUVGQhw7ϲsF+nfڃ>B %liY:8Io/ :+}H痱+ڲSCPK]i"""""""~Kݥ,_>7ڗ^Ǎ= *W/CZUƮX5UyVt:9̮AeYV5|2MdY>^/uV6mڤ濼GGbؔ`8=91B"r @F1T&Yr}eKb6Dz[N?"""""""%^x4-3ThE~MMko"""""""}u]ksX<}C;qeEDDDDDDD`S=\ȧҰ"""""""28]@v0C% """""""r]ОxOnpXdy!o6RHDDDDDDD䪹f]/?/D(WKJBzjW:,^s5yC;?|GR/Uk M[}qXAeaYgWSHz%ٰxx1M ,6r Ӽ=O8׍ \᷅^hq/o{?@`,=}ՕfES 2_DDDDDDDgJN{r˧? }۲L,ˤ /?$|禋|jo?n8ֈWO7t#O(+xbOiv,с륽6nʦM"2"H  7<#'FSDi6*9f_IJL?/ tq?A% }AH_ nM1hv˧?O `t3Ec'#^D@} $'&_&Sb1콘T:w;MvtY}RHzw,s' )1g>QHDDDDDdгz9ȣ`ЯPRb? 1nȠ`aX``aXV> bX^矬?v(aOӰP7"/2n;ԛoVI IFa ,i2`%`F7 ';Jo{ _x7d2*pQkGDDDDD1ӫݓ?؃x V1$r+t4<~dXVE2v)$"""""Ò #4 >s?X)HA\o x? ?Ðʴoϰ'Pz_ 4x{OA<ͼo/c* j `Yő pDp$^/ J+#r]{ >_Aϳ=8S.yyHeZƭs8]\+HDDDDD#) FR0}FʤI_! ̶+0a<$ &j&r}9ٸAo{™rD 7 Ppc̩$"""""Ìe.vHhp$&Aʸe>ˮc`MaA?57oԔ˼nDDDDDD KQ8nHy!ArId-mhYM1:.`u఺#Ss3Ԕ˼C ?+GDDDDD'ӇDy$ǤЎs8Zs?,{um?lHp5 $Pފ\G Nu|3~QIjJ+oIC2`Uc#"""""Ïa@^J">~d}|f\"ic6[l0 / @ejv`"π`}Iޮ5>jn_T:2aȚ?'8d2,ª)E|WKƥ$sCABXx0.{؁ O0I4}$X&+Dun}<۪*qn.v RS9M3 7]fNJo|$&4y?EUg>Q,Ĵ,L2-,g;idÓ= >(#Du-=,u'""}Ͱ,ߓHvT:`)?:cOTROO?QI-O}'So_S's,W,QcH0,|>ј@5еM@cG9ۻyq/X|峗U@f={eߋD .[`HDdj:ԙ\li˹ c'orѴ43F'2Gk9Xd1pk0 ,ABb2> &$`dt`nar;03< X|0tvW_cVFyh۶{oLOC""#HbQc'pcFOH=2a$&e h҆O`$lok$aZi]H¢>Aj+سyos1M y'P &n^smEDDM t>Ȉ; $$&Fs݄tLQ3!\ja9 p$cb`@πQc`vvM+p[ ?xi^x8Ʊ|&u D-EW+oH lkiWhcSA w&Z(Z (`q&A |,a`,>xv``N^WD t"b@P\}wW~2Lp#ПH%Og "xYa#0b@"rƆ{CkBlf(!!y-ߺ7 11Kv/4RW VDD$ߒh)LӤ|U30H @J $X`%k? fv5!t`/j)J'"2kMB0 ɞ޲o, g1y70}>L_ڴo.y{ܟRO#&?FS o mgρ&`^::::j+ ] iLð0!0e`t8Z?"s}W(k=KUϝo7{QH~c:5+畑"2bO2j$ Ñðf`F"80vXF`iW2H0^IADZ?g%roʻ>_YUV)DDO55 (ioo3g(#Edĺοࡇ"%%dIJJ"!!!89ks@UD9~SK@2xnooEDDDDDDL8s\ RHDDDDDD>;oPȠ.{ ZDDDDDDDȴ;o e V{#;N I׃ IDAT):mfCFhεDDDDDDD܁>)@p<|6?u|c!a0Zå?@;hkg7#H_P 8@__>p5Vp3sNw'.C v4߿v0-o f$^QFiY ~=uW2{RX{| ovpxb=\\nu Й^/-qnS./*iEÝGU`Nˊsꩊ8~1UnQHDDDDDD_؄g0o+Le)*=$PWxȨ|/&_6󿟱q:F 51v* l;'jJ*ŲJss$)SX)Y z \?6$2] """"""Ë gX{+:[3g7?X1";?^Kݒ>=geV\7 ~Wzf(rH7cQO@FV>5Y=$#l79d' &#l?ׄ4UyK`:SĆeKeM)YUYJA{ċu˟oχ{9wƜ/ߝ:?{53oN!,rss]x&Musعs;RE6v@9ǯ(^ t@q-CN#]WQO)@Κ6^#R񃹬/g}^9Rs7Q^OF[ppWg8^*Y֊<9l]Oy])TQ_ohwdKO}O ?SrW>|>\;ubtlI|5h[ƞTZ\gh7Xr.ȭ[rwN(;76=GyXٯ\ptv7%_\r KٞʣqoGR;]K{);=%I.ö Z}_EDDD$NAk`kΝ;Ǯ^ G&`I)pԑ/'}{+2ǀJkW cFN1VMJMke١b*X8y@0oXq~=.vF}p3:T68=s.+s]Vs]@=ƹ$мL_PPsteu vTӀkI_Nt{N_3l<݀kb\;/(_{9:m%s n6nn}_EDDDd4i+K(h:i e/r;Z7w1Z%?@2V{8=\g~y8Ϙ H̙ 4|tttzioӟY-sQ|߼A덜cq7Q#0o=u<űv**氾&cҔ9nB{k(,V3OuqC}s<h|o{RGe~y=9H^ʎf@YT$y({ogmC\nw质ͬ"e`Ӕe;BŰw;ͷQi]9ݺ*z3Ye]]OC%.]Krjӗuzh>ܵQx:SG{iU:w{م(TzXZB%=iFQJ=Ť7ҧڳAWhnv2 =E4wi~wq$6.8wk[E^;qNdt> p͂?GØa-PF `685˧gf@ŋT7I bNzk? cG*O7[9=)JX9+cT^ZaZYϥsUR2a̭1U5(mqпM b cm`V08UZCB/L2?+b p|H\mV!50wޥqtN%sq6rY촃,ۀkJhN_4C,m+Y"D'sowQva\/I#{7ZJ0㨇o2=o]w9\BZk) >bUn.ƽ)3oݞwiFľnOvrsw&2;Vs .n Y3`«tn_w]z-="Lsp8CͿY);L3oSc݂=|#˕] lxOtyRnIDDDPPYu(i4p`PR 1 I)v'qth?Ic@V%qWaϿ1b쪢4ʢԲߗFOS*;]F ZZ=!XC L_&b>1>iСCJk [0(KNSVגs#4t>F.1nj&iov[:เfG0!) xÜò]OL%a;R{P ݥqR_*}:.ѿ[{cg"O#rCȐϟhC_-4F[[_oi44g0?8@I)@t_SO<5} ӳHCK`^Gt\ G8?T,%70GjLCg;x=aCOwyX].68=꜈Ӎȑ@=-lURt<12sD͇y1#44so;HS?WzLs=5-h:ry{׀LDҍ{vNww7?݊]i[;㚆'\No""""2l?еc)Q 㞱ݮKKhz[K3;}88weʹ,^u% 90p3ݵ=a@wza;ZUر=fRDg= l[ɮT.FyM_L԰}XH/yEcypsOټ2挝4 Mpi. +wr;L<<а;%{m]Krߏbۏ3݊]m[4n6rNs9܀6DDDDw`sNx|A;w^fyKMoiZW|n\ /}ǽ7NW0OD@aS /v@V W[X*:&%2~kt1M˲|tttwغu+6mRfȈvZz!RRRHNN&99$F]0&_Hy;w>I D~E """"""@2,HYll?>b* ]eQjU;N0#sRT1]""""""" ?/^;/w7yw*܁uD,7pEֶ/cĻ=UcrMȯn|ups!̩]( ZΊ]( wq. jBJQ^XVU9l8: |3f{Dne vwmH9cz'w})YMY+TXvApdUb*ʘaj3RVvo*4 AY̞uݝ}o{V_GZXLͿDDDDDDD6h@ͽ[3SNh*%ZldR 6 @qV0`ܣ V`Ŝ a98~p>gwH$4 X}kTZ (M5YC^҃ɭ\OnR 7X5d+`KΟ9)/"*>0ګVZĻ}"86?Zh|7n2ADDөLW_?2B:t---qò. XT ,}T< 0W+ύk@UB}Xb3ʡ60M3b||>^/:t{LDDq:={V!"#ɓx<d @󿶑͉Hdp$@^}1mcO`6leSSOF lڞaa{_ ٶfV,l/8X'ˆr )DDDDDd@)$COm ,`#9֮0QX[Ƙ3kyeɘl~d ,6Aahw\DDDDD@2l,XE Y` WW@s=2s*@WK0)5T/""""""ac|8l܋fĉ c9PdZfFIvvyO\WLX(ODݿ~vZhxgjnePMt,+ 3g> Zxy.{Do<טK!,=in{ Yv-6mv$Ôip惓]|a2k_8e%&@svBz@ę",x$x>pj*C,jm,҅WfƝfRMҲK(qװz.zK߲j ( L6%Ɯ|SOafA}OpׄmuŔ|{_f OϬ5/zۿabfY'WDd׀ۉ͏D*D 9gʵ2l"@++hʼe'S7v6-Pf󇙋pEy}KZ'6|d?eCaˮQ a>} )4S0 ]_T??8oZiY1}9tg;v,Ǐt2i$nf>b5k6 2x>J9ds`G,;.i4mcְ-m|,: ^7s*SH#dh%٤13&'6?bתٿH^323\ eɤ5%8۔do{rTI&<#""""2{›%>.Dz뫊9_OMq]+JɃRJRܜ*!cǻ}/\OwBJET|>S>˅nYzg&M5vz~kXͣ䰿eY@uu$Øœ}i,+dp&jr 6UmMSg0P@,A4MJ&"b<-7LJ6~ʛkT>"""""C] i&QyOMM~+gS} (uj(X^;$$$WOCѳT>[Dmfˌ>Hֹv@CHF~9r1r|2zq2z9P^UQ_E5d |ª_EOc&c"0.OvpIhܤվ9DZ6%C{rF`Ĩ__>'6?jQRE y2[n+d~ 1}'\oj6d r=k~.5dkZo2?R2--JN->)a?}ob}M>Y^JA XeѲd^({+c5&`"2 u)$TˢF`@{]L K}ɰP>1W]L 5|:::xgQo ckUSm {֚mTWWS>/0p1rjYaD>Ēp+3XoYa5Յ,3 ]""""r($vAG cYa!mkf]/+njՉ͏`VW4;3O?]Ͽ>DDDD?&O?a֚mdCf)dͬgHHu͏,` >Q-`ADDDD1DXFNvE #='65xy(TG6L(G,ϲ۲'%T-b o~+EPP}a;cLEB?SBff[ s_or$ O IDAT2kkuλMgcz/k"g,+X/%{:yu~ vH-ڢE<[5ٝ}˕߿~EDDdXQ0SB-*{^--w .d ~5E,X Pt&K#<06daO=ubibY0gW/9/XB;} >@<Ǟ&boaK6FSnr5Mi "7is L]aQm0/ ];+DP(LO<Kt~Qc)Zpvg Cyc]ۛi1V/?gmDdbY/'?Lqwf6QQ UWДygG"*i~30e* jG,jH|mᎨQPyZ0ufsue`+c;-?5`͟[^6͢Xg"idpL`,^7;3ix6GN&n _!wvI("""ʠk6~/^JG oω9w=0n_ O~f/LΏizW{eg,>Q_S $òvnvcTFf~##@@SòNȾs) 44 k8a{*P[0fn$pS}x=V)fC5,fNe g8p:]&tllS]`"S$O9g8i8\ l]h:=c2p3dY ؕ+޽]w"""е \]wpo÷¬E W5;{fe铙0#T}&,}9g_saYU?kz;o,E|>6sW\̫<@mA燾;gh?ØœeCjXVEY@uu(A?gY9P[Ëf7<ѿJ 6Um3SqpɸPkW?)hU  :XXﺳ-XKVoQw"""2 &`ŋ#=45o}?_n7埿#hM׃g 0 i}Dr19 |p@s͔zwfRpan, 3>xb˿T<>ќ׋݄*L~rf08Q_tiN6i:u2]!ma0QX]Muua} |zxϯ&{9=@g]Y<[K᛹ź+amP6 ~zK-_{{.ɽ?x'~c<Ëooʌt3lmbioxsm-37ʽv0[?5?x5>I747oE/r'ot9w.k'h#Nx?+[ صnPF~9k 8d>#^|oIӦkr^5( kTGbsL}$T(,k7؋(`J '~ ?}(A23$Ȗ+pG`j`u<[ş?'h1.' [{~(M:J^w?FmYԾ5͞ g?۷煚צȵ`d{way`گVf{;uoиs{xv6|f`:!./WK +>l4;yi-|>Żr4&=8Y32iH?oxsiҜpogF, NU 41M^z{΍E6 Qyj$A9_tu2̻w{}oAtrV &OQF\'.]%}F7'# 8xj]x>oaҜG`vb^{{߁Ƭa1@ &kw^N]/%ݬL]|qfvQfNe M ~6ȦՕ*X&p&90"?> T<̜YK[ӿ/dқ;k hnKMX8t o8SUm7~Jϯ7uHOLyKv_ayU}LWyЬ:{|y4͙T}Sd^ .Ouu5l֚mTWWS}RB?xְ-K>St-9ao}`iVw 67`=o/3I3b?gm}{iÛkM1kCDP?50l|˭հw{;cשX4"Я/3.c9I,\y,5{<~ihO.Z) xК[?=CЯ CT"""""""q0X^b .-gj^}`vq-Ծ:n80`YV4͈zs!{1e\3Ng*#DdDI tC ozZ8iH о)?AAA b0qi7Fݴ;=/Ǯ2fjrʼ)ƺ\3ػk¹:T5Doy+վJ@'  B&bVba$趥LFCgmތ 2ԆW$?1[mcp"{9%*}:O47a)|,l "7pUwmpR+r%ܞd,+V(|A0Ce^_UZc_P n   2 y'hP_;:pX'@;՘c ٰ9舻Xϻ8Wl6w<V۟jbi"1XRE)WʗN/鱘%4V/K3hth.^(AAA82ĨD7 Uf m^ .VQԙ#x3h߀Hɫb&& 댿tRx)z\ 6Gc +~&&PU]f>C)/xpW%E0VAAtE\dU4:V$":슯(Po3Nf 7j0bH &1?d0닿'B+~USD0cM,zqjpq _:%/  KLMMMP4ZA,@oE]# sw\5POS[-ýpmڛߍf$L@Ҟ0s!g%,t O~6*=`m'+xXc{Fٻk*No_˅   ᭢EFUٕ7vJ2QnlZbL>r|b0f*mM#F'b4I8w׬,_~&F D+ĆE`qq۶/Wɉh=ӕ⴯bhraRQa0iC1AAtFV +]VIr3x4e۔8r\Um1Djܞn'==:]ğO">6G󑞾ٕ"_J_UCuzxG8iʥߨSݸ8m8!.3hvs7iy/s\̲ xi_KS>^AAA=%~ͭ\Wwiߚ7ֵk.biwB`&EEMdՌlgffN:;ÇkJ_ӎ^qw˿'yͺu똚7BAV'x d}fm>1}T%Jw34Q!Ϸ|c,qVAAV8&(̮&+ 8Z [`jKz,Am{A3mI.cyw5AL aƔK͆G&ehklNM֢?Iz˗Bь?Ux:3̀b $9U'|"F, SMcp04#0O}U|AAA&&PU]f>C) x5nHj+eMy*ة3GxR'ɫ^&& |Du}q="+ktśM9#zXg&휛1PD!F I6j FK}\c\k_I|vuWAA 蝤qEe3*=c8R.D ~ *isRۼQqF$pÌOSSLLh\"5Gѩ8AW}LP/T+  BN$:Pm:F~=PVH&& )~1swiq]fPL-~bReEpt5T#L鴁0AMb@i}VIWAAq}PiD `+eژD` T$&i<0ɳh.>A6[ 21J bMGR݉ K@!]-yɥt\#FX간S.C\:M?YYAAAV ',EWȥJUc5%+WȐyJUyt_'^Xԑ))N{R׫WU6Õ|Aw}^, [/N7xJWm`J'U5Dv7cI'EpR(Gx(UX,߀&O~q;4uWAA̛SY j6s_5wf#k kX׮]+ujgvv6333 Nw\s50Ҏlǘ+v\P1^YcaaXnSS(ꤲ'O"ax7W[Koր\\!$ɜ!0Oj*p詭 {Pց/rX   ".`@4U: g S"xzS}0'NMV  P'!v3ۻ//GkFJs{뤹7[)M 2UT܅WtK,z?QHAIhP棟B_1ִ2;{Go}`3_e2û˩S[7?<^AA80@[Kڶ&Fj4BxD.Tdܗb 856 ^;fC6A0r:FT$1V^pt$EDOxM[<8š&x&wrWrHtaW?Պ%;gY IDAT~;՘6ՏjOncu5Įcm70$gc`txX8m6l ]W(5dyL4#xiƟrwr?|߂9rvۍ| z@:wke\,[,ltb=v/P 3>/t$\os"c᥃;b.x6mᜃ{>WÕtRMmcp(GQtE;(Hiȧvuj>Modp# ªBrOFj#o*0Ucg`]>vuڵK.{epŏ*N?: ;V .x-8 @gfy̸۱3H/1Ն3ҊeK{9rW+_Evc[ ggS>333p)y>5\D]*>\Qt51U=n?MS(^?Yˋ*KV&کDQw34XG![XOs7? xAV'OSg-Fs?:cEpNߧ/XtX*Rj8(&ښ_;υ^Z  b*Kxy{wn\,L2ʸ|GڴsxW⽸FxV>G6MqAXED^ YoiA~#1-5H8뇔 /}]N枟n:)\AAN+Z>q65ǻgxY\[ \{ u;fyn[ˈ4uu®{DKs 3EB5Ҫи/ƭwv&e UUy/ߋV  ,֭cJ\AX ,-x)c Y;Ҳ#fme\p,i * \r=ܳ~?Ge>?oj jM\@|lW   1𫕆~zq/=Ŝ~/ޅaio.-@   *fg PQv뗰(n혢g ڧ. Z`~MR~Q~+(OAAX5 b5QR~\3nDWvF憙H R)}f5IlF8=Uǽ6c JO j0d2{BOAAeEfG O'gǓh ҤwO*Rueg*@iHL(gIUG[}XCe߻cۻuY7U;u߼coB}m ɫf&& ǭXA^+*kj@c7%5K]tu87 _ (z1O)uf"IeR˖|VMAAA10jAQEڊԃ%{cie$vHkڵz%-~Bk1ȏb0(++d gݺu4a?/.阍M&5y':Aҭ)mV=eU[Ma&'XdeJUem&5#SM(S#5`2 CIdN@5Uqx'ay&}x1cKg@oy؂/8b\3X@>AAA #{$OO /}xUb?2Cˋыv XZZ!OCC?H]EegK\pz茯YlvKsmɦQcJ(VYMypH)Yb.1na3X(1g~t SC1BwiXuiU"칓"rʍ OdB7:W?uf" RU]n'  BNd E^԰@`g7d"{{,4^z%=mRbЎ~}#:ٷ,qeg`ؗb PQ*'$ $"fڴ,;\ilq` $7-}.HщS-K6ÇS\TuGK={*{_rDM>N~ 7ߞ}m%rzQċs{bON/#z \+95FlGBn*Ǣ勝5̀ Ez'%)|t5x ]ǘkn}aK>[0\.p ġBlEsͿ   . j6r_5wf#k kX׮]+n~ieVem>.`0BȾ ߰Is7so!vTU}箯AUUfggS> =k6;pa)Lj?һMXR\NטvjBT)]̤N_nƚ \ɺu똚E*ɓAX"|M/w`5`(̦+qnVG^~ޜz֢vSUTUEUG QSICSm5U{l,巬QmM AAa5 .`+Z|7Θ˼ s92{{`ٴNjz4$VFQw5wVLKAAU4;`߾O[w DO:҃eLu~65JVVz, 7]ioֻ=1,},Ƶ﷿ųO3{כ^A  0AXZL @¢=fffԩS $HՌai=AAAA9! aŠ+(nAMA~鶗x<କJA(3oݤ9<./ߧVQOl-d?(^C+Po3^T.˜c 7]w%AMSN{CEy>zf칃w@<AXd jV%|w#R |?Q$Nט#2-OyF8uҧha f8)l!|^:1M,颫}|㫥.߅@ @lI@ݹB;=Ee2j >|80'Olqg?9|8x]UQLJd8NI--9|8X|fu~N}ë-ON&o31zG'7[7_s^W/)wtyF䍇}=:@߲M<8Er^z77}7{xY3[6Ϲ9JSv䙬(+y UM _?jh{wt>qٹlƶߎrGÄT*踉wɨ_.x}ڻyg#LLOцs믰_ugsT?)O)'mZQZ{u\P?< AQзKT“/ϱ&PiN:̄H~805@侷yv> #nEj봱+}>4ҫX J1~^)߅- pXg&<-?.ƪ7 yEgoB}VIޯ1P_⁘^QLTWAp"+k7%5K]tu8 . _O|vw)oISU>W^}iƵos?S7ʄc|:ܧ[Qƚ5+@'qçUx X_WDW6WX}7pC⡿%麜5žGvYc A_gq?~OxX˅9⥨ldm y,NkOUqĊ0TU7a^MC+R#+V a4>.Q=2mw-\X|:= عi$f`O,_JD{D>B836K-jހ,\L,T[P12є21RYj(du0K*=cis#ZMJ;Z<8L <ȿ=\־ OW/XhPd$lG.bnWy :Jeio**$PNEyE?M탸RܹtbtD+dDBMx+m|~Sh e|M @?Uroum~*ck9k>r9{P70,|'9ބLmu#R>RSDk46ubv;Nr7 IDATRם$L@2L7:/~IYt_1{Q=ηNXvOp3|~FrRcnwm)ίU qUU|b׾״I2C _pdzC͜-oTTvб7Ǎo}Kn( @E/9O\Y LTg1Ws>%z再k Xs_1dL7n~o+o-dĽ(hGVeAU<r6optOuojEDq}*+~˿EgrOjF#Uh ~ZRCW? ÷ràJӟ?7O8m**Rk[9s@[v|^?> W"p mj ɧz ije/&e:~W:~+x-6N3q'd\'_<.{{NIǎ+~?2B%iwkG{Hkb'Ygr.h;F=};ٶn]6ʘKeU,I71%1ԦT݉ Hccp\=-}- 0:[BmaZOQQt)娪Ìyjy÷Mۮ/ygPLV+=ڷj+uZUL84~v0rJپ '`Ǘx2p[glͿhŀ!ɸc0\u_Á؄O1P^^sn3ec?_6I|ֺ,窯B寫~(_-Wyˡ|,^\gXilNzLo<Dz@[?uƂ{bpO1P]ᨍ/#|5 Od5zۻ WrC Ԗpjq`L{g|GTべo  WP. ągr O\rEKK* 5_G$o5#XGbڣ+Q2c'DzNċs{bOԃhyh!CCC _jRv.&_w]oچ?J)cu eȕrcÁhXֶT\埯~xudzg˫v;S0>NK{4{8FS _q>u3/ƿWKkpwC= tE7#n>KaNg56+ mJ^|7z߫jX|fVr{Jl^R.jfESY;5ok׮Ptf=tPٔۍ̸y>?|VW@ P.r61߮affSOg^ȯk2yLaI7cIYB(v\^4W~tَ]v:i~ /, W'Uц8XC+k<_V3PXo2===8~(CCti l@`gp9^==gMoV$}fgg TV[MaF&3ǗWE>)%c8D R%uP  [? mXϗ]XER1 l9+XDWK;rݹ,="+ZKEǫtVIY>)~?A'tF{ ,mKvAXNƷ܏۱3^lv3iqWZE=*)#и/ȵu+[@ɇ鱰=醢#Z[›͘?{{ w[C|1~.x-ZAAAӞrVǯbęgHs%}ff{:;Çe AAAaUP 9^NC?w# AAAAXH@Uۏߍ]QL&TW~k>`;u[w뺯O13ػi7O ]_W|g}gyg6,~|-||c|r >՝f7 eO)2ͫ#뒥6ul[vpO٠4gY;IzxS ~_te@ 1> N7K}!'>bkB' s:DŽ2{+fӗS;M C})u;NkBmX+/rGN,ETE!:W(p|g<|+z#O{av##iJgqzkillDX'˺etu[mFϵm))I-~r{u%T3_u%6PRBvϯlϧe|J1c @QD2aIWbC̒LP0~E䘂r,¯ 1/~u+T*Q 5= 4443Nh@цԉ휫,O9Qʖj ?#t/f_*V +wH@YB gKPzihhq1\[eQ~HO~SPP_rUD`Ϲjq&Hoe<Xw񹰢YcAQ9 s3N>F>HtҁǡH:l,1y³aUr-z{xqnKy(n7$7eHz DK&Cmcװ kjK{Pi7Ӌc.+ɝ]āސ|+:s3M|WmMmؕt~pꏞCc2dxqLwJL幞~ | l~K_qIgxE 3/k}z*C,MES>b>J憎5Iɚn-pz08̷/`DUw|n>>5;1f~;}=^}y_޶/z-^QJC׿tc'Vl='x/?+ն⒎4:每_ϗ'R +JL-  7ħL@i䩛>~Ը o4>_D:&)z8hJ]I~є_(>w.O_@j*s]UCQTBW~r_^YI GjT_Fy6Lϡ_^V<ҫH/Dy⅞E~~%ښv+iܷ|-43YU.A~_$ɣݛ*C|3|o aEav%Vih4RP^GZ^mԕRAx>u-A>Զ5ae5R[_Q~B[3rf֏x ͆f*ny-s fepEqGy {\r%lv=>niˡKKŖ/`~Éqc1@mQ \u)Ʊ\{9|Cuuf^/gm\fˏoK.$S(`Ha3ܬ$^Uyn.uD<=xZ<3`0s^toUac|ZEi03xgWnȱ"l*7dK$j LѥN>nzKm.b.b.yeֿ~pJx4ny_P+.O\~͉7ͅ2^'cjL3䙿B?,J @Š"b:7ؒ㭯1'7k %/s]|/:3ogjSwiUf mcxi]c waG8ZƠϘB=D3rOP)c2 Uպ\xtB),xYp"pzo\YS1:@ [Zhbtx oI/?@и5U-X6 ?q+-J'㓫'0Ƭk[ll5~Wm1.gus9ۓo_̞JUԨS(2lByo3%}̉Gn_ϯkReI螺: yIן|N3~sPLxF'|⋹袋= 8/r񷧸yo_=C?k*6jyނ#<(ߚJcL9w޶4hpv^^3+eZR=j~(&EUC"c _jN/8:p@XZORg_ kG Z>q9 :_zFݫ#SM(SB^HTaKsP] ʄ>` 6d.21 î2.Z5?Xs{FqcE;xwB/|A<^P-gP!r_W媟Lm5Uɗ|f KTO-(-8h`/<ِϘTb<1ū)?ub>RKe'pxf,^CyvA}[wP/d0[`-TWN1E=[EQNphCcƤ9\oK5Uѧ^߀| w?o Jm]2>=}|brDž1B{}Q"먐~c[Rj n돻-G@ِo,!k\1|;\Wj(du0<7EGŞ}x- W eQ~bB,"FstQ'O*M ID$|)5=ͳ7 6cM,<VpMTuj{b{~d_=c@K4?kR|_*W/|L8 \Rz˧=嗷?zʿ4ͫ :4kkXS{tYg&kXMj2 9?r_QWs"#TO0jby0:zI'R?Ic~XgӉڃ^F~/d07SVbU=NRib9im ZGd?Lՠ~}y)Npjm n_K' di Sw J}]eӿ+.W^%9aAO's_+ ߕ0%Ʉnt/~J5?X񕸀 58بOR ' s\52&GXSQ ^C&#Ž&,$ xpI p`OF|FrԿ6~ -OO)Ox>r~=Zp_`snnfWNObS`WH(Y~~\񝳸`cԠs[3B[%r[ \ >=z&gqcFxYzٻ6NGL;EIV!(o;V:!8Vƴ$sO~t!}$y=d=宿ڻm0%gH~(W~rϽZGb pU8=9- nb S/ٖ2/ߒKaǘgI2$⋰&_9Ëgy2 &h{D `bZʏ/\>;׾ ,~_sZP)~3}~LL2 JdʻyOp]$rɳ>|o?sxM?ݩ{ow :?wBdR#Do}8oX]U=N?b}v/ ƽaW IDAT=n={=Mc>ײ3g<}/C6]_ l?嵏__~ ~{F}`'|w>_3۝mB]G >*m{4"""|kr] t<kE_G|wܑ0{; ;.m on|4!X~ <0ϳh۩!` Ѯy$>3DDDDDDD{N <5 wx\y,2/,A;)L\Gpk}}?.gU[ _7N]C_޿DDDD[1D #5(0AjϚR3]H}fí/_"""z iHXмw"rc\]m_(ZT"vDva_޿DDDD1D{ X0<Bl`Ue-\%\E\ʂAxJwWn-x糍սF515\ʰi=iL&8~WZN gi[uXI}7˟$30,Cx1r(PZHJ=߅^~?zKV?,/=p]&W![ex-Bc[ݮ tޱ\kv8 pe<7C8רRs!=#,p|Mu\1}Po-kKL_`ͅXoѓ)r|ʧT7RϷ,0ޟ+wGN D*V w1DTSڿf.M"i]*ֲwf=^,hiQ-p#!j8m]VH⥊#F'NtY%Ghi] 6S ptse'-S QBEHS$c4kQ>_ϿcjZ|=#""8̹B41GVC^d9Q2lIZw. ȩVWW/d REK36CkshN9ZK?R$ C` m~*R@;wsU{>e"? *gRF-I0TȝuH&­h2e&%UY}}`F]k毽fZ]VHyeS~sCb~T5HHsGduJ>Vsecj˧\7?)S5{[GDDDqXj;B0 伱INn !Y7`D/?G< vw rSKg' -zzJj2/SŎ7ƺ"O,>g5G=@3r|U_c'j: eRyVQc j[W0Q7!J&hόѭAXuG2R,%~I'_ 6Z:\\F^=h9>:O2P?.|1+Rjr/|]_ᅦ~޿_DDDd]gB5 `Sy3i`^.yÇ2ܰNW17TeYԽ44666p},,,QӬ%m+zP,^Ll!4XLYe'>}N^!F}t˃n@$dYFtWeȉky}][hooNO~5oODDDDDDT%-,g{{FH<.Wv+spM!M/#ҿ98tyx-v#~X!+J 5H/cP`)1]~0| 9C(;;9 YB$ƃOk#Cx""""""*1PL `}\%qj myz15 A3h2ЯAu""""""j1=0tte-tk+=h{7EGC$z*8gf~ӂ㈳PØ[!8srN! vˆy߃S"lrѤ[GS`#*YhUODDDDDDT%;!V0VNSTX큣.;ugrôެL*s喚-7|o+@[FnnAK7XDDDDDDDULH)e@V@dʻyOp]$rɳ>|l"&cssSJH/}wHDDDDDD{ڽ{pݪ?<x8(p{u q 2v-/7XJDDDDDDD  #HgK xg;'>EПA<W^~gs9SjR'""""+}ckaIKn#J, """"*0D GpsxehXl/Xl'x-+T%-@.W~rc0#%˻}}""""5w1_3Dvv0h<@t 0۠P&QLI@=JF;%ٲO5LvC| iWPkD,m3VO[3ZtxDDDD1PVt۲3nlAuSmṋιRɥ"SO巾k8 N LH0>5>%I"<аUG1Dn=#H$FlAu w$HcF*hen[B+ARǃfGd9Q{?QC:"h0.1(&ΡF`.ѕ|7Y*S ":.$1gnw#0$ D ƧZey>3G/~:NN_mI#^8et#)EI_S`X >5c0;JRzC5(#_9!Wk_Mrgpʞ@K &iwzQ %X4$Cuz5PL ஦6O /1٣nX BBv^LM-*CTC/i5mxx7?/k/GVt`ċlҊǩd q8<}cVI7/;(˟7+g !q_`:$SZu'mEIԝG.mO1Ydr kU=`byJ $}"8LCDDDD3s) Xܾcmŷmpffhn]m>ΫI(|sX~KMO¤]r|ikڇ`T(=)HHy3lNMՍm)58B5*g)Eʿ֌>_X}B=̔apʰX R+um&.+oySDDDDD{ 598 cǜЩܐ-ѝ9\Hks$·mhsAЃSa Ebd!qUW}ӑQ;xg DS C aw|BN&3I. h|9At/!WF_*EUG>]$уC~o Dx@XI,0'?%o(4-̷5^*G]G$;N{QI8jv!"""=B3O ~&T{|"K !`jQ J=s$zPq*x桨U;BNXAֆ=l:q hCY/DҘ=8tk_{}ʻx o.b`fO>z]+=p珈(߽{pݪ?<x8(p@{iilllXXXN8lYڈ1DDT SCDDDDDT+\˷oy1R"""""""jXDy y@DDDDDDG9`w&*vp|kK:)}A<njR^Na8~'뗈h1DT tPccvSp8XsJSҶ!)X[EJy!`r vT;ndԎSTݯ{='""""g e'gݰق9ܘ[Qsm bK/+;Dg0ehX;5D\3yY+TtK;EWڞ"Քo2lؑ61Ur+W>:,@-#5T3YkҸUJxUZQ{]I?A, CeȲc$CP4]AuIȲP'.ː#0WrI,_De˸ Tx}X}}X8ԡ$k7bgz.! t;Vwu.b=$ѓMC 5Bc\!l x8<"ຘ TS;kM()iʓ~G n$}W|1_3DOO*A`x:["#6oo \Sr)WM| !^ꗈ7na93D]]pyG4f˚ܶ=VJϥ.?x#ƻS=x'䓽(|d` ]Z][* Ts|j_omfIۛ+;f'p4ڥoK"<JڗVVaO,hil9HH05:ooK).+$.ݰX~41MLhd9$LlyvLdǣH-;V%""""8P1q=A7t]E7s<2PYVVq!(x>spy$e&4>*cq~O9=| qrjK ũ:t.^ۋ@-h P .}DDij&׭|1{]]@$ `H; KU&HKv}n`]2`G}K ".xIꗈj,s-nr "\v@ ŌzʜmAȥzͳm@'aLVpvj*!2 §2dgc춺>i8ng/ /:Gpkgik tPŬ>>@,3h+$լU:$SZuG$a` L#OݎK{z%/m ?D)=0tsQ㧈۷y 9ˁܵGy57P5 4V4%5 XIjwjhq);Lhkg7)C|8'*k}x$Ge/';d5XrNb域~*%p^/Ѱ2/Eۚn8N1eRGx1]dm%""""a-\Ʊh#=p۸5t*7*b.$5Og6 O˰"1*npc{>+2ڌjO Št` D4׺ +%4q -PLȤ-!O+>b1 %Pqr@v_|R`F)V@M15~%.fwCna}D#/\Qu<q Bd]i6w96H~g=|0@e`|9hBa,njB4<3e{ y(*rΫ갳mm8܃ͦ6U>B$ كC'W l[*fFߏ9ࣇ޵}8~+oSx1X c1xJHieEݻw:GscXpC8z0)+QB]~#H%Ꙅ,OVqBǛ11d/3<а llCelnnbssOtt|~# 3S+M2͐`thڇ/.EDDDDD`HeZk# [eK'n:'N{Qe"RɩqY;(51ˎvW#e APKa?{QñxgǕ׌A8f ޙx[57#TvuN~x) IDAT @Ԙvu `ϚĒe9~;v;QAx?v;J-eSs_+p`4"ϛ5 fό|6Hg"..f% Ow~Ig@YRhJ)t^ѹKO/j`4+XMz}i(v<U=*3)#1w,VhE X[]ڲ}lw!@V_=u?5[<ޟg˜QR Fk1v2N\xg5n $M̙\!l x-ʥÇ@k.z g^[?;1RSo|2-˛Gl֕o5[|8xg z?E'"""""v]۱NB*GGm&$:aKr=>V׀於9Zs /4#[nSSk$^!KXk ]V Ba ZT|YEdCw{A{7l&W㫭_#+qI\0v4v~)=❁*A>;Dx<Ι\> ATȕ,zH$Hwjv0!!Rk:F W&XC1t'R`X >@?|XNw(+R> &iںuɄV@NUYwiD[Hy5ݨ""""m0^HY uFEBJv_$уABNC^ X0|Q#&sNGF[Z$$v^S(/VIP:$SZ$aN `fChl5W6T?DDDDDm[ !/){%7 92*f$Ƕ!$ly2ܜKĘn''ML2 @Bt Ɋvͽf.ʻ>%+Nq~,#y QDw m{ў tHr w`Jl09&L.bA.-Kh[I퉑\>HVw~Y ,7eee@=^#8BElE{2p)b+XAKͩ3qI-0&P_ ׏5[>,01@SL™nT N?b>+,e^##CDDDDDl3P9Ȁ+3.g?|o\Bs x甌I_![^W:F:߿|ck!ZM7 XkԻ鏣o=x1(eJet]~gˏQܻwwޭύaCGPzo !:ɲh4 bM2`͐PynXDDDDD1TI;xLT²H(<-ʐ6nK~a0Ff U;5q q 5A;G| -qwV~וg{ϥ9q~87  5j2x3^ˮ^knGxc׿q0" w! zٕ,^?u,0oxaX 2jG@DDDD " 812!p=Q[3KkKN>#<"!3kq'F\ID}l\Bw2TT*vxg2iЧՔ_!(Y{dk嗝>}u_+W>[ӧ/z#տ~o.Ǘ~4Կ_W+\&=ʾJh7t=LFmIGKfr%q8"! @vv5Bcr׼#=iozA$FOfm ]w,ך>QRUƿ4X+4T*/@B2ݞnLY ˼45$+.C4wX2_["wxf]4B 0R5c|K/3*{mPiɕA&aOSЦEU又 z_ZZDUEa+M#dͳ ⼴4"( f Fd9 ]-f_H-p9^SMdΖG͔--خB_m,M"iHwfJbvb)2r_~ʔo3e$^%6RrjDuq c]@(?"""C*!ڕ 4k(>"4S#*R YNau puH6"%4D*elJ<>tO` ݰAĥ ڳ~x0P,hoA30?gL:y Mj/H~ZK/’Xl_忿%\XQ#aHAm?Tnik'# _T搰gp|Z}}ʿlZ_>ul@n~dxnHP܏l[T૤}g *V4$aW]?Fw~(hطw&Y&Cv+hFDDDd7sȬ&<ޤsDM&`muIm91M5ΑÔjۀv˚D ;w9x_9Ѱ2Eۚn8I2$׀dEp{68r+ALI5`ϖ%/Nq~s4DW[?eʷir Z}w&k"z>SMv{iDFAH3 @=78F-ӡ_0 Y| 1_ f b@Ds^P̥;~ 7_ #ž YGE+-?c I\k5 0$ $RW`Dx@XU_>)L Ӭ[Ej|3P`WwuY}-pG"""&P4%֦~&T{|"Kì=@-M+N#Nccc5`5{e'bʪ5Z !u}yGo}2|"""jLݻw:GscXpCFoZ嬽ͨ& }"\QbF.XgMxLvrd6@XfӽQ,I"w ^ۖ8<7nN!`sQQFDDDDDDDD0C2KʜGX\ph?0"""""""= """""""= A -n ¦~}ܘ[Qsm bK9{yu,#""""""@ls;Gvu?6AC)Q~&ۖLgoNWȭ͹+ IQm6t55Qw^}Q|FA+yU G¸xK؎hn..\4ށ/!g{%|Gp!le Y!D9&{rꙔ!Gp ./BxY>6 A]?|d=:ES Ook#C񈈈PEL ,m0XI[ BBv^LM-f{G.C3xG*T0=0 Ď юk3TH&Hóow3}o>OiY+gpl~;:""""""j1Ts) \,9g[߈BDDDDD0D Gpsxe hXlŋN6ApRC K?PזM~Z+zU+5(]BDDDD0D A nn% P,@. 6hIdT)@DRFN@v;S fGMd9~;H=ۺ~?7DDDDDPeVt۲3nlAuSmṋιRѥ˜GcL⩧BKK 8t `U C%<{fsw8<%ݖg`h{95mz,^Y%=<7DDDDD [X1 ) nrpen顔(mK7ЫeDqJ$](`nz𚚨;>(>bhE O<'>І͜ &Rn,GvdzX 6.1PE"% %mKX3xڥ߷^ەW;- 8rhb0tg XJ+Lֵ1Ow2}&\!""""*C Œsܾcm%660>󛏢jn~Kۛ e]@`p7K #/ >Кma!oxorIΛ֯IIK[/b V km}J ( ѧϴYe_6ժߖYK#2U|]?k Gy,S2dYIbR/Xpc 5*z]`Jwl2+#` d&OlW(HZ}١~na .X4s&[CrCDg;p!3ÿ7Te؂G){f0&{̀ :;u W3tc,'`3uˆJV-|ڃ{^ijk2ֳ//l ˉW#i @P&AH3\B=_Σa}! N`44;Xɳdz6ڮπfLr= CT3l#ڞO=_r DBj%+Vj9h'858&.nŐ^^ޢa}L&h嶗˟2K^\")L T"}k۸oKӏϊd"8BʼF5}n9L}e@Vߕ߾d/ˀyOp]$rɳ>|.@n*u!/g%[Y9hx=f(Ny6|ck~5{<=RDMërUt~!n 81SVۉkr=ܽ{st>7> 8LkVȚPNNcaa@DTv<#k  햝 q9\'[xX.DȑQxZJI""""" ]3)c3?I5˅;z fDDDDD{W+ABїs,%"""""""ڦt޽7>gKG{ 2Pf lll'""""""u5۬=.mnnnx@UC=mKDDDDDDD@&X@X,Xl<|)Wp ވ_[Eh X @fޤ8=t%t^Qr}sV9\K45ȤM$^O_=|} ?S|;oUziz+s8 ΙoTjWr~mkJ#a Ho׏t&O8I\|\ǎ(OJ8++MN,\u+jzN{'s8ޯ&}?Z_M}Oa_ ~`|Z@Js48ބtLv{L8F օ$籺_{ g0-]5h¿ug_|Zډ\@ Cz;GOs8w L9 j5O/s+ȝM\{8V%I\KW!i|q]'r˖+/Ji?/g?I%""""""¡½6ęiu(4ޘxIf? /9>au@;D%8 3#Ni߁Ϝ_3?(1gFv ~-o~e\gS3pq}y9|կcW엳=K3!Y}YV?l*r= l>w_۷kAǨ&)s.1c0eY-dkss3y=x<*򕯰hϻw޽[9:⇇=t G <^r(9deO7""""""`0{:DDDDDDDdX\'2^t:;4n@PrÇY[{@@vޟMiilllXXXo#""""""ڦ,""""""" """""""=\iy"vX܂A 6W~ACl#fnAWl:LxKZ'O>z -q>DDDDDDDUjdtW! 7<{Frv,1IZ`bv"XR\qȭL51[Vj$w qT[0qbSG#eq8LD{u/(?Fasa%v߃|cx`>6[mE<߈jo2>j/ï~?y_o?Sf"" G17 Q0 \Rnl4F-lnB)4hf Bcf\nQ7vWG,G45OY!j|e,Bst9w#_ LPS>xp*WqЙ޽UEA-ǣå>^bl.,G<~l<[#G{5*6ċGo-~ɳx7ol"h1o퇓{OcmEW#4)^~K{ck|މ3;G[OڎGEbae£zg:CO\>sO{u;^-ޏDޒ?mvj {*"QU}U/wO_Go_z{r͠WGzqw}~m|駟k o&+=?KnD냈;ѺwJD"2RSnv}6`4lbW `JP, )`%k K἟SmUU!psd݋׋wc jvv ?GV"UDb H:a{x[U}` \n/Kۭ;u(O(S>)Z~pwӖ?2DR_GĿ x}^zU~Wphl(*D_8G46 ~6k @-ԸJҋ~ ԘrJw_TUVDQu  ("?01e4Wk @'GqL*;sx#[z,5`tGՈE$Vpտ2:+4ط!qSnҸm"P!h@@E"O^&NNsɯ9i`v}7O[N䏐WvW4G0  p]jI n2\, R.nAlx'Y')ffi?򺔈R n&Mƞs9*[`}.5Ln @0p?&) @ܔ1e v}#qsN`r / ;;o'.qݸ.V UET툈׸oՋ!Kx?ADnDwމ4DQ$zE#zo:UQ#tM=h[JDi@܄꟤SETIU}+uUCH1J'w5SiD֝r'𜮋eӜ2qBk6 uTBЃU?邺m\K7 @`ӌ@OO@az|#F@E↜z@П:4ODa^TZ4?0IZMlND: N}~kv5 7ꜭ' TXdscE?M玠IENDB`muon-v0.4.0/subprojects/meson-docs/docs/markdown/images/sdltutorial_03.png0000644000175000017500000016573414737503617025703 0ustar buildbuildPNG  IHDRN#;zTXtRaw profile type exifxڭi7sY`?CEQƪbVfw!w_˥jz˖-~x_oG^)y=|{߾O7Q _C_ ELWSk_}55o7X]O<_cʟ$ . ~719^6%g3*cTCT-AI _O_ oO0o{>kRߦ~⍓%Oc?c]|'V 90 }_a1Ol|q(SW8e 7diNM%ڻ ;cbOD/?z{!h1'Č+j"-[o~OqMDeLp,+G:O.q`| |:v3Ph$e)UCpo>{o,2E eA2FɡQRɥZZʨZj FK-jk7k{鵷]>,ZUkl n:Ӄ71L32lOc>+jek'vmm{pHO9ӏqInnv oQ/Rzc5>ڷKIQ̈X́7E!:[*JdEA#XnGwqs9os #rN1n?,܋Pw 7VD3̭lk]]5{]';!s_wʴGW7a}sl`Muǚcyo;>;G"^3ȹx2aŌ]k@^K׌wН*KvOQn<'g;,wg"2.qY6k'd9 20Fxst}+ s{v,\(<>AqI rI )qqY+FYN넖.4$ \jTwL̞-Ƞ6Y.VK[+&V͚pg8$ 7Ƃ$@VwFN J]+ AvJ,wȮUoc~G #Z{$zU"úZ)• 㼃8j+wƜUhu>ed~KR_;K?,xn5T Dpf8kG!l&I&R8#;^=e=,} aOֶøQ"IHIϐ08%8P(&pF.J%`ٻ^|U#M[)EE\u(HW&SnLXov^-Wa?R9]&NZL bG'P; ”m1/;:o7r|oݍ'zaQV@J5.#J \1w )uFxھwsĶmoTz*ѻs7n| ܟ ߝckYYG?[ :(8Qf^@ |D _{%>"˗-e[#K³ψ}ߍ]rX f +"[vyz#9r_›"hX<<3L2V 7 8cݤ6:eznPr AƻBtQ]rRXV_菎ZPY=0?Ȝ͚$I.r" Տb:=@hr 3dd| 3qQA`O&M7AAb92f$!B&_*$*v)!2K*QgRl  w4ﶤ4mA4~ΨYmIBV$,)b=F+(mD>0)̬RZgBXa,}|E ֚&15h,du=MH,&ٖ6:{!T#xX7Fb#L} wS!OqHnytdFE@H(!k( }"6$%1SFaNdCU6"Tr3At0̑$ mW [AK(zCIN*&=; qJ&[KSV1Yf-Fv{T rBuLCHKV62 rB.ɸԸH %G!qi;a(+2SUVQ?6ηQ&VDd.NLѹ.I]ӃUTF&޺FN#cpcz {K:Nl,qZ"LȮFq0\-\ik Ƞ)Q@:+e䪨ŃˁA>QcuN!N> 6k>)V'YdV2VLl0+kIuxuA@T&ynJ H z6üLIî[o@̚"'ј#W&4K{AkPO.yG`db[kd)&n{Slef!8Y +Ay֬`_ϧ}F1 m~4l-F5'i1)P&C4pr#w<f"*cIuRW $7D{y.ةxz|rjF,~Ajwk1^0 iGLis^;z^(F%ۨ @X_tO&|h X2 N@Tj Q<" 3 )"SL9D@q@93>:xS'Jdq e') BRC%X,l?FeɊu9 SQ[åTȱw< YΔF8 wZi3Y BC0IkNeixWkxL݇p@"BR}FJR> ]Y-$G,~[$$n=2B~s;@l}7 Hu8*p81t1nK6T]N@A X#l3bjP0Zuf+NS!ȌjSI 2Mԩ2 g ŭ|dUB2N2H=}k.H4jdrB(@h6lZ +H܃;qH[9V+w5r<4d@T KUraLr[+W/@8zDuF[fD󎪽O#>5[\V΀HN.{XG%A$YahˈNGBDɑ(YQRNQm@R J & j.]9֥ع0H6\7{_b͌e-;p{FP"VtikKG 󞥶 iLqKM0rTm#mIB_`igx)wt.4ƅ)ڭLUPYl w,l>ٶvWԧBc4Q?HN<ԁ ag4,h[zs֋aSq#"O,Y W)ڔ]E Q$СE gB³2x"CJDIIۡcFB)vy|'`}|fq|]=5)E^jUAd0o>4q"MMB*.)8OS.X=C2Zr),?XZcr\ hJVW=GXbre4 %0X 7 س P[H8h <|`M 0sK. C{15\PU ҄ 8sG$ y2¤I5>D' 8 hdf(VEM,vp&a!T&750vxt@yS'_hӠp~#W%Y+0*9fCa"z!TFzx!L.3!̑:Fth$WȇAP[Ljv9)exX+AjǬtebz[*QN¸KGgUZJܵv+K~ qaSu%2Sp=LL d"y=Ո#t[ Bٖ ZKߒkgbaڡU)G CE^8d#>Vzvr- +"oM8|Jm@L1IŬH}f~eJ0DA~xA@e#Y2pᨧ6I*۠дגBjp!$$P{qSnӞ_N W0<-رIͨ.ʈ}3a !u M ?\ U;{ijmSxP0җ-Vp_D^%:R+jTCXE$hU.DksY$4qNΞY"zsqmbŋOP::'ԁj"unSp՗$Ez~r`"s18`iw%@GN ]SL,[j0zjXkԞ:trcu:JS%3RkVjDt g5{Y`qJB0쉸'?'ER|Y6V G8r[WTՉXDl"UMb œxEA4: 9.(htY[2n)cN,I$bX7F}@䑶(RPzX,: H;$<7!ty%d u 2\iQK!j\#kVe}8ZLf%v `ծp$tgL[*cj51ܴz,u3:c+ WgCXOPpt^W۳LၩuQ[I[T-SjkjP)I΂x`ilþf'|8o"@Ndxj1G ,r&LѮӉ@NF'eG.ϙʄdv;@glKJsme0 u# 5AG/i Gpl*BokP.D"bp+Ztt#0gٌXόi"]3(8L'51ur,r#UpGgnaA-豆 ཀljm9dz ڤB̯Dh/={۩:b(c^f.&Z)2 n@ =$( --LY(8ps@Lpl ] P 'S8+kRT` Se =3T_!sP7R2*.j|GUeh)t*:"%R M$D(v{: Ĩ5QԦs1NcsgJDZƔd RG<;>1(Xne>M?ݘu :R_&nSܵ".Y憎P7ҺMse+8d7BTUx -cCu|bj謒[S3+Ue*oo]Ʃ:3a־@!1)a=UժYBmNHfKɍu";Pjԓ UQvVۡj&R<mNYUtljP(sO.'eߙ3yt! sxɑǗLO8ЂzdQt*$Vt)\ʷZx[I-_&= RC2tUܓXӪ]LjS}qcj %N bY;!X@Uc@lP+%=T@>ul JuXyZ,-&M:pL"PXA WF%1} N=c{Dc`yښGY.fo k^̞vaȧ 1O _ 2 fBxb@T6Mږ(z!gw ͷFHДJNG`>IL Lch z~)[>znG;6Etz`DOA(wxJm; wmp$!6\sڸ.Ɖz 9pFᛩG% 嘚U> [ڏR4S{XլfAy3zE}m%Ρe&Djf0 k|V#PU MqMkgL2tkJr6ΐ"=L $tN3A{ȥFyl@woĸN/1 vfqy+hӟZlmM.w'C6eW E) ^Z8}ԫ pp({=}տrxbsl iTXtXML:com.adobe.xmp h@bKGD pHYs+tIME u5W IDATx[lg73L滘QA,+B;,(i Z-"dd@ڈ-ΊH'+˒ߌG|_es8܏&ϰR;[{`s@zțua>41$B] ?}'׶Hwq#s}H4^i9Ӣ㕈_ȮdJi=ήd*VHo\;⍻_w\9_VזDѸ;r%Uۃοk{##û49wŹZZ~ߟ{Th?ڠF+~`z?J6XR@{?"Z. y.F~qVpx F*yҭq;^I˷u|g7}xjbQq6|+LGP q΍{Wx)Bg7pwDF )|rz-qqk굽} ki>>3t1ʪ&/-|Gk-ncVfEWK6"YW{\SUOp/`su_Z:ֿe?~Tf{9 㾣_nsߝq~]WOهiicIC i<99;UXcR? iBΧ)>PX,ޯKY}-+Hh>=Trٝ'/ww@7@yēJqd8>1gy/\oqeZ*E/'ǟj z]q?FʠE3WROp۬<ˍƭXpGPbf%+9 )W\y|8SQZJ۪E ' |^.ލVzf×J;O=̱ۧUX,2Ӿ.= }f%dT_"""f(wu\Yӹ˽3}tq=I++Z˚|Sa)xOs#|9_y@bv<ϰHߣٙUi크 ^>?EvK@Fq2-}e9[ksSTWSتv,֘Vyy 6 e>(;8w~q7>~K˧*@"*/@ :ҹ3Ԧ5⚍R$ڰ1 ~c --a/%3x+Г 6~,F[^nH ` ,ߵo !o{Y'+}Qa1W -Ư{ܱۧUXt4VOwC <ǷFDDDDoDۏ`jyV ].#S;\y/y -qa#F~{ƠrCw>{GF৸Kra+q#( c9TkU=eA0@nu8bdK4c}8W} ~ӛ Rqk}7λ?JR>-Uiir=ΦfwϙMDDDT!;Nt;Ӄ5 믿Ư#޹?6_ﳸi{##(|w7' H;e"""""":[y"""" Vi"""""""DDDDDDD H1&""""""b * """"""r__6kz"MDDDDDD@҂B165t:E"e,eVnp~c LNdֵ|ADfBǷ6ktWk] mi_0|>BV08o{^nǁU6z'ٛǠ 2=J끠n2[VTGak_V'hkk:7[>""""7.e}| AF)]3Tf} Gn|(ӧD swx >pL_2:diyܨ6x'W WULz<%OW̖c:"YZRM.G-⩰*kl c.x c.8 >vayL%ۿΪ*n~7ju4mi-N w"Deڢ^k͖Y֯+u fk}zS˝hfʕ+W ~l&xaͦnK4ˆilKwR>1C̳P_B21W gp H>jr>X:@nCpޢ{iI90ox`o & $Q(Ł=#5f&~.__n10@Wba&i6u%GDDDDt@At`$vSZkn*@>I ^y.y(ZEN wuhRgUu @IB?V[qHʶߺOWm=~u,<.$q gݚ#"""": ҿ+;>ݡݺcgwYULh ݓρI/)L+Jiz38.z8~iKm^#5[PB$X׿^6^Z~DDDDDD߹sj0]WOW8}H+qӷԣ$1 :RW'.ߨ)QOE Sf0زu ͿEo~sR?fyOуhk0]W bZJNp{^6X+C=bwTu e``މyۿu6f˗eKlo> \CW+?`<=uUvEHfZZWU4ʯ\ހd:}"eC_}oϋiOڻǖ^kZ]wŋ_o5wZ@w~sޢ%""""jׯիHiN H1&""""""b MDDDDDD6վ[0>S{Tk8N~-w~PطNdl08@DDDDDIk<0hȶH7+73 ߌPgHC! :8oݺNz6ԉnDDDDDTf.Մjֱ&PUsaHRULz05Db[OَHflquH1Tx:}a7 b%\cXH/`e)7s$Di/._j՘σӓ2cp~L_ޛ`azZLMq,N SrٖPZY-5hʥ~^כ]DDDDDԺ@Z\fgCHVÈ/{,!cFkS("<=4=Euw8 D qqbSnؐDA/aRֆL?^AҚ0 l%cKK8R|tkV>Y3Շz tHev2f XBԴ{˿Wε6%э$sjpU]O@Gs$v6FDDDDD ^x~oގ.|}֑Z߉k?cӟx*g:O۲;YDf4[Hfᛩ<\3Q5'XDDDDDDD ެ@ZNG [Tap{ ӽ>kU<=[H[l@W0mmmm[ """"" J:F(K4©)-:qՇ럈ӧ[H[%d =>!up 9U{a A>5uR$EFSUA\y+|Wkz@8 m E*Ϻ~R)."ϣaס7%2[qiɜ,mmԵԚ6|+郛XUUP ",\U˔Xʈi1C̳P_B21`|>|>BrGR hR$08|)Q9gam\ÝVv @`\klތhm6q}f +"O;[fqq%A4rAt鋇oxpa D/ӗ!Ioue>dL/Oa MDDDDD' *+xnڊ{O?\MFPNML'>Kj3>̰*;{UULz0ɚ"""""}R5;9'CA:{0kltt c.c|#-9ۥʧvk)߅2͂C_^1s" s UV'dZoD1nGz~,AiLڗ18od+%˱7mw"cN;?XWnODDDDDoy ]!YA}!\ǘK0R=+!|>|>%FK>/$C)I#1N4@lo Sȡ>c=;73M,oU?Ŋ"c麳U@ޜuJ Z!'$Pӗ!hkk_G[[ /A$\J". `ZQ < :-,w%.I @HH9x IDATȩ*u#f8k>%6H$x 乤[rN~| 3ֿ9<]Q zEm]jo6zѨ[v^ a i#hhY>{ 'X*P2BA! W+-N"#t1YaxX[Nauyt;ˉiMXƸ{a" 8q q2%y(̿`ymo/n z'2?Fa!cjD H s cSIѸ0=?q>JOJ:Ra4gafZN$b}N|R$7gmwNz6ԉ#ǭW{YD!a)ɷpQa95=7Ʊ|g [@XyT /(C1S[]ywX-[__Zq~,w|eUav1Tl ;Edže;?\crgxmߔQ9׷&߿I#M@û>v_l-ҮC}||{ ̰ᙣyӉdIGp=)-zNA*uXV{VB| A46qgb )FCFO?Mt2lbTjז ~O2Zg˅MPϻx @Qް/ՎO}W?U/?F0o|Բw p-s=}3Q=$3YdA df0#p}~Cփj$ "?a\1W퍴cx8)td$Di#=LO"uFXW~[˜˶V%TfOvb Vz,e(MëV?TiWe]kd478oo!3ڋޒ4^hDE[jn*7C@"fwzisY2YrS@=VfoPC HW}f+OOai@~OW8̹ 1SmoZJރm{,b9yQ97v|a~%"uܟh+OVJxC)ZR #Wc7f_NV&3 zPkjO{}>GO'ίV<)jOʹOd/!!B-OMf + 0GOt@ 1ϊԧ詍T,nS)~X^7lSw8EK몟Z*^=U/\5oܷY|'dʵۧVLB\ֆ6x'W[۠͔Ow}²N_'W+inXny95DϟGefUM`NV?,ܸj)`ŭz߃v>,u9?*=՚%ZgFYyZڏVd]ȇ՛氓7o8~55Οզ7ZhFmY ^Sf}__̤m/%.>]~oqz[m^;Qs3h0V DN~|| vɴXh!06w }T&3ΒzRx3gs2t{;;~ PEO+N꧉;e_*_HtX? ׹r3ö C2uZg>qod4Zu?\ݟ,-V-d-WDv|kXQ 0z=P9Wo1H)B:T̃v3z󷵖UzO.lO9/G B*ݰF H.V5/q|Z8#4s^i* [z/g IiPkJa~I˖c}}> 񏚛-\{ ':eK&vF1: K!`w,$pעNj~/U럛F Rkg$|̷ )`;bMGc}vـ'$djBxK!ֶu&qՇ@,@a&j7uX/(P5[u]dc*Bc<@&gAjpz5R$$o<هGP1^q'Upǐ5LU^tsWӖWq]Vf>c?볷 {b5bu;rYztnI0FXt'c)V7F{lO6ݖwpBP ^?uљM#3;#ZzۧTu=BWs ՝`^.n~o-V)zg*;:OqOh {|H;?Lo9? RwG{!ZjQ#0l]9?s|_lg)oOuMӒdl?{d98g%x֔߯}yi\ZJþh^bkGZkQdaG:aKN\asl1Kz"0iCIjT/Uab)3%ʚtua=ԑo4lƩ5B|3-cӲxK^G&[~.tע^ԟ!gan@N o[q UB/nw5^I1#k~/^Pk|78}}_՛:IDt- ־A$L{XfwacK-ֶ>a ?\_ƫW(XnhV:>A4|=#4Z2:*_IDhٷ; ڧWRyRE-DDGѱI&""""""jv DDDDDDDH 1,ӈH)tzM? F""""""`7mt00lDUs]#q""""""dq0@>_o g;ʍ` JGPW\@lʏD+?4ODDDDDDtl- ~pg:1)f0\."b7@Z$x V0bu ߚz U2Yn"""""":FD=χ}fVVzm*=ucMDDDDDDti\g2,:Rf[XRC]m(>.BѺ&"""""":~4$0f:+rÁr5FfsDDDDDDt|iUaf؇5!cZ7@ R@Ѿ$kHW F: ."NƈtuZ0k"""""""DDDDDDDG?v- Nk8B1K4\^ik zH c97މ Df{ Y=d&zy """7^;҂A*6! ,73 ߌvCkS* S> '4)ЮmrܼwV'hD+q8 cYD4Qpa,Q8ÎHSosmklh:A0 ]ar"f b3ODDDovȡ>5Z]7;#b_7pVULz0- RrT f!v7U3NI42B}XGFځj_* DK 1T at! ӻ>fןNrc5[r3W[DWK4Sg%D7c H3851L4ˤE h4a7 bUR`{,e(jIBZf#cQT>c>U++Zg?Sǫ~)󃃘`YH2Q<T;GhET9:F#sf$=V ҂NUa =1Uc)Vhκ1(b;N;:vZH-}li !$+q+FojG I#(|>|>bS@ 1 B}} @ຣ1&> @Te򬄌F]4 (nqch_,_N꧖Jw= g7Nׯzh_C4G!Ȋ6fϺm3ZC8ŭoۧ^AoUg`26$0B ƳhkbrU=g3W˦ruzobهr1 X-yq>s>J/U59Y;c.xE\:5|DDDD OC<䁎΢M%2Z,'9kouW|7}! V溧rc `}vYQ;?3UZ;^:WE\U"na @2-WwCoU *6gx6pLQd.3tl 5ZT Sf(ibBLa_o ]8оhX ^W_-X"""V9y ,@|鼧Ꭵ^_T@_&pע]l~Į"˯ifbZs7XsA @>~8;~oF[x?ݷ{R$trbч 0z;屇(5[u=LT io?Qdax@ݢ!\AJ3[w:{m]}?39vQߌ$;#A 5d㰢[d+.თCI<Zֽ&n@t#>mbG2ExHkQ_܅7>,z4x~ivL7;׭J@='p-ԉ!>?Q3N0:aqc9r1ZŲDL +Cf޸-lU zhjW(-[l )˷򈁑K=o9ߩ6etY:GW}wтwi 57,2 f>ϿdlHH |Pd| ׉c/U6*rnT꿄NZe Rh/$0Ww@ê(S1kwNgoA̖:o?n}xeW+P"NA[}rTFP}JO=嘆bct֥2i`Y{zNz!!DBAKK?Rp*0*OSz|( ȱkMo}0׏m9?#Y"""V^<_ 6xCBDDDDDDoׯ_իW OG$@aM9 _&DDDDDDD@пG{]ưN#][s|;_؂tDNKDDDDDHkQ%x \ Hk/:b}|| a|>d ge0+Ӌ9NfeԞ^@fo{ {IVA}T5af DXL~Ϧq*.mr;A |M* jfj^K@zxZ~uAWMlw5ἴvC!Ȋf͘)ѬV>A оWX? 079I-U~z)FfDĦuѵ_mIX"R%rJ^E|$]LNmzI| Ł=L z'py` qc,*Tu [~  ⷱAWM|՞^ &xn#"""":@ J6x,gevYK%-ȘK ]^#wHf^7V*3汾:: Dы [f[4Ѿa3 ^>.m1i v-unf3<ӂ +; Rs]u? +MUNt ~R20{`Vݭεqqc/ 8XIue l=wkN.)Z2$2&""""j5ǟRf/Fў!&+2BgSU:`Ud.skgoAKfҢoUMZԋT8tQђsh9rN*Zct:wR~Nʍ,!C[V7S)VEVL`y\4[PCĥ%:=Qx q%y0[ r鉈E/_/o6,}XDDDDDDv_ƫW$=;8~8Fb_Xt zmy'cI@@=ѡÿxB7߰6n""""""@t G$x|ޠ@Zpa!d AB$1WF)˜5Aa`W(sDo˨=;2"""""IVA}T5afXu7MT\B*w"ĽXUUxb{\DRn;^zq^:BDDDDD+HkN-Ti4n@ q"eK#c#H:tQ\>c>򕶎X>o}ʕL U:}IHTZ/.H24Z[7AABwrluuC>q t޸ L~҂<+!|>|>WuQcՄflw5ἴvC!Ȋffݶ Rp9Lξp }#~c!Y\vC姗"iaO4@l_W]a jYy[]RDw>ƒBUp;gpaA ~K A` Oyg Oob>&v#JTn}PO?Box9auuƁxE\5:8`BL"4oMI0BէZe""""""W;YD!QATjHtM[sZ bZTW_smna]\éNt@;Bt=ZU].Ck7?ECio2Ep{q]Z*GX3g:Yzsw4h.@JqsxAq>ŊШ' íi@MUsx}xo4E ^%L%#z^&Ɋw뛾G$TNp{ 1<ԏDncGx81?XKl 9]5@U\.0>Iue l=wkNKڌo-{؊CDQ}N2^v 7{1T i=7Y8-k^"#t=-ȞbLZ \z 9*"]z%F:k!t>iI;9'c(V(7d ]o͎$ Ch8L+KKz t{FGK8,ao!>D9^;w8/:\#""""""ׯ_իW O /wsI"""""""G4>#&A߆.7?J"""""fMsu[¥%nd""""":N H@w]c H_D=/)f|("iӑC7]+~_<0WFHMhd.,aJ=3U@k D@D:!ih]g碳[ J¾pKIZf ҄hr6L=?6 7`k`ݓWeUte?]]~׏$c>>;gV?1f^J4h=&҆a&&nXfmׯLVYUf#\`M'wYD)dK'Tţ K~Uqcpe:pG_l\&?]..fu&T[G\Sl ?;m]xöJuY{ҍTISXI]<mx }MZjj1jo #+h֎Ci9_ rC޻0:~J*stsuk=:H˵#/NvڗIr/!i #dO3t|,]V]=uDs,6k^n2Ïܘ.Mr}c_Qz"S I̸J ޭ:nZ8ɵ򱵋e WW<&z+5-vTfeHp=;' 6:}+܅z|%袬mD|U|C_ngfhwҨuzU敭5uT-*M '<+*UZǸwy.;cj oK@q\U[{^CWva2z$0kkc=]ڵUmJXlSUV`lwWwfh«/.?Gg@#7?sg?;,PLhhat*KkնuSV]훾~aDY=%q/K eR|w?c"8Uq.+j+{0LWT+x C CxB$H@" 4$HiH DiH4$H@" 4$OUԮ2ݕiT.7Wiݮ(úy*mK9ׇe%gqStTWcίFNĨ[;Uw9,[OXLG‰Rg+ϏTIVFu%Uγ[|oӾ~DRA[J;U `mHn3LӔi* O*.4(fKGhUg ZV~vq"?p0eB=dj^:>?&#.76l)fbrCϿߪwu^׸+>X{{@̑ޏ+tGeM{J 椗7.|CWWeYxatA1R+^MF7Kѻȵ3杜rAKtls{'b&tC^+k(:ȍxq*K$H,/NM5᭦yt@=~/zozEVwrEyݚn 'U'НNfZܾv"Q?ΣV~ Hnq7ގn{ևf2FЪao*^abGN8FZX~$ 9G9QI:k%^Cw._^qm(An9+.0yeK3ea۶osgzHԏIՑ\S4M׺}ODὛ__Ihtv˼ߏ1J UNeOꪗR!x[>79}Tu'Fکatrm)/[O&QpTrާqٱ`^i ݰpRtsq2mu_վ/I rƩmY/jo*j d'$Ze.~ڿ;z>ߌ+ijh<%U2'B/jFov,V|$L19NYXޒ*f/K:jUH'斥52:LiL~Gw&j?/h =cDz?X/y ]mBݰ7l_ucտˏ[c֎Z]_'ۿ&9*wy3PNz{})%zme#ЩIo4^.wۑk(g4Cw$XEeZ*YdrrO ŔZʇr޹FwP-)%UV￯ގN\3_Yl/~\1wp%4x]Fk+H!]r/!iwH7:8 58mNjhNh(n"?=/W-.,GcUgۄ)UKvq2_xeo/@n,3i_n׭جpGEYiӮ'jJ.ך<<1rw7^9R*UBj杣XUKVd26yRPvNouuqnΉlt+uRڿ}3ݪN?N֔ef{ nW.EI[eG<-+=ajѴ٫>.m)o*N͋_ew}7ϣEv \59hEd[q9ʪ7s{P3+VTr^5ڿ}*e*~TO<g:QxZwiouCnji|M_~M" '}.-&!$H@" [MGz\vܮF*;K2ST&Un^J-eG=idKI:ˎSu*_<\Eר3I.BLGlV٢-TJ[W.,٢lׯZIt٪GifkPW9y^W7bq<3qhhAsFmY3RcM+W({ ܘ߼S.0ywx9atrp^+bA};OtYvy 0?y+!i$u'BOp?k?1W<;aRH7rN/μ_+abEhUIﹽῳIX,4giDtvTf^ުU8IbXӫmaU|C^KEYi5zaWL?4L1](H1R%]97xo"HϮ_u|}{ڝN[s뛌.Zei_8y ۷o?nH餐--53P7<9S^X2O̊܏z;5NUܫ ~^T>3쨚e9s ๼f$lHJumgw5*mK#zu]{-J{=\%tBv%G&/f2kE #J;ZkJ*\"oy]ՎM}=կ[;i*.W=' ]$6MS٢-TJOZɾR#c'S ^KWSSVnq&UvC3>Ne#ͼ~0R:JҒ>j|lm˟ޗSEo[R;U*%2~ؑ*usl\ku\F_|V*[fcn$wVˎ w;}^/@}h{p}cR7I򤠴sŋ,Q ]*<s.Fef]?Qd]umL"LRSϪNZPXޒ騘ΌXU\yYGJlLvdԄhΤmE;6wU|nMITHSIڱdx}#{ IwNr~?k?+s5ʲ.&yqh,Mj_ qϟw?Q5h$syXxNatZky^CwNlh[ FO[uܴ 'jG9w'K +*!Q뷹ꗦ_reUrZ@4e&LᡓUŜGw" ^i)9bglxR՗v{^CWva2ly7;p{kK@rK~+j+G:J_ڻ&=s꿨~Ͽ9+^&s/me஭bU |{SUV`EЪe5ri9ZyQhz7׆Ezs ɫ|AHtmeBCoHG]o_8my^o߾ׯoQ~xrxa*m?=%j덽q|<3sG ">q?T|20}1_z8  {A" z4 qiv=&`DH@" 4$H@" H DiH ޑ\z)j3r% C*nJ+ H\e KW9'VrS%FNv]"D41HN%Uխ4MmwHToۮ~rIc!ٟ~X; 9WHJu ŬLӔi:^VFbE~LE?F8vi}5{lQǶm^Ca%ws>&UnOL #kKy*~Tכ|󺺼q*( ) Y6&*m:Ju\:5,ĵdvUDۿ}k_AySUڲZqU_xz^WcSg6ݿRfDZ=%覹ei;9<9S_y~ :;b ( }gW=xVrY~o =,Wym|\TIV^ nBvQoy\{y ]R~<~NiW$o^rA=տ#|GnMukV[Id4.鲷 iWvq*^=y"Cl1 * [E{J('-+ &qy ^fHGMڷz}=vtJJNfz)wrH<,’#lRCebn.''Gp{Hi/!9wøێX|2tnK ]%||G~8a)up$5ukq*$XsnXfm2]?<\u޲[UIn4X{g.fnN 23:9fhyvZ-GlFe:mYw#W>D7uzKH0۹_ĔZʇJX\vf~C =;GJCtJпڧy(\*L'ݎn$^ɿsb^Qo녵UfӻUǝU&sאef?$zaw{>OB9FC奯ںN@ȍ_WY0hbDp/E][j˓D\P*J?JNjhAnڿuuyn+c *V%(8g**'Т.ttQVکILt]NrVԏk~g9ʅC.{ !rWyŜjէ?>nhhrvUVzj2!RYG-86U6Քt*kEXu[/xjEWW^־ԃ WUΤO)9weQV%][ś-ukaR]Vf像?V2geu$Z|ѱ]H:7\Er:4{wQ۷oK^+S%][QҬxD#!^q*t{^rO ҐHxԇŽ +žj1l;!&QSZKTI6HJuFLA:g1 ۳9҆a&CS)sTRJ.JvvRʈyR}][Jn6 nO~*ʯRKO3rq.ڿ}QucdhwP{+9ޝ.jVihKwV}Lv<ΝyL~UiNLGlVYk%rAb}"}?f]ɵkD:yQ̹S杜XFNiIS͎wV}rvm?]yRA57w =(XFJ{ ɹkJ<ێX|3# $j 9֭h'Tn^'6ǯbuЗ~x{`xb% uKrKrġR=mSB} i''ז/ϟ? $҄iH DiH $H@" 4o8"DM4jFJz[rRFTvTrU斳;D:Wi^J@?uu2&U;5NL #kKy*~ 0y^W7Zk>ˎҬN^}|*usLְ.Uo[GnIr5NU=hjU~Q##WQ` ;W>&9ժT.+-Wv\UcYf_ISFI-8Yz~Q3~c5ܰ%eUeq*DΪ,V1{^D֙T;2^uݘ7kI/ڷz}vt*pb#i㊹݇+{2R%][@ a{ IDy'\hlW׭ipTcŶFs*GCqPA}l9gua;%>&LR]V^+|#arcq9H\ wsnMfm;.J;Uv=I]=P#Uu9ּ1Uǵ牑s5A$ΑThU/7łZ= 'qɓnGsz=ێwCwNlgsV_YU훉OVwRq´\-+W5uۿtAw-5OO(+<O'hYqq;VmX W^uuynKy/0Pqj^,+x͌~}= W}|/Z;Tx9]F+"+4wފQVeWۃUYzU틴eV&.0PӥzJn?U?5ܘ?ɵ_ ׺K-~:_wS/O۷onf菐<W^>xu4o1 I?&DM4ϟHG}*J[vE]bU|wR\e/~/MTWVZx\+9Ώf 'J^ރkVQ #5q#;Yо(9:H˵7K\\ƿ]ȉeȍ󺺼qy+;9Jh/Ύ/H?~k+9COdgtrO ŔZʇ3K?Qn,EGR1N뮷eEH-7~\1wpk5pcGNNz:TFJ޹ $҆Y^2y9$x>eCsgi=uX@n,\ ">K I*#u;=;^xL?UNU& s~&aМ}AQ5;{uVR IDAT{V$9~aMZUE^:gxQ/IGeݎnm^20ptQVz8{4 }Ht=A_=#="sGC=/-쪭Į{=]Uze>ry.;cj (R޵*?j|5tedZ*?}W2pElV*YU֎UT=Ԇ(姪+nqoB߳Ǧye`OGբY|?xvS&#VYZW>s^Cm훾~20R:)C ?aKq M)s!%OΔ-ȓ-66"cNySBb{W"U ;f%`I~\Cxrh74$ҩR]v]͹J[R*m_eŶ[{lԮJΈ|ە~mUB1 q"-_4ef]$oTI^`ۜ*ʼnuU;6e7헙wk2MSE}_u?x7jUNȶ+ys5хNc W>SvwJ+/Kv1;.3Ud+WԞiƩ)tǦ M"Yf?yt46>NwW0ZuC}T[;U7؆kK;T~Qى1ɩVrY+.{I\[ߌ~/M^j %mzeۏli:~Α 8*Gߙ~gU*pm?_U?IE׺ئ-Z8ͫtlC$wV٫ί3\g㶌%ۜ?zêM|V->^ ZD^l)=tӓ<)(ܬW<&v425f:Eغih'T>ENɪHrAbQS|RNiQl^ &uLLΊ袬k몹[* ϙ]ȉetbX+97}5o 8IW/%2qn;boe!SSNKF9r:H'Lʖ>?:H˵wz`]q~{q{GG{ݚm)v8QE|Vyo㑯oK:H\-L' Z}maNN}X\{}c6I{NUfġ+ʪn\u7NNɘY umWpxxr/!i9cEU,aoUӖc_Nvz匑FB{(] [ldi|kk#7U]ͮJ<zlkaîɜs[k~V*YE:?V__XjN5;R=PREUoOҊ?(s^?x$ ^o־2.Z vۜUD5ˣjz诚yJ21W~u^ڞ\E ^k??Vg8~\m훾~;#\8`ު=%0,OK;n9? OG ڄ> V`;EN$*eKGc*Or~L-vhB4$/]/I*nJ=\z){sHTo Dy4K~7όz_ _SLzL7{7 ɇg~eڱb\إJ*|q<_"%9ƯH?[PR0R2L '-Wϓa|?qab+ys58/Rk2$KG??yx{/_~'JG 7|u¯ߒ$icRFV9(;FeoR,kRtsVµ:uQ5eLΫ6,j_g(P:,~|7ySq뙫h`p aT}gu=9GW:K>:o~ߞəL$a|:k#].KլLTіg'9[2Ye/2ƉJSh'Tltae~"Vh_uq?)XTI+8D/~WSAif&~O>MoMvօr!v<{h+M"m'190Ư(''y?׿SKBOl6;}0w$ ʾjnռ`bFN,d ^ރ,PI/lp{Hi/!9wa#&Rk^r5RBgy>'QE| #LlNAZniy_;9Jh/R/Hu>u~uw=֎UT]V5<L)z\x(5tj7rq܁C_)/yݮRHj4 ۹H)VK(uGչ쌥lIWvw>DiO=X~U-)f=ip$Jz|ž~U_;MdkI26{&$ 6:@n,PNx j;U:s$<>]UY$66>GiJl"j1G/_-1wGo~kIa|7VGCk':nZb]Ř/IGeݎn{ˎy aTiϾsb^8뿥?~nn:*~Y<,ϪUXg18XRҨqU姪Е] kh~)jښTı/-Uϛ]}T<(M\9~s+ݫ7ʹ7m??hԼǟm/bcڱ̚+2Orz;\饷/ݴҎn7fJuYy.~ҥN‹OO?Va02taկfu+ G&-&9Eϥ8=2?YR5^#f5X Լ )=敭١RGyk>~siW{IUvmo85Ո?KdyӴ/yMRrO ו2:H+Xn5uL}?o'暉ɵ >;;m~*ߗ<(Kլ̆7LT~<'$'߽nMfmKAy]ՎM^:ޮޭ:R%tb_ '' ޹myB $@HpJ+ pd ` S5(s)H`A3SԀ'F7;ҋH=lCmr^{ a[,s'5(X]mc~#-?DR?B'~VWgڇ-{7c'nSU X0ѪwI>`t=S?JB 98[d)Xz Y.{ p`:ӽݑU7?gvs T ɦ'kB 9/)>Lvw}h-;3fOWrzó1 CX(mrK)0GLc? -0GƱhxe~oCdH_~?\Ersq"9L߁=he1{*K1 O#(J?Kyf~RjtI sCr~3:Cm K&C}ˏ\~G AVl80&6tBb%1,O!'t$ á;#08E]тi&fL yg.o6ѿ*^,ZmSɗ?ʿĿ寧%rgr,ΐ_lCӿSן=ܫu4J۪׾/>*xaބp?́z߳_CEr߿ B OZz=vڤϿmOx5[×ߞ^-UPnNthR0 Ɩmq9\;?qe_ώawyoS.97 ܰ˶{%s߷`Jt'N]O3!|1ϻr3w:-u|iKYk=~߱ܔ kڣ}_wTt<%{oY˚3c:y N?.sΦ~Q>-2JkS#\~{عn̲}?̝~_ZHM?mD:1=s'Yoe:ˀk䗴$ :Z 'N٨&7* /?Hkz6@ξ]㲯~Nm?eb`9$7/*8Q)NZEw\"hsMd6GK uwDK5P@l>1.r>P2ml۝'W aq=J<.W -=]ӎy9`L}6ҙO޿N>%?}3"/Lo䀣yzE/v8w:sgyfC|_>}W}^t}G-?~{sZX@T|/_>+g>3݁&@ZB-NBB!}$.&B!H'B!Ba M!B!0^E516PB лWmK toZaE֚CtJ.á׬ѺLg%UZ6INK!r@3?QI;.u$ 'kȲ հX@'(˟K%B ma Xe0/Ox:l-rd/lB!ikE\ ^ҭI~PqݞD.ni\=>"zZv2ۓ6wN pcu0ݪ~M^gvWu--5x#}`2ޝ  @[}ױϼ!Λ}ڝ{~DHJJ;e<()fCW.?~˙^[߳_B!|@C0j~PpX>˨%y+nz8®*s}>EH;ȉC~gVnK]Ml]Z$~3aaaOr(-he1ӧOTK[qhDgNy!B·*V Y (Ax`MIDAT9\[J\J-Nߍ9{`o[ND-Ԛށ4[?iTWƬ˟5ۆ׹ܖ>~S?02E(7W_kBWhѿo4o|/aKY֏C4?a~/!B@٨\\紶4O= m{ΣcKzYP,C4_:̶'|k!7XJYˀK˙쫟3Jif M8.wOkQKWw;Ui_~B9/?_?G /z94Vjxh@CΈw=῵_jxԱrQX:$~S?/<&E>B!wzEk aaNE! p[( 3?B!$[ݽ;.Щ:CQN<x?:oB%B[믿RB!B>=ivDB!B! !B!HךCt &J˻oJ.á׬}J tJ#v( ϛ[teT%4Ð=>ÿ9C_jքnߙtB&J %if!2Tf O=6Q[q=AuEZ{yZUȲ Yݳfp嫔dcc}үu"jh=eBi4%ߩI;87;l{|X_զ`PqIwx}/|^~>ԋexD扩IzҐ7T\}*ԚhyѴᎈ{zz8X@&^,cSjt+VK&{'v}ԚChyj)}ѡ? :v'/;VF-ޖw1d,;z# 2_Uǽǻ<:&Z{l[.c(?MGT pcu1W~pGBm"QG!4 Ҳ ^RjtG<2z#;I51>ɿߠ:Ъ~Ci[ v^a6w<`.?_NTcx ]S-Aguei'*}ta20aPCE`t uN: D`>n6p`adjW|QU]~M]7}@QoBA}aWfGL\Ix切e\;LE4nl~x}E7忓oo׾Oپi8(|?~o)8K8C1w,.!kxeɲD^m-i\pZ&*:j4JBx~}C{_=^U8dAt}YU 5H]F rD/?j+!A K%ĥF/[˔ROo"1ދeUg0(jkE`0pՎOz%׾>̖?>́|!T>[~{{6~OˮG^;;ٻĠw68فQ!>맏g#mq=RP|8g_}Y/}?cJ8^0NMKneW\E`iby1X!&Ý Z Cw,9E\n >!`w@rcI,{Z>OQ[dA(v%H$ +%ne~KOa_|;)wĿ_wq8ٽ;=}b9*+/(vfSןsY/ Ӕ囅~#ZDG>ogqtE5~:Z-YcMݥ;%QGnӏ|$X.%⇻'1| :m6/9>U'/~?=.ΩhOx5{3̱"1z-Kkk_>v>>[T*W^[,߈/ǼǶxY3?%+ +M}?žO~D廵}H?ggCyմ|e2]^pM'^[oc剅m3+˧$mw8*۞ pbbl ɿ >Nư jBM'Nj 'us} F@~epyQ֡-Ƚ‹(HX~'=;.1Pq=cه+S x_ -YOȇX@&^?B!ti^lACs%tV>tUS9&mo_Dc=Z.v͖P$Ck\O7n52?MOTN#FA@Pٝ51,`("`\=:\<|a[ث|_rE!BH-햴:juPngq^nKDAշ]TFі)A{t9,˨P.=5u2 >@eYB7o- ߬L5k4 h!UZsUfOyX^hn=QaX"r.;5i{?6PחrDK5P's۞h/OԶ -@;N;0:Ѷ'|k!78;k~"w/類? *8-jw~O\??/B!BB?z\-ENlJB!B> ?~N݂Pm]3фB!B>G;llD OT&B!Bߞji7!B!r >nB!B!@B!Ba M!B!0&B!BHB!B! !B!҄B!Ba M!B!0&B!BHB!B! !B!҄B!BiB!B!0&B!BHB!B! !B!҄B!BiB!B!t4F* &J(5_E!BmGn04Lx |V B apؕ7 f5` +;Kˤ} Yk!B!J.ZZ,ːeM0L2TGGw̖;Yqݞ| 6!B! _cH B 7 ?K=i߅_Jht"۞jB,y6kfWPjtmB3@GɗMJ$ݻCk@|N{ǎwQE4##y_,3w6B!Bȱ ]#=i~[D/a[5䶳_Eǰ '0ýO?-?J8q)_jt+VSB!B!𓰜F& iὫF3 W-MgCBߜ[Cx0i02\G?2i93[ cϿPkBW߭5Е9Zo !B!gLg!Hd7ˇ-C>OF]Uw='OC~^w4Yo=* /:CM̥q޿+nT--Xg*ۓ%_m{Σ̿e@mz}~zO5 ?vf/ k3!B!,LkM 𫏦$iB!Bȱ,߿҄0&B!|@~Z$B!Bb"FMB!Bǿrnb&:;IENDB`muon-v0.4.0/subprojects/meson-docs/docs/markdown/images/glib_empty.png0000644000175000017500000002127614737503617025156 0ustar buildbuildPNG  IHDR]T)"IDATxy| dwsg%!4ꊢQ-ZUZT7uSV:JK[ElQH+7Hqd7_dv]ή$˲B!\".(" .(" .(" .(" .("Z~" HZD'҇DzTڋ'uh>v!oO?)w]KKm6& !Ҷu+)wݚVЊ^3JA}Oȱzkb*/>$:1|5iڼr ptQ%M}C-nSQ }.c2n$ynȏg/mZ$I~;>")0{\$I_[+ե/LWxKzzJRٱ9_]!Uxpf#'_ I.U[])DOnz(=QKk99OotgKsWy?ONlCo]r=zbWڴcE3h\IKzOƯ30eE T띯m!.qE5=JDSu?,%DfZ]x !D`ӗoG_Q 5ojsۦa k2ӢEߞV7s7]*Dw|iT*7ޒwNmCf~@rπ%kz~5[CnpZt֨m}^wn-Z:W}~24(k<<8~c\(?dYp 23̎kFFI=T4z2GUn-yEc{0w ,]?zSSjWW懘u8/ڰ'3:6x^KtІKYӟ&zyx(" .(" .(" .(" .(" .(" .(" .(]_دbyg4)IW$4tp9U[b=0'fOϼoa[5ll{Fn4sBCZ=gb<\K>=+F vѵq_W$'ϽaUc'~L M'T]tJk=aB['IOI=ggϳL1g&CO|4Z,ժEEE"ŻQzoK bZw,4ͅ5#|i(| ZO"Żeu a2Xb6 6XQEL@SK*9N3O-5t[ҮT._t.3q.U5g]!̎lu+xi=8NLoYYn:ϠwMG8EcĘF=6VqN^" .(" .(" .(" .(""E*Fޟmգ<%IW vm8"E{=G=msd׾ҠqnfY/pi|>Y!ΥvѺgDFl='4Ο1+FNOTu3tJ)]tMG3 ! ƶmzdf--jce\hCPٹKZP|Y,Shv^Kۇ>dcmYQNzbd2_Rȱhm|iE9`r.fo׸ 3&]KB*=#EZRG- 9xj:.#&~QgyPEt]@APEt]@APEt]@APEt]@AP.گoW1boC_tVB$rov:)]'\У~V9oIoaݕ廋"EM;ƴWE}4aon ˄"E6_]{#ɥ{!Vd8|v#^Eg B$+KlDntKkVr]Nvn.Fw)3%Ӟ{kL2zkXV73͏pHsX,>ОuQWϕ}3B\;r*3t@Y[0Lwl6GEE=)/l2LaFT<* T϶UcnH9I1Ok{§U–G{yٲnat pE+ȵ1RGj79".(" .(-_7mrډSM`o p$^/WN_z=V:{vׂ9(8Uɟ.jvMv+^&CijBj]7j)d첬(Tvѫz{}坳|¾=הnUK=PT= }ㇵ%Vftku僠ClۧBc8M.l\)w-i<>¦R=k |9if9{'_ݵ轙G@.7l$R7-!FG}v4]iBK%{ŋyqcK<}&`~PZOkwƯ1bk~3zj^%Iҕi֟@]y`۞ywIMW˨m]OoKߗqqEã'Po}*60[cpɒ$Irq\ ^>R PL{syݘO>Z&ODo[K 5dKGTuSm|hɈua#猭k=VV:_D{;U9fE.f_{RfB>HZ% d,IϿ蝿bZwl64 ùKZP|Y,ShOՂyVmfTAOx1b {-[Eʺm tmfsTT(c6 ZOQLL@SK*z~1W,Ru_^ܴwJɼӷ~ҵPNjO%_4Ozw.v?kE)uꉬGN]KU^Q胛_wj@ur)MCJUl9d~?;smu9M;eJVh:oҼs@M*u13G篳0 nA{m;f!rRSwO2~ZiM__bXw^/i6՚@a;{I/åujuѣB#6X8U<9f2PgB(-g矰ztkvM&1QQQjM('h=E1e2ZO/x=?ݵ\3BȘ}O8Ip{npӷ_Ί:}Z6kry$@EjũR7 *6/x!9gWvU7.n*Rn\st o1\M|j]" j .(" .(" .(" .(" .p.گhM8ʁݖ^zr.-;:.p'8!bv^轢Z4,'zujN{[zϘ\-jcl~PŹKZP|Y,ShρqlFשƏvt 7Odcl*c}Fq8A))hzIC b橥s8.yKڕ*rr ޚp&E*̴ !Dّ}et/80 2+MHg@]kic|: ]@APEt]@APEt]@APEt]@APEt]@X]:zTǽ$I=DH]>;}Av̲^\V} S#u1+FNOTu3z*3k=Cwu]ٴGQanp2ſolߦMn/ݲbX;V6͏r6sX,>ОuQN?_9}L;6QQQn:1(L&SXQ)%favYHF3}g^6lt1.IOP8Pg~hII#(gtOy ("G$IQ˷,\C?C ?#Ig~黆zqɬBA2xF(Dt"<2;w._ϼpK;ʿ~_zmW#xCVCwϳ\ y'tc[¶I\$5-]N<{arȹQ$1`,}XKC{6T6's45QLe0@aok]#;xwOڍ_ p,{ ~ݖ,D֩s5!3&w}]+ܕ}o۾;?A(DΉk4,ҳ0OZ{ue{1?t3Zg}ջWXqGB=ӇܫyD^6g͢Ϸ :^Gh&,0۫ƅomߚ";vOګGfzCv$![=pna^,x"C_,)=cP]S9|)V<^.o#[\cCBKurmU=ᨯ%f[~8tiv4b=zh <8! mŸ'^krS&<]RbN\M|~ t+y 8aO9Yz!jGW{s-:o7p禾~A_4Z'׃~~ȭS<|]xp(x q=7s?V^3! _n} '}XW᧿p!4p\a9?z~Vc&UQּ{ppo|$~.Um/;k1D"TM dŘ+5SH1SIդz9s.Y K(K)kkڛo L-jkwo:uչ#8ȣ:qguٗ_a+jog6HN;njO:SO;#kYs)]W>Ƨ#$)gdGGƋ2@A{VW323-1s j6#ogBI=^c,诲X'C0ENv69 1w*D1^ew?e`ZSO'y9Q3i\]J;ItD}7BYk 9hP6=hVJKO/iqZa syMEa{sB0Nqֺ۝fWK38 }PB,wY&~u[W=ež4g,W0~*$7ZM^h6R'y>[O0yDg&O-Ri)\tJ84Y$O44Uxp b,7CٱI(&pTW͘*UEUOdJ|Ҿ ꤫!1WGrO507v \) -7(@SHkKD]7wx]Q~pz 2Kl,U?B?#N义?G ˥'nϕ6$I|=߈x/HZAu1-}|eX %ۇq1tZ%9rGJ+>@$C0Ψ}$TsRދA#F φZ`ʂp'G#ߦArZ|n{4Ur586'P "mI'@n`zP?Jd.TD }0uSx̐GD !lf@N`* ~ǀ yeL`h6h6ˮhok>) |AkG кcBy ٞTNXn)߸3gx[uT;eYlF=zr"p @A Ubő<` V(3I!bETE1V4,7XL AndAH@ 7MqHu~EWYwA n|`K:~Nwˌ_ *aw#%K0B@ @JQt6ʃ <H[F4|;&ZF"U7b:ė@xW|6Yv6:8u5`Fq-0&BK*Uw%3sRsiEU ʍZ&#Y; EtT,2"4ՅGJQ'5Tpi$r4KM #Q,2b.@{ R X!ƾ<4=(aAta+vfCDFA |&o(hQ)~Z# .|K3m (* hjA%XL AA?cl4=&1L;n]SL7h7 k|̉'Cfl-@Ke!Q)[So۞e` ,EeNx'P 휇Yy XVmkV "Kv tƪHLjt"<8-:u CzH_H4E\T $H8\Nf JCa ]B1ҁɬzKͤC'dE '\ M as$|"mF4&l( _n =!ZO X3) C! <`=ѱ@GW[IUvuV@-oEp\#$̄je)+5-aNw:U?Dw^.4꺁PAKu=QQ ALDEw31PM"%$,Ӏz`K V&ʄ`0Lݤ&"I2 ;_%CԍPgjPFtp^Y2";DvsE&cvĎzHZBِ0;aG_ @dCX2М4TTDVʪ,RPukmH>(0O>HZ:UJ:Zb0NAPfA4/R<@.~AItRޒ7fDA,J_Gw[X XqмԐhCZt!> W @X;Z#g _wdІRR Ԋ)mñocB|Wϑ$1~5E+y|N¿O`/$`!֭ `JNh>*x}7772~v0`Xwmv_0`RDT>Tž?yZ0X UF.C8m`=x n 2Dmoh͈VQ`nĵ񼲤 lhT횸ibT1C6۸ ~`+8/72X-qfǏ|$j&ajde 8Z3y!efۖ2B~ʘд2"t@(w~p$yɚ0-Ń`xw+-54Ӕ&sዙvde PLpTuRT8-[H:kӨ$ׄdVpg$0>3Թo~?M=mEif yA^Qd+n,fS _QQp-Q2$dvZ .9XQۉ%jh@=N/IczN*BT2CYB)(h;JЩι\- mLd,Ж@rHeqJU'AO0:5QS506p/OC8١ Mnxlթ$'G`A$[Xo]X-*xkSl%(tp93*7Uڕ{9t2"F|Zr%HD~Qt P] 5S&A[ҋҬ@MNã`B"W[dr$$`j' ؚ_[$z$44OK{V3tϵʖUsa+QRfv%J⃇ݼ'~^!L0AdO>ݪ3z}Xs!ЌM&~xI8{_L!~^xH0P݆]Lz^bW?WA7 IMϤN'ǩGvT@wF=EPdv ˳#FEM,ΰ /-9R-cLN0'H$ܝ Vkc 0#i_Vb7~k7hO9YRL nSpQ;B@ F/l+Cu@9.L:GfKJy50W: j榛:-~r!B{^5v=Q4c %SR;\J‰ЛBX{čf /Rɔq_+Ojt!C͞i@"W._dHs׆IK;Z{_|h[*1Ggw'UQCˣ~J#T-iZ` , H2Zn8@ȵ&0]\a H'C8t/.dn/ &^D#6>;ѼA?~wԯ%/+>xEN8CKK Çg٨888[PDZݟ%(I i9ω=V&~~3ӊwZc}o<߽r{eN:N+3I˶QVbxZJ?l#Y{蝯ӥ>ѴHԄֱcky>yZӉ:vrzcwz_{RIckB/))y4`͛6w^nF )Fuxg?˄ Ϩiǣ11D l>rpٳW 999UT^.r7<@ff&tR6o̸q9r)Y^$ ɓ'G}D'spByg>ѣk/lw'N;wͷԩShll?ϧ>)Ə׳zjy@B8rԻrt{i[9ϣ+GklG=u瑊׫:Ǯw=mZk-;wzk?z}-R{~<.o߅m;;,4Mu8ICC#Tu=> =>2DygIi'|ŏO<-ǁ0nnĐL|>21 O9{-Vk*J0Llۊ#PbטsaxtȈXCI҂~<#TOטdϣ^,7Q=Ϫ^w]O}_J\P :GbZX/^O/%Ozx*}-rSFϟm;8j'M+~/]N]r2Lϧ"yB!. ˲BJrr @4M"iUeGWrGjB!D6PMu*hQ<~味OqDZQ+*8E BqD"C|"ăm0:߇>bpB!s"FuTU0 >ߙ'8撗zTUB!D?UNbYWQ<^/III`•$K:jmB!Hz?' XS,Kz@]cӦM#{/)))"_MMM>|#G1oK 'l_3M]{ !.syASS7l۶|1ٗ]Fzz:AK˲^o,o)Ǿ*t]qhC;v,456bJY[n;B\Kޡ+сu ζ-M8ZV6[^PY96vȑح x_wց8B!ZZZ9K  ;;{"iaF6IIIu] DѣG;s(bٲe8C `$%%efԩNee%˗/`СL:KYY+W.cI:C}C+Wdtuu˜ѣ7o5MŋM1z(|>H0PUN u#55XJ>cW_y%ɧ}[{;9XUŰCIJJE!g5_=eҥ^*Ǝv0~|tS7Uʼn-aF/YBcc#wy'~ B%&9D{@l۾0ؿߒԀZ`"~ =%Ϡձn )h_@hkD?fsfm@gg'Iɤ-I-'b|>@#GJqq1QYYɾ}pAļ'_ [sv̳RWWQ]]͎;XnLa>;$A; rŊ444p7;?[l_G%''4ټy3+Wb۶mg^1J c|>ؿ('n'vq=>>-Nt=yoy9999|ΕO|+!+++viӃi$''Q?aTWW3$鹕#Vw/Hh(z,HP⡂ 1ƌ3~ouV*J[!9nx3s$ꢻcmzz:---~ 8{+WǰaEp8pJ>*<> d>ln>2> = Q__s=Lt 6yUiGG;vdǎC! ʕW\!Cz4MXn-dff2qD&Ojj*qF>LAAs߻2RRRXxKp1 zwU!̘>y-[P__ϫFFFW_u>pY3f0zh757b 4McWcvQEaСxHMM팗!7nϙ8aW(++B-_N[['N$99uz;vp!3g.]].-e֬Y457j*,b|>=#4q"F50 *du ?~<@ZVYi\udffݶ}; )) !bejPuJi*ErUў铼 BMV5E}몪Jcc#Ç P%KqFy)(((J~~>QoXEqq[lFUUG#uMxbwYuuuC<={xk*3#55L0Sxp={W^!/7_Occ#?/@4TUeƍ$%%qmnC4‘Yla%K:e _W|,_.ӹqBtRlʂe hWmSU]M7{yrr2#G`޽\w~6a>ڽ\F(QYÆ [zO'_Kz*Dc%d>ɶqnFSSe. Q muEs'܄cOXf+===ns0D"lC x衇˻.}QUUD'rAT(⥗^TMߜNW_4Mu{b6S&O3h;OiI x/aΝ̜1ÇS2r$@}@ɋ/Lyy9|'%`ƍ׿O???QXP@ٞ=8ÂYx^ݻyg2S7ă={0i$Y^q|^/ox:t(_~a|p ݻUUtuwa߰q>}){*ǍW]+VW%|>N 8eD@Voyy9&L=Djj*uugf444H![,cǒoA]]GEz<j*23ٹs'7pͣ^|;vʕrM?7kuVUz9s,,> P茇Ro߾3zO[[PRRBrREEED"^H$‘ Z 0 h撝(PSSC~~> nimqHKMҭ@"2Vx!:0`9ԧq(4BsFԣ3& ӈݏfșJ\zs0ioogmM7DnnEʢ*jjj2dz à]7 FWW@t8_8!))f%\SSáC(W+T[վ׿={P^^%--ӧ; +3f݋E:e PXXGwscXEII[ayetttw<^ii)_s<%%%DQdeeƁ9s&]]]>|ܫ:58UՔ=谹/?0l޲[&L~v|^/e_^}H$BIIIIÆ ':F"??#GD"0eee(ʵ\1}e(|>6mDkk+dfdʕXo"RwNϊ>9:Gi46o"3#:=Jnn[YY:3z_+Xenov|n(ɮ>̌ j>tY3feYl۾.233˚NL^^`zɊ ljnfΝ|>+*oh`z9PYISs33g̐9cPSW攕H8Z8.8Eqg)VÕKhtN-[xw(((8夸q=JMM RTT}$Npz9 +;`*9B}}=MMM,]Ço0MxV左p4550yd'@Qf͜.)'i5bRRRN^cy3My >m۶Q?ӦMc=S\\LaaIm۷ W^y%TUU?GUillYNƇ`?N7M:::ſ>C88 37go@r2k֬裡 q[aȑw}A|>dffrc)輋-Z8dffP3g(}n8$%%1~xƏO$e˗;ﰧzwm۴ BVUxkO_E^ IDATμsپ};6mSJYYe D{{;vudlzff&W̙aE}Ozz:( @DAu d46^QUV\/̢EE%Gyy9#F`Ȑ!" Oy|L:@3fyeddUUUE]}=>ɓ&xz )*og͚5SUUEqqO?|n~NQrr2PW[ad[Z4\7'VnN4S&O&--Zjkjصk2ܓ_4ij{Ux^ry_ɧbƍn0jԨ~y!=Cgzssr1|8ձ^ ~s0oE{{;aB233ihhn5?55ݴ:yyn/5ke{DQQ#G'A0y$-_Ο_yN|wKk+SL!';?SSSIIIaȑцؐle6؎CFz:!v젫d^/aKvRۦi|%Kit^uW&PU {8_qK0pfA=\E"X#T3 E?}ԭiowV`0HVV֠aB;^|EjjjJP__|]%PB{,m& V!:'ěyOO====WujB!>ڽ~+]aiiak_>XE~Llym۷s!  ~ضMVl#Ghll0 ZZZغuk9 OTqojj #a@ Y,? y#'Yz7^'ជ|~RTt A<@||>wus@Dw$LB$oE]]Ekk+0n8u]ttt*JKذq#555*y/=5\x BL4iP/=.ן/Py z[GjjqU}ڏ'H6e ӧMcԩL2uhog̙\6kӦN%56*'ޣ= \lۦ0='> |/DS'xKތvE8#lӤ=+o~V,=9Zx<*ѭ5E`Y&,$~_999TTTۺ{ Q~3y^n&ɼ<{t qqw=z4*= C=Dff&70 rrrx :tXŰCYh;vtRlfz-{N0ѣFg?cܸq{1 3b}3ob '++|(]ǚkɟI'4g2l0O=ŰC>t(#PUV~L2MuY3ffv܉(\u޳<̟ϫƟ_yjNGg'k׮4M<Otߑ_瞻:izg3eEQ;w.,k,pSg}YϜIGG;w²hOLapM7aFѓO2iD8xsŜ9nL2,x==BPg~#‹/Y`޽ٻGjjbذaXgAjZZxGRRT:ys%]<04 M5+)Jlҫy2 ڳfd%yҾ-DjuT(FآݚOಯzS@:#G@E' D"^4:x<͛i,[?y睌3fT&;WVVFw--te444`YPmq BD 6XQw_x+ƷM?~vŎ;=K.r>wBW\AWW:;wbΝ3Egff#/SQQڵkݹ~;yIϸ-L6ʕM~҉( cFka9r]+nܸqr?n)˨G׹,^kְnz[n~y.]Jzz:>jO4Ucb߿4ƍ̳RUUw%//;>Y׿1 rrrxGx񥗨fڵ8C^^wy'ӦNu̟e0M#F!N\G 7 nʇ7e63lPz&N={x_+W#`U`6nOuFFJK9XUEUlxO䐙QU\S|ny MYn3q]Hs6K"TfU` +-5#ӍϨ 9Zg411݂oͨԳi]Ns[  CNNΠ[z?Ldʕ{~ --mP䭡r4Mc̘1q'? P@ ׾5rssihh?ȣ>Jjj*eee<8СCWフ+Y[8egs]wDB>t~?G"##OpmY455ڔv;gdd{𬚚RRSɍp$DnS0Ĉ@$kp#c.L8>){3E(&RRR(*,$*8991,|{Cww7Iw("bxtפMqIII}K B=J8!7']&:zx,zzzhkklG)L䞻sw!= 0 ")9e]qfly sԖ_>K0;؞;I;ӃiĖ=`pU&|vD0-˽:]5϶D"'b&p۶yx^$zFGsjl, Ȁ¦-[ˋ G>夨P;{PSRPz :ێ9'҅l6Mpl݃M;/ N]q3˲شin| &(0F,FSUu0hhl湹ѝaI<`mذq#7oF4緿͔M O<8g1aVi@ömvs]]{E)$I֭塬Yƙ4n)C\_d}6W'L8}?jjjx'ԭKy0 <3#;xqw(,( .DQ>芢x 1>cBLJJ v@#)**}*Qii)sy= >'ʅZ-RUUMgӦMefQV^L0σ%!B &DR?( 7o&;'UQX&򢋺B!9JH-'eYg9)qH8T΅B!!>$LTO jg=9VvlF9EB!>Y.U+APUU~5SLB!?]x B!B X7d!B!ĀK7TUUql[B!b@ć_m!B!ĀP˲= 2D!B1PA4t۶?hs/q >$??ω~|㜕^GN׳G<((gq<*y:kT}f0C;G!V(Or|lJ˼\+ߵ2k咪{EQP0, qrssy !B!;EQ:rEQUUvz@B!!B!B h ?lێ.!B!JB!b`c> !B!_Q%B!KJB!bvBdB!b9qGVB!B (UUs@!B!vDB!b )[ +!B!P}@l[B!b@EQP#B!B EQl0;:{lKB!b@8CwwEBLCWD!B10E!-5@ffZl't9&B!BN@WUzB!B1 ]B!B '!QU!B!!D!B!@!B!Ā! ]B!bch"ðB!DQ-~/!B!Az@B!EQN"B!p uU8Z΢{яxd>)B\$eUUQ% WAb& aZbn39|ƅʇ(L4t]Gz7$|!Ŕ96ZQUχG4y`1Ru9B neJ8S8d$i88 ζ4MӤTK2c6P`4^!!%A` 1ȃf,f$''K%IIdfgISCJ UU@t Bĉ B B8tuuaZ#JJrPΐ(*uuhB\:mSUU/KoNJJ[3gOvvEw^v?|/>Cm|ǰ- n."A(bU̜1_7ߤ'OǾ]/{XX$7Yjmmm|S:i9.  sG|>**+ Ã*innfҥ{=mkフ+84 '>LVfzA~>⊓.`6`wYe]Oy1(5qv !N_!9|;!CPYYɏcq~ӟY,T7qNZYJstlhxIw;q}'VINNFuk_ô,Rzzz i>iܫfoS__+qkbY%%} 9k:|[nOލ/{{U{ݟiH(U>5Нx|zNC|=aQbÐ^{ ./`LNUJM1$n,C-Z~Gcc#?5k[ַ}oΕW^ @0dϞ=TUU5j%Ja(|{v󩨨`<㤥 wKFFdff/}BsNJJJhmmo}[p srN-̜zXmۼϊZ5kկMff&~C;IIIalC[=/UUU໏=iT<ȏ|0?m ɟ|nbYoAo*p%K8X]Mgg'*&NH7gm_Oʢ, RTě~GQa!moaBTUO?ʹi-t2~W;iӦ/~ ~UUm&~_1b /ӱ,ˬ IDATXE#_ͿRTTc޽(OSƏOGGO</f޼y|^äB, TaÆj(`557Vn6t]gOsWP2r$ԧX۔Ü/ǶmvEffnzƎzTַus;ֻ"O5qZx<o_G8LQ[[부8VBU]Mb8aR}/̟7qxw30k,23:u*ne}wYQVVƂy0Mr͝(l޲9_;ٻם?3(`\8|} |Z&MJ `ݺu|[رc0ud"<\(Y_}]ry9sty׿fW3~823YbĆOGG͚u^ΝWJARO|(4>VH$a)+H*$iD>|{ B?>rWr=vZF͈# kaTVVRZZm\s55 ]L6?۶ Blذ}k~ ;͛?{U?)I=P "] ;b }Ww %@Ho2d\SA|>{i6nFE +ݻ"hddd(f immE*m]ɤt'uch 0@,If%WW6xC򨨬dk)'WTTזp1r,]]GQq1e}睊@[WWG7%477),*bرm-];$TxdYfw{<]Rr͌7_uN]۷b6ggJJ?jf<5,(d2(++p`ZSB$eoYu"/tөx[M7ST\L|\Iv 55FCqq1{NiGPP%%8snRPTDEEAξ}$%%aXׯIS!}H`S h_R>p!My?^T*W\qv⫯xNY_d Lj5C @tt4 ˕vwQTB+ 66R6_G{vMzz:'N$!!v!/FR84VBaB I22hnnHժ\'0 Y~?<"\__OyEc>>iiDGGc08T]`7().VOkK J{<pYrOu,_H ꫯf=MMM .dРA|_;> :]OMII!337z.X;gg̙X1iDIB_髀n:RSq\|lfe\t:qqqZxBCCY|9UUUJe!IwR4Xj 3))9rB:=OO'&&_y. VZE^~>_zI쨑#@7G*::Ah+5kEw8D.!XN^,euj_wULĭw܁JRRRp|lb/}RS۷/&0L|z5Lzh;\/]J^~>syzD ȲR"NKɨs]ĉ`0xYbVbÆ T*yꩧ?~٫W/Ν˂ x뭷[oU&&&v9h4ڶ\uUHĪU駟0x\uU#%%y$q5paXf C aڴip@llqˉJOZAAA^RHJLTz﹇?kv aiJNp^5r$fbccq߽w჏>B0iDBC1yERqԩwYHY^::wSQYIӪȒD}o23BdovWyX+^9|8<  㬡C Uiy .6(j~Z- ǿWr21 DEEu QQHdd$>I7  ,4iexIo6E('eVKLLQ?V{v$IBur;I=SOF?ўW}w#GCێёշd2zj% '@?-ޱܗ^P9y;trPg 3GO%dfc'%F=sJє%<DEEqM7s|gUէm@ 8Vt҂Up|455!{sP@aFN?ܔe;n>waH<^Gv{OE9mL]m-u55t:%p@𿡈n.Z )c49 "(` ǥt:"#"hhl|\n"HwN<%ÙrBVf!Dz-C+Hv>H#88NrG,H!1}FW g3ԧM@pBN׈DcL@ 9d#B!P @ jUאjY,@ L *"r{D @ NR{DF @ SH~@ S,IB@  _!YBD@ @ 8U**D@ @ 8U;0Tx<"K @ RnUf@  R"ex@ )[x@ @pr@ @n)+,@ Sx:z@j @ NdFr:o*@ XtWW` @ H|W.@ C$I"K @ 2U׼s=4=@ ? *X@ xڒ!X@ T7~U@D@ @ 8$t@ @ 8R?N_@ ʇ|*<-@ _,q@ @ 8H L洽bo@p⸽{-.G(!@ 8fvt݊"")U:dYPH^PD|H-@ Dvcw80FdYV^dHRgO:ڎѦ3;N'V+ͨT*4ME m!X@ Mpm6U<Ӏ`2p:bkiA"˲PBU[K:l.oT@v;@!PՄp:E@pn7@p(NFC@@6 ~AI tn$}DeQdP].ISu?"nuTtrpb:#1qx<8OqZkJh4 /@pt!Xg$7(>̇}DeeImC}}=:b=A'''O.w?UZd Y/+ر,\n?lmme/=j_oWB<N ^\w8o>OYY6g~gˣ";MKK >?i(@ 8і"gN~}eĊ+ijj:/ܼ~}}k5qx<ƼyXr%>(Æ 񐛛믿SO= /h@) XK'ώ6$It̙3P\\Z̞=Nwwى̡?;P>~G9Ppfvٟ^gĉ['OzP\\LqI 8;(26¢"JJJ &11Ʀ&>Xf2NEEEhZdI¢"HLL <T:DeEa0:CXh(aaaJ?l6JJJ(+/d2ETdEm]ד@_|8NKJ(.*Be0, EETTT II!InbdYFSZVFC}=`{<:ġj:D\l,qqqۅ贶RXXHqI $ @uu5h;%%>Kjaa!U*JJJZJ,B!22RQQTT* 0T]]́imm];|cP^QAiI ,MTT,r67锹`)))@É;Kqaa!+?/.)t,8].JK)+/G$Enljkk))-X1LܬJ3zt[ceϞ=])Sp嗣jh4Ð!CXֶRVFLL ZWWGyy9$$$Ihh21 T* p8$%%n]x<(((f3$%%)JBSSPRRR 9o4IMM%66Tn7ͣu[\Lyy9NXx8sy~}RSSmwéEדO4zIMcذaɃ=ijs0 #^#//wBCCilj9s꫉"??p`6)//'_?}p\[477Iͳ IDATԄVӧ6mb/c20 ].":MMM`4ǘ1cx0 2{*** '{dZ[[yizzPw0MMMwl>Z {EE#p:444pw3~8dYb0o|~پؘjjk`⭿*p:455Q[Wǃ>ȸVx޷o/ΛFߟb30 w#**Çc0xb z%'o ?:֬YCξ}y],^illtndggECC*=F>}p\Zc9p¶v]˾ *?_5kjvy'׷/Vgo1cll޼X,, wy'#G26ǟ|.DE(,*b/vY|墴k'dYYgSYQAXXUUdffo2qf`ʰa09FbhZ?+5%:x׹2^u8^gϞ=\r%>j"""xcHwB0jHMM {|駊_ZZ_-܂Fa̞=^?䬳'DѰxb}]8p^{-7|3̜9>h, =HQQwu#<<~{NQʘ4i?Fx F^^;&f͚ŦMHHHpZ[[Okf'~:` ,).*n"6&tuVVbgE_r%YYY<2}:x^{u aϞ=,Z3q!벲x=jT$+\ڊJbYfgg3s,t+;v0IJJW,`k+ǎ; bCJaa!O>7m/'??c1bpyٲe q&xdOxXeeedje߾}466*^B]]]BtTwu8p^zw/=b.`CޯzC;0x`n:^Ͽ˯ӓhxa\ 6nd/sӷo_֯_O=wETTUOlr|.+~aÇcXtB3 ϯ5B$ob8NK{}JbB|׿rmk `˞={xvlwӑ$Iyddd_O?eİa>/Ӣ%Kt<;g&ݻwxҶquxGIOO,^gQDEE1ᇙ2e A@L{-_wֵT̿?f͜IJ^4Y,[{eٶ1x(//gڃ9p zP4z(#mFjUgg&99<,Z'g2OKJ믹p9XV>cnڽ ]n{F㡹EsWpd_{,V+:??^{ </a0{.]ʍSuox^"0(q${tKLLL9mV  ϏyquѫW/k"""x}Dze˸SPP?OZZL6/Cbx aQZZʣ>p\|gdgg+лwo1c ,`ݮ[r^ v8lذ`"##illd޽s=wy\.>s>C裏 _`0?駟OBB>W\qr nիWi&vSSSCTTׯU;.E.[?.;wb')) ZͤgΝTWWu`}oСC1bs%jٿonm?LjL<< I蟞L#22@F$'%QPP@$?|11J]SOhF#\|1!!!zy\r<1c nLF#*!xnҲ2h4rԩ~]cɹK@@!!\rńcǎ/3tE9b,/'Ŗ-[0`qqq\.{lgv;v`0ՓdP^^fc|)ӱllڼ q &w%%%TVVRCRj"JVEѠVj4s.."EFr7SQYIeUr9b"0u,hØ1cHMMEqS ed2qwpwvo iF͡CDp٥#o2Q[[Knn.^x!A\.}p7*W_}cMPP/]vjV܌[@ii)vÇ3|맼*++)++CVssHTT)))lذEVV "33p8عs'fhiiaԩa6=z4G&;;VBz?M61i$FsyODB@p֐AKH7|Zf5JKDDDAO;Obcvxc6ٵ{7#FCVKpp0Nc$4juPFFfw601>RSqYXx14(4'!rWdR\xFɄsh42sعs'/"!!sIdffjׯ|!v={2a8;'lڼDt: 0)U ÇO`́ t@j4 V_f/Yޜ N{2/g,[8'vh/nѶ}PP߿K.{RRRœkCoZ撚Fee%%U5554[455t: *j=),׿W,3!99.\.444SO)mXX,+*HJJB壗z}^?h-W^FښemUؖeY%^a2aUL?ȟg֬]7~KbBCe&WWl˹37$Id4r7Eشy3de]FHp055>|O?+V(c\UUlf)k=c5EefuJR}LQY,}OSSvݻw(},TWWGss3111pe 466RQQAnnR ͗dXhll_Cb4$0?Mضm˖-Nuu5MP;;w.wu ݛ޽{+3׿;HHH`\s5h`֭L2m۶q5ƍشi'NDRGDDDwYp!6ME |%sNg\;m!XBVNI3|OFlݶMYjcF֒- Z-~ބv\.rpB|<;vҢv~= igUдi]kt;ӉR IHHDV+u\j19+qV R=\H0yvl:Ğ{Yr%ӦOY蓖Nk˗zKCCCl<zFRԡɒ$Z]a @pfgEfڵߟ_xAyO'-AТ"#ٽ{7ٌ&7/ ,˜5t(/oewߵr٣UZjg!V^G*쎝; t\.6l܈Ϗv;L4Q#G"2555'""CII --$%&I}tmJښ$Ul߾njh4˖JB||[Ť-[FCCn`AR f?3"u꛰P*uySYVn@ 0-I477!C=j~~~mҦ&~uu5uu$%&A>}+݆+HDaQ555J_8xҲ2_euVt:HDKk+xhp}=xp]DJ5P= :&$>lOBnn.ӯo߶goHxUTtPv| A'))ѣF)knEeYpkv/0;l6aF,O4>|X9c->_C[rcbӧ)))ۗs`Z'**rj ipq/cT*}}o2sLvٲe O=S|455Ǹq=z4ZzUjXxy' {Oz"###662UMMMk0lvرNɓ p9Il@޽INNf̘1\tE瓜TKOO'--Aq}@HHȲ… !88@L&~)fdY&""CQRR졍[vPbVo߾dee1yd#gjkk;C1 J?>|ɄVv+=@ 8ʇRKtǙCmm-;wI0L,k B$vIj]nNVf1o|.BjkkYt) k-KOOgUW[orJ-_9'ݻ76lOZ,Yd^ȲLaQ=<^z)]r UUdgg3` z=Kkr3x ~jjk2xh;f^YJ_߾曌9R0a^ jjjHIIoeƍ'pдСCy񥗔]PdRN7_gA=|)E:u*YjjT4 'Nd֬Y{e.V "I͙x5 +V$44t- ^p/":LtBFEO-Vhw`@jaa 0@tWAN Nee%OϚ93hlld-$&&vk/ 0VGTTҐkYHKKڿFêW^FL&N>b0j(%K8wRzU@$ZdY&++ŋ3l0ӡ\u}^g4!++#FXp!ӧio}:yyGxᇹ[XJKKЯ뮻3g2w\.BydܹO~ҷo_, -+d|'wV$~m{INN?JI߇~z j,YE 0 4Eq뭷x<ݛ rM7)ަ3l0|I΢E /DR!rVK/e̞=ɓ'sA>%ʧϘ1AqϬY;v,SN~뮻K/CV 8ݧnᆙQ`={|5]%T*g]I={5jAAɡOZs,ˤǨ#1c+ط?ns'Lv1rpBBBXaÔ<˥(MmOss3+VڿZ֬YC <[n^JwJ yyy|wܹ1Gc4瘘BBBشi˿ݻw3tPz㍘L&Rz5kRPPgƍFQ&}aa!_t^o 4sX,d}=)_9+!۳ U^~~>7mbͤ2󨫫cرQZZJuM [[[ٞ͠LbbbHMMﳲشy3 ":* NǨQ  225kײyfԛo߿[!w{v6?g۶mmտ[G1xϵصkׯh4r,DEEƍ{vŀ rRxݘFu҆¢"j)7GQq1YWWwLT*a~zlbcb V34$}ػw/)L=ץa3V$Im&x˦~w3쬳uTF#n;v`66ڛ?׎ L&$''+B<\6gd{v6'66Pbbbذq#_XlqԩݞR蕒BIi)~[l!W/BC10jHz={fǎX 7ĽܣS IDAT٧"27oo ?ɓ'󣦦B&sol q,^ BBBضmK,aժU444pEqw+}sA8s9gZپ};GnGNN| 6l`̘1Jѣqlݺ8x CAAL0???7n}!--nXk1 Ώ?ڵk_mm\q!ƏQL&lʕ+碋.fqc68p ]+V#֭#++ IxDc ~$'++uQQQ7HKK wXV6nHLL C baRSSȠu1h RRR9\rQ0:N,viu\ ]֓d MMMh{#u{KqB@g۸=jI18xVT*U%N'f:=]n7ks3f.Y,;t:eKN'vZsÇhZ"U z8ruﻮZ IJ, Fy;~iߖΟժT:KtxJ컇o-4(4raܱٔ˷NĠt:ihlwZq ynfjjj$V{9C-uy#g_l6-[FPPsb͢EO/b`0;b?ƿnNl6+m|hlq:477+ת?۷;ݾԤTSJi?jd2wl6T*p8:T6 Z}\nE _t*!O~&BBBB8 Ybz,ꫯ˜FvލngҤI^=%o.#lƒ$)Yj k=#VcE,0(}I|dԓEϭhzoi[{h4ŋS?jZcy`0jF[wN-J==sl:wA}HkI} Hw_wx{_ GxTIwsQb(8}d2)ֽ=hkhV^c$&&RRR¦Mw|ULf!IHBQtuuu-?׵Z֎k[EQaW{/ JZ&=IHHeL}DZD]`3#r}tr(Z] GE`Y> ƒ@ /%a qUU}QF@ $|F@ '~_@UUtrv@ ~_@UUt/~Q,6@ 'o}Y ::IEtV@ AOV׆džן+Rp<FwN{7To9 3( z11d\^NHc3bUAb1**:PUYe,J'HF?P0#@ 8M|=h83hS%M&>ac}vYv@_Db =&XfQ:v1DFGb`0D㜂 bDO}B TEFݎ( q@ h'8*`> NOIBQȓk"vxr4oR!/EKt·n,V+11(=˯+dN.tt: &3&3V $`@ ~?k9gh"$?-nt0.pO Vp~FaSz<^1z/P؝Z:!s@B0<HP0MSUQe~lRcHE(*eFg߹9.phB^y禷׫Bp$CUU<^/F)|or_Ѱ|fO80MX,Nz1iEA_Q>N"Ώ32~? bBo&DG9aN]]ؾ(hEъO篮?W×ew4? 歄&=| n5 ^znP,rNUէĘ"aeD;͜F/ "AτIn^] A *v@v; ^WpNbBf(˔)8+ع{7{/!!!~h4p[oirh4rEwܞ2oPGrӯ_?PUK/.kГ}KCҍq,ICC# Guyh4b2e=:#Fb9oPTTO:HeeewO^G\P:aC`j4;_ݟCA]v,;d Yee% :pU\\mJOswsL{ Km7p_x1vUrs8q8LnUwFQUB|]/׋9{Gҝ]t0 }'rg6LNpHv#IFv,HWr4jHt<v{_VT}o鍄/˫>p$e٫|<E ot*PWRuBh42~8p!;wfذaHmXt)1c &MM^oIL8>ky]ZZZYâ?YO>TUwA'Il66l@fFW_}5^O?6rۗ+..neU ӧOgMa20~<{o~6bbb8{ F^Gev`c834q"& w~h.Rө7?d믿槵kw[8Nt㍨+Wʕh:e F?, -5vo=3˵^KVV&#<<믿9szj*++{`֬Y(ƍYp! q2uThرC~ӟD߾}O,!ˇF?d8'ZAA̻aprލ)I(|D'cK. ʘ1cy9x^[nG{ӻW/V|% $''n &&O?e?2g3l?o܈"uDtZe={ɒ% 83΋zMMM;߿I8+0Xܹk?BCC9kts=ȑ#oh`ӦMl.2"755{QTT($_NBB$QWWNj/Ĕ)Sشy3 X;v,g}Mnkog؁,ۗ]t I~?LFF֯'b/w܁db͚5|bDDDpE뭭|ع%11뮻h+*xי8~4s>v VZ˿TU]s\lܸwIMm-Ek׭`ͷ2$;C"2K.c`z:gLFiYs|n ]N'~ϧgf_dU(,[W_{3c Zv(++{!l6ϳr*TUeU +D'Is?+۶mcv~RQQY{HHHΣ{f|԰w^޸q#?8555\|Ӈswi+k׮tvB***ty$&&9رcQU<z!$I . 229s?j[K,[ .bfϞMKKˉ_Ÿ^3 `i 5K`{)dIjwQ֞ g^}1L&ΜIxD/ I ,,Ogȑdff;v,6ѣF1ed, ^O,?8KK;v.ZD\l,&Lr<\{def+Ŋ'ـ#3erǎexN^x铕"<$gE޽Y ZUUzUUL4D;CAa!gMN>}xY|VWTTģ=FKK 3g$O^|%;E/&993O}-[hыEQؕoM^^̘AFF|!?Yq?Xn{عgy "'ID[,p8pzbm\*]嬪k'K2Cz`bFw܁je ,YQx<|'rwc٘6u*/\oypgpGϨ@xx8<\us9 ƌ<_|5W_u^/cǎ喛o&lfڴit:,]ʄ1LOIa}1<'ùذq# l۾."++0\n7?3IIl 8[jT6ny瞋`ΝhKUUp893&lfʔ)p"ƍ`@$ C>%4$O?ƍ<1bpFp˭wljjɓ'?O?C=t*up=;Dzz:_|1W]uW_}5:XvvI4'VUUF}݇jeܸq߿իWs9tp?+Wx2e !!!nx yᇱl̜99so2zh$IbݺuL<ӧHOO'//炫Az!-JW _UOLz[ GLTN_ÇcX8q"-OL4ѣF&f >F[bG?_9g!x"##zDGG ի!2;?<_}Ib<g_|5٩Ӧ1ObtݝK.a 44gq1w~;S{ĉ{[.&N@!7{6EE 拿*>w  }ݻI*ڿFnfNvv6ڪm~EcbX`.wq5ʕ$$$0d`v;_1L0> K/Y497nwv]/ٳ23駟2; IDATm/ ""gIhh(K-cĉ\.)^z)_z)F)'O{ϞCt`wExx8'Nu.ri&?~O ߦ'y)jj] NxdI3>(pyª!MR,kXVE8nvhnnf˖[5$44meeף*\qel6$Ib0ax-ZMz+WoȲ=dffM455aٰ~fSXT+d9$LJZ,8,30j(쭭S[WGSSmmm!IiiNs5}:#GdX,E!;;?3:7N[K/@i)6/JMM DGEQ]]MEe%z1c/|9^aðZH(ҧO232}2bĈF&Yg]wELL 0sLn6oԩSu:.Çk XVҴtt:V4$IbڻKKKKewNI\.͡x<ƍ;riEYYY|L&993[#pPT9El[` r ~ !!:kjhjj ?j IfJA't::oٟ.* {&-5}* ^|Og 6C(y& UUU444h˪yfb>ضm(MIIOtnN?d21u{0 dӦM3d`mG$RRRػw$Svc0x嗙1ccnjaȐ!تf2l0MEGGЃvЕ$$$hr)--A@>\.{5S۶m׬YE< 7lҕl6 /.6Hjkk5 &1!h^ ?niiiθqh۱FhiiAe"""?~<[nIشicFfQQYIUU. A|IaAo8].fܱc d2q̙|d eel6vIxAI"l -1zH-frYgkn-2XPI<9pt:&~ !Sb23Y|9viSKbRRjO#0 łLuFIEV%m|H?wՠ xNE8PUr?7~ȑ iE#2FQ q^/^Yb6&8 AK 8;NW$,<`0ЫW/l6dY>tu_t9O\.f^/_߼l6lV+VM3L$I"55Gye˗ pד3fɲyiۙ~\w14;˾֬YСCIMMښ~޸Nii)N󐔋*hݎj&z>}x\+@UFްa4hWfĉ"i4-`DgnM&mmm-_r؈f׮],\Nϭnkk#<<;3˗w_˸+x@$8r^p+ A=Q;F:WR*Z^Cu7ѮUY^p9,Ls8WX !!7)|!/ x 9谭*++| mh4nrQPPe4Xe23ioob`2ɥl6SLFtet>qqy )}1?Czz:UUUXm00v;㫮֭[)//H{{;)))8Nkjhiiaŗ_"˲GFF뵚2ш9]u:a3**G}˖_;u^ZZZϳm6zdYzSTWWznC$*++q\]WaoLҫW/-u. {GB$* -Y!kt:IKKvx ;-`X,-r|H9$C `XYbk֮+X,\~e<眓`"uD@:`$GѩIg׃PH8$"P0KrRr٥SO}vrssлworM^׶p Eee%=vvwˏ ZX]$%I)))ݛﺋTm?.$p8; $&&ôiUWa W{'^Ovv6 pe|G~뭄0iD&O}}=?#*i !99rݵGbBشy3z""# S[ZZ@:Fh$11UVu?w{<׺2YY~=&ѣGwhjbW[,(*?%aCktށHYdTgy&$RQQ"F~phT+&gwGxNGq:l߾_}7~Gzp:aPzt:}$$M7i=hG©ޟx*BBB @>}5jWw444r:)(( -5^e2(l?Jx8ۻW/p\qW_+0bp'-('#Ky$0U. ^v(pu`SˡŨLy]F@NB'Ic2d~]Zɒ%im}9=~xTUUIJL <ʗ_}"˾RsbXX|bmmmȲn …ݶg bmuM K-O>ƢARlBaa/?H3|8rp8x~.Zwތ=|ыFŒO>Xz=#F`ETUU?*woxSvYt)hX[ ׏ֶ6> q8lٲ`xɨNݻy8p^֭[ٵkƍr0QL1MweH,˚BLL ֭֭[jkkF333oN>C̙餶z/48 ͱ>f[ G?z}&l->= 0HD}}=V՗TVT?wHI4Lx<жl #""]煋iG؝MUU.[ƼihhjCjj*n`]_6$Ib~n7^Y~ZJKKǟ~ŸrvW_̼y8$Irfv̧}Fhh(iii]#(++cUt:ٴiyyydӖ6+Wv@c6W_ENN'o/|+Ǘ̼y૑lDRbU<3c6:t(C ?4^Odd$:V֬]K_rspb>^ѣGkQB||<+ݮ˼ۚKq\465ӫW/R1͌1 dY67l6'M7dر^~QK /[uY'|RKKOO/I8A4&DttFSIpqSE;,rJ]<֙P *8H_Q ( ʵ\]wʕ+xǸ/!'':JJJkn+/dBK@X$&NO?>Jju`Wc1̚5gc߾}$'%/6ͨʽGJr2{( =& kh(&N7`{^Ԥ%.Y]viP[We]j%1!^yy$'%u6zEر{LOLbbb$  ge23`0psp=[[ٷoJn7F޽{dꪪ*+*wt[;ʥ=/"=F;v0mTΞ1T1lP>o;fhjjj߳kBrR7O߳XmNJJ ga6馛xbn_;qw۷/F^{u֮[G>}#66aôt AYY|̶m۸⋉g|<dfڴi[qڿl6nyg0`8NzPƽπ).)x@]x!{λ&''6%_LTTz?Ϛŋ/G/;dmĶDGEƓs璛lf͚5L4޽%8 # ;AFv*n#8]%h%T# \$Fz 5%umK߰ h4R^^<***!55L͈TUJrr2<<ӾP`>))􉋣c`Zٶ};v :6nȑ#; {^v޽{imm%>>wHU [oٿg9$d|֏?oHYY111 ɡh~CMm-}!55))z<;w455/>aÆiYn1 6Lk5kC;kaQ;v젶Xee1`-v:d:~޸"##6v;D mJo4!lܸM6a:t(_NիW+WInٲ\"""ؼy3L:ɏ?HzzyEQX~=nɓ'#IYbɡ ¸q㴕M6QZZJ\\SL'TVaʈ%##C!m{{;7nYINNfњyt o?; ^a! Wj@:P<0d !""yn,*`03l2vXz=740vSUكWzqq~m<$_'jn>y%88N IJNF=AAa!SRiQ IlmV@خՓ <ijl* xسg}%&&F4( t8 '1!? )Xk7l *:QO.X"Kp0xSY,c]XMTdnO1gI`6 ffiM(y+] `DP`5o 3!^ Ec[WL 3+8-}p uB, /Ozc'|Qs`L*T7;DVTtLm УRSS""@p5=I9C89h4b2!VOA'ĠE//x(j7H|TTEF"""[!@ ~eJQpqzĄ#z b F#QجփXrfxî8룻Ϝ*tC/"!t@}%$ |?$R475Ԍ;h4 GS NG#h~2:$' @łhtT_OmUU:H>&&^8@p;!~'cBF` jU"it>D 3$Iz:wN@ PMY@ /vBh@p&c6dʚN.Aǣ=nPU"R@ @9ɲܥsnst=ԅ괄"8Y2(E@pREQP[?$.Ap IDATۍ^N;|I5!п*n*G|X0 Q9cпGՊ`. ׁ2'+(RNyEtx `6 J z0ʊB*)lx0~tA$qEQhni!jڣadYvb&@ 8X3LAY q׃/eUNs.0, zGGQL&m&lLzq8j`C{{/=j=%&?UUikkh4b|֋l6F1ukk+&鸶weUs"v<hF#!!!G\{|F5btEQ+8[ TUEQU, A;H?zшj>uuu͛ٲu+ hmm=h:كsRZZs8jơv& 8{Nthiia޽TVVsݻ\uuuݷG:hpu蹞Uy^JKKٶ};7nd۶mvi,]Cqq1'x޽{wعs'*k.'Tt:S{VV@WQQAAa!Ximmev3V1m;vLxdV+}ի1_+h}k.*++ ;;^1w6 ^/@ɲ.;#$FV|g tȲ,F-xQ(;߁k8Sjw. $I:͂.'mojw^o6|`0tz`3ж]]y>ÿn-Z)u7q]t@yC:`.nBmfCyEX,(B^w$%&vi,g^K()!c6ݐ YY(l&=- ժMUU7CUUv bI'k ӻ7ȊBaQJKn|쭭HDDx8 ~ڨ$vb)> ^>}$V={K}}=n ^UWr۱RVVSOIq墰VEh0Hlڻ\. imkCUUL& tԩRS1 466RRRFFjj^PŢQE@A1m6;Ott4C 頏ZZZ(,,t"IVtf3eee( {d2}L5)tڒn7$aXbhƀtfeUeee/H^ 8Muuuu0k4?$2R]MΈzTUZfcXV|PSCii)_4*uu8BaZIKK>_(JHH޽IJJ}p#44tBCCOz$  \>j8 جV((,ͷݯ3ZKVV!!!(-,ٻ(IN'T]9O mc]@] ^L00𾄃l,XdY3=9V &100L&Y$z{dDO!LOMaee{{{b{׮P,bxxV`t#[*0??UQ0n5":/.BFJ666L"j]` z=8a{{rYt~_ R ׮]aؘ8^M#aLOOޮC)aqi SSS8s j^*d2,--tbzzCCC( b+pX<5}eMot]G2@GG\.WS#zww++AwwLkp*.^)T*etF;1<׋P(L:b$FN~?EnTB6Hz| vwB."ˈX_ÈFPUUTieHnpX z<1aBs9ds90<4>? aaalV|o ctt @u ݔ&( |>,z+]~*p8R 4EiԔ4M**Na46\\.&''* "Rԡt4 add2zl6ёtY=~O]&&& V*gEoiH$ؙ3{0DRiJ[^F1<4$FkJ:Q躎D"n ?? fggA5&I#zz)y>O"L@WWn7<-wQP@T\6",J~ ˮX,byyNd[m(I8NуJӉݽ=tvu̙38vb?;r!с^3ǡ:.\ FN'!wSQa67PU`vvlhp8ixך"RtX Ϡ[D:&!I 2FFFP,DǚByVPa LbhhHEQx^|*B&nn! 5̓t?VnynfBQ{ޞBRH">vZ="Q(D EtMפTc NMPP,~#M/;4 b5J5do3r5kv@ EU1??)?bFԐz( ¡h_p8D:0pY0 Cmz$IRTZaM6F"epx-#Pwq R,D7gnoo7;ly쑷~?TUE&A8F\FGGGk0B}$ xlmm.W9Zݾr. kkkHRD"Bts0(E$A8ng>"4MÞUVF:jCS#H4K)b @?R7'I:=qNg񠧧JW^ܰOvCَ5+5 zrLN# g2HBUULNL  boo+e. NC|AKT߮@SCTsMė9P/wpQG8Meds9AallnX,ֿTz%\r~4ND9騫{p'M5ZBjx wd2==ݽ=$9"DL9\ցnKu8ְ9tD\q7m|>qfiCe=Rm;-Zs[$}`zkh5ϗaub eҾ'6<7{& " Bud2!LbdxX3riycgqzٟ>$f_v^x?ٓ Juvvb˚f1<<,1٣ϟG"H Ncww`l|(2 ]X#׶G\9<7,NjNpS*)D_{>L~uJE4 @>8X_(hObj9tiف,˸E1K;loᡡј{t]GΚ gϊOC>kװ׋X<EQpybbϡf$!LxMӐ#9#nsTcvr:L&Q.148X_D,CVk,|'5;OxC( F z^cWOw7zQVD2>nȲ\.4 Q(:S=Ѩ( n7TUEoo/z{{}sSp8pftT̏v 8t;MsF,&R<sSVE#4MdY*s|~?">I+=~mO[g> g4~ SIv*Ys.<j΅]p:bPU*躎P0X%FTU њ=2:ŋvY["X=能^U0 EQ000T*,//#fͽGǬ΁bWbc}l[^ ~mm 1+EOQx^d2eO䷃{TX,b!E`B[]N\uzˇRh<'7}iX6t:lUiR2,V8=`um R Z {{{OEyhg'S)TU1PՎ́=RVJMױJݴ>Q}XObFHfxe1uqqs"a 0+bb) e&!N vՠH$x"Elmma~~BUUO$JEH&x߯\χD"T*u83NR@qi. UHf2;#W`k{[IQ&2<fQՐD(vjN,\.]Q*pun ׯq^|@Y,..65o:EW gR϶ٟZ]iqɲD׮ZKÁax^,//K4EXD vj(Jbd2j5dYQ|~=^amm rYXU>_=e2AZƆHx'Źr]YTP9iDP*5 5y-X\Zbr`brRT7縡388JMC!!%5g>M&s,g"._\OdO+YROVMxsI2LS  A4b}}]$RVZeRZ KKKr^!J%:b- RNV48|qccX\Zիin7&''t˅ ,\Wy>uPi<`082._".mzp:_@untwuAetuuaqi WfgňP(qevVUUPX^^/I^bdYF6E΁} p5\~`$a̙#'ۥWchx\>q&IpmaEZ xص]>rv/]%qd(сd2ssp(';:2rhvc||>`###3~Űz躎nZs"d2)#I>kQ&yϘ=o}AUUyEP:jpa̙3bR|_<ְY?Oy+V$C! cum XUnX(`jƳ˺FgjUOAkĶ]BQUF𰨜f1u\MU슊jN'&'' ^044$ʐ0d͝x_ggâҜ=uxvE%w 3~\.WRerb4M7#(QTP,mxٽv ݃xF?{ TUmŞE[_TY=J%h&Rf0 CWY?_V ve,tNy+doUVVQ(QTvz岨܅&J\sAX,5: IDAT㎦|rN^ uBݘ2a7 @ƍ+ ׯ} Bi_kQ~uxa=bR JܨsYՐ/PTqzᴮTUyj5Q`Zj&/5G}kvب}MnxZbJ s$>{~M*z +\RjX,ƮxأJ>.R ^׹TUC!\"<Ţؿޮ/ [Ϙj\C̰wȗuXb=O8x^ K(nC}jb}5i8\.EQ>gT*gFZ*wFZX,\̱iR'z?YFRO>aYa?t߃. vvEZu|#A֛bkN3wGE$w^HxFHzSZBn2CT.kM=>NGqevaddn rpݸp<ѳdvg 6֬uN""HӸ;۶ z>H#ڶ9 L:$IjȕJ+P/z9`;9EؘXg>疩qDi~_Q(H$EfW #ju{0 I'o/ΟGV/iK)yک8QUjj5Ȳ qoMӄn-HԒu)ƅkCt)`%V޿& t>v([oMl\{Cn[>)!"S% ÁL:T:Q* ; >A|mY|2TY,ICZ׃`rHRb} {jFچgN5YQ iR@RvR"ZT8)_$j٭g0 %4`,"""ЫUXߡ_ _ޭO~w^(ap(lH`A-pcj/EDDDa7 n @S?tRqa\Q4V޵zf;3ODDt !":MA$I0T2iJcYZ4aZo` M׏uOHEXFٮe20 KRARbDU:P,pёD,Y3AΉVPV Dy[ Z\.EQ1 |vws{Zuy-N{Y6M=e96"Tj5A\.\.8N8CSZ $\v;JRIW.QӴ`]ױX<X[_erc*++}QVR[\Er9^(""Fn i@=.K{KM`}}^.^A6 H4|JߏnaHRp~Nz$jH$z^/I:FTBOOωX'V!L"KR0t}u]G<@$yX,"N# 3NDD77M-M'[T:tMHWat{6E"GPٙx=s33P9k|K|n:tco]]]'&܄s瞓?L=gS8ƅEP\7=P@߽/(a`yi AQ,0 1UU Ķ:elll`rb$ZBUUѸ5MBb$1 |R 񈟛 ǐQ(q{c (P~} t]\N|>f(0 LNSBb4DRTP.xP,Q.zQV`|>_3MbQ,(W*fmP@,ZV54}2<4]kr<>nwkt\b~r,4MTU8R >R E?.@0Jo'>tè\&&&&D`&O$2L@U9sL0MD8<`5chp@=maaʩ$A7 x=L= 1FJj-,P(4Iqu]Rl.J2 PV17?gdp8B @MzqnfAQڜa@@8"mukâW* 0044IQ$! !c)>DRA2DOO`V֐dӃbMpfttMFWgg=:64q}b{gCC7Q'@OO p8F0lL&Ij5\B A&0Q`?/V2 ۋ>@,6:;Iiz*f^E"@GGjz5Mlnn"twubvvF"PgT*~:N'&'*2 WVQ+PBBi_".^˅x<}q]`ssYky=)l0 \p"cm}Lh""V(55 8677EaQT*Ό==+W_nDK%T*Ȳ1LMMϣ YQi4M ~UU144 Á.~8Lp'X[\z{{QՎFq9tÀMǃr|`]4Mi~8N8Ntb_A @WWTU˜N''[2V!rTrctdhSS=hE"D"i( T: ǃ>q (E9V7"""zv+08 NtDj|Hӈi5bwIHguP,n7q8TH}}}"M'H L`|[/wχrr٫W{.~:$ 0 YV7M?lR\.6vX( J KmL&-Tqj# 8fѱ5&tDAC4$(J:*{ɭ?kkL{p:p|d2؉L$oQ0:.vb1ԪU= #Nc~~e[[U8M,xx<.^(p:(ɉ `{gaa-{l.DHPL>iZ@rYjH!jۍs33b(e(z{{M#""T({N=066f&Ө^ j۶؋ND"'"" Z0|u] # FN+2V"""""`ҖIL""""":$Id m,""""S4MQ:_6 *2Q+Xkv^1XZ(H[,""""H3 \IZ.kT&ߞ2 rNib"/@3eю`"dBDDDDtH~‘p}!BDDDDD2 I2dIЖ """":$IiM "$""""F!MBDDDDD2iB/Kąm(SN-0# pQH\"5 =p $IL"""""!ZULӬn "hZ# DDDDD*$A/˲ # DDDDD"i0zbWB'""""B*XDDDDD"v(J}"""""j$t`Q ,r{"dCDDDDtJ#Sa{`Y蔑$ EHAL"""""1Mx=~.mQN,t@$mHb_""""Sθ$ULӄd?ؾN;۶ :SN-0# icDDDDDJ,HԞ(`Zam)XDDDDDd4LԫaCZ0!"""": %˲5 ]۱Uy""""SHj,+˲BDDDDD\3M(aYZ H$ aq%t`J7ah@DDDDDbWݽ:SED$RNDDDDD-%F@x*$y`Q;Ȧig9DDDDDi0QҾ%"""":$IdYa Dc֕lv0T èeSN%1!$t"""""j{ЙEDDDDD-bHTOjVy扈Nk"""""V}[d ѩB$GZN-;"""""j I,['"""":ʻiB6lg4VB øQ-QL""""":dYnՎ)XDDDDDam^N% 7d]QL""""":LX ў9 L""""":iGA:NƬ+Y$юB5XZD"4 ,ek%tNQH DڗEDDDDDRS,IZЙEDDDDD$IҍJ蜀NDDDDD@,{($I$^WC3ODDDDt UH[V)( dZZ0H\i[CDDDDDi(*ЎEDDDDt:I** 2ԎpDDDDDԺ@E$&)!""""· @[B`*+I5 """""jƬ+jVy扈N!QeSN%;06NB'""""SI~Ȳz;F'J$4,4M`Q CUZXl$"""""SKj @EDDDDD `` Md{Fz1T$IdD@=LA)d&ҙ TV"""""$!Ixr +F'^?>?; HUQ[@rr1d&"""":!̛VB'"""""j+0M> -+3!"""":xFҎ~Nq ROÒZ0m[H ѩd(,tQK5k"I;6JDDDDDa2ȬEDDDDD-숣>SBDDDDDrp!B%""""S@iz{ңEDDDDtjiZM DDDDDiX*CRP;a%` $I}Fm,,""""4r= 0"6aCDDDDt*5f\ɦiU [Uy""""SH$Y/kQ+`iS3ODDDDtݴ:Sű@u2`f IDATU*rC٫WՇi0 x1|_oO0:Go~yݏX |K(-V._RԳzb|۷xH$7˿+*o:"""jj+$t:8;ށ~O_ZB4xK_br Z g?{P*ZT:??γz|>?>b#_H&˿+'?+47 $A$8裏bccַ066Y`ȕigsI8Km^8m$Io6Όt#"""|6MKKKjx+_|oqHV@"I hPedY`na pJ%ncRAR烢(gTB.C6Cww7|^/TUۯjp:(bD(jr ۍrD<ǃH$ob|.L6nxuMӐfL& 0nzmϓ tn8iʕ 隖eJ%q<^nk9*jn ]כZ\>:::qT*id2twCyZ[_BZT*u,#͢T,btt,T*!`o]]p\( p:ib:aB!H\.D2n|>8s( SKNR7:@Z 1s,.M?u45 1m&dEifqGzQ*W?? ˅crbz;!2w_we|KC0i?㦉zc?PU}'?|w?y\.{ի>s>/Z"/})#iX][{/p8P*pϏ.MMF?s> 4q]wP,6iѯ~R y3z~wމOAe,\LJ?!5$I?/O}#7??$a?#?tse75M>·  b#TK'G,3?i  gϞ=V?٫W333X\\//w.A$>x|;kk on_ă>Ƈ?!tFpk177x;!ʏ~c:7_026.%8N\]\.ŋ_b x_U x_u~(ːqN|>x^\t x:4{_ř3g0s,~=逸XO<?׽k_oWzrDZx܃+(˨VwY!I?ҥKb$ľ^ᡇ8~W`zz}{N7 Ip|/yՅ^*9s7` ?λ n|~HT*򗿌׾7(^͗.o~LR <7FU|%?/a0 TUE4AGG8ơA[ߊA\W~xWn\zӛ ds9?CxK_}pxK8<?Hر&ǿկGoÄd5rQ*oR _Fp8j5biyHDL1SdYLj'Hxѝw EeT*!aa\[X@_o/roc=˗/cxxbgOIPCa}}T Lt.rҗgE(Y񊗿\3er{8}e}w. (]),Q4ј#&5#?#h"EQYm3;;wޙs3{gvYv뵰;sy9y>yk^ͷ»nxs9S83 a Թ:::b1ivرb::rdY7n$ 244D$!󲗽<{졭r̦Mp8>) > etk^lۆ?hokcffXo~x\.혦I<0 (™g=܃iJ%FFG s7}YZ^fyyx~~#vtvt ysÁfc1lekI%/f}V{_Ϭ4 Zk\o汝;|K_?uPZ}W]gͩ璘Gy-[G$SOetlѱ1:;;ho_9:!|u-fO֭oRw~OtLv,ká ~Ɇ 83l%V$$‘]\Gb+];~u_Lao/ʒ$b@wOzm!uD \;$4J(]]]ȲaLz(WߩT*رώ;G:3h~8oSw@$Wv?! $2,7UIPnʁrE'O$xiW/y ozq8iV ImmmHĄmuJ]]9眳"-wC_vExn"O)߿@ `+6 ?);a|-,//E"xsƝwЏ~ ~Ez$[2??ϯ~kN%غe 5 9c eXXpх2>>Ν&ccٻOtp3\$Ia'&o!Ucm^gw'LNM㡇BeLrqr{anzu|P(x8{g?9t-y-,cUcE^ms9g]u꤬vH|[l'>Iv)^(@ <0MhK*H԰6ӯ@C-4x /<zK.xmַB- >rye]f MMlݲd*egD"vhim]]]]uw</9v&l۶O]}5XRᵯ}-]x-+«^Jq睔J%rgy&p:^z|m\uոnt]-]ƶ5c@z֭n㡇BUU.B)TmEnf{.7 ټiZ h4Jww7>*%H啧TM[,'ؾmW?/]imm=W\AGGi7/|K\x89餓Pjq\\ve%p|>~?yk7au ^o} M/Wq׿uN.bn6I :kjVrx#.\. /7 v kعs'gu~x@ b@H׿5< ].B]$>beJ2H}BLdH8\.(ʊ{J%Y\Z{ @]{6CzoS\Z?uBU+W,&1Ht8D"x^aXXX `|"r\.]SJ\.G"  Ԅ^(XsdhFx;lw,4#Jyf"1aW|ltP*H&D"\.@ G$In iY`iҴZ $ ׋躎VRa94MB*/f]?ikmYQd2LLL0|'t$Q, D 2BdYڽ7n$ȭKp:vȵ񶷵ڊ$I$ bվR)NYF(lFOO,S,ٷ?>EL yE0 $Ib b @ 8n*Z/D u"2$TX$_(a`ǃcnn֖AR֭[Qy'&btwwm-.-ip&* 022B -Z[YXX`޽455D0vwvvzٷ?7Ԅ,,.-1I{{{UYŘv,iT4[vQU Fh(pکW@ zQ6C$@ $IR,) )Cp\Jkk+^t:"s[ss3pUUx<:Uz|ID"r,cz Su)2bۛUÁ餫 I*ZtwuJi,-/t: B*mmhv@ /1QeA2}Z-s$Q,ud*"vp)eK&ݗLӴzC$,M`~|>6n`{$ ssۿ۶U3aYl6{PEvf?IZb&\R={V@.#F_@ 혦d^KXER(ag2MӮ r8y /.-ٖ}Pn]sbY#UI< IDAT, ZS* Vk0n+U2v2f8,@ ;*)jbJbY(* R !jeT*ijnt"7 p8H$+ 8@ww7NYt]e&baZ[[b;dY%ebrCC:,-.2[lifvY DaCtuv0=3,OfZcn[[[YH&~VB4Nپ]l@@ ǷY3|5IR̊*t*bp8G>O nFW(PMIh5㡵i4]GQ7n-rNPi48fF6$Ibvv!Lg ۮ[.. Fؾmn[r1M pܨdYefFFGz^6o$2` @ 812yw87fd2g&JӉc.V+rbXʴ}-bS5:6F:8UUW\.V4]G)RT0 v;[/:X0 ;SgRA@ F4NQ=#T3Z1jEIpՊe2TUpئ3M*uOhzZ(JckF)OeOA$i6Q_kX}g. @ 8LJ"%A\HVM\:jS7%H8l> @ g=ZY,k'!;:FUU-@L.˨j9&ZG:@ PzyYd@ GMra,i4,//iɾzGPm7)i զd]`4Mlތ 366F&iHi躎iT*TU2M(ǜ5+@Y12:R ǃ(gKiv[U$ yZhf[.!HQBЊA\Fu_k/U* ðÚM1k u:UsQdڏJr[VZo}dtAQ\4M* rZ׾5nrm^ej[VTW=c:g=kUex<3iEb@pb'qKY@E+,Xxt]g1bdd-[nYB 4U Do/#jn?11A:&Lvuvى,˔e۹h4J6%c&n͛6oZ@}}?eY* 2333L`p\l߶ Ijq:%UU魝K@P`Ϟ=D"Ra|,,,0>>^sqlټ>_MTb;A$"}}JRa rE yf\5E#344DXD$<>wufۿ۷x4Qqa;E熇)ՔEٸq#pޥR)"ItJC4&&&q:zqZZ[ BݷrLTbiiX,c{ώJaRD"l*144d+p>VNDZXi t;Nl7ť%mmR*xbnzikkX`r>x0 x}>;~DQz{zVe!d|llŞݼiM̰&vضml1;KQ-@ JPS@D,AMKZNbreʲ|[THtvvp\b1V(BL͛7PUfc1gfpDQ/D66 P*gov)$IDj{ho' vPH;::papF \.@N$Ibrrq~zn$S)@6>N* ccc }۶,i2Q*L&&WĚJt:8X>t] ^dX,v4mWi fZuk;4<,˜u+,3=3(ǃYEN>$FƘ!q:ۿ.hfx^|2{kܯ[395"===477Z\dffIoo/ranقdvvdrUn5ti~?==vITۊ$4|$S)bhEb~V$I0 x=N'Lq¡e{o;Yh4J\f|bsUaq8u+HLNN|dkJ=;|lTty&n7&011(|I433477;@ 8>?m!C hFB$IHuz,..b&pEQhmi!II$6oL@?.+QMm@PF`|ss37l@$'&x'+NkUUݔ\.mIHRHĆ @M6!ItuvсCe'}}x^#7$ItwuSø\.ZZZp*+Tͅv<hGf* yi{؎n[-zۻR(d(Jl>Ldii3a`ߏ匿vSR˅DսrTRenw(n[ٴRjK&ֆP(B2dY*  B|>BH$PM6hjjb v?,wT*E{[HCgG^ܜbHXڎoz{z477WMٌ{.0(^l޴ j{4MȲ|=( 7n$ VJػn6n$Fl,_z dk].A>Vcm9TW)dqiV Bak: Б=+˶c͟[H %==B!R$td23 B@cX ]GUU*2κ,8>䤝駧gc&Z$x-$趘gjzbhcN.[QʊG;r0 ۇa(@Bɻ? HP.N>')˲#a `aiZCT.NF_o/$Q.K$g:i?!f è;Á3--KT>Z?&QS$u(ۧ s*Wz,+륧L\S|0 JҊ5],xjVXrdR:嚛@ KF-j}=glٲe`i/-Jtu"`׋D[Z$_u0LBT--!/0;;KP`iiq\.WRPH$X,RTHRLLLt:YJ 1 r|tà/G#* SSSy cc vƮ]v1::j~?t:הaYF"e)  FFGٵkךZ[Ig2Ԟt:hT{.$IR.3^S r<FF0Lh$Rݳ1Ng}r̮]802R-njŪ{@; aU_mkH>]CN.QWa- RZj5Ajrg^ۭffgztT.3=3̌rܸd*E:1;,>iqYcajjUʒCUdjzwB|~5VB طo,t: äR~aR.drrEQYr:dvcH$Bx ʼn)u'vSz)6 0i?s#˲CٻP`5ֳ,/-!2M Ygxxa[1zρ(DQ讳B!&HJTZ^}!Bx^ԺJ> nTmUiX}շU˺uIpȵᬗeVu)o+0ۺ5gYE ð3^Y[u;Zz?k-7ՅMӤiv1Moar}N iIuJrűA}8ƚz}T**^{Ld'S*(˸ál?WFͥ@ 5hZ_Fk Ce.ZjJ֖Q.1 D#UBj>褷HUՆ5F!*7UӹF%pK@lⳇs4jîԽj|OeV<šѨ|9[XcvU\P$Χҵ<ըOT]9_8Ծidoglªt}${] 7jԫubi&rR,( BGj5NW "@q:u @ 8F?XjU$<OPB@ F:a PD}$Ȓ(H5WI1ki@ C3 Ja=|>UZ:d35tM#S*PñBA94-$I&]X?@ 6T.B("d@ 뤒IJNY%4m+|̬"@( rO$EQU|/HmiPTO%IleJ6El@ FuI m,˄Qz/JadK 8_Cw"aD77Gt8mZ}O5?ho~tRxq(|>4M;.ޣ&OƳ(ozӛ>с(Gr,|‹%ɠi,9!N8t]'LL&)k^_*XZZ"ϓ)yAsV(XZZ"R,PU'\t:m`)< t:>\t&$Id22.?<K%:--O8 Oۘ* ? o>/\>=P脜M}1|6l8w}[ q5c}bnffg48(N珒B[*{lϧR)Rdb$Iw|-[%u^k0 TU3oy˚u!nW[o%GP37_"|>ˏ~^>/=׾5Ge<|;ذa=krUbmOi|_UI~رc;& >J*3}V{f )e~_R.y%*SSٽ /pMj> sQ>Cry>ef?|~D#zyo__iTUXl> IDAT,m6wpi{`|| 6p?clj^ApꀈSâX,cxކfFZZXosF?;{_|1SS|so6\T-T{U_PBnbp847r w㠗YXא$D"㷄uYk&' èSS\cӮ|<{zeY8ֺQˊ7D:Õ2^Z}bii}q>E]>hßw$I`ӵOǜnir?so9pc$we7s%H$vm|COo8O 0 ~s, >cptǃ V}]ŀ`b}HD8b}ȲLXd!$fvJ2s8s}}}J$ hkoYgQT*$癚"DB&1 EbKKڊY(HR475U_SS4ttt`E~yf^Who/9033Coooϵqکz{nn1}"IٳmokxrA>u k>#iJT*~ss蠳Wb~~RD8RTcjzP(DWg'B0hooT*J81tfh~-//fikkOގ$IN"pF'*-(htiX6%J1==MOw7Hdmis8 N6*L&d2vg2b8d¡`V~}MM$Ndhjj"T;`zzIww7htE_"DVەLnI2dRbDQ2LX<9\.O*" N" с_!.$̐/Ӊ͑H$foN,crr޳HT" 1??(Ȳ .[l,F66[!#35=MGGT4xX1AX$penp㍤i%׼p8(Jӟ֖r mFUUwE&Y (xø\.{O^>u l߶.4M㿿]׉F"ȊR$_w\t[2>1Aoo 0mI\o$H|ƞW_x߼.jŐ/YI$|477\k~;,3@KK GlR][x,-/wy~HRxM޽޳j1777܀{_u﹇;3h4J>rf0~WIXL6T4M~p<,--;^FGG`~~nnJ\~7tttH|ٴiJOpZ\S>gjjSN9s>28;o#pCtttk>a>{-lذ>8'> /WE>o~;Hx<*6oތiٳ뮿V0pd2gW\WU* =P(p?MOOЇz w]}nbbbvb\u啴4\ xbn.۷oC\CG7 o>g,..u?_,//of)/_ޚo<=bo~:oz(B>煗\–-[x'7hjj"qх~=s[¹,i233_$Iw;e/}i=/~K(lE+9(|D"$I$I|lݺ)=E0 vITo %T$z{{KW,<u]tww311`nnK/=x^ g?ԧ=\*?\,W#x+~ettE\s5u0::-|??MӸk) eJ\B?a?|n~/~>| oxW]u|6Ervr9.2.r.RnV^T*r9 ^~zǹxk_cbz@$_"qzK/ '6 ´?3q_Wy[»/Jg?9^.JnNc_/~Kl۶O;ɩ)?ÕW\/xU?;X\\[nw?{U>p{IH("W)뮊 v WlX쬨* im&3ss ]dQ(3vٺmS{MFСCxh8իǦ͛8iK-/?E.( OR 3F{zddd0[iղe]b"v/4m҄7}vsI"?ilٺ.Ǝa| ^=,}v&NDn׿rص{7ڿaÆaQUX3gҭkW=n?hڤ 1114o~YZwqх3eeeڽݺ;;C])((`\v 6 oU̞͢Eп?nK޽L4ii޽9w1xР?Gƍyl֌#<;u*/Ə7GB/<)иq$$$}}12ӹ9s hܤ bop=D=z'[n!f֭|ݛJfϙ)SKİo…=={xx7ѣ UUUJڝuN,N'{| XrxٰaGVV3} 4_x1r~&OVؾ};>|>i+>E5>[,K䨩qMfwgg_r}ѭkW9k-Z笶m 7`…z32h߮]#w7kp?A׮])))a4}:dYyoՋ2^6G&Lr1mt;ƣ+4Mb]GƍygxGIJLq_3C4;~G&>ݻi3f}ǎfBK4rxt䓬Z?{.?Ë/g͈n70mt6l!C[iҤ .G%9) Gn٩S9vLnG3ý{r}Ѿ];\.L,gРA 6so>smڵx^|ƀぃlDx=PڴiYgEBB;uHf!̠e9琘HСǏGur\z%$$$`ԩiii|~^/QZZJyy9IIIu]o 6#W4iBBB=wٺe )5+YfҹS'RSS:|Cq:DvgLW=zGrх2}403>K^^PjOx/iذ! '8'FT(Ļt㍤6h@bb"ÆEl޼g''')O?M>}5r9ߒE^HzHNN .m۶ww\oߞh4nL̓~&Iff&w@4rsW;ub޽vMRRɤأrrfAx~(|>ʨhӦ O<NTQU?_s ;tvӪeK_؝Mqm`ٳ\zst҅CU~Xf _v۷'us 8Ьig)4_F&!!@ 7k֐Fq8n>"ߏcڵtЁHZZ7tnXTTETTTpGINJҋ/qƸn4]oڥ nf͚qWs1|t]gW_Ѥqczn'11/vQTTDAA[nꫮ}vӦuk^ dff2edfG,r4 EQT/D-0ᩬɥ^C>Hll,l޲; V+-[{lݲSc; U鋎:iCs͑rx^233N'JL v|NKKKoX( m۶eӨQ#Nnn.eee4nܘ,>S~?]!CGTT͛7ghiڴ)۷gϞ=lb5jK/W\"..Çs!iذ!m۶5xXf _i# ޝâepYֈj(1zfw8SNN|ev9v!vڅi4yXx1͚ѽ{wneZ9cG/_|x:n^KxHܹSz1df#`1WUUE|TjhLp\wMYz))6hn";;Tv ӧ_{-2z4I'Œ}8=v\b~E N ?V={^urrrwԯWܵ2ޙ7b\ڑѸ1K/fΦgH?gαcǨ8b$.bwv6G i޼9m6'EiEYY$%&F``̼[Ao_|a{sϼ+**(++#/,Foulv޽{Y`~Έ#"%iiiȔ~?@hzŋ馛3?86 M:t( ,˗ӭ[7bcc2d;wdl6ׯgҥQYYIAA_~TTTXf =ЯG+ ={tcذ!,d#MpNDT mxl6qI4]'bnsE^Ygvŧ~'1пI_^2|,6zq:*~BF2C WfϦaZ͛7Guiܸ17NdEUUU=iͿ]3iیْ^UUq9~߇:+ Y􇞿F$T;f d,^G{?_s 7ALL H7;\tߘ] hh'xٌA뮻B47גi*[·}Ǥɓ9X,||,f 8!pMppӽ[7:W_}>uC،`pNjlvT =_Vy-vj߾}ۿ/\?Ǎ㮱c߯_?znkԨ`g?NYy9vͼ,58sj, ]> cyկ|?Z>_뮣M6XV֯_ϲ>wrh_bpg)նmp\:1MN eLp\r뭷YdW /rq]a|>v?@/ k~;~M6q!6lHYf>|\l•W^7`߾}dgg?ʕ+;v,W\q#Gtg^xxCe٬[RRRҥ˯5M`p8F V]L]T~S ,YmҶm[ZgeLQJ.iiӇw'nJyy9)))sA8^UWA\\O%=\4]G1qqqjْVh٢Z"YK0: .\hv*P@04UV2'SEP޷7:|>XYYI1_ Hx{<*:p-))atno1[rxW :wĮ]XbeeejjߴWѪ_> gђ%AB|<,Cti&X,n:wD֭),.6wGqq1-[gOЬY3Sv8G믉&|TUV~6obcNRSSvٶmy5Mc3o^h\p‹/&[,iKF8m[ڵkGLqqDSkZdΝLu/5!)"11M7/BJڵkgv@՚V{:5x<PTc̟gVп?= cx^[׫G۶miwYnݚbcbNYno1-]9x $%'p8hРd6kFvhwY4kڔxEׯϊ+Nk `W_{QVVƺIII.Cn :BXJJJ̚^׬v(Kg̝wm6INNA:+vgE6mߠq']AkB~4CתU+#&P/%֭1M|vUTU%-5ܰ4KVh׮]&ު*|AmT6mP^^ζ~0J۷fj#hɷ}G-K8cGZhAؼE# JVVd G}D*MpH >kڵkGtt4TUUѸqc:vHǎ4PvLuGaӦM~̚59s3gzł {;4H:tԉ7dzQqƤ`6mJrr2̛7n_$n&wYgENjՋ 6{_řsM>OF@ƍӥsg^6Kkn5owˎ;fW^{u?@zz:F9ݺ3ϰO9kk׮e!İѮ_a3lPy뭷(((૯Ï>G4>N']t߰&ѢE` ѽ; htO>_g{]͛G#*ڰqFݻuc/ɢElݶٳg~z.l6NEox|ϘAEeeČUwC9k>޽{xxظq#[mcғO2ᇩ2fhGAAS˪8#6K/ 60{lO>_o>S~UXjJ2$&$P/%yǎ;غu+3gΤOߴ[nwرcdgg;;MmڴaғO| zm});[lᅗ^b֭,]~>,pхr' IQ/`޽[\2rstj@?;M4.㫯b„ lڴÇh"^V+7|jdzh"6nĉ9p jҭ[76m?OV\ۙ2e 7x#|OhB&*** 66s9-[DF5¯=ɀ;w.v:r_hܹsѣTCF=z?={[o;D>`˖- 63#e:ݻuNQШdddD$٬`ְ:(Fʹy (WϞJΝf%DGGӦukz fѣ1co&$''s?a.>XKIAuNiU=zp?Ep:׏QF7m(*i?>̛qFMѱnѢ~WffTUUt:iۦ #Gvx/Kb!#T^^׬;m۶[n~U***pEETCߍ52GzUW]+hݺ5;t#ի999$&&:+|⢢_=E?_?֭[Gn6mдiSc^;{keҥ,\&MpQ{f%k@ ;&&$pW3tȐ~YY3x06o>CUUuHBQH7;Nѷʴ3x7A.w:\*=>c-Z+*Ar+n$,F JVV~m̜5+W2s{yi4&NL I&=v;ٳy|D\..BOT}1#==^IHHGTU~G]toF'񐘐#l}(Nׯ9e-o}<@BB}zկo_?_|> ::n]kb;_d/SUU2wf*DMmW]Ŷmohܸ1vds睼[7^5jԈ1wib^r ~>O-"66kK.$Gl¿yyK-9g`v|5\C~A=<Ν;ݨ:y}]wE7ҕW\i||9~Ӈ WTgKVV]x!V&7//XڞuWRRRkHI檫ݫWj) $ڢǎ^i}6B / /7cƜyCYbbbD VbB 4\.3=gNpyL [nf5|]F;%eSRSSk̲P.ǎ7|>ڵk]|c[JJ p\^4OnV#Fѣ4(233=z4[64Me˖O^(ƍGN̶0a'Ndĉu5~x3bG}y<VXA߾}#yw߾}y1qoaҫW/hԨQz6lׯ7 YtЁ-[Fl*;l0<|oM֭=z4s΍>]t~׸~}O(6bccP.]wlW *J/-- >dՎUUUXPnд~ˡr<6|ȓp᭪"ΨsJomK~#&& D, U@ 57QLHH0szWBP_B@oQ"rkl۶G}&enw~$6?/JUU Xn;v47%+++'Y3yzrf-` /UU#>#UXv;~R11'\K5]M(..vNwg1WTTqX8ݨcSހ/z)*.nqCWPRR;.Ӊ'C?>o=)<x(.)!ڨG6 WouC%f5LM(-+ G$t쒒4M#..vk # χ۸?lDGEx?l+*pǮ~TVVzwQTfnZޖeX}r{T9g橇^( 4Ds4kx>:Yy.iqq1cS{uf*wOy\χ֖?Jg{> '}|iӦyTp @BkDN/g1 nzvRX4MV8ȑ#1b^{m _Vgc>C8BmsaF_ΨQ~ؓmVLk֞dW~zO9'%?أrCS)(,ӵKbbbޘh8Za !NqI jqMӘ7o .dƌf{TQQY`̚5WB38~!yyy̙3'bK?xuf`3Sw(7Ax)B "w <;e˖ѠAZ*++Yt)=v***JtNztcX;uvv5sdDyEB!DiTVVbIkذRBU~P a]u71 K뮵Lmπ( _} IIo9:$BSkJKK͂> _{;^ee%ʓ;/Vhw!B!~jł`Ovvp#\LC mfvzqw3}NB!fXp8w"1)JbGӴ঱uBU?B SXO @>h޽{ۼy3a!~Q8pVqE֭'4MaC;>e}FM>rJzePێ;ƚ5k4p`%4BBZkv5x ۤ|Bp߱PIzI\\?XM"Ky*+YhQ.ݻw5oe 470wEaa!]tbXv-z &&J?Gcǎ|>e޼yKI">`!jO73i֬Y dt]!u.T$ iZ08ϥ(jZw3 gEGGsXS.` ]/V￧Cf:C U˖PTXΝ;׷/=Ffft]G5.41sk]D WB^.Wf&M׀u1R_S/%%#iE>tXR݊;UUUq!HNN6wt:=rNJJ (Baa!%ŔPXTDtTTp0ۇj%6&bccQtlv-**#R/X!B呞jukRVVF^^^4a-=)[v#QTTd P^QAӰaCs`UU % C9rEUIm3w.//'** #Gl6hpBTTTIKK#!!<G4CQ/% %k?.43( VMP%08-hƓO=E݆jeڵ<;u*UUUDGGX@oCYYmڴ޻&11b~-tԉrhܤ ~x?7|CYY?۵c̝wk.8)O>ɒ%KXd <Ӥ2)))1c34iǼwe޻EUU0׈TVV2mt>56QSRRr6㉉ٕMbB0sPU5=ޞ;?l֭[s='|§KԔ)$'PXTĘcۧyrAll,%%%\v\s8lb.[ƌ3q\x^l6fݻ /UW())iӦ<ԫW|)nJll,eee\x\t:)/+1chܸ1{qȑs9r !p  H]HHx~~>SN%++]GTT+WfϦe˖_l ,oc8x_zg1c8߭[wE-ؾcO? ~!F1cxyl{<c dٸ/]vL4晙Pj Ͻoy׷/<3u*ӦO{t_zӧgNxxe<#Ǔ]1sg>ncǎϿ ҂Mbrn&jۖ}1yf2wba/s1?Fs4LKO ~TݻwsM7ѪeKB!iDž`ڠ:zUZia)–-[2F7oNZZ\|1ڷ7S<WfޝXZgeqyyf,_ttܙuJfػox3%,PDEE3n7qqqft5]G4.[FM:dqqq4mڔ?_s #& IDATR4McŊtԉ; :+QFpsު*kF\=;u~ݛÇPU˪ի߿?=z 66VQ\LBb";t/ ڵki۶-III;v6pWӲU+bccѣ;vdݺuTUUS 8sW_^JzF7jĨ#5kOu.KJJ ;wo7)++lذ౻wK.[׋(ճ'aÆfB!i55M3iEUt`$$$РA9N32(۾w/GrsybDPtcHII yy4_EQh֬HMQnJ"]}_ UU#?Qp1O^Ҳ2 (.. 矣*o>3 eѡB!~u9Ήj W+i$ԡ}{z{R^=35QN ݎij@3fD3P~(ϪdUUeРAfz(|>N'cB!}trp/B8P+B6mٿ?ZDQؓCχ(8ZhGTTVv))) vv:#FUҼ8B#P?D\渦8()-k׮N 輬X, nM6qesrr͍.9) ʞ={8cG, @o֬1N-P7*\гG[]ԩY*Q#nbcbݫVRR BpX,ZgegQPXHRb"޽wkTVZELV+@t:q\44*^DEѫg`QRZ`XP*m BqzurJ+PJ`p vgEjj*/~-;vW^afp0hXc-&NH٩0=&//Kp~ \p۷Wffع'L>Hyy9rcN*vfyUOyN'Æͷb%` sp0h@V\sh >'zlۗիWj* j :tڕWa%8x+WrmA[, {a̙l۶[bZ8`@Xd ͟Ϗ?ȒO?eۗXֵ+_}EsAV~%oϏUVV2婧xel3MK!ⴡDGw`bûTS8t]vswp8ޭ L^^9Kп***x(=kXh޼9o(^k@t Kg8`߬YÜW_%'' \Zs(BAGLLԡcGF=w.˖-CUU6l-B|B гG.r>C/YB||<^r ~1_S\wgYXVի #Fƛo7oGb!333Fu/V-[Ҽys4M3gB7Ĵә9kVArSw\gdpرL}9;4M^zyAbexw|t҅F0g.n5 +giq/, 8+޽x^sfF!t* v eҥzvT>)-- v$Y]q\fUTT_P@Bh@D#Oee%n7Ӈ^ ;WVVD⩬fۃ)O~?^ nvFEy9\.bbbp:Eh%VUaXԩQqq1>Dv;ު*ao#\EE( QFRq:fje^YP$G;wrw3}4),,jvqVB.--%ڱu]{zB; !Bߏn+Ea5$''KM(DGGGj{g(\5t(Έ`fE\V5bdgQՓ~𿗐Q9YUo>8eZn^g~LUUѹRc+BtNB!NGœTوPr:ءC,!BªZ P`3\F!j M!jbBqR;N B!⌤Am\W^B!B/1&$_!B!Dm1`tH-/kS6)Yo9~g!׊|ɵ"׊\+r)'HZQݎfX T Z%x- .KN!B!aj4B!vOlD(B!$*JU*!B!Dm -PB!BrZB!BZUg !B!`S V]mD(B!8siF̡2 "B!-aۢ !B!o.|#B]%B!B^a!F,Eր!B!ꀪi*xB!#TJQTUU B! HBob|_feeꮮhxC DHF(هOzq'v&B1yػ!hxgD#0 4l7+>Tf6$_DGwWWkVt|I;}CȂ  X(D(D5X+})21W{zٱ ZjGrAAa1O(h,|@΄$C?}hMOn&S Kְn A|'Mp% u  bUeY({- J&]==$d Ab9sR7 *zr\eAA᛻Elvb@< b804X021d*u|7H8̎8u˖R q:P M[t , ˲0M4,4 WAOm(d@8(Lf"n#Uc]Ǿb^Ć]6 :A0, TU4Mlb~?> ~$_, WI]um( %@$ ^|XUiZy3V( 66`askow!o&bJ$1AU d4B9cI9V_."V]MMMBvAAډwE:u\6ϵmRD(!B;˗ !PL.|r4)5s^7? <äR)~q~CM\UUfhp-̮yP 679AClRbK[QT? w%mr/ N-/ÀWWѶ-mX2q<=Gߢ~冻>R84 MӦQGFXOoo/I֬^}z8ٵs- 0$Lٳw/?x{zcrݷo= t?- \.uuuEw3|,N12$hkL&aDQBДgiT"N{p8O.#Հ( R)TU>kI_4L$J J\\6K$% MG\.AXpA"xhh]iinftdkXlٔg_~I.pxf. =T*ř3gXz536LvZ(eq9LBU ,`M3gNiGu֮][mFFFx񢷀,VP;;;@s5k-rLBմyLy۶˗;~??я6Q}>l=l!UzA Q,MLZU,(@tEp m[7^mR dGL8J144ķv YSs"*-|SO{MMM{75XuVP`}\W^mʱ&q!>3ˏ_ohwF IDAT+{dY,f޵3eY}}\RuPUql<:V@o_IBؼi'B4}===^߭Z>-+͟_xW=2W9z<~RĿ&Ds:wVZuC\d2 ^ouE '\,qQ,pxe˖*R]]M<g`` S__i\|0E&-ѣ?#\|[ߚZ}P.FHH͓\@He]+UrDϒ/7>Eu|>f\0Mذa7۟ea'H;Ɖ'ٲe kWfhh={~P>V߷?=˴8~[ᡇD"a'O[;vBgg'>V}QLd / O?%*]t:;C(9q$G˗S*ٳw/{7\p>x,mۼmۤR)㭷S3G<$IϫBSc#`kسw/::ؼieqaKu"A]m4 .\Ȯ]M&~ UUU+DQϧ}u^"Hp%=ʥ.֭Y㵍dxd2|%Q]M6w>]ݷDYudtz|I>SOKs3x܇,?!ap!Z[u.q%{~ȩӧy'Q ɥ˗qE1ΟgÆ d2߳`0w /8q$`kC\z_xZΝ;?N}]k֬!qAE>2McbĜir…Nkp:kjj|N0lq+V#G߲YLp*B+yQrnY(WXNݲ>lop.mlPKG3l6K"wW;ϓIYVϺ.[;vP?Gw(@{{p8L>ǶmGF(J;w.O؍|1C(tH8<_NKK YcSU6LRĞ{) O~rKTU|PMd5>AjQ4uq;+saE)ҥK 099SXAaсyEhF"oH$iivwD*EP`uzg@ eEkK ~Hr9sk׮y22>NT1V oaJqCCCy_N0$ aY\H4\q\oeh۶&Q ^dI99TS'^t5bEUJ"eݒ%[q[,iz ȃtTRPDDiznGYnT9Yx41QܹstttL&uCCS>Ƕmb(~Mѣ475F˦d`A'ܶmgQuf)l{ES8v4ӱc|g! 1᚞Ą* H$8Ad1Z\+uv~?wb5tuw'X|9/XAAё֯_?e.N_0>>NMM 1::Jݬ4-T(K6&OLDhkkCUUJi6u:qbVTUŶm]P(jk9fҜ{`T*ae e1 n|o \w"QULݭ|֭[yGf$1 ÉYs&t Od#,%,BusN[ۦT,244׬'pfŊ+̅\7|d2K/8=;6{($ ׯ388 O?M[k+ޜ|݋i݂bI5k< HPDМ `6:;;\Dn5NAA뽝. "kx Ν;)8xw3Uێkqt.]L.P(066 s.e+x.\`ڵ|9|>lǏcUMرcH{M+6SWWi}F^{~?bssWnqQ|[lAUUFGGr'@y)@۶u00 Kl2 ǎ?'ɠWWSSA@(&LH=`ppd2I}}====\tz&&&>r f+B  N34e gjCc#}\"YSC*:g}Q pNqkr*B-={gJPwʹXEgg'B 6*gϞ0 ӧAQCEMJ:}>-y w.t&JͲm`,WX>_a؝,T- - LωE//ƭ||6ψ} 6oСC|;{X,ƥ˗9l߶}tu^r%;Ƈ~SO>'p%'?u] HMN2<і-[Tݼ;۞ɴT܀ a9BccjjjhokԩSf}>:pgb&z ;wz;17s^x9t0կYu^UU6<;v&/_/Xv-׭d2ɋw޽t9ώ&YSsvkO<{7] 7-GCb̎$ga``3gzyyw*1ӤKÛH$Xv-'NSN|ͷv wu188H&"0s]MOh4͛`ɒ%|>E6hnnPfRߢ?nڶ7֯_?cBSSFRUKz{y衇Qf맴ƪ_k׮b}wnt?߱&qnFݱj̹,_t-Ë5ݻwƍ@lj_ PטtyL˷m] (ℤXI+,Mj}l:- ?0@>+[,ZG.pA:!JŦT5@~3Ml.OUgTl3R2 nqI^YRrXssMRG"Y&')TUU cs+ E ~]slEI ̲,,N>7Vɽ֕c\P8f2&&&r&33[Pj>gQUUEhb&{~u*gݽfn*o=L&3yGQB  H$"~ '?ƀ[1:ܾJMN)c=Q2 AY,.2mbl+|;S˲(Bqɞk亥ϕYҶmF&:#w"|)5$ʾ}7l HzlOOrɒ+e9Xewpj~4oX<,GI*^zY]^O*#Fm{X@&RAu%dq g9RSǂ  ,vaƥc)  @Xs   ,aP]_AAAA5PuTt    m{U  `(7~%  ‚O(   ,T۶   ۶nXĶ,AAA /DQҙ    a^1B3JM+  p( (|ds9 DAAaA(4 Uu2%   AAbY׮'= 2:6%AA^(QU@ |^zHAA{e\&:UEQux<1LSzJAA bP("tݮms,)L(  ]0:6FիqTUaQU-N<'_(p "AA6lk<D"GQlFUU3gضmcYmc&yZillAAA0-l6. x]=ckPΞ=k[ {P =9eY4{ 5`0S2glkq^_yۚq=[wӖڪ)ZywVlz[mUU9ښrv~u۶fGԖ#G2<~JeJRbHPo`\.G4# mM< `'B/0  vD߭ݓUqö)SeJ JeM?y>+ۚwMJfwl73Eb`L?>s[mk֛Mښm;:߹&\mGDIDAT\)7iyۚ带7;=lM|-f7/νc9}G7;c}#Uv=w9~b@A>om}]shU,+ \ ÛgEI3Ų"dfLϞMp۪7k˽i[rj/+k5 rucfmM?;mk3ۃvn71jN<۶f[܋y4y$H#Gkk~e[|)]ٖ2ρ"=wRU>;]y?Ҍ]3]ՙH e1OJ-gOl·jv;-O=W]7g-ywnn{wg i$swi;^Wwrm~^/B\w|,B=ss C~-!y~9q}G?|_7\,,o??gs3oFYa>y'>jvekc\tuwܾML~»@Z 7?rǗ XNM\_nMWYy9zdGO7//sΔI`/c"ߌ" qK~#HU"+}}VqK?%LYƸ@lv!l8+XA\J~a!do^kLqwO>{]u iSb%z )r*R!ǜr% z %Tr)Vz 5Ts-V{-VZmMg\+Ï0H#2hOgƙfef_~Lʪ Ŏ;ˮ~ȵNX}nL_cuN6GNbhhx\'N/|\wI}EF[R5N__mKb , HaOt&!a˱F!Ϳ"_cy9\G-XX}AdVeG;S\oS3T0l-a/ѵEhFFZu1hrC'JN]~cj:j_\5:YM}.|W#5 &L:N>2{ @a̲"2 7DިzA8wrvh[E:.}l˭A(Z6~kܵpt/>ޱrږaW4< #Y[;'\"I!L "Vv @hJVDVBڤ)pq }I,j ";0p>/jvpql> eZk=8bB)}ކO5[˓"V0ү21Oi]|ϢoRoIw:sP"Ӣ"e"i[ꖮU+,n{U#2^! E6u:?ZW0l Y0m.\@5`<)F~@Ltw|0v}!M湘I~64Q/ q/UEAr "?gm!IsOIJ&.[֠a'U,qb,"YȆP/g xɊLjSdVy na(-(*fmzI&"H*pZCjNޢTU$ #IpN5ZxkwDUiѮ4=E ;2! '\/beоI3@L0+{mf$$~_:?F^B eUnWt4SבGaGݞ}`1"3Y=ށFQYi %(Mz#DAby3SggOޢ7Lr<ڼ ",<Jr`Ig@p0OhowЖ<\N0~ִ9H#]u. O؊FGҎHViFXp2:pI~S!I-<Ӗ+;:8Q@L~LSMP5 }e0@I]FGpȢBaDo"N@ի,+؍:؆C`'&-UX?ߓx@{v>9w-kAU#, 2_Fr3$#X Zg;_Ո9̦EhVۑp,ki2d!4 HQ!>_#p !E]pćmrUfCȑ\jZ!<;1]0g|й/A܍D2jo~L10TUHgC@V5]$0l,rFGЉbt53zT)H8&!llKwYz1Z5zH|M| RGS<\FoH h,,o9GLQCZNC!t u8[VY/ ?EgG2 Ͳ;J7 IY-V>B$@2V: n %ڴ(")YgFB"uգDYJȾHac[hޢK޷TL0-dJkgM z~)6mb. p?SFJՀonyy}EC!m%' GG0#^JfC!wCq3#z|ξ2ƣ::+:;" 0dN8hȤ+ ۮunuz/W}f M9߳$ {6Ί,P4<9VWQ_ 0çu9=4֠N֜Q&93N%!$,#*%?T]oy\R%:rnX6a^ M>^Xeh(TZ|IXǙ%HUjԩk[G^|e{%OB~! P{D( iWw3xNMX@kq:,{7x0TQBVI%BgʖsշI?ó+l`F%XCskш*0\0TEKjnGB\hlطW_M ,X髭D lbo-  =sQavM6ӛǩ_tЇ{P WRuXKIhɝz.r'ΆPNxXGH0&~GU.&qzJ[`.fb'm\zgg#_}Mgξ7'>ςT<nv^{ݙnB!h9M\_W{J= ;hwN|#Gbp潾l_ +A+1"?M{O/CGhp(0/JB)xdX!ǃ2tݢ/K/pG B3>l-QmsK2wOdgNTbI`kwpm@p̙'V}D@k9\ MMg)b`ܟOLR#p<ُA:m~oT:'?cu]}|w w%_{5ty(z"?}V^ڝ=wrUe@R0@Quj|;J+=q)ιDlAp=N[B΢ I=3rMy o5 析x@GiCCPICC profilex}=H@_["vqP,*U(BP+`rФ!Iqq\ ~,V\uup77'E)IExwq7*L5‪YF&r!#3YQLs|׻>+>xEN/<9U-*<*B2@ MPX<+$%ݾ>}ɡ\%4〔>&8c( Ph YB2}`l='sDN ~T;' @HbT^xg/#re&"eMA~;BmO+kT$=k_Ix<*ݱqA|N? f=TꚯҢ]wV)"}ƃ/tY}k6T -+/?5\EU9$'@m{]9P_`|uUe6}B1EHQ+gUC:O$9Fqi`o]僡R:\K!P0qŪ|TE]N]KA:6 :~#U$]L3! !=0(,\dE Y9/V٨y+;6Oi#u@+ʿPV4/aHE_Qv׼xd뿓56i ϞVi"VY[վC/c CR" 6zY#@;r P]!Jf0(fL85ӥ55)gguׁ67@ cߨ_VQx)rv.iK- V )% "wC]15ND a8z2)IX˅!9MK:`D`@w@ct{v,b[KNwHw! U)͛ܚAŸY}傖@!LUI2qt4*$RoPÊUFX)R MPH]e0>@THB*('5D2St`X= \ Mۧj4*Q.[b8V,P!XoUJ k>$u)6>vt=>`*Oz8 [+/z{!e* \h_3[ȱ0G 2g=ZlEHq'$f0GK %1EJ?90|몺`nӕ6 5_ZڰBEhkcVϳk6reg==Ͻ%&-ݐkX(2{cOQQ[xsZ*Heۊ~6V8^-(YBxLrA &\Od8m?*Ow GyV,S̠"jiS㛈q{\(a[P;a%""Ԑ8ׄ7`ۙXVCd) R,)h$&O&x+2Xrhn[\A/dg:+6RI#Vנ>'Y}+ )R,乎]CIQzXE`y]S(ʑt][x$o9iB40Xb&ˢz0*:VcW晌 %A"mQ!km: a/(!R!˗fv+)URڡFP2On]d i+<ϒ~ J`s`"U5RY!Ր&JO %1g8FknnESI!S]jC5SR/{N(Hx ; ⣆!7DMqY _Gr!P).O[#Db UBajGJ(QYFP$jr(^eᔮ$Їs,0DB#J1ia[cgjPqa1\!QCz;5,sdVrha& >(OSF1@ R#&%:=%H,"-A }翪xj& ue, : NbA`ۆd0 H7 EVs%3ceϊ`C~jw))[m !@۬\ou P< wꑀ60@~x4,? 秨=X|HN뫊S4ݠ*l1Jt1B_]UQÓ~,?G98^a$VY:!%+Ai#@{gGkݮ)[H#'jL߫XgB!e̸qJ^/#ھLX+\A9ɾ|+kI % `e3fai7 s1TkDpIV5$&YOčĘq{ 6) ^ͬk̬H*Psc]X$/N\*:2GrȦM Pb$U)AlRPWi1T1+BHmVc@-O[MV{xTk X!I!+QZm86(+I˄hʁb-}-oZ_X,)QKHWfI@J+DzBya­[&Qhܨ| @@t}"EQ GS"iG& .:rHP,qj^ AA͗P)#RޚİyUC E"=KݱЗF!9{VZ琖 KQ2ޣ!\4U*y^ \7T}8`8Tz +Vtj,H~l^=\2KSwEsv8z`>}s a'`o<v{8$+'D7- Z *S(-k$kfΟj}vju]ƫ`Tsy|~5A  ̆RQ[ͥ 5 ݃F+8Q֬' {7);†5hPJֆL֡ AD*Yi 0(7_f9d[Z3 3-AjT-` I˩iOW ~.g9ż/N?C!bBZg9Y SIbxHIA8.KA`RE5;N41dn| ˕ԔAS)e} d!I8^=5Lpr@$O|镘0tPiIHIK @RK @( VBehXBs\' ?| I<2q§\NM:e)T.᫏l$87!E -%$uջ`v >Ғ%-%#N}R d{)b$eZ)Om#*Mi&13.{zLP'cAD(Z6W!9Х%-hJKѧ4fPT7~)>QµI$:=\W_DX2J&jB9)" Op.hƀYb090- Ӓ*riIK:vO{q=]Ǎ:p{Cu0{#fUB@F'"tH45!V9˗0)r- Tf V o:QU_vWF-ՕӒ*risNjhBT?eNnZxIRTPÅkJ\_MDA\xC&:5"Q2AS>4OLG#X;0i`pƬ /lKRö<]hs?#! 0z 7E6y{5b٧7+[7FС7Zޙ{%Fcg꡵N:P 8Tx[,NA0px@aږRs Zfwf][sa& d&@&CG`[`i &6jĀ5Q-V)) ZҒ*rq)JxDh>8g]y3fښȐRbӶ7PE4'>182 ˲ВoF)=Å C-8!eXPaֶٌIseLe[QSpֱɛ转P(ޓBxThT8K|L+SO))9u ~!D3QnrddkHs(? p9h:d-qN0 9K47eY( ?fQ1/covehסlM'F B:ĹmDVQ@A،9?#{Z  OΕq |{cpd.Ŭ3B76o߆/1\tκ=yp߿aao/Ƃ|o+~Z=[vX[,l{'؁\Snj4<;mǵ^3|ͬ\.v~f]g%y4MxFn\~уر ofkl\y=@1䅩+\pd+|Ax2ސPɞ BNʢt F$ʲQ20$ D@ c|"}-oVE>C@S^^3/J B {h{F dCG0wdBuibctW(0`Cf=l;N͙Jh&Ο\1109l`vl8ztʖ 3qeX,%0ZN emK atl 4ik6N bX@PM  G? ?i3W_r)y?|ؼ ho@xƍ~]]l?/?1$3Zyy^޼_Ƣ R{.sh7#W7go7vj=w>_+.\[{ <=aYF{BTJ r R:i~K>US@21PP֝ f13Ϫôl cVLֻRhyUdŝ9dș?J.[12`1^h0ګA1OzBåcǿ-3` ttgbMrʕ999"I2F\=M2/h y8!0V,~3wÅ̟ۍ6ׂ(paz`FG wv2Z,ѣ3̚9v.3X*"aNg'8>8G53;fmC860#3sf鰥ĉA9xžho1UeP#Kav́a(K?~A{k+gwY?ݛccsz{ze=g69{3$Ki#6:Y cl[xs;xv 1l&)%he IDAT;ٝ[J=q3fBĆW_Ƽ^|B{{yg?Ó>ς鮿eGbEa:k RK!S D*P_$џ}R0`RwO-|meљ5HB N ʋȚF|@)0'YVVixZ#Zfw=hmكOu,_ccAdJbap[INO@E'o)[ML-)14XXɂ 00Z=d$F=T(&_8אoax([gw V-Y ˶SO_;jR=` ?ih(ff"|aen"f֎r+>k%z̅e[Xh1OV.].|wy޳ǎg\lݾ ߸;msزuC_&|ᓟAG{-\|w^<8{Z\zo+HPjL5 L4Y d!ԩ p yt.Y:1ĩoC.pQ_142[104oˋZ>29=={߇q{Кo(gF6wc>94kql`>J}Мo ]0uՍ ijO4qoMW]|6hݹb _C6+W9󺻑d@[[چ :kh{Ɨq|(5gn7.<=֞ݘ3k6~` = ߾G??a`VG_/mÇqQ̝5Bks3CXl9^q+C)-?q;מ }xs.,Rb;V2E 8Zv Q.*hkǂ,3c- nG6XR2V\xȚd_Od J2yI9x Be6 ՠiDE}0Crs;8;XBrQ}ppX|9Ύ?0N \.CsoI|߾ֿ43]% #GAD+0se3^s X`!^Ft'0/>!OHU$A;7+F3$ A* ^pK9G\ b5 ;d5HK B@ְk;Z~ dl:<\e;!j%'2m-!:3 oٍ1= ^ںQ,08< 0!EU.X4rXh$oKǟ/nތc~ҖNd !fD6 ˶ܑ mַԔ~H7.ڼ};~Gq4M \z .=<BsGS6߽> [|9_oǟ|˘ގ7܄Kс|.a…U]|?ADªjޚ1|_wŵ] Yc' aXa gsW_ǟy R7^s-.bgL)Κ9 O9;~ ߁eY#?A>e]hB`(k0 0c˄$d^>-8!|O. 7b?O Nl4; 20Ĺ,"[-4CI0q }}jڧ N$@F0s(1Y2lKD(K(JhQ, F`s9u OwpG1c_#1 {pbh[܁'7_.zd={6Ctx-tBWg')%`ضs'G@iD{oio}1]K/Z;{7:^߹ b~YK=184hx3 yVg[{v~ׇ+/XyBD8kX8*d+߰ʕdpFN#"={sǚeqbhD|o|~K_˖+([lik`(D3=shm*lu/7u{o;r_ݘ݃uVc׾y,7}6~h;v݋'}>P*|٘5c&~e|{E6>~2 {q߇aw ǂy#wcfL<ܳ(Jho@KK3l\۶}[o6,_)6o]QuC,7XD꠩n0'40U.RёdXzr G3bt"d bcąW@ې΋PR!PmAv TM"[ۮ3ops C* xAF:q]0( iIAd (aih-qK8nNJQRIBU"ECqZy{^ؼ R iCWg'.X?$~i^-@ٲX2 _W_x?@~&fϜ{n/_ţ<5k/_]r߶ۺ7nqfW>笕]?%˗M,N K44"^C*iP@[bÖ-nHl}k$3tՅx@\zEh傶㷅&VŭH6o›?ԇ֭Zg1kLvM?wz?٣Ƽݸ ɀ5 sgw>sV߃o3 suW_ 00RA[k+>pz?_?c7oceGlS9@5'7"q'GFxz!hW{-u`So)ҏWBRB 1`\e|iAMMx3-Gz`v ze4# 2Z[|-keMC(OQ1LLRZR2 %- 06LB җ (Im,ʖ lſӲ|*+g͘=زc; `٢Es`&V,Z/}sxcNu+Wb__ƊEho +_+V M,6,]=:;nGK>0frG(J?oA᜕+qa0Lq˭ "?'ko i" Ԅf,ozD {{p0O3g펂d2h6EǟMlٱ0K-+13;{6>;т^|kfN|.0MlD w~$3{C{q՘3{6lڄ!՗^=>HZd)mN8V-[?E[k{.<<ڻN`тXt/YCAuwӌ?HX;hIJڦIS ԣ(v}:)P4]lTaTn 54z烷ȥWaow',P|ڏ ,meQ8k5Zn59,Q<}e߁q ˒(f ,O+?2 '%dƚ.n)~9 ]IbC282*᥎0` n>^ *YxN|lyZw'x 3kG;ҏ?{v~&H)cwƞ_=e&ݱd fض !ĸm$2j&5 lǩre ac}ZcVy})a@S^ȡ6D{~/qPg =“,k'GnD'{$O<#]XOUw~ga= Ɋ On1!`Ff:ΙRSL 4\al`KCf\쌪ƕ&mxreڅ1{ f ίסlr@&FT.N-M n=0Thr.@̬ٽȘzсΙ[}ښ[pDC{K 9#\:Gg01Dɘ33u wb À dPmҨ'%JQWĄBo7Uܓm)ȓ'H>e /nOF4)5ݦ%-idx"MeVS6s^6Awz3RilU207y]\/83/z=ؕ+m[2eC 9^ZyD*xCo{I'Gndt`* qK?I0s8Mi9)[r0̤X㱲q9z]<.J ,%'0sCv•O]aMd4Zi):sIKEFY )쌴`ʖ n̤:jGcC5V\ZAHm|^G yAS " t"P FhI 'W s܄T NKZRe0eK3Y\>n\ PWWf+7exBjW7dѵ09t9 N[rʷ $e)*N k!4ȡh|8 dސ"5ѵ=Q;RDЩz1l@HT!<0+MәxZҾ\^,892S«8.ZU#Wъ++NALF zDIҨI5ƗRM2FgL=U}wPNh1;a5킕*)IKXcb, CSS%07:)Mqy ~&jSbhbVt-h9tHpVۤ$3=jۣ'G})Lq*1*уn;c'XB(d*}gH]2WRy| ~V}Jځ' Fz5/&p8#5tEƣZծ@+s⸥}?2R &/HqschkjDD)Ad) k8FpiIAHZRn|J)+ҵ(.d'*@8]Yqb \T:0=$BbiqrdPjl&t/OTW}isz`V,0jK!Җ.xa0L'ɈƇɩZr31DVD(> *Q$%  !ŝj$@Jz(tU=N! @"Tz&)9#&aQudLPra2bNM%ՒӒ ddNt.$}GڥZq{EC^]h:Ŵ*C}*h:D*7y6!]æ tB;hTAj9`cJ%ՒS D{I~DC4*!_)MQu:ߩ !=vy "bYA9$Skɛ&iBr%D7o xr@ /Nz $-Ամb&&+aPIbcC*CDQ@! ;~PŃ ‘Ppk&yLTIVѽ&qn'SL.!/s 0 D+JG䂐U"-iIJÚL rW;$0Bp_-tR *t&XF;}sWJnL[biߧ2j?S5 *wD: 0eʹeT(͹\X)(:E WrxhUJFOFjD31`< 1GI2 IDATD~[)% #770=/  J qm&0w֞@Q.afB~XF R!iIKZj-RJ<ȳSSPIjkU5X#~i0طiw8sin6KO10p354$8Tx:h~(4x4.U ;2Jݚj*iIKC-1 +nSS;ei([OLtU}inX:4hߨnP,uw@Se@$04L IԚ3Rj7Rmy '͔i\ZRs[.k3۰jH) @XӃݎ wB_?:Z۰zɒJñҒԜ|F5CGB/$'K^z5Ts& OhJE8W/XMM9c;҆77 8qcc5{.t,TG˔ 8fyRoj(G<#A'/ -(KG2ӕ&-iǑ1<+x綾c%֛Gƹ˗X.|wlaܹOa-W*jQ@r:Xe,d|wƂ E㷽1Q{@B)148F3=Aṫax02<=xgvٵW\u=mlٴ3gΆmk3Ls NFQ"yyJe㴙iBSά ,-s!  d[2-fmÅhєpr,Nc;(%f,D.ġExwwWoCY 70 lzsʖZf·?\j 1r٬9(ɟ UhPğnHaUVl[̎FY`%"6d H`͚Q.>Nr8kJ]3gV2v 2!yL^{F{ W9xM(GqU433f^.?֏{v6bǶ-}„0XPJ>,`2$i61 /JK8/K𫧰r:̚=Wםr?B3LFzzZN!]=]s {{G]-<[2o^Bp݅+|P"ě{v \w%_߿/WvxO]oM >=)~'(+J*O҆SQl66M˖-ecӾ3fm?1M "03yŗ]\Fqpt {pQ<-) +uFo8iIq)%i 09R05NCC), OII) J0?K; WƯ6 ށ˖ᵝ;׶Ƌ/>xF,DS| `ivZOK5G$ԓ19ybDU~#@b릗єˣ~;Xtƶ7cӻGD'&`A x礃SjW$LCg iu-HfXoR$,qWlY868ȘwU5 D4[n9WpdLcҔ+F)wj3$!gF`V 5NU|=IJjOdV=B,^ ۶\zŵػm sVλryK%,]?gn/, !a@&uB'-t"SI)ġ> [?7ahhn m;7@R{xySc0™@ң@Ғ&U{.ۄ+;;7+5k{s9+SM;!Vc럤ɀDʡQͥb5o퀣fB 4Nb
    R٦&^{_,Wyki8rZS+2\Tƍ/P(0M,Y[b``_|9:M^Fss }MhjܤȯKD4ug^xZOS.MS?ƟJSVm E˿L3]tfi[SѾ&W TJGpO Es۶}]ds-*:MWl6^wOe۰mfK˟T70 ` ns5bg,]Yϡ[q3,˂2'"~Di"O2ö\ö-j_eY0̠O_ w!vrpi%uiu*|>e`nQʿO_S}^{׽qe9 a-O+*Mʿ(t<~TҕBgNRԑMaYiKwN?ÕNeuZ}Ye K+ϝZӤm;+-mؖΉZC4I|UU[tG϶%*q\_?T.+Ή.eg8=aC0&;O/W?{'Uy}ocY.wQl(QQ$MԨalK4&SF_M4ŨX;ņa ۔s 3~pwgΜs~W]MV*Fڛr2r,-Яp@v.ˤ$Tǵo|½/-nfZtE٬pbq;Qur*-LRox_+ӧvKύK5S<˫ hucӣBP#Y(0RQZݝ_AIς3?(s{y4ᠺdnn` ()B4Wv%ʭ+Z,_h~&Rtd ,ZWkY+y %b2jF@()Z0(74vE+ˬM(f Rw:l&kK(k5)NJW;Cه6׈mn I+Y5hV45(,]ii g+͆H`Fӳ5:ƭ-< Y 6n{Ɵ¥6ǾPUdm XراF?pfVqxUjvM8{CIWZw+) Pnm,AohG[@L$E8ZvS4XXC1HӰ'Jw-VV4xjΤ|:ˤR-l6j/ QŗZHT%0p뇶!b Q pCNIHin28pnæRl XK Y h#ﶱDhQ-;j£^`uK)Q$mD QS&h*}Lb݉7m9¥N?=uS8|i?.t !<\+i׈+O=<lgyU3y{=8 ~KMK@jm F}ca/BJ=)ae~:%1 у5N -z)\@kXֺ/G"@ i .~[H-qͨEXGZA- lǠ| [;3@K:zI$^|0dEB xW_WWφ>|x"՜*BKɳHeZhSBzPXP@ɮ%YiVMAXf+`OY̜Ɋ/L_jJzEm]-/3 s?5X4uW]WモDbg1sJHz4&r ww:wۯP[={tߨQ;{6={`Q=#>5/C-B#gP7Wu;SL m[òey^S<\頬;t;ýp8߽~\ĘۤόɤҘ.m@thro `he*f`{ycRm 7=BJD,ZU AV6ϯ3^P&kVoƨiD =Bff;жۑ/ytt b"!~'ٹs'RJ֮]OÆ<rssΪٸi#Æ Kl Eğ^B=c*xw1#MΝٺi3 6N%/?;vy|駀c䩧ӥ{wjkY纄IǤбcٶu+_FqO9|,_B}M ;uk4TUqgҧo_֮]c>hM2zCQ|d KK9a"ǜp={&a:>~=H)ͥۀAT!`s aV~=ΛGmLvE=(ٽÎZUKsرq]UKϡdڵ 5zg믽aT;a #ƍCA|L16v,yy,Yy <˖$QAرmKǂ>]M?,=H:u&Y]{sش|I0t*`|"F}4{KϡcDzX$bqo Wto;R!Z]!3Cu> 4n}I!۪c-;^e2 mfkpA!!P 2p!i"xl[m?^Set^3۱ίJHf}zr1= ihhgʩ3 K_AS5t%owb$R\>:r̙xmP8de!UӧNeYgCq˝kn$T5i1B IDAT石ꫯtӱ#EEEEI'L&+;p8L\ԫ>^I]( ;mO>ICmf'>Y\yu <|**偪t&0K[O硇3nA֬^f`9r=FQ|>_{#sRk=z9ktrv_oov`_g>'tn|@$7_>e%ر>0#}A|w7i"DTUTDK/k1ݯ@[o,$1{=%'/?o:7ϚE"[QQ[b7LhFexS6D@p6>.ЊO'US0*+wpPhhN ]0gZb%D&/ l}ц{kD֠66B$  i%fyʶm~JpC6k-:"Cfe|I`'3.I~  {$3xp?RU7abKJq nmZ"MS3\عIE(ɬh1BkZڜRnl^9 w WJ!-荛(UqiCzcT?*de"ژJMӢ-.ZĪnu~s,% n6!j߳$;"Ņ:uB_AM$++c"+;Թӽ{W{n’yiU$tKkr֝w879a&s4={OYG}D'wޙnH0bڵzu 5zG^d/-bOy9\qUU},?m;_^V# .`بQtDVv6D}UUAJ/^̒ŋ;F<|6oӯHVDW^';fΤK׮ y5>555l_^/$F)BJի?x0 &=.X=_ϼɓyO" rzv)O )%_/^̪Uh/u7݄㈉ Bp((4R[5>G'>CӹyW|{Y;P0H<ſ;G|J{*p׃ҷo13>v,͞R#zJ?ciӨyGÜ9}:MF([a!Hr=/@7RWU͖M8ndqo_*ٶz ,ssѳ'%%|4oyWܹ3R·H^|'{/0G5Fiw/b}sXQYSZ a8-:VPˎ5[5@jaL6z*, iobڴ Z3HW KK@.E:ns"<mJqF2ėz`=s:kd[% :0QdǾ'۠%WCؾ}o̝&<'3kѪ.HVi*X(kΝl\3d$H&B‚dlsTWU!UUUYlBf"J{#!V vnۖTS(߳q& lg:G Dx[ Ñthn,3} T:w*Yl&޽[So)^8бcJ4%sرdP[Y^ M!@wHӦUCJE޹{D"@Iq1x{oIƔOS:r$r RJ`hOI,gƍȄjFBʓ>J^kkkjH$[ (q^juUU嗹׿C;3ٹƆjkjxI[uU;wP]n׵]))%W]IB~}D,,ɱS+ um۲r;\LX~VXz 井8tE^㤜z;! h!G6dvuQJt^_)_lA(Z.m@>+2[EkZxb{uۃg 6ŐJ$n ޖ<1$7B5ű&\4Dɶv6 ^qrs>l{9>n:ygiOz4,0QڐHA- X46#T|VNj*# Rέ[)ݵ\@!ÆQ_[4H 8~3/k~TUcl^UJB0cƎ~dggS]YI~A^|1}#??x<8xpmb:V[Yŋ9rD Î8!w`k<'M;85  ҡAXXc ͜'TRu*.X?@kЯ_?z̀ѣ9 |!yrr0p lvn'ȢaƱvja)"s ŋhE~h[ q9Pg(?]Àx?ЩSF$YsRIga'/d8d09쩯K|ݛg_v;pθVX /=SVSP,"{/20zMjoR΍^¢bTn AiZK j]E1F|dMkv}dH5i#Gf <"DPG<ֈ H5]e4@| @yKnh-IIJq*WeU5~qUH)Ï(,,;v:vwq"{vA}"RƯelzhVv6 5 ljƢiM?qt^gúu᷿%+'YCQϞ\{M %x7_{X,FMM Owԥ W_=/< ]{-={SQ^Nvv6})gMN޽~P֬\+{h,D"◿䓏>X4Jc4TUb8x=ܹcЫO_Dh4,]+W2tp.JLZx5M΀A?p UeELKZVŒmJ$466&xW/F57ܐbM~?>ӧM#H(  ,OOYX} ⣷bG0id?D$p(K9Ki+77Slۇ\vJ,_>#Gw@tDuu {*ٽ};=KZ6#&N$cG8k-{^ߟݺsNnݚn@tڕ ֬YÚ%Kگ/H*!(޹hc#E}PSYɲO?E]m-;7o搱c )-/'(-[9QԽj6n/㏧{w"av.f?{ƞ0P8̦5kرvx諙7zѣ1r$,_ޝG '?!'77^}W3lX‘ՕXhAcRSUEMe%9|#Ʊ{6wK> 6,ig!нO]]?,^L͞=!;r$Ekְ}Z 8r$/H 3/ToE!DFBV~Fy$Vl۶GY:0:P]Sիٽq߹3,A5`$̰qO݊ V,^BCu5ЭFQY^ΪйwoN(_|8j"{vf(~C? Zmo^R P65Jl;ZG&`4~NK3UK&@>lYu?4ĭ `| PHeP΍:Uۆ lrgN?w7t=[l݊[RRRן>l(~lnfVZo{={1ēP_:.FzB >;x(^_7 ]uE6aY+N20[0uʁ^;IOL`ӓ<)zn gӳTRsSּri'&eQRꥊ.8V/(vcJl!3axE8b!tK]/-8=P^# O<4P?y^.}LV3^Je ߶83Tg @I@8f`e3:{Io#0#G<ۢm0L2S9#%o W>ּv v xUUQ /c3r0f"ds8>_>(B]tAJ;B\p;`H;Nl.v:NƆ#R@D&TD"/ilHhr|>Hj3&eDo%\Ɂ)U!PR" !~9tĚ+v{ GeŲx?pڴ[,[e|~~^|Oݛ6s[o%O0x Z{,njad4RmRN_akl1gi}E(V $^~S70C6cSF')٬iRao5c1tieZBRM]ktI.&Д$fsuF;vF6/;padlTYHMWƭ6~3 Z}. Y?HK*[{luf#@BBBEMI44 >|QnƆ6)11tXyZwk{r H+E0.LvKjCxWҁÆO3ΞF~ǎѧOʔrۥKzO,gģl۲D<i;,6ʖ,R7mt6}(̴҅ڳa Iz{:,t0.)^o4:Mz,1ְĊ^)<0I}rX>v@㡱 k6kh''p&7 4pBxk ޹; Rc #a /U*9wiu酏ҭO혴YS hm$shSlN[jGIOM  h#:?"(i9괛:׺'!gpCcpR?@3xi\5$5 %]lN&qdTs ~$&iz%r[96-eg$^̸ ů(zlt4vE, cY͌#& yO"m dK^v-K^rLN[pj 21xXk)g쀥͌neJٵuT/NSWhub=~c5T{_z^ m/ⓒ`"A_M5JUU:D$7UR$'?iFg"Бz/uN Q+FHIWWK]6zjD"#_*MiWr:uBVv6K@IIIχjr%$16|ftԉiMOo.9 r֝%]goK|(>j"aQnI kRZ+l°^6J 6MR_sĢ/;k6HboPȥSs hRb^` @#4WFQ/qv`=%e2v0¹.q1 7H7JdTu n r*^Sx(f{Uy΄_ޥ!M)B<@)i6XNn'PP0H8'KWnUJ^Z=CzICMzʂ'P쵹Z-WY/, ҃B@ Q!df10*6l[D"&P,`,|d0!3=D2=]&ܸ1?nx*ݲQŝ֮D;G;fہ/fv1$FުHUΜJuo/kUcW jxU%:PTLgiF[z.>s*p?ҁ%!ToE-0f'ޤIRI,JhRsĻsഩS9d:0y[>KR.ZĮk>z45|a^Xlo>@Vv6'8iYCZkm+CA)6^:`߽~R{.SrVMB.s}m/bj aeIzqRuFd !E2 Rb}@$3XzU%3]Z[HˣkXY&Mx}2نL_kkf5_B |>Tm s6@ d L~p?jO:+t2X < l:W <prx^éa-ZMK*wUL6c bas5BD}9O( 6a ;"6S$y4֡t@^@hvNKhQ̻kĽ!藗{^h0ڹ)o`t"7}UIJC(B9Ӵm8ݏp(WHC(Hz@SU|h^jZ@F^c`ASXci D*첱(H?Y=E/|PxKLilٸmPӳ4H$~@Sxtf.Cn6ʢ)y:W˕\K%_j Hc~yK,;C;r9ltL>wc,nIl^|w l paoyy3 a6]"w7υ[xP^Sv4Tjhw`:bl>ŜYZdȅߍTFƂ넦j볍iBV=)[,UD5ڈ> `S]6f/`B]xٟ(nƊTzkG:;=H$lٰD4f/g[2uZALWSPfYv+p bzO4U 7XZaVX|Hp!mX<[yDEWϛKK[[3Gp7{Qk0fGG^XiGnv{Nn߳+0}3al߶E{*[g0FO@VN[֯gw1F6yIH.m{Sx!aFkMXƜ2-{Va[-lݼ֙ѯ9<]HK 8BFtфR&r d"64|"~HLf- .HK]]^+j!MROCp)jNNogCFqyH.o~ytv@O^\6R0hb^{ vDŽ ȤBd9\B4嵹oP_U\Ǘ]Fmm->-v0㺟r%P^V]?9[WL_2S8l8(oΛg@քr\s 466rwrї؇xg'Ҳ\=Ƒ'"@Q*+yy'Q >4y2`ݻv_5_OAAs_{^{-=W|EIfJ}Ns.kӂIJ9(1eJ1IE (5`Ƭ(JKaɽ0b!||ݷlZcb7X֤)ax]I3:$-T0dR٫!<";Mkܽd s 2zkJ'j'zƶNp4:nku e!pK%v,R猰H &9@Hi*=tOOFTEI&>_˰~SȝXO`Uϝ=.sgK==OoD"A(+8W>@0H0sر~Ws.}w>zN ) K lOr~uDme% geQU^o c M}m-_N!Y`$Ϩdصisִ_\THMU%63b8P=wcZҧO_ž=et((`+ ν{/.B9tۏr TkzD`$B!CE"H)bƍ1h`b(;uMEAt!l_D,F޽ dS_]CB eel]ҬI P|>ޚ3L!/.dݷȑ7y299qz͍JNn.7ngQW^A^.Drsؽq#XYvul\6Rϧ.c׆ $q|~?O7(-[ F"w튔XWG͞2& txal7 )+K7M0 kWr ؽr@"SWUEBBYv젡@(D瞽UUQYZBΝX8]Kjd/P8BEI1{ʑHr :PWsTP̃u!lK3jb[8ۊE @f5)ufa5<&є7NJ;8+fZgFYQ=ۙðp 8pLm̅eRJ'l㚨LBM T66P糥?0_#1fs3V~i/Umllgeq`MW#Bn]o֤*Eɚ9'a5 qC1j̡TGD(-.a}q3naj<A~6vu99b16o7Ыwo~>ke'貙3P$B]hcED)6oZe\MϾ}AJ6YMٲb%?N9c*5t҅عmO<kVn鐟O"ys0CQ|>^x!L?D+a#G)).wGTWл_? ׭g^+tK/+/GA0=D^T!M$S!KssˣgV|n`1rL9dyw|-0dD4_ #fE?e Y#l 7L(F( 7m+hlg̼jz@Mu5?.1Y.<Ҡs3]vu 6ff7̺l^N;#)%eWsN:lۺ^{˹\@.]||>N:YXD4t(Uӷ_?:8CFs׮TWUC}1-K>Uڵiaܶ۷@STUE{s^%ž=ь0_}E$;O>`Մ"N:tۭq'2vx8c|0]G"s d p1|(>c!xqtJIz|߇TSNI~TFUD<\.RȔSOO,㎣W/v̘5kx70x0P[Q+L8:uTO=w:3?g 2?;carg{NV,[1ϊyV@C3hh)V^ a┎UӰS-"zMtNZ<`?[r6jԽ6iz)i*=ym ۿ$|8>T2م"ꈤN}Sj-zN!H$sGQT?@0FmC~c 0W]oc?K H0Fk)@Ue[/L;H%RdB" i&^k J(/oObF(|8]<1N:P({sP]q͝&Ȁ_f֭ 2![7mD^^>l8.8J~3{6۷neoĬGᒫlfkQcCO5)F>}0x0> gw `2H˯x,o|M6н[7~uè{i|!Ͼ;2ńvɿ^x/rjkM>`0@tC0deb[~<}͞/2nΟ3fp5א/Ȗ8nfY_| ̚1 IDATnY 6N:Gg!K/py9 Y(̼FzL??>8~_JH>>]8Sxgti(;qiס&Ŕ0n:#I&l=?2Ϟ2ҠK~|Sοqǧg0GMu5laDnݻJv*aȑHyӣ?%9tT?ˤV k-W‹⟙eIf"[TKE!1hq"^3zGK,<"&3_2*4*ib$Ha l ar!kiLnLZl%kTTYiڭB4 ) Bg*lvTEh)Ȁ%ğb/u1R˨(AS>yyc*Tj_'皫"P3g~3ϘJuM smŶ^<h.->4E ՓwKxO1eHntَ)۱r"@y.))%Dtϒb|]w'ݯ/#M=s[:`|>-7nrݽs'veM^$ -"iD]}={$c4UM6ܹ d˖-l]h4k8I>?f9kD._nP- ԤB, PU ߰! ZD(,*' [ʐ:ΙCmE9 (*~}=$:(  :8vg>cR$H&!~O9g~Wބ8B=Zz"‚;8ƤS4ઞ!޾>L<&MjdyMj~) XJ~8Ws?~`D LlQ#JVDyFTiGN<{ϝ̔@OOJݘ?>IA2Vae|k_&M»/s4J==Xx1=Ӄ3f`(6@? #^m7ߌםw>t 7"ТE8C6ߠoT̜m5IZK&MǗ,矏_J|7^xhĠRr(aG?:Pr1xpǢV` ޜRD:U4:XZm6/~:5_,dLl0)";ĎaЫ&`UenD*mRSEqT[RaN 28y?#=@<'1K,_`6ߤgpEJMcTL3"STX:0Z!"ą" Q>"Zl!^&`M Bd(2@ %Y>fZYu,^,[ W8 wy淿=32'=LP40QF\@lZF\pKN7>`lt?Ᏸܽ\#>_w@ [l>lsEW 8 77b^sE>~GԓO<6R|(Xz5.~<pw'k=Byt###9kַ6 /0{uŔ)Sp?|߱O<9xo+8}&&.BV׿N}+0} 5oL fƃ??zq>\|k\l߶ ۶lR Z OXAM""hc \𒗝/}3 64$"fq50O=* .F?G.ɓ]qv5?bo{׻q&qnlXHJ%\qUx⬳~N'?ylA-5kb ``1*7HZylZ%!nn{~> :)qZ믿!o[Pup; m V[!+kQQՅ7{~K,>tM8Q~B<;1}ԇa\ƚÚի('7߂f!tDO_/nقVĪի5xq e@#.JݨV*Ó+W߿-wyf,.,[;> ۋnlټ?/cOf܃o{~?&O 77_}&ejL)3f[o֭>MÝފ͛QƼ@^@?swvvlބS0}lumؾqC7|7׏g1ZbƬYx.L g&,IM@fϮ+m0m^O? SOɓ14GGbr""ձ1q=MPZwQ-A~&72}5az_yGK5)@A$_O_2&gs,;[J#4Ly6utڨQJhj!x"a{aG 4^xJ?op5Wc02"nmݞiqhR]z)J%sy{1X`!?85sLzꩈvj.C8ÑAQ|K6YW2ưA ̨U*ؾnH*`xv oݦOWֽrcCk{H?lJcpV%B'ΨIą0c;wZkfjEд%1hՇjP2!.G}I/: D|ַe0ceO#g`-. 21FKY?Q7M,kwVS%e)co@W%xX4I,w.W?cVR2A]lJT*G-զDRkM18 VBY@pHH+ciVM6tpamԀ [Wfz̈u+pb/hcX٬YH8u8wn#93[?[kVK+WRcԷ Ԕؘ 3VkرcJc [n=wtlقnhJ%ô1hW}*F3,9mZ`V[ g0!e2L{Djb<|ӱ^%^F5v퇆LzNF\5kPӾ/ztW]Gv\p]I_vA rMJ6o)0FS@G+tJWʌXfKM)ڱ"9ֽ'vrA]h;4̊u` BFm"1Dmd " @b#CR#7%o]egDɕ2/ o$J0'NaˮJS*K>:BEȳB%&CJx]ãQFV7æg4lZX5&(&UdX o߁gﰂsT9A<4tCiR*fvEq&N,LGE_!hyK,f os/jpzr#'ȀӉS[4Spu dX[+,Պ !)5HSa/L=Mv0UD'6כka̳\5䏉AМSϬ||VtW,8Іv$K8NY Q(!҂46+( ߏ  W5aʲwy$ڿKK'Av.'6*涘@]'(V}P@{i u0}رntf*l P.¬Ŵ3ADؼa>:[ SFHKHy.2:VSh5uCֆUl|VFNL5g7DȢBNYx\ɤ pQ|w{ֿV ;\a2hS-W5w=V`$e ܉*P?WS֞AíS(bH#C&7S@Tuĕ jcHS4qw/G2}k @g:{-c+DmkԞ܎,x1xދ; `ZwwcG?]_ {|\Ođ^},7bʧ5eB\0{=kV?),{DQ: T0?BטhZ>~髂 R4慃>$2;Ý| G78Al@;/U!0c&b Py5 5 726wNcɜRj_鈿fsnjW<FI5ݞK17[V;]h֬1#ՀZ qj>*+@\-38ÚV~Aq^w,Yuxk_ Y ωN&!I)UŚ,g%1ȝL2qWOqC}?Bt= 8*aVzfxpccB\WP7 ܅ŧߝe 7K80xWߏ^7! %eL\+) )|[#6;*XsRQkޮuǍc]{S>$%By00]:]_nU](G nӛ79U\6YB--U97D6<Hbþ6u"&Y?E-cU ~ sM1B&l<V.a4%knS@XCڿ_ &B)Sxx1NbW<N+(w_pˏ%,F\cdd4|u {e36WZCpȣxP'I 1 u'S8'|H4 ugf,q?\;$|4~IiBOlisTFDZ|&7l;gFG |9J z,E8"0j)JyKD>n'A{Zh]J8jxY ˥[I2\Ylim7#] (+P@md\bNk?.^4 y'r"G=Z5J)3 pHDb դ>g~ڢH)1Ϯg0V,[9Ь9sP(㴳^_"lX%LcV@,>xĽ /Y:&!OEd}QqPVJci*6O0部Z$=`RrVVCHͩ;6& s e z.3(wީw?8EL'g ` {ߣ0 %I^uFH<ɗ0qS0$ |zo"Ip)pjy2[Ӆ襹vcFVG~t @}prck#<)a N9 ȑ֥*a %W"0s8 Zhj%%"" yKrr<1 t:N:sͩiAjG:4'29ð =llÚB~ *X[iAgbLyw%ٕep}]'D*%R9} 0'B.H"Y,*[TH~Z̊ݔ;x, ,sCͺ@Ȇ秐ss_Ԧ+d ˅|8};2B8){Jʹ9Wk0+Z~03^{4y ?@ j V07s>Ocǵ_~!DdN#U5az= {+-r\ IDAT.Y~ 6wVIsۧuB+9)6LxGB}r.sKE{ zݼeunUV(D8~Fm^P$v>,vm.0_QH KZ$8Zql$g M} nl_Or:lǒއ]L⸙hIfDknA+i (R"y: L;r"Jj""l^ccc;onoSOcyF-Ҕɘ70]x=?¯x(r52^ܸ! ">ȆØrpPU'X$aRkԷBpBg )& Mr >0>:Y4:՛,H wi<`( ϊKPHG5YVrbla r1Zߩ(BY@=??WZ L;\>??hTetܑ686W񒗟݋igvsRq;4d,bB (KU>tNO@%"*ɳUaeX,}uAC~vbtB= I'Vpy[!cqI!t4)(:-xEn@c I3VE\7M*W2 tXyOd{?l ?' Jǚ!r yE'cM& A;֞~/=}-᥯x9j:X>q^#QV&M/}&\ėNz1^`ox=w 'jzj< q9g7ۘr2߮퀂dotZ퍪ŞX6{HRY}-Jl"@1/+.F⢚izꁄ/YI$+cn: \ƶ#cɔ#>MoAP  ǘ9^,_T1tJaRD I/Q#J :^tmƃd+3pd]촩JfE~V<|旭 L/|sKcíi*~&;Wq\ |>z |d]B8+!wH;d,8y{!f;G+uOi|ox#F|qP46g6*celјLJ):C(ÌDV qQP*aʬؾq3Պԙ0'U9] -JW$-qX56xc:hk\NIWJj흀Nt8B&.!cy|Jb߸m'#}Exl^Za}OI3DQ,Ol9DVYq6lk#̜mv%:^$4w0q9w"6#ߏ"[=k&h64,͈P(*6M+{ %۳2tB;e~J.\rٕ8EԤLedhfBl_Q!}b7qͫ׊ :VƖ5k}*Mrx"}!ǐT/"&X%as(20B)yL TV jd|OtY+rL*BёvcnyP dೕC5ˉ1R 8v.9vO8}fm~AQGGNTZ:mouu݈֊M A8" F& PJ׵dkoSlّtߨCCʃ3Rt}J" ),{}21˕FM!\ T+S8cZ U!n"d3[kױƅbiB4[ADk] .J+X}ifVQarx^_HXHx58^jw8irZ Qc2ҩv v-G'UEWJ[W•}g=Y3 r-:͔:}ܕٓs"!NzXDH0n'm!s̚a81,8ɦh!I==4(#=ӑM9f_[Jv5P/Ę@ESg 2*8ҝ6ׁG{= 2\s7+LEOP>_rq.)f|;*䝄jp@3uL;cj6'Wg8R@ШE{ڱPR z99zre $9.ǔ4uV_kyg1,z0R]w!X{,*m]a!ማ@ZLΫ/Dr]cw_hV$`յ7,f - -l7I)Uߌ +c&hِ <-aIKV@ މVi.w6ޯ!ϭrŵEWK`^rqH&@dZwuQavm,설93AKYR䏜VEg*wpJj5QD5F'uVrHQ˱zfLA~lY#]l1a~pNX>TGGaY p! zOPEVCytDl&f`ATQVE$)hZHze> Xۉ7^xNs <[9;i0l~!2N ;A 66d({ e PkTǫڸ`qV]$?z{{3e/~+zPJ1xwg;'?e755,8NV:eRbUsu1 e/U\Zڐc\'0bS?>ϠT*(Bww ~;>f_̠Q7S_yaFTc)6c:.tuw#:ZS:So~[K/-[q;މ7} ԍalްX lkop?rܷv]l|SNŦ1sLW"_(w C۶hs>c9s8q1ODR _ZK7E9 yR`)bGr:FtW"nXp3E4ʼn΂N#m'T܋μ|ݬS@ tBmۜA#Gc= cp&u[D,GܤUU[QȖ~u%8&n$[ХK0Af݋7"Flp[4fH`DK|@#vZiuLse>d_nz%FnRo#!ԻJ] ǁe`#֘/]r/aժ`f]Vwa$B}YAf|O|\}}暫ӛZ؂<7t|ݹξB>_GpϜ<}q8 ǔSa:_cooF^}:9_|{щXj5~}ݏqi瞃)SacW?)"99w/xYz~Qŋɧ/>U8W`->чƯ~SlzYW3}EZS+V?ބI&1c tض~=⸎W}N; tJxbRtX|{۰ܹشaNLapWՅcO8GŸ鍊ڎ&3gĔS4'MO: 13v F:^Rt*. s݅^<4#kdl@ҹ \jOSʁa섹Δm#,t,tZfiķCodC(yClPwG\":KF\/gc%#|.D)d !ڭBᙒ5%UKX`ӆ;ha!28sNR%rpjߓ26 ?6I \"ـV^r?J%DłimV̋b͔mi}Xz >iyDi1")[+xA3Jkv̅E:gB}v8n1z1\ۋz\y5>32e 7i2 ㍿IPK%)>wMb`u)XK$wFiƖLR f:̢tL;ɆmF*3'RikȈ/Lzxd4">Xi SN>%4V鹈iT;[hhD8=o2?P!_#σPUw&Oƪg?ضu+fΞ+UƔiӰq͇ظ~=_xz{{G}]xzz'pm"#dzO? 7QTԊxE]W0<y [r)| 95Wuy Ml_lcJgy6l +H녅Mv}EQLPܪŮ M C"& g\v=]~dۧ>]2XYM! ȎJ0Ⱳz =eoǓxlZzlܛrス=x9կ= 'O;oΝ'7YQ7Y1򤭑^@ze.ŧ>80upw}ݹl{o.\?AO8ۅbOX^q%z:Qftࡇ`L#>w>),ӂd M:Tönތ/} oӧZ ?K,%KpᇡR_,𷗾nqw| c٘=`f,|K_~{ %KRZ.' P,'pGFGS`Z{vMwRw7rN9tCŕqn|d(r'/tqi{MR=zbPݔl f86D^k'xJf|Mwe!0KT-lwD$$Cܦ՛}/ZoV8lP5#gkU,NR62%yE 03-B:Uujԩ~\-ZȂk5&zk$uӑ_]rxOb9] R qLrAap XVӠeIz$sTXāl -S%tr̖m!qXZ V6k>Lf(uO_Hk{~[A i"{/w("lټq)bW"YcȠUkD}0T#CCCMgC␓G#WJwѻZ _.u#QT5yxMQE9["Be,6I!B">406$YVVadh/;@"r]]JPgҤ$Ro׭ÊĊM#H~}V\q8ƍ_bXƛ. qR.ݍÏ<}}@V؞q 7N>YQڜvʹMIOlVܻ?i|tŦ~TSIVKHY&]g eQG鎦ֹX[AO0yޭy*QFv˜)Gu(FUL?@@j5˫^7Fmk,)RS^Y$R@ l,jִB3jq  >eCv ꊐAS[LSh,Id05Xv[NCjԿϖ9 NQRɗ P EBB1#B{eCa6EL2{z&᠃·۶m^x>: IDAT100{.tҋt B鰧I!%E~bjz5"kykW䣧s08HpXb{ot!83p od *?5[6oc ℓNŒY'm603zpi_͛6⺯[2PŮ"=0ڀr~zZ\>/Sg@.aԲeU*䗾Gu4oۆg_C; SNEZǟ!^Jwt` ,I/})]]Xl^tɍ1]O?%= ׾Z Z  eTe  VnzJsN $Jm{; Tm>c{qwԬ)[&MG"N,dYfR|W#b֙Kjj(n,)2#| H=ۨjCʫhO A9Hr}쌯7@\360e7ȈX\M+96'lU@lT 䔤X(ߏ_{-Q)qz|kQծfx}0#*wF{}cV؈Ylut(Dgy!,D.۱Z(A 7M=+Y2"H5lmBinH30u#736\&4-eAxe)bl^$YOGmFubF;uj^1SDP!Y<%K1.iΣHmynVV};S=aŵYV2>g5[aڜ?! x]g#3L7eG`&pZC}x\$$J$ʿY7_R/GY_n"xnVQdZuUcFG~ԗCXo"H4D{与 ? D,_9l݊Mϯ 7 DލKwR{b9}7̜5 7lիz+ߍ}fŽ;SO᷿;̌clߴ2~Az1|_~STelYs4J6oقz@`[oO?}sCCXzb?`=@ 6+.A+Wٳ<*:>?cX`Xh\߲v-ۋ?X|nftJS aW$)(]qǂ3duS4L|ULN0w\TXJ2PzWl%3@{FYj\ @%)đfO HP"[8'D1Z R*J`ÎL nZ ۿr_Q'> am_~%kJtu2kqQʵ G(%cwSz*@DJ!Ш  ʂ}Qd0`!!JbcnFҔz93,oSH ˺ʱj8!Ց+৾6vəaSJKh~>}zxr_7A[_oӰB==8P,ۇRhMTAA#tOi|a|ox5TZdX2ڠM[/Ӂzi=-Ug43tj!Cz/u3Dٗ oRmRy9qn6vGM1D龊voBx'uĤ /<tF4gI=g#R?/by[2$$\3լnkrװٟ}BOE2a εTd{\֒ ZRӚ1gO]15z$;:TfXlWJw~g/%ljSul-E5$_ۻse?Blrdu^/(L; q.BՂ.es4<\B\̨k/~ Ψj|%GӟAD(^h _v9>` #!%y.6>Gy)|APh02c˖-ZKDJ <:"Aq FB+qd%Rך8ÂX0ILlI5clp̀ |} fX`ȞssSXȟ5sF_DUlqW8lAlWIzפas4',xJz6D;- G(=npqҙIaTƋMBñQ0/QFUT@`JLX[^ D%hiN%+ih1ጛ)w5tu! pfY" GhsT : PGh\lKIXSoy Vs_=]C0I) :xGR}TJDf-{/ p: ó+vS _B)&Aij4K]JI,tKvx~Hg娀S&[Y(Z\oJ{)oI:P"אo1[iG2Mpõ sěr,6.DGvϸvdQ!ZL|L68fFR3#bJPQkFu23_z>Ca.lfEE)Oq$$"Gc.;ɮ7ٺFM*Dd2PLؤ uMJH#6[߾D62#*J)sszخYAxC)V NZ;)T2dR# vFۿg6G}l;FwgD$=~߸ `j 3 _$lLk8# Y皫y8Q24{4-Ij&{ELgSigR!e7'eml%P/D7$ bK @PV)κXlF&Kl'oS$^ >|y(: ޟecwfY2lqXQHhըĐ$%@%e7+[C|rfX}$0ʨcGb,Gl|PU Mi$@0_Hؘ:u@ɋ^CrZӀ :Q[;xߡĮf*J>`l`E%"ΰ7LNj֞j}j-_$ɞucKU4nDz?UqXKRT]p~ȧAsė o УE@O|?f/Q̸tl>Cu(C@Q:Y>:X7B)I)9YD7\wg,C]YC5o($|#K64i4ngO_ccil)$BRX`]3AǚN܄*rU<,zk1Jh>tw>O\dMjuf *̚3gQ:(6K"j()jg3Lsv0BMPǿ+Zd&ҾF-Z`.JIa#ߗ'rbٺ()JLD&-2BD7j5Nh+2M}'XHpI|jveVTU:'M%vS:ڜZ 8ꈧ.2~lo 4,لRD oHLG64(J!FY\S5:ټj6{̊>>B^`[Iwک/yV/϶WY>;nsڗCsAOh48o'~3Efǐ%ItLK."VG<2j$pbpXy @KTZI dm#TS-N{eyg3'\DѴdOth5Cr::@"3f3H Κ432\ѳf-@)b= aڀ&6V묈N!Q$W5Dlmŷ*H`C J. Kubӈb$Π j\) P2h & v?jC J3xDYJe2c}ҙ̍>tiby!ldh4Y+͟thfwF@9vjZRúsusgT (tI2@jI !OwY$¡NODP{FJ:@m3`ړ]\m[6p!J娹%7XY!] OLS h؎Ը2_!rI[p$:@M5v~@2ȲYzFcat1r2s@h.eBHӊH+ouʚNl 6 "(kePȄp=lf6Q"۰rSU3h;|tmZT}JY٭Xs,q5ŪmmP5̙(u΄N7EE&jKZN|*ȶ5+bEZYKH-’!O9j4S$KvD>5ANAfŹaA6#"ɆOr]ln6)#vIfʜ{@hGTCd}X Nh(MR@DTŦI 5!5V>ٰU:;}D4^Zt6YҤ:D[vPQ^cŃ'0C>YE/jJ#%%V.7XFǀZOV=B05?2Z`D' 8ʷܸP= H5jfA @m'2V_x5j e$'ty3̾ C_?q(nIv(٦ld dni f'"̀Vy dn$ft(4( G;? A\H^m 8@ Cf<ġ' !h3OrE5 ,19߳%b O*3"<#eg>_P˚X;y|&$5YRY`@#W,h$G; \UVe2F[բmꀠ^md3s9DtG^!"P7_1}  BM7)Pa^Xrl[#$YE;Hfpq}oՉ[:)PeݐJZ׀#C )-cFyMkoP%k;Ȳpri؊694(xhgzN/f,jBE#pڀI|] ,V nS"Szmu($YDK"p YK ̑N@'rgo1a)/N>߅ ޥ%̮P)h…rքnb-3,%X5{H538naj`q(7&(9#'\PzPDRDq=r\dfj2 Y.57RE^#vYI:LIc1BDjOBl5^cbQܦFo{T|,I'#jg@2LlG Db}84)[Cݦ9ceTЙ ~.,8f$D=6V-mҁqbL{4= ,""ԦDeB NSYH)h^&Gd0$DMwIRa\dcGu^mG2Aʽ"n@Wu:@gW2uԛz!K0[9C#t{# PeD)JlV7@jŠEzP iGP#2+|_ x8Neoj3TcIN(m^:?NʆA,[nwފڿIcAHxߔcR3] ִeReZDK8vy!̱aBu Drtҥ Q sVɥ7*rq+֋<ڟaCwWmIRG_!xxwR(wbת?ÎhuORn-q?rdXf@*(BCHT IDATmG#JjvWyWl Ii'O %eZj9ELgVHC&lB5# T䂴w6 viX2$J^n7MMHjKMUeVëu.5BBۧUd hHl^0XGX"ubssQhtj#D:Ql^tJ)􎨛ok^Aښ,LQ0Tkq*-iC,d!f fMrdWHsf'Ьf+iZD8dDFQIvUD0Hw89q0j8_⸣Wʪw LLh%+#X}v^6CC/`7ڠ\ $w*X}/5 ڞ*Jf8gtw˪j1^Z:3M^Q^E-gXQosDO/\WSjHM bqlO3U==,ZS|<Bnn1W}v3lTY:o"3^vex_k+&O_K~HEsMq"یdbN$|Ad}}-ȟ_eӷ˘M5dOl7U+vuX`$"GCva7wvA%XP/T*kNZ!at{͜ny@5:{%Sv|TN)cb Zݷ3KoqA{ VLaػ@:&{ sńFKH~ q0Av+I@|mko'@)=(a|$I=58[g,"䨀gf(R͛Px`HhjM u$VfcZa=vmZ?-2qپ%"mKVkD7Lf-%'x{hMV)X@A6e62I.QnZ3EDCe˶ղ3̩~Z,9hPcju:$MׯqDm0k (UJ[!PnI|iZB;?`!<֋ƺ<<h~gX)DUxAIdRäiN@V 诱*wl?\^{3" a2'" /Zn kI=.uq"Jpا Dd#>XdY(>Ñ~ȽPf Ǭ',a$P%6;Mfm`K,[LYz$\4Li;u6 0tݘ1`ɺmH_ޤMntv«=dn3:MskaLB:^H4ubLq^-$ܣJTeXdlS=,j5J$"~~ћ-<7,LFį2fBkTsd1dp,={AfգgM `VЃ꒬1 Z0PvAA fV3%[sfdہ #'S-̬ݓ#ЙRHm|T?_&WU$EOAGG:sI7$ *pSZ4B&KP=tfk ݺ?00{D`$N1E_-25RB$C6g2UI.@7yϋط51xTOzy |!@@S턴\5߈jރ&={e}exqU),=DTz3XWZ#MGm=A׊e6=̐!"*_ ]?wŒ "p#K%t_wn {3P=/ᐯ0gybl"?ܫ#Fc8mqK_q͟*1 7!=2 k6cuC$L<_ތTjcҼ&yn*h0o^ xt뿻%,j~ŽvH83@p>Ebk%r8GJiw`tvu,o 8hfVMzr+hD8|+LkT@Cd<.0Lc#C!nkB-LЙ'*1D| Gk׶8C-؀xB??,T`'HNZլ"zTBHYˑhd;l7bJ78D*DhrpACRr Bղ1\@ΫOTFYi^RO|iTobV-DYՈJ09:>yrBs}BW~ΧuxI1h/[`Vy5q vNBfOR fI< i"QCIHHpQkΒ46=)aB1q;F+h=\#W+MA 8>!ލ#;Z84_Oz9[Fk.RhlTEnAGlV$vdG`#;ٚF89 N"ٟw]BUyABud;E6& ({|M.|hVKQ9("|fC‹3r T]1\Ws @쳜11kKIF/i=uT-!x[ƃz>Ua+<1^8]9.Iぎb)JzoA0j7lW(@yޣmӃ &I^_!_"$ U?3|","\ ^>+р@{HyzˈC,nL,K0ǎrְ912. 6o%V667dxa4 wI=DD[[zlmIDy[%t5gKZ,]@'l+&Q2 iI7,gzH`$PlR#3;Gw:,{9TPO'cqW]4TBMI fAZ3Yq؍0d nM/HL&ڰ*:/gqwHyCr#ʊuj\gk׾'+D~\we2nbl?eMeW @mݹ@#kǴtr*H.ߟmȰm: "K4=!9*8{227J.F."٭7ƌ &5׫ID\>KZK,A" Z4'Qs*:X&[{\hµw͟)Ss} cM=$ڤ?0ol8uqÎn=1h#[$ye=2E:I$hJMǟVJrTZZRErICG; O :FU~MJF} 2W{ѿf>%zfcټ#Eח|{hZ]PsJiw. Yn TɲV¢gQvMΣ2jf3w;3vE&jb$LZnٹ0R6m}GB#-E5}@W!L"Njj6(n >?dI(φ"R8F8,OTSw " maSiN_z5"1ex"E4 h02T-oJC@pV. -ZƯHʏlS d$6ڨ:^BVH*@Jռ87Qe2Q2{m42Sֿ>[A$9\@R_A݃I2os(aMQ2!@UL1Pv)"~h±Y1G*hjFMe։x \'pHnZGbFgM eF.A VR`Uȅ~S37 Nmw㉵ 5"RFeٙj^F"P&qO8z5G6$+{v>6~x#+j:ܵi;~%ٔ8^Lb$eǀ>(/5R9!t2Oa*NJӴUز;}YWL3Tn$k$K,Rg`0ѱ5hNCTTbS.b=[E`Yϰ' |"z"{Edsi\Z;+K15+t 3Dwvb?e-⦟`d$5\bG ?[Y^#$+0KhSZ4H4/8{(ߘ[VH %AȦsfH"CY{aͱ:cʟV^`0`$;f5 zqrT`q_yQfdHca3f 'kxRl`V3?"K!28g+ KFx*ٱpoo`v&އoI48ݠlxkSzABd3?Cz3$? $_D"/VPf^%)QMO%w[jw&ܮSx@*۸ .p:E$kL> ѻ0+ϟ#WW/y#A<'4{ LpYUbOGC@-16(dc&^yZ 9:FNTRed28*D.y$Y3 a>ьҍ~4Wyz"M\ $ŲDzƅ=ϚPld{Ta G\SCy4p^ Fy;ai٥YNFG{`$ `".L,H)D? :3)Fa 0!I=иiҪ%u0ͰNP(tY_J7g%#8>U< 5DL`yQ~ -#40i۬dSҷYyq|X+q"Wkr cpFWW_Lܤ_C%mԎ{sQk#))&^*Nݑh49( lh -LKZȏ Y+/Ʊ7t}2MNT0,uٛ1G[[u/Fx.Gʢ9сPhr䘄5V +ohtڙJE>}+%%!&'kTq6,[u28]Ջ=>$@Z&43pI,`VYsGrhqaH  2i!)%wĈѹ)wU^Hph65e>CG${?!0̯%7.;*35Cdy۱^wA/*q껼Z6L\T ]\E@Q_&K" kqp G̐x4d6K+*Np5pa߱f^xɵhǵκ ]Z}]v 0[cC rEڷ2x>vf5aVGԔW&=qprvCZ/,pý@rEͦUs//gİw!aIes&`@`MMbܸ8aݒ:5tC& xyI"TV(ω2\3^ aKw('Ih\@sSqDՋ"ApFuсI©W*9P#ddUMy vKM\7•VjXmbjOօ6kz~Y®hg!9`_Uk!☙ָwvG{[dW\;0g0zu #0OayXc+a !{[U@_inIR{ ' *MjqWe @mT+*y>+b%^{F8ͦ*FbFZn R(Mf#"hdmԴ]{mƓ Q♶me@aIFD:͘$ qtȪHFDz*u.::9ouѹ Qد0^ IDATO^=@.W[e{3ҩҢp*[&ab왲;Quţ|N棥ATM&@Ƅ"kEVKtÌvRYfUԞ^Mm m %iI#nUcS ̶x.{,wkCnB<Z4_'olP_^F[A^z]@'~69CYwӭߍq}%U曈m?WƘӨAΞ_6 v*HHΎtO%HnD4͎-[Tq&Eg,M€jX0ÁZCR'ep~d"]mq8v?3 m[M:V/q( P* T;\N.7ȦdAP5!{-$*O$L{\'^{V(W{Ai{MĬ婩#ۤAݨfV6|ҧE` z/m UYN2#GU6"~G壍j4\SldwbᐘՇ?869Ұe#-nUbj޺[pt(NE"} ϜtLjYe1hrsA-UAUw(*ҹ[aBJuXtzV=e \.b , fEH4Im}@/O?NX-gI) x~% `/-z~Vq%$lsf#q;mrG/&i5"y:UJzF@A7GI;%x^tVL.z*ni y;)Lmi?t<KdvbPm:q[LKԶOl#to=3&)\WC4N5I&+QԴktnDRo+f#2-5+:P:3-X(bp`"SøpmŌ:gd:~<[l."rnqgzM)BI]1t`,SӚ>m6ܗ (7Xʄz)HD$f@RTM O ŸW}/nncF LyBv'&2 |'3 ,{ZE)jу&]XQHD+8x1rT^Ukf:H ڕmbф2~6j-#Wdw_?7A/|T!";6PZ!}Mb3+:/ƃhX鎷 ވ308,'i &֠C\]{3-W2#mNm;*hYaUk;yZ;.rroE3"ɂo7헾jc ŶlĐMUcuZpv"r#8՝Dv&^_'ы;\YeM >{+iϝ6^!﯇$ )@dU"I 0Yy?Nwؼp_;2?r*7Lszq{F= r0'-JZ2;۲=entuTP@ȃKsd`_G kYv\* G\z)5 ߪ,w]ZŶN=e-f1Gш1 Ztފê:⻞{!>Q' +r^@Fl{ OP2 F{yf6]V۵ dWlz#{Ͱ7D/ė ^6*[<\ox=u:fxkĉLauF8CoTxMZ2͇x  lg1jfDp<3|rM>E;gSp H-?LFy|8%=GY R&F-_nÂWo>\D k,$:Σq7qR*K3f$W)] XICSԖI9?8ui,¼h;Gڵ=EZ8E'E"WGlV@)SVRy4/_{ !ˋr6憏{i6 E캺-e8Pd=`EReFnwG*pm[CJoNp>&nY,KAjb-$W5*~Dn(5ZH*PKf١qgFAGPXd7wl0 %6f%4Y妧/LW&QuIuV-b|0JV@7[>K cfP9o=_NԪ+5۷0 "   GVY٤,YH6Il 3 -RGfʩQ2F~rZ.}E;gEME}|׋WE ;bw#8qGOm nt],%]w}+!ML5Lװ;߻|ZfU`W\`LS s2Hnjī(`b&tfW4s;|Nz}tM!:qo^qؾ &f3X`bt}D7!o !LBG~.mAM0Z^ґ@t(kUuت,J2Qyd͂7 3 ,8`$*-q7T-Y7`9'}ͳkU1cmek3-뫉gRV31W@ "Ǒ崜(QuE kB6gUD]W+!R(rwQް3U--뉭s|O*^)Җ$At䄎o,Sw ę">,T8R?n[Ly aKc^ffUc#)+NEv9nvqu0%;yk=T;)FCG@k#ѳK3(k`{aËA듭ս+Q^"ҳ ܆)b]ILR;)5eQ.GxIPj>=8A&:UnfLxAh:3b uOs[,Y[h$Q>4( tО$"l[倩Vjm>B˞^QQo7oڮ#aП,-2jOAclUEw0CDrϣ,{?0x3;l1w}}0b | ^qxV%_!R.X樈N/FU|U__?k @V_Uߐm~n?XR 쁔^7)}|]% 1(*ZM.路+lzEg&Ƀ:đ@EbfJ}# tV)PxEdU[uOmgԣ]x%O.g2Y#3'0<]# 8cI^dmeg|J3*PB*zꨑ/h|H|;#13% \GA \|sxπ1)ZJ@fX̊|DA/Y6s+:zGd38lEں g :!P;5Q2yp2f6 Cc +LZ (BSJ7hUhCCp'H8B3hgFYJVx̠/A|N h!r94@ 6"ٶ-Wjnĭ>1Dbrڃm`n0dpaMZ4JJQ$QatH;z@7ɓg@?"8 [C 3۸")PEҷI{yhRj=>_+7sI8qXǹ>Ptn"Z &wny<[-(:΀ij84ҲqVs$y|;ٯ>^j2ꡚi}}2tyZǚr?3OPX ̡,Xƅ#ܣvK$jo|{`HàC,KQXLiᰅk_aPN`,Ju:q.45痝#_Y<>!s<`"mPfF1aKI]c/-0!i@uyΉ^[W/H̴x Sٱ0 }<֯S lOlZC1*fvboMulzY. ߕʏ灎1@s`(H (qf$ ~D ӽA^pݑl@-wv~gVI:j䯀! D jw<̔`t_cb&9,<(:"e?L0ʖB22hL| & D"M.%^Ot`,i+0 %w$+ n_o?SYDhQɡ:Q9X I D/"{ Diռ2r(mgxSש&U=ri"PS? ܮ]zgJ'hKt<s_~ V~4Dm\r3P3+ i횻_l8E=t9A n M:^ޓd{rVw`r L>+ȏÉm>bo[#)q̈́O65sԶ'W"?CYB:)* LE1-IKJx(YLVT mw j]i'p'$`v|!#wj #pevѼ:op_qZ`GVIf"MLtSAʜ̾*%3$+{'w&v*v_C ٌ+sNYwXSkWyUm>lvmz+T?3YzRM͆2;Lc^X+ޚ 8O-2Y,?1 z1uXCgM-d" erI{B}0HD1xqDcm\@j+QP4Yug ځs}Dca=sbkTR- c|Kh=yc%°. ;fpmMtKV(kx`-֐덒j,3?$gy8P8o2d lŲ>"t{ Ϫ T5 zfݱ5;Z%y+"l:&ɱAgBW|ށݜ, $$z TGxoa9prP-Jx+kh~0RaLY삨sN 6%j| s - ?*tF&73.U*mQΓ]rI(&VDټ#p;\Z' rQB:J=) IDATN52<1LMtb@gB5^QUE _Kh 袌j. d⌷Ys63l)o|+Xt33w :=."z4:9sӱD_L}lDG){1 ꣶҰ}iĀmY"IZҷA/dj#9z/fΟ#G RNw&qf(C<7:lwBkqt ALmz qSYAk:*,-ɕ'9*$J! ?fm݋؀03bR[s8XB&9?|8D[G{i ΆiaՁW4yTVAqɓ$"γG7*ӹy^z,JZgD^ Jq2OC'&0ݚEHVJEԦx[Iv[{uhD;TDb39$a+X0ne߳5bZ>>\lZS AG>3pީCǮLNaX4a}}'4 ,DLs j>zœ2}5؈*$a&:%Yr '6q҅/j=v} O t`&is$~'(y_vKTw[װ2Y_70u}Q3vk?e.fYJ:*lѵ'ʟmGFjך˳ОoY3IuoxaP,jɷޥb[%][tb3]]pи%4hSG[~J+bYEuA(rcod796ɢF Byo6IFMx!$fU;X?6f-E[ѥfx3G(}]^%ʣF} :ݴKtuj塤)S3/M畯 eȝ9gD| bNL~ÇS5WW[f9StoUFw{7!$m}Fdr7IŤ@}44JŸ:O5k6cτ,O+˾ё]WՒeҵ.|W;S#`0'w6rdW $VҲ0 k|1dI_ew %& ()G7א86Ө8 b8Q4RY{/Qz1axFTC&3Mk{0G|' |=gHGDH]GnNQ^Z3E'Mr=OdH«M6ﲛvDpQ[ii KBq5y$Ct! wvjV;iw#Rh}LY><-+45 |,# 1ĭX6'C t@d@&wn'3bZ_0):5HZռi#382?mzsyp1t֪gҢ[Bdzb$^;THEoEn-rggpdy#$ ρWS3bOIFbuEq'ܶvo 86UGčZ"y+^t1h߶4iGH>?J>e?#$ENo;ʾ|o:f]^pIr!FM^Pͽ=t&p38&G"ݙغxhhoѴ&Ydk`j%s-hA))VIu>0aDB\ zKqzw)7EeGVUl)w\q[CkVAgeGT~:z}uDT'_]N ?O<\geSlnб́xktÚ88O}$hϬ]|'TfFZ q८Jn9,gt$~ Y>&wF'U"N G>(6xK,2:ZBw9;M7ɟHrL]c5>UU r X)\ >Pqm-j܌ꠎ Ǫ"V|sq D挎au |`@FQcI0|Vr}ӟ3,Y 8B_eƁvkq}CTej$+9۲ e- 7 0@Hwk#DpG c"@ܭ[^'[ޭ"H&(fOZq32#Ŭ xk7eLau`'Vlt*K<{%˞:rH6y\Rr`$ÍkGV> ^T|4ܰx#a*P΂RǶofV=#;p28(/zm樴}/Tkg`mј>A0s*MWi s^7v=ۂ<[mJqՉȻ EY@SfJ@n'lCZhh ==ȌG"`g` [ǚژmbQkpwdA5N6e#qCU%U]*d ý= =jdbx 'Vg!n/tx̒WNeP$)ŏoLL̏8˅}5"kv"m6#\(J6%j^gPqZ 3һ+EJ*ǫal8x6 5]Y|ej AKSxѿ<*PmLڬ@Б7&EYP3#vW"\ѐwcuQr񆃇rvg)2aB6θw(-2^@ϽDl) !ffeup^ܬgLUTqk?zcTn 4 ׇ 3wF?lC%K]~U0GJ2<)Ý>-C03TxTC _K~yM%~#0.?T !hܒ|5Ӊ-he2;Px {k,˹ˍ^#zسdM뇳/XQ(%0릿8 4W!}DR> ܛ]a F 2mq(KjRtx(̧?J5 ҃Mڷ){֏!Oa( s5 hՙBnsNwk s/4hXG3#^b~U _qs-nRFv?KXpґHBmzkM`?7>8^cYȺo<(O29k`Wmew hĕë"WzXQD3ʆXm/ '0|PWDlv 9 >1~IM6U09M]G̪3WU+⨄aCǝ{^>(ad"Vz \DςhbLa&$>͌* ϣD潔,hG$YY?%Q:wnlzHfs{MjY ZY7>P٣U)1 | xV"ٺ$`vTs7$b0c =[I. M#W1m]o!wiԾ[9'5" [茿aAz+۷V`ǜQВzruF?:G[+-6 SٶfHX\g#I20c AŰ 7>n|oqnj-LY#2]-aڱc7?$8EAwlzR4ɓ-\w/Ѵ8wmf.EwE}f=3lZ^:4QmaR"<_%ю9qۖ:*R4a̪ 0mdx7Qcփ|gЎiȘ2' mN5a$#rd^A[AO~%b2d $Jg^ww{TEǧ͎DvC2uJTm^ށ/t' ,'N䑚k`;; '&-TOs4-Kk=6ʋO݌og IÒuy\ tA/a涊6EfWs%F!k@,̍N?=쬷TTߝS4Q֚U iY()t$N+2BWxwfzat"]D΅^ ;Gphw~PIw?69nߣp)62c[~Hڮb֛hPg[8\|#ض`eu+{,$x|7atV%jE3s)¾eyN_# 4F\]hI slܸp@"$/NyQ~ oN RI{ܝ~#ɍ7Pe|KHU)rYU7sTFܴy\ YNv` 925H_- Vp<|pdt#qJp$3sٻ^qq{u.h1I{(v1↠X4dFϾFgVd9Y$[y:Z:nځv`m|Jz($$޵@;i4{@}5Rmzͨ'@e`4dpopD/2Cf3X>LwXn/ *JM|52`9b?s6/8 CDO99j`L-B]FR.f $F;klXkb+:v@8]EJK&zd U2 (Mx.z̍n_ڼ8󋳙h6|hUʀH?Q˫[4ϒJԳX>zO|s}V<߶Y0y DoK7EV"RF!Atq뵄ݑZñ (U!`C' l^NO&Ykpg<(o OՒ}>#ɰ}HJ:zt>a BV Rw&ҳ^(ݐ#vIK](E*VxXEF B?gZX5U1 M^-`,xt5Ƞ_8oX{ĽyOďW'$Gco`_MA11r*0A2mh=MD84UܺK.x 9 ׎%&1'Tnd@ 0x=҂Ovض9ʫ^ζV|"6rA57uBpz1rрf~D# l*R@I45ÐY%"/!#FZ%O$QBAĴbS?gK9,mg aӝA䠷ٛ=c#P`gU{5+['p2 w2e#"J?EI5ɷRC.|s!R{ OdD͵S 7>DCxJȂET,ZTRO>D:6є)kh:&YJC#Z&[%c4"ѓڒ% !Q+AY[0Jo폆ѯc@mBlgQa}T(u` ET]Lċ5l䲫ZZx?1N\t1iÄlhfܓ[ S%t<϶'='_j~aIG~L&=5 PWEeyf:N&AfaL^<Ƨ_ *mϊ/!pr ǏDxx `BaY;w9qM+C-b.a,ܫmjً̤<*IanMʪ *7 L؃L$ɼh}AJ# % V_K 陡#Eg8HW4-[ dOqrEp4Ѝ![#;6L/-Np? xdc95vHKK3p? R '7CTnt*Hea<6~S晞3,3}A؊A$$:G#1R/΅3#H+1g۾;\C,S=S{戮Z!\|UNϔ8pz:s' 4Z_f@҃Bu @7-B9RUUtκj[UG ]X98' O`HQkJD ^Bwӝ)fi6Z̼V>_`d9:YW{yf&Ot "fv:3~|dݹXÒLrZ8("fGbM5z|;PQ-*!Jɞ6*UZڛGuo. (3!Z)"U!'7K5GښUx{TM:$k 6XjCJji֚d7qlSKߖQѺ(q,M|>N!#S <̿<7~re8~:p灚\DⱏFb@~L͋14m)a`&(錬[񙉳MOC'6 DT4IH;ୀ frY]Eχc* u_O7T`<*VOfk7F@:HiyTA) **'dٞEjsgO8mG2L>Z.a|,^!m-[nYRj|Vyr2Ix#p  )=Hdыq%qSxnjHDӃm@An< N>}G"s3ɵ n^gˬa}u2#;Dt< РFFTRT2uëI9`ͦ|2}#MM.PtϜ@X޺eaȅ}i^~_ު:(c gթ/1yzz I@a7 سU]:}'G"*7 ouFV=I`n$7jV8g"Cd"!(ɢH(qrZ g=L,|TzCcxIsb-+aZ}oob >gAAZHpU @mϡ0-{!b00C f[DDVU5t>ϦM־X%yBQ"*Oݖv9,+"yN9>@1AhB&EK%,t6*܈&O#Q Diu +蕪?Ū EN*h#I̤ g37zT7Tҗ' q`.C٤7_xG8L(UU:1H?9-qg+40"6RlJ4MsU)6GB<';sfeFns'BJAkA[8y˲7F +%&W3Y QQ Fp\w,K<@w_rιAīGcuL {cfOKr!`f`j;AqfVJO:(V|h$0)0TSafk0vրA{Â*qT=y3 D7cU ;€s2x2ά)=LaGȨ41Yv@珬x U2g:o"Vv-mp1;0"a~_^״,P 4fq)'`ddsi] ϯC4G'2IiX <(H܏gncJx)G!ٟ #1ʬGcK>fV9r "bԒWԋs5xbⅴmV G%(CG÷~L!\;ky`BmV 22ժ [ VhYe #`xx_fȐ3[_opm($WXm4m:HGr7ECȉ-]vQ-0a7rIOV8FӅYKa 30Eʄ:aC憍)nDSbN n+胔{2u: 9xNfyf8F}5xhgEU$2`TG-@KQm&v v'J@3) ϲf0zv/qpQ!ga-!xVR81+iw .bB(5 N]m zCwe4α$pT"գα>@)5U}_x8t"N̾r=X\[=e `nf"cqk@v@q]44-Tc)KϪ1D)aSEG̑ʠW@4PvCXJp(I`@ԩEߐ(9N7] TXlxIx!b<++;$ k9}8CXA#i؂BQ~вb'e{7=p^>=PT%l&!Ue8Xh3M<&u%Ȁ<ᣑ NO) NΌLkE 1+|:zRa :@!ldBD2nύ]-@6C% 4wKK kS-e>:=Ye@nѥ9T3ЭBbrLC7}㽮,%C^5t kL7+6dC۾vu-GtV;/֎]?~מ FaV<}شg.ZS_ ہlf#%u'#oDP,_ATP TˑC+@8:5Q94f[p{O5f5U%35/rBdePfAF-tAm|=h~-#?9{^j!>tY3$l˶,I;RWTvggls 8\J" nz+0sIրpE'q*[C"}w'=;}h.K2<9!rE{ UF!keys"liP438ـߌqqiG#pԢnE"rؔ9E^y H>ZU յ yOIi0r*pz= ZW 5q*.H1☇[^+ddO1(tcB)~ T VU4GN`M[7" d5VCó::GCAȡb?@;֬h#vh*pu7mlA!0嶺g:Z 0MH ; qz 8 7Hg+}vvƹ݇m3smg[8b7RrR5u`rpB k t lp=SbބnIŠ7$dF:2-7Uqų9<%| !kiЀ'-)B=㱏q\?~=m {.nfԼ(dּ1w 9Vi6R11z@aK?qagJkV%†$хXj@ȜŠ{ }wu 7Et># [ƒIԢH;7@'șm*%wD{Gf1tEBcNTw]K<2ߩ<js!vT#NK(3=H5u\Yy睕Uu!A)ݙ=_f%m[xQTHt6eCogh$em$DgP`e:lc3:jn;@ q&i 2d'!):/Q=#bUwCu d* S{tw!ES(YFJ8˯ti>D J^mV9`p`53%~JW]-Gu(w7ku\ }@t6#/ff,$﩯W5KIcDWP,HQLr5 ;ݱ/kz3}5G@.,St=c® BHĀ} f+sWrb ((bxGtlPeUg 2 @?*pp,,yg6{hs0P,rHԠܒ͢Ĝsr^1$5 鑍(k=9&w zh)\1٠lJ:++bш^/eX֒cHmS"ňìC^&gKdM<:MefG$w8Hn~wcl:([ys,FuQ2gējV_GGG"@TyMԛ I+RBA'PC-Ű[lx\1n.աs*|$ㇷOAsK)f&M_GPa|7EL)dˢH x CN]%|f공@R9FFF*ꝫHCfOg"J,LTsuJ:AoR0;09$0`p'K0[uƲFB^F7o֨uO /3W|˲6 ;PhP8GK\z ض.50QW6sRwQ~+0T% U=WtZ Rn嵀: ZFN[醝,XgC]eo&C;QDq5˱خiqrfsQF kPAMJ`x]Y%V `@TTԵ󎈦I"u, XQH g=\+XjQπT2$f#!xH5T[fGjn]Q!kŦQ,W=b͜kʎDb-^ܔI1cHX0YV&ёL ; #M'=ّiu^F,C_,vxtu jK[Tа5eJ9!"/r(qg@id9P4B=ŝ 9rrk6]jf<(n?߇ʨuzh_'0 6sZ UyYuK긍vtS[?ض0tbR:n*,*w&&o:cg$1:KBmYb{zȁ˾MQ-E!vI8Y-[sA6JjIXKE&ic1n€0 KѼA#ʆLj\7H,r[27g#3[i bf(dY~e% Gv91o}ݪoO|8,.RE 㢦YPU^LσF_3*>L}ViT`_^ }^%بoPQz@M[ +YKXG.x]-@Ћ{4%0uv7g"2LC4h=:"p-Yi2 ]/9.i] |輦h^E|uU9㚿aY K@qA: 4?jTO.g7CH>sh2Eheu`Q1-tL"8^T%X"/zj`XU"J/{h-;P\ aH# GtA`w(V?҉/Tz^ّe  1 ^c wk/k%ВvÛ%q T̔p0jz!0Mirwp>u?2zx$D.V9e7˥P1]櫪T73áx?}7[ALm馟V=1[e32L߰1NGxUN!8GK _<aU;62}ly.?7IPiTǨD=-QfIغ.](P"ӂHLZod:Rk*/fUBzKԀkCzZM8ްټݘ?HC)Uhkc}nk`33Dhxτ_鞦|&&&mʽi`Ր?cD`!P?19x o%uSCRFj 1}J A:SX#jz~ݲ0sN%M:hIV^uTS`e~h ufȯ%WuFE_OYkj~Y%{fd+-4(ք#{t6p6Z! Uoz68=i>|bZ^5{ ƻqBhUWZLVg^ -;S\5ѯt{/2Q\P) W< 5DIS " )j2ZDί؊n-b:C97Q_X}Z]bΏ9f ˑTOn{SQb}tD.q˲έMs[̄(G^MGɼf #j<`a^7#EK`bx\ L8a5QQu,7P]zx^PNq҉"u`j6Y͏bfn W-yОSj5L ^i7 iY:^Ep zIvBK7R^~d^.5;+HogG0]oFFm. sJrԪڹw䁭x}*{PMYζł^hTϫ(뢫nOۧu!G0&x9tDI28缙wEVJK2%)8+_ h,-9 缢 <psuN$4\MG=Yʙ*H7(zyl8'QF79ݦppj#etBBgxoRR%\-ӳc|kFL 2[v@s@䵉TH#Fm׹3:HKDDd$ĠF.e/bҡ.gY5B^"hʗVS:F`GmqK"0?0AXc}_vs I٩:τ$zYmІU..+1 +ǵl :Hٝ/AJ֩acU< MΰT4v]`C# B`?ZQ5.+F3/ *&m`Ek=[H̀+ ]+q5dDz$ `%Gpt??yi*xR!rR6EEyϣ&HydmƌP7@ *t&?H{'9Ŋb5qWN0W9ͿYbg Hz6&W;eƢy3g„D%*ZL*1.:aȇZ'g ̝G{Tb3h[wǗetFԖU֗ W#8=Tѫz{zBm(.c=uНߋ3 P#Sq7'UU8t Df),q2[,QLh1F@>Hs%w""w!`OUJ'E6^7`'m2n. s70nYV]_@ǪlQ٥Ƙ,4@W?ЍZeELѢ\%' )PRY@]_討%paAA4"nmp\w%1a9Qr묉>U)L]֘3hKn#< Ben.8W; aʰ e]=(bܳ$qoRˠJJ)]qN-ck*rYD@W&66f6M,2p,](g,3*)v/qɦ8׸8mћ]bLMb@X9vA#lq rg6lKՎc MpLb5{m^O==i9.E_k:%2 TpkJ4?mlA 9*TC =4KDEPttuKORXE9Q}/JG;rHZZtC"Op6?YG>ĎYC57;G㛭úAZUf11:n*v=aTj Wau}~RXsOfkۂhf|_1 =Le{P&P1eҞ Tጃ -BCOmRQнB=#Ǹ׿k 1>=ӴW"`fպ,+PP`^#;Tr];x (N@F1(Cx4={jeOd=ʊӮ.ԖaG{,r=[,*bu:!#etm{KUi1eV9X~Q ҨJb'}0"̆Z {R'U= !ԑVbCQ%XazMij-qv3Z^)QcdV-l4~f>؋>#"Kbߏݗ\ .a8W8uU뼳jN5DKZ!'b1z!zy[JS7jOZecE^Ot"EVVC\)t2htLҬG4$qK9|R:ʭ5u-{񊾆"67fQH-H^N$e0VT@He!%f42OO̲ٚT5q-϶")jxAE` 6 j:z@f*H`" qEgm)80(]Uc-9g*W}WWR҄tKsÆ'Xea i(e{Dؾ%X&1AߎȆl:D=0eCLL/׌견e^ >'`@ʞQ.PuCfv]*5#oS /gѢZTfUA.~)a `9FZX2@?1K%AX8B׃~}}kQ&Їm;8Gֶ [0T~5ZY9v(Yd3p֙J=\{[i +,MW V=reru&^scΪTEiqTƎ._7U@̐|`@[ t˜ ֳ8^ l. ֜c&FOcDY!&0M UZA") ? OxK%:" 4eh堭,VYɄ@e4t$?4+Bu`-DhRps {[/^_KhQCut'#z;H*Z'+3:ƌlJD3Lc͒|-! IDATC&;TLnFZiu \LUgEs\?uYPbu&g3܁I6`cJ+:: H 5"Yq_ґ}/ϲ*Y|O5b acKx*G+nbd)˰53۠L7&ȡRͤ؋|<= 9I ]Efz(s,fwW~cD2a3ϒG/ Q C,%y9nlma>G#dH$lr.fεJPk\,Z 1i8 {upN0Z*'VemsHޥZ<2#z[C;RS`\'ryvsk&8tY A/j??o{GuPUgǫǶ-ՎHB2ɥF*>KX0ʎ{ `BTɏC?KQqVؒv"ϹA uɀp~ 7߯|΂r)м uN@U؛s9c8r/1#_|/kod)Zwb.JɝҩID^M~*&DaA`1K&y=v9@>(L8eb@-j`\ݶ:zK?9q8[5cLhy`D| uJ?(GqR1A]0V.߮ wV/5~E㨫;z Jhg/Ɣ΢3VGqMjm&(WܐI =3ky?GY?#{MF .ՁZ"(?x8I;o.RиE%1{Ʌ$ FPM&f V#qxNWӅѳ^3N6Ԟ(#{Z ZZ|SGh@9p`orez2&Rh~G{"K4KL\+k=I a|>vLIof]:IQ( Fg~m/ўՂ[ &Tϟ?m87sn tѮ( 11`Pl *{_ 4@ѩhGr,Y"~OHo~3, #>88b ("/@ռ]'DAH@1T5@pԭ›; Ými=Et|2Ղ?9QedM3Zlq]])jय㐃u!N {t\)ӿJL.fAսUW%H'H] 2lg D L){ῥTڳC]7Si+y `"H>^y}ّUE`Ni{C4XNKKt]$8}i)#0,DTp[ɦj_Y6^Hf,2]˃T'Pr`I('3YqِȫhtiD\'.ao]U'n &4mvp|XgsɾnZ{fXg8}6eAD"#}7l,צּ]`oir cO5}qeHa4zMDMԵ4"{gu/e"ȦSaUtTٍt֜ k~R]#8!H$Eb:g1Y44gAF6rrL=\뤱353Ia51yT: 28KPh]}ylv. 6"n4Gw`Kedn5xrhN= D8nGiV9bVjj%&"HDz$K_;l WZ`FFl0fh'ɲr&@?.OfGFȎygGg5G{5/c42 t9H7k=i'e@ m+<@^<8}7wO>I }XT.WYA*;3xE9QhAg=O彿 ȫ[r]m{zV7qQ%hjSDBBaw szI>6#l$ƺi"9Yb^#;:=0hf؀mxɢ3v"9HYo;Lbhӑ^fI] .k!T3_5nHaf` tK~g[KsH fϠug,ڬ#oifU+^2B)S#E?w [a"&l9(Nce{uR $tXf91L8.B:O#4N@2twO<ߎeFdqnR@4^:^E;lv!4-yU܅ýF|5~)ty@遇2!Pr˴DS~Nxo 0-utXlڦ^46a̳` ln>$ghR8324% l 3Oq\qg, "emVIBe8 , Xxڀ'[:gQgY7ॷA: т =֬>Ozo97y3jz| rRފRd Wd8o;jJMns`ß˾e&6&OeD@[s;;DP:4 j<_A ͉uf&k8ٴ/c{}+!Q]k0|O^,^H/ T)n|!x$0΅&QGݟ+ Z򬨱1yDhPji,œA"7ky'" %NzbE8Kq0uވ}#ªM7b\Y#Lh[b}j:uQ(-;f+T Fx'woT SyDoYKG%x3HԷ:4 {u?|TIQp}3RM^RR yQ\hoLy_KZd0+9*-y6PSBE؂ Lw i@grZQ3|KG .*Jwx w$zXBr}{=-ry>etIm^M2l{z--<^.;Mzoّgh lÝ{aw{DuQ?ŨHgj=$ o &< &]a٬q^IPeMݧdf 'ݩf{"+J1L(WyK3 7 fџ wjO0 ZҨ~ K\C 'nƃ~>.lJ}?g+uPυRHy}-"0<,)vyW8Ba20R,po745+i}qkm=e: D!gWr"Qz/N7'{V>0;@J Ufqb%5oL*9" `O2{WG7/~/nҖ@R3+ջs#"ՇU aMSCcꢶrhRmyzb5+9^m[ c @: O{{^Iˍ{;<ꃔe]t^ad?V5 x5n!=ÔQzQNn}pzh(FH PfL; |`j_9Pxc/|5B>_>ة7b=&!1D 38Q6OKP|s|i7EB/GѽfԛBHu4D ;wyARe8#)a’lK:tP0THf= ɧUů |Ƃݴ&ur /ȋt҂Iu7رD}wGG$BʘtE$eZ`Eƶuc:*y/C"QbjTYBoTB5/{*u,)v>i+d oܣ]D䗈 0K:Bn><7ÈR/B޻`Z¢rH+@bo&w^OPd&J>~{]NF"(*Q%1xeEf7/aFa46r*cܛkj}IVPm'ÆivA@GrNf @apOtN/r|=Vl\ze[U8`oȻL¯_3ˆo"m2l5MqC.6: %s@#WwwhhD$r=e;h:^]kf)d"{1~Jg0cm^2R3e򡽑$ʍGmJbz%jw\! (t|p6y@pf,.,s#B&%(-{@AXģiuTNvz~/ YXyŲ=gL)*ߌ~:'ecJ,Vą1XʴDdDl"Ύl(yarRK`s, E.)6jB]Ѭ;$-cDޜYJVNZ y]'v 7(C;L`O)۶8 ×CYdn}ZgC6>EEˑr(tx81q8'>|Y[[UIe -@)=uV<cY`Z{*Vʁ/6ŦX"v@=S7q] ;{Sn) mh x0'{"B^ @)3fU-X@~$V,J+p 9ڂnW{V[^>uSV-Fy^usV pV4GHfEkYuvaXt`,_>wDЋR͉p[Ww yځeѽ*Z$ zGb歽hT z@j7iAE_2H:_Fw(E}t"G}v "2Y9FdwKQ%e9% PBոN3L5;td >dp_ɥUPC k4f(:(ʛ x2!/ʼn}0cz}d9BP)s;Sw۽\(l \'f׸QXSO5?%>Qk$P7{T>#rNY7pfrfuJY_ 1D# (:κw,[K0`$ZS#(-DyM5ff #r7=EJʆYI/t%1*߲jr4=8?{O,Fl2[ IQ(rA쬡mkkȐCrt⺇Z؂ԝÑ (d7UdZV3:+fp{@̺Vnh?Źؽ*fɪA8D!7GɅ|!:S:H(@ZQSdF*Ez<~G^QIQھr؇|ÐEx1k#QaZ7u+ɄQpO 27!3!;䵉K'&,Mo~,ޖe1cKK 'Jd3x{YD&9@x[`/.{)P EqSB = % QIX, 1*gI3[t(gM`A jV. 5(bVÚDAqJ :_)0wb!an"lYT!,OG"_:%ݚBz=4GNux]D=t2ۉ#tx,+ ]9Q"bLlyϭ,%ك: ׮DiGKcf;_EֹT21LXԃI\r'cH!"t] )0~Y 5j'˦$Fױv.uw@׍n|.-&Κ5za;H")z)C f$޼v7UEewP}lreE+W15 fv*{y ~*pŬg]*z/ `"sl'6^ f1?u# IDAThV():09ԚV>h3RbP*߶( ;_fUК %{4aձ`IA霃ג5 PT{QŒM},yK5@nB/OeZE|^UVgy.T(3U9*4#@@w3ߤvasx#FOol8qW{hXϋ=zB&#NPIr.06yfv8kUm6VGa_Pi lf [B;Ns*VDQ v "P [Y4/5_y/ m?#)Ae5D5%fA::>fD6v6-V'Q6Y,eٍXx3"ʔ-1!v 6:6Ug_m@rtv}|ǐ]$|WR&XD R3J#E8E'ڵo_m`AdpFuJV.#c9h(sv&#S6^H=Y *f5TNI9 ,mgD}MXa80KPAYw#^ S,YZs=eܟmQ^ZNYh DBEdbƒ~mz9zm^X֞eՕѯP8I>$ Y~{`V7lQuv[A5y%=-/1RWWh'Qt=nZxQsW5,H<- }t+Z {~YE:yob+կ R>جr?3Ce}9C_k*Q8 +\QP?Qs!hB*84IHg/?'#Hk;Fe|uM_" } lƬT~2DRSέe$`ctƷ̓A/`7Eo ČףVez/-[{`LC O櫴|&b9{-@=٬R,{i~*Z6#JKcA*>jPJnjTY85]=6ҩo8 [bl)j-KPQ%-UZ_gHt=Q5Sgj>Y "JۛWno&m3@$e`=SMZ]YIQK>M<1?*6ԽuV(gQeD3 rS>|]nyѐ7-O8x&8nP0q*O+-ɹ; &2V en3o ݈݀uaFri.[ xGDc?U"F ! ҿl{(C]=>^yeaТ9HhBrX8ڌH~ׁ(ho;۫דSt={E~q#,%.Ȏm$۶NdVRFwX zwhnhufOh:mF V'"#mhOq=lLoפCpVϖdxR:F[!gd,x\ G^[JAda6]v}f|ӣ-[2^] i[ӹzYy_nٶrFs%֎ }(tf0c$A>Y*ŋNJ% ^;ãgCFg' k KJg'5si7&"pad`oNZ gp]I{\X_G썀.=3\fuщlk+qQ@GkLJ]ab/*S5BDz,Dsq6|8-[bNDCaٸnGHHy!T <* XB-=uvΞ]"F5U:Hԥ%@t:Nf̰it=;(Ks㻣'-}p|;H`yU-AWFTC~.Ft/ߖwǤ)VحqS8H1ݽ";aL΢ G7liQf|+SbSH*{z^yukW#fV7B FEZn[(܆P!-1& }GW>`a8Hg ݣ ?]ӥm0YFMqjy Dd]ٸ B3 [wQ=^y~,IMOX* 8s.ʯ2$'/9~,w$Fܑ{ڡJeGZ̤9wf/v8^ּE+&i]TW:fЂQvZ"K(ۯWY'3O מq]ɘ';uE5ɷ)<>K'(|(d `s3a(ſ[e9 Ki 2u{,x6pz_2Qb<v"Cȳ|7zc}\#ٸXVԖ%}#U &L-@/Y㙠ov9VE!J( EVdkAܯ,~ŎK)3!3ΩĪV KFg y۱24A(Nl.sO{ z@EW,^8{ c\v^m'Q͍$kl_cgȢ@Ē5Y^b! s~tt VG0j[ptF<ULe9\%1)5f >[\zw6h؁ʂ+$?@}tQӫMPy3FQ*@H?"Ix#=D#7=ǦϼuE?^=\q$3iVAO٣eɻK~euC+ESY1 3<<\˳9}[QDDd3KlyHpǸcϩOv8&hxozl;=`T~~}6h/|B9Ǚ2BUeF84-u)nl1Gh&m$KͰv(hj`]v=ݠ3X0ַf0Y HH-8_.vm/Wd}QݞWr]wG鶣"H=>[yTwm\|O{O2G O?4^XO1՛pUYGtv1A6Ċga4DJ,G:bRC0ϐ!rqb!6E=@P i2H'"2H+ #!aAk#(#yC p,'rǶ)# m GFGI.׹/TIZTHAPez묏Ci|{e>J&bU oxM < !Ğ~fS1CΖ"&󮃱ŧvvE=zvV凗cYIWb TWDnfcqmIH7DYT=Z_E1 5?#;.*w]QJR]ZRNXJĘ2Cala*EH5is0oV: X0=Nc@C/%&H:*DVyq2 ȿpM-1{skŴd\ma}]ԅ0uS<ދN2 o.=lG d.:N-أ3 =!xg787FS3vh`ćɋ;X%G32bC,DAsDՊ20':c*6 1@#9f'JYeK@c932Q* .׋ ўI䔔eCNLv>z7J෈_p8-Zc`'V+93cRv#|R @|z@d1&%3Ć o~U9 nb-W歇Gj\ɓf=Ce}T30MA>t"FXMSAqOԧ=cgK#BM}7ՃQ562V ~]_iOeЄ~s?軭n#D_˳͠@t]σ9M Խ}wTwct8Lb.f[UEո E}*аɬ2G6[1}1lQsUݖb$, e ,B\ 2uz(N[K2,>ZeP; (2"G;ҵM1c/Ba@\gVٖK_y@+CɊč-0J2-O Dp$O7mXBb:~Q|)q4` ]~۾:iGr.*|U0x]txl-bR7X%6%",):!>fwh͇#.+ǟm5myݤʄYn܎vYswV\`]%  \P nKewq2B Nj=F(E)*L4PybRRF59,+<}'w M7 ͜}2 pĶ9P۪3ʷu >+*'7+/شhJ,Lc9DT<&4/͂u#%CӅfW*6/;_[fPc'b[1ZǙ$j}"z$]Mp 2Ad~|Nm8?zϬ"ا+}r_m[qpE!qs"1?3?K n;/.͇ d`~4W)1H[ti01KVR3нk{Lr&/ \|- ٿK#^Loq z.0[.0IZUQ |ÑЮu}S ck DTc>3:X^.>Z(JLD9z@PUW^k5 )З@PsW /_ :+?s3eE շ_ N Z- ~b;hzQ#GO(@2_\)g?nAs=9$I:fx "wXDِ?)`Ǫ M,Zc0m;Zo4Ny:xѬ[a]3AyA[ K`8pi)&FPKrX IGl%|O7}"|A^EK7/i VkNmq0;Z#[17w(xvDy`p{gNSElykx!q˰Sp^N#eO\ɉ1##.OBv,E:&x<a<[MyŖjanb)G"Z]eU& KPYLZ3+HKH!%t^LGf,gbf"ٖEr/-A3iKu6wH1SF}Bd𽇖돈kJrϳsX%c&TO6ZFS5`n 骽be|gLLzZBJA["oړHDoŜ{zoB>ʜ&&D fXY.TXeYiAF%j`gDWČ>zka8u6moŔ[+oԘ#TE9؊\}_f!uk.On8':kPz0(wIA\D#zٶJ$ 36Ɍ1pYEMxPnf*'xrg$W_ˤy%D3lqDk%xsF2tW9dc'/o^>Ǥ8?E#I%u=?O !Pr-tU".Ȧծ:I$H۪ 4:@ ׏IմRcHx|AI5c ,*+jF0E=PìXxv$;|GE |ւCLΌ>%c/3/^ qe3|(ITZ/_VߺTcN9 x?z--9FhByYaR#s~m vcEKh(':>*>^w(PP7J pz=Itk.Nߒ oF,Jx샦dZLr޶wnRBH_cĄBv'< OG<?l(ν ms2GLIu)6D*XzR=ia w}MDW{7!mVRsn՜a/"ްD dr!__HesdNeRxZr1Dan&Vc^2l-fsHcumJ'2瓎EMJP2fQLvzڝJhy츱L#Х=ai8aN!\B}= 7L 5$8S4ȥ/rtm(. lZ f1|ttdk[>] ;K̞E݄ݰΚ$\LMeh1Ǒg4c{fD4ރ^h# IDAT< վ2cI፶Dd{^"ܶ7 F~/6ɓQӐ3 L\kjUmt|L<ynIqxt}jٍ^ZjpRF:ی$.1hoU{`e˰D!*0P\}@#,:ʲN`!nذv L x}H"4=;\>w)+#B=#a`qݞ04uw"@|e1`byt*XP? DC>dאyJtF@_7actL<>="55l\کl?x41c,kȨN\ʣM }#EE,8,I>#0Ȫ<?a,G6DI RN_# " 483?jG=ˡ`gS nnƝC [OD~m| =?N}N_N=~Ϣ05K6 `y)w|qtEPމ켝=BUP7CE$EОQ5|Fiޜ +5؈ݕ%^t SF3vXP >]娶3eN%visdD6M}."irV-G4#F8~ o5iK50,?JAGջG6ۚ*QD#ߔȈlNeK`snQ2 H><SN]it$@">/ש ^&ä0F)!z3 K8Z$̬Y֑[.W~-iCPЮj)]CZ7R~H›0.G  Zā8|^-6S^+Yh4mdcލHjKw~h"{7b\z@%2.ս^.vJ0 џFZjyo2$]Ko{`VnBY<__Vm^Y>lyX3b2gCJ=A%3=P>eYr47&E8tbHtlU*־106ٯ%7~m-cT$^Wh ؋y=k%2+47 #kzkRc&ޱRR܉3;Kj?eN'JO~$^φWN P|g|x/gJ܀2O),ct8Yi-cyJ֚-@ӑ2^ sitX6S$yp⿛f,r傉uϒ[EdgRD~p6z EȪ(1i緜@Ͱ0&jXhd2/82tXb!ř?ˆ0SԠH>5p6zYo{/\g3dźgМ%K6r?ǧz;s7\HF~_cĶrp$K7 w0}Cqon/f+b{.Xk*`K@Q^g38 ܀޸2ԋRd0$>F:3GKhEv4M@hX-"Y_C9R._l]%[ό =n2z< ּjDžcgj;@XgE8i*ٰdz> ƙ-j}QY0'(t5p}'3Vow({b/sy4VP,#(A+"#RWˮI"}I>cSQNICk@S ( V҅As=C<`#%hw#wY0E _-jKZԙҖdT0-/:KLK D<SۍJ1'_D`|f~ݡ{e:rjnJG63Ac6X'9΀dKZp Tc&`3lK@.A2}:(9! ŕH%]ĺGJtB4ctBjyT{^޶vW<!jȂjR+d^a(25RvhY;4Ѥ1ŏ݀H1N(w%IyQׁm C\Dzʹlm?6TVEa3*@ N{XHl~!alDwp?}M D](LB9G7\"=82H(לx jZNf}N)ݨ[[.fMhAgxV*YC_FW2ę}kb?u?e7*:k+:7[胄Ք:C&۲ `b|s10 xM7'AwdlD%YB S$ztc@0&U Q#}v!ԲgE KIZekQB՚@Y1(L 7Kk_$qkn. ɷ[VU.~s,UzxU!@XkrJ1s̞;d FEtGfu eDmQ A .##Hnz00 ȥ2% I@{.zrr< 1%ȴ!y#<[J7#\bHAqV#S_bp, t2>蓎X*d OY(Y s\" pe63+D|Fմ~JECq{|)JUU_7ʕ9+{o3YPāHFS0Tf/9+{=7*xͤTwREFo8Q=2)Wc *J.P)I׼;}W5ބΚ^s¤t=(֬O}'v#d-CHdaZ^(>XUWC =r"'A#Q(wйE6a7ŷE=xef50A mFEkY\Nk_ik6t5?xJFNOkӗx=Ln lA%}>h \vlkEos`2{bچ; }S#ȯ"^,:5buJ5I>xzˆ1r  5ŮTe] cklS=yd.aÀ#KS tKCd{38w;r( 7R1g:U,GMY TqGL8C9zP5.5]dR=![/5{=`"FTˆ㉩Bp:hZJd~8*c:'k \L䣞p1zяeLF3ْy|Jp5UfF 3cFhV4SBi *XT\bi"sdmQD55Bz,}=͞&2cs -lVy!B[2e)&AgN4VRH}= fF$:]ue:kΘ{"D彆$X45f_PpyJnpez,L ..jNdz#V{=kLu"EDPd;$DhKpJϾ"kߍJiE _"(߹oarK:{_rNP|lñ1 AW]$1B'rL0 6 Feλ̥Y|RE\72"~W3$e^ݼԇĩ!m`L/.*Fś(P7)*@ >VTnHHςi \ˆ˫gWkz$It䴳,x_r*7,6DeΈ3kR7WP}kpoҧgYkE0kӣ \.uwܙő7)U'iL? \ת@Yk #Sz *"=iDEC ;LZlmg$r{˘WHKӰ5i.D}tE_UnՀwȮ.u "rH;+4Y(&*Q{U4jXk߂W""ԍy[h왑Glp9"D‰fwbO>Ҿ*5K$2 # pNP0pFD!cXag] dcO N :"'1XRБuxunZ_v,e,:aW}w#$xuf7<Ï&L|~uI`TFGW3'AG=VF`(3;GrQ{&^p=ԫe%-^ʶ (Winj\#묜,*׉?y{dAFR;I@&.Eȋe:XEpLTШϮ$=_qd ƥvQ48͂^XupxɮH JNPfD$Ӽ:q*NERs{sxDzIVb+4Z-G J2BcX%/ks-s)03~N1{>BCO/`>Ԙ^0L=io v$Ok㫙BtȽ@ '_C,a"f//Yir:!F-VJ8,؀Rt{`ٴ:w2>eUrpiXfbvGd6˻mi_[}ut,Su"9{3".ѣ4k$3ӞY*𑥟2!JK)yO{>@Y<-{BAw61H S(jrNwFC;9c2F=,BUFY } "D)j W1Sw4"C^)yw`!˫(AиY!) ] yߕ7E1M&9^"1ɑ!z]dJfoKb(og%gGgV´?u*VExE|!@OdIIUU{ P0╎40 ޸,HvCvּi:B/#Zr03gyZÞCEA1O޻+#ɢn̼ \~Bd_uf. ^ٙO G㛌Yш<A }jXCE1"J[::4  $6!ɸ 7KL  ޿JテN>DӖh`"x8b{H߄Sf0 YBV~EY OXQatE',wZU\q)@4SǶc _ɒ^ nF=W>6`}a8mv,T)̀PfkQWfVW6 3ل## Fx#U*2ܴ~3bXC6ڇ tLhhTt}mgզKCf;\,[+=^;lf̐M d#(l]qެf쫴=Bw-߈]!dW7?_ I:}@3%vvC+\R>U1ͼyumȼsavQwmHXgRu|)O,P ؎pkL`ϊqKEVn?ެoK)27@Lo `D74^UG$xj*琙R켴qوDnW YWfX^A4݀s$X`])ݛ \AVd:=lFUSh0+PIڴսK~^\`?]tI4]Qjk;فY]q6~pu[g X,yf:gA!4Q0E,h^j σhXm njE 8_D&klAW{6+u:fZoV}s,6TIç%ojwu\P΃G0}be*7Bl)ӃT3#"xI@1A+P6./yr tsS;Cml8ui:gwG*t+@IуIQ:[^@ #5L=zgSj? YeN/YzLK Dr.)3{&v_Dh\/qh޿6-Ћ&"r UABt>vKcY PD-O@U5dei9+)N*McLJhjL0Us]TX-qsD`ߵ:R PQL]VmU$<g iYRԛ=/GW*{5"] uoUeE;'w룛 |57QH-KarX˱C{^v/&Wxξ}&}uPߎ²$4Ezfz,~1M{}0kƉ;0Js)Q|$3]Xu Z IDAT`G^|029OAJC ђy,]Zߌ# _nh0F}`a8 ؀IJnZHZdj4LCQ7u>')dwv;6=;e"_ WÊx`[&6%mܩΈ{NpcwgM❙-UqfQո<\7fp|*MȦU ["XX?%2 חZ%[>WJ2Rk7Gs fL+QEE6-'n]靾5JM8xKlv 3{4/ 9`e[Ql42Z*39P" ρ0iKVv?wF[}o PꙝrG6 l뎩miŞ_KvLB߄|`&]3,N)vpQ/;_* f7;Qގڛd!p'X(H/[iWSbvB5Da#vc(#Z0Z9bTEeD] BVS^3]q] 22e΃<"'ɮR>C܅D_E|Q~ Cd s0 }k\_SAU.u7 ] T 3 gdVa(HuoF>eq,DQ̅Fs0 }Eo+M[wGS=DU66: N Iw9f]!M,leb?`pkqWgz%6VkY×%{Li?.+jf2b rTEPRUlԙ, QX 6Nvd/6^FyH|ؾ*'[Fk5aүPWo gEhHfƔ9 Z*ǗbtZ@5|NrM=c(z8d`D[:Q#J a\5ΔA: .󖈶ɷ|[sѣfӐ+eB^M__^PPT5KSϞJWfQgy$UKda~sL8ۦȭ=y>5&0ظ9pF숈]=[v*HutDs֘펉KnUp#Q1||R5ʳ`;MtA[TMoT"s/U`  l [CSEN\ g٠iUfY?X,9^IǠxHT+<1WCLd=\hEuo+*}5۟5ޑgs߶\DXls9B;ImU QeX%WVSOT:s ; Hs٨jQ1zl+xz؅xC{51J[voV$EX Dim:Jh?tnD8W@v/ |xբ;fdZcWֲ)5O@ ͎j{{K҄(]׆;I!cD6L*Wi͹Ke jI;Ťb=oNL;Ƙ@3ǹ #37CAQʊEyU86|@;jIe2vuA(g?!x4?>h3$09Wa$t8ſ>NF^Yt?QI!Ԇ! \iTtz/q3GIBK2UUQ0HRZ[t=[+"WFCyЁYo`n0?f3^5diUC|HD5kjxCgj5QtT5lt9m=R+i29Y#+R} @D!-4y3Y::_""jLe4 [)#O% `3y ;حl(nhwp gYh7ڳ짗|aF3nۚcfA2#]DL?|OMP Dk8 0}j`Jc {AH?^^B2?I7@l0Y>F Z_t,Efe͋hP#[j6ƈ /-XALz*!=k  9^'%r~!~ijktV6*9)O5A̯ q Q_vPkH52@E⡙h a*^ 'hD3&BCFn=MZY HԻE JJ;՛mA+<ҟi;Rٷ!Q//FWPoA=mY`t)xg A8oӊv P-8kC9qR:J WJ| Q܆Dȥ<;ҥ˲Yg0ap ,#{(?0C{hl.{5,Pxǘ7\3t/1hi)mWM&ObO לQLsd5{Yvi:NX3{~9|!.d㠜%}е44|6D=\%Z;j3ȳQeR"=-9gifq4=$/=VeG ls!>eǎd;#r[}&A<&+&CcRpVvVgP3axI{:,3QxN&r5-GQcˑM U[+&dA6]Y`2QP:Ii!#AOj~G"G_s5cUY.sf`5c(kˁ8p:)U9[7r?A:PλŮ'jE鯖sE>r?r!?]e6FJ؈ l5INWUtTDZZKHΔx&^)˞yVSk!un3>Dļ e)5)^c]YQ&ɹ֖RkHBg\:C;i-k"y1e@9dH_J o%E  dNQaDC\kIW5`RjI~--8%x Ku)pd[12{Ι/@+̜7ZfeY:8*tTXZ`Iؘ3@X.=JdX#)nد;ػK cy\X^q^,'i&$ljot uW)OƋ*Wt&ܼ-ڃ1ottQTG߇''7bV:WSOo0cZ)r`Мژ|l?A1b]4:D ƍ:j5YCxpoj]횟朡ǜɪ$3qC;g @߰3$͵-=-xXp)pSwQjr1m9j 88-JI^ eQC៻QRtΩUgT8f\"ёҟ3}OO0w; X<-g\QpEWVY{@H8:m*XҦCشmycCN&ŋ63'7* _5B p:[;v6Wq1\wAp | D]#ʿnxZ m(5HM$u;8խb;$OLή8ALJpZʌ;6IzS_+{) Es|#Ҧ癑&6dtGњaOh/gSM=KgY/>Jtl(Cp^'^d!"5%ѣYޢ%#_)%Y4x9M/Fcsz3 EhgMfqYl%| e{3JfBDInZoE<I4e~8͆M}fد:s0W(Nsv}~񁸵,-3*wN's*Ԙao|?tgU:0xvDh+96Щ`kovK`Z>/[wU^-ZjJgx֖NJ9l%aq ӏ61"Iu.t[Kb~u|r}&!̳+2! L:g N .xPrp*JO%R~n-/F 5yGiyJlB{ݳе0,=Ul]sm"SOpeGբ8 FZB#>%Q1omf%- %JWcoCQ.{p7uq,=q%|h+ûLJC4.pX2Vr.|uko}r-76LU ;bLmtWRu .9T+Ekx+=0Rm߭I*=̈pVݵu_c)iA[>y%i}N 9RppTqr*jMl98`#g̈́{?NQCCeDm68䬟ޱR01hA&Bp1?Q=-`^G! 7?IfŽc`ܫե1̂r7M?7݈HzÃ9ޅ[WԿoҮrx"x@y)b8aڞt4rmDY2ǪU Qf κKoaUmI6͡G%ܵM(kpr!R?/Δ2nv95WH.Y sR bjEbe/M%r} pHX&FKl'tvpxW^=팗"4(:;׿UX ʍD~w ;mb")7@Rqϻ,W;. X@K7) 3Q" pЍr&znH$@r_392frGvtPuRyF[D/o{!x BRwvwFM!bhukTw C+JGZ{VqfK,/(}[eMizI=Wɐ{DwE+=hg[O;84@D/e.ճbք״-m2quVc[Yc,o>B{ W&tɑ9.fFQY:N9nE=N ;+!<ފlzFQ0cЩ)Y>VJǐ1~eIףF"^z8}'rE{2b08El1M);:2h* dx} G D^qaPBh;JφгRM3qy>F84X1ЕG+\Pe x_r[rBWO8{Xn^4sc{QHDjHY\ZWX'i۠锃̋~t }Cr W%}SL(6N+kH 5QeۨQү=;X{k&9^6IEC e> uGY9RdٺbCEuYH;D$4α+Q\-U\溷h]a9K ϵݰ&n̕WiH=ﺟDw=gwk%NH*7*'g[χUOLlU=uD'k鲈|d~}^hh6bN\g`JRues.nCe^u~okf'qB )כ[ДΤOd[ S?BhU3gH~f8SӾXWG(AF#*t9^=.im^N,MA~ 4Qtn 8o6X۴d5ŧxF`t\*Vޥ@ȴ)9pTJRU0)wKS>\۴nδk4y &\mM${ld"&t$i];r*)HAhv: IDAT.=Q~F0ˏg{0kL[BXjF'F%=]e4hO1a8F% 0󦗍 M3^~[{lhPIdxyhe{ ih19 b:x8$Dy82"_9䓦qGi}3`70hV#,jV3CIUKX9g2T.hض3ڮHl)(!!֮f4`aGzdIhi־[HZ˕O;Z(gc00CNJxe*j%-E\C$Ժt UT?lNC8k>hZ@ZHaض r696UD2/hP5,tިWl~c]v=w-|0o?m>whv#AhCL/ʱ<ڊV<2"3& ˺} !W"&^.D\*+-eDWl'\u/ěg~u3r3AX> |f",mq8To^FM :;k~CT>xvOr/;I$..zoxb2|loQ+V;zzeQ塋λ gꆮ=팪36J]*Rr("+߰c*De$T/:hQP=ݣ88ͲDɷA y-3U4f TË{eG:0ȿO K+PlSOy"J5G{oD:${q \uHglw?sMs0]ҭrMU½u R~fGKx09(Fxd pV@y/ާ$t6'j)IC!,28?gHH ejE[MŨO}w!X"@|;U@{:yL%gF#/[Mo5чlZ'燎3?l/K*DoG##*͂3@/e-4{/ۼ lx{^"8w>7$ZW*%| b?ty-gpܵ^e "$gyҐR28ujGŊd ab1J>*ĕUzP Xt)TQ @$bKU81doI"akC@WVi3;ݒOQ6Kơmц U#эIJ^{ /Z_Ņad"> ᛾Ξ .`3RH'p`'an'B:G ݌\]X_f6''ehcmtXW7=\=cgg֨/UW}S55ϹAp-PH˸e᪬|4B}-\aͤp Me«"$@[8|=>21Zp1ꫝ ىLۖǟtL7~+(}Q9Q@ KlK!h[귲ѰԘF9]G]x[:.~fՉD{LXseLn歪[F+k{ wv/-Xm~Ӿ_wەس"R(@1hPD5>%~gV dVI,^kkeh >{HgaF^oldkZء~ϴN? ǡ0^36Xǡ"όU#k,Ѧup‚7=睽L%˵{ߎYZާ5Yt OqC`_yrXʐ6Yc+4GV¨hy|L/s7=&þҐJ< 6TܪoaojsGF`_hchHޫT9a-圫JxϮO셈9#qS=Tm~*.Ռ|D_aִ4nMkBغj'5+2@Q:Vr-#[b\l}мձm-X05ߠsA,8rx/:PdΒ)1Gaz󦅍\K3_Ѥz| J}'XUπ1ƛINخF\)h/]VJnKDRHfcY(=3aOhDޟB{Aqxf #!UH*0v9)'8eאS7yatycv,Xkxε@JkcG:yLfr|떬x jxwF!"74䝽d^Mġm^dp Ylr{2<Vݎ`렢fpe ӻJ̐Dz)R^q,\̭}$l#[AUGiie%e?{&W+Ȩu1c:pYb:[N>!{'^eP>[QlZ>JmS1}ůj} wЅC{;#ּђc Iߊ 8 lVf? {LTm%za$nxR٧Ӌ^SpbtCn^C9<.E$wDTʃۢTcJpb wL1{jH'}R0ӓ[ \&Ǣ V3U5%t( YQ:D f א% \!5ldíVR, u#bCaLĹTG@@(FU>wt#>D Ѿ*miͽŦq@]j_uqnںp>뜧ߟFk~ =?צ2˖or ۺQsDy#:'M2;pAEpG ,JS&щJ?hTdIq^ czS=9-UZ] 9 @bzRʿ|pHeV;տW}Ym1[P½HfW[l 5VeBAĐV ;w4Z>jb7غ+߻S9'EȜj,FзKg̫ӺC? O3GƅFΉu*YBV^)՟! 8<2CDGVFT)#__." DtGƻg@|>~x ;anBB>i[|2آF\j3$ -PiUg}}n4N|Kw[Z|VA)]'v=H%|W?+~3,20(,d* l A5`EA8*ت\xVMt2U 5%U:3J>$$H,O|3 :@( Qc/EnOu߯AV %N^RnO%tBnw!d_ٲ}c)gTolf9o '3b iQ`㾦r P G+t'zXXW38_/YUE鮠3$ȫ2)hn~2ѫ"2u ?}FxȘ0@n4â|z"%˷8U$K m$4 WaQam|^Jh&J 2H\`rpU Ϝ>uLgo,^]=X82`G lGW4f+2zK64G:ߞj$%gY l\ NRD~܈<0&h3[>XXx[5;iIzjcMonO$,=CVyv/-A1S5:cT{ݕU%$ど4| U H;J0I?#n1P>7YD{938p.6;|KTڏp#q+A.s$cKWUeoDEfٙS<7YdFf[Kkѝ"[oMAؕ$xўOi3 D&>0&G1<  Q0NRṐVFL9b$ʒ~酕1Y8-'~|xZf[H ]IJ ?'@"r" ⷄISduawzV`MN:7>*%AqgBᢵޖ8tO(P0e_e6:;dcX9"`H MZcDjPʏ5};…hk3@sSBm+g'8!p"91321H TږS-U?P^4.gՀe߭fV㿙~ԙ2'EǷn[$h^yH@d+eHy=3_{6X09}'g)# |ә`΄q{1"![U-H=]7/edc|2۳LLfli` e;KP0UjG>38T /alUnf!b67jﶗD*b9JZK+[CɄQ% }; ,vS$ h8I D QJsX}B#}hfe(\S`!:2J|4:s. !JM]>#kdwg~1ݡaFvޭHIԍh]Oh!02#5U"S<Mߺ5۴+ Oo >y3 H _jb̚ܫrV. (tI^kϢvT0m%y^)]-]?<2L,x*aඈJ;Zh&9庝(껜}s혡=/ZLf?1P'/uS"z<쇁d j,coLOx.bOaó:;SoB.^3^rN4;sGԳ7M:> };36 Vf ¨`0 &,.O@HE mwvWWlG\7N䩀W2s$3c(t$ ^6L * X~2.yp 8}tpdeɐ~ nXЌ47X~D ^e= u,k̛q(gXҭ.FUs0O?c+`Ⱥf O'V"ug"w*|XQ lYgXk$OC5!.sDGbI{[,6yiNΉ@V E՘1ҏ-x9l½יzR2skE(ŕv 82 \ p,F'q ӭ*M9e[n4Kq)~3Y9 `)j3] 9Cn׿AOf#̗뮦?#u@ySʿ"uC۳-~EP=7|{Z#[nݍ+5.(=,2w@V$-+M'fd 5믭5GP*2ƽMl1Nt2hQk@9QfKiqCh\ ?+liQp2 ʓJM+h5q8l1 2 zB!g5 5]ܯSn{>X,gjiVpcPd!MC[Z7v躈ǖ:f! ci屶 U,Z}gʾmexIlHLEcbOFbս\&z rն.Q0Rg.#rྂeht*#jWS>j-Nb` קr7lrdBP48 M3>dvD{Ð|I֬n8bjdzP"`F@kBc2mґ@vY__ Mr:!7Ղ'r,_#-XK 8D/ܜ 3]0t;+p ?暌~\yĩ-2-|DҸ_I{tE Pq&cѾ&,QYHbu`.+JcYՓ ؗ8}r?%UJc:} ~ki|.xd۩u:ڗ87"D0 IDAT9i¶ &@wV-/wZg&fW@1^%!f6qY&Bt?3Լ3NZ֮xbd1hV^2ÐjK$i5Y j 5JF\B1ٕo˲B7J+j$0kDᓑ,dLhƞ9DXCDpDa\!-C3埁9@ȭi/<־߶rg]7b`,ٲtshF K}N|S_HzRu:(y08Б92cOh d* ƛ.zxtRY+}& CR|CJI\-b'"8ε8v z^K\ ڛ*;6îh3Hy~C3Ha1|_AiEp{Y~pӭEYؒeQNoV2!w*,еडSَn|o`R5JugwKŰ,pNP+r1s K:!ڡw(&ane,d#taIsdb, &Vc}ꁑ{șU/:k^:ԧ翩[12?P<uQJ:o_4ԋ)MwލUOg4 NR h,0pӍׂW OX_2X铝fm̱5x*PPpmUAer7iwepZ19ZӋQ%oZ? JN7KF5T. jaУUُY+kmt4K텘q^*xJFdƴ}׌eRL ڽz8σWg 0xIO!3xE0*d6\`kz']G/0rda m(2Ǫ.RHP= 4X娕ܗ^@Dqc6nYt s o?y87iձ3Qe^(ɲ•߿.+1Wی $ ʰa5_lAb ay~YΨ3nj֞Ech{(q ھYՊ"i#j[ ԖSBc?LSva:29hڮ8g@ ,̱_U1D0wm+@'/@Q]=ơJJFDTX;c&8fczbX 6JlZst*nؘf9'sq#߈s~x*d]#VǴ6ə)3(m4FIh׶Zj x={MfSOY:whM88Տ[ݿ9 ;L XGY&%6ȐdJl{ua4M:na< h,ElJ)gnw ZIT^=agb$fU]H"vިۇ4W5t LuEMq 󗑡g΃٠Cq2Ŭ/qO3븴_ܔnVe0"N*ߢ )ٽZu=p}bG.{9(,iN0*lqɽXʀJ{WPY|D:䜯k⣳O;;-*8{xvѦE`?CY_k9,cg<= yanx93M/ CN5z5`<K'i:}a"Zjf<`:Tq94=PmP3ASF  *|#و&B%ذGB]nCۓ–>1 )7~lJuŴ"(= 3F +GHm=ci2[ ,UjmV&[%9@+8"GHM&V,ʣ}x.0r{djѤhd5WA9ZOL\SMv~~ 5[ `fP4PC_4TzΝyE1zz$-EP"Ddlxܳu.\8 P✭zzlvM%)0lX +ͷeBM剂(Kp4mcmo#֠xlpDm@!ЂW]օ(W5ym̥QgkayB?:0/˟Afa;`ʱu }frvQ~a|r_~yKflĭY~'_dwoIx /k0j@oUrC8 j1Q0 9yq ,}G6b\h/G; `zf)*9ZIgh"=_Wgr& #Ps{E q}D_ &EnwPi(tkĴ+l,^^Ӭ>{ǝ:$ʮk~W-UTH+рkxVa7ʺ1,JLKOjJq`/ h (0-~*M&~`\CqZ+vt>:hy d}2߻71xH|ܸfNsmReۃPqsD΀fC<7ގ (rðPBs6P @ i\8lbU8.Mc{11&@sΟ MƢdw::S!;v_|Gc z`%K2#8aG CؾwACFM}%ѣ\QCdb&^3x3iQ@&[Cܐ yaZaRe8u2bvPZtXtRT>|Do`ZfDbY;<>ewy@`,иI|RLRl\;Sa84MH#ءv?_M(SRFפqtBH2yV.N~75͖djVMa62hΘg{\P N@K]2hou02ߌ\/@Nn Ž"[HF?2"|=[r -]Z;J^O ,ϝXkdcC | ~{ӸW^8Vzٛ`0hYfrv@h*Ғlrhat=ؽ'LJbf BpE9;F.@vzG!Tᖶzt 8m?tS _i¶V^`I/gy-row?<ΗٞB rӎB0Ϟ`)1rt*MI˗B2 (F{,f ,g,ׇrYs4ﰮ`䲐TTuXPnڃ|D:l ]yQ)8 L}Ȼb.{ֹ7'/P[GQ5K|fD'A?W|֐8q}j%y$$K$Ռ44*EX#+[4;x8V0oU7E^sX`fH,8.'^K_sVa\buh`VS-oXӑ {-iFEUkQȚ`Q~s@W]55OQ68[3"MtZW츃zC[l{naw <]Հz3ogg NY݁(q(흙n< +9qjߐ!?ʤ,Y#Dy4u\+"ܴp KuLBgTe=fFἛ>3z4u6¢sM1OycSБW%THzPq0u) BzVD-,-;2(D)b T7 T:zEC i3rC=%0SՐz.":}wdy7п˱lvt,PD&qXsLg t7z@~9CI{<>_b\"se! `Z"N ޙ3ڥ?^09? 2ʆyݥS`ĩ|uJVL=լZ)|,c'fiϐ|L^+껈C؊ںY XH vJa6=97h G @}}dr->[p*|Ogxe r6K6hNWnϩsoMZilǚmI𳏖Pu Hф$oZw % &@{^n^+EP:ugeG]u>v?vX38ezU,!b, KYem~[d>`Dk_6['|Dhd,E[!iioy!/"3VZT+oJ¡voدg^GD/BLߩo ǹvh{\3&PGLToZثOGiEp٫{owհi QLM>1`FdpPƤU wc.v٘sx˳?'<Fv= e㗘hRjzhE4+w6+#b4QÓS>dx9;T"(`i {{ 8tKt$>cwZ%S+|4z[oҭj^ zOYJ{$_(iz_ӎM;{nn"kak|bZa/}u1H<#Ι5eGE^QRTj-~f5`e^qj!,v/>xM՚oJw?XQ A^H. - R+ytv8j#;WÅ+Zm"ߺ7^Y~dG+\v}78JɣJtkIVIvCG"|+&_<>-pޘ?P?t0}`5=wc(?xkSs (Mb""x6xfp65KD9GVGFHrѣ c"g>gsK鬐 ;RaYlKU=g-L}dܨ'[wj*O}Uhӕp|CJ- ѭve$r-i2_2o. "K+zrSF_ hTȮh aˀaߓᩞ9=T8dva` L]Ԯ9s0"#rb) 7 Mζe8"RoVxm?] ^vG;峮ja $AR xw ?hX y/Ut<+6^Moe^8!l[X4ZZp_Rs@gsX|r#aPMM_G}2foGZ jgI<sMF|lַacK},x[pgŕ2pW:ީګ{%{@?vޟMgL,9Bv9"`팼@?q9Z S ބRϬ05َ).u<7@Ю:u4O"iDS|N=%,}4X*Xc{%*+&;yᠸǨn!H ZhoM3j {lcڧW ^T^G ?c:`h?`WAĴz$|9NS+mS>cfx.ʶ yCrDH+ŀoy'm gmDBxh8b'\r[S zk`'ȝvuΓwM~`Dq`lG|dNb=*R]LuWD89(SyNX% q4aMOhK~I%MS-|e0 T(/&s(^Mh %h0apQO5չW ;γ4!;̀!nV+^ŇQ0Tq.f4Wy0È,-6أԑ-b\ᚦq|u{t5br/3LUq"iWU˭F8ՕYxefjcB>?Cm{b}2lY}btVҸG0]űEáΙl HR/{ڰvak0i/r健#*Zlˤ^YbҚ 㯩N:S'Hk#H J\PF>T7K=*sza=E$ r]m5wE׬lCذp>ۙ>Y+lZZ_?;*P%V5BbNg`t,gWל]K;(5c磈%(^'2>;i u1bz} 5ٌ`UvʺHȚM[' kF>ĺ |KͫD5̟Tݥu[3%x8ᶛ,{ f{O'-U cb1\gjYj kVz_#`Æ 2$s"~iZ.g,H;i ޤa(-?/o5:mgRPf SbFwZ99s,@%B( bw8$5K_ rU3vYYޓo4W*emS}UΈw! IDAT7i8Gv+76<.a7 éHw8D0<9S0@T#p8,/XbrO%h z LJEb-16BDႽ!"h>u@Z7>S#ʖ*BJQ:fw]K8O~3M!eirvE`̹ڐZ-K!5qwU lUTtY_ f{~?ݤ G!'6XtԖ‰ F Pkآj\ rȽ"&1jM}0<ӹCMc: Uy[=3Tu3xWXU][u0gtghb\dվG ób>{2cSlz.ucMwHH[${^[h'?RAð`)tNm{ek#YxWn/bpfr5TTR9'Ei[zH$:7L@_Wm9qM˿pb`unBl^.+gÎbqQHg#NʞlQsY5\6:M9ѮvxB7lD o[l9N=pZ[G88^ YG\~HXi׽puG,M,BUcʼ+='eѾl/?uO M'սt֣mSԳ+*bȺ=0k ǂ^ٚ.pj+W ?Wzkk}Ti8_5Yma >9cVoiDGAe)$kKZ4CD] !&C4t(ŧiCV1ڂl=o*fH_"ȧvFw-`7VAϝ >5#P}5W1\DqawQM ys)FDjnV*a%b7"ʆ|M>I-+ce?DwWz9t-',_ЀC '֗*%[q,7}4bvIDFP>)Of3VHДA;p۶g9s\agAet8KJsќM40tl'< 0,k#8{Lظ#^hY)JbX%ۜ2쁗,:,gap|M}V=\FG@b|>8td}lYJWb:m2VC~[`,=tl=!hnM_ABVnzu `~^Vv r%swݠf*9S1X!nr{x9gwwl`\{.n suQ_3 ( :64ڧ$9,pWđ\s>К$'ޕ{u>Y'AMn%]%l0*%NIVafjș:wzIXX|5= qUm& !69.C>ߙ 5ݤ*sƕ[H͠Dq m _M" [5.d@SS k͕ŠM6`|C0Aw5)7б?o1W"0s:6!<d #εy׳ \p3B L*4Rdn~?<\mSĴ5p;@nWj/6{ZA55蛤ɷJ۲?MYz13xt:(~P1e@KP= W. +b.Zv׷@5Jl^7t"L ||+ǁjmađ= ̕8vMQYj.+:g-AY눤e% lك&3ЗZB3SPbr4hH!uu/Z_[ko9p^Xg;rvQ䎧H93 "!B|_Q?L22ˢ6 ᛮ<ˣq3$GXRiX!1!&wצ-cSLh.N=&"u!lPo,\t #eb`FzE"OdtgfRbLM4(N2>IYYvepLѭW-1ddGS]8N1lkkK;Q>ƇM+4/eiDGͫGͳUW(NjYsRH IO՛%# -nA^"R̊=ʜjd4 1H{)üD, gb< w~y-1gf!F%XįE%' '~t6@Raբ闔IVD>, [h\`~K=ˈ|))"&t{jmᄛ cɃS#Ympzןb7a5Sqq0KLÒ="7<S~v$97WD4sbyҸ8>{-n7< @v5+w\M20UsƗbiN9͓իDK; 1{ڽѝMʂYeÄ̮DYb~P|H؃#޸ k'X,oղjAy[9 2Pg?q]hehq ePe+0n :qd,ge=0|q%39O36/eh$/)H MMS!pC,68n ?9߮.ä~ٰy|ֽU(=L1Ud0Y8iZBg7!U.dcQa#P&noYFʑtBBw,GAF < m1C8 ́GEx-9wڧ,gE<瑆_B{8lևO(gǒ<<'sICa.Z9Lf''`Tm(" Qۘⵕ} ɶUJ}xf,4(yv' ^*o;cVퟬ]D?u/We~BnrsjěUovbZ^v|ߚA^GN0 J#h;,YFZ & ܪ6_-#BLg• *z]00Nʨ $$0BHc4g^x i/Pڱτ^פh7zi!Y};cɾTѱg8WW$ Jtߛ,mA$}vkaYC0YֆK,:IJ 'Le}ܞ93;m=6g3qT 8a`XO2@xӚ Έ1<Ϝ 4H@ƲDpmQ/R͛)Ld qL`qr`4WFhhX,'"YFdcɧ"9@_zs_5\8&d== xQPZ.{5 F.е3=İ("7LCENj̵Au^`u;5V{ά|g=lan1*'+4Er$O^s |_}&Mho=>uf9 p#K90Ny|Ovqny8 8O<0"}׋̘2ځ.߳{B2ANzCEmn^]D:Z Ϫc͠% ڱ }6;zEwѥEz ! [_$] hbL;3Պ\>wvHEӆEVA_Ya.{w6Մ.21P һ{Fpܽ],K%{1zh`` 301vڰ1ژn.2>rI.ܧO[=gpʲo BU[ 0ȬΡ@Uj:5G@+qovvuF肐N`:=kۻ,Qe6:+ϻ3GεPM~-[f%W<8n[cD@WY-}uVuy2jeIg#{:bsA:4(qQetT {^X:]\vʈˀ\ٻAVf3⾭yDW"-wĔUܞs@r c\lJW $3\.嬿,/;+X moA-1qK$B?տ";Ol \WwfjL7UJno5oAY=ca5 2~$bx4YvX`mlPRh)$C{M贂Z5טo9͈ 8CJ0H_O%/za;mEÌQ81=M&&GR˂FDDn);[gw(L=Q91\}L'>O`Mn٭emGVAޱ*CYD={U DL7 DJNӫ `4!5Ѐq,2a0;O0j1Iv{(Y *h_&8h -%84/]j(ߍfw۰c3B &O I,sTWZ%8`q/9 tQ5qf`<54UV(}Vh u!($h:[;s  :w)Hfŏ:7bpä*] ¨ h$AM0`~y&0d0*~B@pTI#1;/f{|ś7RX\ldDG#hFkVC6{'gضJ5Xkהe}!l Ėߙ7ˈ4V ftPnF1FGe!408aLtfm&m^H"wfFls^ Mق6 {ySOXzivΔL/iWz2YE#2ؔ( ]"Ԩ=4g4Pn1' ap^-˔9!JlF KЃP03MI_],M-'G2 \.'21$P|+6Cs+}"%7~ \io kX4x8PUQJE Ev3ar{qzޭv -a Dƽc qd& F0rIc,FDo4 ~^5;UdSHH}*0aK?Xˆ{E87DMTJdxԛo3~#mOWWAdr9VᨎIj`083'qY)n *{wsEJ;_="*mHl0%veaϽ*.l/ sZ%]I~а.t2;%;bJ έ Q=Sq>c?0dZ2k9'?^y0C0 42k$T~@^gRo,u"M詟2J'W;]B{oO 􈃡rdȚ*4)y1Fol^v~#)#$。К }flJiBB5G =1OQ]]ۮPXC# #A@1m:ܷ2bXtgH5DB`kRf-;牣YK6mµi2(2-[b]byd"o8n*Y}3*$8}\5;OÉJgfF*0 TD˪6h-,RT p tF%W2|еDpuufQ`8@% \dєHd hl'4H=US@Z%4c gEF'.2CG7i[0 @HGMk GfBgdzV0a(w IDAT鴂Ѐ%<"hh",0d!փG?!ghЧ~hJN{u HdȪ{ֵ5ZFlia%ͷ@f QF/Dsl('45}CWsVP'0*m&sIlׅW((-uBw='lJw*U PULXg[q fG@ 0j\4wFu uSD<Ci RJR呕:I:p]zĢ/vhy܈6Z}S$%RP'`  @41k7kC 2T$'P9:z8 pFW?Ti^X`@TcR9@Lj"V5)oynFLq^,J*)=Huh[MꈀեMpX .)%nrS~26i9~!l򷂈 '`ןO<<-x2rMqx>Wu}V=@ HC=LJ7wF{GA&.9ơ?V̾bpz4{f+{̏[&!sg0f̛ ]h՘ΠLkvʪ,aFNVC>C3ft`t*s@d7jwb*}2Ca8_)UZƑk^.)qFfHQ hgǑJ Hx0 u` [~Y-1<Ԥ]Ғhq-ˍЗfv+>_X Ox(|KA[ 3$4NzzA$$zL;z -)wʠAɶ 6DQ\m%#R{"f G\ZA2xYy#tLgmo) 372SV0l@8`I ki?a'dZO\b&B* ˡCpJ~xuPerU&K6>d`Nrl$dRߣɾVQ_R@-Jg$3DwC*:78Acc?7S 3_ʁED5^ [fId qMc:1 ٟHf/@Ipk ,CTTWs+jg"޳j(i/L gED!D~Tp^ !\ċ9Wf,<~ gF2e =άW}BH1Q~L \f}վ>Ԝ͈8;N*4q4.L $Ħ = [g:VN&@h22:>]%$ To TV~{=C*׀s(M'.4@89>qߖ]L-[;E-Djo܅$5ڢmq6nl6홱Σ`p-v,%] txAlEY;o "3Ŋّyg9*:L~67Bvagl2em@M6`KfwddXNyU %9vZG4dHsD{e` 9j}F3Mt6= 'шEQ44&>1l#ΊX)fw,EM&pVJiUp50p(=}gJ=[4J[QQ!cPn8&w\Ie&˄&GP1R ]jĵHż}b3'@r!]vV3j n!<(CƍQQx_0Ζ":7L"> gL6T6GA"D0Q\:}Ԣ߫ھ5Y=RveL}zBLg&⫰ʣu59wF303hJ;u,9$of2giwm Aa9,6`X, 8!&!d|yL޶ȩ-ÀwO#j%:V RtBi(so;LW"ȲmӔX6lYc%8˂}?PǮb*#]q!7ږSÙ]T`F6YCr[=^h^{ི?ӥxʄrfȆ4$҃XSQ!x%+X铞TWT,^Q߬`uJid.;iG&vjRmC[@EԿLmԜ ? BtDX\8IA}>Ahʟ̮A1eUwR]\kG"锾.``x6Pd;hNnx^g/WKdhq{֙ B';~HH*߯ =HzF)[kft.}b!S+nE,G .“:)@>.=cfհ}@l q |o6gZU^28W;0W m@!lKS;+m?t𐃅QԽKHfB6O^cD/7 Au?zGҧF *m꒱-bڑ0@-z$Lx#Hńu&Kuka2]Y6(Լܨ(2K.+Eא%h{t̊U„*u ]|-( @؉4̶8‡,'<6{gEdm g52q~&z{ߙwn_}Ѩ3|JlaEFW^JrerlT 2KAe(E yTD%0' c\EMoCjCzْVJ>T5'|#+ɂvүs(NE-8>E > D #4:уM Wдlpp64>v>G ^ɨ*+׳NL hCZXu/ C@G蘅3cbJChu ;tFgGgSUBU#[mlVCA~P2ﯽ^{F$DWE=@pH푝* i8`L&LpxvIyWbYlCDKr^>0oᐗɋ7!s^PR(2rFz=ǫqT?9eKJ HH$(ݶ¤2T#-bm0~!# 'y-k i顰=ؿs4Hm&s㰷epqUuP\30YX)TMW5/1k l2zo >7^bq[2( F2'ģET$%%{+n+aIO\I9S\j*B:$rcwkC:N͔>O8{i\J KgJ4"W>:#q~yAYLl17u--O.dOFԸC֘>+*jg=Ձ#kAhJI0V#D-BD@ H :rˎp}=qoLhQqm=~/v+2  ` ~?0,*.8󖈥8Ѫy;HV23D:; 4~>S%"Eҙ 2XĸA3L!h7[_r+KG1:uNwL?#l+VAj<9,mkpwӨ\s? EnK4ĴsI6cRaD0$#[ 5xJLc*-0ތ掘~\aEះv?!y9LTXw0ka9gL"v_!#i;FކXXc Bd3#^\*>!h~Ygmy5q=xW$"F4"c1mIbL߻8*; %Z I%Ó3FݵAJq죡mg'¦ fYRq krj<^%,3/l:50]*qtp~8Jc̵A'D%:TL}ޏQC/QϞ[iƉڇEG"%1Oe ;df[ ~t6'Z^> Z{*4d[|O[OWy>~S)"ffr辽^}oxI7GTɖ=̈́ŊAHfm;;'8dTb>:}zxrd>04' HuH*a|V(2;l:XXI# U_Kb]}E+}LiW_sKF,vέ$ >{潇oe4OcDL8s o1 6Z H+X=#8JjF<{@132R?lzqT2νg6Zt?pXQm 8gH&€ADv,gV"-<8`"0Oت0ЅΈ'Ϫ &,)LzkǢdB9PIQ 9|NvTjqI>˗j1X@Ȩbb0#X%q F}:<y.%N?K~qm.R1[nA!۝EΜ=H hdSaF{"Jٲ``pL J9ea"қ-?F)u ?~@bDv>_xn4L :^ޜ !<4n fkGDFx 8U%$#ۇ|]w// E*k_&ad = !0a r'R3n<7Nffw ~eɶy.&{.ǎ:i$-؂g(Ԩ!jMGI2*h{vK~ƶm626+j8׍}$Nq#+1xJP~DG5gǝ-.W ds"!ɴ uPyWJJ^aPYylavxq0$ꗠ~S0vfd?۽PzZhUcHuVv|FF0NeMɨF/zZIVes?ح-LFۜ:KlaʑaybH఼DI~z^MǶr4=ԞUSU6u.i (=9JXxd]57JΑ4]-I Lx5ѳV !gheSШ%F{VO]ę2֝ˠyA"(6|19c! cKP&k0i­r`ݱvƧT<%-~QrQ^HԴ{O䛮-I4U,]*ju1v};Q5S3i1 <1b/+ ,d` ^BG鴄xk]Q'}`LˋlT@ 69L -mf͖`k 9Њt _Llb JffSG|6$rLyIo&@nrM{p v0MIt1 EJE$n֊\:o?% GZB=M9χ_Ιb%h9E[lQ$ ۸Ȓe#5 ɥS'~ԍ JU(> [3!Xºe"$jIʿjuLL֮}1fآ7#Ο^Yt|t!]C̓@p_hw0d6 8{A€O-Jtr$#E $52t-(+e۟ӗu֌嚵Uk7{;N֪bp?gTC=Qh#D੆|o ^t"wPlX &FEaxG=,JǵXP'5Dl֛7 I5ql@U=T̍ >_2^k8Ewތ3L/kIsh-g= )7qnҟɾz9R{!: sKckm ٗ4azt9^3Sxv|٨I]xlI$E~l. e#WfwmM`yAʵٔq82;BH;l! c$1y ͙JxLK2zUQ0)P%FeUt2c)kUW?.; |IC={bPĉ3PUchX;L7} і4 0:NVYhUM,YWJϩ|}#Vw5fEif18*@ 6׮oW°\ F ԽMF';A7>^4.I5S$2[]p!}://}t_Oi&k|ޢ!0?υ#\RԲ6GGȵ:sԯ{ 8l B=ȷttm~El T&wL 8w2Jv-[{0 fve3dIMoL~g֔^+,!o`:9/̖qQ21jbź*dTD8;ds8,d榰3u^<Ӆb뇸۝>O1ZkLyrvFm6 f>Ne=LH?4hF%bYe)k肜l(UwfeG3e r9W[0p<@¡mm&ȘH=52x>Y$^+> <rMFw# fI~ǹЌ)"۬3B}Q%ce.eqa+UTNL)Ua-Xkuc.5gGMtqSg [}Ŷ3,;ϔ+^10:Vh~bo7f֢̈a`-ecTLJw"3=Mz:NOoUڌt1d3*/~FE=Qucߣ{y7FG=S da,i5eS=DlH:mcN{ .Ɉl1hsJXi7hAC?X`F:9tlJp ݁Bbag~n$c2p f(@cuC!yq}4sPFl0yW(x%JZQCZ+vĆ_.hu;4֓Eo|pܳWe15-}&"rD,~H v_ORt"h`/bȣz+j,s)Q6pfjC`HޖlBʍQ/3\^8[@#ZF8R[Dl4ΐ^{9nklg#a*xH72lW MgٿW}*ܞuEgӸV0wR㚌K=p`~2sdW#e*tF:zg-új/X;NbڏOS6[qa~Py|</+&s JzWfq߯]X[]/$E{3(8aqNjr41~I:/ ˶pѩw 88U=|N3{e<bƑ%1f(>h}šOP`Ta _>g{wY , 9d mFi_>^iI7c36b&;ckuVC7vArʜKI.yH#(':Tvr5J&)bZ)+G%[H _k+n <+I:$e)6i8wl)uMJŌW}43EuqA>4~Ci"i!acꚼͼƱI #1}zNhLb6 Ljyi8Yd ޷o_ +FkoyJ2Ѧ:e姟H^&&HJAݦj4ͱds[r+N@!Y#.3&{iQOUFcj }gh3^}yHU'}_!IMV?wdveus_ +wI`k@X>UxǟiF%mgNV9aQ9/u*('D-g 8%Ţ}L3/TΘJ;5N` ÀS Sn+ʤJ2w,"Ram401;E;F:a%OԪJMP_#bOݠ"`0ǃᾇ+GH5BO=(<^so˽د0+14ZLɱoZoFzd5T&+qܶtIl{G>>Kc/$xyΡ{\ût'Yh8{ZY9ʫˠN9v^EēMqj?Ky:mV7-gaʞ3ޗŸϼD/$4,(2p|y&Sؖ|C)37`,Lw,g C慺#Ѯ^e< ]A:Ncɐ~8lk7"HqfOxc^I'Q>`kNFGع6/ d[^a[ktggUBfjWh0n'*eP\%n90i\؃ % 3񱛛Al7f/.Wn(Aekof,˪4kӑblnՔ&p pO&$LKQ-2VyS A𣟟gbgF3 ?Kggt,w`.+}kn D35ՠCp{ġ鸢X/Zv!cxtyƤF٤+N R3\7[AZ3׫Q~YY-LC3 O5 HV|{)M٢޽"&Jj$~OSOLxo}rX+Q=x&bvТl'bOL تk=>b@lHn?+6؃k:?LBǣ3ϔ/uk 'j)FʯIW"!?nG]uFM;L* XLeV 6i.j{ԵAw>[T B8qE@%`߇VGpH ،%q;bdF^@{3rUy'lo86{3wTD|gԎB>oD:UAr-O> e&U|ҬJQӨxJ(i'8؟wԤ~ԩ0ܷcWy&`'xZ6KNF#XB S@U\ ztzϷ {x5=Ů(K^L]"K۹poDv8GC),Zf=<ʙ7)+ x1RŰlo_vꧡFebX:g㞗3Sb4Ug8_{ *Ato\,H 6XO,b@]mXX \cg݉O _Y\pda/SV6aȫj:.HS IƑr(Bv:澻{"F6j7]FU+Ρ~36&}5K1zy0quMD$O ͐D: ö\{m>9}3~uee5X 6!xʻ/?p06W-ڟFʠTk!4[S^ru} My- $T% ߘ?<#QS4*FSLBl24M-27%}?sс ],*Fҁ):_H|;Aed|*'(g11x $jJ*=Ǧ)ÞpW`6.Lq$EA{C$ёΙnf0E WgMhM н澘fY$&؛ :ZPm!& YX[Ɉ=G;ˎr#KLd+_Qk׶?|g.xofl45q ffow}|ZGs[~vPcYytji4Aw LyD2`G{t':\{ Tٵ4(CKFocBaqd3q y&Ce`(цc,HNjdXeut-O5{<3{}% u mr82&#K wb~ժ_Z1ba%kt/U)[ UF]K2# +Q!}V6E@)SH2.4},"&䙹U~ [~c^l_2g0Á{U0"V"@lAQq1 2_t̘;#8Fj`%v%dKdi[JjBqvZϲ)C4!hF4CQSV47n6YY!Z&dnXŜo勖aTj)(=u;kEH}72=J^}eS\%Rc..A?7_ eX\'gZ9ʭΌ-pTmDy7$1rf[o:ӻjɣzTiY+3tFbURNΑ`g dGf?!܈zӁL==8,gNCӵ r-Lkҗ 0m4KP~U;F}0x1ȸ qIo]x.,ϿIdFɖ| GƔIl3 90ʽʹ2dYrd'+rVgXZ=̢ߨgk~yF=Jz4I%VM`h^uNN>.1z0M2"FV{]Mc.w9cxFVt9& v0U/x𳳃[h6JP$w>Դ 0sey -K_E'<}_rM3 ^~z0y(׮3bun+{DxTKwb#=H1Z#+F;Ϡm"~Y%Eg-JEˁ4jqhyD߫A5mw9Ռ|668",FgqAc/ݽ+"rJ(+8zhx zʴfʷ3TTHϸ F?3 p^:!KYex{k-қߦjb^$իu>+}eubRGE=٣q(~ Sz]m=DmlC' 5W8$%xY4&É5mheq{O7ڎ>mh 6:sD3j=#2URQ\VwuN, i}H|g)/?^| vEᚕN;d}i!yŠ,.̳L [ 0ޒ ~3"֣1sz7YusT7niQם<-UdDĸ6*JˣpK&k1)؈83>[)!m ^ăkHA@dkW_4LP~R@t'G+Q097gU:>x]Mǭ\jl ϫnV,n,ʚ辙c^}YM Qk"DYYri@2qU'hx) q4@㧭_3+L. ;?˛Z rBywHC>:莿 ǟmxUnA!UbOqaytX7kjD8vDu@[Ԏ$gQ} z!؏^ԙ(2F;"8~d9eUc~#? #w uob'\TDn2 f\J#(,9F㓚y`}Y3fiPsw4Q_^d;Bt_%mLUdW&%92^KN"s_%aL;}mpw]3~&UR"i 0em55d;kLQ4@abb6gF)`1(׍<0@9=cvEgy&Jd6$P3cClAs仆ug=}Vu:HILe;X'-c5+/;ߢ3 "2P'q}4E;[% d'H$򯆍3=oiyەXWt7f.yuD8o hʾrUV s6Nh+Z.;T0*6r?~&}bp+ҹ3:c1}훯 {euHTr^T4̗@;3 *d;c\33{8S#JzYV˓?u!#UVaTc./V r~eR- z/eMb걥QLD7W[m[fcxlʳԮ'@nd3+F;G3ӄ>G"F*Vb x:齦EYvl+Vqܧ~w*ğ1+>yCʽq.A%YwtDniJb;G \_ШEx4/myuQ)=%mOgAQmǼlL -ӵ|SepZ llR jpF?8sդ8 곖Ju1X"\"ߕXͩgsd ` i5L#)*F`ق)8C  x.{=~>.jJY8zrSVJ7E KV50ߴs U:]{#U J2[3m f=F3w2SWAxv)(yM4B%f.>=/NwGL>IC{|74UFM_e|6BLl?ȑk\o3EѼdZK"0~k~[t|I6nOIP`ɟ_`vW?w L`.~F{ЏOhfNpQY٪{OIhv]8ZG;<&2z(W1%5H72& qrPE)" S{[O*$.Rΐ7O@)/)0F:UL N<4dһv]ƏG]RS nfJ" V%4OtӬ5iͪT;[\5 >cqxPA]&qVeɜnf-;Ye^$W x'L;'toY+VzH'( hZX?4. bl y^ekX 58Gl5 O(p0["{}3Ls;H4#K,y#w(XޜfH2Нf1{=V/NgwPegFt05|}z3!)LOfMZu.5pXa[lx4C;vH[^vG9v|gqV‰ƝH`_bo4pXv̀#g4RmQonzi|_M+]7a`Z~9}ՂzI֕tE-7K^#KP@񔣪;76jO;(*w^^GGټҊ6A zlL<}CdH+4<1Q&,L4WmMD)wWl|e!%B>Avdy* J f(Ox-fj3D*/E~eX_,O5/WAbVg֍ʆOH6tսpT&baJ_^֏R003N(4SebgʼZ? ]~f\*x 3bnʪ{ƣfin.k_ eGOD͡l$Yy`CᳲaeDi5>ӼM jGOe 9]6|CrL-  dԅRUWI``&KO,E~_7!#E B +F;?Ռ!+|gL |dB!2UR6a=.mTَ)7]l!ovOsSQȨr<~>+>R΂WLVK;|خ$+xN3;zJuB~>D $Lc*&C5`'I!ƣ9"F"9¿3Gn&1>@ /ks~`Rfv1?WU~Vs__(uq ?&1ⓟvTU<>yQ/U{$%hпcns@Dk!?/Ӯ(]vrÀ骀F@Df9h'7e4&LYB^D84pZ`y&T {o| k?:gOQZO[d:m{L p =Gw^!?9 Fl9B~>T wpb\bC>RKz }Ä}H]`4d|uxH堤̜UOWo_}eYDD|ɟ~͟rԋ_XfF?J0PUw|hTuO%<ǘ397AGFW~??o4gr<9@m铫2J`PsY^T~}JySLm6%gFE9ȎBjX&JYb߰_S|LU%8>d;j?}q&Rj&"gwhA%eY?,WsMX_,#Krl9M mn 0uYPgN锝2%gEjP@<8:MP},31 pV(ފJk%E P)N8ۨ@][ISv~ ޸Y0 ~<-?/9Xq??h!G `9 kL5})zF7JT ]޼ ~tUh}h.p6"U;IA+mJ97& +a=%:$Uk{#Ծ(/V_? -J}Q%_ɿ  Q?J:NU`l'g)Mi%+p䃍B!2~FuY g֚a|ןJ1ӊnG4ieWbVs@c P*Q- OlC x hM"!Wk X3lT)<{w6js^Y"ָCث6U!+400 ^ z7`Ż4 ܼ.rx8]!َCc=~[o/_fV~oOU?_O?+ڕW/:?E[ؒ4{5Ø4JXE.k3Eρ5SY5>BI:?m!u-x~LEJog0.H@uj>+?6xb_e8tOi|?}Y^FﯧKes/{R!*՟,`U̡)6! ]X`4S^ufm'o?^q"a__[ "_ׯYw_?}1H ʂE~vfDgzP{eϢIaׯw1͠J:hZY&xVNt#z?MR+٪lT{Xsna<`"AN{[ЮW@F YHsVb3h7uzU\7 |yo\cw ɍSg&8c 4SrGD82!Hӛ7!u8nDy ʠ P}cON?p{` 6H;&V.iPsĺػ1jtԙl%i،J,ogS߼< ZFXB;4{VVI2c_Sbu0Ilu7sٔT:ޜ3GIi@䢜U6>ݣu@م&W$~{`d{!EξsWXewXT>1vy8,Jz?ϴ1)?Q&=u, GN=ea"!TُEP){#7[-hJAVq/7<>vV}iKy%cy'r8⒥ 2aVy ztS~X\kYc6^i6]j,܇n"B,X*>lٖ3(4ΈQ12&M l΋R8լ@=+ƥ(ܨi@X.'`H^KVT`_Pb' ;c8?z/͢`فT?1bӭ/cR=V`)=cJ 3 Ե*ˡS (74(Fug TԵ ަ^[6)9,v)Ed"St*tD\ʥujm`gEt}*Ai#T ve6Z_ ~>cOB1,*ژ# ¶i-Q'iX S6,nEPXYplϕ\_{nq7'W/mK :,"TMAf8'q="ݺ2m3)wF-GjѶi W$In82p'8_Ơ{ d[2hV=m&]mw\=Yْ\h%efIENDB`muon-v0.4.0/subprojects/meson-docs/docs/markdown/Wrapdb-projects.md0000644000175000017500000000126114737503617024430 0ustar buildbuild# Meson WrapDB packages This is a list of projects that have either an upstream Meson build system, or a port maintained by the Meson team. [They can be used by your project to provide its dependencies](Wrap-dependency-system-manual.md). Use the command line `meson wrap install ` to install the wrap file of any of those projects into your project's `subprojects/` directory. See [Meson command line documentation](Using-wraptool.md). If you wish to add your own project into this list, please submit your wrap file in a [Pull Request](https://github.com/mesonbuild/wrapdb). See [Meson documentation](Adding-new-projects-to-wrapdb.md) for more details. {{ wrapdb-table.md }} muon-v0.4.0/subprojects/meson-docs/docs/markdown/Native-environments.md0000644000175000017500000000341614737503617025341 0ustar buildbuild--- short-description: Setting up native compilation ... # Persistent native environments New in 0.49.0 Meson has [cross files for describing cross compilation environments](Cross-compilation.md), for describing native environments it has equivalent "native files". Natives describe the *build machine*, and can be used to override properties of non-cross builds, as well as properties that are marked as "native" in a cross build. There are a couple of reasons you might want to use a native file to keep a persistent environment: * To build with a non-default native tool chain (such as clang instead of gcc) * To use a non-default version of another binary, such as yacc, or llvm-config ## Using a native file During the `setup` phase, use the native file as such: ```sh meson setup --native-file my-native-file.ini builddir/ ``` ## Changing native file settings All of the rules about cross files and changed settings apply to native files as well, see [here](Cross-compilation.md#changing-cross-file-settings) ## Defining the environment See the [config-files section](Machine-files.md), for options shared by cross and native files. ## Native file locations Like cross files, native files may be installed to user or system wide locations, defined as: - $XDG_DATA_DIRS/meson/native (/usr/local/share/meson/native:/usr/share/meson/native if $XDG_DATA_DIRS is undefined) - $XDG_DATA_HOME/meson/native ($HOME/.local/share/meson/native if $XDG_DATA_HOME is undefined) The order of locations tried is as follows: - A file relative to the local dir - The user local location - The system wide locations in order These files are not intended to be shipped by distributions, unless they are specifically for distribution packaging, they are mainly intended for developers. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Quick-guide.md0000644000175000017500000001216714737503617023540 0ustar buildbuild--- title: Quickstart Guide short-description: Getting Started using Mesonbuild ... # Using Meson Meson has been designed to be as simple to use as possible. This page outlines the initial steps needed for installation, troubleshooting, and standard use. For more advanced configuration please refer to the command line help `meson --help` or the Meson documentation located at the [Mesonbuild](https://mesonbuild.com) website. Table of Contents: * [Requirements](#requirements) * [Installation using package manager](#installation-using-package-manager) * [Installation using Python](#installation-using-python) * [Installation from source](#installation-from-source) * [Troubleshooting](#troubleshooting) * [Compiling a Meson project](#compiling-a-meson-project) * [Using Meson as a distro packager](#using-meson-as-a-distro-packager) Requirements -- * [Python 3](https://python.org) * [Ninja](https://github.com/ninja-build/ninja/) *Ninja is only needed if you use the Ninja backend. Meson can also generate native VS and Xcode project files.* Installation using package manager -- Ubuntu: ```console $ sudo apt-get install python3 python3-pip python3-setuptools \ python3-wheel ninja-build ``` *Due to our frequent release cycle and development speed, distro packaged software may quickly become outdated.* Installation using Python -- Requirements: **pip3** The best way to receive the most up-to-date version of Mesonbuild. Install as a local user (recommended): ```console $ pip3 install --user meson ``` Install as root: ```console # pip3 install meson ``` *If you are unsure whether to install as root or a local user, install as a local user.* Installation from source -- Requirements: **git** Meson can be run directly from the cloned git repository. ```console $ git clone https://github.com/mesonbuild/meson.git /path/to/sourcedir ``` Troubleshooting: -- Common Issues: ```console $ meson setup builddir $ bash: /usr/bin/meson: No such file or directory ``` **Description**: The default installation prefix for the python pip module installation might not be included in your shell environment `PATH`. The default install location varies depending on your OS, distro and Python version. **Resolution**: This issue can be resolved by altering the default shell environment `PATH` to include the path where Pip installed the binaries. This can be, e.g. ``/usr/local/bin`` or `/home//.local/bin`. **Note**: There are other ways of fixing this issue such as using symlinks or copying the binaries to a default path and these methods are not recommended or supported as they may break package management interoperability. Compiling a Meson project -- The most common use case of Meson is compiling code on a code base you are working on. The steps to take are very simple. ```console $ cd /path/to/source/root $ meson setup builddir && cd builddir $ meson compile $ meson test ``` The only thing to note is that you need to create a separate build directory. Meson will not allow you to build source code inside your source tree. All build artifacts are stored in the build directory. This allows you to have multiple build trees with different configurations at the same time. This way generated files are not added into revision control by accident. To recompile after code changes, just type `meson compile`. The build command is always the same. You can do arbitrary changes to source code and build system files and Meson will detect those and will do the right thing. If you want to build optimized binaries, just use the argument `--buildtype=debugoptimized` when running Meson. It is recommended that you keep one build directory for unoptimized builds and one for optimized ones. To compile any given configuration, just go into the corresponding build directory and run `meson compile`. Meson will automatically add compiler flags to enable debug information and compiler warnings (i.e. `-g` and `-Wall`). This means the user does not have to deal with them and can instead focus on coding. Using Meson as a distro packager -- Distro packagers usually want total control on the build flags used. Meson supports this use case natively. The commands needed to build and install Meson projects are the following. ```console $ cd /path/to/source/root $ meson --prefix /usr --buildtype=plain builddir -Dc_args=... -Dcpp_args=... -Dc_link_args=... -Dcpp_link_args=... $ meson compile -C builddir $ meson test -C builddir $ DESTDIR=/path/to/staging/root meson install -C builddir ``` The command line switch `--buildtype=plain` tells Meson not to add its own flags to the command line. This gives the packager total control on used flags. This is very similar to other build systems. The only difference is that the `DESTDIR` variable is passed as an environment variable rather than as an argument to `meson install`. As distro builds happen always from scratch, you might consider enabling [unity builds](Unity-builds.md) on your packages because they are faster and produce better code. However there are many projects that do not build with unity builds enabled so the decision to use unity builds must be done by the packager on a case by case basis. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Performance-comparison.md0000644000175000017500000000033014737503617025767 0ustar buildbuild# Performance comparison This page lists experiments comparing build performance between Meson and other build systems. - [Simple comparison](Simple-comparison.md) - [ARM performance test](ARM-performance-test.md) muon-v0.4.0/subprojects/meson-docs/docs/markdown/Release-notes-for-0.47.0.md0000644000175000017500000002507514737503617025411 0ustar buildbuild--- title: Release 0.47 short-description: Release notes for 0.47 ... # New features ## Allow early return from a script Added the function `subdir_done()`. Its invocation exits the current script at the point of invocation. All previously invoked build targets and commands are build/executed. All following ones are ignored. If the current script was invoked via `subdir()` the parent script continues normally. ## Concatenate string literals returned from `get_define()` After obtaining the value of a preprocessor symbol consecutive string literals are merged into a single string literal. For example a preprocessor symbol's value `"ab" "cd"` is returned as `"abcd"`. ## ARM compiler(version 6) for C and CPP Cross-compilation is now supported for ARM targets using ARM compiler version 6 - ARMCLANG. The required ARMCLANG compiler options for building a shareable library are not included in the current Meson implementation for ARMCLANG support, so it cannot build shareable libraries. This current Meson implementation for ARMCLANG support can not build assembly files with arm syntax (we need to use armasm instead of ARMCLANG for the `.s` files with this syntax) and only supports GNU syntax. The default extension of the executable output is `.axf`. The environment path should be set properly for the ARM compiler executables. The `--target`, `-mcpu` options with the appropriate values should be mentioned in the cross file as shown in the snippet below. ```ini [properties] c_args = ['--target=arm-arm-none-eabi', '-mcpu=cortex-m0plus'] cpp_args = ['--target=arm-arm-none-eabi', '-mcpu=cortex-m0plus'] ``` Note: - The current changes are tested on Windows only. - PIC support is not enabled by default for ARM, if users want to use it, they need to add the required arguments explicitly from cross-file(`c_args`/`cpp_args`) or some other way. ## New base build option for LLVM (Apple) bitcode support When building with clang on macOS, you can now build your static and shared binaries with embedded bitcode by enabling the `b_bitcode` [base option](Builtin-options.md#base-options) by passing `-Db_bitcode=true` to Meson. This is better than passing the options manually in the environment since Meson will automatically disable conflicting options such as `b_asneeded`, and will disable bitcode support on targets that don't support it such as `shared_module()`. Since this requires support in the linker, it is currently only enabled when using Apple ld. In the future it can be extended to clang on other platforms too. ## New compiler check: `check_header()` The existing compiler check `has_header()` only checks if the header exists, either with the `__has_include` C++11 builtin, or by running the pre-processor. However, sometimes the header you are looking for is unusable on some platforms or with some compilers in a way that is only detectable at compile-time. For such cases, you should use `check_header()` which will include the header and run a full compile. Note that `has_header()` is much faster than `check_header()`, so it should be used whenever possible. ## New action `copy:` for `configure_file()` In addition to the existing actions `configuration:` and `command:`, [[configure_file]] now accepts a keyword argument `copy:` which specifies a new action to copy the file specified with the `input:` keyword argument to a file in the build directory with the name specified with the `output:` keyword argument. These three keyword arguments are, as before, mutually exclusive. You can only do one action at a time. ## New keyword argument `encoding:` for `configure_file()` Add a new keyword to [[configure_file]] that allows the developer to specify the input and output file encoding. The default value is the same as before: UTF-8. In the past, Meson would not handle non-UTF-8/ASCII files correctly, and in the worst case would try to coerce it to UTF-8 and mangle the data. UTF-8 is the standard encoding now, but sometimes it is necessary to process files that use a different encoding. For additional details see [#3135](https://github.com/mesonbuild/meson/pull/3135). ## New keyword argument `output_format:` for `configure_file()` When called without an input file, `configure_file` generates a C header file by default. A keyword argument was added to allow specifying the output format, for example for use with nasm or yasm: ```meson conf = configuration_data() conf.set('FOO', 1) configure_file('config.asm', configuration: conf, output_format: 'nasm') ``` ## Substitutions in `custom_target(depfile:)` The `depfile` keyword argument to `custom_target` now accepts the `@BASENAME@` and `@PLAINNAME@` substitutions. ## Deprecated `build_always:` for custom targets Setting `build_always` to `true` for a custom target not only marks the target to be always considered out of date, but also adds it to the set of default targets. This option is therefore deprecated and the new option `build_always_stale` is introduced. `build_always_stale` *only* marks the target to be always considered out of date, but does not add it to the set of default targets. The old behaviour can be achieved by combining `build_always_stale` with `build_by_default`. The documentation has been updated accordingly. ## New built-in object type: dictionary Meson dictionaries use a syntax similar to python's dictionaries, but have a narrower scope: they are immutable, keys can only be string literals, and initializing a dictionary with duplicate keys causes a fatal error. Example usage: ```meson d = {'foo': 42, 'bar': 'baz'} foo = d.get('foo') foobar = d.get('foobar', 'fallback-value') foreach key, value : d Do something with key and value endforeach ``` ## Array options treat `-Dopt=` and `-Dopt=[]` as equivalent Prior to this change passing -Dopt= to an array opt would be interpreted as `['']` (an array with an empty string), now `-Dopt=` is the same as `-Dopt=[]`, an empty list. ## Feature detection based on `meson_version:` in `project()` Meson will now print a `WARNING:` message during configuration if you use a function or a keyword argument that was added in a Meson version that's newer than the version specified inside `project()`. For example: ```meson project('featurenew', meson_version: '>=0.43') cdata = configuration_data() cdata.set('FOO', 'bar') message(cdata.get_unquoted('FOO')) ``` This will output: ``` The Meson build system Version: 0.47.0.dev1 Source dir: C:\path\to\srctree Build dir: C:\path\to\buildtree Build type: native build Project name: featurenew Project version: undefined Build machine cpu family: x86_64 Build machine cpu: x86_64 WARNING: Project targeting '>=0.43' but tried to use feature introduced in '0.44.0': configuration_data.get_unquoted() Message: bar Build targets in project: 0 WARNING: Project specifies a minimum meson_version '>=0.43' which conflicts with: * 0.44.0: {'configuration_data.get_unquoted()'} ``` ## New type of build option for features A new type of [option called `feature`](Build-options.md#features) can be defined in `meson_options.txt` for the traditional `enabled / disabled / auto` tristate. The value of this option can be passed to the `required` keyword argument of functions `dependency()`, `find_library()`, `find_program()` and `add_languages()`. A new global option `auto_features` has been added to override the value of all `auto` features. It is intended to be used by packagers to have full control on which feature must be enabled or disabled. ## New options to `gnome.gdbus_codegen()` You can now pass additional arguments to gdbus-codegen using the `extra_args` keyword. This is the same for the other gnome function calls. Meson now automatically adds autocleanup support to the generated code. This can be modified by setting the autocleanup keyword. For example: ```meson sources += gnome.gdbus_codegen('com.mesonbuild.Test', 'com.mesonbuild.Test.xml', autocleanup : 'none', extra_args : ['--pragma-once']) ``` ## Made 'install' a top level Meson command You can now run `meson install` in your build directory and it will do the install. It has several command line options you can toggle the behaviour that is not in the default `ninja install` invocation. This is similar to how `meson test` already works. For example, to install only the files that have changed, you can do: ```console $ meson install --only-changed ``` ## `install_mode:` keyword argument extended to all installable targets It is now possible to pass an `install_mode` argument to all installable targets, such as `executable()`, libraries, headers, man pages and custom/generated targets. The `install_mode` argument can be used to specify the file mode in symbolic format and optionally the owner/uid and group/gid for the installed files. ## New built-in option `install_umask` with a default value 022 This umask is used to define the default permissions of files and directories created in the install tree. Files will preserve their executable mode, but the exact permissions will obey the `install_umask`. The `install_umask` can be overridden in the Meson command-line: ```console $ meson --install-umask=027 builddir/ ``` A project can also override the default in the `project()` call: ```meson project('myproject', 'c', default_options : ['install_umask=027']) ``` To disable the `install_umask`, set it to `preserve`, in which case permissions are copied from the files in their origin. ## Octal and binary string literals Octal and binary integer literals can now be used in build and option files. ```meson int_493 = 0o755 int_1365 = 0b10101010101 ``` ## New keyword arguments: 'check' and 'capture' for `run_command()` If `check:` is `true`, then the configuration will fail if the command returns a non-zero exit status. The default value is `false` for compatibility reasons. `run_command()` used to always capture the output and stored it for use in build files. However, sometimes the stdout is in a binary format which is meant to be discarded. For that case, you can now set the `capture:` keyword argument to `false`. ## Windows resource files dependencies The `compile_resources()` function of the `windows` module now takes the `depend_files:` and `depends:` keywords. When using binutils's `windres`, dependencies on files `#include`'d by the preprocessor are now automatically tracked. ## Polkit support for privileged installation When running `install`, if installation fails with a permission error and `pkexec` is available, Meson will attempt to use it to spawn a permission dialog for privileged installation and retry the installation. If `pkexec` is not available, the old behaviour is retained and you will need to explicitly run the install step with `sudo`. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Reference-tables.md0000644000175000017500000004574614737503617024550 0ustar buildbuild# Reference tables ## Compiler ids These are return values of the `get_id` (Compiler family) and `get_argument_syntax` (Argument syntax) method in a compiler object. | Value | Compiler family | Argument syntax | | ----- | --------------- | --------------- | | arm | ARM compiler | | | armclang | ARMCLANG compiler | | | ccomp | The CompCert formally-verified C compiler | | | ccrx | Renesas RX Family C/C++ compiler | | | clang | The Clang compiler | gcc | | clang-cl | The Clang compiler (MSVC compatible driver) | msvc | | dmd | D lang reference compiler | | | emscripten| Emscripten WASM compiler | | | flang | Flang Fortran compiler | | | g95 | The G95 Fortran compiler | | | gcc | The GNU Compiler Collection | gcc | | intel | Intel compiler (Linux and Mac) | gcc | | intel-cl | Intel compiler (Windows) | msvc | | intel-llvm | Intel oneAPI LLVM-based compiler | | | intel-llvm-cl | Intel oneAPI LLVM-based compiler (Windows) | msvc | | lcc | Elbrus C/C++/Fortran Compiler | | | llvm | LLVM-based compiler (Swift, D) | | | mono | Xamarin C# compiler | | | mwccarm | Metrowerks C/C++ compiler for Embedded ARM | | | mwcceppc | Metrowerks C/C++ compiler for Embedded PowerPC | | | msvc | Microsoft Visual Studio | msvc | | nagfor | The NAG Fortran compiler | | | nvidia_hpc| NVidia HPC SDK compilers | | | nvcc | NVidia CUDA compiler | | | open64 | The Open64 Fortran Compiler | | | pathscale | The Pathscale Fortran compiler | | | pgi | Portland PGI C/C++/Fortran compilers | | | rustc | Rust compiler | | | sun | Sun Fortran compiler | | | c2000 | Texas Instruments C/C++ Compiler (C2000) | | | c6000 | Texas Instruments C/C++ Compiler (C6000) | | | ti | Texas Instruments C/C++ Compiler | | | valac | Vala compiler | | | xc16 | Microchip XC16 C compiler | | | cython | The Cython compiler | | | nasm | The NASM compiler (Since 0.64.0) | | | yasm | The YASM compiler (Since 0.64.0) | | | ml | Microsoft Macro Assembler for x86 and x86_64 (Since 0.64.0) | msvc | | armasm | Microsoft Macro Assembler for ARM and AARCH64 (Since 0.64.0) | | | mwasmarm | Metrowerks Assembler for Embedded ARM | | | mwasmeppc | Metrowerks Assembler for Embedded PowerPC | | ## Linker ids These are return values of the `get_linker_id` method in a compiler object. | Value | Linker family | | ----- | --------------- | | ld.bfd | The GNU linker | | ld.gold | The GNU gold linker | | ld.lld | The LLVM linker, with the GNU interface | | ld.mold | The fast MOLD linker | | ld.solaris | Solaris and illumos | | ld.wasm | emscripten's wasm-ld linker | | ld64 | Apple ld64 | | ld64.lld | The LLVM linker, with the ld64 interface | | link | MSVC linker | | lld-link | The LLVM linker, with the MSVC interface | | xilink | Used with Intel-cl only, MSVC like | | optlink | optlink (used with DMD) | | rlink | The Renesas linker, used with CCrx only | | xc16-ar | The Microchip linker, used with XC16 only | | ar2000 | The Texas Instruments linker, used with C2000 only | | ti-ar | The Texas Instruments linker | | ar6000 | The Texas Instruments linker, used with C6000 only | | armlink | The ARM linker (arm and armclang compilers) | | pgi | Portland/Nvidia PGI | | nvlink | Nvidia Linker used with cuda | | ccomp | CompCert used as the linker driver | | mwldarm | The Metrowerks Linker with the ARM interface, used with mwccarm only | | mwldeppc | The Metrowerks Linker with the PowerPC interface, used with mwcceppc only | For languages that don't have separate dynamic linkers such as C# and Java, the `get_linker_id` will return the compiler name. ## Script environment variables | Value | Comment | | ----- | ------- | | MESONINTROSPECT | Command to run to run the introspection command, may be of the form `python /path/to/meson introspect`, user is responsible for splitting the path if necessary. | | MESONREWRITE | Command to run to run the rewriting command, only set when running `dist` scripts | | MESON_BUILD_ROOT | Absolute path to the build dir | | MESON_DIST_ROOT | Points to the root of the staging directory, only set when running `dist` scripts | | MESON_SOURCE_ROOT | Absolute path to the source dir | | MESON_SUBDIR | Current subdirectory, only set for `run_command` | ## CPU families These are returned by the `cpu_family` method of `build_machine`, `host_machine` and `target_machine`. For cross compilation they are set in the cross file. | Value | Comment | | ----- | ------- | | aarch64 | 64 bit ARM processor | | alpha | DEC Alpha processor | | arc | 32 bit ARC processor | | arm | 32 bit ARM processor | | avr | Atmel AVR processor | | c2000 | 32 bit C2000 processor | | c6000 | 32 bit C6000 processor | | csky | 32 bit CSky processor | | dspic | 16 bit Microchip dsPIC | | e2k | MCST Elbrus processor | | ft32 | 32 bit Bridgetek MCU | | ia64 | Itanium processor | | loongarch64 | 64 bit Loongson processor| | m68k | Motorola 68000 processor | | microblaze | MicroBlaze processor | | mips | 32 bit MIPS processor | | mips64 | 64 bit MIPS processor | | msp430 | 16 bit MSP430 processor | | parisc | HP PA-RISC processor | | pic24 | 16 bit Microchip PIC24 | | ppc | 32 bit PPC processors | | ppc64 | 64 bit PPC processors | | riscv32 | 32 bit RISC-V Open ISA | | riscv64 | 64 bit RISC-V Open ISA | | rl78 | Renesas RL78 | | rx | Renesas RX 32 bit MCU | | s390 | IBM zSystem s390 | | s390x | IBM zSystem s390x | | sh4 | SuperH SH-4 | | sparc | 32 bit SPARC | | sparc64 | SPARC v9 processor | | sw_64 | 64 bit sunway processor | | wasm32 | 32 bit Webassembly | | wasm64 | 64 bit Webassembly | | x86 | 32 bit x86 processor | | x86_64 | 64 bit x86 processor | Any cpu family not listed in the above list is not guaranteed to remain stable in future releases. Those porting from autotools should note that Meson does not add endianness to the name of the cpu_family. For example, autotools will call little endian PPC64 "ppc64le", Meson will not, you must also check the `.endian()` value of the machine for this information. ## Operating system names These are provided by the `.system()` method call. | Value | Comment | | ----- | ------- | | android | By convention only, subject to change | | cygwin | The Cygwin environment for Windows | | darwin | Either OSX or iOS | | dragonfly | DragonFly BSD | | emscripten | Emscripten's JavaScript environment | | freebsd | FreeBSD and its derivatives | | gnu | GNU Hurd | | haiku | | | linux | | | netbsd | | | openbsd | | | windows | Any version of Windows | | sunos | illumos and Solaris | Any string not listed above is not guaranteed to remain stable in future releases. ## Kernel names (since 1.2.0) Native names as returned by the `.kernel()` method. | Value | Comment | | ----- | ------- | | linux | | | freebsd | | | openbsd | | | netbsd | | | nt | | | xnu | Kernel of various Apple OSes | | illumos | Kernel derived from OpenSolaris by community efforts | | solaris | Kernel derived from OpenSolaris by Oracle | | dragonfly | | | haiku| | | none | For e.g. bare metal embedded | ## Subsystem names (since 1.2.0) A more specific description of the system in question. Most values are meant to be used in cross files only, as those platforms can not run Meson natively. | Value | Comment | | ----- | ------- | | macos | Apple macOS (formerly OSX) | | ios | Apple iOS | | ios-simulator | | | tvos | Apple tvOS | | tvos-simulator | | | watchos | Apple watchOS | | watchos-simulator | | ## Language arguments parameter names These are the parameter names for passing language specific arguments to your build target. | Language | compiler name | linker name | | ------------- | ------------- | ----------------- | | C | c_args | c_link_args | | C++ | cpp_args | cpp_link_args | | C# | cs_args | cs_link_args | | CUDA | cuda_args | cuda_link_args | | D | d_args | d_link_args | | Fortran | fortran_args | fortran_link_args | | Java | java_args | java_link_args | | Objective C | objc_args | objc_link_args | | Objective C++ | objcpp_args | objcpp_link_args | | Rust | rust_args | rust_link_args | | Vala | vala_args | vala_link_args | | Cython | cython_args | cython_link_args | | NASM | nasm_args | N/A | | MASM | masm_args | N/A | All these `_*` options are specified per machine. See in [specifying options per machine](Builtin-options.md#Specifying-options-per-machine) for on how to do this in cross builds. ## Compiler and linker flag environment variables These environment variables will be used to modify the compiler and linker flags. It is recommended that you **do not use these**. They are provided purely to for backwards compatibility with other build systems. There are many caveats to their use, especially when rebuilding the project. It is **highly** recommended that you use [the command line arguments](#language-arguments-parameter-names) instead. | Name | Comment | | ----- | ------- | | CFLAGS | Flags for the C compiler | | CXXFLAGS | Flags for the C++ compiler | | CUFLAGS | Flags for the CUDA compiler | | OBJCFLAGS | Flags for the Objective C compiler | | FFLAGS | Flags for the Fortran compiler | | DFLAGS | Flags for the D compiler | | VALAFLAGS | Flags for the Vala compiler | | RUSTFLAGS | Flags for the Rust compiler | | CYTHONFLAGS | Flags for the Cython compiler | | LDFLAGS | The linker flags, used for all languages | N.B. these settings are specified per machine, and so the environment variables actually come in pairs. See the [environment variables per machine](#Environment-variables-per-machine) section for details. ## Function Attributes These are the parameters names that are supported using `compiler.has_function_attribute()` or `compiler.get_supported_function_attributes()` ### GCC `__attribute__` These values are supported using the GCC style `__attribute__` annotations, which are supported by GCC, Clang, and other compilers. | Name | |-----------------------------| | alias | | aligned | | alloc_size | | always_inline | | artificial | | cold | | const | | constructor | | constructor_priority | | deprecated | | destructor | | error | | externally_visible | | fallthrough | | flatten | | format | | format_arg | | force_align_arg_pointer³ | | gnu_inline | | hot | | ifunc | | malloc | | noclone | | noinline | | nonnull | | noreturn | | nothrow | | null_terminated_string_arg⁷ | | optimize | | packed | | pure | | retain⁴ | | returns_nonnull | | section⁵ | | sentinel⁵ | | unused | | used | | vector_size⁶ | | visibility* | | visibility:default† | | visibility:hidden† | | visibility:internal† | | visibility:protected† | | warning | | warn_unused_result | | weak | | weakref | \* *Changed in 0.52.0* the "visibility" target no longer includes "protected", which is not present in Apple's clang. † *New in 0.52.0* These split visibility attributes are preferred to the plain "visibility" as they provide narrower checks. ³ *New in 0.55.0* ⁴ *New in 0.62.0* ⁵ *New in 0.63.0* ⁶ *New in 1.1.0* ⁷ *New in 1.5.0* ### MSVC __declspec These values are supported using the MSVC style `__declspec` annotation, which are supported by MSVC, GCC, Clang, and other compilers. | Name | |----------------------| | dllexport | | dllimport | ## Dependency lookup methods These are the values that can be passed to `dependency` function's `method` keyword argument. | Name | Comment | | ----- | ------- | | auto | Automatic method selection | | pkg-config | Use Pkg-Config | | cmake | Look up as a CMake module | | config-tool | Use a custom dep tool such as `cups-config` | | system | System provided (e.g. OpenGL) | | extraframework | A macOS/iOS framework | ## Compiler and Linker selection variables N.B. these settings are specified per machine, and so the environment variables actually come in pairs. See the [environment variables per machine](#Environment-variables-per-machine) section for details. | Language | Compiler | Linker | Note | |---------------|----------|-----------|---------------------------------------------| | C | CC | CC_LD | | | C++ | CXX | CXX_LD | | | D | DC | DC_LD | Before 0.54 D_LD* | | Fortran | FC | FC_LD | Before 0.54 F_LD* | | Objective-C | OBJC | OBJC_LD | | | Objective-C++ | OBJCXX | OBJCXX_LD | Before 0.54 OBJCPP_LD* | | Rust | RUSTC | RUSTC_LD | Before 0.54 RUST_LD* | | Vala | VALAC | | Use CC_LD. Vala transpiles to C | | C# | CSC | CSC | The linker is the compiler | | Cython | CYTHON | | | | nasm | NASM | | Uses the C linker | *The old environment variables are still supported, but are deprecated and will be removed in a future version of Meson. *changed in 1.3.0* Paths with spaces were split unconditionally to extract components such as the [path to Ccache](Feature-autodetection.md#ccache), intrinsic compiler flags like `-m32` or `--target`, etc. This broke passing a hardcoded compiler path to CMake subprojects. To work around this, paths must be wrapped with double quotes: ```bash export CC='"C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.34.31933/bin/Hostx64/x64/cl.exe"' ``` You can also set the values through [machine files](Machine-files.md#binaries). *New in 1.3.0* Paths that point to an existing executable no longer need wrapping: ```bash export CC='C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Tools/MSVC/14.34.31933/bin/Hostx64/x64/cl.exe' ``` ## Environment variables per machine Since *0.54.0*, Following Autotool and other legacy build systems, environment variables that affect machine-specific settings come in pairs: for every bare environment variable `FOO`, there is a suffixed `FOO_FOR_BUILD`, where `FOO` just affects the host machine configuration, while `FOO_FOR_BUILD` just affects the build machine configuration. For example: - `PKG_CONFIG_PATH_FOR_BUILD` controls the paths pkg-config will search for just `native: true` dependencies (build machine). - `PKG_CONFIG_PATH` controls the paths pkg-config will search for just `native: false` dependencies (host machine). This mirrors the `build.` prefix used for (built-in) Meson options, which has the same meaning. This is useful for cross builds. In the native builds, build = host, and the unsuffixed environment variables alone will suffice. Prior to *0.54.0*, there was no `_FOR_BUILD`-suffixed variables, and most environment variables only effected native machine configurations, though this wasn't consistent (e.g. `PKG_CONFIG_PATH` still affected cross builds). muon-v0.4.0/subprojects/meson-docs/docs/markdown/Release-notes-for-0.37.0.md0000644000175000017500000001317614737503617025407 0ustar buildbuild--- title: Release 0.37 short-description: Release notes for 0.37 ... # New features ## Mesontest Mesontest is a new testing tool that allows you to run your tests in many different ways. As an example you can run tests multiple times: mesontest --repeat=1000 a_test or with an arbitrary wrapper executable: mesontest --wrap='valgrind --tool=helgrind' a_test or under `gdb`, 1000 times in a row. This is handy for tests that fail spuriously, as when the crash happens you are given the full GDB command line: mesontest --repeat=1000 --gdb a_test ## Mesonrewriter Mesonrewriter is an experimental tool to manipulate your build definitions programmatically. It is not installed by default yet but those interested can run it from the source repository. As an example, here is how you would add a source file to a build target: mesonrewriter add --target=program --filename=new_source.c ## Shared modules The new `shared_module` function allows the creation of shared modules, that is, extension modules such as plugins that are meant to be used solely with `dlopen` rather than linking them to targets. ## Gnome module - Detect required programs and print useful errors if missing ### gtkdoc - Allow passing a list of directories to `src_dir` keyword argument - Add `namespace` keyword argument - Add `mode` keyword argument - Fix `gtkdoc-scangobj` finding local libraries ### compile_resources - Add `gresource_bundle` keyword argument to output `.gresource` files - Add `export` and `install_header` keyword arguments - Use depfile support available in GLib >= 2.52.0 ## i18n module - Add `merge_file()` function for creating translated files - Add `preset` keyword argument to included common gettext flags - Read languages from `LINGUAS` file ## LLVM IR compilation Meson has long had support for compiling assembler (GAS) files. In this release we add support for compiling LLVM IR files in a similar way when building with the Clang compiler. Just add it to the list of files when creating a `library` or `executable` target like any other source file. No special handling is required: ```meson executable('some-exe', 'main.c', 'asm-file.S', 'ir-file.ll') ``` As always, you can also mix LLVM IR files with C++, C, and Assembly (GAS) sources. ## ViM indent and syntax files We now include filetype, indent, and syntax files for ViM [with the source tree](https://github.com/mesonbuild/meson/tree/master/data/syntax-highlighting/vim). Please file issues (or pull requests!) for enhancements or if you face any problems using them. ## Push URLs in .wrap files [.wrap files](Using-the-WrapDB.md) for subprojects can now include a separate push URL to allow developers to push changes directly from a subproject git checkout. ## pkg-config dependencies Meson now supports multiple version restrictions while searching for pkg-config dependencies. ```meson # Just want a lower limit dependency('zlib', version : '>1.2.1') # Want both a lower and an upper limit dependency('opencv', version : ['>=2.3.0', '<=3.1.0']) # Want to exclude one specific broken version dependency('foolite', version : ['>=3.12.1', '!=3.13.99']) ``` ## Overriding more binaries with environment variables You can now specify the binary to be used for the following tools by setting the corresponding environment variable | Name | Environment variable | | ---- | -------------------- | | pkg-config | PKG_CONFIG | | readelf | READELF | | nm | NM | ## Support for `localstatedir` Similar to other options such as `bindir` and `datadir`, you can now specify the `localstatedir` for a project by passing `--localstatedir=dir` to `meson` or `-Dlocalstatedir=dir` to `mesonconf` after configuration. You can also access it from inside the `meson.build` file with `get_option('localstatedir')`. ## New compiler function `symbols_have_underscore_prefix` Checks if the compiler prefixes an underscore to C global symbols with the default calling convention. This is useful when linking to compiled assembly code, or other code that does not have its C symbol mangling handled transparently by the compiler. ```meson cc = meson.get_compiler('c') conf = configuration_data() if cc.symbols_have_underscore_prefix() conf.set('SYMBOLS_HAVE_UNDERSCORE', true) endif ``` C symbol mangling is platform and architecture dependent, and a helper function is needed to detect it. For example, Windows 32-bit prefixes underscore, but 64-bit does not. Linux does not prefix an underscore but OS X does. ## Vala GLib Resources compiled with [`gnome.compile_resources`](Gnome-module.md#compile_resources) that are added to the sources of a Vala build target will now cause the appropriate `--gresources` flag to be passed to the Vala compiler so you don't need to add that yourself to `vala_args:`. ## Improvements to install scripts You can now pass arguments to install scripts added with [[meson.add_install_script]]. All arguments after the script name will be passed to the script. The `MESON_INSTALL_DESTDIR_PREFIX` environment variable is now set when install scripts are called. This contains the values of the `DESTDIR` environment variable and the `prefix` option passed to Meson joined together. This is useful because both those are usually absolute paths, and joining absolute paths in a cross-platform way is tricky. [`os.path.join` in Python](https://docs.python.org/3/library/os.path.html#os.path.join) will discard all previous path segments when it encounters an absolute path, and simply concatenating them will not work on Windows where absolute paths begin with the drive letter. ## More install directories Added new options `sbindir` and `infodir` that can be used for installation. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Threads.md0000644000175000017500000000060714737503617022757 0ustar buildbuild--- short-description: Enabling thread support ... # Threads Meson has a very simple notational shorthand for enabling thread support on your build targets. First you obtain the thread dependency object like this: ```meson thread_dep = dependency('threads') ``` And then you just use it in a target like this: ```meson executable('threadedprogram', ... dependencies : thread_dep) ``` muon-v0.4.0/subprojects/meson-docs/docs/markdown/Cython.md0000644000175000017500000000261714737503617022634 0ustar buildbuild--- title: Cython short-description: Support for Cython in Meson ... # Cython Meson provides native support for cython programs starting with version 0.59.0. This means that you can include it as a normal language, and create targets like any other supported language: ```meson lib = static_library( 'foo', 'foo.pyx', ) ``` Generally Cython is most useful when combined with the python module's extension_module method: ```meson project('my project', 'cython') py = import('python').find_installation() dep_py = py.dependency() py.extension_module( 'foo', 'foo.pyx', dependencies : dep_py, ) ``` ## C++ intermediate support *(New in 0.60.0)* An option has been added to control this, called `cython_language`. This can be either `'c'` or `'cpp'`. For those coming from setuptools/distutils, they will find two things. First, meson ignores `# distutils: language = c++` inline directives. Second that Meson allows options only on a per-target granularity. This means that if you need to mix cython files being transpiled to C and to C++ you need two targets: ```meson project('my project', 'cython') cython_cpp_lib = static_library( 'helper_lib', 'foo_cpp.pyx', # will be transpiled to C++ override_options : ['cython_language=cpp'], ) py.extension_module( 'foo', 'foo.pyx', # will be transpiled to C link_with : [cython_cpp_lib], dependencies : dep_py, ) ``` muon-v0.4.0/subprojects/meson-docs/docs/markdown/Java.md0000644000175000017500000000146714737503617022253 0ustar buildbuild--- title: Java short-description: Compiling Java programs ... # Compiling Java applications Meson has experimental support for compiling Java programs. The basic syntax consists of only one function and would be used like this: ```meson project('javaprog', 'java') myjar = jar('mything', 'com/example/Prog.java', main_class : 'com.example.Prog') test('javatest', myjar) ``` However note that Meson places limitations on how you lay out your code. * all Java files for a jar must be under the subdirectory the jar definition is in * all Java files must be in paths specified by their package, e.g. a class called `com.example.Something` must be in a Java file situated at `com/example/Something.java`. * Meson only deals with jar files, you cannot poke individual class files (unless you do so manually) muon-v0.4.0/subprojects/meson-docs/docs/markdown/Release-notes-for-0.59.0.md0000644000175000017500000001636214737503617025413 0ustar buildbuild--- title: Release 0.59.0 short-description: Release notes for 0.59.0 ... # New features ## Unescaped variables in pkgconfig files Spaces in variable values are escaped with `\`, this is required in the case the value is a path that and is used in `cflags` or `libs` arguments. This was an undocumented behaviour that caused issues in the case the variable is a space separated list of items. For backward compatibility reasons this behaviour could not be changed, new keyword arguments have thus been added: `unescaped_variables` and `unescaped_uninstalled_variables`. ```meson pkg = import('pkgconfig') ... pkg.generate(lib, variables: { 'mypath': '/path/with spaces/are/escaped', }, unescaped_variables: { 'mylist': 'Hello World Is Not Escaped', }, ) ``` ## The custom_target() function now accepts a feed argument It is now possible to provide a `feed: true` argument to `custom_target()` to pipe the target's input file to the program's standard input. ## Separate functions for qt preprocess `qt.preprocess` is a large, complicated function that does a lot of things, a new set of `compile_*` functions have been provided as well. These are conceptually simpler, as they do a single thing. ## Cython as as first class language Meson now supports Cython as a first class language. This means you can write: ```meson project('my project', 'cython') py = import('python').find_installation() dep_py = py.dependency() py.extension_module( 'foo', 'foo.pyx', dependencies : dep_py, ) ``` And avoid the step through a generator that was previously required. ## Support for the Wine Resource Compiler Users can now choose `wrc` as the `windres` binary in their cross files and `windows.compile_resources` will handle it correctly. Together with `winegcc` patches in Wine 6.12 this enables basic support for compiling projects as a winelib by specifying `winegcc`/`wineg++` as the compiler and `wrc` as the resource compiler in a cross file. ## New `vs2012` and `vs2013` backend options Adds the ability to generate Visual Studio 2012 and 2013 projects. This is an extension to the existing Visual Studio 2010 projects so that it is no longer required to manually upgrade the generated Visual Studio 2010 projects. Generating Visual Studio 2010 projects has also been fixed since its developer command prompt does not provide a `%VisualStudioVersion%` envvar. ## Developer environment Expand the support for the `link_whole:` project option for pre-Visual Studio 2015 Update 2, where previously Visual Studio 2015 Update 2 or later was required for this, for the Ninja backend as well as the vs2010 (as well as the newly-added vs2012 and vs2013 backends). ## Fs Module now accepts files objects It is now possible to define a `files()` object and run most Fs module functions on the file, rather than passing a string and hoping it is in the same directory. ## Compiler argument checking for `get_supported_arguments` The compiler method `get_supported_arguments` now supports a new keyword argument named `checked` that can be set to one of `warn`, `require` or `off` (defaults to `off`) to enforce argument checks. ## New custom dependency for libintl Meson can now find the library needed for translating messages via gettext. This works both on systems where libc provides gettext, such as GNU or musl, and on systems where the gettext project's standalone intl support library is required, such as macOS. Rather than doing something such as: ``` intl_dep = dependency('', required: false) if cc.has_function('ngettext') intl_found = true else intl_dep = cc.find_library('intl', required: false) intl_found = intl_dep.found() endif if intl_found # build options that need gettext conf.set('ENABLE_NLS', 1) endif ``` one may simply use: ``` intl_dep = dependency('intl', required: false) if intl_dep.found() # build options that need gettext conf.set('ENABLE_NLS', 1) endif ``` ## Parallelized `meson subprojects` commands All `meson subprojects` commands are now run on each subproject in parallel by default. The number of processes can be controlled with `--num-processes` argument. This speeds up considerably IO-bound operations such as downloads and git fetch. ## Using Vala no longer requires C in the project languages Meson will now add C automatically. Since the use of C is an implementation detail of Vala, Meson shouldn't require users to add it. ## The `import()` function gains `required` and `disabler` arguments In addition, modules now have a `found()` method, like programs and dependencies. This allows them to be conditionally required, and used in most places that an object with a `found()` method can be. ## Objective C/C++ standard versions Objective C and C++ compilations will from now on use the language versions set in `c_std` and `cpp_std`, respectively. It is not possible to set the language version separately for Objective C and plain C. ## Qt.preprocess source arguments deprecated The `qt.preprocess` method currently has this signature: `qt.preprocess(name: str | None, *srcs: str)`, this is not a nice signature because it's confusing, and there's a `sources` keyword argument as well. Both of these pass sources through unmodified, this is a bit of a historical accident, and not the way that any other module works. These have been deprecated, so instead of: ```meson sources = qt.preprocess( name, list, of, sources, sources : [more, sources], ... # things to process, ) executable( 'foo', sources, ) ``` use ```meson processed = qt.preprocess( name, ... # thins to process ) executable( 'foo', 'list', 'of', 'sources', 'more', 'sources', processed, ) ``` ## New `build target` methods The [[@build_tgt]] object now supports the following two functions, to ensure feature compatibility with [[@external_program]] objects: - `found()`: Always returns `true`. This function is meant to make executables objects feature compatible with `external program` objects. This simplifies use-cases where an executable is used instead of an external program. - `path()`: **(deprecated)** does the exact same as `full_path()`. **NOTE:** This function is solely kept for compatibility with `external program` objects. It will be removed once the, also deprecated, corresponding `path()` function in the `external program` object is removed. ## Automatically set up Visual Studio environment When Meson is run on Windows it will automatically set up the environment to use Visual Studio if no other compiler toolchain can be detected. This means that you can run Meson commands from any command prompt or directly from any IDE. This sets up the 64 bit native environment. If you need any other, then you need to set it up manually as before. ## `gnome.compile_schemas()` sets `GSETTINGS_SCHEMA_DIR` into devenv When using `gnome.compile_schemas()` the location of the compiled schema is added to `GSETTINGS_SCHEMA_DIR` environment variable when using [`meson devenv`](Commands.md#devenv) command. ## `update_desktop_database` added to `gnome.post_install()` Applications that install a `.desktop` file containing a `MimeType` need to update the cache upon installation. Most applications do that using a custom script, but it can now be done by Meson directly. See [`gnome.post_install()`](Gnome-module.md#gnomepost_install). muon-v0.4.0/subprojects/meson-docs/docs/markdown/Reproducible-builds.md0000644000175000017500000000165714737503617025272 0ustar buildbuild# Reproducible builds A reproducible build means the following (as quoted from [the reproducible builds project site](https://reproducible-builds.org/)): > Reproducible builds are a set of software development practices that create a verifiable path from human readable source code to the binary code used by computers. Roughly what this means is that if two different people compile the project from source, their outputs are bitwise identical to each other. This allows people to verify that binaries downloadable from the net actually come from the corresponding sources and have not, for example, had malware added to them. Meson aims to support reproducible builds out of the box with zero additional work (assuming the rest of the build environment is set up for reproducibility). If you ever find a case where this is not happening, it is a bug. Please file an issue with as much information as possible and we'll get it fixed. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Release-notes-for-1.0.0.md0000644000175000017500000000562714737503617025320 0ustar buildbuild--- title: Release 1.0.0 short-description: Release notes for 1.0.0 ... # New features Meson 1.0.0 was released on 23 December 2022 ## Compiler check functions `prefix` kwargs accepts arrays The `prefix` kwarg that most compiler check functions support now accepts an array in addition to a string. The elements of the array will be concatenated separated by a newline. This makes it more readable to write checks that need multiple headers to be included: ```meson cc.check_header('GL/wglew.h', prefix : ['#include ', '#include ']) ``` instead of ```meson cc.check_header('GL/wglew.h', prefix : '#include \n#include ']) ``` ## Flags removed from cpp/objcpp warning level 1 `-Wnon-virtual-dtor` is no longer implied by `meson setup -Dwarning_level=1`. ## Developer environment improvements When cross compiling, the developer environment now sets all environment variables for the HOST machine. It now also sets `QEMU_LD_PREFIX` to the `sys_root` value from cross file if property is defined. That means that cross compiled executables can often be run transparently on the build machine, for example when cross compiling for aarch64 linux from x86_64 linux. A new argument `--workdir` has been added, by default it is set to build directory. For example, `meson devenv -C builddir --workdir .` can be used to remain in the current dir (often source dir) instead. `--dump` now prints shell commands like `FOO="/prepend/path:$FOO:/append/path"`, using the literal `$FOO` instead of current value of `FOO` from environment. This makes easier to evaluate those expressions in a different environment. ## Deprecate `java.generate_native_headers`, rename to `java.native_headers` The functions operate in the exact same way. The new name matches more with Meson function name styling. ## rust.bindgen accepts a dependency argument The `bindgen` method of the `rust` module now accepts a dependencies argument. Any include paths in these dependencies will be passed to the underlying call to `clang`, and the call to `bindgen` will correctly depend on any generated sources. ## String arguments to the rust.bindgen include_directories argument Most other cases of include_directories accept strings as well as `IncludeDirectory` objects, so lets do that here too for consistency. ## The Rust module is stable Mesa is using the rust module in production, so it's time to mark it as stable. ## `in` operator for strings `in` and `not in` operators now works on strings, in addition to arrays and dictionaries. ``` fs = import('fs') if 'something' in fs.read('somefile') # True endif ``` ## `warning-level=everything` option The new `everything` value for the built-in `warning_level` enables roughly all applicable compiler warnings. For clang and MSVC, this simply enables `-Weverything` or `/Wall`, respectively. For GCC, meson enables warnings approximately equivalent to `-Weverything` from clang. muon-v0.4.0/subprojects/meson-docs/docs/markdown/index.md0000644000175000017500000000425014737503617022472 0ustar buildbuild--- render-subpages: false ... # The Meson Build system ## Overview Meson is an open source build system meant to be both extremely fast, and, even more importantly, as user friendly as possible. The main design point of Meson is that every moment a developer spends writing or debugging build definitions is a second wasted. So is every second spent waiting for the build system to actually start compiling code. ## Features * multiplatform support for Linux, macOS, Windows, GCC, Clang, Visual Studio and others * supported languages include C, C++, D, Fortran, Java, Rust * build definitions in a very readable and user friendly non-Turing complete DSL * cross compilation for many operating systems as well as bare metal * optimized for extremely fast full and incremental builds without sacrificing correctness * built-in multiplatform dependency provider that works together with distro packages * fun! ## Quickstart for beginners Are you an absolute beginner when it comes to programming? No worries, read [this beginner guide](SimpleStart.md) to get started. ## Community The easiest way for most people to connect to other Meson developers is a web chat. The channel to use is `#mesonbuild` either via Matrix ([web interface](https://app.element.io/#/room/#mesonbuild:matrix.org)) or [OFTC IRC](https://www.oftc.net/). Other methods of communication include the [mailing list](https://groups.google.com/forum/#!forum/mesonbuild) (hosted by Google Groups) and the [Discussions](https://github.com/mesonbuild/meson/discussions) section of the Meson GitHub repository. ### [Projects using Meson](Users.md) Many projects are using Meson and they're a great resource for learning what to (and what not to!) do when converting existing projects to Meson. [A short list of Meson users can be found here](Users.md) but there are many more. We would love to hear about your success stories too and how things could be improved too! ## Development All development on Meson is done on the [GitHub project](https://github.com/mesonbuild/meson). Instructions for contributing can be found on the [contribution page](Contributing.md). You do not need to sign a CLA to contribute to Meson. muon-v0.4.0/subprojects/meson-docs/docs/markdown/External-Project-module.md0000644000175000017500000001344114737503617026036 0ustar buildbuild# External Project module **Note**: the functionality of this module is governed by [Meson's rules on mixing build systems](Mixing-build-systems.md). *This is an experimental module, API could change.* This module allows building code that uses build systems other than Meson. This module is intended to be used to build Autotools subprojects as fallback if the dependency couldn't be found on the system (e.g. too old distro version). The project will be compiled out-of-tree inside Meson's build directory. The project will also be installed inside Meson's build directory using make's [`DESTDIR`](https://www.gnu.org/prep/standards/html_node/DESTDIR.html) feature. During project installation step, that DESTDIR will be copied verbatim into the desired location. External subprojects can use libraries built by Meson (main project, or other subprojects) using pkg-config, thanks to `*-uninstalled.pc` files generated by [`pkg.generate()`](Pkgconfig-module.md). External build system requirements: - Must support out-of-tree build. The configure script will be invoked with the current workdir inside Meson's build directory and not subproject's top source directory. - Configure script must generate a `Makefile` in the current workdir. - Configure script must take common directories like prefix, libdir, etc, as command line arguments. - Configure script must support common environment variable like CFLAGS, CC, etc. - Compilation step must detect when a reconfigure is needed, and do it transparently. Known limitations: - Executables from external projects cannot be used uninstalled, because they would need its libraries to be installed in the final location. This is why there is no `find_program()` method. - The configure script must generate a `Makefile`, other build systems are not yet supported. - When cross compiling, if `PKG_CONFIG_SYSROOT_DIR` is set in environment or `sys_root` in the cross file properties, the external subproject will not be able to find dependencies built by Meson using pkg-config. The reason is pkg-config and pkgconf both prepend the sysroot path to `-I` and `-L` arguments from `-uninstalled.pc` files. This is arguably a bug that could be fixed in future version of pkg-config/pkgconf. *Added 0.56.0* ## Functions ### `add_project()` This function should be called at the root directory of a project using another build system. Usually in a `meson.build` file placed in the top directory of a subproject, but could be also in any subdir. Its first positional argument is the name of the configure script to be executed (e.g. `configure`), that file must be in the current directory and executable. Note that if a bootstrap script is required (e.g. `autogen.sh` when building from git instead of tarball), it can be done using `run_command()` before calling `add_project()` method. *Since 0.60.0* If the first positional argument is `'waf'`, special treatment is done for the [waf](https://waf.io/) build system. The waf executable must be found either in the current directory, or in system `PATH`. Keyword arguments: - `configure_options`: An array of strings to be passed as arguments to the configure script. Some special tags will be replaced by Meson before passing them to the configure script: `@PREFIX@`, `@LIBDIR@` and `@INCLUDEDIR@`. Note that `libdir` and `includedir` paths are relative to `prefix` in Meson but some configure scripts requires absolute path, in that case they can be passed as `'--libdir=@PREFIX@/@LIBDIR@'`. *Since 0.57.0* default arguments are added in case some tags are not found in `configure_options`: `'--prefix=@PREFIX@'`, `'--libdir=@PREFIX@/@LIBDIR@'`, and `'--includedir=@PREFIX@/@INCLUDEDIR@'`. It was previously considered a fatal error to not specify them. - `cross_configure_options`: Extra options appended to `configure_options` only when cross compiling. special tag `@HOST@` will be replaced by `'{}-{}-{}'.format(host_machine.cpu_family(), build_machine.system(), host_machine.system()`. If omitted it defaults to `['--host=@HOST@']`. - `verbose`: If set to `true` the output of sub-commands ran to configure, build and install the project will be printed onto Meson's stdout. - `env` : environment variables to set, such as `['NAME1=value1', 'NAME2=value2']`, a dictionary, or an [[@env]] object. - `depends` : *Since 0.63.0* Specifies that this project depends on the specified target(s) that must be built before running `make` to build this external project. This should be used for example when the external project links to a Meson `library()` that the `configure` script will find using the `-uninstalled.pc` pkg-config file generated by Meson. Returns an [`ExternalProject`](#ExternalProject_object) object ## `ExternalProject` object ### Methods #### `dependency(libname)` Return a dependency object that can be used to build targets against a library from the external project. Keyword arguments: - `subdir` path relative to `includedir` to be added to the header search path. ## Example `meson.build` file for a subproject ```meson project('My Autotools Project', 'c', meson_version : '>=0.56.0', ) mod = import('unstable-external_project') p = mod.add_project('configure', configure_options : ['--prefix=@PREFIX@', '--libdir=@LIBDIR@', '--incdir=@INCLUDEDIR@', '--enable-foo', ], ) mylib_dep = p.dependency('mylib') meson.override_dependency('mylib', mylib_dep) ``` ## Using wrap file Most of the time the project will be built as a subproject, and fetched using a `.wrap` file. In that case the simple `meson.build` file needed to build the subproject can be provided by adding `patch_directory=mysubproject` line in the wrap file, and place the build definition file at `subprojects/packagefiles/mysubproject/meson.build`. muon-v0.4.0/subprojects/meson-docs/docs/markdown/Builtin-options.md0000644000175000017500000006534114737503617024472 0ustar buildbuild--- short-description: Built-in options to configure project properties ... # Built-in options Meson provides two kinds of options: [build options provided by the build files](Build-options.md) and built-in options that are either universal options, base options, compiler options. ## Universal options All these can be set by passing `-Doption=value` to `meson` (aka `meson setup`), or by setting them inside `default_options` of [[project]] in your `meson.build`. Some options can also be set by `--option=value`, or `--option value` -- a list is shown by running `meson setup --help`. For legacy reasons `--warnlevel` is the cli argument for the `warning_level` option. They can also be edited after setup using `meson configure -Doption=value`. Installation options are usually relative to the prefix but it should not be relied on, since they can be absolute paths in the following cases: * When the prefix is `/usr`: `sysconfdir` defaults to `/etc`, `localstatedir` defaults to `/var`, and `sharedstatedir` defaults to `/var/lib` * When the prefix is `/usr/local`: `localstatedir` defaults to `/var/local`, and `sharedstatedir` defaults to `/var/local/lib` * When an absolute path outside of prefix is provided by the user/distributor. ### Directories | Option | Default value | Description | | ------ | ------------- | ----------- | | prefix | see below | Installation prefix | | bindir | bin | Executable directory | | datadir | share | Data file directory | | includedir | include | Header file directory | | infodir | share/info | Info page directory | | libdir | see below | Library directory | | licensedir | see below | Licenses directory (since 1.1.0)| | libexecdir | libexec | Library executable directory | | localedir | share/locale | Locale data directory | | localstatedir | var | Localstate data directory | | mandir | share/man | Manual page directory | | sbindir | sbin | System executable directory | | sharedstatedir | com | Architecture-independent data directory | | sysconfdir | etc | Sysconf data directory | `prefix` defaults to `C:/` on Windows, and `/usr/local` otherwise. You should always override this value. `libdir` is automatically detected based on your platform, it should be correct when doing "native" (build machine == host machine) compilation. For cross compiles Meson will try to guess the correct libdir, but it may not be accurate, especially on Linux where different distributions have different defaults. Using a [cross file](Cross-compilation.md#defining-the-environment), particularly the paths section may be necessary. `licensedir` is empty by default. If set, it defines the default location to install a dependency manifest and project licenses. For more details, see [[meson.install_dependency_manifest]]. ### Core options Options that are labeled "per machine" in the table are set per machine. See the [specifying options per machine](#specifying-options-per-machine) section for details. | Option | Default value | Description | Is per machine | Is per subproject | | -------------------------------------- | ------------- | ----------- | -------------- | ----------------- | | auto_features {enabled, disabled, auto} | auto | Override value of all 'auto' features | no | no | | backend {ninja, vs,
    vs2010, vs2012, vs2013, vs2015, vs2017, vs2019, vs2022, xcode, none} | ninja | Backend to use | no | no | | genvslite {vs2022} | vs2022 | Setup multi-builtype ninja build directories and Visual Studio solution | no | no | | buildtype {plain, debug,
    debugoptimized, release, minsize, custom} | debug | Build type to use | no | no | | debug | true | Enable debug symbols and other information | no | no | | default_library {shared, static, both} | shared | Default library type | no | yes | | errorlogs | true | Whether to print the logs from failing tests. | no | no | | install_umask {preserve, 0000-0777} | 022 | Default umask to apply on permissions of installed files | no | no | | layout {mirror,flat} | mirror | Build directory layout | no | no | | optimization {plain, 0, g, 1, 2, 3, s} | 0 | Optimization level | no | no | | pkg_config_path {OS separated path} | '' | Additional paths for pkg-config to search before builtin paths | yes | no | | prefer_static | false | Whether to try static linking before shared linking | no | no | | cmake_prefix_path | [] | Additional prefixes for cmake to search before builtin paths | yes | no | | stdsplit | true | Split stdout and stderr in test logs | no | no | | strip | false | Strip targets on install | no | no | | unity {on, off, subprojects} | off | Unity build | no | no | | unity_size {>=2} | 4 | Unity file block size | no | no | | warning_level {0, 1, 2, 3, everything} | 1 | Set the warning level. From 0 = compiler default to everything = highest | no | yes | | werror | false | Treat warnings as errors | no | yes | | wrap_mode {default, nofallback,
    nodownload, forcefallback, nopromote} | default | Wrap mode to use | no | no | | force_fallback_for | [] | Force fallback for those dependencies | no | no | | vsenv | false | Activate Visual Studio environment | no | no | #### Details for `backend` Several build file formats are supported as command runners to build the configured project. Meson prefers ninja by default, but platform-specific backends are also available for better IDE integration with native tooling: Visual Studio for Windows, and xcode for macOS. It is also possible to configure with no backend at all, which is an error if you have targets to build, but for projects that need configuration + testing + installation allows for a lighter automated build pipeline. #### Details for `genvslite` Setup multiple buildtype-suffixed, ninja-backend build directories (e.g. [builddir]_[debug/release/etc.]) and generate [builddir]_vs containing a Visual Studio solution with multiple configurations that invoke a meson compile of the setup build directories, as appropriate for the current configuration (builtype). This has the effect of a simple setup macro of multiple 'meson setup ...' invocations with a set of different buildtype values. E.g. `meson setup ... --genvslite vs2022 somebuilddir` does the following - ``` meson setup ... --backend ninja --buildtype debug somebuilddir_debug meson setup ... --backend ninja --buildtype debugoptimized somebuilddir_debugoptimized meson setup ... --backend ninja --buildtype release somebuilddir_release ``` and additionally creates another 'somebuilddir_vs' directory that contains a generated multi-configuration visual studio solution and project(s) that are set to build/compile with the somebuilddir_[...] that's appropriate for the solution's selected buildtype configuration. #### Details for `buildtype`
    For setting optimization levels and toggling debug, you can either set the `buildtype` option, or you can set the `optimization` and `debug` options which give finer control over the same. Whichever you decide to use, the other will be deduced from it. For example, `-Dbuildtype=debugoptimized` is the same as `-Ddebug=true -Doptimization=2` and vice-versa. This table documents the two-way mapping: | buildtype | debug | optimization | | --------- | ----- | ------------ | | plain | false | plain | | debug | true | 0 | | debugoptimized | true | 2 | | release | false | 3 | | minsize | true | s | All other combinations of `debug` and `optimization` set `buildtype` to `'custom'`. #### Details for `warning_level` Exact flags per warning level is compiler specific, but there is an approximative table for most common compilers. | Warning level | GCC/Clang | MSVC | | ------------- | --- | ---- | | 0 | | | | 1 | -Wall | /W2 | | 2 | -Wall -Wextra | /W3 | | 3 | -Wall -Wextra -Wpedantic | /W4 | | everything | -Weverything | /Wall | Clang's `-Weverything` is emulated on GCC by passing all known warning flags. #### Details for `vsenv` The `--vsenv` argument is supported since `0.60.0`, `-Dvsenv=true` syntax is supported since `1.1.0`. Since `0.59.0`, meson automatically activates a Visual Studio environment on Windows for all its subcommands, but only if no other compilers (e.g. `gcc` or `clang`) are found, and silently continues if Visual Studio activation fails. Setting the `vsenv` option to `true` forces Visual Studio activation even when other compilers are found. It also make Meson abort with an error message when activation fails. `vsenv` is `true` by default when using the `vs` backend. ## Base options These are set in the same way as universal options, either by `-Doption=value`, or by setting them inside `default_options` of [[project]] in your `meson.build`. However, they cannot be shown in the output of `meson setup --help` because they depend on both the current platform and the compiler that will be selected. The only way to see them is to setup a builddir and then run `meson configure` on it with no options. The following options are available. Note that they may not be available on all platforms or with all compilers: | Option | Default value | Possible values | Description | |---------------------|----------------------|---------------------------------------------------------------|--------------------------------------------------------------------------------| | b_asneeded | true | true, false | Use -Wl,--as-needed when linking | | b_bitcode | false | true, false | Embed Apple bitcode, see below | | b_colorout | always | auto, always, never | Use colored output | | b_coverage | false | true, false | Enable coverage tracking | | b_lundef | true | true, false | Don't allow undefined symbols when linking | | b_lto | false | true, false | Use link time optimization | | b_lto_threads | 0 | Any integer* | Use multiple threads for lto. *(Added in 0.57.0)* | | b_lto_mode | default | default, thin | Select between lto modes, thin and default. *(Added in 0.57.0)* | | b_thinlto_cache | false | true, false | Enable LLVM's ThinLTO cache for faster incremental builds. *(Added in 0.64.0)* | | b_thinlto_cache_dir | (Internal build dir) | true, false | Specify where to store ThinLTO cache objects. *(Added in 0.64.0)* | | b_ndebug | false | true, false, if-release | Disable asserts | | b_pch | true | true, false | Use precompiled headers | | b_pgo | off | off, generate, use | Use profile guided optimization | | b_sanitize | none | see below | Code sanitizer to use | | b_staticpic | true | true, false | Build static libraries as position independent | | b_pie | false | true, false | Build position-independent executables (since 0.49.0) | | b_vscrt | from_buildtype | none, md, mdd, mt, mtd, from_buildtype, static_from_buildtype | VS runtime library to use (since 0.48.0) (static_from_buildtype since 0.56.0) | The value of `b_sanitize` can be one of: `none`, `address`, `thread`, `undefined`, `memory`, `leak`, `address,undefined`, but note that some compilers might not support all of them. For example Visual Studio only supports the address sanitizer. \* < 0 means disable, == 0 means automatic selection, > 0 sets a specific number to use LLVM supports `thin` lto, for more discussion see [LLVM's documentation](https://clang.llvm.org/docs/ThinLTO.html) The default value of `b_vscrt` is `from_buildtype`. The following table is used internally to pick the CRT compiler arguments for `from_buildtype` or `static_from_buildtype` *(since 0.56)* based on the value of the `buildtype` option: | buildtype | from_buildtype | static_from_buildtype | | -------- | -------------- | --------------------- | | debug | `/MDd` | `/MTd` | | debugoptimized | `/MD` | `/MT` | | release | `/MD` | `/MT` | | minsize | `/MD` | `/MT` | | custom | error! | error! | ### Notes about Apple Bitcode support `b_bitcode` will pass `-fembed-bitcode` while compiling and will pass `-Wl,-bitcode_bundle` while linking. These options are incompatible with `b_asneeded`, so that option will be silently disabled. [[shared_module]]s will not have bitcode embedded because `-Wl,-bitcode_bundle` is incompatible with both `-bundle` and `-Wl,-undefined,dynamic_lookup` which are necessary for shared modules to work. ## Compiler options Same caveats as base options above. The following options are available. They can be set by passing `-Doption=value` to `meson`. Note that both the options themselves and the possible values they can take will depend on the target platform or compiler being used: | Option | Default value | Possible values | Description | | ------ | ------------- | --------------- | ----------- | | c_args | | free-form comma-separated list | C compile arguments to use | | c_link_args | | free-form comma-separated list | C link arguments to use | | c_std | none | none, c89, c99, c11, c17, c18, c2x, c23, gnu89, gnu99, gnu11, gnu17, gnu18, gnu2x, gnu23 | C language standard to use | | c_winlibs | see below | free-form comma-separated list | Standard Windows libs to link against | | c_thread_count | 4 | integer value ≥ 0 | Number of threads to use with emcc when using threads | | cpp_args | | free-form comma-separated list | C++ compile arguments to use | | cpp_link_args | | free-form comma-separated list | C++ link arguments to use | | cpp_std | none | none, c++98, c++03, c++11, c++14, c++17, c++20
    c++2a, c++1z, gnu++03, gnu++11, gnu++14, gnu++17, gnu++1z,
    gnu++2a, gnu++20, vc++14, vc++17, vc++20, vc++latest | C++ language standard to use | | cpp_debugstl | false | true, false | C++ STL debug mode | | cpp_eh | default | none, default, a, s, sc | C++ exception handling type | | cpp_rtti | true | true, false | Whether to enable RTTI (runtime type identification) | | cpp_thread_count | 4 | integer value ≥ 0 | Number of threads to use with emcc when using threads | | cpp_winlibs | see below | free-form comma-separated list | Standard Windows libs to link against | | fortran_std | none | [none, legacy, f95, f2003, f2008, f2018] | Fortran language standard to use | | cuda_ccbindir | | filesystem path | CUDA non-default toolchain directory to use (-ccbin) *(Added in 0.57.1)* | The default values of `c_winlibs` and `cpp_winlibs` are in compiler-specific argument forms, but the libraries are: kernel32, user32, gdi32, winspool, shell32, ole32, oleaut32, uuid, comdlg32, advapi32. All these `_*` options are specified per machine. See below in the [specifying options per machine](#specifying-options-per-machine) section on how to do this in cross builds. When using MSVC, `cpp_eh=[value]` will result in `/EH[value]` being passed. The magic value `none` translates to `s-c-` to disable exceptions. *Since 0.51.0* `default` translates to `sc`. When using gcc-style compilers, nothing is passed (allowing exceptions to work), while `cpp_eh=none` passes `-fno-exceptions`. Since *0.54.0* The `_thread_count` option can be used to control the value passed to `-s PTHREAD_POOL_SIZE` when using emcc. No other c/c++ compiler supports this option. Since *0.63.0* all compiler options can be set per subproject, see [here](#specifying-options-per-subproject) for details on how the default value is inherited from the main project. This is useful, for example, when the main project requires C++11, but a subproject requires C++14. The `cpp_std` value from the subproject's `default_options` is now respected. Since *1.3.0* `c_std` and `cpp_std` options now accept a list of values. Projects that prefer GNU C, but can fallback to ISO C, can now set, for example, `default_options: 'c_std=gnu11,c11'`, and it will use `gnu11` when available, but fallback to c11 otherwise. It is an error only if none of the values are supported by the current compiler. Likewise, a project that can take benefit of `c++17` but can still build with `c++11` can set `default_options: 'cpp_std=c++17,c++11'`. This allows us to deprecate `gnuXX` values from the MSVC compiler. That means that `default_options: 'c_std=gnu11'` will now print a warning with MSVC but fallback to `c11`. No warning is printed if at least one of the values is valid, i.e. `default_options: 'c_std=gnu11,c11'`. In the future that deprecation warning will become an hard error because `c_std=gnu11` should mean GNU is required, for projects that cannot be built with MSVC for example. ## Specifying options per machine Since *0.51.0*, some options are specified per machine rather than globally for all machine configurations. Prefixing the option with `build.` only affects the build machine configuration, while leaving it unprefixed only affects the host machine configuration. For example: - `build.pkg_config_path` controls the paths pkg-config will search for `native: true` (build machine) dependencies. - `pkg_config_path` controls the paths pkg-config will search for `native: false` (host machine) dependencies. This is useful for cross builds. In native builds, the build and host machines are the same, and the unprefixed option alone will suffice. Prior to *0.51.0*, these options only affected native builds when specified on the command line as there was no `build.` prefix. Similarly named fields in the `[properties]` section of the cross file would affect cross compilers, but the code paths were fairly different, allowing differences in behavior to crop out. ## Specifying options per subproject Since *0.54.0* `default_library` and `werror` built-in options can be defined per subproject. This is useful, for example, when building shared libraries in the main project and statically linking a subproject, or when the main project must build with no warnings but some subprojects cannot. Most of the time, this would be used either in the parent project by setting subproject's default_options (e.g. `subproject('foo', default_options: 'default_library=static')`), or by the user through the command line: `-Dfoo:default_library=static`. The value is overridden in this order: - Value from parent project - Value from subproject's default_options if set - Value from subproject() default_options if set - Value from command line if set Since *0.56.0* `warning_level` can also be defined per subproject. ## Module options Some Meson modules have built-in options. They can be set by prefixing the option with the module's name: `-D.