From 7447d4678c6eaa5e66e97063318662917aedd340 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Thu, 12 Aug 2021 13:28:44 +0200 Subject: [PATCH] First commit --- LICENSE | 674 +++++++++++++++++++++++++++++++++++ README.md | 64 ++++ README_fr.md | 64 ++++ check_process | 19 + conf/app.src | 7 + conf/nginx.conf | 39 ++ conf/php-fpm.conf | 430 ++++++++++++++++++++++ doc/DISCLAIMER.md | 0 doc/screenshots/screen-1.jpg | Bin 0 -> 131332 bytes manifest.json | 50 +++ scripts/_common.sh | 28 ++ scripts/backup | 63 ++++ scripts/change_url | 105 ++++++ scripts/install | 173 +++++++++ scripts/remove | 77 ++++ scripts/restore | 100 ++++++ scripts/upgrade | 134 +++++++ 17 files changed, 2027 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 README_fr.md create mode 100644 check_process create mode 100644 conf/app.src create mode 100644 conf/nginx.conf create mode 100644 conf/php-fpm.conf create mode 100644 doc/DISCLAIMER.md create mode 100644 doc/screenshots/screen-1.jpg create mode 100644 manifest.json create mode 100644 scripts/_common.sh create mode 100644 scripts/backup create mode 100644 scripts/change_url create mode 100644 scripts/install create mode 100644 scripts/remove create mode 100644 scripts/restore create mode 100644 scripts/upgrade diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + 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 +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..096c718 --- /dev/null +++ b/README.md @@ -0,0 +1,64 @@ +# eLabFTW for YunoHost + +*[Lire ce readme en français.](./README_fr.md)* + +> *This package allows you to install eLabFTW quickly and simply on a YunoHost server. +If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/install) to learn how to install it.* + +## Overview +MineWeb is a CMS (that is to say a content management system), in addition, a completely customizable and intuitive site, which will adapt perfectly to your Minecraft servers! + +**Shipped version:** 3.6.7 + +## Screenshots + +![](https://mineweb.org/assets/img/features1_mb.png) + +## Configuration + +How to configure this app: From an admin panel, a plain file with SSH, or any other way. + +## Documentation + + * Official documentation: https://doc.elabftw.net/ + * YunoHost documentation: If specific documentation is needed, feel free to contribute. + +## YunoHost specific features + +#### Multi-user support + + * Are LDAP and HTTP auth supported? **No** + * Can the app be used by multiple users? **Yes** + +#### Supported architectures + +* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/mineweb%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/mineweb/) +* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/minewebP%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/mineweb/) + +## Limitations + +* Any known limitations. + +## Additional information + +* Other info you would like to add about this app. + +## Links + + * Report a bug: https://github.com/YunoHost-Apps/mineweb_ynh/issues + * App website: https://mineweb.org/ + * Upstream app repository: https://github.com/MineWeb/MineWebCMS/ + * YunoHost website: https://yunohost.org/ + +--- + +## Developer info + +Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/mineweb_ynh/tree/testing). + +To try the testing branch, please proceed like that. +``` +sudo yunohost app install https://github.com/YunoHost-Apps/mineweb_ynh/tree/testing --debug +or +sudo yunohost app upgrade mineweb -u https://github.com/YunoHost-Apps/mineweb_ynh/tree/testing --debug +``` diff --git a/README_fr.md b/README_fr.md new file mode 100644 index 0000000..c646953 --- /dev/null +++ b/README_fr.md @@ -0,0 +1,64 @@ +# eLabFTW pour YunoHost + +*[Read this readme in english.](./README.md)* + +> *Ce package vous permet d'installer eLabFTW rapidement et simplement sur un serveur YunoHost. +Si vous n'avez pas YunoHost, consultez [le guide](https://yunohost.org/#/install) pour apprendre comment l'installer.* + +## Vue d'ensemble +MineWeb est un CMS (c'est-à-dire un système de gestion de contenu), en plus simple, un site complètement personnalisable et intuitif, qui s'adaptera parfaitement à vos serveurs Minecraft ! + +**Version incluse :** 3.6.7 + +## Captures d'écran + +![]() + +## Configuration + +Comment configurer cette application : via le panneau d'administration + +## Documentation + +* Documentation officielle : https://doc.elabftw.net/ + * Documentation YunoHost : Si une documentation spécifique est nécessaire, n'hésitez pas à contribuer. + +## Caractéristiques spécifiques YunoHost + +#### Support multi-utilisateur + +* L'authentification LDAP et HTTP est-elle prise en charge ? **Non** +* L'application peut-elle être utilisée par plusieurs utilisateurs ? **Oui** + +#### Architectures supportées + +* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/mineweb%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/mineweb/) +* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/minewebP%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/mineweb/) + +## Limitations + +* Limitations connues. + +## Informations additionnelles + +* Autres informations que vous souhaitez ajouter sur cette application. + +## Liens + + * Signaler un bug : https://github.com/YunoHost-Apps/elabftw_ynh/issues + * Site de l'application : https://www.elabftw.net/ + * Dépôt de l'application principale : https://github.com/MineWeb/MineWebCMS/ + * Site web YunoHost : https://yunohost.org/ + +--- + +## Informations pour les développeurs + +Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/mineweb_ynh/tree/testing). + +Pour essayer la branche testing, procédez comme suit. +``` +sudo yunohost app install https://github.com/YunoHost-Apps/mineweb_ynh/tree/testing --debug +ou +sudo yunohost app upgrade mineweb -u https://github.com/YunoHost-Apps/mineweb_ynh/tree/testing --debug +``` diff --git a/check_process b/check_process new file mode 100644 index 0000000..37da21c --- /dev/null +++ b/check_process @@ -0,0 +1,19 @@ +;; Test complet + ; Manifest + domain="domain.tld" + path="/path" + is_public=1 + ; Checks + pkg_linter=1 + setup_sub_dir=0 + setup_root=1 + setup_nourl=0 + setup_private=1 + setup_public=1 + upgrade=1 + backup_restore=1 + multi_instance=1 + change_url=0 +;;; Options +Email= +Notification=none diff --git a/conf/app.src b/conf/app.src new file mode 100644 index 0000000..0702e37 --- /dev/null +++ b/conf/app.src @@ -0,0 +1,7 @@ +SOURCE_URL=https://github.com/elabftw/elabftw/archive/refs/tags/4.0.11.zip +SOURCE_SUM=c1e093b4396712976ad89d7bbfb4db74c20d8df5a1f92bb378422ba9afe525a5 +SOURCE_SUM_PRG=sha256sum +SOURCE_FORMAT=zip +SOURCE_IN_SUBDIR=true +SOURCE_EXTRACT=true +SOURCE_FILENAME= \ No newline at end of file diff --git a/conf/nginx.conf b/conf/nginx.conf new file mode 100644 index 0000000..1a75c75 --- /dev/null +++ b/conf/nginx.conf @@ -0,0 +1,39 @@ +location / { + + # Path to source + alias __FINALPATH__/web; + + # Force usage of https + if ($scheme = http) { + rewrite ^ https://$server_name$request_uri? permanent; + } + + index index.php; + + try_files $uri $uri/ __PATH__/__PATH__/index.php?$query_string; + + location ~ \.php$ { + if (!-e $request_filename) { + rewrite ^__PATH__/?(.*)$ __PATH__/index.php?/$1 last; + break; + } + fastcgi_pass unix:/var/run/php/php__PHPVERSION__-fpm-__NAME__.sock; + fastcgi_index index.php; + include fastcgi_params; + fastcgi_param REMOTE_USER $remote_user; + fastcgi_param PATH_INFO $fastcgi_path_info; + fastcgi_param SCRIPT_FILENAME $request_filename; + } + + # security headers + more_set_headers "Strict-Transport-Security: max-age=63072000"; + more_set_headers "X-XSS-Protection: 0"; + more_set_headers "X-Content-Type-Options: nosniff"; + more_set_headers "Content-Security-Policy: default-src 'self' data:; script-src 'self'; connect-src 'self' blob: https://get.elabftw.net; img-src 'self' data: blob: https://www.cornify.com; style-src 'self' 'unsafe-inline'; font-src 'self' data:; object-src 'self'; base-uri 'none'; frame-ancestors 'none'"; + more_set_headers "Referrer-Policy: no-referrer"; + more_set_headers "Feature-Policy: autoplay 'none'; camera 'none'; document-domain 'none'; encrypted-media 'none'; fullscreen 'self'; geolocation 'none'; microphone 'none'; midi 'none'; payment 'none'; vr 'none'"; + more_set_headers "Vary: Accept-Encoding"; + + # Include SSOWAT user panel. + include conf.d/yunohost_panel.conf.inc; +} diff --git a/conf/php-fpm.conf b/conf/php-fpm.conf new file mode 100644 index 0000000..ab1a471 --- /dev/null +++ b/conf/php-fpm.conf @@ -0,0 +1,430 @@ +; Start a new pool named 'www'. +; the variable $pool can be used in any directive and will be replaced by the +; pool name ('www' here) +[__NAMETOCHANGE__] + +; Per pool prefix +; It only applies on the following directives: +; - 'access.log' +; - 'slowlog' +; - 'listen' (unixsocket) +; - 'chroot' +; - 'chdir' +; - 'php_values' +; - 'php_admin_values' +; When not set, the global prefix (or /usr) applies instead. +; Note: This directive can also be relative to the global prefix. +; Default Value: none +;prefix = /path/to/pools/$pool + +; Unix user/group of processes +; Note: The user is mandatory. If the group is not set, the default user's group +; will be used. +user = __USER__ +group = __USER__ + +; The address on which to accept FastCGI requests. +; Valid syntaxes are: +; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on +; a specific port; +; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on +; a specific port; +; 'port' - to listen on a TCP socket to all addresses +; (IPv6 and IPv4-mapped) on a specific port; +; '/path/to/unix/socket' - to listen on a unix socket. +; Note: This value is mandatory. +listen = /var/run/php/php__PHPVERSION__-fpm-__NAMETOCHANGE__.sock + +; Set listen(2) backlog. +; Default Value: 511 (-1 on FreeBSD and OpenBSD) +;listen.backlog = 511 + +; Set permissions for unix socket, if one is used. In Linux, read/write +; permissions must be set in order to allow connections from a web server. Many +; BSD-derived systems allow connections regardless of permissions. +; Default Values: user and group are set as the running user +; mode is set to 0660 +listen.owner = www-data +listen.group = www-data +;listen.mode = 0660 +; When POSIX Access Control Lists are supported you can set them using +; these options, value is a comma separated list of user/group names. +; When set, listen.owner and listen.group are ignored +;listen.acl_users = +;listen.acl_groups = + +; List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect. +; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original +; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address +; must be separated by a comma. If this value is left blank, connections will be +; accepted from any ip address. +; Default Value: any +;listen.allowed_clients = 127.0.0.1 + +; Specify the nice(2) priority to apply to the pool processes (only if set) +; The value can vary from -19 (highest priority) to 20 (lower priority) +; Note: - It will only work if the FPM master process is launched as root +; - The pool processes will inherit the master process priority +; unless it specified otherwise +; Default Value: no set +; process.priority = -19 + +; Set the process dumpable flag (PR_SET_DUMPABLE prctl) even if the process user +; or group is differrent than the master process user. It allows to create process +; core dump and ptrace the process for the pool user. +; Default Value: no +; process.dumpable = yes + +; Choose how the process manager will control the number of child processes. +; Possible Values: +; static - a fixed number (pm.max_children) of child processes; +; dynamic - the number of child processes are set dynamically based on the +; following directives. With this process management, there will be +; always at least 1 children. +; pm.max_children - the maximum number of children that can +; be alive at the same time. +; pm.start_servers - the number of children created on startup. +; pm.min_spare_servers - the minimum number of children in 'idle' +; state (waiting to process). If the number +; of 'idle' processes is less than this +; number then some children will be created. +; pm.max_spare_servers - the maximum number of children in 'idle' +; state (waiting to process). If the number +; of 'idle' processes is greater than this +; number then some children will be killed. +; ondemand - no children are created at startup. Children will be forked when +; new requests will connect. The following parameter are used: +; pm.max_children - the maximum number of children that +; can be alive at the same time. +; pm.process_idle_timeout - The number of seconds after which +; an idle process will be killed. +; Note: This value is mandatory. +pm = dynamic + +; The number of child processes to be created when pm is set to 'static' and the +; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'. +; This value sets the limit on the number of simultaneous requests that will be +; served. Equivalent to the ApacheMaxClients directive with mpm_prefork. +; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP +; CGI. The below defaults are based on a server without much resources. Don't +; forget to tweak pm.* to fit your needs. +; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand' +; Note: This value is mandatory. +pm.max_children = 5 + +; The number of child processes created on startup. +; Note: Used only when pm is set to 'dynamic' +; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2 +pm.start_servers = 2 + +; The desired minimum number of idle server processes. +; Note: Used only when pm is set to 'dynamic' +; Note: Mandatory when pm is set to 'dynamic' +pm.min_spare_servers = 1 + +; The desired maximum number of idle server processes. +; Note: Used only when pm is set to 'dynamic' +; Note: Mandatory when pm is set to 'dynamic' +pm.max_spare_servers = 3 + +; The number of seconds after which an idle process will be killed. +; Note: Used only when pm is set to 'ondemand' +; Default Value: 10s +;pm.process_idle_timeout = 10s; + +; The number of requests each child process should execute before respawning. +; This can be useful to work around memory leaks in 3rd party libraries. For +; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS. +; Default Value: 0 +;pm.max_requests = 500 + +; The URI to view the FPM status page. If this value is not set, no URI will be +; recognized as a status page. It shows the following informations: +; pool - the name of the pool; +; process manager - static, dynamic or ondemand; +; start time - the date and time FPM has started; +; start since - number of seconds since FPM has started; +; accepted conn - the number of request accepted by the pool; +; listen queue - the number of request in the queue of pending +; connections (see backlog in listen(2)); +; max listen queue - the maximum number of requests in the queue +; of pending connections since FPM has started; +; listen queue len - the size of the socket queue of pending connections; +; idle processes - the number of idle processes; +; active processes - the number of active processes; +; total processes - the number of idle + active processes; +; max active processes - the maximum number of active processes since FPM +; has started; +; max children reached - number of times, the process limit has been reached, +; when pm tries to start more children (works only for +; pm 'dynamic' and 'ondemand'); +; Value are updated in real time. +; Example output: +; pool: www +; process manager: static +; start time: 01/Jul/2011:17:53:49 +0200 +; start since: 62636 +; accepted conn: 190460 +; listen queue: 0 +; max listen queue: 1 +; listen queue len: 42 +; idle processes: 4 +; active processes: 11 +; total processes: 15 +; max active processes: 12 +; max children reached: 0 +; +; By default the status page output is formatted as text/plain. Passing either +; 'html', 'xml' or 'json' in the query string will return the corresponding +; output syntax. Example: +; http://www.foo.bar/status +; http://www.foo.bar/status?json +; http://www.foo.bar/status?html +; http://www.foo.bar/status?xml +; +; By default the status page only outputs short status. Passing 'full' in the +; query string will also return status for each pool process. +; Example: +; http://www.foo.bar/status?full +; http://www.foo.bar/status?json&full +; http://www.foo.bar/status?html&full +; http://www.foo.bar/status?xml&full +; The Full status returns for each process: +; pid - the PID of the process; +; state - the state of the process (Idle, Running, ...); +; start time - the date and time the process has started; +; start since - the number of seconds since the process has started; +; requests - the number of requests the process has served; +; request duration - the duration in µs of the requests; +; request method - the request method (GET, POST, ...); +; request URI - the request URI with the query string; +; content length - the content length of the request (only with POST); +; user - the user (PHP_AUTH_USER) (or '-' if not set); +; script - the main script called (or '-' if not set); +; last request cpu - the %cpu the last request consumed +; it's always 0 if the process is not in Idle state +; because CPU calculation is done when the request +; processing has terminated; +; last request memory - the max amount of memory the last request consumed +; it's always 0 if the process is not in Idle state +; because memory calculation is done when the request +; processing has terminated; +; If the process is in Idle state, then informations are related to the +; last request the process has served. Otherwise informations are related to +; the current request being served. +; Example output: +; ************************ +; pid: 31330 +; state: Running +; start time: 01/Jul/2011:17:53:49 +0200 +; start since: 63087 +; requests: 12808 +; request duration: 1250261 +; request method: GET +; request URI: /test_mem.php?N=10000 +; content length: 0 +; user: - +; script: /home/fat/web/docs/php/test_mem.php +; last request cpu: 0.00 +; last request memory: 0 +; +; Note: There is a real-time FPM status monitoring sample web page available +; It's available in: /usr/share/php/7.0/fpm/status.html +; +; Note: The value must start with a leading slash (/). The value can be +; anything, but it may not be a good idea to use the .php extension or it +; may conflict with a real PHP file. +; Default Value: not set +;pm.status_path = /status + +; The ping URI to call the monitoring page of FPM. If this value is not set, no +; URI will be recognized as a ping page. This could be used to test from outside +; that FPM is alive and responding, or to +; - create a graph of FPM availability (rrd or such); +; - remove a server from a group if it is not responding (load balancing); +; - trigger alerts for the operating team (24/7). +; Note: The value must start with a leading slash (/). The value can be +; anything, but it may not be a good idea to use the .php extension or it +; may conflict with a real PHP file. +; Default Value: not set +;ping.path = /ping + +; This directive may be used to customize the response of a ping request. The +; response is formatted as text/plain with a 200 response code. +; Default Value: pong +;ping.response = pong + +; The access log file +; Default: not set +;access.log = log/$pool.access.log + +; The access log format. +; The following syntax is allowed +; %%: the '%' character +; %C: %CPU used by the request +; it can accept the following format: +; - %{user}C for user CPU only +; - %{system}C for system CPU only +; - %{total}C for user + system CPU (default) +; %d: time taken to serve the request +; it can accept the following format: +; - %{seconds}d (default) +; - %{miliseconds}d +; - %{mili}d +; - %{microseconds}d +; - %{micro}d +; %e: an environment variable (same as $_ENV or $_SERVER) +; it must be associated with embraces to specify the name of the env +; variable. Some exemples: +; - server specifics like: %{REQUEST_METHOD}e or %{SERVER_PROTOCOL}e +; - HTTP headers like: %{HTTP_HOST}e or %{HTTP_USER_AGENT}e +; %f: script filename +; %l: content-length of the request (for POST request only) +; %m: request method +; %M: peak of memory allocated by PHP +; it can accept the following format: +; - %{bytes}M (default) +; - %{kilobytes}M +; - %{kilo}M +; - %{megabytes}M +; - %{mega}M +; %n: pool name +; %o: output header +; it must be associated with embraces to specify the name of the header: +; - %{Content-Type}o +; - %{X-Powered-By}o +; - %{Transfert-Encoding}o +; - .... +; %p: PID of the child that serviced the request +; %P: PID of the parent of the child that serviced the request +; %q: the query string +; %Q: the '?' character if query string exists +; %r: the request URI (without the query string, see %q and %Q) +; %R: remote IP address +; %s: status (response code) +; %t: server time the request was received +; it can accept a strftime(3) format: +; %d/%b/%Y:%H:%M:%S %z (default) +; The strftime(3) format must be encapsuled in a %{}t tag +; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t +; %T: time the log has been written (the request has finished) +; it can accept a strftime(3) format: +; %d/%b/%Y:%H:%M:%S %z (default) +; The strftime(3) format must be encapsuled in a %{}t tag +; e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t +; %u: remote user +; +; Default: "%R - %u %t \"%m %r\" %s" +;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%" + +; The log file for slow requests +; Default Value: not set +; Note: slowlog is mandatory if request_slowlog_timeout is set +;slowlog = log/$pool.log.slow + +; The timeout for serving a single request after which a PHP backtrace will be +; dumped to the 'slowlog' file. A value of '0s' means 'off'. +; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) +; Default Value: 0 +;request_slowlog_timeout = 0 + +; The timeout for serving a single request after which the worker process will +; be killed. This option should be used when the 'max_execution_time' ini option +; does not stop script execution for some reason. A value of '0' means 'off'. +; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) +; Default Value: 0 +request_terminate_timeout = 1d + +; Set open file descriptor rlimit. +; Default Value: system defined value +;rlimit_files = 1024 + +; Set max core size rlimit. +; Possible Values: 'unlimited' or an integer greater or equal to 0 +; Default Value: system defined value +;rlimit_core = 0 + +; Chroot to this directory at the start. This value must be defined as an +; absolute path. When this value is not set, chroot is not used. +; Note: you can prefix with '$prefix' to chroot to the pool prefix or one +; of its subdirectories. If the pool prefix is not set, the global prefix +; will be used instead. +; Note: chrooting is a great security feature and should be used whenever +; possible. However, all PHP paths will be relative to the chroot +; (error_log, sessions.save_path, ...). +; Default Value: not set +;chroot = + +; Chdir to this directory at the start. +; Note: relative path can be used. +; Default Value: current directory or / when chroot +chdir = __FINALPATH__ + +; Redirect worker stdout and stderr into main error log. If not set, stdout and +; stderr will be redirected to /dev/null according to FastCGI specs. +; Note: on highloaded environement, this can cause some delay in the page +; process time (several ms). +; Default Value: no +;catch_workers_output = yes + +; Clear environment in FPM workers +; Prevents arbitrary environment variables from reaching FPM worker processes +; by clearing the environment in workers before env vars specified in this +; pool configuration are added. +; Setting to "no" will make all environment variables available to PHP code +; via getenv(), $_ENV and $_SERVER. +; Default Value: yes +;clear_env = no + +; Limits the extensions of the main script FPM will allow to parse. This can +; prevent configuration mistakes on the web server side. You should only limit +; FPM to .php extensions to prevent malicious users to use other extensions to +; execute php code. +; Note: set an empty value to allow all extensions. +; Default Value: .php +;security.limit_extensions = .php .php3 .php4 .php5 .php7 + +; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from +; the current environment. +; Default Value: clean env +;env[HOSTNAME] = $HOSTNAME +;env[PATH] = /usr/local/bin:/usr/bin:/bin +;env[TMP] = /tmp +;env[TMPDIR] = /tmp +;env[TEMP] = /tmp + +; Additional php.ini defines, specific to this pool of workers. These settings +; overwrite the values previously defined in the php.ini. The directives are the +; same as the PHP SAPI: +; php_value/php_flag - you can set classic ini defines which can +; be overwritten from PHP call 'ini_set'. +; php_admin_value/php_admin_flag - these directives won't be overwritten by +; PHP call 'ini_set' +; For php_*flag, valid values are on, off, 1, 0, true, false, yes or no. + +; Defining 'extension' will load the corresponding shared extension from +; extension_dir. Defining 'disable_functions' or 'disable_classes' will not +; overwrite previously defined php.ini values, but will append the new value +; instead. + +; Note: path INI options can be relative and will be expanded with the prefix +; (pool, global or /usr) + +; Default Value: nothing is defined by default except the values in php.ini and +; specified at startup with the -d argument +;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com +;php_flag[display_errors] = off +;php_admin_value[error_log] = /var/log/fpm-php.www.log +;php_admin_flag[log_errors] = on +;php_admin_value[memory_limit] = 32M + +; Common values to change to increase file upload limit +; php_admin_value[upload_max_filesize] = 50M +; php_admin_value[post_max_size] = 50M +; php_admin_flag[mail.add_x_header] = Off + +; Other common parameters +; php_admin_value[max_execution_time] = 600 +; php_admin_value[max_input_time] = 300 +; php_admin_value[memory_limit] = 256M +; php_admin_flag[short_open_tag] = On diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md new file mode 100644 index 0000000..e69de29 diff --git a/doc/screenshots/screen-1.jpg b/doc/screenshots/screen-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..90a6aa94ec7e52801082fc1e39ea94b6034d01a0 GIT binary patch literal 131332 zcmeFZbzD{3)-b#_o0OK2*nkKE5=wVUiP9kmDqTu*s3HyRcBnT9Mg0UTVLP7YV4C=*s2`2gp zUzCF&{Z@|)2qXQ3^$5WP7|?(G&M(t-(H>ak`4}J$prfLqp`xIpp`l@5pkKiv#KywJ z#3H>)fJ;b0Mny?M27_Ivy-k1p1~Ux|#=vunnU#%`laq>`Pl%UY@HPi0`$Z)X3=9k` zOe_*?Y!Y^A7&ZIN6&DJk&}y?hnJ6ETtZSx`ku^v6;-u|>KczU^$iS-j7?0R+1lAV zI667Ic)xn>oXR7shsa$^itQ)fd_uZUT0Iq9%LRTOjLx}rJK<@ zSg@(4FgN#8H&RL9#cak4maSLUB-6UhC+>&(uis!gViSR9=2&mS>!)*H@TA1DS?<0O z!6`jKJcaXyj5Xgd|7G8UXBQi@Hw~4YRfTdmV9GKlXbSH6YRnrmVyF$EP z!W!Tv>~bVcGZ+x8iTYyV+P8CnRGLKPdvih_i!F}F4!`~h%T`Q#n8!CEve%8OkL$d< zJmRa~HSea-40;M%odd58XJNqy>4`^f=~QR8y*9fVMe)x8^ntRLPPux%bD(==aWz=; zaj+(En5^(xm^18dotP@x!NX-3?umQMIdCPRF<}Rp>VOFM9Jr<}JLl39x*|%&;qfhF zE8`S`c7`H;4m9-qQ@Ni1`^xY>I=Q{|g8Ef7j?AKaALJYuSsprJQXm3lfOZbhT|WnA zRu(lGpzyqdhw)73KqBs$tk_TH`WifTK#UeYk%O;C#BYGZ-7}a|;&2Pv35{;5{(Fz2 z8uY#63C09)7+!Pp(m4lSSz`vz@F*T5;tn_ZMyuW+zMli}1?Rxj-FI>Xc*GL4dsqxa zJqU#pMsVg&NHegv)NzBhRo$+Am|lc|Gz%eRLedu=U|>52>sNqfs~e;N%She{o#`F7 zO(22c-JwnLe5sK7>;`|89xL8+Kx8nrgESGjt00v&j6cAQFEvOaf-4k9sm73Z8C!r8 z)IVt{oKcA=$pJml07D9=k>?eL4z`;zJZ5HV<{87?(8UXU@OH0}C-EB&nP>pe=pdpd#T2Fa2?<(L8Bt9Lb%NLNsLKB;JfEkEWz^z*%I6T3K#^ zhza(Ro93mI^?}Ob?KCqr|SW3`pe822mO< zPziB7C~VH<97wpIffrEgybyu07rrmnr4$suo2F)-6hcL7zO++X-h(>%kf%OQ9>lh zO=n{%E6)LbKuHgvS-XZt18X+DnSb@Lth5wKa#YkEOn?HW z_s)fs2Cjueu^u8TqF2cu=S~S*epMGZTp3zX{%97cZp+Qe-b6c~_GSnF>%HbK5!Vd3 za+8JfvT4PVR{PjChoL&9_ZL7T`3(aAo=BLVKbbwq(k*jBgU#v1SQXbV%(hM2hr`_U zM9(fPisAq(l{D1p^Smm zt_v_#?C0+pSk{U|Acyywsb14avW0%DHP82S7H@Ox%A1!p^vk7*iqe0tk*5f*<64uc zbuI&{Z%oG6YR!B}ZmN3s1x?m%e`3(mnF^fP^L_(7=E)(k1hs-kYXEq95@4^~7g&g) znsR80zS@rUrQOUQ9T+ay%XB(j)#q*0 z>NjwI=d(So&(YAOkdULMOkCYE59f8@od)=&lN!xuLfJPI`gnU zK}4ijzrE^w=+6^S$PgN|6%|eqNjFh(gqw>PGom+>b_yhHX0{)>mXUWCkZ*D{p942O@V|J|yB?6+ zsYOpNeGYt#Y#XM08T^5FmOfTZoG4O(1Ah&OtJzsK6)W-|ot=BAI;ydIg|BH@gdh0g zwa8GjLqw(k3nS_2FNOH+pry%leF10)C76e=q|nBHdu3>d^@>Obou(42{M{!&H2_Z< z^|fLmqbEQDDwjm8{GsZR=;xZu7WGnw2y)UV6?=jM<4>Fu94KOfbFF2+I1wm(IoxaP zNtA;l2VfabrXCAb@2enEKvmn|i{8`? zLx1}479kV-Q42;a*I;B+cp~qK-^tRuM>RWyIxbf%BV%8zbjh3MSYIK==G3=*T%v%8 z2Ew7;N?wb%{2A}vlfm~RorVW*V~Zp_0}NCoS?TE2uQE$Qr?Xo)G%ZZ%s=^U|=a@FBYRWD+q$ zh7?cd*=|MTQp%SBxMGT@x#RZnw?#&&v=^T#uwl@+%-O@!00C&Xs-8yl!$1mI|G-xM zH!AFC=mv8223UK$Y52+I_wdEJd01hwb}fl$J(7fgk|ZJI=>hSV>qzqROJ|#zxn?Zs zl|j2X^&i-7sk+VSz~EH^(IvERuUgu^Zl+2gEZgHW+qu~w)JoThX0>KWYL#knr^}t= zpgWWZ`7{L8u+IIM@5FUr^_Yxf)r29_|CL5yCcdX4lul|~C1UbcGM$OqqehrT3-7Lo z=O=-(Cil`5;YLpyy!y|i0Hl-Mb_fbR?2n>M4tE;AcHq~1(H_w9;PB4edxS$=%va-L zw@lx5Hu{*7_EDa-rTBvk_;BxnC&Q>jVA@D_0V>m#%?YtF?^9D^WTs(9vp8Zr{-u{GCn@IKE?b@+;iM1m@I32s@u1jza%J?wrdTP!3=|I*VM3^s)N;YUi(e}I=)=$oPUM(0wTj~PCDOJ6j#b>d znkK`~jx$vhG)5f)=TRLIR=^!qsuN6OA!l?IZ)9JZ1k8*lM#8L$Ukd?L>}aFW^Y6i-qzYegQ_s> z-%tRnOKSj($La`2)gs?rMP>@1+Os}24VA`I4L66|K#^q7gj|oO5k~`lN$~=hPO2Z9 zLq8S>@j`pOh^8XMLV1n?X16U*Eam`PG2ROkus`blamY;aln(B?ej~wq^7)yOST& zl$5CGb8EJd=QnXYh>nfWvzwA(w|e}6R%ePJDaN7iis)$?3s*#qY+5}SfgC~xh$N4e zTJ5-N2tTfc$G3z%jlGWxvtA{_RSU5NPi?=dE;T|{4tvopo!bkJt)^y0(TjUtOHSBs zzpU8rdOYB8FC76DclL^G2Jl2lx+u$zw${{<9ffrThKz7fnZT^<|+Y${7NrsZb3^nk?)^CN5iC;}leU?PX=rxQ3+Ma;k zh*nBUwkSJY1E1iXj3s&Q;yGI^_iBeX43IYDdkqm>$h+57+}kW8gzvwYaDQ5)B#Of- zp`sgj1FJ_HxrzjSAQym3#IT+r^;hCWuoE|Jt>o9Po{;%-Pyi5suMMA zcndM>J$hubr_vrXAT7bIAv%6#u+s+6tZ2%-M{4wN+p`w=Y|SGcM7wjLY|cl{XOQw` z#KpB0l@+99WFy6a|=5gW$C-uLD$-Kv^fA7pak#$R)Aes-_}Y@ zQBn4ngYTc?y}=*uPoR(GqOO0w|8H}!4GeAdLC4^Au#~92l?~`nh3J4Vx1*ia1sn;& zg!(4B1|Xab!pt@xfgn75k+1g~ym|o}|A3J|5FoTsRTc+%yYR1GH@*bxU4r#ZY|Ozj zoM0JR19Jn;GGOrD=3ZUO*WH~^f6oSz>jou8j3gTCl-0I0F}1K%9%bw^D) z+(mA-u~Ieu$x`-q8(slUbzRtsK3{GzNAyxps{@||v$%-F>{nHr2^qdmc$IzeE8qD# zb7CFucIw+|y!NwOodfTUl{euJq=YQXbl7jfhAdU#0wnU!>cMvY!$W#>lJ)6yp9MDe zUtSjUV-VddFsvs*rmx*p9#CoXEyR3H{i8i@E(FDdh0So6Yu8NfL{2rQ5Y-enccE=l z){KcKutQKwu{eX%*%VJPgzgxN-#s>SB?Ou#xYg5;&Y!^N?VQXH+k}*-^5Zy7)#d`m zHT;o9XbLzX6M;$vxq#&*x5NAYXW)nk zPwj7=Ku%9Q01pqU8mg(LO|-w8;qH>~Kat~)p8oG&C>?v8>M93%dIW-`yq02R1ad_L zSL{lO9VyLRr0*zhlse%oSn_;zpmgn~68$eVFIb&9Pl3xbGR(>88hdr8@+pmidcn?Y zIW%}bZwE0Z)IktaUTK`LYFuOGb~{7jztk!~BHK*tWpepAFwkk%L`nSp(86o|S-?yi z>mLjIar~djfPCNZE%mtbyy;Zzq{2hd;|^6nRa?_8+V&QhQ8(4+?%9@qsTRpvm-443 z8%7B3;Cl$I41G8O#$uIoix7ubulyna9M%d<*CwD^dw=k!eEH&xrmteJWiXFtb0?d$ z7dUXU5|~5UT=*W>l<+P1!M@kjJv1KbVtnft$a__bJ)jZOzPzZFSUIc+;m6O zuGO~Ll~oEWws2(&X}=$eSfy@0oPs})o^%p%PEb&^IlhE|bO-+fb^u2{7q`jt&hDXx zubg{kKSd~vpFl*j5WmE`yN{aQfz3C0qg(Dmyj18dNu~1D!D(~US9hZkI%2;z}? zUU94Rzt%8WY>eTeaO>CJzbjliPh9F1o3xubOE zaN1@5=C_YxD@%n$n<~Ajkat-q^m7;V1aRC5vWJHFafDTDML6(>ZO$mvsrY(KpT#-y zEcIA7>1G+##q2DWiGQ3k=Eue+$VvE+>j*P1bZ$MehfO|O@&p?|?(arJoCAwgUEl*l zt7(d{6tK+r62FCUUz+!8`gGgf&bp|Osb|kAq(w;ktsOe{>6a=K-bOC-9@8BMhb;4v z`6lZ(|DqHlivd?;QSgk=1&ok~=v{Z+tyw99H*R!{SIC7Yg}*g^l9cVh=7x~Ys_h&S zf{K&&na**;0=?am(jCTE(ezQ{vnFh<;(SFg25q+DeB&qi%~`yey3FEy@_G@@PkXv; zj=Y+eNHvKqcuzf%```U)7>uDG+Lmqhrgx!~Corl9o`{i39GcMm&%Du;AF<7EkH;Dt zIIo^&@(zs@b{Vd?2{t`X@tY}6>6#x|rW7BxJwl6E+!dyLkhI8`9wZ_zO(#GlPrL69 z6T(%OhThTan`=nNFSrxJ~)S z*Dj%bShi2yp155JgOyX^{AANO8Dv_65INy2zqY(d$^p zg*L)nG6na=Go+)J>{4g;Q>YiV_o`qYY`?=T3*Sw;S+WIR}n@j3yW_n#00pa{9Or$<`&$$pfhh$aAQCj%DNO8YkVt+a2XH=&5^cvX?kh zr%Xz z`@9KCkHUyx>axYAfNC8<=_$hy#Fs_1z`Av`w|kzK(0}LCbN>Y7@<7#>Cu&*Q=ID(y zxqfoCt<@eH(}tp8aPD(Uf$Bb3)=Chad*b};DvtVO;+*+9j&{_(xK@*E(u|OMP5<}( zEi(SfOg;gvSsY(gn~Yq(Cu-!^0c?jFIWe8fBZAkhdGch^Bdx}Y+cmON!Vw&-_Sv&~ z8#0Z-Vgap}r~^R=7q~(FBmBN_RMfNQKMI`{y30LEYE&+Fl_&NjeN5Vg**Q?MG91-w z&^C3c^tiE4nzZ-1DTPtQqO)-5s0Z7GNaD%BftwM@qk^ywWIC*D(txs^eE{e|JQ0F+ zZ(IylIXU3@LaIa-2jkVGzjXlMYa)q=1Es}_7?olp>h1R^@0R$Eob7_59tlgnUF?O3 ziS&3|<-V2ZXt-Q+VJ6&=2lka;mLE;6V+jpG(RYN~q3t{PLLw@Fd03%bqX@gX;}yp= zwmAY*qz=c7-D3M|)#HKPr&>k!3#o~J$O3>>X{&rFLCYlB|K5QhMYOwoGUNF-0sxoPFB(=tisK!ZgdGp(q39bp_Fg8LXbXpf>K0$Do|0n988i8q7hPE9JzyjO~vO3m-v=s&2eXGd=E70y- zQ?=6Y<9==qEQP<;RvaI!=fk zxkTD;AlQ}vIv|;1k(&4`8>!yB`*#lJ%e8<@N(sFMl_J}Ef6tOW@30W?eQigos*dgQ z>iq)&!bN-;@qY#nwIpfoNM1Or{wb)yyP<(YZMbU@ziDpW z2u{4zEZ^h!5_(_UhXN&Bn=#GAO_IEaLE%(&OxNnz{95PjakK4Ia5-0bPia^$Az@@C z;x3#6y&~XSOZS@cxo0`Q;MBquBpOibx*S_2q8_`~=zboa?$qU=iMJa*BUPeP6^rVa z{LMXeQO}>&M=bIwrgmHvZ*@764xb_-OIrk4-0xSbC-+20MaXxyu< z+leNZ`n_UM*`p=wPCgWc;QL2&hBH%%}az_fJo2o zU&?{B&h3^7^12jElm&l(|CYfyK@6+I)vt9R(t=B>kBYx#2TU)^rol#{b$)z9!^NBTZe@;5lw;;rWv?D6ux9ovZMJOb4TXT<&rew8HCr zKT(X$w6O|qqD=^w5rw7cnJ944*Q7l_oFy^uoDZ z+p$Zia1?fBJ&3}=H*UoOm!o5G+7uZ?_ii(xy?d@V&>rKq(6JN`3G@DqblH@R0`*uAxBpAsfgy0o3Fw;ZK0 zaZ|`%Xv>18;4fOq$Y)!R9w+^y3T#U18%ndq{N20stMEm9yaUYIZ!YA#9JrkO3ueGJ zkIFW+m}x~x{grho7FNAnC8TZ6{^!_&>6b=>1}WHIwXvLtKWzi?ZAB@eQ{bCuXI^!l zjutk~`|zD6{x}Le9P1tc8fz!Y+0n?Hc&Qnr+xMZ~lfU#O)YTJ`mu;s}Me51fQQv*3 z90=Z+yNn3?z57?T${%~L=kDptBU-vvY`L-AIz_Ay+78S^#}RUm&jFiAAzZYIf2ix9 z4BZ3Eir~0vp$+@|^=((pbHH-VaWJ-6;6+eb(?A>T^F3#yNudA{SSn?N=Zv`R3j@bXw=bcA;9pK&Rzpc2p9ApG0IDNL zvf>32U*+|S2n-|#C$^)!Zr`4nKo8G>9b7p0ek89I&f3-qe)wVt0Mw@2^@;u{`Rnqa zA=sSj=7n+wJr82=Q-I#JkLaCkrzcmjuqVL9M)9lQj~JKR1uLGZhk`GQ;Zi;tQ~2QA z=J(|$hl9^EVrgZKAMW(6o@CpMC0M6_F*@YPLfGR!o~%kAnsKl;AGPB;(v~wFYt~(G z*o@5+W4GPfSS78<`#2q&XPox+XSHY??Z=_*ORxUCLz}rvvg^Xjo*wZe;eDWyE2j%D zV$_+8qJsSCrlnZx_{hQYx#4E(t=(eWiiu&)B?#=voW2W14yTLq|gUhwlZ6T2k|n$ecYjD`)<1Ss1ExHUKR5V`%+q&(*ZGzh!n_ zO`)286p(Nbw+O9 zRm(IhtCoLDY@^L^0B`Aa8{#N?a-;vUH3V9Hg1$MMBHg@OV3iR}w|?V81MB03SsajB zV0=;fBAIO{Ji{(L%N&+qaP-S!Cg7t@v&EsxfkyO7ueVjI<)Z}}L(!VEtIc!92B z+$fk)Z+H{&T@tMDXEBY!up~zOy}wxao8B!RbOv+u9#zkSrp1Z}TMXCiqI_`rEG)-! zNm~4+!ULk1_YF&NcUYE6eL9;6O5OTbmkC}>ZY`WrMeop4mDkq`d=)VMkez`0pnk)q zQy~>`8t$C(bFBdFMGtTtJGt2R;Xo#;;~Lk2BS zItosu@~L+&l^iS+K(6vE!@edb9SZ8;tUUT|8FXm1oyd`GlTo%g)=E9xqf)i6lO^KbYw2GBc_- zYU^w?AB0RIPTfttT{SzhHFgw~_K6k$5*2J!-wUI8!MT%^A|d+*$l%s zrV`|R{r1j`Q||4+D(lpRUa+|xOFgznF|4B#YIhE_5V4H6*yWqRyWsXBAdV=jMd2>M zg$3bp`eRwffkDgNl(6%d`UfI9-F-#)JHB_sx$Cvv6n5jMq!~Mm52UH=7~?{yM%v2X z-BSPdUH`c{+lQtj1z|hE;GJp)+tY;jT{_$ZC%7>&1x?=m`(m>dqkf*^UG5t2Q7FzH zRPT3z1iA&?N?34z)Y}{E^J4TdBCo6?#ZgN|r*i$N*Yf8d1paXWO_4tmfUVPHE^As^ z<==Jl(ad{NVotVQQP!IL3%?)@u~2CC2w4YsA#wP9Zy`OE(ap)TgL>w3fJ)X(XCotc zmRR3Pt;hL87eFZzL_wlhqoR+2e(q6k^URA&)@P+w{yg&KK>vSGM3<=l8{qGgsz$ZH z?%MmVWy5Wom3K)hs`|%>rE72b{F0xUyg5dF@}xt&V;8P-yk`^oa{EKjtJUcvS%dJb zxk~wh6Znv|n^KulrrAmN2*>G+Il1#Lw?bBmW!q7(Z}6Jg1~_;B1||Qx2sXv{q-v`B z|9;QbH~K@K;3X&iH7L{jo|h`ag00ML8!oG^4E|~3s_on)_PeUd`DphKi@C5{H1K_| z;!Z_hm}*zHhc~Dr^+>Ng&JiUlsXt{*9^@(M!bsv2Tp*pQC(p(j~EkC_BWO z2o`xaHG&w%Roj0Xvb3VjxoWsQ(z))#OrOZN!0foQ+!;~3eR+;6x0jcRvej_m#K{T zkZ-Yqs3PA@@|+r(Ta7b?FH@8aFT}jB9cMq8cj%~8s8A`L>*<+uq2w#cXrB}yDRPgK z69t1_c)F(&G8vaA8OTf_mO(zNrJl~^ZXO6Lr-?~0GktFF6JurTZr508 zMB;p^TidrQ9>0ji=LyL+tAHml{?%^Pcj>*SVIKZ+GLI(JEebS|rK-7ceh;>7&iF6N)C9k1BDmR(|iW1?Tt;*p84el@+-9UOX5(?kELaV5mh$skU_;Ne@MupweMb^O$>p&ah^XhEQgywo+weZ637VVlywzSABSUr;hH^t1rZ zuQ~ZD>mODd&@3OBwfbR}yU&xIISydUjwr!CE)@p3CPoAahYa+s+!3T$e`y?!$mQd6 zp%K^0=hGT#;-Gr``>bS}1LPzcQ(6!C33y(7<3n~xoVLurhxz#exgLr1{`CIe9u74O+ zTn=BLF&`aaNdt#ni{bKo!!|mrWg0u4FMfziPO! z%YKLd5`avf!kIEMSZ*df^nPJd;uAd4lR7~r;wVMo|L>oK5mAepSk7|s>>`M=K7;cL zn<{2jssuH51DmQm<-x*c_i+X1nMELsLMi2gfys+S91G$6+QNVJJdV*_Y3DEL`{x_@ zb2-8J9{h)S^gG6g&{NWrIS(lhKB}ICPWObKr{aT#Lwe=^jP;-9P^!1@9#T}HO_e#) z3-KuMJp>xc&jIf5)8%z9 zH*hd3cyI6bd9B(wY^`Gn{cgSex0?L_P(A-QK88o@s+?XrN+Qad zQnOza(yJU!m2!WgVpuJ8>JpuPAq4I0S%h^EbeDc@N{M&h3hnF`f_Akm#o~ zoDKcxLKSP)q_Ba@HfY0zD>0`h5M+@wVMDt-hp6Om-N0lUvSE!IqH-GjtIGaI`AD~s zH@SnlCWUFfUOa#lhE~lk@XOs+TCB3Q>pTa#_y&1m8HAvLuhvgzP6f1idmUoqX8$f* z|0hb2yIE1K0HnK~0DWzW)AUN$>biBB2AY6 z*8sBo>95T`j~IS#GmL0siO^y$e)Knz%_-I(kABbZ$y$;86R)cZ0kZtafu9KG2`~f% zMP~i*sl8g!uTMB+W7e5B<|+{OnB&$c2H5L-!uAtO+&p2JRZAkpSMzn5*J#XmjgEg; zSo<}(cJ}U@cZ&6D?ik#6MPJ?35Y;q^=HUHq6mK#T-L6BUgG|=VX*o_2)vmwIjKgU1 zN-v(yWL1jI*QKU01(o)CgMfsv*0=h`ty?-b4K(OCPV;>YNOv&qO1-)9?oo<~{&*fH zpC5N)cPv#mdd-#g7#$0IXR}(E7@>hHGx%yp=qo$RG9R7@WyY=dkfsIo_-ieQuBEI7hSoDerI)Lq&7!=-K#}b##{HTBG+1FYg)QW!-^2Q@x`87f|zP2db zvGc}Tw?f+hAoY#3en85t$hd5Q7?>qyOJWz(J+0MVSXo1buudeQIctG5H|setCw?lt zfWe*q?s+@UO4YZR(*gRkemLa4ZSaG<(-FF>!ElVNmkqD+SIz+{zp8Bk_9lGcfQ?U? zsZK4UP+6tB{^JR&W!LxgHw2VKm@LhSq@uP8E>cfNZ&pnpUOidjEO7%Dt2 zQ9YV?KC*kA>iSAI{xVjF{>Nj?sUqZ1L1OAFTX*HHKz}(^#-QVySbP}ks~g=?eTtd% zgi6RXTuvE^wS`jCGVZVWXjTGtnAF;cd?wv7zMR zn(2TG0l7_@nlRu>(a+3dzg+R`(p3 z)?2o5yM+k9Tz@y0Lm0p{L#QaF^5W())nY~tY~5auI{=mS5dIq_60r};A4R(wckUPaPdQJXt*C2$9T@zJgxZ~<%Ka-0o&s^H=xKcg@x3lO-hr!C*uE4{3{udp95t!1b~!< z2P6i~I8viOZ2BH{aDMnz_8KH9o^v31)YxUJchfW_lDMaFJ^yTe&_*KyQ8;f}cAY20 z^9x@0vNwbz{Jn!i_*rnu^K(GCgr-hAt<{$KArsM?2E77}?EeTzKfsww>$m<7v46H% zDU6fGC#IFwY^(mCQ}UxODuwE0_qOC0TjCDNN!zb{(>wcPQ4$Gnf$?cOHcj_5_F&tpz8 z?bH#jyfP>Ob3w<=DIqWND~vHG+{&0e#pX%gMZ}ub8Fp&+b}YPTykN&Y-J-kCl6c~+ zmdfkosj$8cabs)62;;DdSH#aBnMUQ37L_0~smG=>aReZ7`=TEp+6qH0#Eo{=g%dpb zPd`X(a0X&I8fLIKN6u2FG00)KuTNEAJ|DQnDNaP~pIp6e;d)HR6C7wUBTqC zcCXuglldG$s|p|G;lyj#M+2g9Qo6KeP?UM&~XjFr#Z6$LG^HVvGL`r$ZM>A z_KdUIElZT6RG{B)O|9A}#G{5f^PY&)ok^x<{HKS3D^rJ0=bE0KHfQ+Xmwj@7qbghf z>70C@y?nxTow!z}n`X-Ym^%q4UNK~+@0pKC`_p}E z_cg73-iA(1uxwI*seQ1q^YCpi|KQ7g@;cHlndIs1_`Y{)w2p{WFL)6LXTQN|VYaJq zvMjMF43~XLA@Ex4!lyezw{f>vB(4*i29WOR+T^-ZOFNgOCTfcHF-uagqzK2JQA-MN zJXxN)t3B~{-|KWTq!FT9idqR&)p(#hIAdy8#IQ#g)rXsY9$CqIn(yKls}xg$ z?kO{lGEwt568XtYU`x&85J?igM%1XNsN_Ju8o5^zWLHYVIXJ{Huoi3NitDh+NmmSX zNuVMA`G7Zo&W%(Le(4RV=G!+KLcIeVCmc%>{NLt+H3WIJzJr9L6tm2e3}4qgzg<*v z7{xC+z|T`IeETIsZ9OvKW?z0YGf7-HGq^AlX&=fF-aswQMb$-@>SR(AQsIqTwF&0;pVOBev3)> zhK&xQ=hQHnCKdE`B+$R+u^;jnqz%#qX`g}0BTdiT=Ed|G)&Z`!q@dn-!(n%l6B+qf zBa#MK?UAa#@vRXsk$hd8(l-5b-EudqbUg={4%n$tw{@P%VzziWv)-XYnX9RYycUjh zk%f*WSH;BBvHGyeT=&-`J=997Jm~qgM%f6ewRRn32`QJqEc|@GxE;!jP zyQ&8lI_j3;I_ho#%N>ilu?>?tCuezZ)xJ{~nCc^>nw zo^zz>JraK=DEZbN5Va{B97y^DMI z=}iqWZiejZCmb=h+GGV8xgkPVnztbY=pClna;S2BH=Xh`3<_WB#tV_;tT#54k_y)P zOg}Frtz(sq?k=MkuDM^s6`GGC7#MI45VAWt(uKE|zU`~l+N&fO-766Z#(O;A>{BNc z8u+rs;?Q8b)-+XVG)yYr$zH>pPu?NHfk_~xkM{l87R}QBsltez{63JHXH#~S0V6dY z%E!rFVggIRh*r#R6N>OMO>t0mJ~L)F`r-;Y$>ZYNsQNyS9b2gEn_moxX?HS4W6BtN{`D1CcG=ryUt zrj+QzoDG3e%CE8vx_sArAEi2cu>M3COlVWTMwOOi6|!KCSOkez=b1;r~lL78_am0s2&R zC3%kK{CSQ66r4I!9<&y7J*{1-iz)BMNC(4n=r!ew;!OE_?bsqbXsd93sDo7&qY1m0KB43JCt+*dU;9H zB6!aY{7gmG@ooP}$>NskbQvstjJdE0f2?G$Roj#PxBni^neKJrnZllyda?UfC=9FcEWdmdem!T61keYNtKramP?OB5~K9Me(V z_n-5X0hXG9R5Z3&${QgloIMr28anL7NI`S@Sj9+u<|PN`0PZ6srx#nBN2~;QV}{NF z$lz(7#9rmw@G%2HSZ~qY2Ci~jnU|*8R@o-;dJw);^i~zftpLUH(p{Dj*>7X9MhfaK z_vTIKb>bhTT#Hb7N3Zv>?>^&moWA>WHGB7Idt0yGV3@p8Or_aZRL5kf69D1-woTzz zuPI8~3r#5?si(Wj;xG*%@dVu->!?=4K@Z8h1=f+;*-Rll!+uDO(YJH!uXZ^-&3h1# zlJ48Lag^|RF|O-0{PcM+GeS9&>t(lKs2MRb`+dpBUwAQQdFAS-J*dAu^tva?oyri6 zd6P-H$PhIQ)@^CACOfbIv=3g6D5* zc-O9q+at~AHfp&0tm^}AK=7GHk3!~6&HoePEu-2|5 zQ(EuKT$dt&is9 z%QB02TsJD7ZIKy<<7xaOD8I-YFo5J|Bpf% zoiDlZOy-Gx;{2MaJux4?{hEMn;AhjO(KUQ{UvmHNZ0fh}Xg?-K6H}v?nR?f=;*CHg z-se)(*rrJ3EbgSU*L`2Mp1X-O@#LL6&*Con zO7ASrJ!qf3@@TLy$5^v789V<3baONzk<9+@HV*~oK+rvN64l~Cb*A^N^EPFVbN@3y z#dcGsp9cIa+kb}s6HD`in2zMeC;gV-{}nOnx5`e?RQD(_5iFop>Cyg6*KdR~#}wYb zb36OX0O1zqA>QI3wMXNH#igLzT|P{IWk)vkqr~+ZJu@4C+JSCKN?N(EDBpnj`*kut zB+jc%G>IYDGG!Z;e+0e$;vJmJy0AllD5`8e$woJ7;fo07$>>R~p^s83isL;Fl=k)B(#p*#yL)(*JPO!0L| zj-Z+`F0eK|N_{zS6evng{JgkJIoEJzS4=0xj7&a_7fbzsypq4Fd3GH0 zry;XrSH+RYQ?P0nF4xOF)!Zg@JO@6z2}OR|Y2A{MOJz7RRlkvE0$a5wc}X@Xs_;>e z?d%gK=M&{{!h#N1s9ibNj76NSck|@ADx=9!-J_dGq)*nN z{LqwXUZ_;ilYzZ>(<8Fm)VBUQA7fd61VwA_z<3Ti9@-y0sFO;vqQ)}ZIN*G%fo|ol zrA_@+^9rhYp<8mY#5Y4mO$|?Uj@&?(95`UNQ)Ow6;>=z}zP=bwpfzhW&NcAdYIyaR zn6|_2u>re`b5AbxM@IhQla3utGUFHT%bOx*ImKD8j>BF$b#O(-Vf(d|%+_EBSZeS- zTGwi5rit zWY7@#xx_HpB1W)KdQLjB8RdFA%2?*3cd+%5E~gh(`M0-52<|X&3EZGvV8$ON;D`ma zxykEnAGXd$licCq9CvZ0$mXld%1+bK3==0-PkC=pBouz6W@)>N|5);u1A(CGE7>)- zdy!IFy@yxtvE{cSZ!mChZj~Og=~q(F$)%v!@@ot>S% zlRU}J$>3;o;$8*dh^{Js^tse28ks{Ax;Hhk5=oPqc;edqI$rFqmB^ zFFG^sKMy}wDb-pPtJr&L*qF*qg9DMuQ_Dlw4N}-sM>JYH%&`Jbj;_LFlX0d$XhigV zt5(YCLcoZ@`wNrJ__NUDNS87jTjx#GveYLBL-ZV`8H(w4GHA&kdIr-PQ6blK6OAaL zo7{207#UO=uXcQrDa!{+mfAiwIEoRF(5qJsX(NJJ5o2sa(@6A&&(H}Cfdl4a$53o_ zX{SiH$@eB2M}0fjxztmhZ3$=^NuOzI4eRvhLg$%k8)mLDs^oi&|9tkkCzW-zn{=dm zZ+XH>{Sa|OAC=3Xd|UIK3Q=_796_D1&0mc|q2*z~2w*;;PVp>ilC{lPW&bwv9bowf(i)U<93gJ% z@_w9=ly=9|P)KY8qF&VE^&w7{azi%^n61dgwAJP0O{x_7lmubZ&tyZ;cRC9Q0>k% zsnz2xYv|aLobEb60z}B)M%wvKrOxNW>LSnopu7)|0xu+L7bvwe)w8GQ+QbzLcq9DP z|MyJvL_ZT^T`VU2@^*UqWb|p+BiM|&#gYm#g><=`EO_Y!^C7ww5=dIPI8a=!-Ek?b zh{nS@Aye3-pol-%PVYNl5V^Q*iexw}7e1db@INV-2PzbKpocW{hD~x&85d9jv^Kr1K@-{T@iB1u330N31 zt0+xTlAn{m9N}I*4Bu}ef;pe?>WW=KOjx8``rahW*owzVqgqiGCVjxYbXaFm^oFSG zA2P#i9;oaFH^#iG&#{z*pEZkB+%U?itJO;!%TxTNcVa?jH;Kl@NZ)mcMsLZ0lWKH* z>;=>>lF2k`is$lcB<*p)!gKwjKPDnP3oDb{lil*Qyw#;?0BD9Y`fCxh>+$a%pPr6= zi3&=8&}ew+Wa}d`9YlQh!2rk5E)B;J^k$)KOtJUgI)_Utt>7n5^E^dZAxZ=rhWQR~ zMHe&An=I3qy2H&ldMkv5D^T679N6wH0KIEY*LHn7oiiC7g?p$0 zu*bclDmv|sXFcGiIDKw;*T79{2idmHP>d7Z^_Y~Y{f^)XG+GqixXxY*ss}ltGkjHyqMPx zP}A%1wu(`4z}@Z6FSjI-#r#%vKZqI}*!t zlHXY5WTwe&qqCdeL5v6(0>#DvIqdsC*zmga=})@gOXQmmjER{wuvTIY>e04I9tF0{ zj~IUJ3xI&V5Y{xr6WAISd}|_(4^?`YnXI*~^Je#_S#5B}Giul<*cFE|ww z_)JB;7P#z2reti(>4KQS=2kXLSRAyiBkvZo4A6vCV0OZc@kqw=s~RWgmLD#!&wgv; zI4_H&hJ!8SNv}phh{cvZPDjlng1p%zf}}3 zY{q^FL7*J1(Q-t4=48_4*?Pma2%lIdf62V^atLJQY(6D?*vC%@^(VZq!S-4iTlwvU z2u0?vC}YHDvvjN>*KATwfLDe%RNk+o_}g}JQ&fBBmd>Ba>^jKXW>uA z>gF13#;ZKI{92Gi#`rD5Y%W7%DEnGJ4jG-f8aI>Ypi9W+N_wVay-@nl%Sj3?)-erM z-fv7W^L?D7ACXr-TV3@i9?y9Sk8x#dGGGb2U=sG+i}t_>4c=0CZ-Pbr zRYOk8QqxP<%Ld#LZfSz$eyR_|}hJxR*~@g;(K z>sJ>YAri|cAdv6czYT+fVb`^geIboIVHTJVlQ~YgPI1`?(UjQ8()yI8;`sYhp^EAVvOV1H_Xrmj_M6;O6(9{O5Kdm zP?oyTZWErGwxSD?&uLj9K@q7Q89z8@4mSK5HkS<94~QnMF4+|ebuBbs;!~C43-fN- zo5;T|;hT}B2wIt#=V*))*BRv6*FV(mQz;SMSeaT{guMi}4bvN^_1Dk~d#$WgiC5b- zS}7B(3pLG3AUNKH4#yD5qZ?e(2tE zOX&UP#^F_%J?grCx?#4%WV-Dpnc9@eQN9XRrWP%Bet#sF^@<1EDQ}u}-;x{g;es%7 zpAY0tSmcL&J<_qb^M^|d2~`~apT1i5(>V`SEx2u_Q6ZxwafNizy10J99+6fMo8?I9 z2~jIF1wo1(l@tQbLfLi0^qWARVcRizDFb^sQbM7U?oW1(w7IO7CyOreR zq^jluFBrbqAQatn8@g0!$Cwjlhj$uyxVBxFdNVE*yFvDTipM!!%hoIg{q_EMRf@~a z!}m@~w%I6o^=xADR4J~o(%{x3xeo7`>kL7+#P4|MQq9|=Sn^(%Zprt>kCp}PxzJH^ zRrJ@J5(St?o9M^YI@}Fu=rxz}I`6?ko)N3huqB7M<-(W(wdSnNA7# z>wJ;rm-So_n~>yuijUUYr5n(MP8Gd=%NvZhAMnwilMt_~WtN#2qExW-gXX)wk?G(@ z6xgX84U&Aul*gJK5Yxwwp&lT1BXLDHurR_CqD6wn^Kuqz~y7Qcj<;hZO0!Z!xAASEAh)Aidez4XH%U zwzJI+sYCcF$UPd$$X>F7Z3>+hXn~f??#z@Vu1XRtRm3=Ph(jt%Zw*0u*{4smZ>6vPe4|Up#%?y|k?DAibtX(l;Y3Fz5EV=EF5h`lj5A5OYV>9U zorE0bkp3VW{)qi>)>P@(ose0yDhNR`LsrPbR5dF5KExJ7;Y(!kUia;jG5qG$U@zE9 z`3tYdul#gFTc#b**5sud;@y11b_4a1ugD`XaN zx1G>&*BC3qmlKC##cBS3X|4iK2`cVB4P-b(wA=0wh5a$RB?dRcXGds~g2<`K`?upL zz9h+RXL`65Bol}^mNWD2wHN^P^4@36R?)!Wg5zG?nd42LiHGAXcQzhMinVK!1=0X zDvpz2IkqmR2hnBrOi4NNIvI0l&e{`5O-hpjcUG(L2XOLfNMmwk>GfGc6%S88E5!#6 zK;fdcxy2ZHd=$21GtWs!hh_~*Hl$9CrgZX_PyB~>>?d1vIqG>pwtbb5_DL`43`S5}C~y{4M?~oQ_A+#!hs!&8uaO zdMoq!smgq9u>gAMJ)G{JcrrlUKf%mS-_rw0+C|DmXWKOeg+2hA29qTq2nSadm*g8k zB;RF7hpkcDpF&?_5=pOVIQswS%{pQv_rIy?AAp*ger5cDL0iMM5A=g#E-v59=pBl3 zsBG6ntp15|dIC(uXlfvEf!uTC4M`mLC$1x@9bqep{vSUQXj0seeJ%|xa)2Q7X zk{ltpumNwA48iJ4L4}pSSVs3gn`GFj&XMC*iINSdR5F*#7a9=KhUZ&M%UUV~i~xegLIoV_10o32XA8@qe3dc>+jKVA}X-hyHJyL!;P_NSEv^ zij8Wif6I4LbtHRE_{4DeFZ*788P(RIiyP50hj{;%2j){L7sF4}DN~c{RDN8{{#bT_ zYlX;s=kO0Dkm_5&FGlw^?GNpvGO+0ywPzzWFo=WGZ^n?;(q({WiRK(YPhoRmaT;^V z5R2eWfpyE#=*wQzFp0`&s7`v2eNs0Ew&b~Bug2nd<3+WH>~FeGrF|Z%p$mFPlruNJ z6WMrdOMiS!!4~c68oJX|<-7B+oFm~8hzaa9lx$6!HwfNJqQqr z+)y4jq*ieZ`oKjO|Jhk+0~6N=>knObYH)*W2p0oUR2fr1aVEXifpr;B|8nz7ieMOmTUTxxC0>OnLWKD)TmhbtwnKxZnwa@m8Z4c? zl$jwh6D46>4c7L|aW68Dw$eRfN+NSra=<~41OS;v@Ki&8y@WS1Da9> zOQgL^j@vTRES(icnt|I6p772e*V7HE2|G)yR14e-+1hiSxxt&)?{RtO^5B`2O=F%I zs%EU)4WGmxL}xUk7}@x=j;F3ira)@kGacN8@X|9zNb%VrtUM@b$F)(%pd@QYH9u>V zQD8r&yluM;7Tb2{*S{W}-z11PUx>`CRN;%FS|8H}bN1QFO%FDYn}iW(U5r1}E5(^0)#KQ&L7GwzrAJbM^o(XR ztU>;9PT1r?OhC1-P)Q9V2ybd62?F88h#B)W&sJq5y+wzkPOI1xtsU7+gk{ zjh5CXJ(R{P%KTR~8dM7ExH+^2SfMfm8$rbI`4)NRgC-^7(anVU=C}p4`K=se=pmdT zOmV-hd=FMN?eT|XE6;~gueR?_z#0z!$nqzG7iy1A8NZ?bCXE?{9;=Ehk`@d$`2TRK zc5+b?C7g~e#k>#vWHu1$veu9IMuz4mDOqu%r0-8|W59G?+RfnmdbL6bD?qx6ETsTF zz-Y&Ajh;3%zwbtNd1|eay&pS*EH@NR=#O(L3}<4YQ3+_jLSorjgo!6jm`AEyOtKc7 zHKEWmO)jRwZG>^#$e~_BQcRS>XBjP(+zzqdB?yp}?-6(C^`|{;V z@%QZQJNpp)%|i2_+E0ec zZgi)aG-hsN1u4XiS!DPywaRF{n2DiEW?YLnDmpnu%HovA{m`Eo8OZAhEeHZ#>|XEe zjcFaK?2tvwNb;||(~y$zRZ1Kx+voICHIz@q4d^`}zkC6&42IzuwBo2weL!E$}FXF6~RPprKLyWi5Z7hW^Oo!-|) zb+#_S+yG?U_I9|67|Tqnv>D3q<#XK7iAsSXh@1m|#A%X^=EZ6`8uUf16takh=8l+J;T{BaKrvzYW-HtB|eaBq>L7ft7!) z+hUkjNWHrfK^EO^!C6#9fm;*VOHfIto{HMi#d^F34z`$h77~f95*HLh+QUz&5ukX! zsVIVuI%Zj2M-vFVGuHm;P)h`bDAM2k@T_rAIw9q0o`Mst7Ig{oQNQ__A)y*$kh7wC z1XEoctibuELJ!*GaBhr21aXjJFWxYL5kBPv6}XI*^Za4uj3T_*PbCrEsc`ZWEB}j2 z-?TsY>VN$ROZx8+uYU>a4Ci2xVU2G%@V5fc7>(2_GBt8iZ)GV8zfZLF=kq5;@`2TZ zpVAxq(jeJBdFHR1U#defJWPbT+b`J;9oykl2LI>NpsdWZ7c=0HwBY$X+*@onH0tv1 z6HDccV=-Aq>cJN>+$Np%VxD%6&iDUlhso7aQ%o9TxPf;DanyK#Ekm$|Yc})|N(?BQ631()lN@s&)sO4vr^!D7<#7`E(MMKF2q>9;5PV&(uP`;dwtW#OAQ=idBR zpN8+kZjFrmQ|v1?HG2Xi{4=Jq##lblu4m!AzB7KiBU@ieI+at zWG@m0wx@%8-+j5bmob0OgIf6p9wN#x*4q8=xll8~>-{KYpo~iK_!C(#DfL7~htl0K znMh4`WZJ`1<5@3FRqx{?{aIq4h$>{CBwM@*d6n4owX&3;kW7X1+u-m%L1 z?kw{>7qXWn*pkl!iJ-EG+`GhFv&uC*SEX0ocoloUQRw{iuo5bF-?Zt`JkH?Fd zd9!pF4L|=;Kv&_339&Uur;uN+v?|6)wnnl3X+-z$U*9$Td zPEB70n=_R-OmFG;v$c?X@U!2zQxy?q6LBSi8sa#w%88Bj8VLiG`WIc+W|0dnMJ_d? z)_wTIaBm+q3gDsn_;1hsp;1{P?WBu#N((8z1I}FwO>0e2vAPgl$)aAnKf2}2;DvSJ z+do6P2^j>`E4W}!L6hMvR1vyR&PjlR&`v;{WqsORPj6n}_II&^yH^bEo{f(}B2?svH@(0(fhg3-A`9vviWAm8$LS5nJJy zhU36CDep^R)XVJ`WYDpB0|& zG|F>wA5Lr3`GoIQk)a;09~N<~=<~l;{BQqde00b!H656aUe%1_O1x}EG&DwzgjA7L z%}KuZslMFOvPKtMKheP9E!5Y!Owx9{2`J;+P(wb0EMXW#GVbGFxeyVNMt&qcJXZvo z5oeJjBO-XA*(U^sP&dc5LK}1xeFq?^R`m_ZLb32I?^}kZjz48L?b9c%#<%I5C|rK~ zRM+^pn~+({WtCm_`YqS3%icUfwQ^gFanW(~pZ8mWWK~sFwcAppY=>4qx|Fzk?O~Fz zR>xJ4zoCOiK!D*y3lETiJ3esN3Ik7~!l)G#!NtC=g1XmM%J)PJ;>4z5EXL_2+A z4wWf~&Z$9obU$LO*f#@azAAwVv%sYgc+` z@xz=g%N+gHQkpV?XWCz|2C6E_DvZ~ir^YOj2ELKM9+Idk2}nCh$UPgeyjzbT8aUzZ z_BFE;Q3*3(?F9Yo*Smn{iM4=7QxA{1*JPObnO}bPtXPBT_~an&&pUz4r7tPS8IMm6 ziN_^MiIF!)DY%SH(M$_e;$AqZ&VU12B5~OD$w)$wFf7Y|0~|yE^)bUCNilH-qV~H( zHMnW)W}VHCRB)_h-r{}vkwIqAJhp`Z`@wdoldUNbrP{f#zLHLMH@hX+LQ5?NhS}$6 z;VW_Z6DiB9jkgCABD|yzdJ+KInKY|7P{QGfgJq8psCYyi*F$oL1ppb&1{uG)LsR64W)^D_d{DC%?!%-xA zF46bpVo$31K4nv%RL$4R>g^UDZU@HnEBGyYZ-4(-Tsww+V?e!B+`M?niV{)u{6<x2&ypjFA}87fcM;rlDPJReBIG$MQ>cjxXs&u z_oZeT8AC%x>?@RnY`~z4@WAU*D@F<-V~1K_%o|TtNF_@-((ikHq3bZD&c`* zJu(DiToJOu_m7vO5Ryuzf|$>t2sK+B%XPVg3~IDEw4e!4#c<37ER|^@((;VvthnS< zt%?p_G0UjNsd;Q;Ei=!&j$-_*7X$|7jXDrkW4rqWfdnK4M|Tfd(I*dEy^Cudhq+%( zTiq4yo)L)-{;vP$<7-m{mpkRA)-R!X+xY~tKY>|=59wz7!11$EXGBuNie}MQtTIwoa4fN64Ax!Q%@-)RTM%e8A0S|_ z7tUly*TBQ@zRLhO@@teh9%dZxVoROOE{NsPTo~(|chy?$WPPqzI<}8=mLA3Nes%vB zcm$+au|Zg&wQ)tq3!&gLmwV}XSTRbt$1)Z#^hke}wGGTT{72qfF?NA=B?sJlZW3`^ zhe5vFlcXY6u@P>o72jbiH!px(e;uBRgY(qcX6#yK>Zb@!(X#aF0hN}z^Fc7A>s{{n z=ngI`CeoSwNIxKY?BvDS@5f8sC6JZQZ&E`;_dtQZ9qapfzL{N0X{Sh8jL+)#DPM`U?CBV$0TJ{ zghpdCaPTK46LRdHVpdQ}NX)Il63{oa4|M9;JckhusJ$R(SI#r?`)2?SSbj()2uxlf ztn_s4d*O(2(>l$Hc`J^L|1@#!_D;JObw!h&>YaT3v8pgVLVEiy2QxebTm#~W^t*zu zWaveXtcAQdiW1<>D5rSzXr@cas!|c(0ncotxnoyoioCU|ylT6Uk$IgX?1nO`ZM1a6uH(b20p`Xw)~K7uYmJfMp(Y5XBgTf6_)Y zZj(OcGDBIt@Lv63(qJ=$O_6i4CXEb%oLLSyj?hYojBm42Dpm@{XSS`H{c>stfg&2nak`uBie_@5cGs{zED~7{>ykC z*3W@$_yw$N3??9xAua^)o;72?vGy5HUYnk~F>T z-&GPXtwSmrpz#ffb}#o0rkMRedx-^11xdSgQAjT%0Hk@Aw4FZG%iHMu;nraXQV$BxV-9H=K>PlO1u?m!rcX z$)1HiXm8qgGpr0>*e)mIz^jmBA|9`47IE}%G`b+*8t+ZZ%)nv9^^19mG1kv9 z;&*KlH#ScPlFqdm&MrX-3qH;)Zt^mpK4TDdu-wH9ghgRsq_eV~Az(>pPl7Fq((xJ- zM$9Fl-*Q*bAn}FkSnoY_DCdBtzGYd$u@p2Cj?b|}&tJdVxNO&Il-|hDgkrlgjNe@; zb3F~Bt^oNty1#uy9k=(f3cS)G%Gh{Zc(K>~k4%dV4WffL|NR0fFgriW{_-Y5myDhu z@agF&JX&f*io2`}zLaYb?%hk49+u_X9t*2flHsro4utOtgH9OD?S zc<`%41w*Zyz3jKwu5k8C!6I_z*FN#2hq52>O3uN4%N6k@#5|7AYfc4^jJd+WWC}F` zq70F5k%DSu!tsv1Sd9g+WkR8$uqlcfYhEu_+y)i2at@+Bwp7-w4RUe%1ulOFsF}2p zAH*AiV+AuW8waWNhsM^BQ~4etd1S%fnn+ezyrDBeQ3_&l_4p9}=Jg>0owOf^tU4-o zuXVU$u5kvv9le_6yG)9?$nkjW^j+ns!YdaE5N3# z_fnDflPYR=IZl0qLqF~lHptBRoF>KvI{f_+(yi}PL>WH$8Ac&;EnGkHIu|YRAzDW} zRX`EGu+U8fj7Je{aZ7;c*B0h>nd&jhJ~Hn{n!+uUA_HYC8Co3(JJK?1681q}nL4yc zQuzAHbo_**_&nT!Z)HIw{9x+YO=@Bv+=BzBL-OBW^n<=JqBRR`A_n~zmm=t-p^X3V zn1mjUT;}6{TM%3+TpYRh`ISEq(VLugo9zbCi@Vgz+{Tr3moJ}!wknmw|GN7A?Y+28 zZl6)C!+Qnj@JtkMV@OIykT*`6o>_^_>v{PTymzD1b`f@=YFBtI` z?t%O(gqx3in4{O%mPihEAP;-6cJ{VJdvk93);=9GFnoI0xo9~5J3yAlt;k~#qS_*b z;5fG**}*D?%q5Or<*qNh_4QuJXotrjD2}-xB!G88);&hR;?^$}Aso?q9}2D=Sewr1 z2Q4Hb2?>W?=v>q@5X#vl18+pZy|RTAEhOR%%SZA+=t4N^AYi zy1292Lx;${Ax3+osN8%}MJ}JPvW#Kh@Y$5j^aEwb<5!^)f;q=8sKPn>Mf6FFmak~Z z8db2Rm(#CQQv9H(-jgFDT8?r0zAo|ct(s*xKl1Ea^F^0uv>yE;I7mJ?(>?}~QNe~c z@m0PXt(#b8&enST)FjU{YfO*)*tQHXM{BAhhiHn|2D%`?^s{(r=o(QNAbjv0a7ZXx zW$q*=`l2SYr!Re&7k1-{%eAPbqQ4!O^-|V2Hs%%akfAL6geS|p3t$N@ml^V$S7+!L z6Wg5fQb!JJhK=lIm&Aw^A$`i{&=$DDwr$Y8?1k+45x&AU(;f*s5K|5?YgUG&k8D1A z_u^N-(HL0CCL!C12~1&34rmJy_o)A0Tnu6` z{`>c|q-OrZ3rWmLNd?VPn{+`RG5+gIsq|O3PTUfZi*K6l`#l`9Z^28?2LJg@&;Wky zUkw4(Y6#sLbTIlAFaLj(?EMZ{Y2sak|2RH=k@{h2&ty)Htt_X^!YO)ZEuTKBHLA87 zG|(lBMium_WJ;iKS~+8Wfa+VZF9(vS1!bKYfd;LM=>$WMR#MQ15x6*01W#9V`mc))4oD`1TW7>}z5+M`P?rq6D2xi|%8m!*8(y)S0-Oi|@ zPYeqY>GfZwxq=;kEE1uggpH{HmaOyzYVk*sM4!s=-TRWYx38Ns-+=TpdhqKf zTr+H;9~jKX*`32E(Oe*AGSEa=FSS`nqu3z6_}1}9cyU$NlG&m^@DWnhZw33&&7S+R4UXL*lk$Cw!p0H3MzuEeVAfinL%R#RsE@5GY1Pge}?= z?AJ`UMr=Z3A?DF$hpee!SiA@@aOAhvqefhd6k<2Zu#^|&!Ok@(=wVyn z?Qr**!s&e|Qq8)A6T!E|=Q2@K$~wleWlngBG3GKD+kWQb95owh@AQ%O-XoBiJ2~L4 zP}hj?4V-WH1&KMk;yR|Y330M#Ql4z!S_4%h#oflFcMv>z z16?kQx^+z%-a?^lVFbzctvuO?C-NJ)1Lmbw&WSP_D8^iPsvJ{Yp&(3#Q*y*F(k*hn zoquLkbLZPKzE_mmV`uP_nx>phCFCrhSs`VGu*}6UvwNfVS`B~@6fYl`R3MU`3So(Z zDVs;)6D%Sj#zMAfi!za;SV(#BG_7@~4!L-~k!mbwk2tEP0mcU$B>QntqMp)PDBmU= zoY_PPWWwTGxp(rCa1+3Z(Pj2W`N?6WbhOJ-ciajL_#N1PZU7C#F$AQ0 z$j8iETr}f6w{DbV+WyWv*@TspS%`9o77sj){Fc5jup#5YU4cAhc|D1vrB;Gjvw2<2 z5Bu!W_=>wA%IKV(iKn;F^5T96QLkrr%Iy4Kkn3HGNT7ruNA0CePJfN56S4-LM^W*F z;swrbtwmiSH<1r>oYcsM4B*BSMirCqi-i~{yQi0JUYoVzfVPWgYrxVp{^<6+-r{- z%@gREdb<$IH;dDx67@-gLL8j<4kXUicMZknwyiR1w`Q*WKE224D&GOAWx#0k^P~O( zZe_*SLxrbMZmIIn9`R{!sV8*K_*-*y|06 z0vK^Cat;++#x*-0b{0p(PW;9gx}`2@ZHTW~f|=ng;Z{>okUWih2iV3MdO5=fj#z+Z zWh?TDobC{vq@@}Aggp1yAyg0Z=-`4-A!LRMdnY$=`t=nrj8nh$#&^IdZres4ywV1mW_aYLuwlHmy zjIlKv%i%s&&mUUJvW!<8RG9-n&-d%Td)a4?ty|xG%CI!}DtN^`V!(^uEu2zCt;iA2 zOXm^u<$w{U*7U9VR$)Mcct!idaSIeXiYdN}i?=s05HrkYoh%|@1LS6=_D2rw;c{W8 zaRZPj8;E%i+gsTvlnfE3i=o%FJY@Y|q`C_01!#HPh@-0~7^WGUAeI?c?Ny3Xi%|>y zVc~!(cUcu$Sh`Pbbg=-Lw*dDUbycrHZ*M&m_sPJDv`k!L0 zpC^6?^vH$2V%rq4=u?-9(FZo;7|Mf+JtK30i`btcmOC|zp#f5D`lT*joDP9-8M(>qK}^h${%3n6 z6(;^U&gM4i5Bh=$hYDrOGd&j>CW^0?wMp5OiIl*ix{4iBY_38`*QujM ziiC7h#g{@Fs#jUDw_mLT3O3-*l#GPEAQNA`;)!Pu&rH`fC0Ey_aIvPdXFECd=9qdvxjiGENVh(!DI8LJZPPv6-)w7RVSBQ zhB4;-WOp+dkpY>>T*3ytLrPA9gxlpWe**qW3;G*%u7BSx>eu?T zr7xWXT0X?v?y8dJgUi0ePm(Z)Ub#|s=ENKeg33T@38tzCx|Z_g_I60XqpoY8JXxEW1m>vovcXl5R}Gw}?zGwSLuwom>_TO3InsTx*=vSuT{xNyjO` zmQ6uA`qAZN!RQxRaW=>W8j_MHD1@7K4d5Y_1)!XkWg`1sC6Kd2+A6*yZIN=6H8!o8 zAe=cWHyvpiet{hz8nJHf8c`OnF#hN3bq=)k(Mk*2(a=i3v?sGixYL^3@D?I$S27&vonh+i`4A&tSd?KXm_>8CZ)On=9UYv0_R4G&xpA(bbK#)127l*PE7OK>Rpv6n@uGU`(eT8X`NRG$r3CD6XFR6 zxrv@+GPCnI28_G4EL{7tQN<&^iae9gcY~8C6f>l*qFt@}a!)Gkr&)->kMZb)oDXmz zb@s2!I2wybEXIRTT5Zk9wNVIFE@XzWS<$*6O%F-uYYm!#<9KY2#&X`m1wK`q^ZtT zR(y$Z91z}^D8oi2DYDF&p-V%R0t?HoyHo@YXyagFS`l9&InJJ>vrUYK`r_8X!HzW_ z6C^n+w?XYm*$hNJ+*3#eOSitR5vV5d<*&3T_W2W%ZL$kFWNqHl6oWpZAh$=DGXgT< z%PehliekpQhKBWrg6oP(^&`Wa18*&=9ZGx5doa^JQ^54>Ogq0x4@Hko_L74W4jCBf zq>Pp9{0*I$=S?W~MTbpXlNI2EB{|Su zI;(eFq_T~xcMA^Gfj59YQQ<5@QaEU)->7JSYnKFGpyLcgi&9#nH->bxW@|86lyWW0 zlpba*Tkrm16Z^r%_o`(!@5?@{PM0_-dTZx#?74}gloiz@$6>|RHzwJ(_~{K7Ryf$# zWgJQhy1&ezaZW}F*^emZE5g}nRpDfP#~V>>B58X7DVMz<6)@0dx;H||KD3#2p$nR@ zMJK7|!XJ7$b`NC#~2y%-&_pi+PLyhLu0>;5-mf?8%dLdc(5k ztE6x5YVGnHs4bP{&;}0l;EySj*#5EqLS%@Xv6)MA+ zga8yK*iE0$V#nYx%(GGk^9!%4j4w&%i8}miM9&Ux#^AM~;ew@$_>3 zh%!EMTia>X!(iH^r59%wvK9PX5~bc++}a9sg}e zSSS}1LF@Ba5_PQg3Kg$s0Ty*KCK`9%3R|oH*>^zFy-$t*=v+0|wB4sGxw~gwvp%X2 zlc=QCX+w!9EkiFHQLhzZe_4Sg;hWR2Z{vBbsj?S{Me4m0Ibl4x*Af1FNqf290YR-? zt?Ck?c-=7{E1VSb>gtNpujE4Z0Z+NTUumgQkMiBUe4>URc)f`iZII1}P|FApjKDYm zRvE3FH8@(qR$XO6>Em$JASz$==kof{uV#A%`+{VhME4)3i8kM7oRB=@ef#f{Wn^Wf z(-=fDzeS!MFc*C;YqT!UN{S(|WvM)ei<^Z1{Kj2~k7O_3dY6xBEc%@}5$ zRaXl#SwaLw`|##Cru<{;X)gBGYm<#KW170G`$%nUe0=1SqN)aR5AhQ;y^XQXvB@QN z9LyXkYELb_X+Y6{IV-b8iEMp|5S=DL6d;)05{|D1Ojt~K(MTz+ zDSNT78Uq~lm+l8mlrS-P(GDl~7L}&7ClxiMalyXzew95%$~fpV4*0QWt-$~XTXb3n!c7AH zUD$6$pe*R|-cD)5SN5B3&aHVTq#T(i;3HVi<&a~MPxI0_{N!IA;VH-NM2fHuLcT@} zovJ98m>@=7_g|#e5-3%!#op6 z9N0Hp)QqHcpE11XC>M=hZ#xY=E7rS}Py{`$H%#z`Ha?t-cPbLv_Ca#^(Wqa{vn+h>U1 z#N6hbPwpJfdIiq+J3yh-EPb!Ab{R!k;XUoBAWYq`4LN6~)ZzQ2I38|kIQ#TgPZ!ok zOx&$VanVGxNc(=J1CB-~_m&KcIp%%dM>(2n+wkT&{FW z^a_{So?w`xHgn$|YZYPu-%V6l6@4sJBRu+8{dh-T%k=pMKGuXJ2;*=~3ODrS&Wq0s z$|d?~K$!~|d?&*Nt`PStg~q54%(D(HM=bi$>lW>aI(xJG_H0|8@#Clc6MMN2F;7}$ z=8P65KL~A9Ct=+>y7sveu7@Y0M$G7JNIBB3P}J*-&VaqtKjF zGA$po!RG?&%NsE&k299EG=WXcgra$>K^3{|y~srrCNnZTpp*f|q)SCaafmW(zAG_6 zXf#gtNO&Cp3JDcdoFOYZ&Pr~anexDYN(k1XR2F65&pP~)sum(PY$Kf^9=;M!ZyJ_; ze5rHmd(YB_BFZ%{9uE->ay@7+trUWKgWNPY5nfyJu78mBT8p! zX_$PYYD5DH6ukac^1iOulTW4wV_f6|cY32Waxv0QezUM!fQhulS4#GVafUteSg=U` z5IcAJ9Nm}t(Emf(3daK#>3^KSS?8x%>U|Wx)Xn1W`#&VR;aq3syJ4U7eDgy>X5L8u zPq-R>@cU0wJ$K+uNz*iY6&z}>%8^w=%6e4|%BtryEdNI`tPa8e7>6U4|D%omqif|v z0v)%iHMN*2wEwRF@QMGAC*-eG52E$&0Ir3~yJw3vumNwfS)EWW1o-8h!yJ{UK5t~w zZT0RMJsDUr>Hcj?U3fX(Y(XOIIkuv*B0zX#ZEt@{=RIy0u51DAO4HGoo+YVQRRCw` zB~T_EEbVaO>aTqU7D^IHSq7VLZ23N((^Qw4u&$9W$>0TZHFNcq)(7w;lbkT_a!h3q zSP+jfrXYp`!cn9$zNphY34t}D?|{AQ*N>MMiX_)DbMK3l(@_hAgONMuVGBENoBE2C zF|vT)sImGPIik;Pi?#q~Km0e2iEHyYm#wOD94f6T5I#P#0Ia%KUPREURb(4g}e- zYzzwF;N9LIsYt{S3I#WvIs`9Nr}`!WFU(+p-rLa013g6I*`lO&@r2&popj#;|AKTa zvhVCA!3>7TCbcTH4Re~_*C6C_6>Mw)H>a@w#ok*+#kH;5qJ_I#A;I0Q?_*L#iPQkYS?1Z388hLf ztLTA+-i41p0oQM^3ukYe$iIil%rmYrR@tq4I%Vi7BE%=AD?XJC#^#3awK=$AIB6k4 zk=KI?FLO!@YZ8@E9C-R(%i^tPp18c$QJs@hbhFuONRY;^wPFqI2UbC6LYIJ4#?!MF zyYGrur8)|^@>?O%-8(j((5!)K0Oc(+>5N$zD}@P5VLelSm`*BxpA(HOKK2!tY@!u) z=xF(VsP&1J z6#7H(d)-@VGnuB?Iif$e6u}(S`Xz=QeMs6Vk&4%Yzf2CpEqDBqHgDq*on$KPqZ!@{ z>bRA-Q9jSAgn=eExUN%xSxy>KTCG!U;YpQ&7MI=s7JECo@%~(@6fkJ<_vZ~nm|`3r2_sulVHG7L;U0q>7guumdKFA0|~(2=luMP`h7eJ;*5SgHl=V--n7w9I0- zOYuHtTTK8zK$rq_a=hs?JIM<~lZX&dCXX7@^Qf?c{(93Ei(7^fm=od>*?5r3|F}%w z8oTR|;%v(Q6)Y{%xwYin>b&D%FZ|BW_L`9BCqRY*&y!#7 zKpK8q#DMz3JGqGbmSP56Ib3?`dP9s+nl5$ItwX zfBP|Wft;Jyy1LJ&{U8yqdPhJ%C4@y*$-ONXy_xc&9KB z(*KOE5wAy~2W4m5E1>3TGc413HVYkh+FFs~qSJ(7=lMZ2mT%glLzn%PIL;?NpZw^H zY=_K4r2=I3cRvB{9PzlCEZb?*{=gK_EA;B)zh2l{66iJ8#7t&)O+4$Vw&elc8HRVUc{uD`Xa^D z(=Z>VY|<+;Aa&d#!Z#?{Z>rsFVlYR&#fjX&cR_=vP+#?IMa>SJ(eOMxDMZEWo%&vd zXG#U8nQa#4UYMPq{dU=_+e}u!@~8>PZ?mv&o+65kmX>0Fjq+Lo#W5jw6rshOr)N7a zHlg`Wy3b?=4E@|1J0kOgGP|%ldYYfGe3M`2zGXTKwf88c1S1MthegpE9DR$C**`sc z*AUyXglZm=O*iN>{5(5C7O>XvZFHfdDTtFu_NDicgZ+`{h2xcs#)^ zj}}QwrA5cB*F1hsPi!B)mk&`TWg(JtBBm;Nk$2t1KQ#Jq%bcWq@ArTzp-RXZNdf9v z8q3h~<{-8v8D2j*vRm#8U5$&M!Q8;5D)qvLr|s`~i*QE)i;K@c2RzdM)qQ`0yFBp@ zzAIR)9lrFw1s`S&c+R1L9ft*lB;!e882AHi2a`B&7JQYCA;i^HF772GVo{S?LlYLW z%qgY%=_oZI!YCvXYNg|vAlzuGg%`svZ7Bm2f=RepAD^soGw4vJdceR(9KNRdS>U7+ zKH^P#LG$Sd5SkfBcg+hJ<)0oFQ?ok^T{d9J+#zXuPIVOpE5DL#<_9!63Z8ubRjsvn zWR}pF#?tG94N;E-c3sH=`NgK47rZ{Cp7!;NHAO^D#iA3&yjKw+T!W+Qz39?_ z?K?(;1`%1xK296+%W?h9DDG&rpvpjpe=h6_YU>Kd$Dh9b2~eI(8W(+}b5p|S|0JtD z$lpEU(teQ&sC`0W^^Ebvd}p*U7_%$u3T~M(vaR9OBVmar_*?!VibIC`Olaiqt@IzK zW^qI)HX14HGez+CpE>j(pxMcJdF!oXx0gpBW^BMyvU#zhgl|~C{_DPel_t9+`x~oM zbWKEc^ptM>TTbrf(Z{(HVEs>k50u44QKOzvm;fCu4SmiRm+)?dX1{{a|BT#Ux>pf6 z9o3E*7@KuT3^b<}CA6`UeE|>W@8gq+_x52=?IxO7adkag4t~ zq~lYj#S-7j{G$o@?9US+2}1((r{C7r!9kgi?wYT{7mc%>k>qwaK|RL4dG7!qywrU2 z94vGODNyaTWaN5~j5~i_tMd8`A^tVq2Qk|ooTlk98*XS$Q$V1zOs0lz@=TvSO-Fv~ z);fo*iz-DC;=}e~x8Ke)3=_s9a$q;oj?P1YGoC#f@s^gliB}$U!FLd({YU=PQezT5 z(FuR|c@434=r7U-74q9C%xA}~j1unSaw4iFODI?9wsDqw(|vS^%?pfSKIL@-wLmxS zvTt(b{i9TEKLOFN+dbO!SCC7KWoxoP1SsdNZm;Ddzx1f8QJ)~MiqQ&2zWZSbu9fi+ z)VSPeW#;4}d(vfep%hMU1UDzlD4$sW+0rj*qad1()DaV(yYeP}W@N_!iL{WU{9&31;+WmP@4?px1fM)AJMq#{=Ps z)D&9xr$WD5m{-Q_nEbF3felKwiMmwzGr#=~1aq$nl*1!^fv~_xiuajv)wfWGu+Q1D z&0a)GfDAqcgwOA^GHj9U_i3gw`t&m@x-@E2NSx3zWPo#ZP@4&}Iw_LheYafRp}*2K zd08$JUI<55&yc>?QSL2~E*(LxCfHn0-kp|4Djk8JOu-yqXku+He}3{ec@gYW6L$b= z44)9@MU0BN;&(Ij+2T&3Z*o_6WHe``wiYO%Lv?a8ryV9sUn>GdxqjGPz~=@=549E8 zr)H>N!Iq_@evl%KeB@4!K+V^G#!a6yO9?P$BFvo^7&MI>_KBQyXSy=wlyOvUa?><8 z;1#@VAV6g$-w1{kn}y>0U64N^TaP|Gk2!cQZgSKxiFX|Er81o1)=BL=y+xg84$>ve zFNXU_g|6no$f4T4ETu#sBqHoKI=1TSf$>~Ofrz9df9*2z!EKl5o%#(cmP(cc7g?i*$P0F7Gsf7$+EYpzVdXeul*>tp4MiIpr;T+!N;B&Cupb zWBq+u*0d2)a>TRFnq&6w+S;qUd@H|iC#|X%g()!6xPv5%1Ox0+xw^c#^BWz z;o_#cHE9N&e>^mce};wN#daL`u}59koRdR-$egC*ZJA)1PU}E}@Dr72NWU&&)|Vc@ zaKa}S$C2EWu~&E;4xP_3a%?{MCJV8!|Ahgl2#gDqNJtYPQX$GqK?} z9jWx=pgv#%{Go>#eI2CcOQHO0hc@M|`5B1wG1l`^Xs{1XXxxOTK3k@~pXezinAzcp zZb71G8iq-u_TZXcW;2pR`QFm_Fi$$A0>@{MG2=Mxw>r8^MTn61GEDE_tG9l`)3U zRVQ;KLlo0&2Ol5YGGk8O7A+gUyUH%mBxozvINR&{8W$@@B7{|H<}^!D1eCnXt*(9J z$32u?d}UrcFnE6WeeM_WC;+gElFU{Bs$qb3KPYXcljXa-2U%@ZiUKmC7e0co@ekT) zTHN$HI5gXDXZO!tZc=MW_aZJ(Z=!W$v@p{0f_NoU~wZ znR%H?sH7qBYk-~{5}E7N2tR?0V#7q467BEnAV8GfFwUC`>)vl$(B7j%ev?dVCm?|` zOR6eFpPje0iLD01?@L_T&>s!gO0X*9l3HvTdsBxZkX!fg?Uaa_eIepQ^4}2P{SF;V z!Q`a;dOANA|E00yzl%~uiFu-l!OQWK3w;0b5cbb%)jxmOWXCtIj4fee{a5QP{vtg* zP=(A|d5lf`3#A=@RrOm#vNV&~M%Tabw^ern{BwNDcg$mg-Fpe$!N6()k%m>_}6gd}}65*MM5D%zlFN5;ai6eteIyy73oNG;3jB5p>sy8$MoQc#m&J@ z9@ZRrc2%EQUs4A&9<{d~`<2UpNw5ZH%5#{YtIWq?pQ7Eb1Tx%&Ur8}0Q#Q59qeIeCvzlw>rfnD_38y8pLqqn zbrhp2KbvuiE(Y#vI!tu>p8%e#5pF!w81ok1QY9+Rdb<&=`-Ncy!2q1uCkxtbMT<4B zR3kIqmTOHE+vQ%~$Pl+$Tw|}DARges*48CkB{p340_ zBV5%-+gB9UWoPjS)q>cQ3a87YVy{};e}_?2XPBfSOY)C-l6x13Uo?Tk?0&0Ol;MId zu{)zyAL=>5oP9A|Noud{9V7#shCqJB%tRWcXi>dH6IM#XDffmXc%#+SUEI3*N=P@T2f$cr%$uvwm2&+_@VKwAg1f9Tg!kQ*g1w zihC5_8RDO{n{w8GN z!`*H|>MD}QN4S*IAv56j}}wsBx|>3ZXj7 zi-8p07_F%F@@f7F6;6fH=y+s3Wd#-mB#%>}fIGXnll{*!iqLosxMODw_8-%|#>1JM zWOt^c6)Co%x2-E~YLPd;>Z-{#^Kd&+dHbaXo=6mYH}ZeG1`2fyTTL2;nMv%fsVSK^ zgfdR6nygOF`_MTC&eCySF<1OZF>9Z{#>+#2;7Oa$Go{UQ9x8?rVcG+Zf}P-+%Z9xR zhJ6NuknhSSawn*5vi+Tt4_aGwt;+_np4Qh==i>P1FNo>eO}X-`^O)KNF~uFo@ejWG z(6b5R2{FDcj*{N7lVUtNUpcUDst(u>V zw9B2b9@mrkEYlNw*oUaA(;A?RH}*}lqf6B3_F-kKuwxhjSt~Z7CxrZ_Ag0uAb_(K-@2HpUTo6AR)TAve3YZ(U$ zEPYEDS+L-5)=FMOdu52+x7^l2; z4TMU|IEn6Od}duBXGf1`46-*B{X;U6cjFNsXXdXRDn@kJL) zjg2SH<&FlGa~M-u0Ns^W4$qBMD7^mDj)>;fXDjZUcPbO1M+@>eYSX3&sX;DKv5$wm zyd|ei3nDXC=M|%@4H=Dwrm%MHd&D~i*`omZS5HEdfy#wMD7bT6dtjNcSuah|Lh(?G z9gLkqSx`9ls?CUpwWNzHW?53Q_nonN?2NFg(2NLHas;MRxY1~AZbJ3yLl+a{r=8Rb z+>R&4$PS@NT!3*L$3Ra>|IoLu&HL4i3?SFw6!nI?7&J$>^pjQdtq0fhQ>vaIJ(;poj0;FV;!3 zKDSO(8#_m=^_Q9g2c;owp=GhT+jGk19?GQLpWi5`$FNOARx^#oafyQ{_NTaiPx(D0 zKs_dK&(LJEh2MPnONi0I#8rT~|4aP9WC>C~p>?*US;8q(D7+-S%}T zXF+6rpro#}!yzqNHVR?hUosclb1j!liCKEKjRpQbQ;}{hA55~C#QL1=x}hxl95ZR8 z)(REd-y2?9;WMIz6R0E5HCE4m70f5=&YP@RglwB0`KOY~sl5Qbz2LsQy{ zmHHZ}$Oc?!4momS$a)4>QktNe!GjQ<^6MT&N)*&F? zJ6g*Y;O(gx%4r zT+tH>Q2nF56jxOl&`ah`v@q99$R(rKazDImfkre3bQ8aby)sC!vJcHM4eEW~BL)oH?R(XDmm6PRfbN{{S!8|) z_@{vbNxPJ0#4$e6(dYW&aDbP;+Nrr^9W;s3Yv)3Q9-tj0#r9vgr|EE7_Xc*cl9^C& zt(K4KD2NC(M{h58SqIhGD3(})jkJF^1|4c+wvqQ`WfDk<_T2JS0n9!9&92phZc41TdtrK50)1Lm=9(#~Nu*OA?j`U~|=k%WuGlGA^M*xuVeU z1vI^Y=BtT|+br9YJ4o0{VaeU|naTUErXlRPR7k~yY!?p&&ArtXvpLOn#X;GGGeX&*k6 zI2*n~sZhFlf@AKnRJWg|ziOBIHA)8I+#$RqF8y;qztRbsWXV((d%C1-ga#KW+wO2# zce|amjgZZV)T&tRwPNo8Ke~WsyC%1$jFC|vt7wf9V=PmYRXXZ3ZuBa+%`n4N;bk@B zBf_?tuO`>@;S>ZZk)KR|0@}-NHZdu&Y+9u;B1sHr6>d^Ug=BzSpWxOjftFH1?noz^ zc3zaj+m;6lv9H(j4v1$NXhH$)WCR4SUkYb!Sw$O)=GRo{OtIU;JeiBre3c`U1wBn`7YjlH==#JfBmJ zpp6ZJ{}a$R#FVJvKZ&4sLuqt8c7Qy~_NO$gckMD0nzl=+A&Xs+{AINhv#LZI&&|WF zlZ2V)8$NrMn|&P0F~8X1(bU5KuG_avC;ChIBt2ylGXFDtKW*;p$cq=tiIb<*bhxxD zO)iOhc!dM#C4Ii#J39OWtYG3iBBmq({_6Y?l*xoam0Oi!D8C|$#;X*s;~iWmpxMBbFFA%=)~7C)Q{ctfHcPo86?EZ}_|UL=4?R zM(GyBm2%`VX3rgySzIf&AYwmcYv-y+I%1<2S!L3nkg4_%WLZkZ z9Hcwt7pO;IbMnSEj88~&#nO&@yE7$u^A~8z$r8zl)wY#4j4JUIX0;A^mEvYeSY~gX zDmlK;H0DiojF)qEui%yn(R2taKPV=}NxbG5>w#uC3!Q|YTl3gzC1D8!tz2G6#^Kuj z(vg&Sv_L0}o5IUJrcCNkN-K9XKMt@!_!ha4RgUTeP1|ffW?bq>to@N9DugNo z$Hb>jB&-d#GmSe`Nx%H(g)WiM`N74ye2kb_`08NTI^kckMxDk2ObKRbiPuc@eG$r* z#}#2D&!C+FvGam~7-HM92SV{ntW+xL}mH6b`!R+1EtNU;5zHNTwMe={pL1^1$p5Ws7)~duj zpi!9S;53QP%>25UlKl!$ws9^Ztfae_~_=U!kw!j z$*~^-U?P(uMx!LY)p74{7PcNZQz3RqMnELkGCiqUI%o4Uw2kh}DOW~iRomP(*4~aB zs6J_r$WnhL5OA(F%{{4gx|DM6;+Mf?0=G^GEtsxN@Pe}1a+r^E0&1WWz6ro2dh?N4 zz3TRqN>EjG#$_hULT;IK%0P9}6Z{E~hdxlEP7E;AEo&97KoC6o=JdI6cySmN2#~X` zy>HGbqgXV7P8#xVK`kTMZZDoY=^z$~*2Tdk9SvI~$%{bEOfY!eZ!Q=jv*D~XI{^Dy zDD_@HBAQ%rK2&88dM6*xeaYtal<2r^5q5DaQ>kZqQ3M%eB4joZB-iJtq}ei>d6*zx zj{ZFSqa#&JBEgxrOvB#LAZ90=3 zkm_m6J->*ggv+%>u7?D{livi(qXkYueKfWo@k+)6E4W;()Jyx|4|~}@Infv2VR)ls zuiQ=uX3Hps3V`bEo(r#Gi@l^AOeFE?z{`pp_3IoJ|M;Z2Kuu4e8V+Th$akQMiR+Fe zne%nj{^zfzamTBtk91IkMB%^I7e}nnLtdZZJaYE$q(%ILp=H#1|H<__n%4T=mqxfd{`unD3!)k9Z%~ zp9%>9Y@|0B)s1A3vT7)4_?I?XXNk8tcU~@|7H}*;T9eTb_*o%MZq(6*CR2ZK&7!|} zsUdGCRysnOsluMXO?Hyf2Qo3fiW4iT1ErRw&W|L@G@emfqehe6popdK2DUf_SubYn zPRP03tgC1IqE#OWHw`aOsH_N6#be#rDOhCp%?t?BuTq@O9%kqAx9&YA@k)f>@b7h) z?=F(P84FvZa_8f;CQ|q|4Z0D}7~n7EJ0EX8diUG+L4^qD1ZeFXE#LNq5GNtb6}xLi zU!qo!hJ_Z+ASf~1MQAtT8KZ47TghSuo(_;!E{ed7=nO$cY0>nVqs2YKmy#284`ooC zbJ4_gkHED}dU^Ns0}6f5+mq!dqSCrj-wd@#%?k6k_%Q+ZEQNj1XHkrJYZ{V1yD1q-@=bjp%VW-)R6j3@#Up1XRn! zh;x)YUOaCx%eJj>Wy-156%2m9z_|mvw{<(*pi+q6q2Z|Aqz*sADdU5LzjHW>bCX@j zPda`%Mr*R<9GenaQU^c3)50fo2I5?+FuBk-vI;G^0x(0cr5ILkT-2iPuE?zfbcGNa z^7cx3sWSk5*=OPpX^aVgFS^n^uNVFl2QCry@SWLWmDE%UK{~5pcI2w&ML#(B*V+z! zQFk!Qbadx3Lo0C>K+ZI?n!Sm~Od>L-C*`z8R9tgEInj8A2)B)W)u{q09I~-TFS%(? zDM}H1|9oR(l(qYLi4$StbC!oYqsk8ovQs|Q6WaM%BG;wWn!Zj0swMlVx3 z;R&y#-D}~+Te+y)nG88=@yQ4mgT?D=zR7+x%x|;rgr(n6%1KH)9t>JdcziGwfNzD= zK}@ZicN~X=i$C7lTjQe1#EF!+esR zF<3(+n9V(({RQtp=`p)mSE@p7p6p5TYxh*>KvM2c^?E-@4UzdbSu(5WA-d_I#~U7p;^Ac4Wk>TpsXf0uZldmU9ylICgOZP& zyr`ib2R_VZJ*#qX=G0+AjHgjEApSZD0&aCO?a{DlrcI5>&|$Y@<3-xMYu6B6&_y~KYr zNo|mWOboEud516KpLWfVKl2A+f~&49M(0{3HeMB1H}pn42R#YwEZ8zE^S*kfX6L0}-c5Gq8UnIdmA{lg=j?A0~Rqk5;Ns@4-MMBK(a& z`4d4OQ`;!s2v3xAHS}lSNmS?ZRwkCR~x)k`A#)Q;u;_o3XX9RBi9 zN^EkRqdi**>LHgoJC3KiUv%oabvVD8bhZadTLy6<%3Lvnw5xmH`R@l24(a}8= z(05>u^Xt1~;lpCzMWReO>~OYy%_*yP(gOKwn>D$SJ(d5FMxxlr2IS_VkoB%=QmIl0 z3YKwzP<7N1ucgY>+fR^wz1ELTGO?eAnQ8T(@vkQ|9o&E z^b+s7B5eTK_PCyPALmnmEn7rqq}l__I+K_{^3vbU10ZxpY)_Gm`}_o|&m?stXIitq z;2rf};2CtQcg@3SD<-qjONOn?_Ma(RRw?CucCb#lbBd9=szDX8mjxhrj+~?3tlq1T z+}n#D%{&G6SYpMC;Ba}30|yAUbsxdo*vmYaSXf3YVgi{;jyy+7Zy0VthpoOj*R^7T z#F$K<7qnpQ2r*5Y9g33;=E~!#a-v271YoCi+#>Z ze+yb$Y(Ic3b-Xoa>9U&v9-f1STe2Y1@D0St^4~A?KzDENEBk-Q`!DPS()_0z%&*^u zd?NV7+fBB!l%vnu5&+_Ex&Q|IgQLqG1-Nld}kUFoaK9HlO>rb@iwRm_^T>bs|2u4470 z6FPX;_Jy>6ixV|*No3RyJQDFCzzak7!X(=&?w*?Vpv6dtaQ0SvK%w4=YKk2XrXx-D zMF1Y8)%2YpmnBaRk^%^{^UJg@`c9J+qY4l3mJZ?cIdobVHHG-Hn4Wbm3DG%+mRFae zk81Ag$2t-)v-LS9UxcD-?kgMujGAix-6i?W;^)1yOku)S|9*ZF(wH~aDw#K%Ypa^i z!%+tQL(W(oMy&_uA(g}w!Q&srr*fNPg9gu)g-bxOAeCiN=>hqKfURU!jeEs36)TB* z<6GMKU4%ppWrigJSIW&=ss2bUD^05BHDTUOnd54vW68iQl&v_`-IS!*>!n&Ye=0K- z6K2>KJ044Cd7ij*4oV!c#Dnt6$T(Nx*fYDmtb-3t^BZ<7VijLCEVRF&OQy#9(C_O_ zL&aT$+^<^7T5IGMWxd_+ALQ$>y>mcZ!|_UwH6o)PbqOUBGB2e4X1EO+|ge&zUY`f?gl+p`=Sz^5CmPE1nc}BVkM+2FW8y%#^ zxiCd1;}cfxFls@*&J$K7ul8<%GgXn!Y8OXgxo@?GEV3RVut%p+gJdWa)(Qg45un?) zI4_Hv(2|dLDzQA$qzX?#U!_0UJob3FkR8n56VuP%Y7Fler)0c|RAhiEsgG49OxfY1 zUd~Pk^^c#9f7NaplG?5tj%g4--S1B=G3sNjUJcUo-D)mFl>YP#2$`QwYbeyY^7 zix8oj&u6z=8z}VxWd*)0YnN}U!&hw8`VFy&#k;cxaaLye-RJ*)^#3E4J>=?}r7!FnjK>u3*5@f5n-MbUW{i3xPlm^sI`y3W_>`WGNwlEEfgqOrOLfeVjDwaF z`GJpR^2ke2KKm)YL8&mY5Y(h2*qpEWW~xV)gWI8-P2^IwLW*XD4T)8UF)nbX8YK9Z zY*;-(TxU^RFFT>Jw^V2I2fm=IVz{zTt2ce)vd*p=neh>Czis&3ZHyz94d{uiEeF{k zJNUb-<4SlP&sawVLkAZEp@?FSFh$e7NPrxk!N<0UWwL(e>)P>|Q z^Q|4H9NR&s`(|G~LVYh3v=uHy7S8&vpnAQriO|1$`P%{I1Weh33KpFprX-<7`iu9s z*q6u>-&UxY8_K(gKIRJ4`XzL4X3D>2ijn?Yg`O&n9ek^#1I-)|2GgBht6ALmG{oVT zAY*e5+MUA!-4iesCiSz1^%>Ptl`OZE5vi~q&tH-y_Nw&{-&KH-)#wkbH%6un4o=_t z28W09pmea&780cDsj?%Ep79B`{sbH~5eQgJ3Aw3bkA=AA6DKF8;r7}Pmq944xP+d! zN{8=E-?9@teIpxqRyDH@e6hd72T}&-a!XqmGQ|5oR_@O zJXX+;5_#w^N3qd8`Q+WzkcDX=gZr^XC<-ckK zn!d?njr?`Ek`U5ZIYXK+TH!-eRFW`~r9QnGdANqtpTzEPJt=LRD^-WHfn-=nY80gPY<~egzX4xc^t;avWFxn>Uz}n=u?Ej> z^U3)es{Ha@nYFf$FAW9!qR_g(7AmQ9FvJtJ=@)BhqJZ@wb;mI$%-e)ZVwUtX zMVDxm8Y*j;O?#I!cD!=AFT_`w<94$Et#Q)s*(g7!L*X(^M>E-y55YmuTT+5}2g~&j zS2B%ja&QVFm-jVHTDGpu`A2!uedSRvh&T9Mb0kG9h)oN2*$#FOYCR?U>mV=pv;jW0 zNt;kyYIFLbl!G!yM-e(t5yuBG!Vd8_3sA~39(FW zhhBwc`@{OdxH@YR_Q3g@+)Z=ELHA5JwF=}Jk=Udh+sQV&#wl* z$NYx#-oM!xI#~)WLv33iF^8e5)nuY;ue(MthHIj$e@)msMM{_F;+Ws?zvfb_dwFNL zxx^hrhYP?uTjq>$U>&dL7SA*1CnYB~&x~)0@~|$_8_SSMY7JAV)<3<=hd0}mo2=-l z0>5rh^6OH5>&7;gO)LH;S=p*P2NQg9dTf{-&76M3_G4b+C~Ko$g;WV;3e)bJj02qr z51Q}nbzADQbB`PZG#4^7>1R{fM`x99DsN{sW40Anx>SW2i0eDcdJR`-G&3qce!i4& zqKb^lW0jp30S-3kkg}3#BcCz%`$4Y+#Z0U<=@j1Pi-|DXk)0dsg6|>}W!esvc69L~ z_XH%G0u@C2k<4T}NN_g_L-?C7eS$QYCpX+(emn(}4M7;vX{un%zJ7vE!o`6NfQ5lY zfP+rI1@rq40D}Xd(&UmfOS*LJxxx-9tfQRal+f6AF%3>E_&wz#3;;%)Dy$W+7^aZ9 zV3bpr@^yp~^~bxrKPJEXrxKl#IQ8?Y!(hk%&SJ=A)c@*|0|u!cB|zgT8hTt2bUal@ zbgb043$nHn3mE1ap9$g7siP=4l)?bG$ma3#lKF({S5)bhS-JsSr3?$*2e%01C-EsdX5V*s$+x-8AWePNMK`0E8*yBd37U2el%vT?K8j698#xG23yRcPBLEU#3HliD5`MkhXQCb< zk9Z`F(vtI%KDh74eN=^~xfUdoo>Ag1E9hGx_kxwFUL-K_A;!6e!hMw2;Zme`Wm?p0 zy9B^6>O0s=`oNUM>=aTwDGPt@&Akn#2@D|&_a_LEAr8!Po#eVbW1P5CM)nw5l`2mB~?f?+D|0;WmK|0oaLtlY*QJyqtVci)?@k!_hs}je8}^OkS&#$TN=&Gt7c@X%0`T zC7a>1h0|kQfG)bFM5$56O5H$*`cXk}b%hyI4j+Y{E1BjSq9^P*?Gr@lREF?PcPd~= zODp36?uDvAIM}QV8)l#<4lol9@0teEPs_um*AcbW5aXP2lLiV$Q@*LY`3czT;ZNZk=RY{wj2`}`Vz{kO2O#`MZg~MM0Okm*@l%o`*N8MH{(>X;@ zy!taoPzGj!lzR+(PJjW*~89npRMt~>z*z#-4_)E{&uwYyhJ>C!053JO0x zQM&-a@jE3Nwh98dY!*3H{-1n%=G8$DoN(Z{Ri~vLbKk`v9vIZGLi@HML!$`HAp9O1 zo-2R}b($dGs|OUS7Y^Os1NP$IrES0yhFpr_!KwkZ5rfOc$?t^wMNl;JkbHO}fk|(# zHs^?0FGrJlENPytD@LYpuh7zPHLhCftpf8J8QS3$zrVf79+nTaxeO`O(T+2K$L@yo zv%NgW!Ik^;ltD<1sEF4)g(kv!`QblZ^(C@NWLML9<`Me5+_s7MpRCxBGyAIE;P52; zkK2S3%xglEtk~QN|C8VT+kQ>!06oyT4)Vl%Ibr9K?$L;8c?xNMP{e)ZLNf<);s*!s zbYYlkB1E!eY$4MIO9LOUVJIcL6ZXgYD5NBCmEZ(*Q2Q}NVH@9)e0`JVfX;XF#7a(( z*}-xQZb=WW9gr^qhU|P~=a2NaDF~KL=C+>J$<(02%9CZDGL?y9cUa(= z)g`FyGBla%l4MYekYhe0)0e?Sph~Cf2KT^0TW8pon7BHMOwJcgA$Uca+IF8aBE_PW zLTha`gat8JW^e<;p_3EnA)tRBs<4ii*2TBi4uLhT{ZT@D2?L;Y{+ci|V&Oh&COFfL zAYX~Cn~$P*g^0R1P3>XN>?F$R^TPb{eWBAf1RHMPf@vYGN&yaxigo9qpaz2nls=6U zN3TJK$MKIgB|#aSo{Ia*`U0Os(^f)t-VzP<(JZB=4p}hapr5%y6qW^6sYIFQQ2hR! zKe|=QEMLA1yH0uqo>?IrQ5H@VpI+Z369d7`LAK!yoQzS0WJW&_ZBVid2I9hHr$Z1V z|NE*PHJ_Bn^xE7I7zUcH$Rwc}zVekhfOg)GS3^F{U+u<#X}31m0Q zR@%j804**O!l4EyY-E5Uant%hl~29u$kg4J%b__UPM9$E9=K)e#5dVEm1Jg4dghKO zh%U2ORfKR*|-6XhsNG-2R^}&v=EoKi+SB0%!&&zMOouAr$1X|2UU% ztM)&BoQ@AgtycaC*ibP4FsM!}VtJMF|F8ZZUxGw$r7W=#3qH$^bw-_EVdp+dehr5N;5saEGVtd(0Pl5dZPh_@#0@YrLY-bnx7!t zN807ghM%osK>@=V>;FxPNPA4#K*TsM6Z0_K?@1i3|4j;58q=^jQu97uDMN`?M1I89eCe_gYMW@O@Ug7BfV(z=6n##Jq zZwes^0g@0f^n@CkhNgf5DU^VKp&Af10R%);P;eMjNTat<1w;+KD?rtY}J#~1IwZ{<)X|K*S5(6(RJ_(iXa9u^2qe&JUq?DMjyPge$>00k_1p3;P zhLU>tC&96VJWZ54!%x8y(3x9=MyX5tZos43G9Ougf)j#RI%k(^}S_5xVd(yArqgxqX8elob6QJE3?zkIlrNo((b_DGdw3$O62jB!( z-!0$j`>Z=gIsLS&xm5T4O+E8P`oukxvWRLhD2J(>V1ieyilXCaJ{iOA3w$VW4J+gN zsD2cRcM*<@va+&BU;Vy@5(@Xza_`U8csC2dapaE6ig`!13S#Ko)#%N1yKiN1WO1~_ z!==%;1hiB-JT1PCR|yVX;I*(B%3J6STDN&E>dj4Wx(y-0&_%&r^_}>Yn&)U5W8SLN zEL}}GbLoKHrqq`+iMpv7eTUtzA5OkdNsMbEKkdC1n!@L6U4W_x)+%LEHv;O$rtT^1 z1>O#-$^F;!W9MDR2*Seg9VmGNEH|{m18Rx<4Jpx6llOlh7cY`?tX5l)mQLS4T^nv) z&7#eu&w^I-t`$1;!(&DwERCd{(@kFmCa&wvU=`adQ_;q5C%6t;Gi+}_i`q>r_~-$C zs=(wyPjXTB>)vYc(FhrVPFVXpu7woe%y7m#Q8u&uar8%K`9pUOoqmjNh`ZVNPSeY@lB0&hpq zC&*ZrNYq@8p12)`+s3fdDEG00gQZ!KqK>VEa-3Vn!r*+$ci_j2f&WrwWeqKwQYr~U z!uGHvAD1*kB-CpwxleYfrePuTXidVU zvzy@>-+@FX0LG!$9Z+;}kOVfc+&6b?LKU&cKZm4p>okG`cP0_a63k6i;E_uulo$59 z9Z}P^i>&@7j((Fe-T-CVvg8A+*=I{OPwC#I`|#(W)JQ${x(=D09pYn0bGTM;G43Kw zHKa*ye}-Fbobd_YrX*GC!bwhjUn|W`wqK^0d)fdT+_~thhlO{wvEduvH4rx4u~I~6 zidFD7YYq9?L))p)_%y>A`^z=8xlxXFPi?9!8Z=po;=(pY$sD0+*b0-I1ntNv10#wS zl>g^=BP`e1sAq+QoopJjxQQ`9d1OLjl@H8x#gTv6+j?rF<#enTH%G1nw&-GK4qj|9 ztW=jcFj1R4C&959EZ6w+pmoFzXmOUCwa9Fgg@$8hnczm-VzDUo<%t-LQpzrQAAjgvyRIXbo-PmY94tX92v z;!qoHbVI4*e&IE7vR#i6f$DW*8)!A+xfd}>PP6uwRGnLe?EIo*4oqqy4Pin!4j|60 zv6oDM6APbv(wZRcZgxO16)XiL#DYG}W?8ikl2`lI!killKmo#I4#s>xUdY`kRBLUM zhBUOc0Yro_sPO>^Vy(`VL2D=>AuB@puH^}q*(jWziOgd4ixmE}y~o>+3FOz-5zv|J zUT`D_vsGUXZ-6EPE~6c*qdBtXG8CbD6q`|-^y8oO5M%YuYz+sOsoHL3 zi|Jsn`_JKnuK{64j5tFs)lf2<&CmyRg*$a@u92g|d@^4}z-d7V)(_AwU2?C>J=;_r zBlB~M; zZ@L6hf}2LFyZ}4;ySsVt2Z}+NH{}VIHe~*^h$8tPgD6iqiI)k0knl(}CDUF4hVc0J zU}$PLvb!AlLjZSZbRWwnend)nZllHRch9fJb^F>mR=Tw-NddL|=*GtkCVX zpE6R_uW7~qc? zUvd!Ot0lQu8D=XBfXh;%1a3D`LY~C9UHOgJ&=J$EE+>3mv^FiB?*I(LLk^BA#7O9R z@Ia3aUY?5sr7|!9R@qn5!9wC;aemj1liV_c!%^a}$M!@vgE#seNc$0agav~1(LQ2W zlyq3n;hp((Fs@_F(PKycU~yJtXLg;u)YU&$aOQ~AYXmb zemxAzRD2}#yh+8QQkm|X+090TCS5EKtb3c}$R7JKKNWUUXlxjqlK+J&=4YPUf%(j+0~-cer4&(PTEkz-V^#nZ%rZ^y03v?|{_F&1N~!D2)-iFx zFrTNP&aY8?DPcFUrj;+T@Y~X)`Z1?HXE)kbu!m^9Rtb4o)w%w_c!N!^N~bLk{jB0i zG@>+DsvpFhPbhuP8uT?uP|q~(bjr%EyC+TkISvjIRT9FKq!TvRpDNE-&B<@v`P}z$ zR#4g04PLFem*sx&DKw#seSX%9;7Wj>3=lqkfn`51a7|%C#uZBvz-`}WU89%Gvd1- zA}aO^Z!rl-WdI#u(_fqwx`aaSgNaR;c4-qgNTj*m97iGnvJ1wwarIsgu@t`|laOzzDX=?BF`t zLywE%Hs6C)20#oi{ zDv>vju8nQdg;HPMOwED+*C36ycP-e|ppZ_5_Txh*+Y!0R68#B)&PP@>0&ucOk<6b+ z6q@wAx?l2V^thn_6o3S3tB=cAE8&UGsnhY@so8E+2sSnMQNG=eNB2I6b0M3R2s@;D z`YVq|mFjM)m`cGPGTHSH$?blM0r20CU+tT@Qv2k})gE;y%47MKOnUorw`=e{>xN{F z+7Let^Zxm5rcT-Vnw;@oowLr-J*}zVVu|)l1-UJJ^0rlH*Hp^4uZl$MTVzaH<1u zuHJ=oLw&RQNlmITbsJ2S9-vSjmwsTCJR`c0F;ke?h6GtAt$7e=a`aePK{T!3Tpq@m z)7=8Ng>~FrI2}znY$o4-cGF!X#WQc0PG)zVgy4yqF*Ep}0!zFe5U`WzH+Dtp%PeBL z=qlXi48J1j=Y=sL2-XzkaCP@i8xX^d!T=*S3khVqOvma*J%w*g2ExanULL5d{G<7> zS?KmY{5HN7fJ)>t-UIav=Ok0|pM{_mkKh#HKy25=tl*T4#v3o4KkNQw_rk&OEY-dD zC!S7*g8`VVwCk@~Pnl&BGF`xfGl!G16Rsf1Nh4G5v-ISXR4-`h=W-8M?`DDT?c>D+ zfO>X>tZ6DRKU#tVm^&fJ%J0As`>Hh)G}OzR4}o{>Mbl%_Dma z%_XEM))Ow6NshI5tcS+8c>)|WO}KLRH4h4RCUUrhUjqWeJ>ij2V?yu}i>VVb!c$xqXxU3`?@p;Kgu>j(+DZP}~y zzHU}gYQrONC*?G1AZ*COVKAW$RFH(g%S)+ZkzeB)uRV=#mX+2PNSaOhJ|)Md%qRc= z*KBywEN$kn9?9b{vc`@cLg&yXW2*xd$lb;>yBRJbMvoIl4nJnBD^x-eNIbS!Ov> z7o7h>EgBmSCvU!eWd^=FTVZ3l#PV>OT6xt3kVhB560WP6#tJ#r8#!SKCFn7$J`BSk zP2^^yBl3M0P&f~7^%S^Kj7?7*no(w(ZGJDOOoyAROCEs~puL9J!|&5WoA*@E-iGI! zP}w?Yh@MG{B)p`hyQXMQTd#*+wr5A2-f=s%<8MKpA+c+|0%+L4x*mTrWlL+dkN}hu z&L!zfwj-kn=N9K#%A&FG9H``7V(F{N)5$n;ava4qMVs)}LrtuD&8edesdPv#=&COj z=gTx2GrA}k`KbMbsJyhqUCnzj?5 zz)9`Qc>f|(#wst|Ng6q(%tc48lmb=Xt*NW=ri-s*7pqKpsTT$xT$8csqyFgqtZ2=fJKIpF&Uv`fkgeN}8VqnV4TIIOY!KJkQRW%$o^DaNq;9ja=7+`& z43N-cxnK64VvZ9!Rjy5s6FPM7pS+~LeNXZ5Rf`{2e+Sa{-7~#>gH4Vj>7Ivtmc9Rn zgP~PBXnkm2zViO(cYk%2d8QSpIw{ls#+LLfmn)AqzWzrX=J$LDLqFd~AdJY*e8zMIL~T>C{e4iT zCKb%8b*z* zP(DOebyd&;GlOSZUCsa%anptjEWxI$Ao2Zb0{tJbbk?nlV*3|XVLQ)(r{T=>^mKb$ zUW2)@^xLZyWm&|*H?cZ-7Jb)?J6(}1-=8f*u)V{i7K%>?N;2!C?dfh+Q z2jrncQ&{Oqol1pwUdBEkW@&%xxMH;hN z__z;^Gity{@oILUtQHrv5Ruz{SuEWR?XxWXn)TaP)>ik2GYb!W-#y$`GobFLn{)th zU|q>~C^wW|o}M6qC@RS}SUkgNLH@|dTr9f9`eerh+{@Bt-0Mi)##??HgxB+Hm+$}d z{Xqpi7yf7*K3opw-cH{Uc(88>AdwS&EgzTzWAa9tJU^YOxhS2X4O{>bLKv9yTGx=} z71ygSlu&Y335gpis`lPUUI4B=sLrw~tBBHvK~vH;+H%npG8n#VAQlvQx!x4Y>0jm7 zzb-0%Q>oMOi1NA)o6s;)fg>nBv6xUdmT9={VbJ)M=`iebaPobCEzV-$68c4N7O;c$Pzl|AT`JVh87+ZA-pr9f3nI$EegnQVGqlzIL z2nvWM#M~0{b z3j3`0cK-fg9pT&Us-c$iK90=AC{yy3CO z^jPPce`TgmqQ3*dX(A(!5!S;!3Is3Ai62?Py)-#mOC-()*{tjJw^jK-%QyEpq1_4M z?ZX>k&JA?)Fga1=_A!ay=)G#Wy{znMGW(s@v^1cYaoc0nrOA^D*B68O8z#tNIy z`^Cg3TjrZS4c=)wYU2~K8Jr!R)_(`2nKy0Lf<24YwmO1uyQRBt1^g$AhWrZm)ld@r z0UtbfWNYrJaFV(iob4B6NbgnB0OKl?;S_TWdpGhzDA64(@aB>S-VVS`la+LF3^`@r zzI3Z%<6~t>;omkC1pJ|tIWlpqOEvzFi2W@@WGTmbuKWNul zv7@flWz>FWC{lYn_c+y_Uji-q!Wgl&1PQ^|fnpZk-kD=DZ84e~-~#jZGD>DydDqOB znzi8E1Y#M-Eu!Tkf;3tl4RsyTR{ksN`C<7kUbbtM$O+U&?%wu#l;nfwnnIzGR#sh5 zlBxXA4Q#;J0{60!FGC4PH}ZM}DPB)+6=PnyK#Gu#cYo!&Gyofu2<4n6TkaFni47f+ z=)Fl`5g@F<#(UmD9Pb6RDh-;kz8XQq>gfw=A^qpAcGHE{>VD{$Rm*XipgRAiH98d+ ze3UxsutHAcfg^%8IkxY$!@Cql>g8DK>r*3sonX2V9vrk>{apT-s==)HH>V$Sd1j^Y z`ZxMDAtN}9vvm_@)|p8Z6Nn6K-8_BDRKy<6y820HJ$n{lcTWmc^Ka_-SP;EtifncdP4&+>Hyag9W{s~MT(u#! zM$9~lm^A9}tY~a0i#20JCyF;9LA4kL!FNm`E@ zvlfDUzZfWx<~l|&9W;-*oDIer9nB8C@0zJWFdyj(w)*6e{YrZ>$x@+3qzBBU^3X_g z<8#aPAvz?q&-rS0nw|=%^cl{R(8rTI$^3X$K21aWJJ6*SN_ocxqTs3+JtXAzUx=tI z)L;Y6P&N2S(!()My)i8CbW`!fa$pQglDXUd&97x5<+m%c`-H}ui%m9Vda1?XPW7)- zvjivgMD~EbfQwuLLL74sY|v)YX%to}fj@@kguw%^J03<;F#0ArPX%wu?4C5*ZA1wR zq;ldz$HjtwAx4+I_yVwT-Zy=Nj{b5=Q8ctD=sVDl^uYK=f3%!hNaQIZK%5ol`#*|~ zx^2-T*Tj<#!XE#UQ}|%Dd(s8%*?-pQwDC0TycgNPb?D71{Y#z z!y@kHQU!VtrhW83PKAHnQ8Ol-xB?=8Jt*FBZ83)D^tSB#M;v}7m|K44EHt)l+~acg z@jv7M_WYfBRpt#0o~$|mY57O!>BsFd_W$Lx5uuQB$oXDuXvZ>qEVAHZlDqrEX$n;{aQ4UO0BM74(E#o|pm-XZ2yx913oxRk1bT)esV`3Fj z@Y4t>-F0R>hP(y*qfJeKQIRIPOmhWD8qSkjp%8{r0S(a{IUL2USbbvVZyrY~IE%Qs z4$|uqjZ`R4^SXftBh^#XAHxi*YMz6(KYsKBe&5%fg2LuPx>1R(P1<@sG4Rg0ZEG{5 zkXk)@$f6O4>E1E1=jPW3dq+c%_QDaHv>rGmI(Fn%SpN+dFTXUy?a_&z)v99hb3j4} z-b+$@sLFj_Wy5W{L z?a_EA&+0|ZvBPG`umlJ9lSh~~`uHpkcVee$Zb?9l5klRQcfQG$tO(IX6E;BUQe5Bi zc3GSVA>yJBgBwmXeVScsBE)3?ZQ*40P12G^G1>HY-7S0w)S4PNy%u&}zWUi*(jwLG zU5#2ITre{58PZ&3uGK_R=TnXrCFa{(;?V4>={>WF$0&~~dgZ0+8sH|f5Z7CO>~bEil7ge5a{4;rY%yI*2EHK?-n zBzBLKr3r6g6`9nwnPwWG`!4|j_u|gh*Pwj_7JR)m9A52pzBS*r|5rI*v9!U0j22oJMqDp#AKtD1N2i1 zC4r9(!Xk{!{7qMHB@nn&*>|S9O?VcM;m#)>D>;QgoO=GB{BWJ|=0??|4K4<{&A_0pqJt5B{%6e$xq#v zO`zoN$d%{KpQPL@89ejy+@UM`_+kk#MtvNF@>g^NYfV=+c|ts0Bg)7=T0~^Yps;`0 z4d1onw(5Jhu+lZTXyJKL&KHWg^)7hZMew0aEMf9_iLJHbBYM=;y`HPj+s19+-eTHB zM;$g_ITIz<{cTgpkwb>Elf%g})bX=!-?vRimbi>kQ${xx?27?gXCw~v@;a-KjkjPO@ggNi!8-0B*j~CnI3hU zo7X5+kgCZuiMFNOL8b$sr7qV~SZry_&K5pd%?jiRE`hf0>T;t=caTxB-Ig{@$2agye=NbJ5*qek~~fjgFuGQT`6 z=iEP$>+MoAG}&9%{62P;5tseAoi#1#$@Sg!tfGS1>!Qa^xU|8_BQsYu0 z+)`6OMNyA)4_F<@~cgsyfrIH_b}-4=zT=xNfw`vTH*B8WC(rk(SZ!eD%MO9CQP~hqZp#@a7e?l?y;>ze%`GhhG1r zO9ADaFWG@}O6+UDGJXDduW)0P;VvTtRqDv}UFAvYHQIuL#yZW4#yvao-W`AJVks9p zfmq8&w-VX$c!G^YRi9dd9Yh?LC%_@Pv z_8N-Bg)t;?6cKa1nub??{nMLb7Lkc^*9k3atNtNT(oZo|{PwR|FbU6or;0DTpS64F zA9C;}Kyo71^r=(fSGAl@veg*>oZxcf9!g+%!OFb+l*xGMTCmHXHUAjyw&5pYrJ!&- zuNJkrT-^VUDT!@-O*0`>`5CULx8r6i6!HHk$r8geK5Mn>=B(v~sa2nDMaSzD_%e@F zSRC`&?8$GJJeLdgTX+B5YN(^w1W?(~k%_>gQmP%dfC8-2@ieU$2!tIXNOi5};cl?u zw5KZoBJ6ML$wfy!GJuC!BJy~1?%fd~EdA3Zq&reEOA5~pUNc& zi>IyV9qZ(ajqSYCdb*a8ax$|_>JRJWqt{wdC6=RvNEKMM9Jk~MU213kr_X`( zJmL11um=;M<`K1H6o<;Rrj{O>UD}CDs1o?*yKik>Rdj!9S9^<;*TbskTugua;#igI zO%qc0GLTq))~~stKTsdGi!wr0cU+_y+yK zIv_2eU8Wksv- ztpa(|AabzLlR8&!!#4E`QQ-j2fzPDE8=6#aRjoc&?SAEieU^IK>8B@d{&0a>+NkL{ z$IvqpL@{tK9?YhH&b@V32rYHN{9Z!V7_ zXR%*_8Z$)fxTHdwugNz}gc{f;nZ%07|BoMo2|$Aa_Qi)tlLpCgKE6kMA|>vqb9( z)@>q29<`n2+rf@CqCVa$;v|G);cj~%zi^*(dd%;AK`};f-flY@P9v4Ew}~HxuISYw zWX5jyyXC9U5Ci4=M8K4{hoBYXj`vP8Q!Bkf;44=7?h}eVh1kx%dei~*)+XTT>CcPd z-GvM;wOysm_;fa*$XMUZy#ohBY|h?jqraYls6Y0UC|2Lr!G%jEH&~fd*5!!c6u1`o zUWB|i7e8iSF<=8^r*8a_CA~FX94C2f_We?It8)X03hs)N<6nrm=$sUA#;|A`{#&0U zFNN4yeezUYUyUkt-a5nb_EV)0{U^;T{;#WS8&(CV+p*0(bNxVibhS~X#+IbtV@zq>P_@i$47v0R&XgGOf3dK3$U|Q6YMuTv(4_==3Vcr z4&$l7uJ8;q)E0>Rm$)D4ouIl(TfRlF^+|)-G>;clTt0@qw^RB8EC;}o6@DN6y-7U^ zubL-MeAd4qZX3`Z5$3`oYq;~MdJ8$g$%{RKu>1dF)$g;_5n_+_U};7RgL&LiH7XF5 zW~{<_vHb9M!=FaGrq)x=)8NoKujVG|#!H5g8lFIJSFNimr}YjVIOk4vDh^jyel2&$ zh4;}@j6NY69|;b?#7Mxb5!@dPuiKW|{d!?nXRV($4t+I(=9krVZS1>2s^EQONJFGcS@J-f0C6r8aINZG8kI7u-jdKwz zM`SfJ-dtYP>MKHwIqzUYI_9>Q5Kd#4;V~5=RQ4_bm;hLlE7~t0sdcEeLg+voc%Hiv z%k~Yydl;=g)!nDXHTasZlk*%;>LKvBDwdf%Wp6t;RYpIzNTkO1Z;2Y^7!=YQ0`d!)CN1mjf`nJ@w%1#H%FVMMH%{~H^%=9U-e z*sh!hSkOsUh|X=F1F&dt(eQ_72Yb=8{F>;?!%k^+D2gRi^iEo-5HOLrm~!{Q0^(%l|j|1kF@ zHKN1ZLEwbE`%NMd&nf>Xa^@8Y>?r$npfY4Z>Fd5Pe&rpLNO9 z0@4IJV^XBYJ|2+cOgjT_qc#wx-|_X!Ggb4A8j(Fu%18*~ha~H2#3x`EgS~@f*mNp4 zsL6$^XIH|~m~n-vm6X>Z-+B{fh8xG)v{$7M8oDA__I&h3m_e-<|toQO`S#nd5J&dd6Od+<`p=%b5}C zhvKWTke;f`k5Dl~{-=BTGIQpk1~%^N1KDC?=hXU+6+LX-lw>s##Ej*vaw`9Ojue&* zg?ZOncdNm<8L9Y)-ns_<3`Uu!+bS%_4H#=7jA0HE|ATlHR)5{lR);~V z2I#zGea<`e>kaedQqSth|3)yUju?$wUz=e9LGHdw*?f=&uf*b3mQhVGM&LIJ=a&0k z&}f6+2!{eBJwvZbrXNMB-(ge5?0f)%=uh81WecBKuht-C5`WT!c?C8gXwxAn0G^c! zILC|8s+70eDL$$Zv$xw)%p=?1;LFTl{c`0KEqdYVEQ<F6di9%8?_Vesd6KZ_*KEA55@nL`5*j?r#4 z*H?bW-_C3BC5(f#GiU}Qyq!pGNA$2~gctOlSyykZ87CG+N;{#tYy5m!9YL*tVBdkV8o>lGt{O|aWu>o+crwIXt^=<=6VtJMpiz8`vig>Hh z=f3t^U;5pS#RX!^N zUi9j{Z;@<*&Q%G!M*u_NRiR8*SoVqQqR4B1S?Gm3sY1K~h(F2`oAVH3*LgN4yESRh zTo3Lx>HROFP#Lw~mEx<gg{8Zcfd;vA`*1w@Li!O%!zk+;7d;! zwh_&xPgd`URE~4D&QOwd%bZSL$y6i8>5saE$2yeLC&w)uBL1Ro%NU~5b5ZitdBB11 z^zg!?1t1aXDC52B;lkGJ=O{wL(Y(=c+1@sRqcqTYsN|TcK)Kx4+?6kQs+@=J;Rd2A zQl>efA=UA!VY#GA7PC~~n!ddp)A__dD4hUG5P$XzyzcV~l1O1k$Wbxc{96}Lg zhSk0H6qCuYgn$%DfF)sF`_5HC<_NG7WM}dCsW&%|85xvNTm-+9qSs1bEYp0ff*rey zBQhDVq53kC;%&4O+RS+Y!|~CEd$^vZPh5kb0p;@5y?1>&&;Y;Z78=!kb{8qRze7Pi z7unKq;!*&K-Y+MAZ!Jg*A7PkK4;nH~BNmcM&m1BVfeuBL=MPlrBXGTOAv}rBo+m@E1NF7oYKVhFc*=uZ3iYNbL<9L~6j|O1V~3D;9&JMd zB#4dC+1N3u4q&`hn*dO#E!EFW14QYWS`_Ed>Me9Oq%c!l>(6^ykCLJca@B22^v(uT z42>S66@(ERJrX&&1HFJ)Ju@hKE{T;|F%ImXpP=1$3 zv!mrzszKsXt!49@9JVqpm*&0E_^n~M)4okB_Ot(sljY|}N1vEjQBur#VPQ3KZs{LN zWSHf~ZpP3*lgKpdqrU$*62pHu6(T0}+_V+`SCH~Tn!!Je3-WJqejVQ?ZAs;gjDAZ8 z!GXvyrC`pMsAUYV9>b7Tj~BGbj%9Dpx0$mpZT#;A#oyscM0U?bx$iMjd9RB zZkn0_f?z$%)1tA^8b2-i!|^Fer`(Z2GHG0|OK`P1ItR<3f#pkle*kPZ5;j!(w9m+3 zGy8&mr~!a4){?6uH3q2GqN8m~{**)cq*TX(J^EbJ0= z6SH5AWi0sL$;ZXmz5!9R4q`>|y8%exBtosLf7z!**5?6i@djmkd({*rAkcjBvyVPQ ze;T+!Y@zHubY*4%)zN+-okzC&gw1k7y zJ`Jx5*KkGV$#y`+X;52lRyC-9*=M;l0!mG?QNyEt@1}_dc7TS!XFMWX;q09Y8Nnw% zR6c|o=~;)hoeG<{buVfm&5rO`o#U@vXz3DU(!{o0PZPOjse4^P*K4{2v4( zm@CeD?j&K9lnvS41W-6GMY<2?#ZKWotaUTiCW_dQtf~WUMXaL>V_VMgk4os*xGr`u zQrxdS2CC8)PxK9`ELe*$^yIwx>!XrJs{m(OEiV`r&`fss5nxx zTu$EG9_V{dDS*eLhbWF)kOzPJ{G+~xQ?g}zLW{;#u8@7J1>rzYbynsu1g*m2#5QmX zGaRZo(=7uQNS?$D|0wsMkLMeA$uC?hS5uWRH?_E%U_f!&pK!gc|B3B)K=()K+Rj0} zN19xa*OXrRO@c>cLd=ziH;sSU`aY|pYEVSa6}o^3)dD3^Oe2z-T+K|UN}emm`G{}o z$pxHg#eD#&u&n&*N(QyAq)t&|#=;ge2RcZYunUySe&s_vb0FZ0bHry|kGJIHk^pn+ zCMM4jEhOm?+7>uE^$HMEspUlV=|EQ7*Dv;J0bHLy$c#?;e!2Koq6C|Xr$#$%lGapRI-pehK9R9 zWC861KK35Kc#+$$sOA*iBYWZYLV#rS^`bqO4)hdM(T0A@?)#(~cvw0-^%zpm_BY5f z2y=J-X)%~pcj$&HKt$Y=)!ZGd=PcLJ7a&sp?}r&mjNO>8)R&%W4O{hkfAhZ`p=xz) zFD-x@DB8xEYAM8UgI75{hMOOqwziQq#+7o7ykx%qKep770Y%ecx>d9=&7!d~_P0e z8IeM4CBt!^8rsLJPk3*rE;rtc1GV;WzU?Ge!v)OKr8$X=o?@lu2h!3;9%v?FJ1Lu3 zRkc_qBUHHdLH2Q`K{fFdZtu=Wgjt!QX099O~Ply0sv#<8oO?RKTuu%C*C_5>*`h&tP z_y3}B2id?(jH85dI^t|HOTrz_j=9AVkP>#F{94k162cfR+J37+llfO#8J9FlGJJEZ z^P5lV2|AL#CM7WAwcjJvioVy|C0kleR3C2-FzcKCV9p^i7=B2n z*T&>hkv1(a(kHy03r(ykd(fsfRz0|5LqyYf5DT}|tKS=zIZ%XP)&%dx*!ocHx#pA? z+FjI(K6B{Ow^Uec6G-^@rn*82=HAdmWk4^y;x_4#t@LsBuPxYy_p29f{#tsW&IOSt z@B4<|TxvegKjoGwq;}U2nptPuKdGKiRDGLGfR+o@fC^)hXUDJPo$fRgf`b#d&kn&Mz+(g~2Kb>C%RjZ4IgPcH9nbD`OTQUBIPLRt!`1)L z%+qoT^%kwKP0J7ydEc+)f11i;3xx3fHHuor2+{@HSs$)v+oqd8VQJCOsGx(ci2Rs|Uj~|7C8k01&LqkXFt1T@9}?uY zV|7CNgs$#gT)I%Ld}|t|&W3pI2e`;zb{_wd+LW}ArC{!5);znxeI9B9h1yMI`tsW= z3q&g3fv!5_s27ZmW(2k_vGGYxGzi^-f}ig+s*;FOyayVf9Vxuw%&h? z3pa1{<-F37Ztq}k?xx*lQx7es|7QOgrQo;=AbF0*c*;*?BRgu=WvFAN=d)RTRig%F zy%!6j8>eJk?bQ2`)K>+y8Szp&-UhSJ2ecoKyl_*=^mSt+WJ@WMgZDf|9%g_sL13|v z2xk|Kiw%wuw{5IESM9>$2Tp=y+kboqY8i(hq1F%oG<;LRUCoj{6j^Vv+x9bcNDRvKD=Ee2X~(IUD;P!-2cc)u)hsN*w@F&z z#6MN?4K&btsE>{HEw-EBWCzUa zIK$h3RN0(lW)#s;50l1@$RSUaoNB@vyf`TSOSz=iR-bfFc|uxJ6#FhILR4bDPg7!@Nra_fl5A

^D-dLvEhc%)#?EuurqOD?~$ZDN%Rl?+5#g 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 4.2.4" + }, + "multi_instance": true, + "services": [ + "nginx", + "php8.0-fpm", + "mysql" + ], + "arguments": { + "install": [{ + "name": "domain", + "type": "domain", + "example": "example.com" + }, + { + "name": "is_public", + "type": "boolean", + "help": { + "en": "If enabled, eLabFTW will be accessible by people who do not have an account. This can be changed later via the webadmin.", + "fr": "Si cette case est cochée, eLabFTW sera accessible aux personnes n’ayant pas de compte. Vous pourrez changer ceci plus tard via la webadmin." + }, + "default": true + } + ] + } +} diff --git a/scripts/_common.sh b/scripts/_common.sh new file mode 100644 index 0000000..e204bc0 --- /dev/null +++ b/scripts/_common.sh @@ -0,0 +1,28 @@ +#!/bin/bash +#!/bin/bash + +#================================================= +# COMMON VARIABLES +#================================================= + +nodejs_version=14 + +YNH_PHP_VERSION="8.0" + +# dependencies used by the app +extra_php_dependencies="php${YNH_PHP_VERSION}-mysql php${YNH_PHP_VERSION}-exif php${YNH_PHP_VERSION}-fileinfo php${YNH_PHP_VERSION}-gettext php${YNH_PHP_VERSION}-json php${YNH_PHP_VERSION}-curl php${YNH_PHP_VERSION}-gd php${YNH_PHP_VERSION}-zip php${YNH_PHP_VERSION}-fileinfo php${YNH_PHP_VERSION}-intl php${YNH_PHP_VERSION}-cli php${YNH_PHP_VERSION}-mbstring php${YNH_PHP_VERSION}-ldap php${YNH_PHP_VERSION}-xml" + +YNH_COMPOSER_VERSION="2.1.5" + +#================================================= +# PERSONAL HELPERS +#================================================= + +#================================================= +# EXPERIMENTAL HELPERS +#================================================= + +#================================================= +# FUTURE OFFICIAL HELPERS +#================================================= + diff --git a/scripts/backup b/scripts/backup new file mode 100644 index 0000000..d32a230 --- /dev/null +++ b/scripts/backup @@ -0,0 +1,63 @@ +#!/bin/bash + +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +source ../settings/scripts/_common.sh +source /usr/share/yunohost/helpers + +#================================================= +# MANAGE SCRIPT FAILURE +#================================================= + +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + +#================================================= +# LOAD SETTINGS +#================================================= +ynh_print_info --message="Loading installation settings..." + +app=$YNH_APP_INSTANCE_NAME + +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +domain=$(ynh_app_setting_get --app=$app --key=domain) +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) + +#================================================= +# DECLARE DATA AND CONF FILES TO BACKUP +#================================================= +ynh_print_info --message="Declaring files to be backed up..." + +#================================================= +# BACKUP THE APP MAIN DIR +#================================================= + +ynh_backup --src_path="$final_path" + +#================================================= +# BACKUP THE NGINX CONFIGURATION +#================================================= + +ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" + +#================================================= +# BACKUP THE PHP-FPM CONFIGURATION +#================================================= + +ynh_backup --src_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" + +#================================================= +# BACKUP THE MYSQL DATABASE +#================================================= +ynh_print_info --message="Backing up the MySQL database..." + +ynh_mysql_dump_db --database="$db_name" > db.sql + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_print_info --message="Backup script completed for MineWeb. (YunoHost will then actually copy those files to the archive)." diff --git a/scripts/change_url b/scripts/change_url new file mode 100644 index 0000000..977f3e9 --- /dev/null +++ b/scripts/change_url @@ -0,0 +1,105 @@ +#!/bin/bash + +#================================================= +# GENERIC STARTING +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +source _common.sh +source /usr/share/yunohost/helpers + +#================================================= +# RETRIEVE ARGUMENTS +#================================================= + +old_domain=$YNH_APP_OLD_DOMAIN +old_path=$YNH_APP_OLD_PATH + +new_domain=$YNH_APP_NEW_DOMAIN +new_path="/" + +app=$YNH_APP_INSTANCE_NAME + +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." --weight=1 + +# Needed for helper "ynh_add_nginx_config" +final_path=$(ynh_app_setting_get --app=$app --key=final_path) + +#================================================= +# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP +#================================================= +ynh_script_progression --message="Backing up MineWeb before changing its URL (may take a while)..." --weight=1 + +# Backup the current version of the app +ynh_backup_before_upgrade +ynh_clean_setup () { + # Remove the new domain config file, the remove script won't do it as it doesn't know yet its location. + ynh_secure_remove --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" + + # restore it if the upgrade fails + ynh_restore_upgradebackup +} +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + +#================================================= +# CHECK WHICH PARTS SHOULD BE CHANGED +#================================================= + +change_domain=0 +if [ "$old_domain" != "$new_domain" ] +then + change_domain=1 +fi + +change_path=0 +if [ "$old_path" != "$new_path" ] +then + change_path=1 +fi + +#================================================= +# MODIFY URL IN NGINX CONF +#================================================= +ynh_script_progression --message="Updating NGINX web server configuration..." --weight=3 + +nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf + +# Change the path in the nginx config file +if [ $change_path -eq 1 ] +then + # Make a backup of the original nginx config file if modified + ynh_backup_if_checksum_is_different --file="$nginx_conf_path" + # Set global variables for nginx helper + domain="$old_domain" + path_url="$new_path" + # Create a dedicated nginx config + ynh_add_nginx_config +fi + +# Change the domain for nginx +if [ $change_domain -eq 1 ] +then + # Delete file checksum for the old conf file location + ynh_delete_file_checksum --file="$nginx_conf_path" + mv $nginx_conf_path /etc/nginx/conf.d/$new_domain.d/$app.conf + # Store file checksum for the new config file location + ynh_store_file_checksum --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" +fi + +#================================================= +# RELOAD NGINX +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 + +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Change of URL completed for $app" --last diff --git a/scripts/install b/scripts/install new file mode 100644 index 0000000..6fcda62 --- /dev/null +++ b/scripts/install @@ -0,0 +1,173 @@ +#!/bin/bash + +#================================================= +# GENERIC START +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +source _common.sh +source /usr/share/yunohost/helpers + +#================================================= +# MANAGE SCRIPT FAILURE +#================================================= + +ynh_clean_setup () { + true +} +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + +#================================================= +# RETRIEVE ARGUMENTS FROM THE MANIFEST +#================================================= + +domain=$YNH_APP_ARG_DOMAIN +path_url="/" +is_public=$YNH_APP_ARG_IS_PUBLIC + +app=$YNH_APP_INSTANCE_NAME + +#================================================= +# CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS +#================================================= +ynh_script_progression --message="Validating installation parameters..." --weight=1 + +final_path=/var/www/$app +test ! -e "$final_path" || ynh_die --message="This path already contains a folder" + +# Register (book) web path +ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url + +#================================================= +# STORE SETTINGS FROM MANIFEST +#================================================= +ynh_script_progression --message="Storing installation settings..." --weight=1 + +ynh_app_setting_set --app=$app --key=domain --value=$domain +ynh_app_setting_set --app=$app --key=path --value=$path_url + +#================================================= +# STANDARD MODIFICATIONS +#================================================= +# CREATE A MYSQL DATABASE +#================================================= +ynh_script_progression --message="Creating a MySQL database..." --weight=2 + +db_name=$(ynh_sanitize_dbid $app) +ynh_app_setting_set --app=$app --key=db_name --value=$db_name +ynh_mysql_setup_db --db_user=$db_name --db_name=$db_name + +#================================================= +# INSTALL DEPENDENCIES +#================================================= +ynh_script_progression --message="Installing dependencies..." --weight=6 + +ynh_install_nodejs --nodejs_version=$nodejs_version + +# Install Yarn +ynh_install_extra_app_dependencies --repo="deb https://dl.yarnpkg.com/debian/ stable main" --package="yarn" --key="https://dl.yarnpkg.com/debian/pubkey.gpg" + +#================================================= +# CREATE DEDICATED USER +#================================================= +ynh_script_progression --message="Configuring system user..." --weight=2 + +# Create a system user +ynh_system_user_create --username=$app --home_dir="$final_path" + +#================================================= +# DOWNLOAD, CHECK AND UNPACK SOURCE +#================================================= +ynh_script_progression --message="Setting up source files..." --weight=7 + +ynh_app_setting_set --app=$app --key=final_path --value=$final_path +# Download, check integrity, uncompress and patch the source from app.src +ynh_setup_source --dest_dir="$final_path" + +#git clone -b 3.5.6 --depth 1 https://github.com/elabftw/elabftw.git $final_path + +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" + +#================================================= +# NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Configuring NGINX web server..." --weight=2 + +# Create a dedicated NGINX config +ynh_add_nginx_config + +#================================================= +# PHP-FPM CONFIGURATION +#================================================= +ynh_script_progression --message="Configuring PHP-FPM..." --weight=2 + +# Create a dedicated PHP-FPM config +ynh_add_fpm_config --package="$extra_php_dependencies" +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) + +#================================================= +# INSTALL AND INITIALIZE COMPOSER +#================================================= +ynh_script_progression --message="Installing Composer..." --weight=10 + +ynh_secure_remove --file="$final_path/composer.lock" +ynh_install_composer + +#================================================= +# INSTALL AND INITIALIZE COMPOSER +#================================================= +ynh_script_progression --message="Installing with Composer..." --weight=30 + +chown -R $app "$final_path/.composer/" +chmod -R 777 $final_path + +pushd "$final_path" + ynh_exec_as $app php$phpversion composer.phar install --prefer-dist --no-progress --no-dev + ynh_script_progression --message="Yarn install..." + npm install brotli + yarn install --pure-lockfile --prod && yarn run buildall && rm -rf node_modules && yarn cache clean + + #yarn install + #yarn buildall + ynh_script_progression --message="Install start..." + #php$phpversion bin/install start +popd + +#================================================= +# GENERIC FINALIZATION +#================================================= +# SECURE FILES AND DIRECTORIES +#================================================= +ynh_script_progression --message="Securing files and directories..." --weight=1 + +mkdir $final_path/{cache,uploads} +chown $app:www-data $final_path/{cache,uploads} +chmod 700 $final_path/{cache,uploads} + +#================================================= +# SETUP SSOWAT +#================================================= +ynh_script_progression --message="Configuring permissions..." --weight=1 + +# Make app public if necessary or protect it +if [ $is_public -eq 1 ] +then + ynh_permission_update --permission="main" --add="visitors" +fi + +#================================================= +# RELOAD NGINX +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 + +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Installation of $app completed" --last diff --git a/scripts/remove b/scripts/remove new file mode 100644 index 0000000..00da59c --- /dev/null +++ b/scripts/remove @@ -0,0 +1,77 @@ +#!/bin/bash + +#================================================= +# GENERIC START +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +source _common.sh +source /usr/share/yunohost/helpers + +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." --weight=3 + +app=$YNH_APP_INSTANCE_NAME + +domain=$(ynh_app_setting_get --app=$app --key=domain) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) +final_path=$(ynh_app_setting_get --app=$app --key=final_path) + +#================================================= +# STOP AND REMOVE SERVICE +#================================================= +ynh_script_progression --message="Stopping and removing the systemd service..." --weight=2 + +# Remove the dedicated systemd config +ynh_remove_systemd_config + +#================================================= +# REMOVE THE MYSQL DATABASE +#================================================= +ynh_script_progression --message="Removing the MySQL database..." --weight=4 + +# Remove a database if it exists, along with the associated user +ynh_mysql_remove_db --db_user=$db_name --db_name=$db_name + +#================================================= +# REMOVE APP MAIN DIR +#================================================= +ynh_script_progression --message="Removing the app main directory..." --weight=4 + +# Remove the app directory securely +ynh_secure_remove --file="$final_path" + +#================================================= +# REMOVE NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Removing NGINX web server configuration..." --weight=1 + +# Remove the dedicated NGINX config +ynh_remove_nginx_config + +#================================================= +# REMOVE PHP-FPM CONFIGURATION +#================================================= +ynh_script_progression --message="Removing PHP-FPM configuration..." --weight=3 + +# Remove the dedicated PHP-FPM config +ynh_remove_fpm_config + +#================================================= +# GENERIC FINALIZATION +#================================================= +# REMOVE DEDICATED USER +#================================================= +ynh_script_progression --message="Removing the dedicated system user..." --weight=1 + +# Delete a system user +ynh_system_user_delete --username=$app + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Removal of $app completed" --last diff --git a/scripts/restore b/scripts/restore new file mode 100644 index 0000000..c958361 --- /dev/null +++ b/scripts/restore @@ -0,0 +1,100 @@ +#!/bin/bash + +#================================================= +# GENERIC START +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +source ../settings/scripts/_common.sh +source /usr/share/yunohost/helpers + +#================================================= +# MANAGE SCRIPT FAILURE +#================================================= + +ynh_abort_if_errors + +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." --weight=1 + +app=$YNH_APP_INSTANCE_NAME + +domain=$(ynh_app_setting_get --app=$app --key=domain) +path_url=$(ynh_app_setting_get --app=$app --key=path) +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) +db_user=$db_name +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) + +#================================================= +# CHECK IF THE APP CAN BE RESTORED +#================================================= +ynh_script_progression --message="Validating restoration parameters..." --weight=1 + +ynh_webpath_available --domain=$domain --path_url=$path_url \ + || ynh_die --message="Path not available: ${domain}${path_url}" +test ! -d $final_path \ + || ynh_die --message="There is already a directory: $final_path " + +#================================================= +# STANDARD RESTORATION STEPS +#================================================= +# RESTORE THE NGINX CONFIGURATION +#================================================= + +ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" + +#================================================= +# RECREATE THE DEDICATED USER +#================================================= +ynh_script_progression --message="Recreating the dedicated system user..." --weight=1 + +# Create the dedicated user (if not existing) +ynh_system_user_create --username=$app --home_dir="$final_path" + +#================================================= +# RESTORE THE APP MAIN DIR +#================================================= +ynh_script_progression --message="Restoring the app main directory..." --weight=4 + +ynh_restore_file --origin_path="$final_path" + +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" + +#================================================= +# RESTORE THE PHP-FPM CONFIGURATION +#================================================= + +ynh_restore_file --origin_path="/etc/php/$phpversion/fpm/pool.d/$app.conf" + +ynh_add_fpm_config --package="$extra_php_dependencies" + +#================================================= +# RESTORE THE MYSQL DATABASE +#================================================= +ynh_script_progression --message="Restoring the MySQL database..." --weight=3 + +db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) +ynh_mysql_setup_db --db_user=$db_user --db_name=$db_name --db_pwd=$db_pwd +ynh_mysql_connect_as --user=$db_user --password=$db_pwd --database=$db_name < ./db.sql + +#================================================= +# GENERIC FINALIZATION +#================================================= +# RELOAD NGINX AND PHP-FPM +#================================================= +ynh_script_progression --message="Reloading NGINX web server and PHP-FPM..." --weight=2 + +ynh_systemd_action --service_name=php$phpversion-fpm --action=reload +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Restoration completed for $app" --last diff --git a/scripts/upgrade b/scripts/upgrade new file mode 100644 index 0000000..2e119ab --- /dev/null +++ b/scripts/upgrade @@ -0,0 +1,134 @@ +#!/bin/bash + +#================================================= +# GENERIC START +#================================================= +# IMPORT GENERIC HELPERS +#================================================= + +source _common.sh +source /usr/share/yunohost/helpers + +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." --weight=1 + +app=$YNH_APP_INSTANCE_NAME + +domain=$(ynh_app_setting_get --app=$app --key=domain) +path_url=$(ynh_app_setting_get --app=$app --key=path) +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +db_name=$(ynh_app_setting_get --app=$app --key=db_name) +db_pwd=$(ynh_app_setting_get --app=$app --key=mysqlpwd) +phpversion=$(ynh_app_setting_get --app=$app --key=phpversion) + +#================================================= +# CHECK VERSION +#================================================= + +upgrade_type=$(ynh_check_app_version_changed) + +#================================================= +# ENSURE DOWNWARD COMPATIBILITY +#================================================= +ynh_script_progression --message="Ensuring downward compatibility..." --weight=2 + +# If final_path doesn't exist, create it +if [ -z "$final_path" ]; then + final_path=/var/www/$app + ynh_app_setting_set --app=$app --key=final_path --value=$final_path +fi + +# If db_name doesn't exist, create it +if [ -z "$db_name" ]; then + db_name=$(ynh_sanitize_dbid --db_name=$app) + ynh_app_setting_set --app=$app --key=db_name --value=$db_name +fi + +# Cleaning legacy permissions +if ynh_legacy_permissions_exists; then + ynh_legacy_permissions_delete_all + + ynh_app_setting_delete --app=$app --key=is_public +fi + +#================================================= +# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP +#================================================= +ynh_script_progression --message="Backing up the app before upgrading (may take a while)..." --weight=7 + +# Backup the current version of the app +ynh_backup_before_upgrade +ynh_clean_setup () { + # restore it if the upgrade fails + ynh_restore_upgradebackup +} +# Exit if an error occurs during the execution of the script +ynh_abort_if_errors + +#================================================= +# CREATE DEDICATED USER +#================================================= +ynh_script_progression --message="Making sure dedicated system user exists..." --weight=1 + +# Create a dedicated user (if not existing) +ynh_system_user_create --username=$app --home_dir="$final_path" + +#================================================= +# STANDARD UPGRADE STEPS +#================================================= +# DOWNLOAD, CHECK AND UNPACK SOURCE +#================================================= + +if [ "$upgrade_type" == "UPGRADE_APP" ] +then + ynh_script_progression --message="Upgrading source files..." --weight=7 + + # Download, check integrity, uncompress and patch the source from app.src + ynh_setup_source --dest_dir="$final_path" +fi + +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" + +#================================================= +# NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=2 + +# Create a dedicated NGINX config +ynh_add_nginx_config + +#================================================= +# PHP-FPM CONFIGURATION +#================================================= +ynh_script_progression --message="Upgrading PHP-FPM configuration..." --weight=2 + +# Create a dedicated PHP-FPM config +ynh_add_fpm_config --package="$extra_php_dependencies" + +#================================================= +# MODIFY A CONFIG FILE +#================================================= + +ynh_add_config --template="../conf/database.php" --destination="$final_path/app/Config/database.php" + +chmod 400 "$final_path/app/Config/database.php" +chown $app "$final_path/app/Config/database.php" + +#================================================= +# GENERIC FINALIZATION +#================================================= +# RELOAD NGINX +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." --weight=2 + +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= + +ynh_script_progression --message="Upgrade of $app completed" --last