pax_global_header00006660000000000000000000000064141566474740014534gustar00rootroot0000000000000052 comment=7f6f762ebd67e51f1c356fa045b19be2c0264997 revolt-master/000077500000000000000000000000001415664747400137045ustar00rootroot00000000000000revolt-master/.exrc000066400000000000000000000000231415664747400146410ustar00rootroot00000000000000set makeprg=flake8 revolt-master/.flake8000066400000000000000000000001561415664747400150610ustar00rootroot00000000000000; vim: set ft=cfg: [flake8] filename = *.py hang-closing = False max-line-length = 110 inline-quotes = double revolt-master/.gitignore000066400000000000000000000001131415664747400156670ustar00rootroot00000000000000gschemas.compiled org.perezdecastro.Revolt.gresource config.mk __pycache__ revolt-master/.travis.yml000066400000000000000000000002131415664747400160110ustar00rootroot00000000000000sudo: false language: python python: - 3.5 install: - pip install flake8 flake8-quotes script: - ln -s revolt revolt.py - flake8 . revolt-master/COPYING000066400000000000000000001045151415664747400147450ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . revolt-master/Makefile000066400000000000000000000015211415664747400153430ustar00rootroot00000000000000 APP_ID ?= org.perezdecastro.Revolt all: $(APP_ID).gresource config.mk: configure @echo '==== Running "configure" script...' @./configure @echo '==== Run "configure --help" for more options' -include config.mk RESOURCE_FILES := $(wildcard gtk/*.ui gtk/*.css icon/*.svg) $(APP_ID).gresource: $(APP_ID).gresources.xml $(RESOURCE_FILES) glib-compile-resources --target=$@ $< gschemas.compiled: $(APP_ID).gschema.xml glib-compile-schemas . run: $(APP_ID).gresource gschemas.compiled XDG_DATA_DIRS="$${XDG_DATA_DIRS}:$(CURDIR)" GSETTINGS_SCHEMA_DIR='$(CURDIR)' __REVOLT_DEVELOPMENT=1 '$(CURDIR)/bin/revolt' install: SKIP_ICON_CACHE_UPDATE=1 ./install.sh --prefix='$(PREFIX)' $(if $(DESTDIR),--destdir='$(DESTDIR)') python3 -m compileall $(if $(DESTDIR),-d '$(DESTDIR)') $(DESTDIR)$(PREFIX)/share/revolt/py/revolt/*.py .PHONY: install run revolt-master/README.md000066400000000000000000000116601415664747400151670ustar00rootroot00000000000000![Logo](https://github.com/aperezdc/revolt/blob/master/assets/revolt-logo.png) Revolt ====== Revolt is a small application which wraps [Element](https://element.io) to provide better integration with desktop environments in general, and [GNOME](http://www.gnome.org) in particular: * Having Element as a “standalone” application with its own window, launcher, icon, etc. instead of it living in a browser tab. * Persistent notifications (for desktop environments supporting them, i.e. GNOME). Notifications are automatically prevented when the Revolt window is focused. * Status icon for desktop environment which have a tray bar applet (XFCE, Budgie, likely many others). ![Status icon in Budgie](https://github.com/aperezdc/revolt/blob/master/assets/revolt-statusicon-screenshot.png) ![Application Window](https://github.com/aperezdc/revolt/blob/master/assets/revolt-screenshot.png) Installation ------------ The recommended installation method is to use [Flatpak](http://flatpak.org). Starting with version `0.6.13` using a single command is enough (if you want to intall in you user directory, add `--user` to the command): ```sh flatpak install --from https://flatpak.perezdecastro.org/revolt.flatpakref ``` If your Flatpak version is older than 0.6.13, use the following commands instead: ```sh wget https://flatpak.perezdecastro.org/revolt.flatpakref flatpak install --from revolt.flatpakref rm revolt.flatpakref ``` Once installed, updates will be installed automatically when using `flatpak update`. You can also download [the .flatpakref file](https://flatpak.perezdecastro.org/revolt.flatpakref) and double-click on it to have GNOME Software install the application. GNOME Software will also notify you of updates and give you the option to install them. ### Portal Helpers **IMPORTANT**: Many distributions *do not* install the XDG helper programs for the sandboxed applications, which are needed for some features to work. Please install them using your distribution's package manager: * Debian: [xdg-desktop-portal-gtk](https://packages.debian.org/search?keywords=xdg-desktop-portal-gtk). * Arch Linux: [xdg-desktop-portal-gtk](https://www.archlinux.org/packages/extra/x86_64/xdg-desktop-portal-gtk/). * Fedora: [xdg-desktop-portal-gtk](https://admin.fedoraproject.org/pkgdb/package/rpms/xdg-desktop-portal-gtk/). Some features, remarkably the desktop notifications, _will not work without the portal helpers_. ### GNOME Runtime Revolt uses the GNOME Flatpak runtime. Depending on the version of Flatpak installed on your system, you may need to install it manually. You can check whether the runtime is missing by trying to run Revolt in a terminal: ``` % flatpak run org.perezdecastro.Revolt error: runtime/org.gnome.Platform/x86_64/3.22 not installed % ``` If you need to install the runtime manually, you can do so by issuing the following command: ``` flatpak [--user] remote-add --from gnome https://sdk.gnome.org/gnome.flatpakrepo ``` If your Flatpak version is older than 0.6.13, use the following commands instead: ```sh wget https://sdk.gnome.org/keys/gnome-sdk.gpg flatpak [--user] remote-add --gpg-import=gnome-sdk.gpg gnome https://sdk.gnome.org/repo/ flatpak [--user] install gnome org.gnome.Platform 3.22 ``` Manual Installation ------------------- Install the files to their locations: ```sh sudo ./install.sh --prefix=/usr --log-file=install.log ``` (Specifying a log file is optional, but if you plan on [upgrading](#upgrading) later on using the `install.sh` script, it is recommended to use it.) Install the dependencies: ```sh sudo apt-get install python-gobject python3-gi libwebkit2gtk-4.0 ``` Now you should be able to launch Revolt from the GNOME Shell. ### Upgrading The `install.sh` script can be used to upgrade an existing installation as well. The recommended way is to save a log of installed files, so the upgrade process can remove stray files from the old version. In general, the preferred way of invoking the installation script is as follows: ```sh sudo ./install.sh --upgrade --prefix=/usr --log-file=/etc/revolt.files ``` This way a log of the installed files is recorded the first time that the installation is done, and further upgrades will use it to remove stray files from old versions. Also, the log file will be updated with every upgrade. Development ----------- Using `make run` executes Revolt in “development” mode: the needed resources are loaded from the source directory, instead of using the system-wide directories. Flatpak ------- A bundle can be created using the included [make-flatpak.sh](make-flatpak.sh) script. The script arranges calling `flatpak-builder` to build and create a repository into `.flatpak-repo`. You can create a bundle from the repository using: ```sh flatpak build-bundle .flatpak-repo/ Revolt.flatpak org.perezdecastro.Revolt ``` Once the bundle is created, you can install and run it with: ```sh flatpak install --user --bundle Revolt.flatpak flatpak run org.perezdecastro.Revolt ``` revolt-master/assets/000077500000000000000000000000001415664747400152065ustar00rootroot00000000000000revolt-master/assets/revolt-logo.png000066400000000000000000000177171415664747400202020ustar00rootroot00000000000000PNG  IHDR>aIDATx^peO %H"7AiRDAEPA`sg/W>}Q(*RK )z;d0gw=_aFaFaFaFaWeʣ*Ujml~TKY*/ܣrJw9!=G*:{Y|0N<T.U>SX(LAs;TnVI*-UTu 7 }8پ}L6M6m$HQQB#o B&:*aW[r?«V*ժUś 2D~iWiصDWn=~x={֭$&&޽{L5(T6 :cbbcddlqQF 뮻dԨQRfMرcr-˱c$++ː!r=)aDʉGSϥ.G{-O=L2E|Ai޼_/? NƲc9Gv_+~}ݒW2MƧ =O.%$$Hz>TWR>ԩrYg;/ .@y3 }:?q_͵=*`rWH;xP"8(F0'L`D$ + 2~\Ȇ{۳g8'80Aex͓HQusH>.UBs3A?p+F=pB ܡPi\iӦ67'O>)^{-׶(9y/Zs=<~P"6L-QTeKb x$RPs {ѣjkǺd%)3nzWsn@eI!Ɣ6*[OP"پ%Λ7/P,fvFa]0 wxkB(CP ?C2زǰI4L>} .\(mڴږe3ݺu+G)<;㄂ЂA߿  `:v +ͭz\)U vA7qDD,ע b2%" oۛY$k[DmàgYB~IX=z4 ( BBT$ěEOIj ;JiY[E<- Rb`۶m`C Σ R! G3uLg 2 4^ R(h;wfƻ=̟?_~'AA;-q*M?wpaU4P^)Z4mz r3':*@TW|_iooL(n~Khk P-:Jzhćh9`8%wGoW(=%bk[+\ȥ*.ZjWdʆ%/娿J eE3~F to~2UtJ7/%4H%Ɉ-T;\C7~jcɢ[W& U@FU[$''l_?!"<@zV|쾿-̛Aq34g'v BBx /)s? -=i$nb_H4};"#k)%{:rˠJgI(*6ICyܪA@׉EF.@\O͕ByOlܕ4$qawy]=2q,Vl22}7BU>kkM!RP\#2R U{X%>4mL:%.;yIQW7"ąTJ~ۛ!풩 Y1.~̐S:/S"P4 4Oз<)P%1%RAf4Z0~J@U5U$U5ǻeWg]&-)ϑl#Kȑ¢2i34]px`F()sh{>0jb FHj9\ #}@bo%#$ +(dQ -kwjx9#@;8{[`v{<͇bo%gL(+ \!|DJEjꈌw $2(Jl'p\X9kNo{g[=a8NlhCrJoOاRKO_~$mT#^.P #',Xw.)9yZ&H疵%X$ϔ}GrSfP3J%F7r?] Ҳ^&G㖏 S*',#W݇۫noܹ:+(,=^2 !'w| ÁzՕdҪAtQtiQxZ5}N9j:ynڽ͛s)N%nZ P> |7j+)=\n$<"J!(*,gfl7^VV,GGmn5$d<Ԏ5ll#S5bîteL[/a*@wPf0{PTe]PJD@YPK^ ^Rc^rҰq,QIqRfrJMdB M59sf=aٳ~38.9}h(zU Aс \&Xdp&7 #5)$O) rݭ7kDCbבEYheٙ2rex' _&?W8X}8"FDvU@4~>Z_FjȠ pM@p($axÈLZg36",gP  $CHHV09h~&I35^ATn2o5chLZC%3(د5FES!Azе,D&p*sv9Z & J g .Y{:O.Ǝg6&ACP9+ז`xN0\a|F UղNTpvpQ{eY2aݿ~?w-rG9^1?wIsp5L I J5 zп>#YSzs9H|^'&;bURq5fGZ?ߩ9/wWF&Ѱ8DW %-Cv`+`ZG_:K{9 ب5>$㪤:ȥˬ!_/@?UGZB[!:4'[nqmٛЊP{r;NIjSJR3#^TkOp&@E oensU%mYzP[;ܩ Wwt/n8gu)ENH]_&,O|YF_>gslwS[i&#"~VVydozh2(}kJqm rC;Ke[Op&""?` X]YU1KE뜆CO.Ty\| :"Y5)I`ss:V,5"՞ZtcؓJ#H8}GNp05 ޽W/Ab햑V 9RY+/'8ZհaIiw@ӸfOEMdkvm$PYX3eŠdfMdQLtWQ9szѼ5a]xFP 98y϶Pb (cN,/xJ#@Ҋi8p>< 0E|w,\"Re4FnBƘVڹ}kNQ_ׁ&H#߼NCJr* ̱OX#J8 j_8tlqKtr mts?Zb&ߣ j$o6Vy!";yMEķ XyI-1Q`с1ITr/)6~܄Ќ>]"iwPŶEdHВ{"lBдhڼ` ׬m֗]:80ԉʏ|W>EzQ1@9hDk"ۤ]zFIixO}Ŵ@e7 .,LgFQA;$,SfDs.}`hhrT818},Vod<$TSWȹ?17# MPaer{Y :'$D47#4s(1wg=68\X2Lyӷw J22h==8z! Ⱥo&@A1/ 0$-Z⽒%!u+~c 6 [Y$ \@ @ DGIENDB`revolt-master/assets/revolt-screenshot.png000066400000000000000000004511711415664747400214130ustar00rootroot00000000000000PNG  IHDRt}e"R@IDATx^yU՝>Vq* NHkTA3ƨ!N Av}#ȌQm74PqlN" EQ=껪Ve"|:[0=laDDDDDDD=v"""""""ư+r]s8`!""""""J7;Z%"""""""ZFDDD|1v$FC&3&""";xi*+2d3mG&%.h.E|lw:g|D!q!e%""'"""bcw%<ߧ&xtxQ2 qUO2]Yyf\ǰѓp16TXx_[n)p~@JQB0(eK=il.X 1ThhYB)a"- ZDz ĉ%b8 u9\pyXPvU""" """bHM<\a[BAC}.ܽa C!aKQ(9a ;86 %{x|ʉI.< vxz=|NQR7RW\# Vs8e4%;t7vTR "6\:y+BJ_N.*r)vQ"""l"""Дcc%θ߼ t?TuO$b]'lfā=ӏy7}@㿣&2,{1ssOXeic!w ZUֲQ.S̸~BЄch- bH=p"f?ɐ!H1Z#rq= 1@Zš;"""/- ʽ[Ii Ecʕ|;/r۸3Y[+`]Kx\G eqו]->X|emW"""bO>#թZL9H?ǯf/"_/9sxqF|rp-_/ˬ;䲉.~cܧkRsΜdR.`t60[cxiFRT'̽nl:Ge>?eʯn&CArc ݍȺ?Z9V,[9kXkkۓNDDD TW5y` ASbq|:WW` L߱4+*.m qD}c,T;ric Tܰ7Sԁ8`S}#)j+44HpxTw(< ?b{inn[oԑ#+H˝wɼsٕ?&~1CX5ik1Of˖pGXfϞU?)UUUz'KDD`adDDDqW_yV֭}=yDDDDDDD ^7 zȣnz.""""""R_~߸fG˘n=(ؘb)dg6!8N4Zk|DDDjkk7r\]]>Zs-k ៚Mk~(8KFv3W?wϐ$qضgcAӞmޟ MDDu]*YZ-^EDDtkI-Rr|0*"n;O5Z˶jvF!|xI8Z Z֖kbu>˵nlSܪ3tMZ ty&""bi.""bc$E߃oZR@ӗz~-{ͩI%\Wߣ_ꚥĔلRK̓zw' J"c,eD6G=XALB˸{#j۽tm/+OTǪI@P ޫ՝v%_i돵q58_W*+/we۽=("=l„ݔBH:a_ʺ~u=OڋF3츣h^=Ryc]Cӫ>M(^8`Si\Ъу7E*|s=;M3L:RBcyQ8XX}{.rpFV'c߃~B`a0~d}H,62>QvL*F_t#kp=Dq>{Yau10$Zo 1Y?!lZk; [0[fk()IJKi=x/ <ϧ&""~*;pIL\6zp 哳A $꒪d ^_=u} """ """b` KdpH( ߾?""" """"""" l"""""""~:gA!\DDDDDDZLDDDDDDDcO>KG^.ϴ=lVyRl\>}*=*93ӦN楕ut(IXɲxmo6s̤P&3}uD"""."ReLZ>2e 'n8Hy,|T:t &l7czKw[-s} zv>Mo>΄I:u OKG,]0ud,k ;NEpߤ>a"~0yW_x!BvQ<<DDQDX/E{8ۼ}O:6ӛah#7_<^^]Ue]/f/#[8Qˆ#IC*瞤=ԓ4NHo;CU3畏tU5Y8U:~r4v:Q"_;:nO\7F݇Rq<:ńVs~4Yl Gl~R6y* qwR,f'j+cl;ײs5n Cϭs Q)`|2;{۞,UTbŤ+iU91C{Sy~=;({%Gq'~[6gr("DM2d|gll#$$$FH(s؜fwBwwWY."~]Snױ 'L+~ $He--i aԨ5 CWӐ<߾;Q1+3BU!} >Æpo_?c\|(ϔ'!O?qFdЁ|&2Fߥq̜^ί~8W_~)G_̸ NgӁ\ɵtv$>\%r!K߇Ƀ9S?\e\ƽח"h?ݿqӵ2fn~|y-u6d@f+Ekޜ_sHHHBJ@HlqѰ? w8iZy>>dԍ['QW|ŧ$w/glIipM4:[8p6񑞞T :^u'&D^f Z1|(R'LrR/l}*}~h+jd28q#g[a+9ٙÖ-UºݕdffSSa8C !ߢ^f=?q u{=W_~x&Op0=l_^|28Io x=Sw?eubK\z=h 6$',`i:aݬ;oͼ._kY9Y?O=w% tlD\)H|ɉJ"`ZlY4MS;Yxr=Jm3Ɖz~Ui: 4MCl oHסC4YNcd_cp **#x/硟D.ï߹ #\; qp#g5xMA4eT0v)N) ܓBVo dTs`.NuO~* Iҟo0׍E8 $Se^\SzԴd \S1xѦOI,>"fђx T=#F}7cEC9ˇQ44, Xa?ve);_^5ϴs~^}2ILI 9!))'%RWcq(jh;۞rz3*8=G ÜM<|i/>|,yg'~]4ջ?C(!ttg%pHȢX{ _ʽ'f,  ǎ0 e\ ML jy0eSƺI[5 yS~F݀`x=C~5k\GPIכ _jy@1$0> nkpC;V7iJx|-o] #[$&ԟRύ2LcTzP6>9@U_;Wwg9LƏIc¹Pci۠E=N$J$rۮcE(,HJL<뇳vO=;0fB4Mft`vev[cBŽдĥi 4M3-/?;g<˯. /gHJJ"<,Ƶ7hU˷bJ8 IJm/L(ԛ.. L]& v\cشf=2qzr׆X~skWAG48Gޭkxg[̟?o'!!( QȤ[+ QvG(Mnz,|j-j:vQFP(TDHh0aPyx;(|r?a#@.WrOi>3'% DJIRbұb&'NiڀvqEj%?G:IMF6^kon$$qipM4DQ0LTWw?1 RR9}~ )xQ. %kY z*z"q\E-N"¢\`' ~]HO24̓䧼Ғb<1^ !Ai_4s(g$_Ƶ]aR%6|`zl:&weTE\u"٦ĥi'\4um:ɈOHNd`reWI!3 ? 0(,29[a^d*,?PdH&nܹ#AC%`aZ{ٳ+1U:q*wHV2_SSjOA=)]/YoQ|x= -MJJ4~\ӘM̒$z])A^ k犺S!|@uҸI~|9,2^R"!k,׮c+'Rh ."?~YƎM?ǨKCgWz S(vmO4=i@J(~x`*.^_~CSY #%iKCa hQKPadV&) *TGS#ǂM QixmaАAQ$ 78qQ#zK&p{aIJ:v*FQt yof| MEW 왎+%;o'zv T"bG8EI0$z$u# KVF&-iZȎPR*#dG|D߫ 1k:R{^c#F"r9C9?hi\O"O0GӖTu0´(^?:go'JK'7ϡ j:s[Rzr/YA,$;go(U+0<t@=c]x qI/5 <.-/jgw𜓄 S->>%vVx7o.=5?wޢ^1f^4|CljݽiWf,:BIW'u-soXa#Wxxsݔ֢#G '@P#йK7G4u(U] Dq !ZUVUGiDmKq8yo}o#Ŕc2yFxj}<;[ﰻVAik)`!ǡ8'BIPGv  ||1[ɉ|Yubƶ%awo2u~V{E<ˀ2IQ{C,?+ ]M׍1waՒX)6\MPG1 Jw!KშՉ,ϳ).(fD8[&<~v.oƾ;pL"+;r29{#05}$'A:45ר)X Tt6c1|XoxٟJ@,ˋ!#3⟨6{r E~{*Rx, 7&hykut> <Y6Go܉i"N2oI$TNر$B@Ա)RIi 4Ms"fobVg^->@ߏS0(S;,Nb޻S.bgq>l;J4jcG:ڍE|?pQ@DwFR}y4Ңb ,PҐ?i.]ܖs_s0 > τqG<^WQqc!`amnQT}esG~':ZA!\0ph;:xdEJDmlǭה¶T!bxMIIQ!co|dN"qlPN&g.zXED$$HbBJK۬Dj09 P\vOPImӭ]Z={vQG!E-.WjuC?AӴc,&:*n.CFU[MM4,|h`H\h[mȆ@ bϨrLA}\$͝Fl(gW^\;ʈk;gs 1X7RA 3g:ݼj,IMB F>XRKdxٸ=v+6th|ē]H7H;UW2L~$Q#o'><\ztMA뗼ÞDz ϰ9a ¸$e3letJ5i 36as@<,YD б E,r.Ja5?So7筅Eӯ5X`.G=\w-d8_ Lz/ChM*a"*nM${wE4k V>p$s qMrKFb L2çoƈTqc??߼ riN'⚦蚦i !h(3H1AQ>ҎЮz򧴗X?M$P*o,Wu>â‰p&\Bnrm|8D\%QrYov7;gϪu^*YrVcttMt='u$8^.n(t4xϕtJӥEa,&͉F1-iJC,^l(:N@A N"MSYI?σyYpb#&BPg_"Øӗ1h: 4M'K*]x#@B'"|Y)"م.獦i^PYsڌ0>?tAՙFYG_vJzxf aY ;Q~kEq"M7^w34=]4M6O*!bB0f%dw GCETF#/M4M+VZ<S[hOcrj=UK؍dp<^$NE9ۡ1?.{?J\ϏA Z !j!&|4f7Rl WBAJΗi==QSiISxMQ!9Q.Cs" >=>_no#RHW}6D 5®bp[Z fJ,ä8[8Z.EmazAEIN$4u0| )0m4PiGH$BI8HShi/fpG:|8RVXUovIKB KxX_tHMAW xɌƢ#x Bv v-2Lbt" Iu퇪Ϫub~fG11LI9[}VJ fNaE^> X~ lgav<¤908/;s^W˂s~m+X(CE Nc0dӧ/x"i W3L MPKbR$M4M$~sf\voɼkxz L 8`uxSH$m|&F.hj@Lz0h3+c%Aq$Ȋ=͉!vg@u @!!էP-AӌVW[Ѝpo LHlv.c  lk@m7s+u _tO&0!!wcyA|1Y3n T#js[/< R}{, k:!D7=,RPb#Du^N^yr#kb Ű&VH$Dx4M4xE!c{QZi7Uy> l t+G4KlF ['6ĜjK:`w)ckwrfTUplƜ 8fN tMp1z aNn9*fkYîݢ4͠_|W3 5UǕT!'ʤ쾔!NV!DJh$ZDJٶtm- %ش(SXr(ز罹ٰJarzrv)b?k!!Pb{,T&{KLhNuf 6oꏖXh=%'XpZ_F\لJ6lذb%3 n|ȇŻg*>Lc0oko8|&H"pWf['Å|H;vc C}.ZuAD bS/֏A/qb/<>xIjƠi- PґiHD JĩPqFekFibjRXi#1tF ẻoJbv*Qsx&_|97w;>)V>'ys,w̵wJvVZ<dUuU\d|_3IwK.fz a=YȰ+'1t8.WoGx \#aW\5ȍH&r+ܟiz(1}&pvcr$:-]d̂t=Dے8>UiD\'T_"ɚ[)t\(k)Ikٺ(c&Jmjh ŠWVfW[} ֹݿx;:Ϊ/#*{~i#~c>A;$JP7ASgNJ.o FC[ HMTBbPn.:Ҝb SID1R[# !gպ*7P۹R6+M3h!WJ=>be<f1 *nglu_8o0Ah3ו ]A 8y4 fc6f¼| CҺ"'AGQSp).ۓh8D$"Wę191TlF"(D۷z 9H!ǐ٩#f4c IXJR`Zgcf6݊mM0Ec45 qL +L'!Ǐ6@@-0d">8\ӋڪSȗT<ƱSֺ~gO@)&S&o$l%J, j_1ZT(#>7|fIxyQ+ekg/1~^$L KiU*ϣGr[~5vu/ƒ\֦ى{R~jjvC1!C xFT z\79=ALa|8(Vϯw=&p<1~8{P? c2{><^RU졶oN fBBu4Կy;%. IRSILN&!)=sQ+H|kd^@bפăe:؎.:H)1ACL@6 B`&W.d :I!HJdM{M/1RzpΜٵwJaډ*#'˝+2OZA$YtH$ى gTfc+(2٪Ε,ʯbgH[#j à1}4َK)sqaFcʄ=xB <$_2OdfhpqEjjװk(خ{^3K/p98PsdkKTycK ȏ5/;g/c >\6I xe!ijĠi- %joGɉ6v$˗= h0T‰4HL:uD.j!3=I +HMP\Pi[B%De.sF œ8YIH x1M vI+9Fjm4J&h˦i %%quI- $H$2(L& E;|g ~g9(|pp*aοYlsօ@ s[~mzMgPc%|oL0m˦Z?yT+ډ֟vU}9%n |(fz=6 WcغVd}Z0sj ~̶j] !gww|+.RB8dɂL6䓝'fތٜm:dXyaB%GwLs.R٩Ә2Pa9p7>+/>|NT||sfK_)SΚj-'~v̛4[ŠuOQ Pս{r̎V|f[tz?:e閔ӬgcH%f0,ߍ߰~z}t#C닸vzQ oXϛ7Ϫ2~رCD<#WK A'ƨ1hH5&ۗ̒]L.j)k{@,BN%DrYoFKJ&=w"HJ K6mRu W`x\lF1#uAFbWq6uq =v1'@cD|m؟t.2?Fػ~ތl,Sw8>ꢮ-F` CO=+1ݴm|I+RX}׶J6|xT`ɡ7}(ݯ֙ s?(T; A'īgJ{sz)ܵ\BevQ#Ӈ;k3`A?ޯ>5aW+kkWxĀP.oNƠya{t;YFi_NPcksH}wLck= jA?'KoprbnC @VVBqm\ن\vEs5Xצ#L:Ovdavrj߳W/[OZch70Fb>@Oq7h'*m"bzo#7?|/ɀ,ˋKq#N~z HVz_J~&NJx m?{=O# `k1y2qF+`љvbzƗR3Zo"/ ( J.ƞHfy c{q8BnaM`U^^> 7ֻ[C|I@Gybc4~QSꄜsQO p('ד*,RM68$JɢK \)$ Yhڿ<wqwKp@3I2*+Bx6ˏ<{~D2KjzuJqݘu㨶d%ZCvu Wާ 2_U풡G3tH ]y1u]YAyY9/fH,VD0Fwcx  i_ýצ+P9* .D]䎃ֻhB@ <̲|GO2$/@2ㄙ2RK rLΡڄ.(*FaRuMT҆}h:PD˸m]\@T`y*)N.{edqa@PKD%FZAcI)ϩśQpGP h4փʩצ)c 1jYGRrSaj 2Ʊ:t"cEOVe0F% #F*aZzn"l‰IFAd B{pc.}/^^W֌O =# ό*Ni.i!qxwee>fY M8 E݋˲r]ۡ?RIoHÅKjprUہO?mxgպ*W9ҍ58SqgTc%1hV`W^Cv*TBЎ0$ ~Ħ?][J<[';UI$-&)#(`ѱgOjnRBөw/>GƫזZGXJ/Y}~.j 1e)mt"DK?".\zI)ͣ``!2<$ԐRJ;#RmkxZߟ%rW8i32 AC I'D&A?>@S"擮C-o9Ѳ x%%$ތ.dsQ ?~Ie%%A@;:V^OoIFRzƧovO$_6>" HvA,Qi}r Ϟ1R_<("6HP +[]]prYt$72Na7 OPR 3Fq"h)Fp. \g&T P  !Emd0fҵU˪w^asŐNBč5v6;ִpٯ0e!n0fb#bU!8_^X^Y1mS&w{?Gv,x7ky{xi-3-M<FJY/O6H7-.i]XSpp6GJuV5!5?1wU[*Bs) RKp~jDJ( %0=mډͫfsH9rL[P${3u~!Fʾv̒Ox'vgvbo8WVԶ/ǍPԒGC4 u$犆Cص\zI+g0g1}ʣpKPO^vDr i%'shNƌ^ш`"Rk33jT_ĹFLȎ:u{r1c "Z% Lgә,_4vl[nd˻i=?oxBBZҥ2Z0e,] *%u$}Ĺ^۱ _l?]}&Ӛ<R灮r#BzOz}Pax bOiV1CS{Jʶl'cmU:T@4+MbIk4fRK%X>-?ҞL߳(=.[J]}d;)%ɌqSfAˤeKsH!  85k#~ޖ75^.;nL^G||4]hi _wvK)ILSn$tZ5$WZC|DӇD։!JRa[1d+{EoN Ui&|tݙO{0a$%dtu-]z#8<^|Մ[: ZJ-Jj?;4ݟgGǛ稑햾<z4ï[7+}#B*gXiuǠ$\4 EJ|ʐ{F m>+=` pxMA5W#bPӖ%2gIwxaY  : {4!,R%⮔>뇬몑`l K"U$@P m֬M+n MOG4 90Tӻ'7LGp;^uzi6 iy-/Kbf"_ڗpiZE4'oY`Q~sE$*&~7Ati: kUl=G j.#rzrkIJem<^pD:C;1|iiZı)=RJ5]q|&B%D঎#ӇVctiN##0aE,i_ i5R$QRN >Gɩ-|J${n'VlD͗]6ngK{,R| dNHMbZVeUu iN5MVD$1Eeֵ<{"NY5A¦0qďVڇI8O1 ߽e+Q-;)i3^d|^%R:\vo'>|<3e NGhHo3f`,^x}4躈~^䅻.ZN4MIi= VP EeU*Y_ ;,0G|k+!hl*>ő0hL3g/ Jl^<=>m:$u_}2vvL>yV9Ek1T݌YP~8^{*x]d;2m4N}wmF3ky~ s8phq?uqHrahi"4MyGwsrL^ʎ[ 3j9_Z.l;si(etN$$Rm\Ne%Ds_{uWo0k+55߫|Imm>ٚǝ|}ڇx趉 &`b8G(uumصM^]I荹$ Gf:|AԻ.hhWJ-'QSjhG5MlWruT֙ӡR.J2IԕL8jێ&+t}Y,+GL 7f%Wh(SIqrٻw/$='CvvHw(+"+JhA*IiEMTOv(+#;ֲ6l‰D8W>ikbB?GbP߾\MD N"x,mC&ܷrqg0F% #Fhq}*^_ Zĵ)#۳Za1D]3R4M'ᚦiRVi|dy\J-| yEx|9ulN61-x4$@X)-tB8'YâNJ৖i1# TFa8XYJ Ѕ@2,+,`iQ.˹e#k3ZA%Cp6WzHJ2-#(/)! R^V7 }dGIdS8n{}ċ/|Ms%1u VlZX'js6ǎbZuU/iv-"ZD$`P D, -j?M:N1ρ! BNT%Ο(4MOG4M4FJ8ـBask{^c~nׁZ.ΜƁW)S4&!# Aaƈ?_Dx=i,p|Vۑ\v ئ??;kvI5K{]t9RU%Vv0h&rGBjBnon{h?`̤kU"#+z'i/_Vva$ P((, -#g<`Ax򱼰j'#m)9gV) Owںׅ{qdrO"r$Zsx*✃AE 0hmMii%Xp&\L`Nlڮӫ) t h z%RDXxt9[+"wsߋjT)KJȘ@srs''3fcKE4W>x[/{Ƿ" ۙ=vN)"6*> dީm%DӎGslLX!\*CQ @z ̑AYcp^+FMS|Oޮ)ZNE)!sBp6u;U{ Pz~HaYYDOLRcdd˯d5C-L&̓S x_ RȊg{r.H2@]Wݍ7#E/ǍPԒGCo/ÕXF[W w0oGjWr;-xgTbZF_2 H@48%uư :GpM#[he7ttwhU$ZAJAoZN"(JP( RRC$&[Ҭ\lIz0i*m͡9mvf$^t]bC=,|g_>mohpꊯlpw5n'zEckۣvx9%T[4eA p/ªQ>mG[Q}={@:[Ve+l}VBeTbc8F:} -(f;Z,"#KaCk**z BK޾@_8A_!8FpԏQ-MNNʲ,_9 $d[Zk ~^^ꜘּ`JW7?}zpߑV/1W|^3-Ƕe|ϓy}n,&o-/?PڪZ쬶@*R2T@ ߩT^1ٶ] 0,S.hת2{[PZuMguGԤӁ=u"srB G (7~IK+kW-{t&;;h{HukE bP-ҭ; rBxccHFp03Z:?UWWs*pODfPy!j=Jp 81mKK/C(J LW_־8:3twU/Lw$_C^ugNj΍97vIx]߫yBck:ͨ'-U8|y;7tZZQB8~Ƶr-7_{CgK!|F'~5k÷M*ٜPgʫLrRZw_iڍY-I IJ65zsS軏өK"0Eu߾i"Hq1(fDDꮻn0꺻3$ AQArtCgfΌ`dd|y~:sEuUusx[Wv?|CϽo2 ;63쮻h׹qZTbdp( ͹sbzsd&f[xs1 B7n]i>}Ltm!CB!+&3;r% И9لF4e&M'33F#Qҳ263 (nVvJkJi 2rrYhe%`VFYKfN&q*YYI4-hBY%tFyt'}Z'A! mÔgTgRK/w~RYB <>ڠ1IBY Ww8&b;qn?6=ʹM&f>ɩ׽#g!f0y}؛?w>ʜɏ?]#{H?eIAۜGc-NibxFf:sͿmIzf172q 3k$=lp'9wg2Ɛc僙KIѝ{uD鉠PxZMB;$ RQIYF a[,ߪ鞷L9e(@}]}bpHB!qt a[hfh&nd a¯+-ym#$} l.;7SBSd%k6 AkߔI0K+47Ⱥ5;9#SV XA QF8M"۶1_Qޖ lچG#m.BeY }wt#q\up 3뵩d=Gd`iSfLd! Y]aBygy}OSU_u8֚dq! (ZϚq C/l2zM \:u4i<Oc(@iO?<+|uܤ1gf:1ٚ 2n.0Ay&#[>p!D o%<„;&pk PX7+.]"}9 l%ӧ]V}N]P5MW[+vBQXXH,fBX,^JRD#د/da1z}ĴwV2Ͽ'H3Fad<`δeՌfcoq$c0xHdƇ"E =KgE=3{#" lP]lۉpIv=Zhq ?on6^O 8U_&GF5B_NU-}A պ_*_TvNG4CraWnpI?}t!d<233"n,j+ڣ0of++Wf //oLzb >ފi@~l{mz‘A9^;hQJ&;6lQQ򚥡5hE§5E ]K֝4oi&iG\z/wƋ9<"'Ԥ Z&@Ĵ8Yw:1~F>BEeJe.ӓwrURY BK0d!ϋ qtPh%Oރx-rzK?EwM0u 8mՋx=nm y'z6@Vf+!#Xȋ8A ei|v$´5A) l ]|XQJ) e..h7ycicRCq OkZFrݪ?S?=q !Du_gy>g> ιnwmB!DK{82`"=!`@[<k .u Fn7漳>dA&C/x78 [Pށ"2'CƜnd9V$%}]DaNv:N? ]z\<*|^ayxM3V\߽Ɏһ{Ν{%i| zJ X8$OCϣ[S?B!IHkם $(غ)Ʃ8 4$O%C]3H ξFZ*`h&ndQo;}]μ+({ 6OC',[ю{S\DfYt]ƽ[鎤;&]s1E;`;^qv+Bh4]0a K~FAQAcn3N$p5 hBC[S!BrwCLqʅ TqMye9ƧLSJuK1REZ{2s<]c 34Vug+|ihNi$&, vZLDkMnn.999 Bx<^'|f$z'$\p!Bp!$ 78PB!B!IB!B!IB!B!IB!4]o5?cB!$\!H~{z+|noŏ")/o+wv+>KNy*6 ʜLŲ?q;rMf/B!DCBcL8Gǭ\NX^+?%;7̗XNOLqFOCl8ZӺݴIwֲrKuѸQ)°rȦB5J)&zY B!-طa#Hn S4眓g_F{V96RMͿS&եNXߑy Cs}N]=7Bzt2+K.eMm5?c7?!4,B]~![12DN,Nǰx]gnIU|h SYN'5yqr&v.1/S0/7}·nS07BhXx!zS֝{X06Gv<Pʛp!''ʮG'-940B @!زm W=.?bѧck|%h$<6>]'"H%vo'T#u,ͻvMiiUǫvpR,7>CF%DS"`,54u\:?Q !t0)0}XG'Pu'4u$,+BM=B~_硁߬dVʒpPh ز#z} KND9xlN|%8kWS% ЀK=BìoqC Lyu2`O=d](w{Pwi xM[-rtrSBpo(zvgv>=ҽ@ZoQg #m/ ñݽy1+F%uoy{`_cNvZ0Vu 7i 'Ml&B4cۗ[)C8X77)1,}|n,R;IuvlKN)OX;vLPiפAQτ0q\4}q㮣TaW&q g})ƞwi9M; m>?+/U^~ᕗ'1ܑd5ogHvowݦ]>ƵW_3گs쏗2o =eUCKT(sX&J)S^{/G]wϢkq;v&>1BѡG_/˽TRbD8|3ДХ Ek!^m+E޹ 3ws}%/c𠾵-N!PiX!_/^,FI2X] =lұso֮YEAQ>O?zVo#'̒tUA4Gte@N^Kzt١wFBe*n}Sj`lOG$fmj($\!HoS;ϾES8Zk{ o_0 dw!-#{(c*~Yz5&U3`0kgUޑhfR B(PR/Z+ꢰ ş}œO>?O7_,q4h0FKfN.eE$.fXi )p\DhysMz${u=07O<ΜYI_<.BtŅ| N7'm%h`kp|x.u=22Ļ/>3,jog<|O)&)*NPg9IzqBh^)$o`Pc8KU^0IڔJ`p\l;ۨԡ_Oȶ-G_ex}d5i> !M;T6[p_o7lwҮ/6Ujm|F et<'b!jgQ^6YhՇmڰzɇtяR_}A"h]DtT^yTG/g)InVztxc|7t=I$2F0L¦wmP`*Dkp'AA4(v EZ 5"'Qc%q5[a?'ǵҸxz q Sq!@ǝʏS@)y𪍣!l1'&qui"LP\BUK<% $<;U @s`bҸNҸ vs@=T)I*^9s>[ 5BE)U++~By.Uy^3#r42rtІk[ r1]q=vF8(k;}+X݌0ҥ3sk;^x=OumySZk67ޡsǣF/!wѢq&Ѵ b ϖ/`spl~2t7$CF0B!3emV)] O}"dl%TuƥקyH&^7K[Mx/h-g*>;VT\rDnZ|*Mz*Jc'˞i]q+L~A?) Eڹx~<+տ~V4'5.| yǝOߟxjnWX7SjYUG'uNUʂ1l\LjnRxϷ~<;[sM*~0wi~3?*ן\y{ h7~۩8nZ3u>%un^ܰc|Yz9Cv[X7b-^>K=N1J|YvoQ{N{H+ ^ 2L~B! 2tޫ/-0И'2S4 OʷQZ}I?D&#-&dGt֫JoFvcJeDtTR6j:f@~ +vm.y:Gӓu';hzd5W\A$3j[͏P3Κ-;Xf|WbAjkj%MU*W%ZST'ǁ"'H+hJcUPy%fVKW!FI<&tUdS 1-An qam6pY][Sr+$Je2K^*nwrPܵk2PD[Usq,exhN;Ɵ+jHbڵ֚\rrr8!xp8L! _mKCi07-{ێ:2 * W.K5j䗟B!I8\6ufZav7 hVu yyZGC"BN$fBH$^k43Z`j2/28( FxW']hCkHn+Nu97^y6q4IgɈ+ir?aeG7Q <?ޥ9g~sÅ=KHrV\5u9'1ظbvq{: 1B!!dwtx}FS &eKY|9ӧ}sƳ%+qt K> OϞ1UXaEY7k?}pUc7A:~}w E{/ދ$7;q]{ft/ ô.o͜ ߎoOMk&pmzPiϨ7.~W_#lW \gfD?BNnI7iuD(l;';zӂKc$6汩"$WsBvlv }m*_yx[0c{>0Ls^(rr0> (";;Qi HFn ϳ|]aqL3oG8G/pLfK<)O!B!dwt/M]h푓ӈ=.[D@"&q63 ؎bIF:m?מ1:n'<};%PI4]5s4d0}=&ͳ%y}xgm;w`sRߜU]֜P᠈Lj l ^ʭ+EH.n2Mis{xH 6t?\gX|85}>58vJFW69iB=DB!BHѴ 2SmBzt oBN^.͚xv`6jMZ騴`Ml݋O$#Bk|rٹ;QVT]ï*DŽ"vlZ[>3UEj?(lQEQ2rnwE~Cy#9wH7]C$S^y 'Y sP}o\!B!{Z)A3[MrŁhN8P ?fM;ޥEJAr;ۜLf3ٻ7V`/4 ut$KK 4#^o5wQr}G ,h4&pݬxڿu[еҏ6IާDkOaߓg)}zdz]!B!ײP؞C}=h FұJv܎m;.F3*kPNm G@/+b0鉧 !yOO6x}hynஇTBbZMXRdd߰"hx5˭ߞ1L(>{41hϡY39lL-N|Itsшv pyT< -W8W &/*hB!BvG퉂Zvj-#ٳ'=uܫHa73[p8 Mؚ2qg^œ0}{_|.-ټLtylÏӋx<8NPJ1KpWiqz8lVsTq qǙӟWzN-(+0D>2xwW Lր&N&ن'Yɹgv}˸krcFѻot=.c4Tq}*l]y8GPρB!BmE{4u fl 0YW\Q0 X քL*JjqK pb8Z໻Cm@\q0.{us(SњRնoXa"@a2R¢ q7Vշ(#@ خv\iV BFA+G'Q*Ʊ=eE1;GsYJ&rFs14TӪY_ލخCf?zwܨ@!B!I?2ܬKIF2dw";ASʥ/ϥOvWs2e%p\^rI…B!3."pHP&q~6鿮Bp؞ˏQl9yDZFk~B!l?9¾ٜ߷ ל|4w]܍'&'0:boon{ٟMjyɹ&&XӠ5BH;BwاD#jL1 W0\·&23Y;Jy 1r3G|$AV'a6b<;IνBI?˾R(\kO9 4J !4h4?B!oXϟ׌{&_ ݻ6ȣ^8UK:yg J4;h @zȢm,!=?r\@H$4 / Ft0'!{+Qe ?tm L@@%( O&Bb"҃o)&fi|b"0u'c'cq\J$[̖Oӏs@{֨v͇u7 7YOBHn(Ż4딸h4VqAC)Dµ9")J!qN!{照%^ `3sfFMbLCx6xx,N,֠5thCyl I; iM@H#t3R۵ۧBԁ1[.!w;Y J!Bq啗2mګ0 wr=}Us=۷n`ݺu|f 7nd| dC)n#t9i/h޼S|2[wF|`/7g ZRBl]3[;k]BXF;gN1B!c>|ﭪNi@&a`#L6^]]뵟1L &1BFfF{:U6s?UOݚ=Gv׃NW9#YϜ3 .x4ɈQu'Jhoꢐ>q?Pqt@TFޖ_c ,r >di8bVH!(ca HX,Rʉ1wv喐PtHnͥ3b A!#;+Ů\rd c{>:Gk\+'14<,&W=$%gHݕV}nNV䯚[=-g??uSAP]ٶy%]aa6˟|csQG̘CƐ/ZNg(Hᗶuh!BYl|$KH/=z3rqiߑ;a((9bs1p0n{EiS>pZ`|.Yt)?)򽕳‚QH! y,̿w4gv0@)# 0թmafn_^x3KzyDܵVp&6`lW 9;ֆM#-mY_]x+϶VXO-}<޲ggR97/v8܁ Ǿqn8%$z8pܺyQ+Yj œl|L[x r{$vMٮ \#cc5BҞOx fSbO.|~~a\|}$w6/1B6c\;Nv^?3Va>sy ?sR]UKڕ{*@y7ps+wͭYfs+V?knzv͹}rWпkn [kS-6knHK;9t 2xA@/efz=?Dŕ J*F )-SVVHZ(*cԨa3 [h|T:M{TȄC^SBER2iOODxe9 1ic=Y}$7!:}w"6B@/hM dr3O rWP!6aNw v汁@]w+maB`rgy1vM*̥}ߵ ܖVxNht%\$nG\iH9*v"@ s"ws=ߖ? %s I'ZCsr<<>3 `nPϭ0W=D)qbltl"#F"D"e|naas{ggeW#,Y8/}lXb6(TN9?>g}:JJN8 w/{+>| 8c|,R][EYI|OMk?6.|?}7v]v)w<ʚB~#9 f0MkoDR X.f$a d/-R3vxgFmze&M`*b8}۶Q/Lv2aaxlKepV[}4wuR]Y8V%P^[ϲl/\z!#QV*g3H($#..",h<| H^~I.r,?Ɠj8x4J)[~FiL=g2%eU{ap0s=k`Y6-plb1 qI$UHBK%HcI *`Tu)GeXݓNJq0 0kVџ\>O$d݆MttP?v cT4ӟGj[H޸˾z TW#ulWtbdY9DB.CW6;xIKԼښj.ֳ?P7Tzv\[)K`p@ 7 X}TTUQR")-, JQɤS# IJmipMϴ*,ucbEJׄLo0 0 7K>#Zttg^[Ś59ӉBR,(PR4r"JQz"{l?%<%2lFWw/s/ɧYyKBi3Ka+q3gSq3\w!Or2{3(a k Ѐ@pl|ӡ Ə6ٶm.e<$zV( _I4HD[В@ ƌdTT< 5!ȿ/aٱ\sx"(ٸ&!Y$φK}U D)M"]hjn'vzR9nl64%$@jTȈ ]xIƶ4nobhh|7+G+ħ= *)$,N?Or  X6 (6%(gag29R&V6ѷd#L.0lQ7PBXTTP^GZ6%Xv ҫޮvH!(M&?q51MJQQ^ʘqݶiKu*H$1 0 Z;(x$6L!.wDn@1Ҿ'eTh24t7("QhgDmKB6_ WЗSlD&*PR{EYr緘~īXrU1g^%'Ob4%e%< X9k7 /b?#iEX ҚVHi1;FG_T\d҈2H=tlƌ``(l[jnVoʫWXw""-ƫ d%qBt:ZnS6 OaaDb1FdJFR,*%ȺZ 8?up?!_ȡ}ʊJln#-F#)KHV( Vq,+D HB<\z7]un+g$xF+wιaa 8zvl&RRm,)$@k@yBiՒr_Qj+ڙ3D-/Q^YEkM#5#<>Ͻ2%o縓wؽ~Zs?meapر\8!ͷ>DoŶ"46wחrGveڧ3E75#jp'@.o޼7IZO1hX0 #Y^ǟ#|)rAnC>"u_g_ZĊD)| k׷bǤ cU7I-<a@yA~2KX[w9bć/>*rp 7 !m,)-ݩVR5PuU1JbBAmii8iH& `İa0)ŮZ47ocSm\}Օ|_ǝ<~˲Xx1\}|˙`- NԆq};ouaiiƠM 7n< c#'O q'qWu2~5o.rd̹;~5|2{u~0 WCOG_:Oˑiyo+hlgmwOOoNVisP^YEMM%(vqaE p`4@q1 l_ .㎁=~BR <}0\R 4aBH!q`wxJbkAq{٢(%;6*[D&qjH)B |'.$u| -[ƓO?]b354l\g|AFc^@)Th#8Xz5{g0xWذfƍgv5lZI'ºdS =DҊjM|T= Ň/,nQ;a=  G`Q&c($2D8kֵE45me{95b7|ݝ4 "x=P?Pu|"gy6cʌ9w(eA'}r>4A{nj|-񾇩KGq 0 !+ٝH"o9 ./۟3֝c[-(O8EEIiBQ,j^[F,QJ249T%J"M %%ŀtW3^|R"qc U]]MyםDJJiN؛'՛_-bDG+734Juu=E.dh2lsQ QҚxϾaeUckr͵?CI/@! Xd ESf).]ƴe3tw0bHT*dL(-PZV(J=s.cq(s/SעPP84aR{H4 Z(4#FuX6m߂xxA= A]e!m\UJNq"Q88 'yh k*8#hO 8JVql[{8;QSY'?if؄w(۷o-pL8-[6ђqLyG! \s {#saFu8Gs씉z+Q!l=EW4/(x"ݩ"e$N$yFaۏZ#-@5R5/0@%$mc Tn R0r~˒{#H( +  f8>mc Hַ*"eԏaˎ2Ebnj+o{5kSP ; RZuмaqLxx9eܷŢE))25ڕ@D/!fGCshzVlhd +Xl Vo-)O 3ntJ*cLWNI$ü7Wѹ~|XD1E"O3jcu8:S?tëKb%xi3n>3(EGՋ/U A,^֚ڪR~֍c%NOfN'xl ^5beUxnO'F ~$ʪjtaRVQPG>Uca|.˓>JQ8 M< +FZŠD 4x"4-$@i6֠wE0 Ī&~Cǟ1ɼ9]r#W="75>[>0EiЁOE‡ڻo3 +>ENmO߶cenzu:o;ݱ :@s.(Kh/C 6&tJF3<^x9 %[ɒ >Qws8ZP];'z/P_&)5t-jʣteEW^Vs.ai@ I$ϜgaƓn;~ vի6_i\%w]=i|HPyoy`hMX\i4}E/>Adԩ \*5M!SD@$'Z_"6d>{XR,/]|3B{qW~؈G[YS| m[ç319WqG>KKoAPORQ(x%aæl֍I0!fiFWDHI:Sҡq?p3|*O8Saa~ \#.PZXB.Wb PSǖ%hJ+l rQJ@+P /ٳ0sB}33zz@ $).7?M"` 9d4ѹ#ؚ=rR;R,XMpo:TOc @/vw-$_p$6J lۡsG]d=MK_,[ٖa4+SlNS/q* dGoaؑn3 s'\~"%z ~xwFZ'͢eh/HR0/Dbcg{WQq0Ey rjY9}34tXnS#og|sظf\ XXRɤkoi`PlOHC e&)c~eyY|aa<8INݯox [Xs(-M 2$Pǒh M+N(\/^1߂a;Zџ/-~7S%4ZXD6B X@pYV/m H"ʅ P%c9lLc?!i=@}#ȲQz( "fz<664˯cO0o\ "Z)$m2E]EwX5Mw%t5hśWaa57nfȑdr#bI ,4 aY6hL3cG(ݿun3Bh})C mRb#p 6Ef\t9f]\\+8l+߳Ss#5H~.GDΞulJ|FDKЀ%槶3d ?ã6O~7Dp .BhB pFˢHGcۂqK4wXXuyo1 0 c lmh':4SZCҲ5Rx*O(7FLߘa&\yRib7xVsҷn+ ٿ]xb؄)G/ir}&F$G+5%~Yԛ5vWqM3yo3 0 >֦Mx{xgYr JV $ g|.D"`e҉QMoۗ,?%WBňDy|_ױW _2Yh4A> nH!Xž=~;yDپyql(MsABP8vt9Ϛ>Vtf8Osofȑ0|s89r q-r-fl.u$Uöm5+ŵZk,-L7MTh9x*휃p0#ospĐ}~~eE\%+=,֞iSQQNuq<΅FF,YJ]ȃh&㉈0D D4[ODDDDD"&EDDDDD%"""""""p1#"" EL&r3"SQ[ ~c2.Pt'""ݭh ^`w rs2:7B˱ZZں(;rTD9]L(EDJn53ey}9}י9""R~`;ueEiDzx"A.uSy "a&RNCyhoWO/wMPT@6>y/UY%LELEˉ{~1oᄍ=03DD=X]40sv^FDYE).`1c~< p'X9袰[-VnxBEF7zZ݅%Ƅa_txi<<]arD$&j."bs vֱsϧ4v d޷qy>&=qd"&Smkg]ok7b}'HDDΞ>A^$&->ϊsdK݌]7 GpmY>dc˙ i4ww0|3?+i$EmQ ,XvA c6eqKgXUSҰ$$pbqͷ,f޷%tjD$&ő,#"8bb^7{wE7|73WnKwww("(*vwܷA dwww,^=3^aW0}>k̉u.(Vo Q; Ӗi ?cOnШVTTTGH3ߦRf-|UqZv5`4R?$IqF%6:@ᷲ3!.2#)UvLCǷQf%t_vYT%:L(+N6z\ߞO|gfg{Snmc1lf݄mWLb#Fp*)#;+MSQdegS:0-Tӆ4|q,(f0E՘K>UQ.fOb6{z4 BQ ΔGnKK$YРB:<9zK;jAצ[bu8!8CBM`OА*V-űGH$Io.E!66ȈHbCӜ,>])Uc,ߓD1J*TڵjƑGYx|?K6н0alvm?'9q'qw=1{hQaaD8qgdseJѼi# ΩD2rrkjIzY0L Ӥt岜NMxN6;-˶]1<>6 ׋D%;'J ʔFشe%cc($",JQyS+T4V8/fXG)Iq*$2-%9p!O\XV;7r4@>TԂaۘ57OIA$lE6˖,yge ter~4_p^}~#M#( ݖ;8g>>3k1t@yhۏ`Wryg ^PH;Tux|<o+'qk{ 'sw8 N](c1vV͙H~Ŋr^2sϜ [_+dĵg+ ׏iK5 4{ڽ7_-O {&ng~KS}8y%>|r,׫GZ8i䦥nJjz:>b11(N?ʄ?MbbR>u')TTEnSq( FxDnO.K&&+8NIjuU JXd {XAσ-+q!tn_ck/3m6njݐ1S*&om >7%0. u AhhCS?jCK@jvLp1FC|0[.$XAO<$e~3eNrϒI$Ig#]^Gv$IRjy鍷s MM'-BbNꔍbӜqkݱ{/X`>> *?yϻO *&]70 BraaG 9xbx>>7v媢"psp6!D=KXr4]A7hDѽ{dnwkv^fIm)oʯw$زpCtH2S RήJ+v0{ 2yf+dB)Լ\wgZ#`OK$I3ں$Ius1V\+/L;n w= # x7fѱs7`ʤx V,c +3ՊES q^{Qx >|U~3/_;+Ԥ$La$὜޳wҳhܩ#5EP#!&Ɲ O.g@xX끷coِLC{7Ԛ} x~qnV2fR[:_sαe_1pMU="b9Mh:l?V+԰0]y93ya:OJjujG 0uNjnl6 ǃL0;"';,$V 'OGAtbY=B]U:^$I$IR֭OLxx$(TM|'LxTB q7(*6EP*&b#ˆL*U5p%&9uFT-Ktv[jGP2*gd̉ ЗE]䍏qzz8 }9huW0>~cr;'[$?wv}d|\LWjV\Z6,ǢsI59qW;^A^_ERv\&Ek|{{0U%Ǟ[&:ʨw>aՊd{ *פsKx\Bxfa|GDxr}XC~Xo<5̃"<)|,Z֬à^qp S\"p2c;2uL&(7J ("ɕ$I$IE+S:&u[8{4(U,yQNIIEţtI ._fĄ9M&uܣ;gXv ʖfSi=.6kbWLn }{RTB\jd @ޭ(I2-r X:  W+?'Xr%܎QD8?o?J?Q#B?C7 !P=:坬2o_~܏xtۉ)_˱lOz`b~ʔ-æau8c=], V$jj.NEaOEKY'0@seG 7$I$I:x(~ЩUctaAϲu~UR8.%L1Q D9/CQ1-a2<:6MV|1jmwqUN+,O;XXEP"xp@(6meۙpLnkEy>f6)fsh9g/8h{|e Vlz lD@X\R=}>&,J4O1df962@.ʮx5bʉ}sI0)S밫V~gL`;I$I| 4 t=78mOctEP#,QrؗA׏̀(Jq*( \mw/-"X<}> L~#/OzjU'7b,ugSx"?2IQ5 xOK$I$eegB7L_.*6L>[ &?Oį8"'+ժ<%OR\y;J eDF T.]ӱe)IOpfJI|: \ _MᄁӇѱ:gu:P|~%ʘP@|T܍lwF +QՆn0(EɊLWu4N&JIL… wFt44&I6k]芓bqĔD⊇" Ltjˊ6owAnxDWo#gwY?cj\HA52B`[Id`O)r?9NjG gB$I$)"< Nja) 4 " +KR|YaSd1J(FɨPꔈrHB /^⥱Y&:E 8{6ۯmO1?.ݿ@=( *vcawOwi:&%'Щ,n D?/A#뵌s2=}4/'y'%rLrp=Wrσ Jv$큧}T#T*tDx9j׈!dU@xTЛݚbU {$-n_{Ň),#vJRNENx;UF24խG\t$ͮkK -cOo` ~8 P=$Si¬B$I$IRff6!0`b,l7^Ebx*WOnV3SXh>/@ǃr&II۳3Y.J8Pjov. gӢ~-*TLAE_m')KbN9]wg,eWqPT,뜣jTEFb*BI" <׆B^bA)$a (:UQҤM(❑\)I$I'NqY,V fbAA($,䦑 `=}RaV4MDHPV3!a*u; AJY:#Ǚ(i.:4Oըo8rhT^\ooxcm1ǟ3k&E(^w{*o1c=`zuBv$]m.I$$\$I$i8͂Aj#ʓAO]NadeyrDqCvרijc]9#sv 5= Ð>=8x* r=R wn8 ~ɯpr6;s]Jcd?|-F= Ysy:NZH8"f}bKb'77ׅn0?NFf&gSR L!֟ gѦj).חarN a1w|U&#1ۑL2}Ѽ9nQ+_a/ڻI2z&UqƄ1n(&M_D%3{oq |ˢ {#Gѣ0iь8L)O3nv}%F<x$DXP+^Cc^g?@$I$I$qnNb7Pj58t )^gXWv*T\%+Wv&~5[i>Ť|xno.GoCw\]n@E_`鉲sOf/o[XR[3w+QtOC]=sгBHԿEn_='`1vV͙HBsCʱa狹utwˮSy% nQ<p)R8G@T'O[uۖP ~Ҍ[rqxբUf~HrVtY4U6%ͻI- :.>[)Ha l @1K#Fݦo/_d궗(޼kTwnnD_$I$I$UTȨpr]gnD$SF~ͱtN=/QjסQt~Vq +֭۸㟹Kt]/~WE&{R}*∏8'e4>]uR>zi{Awm7^ƯlۙDu3X7$ ^RFW.GN"T "Cj I$IҶmx뭷xg1MMS1Mg8lG!oNaJF9Q̗RWMdS:dъۡ4׏}cHR~` UJ8Ŝ+06)gћlO+: ૏b= }y>֓;# y~ qNWjV\Z6ovN5&'j˞ Krt{iXcLA呛kpMxu-!oU)# [>sX&Ozf.s2(jny ZߥjǙ]E{g[bعBk}绬d}q"ghո[9 v2 e[0AǗ]wgPf% v$IeK3e,\hPJɟMqml޴7s96 $I$nNL*lE p(!vţY"ރ#[GWo:{vBBjuiݮ3 ;Er'I X ]W(8*r Px{h]4M*o^;y#?"a U;z95]dOp/ģо8/>GϠ2+$ j`l{d ,r18ٰZ"SgNcdsҨnUj?$I$I^>8r)%,<::v1on!N޿OcH8h݄oaT:>|0;&F?{c K$m;x/g-|\1ө\K5U</(VO\'X9,?{Ƀb]sH$IԸqWSSc#w*tʺ0c:28¢xy(…& $I:z$+7njX½ل9lX"hܰ>l D"YТ"fCHlr2eKasrVfݕI$IֽIV۪wQ_}HrcIre)]2@ tV6VJ]nM߇;'4r$+3'qjTZfǷa$I$I$?E=OM?Ë{$i=!&IJ֢ qeKal^9YYtN?Ic$&%#=4RR8w/,_cI!+YigBx\q"iSr0'Y=>jM[xQ|nşI_H$I$I&ᚢ1n(vaɶ9iA0MGaXsTŸO'N۱,ddӤ)kLSg1gbٍ+' aU,G 4IZD#P5 Ju)Y JfUtlDQM>#QCG~O!J?mcN$b;+NN_;p0ݻvq6Qyu|$I$pg240Li @#}sPL l8# EOjO!InbXsEWQ9y ~;͆_{p\Tt^0KM',T׳W.-{Ws(7l&-1mh¬ݴ&s׭7^W$>b0L6nQ_\pZխHպMt9}˔! 2}x^7!!NT;4a,ÿSHJta"鿋ŋ1gZܙ$IuH:wd裼LD/!II  א]UBA79 0!1Y}h i;P ߂ 0fP?j8n)+6DHQU BCChײ97F- 5<rb9-+8i%7.̶ٺXVPrEiٔ5i aTV8Flڶʎhڤ;oh~;Bzڠ_GQJPn]5jH>=)S-֒_vͩӸ5 .qWHuAqΘ hPN ^jդGk&E%,z,Q^W_Vm:bR$m\ijPWYN'jVIdi?^xs=kݺwd[Y?(ϟDd=Ù)`OA(.0t0LCjX6Esd>l6 EQ$`8&⊂]?Ø/'8?IJLJ8l6+MT:0`ӺdJٳG)z䣄%z0|ԴhX$*UAjWJa&eB씴 )D'%#?[Js&MD>~m||՗l۸9 0z49]?[㱓gpnI:ɔi3Y8'@39x3f_7_qdN #([~/_/ Eqz^FgƷ~Ǝؑ_Fڜfn(K50)=qcDz}j jVعȱÏ'fʌY|kˋ_Ok˯O7v$:0r$]v" 0O.;mD,_)x?oMEU8qp+6l믿aÊ(R9}2)>LΙ>o)bVӧ''e0i cƌ/o'<@8>W$I9g]$lH~X^Y-gk`WVgKӸN"CJQ<^!11MNӷ^? qx6Ғ|\$I(BBQ֜:%`vLPLW*+(0 A D ./ _:=Y^*S/LUŝxy?,i *EqaB_qW0~4/'w$N'ɟi]ԫ] ovjo9ġg@'w,fVsвݯm9UpNH״%<f-`n|= ,n %c0nW(.FQ@B *0o:CXjfutz^ta )Өr]~KRz.!=ݽ{__,ov1~ELj2oy42NVPQpp-Hޞʪ6I,\Lj^zw !+&S<LS4tSB@ P3WXk=t[XRmϧlDAE0sTz>"]bhv~؄LTSh|C xl#ԏ5~2Ǽx hhݽ#V3_?3.P's殡i%Mp~]ҷUYɟI|^?ժ!StS`u4ZÊ+3QܦѾj9*ըNj5+09܆(-"uVEg}86j! )'/K(0򋌈&n A8 sd"׮ BPB qb 3m:mA|RdpZ|7<jVo=dl[{﹗s#`((9w8H:B"Nw3N ϏEOVXΑ :6SUHRbQ}0/ޡ%#+Vm3ӰEckx YV7O$JB›( S+;|#ѶIc֝T9؇X>: ST#nbhuSj7PvZ ;j$ @9w9 (JDբI^;8%SJ'UǦҽ=00` 0MqA/+?fqt9[3v&%ֻO%yg=z>y={di{n3|l-;Z}Lێ혳i*[7ogdXIRR@U54@ЬV<'R#ң*_EN~ ǢHb0Qe[i ˔aTـ~)5=cZ6oLxR8,\I>ŋD@8)Y{;i]Nl VBѽx؍i=MȾ}Ұ{sy澪ty6K&/};2NFUk?GITR]cM3^Cؖ00<)lcOz@ f`q({q}˲{vZHڷNd~d Fp:W!xܢQI{j۱NUXqZ-.H޹4͛QA Э[c"ut#bPEcԀNTlTdq|>?z FpÄbũX&jפbՊTUP~STJ݉ϕCzZ 驸\٤&&f' Ոr6ۋ'uA4lؐЮ]Gv>B'-䗖zwfiFO*WDp!*#Ą j L%.%:*|>[Ubx2S뎻pvMs׮ؕ4|#ȱSUS'O)S_"͟ a '1~Kjz&FDž՜w rHٓR=@Ý*3_})[Kٵw?=iΠAwRF݂L;Kxd$GU* t'VŃjtm5g./6Ԉ%,~5N57j?Xi!gP#J9cɔֹy3y?2S}yr0Hreut3 ]&0U$d 0L!${n C?@.` ǽ>/K9KX6(a Yv"`ѲUuv?ŎG1B*Тnl|B- b ( &$5iPLJ?`&_ǧ=Br%Q&N'YigME \/9zdϱ!p:CF.a)Y8=?Ӷ;iT&(V vo0yvn{~b""B\7W)Wnذf%{c9DULYyz/ȂM.q֭^Ν;YnfL.Ǣp:%}P|U8@pۿR*6\]×9t3gêAV6q14j#ȱHd\EM9JfmXyt҃feر i?v|} ~=_};ʕ+ڍ[طgǏ,̞97@}"SG~=_?gMٳL|1;*Td'}vmƾ=AcgOSL9~?I{9ΜJ!l(M4ˍJqw-Jd GxW`,e%>|ń4IIM#=Fe +b t+C4+KdirI%frNՈ&Ok0{&ҭS-ԓ9nDDE_ݚUb*+Cs1%s}>>/1Qa4k}/|=vJ'6,СSIub>@~]ǿ2E?Kq>ӰNN_۩%C9N*#aNu7&5QQcWjy"B{s641QE'NkSsx#'%L/=Ͼ}{ }tjӔ%\2++?ƍr]C{8"Q>$edfojE1tâ)ؔE /_O[Al)ذ%%cl:ӲBg;ؑG5h G&(бk'$ W -9SsS(@亪!ѭ8q,$%ƕ(0U ie̳-M@>Z$ZF|5ظ-5Fs{"y鱛A'؝SN Jklؑ\~+Xg?NJrsд͒$3~ / p%3ohx_r~t*H۞#Q"|mj5݊Eb`g\PuT]*4Qt&Oq$I+bMP0V ``@7MLS%).77\x?LSŗ2z,,cgD,-z4L:܋L9[Wr+k5b;@ ѢU]N\%>M*;0>Pr-n Jϊ" 󐛓?`f砺𗐤e!Tb(*@h;:MM%fVjftfauNOg۾C;x,n$6J目Ͼ\˖{I!6oS*WEE"IFjYWcSQLjz엗K4iT!<蚉f(..j(FR?U+5-:;,n#Gi.6a%дʵhMGW@, R!8OqZNlS0T \.&{͂¯h9C9.﹮Kr%?e8nCh*INiK= ũ[Tb)[K$77Sy{NQ5 kҼN iۜ 24v :6B*u ,YJctx:v-$'IҢOV๕qbu( SXi݂jSkRO4{:Θ#8!6qW vO)=#1S凤xodp",&qkNPB%BvBLp[XJ?fhҸb8AP~Y-%$\SI' or]p]_ptCgvfR7^㥛?A$$)ح*{vd>u"Wsr. ]!1'dI9ȑ !(EX4o 2HeaK$IJlXN{#702w$YNf#-NBz '~/ϺOW "CvЌ*Ip ǢS- B` dL9RۃZ9h _[-WT&/xfN>s>[n K%efʶבc%:*X"dBYjRUrhV}O|gX8g6@vI69Oy4'J&{e,.&yDtDφ]d@lɲ?7fͮgO`yķ\ Ip ̡Aryح d{h^5Ow|4 >$IZlW;#>s\( (Bvիΐ'_yu$I$Iڹk' jRB1+גqçӽdjvܙnL@ðx$,>z-0'Sp7 {װ%4R!K8HZ8{%IZsb?YG-䔹^H7M}[o@wzJ=E!'=#W0q$2 bXFZӋKI2 TXC,BrQ幩@BS..O$iӆ#G7|Ü9ٱc'Vv n2ד$I$)Lao:ъ 6 :Sq= ё8*iz*.չ$`$s47(͕q"Gt\k#ޮō|'ȟqChYn݂u/nqξ Kز8>]!yo*FoƎ<:/G3u\E8tN%|)ήJ+Ƽ0vH)\<'-K 7HMFUty8Rr\.IRג$I$I$ICGP,Z4$tNǟbټ3XʖYsV d}tSLm֋`7r_[ m1 4t覉$IԔhܘaY0f~1[o XDaN:>E7)c,o5[sT CTqNʶi|27n$ j$I$I$RI +$eP ;G&D;<ޡ;iư)nfnғ~H5r<55#|n ^^)V3=~Ax_ӝvur9&e_=X8,[޼7d}ůXa_}ǜWvV9=ӰǘV7>#79}_Z5n@nD|uW~hpM't \\ԝ'(=MME0Ҵ&ٔt6_'Iߏ$IruIGߵVՖ{pKrkjӪ"5fMMC>sHCN˗HD;GemvΦc^i\?F*wp'ŅէqvB:5eAJQtUbp^G)JT PMmvU;PL7p`E$P$I ]59}m;9B~(X7g!!SE?cӄiʴ-Y!qBx%QȾRԿ~?$o_C0C"PH ^]og^PI6-CSxVYBڤ s']Ozuߤ-oM\ïM|15Gz k\t oo {OGjլAq S(Mԥv:v%y c,juzss~zw^:oމgld (}m#k݄ ШiF|: CQ eOQLhZ|w5ʬ#<&AFuQ6-:N!sϚ;> WIۿ@F [=&Y{pU're4h l\>B: NJ9Q/"wuoc4Vdt|7dU^}[?eL߳4]`5׳iW$ɧK$ !H oÂgo✉cjNknۉ X?ztgeTw@t|06<:KBps{z?Us6'~c"=t8F-ҥ /cك`r-c0c2b>JNlѼ/+l}r,%x뙗3iEg7ڡ4j6f̄@Ӧ s߇[Xf3x8|<(fݲ"M#>Fy+?mȂR$RR͝BUD+7E(څ׿i{-lj3ۓƎeSHhhh Z>²Cc*V ӁI,Y(V$985b&>R1Y&7H ";|(:6mI+$IysWy ʵ"v \!վ*ot􀗮wV"22rI^ "TI"ͭ?k}>?UA(ιu;ys yԫU!LKjQQ0 :s =Tfiܸ M4qh*i9%2 yUC(c:o0(M ub[0cz;{ dU\T}(<6]B>tT2֕r9/GL>ҵ+]tOb1N?$dz{.LVӎ T VnNŤ)s7bx/mLDg`\J{hYVӆfXj`aw?$х$Irrasu:9GP8!. r.W.Y7^W;hc,zEw_߅1I[/>˵׳@!>^^3@ߊ3z'2w$c3ǰL%`iFEresǻi (8Pݙ *mJmμ&SzԄ(eO/_US)eo$I˗G^knv^i!hI!le[]oWV#1i"L$m^^ߌ0M ,x?;$ !Hڙā9ٱtocVV%+?$I0 t$[CW1uDw-'ahRz`mt`ꧯ2~~X%\!4t`c#gL??xwru|LQ SuƙQ0f*׎),&)x{)u )>2}owĘIS4Knsq?Ƨ#?nO{2Թ;i^_O|뮔O~˴)x$G s ϕi ﷼ȣ~z<|^Q2j`#}l;H΋o܏mkZdy ̭+> Wc)Ì6e.Y._KSL^]9Kle͵(֏ L85`1y\(JU,= >w,$jX\xRDpj v';;+'h(l^< 1(x'I5,Ń"9Q>b /0VUx|, ;G)`b6+vk۞k (H$I$I$I( HTFqBZbt:sF\ fu,qE`.MžQ3 bAQqY㾥FPZi*lLb.`B=|.u>Ju qL z70ЭnrMwnE{Ӏsڲg͆)Ӕ\CPk0h\wm~ZvwvB`\0>F{^Y~C)>f5/E;@Aʅc&yXQ)gIӽR ؝ B(Ul=ŁA8I$I$I$G2#W#Vp , q0F\% ~Ǿ }F^ |_ cib-W98ɫ &&< pl1%bIT8n,Z7jH X~ ؾ5*a,_8 c¤d(6DN` ^ R&\KdބVж x>s7wyn.M )%$;>U1c2_ES~va`]CpZ >V#+5GN$I$I$ S6n B2CUc-6Lar5F*ͮgСw ]U!?UQ  B厺ai|畤q\ck6!!a,$-jA>]~oJCEp˓Y3wh K1UYeRXσcRu ixCj2Ç5t*Rh|\@llgT D$I$I$I?"DAS-(P@Pix1d`"B2|OoYE T'wVN~a(LQdffW4iȾ3؞VeTELrM [7ɍnsL83Y !6oULװ~oHN 10Mk] 򄔯JH1ǭ+Qh@pé`Sdd G$I$Ib۶-\ zJK w%I2 D)!4mVZο (B )2Lf܋yK0t!~G^ ,g™ qŊ @q7,_ė\/5n3(ު6ZYhָ5u6`WDąY{ߑ߳lǖ-멫iݼ`j&^kՏ.מa` ay6w!ȩ1w{X2Fȳ^1f Տ%#b9 %テw'8A6L!$!^(Z+oO$Iŋxi޲ mCÆa<ܓ1{﹋ѭ뵼ƫl߾$W !PNݸrT 1((xg'  nՃ:e'My(E.sY3s4&s#|8L.pr2pbv`Op e3O؝`iIRTW/dwc;n<" ho5z4Ǝqc>jԷLYQ.7IO? Գ#ضmhʖēϼ@&͈j,YK7II(40 /NqvNFA*jy. _UFKzonB}8JՇݮDThީ;7Г*BKpkk:y&ݴѹ-Ta @|SOTKl1~ ARib u[tW>ѕl\lua SOp\tыzmeLejҽ UJcE^:>|S~˭oD`o%I8m*W[HxN \y;'7o|YJ~G3d^TN ? &8ȯ t2Y7{$z?zajaX8*01MQ` *:U &w$+&(i׾O=4wb%% ӽkw.XȠV"URW-fjnw9+Ӷ\-9jϒ_\?3}#ߛ{mC9G90usmMܟ_;v:zвUGB\t_,S0ns儀mVpr7Iɧ`yDDD*`**%G{CNsIԩՈ;7"UUPC(X5k0͡WnMQwfB!OonLE3 QN][N{ #>)I,]h48C,GD)VaضUէafج!ԩ[ӊ@M@QlDXX^yE>=$$_QP7<5ʠ)j@5P}e @jS%KқH/cك`r.3 ,QujEǿ`@?F}Ye Kd9nŠ/EjwSYi_r j̕SP<n^K0_K:>Ȣ}>Դi:J@x(raj83/y -ύMb0WUOqqP(LaSC)"$<:F~}v oշ`܊~M_!@.%i^6̄VL8<:{"L# L|SsZvNT ԣ;/Chl$~7rxK-N U0 eVbj$'!`lZs0oԯѐm{6cX8'͊cёL47E n`|Ī*X5MQcԨXr9y$IR¥(ŸB$Lz Ӹq4iLBUys@`BE¸R%J_e9{"3.ޮH;Y4#@ٲQAgOR۹fmZqzj-=5ljKm,",XFG-݉YsfsSz;~HB2r9Oz#OpNjjh (ZBơCؾc>ҁNGcv:&a\Ÿ :#?/ןvE m313VqqԷX91Lmx,G*8@j8|"o+p|p@l64J|L4@f-iҤ.N&|2n7-Z6YF;W#4`BX@U4M ֧b1b#~$II$+U[%ʯw . R|>7l!K oQ#[!eK(߆ڼu8يY_K ;ݼ(V~@)XؚG;WbB4(r΅\ qYqyEGbmAh~zj[1 K~F]3 Ľ\;{=oa ^<ؙSs띓 rrasuIP<.40fbk LT4|op[,w"u%5֢gԨU 6vEX3@հ) >EQn('_ I/$I*֜&1 ^vr ,VV^K~K/A&EhO,ۖCl@U2W cLf2^GP]Sq_HNQbV "'# #`cLW( qY xs.˙G弌-TP A!tҩO,^eKPFEmކd-^sp(Ӊ0ofoŴiIo"YжukBEF0 sFX4HΞ&TvAVF&vm'2Ʉ?2wBvٴ6mـ˗MHMUPUK}bcú5;vI@$Iw>tc۟1a8> z (zCI@74 ކx=SMp^~s۵[|4z"'cp;)i@eJ;Ҧu{6n̵t"ʺ kЦ]\Ԙiԙo}+B6髌<o|f l]{xoFfԷ_+/r@7)G~*Qxw|h;ND! PϑoPTU4 t=ds8*] lZ=Ȧ y㍷3stgZwReʀi`}bAUTTT :2O>I@$IRdάݾUb bOֽIPQbjpT =Ͽ!dgSl^18nyŇ[y4S2WΥTЛafnYh9YIhBA4؄L@hU!B׹$%`肿ITEAUT$I:z&䋇du'W"]Mg֏`$IzgYz6U$4AL|,i #ddڢTzCH44hDˎXj!gOtxGSãxD膎iix<yevrzD e.1Υ)*Iߋ$IPPw$)^wl?d˞=/ ?{VdU`罳ߣCc<$mڴÆ(lv;!!!(f3W,a+Crbl/& {qb2B6" q!`59q)"LTS 6 \VӦwӪ{H%՝ߏ$Ia6V|$Unڍ_gFк[(P5|7{2E0,==I܄(`l%ÉUU1Mȏ}CÉر }!22sxݹGqyQ8ai !PQ@Q\^pEQ.?)aIK$I$i16nExNS3T-Nh˖Y\되He&.&Ib&KDmjDuMGr.j(XT0x<ùJDAhD(e3;J$I$I$I!8x(e˕&:=n2ez\T.^_$X5=7{{Lff9Y9`؎pfl7eo= ]rӠTWtYΞHSשW6vdT^HRGXbxs0nj~/{6oVt $'$|2ڵke>7 jWvJL9jAS-bqY4,ё>( >n .$/a_0~Dck(qvTݍ !tj7dH*oUk&,I^.I$I$IR(Q<']= @@` X9s&I[dR}W$fa {oN=FXTP[QœDǕN/D"VMq94ג hЬ pl 6kjj۔ ۜo1u?M7DxZ_BIK$I$]M"IZ5#aTge3)l C"AB-V O ج4T kZB%YBpG^}PTqt FQEP~}.k[L6'yΜcL ķJԹFuU1k®e2귿}B&~73k*r ;a.,cG=i3z l÷ߎX6)i꟏Γ9~.njaѿljT\=-x+7U3bģt|b# TfkPT P|Ԇ)igI>sߏUv\=Ͽ!dgSl^18t*GpKf\LV\:>7_8߸Lfi}!t٤ҹ6U>nvnrQ2WGHINq&XV زq3T2t 0 +!I!V;V|K75&ΉY\ĒھWv ?uH-s>H? ?p}פ+j8o3Fih/Y2Y,ѶS' #f=oj%#8qˣyƜ3{p|Ӂ_{kXp7ֱ & u-8z3瞎%;(X߿$:_ЮIe{AXԉxhX&68J(&z@E h^MkUC8̬L:r3zHf}t[n7$e&Y bZI+BLSo^4ii /$X~}U;p떲bA4zy}o/,Xǣ*'IRU i[ɗ׽|2|p\{e)9}m;\ pyc-ןg:ld7偡pc aҹ{w>~A2Obߞȍ),߽wロ'^/[7Mc{w1ik:zŚI+ɫXـ@oJȠ; }C?-(NQwXI*SoZ8NECAحV d@M:Ux۸u\W=~T_2yPAJ)~6IT ̢5왹Eާ'b۪aT2I@mvbccQ5ȉgl\v\ ͪc<͛j׎+Y8wg/&,b"Z  RXaEa̗QŎr}|/u*$̜Òջx 'b"_Ć-DS $IQ^Ә9;qgOթEwYzԭאFON:^uzjT*ˣ_FQ`q]&oЀFM0(}reuO~c0=ɒмic=Rx^9?m=˸Py'>߬wz)b=y3 QN][N{P.Ҏzƿ|7}%ӬICt UԨYq\WHۿ@F [=&YEåQX\;ϯ(j}{tzI0tŰnzuSWB>|Hq].n"qY9E)Z[}fi헾)$4ū`C0'yϙ9u:Mg/x8Ƣ*$IRtx^h;weۜX`ۘ9?ԏ9 ظm'vnWt'(Co9=A$ؾ1g iS.YFqoP: ا8z%|͎92塬N"ފ)b=ԓeXm'{v᭹Gwx~H;-q6>ys2ڹİ`.ì RBPD }c nc׮4oVqx E!c/̣kF_)@NFwCL{\&~v&h֬~L&yn{1~q~c~ 4삮/ׯҾC+.X9榞=؜|g t6;vbDz/Y03~^L$yVnԌ]Rnu"B9$,, Cr !'13@x837md#(3me۾#eJijl [Fon#J{x IPAu>0 Rr$]UxInw=JHz<|4D_JqN${  GC+JXVwێf*KPPe@ڧzգ " :ٿ/* ZqowA%r-`nEv.22rI^ "TmZРB:<PX Ǹwc]PYrHb#8<#eJjԩՐi A(J%>yf^|Qt G #2dGWT6<'rH'(e$R2` .YlUVZjT\&AQZڑi8#?%H?㑴os>]x^nMq`˚cEK:t:Io)]䀋7té(蘊@:ȩL3ٸc/{cס#dt<9>LfbHV*9FUԞJ\Z*4bʖ$&6o{f[ӯMuPjLvvlَf4+;6mpvHL!_گ^?~˴2sT>|q?IHH(ΪV6̚ SHYi~V͙%'7qXLf^I@ѨR)Eg1泑:"HX#?̘c:bABaNœa?oᄅ:$A?u*ơ9c~chǪ'z 4MA$ \["UPg:s =Tfiܸ M4qh*nL]^\ 3F>ΨӺ@FXE>[}2 K4iR4E'Y TppJjqDWM127Y3tK׮t҅?YHB>cQ{.($3\Sȩ:Bo|cvWf)Xp790*2c(n`>?xhr>tr16{cZ4(ko!GKvvY H[5.~ag FD EŗrLCCBH#u֪ʺc;9sZ˒A>$) ^r.l!6\Vm]_˻eFPP]3 Ľ\;{=S>),- Aa !kJ@;BnW.NA;&{cqŕ|Ǻp4(r΅\썏ޥY= F[uiI^[_۾i#EA75/}K1e_i(oS0|{Nذq'\^w%H?v\N!.oJ7ju=na) 'TfjzzԬN*WD,0I9vWr4 x~Y,I:k0d1a<vy$IRbШi*W(4kќ *b vÆz:;v%bɾM6 j4߱0eV,V P=<.  />Em^.g<.*[سd6>VKES ݤNkpm'_w mUȗLՎE'6 NA$i֬%sҠY5ILPΒxnZ( j}_NƜd,5{ m[z6nh6gk 'P6;,_e#|Wf돱3_ mx<1 ,N;;x)Q^Gv7%M4aĈh\i>\PPټy9KGtڝn=W4 IR1Pأ WltVUdVb-,[6~VŊ؟xtBbH$Dq8'7#a)S?$$\A!Icf?0 Ѐras.mJVF J` UEIs#dxT; pe7u$0l1T.lի#`\LAem O?ߦ#: )31(X,"K$I҈8;xӦA|+L=?ҍoƄ7}+d~߹vLg7NēwK)Ms -ۦM~*'O['1 (BE-z>څw'pk9QuC;H;c&LQwOG2~( {=ߦ+SĻ2m$?@}(|Ţﱠwz/juWfhF}5"'t3_ݦ .ߣLxA!OOv8o1cOѤIZ>1[병^Ғ 2~5N98})cGoyϿ/(vmPP|YgkK"w#v,LF ]^~x}cHRp8NX+k`Hy;|l7Id$WU1J%KQBζd3mr#"3ILTL5_KAµیAjپff:zui0-͎K?^l$oĔ.Cՙ7'O e.Xu*s <$É%06ԡv}Ivm;;e΋֙WСJ >AL|s{hV9BAt.n~wQBV(߿N6ES>ChR1xM*E7O뉨ڙuR3Z%S_3ah`5ꓧ`ضf 5cmL 0cbZҹ0nnW}(|Ǣ R;wo4l!Tkҕi7>mpm2\(|u.cGZ>!TߺgnnB~5p<ԫ4/yʇpN67һMML4M;#5*J>GIh{yĮe;إkP5I*[uG~}?g ,Uk6`Q«λL_ȢVEhj]ӬWDkY~/-x#HG'䑏/o=Ic{P5ԏ/^ o?w+~ R^4,Pjy>$MAQ8mqFOu3n"ME!F( ۯi6f|igB\TpW?͚аԏ0+  :׼2 Y3/=)sx'kuhkݟGno"$IR$)^wl߇$IŊmʕߺ۷y Φ%mpPfm6hDxn]J$W.J*TRP ;r,k:_{Cpc B(!ݹX;́b~N EEtbAA`M0T \v8?ؾ-$ n~P CEM񫾇a< Zs8u8EUTLG )_3!IK/KԐ ZI$I$I&g޸iTU0iuֳe\.Y!!_܎QW{H5I&o$I$I$̦( PfM ]/k @Qz9uSxy de$IwJ$I$Ir%lJ&!J$I$I$I5$!_$I$I$I\)/$I$I$I$I$I$I$Id.I$o)zB~r,$I$$\$iiI!ܷ?<;֏QL-x́X $I~-k2|pnވVܧ}+$II$IdB#qT !Q8-r`ҊLHD4Ń_c3I$9gGe_yj2ҳ)W:UPBug9ɶmxGGC&E$I2 $I+Ӷ0guk.'1D]8CBowe(jQ+F H$y<.ܓ7D1vK`\bxDAtx(+Vd<~OgOId.IܷnqE!hq]&oЀFM0\L?4jHݺ 7ɺ/Јe:_=}5*ѯWwYzԭאFOj'K:iШ9O~:{d8<ѣ6:BPݘrz#I:u߼B+0;$K>B$}2As']Ozuߤ-oM\9P(xr>Ѯ}7Kfͨ]c֤`[ hXurCA2(H|0?N.j2Hv}lflݴ=p1J31l޺]׿YD(Co9=1'dm*yj rj}or4VMGgo8~ԫ28z%|0wcλxy(S1(mJ߲a+Ujs1ع˾dXp,0> dlپZvt;[?ԓeXm'{v᭹Gwx) aƔ7u%$͛3?~RI݉ J#CxLYbJWTZ+CTl9%8)W: 4ZJq8Ձ{$IL%I($&'UʗbqUhP!snyNb\!վ >O?I5q_xg^{sz%L SPsJ5!1ee䪌xqT&&tkd4FV BxzǣT tkZ`<8B!FfQ,X<8·sN;Dx[ߎ[A8&nmR:@O'ʔD-_(£([ZR>&;)~n7tΊ-{ٺ$Ne1 gN'͛þ=[$I&$Iۂ#gic gR}ѥkWtƒ,$nbL]^\1P5q&4iҘMdJS9 -oa 84g:fJ2 Jė ?EycR4(Q¾Ur֟OSNU,Y TppJjqDe8xN ֙ӈ6*B῞$I+Ng_" )>N"%ѼQ\E+ױ1-̑?M%la1M:Ɏylۙ+dR,2HFF*y$I?J$d.O^zYߎ4 Ư\BvL~i.W. [`5@! Z̘:[ pƥ( y!(-ь?Հbc*7^5E3-#ǝC u,/7O&La=P ^$e'ѻ54IUص'NSIxFHX8@x]d0wݔQ*}VŖW'bb*r7-ͣC{1f:$IBj~I$9Ko>ǻi)(5JfbT~biegrډO,ۖCl@U+Ӊ0ofopsL([:u< l<-McN2S͚pQˎcXh;ױ4675,| $Iz[ AV5/>-ߎ(PQ$i͚9>sOrHIu*Qє(UWNJ!Xt6Aݒሜ4rO9Kr,C1a*pdǏ'׍",ݷ~$I?X `Ïҭ㵼}`hߪGF4H$Imof#ߗu@=dt=!S߹Y0cbZҹ0nnW@?_(Zgn_A*11'-`pv^#>5Ubȯj[PS۷7y\3&ȯФRUc2dA>(S-{es:J*{СAQ36ΥfJ+@føBRø[xNEn$~XR3̝'p{sY!6>MxhŎa|YiT!%9Y89ٓ)8M+AD|~+D)lv!0pb>k$I%ŕ)7́}yGxWBpi#y0 I :#_qoAVOx{%ѵ>DϪ$Iǎo LrRDȦizlܰT/jU&28Yؿrٛǟm9g<!V+T%V\cZ(_'xnDyo,`$WSSRFQʔ+jEQ`rbJ*$IϾƕ'!gEVpI~ÎU$5M@w7mf$4BU /YIe GsæqM6Tmڐ`N^iQk.T abtl vmDƹ߱P:E&$\4tRdI;%9Wn.y3^I$IQîOڍQ+#TIA떭hӦ [nd$Iڲi !aVBá|XBh08}*Kԭ@v.QE9544iѢ97Ș * /sO0,XVOdM?t4 =+ d[w<]:S>Jq!sQ㏍݌7JM?M*3~j޾ Q5 BU(L $PȧəwDT$JFUS'NGFFPd`wńa>Fhp tʯb;e6}4xt?ؑm\.#)jj<]F<&j ņ7c{!3~3!ݎͪ;=ĭ7 I<^l[<[o6gbQ.EQ4dD"txy__* Eq~̃ |{8gG[/՛ܹV ,$I$IRVN*Qv,V.7hU^aa!ءJI5)0 ,^'ĘPZU#"(Px aN+\Y>Τ͙ 33.gL{zKY=c, M/Z'oQoŔϘw( v8~d}[HVIHeFx|<dCf׳'GM0<[.eO 4CJ-h[/yDtDφ]d@lɲ) +XZ>eM]X< Ewd /G>A@sd2w[Ⱥd ̣E~Xp<ҳ_HO&/GBxXt"_ȯege`<GS5.fU@i*?( <_}R~@>_E{S + iG9aCM4k Ų|vV /ǭvK/-ɿXv ߃?`ƪS~'r  vcs:* / ~%=W}\u{;O>ϼRU0yvL!@Qe, l5X'ܸ,8vT@b;j`{ AjnRb?$I$I7á $,"jU+!2"C{x|T/WJ"`sѤf9DQ`捬]۷"kVDX>HvnULj"Voq8.-('T¥ClUs&r^䝼2h:u9}U!%5^~Hw^t=ԅZ-:Qe$lEu Ba l @1K#Fcp3n2~6 ^||1w߀nٕz-?~L]_\>ԃs7KܢyPLy9'з-S?-Яui"?\ W!!ӇpM7 @ڵx7!<<z >f-[^σ˗K;M:Qّ4&9C_5 xru@H<KGa A~ӰMv,\f#HZñT Dw,㾻p2eABY6=Ƚņӂ $|Loa34%{`e\F=ë{X"*Sl(>ve[PU՝'g;'Xw8 +$^sÆİ6s0s}N'o ڬ s~~ }oU%VP{XsTB͒VDv$Ѯe%<>sL!(Ȅ iy{ fz"w'W4.U}WGWOagȆ~7 _}7UtS!&㏦q;_3o3bT3@| 3TSpUpff/^ʥqǜ۔E7h;67^#=_6V/&`` q俟} V~ѯH|Gxƍ`g=?}ǗcG_n?v%\$I$I .~|.ABnf%c괣k7nBqłJV,,Ciբ1V͢w׎TP2%ct2321tp}Kd٬~PT~es䘗K0~m[8LJ[cV8ދMưBΐ\e?`RZUUF7%0. u ߝL`t߿>=qN%z{(Q"UUTl8. ]sW,ȟ1Ux')k &nɩM=bt2L$L"iXVʖ-K@׃{|;]gԊL^y)n63pIQ~]:drlV 6 K 7,a@xrćZ!V,@FN& Džn{]t}(њ(((^7-nN쑟9]'}^qݸssAťQTD..uvgѻ3_GQgO]?e+b8@!;ؖQ1.YȢ)^۷l'rYN4,I$I$jZTZG˅#8}*7,_7`@|6S7PL:KbT*]ƵjS\9B4E$'# =`up`fpukҵmyƍHyȯUvۧ8soGO'&CG_uyP̛1/8vp/ʖTFOmCU,Sb9NήJ+Ƽ0vH) A SyMn7g/Y$-0vlxS%$ 7\]LCR[sRwrlbbv!㫯0o8ᶢ(\)lD8/ /m+W;z/{ګ'w 1'j2vvOfDGdin-U,~Mc8k7#Zqe l|@_zj2!eѲNi5y9'0 3֡m$I$I$Bdx ^= p:Cqaٱa xqv8*:d''k|YYss0<^r3Y u*Wۍa4l؄qKXC^39Aډ1Oeƽ e'ߚ1p8 2vs덜S,6[qR}*∏8'e4>]u׎̛Hj;)Fe"t字c˾bo:jqk_܍Q/}bD#dH?i\GaV+԰0'Is2awL7?9+V;̝,_F BPtfSTPUjd*nȣ\"YԒ\"|~Epvl0t=tŭy  < T2y tyѲ40 0=/]@x;B4XPTC¢ c1Ujc}{8#sozЭty=T$"|;}ԃ5c{ǒ$I$I*Un!TtSM]hx1`X VT&ێ1i9'~'ѱumԋ=;pv-P\qʖ.4gd\n_e iN^:u77b+;4S'ӫ?>Ih}8]fqs}sp,jס3DnD W\3P'>Kys׭-oina:o؄wW5toe)OߛD#_5kWpyoH]ԯKkHJ;d =CjV5jPI?L>4M^{%wsssy'Lh8@!nZDUp |^C;_7ww_?5"='@x!( iչ3sG)u,6kWe_F[*P,+%ٜNf%{6Q{7.z$[MbbpQD+^_ӒC &̅hXv_Q‡'`lD#b~ WĨYKR¡M %Xqǒ$I$I:^ۇi[Gc*QfcS54 ?7zaN[oݔbQS4oͪPL,ݮkM[8qʇPjEG޵-,"^*Q-I "EW)K|i %B%oF>=<ؖwrTX'?ox:z{_n-0oMB2 \*>Mp)nw qB 'OGd\ywLA:!5G|"Ҏ=y(&}%߿LU[={nK|>w..Y/(ޱ?b@śurm4~:]W>λO3S۞~N59988sV'vxX^CZU3070MҪGC̽H;}|ps>dШ0zqݫ (栛٬Bl: yE{HLY!ϼHɼ+TJna{#Wyq93s̜ٝŷ%70` -QJp Q;FD" jZ$Z'8U&EA-b|!B0|m쵗 WIxGzsg4<8Å%B!W^Tt{/sbh7y˯Y=âEsS)NV&vA]J!p whR,Yl )#Iߜy)ba׋4Yp!AШp:Z mC2lwwtuv |w}ãoq #HjWnmBnGkaQ|DOE7M#kB!B<^g[w-^~v|J\jN32zBSY, B21^'OOzgva{9|bJeB!?|rv,?ߵ=_ !vz}D*li8ubz0Yv Bl΢)f(!B|ޯwyGASP CK/YEw\rI{Xy)rv&S(v )vt$ڞ!-ʄҢcly|IҰRip<ʓZ3Z|K+-6 ~ݙafB!7C4ᓟd.xYZya!fk;yp!=x2F"CWzrt I4c(U*,^>qK934h˻BnC$xf\Z$:zXG{.ŞLwA Bq 7d zz|Q#m&ovnyxeK3Y VTX~jT}{bE( &BE?s)<@*mdy!!\!nP։'b4R΁=̓O0vr+SS,JShR8JđCcpU!7x}IV!B\Bхȑi4U!\RF8/ƩGi2Zn_(j`!K=c#L=}<SWCoB!BהbBnrRLkw-hZJa$tv>%v$vI!B!zEҩ$ߍ)`\4#iԫJގni86AqGQ')tѠԘ⹟=KOXZB!BV…!PLZʶx޹dZZjoFSCg9;L޲ m RfB7M"Ec$S:uQ2|ǣRblD!B!4g٪eHQ+ch:2I.HddMbzb+  tXb9 .`0s{_9sk~<зظqc4l})zD2 !BHB[ԙ7 e̤@zx BJJ)l/ %(W*O\"eebh"cAOb%qb9W]CWמ<*B!p!o;̊":|&CĠ"k(bXT0_zUwwu]]3 $,$%{g@j}>OUWV._Fc 3חxa6G@QTWE"dde` 4F15\4x˲R$I|0qC4LcPи ۴InGĢQjjjj*+9lDUy1i]ƕQt`voۀazX|^:P\Q'RWaY {i%iVңS[cHy!>%i 1+T LCA>㟟BUi!iRVY'6د_6EQ幉pr<f2ֱ{nJKٹ /NY\.|.XQ@Q$iYhъl.tp9ageQ^TL6aY>2Bx$7&hj%m&!5| Or4iBaǶ|-v/"3 fya?pnc27x#N^69M~!4nі&siH0MEUuOh-iI nI-hټ)6}A :t`wqFA/(2axztM4 4M"$Mab4f 9<r4@QH(ahAIeJF;)74c;x쀟|l])X !Bw"d5><]*I<,BU(T V4&9f$iНRu~#iܤ i~I 2ܙ51݅\Nqg[&%$c4DJT^U+WRZǡѢQ&9gN_(J")'# I,*صk_=4H4GBJv Q1ǎᇤ(j$\heY MpI=/vBBu4e!d}n߶C~&q БHEBhcXҝ%,2}>-*ql4MqH ;vh#ukBëHē^ M[uwвTTG)NK]IQߗ9Jk?nYNH RSN^v;u~-uD5* k&uq_f sפEePEQ/[I'kbyyD"**عs'999L$BHp`E-ZClzp3W4=I BH@pT)j$\h:k>5Dp(3$+oOٓ_`CN+yy jdҷ1]hMd΂^ᆵM~ןYSdV|BhD\}  Sn8'zmj>ĩ~~o07tEfLKT8^.f{%+낣AQJ**W\BrhѲ5TGc`XHi{L~?.h"%4n6BEM) Mj" J+$RTGdgq,9?*kTVU0%GuI$H;=r8M :wNwD3&lqof[vgW3siӦ -[!Z6kCaW27 7Я=EQwm[ضM"vAaQ155n o٪9o~jkk$–C#%LHLSdtǮc1]_NIo$D=;Bp)*ռA5ڨ{⦿=sS%{| ]up?f BV8qwp~C>gqӽwpn'ח F|Sl%L,NNHwBg~Zٺm{ַr2s8!4mJ"'RJ8X#঎nCAB7Rt ROm[YleҖ@PW<-:thϋs˳ɢw碙^f1~gy%cİ OQEׯm[8!>׃-DEƍ"//`GB"G'S t잎t91Nl+kU;W1uD^1$[?7 0㥹 IOz}0\rXZOVGM/x_8UUj0_=;0eWZ S6 F=rf.KUԆG xzX$%iL$BX‘ OP[86ұI&l0iɄ@㔉F5]63^3xNyݗ<A4 N/)玸'ۑ(3')i`^axl^ R"D%H{Ͷ}X^/I VJF[~?H fK/"mg_PjnVҒL4kQWW^{sz$p9X{jni)^HZc05+&~r((ÇH$px2ĶmxLF @ Φp?͛4&*%z*L09k&KB;NY1xϛżf3dEs[-W!YN^x0{" Ìux ܉G#Swn< xE6*n#"M:6y-c(E{*uJ_~Jjtߛ'hBE+>kI$u ,Im6zp`kzv4̜0n+y.AlVYRA@/3k< y}.7,+{&хF]:7shWui VXQ~Gô^aJ& 0I"5yLē1jkIY ^4!%QSEhڼ1?[’Oއ)N' o۶mtڅ<])*B.EQEYv-3gDJeYQu{L4)FyTWU`M>;H[+X%LGX |A3#;y3dsuc"=gMfąCyKS\x,za*.*dW_s,~٬Y¥xH J8h'&3d9D]Z|Ϊuظ|=|g'm{⪡׳&FĐf) ~#9H3<|NR0p }u$,HKDұ'|mRw<F+ֳ~*vn][>vعk#,TG'e{4r21o#/_L4?]/ '̵׎څǺu[|Ȧٲe+6ldKл} P6?u(rM7bf/u]?x۶l$++c p'dqᅢ][m"6 O|Js6mW#jcԇp0۶K|%KB0vXz OO OēؖdI%0:j;Ә{ذgɟp 7H%Mʒ9&TZRXO="{zq!$RYEuU5hX8QO;nBZCcN?e)h[npGJy_Z86 !MIie9%eVS\QJYu˶=D #-,FvRP]QL" ,;[oXxֵ z.]6\QEQ}nt]sÉMOEMӡ e#24$3{IMYE )v"nݸa;}O"x1D-+?W]JM̡Q {QFM,@)?s~}2N±i}I;/&Sr8U8kN.Wr^]@?j3MAH4H 51[:xX_{Ͽ7E$j1L%%ky 2|><~?eHD,RLbZEElӆEQE1c*nPI#^H#ckkI<~"iiadڄ&fndv:֣K_ ̷ӜG6=[nLfi>o\~J p)\}"ʝ'dy R'sw˲R8N'Hs$xO3f;".&֕|#"I 5 .ҶM-!M^a?h $bFܶo8䡦 פ8SXTG<6#lSJI 3͊RI)2jQ(JUY4gr4λ/ INV6=9CQEQ!i} pǩI8unHŢX(±@dx")NtWއԤ}dx%oʕS{M< <#*qn;'.vwm#Ԭ+ 4{$/.m8x1d=r |pRܭ\gϞ/oc&+Bk53x0%?2#0پ~)ubNk3 񸻊m> rt((k.Zj~pFo16˅ڤCFFM`;eEx"{Ȳ'^E?v'?%bTR(dՌ֕ V"Du ôx=Rd!}/^|\jwFbذadee[EQzN}̘5?l^pN9x C qD7|Oba6EQ]7h0c((a}^6Mq:#8Mq|XDK&O}FC0YFH 2ذm0`p' Z2 >_.%SzOREQEQ%;;^, B9U$55n4 +J&"8NgR!^#\rɔ 3't|c)~,i:uOw)6lUWEQEQcǎwyζe$xВJ&ql Dqa"5A0(=?= fiML9K02"/A=(e~jyyyTWEQEQSnOrqc<w&4M222X BC iDIt9,ڻWw؟WXSoaOv.k-?ASs4X_&ӦMEQo<ϊG1<(;(qs!L{vl7I(4&Hl i'LS]Rᗔ)ɢ IA ,SʑZV&Mܕ?@r8XN? p8ZŐkE3?!^!U19M8+d3Ǔ:ޭC|[Bk^ 9qPT ?ϱOQEBAdRz{K HptwǶ)qB JQ '!M qѕOVmt:} Xn *k4 0`9l[u#I|s6x .SWm$; Z MphÔW^gd<#?}<36jYf5>-$+0;F&g GCpI'|'h#f##ᩩM^͞J ٌa{#//ne0i eE̜)ScgM4Ks>ۙիu7g,J0#S:&a'mhn$5GyM;+j:(I)a݌62re`C`ѳ{Y8o{ŀ^住K>x)2}gгu^`ڿQiyg8|DB@uM^ڌ 5"z|ξ)rо \?5ϞL^r4= ףӧe򧇋x|U?y\/)3OKSػ\0)(O<v`~& JBzׅuHh:,CЄnt֚_yG"i𘞯=e[¦Q۫񕾶NmmdY ^7#UqRq0} /u^ i]Ȧ6Ҷ|8o)]g-zR/^7Swr\v|)(5(JeӺWm&ҦٯxOʇĬ;ٵQF޼{ {uǐ]qp-qߴ =NVߌW>uy<&hNipBӨqԖc׮=OG~EQo\mj4h(rQWӦa"5@ HF2q¢i}4۴bѻ AoلrPTWEci-y%՗_!ӫԦѤ5h1~u\;xv˛6N[6:w ;Bn,|Nw_I~|(Jee%$zf 4i:B3AB$imcۀtusbןߜ!3a~JkfzI;զeS'ïaoak5wAnov/d^e8ehڵhNG75o GӜ? ኢ(=~5{L~wE,gC\tҷfi?ms>`xW\z;n5w&l %wJOZ%kDזz~_ُ#p- OCxˈ ΟEQs>M4aM"( TJDTPPЃ E/, *E oE5 KAP=\*NT^Q:+W@ŒegO^oB?Yd T!ց׃< nAQ H{^W&o:沷t0]wkW9Mry{J@km{9Awgy";zh&5$֥pZXvj9ܻN?}NpƛŲs47k}dFE~n=1=ZNkL s*\AL?{qܪ>ϱ\cp[ @vcq>~@e_=b lxO w}k;(W?\J8>2.DDD`lZ 8^alQoHBh[Bh.FTa)Xdgћ GJkf25Iug޹/;`b mss. CfeWaB`6 BËS85?b.KOxs~-%`$ͻhB !~k{C ϵp;?J<<7 a=YJF؇(~S?ǔ}8"'{9GuhaRVSk344fr"DaPj׽ӝ}w7iY;%V }q7|.^Y?]r?ZIJM<߫1w~{Nש-_ȗp5 %3Si)YoܧJ88J8w~Y+?~5Wx!aTvks?ź{YsfO5{or..m U Z Ăq?pӕ-,_h]nĂD ."HLқ{i$LӼ_=,<µBx+,gwzl \nM~Sn/4nAyQ_ y^ՁZ󊶎@w{kT±<]=zrāe:iGs {VfKD+e9'e9ݸhQͧ$QunNNw@؎L嗫=6p#NNWm;uГ'`;TS] M3+o.cS22FͳPbABwtJ덚j܍gK-i+S*]T2;yƘ[w3k,SyzF_rY+`=s|:R[[u et/0 @XW,h5juYk$͗|v62R3'I؎cmob#0c㿋rNqB(r:5z\sъ265jc$i)$Ly}7<ɬk55e>XX,*V(oߓQiwmܨ)uv Zm]`7<4V@N );5<[vihN}|LˬDXN8j(¡t;6)ZE}>zJNA~K߰Mmy{eE6`qb`r  #fs^Q״WWw51$ (J%&盻~s0 Ȣ[9uU]5utߺRJvòm ,d&OL{q%~L>]q;5= G((,7(qtQkZ7 ;%Kt2}c.'GׄpvowS墒‰i'j~]7g"֗ۥ}lqH.~wr,ӯ;^uHh*. M0CUǃo.u'?"((;)4%l,IIjG߾7|r^—FҩkgtD i/Ѕ`??EQ#t)꽥d[DC(Xϓos|&1:rvpE=i޲';u>]ҥK7|q aqVLҳ{ХS'.gvȴeP.u&ݺv{D\k=Wqjnt~oZ&>+n>}V"y﹜4&l$ct]pbnMSr9W".qsm=o~-ZKEQEQwsR (wm0)]8-t ]ٛk|wJ/xB~: vP˸ ꤔ2"OeKϧE1̙߻W{y\{]Kw?<ѧaZjX((RZ 3㉀alu1nW̜2zi4Jqۅ0y+٨zN(ډf"JrϒXyyӴ8E=.%]J~++lAyI ˸ɿQψ0cDwdj^+]Ӊ`,LrÓO7qm DC67?p;+L g~6EŠ DC﹅&h[8'wB39 i[Øo2nT=jc3:p?7C  "0w`JץǍб2+9^٩L&p +`ֈ%7ws!K8J:|ev˶ضD 8\Bh琖CzDAy^zFcH)IQFn)DRIAEaq9GURxIJԜG'{Nrsr޵si[{&&mj"8~$rߘ @i-q9Ķm|z m,8y8LiI((k deAmfbҽ:}=> }o l o,ZґӻwOԤ)װnZHBԘD"QEH܉nKå5񶱑3vf1DG.M[ %(( wZP " ޓG ['Kcy4i ,%/T/1`b\cą& @vDcl>&QlʳYW}Я"Y&GZ2L?_FNdԿ1X0IyI11I\8/Fytn1=r*^@,HV*}J⢳zә7g10U w~;4ח FhXgN'wk ?T[#~eq0/sJnYIJZ+)AtuB(FT))*"Auk1my8c?w`v^&1e*fX˂kb[EQE BA $$BJ,&;'%qVNN[Khظ[AOH"1͞-ٱa# :w&%Bj 9!xNEy== .zxuGP;KCgQ#fZUHt{!L`"+].sF\ #%q5_sy0B..[aLPُ߲ @ԎdMUn4Dlf@FR8M%.7XQjZ>+1ˢ[FKli<ΓNJ;0ۉ4~:Nlܳ漫.#aْL=s=ǞxS5OQEQ;`z<@C,lM(]{1O{?-Y@/%)#d,]tmך5HӔ'^xVFa` / qݤry3IKՐE%u.IDGd@,M< mf%5%BcrJbY'`A=q9"RGMC2gr:aKJ+ؽgh~S2gߡ((mlߝa$!F)a-as%.A]֝hn$(;ׯW^ǞIkF̓.6 +NYuې)A}FIvGo܀6I "V?=: _vGŔ6mG1f^|_xf`ih 4:8 y!QPRp4ص הI|ߣ,`(DM2@ ܆A(!R=^SѱMt @I!%RH)R4M~/];]?)AQi!9Br _iзKKm$3~wIQID؟N 8Dѧ((%BԔ:Kxn-_]Xd1k-0MX#ww6 %N n_Q)1@JDJ/_'p VXeHp->x3>m'2Ⅻt:U91vG?<e[NBMd !3c87x5n,3D?^7uܱiu2URFvQ Xa[)$k<ˤUV$'slF!G((N">B $4)1C;9mٔc{5NN(MKf-߁;OH' ;>1t4+$66Rg'sy믷ROR6w,[lGq3#t?R +p-,fD! )Ĕ6)cB߳9 #Mfl, ;ۅ[ip@y Ғb"2e,cŸ1DoA/PEQE4$$ !M"@<$5hN4{Xf%z>zR*99[Yz ^ѓ¢݈:[v.Ca[ι,!c9쭘 +v&b Rx) 86zv/C %ST ' ǭLBD^"1mwQMh+HĊqJZsl)=ڼi+u3RJAFZ %"LnIp3D:Bb P\ ChbYQ IOO焦}N=)(b_D &g5ڼYiSLEy!2"9s I50RSixb'L .), !h|!Dnk6@ LWflޣYL>*U4!"Aτ']"h)ھ}'~| ~R4qF-q:Qd=,]5s6vYukپ@ĬuY͒;YÌ+Xsuh}R{DEQEQ ]GR flF,]d,;DޞrwfcZn^'m)ROr~VX[ƩӳF([1 0Sn{kh$%TWU%1E~RrCNIk%%*rwyܲ,|^MaAEEeaeaE"|;Q$efU[#RφR3 Ey ݴ١0;wgmnsWPEQvW M 6B- e[6W]4? 6&)+al~_~ OhYQ[LIJ,T%ܯxx.EpMw׾7grKcň1#Z5bI,3m<,Or|@~Mq⚈wqoS%nTkƾCTrWZS!q<5gN\wQIs&Deܙx~q*NH*qAT{qj_w_[rָ*"ɟZh㦭$xE|;+>|=￟–իeb1n7Y $c݄wlĕV~RtEvߦ% 6d=($8!F:.! #h2f9R;z\2G@@fж\N7eHr%,o 慓iB'}ul,!j9>)IxZ#+Kw-k}!mSch:nʢ-⁖9H :9뱤gУN+49L]Wٵ {+ww|76v"pI\Ѩ3;!༬\פ;RT/ mt,is>Op Qb[ WqYb;JgsB%eHTZVhGçHs'VǛ YQN3|6'nI;~$:u΍ 'bC?@0oxz;8M0#0Nƹ *0#s} p:x}ߢωئ;>M%C(]>gm=l8y2p$]5]B\/F g^Y3Ns\xsVvֽ918%ۜPI?2 -%Z]@˄zz%-cNƴL K1~";w!-=]םHzp;2MB4DDhvdg6(n]K/׳<`R^\nߞ((mkw!:UUX6zC׫î(޽nz_(Β%v h.GhQٟS4MQ,#CBGK$)ăf{_o(66HKNr8I^X]ytC%bݺ[;1۬C4ZNI= 1i9}2nJN,%Xq:K kF2̝pIM`_\ H%3R-}qI%$S<vRBRq*bap}q3 T=8 jrGpm!;ikpo뉚h۳ " ~Ih0,EƢ>a*=:Ӫ ,ZC7r-W&+9GIf-XؼWPEQD5!!A -e4we9@XסetRlߺU9RO8 5.&&>SHJLHQ+N=OӶI$#fZhf_iJ FIKS/O駑EAA) |7}8. xSImْY;xv^ 39f|9ZޜѶG,0v|:5R"&$7r'I Bp|Rk8:S6]Wk ~GVCQL$;'C7u8S$m3-@l[K{GQyH!y{vӌ٥|;q*7zT\…e \.4MC4iREQ@CQ(+-ôLA-R <=κM! uHC,Elʢ6F$Ji"4ϭ2 ׫GQ D$f窕lYO]1Z6ĪP? 9!8ƭ>)I#B0[i׮'fo93z_cK掩dl,$Ɫyt,97:ʻN[yU;G M; e^&g39cEzyK!|EQHOKg7,i; /![JMc~ﺛy+,efn@H4+;^οv斠 Hs/|bQ(^߇CQ4EQH8J,2-ؖi[ N-ѨQcSiX':4siל:D.ҰiK[xmvR.9 .Wg Iuf&/GSuAU bG 3&/@yI1`v^Ša,QFUsa @DHJz佗0e"SF g}~ֱWm|1*;e/8G$ѿ; y+蜔FvV~^Լ 0q $b^Ф@6sV21gZB L޳[;c ;Vs` gKkog)?Y-HbLYuT. sV1)g w5 E_E9۳Eeɹֹs;-L^ƬE -*]v* ` 2'odyE!-La gv/ak8ôߧJdeqee{={AY|9={ؙ2**Nrb R!]X$\ ~Ǝͷ%m %EQI(h4-bIL)%uhvb[<$~?Z4^=9iӱ3OrJ:"agp4J(jaӢ[sv.\sUܵ GKIgٗImСGhݷ_܇V-qfR^RFU^'#x,.u fĤø >d2*m/3t%tYu뒙Il Lۜyg5s`ږ1 #ӛg7pu㓙JE`La!+0"L+q"ގ)YKRBfZ2|[CVx V`q*f6!FZAOޒI!Wo)5\Dxw744l6i4#b|'eoҺU \; jc3W FOcЗpQp͵yqt,{)#n˻_H{!4f9?}%U M#1|⚲W_Py&_x#|;'q`ҮUSx @ԃ}K[ ShH[ك8v|>89AHUDLs>e, 'sO6)K_' @,diewQ)+3ϧE9c rF BPb4Zőu"G1xn|~7t'}8JM?q^Kqn]gr~ouil*-q0pH}߆j›Ȍ1}"=^\ lF8@4!#=gOQCc(4GSm 3I]%S?3|J H#3vi6Vo݂Ϗqdr6eS/˘Ssqq$6ο9۟bwmj&wLažXpf}roΆ=reKY^Z=2#m se߻8kLeDLA|JgӨA$e@|,gڼ@3h׍>:A|V9_2`V<- 5xam➺Ny}m8|+%NJB%$'֥R$ɨ4vmcCW]6li6Uuh=9Шl4+Y͏%& 0d] Z`IOf?dѲM*cfDnJGmGf)>$uIO%G<=>NTZx|ԫOu$Uو);0ihġkcTU~&kٟ(ڲŶu -c#мn,)qa#[H $H)).)΁)bslQE"'R<-gtnͼ>Fh!fmsؽf3[6k9yc4\ex}>LmaZ&rouظ'–`%5.1Dž^y3C/GÍ_ߌ[j9G"@褦%33DĄDKbJ␒D?]v'r-cE8)%l  7yᄈ&}dfbDHy4T~{5ڈChHڗ`RZ8 '79]g ¿V p":Z4-6хNU^ͅi+' [$<4N] iCܡVgOf=%'ML\xٟ[36FSIRkdk҄մۄį<O.|yf%fj Z?-mLQԎ b<3a^/־D[ӌ}Hi9#@ 6@ qF%ڷwEQԝpEQ$ M [v@,P$)-tC` `i.lߎFZ1N;ZڄF HMC" PWYs703IMcҹl?OQV̊1*#椥̨16I©Әtk;'.? Q=>tn^yy?w_O޷39|%EQ$,_*u})7;@E9k׬dOؽkٹ9͚":Q`OEaέSXR{؜S@YE)%2S9u35j@Nm9I BP *g&5ԉ=@kay[' ?EPY[YS^F]&'zǣqxF\%6\T_ WvnWs?}gr,REQT(Jw? H!HNsI8.-G6՛HJ<vGc#5GӴNi|x:ϴ1~Hmt E#E9묳xי:u7o&??m۷3{z]ً?EQEQV]4e,d7)patT{]<)_ Oyo͚y쓴J:<Q%Hrf áK_#t ?{xwq=   Ә]E%?MW0p[ X8g?prC4u;{ GD?),+ArSEQEQϘmw=DVz :Y^W\O^ӢMGH秞eevGRBm`#HhH$ٖFV,,i ERF,p lWX4J4bbxdǝ74@č]ʟ_Յ!UKG%aַnq]Ӗ bQ4oǓܞz|Ĕi[,L~[ 9YiE6ٟ(({T4Ԭطϓ؝G oGs)J…Fۚ@JzhjbW=;3<~"1hEQv1i-cDcDq m:a ҄eD~ErV]y;8t\(1syatc9u1Òc"x5V)匌ք(( ̚+`0q!D"DS*3ꐛ[EW\O'1c8RS(z]JD9>_/W g2$+5ԏjyh6>t#p 0b06n !,ʊ8w:9I=hpH".F`co.1f K&@C( Gsld/:U)o` ~ks drf!XD5G]2˯UfsGgNjw*^N?Ey8󼫱&xAiH@j:` 4WtS_3\$eNd̷yp$Rxnt@7t\>:$!0@;hc &߶ E+aOdy Miă-m1?W?(}2I'! yt~2ʼnS|sj ia̦)- E q @@ Ŀ (:y2F^[3(?})ϼjd}"dkqml`I\ag|m 2oJ>#ė_dğY0'. !=3MF Ф!4T& 4݅SBkΝqR3Ҹھ(GIqDr`nwq+6+'`]v&ǵ%5bz6^iVo*@DK+|4h>g{ud)!1#aӣkϱ‹&̾wi=Ol]6dXswpߓɇ駹6fМ"а55K&:H'Rl! t͍&ܤgd>S۱0e6%cNt:\yv8x[/oM̴wWBeMՄG}J۴Bv˵v9CƮߡ- E*}i moz3/׋o6Qq1_m7rEx!EudVIKzMqTEhvX8Gugsu<̗}. @c܈+$ibLjyh| _O9gܨa{1vdOT"7ى,!~,|4%[yH. >?J?g-FJ 6P^RL ǜC#`|1c&!Z]fֈ[13W:8~!krcd3~20kF AX:j_'0ۡ[MfLZG41xMj{v԰S8fĎXgL^k{ttޟ}DQ^z 6~Uy>'"[71cP(/ae<r600p;Rב l! , 侂9H4l4y\]'=#=}y!piŨ6zv9RT1d&px:\t,gܱqĪ$ONZ/^E0lg 9W.b% =@x@cbԨXexClc `9GIyw/}j[7C8kcy90샻86(I؎q~vh/Rmx͡T~|~< _bK)$ӵ%ΏwKp<$|Ȇ"IU %(wїVDxdťnt)[N]!VAKmޱ b7zYY%1Co*҂ Cyx)|~vʩIjm*,ꤸIHN'nݽ % 3W_RIc>D \~:_//=ᯥ ,q+NXO``ysÔ /q7QB_75ѥ^0L72cAL=@y8kk_KGY}m&:EyGAnЅɐO>]dPyO<|/fE9f?IbbS?) S4Ty }߱x}!AH9^-%EQ+ KE;i ͕%m~$,_*u})JxN}r!'JUR}糠mxF*={UW><Lu g>;P :G]:+<5H썝Lg|۫!`ى=2q/Q!S\R:`C㭭'2qT,˗/@/Lfpc O_=3|{LY5i88C"Y0)ٙw!Uu8% j_'OY~>2ʗǝ2vTZ3ϵa޽;oS[MA{~m׾cMޟ=Q{\ZcU)J8vq4:2O9qb<^BI^$E yϐnñqǟ<ĊH*pJtш^}"X 83ݓo}((tHiBs]E\:>RIgTUA*@…,-kS˺3mL~,/ mm|ɀ ` 8,["kyOf=N S >&fd`mpG$_`*C 2uy>e\^tفRdKNTߑQ'+`yp̒\$ՙ0W%ֵ{ΜY}m:}^^S(O&4C5Ô1Y -.&b-!;'ӸQ}|/iq,yDMMMs6Xtp Ņ94BQXCj.)R[hXRnƌv( )%mE_Ng‰ O+?N5URƓBA,W">'!AxEĄDKbM Hň$x'iI)xTeKA$qv,7z=w =g=cǵ7@eP~ |^;.7z2Vmjsku!ζ0!wk_0NO $!!^`u-gMNHJKcЏ(* WE8h^[a<=n~3~Cڡ$ [0uZ4M q]b!V1v!O\~nI8ᜋi㨒RiҢ$?ׇm<7Vr7r ?}Ŭi,a*YkB\^ҙ !|⤬VS5!9mahoxx׫<<>%95u(H246h@az26VIaliM^y9ZPr8VLӴ% А!$RjNʶ- i F6F[7qdH@pR8(J4++!͸O3{*-{Ƴh:1_vCPќkϮë/|B?f¦&~}8O=<6D;o):,Y%[W^a[K%gAmb7";ΰy :5M\KZg2yɷpP{3%_ZoΘ\CSQZpə$BaBril޵rJ"Eܞ$J+VbIx| h.a8Mt4$9Stc_\}@FӅB !hαJLd7|A:vhlj' ׶wr Ru'\QE/ӗ{JNqxoq,+*T^XT/o:LE̦^n;{&xCkOB:M0&@WԦNG]liW>Jkڰ=hs݋1e];_97=i; W8W}l˫I|jjs}xݜx?8Zon>̵/&6]?ӧC;ʼng>_\E﹤Z}Ш2ҊRTRAUsRx}KOЭC[*0z`RCk_K1Vk'L^>RNvfխC$)5 # OC Ig!U\ͱdO1@!$X  8z)2~\ }4hR $hH;EHǏS+/p7X|%f&sk(]Q芔!D1 #ϑ.kw99뉟Ln14Ԧ~kk >xK^ﯣ'bՆy$=$)2%$xB'q x[{_{)m,' %)6ömH)RZVU1;8k;nS\\̩:$lviŕ7pyK ۻ:1.=NP|2+~>}BeJ:_1;5}FU}ڻBWǠHBdl52$>ؘ{/`9 2 6 ,1d2HBZ]+=1ԣ%d Kph9Uk-U$;zq^Ha%|/CD9οTO؍iӦ]A}`E3Qٷ=IskGIB3@E]Au;ӵ =@FDÅ,p ;挫bp<{ʫkHzKyj=/ys.'g|__]ys=$O"bHc/]Rzc8S)s+[Mx;=Q.$$E0XC\6@xLM( 109 \Y#"$r%:.YrcSGMr/n'_YD.r38ODCOZGyi O$7 X8 d,Q&X`ȑ,`@+ q` IOY3|4A\o"ڎ."g%"""ҷ맻NGwq`X7,Xz/LO10tDQ%,n X5 1.ጥ61t!3a gM{nᲩ3Hown29oX|EDMF؄drdbI?"=qD$HQHY,_3|e2fJ%UCX^9VutbY is 6!"Q( pXsB\q7Da<]*"""""> ܗֶ[҇>70u_3sQC/<" ()X 9?aIi"0$HDa E.8xzp\I'=%>Ɋ}!e,zcn8"OggH+_Y#i .πE Vhj5_OWQΘ!44I$HU,ZSBGS9S~l჆b,\ W NH%-[LNyUPL*SO!/.[z p#ޏ%5CvCtуx'6Of^{rX=; K D9Ls;~,׮v@ʏodllj"]#&"Xz,Os鹓ɵ<^3r}Fb}jn:YLfp CXxQ9c1\3ϟKS([MekW oWQ%\DDDDD&7?qo"Sљ+2|hڞ%pMyI$"Zu,ZWa<<.)MSNRp Xٸ_|Jz-p1Q'x,[I֎1XcH1\v ,,6E,\6/[LFUtt4+g>cDEDDDD䇗~pُՔ~Օ\>լ]7jk(hѺ)KYϳKTG&S^3tl;=DD!\DDDDDy8o g }xNM"EZZ[4/mm >xP;p Mmt< `Ѽ;z9=LADEDDDD$L}\~5̝$ ,ld[G||?Afiq/i)93+~s l({19sfؼykB}!  isGDEDDDDDrBv(\k-=HE9](XBB((tt~qx-y?þ4'ȑG(Yjwy'&cwv7pEqM7H$6Q(cgax8®8~vWrײQf!8x. pqu1}tV^Mee%f/=fQQe t5ZZZwߥWQc ?O1ħ`& jz%GI$x&N… DEDDDD䡇ZX7,`'8f!H9쀡| #_`؄ f:" """""qFN;4b`19#&x YO;=NWap$! 1FE#."""""t]#cp8"0G:ҙQYU"1K"  4YSSW\qB̝;˗ӝ! XA?l?~aS񸏇s[>ê2dPFB0liƌXvi"""""r-5X^I^yYtld8b/~z/4te6AF«+ H _:63ݽ2^FOMDEDDDDdΜ9ltÈ,}i!_]L[g@a /g\} Ii"iDa5k]_Yw0>9`2!}ѝ'p%l-=~7.i$&."""""6l`kؒ q'δ^_>L:AI#ke?0'{y`X77_K7&fgL|l 1 .""""",Y1q`"G&f Fۛ>CɓIL#pus䞷>o+6K94cOqbggfh(_}iϾeYGOnc/?:y7.徙w;o=-l-h\fý, Rh`Csټj{el9ظ/;~%B[m1lKt9:m ~ZhmmXT3uh)K&B3;/Ya0-Y¶,~9G~hݿe&Gw|sf縳5W=}3^ &O",lf o=Gź|k©'vs9xӄkėϜάcJ1-x.2If==@wÏ?ݭj~ǧ8yS.g$||',ZVZFm\v#ukRVQJ$CKc Mo6tq ֮&S:O:(/"'?GsS 9~lןYws]0 ֲ9:grB5a|%]8a< DAɇBw?9Qι89 |VZԭ\[*ʉ"kVimlj2O3Yl_CEl̅zL A0 $R%1vN{` 9(--cK-\<`n>d=`Pr1wP4TIi LQ–J2wvv%J] DEDDDDd}k=t\uvr22e >,)ϒb yOuE9 9}> k/bTncK0p`ѿ>\^9&N:p$ΚX3t!l1_z?a.aqg(5:Vw@u. Z5<*V`\.+~GUEDDDD$Hlmk-d ( r9߯ڪr>^]GP̱iz6PQJTWqz~^ZZ5oOcɇKXQWǪ5:|8J2erȡ|> QPj} XNl=kx쩛Ε`ؾ}p11k^c-13SϮV6/+YČ#٬~&u."""""SL*q \ŋ`X,ҝ1k`a7pߟ|D]DDDDDf?әkXȱѬ_>L&ҥKY_.+>/rWDXK1cGPo+q/oWQ yLiү:s9R4M,ͭXkfq5< 95Ύ6\pG2bpD|zy'8c1ƀ0HxG.D$)"Q -~\>b9m8Oҫ."""""s ӦM9'`E!D`4`-^'_(/rxE:P,7o^{UEDDDD(85#NN* cBڊd$꛷_ywqZ"Ȃ 7n,Qa0A%  V9tmAH$ ~eq󽚈*"""""{830a\NsX&[3lqP̙39쳻oY.{EDDDϟω'_7f 9v >_%Q%\DDDDDg W_}u|s[qjn6N9ODEDDDDo?݂ckq .`ҤI p}kq-ZDccc|jzEEdر|DEDDDDDtr2QQQp^X ]DOS{+Wb(9r$f,TUUQYYԷg5OLC0ư# СC(W<(Z ~Eq+h;HX$J1i$&L@"`ܸqxq@O&>BQ10e.Ov/"NtGq| DDDDDEDsa9ùK1&zAy>=.">o&L&~___W0cĉ?og'."bݳgf֬YcfGaҥ^3gn'."چ0glZ;C]]D"ގ~wى1$""""."N Ðz c cŊ,_q[p?+ a@."rk #%H h}""=qD$HQHdƘ5*+H 9ac`9H i||4bIZ>|+a/IT935~#5DEEDDМk#XcsCflRz?<3s9={SkDx0:}"ƕS>E-:#t}ퟝ%ܽ=֗a0 m+ysl ;y HQJʱDHECki;ihrabb [hhhhhxc0k^YOV,PU O̦Sx|AB֦fUE5cTLH퇊J@k I_Bv\K|_n;^Y/ayzBr^|CV#hhhhh!yhu-mNg`wpsoi-;H,j]PcX_KeU DPEm60WIƙ㑢jst:ٞ.m8>/@9[&r{Yْ16,ıl; 0.>_^Zɩ?DmB%t}m%l*Vݸ=ϯC-D=Z9^CC G?FL' 趋'9ɂRk8$o}I&.&9tHDqu-58㢈B8.#"1w.#ihhhh8NV+v]^\Sp86M ӱgpZE%#AEܗ3.,P&k9ܭ&Ak%#S2@0:1UA -( A_;Bu@his.`P|]vZߡ:BċEtz~%L:o>%t"tk\"HvZ*2锒Lҷ'#¤l TVRu .ܞ]1G7Rh-߸~*oYn kn׫ld#hhhhZ,jml9fa _'[UWP~Xz\$sĽ9 |:#Veyu~cuqS@=k)WPkpx܄((Ak{Jղ {h~WvK}gm#BFCC3eu:!(26@~=]"pʈiXG)ېhvr\\4}risNEEFYHM\@s#eڽjSRXHTdfMdke8+%5(ACCC3C^rw:f`h6ȌH:bT .`-{']yk2VV/)׊?}m%7d^,Xȗ%9pT>N)εV zZeDV5N+ JsNp5cR#<}ߌ1,9m(!_q7t=뺞-Z>9w:ka=-Z4Bm'$$t_#:ds+ xgrVVC莲P|vj'EccQR҉V1 [ ٻe#eG0CD_- ?R@UD"JO3o # `\2 $ftcY14S|4ACCCCBϕ*#ŤGE!vi-62WYg˼_v~ƃ;x^V/q3ȹm.gkɀh VWi ]=Y88zFu .`fc|K<2^. JږzQrmkKEc" |vpCʉ$5c[Z VɂwsؼSvΑ{Ճxaѡ LF3ll}A': wiw{W J #c13B9{ e%~t%$Тd;IOП.2x5%`QDzpxgr3lێd&1*0ARc-Tta@ap5Taגa/=ɢ&)[Gwaiq*ȧqAlڰlڒY#`/0+frߍs7r_6{*wo!RHsY5bk|?ÛiKE~d =3/IY|?&R.ZZr/+eooywǵg_`N>x+Nnνw@I;neXVx`] delwZCg0fTMtq<-:1 bc+8 IڏOKˠJ%Úݧ)zL4OQ{D8LX{QYo`ޡ&o1jh :^iQvݨn|;'ekR\d0Q szvFbPוͦ(Kт@rRZF\,;-E E|GBF$^W2=kq^<{9t+s{IGau3  Fv^r!{gv",%sw4._ώr`4lY]1rqc 7)>7VJ{yM>ĔbO=j5v;YCICP"R`d66<:!c?8P9%xBa@.TTU !w`"ѳ NCcrStqd!&03zg0/X#z0UۣXM|xKgnvۗpv,x+oe7z :?}@Snu;$<ӒHD+fz jkSQdI 9,GHhs;XfA((h) ny\"F%ÏD41%JD^\O^.$c6tǮK"]}}.i -D|{})0xx^|s iʁ^Q:b sPZu`ǯaxp>#垗7{/:]_KRݻXBK6~_\.Vg~ψ ɣW𿊁V䄢7.ĭ)U]R*s8/|klj:T*A?ZB#X-m'$f-vS >xh\n=<`II(^[TP/" ӰYts~Z,wCLz;So g7j*k@p̪( V/!o ڍEtՅ;Q3{fISVP[ۤӯR@dLPw'_-HCEQAQT"m8ˠ7[d]&&;`I+0o|F,#dX ?iO ^zĊR%wpBݣ`oג6` "N"-@ޥ2;.Kts_0㝥{*pt'€a3n[ΙǴ <:p_*.eWԍc|5|5Ofrm/3Onf0nK׬GX!O;˿{X0xWxOy<EvV4x!=EK {W)<t.Avd#l[Ǩ( ~iL+x ?F$AA8oqN-$(*,gtj:;PN1:=V>W:u"#:i<˃nభZ'{ТъvR9J&2Jmಉ\AɣvʠI"ml'TVK m[xnhbl,2;u&&*zY<*gh"#bQPu]D+* X*_=>XtOQ(e[ݢStl߱ɰTzw-h5Jl(sN/*-GSzщLDPMjٵy+᎙Wsn~tR[~ZObjmDC2za3d ؝l*P/M) Ƿֆ:̑(z*15σ&z$Q/INS͑4ҿW_vyB_{F>^V42fv˝=&`ߩLEtq" 'Gl5Ryo.ø<mWrnb7_@Ϣ Ewc͌sq9=(5yoYx56],&0bf;q (UY<!FXC{TxUUB&ˣ;?S?3:w|JxzDw b;3ѫW_Pģ\5 d_WC#g.Ig'guE!uZ paKi'P*_|;|W0ʁx>Wܻ4zh^H΍KYDccp:ĩCq8yּlTBD7M*g̮||`5_l|/Pzr uniTqAhhe;)(o2qu[.9 ONvb8.tDM]KXVʐS2n0y]i.}o%u)] 3"M^LNubw=r<3.h_`jT*%EȳBݑ=<\p.)ΥOGyIhh_z/.rofQ`Ϩ q |>9xN`0 Z=N<I൩@ey~Bq˺}wDݿ"˙ iǜgt7D[Pm '#2w~ V яEUi~^ &wװJ^(ײU<3.Z&c:Eǖc &tT;~u߳jjUbJ^7g W̬eoДW1r:B] O^zo9D@Z}С`a5ezx<;jKP0t1KSvy 5QIN[p؈LghR:͢ѧ_Z""4KV~4E3"/d*Mz ~^occz*{Ur2rzpA~z҉)b,;ޝU:z@Y%~w3ێO|1ݖ˾yeIoGA-PQEC$Wn??pM 7 <2Y<.ۙ,bxBw&h J^'IZ$OHcz7En}mJxl(ʩ^> JB#y&Z_We] o*G*t $dڭSzrQ8? \ypCu1nw>+x,bz~>}܎QV`s^#M[>ʤ/7%V@y-vI٩qf Fb1[)" | yE{k6r{Nhxq4-צyƒ2dzDu0^}*fQFUGʧ=>$qO:BWGעl;<+33kdloGXPKe$E*s<$)ty(-/۱;]k_Ͼeobx;N F9²_a݂s+ԟ^|`G(Fh4RvTF-$3 ?qc(_w=}- 7WpXL\u+ȮCfƣvj2h-acuRZ2P i Kq: qC%öaH9GzO\, ln?ZOpw Ayv]][yëC䣯&sf)R }`K~G)PJ<#z…C9g`H2ESF_vS/8W 1][ D} .bt8Nry{OQưŔ^⓿:!3{)Rl.+u.||=N`|y#8͌єaI;RP<-9PD4z)"m2d溷2 ?c#BG q$lwoz_:ӢE#vNi`|g'%\y1p^߳2[ )a19,ǛE7k+eNcm-?ѤǭcvXc'>8f#ɱ70҉ă2~X@m) vzy_3y/T>|UvB!g3WoB+9g XYշl,C;uaQD8Sв[Ӓ\K׋ ն4EY؛LB~U#/..)}bMzn:gh6d'pEj"陣9444#gU;p,m{Ǽ.z+`4m{߀^7V!0UvdJ͒m]9ʟ? Zֶ6,mvNw鳕?_^{C[o~pʗ ~kTؖnw.`[YX;_%l VL͛ܬ} ;UlWx8~/Uu#ϞnzLM\^<_; B8/oQw?>ǧ͍gx=r*\Y<; 6P?  B8 B8oH= {IENDB`revolt-master/assets/revolt-statusicon-screenshot.png000066400000000000000000000271101415664747400235750ustar00rootroot00000000000000PNG  IHDRi=.IDATx^Z PWΟ IH%^Uk;*eݮ];.GGqZwF.3>ǥ`AQttjQ $! _gn{{͚5`dr|!Y-POD83LB~T{QrY?>FY?8GPP 5L\ 6HZ/M=SZ|>Ty~OF&c CӢR510;aC,.79.bBoP]pE oVb\}>%mKS IR` CT?7ĤɓD"fT@lA%K_тnB $H a, ݫV&[ 5H''Ӷ<*--E}3g&P,wz !y6ྚ>COapPRWGz4lDl=n}HB%SHq4.Q[=i"#s ɐࢢ'--E'T* ,Uju񾽅EYں$ۄ ӝˢ%&Y,M uv5biqѭZ=吜Szpf/NL2"3a֝tW:V\pei7K0s0ֈ pRIC~ " ֬&gO1*R/511Ѿȑ݌ŶoV5;'LrKr5X䓾ߥk4ZkYʌ-Ogϊ[DK_# aAHBC`_ @SE\9N@W۱$VzᝰBmQ+. w1ZnG 6;Vɴ#@ܓ1 7/@"hCz cE:#4$AJu<-q@mf>ޗhkb>TiSÉrE41`,(a+"^t$$?2`Mw0 4[Α_'@@ArLY=L a9%dr݂:[J,x֘: s E O TDTۤRя,ÇO~PƗ;ΝV+ QŅjMAK-!<\`nߎ ̓gJԻ6C<!jM3> 4xt( C&[ÕۺMu<>.(Z򋌤Ǣ2?}*/dgK/>Q~ wz燎/`ݯ Y}囐``&3g/@efL)d~&`Ν2WoЈt~eSisςظG^$sAMjJըR ʄEulLZ֢wYXrgylBѸÏE7SM)a$h>Ymjzwy[-[rW3!D bǬǰϓJiQ q _C,g|k!PuOvt'wosUKIsryũ9Roܔ?,[-ilT((4b߯vo#>9XR@,AEf Z{5bBP.$Fں+e'[ﻷ}tfD3Nlgީ!}xx( F8awtt:˗+3OVI36.?L־~aHݤ3k*w~v_ Iۀd5wRvDrO XmN PNh*_Ξo}#ȺCw8_x `jj҈]]t.0(k{5ЏES{R}ܪdpin7rQUc%l}M[ 6z֪ݰ`[T~nI?g/B]+ZIg]AWBokxYKHvgΝЯM6]]I 6%|1O ̆l:,2~cX? _=a^域sQ_~kb q{~0G. gQߪj=s*DTJbUՕե U$(Y?~0_%y^E| .)fm̌!XZ<*Ơ[#Kzi.Z 鱐3ʁNGLҙpydYdۯT(pGrOуHb3 AG|PA`|6~2p]sUk`·Nq,U&Pc5e0mFA<:mɫh㚃m rϫ΃m?tcO! + 6nwν~T*W=pL!f9_?dT/꾏 &7^m};=MPhWYT* ?NA- qIAm0N?F@ygl (bgjd-3)z }{#k'j8w)7ORlHȼ5✢Bi3A׶{/˸AR)*׷¥JVTP%$؇\Bgwq oik-p9\y9\12vYY8ɸQjݏj@ABf'6A\ JȨ\\bFޮ$\/׶eqG6p@Ie\#YadAوYXE8_U ,VTMÛ@qћ8Dwـ8jV=KIT,{٫MW|}j鑕ϘqƢ[{\K(;I0]=.?1(Gp-yfVFRƫ;/gp8/nURnWu9ٛatgӬv㙈C5@vVՕ<JyVd{IDnhnÆr, e{ EAj1 z+{ܪ.6c` 3$32ɟy?&y|3_oY Ch{뜺K-R|]ιܳx딨 @ W! yq`xYQ]#Y8K:*ʼm (>Br$Cf8T!B)0<$k->)"(jE$xqh"[H'L%ra,| r*;`#HXAcE' 1X bEAkd*3a i/pqmhS[˒nUofw0R "S:=L5Sl+CHchͣ2[AAgas,9{RnW#O4a"*@-UږEu fq:XX,,lOGAjazL$B%䋴A3v١y(BS1FGYM&">=(MьЄĄvT[_iА5왥s bx'Â%(tELDDBQ΂F!w19}g7啡%je@B pܖ iqx³t"h9 QYt7jԹ Z:zix].gs[IL 4@*4N@̋|Xg-a3Mq7f[H>aT5Hɩ4j EA<γBh?H@%uc3ViAmGn~@:j8,|va&Z}1 d)i6 0 di:]z36xnNmJP81hӑҙXJ]NxF44ku=;{ZţݯT͔KEyiRD:8jHqt @.߶JQ.{6lg3663jo~&oܨvsYwL&WQN5 ;CAa)qa[KoZR~L x/뚎_*RB҈`ƂxI(-B2"ܺ*P<P[5W%"TH-!T=yrR:kզx X26a \sKc9Y5 f {jpbo_/7qo?KGTW.&hIuPWJ@HS1lZ:,R"gdl`Yx`vϞAs[Ϯff@D0 D6W Her%#d, UU>|.Y|~(Dˁ὚pZj- kI+R[|sY4}5A EanZO}x& byuU;fձwJX[M zn|q7WW:;x_Bܞ# :shF ^WF)ԹEwޥGF^(%ܹ{i4kХhu 0kBT>+W#A6fKxnq)}uŲ8w~{ s=(l_{3L2Fɴē: lM&G\xm7ȹ CgpkísB|MׯsF"VpnnåR Itf'>Xߪ)֏}a 0Çs~m<7 %-(RΤ[!)m 1Z{)) HdMآ/(ށOŰ8E܊2&Xqh 2flL" \]l!LD] ;8ꓩa-j U!BVeP<y6u➐8"k`6 N Ҁ$\ҳPfqig8,/Ww7?]=p+<0塶-X s酈9?$h-8Ka:K~OF )J&qWi<y,iCB<BY''yȕ)$SvAd U")QDps))w@LCz)Zko+%EgcF VLs]itCv4B7A#& R{aDN|N+hNXElvN_{(r຤iH "-HD)ONqBn n$q*AaJk'm8MN{:>qA1P>jBp3#>ʓFې"D1ED,:BHmc=.ۀz@$b:JHjB:0 )oX3S҆^m |ş'A0CnY } EO0u2:LMHEȹе15$sJ:A,s}d9X#җ"@LnF=$)Q5Q, @d:IdVG=@u'n9Pdyqnxd H.֍mnR1]D"Pg~,<<8qd{)$h(И&}Pbι:*XQ "b\:uK%!b(`ꃦy{rx@/%BЋU)7w4U 0Eo!DR<^rfB)2DM9tMt X=i.zx(4vDuv|kJ5CIT6NJ(eJ!nTR2kL AM$ReEGB2% =<ȓZSH<;< }W6 mH ^ oPc&JZAd;&4TJIfdBkvyB^[Ӝ3]vK)@J4;B"6$L"\(Qc eH+c3LҪmD{Iu,F!B>pZR) {!(/PSC-MZY\R.ylud3g.폻].|ŁbmpID[d3>饅ݕwʒ,|~"!=.#ng?¥LL>,z^zC}- ľ}{?;w1s/jژ_J jRbiHLV<5 cԇv={?|'  z|-5vK( ..jPjm C/tvPjajˡ"vLOxbUwnC0+]VǧС?. {%m14{z1`e{Gpz3sSC4w1C= :y{G7M6 _~}}qaq|h-\“E@:e k`%LډjѺK54?]C{GGwбj՟35|QtuS}h/,޼عws_UM,nW`rWȱcc9 GR|$2PO /xYJ,s&.\KBKR{M#W׫4KCQmE" n!'3@۶E!RVq(EPČs޿wG_M~x B:ZF[?Y]):<C.9r}0d{-U_ uGPo[^l(9}3.^Y\yc澑`6H s.(<骹L ϱu#ޡgdo>`iA2]bB;MÞ7o޾[zrߌ(/<^ΑN.ٺU4 +lKo@_(6?,㙓'>&6 +?VTωӢA(bb9n*}aA/K)y-U>|tJt_^ZRF 5Z.Ŝ Kko.M\?5]CzTA"{j\_aXLyor+cۀ|q'w[|~%J coܚ{:LўGwo}Ŧ[Du!OC@ҁ'XQ3nXk'< a(!^T`W+Jk^'?71PO3F?ڼ-?3dhg;['~W"2EMxC,"z<}su+DĿ <@Tg,bY." DTavEt,+Sv1~@X;_>u*ji"?_ q@FtvݖfMOR"=^mA@lZbQ*Aߦ;2ex=C _E)ۈJͪcPJ@ 067 H\JEjS8_a!2BБyZ;(.zx`\&)bbOKCNϼxSe(SK)e~aeG^@'"=+K>@Qy9g4Y#u Nl $Ҁ'L ʎnRHGDO@P^a@ZٚNRH1 6`G\ ŤhutB>E?w'Yl'9RBab+Ӵv0 j(In}ӝ@J[[EpKGt?Y.zxͺlձnwٌvyI]< # # Distributed under terms of the GPLv3 license. def adjust_import_path(): from os import environ, path as P import sys devel = environ.get("__REVOLT_DEVELOPMENT") if devel and devel.strip(): # Prepend source directory path. sys.path.insert(0, P.dirname(P.dirname(__file__))) else: sys.path.insert(0, P.join(P.dirname(P.dirname(__file__)), "share", "revolt", "py")) if __name__ == "__main__": adjust_import_path() from revolt import main main(__file__) revolt-master/configure000077500000000000000000000026321415664747400156160ustar00rootroot00000000000000#! /bin/sh ### See http://people.gnome.org/~walters/docs/build-api.txt # buildapi-variable-no-builddir opt_cflags=${CFLAGS} opt_cxxflags=${CXXFLAGS} opt_prefix='/usr/local' opt_libdir='' for var in "$@" ; do case ${var} in CFLAGS=*) opt_cflags=`echo "${var}" | sed 's/^CFLAGS=//'` ;; CXXFLAGS=*) opt_cxxflags=`echo "${var}" | sed 's/^CXXFLAGS=//'` ;; --prefix=*) opt_prefix=`echo "${var}" | sed 's/^--prefix=//'` ;; --libdir=*) opt_libdir=`echo "${var}" | sed 's/^--libdir=//'` ;; --help) cat <<-EOF usage: $0 [--options] Available options: --help This help message. --prefix=PATH Installation path prefix [default: /usr/local] --libdir=PATH Library installation path [default: \$prefix/lib] Also, the following relevant environment variables can be set: CFLAGS Additional command line flags to be passed to the C compiler CXXFLAGS Additional command line flags to be passed to the C++ compiler NOTE: This script tries to mimic the typical usage for configure scripts generated by autotools, hence it will silently ignore unrecognized command line options. EOF exit ;; *) true ;; esac done if test -z "${opt_libdir}" ; then opt_libdir="${opt_prefix}/lib" fi tee config.mk <
_Preferences app.preferences e]]> _Element Settings app.element-settings
_About app.about _Quit app.quit q]]>
revolt-master/gtk/preferences.ui000066400000000000000000000441671415664747400173450ustar00rootroot00000000000000 0.75 2 1 0.14999999999999999 0.25 0.25 False settings False True dialog False True False 12 12 12 18 vertical 12 True False vertical 12 True False start Service False True 0 True False 6 6 0 True False True True False True False 12 12 True False Element _URL True element-url-entry False False True 0 250 True True URL url False False end 1 False True 1 True False start User Interface False True 2 True False 6 6 0 True False True True False True False 12 12 True False _Zoom True zoom-factor-scale False True 0 True True zoom-factor 2 2 False right False False end 1 True True True Reset zoom none True False center center zoom-original-symbolic False False end 2 False True 3 True False start Advanced False True 4 True False 6 6 0 True False True True False True False 12 12 True False vertical True False start Developer _Tools True dev-tools-toggle False True 0 subtitle True False start <small>Allow usage of the web inspector and JavaScript console</small> True False True 1 False True 0 True True False True end 1 False True 5 False True 0 True False Settings False True :close revolt-master/icons/000077500000000000000000000000001415664747400150175ustar00rootroot00000000000000revolt-master/icons/16x16/000077500000000000000000000000001415664747400156045ustar00rootroot00000000000000revolt-master/icons/16x16/apps/000077500000000000000000000000001415664747400165475ustar00rootroot00000000000000revolt-master/icons/16x16/apps/revolt.png000066400000000000000000000013611415664747400205710ustar00rootroot00000000000000PNG  IHDR(-SPLTE$ 2#( S;W> _0@-)^B!###A"""-  CCC]]]  U""" &&&...(((aZRqqqГH"TYYYߝM????6*000HM8g8GGGΏぁޜLH5ҔH:::777ٿ###VVVrrr%%%!!!AAAۡzwwtme6(ĸS;KKK')9tRNS@vtm<:ؘ_~LnQo\ IDATx^mÂ@m{;6m$9!u,air&Pog֬})_?&%Cj׷:%9ƻ2!?`r;t$<K ?~k7E!n3H&ؑQ03 8|rJ&&`jڵ'8;"E% 0W:O.eIENDB`revolt-master/icons/16x16@2x/000077500000000000000000000000001415664747400161565ustar00rootroot00000000000000revolt-master/icons/16x16@2x/apps000077700000000000000000000000001415664747400210002../32x32/apps/ustar00rootroot00000000000000revolt-master/icons/24x24/000077500000000000000000000000001415664747400156025ustar00rootroot00000000000000revolt-master/icons/24x24/apps/000077500000000000000000000000001415664747400165455ustar00rootroot00000000000000revolt-master/icons/24x24/apps/revolt.png000066400000000000000000000025271415664747400205740ustar00rootroot00000000000000PNG  IHDRשPLTEY?  o6 CCC bE"   A-+ d1ddd  U%%%)))&&&!!!000///###...$$$P"""111zzz333'''VVV*%wwwOOO ---VOGܛL{{{ִnnnpppuuu;;;MMM+++ޜLߝMחJ񿿿ʾ(((_E%VUTSSSWWWxxxДlllsss}{!  FFF븸***666::: hhhGGGˋ9)A ˏFښKAAAZZZKKK222N삂k8URRR@K5q7jjj___???d5`htRNSP. D}KYCJuЁU07]/,]TE 1S|63:?jpIDATx^Sp$Q@&mgi۶mmm۶m|NOV*x[tUD/V$YNCoIr>Du"ωxꬻNhǺŒܤ'jI?7CVK~ƻ0` :cB˖ܔdzvTgyP뷨3@(q\$bQʌUx#鶦q%YS\Ji roaLBLh'WRl Jz6{6hHJa9Vʗɯ>~R 7Lr4=e̊JB;f}>t<> ݎ gΞ;b+W ,#U´Q6f80Q& 5BgT)'MޔzF^R@M15z >ENNc7IENDB`revolt-master/icons/24x24@2x/000077500000000000000000000000001415664747400161545ustar00rootroot00000000000000revolt-master/icons/24x24@2x/apps/000077500000000000000000000000001415664747400171175ustar00rootroot00000000000000revolt-master/icons/24x24@2x/apps/revolt.png000066400000000000000000000054161415664747400211460ustar00rootroot00000000000000PNG  IHDR00W IDATx^YyLw~fAA.J'YRvWnUfZGj"5Y5fuuz;Qz*jTDPC(3D7Ic} {̓pp``՚ UxBh}\`0y{.1Q!YZ4h0]ʀpLhPk늉= Wx^osH%''\X[;pب$ lEbj.71V f>=b28v1&=goJ}0B/F-',> / o-2[^v!ǔ^VZep&0Zӆv6no/6_ތ<ع C Ç1|X,hhhlF]]^xk1_ GD~Ap'q6=/_GTTa4°~+[m۶E˖-uPCm^:(˻3mёAHN9 7?? :tT 9{Hpüyh<|||md|}p1}PZQFMM Ξ= "..mڴ~@`DJJ۵kA%Х9<E//_FJJ @9~<|tq-<~& CLL R0 &4ne7+,@YK,QY v܉ .Z J 9s&U?oY[7oFvv6z0hʁ_LFC pϪ@P~~~رc1zhաfϞ'O֭*=E 9Պݡ%45l&s=(,3SXy2UVݻ(--ACBBP/Y'zh! ܘ&ʗ]|JJJh4kư(O>Ž{`^;婬<טOGL7A^q5fKm<PZ̙3>oߎ1cGBm_6#&P^^XU$F|lVeԕ"FMe d6lZڵK;ߵ& ;f:*5|*r Rh o~V{zzx_%}m֭ؽ{7bΜ98}44XC6;Jhp') <埖} 3yu |~N m <Žw[K4pY֭i$oѳ@W?77]v-w U -۷tp޽xN"i|TNC{8]x8z߬ޜYM㐢4XGNb,ݍmڴ K.4W +'mxtйRށ 6FRIȑ#D yF@jovy::"@930|gdK^Eth3fsgnxx8#`]oZ?` ;:%50+WdԎ~ &T+ZJ6TdFI(5衦>p]T,~qL:\ 8|q+c\_/Lk~l7yx,̼EXldfjln@OeLi;_}A~&-z ʾ+Xf L&n޼}Pq6mڄ9sx3/fM%j^ O8ĕ+WzjT*~8}||j$Ϛc #t^]VV1 ~WrsQ]QBN`%q .շ?uCML uwwSSSHHH@\\222p)>AAX|9t:>xPP"<~:::%Q0X~cp04Trb]$ l\Z՞)Ik3 pB Ν;w8݋TȲ, 0Δ@`Ń'} 1N kNF1ю8{,6l؀zܽ{ HW) d'JF<F_/cߙǨi@ϰ ?v[V,*Ƿu03` 1$=Z证vSpmLL (.pS=*tv 6*F/dIoYq0OFԑlICHUZZts?>R srrxBE3,"`;x xyVė'/**¿&܊ %htىe4?,YDN.n|x;88ӉCha4o|i``zN1_u܂ϷQ)c֯G}}='Ƶ{y,A @py'ѯGFF@\DBJՊӋOB,/"::ׯ_ *ݐV6(+w2Nʬ®] {sP{2KBHRIvo:aر%%%0&ېU%q :ILDʮ~deea!Aj%6UTTK,\}xINNV<sXoݺݶm8Ah{{L*fTJ")eRC3Z[Hxݺuu%%0qZvvP+fޘ\C&E@;w>$$*6$!{uu5+**JKKY)҆ׄI <l;Ɠ}49!d&&&8+9X 2y?' {_UA-Cq='AJs _Ǜ~+H"hDLr"l4EZ:V\2jsI<@,!:0[v+DXV qlĽXC\AL!&$f׺u ^'>w IENDB`revolt-master/icons/64x64/000077500000000000000000000000001415664747400156125ustar00rootroot00000000000000revolt-master/icons/64x64/apps/000077500000000000000000000000001415664747400165555ustar00rootroot00000000000000revolt-master/icons/64x64/apps/revolt.png000066400000000000000000000075241415664747400206060ustar00rootroot00000000000000PNG  IHDR@@iqIDATx^pU@("0B HD+hFj! l蠎<4EE MPBJ $$!=sL ?songZ"y@! QBTQS.PPW+c)?UvWs68e/eIq(]Z֐C[K%$7X K.bḙCJ߇.Kl'%H^|Ex\)Gm5/BuGJ7[_+Y1+ULnIHXq*̍;ʽDr2By iѹHv$?p.1UG|?y*#SR~YZY90'~<'Qc?,`ƍ2eIKKtëW{׮ezSP|bxh"eh1t zA >)UQB~čʕ+K%$$D._,/yJJWiΉ2Ur@v.탫JA`LXzȌYbr\8}Z@˖-o8xGd˖-/Jjդo߾d8pIե\rWTGw7jV.jq` SQ.\(TiP,[MW_}%r).Nb<}Q{IyUEeߒRPxUHUtDEEEQFIōz5 (QB@xDժU@F]%.9U $ "2R%NoؘJ}ſI(9zdVF 8hh *'>E ~DGGʕ+gϞ{n>}Ir~ HC}/CBQ2n8 eȑ`YtRX1B#r=<8\pe SNk&'O7V^-k֬j}7o޽{Ç6 r^ѺukyeܹxyF+yXJvE5^Q㛄F2zX 0 ARMO9sHhѢYTREW~"dWnP^8P.D #%K/RSS%YȿKxꩧ4šLr ɒYKz=֑.'_@ACGDDȡC l +{XY`qgGPdpa@Tll>-Z"i!l2eʕ+,@;ePIY\Bޢlv{FxRY#'RWl/,eGTR *T@pAoKll,BlذALb+rRxe"{~Q۝ B# !Q|y,;{K.qȐ!F5kb);pF`$4l{BjZxĨB $2<.bvɺu?۷޽{w )S^G`4n}伴~~ͮӒ[0 g}=z xeҸqcIzɓ'j)2Seg5W7}n9!-=Cn3koZ)׏iخB&% `k`ͅꀡ6)amE?.u1 /֭dqÐciTY:^SDG%Gd &!zS ߱cGCRrzWyk^l[+-\PU=yͼuxA9ڶm[ٷoH66jޞk+BX_C;Ic*A* ƾg}&M1u*qFzYE(UYϖyyUfD_(;vLFs[mJy;rN: .M;IU\qΝ^C./ܡ6mUV ٭T'h7"Z8M dϞ=Դ 3(`=\%sS1d `Յ)P9s&1$C1I 7ȏ?(Ec~2t@<~xٵkh{ou@b ʹ/e˖;{,2v6.h9-|LL .M5y:^p M1 LfЦMpy\ȭB:)+O@)4Bokڵb0i޼Xx[m2ͭbn^zh"٬ZgĔ( " 6HH1#YQFE>EOm9 6xKdomQn]fmNУe{I\ 0ѵeA;^IvΠ8qyxfr>}JI=91S \XU@Nd=d^WOB1Å $b޲SaVba8v)k~0^1c&_]˙3VDUn*(FD~6Ff` REebI5B!aQ'Re7Љ0=? NW^1#9###nݺo4iVJuW$ F*: # hᬫa|Q6b``m[Axu ѣ%Uz]v5G(|V lUX{V]>WH [뚤3|@xܘDhPmlpi# dƌ|{ ˽8 44 r S# /BH˩RZYNXc7*ðU^~#TW$00dZz_c15S&dkhvxƍHrxp+r3(˹mIY"8Ny(%)')^k K"v@ߒA9͔$;9~$+ƈstZ+_ ZQge\TsY47_UUwU2@B+#з*){9Xqxe*rN=(D! ?tgrzb6IENDB`revolt-master/icons/hicolor000077700000000000000000000000001415664747400164542.ustar00rootroot00000000000000revolt-master/icons/revolt-about.svg000066400000000000000000001342631415664747400201740ustar00rootroot00000000000000 image/svg+xml revolt-master/icons/scalable/000077500000000000000000000000001415664747400165655ustar00rootroot00000000000000revolt-master/icons/scalable/apps/000077500000000000000000000000001415664747400175305ustar00rootroot00000000000000revolt-master/icons/scalable/apps/org.perezdecastro.Revolt-symbolic.svg000077700000000000000000000000001415664747400326502revolt-symbolic.svgustar00rootroot00000000000000revolt-master/icons/scalable/apps/revolt-symbolic.svg000066400000000000000000000110711415664747400234030ustar00rootroot00000000000000 image/svg+xml revolt-master/icons/scalable/apps/revolt.svg000066400000000000000000000710441415664747400215720ustar00rootroot00000000000000 image/svg+xml 6 5 4 3 2 1 * # 0 9 8 7 revolt-master/icons/scalable/status/000077500000000000000000000000001415664747400201105ustar00rootroot00000000000000revolt-master/icons/scalable/status/org.perezdecastro.Revolt-status-blink-symbolic.svg000077700000000000000000000000001415664747400402642revolt-status-blink-symbolic.svgustar00rootroot00000000000000revolt-master/icons/scalable/status/org.perezdecastro.Revolt-status-online-symbolic.svg000077700000000000000000000000001415664747400406362revolt-status-online-symbolic.svgustar00rootroot00000000000000revolt-master/icons/scalable/status/revolt-status-blink-symbolic.svg000066400000000000000000000122221415664747400264000ustar00rootroot00000000000000 image/svg+xml revolt-master/icons/scalable/status/revolt-status-online-symbolic.svg000066400000000000000000000122121415664747400265640ustar00rootroot00000000000000 image/svg+xml revolt-master/install-functions.sh000066400000000000000000000145571415664747400177300ustar00rootroot00000000000000#! /bin/bash # # install.sh # Copyright (C) 2016-2017 Adrian Perez # # Distributed under terms of the GPLv3 license. # install_log_file='' install_destdir='' install_prefix='/usr/local' install_pretend=false install_mode='install' install_help='Usage: %s [--install | --uninstall | --update] [options...] Operation modes: --install, -I Run in installation mode. --uninstall, -D Run in uninstallation mode. --update, -U Run in update mode. Options: --pretend, -n Do not perform actions, only print them. The output is suitable to be passed back to the shell as a script. --log-file=PATH Log installed files to a text file at PATH. When running in uninstall or update mode, the list of files previously installed is taken from the log file, and then it is updated with the new list of installed files. --prefix=PATH Installation prefix (default: /usr/local). --destdir=PATH Installation destination directory, useful for creating distribution packages (default: none). --help, -h Show this help message. ' set -e # install-setup "$0" "$@" install-setup () { local arg0=$1 shift for option in "$@" ; do case "${option}" in --uninstall | -D) install_mode=uninstall ;; --install | -I) install_mode=install ;; --update | -U) install_mode=update ;; --pretend | -n) install_pretend=true ;; --log-file=*) install_log_file=${option#*=} ;; --destdir=*) install_destdir=${option#*=} ;; --prefix=*) install_prefix=${option#*=} ;; --help | -h) printf "${install_help}" "${arg0}" exit 0 ;; esac done if [[ -n ${install_log_file} ]] ; then if [[ ${install_mode} != install ]] ; then # Remove contents listed in the log file if [[ -r ${install_log_file} ]] ; then local path while read -r path ; do if ${install_pretend} ; then echo "rm -f '${path}'" else install-show REMOVE "${path}" rm -f "${install_destdir}${path}" fi done < "${install_log_file}" fi if [[ ${install_mode} = uninstall ]] ; then exit 0 else # Make sure the rest of the script runs in installation mode. install_mode=install fi fi # Truncate the log file ${install_pretend} || : > "${install_log_file}" fi } # install-show install-show () { local prepend="[$1] " if [[ -n ${install_destdir} && ( $1 = INSTALL || $1 = REMOVE ) ]] ; then prepend="[$1] ${install_destdir}" fi echo "${prepend}$2" } # install-exec [install-options...] install-exec () { local src=$1 local dst=$2 shift 2 case ${INSTALL_EXEC_MODE:-${install_mode}} in install) if ${install_pretend} ; then echo "install -D $* '${src}' '${install_destdir}${dst}'" else if [[ -n ${install_log_file} ]] ; then echo "${dst}" >> "${install_log_file}" fi install-show INSTALL "${dst}" install -D "$@" "${src}" "${install_destdir}${dst}" fi ;; uninstall) if ${install_pretend} ; then echo "rm -f '${dst}'" else install-show REMOVE "${dst}" rm -f "${install_destdir}${dst}" fi ;; update) INSTALL_EXEC_MODE=uninstall install-exec "${src}" "${dst}" "$@" INSTALL_EXEC_MODE=install install-exec "${src}" "${dst}" "$@" ;; esac } # install-prefixed [install-options...] install-prefixed () { local relpath=$1 local filename=$2 shift 2 install-exec "${filename}" "${install_prefix}/${relpath}/$(basename "${filename}")" "$@" } # install-icon [theme] # TODO: Make this use install-prefixed, and change that to allow passing # destination file names. declare -a install_icon_update_themes=( ) install-icon () { local name=${1} local size=${2} local ext=${4#*.} local theme=${5:-hicolor} if [[ ${size} = symbolic ]] ; then name="${name}-symbolic" fi install-exec "$4" "${install_prefix}/share/icons/${theme}/${size}/$3/${name}.${ext}" -m644 local t for t in "${install_icon_update_themes[@]}" ; do if [[ ${t} = "${theme}" ]] ; then return fi done install_icon_update_themes=( "${install_icon_update_themes[@]}" "${theme}" ) } install-update-gtk-icon-theme-caches () { if [[ -n ${SKIP_ICON_CACHE_UPDATE} && ${SKIP_ICON_CACHE_UPDATE} -ne 0 ]] ; then install-show SKIPPED "gtk-update-icon-cache (SKIP_ICON_CACHE_UPDATE)" return fi if [[ -n ${install_destdir} ]] ; then install-show SKIPPED "gtk-update-icon-cache (--destdir is in use)" return fi local updater updater=$(type -P gtk-update-icon-cache) if [[ -z ${updater} ]] ; then install-show SKIPPED "gtk-update-icon-cache (program not found)" return fi local theme for theme in "${install_icon_update_themes[@]}" ; do if ${install_pretend} ; then echo "'${updater}' -q '${install_prefix}/share/icons/${theme}'" else install-show EXEC "gtk-update-icon-cache: ${theme}" "${updater}" -q "${install_prefix}/share/icons/${theme}" fi done } # install-glib-gschema [install-options...] declare install_glib_gschema_called=false install-glib-gschema () { install-prefixed share/glib-2.0/schemas "$@" -m644 install_glib_gschema_called=true } install-update-glib-gschemas () { if ! ${install_glib_gschema_called} ; then return fi if [[ -n ${SKIP_GSCHEMA_UPDATE} && ${SKIP_GSCHEMA_UPDATE} -ne 0 ]] ; then install-show SKIPPED "glib-compile-schemas (SKIP_GSCHEMA_UPDATE)" return fi if [[ -n ${install_destdir} ]] ; then install-show SKIPPED "glib-compile-schemas (--destdir is in use)" return fi local compiler compiler=$(type -P glib-compile-schemas) if [[ -z ${compiler} ]] ; then install-show SKIPPED "glib-compile-schemas (program not found)" return fi if ${install_pretend} ; then echo "'${compiler}' '${install_prefix}/share/glib-2.0/schemas/'" else install-show EXEC "glib-compile-schemas: ${install_prefix}/share/glib-2.0/schemas/" "${compiler}" "${install_prefix}/share/glib-2.0/schemas/" fi } # install-bin [install-options...] # install-desktop-file [install-options...] install-bin () { install-prefixed bin "$@" -m755 ; } install-desktop-file () { install-prefixed share/applications "$@" -m644 ; } install-finish () { install-update-gtk-icon-theme-caches install-update-glib-gschemas } revolt-master/install.sh000077500000000000000000000023261415664747400157140ustar00rootroot00000000000000#! /bin/bash # # install.sh # Copyright (C) 2016-2017 Adrian Perez # # Distributed under terms of the GPLv3 license. # set -e shopt -s nullglob declare -r APP_ID='org.perezdecastro.Revolt' source "$(dirname "$0")/install-functions.sh" install-setup "$0" "$@" install-bin bin/revolt install-desktop-file "${APP_ID}.desktop" install-prefixed share/revolt "${APP_ID}.gresource" -m644 install-prefixed share/appdata "${APP_ID}.appdata.xml" -m644 install-glib-gschema "${APP_ID}.gschema.xml" for file in ./[0-9][0-9]_${APP_ID}.gschema.override ; do install-glib-gschema "${file}" done for file in revolt/*.py ; do install-prefixed share/revolt/py/revolt "${file}" -m644 done for size in 16x16 16x16@2x 24x24 24x24@2x 32x32 64x64 ; do install-icon "${APP_ID}" "${size}" apps "icons/${size}/apps/revolt.png" done install-icon "${APP_ID}" scalable apps icons/scalable/apps/revolt.svg install-icon "${APP_ID}" symbolic apps icons/scalable/apps/revolt-symbolic.svg install-icon "${APP_ID}-status-blink-symbolic" scalable status icons/scalable/status/revolt-status-blink-symbolic.svg install-icon "${APP_ID}-status-online-symbolic" scalable status icons/scalable/status/revolt-status-online-symbolic.svg install-finish revolt-master/make-flatpak.sh000077500000000000000000000012541415664747400166020ustar00rootroot00000000000000#! /bin/bash set -e readonly BUILDDIR="$(dirname "$0")/.flatpak-build" readonly REPODIR="$(dirname "$0")/.flatpak-repo" cleanup () { rm -rf "${BUILDDIR}" } trap cleanup EXIT declare -a buildargs=( --sandbox --force-clean --require-changes --repo="${REPODIR}" --subject="Revolt $(date +%Y%m%d).$(git describe --always --tags)" ) declare -a updaterepoargs=( --title=Revolt --default-branch=master --prune ) if [[ -n ${EMAIL} ]] ; then buildargs+=( --gpg-sign="${EMAIL}" ) updaterepoargs+=( --gpg-sign="${EMAIL}" ) fi set -x flatpak-builder "${buildargs[@]}" "${BUILDDIR}" "$@" org.perezdecastro.Revolt.json flatpak build-update-repo "${updaterepoargs[@]}" "${REPODIR}" revolt-master/org.perezdecastro.Revolt.appdata.xml000066400000000000000000000023061415664747400227520ustar00rootroot00000000000000 org.perezdecastro.Revolt.desktop CC-BY-SA-3.0 GPL-3.0 Revolt Better integration of Element, a Matrix client, with desktop environments

Revolt is a small application which wraps Element to provide better integration with desktop environments in general, and GNOME in particular:

  • Having Element as a “standalone” application instead of it living in a browser tab
  • Persistent notifications (for desktop environments supporting them, i.e. GNOME)
  • Notifications are automatically prevented when the Revolt window is focused
  • Status icon for desktop environment which have a tray bar applet (XFCE, Budgie, likely many others)
https://github.com/aperezdc/revolt/raw/master/assets/revolt-screenshot.png Revolt running on GNOME https://github.com/aperezdc/revolt
revolt-master/org.perezdecastro.Revolt.desktop000066400000000000000000000004141415664747400222100ustar00rootroot00000000000000[Desktop Entry] Hidden=false Name=Revolt Exec=revolt TryExec=revolt Icon=org.perezdecastro.Revolt Comment=Connect to the Matrix chat network Type=Application NoDisplay=false StartupNotify=true Categories=GNOME;GTK;Network Terminal=false X-GNOME-UsesNotifications=true revolt-master/org.perezdecastro.Revolt.gresources.xml000066400000000000000000000015171415664747400235240ustar00rootroot00000000000000 gtk/custom.css gtk/menus.ui gtk/preferences.ui icons/revolt-about.svg icons/scalable/apps/revolt.svg icons/scalable/apps/revolt-symbolic.svg icons/scalable/status/revolt-status-blink-symbolic.svg icons/scalable/status/revolt-status-online-symbolic.svg revolt-master/org.perezdecastro.Revolt.gschema.xml000066400000000000000000000030761415664747400227540ustar00rootroot00000000000000 Base URL of the Element installation wrapped by Revolt "https://app.element.io" Zoom factor applied to to application 1.0 Allow usage of the web inspector and JavaScript console false Whether to use a header bar. Disabling uses the decorations provided by the window manager. true Hide the window instead of closing it when the window close button (X) is activated. false Width of the window 900 Height of the window 650 Whether the window is maximized false revolt-master/org.perezdecastro.Revolt.json000066400000000000000000000051331415664747400215130ustar00rootroot00000000000000{ "app-id": "org.perezdecastro.Revolt", "runtime": "org.gnome.Platform", "runtime-version": "41", "sdk": "org.gnome.Sdk", "command": "revolt", "finish-args": [ "--device=dri", "--share=network", "--share=ipc", "--socket=x11", "--socket=wayland", "--socket=pulseaudio", "--socket=session-bus", "--filesystem=xdg-documents", "--filesystem=xdg-pictures", "--own-name=org.perezdecastro.Revolt", "--talk-name=org.freedesktop.Notifications", "--talk-name=org.gtk.Notifications", "--env=GSETTINGS_SCHEMA_DIR=/app/share/glib-2.0/schemas", "--filesystem=xdg-run/dconf", "--filesystem=~/.config/dconf:ro", "--talk-name=ca.desrt.dconf", "--env=DCONF_USER_CONFIG_DIR=.config/dconf" ], "build-options": { "strip": false }, "cleanup": [ "/bin/intltool-*", "/bin/intltoolize", "/include", "/lib/*.la", "/lib/pkgconfig", "/libexec", "/share/aclocal", "/share/doc", "/share/gtk-doc", "/share/intltool", "/share/man" ], "modules": [ { "name": "intltool", "sources": [ { "type": "archive", "url": "https://launchpad.net/intltool/trunk/0.51.0/+download/intltool-0.51.0.tar.gz", "sha256": "67c74d94196b153b774ab9f89b2fa6c6ba79352407037c8c14d5aeb334e959cd" } ] }, { "name": "libdbusmenu", "build-options": { "env": { "HAVE_VALGRIND_TRUE": "#", "HAVE_VALGRIND_FALSE": "", "CFLAGS": "-Wno-error" } }, "config-opts": [ "--with-gtk=3", "--disable-nls", "--disable-dumper", "--disable-static", "--disable-tests", "--disable-vala", "--enable-introspection=yes" ], "sources": [ { "type": "archive", "url": "https://launchpad.net/libdbusmenu/16.04/16.04.0/+download/libdbusmenu-16.04.0.tar.gz", "sha256": "b9cc4a2acd74509435892823607d966d424bd9ad5d0b00938f27240a1bfa878a" } ] }, { "name": "statusnotifier", "config-opts": [ "--disable-static", "--enable-dbusmenu", "--enable-introspection" ], "sources": [ { "type": "archive", "url": "https://github.com/jjk-jacky/statusnotifier/archive/1.0.0.tar.gz", "sha256": "a307f04bc3ae749fd2bd368c3752dec2f1dbd180da89c737f1dda63a698d441b" } ] }, { "name": "revolt", "sources": [ { "type": "git", "url": "https://github.com/aperezdc/revolt.git" } ] } ] } revolt-master/revolt.flatpakref000066400000000000000000000222641415664747400172660ustar00rootroot00000000000000[Flatpak Ref] Title=Revolt Name=org.perezdecastro.Revolt Branch=master Url=https://flatpak.perezdecastro.org/revolt IsRuntime=false GPGKey=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 Homepage=https://github.com/aperezdc/revolt RuntimeRepo=https://dl.flathub.org/repo/flathub.flatpakrepo revolt-master/revolt/000077500000000000000000000000001415664747400152175ustar00rootroot00000000000000revolt-master/revolt/__init__.py000066400000000000000000000010401415664747400173230ustar00rootroot00000000000000#! /usr/bin/env python # -*- coding: utf-8 -*- # vim:fenc=utf-8 # # Copyright © 2016 Adrian Perez # # Distributed under terms of the GPLv3 license. import gi gi.require_versions(dict(WebKit2="4.0", Gtk="3.0", GLib="2.0")) def main(program_path): # Honor CTRL+C http://stackoverflow.com/q/16410852 import signal import sys from .app import RevoltApp signal.signal(signal.SIGINT, signal.SIG_DFL) sys.exit(RevoltApp(program_path).run(sys.argv[1:])) revolt-master/revolt/accelerators.py000066400000000000000000000027571415664747400202530ustar00rootroot00000000000000#! /usr/bin/env python # -*- coding: utf-8 -*- # vim:fenc=utf-8 # # Copyright © 2017 Adrian Perez # # Distributed under terms of the GPLv3 license. from gi.repository import Gtk, Gdk, GLib def __window_close(accel_group, window, key, modifiers): assert isinstance(window, Gtk.Window) window.close() window_close_on_escape = Gtk.AccelGroup() window_close_on_escape.connect(Gdk.KEY_Escape, 0, 0, __window_close) def __window_modify_zoom(accel_group, window, key, modifiers): if key == Gdk.KEY_0: window.application.settings.reset("zoom-factor") else: zoom = window.application.settings.get_double("zoom-factor") if key == Gdk.KEY_plus: zoom += 0.1 elif key == Gdk.KEY_minus: zoom -= 0.1 else: assert False, "Unreachable" schema = window.application.settings.get_property("settings-schema") value = GLib.Variant.new_double(zoom) if schema.get_key("zoom-factor").range_check(value): window.application.settings.set_value("zoom-factor", value) def __window_webview_reload(accel_group, window, key, modifiers): window.reload_element(bypass_cache=True) window_keys = Gtk.AccelGroup() window_keys.connect(Gdk.KEY_r, Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK, 0, __window_webview_reload) for key in (Gdk.KEY_plus, Gdk.KEY_minus, Gdk.KEY_0): window_keys.connect(key, Gdk.ModifierType.CONTROL_MASK, 0, __window_modify_zoom) revolt-master/revolt/app.py000066400000000000000000000161531415664747400163570ustar00rootroot00000000000000#! /usr/bin/env python # -*- coding: utf-8 -*- # vim:fenc=utf-8 # # Copyright © 2016-2017 Adrian Perez # # Distributed under terms of the GPLv3 license. from os import environ from gi.repository import Gtk, Gio, Gdk from .statusicon import StatusIcon from .window import MainWindow from . import accelerators DEFAULT_APP_ID = "org.perezdecastro.Revolt" APP_ID = environ.get("REVOLT_OVERRIDE_APPLICATION_ID", DEFAULT_APP_ID).strip() APP_COMMENTS = u"Desktop application for Element.io" APP_WEBSITE = u"https://github.com/aperezdc/revolt" APP_AUTHORS = (u"Adrián Pérez de Castro ", u"Jacobo Aragunde Pérez ", u"Carlos López Pérez ") def _find_resources_path(program_path): from os import path as P devel = environ.get("__REVOLT_DEVELOPMENT") if devel and devel.strip(): # Use the directory where the executable is located, most likely # a checkout of the Git repository. path = P.dirname(P.dirname(program_path)) else: # Use an installed location: binary is in /bin/revolt, # and resources in /share/revolt/* path = P.join(P.dirname(P.dirname(program_path)), "share", "revolt") return P.abspath(P.join(path, DEFAULT_APP_ID + ".gresource")) class RevoltApp(Gtk.Application): def __init__(self, program_path): Gio.Resource.load(_find_resources_path(program_path))._register() Gtk.Application.__init__(self, application_id=APP_ID, resource_base_path="/" + DEFAULT_APP_ID.replace(".", "/"), flags=Gio.ApplicationFlags.FLAGS_NONE) self.settings = Gio.Settings(schema_id=DEFAULT_APP_ID, path="/" + APP_ID.replace(".", "/") + "/") self.element_url = self.settings.get_string("riot-url") self.window = None self._last_window_geometry = None self.statusicon = None self.connect("shutdown", self.__on_shutdown) self.connect("activate", self.__on_activate) self.connect("startup", self.__on_startup) def __action(self, name, callback): action = Gio.SimpleAction.new(name) action.connect("activate", callback) self.add_action(action) def __on_startup(self, app): gtk_settings = Gtk.Settings.get_default() gtk_settings.set_property("gtk-dialogs-use-header", self.settings.get_boolean("use-header-bar")) css_provider = Gtk.CssProvider() css_provider.load_from_resource(self.get_resource_base_path() + "/gtk/custom.css") Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(), css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION) self.statusicon = StatusIcon(self) self.__action("quit", lambda *arg: self.quit()) self.__action("about", self.__on_app_about) self.__action("preferences", self.on_app_preferences) self.__action("element-settings", self.on_element_settings) def __on_shutdown(self, app): if self.window is not None: self.window.finish() def __on_activate(self, app): if self.window is None: saved_state_path = self.settings.get_property("path") saved_state_path += "saved-state/main-window/" saved_state = Gio.Settings(schema_id=DEFAULT_APP_ID + ".WindowState", path=saved_state_path) self.window = MainWindow(self, saved_state).load_element() self.show() def __on_app_about(self, action, param): dialog = Gtk.AboutDialog(transient_for=self.window, program_name=u"Revolt", authors=APP_AUTHORS, logo_icon_name="revolt-about", license_type=Gtk.License.GPL_3_0, comments=APP_COMMENTS, website=APP_WEBSITE) dialog.connect("response", lambda d, r: d.destroy()) dialog.present() def _build(self, resource, *names): builder = Gtk.Builder.new_from_resource(self.get_resource_base_path() + "/" + resource) return (builder.get_object(name) for name in names) def on_app_preferences(self, action, param): window, url_entry, zoom_factor, zoom_factor_reset, devtools_toggle = \ self._build("gtk/preferences.ui", "settings-window", "element-url-entry", "zoom-factor", "zoom-factor-reset", "dev-tools-toggle") self.settings.bind("zoom-factor", zoom_factor, "value", Gio.SettingsBindFlags.DEFAULT) self.settings.bind("enable-developer-tools", devtools_toggle, "active", Gio.SettingsBindFlags.DEFAULT) zoom_factor_reset.connect("clicked", lambda button: self.settings.set_double("zoom-factor", 1.0)) url_entry.set_text(self.element_url) def on_hide(window): new_url = url_entry.get_text() if new_url != self.element_url: self.settings.set_string("riot-url", new_url) self.element_url = new_url self.window.load_element() window.connect("hide", on_hide) window.add_accel_group(accelerators.window_close_on_escape) window.set_transient_for(self.window) window.present() def on_element_settings(self, action, param): self.show() self.window.load_settings_page() def __save_window_geometry(self): window_size = self.window.get_size() window_position = self.window.get_position() self._last_window_geometry = {"width": window_size.width, "height": window_size.height, "root_x": window_position.root_x, "root_y": window_position.root_y} def __restore_window_geometry(self): if not self._last_window_geometry: return self.window.resize(self._last_window_geometry["width"], self._last_window_geometry["height"]) self.window.move(self._last_window_geometry["root_x"], self._last_window_geometry["root_y"]) # invalidate _last_window_geometry after restoring to ensure to # not restore again if the users clicks on the status icon when # the window is not hidden (like when minimized, or not focused) # self.hide() will take care of setting a new saved geometry. self._last_window_geometry = None def show(self): self.__restore_window_geometry() self.window.show() self.window.present() def hide(self): self.__save_window_geometry() self.window.hide() def is_visible_and_focused(self): return self.window.props.visible and self.window.props.has_toplevel_focus revolt-master/revolt/statusicon.py000066400000000000000000000243731415664747400177760ustar00rootroot00000000000000#! /usr/bin/env python # -*- coding: utf-8 -*- # vim:fenc=utf-8 # # Copyright © 2016-2017 Adrian Perez # # Distributed under terms of the GPLv3 license. from gi.repository import Gtk, GLib from .util import cachedproperty, desktop_is import enum class Status(enum.Enum): DISCONNECTED = "disconnected" CONNECTED = "connected" BLINKING = "blinking" class StatusIconImpl(object): def __init__(self, delegate): self.delegate = delegate def __del__(self): self.delegate = None def set_tooltip(self, text): raise NotImplementedError def set_status(self, status): raise NotImplementedError class StatusIconImplSNI(StatusIconImpl): ICON_PIXBUF_SIZE = 64 # This seems to be a reasonable size for all DEs. def __init__(self, delegate, context_menu, app, failure_callback): super().__init__(delegate) import gi gi.require_version("StatusNotifier", "1.0") from gi.repository import StatusNotifier if hasattr(StatusNotifier.Icon, "ATTENTION_ICON"): self.SNI_ATTENTION_ICON = StatusNotifier.Icon.ATTENTION_ICON self.SNI_ACTIVE_ICON = StatusNotifier.Icon.ICON else: self.SNI_ATTENTION_ICON = StatusNotifier.Icon.STATUS_NOTIFIER_ATTENTION_ICON self.SNI_ACTIVE_ICON = StatusNotifier.Icon.STATUS_NOTIFIER_ICON self.SNI_ATTENTION = StatusNotifier.Status.NEEDS_ATTENTION self.SNI_ACTIVE = StatusNotifier.Status.ACTIVE theme = Gtk.IconTheme.get_default() self._offline_icon_pixbuf = theme.load_icon("org.perezdecastro.Revolt", self.ICON_PIXBUF_SIZE, Gtk.IconLookupFlags.FORCE_SVG | Gtk.IconLookupFlags.FORCE_SYMBOLIC) self._attention_icon_pixbuf = theme.load_icon("org.perezdecastro.Revolt-status-blink", self.ICON_PIXBUF_SIZE, Gtk.IconLookupFlags.FORCE_SVG | Gtk.IconLookupFlags.FORCE_SYMBOLIC) self._online_icon_pixbuf = theme.load_icon("org.perezdecastro.Revolt-status-online", self.ICON_PIXBUF_SIZE, Gtk.IconLookupFlags.FORCE_SVG | Gtk.IconLookupFlags.FORCE_SYMBOLIC) self._failure_callback = failure_callback self._sni = StatusNotifier.Item.new_from_pixbuf(app.get_application_id(), StatusNotifier.Category.COMMUNICATIONS, self._offline_icon_pixbuf) if not self._sni.set_context_menu(context_menu): # TODO: No DbusMenu support built into StatusIcon, we need to handle the # "context-menu" signal ourselves. For now, fallback to use GtkStatusIcon raise RuntimeError("StatusNotifier does not support DbusMenu, falling back to GtkStatusIcon") self._sni.connect("registration-failed", self.__on_registration_failed) self._sni.connect("activate", self.__on_activate) self._sni.set_from_pixbuf(self.SNI_ATTENTION_ICON, self._attention_icon_pixbuf) self._sni.set_title("Revolt") self._sni.set_status(self.SNI_ACTIVE) self._sni.set_item_is_menu(False) self._sni.freeze_tooltip() self._sni.set_tooltip_title("Revolt") self._sni.thaw_tooltip() self._sni.register() def set_status(self, status): if status is Status.BLINKING: self._sni.set_status(self.SNI_ATTENTION) else: self._sni.set_status(self.SNI_ACTIVE) if status is Status.CONNECTED: self._sni.set_from_pixbuf(self.SNI_ACTIVE_ICON, self._online_icon_pixbuf) elif status is Status.DISCONNECTED: self._sni.set_from_pixbuf(self.SNI_ACTIVE_ICON, self._offline_icon_pixbuf) else: assert False, "Unrechable" def __on_registration_failed(self, sni, error): assert sni == self._sni print("StatusNotifier registration failed, falling back to GtkStatusIcon") self._failure_callback(self) def __on_activate(self, sni, x, y): assert sni == self._sni self.delegate.on_icon_activate(self) def set_tooltip(self, text): self._sni.freeze_tooltip() self._sni.set_tooltip_body("" if text is None else text) self._sni.thaw_tooltip() class StatusIconImplGSI(StatusIconImpl): ICON_STATUS_NAMES = { Status.DISCONNECTED.value: "", Status.CONNECTED.value: "-status-online", "flip": "-status-blink", "flop": "" } def __init__(self, delegate, context_menu, app): super().__init__(delegate) self._status = Status.DISCONNECTED self._contextmenu = context_menu self._size = 16 self._flipflop = True self._blinkmilliseconds = 500 self._icondata = {} self.__load_icons(self._size, app) self._icon = Gtk.StatusIcon() self._icon.set_visible(True) self._icon.set_property("has-tooltip", True) self._icon.set_property("title", "Revolt") self._icon.connect("activate", self.__on_activate) self._icon.connect("popup-menu", self.__on_popup_menu) self._icon.connect("size-changed", self.__on_icon_size_change) def set_tooltip(self, text): if text is None: self._icon.set_tooltip_text("Revolt") else: self._icon.set_tooltip_markup("Revolt\n{!s}".format(text)) def set_status(self, status): if status is Status.BLINKING: # We only want one blink callback active at a time. if self._status is not Status.BLINKING: GLib.timeout_add(self._blinkmilliseconds, self.__blink) else: GLib.timeout_add(2 * self._blinkmilliseconds, self.__draw_icon, status) self._status = status def __load_icons(self, size, app=None): if app is None: app = Gtk.Application.get_default() self._size = size theme = Gtk.IconTheme.get_default() for status, icon_suffix in self.ICON_STATUS_NAMES.items(): icon_name = "org.perezdecastro.Revolt" + icon_suffix self._icondata[status] = theme.load_icon(icon_name, int(size), Gtk.IconLookupFlags.FORCE_SVG | Gtk.IconLookupFlags.FORCE_SYMBOLIC) def __draw_icon(self, status=None): if status is None: status = self._status if status is Status.BLINKING: if self._flipflop: self._icon.set_from_pixbuf(self._icondata["flip"]) else: self._icon.set_from_pixbuf(self._icondata["flop"]) else: self._icon.set_from_pixbuf(self._icondata[status.value]) return False def __on_activate(self, icon): assert icon == self._icon self.delegate.on_icon_activate(self) def __on_popup_menu(self, icon, button, time): assert icon == self._icon self._contextmenu.show_all() self._contextmenu.popup(None, None, None, self._icon, button, time) def __on_icon_size_change(self, statusicon, size): if size > 31: icon_size = "32" elif size > 23: icon_size = "24" else: icon_size = "16" if desktop_is("kde"): # KDE: see gajim bug #5476 icon_size = "32" if desktop_is("mate"): icon_size = "16" self.__load_icons(icon_size) self.__draw_icon() def __blink(self): self._flipflop = not self._flipflop self.__draw_icon() return self._status is Status.BLINKING class StatusIcon(object): def __init__(self, app, initial_status=Status.DISCONNECTED): self.status = Status(initial_status) self.__app = app self.__tooltip = None # Try using StatusNotifier first self._contextmenu.insert_action_group("app", app) try: self._impl = StatusIconImplSNI(self, self._contextmenu, app, self.__sni_failed) except Exception as e: print("StatusNotifier failed, using GtkStatusIcon instead -", str(e)) self.__sni_failed(None) self.__configure_impl() def __sni_failed(self, sni_impl): # Use the (deprecated) GtkStatusIcon as fallback self._impl = StatusIconImplGSI(self, self._contextmenu, self.__app) self.__configure_impl() def __configure_impl(self): self._impl.set_tooltip(None) self.clear_notifications() @cachedproperty def _contextmenu(self): model = self.__app.get_menu_by_id("app-menu") if model is None: # If showing the application menu in the GNOME Shell top bar is # disabled, then GtkApplication won't load gtk/menus.ui # automatically, but we still need it for the context menu. (model,) = self.__app._build("gtk/menus.ui", "app-menu") return Gtk.Menu.new_from_model(model) def __add_notification_tooltip_text(self, text): if self.__tooltip is None: self.__tooltip = text else: self.__tooltip += "\n" self.__tooltip += text self._impl.set_tooltip(self.__tooltip) def __clear_notification_tooltip_text(self): self._impl.set_tooltip(None) self.__tooltip = None def set_status(self, status): status = Status(status) if status is not self.status: self.status = status self._impl.set_status(self.status) def add_notification(self, text): self.__add_notification_tooltip_text(text) self.set_status(Status.BLINKING) def clear_notifications(self): self.__clear_notification_tooltip_text() self.set_status(Status.CONNECTED) # Delegate methods. def on_icon_activate(self, icon_impl): self.clear_notifications() if self.__app.is_visible_and_focused(): self.__app.hide() else: self.__app.show() revolt-master/revolt/util.py000066400000000000000000000031641415664747400165520ustar00rootroot00000000000000#! /usr/bin/env python # -*- coding: utf-8 -*- # vim:fenc=utf-8 # # Copyright © 2016 Adrian Perez # # Distributed under terms of the GPv3 license. from gi.repository import Gdk from gi.repository import Gtk import os if hasattr(Gtk, "show_uri_on_window"): def show_uri(parent, uri, timestamp=None): if timestamp is None: timestamp = Gdk.CURRENT_TIME Gtk.show_uri_on_window(parent, uri, timestamp) else: def show_uri(parent, uri, timestamp=None): if timestamp is None: timestamp = Gdk.CURRENT_TIME Gtk.show_uri(None, uri, timestamp) class CachedProperty(object): __slots__ = ("value", "get_value") INVALID = object() def __init__(self, f): self.value = self.INVALID self.get_value = f def __call__(self, obj): if self.value is self.INVALID: self.value = self.get_value(obj) return self.value def cachedproperty(f, doc=None): return property(CachedProperty(f), doc=doc) def desktop_is(desktopname): desktopname = desktopname.lower() if desktopname == "kde" and os.environ.get("KDE_FULL_SESSION") == "true": return True if desktopname == "mate" and os.environ.get("MATE_DESKTOP_SESSION_ID"): return True for desktopvarname in ["XDG_SESSION_DESKTOP", "DESKTOP_SESSION", "XDG_CURRENT_DESKTOP", "XDG_SESSION_DESKTOP", "XDG_MENU_PREFIX", "GDMSESSION", "XDG_DATA_DIRS"]: desktopvarvalue = os.environ.get(desktopvarname) if desktopvarvalue and desktopname in desktopvarvalue.lower(): return True return False revolt-master/revolt/window.py000066400000000000000000000250631415664747400171060ustar00rootroot00000000000000#! /usr/bin/env python # -*- coding: utf-8 -*- # vim:fenc=utf-8 # # Copyright © 2016-2017 Adrian Perez # # Distributed under terms of the GPLv3 license. from gi.repository import GLib, Gtk, Gio, WebKit2, GObject from .util import cachedproperty, show_uri, desktop_is from . import accelerators from . import statusicon class MainWindow(Gtk.ApplicationWindow): network_busy = GObject.Property(type=bool, default=False) def __init__(self, application, saved_state): self.application = application self.saved_state = saved_state Gtk.ApplicationWindow.__init__(self, application=application, icon_name="revolt", role="main-window", default_width=saved_state.get_uint("width"), default_height=saved_state.get_uint("height")) if self.saved_state.get_boolean("maximized"): self.maximize() self.saved_state.bind("maximized", self, "is-maximized", Gio.SettingsBindFlags.SET) if application.settings.get_boolean("use-header-bar"): self.set_titlebar(self.__make_headerbar()) if application.settings.get_boolean("hide-on-window-close"): self.connect("delete-event", self.__hide_on_destroy) self.set_title(u"Revolt") application.add_window(self) self._webview = WebKit2.WebView(user_content_manager=self._user_content_manager, web_context=self._web_context) self._webview.connect("decide-policy", self.__on_decide_policy) self._webview.connect("context-menu", self.__on_context_menu) application.settings.bind("zoom-factor", self._webview, "zoom-level", Gio.SettingsBindFlags.GET) if hasattr(self._webview, "set_maintains_back_forward_list"): self._webview.set_maintains_back_forward_list(False) websettings = self._webview.get_settings() application.settings.bind("enable-developer-tools", websettings, "enable-developer-extras", Gio.SettingsBindFlags.GET) application.settings.bind("enable-developer-tools", websettings, "enable-write-console-messages-to-stdout", Gio.SettingsBindFlags.GET) self.add_accel_group(accelerators.window_keys) websettings.set_allow_file_access_from_file_urls(True) websettings.set_allow_modal_dialogs(False) # TODO websettings.set_enable_fullscreen(False) websettings.set_enable_java(False) websettings.set_enable_media_stream(True) websettings.set_enable_page_cache(False) # Single-page app websettings.set_enable_plugins(False) websettings.set_enable_smooth_scrolling(True) websettings.set_enable_webaudio(True) websettings.set_javascript_can_access_clipboard(True) websettings.set_minimum_font_size(12) # TODO: Make it a setting websettings.set_property("enable-mediasource", True) if hasattr(websettings, "set_hardware_acceleration_policy"): websettings.set_hardware_acceleration_policy(WebKit2.HardwareAccelerationPolicy.ALWAYS) self._webview.show_all() self.add(self._webview) self.__connect_widgets() self.__notification_ids = set() def do_configure_event(self, event): result = Gtk.ApplicationWindow.do_configure_event(self, event) width, height = self.get_size() self.saved_state.set_uint("width", width) self.saved_state.set_uint("height", height) return result def __make_headerbar(self): header = Gtk.HeaderBar() header.set_show_close_button(True) header.get_style_context().add_class("revolt-slim") spinner = Gtk.Spinner() header.pack_end(spinner) self.bind_property("network-busy", spinner, "active", GObject.BindingFlags.DEFAULT) header.show_all() return header @cachedproperty def _website_data_manager(self): from os import path as P print("Creating WebsiteDataManager...") app_id = self.application.get_application_id() cache_dir = P.join(GLib.get_user_cache_dir(), "revolt", app_id) data_dir = P.join(GLib.get_user_data_dir(), "revolt", app_id) return WebKit2.WebsiteDataManager(base_cache_directory=cache_dir, base_data_directory=data_dir) @cachedproperty def _web_context(self): print("Creating WebContext...") ctx = WebKit2.WebContext(website_data_manager=self._website_data_manager) ctx.set_spell_checking_enabled(False) ctx.set_tls_errors_policy(WebKit2.TLSErrorsPolicy.FAIL) return ctx @cachedproperty def _user_content_manager(self): mgr = WebKit2.UserContentManager() script = WebKit2.UserScript("Notification.requestPermission();", WebKit2.UserContentInjectedFrames.TOP_FRAME, WebKit2.UserScriptInjectionTime.START, None, None) mgr.add_script(script) return mgr def __on_decide_policy(self, webview, decision, decision_type): if decision_type == WebKit2.PolicyDecisionType.NAVIGATION_ACTION: if decision.get_navigation_type() == WebKit2.NavigationType.LINK_CLICKED: uri = decision.get_request().get_uri() if not uri.startswith(self.application.element_url): show_uri(self, uri) return True elif decision_type == WebKit2.PolicyDecisionType.NEW_WINDOW_ACTION: if decision.get_navigation_type() == WebKit2.NavigationType.LINK_CLICKED: show_uri(self, decision.get_request().get_uri()) return True return False @cachedproperty def _context_menu_actions(self): action_list = [] action = Gio.SimpleAction.new("preferences") action.connect("activate", self.application.on_app_preferences) action_list.append((action, "_Preferences")) action = Gio.SimpleAction.new("element-settings") action.connect("activate", self.application.on_element_settings) action_list.append((action, "_Element Settings")) return tuple(action_list) def __on_context_menu(self, webview, menu, event, hit_test): # Tweak built-in entries. for action in (WebKit2.ContextMenuAction.GO_BACK, WebKit2.ContextMenuAction.GO_FORWARD, WebKit2.ContextMenuAction.STOP): for index in range(menu.get_n_items()): item = menu.get_item_at_position(index) if action == item.get_stock_action(): menu.remove(item) break # Add a separator. menu.append(WebKit2.ContextMenuItem.new_separator()) # Append application-specfic entries. for (action, label) in self._context_menu_actions: menu.append(WebKit2.ContextMenuItem.new_from_gaction(action, label)) return False def __on_has_toplevel_focus_changed(self, window, has_focus): assert window == self if window.has_toplevel_focus(): # Clear the window's urgency hint window.set_urgency_hint(False) # Dismiss notifications for notification_id in self.__notification_ids: self.application.withdraw_notification(notification_id) self.__notification_ids.clear() self.application.statusicon.clear_notifications() def __on_load_changed(self, webview, event): if event == WebKit2.LoadEvent.FINISHED: self.network_busy = False self.application.statusicon.set_status(statusicon.Status.CONNECTED) else: self.network_busy = True self.application.statusicon.set_status(statusicon.Status.DISCONNECTED) @cachedproperty def _notification_icon(self): icon_id = self.application.get_application_id() + "-symbolic" return Gio.ThemedIcon.new(icon_id) def __on_show_notification(self, webview, notification): # TODO: Handle notification clicked, and so if not self.has_toplevel_focus(): self.set_urgency_hint(True) notif = Gio.Notification.new(notification.get_title()) notif.set_body(notification.get_body()) # TODO: Use the avatar of the contact, if available. notif.set_icon(self._notification_icon) if not desktop_is("xfce"): # Workaround for XFCE bug #13586 notif.set_priority(Gio.NotificationPriority.HIGH) # use title as notification id: # allows to reuse one notification for the same conversation notification_id = notification.get_title() self.__notification_ids.add(notification_id) self.application.send_notification(notification_id, notif) self.application.statusicon.add_notification("%s: %s" % (notification.get_title(), notification.get_body())) return True def __on_permission_request(self, webview, request): if isinstance(request, WebKit2.NotificationPermissionRequest): request.allow() return True def __connect_widgets(self): self.connect("notify::has-toplevel-focus", self.__on_has_toplevel_focus_changed) self._webview.connect("load-changed", self.__on_load_changed) self._webview.connect("show-notification", self.__on_show_notification) self._webview.connect("permission-request", self.__on_permission_request) def __hide_on_destroy(self, widget, event): self.application.hide() return True def reload_element(self, bypass_cache=False): if bypass_cache: self._webview.reload_bypass_cache() else: self._webview.reload() def load_element(self): self._webview.load_uri(self.application.element_url) return self def load_settings_page(self): from urllib.parse import urlsplit, urlunsplit url = list(urlsplit(self._webview.get_uri())) url[-1] = "#settings" self._webview.load_uri(urlunsplit(url)) def finish(self): self._webview.stop_loading() self.hide() self.destroy() del self._webview return self revolt-master/syncrepo.sh000077500000000000000000000015421415664747400161070ustar00rootroot00000000000000#! /bin/bash # # sync-repo.sh # Copyright (C) 2016-2017 Adrian Perez # # Distributed under terms of the GPLv3 license. # set -e LOCAL="$(dirname "$0")/.flatpak-repo/" REMOTE='aperez@perezdecastro.org:/srv/http/flatpak.perezdecastro.org/revolt/' RSYNC_REPOS=$(type -P ostree-rsync-repos rsync-repos | head -1) if [[ -z ${RSYNC_REPOS} ]] ; then echo "$0: The ostree-rsync-repos (or rsync-repos) tool is not installed." echo 'Please install from https://github.com/ostreedev/ostree-releng-scripts' echo 'and make sure the tools are in your $PATH' exit 1 fi 1>&2 declare -a rsync_command=( "${RSYNC_REPOS}" ) case $1 in push) rsync_command+=( --src "${LOCAL}" --dest "${REMOTE}" ) ;; pull) rsync_command+=( --src "${REMOTE}" --dest "${LOCAL}" ) ;; *) echo "Usage: $0 push|pull" 1>&2 exit 1 ;; esac exec "${rsync_command[@]}"