control/0000755000076500000240000000000012273411257011544 5ustar lukasstaffcontrol/COPYING0000644000076500000240000010451312273411256012602 0ustar lukasstaff 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 . control/DESCRIPTION0000644000076500000240000000061212273411256013250 0ustar lukasstaffName: Control Version: 2.6.2 Date: 2014-02-02 Author: Lukas Reichlin Maintainer: Lukas Reichlin Title: Control Systems Description: Computer-Aided Control System Design (CACSD) Tools for GNU Octave, based on the proven SLICOT Library Depends: octave (>= 3.6.0) Autoload: yes License: GPLv3+ Url: http://octave.sf.net, http://www.slicot.org control/doc/0000755000076500000240000000000012273411257012311 5ustar lukasstaffcontrol/doc/control.pdf0000644000076500000240000201646312273411257014500 0ustar lukasstaff%PDF-1.5 % 1 0 obj << /Length 587 /Filter /FlateDecode >> stream xmTM@+z&?tBL$d4*.<_fW_wիrc;`GUOV&ʮ[v6W7TvbuYt/N.5=S> stream xmTM@+z&?tBL0d4*.<̿~UfW_uvc;Z̫MfG} I]/ޭmޯo⣩0^'^x]fkn{EK{*ʇupg6;ލ$4;gZ8, M[TPRJGeWxmE7 "/7j;{Yʋ"1tm|oirI ɑc׺>[TқEnn#bBSEV嶭mzsg)gR133w xAb;aGL6K&0+}&"?(Ҧa/ c,!-f3*Ix {asIC%hS7}H=ŤIY(jŧ Z4{SO5Z ekxvKǬ@2a> stream xmSn0+$z"aKU^CvF^p=!94gB˥0pދ s#P~k@hZ+vQڦ(A,Rf5Ħq8>K_X NH3$Ǟ{<0*5c~Pʯ5W42^!0^#rqxƘE3x z)cgl1BҰ?Xq!NAWA*d1)iȧΰО 9璆NVfkVaUJ?%͚5ػbTW=ј52f&p2pjV^cHMcVYxLS7E=1j g endstream endobj 6 0 obj << /Length 321 /Filter /FlateDecode >> stream xڅPN!WpO&hI=4[Z7ݚBqh4\a$Hb%'ߒ<,i`4Oy\"x(ܖO8[C8CMW +]Pҡv5TA =UEU}+wc+Jlh 29J+AEVv_CYutFX˔w!rͶ0b:a,^d+vGĦrq}zX+*P*ޟs9񅕊te`\ҦfimFI>M endstream endobj 14 0 obj << /Length 788 /Filter /FlateDecode >> stream xڍTM0Wp+/|[ժ[ꡪrk{V l3;!m̛7xÏE;v~[4-pfeâ,l\aȲǬKX DMvMyk%RP <]^yFey r`j8.$6B_6B96)¶&|ڟM% j28bq p"]#kr׬oXr3@ ioz;V-,ϳ5bvY΄zj,^8Ev() е.,O8yVtJHmt3$-p՗79N;nN0k}$5ZO ܤnot Wy.6wr ju)he@.!vԞvȕ-PI IUnޝ:wy${0:K5k[3  endstream endobj 20 0 obj << /Length 2921 /Filter /FlateDecode >> stream xڭrܸBUMwd93kS&>dr`nDle_fKǓrJ <<o_@O`ftU^v+|(U0":b[N}}4^T:V[6HjOl\ob@UQ:Ȕ < D  #t\Cz_EyXʶе5E8`m#z 0sEWSTbwnpGWQ `,mlQh֡ұfг=FަMC$%]{D#HBW۱+4:{s}KZS(::s==2pz2M*d`)kp.k0 MmǃZJkO%wS`*Q*^zʭyNZ Ba^1WCH6B)3_X$3G1(⯾NDԶh 3E$8Mp%nj~0LZQ X )?ز,Z RG8i#(Ykom4yîFXCu=A4k2NJTbOr@%aH>NX( pNx~F^~oX2{[ zFCA0{s |Xnώ\sB-40Y\gDktV};,yk F`VdUh)B3+9'=;`WEGAvjR7؋[s] dJKwϽmؒI,nGΎw`QIZOA{XSxH=jh3 eH'g)辂墌CkZBAwfalUCxj_g(hoTkHy$v AHFˆCga%HYyT6=]S]}XdCH4z|t޵Ք4&&@L Z_iӹw-л$Uq>plkC<:ؑ啓q &ˁ\)@Wddd=U ǓD%"}HFrDZJdGy'Kio3Ղ?{%t@g\%޿Ǟeąt;xզ{ZOL~1O*T%zrɦ]O~SEn [=C%=Y 63 :%&3;$XA)UBd>D1Xb\KϸR~A'O\;b$jz|:,[8߿Hש̮*tV>zM|_UT, y=?}kj4CL-B{: f~Pnl^p@N0ۺ- i<Ѭ]Z?6 ~L֞tIavg!j GO[tk]8=CՉCakI,Om\TʂZG$j,º?Kfx>}{;fU~%W1,Q.A!n>? 0K]ѫ?!utN`cL>?j33 endstream endobj 30 0 obj << /Length 1015 /Filter /FlateDecode >> stream xڕV]o6 }Q,ɶ}0Ctq\[%!+)ʮ+6EQ!ydG xDdZ:%^k >`fe?ͶȼvAeOLs>YѾ?ŵ}u}ŠhD[^0.43[EF3S6u˵>W?l"/ e7YGCv ދw.KsDt'?8 ٦B-ct-(׹tXJ?52;~G23b&hg@Qt e2 o+m&(FwpMa[$ʧ2!{"J h;gSvtt4~W{`Z?٦*7M+`e^_~ ׽_%P`':&,*pL`vA0rM.8W/N@N}Y<8qI;ig8r ?#LUkߍo zxLwl_le=d05B|.MotK_LO endstream endobj 80 0 obj << /Length 2090 /Filter /FlateDecode >> stream xMo7:J1&MZh"AV`$5HYi9p""e}H]m#cŒ7Qͻ_/{ݴyˋ(5bTbHqN]jo/@+HT>6!)y>/&ArRj]O¨ݲ}v"x_Cnm(I*uMq5~ivY׮ $V4M4Ѧ}нƓ__[lG#mޛwV]g?~ t sN0KTQ֖(#RJo_n_ߴբRS3CV_6淕УqͧyI C)"Y~ǛWCxhu?a!FI! )C^n2'˹/ \EɤJ{$LhˇB7Ϊ ^EI y|B 2hu $*!aL9A;.@V2|B 2hu $*!cXrX43BIC+CAdapAGGAtvt$1V'3V>:!/&TۣC5Q{ttxyO /ӳ2= v6%@nE@٤j;PDhXt\Zm s+„$k{Pb A)٬;(14q04?4@6)hil ×z[6V"&{gB{d ,zd⹾po,B@|ԮDWƦlY vQtuи1 dPm gDm-0SˌsT>3! 4. &T3C-0# 3d 2ȴ'k\ˢWzTRp-R_,[}muFF?"9'3H% Tca9aVBi3r۔7 U*J)б,z&#$+W޸nw|_Nh漖k+ًE Z{YM`rVȩV5E {> Rt׋C'd i?"KDz9c9'cad`!LtlV~u' k",ݖo@"dxd d'f@ɰTMwk?[m e0'(6f6J& Td(:x5t_ QL1̒C=ɪ( Pm2Dށl;[u#h)8Ѩc9(cG)IaHIU|)P>p|^BhZM /E0"TuLQrjesX>C!42fsJv endstream endobj 144 0 obj << /Length 2443 /Filter /FlateDecode >> stream xMo9>3ͯnrOX`YqPK ˖YjYC1Y'"3H_U~ՈHfdsTWWOpo߼},C]{Ѷ_n ZhLTw?mbRdeVxs]H[oF/~/Wr{W gJ n~ԓK1sڋ}VJO`xL*hL 0OeOGP6):ў*'$Sz1~!UU-V'+Jif5k($#|_`Afl}*{HlR")Y1) %RQoB &o|B &h&M L6 09oVv;Y 3*vbxP`lR!JJ(O~Ez#EA(xP,aC e eY,}?Ά,kܻȭ(8-%`ib8K8hm`iX#5T[ۯs@Ն5.ӥ[*;e Ԋi3Bxh^bʚ30&(0^&0B٤`DjF3Ra:,o֑eW-.1D (DO"IADaH@Ngw3dY;( 1h (hsBIhܻՔݶݵ0㲟cbѠlqo|űlR,Nj9gֈ|;f{LڋB*@^@@(HmGĴHsɊ)DHeL*)8Rhm hV@MM%6QU2}+ĸ"$@٤pAj`:L2I]ٲ|T#! 6+A &R8Q5"p5]HQ8"|B"le"M E6P$%q>oEW=u/l<,{Y(F(HmӋ;ўor?}аIܵz-tK12bmwN~Pm06(& R5VMU=e%/u(8C 8P6)ph?H+XSmۭ&?᎔]n>m쎸)uQ~ @G&WFo$T{͕־7npӵ֋~/e墐Vjh'&B٤@EjTdk 2mҤYmu0Y>F!2&#R0Rzh:=YnbXxa"UfWQP2y~2zgb؍S c*fq.ʩ$oC-&B٤@EjT~;VQPu>rW֐y ( P6)nNWDز|:pء2zg ppITj ĢֹxwP`lR!=?ܺ!8ȶ] >6t|NiRF(| XU1P* €Y Bvlz>HTn+ xPa'xM C6@fXYOHSX˹r|fBl\M 3603 ;~mNwqeVZSPa+dM E'\V>~=P(ZeWǺ௛jݭËXJ2{X_ (QwAE7(lRlx=ߘt`ű0/Ϸ{ܛ,5{e U#(57cqGf iq|B"leڋyFN endstream endobj 9 0 obj << /Type /ObjStm /N 100 /First 840 /Length 2302 /Filter /FlateDecode >> stream xڵZ]|_G&٤!m($I=\pZOpRlf͈ ]UGQ&GVGqGI\$We&(d\Jt )&g` d?rv){⺸+RuCv >#cB7Q33(B5 M[]J JWP;@ 1`5' T0@*b>@&%' NCIH.0&p(\ !Q %98Jb}hb)`^E2ȠV LpSJ0ޘH!P#~ @6c`FUgRET0L%DO7|lR@A\kS(1!nuGpVa #˕ <0R,N5XNa+DjD2gJ5uUwWŦ V"jDԊDMlmlN(dIvd,ybS`9MY#qN8VZٳnnt;w nmon=^gK}=~)NwD3n#Wi^c?wWNN"_>{m%Ħ O5fmoǔ}ʡ2]㾗upzs &7t_կW7׷~z7?}ď?&>E%NSeN/we|) e.G{knO+R+Lrwno|^ϨiD~&|>",= Y,dM-}@ۣ"+ =WGX|7wo}24&A$}R0]V|:z?^s͕>޿=i ooNOP}S4Jn+eR*yʼ)%z(N<%ֆ?RfFq>2[H)X=KQt(SW4cgBxȴR…X s N=K4NƆ/TY.m9=.3ҮBaA|3DکJHsVKm968 NLB)9rb]wB_wB>K$N*{Sy |rM6/mB6GУMfYF8iye<>c.ь7?C hƣoVihljfY8ov9r2R21͚-͢-o()xiƛ%G{^ohV(],?i*Nhx>uS $)e[NZRbhR_WTay1]C:k%sJtJcd9m9U|}.733cI{oKi`}r!'PIMΈQ:ϢMks'VF-K)=-l\Ѩ N\S=$,g)y<(iSpΕiƺڈv1j+0NvpQγq:Ql0R̳)'>VhDqsIUr'uAN SQ;OZMF3-'*zBrD lpP}^(XQr{ޛ)p3 wʦ¯<K,1T Y5aqYi}I|FYp?-J 5—bs)r"m?RO9×5ZWz4hǎ`W4㊵7Z3h S(#9-|Z9ޜEõpko}DAG8qLI{Մv< OeQDXyl'zнFy0~U | endstream endobj 215 0 obj << /Length 2493 /Filter /FlateDecode >> stream xMo7:3&mڢ@Q AdG>\iӦݵ1Zi&@؊4>\ΐffό 3ټf/^]uo1JڰL1M.V?xuB)"S׿Dty/! w]^1/j3__^ .m/hu0 SN||/~`\Ǚ6DRKЦ>|ep@#?y8rR%]qH{hyI#;i)wG)XX}Ő +tٗg_;ox-՞ 09e daaL<´Ҋ9dW)a0NɁ 01C s""LC7+!7qj*q*'&Fj{~$TD~fH+bߞ*Ym]mUNO -,MM=G7X=ѓ(d:i{RpHR_KB f2R: O t*|RpHRR F'=c--VG޽ph3[}OÈ2 /& 7AN^aޮvwK)ar%VsZIy|?@dcp0um H{z-",~Lڲ OV> ؀ Ɂ v0ɦKS=IU!Z=VLP4Noa6ڞ"ˈ4aj?/' j5]aX+g(FF.&!T3-<2$O~V 26vS!T941 tIh@69Р3a;t,rQˡrȹy&`iJKGIrBYXc=zW- W9=11&IsW2N—btSy\|yNMEe9Lq?@㯓0ۍ'nh"-C;~9 b$3:6;  }&*|.Dķx߶83&P9!1N޹f )FJ(¹TJ)0JUuWM%DBͶdhs%ެN)0JUMrQfCHtr0*|gö=MON+]tؤ _G8QT,unx଩ӓ*F7_hVM'7e'⽹E0T*@8$ `M4ci~ CJN!0HSMM$pBUԿ n:c`@dfH撓F{SiWxܯ6c-ݼq]Wۻ}%\' [-.lA8? H{zX< bћ#qAT >:_16B"lrA=9r|7v ^/=8 3N91M^PAh> stream x]s6+t)]' j&Nnًn/u5#S$I}A ifaa2y#} ͨf5Z-=~ϫ 掻^#_\]<{ԌQba_aa7("QHYq/ 1ɲzqWRjzմ (zv={(јVDi38ƪ$8IeI}Pc0~Wם Lޱ*j-MFCGi Ro/Η'U%+RKOqc?k'}A&D0{#ο&l=;@6)H)AG;nKM+Ȫl@ه,U`=[== zPmOOW 龽CĈ$=쳦I.H "g|B "dmlR B=DT*DAz5ŏ ?1 0 bIh]ҢT9wf\5Sۅק?wG,~92}>H_5t7҈`6 kOÕcbXlgׇݲU7S25K(D Ro@ ҁ@6) PAh&2t `qVʇ%`E`٤j{X'-|a cJbt1*g0*5*@6)Tڞ fx*$b.l+aҳ=wc8[`@"lRA=8Tٗ8 s{"~?r?&Xy(ZdB (QT+SR (٬d̹̈$[yI<ԆTT<ܨUWuhvhHB?W)?B|BBhSM !'T= d⥟~^5sK>!4%&T<]-qX6 c?68b|8`|@"|lR@=&X Mn?{QVz;`@"lR@A=(&P7/]hyb 1QQ0IA(0Ate|L®5ta%BDH%L@) @ ST2$u+O)0 @6) ڎk{4 a0~U,uM6 Bq2`6 dڞZat c0}hk"9/Dθ?ᝓF IalT`A`4w/6q04?4@6)hj¯5^_||a<}OeuK`^3QFEIH{d7+L˳^elZk>BY& B:d#( %UY\d⭑o3?t b~MQmg~mĂLUA:_p{Wd@|?0_0uExշNȼ8Uey"Љ PmA%c@ 2Ap6!@nD@٤0~4n"$ qfY~z( DuV"8g@dxf}l&ņ#D[Y˛Gk]"et _rX } IAPIP=2sJ7| Sy_d 0dod@6)Ƞn: |wC'TKC(`olt@l=:u\+Fn>IE!(.6u M @hGn!Y4Ͽʾ ?Gu7x)}& (qaLk5/O;tcD:`DBW"DlRD=-~1nF4-xҊBJP]I mk2.7ͺǣ͑Rw0:EIttG 0}ʺi{h@y9V1Xa 0XcMO`6)ƉSE?lwxZvE|&B hL M #GSL~NhW뷧 R_ -7?~Y_o7Y_7M=LO9ha/?}:2?9=9ѯ$VT93ܷ{=NiWz#W~1,[2< Xܔ G W endstream endobj 167 0 obj << /Type /ObjStm /N 100 /First 907 /Length 2158 /Filter /FlateDecode >> stream xZMϯѾpX_d QK Z:( 0" {vr8f#⫪&T)'I'OqI-^-Qų55 in Ԋ`zGwK8sÒU ,윸 vI,=&ꖤL&$Sś"=$F]/I*:%i jp똜fפϩ[R.ÎG<_>~xw?[ݹO?Sz]RP+aoD`x _]LL)\̹2Zu uOCy>Cy}C^ׇ>!y}yB.-G+hhh}C]}8o>݇N.[ZľXY۬>xl0֋bطgIǿݽKԾp6ؓQ.dar'Y'aT+L֬M,0r%`VvZ70}f3KLnqTz4]UL+)%_VzfbRϸ;L迮[IErnI ZY0KrxOl-) i^o[Ife"دcNr #f-NxSV^V4H\Ŭ xk ~/+vu 1'm=!竓lE*~$D#ftgL p!՞Es&3pINz^6hJB/wiC藴#xĄoԶNBbu-O5}N_`VV +&~HeCLd9^ȯ_)munP6M⨴WN|5`|a㺞I``)f˜tuRQႀYtQ-Eھ,&TvDWVno2DH5ςi C `*Ìw$`2Pn}'t]D._vńG @B¡G*3$P1+^hWD\ JaO(e/'YߟR%{<::::::66ؐc#mC y6ِgC yuȫC^W:!yf}VFX#WvƔȤlT,B'v g;MB77¿ re/7 dn4ܬI6tCrR*"5tcT,m_L Zo'Io1as*4ob3Xۓd{1ãf%x|]yͦ/bG_'2B똳8%<: _LE:7ja0q8/Y*7J ׶Dn/$w[t#!?'qHm? '}pNfYcoTrӝ!LBVm 6 YȂS3f=UI2DxOA ѷ¬ 6"Y8+)_iu*jCaZIa0l彧ae_}70fS+" bWw}^#67dkW *4 ҢFL~|rїiD}ꯟ[~s闭 endstream endobj 307 0 obj << /Type /ObjStm /N 100 /First 836 /Length 897 /Filter /FlateDecode >> stream xڍMkH+]!$ X"KF3Hʰ[3ےC(멯jL C$bga8 F(F@9Db6n`YKnq,'@ l"+z9&Ql}GE|%qy #  zq"y[N\$`%d{CyKނ)'#G|L|A{ " _ / 9l\ ]d`ؘP/B=%z2l%%C)Ke+yʘ%Ȯ}D9{P736]F3B62{|D+s^r`[ R3FhpFE0أ \HǍ@!h]p#}Eua;aݞ`삾d@8gm\X 3&eB8 j hc8@&8 q(Q8=P̂AktXw*vAxCr ~E¨fw6??tmcOwtc?ЧO/}_WMisyK3Wj׈QvX '}vbt3ۖnzмo.g<[y!t讚*_꺝+;s7[׀_t^c@BR AJ^uqeߏ)gm _ qڱv Wv0xzZ1^oV) u)Bm۶y@º\|EYs-o5T]v+^~>T5vPƩrD= {mՏUza<n4e@g A~v‚EfZEv/S58/!vʯdӻjj endstream endobj 458 0 obj << /Type /ObjStm /N 100 /First 835 /Length 918 /Filter /FlateDecode >> stream xڍTnF+(Ğ` $'#Fc.Ԋ+ NJ*^}}wiYr<1U$PMN!癬`VO(y,BMl+cM5.8b|.x2ušX&#LD|d4o ^dT.FD6"OiB}B ELS$+qgΎ HOP+9ѳ%B>'l%!01GoЛ@Ѡ')ZhOL#5uw)!;8{t54uNAv}6T*\ !,V`z M 9: ƃM* l" ZFTSoⲁrj:+0U=ㄞ1/B젮`bةEj g A VsILk2رƠ#{6`<Eo4S¡/ݒqTo's<{2 {W]7c6|vrxCN/2 婝)/mSS]]q80MּM3ܷZ7yݯCӝa7]./wcWhӭS1y^ Ǽ a7x#~TǮٵ};,ԃR jԍc97_oLcͽJ3:m&έ~i)ٲV  jq^^}7jsn{3 /<˄թ>-D%/6>2*/si5SAz>o#q*{֟&?M, endstream endobj 609 0 obj << /Type /ObjStm /N 100 /First 839 /Length 901 /Filter /FlateDecode >> stream xڍMoH <(Zl(q/5Nʒ!)ǯߗ[ԅTH|||PF*)pI>XrSpXE8 b58bAxq!d. q[&#Hk-֡fZU:[Ȇ%YAr%Nȉ*NK= yE^{GU3;cqFuB8!!('ǟh}9S݂h4)EOdJhI!:J! sQ^qI|Ց4+bnB13K衔n"6 ccuk )8nEWX+ae![LQQjfŴa('up_n!En! 1(Y^Kؓ P>iubQT&pHPOw.ĩI{X`]q(O xjFFbx*z 8&ShVǗūWtn{ׯo7un+]ovSwq:$ZEwn!~DžthfTKh.ׄ-]vQ >] yAnz?sOkMPMCKn}{vːO endstream endobj 812 0 obj << /Length 3133 /Filter /FlateDecode >> stream x˒`ɼIXJ"W(VtX2I=3 \$A>2V+hzFj=E Nzy?+5b8殏f6z}7mQ'Ba/(/vR""xD&SNq/<{*$l:}>1\W o auh ]P@?>u1}h bvOVNm]$B*M@0nQ##ch^WKr%cO Js'j``!*}] z Xɤe MhBbEτ@9lK%5أ9:dOӠq [@g]Byhop&pper, .oXW5VPv*e[z7Jgr[DwUvE$6UuALeN$\PROGy09tg {PsL],ot)˵K%<<fAp D*6}3;=w2J%zD@gm .>sJtbXAŠk-.wJ \ڧo._&OrFKe_Pd +Ljـ5]'fKOr]u2~nGF|m WU ݸ:Nz3>? |:7CS,r\{ Tg)_N|~SkHRm;<7@p7/v#;Q1>ĐE s:``6K(r_p3US3ބ\nICNd&p&&R?.riL6U8<yd/¹1D38]C)jBUx %!inؤÇ&B8Uͯl^/ͯw2DQ?XSլZW1>s1|]'Ty(p_ Fepg*i\e醸4ن>mpeewlù{3ߎ)X'\M+:&o)̊uӎ@}!סۣ:_7w\8l$X Ls~ZǴYc0@;3]WA -/Ed '63ïXmy[]\ΙCmEW"Z 5p~|g@ɂg8'>YхOy@z@ݏp endstream endobj 819 0 obj << /Length 3182 /Filter /FlateDecode >> stream xڽr6-T!wrPbYqlʩl!'|X~gD9\nHO,B? ӳr"nsƃ߮^([j͋_ +>扃{qLJÿzq 9|2 ǒKh<HH83+$Y4T h zTK,O=HJ3J!cw3,SynZN@WWt0T>Lȸ{[9Š`:h<;|Er9!4TX0>|4ǥ]kV[cpi$H;XM׵rmTmuS䜧o)y)xqLͤaENo}.n鄺[ A:l##iZZTsc_-U0+r_'QѴHOGJ͋D&R4lK~+S#}"cbpLx O_Y,B3^U:!|DxYvDպÿ->@Ȁ|\up б뗴)O+$S|s'DsYdqq<!-:׆ΘWP ׅdn65jC2pq&_T<8[ϜbK(vFMmK! 5eAqz/F\K%R^*u9&T/;]N;BR#n6o T#;Rq1$,q$/2%2b(:d. Ī{3ˬ#30Bki`^rO ͢Z+Vᱯɢ@o/e?ɗ9ȫemDV > vAt񸍧DZ(AWV$]v+'%\K\ ?k󸖞p$cHhV:#hyW&egG8G]s/4zu1׶ڙE+pyjrچY[I;e3jm:HAM[i4,|6-ʻ꫃N{~O!QVgPwCi)']igL_ML$8] 4V8 .(~C4N@3JqŅA=Xp K[\_siʚ(OI)ܓ Yu[P?'Gĕu﷖!XTf]5P Xd+oAj=5{ /r+'07ʓ `\Qij1؍m ~C%E2V0t$@_VHq-8Nft0 ŝ,@;|$XBy,%l9ZW׏H38ؤQԤqKlob &isI)bNokq陖!4qAP*POpBjL4-#秡}aKUvl:6 TY3\R\ZyOܧq%@ *9z irXQjiq-lm/d{N2m!lp:8B|ƞ_/ 2@]Ec3)DyRӊ<.6R[ܪsyF?/f"*( endstream endobj 822 0 obj << /Length 1714 /Filter /FlateDecode >> stream xYK6WfX%Jzh(MQk]RE%^rffYL8ɸ/o?A.x 7oфINge1{zл1;Zt|x(Fƴm8cJrd#P.wu.6Guw =Jc瘌4Z|GQ uhӇ5!wbɇ}we4ڢ1E&QnZ&ZLvLgx^VXOueZ6uc/us:+ݎ& ws-u ˨./#PF2b)epTW}ν]ԕԕ`]]熺go6oz_9;*;ܷ@WPo]5,sVS{jҨn> stream xYK4-NÖMbR\v$ʌI@VK~$&QŁVGj}BN%K^l'6 |BP G|2f&@F}Eq|w9 DAŧM0ñkCŌ%)4;}Пi, j`cIvԺHgh/ fTHTYQ׏F8#٣ff 61Bգ)Ќuݡb@XM6|ْuVw_KZOVnLWpd/дGׁ٣5P0EO1S"1$5Oo*kOΓ1W}5RC5~'\R Bi4?vP("ͫפ[QC490.+Kf8j5e@e%NJ.K6Ǽ ٧|M4 )dGvPEũ1DzGN N#cĻ|m 9۴esBd#tl:6!X4 ٦x6i%q_a\(8XG! {g}`QD!2f^]EQw7]a`^oOpƺCf-?6Cx! 71ƈ1$О;JTPAX帛ٺ LDџgp;Adx$vtDxHE:o~ϥ/̽i( ҎuˋOFO 歂%UK7>a^"WdɊnGyԖP]{.oE?b zfz/&/Rk 7G3HP짡Tm` L,zgWd gwoAg.xx$<7@+uk6l>Cjüa Φ.:;YCDX* WM4mwG}nRM/y$|Dǧf6-dGߖGtOtˣ c:qu+(pT$e?!}%_pA[R?-mf[RO2=xKRvz d'J@z~_쏇Kq^"ײ'4$u;AiޒV_善l7bWjb%B4քp sߋp*r8J5]b iK-PzUfŧev1^vV;oȘ=jUPSTյ^C.MQ" ۶L{q> WBh zUck|R}Oꑇ0GwXK7!. endstream endobj 830 0 obj << /Length 1749 /Filter /FlateDecode >> stream xXo6,c+>DI%[/i2%O(YrǺa@c |x݃GY?>,%e46Gf#| -^ X$|\Y-W umM𥔞8YJۼ4[Cr!"fj/Fҧ)X^\xz J>S:PX3OY*Rf[G@⚅R\n|kf~™!ICND0@h9-xIϲ #& 1q F ΋~^<'PRXUYޘ-DZEK="8t :ʵҪnNfbʬͫFӹ rs[w}n+j]etx=D $ wz@`F=^I-RC/+# uwe5YͪCt(yզ5~k# Wl*C< Z},@@HvRiT'n(6H@*K߮E@Z*dع`h-5 ի)UA!~iśE,sP7ya.ijHvx]=0AOy}'Fi=-Ɗ @p1'X$N| c>ʹ:)q43$18j#<|(5cS*$Q])mnX/!ʈ>ǢH_&mQOyYekgjWᡍ׵}g쎦klmWcJ۔MP:`2 a"zK8KX>"zߢ+.ϦFIͦKATI)h?tdx!{D? +ygkj nc\<@nX:q 㑕MނR1hqVH@fe0BkՃ!|WmvEJD pq#lѧ#t8}9@ *LjM1#Q+O<0b6t'(š9rfV2;֩S>oAŘo :!?xn\eC3CNzttWlB95LO ex#V;{wN,m ^x8#]d-@ wCrSr#9 +J5ٰt2%WQC_oE1mwkNx$z[NjyIu›#ٻ4 {\b~KQɽ2mx kZZOSC0IL@}e48hɑ"A iـfZ|S%RLr4<(:AzUK;+TKWQޮ5^Al#6 $8jd}*-sڝoJ 6k՚}[Wz0"IJ0 g)oi5!,3G?R"}]MU%Nr^%Fɒb1>mz4H= 뇋z!E#g/v_d"QyZ#|DO4M½(oNלH{ AE܌1YIbF/r:nj2LR&{4[ui g"e1OJsWh!50+p=v3:-Kzp'SȍװG*( Z;qL 0qr  57m }&&܈)|=u+\.B'Xp w Ꞡq endstream endobj 834 0 obj << /Length 1854 /Filter /FlateDecode >> stream xYK62PK=iSl@c䠕]Rm!zZd/ {X83ߐ "d0$"v_o۷67߾rA}1]lã6֌ELz/C՚s{*s{ŊEއ^RUo%y/7?m:$D ~$cq8Q@hgRH˲d2$P7 gvܚWKp֡qA0ٙp4FL ,;2QqBh72Jrz;UU ȋ{ucM ŚF0`PIj4;8FE'rC~ca.o #7ɚPX!2n5,Ves87uդF !έ!Q50iY'M4NP 'u%v+mXHjY:٠;xexjÝX[j+/E2.u8r;7H3WA=?;0=nD^IuگCwE{Z QqZD/oCr7hhZ#>.YK`^[Y+}s3᩵.=ܙP3+L_`U%ur2>.,6%f`"(j9BH-LkgnPZ-f>8WvZˀsq\1A$]W{My.|\Jb)h{‘mGInw+:;|K L#@'Y|Z<~ l0<+>БWxn'so~$7sg xG i/BEgSAS]pƚdCq7@WS.3j+/䁒&ڒJj5UKWe0`lyؿև$=FEV n[9}=&qiC"$Og H8BM)m,Ű/\:w1vZ0;0̊#hUvV'rlNĺ*{SA ; ZVdLX|d&'Z{`B3Z$V ZQ+pVh%ʩa?,=#S $,{cS8e0v ~s%0hp0bg~dնJKaFMuƼC Rpx>cjH Yku&> stream xڭWKo8WXj.""f1zIsPl9jK%ek;䐲(S,|p8o(H6G uO07iGoWJ% Mh욚-Fcd*d*΋,Yΐp=MTxQVMVU=vzS vY 1ٟ)$@ CnI`Qi-A!-\,QEz b{W :7* Q1twxODB]Z:\Es]q&:)n V^gYutMmiEѩNl& c[ެ 5DU);c&vD)s$ )G"#HK5${?p7xcfXώvVϧ=hק?~fP0**zc2O_9ϒJb` 8,sPai) NҖP0ӏ3t(Utb^EnH,t[b ,4R=5&N[81'Nܞ$'~K]6!ƄсxًXKͼ.T+Pҁw@ j{ed,u~\ꋗzv~>4a^{*!˲)jZe0xەл ߿4P[A.d~إ< $z* {YB99m9}ȅ#XH۫QS|ݡF#R4X+1B{h(=uȩ$\4So1?ah endstream endobj 840 0 obj << /Length 1890 /Filter /FlateDecode >> stream xYYG~Wc 7\mB<4v{w {z.8!ABHLOuꫳġ|YKhZh/[rѓ q%~gPj3{ŋwzטjRzR)H -My47{],D_T۷~/A^mLV/ެ~}|)JiI},V!2?PdӫE,}nҲ ̼A\s@KAOHL eqy I~OPe3 -))! ># qwFq2[rxr dwX)SHUk>(H8JQ˱19b2QtWS(/ BoSb03BG+P2qݣtd]6ͦEmvycA4c&A{u7(S: `$!2zѸ2'phZlAM"L[]<>7n)J$=comQt򈹆8=k$M)7?BEӣ*ScĽ%b};FEZ"o5wkB߼yN '55sJev_y3M znL6Ŧ;bg;ђjZl{oBA4ǢfP 1v.0niҿLNM J}yJLBѕ6xK-(=(GoW.USp Rqo!e88Rܹrs}V6ttmӫG \ kQ$gtڔEh=3K{퓲R{Aw@zn<|̋0eDoA@ZE")߬p2 <9$@-i?]LiŹi'aegX#d#'ER> stream xVKo@Wp3(aдuZJ)R Hv]vPy|3,O:`HYnF=8zm6"FΗht!M8Trݯx[&;gt%͒E&ѳOGCɃwi,W-j<rBw-ϣP@Hv8i8$ . #ʗeLɭnPc9kT: Ce#3RQꍶюvqVUVʖegz5.YmҜV<"jw #+= կ,L.L ugeUyUe]J~K >̑"J7 @}473>v_FMek5 <AC:7PZ#~3DM~*Ǜc=1bKAXVm,~ωa.dNͬ}L ]_%  ڂ!zeQ,ia&&3uy}&ɧ< d.ݿܻjIV6U w-]za ds@T=YXDZ׊H`)] :LWUrG;-fv`N GY endstream endobj 848 0 obj << /Length 1366 /Filter /FlateDecode >> stream xXo6_aI"NX`/ !Cߺ>+%A%CulytnD}w':IࡓMҌ,f ~z=gg_J9 щrl1yd3ƙ.Vnfs#b !EnNDbU9eYn*edt_-._-򵝾rlN2I'SUt_LOH"t{9V/VdBAo X{.%7p$ Ri,QX*=SB($ Mnz}9x-mQxe &-%s2[ʈ2"%I~:#$RH"VU;$Q&߅SQ j(x0?c|b8ủf$cIh elp13S =OBiJS^!=Αc}.5(@(̼&t/d *[$jW9,U݆~8V,5NB%䒙;zNĮ},4>؀s=lP5i7l `8ήT55.8}Kl]{Z7y^1>;ӃÈ@@}*bN;pƈq qs.Pw'`vxt6c}6T6i*9=CF>LI'z⭷lC$I;f\Ffw"L恼v7s,N^CHu>|XO@on 낃j: Ad鐹:P>gys jk^X6΂\4e$aEvC*! lۼj׵KƧzw;EGGTȬ8 o]gYz/cN屚P?P9.hTtPu0Z(Dqap],ZEZGAX>H.?ԲAP # endstream endobj 851 0 obj << /Length 2076 /Filter /FlateDecode >> stream xZo6bOŊK*9pERPve[V2$mrp\?ÙAb+L*X*jzE;?.^|FYg|uq5gu[[tEk&Ri6Qbֻy~9Q]_ci֜o./Q(xd6,J2'2MR 4jFNJXI&NUdp$N#dC՗n<:lzi*h7T/󦬊K@8gRvhD="3R!6Ha)1?D?9잃I6I!>p<ܠ{_s {LfjXG%rBx 1!O:fFx88/!5DP cdi6NiP/vy'5rM G`| B||~>,.'D'X&Έݳ#mc-Y>燾}ͫ#\iYd ,,9o}5!'1K2yʰ;ݑi\2D[獙oڢ?5-c7I ZH Dž`rJj'XPJxdnȻ 㓙Bjh`a-˝StRJfa&=]1<{QSgp2zk8nԀB˚{qdRު{kFXʯ9qvSkwh'?nOu4_j֭Eop}T}."=jӎo}r2Qj/Odp2[>͡Y2mOرP%20XǾ;\VQ]e9VIN |O*&+ZH(G*'{Ngv;Rej=/bA5T=[/]㬇>]AӐ=F=M CTw} |7Gشr*MXsJ/033Hl*mY&4v|kg O'4 $xM{M#S 5X@%T@R|j*R`h?/C+(Gp} 1##ةŽr!cvGA×hxv\=+> stream xnF=_!%`N87`EC>I)< v>nc>Gw+*̅` 1۰i a:lh캲 ӷ;P3GX% ;$ ߣ,VͮY S]+qĮ϶(+cli7 4(o>ث#b8BB>f8sB]U}R\[\qxQ/66.Ta-OS9 KvF.a2/Wkv]<@% 󻍅t =[ W A|'|0֝ JL xd2܄q2y"oBMH@s@_D߁?n.fgo5o?Cz@(|nw=w⥫S&Nۮ)}nu͑y8=Y_mvw}Us8 endstream endobj 858 0 obj << /Length 1862 /Filter /FlateDecode >> stream xZo6 _qU}ْ X׵C}p|;peK#%tI6[bYh䏤6S| Zb ~t1=y$3FWCVly,wX$zYcey5xXuT_=?$HxB))nK} %2<%4NfA<9#=UΔՙj™iw I uCN,d>f4)L|3޿g7IHĔj)ߩ|T#H)d$L_gjVj}s "6; ffVx[.MVdTGOw ؗÎr80}I$TvPxʪqu)|>Tw MW^UH:P6c2B$OF"؜Pbb BӶwjT)@ˈxqHt'ORR3q} pOhNƎVVu=J+#ּFk'WΙ]3H?8 V9о0MʀDj~~Fetvz G@5:.o2@w.m  -aV.H!;ɄӲ؁^NvEoJw2НrDQM-%8ۑ֣ )Ɋ(/25L0?F!_{M! N='7|\j/="z-p2"um؁=v>jƔ؜Ey7g:=΅ߊ V0n>g˼^klf>`|]͓4vEnޘ[1a͑hcmʈT]3h2"eGQ|22DnWBDp~szy^զ@jJƭ7=l.+P/BA64}EV6hG6eG>E]Kjt]w5$}Ȁ'l@t$FKt8Z {$X\/HsNvUh-rJU#$ C@ âFaPw֙ t`AOuo QG)i"bV1(wPyJkhƒ+M6w:y7(W#O`.1I?ɭ $(IIȾlo'ީO0-@(//2ѥoC5":DLRƶq/"^U4pMEAcw5!8=A6 Pdvp+/v-|b ܘ/qsu@hj xAp{\q QAwꀄշ$;Scʼnœ]!Μ0)y+B)֤T?dgM3ޤrlR_˞/fWOuh, /h ;XFڈZD]b%*@;mi# 8pw zGW~5W% endstream endobj 861 0 obj << /Length 1108 /Filter /FlateDecode >> stream xX[oF~ϯb*U6mT]i/&1*/aҪ"p8o2GfTP,Yf/rFZ 3Q#2[\]-{p?DʻXk+?`y{?\xoJ{Kun׹wQ> [OWuVqϋ ΎDYV[!J`Seaj!Y <}3:qĸq9Cĺޏ{1Y@CDX|P,)gH&hysM̀{|ːcxIe,T`(5z"! ir#0uBԠDdK*=!"ȉՔ1Y{SHPSyS+}W3!ÃzI"!ء HQ|RNU5rS#I*W#Eͦj zVv`aaJ!3[N:сV-* 'x‹sEmT56HI"0FWzc&FeH*Mn';,9T[Kܥ M!f)0d'"#^qv s{J!z:jhi@o׶( U;!r{WJQZ:>`uM}ork?Tt$Afd"ER.nFD`7_ƋiUM?qTM qIᝮʠN-sٶf{=?awY:T9\x]O]$'dSCਲ਼ٓ7LQZj퐷 /Zn]u)[ D}<]i4$vT# M=D@Ma.g :xHi{1=##WnF`#7Gw摢[q[0c|.NNima8%X̲z[#mrIK+^7/o DuI澈%ko[ m endstream endobj 865 0 obj << /Length 1822 /Filter /FlateDecode >> stream xYKo8W{X"EiWY-xmD'ږG!YThEXhdj4qf8ߌg3Nf<QY> j0`#烠?<_| ( <[,wnQ0 =ܧyoʹO\E,U]Z {?.@'28gKn HxpR1\$a7YxE]T"71Q񰂡 SjvCPZ-2iS0meIMd}M l2ww6eA[u_dŇS0.ijA%0F8O0cֿ.=`aDj,$ *jsB7n?Bc0srDUewcʵJNWCZzAi؜OYU\J@itS/ aRo1Lv[2gZ; J-T.\QfSmU& ԊM䤛(D1JDʸ܍%.-Lz[~+W7H(Pqy6]ctkK.CRk%5I *HmTI]F!~٣uP)Q7_,]a {woC[X==eQ7;=V c(yֈ5Z@C,)tYMj2ަY6>ţ玥'Îs %"iKjV|3ޔ.{öǐL?ymߥv\oxA:@ڟ 9'{ɸO:/݋Hq$3afzoaDZ -q4*͞ro}APn#Ai0Hr uTAԩ9FIAoU)?NӿLTꕴmJL>SeMh7+Q.ܩn$x'q,REZНoW*mՊ=U~{xg$;E'&xiq:Cw c%L -'Ao5m%YIMϷiBRs5>n܈! .SYYɚ hg9$I7>e{@b]쩊GStaxp@=--ġ$JO..Цb@FEU~-*W;;3[Tpy{$,.y9zR QbhF ҹhPF"nT{ge)SRb}~l %w>Ȝ yW@\Z~ ^FҼxi&ondhpgR.,vbU Csw7f>*7 /٥\kd[5~2r% aᧉ܂܀ftNb ?iG#ˀ[۫q$1Qhdb4V endstream endobj 868 0 obj << /Length 966 /Filter /FlateDecode >> stream xڕVߏH ~߿GʔPkӝtWiM&#`@HH[EJ؟Ϟ(rV2+h{mwp R0L67ooxƊftE_cnTe\RXKRtOUWǦNz}}i%_x~;؊Ie[iEIYs73"g@$㚌\& 'zK::8&_a|l_u{ ]:s69C3%Ex=$ۆ Loq8=ƒCSH.ozBl&d;# ,I-Dy_H`Tú9 葪B =TZbO9QÀmi fE)L(QVxHؠi.Mٹh*eA`}@Wz `m Jy#jCk(U*Lv3ii:z*!VCsZ@>T+?R}ӹ7(3sLeu9 >/E)g  =͟"H@$I;P`A9TfKt~ZW&|2*C͑~˖ʎee.v$qD\!6gkž1\ e1ʴQ~0z4҂8awwlG/[wu 9feR';).3L]eI{M7_ ϊwO#S!s&=_ᕫz[{  /7=͵ЬD6 endstream endobj 871 0 obj << /Length 1884 /Filter /FlateDecode >> stream xZ[o6~ϯ0X& "Cm-'Blɓݯ9$uMdžb)Z-::w.DN6IRNRLfH3j1|qy):\E]'_ouӐsgPQMC|"(, `۬*|Uxd.{-$D ~;!Jb-֔Si"QSM! )1C$HYLlz Ys #GeE< J1#iʃM2,G# '%~yI̳t847="\֫Gc$q,"-Sf5܋''%#9lx{3?(w0Eb5~߹]egHPIWuYQ1F^^RERֿ|"#C+/Ƒ4|EymڛWMkKiq()() IR|E/#26Z4G;(&ǧ04qHJd/3$mliX5ڼ:EP-<2x %,*tF|D#OHfGKēwǶg !J%L2ɇ(M94Wd2ɏ7gEk7*&wp r4 Yb(?y^p"'rPL&Gxsb#""() {MaH&CD?NbPk>x,F[|Z kSJ\7ft^%\ieQLT飕t3j6˹cxch1UuW yGVh8ԧ페g"/t{-Z4jT,_.¬4zWcA.|Vie#Y3ϧ=;^ڕ)Sŭvu B&і5M{Yxj ꡑn$=Qpr t[ϵrGcwa3 ցW_߮L! ꈮѸ}eԂӵV10Vh\c<[##8+|ZcQqU3hMpn ^_˶w%W@[Ve80.tb;mlHbIa%hLpt#.6_wҎ1(o7* fק$%%I`\G(æw%Zlg^lFGhtPG0fֵ-bԶ,<_A . ܭL+KOһ2(ri"!q\K/wħLK'S~}x:] GDcL^0=~GEÜj{&x<)N8`8w\훱+ʵW~$F$V[f-tk-TpPqc5bV;SUu[EUaնolVE~d0Hd~~MhE?ێ',p[?5?f 67 '#od0T[QiɕiA{3Vb+> stream xXo6_aI#Ik1#C  o/m(l %ϒx;M]O ݏ}f l@iAPꊚ|`t] w׷i:`d4cx:x1=y_ c!(IDZGb"I]UŤ-~|G򔤉rGwv[K4gE1-?f쏡`n\KeUVsWVrR4`Q={mmꕓc"ԝfװ .iG('aayJnk`^xQ.&C(Xv`hփ%H2D% Rf_(gt] 2T./@KLN  +dWSPVN'1JLkVJMkun6_}غ9 ԎY[I^;QPT8Ȝ:]ݬ^!{\ec?08-G_^ uSC{ahc8'Ӕ 5n D]N櫐R(yûXFҽ0^Cox_eɼۘgEvX4ʛf*A;d<0j)x.T!0K٫MDMS>,VG-mj&#vr3uA5VVkrbn m)[0^b7I]ya HpWʣ>%$sqh+GG\"]zcߝ|*<~EPM $K1K+[`3NOQ>!5l嬟zvto?Д'1رU>>u,[2IMX9f2B!I$ d[s +GQ\w;߃W H!Z пky,!":+c8nBeH} z9uBӄ( lxjb:m,>Z_H-= 3Z&I=Lak?Ԇb&:G)C1%J5B+KT`I p DA!=7eUk&7ΗPh6y*k/W>U)\%+z#Q8Mj.o'm0S]WwW]^ع5o@|•zVT~Ӷ!s"SһΡ63*Z8\*fphpyjDgq2!vMPW l@b ^|Fa{Ѵ' (v}!4DB!IR#fs!槲 Tב{]how{0ڹ< v34NGFs=!'}‚S'ePXrKdK((%R)K=byK=B=3'>q0FF?puoMB]M`617@GF& M#fC^dyo(`d_)&,5l<9+B|ߎϰKϧϖMK]НB4zyq^$G"/|(I FR7_ endstream endobj 878 0 obj << /Length 1061 /Filter /FlateDecode >> stream xWo6~_GI)hmEU<+:41 1<^d?}@՜U6W:N4䮘D-]c,ل.{ngFz]Uuc7~:A eDJf2 י0z^]Ԏ ޼[ Bh,4-AW4(Ufrʏv~DaX.C lQ> stream xWo6~_G)Э:,Xj+0l;L4A!M}"3 dL LW7_gfX F(]r)8N G> c<q9xFˢ,z+-ժXeƟ\,Hpv&ty!%‚[k}nv!m5Q d7X2í8[#zX4:KC(oCr{h| ji&k3,TXֱЀ g"}uUGQJOQo_XzHrG j@T_pgT8vf};&KQ8sB&2J?Q 1..D`.TJ2D2{xFTmy7yUX0]\?ԸSu^IܔUHa0 ` ɵq<3G!)1]b2E{!43-!T Q0TD1Z[^+DqB"8^dy[B/UTE,C_i ۑR7IP[d-ՄB4&@a79 2CpX"¤N~*xm Eb?Pbu!Ž뽝LƟ?! tΚhI(qx; G{ʁ_^ЎpГrNNf^VA-<Kd8:/ǾAǞ9j$#H`uF!頑Hf4r WlbHf?W$-_'I#kXݞp]wm%&|rY eL<)YKGs+ᦗIP^=5j|,E'6i<-jܿ X<աۢN51<&t-tԤ8>0/*LR9 endstream endobj 884 0 obj << /Length 1036 /Filter /FlateDecode >> stream xWMo8WV Y$Hm-PAWVP,:ks<yCN`&d&rb_AG2cvF 0Z&1l1K~)wI"QӔH,YUg:ynM][P\Cz?pn6P\Q%řsz N+LIKa(,L%O<%K.\:4X6҂ 7Q02ܿY0L? z:n&G&Qyȝ$),HVhzq bԜsΐEP{$q[ M{lw]]u#'i*L`nW',{\WH&i*9m76Bj5QS5-E <ٶT@y]MQ&Ei&Ey`je-lt[%pNԮRI)E; c%&ͽæY2&-AL3*UXxYxc4wBmcʝ*b^;_/p3pIȎE +b4 kTicɺ[ [/ebkrmrk6*rRp}t5ϊlTOAW1fo<y%r]Y'CGT!]ENDb{k1x-ըA˕Kf4eYStRZ fWGH|'voX2},N.ɐl:"ZRHlMr2"pYlL=nëϞe?7AtdnVZ>ڷtQH{G쟋q~!0+e[F :Nk'νe- Ωl`$^d"gq_{^8Uax%t2)q7qUiRP_ug>/d 9 endstream endobj 887 0 obj << /Length 1723 /Filter /FlateDecode >> stream xYmo6_|T,v( P9jK$#r$,P PQ#yf lb$$L36t1篔0JR|1M#Χ1WIF+i,i,a:Ί%~&ˁl2o'ߟoP\%=ol@dC8SkBYOcM0/Q!I!5HtpuׄY(]scc +ԓK2_M+ \'1*=ŵyٌXB4SkLe0&zTcI_Ҙ- x dgq4F&Z"(6Ɔ.!CwEnr0#YevZ.nM'WYהl 2C8.]R&$~ gJR͵%RlTyc=mOL"1?|v1z`)#ƞ.n 83-; H}$Cμ1{IFǏxO c|̕$q?Zl`pSwgzw`EɪvDAl o9x9!VE`V=] FM?eږr5;k@jug<%T@-]oIEox=qc|EU~EVjٗڮO,oYuQn2W ?q]UaYGi<~ DB p8^1^1 MPJ+3j 3hvaǞY]±f/`(s#qNI*Y,`Jue2zVqJL?AN^/Kv\Aչv?h(kj݈0aP8SPD>Oe)/zG[ˬ* ˬv+÷8g\]6Ӻ> eQwou;*+,?InȲ[/Z+Zleٕs瑺"w?;sC';VO^}\ƶPs'Ayi ';~ߣ-lƁrkW9 U`ZMkiT /KM|t0քd}dMQ-s.lP u1Ilz!rV<+WEB$ׅ?-EH _7,SS_, \ endstream endobj 891 0 obj << /Length 2155 /Filter /FlateDecode >> stream x]۶ݿB59"7َgq{7i̓J8H A9v~} ξ8iF$~bw!H,dJQJb{fp7O yK8AYf:.߷YƔHe3ƣ˘hJ Pmi|s' pgBn{%e,eM3H :&OeJCnr,J!b18Ca8=ȳg’H,10JxauG6b)JI]$!vF8DL8!UIJ :JOS)r=Bx8&:SXbD(tΗ`SoD8ţ9{R43ˢN5XQeh{]{o>5r:wz U;e alX^)C Wv!#*z ңD6m8J3rbJS08WpԼ]ry1pũ[B7:X єy `b7I3eDoZl(?8dL@6'etd,vfZ 6[Gy=&2ju-Z+W Y]KGtk%+;%QPdtBC˺W9?1&rMGcF?1}­A!whZ߻7`  R ٺ&vLL5A`tLJݷ75 b{O:FNGL&/ + VW紟6Xuy>ts,$"o^@W슪_W G%tŗmSKב/maLvs rLpo1!!Om("M~I)m+&K\Y9՝K19~K3X<Ҹ72'B`Q8g^^Զ:>zvG#hgHf6% 4l1@mnvw7_ #~SPHȟ |(6nU:/9!2Sk6ntgZn@̬s6dRr]W*tpHHT͍HQaCq\AMwz'Lk@|3m&1Y6evNgsF?{C֞SÃIE/^b}̝Rz[?nNuZRuXosDbCێ)n2aGԺ`V> ܐi-㮨s{z8(_s;*v+3 I/IiT񯪩Wdj 8 bϣ qQ3˽njne5'l9qz&ڦx7Kym\A(r?=R2C\@twQM‚25f8?f"Zo%~*A @ȸd!,IG8űAedպG+lebiGQ.ӕևc endstream endobj 760 0 obj << /Type /ObjStm /N 100 /First 839 /Length 1365 /Filter /FlateDecode >> stream xݘnFs܈{"$p )'AںA!K#T%]j>}d[ZML  ٙo}"E1hK6{\E%RD@4*ѐƶ-阊=ephYg2N}@6!Ȏ)jFEL `_d!%9 {R d=З9J.-^+\-y Y[*Q0Xk W1E%`V,֐3@e0l1W8x Q"VQbEa DPlC{l1l na@! qY)KNKR%T0MxjPe؛@Zu2p0#&}s$P0ʓD#R 0>r0+A!B@!dDccI 9E^if7Ed Hp#KPC}1hQ\G.t)`#+{F܃MI0ryQpRuX %!:f pxl:w㲪G|CmC3zCzZc3w_\,OYumZl1q]5ns|{fz{9fM}q-EZtMkH}zɫU}6;DFfYTq{bӗ\is֢|ryUWx.l"IU/0hYOZW>EyEYUOA?.j,IXԫj:?i.D&|#AqP@S hSq%gt"3T/Ar>p)vH9Bt Gcc6c.Jח7(x{)'FHZA/Kޜm3ySut^ώ|[]tte)~ wCw4`[o@rUp2y֙!Yt|a;_[LY1>}vxw}U|%`R[ 7 f k{NE^E -۳@ ׈Z#o ~9ν CÛߠ>u& 7x7̯zD;x;`zȋLJ( GB^<~h-ާC^.W?u'OPbҭWEiU֩>Xl-VȆDNQ fyڭ@m~;~cםW>}- FM #w18 E+7ܯrc"fƼr/H CQġ= $-V"%f( {(쇢ߴm{ }ѥ~${ FRYe:ֽѿ'H endstream endobj 898 0 obj << /Length 1504 /Filter /FlateDecode >> stream xZKo8W(oI6M76^dIȖGߡHɒ^٦EP <dQ2`̏p_Qv*Ĉ`ሌ&}Vʣ|S>^V1Os<Л̼"N,-4)7?>L: $8mK 9C%"a *ϴ݉Iݐ\,4_x׋Y~ 3K\FިNm\g| JJ^Zؠ/o!C+uUZ~rh9hҶIϪȳ,f )|; }q,->s@n7u 6eWfwyVs8I]*k&_L 081 &1L5=Ț1h8Qh#pm }A8 PHRoB /Qf}YYq (Qk%iO{rĸ͑KP(0K}!),AHzb\\L\Y}u:W/ 4S7#BP$rHyt Җ b}tCv5# 1 ᨢ'g " NKhc8vHʠ^JyQϯإQ 'wWh2 $_D:?Gבd7@m;YA"}\j8(%HŢWqD~n;rዝ!etj ?SZ>.!1y /:o~ݹ@h@%*>,&)K䋙W2\W1< /3N28.] 5eeK4EVY[)iijAVS/ wUŬ,ME'%jO<;&ު+#mlczUER׹UOZu3]B *wrk%xkY*ETWEhczsMع˺Pse}1Pd2)emB,j٭0ۖXwaEDʡ/wWAd# ۖE\LkL#xaәc~Z 3.zfn7jlv 6vQ}^hQ@?h;?ZOIoX堡019֓А)bbn'AA6ªsU5SݡcҤu^~۠ff> t US3f)Dwͺ`Fy/V&gd?q? X{Cq%p|>4zgp dy(CJi7z8}Hn:`J6}3A]uicfxwi1Eq?Uuoeԭ v zg/ǭ=kq놤*\,/0; endstream endobj 901 0 obj << /Length 1673 /Filter /FlateDecode >> stream xYI6W(#R$E P)h}́Z-$gC|-hƳi | -o"^$d8Yd(zqg7)&74GI"ng$B\P,qz9Ѣ 2j~Yv_6f-ں5Y] Aa uz0d 4_G/IqP"` /ᑖ4$oUMktw*ti=v {G@3)JMno1mu0ɨ͐֓&\ʻƽmT(W\q C3 %$NO"#ipH B`On{OOCRM msJh8av|spol:bApÔNhZF"TU:>2C>Nr\GNHWqPn,׫=_hu@/48W,"pB P`a[`mn}zX?$9YaGB@k {aa@s2vM$m۶e1_-jwp:{t׺C6nC089Vt휈,vE(_/-J{p 12{'Gd)?nͫݩ}ǿq.؛>ݾ#O"?µҰΘyq"ШRO-n9k$xPƎV?}ı%%ǹt^9LXcppר;{,aj\o^ijkߣPjs[ܩ7h@>T]GX6=~gjkp؅3:/~ endstream endobj 906 0 obj << /Length 1657 /Filter /FlateDecode >> stream xZo6~_I@ŊIIm.EחL;df_HْDNCgxr'< d'Jx/Nj5ك?ޜ`'`В|1>yQx4UO~@XlEQyPJ%N(uĤ2WۓW Fb4:m#9mCN81$ZؓW:lڟЀ}l#FJRoYj{(Q}I!QZMKX6dzH v93k)iq(Vb^VR_.pG;&.ޝ<[_^ϖS{0~Or]k~ƈ98QLiF S+m~6냖5c #Gq:nNFzJܓ*(r.Yg}q %!r]M\c0NsaDkyHqVhT*%Ug&2IN aqk?2ײ\Ze!X0F)c|!kPGE i xm\<Co~Yg"B7:յӄQԛAPjJS%u!.TWB_Bv6SrbXrܘxg7>볂SyN.\ jrƅs8$P{,+:B~{vBC1$"!b KsuO o'n^iBT^|٪LGm<ńu ѡCc#!n  c֑y!*+){6p O} ?ӮO'A2w_  Ίyw CApHtLR!7[‡!c!_B-;0KA4eGBr{#dp (fi]9yfHI{)ꟿ쥙ǪimcqWB}{~B==/Ĕ`^L*NѰVڞ=ɁpSWLQn6訑@5G]* P]me&ZQ@l $Son7> stream xX[o6~ϯU,X[Zo/]dNʒ!Iw(Jq bvsH ?2Qt&tbfNbB0Xl95[L>DgWښz3"ts.74*Zs7N376I#gm*+oCCDjDXp-"54˪^_:SL.Ρ 0D ٺMƦ捩yI_u7V-{$lrWoR[Gڈ/MyӌUqxgW&?oOɄ MZe[Ol?_DUMibL#]+,[Ȅc-&5;L3=)gn"J #*I"viTOe%\v~,@{f/y1p5rqI[8#L!u4Hx-KRI/:Kq/ |:/|t1z X+cKYϼG$" dk1z(Jm4!I$A J"!KPIQ{Ї-8$F")U?;A i-F{q_˗Aaik%nKx0{RC lܚU6>eQ0 R@:8@*4 J ɾЅBQHiu9f,tbUfv$}:?(rʋNi}q؃S[aAކʉ4A 鵧ϱH|=2rpOʸ4ͯp4YZu Cqꞛe)*Z`Ekđ/6+CohL\oa-/Dur;@<%Ml~t b OD"{EwS {wyŸR` U}[[=2˯q)gQjآABTD]L~ ъ; ! KMfmOǝ;{z^.A $ ;QxMz'ױ~&t J!jywa= ^gј7秄w7]0ǩ?65͗6w[Bl C mD=×~}<xWn-틙jПhs;HϾeL PU@,=!kwj* D}=}U;¦w_16HClTױYD-bAaɬ< E 㯓++ez޿Rvksaݵi#Ƥͦ6+S:fpWmbiwa"aa S譚 endstream endobj 913 0 obj << /Length 2175 /Filter /FlateDecode >> stream xZo_P~/,ąᢧ\i(E$k7AVHpf73Ix"D*MdVN~B {7.9Q'>& jTɶIiH) ğ!c,Pkܧ]*YYV7ٲ.~x~) GmU}@XO"PęUvIVݥ}z,OB#BRh"P,2%FER C%չOb "PldRH$ vb8vQԐ5u[h|Q',BƖnn $!xR0 "KC $y<(q1DBKrE>[şY- ɟPr`C-aѣb(&_(:ܮ- x(51ӊBz +=[UP(G PKq\Р8x8xّs!;K\N vҜO5.*1V~ax; eGQNjS=ݙ8%Y 2@A RD},|xaVH lG DnWl ![̿p@&SW0F.99 {qԡFvewCcqy 'r4Dqp}wQא`ԖJޚ=BpJէGt{9 ;[iު gYЬSG*+Cm޻A=֜w8LΣvz󔬝> BF#EANچL>Uiָ];;yy60ϊwtj2Ok(cv)Ժ0өT݆N}w{Uf3B( xFwyc~q }are0nM8xN\waR5i"fݑ+rظ?wՏ endstream endobj 916 0 obj << /Length 1870 /Filter /FlateDecode >> stream xYo6_7@Ċva݆oiTNȒ'M~wBGrk)gcrg\.W7UB8ዅy[-\?rV4i󬁏2OWߞH_23EN"!Cɀn<[k$C } gRž%ܠ1* t7X.%g޴ s_9Rر{h+DNVU}c0blJXs[W@MU+Z.2h67jnb4[oQqI s82}}G*OۢjG#XҐx@RmMh.1tßvk1yC픛BTj(c1c]5xLq(1>LɸĐӲMW%AUCq'Y$sĎ^BN89s!($Ґl;?m9@%{UڕYkyd%R#bIe` P2 G!̹uOzcGcxGrO}F|>2?JLz'0˜ qmv\ YF*ߜ2IKF x%-y9.YSL1W I *pO{YDE%NTgsZwL)6amTM׋Caxu0B4MyfxBZ9cq!Y#NL8@WUhnqۋ΅BF* ˋת%e@"#=U^AAqUb,7im" 1 yݞa0ǃ[ۡEP(oC3(BvիŠ >3JF{ &sP@McS~EjI]GHۋ':E(iTXl9t\+!41 Id%nʮ: +8?qy"*.0l[bi"s Akvhp &|[ )d^1>rrMӢkKڐxUm`C{!5P:i^ҒQf3A{qe;/UM<+ƁcKe*eشHS)HйSۓ;s fhMERg%Dc>@|MВf-KVe" /hD Z ™~Ǚ9x r >IIx6Z!|H>(%ށ P 8-Zr@o]Wv`C5mi]kU7!Ӡ}`VE'ȲC\ G޼ /WLbԶ@(jd.Z$:d;@:^q'S/h߼9O [^6pХx( 2+v+MYڨf,䱵4$rʪt +uJU(Ӄǚp-6ѵ|ܤ`tja^w8jmݖmc>IA zgeBtAZ) wWޞ}C |PҼ}lTKcj?V;AG2}O$Q*]t'gJn/ˎm^<KCDh= 8*g> stream xڵYYo8~_` \Di~{z a2yPd"K%_U,r` )X,OBO8QdT'YhgqGՄ,*b%4͂WwfR(O ,ZW4D&/lhח>{s9őԏEΦ"H2HXG$iY¯q>Eo+p*ǜjE]4q}fzCKߵiZX" .4 ~Yi87t~^ I}_7 PWTo`_M*LSU Rrkdc`5+奡qb~8sz5(.c\N;G0?o)xS)`(doH,VRMf@5 N󯦚W3s3q3{gpN)%xwZ^֒8hjf+u8¨g!7wÞ|cX=WER6@[t rb Sv ַPJ[љnWSV1GMf[m]@.>G^3S% {pvDP OCygʯY2L3kdKgT>aB-0s[/:/li |.;poi0 e8(.5쮬~,h >: kYNuy٥Ng\5~e[C $/k/C`^XޅK/;>#(b?!u4F,>F;u ۓ٬wk |p/v ; qhfԮ]^8n[+Ӭ;x0У邞`OEY5s”O-A=CoJSg~QmSvw[_hp."J Ɏ 5|Rc^$#?j,*msرs1K0AvǠ5}OAwOA]g(X uX k 3>Wc\Ο\h I)57(A(OwuxoC2v›xA֙G=(fطYc99fOry;*D&u 4;C &UH;P 1A=! M=t˅qNtf_  FhFI}N3N^f;@ҁqGH! <'T]d2+ >7tk$d"%|Me:^ShAg^>M}w/0f$ kj+Tm+gzl2oj;5 ӎ90"rHscLƉBFߘ,rςn8#X5}qœ${r+#.}KaI`,]hiU1l}vY)W*rOT^S5o.>"X͜yP]Ô*,oQMd`U:nh@L/]w }1qY$nz-`pHU=T endstream endobj 925 0 obj << /Length 964 /Filter /FlateDecode >> stream xVM6Б*F!P 阀,Hΐ"*E Eქp͛!YÏ%',hY>]HW,e<]=2a9%:n%y}EA4BW]qMA oܸw9]ª$K^^=-$Tpg{5`֔3)f\N3 `QJB($+*Z2 螜\4cĤ4a%y*7U:- 2u`yv}(0F+)}l!pӳ"Tƥ`\[_̗XIK^"-.:XAd dm~ Rzә1ΨL|r;&0_쾘ZAز_leghȒt ڴma[JqN/^ld2|éc08.AӲZzzmˆUH*#i3?˾?4լ?S]UW m6MmPz"zkhlR8R Nn,āT}٧q^&:Iۅ ' 8l[0 =OcM#˭b3ndr>:YӺCA`\r߃nh\kqRHWU1n+xuWM.2~.EZJId>@Tܷ3>!r`{뀯PCE̱`0ߺƍ[\ G^`Td 9y8/pi1Z 9\")]YSqCtgR5yAi춈yE~9U%%dK|25B$h7{0S3O8\l&{)|SkD(GG[ey ir>n pszqi!,Xdt 5 endstream endobj 928 0 obj << /Length 1153 /Filter /FlateDecode >> stream xXoF~_Rذ!RڸRUj_3lYv[w#VRtٙff p I SR*,Y|xhPGT :NPeQSK;|1d/⦯qdl;dCR {t0DYse>COɧf""}j n4c> stream x[Ks6W&h&D7i$3oIKl(R%&ίiR,9Rݨ@X.u(dHE GLˋ-#o@t(]]\ 5]]wY]FoϋxUb0Ptp.U4n|'{)ӛ2)'<Ԉ/~j *lOe;+Иc%m4;#&%:-UbsrrP%[}|1ΦU-=OR3#B4B'K]Y\c](BOc1zD".'27"1 Dopoں &h XJC|9Bɰ ]!WvߑMjx1%h~ ٱ6d X|F5Ta!5&iLa)vx dJ;6pk>h7?eB!٣RR E1`y'{C?=^8Z<)Bet$t=PsȞ.O VНg(tD+LUKo/#0 6ʳf(nYi%#1y/'^]&,$uymsMkVʉzi R͐qt= > T-߁jwQׯ33*XḥWM09rZa;]Kސ(?-,7]kQ~=A㈶˼kfR<$7P svI?({lm2*/3I4zN)#7Y⩙U5@U3Nw!fPrt5^@6:-\+ X Þ/{MM0̯7=n0mxfZz+ݵCUgex0iWvӷ`+W6LV-"k\0l8uff̛k3ógfn̚eFAvns;ϪX*M a#OnK02 -\' D2N=k3n+d->Z+HU$ 6󘳡вÉv Ys=U-$5]L2+AE]>i^ؽE<%F]_ev/Aw zSAhӶПMt!O%LcPû9pTNȤ=uk;d:&L-N <3r0qZO~G$K$N}L>2+/ dCja}Sԋp)ڕua|>\VjG6>N5xIg##xoS/qzic۳nz,w\0&=Sw(@ ܽFG{}`;Wç{d#dS?+!wy"Ks(H5F(EɍxPisK_J5*`PwD3ؿYWkkdu|bO5?,Exz9זݮs}`fl/7m+>sH|Mqc"R. endstream endobj 934 0 obj << /Length 2320 /Filter /FlateDecode >> stream xZKsFW&hWW8ƩSV5p0{z"!쮋38g<-/mx!]_1LpT]NY]-Ϯ/Bi4O׫lE &*9|[{|]] +ۢpË4hu=T$b"2bhR噘ER| _t[S}Kע*"+i)Z,n yI˺93B+5)DwtiӁ@AG(^7#Q~Uo%܀,ˉ*d|fhj.ta-]Yؖ%.bR%>" pxeV}l|k69hbDD-oA]8`#Ǯk`UU[D [I-(Q[Mr@B9NA9*"ᵅA0;0L EpVUM3!>p?SBN7eQ߄hػ< F(PkRudf jYU[9\mn;]/6+`Ϋ Uڙ^Wh^.MvAbp )cPBz*7!ukK gw("oXH 9@H. eM_&R">kK{U:zC.5>и Fl/2=[Drx!0j?[Md=ܮ+Y)d@;*m'E1A0P? e}8}P)z@JX"~ĸV9'XŜ ;C4uq>bR9h-k,_UWTz )ҚάLb^kKG8yy@H9NpU)m.-ǿ^?~Qkl𩥹f 3pm6I8 J5wmI!ͶlspDOƹF 5]UZg2f00бHuf[- eat0X1$G (3AfpÐ=콾L!iM%bQ4X2V"21 4‡ GG'|A>fTcbө/C,JB}eZ2:fI)5 'Hqe8B5l~wXaGDВi7GIEq~726a/?} ɌQGmфzvɣ]~CL]C NܣL?Îz66oJc._jhM'ysӡt\8]ڢ+2{Jއvku8yx)=۷fƮjLNo_ddA"!w]AY!ԑ;Or \4zgqIHp it5`o+O]%etYԔ {{ KRvs 5ʽ|S(`YT1dO}bLY5>a= +|&XRdw /l{7}y%ǣLȟ^+֦oE ܫh qzΡ`;u/^*1[Pcu2m p4s̒Ћ>$`Byʔ|Ԭm8$kl ) cfHqӾҜz]LHQHwK_G:*# wV/]2x 37vhڷch { endstream endobj 937 0 obj << /Length 1644 /Filter /FlateDecode >> stream xZݓ6"o`$fPR`]ة;vP)7YZowe3AfBR$-37xt1Gs> R³b5{v141c2F91$>FLzaHEƑd}jݾh_yVG;^,%V4A 'R{H|jj13 [v &r? ~}#Źq JȠFFeiB0JԀSz fj¡4'zⓢ4>>1U$ateR5,dN@@PU= "fo2ċ_Xg!7Z*.֭hC1R s9|SW>Y O)',b.` c8Vӿ@ KDOqb3ʸrŤwSLz]_͇n9aPBpb^19 t8]GMg-fX{&=.aŗ;.-Deu1Q2 ύbҏ:w0U]|6u"IyjbpqP VoMs6\];euDgzն6ݔWhVyb*j7߼slc(S9hz4ZҷgihPaQm]+DD܈(₍C!!CI$<>nب+v _tH)]eQKN?N9 $.*`xȣ cIzmelpUg6Sj_U8zcE{Qe ʪVe*L X9::+@̊\ k&3svE w*v|`o_{؃GUj]vJ[gewe춼POh̙ t GM5bcIˣMU38ìRoXv|>7> stream xYM64mAt}Kr`lZ,v;)Yrm yo8d):SS*Fۙ+0LFOW_=bFR9-oP5brP };kECE¹@bkwVjA.ڢ]]xrAPg[9f\>h*q*:jIQkEp%sp\ 5LRg~W+[ԕOiQ@ǤGH܃#NX FoR rpF(᳄0LĿ,>| zG1T#zGpsv9.c= )$ " ޕcX• J|\i/19U!z/%l,VRgCp.rSq7Eh KqS!FML;& :.U] f)O@'~r X C5gPH|$։d= 0uv B/?x>!*쨆WP5 'P] H&Q}3`pAA-j5•ynSr1bӚ-dJ}UG7[&u[2Uwː݄K!4G,Ʈ)*7ך:2́qaeƘ $8fHLggcBS+". 2:n.)qqTN{ S^ٺqڑ]o} z׹&RN:[?wUI 7kВuJ}^0>NtZ֡JWN_F3݆ݕs({]-R^\i[]:4PFݪ ծt]/aoaݞOO'=][XCuFB?w~E ncJX{P T F^\b'J_ %@U t֏cQr>bۗ{gUB|P%ĸWkZ endstream endobj 944 0 obj << /Length 1655 /Filter /FlateDecode >> stream xZ[6~_1o1R-V xg"2ɐdXǗLna9>>YLL)J-Gm3oG $} 'H% NǪNٳUt3)7yʢFjqi>z_ee[PBxDG # 1]Yo:(1ot5`+`,<[c82N)C b&*$Dh%&Q (n4, BGmGaQ^avאguH& %'g_oY z#$Vd7ɝ`͑uMS8:wufNh!]auR,A8'r?|DXPHK#SS' bNy5Gu~fcɼ?E,u\T6լi{_ OO>p*Oc)atZ6?>٘摕 .qH;O@:ʭn}AQB"%<)E1w3^Uwn%%('ATs/Ŷ,֥E] 8ԤxZoMtS5r!\j@`D"U{Ct4crhbY .օ)*uP$F A˔3$nB6~ ţ㬚&ڬ U|ҍ攁dhj`l2d'd:@^R>h5r ^XYo%@1{S I1 JF"^d6\fz&Meo> ^,uY7& 4Z87Nܔۺ,r7hPE{*Nl Yg%5[ mv==:h69tqݔP֡Q6RgHˊ RNĶΛlLm t~ajUt\{Sj٭lRa0zn ^Khr''% roNaa~g)0B>Y~5^|Spm0]Gv+Ĕ˶2q8 _ U]W._mӟ X@Hī W~J 貿[kze Ak hA P0NA>_L8շsZ 74}Et$CLH19?Xkb95%ZG^,&gfe^eO)"Y,YgdY'YgzK=Yn7`>_G{u[.[ab ]]v2D}|]_g> endstream endobj 947 0 obj << /Length 1863 /Filter /FlateDecode >> stream xYYoF~#XɥM.ݾ8FA+KEp}gRrARo52K$E&euv=s/:n'^r>1J.WcV*r xm:(=/c˹Q^޻*+j΢uVBϯ/>yq9#g?Kp<@1g~هR mI4"exњ{§umsJ8C"=]ad2P%1,f BP,>G܉ $"ʭBo{e0&"q(+us8,!݀ɨ(W@],oR:n}-tit2*LJ(<$DR)$g 76* a٘Mػӕm슦v^v 1;=/kȄ9I_أ1<aW}C%di@B$nzD&8&H``LQ],T0 gԺw=DXz껅AʼnyvA!CYRAa0b<$4(٠SU81v}r^ lĂ  #jGìx;'&b_Wl=7d`ZGlܽlN&HDQw<0,u}^[[$bnQapO i.$D}l8ޙѥi 16&k b3gmZ)sWro?|rvzvj?V _y.\Jv ]Ǔq` gQ\gUXQ$iA=(&FQJxA52_y64ʱb!A-u Nה_VP|n|T6^ -Ieu·;^9"o`ѹ߫tӷmlg~I$s-6ۍ.3U#G MtݏuW퉹ϋlfF*I-ԫvWhTeYڳ=.ZlQCGm!'W ˦v/Lummp$zV}}Ks՝g0 t[]yiv$"â, lV*~ZM=wio7$tjv*#5p}AiΪ΀r黐z,x FQR0uʰ5F./ǶC :VWG+bm>zƌF`FwNG @c \{lH5a'>xUBtۜKuӹjY1SIeʶe& ,kaFr_V޻92T+P7!KQs8OꯛLo@/l6ƸOCȵE(_1d֭R1˿F/e` .'\]]dz "V3 mqrvq[/B)7heyT^媟ܺN4faS8>hcs;7ζʱk>*mzPЦac6M!F oV.2?ݕ;P~5-)PHkebʯ4N> stream xڭVko0ίd]?IR֖VLNjihFA<6XwMg'@"=soB_,y좫qo-jpBɕ%8%) ;*B0=2_bT.r9& {fO:B3&CFԇVG= Lb)?ޣ۶tNژHaިn&ȏ(TRPj %FH5{Zb IJ$ng9$X8hE*,$M6E o̳:JX#%jIu5$DLg_f 1*`^[a;+Vu*z6ָ5͌N6NbmHL30  hb[\9 G wo;Gmo*-P?Ha?~ {;Vy6;?fLlb,MK\vb6<"϶vrt/:(!`w:ם&~f+-х8).ktK|Qu3拚QͲUE /9&Q48ッ™J -9,gzǨǝ4 8HfW^*aW endstream endobj 954 0 obj << /Length 1710 /Filter /FlateDecode >> stream xYKo6W֢ŗ(!}q&Em ]!Zi#i8E{gHJ+8N(bDr 92EKgTIl>lه?~9n_J9I.Ƭ٫@Dqd*t }4yƒFjqm~YQTYyٯ? H&wT=N0 &V#}?t\;=<E AZ<ڮGT*O,JG;;xr_8վD7'v5V ;L%f|^8 `c_ )āB8紐,>tYIExA09\ٳփx^s6 x0T–Ɔ=mAF7D &PEh2 D.45tLH0&l0i}/Z6s?ޗ~L $Q!H,(-.q] EHaL:jmuV#G79 Nژڢ+.nΒe@rTݵIJQF.bf\J M]HbTbi֧NJ/0$IS9uբ+(JR)3dޔd׸0ArD1' DNP2:@]G>>1c5n<$ fe/c!/|vO- %)"2e|΋ᜊfšoyvץ>^2"#}~qT"KyLW~G[gK#,SFm٬`sc.~38~JO-{s.'b7i쾠&WO Խ#h :K3S*k:Z_b_n썳j51umjG6[&k۵PTSD,.q^WP$[i;U8MSXf:֨ʆ~i#FEO*)#"ڏXJbUd@sLoM!^ ~iVҠFڢZ:,*`0,wH==9}i XB"Lk •ώ/7XCHK^tucG8p$%T)G$U|?N& Uug%9(E:B6pEV.e22*DB76I 1Aԭ}ͪ>8,،yGD'4xRv,x{|De+f:]`Zk}n@@RhmZ\1.1VlUKU\t1,6ۡE7MT5콗#\4D>ktvmM23b( 6|9r0=PπϯM433I2t{^T=@xVqB,`fCSm]i{(Cv@YIg*ef/ȝo%h1tݔ>q vˊS(-ҔO9vW[#':XpҪ趹vYSj٭ƛ$`ڞ-[.U~|r0=.c6Hۯ`, ؝&71w萳V~0ڊ^77wۢr?BrXJ endstream endobj 957 0 obj << /Length 2435 /Filter /FlateDecode >> stream xZ[o~ϯPL Jr}Hݦ"K64PBRE{ϙ^FYNEs|2]$G)['OĬOxO>rA'9]\^I]obvsΣe,/3^׫;|%5ۢguQuegLF.]##I" XOuAPl`)HaYωZR^r}ܗ]̑P}dѾ^ez^V#\Jspl-nSwׅ(ьdlNe,` gxC1foCS1Hp'4= ђ a~ /eYH>,K"03kueWrK}2!*XM|:~2&'GK-UسU'3rz19䊃)ei->dQsmgm,8y&`}8Y"VU0FE_ZVw8C"|JWՔfR:nK*4ߐR 6?[$F*3R/?j['*c*[6lp6KH2nB 0L&'Jŧ %Fr!]k -pt EV$c@:?`a&>:(4.i3=6ұ13VSyphNhTMFH 8ճ4]SkjwSCh|>Ȣu@UB~'7ZYxvV Bd,{{`z(HM漷 6G/,.tmL+ھszgἧO1jb1CQ3Qޛ4!^ʩ$d ^nMYcHTQ$sZ ~#S峯^]Ԧ y#0\l;Pu͏!L2ĵ@]P7M0tmx1XAf HlS vJXPKA&e8äPD}L674J%*xFr$pElvnKi^#z]]~ӁHR7͈DE}k67W-~efdxr/ZLqTVt0N_UyMpP 5B;6@ RĉeƭSB~ey|!.]` s~Ȕ[*53/N@)9Gwu&e 'wtbMG iD{W aygIq/ |S5SHVQfD&|ر,5˲õ `9`r/bn||MzgFE\ĂfεƠ I#A`ԵA1a8. 7p} 6;gx FlK~# Ry_: 9'3;Mh-(mӺ!m ф-GՅsus;PUD`ޫ 4z}U1uġ^06{(uaB2Uͼ;nSw7uX$Y szК6B=xUC'l=s >s )H>^f e$20PE!&mLa}C&8 h);j_b([kס}(<1%A}xCbjj 0|?%| {e:V>VtN.P2o&С1 C4/3`^gTAiWciwgfZgz 8Ñ,_jh𵵹kucm'd2AA *Π(? endstream endobj 962 0 obj << /Length 2202 /Filter /FlateDecode >> stream xYKoϯ`_lrqdZ8R[&̇q`Vu5)RVv@E> gFL,Y,lU z3~=^_i=!K„ϖí@BH!t.}hm=_H)| j֖'4+q2͟Yջeψi%_uGdz1n`OP+b;PHmX[;=f\ʐAI8Kd-ޞ',IЖkcUii6_D\74OQ : |k-Q79_U%o*mOLkyS1 $_Zeȗ]OI %?!mdt4_UaCJP+pGHU[4;OW)Hd)MZx 8bd! EL|NcyjV: nAѵSO0Hlju~|AOH^U C#6nf`$Fo`٣CIz{z#Ɛ `bb 4v:b"25#f: &g Q~o Cs>z^1T*#\䛪F))Qhx OKCKz 2 [ɰ3lJa~ʮv<ʹ0{?NZc.{r'z\˕㲓Q[Tks4eL)1ԣЃ[hC]A;( 0WV~}ض4N ՊP6+KMm)W3TyW-.m:Եg{P4U%2ip|[YD":lAG?Y^O(üQ|m^ c7.$-5"3(qP& vwό[E_BD)f)`XwJM_ lX^:$3Le`[x 1Ft ۟]5 O:YOo=;nﳲvk|yU$lޞgDwK=5UMm #>[Q봹[VͱBO?qsv Snw6 ݺ0l"mGH96'u_ O颮ӮbBJf M8Hh%_ۓ~97q]5 .# $q|ۑM$` Up6S`Es1f'c hgPrC8p/G^|[͐DbW kܖJ;9\^j#AD ';wڎ|/ft] HWgw8Vɾ^ޜ=NǛv2K;ɢ,P6vk_ _\Iz3)ꂾT#sl#R endstream endobj 966 0 obj << /Length 2016 /Filter /FlateDecode >> stream xY]6}ϯ0Ї݈OQ*6 "-/itmV }&;ádɗ]() b#V.lXb}x]o[P=~\ țճ6f!8x&jx秮hR*e~X4uq(KinT ioWFfz"a=Z&^0OWelT#P @ȌfJ'pXPD F@32:D0BT:Y2cJf4eHy]V2$ !Xf[1,p ɌQÐKS§4@Ia/šI=l?~ljI,!3 K;8$LdF(SR ńU?!/o6X tY0}J0T8>y0 >P|O ~^yh[J@B2@d%rȀ'_ +VzN"g m[}ۺ/kWs`{<]S~)/sp.N^&P X_LwF&lB9:TmF{|Q_¦szŬsg~(w{||me+u&yfKp&?A %HƄR_DVCDlQ=wT_9,$@PByu^9F Y ᄹ s5'c'c/GMzC.N1u03I:ې2h5XAebݾ-Z+?5nɁQNb Ypꟈ~HsPRݐWoؕڟ]h.t#aVavԵ$eVUZ)-mJg)>&~_|MX<1fS 袊r`sQ&]a6Ik?xLX`>~ĄćlBڨdv&h(Ĩ4T(Rxh9 xf7:kiDϏAjx\N%'b&Łm-b‚O> \k b[|^ !Z_sB΄o2џ<\t4C`?-sN0g{Wc<6""mM7hX`K" }k*TvqiA'9U#lr*yuBn01""Hz4HȀ׻T6DP[6ّ@~kv(L N砒97 fĄ]܏~JWd%?fŋ,h+)+̟A_Z\7 l^~Pzb;Bif_k13yjO[l-r(گ]$45g_>Wc ؗ-H{6ba<~A}[lrs'FᚥZ-(^C2|Wwo߼~E)o&w훮h?u_>i`)33a^77̎(KP]2~fN{u+> endstream endobj 969 0 obj << /Length 1050 /Filter /FlateDecode >> stream xڥV]s8}ϯ8=H4"O#"m86\GjA&r?z>.djBʈF˻)r !F)>۵>N8爒q"DcfPSn}*`.,X%X DCj+0 |D Jaq"CR er\(BE D7ᨫWmԮo=(ũ}d@ n-S)2M%8q$>* 6f)&@t2R ! c0ӓYaq"!eXʱJ6gpӪ+MNu|:~ CDQ 900`cUQsÞΪʾ@P!ЩS0bʹ?VE]vJ}LQc-5mt߆t35wnCUPG)NSn/4N@: ISE0rYv$9>/SmG2qhX^N9E)LHVk[HԘh *hL^qFfwä#j* om&+G}DY S]LJy}/tp|J/QnnI7BG_*`8֒z&CK PлB7Xѱ߯]j TcK̉8P*Q`JGWJ-F0 Wt7- R*"+ʾNIA]NO12<#6/eܲp516_?w^0ê)ʷo}1hg Wq!6E1h$FҰ~# n}ፊ҄?ʯJ+lPϋlϪǏGc@w _gIoN%We`b DҚu\}l[0_cq/,Bbd-H:ɔ+ = !1՜Oz!鿳~)&paE _ ( endstream endobj 972 0 obj << /Length 1435 /Filter /FlateDecode >> stream xY]S8}Wm4[vgxha3#lÏ_ɒ;@y@ܣ{k='' *xqʳ',ߞs#{gmwOFR#@)1~=qLܶNtD3@Dσ5'rFY[osV%"͐xC-C0H yzRFg"vQ@UvYE]2W@x; jZ#1bc,dm1rNkxs # Ы^ Ρ͘ψ> ָ밍ЎX_=F πŵÊdC8($- $"_RJ\E?;$Ǹ~EsE/2UdSœp TgEEDa6ww̿{,)\ (eTskFH-\aܞfٛu+v{Ղ~g3vZF]zS5/mnt[nXj 9>̠Ug3Ѧf;n5F8@lVtbz'~Ep-V H/!0 .Weї: k{U}'4RnMyI3yrkˁc.(_̝@duALCǪ(FOP5TMj>7yPTA+\&!m#CtGU-eOLBIMX[,z0нtU̔I55gTRZkSɴ|R2]?.3LC7#.(O4VS0ܮ6g7=v]mzt^cBWg.𲴺`:yVEP?,ں\Jߡ:| %^UYU(ź@ ܝL5~@@9DX;}WfnU]&9few1ِNeJ]x~\{]k>\\EIڟ~o?ir2ĈIK2Oʴ(1F_ݰmG$q guߑ$; wM(N:5e:梣QC/!(IP[|3mNRí3OkyVM:[ک-*zY6( uX,yS2?lUݪpZ׻`]lAmU)HCO0\WUy:u?>Mǟ:]'f <nxY 얷5gZCV%Eo:.ތ(ioLb]c@>?\,*h^d5E]~dj!w'Է endstream endobj 975 0 obj << /Length 1511 /Filter /FlateDecode >> stream xZKoFWV5. &H)V a>d>'BYE:p;fvfvf)2#I'2d(dr2ΰ-;xsF~﯃`B0pD&W>bS)qjUN}ƘGȳy}XIveOieNoޝZhRVXK` Atz~06Ud' ^kYFIn1Q~w- Db9FSȖ|(XK򰍉8IT{n`HgDF $O8c9D H;/~nSxj4 1ߡ4Bsruģ:d;:#'/~{<Ӄ<&?;HPr=ģ:ރ X_r+q&" 7:1"Ny<$'Bm\ť2R-4 w͓jVZu)J uIPD"'mjQ#hQ,6۟Dk-۫<,i,B P[nu.z;&pt-6+>ț+w`j _bp餪ZUz;И>}`BI8 z_j]y{Y\Ƀ]+cf0dv:y ? ݅q.>ĕ}Rd9r}[>%pEKQZHB4*lmyjgpK"׷a\a’&FI a\UM{QoG&%$ de -@r IP@7΄! jƀndm9^[drdg;agF`ff\M< JoVnG vA'ZI|sa ɷHp.i fd6ٮ+8uz<`ӢRs?^F$ߵ鯜UWvPnS*odXa<86 wL: H1L] b{~5~&]~/v`V3-_8Խ.U[Mq!dO[ ‰!u~}IZ v}oz>< xfeR9Ӫx6l)Zwǥ:o!q4 8(5%$[ ck xv tN$W=^;TGE?o&[j +; $*rgиùˋ/HHww!GQb.TݔƆٌZE0L6u{q@ q)FoF1!pw endstream endobj 978 0 obj << /Length 1375 /Filter /FlateDecode >> stream xYmOFίȷ:l}mS|d9&X8vrHξCrCNzgfg;{d):R!C!Sdql5M@pғ8=T(MP"8MZ'w "lE0h&R8 _N;4T *lOSQl(QI%‚[7E٬ uB! Y1˒ +ܬ6fra n>R"+ US: gC$cQCD GLV'Bdq<́S A.Q&1̞ 2HSk!RH,,,O/z$"8VHzBQIl“!!ԒVhPGNd> o@:c]qs}GBtRm.hHYPcucݍ/j۪uָvpY+Im":ݗJTi\k?yw6eIUF 7kOҫx;Z}rִ8o~q?#u9q5&A׭~<ъ;08?ư}^sW٬p WW-_Ay|+8}8+2_mθy$q9nW}>y/o,Iϫx9t2NQD?R78؟CaЯdKVtÃ.gJ=<4{ʩCq=nOJ쁯b]uz(' ]I:R] k WB7T}.sWE`/H;;X'[^osw}/񝼦ȡ(A Dsa.̜ ʾJ;l1:xdWڡ;[_SeM endstream endobj 982 0 obj << /Length 1535 /Filter /FlateDecode >> stream xZIs6WH&Xg餍SC g(R")'ί RDIVe,} dH:!$5Mo_;΃^gӫ^p>!8 +ףRb\| ]1|;oe<"K]2WjN9>g3z >b X*~ ] $K#6(6WȌH_L<g{*Ҩa b^ĉDWZFsA7H *ɐ3B6#·d8g͐.!!zTȵkvy\!pws-oBOF> XeQ&au&G)>~w_xώ #%C>pS׈-O=dw LC t˝~w=,D^ L A3qb?P)A8 &=&~bK|&&!*[^u= :hMBJ [O}t'#\򊁗eX]/Wqf λg}G ƕ?uXr=iYw>QTv5s;t쎲lKx!|{e>26a k?W aUXg[n{$D"VͩxӸr]n*1ڄWCJmg`_LuО`5aXav xZ:S~?\Q0Dy1 0K8߬!䚁F|XJ2LP>YolZ(si04SW9Y:6}PF^miXof7UhMdzIlQ] t9RM]A?q6`g1Zztl~ғvE6ޗZ=Lѐ ~*_5F> $Nm]Fmm (U+8|c>f{̎q11ncN'wS> stream xXr6++՚("dd3f+ dN)RcIѡLqv/>(z yc1EhVg'7o/ ap`jy Ce]#E1!|]mܮ.~Sj1rśe" ('gJ'"jI)bU;HD@P4@5Bݳ(Eb3-Xgq9w&c  ,B 鿴CP9pXtO| i8DPg;f}i 0,F:w FN @h( +H ?+h `*$ WCUd Jnzq\Dk{4{뿗vbz~PjflchGge]1qlSݖ9ڟCªS]葐 4XrAB]Jw._L@1LJ^ޮ?U_ qЩ9h endstream endobj 989 0 obj << /Length 1590 /Filter /FlateDecode >> stream xXn6}W죶hDJIMm{M576nH3gf I lDBO#jfۉ}yvĜ\ 'r~t&&l2Uͯ'NSH^ݕۮj"ai*Lovm2yYOytf98|dR<f/p+W2>M3%,)K ,XV$B*Z$9JJC5<)w0DAI5I$qÛi.z`M>ZJM#EiڵJ 8L"S IQA/ YؕK 9Gu/sL"J /YLI%-# LbM-J1t2Ie]vx*Yv*'<;y;;jYԊȒUV32tw] |uk(BuRcHfNT-=x{jwꦝ,o,!.ZڏH^8柯s M R(P$dy,A 9WIutoӦI'I&.=@q (`fj4rψoLH^nv BeVv3V4Umhm՟Φ; >`,%Wz'm%`޸m@>vP D)H 3#fF`g,g7MHr Umsk'+l3b}K3%)}:B%S&5yMy-_m!8!8 adxeٸq)%g{ B΢ BK[ZΗn+;_f즇hC{z~:A}྅Hجl3 ;nX4uKKې0@,|XpRc=X#Tt%g8@ gZL@_X/s%nGq4 PLN G b:-Ji) (6SkHe]S/~1iJ:ٴm *{TmWn82;l|Fv31~:HPn˅KSxcl'#D8/V;(%mST0P6{d%l _iNϻջnCX,ӞE[R8k!Q.,GΉ=S"EC bd|x!S݋ 9T*#ڠpQxvʯOR{<{eܺfnրŞhCx_zхk8{(Sy/kxU ɴ=އޤcׅkDsbuoCk! ?v"; ~AN'0Id,P(bʩ F@G-S# 1q1 e_i'zW9%,gTyxxx%Mg@Dh #; Q*cU$HJx:P#H2´X1v< endstream endobj 993 0 obj << /Length 2213 /Filter /FlateDecode >> stream xY[6~ϯDxT4\m 3"̓Ʀm!4%3ȏ!%K2q<5Fyx υEqIj(v/ozD]ǫG߼rA#F)]\mƬ֋w]vzrʾ]Bmu5->%KeW|jY2Ig쩏1V&%Q@C$iRNH%Ģ(8uoOR7P7v|1NiR"@Tح_&+:c/G~w1+>A2 Iq4IXh)i@]rf3{LŃ1nl($fYF7i O#?MZ t4&`b+R p^.iKd% H?kY'?M-)^UVL.a(e&tnp_e#t5Ƅho}{!~k'd>/|c`.&[D vf ?Oa0ƨ^pR傤Ew/]:^ef*%spBC"5!REs= dLW ݼ#eۼ(m}\Ro3SFj9ꛬn }z&l68`R g !htEAv8FO{:oV]zB-0@Sh4&~ݵC?iI0.2{c@01Z^-mu3`scWd^~8S^n*i2mF6ppOtV|{yژ2ZUwq"4=_pRlv[:Iwv2w{MU{Y ؋{AG7E;yq~P.ux̵M4~d7mwuSnP!PhGwx.Hl ϛ 4FVhL/]eŪ+VOnxDPV~p1o endstream endobj 997 0 obj << /Length 1912 /Filter /FlateDecode >> stream xYYs6~ϯ#51Qi:\m$j^<0mqC%w RWJϙbb,>,%e4[3\Q>\3$Hlq9fXxZ}8M5s_JqWJy/۶I=ŏ,L+y"̞k2GS,ЊVK˥#sCs-{3«/{^DF"[\^m]Kt[6 :E ӎt<æ2=x'@`Bdӿp%IғMF@-;Jx]M;@ f>kNmGIGQB k1HuB ډuOJU<$NMVyWW4Ղ_@yʗ4boƁk|Q FfD,B+3ay}"NiSUQWUZ9' 1:LXjӡ`Bx~̆_ui&]fC#o4^[|alL 's;AX`k?]ЃB6 c7"]j#8\|ɺ$)ZMTWqm5emjw9^jՇ2 W,[MUpfBb5­>?V@C hduLN$p|2j9:t:2;4 dd|&,A 9?3cb L BscB$80[\4$%CAn|fYSه84Y)q"pqk3ncXx/pnn$$N ˥AZu M-FCWK˺$&ЏGB$HS4= $Y hpym4W\iiMȕu[-M<+#?оz i57ZJOccWىaayL-x8mRFL$ rhcޱ=Lm:3.߆M2SpW=!QQ @%mfٜ,-kɠ]Rt{u}f_3R;\L-~`*8BЧ@XB p[CB,(%A ߘx6>yybЏִ} QDG!+?s)ۜdN N}B%4SRaH0.SKq{LPxuwkW'Q;].o\|`/Æmf>*mё9 B',cWךQ) ߹w2}פTw; endstream endobj 1000 0 obj << /Length 2445 /Filter /FlateDecode >> stream xڭYYsܸ~Л8U&xlaq˻e+y@yt#FJ_EWJRR\ȎvW7 ab͛k}#E[.uwB)eŏP)|no~wmi0tm E,rʹi%_(Tl)k3"fV$oSO au;Xȷ(o`U;wp`z?]e T9[ '"2= T$n7m,%~Z  hWmh۫P"BN+ۏ/ :%N$oCHI_LJfU7kt˦lh#Q¸qNP>;Ls/Vi.$S+M25 `~/byUU>7|peGUSGݴ]ͶZ3hT846Jj-g1mzN02L] S3%aYe'0k Kno]'TkN#Tbm$MLMgp k:*wZ,7ZA9ZC8!_[3 ((aQz9wu۔!VA_7ys1PU(C)=3oǡlq1/ W<ѼNA^+15yoiuX1١[i0WZLK0pM?tc1P[9Q+S5{RB m% Έ("M/vqB34ؗ_訷sa&e-1xy)[d)*̈ VkRb) P5CCmdJ!3HBB46\Yb c^Sa{SVO?ކ0htpRȋçUr|ä͏o& \)l'rL9ogˋYi@ b-4Z6we[a|Y{dw+wu/-:vu~Ve(iɅ)&|ڶ%OZD ;0EKen&}(S= J"5l]Kq] hx$Z;}aYimhĖq Kh +'<`u+C6KڽsF tj8P*d|NY;UBЦM k,\>0:Q[uKHa(9>컅=nsʃNV6i=r޹hkTlK(Nʢ3IQ)Q@bcZ1$SEWq.Z nיh-/?tA)lH@"ՂׂVQ-\ uk]f8rud*-qty-ۗ?~-h>_Ͼ?sA[טv)*vF~gQ&u ӑD lj 8s@/{Sv;ƻGXᶬV5=DK5#~a$htZX#*'T2YZϝZU P-+vm `[a3<]/ቩ3wsȃXu$NЬn{sI⼾CjOJDc(ӆ *OdAAf1k0DaU˞yo3Hwb14Ϲ `ݗ%|0G0@\^Ȩo=T>ѰTOg72\)pQws M V􀑲P iŞ9D#f#4 ŒKX mvzOѦ&"r*ar%('X6yRLq_B5p1uz9;mֺ`3.0eR#(cAfLZvðfI$tgZfIĥZtuurkBc͒0WnVR ղKښv M-lf  !r HHdaBJmEUBb?1D"WSz -eh0#ݥoASƫNoC淪H8K 9 K<]6htJq5 cNFuN(X)jxd $o͈_ed֌})Jr88 5x;cnu-y<#$'DxN3|U| }[OQ`U-x8Z|c?z4|L1=3Sfj;o;G"X'܍Q&dbxbWM t0 H&q: MӳDLméqm/3x.8 D'L!R 7\Ky͞-xNzsP֯_Ϸ endstream endobj 893 0 obj << /Type /ObjStm /N 100 /First 887 /Length 1481 /Filter /FlateDecode >> stream xZMoG ﯘc{ 9304 h @[ÇҠ >X4+;h>H+*-j![Pk?K5Z u R  ǹ%MLz#bŶ5a8$aUA-i%_T9qtVsj\|YT0X;n3k+F8b]Wjh@2t9+V\0n9\C#~(9C3+8yhe %ivuC! P2jQUR 6A 59,:*TET@XJ@0Z+3SEx & W{GXP}nUjpKP=d1L4o k?_\cд ĵe4\Bb6 PA  Ia)cgЩN򔡓eΪA l!`Za 0sgu3Tsӂ겘9byFeN< 'eLYXPX޽;=(,A^M?m#o)fB̔\MoO/VgϗpOŋu,Ջ/1rX K07,-/W.Ζc~]~S8qȠ xCS[`:_M|OX"y,/$ ǫˋө psIt/"8j>z痷caWk~bxjWowvCbI'c"E=I1SfL۶qc;D1čhl@^78NB¯YW7TR^NҨu# LP0P(QȢAY ˱ ;f/ poE|˼gZ=h0(0 E ń5;)L(r/6BQ:(2υ"?L Dh=u'(vP7v^!|kDwl3!*8wsȇ E8eE kd LK¢s]wM֦:k*?n_{(:7v9;;IS۪\!q+_H1rPY X! [$ ߓikz)3i<&? R$2rV1쑤z5XORD2 i}Xii&mCBQGG0}O&wM3tD\(L ms׃Ad44gk]Ӝ(]Fޣe~ m6չ4_o5PVJk{HQD)O;lm endstream endobj 1007 0 obj << /Length 3055 /Filter /FlateDecode >> stream xڽ]s6=BD`z6mҞ|wyH@KT"]jN~bOQ<41ApX. #JfY,/"7[4 B ^m/xĒ(!CPXnMzdI( xu*˫] ޔʼnASxes,b+y$->zH+ S H"wn "^c__js:['Y!ǴP^\;@LF`^K+Gh>V@Q|W[;Zi-s 7 4ef;fGH_>sT<>1@ ݮ mz !Ӟo=[) H!2GȈ m{GqRl(e[q?Z _EL{|YUl1O:|/_^|ˣߝw4NU񍟼B UMVTy=5zic ;a"Y X.gn]̸6p/ЌMSq OFH->)#Y͸[12M]j|[w5րv+-2x# ӭOi+A+xP+ѻ* jq|x{be+Mܑ6d=!c"I@@z00-<0݃B" "ə s _h>NJ㎆Bі )9 @TG;{2 S5Ӻ{>d|ЃX}ދ'`i` eaC zȀ1TH?)"ql(7U &]nn&K`s/WEޜojmR8ilYQM;ZA^ӂ&An=)K18_#pK6,n@,mI#a39YP*ۂc0Bcf9| j!^" !yw6KeZנ7K jp'[ 6Eg3|\G8׽1%wEj#1] 9e@eE۲'oEܔNxT5ֻVU-WX4q;+ٍ4Xno25Jz>DIG<43$(HyK]MuuNvDC|#iW=%}Y΀,ck9cS:!˱Q%8&c8j RRR|nh,Qx, rKy uꔴ3{a,9C欚1C%SIUV &J7D'o7)b:?VA?M xCyB 0:W! m- A}K`шa &ȍu+Vv6\96r0Dc6BX[e#?uVy >  _WIkOaJ\w,miC/~Q)*?oQrμ HrBwKFO)oӦ,_3c>|sG'r0l mRxek]K9; K:'C7\B|۳jKTH FTE.`me;8Rid*uѦn oΊJ7.M9'ѡ>^2e"b&֘(/j W~j]^eیJ;q휋 DHouRݫ9˕a³.ʲK1HPb'${) >iZiQ!hJ'>I[/l< \[V v1TIVy쪫Ls%>0AƟ2|,|bMh;ufP䃎ahiLE}v[,%1ɸ[\bw8b֞ ֽy v(j 潹FGQɊ]z}&:J0 ePGOc|JZ`}&Ƌ{Qu`<6ͧ<;zn|LqsWD;),<χ{}zD+yqkȓtUOT,H `;od0"p`;l NG$g^pB@+`zCF(H! *2_|djM$b>if52U~:UVSӘ+l(AkۂM!=ÆW$EOx4p!s+M-#zs7ia&GI )h;L$P5OPA(LI>[gVsETK _M`Hp[laEr 7P.9-vw ~@'PQm^ݯͱft9S;WasՃ#'͠d>eZLSPI3jR.5 sd/.eYds=W- O3WJpՊ~0B(9 ƀc MZ3̨o;pUjmܷ/ꫝC׆k,n@ئZ endstream endobj 1010 0 obj << /Length 2518 /Filter /FlateDecode >> stream xYK6ϯБE[C]g{G9L|HkER&)Oh%AqT@lt_hE |aXɬ4My~A?^q?nWW߽zc)_廉MbY]vF]S+aM#?]}=̬fZ'ُ>5j  "}_Fרm S:j~@ͣsgͽoص0sVm:\K%KS>UnHjִv5z%3\O.6ڢ+>vQgbSTj!לTh9(%߃et?J<:l\uA۬-Ώ$:75h͛|K/vyߠ]M"ۢ*wKa`2֧]ڔ؛KR7ŲXR@n(#S5ZP,l]vAI%MCw43%DVC?jS-y~}GaV^_xOcfհE Ƀ.oW[WHZ$,5d"Y(KOxOLTJ")"E/E$x̃Z.y ~_\_Ǔ $%R2gAB4 O o3y?H9W<\$|OωY ?jO8]$*e֘zSFI;϶PaI2oWʲ$!HRy 294z^+LkpcY\z |Zj̸y;Z Y"QQl@ '1HC^fZ$SBo>DzhARCS@€)s B6A@HSߓ3v367viڝ̀'o7-><'@H#a f!/$oZ%h1DO g`9:^z-s~Ľj@F AY=@|8)hNSx.sh|' Ṃ8T 0ƨehp&A1G%'8c&RI֢Yɑ A)@g##|w}6oR.oZ\s"4q'>!r6v@=2v'>02\תy;ܓ'B>wMR 7&w*(曮nXN~gvZTT Nl؛)p#1j N'&p ;=9m44)vA5 a=ޮ[{='Ar7< ?_nzA!*0ȅ?_}|#z˔UrPhת9n:>Lv$+**=jem7ιk 2WXJuaWecMXNj8xiP~mE^%XV̎yExhMvB"tҨ7NkЉ k_^HB E2[g'4̞;QhGJn6{tAWm6&˺P~f0vzZ|t3]S7.6by_l6v?[3l4cz/$Bm -j.#cT9PPCS=M^"](aF)+R\inWsE[ј6En3^yݚ4 LSU(Ӱ|1PVdMVRaSHe}en{ ki(bM*OYT_#X;O%0먁2~?p7㱞 q[ab+#u> stream xڝW[o6~ϯT%Mkpl"K%/uËdіҠIws#H:1C1|`_n/ A0lI~.Ā` F6h:hҘIp8^Vj5 cGÐs҃<8)!jUdïFfAf-5js2FQa-!߉2)0Dd󇃻'7ءZP,2iː>!GHV} ;P,wXEI!DhI@ u -R o ["o:T 5_@e(DEDww485.[:kWgfGRa -#1JH }e_PV$߈-f}ܻOe%XՂ bC@Od0k3soz4x_QĶ蔯Rb:/ +dL !ΈΨ`w[cMzBޯCa; A\U=V@YV8b{Ua-8|#0~CoǗcb}^<ٷJS5Znq^թx=śz+_hŒ ^F1ZӰHu8k*]۔Z#SͪzGR9ZWE;Ol?NO& !1EBPG3}ikб~/D1!L"\Gڝ|>lt:v병'KBK[ rQ'|E.~&_uɱI{Ou$.l tcd*Sգ~}Ʃ~Sg-I(aOur}XgUPDx2v>y` E {Mڻ qŲMxil?Ue:N4S{?<$H&Y4SaL@NU+7x "~Jr1~\ ;K׻l%!Ʃz ~vrU,9e=l"ҹ oU4Ͽ4 ʕm ,uŸJ'`=ߣrI{Ȝ_q.̈H=\:!}Ml3] YYu~ dgt* endstream endobj 1020 0 obj << /Length 2311 /Filter /FlateDecode >> stream xڭY_s8ϧG0[Wux}_0. S׭ `\.yV!g/b:UhV|8},W'\0H„-.cVŕ&uy(a !;hZruM].}N<// YrHP͞1*H(UJA2/>󺢫Q#*"JwKy* 89ٻ̯R ƂDJ#92!mzx*P젔 JI(5p#Ksɘ x6m*ϺhܡB\i>#*݇y'8Ŧ j_rs:ZK{jɷiQQܠd +=ժrG3ϝonRY@[PQ ǝa ˴Q;>?/?B&*HK&Ul_ 'Rr6uĊޠ5ʞD+KDL|S% UODyBNV:qhkx$؈ims p 6 fSJafAw4)3Zcs ٘?eaa&fIm]lڪUZBS6]˚0O#t`P ݅1(~0<bw]KXKn~ɉF_&\#]m%)lV1 cc4fu5-_룶MfgK6U*O smQ=<\ rK_i/=]z ߿w]Hhi1a24:N =wh^kr 3dC~ҧfk/CzQmƒCMCk셄"|$~a\xʅ +O{;o*rmHw{H#^sʋI$ k:"LCΛrWBHO-$t}3I_Lۮ!޹ȣvÙ݀VMo~ߗ]e)")sb.yIXѨ25!,2+dl_LB2 }̡4(]M:!FOEߣodu.o2ʦ%@ͳ_45[R)ƕ?' ELB#^|un SNp ]sI} ׽Ci&49}j Ap>rYW7.DPertUxօF-쵛tg: r *õ!ƨ1Ti -A9i[`ކ' ]\߷V 3i:bi!?9-D*p4ΈߨƶAjoZ{n(_$vؔtּj=ЦgcJa n¬I;^UY~6J<l_ti> stream xZK6Wٵ`RNIIm8>p$jD)$ > A&[:F7uCb'fFΌMMlyhs3=~&'3zol&8y.fW)uًbוRŌ`%j}s}x)A!ݿ-*h,mqJTiX3io/2˘IsI1(7|8Ka;7u3LKb={߱ݑZTp{~1 d)SMdl2Ye֊m1^9ɺhnAQ'.,)ՅHV%+Pj_eʖw5uBÔJYɄ>̘3!dw-ˀts_6 ͈ͥU4d/YJM02mW4J GFK۪Eה+}q)f21<6%xpr?Pi!U2S Wˌxd F6юd^0))_MQݪzJ[ v}@{ wz}F܄;XmȂi{Aa^=pYH,^rm%VXWCuDzocaϸC<{H'S#3!+b~2k6)oGlr?1 K69Dwo +,+r~5rH܂d@~wB$t/5hU#6惰BL Kw;Iu Z-c#tJ6*=]o'jcg'N(.7Aٕq>Tvҵ$XVF}j@ R/S|C =֋-OeZA)"UVBdk*\ VŢ6!Wm*R;NXc&4 I7-hTZ'7p_ k/z  qƋf))s?F  jִUVrUxe߯ؗ10Sp/Wݚ[t7[0 ֖)x?GV5m 0eFM،e2?r/g^qy̼=4\_;2!0ςwN(MitdiwXһmA;.۶E"~$J!4+~0@m[. ='*XFi'T-H*)58d9s`3(yQƨl5e= F9?AfΉTh`Wb{gҺ6q]:z1Q~N1 'XZh;s L׭zxqBÃĆФA ͷvC5}fm Gf cveOPkTRLR ڹ#vwRFA> !=<& 4\~nPB滒iXow[,w?>)dc%Aq,3 )6$KS-d@MiX h/uF-pr,cef+tѳ@}/tAk%r -+7ůx)vPD˥kpUn~J*ߞ0gR(Y5lw(]XJ KFS񸑿8+im"5H;9 ,֞RX-g:贁ر<'-&aдʤV)uQv_8HN@U{:# 'zr2Z`FtݙNreiCX8p@-2]8׭FiҖ雂8. DžC0ڦsۦ)=<= |%/􇫀m,0czL)6aƺ8 endstream endobj 1028 0 obj << /Length 868 /Filter /FlateDecode >> stream xڍU[O0~W%MR!Z4`RHM-$(IAL_R(T|>zԓ̓11^vFyvsF.`CnO־ QPor75zWhg>9lPvѴVS>Q[W 39\MX4;{Q+1,$e o__GH.4%0P?P]$qj!O`*@Qb0VLk0?TcY>j%!?w!$< rw ~2dr>1~gB.c ]q(09WwVe h땡lϏ!-uʊL4ag=,zùInM\ًǕxz0+rfugUv,.{ׄe޺BрsYP)s[(X`چ:!09F6:-4ktܔζ>S?Ϭ7]_jCUBܰI";\kMŴ+,Bc?W5SMN6 93-T;z4o$JH,6حP֦i E[eZ<7yc9jBq*;%8MsUy 3Gg^gMugCtr>u'F`Jv endstream endobj 1033 0 obj << /Length 1061 /Filter /FlateDecode >> stream xX]o6}ϯ[Mi@" :l(x@4͸dɑ!ߥ/zr)#sxI< SS!C!Sb}_g^&.`y5F`x!lO)'/$`: 8qU$G_?m*3r7!~=E9yvq=*셼W@^!JoS3 BCJw!#-C @"FHE\h+3Fh_fV$~hG3-n޵A .y D6Hֆ@ 3;{Ex(HX/۠I q !Q1߇!_ Ř&HBGi$b*;T}Fy ೃڋq0"#qHF[2 Pȿ C1(b74غXR*/|[UvyJϋ8YiX>Ӄ^^&/=(4ćlF1!Rr%>qj)Ft`nO Y9ɂ)0Q[$毐pS]Wo}&16jMz>HF孻c4dE|w:B¨HJ'+@}78gL84,៷6(/}E> ZԸ,kW0g)/u(M1,}E y=D@AZ8.Z44Rg6.YhTIUSCIA QRyoP=>n֙C%Oۦ,U> stream xXS6~vU囹s= ǃEԱv:][c!pm_2GZ}u$8HЙv9l; dS(3BM=jUz>3L""߮/HW׽Iσ8/$Y?g. FAi~1f"̱0\KjiR=[ϣ= i $Ԉ)Hpl>Ab6+ʴ%Ve&XmR晹WG<1g9 nǧŢUMwUFi!$o qCA0i]tU7mx O'MT?*9ZH),r[@g+R REb1w3wc8l:į퓸TzEX{d5sBc2A &6KbhL`O i8Ц1SORwO4ԍYs0Q\k#a Di ;1 L3ց-@fAn^j(#!5MŏfIQl\GC"p[ܮ/x&FV4͘`o}gߛ0g0C]Xq}3""HF+pcQ,*U߄^.(+/^BOde9[$IS;p"N,EHXIiiܳ{:*sh`AjZ$?"/jz ]5m #`e/Mp}We1 F5\%j- DU2}v2K`n,U`uEq{l~hZ9*eڪF+)8virӺ%a { WX Ţ~ay$<}\Xm|f]ClZ,InlOH?m,ܶMqgE?+]*CgEYI!0H(Ke!ugqo;wUw7WS endstream endobj 1042 0 obj << /Length 1052 /Filter /FlateDecode >> stream xXKo6WfXI-9q.ص[Hs:Ĩc';)ERGR!JphIJ3 GͯuxD\ qM?>L`uU"4)'7Q {Ŝcg?$ z\8QD1*4*8+( $8;w)gD#8!yk; !"[L{4 ,X~,b"& ݀ S@I `Vچ5rG' ;řr˰㰈vvM fv];V:8HCAv;(HA$'rY'{bЛ ̥ }0%:yPU\kTzJe>[-ƃameV=<=S7- |7n~|fq+XO`$Ec- XC89SoJ}> A68Z6ms(cŠMĕjdS4ͱ1Ϗ]p˷?#!Am@N}1.iIZVUP 07IA&b$098JރHa1- fssK`!R7" Jč$*> stream xX]o8}[M񷓑-vH[fUӇ4S$TH 3~067Ǿ>'8>QQCSN|WX; eB`8ǪsϞIL=19uO`Yӱݤn2c"X{,OL`쏹q1ԞѴaOeMH08^qwD.%ګ@V]$"&ub((B/,e HTN7s)Ok['Ls9TU-m[랭"a.;վIP$1k# R2tu]/B/uNz)Ĉc]0&Ŵ2MK$LmLzJhMȆgP*('f(eMo2@DJ *b[HgI F}<lL0CXҵH׶^ߺ^Q{ltSb\xzm]v 7/W`zEEi[Ţ Eb J" D[7ӭ^=\ endstream endobj 1051 0 obj << /Length 2369 /Filter /FlateDecode >> stream xZsBjM$:>st&Z-$R%)_]A IÍb?~ ҌY߶w33xt1g|)&$Or:Y]/g?DJc F]۾l1 :rʑ%}Hj/=PsU#npng nWEo꯷>nv=<̛mrUidPN7 mBE=nw)3}~} M]m5muWՅCK*?=Z8"C0WVLr sGmŏU5}[#7vIUW?1QRwBয়,)gy3{nRAd"/L,T `9gQrj|NHIx6 1%)QCkˣAz*JpPDFBRfhvKNtY&T1+`v!G͉龿*!ٜ9Kpg#av9\|q>(-p0@bl#1.iM"αn<-ݺ;Rzƥn#ؑRG:e 1G,!5{Mo7=-*Lq2_ N $1bH|fjQb7Z0h E[mǂU(?k|{* +ԅEk,xHsDDxPXgUOcҼK]ّ`2V `ŹWեq_ x$N($ ^yԣ!i@eQ׷PwU2#O 0+S{zi&u>)2(%52.#dіP^;/W^`Ih64jJ@ jꂩDM3a^sOSR#R#)^\NWtg凓 lbՃn[,,p"ƚqbzxjp\D7$ء/>X.+U4AdntGC`%&y h%t5)T5 I1TyJ}f._zPb SB Iܬ^ƦӚ|9T\RqDjoݟ>6p6\t.Z3T:,A38\ e)ڤmqql4|a{xc&us`|Jed? 4 ,wvq*48xg"gbhZ?N@\*Ġ;TN"{@ya*285azn:~&[7ևh/pC$#{Q? J&[9C;<\3J|~%T iZn0 ^72H{9giLH ]-hxhBtEb[2]>†PZB&c=5~ C3J[R34?D޺?ԛ, KP(enIDF|`gy{׊f4i.Q};lx'ulxt;z}zw+nSH9Qcv8tl(u"[IUt kAU;BJY A ir}%j3suN#{-JB}[: PnB~l lޝ)xfraB$tz-*Uw86Tƀ6w?ە*51jiM|UQsLwvf+ŐVÍgr;i˯Ow]\;9>t^*-㶱 | C];(8Eo endstream endobj 1055 0 obj << /Length 3210 /Filter /FlateDecode >> stream xڭZYF~WӢiYur,k8alFnX,]]ͱ<ԡ:22{&bM(?QfW l{ ^~xia~~1;y{UJyBx:^4W[{=hj:/\w2CPtNʏc8TF~j"͡k7}v}px5aG\(/BAˁ$MVfo6݇!kmHf%o]_%kz /W£{+S|T"" eOTkB,$}- 4ɣ:Q# |9۱ag_l2c=yum?7i>:`|i=rG<'" ;Źs>qvG|cL&}N!B_qcva,{}2'm tH3y뫟m>)ʢG?vbyYͩy #/+VW%=w*vCA0mK *U(-_G.E `\)2jv/ph}2NZ}B7G˛#? ·c􀚢l :7R(b#wNT,H <+iꔵ}G:85һ;eN33ڼ/]/*^ҡ>L.Q)pA3 8KQ\<7+'iSw$#'!YBFѐ$Ĵbʂ&ԡuHUU޵KIM4ϭ`*+j'gkM`NQJT}ͥ 9"PaMG;D J3jSu4{h-׺gW$Cd`y;סUG#LAWznaXG>%;)g8 3o}:Rڏuj8%9N ɦ-& 9vNN.S< omF}NiM.lܟ1<:ӆE;ސyH9]Lvf'5U^s1r!jї/cL(C`k(Ydi}@3E( # #Ω(vX:Ř%ʏT \h)@PXcn[3Ea9m[_}Y% XDo{sZrmaOq*1eݖzEb \4f /ЍhY*ӰcpR]a(ʩ1X@S2 - UM+eHw2@\S8`ق?r^`O b y!O85B.ІB޷ T'Sx曇`5z-Y9>ԧ<幆NjnRR?0SWSaPm#"CyF#zW~_<VռL9!bS", 3_5_@Z> }("FnC7+͠zhj:EEi{ ڃغvMRwu6G,oIBQ( Lymy$?\jN~;w)оeXErzfyYUhﲡ۬zK`0P>LMED.(~t%w(*>Т?>aPKd=Vƾc Fwcٛj2~os~2{piGOk }@e>v:jx0g% c_%ي0YDb-⼊<yk3|W}^S1HYJpfMø~+7'sk *ӈ(%̓ 6eT4^P9l2E^MG80eid A2 R*o[H0Jg -_!Pgu ]3N?ohSY7R DM5!":(1ݿLm\o} \zMr"R"NyZb,&"NcBqy3K\g"HR}5nED{V4XK&Pw\pVk/.fʀc]HMY/I(.0!u[\)SQIHʱ*0x UO^aL2Ka5\ܕN)9/Xh]bD; 6(H TgYB!ڐ̷̳RN$ a&>rt71J[yl "@dsgVV)r޿\DfςI~G}ΣBӥg5٥) endstream endobj 1060 0 obj << /Length 2320 /Filter /FlateDecode >> stream xZKW|Yj17(Um8VG,]&%o~}zf!J8װ׳&3 YFgbHl>m{?7o./rX~N4n1-@ Vk*H2DXp}Vz584RĮGWv֠7?9ο־SR$E8b\R+Rq@^YB/&\_XnbXmS^T g\y:Hv IDqM 51)ᒪkbu 'O1A!q<~O,pL :8r_N`5Avrj/,A)Co{e__Q87ۘC8>9/NÜס/0 endstream endobj 1063 0 obj << /Length 2132 /Filter /FlateDecode >> stream xYK6ϯ)--d6LЋY/rAKr$yf:~XEZNsE`!]*U "Q$ 4L╰aA߽?fh!E+X[wCvjM0zkyJ9lvmW%N8Yޯx;;RQJASiWCi8 @D$R^{sKbޠDVUU$ IZ}LCo&Wg 4AJ&P=k&_k_Φ>'d01/ܑJv"u2+ d zi'\F,]^CӬdΔ$G#~cĺgmɤJq=n愷KX7S]s8z^` "쫚\)w~^*.ZVuQ6v^tn̎>gx|jSPrllsQ;!~id[{o6~MZ~r˼_mLWmPMzlbo, nzWZW+^<׶pF#v/hX#:2hPEb#{Od RFzbx:d:O3 nt6ɛ7mɏ)2e#Zohh -H`(8̊|ېqƆ!!} \tI2&Zx]Y)4l+0$4΍Nb!$iMBOUԡ7$*qiwACH $u6 5q,'(Mi&;mCD$ lj}:GCLݞ-Ͷ6ۼ`H s.bT!H%/3r#$ۦm$ 9զDf,H%IF_ۈxkIL2n bTU奛 d0]}g&; S~.F!!+V3@g߁hnSp"JNIs{n}<]l|6pmŊ+sS;Sn*铏7T2"pҌvd( J=w:8+8̜:Pd֬nªG>(*bПu'XOce?Z Gbƣ:[ĎHq}DUQrx"f*UЧKm9yCW IM'PLmcnxPk[3KNTBMK%C}qie-/ͩy*w@+/xJ`u[p'- gu]I8MBP0 %Tq!{8@=lH 'r=~@u -"`pmF?qQ΀4L8 qusUnmv Gۮwj.B ae$oe͆>lRhإ/y3xCδESC/=cAуFcDC&z\B]6\s%tTX&/k3L+^m[P UmEc xH,l2o=MA(ulps,=ZK!?wuӫٮӔq$qgp5&F2(|T:CbK0C2j W§4 lF G䯂3SJ+`dp^NE#i@V=-T3ȈvT_dt3>JSL12L]Z@=e6 nHa$gxxd.aklS_`{Di emͪѫ%z @k Lsv&2^ o'/C-jٮWi^+Ǥ pp#ȼ M\YU{3!lp5rHE-EȰ6uk$swgt1᳨ҽnY!^&ms^o=u endstream endobj 1068 0 obj << /Length 2945 /Filter /FlateDecode >> stream xrHW8Kת*Ixxa7]-F-5YYz<l\*2Uh~?IHdzsBW[b_4Lzju.BJ6۷>]H)~>](+|L/Tʬ6W䪧EJޑ6D3NY)tȋ2+}f~(fd%Oa*LVJ /W<ȗY5V~]gȰ(D,95Ph}m%fao)z];:LMӚc}rMl_N @u^ ڊWʸKc^Wۼ!* OZ7mֺce8D:;-|>tQՉ*#v@IŠ;S e fս"?|H6Ίd$QqV&h$Y*N!LoQ8UkqYKA)KL>" Xd&"ݑu6<:sj$ul:C(=.J#8qwD۬\vm)N҉#D=J'x*ebXY>%ID6일:5ZbnU6zcN ph5U׾6ְ|Dv; Eevh n>ֻ$@b*DZu|Lj6`j*&ߔV(GC\F`NhD Ź } !2z\0=~敀yK)!S5<6h kgibK _,mI4% LwN\dzXڐvn5s\w3GN1nK֒@TWB@g6&1*l츴}#zq@ H5 Mq, ذ5-[ G0J)ihon+A.Tεe'ۋ;"<"'RODbtHI<<,e i ;j/p58P(X|A̢XwX|gQ w2ga(<-g&H'Ye9#D&w"z"P E~*D)gJx5yb/uWJGiBXB X8y!Mp&A{CL G_ߠ?K"ኋWfmjqzY4xRq)̗kByݗT fb:+Xu` F5g`YI\ئTEe!3U☛79͖b YSgoRxYjJ!BY7xMfXx.b`R8x&]Id~'P;Pm=K"9[1$@j~5$loKҫ?q/B|9hK|,V-X$)q<Ș25e9uU0 &+jn5T{lEU[_WVKŷeUTpZ|j i ;-KšNὺRf'zumvflئ*#uX)#K^'L2{ $p'Ģ0 ЇiڡoNqP\OS`6wcןh[t&!Ak“;pQ9d{ˡ@nw߾̳٘WDQ^>Oei4~:ePYKU^1$R{OrFxe s&bv!A$NV-\Ts b-3)UmV>5Hlu5%wTMˡb%/̇1IqAsy!羨}x 7,LAr]'" !$Y,T2WcUڀ -1'/ |DRi=K~;+=j{c&ߥo)Q#~(RzoZOX2tD*>=SW?EvWұiO#ƸDfq"5Iq=*9vz8ze=шUJ 76 !͖(6CdsH _73l2}0n5亮vn &/3 F/5."]1+RL֧8BuS tF; h[+W)e3~Ɖ z'S;7Y{ׄ0n <&X rNȀf_pB~[?pNL(P0<ɭE#V8p@HO]ekj &_} .ƿ >z{R qV:~0i_,rz;avM",tI#? u/<Le޸0cfm-bl|dCFhv"uP 11i;xjR3Op#L9䑻L@8nFa\%3zࣗxY8dz{u^5meV -pxע,@: fp_"BOA}gNSLj~ N0s_ endstream endobj 1071 0 obj << /Length 2351 /Filter /FlateDecode >> stream xZK6Wrerٗ}TYGF%R!ts@Qq얫 ЍMW"FEWەy jbE1]]oG]{%&~o>gY_p,=m,pȓ?{N`^hP[%%% 7Ё330K I0IQdoxL6Ӛ)/{I廵^?eu+DP)d+O9F_s a.DV~bNDʺ<6N#DD:L W7x<< Ďʳ}j&Er> Pٹ`FE{6Ia܀gA3TYdV~W٦?YY+M#pOCB9/`)tÇŇZj4 O"_x"lw; j""ݩ9`mF: hg >c̻C}P#\b[.[\$/֨i>:Y\"bI]&^ӿoN1P7U]u)c!yQ+9)FbK-;'7{+>&&7_̉yB?I.2MR$7"O*3:N|SVUV5P"QMic+ۏ`G lmE_/=N ?HxI-5ce ( fS~i`cR5FXY!%|r.LD E [Oڵ8֍/ƻFֳ QdD[^h9\8]ra TXxdsVڷ& Qj03(Q|pgL2*Î~Esi 47D _@i[}*AmI_ic'3  cK<-t™kSny޻Zq RJjWEu5kQpir0'8qkƦp7:&;cTHq.0꠵{Z] [!M;b(c #"`(APe!cH>PE0Ck aJVH$eBH!/qSV_fe[n[:EO!0M>dΖW8\6Ž za)9!)TeYsJ`Tg)D Wdm}݊TH ֦~,tuMP6Uf7U~lK:P@NRUmzdiFQyK{+"Me.i%ЛV5Stlr9Ɯ Ng` 6pd]?.aLo "ks\V}[9P;@IHӪ&Ik´aaeiCG۝Yū|f(wfо=1㟳mD`iy۾> t϶f,xWwcK&UX0^;]Fv\c6e6 %.wTGb`^k/`!!⇤ kY։TtY|mb\$J!m@w~h#v* C֑o9pR`A<Wc?NF|%/+[򕼌.$~NhɎƸK&B N+1M6&{M4g֏'gE?YƴJU1ϵq-E?8|c2!`sY,35*ZX/Cلßp{χs՘ endstream endobj 1076 0 obj << /Length 3090 /Filter /FlateDecode >> stream xnF_76&rXq`;F.h(pHQ~ztNC쩮͏"GVXXڣIf#z{%.Gߝ?yB#$Jf|}~aJꓥrշ'Ku/Y?ůzj /Rzz_7ҹ(in6ۡSX4-AtoYa;=G1 ǩޭHL' %< o"#gJy6C6y`2̳ G!IH\#m"~"HXTwG]Y9 p  ЌNWxYEN pS d$c"{r[f TR`?&S6^V- \\ <:TR,?dt_x$NI4q fbUcѤ&FN0$mDZ}-Eb04s>AwVa܄APC8uVQ؅#;^? mf0ޟ P L(:ƃ6=I#qPY+JYc>d;!W SQ<j| l/ վGƌ/~)V>xNTUepk )Gr937yض<%t 2CBhaEh$(# 괈A E\f'w:!rT߭J1 8c&.`a5,c`WƂLPez<6r>͵s87n96828 -j=(MU-08q=3u 0 dTCq]4rw Z%2abAT ҇{/>]JNd 1@,`R8/{M/ncJ*iVbMv/]5.&ԡSt,(0nUSZ[xxrdHbII0MP ׌x<$|9IwMtїV=#E:V3WJ'8-)RG{솛z )G J=uM:Cx? a`BQهxs|8~ 0ѬȈ 8 7iU89,fAK{ԁBxYU\_P\Av3TBu3cǣ~_7 JҠc2us?`1Pc,mO5z%&ڧ[5ш?M+ fžHkZ݇}+a6TUR滷d8ӰPG1H񆃣}Cə ]`+D\eM("̋{u 1$zT;3scE2#juVr/nV5E y~r[uWc9HGˮ9jlSw ogNCM'5]Cnص("/Sxb·Sz׾"?9#M endstream endobj 1079 0 obj << /Length 2377 /Filter /FlateDecode >> stream xZK6WL2*&$z;:e=6{HD"F$(A#yڭ9F7 -nH}>Ihn޿zݼ&̿?y2Mox$7+___Ů/ۻXJq]T}BGr/T\}84O~?J^0&c\L$UwwFF/H㪣kQCl}Ie6nk۲_LjqkoIUW?%L̰4Q7,)iOnNyYS~L$$nZk-jssɌfSxy #}af=+=1bzc \JS 7lڂ)&A)&hcjOףH$>Ô^LI?dqʲ!}.3wb_EU! `(kUcn =VL炖zb։bP;gy&2j6 f̈q֥0Sz%d {]<*,_5Nth_ H`dYћ~ߖ~֥b|inCח 4g2¸=$^hM@[dGZT?&\˧xTQaR',Zq@H-:Z7]Y;ͶEb{' 9_hѮfl1{ tJָ!%V!H06f0+D]2}[!vWTm.H?ݥYTl<3H#4<𯞒OJr,`3nvL[(sկγ<j!YC]lFDHPR Ψ(6–PʔKaіE_T) 8I{f̉bFj god jBfatEz#$@cQ[AW~̛7A'ݮX1DVl^50$%d!eeż1I V_GCsP2gV1ذ9b pD1G%QGҩWrڗ%[ Q`Lef.>Cbƭ^6zyl;'akuu*D5e =whiz-.*?]l&<7|_S]#eY ݨ3^`rLn3T![يlȾأl#[(ԫ2>C;$:ɹB;Q`ۚ*M q<XAW&3uEa,/d(V1b lTH_tQU+jQ5{ y.np(Cԣݕ:+vVZGtj:+x>ta?i ;['u4U0S5RHϻ< G45+P3$3dLlG6B̌-\іChQ$L=\#^ܑ-҉1gT<ڃv^1` v{8:menG #М1DR~lRW$8>hxh"~<U-$94+U=SH;زl9q,"t@#mckœID B4u1@FYQ8~L?$?-GfK endstream endobj 1084 0 obj << /Length 2472 /Filter /FlateDecode >> stream xYYoH~ϯЛ>xǙd2H&Ę"JjIА ߪ%ӱi\'ZDF߽LՈ͋ E'rqou]|"\ȘȻ>˕ړreL}p'nO6巛_xӟ@F?ю!ɘ82=U(m <\ !lbȤ꭭gҁ}Zj4GJM/^%@NRZ$6XظMlUnpwWZZY?[3+iap0v`8KYjh_N_,WoX{xC5K!>hbS-ݾ լtDRߊH\hoCV*qhn_X3LD<*+k@;#ؚ9'ʯ_)7Tݥ%±[Ox-yȷx`a>8>3m$P,Wҫib)jٿRi9~3OWM9iR >--; '6* S`?[g^\ùX)  sh6zCAUcy;Yw:-V^?c>LYfP1 @;Tن~jɖRlHu*ug-vIwb%|H+y9'?rprGs4Zյe;U%o+Y  -ƿo@KǺJɊv6u ,Y_7RG#ru}N<.7AUHMqmZіw8aWNΔ! SN=0-9ˁ]!BWPaKM^Ow3JI>uS̼* jG | s0Î??c ;i~<;.ΝĀHfpZXw2:ǷŤTSCcx.$ՌS1a8_O j'%N/xCg6ǃT{s\ e:_uXHV8Ctê'1Sq}|wr^/h}$^\Kjs0,)!+3BY1O73 6 r1㈾2R2Ҭ-FC/gcTBF/A= 7*j303sy[Sg_X䩿-P^UoC$2jŨuA@+HϘ2:b}Obfbp9)7g\4/ؔ&pdk.ZV(nG.E`zQg!]sNkggK. k@_a۩oZ[ EzQ='"ϒ<+p̰G=_ֲ}'m"IBEb?iUI ?2ѠWuB%w5/p决xj~Xs;uו=E+xAVVu$##z rK@jMikC4M, `2fIdQ޶*k4UB8TGzsnitGUQTKazjlZ u0pw*LDRMh,7qӲ_qps˅P=xVTj3==o lJS5 StO4,CYHkӮ#`j-%1?@{@&n߭:UE B;|&AҨՖj?fn聬jeW(jM1F⸷QDq4'J/*<߄kHk(o'Z@lCcmG4WݬT$E4;Z:bEYw ./Rca9_H(2O 7`Ŧm[?Risߒ`@t # endstream endobj 1089 0 obj << /Length 470 /Filter /FlateDecode >> stream xڍS]o0}ϯf6%m7uZe}iH hʿ%*Bss?## 킍QW!8_ G<̐|qM)XQS%z— ED)E$ָޖbh6X%ߵUFMʵʔOśJ9~R 7m e[Zw_+zGo/eNH6*<퍳ą&lL[4mEZmP!zx޶ŁiDb ?MU`Kh$ٍro']QHG1f)}iL1gwPiA{3ƙq|bsVr%Id@TkzvZ .e7W 9@n2|$F_q)2񸊧NNXƭ~{/K3!%Uɩ~ endstream endobj 1093 0 obj << /Length 2172 /Filter /FlateDecode >> stream xZ[~Q9)uj?$~ԊD*$ew{Br;Um"s9|̬*x%JTDvw+gc|}p$ëΝj[~$ĄK&oiML)0j3ƣofCha}U/>'qF4vb KD0gDD)1\Pm%eL5QYd:NDC^MWfU1S^nRe} cqW;t^'zB`8cY.ukC#8{Q}m~Pą"(arc“ 6x>!Ĵ+i"LfP @(J(v\=NW1[?O]hd9"E:iOg|'T"`Lҥeүýyu/)㏪z8l"?M1m;w>Եj̿ӬXBF9T_0*(7?'XPT03ꯂq A'M̎~oCkܙ+TKyg\VP {QYڮT{tP尔= 8>'s+AbѰ#Mþ2š2>lZ~fP6`Gil~]L8QW 9`S%ѰpvV ]]Ck~XZفZu 2) KC5a9K A(ː~"]uߧ~[,%\xNʩ` 9*ծ}aU0蔪ڧ;)?@ %$rCF7;\Q;f1*Q"32)ɺ1An2-ЪJ{THev颫OЈE?cE]]k+1x3^!hM3+BuUM6|=m(Æ H—O=5 [P_Xc'I3ng]@*b8(#1Ar9zQGU`C4zc& рJ3{xL$ [Yćy)*ƨ-!AWǰM੤_\ #v&M *S,>l7b3!E_[BͬcG@?R$VWn*#W<&l.(]S>~aSVjV[9ÝGLWIR~R,kd8ʭjΜex<+ՙ-0|5.U%v.cn] PjgA?p|jr*zR;!ή?_Rxa(!#Hr#h·3\c5k1 t  iC ^ BL9:<{/X\ARV*RzA1,)a^<lnRfWZ#mAcE| r?~T|2V^*cM +S å"6u[™92DU"pnnERoIu5GlRQUB\aDBLݛ.(?fS 8!HM]= (Ǿհ|d 9"VkmpR^x5/wU}I}r^b%/MϭslǎHɨjYI!d]0MF'BQ? Z6HjQS|i~ rxuI*6wE-Al 0]ƽť_I;]¥չkڦzoltAݽuN4w~ d6Ǔ endstream endobj 1096 0 obj << /Length 1872 /Filter /FlateDecode >> stream xYK4Wm! `Cwq1c/'!zղǞH"9XV[|0baeY,7^-óܯaanmg;#{BWbCL%{Ml];MEuUkrvV\*`:f[A(8WZ&p7(J&\6@NGh!1*TIJ[7@ySq?Ծ;)*$XDŽ~ִmR%+]> fqԘtPI`?<}eQUmUS?G2g29&p h"[RF~V:ݳtjD%̖v3َ?6!d3fu9Ȟ*Jp]i9 U֝K93}:Wm*'Ŷ 4|7H &YC38u`ve^w]ǩMTc4TV7=]9#ܰ4w_0C 4)xI NV@uNI>->aS7V.n"p zGA?N>O$DR&u$8B+_X4>@!T5o}+PA*!8q/4q|sA>))w_7OWm}{y 3uBu 7 ,'~3q[ϙݐ+7킯L坨jnvӺtI{44e]wg4W{xNrN C]'k D W*\)Çx+[ a(0NRЃ)BSLRBmsٽ \fu%l[uOwPO-OɌ$= endstream endobj 1101 0 obj << /Length 2519 /Filter /FlateDecode >> stream xZKs6WTX$A2Uޔ%G^*Vrq|p09;ʯO7| &Tv]s 44myD - lRܭ*=a#yqn JJC=6Q;/]-iNtjZ3v tWu\:7{5aNM;6 Ƣ*,-$ٶMXVӠu>$LmU]۽\:vUImbhLJ&bzʬ: }!|V$}Jm L 4mڶNʝ MmnB8Wj9%|=D#?1481L iu>S|H'S>&%vh⢠Fel&}9-򿏿a2d3{,lmVLv>sq1=3]b¾(n:oQ M/^ 2Yaux/"JBI@0<@>By4w' ,9r oH4~fK@2 8d' D0&} %gI  NPJVgIN;' }Ac,-*/ѣPP7@DrFN?(^6>C9q宲1{dט9,L$wh6&{,FTWxsO;̦3ϟh[WS<ʬq(8:.O_>H{+֞aW> ?c DeN&0VF՟|D6E]NԝƏu'|٥Y 'q^JΨUNSv;)j-0E,mW,%JΣ H9Y<̶k%FӾ:x49:<NasBó,%9c/U-,/YtLqzKPp*c2/lp~44.a5-{ɗ;txkl_/kIghxy;Lt S=F~q~q~y{>mqpbc ^FHy}0fMNuM7yN/(Q|nNuqwhsKZiBBSd*%KJ|{;s#b6"/^Oh$N^M zLt4 m *@S-[j2=A B3t{TD#pg < چF~OC}2TL]I쩞9ߛh{jDSvt$!(4|<ISx31>!4@^@&O-.8[Jlٞ&GD3gQjnvkOwԅlCJOپ|RptY{tEZy:I!PsPU񝾠DVp2XdPvyH|ٵ#ٻj!dq[֋_Je(Z'SXAP-iwiZ!x>̓2kJ,up_Qw~FM_ӧ35l ]$se[ȶ鈈_)-L4މM;1IM$RLS% _'۸&۪@`rjEFhȐϭڽ .gO7cE;㱮^1Tkܮ}V>K ᬩ]p4mNoOi~@mnmN&]xOAOPwe6{Ev_$l endstream endobj 1105 0 obj << /Length 2584 /Filter /FlateDecode >> stream x]s۸=O5u5Q2C]|I碶.e~ Hv'cYR2/DjM/8HҜ br7 ǝD*rVfʭ+|tf/5[.bߩ:mBp݂;}@"q(!ED6=-R~ 33D@~Gu=Z/'lGm}91=ԫg_ V~͊~ZE_ő$x\8w'|18;sLs~1ɓ<` Gj{[=.UC>usK4Bﴣ@6]U}15ޒipE4Qr qDyi7=W۶z%{3Ɲ#f R>Zh/kcK?nJmVo4ˡqbtۯm9t i w@wV<;f#`(k ]^O>zݝ@4N~2C7o4eYc.c]!Fj/,Q4W5=襹&*K2*pYl2jT_>+[FB2b]u74*0Q!R L4iw';0Q *lfL: YyG2S z4K^8"/ (]5={>8 L,5Ǹ ̸3wG,1@Db`s|B*'ĝnRwGD@ 8 iCʅ >8e>,|ᬷP^AplKP,F)l|rq(Pxf0H ?6OHɼ]X7xJ/=,g% ך|xo5^T!8s@ / Yw]˸bY25oW(} 03 q"+? {ғICH@76]eypp;8X /v; #bKjI_'¼rWO|gpciwL7 SK hldEz_ts$<8{kVw{ C ;aߌj| xiyn{/ Hϟ{ԍQ-{[ݒ7wqG endstream endobj 1110 0 obj << /Length 2441 /Filter /FlateDecode >> stream xZsܶ_!&Jgڌ,N*Oռ8~x8{d*dIƳr[Gѯ8Vt s0Si~D"yASc3Bp UO3)Կ6 9 I8> `EdnUje jPٮQW148iTC*(ă5&Pf"y&K2HQБka|*\]'QþuRSk(=3Wծ]̸SCniD]C\khPjflk d;;)Nߗ[<- 0sh^$ hQ5h(h(G|= }o8ō@l}kvT>rǘ&֥SKLB;ϵ@/\s|_ln' (J?zd'$J?3k+c+Gq+Q 8^u$zHg}*B:˳V< Nj< ZF<:TI83T&QYR;O8ISfytVC%Z8y5IsY e~l&]ĸՑhb3noK++[_0UjvÓS m(x0~a:qӲ)[gV+C[jԌTO7p`7Y<5SRX L>})p-i׈ͨ#b}dU0hnjc9A֔n X6PM tNs;N?qLavd(A/џgKx7P( m?1n䤄QxIr=o3ErF$ͪcZNZq[N *"Ȅl\?6{!V]rBs&YncCӫE?K&өtfe(jT㬻VM|S³Ew<< Ӌ_&Jj9_|w̖GC̃ӓM Qx 'e9G!Re{V=ULJaak1~g*e(wc"<N8T :Y &W yަRࣹ 6StU+հ*)N!iBn^8_IfLe+bV.R?M-Wئ_uUe^H E7 ,[STv(>Xqe;? ,ff}Io]({m)#q񙉾ᠾm~JnIĮ_4ηB}^kuWOiz̸yCaugQ8=OIJSyBx'{|")^3}8#/Zn#O#w׊5A~%Kb8O2ﱒ+khK1>C圲y]uk@,ӷ^ci>f $a](hVRgQJEE$Ad3tVnfi|ş(2q zi| ٘s~q!جR=,Ύ@MEc*?Fcj`rNߎ[iu_ t@?u<A--SY[N2Za?XuC^3`ӋдhlGG?5xoJvNw q=bhol ݚRR[܂&%)X{Quy11Favmx n+d00+vy:Hzx?}r0> stream xYK4HqS2,R{Ǚ;.ïeɶQ&X5r[C=x^H"E"?IY}>N.ؓ_q J/7ROzSJ#?\ŌZ?cޖ&&\2t7O#g4Va kά*nk]۽ydpY4M[}Y nt(o ZW`""&Qƭ>D/ cm'JLm1za!텞uD:ױB8=SIӄX *xI8DJ jªqS+XbDRy81&қm ^G1S<||LzZց zn|ulA&ʙ͜W=G>TNn2MŀXJpBLx&P{=# wg]AmWRwSȨ.S|g#L.ΰkIwjNΠ!L!听6vjНM?'(T!JR"0ًdPtuSTm2v;7EȤzjuyw~],e26 @S*z ` q)q ACV&hΔ,zrqdOo~ykv¼!7$Me Rd-{C{{< [ E:Ǝ<)sIwmlo*lv =#8"IH<.7ACv };'v,t+7ƚ>c`H1_M Vj:?q쀕!=FV^ܗ#5I5&\ Ħ܅R.}(Jg.{7+%qA| `y z v_c:QElOkXr;aU_ÚY K8-tSZ+j vlk3I&8?4DnЃۄ]!ARA4,S:%'SDP.t  5,)%ѠpOc/ڭ˳5䘋ؕ?6rpl>WWkۛK|9M16X[kW,(@ OwQd ͛?0͢>ϖ2=7kin3~P`v07\2# y·cJ(l )v=YT|462תwƶ p]0Xex &1XcH>agqY~;p%  DՐ{eKg}t?쪎S2!w=NbWot _ endstream endobj 1118 0 obj << /Length 2245 /Filter /FlateDecode >> stream xYKsܸW&  V|^YZks@V;_hCrKUen|E]*f*N/YhF5~~uX|y?HyCIݖ^m"4x6q\~wB*Rwu&+|goe$u9hF /ZwyX)S1fȨ]T\聤D#%S"s1 Tfyi X}ջ(\ZSSu$TRz9lj4#|2ism]`@vu2fyMU <0sI6W!N xM&cI6a .>+E!b|q،Ut'0(%i p{#sȿSB] Kͣ98&eʼn̤pvbi ayMCޏ5Z;7Iv3VU[ ͜>e5{+$zCoѓ>Nc)SN^z=h>qGǙƘXW4hV`K;Z$ n8ň˅x7N mmMH KMzr&Ib"IpJ='Q%s+C_bŽYnݩ ukPxǯvw×.l JakTnc/ní?nq pky9yt8aHR|ʪZ{ zSq(tuI{LԱCotI,L#)1zO 6mt;ŧX@S1bXad׵ F'M F ;%2xNX>j^bz7vve$)qJN|П'켩w]_\ .MtǗ< t.]t٢.P,olL܆m92mߜ{~&\bx}K|i, ٜ_~`V endstream endobj 1003 0 obj << /Type /ObjStm /N 100 /First 975 /Length 1662 /Filter /FlateDecode >> stream xZmk7_=H3h B^ɇ9 :G}6؞I3g^]B ZH5P͉X˂/Hȩ5(\PR 8A*# gS D&NaՉ9ej 3Ś-`,&)Pi2De0?Tbp?%p2(pn{K&mgsBBƂjc@|' % "RFD|9,1GR+6KPPY6XB˜+kȹUFWDD 1Fa^p?v/T"$arc9Hn*ۨDc  3~Ŵ iھ,1("P!y)(TT^*֦y >huqu%Kj6 Ea+E} .ZXQ#V᮵3g*Oces`nZAiiXP:*9%HO@FUAjʎK[ J8TuO E-:U5y҂Ml]Htt||xN+ԌYXA_=zԦ8,Nm5 zMi4V/^Ξ/4,>9 eK|h,חtGgNj&_o޽~N#J_A 0 LO7yJzpxxp\Ftk]䝮Mؤ3v?n|~yw75g?o|zӧOwguxsв83 B8A+1 <`CLuEvv-?m? kiF8`te=z; Y1|1xt&ʓcjOIPjQzyg k\ /mpV4Y{?C d8`sS?Hr?kdzd)Zոe=R#4"Y-Xl@r9 xnQf4@3xe輒L4J  )q`D,/n;Ѷʼkjv~khMFli*Yf~K]'uⓧ\'kbD9J]ȕѽedAUO]w" H\^t-=d>;} xs\%A q.v(eJIA)e!m!Ӂ(T%wD~'Q} UsU;R7c0vt49 T'{^(3zJmN3:;C}'^~[5M^J]:Ԓ'G@I#r793J1AntSCؼfsqX5ϳ˻Oҽ{hN`㜠cKJ]mJ~2c`ׁd|k{cwJV,y$6=aQhgjF 'E(o몝w7뵾aݥ{b+(^ƼXcGZU~x|cVe<2&,Q5nAتg{Uc> stream xZK6ϯe`R=N242fw eÒ'ibz5v' b}U_U9 [HVHX^x߾a &F3yoo^ywn7ٛйr%̸jRJg|Xܱ޹f Ҝֿf{)D)/?7}άJDa"sε%ax(Nd&oQm4ݺ3Fo ֈ f.iK[rn64ӌ ' yv(4%azxID \TzMޜѾգoMp}ZzۇQW3x9FG#>)Y` \#GkQ4z\kt#kuvFtxBWdL9hYS%?C3&E:g<ۗ_sJ5Ԅc19 F7O=U'Jki:y_/="pVdeqQw4&V?)[`SJLچkT8#yGp=.t n 3dX)˩?%kٙkgX{CUq肗M y:J %3Dœ[ͩ预<=Ot|kp7Nr!< F&I$`˜K@C,$VGPh$ۺcOrsk!jcgZLFDY$9C j߼EЋcJNzjft 7Х Q^ҁRKKfꮷeeeGś561n4nR)4PzFXbeO|`O쥋փC-jDΙ3{M T֣笇˜C`u 'inpi-ʿwU/,Q*coקW xjuQ4{P9 G endstream endobj 1126 0 obj << /Length 1862 /Filter /FlateDecode >> stream xYo6_GY[jQ`XlˀomT[R*Kɲax,r6"DR~!I |b&%N۳ح֗{?Ϟ\h=1KO!r6Jt&Hyb]5y=I"nNgJW@Dy]lr & ^fMF?grS_^{yL+@;# ,hTFtbHn蠍~(K"kPC%Uf2sRA^L)(6{b`̄sjNubڻ Ȁ={ST,e2q M{wVL]S?5r KD1;q#g&S1%%!1b!Y,"|.g\[8\&k"~Q`漄I]h5TnD͏Y4MXjͮy d܂MpU# .ZhSh{7/{5BUt.5i2G@iɣGzV tWlBށqmi`˶W|c:\IV~VMqUmf(݄ɛ ubT(õۧ{@6?n&<';E8g޳9c=[܏<@紅xE<c> LY`;Tud(BOO˪P2%3+ q")'b˴LkJzE~?Vể8qqt|p\༴Dukhg(IuY vzGͦ cѫOmq=L(՘p0=N9TptG0ˤNBDl 7u4\vfEDU޲bȅА!N8&p΁pp:$"` @LwHz*|~N2`p(sy ΦJqPB}oI*vਉ uGNj͔JCτDQQ2WEIoG x/sWr,dxa+HvaC~z<#ñ'٘Ig%C^>m(vA ǃ¤sW匙d쯒8y}9 D̾86d:a}.esȖ}:FsKe߄8ćwI%8E|~UOGN1=@6}v+ a;3,ioye.)(Smo WتCZ_qtr)l}O+l߹_nM9dŃbs&EWCٸyֽ^ű>>,REo.:ߺwP,=jB2zPR6e-\@= 2Col:Hq&>Cm׫QX "x5Ԋ4pQ'BDuQ1Ebâ?)4t`q463p{#a :,M[~S Ca2k+fEN+ԥf7s]¬Γ0ZDܩ+FaB!]HR*c+%8IC7uv3|[fƢ GEoa~ex\l2)lR~yh+DvA#]}f5 dsa(VuMAk q喖6 8nwGr]baW,qn-boS7PU]4he + endstream endobj 1129 0 obj << /Length 2251 /Filter /FlateDecode >> stream xَ}Bhn@$c8m8dkEΒڳ_hg9@jV"Dc7:a"&?,yw3?|ui0'/6??di;!D۝qׁiˣ곊pV*{7(B)k Q7)1YQLVհɴM5"KX(xrM}BѩH*3y?009cfJKUؐ;:w +0,Ir3ZfI]W3-4x(Y9pL MM'\blYB%DPK1Tj^1i&oĉ kuOk;搝*wmFC?8 SxCx -1_)JM SlYh*pК'SOciۚК 1[әܙ Nhhdq/o$:ہuSv݁hV`)1 uMk&d;.ʏeAIL?Ә3y'֭ppF>bf::{{rQ߄4mԣ| |Z>x_߸:U?<}8AN,$2Ɂ?b/I  u^ 8 gǯ'\ht B 9PUJ/3*@{u'X B;Ӿ&"89qSV=PjX10P8ˊ 4 Ϣ[,XC9E ǡ{Сőlr)^%0G{{| -C̛c I/Yw>"*Z}>'҂%k8V!=AE5 FYY饨̄),=HV!W:hO;|}[ԔXwßR`+{a KH[K3:u .TvM7q;)T.ꩆK1x 3 YpzK2iń] <,hvA(50L@מ`ַ&$ tGu($gC"R ֎ +v.3e.`cX:,[AjPi6n)?-Q];=JNJ"r^G [=y"5!7_C(ǖB]Si3۹q`eY JAYCd4Yq<>d׺E+xj,"U^κGP_sXS6sd]nb4ym-qW:[R(Ll83ev͔&cB5V(I/X͌CNčјbFhLć$ ׄ^ϩ쉡2XT4Xt/bSHݡTt>Na~AtsYjW*UX²`c}Q{ͽPg?[,KQ46|>нBP-MGl} qj3.h©=F|?<:`<ͣi'8:iL_=l.I57z+ơ-3B"x"d{Z=8*P'|EyWQ/sNYҟUƂ^I3OxJL4s٦Yݸ2‘]<zhZl P+}g|ѭ% $\}b8ãTyʎ gXfεf: X@!py.dy+.^epx݈5 )-m{Tlxm+'t9ڱ0!L ]^XfVF*>Nú瓑ZVD_/8 ' H I/F|ģz?0j"/t]lGg_m0 }c܈l iX"Džs@9tvFO>臷]:8Qb_Xm+ endstream endobj 1133 0 obj << /Length 2670 /Filter /FlateDecode >> stream xZݏ6_j#~Jk84=yPm"K$'7ádf7I!X,Lp8 g8K32-ۮϨq01||gEU [<]C<x2 nSo;W_2kLw?\0]F.b:Ig!0Ōy7B{ 7,Qjnȯb2YlhlSԵ:DǑ" ?\?&Q|bɹQ\q]:Y)I'-8ÃNGD#asm bt[ JrfQ7:G# 7{UHX"mKJ sG!LYX.)[d|V~ >Q3iY]']2xxhp ٹO-rq6q#i# S Z'ӻ .Pz6@?b;lD,mJz>|{R3qPChs ^o\«hQIk&'֋BJeOEf)EUhEx5!qi*_R:s uR* s*(FQgVY5xP@pڣ(ڙSN96F fǧoJ#*,=:ert*ZÂ]7+UOϓbNL@Y% ]&6}Z{(UɊ}/]+ȳWЇIlݾBB;uL$SG.c.)pRO%EMy^G ;Gv{Nl W]}ķ0%7|(ZPUvN),94@ > stream xXKoFW; Ph)ptKr`@"r)Q(|Xjw8Ōß99sbr抇~F]V.x 13YS1[ U-Vw/ٶeSb-t(J| ˪]($D>|"a݂^~&?Ӂt+NYj"9Ex3Cr&>̋uuSVp'a1;aSf]r/9 }rE}{``"m[ ݺɷQ-uQYx2yׯpRA* } ttt%p [185xC*jf~։A:qb#A7ɛ :+/h4b' 9gOPn\ׄf艶l(4Sg A /,POj=MS&v3$nwOiEf7zTf_B]2Q}5R纮Lp:8}Vu0VϾrgԎy֓b[B2czsدP/J>Pڜ`~;ʝd.B)fmK$0+5@M%c~Xd1(I-ڤJI Nzb)2}bXkؔ8@;94G~0`˲X󐚼Bd㽫N  s^3q5nteYUziV Wd5炘t ` |~[gT;@ 6=]xB?0lB kC2jJ cJ:`  c1H:Dځ3QbՋk B~F/DzIhA_(P?\6Rs'a;#{t`@W qy :ϓ.W yEÃrWPz[2X8\?ćhu5Ey4@9|nHkf/zEC;0{B_ܩ`܊#jqu(hNi-5n_}%Y^2HM$y=aܲ%d/ e=- 2K|ם}Y.Soon Gj endstream endobj 1140 0 obj << /Length 2439 /Filter /FlateDecode >> stream xZs۸_7SsJ| 3̓4ƾ@KF"}$w RYNҴďboI |bĤLG{Z_O_q/7@џ^$Ʉ,3>XLFDb$zz߶ΤT73Tt~״vetT-~mQw?>z~ћ%J>NzhF&x:f1ޡLg`ܔG>}GJ TOf2eN;m>'LqJOfB1c2i*u9w8(W',I܀NC%!=L^kB8-;.^yOqP jM1 ] Td}kġz~lg {֦(CJF:g*bJЏ$dYP$,#.OXA|ޔYL||ϙb|xDpVw >*mƉ^̃֌<k.[ 9yl;l Qt|޴*o-eɛ[UiKzn.~y[>uDR 1!ɴ4IȶTdn&@Abc5ޅ[zA2ȲQu&rTLv§akxh/"f!m->T`)R2 t \h -sh$b qc ^,@(J Ѩ(olKb򢤵 K+7ڮ+th 7WvV5}3?2_6,4ə44/n<,lSvAS /eT]/MնY/8 36qʠ}&dۂ1>JH5xn{0 3.i۠^i(fYCvVm+_EJ9Lb-X2}3 ݌4 G1nuGIRIEdi~JA*"~X3K[nޏn> 'd`mXuaJmneb.PE5kHrSciEnᅑeUhxJn Ⱥ.6'$vF]sowtQ _$mHTt&yBGG͋ `wPm'tۧ<؛n0;Di'XhxїKAW8 <{_Gzyy ,fbhD?՝sb\m4PԷoGm;w|~B3dp-pٿ3;د)ʫ*h|0>YU7;WK|KL~Ns@9,;'y|Ђ):C9t U6pt9s]QE S> stream xڭZKsܸW覑KT%ƱǖjsHrIje9!9_n4cP3[I0 !~JUIܿa{Ez] g_|:x0WV?6va@J7AśqMUw7"L?CM 4L6Yz?޲ő_ Yx {qDלiQMmFy.7Nn{lf_ndSCOS]O&7ߔC]퇪;O=싩wq.9dt` d2bf͛pcӺt]"7IZH4NYKՒE ѦIEӁ%IPB8̀I&niEjF45U/Rvd39s':NfPvt@Qx(J^ßH`,! }$2@Ioh.~TL٦.{խ`,V^YPdTqt4bJTծh'NQ Y=@dKbKgWOz(^Sur/ a^gHf?=;~ d!$aqjMsį-o(p瘄O 2qW ;"H20XN4L;9RYݵMb_+Q|N SӪ`E5eOd4PZPI[N adƐmX1Ox'{ԪGIIJeXOu*eY H?jB~!ti`3kӅ`%TS3F B2zn/ߏ9ofj~EE! S?`FC&#0춒\NT GJQG1Vbky1Xxh#v0zMYZfP2koЮׅʻ$Yv_50A{q֛?;𷧀LRUœZs `u(q9{{E/48jm<OlUPJCCiR;o'lPab&!&|wyޥ>њ j{w#5V1W>IՔiq8pW܌pyý/ {YY ] _].AYH/f Y{;9KttiRyv2?;J/:ZJ*~g'_v¡vc$eylLB7o:LbF;('Rd(%OEG5kJr*ԗ;*t!A%d}z+XB58ϞU-LpTD2lF/}rB2!sRwhoxqUӖLH5_Bkl]>˴*]rH,0C|JK`ehq?@_we-k`#>-\{ڦjuC1f~m}K3(jz8wm1@TC~>0i* #jс&^į:T?LGgiL_=kb4>|:-Qr{Y,4237Z`oƾ=*OBR= `PA6 p ¯ӄX #c RfAUnS ΁Yoƒfh(#n[P@5=3,oW5%5pj:8&Ǡ5# d~*™ t:"b8XI [JL@v>q+Ub&,Hb&`<`f M_BO= wv dTp(OaCrAztQNPN:XqyP}h|dAϣ[WzB,TƕvBXWPr[d}݁t7!"bMpw%ȾxlWUb-_u2N-Y2,۰YA `aLa]ә˜hZp^qQtI׌U &Rq&j"k ?ˌ[GV-؍0S9Զ;SKpnO+&gŘ#U R$*6i4Do0> stream xYKs6W&jRxL?NO:(4=q">wA@4)C6cˍ; \`]~XdGFfH35p<_ A0HL~E(MCM?'! tדs|ؔU2/Yvd* UgHp6V. ZKDI%‚[Yjl0)uI ,j+ /,l>/ucץUiM=ztPMBs^7zRV)u# CĂ'eZ$U\0|yQ UQ'/iȧ#t{e9@ܯbLgU\/++q=2u@@t82Iu]l:nxx~o V1q% q6(U9!A]{<&@;D nD\ZE_ #"Ŵ2B9/Vw80LgK"Gq~" "CF!F{ _y6ͭ“I(pP Wk<`.D(⑕xf8A|YDI',@q|Y"CYe 8 ڙ'8l !Al>HXo{M'~fASNcAoy9(ϝy=%븻|z?SZYZ+ӂӁ}P4pZずz; ˢ2rtiX|,W8{ԖoO09>sw~hϟ3۾t'.ܴo;(4f&T!方{:moyO޿q΍ON endstream endobj 1153 0 obj << /Length 2591 /Filter /FlateDecode >> stream xZo_7Q~+ ݺv҇4IK;[tw|f""i&Y&Ӌr,o->7B8:'rG,r~q{璺.~ ^TW2WRqp0N^JdqUSwW( ߟ""fg;~$t B+&U"fE¢XU&]WEh$<5poP80#3|G +s>R3gG <ǦL"W |?Gq@1?Ta\ |J zHxxE}6Yr q%W>MiX: zrT<ˍ~7(ON"W9K %85bUpy 0]UߍMs'"!׎J ȳXѮ!,I2fwz'A14ŧn&Z~@pb"qy3Vd? 0Dyw== ej1Xx_R+ 5kv$z߶4Օ") *Y\1٥**zzUvF&â{l5Y2bE>ƃ*> ƅ=Yk6*HH'M,M]xPv̖ #38DGªf|wx{tnq6Wc3hf6.9zDַE1G>ZYeJ|ԑD1y5z!v1R7tuucAJԸ1܌tNn%jݏuG.vfjʢm:EY+PX4j+cNAȗgX׋XnfM@ݑ8u>x0opʑ+ %_?D"~h >,g89 I QwTdîhr?-0OwmE:A AkB )ș? FdEG\>riA6n9i7pT拚 /0ga˹R#E3M ,u)1sO{ 9E)VPJ^!Ajp$S~] 2!9+o m}5S+82XP tIcЃqdI[A6 +BXߛ<43ĠX(ciI/Ydpz)MYF4`!P ANfV auA%>h\;Q̩ ?Tjtd}37xS€)*.Cs[=bFyl ~x8Y"f`ng8͌oκoػ܇~xyWoO/ms ׷o/^3u$seT a 'v< cF@N1^Ց+9Z:m '䣑Y4CV"K!فml#r t}1~?qg|v'\$̱OڏDaձkjaLIJI @tFGMVN-RWSsp8ƋڛގG Ib77?p4"T' g )0| S4s9ⱥ3 5XZ4ӫhɒ=;veHS2Hixu1) [bBڦg&]dc2Ϩo+A endstream endobj 1158 0 obj << /Length 2051 /Filter /FlateDecode >> stream xZ[o6~[ux$ې؀˺זkl4~琔,9t4κCx9F(0$h~Fl~dy'o~Vj(iFewbW񄫐b5VI1!~;H)7eqRW$0ҷJ7~"(b ]Б&,5&TI+Y13俯 t" dI1}GA]€ {&)t ݳ͚;,/<)xc\-n2J'|OW:0AbV~]:D>;$dCA'Š""OǨzn/JvwA!prkW8uXk ;6( Ɩ @BY=aV"bc7e(.TgkCLMs*ȑWwQ'F~զLЅId:]fYCYRx2r8`| 4rzLIadVo'1qrYg8Vƛ 0T"c4(Y{of VZDcm,$aߺֶ,H,Uv,K\ a,guV{-t1Bqn6^&E:>6! __y#!""lm[)Yk|X^9`̘fq#A#&<ǣhMdlW4w$[Ltٺ0ƠpJtq>AE¤} rM3Hr\vY,k >zdi4^4 \n2P8UQ'BYc?ՀQ_5Ӗ]b9~@d;Md &-4D8 =#OW.򜵭+\.qꘐyd[JbS,<`1K 9A`6Вi%dtI&\ -`dHI[yμ!fP.v1R/|1BH{2𹗡6 ϡHҠqUj/z  u ko= *"dZU&lm/r͡%Lm;Aiks]g c]b| J :! #-:R?r_n3=%TQMo!In{ 4^RJ=~OS6ȑ rG #N1_1/xb!>,F$Ǘ%1v;eIY ꞟ+\t b):~/v_}g 51C7 D ő8p۽x> stream xZYo~Л8 >xqGkǖyMR39V~VG3"&0fuu_E/")H3N2^'\jO'x4"yӋ;mus|SzXOWqps?NV-^WubY05DT*dq%ANWoe!f1?_)0- 3LDPLӔU',T=9E~~xJuݫ?j$cyfh(D])YlJK~QHoy3-MwidyBÑfL}a9%#ySULܥt " `NIĝO4KI('4ߧʽ2M_磁RO[f g6n7tIIBZGFS5NQ 2M]!C1ID@1pcFyaqJ4l*43+{%עІE ۺfJHMT35VSaoF jl]юwPGw,A &F 8SlqNv0]o J1XceJ+f#be@'}Nƌ.PWW3vIvVEe6~7K ii%jӏb?b&NQ Y1;;4ʼCѕ1U'P\Ke{kv90ᑻFPw2U͜p&suaHB"\~饶/Rta I³`A $9LGA1rRȑ vVj"s],`np@vbE"}6#̎?h.|4r!4:Ǡ@1ya9ް 5OJ2~5Ptϯ^#,!|PΙG>#⚴KɌN]1"Cb+:[GL)sV|O(KA%=XW^cyhj`ʙP0ID^î=vq¸8%qJѶp'P2 EG3yhx^P*R D|TJK|`yhצ }㾲l-+ഥO V:6)VPEб],FCm=='4??o?C"wؗ#6уC¸`Tbt׺r.W^wϙ6ҟW'/Ũx@gIh뤻۵ FjٌfO 1'wah57Zx" X.=y?v/=1&GalfXPNfc)p`>1G,IBm|94r)*dA `^͗mUMZ85 +P{oj(&o4Nͽ,ٮeB_ㅇ VS_{Yfү}^ŸR̕~3r'7CѣمG.>8v<Ħ XG/cvRyw=D~O|sS{HeA_+%>8eaި:ݾ5&V\4d!9-_>SpN?EBDjwnBXOh!q>i(AC/}ԃp0pU5 x9 UQ]]I\#L9Ifwr9hkl`aLMxb4ljrFXND;BQd:#֑fTfNm3u 2V ~ŤQ AD6x$l5ɼׅLMi&;t~m&M`ܗmIB_S ܯP endstream endobj 1166 0 obj << /Length 2047 /Filter /FlateDecode >> stream xZ[o6~[ux$Э؀˺זkl4~琔l9t6Cx9&II,6ONOO0><=G&l2[.5[NR>2TEɪi,zK)W7umpRDϗY9&jהżɷO~"(bmCM5&TI'Yؖ32Dl@BoNꨭaZm+GMm˷nMXmWȪ|dTEWGOh5~+Lj!`'SR$_SD WSTtWSyP@8F91z(:-\^5A[c L_m韰A/-][ LgaбG!sJnw~  ޽kt{7^o }X8I64S**ǛC*c<@E2u*+Jl|8( 9DF4tnh:A3n:6,[XBH¡umYovEț9Xfk$2[ۢqz75g0ҙG.l6LJtz`ҁ,|Q~g:"S^>#$'K5 &$A%FJx:Gсԛ*+` [yIv5qwP\vS8f2%AO}AC͝E¬v}*[v0g><y%mZv)A{2≓uyuN \m ק&T)P֙N3`4, yQ`6"C݊ m#D(`~Bxum^gy p:2[vVn,zpֻk98*ǫcC~^YQ~9+*mճjl.u(bB٠BǨv;BF'4!h9*y@$= 7'$}/h%)v?_,da >$&7u: 8(4 fC3͂&l!Ns `!N_u?J4Pz /9L7D2_eB2I5(LYVyg0J/Hv[lj,N@$: J奀4cY},"L81!SBe﷧Z~PהҀӔr$|{ #>NP1/l\1<"CͿ! eIM^Čʒ`Ws'8l b/?wps Ek|̂yL=ʼnz8P"@Uá$܋9ۿw<Z}.Oڿ6m1OZni%ҠJQ5|$%IcCa%GWFpG3"L2loUެ7!A ~3zⷙkSҿċKw?ɋK7s[5Y}ӿ~;` m$M ϕ !>ni8s:?j½~aX,p5ror/ endstream endobj 1170 0 obj << /Length 2034 /Filter /FlateDecode >> stream xYmo_!+@{/]^]C.yHI,)J"m\Eڝgfł?rae݂^~a +x1 N,nnnOC˕R*Jke)(7U2Q{Xޕ2w>эW lnɷuOأ䷄*e\J!9JᘎEベܙ^%C%al|H369'ű;t21.C-,Tw4a6)_8'8RPY,TUdW )ΪF슎"q|@"g ä !A:mg۪.B#_a.A}*ӶX9X 9zxN;`;hN4I%E|KDMZֈNvj%h)HQ0>I,|?DN;Uƽix+ o}$Kv,tv0K_a,4 ØP#9lf 8Oj`}S=E2 M8X$ו0C ":̲qX%v *J;p~ 3ЊS H<R'ݴy|2$;H9&m DMM${;>sۗUč!rqQ o]K B pJ(fzr9`n( t~QvB a6'BdI@i&)BddGb$G85XED\x1lj`>Gy}F>[H8{I%k2I DHF?uܜk=Fwy}ĮQyd@{fiͰYSZ'$C,տ;>ʪTewi'nƾqǕUd@#c}eE ʒ&9RY!)T@O[P^TY/JA?UV?VV/3DaWQ>% ni+Eѝ6maSEx#Sxg]kħExFMJ⾇<# Gy.{ &Sؽ•; ʰDCvyK<3_sAR'|߇͙2Yh*3Rx VZګ:V{rӄS`Ӡ$b1xY jwG202ԽRZ !hbyX^_y ^>sP/EMS̿J♁ g\#:l v9kiܿg@j endstream endobj 1173 0 obj << /Length 1064 /Filter /FlateDecode >> stream xڭWێ6}߯ Nnh ,8ylӎ YrDy}$6ko 6) v8#I"(RTFM=m֑_ RL'ny33jjc͒Pʳ5MRJcn1=&DƦ)|i埉mA<6=#'1H!b eB')$l7v7]WΙ(%i h -XWS%T랱xU7* i” *h4 I )z\5"v0?wgv΋Ge]D!/8DEۦk[o1'rgBBB!/qcJFeDJ=ƬŒp1Әja %0*:1hb٣,1I*4·d<#5<*- e>iI!&ua2yߞ[>4"gG̀!b{Yx8PY6G^Y(Jښ 7si!bw(*@;֑ 8`w%9c(gSɮ'BJʡW!M/# "XʽbKPb^}:.-jߩ,YP8G(~F̋vZ>Wϭi$r'&XRNK7> ^_Nu"݉p২)*i@ ݉Xԗbqj<1 F ib;AP)td (N*3@0R ŢBNGMQ* }B\4::{ 7W9ȴFo`6vtwYWƯK{?/㵟 chݥ!}DF_;M")70!* >uS}3A5$S !~HLĝe9Bq/'=U’> stream xWKoFW=Q@I6qڋ-6 tINRwfgU /w3H_XdIv-~{7Z/x²$jYRʈgX)}xZ4*mo n^,S?<.c'wuš':2^x~_N ʹGF±ek%lk#1)X)~.hp\(&%Y2c>G/"l.[TRgOI}3YVcYmˌ0QbB33/QyZ6`z6q\w9:!qOfƎ <}5wͬY- ?LU3}f/ *[fGLL뼛s"1ʀ͠%f}W(_嶸&wx1g:_bG{d|/JyLs C7sv 3Ǝ숃v`D.1\Ȁ4!Y"(>D̵e C%㚓uS~ H|YKu]AҊ*'t4u}KG7-\Vu%wjxUz||zC۸oL[u>ζW(ӟ_TvԙW~C1vMPKsFR4^f9T r|_@fEr& bŬ%^bSTuWfNPP)&3Eo,Pa 6, .p͵$jq[>Uhk;W,QJ [-E9C^f{𠵻6o/!?uS>va m[U!O7H)g 7K|Y"ɔǿXΏM*++av(0j=LpQDT "eA{Hl*<$x qAb!1? /?ũCY0); 8GJ%ήHF#Jc+ 3@&M^)YyB ~a1-ay2CX~E K. DW8jx嘱dHa a9!&p'WzݽDHlOL/HRGR/+G9pdQ^6\T@I|5&?DSchPb3OSy_r9 Ё((ކ̣y .sEV@/0Wt摗t$]Q \EN o' endstream endobj 1180 0 obj << /Length 1181 /Filter /FlateDecode >> stream xڽXMo8WT*.?DQ {HYEomD'BeG;PȍE3of䰀 T*H*To/[mvFo7Rf,XoE1̒UL{L!W(]榪}z'$2g TPd< vfrd", `poLDpȈ6f[}t %N$KSf]Y2ALJ1 EDH(+W(&r&myQ>&pVby[~k?*b_\Q}l*=hlZ[x^7h׷ki+sC=*91~!`#67¸eqdn,0i~?> stream xڽێ۸=_aLFbFI]Rl4ifv] LBd {nI`L<;‡?E hv-hqwoW?xԂ,XoǨ֛ŝj]/WB/_.WR*d(RWY8"/~zSbJod}a8搇 g|%*k/e%" |jL:6!P[qhwٻi6kh} Ȯy5s]wc[մ(RK\FO"/EnN$, 0^{[W I_L"@* j?ɋ7dBeh8b~ |&o F&ȩ 4 D, C{זYW%`#![D)"a H}љ#5)K+,ǜ)°G9Fd1|MFychs 95uN)H#6,YStRmi?/7Qod˝eyO).О"ϴӊpq&TD~鸚C?{bޫ ^3ҧJcCqxKa c?_WWgw3ځX;k;\ qCa(l2̒{M? q@xX`/6p"Pċ{,AR,n .edq)"@D326s9C$b」ѦD 8员XZԏTK1#R)/͋p߸ Ver%޻k .J-˙8n|ZKwVn@0l6bNʳcKd:1Bθ`wHXM'Tn߿{a}_3 yIiE@Ya,Rj13` Yo8ew+-73PWO8#s)< }3[,4tZsl'g#Wo*~xRxb {W,5-5Ⅺ|p'i/wݾxZgǖ)Wc #\H`nW#3wJƪ᯺_-2<8uI@07 ʏhʵs1.0o}j2Nh\1W<@*nq1-<"@$}]Óx\qG\Mx ڹ~rw gpO'}z֘fF$R7e mkENK`ʼnw:$>M[Ghc=ՋmPz4ft}gHQkuM$ƭMdeC+3 .G3aiH9ooK8Ga< 3i˺qXGA/[/dH)!* Hwh'#-vU7Cw˶:p$#O.oC $߾MA[U'6n2!5n2< .>?L0COe91Oys?> stream xW]OH}WDm+[l EĈ,C,+ u*>lm29̹w2: BBVw#38#6·@+]H(ŷPr4p0 BϕZ7I5ccsMzd*xOPg/$GPn3$2BxJ7$E&䏱 ޘfV0㿱1=<[f8sxLU }=VIzeZpQ#$D -ys0s>8pLG_j_qjZYo8FhSu"Vl !z~IbZrZ .^eu ~!^Z&ȠpIDdS%M.-!L7AbXafG:Q%s O av#ڠ&oy63##~vo{!G p5{6DPB{bPYb"z0rv J#'nI/(;oRѳ5ͪk|7_<@[#P0`_*]گM*MUL2TSV]AO eTw6$?^OΎM?N{ݵ*:3^'E-JXJ]eǕZujrU-vq?=1ݨjdR–UzT̂D(\b`o*Y*IK1ߺ[["qMI*iV*<"KR@ De/'gt512PyULf>嵽{[3OiQyNrχibp(D@& ̟%KHpᛔx`}pPϽ?N> 9{': Yy֙v:nmko?-@w ?2oӯ/ogg endstream endobj 1193 0 obj << /Length 1380 /Filter /FlateDecode >> stream xXOH~ȣ-eR *w; z2&9IIډM{8!;;7c):R!hp|_H+`ԓ< 1"8&j<'dY2cˆsdYbUձRA_>HpJp>BGHd8 @v5j|i̓0Dq[ܑj΋(YHY)&ppsu淃s13Uݔ{ߞhmD/v`~Qݻ&XJT&G Z.DSDmh V6# :% H LVNŐ̒Q#eiY'uZifn |$(a4`wT{q1@&9N_!Ңq̓$$Hܟ,MR?=. kcQL&=s1:v{NؿPZNdVOu :|D2ۘiB;jݲ1i#8p!&ݹsf ƬtUF$U'K!DOI!aA9QGVR#!ɤJ Am\BVG0դ[!"=0)ǝ&"}8ў7Tsvw߮ FAdq?uA\ܧ*F'<G)lraBDTyp .͗j/x[Yi7^(WUInH@;1̬C!ҽIyf2-yJ5M!`h2'!.:6IㄇQjf49t>_LE0+rK-U4F,李l5/d+蝾'Ot&DUPEf?to/%tcS$9^kc<{g;a j_6ּ78c푿$0iPmY~κ*0.סFȽi4BLN̜7ʀyQDmLv>jH{xH`fjRM2YXm]ΥJr*鋄yJg[!h ?( endstream endobj 1196 0 obj << /Length 492 /Filter /FlateDecode >> stream xڍS]o0}ϯ𣑆sM߶6 *@΢:PEs=^CE!9\m(l-{bH\7cgG*3d41hM\<Wˡl|?;sZ?uQzwt endstream endobj 1202 0 obj << /Length 3165 /Filter /FlateDecode >> stream xڍZY~rͣy9Od؅1IA6%5L  ȏO]$50Є,eyq;nӻPa~ǧwN]EPÒSryG|q}O[ݗ ~Sqt;h , |ӯ~zr%Q'*?ٷ!;d~&!J{q%LJ}+@tm|ߊ*L n\e9 WOۃxOVF<%D A8\.[{Ý*.@LI |bVggQƌ# ̐X[͟ʑ["o_r#rRwr0$ olۑr=oApz#@°#, \zԣͷ4Bdz=Xjnn "gIm}s.{7hNk&)؞%ZA9xFAPZ9E=lHVwӀO8y %EJ̧/o;TJ"-6׷B[ WEPPX۷k ( =0r|O-7no]ި B ZFcd:OngPV#x͞GaJjt"[_-Uw@8"՛'fG @k6Ƨǯ-yu g@AAj!q0;VK$ΑDHFB1 108pu] >xR`j"7ȷ- QLK2X(H6b)2I ]1K{랮l[4380$g@@?5DLE(,MT_P=Q 5G@<0B @d73=rarz) azO=^F35m3c ĊliD;&O17zWעs)+#$ ېM9F.9ԭ"Qʊ)`ĿDR*4m'[3,0֖~ߣRh%n-o+3H< YQ`(߫s*=TB(v`UvRF2 endstream endobj 1206 0 obj << /Length 3226 /Filter /FlateDecode >> stream xڍɒ۸KU-c{&Nqi. {~TӮ)#L~=3%oǷID/f ۥ_ nhv ٧9.Oݗ fXG2v~ 3f+ODtG3px1.JyL/3eosoNg@Y{Vzî6ѼV8xYreR0wpd '=g΂np7BtA7j*Ǯg4jxַ_ 2_ԫGYTKAyu%G5Vxa,pG{_ ^|i35"8) =\*[.lerky櫩`s%ZZՋ< ߷ pW|˳'$x'9(R =S=w wJ]F\KX]T/ ȂOyEQ gTݍg'ӛ4x)D<-ò6?,+t=͝F=:H.vq}]{(gGVӜ͢CϖóyԕjX5}lϢٞi׆ 5"^F9ٔ3ƲÅB=X 0@cw'3/bklܵ`]{e5 %/s黋:NXxpRnJpE'/3hIX voɳUᩮ 0 q}4'1nW=, fy1*GٞtCZ>N`+ #tZql,>U•M7]Nchsb)2(ӪC .z v<}c3mYO;b~ñVf{sd{{_gк%+;PѰ+@.E3YW05s;K-^x0RBٔ{O#Q@8MQD]?ԯ{Y!@qhrVl2ފs &eb8tL4.|TW۞]]"=t\70O!,GD,gn:-E QG&a5C+2CQf/yz_>* }XrTA.l=I9'Ft~' qn 1`{((M4[0#Gf&p8IKƴF_`HQq5C 5#na'mتm6#f,8A#FSjt^f%yU}S!# "Zg]Yݼkӗ8<= Rl\yM+1 3nFrX0WA(8~,h2OX&XSV5w. ۜgqT\1,%+(b#/EP#F;/3R ?t+mkԍSŌMq {Alv⅔u|F~̓ Hњ 7L)5QF"tG)rt qh@O+¸8̥Lv#R*/ Y'H]u/m[ JZ'5XҔ(<*Qw{[^eI.ZWlvJ@Ԥlj7v4Tv:.@ ,˭}nJ5t6S~ !`;\ r!DHI+^l:`ڵIr6s Xaqv/M’uQY3;#c2КRfv9'bȱ+ο}h p$mnf #ym2QPH$#(y-OB\KqbH'pҰ̽|[0tGH(@+]R@8x rҺ5<9xl1.K  f4-䖙VƽU D-jja͕Lt-/Z N#ZaA9䚩L 1r'a$˓:[rnDVEO riFINs|='|wm*]q)`hRfN0xRxWSVj:*'[kziKȾ !k)yŊ,ǡ鋀)@sjVlCYԂgd9!U|+Rm̋%329xi,>  J\0.ıjA΅7,Qչ=n-Ӭ$rq7ol<55eEPɻ,lW;CV]đe6%[v oa`{O-0MmZk*a7 c @t2L16P EB.'5 ٞlrgBlٲVEǩjQ㸶;00J,&U<)\R8H|ibe`.̉ڛaJ>4H![՘Eq "T<Tm 2j5LS`sPqYey^: =(p.'\ 4TChF0,P%5ȫQ&N'.oj|#[d0D +fnR.n?/> s*i z endstream endobj 1210 0 obj << /Length 3152 /Filter /FlateDecode >> stream xڍْ}b*/˩QxMrv<`(HB-gJIJ@Jb%wUzWٮΪ{tە@HxB{l ÌJHLAg t 3Piu|> sV Kߚ +^)灿bȥ<+`5XBWE&Aޓ"`Gm''6[4А`N~1V͛ 3B8cf vpׇP3Tgdڗ,up><9i`' $VD^E[T+:Ib}6ˆC@FjyJIߌX}s>) E`D,r_0^A~(*8 aX#37l ϱSBz;D*P^ddߝub1dhiT(:ei"$*vk~5R02q縴ۖ؏E 9Y0@i,$5Gr^_JY{UF3G ք= ltcD 8J⹊8Μ gi  Cdð]<4Wť'T(-V*75mڔ_Ϝ TAp ŝ^S~E(az!5NS:gӲaSJ48^xpJ Ȗ AhJS*nͤ*H߾̒?pLV,!5 s ^3I𘆩!V#jWՉ"X9Y2إ7KM63cZ``U㞻XlNkRĔ.raL8W$L&*AB֫#!p b/Of^-=g JB9'ȇzy^k]O΂1\GsNPU Wa1.@ C=>tqֆ+RmLKD[QWңu{RUb I{I%=x(xdhDGp#+kIo\% < m7i0$|]N~UIeVѝt"!VV*st&#"vݙID]c5*(T !\n\ɗ2#JV׀4 3#ƽ+)sed #)/3{0 `ljpQ_l@E6VkB/2 `5ܺ5ǀN\֩:h@]'XM["n^bgU%BsF0)`oFyJӭ̎depobCݓyߒ,LQy,[{P4n䪽KHRGBV5-”,C2Lşjr|BjAKEas'q#oPd mYq&-/$;pJ@5:Hx3foP@̌ p⼤;Hpg><+%H/b endstream endobj 1214 0 obj << /Length 3190 /Filter /FlateDecode >> stream xZͯܶxZV+)=A0 qEed/J>%3p%ePV١ʇ*&=?p_%2o̿{!u\'N!wÿ$w4ɏuvf5w,ˢ7}ttԙoM{wyWx7HCg(?HC\,heHT$q*Fmu/.C'KOA֪e:iFǍ곲m[ ;P'HOCR$, <9plpn}Uѻq<+:gka¶Wi GB$36>!Yz$lWbT᩟wU=2@kdB;wA,HwUfH ?~=֋pBDkl쓨{!-:lx 7,*xжQ E}ػ(@^lDpGURːaI5t"(PvrF:%vAe;ܬ!ѐqasHD<8d1f_pT2 DXI 3ֲy^d&+{2/eQgH,t#4;_@xUf(u-AhTև4mfL)CTZjgƋFMeY/+Mj%zp(Ñrv^.XBVXZ|>&h,7{5N䢠?@@P}4%@@YPV$zYX" їaW]4čd) [[`W@plke{N378"DAF~$ev`YGk9[3;:&6k%Ȯp,W3Qd|(#nFӟV+BX+ L|4V8&& t2p)h"%_dSi>q@ Y1d>vBo$Wa:oφt#] 2(wA~=C0\h4jr2e ӂJB}ۍL|} N,fcW^~q>Xy/ x&!~Fb;@=H,W)ߣsjK*Y?d @`mƙ.ީM'@޹@x:i9F)XsHfhrkk\yVzdg=atol| -I/B[ &<~^9N[}G:ÃD0kG-F-?4Yٚ%[cINh26!PɊ.|DӐh7Z3~U>.bUq*@s+\lj<.%NBrZ!x<هqlNer{c}䟵p[+i'KZ#`]>.u*k|v n8s:ʉ@/I$#Yg 8&Hd ^ayE3"pb'kFH63a'N_$qN+zmXJJ+d2Q%`ƆF@*)T#ÖDB'I Ìd +Jz dN<. zL`4 4Z{,)VԾ\rW Yyٗ#g, :0Dl,J=dn߫Dg*SeKiF92'0=7CH`8_*:xͶA n>/-S<?5jʶ 8tQnz7#ﳝw !!!Zd4ͩ!M6_VRmi3ͣH̎I[q `}ә7:/m?FW%Ine 8i޾^ŵHߪ|q:6?plD$aK_τyvHg(G.dvCY'c9XMɠ,۞ŃǙaIhs?ըq>N̿2y: pԉ5;sWܶ8 +y\^H:/CeНkO8~sGYջ:T-᷺gtLUF:uCoH̋ !LaPTbyDܓ0F^~wqu3ֺ9,0?7nQ|KMIPWFŮJ. R{!YƷ׊U]ʏWbcֲ$IZA.Zs FH7> stream xڍn>_!Dwv;'9ؓXF9Ȣ"6)#)_r zjyRnBn'}Rܔw!A |.;@[`?fM!y[=T7 ۻxضrwIOG|aq%J6" 0_aQg,M~pHv9,e**ۻVp":Qw@jŁk#`uo C#? mӸiw{eWvZaG+X0Bizg4 Apo_! :9en?Y<}2>lʱ1~E>>:uu76ؓco=ПEIvľMwym}(Ŗrv%0:ٻN'J&- GTaP6YZ d|5jX^f'5`LT>zZBj@Q# '&I&'cs[kb|8ݿNxr3bXܳi:>R$!4 )fC&Z p)09la,[n1?qd GLcT6KgR`K ȼ4ʂk#Dx"Z0QŬHe "?FiFi)WgITz} @bDٮ<84ꏳl ϯ0ya} 9YMԼېftV 5# z_s qpY\l9Rp3! ?-6\@< Bc*-"^nQ>jϪˮ/ s}CPXWD߳Ã>p4΃ؕtP/n%ƣ4)6E&L 7EOPC`q P|¢,d@[9)8 9THp})xdl{G{QIZ'ZZ, ̨њVd5|p2yW/bG׸IR4BV)ksb jKkmFA%߄jNS9oρ4$sxZsWe?P'W@v3W rmS%P-@Q*1VL&Reg*NTGq`tM&<0u(r%60HB5=äD%iPnKߑ@ O?ަKَ{ O)}(d1C:QM0df0XhsU) 5|]8!`JDiʌ¨ E)l4ߍAlň3fr<-(I'"QJi@31 egk{M 9O+YH:)OЬX0 7Vuj٦_n+pײ}K6Jc{6䚞A޳vzkDݒd*J;$QY}VۨyWCj;$=Z2j'GIx q>0o哣>0,S4h dj'l 8q2Ȟ =܌wI-9pԟ:Z:PFԂD`Cjl֘-?BejZii ^`Ȟ91vli5f(0Ӷt#U}n $stN)2bk=uB؉5KԶq^3n2Lx q!Z,e[`~Jô4JAzu"isL)xgB80/ -ij K8w=*,F~]!v֘ `'$ew_ #H_9>GQ}wrGǁ>Iʄ2]i:NK> stream xڍَ}b' X)lRir 0&A6=Tka6ߧ>(qcaWuUwV=dO=4Cs(yh/2º/<Jv@K(Q=<ӭNިrU 'vWnS)?ϝmymM?/OVU^O**G*1~l^쳝lnŎ\MNzCSÙӋ_ݤd'=guٺp^B?OOsJsB(=*F\B9o<0IdCG`epFVJg'zG9Va4#{ՑΣe_=O/Iy-^m> {SyMٞZe U~:hPGdSNN f:' #= p m&nSJѸW&K|b_ gafrRW8';i>s1 ftb(AJL1'g?g57{{xY;;˭ #sVḛ&xx¿/j6W<~ RN8_ߣ {tV?ΛLj}HYkV(T]Ľ~xwc)1"NNo^Ь4kFk!ԻĶQ%I5/gվ9yTP\a ͓txo-@QG F|VEy]<lKP ޻׋;GS0mB*6 dG i. 葿3:2ȃOL*˪pyL4vo% _^LPG O^;2e%iƍϑ>?!,a<&$f*ǵDkpzjXyI8o>݃ĘaROA;v47LxwA;#1pQ! < 90W%P# fTMySWADм?0B>!$:[1.C*gWU0s%GA( ߧJtA8&j %[Ъ*dQ܈C6݉nv .ucYVQ\ʲlB s',DRFJBhy 2Qښqv%8E.еӭ!vr9 {HZZcBOy'^iR`nݺfN"J-wwV,Pv+K'IP4}'v )W=%-bd VF4dt a#.UJ>K#E׼2 ܞFY 8u|W;t't(0JrE- h:)mN˂vR STsC'*/jUawGWZEH#ρOKنDm;Pl _Y\ Lz3*Lyц.`U{ic(zlߊT!^46<BQb8Ohm70KF_$EM HU(cv:246~}-lcw3O<Ђȓ`p18z\&*^9.(Sjub$ *cvRq53x'[JĚԨ22sǜ{ CZb&+$2R>_ o[q5,YZgT`QJ3jI W䋷1yZ#4ژ]Ӯ]fKӱh>JQs琱taP+Ql)S(aj)+HQNWcM!wj%hPJ I VVĬ7A yqE,`&:mG LtVRpTx,x1e`3Z5TY&HܑewHL?s(6y"haE; EG`7Jy'bBu>\Sw G[Lu+9{9{K/.DܷJsN

> stream xڍr#_%*QCIlW(TD$󠁙_~4@kvӮj݇|ǍP7 ?ۺ+}/O)ݿæe?/w6T-C^Z{`zo@<+sQ]O~=ÓS^+>>l<8Cm 'yx3~tFw<9ث5= OrWOSJb\`n3zC0q0ϼ1Lyę#_i>/Bԥ{2်mrX_d@Mf|dvrCGg\SQhr_.x徔󸳼Ɓ H~StdG!<^G9-Pæ(Cb=OIKVUaW!c| _q?|xqX5 = L̓HH][ x ܼj7Zb31B51.ܭe*=ީ>v=!}^pf8G'B膖DB {F"p%!e, -lԙތ~{AA4@Ip>#odbg9x6iE0bS_ԑ$lj cA-4x01!x{K33(EK-{߂- ؓ1|C5V`+ij"_p[{XT[8bgd| MX+g26 y2Ȑ>2 0LΖ-#hm-`v² [kF4Y^1xpFv,xipb]@߇ɑB% J dUځpo9@ 8G<1{Zpq/-ώ ͘bܰz-缨 Sֻ"egPup}!gId[xQ.J&.HweHF"[ @gs2y{ةLF.f$6ٸiw6+jA>ܕ)/wl`!;a!;8G"] odl&"hނe-tџ:؀uCmpb S0T(`M_dGX5縎\狠C5v*Z'%noOC#' Y!i۹7zMyҘ?2ddn঻tRM ]U1#ۇJ^H;#.PTc&ᶻ9r:{_VĴaLSFHL, t4gEI+谖4bq $%ym=_/6D"$d:E{sDL9@jD[?.``q^_ӕKa `нޯUL!8{G#ZZhR@JPzGgl6)!ua%= nOA y10&mS~,Ŵp>sƆ}-dP2O x)399,:_[9 #4* $CP6ϑ _'# Ϡ:nY/=(ܤ2F>o.DxX5DԲ }O+ISȅ4wY@C-/秹8:JQL갂HY kL%Q^:csZC1_^27Rn w{|[6'g SJc,"s&ykxi6Q))rQ'|hK&Q O!D) (|G_(-iP _(S &⡒xFe] j(u8mrln3]bq͚Q3Wr#QoLc\1\3)o@+)IkL;0!v'Kcg(?);`U=lHc͈k 5ҳa~?#D#T QyIn/4VjbTGSڋ_oZu}M(IHrb_Z;XɅPz|hP8^ wafd+mӰuy%bPlBDz.crnf-$58$;gJYޏ7> ī{ ړlqwS i II8PSϊ i(ARCvȨ6ɗ/'i\څjT%B&{E3EۖK>%D'_9nB{,\S`%C(Gg5ԼqYrơ%6nP z!  #Ŝ5 8 IF8!YJ꣍K''z|t$XNyȽ$$0\.&=a(3S5LGQC`xu))h<^ j ' e.˰"1E*f{L"pA4Y|J~5:LOR3 +AWN^B7/}4z]ÂvRK#!$@~ r@ |\,R/z~\jojnjڇ@-#X{ 4gEfWIROE8Fadzg/YĠuxtP3EŕQ1pe)\I䊅'E+.V\> stream xڍZKs8W2tޜ%-qٚLm@Q EjA2o3IB7xt7/8³,(;+o|3n<%^:oWo~y$gjڜ 2 t]=l(C(]L*}[V|\U%arnHg*ͤW~Naq^5簍i߫eQYu9MՕWMѷ<^"6 "Ҕ~w<&EfЭ{lq_QJOu xuͦ^.Nv{!SifTIقiqڪmF3~-m.3"bݷٵiGV&[5$^A׉g?ˢ_YIlN>alf~Wq{ܵ/p!!j_W $dg S'+ D3Q?)e![fYJ^/2ɭXLUz3?[hNTzFuҍC.^W롯t햦z?/8!8#4j!b_|!U"i>QA;}"'SC~^ɰr7e_}"sf:jجJh2!@ Nah%V+Bӵ";:}Dp.V<5`%Ԩ<*L1Ȱ&`힅_h vz1#WM"4cⳟ vE&4(t*g{mqmQhMܸQ7ǓLɅȮqï]xG@XqJ M}ILIAD@(Ze}93 hv$2 q7CI Xfe?TuCu̡3c/Qa_"$xb v.`: ɡ)La{T1=3Z3 e$n@U_0S8ɪܴ<|dL(t;&CϮ ,ᮅ؀).Lέ{Z$Jn-|0o \})mR/P-x.<Ό`s6jkƔ2j$1I 0iCF{&HRkF WpJ _kyA xD7 b z$8Ҍl>@WA,6\pjZ㠵\ c0\g&!bJm=,qa? DFZJ"R;%&<3հ FT,1u:{1Aa…`elB.BƺUDŽ (0u%|C'##f7 l1%Cg ʢ16d6H!2lT/e8m_PEڡ_'LՓDSڷ:pNKv,+'4vm'0]52h',1LwPM)Av.g 6LIꥀȧ YA&ǁPQJwLٲ,̲kU1OAL7Ù=R3KGb}.tl2Dil*_˷ZH{Ԕ=mS0gL 8tx u($跄[25Ǯ u|JF;jՌY)[iE +3jľ=Գ^f҆Dwr:E{ss p-@V.gN3`0M#9?~:”ȢƢz8:˝]…4"C:2.#+ _d2YQc f*gJ$vQ?9d(@ M|x)'|`a6݀};`8EQ͆9 K04kb9NRԷ HX̀搈WFL#6a30`M*9^1 ,F O~,,ZѨf_Li9"CxM:6 ITX`.ǀ>m}م :[сT7BJ72Rҳ&$I1x AXhV`!+ :6DX"⃂@^ S56LP{JWrjɥ"3əXnR  i5N0m/xTPS{a"^R7Ņ0qO3'bǓܯ `.^ ]8BtA\5F$B05 *t*SIQqN'\s'Cd\ RD#cGE:*@6u5gsW3{q\wW89Fh>9!g+o/E6&9XNdx1C3ۛ ǥ!Jɇ5(5,s1K#cC#F4''dW6, $ꭄ:,0UD?WX͎tȒ즩qSZ1if)Gn>1xRWe5h GBc 69Uc^mwAr b`X\9l^Ql0Ai0BX yzEiʢa>77ZCvӍI&Dl9 z1%B,+q_y>NDRojyÇլL{oq*ۛ_.{Mt?q_+{>XQ>~\ahF}Dws'_>Ȓq endstream endobj 1236 0 obj << /Length 2837 /Filter /FlateDecode >> stream xڵY[s8~?"5/ U7.g8g06ljgƦlNM!>ggkk+UQjZݟ¼ŸyշKS: ةI.ܹ5ݡyU-7WhvT;mF_pZ*Uy0wq|I5xBw[fw/޲ȵ\uh{F63ûg`QZ>xLXra>xm&79Lr8Qح"h?.v1mtM6>=jif?OaZ2mfgfXn4lr<"ЛpUE<vt5Ib6b?K\xרqM7tC<葻 ^Skx(LlH:@D1idx 3G"]dO;N, ]Υmw*Ih& /G|X_Vo8J!:V:;hBKf5h:tyc8v3B8O.2RVmY4^b$. A?W[7ffS 1d+ >3wn#⦐;B`gK*k LNpdP Z5w_LV]HSBFq>i'u8!d|{Ny2F"iX`9 ~Cf[۩OlfDkײ^x x; FS `7+LF7(gw?\@N;npZPwf~3>ZK.0ۭeq09՚ð\l|\w:7yRk!LBL?^c>)A"B^错R-`pC隲7 ^tx"p#nݦ8bc#0@NCrK5!IbF1c XÀ4gk*_veg gj bN,صC]`ArcXhSxk )ʖ*? CFf\6J7<Ə4X}UDZX'QW9d[Ђ(#6-I:OM:J7:Cx6VBo8XriV 1zIFeaW,ϭ>k1Euo%ؙ Sq.]2Vbu&c^L(Id3Cܚ]܏^$1pBz$+hh=P;RG*K%R|l⧜%\PlbBYX48).wLqȳ<ڣ1MTQ4ŝd9QQ#;t(!^dIMv܉eȲc.gnlcN/.L;mzX. 1B'>| im+(Zf2c4~\:-sgdCroDଡ଼"~IDHαJ_5@MI25ԋ~첵a@FkJ b8 bѾ͕b"ۖ"wż Z935 / 2J_R "xh35A?tq]x"A 𻀅eiqm$dהC IAĕndXfіKƶaG(/(/>v,aKUW@rp8r\|)Q \zN} PWr,e֭*v1]DM0]'**ʳFCkȖ_X(SuV$Ec]ԓ݆W7c"jLDžft#p] a  h3%6+!b u섐([4n^XmJFpNtӘLbmEw Ge@^Y2a=p4]EښX2xGtt,,ג و0B:L};;EHcQ̛Lgx iQ'iJ;}>>t>K@Sr/̪](pW9#gÓ*kf(TɍdMz˞ĩrwK D_ǩ]v2Nq""2pYCVAmǫ`G$IW(˨7uiU?$DHZWokl[?!:II Gm!`,k%^xu;,X`<;9>kdXӚ/O͗Fh)Y^egÅ1;Es? :/Wt:כ^\阦 33돖Q:(ؖcv_9 QRȍmlS,WP+.]_tGk)"ޱPDO2G xfk]֠QA". z):qM&E=8X%Z@:̠z˱cy@A^,ȣ\8XAvDjNHa'NO祑xL;se`;*77s endstream endobj 1123 0 obj << /Type /ObjStm /N 100 /First 968 /Length 1605 /Filter /FlateDecode >> stream xZ[oT7~_q!HZ *J,(la"BJ(̹x.|c}{ x䌏UH7 F4WAL'pz#aFxZ oJT:p%EoE㉪?!-垉 LTCQ.yPRTJ.IĐgU1c$SdF0$NԱ3E' W%!JMA F@,J0*ǜM.0ф>-&:h'zDD)_K E@^`JW3I` C[:*$x$lx|͟I`(vK\G)8[5 Oū[z לyjX1ҧTi w3cK^1ɤY _KΙBQ# MNqE1'T0H {sj@ )6T~'HJو&X6PJ"!R0{HR%R;$%=R`R+L ɬѪ$R_ԱFevp0knn'Yj/7kNB͚zu}u6_U^>uqxT᫷R^̠ JGsy47\ Ƙbb!09D}`a p()@<@VFU*Djul1Ljɡi?ḽOppGGpp08 `8B؇#plcGgG(1XWh]2rmףnզGܨoΚǫWV{NMX MX)3tSv3qk7ͻv8[mG~hͺ>9RXqM=a.>I!n4>".0;v,-1Ƚ$d&N(cqEomiyszj3vi:0\ SܣjPS!p 8vҷ'hv3unI>sNh>>|0υH3Y6ɔsG?2ӶYSڱ+Qr%\Gu~pH<ԡLg=F0FoB[\Eԍ'ጂ=܆3g#d+&fqq~4uaT Ѻؕ,Nޝ]6{K ]v()ɦC:6GWx8s8cX̊ At@M,My>Y:&2~,f~,{~$qu7V Tnu`k\5պY_juKX-'˷*X! ;!iDln-rIهz>JS$]Ae؉$2^I| v\{ yt'бH4W1~ltDE/(B`x>F4;QQQ.\aY)߮R.XlEmys4u[vq6_2LCSp| *s endstream endobj 1243 0 obj << /Length 1317 /Filter /FlateDecode >> stream xڕ]o8콿"Kv-Yvab-z)s,CVߏeISD$ER$da&"rT{KLxQ'X|1qMe0cYTA#_gߟ<ek]Uj:5g`U"0t~G'YD7x8Q"ɓ(ZWR]ey4|L{:y|>DRU}M9[WF)??Fy^]aE `be@M{]PCΝ#"ֿQ4dxo7VMC1nn r1E0ee]T` *TxHF L $2$7Δl@1Dian^6fB}TT==qbK]cfwwV4҇;I,0!gb(.00 Ɏ)#3Νnm꺦&OQSZu4N:Dxn֧G6-uZH_ bAm %fSY⭚RjӬ>jT?Hո`7(@Z`ioK"7#&_`}z(=VYU,q+sXRF Wdr[gPig5Q0M=Az`9}t#R6*~֝nz4õo,y5I2m3lNTf e3J endstream endobj 1349 0 obj << /Length 3903 /Filter /FlateDecode >> stream xݓ۶W17ٷӴK>ttg%E'}#@,ACi0}6q,@*i65'5׳UYvwh?rF+T /gi8Owo~.W_^?fkBk#%W߽I&<8zb6j¨BH[`¾ \(uf W}ǿM8դQJ=mmb$FK4_^QM_'z;DZ-LiAd^0Uj({Ac'xa؄J^BĦ4K>2ӵ(cTIJϫrJ3”,|]I &M8=K}; XI4 %@& l*LIPU@@.|.Zt[R 4O1ϑVC*_YPyCRϯ:(%(}sd&v8EsUldbg@ʙksbl$j5#VvQTG<|fF0h0ܦ y7p`9-)`'`)Ij.3^ ƙ0h08B̔L^ <%@>.f_v|coA[R0 4u {o>< gN`(X`A[ 5OޟjSߔX q@|05V;AJu|`jW%SPy8U0C[R 4O(_ϥ~b{>R^ ‡?`K R RBʽ[Ӻ@?ό3dhK 3 3ts>Z#H~CwuL.w>OxSR O c. [R7N:?WyxhaڒQyLM)oDS&5.eb$a͌֌4u?l;\rϜYr1@?aZ ܃vԔ@Itɛ|m"Oxmnk|)\| mIA*< ܷsj/>:.Re ]N ˶9qڒBWyQZf_#t8 Ж4C>Dk5-ʫ/\]W@:E=MI+Pe5Z֞긌zynvZѬ/! jCfjV3ڕS=W=cbcZ9`HF#Tatxؕدux6F?D0$@'nY~=F F`K&GZ> xEG%K]0KYq.HS Cna$63UD5nۭ~ڭe}n&sVZr\; `N¬*A[>jң3=.|ޙ}!֥x810nZ[R 4K٥^H՛Fتjo>"L3pl9`K sh2uCPd -pYQ"j:1)Fd$7v5Fq́.yg)c%HidxҜ0ۇ(X/'2Ayu>J^ DЖQ m!ֱx870z -@[R 4Gፙg%\7a9(hCnmIX<v5e9;<3iN@saMw?/r|.b|9mI+_8ie/JQk[*@ kXЅ%Ps, vݒѮќp`%@s.e,pߦh7ϟֱK*\|%PlIA)EIv_&ccm|]PJ(y8J0GPh$s*ԡyYW[q1G npĀ-)qAVu̪n:χ !׉ЖQ z(K .{4i1=7$(J]9}E/W0_GfRuc>!^(#HQJ*NlJhvz?./ %uhK \\pƬ66RK/$ϲP$F$ j"Q3opks\us a=%@s(H]r7L x>P^ +S(PQ%R3̹ Z}p$`` lIA"EBRRՐ ŶLxz3d;JpjqRiyz|\y. 'ζo0hBjjقӿ@g kNMrm}S1/P ]'*%PsldR]^HA#@ 1`K b(bB|Hy/c:?g~ϣ`F0G- jD?Y:jXI}Ҝ0S2Yu|z#[R 4Gɴ];]y7_mZ 3IjFu|]; `XaAS Uv6?e9uҞxvД5 kC@[R 4G Q{,6Oq4CRXB6v;\Nys'|rCV -)BG;k{??6e^tyo E0{ДzQzhMj*.%I F+MЖQ*M{]v[u>J^ (3%@s Fm>KEnφG_$U+W hį,+˭ܬóQQ`L%:CP PҝvKC{(ǝKRl(G =(Hh3z$p.ˉ}nպCf]@|ܫ;VZdڊ21ɍyU T6U47 jQ endstream endobj 1246 0 obj << /Type /ObjStm /N 100 /First 1009 /Length 2431 /Filter /FlateDecode >> stream xڵZێ}߯G=]8 `H DЃ#$!awYS!mmhk(TjX9@,=* M[5#n h qc)<.Q5-5!k{l߇tN*'eӟ&⧈v9e/2x#i88|kO i=֧`gLn↺(n8rvő#G.\8rqő#WG\:ruՑ#WG9rs͑#7Gn9rwݑ#wG;rwl) 7 qCn7 G&G&G&G&G&G&G&G&G&G&GfGfGfGfGfGfGfGfGfGfGGGGGGGGmJX2UcN JKnןO/No2bb#d4Y:3K4pN]V9[ĩ)VԅS[I˙N[.I}6\9QaƖ׶ADE\8*2jE"Y)}9)^8;A>s% Nјtք,(m֗d.ܖ{D>A[ҜS[2+9hZSD5sk$C yՅkɑ֣ * um4of䵾uvJLsVA{/5+$!|LgS6uA ϋH!HA$ƋHIT PJn 2\fCu};)ۉ6溾q}!c)b?~_Js .q颜F'}9QZ E`둢<3*x FZZ/Ė!Josb?'*m҃&ɦsSc%C7vhS]]wM·i~sPPEFisKv4ZʮqBlGճҒ(j/{^-×vs2乮%Re]ƚ$f)epY :" I.4xA1; MeJvuqA2GHH tlePeqSF*mg&Ϝ͒zuh 'Wva]6 ( 1OJ._Nܦ|lX^( LFÃ8sxFX1p+ b:#bLgJClF׵^|6w).tN8 N;;vB^șb9G UDFmmD(EТ;SL=Dh4]H}9ղ5͜Z 6K*´춨u1M*mt(S,"z^oyNe Y "[KΏ4Hs ^u)B6YQBrEJ"/' R+EI^TJBhA5d,%كF9e,q3A+:ӠJȎ 5Mi~+7^O ZF2}RR]N//d^ Qۇ>DxNbLjS&K!13 t3Pި3Z9R7\d;+s l4􃦉ڎ/{6(8)X˼.2hQ/S޵n>7_nAj?OYOe٨#/D: }̰F||y9 >{<|AOgc endstream endobj 1404 0 obj << /Length 2626 /Filter /FlateDecode >> stream xݏ۸W1Gʎi!E5{ya:W=LiaJ&wx,W{͏q!yg ql<7@phqszUgfHܼ7ֱ(7 %Wܞ=}HFS_KD. \yscP܀)!9P{62JRx| u hvTi][ǣ]LP+y*{v9a49%'G(Af~zW/6\Rxz2=AJР-=I͎Z2iPIn8gy?[գRS*g9 Ĝ̙)͎ș9nL2T27gœGw.+پ|L+XZ]b640$1Ò,)ѐ{ TTSW]s{:dN?D2ω,.(@3셶j%%reSO)#]Gf*0VAǀQIx&LvH~glSuGIN0tQdR{yL='9O 04TEIHд,}XWfx<^N “ fhþҾֱpn`<`K7f-H& yڮwy+'+Qf (tv tЖ\;d%yvtZ$^o#nU/ w+`KVfo.dQ|.TղIЮ*D@cf:ЖfGt; ݼ4edn^9J/ꗪn6߿>6s ?/O\p$1-I%F%$W$.~* ͣ:)r;="8 4c,;J>zȦ*\cc"64E2 j"hՈ(οf #r#ʮGA@ endstream endobj 1427 0 obj << /Length1 1945 /Length2 12651 /Length3 0 /Length 13836 /Filter /FlateDecode >> stream xڍTҀ 44ݥqwww.w4efΙZ^}j]%#RP23:13rDd,pdd*ԀNv2q:D ?dlR.&;77##뿆vQCW ,=@G&bghaf濏Jc*B6@G cC[9#5@?.(y͝ mhn%h` *NɕL 1c ,)e,-?{`gVņv6fS k @^\ݙ`hk򇡡zCWC kC?37 ) ? OyNƎNN]5:;#c=:Y+[;7[E3Z8%Ec!Gft122r39U<*Teog0(ca r2t]>^V/11L,F@3 [;Z?z 'ݏ2ePהuv/:vf3##<ǃ{[RC$/vjؼP7G/#s[߄]TSQXX{ࣕ]?Bc8l:Q6:IgÏ5{--܁& uù-P⏫@tflq8}ԟ*4oH1[c;?Ǝ`hqbO `sX(`jyE q&&?ёЇOË?Eod0(C^!V??`P> qǛ:#g[WGHobH<+XLLaU ?_տ##1ch3 ?Ұ~/H_ӿcsYqq=iDcGǏϋK@c;c`ˆ·:!<7I9}t*:e.'$ڬM;>]1[W&$Ŏgit*_@\8 $T.+eQ ('7M LGCv<{7;N(@sR쥵sJ٩G m|K0UӢWYI&bGDJ@Oi5b_lr:LntҞ\7LGk5)99a#WYiR H~6+ r MW3nGqiko()Z*k99OϜˠ<3ܹ-0[um\%/AY2.g'(UޡY&m,!"7?_r.؆r=땫20[hب݌~ouBjuWVDqcEDx _-sQs]|BL/\9{_ߵQ)[2' -چ@JK9)ydOlKGq3eCDݷQ选L1 /=wV瓘H^>Jkj(h-4&Awe,HC>$SQN#/^lmWi!m-730%,-UpEcVfYK}NKpo/CNH[Ʋ2Fdu ¬ MYèQ0jdCSt˽|aI~'n$/~4.gB6SR+.ë>6ܠH"JNj0L/|J {.i駎ZЅĤ|AΐV ?LP'_Vu ˅)W*#g@1Ps3zIxՙXWѐc܌O~t9RS+? v$cv)[n;YWw 1 tH%KK۴اC@lh7f3 Bɑ^p#{(nMjf1]"]|:S9C&.HJu<@@y32x{%.ya%Uђ8M#'3`O! }TجU(b7js)P!SLDun[u?{cn't^S"d$(u&|.U +wXW?Mb|ijІjzir(YMD)hVg!Ûp2ٸoa~Kt>S/&t>_: [ުʝowcr+;Y͗*{0(۔)մO{ecS6y{׺}˝ܤ[f W[lS) ,Yo_ޝvRm^[Y b٤!GԳ6ylI8,}JthvY _cHZ #"7ԋ+;$(Zp>.jsӴA;DKszK5J["7HԎlGO0Թe_RH߭oaP\ݙo(VBU&$R=eP'§fQֆCg53-+hj_'\֍~a jBH [I?Dz3rbniBe|͸WQLfsxzW:ӛ&ptgKbפj *i*s> Iv"-.jDBZOݯ&8mN WjIV5;hp-w]-&O)d'M;~#]66&( /9'|!\_÷p fwB{byzR]H8=vmí:H?j-ΆKdrϱ]NYQf}ld!?Y2y WQ|ՍU˿O]5߂"YNިrIϠ{Y;eg v|S![RI0avzUV\ݍbnq_poh2ߕ' 5$Z`UĶK9sӀٶqJ~T^M'p%el5Kk|0#!DBuqi3]ҋ({r"kjȸz(nR8{yDʩJhf~/ӋXZ^kzO!%u=X! vKiC$.*ߑqc{hܦY`d}KY_lNY}!()RU,r׻g1'gWu?93h2,D([䂂:%}]YR1I>OE}]r ;5ZjA z@8YwK ]Ht-M(nr^gͳ g:ox,6x?CII%;wDij_H;-3qBĕ+ADjĚAi~ 7ΡR|$` !'"9Ә7 vc{[P 8(XW1XBe< 8Q7 g*;i3]nD,.TR uUU-7 |SMҷnB0jN'}vQ2KpȌΔ OWrOټc͖'ݒ dߧث"ok]XS3p+EUηܜc @;^o: %y;mAַ۬;v/0Qc4<?DHqēt/< ?W&R%hh#8+zT2R[~In"꒜T6ɮ{~@? . ="=:)$=9HM=ׇMN,/Yz|.j8Ea 0~ +RC'AzHj* N0sm ri wbf['t".QΩ=.}86W栀EObɡAY,XMWRYuIИ2+|%MFOzAL8&ٔHق#ɰ&HD}ğP~@83G2IL'+G׽y^[#Q*S(8׫8ְhcT*;2?*"KL{[E=1K:յ&2;Q0(zjcp#'ϦAϸn9gICWqK88HTr,r#zNB?EP)X߀v؝bYVc}@+O\ .a 1twt{l?Ds-G\ãOraү{:QPm/DeggJ6v?]st9^ y 5E-vrkwڰErXwZ,rxc.1@-ZɌv nfFiݩ†_gYV.Xë_pAg5E[5\ێ25d6ZSGY3p-EOFca؇kH=?ҝ1V!.KuB]nhڍ´q?HKḞE=|^"Zyv5Y.;i<@sˈ&oz%Y>HD^6L{. d:}zQ)]n(2*eҫǛ^m^ۡw (.2Qz*?Q Dh!.D)+-^XSխ@"@)R ~9+M_ޜՊE$|yrāHDXc8Ƭ. j53B18ll y74 tUzqq],%tUKʫ^.YOE-&"k43{^i)bOED~k hO& o7 jqv8<@<sۿ4F K/|xCGډ}$Wf+Y˴ LroCR*Ta.ȉL f󂃐zv m;3uVMW!VY?*Qgg7Vv\jlCf^E-s(P.ty)`q]IO\/|wj'Mh ]YL;Y0jbS;=EOC.1ٲՋPBߔ%AqiYadVRMjv^' \xU^ 1GMb\都?u{igF4ſ>Yh5B_zpV4mD N@&Ü|͒"ݾ>9_4׳3C+d~Lh,m Xqτ~+Fv.A[N_B(6PuPg5"QBͻ SH)+aL{Ofrz}{ϦBdCf~'T9f5Hc{cbt3^\c3lN +Zp DfC~_87IL^",j^PyljX._[-ڟiܽ5PhF #8~xe1_jEM\@a$?"dԧ患7E.AW7 RI5Lf[77LBH$Ҩ4YfBP~zc6L5(:ldd߄YiaQ<_Owۈjb>F^+!+ Yݏ똹:D͟ g٣9 xücFQx`ZJz Ƨfbg<ܢ{[08'P4(0B[IE4m(Ts{-ͻ FXY!~&Nh'j1s@0Yn#^F0TV[L Iusŀ̽@pmѰp|`);1n?}u,q͓^p> o=75Kop[Er0kuFhHӲX?˖gE(ͅB)[K+5cxʰ-1 WΎ$>emYm/ r55RKx33]~k񶤓!|]/d,yI;'յ[航I}u3C}'E-5:'=utLqEN[`m C* >x/WA/+־oB__b;g2`PF&8Z`>:rm,ԉVÅ2 ?  [ CG`N[j?+@RBx1gчسt"B[zC$ B`?8`r3tAp`1!*GKX*WxF *1d4`No| B=vԦ!"=kG^}H?#Ts,:Q3vf^mnz>˫3aU+Ay66ὲPsOѭyFG :rIsu-7Z< 1cﯧiNK0R{8a,RM6Y1Ոso6J'V@BʢjۆG$@ziFRQavRf=x̞ 1oL i+ K:;'nt2j#lo:/:T+eMPR<}9юvw/VƳ_OJ؛Ԫ=%YBX1tIok!JZmxq6T=kv5Y!҃9^MJ( = ]^V9bZGq6 \rP{N$B~xNC3H5Yjz̲ y Yjj~{VFyك *r2WMAz-h}جՍAYw[ -RNJ$`ǤPU e6y]#cT#( dEv?VA?.\N1.'˚4BN8lg4fYǥԺ~(1±@C)9d[h'΁xP||f6ggUWG~l0OSe . H"د_N]#f8W D/p; d!J"'U̲p"*8@ {J%m[N&/0lD/M]d#`Gvz ߤZt dD$JX jj(T C$[,xnc92g-a_z_P8d_݌T]4*S iahc 8t]E ;]. O H3*ۉa[Y{8桨[2;ܢJhysUls4aîs/yu o~yzQēt.Tz:J5lCy|H!y5a5Q8灄`(:5tZ鞦^FdHTYϡфcHGY m&j]KhERoL5;AE6Ӯf5,fnpy.Deʖ2a5nڐ56N*z4Og*`ԣI!5Le(%2GQ@VyE vrJL`.6K(+҃,=n{oWjx}!RY!%;l<%ܺ4mG>ǎ]G=Hͅ5\ߖʳFMHB:&fo|ϯHI{;3f_$TyDt@}0:ס~EA  a'^dg-d!ć _ FZ-\"pxˋ7: ;Q'U7Lz޺ LmSȴ,GD*oɁ*G WT &{ qa]45Ͽ%m;,o(H UFqNxSIR[ HhjAZ2TbB6W؃`NbjVV?9z\뢁E*h]nP-FZQG""j1oEl.o҅\*ugj}z뜘,sAb"L@ZF] FW5&-> ndغ[E/[|b21 XOP ӛNэ'^h !kd-F]z?m9ɖ U;>]XNUälk(9wbSv>q]Q gs *zn;Or4jaQoNB /lܩ*}c؍빦tw˛ץdv`2`Jt`|]k$;F1HOszsR3 O#r;.H)ճǙI MaOb{%ygK"Z5Fl^Oxl}Gó" f&J l;Mn07Na-Xk [T_3?>yS:_"Cפ*ɨZ$<#sm\wPnWDftg^۹"KԄtt1l.6n=frǔzJ|l&xrC jĝbJLXҠ([Zj 'bdޙ3]SjFbow fiCgAZ*,.E !6 mMHQVgVpF;k!`|]B)RR1n-F5cA({7EkHHظ*_P.08|gݙ(+6*ҟ!z.y?7 !IȩA\~QyL~;Jel1~@#4{8;ols&ь"3U^|z+(ܻ (|&d{:#a2B#w!)Lr$!L*^MQ]Trd.=* "xU d$~>N+Q}tLCVdY0߇sj2  sU|oEB]n Eb+mmG_V;L_/@2*ު6j)q#hߙ5h`ǍVv훯m@)gDԿЕw( ]upHՙ ՙ1gV Z*dvbn~96j8HrԜSZu3C(Jy#_Zt ON +C#=h8;ޑQE^z^[>}mH3rgwsEN ^8.N- {#Rft\%_wӼAM(Vr3琂5 nkQ<#Ⓙ 采[b1]VlXN]&/vIW%2/Y(5Qĉ:^ g2#.P P #Z8r4h& `l LBNb.qyHh> stream xڌP  @pg\!@@www qι$*[V{$UVc13I:302DXXl̬֠#R~9:Y!:_l.6 '/ /33翎vq)@ kg rBp03w~G p h P:l^M5; 7wvebrssc819 , '+d"ius  jv`g7#z`mauz q59^j2%{?8 #˿W" ۿ&&v6@[ [3PgtvwmMrZ;ٽ]@WK$ETWdhadaFҼYTdW} ׾{0gVvn^E` [S_2L]4l-\@2y=B}frp033sq@9_,j񲷳_e|,?^N@W" ` 2E~,~av1 $ksx1pX9X,,l<.fU2?1(c #{͠ϵ/>Կ_Kw+ߊ$]ScXX{u]_ .8_ompp*[8Dkrk [_^:M+&v=VN`/Kj r{Lvί!Wq>#_0u0F\&߈$$E\&߈$#6o.F +oʮ/~eW^TW>߈kF~Wv]7zeFq]z:61^Ә>𵉠lٻ {5揘W5wF\Hb|c|UUUjj_KTؿ$vtZX^KwM(U@'kY^I]cr6wWnvp*QF_{_{.5'yL\_7~_⿿A w ¬ _eepm֨f" ׂc= |ur :|2*):wR-̐4~%_"x1L Efr| x|iHQ[VG'.8Gl@M"Dm# `AmoAorM4'=pC ޫR7bdt/L%?R؟b|!'#Z 9)Ow 4Φve}=bq򄎲iErL_uY*%w\9A;&z醊>HlU q[ Y7a"ĮjNf&Q[`&Y>=(n s8\fnV߯>d))X  * H^ o'b&o!i&Ai YC-3(,}Kà ΀iL769&bn4G|eNXn, H\r"#g#wĖ%LQSx^x(\|$Ptkgo'eD`lX29,~!RFa)k~tp$ƨPg-%=+`|u37nc E͵9Wź z֕`TeҼCaxP4ݮbc>juHG`Lcv!Ⱥ!:ly_^d{rdCNyHXVY"pAk1hvXiiyXBledLQaֲFt^jRE]AFA*~;Ģ,ߩ, ( ,'`FM"2H|Ck%j/\2 !0I$2,KwYBPE.g×<m>QZ))֝ADY\ܒуV:Bg¦2ԕSG@~fYq_!'-׀R󨀱߈/7Ob2BgHȞNG>.F Ed\irSH7;M盡=^9F4ĝ⡄l rxٻol~ RqVT_¿v6_z92C\OJTL#R*Q#,|cK7D{k[nS-׀׶!T_끞}6m)_HLcm~mݸ%*r^4 #!ͦMvEx|`rqw5=,g\<Њ1J^NK %XWY*ZqZ#Y㓺5`#j2D W.tզW5{&Na_oetyaK\GC? i+F*`6P89_%򅐲!ڡGH3ޮ;_y,UeJrd9=V/HHt?qPEU+CF9 +PGP1@ `+\aUۡJ^̌m'7̘`H__muSPR-wMR!hТZwZsd9_+hТskav{rɤSQQ3Ŭh#\T?kOR&KMXe~Ů0ZgLCZHRZ(W#7y_V nӓ-1fw=\'pe1qu 1RGl&ʊ nCp0ucJT"{RgOu""91Ghci+$ckC*}6 A7Ӻ ͽ*8!t)9s wXߨ8AJNG|f8^(_F@0w?o0iNG(-Tq9Ɓ:*>P;)6lG蟻p#-fozJjVζ;oS3OD94de>?2p2>?lS3|$41S6k`3EADBuҜ&SQMVAZ׾8^BbIqq9h{efؘ@8Yel_jA_]ˮ/dA4-aZ;Њ@EB(YW8%3Wv*5OYJD- ƿ^r 3%=ηޟx]De9#5 #lүX*Jem T5`JQʹ;oCp _R"x sDIzpe"NvDڽ; mQ0gmPV6m'g`brG,)'"?(w {e.!CE5Q?--,pR"{#?=?%@% qgƄxtuL|=GUcHifַ/xcWNs@#3:+rP154^0:xe-XSfKd-1 rðԪ] CӤ1fc/$瓐_zSH= gBuvJLCqt'mpjrv q/`%_m.`:Ȉr-d;HYSG;Y[@,?|cҎLU8Ui1h3v^u~uZs"m,$T#B1crbB hft/) Oou[yݠ%QH6Hp7Z ® 8 N*m:Q׺"% (.x{gɄ?ds}gSrVczB͑j6C_݆cG"F},~Z,sa@w XWz)gJg/J.$H))~t"L.*|z}_BjFm\!ϥ gI$+R u%tD+FMZvFA IN:v>e*˼j)cn/6<%kd[TAr.Ts|=j.B߱r^Kv};t!tFWyE*)_:h 0~. zpőȼ~h=۶eIΗi=qH~b=n{GkYۡ`stҚ q|B#_ muI)ӆ+y|NJJbetNRe,ŘZrR\;l3 hhlߎ$^,ů`1Bƈ@-e_4`>wj2w|Xmfq>qGdT93༙1Oi%VYW gd0G/.go\ײ~c3&qOi{M Z[5+RहK}̇p 04 X#q!]MVnZ8nwLde>H_k\{ >(NC1gOjcj؛ug*>ȝ76HҠJ  3ccZ:}B=ArB SJ!?({@yJ)270B+2A!ǔWJ[Bn 5 >:QO#aSf|; is0ӌ{#؋/;rF #׈E~xPj`j>ڷ~^ AVp_{rIn7<)_>AM2ZD3MbnDzگ`_Z{+@NVApBFssvi f@IB?rA&R)}ND%$j#FvKb:iJD>GWNɅf1ZS~%ӠVNG*sxiG ٔ$Ao֭>0K G޾#<#(魂%ÄO(M@HEЙwc[^l9Ŗ21 -ȗ-..ݶ[kC#lWh v`U%:ymn&Jofp-:s~5)aHC/960T)fbB/w\v♯ V 7%e ]80*k֠l* j8͹#-ľGac<{r\*޳dp&pLA^Qb>v<'7 0n1=ר)/Eh&o;'6] #o +2qyR1جņpLi-8ʽ%%8P|M֮NcErON3 Ab~x㾹c󓒓k .M('e=e4qDx1׾@x-XD&f7M *וߏ n~֟~T|{˜&Ud\dG,סJW BFsk7pjܠ:|^b٢1GyoF٨<^suBm>r0sq" J$W1_;)XWĕ*5ExopݟQ dK Ƌ3zu@jB@8?sRM&l c5L#D@I63lk\kfXدdV&2cOB)uGgBmM%-q٩>DǁS&cd-Vbtҍ#e؄*'?I;Uݏ>?=w:Qux+E$: 6u:nt?0$p tҢщ{7N!Kv _`=Dh8(Mc,hfiֺ2JW~)0<7A| }s Ho_sH2P~(v;v'% &,D<ry1At#vPTlˡ >t#"2VUhs:L6{oUQ ZQAa-B!L# ^}SQJ#8FLpWvDSlb|,v_DGw3b=d41LMvJˊٔ<Mrk¾ې-P#rP#eZ>wت:G|bRT_f*@hW'tqndG[ p㹪-.fqD~SAyU~h7ۿi%wp Ͻ&5jf뺗Ny㓿K2ʍl!g!/^s܂\-Vcn}FھEaGQT@ŊtsO w :θ-ٲ0q-[70ٮxM`IĐn[mbuAvc{Q)=gY~Yk|шԸvBsHChuvę%Xߗ(8^dEEP~v]]9ux~!]^G>g%Xn{c;>51R4Wԭlٴ ,hi}5[U't C(~hokm@5R!a] BCȔYݏ響 PXs. yò{b 3R{uV}T$؛6?=.l|fH + ݹ8w3-!QYb[𖶨.aI6 Knd9\f;6ثF\/.hzL-D$n:kB"'ǎ!Ww\"{R;Xi}>á7n|@NP\4Ok"/[ .]wO[$RUc]S0qɨ?<7;#4s3˝uOf8wWKKPE cA4~նY^E{hS6H RoC$Yߎ%&džaO.%IvVGU%Lg'Ȝy7jU'*MHg 5is^ڎpUаUv3n.18޴&balaq3wkrki/"fc{)f u5YLӰ+J(#9$2C CbHLB$0B:^+fű?`spx[AJ;+I1P?ӓi :.m^j2zmhTb%14ů6  {ë_nM檥ڹ?ˠ@kFޏIcVǬ4d85`DO%~ְ }6]xAvQҧUK~]<=ESO=}'Ife:uI_\Th!ch![!:V;n?ORBdפu)qXւh>&,ཻEj֮V3~.xhvd&o]{/=/@&tTˣW48wyߏp_i41^$wzyD( ߡ{Hhoux$)D1zNs׾նUiO'˻(xXw@Q6G[[.ZEŦDw:q+l aEd:ݏGn#v3Oll[pF9+k"S߰fXmm_f$Bx "q?gZ#`$]Cܶ/BaqJgdGV$}tAAsb%5mdQwcY5]m۩CMm,ic APN|aeLðC` _-k@GDt80EJ}V$DLN0 4cpp`_1H7vO,z@ɳ5.?{AbIT5fJuM\tB?=h_jk=aN엮? ǔW rG}GĶ'H;OhQGSX 1viھ` )߽Sz/C5b"\xUQ@1T\ŗIX7Na9A??ET41SysG' u̦k|S̤^FRǹuO;." ^6kR wifGQZ63&^:-()ynFhjBFcYoJ~Bu~㓅x9T6zD`uI}iZXjs%FJg& LRt Gab@FJkuVSC!ļR""V&t^5#XsiJX<ʟWk" L,fo`aX+: suSgp|y>"ol*p.m"%2 btKmLd#[ hX6߁u1C%5yzJ{ Etnm(J$H&ΜņLQVhCp]1Rc$3CeI0nUĭ* bU#)*:*Z5ALo34 WʠɓQ8ZCY 1F6:Htc7fvz2PS;IuVFɝ.쩚6}w{B4} :qoB3pWl Ek]^ Hq)N{x_ϥp3u1NXm2/H5,7矋~e&|R"ʮv<:SK:ɘtftfry$x̤* |0iaQgn]biX5OiY?Mp:p{KX$GK1vZiDzB7qO,Fdd;69.X\/V1B/{;D xGqŮs%-tֵmc A$DA%)4_Wݽ]a5rn8ߊkm^Ydn[ǼnG*^o^5m_sռe]PoJ҂b%[i@˽[ibrU)Rơ i.Zh٧To2Ҋ~|[rwg4/T5L$@^BCeP3yz{i>BӘp:,jjc}mEkd{Dgztgr ųtZ2h5|K*W5 yَ\sSE k*e&ME^it}^SӭK\HN  6_-wlƼ{=yVry9y4";\7.sHmOoDG8hkI9Q{X׉Nt%'᳴iAS;5Бg/ux'ɮ 8!^ M2qg9>Seeqj G*9V=c> ?tNT˅lvdE.@cT{7O&<* qާ/LiG1!pcVU%i zg)totM˄3!Cy^ED?DH򽎋$9:D1]Dm5cX&&k`{T„r% *KP_h64/hFmz|ygD?$͇<Σ1^$UY|\-kebU38hdjGqd>mأ61śȼoVx@RBCG܂hgQو_Dh*ם΂v7vQSCu 'o+odG !M 7q1*#-;KR|'HF td3lgzvO㽗PRpP@gth@f!\RRɦJ3vn2w-ZPG[YvgTX12,\9qFNlCaO=Fg7\b L}1yF{{0* zJSsyCp8WHO(.~HY$N;C/Tx,h.ʯR,8_*Fk>IFux3>{=i:];[bڼCQMV^J!p\7 :P?>z Ξм\DPh[#`*Ӯ.I] !xxY+O읞 s(V_2(:8I~KD> nk O`X/xax[;ƈnXOV=(BAw\CUֲ>eA9_Kbc?rwz|[H`IZU{yv {Uaa4 `Q#ٞ.%x:9tnsUM?11F]Ot;<,er AT/f^:w2A|=Z<(O=* b+4w=~2̚b^Şse9{]څvo䆢ײ@s=pcG}4)Kr#gko^t/ؗaیոYJ!KLA)X.4) = T xDحʛ欼ѽNAOxa?“\`t}[=\/OCLOsTmm*.0i _xdMLTS0@~%&oġW7bh o5/P5 _neܤvaIV\ aYfqjO cq=˾l977m 97ᱎ0x% 扮7)nv-H1xzVS:X9xqf jb& 8C% $N}Tȧ"*&2\SZl6JHwOi0g0 DR~cȋӨUUROBeU8)p:gʳTXV#; o&fRP{7U 堉໚ЁRX#Eu g5Q{Zf\0 &c (f"uTCc2/g)nO*gvq1y}JaB=Q٫i LQ-cxZ oZ£SM!lDh F{O NSqE'ZooH o 1*tsJ&'t&gi3eJfGb2=ſ\kdd޽Mf84X;ViZ¡*r٫V1p{lzE|W7P!6w. w8@$Y}_ /-[D)gL0^O@`ҋyo549`6UcXXG>+Cjj܇=CxilPx_8pvUZvNh3Rϧ£I#5ѾnsI-ee[3c>U&T2qoZJ-;w1;A2{T<Ǩ뫸PyH_/" 펝#i`Ӗn'K@pfJӕ1X ;cG+DT\cfv!m~zT=<#h=ECHeA* 7X&I8 $p 4I:` :Ouw] h0ù)cˆT'% NyٰKVY헵f |plԳՊ۱x F E@)4b/Z1R+>ݓBoF[x/=(ChAi"5OFQKaQ#spPO?H%YYbTQ ֥B҅ Fe{~G_= e7ݬY5Z#JG7) eV 8brٺ0Ra:o*!tՄvK(S:*t Y`"+VT8L2ޖ| vS5-ĕNQ7˔~_Ծ0xRQʵum_=|-P@y&'*AVq%wbgUmڛAGEl[n@y eMǎAe=8!([o{) N;e*Ao46&z%{g߆lSE%T}\ĠfN"dN߆y4,OIQX 01,+G; c U;n7QCFu!|O|3MDFFW(Nw{=S?9UPĥU R%!F}H/SU ϮNUBjG곕!ESNss1nL: =0*d~`.Y("RYuxq9#8X7PnQ@ƶgQ*j.kXbl:Z_z~j1[v3,) Tّ3*HCe(w^j +[K8 ?'V oC@5cgtBL-y$Lu{/ь#QJXG\C V>1##{s V,Jt(p?W# khtR\i#j7[SpXLv@w 4L{7CKv7E&Iu\x=pXRRɠy0,? c BQm ^zp7fVRn:7Cn2"P ܚeup85)qM|Q*iC *f ,rR72 ?(m27?ɪ>ӧ bq K^Mf@W4\˫}T27:øEiRU8{jx-5Vdbs'd`P; 0Txlmy+xy*vsƯcsXK;7F&t-j͙uz ^ hdlQ'" b|X_T;{GX]/S<xqW&xD.#N7Ѡ,̪2kgڧ#nH ,p)\8i|.?=Eɹ{!}+7AR+lGrr5I? Jur@xVH+WhJ\å5. z%b/-/*2 \K3@ ~o ǀa?0mh\fX&U`^9%߁7_߃꣩L=1s ނn-ЄO W!NO﬍j8@('|#e@3)[xT8c>d ŋ?Տ!؀+i 7䰎]&@ߪܣ\ E&b}m7fڢehFZI#\=9QHuG%-<ǨPLB*yJ}޶^.;?r:H?=;R ]gD<[yuF[5W7 (|^ԜU1Sr~Z҂bM6xՅ+b} lyРsmBwo%"{=[xa~\%g=YQ)EKs)tmčhО] l2nnq=4'aM"QOȿċӍxZeGO: JۏdžLv 5ơȵhΏUofFI'EsݭB%n+xbf!*T5DS9zQ)4/|!N87@ƺ\ ߈nl~浑ygJՍ{׺&g&%L`OYkCMz DV76+ endstream endobj 1431 0 obj << /Length1 1616 /Length2 6710 /Length3 0 /Length 7748 /Filter /FlateDecode >> stream xڍT6Nt(1ctJ]0b1C锒n iAIAx9繯]=25s0@XXTPXXre'0"=a̿*H(Qh 2@Iaa_DR tp'  stBҒJnP$ t(':" 0B@`P$P(w!!A xC9 P7+e. gjDc'FBh+ {]P$` s kAYPܟ޿``+-Ep_D'\vhWԕ `t AQ0_9 AY npsQDOBu.p<௓ n+ {/w!8 'm"EąE$%$P$+;7eFp8ӀO7BzA Da6C8BO=w 4LoPY HKbbII@._a޿$YW&{o]zZX\?oo}#u/W8v@ :jcu0/EP`(].$S ׇ N_}@˻P}'ם ^; ^Dw7EoC!_'".#`?"t'q@P #Ph: I"!;$Eߍ(;/D?ZoD?Dow-'_zB9Q>0{?6txB`W{+oL rs}O ^H$N=u}AP "~^tG`cLdžY6@)~ϋg័Jýdkj'?v[^Ǵ>6h yd8F4;N3dWqAXq3Gi v f}/)R"s~ Ɓʅw3/$ܺH2I+(˝cC 0Rޞ:9@#>$ijcnzvzK:Fw[i?T.O$;h(X\qFk3$La|wT?g洶0`&q㩉Kj*$ (z*(:K#[R^'%U2v}M9K>% VKc'^>OI9gMTk̔JV>M523Ms%+7+?EJ^xnf ԻT55iW Bdq j^R2ݠՈu!WYIU9zd4Ox 4>CWcCsiQO(kY*&WʘwDq37R8x_Ԋľ+٣eM~Q2Dt8[MQk6L5F9IN,7roVK 5Yj}MZ7ztZoxDL3y{V;9Az_Q)2{lvܖ>ӝx-0ͻxظXMK;(C;ߏNH:Rk9ev]AL{O&2/cvJ'RfyJ;d%t{CpT͑vl:)wTXF::tNk[J 3/u˅+nFrS2c& |^oϔĶEjoCu)kԈØ7G _.0$&\{ٻ ֋Q8ZJxVM렖 Zzg/J=5nNf{]dDߡۋD\ 3 :)yXp1M'd]c ݮ#Kd*3"]!UJpKj.6~^xk:FQUߊ"}u5znKTnjs23 ଑L_JճrЫwy3ng9//;L,ns^԰,,oq"%S \Jl"Ol]v?3խK^m =yjszi3ׯ^2R¶|?*lY^RHb?с'r4v%@A؃jU)=dojRb0dtxJ4g`G)`q~ͨX>ؿ:=|xcep2Ph|4"BW B(>di_UX~m/}otY`D?}b.J:BMwjc`9SW>Hˠ[RǠb!Z-^}ͽmE歂T73e?8m2Ur@كU\E)ƾjOcޭ—r^Ȫ8ZALI} [hu_񝺚ɨθ*sr=pn`^ob1Vhݛ86˦Z26+,X [xS=V :{q$fuBpfT/le7i7nn8byVbۚF89ƻy D 2M>Zqizdq9T)<\m-]PD)աk؉h%x@lvV Jٻ-@Uɶ,0QUCedvwHS#~nkTs&&?t}ɜra-~$LhP54ȟ<#.wMW6Wu!6Z` Љ`Ɋ} wT *| {x'_R?&3735Z+_btӥJHgYׁޖFez^&}U3;gdcZX Q y. `~xs78:+ H% "Ye7zJpޢ:j@kbe^]]FҪIN<:+.0Pyx¼.i-6-qWPV3azܟuy I+CNw\a/n5>#`AR~{ωc SlL-< KZ y:1q8OWÏLNp6mՂD=S(ѝnz *㟑411,1VY+#R7z]m om[e]롩~BۋwL=ffA,[OiZ[u *o?Is~,N:RtwV-Tbt4MZ2EPkz⸫];qI>!T[)zDjckY [ \#cQ?$oIyW3St0| 偓*1ơ}XKf!fWq=#O Řp, 'D-FEO& R^]Z0Xdl|282!=a}ӝC9CY>[~i[Z2N90j'pOכ{ ֛Cս5kf(o:0n3>k~ZwKTsW_QKFUP ,>ةy*}<0,~DT:bH3umodHzoI4j[6Th{ECua}=!%| 65}Q!u`%aIA0;p[eԂ.!CZkW br3m ;]XLUQNWѷՊ "RTcE'"t ;D [z:|)}&Lcgc:51l*}=6})zE\*}q<ɐ /XGK n}>^g@XQz?5jK&v3ym+}?͠ށSHgngBd^}<16G8٫o-Rъr M,'){~ }dZݙ ;оH Jǃ:䗆CH)vzṁg:w^\Jܽ|#wl-yD̾kK=$K#:"<۠!O?9̸hxMLT .+x ܏ZϲXFozJ$92+b;-6YD~TcA٧4Gɝ.HYFW&eXeb<Nzi::d-i!3Ļ@Bq͞::aꦡ(4dle|܉:/H?\^&ˏHfΗ(D ۝Y֯~drMФ,{yn[-蜳wS$vszmf]JS<̍Жwz=+2,i?MTy睬4z90Œ;JgJ34 a6ȣ.JVZƻQ/2)( u1wuȔ#b2"koڝ8OP4K</K 28#~߸L.LK%lf:Uoy[Dͬ}\UB3MOHf(_]/sɾݮ1K9 ]5zf RSvA4$ՖL]Æԓ}3F}?| sڅ>x@&'ݣxbeV<H%=MLzX(Q͝) fV܆+ ''E0s7zᣚI|րU;1gZ%noN)l}R?q^/Fu=z1XsQњlkՊaOqQ'whH҅ľ7#s#%/q]l<}9!o`&<:%=ZxsfcUMp}2x8Rk3:3BWc5Om]V9Wpk/:{e\QԢBsݞEQB!3sWZPO@s*QwCVFM{`Ǝ^WʟD$OM0H;ꚩ._NOE=)"W3BiҹH 㼘I!dI`w]#T\6ܧHxyոŨY7M kSˮ!g>yN8mLŊ'ώ.{[Isg %A;dL׶:+K=MB)r~Lмb`bRW֋vC-)XJvʞ݂۸f1}~"d5{g.S;_`zߛ-%x5 C%4K Rl 2CUm\'I/? + {V4IAk2.쇹1m~|p.>A((=iEk+% Bзs/c'Յ̸ris}H| ![#n6AKP&˦8O|@U \)N$eB~,J|:r r#pw ]՗x"e|^ jExЀ+J:uS9ӟkL) OOg%ES06*;H;f,Kk_|Z Sh$3| yVaZȺݝuO$6}NB?ktYP83v!"BdpC.ɵNw:o @CRb3IwSt%`y&Mw-LVOOo}?!8dd3.QZ(:W{q`'/ۑ؆Wx=.3}}(SƋRL̠%cL 7#8fpdCl-hW|\xDJQ`eeEHnLg ))^N^n(ϐ`oS67z]椼HbTbbeγ`R|etV;pԒ~LK\[/W@G-`Z.hvD^;FSu14C>+t8.|BbjdׇDN!_~|,F{Ȁ=n̑/$'ivıOыM/k0YL&q[ X[#AƼ{veaݯi<Ӽ/ ˌٟzƟ|Iks˓P;4%ZQ~nUVWzjh_͓th/飻4#o0LY&YFy@=_r6թ)6+ōᴺpJJ_],»-{DԨʜXb SkI[rߦ+)];ѓ6ɀ1vHzԍYm`ݒ؁漘d[;ǕP}R0H=Æ m k endstream endobj 1433 0 obj << /Length1 2192 /Length2 16719 /Length3 0 /Length 18031 /Filter /FlateDecode >> stream xڌP\րҸ;ƥݝ]{ ܂e#ޢYߘDYA(`f`ad)(Ȱ0Y((ԭȑ(4NVsd7E{- `ef/@ u:#Q9<,,oq6pm:Y@ƶ5S+ \P[ ^&&777Fc;gF' Az t: P44F$ nN@hfbotE@@)KXY9dlaeo0$`z_ƶoƮV&o n QUM@`gFg+ۿjd[%`gr݃ߗkcf273 3 PF:o"?2 :LP>dKV0+ce|l \>^<_BbaY&@ +{?@;YtƏ&W$ 'E{(*b`c0r0Xٹ\o>OK?<؛; WoO%  C(: 4@g9M>X?o&//3t_ ?vVxhr(8UkfV.vTl$"o/;L ljamŰ*;8[ybf?gogjrq~;-"oyH؛:c''cx#yV 鯋0%qDIqI`C&?6$ޢ-zޢ+L-zޢx-獌Ko dl #yc_ei&?-+ }6Uvo7%[=lo@L-O? o}sGo8Iv@?8z[sm|o:[YiomQ0[?&o!L?V!h엩b|[_@;ii/غ.Fߍaw,Na/1m,W&"i`ݩ(xkXr߂$nr6떀t"O(oS?2aZE7U]b%f$lHbGWMi<OUpɐ.UOAz)rH nh#C}Q`t !qvjO9%GL07h)^Z\P'uqY%G{V1ESr "VÈ &:kYIW$ X|rKѝWHx9ij JU}G+<(6k:dVU;ղ]]x'_흫Uj{_E:7^/;:D)c>D{n֯z=0 7FymxWo9Tzql.F;vF0FVl_U@řA*?\`ph`Cr- ~8|>J("GXɊI~~Pb*Ȣ=\'IGKlQeLMNЙ.%uy6ǝF%ڷ|JX?Cy!R?-}{ߛ1@zZ(O/ZVxhb2DCb7&>ɥ76IH?mA0F a7>Ā80rF7>zX:r,p1_%WNWe{D:rxj&r2I4oW̚H ԋP8x\1L>ӮyN|׎]2/h8`¹#2.F"?4oi?{!iY0#GKf Ŷ1[OUPf ôύ˖\2Q>n$+B~2 iD;g{xqCP(cyA=wqT-}f)(rtѺOHЍx'87 J47DS :?ӹ:Yɠ}+ FVkȦl SnEW1;]q < //K,vn@+}ЇVf:SB +6>B#5 i!ҕÔ@!-FGeE<59 :>qМ_Y}䂘O 5kۢWƘJ8|G#/mD^lOֵJ ~#@AaIBi#j|`]ܗe{^9~vQj-Bad1RV[H]o4Fqd0]RR: ))>Xh' "$*}\ Ak}j4y6>Ɔ)exqn1aC^GS1v˘5ĬMv|\G]`FJM6@!A]`~#10"FL6qnT^8y5 䕅GŪn- &G Eٽ`]&?ޏ"&&12w,gdEVK">m.N<4r؆,3n䶣jB,ϋoxRnCLr4>#v Ob=ƩcĭH@i)Y0,F>7#"E,|Ac! քb2^)<%?{;{ _h-jv)PĶܥ>/۾[2fw @Q*˸aOK=c̚.CW4EBBaMd}J=kDx~WaqClK8*Сm]^GHjdsb1*@>$|}UK}n|jLhwK1A?j~K~exv|~?4NUEePLqxE R,.FH W魉ԵX9%u 6m-_l䈪ք E>t}@'W"͊BWtŀ|Gϫ#WED<e˜u(M%v6oR>6IOT̩rultX2!CaC|QLAIto+q9pW9m]5p *]*-4 Q?zӚeⓏ;?'JcB zYQҠ+;'{RLklc ©KRN4,}j~(/ЌKP%$c h6 `+V6$bi< |l|姄T3(\,Ou4kU:!Ά:S;/EW$@C0K"` hr#ӮTCx.FERᣁo 3=jG$e ٭ɑ?CH4#ΐq]6v!18;ϏoX?Z1Olw#OȽ9žrIYĶދ __ g~㌿~tB& B$V폾g,5zaHG(\fi*q,sDk.OD(Ttߘ\ufu;}f\,kzVoaD \6 asg-c)!0T^POyz*x[E( &_&i.٣EC5f:IH~`vm\Sv^c{9chicx Ȇ|`uCvB&X4\:b8WH ez+\=0G rF!'QtckSb"lB{O5>>;!c"+xɇm_`QNS=o+:;$6=%a91W@ Dv|8IFl= cqٲ U\0gyʴѷKe;,k`CnE_5g2ɷ,:ƕ:Ss1qHa`AmsDqe1Ev9=! Ud-aoYd+i=|8LiW !q~/gυm ?&ѻa!(lyDAsc3)z|$0!߇7OiD #x#ɍƥ #!XelzeR( ,=U˜2=1sءDD8& FU ^Wnp_5.zZg7Tg 'Oy^0\sFB6PP]qضx+Nx;bC(/n42FVeAlC"”{O~2@u}q` CvGN}M7Et&=axYb3ǑbE:6F ĵ:?H,pŐ$5Sri6{U=@cua9A]!e["+ӸS-j'%E;[FBGLXavsq GL B[-0~8;C<}4_TjG!$͐­$nToSy4uSO!ttW|P٢J)O]9ѵc\ܾ~aqdӛ=7[>~+%ȧy5٥GӛN'2gvVÙ_ be:6$ne CiJ=GPjyY4_e/f"@I᝟| s D #P=ߤ}[k)L3*'Bnͭ4WK'=-mQV(o&%NmNTM;xAChfgVՄbq!`$A_TDn?HGmJL8R͛D d)]H\j"!VpVoFn#@)**MO8%A RFB?T%Jm̍Yl̗7_ :8XP* [O>#y4;"6v5 Sᆏphm"=H|li9㼣Q&yX ;Mj{4DZ\ȓ]mAS*< 'D -B4PpO|$5Oy"1@6|ƪN}BRn%`q v5῎חW e>k;I^&,ddXv("[ %ovl`JW#ke }coDA/y5D_ -]9H?*ɨ.Cw;Z"!%Nd'F߉|9rsd븐4'HYr&@VgWt%bܞUx@LoShHY{Lr^M4GT)-1.K[yޙ]^p >=7 y@>q鎼%3+k.wdkjUNBd?Dm2mA*oS;5_yE~o!GY&,4ip0 ~qٕ =vǸtLū !bB)U!R?ew3VDiK7$gIi@#G MGNXHԙN5i d#bjfl\^^Is8q73'ĆIk/=l { gdJ琤,$]탇l.xB܁Jant'Dހ <\E{,IJl0Nh!&(1Xg1 0=柆B>lӶbԻѮ:,GКu)@Dpί6tLFjQj~Z>3rL|V>Ąc\%<0/ؼeuWo2ι-hgTeoՌ2&ԗxm3ZWs $^678Ln>5%¹,{Qg+ڵ+CĊl܆sGZbPxvd+F[V*A'1r͊EmObsepӶE"syktl`q˞2}NKEkѤ8'dw?fR_V]/iy5X #2tKXn/Y!)jhV7t_eB 5I{D,W̓vӛ8jL#*pO{Ѝbty_+JRD Q;_X_S8nP=K daos"=dSWFYQ"_VLku;ld8"B̍6D&C%(?}80 sd% }Xg` >7/*3@Ys%m>2|ؼ#<iP tPHV+.'^xJv*JZH@?kUaka驤fuXSu;{m.eաԯ E¼?ϝQhUFw}۸+[::^~%z??$@hBh%gC®_K$+!}Ew-rev ut?{$KVa!eyfrQ b^m7Jd' ƀ/h6F8- yx<`v;/*@ 6fANeS͜ɒבG]`s6a:D6.Gf,Yg/I4¿!=Q -vE=fq3'ȢsHQf?W2݇56c4m gB@*<$G\̯]TxYD݇P];]ϗ п/f,#A|.& oܶb? UttFfrŎr`HhK Po2zNFHpeLJDP[lc&Dnӆa98Op#ub3Ze&:&y¢IRbwX2HDkX%抖Xhܑ1U&* #)@5eӛ'HíZ=SJt8y}NqWcmnf-cl/[pvo(^Ր204'~UrlN/J q됰 !fx7?K!,2ÔM'DsqJY f'w3)=? 'E~L"YD F"zfBK_ɻ}vӮ^kZpMD4F,@d%VA}15,)ke/+5ae4rh 1+sº "GR*dC3#5iT,`7?0BoX|DP#nEfjg+׭-DΩn/u'ÚQP{@%D|Ύ lrDLnpFL`$KJcx>W^x-6 ?1R-MZ4!b*'$\kj;s}w~u2qJKshј&:B'd^Mc/&@nxȒ u/^״y^b@-Nj(T: ,^a UxWQ.xVsI~/mReY4:]P/tNY$ s`{"aʢ~6zj?Mk;7yr#ҡzmDzmVZ(gu~2[K„kL1ᙪ\@#h]]Sio ˦ E~RkiѓLZMŬ{BRS0/)Ŗ.,%U^̺7 ;5ڏ1? 6b}g2p{C(3G{B]ްP1 Kl Alb_D𱞞:El~gyi\ֿk-賯3X95(T[k >bnfS> hׯ?e9I%B[oz_Q j8GP`B_ ڽ{J!2@wJ-#Q>c )f`1r,ԔP":7gN,dHC+{ݍsq?ѾdO,B`4x@S-@B2lz>ɡů\bZnqMl!I!)pfrМh|8e v~ aZ :뺝q}2 %3S]a`;Ly@8ԡ0.WS,t3C֤ܗ|2!qBFtkČ+qNEz+R>ށ/;)_?AonS:c$y B On79A$]C5>Td pJH+H ]tfT۹1[@[TR_|ϛJSLNs_*4:Fi&Sqk9(%<@ޣgw.! )`|:3 @qkoyfUi ɏK(z3>ƒb{1Mg<*~sLv~G,- b.|(w#% wUvR vŝ$?,9<\P5De8`Ĕ ͞$f`k>an蘼I)"CiCNte,E9N*|T\QDdNlX"J>ze'[L1/+$=˴ asA_VZueH=qK?Z>|(SqZQ|{Js6=EWYvsM" é(^l[KLBĂ#]hY^(;Sδߍuwa;stZkqxML1 >zާfM| 82=x{2V$GJ1ps|lKNfK/E%Ƴ_bF%oV7WFdzzeDd` ̣E+W :j0OWj1 V/1ǂKufOn=LҳIVuڗ~]?c=ݝDEױ{@Jn7yTm&~(jJ] &e{Sײ4y_>5RPV@ {"nl}BdׁBJQxtdYgڮWmϙxW;͠#M̦4}8IÎ)9"8K!S $`tW~vWN۸XE l%.1ngJU/*v+ WUZfJ "tʕ-gzl!_*C$Q45G >,y)Y0e}Qj<5 Eޕ!}Vmqm)(-Q|P=-+VG;q }^3[OM8FZy+/j-s_deLt(DJE:[%7JPo#b|yÇ2#ڳ~yqgӪa5AJ!rlF;Id'rw9m!hvlL/̛8rr#`y$&IȂuyB}ݥ/vRPij/rdJ#c$Jfla4a八tݿ=n­XcwbqxS7.6J դۋH;l,~A(0 z!Dz;q|K/Sp{;~g.W:VFbZ܏m^'J O. lHN1MbX؇l HMjpJ|٩diMR*t>aU"e[0<Jt Q+ÿyfI;sfYj'Z=hT 1Dh*D},;82f`5Xwt$Qrf'a]q5 Rq M#$#3U ;,*1ZHԎllf$ڿ>` f8^S-Ao#Ml׵ x@8}g dilyJkEm>Uq$XDNXt+ DmHv# h5:y%8ŵm(j<<ͷ Hם 'V(M_ +嚄\8x-=uRRW;Z'JKn+Gu0<+ YuRͲy|YQ 2(+ۯe>uYCz"R V{4qmp%q׾ƈ=tSͮIQs*'zWφtJ:9 „L{1Vl {cl!6CWXgO(ۑ^7,zNi_VE+7Skңi;rѦ<^OysAjgH}4_''wW? =Nf6g~[ub^swJ}<~=iq=2K&8;tȀkkdYw&:Ik {Bl[gyVQl->ߧ>2[;Fv7Љ+n, U^Xn<*5젗Fi'9MD3)PE{%h w36|Cb-c0S ъR0T5:k8]a`rIu`OqS  >-K:p™[s/Z7h\i5kNdsLN d\z qw2hV[c} /mHYN-R_{ɗ]J)[EPr⸩+9*r6h8zK5[JwޣJlx}!\>_mٹP#-Kv:6#5¨Zx쿠rh]^҉U\)@=G\Q~"|u%]BdטDZAY! HGn~9ĵ'OUZ&" KyB@va)VK_b*qBN;<1"љ̈́'n06Z4EV%O$Od5""6/P%cH&bp' yk:bM%u)T/NbV"/.qޭju3hmk~KЋ0=Ow8٥bM9K"߆]XՖP=^8^jGӞHDw]&QV,r6kt)|b3vZLEGhR&O,H/dؑ$\9ڐԂˇ4{ivoƋKy>r?U4t=ز3^샛QKeU?"0/e X>JbK2?<>-"Ȗ&VB|ٶ@ۉKP3PI4+d"&35jLfԋK.cBD LP֢TEXF-bՐ.!JRȜE 9} ~9As<\a fdUԪC;)^"(3Z)U NrAJykIhW$ qhh$_.a 2sW:a>~*^Tu󬜭Un]̩‰C8 .Q!;Ezʸbֈ6.=1-i1M]LrmczeAM%/G:=r&ۈƄ#â ~5ĉmGjCp.ġ0}!nJ- "g|5N\ҍyiW z4ɧzRUyJS=bYUhjg:DUnŔՅcpAMw4zv} PʥUDC\QTTda 4u[ ~xqK=qګr8i3SBf+ R{qLeeMՒ9y0Rj<KQy4Uӳ18ܛh܍^~qnvS`vנt-ֳIKf- HSFⷽr`W좡[|}Wv,Ǫ$Ƨh|?A,urHN8YLj?Wf]'TWC<(!|]}q^qikGtM=No(wϋT+n\.Lg06Mc~h㝚r4)]sت_\p'>q;/}ش@jZ'^"''lW''dxJ/|cZo1eV6Lj\6TagVSUDVK,dԍ`T, 㳆ZH,;Eq<{khHT,{6mԱD.-:$juh+ n'z *y'qWҩN"d$] Q=0.9Jrٍ`bFSݣ-؍zՋIҬ&Fn4Z27A膋g.<u ZCQTxf&2M9Gt+wDfP "o?r~CѣxrJD-cMHh&(P"r{Mu{lC܍)uI֩ uBl3K!=F:y|6`*3$) w[`L&5&2U2(-*)6Ꞡ'TT&%Qmވ$:ذʆ+Z<ĀAwu~#v)m kJ5/ Zz1Hku`nhug9Idg&!N{+*\u # @ 3φ4niGxԈ|ö9A_ "JV2- !"O.^@`4m[iX)Fd` NWmPDxdm>oRl!GKN6>Bgq'e oxM8f28ڒigTӕvIٟXخmlvfbn6,Pa> stream xڍuTk-("DAJД7iRwA$$AH 7{"M84A(H^Dz|?߽kݻV̞g? '!"mSEp !i}mmu0PHHD@HHi80X$%100S@m4 lA i!!@4F vAB@ 4 pG;cpG Tta0 !`= Ap*%]]]X4.tE@qA?)u?@#;`Ź10 aPX|3 ݁Z@]G7X7r Y @`;"a@]U-FAX4>Fڃm_GU`8 œ07Bg#wGد Ӏy#ma'00oP$(?no? h.('K h?_#TS12C?A%%Г_Ł Ws:*l:Yo&.gon GBbB{ ~S}"Ug{_q߀#v@ڻA/6"~o6 tv:_E/t~o?tA8ⷘ=Cc?_<,!wrg;k?m~} b@0v%Ā Ban4@q 7$P?4g (-? G@ }W Y:T1LO,VRkQr13P]? 7ϱGl#7M 1zLPx! UcwnJh54Vifz1g6Z;90",Q'MSZN1=EmG0REQYjéB*O5 Y hsi-دڥ!b7rRhcl!gPiUѐA+= Zp{!J|~P4 Kz10ɂPgq];W%ʺet%5I#ce8ZhgXY46Uo돁<>[TW_t%Ƌ NϤJ$`mEy ZF!H3Ү `B/I8(+/YX6Y']u-ʣ7|{dѡbmu}F^ ]mޤf=QR;k;ל(szH2=te+asbhGKU>Xz|ߴs Ur0ot,XّHT3Jp)+3Yu-̖!^bJO"R0^'(dX"6zLhf,A6Kբ1s˒i7}g+< 8(dMǬM0:&j92%b<.` s Ff/cW2OLr.% %t7wd :6J>זI.EK6Oa(iGeKwJ-cThvk0z 3a(.zYbyIuE#K-ç+=U'e0LI5M?}h2 qvzjK Xp+N?kEsr Ҥ>nZ=I >amҏtk&* `cD+Y׆r$qO'OHt/8&K. ^m1vT5/Yky_IZޖdŤB1O$$Fypq|GoW̑ XZf}Xs`g\Ʃ~㙄󦦚s=O*jinXl;Da<&srRףD!uyNtdAZۆt - J-Ğ)FDEҩ8<}ɛUD>OR7nlx*:]Lj&ɇq_Upq ԭKGO-k,pBt_PrdQ[d؎j'|TBzPmH.j6r8 P>[OʥNn|C- ʃ K=NsWI{Z>yBHAXO5$Ci!{wyg1ߦ-?V3vv'MkH Tй;бMj={'s`{k#RlsWs7`1mBpX'z{4DtB^Yz㧘c*ZZHc :Ah (fvOGnP%$V*xp$IM g{_A-كu; -McG}TOUzG=& w0e4C\J9.t vZشfPh7N:] h 1 07sג.芩/KYh놮[ Y(\^3)rɸB眂&C}rRЇg j8N6BhbV}&ߺ{ ܯ'\،#I̞PJ?׆aN_ .X.)Sh~!˴BbՌ= L_l.A`qΗkRP6t6T|%.y}D_1ڞ0Wz)hæk[} &yA2EJriQUvGcԟH :a:uF; gxqex DPNnZe˄ ޝǑ<9^ڡС[0۞#FӯpA*N҈o#"4xP+k%ikbT=ޏ,I8N 0f录:-BQb ņ!:$M,n :DSYgR~^` Es]\ —nn"1o-""ȟ( xs)1%=Ͽ( b/:=a[FCo#I#͹hڠWkn!Xʞ=vS7@fRi&Gbجg^TٰB9q#U=Ɍmb0zn%1Ɖ{V?0Ad7 ԖӒJ)nO?ӠDBIpW/{l)vpee;r]P|>8#4(v#x@ N7K{q>\O$5(#mH9Lt(Βsh2F$d®Vٕx}I cZabyMWpӳ![d`IJUΪo2aʩ^$ `͢kOmeLѶ-1ڙnbM@nK6+!n&!et%Ww] <=9~%VzNvbܼ+mydƆ˫wy&9o|VGrgmN&!Z&${均)oXMtxKcd-Tw<tM%vW,lb ARC8(NW CӺD,|Xa`k|@2p3Aʘogo›GZJ9eD׌K6SYi.V: t.^ ?bdgm'%6ZxyrX`I=s:.K;i| K1CQTY7SbBUBaz;ESM WIftU& OvMh/\/of/ᵁ)O } bt\zA/J`Īa81y[-,UL%:T^ʿ “JQ%LlCci;^b> &qW"RC@SzֶG.YUOZ*Bvy+"}֊_VLr+NfC6LZ'[4VS<-?f $Ω@.SW (-o$X],eP^lě**]s7&amQ"L| ~ ~is^׭Pޜi>ڑ7cNY~FIZY՘' f5iv,/zּ/˾W>+$hg0rmJA=\D'.gǀ R<?.RW|o떰5 KJ8$8\> )]d6' |} FU"AMַIT(&*K%f\Odm y@ GXD! Qc>IEWPLskc-Ҿ7Y[+n>uy6n ' Su,gI].#u/}e_.d@$Z?l8<,%Tw[+q endstream endobj 1437 0 obj << /Length1 1679 /Length2 10004 /Length3 0 /Length 11089 /Filter /FlateDecode >> stream xڍP-kwwww@i  ݝ .ACp;3{Ugm_gUw5%: PWT3!QRjm(N ;0߿ ί2 cW;E;0@`ccaΑ a 2(2@'$Jq;{Gk4V^^n?@G1hl }hjlP3=+=3- l P:]f߄Jƶ?1!Q4,AN̝݌W vzp e{ Oc?  pylljjgko -  @YJݙ` 6mhldoj 16y5rc*_LANLN yeI-> #=5 00sg\Y,<5w5p|p#J)gLCE[ x c0[yyU`՚Hm.k>"VYy9ר:I!#^WAicxaPrI'oRU){ J#+B;h`!+K ]h`u3 ("C'rXxAa=:$*j|s'X)]R&[2d LZzأ?pFWɮGbzlhXŢTը**Ӄ7$<y(LT2Pʻl)E؃~5$sz|[=OK >ޔ+#a!צPt&>D; Ӯ}Zwe0|Z5}nk*LzÊ?QJ[*{dsJ3'gzo6+']]eP Bw-crTtn( iI8FiPz/@ർ3xYpʜN &>1O2f3"}Uʎ`<=LaG,[~ EE ㄓ3;,t>mu:4ZYØyƌ\R`KD= &L"|{^UW(3}nqRdy&IYJO̔?r7 P[2nfM$=@+B7Ntv)0uJn sMdV9mB)PwzȵÎ0 X~{ W3q3 i|_oE9qVN+ii)03tEc5$%ǖE`Ʌ~㮅OoI:ؔzכm_^AlGRo~ӠWppP\#Ac9`cA,j52lއLs /X7àIhoCN\:CV5bk[~As(oq;s0'+{3ɤRNs1Y = Xz^q): &͋N , XJw,` B(r.PY>a4*j7kSQmY n)O()4F+{54W \ꜵP+aºIqV"FLO3*C"|SO/WzF4[ʀJg`#!9x3+9OI ۽-ˏudsuW$w<~>86ܷ JN$Y0ygᘆl8]-*-X ~6nVH-1ё2@K] :×#bWQNQc<6qxDu 塉$$e9BLC^~ :AmN?- 1v&?QH)*[K`U93>C?Xh<(7v 'f8Ы4݄&au 1@p͸w;GN{|e{P,8C!L-k`HNp}XS`<;ˡ̔|l <c̰it5v'IߖDiEYVo/>'rQ1Z'{s[nԜfӣ5`3T"vv:Aa۳5-O;7 nMxJq|{fjYA\gWUj5sY' .ȘޢMK-CJ{5X%7-Pҟ3W#} AF)KiSك@B5O.HήR&+(kOKjh|mIrVM!3f2*_lM~=~A,:gmhNCV8 }L)5%9fyLfuo_glEJL)şݟD8S(E $8F2CϨLDaWjxz\k쯂NK_W| m=# J-]M&j<\n}wYeg}d9>bDˋjV=쏧F8Eqw-'Zm8Dz;d45-+*DțqRdewӧ3rlx?aj(.el#ϻE-_ĥ*StmsB OD0[τI?./ɡ+Tz;!^f*.@V]j_8vvCXmN{6xKxchٽaY yc}վ@%lDpi f8KkL=ywVngK5~SYɶ38wkN*:?L:MڐC(ñmtZEbZt2՘MJD&.~M`>iXU:9c2#yOΨ#ׄYE^<$tuj ;Uj T<Tǭw7`iyGPm>@U:s9+{QTKB9LQ&]cg<Ym0$ɌQPSX7xY]AA [~ߟz23NL#\A&4;yo z|(skg'Z\aXx7%MhCX Q߼l ?c_02PNLŶ! S `h&(I&#vJ/$&o|4G:ޢ7Բ_fq/F={3OYyݢV%oy2龆Eea&2l^+߫5T\4WO]^v~YAjk{AB`ޤ Y,Z&t C"~Q9R4}jmpMCPLE+z(X9ɖFDá=.!sJ*KRiȗ~@ާȔ2.3-* >%%g9f>_TɘVM)AHdB;j{}?/kt.dw\i ;E\ U̯ЋkP?(^EmBpB%*+-OFyx2Ȅ`dWC{f$=}ɐ'xB;H1X TચoÇ|E9gqayy6 ਲ਼R`āOo 6-7=vs,nVǛ+!- @r>a~ȡl7퓣wo?=RUB߼ VW<2q{3@8@fn!04@V29x<(;I_ѪC'}rf,gqTcb4!BRB*jI`K1 2j1ާk+S43;;d=>} |!gtؘ,(]>?ҎOK%>0zL5;UQ&Ф"/΄>jܹ5wF1T[솋?(VUj?Q65Ul'zvLOOX:TR]LjyŽ*~&!DaX">lq>Vs&amz6:k>Ku(7_O6P8b˟qz)9(OD~Mh{}ͬ<_\iG񚫇HxjҚ-4`ʞ?]Y] EUSS S4s VqUMˇH!s ՋXRB:()srssROϔpU<C> _[)/1_yQ'Q$gcI4?.tzt,OCIꊨ{,7'o4(gJ# \ /SЅT<’B fS7ZbUo}ܟ\gm#H q$F0D ھ nEU]Nx%z " :?|zz*BX+FNn7/%GkLxV %V=v j?Ed16ݏ8(zCa2KN6逿Rk9M <)G@S'߶ /naD79b2JDn˺"vz0FMNz);_֐ʧv}۶i)?d#K{Ic!Cw '.8G5 l++WD^/-bppFtP[v])wT]CoKSJK;l񞊣q}/!4g|59 j. _(a~ަU)(U1_|CnZ01y{~܋uޡFϦ1fJ(k[zx ='74{5Kr=V2O.A]cM(Љ<ςn/{Fn: pQUGQ-)zSbύ.+MѶ_lN\d}(U.-b-&oGj=:TБ*g+ [DjÔt%ƀBe5 7=,)t8w!tR2MQz75,qÔBt<^TePg x3R TϨ0xIb'h&,N>$ӆDhlͻWh} dIn70YgE`0H/-fANm?y_\ȇ ^z>KV1$%HqX>R)Le>px*rx$@ıBY!pDz;EBTlo1JLFо|{_'ٜ{} fۦO$&Tgԯ{rlZ\ܹ g"t$8T*vC Y5JtTm2<<-<%z6oQMYCԠ ϧa)FZF{I@ZN7VsjZCrx%詔 ,H(IYՁ,LHlaZ.tKCpqyAUɽ<@7(]S } SV ~˞ڀMxJkni!gh9(; ) P F!\2XX R~&Z3z_U4]4c )ɒ, -z5 zSO6ZW[gĠ)& U*F[N̆E!g04@|ۤϧ(pW<>yZ @ 0y i:êR3CS0iYCWU\*h)V`mm}XEJM(* 8 :#%ܚ#|QN\9b?! nd}ĹWJa "g-ޘM}JAÄ=Tw4Ed{It-#lmkH{[J}vC0ԓ}|Q- xVUgstDѦia$(%ݻtΪqKE}0U ߵ6x7ўMgNP8[)R#= fMXұRu'!M8H۔ˌ ۆ7 I1}oQ:?>q͔mShդ\g`~h*E݉dvZ6 <_@YM$JζV C59m a>'/ΌIC,ļ<|PtϽiq+F GIMX,#crZ+R _ͱ*db1U /9;`-|odceL!X!yδgHCi߰Y(5Ӝч >F̔Jt%6qY]$tF}ŗSCj%B Y0-i"6/UBmg7pCTouM>k}}Sazt9c$ة| :=m(8i"ҕc R_T]ʸhw~f@T>QM8{it 2=P(wbU:kښ3ɤ VL߄D~ޤ J@6b!HbN,ѥ@b59*FTw='-E9Ն>Ů|cCtkd0F:ŷ}cjz-CO=;EKSE ¤ 3Q(tI~CԸ1Y:66J9?c:ZCv^D٦T:Jz>5dZxQ<0eXůet΅\n)P#~JJ JR ˃["(>6n#>(F !xT%u:1_o#*f$ԁadEɉNYiI .RR6fYvS0Didwݞ)Ib 츶y.iLXt&xҔ :u,.^z^Ry;/Fϧt܇׆X;]>#MmmA8t|w}Hs cA]$֦)ebD] =gQ?kV;CF[1oI~@5e&1yd S`vr-|MwZ`PCmŬ:a%5M'I8&2(F'1/S lTs[x -3;I靃{:MA(Ѻpd%jaљ0D"'/b, HsWAxT}}o|ٚkkQ=_h/N>TT6@Ĝtpޜ練D6,rb-k`DZOQ K|s0PM2֤=|Qս> &6dsY>g91 ͬwUSeՅY,ۏLIoxlˆ1Nb(aJ#`1OA/)U]ވ#]H;09tL`~Ւʓ endstream endobj 1439 0 obj << /Length1 1412 /Length2 5891 /Length3 0 /Length 6848 /Filter /FlateDecode >> stream xڍTTTkS@eHA a!f`f(iV:D)n$$T:{{׺wZ{ϳٙuxd%8 kj@A^ P]rqBH(& S0yp@/ /"@qja$ <Ea sD*:BP0l!`@BPj)aB9񹹹p}e xAB+O-#72^v-ۯFC`HL `T5Nd w??AaA`0 lP@[I厺~&pL=uYb~P0CP' u g-+¬ᎎ I| Pvߛ` k('+'>'"gA"B3^ +ӍAwXc@@' .oEQK FOwb,u1~3 s'~ttU5U#;&'wxx~0@6__yu@?Qf s{q ?{Cf`̃_%vRrqpa#O.(.4u31䷖5!VP@}l0](R ҁ.030 Tl 1!1DZOQٿϡí~Q@@fy?dR26m %6pZm8[-V7 /QaRz#sxM [dϝ;Z38zi4E#iOLdxIySI^sTpHt|QՌG~z ΝWE 2T=(TkI˰kץ'05Mbr޴V*{22"@)NywwyfD xIK /NvelyFj%nj9EeMt1^PFF}D؊ >8a1w8wzVM/W)}n@Η/zuNm?q,c` ]ՖW/;HL4_5XxE )U7/y;{Se'[O,X36AyA򽼫#gJC&nB,\U$KN|iS -Zc0bl-]>E h=Q.T]ߏ"<.Yv?;Ψy7NSetšd e)j$tunx 0L[]'s Hʡ ke oj^=¹OF>7wi1Fin/2V#"1s-r4 lA ;F7Rx:;D|{qU/H/Evaְcg·Yo4r$Kbx.˽[~|\ WYx5ഉ{=(-]#ᒈ˄yF3߰˹X'nËDž޲"1F[ɧzG9(e1 -˟/'3cT- P~+E|%3fnҳf<ѳu鲻cc3;o?/""m^ ӢuY6VWԡ0 og"k"@"{tLR!ciO}1m#J'2B_̮I{J(4`BW>ݫTGgdꪗ22Z{[~arYP{gO %5des6I* 5L7{K[Zf-s=MS]RPbcH}RZ$gNֶ+w<M9p~9A%3s`Cs_PO>T=}=p\x!B>a5l[cnk\WP#\|{)RɶҁGה,ط/3hrfbn3!aIy#RFc{|lɴr<xtmhvf]w]B8u"DŽ*`ؕ %?Hd>s @+S(i4Ͼ>Hk9L?>Ɠbģ>'v@9l8].^{$m~+&P|.Yp9^Lac6-!O)PhnREz-9Ƿ,#5'ķbfƹT}oR!yKwGUoK\FQI%ϳi\oIǣ׮bZ/!5Q5.1Ndơ_9hpO|ᇅz6kld\&5st%I"f?T+8uĜyHɝGЭyVKv¿s8]cv8k4[Tqw]Ѽ &z8=+=_7wddd~gbC5kiHrƉӔS8GRwS+R몆]j-g=07'=9}>*"~=R-y0Z[%W~ۜڈ *ݝẗΓجli [YX$'sN5e?ߜqa,H9TEni`D&c } /:ì=OyLUTEFdQb2KE*̾{ݸjv~e/cog0:byPSwPС_FӤ,JԴ>Rb|l/v˜ 2!Hč6fƄB)G>fՂblK/8ǢU.JaD$oY'?8vkCl'&rlj#N}(,VCWj<>n@sFe g FXYNxt `nc[j=^Y"kA45vA݇{9*c*;DNi~81[M^Wt\FRCr$Jd^-x ҷrJ_`h"ZpݑN0k[g2jy!db}?M8foi ypg:ڎۻ;_%l1̵|%8ݯ}Oq\$uT?>OPt"C{h=#1Te.Pes+|:GP8?Ъ[iG󙟘yH8Suq+X*!:+ՙqKFUGDŽZj4|+hu5=ҏ_41j zFߎ|:Q.ˁ/:D;F W͚x,/LX[c h=c?툈}Id9tyt98}"m||)54pF -xlaB6$4Mǵd_swJ}wF~J|N/,ϧ'&A~T mb%2ۻAˉ$  o)T%ц'%|IdY+8•sl #sj(w,ƀbuV4`"~q/'f7QSv=j|E65DM9"iz,kF mu X%91ɠ~Ɲ15(*hP58!c;8y^{R8kFT;KA-6*w>WmG~4^$Q J_};̩) ӓH'Tz;vӘŸ9暑N(0>L`֑ll35EJ}&oyP g~e!z)sIkTȥ6pz<bgx:#e> m;![^%Of:tVר;()N숇:g?k2pl O&Jrcpc'1Q~;׊W$㪶Qaf/sirM2y] O%*81p Od`B[$cf:.Sic)n$= 8 ]E1 6g2LXtf[Yk^dNOK~@mu/<ȫၦlx>he0khWmziDo:(Bv56t{>H .{^s+}j2e˭VPf'wBRLGi-jOCa=wCTQrf@p:^OATɥ, ֊Gf%jkӝ)R.CW;5\2Kc\ S+}9 =*szfY=1=ҍ -rnݤ,<{{8`Y^,FEv=:.Fcsi;JiFO~2Űiŗ$׆q-UuX/'q,\Zs˺9I1CFx}Iti>bG!D$Q9w@On r!˱ϼo9XU$gdF%+qE .s.ݱZKqw`ָ3Ig5BgZX|ubHzǞ#;ŐTCU5pW;W}[3/F3Kyϊ' C輶 KP~wh֑$Af[{֙,SXBs"^4I\eUˍenKWt;UT@ԝ(KNzqKw]/71b{V}g7y$p]_4?6vʋ.-]i:hfrJHqC5Ի/q7<+^kQ׺a-~)33,!}*X뵑\q,TUԡrICVoVzג(azu}J(CֆX!ǖyԙvC/GW o\иZ6gF̻۫b!r>O Onٛ =p+GƵ+_W*5yHx(Ti;W69j/Q)BDw{"͒pޮm.By}@ӰQ+P{7DiZ*z-o):L=n1/Iiwgm!er?GILc^JWfu^sH4&PKo\q0eE<*}(kk2JJ)tȀE90L!҂m3@a-ny8 <9OYq7TaeD@+UP߽A*ͧ_ gesȚlsk;\3M޻760/&H endstream endobj 1441 0 obj << /Length1 2849 /Length2 24674 /Length3 0 /Length 26257 /Filter /FlateDecode >> stream xڌTUk SHw-cF@EA@J:˽u?91`^w^w<ϜP3Z8YXj,v&6D** 71"сqX&aSttȹV.>Vn> ]6E&J Zs:+//7_Q{@hhn ;ݼV͉ӓޕJif P]<_LWƄHаq[hi s+'*+m7V&+_ΦN6VK,0ueh ruzڀL17HLS+ W̿€,`!hotpsEOhn7ߓsptX8XX*݉Y(+ X[ftpp5N }"6@D_WS `ac0Z8 -xY `!x,@޿/*s2r8Y06%U1e,ng-h92tfPr2@{ X8YX?\(o I@iMm@W |,j>ʊ@ wu3Q+пmqZظ[C8<j0tgnP\Kt0wu8..ވу'|B-^6 ttA5Q.N/߈ ,q#Ŀ 7j^俈,#6o`8ro&)F`rJE7sQ\~#0E7s\~#0E7sF`d;֯[R0CSWBڸn68`O\Ê_߇_^)pkSsdebat/F`"q-'/+80we|m/0X`? /hG0 9AX ~eG67a^X{;Yno|Y鮝(`o;\ZeM9sUɶGkBºy-7KKŌ8jݝyF mhpfGf**ٚB08 Gi/xd(_P!op^" [NU] [U--8/K-uZgb9>]s#[dC[2Bz?g'hP5V5Aژg˨UMOњEʴ^Q0\ ; ˪B>=lRO=i|`A*֕@XA.$嚄p#Wr椗tC_)(m ds l/ґXÛGCl `WŧaKf2UӠ?C`z]%.7 !VA "HkkpfVf0"xԜ'x3J GUѽяHH&IXY?4?:`}V#۷4| C$Wɭ<^*3nc2(\]Y?|xeFƭjbd9`$РqCÃL?F1Iu#vy4q鹢ܝb.x_5](L75&u噖:p}M#Ĥ3ZIh_Gӄw)Li},U=ZϘߎw8 #Ǘf`VFncWn-otQzvL$_͋tǙLb|0`U9_LP%C7n/mbscuбk Pn$,k=꾟-fS 5||q7Mp*X (OSܓp[Em`?M6S죵}ͬ2u*+=+ڂv~rţn:22e3*WoM>ug'%1[^uZT$ٲHDwJp~rbgݤ}ڑh)u^9H&GCB;&wtknkB>sTD2ƜLЂ⽭XUircA /z͜!uF;7 ŧ-sTEŹq}h/>c1Roa0@%wrB@y-xm1"=-0K6 'A'j88-MR}%-*L- 0^0x:Z}Y(*/W!YwADEII8gCcLA7@՛"\2k*>#2GzJYIޔlbT+9 #kig7DLF(WfRXah)% 9 4\!Z6{HMh т;&bWKfRf 6L9TYq Jy7 Fv9qi}:rf2| OK\sJB<$Zy)elD7@\ސ⥔kvUFDE=“ޮNrjouwjhF!wBsX؟ml&2:y}Deg2!6WXEJґDǘ9rC&=i-N ,vm/G4 c2M4*ҽ9} ;{ ^+;H2#E;>GSW}HE`-CkQqxb|v)ٴO0*CSU+*2*F]1z!.iw3kqiSD?#*Kծ-٥v:(T/ifC6>F`xl(-7p$]Rt}隌{qS`͠թco,<8i/9<[G'$,HfNaV*i Nm0 Ld{}>E!Ub>2/ل=a.u@#,ó\ CޑBV7 8 ˄Tvr5 4%݃n.JC0b5S`[/@,l8%iY,4]LrvK΅ R}[֔OJ%NBlrMbO?[^{a2v/Iv#U5¢.ŏay]Э&fD&f j;6ΚMT,YuTZK6/lg!C jmYUJX=a7ټf3L Dg"إ.)hƗGA(ʏ[nJPR? 2^12[J 5!6~\$/n c"Q>M)!4]{sX~8u|d+m7J[,IZAF%Ugv4 h ݃@ I: sΓA>D*]$(u$RdT-%:#)ė7ϗ?"yH[5$ TeP\L5[W W.e Pwy6(JόOBDp&M ~IBJ }최)8>[Q=f|ORA!9=ĶOI]_pΖ9 u˫ğ0@̠t`"- 2Q2o-)z s\W)fcϳ̖k)iC}[)e{4pӤ:ښO׵uݵFHsT#}d2'2/#qwߣUMؔ~]dLHWD#n-I Tx[ǙHR^:gӯ5XDߚG9jC(Ҟú@R,̍;.{& N#)wNլxuYZip n1HÛeBN%V֔E="'w&F y}M0۲.'E얢k6_;W[&N&1t]~K\].ZCDБK3`m6 4ZoO'⇢wkPn{Z $}W߄&t MyiET(,m7&iL|٤KUod{, ky-V)r~^E.Ÿ&(QQh&ÒLI}vmLCq1m n)Y/5f8#.j"4L\XXnǽwʚ$ЅsR_uM3T a{"#9is矍:ƝU_R5/oǹz.>8πj,*&+&wyS`+sh[ezes@G0`}ܒ:E] xW'K(ԓ rm MW)J;\UKx _8F  A\tݽµВVeq*n\_\3p iӃNOD2 sZ⼈-ɶbs\KpXKBnccDKT?nFh>%TjnWQSS Yun n ?!$ Qdܧ^T{SiU(H/HՇJlЏ_~~!vZ 2,DyQkJtlEGcP.)2TR='m;:SzASXaJd= a %Qg4_Egj$)BO^{\I)V֧syIQr5I9"^[-DosvyD3G'<$yMX_STCkW4;t`鯩+9yoC:!cK2ȻfT[kh^62+]zC zOfDR֥/N_BVЄ9"c0:G~"Af$HnE;_}G%z\D&{z|rXm~\FXw[{JjCR1asXf&%jf.֏oos(|- <'B!lmHy]F4}| /Uq"k5ͪNJjQ7ʎyO\%Le"d{sEqʗܖgÚ_kwcfPFe(̦XI$JH?(}jnܶpaWuAf~m#N'&m-$1T(7--l,L5=_R.hR{$4/AnqdhKϢ^7f\l9 6R G$k bΡcMnukCAyL|N0|Ql~sݧAyƶ$U [z)0oYMkq2Kɼ^HȲ!bd`g `32a|3fV .T.nɞw"rFw%lzvLM0}L 5|I)v}|1m1 5QxsH_|wJs-T:D:CK,,V Se9P@<],cWlmQ:ɀR h͸Ͷo7 H/9&}#4TnKغ5 i.׼fD˧9W5[&i9oִGt#'.e"χ幪Dq~j2k>覫_mH{\ʗ&Z*G .yZl2y)~ooUR+O0mLgCC"P϶i}o(^pkH %H tOL5bD6U&$ PqrmеBsHU>_tc*uuq#V.lnS놟\ c5 CF*4+GO=>] Ut-iiE{3vi.ta&+g`%}7Ϛmߎ'k[C3UUtWc1Bp)R R{N깈t1}\^BX ~ B~OǩOH[$63 ϵ#BVv+Ax aS(O=!M?-=㟁Ud''װ >{:~nҊ2ׅN庺g#i(4l:̓_-.^Ș@1yf0>|f 7SV?Sº=N^_=B!cHC7sDW+F#ᬊ0Kv]x'){HmqwBm+<!ߊ(||lAz%q:9v: ' Ee/}n-Oteghg8冷"li)@Gy{o5oN}⁨k}Mlr֕ -lYA<- jWAY[aIL?N'F.w4#QHHi(4"Jl%$2Os?f^Hk|#I _~ZLTw+Tհ0"?:k g ةPI3uCwQA_=J5p,.]/; JPL8=2k4 9S흑Vr/Vl99<ًu,̦[A!Pǡѭ-Ⱥ|0%b[kCʾmizAgRõoQcw.&"jחX(} ۅ숣cu?~pb-BbxrY^8~;)f41xt:C QW=۶*ҡ"&bo]mmang;;5/Me !ͼe {}|f<7zCW]SBw039oD)X75&hrQxq|^aMk`:׻-~k4hnEbvk`A2mg;q XIIYvĤj{hz;em^dv*PedHuD=\t}l= u-cbiJ"ZsdW15hqӨ395Ip6.&~!i|C!7D;_zi<[gZg7P6׻!g ^2>&Gˑmyj}`7s{ ʜQN]}n6/̩ď^[H Ymϋ#&ADOTM!ֈH|H6_I^O%bֵQe9l FpC鱡8.A%lNdHWImd[[iAFK'Yx `͚E"hFL$,ŧm恀Mc5hhF|׾:Q5~9iYп]Wm)jAG'ƽy;``f6(6/߉궫arB-px2IdxV/fբ4Ia#%I3r9,c֡ת臑60ݛ&# QhgXR-@7!2jz7Ky䦘WwT?m욇6˛[,5! qf٥zF0g[ lxGE}( d)!:t?"I.D1w $ WҰhmz@MVE_Ñ; sB9Tw߷&ʸ u{݋VYC0ןTUd}\GdN##[Ro7a)Oݕ. %ceRWѤU=9k(Ei=4&`|dwp3⽣,k?ȓ*U[,2hzGw^,kkl>"-a ˆ*O!]b uzgg}$s~es9yo<$m- 22&`0gEyzi%pfϥ w2S܊ހL"uD]U4V6tJ^ȧ/@ucGEzdţź͉,xx/0O{5i8o- V3g 4VEM'3016뭪0н>,EP̗HU/bwYA@9k磝XG7Mg5J"Au.\ ~ g p-xE$(0_H6'I7:tFs+4'u:: "\dDQ?H:'JPo=3Yݏ*%@r u^}mV'!urDxIH**pڵջϫb!zFc8?@|YRw^:k.V&ԩw,M,* w6'ƕ@֪;/X` x-*l/&Lɵ[0GPO+y!+Qu"0t$]IGO<8׍,Cs<^SItQl4煛T~~dXutn]SIBQ>\p`JШF!ep:P>]̀gzWj gXŬVϤ^I>=~Z 2yh|sSh3/m3\IgR$_jJ:ɀO"2ő"Oslgi)DVV:\Kj\'M u(U 7yfªl[$pR*nA-^s!k/T1|J+2Y;yAw~`ʸ$ɖO¿D>X1~w1p;f0Cadgg$E 9Di @#e5+ XY=<P4$/;F7k'9Ɣ+RKK)U>֖SK:飝Eb55HqO5*U|+CLBWݝU (wzZ<#j$`5R£;¾n7 Yב/`K 5!}h!bq>bn#~=^|;+fq?4 l-Hr\҃dcZhf9;i색S"e~kĮPo㭊Ɯ E҃{~PQnhDNYGNSd>9]kIw q6⭯\9vAKLf?Ey5]ib00X,7G:O'z&1Yrg~ &5M}a%Mt /q9rfծ36}TA22O̵Α™KcHe*zUFG̋8I2ϐDWEHIړKN\^tM|Gw2W2j7VW\l!I.A񓏣a"B^H>a/'EVg2щFcl>X蹇]rX>;hЙ!g"Y`pD7Sp <͗wRmSuc\ZYz 9mRtdo+)GzCj ҚTc΂iըb> uN{Àb;ӪSv_"B *:Cs!*DaF-r8aګW,B9A1:sB'_e߳+C;Fxu-`Yy˟m{#:\:lfpœ\:D /X!Lqpr86#yP7`3o N&i :Pd61&;<u!КҬ ᳆~H8CVp4pYmh}ėdus[4WCvJ8϶N{,͢^1CM0G 3j;N3sѠuKH( KLB-Z`~d=z$I.W"5`KxjR\kuvA[ϔ|/zpVw^Iirxfk =TOz,rl(=rkgA)T}36g\D-au_eu݀2voVh-/:BTцFEӧKK?G⹠)`OȪCOR]j?B %F ./c ]D/8Dxz.sArxv73eǗ$ F~Hʴ cTqO (h)]6O j,u#/7b+;Rg_MH.B{#OT/p^$+j<:'ITM+(0B>$&1\Mtގ>ʾ ƝQdlٶ=Suб'f:E$q{;=][5ʰ:Gd^ٚׄ73S*ZI`;NCA|@q`(:l5c%Oׅ&%}%b14J/@ Hi2ckwjO.(y(Ҟ8)s3BaMco]  ' TIҸm@ϖE'\ ԬLJCRٹ|FHhP=GS%nleo[:?2,〨TR'-v/arͤZ3K87刎wMt(71@=N|$HZrjY;ΌLk.-kgJv^Aʼ%Fo4_\{UvB--.𺡏~~}#ClAQv5Ŧj0Lݫ:V,{XX Z2L9 &15)SIXrZ[Y~ uK )ci "Ck8G!|⃐<5 Qd9}z"Sw;:Ŵz.`o 0blC$)Nm{qG X^ΒY% zj~ݖb}|]TX풻KM"n-d% & b21s0J.Τc%B{a^Q ZIf,'8vݜR9ZF(jIWe:qNE&}xjaӰ'+@Tq32~}tRW FYrt&M㢣d"4i7(i.Kͣؑu~sR*HjCh' ǂYuL-U5T-#1;#ܣ7tرon Y5 *WzY\ߚcIjFO>T$7 qNS}D٥۹ 5`ȳ <a Mf<)gU="v$p$9d6|~mqн$rdA٪mqǓpYH*XZa "OaݦQ‚G6uc'F*Vb +1{zeJ`jn: zl^pvj/Lm@iݲfN$n Miw*Ɨ!\( 5HvA{;@I8bslg\Rt_VɁ HvV뵂Yo|ÞI0VBv|FN^bשQk`n^'\6һx;dPDVi6(|DC]N759v`oEB-Dyl)Zm.aaRAviY4j; +%bB EGVAsmY3nv)(Mo1eUT@my c=x,9)x˫:aY=1#ԛާ ִy/&Ċpgz뼿u3")@hW($ʹ1bJKAP z<,pPB>*j=Lf{ZAiNkCsԧo߼x->J.N̑年jyF%th=Q^[& 3ƾ. *6on:8ȞThíS ?e+K)).A|4F+?`g8uva þy )d#'TbM;E *]=B|HhbݭCLDL]9 Y[Q' NgdEře^3 '7һJ!>ڃ[TX<6JjQ\.ǧE;rSVX>#8c8 e9H-B]h|̦O,gT'< aE8@Zqɑ,ڐފqڝZ4cq2ԋWIņf\ XnY[d/j c]D,,1ʇOj F8LD.AP}Ϩ ljx$(/}L>/L~FN$M9cq*n!E,CI0^tDapf숟^3Vɼ8\XXI7|77@[pn v0mC.AYAwX GFT=6c.,IC6Qеܡ= G#y+2LU O˨?E1e?tMw :7Eo>:ujU_+ z`j/Nn*DY7a1ojpPf<;+Ve3Jc\ ZUBuL hzWu7W &/i6E.Ŧ Rp )c^)U%I#D4`2[jZU7 /X@Yd޺Kdr&[t ȔQ-:g\z&:hr$W#fku[i﷬g _lfBR,g]҆^]L/髰 :Ù 2ҋ'rC!|;1^YL`O)vO-I*9%Nu{*H? $4ۣBvς4tVE0qC5jp,bݼsoj#CZ"MeԌǐmu@6gMZ0u\BZ"4G(8S[{*ٲ=jAj ^eO5flp< (J3;r'eH肚XMI:.%X<5?*MsI%xqBOgrX>NC.nBS )$eAOɛ)iǞ-ȍv1U[0ls/@aOPR\K]C{o^riὓiiS@|V D<+M$өɏvjM[6f; *fO 6~R&*JB=JM@xR2b\*k2jS#XY4?N¿mFqVSQ'4dEJλ0qp{GSM^}UOSa9p~T C>Z0V|` ]BSzǢHJ47UT6}Lp<l6(e3$xl |'ۄE+{pf9U-h€Fk}=?[;|6)sxUppUGU8!!a·ߍYWAl .Cp{cИ?d_"#~~ȩ]x\ @b~sx$Թ` G88Nmhb[)`̞Ёn&r6a)ьT)7-p:!ڪImLcDVGuDͻ8DhlߵwT0N=P.B=ǟ5}PY:'?Oe.`u ;#POE~#`y.YCvٴAo}M|B^~,yǴJG G] (JE=zCXtЯ%e`JFMVQtv)j!xBn}>7f:#|9٩| eRPXY.gle԰[ X:|h~5tcE,=o8+ѼΚhbA 9?v%G(Ŭ F=G*,WE8GK FqL͈-sv/=vb ty -tʄO\Xit*^SĿw.xM4[V%%=MT" 5=AXKl$0gtz]ʚ Myy;^;m?s:`+82uAGS "~Z~9"'rΚBǁ80~,ώn؇je0JU!m%cC 1I'a0pX$?tZ[@68>|Smf4h V6NaƪzI~m}w|NU?}AWMd*}rےqvh?cU\* Mx_Y@;F ae4(6= Tlӓq]J*fWd HLg\uda"r[򙻟" ٞ0n.@55h1mr1_^ mon.)~^y(Dی&& 1DHIο@!jԗdݣy)d2,>9&K dj^9>Oُ#†Js>$ KR p̐-z3n)Xfmu27N =^$hlyn%2YBA^/r<'%?,j?:$4{jU±7>uՓT-?Z P; kkae~ jQu*_p5 oڥT dw)-Plή^uW] $]=Ç?ʒ _8'˕VL.0(`1(mWtRn* LR==S$2uL RV`^{ܕx44zy‰nY8 )d`D!z"šj"nd:Dk |B-Y6^ӓL/렊 '^4۰6zR"dQP j}F˃x;A K:Y o:!mWaE-ޡ,Ap '|}S;,5R f02KVF~5~ xT99&nlUxyH}nn(Ѩ]!#cK^  r:@iͬ2zӕ7E.)Йo#k`@a̦4Q$l~tdcji_iK'սƻ =.15Bc_*yA+8{Mշ|~dkSz=4eoE{`4m KyiKWzMԶRTWzP 2&Z\VQYm!|iΥi+d /AhDFVxhW84MEeo2Ac clQh5[jİoE+ 7n}ݠ o*pr L%}E#ܜIq}/.)8`Y< ?@CUvnBo2%%d~~s=:Hj3jkMg\1W9xڇ ܠXV 1Y?}:!d &%?εX,I,0Y赻"W 0Ԁ}L)c1Ҷ%0T%t@ٚ/J[;wDWj ѫC3b 9**>'-8]bg.IWz`Ƥ: F*,4ƻepOiʏ)%^,+*Gɍ]SeZɐ47Eb^ZlSB[wj iYV{&~58 m  񡩛9n3;Fms_ ۋ4Y(U] [ZÖ' 1^.d6yx"9b:W$iB ob8}ۺsP>qx(`Z )Հ{\*Bh*mZzyc/lٓKm7\blyvbp--@d|sTPj%yHQd@װ6 '~:U Sݦмk ٞP\5 EVlْt # ~@p'(>X6QybX .79!e_3L HT߲ P$h5 p,vM:W?|7ex5h"y.*MQ}rB0 g\#𛺑a0g_XT;cD0AӿnH9Kt=vy>% +/E`L\^ɚ˽g$CcZ ݀3MX-3!D T(7Vw ioAnݍQ}06L@ kO.kCĐ,ζ `!M<+ g 8 Bq|^v)ؽь "?w^T[GA)LG_cA[LdlL vl1 lS=SF'Oz^BS.3$i~TA/!K: z&~.dT#pPr5v J"щ*%ja <(DfƯK\ 9nNd n?P=d3%,Ƈk2}" %1pNQK \]5U ,v a4Ӆ@ Z)p&$VI~}[W3'5(?Xyo>'dXiVgOET@[FD8([p3\&&\--:bə=4j m!QkPF "jF! Ou6o/:[ac%Gm[Yws9Eg>]qOxQho4%G'=yve RkO^~hE@v Y=RUhZTZՓeaG }='͉$]Uܻ<@eaCٌ/ZLcJ9jK&֙rllk֑[ou8Bm+g ہjUCb+0~6suHŊV'(?e@*mc {UrTea:J900li P; 3PR7g6z.1'ʒ&0\]@XK'5ߙv7Ai 1|CE.Q+&0gvP>9&+C, =Fz Y`Oa0~t'B~AD,עտK5} (lW4Ć{¸r<1r{)7d(|4Ya1]kpg U!}O>ȧfMQVt78k;-#=íi1Te(=M ~U}ApĎh 1KK# YT/-7y'Um"yRdJ^t $u@iFÏjfD:Oɗ:P"AFR(`.e*>C@42TC>ԿӉmr{VI|]W!E gA%)?aEyc:PGP{q=VȈ .&|Bql>R%fդl6bOe l 9d02":7R>֤ې LE4Bzh]tTZ<{zOy"}g@f[f +*{(! |*CL8iA]{P w֎ĭ曌[p&"1"*Ɂ؄պUC_S҆U342 o'"L9X;0Wg!iDӦS̓b:LpS&88gO0ޒ^x *$Y"E67͘%M  1:DM\ٔr{2}dMSl n.DA?sLT``~LvqCIy:>̡76S` UfO<ƒe/]}'6]0 [SuOϽ*2E1Uʥ?j(vRECMO\-dy^[)g^D5 !p'u9>ā}pʺxV ₸:D_-d==R?f)JZ5q KPs` 1)0#wB!{\wbgI5>;OJ8g?d# eGvyx=I#BDN@&=|6YW[b|B$@2?JNrƖu!Ml$f hxd0c}{W̊$CZD>ϒ/=O}[X{eN#Rh5[iO6m泄3uT_~ qg@)im3}y?@`'{}ReSf=@sw L'LwJ?}w~ӡY^qvbݘo8\a9]sotdXѻEZ^G&?nD\GQ\wdh d[PmDP> stream xڍVT'CJRp4H  F 6` tH4ҍt !%J+]ws9{3"8O( x'@!Bvv( 슄" Bu M 9b@ @* PCmZu$dprCP*\6A 1yj@(hr#l`׿RpICP(gI~ ɏp =0 x 'd@?; @+6`8еjmg0g?x^ @_tFJ ` n:ʚ(O/rB" w dv8, i uF!P_~A_QH_)B]6[=VG8 Yuq)V"@ PL\v=m x98#vh`?C(W77["BmPk=NOvl+` DOd- jIA Dhg_ku@?{Q nH}wp\ 7#<Phw_Yg?nNN\ AYBot}cP7ZP fD(R Ձl ;A`zlO =&0z]R nsB"+ȋ=x$D/-7p @!\ @XRuP ٸ7]%t0lC8; q i>g[ľ$gֵ/<#hD>laMXnޕv{ݦKߟqzcM3{Fs嫻 }r5 tnlSgrq'ɦF?Srmvp/b40}*%GtQ7z1qVĶ:۶i~by% OREN1w7x31҇ ?nn缒KH;.%v'b) ڛxz忽l^NC:bsTX >X^plm.- msp 4曅O?dgq[(ǰ)rLoHʔH}AS|)'t18Ϭ *QP(gy=?snwy Kr4vP8EZ>l@90׳"f16ݝ#,ivHZ.ඣg-Jo{ 7l7;?ԦkiƎFc2撃-&敏,u2dȱv+W;yxUS#sIWL@`xR:Uq૲pY{)J:(12AH[J٤e0ߧB~iƘc C#cD}m7)xbV"nk,pb<ȿ/:S<3~.f﫟Tgj˗6;^XՙK|3ۃt պإtkįwYO/4h4A:fM?%/xHVu?9n"\þ|&@h >(`aWᖽV]zF3l#yd)Leua0|v7ɠ]z%OQx}k3I[(sI65ý‚a\jLwls?p,~*Vo_%&I޺<7dpIZkr3+3;sq X?M_ݽ&u%scfxٖ;T΋l9E^V@rUN8oD=rkP$+;oB{fgwn,Kl %vX⿎j$fZ(u߈9s'^ 47dߡe|m2gmQ 2w A>H|ٜ#Ł.t/LnjNd:gy 3FDhgC\4rWN, dX>vIw;GcaoMhsC]h?  wyvO^0gQq#WOq^ت4Ƶ-ԜsXx9^ x?X.!RPAMbT7꜓rI_ȾAO$V\DźҝU2"뽵^ܩ~~L#qT"y([NQ IMpi ݽjZ5e*m8}CV 럷U>]<;/yF -9QA$ߔ;'Vg;{ò1:7&Ð9;g9:d!\Эz8i'-r4*bn^({ɧ;/HM-0 ``DZuJ |۔EdH`h\v%Cْ+^R)GY=sIΩ̊Iz$Pq z8{dp'3[[侫-'YN#жX*%۔#ךҏ=1+c<ˇ@k\4N0 ;]ܚ3)LeRVa]w&'oݕ y;؆ϕEŸ9{97hYL?013CN{Sߒ7{wWy n6&L?lG~c!o+!N/ɨ) !4Zq.ِ,mN.[qusC.).*ǟIDwQt"w/g!=&oJf/δ03gܕþ_[֋d{ )?tٻuӊz}di#0+iO:eGcE:KTӍ cK UɠwDT`|Vֳ*pC,!\c6Nojir暦Q X;&SeW\ҽ;OƷsSKԞPz~QFP=]2 9gGm3(Yv/Ncxْ(GFg1R/$PY=XA;̋a[[_:0|YKUQݩ eUzd,߀]n܍`_,4!|b6\|AN"ϲ%`oΉcPHw.1>E}ٞ~ װu7V8tVsO9pBJ8ͤicJFva7gi֋_ߋL>v9hҙcJug9nû;jg5;6p5nyȞ:,(%4 /= zT1&0!njYBj_wu@[HTKz^5yv ѝ8NȊ)S 4h2nm̢)HmY)ZX{8a/( ]er7B3)2BY`?TA>xTh`~KdTG~ĴݣFɉ8<235#ߩpq9kɽ7")֩9?Pt9p3 >zAH''e&K1GpAn9]UgT|cepJ eq+1aJ6- j{\ S!wCulb|{۪oNjR:?rHƄԶ c@3=?(KAۅ.a}[I,IYR5 ^ \5pGGZsCtdȗc,dυK9RH,8 f(\q?̎|)OYVQg;RO}ԉǢ.=Dj+W*jje0@Kmyۢi^>h*-ionL'|;~J,_اSbgC \.IPQ*cd! ݤo>O/oX\{ӄ1pm0޿((,f9-:m'W{Tm{NZ| onKfW0W󖨇C˩)'%[(.7Y=Mlq{6*l$z4*-D~I"M߲nwkߴCD*Ϟ_?+ 3^?J\X/S[ؤ@4e3*7t)3ag/ꛊUu!v%/v.RW1bm3= ~8RߖO}4^Zz-{@S0<\Wj~z>ZR2q4\_4ʙF=[GZoWql^:eYs"sf,JIGBʼĎcgWQy.9SV =̑. ~NGgZ{ekAnyX CAD@Pˊ3oqldɟT*`/A1Qzޞ?&En,6^Z4;-BO5\\~7yٻ 0?hɬ4'}-Ǖt,0j.Q#I.o4q8^n0-$n:ڤ=⃭`օtODA v›&G]S?eRi]} 6I|oa;v{XӾCorncU?hs 7ΟL?\-oSI/y% X}a~T._1A;n$!Bsz%@:UsC[p>| gGOf*X 5X*gn0xggR@ͮ/%ײc՚Aj[X]~jzt#1Q"U,,VD:kЮ6$G7%* ;MiRʂb:kK ر"|JŸ up-af2 EBfӴ:`N MPr\D Cm#Gs!ä7'|m{Y>iܝQg̔{;7yVNS( `qAGf5?>\2J+:J?`hfjnu5EA1-&y(ͣ hM%P &V)/R;UF,:*|jJ)O~{X^Zy=0M"ecasbtL5hQI-׻7sS%5w3^wT*?V n8+ml%1pgZk"%y:st[Y ϸ?"n /&ZEZ+ZQ q7/-ŗ endstream endobj 1445 0 obj << /Length1 1482 /Length2 6785 /Length3 0 /Length 7780 /Filter /FlateDecode >> stream xڍVT$Fwˤ{HJwFltJ )H(t# -!tJt9}>=Cy;-\%b@0XX pp!\c'ovE8 )An($PBD%!b`0P ! T ڂ@  PD{ Чrx 1@yWE^pW0 C[Mz <dx/G ԁp({/_\08{g յnpZ8 Dw?%B Ca0@:.p?uD>P p(PE^E')p+ v(WW8>%u:#Q?/ vnH7\]O4s{E`w`_ɍ࿍_0@7MP8  ; a{t=~` @+KPH7djm`&0P@H ( $B BB@1"Yߨgm2#Q@?(/>jqZp ?a/[C7?QvqmeV+O;Z^F&?XnvO=H/ᩂ!`ӻ p='3aCx;GҿTFPvfNHDЍGDp~D!@4`=𫟢 u4Qw% {^rs' Z/q (a/48L`;{|Z%+6,=αf#8}N&'lX>ˊ2,UvC ^dc~EХuZ`zȋmf&#+ G m$zݪ~=sSkoD5 /? ߏxr$+3>/Ł8E F2 x'^8|Q(l2+#!vzvzs:f#1@t ρE%_1,UC Ĥoe;, U*g__W vMH=6#o";#*B)CStI`¯aUQ`2̪AKG-_c8f,gNukЬ(mqIT OnJd, e;03v AsWzLn]DC bt!ٴZ܇ 5Tk^$wqGik>)q]3JBJi6N6ٵyP{jMtc;qK>A^{+QEL 'g(Л{%-\,i\Z9΋L3~Z.0]rNWn` [3ʺ) fWq_|V-M2i)7Y޶-2zǷ`j+jx'p.@Q{xS, ze'C6AޑI< Z Oyw~%3&WռTf6< W]ォ `o9   K+_:Unc=0(xsQ[zM~D9ýC@ -gz$bQ_j]Ur{c R_UvJ[i` 'T`U.'U%;-XY~ݪBeidaEp삯2cʥ:'H^}M'!ͤO`e5aQE\$_-D$= F]䟆~lR[[ Ҭ쇙KD9M=VʬVW(.%v%TPHm ?dg,ީy% *7.lbQ+%Y1F#iGYK-`8l.HN+r6,D$%Lb ,LksKWBu oFosb]Ț LJ}蟶Qf9B{Z0 o|"&RFպng.W{%6[)Ck9fȝ$mSlw AJkfSX+,8q4u/W1\{aa)㹎7{T{ \e&WzW*r^I>P%aKrF;Ԩbםpy!v3ٽV(*@u?Hʼnr050~M51{^k͙eg>|(a3\p˄p&+!Qj}sbL xV Ngыi_q=aNĐ'g}5*+9zόq4Oi!2?֕WCy4[Prѽ ki6Z99T0ԑYpx ߀0׼USR6BbπMY߱.bk0"TBu^c`,9se׏Hj8f:bl4 ܭ>n`L *My@Tct6T~ug(ǐx34Df̖XC?eYO7Gs( m=8ح Y>l{oY,5a ~@Aw4B 4G:(?Ɏ-dKmܕjr_Kep}jFL-u[+{Ce&4%eQ݉L,H?R_cs*[%uD툹R;dF,T#g\JH+,/g*괈ѐ@zGF{7_wRօ}tLnD䑷]`\2"bsN^Yګe mM]rgND E<'. s0S!CM1o|F }V&bZ7ܵڜ6=z(hzqTlܡ$jyqrdVw:AŲʨB=epB\q7E$:lͯxRd=7c׼:J[o#&>ކfyҶW_\}CYT7'Ǭ!.mi1*S=(Oq4r2wp|KdVt\rY,@۱g].~$&ڍ2ӣĠC"1h[eXM}),>'z X3s{LiH7-|^/ϛl/N-qr53-~6o>SWⲡrR[7e]-w_eжMZG~׶i1?Fa<# ӱ(rKhxPf;50wc7uC'Y(20W$)ųU[S.ok\_v o>̒n͛"J1^L$P$m־~ ?Nߍ2z[uwVfw=eEv;4# #ˡ"?w?Qn}#0[rY5WL37}/ i>up7za<ƕ‘R5I\G#9ٝ{* c)K~<ӷݨꠓw,vYF[12 =R [q|Y^"P4&oҗ{:|G<{: ҙ!U_x+eIoP9x{j3Xi?Hš8oѩ9;,e~ ,)l19=x6As_ii]9uëcWUcQPq`_E[dȷ`vt=$$V֘Vu$/ދZ{74}Uᬓ ̐:RRULg@AēI?}*lz}ECq%"?@WŷU&Ka/*RrAšZ\z*6J Qx'x^%<$ݪ`mzY](ϋAtfi-aAΐ]Yr (OeF>w87#'@*wS6"D_ޖqb~b:%llVqO{N w8;|{PteKFfڎLw>F$SBVJV,h(9at%kO]8l>.Y)ה!zXėi&}tft$aRŪ\6@C:̮ DI4FNJXKEI 'wå'^K' sF)jWI Aq@jn4e|Zh`7դ֩N[e#fp^ղ@8"]Y.io$Rvh-`Ƭ+e}TC'X lcg- c=R3gA^Qe\%/UM@<(-vǏ}J9?M,N>PmwYkݖah/QR$c/mXvqHjJ㽻*dZa^d(v]cǫN)eק\Ġ/Q܌{Q[Y+}mf ZMJX $^=ɳkSitV\-b@5D9]o*BY0|ŒruzG6,Z8?Ewd(Ma ?yߙ| 0ND$A׷hGs>? W.:rvZtf}Y1H(.ՊmlrQl*fse!A:Jn3D9_.{ZPySɪAFb  &A3So. s(0ȱkso{}4H pp'r7(PjlSAFA'XQ&ڿ*xL4h۪Gyn1p0ʓG9xDM9QۙZ, b9{3 pl5߲XͦڃC*oĩ OHD X4-(E4XhC[JއB`fxc6XѸSZ93Zv7`CB;WV z~'WBOy8fZ zLp(ׁ6L! ;A8Xn+d|aLvG57V,6oQ+d\y^w>Il?W_t )dc +}AF>xW>P>U?3A6aD=yYFQo5JmB߾w <] rYLH]t}t0nE4S3& aH]P;B7v֕ZͰӜA~27{߲9ʂ̸%-&DϿD u@EOatEc;cRZ}٨0Ng"&nd۩B܎::|d63yB@l)'B^Mh6!Z6/G*$qq n8Mp3J"f Q, j"s8fSQ$k`5ȭF7O䍹Jk87OIEh8XIGon]4Xf.QQ$9 Tf ߍ/0X~~1 n_(CV0yKLf#ch͞r_gN>M>~aJI[kmG\ 2msεXK DA8- "z(VSJnExU|*3Qsb̧k~;8qiWr4O~~=}NV7_W*̾6tNyǥ~A ma ̬7 XA7. uzC|c萹L0(TOX{CtLzpڊUXl./ GdVLaߥ̗o9r#FNm Nפ>I6<`ܠ3f4YZFV_<ŁY1}T7nWFQVuvOWNժ[ k??2:7svqIpy+(ݾ0!do*+9b.ecBA3˞~Tƅ]%6qa*Rb\LMjل$'SA4B"8-F9Ðf-yEi>[v!NOEt endstream endobj 1447 0 obj << /Length1 1551 /Length2 7954 /Length3 0 /Length 8992 /Filter /FlateDecode >> stream xڍT]6,H 0twwwC0tIJt4HH HI -H}Ysg_\0hrHAm@ P(U@ & d0hkЅڂApJ,pqy{{sZzpBa,o0@vt֮?81z``]=<.`[1b*4@r`7'? lmk uu!{  !v]<^`kG?[֏fa =8=.rNdy,{`O >vݗϵ:C`o vn\'HYoGߘ<;c;菑7X `H=a{X{p'(? ؁m0>S߿VڲB\|r $#s 8xn @qY/P-kߵQbEw&}1oٛg ,o= ..̿+o=} bupɐ8Dd:%cz0~f@g)x?&([X`־s?珮\(1H/`aO>>Z i" ?z   <.# 1GB.?/࿚` => DءB s3V4ܩ1^ܛc{B|a5 "ZK]N:thWy %;fR;nn-u;0>MH7 RbPpIܹ8##t0{ h\y(4 V-G~ީPź׏3 )e(ɝ#EsP^ϟ|VIf <-7“p=ZCFOfBJt?>/B2_Q2.VJ=cs' io_|ϽUg""Jml%juXxAeV;;eP, O7=iRE{\5-/Q(*ƍ=-ɝCNg/ٱqCUreC ßA+4># S0C8IK*$O$JNe,qx'$oP֠"Kp;Xwmתu: IY! 4_#0uI޶ĵB;:-"3F;Z$I3~g<2W:Z?).=ka@J3KnkܯQl^W1]rc'{\IiS1)łHtyν:V'Bv|?Th?lӘNFHr _蹾-sQ:)7 7Qm>eZ"Yr)(g9Tc}."Uk&.W7]f= ܣo>})~SU,i=LFYǐ<\UC6jMtgCRix-r<lAΕT9 bc#{VM.VL8(KA@B7B7WDLC e:3Zco3_*\գ1m$mCSJX^ ͔8Y? q >0BþvI+pg`J)(/ʤL=e7ʑy mO3b8V{ZZg.y&Yے"jhWde{:#UOƒOu^9tKlܬf/K}_h wU<$.AJUՍ c~3"]1(H#|.6PLpא-)ryS Ӱ*4O'O{S%~\"2nfظ}_d;">A3G}F`ozrtp‰xKZCcITc3}ƯazϪ@ĆI `)A2}zkKk JqlRBA vEYR!6O{OKaD$KL2i]zB}^  ʴZ.ey{_=wP W|p,,B$_ I7G"$Ľ_Swl7]qطlXBh{Ηh> m5 ש*ԯ~Yy; B]^- Y(V89M*Uvr{Q2fH2,//z7 /@GwpE\1JJcz1Li"*\M=~t.&5I%W[a+=cC~&0ǘX*|i!ԉEPדÜʟm0A˧oeK^4lMΙh /} uaʍ4|yH܉S"rUQeWwf$ެպzO+zusъ$TuʒCM#e<}i'Ƣ3Pw 7Nфom57ڵ}dCRDJV>!}1-[ Q Q2W09l=Czu{< eiSq#YD) hmpUh;#ٕUtJQxזFPe11} f*Aqtl"|0l oYOӚ0ZPf@eX phRtg&׭ؒh׵❅eaq^BI遙5t*eBAǴq'5>G:P@XPNR`ʇK & :4! .C8Ny>jγ?n.(;U"/>aB\v9ƃ#bϿZ,8ԝb&V|mr rYNnBOR =0\ S`:qB/ij$ە<=j烙xEStv4̐$ L\*5qYKgB،~z>ɬvESL v x7 Og1Kҵv}>z"q9@nΑ.9BzFR88ڈ T>IwXml&YIFH7*33A2򇷎p,I 0_uτhG{xu`ɣ;%|86TuS(ɼ7N:շ0YRwDZO"83voZ4)Ƶ}Ҭef$J\:wuN qk=m.pxE<|7N,zQ@SH5kj)ܧu׆s b*R͠v^ܩ_ KiN*?מ{J3:)r$[z| zGIԮ/}*Y2u1XҔz 8DRt&۸$*#KRPXE)0iIO0cH&#B6K!1C_dխpD]bƓJȰq(bNPm\L :r$T=OuV*||ٯ~s#PhmB-|g Uu/y]eH͒=8BswOoWg%ɷ_yE'6=>lGf.i{`t:GQFX겅"ԗEJ/P˕" rP0F$E'PT(IOݹ}LYZu?xB Zj*,8U^/kMF X %$3f;Τ6gi.I/dNt]&.GTa.-Y<b6C2YZ `wK7{"r/G$8weO٧DEZo*U( j[2̝,b/~ߓ7ơmj,p E٢6 |'N3=:[P֊ZMy,nNEk/md꾖ZL'zm.`$76p6"! Q.na;z !bpbDC#Tk7jGRjoӱ̪f$":|*Pr>Su䰺}*c2Mi9G@兎:LÎSZw5G V?48MIqfE-?LZ(E_}wB`jqN`Y VҰO%8yP}+ҜݵxǪ?HZj5]No%U8?wu;VF1/rYV ~Q*/coVaݬGWG e!9M,Cvjz]g3W+",a)1S]s'Evdem;/Tڕ2"(" Wk97%O4DӽW$ ;c{}'*[33Ϝ~6̠XWP6^TgՁ1mЌؐm,[g"eL ѹ AZNLWqIAۻtl /߈B[#mg*?PXgsAw*oVrOsQ ->V )~[4 Vz>~W#;DRH4PwCh9U'A%Ы,11&doClw]9$5U&($Im x`l." ˒5m<2aˊOVVd'ǃ viY/( YipgpjѠ+r rTVrADey; n+uSG)|b$#VG(XzOȳIZ"8ij$9jգVAci4d3G>&h PmfI]7/e<سt5&3y"0BHŊGHx^K +vPJnqL[ePW&xrRc]a'W{(U7U,A$ {9@yd30BGDD[.39n4ۣ-+Y͖% xXך\w;1<}?r)^lL=*9B{ʘQ3ӛ2Xӈ'sKEpb?/ȐZyqrN"֑~@DYiP ˁʫm% 'g|H{US@L\ ܖa MkqVtƙOkɞ1m策ݽkەPr"Q]r*`]KZlltF9 Q.+Q'OFjm)lcI7kQtzUI9˿xEV/IJ ͆MLCx)&y&zdrQ}Ic-J JLi!.de|]bfs7‘+ʪհ02GO(O@DT ܑ\iNQn1ń }DwdOTPCl<3 +9JV (Po&׹//c~LsJQ)`ނ!Z*-3QlPviJ"4'5XqR3SlۍPaȧ gK+gz/)FA_x#y_)= ^aV I|\s$uG ~ HnmOI5=ɗٺasAep\ɹyz۬sgy%>PBw"W/Ua$D=RڏṂBuW-gyK| <ϩur Zbc˯3Wy\%%[1U endstream endobj 1449 0 obj << /Length1 2388 /Length2 19001 /Length3 0 /Length 20392 /Filter /FlateDecode >> stream xڌP[  3@pwwww];-Bp9畜{kfݻ{SCJL+hbguec*02`HIU,Ð,l!4t:\F6.Fv."&Y:- TƔFNNvmƆYCgsGEcCkRP;;sӻ89Q,J@'+d `H*Nr(ۙ::k c[#:@YR oW̿h#{_,l^lhllgcohaak0dݝi&Z;}7t564!@LP`-읝,HWm5:;Oh>\+[;7[ S [ӿdӫZ8%Eac3:X99@؜*?4xL?d},L?0^N@ 럎E0 cgO3_- `'ݏ3H J* R[BBv/Z6&-+yQUQ/!  %+}3@uX??K_Y_2sOǿ#>c6d>&5в@ t6A[>caIh`llVY|*9Yuhc>-+jklg2  =`>?Fwl?>$La:W6V_!68"'^@/1 & XR?胋E"}p/}pQ>(A\.*?胋E3/bgQNVB>A 'S?v5Hu|5/bHflg>$I\>Om?/d~3g6(o6{؛maG:@},!֥S#?'cK!G!C?G?#Iwvǂ.]?H,>V~PGG&OJϭa^vR~@c%;c`டnL,wPخNJxϠ:wqa:2`51ønSu{Ĥq=\>!k}1$o` j_t'0}/v14ĺ7VIb7 ^!/d G`0Oz0 O@a4O#y0s'qw}6.Y +'R4ZPUK"8fG&in+7u ?jP#z`zܴlMEZ$=|HJ&OXy]| .{u<2E N1>|F\KJ(<23hSJ GmGKn/vpVk!q;G~@ FJT L}4z%mL<}nҵF2fnܛS+p;{3AmIiSHiiżxx GDr3V<uJΊbHXΕXyxmK.HBLi$o Q fZpi*]dUDQl~Q%(A<1V;t\;Y=Ͽ3+`+g7oc؏lV.~ZA{7S|B e 3\_[bÒHʏ| vP]aM--dI> &@I L0bo&f)K){Y/3g@|KCײ߶#U*A_R,AO}a ੶҅v}/! ڇNN)˶ XN_4"oD#c ^ӒD:,e:x;b._jl1EL1:o ָĎC^*LU2!gI'6uC[JkW<+JR${־{RNvR!d'6i'hYhAw ;kHtnTA$,p'LEt#7XpX-{J6U[j=o~I3V,/:/̚UD3R`oNvЎؑ[T]z|7d7`ZJs\)W,n淵˴Wںh V3<` U1 ɖ%1n8v׌kF OWn74C^<˕s@>{^8j" s9d>0D ?0r,b6.v=:O >6AjIER+Es,sZ#wJEOކdq~F ӎh)%5* :h'4Uc3#˞O)g2Br{HX! $Ao&Oy TaPDŽ3;(fDgYCuRƦE{0LmRMoS aQe9rGWKw]`uq:TbB$RmV~Id^V5(Qm?(4 ѢqaӎmqRva4=;jUºx r;Z$@UٴW=A2R I"*&)[82K-wqw;c3n3[[[ L3HjY<ޜE[0}@SYqN%C.hA*mi_~pխ/㑸6`\^<^Q[v5-TNmŋ; P,%$kʽS+۸d~s4dITp`^@i.Z@yz ?gXǟui=Ӳ ˺>mq`얲`L&ܢ^J&Uq*^A.~@ibՄ{bqspAKb21]945K~cŭayOUר xtru-'uե yaiq2s2;mɁ?"7{a}Hs{/IN##Sthm/wQu(S򠝿 !D/%N6O/sqh BTh34a0jbIcc}uu2َJayU;\96alz1=$29iO΄rk/,wJk#Td@"?4*t6-O#ٛe}߲lYr$>!c QΙ$SѬۣR[vOô@Y~c 9Im8U|~|?[se4[ >qwsTE)j&\߃z:P+&G$ ICvb9j7vpg`DT;*ge;>I!ֹ{ӥt'fKY=쫨sI3)(J,=[W ,>jя9]"ᠹfOe&bFE&I3MI~Yc(Zu$Q}}XB(2i5 c)O А?Pvm= Vz08) 1 6B씄)$7UC֎4=70E\P2TYh٘,'<׊w{!MlU q+%ۀ.{IPS*{M(|hK}{ )[J:3>_^NCT):,Z*jÊas MF=W/ʽfh$Yށ3@H2rbᲩ}0~)Hg$G'Y ꐗiY( ${e<'gwp5ELk }!BݑlZNt>%Ci''ࢬFL9X.ө[?moi-MMm-(p0Og+%y|Ko64+[PM5g5sn+U{oD%8ИarRŊdjZ*#y#?vaf';e\ oz[S=pS0~U@јYp@[Ƅ"Ћ"R+wmLCCNܨA~qz?5$xbôqj @⧹tuzW -3 })B찢ڍ7+ G=!y5P8J- B]"9nMU`erڔ&+-zI4eJ^ .LkBmY Q,MR;!j$*sjJƂ=fUq8v[+d c,;<Rr^jRe_O#OoCˏ7T'>5k/hr{AjbyqBǺ9 I _q.9 IВ|K Re21ruva[B4e1P7 =.;^DA;J7{l-I&% N~p# "%LE5rST[wf.h.Ċ 'Z2|xs#3ϛz/AD|5`x\V2Yͮgmڸ x ͢l?wpQ!~ٽ/ɿeDžn7;8eJ.%Pв&[^(qf(>L`D.8<9k/-*a_;XSN\TkQXWFٴc ދ48hD'f'רxk+\0.C2'XO&lp#aa_[%v*jo(-Z!P {u5L}c|aN`{}?:oSD92lS݃ʣ<.ͨna%y-GLh+<1ٷD9zD*!̩WI, SiDlbGyec# ipܐXs &zf"[8T $Ze)'"{sL? %T7I?_-b;^_ۊY&2YE-S5!Sod{E8,<<"&BK_j"iR\uygR\9:εm} XIE0rMԓqÁ~e39W}S1t/q=U2~ОR*۱*ÎǀmkL,v:j$`uī1m'![iB2ha}(+r<\*Wcf_n;USx@b`o)2}'D $ے%u7[ ;^9?bCPfpCEr Q]~aG`!|I3󀏏ƵC+yjnc6cڭoI//yN,sQ'+ u'~Bm%ֺT7s uduH)kẂ'V/ `ByL@"]Gޣ|rƽ,ߺ%}gGHsm(XɖXmUyι%YX J~W9jD Z6և$+ jC^Og ݄=QM]p\X.N@ K;4D{Dmob]2l/f˸OK8+ӵ3^bCdyʘ3''2*%rRU'uƾC[Yu*E/c 7e3A)屢++@+Nj*Kչ}Fdv$j>%ܴOS |> xr~Hq\' >M2bUet!goAE}29f*s݊\|v6`9F|06*q(s>P35P+֩ =>QHԩ+;K7m1Y6)yN:6Q]?wߦy!Ho}Fh)>w4{,Ca E QnLwVˡ'2-} H]gLUAq2ׇB[Rõ *N헯F|+Η*Z;v`;045hd¿}d}ؓH=Y@Np$v۷KKT _` bI~Kx46afÃxk3= !5':'~ ;#մzR:2笌zF$ċӀG/+cwY$‹[T6`yQ2X| xZ76dE%<{a׻DHp&ՠJPM'm^isR❝GҡҤX8:ODO8BZGCx;/}z,clYy%wsv%OE{@*Uu1Pk21NRXA}Hhwn~\Sԭ_]c. ks[$N5\}ۡ'mt6ǙpN(> Z<Σ XtE ĚKۺ8ЛD#r{œ;^yZ^>^)J/D3m!4fҠ<ʪ0$QfaC߉d(nہW+~x蔶lYdr(AY1QG SX2 :@%39U6gm5q|@>1-ԝapbo'r-PI3A/F <8Mȶ"7WqY/h YEp,,_Ocp&@֋+&lK1f /[p<О+K1/vf5)at}W3r|eS6`kĆC\B;Ȩ*twm !T$\YGkx8obY;~`ѧ{ob ɻ&֮c߯kzNCc4¨!.3P:&-Rx[&I"`"yZKhuFq](ݑ3?c~&1HyЁ.Sk(WNr T;@^ȥ l<;~{TuV,gMd3{3Bo$xغt73O NkL󑶃*;a0agVʵ& ~?5LӷG$@嗼pdvWs+?&`y9y*,ĪC䵘ƿ0@ȘQb$$֕|M3JOF>h`w&s3!FyGRĀWњbdwCC&$U-+}-Ʉ9# '8YIv,ABQ` ~I'nXXulUw)sY}ؖt3Z4|$Az֒/OqF\,]]ս^P]5M31PÖX_@V6oQ>v>g7- Ki2wWAK  p{T&2 QuPbt#.-N0 =o+Ha y* OntzI~(Sԑ7$!+2^T| (L,4tȫTu4&v}oQ5z q Y.UkR$03-Cx#:m+qMeŤ~KL|yDFq-7Z 88)(xKOmku8#{:[7my<| tEO x }g#6@L-A HM[ 9Gz =iܷv)l"`y:ѧ#+rKӬܛ"jbm^Ρt l%]:K4Be:ɴ:Y(k@|R\w#pKfi Vo!e^Y6 %nIlOރ*7 n0vR Ԩ GQr&ƲG *PJAԽ!"9w|~|3w9X~:!!(@ߔVYy^w)0f2[wu{p,dynPtҸx'k9I ^")KE60=Inu xXD;xX֔ QvAv],qW.~pN<@ O8E638zp!iw mEݴ)p = }\UZ:LCwQzbťF>7HPH3ri@7@Tkcuer\A R^wqLǢxIa@pK[bԾF$R hN`Wù4b+1:b9Mnaq)j#Y :1Mo+x\g0lOnlhb6h8nEEC|g(pFԃLH .ԏOxx|vܑutZ hTE>ԎAӻ ' P.#"VʈB*J4)#&Ǽ ¯1M_e7kkc4g+}n%?{'dE*촜m}}@ %LB'Rp"ᰀ;YgjG*ʼJu(*WþZݓTgt(-xlhkhJrꍸ;ᖢy ƕf5S;`U ʜ)e1l;-1lL hJ%`wc3l=a >_"cS 7"4WcneLAB)܄b.HYQܛ<˚AQ4:ll3{KbyuġKj6'LYׇU9׹FO˙%'RFC[!zY_xN ^Ya0 օ9ˈeT-]D,YrV3 RT*I|ȷnW"EH5*4,Q S]۵nB9R#1S;0&:ءyF#Zn͛?Su/?lA:Eŭu;<]sٌώi>WE `ր4axg[[YB^I=jRA}Ws_D+FJZE&|[l˅@*8Đ!M(FǪ ~ް_kp[vzIOYwZ`däsPG[cM@R "W5c $U=+"<'r2q-w#ַj eOPFHe**D@-hkJKYܧm=]wҶ25[P5۹gw[k haDk8 Q>?64,xKV wP[Q{Ɯ{ ~1  wEtRi{C`8+52H;:e:JtQ)>$J Sd5Z uzdjD=8E>0/[<{)(h} ?s|$8!e {I8Ht<++|ߖ@NJٗ; 1r {h DR1S yfztn%T>-'m'L}!Aq>|J&$q5킯$QW946e4SdLf3f3 UdEWʹRJrbk>/*kBxV Ra3$0i AD ̢=h<A>b睮*2bL@` )STZQmvJlj$?hbdvXgq rVfwpC?N>UhoaަKhk/;(i$v\h{7KZDLX0w ܿAnb Qj2B>OÄ锃N5V|!9qPUC&=oOeR}xM:#\۳$ٺiwԉFR扽wL07e$Ҋ{e> />7#wHC'8,Fv궱BG1v.t[E;`8ܞFp4Z e-RTPܦXCVOO-)9ҊS/a Mgկc"`}ݿ{qѬO5QC7WS{n <VS'PO?rmM\ 8w صTf+Lf۳>]"~-1Qq膪 ]B};?+?˙tp.>'uy$vMW *y~5PԌmXINژGO ʆN`aĐYYыa(+`XmS Q4i=B\8)!wN-U)_l٥AųD~2Y3/&ɩV7IO#vکFDxYsKc?gZ"FyxuKMя(Pi3HpSl)d^٦QtC%,;Gyl03h$VcslyM*9 ܸ-USY2s!'o6t^E uP 1+LHSJݑtAi{ꥒS29bL"JP5P[QQ^~8u [q/lfl᭸[/@8ّDQm] Qʇ#g-k7 Kmm\H6vqرC߯T֫RRMW=4Pd|F$flةYPk Ҥwt;tAF͖& T _oDO*< |t_uuNkw4)qФI`ChVF߬WlGI ~e5Jd\` /h34̴UPmFcJח"]ӹH uS_a߳ʨ d2(tf Q 1D|d|LnX?p vi=i|I̊jg9nXvٔVVuV|/Ӷ XX%llK`1ͺYDugBR.%7GFCJIP <SҡTvh W\`G!4^"G,^Du4Fb֑f/L`:;JdEeD8 W~a JBdM-XdH깣'ō^3cXP`TԘ =xs304Eh$ *2T)!2f#NNb 3n qWtLsǼf)[ό۲ZU5/3+WpoaJ;PJwry 1_ݲp{?T挭+W`' 9?xJ; ::^:9oT\ԩҸoMN \Ev1jˌZgର=놄!ǁ{2])tUF`g9c G7 u J`f뀼)S̫ۢ-sϤrE|@-;铒56U`®Lbrv6XOʝDsԓ?At0zmIM'{] jHbUy]F:-Ofjz`cQq&ַq$gwN1/s9wV űuJu]0l}uSb:N$1f4!K172)#^y:mg\!RR:k-/:)d|A$*}LRpݜ*$@YYj؁+…zEG,ð :6˱*2w`-g'^w1v 0"n(\mך1m8Kf.kC$09ϳ΅x'/0J{?<|q̨j5vKY˗B=u|<ً*Wvn!Poby/Iw@%~$kXNkbYd2[~p,k3͎).Ԍ2Xd~Z|SKsYqb G,0>bl(" )a#zq'T8cw]޳nB,ە8zDA(."KDKΘYxבi=J _* %ҖP[1f/ԕN 9!UK?LLn4/SxB3_M 봼Mr.mPL$ J+@̍= Jr,2Yu_2p:qX˜5ߊTk> &_ucy4ܒb{T*rVdξ?YXdW'*݃5pf\Ii IZhUQjcfod*}PIpއ?{L[h&|,Sߖ"R>gY)k6KKmVDv+ღs?њ׬ >usk'113z)Wƛ*YD-GaJeb jϥPR%0܆vӮ]!`\m,`71&.bm kdڶʬ?<xke 4KF?Mbh˩d* $8dB±h_>!z תሒeӘb*p*o۶R|wVr neOs7^O)<$ Yl*rQte9؆VN i/bJxڒo'ldR[X$`;45u$zzHsz`j kL->( $uKYW 9:gxRڗ9$;=$GlGOd)f"fzm_*V zӃx4P98bK0Z0?':9*1TʼnI2ȡUumk2>IWVt@b]1NV/ endstream endobj 1451 0 obj << /Length1 2111 /Length2 13347 /Length3 0 /Length 14609 /Filter /FlateDecode >> stream xڍeT; n;knA݃ N N{% ƀ~fլwΪkȔTM 3+3 @T^UNM†DEflmA9:Yu99ʃ2.6Vv++7 `G>)@ 9!Q=--_3#քv- ol}hbdPX='; gg{> ͍։h.Hpt@ S_ F1#Q,,1͜݌AK&;S#5?@UZhYFo+ߛLLFvv3K@QBݙ`dgu$Fى/¼(dW}b ד{v`7;lfigjS{ HZ?^KHAN׋9@&y؃6l0{4Ar2r]@>^XY&c  -,M `O}f E5tYDbbc0X\\ W߫JF)vf`?*^J\:fP5@{ X8YL^?[F(S$bc]?F6yml! gA.UuX_eK' Kwx`ciR;Y0RNC6^ۙMD6N.kqrX_Gwv`-W>3#_W q"Y@ J&6P7ƔM1~kL*&^P_yͧ@ט+ ƿ5ɿyMWM?UZZ|-||-72|-/rg0ezC /ppvU*|ue# džW.5߯'ſZo|}׬p_#yFu^@ w ؄?ت6ZЍi{; )R &3Tu)!GOrҰ]hyh8Bn7k^6fxLL(#w |(g, RsE=NʯEG0UC~ķ:{p${3t8l|~X"t4L 7`UaNr Dr=5&.k`h}9y9_ JGneHKwR۷+E}{7|3(iVfn-~zpsMIўbNvXN0؆Uz'M&:9f/"xb-Qq:y i_MF|Ĉ (5e(k[@t0N1'>W\BM=if`ϤgU_紫bGhݘ+C|D~p%s @.|):Pe:^׍j'(SR>:]/e?h=Za V 1M˜.P#0]~G J1c",]`ƸIwsX=d?^,Q}7S~g @͛]/-3Wpmt^.4A%>$p4[KQb7a2Qx|c!E"Uy̓څ)7(!ȷuKYJhw_&W@Tx̦?m(38XOHʇ¯B0<ͱ\9OZ9\^m~+CxMѡQWgCF132/iu0 <3mW)jU/7)?Do]7[ 8~o`l~pA_~a@rNNS;Oh pMޝd*1ks%(4ʯ >g[ކg4?Khcy>VX`EEڃ'ۓ-?#4X\(5e 5q YDn `>۵^W!ȁŖ~{,2}UY& HQ{g*&v/M`^IXYY8]Pݬm??V;xHRH]C MW̹N%b|8kV7B v^|۾4ťbw,J: CfOazPyP~q}s&Z{05cǘI\t;wNb֤Vi bIJ6-d$8j5`|PS0D2gI&Hn{r=ʋ;||762)ΠΣKs\]rSrƾ(<C!p1ŷ+#U yJ8\{ H!ʸi@,@2UǀAR͐4 ؐo+ hԶ[*97LMw4^$,0?$ד<'_4̇v5mlNArϢo*x9+ wQNĻF/u" (a4YLq#5`q2*xc/IEg*A٢dBw KrO%1ϼXQ9]|3BqCHB<XA4vʶpDwF yImJDe#Z!smS g;v}q,見>ԮiFvjӗ6ol-R?jX+77 *苧z'NlVS6C>~d3/jO]m\8fGISrǎZ@q} _8 YyDŽ{4'9SG>}q,-axMВHY#dUEXd_jڂc~7`] |uOW=O4_dk#λ>4\䤖h|/E(}E0$kfr 몌DĮ)ο `)^xs3+rNq/>g=+;BJaFCbT;i.Wߜn>0\o0$hJ7=^!<})I>*cn>tj擣)O\ȯ:~A4!gBOd ;]/tC;1*S6oFhɣ.o8R ȝ_u8)u -yHlWa'p;UOb|Ǚllm1$HpA2ZDZ|0s1./HiH\&Ð$C]p,*WJ7.Ua ?.jf@ ͙ϋ^` Yݔ+ٽa(ظS2wFN-oN΍b=[|z{a:% nP.45 B8j[@$3\ȏo~Dk׼u2e\$ lўSgZo4t`((بa] v>cS3 >_;7G"Ȯ0H-%@nZW~eAu(t")+Y  ґD=Yt"-4M$n AdC`b8Y?{y_l*=5TXKIX!AM`~'Ư')WrD9EDMg+=ڠ"P/V5Mx8cg (/B~\u sc=ST;)JgIi#O:As= lLۛ͆SJ4|~)zŨ9n I\ c C gjm]P1$ 1g6%n:7Txe.'ي=C(5]rӰ?$Dlq<Yh,Hnu\۫j|͞V>r;DJR@fy;rJҨ]4e9F[KB#s7LE  ;SªB,桁AisGAT24ɡwjϟp<tз(\+vҝ=h?O,שhin/<t ?$]GzGV&^b2_e ;貶Y=k{Ѻ3ƥMXX,%AGupЋv@ w^JLu:xUl˅C /0U29X}A7/Qy ؒ==SAn9d "-9_mdэ3 ++TQKt\Ua kO uz2 mO*K pFeuӶW, PpHem3$3"%zt#3<5^1 kt5DuvƢFyK68|yҦzVdÖB^LprF,Ntymd]V^C(kN{a>5T@D5~͎ V6UbX}1@BwM"a!Y u*~e`pМ'39GTvz@`W=1y*=s _+vH(A x֔䔀P%ev= EI>"\_W>pCUdTt/y7!ȝdzJe!Q!f#G<00BHiL V"de?wyEnp?܍T+4]#{moO41Rݸ{<$59f4Vv"ިۨ%ݮ\aMHJ% |GŨP9v‰,u3e#qt#A p}DŽ+x|~QG 5}V;4卼ɴ ~b'fMdea~m_blNЗ%kP&km pj!reg0b1bxh 7*82vz Z䝅0^/O>KPX9? Fl:yvY3"Mv i /ِ;'Z)P3A910#tat 41yd2l[(N_N_үUI|-չ5b fHm|ҾϷq*Ipw ^>UN;g blDZeGbF* f}(dH[ʹJ# q܀޴m r-o[g_8 6@WK !wxeaC@(0:gZgxw;' JaKd vnkZ,OnrPLln曲Y)F9PK $lH4[{zLxg1ub+@U= ːnퟢ=r͕MB8-IGVgmzU;@J32=!!DD܉FpzBu '!ꄁN9cܸ c0S"CM84ݢ߀z—G[/I#'"Z38=l)c}] [P 㵣8%*-[%.5\GʡR&eԞ.>-zAҽƌwˈZ$|3t Lp`]{{vDx4Xw%,Q+W"HQ:j4(ժ]0XNke7V OGKin&w-;d~(,0L!<#|i*_,h! m 1#d"lCR|6 FsWb??<$xn\g6;]11JG:Di-we5R[:IST'ˊ8OǦ\Hg݃VXm_BVyꮛ{Qq\< %e(mCe) csKH+#;Q B&ۺגYoyG]0G/G@YKt,i;SXnn*&k"ZK0[ݹ𗄻@]Y`k>-`B-Qb卆!ShCұbXd倱`g =A=48T4CkqM2[I9C"*6`1yvq+ֹ-s^rݤW V<Ԛ2;t}Fk..Ǩڍ/0~p)r}tn4l?I+b 6v^63pL8Fwb܌ev p6]t,Pkn[˗VFʕ9kb3[YUlU;@5NݶnkOxŸ+,`괲C두DJ{G]w &ĉ$2v; 98>B̥|?A@)p%+ ~K 6WhsOv5Q/,)f`Fr7#.y2 |S쳰Xo{봍^ЏdCVb8|Dm'm  VbSYGUH=+Xff=9rezc`5vDw-?, [s w|>v'Oۧoˆێ,)w?7"l5!&(7 |#!S; 2WNj×?#T8'vcQd5v- _Ы'zDÑ}"IiQh-oޟM)D2K| OR+M#ԩ\] " -U@#r(.] ˓fr}bY f1BB ŗrB2 #Cj} l\=e͉bya\,608H&*qF>D; g^G5񉋤fba rLz;IOkw'5XbӶw>Kuz dhIhYYrf2Tq#D*;e I$;[v1^={tINVp\EѵW9e5:<88Y*n^~\/ƏՂXgh|3>a&׏/Ϊd{&R@wo7z|O5*4ks/̀W%BHj<:\+>NC-\;*_FF#l">yR=OOOaXG5G{ᘍꛦb(Lcv&|xMwl\rI8a='l-7D Q~&9 č|dכިD`]7 ),ohq΢|[sec0Qg8h`JϽTB&{݃fP}<"9b8/'m 60en׈ dҽ}U@vήZ:I5ƪUf]8Uk/ҟ7=lvC >?7Lf't-91XHd?!r).kiu9}Q^z5$wȸ;W@%nX}?v \ncj+Ⱦ=1)Lrށ23Y$@ LJLzЖUX$jE,?/m{Z0 IAYiQw1LX}e"HyM^4QUcq90Yd_ k.z?0?ӗ^N_M߅ HF=TS)3r$2!%D/Ujs|U$VpIV}Fޮ=jlH qx[ kK2j_=8 Xi@uӴ´ڽ0>X31E{ `삼Ueb(S o/)&6=tn  =YvD%^Ph[!'/`YOj Nmٹl^*+ "S"H,}KK+%@4 `d]>s5nyn陼 qa v0Jdd}>9-粽+$ HF"ėQFҀÚ?-2 [b] ,-ݯ/g4{!@TJ3KhKA 90,*>~D,@mN/Xk;=yӟ:])%mQ_2 (sG`8q >+62O>11a@y&' b^3Ez (v)up3;sr(de1TK&FCLjTSK[LF jooe6Yt~P1*<ʱ+J NDD@Ak:Z46-2 Řf"ip2RvwG|)+AK9C3aKe ioԷޒDsD31 KwZtV#0s ,l~l˻LVmXd[ƽ3h>]@(YpEkQYxVA6:q/r9ЯjwvDr'`Eym􅷪77U'9 r}`TT$F6}sNѝʱ: [- |!L|y_#V.6S }pu4xC MK%#V_SG>!Sh!ڸZ62)|zW6G'ԒXc<{?".ITŚ,E}e:LT'yaq+YV<\rشPkNM=fc)^P;R}>ucrĺ/A0Y -"Rd1'A>?b, b>/4w#gNgNv0 H̼4oa}_MqK=A+G5jqjZpG5x EjnG_p gA8I1P vŸQf| %㧫BI^4Qp Ldu9Lʨ!<1d7$ھ؇4DyGgK^7\Act[|\R[EGxhIp=Q̲"yKUDi$/ʣibTJD'y6Lu;sT<0/Yd+3 >$yVc#_|z,Bz7H"H2Қ >Jf4PSg)a]ml8 Sa/N=Ȁu7Hr3[B`7%]휾JA( ;p콓0';BgoDT"WqJLlHdDæEL8h~8]E 0jSdz>S;|61xBn\x>>JV?T9$X^R잡zJyOzFxw ZXmEYDVlX^n?6Bi&kFyLdvmˣQ5d7h[.:$@ZVdF<wǜ,Uj{?\ޅ!%(cj jvcP)\ۅupvc?%qPkd1[10rž׳Ogd!u<ɬSq!>#NgPge8'W *sǐIW\ϫ!#DmaGgN}:m;:Nuao%$҂D-eF>u:Lm5.DAf1(("wKޘ[-iƛ_c|CiԸq|e^( ەocdjoTeA9nX/(j3|00bgƾ"2-S.y`/!婑yzjv5Wc b)~|rŖ{qoe5}jV]($}{w.ڡpP7&I\㊺9\'Mw68W znbzA֦֜Z1HĪ"yC~)n)glC'B Nއ>DXHQU!m3y"i((B<;y|p}1YtOXx Lz_YΧise+֨>Ŋtp(`gF b+^K8)SßRLa h%<{#y2 kZ!GӢ7Sıvn|tNig}Ao9Mn%r.cv66)uGQ8F6B JP!=B>831XsCg #'>eŖ8K8κ7&9C EѷJ$~S)dv;GYBS"Mycp~d\QWwF:HG x*%ZG txbL|}[(M4BJN7h?nQ#><7a``s ,xӍ2BPNg͠spvVL;g<$7,Q\Y jZ8l¹)&N|yܮ4GM A[W'1_ˀp=]ⷂtN*d=1hnᩂoFUutժO]" O 11J~,'\aԗ;/cJHJqdl?bxr?dV>ALq{5.h'*`ǨCK52PBW,s<zSfJkXXCQF|yDt!KTLkȣM_ofv[Ѩҏ|K\l?HM3)mp!zg19QI;[GCf/\,feh@O7ڭ(^ =C2H֒* my:n0EܚOx-FRҮsQc2[-^<<iq0oBws Dݭ%/?( nȻ+e$ ltV( ݉3K 9I?m0 endstream endobj 1453 0 obj << /Length1 1423 /Length2 6058 /Length3 0 /Length 7015 /Filter /FlateDecode >> stream xڍwTk6" "C7 tw03 ] ҩRҡ4(Hwqyk}ߚy}Z !yyA?yA \}(⁀a(ja /HJ@$!(v/ A,p7_#UWݖȺB<`F:B\Qm. A+#& vE=9o(Ѕ ^;'e@ Cw"~;Ho@\ xꀞ:p;ݟ蟉_`[[ 9P΋Ar`O GŃP k`@IVᇰ!O|?ӠYf'wuܟSz@lQ07=fg QQAp9@0 wc䗓! أh@?@t{Am  '; FP@?Yfb>%%5c?v}~G@@}eCl?oa4(9Co٢,{GJ.. u@ 8j@` 5g *H0jDda.$iCUWP]06y< PCg댺UnrAP30[`_\Ja€??jJ > HT=pT ?jr")ֿNMm%ÝߜUx,Ě_lyb-d~+]9ediD ٠yGV\r.MgIn'BgvMYCKdmaƖd4q!)ZRj* E' )4xٜMXEs4O}ЄS7qTKf |yۓ*x\R<*CNwTdY 4V9$ݱ.X[6:]G:٩^7cnj5IiXCM-&Wg{Mh(jNN= )5I֪WPbC(nW`S ~v51sY^YB\jӝomW R?c. M=zG,oo&nN1&L^XyCJ^theNo=,I~BZFiXb&g-7 Z93GIY}bl|ȫ6_ܷZA>:e1w b1Fb1Xx ~szaα^RUrF be1d:kq毙6cB;@ra^Oumy88V<%Y7|8#b"MdݸivVO\}[c!̊v昺Gk.ԏn(Κ:yy =bARb'\dH :SM(d{ ?r ƖLL[)PwRyKDwTzp}x:'> c*kyNm:"‘O{lL!Vw|J8Lr ^xx[ӷÁP&Hgݝ[rLjw~$G T%A'٪~;s b=ή3WIVk/h9)>i'J/25)PpXq~Gbwؔ1g?ZGQ'K~.YNab>#kn+6LSXiM($9,"{lRE$;c{?؊!DӒ1K&(uwA@I\9QҀQ+ <hMddUCI"®1ZfZ(= PҊzd^-w~ g:ϞLg[g9Sh>, RNX vjmG:B?<+Ǖ ӗnc*3?&nD>ᮿ?Ϯ ~ Q$l)zyz]x!1=a%yx?6v-_o*􂊨_FE8qumoZ^I8%&$ɷ'POGCjjcy%{x^- d$EK:SFEPNR3 _,hRiLQ y-9r:nm1ocq~.4ʟҨj? o4/xd9OQZNaBoS<3T`Nݡ&*K${a4}z~̎ Jt_bdV&=.XmS䀑tيb'Vg*ùpüz[a8 =} 4>Cy u3sҭI⒯6'-KN+nsPmwc$m;DbU\Ixk½RILqmQl: ԆjTGktCy*GeE S/9H=:1oL-rV~i"rM/d6?,GDEb[#%.hq.ߩ{fjGeҽLG X{AǼ: OXȲo:f* ӕxqrA7-شy~J}}f8P8N.Y&1Su#B^ psEGu%9y \͵qNznH]$ʑR;^Pۋ閲ZzGOODPD)~) :z/;t 4^ dKrvy;,h]O5;*{L별RYGP`%O64lNwŻ939\kcN uO g*p vsNVV&/-+63y6<\aynAHbLhRnU(Ky|@Qk ԗ:.n<$hFy c]h C˙R~p̳fiW( C485a Pftlꪒj&ٌEnW Ϳ 3cM*7D7/)8@IKy1ó9#@g"uG1jVĕۍݨ<#* 3_o|~`rc!ʣ+rU"E̮'7<!Cj*s %_r }?k 2[a~ܗ<}YI@yiRIH}l~c˄ :݃EbU/LԴ| BUqH*U&ѠUҬSß4csU:j3X쨽Xi4y7Aq7&|"T;P"j<6^Okߣyqa݆勺ax-IE-vo6+Q_=VfN,˂V&Bɼo檒D$UVIJ}}t &f#z"ߧ-[on0ո;`8 VMI^={`[]l&ǥp^V.ʧ#E)mҔ_l\"u]Q 4k&rͳi'TTZi|z8ylEo=<_Rn_90|yûĔ_3S^FD Q`x>L,&}L1nDֺn="ܗYXd D7)`LxAPhI(N ]i^ 3aq0;ўw 3(Kx#M-m<G|Y6O\a<)xDK):EL@ѥrAo PU}景:y?u<]9PvcuwsEڢRiڅe +QzsEf&:d; Ѫq7RNzoȾFz41 T(,az dΌc6.v[ ŎBK{Eu0N5O:[jfoα8t*ú]Ywuu+!d~D߱cU%^`ps<"2DKTE6#e22XmaL_I2>ש|ǣըﶣA#^e?&fdNqNuc`sEN oӘ6vܢ獏ߣ*Sx+>6:[0r8aXXA,18d{fvJ]UJ? }+OUٍR$O~d>bRj~/5&e0}$_wxAwjDgVԱ.ŒעFh KPK1۬;>{~&20%RCDy6޾d)3x~91΂Y0!9vӾJ&oJHOu" endstream endobj 1455 0 obj << /Length1 1579 /Length2 7036 /Length3 0 /Length 8092 /Filter /FlateDecode >> stream xڍxX>% %@:7r )]R H(tt[v]9>>>B`7IWC;(72@'atD=@(L Tkݡ?:$;ݟѿ!08#E _@0ă08u0@]0 sGP0/¿`Y ᠂ts"(_SyB!s"௕# )T1csb@)qq1B0sv6c8# #A{ChO/hP:"0`u!Ɏ1CXc X1^?`Dn}?)TVFER@HHo#& "2x^+!1zx5P C;_YWԽ~? ]$fB 51кP{5`̌(!0:C|04- L 8 5@`L_>A\1w Ӳ.(f]W A:A1qGQf%af[a! `8D+"{"}^&` 8@&f>6!0O ! ;%n^ہa8ͿKHat!PcTtC, ^ob B榑uJ>㯬v&[Ljf8hLx(?p~l0[5>bu^r4Z`oǯ,HQDZk)ḑ"%zD7)BmܗJ2 J];8,8VC䉔VY^&8`֬ ?=*bNIjAaq)Td$ӗEq->X>Y42ePԫIO%w^ Hi#&\o$tu99kΆkEx,ȲsKxᢶ_.$䤀Dl2)Y܇d3T Tzl.^wNê,X'o:z_i&B-:svSZ4>P񩉣gvIIFx/4d+J͎'P̘l`eݴT $'rZ|ZSV ÅlU$[=n&{jtw~Pǭ kIT=^.PalGUк1{I~RC}xlzDݳw̝^vrglk<;Ґd(W5', ĚZ u:NZ ={96|#Y]ulw^顬 $㞍] #1 V%9$5L# E;VZ(.5z뙄!%a߽ D? [苿SBv}acۆcyw82i]ځεȚHۭ 佌"m z^/$gzF9jG{mI8'߹ײ?iu(pAYKkF$*6Ғ&o)d8(]kC9\ ·6بM[:XYvۉD6[/&_|ߠ;5a4~w5sjӼS gr8nFױ/^5#A:RyO'y$*CfȆ = 2yrËkeU]Uߚ3rn6Rɘ-3Tu&'T#tMwo(i^T6dP:h9 6tx@1@{=!{ڎ=]IVmgYZu8 wGQ.p'j=^Nhdw6-U8iQXMs盎&-`Bi)륊fĚ|ntl0FF4T%&LpFތ .L5Fu|=fKx"^I9cx{:\>Jđ[oS6ɴzw8l혫r~T)NRKHG˷|# g=lݜF h||dC! HZoAqEDNɖ7s_gX*mh1{Lfƕ-q,QB7b!d&;~=rF`pP@[łLGL90R xvaqT@%^E־3'[A>mfU6ls`x7"dSaJg]Or&OcWoA*`kf~~u2yyk޳,R~MReTά\@ycF6K* aХ %F_Zڤv~}ۙvgvās7`[3,a~abP\7cmbW }E:N MH9\{%ڵOyN ;@-&sPX ;w3o|>+ԐڰKb3?5j+2IQux?Bt GN٭Ko& U`ZҼ7+>t&Hs;35g̴;Hܫ{М9-oAĥ$_ m@J_ŧn񬷙MiW%´ͩ= kpWtfG /64OޏlUf+HmpXip50*lzzN4~uI/jD9 )ZTXڅ:Mrq+AXcO2m5SuSRoHv;t3Im2sxޣ읓}ql)/?Ĩ, gE(C2=|Tt5>u)l)T7␸W3oxW4@<8\ /H $B,F&fبTsU6 َ5y%н%kGI>NK y| [*0鸘'#=;:fOp#GHl8wK${nc fXwu֟2D@JOex SIVHȵ]RpU!#R9*GlKp?bNE۬E1CQ(ZLoNlUڝbp;jRkO뗳='F[R|ҧ]9|uq'JrS]dh^o+:imZh,5s?~<{lVÔIG:Eov і*ڪ@%dUz420+71qӸmР@93=b2Ġi|DNJ!u]D(TކINg6=e"V/gd|6 ,D孶3@I BBק܏jE#?e;V-dHխbv@J6E葍jIύZ;21N w(go*WQvz=&c]y<~ %8y+蹁#݇'k7zY,~𑸣{`s %ۣBAm#ޥ^RI yvoR_x/HGqnQ? SWKq3y 7n!8-O 3{O$?ޞJ!wEN'.)*A5E^*iDֽ n6.2s4Ug<}Q"Dw6Pvey8^JtiMHlC?n]lV;]Na:w^F,yR\l)ǢZ s{!rz؝ݠ{L [%2*Vnt勞Q\S0w@"Q= O*֙x5g?Xs(xx.sKn55Dx xs5|jֹj11 HEu]?|RSQhqK푨( .'Ș(J RS09WS4_I7>jyVA#[zR21(?n6XT{386wV=kPѪOsn;&DyMPw1ji-%AF7惭C(>鉸:^ZOɷWOt'Ef*tlIPSx&Ggݰ$s#B5flUBIq @V vfyxܸE܏[שbBH~XG0cIr}V26Ia-hp/fĦ9]l CPĚFV]Dzz.wP͒ b%; ~摞&+EFQϾˢWѿYSAFgRsh>0XfK5*/-4+ORJz=2?X_Xi \Ģ@~ trSS}CZ>ol? uQq*X/!j~ZRTщ3lQ+s)mMiًIjTհvJS{??g5DF0I"M[7-цp/K\v>fqZy$(Ec(WY0zD]6 :M\A뭗Uv"3wL=uVy1Z?*9uS4ÖHХMQS mkGf4C@#E̥3*Zc}'檟.Qe_N&O ԉs.IiEIҬHLp/Kw$U+/M={s٭ctXnƂ)HqG[·}>?i+c9.V #|zbՀqlˢc춟ǿ9y; ȸrjTwBn;y@9DX枚кR)~[%SZWا5AYUtNSZi}|n~*eTo]νE=b]-M}T`<~b&V{i|0(NcS*a }?;&i7^Gk}?r[P!Vf'cXj=cp'mŖLIԻ'\Zflob"&˗%j;gV~SxPPc#<r7b/Sj7l3]$B=AH@恬D7bE BABNmk8_سϹҰ/~6&xf;n`893S ȗC>=֣.ظZ;U&XLPFRR jA>KO0Ήʿ̼Ic'64o}:rO{^eu8;;J-#AnIxv`[@I 1!p..{j>ziJsSH %I"Z~JFmIbT^$Yk.get9˴a8fdÍtXJJlPm844(8ŏgc~n7ALynwNj} f1HpVp}a̝1mroy H)(mem-{ WX |"eb];Lw<-}^2&EZi;Joŕ}`fIo}EH/L:{8LaE&6IӶ\1*]>`oV4W"wS3tki7"/z,@:V>;x%isqɀxV,׈ryVEFe\C ҖaX (Eωk\ja6 /:ؔ)EuD|ۯ)5XgU#f)tNOd!j(|GU&ʘWPIRF@a髫NjoB(w*EK[?G}%QO8HC?\ٶp@jڹ%Ytz(1ɕ;QMK׭5M:m*95mW:ƧbYmNO#o ?@oOyK{}T=He\NXd:jtlT jD >$<6K  b[ 4:SHP+YXh? `U& }({&:`{U;hvS%ȊItFcgr3S|_G)k.NtAwQ8? k-^> stream xڍtTm-(0 -Jw0 0 Cw7ҥR tIJHww#?~uΚy}}fg啶DX@p/_ k$  bg׃DP3 _ H((t:Pq q8??@߉8@ Tp3, A >} E `8@:W W N Qtss;8!R\n0 @ EB-4?z60?. FBh.pK(^t$Ixk6vUj.C G0XM5>; wF`={`6&=grs=ey, G9ڟ svp+ KG>U+ EDP'b^;x9"VhPG vPHX ('Ow4 >|$`3,p{>_6dd/^00@?D>n&:*í87׿de^A2 C~tK!{a# v{ m uN} ceu%ΰ(0pkyAB|BpjCAl@aCΰ_7bhAз3~hS{]y8a}"0 GL@XB[ B}V$ѯczhsGG~ ;=L;:"aB/ vo7+ uB&G e nxqF(W^6jN2-hM f;p7m KVAaw,rqb eD[D,k3~ncr?VFu@w2dTtv6V+"Ȕ,iꢧ?x=iX6M뙝H &JGm"x S_ɛp{3B+U=HtgL̀3_ߨe" Eve,uʽVcVRU=1+I߫ Mz~tZb~@_8KUxMiCCm"M>1,w~٬ϱ0\R2nrnzPPVΏ\wB;f,Z2^Xe\J_*OI [bU)fH#o鉔G҇=ʮ*n*A~8(5tCqBjڙv_c+2#`IpAJrRRey? 'н94W}x(^bnjP% ƫll2cJ;y}n_C )(;H!W(*}#lrx^P1AqL `p{ZKg Zm9JnOhú,z!/n$DzuOcw;q] -.[ 2^=dZ Y97 GOxtVGDP7Μڑ~+5VA~G~d04m@V!657g#q,zE:U#ǭ6'k眓S/(U%&'/9qQg 7+]﷧ B6ۛvX ߗdNju ڋUi$ub-Za!ro2$4ŠnK%yAP~q[Iʷڪtj)bK!#tOcʒ\OM[{w)?[\O|,5Q?vP|/9˦E 'd^٣#4+3;n2>$}ٗ?pwogqH[KW3)c%W:&䐁1:9?%З<$2~;=$NSD`h"̭ꇩ% #o o L8כ,vyhpbJ4[w]'bAq3 \ }M[[D鮫~Tkɐ{>pe%=_ ?2C̔FGkt;-#BKgs8c$r`$p6&Ià>8]v)K"'>>o#in3$yX䅂..=UwKhi29]oKR Q>l5jySF s/?P ͎ "L}c ZJhQe7AMw9}{r 9S Rr'j疴.!8]/% t 07,#h|IKQ<*Xdg*MIܴ :wEm6/L4djJqp@d[P,vp H|e6$]ymעd* y;nCcPWON B%X Xge˟7}uH^uD" TƑ&lbug*b2Sm&?X*s9kH?* vbI6e[6$91+uF^cH1n AMy)biPq!IH[dٷk> sDWJڴBZ,4VgԪr#?zݩ"4Jm`b0t 9ߧˁoL u2I.^{FJSd>[/%g8ޠ߮`j ?:5d[9]<)wl^(.~U"盨K];4"RVO+!"oIWXD&ޤK AQ_ZO"n ear\3iIkm3`{O'3~Lc8a[\&7s\#v* /Ka";#;VIEaH:G]%6@s m`1h4g`<'o\x"lW@ J 1w<":d|ۮARH8Df7*:\rXILf͸ѯye*PِEGd#xֻR' csKΥ樴~z6TH_b/NN]l&ه◼efNa-#b&7$Ցz^ю/PTnG 7$}~:?/^^3ȟhhr|7fWWdCͯoICe;'l˘uzbU69NYj0W/<.&B窔%:ŧQپtklgkz7̎GIlliMf;GTS'Cz!o9,I.zuЂWlco~On5ь/2&5k+4&7w.x(Llޓhl mmԫjZͨz̺XJS60!OOt۵KH2RBƫ#ͭե)zgm41ԦGO#2*%Ω{I;$]hהO~nʲtfxNu5m|jЩ(B?ꮝίXf-!!]?CP!|rߗ @GH) {r*xc) ,IRYqF3=pu&aaCJg9={ 4ۃQHbʍ-JqM@iR#/OøBw.pvQfbz$O}(Z*_IzT2UJ!YT^ O~{fCeE8PxTYH&Q!Pm*9ɱBR̳Vd5_ƃeڽ/>IHvRPRYڦ 3~>|?U)*-ԢX>N_,j'>)1]6!V۸=ŠPE=xjI6rfQ"vKó0l.Zh@40M-~[Y&i;OHݎM3SM\J\֒-^Cs=.<>4 _\ii'm6n't`1]6Ee6vJeVG1&e bs$'%*Vp ;2M5mȴT]ɩʭ މʝr?8Ҟ;3o/jj]b+(6.g}Njڹ.LSўfeW{JdgX YF^0yF֟C#(u ۰UyʨPg.T=١3L앛]b6ghW'm.fNU_﷠: uя/[wGeW0|}> qy^.Z!{[Xx{-DukO)QS4y[&uFGЦVX5#IAQf[0QwbTH$i Ͱ$ k~ߞ:@J-۵FAMr'n6'2GAP9S.Aݽϰs p ~7D2IF|& >]3'v0D*9v(,Sk:lrt& X7 Rij)hg z| klܬ QxM.^lRhR`ps#e10(2BKS+ ԋVZM&I'r9&2 98}^啅ѭ*Z1+и۸Xp58{wh}Egӗb7BT*XۼCO< zN'K@r㣪]fˆtr1b W!@vQg,fn9KY *-%wTy{ a~VZ*EA/X1#.H;pq.NA pVRz;֗S endstream endobj 1459 0 obj << /Length1 1786 /Length2 11944 /Length3 0 /Length 13067 /Filter /FlateDecode >> stream xڍP].Cp@\ ݂3 `k { %XOv{k9Oӧ-XeageH(iʱ8Y8Pii5vQi.XH8M/2IS苡 j` 8e,4u6( `TZ GOgkK+K F;??/q{5P2Z_2L k0B0YA@; #3jP?J(ڃ.ieBn A`ˋ+ xАS8!+e r!:@Ok% PVdz@? M\^MLL^ n WTw}. gkG 5rRs {{0?Ikg0=7[Q#P b E% fcc`?_jvtpXzPgW?P ( li AO1/gk>d2a;bۿK;7 '7 }9wSjj7DX8*Uߓ0;< 6n6ˇy t?_Ig7e]/!5J`skWAM_vDb2,\l\ɭ]=P_f䰳U\xw^Gz ۗe/y ?V`l2/`?Gd8@_\/5,Qh,?/h/?@? h ZrV? h? +=B_X9r7zu|y!v` Kpv|/]_8pvxBO_:/}= ԅ `ඛ*,\g.PtHv%n9#Żfw"nq8<7F.Ե!Zm2L (r(tv7ᄘ[7_01;ne5U\[#7fE@&D nhxW->3!Gr&6qO.w?s`+3F} G}_=< &Sڭ) f.cԂr[Sgg[QrM1T'ij= 2uJ~iYMTOXZ+58 >qF.3̣x ?اAF#?[3k'WɊBag8 *hŒEtz:ṖghL: yFlT 8|g?0 UmHh q8r!zֺ!MBX27si.䳔3mm1ؼI6j\+FP9=.D'#VE'R\(#GDQ5O5_j.ij/khNkT"Q(bE`V~pq|u-2:a[_Mf~evo5d V3ܳMRV 73%>R)P] 0K5Peut/'EKfboN׍I'%@iRJIKߔWw7R׮ZVMQhQ=FꜢUyEѽxLΓ)5 ;Ѣ0 hB˗=b900C `}8Z'%^I6&\_eIE=/=u]qM]؁diVڼV9ԯS5''?B%`Xfζ?r-*|MzΒb ?ʔT!Ά=ja3l|cin0;K7 +J0GqMÍZXVL+5E*' S5SJ2 ~mi ¯S I&~<.!eܒ-YT#ۙ+o ;GBj" ѵ0&6Kg7\Tܻ焝͂6AOoo2)#v3zƱ Lg?Y*i ˢ-1QLаI, |1wL$5`_W"rΥ&E2Z Yf TW]x:ا4*G.e25Bxki$K_' 3fQ\e.>PY@z4ͥ!L˽$~tK<`?Yw`hq؊`gqr'=3 $bU9{iۭ%@sw(8^M lѮ[SK@=dzKFn{UVXz 2픉͞9^+XP:zKk$)4ba|hye Ru:Vu}0^r^Kv'|$}dUUp9}RpTHqox suɪ H6e 0@&#;jWltLNVv8 CFD$NcE`r^c~;gR`[gR2ӎ-ؔ Q;JHP`$)4>K~(?7( V$&3[|ߪV4Ԟ3ݨEYynwV.H8pL1SϊˬX ٕ1VA2tQPۢVB4%ƚŊ  /~cχj\1?r~Ctj?;ҧŕ ,twD< DX7ߤ@D?-ӎ4=2Lwiƒc+"ֹ7Y|\-/}ڻb1&%BXaDՌ %˹J9JDNv]Ip1%H=wp}o%p`Cn*CrDgKzsdwXكc烃^R ,YNOeP5zA3xXO܈̠aq H9*Y@ƹ \L,,#KcNPD3Q0`rOv:3 6Ms4deEلEҳ|Uj EZ%>p9;aM >U^";Aw\T3v[Of#M%(l ǃmiJxbV%p=GCBHgo0 T‘[jeqQKI_*m.C1bVH")u9%;q 6;x&rFn j֡y6]g^&鱵XgŔw_mmn(o8QS gcCϣKזng0Ѻ.H#w#ϏMQfpED&;ٮA[<.0:Ok 1/n'p|33Z6獂T7Aa[{IN%5ɶ. V๛MbXHW^oMH溂(ͱ##w'h[LzsyGdffos8ZX~6ADBWBRfĤ`Z0#,ܡ9fb c |˧0:z^QZp sK:if!jGƟz)^)^SQ;E씉09 U!:T Sug/kUxb hFІgu#q(\'{cI5a ?}rq{c:o[fI Xxeu"rw5&e/ňKZͅČFV*NP7rV'OpJIOa? ܭ*^mslEd.dƕz'0eZIxCc\t߹cKM}Ckڑ;ҬR;W1sq V8TDlCkcgŷ4Ugǁfch.ǣ3@٦i| On֏}JaQuy^TB#'䣶{"1B;LT!Vl{\ nQ]*7ߩvL39QFU>a[r,| 6ܥCvF\b\ܖ{Hgwk'N. 烙_{q71ܲT@3"@=rt|bvC1/MblDuݪ3q(^%Ȳ32vͻ^=/T^ˑʹ.S OTq9vck`f"/mw|BVY{ʖ)׊NKh¤d"nRfM?#2-A௠R|Wio"hM-2e)ĽtgӏxZ[>1̇aWU̘NI=p{\ᄎumzB ˚ ?'MWV2vIquQ_]C qʺ-״ jQ P\G*w/#6pL0 ] {Vv|EEZ6[RYgtzibͲ:v'ÁYǔbLuV2 Oxioa@"Rǂ}^\y-@qb޴iQ|Z<#Y*,< `+7US$Gϵ}h^qm%d 1qM"G䌈h`\YG.Ջ*_N jvgg$B6?qk"1ߩk }'(AHƀଟ4?hJ&ia8X`64ډjIz| @iV+tɦ=NkaΘJ3O>BŪ.<. 3_ǑC \\2 %<4.~:+Xy=?y#ȱhe$i5"@0Iܟ4P1H’bݯvG,;j]*7,А;HœgR"0r`d˄U&:чBՐOhYg猊sR=ߎI54&`H*f᯾!k /\/("EDWiYM$(`%ͺ/QґJgQ'Ax⸵-|!fYN7TWIqdF7B)=24uu9ɫ~8lkob&4;?iݱ|F;ʼ5Gu=Nmg-&̴R1l0SW$Ӭz?),V.~@Ù}IE~n2#!5;b]E\ brlfbƺ/0+|xE!Ս/h* Y|6k趁 J6$QěBn7 ΂H]962,M[QL͉'=Qc,pYܧWL}vd"3ZMh%E\4#=+Xiq_b@؜׬LӴMtBNS#5Rꅻk35`bܤ[1RtCr$?nVX@09ܴny~Kv=57C!ɋ0h bEldTPa|J%n2YNQϰRKQdn. 04{Fny#QnM F2HH?UO?R}D//D?tX=Vr;ۄJ`µ+*co:{Z_WxZ!-?GUyh5Xp!~uLidf[7Ցy_^锩zakWER2TGVDAZE_)Έpl~y o@/ B,`JoBfpYhd~ G@2DIe[;Pc;?-jǍ'^ۡTN@ioj1#+&.[CFNgM}RʧjZRk$zҦiDL9b자OGsqN4\|Rw_ue.YܫdT3~E>'xkTܖ;J@EIޱ.yXI$8{1lvGyX6{\!=^nj]89m?ؙl6gQ`PKX.OS, uف>kXpAɢƺ G5T0Mqo@h ^=H$4 Ƙ+Ѐ0N~3~' B,}ZuZo2]vrsbtdT3xi$JlO0ShhR :ٞPSəTWQgZf5j~&y歨t1rHV>xIC\y B$.FΉE `5glI1OWM˶ҝ&tǥIjU}٥'uB١=p.7gH;'[E_yR: yʞ5%JP 6HFLnkzƿ.)g~lOFD4{!1iuU sNJ1s|MYy?87k{|R粄ڥ b=! )زJ!hxv}BSkL')2t .r}.X7f0YLAC w;[a}+ay6}S p- ;<-PƏEOԴ k|U7rx:G+=*%*AiJ'_e&f`s ~Jڡq,yL u4AԳ_ aӴX4o W.k 2^WC]j+=he@m΂o}yTc#VxLF*K>F2m-VRfY[v!ÓܟRt [ HD9a*wCА'Y$xpP !߰9cǦo#7}R҄_Jr60bh(LXɛ];|&q(ŅǛhfBA:|G-}3jzf4-+`hlRq:*oDJ`xlG zy%-:%iz؏fFL`Lylȃ`4Joݵ '//Mvw~Ht6ַ0t!E_dAlu69P>Щh~4Л`_IRlőI*S4|Ovu G_ۋ 9 1P˫(W2Y0E ?lǐG}s4w3y*=SWyojyWؔEKFB2[$,&ƂncZ1HwtIiT q(]Sp+HHveFS ;4]=Oq1'ϳrnv$\\ q1}H)9R1Q_]N6.JUr}]=o`@c"Z~xDugc"@ML(hLI [SNN'zVwl^ .A?QWTcI9MTfNS{աCs"(,1ΜV} Z)Tڋ0}WME[Si;! *sƄ&#BK.XN3rϦfo<$Lp2AfR[ 1kHnn#Q ֆAh+Y@Oryi:|M2M*/?tq!#!.6t ţŬjMs'$˾}:wρq4} 7p-Qr>{MfxMmWvfy)M#%jmD~i6*[Jb+Y Vt|z}4鵩ǥڽ旣01n3.Xh- PAMƜXqd;A#vK7d~n B3mh'-=bsJͯװ{sY!Q'fʩVs,9a/;\LF0+ W7o$dTO2j򫤑9$zP>2xwKSz=LhQd^LCu.'(ca'{h􅼘Iv@ʇH@7]q'۔M5XO59ϫɱfΝT'01kUR-&kpm2&)eV*x5uJzY 1""ahǣd5Oi^qO "pIt踬 !)﷜nl5J%S$ýډ+b¿~,g=W1_*ޞ&Ԯ FKFo{gfN5Ah3f3\xo!T].L'=4[C[\}| iٛvxFKɽDOF,W%| ;[SHZ9IN endstream endobj 1461 0 obj << /Length1 2813 /Length2 19915 /Length3 0 /Length 21505 /Filter /FlateDecode >> stream xڌP\ 4wwqh=!X@p.sszjz5eL[{75 (rtcfgaH*ij8Y85m#Qk]\m@ҐteRn`E%#@ ```cpW"2(A@W$jI8L.6榎%S7k8=@dnttBnnN,, +z&5@ tZ P6u 5@? K7OS ,1:M-.pt"@ e(0.w[qd9 `ic(y1L-(ڻ6f`d ͕O܀,h! rp:"'e4ݛ9<},m-,aĪh[,BzYlll|3en'C?bpN '%8 %psq;; `qDz-w賁Ǐo 9{bpid$TNC  ?76s?9GK?)k4< Ai^߀y27e$no9MlOx3@p:ʹ7DBڸx-Tm̭ rsxw+YAV`b/nn/;xG-^66X\*G`xEVW`zEV/UXe_+ʽ".+sQxE`.E("0+sQ{E`.Eh"0W\t^˻Ws{E`;Wgjnccnb<6vj ifvH9]%kbjZK?WnS7q)sOb\$%3W'ϟsgw-j_>U6իG՟8*`u/ __gAp%^Sѯຽ|r8V~԰^I}eN >?b[}gkEtwW#VW :܀fs-_`Ucn+G_-;q?Gavpa"V7kf\7Oп >_W&Ws˿+ nǿ 翖 __W`O>@0[G_o[@iqd.j[8'4N=K=|2}ufȪ˵xP74ݕas=|xKZߣqv+$^Dx])" ؎ߓvt3dgW]_ѰmjZQ%3yfYpn̤ X^3WX9/HGќEzk1w>+TzWXS4{)Ql,}~#rXl.TuzP35Lj -==edU{vo"\-9 ͪO ^M⌓Q +_VzPQEdYz;h&[п66gǶOݕ{Vqrߋ"5xeNjm\logfNP=uzR>gogq|w14TU)j}d̰H Ed_dIP!@0eHY}L(K| lB[\ʌL Olym^R61 !"F4Y!&#'eknٓܤ'B~4䋡N0g%gw;eR5{Ms*P:F8>ĴstQXIUg%-cyf(]{5$ATIuB 8Sy&GnwYuhjU86psӓkr=t=-%sXEeo޹1UYzrDmBsDJG'"yd3cCq˘,b;6w1s/evņ=7وي3SkJ=uDee^sXxg1Ɓ9$. Vh(xqCo[ zK;pvqDWhUiD0OuUjca#G ジm6{;n~ ݼ#Eϋ?R0O@M_&27U(:+}z Y 3LSAI_PP=V2|Bgq#v c`u> j  UB']E Wq}}ԿF,=wؤ'q3o>UVŇ1s-mUEBµ~=шB!UjE_=7X{v˜C5A\"z/._}[]^sfds/XC Ѽ6Rb5>eZWv;cq5~d|bD/PShDzdNMiД`#iǛo"GZGc=+ hp'٣>x/]|^F)KSvcYB-N7ZIY3R6N4{&(y/֨$N~&fZJ&6M|$sfD= b4֓́|(%a7ӸuBWxgBY_lOv0Ѻ{DG2O_t^G%^P- ;mY|'Wgd8Ȍօ0UjxFB>V®PoIiIE # I}~WB+=plXʡt r&jMG3*aa:%- QI;6H6U**F`Uvm ^'v :n6xY`\̟A~nScxd%:=ާo.[T چΚ!;[䠙(E37$r&NdZm ɱΜ#bڋ8N.;:fs65Z?0Gv{x֋_"U7?8Nsw}E7z+"ocH3<@( 2}pziNd}j+0) ?-}dҶ]uj3/ao7%q^(=mtMFV&m/aYCѴB@0[^MwmtE(OTLEd!G{G4ip|]uJZ7G\ KLk6& C]hKBƬN_Z;baa9R-#Ya<*,f z19#Osꉹ)cI k'NP@a1:]4~:ztwovy-Tz vCu>ƟV/Wg S{1P* ‘yo+sG[Ϯ3$Fm)v1U[8=W}' $} %0NW^Q捛iKT#NtM~~S'H{U: [oT.4A"[9ȇag:nLLnhh_IKfE['^~d%\nNHU+tּSZV'8j8ouC"ڧo~ëhBn'ơDD$e0`D#XUEeKJu"|9~V3>V<5|W&jvd{kgk?z.U-]&` j#e fضCe8Pm}%$lE=Ь{jguHgr0CζgH1kc LNoмLspuź?wy&J֨.Ku(Ha !~ךDۦ$*QF^ԥϫ F@{~W9^2 spÉdwiI6Hn CZmw\Ƕ6W}Cpl8Z5#ySU9;!yAL6ޫEԥ{f?F,qŚnZD+iMNqP [>)mKJ^t3kƸ((33FBT_~)ab1<&ɝ@[Ē?I0g͜U wYF"LB]=L1󮹨ERSentlBXSFneڦݐ!4v(tZ΂i2\ > t"~ئd* +P&&"! T?}5)57^#.q>Cb9 `PTa֑T@jkRȐq 5{Zs&tFū;bVޗ@jρ ziZ ~7^k0> #R]X]J牮A (-9L 4],p=Ѵ OpB%Ƥf}w뚍S/0iOiNwprƪP Lu~\y[C !/`n[YbɁ ))'1A)7X'./1n0M0s4_q=8g#KR*8oCs]Sվ[BBG7Mx>sBcg)+.p)3BܾQyOi uR~̈lAgc^J$40IgDdh!͚ⷄumkp'0~ A[d`o>&WE%N1 g{l>&ԓM-9b7**6V-e>GҸGFs l[/a1}p܋KXTO#E90F}$5wG D^dfʰ>oW㋷EԴ>tfϔ5yJ; #,߬x,Jy.;\SZ* O;4uFfP7yꬮ/QDt~D`Hg<1l W%%rHF)h-l%wlU|%@n||ms :#IKk\Vem01߫T ˧b#^,- ƻ[C2]+ c2^9ޤ/a@Q;Z0Kr`ښZGghJ3K :"sQ-RlwxdBSA$ro Mb! " %,wPc"y;_v [V^ԦK|}X,2mFLsaUCU4 _H6#VELeK,a ύ&230Ԡ&@C l6@,V~P={ H}В?D G)-n @۬. ,vp8y2<۵ &@p|kU2,w 1V|xR_fMqE]/Y̒%6JQ8Lb}~ L;-v\ /x_o23Y N3J}o_?'RmrD,}[}[O&#޷OO{*>453]AюA^NIW 9M-(A[/>Dn+ĺ2dBls)( V(ё"3HCcGNݽV!b9>Z&RFCHǐE\#4p}g]{%vW)OoKi)3 VWk̲#H0YB#Tm nJ>Y2m-6Wm*~Xcisxd呲E @@qk3̑,A ;)Wxi>0 Bbw];t1 }'1\h"Kߦj(ul6gWcHhX!bNc,96vK,~C1U)H| P{xɧAB̡7MbٌZ F7Uq2F#YRNp[4n WgvP猦no-DlD4S:d8QtH}fka+M5*/,pJm!_GQ"Vy 1Po0CWf}˖6(w 2fo1tCVL p0Mٍnܤˎ#xQ$U #804\GGtK՚F0/(W&x8XuQahpzĮ63A|.Qs֍WڝDTJ^} Q(K2>q(y3]{R2BcߝS1'!^{`nm$]0X #RDF @cg1Q!׹P%TR8f批2f 1ZH Xvܠ+GWżdo= Oe ?'ϵRo وZf{qMyd&P4m:z Vi^;Rr1:Ʈ<#!]S_(g BT̎PqQ_eXDd8b:NvFQAAVҸat H,PqM.b."&RyqptwF-|Den?(J}FA ꔾ7A :A_ SAa䝼A2w%bZZH8c[GE=6-Y׸9Wb֡x -7FK"URu#X:Ms?8B<71yZ;mTCѥ|3B`G3x&>\p|v;};na涚r)%_G\ҿG=RVP @M O\B?9-Emќ/Y2b瞮e#/>Yio2F^M q@PwwR}x y2]iRd& eHȜ\Gz2VǍAEbrq8/:8ZgZg4ƜձiX#b߾;C2o')7G~K4I. hlB1e|%l>mTV(B6?eӔ\83e\D_U.|IO(H''EcT-v ssTVyLG3p}Ď=6Y#Vfi̇+u6ޝ_eM|C#|# .o%^-Oɽt?6TE.d1!&ϛVSJ!_ 'C[F8=xҠ=(&~6_)Pl~w]oA ( $$K#[ߑ&y0'15Eeއ%Lk z8*ƿU4!ˤtѧliybo?MJ,i26(@҅g}/kS**oh=%h{˰t},*_VC ] S&WբD51e'643qu NNrd#%x#jH܏.2n <8z M>( '|$<:(߮yu`zwHyǣ|

;ڻF eKH>6n&EJzu Xx{eIzmj\q{#F^094Dkd3p-:*O"m  igf=ZUi4fjǷ2?;Rv.E w&ف(LYV-u؂܎CJQ۶7 ;V圁RŨ{Lyd CPiF#TiݖB. 3oHЍ1}c",҈n)G]wژIDXѭ: WP"w}!$Ӯz|Ik1XSCi1%3f3MC~F DBʇ@qE?qXQ.A󖘷pt:k7HQ1iǴ%=Y*oiҲZK* 3n.Dkr>)Vq4$H M0;x. T'Ē\&NVugi9x7r-ZҧxG>c0T-h/&u-b՚ČgDzu'Z=i[\D*VVۆ>Yvs)_VjߛԤ*Cݣcpa~ īɀ.7spTĕyߛ:},ɫifdܷcgv<夏Y/{' Gt-f)DEE1 ᮦ\ X$&dQS w])0,xN$#ٕ IlBɉp$ )Q u9,ȇo Dxj)Jxgf6b A| ηB]$-k5~Q @ycsp?VLGՕn=\5[tyv$UcWMD_@H/ADx{-ÉwDzdImyYob<`f(1چщ9AQzOHEd4.Jan7F)j_2`8"v}.XtO+,JwJm>1iЬ|GW6sxC#"O):A 7q,nYsZ"`gbF7̈́V,2]7Ó|5b߿n8KM>30шaTty5􉚙WD9]'Nwڹ7I-|12|<4of *(\ $X~B?E(z!N)tYs2X0=zU:7mpCB#=uo/wFO*sa-OOҦ9R|{Z>oCLRcT!a_:Sĥ[,)GOނ毜613՚ݗjBl202fnW7^P)O*<Pz6أظX9 `AَB*L.zZU,K.sst7Nf,dL׈Vmg͉a+ |rI% Pƥ`ЩO.scWA.+ZÌ#_ϥ+Kb9M:;F'6Va2 fpb!5^#M @T[w}sp7^a)풑\ {[E VO8^_NThT,(Tpggg7vdVMH[//FYy,cԳ/^;x$Jz0׷> _/.ĺYgR~GF9u\~̋GEe_37 Cl ~VWwڐQBCAc,u c?eD0l*;鿞)lbX#\' "䊌y Z f^v) K`.oD;\CJ^$HdgOC;syMۅ4"B.wȮ:AJS3jà3g{0Ux!ygxc*>`ͭdnwIA഍%{7@( :1ZD~]1~^36ׄŻSo"q#O1ޟt6DӎSqd晸gr0sE$,Gߝ[aɂy7H8%auY l7Xp9> $f:.")|E& W--lP&,/eZQ %fnM}ޔJ ϳ$$**TT@(}_qfr@SCzӜ#ӣǔ,hY=1l6ۦ\X^i.;Kbo*1aft5S `bl6't#iZ2% Ģ *H*{Eo$%/;I4:^(HS<%4՞E۲OB Pc'zq;+}D欻HXY6L4 au#˽Ҧ'ER/45yރVD! ._ T "A_?9u+B^ո8%0 F],[fڋ }ߖS=&d.^:;6VeMc``1 uXЬEP^Ƃ9.f5ss~M_@`طK?Duu0ޖcN[ť3sy9/׺=Xߐ_WPP'hiY}Bec?E0woÐj-v?4^f9Í7e/'4'v'ܣs7T?+vJ y.6q-)2bVNg?Eo{Sg|@ζ n~څ<8ي҈!{@ #DY@qz,&CDw2Ev0~ E4[ǻ`3;FT[ҝM.ޫg; q2Q~fN:e~2cՑH)rz=Ozh ^3F ٳ;¼>d@ v)SIyg|J_ ?~\M+CmuQ\Fq'eP,F`_e\ϱ<rhB݅lE{|tt'NwZSӾebd;WNE89=i>o,حU#[r +ݝs3aEީfLʶ O|7rr|ߞZ~ao;)B`}kbs[Q3̖Td|ts`Lʊ)K[tr"7hU%bZgKԔu0&cw I綴g%*q t670n<1Ц9zW/Tu: pg }~$0 LM3J7=J(fsk">%2Xk40=,MFzf4E0 b͞O |b$%&cp4ǡ‡ƔҜ&k}5qȪ멮'tF$EU.g..fso䞌?tӖq8gٜ}\xgV`FoYgZwd v6`z@NPoEWD=YCD 6wmAx[5\ݍ%|' Pu wnMKkzMC )͟9Ra&ɣJJ]%a`C,bcFVE֊.A)% DKW Ő h&VhY!^nboIw4|Pb!>,2,U?>eJ v_h2uI"8Dv{2YvdޕIcn|qV2! u],tF, HߺP)`8HTF=@(?NhhbL2N_,MQ/IɵR~g,4UJT3 UP7ɶw!᛬13,+zԴh-'LЗ] gU_^d6)Lh^ؒ_hU+,,,7 ܦʟ Ng-PJchωfhS  Jq̉2F7 m{1ֽ}5a [. ;4`W^qh !ڙ Aaȳ$ݥf ӫ}fGX<`;[~ 0~CXA{ލDAF2;aIsf*594 }/NEH;p<::{k!90Rx=3&GOӢƻ,ީuPS $Rtj{ z8ӌJ0!rA~Ec! WAtSǧ.Jq{4ZDbxN\6l4Qo@ruLIw.#PCj<<{;zDžTE n{4x{={Sd$c{ }\SGEc<1 aWs/=Tc_z$s,nRKEujD+#K:0LF:{ #=c>/tŝC=jZ rvtU--9+ (\8 ϭ/ g" @|;PRq [q- bq~)Pv/%qA|N |K]! Ƨ54*-y_G C WփE0)ei;*ݭ_kKL\ !2t @Q\KOȂy {web;GbۀRwsZXj0Yh,=QL}[ڜH]8QAgZP6lCNT.]@AQYW ":I2^xrZ~QšQ?2s!/u\˰0 ]E7nY| Pʘ0z}PS#;oYxv_.e$b~O`xXr_mmI)Ie6IQF$y(G{|nKPUeؐI ӉZ`.Q*$XYK -_IM/GZ6'yъ7h͍=5 x#BZ.J)l黇bftB[HM ^M^)C7ʯL/lKR2jTP]&B3<-(uٺ8z]ܐ dO"VBlH6AuђMWMޟ'ϣŻ?PqV$/*ľ#Ѯ.ؚL8~%\!J 0s?oǻ7T /)YZ3ݽm=eLr7eY3OKjj7#kL/Cӯ:l>f@ԋ4pBUK0yu,@B6NSj O-ΗE(e"KM.O{/#`8* 㒷}pzxlvY `\E|⓻V ܴ,iWjF]=j%h'I5˖0V;-:"^ GT؀#e}MfDכd@qU~*i -bЎiJV3lac? OQ_OxN O'J!#6ZB_Es[[K,3 wf(f14Φ_l 'Z4{i1Qq?3yTU]w0kxˏ %i V6h㰱T K y*EȲ=+8>1L*Z7:>R%7~)NyVv{vȧsaoˬŌlܧ{ŸlNKz!o yZZ|<X&{:"cgJGLo ,7ɪ\d4E.a)YAT6m8Fk/)P<~QAum/>EEscjE;q'lDF B-==˻) *896CSz6ubɼGR'|h&iP6h1W;ƳB/t!q\[`%3%CIvoQΆL:ʢ6gx%Gqޓuĺ%*oM+99zV%&X endstream endobj 1352 0 obj << /Type /ObjStm /N 100 /First 1021 /Length 4858 /Filter /FlateDecode >> stream x\[sF~ׯn 0KUj8*)^ٮ<"qM I%C@ATUp8tO߾@B]Ha u("H#-:D*=LUh m4@{stwXCEг2 ERV * Dl_' &N*(uP̵3T|+|AB |],~Pނ -\W.MaeR1/u|G(< #tDa7 ]UX+W@,f[X 9):T|a=/_T(ɜw*2- *P αA+g㓲]`P֏R8x(R =Yx=Yr ِs »ch.iB ;--;.D=SD!IWFڂsE Ĝz 4Љ`;IBH24@v]AZpceT5x(] N`.5;,:)AK:t(P-/\ SfyBn &f}ZX 1Padǽ`6]?XTp(t5It*’_{^モ:?/ޫ~"t ߫z~Z/؋lSϔ}3e)Lg!SrȔC2)L9d!Sr̔c3)L9f1Sr̔cCxt5c٫?.^h6?SbDI |3KZѼ}z2;!pR4$}<$Y A>(OM(x QRxXV""t6<@<(h/lOI~UkO}if{1OSeZ{mK*n6NJ''[񔮴YTKL;BeV)٬ځ\Z[ZG0XNc)<[ZK0fa ZҶ:Q/OSRJ6 [M0dFxBʹ "GEqdTRlVm%Q-Qu] Rq\j1%U*!H-O YR-!yP1-W<0Q' S ϖ%N&2M5-j;|6 [o"0ެXrŲr ˡGy&[p=sO1,q"͑T9ڠm{n,95_ِفxVf#gt*4xE0Mr%m34[)Ɛ~M ƻ KW3n^Tn8iS߽ AR/zՌRk$v-?q}چfMs҈& \Y>;]3O@xޱC &m24;L;$sj4aZڻ2O+]mǺ~O/VZ vk23Nom]f>S44%eZeh͐Lm%h D]3*Q5v[⭻zLEHaowC36*+|D D_|Dg?x\޲kmw o-קub*t4SLvJʦJ%BDd:gq5.D§ P\sYn]C%<`8@=>QuƼPPu)euèDXǐXl׼oY]aWBɩIt0ʺO>W++:@cyNb-qZ-?\)66;q 4ϴm 4;YMՙѡm_]چbge,W/-G4rڬ>k gs!#K"qB|Ti~8J9|aDpE!!cօVFW"kTD%;w:7Ѧdo57]70gYגRiuCO<^|\/Nl7]ҕg/ӋGRdt(LtBJ'z.N񗓄{ObӶ \pϖtz> "/i:in!9YگU'ճe:mjT}N?I2RVlZUuGu^]TS5.i5?yu$%icyq_> :jpܩ@[ktz{7IzO:H_Sϧ%7g55NӚt9YEW=b2Z\󺮖HUCٚ.?>S'} >?[Wїjq}y9ZgfE ų>=Ư|i.eɅ Fj1F7ߒ?䷟FWW#kFe}>Z9Yy5]㓤 5 Vn ;۫$Hv:`f@ˁ WG_<{~=)0bv3N0oHþ7"K$}$Zᨋ_d9ꤱfs*$m,FӳjX^Rvjl\x3`Ahr31rfl͏_.(%۔(LB`zA@uSg>Nxz_xLrd,lvO{ С=xb;yO(\g'>9[lT 6Ȧ Ii͸t;ӓ,ji7@b0][sO[ ˟h?z͎T^``6c8٫&}u_Cdt7l޺XEVϕUR}VjFJZMh{E3]yUv'l>8xc:-ಱ߿.޿ߔ֤ >z oĩmţXZ O|9EѼxMpGקդ^,lxr<%O.P=Vٝ œǯhzW[R'pFBE41_AgW||Y XBs3.+-hύC`>)d'$}uͣPH/V Fww1r [4Jx*5 KFL*/G^MΑٶ^_~$Ow+SQU[%? endstream endobj 1463 0 obj << /Length1 2314 /Length2 14368 /Length3 0 /Length 15721 /Filter /FlateDecode >> stream xڍPapw\;{pwwn9߫fuղ+ lA L<aeen+ 9\h`fc󇁰=P&X-̬ffN&&  my"NfF5\?_TfnnNf})-%@ rT| -#3Gj:t;[aƀ@P65sGdc rַf@kF@{[p4@h?tk`f`O6V֮f&c3K @NL[eo`v^IRb 7s07908YE/7oU6ZOhVvW:kaml/0662-#PR_7o `gbbbe@CSƿ+V-~cnkc 0~#43Cpww@@O?Ff 71|{3c0ooedcm2*~QuBB6.wz= ++_'KM?Ikc? JNտ C 6o P|-&v&÷S 9ZZ[ַ2tmAoK!cT "V&- H dh o-ͬ6f4zf&{6CUoE m:v+pܙ\m@oGo<65(`8¿Q70q2~#fo`X[<-oO7z'_O7zEPV7zcS"hq\ ~7K"7[#acKbe_e4U|#`_%??)?[,o[oyYeb֛am 42+g+~vd]7 ;Gܱr+_wog{;26etј8X;Q<,~yA߽y;F5y[PC?:Vu?[ο!˛S?[T?[~ hOoe}7 @ aiƐy׶*A|gq=djz%vGt ;QOD/'uA-q OϺ1S{&Nk ?{yZ@6wJg9r`;)Wr|F|.P -%6Ș!`\`dN"E<`wd|s[+Sfq%!p:L^p/*_Dhݝs)dsǘOB/@uU`0Y 5sM"aodmz6>W8c‚;6k0;;#6f+D\LImSTޡ/C<@a;F0WjtZ! Җwe!y`X$M=FkCAR/j/JS )s5 kP֪;=qOEɨTؚdhKTc,o:^ ս/#q$ya3d`S3sS&pHC.E32d+g聯\[QuڐLrR}僪5sThd̀+žLOkn:-`G'GrOR+6&g"ؿ1'2ȻNĚj:%(]q]avbR!^1wNb -.=j>ӆ!Lu?ߔ#@PN75oJꊅ㙯950q4`䝪=^TGjuي'TWPx4JW]_#ߚإ(͔$Cs9/<F<3gA˾ȟz:D lp({H )q.L&q,k/rF}⮖.Ny-06ƍf mu=SV fpͣG WƺT`1KyS~w<́mPSn i t7Og48 u3vumZšb .&i>U[Bb1KAӚc>jPs 8اVo%3$m21hg|⯂^6a0<0y,xw˸x&!Uah!H"x!HM)+Rng_@~EV)*.3l iw,磺XMH9x|q?{Mӟ:~PwP*}uE(@JBhq}ŸzDn !C=ZN7'1.Kt~tnQ镗%onO̔GQ= zmTMd0G#,5^w ǚu8#)Kk!BۻL/MCD:WzLHPDٸΡC!p#/0+<Qo3[,%R*rԭBk?$l$!˧B.iS$ =%~/3&^ms[f |hwƒ^Plr>Px|+bb8,LI)}'\=$? vӤܞ}*:^֡.u6^C-^3 Sԇ!IS*Ym2V/[- !B[U9q)c0xl"<: 1f aGO^LD1 LZ2trm<0wmU7"sL܄Rx*Fc8r:jHV*FUO5U"@";Ü8aA)yFS,x49S>:Yׁ66&SpJ #+_v g'jgzbdUEJNPpd"eѳ*>/5j}IJ2yQ%!.,Ѣ mӏais5IҼ `bVg1,KK b`̜T{EN0 &4,Z(7'o(%fHIoL͡O]Hyf.i+~}\V#fCKvJMr&+טCTu_8sz4[>͒#XdXu%*GJFE1eyуn-9ճ ǠuB?**ɂ85:e4o 6Ӕ,bmQemY&n.jȵWѤ%iIL[]~y1=yrhDЊK؀"Ac4#e3!qD{ʠ |iqϽTlH|d З,y|/N|W 9xy S3xZۅ ˋmʎTz/^y>0;1#'Tr6qp(?Z  Zq8DWr@NDqEZIStG=*zt5'afb\ky7*ii>zyS9@sZ$@7TDjiBa XU7iv"x0!.;aE@B+Kl*e 2a܂X6C"AbV49syo^u(pi$*#Wv w2/}`FYutڼ\yPh4/ZO`--xfyPHDtx31R:=ІcA( yb?eN"#fL=@׫Q&N fe6J]S+U/9Ɇᅦ+:\{Bt@?β~Z&19'B`l:Q>ګU>vkIPMnebJ)Oڮ2%ݱ]N ( |I/Io* ?X=˴%Nn >ҍ&=9R[2:l agl`&w%-\ݨ(. d*)8賍Rk܇;Sy]ŘxJWGa_Z} 򔸞BK'#~-u&"ߏa'!5rn=R#װ zXB8+.K>}9,zol, A} LrxV1cl>Xt^LdcixPBW"Md5~#Bɐz%c*d,I nt1a<6b'V{sOCC޹{:m†h3Ӿ;gԑZJo39ݬ>m,@RcGW۞6>i|٨G&P^,f( i8N°4.ü7>(.C-s:,S&ٱV2.?w3).&3Lr&us_fcG<Ϊ[N,:OW["$|f!&(˄sA>IL䪳7 go*?\3&?աU4Dpk19 4|P̟佫ύ7ѥG_.4Xɵ"ә]8r8615@ԅ~tk?F;n/M5tU_'=WҲz?<~ R@BOX;q9f>*ҧWg#ذ/f>XM% hsCw~}4;k4M4"gyϥy%S j7~ }PjF$OP&cjhV1Zr Vb-( ?'ֆ7м29#Ga YP)U{OB^NV}gGW+9Jxɓ4FB砹U+P'0Ƅ@֙y!%AR)#w|uty+*u`vkN1[bGћ(캐v& uV8Q_붴``rlonr)Qr!ZnУg4p!!MGiΩ.h>u%lF6W) r JvNHTFR2xdYBrSع& s= ~`O$GÛj1 !rq`AQB;<;pwܚ䎩SVZcetv=p9*2?$iJ}fůF bj~&+-]kE'oq|7pH:5C_).JM?\FՖ9Я ZF+ ΅-DH[/o<4KcRMڎ=4U6'2Ubh&H^QEXScx̅Rŗh8U'u ڇ~io H\OBAלAgC{y Hc_^?/~Ư:eK>@ z뽌iQgW|f6ŧθ|;)Q+->'Xz{?\vb8WI3:qe`[ u^'SBcxs%Eg:t$'㵕Z{uTꚶІ@Xj+&P?1UDȎ_;@8MgX ])mhOdjʂkqdw_Lc6m6=_awOIX ,b3K?J*> /Mfuel7y1+` y\Ikz!kҳvMh'O }@*@|Y;3Yzjвsa"T8We$8L13`Z{bh).1cW4$:pGEI!!P85y  P{!$ʚ~'\¯ϳ'-#4Ii6O H (tΉ3P?rM%M?]0; DC xN~J; 7=dD4|ztJeY@#&2mg>X*J0;lu-J(F`^ ( -QCS- :MO6Kb"w&J4RXrwa#( пηVjd%^Q3q/_$v>q𐌛i4{B9GWbh`8w[.t5: Ɨ5 n 0sTC3j}Ebݗf险i>tiYG&F Lz19PKh)QNRhe=C[6oi fFEEJH?f;`4 3AA‰ܧ>AqYewcqZU}'٫U6|K "o U1boKaojCuB|g}_+d>cXo_pBQ[ u #]sUsfOP,NZoㄸ2W 6c;E=S#Day'uHd|UG+&tr1` +zlt@{T)M{@`\褿T>i [~zW{ot_~ve/uDASlwo(2A2tt#luPGKI][;H .>RY11jc`Z$@VU['J3/vӀB;~`$ LSst֑goZW ZƦnV1rP.0oMmú*"sk}li6+ &kիׄql!(~eZp53LX[o!Z2ox_9j`=5ŌOoC]eAZ.xW^O@jQX\fW }w{[Z(u9HͼQ}lC$IJ㓿#JEP`5'aC%E߸&l;7NY㽊b0WXg:pgJaO K*ϤB6@C6X6b/G qhon#"7dcz16Lc3y{cMN11$8; +,:^'yIh`䏽zlw(&2D\5hR-MVt)S$aE =Jy @6vJA'uA/qdqŝjEh!,򷾽w7׃8̱d> OpI;|d WW H)䶦ă9;*NzŒt EΊ)mi7("3;SZCd6whT ӣp^몓P} I~\3uAY:ٻ,\qS4qU [@ky=B_U2tbj`ݲT~3#]Y{BG-v2:(oϾz׷/'-~l?#?]A$9r;zd^e܊`J,QBu/-݄(HU2 5DE?"N}XC]Z+ jʯOaUPl=xDR^@;/U Vi}qq*[r=nB\S}KKL\3]~a PFnQnjax[+UG;tD^#KzH]__ESGP'b0^羇nr{Ӱ&U?/P:8Hfb9AWRQԂ]%o|斦t' l8hR7MGBtt&_!O),j1D TE= LC JȋoJ=*k@Ħ>vRKCrTg{"!~0!>L2h$wsJ";7"YZKCN/⠗MGHƼ:LXVێoDI>M8BhP擪2թHR `#]8|N"U$eby~ɹv`&#`w3Dg 72H,z7<1}L`~LCh=\~`^zI&iWT\au87~B_nuq9ϋ?:q^8HbleyhΘag.FWk +i+>4t@IJvMTiݴC9zme.н2dŕ}W舅 ͫXajT:kCx? X?bXW: D681p:cyСӹSӨ8井jzwE/v'Ӽplmn{5Yյs\RDhmW}]BTᯜ0fRʅ_~"47Вr,Zj~XEuXܳ} 6:WӉʧ~i"hC]%EX]WL.>nPSn;YD$ñh=*Gcu>/ZsYW& # MֺtxoAQS"[mưl5$Hm;=E~L0~wƜewڐ -j2O=uz)!X%hRWNJ 6" >fMQLnr%BA $IJzdXm$Tih: \]͕Lua6s&P(2EW:IɅ%'nl/Ð<+Yzw--ShF֛01l/l.̠oIcu۵4DFV .M/L kDgF>2þQ8x_&8i#rPG#ڿcG H5 E:E!n=qݺ^}@+a *bAmtM  ݕ= KhNH8#`ͻ[B};ŃG|}e xqw%ńAm ڻe9IkN|ov"^9p9zYRCKH@~8#n>?P'"d͟tĥi$Of=~othIsܖX0S9JoVJ$M~Z%!QS,R$: RCZ!3X B`}Ū8|\&F5P$8t=]I@s|@K .g^sY8X(٨*1ǰ^:"mZE)CpH&n\k}]P4/E9ShݲsD[쯆 ?}ɬP)ڔH?fRh\"z@˩5~exkEf^rۓh%눣r7gl!V%eJ ~o]MndT:sކT%{w;2?[2m%˭\f KC;!ȉϞ#:沂/BmRSvZ>"BNG"r＀,IΔO_D3Q~:%4\<Kz(t}\JZfn!:*fӵ5kJ.XɃ b%!癘6qcCOHӽ6nXl72"8kM{ @eYr!qNIY]!;cl*e_0ˑ;gﻞ>y*nc[>nWߐCCז@BzӽkLI)(gu]9ЎbOZ0Q Oac+Qθ׆kz.ŊA_N^Je]z4.uo8ىb\cߒbV AǯgS) v'_?'w˾" KA>)nJd2VGcm ύ !or5؟/-ZcQ{GAfD!q^jF< 3AԂ`0;͢=&&ݨ]CD?S'OSZYx_+v9Zd5)4އ6Е@qTMف';tyUcD+!A#dwgM6Sh.ց"B;"-ahR xJƙ:xPgVn>') 8Xd!děPO;=Fʴ)3UֳU4,\qFPmPT B[ g뀨}J|d"T]e La^YkPp^ҋ2Ӄ4꧜窟vl 0B=k3 7,Ri\IS4H:\w 2 t 1OG*@yz^ :VN 7}m|m"ӫ^Njw =2Vx .>U%ӲKV{?\~.\wt͏dr}S ]|2xƐXw-?FJUl[ !$\C)ۿsvldzqūsKg`'%"]B1+ϛ2%mۆyZF"Q^Yʌݶ(L_WIqO;:uw^2u90Ws]"Utv0Z^L ]D"C< 5e&Mx)53 lL=)|R+R/zՄqL w1taJOMR8qIc`TDP{oM)mM endstream endobj 1466 0 obj << /Length1 721 /Length2 7774 /Length3 0 /Length 8360 /Filter /FlateDecode >> stream xmuePX5ndp,k@g{p],8$5!|ݷU}ut>]]ui坠nn 7'H# 8ye`TC,:g7b89{lm,=- akapu焹siҁ@n6 VI]B``@u`/M z@`nYjrR9.]j PUusÆX_/2/ 'XZ!ֶP,|SZ9^[;[#>Y?lwu#"Ԝ,!0(@ vus [Wy[/,ׇ.jK[w!NP_ȥ+]Z8YB:n,.kmٞMn0[/u%-yy@n>>~kAng X`.9YڥWVNa_F\93"4?ԥġ 2>RD|Cx򾄾ڿvQ):Y[j&gZe21B~T̈́k13Qo.{ MX᩹*RD~6#MaE~+~6v"CrUJ! 57L^2tj\suNՏ$UL3r9R zc-h"h2 Xy`-nLݡ*Y<-0#B TNB67QkF5{Fk/i vyʎbxKA]Kd!^ ,qt"&.R6lIga%/3=M.`3'p"$Q .Zn>IQ30,|*݋MFv8v]h;-2 HjTMfЏU?EU_&Va;UG-8 Lcu==t*mP7oO"%\ؑCJwGNtaXgZw)[GφJĖCKę,XO=G/qX.1fs~qAL4e/lC&FN?*2^a݁)%Xs2٦J*5'joSե8?lD>%Ct%g;ss:X #ړjʅ?%hkxMRxQgKϸ c)/nt-SU&e0nEdp9q˓,{;RS$1˜4J߻4 g4,/$,r0e5J4y˝Kӳ,| dߟ|Ib,}ĖDFUSh" ,Ӗkȗj6g=JBŧ&_Go0gVU37]2uƒCՈYɜtԨE>Q.TD}Y}e&xj ЖpT o4VئLHt[ۇ+댟-.aog.Y;)Ft*`EGڔapʓtj DuW"|Nxp:&5u;AȾ>[$+jh@Q|tW9n};?bLT1oj>!59|y4'Fme"?p /r28,{cuV,H5Spf~A.L-s+& A힕׫j_:XT$mНeC(lE&ňD>44Ҳ6*?u3R}"YLZW+2Fu<~P ߴ(|Wx;U(1PWlt=> |I] N[772w&Mo*o j\qU)RF+0R cm&QI~)a wFf5Jل0_ɿa28ؾ>ރ8ؓeUּ(6p?ײ-‰$ʝF'5vucB/bֆ `_<ʫڂTJ>xʛWcM܉aC=Dtˎ&!x(U޼ىo#$:/a1릧%ps)i#H*^wMI <rzh%NjG >O-3WXkq0:]_-{x\]b|5xN6`J 2q2)Q6kg@ڿvƿtS;{'eʇ&b횶U\D.HpO,RR{ 0Hl\OMJ5,Ai0#- e5).>wq؅[j~U`LQd@\_DZ=`>:,wRmyr^Cj2-=:-DҊEqW3^(o&@N9eH^6穨/ 5|E mgJ *:2'Frm 忧-&l=oD=%e'_`F] Wdnc jpeNYV&H7 ! D7uR0 ֍ڑV*: 7W1T0ڈiAiv݉mG0:!HZjo[_1P~na }\ *{t5Ac<(q$oF--_ Hspyg8x!!bFzz|}O``,>ۇ5e~0Ju6,8#|{]8s/?B$S,Ќ|,Ano0(`]*9z:Ι{dv&!3BKߔL<\^ftD>ڠQb gn/! S8<\Zg Qgk6_%>YD|WM>a"EhY*Ϡ4Xc& 6R@ĕRC!p;\Ɖ8Su7` 6? [S+kH¬0m6{,WDT&D8kѝr =׍@`ҿ[ܟ)ʃ:tp>J8ӫ DbhM ZZ6koX&1\lU>1O92m>`n劢O4j[h߮>ظS+ NZM %7KJR!ɶgͤ?x[~kX8pMxUvZ[MMMb49fnm1e,lLFY#\mfw.ZSqpSOP%K^934,RodQiJGܾ#'+V{f%{Vж"\t rMu"Zoc )qQd}U U:ȢғmoaB|?.a]QN/=z0).^`2 .;/~5;32u wOb{Ľ-_X\%RDyQ1ַQBjKaUT ԚV 1h-(7`~N:$Uj,D,LﴌMAJ|‡C g"5P s&i.M39cvL"DS&C6aEWne\B-h/gghg̋{Zܦ7$0~dT_l 1mvk1gV3ڐM3Xhx-EwĠ3Xlx_~8݂kF>po`XuLn؝hm2+ɨHVV9 t4e&m ^%'uތz%+/i {b"~ݴtɏ{*@8G)m,R=iR&!?uu4X4Rj+dbU+'4;y(Amx=8&^O$Ms7Pj+lM^~fǔ)v4hA%M/g56 p\ڊK@gY'} ގ-ʰlxPmQb>3uy}2P{)Ql2.Tzko45k3hSb=SĔH~S7E0_TOj{/5 j]z$j@⋯^ն!b8VoF-9帥]w jE !L )R` _HympJsZ]PJW/KО 9A;f|5ȂbAMnK]C_.2dcGuǤv[ Ag-Ggl"Z44 l܍Y@Y!;,Tqrs]`m FX&5/VC 5imNvM}r35_S8Uݵu /]r*+}C[ 9)>>ۊfx= m.PiߓfgacNĵibőW#+~ŦEG[i {AռqpE ٱ(N|*tEQR83zO(鸧w/nrˁKizђ1 V[ZӒ~j[O)6Z UI rߌ-o z11եo*DFߝYi6.U$ӄ AT4-PJx0B{%=)DB[{xcWrA#Ha17%zӷ+fKhĥ8b*売'5l414?k\'e,~y.[_ZJYw9L8'qD>}iҩM>-ܛZSWtE͜util04e-%mgYe'lCG|u~W}Qm~KyQ$" DM T9u?4R4O.];%x/L2OH{l}pN«N e2`E'0oy€ @бWF w{ŹJw鍙dRQ' MfcUcn.5uD%ȈɵM_wg)/ LࣺqpJY)362wWOg41(14l$CG_~rjl9H NR.} l=7b@jگ{&gzMr&Z٨J5[ ׇZYIFDw)^Շ_U ߾;&> stream xڭYR}WJ%UMMkC SypM&3_%yZs0%B'+™2D¹U24h`K8X#8m+xì$ES#pPx"'ǎ">BZ\ϽM8%D Z$!DZ"t^'M×g0pC?i%%8sJ#>gܓ'xDY|('E LaVDs/C@t.-k/%a|qGh>QU~ĉFsvPI Ͷh,0=Cat8|$8 (-, ca0%Ar0`1 bݠ 0\!Qդo$;9 )p30C`b :*o.,֓"IW'I1;=Ԥ=SL=2 hh :? c!@^`!! gI, @9Tq >Ǘ1Prs kRCNJЭ|]MǏtPpsƧ F73'?ȟ%ٝ2ka~Sonía%|t7Z{гyuЋFIq;UsF{A7ݦ;tzH1=gtH?OWzE&w{?״Ӕ[:w> }ipW}7t<ѿ&~ZS:~p̪noUEO}zɴK6!XwRJO;:=rVBq;%Z.K]$;Lb4k'u:jbT<ɼ~v܇e7&4m[yfOzqN;ݲrѷOG?!twcT:gN:htk<}(pQ>3.gϠÝ]oXKehY$ ,ZnEۍkYl;DÃm?-D#!^n1`^uUF~^rN >Z;9?AbՒv[Tǝ#_dΒkG^~qwpzKZPKRTY)V^T’jN{is_Ԇ^,ų%o`絓ڢlӒ^{&޵Iܦ˽ oY٢eɶ7p 4==] ,=Ӫb$motY*"m}9'vrD Xo::Q|;>Y?E˒UE|,^PC̾AMfiq ȒUǣj=w_O5` %]~yhDFml+6Wvu$6le i*yY9]i!*$&f 1vppXpmY2k8Do6[R\$$کTUHt&ę0$!0e +PѬ ΄t ΈMi> r*񝦴~ʰ*$9!2^qEN"*^at"Ls+6OseAFPY8PȠ} ӈULċq&&ǤqJ;('IM^K%"C?qgTpF'T2ڛ;h=pubq97V?JD17ACNOp1`1-օsz.DAi~7~`u爍[؅}XS5L]k8 _MɣdOIJC),i[nLhɪH`,[n\aq O3uf /aARX]2a>,2,]b ,k{ ,kŒm,JX*a^,aA /2&Ò,cjVZ~q\RdgGޮw)g"IC %A0SH5+]aR ~ǰzҪ7,sss{eVҩ]ռ.yR+݋|.j^^UUydVT2ռ^,ȴHًXҔReKև%c׈Tbe!Ku.REՋչ(չHJJY'Ju.yy{Q=O罺yIE]Top+H tJ : _]%/cպz!{xD,yӱIDP B\N].(5?4+ە?4],aNX}D+;X"a>,V Ab TNjAjutV UXaIW}D+o endstream endobj 1474 0 obj << /Type /ObjStm /N 100 /First 883 /Length 1806 /Filter /FlateDecode >> stream x}˪$E2̂a@W"",b@Q||DG'7v?.V6uݔVᓷVu#h'|ƺm²iuԭ7zh E\NZ{kj [mA ~">Ep!!{CUL}*gV{ \e֝qOGAW4yс =*[k}6F" * z) u.s: "@ DE!ՙ-Q1#jNIygHL2[ƜHnƠHgeLa-3J;Z]7.hy3)e㙔khoL@sKO}j.hEBy{;Zf J Θg' 1TqDY!&.cP:n3a{zq8\n#@i}n nˉN\.1(%l\Yxy.257O\a|v8HhsPx;% Ǯ^0>A7h|}0 M!̱kO¸o_b{\_?O>/~OV0U-]hhrѕ;Wq~׿Y?}Y *Ǥ͒_I#);2Z^+iiRjui\댖,m,S< Ξк_qukزkf֖-3D3C}U!ҺjuFgf4|սyCTgsp'9/=XEѮXZU+˺*&Ejd=RyLKMsgUW&PVu>6|^Sm  2#> ^M@Ziiu-QNdZbZkѣg͢&> endobj 1475 0 obj << /Type /ObjStm /N 45 /First 416 /Length 1378 /Filter /FlateDecode >> stream xڍXMo7 W K' @"@6-` cuișdCbҔ#)i1]L"? '9bd}+/Fģw9喙B+\."WCsM cȎI<$)$V*x!VsH:bDw- {?-Ф!%D@iQN}GuTrɋj ;jM3D!9&@%R=d\*,Thu",[xR[Ke\ >"(_}{qPNqq~2}=z&yoof>J,{wxJ,V^a-`XtY`+Ê[X~ƊmKwXy[F0V%*{~9,yr hJ7OtN9I댍Dün ǸEm*g k+/ V<4 ?Vg@X@X{k2!\l%*<^|StI&2^΃ogwԇ>ZͼG:~VEܾW̦ʫJ|2w/7Wҵ{sEՉa'4QM/v?ЧSe}\m,$.恞pC07ur|)zx`͹| t?ZlMXs)"6BR"+|L`QI Nȷ @ IETਤ$tbSN HIM9®쁣2Lpt:3~Xmv=ma,1tϤܽ6u)G麴Қ lԚ8ٺ*˂V=V0}^E-k颪.ufcF+4E?4Jz-je4Fp$TdEv]VBV\ýn #806t+jTICf\JZdžS )OpL\FBtk~fPFX!Kqe #M2b%_.tCec貗˞&F+Ʒ 薽M U8<}kNoOw"3;YֿVj[k_$md{Ɍlq?=ǗȌk5ˎ-;mDήFܺ-;nlMez?*ɦl2o 菻Y\p1ۗ=>< 4J?zx?NO}ק;A endstream endobj 1504 0 obj << /Type /XRef /Index [0 1505] /Size 1505 /W [1 3 1] /Root 1502 0 R /Info 1503 0 R /ID [<2086DAC32C90CB40BFD9DC78B10C29F1> <2086DAC32C90CB40BFD9DC78B10C29F1>] /Length 3509 /Filter /FlateDecode >> stream x%ilW8$vlj8cgsر8vqvN*(TB Z UЪjR* HD+B*kGy;9Ͻ>8 §*(La5OWBRVXM@-ׁ`=mՠ,Dh5뀮@ͳk1` X ցF[nl-`3h[@ vn@A8C08q 0zAwo^0 C` ,8W, \~ip `s `\.I00Yp ́ypz`,"+pHP9{Ԃfjѝ@-Xւ v{~p p ,I(R;v]b;,vXab;,vXab;,vXab;,vXabb]WBf<.i0@e 4>z<3:;;Ippl\W@+:/ 9`/ 9w(PޡCy;w(PޡCy;w(PޡCy;w(PޡCy#Wk`; 08NU/|q eŷ)%.SV$Õ+_ HF[)*R(P֓啤ZPG$#(u.zRO4QFfR6SlԻʗPZ&m픷H`;etR.v]`M^rS u <8L9G:z)c>p* PΐNA+!prt "Ô`2iD<H.R*K$]oRͧ)HzJC5Ky>îSԻ zz ʗI7/U5(_=)ʗR/$!\%z2K$TNQD(|i)ʗS/'|%4EKH(|OQ>ER/ S/J)ʗP>E^(J$O<(JʧRcSO~ʧRSO>ڤR~IwM"=n$;v^e4PRQzsZOʧR^|*I(JyI_KBT0O|EXQ|)R~ HzR5+I@ʯ ROHyKyf5@뀔/)'|DjR^Z׻OI'HL(I;'KEnM^Yxnu ""'s#k>UR?@dt|„Ŀ4@dt|ڠe(@)(h((\$]((OXfu=O11C 딢=: z=a @(99($!\Pؙk:HB=G-P>G1Q>G8 ssOP>GQ>G9'|a(hVf}zxo,=Uy-Ы1tKwX.u,z{,_t~ςDyl)z҃g;Td~Â?ݧ|т~r?U- ^jʐV`UtfoӁ:PcVʕz¬jamf۶l?[([˯;|\m[Xm`ЂNlGnT{̦_Ս]f)-=8d<zRy>wA0`z\wN!:o3f{Nm15T1NT9 .=.h0etNaEzgRỹkfmR p\7{1i?X4eFlEekT%YE_[mlcdfOTG KU:ZGu`5Xe?6Xhd3$c3$-\}W M6  >6#2}֯[*d;d-lߪ*k0'벰G{7n'=Ӂ^PY<2DاɎZ8Qvl~ 珨C]leYaNv·k3WO? ZxY@ 26>sed~#MX y]SI ʮ W*æl§} 4˴oNdA`YNW\ ,/tva-U`'j[ 6٧Զ4dQl[f}AEvfі:y:,|AE=S.챨oXmݠˢSQyX4b.p=:(8@?Ҭ殫<N!nmh%g08΃Qؠ'Cy[ 2O}|\mS*bCjs`֢'v }Wmii[i,Xt&(edӁ[|y+^y̩ȢO%t|`㕯^<y X}E\XŬbTC[| tkզ? Xţ[jy2-XY|LZUrʪ~4mU;+Vf굋JW~Y+QfO(Y!yHi /?t tê)-X=GnZ/*-Z *-Y*we5wl5|HVϏT7JNp'ѬI>`A{`OrrMơ6q=d*k9ơ6qCe*P8Tơ2qCe*P H = filt ([0, 3], [1, 4, 2]) Transfer function 'H' from input 'u1' to output ... 3 z^-1 y1: ------------------- 1 + 4 z^-1 + 2 z^-2 Sampling time: unspecified Discrete-time model. @end group @end example @seealso{tf} @end deftypefn @section frd @findex frd @deftypefn {Function File} {@var{sys} =} frd (@var{sys}) @deftypefnx {Function File} {@var{sys} =} frd (@var{sys}, @var{w}) @deftypefnx {Function File} {@var{sys} =} frd (@var{H}, @var{w}, @dots{}) @deftypefnx {Function File} {@var{sys} =} frd (@var{H}, @var{w}, @var{tsam}, @dots{}) Create or convert to frequency response data. @strong{Inputs} @table @var @item sys @acronym{LTI} model to be converted to frequency response data. If second argument @var{w} is omitted, the interesting frequency range is calculated by the zeros and poles of @var{sys}. @item H Frequency response array (p-by-m-by-lw). H(i,j,k) contains the response from input j to output i at frequency k. In the SISO case, a vector (lw-by-1) or (1-by-lw) is accepted as well. @item w Frequency vector (lw-by-1) in radian per second [rad/s]. Frequencies must be in ascending order. @item tsam Sampling time in seconds. If @var{tsam} is not specified, a continuous-time model is assumed. @item @dots{} Optional pairs of properties and values. Type @command{set (frd)} for more information. @end table @strong{Outputs} @table @var @item sys Frequency response data object. @end table @strong{Option Keys and Values} @table @var @item 'H' Frequency response array. See 'Inputs' for details. @item 'w' Frequency vector. See 'Inputs' for details. @item 'tsam' Sampling time. See 'Inputs' for details. @item 'inname' The name of the input channels in @var{sys}. Cell vector of length m containing strings. Default names are @code{@{'u1', 'u2', ...@}} @item 'outname' The name of the output channels in @var{sys}. Cell vector of length p containing strings. Default names are @code{@{'y1', 'y2', ...@}} @item 'ingroup' Struct with input group names as field names and vectors of input indices as field values. Default is an empty struct. @item 'outgroup' Struct with output group names as field names and vectors of output indices as field values. Default is an empty struct. @item 'name' String containing the name of the model. @item 'notes' String or cell of string containing comments. @item 'userdata' Any data type. @end table @seealso{dss, ss, tf} @end deftypefn @section ss @findex ss @deftypefn {Function File} {@var{sys} =} ss (@var{sys}) @deftypefnx {Function File} {@var{sys} =} ss (@var{d}) @deftypefnx {Function File} {@var{sys} =} ss (@var{a}, @var{b}) @deftypefnx {Function File} {@var{sys} =} ss (@var{a}, @var{b}, @var{c}) @deftypefnx {Function File} {@var{sys} =} ss (@var{a}, @var{b}, @var{c}, @var{d}, @dots{}) @deftypefnx {Function File} {@var{sys} =} ss (@var{a}, @var{b}, @var{c}, @var{d}, @var{tsam}, @dots{}) Create or convert to state-space model. @strong{Inputs} @table @var @item sys @acronym{LTI} model to be converted to state-space. @item a State matrix (n-by-n). @item b Input matrix (n-by-m). @item c Output matrix (p-by-n). If @var{c} is empty @code{[]} or not specified, an identity matrix is assumed. @item d Feedthrough matrix (p-by-m). If @var{d} is empty @code{[]} or not specified, a zero matrix is assumed. @item tsam Sampling time in seconds. If @var{tsam} is not specified, a continuous-time model is assumed. @item @dots{} Optional pairs of properties and values. Type @command{set (ss)} for more information. @end table @strong{Outputs} @table @var @item sys State-space model. @end table @strong{Option Keys and Values} @table @var @item 'a', 'b', 'c', 'd', 'e' State-space matrices. See 'Inputs' for details. @item 'stname' The name of the states in @var{sys}. Cell vector containing strings for each state. Default names are @code{@{'x1', 'x2', ...@}} @item 'scaled' Logical. If set to true, no automatic scaling is used, e.g. for frequency response plots. @item 'tsam' Sampling time. See 'Inputs' for details. @item 'inname' The name of the input channels in @var{sys}. Cell vector of length m containing strings. Default names are @code{@{'u1', 'u2', ...@}} @item 'outname' The name of the output channels in @var{sys}. Cell vector of length p containing strings. Default names are @code{@{'y1', 'y2', ...@}} @item 'ingroup' Struct with input group names as field names and vectors of input indices as field values. Default is an empty struct. @item 'outgroup' Struct with output group names as field names and vectors of output indices as field values. Default is an empty struct. @item 'name' String containing the name of the model. @item 'notes' String or cell of string containing comments. @item 'userdata' Any data type. @end table @strong{Example} @example @group octave:1> a = [1 2 3; 4 5 6; 7 8 9]; octave:2> b = [10; 11; 12]; octave:3> stname = @{"V", "A", "kJ"@}; octave:4> sys = ss (a, b, [], [], "stname", stname) @end group @end example @example @group sys.a = V A kJ V 1 2 3 A 4 5 6 kJ 7 8 9 @end group @end example @example @group sys.b = u1 V 10 A 11 kJ 12 @end group @end example @example @group sys.c = V A kJ y1 1 0 0 y2 0 1 0 y3 0 0 1 @end group @end example @example @group sys.d = u1 y1 0 y2 0 y3 0 Continuous-time model. octave:5> @end group @end example @seealso{tf, dss} @end deftypefn @section tf @findex tf @deftypefn {Function File} {@var{s} =} tf (@var{'s'}) @deftypefnx {Function File} {@var{z} =} tf (@var{'z'}, @var{tsam}) @deftypefnx {Function File} {@var{sys} =} tf (@var{sys}) @deftypefnx {Function File} {@var{sys} =} tf (@var{num}, @var{den}, @dots{}) @deftypefnx {Function File} {@var{sys} =} tf (@var{num}, @var{den}, @var{tsam}, @dots{}) Create or convert to transfer function model. @strong{Inputs} @table @var @item sys @acronym{LTI} model to be converted to transfer function. @item num Numerator or cell of numerators. Each numerator must be a row vector containing the coefficients of the polynomial in descending powers of the transfer function variable. num@{i,j@} contains the numerator polynomial from input j to output i. In the SISO case, a single vector is accepted as well. @item den Denominator or cell of denominators. Each denominator must be a row vector containing the coefficients of the polynomial in descending powers of the transfer function variable. den@{i,j@} contains the denominator polynomial from input j to output i. In the SISO case, a single vector is accepted as well. @item tsam Sampling time in seconds. If @var{tsam} is not specified, a continuous-time model is assumed. @item @dots{} Optional pairs of properties and values. Type @command{set (tf)} for more information. @end table @strong{Outputs} @table @var @item sys Transfer function model. @end table @strong{Option Keys and Values} @table @var @item 'num' Numerator. See 'Inputs' for details. @item 'den' Denominator. See 'Inputs' for details. @item 'tfvar' String containing the transfer function variable. @item 'inv' Logical. True for negative powers of the transfer function variable. @item 'tsam' Sampling time. See 'Inputs' for details. @item 'inname' The name of the input channels in @var{sys}. Cell vector of length m containing strings. Default names are @code{@{'u1', 'u2', ...@}} @item 'outname' The name of the output channels in @var{sys}. Cell vector of length p containing strings. Default names are @code{@{'y1', 'y2', ...@}} @item 'ingroup' Struct with input group names as field names and vectors of input indices as field values. Default is an empty struct. @item 'outgroup' Struct with output group names as field names and vectors of output indices as field values. Default is an empty struct. @item 'name' String containing the name of the model. @item 'notes' String or cell of string containing comments. @item 'userdata' Any data type. @end table @strong{Example} @example @group octave:1> s = tf ('s'); octave:2> G = 1/(s+1) Transfer function 'G' from input 'u1' to output ... 1 y1: ----- s + 1 Continuous-time model. @end group @end example @example @group octave:3> z = tf ('z', 0.2); octave:4> H = 0.095/(z-0.9) Transfer function 'H' from input 'u1' to output ... 0.095 y1: ------- z - 0.9 Sampling time: 0.2 s Discrete-time model. @end group @end example @example @group octave:5> num = @{[1, 5, 7], [1]; [1, 7], [1, 5, 5]@}; octave:6> den = @{[1, 5, 6], [1, 2]; [1, 8, 6], [1, 3, 2]@}; octave:7> sys = tf (num, den) @end group @end example @example @group Transfer function 'sys' from input 'u1' to output ... s^2 + 5 s + 7 y1: ------------- s^2 + 5 s + 6 s + 7 y2: ------------- s^2 + 8 s + 6 @end group @end example @example @group Transfer function 'sys' from input 'u2' to output ... 1 y1: ----- s + 2 s^2 + 5 s + 5 y2: ------------- s^2 + 3 s + 2 Continuous-time model. octave:8> @end group @end example @seealso{filt, ss, dss} @end deftypefn @section zpk @findex zpk @deftypefn {Function File} {@var{s} =} zpk (@var{"s"}) @deftypefnx {Function File} {@var{z} =} zpk (@var{"z"}, @var{tsam}) @deftypefnx {Function File} {@var{sys} =} zpk (@var{sys}) @deftypefnx {Function File} {@var{sys} =} zpk (@var{k}) @deftypefnx {Function File} {@var{sys} =} zpk (@var{z}, @var{p}, @var{k}, @dots{}) @deftypefnx {Function File} {@var{sys} =} zpk (@var{z}, @var{p}, @var{k}, @var{tsam}, @dots{}) @deftypefnx {Function File} {@var{sys} =} zpk (@var{z}, @var{p}, @var{k}, @var{tsam}, @dots{}) Create transfer function model from zero-pole-gain data. This is just a stop-gap compatibility wrapper since zpk models are not yet implemented. @strong{Inputs} @table @var @item sys @acronym{LTI} model to be converted to transfer function. @item z Cell of vectors containing the zeros for each channel. z@{i,j@} contains the zeros from input j to output i. In the SISO case, a single vector is accepted as well. @item p Cell of vectors containing the poles for each channel. p@{i,j@} contains the poles from input j to output i. In the SISO case, a single vector is accepted as well. @item k Matrix containing the gains for each channel. k(i,j) contains the gain from input j to output i. @item tsam Sampling time in seconds. If @var{tsam} is not specified, a continuous-time model is assumed. @item @dots{} Optional pairs of properties and values. Type @command{set (tf)} for more information. @end table @strong{Outputs} @table @var @item sys Transfer function model. @end table @seealso{tf, ss, dss, frd} @end deftypefn @chapter Model Data Access @section @@lti/dssdata @findex dssdata @deftypefn {Function File} {[@var{a}, @var{b}, @var{c}, @var{d}, @var{e}, @var{tsam}] =} dssdata (@var{sys}) @deftypefnx {Function File} {[@var{a}, @var{b}, @var{c}, @var{d}, @var{e}, @var{tsam}] =} dssdata (@var{sys}, @var{[]}) Access descriptor state-space model data. Argument @var{sys} is not limited to descriptor state-space models. If @var{sys} is not a descriptor state-space model, it is converted automatically. @strong{Inputs} @table @var @item sys Any type of @acronym{LTI} model. @item [] In case @var{sys} is not a dss model (descriptor matrix @var{e} empty), @code{dssdata (sys, [])} returns the empty element @code{e = []} whereas @code{dssdata (sys)} returns the identity matrix @code{e = eye (size (a))}. @end table @strong{Outputs} @table @var @item a State matrix (n-by-n). @item b Input matrix (n-by-m). @item c Measurement matrix (p-by-n). @item d Feedthrough matrix (p-by-m). @item e Descriptor matrix (n-by-n). @item tsam Sampling time in seconds. If @var{sys} is a continuous-time model, a zero is returned. @end table @end deftypefn @section @@lti/filtdata @findex filtdata @deftypefn {Function File} {[@var{num}, @var{den}, @var{tsam}] =} filtdata (@var{sys}) @deftypefnx {Function File} {[@var{num}, @var{den}, @var{tsam}] =} filtdata (@var{sys}, @var{"vector"}) Access discrete-time transfer function data in DSP format. Argument @var{sys} is not limited to transfer function models. If @var{sys} is not a transfer function, it is converted automatically. @strong{Inputs} @table @var @item sys Any type of discrete-time @acronym{LTI} model. @item "v", "vector" For SISO models, return @var{num} and @var{den} directly as column vectors instead of cells containing a single column vector. @end table @strong{Outputs} @table @var @item num Cell of numerator(s). Each numerator is a row vector containing the coefficients of the polynomial in ascending powers of z^-1. num@{i,j@} contains the numerator polynomial from input j to output i. In the SISO case, a single vector is possible as well. @item den Cell of denominator(s). Each denominator is a row vector containing the coefficients of the polynomial in ascending powers of z^-1. den@{i,j@} contains the denominator polynomial from input j to output i. In the SISO case, a single vector is possible as well. @item tsam Sampling time in seconds. If @var{tsam} is not specified, -1 is returned. @end table @end deftypefn @section @@lti/frdata @findex frdata @deftypefn {Function File} {[@var{H}, @var{w}, @var{tsam}] =} frdata (@var{sys}) @deftypefnx {Function File} {[@var{H}, @var{w}, @var{tsam}] =} frdata (@var{sys}, @var{"vector"}) Access frequency response data. Argument @var{sys} is not limited to frequency response data objects. If @var{sys} is not a frd object, it is converted automatically. @strong{Inputs} @table @var @item sys Any type of @acronym{LTI} model. @item "v", "vector" In case @var{sys} is a SISO model, this option returns the frequency response as a column vector (lw-by-1) instead of an array (p-by-m-by-lw). @end table @strong{Outputs} @table @var @item H Frequency response array (p-by-m-by-lw). H(i,j,k) contains the response from input j to output i at frequency k. In the SISO case, a vector (lw-by-1) is possible as well. @item w Frequency vector (lw-by-1) in radian per second [rad/s]. Frequencies are in ascending order. @item tsam Sampling time in seconds. If @var{sys} is a continuous-time model, a zero is returned. @end table @end deftypefn @section @@lti/get @findex get @deftypefn {Function File} {} get (@var{sys}) @deftypefnx {Function File} {@var{value} =} get (@var{sys}, @var{"property"}) Access property values of @acronym{LTI} objects. @end deftypefn @section @@lti/set @findex set @deftypefn {Function File} {} set (@var{sys}) @deftypefnx {Function File} {} set (@var{sys}, @var{"property"}, @var{value}, @dots{}) @deftypefnx {Function File} {@var{retsys} =} set (@var{sys}, @var{"property"}, @var{value}, @dots{}) Set or modify properties of @acronym{LTI} objects. If no return argument @var{retsys} is specified, the modified @acronym{LTI} object is stored in input argument @var{sys}. @command{set} can handle multiple properties in one call: @code{set (sys, 'prop1', val1, 'prop2', val2, 'prop3', val3)}. @code{set (sys)} prints a list of the object's property names. @end deftypefn @section @@lti/ssdata @findex ssdata @deftypefn {Function File} {[@var{a}, @var{b}, @var{c}, @var{d}, @var{tsam}] =} ssdata (@var{sys}) Access state-space model data. Argument @var{sys} is not limited to state-space models. If @var{sys} is not a state-space model, it is converted automatically. @strong{Inputs} @table @var @item sys Any type of @acronym{LTI} model. @end table @strong{Outputs} @table @var @item a State matrix (n-by-n). @item b Input matrix (n-by-m). @item c Measurement matrix (p-by-n). @item d Feedthrough matrix (p-by-m). @item tsam Sampling time in seconds. If @var{sys} is a continuous-time model, a zero is returned. @end table @end deftypefn @section @@lti/tfdata @findex tfdata @deftypefn {Function File} {[@var{num}, @var{den}, @var{tsam}] =} tfdata (@var{sys}) @deftypefnx {Function File} {[@var{num}, @var{den}, @var{tsam}] =} tfdata (@var{sys}, @var{"vector"}) @deftypefnx {Function File} {[@var{num}, @var{den}, @var{tsam}] =} tfdata (@var{sys}, @var{"tfpoly"}) Access transfer function data. Argument @var{sys} is not limited to transfer function models. If @var{sys} is not a transfer function, it is converted automatically. @strong{Inputs} @table @var @item sys Any type of @acronym{LTI} model. @item "v", "vector" For SISO models, return @var{num} and @var{den} directly as column vectors instead of cells containing a single column vector. @end table @strong{Outputs} @table @var @item num Cell of numerator(s). Each numerator is a row vector containing the coefficients of the polynomial in descending powers of the transfer function variable. num@{i,j@} contains the numerator polynomial from input j to output i. In the SISO case, a single vector is possible as well. @item den Cell of denominator(s). Each denominator is a row vector containing the coefficients of the polynomial in descending powers of the transfer function variable. den@{i,j@} contains the denominator polynomial from input j to output i. In the SISO case, a single vector is possible as well. @item tsam Sampling time in seconds. If @var{sys} is a continuous-time model, a zero is returned. @end table @end deftypefn @section @@lti/zpkdata @findex zpkdata @deftypefn {Function File} {[@var{z}, @var{p}, @var{k}, @var{tsam}] =} zpkdata (@var{sys}) @deftypefnx {Function File} {[@var{z}, @var{p}, @var{k}, @var{tsam}] =} zpkdata (@var{sys}, @var{"v"}) Access zero-pole-gain data. @strong{Inputs} @table @var @item sys Any type of @acronym{LTI} model. @item "v", "vector" For SISO models, return @var{z} and @var{p} directly as column vectors instead of cells containing a single column vector. @end table @strong{Outputs} @table @var @item z Cell of column vectors containing the zeros for each channel. z@{i,j@} contains the zeros from input j to output i. @item p Cell of column vectors containing the poles for each channel. p@{i,j@} contains the poles from input j to output i. @item k Matrix containing the gains for each channel. k(i,j) contains the gain from input j to output i. @item tsam Sampling time in seconds. If @var{sys} is a continuous-time model, a zero is returned. @end table @end deftypefn @chapter Model Conversions @section @@lti/c2d @findex c2d @deftypefn {Function File} {@var{sys} =} c2d (@var{sys}, @var{tsam}) @deftypefnx {Function File} {@var{sys} =} c2d (@var{sys}, @var{tsam}, @var{method}) @deftypefnx {Function File} {@var{sys} =} c2d (@var{sys}, @var{tsam}, @var{'prewarp'}, @var{w0}) Convert the continuous @acronym{LTI} model into its discrete-time equivalent. @strong{Inputs} @table @var @item sys Continuous-time @acronym{LTI} model. @item tsam Sampling time in seconds. @item method Optional conversion method. If not specified, default method @var{"zoh"} is taken. @table @var @item 'zoh' Zero-order hold or matrix exponential. @item 'tustin', 'bilin' Bilinear transformation or Tustin approximation. @item 'prewarp' Bilinear transformation with pre-warping at frequency @var{w0}. @item 'matched' Matched pole/zero method. @end table @end table @strong{Outputs} @table @var @item sys Discrete-time @acronym{LTI} model. @end table @end deftypefn @section @@lti/d2c @findex d2c @deftypefn {Function File} {@var{sys} =} d2c (@var{sys}) @deftypefnx {Function File} {@var{sys} =} d2c (@var{sys}, @var{method}) @deftypefnx {Function File} {@var{sys} =} d2c (@var{sys}, @var{'prewarp'}, @var{w0}) Convert the discrete @acronym{LTI} model into its continuous-time equivalent. @strong{Inputs} @table @var @item sys Discrete-time @acronym{LTI} model. @item method Optional conversion method. If not specified, default method @var{"zoh"} is taken. @table @var @item 'zoh' Zero-order hold or matrix logarithm. @item 'tustin', 'bilin' Bilinear transformation or Tustin approximation. @item 'prewarp' Bilinear transformation with pre-warping at frequency @var{w0}. @item 'matched' Matched pole/zero method. @end table @end table @strong{Outputs} @table @var @item sys Continuous-time @acronym{LTI} model. @end table @end deftypefn @section @@lti/d2d @findex d2d @deftypefn {Function File} {@var{sys} =} d2d (@var{sys}, @var{tsam}) @deftypefnx {Function File} {@var{sys} =} d2d (@var{sys}, @var{tsam}, @var{method}) @deftypefnx {Function File} {@var{sys} =} d2d (@var{sys}, @var{tsam}, @var{'prewarp'}, @var{w0}) Resample discrete-time @acronym{LTI} model to sampling time @var{tsam}. @strong{Inputs} @table @var @item sys Discrete-time @acronym{LTI} model. @item tsam Desired sampling time in seconds. @item method Optional conversion method. If not specified, default method @var{"zoh"} is taken. @table @var @item 'zoh' Zero-order hold or matrix logarithm. @item 'tustin', 'bilin' Bilinear transformation or Tustin approximation. @item 'prewarp' Bilinear transformation with pre-warping at frequency @var{w0}. @item 'matched' Matched pole/zero method. @end table @end table @strong{Outputs} @table @var @item sys Resampled discrete-time @acronym{LTI} model with sampling time @var{tsam}. @end table @end deftypefn @section @@lti/prescale @findex prescale @deftypefn {Function File} {[@var{scaledsys}, @var{info}] =} prescale (@var{sys}) Scale state-space model. The scaled model @var{scaledsys} is equivalent to @var{sys}, but the state vector is scaled by diagonal transformation matrices in order to increase the accuracy of subsequent numerical computations. Frequency response commands perform automatic scaling unless model property @var{scaled} is set to @var{true}. @strong{Inputs} @table @var @item sys @acronym{LTI} model. @end table @strong{Outputs} @table @var @item scaledsys Scaled state-space model. @item info Structure containing additional information. @item info.SL Left scaling factors. @code{Tl = diag (info.SL)}. @item info.SR Right scaling factors. @code{Tr = diag (info.SR)}. @end table @strong{Equations} @example @group Es = Tl * E * Tr As = Tl * A * Tr Bs = Tl * B Cs = C * Tr Ds = D @end group @end example For proper state-space models, @var{Tl} and @var{Tr} are inverse of each other. @strong{Algorithm}@* Uses SLICOT TB01ID and TG01AD by courtesy of @uref{http://www.slicot.org, NICONET e.V.}. @end deftypefn @section @@lti/xperm @findex xperm @deftypefn {Function File} {@var{retsys} =} xperm (@var{sys}, @var{idx}) Reorder states in state-space models. @strong{Inputs} @table @var @item sys State-space model. @item idx Vector containing the state indices in the desired order. Alternatively, a cell vector containing the state names is possible as well. See @code{sys.stname}. State names only work if they were assigned explicitly before, i.e. @code{sys.stname} contains no empty strings. Note that if certain state indices of @var{sys} are missing or appear multiple times in @var{idx}, these states will be pruned or duplicated accordingly in the resulting state-space model @var{retsys}. @end table @strong{Outputs} @table @var @item retsys Resulting state-space model with states reordered according to @var{idx}. @end table @end deftypefn @chapter Model Interconnections @section @@lti/append @findex append @deftypefn {Function File} {@var{sys} =} append (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) Group @acronym{LTI} models by appending their inputs and outputs. @end deftypefn @section @@lti/blkdiag @findex blkdiag @deftypefn {Function File} {@var{sys} =} blkdiag (@var{sys1}, @var{sys2}) Block-diagonal concatenation of @acronym{LTI} models. @end deftypefn @section @@lti/connect @findex connect @deftypefn {Function File} {@var{sys} =} connect (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{inputs}, @var{outputs}) @deftypefnx {Function File} {@var{sys} =} connect (@var{sys}, @var{cm}, @var{inputs}, @var{outputs}) Name-based interconnections between the inputs and outputs of @acronym{LTI} models. @strong{Inputs} @table @var @item sys1, @dots{}, sysN @acronym{LTI} models to be connected. The properties 'inname' and 'outname' of each model should be set according to the desired input-output connections. @item inputs String or cell of strings containing the names of the inputs to be kept. The names must be part of the properties 'ingroup' or 'inname'. @item outputs String or cell of strings containing the names of the outputs to be kept. The names must be part of the properties 'outgroup' or 'outname'. @item cm Legacy connection matrix (not name-based). @end table @strong{Outputs} @table @var @item sys Resulting interconnected system with outputs @var{outputs} and inputs @var{inputs}. @end table @seealso{sumblk} @end deftypefn @section @@lti/feedback @findex feedback @deftypefn {Function File} {@var{sys} =} feedback (@var{sys1}) @deftypefnx {Function File} {@var{sys} =} feedback (@var{sys1}, @var{"+"}) @deftypefnx {Function File} {@var{sys} =} feedback (@var{sys1}, @var{sys2}) @deftypefnx {Function File} {@var{sys} =} feedback (@var{sys1}, @var{sys2}, @var{"+"}) @deftypefnx {Function File} {@var{sys} =} feedback (@var{sys1}, @var{sys2}, @var{feedin}, @var{feedout}) @deftypefnx {Function File} {@var{sys} =} feedback (@var{sys1}, @var{sys2}, @var{feedin}, @var{feedout}, @var{"+"}) Feedback connection of two @acronym{LTI} models. @strong{Inputs} @table @var @item sys1 @acronym{LTI} model of forward transmission. @code{[p1, m1] = size (sys1)}. @item sys2 @acronym{LTI} model of backward transmission. If not specified, an identity matrix of appropriate size is taken. @item feedin Vector containing indices of inputs to @var{sys1} which are involved in the feedback loop. The number of @var{feedin} indices and outputs of @var{sys2} must be equal. If not specified, @code{1:m1} is taken. @item feedout Vector containing indices of outputs from @var{sys1} which are to be connected to @var{sys2}. The number of @var{feedout} indices and inputs of @var{sys2} must be equal. If not specified, @code{1:p1} is taken. @item "+" Positive feedback sign. If not specified, @var{"-"} for a negative feedback interconnection is assumed. @var{+1} and @var{-1} are possible as well, but only from the third argument onward due to ambiguity. @end table @strong{Outputs} @table @var @item sys Resulting @acronym{LTI} model. @end table @strong{Block Diagram} @example @group u + +--------+ y ------>(+)----->| sys1 |-------+-------> ^ - +--------+ | | | | +--------+ | +-------| sys2 |<------+ +--------+ @end group @end example @end deftypefn @section @@lti/lft @findex lft @deftypefn {Function File} {@var{sys} =} lft (@var{sys1}, @var{sys2}) @deftypefnx {Function File} {@var{sys} =} lft (@var{sys1}, @var{sys2}, @var{nu}, @var{ny}) Linear fractional tranformation, also known as Redheffer star product. @strong{Inputs} @table @var @item sys1 Upper @acronym{LTI} model. @item sys2 Lower @acronym{LTI} model. @item nu The last nu inputs of @var{sys1} are connected with the first nu outputs of @var{sys2}. If not specified, @code{min (m1, p2)} is taken. @item ny The last ny outputs of @var{sys1} are connected with the first ny inputs of @var{sys2}. If not specified, @code{min (p1, m2)} is taken. @end table @strong{Outputs} @table @var @item sys Resulting @acronym{LTI} model. @end table @strong{Block Diagram} @example @group .............sys.............. : +--------+ : w1 ------------>| |------------> z1 : | sys1 | : : u +---->| |-----+ y : : | +--------+ | : Lower LFT : | | : : | +--------+ | : lft (sys1, sys2) : +-----| sys2 |<----+ : : +--------+ : :............................: @end group @end example @example @group .............sys.............. : +--------+ : : u +---->| sys1 |-----+ y : : | +--------+ | : Upper LFT : | | : : | +--------+ | : lft (sys1, sys2) : +-----| |<----+ : : | sys2 | : z2 <------------| |<------------ w2 : +--------+ : :............................: @end group @end example @example @group .............sys.............. : +--------+ : w1 ------------>| |------------> z1 : | sys1 | : : u +---->| |-----+ y : : | +--------+ | : : | | : lft (sys1, sys2, nu, ny) : | +--------+ | : : +-----| |<----+ : : | sys2 | : z2 <------------| |<------------ w2 : +--------+ : :............................: @end group @end example @end deftypefn @section @@lti/mconnect @findex mconnect @deftypefn {Function File} {@var{sys} =} mconnect (@var{sys}, @var{m}) @deftypefnx {Function File} {@var{sys} =} mconnect (@var{sys}, @var{m}, @var{inputs}, @var{outputs}) Arbitrary interconnections between the inputs and outputs of an @acronym{LTI} model. @strong{Inputs} @table @var @item sys @acronym{LTI} system. @item m Connection matrix. Each row belongs to an input and each column represents an output. @item inputs Vector of indices of those inputs which are retained. If not specified, all inputs are kept. @item outputs Vector of indices of those outputs which are retained. If not specified, all outputs are kept. @end table @strong{Outputs} @table @var @item sys Interconnected system. @end table @strong{Example} @example @group Solve the system equations of y(t) = G e(t) e(t) = u(t) + M y(t) in order to build y(t) = H u(t) The matrix M for a (p-by-m) system G has m rows and p columns (m-by-p). Example for a 3x2 system: u1 = -1*y1 + 5*y2 + 0*y3 u2 = pi*y1 + 0*y2 - 7*y3 | -1 5 0 | M = | pi 0 7 | @end group @end example @end deftypefn @section @@lti/parallel @findex parallel @deftypefn{Function File} {@var{sys} =} parallel (@var{sys1}, @var{sys2}) Parallel connection of two @acronym{LTI} systems. @strong{Block Diagram} @example @group .......................... : +--------+ : : +-->| sys1 |---+ : u : | +--------+ | + : y -------+ O---------> : | +--------+ | + : : +-->| sys2 |---+ : : +--------+ : :.........sys............: sys = parallel (sys1, sys2) @end group @end example @end deftypefn @section @@lti/series @findex series @deftypefn {Function File} {@var{sys} =} series (@var{sys1}, @var{sys2}) @deftypefnx {Function File} {@var{sys} =} series (@var{sys1}, @var{sys2}, @var{outputs1}, @var{inputs2}) Series connection of two @acronym{LTI} models. @strong{Block Diagram} @example @group ..................................... u : +--------+ y1 u2 +--------+ : y ------>| sys1 |---------->| sys2 |-------> : +--------+ +--------+ : :................sys................. sys = series (sys1, sys2) @end group @end example @example @group ..................................... : v2 +--------+ : : ---------->| | : y : +--------+ y1 u2 | sys2 |-------> u : | |---------->| | : ------>| sys1 | z1 +--------+ : : | |----------> : : +--------+ : :................sys................. outputs1 = [1] inputs2 = [2] sys = series (sys1, sys2, outputs1, inputs2) @end group @end example @end deftypefn @section sumblk @findex sumblk @deftypefn{Function File} {@var{S} =} sumblk (@var{formula}) @deftypefnx{Function File} {@var{S} =} sumblk (@var{formula}, @var{n}) Create summing junction @var{S} from string @var{formula} for name-based interconnections. @strong{Inputs} @table @var @item formula String containing the formula of the summing junction, e.g. @code{e = r - y + d} @item n Signal size. Default value is 1. @end table @strong{Outputs} @table @var @item S State-space model of the summing junction. @end table @strong{Example} @example @group octave:1> S = sumblk ('e = r - y + d') S.d = r y d e 1 -1 1 Static gain. octave:2> S = sumblk ('e = r - y + d', 2) S.d = r1 r2 y1 y2 d1 d2 e1 1 0 -1 0 1 0 e2 0 1 0 -1 0 1 Static gain. @end group @end example @seealso{connect} @end deftypefn @chapter Model Characteristics @section ctrb @findex ctrb @deftypefn {Function File} {@var{co} =} ctrb (@var{sys}) @deftypefnx {Function File} {@var{co} =} ctrb (@var{a}, @var{b}) Return controllability matrix. @strong{Inputs} @table @var @item sys @acronym{LTI} model. @item a State matrix (n-by-n). @item b Input matrix (n-by-m). @end table @strong{Outputs} @table @var @item co Controllability matrix. @end table @strong{Equation} @iftex @tex $$ C_o = [ B \ \ AB \ \ A^2B \ \ldots \ A^{n-1}B ] $$ @end tex @end iftex @ifnottex @example 2 n-1 Co = [ B AB A B ... A B ] @end example @end ifnottex @end deftypefn @section ctrbf @findex ctrbf @deftypefn{Function File} {[@var{sysbar}, @var{T}, @var{K}] =} ctrbf (@var{sys}) @deftypefnx{Function File} {[@var{sysbar}, @var{T}, @var{K}] =} ctrbf (@var{sys}, @var{tol}) @deftypefnx{Function File} {[@var{Abar}, @var{Bbar}, @var{Cbar}, @var{T}, @var{K}] =} ctrbf (@var{A}, @var{B}, @var{C}) @deftypefnx{Function File} {[@var{Abar}, @var{Bbar}, @var{Cbar}, @var{T}, @var{K}] =} ctrbf (@var{A}, @var{B}, @var{C}, @var{TOL}) If Co=ctrb(A,B) has rank r <= n = SIZE(A,1), then there is a similarity transformation Tc such that Tc = [t1 t2] where t1 is the controllable subspace and t2 is orthogonal to t1 @example @group Abar = Tc \ A * Tc , Bbar = Tc \ B , Cbar = C * Tc @end group @end example and the transformed system has the form @example @group | Ac A12| | Bc | Abar = |----------|, Bbar = | ---|, Cbar = [Cc | Cnc]. | 0 Anc| | 0 | @end group @end example where (Ac,Bc) is controllable, and Cc(sI-Ac)^(-1)Bc = C(sI-A)^(-1)B. and the system is stabilizable if Anc has no eigenvalues in the right half plane. The last output K is a vector of length n containing the number of controllable states. @end deftypefn @section @@lti/dcgain @findex dcgain @deftypefn {Function File} {@var{k} =} dcgain (@var{sys}) DC gain of @acronym{LTI} model. @strong{Inputs} @table @var @item sys @acronym{LTI} system. @end table @strong{Outputs} @table @var @item k DC gain matrice. For a system with m inputs and p outputs, the array @var{k} has dimensions [p, m]. @end table @seealso{freqresp} @end deftypefn @section gram @findex gram @deftypefn {Function File} {@var{W} =} gram (@var{sys}, @var{mode}) @deftypefnx {Function File} {@var{Wc} =} gram (@var{a}, @var{b}) @code{gram (@var{sys}, "c")} returns the controllability gramian of the (continuous- or discrete-time) system @var{sys}. @code{gram (@var{sys}, "o")} returns the observability gramian of the (continuous- or discrete-time) system @var{sys}. @code{gram (@var{a}, @var{b})} returns the controllability gramian @var{Wc} of the continuous-time system @math{dx/dt = a x + b u}; i.e., @var{Wc} satisfies @math{a Wc + m Wc' + b b' = 0}. @end deftypefn @section hsvd @findex hsvd @deftypefn{Function File} {@var{hsv} =} hsvd (@var{sys}) @deftypefnx{Function File} {@var{hsv} =} hsvd (@var{sys}, @var{"offset"}, @var{offset}) @deftypefnx{Function File} {@var{hsv} =} hsvd (@var{sys}, @var{"alpha"}, @var{alpha}) Hankel singular values of the stable part of an @acronym{LTI} model. If no output arguments are given, the Hankel singular values are displayed in a plot. @strong{Algorithm}@* Uses SLICOT AB13AD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @section @@lti/isct @findex isct @deftypefn {Function File} {@var{bool} =} isct (@var{sys}) Determine whether @acronym{LTI} model is a continuous-time system. @strong{Inputs} @table @var @item sys @acronym{LTI} system. @end table @strong{Outputs} @table @var @item bool = 0 @var{sys} is a discrete-time system. @item bool = 1 @var{sys} is a continuous-time system or a static gain. @end table @end deftypefn @section isctrb @findex isctrb @deftypefn {Function File} {[@var{bool}, @var{ncon}] =} isctrb (@var{sys}) @deftypefnx {Function File} {[@var{bool}, @var{ncon}] =} isctrb (@var{sys}, @var{tol}) @deftypefnx {Function File} {[@var{bool}, @var{ncon}] =} isctrb (@var{a}, @var{b}) @deftypefnx {Function File} {[@var{bool}, @var{ncon}] =} isctrb (@var{a}, @var{b}, @var{e}) @deftypefnx {Function File} {[@var{bool}, @var{ncon}] =} isctrb (@var{a}, @var{b}, @var{[]}, @var{tol}) @deftypefnx {Function File} {[@var{bool}, @var{ncon}] =} isctrb (@var{a}, @var{b}, @var{e}, @var{tol}) Logical check for system controllability. For numerical reasons, @code{isctrb (sys)} should be used instead of @code{rank (ctrb (sys))}. @strong{Inputs} @table @var @item sys @acronym{LTI} model. Descriptor state-space models are possible. If @var{sys} is not a state-space model, it is converted to a minimal state-space realization, so beware of pole-zero cancellations which may lead to wrong results! @item a State matrix (n-by-n). @item b Input matrix (n-by-m). @item e Descriptor matrix (n-by-n). If @var{e} is empty @code{[]} or not specified, an identity matrix is assumed. @item tol Optional roundoff parameter. Default value is 0. @end table @strong{Outputs} @table @var @item bool = 0 System is not controllable. @item bool = 1 System is controllable. @item ncon Number of controllable states. @end table @strong{Algorithm}@* Uses SLICOT AB01OD and TG01HD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @seealso{isobsv} @end deftypefn @section isdetectable @findex isdetectable @deftypefn {Function File} {@var{bool} =} isdetectable (@var{sys}) @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{sys}, @var{tol}) @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}) @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{e}) @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{[]}, @var{tol}) @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{e}, @var{tol}) @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{[]}, @var{[]}, @var{dflg}) @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{e}, @var{[]}, @var{dflg}) @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{[]}, @var{tol}, @var{dflg}) @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{e}, @var{tol}, @var{dflg}) Logical test for system detectability. All unstable modes must be observable or all unobservable states must be stable. @strong{Inputs} @table @var @item sys @acronym{LTI} system. @item a State transition matrix. @item c Measurement matrix. @item e Descriptor matrix. If @var{e} is empty @code{[]} or not specified, an identity matrix is assumed. @item tol Optional tolerance for stability. Default value is 0. @item dflg = 0 Matrices (@var{a}, @var{c}) are part of a continuous-time system. Default Value. @item dflg = 1 Matrices (@var{a}, @var{c}) are part of a discrete-time system. @end table @strong{Outputs} @table @var @item bool = 0 System is not detectable. @item bool = 1 System is detectable. @end table @strong{Algorithm}@* Uses SLICOT AB01OD and TG01HD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} See @command{isstabilizable} for description of computational method. @seealso{isstabilizable, isstable, isctrb, isobsv} @end deftypefn @section @@lti/isdt @findex isdt @deftypefn {Function File} {@var{bool} =} isdt (@var{sys}) Determine whether @acronym{LTI} model is a discrete-time system. @strong{Inputs} @table @var @item sys @acronym{LTI} system. @end table @strong{Outputs} @table @var @item bool = 0 @var{sys} is a continuous-time system. @item bool = 1 @var{sys} is a discrete-time system or a static gain. @end table @end deftypefn @section @@lti/isminimumphase @findex isminimumphase @deftypefn {Function File} {@var{bool} =} isminimumphase (@var{sys}) @deftypefnx {Function File} {@var{bool} =} isminimumphase (@var{sys}, @var{tol}) Determine whether @acronym{LTI} system is minimum-phase. The zeros must lie in the left complex half-plane. The name minimum-phase refers to the fact that such a system has the minimum possible phase lag for the given magnitude response |sys(jw)|. @strong{Inputs} @table @var @item sys @acronym{LTI} system. @item tol Optional tolerance. @var{tol} must be a real-valued, non-negative scalar. Default value is 0. @end table @strong{Outputs} @table @var @item bool True if the system is minimum-phase and false otherwise. @end table @example @group real (z) < -tol*(1 + abs (z)) continuous-time abs (z) < 1 - tol discrete-time @end group @end example @end deftypefn @section isobsv @findex isobsv @deftypefn {Function File} {[@var{bool}, @var{nobs}] =} isobsv (@var{sys}) @deftypefnx {Function File} {[@var{bool}, @var{nobs}] =} isobsv (@var{sys}, @var{tol}) @deftypefnx {Function File} {[@var{bool}, @var{nobs}] =} isobsv (@var{a}, @var{c}) @deftypefnx {Function File} {[@var{bool}, @var{nobs}] =} isobsv (@var{a}, @var{c}, @var{e}) @deftypefnx {Function File} {[@var{bool}, @var{nobs}] =} isobsv (@var{a}, @var{c}, @var{[]}, @var{tol}) @deftypefnx {Function File} {[@var{bool}, @var{nobs}] =} isobsv (@var{a}, @var{c}, @var{e}, @var{tol}) Logical check for system observability. For numerical reasons, @code{isobsv (sys)} should be used instead of @code{rank (obsv (sys))}. @strong{Inputs} @table @var @item sys @acronym{LTI} model. Descriptor state-space models are possible. @item a State matrix (n-by-n). @item c Measurement matrix (p-by-n). @item e Descriptor matrix (n-by-n). If @var{e} is empty @code{[]} or not specified, an identity matrix is assumed. @item tol Optional roundoff parameter. Default value is 0. @end table @strong{Outputs} @table @var @item bool = 0 System is not observable. @item bool = 1 System is observable. @item nobs Number of observable states. @end table @strong{Algorithm}@* Uses SLICOT AB01OD and TG01HD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @seealso{isctrb} @end deftypefn @section @@lti/issiso @findex issiso @deftypefn {Function File} {@var{bool} =} issiso (@var{sys}) Determine whether @acronym{LTI} model is single-input/single-output (SISO). @end deftypefn @section isstabilizable @findex isstabilizable @deftypefn {Function File} {@var{bool} =} isstabilizable (@var{sys}) @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{sys}, @var{tol}) @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}) @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{e}) @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{[]}, @var{tol}) @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{e}, @var{tol}) @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{[]}, @var{[]}, @var{dflg}) @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{e}, @var{[]}, @var{dflg}) @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{[]}, @var{tol}, @var{dflg}) @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{e}, @var{tol}, @var{dflg}) Logical check for system stabilizability. All unstable modes must be controllable or all uncontrollable states must be stable. @strong{Inputs} @table @var @item sys @acronym{LTI} system. If @var{sys} is not a state-space system, it is converted to a minimal state-space realization, so beware of pole-zero cancellations which may lead to wrong results! @item a State transition matrix. @item b Input matrix. @item e Descriptor matrix. If @var{e} is empty @code{[]} or not specified, an identity matrix is assumed. @item tol Optional tolerance for stability. Default value is 0. @item dflg = 0 Matrices (@var{a}, @var{b}) are part of a continuous-time system. Default Value. @item dflg = 1 Matrices (@var{a}, @var{b}) are part of a discrete-time system. @end table @strong{Outputs} @table @var @item bool = 0 System is not stabilizable. @item bool = 1 System is stabilizable. @end table @strong{Algorithm}@* Uses SLICOT AB01OD and TG01HD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @example @group * Calculate staircase form (SLICOT AB01OD) * Extract unobservable part of state transition matrix * Calculate eigenvalues of unobservable part * Check whether real (ev) < -tol*(1 + abs (ev)) continuous-time abs (ev) < 1 - tol discrete-time @end group @end example @seealso{isdetectable, isstable, isctrb, isobsv} @end deftypefn @section @@lti/isstable @findex isstable @deftypefn {Function File} {@var{bool} =} isstable (@var{sys}) @deftypefnx {Function File} {@var{bool} =} isstable (@var{sys}, @var{tol}) Determine whether @acronym{LTI} system is stable. @strong{Inputs} @table @var @item sys @acronym{LTI} system. @item tol Optional tolerance for stability. @var{tol} must be a real-valued, non-negative scalar. Default value is 0. @end table @strong{Outputs} @table @var @item bool True if the system is stable and false otherwise. @end table @example @group real (p) < -tol*(1 + abs (p)) continuous-time abs (p) < 1 - tol discrete-time @end group @end example @end deftypefn @section @@lti/norm @findex norm @deftypefn {Function File} {@var{gain} =} norm (@var{sys}, @var{2}) @deftypefnx {Function File} {[@var{gain}, @var{wpeak}] =} norm (@var{sys}, @var{inf}) @deftypefnx {Function File} {[@var{gain}, @var{wpeak}] =} norm (@var{sys}, @var{inf}, @var{tol}) Return H-2 or L-inf norm of @acronym{LTI} model. @strong{Algorithm}@* Uses SLICOT AB13BD and AB13DD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @section obsv @findex obsv @deftypefn {Function File} {@var{ob} =} obsv (@var{sys}) @deftypefnx {Function File} {@var{ob} =} obsv (@var{a}, @var{c}) Return observability matrix. @strong{Inputs} @table @var @item sys @acronym{LTI} model. @item a State matrix (n-by-n). @item c Measurement matrix (p-by-n). @end table @strong{Outputs} @table @var @item ob Observability matrix. @end table @strong{Equation} @iftex @tex $$ O_b = \left[ \matrix{ C \cr CA \cr CA^2 \cr \vdots \cr CA^{n-1} } \right ] $$ @end tex @end iftex @ifnottex @example @group | C | | CA | Ob = | CA^2 | | ... | | CA^(n-1) | @end group @end example @end ifnottex @end deftypefn @section obsvf @findex obsvf @deftypefn{Function File} {[@var{sysbar}, @var{T}, @var{K}] =} obsvf (@var{sys}) @deftypefnx{Function File} {[@var{sysbar}, @var{T}, @var{K}] =} obsvf (@var{sys}, @var{tol}) @deftypefnx{Function File} {[@var{Abar}, @var{Bbar}, @var{Cbar}, @var{T}, @var{K}] =} obsvf (@var{A}, @var{B}, @var{C}) @deftypefnx{Function File} {[@var{Abar}, @var{Bbar}, @var{Cbar}, @var{T}, @var{K}] =} obsvf (@var{A}, @var{B}, @var{C}, @var{TOL}) If Ob=obsv(A,C) has rank r <= n = SIZE(A,1), then there is a similarity transformation Tc such that To = [t1;t2] where t1 is c and t2 is orthogonal to t1 @example @group Abar = To \ A * To , Bbar = To \ B , Cbar = C * To @end group @end example and the transformed system has the form @example @group | Ao 0 | | Bo | Abar = |----------|, Bbar = | --- |, Cbar = [Co | 0 ]. | A21 Ano| | Bno | @end group @end example where (Ao,Bo) is observable, and Co(sI-Ao)^(-1)Bo = C(sI-A)^(-1)B. And system is detectable if Ano has no eigenvalues in the right half plane. The last output K is a vector of length n containing the number of observable states. @end deftypefn @section @@lti/pole @findex pole @deftypefn {Function File} {@var{p} =} pole (@var{sys}) Compute poles of @acronym{LTI} system. @strong{Inputs} @table @var @item sys @acronym{LTI} model. @end table @strong{Outputs} @table @var @item p Poles of @var{sys}. @end table @strong{Algorithm}@* For (descriptor) state-space models, @command{pole} relies on Octave's @command{eig}. For @acronym{SISO} transfer functions, @command{pole} uses Octave's @command{roots}. @acronym{MIMO} transfer functions are converted to a @emph{minimal} state-space representation for the computation of the poles. @end deftypefn @section pzmap @findex pzmap @deftypefn {Function File} {} pzmap (@var{sys}) @deftypefnx {Function File} {} pzmap (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) @deftypefnx {Function File} {} pzmap (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) @deftypefnx {Function File} {[@var{p}, @var{z}] =} pzmap (@var{sys}) Plot the poles and zeros of an LTI system in the complex plane. If no output arguments are given, the result is plotted on the screen. Otherwise, the poles and zeros are computed and returned. @strong{Inputs} @table @var @item sys @acronym{LTI} model. @item 'style' Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted black line. See @command{help plot} for details. @end table @strong{Outputs} @table @var @item p Poles of @var{sys}. @item z Transmission zeros of @var{sys}. @end table @end deftypefn @section @@lti/size @findex size @deftypefn {Function File} {@var{nvec} =} size (@var{sys}) @deftypefnx {Function File} {@var{n} =} size (@var{sys}, @var{dim}) @deftypefnx {Function File} {[@var{p}, @var{m}] =} size (@var{sys}) @acronym{LTI} model size, i.e. number of outputs and inputs. @strong{Inputs} @table @var @item sys @acronym{LTI} system. @item dim If given a second argument, @command{size} will return the size of the corresponding dimension. @end table @strong{Outputs} @table @var @item nvec Row vector. The first element is the number of outputs (rows) and the second element the number of inputs (columns). @item n Scalar value. The size of the dimension @var{dim}. @item p Number of outputs. @item m Number of inputs. @end table @end deftypefn @section @@lti/zero @findex zero @deftypefn {Function File} {@var{z} =} zero (@var{sys}) @deftypefnx {Function File} {@var{z} =} zero (@var{sys}, @var{type}) @deftypefnx {Function File} {[@var{z}, @var{k}, @var{info}] =} zero (@var{sys}) Compute zeros and gain of @acronym{LTI} model. By default, @command{zero} computes the invariant zeros, also known as Smith zeros. Alternatively, when called with a second input argument, @command{zero} can also compute the system zeros, transmission zeros, input decoupling zeros and output decoupling zeros. See paper [1] for an explanation of the various zero flavors as well as for further details. @strong{Inputs} @table @var @item sys @acronym{LTI} model. @item type String specifying the type of zeros: @table @var @item 'system', 's' Compute the system zeros. The system zeros include in all cases (square, non-square, degenerate or non-degenerate system) all transmission and decoupling zeros. @item 'invariant', 'inv' Compute invariant zeros. Default selection. @item 'transmission', 't' Compute transmission zeros. Transmission zeros are a subset of the invariant zeros. The transmission zeros are the zeros of the Smith-McMillan form of the transfer function matrix. @item 'input', 'inp', 'id' Compute input decoupling zeros. The input decoupling zeros are also known as the uncontrollable eigenvalues of the pair (A,B). @item 'output', 'o', 'od' Compute output decoupling zeros. The output decoupling zeros are also known as the unobservable eigenvalues of the pair (A,C). @end table @end table @strong{Outputs} @table @var @item z Depending on argument @var{type}, @var{z} contains the invariant (default), system, transmission, input decoupling or output decoupling zeros of @var{sys} as defined in [1]. @item k Gain of @acronym{SISO} system @var{sys}. For @acronym{MIMO} systems, an empty matrix @code{[]} is returned. @item info Struct containing additional information. For details, see the documentation of @acronym{SLICOT} routines @acronym{AB08ND} and @acronym{AG08BD}. @item info.rank The normal rank of the transfer function matrix (regular state-space models) or of the system pencil (descriptor state-space models). @item info.infz Contains information on the infinite elementary divisors as follows: the system has info.infz(i) infinite elementary divisors of degree i, where i=1,2,...,length(info.infz). @item info.kronr Right Kronecker (column) indices. @item info.kronl Left Kronecker (row) indices. @end table @strong{Examples} @example @group [z, k, info] = zero (sys) # invariant zeros z = zero (sys, 'system') # system zeros z = zero (sys, 'invariant') # invariant zeros z = zero (sys, 'transmission') # transmission zeros z = zero (sys, 'output') # output decoupling zeros z = zero (sys, 'input') # input decoupling zeros @end group @end example @strong{Algorithm}@* For (descriptor) state-space models, @command{zero} relies on SLICOT AB08ND and AG08BD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} For @acronym{SISO} transfer functions, @command{zero} uses Octave's @command{roots}. @acronym{MIMO} transfer functions are converted to a @emph{minimal} state-space representation for the computation of the zeros. @strong{References}@* [1] MacFarlane, A. and Karcanias, N. @cite{Poles and zeros of linear multivariable systems: a survey of the algebraic, geometric and complex-variable theory}. Int. J. Control, vol. 24, pp. 33-74, 1976.@* [2] Rosenbrock, H.H. @cite{Correction to 'The zeros of a system'}. Int. J. Control, vol. 20, no. 3, pp. 525-527, 1974.@* [3] Svaricek, F. @cite{Computation of the structural invariants of linear multivariable systems with an extended version of the program ZEROS}. Systems & Control Letters, vol. 6, pp. 261-266, 1985.@* [4] Emami-Naeini, A. and Van Dooren, P. @cite{Computation of zeros of linear multivariable systems}. Automatica, vol. 26, pp. 415-430, 1982.@* @end deftypefn @chapter Model Simplification @section @@lti/minreal @findex minreal @deftypefn {Function File} {@var{sys} =} minreal (@var{sys}) @deftypefnx {Function File} {@var{sys} =} minreal (@var{sys}, @var{tol}) Minimal realization or zero-pole cancellation of @acronym{LTI} models. @end deftypefn @section @@lti/sminreal @findex sminreal @deftypefn {Function File} {@var{sys} =} sminreal (@var{sys}) @deftypefnx {Function File} {@var{sys} =} sminreal (@var{sys}, @var{tol}) Perform state-space model reduction based on structure. Remove states which have no influence on the input-output behaviour. The physical meaning of the states is retained. @strong{Inputs} @table @var @item sys State-space model. @item tol Optional tolerance for controllability and observability. Entries of the state-space matrices whose moduli are less or equal to @var{tol} are assumed to be zero. Default value is 0. @end table @strong{Outputs} @table @var @item sys Reduced state-space model. @end table @seealso{minreal} @end deftypefn @chapter Time Domain Analysis @section covar @findex covar @deftypefn{Function File} {[@var{p}, @var{q}] =} covar (@var{sys}, @var{w}) Return the steady-state covariance. @strong{Inputs} @table @var @item sys @acronym{LTI} model. @item w Intensity of Gaussian white noise inputs which drive @var{sys}. @end table @strong{Outputs} @table @var @item p Output covariance. @item q State covariance. @end table @seealso{lyap, dlyap} @end deftypefn @section gensig @findex gensig @deftypefn{Function File} {[@var{u}, @var{t}] =} gensig (@var{sigtype}, @var{tau}) @deftypefnx{Function File} {[@var{u}, @var{t}] =} gensig (@var{sigtype}, @var{tau}, @var{tfinal}) @deftypefnx{Function File} {[@var{u}, @var{t}] =} gensig (@var{sigtype}, @var{tau}, @var{tfinal}, @var{tsam}) Generate periodic signal. Useful in combination with lsim. @strong{Inputs} @table @var @item sigtype = "sin" Sine wave. @item sigtype = "cos" Cosine wave. @item sigtype = "square" Square wave. @item sigtype = "pulse" Periodic pulse. @item tau Duration of one period in seconds. @item tfinal Optional duration of the signal in seconds. Default duration is 5 periods. @item tsam Optional sampling time in seconds. Default spacing is tau/64. @end table @strong{Outputs} @table @var @item u Vector of signal values. @item t Time vector of the signal. @end table @seealso{lsim} @end deftypefn @section impulse @findex impulse @deftypefn{Function File} {} impulse (@var{sys}) @deftypefnx{Function File} {} impulse (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) @deftypefnx{Function File} {} impulse (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) @deftypefnx{Function File} {} impulse (@var{sys1}, @dots{}, @var{t}) @deftypefnx{Function File} {} impulse (@var{sys1}, @dots{}, @var{tfinal}) @deftypefnx{Function File} {} impulse (@var{sys1}, @dots{}, @var{tfinal}, @var{dt}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} impulse (@var{sys}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} impulse (@var{sys}, @var{t}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} impulse (@var{sys}, @var{tfinal}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} impulse (@var{sys}, @var{tfinal}, @var{dt}) Impulse response of @acronym{LTI} system. If no output arguments are given, the response is printed on the screen. @strong{Inputs} @table @var @item sys @acronym{LTI} model. @item t Time vector. Should be evenly spaced. If not specified, it is calculated by the poles of the system to reflect adequately the response transients. @item tfinal Optional simulation horizon. If not specified, it is calculated by the poles of the system to reflect adequately the response transients. @item dt Optional sampling time. Be sure to choose it small enough to capture transient phenomena. If not specified, it is calculated by the poles of the system. @item 'style' Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted black line. See @command{help plot} for details. @end table @strong{Outputs} @table @var @item y Output response array. Has as many rows as time samples (length of t) and as many columns as outputs. @item t Time row vector. @item x State trajectories array. Has @code{length (t)} rows and as many columns as states. @end table @seealso{initial, lsim, step} @end deftypefn @section initial @findex initial @deftypefn{Function File} {} initial (@var{sys}, @var{x0}) @deftypefnx{Function File} {} initial (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{x0}) @deftypefnx{Function File} {} initial (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}, @var{x0}) @deftypefnx{Function File} {} initial (@var{sys1}, @dots{}, @var{x0}, @var{t}) @deftypefnx{Function File} {} initial (@var{sys1}, @dots{}, @var{x0}, @var{tfinal}) @deftypefnx{Function File} {} initial (@var{sys1}, @dots{}, @var{x0}, @var{tfinal}, @var{dt}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} initial (@var{sys}, @var{x0}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} initial (@var{sys}, @var{x0}, @var{t}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} initial (@var{sys}, @var{x0}, @var{tfinal}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} initial (@var{sys}, @var{x0}, @var{tfinal}, @var{dt}) Initial condition response of state-space model. If no output arguments are given, the response is printed on the screen. @strong{Inputs} @table @var @item sys State-space model. @item x0 Vector of initial conditions for each state. @item t Optional time vector. Should be evenly spaced. If not specified, it is calculated by the poles of the system to reflect adequately the response transients. @item tfinal Optional simulation horizon. If not specified, it is calculated by the poles of the system to reflect adequately the response transients. @item dt Optional sampling time. Be sure to choose it small enough to capture transient phenomena. If not specified, it is calculated by the poles of the system. @item 'style' Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted black line. See @command{help plot} for details. @end table @strong{Outputs} @table @var @item y Output response array. Has as many rows as time samples (length of t) and as many columns as outputs. @item t Time row vector. @item x State trajectories array. Has @code{length (t)} rows and as many columns as states. @end table @strong{Example} @example @group . Continuous Time: x = A x , y = C x , x(0) = x0 Discrete Time: x[k+1] = A x[k] , y[k] = C x[k] , x[0] = x0 @end group @end example @seealso{impulse, lsim, step} @end deftypefn @section lsim @findex lsim @deftypefn{Function File} {} lsim (@var{sys}, @var{u}) @deftypefnx{Function File} {} lsim (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{u}) @deftypefnx{Function File} {} lsim (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}, @var{u}) @deftypefnx{Function File} {} lsim (@var{sys1}, @dots{}, @var{u}, @var{t}) @deftypefnx{Function File} {} lsim (@var{sys1}, @dots{}, @var{u}, @var{t}, @var{x0}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} lsim (@var{sys}, @var{u}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} lsim (@var{sys}, @var{u}, @var{t}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} lsim (@var{sys}, @var{u}, @var{t}, @var{x0}) Simulate @acronym{LTI} model response to arbitrary inputs. If no output arguments are given, the system response is plotted on the screen. @strong{Inputs} @table @var @item sys @acronym{LTI} model. System must be proper, i.e. it must not have more zeros than poles. @item u Vector or array of input signal. Needs @code{length(t)} rows and as many columns as there are inputs. If @var{sys} is a single-input system, row vectors @var{u} of length @code{length(t)} are accepted as well. @item t Time vector. Should be evenly spaced. If @var{sys} is a continuous-time system and @var{t} is a real scalar, @var{sys} is discretized with sampling time @code{tsam = t/(rows(u)-1)}. If @var{sys} is a discrete-time system and @var{t} is not specified, vector @var{t} is assumed to be @code{0 : tsam : tsam*(rows(u)-1)}. @item x0 Vector of initial conditions for each state. If not specified, a zero vector is assumed. @item 'style' Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted black line. See @command{help plot} for details. @end table @strong{Outputs} @table @var @item y Output response array. Has as many rows as time samples (length of t) and as many columns as outputs. @item t Time row vector. It is always evenly spaced. @item x State trajectories array. Has @code{length (t)} rows and as many columns as states. @end table @seealso{impulse, initial, step} @end deftypefn @section ramp @findex ramp @deftypefn{Function File} {} ramp (@var{sys}) @deftypefnx{Function File} {} ramp (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) @deftypefnx{Function File} {} ramp (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) @deftypefnx{Function File} {} ramp (@var{sys1}, @dots{}, @var{t}) @deftypefnx{Function File} {} ramp (@var{sys1}, @dots{}, @var{tfinal}) @deftypefnx{Function File} {} ramp (@var{sys1}, @dots{}, @var{tfinal}, @var{dt}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} ramp (@var{sys}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} ramp (@var{sys}, @var{t}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} ramp (@var{sys}, @var{tfinal}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} ramp (@var{sys}, @var{tfinal}, @var{dt}) Ramp response of @acronym{LTI} system. If no output arguments are given, the response is printed on the screen. @iftex @tex $$ r(t) = t \, \cdot \, h(t) $$ @end tex @end iftex @ifnottex @example r(t) = t * h(t) @end example @end ifnottex @strong{Inputs} @table @var @item sys @acronym{LTI} model. @item t Time vector. Should be evenly spaced. If not specified, it is calculated by the poles of the system to reflect adequately the response transients. @item tfinal Optional simulation horizon. If not specified, it is calculated by the poles of the system to reflect adequately the response transients. @item dt Optional sampling time. Be sure to choose it small enough to capture transient phenomena. If not specified, it is calculated by the poles of the system. @item 'style' Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted black line. See @command{help plot} for details. @end table @strong{Outputs} @table @var @item y Output response array. Has as many rows as time samples (length of t) and as many columns as outputs. @item t Time row vector. @item x State trajectories array. Has @code{length (t)} rows and as many columns as states. @end table @seealso{impulse, initial, lsim, step} @end deftypefn @section step @findex step @deftypefn{Function File} {} step (@var{sys}) @deftypefnx{Function File} {} step (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) @deftypefnx{Function File} {} step (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) @deftypefnx{Function File} {} step (@var{sys1}, @dots{}, @var{t}) @deftypefnx{Function File} {} step (@var{sys1}, @dots{}, @var{tfinal}) @deftypefnx{Function File} {} step (@var{sys1}, @dots{}, @var{tfinal}, @var{dt}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} step (@var{sys}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} step (@var{sys}, @var{t}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} step (@var{sys}, @var{tfinal}) @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} step (@var{sys}, @var{tfinal}, @var{dt}) Step response of @acronym{LTI} system. If no output arguments are given, the response is printed on the screen. @strong{Inputs} @table @var @item sys @acronym{LTI} model. @item t Time vector. Should be evenly spaced. If not specified, it is calculated by the poles of the system to reflect adequately the response transients. @item tfinal Optional simulation horizon. If not specified, it is calculated by the poles of the system to reflect adequately the response transients. @item dt Optional sampling time. Be sure to choose it small enough to capture transient phenomena. If not specified, it is calculated by the poles of the system. @item 'style' Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted black line. See @command{help plot} for details. @end table @strong{Outputs} @table @var @item y Output response array. Has as many rows as time samples (length of t) and as many columns as outputs. @item t Time row vector. @item x State trajectories array. Has @code{length (t)} rows and as many columns as states. @end table @seealso{impulse, initial, lsim} @end deftypefn @chapter Frequency Domain Analysis @section bode @findex bode @deftypefn {Function File} {} bode (@var{sys}) @deftypefnx {Function File} {} bode (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) @deftypefnx {Function File} {} bode (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{w}) @deftypefnx {Function File} {} bode (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) @deftypefnx {Function File} {[@var{mag}, @var{pha}, @var{w}] =} bode (@var{sys}) @deftypefnx {Function File} {[@var{mag}, @var{pha}, @var{w}] =} bode (@var{sys}, @var{w}) Bode diagram of frequency response. If no output arguments are given, the response is printed on the screen. @strong{Inputs} @table @var @item sys @acronym{LTI} system. Must be a single-input and single-output (SISO) system. @item w Optional vector of frequency values. If @var{w} is not specified, it is calculated by the zeros and poles of the system. Alternatively, the cell @code{@{wmin, wmax@}} specifies a frequency range, where @var{wmin} and @var{wmax} denote minimum and maximum frequencies in rad/s. @item 'style' Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted black line. See @command{help plot} for details. @end table @strong{Outputs} @table @var @item mag Vector of magnitude. Has length of frequency vector @var{w}. @item pha Vector of phase. Has length of frequency vector @var{w}. @item w Vector of frequency values used. @end table @seealso{nichols, nyquist, sigma} @end deftypefn @section bodemag @findex bodemag @deftypefn {Function File} {} bodemag (@var{sys}) @deftypefnx {Function File} {} bodemag (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) @deftypefnx {Function File} {} bodemag (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{w}) @deftypefnx {Function File} {} bodemag (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) @deftypefnx {Function File} {[@var{mag}, @var{w}] =} bodemag (@var{sys}) @deftypefnx {Function File} {[@var{mag}, @var{w}] =} bodemag (@var{sys}, @var{w}) Bode magnitude diagram of frequency response. If no output arguments are given, the response is printed on the screen. @strong{Inputs} @table @var @item sys @acronym{LTI} system. Must be a single-input and single-output (SISO) system. @item w Optional vector of frequency values. If @var{w} is not specified, it is calculated by the zeros and poles of the system. Alternatively, the cell @code{@{wmin, wmax@}} specifies a frequency range, where @var{wmin} and @var{wmax} denote minimum and maximum frequencies in rad/s. @item 'style' Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted black line. See @command{help plot} for details. @end table @strong{Outputs} @table @var @item mag Vector of magnitude. Has length of frequency vector @var{w}. @item w Vector of frequency values used. @end table @seealso{bode, nichols, nyquist, sigma} @end deftypefn @section @@lti/freqresp @findex freqresp @deftypefn{Function File} {@var{H} =} freqresp (@var{sys}, @var{w}) Evaluate frequency response at given frequencies. @strong{Inputs} @table @var @item sys @acronym{LTI} system. @item w Vector of frequency values. @end table @strong{Outputs} @table @var @item H Array of frequency response. For a system with m inputs and p outputs, the array @var{H} has dimensions [p, m, length (w)]. The frequency response at the frequency w(k) is given by H(:,:,k). @end table @seealso{dcgain} @end deftypefn @section margin @findex margin @deftypefn{Function File} {[@var{gamma}, @var{phi}, @var{w_gamma}, @var{w_phi}] =} margin (@var{sys}) @deftypefnx{Function File} {[@var{gamma}, @var{phi}, @var{w_gamma}, @var{w_phi}] =} margin (@var{sys}, @var{tol}) Gain and phase margin of a system. If no output arguments are given, both gain and phase margin are plotted on a bode diagram. Otherwise, the margins and their corresponding frequencies are computed and returned. A more robust criterion to assess the stability of a feedback system is the sensitivity Ms computed by command @command{sensitivity}. @strong{Inputs} @table @var @item sys @acronym{LTI} model. Must be a single-input and single-output (SISO) system. @item tol Imaginary parts below @var{tol} are assumed to be zero. If not specified, default value @code{sqrt (eps)} is taken. @end table @strong{Outputs} @table @var @item gamma Gain margin (as gain, not dBs). @item phi Phase margin (in degrees). @item w_gamma Frequency for the gain margin (in rad/s). @item w_phi Frequency for the phase margin (in rad/s). @end table @strong{Algorithm}@* Uses command @command{roots} to calculate the frequencies @var{w_gamma}, @var{w_phi} from special polynomials created from the transfer function of @var{sys} as listed below in section @guillemetleft{}Equations@guillemetright{}. @strong{Equations} @example @group CONTINUOUS-TIME SYSTEMS Gain Margin _ _ L(jw) = L(jw) BTW: L(jw) = L(-jw) = conj (L(jw)) num(jw) num(-jw) ------- = -------- den(jw) den(-jw) num(jw) den(-jw) = num(-jw) den(jw) imag (num(jw) den(-jw)) = 0 imag (num(-jw) den(jw)) = 0 @end group @end example @example @group Phase Margin |num(jw)| |L(jw)| = |-------| = 1 |den(jw)| _ 2 2 z z = Re z + Im z num(jw) num(-jw) ------- * -------- = 1 den(jw) den(-jw) num(jw) num(-jw) - den(jw) den(-jw) = 0 real (num(jw) num(-jw) - den(jw) den(-jw)) = 0 @end group @end example @example @group DISCRETE-TIME SYSTEMS Gain Margin jwT log z L(z) = L(1/z) BTW: z = e --> w = ----- j T num(z) num(1/z) ------ = -------- den(z) den(1/z) num(z) den(1/z) - num(1/z) den(z) = 0 @end group @end example @example @group Phase Margin |num(z)| |L(z)| = |------| = 1 |den(z)| @end group @end example @example @group L(z) L(1/z) = 1 num(z) num(1/z) ------ * -------- = 1 den(z) den(1/z) num(z) num(1/z) - den(z) den(1/z) = 0 @end group @end example @example @group PS: How to get L(1/z) 4 3 2 p(z) = a z + b z + c z + d z + e -4 -3 -2 -1 p(1/z) = a z + b z + c z + d z + e -4 2 3 4 = z ( a + b z + c z + d z + e z ) 4 3 2 4 = ( e z + d z + c z + b z + a ) / ( z ) @end group @end example @seealso{sensitivity, roots} @end deftypefn @section nichols @findex nichols @deftypefn {Function File} {} nichols (@var{sys}) @deftypefnx {Function File} {} nichols (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) @deftypefnx {Function File} {} nichols (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{w}) @deftypefnx {Function File} {} nichols (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) @deftypefnx {Function File} {[@var{mag}, @var{pha}, @var{w}] =} nichols (@var{sys}) @deftypefnx {Function File} {[@var{mag}, @var{pha}, @var{w}] =} nichols (@var{sys}, @var{w}) Nichols chart of frequency response. If no output arguments are given, the response is printed on the screen. @strong{Inputs} @table @var @item sys @acronym{LTI} system. Must be a single-input and single-output (SISO) system. @item w Optional vector of frequency values. If @var{w} is not specified, it is calculated by the zeros and poles of the system. Alternatively, the cell @code{@{wmin, wmax@}} specifies a frequency range, where @var{wmin} and @var{wmax} denote minimum and maximum frequencies in rad/s. @item 'style' Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted black line. See @command{help plot} for details. @end table @strong{Outputs} @table @var @item mag Vector of magnitude. Has length of frequency vector @var{w}. @item pha Vector of phase. Has length of frequency vector @var{w}. @item w Vector of frequency values used. @end table @seealso{bode, nyquist, sigma} @end deftypefn @section nyquist @findex nyquist @deftypefn {Function File} {} nyquist (@var{sys}) @deftypefnx {Function File} {} nyquist (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) @deftypefnx {Function File} {} nyquist (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{w}) @deftypefnx {Function File} {} nyquist (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) @deftypefnx {Function File} {[@var{re}, @var{im}, @var{w}] =} nyquist (@var{sys}) @deftypefnx {Function File} {[@var{re}, @var{im}, @var{w}] =} nyquist (@var{sys}, @var{w}) Nyquist diagram of frequency response. If no output arguments are given, the response is printed on the screen. @strong{Inputs} @table @var @item sys @acronym{LTI} system. Must be a single-input and single-output (SISO) system. @item w Optional vector of frequency values. If @var{w} is not specified, it is calculated by the zeros and poles of the system. Alternatively, the cell @code{@{wmin, wmax@}} specifies a frequency range, where @var{wmin} and @var{wmax} denote minimum and maximum frequencies in rad/s. @item 'style' Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted black line. See @command{help plot} for details. @end table @strong{Outputs} @table @var @item re Vector of real parts. Has length of frequency vector @var{w}. @item im Vector of imaginary parts. Has length of frequency vector @var{w}. @item w Vector of frequency values used. @end table @seealso{bode, nichols, sigma} @end deftypefn @section sensitivity @findex sensitivity @deftypefn{Function File} {[@var{Ms}, @var{ws}] =} sensitivity (@var{L}) @deftypefnx{Function File} {[@var{Ms}, @var{ws}] =} sensitivity (@var{P}, @var{C}) @deftypefnx{Function File} {[@var{Ms}, @var{ws}] =} sensitivity (@var{P}, @var{C1}, @var{C2}, @dots{}) Return sensitivity margin @var{Ms}. The quantity @var{Ms} is simply the inverse of the shortest distance from the Nyquist curve to the critical point -1. Reasonable values of @var{Ms} are in the range from 1.3 to 2. @iftex @tex $$ M_s = ||S(j\omega)||_{\infty} $$ @end tex @end iftex @ifnottex @example Ms = ||S(jw)|| inf @end example @end ifnottex If no output arguments are given, the critical distance 1/Ms is plotted on a Nyquist diagram. In contrast to gain and phase margin as computed by command @command{margin}, the sensitivity @var{Ms} is a more robust criterion to assess the stability of a feedback system. @strong{Inputs} @table @var @item L Open loop transfer function. @var{L} can be any type of @acronym{LTI} system, but it must be square. @item P Plant model. Any type of @acronym{LTI} system. @item C Controller model. Any type of @acronym{LTI} system. @item C1, C2, @dots{} If several controllers are specified, command @command{sensitivity} computes the sensitivity @var{Ms} for each of them in combination with plant @var{P}. @end table @strong{Outputs} @table @var @item Ms Sensitivity margin @var{Ms} as defined in [1]. Scalar value. If several controllers are specified, @var{Ms} becomes a row vector with as many entries as controllers. @item ws The frequency [rad/s] corresponding to the sensitivity peak. Scalar value. If several controllers are specified, @var{ws} becomes a row vector with as many entries as controllers. @end table @strong{Algorithm}@* Uses SLICOT AB13DD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} to calculate the infinity norm of the sensitivity function. @strong{References}@* [1] Astr@"om, K. and H@"agglund, T. (1995) PID Controllers: Theory, Design and Tuning, Second Edition. Instrument Society of America. @end deftypefn @section sigma @findex sigma @deftypefn {Function File} {} sigma (@var{sys}) @deftypefnx {Function File} {} sigma (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) @deftypefnx {Function File} {} sigma (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{w}) @deftypefnx {Function File} {} sigma (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) @deftypefnx{Function File} {[@var{sv}, @var{w}] =} sigma (@var{sys}) @deftypefnx{Function File} {[@var{sv}, @var{w}] =} sigma (@var{sys}, @var{w}) Singular values of frequency response. If no output arguments are given, the singular value plot is printed on the screen. @strong{Inputs} @table @var @item sys @acronym{LTI} system. Multiple inputs and/or outputs (MIMO systems) make practical sense. @item w Optional vector of frequency values. If @var{w} is not specified, it is calculated by the zeros and poles of the system. Alternatively, the cell @code{@{wmin, wmax@}} specifies a frequency range, where @var{wmin} and @var{wmax} denote minimum and maximum frequencies in rad/s. @item 'style' Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted black line. See @command{help plot} for details. @end table @strong{Outputs} @table @var @item sv Array of singular values. For a system with m inputs and p outputs, the array sv has @code{min (m, p)} rows and as many columns as frequency points @code{length (w)}. The singular values at the frequency @code{w(k)} are given by @code{sv(:,k)}. @item w Vector of frequency values used. @end table @seealso{bodemag, svd} @end deftypefn @chapter Pole Placement @section place @findex place @deftypefn {Function File} {@var{f} =} place (@var{sys}, @var{p}) @deftypefnx {Function File} {@var{f} =} place (@var{a}, @var{b}, @var{p}) @deftypefnx {Function File} {[@var{f}, @var{info}] =} place (@var{sys}, @var{p}, @var{alpha}) @deftypefnx {Function File} {[@var{f}, @var{info}] =} place (@var{a}, @var{b}, @var{p}, @var{alpha}) Pole assignment for a given matrix pair (@var{A},@var{B}) such that @code{p = eig (A-B*F)}. If parameter @var{alpha} is specified, poles with real parts (continuous-time) or moduli (discrete-time) below @var{alpha} are left untouched. @strong{Inputs} @table @var @item sys Continuous- or discrete-time @acronym{LTI} system. @item a State matrix (n-by-n) of a continuous-time system. @item b Input matrix (n-by-m) of a continuous-time system. @item p Desired eigenvalues of the closed-loop system state-matrix @var{A-B*F}. @code{length (p) <= rows (A)}. @item alpha Specifies the maximum admissible value, either for real parts or for moduli, of the eigenvalues of @var{A} which will not be modified by the eigenvalue assignment algorithm. @code{alpha >= 0} for discrete-time systems. @end table @strong{Outputs} @table @var @item f State feedback gain matrix. @item info Structure containing additional information. @item info.nfp The number of fixed poles, i.e. eigenvalues of @var{A} having real parts less than @var{alpha}, or moduli less than @var{alpha}. These eigenvalues are not modified by @command{place}. @item info.nap The number of assigned eigenvalues. @code{nap = n-nfp-nup}. @item info.nup The number of uncontrollable eigenvalues detected by the eigenvalue assignment algorithm. @item info.z The orthogonal matrix @var{z} reduces the closed-loop system state matrix @code{A + B*F} to upper real Schur form. Note the positive sign in @code{A + B*F}. @end table @strong{Note} @example Place is also suitable to design estimator gains: @group L = place (A.', C.', p).' L = place (sys.', p).' # useful for discrete-time systems @end group @end example @strong{Algorithm}@* Uses SLICOT SB01BD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @section rlocus @findex rlocus @deftypefn {Function File} {} rlocus (@var{sys}) @deftypefnx {Function File} {[@var{rldata}, @var{k}] =} rlocus (@var{sys}, @var{increment}, @var{min_k}, @var{max_k}) Display root locus plot of the specified @acronym{SISO} system. @strong{Inputs} @table @var @item sys @acronym{LTI} model. Must be a single-input and single-output (SISO) system. @item increment The increment used in computing gain values. @item min_k Minimum value of @var{k}. @item max_k Maximum value of @var{k}. @end table @strong{Outputs} @table @var @item rldata Data points plotted: in column 1 real values, in column 2 the imaginary values. @item k Gains for real axis break points. @end table @strong{Block Diagram} @example @group u + +---+ +------+ y ------>(+)----->| k |----->| SISO |-------+-------> ^ - +---+ +------+ | | | +---------------------------------+ @end group @end example @end deftypefn @chapter Optimal Control @section dlqe @findex dlqe @deftypefn {Function File} {[@var{m}, @var{p}, @var{z}, @var{e}] =} dlqe (@var{a}, @var{g}, @var{c}, @var{q}, @var{r}) @deftypefnx {Function File} {[@var{m}, @var{p}, @var{z}, @var{e}] =} dlqe (@var{a}, @var{g}, @var{c}, @var{q}, @var{r}, @var{s}) @deftypefnx {Function File} {[@var{m}, @var{p}, @var{z}, @var{e}] =} dlqe (@var{a}, @var{[]}, @var{c}, @var{q}, @var{r}) @deftypefnx {Function File} {[@var{m}, @var{p}, @var{z}, @var{e}] =} dlqe (@var{a}, @var{[]}, @var{c}, @var{q}, @var{r}, @var{s}) Kalman filter for discrete-time systems. @example @group x[k] = Ax[k] + Bu[k] + Gw[k] (State equation) y[k] = Cx[k] + Du[k] + v[k] (Measurement Equation) E(w) = 0, E(v) = 0, cov(w) = Q, cov(v) = R, cov(w,v) = S @end group @end example @strong{Inputs} @table @var @item a State transition matrix of discrete-time system (n-by-n). @item g Process noise matrix of discrete-time system (n-by-g). If @var{g} is empty @code{[]}, an identity matrix is assumed. @item c Measurement matrix of discrete-time system (p-by-n). @item q Process noise covariance matrix (g-by-g). @item r Measurement noise covariance matrix (p-by-p). @item s Optional cross term covariance matrix (g-by-p), s = cov(w,v). If @var{s} is empty @code{[]} or not specified, a zero matrix is assumed. @end table @strong{Outputs} @table @var @item m Kalman filter gain matrix (n-by-p). @item p Unique stabilizing solution of the discrete-time Riccati equation (n-by-n). Symmetric matrix. @item z Error covariance (n-by-n), cov(x(k|k)-x) @item e Closed-loop poles (n-by-1). @end table @strong{Equations} @example @group x[k|k] = x[k|k-1] + M(y[k] - Cx[k|k-1] - Du[k]) x[k+1|k] = Ax[k|k] + Bu[k] for S=0 x[k+1|k] = Ax[k|k] + Bu[k] + G*S*(C*P*C' + R)^-1*(y[k] - C*x[k|k-1]) for non-zero S E = eig(A - A*M*C) for S=0 E = eig(A - A*M*C - G*S*(C*P*C' + Rv)^-1*C) for non-zero S @end group @end example @seealso{dare, care, dlqr, lqr, lqe} @end deftypefn @section dlqr @findex dlqr @deftypefn {Function File} {[@var{g}, @var{x}, @var{l}] =} dlqr (@var{sys}, @var{q}, @var{r}) @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} dlqr (@var{sys}, @var{q}, @var{r}, @var{s}) @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} dlqr (@var{a}, @var{b}, @var{q}, @var{r}) @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} dlqr (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}) @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} dlqr (@var{a}, @var{b}, @var{q}, @var{r}, @var{[]}, @var{e}) @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} dlqr (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}, @var{e}) Linear-quadratic regulator for discrete-time systems. @strong{Inputs} @table @var @item sys Continuous or discrete-time @acronym{LTI} model (p-by-m, n states). @item a State transition matrix of discrete-time system (n-by-n). @item b Input matrix of discrete-time system (n-by-m). @item q State weighting matrix (n-by-n). @item r Input weighting matrix (m-by-m). @item s Optional cross term matrix (n-by-m). If @var{s} is not specified, a zero matrix is assumed. @item e Optional descriptor matrix (n-by-n). If @var{e} is not specified, an identity matrix is assumed. @end table @strong{Outputs} @table @var @item g State feedback matrix (m-by-n). @item x Unique stabilizing solution of the discrete-time Riccati equation (n-by-n). @item l Closed-loop poles (n-by-1). @end table @strong{Equations} @example @group x[k+1] = A x[k] + B u[k], x[0] = x0 inf J(x0) = SUM (x' Q x + u' R u + 2 x' S u) k=0 L = eig (A - B*G) @end group @end example @seealso{dare, care, lqr} @end deftypefn @section estim @findex estim @deftypefn {Function File} {@var{est} =} estim (@var{sys}, @var{l}) @deftypefnx {Function File} {@var{est} =} estim (@var{sys}, @var{l}, @var{sensors}, @var{known}) Return state estimator for a given estimator gain. @strong{Inputs} @table @var @item sys @acronym{LTI} model. @item l State feedback matrix. @item sensors Indices of measured output signals y from @var{sys}. If omitted, all outputs are measured. @item known Indices of known input signals u (deterministic) to @var{sys}. All other inputs to @var{sys} are assumed stochastic. If argument @var{known} is omitted, no inputs u are known. @end table @strong{Outputs} @table @var @item est State-space model of estimator. @end table @seealso{kalman, place} @end deftypefn @section kalman @findex kalman @deftypefn {Function File} {[@var{est}, @var{g}, @var{x}] =} kalman (@var{sys}, @var{q}, @var{r}) @deftypefnx {Function File} {[@var{est}, @var{g}, @var{x}] =} kalman (@var{sys}, @var{q}, @var{r}, @var{s}) @deftypefnx {Function File} {[@var{est}, @var{g}, @var{x}] =} kalman (@var{sys}, @var{q}, @var{r}, @var{[]}, @var{sensors}, @var{known}) @deftypefnx {Function File} {[@var{est}, @var{g}, @var{x}] =} kalman (@var{sys}, @var{q}, @var{r}, @var{s}, @var{sensors}, @var{known}) Design Kalman estimator for @acronym{LTI} systems. @strong{Inputs} @table @var @item sys Nominal plant model. @item q Covariance of white process noise. @item r Covariance of white measurement noise. @item s Optional cross term covariance. Default value is 0. @item sensors Indices of measured output signals y from @var{sys}. If omitted, all outputs are measured. @item known Indices of known input signals u (deterministic) to @var{sys}. All other inputs to @var{sys} are assumed stochastic. If argument @var{known} is omitted, no inputs u are known. @end table @strong{Outputs} @table @var @item est State-space model of the Kalman estimator. @item g Estimator gain. @item x Solution of the Riccati equation. @end table @strong{Block Diagram} @example @group u +-------+ ^ +---------------------------->| |-------> y | +-------+ + y | est | ^ u ----+--->| |----->(+)------>| |-------> x | sys | ^ + +-------+ w -------->| | | +-------+ | v Q = cov (w, w') R = cov (v, v') S = cov (w, v') @end group @end example @seealso{care, dare, estim, lqr} @end deftypefn @section lqe @findex lqe @deftypefn {Function File} {[@var{l}, @var{p}, @var{e}] =} lqe (@var{sys}, @var{q}, @var{r}) @deftypefnx {Function File} {[@var{l}, @var{p}, @var{e}] =} lqe (@var{sys}, @var{q}, @var{r}, @var{s}) @deftypefnx {Function File} {[@var{l}, @var{p}, @var{e}] =} lqe (@var{a}, @var{g}, @var{c}, @var{q}, @var{r}) @deftypefnx {Function File} {[@var{l}, @var{p}, @var{e}] =} lqe (@var{a}, @var{g}, @var{c}, @var{q}, @var{r}, @var{s}) @deftypefnx {Function File} {[@var{l}, @var{p}, @var{e}] =} lqe (@var{a}, @var{[]}, @var{c}, @var{q}, @var{r}) @deftypefnx {Function File} {[@var{l}, @var{p}, @var{e}] =} lqe (@var{a}, @var{[]}, @var{c}, @var{q}, @var{r}, @var{s}) Kalman filter for continuous-time systems. @example @group . x = Ax + Bu + Gw (State equation) y = Cx + Du + v (Measurement Equation) E(w) = 0, E(v) = 0, cov(w) = Q, cov(v) = R, cov(w,v) = S @end group @end example @strong{Inputs} @table @var @item sys Continuous or discrete-time @acronym{LTI} model (p-by-m, n states). @item a State matrix of continuous-time system (n-by-n). @item g Process noise matrix of continuous-time system (n-by-g). If @var{g} is empty @code{[]}, an identity matrix is assumed. @item c Measurement matrix of continuous-time system (p-by-n). @item q Process noise covariance matrix (g-by-g). @item r Measurement noise covariance matrix (p-by-p). @item s Optional cross term covariance matrix (g-by-p), s = cov(w,v). If @var{s} is empty @code{[]} or not specified, a zero matrix is assumed. @end table @strong{Outputs} @table @var @item l Kalman filter gain matrix (n-by-p). @item p Unique stabilizing solution of the continuous-time Riccati equation (n-by-n). Symmetric matrix. If @var{sys} is a discrete-time model, the solution of the corresponding discrete-time Riccati equation is returned. @item e Closed-loop poles (n-by-1). @end table @strong{Equations} @example @group . x = Ax + Bu + L(y - Cx -Du) E = eig(A - L*C) @end group @end example @seealso{dare, care, dlqr, lqr, dlqe} @end deftypefn @section lqr @findex lqr @deftypefn {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{sys}, @var{q}, @var{r}) @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{sys}, @var{q}, @var{r}, @var{s}) @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{a}, @var{b}, @var{q}, @var{r}) @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}) @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{a}, @var{b}, @var{q}, @var{r}, @var{[]}, @var{e}) @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}, @var{e}) Linear-quadratic regulator. @strong{Inputs} @table @var @item sys Continuous or discrete-time @acronym{LTI} model (p-by-m, n states). @item a State matrix of continuous-time system (n-by-n). @item b Input matrix of continuous-time system (n-by-m). @item q State weighting matrix (n-by-n). @item r Input weighting matrix (m-by-m). @item s Optional cross term matrix (n-by-m). If @var{s} is not specified, a zero matrix is assumed. @item e Optional descriptor matrix (n-by-n). If @var{e} is not specified, an identity matrix is assumed. @end table @strong{Outputs} @table @var @item g State feedback matrix (m-by-n). @item x Unique stabilizing solution of the continuous-time Riccati equation (n-by-n). @item l Closed-loop poles (n-by-1). @end table @strong{Equations} @example @group . x = A x + B u, x(0) = x0 inf J(x0) = INT (x' Q x + u' R u + 2 x' S u) dt 0 L = eig (A - B*G) @end group @end example @seealso{care, dare, dlqr} @end deftypefn @chapter Robust Control @section augw @findex augw @deftypefn{Function File} {@var{P} =} augw (@var{G}, @var{W1}, @var{W2}, @var{W3}) Extend plant for stacked S/KS/T problem. Subsequently, the robust control problem can be solved by h2syn or hinfsyn. @strong{Inputs} @table @var @item G @acronym{LTI} model of plant. @item W1 @acronym{LTI} model of performance weight. Bounds the largest singular values of sensitivity @var{S}. Model must be empty @code{[]}, SISO or of appropriate size. @item W2 @acronym{LTI} model to penalize large control inputs. Bounds the largest singular values of @var{KS}. Model must be empty @code{[]}, SISO or of appropriate size. @item W3 @acronym{LTI} model of robustness and noise sensitivity weight. Bounds the largest singular values of complementary sensitivity @var{T}. Model must be empty @code{[]}, SISO or of appropriate size. @end table All inputs must be proper/realizable. Scalars, vectors and matrices are possible instead of @acronym{LTI} models. @strong{Outputs} @table @var @item P State-space model of augmented plant. @end table @strong{Block Diagram} @example @group | W1 | -W1*G | z1 = W1 r - W1 G u | 0 | W2 | z2 = W2 u P = | 0 | W3*G | z3 = W3 G u |----+-------| | I | -G | e = r - G u @end group @end example @example @group +------+ z1 +---------------------------------------->| W1 |-----> | +------+ | +------+ z2 | +---------------------->| W2 |-----> | | +------+ r + e | +--------+ u | +--------+ y +------+ z3 ----->(+)---+-->| K(s) |----+-->| G(s) |----+---->| W3 |-----> ^ - +--------+ +--------+ | +------+ | | +----------------------------------------+ @end group @end example @example @group +--------+ | |-----> z1 (p1x1) z1 = W1 e r (px1) ----->| P(s) |-----> z2 (p2x1) z2 = W2 u | |-----> z3 (p3x1) z3 = W3 y u (mx1) ----->| |-----> e (px1) e = r - y +--------+ @end group @end example @example @group +--------+ r ----->| |-----> z | P(s) | u +---->| |-----+ e | +--------+ | | | | +--------+ | +-----| K(s) |<----+ +--------+ @end group @end example @strong{References}@* [1] Skogestad, S. and Postlethwaite I. (2005) @cite{Multivariable Feedback Control: Analysis and Design: Second Edition}. Wiley. @seealso{h2syn, hinfsyn, mixsyn} @end deftypefn @section fitfrd @findex fitfrd @deftypefn{Function File} {[@var{sys}, @var{n}] =} fitfrd (@var{dat}, @var{n}) @deftypefnx{Function File} {[@var{sys}, @var{n}] =} fitfrd (@var{dat}, @var{n}, @var{flag}) Fit frequency response data with a state-space system. If requested, the returned system is stable and minimum-phase. @strong{Inputs} @table @var @item dat @acronym{LTI} model containing frequency response data of a SISO system. @item n The desired order of the system to be fitted. @code{n <= length(dat.w)}. @item flag The flag controls whether the returned system is stable and minimum-phase. @table @var @item 0 The system zeros and poles are not constrained. Default value. @item 1 The system zeros and poles will have negative real parts in the continuous-time case, or moduli less than 1 in the discrete-time case. @end table @end table @strong{Outputs} @table @var @item sys State-space model of order @var{n}, fitted to frequency response data @var{dat}. @item n The order of the obtained system. The value of @var{n} could only be modified if inputs @code{n > 0} and @code{flag = 1}. @end table @strong{Algorithm}@* Uses SLICOT SB10YD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @section h2syn @findex h2syn @deftypefn{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} h2syn (@var{P}, @var{nmeas}, @var{ncon}) @deftypefnx{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} h2syn (@var{P}) H-2 control synthesis for @acronym{LTI} plant. @strong{Inputs} @table @var @item P Generalized plant. Must be a proper/realizable @acronym{LTI} model. If @var{P} is constructed with @command{mktito} or @command{augw}, arguments @var{nmeas} and @var{ncon} can be omitted. @item nmeas Number of measured outputs v. The last @var{nmeas} outputs of @var{P} are connected to the inputs of controller @var{K}. The remaining outputs z (indices 1 to p-nmeas) are used to calculate the H-2 norm. @item ncon Number of controlled inputs u. The last @var{ncon} inputs of @var{P} are connected to the outputs of controller @var{K}. The remaining inputs w (indices 1 to m-ncon) are excited by a harmonic test signal. @end table @strong{Outputs} @table @var @item K State-space model of the H-2 optimal controller. @item N State-space model of the lower LFT of @var{P} and @var{K}. @item info Structure containing additional information. @item info.gamma H-2 norm of @var{N}. @item info.rcond Vector @var{rcond} contains estimates of the reciprocal condition numbers of the matrices which are to be inverted and estimates of the reciprocal condition numbers of the Riccati equations which have to be solved during the computation of the controller @var{K}. For details, see the description of the corresponding SLICOT routine. @end table @strong{Block Diagram} @example @group gamma = min||N(K)|| N = lft (P, K) K 2 +--------+ w ----->| |-----> z | P(s) | u +---->| |-----+ v | +--------+ | | | | +--------+ | +-----| K(s) |<----+ +--------+ +--------+ w ----->| N(s) |-----> z +--------+ @end group @end example @strong{Algorithm}@* Uses SLICOT SB10HD and SB10ED by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @seealso{augw, lqr, dlqr, kalman} @end deftypefn @section hinfsyn @findex hinfsyn @deftypefn{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} hinfsyn (@var{P}, @var{nmeas}, @var{ncon}) @deftypefnx{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} hinfsyn (@var{P}, @var{nmeas}, @var{ncon}, @dots{}) @deftypefnx{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} hinfsyn (@var{P}, @var{nmeas}, @var{ncon}, @var{opt}, @dots{}) @deftypefnx{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} hinfsyn (@var{P}, @dots{}) @deftypefnx{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} hinfsyn (@var{P}, @var{opt}, @dots{}) H-infinity control synthesis for @acronym{LTI} plant. @strong{Inputs} @table @var @item P Generalized plant. Must be a proper/realizable @acronym{LTI} model. If @var{P} is constructed with @command{mktito} or @command{augw}, arguments @var{nmeas} and @var{ncon} can be omitted. @item nmeas Number of measured outputs v. The last @var{nmeas} outputs of @var{P} are connected to the inputs of controller @var{K}. The remaining outputs z (indices 1 to p-nmeas) are used to calculate the H-infinity norm. @item ncon Number of controlled inputs u. The last @var{ncon} inputs of @var{P} are connected to the outputs of controller @var{K}. The remaining inputs w (indices 1 to m-ncon) are excited by a harmonic test signal. @item @dots{} Optional pairs of keys and values. @code{'key1', value1, 'key2', value2}. @item opt Optional struct with keys as field names. Struct @var{opt} can be created directly or by function @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. @end table @strong{Outputs} @table @var @item K State-space model of the H-infinity (sub-)optimal controller. @item N State-space model of the lower LFT of @var{P} and @var{K}. @item info Structure containing additional information. @item info.gamma L-infinity norm of @var{N}. @item info.rcond Vector @var{rcond} contains estimates of the reciprocal condition numbers of the matrices which are to be inverted and estimates of the reciprocal condition numbers of the Riccati equations which have to be solved during the computation of the controller @var{K}. For details, see the description of the corresponding SLICOT routine. @end table @strong{Option Keys and Values} @table @var @item 'method' String specifying the desired kind of controller: @table @var @item 'optimal', 'opt', 'o' Compute optimal controller using gamma iteration. Default selection for compatibility reasons. @item 'suboptimal', 'sub', 's' Compute (sub-)optimal controller. For stability reasons, suboptimal controllers are to be preferred over optimal ones. @end table @item 'gmax' The maximum value of the H-infinity norm of @var{N}. It is assumed that @var{gmax} is sufficiently large so that the controller is admissible. Default value is 1e15. @item 'gmin' Initial lower bound for gamma iteration. Default value is 0. @var{gmin} is only meaningful for optimal discrete-time controllers. @item 'tolgam' Tolerance used for controlling the accuracy of @var{gamma} and its distance to the estimated minimal possible value of @var{gamma}. Default value is 0.01. If @var{tolgam} = 0, then a default value equal to @code{sqrt(eps)} is used, where @var{eps} is the relative machine precision. For suboptimal controllers, @var{tolgam} is ignored. @item 'actol' Upper bound for the poles of the closed-loop system @var{N} used for determining if it is stable. @var{actol} >= 0 for stable systems. For suboptimal controllers, @var{actol} is ignored. @end table @strong{Block Diagram} @example @group gamma = min||N(K)|| N = lft (P, K) K inf +--------+ w ----->| |-----> z | P(s) | u +---->| |-----+ v | +--------+ | | | | +--------+ | +-----| K(s) |<----+ +--------+ +--------+ w ----->| N(s) |-----> z +--------+ @end group @end example @strong{Algorithm}@* Uses SLICOT SB10FD, SB10DD and SB10AD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @seealso{augw, mixsyn} @end deftypefn @section mixsyn @findex mixsyn @deftypefn{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} mixsyn (@var{G}, @var{W1}, @var{W2}, @var{W3}, @dots{}) Solve stacked S/KS/T H-infinity problem. Mixed-sensitivity is the name given to transfer function shaping problems in which the sensitivity function @iftex @tex $ S = (I + G K)^{-1} $ @end tex @end iftex @ifnottex @example -1 S = (I + G K) @end example @end ifnottex is shaped along with one or more other closed-loop transfer functions such as @var{K S} or the complementary sensitivity function @iftex @tex $ T = I - S = (I + G K)^{-1} G K $ @end tex @end iftex @ifnottex @example -1 T = I - S = (I + G K) @end example @end ifnottex in a typical one degree-of-freedom configuration, where @var{G} denotes the plant and @var{K} the (sub-)optimal controller to be found. The shaping of multivariable transfer functions is based on the idea that a satisfactory definition of gain (range of gain) for a matrix transfer function is given by the singular values @iftex @tex $\sigma$ @end tex @end iftex @ifnottex @end ifnottex of the transfer function. Hence the classical loop-shaping ideas of feedback design can be generalized to multivariable systems. In addition to the requirement that @var{K} stabilizes @var{G}, the closed-loop objectives are as follows [1]: @enumerate @item For @emph{disturbance rejection} make @iftex @tex $\overline{\sigma}(S)$ @end tex @end iftex @ifnottex @end ifnottex small. @item For @emph{noise attenuation} make @iftex @tex $\overline{\sigma}(T)$ @end tex @end iftex @ifnottex @end ifnottex small. @item For @emph{reference tracking} make @iftex @tex $\overline{\sigma}(T) \approx \underline{\sigma}(T) \approx 1$. @end tex @end iftex @ifnottex @end ifnottex @item For @emph{input usage (control energy) reduction} make @iftex @tex $\overline{\sigma}(K S)$ @end tex @end iftex @ifnottex @end ifnottex small. @item For @emph{robust stability} in the presence of an additive perturbation @iftex @tex $G_p = G + \Delta$, @end tex @end iftex @ifnottex @end ifnottex make @iftex @tex $\overline{\sigma}(K S)$ @end tex @end iftex @ifnottex @end ifnottex small. @item For @emph{robust stability} in the presence of a multiplicative output perturbation @iftex @tex $G_p = (I + \Delta) G$, @end tex @end iftex @ifnottex @end ifnottex make @iftex @tex $\overline{\sigma}(T)$ @end tex @end iftex @ifnottex @end ifnottex small. @end enumerate In order to find a robust controller for the so-called stacked @iftex @tex $S/KS/T \ H_{\infty}$ @end tex @end iftex @ifnottex S/KS/T H-infinity @end ifnottex problem, the user function @command{mixsyn} minimizes the following criterion @iftex @tex $$ \underset{K}{\min} || N(K) ||_{\infty}, \quad N = | W_1 S; \ W_2 K S; \ W_3 T |$$ @end tex @end iftex @ifnottex @example | W1 S | min || N(K) || N = | W2 K S | K oo | W3 T | @end example @end ifnottex @code{[K, N] = mixsyn (G, W1, W2, W3)}. The user-defined weighting functions @var{W1}, @var{W2} and @var{W3} bound the largest singular values of the closed-loop transfer functions @var{S} (for performance), @var{K S} (to penalize large inputs) and @var{T} (for robustness and to avoid sensitivity to noise), respectively [1]. A few points are to be considered when choosing the weights. The weigths @var{Wi} must all be proper and stable. Therefore if one wishes, for example, to minimize @var{S} at low frequencies by a weighting @var{W1} including integral action, @iftex @tex ${1 \over s}$ @end tex @end iftex @ifnottex @example 1 - s @end example @end ifnottex needs to be approximated by @iftex @tex ${1 \over s + \epsilon}$, where $\epsilon \ll 1$. @end tex @end iftex @ifnottex @example 1 ----- where e << 1. s + e @end example @end ifnottex Similarly one might be interested in weighting @var{K S} with a non-proper weight @var{W2} to ensure that @var{K} is small outside the system bandwidth. The trick here is to replace a non-proper term such as @iftex @tex $ 1 + \tau_1 s $ by $ {1 + \tau_1 s \over 1 + \tau_2 s} $, where @end tex @end iftex @ifnottex @example 1 + T1 s 1 + T1 s by --------, where T2 << T1. 1 + T2 s @end example @end ifnottex @iftex @tex $\tau_2 \ll \tau_1$ @end tex @end iftex [1, 2]. @strong{Inputs} @table @var @item G @acronym{LTI} model of plant. @item W1 @acronym{LTI} model of performance weight. Bounds the largest singular values of sensitivity @var{S}. Model must be empty @code{[]}, SISO or of appropriate size. @item W2 @acronym{LTI} model to penalize large control inputs. Bounds the largest singular values of @var{KS}. Model must be empty @code{[]}, SISO or of appropriate size. @item W3 @acronym{LTI} model of robustness and noise sensitivity weight. Bounds the largest singular values of complementary sensitivity @var{T}. Model must be empty @code{[]}, SISO or of appropriate size. @item @dots{} Optional arguments of @command{hinfsyn}. Type @command{help hinfsyn} for more information. @end table All inputs must be proper/realizable. Scalars, vectors and matrices are possible instead of @acronym{LTI} models. @strong{Outputs} @table @var @item K State-space model of the H-infinity (sub-)optimal controller. @item N State-space model of the lower LFT of @var{P} and @var{K}. @item info Structure containing additional information. @item info.gamma L-infinity norm of @var{N}. @item info.rcond Vector @var{rcond} contains estimates of the reciprocal condition numbers of the matrices which are to be inverted and estimates of the reciprocal condition numbers of the Riccati equations which have to be solved during the computation of the controller @var{K}. For details, see the description of the corresponding SLICOT routine. @end table @strong{Block Diagram} @example @group | W1 S | gamma = min||N(K)|| N = | W2 K S | = lft (P, K) K inf | W3 T | @end group @end example @example @group +------+ z1 +---------------------------------------->| W1 |-----> | +------+ | +------+ z2 | +---------------------->| W2 |-----> | | +------+ r + e | +--------+ u | +--------+ y +------+ z3 ----->(+)---+-->| K(s) |----+-->| G(s) |----+---->| W3 |-----> ^ - +--------+ +--------+ | +------+ | | +----------------------------------------+ @end group @end example @example @group +--------+ | |-----> z1 (p1x1) z1 = W1 e r (px1) ----->| P(s) |-----> z2 (p2x1) z2 = W2 u | |-----> z3 (p3x1) z3 = W3 y u (mx1) ----->| |-----> e (px1) e = r - y +--------+ @end group @end example @example @group +--------+ r ----->| |-----> z | P(s) | u +---->| |-----+ e | +--------+ | | | | +--------+ | +-----| K(s) |<----+ +--------+ @end group @end example @example @group +--------+ r ----->| N(s) |-----> z +--------+ @end group @end example @example @group Extended Plant: P = augw (G, W1, W2, W3) Controller: K = mixsyn (G, W1, W2, W3) Entire System: N = lft (P, K) Open Loop: L = G * K Closed Loop: T = feedback (L) @end group @end example @strong{Algorithm}@* Relies on functions @command{augw} and @command{hinfsyn}, which use SLICOT SB10FD, SB10DD and SB10AD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @strong{References}@* [1] Skogestad, S. and Postlethwaite I. (2005) @cite{Multivariable Feedback Control: Analysis and Design: Second Edition}. Wiley, Chichester, England.@* [2] Meinsma, G. (1995) @cite{Unstable and nonproper weights in H-infinity control} Automatica, Vol. 31, No. 11, pp. 1655-1658 @seealso{hinfsyn, augw} @end deftypefn @section mktito @findex mktito @deftypefn{Function File} {@var{P} =} mktito (@var{P}, @var{nmeas}, @var{ncon}) Partition @acronym{LTI} plant @var{P} for robust controller synthesis. If a plant is partitioned this way, one can omit the inputs @var{nmeas} and @var{ncon} when calling the functions @command{hinfsyn} and @command{h2syn}. @strong{Inputs} @table @var @item P Generalized plant. @item nmeas Number of measured outputs v. The last @var{nmeas} outputs of @var{P} are connected to the inputs of controller @var{K}. The remaining outputs z (indices 1 to p-nmeas) are used to calculate the H-2/H-infinity norm. @item ncon Number of controlled inputs u. The last @var{ncon} inputs of @var{P} are connected to the outputs of controller @var{K}. The remaining inputs w (indices 1 to m-ncon) are excited by a harmonic test signal. @end table @strong{Outputs} @table @var @item P Partitioned plant. The input/output groups and names are overwritten with designations according to [1]. @end table @strong{Block Diagram} @example @group min||N(K)|| N = lft (P, K) K norm +--------+ w ----->| |-----> z | P(s) | u +---->| |-----+ v | +--------+ | | | | +--------+ | +-----| K(s) |<----+ +--------+ +--------+ w ----->| N(s) |-----> z +--------+ @end group @end example @strong{Reference}@* [1] Skogestad, S. and Postlethwaite, I. (2005) @cite{Multivariable Feedback Control: Analysis and Design: Second Edition}. Wiley, Chichester, England. @end deftypefn @section ncfsyn @findex ncfsyn @deftypefn{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} ncfsyn (@var{G}, @var{W1}, @var{W2}, @var{factor}) Loop shaping H-infinity synthesis. Compute positive feedback controller using the McFarlane/Glover loop shaping design procedure [1]. Using a precompensator @var{W1} and/or a postcompensator @var{W2}, the singular values of the nominal plant @var{G} are shaped to give a desired open-loop shape. The nominal plant @var{G} and shaping functions @var{W1}, @var{W2} are combined to form the shaped plant, @var{Gs} where @code{Gs = W2 G W1}. We assume that @var{W1} and @var{W2} are such that @var{Gs} contains no hidden modes. It is relatively easy to approximate the closed-loop requirements by the following open-loop objectives [2]: @enumerate @item For @emph{disturbance rejection} make @iftex @tex $\underline{\sigma}(W_2 G W_1)$ @end tex @end iftex @ifnottex @example @end example @end ifnottex large; valid for frequencies at which @iftex @tex $\underline{\sigma}(G_S) \gg 1$. @end tex @end iftex @ifnottex @example @end example @end ifnottex @item For @emph{noise attenuation} make @iftex @tex $\overline{\sigma}(W_2 G W_1)$ @end tex @end iftex @ifnottex @example @end example @end ifnottex small; valid for frequencies at which @iftex @tex $\overline{\sigma}(G_S) \ll 1$. @end tex @end iftex @ifnottex @example @end example @end ifnottex @item For @emph{reference tracking} make @iftex @tex $\underline{\sigma}(W_2 G W_1)$ @end tex @end iftex @ifnottex @example @end example @end ifnottex large; valid for frequencies at which @iftex @tex $\underline{\sigma}(G_S) \gg 1$. @end tex @end iftex @ifnottex @example @end example @end ifnottex @item For @emph{robust stability} to a multiplicative output perturbation @iftex @tex $G_p = (I + \Delta) G$, make @end tex @end iftex @ifnottex @example @end example @end ifnottex @iftex @tex $\overline{\sigma}(W_2 G W_1)$ @end tex @end iftex @ifnottex @example @end example @end ifnottex small; valid for frequencies at which @iftex @tex $\overline{\sigma}(G_S) \ll 1$. @end tex @end iftex @ifnottex @example . @end example @end ifnottex @end enumerate Then a stabilizing controller @var{Ks} is synthesized for shaped plant @var{Gs}. The final positive feedback controller @var{K} is then constructed by combining the @iftex @tex $H_{\infty}$ @end tex @end iftex @ifnottex @example H-infinity @end example @end ifnottex controller @var{Ks} with the shaping functions @var{W1} and @var{W2} such that @code{K = W1 Ks W2}. In [1] is stated further that the given robust stabilization objective can be interpreted as a @iftex @tex $H_{\infty}$ @end tex @end iftex @ifnottex @example H-infinity @end example @end ifnottex problem formulation of minimizing the @iftex @tex $H_{\infty}$ @end tex @end iftex @ifnottex @example H-infinity @end example @end ifnottex norm of the frequency weighted gain from disturbances on the plant input and output to the controller input and output as follows: @iftex @tex $$ \underset{K}{\min} \, || N(K) ||_{\infty}, $$ $$ N = | W_{1}^{-1}; W_2 G | \ (I - K G)^{-1} \ | W_1, \ G W_{2}^{-1} | $$ @end tex @end iftex @ifnottex @example -1 -1 -1 min || N(K) || , N = | W1 | (I - K G) | W1 G W2 | K oo | W2 G | @end example @end ifnottex @iftex @tex @end tex @end iftex @code{[K, N] = ncfsyn (G, W1, W2, f)} The function @command{ncfsyn} - the somewhat cryptic name stands for @emph{normalized coprime factorization synthesis} - allows the specification of an additional argument, factor @var{f}. Default value @code{f = 1} implies that an optimal controller is required, whereas @code{f > 1} implies that a suboptimal controller is required, achieving a performance that is @var{f} times less than optimal. @strong{Inputs} @table @var @item G @acronym{LTI} model of plant. @item W1 @acronym{LTI} model of precompensator. Model must be SISO or of appropriate size. An identity matrix is taken if @var{W1} is not specified or if an empty model @code{[]} is passed. @item W2 @acronym{LTI} model of postcompensator. Model must be SISO or of appropriate size. An identity matrix is taken if @var{W2} is not specified or if an empty model @code{[]} is passed. @item factor @code{factor = 1} implies that an optimal controller is required. @code{factor > 1} implies that a suboptimal controller is required, achieving a performance that is @var{factor} times less than optimal. Default value is 1. @end table @strong{Outputs} @table @var @item K State-space model of the H-infinity loop-shaping controller. Note that @var{K} is a @emph{positive} feedback controller. @item N State-space model of the closed loop depicted below. @item info Structure containing additional information. @item info.gamma L-infinity norm of @var{N}. @code{gamma = norm (N, inf)}. @item info.emax Nugap robustness. @code{emax = inv (gamma)}. @item info.Gs Shaped plant. @code{Gs = W2 * G * W1}. @item info.Ks Controller for shaped plant. @code{Ks = ncfsyn (Gs)}. @item info.rcond Estimates of the reciprocal condition numbers of the Riccati equations and a few other things. For details, see the description of the corresponding SLICOT routine. @end table @strong{Block Diagram of N} @example @group ^ z1 ^ z2 | | w1 + | +--------+ | +--------+ ----->(+)---+-->| Ks |----+--->(+)---->| Gs |----+ ^ + +--------+ ^ +--------+ | | w2 | | | | +-------------------------------------------------+ @end group @end example @strong{Algorithm}@* Uses SLICOT SB10ID, SB10KD and SB10ZD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @strong{References}@* [1] D. McFarlane and K. Glover, @cite{A Loop Shaping Design Procedure Using H-infinity Synthesis}, IEEE Transactions on Automatic Control, Vol. 37, No. 6, June 1992.@* [2] S. Skogestad and I. Postlethwaite, @cite{Multivariable Feedback Control: Analysis and Design: Second Edition}. Wiley, Chichester, England, 2005.@* @end deftypefn @chapter Matrix Equation Solvers @section care @findex care @deftypefn {Function File} {[@var{x}, @var{l}, @var{g}] =} care (@var{a}, @var{b}, @var{q}, @var{r}) @deftypefnx {Function File} {[@var{x}, @var{l}, @var{g}] =} care (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}) @deftypefnx {Function File} {[@var{x}, @var{l}, @var{g}] =} care (@var{a}, @var{b}, @var{q}, @var{r}, @var{[]}, @var{e}) @deftypefnx {Function File} {[@var{x}, @var{l}, @var{g}] =} care (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}, @var{e}) Solve continuous-time algebraic Riccati equation (ARE). @strong{Inputs} @table @var @item a Real matrix (n-by-n). @item b Real matrix (n-by-m). @item q Real matrix (n-by-n). @item r Real matrix (m-by-m). @item s Optional real matrix (n-by-m). If @var{s} is not specified, a zero matrix is assumed. @item e Optional descriptor matrix (n-by-n). If @var{e} is not specified, an identity matrix is assumed. @end table @strong{Outputs} @table @var @item x Unique stabilizing solution of the continuous-time Riccati equation (n-by-n). @item l Closed-loop poles (n-by-1). @item g Corresponding gain matrix (m-by-n). @end table @strong{Equations} @example @group -1 A'X + XA - XB R B'X + Q = 0 -1 A'X + XA - (XB + S) R (B'X + S') + Q = 0 -1 G = R B'X -1 G = R (B'X + S') L = eig (A - B*G) @end group @end example @example @group -1 A'XE + E'XA - E'XB R B'XE + Q = 0 -1 A'XE + E'XA - (E'XB + S) R (B'XE + S') + Q = 0 -1 G = R B'XE -1 G = R (B'XE + S) L = eig (A - B*G, E) @end group @end example @strong{Algorithm}@* Uses SLICOT SB02OD and SG02AD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @seealso{dare, lqr, dlqr, kalman} @end deftypefn @section dare @findex dare @deftypefn {Function File} {[@var{x}, @var{l}, @var{g}] =} dare (@var{a}, @var{b}, @var{q}, @var{r}) @deftypefnx {Function File} {[@var{x}, @var{l}, @var{g}] =} dare (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}) @deftypefnx {Function File} {[@var{x}, @var{l}, @var{g}] =} dare (@var{a}, @var{b}, @var{q}, @var{r}, @var{[]}, @var{e}) @deftypefnx {Function File} {[@var{x}, @var{l}, @var{g}] =} dare (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}, @var{e}) Solve discrete-time algebraic Riccati equation (ARE). @strong{Inputs} @table @var @item a Real matrix (n-by-n). @item b Real matrix (n-by-m). @item q Real matrix (n-by-n). @item r Real matrix (m-by-m). @item s Optional real matrix (n-by-m). If @var{s} is not specified, a zero matrix is assumed. @item e Optional descriptor matrix (n-by-n). If @var{e} is not specified, an identity matrix is assumed. @end table @strong{Outputs} @table @var @item x Unique stabilizing solution of the discrete-time Riccati equation (n-by-n). @item l Closed-loop poles (n-by-1). @item g Corresponding gain matrix (m-by-n). @end table @strong{Equations} @example @group -1 A'XA - X - A'XB (B'XB + R) B'XA + Q = 0 -1 A'XA - X - (A'XB + S) (B'XB + R) (B'XA + S') + Q = 0 -1 G = (B'XB + R) B'XA -1 G = (B'XB + R) (B'XA + S') L = eig (A - B*G) @end group @end example @example @group -1 A'XA - E'XE - A'XB (B'XB + R) B'XA + Q = 0 -1 A'XA - E'XE - (A'XB + S) (B'XB + R) (B'XA + S') + Q = 0 -1 G = (B'XB + R) B'XA -1 G = (B'XB + R) (B'XA + S') L = eig (A - B*G, E) @end group @end example @strong{Algorithm}@* Uses SLICOT SB02OD and SG02AD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @seealso{care, lqr, dlqr, kalman} @end deftypefn @section dlyap @findex dlyap @deftypefn{Function File} {@var{x} =} dlyap (@var{a}, @var{b}) @deftypefnx{Function File} {@var{x} =} dlyap (@var{a}, @var{b}, @var{c}) @deftypefnx{Function File} {@var{x} =} dlyap (@var{a}, @var{b}, @var{[]}, @var{e}) Solve discrete-time Lyapunov or Sylvester equations. @strong{Equations} @example @group AXA' - X + B = 0 (Lyapunov Equation) AXB' - X + C = 0 (Sylvester Equation) AXA' - EXE' + B = 0 (Generalized Lyapunov Equation) @end group @end example @strong{Algorithm}@* Uses SLICOT SB03MD, SB04QD and SG03AD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @seealso{dlyapchol, lyap, lyapchol} @end deftypefn @section dlyapchol @findex dlyapchol @deftypefn{Function File} {@var{u} =} dlyapchol (@var{a}, @var{b}) @deftypefnx{Function File} {@var{u} =} dlyapchol (@var{a}, @var{b}, @var{e}) Compute Cholesky factor of discrete-time Lyapunov equations. @strong{Equations} @example @group A U' U A' - U' U + B B' = 0 (Lyapunov Equation) A U' U A' - E U' U E' + B B' = 0 (Generalized Lyapunov Equation) @end group @end example @strong{Algorithm}@* Uses SLICOT SB03OD and SG03BD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @seealso{dlyap, lyap, lyapchol} @end deftypefn @section lyap @findex lyap @deftypefn{Function File} {@var{x} =} lyap (@var{a}, @var{b}) @deftypefnx{Function File} {@var{x} =} lyap (@var{a}, @var{b}, @var{c}) @deftypefnx{Function File} {@var{x} =} lyap (@var{a}, @var{b}, @var{[]}, @var{e}) Solve continuous-time Lyapunov or Sylvester equations. @strong{Equations} @example @group AX + XA' + B = 0 (Lyapunov Equation) AX + XB + C = 0 (Sylvester Equation) AXE' + EXA' + B = 0 (Generalized Lyapunov Equation) @end group @end example @strong{Algorithm}@* Uses SLICOT SB03MD, SB04MD and SG03AD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @seealso{lyapchol, dlyap, dlyapchol} @end deftypefn @section lyapchol @findex lyapchol @deftypefn{Function File} {@var{u} =} lyapchol (@var{a}, @var{b}) @deftypefnx{Function File} {@var{u} =} lyapchol (@var{a}, @var{b}, @var{e}) Compute Cholesky factor of continuous-time Lyapunov equations. @strong{Equations} @example @group A U' U + U' U A' + B B' = 0 (Lyapunov Equation) A U' U E' + E U' U A' + B B' = 0 (Generalized Lyapunov Equation) @end group @end example @strong{Algorithm}@* Uses SLICOT SB03OD and SG03BD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @seealso{lyap, dlyap, dlyapchol} @end deftypefn @chapter Model Reduction @section bstmodred @findex bstmodred @deftypefn{Function File} {[@var{Gr}, @var{info}] =} bstmodred (@var{G}, @dots{}) @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} bstmodred (@var{G}, @var{nr}, @dots{}) @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} bstmodred (@var{G}, @var{opt}, @dots{}) @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} bstmodred (@var{G}, @var{nr}, @var{opt}, @dots{}) Model order reduction by Balanced Stochastic Truncation (BST) method. The aim of model reduction is to find an @acronym{LTI} system @var{Gr} of order @var{nr} (nr < n) such that the input-output behaviour of @var{Gr} approximates the one from original system @var{G}. BST is a relative error method which tries to minimize @iftex @tex $$ || G^{-1} (G-G_r) ||_{\infty} = \min $$ @end tex @end iftex @ifnottex @example -1 ||G (G-Gr)|| = min inf @end example @end ifnottex @strong{Inputs} @table @var @item G @acronym{LTI} model to be reduced. @item nr The desired order of the resulting reduced order system @var{Gr}. If not specified, @var{nr} is chosen automatically according to the description of key @var{'order'}. @item @dots{} Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. @item opt Optional struct with keys as field names. Struct @var{opt} can be created directly or by command @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. @end table @strong{Outputs} @table @var @item Gr Reduced order state-space model. @item info Struct containing additional information. @table @var @item info.n The order of the original system @var{G}. @item info.ns The order of the @var{alpha}-stable subsystem of the original system @var{G}. @item info.hsv The Hankel singular values of the phase system corresponding to the @var{alpha}-stable part of the original system @var{G}. The @var{ns} Hankel singular values are ordered decreasingly. @item info.nu The order of the @var{alpha}-unstable subsystem of both the original system @var{G} and the reduced-order system @var{Gr}. @item info.nr The order of the obtained reduced order system @var{Gr}. @end table @end table @strong{Option Keys and Values} @table @var @item 'order', 'nr' The desired order of the resulting reduced order system @var{Gr}. If not specified, @var{nr} is the sum of NU and the number of Hankel singular values greater than @code{MAX(TOL1,NS*EPS)}; @var{nr} can be further reduced to ensure that @code{HSV(NR-NU) > HSV(NR+1-NU)}. @item 'method' Approximation method for the H-infinity norm. Valid values corresponding to this key are: @table @var @item 'sr-bta', 'b' Use the square-root Balance & Truncate method. @item 'bfsr-bta', 'f' Use the balancing-free square-root Balance & Truncate method. Default method. @item 'sr-spa', 's' Use the square-root Singular Perturbation Approximation method. @item 'bfsr-spa', 'p' Use the balancing-free square-root Singular Perturbation Approximation method. @end table @item 'alpha' Specifies the ALPHA-stability boundary for the eigenvalues of the state dynamics matrix @var{G.A}. For a continuous-time system, ALPHA <= 0 is the boundary value for the real parts of eigenvalues, while for a discrete-time system, 0 <= ALPHA <= 1 represents the boundary value for the moduli of eigenvalues. The ALPHA-stability domain does not include the boundary. Default value is 0 for continuous-time systems and 1 for discrete-time systems. @item 'beta' Use @code{[G, beta*I]} as new system @var{G} to combine absolute and relative error methods. BETA > 0 specifies the absolute/relative error weighting parameter. A large positive value of BETA favours the minimization of the absolute approximation error, while a small value of BETA is appropriate for the minimization of the relative error. BETA = 0 means a pure relative error method and can be used only if rank(G.D) = rows(G.D) which means that the feedthrough matrice must not be rank-deficient. Default value is 0. @item 'tol1' If @var{'order'} is not specified, @var{tol1} contains the tolerance for determining the order of reduced system. For model reduction, the recommended value of @var{tol1} lies in the interval [0.00001, 0.001]. @var{tol1} < 1. If @var{tol1} <= 0 on entry, the used default value is @var{tol1} = NS*EPS, where NS is the number of ALPHA-stable eigenvalues of A and EPS is the machine precision. If @var{'order'} is specified, the value of @var{tol1} is ignored. @item 'tol2' The tolerance for determining the order of a minimal realization of the phase system (see METHOD) corresponding to the ALPHA-stable part of the given system. The recommended value is TOL2 = NS*EPS. TOL2 <= TOL1 < 1. This value is used by default if @var{'tol2'} is not specified or if TOL2 <= 0 on entry. @item 'equil', 'scale' Boolean indicating whether equilibration (scaling) should be performed on system @var{G} prior to order reduction. Default value is true if @code{G.scaled == false} and false if @code{G.scaled == true}. Note that for @acronym{MIMO} models, proper scaling of both inputs and outputs is of utmost importance. The input and output scaling can @strong{not} be done by the equilibration option or the @command{prescale} command because these functions perform state transformations only. Furthermore, signals should not be scaled simply to a certain range. For all inputs (or outputs), a certain change should be of the same importance for the model. @end table BST is often suitable to perform model reduction in order to obtain low order design models for controller synthesis. Approximation Properties: @itemize @bullet @item Guaranteed stability of reduced models @item Approximates simultaneously gain and phase @item Preserves non-minimum phase zeros @item Guaranteed a priori error bound @iftex @tex $$ || G^{-1} (G-G_r) ||_{\infty} \leq 2 \sum_{j=r+1}^{n} {1+\sigma_j \over 1-\sigma_j} - 1 $$ @end tex @end iftex @end itemize @strong{Algorithm}@* Uses SLICOT AB09HD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @section btamodred @findex btamodred @deftypefn{Function File} {[@var{Gr}, @var{info}] =} btamodred (@var{G}, @dots{}) @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} btamodred (@var{G}, @var{nr}, @dots{}) @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} btamodred (@var{G}, @var{opt}, @dots{}) @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} btamodred (@var{G}, @var{nr}, @var{opt}, @dots{}) Model order reduction by frequency weighted Balanced Truncation Approximation (BTA) method. The aim of model reduction is to find an @acronym{LTI} system @var{Gr} of order @var{nr} (nr < n) such that the input-output behaviour of @var{Gr} approximates the one from original system @var{G}. BTA is an absolute error method which tries to minimize @iftex @tex $$ || G - G_r ||_{\infty} = \min $$ $$ || V \ (G - G_r) \ W ||_{\infty} = \min $$ @end tex @end iftex @ifnottex @example ||G-Gr|| = min inf ||V (G-Gr) W|| = min inf @end example @end ifnottex where @var{V} and @var{W} denote output and input weightings. @strong{Inputs} @table @var @item G @acronym{LTI} model to be reduced. @item nr The desired order of the resulting reduced order system @var{Gr}. If not specified, @var{nr} is chosen automatically according to the description of key @var{'order'}. @item @dots{} Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. @item opt Optional struct with keys as field names. Struct @var{opt} can be created directly or by command @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. @end table @strong{Outputs} @table @var @item Gr Reduced order state-space model. @item info Struct containing additional information. @table @var @item info.n The order of the original system @var{G}. @item info.ns The order of the @var{alpha}-stable subsystem of the original system @var{G}. @item info.hsv The Hankel singular values of the @var{alpha}-stable part of the original system @var{G}, ordered decreasingly. @item info.nu The order of the @var{alpha}-unstable subsystem of both the original system @var{G} and the reduced-order system @var{Gr}. @item info.nr The order of the obtained reduced order system @var{Gr}. @end table @end table @strong{Option Keys and Values} @table @var @item 'order', 'nr' The desired order of the resulting reduced order system @var{Gr}. If not specified, @var{nr} is chosen automatically such that states with Hankel singular values @var{info.hsv} > @var{tol1} are retained. @item 'left', 'output' @acronym{LTI} model of the left/output frequency weighting @var{V}. Default value is an identity matrix. @item 'right', 'input' @acronym{LTI} model of the right/input frequency weighting @var{W}. Default value is an identity matrix. @item 'method' Approximation method for the L-infinity norm to be used as follows: @table @var @item 'sr', 'b' Use the square-root Balance & Truncate method. @item 'bfsr', 'f' Use the balancing-free square-root Balance & Truncate method. Default method. @end table @item 'alpha' Specifies the ALPHA-stability boundary for the eigenvalues of the state dynamics matrix @var{G.A}. For a continuous-time system, ALPHA <= 0 is the boundary value for the real parts of eigenvalues, while for a discrete-time system, 0 <= ALPHA <= 1 represents the boundary value for the moduli of eigenvalues. The ALPHA-stability domain does not include the boundary. Default value is 0 for continuous-time systems and 1 for discrete-time systems. @item 'tol1' If @var{'order'} is not specified, @var{tol1} contains the tolerance for determining the order of the reduced model. For model reduction, the recommended value of @var{tol1} is c*info.hsv(1), where c lies in the interval [0.00001, 0.001]. Default value is info.ns*eps*info.hsv(1). If @var{'order'} is specified, the value of @var{tol1} is ignored. @item 'tol2' The tolerance for determining the order of a minimal realization of the ALPHA-stable part of the given model. TOL2 <= TOL1. If not specified, ns*eps*info.hsv(1) is chosen. @item 'gram-ctrb' Specifies the choice of frequency-weighted controllability Grammian as follows: @table @var @item 'standard' Choice corresponding to a combination method [4] of the approaches of Enns [1] and Lin-Chiu [2,3]. Default method. @item 'enhanced' Choice corresponding to the stability enhanced modified combination method of [4]. @end table @item 'gram-obsv' Specifies the choice of frequency-weighted observability Grammian as follows: @table @var @item 'standard' Choice corresponding to a combination method [4] of the approaches of Enns [1] and Lin-Chiu [2,3]. Default method. @item 'enhanced' Choice corresponding to the stability enhanced modified combination method of [4]. @end table @item 'alpha-ctrb' Combination method parameter for defining the frequency-weighted controllability Grammian. abs(alphac) <= 1. If alphac = 0, the choice of Grammian corresponds to the method of Enns [1], while if alphac = 1, the choice of Grammian corresponds to the method of Lin and Chiu [2,3]. Default value is 0. @item 'alpha-obsv' Combination method parameter for defining the frequency-weighted observability Grammian. abs(alphao) <= 1. If alphao = 0, the choice of Grammian corresponds to the method of Enns [1], while if alphao = 1, the choice of Grammian corresponds to the method of Lin and Chiu [2,3]. Default value is 0. @item 'equil', 'scale' Boolean indicating whether equilibration (scaling) should be performed on system @var{G} prior to order reduction. This is done by state transformations. Default value is true if @code{G.scaled == false} and false if @code{G.scaled == true}. Note that for @acronym{MIMO} models, proper scaling of both inputs and outputs is of utmost importance. The input and output scaling can @strong{not} be done by the equilibration option or the @command{prescale} command because these functions perform state transformations only. Furthermore, signals should not be scaled simply to a certain range. For all inputs (or outputs), a certain change should be of the same importance for the model. @end table Approximation Properties: @itemize @bullet @item Guaranteed stability of reduced models @item Lower guaranteed error bound @item Guaranteed a priori error bound @iftex @tex $$ \sigma_{r+1} \leq || (G-G_r) ||_{\infty} \leq 2 \sum_{j=r+1}^{n} \sigma_j $$ @end tex @end iftex @end itemize @strong{References}@* [1] Enns, D. @cite{Model reduction with balanced realizations: An error bound and a frequency weighted generalization}. Proc. 23-th CDC, Las Vegas, pp. 127-132, 1984. [2] Lin, C.-A. and Chiu, T.-Y. @cite{Model reduction via frequency-weighted balanced realization}. Control Theory and Advanced Technology, vol. 8, pp. 341-351, 1992. [3] Sreeram, V., Anderson, B.D.O and Madievski, A.G. @cite{New results on frequency weighted balanced reduction technique}. Proc. ACC, Seattle, Washington, pp. 4004-4009, 1995. [4] Varga, A. and Anderson, B.D.O. @cite{Square-root balancing-free methods for the frequency-weighted balancing related model reduction}. (report in preparation) @strong{Algorithm}@* Uses SLICOT AB09ID by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @section hnamodred @findex hnamodred @deftypefn{Function File} {[@var{Gr}, @var{info}] =} hnamodred (@var{G}, @dots{}) @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} hnamodred (@var{G}, @var{nr}, @dots{}) @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} hnamodred (@var{G}, @var{opt}, @dots{}) @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} hnamodred (@var{G}, @var{nr}, @var{opt}, @dots{}) Model order reduction by frequency weighted optimal Hankel-norm (HNA) method. The aim of model reduction is to find an @acronym{LTI} system @var{Gr} of order @var{nr} (nr < n) such that the input-output behaviour of @var{Gr} approximates the one from original system @var{G}. HNA is an absolute error method which tries to minimize @iftex @tex $$ || G - G_r ||_H = \min $$ $$ || V \ (G - G_r) \ W ||_H = \min $$ @end tex @end iftex @ifnottex @example ||G-Gr|| = min H ||V (G-Gr) W|| = min H @end example @end ifnottex where @var{V} and @var{W} denote output and input weightings. @strong{Inputs} @table @var @item G @acronym{LTI} model to be reduced. @item nr The desired order of the resulting reduced order system @var{Gr}. If not specified, @var{nr} is chosen automatically according to the description of key @var{"order"}. @item @dots{} Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. @item opt Optional struct with keys as field names. Struct @var{opt} can be created directly or by command @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. @end table @strong{Outputs} @table @var @item Gr Reduced order state-space model. @item info Struct containing additional information. @table @var @item info.n The order of the original system @var{G}. @item info.ns The order of the @var{alpha}-stable subsystem of the original system @var{G}. @item info.hsv The Hankel singular values corresponding to the projection @code{op(V)*G1*op(W)}, where G1 denotes the @var{alpha}-stable part of the original system @var{G}. The @var{ns} Hankel singular values are ordered decreasingly. @item info.nu The order of the @var{alpha}-unstable subsystem of both the original system @var{G} and the reduced-order system @var{Gr}. @item info.nr The order of the obtained reduced order system @var{Gr}. @end table @end table @strong{Option Keys and Values} @table @var @item 'order', 'nr' The desired order of the resulting reduced order system @var{Gr}. If not specified, @var{nr} is the sum of @var{info.nu} and the number of Hankel singular values greater than @code{max(tol1, ns*eps*info.hsv(1)}; @item 'method' Specifies the computational approach to be used. Valid values corresponding to this key are: @table @var @item 'descriptor' Use the inverse free descriptor system approach. @item 'standard' Use the inversion based standard approach. @item 'auto' Switch automatically to the inverse free descriptor approach in case of badly conditioned feedthrough matrices in V or W. Default method. @end table @item 'left', 'v' @acronym{LTI} model of the left/output frequency weighting. The weighting must be antistable. @iftex @math{|| V \ (G-G_r) \dots ||_H = \min} @end iftex @ifnottex @example || V (G-Gr) . || = min H @end example @end ifnottex @item 'right', 'w' @acronym{LTI} model of the right/input frequency weighting. The weighting must be antistable. @iftex @math{|| \dots (G-G_r) \ W ||_H = \min} @end iftex @ifnottex @example || . (G-Gr) W || = min H @end example @end ifnottex @item 'left-inv', 'inv-v' @acronym{LTI} model of the left/output frequency weighting. The weighting must have only antistable zeros. @iftex @math{|| inv(V) \ (G-G_r) \dots ||_H = \min} @end iftex @ifnottex @example || inv(V) (G-Gr) . || = min H @end example @end ifnottex @item 'right-inv', 'inv-w' @acronym{LTI} model of the right/input frequency weighting. The weighting must have only antistable zeros. @iftex @math{|| \dots (G-G_r) \ inv(W) ||_H = \min} @end iftex @ifnottex @example || . (G-Gr) inv(W) || = min H @end example @end ifnottex @item 'left-conj', 'conj-v' @acronym{LTI} model of the left/output frequency weighting. The weighting must be stable. @iftex @math{|| conj(V) \ (G-G_r) \dots ||_H = \min} @end iftex @ifnottex @example || V (G-Gr) . || = min H @end example @end ifnottex @item 'right-conj', 'conj-w' @acronym{LTI} model of the right/input frequency weighting. The weighting must be stable. @iftex @math{|| \dots (G-G_r) \ conj(W) ||_H = \min} @end iftex @ifnottex @example || . (G-Gr) W || = min H @end example @end ifnottex @item 'left-conj-inv', 'conj-inv-v' @acronym{LTI} model of the left/output frequency weighting. The weighting must be minimum-phase. @iftex @math{|| conj(inv(V)) \ (G-G_r) \dots ||_H = \min} @end iftex @ifnottex @example || V (G-Gr) . || = min H @end example @end ifnottex @item 'right-conj-inv', 'conj-inv-w' @acronym{LTI} model of the right/input frequency weighting. The weighting must be minimum-phase. @iftex @math{|| \dots (G-G_r) \ conj(inv(W)) ||_H = \min} @end iftex @ifnottex @example || . (G-Gr) W || = min H @end example @end ifnottex @item 'alpha' Specifies the ALPHA-stability boundary for the eigenvalues of the state dynamics matrix @var{G.A}. For a continuous-time system, ALPHA <= 0 is the boundary value for the real parts of eigenvalues, while for a discrete-time system, 0 <= ALPHA <= 1 represents the boundary value for the moduli of eigenvalues. The ALPHA-stability domain does not include the boundary. Default value is 0 for continuous-time systems and 1 for discrete-time systems. @item 'tol1' If @var{'order'} is not specified, @var{tol1} contains the tolerance for determining the order of the reduced model. For model reduction, the recommended value of @var{tol1} is c*info.hsv(1), where c lies in the interval [0.00001, 0.001]. @var{tol1} < 1. If @var{'order'} is specified, the value of @var{tol1} is ignored. @item 'tol2' The tolerance for determining the order of a minimal realization of the ALPHA-stable part of the given model. @var{tol2} <= @var{tol1} < 1. If not specified, ns*eps*info.hsv(1) is chosen. @item 'equil', 'scale' Boolean indicating whether equilibration (scaling) should be performed on system @var{G} prior to order reduction. Default value is true if @code{G.scaled == false} and false if @code{G.scaled == true}. Note that for @acronym{MIMO} models, proper scaling of both inputs and outputs is of utmost importance. The input and output scaling can @strong{not} be done by the equilibration option or the @command{prescale} command because these functions perform state transformations only. Furthermore, signals should not be scaled simply to a certain range. For all inputs (or outputs), a certain change should be of the same importance for the model. @end table Approximation Properties: @itemize @bullet @item Guaranteed stability of reduced models @item Lower guaranteed error bound @item Guaranteed a priori error bound @iftex @tex $$ \sigma_{r+1} \leq || (G-G_r) ||_{\infty} \leq 2 \sum_{j=r+1}^{n} \sigma_j $$ @end tex @end iftex @end itemize @strong{Algorithm}@* Uses SLICOT AB09JD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @section spamodred @findex spamodred @deftypefn{Function File} {[@var{Gr}, @var{info}] =} spamodred (@var{G}, @dots{}) @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} spamodred (@var{G}, @var{nr}, @dots{}) @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} spamodred (@var{G}, @var{opt}, @dots{}) @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} spamodred (@var{G}, @var{nr}, @var{opt}, @dots{}) Model order reduction by frequency weighted Singular Perturbation Approximation (SPA). The aim of model reduction is to find an @acronym{LTI} system @var{Gr} of order @var{nr} (nr < n) such that the input-output behaviour of @var{Gr} approximates the one from original system @var{G}. SPA is an absolute error method which tries to minimize @iftex @tex $$ || G - G_r ||_{\infty} = \min $$ $$ || V \ (G - G_r) \ W ||_{\infty} = \min $$ @end tex @end iftex @ifnottex @example ||G-Gr|| = min inf ||V (G-Gr) W|| = min inf @end example @end ifnottex where @var{V} and @var{W} denote output and input weightings. @strong{Inputs} @table @var @item G @acronym{LTI} model to be reduced. @item nr The desired order of the resulting reduced order system @var{Gr}. If not specified, @var{nr} is chosen automatically according to the description of key @var{'order'}. @item @dots{} Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. @item opt Optional struct with keys as field names. Struct @var{opt} can be created directly or by command @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. @end table @strong{Outputs} @table @var @item Gr Reduced order state-space model. @item info Struct containing additional information. @table @var @item info.n The order of the original system @var{G}. @item info.ns The order of the @var{alpha}-stable subsystem of the original system @var{G}. @item info.hsv The Hankel singular values of the @var{alpha}-stable part of the original system @var{G}, ordered decreasingly. @item info.nu The order of the @var{alpha}-unstable subsystem of both the original system @var{G} and the reduced-order system @var{Gr}. @item info.nr The order of the obtained reduced order system @var{Gr}. @end table @end table @strong{Option Keys and Values} @table @var @item 'order', 'nr' The desired order of the resulting reduced order system @var{Gr}. If not specified, @var{nr} is chosen automatically such that states with Hankel singular values @var{info.hsv} > @var{tol1} are retained. @item 'left', 'output' @acronym{LTI} model of the left/output frequency weighting @var{V}. Default value is an identity matrix. @item 'right', 'input' @acronym{LTI} model of the right/input frequency weighting @var{W}. Default value is an identity matrix. @item 'method' Approximation method for the L-infinity norm to be used as follows: @table @var @item 'sr', 's' Use the square-root Singular Perturbation Approximation method. @item 'bfsr', 'p' Use the balancing-free square-root Singular Perturbation Approximation method. Default method. @end table @item 'alpha' Specifies the ALPHA-stability boundary for the eigenvalues of the state dynamics matrix @var{G.A}. For a continuous-time system, ALPHA <= 0 is the boundary value for the real parts of eigenvalues, while for a discrete-time system, 0 <= ALPHA <= 1 represents the boundary value for the moduli of eigenvalues. The ALPHA-stability domain does not include the boundary. Default value is 0 for continuous-time systems and 1 for discrete-time systems. @item 'tol1' If @var{'order'} is not specified, @var{tol1} contains the tolerance for determining the order of the reduced model. For model reduction, the recommended value of @var{tol1} is c*info.hsv(1), where c lies in the interval [0.00001, 0.001]. Default value is info.ns*eps*info.hsv(1). If @var{'order'} is specified, the value of @var{tol1} is ignored. @item 'tol2' The tolerance for determining the order of a minimal realization of the ALPHA-stable part of the given model. TOL2 <= TOL1. If not specified, ns*eps*info.hsv(1) is chosen. @item 'gram-ctrb' Specifies the choice of frequency-weighted controllability Grammian as follows: @table @var @item 'standard' Choice corresponding to a combination method [4] of the approaches of Enns [1] and Lin-Chiu [2,3]. Default method. @item 'enhanced' Choice corresponding to the stability enhanced modified combination method of [4]. @end table @item 'gram-obsv' Specifies the choice of frequency-weighted observability Grammian as follows: @table @var @item 'standard' Choice corresponding to a combination method [4] of the approaches of Enns [1] and Lin-Chiu [2,3]. Default method. @item 'enhanced' Choice corresponding to the stability enhanced modified combination method of [4]. @end table @item 'alpha-ctrb' Combination method parameter for defining the frequency-weighted controllability Grammian. abs(alphac) <= 1. If alphac = 0, the choice of Grammian corresponds to the method of Enns [1], while if alphac = 1, the choice of Grammian corresponds to the method of Lin and Chiu [2,3]. Default value is 0. @item 'alpha-obsv' Combination method parameter for defining the frequency-weighted observability Grammian. abs(alphao) <= 1. If alphao = 0, the choice of Grammian corresponds to the method of Enns [1], while if alphao = 1, the choice of Grammian corresponds to the method of Lin and Chiu [2,3]. Default value is 0. @item 'equil', 'scale' Boolean indicating whether equilibration (scaling) should be performed on system @var{G} prior to order reduction. Default value is true if @code{G.scaled == false} and false if @code{G.scaled == true}. Note that for @acronym{MIMO} models, proper scaling of both inputs and outputs is of utmost importance. The input and output scaling can @strong{not} be done by the equilibration option or the @command{prescale} command because these functions perform state transformations only. Furthermore, signals should not be scaled simply to a certain range. For all inputs (or outputs), a certain change should be of the same importance for the model. @end table @strong{References}@* [1] Enns, D. @cite{Model reduction with balanced realizations: An error bound and a frequency weighted generalization}. Proc. 23-th CDC, Las Vegas, pp. 127-132, 1984. [2] Lin, C.-A. and Chiu, T.-Y. @cite{Model reduction via frequency-weighted balanced realization}. Control Theory and Advanced Technology, vol. 8, pp. 341-351, 1992. [3] Sreeram, V., Anderson, B.D.O and Madievski, A.G. @cite{New results on frequency weighted balanced reduction technique}. Proc. ACC, Seattle, Washington, pp. 4004-4009, 1995. [4] Varga, A. and Anderson, B.D.O. @cite{Square-root balancing-free methods for the frequency-weighted balancing related model reduction}. (report in preparation) @strong{Algorithm}@* Uses SLICOT AB09ID by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @chapter Controller Reduction @section btaconred @findex btaconred @deftypefn{Function File} {[@var{Kr}, @var{info}] =} btaconred (@var{G}, @var{K}, @dots{}) @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} btaconred (@var{G}, @var{K}, @var{ncr}, @dots{}) @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} btaconred (@var{G}, @var{K}, @var{opt}, @dots{}) @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} btaconred (@var{G}, @var{K}, @var{ncr}, @var{opt}, @dots{}) Controller reduction by frequency-weighted Balanced Truncation Approximation (BTA). Given a plant @var{G} and a stabilizing controller @var{K}, determine a reduced order controller @var{Kr} such that the closed-loop system is stable and closed-loop performance is retained. The algorithm tries to minimize the frequency-weighted error @iftex @tex $$ || V \ (K - K_r) \ W ||_{\infty} = \min $$ @end tex @end iftex @ifnottex @example ||V (K-Kr) W|| = min inf @end example @end ifnottex where @var{V} and @var{W} denote output and input weightings. @strong{Inputs} @table @var @item G @acronym{LTI} model of the plant. It has m inputs, p outputs and n states. @item K @acronym{LTI} model of the controller. It has p inputs, m outputs and nc states. @item ncr The desired order of the resulting reduced order controller @var{Kr}. If not specified, @var{ncr} is chosen automatically according to the description of key @var{'order'}. @item @dots{} Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. @item opt Optional struct with keys as field names. Struct @var{opt} can be created directly or by command @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. @end table @strong{Outputs} @table @var @item Kr State-space model of reduced order controller. @item info Struct containing additional information. @table @var @item info.ncr The order of the obtained reduced order controller @var{Kr}. @item info.ncs The order of the alpha-stable part of original controller @var{K}. @item info.hsvc The Hankel singular values of the alpha-stable part of @var{K}. The @var{ncs} Hankel singular values are ordered decreasingly. @end table @end table @strong{Option Keys and Values} @table @var @item 'order', 'ncr' The desired order of the resulting reduced order controller @var{Kr}. If not specified, @var{ncr} is chosen automatically such that states with Hankel singular values @var{info.hsvc} > @var{tol1} are retained. @item 'method' Order reduction approach to be used as follows: @table @var @item 'sr', 'b' Use the square-root Balance & Truncate method. @item 'bfsr', 'f' Use the balancing-free square-root Balance & Truncate method. Default method. @end table @item 'weight' Specifies the type of frequency-weighting as follows: @table @var @item 'none' No weightings are used (V = I, W = I). @item 'left', 'output' Use stability enforcing left (output) weighting @iftex @tex $$ V = (I - G K)^{-1} G, \qquad W = I $$ @end tex @end iftex @ifnottex @example -1 V = (I-G*K) *G , W = I @end example @end ifnottex @item 'right', 'input' Use stability enforcing right (input) weighting @iftex @tex $$ V = I, \qquad W = (I - G K)^{-1} G $$ @end tex @end iftex @ifnottex @example -1 V = I , W = (I-G*K) *G @end example @end ifnottex @item 'both', 'performance' Use stability and performance enforcing weightings @iftex @tex $$ V = (I - G K)^{-1} G, \qquad W = (I - G K)^{-1} $$ @end tex @end iftex @ifnottex @example -1 -1 V = (I-G*K) *G , W = (I-G*K) @end example @end ifnottex Default value. @end table @item 'feedback' Specifies whether @var{K} is a positive or negative feedback controller: @table @var @item '+' Use positive feedback controller. Default value. @item '-' Use negative feedback controller. @end table @item 'alpha' Specifies the ALPHA-stability boundary for the eigenvalues of the state dynamics matrix @var{K.A}. For a continuous-time controller, ALPHA <= 0 is the boundary value for the real parts of eigenvalues, while for a discrete-time controller, 0 <= ALPHA <= 1 represents the boundary value for the moduli of eigenvalues. The ALPHA-stability domain does not include the boundary. Default value is 0 for continuous-time controllers and 1 for discrete-time controllers. @item 'tol1' If @var{'order'} is not specified, @var{tol1} contains the tolerance for determining the order of the reduced controller. For model reduction, the recommended value of @var{tol1} is c*info.hsvc(1), where c lies in the interval [0.00001, 0.001]. Default value is info.ncs*eps*info.hsvc(1). If @var{'order'} is specified, the value of @var{tol1} is ignored. @item 'tol2' The tolerance for determining the order of a minimal realization of the ALPHA-stable part of the given controller. TOL2 <= TOL1. If not specified, ncs*eps*info.hsvc(1) is chosen. @item 'gram-ctrb' Specifies the choice of frequency-weighted controllability Grammian as follows: @table @var @item 'standard' Choice corresponding to standard Enns' method [1]. Default method. @item 'enhanced' Choice corresponding to the stability enhanced modified Enns' method of [2]. @end table @item 'gram-obsv' Specifies the choice of frequency-weighted observability Grammian as follows: @table @var @item 'standard' Choice corresponding to standard Enns' method [1]. Default method. @item 'enhanced' Choice corresponding to the stability enhanced modified Enns' method of [2]. @end table @item 'equil', 'scale' Boolean indicating whether equilibration (scaling) should be performed on @var{G} and @var{K} prior to order reduction. Default value is false if both @code{G.scaled == true, K.scaled == true} and true otherwise. Note that for @acronym{MIMO} models, proper scaling of both inputs and outputs is of utmost importance. The input and output scaling can @strong{not} be done by the equilibration option or the @command{prescale} command because these functions perform state transformations only. Furthermore, signals should not be scaled simply to a certain range. For all inputs (or outputs), a certain change should be of the same importance for the model. @end table @strong{Algorithm}@* Uses SLICOT SB16AD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @section cfconred @findex cfconred @deftypefn{Function File} {[@var{Kr}, @var{info}] =} cfconred (@var{G}, @var{F}, @var{L}, @dots{}) @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} cfconred (@var{G}, @var{F}, @var{L}, @var{ncr}, @dots{}) @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} cfconred (@var{G}, @var{F}, @var{L}, @var{opt}, @dots{}) @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} cfconred (@var{G}, @var{F}, @var{L}, @var{ncr}, @var{opt}, @dots{}) Reduction of state-feedback-observer based controller by coprime factorization (CF). Given a plant @var{G}, state feedback gain @var{F} and full observer gain @var{L}, determine a reduced order controller @var{Kr}. @strong{Inputs} @table @var @item G @acronym{LTI} model of the open-loop plant (A,B,C,D). It has m inputs, p outputs and n states. @item F Stabilizing state feedback matrix (m-by-n). @item L Stabilizing observer gain matrix (n-by-p). @item ncr The desired order of the resulting reduced order controller @var{Kr}. If not specified, @var{ncr} is chosen automatically according to the description of key @var{'order'}. @item @dots{} Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. @item opt Optional struct with keys as field names. Struct @var{opt} can be created directly or by command @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. @end table @strong{Outputs} @table @var @item Kr State-space model of reduced order controller. @item info Struct containing additional information. @table @var @item info.hsv The Hankel singular values of the extended system?!?. The @var{n} Hankel singular values are ordered decreasingly. @item info.ncr The order of the obtained reduced order controller @var{Kr}. @end table @end table @strong{Option Keys and Values} @table @var @item 'order', 'ncr' The desired order of the resulting reduced order controller @var{Kr}. If not specified, @var{ncr} is chosen automatically such that states with Hankel singular values @var{info.hsv} > @var{tol1} are retained. @item 'method' Order reduction approach to be used as follows: @table @var @item 'sr-bta', 'b' Use the square-root Balance & Truncate method. @item 'bfsr-bta', 'f' Use the balancing-free square-root Balance & Truncate method. Default method. @item 'sr-spa', 's' Use the square-root Singular Perturbation Approximation method. @item 'bfsr-spa', 'p' Use the balancing-free square-root Singular Perturbation Approximation method. @end table @item 'cf' Specifies whether left or right coprime factorization is to be used as follows: @table @var @item 'left', 'l' Use left coprime factorization. Default method. @item 'right', 'r' Use right coprime factorization. @end table @item 'feedback' Specifies whether @var{F} and @var{L} are fed back positively or negatively: @table @var @item '+' A+BK and A+LC are both Hurwitz matrices. @item '-' A-BK and A-LC are both Hurwitz matrices. Default value. @end table @item 'tol1' If @var{'order'} is not specified, @var{tol1} contains the tolerance for determining the order of the reduced system. For model reduction, the recommended value of @var{tol1} is c*info.hsv(1), where c lies in the interval [0.00001, 0.001]. Default value is n*eps*info.hsv(1). If @var{'order'} is specified, the value of @var{tol1} is ignored. @item 'tol2' The tolerance for determining the order of a minimal realization of the coprime factorization controller. TOL2 <= TOL1. If not specified, n*eps*info.hsv(1) is chosen. @item 'equil', 'scale' Boolean indicating whether equilibration (scaling) should be performed on system @var{G} prior to order reduction. Default value is true if @code{G.scaled == false} and false if @code{G.scaled == true}. Note that for @acronym{MIMO} models, proper scaling of both inputs and outputs is of utmost importance. The input and output scaling can @strong{not} be done by the equilibration option or the @command{prescale} command because these functions perform state transformations only. Furthermore, signals should not be scaled simply to a certain range. For all inputs (or outputs), a certain change should be of the same importance for the model. @end table @strong{Algorithm}@* Uses SLICOT SB16BD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @section fwcfconred @findex fwcfconred @deftypefn{Function File} {[@var{Kr}, @var{info}] =} fwcfconred (@var{G}, @var{F}, @var{L}, @dots{}) @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} fwcfconred (@var{G}, @var{F}, @var{L}, @var{ncr}, @dots{}) @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} fwcfconred (@var{G}, @var{F}, @var{L}, @var{opt}, @dots{}) @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} fwcfconred (@var{G}, @var{F}, @var{L}, @var{ncr}, @var{opt}, @dots{}) Reduction of state-feedback-observer based controller by frequency-weighted coprime factorization (FW CF). Given a plant @var{G}, state feedback gain @var{F} and full observer gain @var{L}, determine a reduced order controller @var{Kr} by using stability enforcing frequency weights. @strong{Inputs} @table @var @item G @acronym{LTI} model of the open-loop plant (A,B,C,D). It has m inputs, p outputs and n states. @item F Stabilizing state feedback matrix (m-by-n). @item L Stabilizing observer gain matrix (n-by-p). @item ncr The desired order of the resulting reduced order controller @var{Kr}. If not specified, @var{ncr} is chosen automatically according to the description of key @var{'order'}. @item @dots{} Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. @item opt Optional struct with keys as field names. Struct @var{opt} can be created directly or by command @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. @end table @strong{Outputs} @table @var @item Kr State-space model of reduced order controller. @item info Struct containing additional information. @table @var @item info.hsv The Hankel singular values of the extended system?!?. The @var{n} Hankel singular values are ordered decreasingly. @item info.ncr The order of the obtained reduced order controller @var{Kr}. @end table @end table @strong{Option Keys and Values} @table @var @item 'order', 'ncr' The desired order of the resulting reduced order controller @var{Kr}. If not specified, @var{ncr} is chosen automatically such that states with Hankel singular values @var{info.hsv} > @var{tol1} are retained. @item 'method' Order reduction approach to be used as follows: @table @var @item 'sr', 'b' Use the square-root Balance & Truncate method. @item 'bfsr', 'f' Use the balancing-free square-root Balance & Truncate method. Default method. @end table @item 'cf' Specifies whether left or right coprime factorization is to be used as follows: @table @var @item 'left', 'l' Use left coprime factorization. @item 'right', 'r' Use right coprime factorization. Default method. @end table @item 'feedback' Specifies whether @var{F} and @var{L} are fed back positively or negatively: @table @var @item '+' A+BK and A+LC are both Hurwitz matrices. @item '-' A-BK and A-LC are both Hurwitz matrices. Default value. @end table @item 'tol1' If @var{'order'} is not specified, @var{tol1} contains the tolerance for determining the order of the reduced system. For model reduction, the recommended value of @var{tol1} is c*info.hsv(1), where c lies in the interval [0.00001, 0.001]. Default value is n*eps*info.hsv(1). If @var{'order'} is specified, the value of @var{tol1} is ignored. @end table @strong{Algorithm}@* Uses SLICOT SB16CD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @section spaconred @findex spaconred @deftypefn{Function File} {[@var{Kr}, @var{info}] =} spaconred (@var{G}, @var{K}, @dots{}) @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} spaconred (@var{G}, @var{K}, @var{ncr}, @dots{}) @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} spaconred (@var{G}, @var{K}, @var{opt}, @dots{}) @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} spaconred (@var{G}, @var{K}, @var{ncr}, @var{opt}, @dots{}) Controller reduction by frequency-weighted Singular Perturbation Approximation (SPA). Given a plant @var{G} and a stabilizing controller @var{K}, determine a reduced order controller @var{Kr} such that the closed-loop system is stable and closed-loop performance is retained. The algorithm tries to minimize the frequency-weighted error @iftex @tex $$ || V \ (K - K_r) \ W ||_{\infty} = \min $$ @end tex @end iftex @ifnottex @example ||V (K-Kr) W|| = min inf @end example @end ifnottex where @var{V} and @var{W} denote output and input weightings. @strong{Inputs} @table @var @item G @acronym{LTI} model of the plant. It has m inputs, p outputs and n states. @item K @acronym{LTI} model of the controller. It has p inputs, m outputs and nc states. @item ncr The desired order of the resulting reduced order controller @var{Kr}. If not specified, @var{ncr} is chosen automatically according to the description of key @var{'order'}. @item @dots{} Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. @item opt Optional struct with keys as field names. Struct @var{opt} can be created directly or by command @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. @end table @strong{Outputs} @table @var @item Kr State-space model of reduced order controller. @item info Struct containing additional information. @table @var @item info.ncr The order of the obtained reduced order controller @var{Kr}. @item info.ncs The order of the alpha-stable part of original controller @var{K}. @item info.hsvc The Hankel singular values of the alpha-stable part of @var{K}. The @var{ncs} Hankel singular values are ordered decreasingly. @end table @end table @strong{Option Keys and Values} @table @var @item 'order', 'ncr' The desired order of the resulting reduced order controller @var{Kr}. If not specified, @var{ncr} is chosen automatically such that states with Hankel singular values @var{info.hsvc} > @var{tol1} are retained. @item 'method' Order reduction approach to be used as follows: @table @var @item 'sr', 's' Use the square-root Singular Perturbation Approximation method. @item 'bfsr', 'p' Use the balancing-free square-root Singular Perturbation Approximation method. Default method. @end table @item 'weight' Specifies the type of frequency-weighting as follows: @table @var @item 'none' No weightings are used (V = I, W = I). @item 'left', 'output' Use stability enforcing left (output) weighting @iftex @tex $$ V = (I - G K)^{-1} G, \qquad W = I $$ @end tex @end iftex @ifnottex @example -1 V = (I-G*K) *G , W = I @end example @end ifnottex @item 'right', 'input' Use stability enforcing right (input) weighting @iftex @tex $$ V = I, \qquad W = (I - G K)^{-1} G $$ @end tex @end iftex @ifnottex @example -1 V = I , W = (I-G*K) *G @end example @end ifnottex @item 'both', 'performance' Use stability and performance enforcing weightings @iftex @tex $$ V = (I - G K)^{-1} G, \qquad W = (I - G K)^{-1} $$ @end tex @end iftex @ifnottex @example -1 -1 V = (I-G*K) *G , W = (I-G*K) @end example @end ifnottex Default value. @end table @item 'feedback' Specifies whether @var{K} is a positive or negative feedback controller: @table @var @item '+' Use positive feedback controller. Default value. @item '-' Use negative feedback controller. @end table @item 'alpha' Specifies the ALPHA-stability boundary for the eigenvalues of the state dynamics matrix @var{K.A}. For a continuous-time controller, ALPHA <= 0 is the boundary value for the real parts of eigenvalues, while for a discrete-time controller, 0 <= ALPHA <= 1 represents the boundary value for the moduli of eigenvalues. The ALPHA-stability domain does not include the boundary. Default value is 0 for continuous-time controllers and 1 for discrete-time controllers. @item 'tol1' If @var{'order'} is not specified, @var{tol1} contains the tolerance for determining the order of the reduced controller. For model reduction, the recommended value of @var{tol1} is c*info.hsvc(1), where c lies in the interval [0.00001, 0.001]. Default value is info.ncs*eps*info.hsvc(1). If @var{'order'} is specified, the value of @var{tol1} is ignored. @item 'tol2' The tolerance for determining the order of a minimal realization of the ALPHA-stable part of the given controller. TOL2 <= TOL1. If not specified, ncs*eps*info.hsvc(1) is chosen. @item 'gram-ctrb' Specifies the choice of frequency-weighted controllability Grammian as follows: @table @var @item 'standard' Choice corresponding to standard Enns' method [1]. Default method. @item 'enhanced' Choice corresponding to the stability enhanced modified Enns' method of [2]. @end table @item 'gram-obsv' Specifies the choice of frequency-weighted observability Grammian as follows: @table @var @item 'standard' Choice corresponding to standard Enns' method [1]. Default method. @item 'enhanced' Choice corresponding to the stability enhanced modified Enns' method of [2]. @end table @item 'equil', 'scale' Boolean indicating whether equilibration (scaling) should be performed on @var{G} and @var{K} prior to order reduction. Default value is false if both @code{G.scaled == true, K.scaled == true} and true otherwise. Note that for @acronym{MIMO} models, proper scaling of both inputs and outputs is of utmost importance. The input and output scaling can @strong{not} be done by the equilibration option or the @command{prescale} command because these functions perform state transformations only. Furthermore, signals should not be scaled simply to a certain range. For all inputs (or outputs), a certain change should be of the same importance for the model. @end table @strong{Algorithm}@* Uses SLICOT SB16AD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @chapter Experimental Data Handling @section iddata @findex iddata @deftypefn{Function File} {@var{dat} =} iddata (@var{y}) @deftypefnx{Function File} {@var{dat} =} iddata (@var{y}, @var{u}) @deftypefnx{Function File} {@var{dat} =} iddata (@var{y}, @var{u}, @var{tsam}, @dots{}) @deftypefnx{Function File} {@var{dat} =} iddata (@var{y}, @var{u}, @var{[]}, @dots{}) Create identification dataset of output and input signals. @strong{Inputs} @table @var @item y Real matrix containing the output signal in time-domain. For a system with @var{p} outputs and @var{n} samples, @var{y} is a n-by-p matrix. For data from multiple experiments, @var{y} becomes a e-by-1 or 1-by-e cell vector of n(i)-by-p matrices, where @var{e} denotes the number of experiments and n(i) the individual number of samples for each experiment. @item u Real matrix containing the input signal in time-domain. For a system with @var{m} inputs and @var{n} samples, @var{u} is a n-by-m matrix. For data from multiple experiments, @var{u} becomes a e-by-1 or 1-by-e cell vector of n(i)-by-m matrices, where @var{e} denotes the number of experiments and n(i) the individual number of samples for each experiment. If @var{u} is not specified or an empty element @code{[]} is passed, @var{dat} becomes a time series dataset. @item tsam Sampling time. If not specified, default value -1 (unspecified) is taken. For multi-experiment data, @var{tsam} becomes a e-by-1 or 1-by-e cell vector containing individual sampling times for each experiment. If a scalar @var{tsam} is provided, then all experiments have the same sampling time. @item @dots{} Optional pairs of properties and values. @end table @strong{Outputs} @table @var @item dat iddata identification dataset. @end table @strong{Option Keys and Values} @table @var @item 'expname' The name of the experiments in @var{dat}. Cell vector of length e containing strings. Default names are @code{@{'exp1', 'exp2', ...@}} @item 'y' Output signals. See 'Inputs' for details. @item 'outname' The name of the output channels in @var{dat}. Cell vector of length p containing strings. Default names are @code{@{'y1', 'y2', ...@}} @item 'outunit' The units of the output channels in @var{dat}. Cell vector of length p containing strings. @item 'u' Input signals. See 'Inputs' for details. @item 'inname' The name of the input channels in @var{dat}. Cell vector of length m containing strings. Default names are @code{@{'u1', 'u2', ...@}} @item 'inunit' The units of the input channels in @var{dat}. Cell vector of length m containing strings. @item 'tsam' Sampling time. See 'Inputs' for details. @item 'timeunit' The units of the sampling times in @var{dat}. Cell vector of length e containing strings. @item 'name' String containing the name of the dataset. @item 'notes' String or cell of string containing comments. @item 'userdata' Any data type. @end table @end deftypefn @section @@iddata/cat @findex cat @deftypefn {Function File} {@var{dat} =} cat (@var{dim}, @var{dat1}, @var{dat2}, @dots{}) Concatenate iddata sets along dimension @var{dim}. @strong{Inputs} @table @var @item dim Dimension along which the concatenation takes place. @table @var @item 1 Concatenate samples. The samples are concatenated in the following way: @code{dat.y@{e@} = [dat1.y@{e@}; dat2.y@{e@}; @dots{}]} @code{dat.u@{e@} = [dat1.u@{e@}; dat2.u@{e@}; @dots{}]} where @var{e} denotes the experiment. The number of experiments, outputs and inputs must be equal for all datasets. Equivalent to @command{vertcat}. @item 2 Concatenate inputs and outputs. The outputs and inputs are concatenated in the following way: @code{dat.y@{e@} = [dat1.y@{e@}, dat2.y@{e@}, @dots{}]} @code{dat.u@{e@} = [dat1.u@{e@}, dat2.u@{e@}, @dots{}]} where @var{e} denotes the experiment. The number of experiments and samples must be equal for all datasets. Equivalent to @command{horzcat}. @item 3 Concatenate experiments. The experiments are concatenated in the following way: @code{dat.y = [dat1.y; dat2.y; @dots{}]} @code{dat.u = [dat1.u; dat2.u; @dots{}]} The number of outputs and inputs must be equal for all datasets. Equivalent to @command{merge}. @end table @item dat1, dat2, @dots{} iddata sets to be concatenated. @end table @strong{Outputs} @table @var @item dat Concatenated iddata set. @end table @seealso{horzcat, merge, vertcat} @end deftypefn @section @@iddata/detrend @findex detrend @deftypefn {Function File} {@var{dat} =} detrend (@var{dat}) @deftypefnx {Function File} {@var{dat} =} detrend (@var{dat}, @var{ord}) Detrend outputs and inputs of dataset @var{dat} by removing the best fit of a polynomial of order @var{ord}. If @var{ord} is not specified, default value 0 is taken. This corresponds to removing a constant. @end deftypefn @section @@iddata/diff @findex diff @deftypefn {Function File} {@var{dat} =} diff (@var{dat}) @deftypefnx {Function File} {@var{dat} =} diff (@var{dat}, @var{k}) Return @var{k}-th difference of outputs and inputs of dataset @var{dat}. If @var{k} is not specified, default value 1 is taken. @end deftypefn @section @@iddata/fft @findex fft @deftypefn {Function File} {@var{dat} =} fft (@var{dat}) @deftypefnx {Function File} {@var{dat} =} fft (@var{dat}, @var{n}) Transform iddata objects from time to frequency domain using a Fast Fourier Transform (FFT) algorithm. @strong{Inputs} @table @var @item dat iddata set containing signals in time-domain. @item n Length of the FFT transformations. If @var{n} does not match the signal length, the signals in @var{dat} are shortened or padded with zeros. @var{n} is a vector with as many elements as there are experiments in @var{dat} or a scalar with a common length for all experiments. If not specified, the signal lengths are taken as default values. @end table @strong{Outputs} @table @var @item dat iddata identification dataset in frequency-domain. In order to preserve signal power and noise level, the FFTs are normalized by dividing each transform by the square root of the signal length. The frequency values are distributed equally from 0 to the Nyquist frequency. The Nyquist frequency is only included for even signal lengths. @end table @end deftypefn @section @@iddata/filter @findex filter @deftypefn {Function File} {@var{dat} =} filter (@var{dat}, @var{sys}) @deftypefnx {Function File} {@var{dat} =} filter (@var{dat}, @var{b}, @var{a}) Filter output and input signals of dataset @var{dat}. The filter is specified either by @acronym{LTI} system @var{sys} or by transfer function polynomials @var{b} and @var{a} as described in the help text of the built-in filter command. Type @code{help filter} for more information. @strong{Inputs} @table @var @item dat iddata identification dataset containing signals in time-domain. @item sys @acronym{LTI} object containing the discrete-time filter. @item b Numerator polynomial of the discrete-time filter. Must be a row vector containing the coefficients of the polynomial in ascending powers of z^-1. @item a Denominator polynomial of the discrete-time filter. Must be a row vector containing the coefficients of the polynomial in ascending powers of z^-1. @end table @strong{Outputs} @table @var @item dat iddata identification dataset with filtered output and input signals. @end table @end deftypefn @section @@iddata/get @findex get @deftypefn {Function File} {} get (@var{dat}) @deftypefnx {Function File} {@var{value} =} get (@var{dat}, @var{"property"}) @deftypefnx {Function File} {[@var{val1}, @var{val2}, @dots{}] =} get (@var{dat}, @var{"prop1"}, @var{"prop2"}, @dots{}) Access property values of iddata objects. Type @command{get(dat)} to display a list of available properties. @end deftypefn @section @@iddata/ifft @findex ifft @deftypefn {Function File} {@var{dat} =} ifft (@var{dat}) Transform iddata objects from frequency to time domain. @strong{Inputs} @table @var @item dat iddata set containing signals in frequency domain. The frequency values must be distributed equally from 0 to the Nyquist frequency. The Nyquist frequency is only included for even signal lengths. @end table @strong{Outputs} @table @var @item dat iddata identification dataset in time domain. In order to preserve signal power and noise level, the FFTs are normalized by multiplying each transform by the square root of the signal length. @end table @end deftypefn @section @@iddata/merge @findex merge @deftypefn {Function File} {@var{dat} =} merge (@var{dat1}, @var{dat2}, @dots{}) Concatenate experiments of iddata datasets. The experiments are concatenated in the following way: @code{dat.y = [dat1.y; dat2.y; @dots{}]} @code{dat.u = [dat1.u; dat2.u; @dots{}]} The number of outputs and inputs must be equal for all datasets. @end deftypefn @section @@iddata/nkshift @findex nkshift @deftypefn {Function File} {@var{dat} =} nkshift (@var{dat}, @var{nk}) @deftypefnx {Function File} {@var{dat} =} nkshift (@var{dat}, @var{nk}, @var{'append'}) Shift input channels of dataset @var{dat} according to integer @var{nk}. A positive value of @var{nk} means that the input channels are delayed @var{nk} samples. By default, both input and output signals are shortened by @var{nk} samples. If a third argument @var{'append'} is passed, the output signals are left untouched while @var{nk} zeros are appended to the (shortened) input signals such that the number of samples in @var{dat} remains constant. @end deftypefn @section @@iddata/plot @findex plot @deftypefn {Function File} {} plot (@var{dat}) @deftypefnx {Function File} {} plot (@var{dat}, @var{exp}) Plot signals of iddata identification datasets on the screen. The signals are plotted experiment-wise, either in time- or frequency-domain. For multi-experiment datasets, press any key to switch to the next experiment. If the plot of a single experiment should be saved by the @command{print} command, use @code{plot(dat,exp)}, where @var{exp} denotes the desired experiment. @end deftypefn @section @@iddata/resample @findex resample @deftypefn {Function File} {@var{dat} =} resample (@var{dat}, @var{p}, @var{q}) @deftypefnx {Function File} {@var{dat} =} resample (@var{dat}, @var{p}, @var{q}, @var{n}) @deftypefnx {Function File} {@var{dat} =} resample (@var{dat}, @var{p}, @var{q}, @var{h}) Change the sample rate of the output and input signals in dataset @var{dat} by a factor of @code{p/q}. This is performed using a polyphase algorithm. The anti-aliasing @acronym{FIR} filter can be specified as follows: Either by order @var{n} (scalar) with default value 0. The band edges are then chosen automatically. Or by impulse response @var{h} (vector). Requires the signal package to be installed. @strong{Algorithm}@* Uses commands @command{fir1} and @command{resample} from the signal package. @strong{References}@* [1] J. G. Proakis and D. G. Manolakis, Digital Signal Processing: Principles, Algorithms, and Applications, 4th ed., Prentice Hall, 2007. Chap. 6 [2] A. V. Oppenheim, R. W. Schafer and J. R. Buck, Discrete-time signal processing, Signal processing series, Prentice-Hall, 1999 @end deftypefn @section @@iddata/set @findex set @deftypefn {Function File} {} set (@var{dat}) @deftypefnx {Function File} {} set (@var{dat}, @var{"property"}, @var{value}, @dots{}) @deftypefnx {Function File} {@var{dat} =} set (@var{dat}, @var{"property"}, @var{value}, @dots{}) Set or modify properties of iddata objects. If no return argument @var{dat} is specified, the modified @acronym{LTI} object is stored in input argument @var{dat}. @command{set} can handle multiple properties in one call: @code{set (dat, 'prop1', val1, 'prop2', val2, 'prop3', val3)}. @code{set (dat)} prints a list of the object's property names. @end deftypefn @section @@iddata/size @findex size @deftypefn {Function File} {@var{nvec} =} size (@var{dat}) @deftypefnx {Function File} {@var{ndim} =} size (@var{dat}, @var{dim}) @deftypefnx {Function File} {[@var{n}, @var{p}, @var{m}, @var{e}] =} size (@var{dat}) Return dimensions of iddata set @var{dat}. @strong{Inputs} @table @var @item dat iddata set. @item dim If given a second argument, @command{size} will return the size of the corresponding dimension. @end table @strong{Outputs} @table @var @item nvec Row vector. The first element is the total number of samples (rows of dat.y and dat.u). The second element is the number of outputs (columns of dat.y) and the third element the number of inputs (columns of dat.u). The fourth element is the number of experiments. @item ndim Scalar value. The size of the dimension @var{dim}. @item n Row vector containing the number of samples of each experiment. @item p Number of outputs. @item m Number of inputs. @item e Number of experiments. @end table @end deftypefn @chapter System Identification @section arx @findex arx @deftypefn {Function File} {[@var{sys}, @var{x0}] =} arx (@var{dat}, @var{n}, @dots{}) @deftypefnx {Function File} {[@var{sys}, @var{x0}] =} arx (@var{dat}, @var{n}, @var{opt}, @dots{}) @deftypefnx {Function File} {[@var{sys}, @var{x0}] =} arx (@var{dat}, @var{opt}, @dots{}) @deftypefnx {Function File} {[@var{sys}, @var{x0}] =} arx (@var{dat}, @var{'na'}, @var{na}, @var{'nb'}, @var{nb}) Estimate ARX model using QR factorization. @iftex @tex $$ A(q) \, y(t) = B(q) \, u(t) \, + \, e(t) $$ @end tex @end iftex @ifnottex @example A(q) y(t) = B(q) u(t) + e(t) @end example @end ifnottex @strong{Inputs} @table @var @item dat iddata identification dataset containing the measurements, i.e. time-domain signals. @item n The desired order of the resulting model @var{sys}. @item @dots{} Optional pairs of keys and values. @code{'key1', value1, 'key2', value2}. @item opt Optional struct with keys as field names. Struct @var{opt} can be created directly or by command @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. @end table @strong{Outputs} @table @var @item sys Discrete-time transfer function model. If the second output argument @var{x0} is returned, @var{sys} becomes a state-space model. @item x0 Initial state vector. If @var{dat} is a multi-experiment dataset, @var{x0} becomes a cell vector containing an initial state vector for each experiment. @end table @strong{Option Keys and Values} @table @var @item 'na' Order of the polynomial A(q) and number of poles. @item 'nb' Order of the polynomial B(q)+1 and number of zeros+1. @var{nb} <= @var{na}. @item 'nk' Input-output delay specified as number of sampling instants. Scalar positive integer. This corresponds to a call to command @command{nkshift}, followed by padding the B polynomial with @var{nk} leading zeros. @end table @strong{Algorithm}@* Uses the formulae given in [1] on pages 318-319, 'Solving for the LS Estimate by QR Factorization'. For the initial conditions, SLICOT IB01CD is used by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @strong{References}@* [1] Ljung, L. (1999) @cite{System Identification: Theory for the User: Second Edition}. Prentice Hall, New Jersey, USA. @end deftypefn @section moen4 @findex moen4 @deftypefn {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moen4 (@var{dat}, @dots{}) @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moen4 (@var{dat}, @var{n}, @dots{}) @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moen4 (@var{dat}, @var{opt}, @dots{}) @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moen4 (@var{dat}, @var{n}, @var{opt}, @dots{}) Estimate state-space model using combined subspace method: @acronym{MOESP} algorithm for finding the matrices A and C, and @acronym{N4SID} algorithm for finding the matrices B and D. If no output arguments are given, the singular values are plotted on the screen in order to estimate the system order. @strong{Inputs} @table @var @item dat iddata set containing the measurements, i.e. time-domain signals. @item n The desired order of the resulting state-space system @var{sys}. If not specified, @var{n} is chosen automatically according to the singular values and tolerances. @item @dots{} Optional pairs of keys and values. @code{'key1', value1, 'key2', value2}. @item opt Optional struct with keys as field names. Struct @var{opt} can be created directly or by command @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. @end table @strong{Outputs} @table @var @item sys Discrete-time state-space model. @item x0 Initial state vector. If @var{dat} is a multi-experiment dataset, @var{x0} becomes a cell vector containing an initial state vector for each experiment. @item info Struct containing additional information. @table @var @item info.K Kalman gain matrix. @item info.Q State covariance matrix. @item info.Ry Output covariance matrix. @item info.S State-output cross-covariance matrix. @item info.L Noise variance matrix factor. LL'=Ry. @end table @end table @strong{Option Keys and Values} @table @var @item 'n' The desired order of the resulting state-space system @var{sys}. @var{s} > @var{n} > 0. @item 's' The number of block rows @var{s} in the input and output block Hankel matrices to be processed. @var{s} > 0. In the MOESP theory, @var{s} should be larger than @var{n}, the estimated dimension of state vector. @item 'alg', 'algorithm' Specifies the algorithm for computing the triangular factor R, as follows: @table @var @item 'C' Cholesky algorithm applied to the correlation matrix of the input-output data. Default method. @item 'F' Fast QR algorithm. @item 'Q' QR algorithm applied to the concatenated block Hankel matrices. @end table @item 'tol' Absolute tolerance used for determining an estimate of the system order. If @var{tol} >= 0, the estimate is indicated by the index of the last singular value greater than or equal to @var{tol}. (Singular values less than @var{tol} are considered as zero.) When @var{tol} = 0, an internally computed default value, @var{tol} = @var{s}*@var{eps}*SV(1), is used, where SV(1) is the maximal singular value, and @var{eps} is the relative machine precision. When @var{tol} < 0, the estimate is indicated by the index of the singular value that has the largest logarithmic gap to its successor. Default value is 0. @item 'rcond' The tolerance to be used for estimating the rank of matrices. If the user sets @var{rcond} > 0, the given value of @var{rcond} is used as a lower bound for the reciprocal condition number; an m-by-n matrix whose estimated condition number is less than 1/@var{rcond} is considered to be of full rank. If the user sets @var{rcond} <= 0, then an implicitly computed, default tolerance, defined by @var{rcond} = m*n*@var{eps}, is used instead, where @var{eps} is the relative machine precision. Default value is 0. @item 'confirm' Specifies whether or not the user's confirmation of the system order estimate is desired, as follows: @table @var @item true User's confirmation. @item false No confirmation. Default value. @end table @item 'noiseinput' The desired type of noise input channels. @table @var @item 'n' No error inputs. Default value. @iftex @tex $$ x_{k+1} = A x_k + B u_k $$ $$ y_k = C x_k + D u_k $$ @end tex @end iftex @ifnottex @example x[k+1] = A x[k] + B u[k] y[k] = C x[k] + D u[k] @end example @end ifnottex @item 'e' Return @var{sys} as a (p-by-m+p) state-space model with both measured input channels u and noise channels e with covariance matrix @var{Ry}. @iftex @tex $$ x_{k+1} = A x_k + B u_k + K e_k $$ $$ y_k = C x_k + D u_k + e_k $$ @end tex @end iftex @ifnottex @example x[k+1] = A x[k] + B u[k] + K e[k] y[k] = C x[k] + D u[k] + e[k] @end example @end ifnottex @item 'v' Return @var{sys} as a (p-by-m+p) state-space model with both measured input channels u and white noise channels v with identity covariance matrix. @iftex @tex $$ x_{k+1} = A x_k + B u_k + K L v_k $$ $$ y_k = C x_k + D u_k + L v_k $$ $$ e = L v, \ L L^T = R_y $$ @end tex @end iftex @ifnottex @example x[k+1] = A x[k] + B u[k] + K L v[k] y[k] = C x[k] + D u[k] + L v[k] e = L v, L L' = Ry @end example @end ifnottex @item 'k' Return @var{sys} as a Kalman predictor for simulation. @iftex @tex $$ \widehat{x}_{k+1} = A \widehat{x}_k + B u_k + K (y_k - \widehat{y}_k) $$ $$ \widehat{y}_k = C \widehat{x}_k + D u_k $$ @end tex @end iftex @ifnottex @example ^ ^ ^ x[k+1] = A x[k] + B u[k] + K(y[k] - y[k]) ^ ^ y[k] = C x[k] + D u[k] @end example @end ifnottex @iftex @tex $$ \widehat{x}_{k+1} = (A-KC) \widehat{x}_k + (B-KD) u_k + K y_k $$ $$ \widehat{y}_k = C \widehat{x}_k + D u_k + 0 y_k $$ @end tex @end iftex @ifnottex @example ^ ^ x[k+1] = (A-KC) x[k] + (B-KD) u[k] + K y[k] ^ ^ y[k] = C x[k] + D u[k] + 0 y[k] @end example @end ifnottex @end table @end table @strong{Algorithm}@* Uses SLICOT IB01AD, IB01BD and IB01CD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @section moesp @findex moesp @deftypefn {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moesp (@var{dat}, @dots{}) @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moesp (@var{dat}, @var{n}, @dots{}) @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moesp (@var{dat}, @var{opt}, @dots{}) @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moesp (@var{dat}, @var{n}, @var{opt}, @dots{}) Estimate state-space model using @acronym{MOESP} algorithm. @acronym{MOESP}: Multivariable Output Error State sPace. If no output arguments are given, the singular values are plotted on the screen in order to estimate the system order. @strong{Inputs} @table @var @item dat iddata set containing the measurements, i.e. time-domain signals. @item n The desired order of the resulting state-space system @var{sys}. If not specified, @var{n} is chosen automatically according to the singular values and tolerances. @item @dots{} Optional pairs of keys and values. @code{'key1', value1, 'key2', value2}. @item opt Optional struct with keys as field names. Struct @var{opt} can be created directly or by command @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. @end table @strong{Outputs} @table @var @item sys Discrete-time state-space model. @item x0 Initial state vector. If @var{dat} is a multi-experiment dataset, @var{x0} becomes a cell vector containing an initial state vector for each experiment. @item info Struct containing additional information. @table @var @item info.K Kalman gain matrix. @item info.Q State covariance matrix. @item info.Ry Output covariance matrix. @item info.S State-output cross-covariance matrix. @item info.L Noise variance matrix factor. LL'=Ry. @end table @end table @strong{Option Keys and Values} @table @var @item 'n' The desired order of the resulting state-space system @var{sys}. @var{s} > @var{n} > 0. @item 's' The number of block rows @var{s} in the input and output block Hankel matrices to be processed. @var{s} > 0. In the MOESP theory, @var{s} should be larger than @var{n}, the estimated dimension of state vector. @item 'alg', 'algorithm' Specifies the algorithm for computing the triangular factor R, as follows: @table @var @item 'C' Cholesky algorithm applied to the correlation matrix of the input-output data. Default method. @item 'F' Fast QR algorithm. @item 'Q' QR algorithm applied to the concatenated block Hankel matrices. @end table @item 'tol' Absolute tolerance used for determining an estimate of the system order. If @var{tol} >= 0, the estimate is indicated by the index of the last singular value greater than or equal to @var{tol}. (Singular values less than @var{tol} are considered as zero.) When @var{tol} = 0, an internally computed default value, @var{tol} = @var{s}*@var{eps}*SV(1), is used, where SV(1) is the maximal singular value, and @var{eps} is the relative machine precision. When @var{tol} < 0, the estimate is indicated by the index of the singular value that has the largest logarithmic gap to its successor. Default value is 0. @item 'rcond' The tolerance to be used for estimating the rank of matrices. If the user sets @var{rcond} > 0, the given value of @var{rcond} is used as a lower bound for the reciprocal condition number; an m-by-n matrix whose estimated condition number is less than 1/@var{rcond} is considered to be of full rank. If the user sets @var{rcond} <= 0, then an implicitly computed, default tolerance, defined by @var{rcond} = m*n*@var{eps}, is used instead, where @var{eps} is the relative machine precision. Default value is 0. @item 'confirm' Specifies whether or not the user's confirmation of the system order estimate is desired, as follows: @table @var @item true User's confirmation. @item false No confirmation. Default value. @end table @item 'noiseinput' The desired type of noise input channels. @table @var @item 'n' No error inputs. Default value. @iftex @tex $$ x_{k+1} = A x_k + B u_k $$ $$ y_k = C x_k + D u_k $$ @end tex @end iftex @ifnottex @example x[k+1] = A x[k] + B u[k] y[k] = C x[k] + D u[k] @end example @end ifnottex @item 'e' Return @var{sys} as a (p-by-m+p) state-space model with both measured input channels u and noise channels e with covariance matrix @var{Ry}. @iftex @tex $$ x_{k+1} = A x_k + B u_k + K e_k $$ $$ y_k = C x_k + D u_k + e_k $$ @end tex @end iftex @ifnottex @example x[k+1] = A x[k] + B u[k] + K e[k] y[k] = C x[k] + D u[k] + e[k] @end example @end ifnottex @item 'v' Return @var{sys} as a (p-by-m+p) state-space model with both measured input channels u and white noise channels v with identity covariance matrix. @iftex @tex $$ x_{k+1} = A x_k + B u_k + K L v_k $$ $$ y_k = C x_k + D u_k + L v_k $$ $$ e = L v, \ L L^T = R_y $$ @end tex @end iftex @ifnottex @example x[k+1] = A x[k] + B u[k] + K L v[k] y[k] = C x[k] + D u[k] + L v[k] e = L v, L L' = Ry @end example @end ifnottex @item 'k' Return @var{sys} as a Kalman predictor for simulation. @iftex @tex $$ \widehat{x}_{k+1} = A \widehat{x}_k + B u_k + K (y_k - \widehat{y}_k) $$ $$ \widehat{y}_k = C \widehat{x}_k + D u_k $$ @end tex @end iftex @ifnottex @example ^ ^ ^ x[k+1] = A x[k] + B u[k] + K(y[k] - y[k]) ^ ^ y[k] = C x[k] + D u[k] @end example @end ifnottex @iftex @tex $$ \widehat{x}_{k+1} = (A-KC) \widehat{x}_k + (B-KD) u_k + K y_k $$ $$ \widehat{y}_k = C \widehat{x}_k + D u_k + 0 y_k $$ @end tex @end iftex @ifnottex @example ^ ^ x[k+1] = (A-KC) x[k] + (B-KD) u[k] + K y[k] ^ ^ y[k] = C x[k] + D u[k] + 0 y[k] @end example @end ifnottex @end table @end table @strong{Algorithm}@* Uses SLICOT IB01AD, IB01BD and IB01CD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @section n4sid @findex n4sid @deftypefn {Function File} {[@var{sys}, @var{x0}, @var{info}] =} n4sid (@var{dat}, @dots{}) @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} n4sid (@var{dat}, @var{n}, @dots{}) @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} n4sid (@var{dat}, @var{opt}, @dots{}) @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} n4sid (@var{dat}, @var{n}, @var{opt}, @dots{}) Estimate state-space model using @acronym{N4SID} algorithm. @acronym{N4SID}: Numerical algorithm for Subspace State Space System IDentification. If no output arguments are given, the singular values are plotted on the screen in order to estimate the system order. @strong{Inputs} @table @var @item dat iddata set containing the measurements, i.e. time-domain signals. @item n The desired order of the resulting state-space system @var{sys}. If not specified, @var{n} is chosen automatically according to the singular values and tolerances. @item @dots{} Optional pairs of keys and values. @code{'key1', value1, 'key2', value2}. @item opt Optional struct with keys as field names. Struct @var{opt} can be created directly or by command @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. @end table @strong{Outputs} @table @var @item sys Discrete-time state-space model. @item x0 Initial state vector. If @var{dat} is a multi-experiment dataset, @var{x0} becomes a cell vector containing an initial state vector for each experiment. @item info Struct containing additional information. @table @var @item info.K Kalman gain matrix. @item info.Q State covariance matrix. @item info.Ry Output covariance matrix. @item info.S State-output cross-covariance matrix. @item info.L Noise variance matrix factor. LL'=Ry. @end table @end table @strong{Option Keys and Values} @table @var @item 'n' The desired order of the resulting state-space system @var{sys}. @var{s} > @var{n} > 0. @item 's' The number of block rows @var{s} in the input and output block Hankel matrices to be processed. @var{s} > 0. In the MOESP theory, @var{s} should be larger than @var{n}, the estimated dimension of state vector. @item 'alg', 'algorithm' Specifies the algorithm for computing the triangular factor R, as follows: @table @var @item 'C' Cholesky algorithm applied to the correlation matrix of the input-output data. Default method. @item 'F' Fast QR algorithm. @item 'Q' QR algorithm applied to the concatenated block Hankel matrices. @end table @item 'tol' Absolute tolerance used for determining an estimate of the system order. If @var{tol} >= 0, the estimate is indicated by the index of the last singular value greater than or equal to @var{tol}. (Singular values less than @var{tol} are considered as zero.) When @var{tol} = 0, an internally computed default value, @var{tol} = @var{s}*@var{eps}*SV(1), is used, where SV(1) is the maximal singular value, and @var{eps} is the relative machine precision. When @var{tol} < 0, the estimate is indicated by the index of the singular value that has the largest logarithmic gap to its successor. Default value is 0. @item 'rcond' The tolerance to be used for estimating the rank of matrices. If the user sets @var{rcond} > 0, the given value of @var{rcond} is used as a lower bound for the reciprocal condition number; an m-by-n matrix whose estimated condition number is less than 1/@var{rcond} is considered to be of full rank. If the user sets @var{rcond} <= 0, then an implicitly computed, default tolerance, defined by @var{rcond} = m*n*@var{eps}, is used instead, where @var{eps} is the relative machine precision. Default value is 0. @item 'confirm' Specifies whether or not the user's confirmation of the system order estimate is desired, as follows: @table @var @item true User's confirmation. @item false No confirmation. Default value. @end table @item 'noiseinput' The desired type of noise input channels. @table @var @item 'n' No error inputs. Default value. @iftex @tex $$ x_{k+1} = A x_k + B u_k $$ $$ y_k = C x_k + D u_k $$ @end tex @end iftex @ifnottex @example x[k+1] = A x[k] + B u[k] y[k] = C x[k] + D u[k] @end example @end ifnottex @item 'e' Return @var{sys} as a (p-by-m+p) state-space model with both measured input channels u and noise channels e with covariance matrix @var{Ry}. @iftex @tex $$ x_{k+1} = A x_k + B u_k + K e_k $$ $$ y_k = C x_k + D u_k + e_k $$ @end tex @end iftex @ifnottex @example x[k+1] = A x[k] + B u[k] + K e[k] y[k] = C x[k] + D u[k] + e[k] @end example @end ifnottex @item 'v' Return @var{sys} as a (p-by-m+p) state-space model with both measured input channels u and white noise channels v with identity covariance matrix. @iftex @tex $$ x_{k+1} = A x_k + B u_k + K L v_k $$ $$ y_k = C x_k + D u_k + L v_k $$ $$ e = L v, \ L L^T = R_y $$ @end tex @end iftex @ifnottex @example x[k+1] = A x[k] + B u[k] + K L v[k] y[k] = C x[k] + D u[k] + L v[k] e = L v, L L' = Ry @end example @end ifnottex @item 'k' Return @var{sys} as a Kalman predictor for simulation. @iftex @tex $$ \widehat{x}_{k+1} = A \widehat{x}_k + B u_k + K (y_k - \widehat{y}_k) $$ $$ \widehat{y}_k = C \widehat{x}_k + D u_k $$ @end tex @end iftex @ifnottex @example ^ ^ ^ x[k+1] = A x[k] + B u[k] + K(y[k] - y[k]) ^ ^ y[k] = C x[k] + D u[k] @end example @end ifnottex @iftex @tex $$ \widehat{x}_{k+1} = (A-KC) \widehat{x}_k + (B-KD) u_k + K y_k $$ $$ \widehat{y}_k = C \widehat{x}_k + D u_k + 0 y_k $$ @end tex @end iftex @ifnottex @example ^ ^ x[k+1] = (A-KC) x[k] + (B-KD) u[k] + K y[k] ^ ^ y[k] = C x[k] + D u[k] + 0 y[k] @end example @end ifnottex @end table @end table @strong{Algorithm}@* Uses SLICOT IB01AD, IB01BD and IB01CD by courtesy of @uref{http://www.slicot.org, NICONET e.V.} @end deftypefn @chapter Overloaded LTI Operators @section @@lti/ctranspose @findex ctranspose Conjugate transpose or pertransposition of @acronym{LTI} objects. Used by Octave for "sys'". For a transfer-function matrix G, G' denotes the conjugate of G given by G.'(-s) for a continuous-time system or G.'(1/z) for a discrete-time system. The frequency response of the pertransposition of G is the Hermitian (conjugate) transpose of G(jw), i.e. freqresp (G', w) = freqresp (G, w)'. @strong{WARNING:} Do @strong{NOT} use this for dual problems, use the transpose "sys.'" (note the dot) instead. @section @@lti/end @findex end End indexing for @acronym{LTI} objects. Used by Octave for "sys(1:end, end-1)". @section @@lti/horzcat @findex horzcat Horizontal concatenation of @acronym{LTI} objects. If necessary, object conversion is done by sys_group. Used by Octave for "[sys1, sys2]". @section @@lti/inv @findex inv Inversion of @acronym{LTI} objects. @section @@lti/minus @findex minus Binary subtraction of @acronym{LTI} objects. If necessary, object conversion is done by sys_group. Used by Octave for "sys1 - sys2". @section @@lti/mldivide @findex mldivide Matrix left division of @acronym{LTI} objects. If necessary, object conversion is done by sys_group in mtimes. Used by Octave for "sys1 \ sys2". @section @@lti/mpower @findex mpower Matrix power of @acronym{LTI} objects. The exponent must be an integer. Used by Octave for "sys^int". @section @@lti/mrdivide @findex mrdivide Matrix right division of @acronym{LTI} objects. If necessary, object conversion is done by sys_group in mtimes. Used by Octave for "sys1 / sys2". @section @@lti/mtimes @findex mtimes Matrix multiplication of @acronym{LTI} objects. If necessary, object conversion is done by sys_group. Used by Octave for "sys1 * sys2". @section @@lti/plus @findex plus Binary addition of @acronym{LTI} objects. If necessary, object conversion is done by sys_group. Used by Octave for "sys1 + sys2". Operation is also known as "parallel connection". @section @@lti/subsasgn @findex subsasgn Subscripted assignment for @acronym{LTI} objects. Used by Octave for "sys.property = value". @section @@lti/subsref @findex subsref Subscripted reference for @acronym{LTI} objects. Used by Octave for "sys = sys(2:4, :)" or "val = sys.prop". @section @@lti/transpose @findex transpose Transpose of @acronym{LTI} objects. Used by Octave for "sys.'". Useful for dual problems, i.e. controllability and observability or designing estimator gains with @command{lqr} and @command{place}. @section @@lti/uminus @findex uminus Unary minus of @acronym{LTI} object. Used by Octave for "-sys". @section @@lti/uplus @findex uplus Unary plus of @acronym{LTI} object. Used by Octave for "+sys". @section @@lti/vertcat @findex vertcat Vertical concatenation of @acronym{LTI} objects. If necessary, object conversion is done by sys_group. Used by Octave for "[sys1; sys2]". @chapter Overloaded IDDATA Operators @section @@iddata/end @findex end End indexing for @acronym{IDDATA} objects. Used by Octave for "dat(1:end)". @section @@iddata/horzcat @findex horzcat @deftypefn {Function File} {@var{dat} =} horzcat (@var{dat1}, @var{dat2}, @dots{}) Horizontal concatenation of iddata datasets. The outputs and inputs are concatenated in the following way: @code{dat.y@{e@} = [dat1.y@{e@}, dat2.y@{e@}, @dots{}]} @code{dat.u@{e@} = [dat1.u@{e@}, dat2.u@{e@}, @dots{}]} where @var{e} denotes the experiment. The number of experiments and samples must be equal for all datasets. @end deftypefn @section @@iddata/subsasgn @findex subsasgn Subscripted assignment for iddata objects. Used by Octave for "dat.property = value". @section @@iddata/subsref @findex subsref Subscripted reference for iddata objects. Used by Octave for "dat = dat(2:4, :)" or "val = dat.prop". @section @@iddata/vertcat @findex vertcat @deftypefn {Function File} {@var{dat} =} vertcat (@var{dat1}, @var{dat2}, @dots{}) Vertical concatenation of iddata datasets. The samples are concatenated in the following way: @code{dat.y@{e@} = [dat1.y@{e@}; dat2.y@{e@}; @dots{}]} @code{dat.u@{e@} = [dat1.u@{e@}; dat2.u@{e@}; @dots{}]} where @var{e} denotes the experiment. The number of experiments, outputs and inputs must be equal for all datasets. @end deftypefn @chapter Miscellaneous @section db2mag @findex db2mag @deftypefn {Function File} {@var{mag} =} db2mag (@var{db}) Convert Decibels (dB) to Magnitude. @strong{Inputs} @table @var @item db Decibel (dB) value(s). Both real-valued scalars and matrices are accepted. @end table @strong{Outputs} @table @var @item mag Magnitude value(s). @end table @seealso{mag2db} @end deftypefn @section mag2db @findex mag2db @deftypefn {Function File} {@var{db} =} mag2db (@var{mag}) Convert Magnitude to Decibels (dB). @strong{Inputs} @table @var @item mag Magnitude value(s). Both real-valued scalars and matrices are accepted. @end table @strong{Outputs} @table @var @item db Decibel (dB) value(s). @end table @seealso{db2mag} @end deftypefn @section options @findex options @deftypefn{Function File} {@var{opt} =} options (@var{'key1'}, @var{value1}, @var{'key2'}, @var{value2}, @dots{}) Create options struct @var{opt} from a number of key and value pairs. For use with order reduction and system identification functions. Option structs are a way to avoid typing the same key and value pairs over and over again. @strong{Inputs} @table @var @item key, property The name of the property. @item value The value of the property. @end table @strong{Outputs} @table @var @item opt Struct with fields for each key. @end table @strong{Example} @example @group octave:1> opt = options ("method", "spa", "tol", 1e-6) opt = scalar structure containing the fields: method = spa tol = 1.0000e-06 @end group @end example @example @group octave:2> save filename opt octave:3> # save the struct 'opt' to file 'filename' for later use octave:4> load filename octave:5> # load struct 'opt' from file 'filename' @end group @end example @end deftypefn @section strseq @findex strseq @deftypefn {Function File} {@var{strvec} =} strseq (@var{str}, @var{idx}) Return a cell vector of indexed strings by appending the indices @var{idx} to the string @var{str}. @example strseq ("x", 1:3) = @{"x1"; "x2"; "x3"@} strseq ("u", [1, 2, 5]) = @{"u1"; "u2"; "u5"@} @end example @end deftypefn @section test_control @findex test_control @deftypefn {Script File} {} test_control Execute all available tests at once. The Octave control package is based on the @uref{http://www.slicot.org, @acronym{SLICOT}} library. @acronym{SLICOT} needs @acronym{BLAS} and @acronym{LAPACK} libraries which are also prerequisites for Octave itself. In case of failing tests, it is highly recommended to use @uref{http://www.netlib.org/blas/, Netlib's reference @acronym{BLAS}} and @uref{http://www.netlib.org/lapack/, @acronym{LAPACK}} for building Octave. Using @acronym{ATLAS} may lead to sign changes in some entries of the state-space matrices. In general, these sign changes are not 'wrong' and can be regarded as the result of state transformations. Such state transformations (but not input/output transformations) have no influence on the input-output behaviour of the system. For better numerics, the control package uses such transformations by default when calculating the frequency responses and a few other things. However, arguments like the Hankel singular Values (@acronym{HSV}) must not change. Differing @acronym{HSV}s and failing algorithms are known for using Framework Accelerate from Mac OS X 10.7. @end deftypefn @section thiran @findex thiran @deftypefn {Function File} {@var{sys} =} thiran (@var{tau}, @var{tsam}) Approximation of continuous-time delay using a discrete-time allpass Thiran filter. Thiran filters can approximate continuous-time delays that are non-integer multiples of the sampling time (fractional delays). This approximation gives a better matching of the phase shift between the continuous- and the discrete-time system. If there is no fractional part in the delay, then the standard discrete-time delay representation is used. @strong{Inputs} @table @var @item tau A continuous-time delay, given in time units (seconds). @item tsam The sampling time of the resulting Thiran filter. @end table @strong{Outputs} @table @var @item sys Transfer function model of the resulting filter. The order of the filter is determined automatically. @end table @strong{Example} @example @group octave:1> sys = thiran (1.33, 0.5) Transfer function 'sys' from input 'u1' to output ... 0.003859 z^3 - 0.03947 z^2 + 0.2787 z + 1 y1: ----------------------------------------- z^3 + 0.2787 z^2 - 0.03947 z + 0.003859 Sampling time: 0.5 s Discrete-time model. @end group @end example @example @group octave:2> sys = thiran (1, 0.5) Transfer function 'sys' from input 'u1' to output ... 1 y1: --- z^2 Sampling time: 0.5 s Discrete-time model. @end group @end example @seealso{absorbdelay, pade} @end deftypefn @section BMWengine @findex BMWengine @deftypefn{Function File} {@var{sys} =} BMWengine () @deftypefnx{Function File} {@var{sys} =} BMWengine (@var{"scaled"}) @deftypefnx{Function File} {@var{sys} =} BMWengine (@var{"unscaled"}) Model of the BMW 4-cylinder engine at ETH Zurich's control laboratory. @example @group OPERATING POINT Drosselklappenstellung alpha_DK = 10.3 Grad Saugrohrdruck p_s = 0.48 bar Motordrehzahl n = 860 U/min Lambda-Messwert lambda = 1.000 Relativer Wandfilminhalt nu = 1 @end group @end example @example @group INPUTS U_1 Sollsignal Drosselklappenstellung [Grad] U_2 Relative Einspritzmenge [-] U_3 Zuendzeitpunkt [Grad KW] M_L Lastdrehmoment [Nm] @end group @end example @example @group STATES X_1 Drosselklappenstellung [Grad] X_2 Saugrohrdruck [bar] X_3 Motordrehzahl [U/min] X_4 Messwert Lamba-Sonde [-] X_5 Relativer Wandfilminhalt [-] @end group @end example @example @group OUTPUTS Y_1 Motordrehzahl [U/min] Y_2 Messwert Lambda-Sonde [-] @end group @end example @example @group SCALING U_1N, X_1N 1 Grad U_2N, X_4N, X_5N, Y_2N 0.05 U_3N 1.6 Grad KW X_2N 0.05 bar X_3N, Y_1N 200 U/min @end group @end example @end deftypefn @section Boeing707 @findex Boeing707 @deftypefn {Function File} {@var{sys} =} Boeing707 () Creates a linearized state-space model of a Boeing 707-321 aircraft at @var{v}=80 m/s @iftex @tex ($M = 0.26$, $G_{a0} = -3^{\circ}$, ${\alpha}_0 = 4^{\circ}$, ${\kappa}= 50^{\circ}$). @end tex @end iftex @ifnottex (@var{M} = 0.26, @var{Ga0} = -3 deg, @var{alpha0} = 4 deg, @var{kappa} = 50 deg). @end ifnottex System inputs: (1) thrust and (2) elevator angle. System outputs: (1) airspeed and (2) pitch angle. @strong{Reference}: R. Brockhaus: @cite{Flugregelung} (Flight Control), Springer, 1994. @end deftypefn @section WestlandLynx @findex WestlandLynx @deftypefn{Function File} {@var{sys} =} WestlandLynx () Model of the Westland Lynx Helicopter about hover. @example @group INPUTS main rotor collective longitudinal cyclic lateral cyclic tail rotor collective @end group @end example @example @group STATES pitch attitude theta [rad] roll attitude phi [rad] roll rate (body-axis) p [rad/s] pitch rate (body-axis) q [rad/s] yaw rate xi [rad/s] forward velocity v_x [ft/s] lateral velocity v_y [ft/s] vertical velocity v_z [ft/s] @end group @end example @example @group OUTPUTS heave velocity H_dot [ft/s] pitch attitude theta [rad] roll attitude phi [rad] heading rate psi_dot [rad/s] roll rate p [rad/s] pitch rate q [rad/s] @end group @end example @strong{References}@* [1] Skogestad, S. and Postlethwaite I. (2005) @cite{Multivariable Feedback Control: Analysis and Design: Second Edition}. Wiley. @url{http://www.nt.ntnu.no/users/skoge/book/2nd_edition/matlab_m/matfiles.html} @end deftypefn control/doc/gpl.texi0000644000076500000240000010433012273411257013767 0ustar lukasstaff@node Copying @appendix GNU General Public License @cindex warranty @cindex copyright @center Version 3, 29 June 2007 @display Copyright @copyright{} 2007 Free Software Foundation, Inc. @url{http://fsf.org/} Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @end display @heading 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. @heading TERMS AND CONDITIONS @enumerate 0 @item 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. @item 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. @item 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. @item 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. @item 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. @item 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: @enumerate a @item The work must carry prominent notices stating that you modified it, and giving a relevant date. @item 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''. @item 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. @item 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. @end enumerate 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. @item 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: @enumerate a @item 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. @item 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. @item 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. @item 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. @item 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. @end enumerate 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. @item 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: @enumerate a @item Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or @item 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 @item 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 @item Limiting the use for publicity purposes of names of licensors or authors of the material; or @item Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or @item 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. @end enumerate 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. @item 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. @item 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. @item 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. @item 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. @item 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. @item 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. @item 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. @item 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. @item 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. @item 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 enumerate @heading END OF TERMS AND CONDITIONS @heading 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. @smallexample @var{one line to give the program's name and a brief idea of what it does.} Copyright (C) @var{year} @var{name of author} 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 @url{http://www.gnu.org/licenses/}. @end smallexample 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: @smallexample @var{program} Copyright (C) @var{year} @var{name of author} This program comes with ABSOLUTELY NO WARRANTY; for details type @samp{show w}. This is free software, and you are welcome to redistribute it under certain conditions; type @samp{show c} for details. @end smallexample The hypothetical commands @samp{show w} and @samp{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 @url{http://www.gnu.org/licenses/}. 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 @url{http://www.gnu.org/philosophy/why-not-lgpl.html}. control/doc/octave_forge_specific_api.txt0000644000076500000240000000147612273411256020222 0ustar lukasstaffisstable (sys, tol) # feedback (sys) # equivalent to feedback (sys, eye (size (sys))) feedback (sys, "+") # equivalent to feedback (sys, eye (size (sys)), +1) H = sys(w) # equivalent to H = freqresp (sys, w) where w is a frequency vector place (sys, p, alpha) # If parameter alpha is specified, poles with real parts place (a, b, p, alpha) # (continuous time) or moduli (discrete time) below alpha # are left untouched. sminreal (sys, tol) # Optional tolerance for controllability and observability. # Entries of the state-space matrices whose moduli are less or # equal to TOL are assumed to be zero. Default value is 0. frd (sys) # calculate interesting frequency range by the zeros and poles of SYS.control/doc/references.txt0000644000076500000240000000207612273411256015177 0ustar lukasstaffREFERENCES ********** German ****** Geering, H.P. Regelungstechnik Springer 2004 Meyer, M. Signalverarbeitung Vieweg & Teubner 2009 English ******* Anderson, B.D.O. and Moore, J.B. Optimal Control Linear Quadratic Methods Dover Publications 1990 Astrm, K. and Hgglund, T. PID Controllers Theory, Design and Tuning Second Edition Instrument Society of America 1995 Doyle, J.C., Francis, B.A. and Tannenbaum, A.R. Feedback Control Theory Dover Publications 1992 Geering, H.P. Optimal Control with Engineering Applications Springer 2007 Gu, D.W., Petkov, P.Hr. and Konstantinov, M.M. Robust Control with MATLAB Springer 2005 Guzzella, L. Analysis and Design of SISO Control Systems VDF Hochschulverlag ETH Zurich 2007 Kailath, T. Linear Systems Prentice Hall 1980 Leigh, J.R. Applied Digital Control Theory, Design and Implementation Second Edition Dover Publications 1992 Ljung, L. System Identification Theory for the User Second Edition Prentice Hall 1999 Skogestad, S. and Postlethwaite, I. Multivariable Feedback Control Analysis and Design Second Edition Wiley 2005 control/doc/slicot_readme.txt0000644000076500000240000000531612273411256015670 0ustar lukasstaffImportant ********* If you encounter any bugs in the octave control package, please DONT bother the great people behind SLICOT. Most likely it's a problem of the control package, not the proven SLICOT library. Therefore, please send any reports to the octave mailing list and the maintainer of the control package. See the file packinfo/DESCRIPTION for the current maintainer of the control package and his mail address. Acknowledgments *************** LTI SYNCOPE - LTI SYstems aNd COntrol PackagE - is ever-increasingly based on SLICOT subroutines by courtesy of the Numerics In COntrol NETwork NICONET e.V. . Abstract ******** SLICOT is a Fortran 77 subroutine library for systems and control, distributed under GPL, developed by NICONET e.V., and available at . Commercial use requires specialized license models. SLICOT Readme ************* SLICOT - Subroutine Library In COntrol Theory - is a general purpose basic mathematical library for control theoretical computations. The library provides tools to perform essential system analysis and synthesis tasks. The main emphasis in SLICOT is on numerical reliability of implemented algorithms and the numerical robustness and efficiency of routines. Providing algorithmic flexibility and the use of rigorous implementation and documentation standards are other SLICOT features. The SLICOT Library is available as standard Fortran 77 code in double precision. Each user-callable subroutine for control computations is accompanied by an example program which illustrates the use of the subroutine and can act as a template for the user's own routines. The SLICOT Library is organized by chapters, sections and subsections. The following chapters are currently included: A : Analysis Routines B : Benchmark and Test Problems D : Data Analysis F : Filtering I : Identification M : Mathematical Routines N : Nonlinear Systems (not yet available, except for some auxiliary routines for Wiener systems) S : Synthesis Routines T : Transformation Routines U : Utility Routines The SLICOT Library is built on LAPACK (Linear Algebra PACKage) and BLAS (Basic Linear Algebra Subprograms) collections. Therefore, these packages should be available on the platform used. Basic References: 1. P. Benner, V. Mehrmann, V. Sima, S. Van Huffel, and A. Varga, "SLICOT - A Subroutine Library in Systems and Control Theory", Applied and Computational Control, Signals, and Circuits (Birkhauser), Vol. 1, Ch. 10, pp. 505-546, 1999. 2. S. Van Huffel, V. Sima, A. Varga, S. Hammarling, and F. Delebecque, "Development of High Performance Numerical Software for Control", IEEE Control Systems Magazine, Vol. 24, Nr. 1, Feb., pp. 60-76, 2004. control/INDEX0000644000076500000240000000415412273411256012341 0ustar lukasstaffcontrol >> Control Theory Examples MDSSystem optiPID Anderson Madievski Linear Time Invariant Models dss filt frd ss tf zpk Model Data Access @lti/dssdata @lti/filtdata @lti/frdata @lti/get @lti/set @lti/ssdata @lti/tfdata @lti/zpkdata Model Conversions @lti/c2d @lti/d2c @lti/d2d @lti/prescale @lti/xperm Model Interconnections @lti/append @lti/blkdiag @lti/connect @lti/feedback @lti/lft @lti/mconnect @lti/parallel @lti/series sumblk Model Characteristics ctrb ctrbf @lti/dcgain gram hsvd @lti/isct isctrb isdetectable @lti/isdt @lti/isminimumphase isobsv @lti/issiso isstabilizable @lti/isstable @lti/norm obsv obsvf @lti/pole pzmap @lti/size @lti/zero Model Simplification @lti/minreal @lti/sminreal Time Domain Analysis covar gensig impulse initial lsim ramp step Frequency Domain Analysis bode bodemag @lti/freqresp margin nichols nyquist sensitivity sigma Pole Placement place rlocus Optimal Control dlqe dlqr estim kalman lqe lqr Robust Control augw fitfrd h2syn hinfsyn mixsyn mktito ncfsyn Matrix Equation Solvers care dare dlyap dlyapchol lyap lyapchol Model Reduction bstmodred btamodred hnamodred spamodred Controller Reduction btaconred cfconred fwcfconred spaconred Experimental Data Handling iddata @iddata/cat @iddata/detrend @iddata/diff @iddata/fft @iddata/filter @iddata/get @iddata/ifft @iddata/merge @iddata/nkshift @iddata/plot @iddata/resample @iddata/set @iddata/size System Identification arx moen4 moesp n4sid Overloaded LTI Operators @lti/ctranspose @lti/end @lti/horzcat @lti/inv @lti/minus @lti/mldivide @lti/mpower @lti/mrdivide @lti/mtimes @lti/plus @lti/subsasgn @lti/subsref @lti/transpose @lti/uminus @lti/uplus @lti/vertcat Overloaded IDDATA Operators @iddata/end @iddata/horzcat @iddata/subsasgn @iddata/subsref @iddata/vertcat Miscellaneous db2mag mag2db options strseq test_control thiran BMWengine Boeing707 WestlandLynx control/inst/0000755000076500000240000000000012273411257012521 5ustar lukasstaffcontrol/inst/@frd/0000755000076500000240000000000012273411256013373 5ustar lukasstaffcontrol/inst/@frd/__c2d__.m0000644000076500000240000000211612273411256015015 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Convert the continuous FRD object into its discrete-time equivalent. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function sys = __c2d__ (sys, tsam, method = "zoh") error ("frd: c2d: conversion not possible"); ## NOTE: changing just the sampling time wouldn't make sense here endfunction control/inst/@frd/__ctranspose__.m0000644000076500000240000000210412273411256016523 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Conjugate transpose of FRD objects. ## Author: Lukas Reichlin ## Created: May 2012 ## Version: 0.1 function sys = __ctranspose__ (sys) [p, m, l] = size (sys.H); H = mat2cell (sys.H, p, m, ones (1, l))(:); H = cellfun (@ctranspose, H, "uniformoutput", false); sys.H = cat (3, H{:}); endfunction control/inst/@frd/__d2c__.m0000644000076500000240000000212012273411256015010 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Convert the discrete FRD object into its continuous-time equivalent. ## Author: Lukas Reichlin ## Created: September 2011 ## Version: 0.1 function sys = __d2c__ (sys, tsam, method = "zoh") error ("frd: d2c: conversion not possible"); ## NOTE: changing just the sampling time wouldn't make sense here endfunction control/inst/@frd/__freqresp__.m0000644000076500000240000000307212273411256016176 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Frequency response of FRD models :-) ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.3 function H = __freqresp__ (sys, w, cellflag = false) [H, w_sys, tsam] = frdata (sys, "array"); if (! isempty (w)) # freqresp (frdsys, w), sigma (frdsys, w), ... tol = sqrt (eps); w_idx = arrayfun (@(x) find (abs (w_sys - x) < tol), w, "uniformoutput", false); w_idx = vertcat (w_idx{:}); ## NOTE: There are problems when cellfun uses "uniformoutput", true ## and find returns an empty matrix, if (length (w_idx) != numel (w)) error ("frd: freqresp: some frequencies are not within tolerance %g", tol); endif H = H(:, :, w_idx); endif if (cellflag) [p, m, l] = size (H); H = mat2cell (H, p, m, ones (1, l))(:); endif endfunction control/inst/@frd/__get__.m0000644000076500000240000000225612273411256015131 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Access property values of FRD objects. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function val = __get__ (sys, prop) switch (prop) # {, } case {"h", "r", "resp", "response"} val = sys.H; case {"w", "f", "freq", "frequency"} val = sys.w; otherwise error ("frd: get: invalid property name '%s'", prop); endswitch endfunction control/inst/@frd/__minreal__.m0000644000076500000240000000176012273411256016000 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Minimal realization of FRD objects. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function sys = __minreal__ (sys, tol) warning ("frd: minreal: frequency responses are always minimal"); endfunction control/inst/@frd/__pole__.m0000644000076500000240000000170212273411256015304 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Poles of FRD object. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function pol = __pole__ (sys) error ("frd: pole: this is not possible"); endfunction control/inst/@frd/__property_names__.m0000644000076500000240000000311312273411256017412 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## 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 . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{props}, @var{vals}] =} __property_names__ (@var{sys}) ## @deftypefnx {Function File} {[@var{props}, @var{vals}] =} __property_names__ (@var{sys}, @var{"specific"}) ## Return the list of properties as well as the assignable values for a frd object sys. ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function [props, vals] = __property_names__ (sys, flg) ## cell vector of tf-specific properties props = {"H"; "w"}; ## cell vector of frd-specific assignable values vals = {"p-by-m-by-l array of complex frequency responses"; "l-by-1 vector of real frequencies (l = length (w))"}; if (nargin == 1) [ltiprops, ltivals] = __property_names__ (sys.lti); props = [props; ltiprops]; vals = [vals; ltivals]; endif endfunction control/inst/@frd/__set__.m0000644000076500000240000000252612273411256015145 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Set or modify properties of FRD objects. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function sys = __set__ (sys, prop, val) switch (prop) # {, } case {"h", "r", "resp", "response"} val = __adjust_frd_data__ (val, sys.w); __frd_dim__ (val, sys.w); sys.H = val; case {"w", "f", "freq", "frequency"} [~, val] = __adjust_frd_data__ (sys.H, val); __frd_dim__ (sys.H, val); sys.w = val; otherwise error ("frd: set: invalid property name '%s'", prop); endswitch endfunction control/inst/@frd/__sys2ss__.m0000644000076500000240000000207212273411256015614 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## FRD to SS conversion. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function [retsys, retlti] = __sys2ss__ (sys) error ("frd: frd2ss: system identification not implemented yet"); retsys = dss (a, b, c, d, e); retlti = sys.lti; # preserve lti properties endfunction control/inst/@frd/__sys2tf__.m0000644000076500000240000000220712273411256015600 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## FRD to TF conversion. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function [retsys, retlti] = __sys2tf__ (sys) error ("frd: frd2tf: system identification not implemented yet"); retsys = tf (num, den, get (sys, "tsam")); # tsam needed to set appropriate tfvar retlti = sys.lti; # preserve lti properties endfunction control/inst/@frd/__sys_connect__.m0000644000076500000240000000314612273411256016700 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{retsys} =} __sys_connect__ (@var{sys}, @var{M}) ## This function is part of the Model Abstraction Layer. No argument checking. ## For internal use only. ## @example ## @group ## Problem: Solve the system equations of ## Y(s) = G(s) E(s) ## E(s) = U(s) + M Y(s) ## in order to build ## Y(s) = H(s) U(s) ## Solution: ## Y(s) = G(s) [U(s) + M Y(s)] ## Y(s) = G(s) U(s) + G(s) M Y(s) ## Y(s) = [I - G(s) M]^-1 G(s) U(s) ## \_______ _______/ ## H(s) ## @end group ## @end example ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function sys = __sys_connect__ (sys, M) [p, m, l] = size (sys.H); I = eye (p); H = mat2cell (sys.H, p, m, ones (1, l))(:); H = cellfun (@(x) (I - x*M) \ x, H, "uniformoutput", false); sys.H = cat (3, H{:}); endfunction control/inst/@frd/__sys_data__.m0000644000076500000240000000171712273411256016162 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Used by frdata instead of multiple get calls. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function [H, w] = __sys_data__ (sys) H = sys.H; w = sys.w; endfunction control/inst/@frd/__sys_group__.m0000644000076500000240000000440612273411256016403 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Block diagonal concatenation of two FRD models. ## This file is part of the Model Abstraction Layer. ## For internal use only. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.2 function retsys = __sys_group__ (sys1, sys2) if (! isa (sys1, "frd")) sys1 = frd (sys1, sys2.w); endif if (! isa (sys2, "frd")) sys2 = frd (sys2, sys1.w); endif retsys = frd (); retsys.lti = __lti_group__ (sys1.lti, sys2.lti); lw1 = length (sys1.w); lw2 = length (sys2.w); [p1, m1, l1] = size (sys1.H); [p2, m2, l2] = size (sys2.H); ## TODO: tolerances for frequencies, i.e. don't check for equality ## find intersection of frequency vectors if (lw1 == lw2 && all (sys1.w == sys2.w)) # identical frequency vectors retsys.w = sys1.w; H1 = sys1.H; H2 = sys2.H; else # differing frequency vectors ## find common frequencies retsys.w = w = intersect (sys1.w, sys2.w); ## indices of common frequencies w1_idx = arrayfun (@(x) find (sys1.w == x), w); w2_idx = arrayfun (@(x) find (sys2.w == x), w); ## extract common responses H1 = sys1.H(:, :, w1_idx); H2 = sys2.H(:, :, w2_idx); endif ## block-diagonal concatenation lw = length (retsys.w); z12 = zeros (p1, m2); z21 = zeros (p2, m1); H1 = mat2cell (H1, p1, m1, ones (1, lw))(:); H2 = mat2cell (H2, p2, m2, ones (1, lw))(:); H = cellfun (@(x, y) [x, z12; z21, y], H1, H2, "uniformoutput", false); retsys.H = cat (3, H{:}); endfunction control/inst/@frd/__sys_inverse__.m0000644000076500000240000000207012273411256016715 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Inversion of FRD objects. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function sys = __sys_inverse__ (sys) [p, m, l] = size (sys.H); H = mat2cell (sys.H, p, m, ones (1, l))(:); H = cellfun (@inv, H, "uniformoutput", false); sys.H = cat (3, H{:}); endfunction control/inst/@frd/__sys_prune__.m0000644000076500000240000000223112273411256016372 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Submodel extraction and reordering for FRD objects. ## This file is part of the Model Abstraction Layer. ## For internal use only. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function sys = __sys_prune__ (sys, out_idx, in_idx, w_idx = ":") [sys.lti, out_idx, in_idx] = __lti_prune__ (sys.lti, out_idx, in_idx); sys.H = sys.H(out_idx, in_idx, w_idx); endfunction control/inst/@frd/__transpose__.m0000644000076500000240000000207412273411256016366 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Transpose of FRD objects. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function sys = __transpose__ (sys) [p, m, l] = size (sys.H); H = mat2cell (sys.H, p, m, ones (1, l))(:); H = cellfun (@transpose, H, "uniformoutput", false); sys.H = cat (3, H{:}); endfunction control/inst/@frd/__zero__.m0000644000076500000240000000173512273411256015332 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Transmission zeros of FRD object. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function [zer, gain, info] = __zero__ (sys) error ("frd: zero: this is not possible"); endfunction control/inst/@frd/display.m0000644000076500000240000000710612273411256015222 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Display routine for FRD objects. ## Author: Lukas Reichlin ## Created: February 2010 ## Version: 0.2 function display (sys) sysname = inputname (1); [inname, outname, tsam] = __lti_data__ (sys.lti); [inname, m] = __labels__ (inname, "u"); [outname, p] = __labels__ (outname, "y"); w = __freq2str__ (sys.w); disp (""); for k = 1 : m disp (["Frequency response '", sysname, "' from input '", inname{k}, "' to output ..."]); disp (""); __disp_resp__ (sys.H(:,k,:), w, outname); endfor display (sys.lti); # display sampling time if (tsam == -2) disp ("Static gain."); elseif (tsam == 0) disp ("Continuous-time frequency response."); else disp ("Discrete-time frequency response."); endif endfunction function __disp_resp__ (H, w, outname) p = rows (H); # number of outputs len = size (H, 3); # number of frequencies H = mat2cell (H, ones (1, p), 1, len)(:); H = cellfun (@__resp2str__, H, outname, "uniformoutput", false); tsize = terminal_size (); col_freq = columns (w); col_resp = cellfun (@columns, H); col_max = tsize(2) - col_freq; width = cumsum (col_resp); start = 0; stop = col_max; while (start < width(end)) idx = find (width > start & width <= stop); disp ([w, H{idx}]); disp (""); start = width(idx(end)); stop = start + col_max; endwhile ## FIXME: Handle case where tsize(2) is not enough ## to display frequencies and one output. endfunction function str = __freq2str__ (w, title = "w [rad/s]") len = rows (w); str = __vec2str__ (w); line = repmat ("-", 1, max (columns (str), columns (title))); str = strvcat (title, line, str); space = repmat (" ", len+2, 1); str = [space, str]; endfunction function str = __resp2str__ (H, outname) H = H(:); len = length (H); real_str = __vec2str__ (real (H)); im = imag (H); if (any (im)) imag_str = __vec2str__ (abs (im), "i"); sign_str = repmat (" + ", len, 1); neg = im < 0; sign_str(neg, 2) = "-"; str = [real_str, sign_str, imag_str]; else str = real_str; endif line = repmat ("-", 1, max (columns (str), columns (outname))); str = strvcat (outname, line, str); space = repmat (" ", len+2, 1); str = [space, str]; endfunction function str = __vec2str__ (vec, post) vec = vec(:); tmp = isfinite (vec); tmp = abs (vec(tmp & vec != 0)); if (isempty (tmp) || min (tmp) < 1e-3 || max (tmp) > 1e4) str = arrayfun (@(x) sprintf ("%.3e", x), vec, "uniformoutput", false); elseif (all (floor (tmp) == tmp)) str = arrayfun (@(x) sprintf ("%d", x), vec, "uniformoutput", false); else str = arrayfun (@(x) sprintf ("%.4f", x), vec, "uniformoutput", false); endif str = strjust (char (str), "right"); if (nargin > 1) str = [str, repmat(post, length (vec), 1)]; endif endfunction control/inst/@frd/frd.m0000644000076500000240000001410712273411256014327 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} frd (@var{sys}) ## @deftypefnx {Function File} {@var{sys} =} frd (@var{sys}, @var{w}) ## @deftypefnx {Function File} {@var{sys} =} frd (@var{H}, @var{w}, @dots{}) ## @deftypefnx {Function File} {@var{sys} =} frd (@var{H}, @var{w}, @var{tsam}, @dots{}) ## Create or convert to frequency response data. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model to be converted to frequency response data. ## If second argument @var{w} is omitted, the interesting ## frequency range is calculated by the zeros and poles of @var{sys}. ## @item H ## Frequency response array (p-by-m-by-lw). H(i,j,k) contains the ## response from input j to output i at frequency k. In the SISO case, ## a vector (lw-by-1) or (1-by-lw) is accepted as well. ## @item w ## Frequency vector (lw-by-1) in radian per second [rad/s]. ## Frequencies must be in ascending order. ## @item tsam ## Sampling time in seconds. If @var{tsam} is not specified, ## a continuous-time model is assumed. ## @item @dots{} ## Optional pairs of properties and values. ## Type @command{set (frd)} for more information. ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## Frequency response data object. ## @end table ## ## @strong{Option Keys and Values} ## @table @var ## @item 'H' ## Frequency response array. See 'Inputs' for details. ## ## @item 'w' ## Frequency vector. See 'Inputs' for details. ## ## @item 'tsam' ## Sampling time. See 'Inputs' for details. ## ## @item 'inname' ## The name of the input channels in @var{sys}. ## Cell vector of length m containing strings. ## Default names are @code{@{'u1', 'u2', ...@}} ## ## @item 'outname' ## The name of the output channels in @var{sys}. ## Cell vector of length p containing strings. ## Default names are @code{@{'y1', 'y2', ...@}} ## ## @item 'ingroup' ## Struct with input group names as field names and ## vectors of input indices as field values. ## Default is an empty struct. ## ## @item 'outgroup' ## Struct with output group names as field names and ## vectors of output indices as field values. ## Default is an empty struct. ## ## @item 'name' ## String containing the name of the model. ## ## @item 'notes' ## String or cell of string containing comments. ## ## @item 'userdata' ## Any data type. ## @end table ## ## @seealso{dss, ss, tf} ## @end deftypefn ## Author: Lukas Reichlin ## Created: February 2010 ## Version: 0.1 function sys = frd (H = [], w = [], varargin) ## NOTE: * There's no such thing as a static gain ## because FRD objects are measurements, ## not models. ## * If something like sys1 = frd (5) existed, ## it would cause troubles in cases like ## sys2 = ss (...), sys = sys1 * sys2 ## because sys2 needs to be converted to FRD, ## but sys1 contains no valid frequencies. ## * However, things like frd (ss (5)) should ## be possible. ## model precedence: frd > ss > zpk > tf > double superiorto ("ss", "zpk", "tf", "double"); argc = 0; # initialize argument count switch (nargin) case 0 # empty object sys = frd () tsam = -2; # undefined sampling time case 1 if (isa (H, "frd")) # already in frd form sys = frd (frdsys) sys = H; return; # nothing more to do here elseif (isa (H, "lti")) # another lti object sys = frd (sys) [sys, alti] = __sys2frd__ (H); sys.lti = alti; # preserve lti properties return; # nothing more to do here else # sys = frd (H) *must* fail print_usage (); endif case 2 if (isa (H, "lti")) # another lti object sys = frd (sys, w) [sys, alti] = __sys2frd__ (H, w); sys.lti = alti; # preserve lti properties return; # nothing more to do here else # sys = frd (H, w) tsam = 0; # continuous-time endif otherwise # default case argc = numel (varargin); # number of additional arguments after H and w if (issample (varargin{1}, -10)) # sys = frd (H, w, tsam, "prop1", val1, ...) tsam = varargin{1}; # sampling time, could be 0 as well argc--; # tsam is not a property-value pair if (argc > 0) # if there are any properties and values ... varargin = varargin(2:end); # remove tsam from property-value list endif else # sys = frd (H, w, "prop1", val1, ...) tsam = 0; # continuous-time endif endswitch [H, w] = __adjust_frd_data__ (H, w); [p, m] = __frd_dim__ (H, w); # determine number of outputs and inputs frdata = struct ("H", H, "w", w); # struct for frd-specific data ltisys = lti (p, m, tsam); # parent class for general lti data sys = class (frdata, "frd", ltisys); # create frd object if (argc > 0) # if there are any properties and values, ... sys = set (sys, varargin{:}); # use the general set function endif endfunction control/inst/@iddata/0000755000076500000240000000000012273411257014047 5ustar lukasstaffcontrol/inst/@iddata/__property_names__.m0000644000076500000240000000400212273411256020063 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{props}, @var{vals}] =} __property_names__ (@var{dat}) ## Return the list of properties as well as the assignable values for an iddata set. ## @end deftypefn ## Author: Lukas Reichlin ## Created: February 2012 ## Version: 0.1 function [props, vals] = __property_names__ (dat) [n, p, m, e] = size (dat); ## cell vector of iddata-specific properties props = {"y"; "outname"; "outunit"; "u"; "inname"; "inunit"; "tsam"; "timeunit"; "expname"; "name"; "notes"; "userdata"}; ## cell vector of lti-specific assignable values vals = {sprintf("(%dx1) cell vector of (nx%d) matrices", e, p); sprintf("(%dx1) cell vector of strings", p); sprintf("(%dx1) cell vector of strings", p); sprintf("(%dx1) cell vector of (nx%d) matrices", e, m); sprintf("(%dx1) cell vector of strings", m); sprintf("(%dx1) cell vector of strings", m); sprintf("(%dx1) cell vector of scalars", e); "string"; sprintf("(%dx1) cell vector of strings", e); "string"; "string or cell of strings"; "any data type"}; endfunctioncontrol/inst/@iddata/cat.m0000644000076500000240000001600512273411256014775 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{dat} =} cat (@var{dim}, @var{dat1}, @var{dat2}, @dots{}) ## Concatenate iddata sets along dimension @var{dim}. ## ## @strong{Inputs} ## @table @var ## @item dim ## Dimension along which the concatenation takes place. ## @table @var ## @item 1 ## Concatenate samples. ## The samples are concatenated in the following way: ## @code{dat.y@{e@} = [dat1.y@{e@}; dat2.y@{e@}; @dots{}]} ## @code{dat.u@{e@} = [dat1.u@{e@}; dat2.u@{e@}; @dots{}]} ## where @var{e} denotes the experiment. ## The number of experiments, outputs and inputs must be equal for all datasets. ## Equivalent to @command{vertcat}. ## ## @item 2 ## Concatenate inputs and outputs. ## The outputs and inputs are concatenated in the following way: ## @code{dat.y@{e@} = [dat1.y@{e@}, dat2.y@{e@}, @dots{}]} ## @code{dat.u@{e@} = [dat1.u@{e@}, dat2.u@{e@}, @dots{}]} ## where @var{e} denotes the experiment. ## The number of experiments and samples must be equal for all datasets. ## Equivalent to @command{horzcat}. ## ## @item 3 ## Concatenate experiments. ## The experiments are concatenated in the following way: ## @code{dat.y = [dat1.y; dat2.y; @dots{}]} ## @code{dat.u = [dat1.u; dat2.u; @dots{}]} ## The number of outputs and inputs must be equal for all datasets. ## Equivalent to @command{merge}. ## @end table ## ## @item dat1, dat2, @dots{} ## iddata sets to be concatenated. ## @end table ## ## @strong{Outputs} ## @table @var ## @item dat ## Concatenated iddata set. ## @end table ## ## @seealso{horzcat, merge, vertcat} ## @end deftypefn ## Author: Lukas Reichlin ## Created: March 2012 ## Version: 0.1 function dat = cat (dim, varargin) ## I think this code is pretty elegant because it works for ## any number of arguments and without a single for-loop :-) ## if this overloaded cat method is called, it is guaranteed that ## * nargin > 0 ## * at least one argument is an iddata object if (! is_real_scalar (dim)) print_usage (); endif ## store all datasets in a single struct 'tmp' ## tmp is not a valid iddata set anymore, ## but it doesn't matter, we want just a ## temporary struct containing all the data tmp = cellfun (@iddata, varargin); [n, p, m, e] = cellfun (@size, varargin, "uniformoutput", false); ## TODO: dat = iddata (ones (100, 3)); ## dat = cat (1, dat, zeros (4, 3), dat) ## default values for metadata ## some of them are overwritten in the switch statement below tsam = tmp(1).tsam; expname = tmp(1).expname; outname = tmp(1).outname; outunit = tmp(1).outunit; inname = tmp(1).inname; inunit = tmp(1).inunit; check_domain (tmp, e); switch (dim) case 1 # vertcat - catenate samples check_experiments (tmp, e); check_outputs (tmp, p); check_inputs (tmp, m); y = cellfun (@vertcat, tmp.y, "uniformoutput", false); u = cellfun (@vertcat, tmp.u, "uniformoutput", false); ## note that this also works for time series (u = {}) case 2 # horzcat - catenate channels check_experiments (tmp, e); check_samples (n); y = cellfun (@horzcat, tmp.y, "uniformoutput", false); u = cellfun (@horzcat, tmp.u, "uniformoutput", false); outname = vertcat (tmp.outname); outunit = vertcat (tmp.outunit); inname = vertcat (tmp.inname); inunit = vertcat (tmp.inunit); case 3 # merge - catenate experiments check_outputs (tmp, p); check_inputs (tmp, m); y = vertcat (tmp.y); u = vertcat (tmp.u); tsam = vertcat (tmp.tsam); expname = vertcat (tmp.expname); otherwise error ("iddata: cat: '%d' is an invalid dimension", dim); endswitch dat = iddata (y, u, tsam); ## copy metadata dat.expname = expname; dat.outname = outname; dat.outunit = outunit; dat.inname = inname; dat.inunit = inunit; % TODO: handle w endfunction function check_experiments (tmp, e) if (numel (e) > 1 && ! isequal (e{:})) # isequal doesn't work with less than 2 arguments error ("iddata: cat: number of experiments don't match [%s]", ... num2str (cell2mat (e), "%d ")); endif if (! compare_strings (tmp.expname)) warning ("iddata: cat: experiment names don't match") endif if (numel (e) > 1 && ! isequal (tmp.tsam)) warning ("iddata: cat: sampling times don't match"); endif endfunction function check_outputs (tmp, p) if (numel (p) > 1 && ! isequal (p{:})) error ("iddata: cat: number of outputs don't match [%s]", ... num2str (cell2mat (p), "%d ")); endif if (! compare_strings (tmp.outname)) warning ("iddata: cat: output names don't match") endif if (! compare_strings (tmp.outunit)) warning ("iddata: cat: output units don't match") endif endfunction function check_inputs (tmp, m) if (numel (m) > 1 && ! isequal (m{:})) error ("iddata: cat: number of inputs don't match [%s]", ... num2str (cell2mat (m), "%d ")); endif if (! compare_strings (tmp.inname)) warning ("iddata: cat: input names don't match") endif if (! compare_strings (tmp.inunit)) warning ("iddata: cat: input units don't match") endif endfunction function check_samples (n) if (numel (n) > 1 && ! isequal (n{:})) error ("iddata: cat: number of samples don't match %s", ... mat2str (vertcat (n{:}), 10)); endif endfunction function check_domain (tmp, e) if (numel (e) > 1 && ! isequal (tmp.timedomain)) # isequal doesn't work with less than 2 arguments error ("iddata: cat: can't mix time- and frequency-domain datasets"); endif endfunction ## kind of strcmp for more than two arguments ## return true if all cells of strings are equal ## and false otherwise function bool = compare_strings (str, varargin) if (nargin > 1) ## compare n-th string of first cell with n-th string of remaining cells tmp = cellfun (@strcmp, {str}, varargin, "uniformoutput", false); ## check whether all strings of each pair are equal tmp = cellfun (@all, tmp); ## check whether all pairs are equal bool = all (tmp); else ## one or no cell at all is always equal to itself bool = true; endif endfunction %!error (cat (1, iddata (1, 1), iddata ({2, 3}, {2, 3}))); control/inst/@iddata/detrend.m0000644000076500000240000000440612273411256015655 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{dat} =} detrend (@var{dat}) ## @deftypefnx {Function File} {@var{dat} =} detrend (@var{dat}, @var{ord}) ## Detrend outputs and inputs of dataset @var{dat} by ## removing the best fit of a polynomial of order @var{ord}. ## If @var{ord} is not specified, default value 0 is taken. ## This corresponds to removing a constant. ## @end deftypefn ## Author: Lukas Reichlin ## Created: April 2012 ## Version: 0.1 function dat = detrend (dat, ord = 0) if (nargin > 2) # no need to test nargin == 0, this is handled by built-in detrend print_usage (); endif if ((! is_real_scalar (ord) || fix (ord) != ord) && ! ischar (ord)) # chars are handled by built-in detrend error ("iddata: detrend: second argument must be a positve integer"); endif [n, p, m] = size (dat); dat.y = cellfun (@detrend, dat.y, {ord}, "uniformoutput", false); dat.u = cellfun (@detrend, dat.u, {ord}, "uniformoutput", false); ## if a MIMO experiment has only 1 sample, detrend works ## row-wisely instead of column-wisely ## therefore we set these experiments to zero idx = (n == 1); dat.y(idx) = zeros (1, p); dat.u(idx) = zeros (1, m); endfunction %!shared DATD, Z %! DAT = iddata ({[(1:10).', (1:2:20).'], [(10:-1:1).', (20:-2:1).']}, {[(41:50).', (46:55).'], [(61:70).', (-66:-1:-75).']}); %! DATD = detrend (DAT, "linear"); %! Z = zeros (10, 2); %!assert (DATD.y{1}, Z, 1e-10); %!assert (DATD.y{2}, Z, 1e-10); %!assert (DATD.u{1}, Z, 1e-10); %!assert (DATD.u{2}, Z, 1e-10); control/inst/@iddata/diff.m0000644000076500000240000000262712273411256015143 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{dat} =} diff (@var{dat}) ## @deftypefnx {Function File} {@var{dat} =} diff (@var{dat}, @var{k}) ## Return @var{k}-th difference of outputs and inputs of dataset @var{dat}. ## If @var{k} is not specified, default value 1 is taken. ## @end deftypefn ## Author: Lukas Reichlin ## Created: March 2012 ## Version: 0.1 function dat = diff (dat, k = 1) if (nargin > 2) # no need to test nargin == 0, this is handled by built-in diff print_usage (); endif dat.y = cellfun (@diff, dat.y, {k}, {1}, "uniformoutput", false); dat.u = cellfun (@diff, dat.u, {k}, {1}, "uniformoutput", false); endfunction control/inst/@iddata/display.m0000644000076500000240000000574512273411256015704 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Display routine for iddata objects. ## Author: Lukas Reichlin ## Created: February 2012 ## Version: 0.1 function display (dat) datname = inputname (1); [outname, p] = __labels__ (dat.outname, "y"); [inname, m] = __labels__ (dat.inname, "u"); [expname, e] = __labels__ (dat.expname, "exp"); [n, p, m, e] = size (dat); if (dat.timedomain) domain = "Time"; sf = "Samples"; else domain = "Frequency"; sf = "Frequencies"; endif str = [domain, " domain dataset '", datname, "' containing ", num2str(sum(n)), " ", lower(sf)]; disp (""); disp (str); disp (""); disp (__horzcat__ (__col2str__ (expname, "Experiment"), ... __vec2str__ (n, sf), ... __vec2str__ (cell2mat (dat.tsam), "Sampling Interval"))); disp (""); disp (__horzcat__ (__col2str__ (outname, "Outputs"), ... __col2str__ (dat.outunit, "Unit (if specified)"))); disp (""); disp (__horzcat__ (__col2str__ (inname, "Inputs"), ... __col2str__ (dat.inunit, "Unit (if specified)"))); disp (""); endfunction function str = __horzcat__ (col, varargin) len = rows (col); sp2 = repmat (" ", len, 1); sp4 = repmat (" ", len, 1); str = [sp2, col]; for k = 2 : nargin str = [str, sp4, varargin{k-1}]; endfor endfunction function str = __col2str__ (col, title) len = rows (col); str = strjust (strvcat (col), "left"); if (columns (str) == 0) str = repmat (" ", len, 1); endif line = repmat ("-", 1, max (columns (str), columns (title))); str = strvcat (title, line, str); endfunction function str = __vec2str__ (vec, title) vec = vec(:); tmp = isfinite (vec); tmp = abs (vec(tmp & vec != 0)); if (isempty (tmp) || min (tmp) < 1e-3 || max (tmp) > 1e4) str = arrayfun (@(x) sprintf ("%.3e", x), vec, "uniformoutput", false); elseif (all (floor (tmp) == tmp)) str = arrayfun (@(x) sprintf ("%d", x), vec, "uniformoutput", false); else str = arrayfun (@(x) sprintf ("%.4f", x), vec, "uniformoutput", false); endif str = strjust (char (str), "right"); line = repmat ("-", 1, max (columns (str), columns (title))); %str = strvcat (title, str) str = strvcat (title, line, str); endfunction control/inst/@iddata/end.m0000644000076500000240000000302212273411257014770 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## End indexing for @acronym{IDDATA} objects. ## Used by Octave for "dat(1:end)". ## Author: Lukas Reichlin ## Created: December 2013 ## Version: 0.1 function ret = end (dat, k, n) if (n > 4) error ("iddata: end: require at most 4 indices in the expression"); endif switch (k) case 1 # selecting samples ret = size (dat, 1); if (numel (ret) != 1 && ! isequal (num2cell (ret){:})) error ("iddata: end: for multi-experiment datasets, require equal number of samples when selecting samples with 'end'"); endif ret = ret(1); case {2, 3, 4} # selecting outputs, inputs or experiments ret = size (dat, k); otherwise error ("iddata: end: invalid expression index k = %d", k); endswitch endfunction control/inst/@iddata/fft.m0000644000076500000240000000662012273411257015010 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{dat} =} fft (@var{dat}) ## @deftypefnx {Function File} {@var{dat} =} fft (@var{dat}, @var{n}) ## Transform iddata objects from time to frequency domain ## using a Fast Fourier Transform (FFT) algorithm. ## ## @strong{Inputs} ## @table @var ## @item dat ## iddata set containing signals in time-domain. ## @item n ## Length of the FFT transformations. If @var{n} does not match ## the signal length, the signals in @var{dat} are shortened or ## padded with zeros. @var{n} is a vector with as many elements ## as there are experiments in @var{dat} or a scalar with a common ## length for all experiments. ## If not specified, the signal lengths are taken as default values. ## @end table ## ## @strong{Outputs} ## @table @var ## @item dat ## iddata identification dataset in frequency-domain. ## In order to preserve signal power and noise level, ## the FFTs are normalized by dividing each transform ## by the square root of the signal length. ## The frequency values are distributed equally from 0 ## to the Nyquist frequency. The Nyquist frequency is ## only included for even signal lengths. ## @end table ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: April 2012 ## Version: 0.1 function dat = fft (dat, n = []) if (nargin > 2 || ! isa (dat, "iddata")) # no need to test nargin == 0, this is handled by built-in fft print_usage (); endif if (! dat.timedomain) return; endif [x, ~, ~, e] = size (dat); if (isempty (n)) # default case, n not specified n = num2cell (x(:)); elseif (is_real_vector (n) && length (n) == e && fix (n) == n) # individual n for each experiment n = num2cell (n(:)); elseif (is_real_scalar (n) && fix (n) == n) # common n for all experiments n = num2cell (repmat (n, e, 1)); else error ("iddata: fft: second argument invalid"); endif dat.y = cellfun (@(y, n) fft (y, n, 1)(1:fix(n/2)+1, :) / sqrt (n), dat.y, n, "uniformoutput", false); dat.u = cellfun (@(u, n) fft (u, n, 1)(1:fix(n/2)+1, :) / sqrt (n), dat.u, n, "uniformoutput", false); ## fft (x, n, dim=1) because x could be a row vector (n=1) dat.w = cellfun (@(n, tsam) (0:fix(n/2)).' * (2*pi/abs(tsam)/n), n, dat.tsam, "uniformoutput", false); ## abs(tsam) because of -1 for undefined sampling times dat.timedomain = false; endfunction %!shared DATD, Y, U %! Y = 1:10; %! U = 20:-2:1; %! W = warning ("query", "iddata:transpose"); %! warning ("off", W.identifier); %! DAT = iddata (Y, U); %! DATD = fft (DAT); %! warning (W.identifier, W.state); %!assert (DATD.y{1}, Y, 1e-10); %!assert (DATD.u{1}, U, 1e-10); control/inst/@iddata/filter.m0000644000076500000240000000715712273411257015524 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{dat} =} filter (@var{dat}, @var{sys}) ## @deftypefnx {Function File} {@var{dat} =} filter (@var{dat}, @var{b}, @var{a}) ## Filter output and input signals of dataset @var{dat}. ## The filter is specified either by @acronym{LTI} system @var{sys} ## or by transfer function polynomials @var{b} and @var{a} as described ## in the help text of the built-in filter command. Type @code{help filter} ## for more information. ## ## @strong{Inputs} ## @table @var ## @item dat ## iddata identification dataset containing signals in time-domain. ## @item sys ## @acronym{LTI} object containing the discrete-time filter. ## @item b ## Numerator polynomial of the discrete-time filter. ## Must be a row vector containing the coefficients ## of the polynomial in ascending powers of z^-1. ## @item a ## Denominator polynomial of the discrete-time filter. ## Must be a row vector containing the coefficients ## of the polynomial in ascending powers of z^-1. ## @end table ## ## @strong{Outputs} ## @table @var ## @item dat ## iddata identification dataset with filtered ## output and input signals. ## @end table ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: August 2012 ## Version: 0.1 function dat = filter (dat, b, a = [], si = []) if (nargin < 2 || nargin > 4) print_usage (); endif if (! isa (dat, "iddata")) # there's at least one iddata set, but not as the first argument error ("iddata: filter: first argument must be an iddata set"); endif if (! dat.timedomain) error ("iddata: filter: require iddata set in time-domain"); endif if (isa (b, "lti")) # filter (dat, sys) if (nargin > 3) # filter (dat, sys, si) has at most 3 inputs print_usage (); endif if (! issiso (b)) error ("iddata: filter: second argument must be a SISO LTI system"); endif si = a; # filter (dat, sys, si) if (isct (b)) # sys is continuous-time b = c2d (b, dat.tsam{1}); # does this discretization/tsam make sense? endif [b, a] = filtdata (b, "vector"); # convert LTI system to transfer function elseif (nargin < 3) print_usage (); endif ## use Octave's filter function for each experiment ## the fifth argument '1' specifies the dimension in case of datasets with only 1 sample dat.y = cellfun (@(y) filter (b, a, y, si, 1), dat.y, "uniformoutput", false); dat.u = cellfun (@(u) filter (b, a, u, si, 1), dat.u, "uniformoutput", false); endfunction ## TODO: adapt test %!shared DATD, Z %! DAT = iddata ({[(1:10).', (1:2:20).'], [(10:-1:1).', (20:-2:1).']}, {[(41:50).', (46:55).'], [(61:70).', (-66:-1:-75).']}); %! DATD = detrend (DAT, "linear"); %! Z = zeros (10, 2); %!assert (DATD.y{1}, Z, 1e-10); %!assert (DATD.y{2}, Z, 1e-10); %!assert (DATD.u{1}, Z, 1e-10); %!assert (DATD.u{2}, Z, 1e-10); control/inst/@iddata/get.m0000644000076500000240000000535112273411257015010 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {} get (@var{dat}) ## @deftypefnx {Function File} {@var{value} =} get (@var{dat}, @var{"property"}) ## @deftypefnx {Function File} {[@var{val1}, @var{val2}, @dots{}] =} get (@var{dat}, @var{"prop1"}, @var{"prop2"}, @dots{}) ## Access property values of iddata objects. ## Type @command{get(dat)} to display a list of available properties. ## @end deftypefn ## Author: Lukas Reichlin ## Created: February 2012 ## Version: 0.1 function varargout = get (dat, varargin) if (nargin == 1) [props, vals] = __property_names__ (dat); nrows = numel (props); str = strjust (strvcat (props), "right"); str = horzcat (repmat (" ", nrows, 1), str, repmat (": ", nrows, 1), strvcat (vals)); disp (str); else for k = 1 : (nargin-1) prop = lower (varargin{k}); switch (prop) case {"y", "outdata", "outputdata", "outd", "outputd"} val = dat.y; case {"u", "indata", "inputdata", "ind", "inputd"} val = dat.u; case {"outname", "outputname", "outn", "outputn"} val = dat.outname; case {"inname", "inputname", "inn", "inputn"} val = dat.inname; case {"outunit", "outputunit", "outu", "outputu"} val = dat.outunit; case {"inunit", "inputunit", "inu", "inputu"} val = dat.inunit; case {"tsam", "ts"} val = dat.tsam; case {"timeunit", "timeu"} val = dat.timeunit case {"expname", "experimentname", "expn", "experimentn"} val = dat.expname; case "name" val = dat.name; case "notes" val = dat.notes; case "userdata" val = dat.userdata; case {"domain", "timedomain"} val = dat.timedomain; case {"w", "frequency", "samplinginstants"} val = dat.w; otherwise error ("iddata: get: invalid property name '%s'", varargin{k}); endswitch varargout{k} = val; endfor endif endfunctioncontrol/inst/@iddata/horzcat.m0000644000076500000240000000253612273411257015705 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{dat} =} horzcat (@var{dat1}, @var{dat2}, @dots{}) ## Horizontal concatenation of iddata datasets. ## The outputs and inputs are concatenated in the following way: ## @code{dat.y@{e@} = [dat1.y@{e@}, dat2.y@{e@}, @dots{}]} ## @code{dat.u@{e@} = [dat1.u@{e@}, dat2.u@{e@}, @dots{}]} ## where @var{e} denotes the experiment. ## The number of experiments and samples must be equal for all datasets. ## @end deftypefn ## Author: Lukas Reichlin ## Created: March 2012 ## Version: 0.1 function dat = horzcat (varargin) dat = cat (2, varargin{:}); endfunction control/inst/@iddata/iddata.m0000644000076500000240000001171012273411257015453 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {@var{dat} =} iddata (@var{y}) ## @deftypefnx{Function File} {@var{dat} =} iddata (@var{y}, @var{u}) ## @deftypefnx{Function File} {@var{dat} =} iddata (@var{y}, @var{u}, @var{tsam}, @dots{}) ## @deftypefnx{Function File} {@var{dat} =} iddata (@var{y}, @var{u}, @var{[]}, @dots{}) ## Create identification dataset of output and input signals. ## ## @strong{Inputs} ## @table @var ## @item y ## Real matrix containing the output signal in time-domain. ## For a system with @var{p} outputs and @var{n} samples, ## @var{y} is a n-by-p matrix. ## For data from multiple experiments, @var{y} becomes a ## e-by-1 or 1-by-e cell vector of n(i)-by-p matrices, ## where @var{e} denotes the number of experiments ## and n(i) the individual number of samples for each experiment. ## @item u ## Real matrix containing the input signal in time-domain. ## For a system with @var{m} inputs and @var{n} samples, ## @var{u} is a n-by-m matrix. ## For data from multiple experiments, @var{u} becomes a ## e-by-1 or 1-by-e cell vector of n(i)-by-m matrices, ## where @var{e} denotes the number of experiments ## and n(i) the individual number of samples for each experiment. ## If @var{u} is not specified or an empty element @code{[]} is passed, ## @var{dat} becomes a time series dataset. ## @item tsam ## Sampling time. If not specified, default value -1 (unspecified) is taken. ## For multi-experiment data, @var{tsam} becomes a ## e-by-1 or 1-by-e cell vector containing individual ## sampling times for each experiment. If a scalar @var{tsam} ## is provided, then all experiments have the same sampling time. ## @item @dots{} ## Optional pairs of properties and values. ## @end table ## ## @strong{Outputs} ## @table @var ## @item dat ## iddata identification dataset. ## @end table ## ## @strong{Option Keys and Values} ## @table @var ## @item 'expname' ## The name of the experiments in @var{dat}. ## Cell vector of length e containing strings. ## Default names are @code{@{'exp1', 'exp2', ...@}} ## ## @item 'y' ## Output signals. See 'Inputs' for details. ## ## @item 'outname' ## The name of the output channels in @var{dat}. ## Cell vector of length p containing strings. ## Default names are @code{@{'y1', 'y2', ...@}} ## ## @item 'outunit' ## The units of the output channels in @var{dat}. ## Cell vector of length p containing strings. ## ## @item 'u' ## Input signals. See 'Inputs' for details. ## ## @item 'inname' ## The name of the input channels in @var{dat}. ## Cell vector of length m containing strings. ## Default names are @code{@{'u1', 'u2', ...@}} ## ## @item 'inunit' ## The units of the input channels in @var{dat}. ## Cell vector of length m containing strings. ## ## @item 'tsam' ## Sampling time. See 'Inputs' for details. ## ## @item 'timeunit' ## The units of the sampling times in @var{dat}. ## Cell vector of length e containing strings. ## ## @item 'name' ## String containing the name of the dataset. ## ## @item 'notes' ## String or cell of string containing comments. ## ## @item 'userdata' ## Any data type. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2011 ## Version: 0.1 function dat = iddata (y = {}, u = {}, tsam = {}, varargin) if (nargin == 1 && isa (y, "iddata")) dat = y; return; elseif (nargin < 1) print_usage (); endif [y, u] = __adjust_iddata__ (y, u); [p, m, e] = __iddata_dim__ (y, u); tsam = __adjust_iddata_tsam__ (tsam, e); outname = repmat ({""}, p, 1); inname = repmat ({""}, m, 1); expname = repmat ({""}, e, 1); dat = struct ("y", {y}, "outname", {outname}, "outunit", {outname}, "u", {u}, "inname", {inname}, "inunit", {inname}, "tsam", {tsam}, "timeunit", {""}, "timedomain", true, "w", {{}}, "expname", {expname}, "name", "", "notes", {{}}, "userdata", []); dat = class (dat, "iddata"); if (nargin > 3) dat = set (dat, varargin{:}); endif if (dat.timedomain && ! is_real_matrix (dat.y{:}, dat.u{:})) error ("iddata: require real-valued input and output signals for time domain datasets"); endif endfunction %!error (iddata); %!error (iddata ((1:10).', (1:11).')); %!warning (iddata (1:10)); %!warning (iddata (1:10, 1:10)); control/inst/@iddata/ifft.m0000644000076500000240000000563312273411257015164 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{dat} =} ifft (@var{dat}) ## Transform iddata objects from frequency to time domain. ## ## @strong{Inputs} ## @table @var ## @item dat ## iddata set containing signals in frequency domain. ## The frequency values must be distributed equally from 0 ## to the Nyquist frequency. The Nyquist frequency is ## only included for even signal lengths. ## @end table ## ## @strong{Outputs} ## @table @var ## @item dat ## iddata identification dataset in time domain. ## In order to preserve signal power and noise level, ## the FFTs are normalized by multiplying each transform ## by the square root of the signal length. ## @end table ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: April 2012 ## Version: 0.1 function dat = ifft (dat) if (nargin > 1) # no need to test nargin == 0, this is handled by built-in ifft print_usage (); endif if (dat.timedomain) # dat is always an iddata set, otherwise built-in ifft would be called return; endif if (any (cellfun (@(w) w(1) >= eps, dat.w))) error ("iddata: ifft: first frequency must be zero"); endif if (any (cellfun (@(w) any (abs (diff (w, 2)) > 1e-4*w(2:end-1)), dat.w))) error ("iddata: ifft: require linearly spaced frequency vectors"); endif [x, ~, ~, e] = size (dat); x = x(:); n = num2cell (x); %nconj = num2cell (x - ! rem (x, 2)); nconj = num2cell (x - rem (x, 2)); dat.y = cellfun (@(y, n, nconj) real (ifft ([y; conj(y(nconj:-1:2, :))], [], 1)) * sqrt (n+nconj), dat.y, n, nconj, "uniformoutput", false); dat.u = cellfun (@(u, n, nconj) real (ifft ([u; conj(u(nconj:-1:2, :))], [], 1)) * sqrt (n+nconj), dat.u, n, nconj, "uniformoutput", false); ## ifft (x, n, dim=1) because x could be a row vector (n=1) % dat.w = cellfun (@(n, tsam) (0:fix(n/2)).' * (2*pi/abs(tsam)/n), n, dat.tsam, "uniformoutput", false); dat.w = {}; % dat.w = repmat ({[]}, e, 1); ??? ## abs(tsam) because of -1 for undefined sampling times dat.timedomain = true; endfunction %!shared DATD, Y, U %! Y = 1:10; %! U = 20:-2:1; %! DAT = iddata (Y, U); %! DATD = fft (DAT); %!assert (DATD.y{1}, Y, 1e-10); %!assert (DATD.u{1}, U, 1e-10); control/inst/@iddata/merge.m0000644000076500000240000000240612273411257015326 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{dat} =} merge (@var{dat1}, @var{dat2}, @dots{}) ## Concatenate experiments of iddata datasets. ## The experiments are concatenated in the following way: ## @code{dat.y = [dat1.y; dat2.y; @dots{}]} ## @code{dat.u = [dat1.u; dat2.u; @dots{}]} ## The number of outputs and inputs must be equal for all datasets. ## @end deftypefn ## Author: Lukas Reichlin ## Created: March 2012 ## Version: 0.1 function dat = merge (varargin) dat = cat (3, varargin{:}); endfunction control/inst/@iddata/nkshift.m0000644000076500000240000000474012273411257015700 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{dat} =} nkshift (@var{dat}, @var{nk}) ## @deftypefnx {Function File} {@var{dat} =} nkshift (@var{dat}, @var{nk}, @var{'append'}) ## Shift input channels of dataset @var{dat} according to integer @var{nk}. ## A positive value of @var{nk} means that the input channels are delayed ## @var{nk} samples. By default, both input and output signals are shortened ## by @var{nk} samples. ## If a third argument @var{'append'} is passed, the output signals are left ## untouched while @var{nk} zeros are appended to the (shortened) input signals ## such that the number of samples in @var{dat} remains constant. ## @end deftypefn ## Author: Lukas Reichlin ## Created: July 2012 ## Version: 0.1 function dat = nkshift (dat, nk = 0) if (nargin > 3) print_usage (); endif if (! is_real_scalar (nk)) error ("iddata: nkshift: 'nk' must be a scalar integer"); endif ## TODO: - nk per inputs ## - frequency-domain data snk = sign (nk); nk = abs (nk); if (nargin == 2) # default: shortening y and u by nk if (snk >= 0) dat.y = cellfun (@(y) y(nk+1:end, :), dat.y, "uniformoutput", false); dat.u = cellfun (@(u) u(1:end-nk, :), dat.u, "uniformoutput", false); else dat.y = cellfun (@(y) y(1:end-nk, :), dat.y, "uniformoutput", false); dat.u = cellfun (@(u) u(nk+1:end, :), dat.u, "uniformoutput", false); endif else # append: keep y, padding u with nk zeros [~, ~, m] = size (dat); if (snk >= 0) dat.u = cellfun (@(u) [zeros(nk, m), u(1:end-nk, :)], dat.u, "uniformoutput", false); else dat.u = cellfun (@(u) [u(nk+1:end, :), zeros(nk, m)], dat.u, "uniformoutput", false); endif endif endfunction control/inst/@iddata/plot.m0000644000076500000240000000711712273411257015211 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {} plot (@var{dat}) ## @deftypefnx {Function File} {} plot (@var{dat}, @var{exp}) ## Plot signals of iddata identification datasets on the screen. ## The signals are plotted experiment-wise, either in time- or ## frequency-domain. For multi-experiment datasets, ## press any key to switch to the next experiment. ## If the plot of a single experiment should be saved by the ## @command{print} command, use @code{plot(dat,exp)}, ## where @var{exp} denotes the desired experiment. ## @end deftypefn ## Author: Lukas Reichlin ## Created: February 2012 ## Version: 0.2 function plot (dat, exp = ":") if (nargin > 2) # nargin == 0 is handled by built-in plot print_usage (); endif if (nargin == 2 && ! is_real_vector (exp)) error ("iddata: plot: second argument must be a vector of indices"); endif expname = __labels__ (dat.expname, "exp"); expname = expname(exp); idx = substruct ("()", {":", ":", ":", exp}); dat = subsref (dat, idx); [n, p, m, e] = size (dat); if (dat.timedomain) if (m == 0) # time series for k = 1 : e if (k > 1) pause endif plot (dat.y{k}) title (expname{k}) legend (__labels__ (dat.outname, "y"){:}) xlabel ("Time") ylabel ("Output Signal") endfor else # inputs present for k = 1 : e if (k > 1) pause endif subplot (2, 1, 1) plot (dat.y{k}) title (expname{k}) legend (__labels__ (dat.outname, "y"){:}) ylabel ("Output Signal") subplot (2, 1, 2) stairs (dat.u{k}) legend (__labels__ (dat.inname, "u"){:}) xlabel ("Time") ylabel ("Input Signal") endfor endif else # frequency domain if (m == 0) # time series for k = 1 : e if (k > 1) pause endif bar (dat.w{k}, 20*log10 (abs (dat.y{k}))) xlim ([dat.w{k}(1), dat.w{k}(end)]) title (expname{k}) legend (__labels__ (dat.outname, "y"){:}) xlabel ("Frequency") ylabel ("Output Magnitude [dB]") endfor else # inputs present for k = 1 : e if (k > 1) pause endif subplot (2, 1, 1) bar (dat.w{k}, 20*log10 (abs (dat.y{k}))) xlim ([dat.w{k}(1), dat.w{k}(end)]) title (expname{k}) legend (__labels__ (dat.outname, "y"){:}) ylabel ("Output Magnitude [dB]") subplot (2, 1, 2) bar (dat.w{k}, 20*log10(abs (dat.u{k}))) xlim ([dat.w{k}(1), dat.w{k}(end)]) legend (__labels__ (dat.inname, "u"){:}) xlabel ("Frequency") ylabel ("Input Magnitude [dB]") endfor endif endif ## TODO: think about the 20*log10 and the bars in general endfunction control/inst/@iddata/resample.m0000644000076500000240000000567012273411257016045 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{dat} =} resample (@var{dat}, @var{p}, @var{q}) ## @deftypefnx {Function File} {@var{dat} =} resample (@var{dat}, @var{p}, @var{q}, @var{n}) ## @deftypefnx {Function File} {@var{dat} =} resample (@var{dat}, @var{p}, @var{q}, @var{h}) ## Change the sample rate of the output and input signals in dataset @var{dat} ## by a factor of @code{p/q}. This is performed using a polyphase algorithm. ## The anti-aliasing @acronym{FIR} filter can be specified as follows: ## Either by order @var{n} (scalar) with default value 0. The band edges ## are then chosen automatically. Or by impulse response @var{h} (vector). ## Requires the signal package to be installed. ## ## @strong{Algorithm}@* ## Uses commands @command{fir1} and @command{resample} ## from the signal package. ## ## @strong{References}@* ## [1] J. G. Proakis and D. G. Manolakis, ## Digital Signal Processing: Principles, Algorithms, and Applications, ## 4th ed., Prentice Hall, 2007. Chap. 6 ## ## [2] A. V. Oppenheim, R. W. Schafer and J. R. Buck, ## Discrete-time signal processing, Signal processing series, ## Prentice-Hall, 1999 ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: June 2012 ## Version: 0.3 function dat = resample (dat, p, q, n = 0) if (nargin < 3 || nargin > 4) print_usage (); endif ## requires signal package try pkg load signal; catch error ("iddata: resample: please install signal package to proceed"); end_try_catch if (is_real_scalar (n)) # fourth scalar argument n is the order of the anti-aliasing filter h = fir1 (n, 1/q); elseif (is_real_vector (n)) # fourth vector argument is the (impulse response of the) anti-aliasing filter h = n; else error ("iddata: resample: fourth argument invalid"); endif dat.y = cellfun (@resample, dat.y, {p}, {q}, {h}, "uniformoutput", false); dat.u = cellfun (@resample, dat.u, {p}, {q}, {h}, "uniformoutput", false); dat.tsam = cellfun (@sampling_time, dat.tsam, {p}, {q}, "uniformoutput", false); endfunction function tsam = sampling_time (tsam, p, q) if (issample (tsam, 1)) # unspecified sampling times (-1) are left untouched tsam = (tsam*q)/p; endif endfunction control/inst/@iddata/set.m0000644000076500000240000001234312273411257015023 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {} set (@var{dat}) ## @deftypefnx {Function File} {} set (@var{dat}, @var{"property"}, @var{value}, @dots{}) ## @deftypefnx {Function File} {@var{dat} =} set (@var{dat}, @var{"property"}, @var{value}, @dots{}) ## Set or modify properties of iddata objects. ## If no return argument @var{dat} is specified, the modified @acronym{LTI} object is stored ## in input argument @var{dat}. @command{set} can handle multiple properties in one call: ## @code{set (dat, 'prop1', val1, 'prop2', val2, 'prop3', val3)}. ## @code{set (dat)} prints a list of the object's property names. ## @end deftypefn ## Author: Lukas Reichlin ## Created: February 2012 ## Version: 0.1 function retdat = set (dat, varargin) if (nargin == 1) # set (dat), dat = set (dat) [props, vals] = __property_names__ (dat); nrows = numel (props); str = strjust (strvcat (props), "right"); str = horzcat (repmat (" ", nrows, 1), str, repmat (": ", nrows, 1), strvcat (vals)); disp (str); if (nargout != 0) # function dat = set (dat, varargin) retdat = dat; # would lead to unwanted output when using endif # set (dat) else # set (dat, "prop1", val1, ...), dat = set (dat, "prop1", val1, ...) if (rem (nargin-1, 2)) error ("iddata: set: properties and values must come in pairs"); endif [n, p, m, e] = size (dat); for k = 1 : 2 : (nargin-1) prop = lower (varargin{k}); val = varargin{k+1}; switch (prop) case {"y", "outdata", "outputdata", "outd", "outputd"} val = __adjust_iddata__ (val, dat.u); [pval, ~, eval] = __iddata_dim__ (val, dat.u); if (pval != p) error ("iddata: set: argument has %d instead of %d outputs", pval, p); endif if (eval != e) # iddata_dim is not sufficient if dat.u = [] error ("iddata: set: argument has %d instead of %d experiments", eval, e); endif dat.y = val; case {"u", "indata", "inputdata", "ind", "inputd"} [~, val] = __adjust_iddata__ (dat.y, val); [~, mval] = __iddata_dim__ (dat.y, val); if (mval != m) error ("iddata: set: argument has %d instead of %d inputs", mval, m); endif dat.u = val; case {"outname", "outputname", "outn", "outputn"} dat.outname = __adjust_labels__ (val, p); case {"inname", "inputname", "inn", "inputn"} dat.inname = __adjust_labels__ (val, m); case {"outunit", "outputunit", "outu", "outputu"} dat.outunit = __adjust_labels__ (val, p); case {"inunit", "inputunit", "inu", "inputu"} dat.inunit = __adjust_labels__ (val, m); case {"timeunit", "timeu"} if (ischar (val)) dat.timeunit = val; else error ("iddata: set: property 'timeunit' requires a string"); endif case {"expname", "experimentname", "expn", "experimentn"} dat.expname = __adjust_labels__ (val, e); case {"tsam", "ts"} dat.tsam = __adjust_iddata_tsam__ (val, e); case {"w", "frequency"} if (! iscell (val)) val = {val}; endif if (any (cellfun (@(w) ! isempty (w) && (! is_real_vector (w) || any (w < 0) ... || ! issorted (w) || w(1) > w(end) ... || length (unique (w)) != length (w)), val))) error ("iddata: set: w must be a vector of positive real values in ascending order"); endif dat.w = val; dat.timedomain = false; case "name" if (ischar (val)) sys.name = val; else error ("iddata: set: property 'name' requires a string"); endif case "notes" if (iscellstr (val)) sys.notes = val; elseif (ischar (val)) sys.notes = {val}; else error ("lti: set: property 'notes' requires string or cell of strings"); endif case "userdata" sys.userdata = val; otherwise error ("iddata: set: invalid property name '%s'", varargin{k}); endswitch endfor if (nargout == 0) # set (dat, "prop1", val1, ...) assignin ("caller", inputname (1), dat); else # dat = set (dat, "prop1", val1, ...) retdat = dat; endif endif endfunctioncontrol/inst/@iddata/size.m0000644000076500000240000000657312273411257015212 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{nvec} =} size (@var{dat}) ## @deftypefnx {Function File} {@var{ndim} =} size (@var{dat}, @var{dim}) ## @deftypefnx {Function File} {[@var{n}, @var{p}, @var{m}, @var{e}] =} size (@var{dat}) ## Return dimensions of iddata set @var{dat}. ## ## @strong{Inputs} ## @table @var ## @item dat ## iddata set. ## @item dim ## If given a second argument, @command{size} will return the size of the ## corresponding dimension. ## @end table ## ## @strong{Outputs} ## @table @var ## @item nvec ## Row vector. The first element is the total number of samples (rows of dat.y and dat.u). ## The second element is the number of outputs (columns of dat.y) and the third element ## the number of inputs (columns of dat.u). The fourth element is the number of experiments. ## @item ndim ## Scalar value. The size of the dimension @var{dim}. ## @item n ## Row vector containing the number of samples of each experiment. ## @item p ## Number of outputs. ## @item m ## Number of inputs. ## @item e ## Number of experiments. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2011 ## Version: 0.1 function [x, p, m, e] = size (dat, dim = 0) if (nargin > 2) print_usage (); endif n = cellfun (@rows, dat.y).'; # number of samples p = numel (dat.outname); # number of output channels m = numel (dat.inname); # number of input channels e = numel (dat.y); # number of experiments switch (dim) case 0 # ... size (dat) switch (nargout) case 0 # size (dat) stry = stru = stre = ""; if (p != 1) stry = "s"; endif if (m != 1) stru = "s"; endif if (e != 1) stre = "s"; endif printf ("IDDATA set with [%s] samples, %d output%s, %d input%s and %d experiment%s.\n", ... num2str (n, "%d "), p, stry, m, stru, e, stre); case 1 # x = size (dat) x = [sum(n), p, m, e]; case {2, 3, 4} # [n, p, m, e] = size (dat) x = n; otherwise # more than 4 return values print_usage (); endswitch case 1 # nvec = size (dat, 1) x = n; case 2 # p = size (dat, 2) x = p; case 3 # m = size (dat, 3) x = m; case 4 # e = size (dat, 4) x = e; otherwise # invalid dimension print_usage (); endswitch endfunction control/inst/@iddata/subsasgn.m0000644000076500000240000000370212273411257016054 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Subscripted assignment for iddata objects. ## Used by Octave for "dat.property = value". ## Author: Lukas Reichlin ## Created: February 2012 ## Version: 0.1 function dat = subsasgn (dat, idx, val) switch (idx(1).type) case "()" # dat(...) = val if (length (idx(1).subs) == 1 && isa (val, "iddata")) # dat(x) = dat, required by cat for ... dat(idx.subs{:}) = val; # dat = cellfun (@iddata, varargin) else # dat(...) = val, general case error ("iddata: subsasgn type not implemented yet"); endif case "." # dat.y... = val if (length (idx) == 1) # dat.y = val dat = set (dat, idx.subs, val); else # dat.y(...) = val, dat.expname{3} = val key = idx(1).subs; dat = set (dat, key, subsasgn (get (dat, key), idx(2:end), val)); endif otherwise error ("iddata: subsasgn: invalid subscripted assignment type"); endswitch endfunctioncontrol/inst/@iddata/subsref.m0000644000076500000240000000520212273411257015675 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Subscripted reference for iddata objects. ## Used by Octave for "dat = dat(2:4, :)" or "val = dat.prop". ## Author: Lukas Reichlin ## Created: February 2012 ## Version: 0.3 function a = subsref (a, s) if (numel (s) == 0) return; endif switch (s(1).type) case "()" idx = s(1).subs; if (numel (idx) > 4) error ("iddata: subsref: need four or less indices"); else a = __dat_prune__ (a, idx{:}); endif case "." fld = s(1).subs; a = get (a, fld); otherwise error ("iddata: subsref: invalid subscript type"); endswitch a = subsref (a, s(2:end)); endfunction function dat = __dat_prune__ (dat, spl_idx = ":", out_idx = ":", in_idx = ":", exp_idx = ":") out_idx = __handle_idx__ (dat.outname, out_idx, "outname"); in_idx = __handle_idx__ (dat.inname, in_idx, "inname"); exp_idx = __handle_idx__ (dat.expname, exp_idx, "expname"); dat.y = dat.y(exp_idx); dat.y = cellfun (@(y) y(spl_idx, out_idx), dat.y, "uniformoutput", false); dat.outname = dat.outname(out_idx); dat.outunit = dat.outunit(out_idx); if (! isempty (dat.u)) dat.u = dat.u(exp_idx); dat.u = cellfun (@(u) u(spl_idx, in_idx), dat.u, "uniformoutput", false); dat.inname = dat.inname(in_idx); dat.inunit = dat.inunit(in_idx); endif dat.expname = dat.expname(exp_idx); dat.tsam = dat.tsam(exp_idx); endfunction function idx = __handle_idx__ (name, idx, id) if (ischar (idx) && ! strcmp (idx, ":")) idx = {idx}; endif if (iscell (idx)) idx = cellfun (@(x) __str2idx__ (name, x, id), idx); endif endfunction function idx = __str2idx__ (name, str, id) tmp = strcmp (name, str)(:); switch (nnz (tmp)) case 1 idx = find (tmp); case 0 error ("iddata: %s '%s' not found", id, str); otherwise error ("iddata: %s '%s' is ambiguous", id, str); endswitch endfunction control/inst/@iddata/vertcat.m0000644000076500000240000000253112273411257015676 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{dat} =} vertcat (@var{dat1}, @var{dat2}, @dots{}) ## Vertical concatenation of iddata datasets. ## The samples are concatenated in the following way: ## @code{dat.y@{e@} = [dat1.y@{e@}; dat2.y@{e@}; @dots{}]} ## @code{dat.u@{e@} = [dat1.u@{e@}; dat2.u@{e@}; @dots{}]} ## where @var{e} denotes the experiment. ## The number of experiments, outputs and inputs must be equal for all datasets. ## @end deftypefn ## Author: Lukas Reichlin ## Created: March 2012 ## Version: 0.1 function dat = vertcat (varargin) dat = cat (1, varargin{:}); endfunction control/inst/@lti/0000755000076500000240000000000012273411257013411 5ustar lukasstaffcontrol/inst/@lti/__lti_data__.m0000644000076500000240000000202512273411257016143 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Used by display routines instead of multiple get calls. ## Author: Lukas Reichlin ## Created: September 2010 ## Version: 0.1 function [inname, outname, tsam] = __lti_data__ (sys) inname = sys.inname; outname = sys.outname; tsam = sys.tsam; endfunction control/inst/@lti/__lti_group__.m0000644000076500000240000000536412273411257016377 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Block diagonal concatenation of two LTI models. ## This file is part of the Model Abstraction Layer. ## For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function retlti = __lti_group__ (lti1, lti2) retlti = lti (); retlti.inname = [lti1.inname; lti2.inname]; retlti.outname = [lti1.outname; lti2.outname]; if (nfields (lti1.ingroup) || nfields (lti2.ingroup)) m1 = numel (lti1.inname); lti2_ingroup = structfun (@(x) x + m1, lti2.ingroup, "uniformoutput", false); retlti.ingroup = __merge_struct__ (lti1.ingroup, lti2_ingroup, "in"); endif if (nfields (lti1.outgroup) || nfields (lti2.outgroup)) p1 = numel (lti1.outname); lti2_outgroup = structfun (@(x) x + p1, lti2.outgroup, "uniformoutput", false); retlti.outgroup = __merge_struct__ (lti1.outgroup, lti2_outgroup, "out"); endif if (lti1.tsam == lti2.tsam) retlti.tsam = lti1.tsam; elseif (lti1.tsam == -2) retlti.tsam = lti2.tsam; elseif (lti2.tsam == -2) retlti.tsam = lti1.tsam; elseif (lti1.tsam == -1 && lti2.tsam > 0) retlti.tsam = lti2.tsam; elseif (lti2.tsam == -1 && lti1.tsam > 0) retlti.tsam = lti1.tsam; else error ("lti_group: systems must have identical sampling times"); endif endfunction function ret = __merge_struct__ (a, b, iostr) ## FIXME: this is too complicated; ## isn't there a simple function for this task? ## bug #40224: orderfields (struct ()) errors out in Octave 3.6.4 ## therefore use nfields to check for empty structs if (nfields (a)) a = orderfields (a); endif if (nfields (b)) b = orderfields (b); endif fa = fieldnames (a); fb = fieldnames (b); [fi, ia, ib] = intersect (fa, fb); ca = struct2cell (a); cb = struct2cell (b); for k = numel (fi) : -1 : 1 ca{ia(k)} = vertcat (ca{ia(k)}(:), cb{ib(k)}(:)); fb(ib(k)) = []; cb(ib(k)) = []; endfor ret = cell2struct ([ca; cb], [fa; fb]); endfunction control/inst/@lti/__lti_prune__.m0000644000076500000240000000524112273411257016366 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Submodel extraction and reordering for LTI objects. ## This file is part of the Model Abstraction Layer. ## For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.2 function [lti, out_idx, in_idx] = __lti_prune__ (lti, out_idx, in_idx) if (ischar (out_idx) && ! strcmp (out_idx, ":")) # sys("grp", :) out_idx = {out_idx}; endif if (ischar (in_idx) && ! strcmp (in_idx, ":")) # sys(:, "grp") in_idx = {in_idx}; endif if (iscell (out_idx)) # sys({"grp1", "grp2"}, :) tmp = cellfun (@(x) __str2idx__ (lti.outgroup, lti.outname, x, "out"), out_idx, "uniformoutput", false); out_idx = vertcat (tmp{:}); endif if (iscell (in_idx)) # sys(:, {"grp1", "grp2"}) tmp = cellfun (@(x) __str2idx__ (lti.ingroup, lti.inname, x, "in"), in_idx, "uniformoutput", false); in_idx = vertcat (tmp{:}); endif if (nfields (lti.outgroup)) p = numel (lti.outname); # get size before pruning outnames! [lti.outgroup, empty] = structfun (@(x) __group_prune__ (x, out_idx, p), lti.outgroup, "uniformoutput", false); empty = cell2mat (struct2cell (empty)); fields = fieldnames (lti.outgroup); lti.outgroup = rmfield (lti.outgroup, fields(empty)); endif if (nfields (lti.ingroup)) m = numel (lti.inname); [lti.ingroup, empty] = structfun (@(x) __group_prune__ (x, in_idx, m), lti.ingroup, "uniformoutput", false); empty = cell2mat (struct2cell (empty)); fields = fieldnames (lti.ingroup); lti.ingroup = rmfield (lti.ingroup, fields(empty)); endif lti.outname = lti.outname(out_idx); lti.inname = lti.inname(in_idx); endfunction function [group, empty] = __group_prune__ (group, idx, n) lg = length (group); group = sparse (group, 1:lg, 1, n, lg); group = group(idx, :); [group, ~] = find (group); empty = isempty (group); endfunction control/inst/@lti/__property_names__.m0000644000076500000240000000322312273411257017432 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{props}, @var{vals}] =} __property_names__ (@var{sys}) ## Return the list of properties as well as the assignable values for an LTI object sys. ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.2 function [props, vals] = __property_names__ (sys) ## cell vector of lti-specific properties props = {"tsam"; "inname"; "outname"; "ingroup"; "outgroup"; "name"; "notes"; "userdata"}; ## cell vector of lti-specific assignable values vals = {"scalar (sample time in seconds)"; "m-by-1 cell vector of strings"; "p-by-1 cell vector of strings"; "struct with indices as fields"; "struct with indices as fields"; "string"; "string or cell of strings"; "any data type"}; endfunction control/inst/@lti/append.m0000644000076500000240000000227212273411257015041 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} append (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) ## Group @acronym{LTI} models by appending their inputs and outputs. ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function sys = append (varargin) sys = varargin{1}; if (nargin > 1) for k = 2 : nargin sys = __sys_group__ (sys, varargin{k}); endfor endif endfunction control/inst/@lti/blkdiag.m0000644000076500000240000000207112273411257015164 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} blkdiag (@var{sys1}, @var{sys2}) ## Block-diagonal concatenation of @acronym{LTI} models. ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function sys = blkdiag (varargin) sys = append (varargin{:}); endfunction control/inst/@lti/c2d.m0000644000076500000240000001164012273411257014241 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} c2d (@var{sys}, @var{tsam}) ## @deftypefnx {Function File} {@var{sys} =} c2d (@var{sys}, @var{tsam}, @var{method}) ## @deftypefnx {Function File} {@var{sys} =} c2d (@var{sys}, @var{tsam}, @var{'prewarp'}, @var{w0}) ## Convert the continuous @acronym{LTI} model into its discrete-time equivalent. ## ## @strong{Inputs} ## @table @var ## @item sys ## Continuous-time @acronym{LTI} model. ## @item tsam ## Sampling time in seconds. ## @item method ## Optional conversion method. If not specified, default method @var{"zoh"} ## is taken. ## @table @var ## @item 'zoh' ## Zero-order hold or matrix exponential. ## @item 'tustin', 'bilin' ## Bilinear transformation or Tustin approximation. ## @item 'prewarp' ## Bilinear transformation with pre-warping at frequency @var{w0}. ## @item 'matched' ## Matched pole/zero method. ## @end table ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## Discrete-time @acronym{LTI} model. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.3 function sys = c2d (sys, tsam, method = "std", w0 = 0) if (nargin < 2 || nargin > 4) print_usage (); endif if (! isa (sys, "lti")) error ("c2d: first argument is not an LTI model"); endif if (isdt (sys)) error ("c2d: system is already discrete-time"); endif if (! issample (tsam)) error ("c2d: second argument is not a valid sample time"); endif if (! ischar (method)) error ("c2d: third argument is not a string"); endif if (! issample (w0, 0)) error ("c2d: fourth argument is not a valid pre-warping frequency"); endif sys = __c2d__ (sys, tsam, lower (method), w0); sys.tsam = tsam; endfunction ## bilinear transformation ## using oct-file directly %!shared Mo, Me %! A = [ 1.0 0.5 %! 0.5 1.0 ].'; %! %! B = [ 0.0 -1.0 %! 1.0 0.0 ].'; %! %! C = [ -1.0 0.0 %! 0.0 1.0 ].'; %! %! D = [ 1.0 0.0 %! 0.0 -1.0 ].'; %! %! [Ao, Bo, Co, Do] = __sl_ab04md__ (A, B, C, D, 1.0, 1.0, false); %! %! Ae = [ -1.0000 -4.0000 %! -4.0000 -1.0000 ]; %! %! Be = [ 2.8284 0.0000 %! 0.0000 -2.8284 ]; %! %! Ce = [ 0.0000 2.8284 %! -2.8284 0.0000 ]; %! %! De = [ -1.0000 0.0000 %! 0.0000 -3.0000 ]; %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [Ae, Be; Ce, De]; %! %!assert (Mo, Me, 1e-4); ## bilinear transformation ## user function %!shared Mo, Me %! A = [ 1.0 0.5 %! 0.5 1.0 ].'; %! %! B = [ 0.0 -1.0 %! 1.0 0.0 ].'; %! %! C = [ -1.0 0.0 %! 0.0 1.0 ].'; %! %! D = [ 1.0 0.0 %! 0.0 -1.0 ].'; %! %! [Ao, Bo, Co, Do] = ssdata (c2d (ss (A, B, C, D), 2, "tustin")); %! %! Ae = [ -1.0000 -4.0000 %! -4.0000 -1.0000 ]; %! %! Be = [ 2.8284 0.0000 %! 0.0000 -2.8284 ]; %! %! Ce = [ 0.0000 2.8284 %! -2.8284 0.0000 ]; %! %! De = [ -1.0000 0.0000 %! 0.0000 -3.0000 ]; %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [Ae, Be; Ce, De]; %! %!assert (Mo, Me, 1e-4); ## bilinear transformation ## both directions %!shared Mo, Me %! A = [ 1.0 0.5 %! 0.5 1.0 ]; %! %! B = [ 0.0 -1.0 %! 1.0 0.0 ]; %! %! C = [ -1.0 0.0 %! 0.0 1.0 ]; %! %! D = [ 1.0 0.0 %! 0.0 -1.0 ]; %! %! [Ao, Bo, Co, Do] = ssdata (d2c (c2d (ss (A, B, C, D), 2, "tustin"), "tustin")); %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [A, B; C, D]; %! %!assert (Mo, Me, 1e-4); ## zero-order hold ## both directions %!shared Mo, Me %! A = [ 1.0 0.5 %! 0.5 1.0 ]; %! %! B = [ 0.0 -1.0 %! 1.0 0.0 ]; %! %! C = [ -1.0 0.0 %! 0.0 1.0 ]; %! %! D = [ 1.0 0.0 %! 0.0 -1.0 ]; %! %! [Ao, Bo, Co, Do] = ssdata (d2c (c2d (ss (A, B, C, D), 2, "zoh"), "zoh")); %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [A, B; C, D]; %! %!assert (Mo, Me, 1e-4); ## bilinear transformation with pre-warping ## both directions %!shared Mo, Me %! A = [ 1.0 0.5 %! 0.5 1.0 ]; %! %! B = [ 0.0 -1.0 %! 1.0 0.0 ]; %! %! C = [ -1.0 0.0 %! 0.0 1.0 ]; %! %! D = [ 1.0 0.0 %! 0.0 -1.0 ]; %! %! [Ao, Bo, Co, Do] = ssdata (d2c (c2d (ss (A, B, C, D), 2, "prewarp", 1000), "prewarp", 1000)); %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [A, B; C, D]; %! %!assert (Mo, Me, 1e-4); control/inst/@lti/connect.m0000644000076500000240000001045112273411257015221 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} connect (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{inputs}, @var{outputs}) ## @deftypefnx {Function File} {@var{sys} =} connect (@var{sys}, @var{cm}, @var{inputs}, @var{outputs}) ## Name-based interconnections between the inputs and outputs of @acronym{LTI} models. ## ## @strong{Inputs} ## @table @var ## @item sys1, @dots{}, sysN ## @acronym{LTI} models to be connected. The properties 'inname' and 'outname' ## of each model should be set according to the desired input-output connections. ## @item inputs ## String or cell of strings containing the names of the inputs to be kept. ## The names must be part of the properties 'ingroup' or 'inname'. ## @item outputs ## String or cell of strings containing the names of the outputs to be kept. ## The names must be part of the properties 'outgroup' or 'outname'. ## @item cm ## Legacy connection matrix (not name-based). ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## Resulting interconnected system with outputs @var{outputs} and ## inputs @var{inputs}. ## @end table ## ## @seealso{sumblk} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.2 function sys = connect (varargin) if (nargin < 2) print_usage (); endif if (is_real_matrix (varargin{2})) # connect (sys, cm, in_idx, out_idx) if (nargin != 4) print_usage (); endif sys = varargin{1}; cm = varargin{2}; in_idx = varargin{3}; out_idx = varargin{4}; [p, m] = size (sys); [cmrows, cmcols] = size (cm); ## TODO: proper argument checking ## TODO: replace nested for-if statement ## if (! is_real_matrix (cm)) ## error ("connect: second argument must be a matrix with real-valued coefficients"); ## endif M = zeros (m, p); in = cm(:, 1); out = cm(:, 2:cmcols); for a = 1 : cmrows for b = 1 : cmcols-1 if (out(a, b) != 0) M(in(a, 1), abs (out(a, b))) = sign (out(a, b)); endif endfor endfor sys = __sys_connect__ (sys, M); sys = __sys_prune__ (sys, out_idx, in_idx); else # connect (sys1, sys2, ..., sysN, in_idx, out_idx) lti_idx = cellfun (@isa, varargin, {"lti"}); sys = append (varargin{lti_idx}); io_idx = ! lti_idx; if (nnz (io_idx) != 2) error ("connect: require arguments 'inputs' and 'outputs'"); endif in_idx = varargin(io_idx){1}; out_idx = varargin(io_idx){2}; inname = sys.inname; outname = sys.outname; ioname = intersect (inname, outname); tmp = cellfun (@(x) find (strcmp (inname, x)(:)), ioname, "uniformoutput", false); inputs = vertcat (tmp{:}); # there could be more than one input with the same name ## FIXME: sys_prune will error out if names in out_idx and in_idx are not unique ## the dark side handles cases with common in_idx names [p, m] = size (sys); M = zeros (m, p); for k = 1 : length (inputs) outputs = strcmp (outname, inname(inputs(k))); M(inputs(k), :) = outputs; endfor sys = __sys_connect__ (sys, M); sys = __sys_prune__ (sys, out_idx, in_idx); if (isa (sys, "ss")) sys = sminreal (sys); endif endif endfunction %!shared T, Texp %! P = Boeing707; %! I = ss (-eye (2)); %! I.inname = P.outname; %! I.outname = P.inname; %! T = connect (P, I, P.inname, P.outname); %! Texp = feedback (P); %!assert (T.a, Texp.a, 1e-4); %!assert (T.b, Texp.b, 1e-4); %!assert (T.c, Texp.c, 1e-4); %!assert (T.d, Texp.d, 1e-4); control/inst/@lti/ctranspose.m0000644000076500000240000000325412273411257015754 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Conjugate transpose or pertransposition of @acronym{LTI} objects. ## Used by Octave for "sys'". ## For a transfer-function matrix G, G' denotes the conjugate ## of G given by G.'(-s) for a continuous-time system or G.'(1/z) ## for a discrete-time system. ## The frequency response of the pertransposition of G is the ## Hermitian (conjugate) transpose of G(jw), i.e. ## freqresp (G', w) = freqresp (G, w)'. ## @strong{WARNING:} Do @strong{NOT} use this for dual problems, ## use the transpose "sys.'" (note the dot) instead. ## Author: Lukas Reichlin ## Created: May 2012 ## Version: 0.1 function sys = ctranspose (sys) if (nargin != 1) # prevent sys = ctranspose (sys1, sys2, sys3, ...) error ("lti: ctranspose: this is an unary operator"); endif [p, m] = size (sys); ct = isct (sys); sys = __ctranspose__ (sys, ct); sys.inname = repmat ({""}, p, 1); sys.outname = repmat ({""}, m, 1); endfunction control/inst/@lti/d2c.m0000644000076500000240000000675412273411257014253 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} d2c (@var{sys}) ## @deftypefnx {Function File} {@var{sys} =} d2c (@var{sys}, @var{method}) ## @deftypefnx {Function File} {@var{sys} =} d2c (@var{sys}, @var{'prewarp'}, @var{w0}) ## Convert the discrete @acronym{LTI} model into its continuous-time equivalent. ## ## @strong{Inputs} ## @table @var ## @item sys ## Discrete-time @acronym{LTI} model. ## @item method ## Optional conversion method. If not specified, default method @var{"zoh"} ## is taken. ## @table @var ## @item 'zoh' ## Zero-order hold or matrix logarithm. ## @item 'tustin', 'bilin' ## Bilinear transformation or Tustin approximation. ## @item 'prewarp' ## Bilinear transformation with pre-warping at frequency @var{w0}. ## @item 'matched' ## Matched pole/zero method. ## @end table ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## Continuous-time @acronym{LTI} model. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2011 ## Version: 0.2 function sys = d2c (sys, method = "std", w0 = 0) if (nargin == 0 || nargin > 3) print_usage (); endif if (! isa (sys, "lti")) error ("d2c: first argument is not an LTI model"); endif if (isct (sys)) error ("d2c: system is already continuous-time"); endif if (! ischar (method)) error ("d2c: second argument is not a string"); endif if (! issample (w0, 0)) error ("d2c: third argument is not a valid pre-warping frequency"); endif sys = __d2c__ (sys, sys.tsam, lower (method), w0); sys.tsam = 0; endfunction ## bilinear transformation ## both directions %!shared Mo, Me %! A = [ 1.0 0.5 %! 0.5 1.0 ]; %! %! B = [ 0.0 -1.0 %! 1.0 0.0 ]; %! %! C = [ -1.0 0.0 %! 0.0 1.0 ]; %! %! D = [ 1.0 0.0 %! 0.0 -1.0 ]; %! %! [Ao, Bo, Co, Do] = ssdata (d2c (c2d (ss (A, B, C, D), 2, "tustin"), "tustin")); %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [A, B; C, D]; %! %!assert (Mo, Me, 1e-4); ## zero-order hold ## both directions %!shared Mo, Me %! A = [ 1.0 0.5 %! 0.5 1.0 ]; %! %! B = [ 0.0 -1.0 %! 1.0 0.0 ]; %! %! C = [ -1.0 0.0 %! 0.0 1.0 ]; %! %! D = [ 1.0 0.0 %! 0.0 -1.0 ]; %! %! [Ao, Bo, Co, Do] = ssdata (d2c (c2d (ss (A, B, C, D), 2, "zoh"), "zoh")); %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [A, B; C, D]; %! %!assert (Mo, Me, 1e-4); ## bilinear transformation with pre-warping ## both directions %!shared Mo, Me %! A = [ 1.0 0.5 %! 0.5 1.0 ]; %! %! B = [ 0.0 -1.0 %! 1.0 0.0 ]; %! %! C = [ -1.0 0.0 %! 0.0 1.0 ]; %! %! D = [ 1.0 0.0 %! 0.0 -1.0 ]; %! %! [Ao, Bo, Co, Do] = ssdata (d2c (c2d (ss (A, B, C, D), 2, "prewarp", 1000), "prewarp", 1000)); %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [A, B; C, D]; %! %!assert (Mo, Me, 1e-4); control/inst/@lti/d2d.m0000644000076500000240000000460212273411257014242 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} d2d (@var{sys}, @var{tsam}) ## @deftypefnx {Function File} {@var{sys} =} d2d (@var{sys}, @var{tsam}, @var{method}) ## @deftypefnx {Function File} {@var{sys} =} d2d (@var{sys}, @var{tsam}, @var{'prewarp'}, @var{w0}) ## Resample discrete-time @acronym{LTI} model to sampling time @var{tsam}. ## ## @strong{Inputs} ## @table @var ## @item sys ## Discrete-time @acronym{LTI} model. ## @item tsam ## Desired sampling time in seconds. ## @item method ## Optional conversion method. If not specified, default method @var{"zoh"} ## is taken. ## @table @var ## @item 'zoh' ## Zero-order hold or matrix logarithm. ## @item 'tustin', 'bilin' ## Bilinear transformation or Tustin approximation. ## @item 'prewarp' ## Bilinear transformation with pre-warping at frequency @var{w0}. ## @item 'matched' ## Matched pole/zero method. ## @end table ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## Resampled discrete-time @acronym{LTI} model with sampling time @var{tsam}. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2013 ## Version: 0.1 function sys = d2d (sys, tsam, method = "std", w0 = 0) if (nargin < 2) print_usage (); endif tmp = d2c (sys, method, w0); sys = c2d (tmp, tsam, method, w0); endfunction %!shared num, den, z, p, k %! H1 = zpk (0.7, 0.5, 1, 0.1); %! H2 = d2d (H1, 0.05); %! H3 = d2d (H2, 0.1); %! [num, den] = tfdata (H2, "vector"); %! [z, p, k] = zpkdata (H3, "vector"); %!assert (num, [1.00000 -0.82426], 1e-4); %!assert (den, [1.00000 -0.70711], 1e-4); %!assert (z, 0.7, 1e-4); %!assert (p, 0.5, 1e-4); %!assert (k, 1.0, 1e-4); control/inst/@lti/dcgain.m0000644000076500000240000000257012273411257015020 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{k} =} dcgain (@var{sys}) ## DC gain of @acronym{LTI} model. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. ## @end table ## ## @strong{Outputs} ## @table @var ## @item k ## DC gain matrice. For a system with m inputs and p outputs, the array @var{k} ## has dimensions [p, m]. ## @end table ## ## @seealso{freqresp} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.1 function gain = dcgain (sys) if (nargin != 1) # sys is always an LTI model print_usage (); endif gain = __freqresp__ (sys, 0); endfunction control/inst/@lti/display.m0000644000076500000240000000301412273411257015232 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Display routine for LTI objects. Called by its child classes. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.2 function display (sys) if (nfields (sys.ingroup) > 0) __disp_group__ (sys.ingroup, "Input"); endif if (nfields (sys.outgroup) > 0) __disp_group__ (sys.outgroup, "Output"); endif if (sys.tsam > 0) disp (sprintf ("Sampling time: %g s", sys.tsam)); elseif (sys.tsam == -1) disp ("Sampling time: unspecified"); endif endfunction function __disp_group__ (group, io) name = fieldnames (group); idx = struct2cell (group); cellfun (@(name, idx) printf ("%s group '%s' = %s\n", io, name, mat2str (idx(:).')), ... name, idx, "uniformoutput", false); endfunction control/inst/@lti/dss.m0000644000076500000240000000243512273411257014364 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Convert to descriptor state-space model. ## Since it is impossible to call a function inside @NAME without any ## argument of class NAME (except the constructor @NAME/NAME.m), ## the "constructor" for dss models is located outside folder @ss. ## Author: Lukas Reichlin ## Created: September 2010 ## Version: 0.1 function sys = dss (sys) if (nargin != 1) print_usage (); endif if (! isa (sys, "ss")) sys = ss (sys); endif a = __sys_data__ (sys); sys = __set__ (sys, "e", eye (size (a))); endfunction control/inst/@lti/dssdata.m0000644000076500000240000000473512273411257015223 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{a}, @var{b}, @var{c}, @var{d}, @var{e}, @var{tsam}] =} dssdata (@var{sys}) ## @deftypefnx {Function File} {[@var{a}, @var{b}, @var{c}, @var{d}, @var{e}, @var{tsam}] =} dssdata (@var{sys}, @var{[]}) ## Access descriptor state-space model data. ## Argument @var{sys} is not limited to descriptor state-space models. ## If @var{sys} is not a descriptor state-space model, it is converted automatically. ## ## @strong{Inputs} ## @table @var ## @item sys ## Any type of @acronym{LTI} model. ## @item [] ## In case @var{sys} is not a dss model (descriptor matrix @var{e} empty), ## @code{dssdata (sys, [])} returns the empty element @code{e = []} whereas ## @code{dssdata (sys)} returns the identity matrix @code{e = eye (size (a))}. ## @end table ## ## @strong{Outputs} ## @table @var ## @item a ## State matrix (n-by-n). ## @item b ## Input matrix (n-by-m). ## @item c ## Measurement matrix (p-by-n). ## @item d ## Feedthrough matrix (p-by-m). ## @item e ## Descriptor matrix (n-by-n). ## @item tsam ## Sampling time in seconds. If @var{sys} is a continuous-time model, ## a zero is returned. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2010 ## Version: 0.2 function [a, b, c, d, e, tsam, scaled] = dssdata (sys, flg = 0) ## NOTE: In case sys is not a dss model (matrice e empty), ## dssdata (sys, []) returns e = [] whereas ## dssdata (sys) returns e = eye (size (a)) if (nargin > 2) print_usage (); endif if (! isa (sys, "ss")) sys = ss (sys); endif [a, b, c, d, e, ~, scaled] = __sys_data__ (sys); if (isempty (e) && ! isempty (flg)) e = eye (size (a)); # return eye for ss models endif tsam = sys.tsam; endfunction control/inst/@lti/eig.m0000644000076500000240000000201712273411257014333 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{p} =} eig (@var{sys}) ## Compute poles of @acronym{LTI} system. ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.1 function pol = eig (varargin) pol = pole (varargin{:}); endfunction control/inst/@lti/end.m0000644000076500000240000000233212273411257014335 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## End indexing for @acronym{LTI} objects. ## Used by Octave for "sys(1:end, end-1)". ## Author: Lukas Reichlin ## Created: December 2013 ## Version: 0.1 function ret = end (sys, k, n) if (n != 2) error ("lti: end: require 2 indices in the expression"); endif [p, m] = size (sys); switch (k) case 1 ret = p; case 2 ret = m; otherwise error ("lti: end: invalid expression index k = %d", k); endswitch endfunction control/inst/@lti/feedback.m0000644000076500000240000002075212273411257015321 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} feedback (@var{sys1}) ## @deftypefnx {Function File} {@var{sys} =} feedback (@var{sys1}, @var{"+"}) ## @deftypefnx {Function File} {@var{sys} =} feedback (@var{sys1}, @var{sys2}) ## @deftypefnx {Function File} {@var{sys} =} feedback (@var{sys1}, @var{sys2}, @var{"+"}) ## @deftypefnx {Function File} {@var{sys} =} feedback (@var{sys1}, @var{sys2}, @var{feedin}, @var{feedout}) ## @deftypefnx {Function File} {@var{sys} =} feedback (@var{sys1}, @var{sys2}, @var{feedin}, @var{feedout}, @var{"+"}) ## Feedback connection of two @acronym{LTI} models. ## ## @strong{Inputs} ## @table @var ## @item sys1 ## @acronym{LTI} model of forward transmission. @code{[p1, m1] = size (sys1)}. ## @item sys2 ## @acronym{LTI} model of backward transmission. ## If not specified, an identity matrix of appropriate size is taken. ## @item feedin ## Vector containing indices of inputs to @var{sys1} which are involved in the feedback loop. ## The number of @var{feedin} indices and outputs of @var{sys2} must be equal. ## If not specified, @code{1:m1} is taken. ## @item feedout ## Vector containing indices of outputs from @var{sys1} which are to be connected to @var{sys2}. ## The number of @var{feedout} indices and inputs of @var{sys2} must be equal. ## If not specified, @code{1:p1} is taken. ## @item "+" ## Positive feedback sign. If not specified, @var{"-"} for a negative feedback interconnection ## is assumed. @var{+1} and @var{-1} are possible as well, but only from the third argument ## onward due to ambiguity. ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## Resulting @acronym{LTI} model. ## @end table ## ## @strong{Block Diagram} ## @example ## @group ## u + +--------+ y ## ------>(+)----->| sys1 |-------+-------> ## ^ - +--------+ | ## | | ## | +--------+ | ## +-------| sys2 |<------+ ## +--------+ ## @end group ## @end example ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.7 function sys = feedback (sys1, sys2, feedin, feedout, fbsign = -1) [p1, m1] = size (sys1); switch (nargin) case 1 # sys = feedback (sys) if (p1 != m1) error ("feedback: argument must be a square system"); endif sys2 = eye (p1); feedin = 1 : m1; feedout = 1 : p1; case 2 if (ischar (sys2)) # sys = feedback (sys, "+") if (p1 != m1) error ("feedback: first argument must be a square system"); endif fbsign = __check_fbsign__ (sys2); sys2 = eye (p1); endif # sys = feedback (sys1, sys2) feedin = 1 : m1; feedout = 1 : p1; case 3 # sys = feedback (sys1, sys2, "+") fbsign = __check_fbsign__ (feedin); feedin = 1 : m1; feedout = 1 : p1; case 4 # sys = feedback (sys1, sys2, feedin, feedout) ## nothing needs to be done here ## case 4 required to prevent "otherwise" case 5 # sys = feedback (sys1, sys2, feedin, feedout, "+") fbsign = __check_fbsign__ (fbsign); otherwise print_usage (); endswitch if (ischar (feedin)) feedin = {feedin}; endif if (ischar (feedout)) feedout = {feedout}; endif if (iscell (feedin)) tmp = cellfun (@(x) __str2idx__ (sys1.ingroup, sys1.inname, x, "in"), feedin, "uniformoutput", false); feedin = vertcat (tmp{:}); endif if (iscell (feedout)) tmp = cellfun (@(x) __str2idx__ (sys1.outgroup, sys1.outname, x, "out"), feedout, "uniformoutput", false); feedout = vertcat (tmp{:}); endif if (! is_real_vector (feedin) || ! isequal (feedin, abs (fix (feedin)))) error ("feedback: require 'feedin' to be a vector of integers"); endif if (! is_real_vector (feedout) || ! isequal (feedout, abs (fix (feedout)))) error ("feedback: require 'feedout' to be a vector of integers"); endif [p2, m2] = size (sys2); l_feedin = length (feedin); l_feedout = length (feedout); if (l_feedin != p2) error ("feedback: feedin indices: %d, outputs sys2: %d", l_feedin, p2); endif if (l_feedout != m2) error ("feedback: feedout indices: %d, inputs sys2: %d", l_feedout, m2); endif if (any (feedin > m1 | feedin < 1)) error ("feedback: range of feedin indices exceeds dimensions of sys1"); endif if (any (feedout > p1 | feedout < 1)) error ("feedback: range of feedout indices exceeds dimensions of sys1"); endif M11 = zeros (m1, p1); M22 = zeros (m2, p2); M12 = full (sparse (feedin, 1:l_feedin, fbsign, m1, p2)); M21 = full (sparse (1:l_feedout, feedout, 1, m2, p1)); ## NOTE: for-loops do NOT the same as ## M12(feedin, 1:l_feedin) = fbsign; ## M21(1:l_feedout, feedout) = 1; ## ## M12 = zeros (m1, p2); ## M21 = zeros (m2, p1); ## ## for k = 1 : l_feedin ## M12(feedin(k), k) = fbsign; ## endfor ## ## for k = 1 : l_feedout ## M21(k, feedout(k)) = 1; ## endfor M = [M11, M12; M21, M22]; in_idx = 1 : m1; out_idx = 1 : p1; sys = __sys_group__ (sys1, sys2); sys = __sys_connect__ (sys, M); sys = __sys_prune__ (sys, out_idx, in_idx); endfunction function fbsign = __check_fbsign__ (fbsign) if (is_real_scalar (fbsign)) fbsign = sign (fbsign); elseif (ischar (fbsign)) if (strcmp (fbsign, "+")) fbsign = +1; elseif (strcmp (fbsign, "-")) fbsign = -1; else error ("feedback: invalid feedback sign string"); endif else error ("feedback: invalid feedback sign type"); endif endfunction ## Feedback inter-connection of two systems in state-space form ## Test from SLICOT AB05ND %!shared M, Me %! A1 = [ 1.0 0.0 -1.0 %! 0.0 -1.0 1.0 %! 1.0 1.0 2.0 ]; %! %! B1 = [ 1.0 1.0 0.0 %! 2.0 0.0 1.0 ].'; %! %! C1 = [ 3.0 -2.0 1.0 %! 0.0 1.0 0.0 ]; %! %! D1 = [ 1.0 0.0 %! 0.0 1.0 ]; %! %! A2 = [-3.0 0.0 0.0 %! 1.0 0.0 1.0 %! 0.0 -1.0 2.0 ]; %! %! B2 = [ 0.0 -1.0 0.0 %! 1.0 0.0 2.0 ].'; %! %! C2 = [ 1.0 1.0 0.0 %! 1.0 1.0 -1.0 ]; %! %! D2 = [ 1.0 1.0 %! 0.0 1.0 ]; %! %! sys1 = ss (A1, B1, C1, D1); %! sys2 = ss (A2, B2, C2, D2); %! sys = feedback (sys1, sys2); %! [A, B, C, D] = ssdata (sys); %! M = [A, B; C, D]; %! %! Ae = [-0.5000 -0.2500 -1.5000 -1.2500 -1.2500 0.7500 %! -1.5000 -0.2500 0.5000 -0.2500 -0.2500 -0.2500 %! 1.0000 0.5000 2.0000 -0.5000 -0.5000 0.5000 %! 0.0000 0.5000 0.0000 -3.5000 -0.5000 0.5000 %! -1.5000 1.2500 -0.5000 1.2500 0.2500 1.2500 %! 0.0000 1.0000 0.0000 -1.0000 -2.0000 3.0000 ]; %! %! Be = [ 0.5000 0.7500 %! 0.5000 -0.2500 %! 0.0000 0.5000 %! 0.0000 0.5000 %! -0.5000 0.2500 %! 0.0000 1.0000 ]; %! %! Ce = [ 1.5000 -1.2500 0.5000 -0.2500 -0.2500 -0.2500 %! 0.0000 0.5000 0.0000 -0.5000 -0.5000 0.5000 ]; %! %! De = [ 0.5000 -0.2500 %! 0.0000 0.5000 ]; %! %! Me = [Ae, Be; Ce, De]; %! %!assert (M, Me, 1e-4); ## sensitivity function ## Note the correct physical meaning of the states. ## Test would fail on a commercial octave clone ## because of wrong signs of matrices B and C. ## NOTE: Don't use T = I - S for complementary sensitivity, ## use T = feedback (L) instead! %!shared S1, S2 %! P = ss (-2, 3, 4, 5); # meaningless numbers %! C = ss (-1, 1, 1, 0); # ditto %! L = P * C; %! I = eye (size (L)); %! S1 = feedback (I, L*-I, "+"); # draw a block diagram for better understanding %! S2 = inv (I + L); %!assert (S1.a, S2.a, 1e-4); %!assert (S1.b, S2.b, 1e-4); %!assert (S1.c, S2.c, 1e-4); %!assert (S1.d, S2.d, 1e-4); control/inst/@lti/filtdata.m0000644000076500000240000000621312273411257015361 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{num}, @var{den}, @var{tsam}] =} filtdata (@var{sys}) ## @deftypefnx {Function File} {[@var{num}, @var{den}, @var{tsam}] =} filtdata (@var{sys}, @var{"vector"}) ## Access discrete-time transfer function data in DSP format. ## Argument @var{sys} is not limited to transfer function models. ## If @var{sys} is not a transfer function, it is converted automatically. ## ## @strong{Inputs} ## @table @var ## @item sys ## Any type of discrete-time @acronym{LTI} model. ## @item "v", "vector" ## For SISO models, return @var{num} and @var{den} directly as column vectors ## instead of cells containing a single column vector. ## @end table ## ## @strong{Outputs} ## @table @var ## @item num ## Cell of numerator(s). Each numerator is a row vector ## containing the coefficients of the polynomial in ascending powers of z^-1. ## num@{i,j@} contains the numerator polynomial from input j to output i. ## In the SISO case, a single vector is possible as well. ## @item den ## Cell of denominator(s). Each denominator is a row vector ## containing the coefficients of the polynomial in ascending powers of z^-1. ## den@{i,j@} contains the denominator polynomial from input j to output i. ## In the SISO case, a single vector is possible as well. ## @item tsam ## Sampling time in seconds. If @var{tsam} is not specified, -1 is returned. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: April 2012 ## Version: 0.1 function [num, den, tsam] = filtdata (sys, rtype = "cell") if (nargin > 2) print_usage (); endif if (! isdt (sys)) error ("lti: filtdata: require discrete-time system"); endif [num, den, tsam] = tfdata (sys); ## make numerator and denominator polynomials equally long ## by adding leading zeros lnum = cellfun (@length, num, "uniformoutput", false); lden = cellfun (@length, den, "uniformoutput", false); lmax = cellfun (@max, lnum, lden, "uniformoutput", false); num = cellfun (@prepad, num, lmax, "uniformoutput", false); den = cellfun (@prepad, den, lmax, "uniformoutput", false); ## remove trailing zeros ## such that polynomials are as short as possible num = cellfun (@__remove_trailing_zeros__, num, "uniformoutput", false); den = cellfun (@__remove_trailing_zeros__, den, "uniformoutput", false); if (strncmpi (rtype, "v", 1) && issiso (sys)) num = num{1}; den = den{1}; endif endfunction control/inst/@lti/frdata.m0000644000076500000240000000426012273411257015032 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{H}, @var{w}, @var{tsam}] =} frdata (@var{sys}) ## @deftypefnx {Function File} {[@var{H}, @var{w}, @var{tsam}] =} frdata (@var{sys}, @var{"vector"}) ## Access frequency response data. ## Argument @var{sys} is not limited to frequency response data objects. ## If @var{sys} is not a frd object, it is converted automatically. ## ## @strong{Inputs} ## @table @var ## @item sys ## Any type of @acronym{LTI} model. ## @item "v", "vector" ## In case @var{sys} is a SISO model, this option returns the frequency response ## as a column vector (lw-by-1) instead of an array (p-by-m-by-lw). ## @end table ## ## @strong{Outputs} ## @table @var ## @item H ## Frequency response array (p-by-m-by-lw). H(i,j,k) contains the ## response from input j to output i at frequency k. In the SISO case, ## a vector (lw-by-1) is possible as well. ## @item w ## Frequency vector (lw-by-1) in radian per second [rad/s]. ## Frequencies are in ascending order. ## @item tsam ## Sampling time in seconds. If @var{sys} is a continuous-time model, ## a zero is returned. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.3 function [H, w, tsam] = frdata (sys, rtype = "array") if (! isa (sys, "frd")) sys = frd (sys); endif [H, w] = __sys_data__ (sys); tsam = sys.tsam; if (strncmpi (rtype, "v", 1) && issiso (sys)) H = reshape (H, [], 1); endif endfunction control/inst/@lti/freqresp.m0000644000076500000240000000330612273411257015420 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {@var{H} =} freqresp (@var{sys}, @var{w}) ## Evaluate frequency response at given frequencies. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. ## @item w ## Vector of frequency values. ## @end table ## ## @strong{Outputs} ## @table @var ## @item H ## Array of frequency response. For a system with m inputs and p outputs, the array @var{H} ## has dimensions [p, m, length (w)]. ## The frequency response at the frequency w(k) is given by H(:,:,k). ## @end table ## ## @seealso{dcgain} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.2 function H = freqresp (sys, w) if (nargin != 2) # case freqresp () not possible print_usage (); endif if (! is_real_vector (w)) # catches freqresp (sys, sys) and freqresp (w, sys) as well error ("freqresp: second argument must be a real vector"); endif H = __freqresp__ (sys, w); endfunction control/inst/@lti/get.m0000644000076500000240000000406712273411257014355 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {} get (@var{sys}) ## @deftypefnx {Function File} {@var{value} =} get (@var{sys}, @var{"property"}) ## Access property values of @acronym{LTI} objects. ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.2 function varargout = get (sys, varargin) if (nargin == 1) [props, vals] = __property_names__ (sys); nrows = numel (props); str = strjust (strvcat (props), "right"); str = horzcat (repmat (" ", nrows, 1), str, repmat (": ", nrows, 1), strvcat (vals)); disp (str); else for k = 1 : (nargin-1) prop = lower (varargin{k}); switch (prop) case {"inname", "inputname", "inn", "inputn"} val = sys.inname; case {"outname", "outputname", "outn", "outputn"} val = sys.outname; case {"ingroup", "inputgroup", "ing", "inputg"} val = sys.ingroup; case {"outgroup", "outputgroup", "outg", "outputg"} val = sys.outgroup; case {"tsam", "ts"} val = sys.tsam; case "name" val = sys.name; case "notes" val = sys.notes; case "userdata" val = sys.userdata; otherwise val = __get__ (sys, prop); endswitch varargout{k} = val; endfor endif endfunction control/inst/@lti/horzcat.m0000644000076500000240000000603312273411257015243 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Horizontal concatenation of @acronym{LTI} objects. If necessary, object conversion ## is done by sys_group. Used by Octave for "[sys1, sys2]". ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.2 function sys = horzcat (sys, varargin) for k = 1 : (nargin-1) sys1 = sys; sys2 = varargin{k}; [p1, m1] = size (sys1); [p2, m2] = size (sys2); if (p1 != p2) error ("lti: horzcat: number of system outputs incompatible: [(%dx%d), (%dx%d)]", p1, m1, p2, m2); endif sys = __sys_group__ (sys1, sys2); out_scl = [eye(p1), eye(p2)]; sys = out_scl * sys; endfor endfunction ## Rowwise concatenation of two systems in state-space form ## Test from SLICOT AB05OD %!shared M, Me %! A1 = [ 1.0 0.0 -1.0 %! 0.0 -1.0 1.0 %! 1.0 1.0 2.0 ]; %! %! B1 = [ 1.0 1.0 0.0 %! 2.0 0.0 1.0 ].'; %! %! C1 = [ 3.0 -2.0 1.0 %! 0.0 1.0 0.0 ]; %! %! D1 = [ 1.0 0.0 %! 0.0 1.0 ]; %! %! A2 = [-3.0 0.0 0.0 %! 1.0 0.0 1.0 %! 0.0 -1.0 2.0 ]; %! %! B2 = [ 0.0 -1.0 0.0 %! 1.0 0.0 2.0 ].'; %! %! C2 = [ 1.0 1.0 0.0 %! 1.0 1.0 -1.0 ]; %! %! D2 = [ 1.0 1.0 %! 0.0 1.0 ]; %! %! sys1 = ss (A1, B1, C1, D1); %! sys2 = ss (A2, B2, C2, D2); %! sys = [sys1, sys2]; %! [A, B, C, D] = ssdata (sys); %! M = [A, B; C, D]; %! %! Ae = [ 1.0000 0.0000 -1.0000 0.0000 0.0000 0.0000 %! 0.0000 -1.0000 1.0000 0.0000 0.0000 0.0000 %! 1.0000 1.0000 2.0000 0.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 -3.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 1.0000 0.0000 1.0000 %! 0.0000 0.0000 0.0000 0.0000 -1.0000 2.0000 ]; %! %! Be = [ 1.0000 2.0000 0.0000 0.0000 %! 1.0000 0.0000 0.0000 0.0000 %! 0.0000 1.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 1.0000 %! 0.0000 0.0000 -1.0000 0.0000 %! 0.0000 0.0000 0.0000 2.0000 ]; %! %! Ce = [ 3.0000 -2.0000 1.0000 1.0000 1.0000 0.0000 %! 0.0000 1.0000 0.0000 1.0000 1.0000 -1.0000 ]; %! %! De = [ 1.0000 0.0000 1.0000 1.0000 %! 0.0000 1.0000 0.0000 1.0000 ]; %! %! Me = [Ae, Be; Ce, De]; %! %!assert (M, Me, 1e-4); control/inst/@lti/inv.m0000644000076500000240000000415112273411257014364 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Inversion of @acronym{LTI} objects. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.2 function retsys = inv (sys) if (nargin != 1) # prevent sys = inv (sys1, sys2, sys3, ...) error ("lti: inv: this is an unary operator"); endif [p, m] = size (sys); if (p != m) error ("lti: inv: system must be square"); endif retsys = __sys_inverse__ (sys); ## TODO: handle i/o names endfunction ## inverse of state-space models ## test from SLICOT AB07ND ## result differs intentionally from a commercial ## implementation of an octave-like language %!shared M, Me %! A = [ 1.0 2.0 0.0 %! 4.0 -1.0 0.0 %! 0.0 0.0 1.0 ]; %! %! B = [ 1.0 0.0 %! 0.0 1.0 %! 1.0 0.0 ]; %! %! C = [ 0.0 1.0 -1.0 %! 0.0 0.0 1.0 ]; %! %! D = [ 4.0 0.0 %! 0.0 1.0 ]; %! %! sys = ss (A, B, C, D); %! sysinv = inv (sys); %! [Ai, Bi, Ci, Di] = ssdata (sysinv); %! M = [Ai, Bi; Ci, Di]; %! %! Ae = [ 1.0000 1.7500 0.2500 %! 4.0000 -1.0000 -1.0000 %! 0.0000 -0.2500 1.2500 ]; %! %! Be = [-0.2500 0.0000 %! 0.0000 -1.0000 %! -0.2500 0.0000 ]; %! %! Ce = [ 0.0000 0.2500 -0.2500 %! 0.0000 0.0000 1.0000 ]; %! %! De = [ 0.2500 0.0000 %! 0.0000 1.0000 ]; %! %! Me = [Ae, Be; Ce, De]; # Me = [Ae, -Be; -Ce, De]; %! %!assert (M, Me, 1e-4); control/inst/@lti/isct.m0000644000076500000240000000261312273411257014533 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{bool} =} isct (@var{sys}) ## Determine whether @acronym{LTI} model is a continuous-time system. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. ## @end table ## ## @strong{Outputs} ## @table @var ## @item bool = 0 ## @var{sys} is a discrete-time system. ## @item bool = 1 ## @var{sys} is a continuous-time system or a static gain. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function bool = isct (ltisys) if (nargin != 1) print_usage (); endif bool = (ltisys.tsam == 0 || ltisys.tsam == -2); endfunction control/inst/@lti/isdt.m0000644000076500000240000000256412273411257014541 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{bool} =} isdt (@var{sys}) ## Determine whether @acronym{LTI} model is a discrete-time system. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. ## @end table ## ## @strong{Outputs} ## @table @var ## @item bool = 0 ## @var{sys} is a continuous-time system. ## @item bool = 1 ## @var{sys} is a discrete-time system or a static gain. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function bool = isdt (ltisys) if (nargin != 1) print_usage (); endif bool = (ltisys.tsam != 0); endfunction control/inst/@lti/isminimumphase.m0000644000076500000240000000364512273411257016627 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{bool} =} isminimumphase (@var{sys}) ## @deftypefnx {Function File} {@var{bool} =} isminimumphase (@var{sys}, @var{tol}) ## Determine whether @acronym{LTI} system is minimum-phase. ## The zeros must lie in the left complex half-plane. ## The name minimum-phase refers to the fact that such a system has the ## minimum possible phase lag for the given magnitude response |sys(jw)|. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. ## @item tol ## Optional tolerance. ## @var{tol} must be a real-valued, non-negative scalar. ## Default value is 0. ## @end table ## ## @strong{Outputs} ## @table @var ## @item bool ## True if the system is minimum-phase and false otherwise. ## @end table ## ## @example ## @group ## real (z) < -tol*(1 + abs (z)) continuous-time ## abs (z) < 1 - tol discrete-time ## @end group ## @end example ## @end deftypefn ## Author: Lukas Reichlin ## Created: January 2011 ## Version: 0.1 function bool = isminimumphase (sys, tol = 0) if (nargin > 2) print_usage (); endif z = zero (sys); ct = isct (sys); bool = __is_stable__ (z, ct, tol); endfunction control/inst/@lti/issiso.m0000644000076500000240000000215712273411257015105 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{bool} =} issiso (@var{sys}) ## Determine whether @acronym{LTI} model is single-input/single-output (SISO). ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function bool = issiso (sys) if (nargin != 1) print_usage (); endif bool = all (size (sys) == 1); endfunction control/inst/@lti/isstable.m0000644000076500000240000000331712273411257015401 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{bool} =} isstable (@var{sys}) ## @deftypefnx {Function File} {@var{bool} =} isstable (@var{sys}, @var{tol}) ## Determine whether @acronym{LTI} system is stable. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. ## @item tol ## Optional tolerance for stability. ## @var{tol} must be a real-valued, non-negative scalar. ## Default value is 0. ## @end table ## ## @strong{Outputs} ## @table @var ## @item bool ## True if the system is stable and false otherwise. ## @end table ## ## @example ## @group ## real (p) < -tol*(1 + abs (p)) continuous-time ## abs (p) < 1 - tol discrete-time ## @end group ## @end example ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.2 function bool = isstable (sys, tol = 0) if (nargin > 2) print_usage (); endif pol = pole (sys); ct = isct (sys); bool = __is_stable__ (pol, ct, tol); endfunction control/inst/@lti/lft.m0000644000076500000240000001131512273411257014355 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} lft (@var{sys1}, @var{sys2}) ## @deftypefnx {Function File} {@var{sys} =} lft (@var{sys1}, @var{sys2}, @var{nu}, @var{ny}) ## Linear fractional tranformation, also known as Redheffer star product. ## ## @strong{Inputs} ## @table @var ## @item sys1 ## Upper @acronym{LTI} model. ## @item sys2 ## Lower @acronym{LTI} model. ## @item nu ## The last nu inputs of @var{sys1} are connected with the first nu outputs of @var{sys2}. ## If not specified, @code{min (m1, p2)} is taken. ## @item ny ## The last ny outputs of @var{sys1} are connected with the first ny inputs of @var{sys2}. ## If not specified, @code{min (p1, m2)} is taken. ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## Resulting @acronym{LTI} model. ## @end table ## ## @strong{Block Diagram} ## @example ## @group ## .............sys.............. ## : +--------+ : ## w1 ------------>| |------------> z1 ## : | sys1 | : ## : u +---->| |-----+ y : ## : | +--------+ | : Lower LFT ## : | | : ## : | +--------+ | : lft (sys1, sys2) ## : +-----| sys2 |<----+ : ## : +--------+ : ## :............................: ## @end group ## @end example ## @example ## @group ## .............sys.............. ## : +--------+ : ## : u +---->| sys1 |-----+ y : ## : | +--------+ | : Upper LFT ## : | | : ## : | +--------+ | : lft (sys1, sys2) ## : +-----| |<----+ : ## : | sys2 | : ## z2 <------------| |<------------ w2 ## : +--------+ : ## :............................: ## @end group ## @end example ## @example ## @group ## .............sys.............. ## : +--------+ : ## w1 ------------>| |------------> z1 ## : | sys1 | : ## : u +---->| |-----+ y : ## : | +--------+ | : ## : | | : lft (sys1, sys2, nu, ny) ## : | +--------+ | : ## : +-----| |<----+ : ## : | sys2 | : ## z2 <------------| |<------------ w2 ## : +--------+ : ## :............................: ## @end group ## @end example ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.2 function sys = lft (sys1, sys2, nu, ny) if (nargin != 2 && nargin != 4) print_usage (); endif ## object conversion done by sys_group if necessary [p1, m1] = size (sys1); [p2, m2] = size (sys2); nu_max = min (m1, p2); ny_max = min (m2, p1); if (nargin == 2) # sys = lft (sys1, sys2) nu = nu_max; ny = ny_max; else # sys = lft (sys1, sys2, nu, ny) if (! is_real_scalar (nu) || nu < 0) error ("lft: argument 'nu' must be a positive integer"); endif if (! is_real_scalar (ny) || ny < 0) error ("lft: argument 'ny' must be a positive integer"); endif if (nu > nu_max) error ("lft: argument 'nu' (%d) must be at most %d", nu, nu_max); endif if (ny > ny_max) error ("lft: argument 'ny' (%d) must be at most %d", ny, ny_max); endif endif M11 = zeros (m1, p1); M12 = [zeros(m1-nu, p2); eye(nu), zeros(nu, p2-nu)]; M21 = [zeros(ny, p1-ny), eye(ny); zeros(m2-ny, p1)]; M22 = zeros (m2, p2); M = [M11, M12; M21, M22]; in_idx = [1 : (m1-nu), m1 + (ny+1 : m2)]; out_idx = [1 : (p1-ny), p1 + (nu+1 : p2)]; sys = __sys_group__ (sys1, sys2); sys = __sys_connect__ (sys, M); sys = __sys_prune__ (sys, out_idx, in_idx); [p, m] = size (sys); if (m == 0) warning ("lft: resulting system has no inputs"); endif if (p == 0) warning ("lft: resulting system has no outputs"); endif endfunction control/inst/@lti/lti.m0000644000076500000240000000252712273411257014365 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Constructor for LTI objects. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.2 function ltisys = lti (p = 0, m = 0, tsam = -2) inname = repmat ({""}, m, 1); outname = repmat ({""}, p, 1); ltisys = struct ("tsam", tsam, "inname", {inname}, "outname", {outname}, "ingroup", struct (), "outgroup", struct (), "name", "", "notes", {{}}, "userdata", []); ltisys = class (ltisys, "lti"); endfunction control/inst/@lti/mconnect.m0000644000076500000240000000503212273411257015375 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} mconnect (@var{sys}, @var{m}) ## @deftypefnx {Function File} {@var{sys} =} mconnect (@var{sys}, @var{m}, @var{inputs}, @var{outputs}) ## Arbitrary interconnections between the inputs and outputs of an @acronym{LTI} model. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. ## @item m ## Connection matrix. Each row belongs to an input and each column represents an output. ## @item inputs ## Vector of indices of those inputs which are retained. If not specified, all inputs are kept. ## @item outputs ## Vector of indices of those outputs which are retained. If not specified, all outputs are kept. ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## Interconnected system. ## @end table ## ## @strong{Example} ## @example ## @group ## Solve the system equations of ## y(t) = G e(t) ## e(t) = u(t) + M y(t) ## in order to build ## y(t) = H u(t) ## The matrix M for a (p-by-m) system G ## has m rows and p columns (m-by-p). ## ## Example for a 3x2 system: ## u1 = -1*y1 + 5*y2 + 0*y3 ## u2 = pi*y1 + 0*y2 - 7*y3 ## ## | -1 5 0 | ## M = | pi 0 7 | ## @end group ## @end example ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.2 function sys = mconnect (sys, M, in_idx, out_idx = ":") if (nargin < 2 || nargin > 4) print_usage (); endif [p, m] = size (sys); [mrows, mcols] = size (M); if (p != mcols || m != mrows) error ("mconnect: second argument must be a (%dx%d) matrix", m, p); endif if (! is_real_matrix (M)) error ("mconnect: second argument must be a matrix with real-valued coefficients"); endif sys = __sys_connect__ (sys, M); if (nargin > 2) sys = __sys_prune__ (sys, out_idx, in_idx); endif endfunction control/inst/@lti/minreal.m0000644000076500000240000001334312273411257015222 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} minreal (@var{sys}) ## @deftypefnx {Function File} {@var{sys} =} minreal (@var{sys}, @var{tol}) ## Minimal realization or zero-pole cancellation of @acronym{LTI} models. ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.3 function sys = minreal (sys, tol = "def") if (nargin > 2) # nargin == 0 not possible because minreal is inside @lti print_usage (); endif if (! is_real_scalar (tol) && tol != "def") error ("minreal: second argument must be a real scalar"); endif sys = __minreal__ (sys, tol); endfunction ## ss: minreal (SLICOT TB01PD) %!shared C, D %! %! A = ss (-2, 3, 4, 5); %! B = A / A; %! C = minreal (B, 1e-15); %! D = ss (1); %! %!assert (C.a, D.a); %!assert (C.b, D.b); %!assert (C.c, D.c); %!assert (C.d, D.d); %!shared M, Me %! A = [ 1.0 2.0 0.0 %! 4.0 -1.0 0.0 %! 0.0 0.0 1.0 ]; %! %! B = [ 1.0 %! 0.0 %! 1.0 ]; %! %! C = [ 0.0 1.0 -1.0 %! 0.0 0.0 1.0 ]; %! %! D = zeros (2, 1); %! %! sys = ss (A, B, C, D, "scaled", true); %! sysmin = minreal (sys, 0.0); %! [Ar, Br, Cr, Dr] = ssdata (sysmin); %! M = [Ar, Br; Cr, Dr]; %! %! Ae = [ 1.0000 -1.4142 1.4142 %! -2.8284 0.0000 1.0000 %! 2.8284 1.0000 0.0000 ]; %! %! Be = [-1.0000 %! 0.7071 %! 0.7071 ]; %! %! Ce = [ 0.0000 0.0000 -1.4142 %! 0.0000 0.7071 0.7071 ]; %! %! De = zeros (2, 1); %! %! Me = [Ae, Be; Ce, De]; %! %!assert (M, Me, 1e-4); ## dss: minreal (SLICOT TG01JD) ## FIXME: Test fails with larger ldwork in sltg01jd.cc %!shared Ar, Br, Cr, Dr, Er, Ae, Be, Ce, De, Ee %! A = [ -2 -3 0 0 0 0 0 0 0 %! 1 0 0 0 0 0 0 0 0 %! 0 0 -2 -3 0 0 0 0 0 %! 0 0 1 0 0 0 0 0 0 %! 0 0 0 0 1 0 0 0 0 %! 0 0 0 0 0 1 0 0 0 %! 0 0 0 0 0 0 1 0 0 %! 0 0 0 0 0 0 0 1 0 %! 0 0 0 0 0 0 0 0 1 ]; %! %! E = [ 1 0 0 0 0 0 0 0 0 %! 0 1 0 0 0 0 0 0 0 %! 0 0 1 0 0 0 0 0 0 %! 0 0 0 1 0 0 0 0 0 %! 0 0 0 0 0 0 0 0 0 %! 0 0 0 0 1 0 0 0 0 %! 0 0 0 0 0 0 0 0 0 %! 0 0 0 0 0 0 1 0 0 %! 0 0 0 0 0 0 0 1 0 ]; %! %! B = [ 1 0 %! 0 0 %! 0 1 %! 0 0 %! -1 0 %! 0 0 %! 0 -1 %! 0 0 %! 0 0 ]; %! %! C = [ 1 0 1 -3 0 1 0 2 0 %! 0 1 1 3 0 1 0 0 1 ]; %! %! D = zeros (2, 2); %! %! sys = dss (A, B, C, D, E, "scaled", true); %! sysmin = minreal (sys, 0.0); %! [Ar, Br, Cr, Dr, Er] = dssdata (sysmin); %! %! Ae = [ 1.0000 -0.0393 -0.0980 -0.1066 0.0781 -0.2330 0.0777 %! 0.0000 1.0312 0.2717 0.2609 -0.1533 0.6758 -0.3553 %! 0.0000 0.0000 1.3887 0.6699 -0.4281 1.6389 -0.7615 %! 0.0000 0.0000 0.0000 -1.2147 0.2423 -0.9792 0.4788 %! 0.0000 0.0000 0.0000 0.0000 -1.0545 0.5035 -0.2788 %! 0.0000 0.0000 0.0000 0.0000 0.0000 1.6355 -0.4323 %! 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 ]; %! %! Ee = [ 0.4100 0.2590 0.5080 -0.3109 0.0705 0.1429 -0.1477 %! -0.7629 -0.3464 0.0992 -0.3007 0.0619 0.2483 -0.0152 %! 0.1120 -0.2124 -0.4184 -0.1288 0.0569 -0.4213 -0.6182 %! 0.0000 0.1122 -0.0039 0.2771 -0.0758 0.0975 0.3923 %! 0.0000 0.0000 0.3708 -0.4290 0.1006 0.1402 -0.2699 %! 0.0000 0.0000 0.0000 0.0000 0.9458 -0.2211 0.2378 %! 0.0000 0.0000 0.0000 0.5711 0.2648 0.5948 -0.5000 ]; %! %! Be = [ -0.5597 0.2363 %! -0.4843 -0.0498 %! -0.4727 -0.1491 %! 0.1802 1.1574 %! 0.5995 0.1556 %! -0.1729 -0.3999 %! 0.0000 0.2500 ]; %! %! Ce = [ 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 4.0000 %! 0.0000 0.0000 0.0000 0.0000 0.0000 3.1524 -1.7500 ]; %! %! De = zeros (2, 2); %! %!assert (Ar, Ae, 1e-4); %!assert (Br, Be, 1e-4); %!assert (Cr, Ce, 1e-4); %!assert (Dr, De, 1e-4); %!assert (Er, Ee, 1e-4); ## tf: minreal %!shared a, b, c, d %! s = tf ("s"); %! G1 = (s+1)*s*5/(s+1)/(s^2+s+1); %! G2 = tf ([1, 1, 1], [2, 2, 2]); %! G1min = minreal (G1); %! G2min = minreal (G2); %! a = G1min.num{1, 1}; %! b = G1min.den{1, 1}; %! c = G2min.num{1, 1}; %! d = G2min.den{1, 1}; %!assert (a, [5, 0], 1e-4); %!assert (b, [1, 1, 1], 1e-4); %!assert (c, 0.5, 1e-4); %!assert (d, 1, 1e-4); control/inst/@lti/minus.m0000644000076500000240000000273112273411257014725 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Binary subtraction of @acronym{LTI} objects. If necessary, object conversion ## is done by sys_group. Used by Octave for "sys1 - sys2". ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function sys = minus (sys1, sys2) if (nargin != 2) # prevent sys = minus (sys1, sys2, sys3, ...) error ("lti: minus: this is a binary operator"); endif [p1, m1] = size (sys1); [p2, m2] = size (sys2); if (p1 != p2 || m1 != m2) error ("lti: minus: system dimensions incompatible: (%dx%d) - (%dx%d)", p1, m1, p2, m2); endif sys = __sys_group__ (sys1, sys2); in_scl = [eye(m1); eye(m2)]; out_scl = [eye(p1), -eye(p2)]; sys = out_scl * sys * in_scl; endfunction control/inst/@lti/mldivide.m0000644000076500000240000000266412273411257015374 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Matrix left division of @acronym{LTI} objects. If necessary, object conversion ## is done by sys_group in mtimes. Used by Octave for "sys1 \\ sys2". ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.1 function sys = mldivide (sys1, sys2) if (nargin != 2) # prevent sys = mldivide (sys1, sys2, sys3, ...) error ("lti: mldivide: this is a binary operator"); endif sys1 = inv (sys1); # let octave decide which inv() it uses [p1, m1] = size (sys1); [p2, m2] = size (sys2); if (m2 != p1) error ("lti: mldivide: system dimensions incompatible: (%dx%d) \ (%dx%d)", p1, m1, p2, m2); endif sys = sys1 * sys2; endfunction control/inst/@lti/mpower.m0000644000076500000240000000324212273411257015101 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Matrix power of @acronym{LTI} objects. The exponent must be an integer. ## Used by Octave for "sys^int". ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.1 function retsys = mpower (sys, e) if (nargin != 2) # prevent sys = mpower (a, b, c, ...) error ("lti: mpower: this is a binary operator"); endif if (! is_real_scalar (e) || e != round (e)) error ("lti: mpower: exponent must be an integer"); endif [p, m] = size (sys); if (p != m) error ("lti: mpower: system must be square"); endif ex = round (abs (e)); # make sure ex is a positive integer switch (sign (e)) case -1 # lti^-ex sys = inv (sys); retsys = sys; case 0 # lti^0 retsys = eye (p); return; case 1 # lti^ex retsys = sys; endswitch for k = 2 : ex retsys = retsys * sys; endfor endfunction control/inst/@lti/mrdivide.m0000644000076500000240000000266412273411257015402 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Matrix right division of @acronym{LTI} objects. If necessary, object conversion ## is done by sys_group in mtimes. Used by Octave for "sys1 / sys2". ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.1 function sys = mrdivide (sys1, sys2) if (nargin != 2) # prevent sys = mrdivide (sys1, sys2, sys3, ...) error ("lti: mrdivide: this is a binary operator"); endif sys2 = inv (sys2); # let octave decide which inv() it uses [p1, m1] = size (sys1); [p2, m2] = size (sys2); if (m2 != p1) error ("lti: mrdivide: system dimensions incompatible: (%dx%d) / (%dx%d)", p1, m1, p2, m2); endif sys = sys1 * sys2; endfunction control/inst/@lti/mtimes.m0000644000076500000240000001002212273411257015060 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Matrix multiplication of @acronym{LTI} objects. If necessary, object conversion ## is done by sys_group. Used by Octave for "sys1 * sys2". ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.2 function sys = mtimes (sys2, sys1) if (nargin != 2) # prevent sys = mtimes (sys1, sys2, sys3, ...) error ("lti: mtimes: this is a binary operator"); endif [p1, m1] = size (sys1); [p2, m2] = size (sys2); if (m2 != p1) error ("lti: mtimes: system dimensions incompatible: (%dx%d) * (%dx%d)", p2, m2, p1, m1); endif M22 = zeros (m2, p2); M21 = eye (m2, p1); M12 = zeros (m1, p2); M11 = zeros (m1, p1); M = [M22, M21; M12, M11]; out_idx = 1 : p2; in_idx = m2 + (1 : m1); sys = __sys_group__ (sys2, sys1); sys = __sys_connect__ (sys, M); sys = __sys_prune__ (sys, out_idx, in_idx); endfunction ## Alternative code: consistency vs. compatibility #{ M11 = zeros (m1, p1); M12 = zeros (m1, p2); M21 = eye (m2, p1); M22 = zeros (m2, p2); M = [M11, M12; M21, M22]; out_idx = p1 + (1 : p2); in_idx = 1 : m1; sys = __sys_group__ (sys1, sys2); #} ## Don't forget to adapt @tf/__sys_connect__.m draft code ## mtimes %!shared sysmat, sysmat_exp %! sys1 = ss ([0, 1; -3, -2], [0; 1], [-5, 1], [2]); %! sys2 = ss ([-10], [1], [-40], [5]); %! sys3 = sys2 * sys1; %! [A, B, C, D] = ssdata (sys3); %! sysmat = [A, B; C, D]; %! A_exp = [ -10 -5 1 %! 0 0 1 %! 0 -3 -2 ]; %! B_exp = [ 2 %! 0 %! 1 ]; %! C_exp = [ -40 -25 5 ]; %! D_exp = [ 10 ]; %! sysmat_exp = [A_exp, B_exp; C_exp, D_exp]; %!assert (sysmat, sysmat_exp) ## Cascade inter-connection of two systems in state-space form ## Test from SLICOT AB05MD ## TODO: order of united state vector: consistency vs. compatibility? #%!shared M, Me #%! A1 = [ 1.0 0.0 -1.0 #%! 0.0 -1.0 1.0 #%! 1.0 1.0 2.0 ]; #%! #%! B1 = [ 1.0 1.0 0.0 #%! 2.0 0.0 1.0 ].'; #%! #%! C1 = [ 3.0 -2.0 1.0 #%! 0.0 1.0 0.0 ]; #%! #%! D1 = [ 1.0 0.0 #%! 0.0 1.0 ]; #%! #%! A2 = [-3.0 0.0 0.0 #%! 1.0 0.0 1.0 #%! 0.0 -1.0 2.0 ]; #%! #%! B2 = [ 0.0 -1.0 0.0 #%! 1.0 0.0 2.0 ].'; #%! #%! C2 = [ 1.0 1.0 0.0 #%! 1.0 1.0 -1.0 ]; #%! #%! D2 = [ 1.0 1.0 #%! 0.0 1.0 ]; #%! #%! sys1 = ss (A1, B1, C1, D1); #%! sys2 = ss (A2, B2, C2, D2); #%! sys = sys2 * sys1; #%! [A, B, C, D] = ssdata (sys); #%! M = [A, B; C, D]; #%! #%! Ae = [ 1.0000 0.0000 -1.0000 0.0000 0.0000 0.0000 #%! 0.0000 -1.0000 1.0000 0.0000 0.0000 0.0000 #%! 1.0000 1.0000 2.0000 0.0000 0.0000 0.0000 #%! 0.0000 1.0000 0.0000 -3.0000 0.0000 0.0000 #%! -3.0000 2.0000 -1.0000 1.0000 0.0000 1.0000 #%! 0.0000 2.0000 0.0000 0.0000 -1.0000 2.0000 ]; #%! #%! Be = [ 1.0000 2.0000 #%! 1.0000 0.0000 #%! 0.0000 1.0000 #%! 0.0000 1.0000 #%! -1.0000 0.0000 #%! 0.0000 2.0000 ]; #%! #%! Ce = [ 3.0000 -1.0000 1.0000 1.0000 1.0000 0.0000 #%! 0.0000 1.0000 0.0000 1.0000 1.0000 -1.0000 ]; #%! #%! De = [ 1.0000 1.0000 #%! 0.0000 1.0000 ]; #%! #%! Me = [Ae, Be; Ce, De]; #%! #%!assert (M, Me, 1e-4); control/inst/@lti/norm.m0000644000076500000240000000701512273411257014545 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{gain} =} norm (@var{sys}, @var{2}) ## @deftypefnx {Function File} {[@var{gain}, @var{wpeak}] =} norm (@var{sys}, @var{inf}) ## @deftypefnx {Function File} {[@var{gain}, @var{wpeak}] =} norm (@var{sys}, @var{inf}, @var{tol}) ## Return H-2 or L-inf norm of @acronym{LTI} model. ## ## @strong{Algorithm}@* ## Uses SLICOT AB13BD and AB13DD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2009 ## Version: 0.5 function [gain, varargout] = norm (sys, ntype = "2", tol = 0.01) if (nargin > 3) # norm () is caught by built-in function print_usage (); endif if (is_real_scalar (ntype)) if (ntype == 2) ntype = "2"; elseif (isinf (ntype)) ntype = "inf"; else error ("lti: norm: invalid norm type"); endif elseif (ischar (ntype)) ntype = lower (ntype); else error ("lti: norm: invalid norm type"); endif switch (ntype) case "2" gain = h2norm (sys); case "inf" [gain, varargout{1}] = linfnorm (sys, tol); otherwise error ("lti: norm: invalid norm type"); endswitch endfunction function gain = h2norm (sys) if (isstable (sys)) [a, b, c, d] = ssdata (sys); discrete = ! isct (sys); if (! discrete && any (d(:))) # continuous and non-zero feedthrough gain = inf; else gain = __sl_ab13bd__ (a, b, c, d, discrete); endif else gain = inf; endif endfunction function [gain, wpeak] = linfnorm (sys, tol = 0.01) [a, b, c, d, e, tsam, scaled] = dssdata (sys, []); discrete = ! isct (sys); tol = max (tol, 100*eps); if (isempty (e)) [fpeak, gpeak] = __sl_ab13dd__ (a, a, b, c, d, discrete, false, tol, scaled); # TODO: avoid dummy argument else if (rcond (e) < eps) gain = inf; wpeak = inf; return; else [fpeak, gpeak] = __sl_ab13dd__ (a, e, b, c, d, discrete, true, tol, scaled); endif endif if (fpeak(2) > 0) if (discrete) wpeak = fpeak(1) / abs (tsam); # tsam could be -1 else wpeak = fpeak(1); endif else wpeak = inf; endif if (gpeak(2) > 0) gain = gpeak(1); else gain = inf; endif endfunction ## norm ct %!shared H2, Hinf %! sys = ss (-1, 1, 1, 0); %! H2 = norm (sys, 2); %! Hinf = norm (sys, inf); %!assert (H2, 0.7071, 1.5e-5); %!assert (Hinf, 1, 5e-4); ## norm dt %!shared H2, Hinf %! a = [ 2.417 -1.002 0.5488 %! 2 0 0 %! 0 0.5 0 ]; %! b = [ 1 %! 0 %! 0 ]; %! c = [-0.424 0.436 -0.4552 ]; %! d = [ 1 ]; %! sys = ss (a, b, c, d, 0.1); %! H2 = norm (sys, 2); %! Hinf = norm (sys, inf); %!assert (H2, 1.2527, 1.5e-5); %!assert (Hinf, 2.7, 0.1); control/inst/@lti/parallel.m0000644000076500000240000000321212273411257015361 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {@var{sys} =} parallel (@var{sys1}, @var{sys2}) ## Parallel connection of two @acronym{LTI} systems. ## ## @strong{Block Diagram} ## @example ## @group ## .......................... ## : +--------+ : ## : +-->| sys1 |---+ : ## u : | +--------+ | + : y ## -------+ O---------> ## : | +--------+ | + : ## : +-->| sys2 |---+ : ## : +--------+ : ## :.........sys............: ## ## sys = parallel (sys1, sys2) ## @end group ## @end example ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function sys = parallel (sys1, sys2) if (nargin == 2) sys = sys1 + sys2; ## elseif (nargin == 6) ## TODO: implement "complicated" case sys = parallel (sys1, sys2, in1, in2, out1, out2) else print_usage (); endif endfunction control/inst/@lti/plus.m0000644000076500000240000000577312273411257014566 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Binary addition of @acronym{LTI} objects. If necessary, object conversion ## is done by sys_group. Used by Octave for "sys1 + sys2". ## Operation is also known as "parallel connection". ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.2 function sys = plus (sys1, sys2) if (nargin != 2) # prevent sys = plus (sys1, sys2, sys3, ...) error ("lti: plus: this is a binary operator"); endif [p1, m1] = size (sys1); [p2, m2] = size (sys2); if (p1 != p2 || m1 != m2) error ("lti: plus: system dimensions incompatible: (%dx%d) + (%dx%d)", p1, m1, p2, m2); endif sys = __sys_group__ (sys1, sys2); in_scl = [eye(m1); eye(m2)]; out_scl = [eye(p1), eye(p2)]; sys = out_scl * sys * in_scl; endfunction ## Parallel inter-connection of two systems in state-space form ## Test from SLICOT AB05PD %!shared M, Me %! A1 = [ 1.0 0.0 -1.0 %! 0.0 -1.0 1.0 %! 1.0 1.0 2.0 ]; %! %! B1 = [ 1.0 1.0 0.0 %! 2.0 0.0 1.0 ].'; %! %! C1 = [ 3.0 -2.0 1.0 %! 0.0 1.0 0.0 ]; %! %! D1 = [ 1.0 0.0 %! 0.0 1.0 ]; %! %! A2 = [-3.0 0.0 0.0 %! 1.0 0.0 1.0 %! 0.0 -1.0 2.0 ]; %! %! B2 = [ 0.0 -1.0 0.0 %! 1.0 0.0 2.0 ].'; %! %! C2 = [ 1.0 1.0 0.0 %! 1.0 1.0 -1.0 ]; %! %! D2 = [ 1.0 1.0 %! 0.0 1.0 ]; %! %! sys1 = ss (A1, B1, C1, D1); %! sys2 = ss (A2, B2, C2, D2); %! sys = sys1 + sys2; %! [A, B, C, D] = ssdata (sys); %! M = [A, B; C, D]; %! %! Ae = [ 1.0000 0.0000 -1.0000 0.0000 0.0000 0.0000 %! 0.0000 -1.0000 1.0000 0.0000 0.0000 0.0000 %! 1.0000 1.0000 2.0000 0.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 -3.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 1.0000 0.0000 1.0000 %! 0.0000 0.0000 0.0000 0.0000 -1.0000 2.0000 ]; %! %! Be = [ 1.0000 2.0000 %! 1.0000 0.0000 %! 0.0000 1.0000 %! 0.0000 1.0000 %! -1.0000 0.0000 %! 0.0000 2.0000 ]; %! %! Ce = [ 3.0000 -2.0000 1.0000 1.0000 1.0000 0.0000 %! 0.0000 1.0000 0.0000 1.0000 1.0000 -1.0000 ]; %! %! De = [ 2.0000 1.0000 %! 0.0000 2.0000 ]; %! %! Me = [Ae, Be; Ce, De]; %! %!assert (M, Me, 1e-4); control/inst/@lti/pole.m0000644000076500000240000000310412273411257014524 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{p} =} pole (@var{sys}) ## Compute poles of @acronym{LTI} system. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. ## @end table ## ## @strong{Outputs} ## @table @var ## @item p ## Poles of @var{sys}. ## @end table ## ## @strong{Algorithm}@* ## For (descriptor) state-space models, @command{pole} ## relies on Octave's @command{eig}. ## For @acronym{SISO} transfer functions, @command{pole} ## uses Octave's @command{roots}. ## @acronym{MIMO} transfer functions are converted to ## a @emph{minimal} state-space representation for the ## computation of the poles. ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.1 function pol = pole (sys) if (nargin > 1) print_usage (); endif pol = __pole__ (sys); endfunction control/inst/@lti/prescale.m0000644000076500000240000002502212273411257015366 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{scaledsys}, @var{info}] =} prescale (@var{sys}) ## Scale state-space model. The scaled model @var{scaledsys} is equivalent to ## @var{sys}, but the state vector is scaled by diagonal transformation matrices ## in order to increase the accuracy of subsequent numerical computations. ## Frequency response commands perform automatic scaling unless model property ## @var{scaled} is set to @var{true}. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. ## @end table ## ## @strong{Outputs} ## @table @var ## @item scaledsys ## Scaled state-space model. ## @item info ## Structure containing additional information. ## @item info.SL ## Left scaling factors. @code{Tl = diag (info.SL)}. ## @item info.SR ## Right scaling factors. @code{Tr = diag (info.SR)}. ## @end table ## ## @strong{Equations} ## @example ## @group ## Es = Tl * E * Tr ## As = Tl * A * Tr ## Bs = Tl * B ## Cs = C * Tr ## Ds = D ## @end group ## @end example ## ## For proper state-space models, @var{Tl} and @var{Tr} are inverse of each other. ## ## @strong{Algorithm}@* ## Uses SLICOT TB01ID and TG01AD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.}. ## @end deftypefn ## Author: Lukas Reichlin ## Created: June 2011 ## Version: 0.2 function [retsys, varargout] = prescale (sys) if (nargin != 1) print_usage (); endif if (! isa (sys, "ss")) warning ("prescale: system not in state-space form"); sys = ss (sys); endif [retsys, lscale, rscale] = __prescale__ (sys); if (nargout > 1) varargout{1} = struct ("SL", lscale, "SR", rscale); endif endfunction ## Scaling of state-space models, direct access to TB01ID %!shared Ao, Bo, Co, SCALEo, MAXREDo, Ae, Be, Ce, SCALEe, MAXREDe %! A = [ 0.0 1.0000e+000 0.0 0.0 0.0 %! -1.5800e+006 -1.2570e+003 0.0 0.0 0.0 %! 3.5410e+014 0.0 -1.4340e+003 0.0 -5.3300e+011 %! 0.0 0.0 0.0 0.0 1.0000e+000 %! 0.0 0.0 0.0 -1.8630e+004 -1.4820e+000 ]; %! %! B = [ 0.0 0.0 %! 1.1030e+002 0.0 %! 0.0 0.0 %! 0.0 0.0 %! 0.0 8.3330e-003 ]; %! %! C = [ 1.0000e+000 0.0 0.0 0.0 0.0 %! 0.0 0.0 1.0000e+000 0.0 0.0 %! 0.0 0.0 0.0 1.0000e+000 0.0 %! 6.6640e-001 0.0 -6.2000e-013 0.0 0.0 %! 0.0 0.0 -1.0000e-003 1.8960e+006 1.5080e+002 ]; %! %! MAXRED = 0.0; %! %! [Ao, Bo, Co, MAXREDo, SCALEo] = __sl_tb01id__ (A, B, C, MAXRED); %! %! Ae = [ 0.0000000D+00 0.1000000D+05 0.0000000D+00 0.0000000D+00 0.0000000D+00 %! -0.1580000D+03 -0.1257000D+04 0.0000000D+00 0.0000000D+00 0.0000000D+00 %! 0.3541000D+05 0.0000000D+00 -0.1434000D+04 0.0000000D+00 -0.5330000D+03 %! 0.0000000D+00 0.0000000D+00 0.0000000D+00 0.0000000D+00 0.1000000D+03 %! 0.0000000D+00 0.0000000D+00 0.0000000D+00 -0.1863000D+03 -0.1482000D+01 ]; %! %! Be = [ 0.0000000D+00 0.0000000D+00 %! 0.1103000D+04 0.0000000D+00 %! 0.0000000D+00 0.0000000D+00 %! 0.0000000D+00 0.0000000D+00 %! 0.0000000D+00 0.8333000D+02 ]; %! %! Ce = [ 0.1000000D-04 0.0000000D+00 0.0000000D+00 0.0000000D+00 0.0000000D+00 %! 0.0000000D+00 0.0000000D+00 0.1000000D+06 0.0000000D+00 0.0000000D+00 %! 0.0000000D+00 0.0000000D+00 0.0000000D+00 0.1000000D-05 0.0000000D+00 %! 0.6664000D-05 0.0000000D+00 -0.6200000D-07 0.0000000D+00 0.0000000D+00 %! 0.0000000D+00 0.0000000D+00 -0.1000000D+03 0.1896000D+01 0.1508000D-01 ]; %! %! SCALEe = [0.1000000D-04 0.1000000D+00 0.1000000D+06 0.1000000D-05 0.1000000D-03 ]; %! %! MAXREDe = 0.3488E+10; %! %!assert (Ao, Ae, 1e-4); %!assert (Bo, Be, 1e-4); %!assert (Co, Ce, 1e-4); %!assert (MAXREDo, MAXREDe, 1e6); %!assert (SCALEo, SCALEe.', 1e-4); ## Scaling of descriptor state-space models, direct access to TG01AD %!shared Ao, Eo, Bo, Co, LSCALEo, RSCALEo, Ae, Ee, Be, Ce, LSCALEe, RSCALEe %! A = [ -1 0 0 0.003 %! 0 0 0.1000 0.02 %! 100 10 0 0.4 %! 0 0 0 0.0]; %! %! E = [ 1 0.2 0 0.0 %! 0 1 0 0.01 %! 300 90 6 0.3 %! 0 0 20 0.0]; %! %! B = [ 10 0 %! 0 0 %! 0 1000 %! 10000 10000]; %! %! C = [ -0.1 0.0 0.001 0.0 %! 0.0 0.01 -0.001 0.0001]; %! %! TRESH = 0.0; %! %! [Ao, Eo, Bo, Co, LSCALEo, RSCALEo] = __sl_tg01ad__ (A, E, B, C, TRESH); %! %! Ae = [ -1.0000 0.0000 0.0000 0.3000 %! 0.0000 0.0000 1.0000 2.0000 %! 1.0000 0.1000 0.0000 0.4000 %! 0.0000 0.0000 0.0000 0.0000]; %! %! Ee = [ 1.0000 0.2000 0.0000 0.0000 %! 0.0000 1.0000 0.0000 1.0000 %! 3.0000 0.9000 0.6000 0.3000 %! 0.0000 0.0000 0.2000 0.0000 ]; %! %! Be = [100.0000 0.0000 %! 0.0000 0.0000 %! 0.0000 100.0000 %! 100.0000 100.0000 ]; %! %! Ce = [ -0.0100 0.0000 0.0010 0.0000 %! 0.0000 0.0010 -0.0010 0.0010]; %! %! LSCALEe = [ 10.0000 10.0000 0.1000 0.0100 ]; %! %! RSCALEe = [ 0.1000 0.1000 1.0000 10.0000 ]; %! %!assert (Ao, Ae, 1e-4); %!assert (Eo, Ee, 1e-4); %!assert (Bo, Be, 1e-4); %!assert (Co, Ce, 1e-4); %!assert (LSCALEo, LSCALEe.', 1e-4); %!assert (RSCALEo, RSCALEe.', 1e-4); ## Scaling of state-space models, user function %!shared Ao, Bo, Co, INFOo, Ae, Be, Ce, SCALEe %! A = [ 0.0 1.0000e+000 0.0 0.0 0.0 %! -1.5800e+006 -1.2570e+003 0.0 0.0 0.0 %! 3.5410e+014 0.0 -1.4340e+003 0.0 -5.3300e+011 %! 0.0 0.0 0.0 0.0 1.0000e+000 %! 0.0 0.0 0.0 -1.8630e+004 -1.4820e+000 ]; %! %! B = [ 0.0 0.0 %! 1.1030e+002 0.0 %! 0.0 0.0 %! 0.0 0.0 %! 0.0 8.3330e-003 ]; %! %! C = [ 1.0000e+000 0.0 0.0 0.0 0.0 %! 0.0 0.0 1.0000e+000 0.0 0.0 %! 0.0 0.0 0.0 1.0000e+000 0.0 %! 6.6640e-001 0.0 -6.2000e-013 0.0 0.0 %! 0.0 0.0 -1.0000e-003 1.8960e+006 1.5080e+002 ]; %! %! SYS = ss (A, B, C); %! %! [SYSo, INFOo] = prescale (SYS); %! %! [Ao, Bo, Co] = ssdata (SYSo); %! %! Ae = [ 0.0000000D+00 0.1000000D+05 0.0000000D+00 0.0000000D+00 0.0000000D+00 %! -0.1580000D+03 -0.1257000D+04 0.0000000D+00 0.0000000D+00 0.0000000D+00 %! 0.3541000D+05 0.0000000D+00 -0.1434000D+04 0.0000000D+00 -0.5330000D+03 %! 0.0000000D+00 0.0000000D+00 0.0000000D+00 0.0000000D+00 0.1000000D+03 %! 0.0000000D+00 0.0000000D+00 0.0000000D+00 -0.1863000D+03 -0.1482000D+01 ]; %! %! Be = [ 0.0000000D+00 0.0000000D+00 %! 0.1103000D+04 0.0000000D+00 %! 0.0000000D+00 0.0000000D+00 %! 0.0000000D+00 0.0000000D+00 %! 0.0000000D+00 0.8333000D+02 ]; %! %! Ce = [ 0.1000000D-04 0.0000000D+00 0.0000000D+00 0.0000000D+00 0.0000000D+00 %! 0.0000000D+00 0.0000000D+00 0.1000000D+06 0.0000000D+00 0.0000000D+00 %! 0.0000000D+00 0.0000000D+00 0.0000000D+00 0.1000000D-05 0.0000000D+00 %! 0.6664000D-05 0.0000000D+00 -0.6200000D-07 0.0000000D+00 0.0000000D+00 %! 0.0000000D+00 0.0000000D+00 -0.1000000D+03 0.1896000D+01 0.1508000D-01 ]; %! %! SCALEe = [0.1000000D-04 0.1000000D+00 0.1000000D+06 0.1000000D-05 0.1000000D-03 ]; %! %!assert (Ao, Ae, 1e-4); %!assert (Bo, Be, 1e-4); %!assert (Co, Ce, 1e-4); %!assert (INFOo.SL.^-1, SCALEe.', 1e-4); %!assert (INFOo.SR, SCALEe.', 1e-4); ## Scaling of descriptor state-space models, user function %!shared Ao, Eo, Bo, Co, INFOo, Ae, Ee, Be, Ce, LSCALEe, RSCALEe %! A = [ -1 0 0 0.003 %! 0 0 0.1000 0.02 %! 100 10 0 0.4 %! 0 0 0 0.0]; %! %! E = [ 1 0.2 0 0.0 %! 0 1 0 0.01 %! 300 90 6 0.3 %! 0 0 20 0.0]; %! %! B = [ 10 0 %! 0 0 %! 0 1000 %! 10000 10000]; %! %! C = [ -0.1 0.0 0.001 0.0 %! 0.0 0.01 -0.001 0.0001]; %! %! SYS = dss (A, B, C, [], E); %! %! [SYSo, INFOo] = prescale (SYS); %! %! [Ao, Bo, Co, ~, Eo] = dssdata (SYSo); %! %! Ae = [ -1.0000 0.0000 0.0000 0.3000 %! 0.0000 0.0000 1.0000 2.0000 %! 1.0000 0.1000 0.0000 0.4000 %! 0.0000 0.0000 0.0000 0.0000]; %! %! Ee = [ 1.0000 0.2000 0.0000 0.0000 %! 0.0000 1.0000 0.0000 1.0000 %! 3.0000 0.9000 0.6000 0.3000 %! 0.0000 0.0000 0.2000 0.0000 ]; %! %! Be = [100.0000 0.0000 %! 0.0000 0.0000 %! 0.0000 100.0000 %! 100.0000 100.0000 ]; %! %! Ce = [ -0.0100 0.0000 0.0010 0.0000 %! 0.0000 0.0010 -0.0010 0.0010]; %! %! LSCALEe = [ 10.0000 10.0000 0.1000 0.0100 ]; %! %! RSCALEe = [ 0.1000 0.1000 1.0000 10.0000 ]; %! %!assert (Ao, Ae, 1e-4); %!assert (Eo, Ee, 1e-4); %!assert (Bo, Be, 1e-4); %!assert (Co, Ce, 1e-4); %!assert (INFOo.SL, LSCALEe.', 1e-4); %!assert (INFOo.SR, RSCALEe.', 1e-4); control/inst/@lti/series.m0000644000076500000240000000672212273411257015070 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} series (@var{sys1}, @var{sys2}) ## @deftypefnx {Function File} {@var{sys} =} series (@var{sys1}, @var{sys2}, @var{outputs1}, @var{inputs2}) ## Series connection of two @acronym{LTI} models. ## ## @strong{Block Diagram} ## @example ## @group ## ..................................... ## u : +--------+ y1 u2 +--------+ : y ## ------>| sys1 |---------->| sys2 |-------> ## : +--------+ +--------+ : ## :................sys................. ## ## sys = series (sys1, sys2) ## @end group ## @end example ## @example ## @group ## ..................................... ## : v2 +--------+ : ## : ---------->| | : y ## : +--------+ y1 u2 | sys2 |-------> ## u : | |---------->| | : ## ------>| sys1 | z1 +--------+ : ## : | |----------> : ## : +--------+ : ## :................sys................. ## ## outputs1 = [1] ## inputs2 = [2] ## sys = series (sys1, sys2, outputs1, inputs2) ## @end group ## @end example ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.2 function sys = series (sys1, sys2, out1, in2) if (nargin == 2) sys = sys2 * sys1; elseif (nargin == 4) [p1, m1] = size (sys1); [p2, m2] = size (sys2); if (! is_real_vector (out1)) error ("series: argument 3 (outputs1) invalid"); endif if (! is_real_vector (in2)) error ("series: argument 4 (inputs2) invalid"); endif l_out1 = length (out1); l_in2 = length (in2); if (l_out1 > p1) error ("series: 'outputs1' has too many indices for 'sys1'"); endif if (l_in2 > m2) error ("series: 'inputs2' has too many indices for 'sys2'"); endif if (l_out1 != l_in2) error ("series: number of 'outputs1' and 'inputs2' indices must be equal"); endif if (any (out1 > m1 | out1 < 1)) error ("series: range of 'outputs1' indices exceeds dimensions of 'sys1'"); endif if (any (in2 > p1 | in2 < 1)) error ("series: range of 'inputs2' indices exceeds dimensions of 'sys2'"); endif out_scl = full (sparse (1:l_out1, out1, 1, l_out1, p1)); in_scl = full (sparse (in2, 1:l_out1, 1, m2, l_in2)); ## NOTE: for-loop does NOT the same as ## out_scl(1:l_out1, out1) = 1; ## in_scl(in2, 1:l_out1) = 1; ## ## out_scl = zeros (l_out1, p1); ## in_scl = zeros (m2, l_in2); ## ## for k = 1 : l_out1 ## out_scl(k, out1(k)) = 1; ## in_scl(in2(k), k) = 1; ## endfor scl = in_scl * out_scl; sys = sys2 * scl * sys1; else print_usage (); endif endfunction control/inst/@lti/set.m0000644000076500000240000001101712273411257014362 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {} set (@var{sys}) ## @deftypefnx {Function File} {} set (@var{sys}, @var{"property"}, @var{value}, @dots{}) ## @deftypefnx {Function File} {@var{retsys} =} set (@var{sys}, @var{"property"}, @var{value}, @dots{}) ## Set or modify properties of @acronym{LTI} objects. ## If no return argument @var{retsys} is specified, the modified @acronym{LTI} object is stored ## in input argument @var{sys}. @command{set} can handle multiple properties in one call: ## @code{set (sys, 'prop1', val1, 'prop2', val2, 'prop3', val3)}. ## @code{set (sys)} prints a list of the object's property names. ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.5 function retsys = set (sys, varargin) if (nargin == 1) # set (sys), sys = set (sys) [props, vals] = __property_names__ (sys); nrows = numel (props); str = strjust (strvcat (props), "right"); str = horzcat (repmat (" ", nrows, 1), str, repmat (": ", nrows, 1), strvcat (vals)); disp (str); if (nargout != 0) # function sys = set (sys, varargin) retsys = sys; # would lead to unwanted output when using endif # set (sys) else # set (sys, "prop1", val1, ...), sys = set (sys, "prop1", val1, ...) if (rem (nargin-1, 2)) error ("lti: set: properties and values must come in pairs"); endif [p, m] = size (sys); for k = 1 : 2 : (nargin-1) prop = lower (varargin{k}); val = varargin{k+1}; switch (prop) case {"inname", "inputname", "inn", "inputn"} sys.inname = __adjust_labels__ (val, m); case {"outname", "outputname", "outn", "outputn"} sys.outname = __adjust_labels__ (val, p); case {"tsam", "ts"} if (issample (val, -1)) sys.tsam = val; ## TODO: display hint for 'd2d' to resample model? else error ("lti: set: invalid sampling time"); endif case {"ingroup", "inputgroup", "ing", "inputg"} if (isstruct (val) && all (structfun (@(x) is_group_idx (x, m), val))) empty = structfun (@isempty, val); fields = fieldnames (val); sys.ingroup = rmfield (val, fields(empty)); else error ("lti: set: property 'ingroup' requires a struct containing valid input indices in the range [1, %d]", m); endif case {"outgroup", "outputgroup", "outg", "outputg"} if (isstruct (val) && all (structfun (@(x) is_group_idx (x, p), val))) empty = structfun (@isempty, val); fields = fieldnames (val); sys.outgroup = rmfield (val, fields(empty)); else error ("lti: set: property 'outgroup' requires a struct containing valid output indices in the range [1, %d]", p); endif case "name" if (ischar (val)) sys.name = val; else error ("lti: set: property 'name' requires a string"); endif case "notes" if (iscellstr (val)) sys.notes = val; elseif (ischar (val)) sys.notes = {val}; else error ("lti: set: property 'notes' requires string or cell of strings"); endif case "userdata" sys.userdata = val; otherwise sys = __set__ (sys, prop, val); endswitch endfor if (nargout == 0) # set (sys, "prop1", val1, ...) assignin ("caller", inputname (1), sys); else # sys = set (sys, "prop1", val1, ...) retsys = sys; endif endif endfunction function bool = is_group_idx (idx, n) bool = (isempty (idx) || (is_real_vector (idx) && all (idx > 0) && all (idx <= n) && all (abs (fix (idx)) == idx))); endfunction control/inst/@lti/size.m0000644000076500000240000000474512273411257014553 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{nvec} =} size (@var{sys}) ## @deftypefnx {Function File} {@var{n} =} size (@var{sys}, @var{dim}) ## @deftypefnx {Function File} {[@var{p}, @var{m}] =} size (@var{sys}) ## @acronym{LTI} model size, i.e. number of outputs and inputs. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. ## @item dim ## If given a second argument, @command{size} will return the size of the ## corresponding dimension. ## @end table ## ## @strong{Outputs} ## @table @var ## @item nvec ## Row vector. The first element is the number of outputs (rows) and the second ## element the number of inputs (columns). ## @item n ## Scalar value. The size of the dimension @var{dim}. ## @item p ## Number of outputs. ## @item m ## Number of inputs. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.2 function [n, varargout] = size (sys, dim = 0) if (nargin > 2) print_usage (); endif p = numel (sys.outname); # WARNING: system matrices may change without m = numel (sys.inname); # being noticed by the i/o names! switch (dim) case 0 switch (nargout) case 0 if (p == 1) stry = ""; else stry = "s"; endif if (m == 1) stru = ""; else stru = "s"; endif disp (sprintf ("LTI model with %d output%s and %d input%s.", p, stry, m, stru)); case 1 n = [p, m]; case 2 n = p; varargout{1} = m; otherwise print_usage (); endswitch case 1 n = p; case 2 n = m; otherwise print_usage (); endswitch endfunction control/inst/@lti/size_equal.m0000644000076500000240000000244012273411257015730 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{bool} =} size_equal (@var{a}, @var{b}, @dots{}) ## Return true if @acronym{LTI} models (and matrices) @var{a}, @var{b}, @dots{} ## are of equal size and false otherwise. ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2012 ## Version: 0.1 function bool = size_equal (varargin) s = cellfun (@size, varargin, "uniformoutput", false); bool = (nargin == 1 || isequal (s{:})); # isequal errors out with only 1 argument, nargin==0 handled by built-in size_equal endfunction control/inst/@lti/sminreal.m0000644000076500000240000000740312273411257015405 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} sminreal (@var{sys}) ## @deftypefnx {Function File} {@var{sys} =} sminreal (@var{sys}, @var{tol}) ## Perform state-space model reduction based on structure. ## Remove states which have no influence on the input-output behaviour. ## The physical meaning of the states is retained. ## ## @strong{Inputs} ## @table @var ## @item sys ## State-space model. ## @item tol ## Optional tolerance for controllability and observability. ## Entries of the state-space matrices whose moduli are less or equal to @var{tol} ## are assumed to be zero. Default value is 0. ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## Reduced state-space model. ## @end table ## ## @seealso{minreal} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.4 function sys = sminreal (sys, tol = 0) if (nargin > 2) # sminreal () not possible (inside @lti) print_usage (); endif if (! isa (sys, "ss")) warning ("sminreal: system not in state-space form"); sys = ss (sys); # needed by __sys_prune__ endif if (! (is_real_scalar (tol) && tol >= 0)) error ("sminreal: second argument is not a valid tolerance"); endif [a, b, c, d, e] = dssdata (sys, []); a = abs (a) > tol; b = abs (b) > tol; c = abs (c) > tol; if (! isempty (e)) e = abs (e) > tol; a = a | e; endif co_idx = __controllable_states__ (a, b); ob_idx = __controllable_states__ (a.', c.'); st_idx = intersect (co_idx, ob_idx); sys = __sys_prune__ (sys, ":", ":", st_idx); endfunction function c_idx = __controllable_states__ (a, b) n = rows (a); # number of states a = a & ! eye (n); # set diagonal entries to zero c_vec = any (b, 2); # states directly controllable c_idx = find (c_vec); # indices of directly controllable states c_idx_new = 0; # any vector of length > 0 possible while (all (length (c_idx) != [0, n]) && length(c_idx_new) != 0) u_idx = find (! c_vec); # indices of uncontrollable states #{ ## debug code a(u_idx, :) repmat (c_vec.', length (u_idx), 1) a(u_idx, :) & repmat (c_vec.', length (u_idx), 1) any (a(u_idx, :) & repmat (c_vec.', length (u_idx), 1), 2) find (any (a(u_idx, :) & repmat (c_vec.', length (u_idx), 1), 2)) #} c_idx_new = u_idx (find (any (a(u_idx, :) & repmat (c_vec.', length (u_idx), 1), 2))); c_idx = union (c_idx, c_idx_new); c_vec(c_idx_new) = 1; endwhile endfunction ## ss: sminreal %!shared B, C %! %! A = ss (-2, 3, 4, 5); %! B = A / A; %! C = sminreal (B); # no states should be removed %! %!assert (C.a, B.a); %!assert (C.b, B.b); %!assert (C.c, B.c); %!assert (C.d, B.d); %!shared A, B, D, E %! %! A = ss (-1, 1, 1, 0); %! B = ss (-2, 3, 4, 5); %! C = [A, B]; %! D = sminreal (C(:, 1)); %! E = sminreal (C(:, 2)); %! %!assert (D.a, A.a); %!assert (D.b, A.b); %!assert (D.c, A.c); %!assert (D.d, A.d); %!assert (E.a, B.a); %!assert (E.b, B.b); %!assert (E.c, B.c); %!assert (E.d, B.d); control/inst/@lti/ssdata.m0000644000076500000240000000340712273411257015052 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{a}, @var{b}, @var{c}, @var{d}, @var{tsam}] =} ssdata (@var{sys}) ## Access state-space model data. ## Argument @var{sys} is not limited to state-space models. ## If @var{sys} is not a state-space model, it is converted automatically. ## ## @strong{Inputs} ## @table @var ## @item sys ## Any type of @acronym{LTI} model. ## @end table ## ## @strong{Outputs} ## @table @var ## @item a ## State matrix (n-by-n). ## @item b ## Input matrix (n-by-m). ## @item c ## Measurement matrix (p-by-n). ## @item d ## Feedthrough matrix (p-by-m). ## @item tsam ## Sampling time in seconds. If @var{sys} is a continuous-time model, ## a zero is returned. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.4 function [a, b, c, d, tsam, scaled] = ssdata (sys) if (! isa (sys, "ss")) sys = ss (sys); endif [a, b, c, d, e, ~, scaled] = __sys_data__ (sys); [a, b, c, d, e] = __dss2ss__ (a, b, c, d, e); tsam = sys.tsam; endfunction control/inst/@lti/subsasgn.m0000644000076500000240000000266612273411257015426 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Subscripted assignment for @acronym{LTI} objects. ## Used by Octave for "sys.property = value". ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.2 function sys = subsasgn (sys, idx, val) ## TODO: enable *more* stuff like sys.a(2, 1:3) = [4, 5, 6] ## warning ("lti: subsasgn: do not use subsasgn for development"); switch (idx(1).type) case "." if (length (idx) == 1) sys = set (sys, idx.subs, val); else prop = idx(1).subs; sys = set (sys, prop, subsasgn (get (sys, prop), idx(2:end), val)); endif otherwise error ("lti: subsasgn: invalid subscripted assignment type"); endswitch endfunction control/inst/@lti/subsref.m0000644000076500000240000000325512273411257015245 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Subscripted reference for @acronym{LTI} objects. ## Used by Octave for "sys = sys(2:4, :)" or "val = sys.prop". ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.4 function a = subsref (a, s) if (numel (s) == 0) return; endif switch (s(1).type) case "()" idx = s(1).subs; if (numel (idx) == 2) a = __sys_prune__ (a, idx{1}, idx{2}); elseif (numel (idx) == 1) a = __freqresp__ (a, idx{1}); else error ("lti: subsref: need one or two indices"); endif case "." fld = s(1).subs; a = get (a, fld); ## warning ("lti: subsref: do not use subsref for development"); otherwise error ("lti: subsref: invalid subscript type"); endswitch a = subsref (a, s(2:end)); endfunction ## lti: subsref %!shared a %! s = tf ("s"); %! G = (s+1)*s*5/(s+1)/(s^2+s+1); %! a = G(1,1).num{1,1}(1); %!assert (a, 5, 1e-4); control/inst/@lti/tfdata.m0000644000076500000240000000544312273411257015040 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{num}, @var{den}, @var{tsam}] =} tfdata (@var{sys}) ## @deftypefnx {Function File} {[@var{num}, @var{den}, @var{tsam}] =} tfdata (@var{sys}, @var{"vector"}) ## @deftypefnx {Function File} {[@var{num}, @var{den}, @var{tsam}] =} tfdata (@var{sys}, @var{"tfpoly"}) ## Access transfer function data. ## Argument @var{sys} is not limited to transfer function models. ## If @var{sys} is not a transfer function, it is converted automatically. ## ## @strong{Inputs} ## @table @var ## @item sys ## Any type of @acronym{LTI} model. ## @item "v", "vector" ## For SISO models, return @var{num} and @var{den} directly as column vectors ## instead of cells containing a single column vector. ## @end table ## ## @strong{Outputs} ## @table @var ## @item num ## Cell of numerator(s). Each numerator is a row vector ## containing the coefficients of the polynomial in descending powers of ## the transfer function variable. ## num@{i,j@} contains the numerator polynomial from input j to output i. ## In the SISO case, a single vector is possible as well. ## @item den ## Cell of denominator(s). Each denominator is a row vector ## containing the coefficients of the polynomial in descending powers of ## the transfer function variable. ## den@{i,j@} contains the denominator polynomial from input j to output i. ## In the SISO case, a single vector is possible as well. ## @item tsam ## Sampling time in seconds. If @var{sys} is a continuous-time model, ## a zero is returned. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.5 function [num, den, tsam] = tfdata (sys, rtype = "cell") if (! isa (sys, "tf")) sys = tf (sys); endif [num, den] = __sys_data__ (sys); tsam = sys.tsam; if (! strncmpi (rtype, "t", 1)) # != tfpoly num = cellfun (@get, num, "uniformoutput", false); den = cellfun (@get, den, "uniformoutput", false); endif if (strncmpi (rtype, "v", 1) && issiso (sys)) # == vector num = num{1}; den = den{1}; endif endfunction control/inst/@lti/transpose.m0000644000076500000240000000252612273411257015612 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Transpose of @acronym{LTI} objects. Used by Octave for "sys.'". ## Useful for dual problems, i.e. controllability and observability ## or designing estimator gains with @command{lqr} and @command{place}. ## Author: Lukas Reichlin ## Created: February 2010 ## Version: 0.1 function sys = transpose (sys) if (nargin != 1) # prevent sys = transpose (sys1, sys2, sys3, ...) error ("lti: transpose: this is an unary operator"); endif [p, m] = size (sys); sys = __transpose__ (sys); sys.inname = repmat ({""}, p, 1); sys.outname = repmat ({""}, m, 1); endfunction control/inst/@lti/uminus.m0000644000076500000240000000221212273411257015104 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Unary minus of @acronym{LTI} object. Used by Octave for "-sys". ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function sys = uminus (sys) if (nargin != 1) # prevent sys = uminus (sys1, sys2, sys3, ...) error ("lti: uminus: this is an unary operator"); endif [p, m] = size (sys); out_scl = - eye (p); sys = out_scl * sys; endfunction control/inst/@lti/uplus.m0000644000076500000240000000207112273411257014737 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Unary plus of @acronym{LTI} object. Used by Octave for "+sys". ## Author: Lukas Reichlin ## Created: June 2012 ## Version: 0.1 function sys = uplus (sys) if (nargin != 1) # prevent sys = uplus (sys1, sys2, sys3, ...) error ("lti: uplus: this is an unary operator"); endif endfunction control/inst/@lti/vertcat.m0000644000076500000240000000262412273411257015243 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Vertical concatenation of @acronym{LTI} objects. If necessary, object conversion ## is done by sys_group. Used by Octave for "[sys1; sys2]". ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function sys = vertcat (sys, varargin) for k = 1 : (nargin-1) sys1 = sys; sys2 = varargin{k}; [p1, m1] = size (sys1); [p2, m2] = size (sys2); if (m1 != m2) error ("lti: vertcat: number of system inputs incompatible: [(%dx%d); (%dx%d)]", p1, m1, p2, m2); endif sys = __sys_group__ (sys1, sys2); in_scl = [eye(m1); eye(m2)]; sys = sys * in_scl; endfor endfunction control/inst/@lti/xperm.m0000644000076500000240000000370312273411257014725 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{retsys} =} xperm (@var{sys}, @var{idx}) ## Reorder states in state-space models. ## ## @strong{Inputs} ## @table @var ## @item sys ## State-space model. ## @item idx ## Vector containing the state indices in the desired order. ## Alternatively, a cell vector containing the state names ## is possible as well. See @code{sys.stname}. State names ## only work if they were assigned explicitly before, i.e. ## @code{sys.stname} contains no empty strings. ## Note that if certain state indices of @var{sys} are ## missing or appear multiple times in @var{idx}, these ## states will be pruned or duplicated accordingly in the ## resulting state-space model @var{retsys}. ## @end table ## ## @strong{Outputs} ## @table @var ## @item retsys ## Resulting state-space model with states reordered according to @var{idx}. ## @end table ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2009 ## Version: 0.2 function sys = xperm (sys, st_idx) if (nargin != 2) print_usage (); endif if (! isa (sys, "ss")) warning ("xperm: system not in state-space form"); sys = ss (sys); endif sys = __sys_prune__ (sys, ":", ":", st_idx); endfunction control/inst/@lti/zero.m0000644000076500000240000003562212273411257014556 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## Copyright (C) 2011 Ferdinand Svaricek, UniBw Munich. ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{z} =} zero (@var{sys}) ## @deftypefnx {Function File} {@var{z} =} zero (@var{sys}, @var{type}) ## @deftypefnx {Function File} {[@var{z}, @var{k}, @var{info}] =} zero (@var{sys}) ## Compute zeros and gain of @acronym{LTI} model. ## By default, @command{zero} computes the invariant zeros, ## also known as Smith zeros. Alternatively, when called with ## a second input argument, @command{zero} can also compute ## the system zeros, transmission zeros, input decoupling zeros ## and output decoupling zeros. See paper [1] for an explanation ## of the various zero flavors as well as for further details. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. ## @item type ## String specifying the type of zeros: ## @table @var ## @item 'system', 's' ## Compute the system zeros. ## The system zeros include in all cases ## (square, non-square, degenerate or non-degenerate system) ## all transmission and decoupling zeros. ## @item 'invariant', 'inv' ## Compute invariant zeros. Default selection. ## @item 'transmission', 't' ## Compute transmission zeros. Transmission zeros ## are a subset of the invariant zeros. ## The transmission zeros are the zeros of the ## Smith-McMillan form of the transfer function matrix. ## @item 'input', 'inp', 'id' ## Compute input decoupling zeros. The input decoupling zeros are ## also known as the uncontrollable eigenvalues of the pair (A,B). ## @item 'output', 'o', 'od' ## Compute output decoupling zeros. The output decoupling zeros are ## also known as the unobservable eigenvalues of the pair (A,C). ## @end table ## @end table ## ## @strong{Outputs} ## @table @var ## @item z ## Depending on argument @var{type}, @var{z} contains the ## invariant (default), system, transmission, input decoupling ## or output decoupling zeros of @var{sys} as defined in [1]. ## @item k ## Gain of @acronym{SISO} system @var{sys}. For @acronym{MIMO} ## systems, an empty matrix @code{[]} is returned. ## @item info ## Struct containing additional information. For details, ## see the documentation of @acronym{SLICOT} routines ## @acronym{AB08ND} and @acronym{AG08BD}. ## @item info.rank ## The normal rank of the transfer function matrix (regular state-space models) ## or of the system pencil (descriptor state-space models). ## @item info.infz ## Contains information on the infinite elementary divisors as follows: ## the system has info.infz(i) infinite elementary divisors of degree i, ## where i=1,2,...,length(info.infz). ## @item info.kronr ## Right Kronecker (column) indices. ## @item info.kronl ## Left Kronecker (row) indices. ## @end table ## ## @strong{Examples} ## @example ## @group ## [z, k, info] = zero (sys) # invariant zeros ## z = zero (sys, 'system') # system zeros ## z = zero (sys, 'invariant') # invariant zeros ## z = zero (sys, 'transmission') # transmission zeros ## z = zero (sys, 'output') # output decoupling zeros ## z = zero (sys, 'input') # input decoupling zeros ## @end group ## @end example ## ## @strong{Algorithm}@* ## For (descriptor) state-space models, @command{zero} ## relies on SLICOT AB08ND and AG08BD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## For @acronym{SISO} transfer functions, @command{zero} ## uses Octave's @command{roots}. ## @acronym{MIMO} transfer functions are converted to ## a @emph{minimal} state-space representation for the ## computation of the zeros. ## ## @strong{References}@* ## [1] MacFarlane, A. and Karcanias, N. ## @cite{Poles and zeros of linear multivariable systems: ## a survey of the algebraic, geometric and complex-variable ## theory}. Int. J. Control, vol. 24, pp. 33-74, 1976.@* ## [2] Rosenbrock, H.H. ## @cite{Correction to 'The zeros of a system'}. ## Int. J. Control, vol. 20, no. 3, pp. 525-527, 1974.@* ## [3] Svaricek, F. ## @cite{Computation of the structural invariants of linear ## multivariable systems with an extended version of the ## program ZEROS}. ## Systems & Control Letters, vol. 6, pp. 261-266, 1985.@* ## [4] Emami-Naeini, A. and Van Dooren, P. ## @cite{Computation of zeros of linear multivariable systems}. ## Automatica, vol. 26, pp. 415-430, 1982.@* ## ## @end deftypefn ## TODO: write a short summary about the characteristics of the ## various zero flavors and add it to the docstring. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.3 function [zer, gain, info] = zero (sys, type = "invariant") if (nargin > 2) print_usage (); endif if (strncmpi (type, "invariant", 3)) # invariant zeros, default [zer, gain, info] = __zero__ (sys, nargout); elseif (strncmpi (type, "transmission", 1)) # transmission zeros [zer, gain, info] = zero (minreal (sys)); elseif (strncmpi (type, "input", 3) || strncmpi (type, "id", 2)) # input decoupling zeros [a, b, c, d, e, tsam] = dssdata (sys, []); tmp = dss (a, b, zeros (0, columns (a)), zeros (0, columns (b)), e, tsam); [zer, gain, info] = zero (tmp); elseif (strncmpi (type, "output", 1)) # output decoupling zeros [a, b, c, d, e, tsam] = dssdata (sys, []); tmp = dss (a, zeros (rows (a), 0), c, zeros (rows (c), 0), e, tsam); [zer, gain, info] = zero (tmp); elseif (strncmpi (type, "system", 1)) # system zeros [zer, gain, info] = __szero__ (sys); else error ("zero: type '%s' invalid", type); endif endfunction ## Function for computing the system zeros. ## Adapted from Ferdinand Svaricek's szero.m function [z, gain, info] = __szero__ (sys) ## TODO: support descriptor state-space models ## with singular 'E' matrices [a, b, c, d] = ssdata (sys); [pp, mm] = size (sys); nn = rows (a); ## Tolerance for intersection of zeros Zeps = 10 * sqrt ((nn+pp)*(nn+mm)) * eps * norm (a,'fro'); [z, gain, info] = zero (ss (a, b, c, d)); # zero (sys) lets descriptor test fail Rank = info.rank; ## System is not degenerated and square if (Rank == 0 || (Rank == min(pp,mm) && mm == pp)) return; endif ## System (A,B,C,D) is degenerated and/or non-square z = []; ## Computation of the greatest common divisor of all minors of the ## Rosenbrock system matrix that have the following form ## ## 1, 2, ..., n, n+i_1, n+i_2, ..., n+i_k ## P ## 1, 2, ..., n, n+j_1, n+j_2, ..., n+j_k ## ## with k = Rank. NKP = nchoosek (1:pp, Rank); [IP, JP] = size (NKP); NKM = nchoosek (1:mm, Rank); [IM, JM] = size (NKM); for i = 1:IP for j = 1:JP k = NKP(i,j); C1(j,:) = c(k,:); # Build C of dimension (Rank x n) endfor for ii = 1:IM for jj = 1:JM k = NKM(ii,jj); B1(:,jj) = b(:,k); # Build B of dimension (n x Rank) endfor [z1, ~, info1] = zero (ss (a, B1, C1, zeros (Rank, Rank))); rank1 = info1.rank; if (rank1 == Rank) if (isempty (z1)) z = z1; # Subsystem has no zeros -> system has no system zeros return; else if (isempty (z)) z = z1; # Zeros of the first subsystem else # Compute intersection of z and z1 with tolerance Zeps z2 = []; for ii=1:length(z) for jj=1:length(z1) if (abs (z(ii)-z1(jj)) < Zeps) z2(end+1) = z(ii); z1(jj) = []; break; endif endfor endfor z = z2; # System zeros are the common zeros of all subsystems endif endif endif endfor endfor endfunction ## Invariant zeros of state-space models ## ## Results from the "Dark Side" 7.5 and 7.8 ## ## -13.2759 ## 12.5774 ## -0.0155 ## ## Results from Scilab 5.2.0b1 (trzeros) ## ## - 13.275931 ## 12.577369 ## - 0.0155265 ## %!shared z, z_exp %! A = [ -0.7 -0.0458 -12.2 0 %! 0 -0.014 -0.2904 -0.562 %! 1 -0.0057 -1.4 0 %! 1 0 0 0 ]; %! %! B = [ -19.1 -3.1 %! -0.0119 -0.0096 %! -0.14 -0.72 %! 0 0 ]; %! %! C = [ 0 0 -1 1 %! 0 0 0.733 0 ]; %! %! D = [ 0 0 %! 0.0768 0.1134 ]; %! %! sys = ss (A, B, C, D, "scaled", true); %! z = sort (zero (sys)); %! %! z_exp = sort ([-13.2759; 12.5774; -0.0155]); %! %!assert (z, z_exp, 1e-4); ## Invariant zeros of regular state-space models %!shared z, z_exp, info, rank_exp, infz_exp, kronr_exp, kronl_exp %! A = [ 1.0 0.0 0.0 0.0 0.0 0.0 %! 0.0 1.0 0.0 0.0 0.0 0.0 %! 0.0 0.0 3.0 0.0 0.0 0.0 %! 0.0 0.0 0.0 -4.0 0.0 0.0 %! 0.0 0.0 0.0 0.0 -1.0 0.0 %! 0.0 0.0 0.0 0.0 0.0 3.0 ]; %! %! B = [ 0.0 -1.0 %! -1.0 0.0 %! 1.0 -1.0 %! 0.0 0.0 %! 0.0 1.0 %! -1.0 -1.0 ]; %! %! C = [ 1.0 0.0 0.0 1.0 0.0 0.0 %! 0.0 1.0 0.0 1.0 0.0 1.0 %! 0.0 0.0 1.0 0.0 0.0 1.0 ]; %! %! D = [ 0.0 0.0 %! 0.0 0.0 %! 0.0 0.0 ]; %! %! sys = ss (A, B, C, D, "scaled", true); %! [z, ~, info] = zero (sys); %! %! z_exp = [ 2.0000 %! -1.0000 ]; %! %! rank_exp = 2; %! infz_exp = 2; %! kronr_exp = zeros (1, 0); %! kronl_exp = 2; %! %!assert (z, z_exp, 1e-4); %!assert (info.rank, rank_exp); %!assert (info.infz, infz_exp); %!assert (info.kronr, kronr_exp); %!assert (info.kronl, kronl_exp); ## Invariant zeros of descriptor state-space models %!shared z, z_exp, info, rank_exp, infz_exp, kronr_exp, kronl_exp %! A = [ 1 0 0 0 0 0 0 0 0 %! 0 1 0 0 0 0 0 0 0 %! 0 0 1 0 0 0 0 0 0 %! 0 0 0 1 0 0 0 0 0 %! 0 0 0 0 1 0 0 0 0 %! 0 0 0 0 0 1 0 0 0 %! 0 0 0 0 0 0 1 0 0 %! 0 0 0 0 0 0 0 1 0 %! 0 0 0 0 0 0 0 0 1 ]; %! %! E = [ 0 0 0 0 0 0 0 0 0 %! 1 0 0 0 0 0 0 0 0 %! 0 1 0 0 0 0 0 0 0 %! 0 0 0 0 0 0 0 0 0 %! 0 0 0 1 0 0 0 0 0 %! 0 0 0 0 1 0 0 0 0 %! 0 0 0 0 0 0 0 0 0 %! 0 0 0 0 0 0 1 0 0 %! 0 0 0 0 0 0 0 1 0 ]; %! %! B = [ -1 0 0 %! 0 0 0 %! 0 0 0 %! 0 -1 0 %! 0 0 0 %! 0 0 0 %! 0 0 -1 %! 0 0 0 %! 0 0 0 ]; %! %! C = [ 0 1 1 0 3 4 0 0 2 %! 0 1 0 0 4 0 0 2 0 %! 0 0 1 0 -1 4 0 -2 2 ]; %! %! D = [ 1 2 -2 %! 0 -1 -2 %! 0 0 0 ]; %! %! sys = dss (A, B, C, D, E, "scaled", true); %! [z, ~, info] = zero (sys); %! %! z_exp = 1; %! %! rank_exp = 11; %! infz_exp = [0, 1]; %! kronr_exp = 2; %! kronl_exp = 1; %! %!assert (z, z_exp, 1e-4); %!assert (info.rank, rank_exp); %!assert (info.infz, infz_exp); %!assert (info.kronr, kronr_exp); %!assert (info.kronl, kronl_exp); ## Gain of descriptor state-space models %!shared p, pi, z, zi, k, ki, p_tf, pi_tf, z_tf, zi_tf, k_tf, ki_tf %! P = ss (-2, 3, 4, 5); %! Pi = inv (P); %! %! p = pole (P); %! [z, k] = zero (P); %! %! pi = pole (Pi); %! [zi, ki] = zero (Pi); %! %! P_tf = tf (P); %! Pi_tf = tf (Pi); %! %! p_tf = pole (P_tf); %! [z_tf, k_tf] = zero (P_tf); %! %! pi_tf = pole (Pi_tf); %! [zi_tf, ki_tf] = zero (Pi_tf); %! %!assert (p, zi, 1e-4); %!assert (z, pi, 1e-4); %!assert (k, inv (ki), 1e-4); %!assert (p_tf, zi_tf, 1e-4); %!assert (z_tf, pi_tf, 1e-4); %!assert (k_tf, inv (ki_tf), 1e-4); ## Example taken from Paper [1] ## Regular state-space system %!shared z_inv, z_tra, z_inp, z_out, z_sys, z_inv_e, z_tra_e, z_inp_e, z_out_e, z_sys_e %! A = diag ([1, 1, 3, -4, -1, 3]); %! %! B = [ 0, -1 %! -1, 0 %! 1, -1 %! 0, 0 %! 0, 1 %! -1, -1 ]; %! %! C = [ 1, 0, 0, 1, 0, 0 %! 0, 1, 0, 1, 0, 1 %! 0, 0, 1, 0, 0, 1 ]; %! %! D = zeros (3, 2); %! %! SYS = ss (A, B, C, D); %! %! z_inv = zero (SYS); %! z_tra = zero (SYS, "transmission"); %! z_inp = zero (SYS, "input decoupling"); %! z_out = zero (SYS, "output decoupling"); %! z_sys = zero (SYS, "system"); %! %! z_inv_e = [2; -1]; %! z_tra_e = [2]; %! z_inp_e = [-4]; %! z_out_e = [-1]; %! z_sys_e = [-4, -1, 2]; %! %!assert (z_inv, z_inv_e, 1e-4); %!assert (z_tra, z_tra_e, 1e-4); %!assert (z_inp, z_inp_e, 1e-4); %!assert (z_out, z_out_e, 1e-4); %!assert (z_sys, z_sys_e, 1e-4); ## Example taken from Paper [1] ## Well, this is not exactly a descriptor state-space model, ## but it is the best thing I have right now and it is better ## than no test at all. The routine for the system zeros works ## only for descriptor state-space models with regular 'E' matrices. %!shared z_inv, z_tra, z_inp, z_out, z_sys, z_inv_e, z_tra_e, z_inp_e, z_out_e, z_sys_e %! A = diag ([1, 1, 3, -4, -1, 3]); %! %! B = [ 0, -1 %! -1, 0 %! 1, -1 %! 0, 0 %! 0, 1 %! -1, -1 ]; %! %! C = [ 1, 0, 0, 1, 0, 0 %! 0, 1, 0, 1, 0, 1 %! 0, 0, 1, 0, 0, 1 ]; %! %! D = zeros (3, 2); %! %! E = eye (6); %! %! SYS = dss (A, B, C, D, E); %! %! z_inv = zero (SYS); %! z_tra = zero (SYS, "transmission"); %! z_inp = zero (SYS, "input decoupling"); %! z_out = zero (SYS, "output decoupling"); %! z_sys = zero (SYS, "system"); %! %! z_inv_e = [2; -1]; %! z_tra_e = [2]; %! z_inp_e = [-4]; %! z_out_e = [-1]; %! z_sys_e = [-4, -1, 2]; %! %!assert (z_inv, z_inv_e, 1e-4); %!assert (z_tra, z_tra_e, 1e-4); %!assert (z_inp, z_inp_e, 1e-4); %!assert (z_out, z_out_e, 1e-4); %!assert (z_sys, z_sys_e, 1e-4); control/inst/@lti/zpkdata.m0000644000076500000240000000427212273411257015232 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{z}, @var{p}, @var{k}, @var{tsam}] =} zpkdata (@var{sys}) ## @deftypefnx {Function File} {[@var{z}, @var{p}, @var{k}, @var{tsam}] =} zpkdata (@var{sys}, @var{"v"}) ## Access zero-pole-gain data. ## ## @strong{Inputs} ## @table @var ## @item sys ## Any type of @acronym{LTI} model. ## @item "v", "vector" ## For SISO models, return @var{z} and @var{p} directly as column vectors ## instead of cells containing a single column vector. ## @end table ## ## @strong{Outputs} ## @table @var ## @item z ## Cell of column vectors containing the zeros for each channel. ## z@{i,j@} contains the zeros from input j to output i. ## @item p ## Cell of column vectors containing the poles for each channel. ## p@{i,j@} contains the poles from input j to output i. ## @item k ## Matrix containing the gains for each channel. ## k(i,j) contains the gain from input j to output i. ## @item tsam ## Sampling time in seconds. If @var{sys} is a continuous-time model, ## a zero is returned. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2011 ## Version: 0.1 function [z, p, k, tsam] = zpkdata (sys, rtype = "cell") [num, den, tsam] = tfdata (sys); z = cellfun (@roots, num, "uniformoutput", false); p = cellfun (@roots, den, "uniformoutput", false); k = cellfun (@(n,d) n(1)/d(1), num, den); if (strncmpi (rtype, "v", 1) && issiso (sys)) z = z{1}; p = p{1}; endif endfunction control/inst/@ss/0000755000076500000240000000000012273411257013246 5ustar lukasstaffcontrol/inst/@ss/__c2d__.m0000644000076500000240000000414012273411257014667 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Convert the continuous SS model into its discrete-time equivalent. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.4 function sys = __c2d__ (sys, tsam, method = "zoh", w0 = 0) switch (method(1)) case {"z", "s"} # {"zoh", "std"} [sys.a, sys.b, sys.c, sys.d, sys.e] = __dss2ss__ (sys.a, sys.b, sys.c, sys.d, sys.e); [n, m] = size (sys.b); # n: states, m: inputs ## TODO: use SLICOT MB05OD tmp = expm ([sys.a*tsam, sys.b*tsam; zeros(m, n+m)]); sys.a = tmp (1:n, 1:n); # F sys.b = tmp (1:n, n+(1:m)); # G case {"t", "b", "p"} # {"tustin", "bilin", "prewarp"} if (method(1) == "p") # prewarping beta = w0 / tan (w0*tsam/2); else beta = 2/tsam; endif if (isempty (sys.e)) [sys.a, sys.b, sys.c, sys.d] = __sl_ab04md__ (sys.a, sys.b, sys.c, sys.d, 1, beta, false); else [sys.a, sys.b, sys.c, sys.d, sys.e] = __dss_bilin__ (sys.a, sys.b, sys.c, sys.d, sys.e, beta, false); endif case "m" # "matched" tmp = ss (c2d (zpk (sys), tsam, method)); sys.e = tmp.e; sys.a = tmp.a; sys.b = tmp.b; sys.c = tmp.c; sys.d = tmp.d; otherwise error ("ss: c2d: '%s' is an invalid or missing method", method); endswitch endfunction control/inst/@ss/__ctranspose__.m0000644000076500000240000000273312273411257016406 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Conjugate transpose of SS models. ## Author: Lukas Reichlin ## Created: May 2012 ## Version: 0.1 function sys = __ctranspose__ (sys, ct) a = sys.a; b = sys.b; c = sys.c; d = sys.d; e = sys.e; if (ct) # continuous-time sys.a = -a.'; sys.b = -c.'; sys.c = b.'; sys.d = d.'; sys.e = e.'; sys.stname = repmat ({""}, rows (a), 1); else # discrete-time [n, m] = size (b); p = rows (c); if (isempty (e)) e = eye (n); endif sys.a = blkdiag (e.', eye (p)); sys.b = [zeros(n, p); -eye(p)]; sys.c = [b.', zeros(m, p)]; sys.d = d.'; sys.e = [a.', c.'; zeros(p, n+p)]; sys.stname = repmat ({""}, n+p, 1); endif endfunction control/inst/@ss/__d2c__.m0000644000076500000240000000425612273411257014677 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Convert the discrete SS model into its continuous-time equivalent. ## Author: Lukas Reichlin ## Created: September 2011 ## Version: 0.3 function sys = __d2c__ (sys, tsam, method = "zoh", w0 = 0) switch (method(1)) case {"z", "s"} # {"zoh", "std"} [sys.a, sys.b, sys.c, sys.d, sys.e] = __dss2ss__ (sys.a, sys.b, sys.c, sys.d, sys.e); [n, m] = size (sys.b); # n: states, m: inputs tmp = logm ([sys.a, sys.b; zeros(m,n), eye(m)]) / tsam; if (norm (imag (tmp), inf) > sqrt (eps)) warning ("ss: d2c: possibly inaccurate results"); endif sys.a = real (tmp(1:n, 1:n)); sys.b = real (tmp(1:n, n+1:n+m)); case {"t", "b", "p"} # {"tustin", "bilin", "prewarp"} if (method(1) == "p") # prewarping beta = w0 / tan (w0*tsam/2); else beta = 2/tsam; endif if (isempty (sys.e)) [sys.a, sys.b, sys.c, sys.d] = __sl_ab04md__ (sys.a, sys.b, sys.c, sys.d, 1, beta, true); else [sys.a, sys.b, sys.c, sys.d, sys.e] = __dss_bilin__ (sys.a, sys.b, sys.c, sys.d, sys.e, beta, true); endif case "m" # "matched" tmp = ss (d2c (zpk (sys), method)); sys.e = tmp.e; sys.a = tmp.a; sys.b = tmp.b; sys.c = tmp.c; sys.d = tmp.d; otherwise error ("ss: d2c: '%s' is an invalid or missing method", method); endswitch endfunction control/inst/@ss/__freqresp__.m0000644000076500000240000000243412273411257016052 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Frequency response of SS models. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.6 function H = __freqresp__ (sys, w, cellflag = false) if (sys.scaled == false) sys = prescale (sys); endif [a, b, c, d, e, tsam] = dssdata (sys); if (isct (sys)) # continuous system s = i * w; else # discrete system s = exp (i * w * abs (tsam)); endif H = arrayfun (@(x) c/(x*e - a)*b + d, s, "uniformoutput", false); if (! cellflag) H = cat (3, H{:}); endif endfunction control/inst/@ss/__get__.m0000644000076500000240000000251612273411257015003 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Access property values of SS objects. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.1 function val = __get__ (sys, prop) switch (prop) # {, } case "a" val = sys.a; case "b" val = sys.b; case "c" val = sys.c; case "d" val = sys.d; case "e" val = sys.e; case {"stname", "statename", "stn", "staten"} val = sys.stname; case "scaled" val = sys.scaled; otherwise error ("ss: get: invalid property name '%s'", prop); endswitch endfunction control/inst/@ss/__minreal__.m0000644000076500000240000000273612273411257015657 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Minimal realization of SS models. The physical meaning of states is lost. ## Uses SLICOT TB01PD and TG01JD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.3 function retsys = __minreal__ (sys, tol) if (tol == "def") tol = 0; elseif (tol > 1) error ("ss: minreal: require tol <= 1"); endif if (isempty (sys.e)) [a, b, c] = __sl_tb01pd__ (sys.a, sys.b, sys.c, tol, sys.scaled); retsys = ss (a, b, c, sys.d); else [a, e, b, c] = __sl_tg01jd__ (sys.a, sys.e, sys.b, sys.c, tol, sys.scaled, 0, 0); retsys = dss (a, b, c, sys.d, e); endif retsys.lti = sys.lti; # retain i/o names and tsam endfunction control/inst/@ss/__pole__.m0000644000076500000240000000235312273411257015162 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Poles of SS object. ## Special thanks to Peter Benner for his advice. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.3 function pol = __pole__ (sys) if (isempty (sys.e)) pol = eig (sys.a); else pol = eig (sys.a, sys.e); tol = norm ([sys.a, sys.e], 2); idx = find (abs (pol) < tol/eps); pol = pol(idx); endif endfunction ## sys = ss (-2, 3, 4, 0) ## sysi = inv (sys) # singular e ## p = pole (sysi) ## infinite poles correct? control/inst/@ss/__prescale__.m0000644000076500000240000000264612273411257016026 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Prescale state-space model. ## Uses SLICOT TB01ID and TG01AD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## Author: Lukas Reichlin ## Created: June 2011 ## Version: 0.1 function [retsys, lscale, rscale] = __prescale__ (sys, optarg = 0.0) if (isempty (sys.e)) [a, b, c, ~, scale] = __sl_tb01id__ (sys.a, sys.b, sys.c, optarg); retsys = ss (a, b, c, sys.d); lscale = scale.^-1; rscale = scale; else [a, e, b, c, lscale, rscale] = __sl_tg01ad__ (sys.a, sys.e, sys.b, sys.c, optarg); retsys = dss (a, b, c, sys.d, e); endif retsys.scaled = true; retsys.lti = sys.lti; # retain i/o names and tsam endfunction control/inst/@ss/__property_names__.m0000644000076500000240000000355012273411257017272 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{props}, @var{vals}] =} __property_names__ (@var{sys}) ## @deftypefnx {Function File} {[@var{props}, @var{vals}] =} __property_names__ (@var{sys}, @var{"specific"}) ## Return the list of properties as well as the assignable values for a ss object sys. ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function [props, vals] = __property_names__ (sys, flg) ## cell vector of ss-specific properties props = {"a"; "b"; "c"; "d"; "e"; "stname"; "scaled"}; ## cell vector of ss-specific assignable values vals = {"n-by-n matrix (n = number of states)"; "n-by-m matrix (m = number of inputs)"; "p-by-n matrix (p = number of outputs)"; "p-by-m matrix"; "n-by-n matrix"; "n-by-1 cell vector of strings"; "scalar logical value"}; if (nargin == 1) [ltiprops, ltivals] = __property_names__ (sys.lti); props = [props; ltiprops]; vals = [vals; ltivals]; endif endfunction control/inst/@ss/__set__.m0000644000076500000240000000352712273411257015022 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Set or modify properties of SS objects. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.3 function sys = __set__ (sys, prop, val) switch (prop) # {, } case "a" __ss_dim__ (val, sys.b, sys.c, sys.d); sys.a = val; case "b" __ss_dim__ (sys.a, val, sys.c, sys.d); sys.b = val; case "c" __ss_dim__ (sys.a, sys.b, val, sys.d); sys.c = val; case "d" __ss_dim__ (sys.a, sys.b, sys.c, val); sys.d = val; case "e" if (isempty (val)) sys.e = []; # avoid [](nx0) or [](0xn) else __ss_dim__ (sys.a, sys.b, sys.c, sys.d, val); sys.e = val; endif case {"stname", "statename", "stn", "staten"} n = rows (sys.a); sys.stname = __adjust_labels__ (val, n); case "scaled" if (isscalar (val)) sys.scaled = logical (val); else error ("ss: set: property 'scaled' must be a logical value"); endif otherwise error ("ss: set: invalid property name '%s'", prop); endswitch endfunction control/inst/@ss/__sys2frd__.m0000644000076500000240000000220612273411257015614 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## SS to FRD conversion. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function [retsys, retlti] = __sys2frd__ (sys, w = []) if (isempty (w)) # case sys = frd (sys) w = __frequency_vector__ (sys); endif H = __freqresp__ (sys, w); retsys = frd (H, w); # tsam is set below retlti = sys.lti; # preserve lti properties endfunction control/inst/@ss/__sys2tf__.m0000644000076500000240000000560112273411257015454 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## SS to TF conversion. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.4 function [retsys, retlti] = __sys2tf__ (sys) sg_flag = false; # static gain flag try [a, b, c, d, tsam, scaled] = ssdata (sys); # system could be a descriptor model if (tsam == -2 || isempty (a)) # static gain sg_flag = true; else [num, den, ign, igd, md, p, m] = __sl_tb04bd__ (a, b, c, d, scaled); num = reshape (num, md, p, m); den = reshape (den, md, p, m); num = mat2cell (num, md, ones(1,p), ones(1,m)); den = mat2cell (den, md, ones(1,p), ones(1,m)); num = squeeze (num); den = squeeze (den); ign = mat2cell (ign, ones(1,p), ones(1,m)); igd = mat2cell (igd, ones(1,p), ones(1,m)); num = cellfun (@(x, y) x(1:y+1), num, ign, "uniformoutput", false); den = cellfun (@(x, y) x(1:y+1), den, igd, "uniformoutput", false); endif catch ## sys.e was probably singular, therefore ssdata failed. if (issiso (sys)) [num, den] = __siso_ss2tf__ (sys); else [p, m] = size (sys); num = cell (p, m); den = cell (p, m); for i = 1 : p for j = 1 : m idx = substruct ("()", {i, j}); tmp = subsref (sys, idx); # extract siso model tmp = minreal (tmp); # irreducible descriptor representation [n, d] = __siso_ss2tf__ (tmp); num(i, j) = n; den(i, j) = d; endfor endfor endif tsam = get (sys, "tsam"); end_try_catch if (sg_flag) retsys = tf (d); else retsys = tf (num, den, tsam); # tsam needed to set appropriate tfvar endif retlti = sys.lti; # preserve lti properties endfunction function [num, den] = __siso_ss2tf__ (sys) if (isempty (sys.a)) # static gain num = sys.d; den = 1; else # default case [zer, gain] = zero (sys); pol = pole (sys); num = gain * real (poly (zer)); den = real (poly (pol)); endif endfunction control/inst/@ss/__sys_connect__.m0000644000076500000240000000466612273411257016563 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{retsys} =} __sys_connect__ (@var{sys}, @var{M}) ## This function is part of the Model Abstraction Layer. No argument checking. ## For internal use only. ## @example ## @group ## Problem: Solve the system equations of ## . ## E x(t) = A x(t) + B e(t) ## ## y(t) = C x(t) + D e(t) ## ## e(t) = u(t) + M y(t) ## ## in order to build ## . ## K x(t) = F x(t) + G u(t) ## ## y(t) = H x(t) + J u(t) ## ## Solution: Laplace Transformation ## E s X(s) = A X(s) + B U(s) + B M Y(s) [1] ## ## Y(s) = C X(s) + D U(s) + D M Y(s) [2] ## ## solve [2] for Y(s) ## Y(s) = [I - D M]^(-1) C X(s) + [I - D M]^(-1) D U(s) ## ## substitute Z = [I - D M]^(-1) ## Y(s) = Z C X(s) + Z D U(s) [3] ## ## insert [3] in [1], solve for X(s) ## X(s) = [s E - (A + B M Z C)]^(-1) (B + B M Z D) U(s) [4] ## ## inserting [4] in [3] finally yields ## Y(s) = Z C [s E - (A + B M Z C)]^(-1) (B + B M Z D) U(s) + Z D U(s) ## \ / | \_____ _____/ \_____ _____/ \ / ## H K F G J ## @end group ## @end example ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.2 function sys = __sys_connect__ (sys, m) a = sys.a; b = sys.b; c = sys.c; d = sys.d; z = eye (rows (d)) - d*m; if (rcond (z) < eps) # check for singularity error ("ss: sys_connect: (I - D*M) singular"); endif z = inv (z); sys.a = a + b*m*z*c; # F sys.b = b + b*m*z*d; # G sys.c = z*c; # H sys.d = z*d; # J ## sys.e remains constant: [] for ss models, e for dss models endfunction control/inst/@ss/__sys_data__.m0000644000076500000240000000207712273411257016035 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Used by ssdata instead of multiple get calls. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.3 function [a, b, c, d, e, stname, scaled] = __sys_data__ (sys) a = sys.a; b = sys.b; c = sys.c; d = sys.d; e = sys.e; stname = sys.stname; scaled = sys.scaled; endfunction control/inst/@ss/__sys_group__.m0000644000076500000240000000361612273411257016260 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Block diagonal concatenation of two SS models. ## This file is part of the Model Abstraction Layer. ## For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.2 function retsys = __sys_group__ (sys1, sys2) if (! isa (sys1, "ss")) sys1 = ss (sys1); endif if (! isa (sys2, "ss")) sys2 = ss (sys2); endif retsys = ss (); retsys.lti = __lti_group__ (sys1.lti, sys2.lti); n1 = rows (sys1.a); n2 = rows (sys2.a); [p1, m1] = size (sys1.d); [p2, m2] = size (sys2.d); retsys.a = [sys1.a, zeros(n1,n2); zeros(n2,n1), sys2.a]; retsys.b = [sys1.b, zeros(n1,m2); zeros(n2,m1), sys2.b]; retsys.c = [sys1.c, zeros(p1,n2); zeros(p2,n1), sys2.c]; retsys.d = [sys1.d, zeros(p1,m2); zeros(p2,m1), sys2.d]; e1 = ! isempty (sys1.e); e2 = ! isempty (sys2.e); if (e1 || e2) if (e1 && e2) retsys.e = [sys1.e, zeros(n1,n2); zeros(n2,n1), sys2.e]; elseif (e1) retsys.e = [sys1.e, zeros(n1,n2); zeros(n2,n1), eye(n2)]; else retsys.e = [eye(n1), zeros(n1,n2); zeros(n2,n1), sys2.e]; endif endif retsys.stname = [sys1.stname; sys2.stname]; endfunction control/inst/@ss/__sys_inverse__.m0000644000076500000240000000311412273411257016570 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Inversion of SS models. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.3 function sys = __sys_inverse__ (sys) a = sys.a; b = sys.b; c = sys.c; d = sys.d; e = sys.e; if (! isempty (e) || rcond (d) < eps) # dss or strictly proper ss n = rows (a); m = columns (b); # p = m (square system) if (isempty (e)) # avoid testing twice? e = eye (n); endif sys.a = [a, b; c, d]; sys.b = [zeros(n, m); -eye(m)]; sys.c = [zeros(m, n), eye(m)]; sys.d = zeros (m); sys.e = [e, zeros(n, m); zeros(m, n+m)]; sys.stname = repmat ({""}, n+m, 1); else # proper ss bid = b / d; sys.a = a - bid * c; sys.b = -bid; sys.c = d \ c; sys.d = inv (d); endif endfunction control/inst/@ss/__sys_prune__.m0000644000076500000240000000346312273411257016255 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Submodel extraction and reordering for SS objects. ## This file is part of the Model Abstraction Layer. ## For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.3 function sys = __sys_prune__ (sys, out_idx, in_idx, st_idx = ":") [sys.lti, out_idx, in_idx] = __lti_prune__ (sys.lti, out_idx, in_idx); if (ischar (st_idx) && ! strcmp (st_idx, ":")) st_idx = {st_idx}; endif if (iscell (st_idx)) st_idx = cellfun (@(x) __str2idx__ (sys.stname, x), st_idx); endif sys.a = sys.a(st_idx, st_idx); sys.b = sys.b(st_idx, in_idx); sys.c = sys.c(out_idx, st_idx); sys.d = sys.d(out_idx, in_idx); if (! isempty (sys.e)) sys.e = sys.e(st_idx, st_idx); endif sys.stname = sys.stname(st_idx); endfunction function idx = __str2idx__ (name, str) tmp = strcmp (name, str)(:); switch (nnz (tmp)) case 1 idx = find (tmp); case 0 error ("ss: state name '%s' not found", str); otherwise error ("ss: state name '%s' is ambiguous", str); endswitch endfunction control/inst/@ss/__transpose__.m0000644000076500000240000000213112273411257016233 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Transpose of SS models. ## Author: Lukas Reichlin ## Created: February 2010 ## Version: 0.2 function sys = __transpose__ (sys) a = sys.a; b = sys.b; c = sys.c; d = sys.d; e = sys.e; sys.stname = repmat ({""}, rows (a), 1); sys.a = a.'; sys.b = c.'; sys.c = b.'; sys.d = d.'; sys.e = e.'; endfunction control/inst/@ss/__zero__.m0000644000076500000240000000307112273411257015200 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Invariant zeros of SS object. ## Uses SLICOT AB08ND and AG08BD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.4 function [zer, gain, info] = __zero__ (sys, argc) if (isempty (sys.e)) [zer, gain, rank, infz, kronr, kronl] = __sl_ab08nd__ (sys.a, sys.b, sys.c, sys.d, sys.scaled); else [zer, rank, infz, kronr, kronl] = __sl_ag08bd__ (sys.a, sys.e, sys.b, sys.c, sys.d, sys.scaled); if (argc > 1 && issiso (sys)) pol = pole (sys); gain = __sl_tg04bx__ (sys.a, sys.e, sys.b, sys.c, sys.d, ... real (pol), imag (pol), real (zer), imag (zer)); else gain = []; endif endif info = struct ("rank", rank, "infz", infz, "kronr", kronr, "kronl", kronl); endfunction control/inst/@ss/display.m0000644000076500000240000000530612273411257015075 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Display routine for SS objects. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.2 function display (sys) sysname = inputname (1); [inname, outname, tsam] = __lti_data__ (sys.lti); stname = sys.stname; inname = __labels__ (inname, "u"); outname = __labels__ (outname, "y"); stname = __labels__ (stname, "x"); disp (""); if (! isempty (sys.e)) __disp_mat__ (sys.e, [sysname, ".e"], stname, stname); endif if (! isempty (sys.a)) __disp_mat__ (sys.a, [sysname, ".a"], stname, stname); __disp_mat__ (sys.b, [sysname, ".b"], stname, inname); __disp_mat__ (sys.c, [sysname, ".c"], outname, stname); endif __disp_mat__ (sys.d, [sysname, ".d"], outname, inname); display (sys.lti); # display sampling time if (tsam == -2) disp ("Static gain."); elseif (tsam == 0) disp ("Continuous-time model."); else disp ("Discrete-time model."); endif endfunction function __disp_mat__ (m, mname, rname, cname) MAX_LEN = 12; # max length of row name and column name [mrows, mcols] = size (m); row_name = strjust (strvcat (" ", rname), "left"); row_name = row_name(:, 1 : min (MAX_LEN, end)); row_name = horzcat (repmat (" ", mrows+1, 3), row_name); mat = cell (1, mcols); for k = 1 : mcols cname{k} = cname{k}(:, 1 : min (MAX_LEN, end)); acol = vertcat (cname(k), cellstr (deblank (num2str (m(:, k), 4)))); mat{k} = strjust (strvcat (acol{:}), "right"); endfor lcols = cellfun (@columns, mat); lcols_max = 2 + max (horzcat (lcols, 1)); for k = 1 : mcols mat{k} = horzcat (repmat (" ", mrows+1, lcols_max-lcols(k)), mat{k}); endfor tsize = terminal_size (); dispcols = max (1, floor ((tsize(2) - columns (row_name)) / lcols_max)); disprows = max (1, ceil (mcols / dispcols)); disp ([mname, " ="]); for k = 1 : disprows disp (horzcat (row_name, mat{1+(k-1)*dispcols : min (mcols, k*dispcols)})); disp (""); endfor endfunction control/inst/@ss/ss.m0000644000076500000240000001456412273411257014063 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} ss (@var{sys}) ## @deftypefnx {Function File} {@var{sys} =} ss (@var{d}) ## @deftypefnx {Function File} {@var{sys} =} ss (@var{a}, @var{b}) ## @deftypefnx {Function File} {@var{sys} =} ss (@var{a}, @var{b}, @var{c}) ## @deftypefnx {Function File} {@var{sys} =} ss (@var{a}, @var{b}, @var{c}, @var{d}, @dots{}) ## @deftypefnx {Function File} {@var{sys} =} ss (@var{a}, @var{b}, @var{c}, @var{d}, @var{tsam}, @dots{}) ## Create or convert to state-space model. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model to be converted to state-space. ## @item a ## State matrix (n-by-n). ## @item b ## Input matrix (n-by-m). ## @item c ## Output matrix (p-by-n). ## If @var{c} is empty @code{[]} or not specified, an identity matrix is assumed. ## @item d ## Feedthrough matrix (p-by-m). ## If @var{d} is empty @code{[]} or not specified, a zero matrix is assumed. ## @item tsam ## Sampling time in seconds. If @var{tsam} is not specified, a continuous-time model is assumed. ## @item @dots{} ## Optional pairs of properties and values. ## Type @command{set (ss)} for more information. ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## State-space model. ## @end table ## ## @strong{Option Keys and Values} ## @table @var ## @item 'a', 'b', 'c', 'd', 'e' ## State-space matrices. See 'Inputs' for details. ## ## @item 'stname' ## The name of the states in @var{sys}. ## Cell vector containing strings for each state. ## Default names are @code{@{'x1', 'x2', ...@}} ## ## @item 'scaled' ## Logical. If set to true, no automatic scaling is used, ## e.g. for frequency response plots. ## ## @item 'tsam' ## Sampling time. See 'Inputs' for details. ## ## @item 'inname' ## The name of the input channels in @var{sys}. ## Cell vector of length m containing strings. ## Default names are @code{@{'u1', 'u2', ...@}} ## ## @item 'outname' ## The name of the output channels in @var{sys}. ## Cell vector of length p containing strings. ## Default names are @code{@{'y1', 'y2', ...@}} ## ## @item 'ingroup' ## Struct with input group names as field names and ## vectors of input indices as field values. ## Default is an empty struct. ## ## @item 'outgroup' ## Struct with output group names as field names and ## vectors of output indices as field values. ## Default is an empty struct. ## ## @item 'name' ## String containing the name of the model. ## ## @item 'notes' ## String or cell of string containing comments. ## ## @item 'userdata' ## Any data type. ## @end table ## ## @strong{Example} ## @example ## @group ## octave:1> a = [1 2 3; 4 5 6; 7 8 9]; ## octave:2> b = [10; 11; 12]; ## octave:3> stname = @{"V", "A", "kJ"@}; ## octave:4> sys = ss (a, b, [], [], "stname", stname) ## @end group ## @end example ## ## @example ## @group ## sys.a = ## V A kJ ## V 1 2 3 ## A 4 5 6 ## kJ 7 8 9 ## @end group ## @end example ## ## @example ## @group ## sys.b = ## u1 ## V 10 ## A 11 ## kJ 12 ## @end group ## @end example ## ## @example ## @group ## sys.c = ## V A kJ ## y1 1 0 0 ## y2 0 1 0 ## y3 0 0 1 ## @end group ## @end example ## ## @example ## @group ## sys.d = ## u1 ## y1 0 ## y2 0 ## y3 0 ## ## Continuous-time model. ## octave:5> ## @end group ## @end example ## ## @seealso{tf, dss} ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.3 function sys = ss (a = [], b = [], c = [], d = [], varargin) ## model precedence: frd > ss > zpk > tf > double ## inferiorto ("frd"); superiorto ("zpk", "tf", "double"); argc = 0; # initialize argument count tsam = 0; # initialize sampling time if (nargin == 1) if (isa (a, "ss")) # already in ss form sys = ss (sssys) sys = a; return; elseif (isa (a, "lti")) # another lti object sys = ss (sys) [sys, alti] = __sys2ss__ (a); sys.lti = alti; # preserve lti properties return; elseif (is_real_matrix (a)) # static gain sys = ss (5), sys = ss (matrix) d = a; a = []; else print_usage (); endif elseif (nargin > 4) # default case sys = ss (a, b, c, d, "prop1", val1, ...) argc = numel (varargin); # number of additional arguments after d if (issample (varargin{1}, -10)) # sys = ss (a, b, c, d, tsam, "prop1, "val1", ...) tsam = varargin{1}; # sampling time, could be 0 as well argc--; # tsam is not a property-value pair if (argc > 0) # if there are any properties and values ... varargin = varargin(2:end); # remove tsam from property-value list endif endif endif # nothing to do for ss (), ss (a, b), ss (a, b, c), ss (a, b, c, d) [a, b, c, d, tsam] = __adjust_ss_data__ (a, b, c, d, tsam); [p, m, n] = __ss_dim__ (a, b, c, d); # determine number of outputs, inputs and states stname = repmat ({""}, n, 1); # cell with empty state names ssdata = struct ("a", a, "b", b, "c", c, "d", d, "e", [], "stname", {stname}, "scaled", false); # struct for ss-specific data ltisys = lti (p, m, tsam); # parent class for general lti data sys = class (ssdata, "ss", ltisys); # create ss object if (argc > 0) # if there are any properties and values, ... sys = set (sys, varargin{:}); # use the general set function endif endfunction control/inst/@tf/0000755000076500000240000000000012273411257013232 5ustar lukasstaffcontrol/inst/@tf/__c2d__.m0000644000076500000240000000544512273411257014664 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Convert the continuous TF model into its discrete-time equivalent. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.3 function sys = __c2d__ (sys, tsam, method = "zoh", w0 = 0) if (strncmpi (method, "m", 1)) # "matched" ## TODO: move this code to @zpk/__c2d__.m once ZPK models are implemented if (! issiso (sys)) error ("tf: c2d: require SISO system for matched pole/zero method"); endif [z_c, p_c, k_c] = zpkdata (sys, "vector"); p_d = exp (p_c * tsam); z_d = exp (z_c * tsam); if (any (! isfinite (p_d)) || any (! isfinite (z_d))) error ("tf: c2d: discrete-time poles and zeros are not finite"); endif ## continuous-time zeros at infinity are mapped to -1 in discrete-time ## except for one. for non-proper transfer functions, no zeros at -1 are added. np = length (p_c); # number of poles nz = length (z_c); # number of finite zeros, np-nz number of infinite zeros z_d = vertcat (z_d, repmat (-1, np-nz-1, 1)); ## the discrete-time gain k_d is matched at a certain frequency (w_c, w_d) ## to continuous-time gain k_c. the dc gain is taken (w_c=0, w_d=1) unless ## there are continuous-time poles/zeros near 0. then w_c=1/tsam is taken. w_c = 0; # dc gain tol = sqrt (eps); # poles/zeros below tol are assumed to be zero while (any (abs ([p_c; z_c] - w_c) < tol)) w_c += 0.1 / tsam; endwhile w_d = exp (w_c * tsam); k_d = real (k_c * prod (w_c - z_c) / prod (w_c - p_c) * prod (w_d - p_d) / prod (w_d - z_d)); tmp = zpk (z_d, p_d, k_d, tsam); sys.num = tmp.num; sys.den = tmp.den; else [p, m] = size (sys); for i = 1 : p for j = 1 : m idx = substruct ("()", {i, j}); tmp = subsref (sys, idx); tmp = c2d (ss (tmp), tsam, method, w0); [num, den] = tfdata (tmp, "tfpoly"); sys.num(i, j) = num; sys.den(i, j) = den; endfor endfor endif sys.tfvar = "z"; endfunction control/inst/@tf/__ctranspose__.m0000644000076500000240000000252612273411257016372 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Conjugate transpose of TF models. ## Author: Lukas Reichlin ## Created: May 2012 ## Version: 0.1 function sys = __ctranspose__ (sys, ct) num = sys.num; den = sys.den; if (ct) # continuous-time num = cellfun (@conj_ct, num, "uniformoutput", false); den = cellfun (@conj_ct, den, "uniformoutput", false); else # discrete-time num = cellfun (@conj_dt, num, "uniformoutput", false); den = cellfun (@conj_dt, den, "uniformoutput", false); ## TODO: shall I make "den" a monic polynomial? endif sys.num = num.'; sys.den = den.'; endfunction control/inst/@tf/__d2c__.m0000644000076500000240000000432612273411257014661 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Convert the discrete TF model into its continuous-time equivalent. ## Author: Lukas Reichlin ## Created: September 2011 ## Version: 0.2 function sys = __d2c__ (sys, tsam, method = "zoh", w0 = 0) if (strncmpi (method, "m", 1)) # "matched" ## TODO: move this code to @zpk/__d2c__.m once ZPK models are implemented if (! issiso (sys)) error ("tf: d2c: require SISO system for matched pole/zero method"); endif [z_d, p_d, k_d] = zpkdata (sys, "vector"); if (any (abs (p_d) < eps) || any (abs (z_d) < eps)) error ("tf: d2c: discrete-time poles and zeros at 0 not supported because log(0) is -Inf"); endif z_d_orig = z_d; z_d(abs (z_d+1) < sqrt (eps)) = []; p_c = log (p_d) / tsam; z_c = log (z_d) / tsam; w_c = 0; w_d = 1; tol = sqrt (eps); while (any (abs ([p_d; z_d_orig] - w_d) < tol)) w_c += 0.1 / tsam; endwhile w_d = exp (w_c * tsam); k_c = real (k_d * prod (w_d - z_d_orig) / prod (w_d - p_d) * prod (w_c - p_c) / prod (w_c - z_c)); tmp = zpk (z_c, p_c, k_c); sys.num = tmp.num; sys.den = tmp.den; else [p, m] = size (sys); for i = 1 : p for j = 1 : m idx = substruct ("()", {i, j}); tmp = subsref (sys, idx); tmp = d2c (ss (tmp), method, w0); [num, den] = tfdata (tmp, "tfpoly"); sys.num(i, j) = num; sys.den(i, j) = den; endfor endfor endif sys.tfvar = "s"; endfunction control/inst/@tf/__freqresp__.m0000644000076500000240000000270312273411257016035 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Frequency response of TF models. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.5 function H = __freqresp__ (sys, w, cellflag = false) [num, den, tsam] = tfdata (sys, "vector"); if (isct (sys)) # continuous system s = i * w; else # discrete system s = exp (i * w * abs (tsam)); endif s = reshape (s, 1, 1, []); if (issiso (sys)) H = polyval (num, s) ./ polyval (den, s); else H = cellfun (@(x, y) polyval (x, s) ./ polyval (y, s), num, den, "uniformoutput", false); H = cell2mat (H); endif if (cellflag) [p, m] = size (sys); l = length (s); H = mat2cell (H, p, m, ones (1, l))(:); endif endfunction control/inst/@tf/__get__.m0000644000076500000240000000245712273411257014773 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Access property values of TF objects. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.3 function val = __get__ (sys, prop) switch (prop) # {, } case "num" val = cellfun (@get, sys.num, "uniformoutput", false); case "den" val = cellfun (@get, sys.den, "uniformoutput", false); case {"tfvar", "variable", "var"} val = sys.tfvar; case "inv" val = sys.inv; otherwise error ("tf: get: invalid property name '%s'", prop); endswitch endfunction control/inst/@tf/__minreal__.m0000644000076500000240000000422012273411257015631 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Minimal realization of TF models. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.1 function sys = __minreal__ (sys, tol) ## TODO: Once ZPK models are implemented, convert TF to ZPK, ## do cancellations over there and convert back to TF sqrt_eps = sqrt (eps); # treshold for zero [p, m] = size (sys); for ny = 1 : p for nu = 1 : m sisosys = __sys_prune__ (sys, ny, nu); [zer, gain] = zero (sisosys); pol = pole (sisosys); for k = length (zer) : -1 : 1 # reversed because of deleted zeros [~, idx] = min (abs (zer(k) - pol)); # find best match if (tol == "def") if (abs (zer(k)) < sqrt_eps) # catch case zer(k) = 0 t = 1000 * eps; else t = 1000 * abs (zer(k)) * sqrt_eps; endif else t = tol; endif if (abs (zer(k) - pol(idx)) < t) zer(k) = []; pol(idx) = []; endif endfor num = real (gain * poly (zer)); den = real (poly (pol)); num_idx = find (abs (num) < sqrt_eps); # suppress numerical noise den_idx = find (abs (den) < sqrt_eps); # in polynomial coefficients num(num_idx) = 0; den(den_idx) = 0; sys.num{ny, nu} = tfpoly (num); sys.den{ny, nu} = tfpoly (den); endfor endfor endfunction control/inst/@tf/__pole__.m0000644000076500000240000000211512273411257015142 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Poles of TF object. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.2 function pol = __pole__ (sys) if (issiso (sys)) pol = roots (sys.den{1}); else warning ("tf: pole: converting to minimal state-space for pole computation of mimo tf"); pol = pole (ss (sys)); endif endfunction control/inst/@tf/__property_names__.m0000644000076500000240000000341312273411257017254 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{props}, @var{vals}] =} __property_names__ (@var{sys}) ## @deftypefnx {Function File} {[@var{props}, @var{vals}] =} __property_names__ (@var{sys}, @var{"specific"}) ## Return the list of properties as well as the assignable values for a ss object sys. ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.1 function [props, vals] = __property_names__ (sys, flg) ## cell vector of tf-specific properties props = {"num"; "den"; "tfvar"; "inv"}; ## cell vector of tf-specific assignable values vals = {"p-by-m cell array of row vectors (m = number of inputs)"; "p-by-m cell array of row vectors (p = number of outputs)"; "string (usually s or z)"; "logical (true for negative powers of TF variable)"}; if (nargin == 1) [ltiprops, ltivals] = __property_names__ (sys.lti); props = [props; ltiprops]; vals = [vals; ltivals]; endif endfunction control/inst/@tf/__set__.m0000644000076500000240000000330512273411257015000 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Set or modify properties of TF objects. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.2 function sys = __set__ (sys, prop, val) switch (prop) # {, } case "num" num = __vec2tfpoly__ (val); __tf_dim__ (num, sys.den); sys.num = num; case "den" den = __vec2tfpoly__ (val); __tf_dim__ (sys.num, den); sys.den = den; case {"tfvar", "variable", "var"} if (ischar (val)) sys.tfvar = val; else error ("tf: set: invalid transfer function variable"); endif case "inv" if (! isdt (sys)) error ("tf: set: property 'inv' requires discrete-time system"); elseif (! isscalar (val)) error ("tf: set: property 'inv' must be a scalar logical"); else sys.inv = logical (val); endif otherwise error ("tf: set: invalid property name '%s'", prop); endswitch endfunction control/inst/@tf/__sys2frd__.m0000644000076500000240000000220612273411257015600 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## TF to FRD conversion. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function [retsys, retlti] = __sys2frd__ (sys, w = []) if (isempty (w)) # case sys = frd (sys) w = __frequency_vector__ (sys); endif H = __freqresp__ (sys, w); retsys = frd (H, w); # tsam is set below retlti = sys.lti; # preserve lti properties endfunction control/inst/@tf/__sys2ss__.m0000644000076500000240000001257212273411257015461 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## TF to SS conversion. ## Reference: ## Varga, A.: Computation of irreducible generalized state-space realizations. ## Kybernetika, 26:89-106, 1990 ## Special thanks to Vasile Sima and Andras Varga for their advice. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.5 function [retsys, retlti] = __sys2ss__ (sys) ## TODO: determine appropriate tolerance from number of inputs ## (since we multiply all denominators in a row), index, ... ## default tolerance from TB01UD is TOLDEF = N*N*EPS ## SECRET WISH: a routine which accepts individual denominators for ## each channel and which supports descriptor systems [p, m] = size (sys); [num, den] = tfdata (sys); len_num = cellfun (@length, num); len_den = cellfun (@length, den); ## check for properness ## tfpoly ensures that there are no leading zeros tmp = len_num > len_den; if (any (tmp(:))) # non-proper transfer function ## separation into strictly proper and polynomial part [numq, numr] = cellfun (@deconv, num, den, "uniformoutput", false); numq = cellfun (@__remove_leading_zeros__, numq, "uniformoutput", false); numr = cellfun (@__remove_leading_zeros__, numr, "uniformoutput", false); ## minimal state-space realization for the proper part [a1, b1, c1] = __proper_tf2ss__ (numr, den, p, m); e1 = eye (size (a1)); ## minimal realization for the polynomial part [e2, a2, b2, c2] = __polynomial_tf2ss__ (numq, p, m); ## assemble irreducible descriptor realization e = blkdiag (e1, e2); a = blkdiag (a1, a2); b = vertcat (b1, b2); c = horzcat (c1, c2); retsys = dss (a, b, c, [], e); else # proper transfer function [a, b, c, d] = __proper_tf2ss__ (num, den, p, m); retsys = ss (a, b, c, d); endif retlti = sys.lti; # preserve lti properties such as tsam endfunction ## transfer function to state-space conversion for proper models function [a, b, c, d] = __proper_tf2ss__ (num, den, p, m) ## new cells for the TF of same row denominators numc = cell (p, m); denc = cell (p, 1); ## set zero denominators to 1 for convolution zero_idx = cellfun (@(x) all (x == 0), den); den(zero_idx) = 1; ## multiply all denominators in a row and ## update each numerator accordingly ## except for single-input models and those ## with equal denominators in a row for i = 1 : p if (m == 1 || isequal (den{i,:})) denc(i) = den{i,1}; numc(i,:) = num(i,:); else denc(i) = __conv__ (den{i,:}); for j = 1 : m idx = setdiff (1:m, j); numc(i,j) = __conv__ (num{i,j}, den{i,idx}); endfor endif endfor ## set numerators to zero if their denominators are zero numc(zero_idx) = 0; len_numc = cellfun (@length, numc); len_denc = cellfun (@length, denc); ## check for properness ## tfpoly ensures that there are no leading zeros ## tmp = len_numc > repmat (len_denc, 1, m); ## if (any (tmp(:))) ## error ("tf: tf2ss: system must be proper"); ## endif ## create arrays and fill in the data ## in a way that Slicot TD04AD can use max_len_denc = max (len_denc(:)); ucoeff = zeros (p, m, max_len_denc); dcoeff = zeros (p, max_len_denc); index = len_denc-1; for i = 1 : p len = len_denc(i); dcoeff(i, 1:len) = denc{i}; for j = 1 : m ucoeff(i, j, len-len_numc(i,j)+1 : len) = numc{i,j}; endfor endfor tol = min (sqrt (eps), eps*prod (index)); [a, b, c, d] = __sl_td04ad__ (ucoeff, dcoeff, index, tol); endfunction ## realization of the polynomial part according to Andras' paper function [e2, a2, b2, c2] = __polynomial_tf2ss__ (numq, p, m) len_numq = cellfun (@length, numq); max_len_numq = max (len_numq(:)); numq = cellfun (@(x) prepad (x, max_len_numq, 0, 2), numq, "uniformoutput", false); f = @(y) cellfun (@(x) x(y), numq); s = 1 : max_len_numq; D = arrayfun (f, s, "uniformoutput", false); e2 = diag (ones (p*(max_len_numq-1), 1), -p); a2 = eye (p*max_len_numq); b2 = vertcat (D{:}); c2 = horzcat (zeros (p, p*(max_len_numq-1)), -eye (p)); ## remove uncontrollable part [a2, e2, b2, c2] = __sl_tg01jd__ (a2, e2, b2, c2, 0.0, true, 1, 2); endfunction ## convolution for more than two arguments function vec = __conv__ (vec, varargin) if (nargin == 1) return; else for k = 1 : nargin-1 vec = conv (vec, varargin{k}); endfor endif endfunction ## remove leading zeros from polynomial vector function p = __remove_leading_zeros__ (p) idx = find (p != 0); if (isempty (idx)) p = 0; else p = p(idx(1) : end); # p(idx) would remove all zeros endif endfunction control/inst/@tf/__sys_connect__.m0000644000076500000240000001052412273411257016535 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{retsys} =} __sys_connect__ (@var{sys}, @var{M}) ## This function is part of the Model Abstraction Layer. No argument checking. ## For internal use only. ## @example ## @group ## Problem: Solve the system equations of ## Y(s) = G(s) E(s) ## E(s) = U(s) + M Y(s) ## in order to build ## Y(s) = H(s) U(s) ## Solution: ## Y(s) = G(s) [I - M G(s)]^-1 U(s) ## = [I - G(s) M]^-1 G(s) U(s) ## @end group ## @end example ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.2 function sys = __sys_connect__ (sys, M) [p, m] = size (sys); num = sys.num; den = sys.den; ## TODO: Implementation for MIMO models. There are three possibilities: ## 1. An _algebraic_ solution of the inversion problem in order ## to not introduce unwanted zero/pole pairs. Difficult. ## 2. A numeric solution of the inversion problem. Afterwards, ## elimination of _all_ zero/pole pairs by minreal. Bad. ## 3. Conversion to state-space, solving the problem there and ## converting back to transfer function. Easier, but obviously, ## this way needs MIMO __sys2ss__ and __sys2tf__ implementations ## as described in Thomas Kailath's classic "Linear Systems". ## Possibly this is the way to go, but it works for proper systems ## only unless descriptor state-space models are implemented. ## WARNING: The code below is a cheap hack to quickly enable SISO TF connections. ## TODO: Check for den = 0, e.g. in feedback (tf (1), tf (-1)) if (p == 2 && m == 2 && num{1,2} == 0 && num{2,1} == 0 ... && M(1,1) == 0 && M(2,2) == 0) ## mtimes, feedback sys.num(1,1) = num{1,1} * den{2,2}; sys.num(1,2) = M(1,2) * num{1,1} * num{2,2}; sys.num(2,1) = M(2,1) * num{1,1} * num{2,2}; sys.num(2,2) = num{2,2} * den{1,1}; sys.den(:) = den{1,1} * den{2,2} - M(1,2) * M(2,1) * num{1,1} * num{2,2}; elseif (p == 3 && m == 4 && num{1,3} == 0 && num{1,4} == 0 ... && num{2,1} == 0 && num{2,2} == 0 && num{2,4} == 0 ... && num{3,1} == 0 && num{3,2} == 0 && num{3,3} == 0 ... && M == [0, 1, 0; 0, 0, 1; 0, 0, 0; 0, 0, 0]) ## horzcat [sys1, sys2], plus, minus sys.num(:) = tfpoly (0); sys.den(:) = tfpoly (1); sys.num(1,1) = num{1,1}; sys.num(1,2) = num{1,2}; sys.num(1,3) = num{1,1} * num{2,3}; sys.num(1,4) = num{1,2} * num{3,4}; sys.num(2,3) = num{2,3}; sys.num(3,4) = num{3,4}; sys.den(1,3) = den{2,3}; sys.den(1,4) = den{3,4}; sys.den(2,3) = den{2,3}; sys.den(3,4) = den{3,4}; elseif (p == 3 && m == 3 && num{1,3} == 0 ... && num{2,1} == 0 && num{2,2} == 0 && num{2,3} == 1 ... && num{3,1} == 0 && num{3,2} == 0 && num{3,3} == 1 ... && M == [0, 1, 0; 0, 0, 1; 0, 0, 0]) ## plus, minus sys.num(1,3) = num{1,1} * den{1,2} + num{1,2} * den{1,1}; sys.den(1,3) = den{1,1} * den{1,2}; elseif (p == 4 && m == 3 && num{1,2} == 0 && num{1,3} == 0 ... && num{2,1} == 0 && num{2,3} == 0 ... && num{3,1} == 0 && num{3,2} == 0 && num{3,3} == 1 ... && num{4,1} == 0 && num{4,2} == 0 && num{4,3} == 1 ... && M == [0, 0, 1, 0; 0, 0, 0, 1; 0, 0, 0, 0]) ## vertcat [sys1; sys2] sys.num(1,3) = num{1,1}; sys.num(2,3) = num{2,2}; sys.den(1,3) = den{1,1}; sys.den(2,3) = den{2,2}; else ## MIMO case, convert to state-space and back. warning ("tf: converting to minimal state-space for MIMO TF interconnections"); sys = tf (__sys_connect__ (ss (sys), M)); endif endfunction control/inst/@tf/__sys_data__.m0000644000076500000240000000176712273411257016026 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Used by tfdata instead of multiple get calls. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.1 function [num, den, tfvar] = __sys_data__ (sys) num = sys.num; den = sys.den; tfvar = sys.tfvar; endfunction control/inst/@tf/__sys_group__.m0000644000076500000240000000337612273411257016247 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Block diagonal concatenation of two TF models. ## This file is part of the Model Abstraction Layer. ## For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.2 function retsys = __sys_group__ (sys1, sys2) if (! isa (sys1, "tf")) sys1 = tf (sys1); endif if (! isa (sys2, "tf")) sys2 = tf (sys2); endif retsys = tf (); retsys.lti = __lti_group__ (sys1.lti, sys2.lti); [p1, m1] = size (sys1); [p2, m2] = size (sys2); empty12 = tfpolyzeros (p1, m2); empty21 = tfpolyzeros (p2, m1); retsys.num = [sys1.num, empty12 ; empty21, sys2.num]; empty12 = tfpolyones (p1, m2); empty21 = tfpolyones (p2, m1); retsys.den = [sys1.den, empty12 ; empty21, sys2.den]; if (sys1.tfvar == sys2.tfvar) retsys.tfvar = sys1.tfvar; elseif (sys1.tfvar == "x") retsys.tfvar = sys2.tfvar; else retsys.tfvar = sys1.tfvar; endif if (sys1.inv || sys2.inv) retsys.inv = true; endif endfunction control/inst/@tf/__sys_inverse__.m0000644000076500000240000000330512273411257016556 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Inversion of TF models. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.2 function sys = __sys_inverse__ (sys) nvec = size (sys); num = sys.num; den = sys.den; if (all (nvec == 1)) # SISO if (num{1,1} == 0) # catch case num = 0 sys.num(1,1) = tfpoly (0); sys.den(1,1) = tfpoly (1); else sys.num = den; sys.den = num; endif elseif (all (nvec == 2)) # 2x2 MIMO sys.num(1,1) = -den{1,1}*den{1,2}*den{2,1}*num{2,2}; sys.num(1,2) = den{1,1}*den{2,1}*den{2,2}*num{1,2}; sys.num(2,1) = den{1,1}*den{1,2}*den{2,2}*num{2,1}; sys.num(2,2) = -den{1,2}*den{2,1}*den{2,2}*num{1,1}; sys.den(:) = den{1,1}*den{2,2}*num{1,2}*num{2,1} - den{1,2}*den{2,1}*num{1,1}*num{2,2}; else ## I've calculated 3x3 systems with sage but the formula is quite long [num, den] = tfdata (inv (ss (sys)), "tfpoly"); sys.num = num; sys.den = den; endif endfunction control/inst/@tf/__sys_prune__.m0000644000076500000240000000225612273411257016240 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Submodel extraction and reordering for TF objects. ## This file is part of the Model Abstraction Layer. ## For internal use only. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.1 function sys = __sys_prune__ (sys, out_idx, in_idx) [sys.lti, out_idx, in_idx] = __lti_prune__ (sys.lti, out_idx, in_idx); sys.num = sys.num(out_idx, in_idx); sys.den = sys.den(out_idx, in_idx); endfunction control/inst/@tf/__transpose__.m0000644000076500000240000000174712273411257016233 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Transpose of TF models. ## Author: Lukas Reichlin ## Created: February 2010 ## Version: 0.1 function sys = __transpose__ (sys) num = sys.num; den = sys.den; sys.num = num.'; sys.den = den.'; endfunction control/inst/@tf/__zero__.m0000644000076500000240000000232212273411257015162 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Transmission zeros of TF object. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.3 function [zer, gain, info] = __zero__ (sys) if (issiso (sys)) num = get (sys.num{1}); den = get (sys.den{1}); zer = roots (num); gain = num(1) / den(1); info = []; else warning ("tf: zero: converting to minimal state-space for zero computation of mimo tf"); [zer, gain, info] = zero (ss (sys)); endif endfunction control/inst/@tf/display.m0000644000076500000240000000537412273411257015066 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Display routine for TF objects. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.4 function display (sys) sysname = inputname (1); [inname, outname, tsam] = __lti_data__ (sys.lti); [inname, m] = __labels__ (inname, "u"); [outname, p] = __labels__ (outname, "y"); disp (""); if (sys.inv && ! isct (sys)) [num, den] = filtdata (sys); else num = sys.num; den = sys.den; endif for nu = 1 : m disp (["Transfer function '", sysname, "' from input '", inname{nu}, "' to output ..."]); disp (""); for ny = 1 : p __disp_frac__ (num{ny, nu}, den{ny, nu}, sys.tfvar, outname{ny}); endfor endfor display (sys.lti); # display sampling time if (tsam == -2) disp ("Static gain."); elseif (tsam == 0) disp ("Continuous-time model."); else disp ("Discrete-time model."); endif endfunction function __disp_frac__ (num, den, tfvar, name) MAX_LEN = 12; # max length of output name tfp = isa (num, "tfpoly"); if (num == tfpoly (0)) str = [" ", name, ": 0"]; elseif ((tfp && den == 1) || (! tfp && isequal (den, 1))) ## elseif (den == tfpoly (1)) doesn't work because it ## would mistakingly accept non-tfpoly denominators like [0, 1] str = [" ", name, ": "]; numstr = tfpoly2str (num, tfvar); str = [str, numstr]; ##elseif (length (den) == 1) # de-comment for non-development use ## str = [" ", name, ": "]; ## num = num * (1/get (den)); ## numstr = tfpoly2str (num, tfvar); ## str = [str, numstr]; else numstr = tfpoly2str (num, tfvar); denstr = tfpoly2str (den, tfvar); fracstr = repmat ("-", 1, max (length (numstr), length (denstr))); str = strjust (strvcat (numstr, fracstr, denstr), "center"); namestr = name(:, 1 : min (MAX_LEN, end)); namestr = [namestr, ": "]; namestr = strjust (strvcat (" ", namestr, " "), "left"); namestr = horzcat (repmat (" ", 3, 1), namestr); str = [namestr, str]; endif disp (str); disp (""); endfunction control/inst/@tf/tf.m0000644000076500000240000002037012273411257014023 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{s} =} tf (@var{'s'}) ## @deftypefnx {Function File} {@var{z} =} tf (@var{'z'}, @var{tsam}) ## @deftypefnx {Function File} {@var{sys} =} tf (@var{sys}) ## @deftypefnx {Function File} {@var{sys} =} tf (@var{num}, @var{den}, @dots{}) ## @deftypefnx {Function File} {@var{sys} =} tf (@var{num}, @var{den}, @var{tsam}, @dots{}) ## Create or convert to transfer function model. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model to be converted to transfer function. ## @item num ## Numerator or cell of numerators. Each numerator must be a row vector ## containing the coefficients of the polynomial in descending powers of ## the transfer function variable. ## num@{i,j@} contains the numerator polynomial from input j to output i. ## In the SISO case, a single vector is accepted as well. ## @item den ## Denominator or cell of denominators. Each denominator must be a row vector ## containing the coefficients of the polynomial in descending powers of ## the transfer function variable. ## den@{i,j@} contains the denominator polynomial from input j to output i. ## In the SISO case, a single vector is accepted as well. ## @item tsam ## Sampling time in seconds. If @var{tsam} is not specified, a continuous-time ## model is assumed. ## @item @dots{} ## Optional pairs of properties and values. ## Type @command{set (tf)} for more information. ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## Transfer function model. ## @end table ## ## @strong{Option Keys and Values} ## @table @var ## @item 'num' ## Numerator. See 'Inputs' for details. ## ## @item 'den' ## Denominator. See 'Inputs' for details. ## ## @item 'tfvar' ## String containing the transfer function variable. ## ## @item 'inv' ## Logical. True for negative powers of the transfer function variable. ## ## @item 'tsam' ## Sampling time. See 'Inputs' for details. ## ## @item 'inname' ## The name of the input channels in @var{sys}. ## Cell vector of length m containing strings. ## Default names are @code{@{'u1', 'u2', ...@}} ## ## @item 'outname' ## The name of the output channels in @var{sys}. ## Cell vector of length p containing strings. ## Default names are @code{@{'y1', 'y2', ...@}} ## ## @item 'ingroup' ## Struct with input group names as field names and ## vectors of input indices as field values. ## Default is an empty struct. ## ## @item 'outgroup' ## Struct with output group names as field names and ## vectors of output indices as field values. ## Default is an empty struct. ## ## @item 'name' ## String containing the name of the model. ## ## @item 'notes' ## String or cell of string containing comments. ## ## @item 'userdata' ## Any data type. ## @end table ## ## @strong{Example} ## @example ## @group ## octave:1> s = tf ('s'); ## octave:2> G = 1/(s+1) ## ## Transfer function 'G' from input 'u1' to output ... ## ## 1 ## y1: ----- ## s + 1 ## ## Continuous-time model. ## @end group ## @end example ## @example ## @group ## octave:3> z = tf ('z', 0.2); ## octave:4> H = 0.095/(z-0.9) ## ## Transfer function 'H' from input 'u1' to output ... ## ## 0.095 ## y1: ------- ## z - 0.9 ## ## Sampling time: 0.2 s ## Discrete-time model. ## @end group ## @end example ## @example ## @group ## octave:5> num = @{[1, 5, 7], [1]; [1, 7], [1, 5, 5]@}; ## octave:6> den = @{[1, 5, 6], [1, 2]; [1, 8, 6], [1, 3, 2]@}; ## octave:7> sys = tf (num, den) ## @end group ## @end example ## ## @example ## @group ## Transfer function 'sys' from input 'u1' to output ... ## ## s^2 + 5 s + 7 ## y1: ------------- ## s^2 + 5 s + 6 ## ## s + 7 ## y2: ------------- ## s^2 + 8 s + 6 ## @end group ## @end example ## ## @example ## @group ## Transfer function 'sys' from input 'u2' to output ... ## ## 1 ## y1: ----- ## s + 2 ## ## s^2 + 5 s + 5 ## y2: ------------- ## s^2 + 3 s + 2 ## ## Continuous-time model. ## octave:8> ## @end group ## @end example ## ## @seealso{filt, ss, dss} ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.3 function sys = tf (num = {}, den = {}, varargin) ## model precedence: frd > ss > zpk > tf > double ## inferiorto ("frd", "ss", "zpk"); # error if de-commented. bug in octave? superiorto ("double"); argc = 0; # initialize argument count switch (nargin) case 0 # sys = tf () tsam = -2; # undefined sampling time tfvar = "x"; # undefined transfer function variable case 1 if (isa (num, "tf")) # already in tf form sys = tf (tfsys) sys = num; return; elseif (isa (num, "lti")) # another lti object sys = tf (sys) [sys, numlti] = __sys2tf__ (num); sys.lti = numlti; # preserve lti properties return; elseif (is_real_matrix (num)) # static gain sys = tf (4), sys = tf (matrix) num = num2cell (num); num = __vec2tfpoly__ (num); [p, m] = size (num); den = tfpolyones (p, m); # denominators are all 1 tsam = -2; # undefined sampling time tfvar = "x"; # undefined transfer function variable elseif (ischar (num)) # s = tf ("s") tfvar = num; num = __vec2tfpoly__ ([1, 0]); den = __vec2tfpoly__ ([1]); tsam = 0; else print_usage (); endif case 2 if (ischar (num) && issample (den, -1)) # z = tf ("z", 0.3) tfvar = num; tsam = den; num = __vec2tfpoly__ ([1, 0]); den = __vec2tfpoly__ ([1]); else # sys = tf (num, den) num = __vec2tfpoly__ (num); den = __vec2tfpoly__ (den); tfvar = "s"; tsam = 0; endif otherwise # default case sys = tf (num, den, ...) num = __vec2tfpoly__ (num); den = __vec2tfpoly__ (den); argc = numel (varargin); # number of additional arguments after num and den if (issample (varargin{1}, -10)) # sys = tf (num, den, tsam, "prop1", val1, ...) tsam = varargin{1}; # sampling time, could be 0 as well argc--; # tsam is not a property-value pair if (tsam == 0) tfvar = "s"; else tfvar = "z"; endif if (argc > 0) # if there are any properties and values ... varargin = varargin(2:end); # remove tsam from property-value list endif else # sys = tf (num, den, "prop1", val1, ...) tsam = 0; # continuous-time tfvar = "s"; endif endswitch [p, m] = __tf_dim__ (num, den); # determine number of outputs and inputs tfdata = struct ("num", {num}, "den", {den}, "tfvar", tfvar, "inv", false); # struct for tf-specific data ltisys = lti (p, m, tsam); # parent class for general lti data sys = class (tfdata, "tf", ltisys); # create tf object if (argc > 0) # if there are any properties and values, ... sys = set (sys, varargin{:}); # use the general set function endif endfunction control/inst/@tfpoly/0000755000076500000240000000000012273411257014136 5ustar lukasstaffcontrol/inst/@tfpoly/__make_equally_long__.m0000644000076500000240000000222412273411257020600 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Make two polynomials equally long by adding leading zeros ## to the shorter one. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function [a, b] = __make_equally_long__ (a, b) la = length (a.poly); lb = length (b.poly); lmax = max (la, lb); a.poly = [zeros(1, lmax-la), a.poly]; b.poly = [zeros(1, lmax-lb), b.poly]; endfunction control/inst/@tfpoly/__remove_leading_zeros__.m0000644000076500000240000000223112273411257021310 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Remove leading zeros from a polynomial, except for polynomials ## which are of length 1. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.2 function p = __remove_leading_zeros__ (p) idx = find (p.poly != 0); if (isempty (idx)) p.poly = 0; else p.poly = p.poly(idx(1) : end); # p.poly(idx) would remove all zeros endif endfunction control/inst/@tfpoly/conj_ct.m0000644000076500000240000000176212273411257015741 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Conjugate of continuous-time polynomial. Replace s by -s. ## For internal use only. ## Author: Lukas Reichlin ## Created: May 2012 ## Version: 0.1 function p = conj_ct (p) p.poly(2:2:end) = -p.poly(2:2:end); endfunction control/inst/@tfpoly/conj_dt.m0000644000076500000240000000174712273411257015745 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Conjugate of discrete-time polynomial. Replace z by 1/z. ## For internal use only. ## Author: Lukas Reichlin ## Created: May 2012 ## Version: 0.1 function p = conj_dt (p) p.poly = fliplr (p.poly); endfunction control/inst/@tfpoly/display.m0000644000076500000240000000167012273411257015765 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Display routine. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function display (p) tfpoly2str (p, "s") endfunction control/inst/@tfpoly/eq.m0000644000076500000240000000202712273411257014722 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Test for equal coefficients. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function bool = eq (a, b) a = tfpoly (a); b = tfpoly (b); bool = (length (a) == length (b)) && all (a.poly == b.poly); endfunction control/inst/@tfpoly/get.m0000644000076500000240000000171412273411257015076 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Return coefficients as a row vector. For internal use only. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.1 function coeffs = get (p) coeffs = p.poly; endfunction control/inst/@tfpoly/length.m0000644000076500000240000000170312273411257015576 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Number of coefficients. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function l = length (p) l = length (p.poly); endfunction control/inst/@tfpoly/minus.m0000644000076500000240000000222112273411257015444 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Subtraction of two polynomials. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function a = minus (a, b) if (! isa (a, "tfpoly")) a = tfpoly (a); endif if (! isa (b, "tfpoly")) b = tfpoly (b); endif [a, b] = __make_equally_long__ (a, b); a.poly = a.poly - b.poly; a = __remove_leading_zeros__ (a); endfunction control/inst/@tfpoly/mpower.m0000644000076500000240000000242412273411257015627 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Power of a polynomial. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function p = mpower (a, b) if (! isa (b, "double") && ! is_real_scalar (b)) error ("tfpoly: mpower: power must be a natural number"); endif c = uint64 (b); if (c != b) error ("tfpoly: mpower: power must be a positive integer"); endif if (c == 0) p = tfpoly (1); return; endif p = a; for k = 1 : (c-1) p.poly = conv (p.poly, a.poly); endfor endfunction control/inst/@tfpoly/mtimes.m0000644000076500000240000000211412273411257015610 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Multiplication of two polynomials. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function a = mtimes (a, b) if (! isa (a, "tfpoly")) a = tfpoly (a); endif if (! isa (b, "tfpoly")) b = tfpoly (b); endif a.poly = conv (a.poly, b.poly); endfunction control/inst/@tfpoly/ne.m0000644000076500000240000000204412273411257014716 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Return true if polynomials are not equal. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function bool = ne (a, b) a = tfpoly (a); b = tfpoly (b); bool = (length (a) != length (b)) || any (a.poly != b.poly); endfunction control/inst/@tfpoly/numel.m0000644000076500000240000000170112273411257015433 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Number of coefficients. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function n = numel (p) n = numel (p.poly); endfunction control/inst/@tfpoly/plus.m0000644000076500000240000000221512273411257015277 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Addition of two polynomials. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function a = plus (a, b) if (! isa (a, "tfpoly")) a = tfpoly (a); endif if (! isa (b, "tfpoly")) b = tfpoly (b); endif [a, b] = __make_equally_long__ (a, b); a.poly = a.poly + b.poly; a = __remove_leading_zeros__ (a); endfunction control/inst/@tfpoly/roots.m0000644000076500000240000000166512273411257015472 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Compute the roots of a TFPOLY object. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.1 function r = roots (p) r = roots (p.poly); endfunction control/inst/@tfpoly/subsref.m0000644000076500000240000000237712273411257015776 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Evaluate polynomial. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function b = subsref (a, s) if (isempty (s)) error ("tfpoly: missing index"); endif switch (s(1).type) case "()" idx = s(1).subs; if (numel (idx) == 1) b = polyval (a.poly, idx{1}); else error ("tfpoly: need exactly one index"); endif otherwise error ("tfpoly: invalid subscript type"); endswitch endfunction control/inst/@tfpoly/tfpoly.m0000644000076500000240000000257112273411257015636 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Class constructor. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.2 function p = tfpoly (a) superiorto ("double"); switch (nargin) case 0 p = struct ("poly", []); p = class (p, "tfpoly"); case 1 if (isa (a, "tfpoly")) p = a; return; elseif (is_real_vector (a)) p.poly = reshape (a, 1, []); p = class (p, "tfpoly"); p = __remove_leading_zeros__ (p); else error ("tfpoly: argument must be a real vector"); endif otherwise print_usage (); endswitch endfunction control/inst/@tfpoly/tfpoly2str.m0000644000076500000240000000473012273411257016450 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{str} =} tfpoly2str (@var{p}) ## @deftypefnx {Function File} {@var{str} =} tfpoly2str (@var{p}, @var{tfvar}) ## Return the string of a polynomial with string @var{tfvar} as variable. ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function str = tfpoly2str (p, tfvar = "x") str = ""; lp = numel (p.poly); if (lp > 0) ## first element (highest order) a = p.poly(1); if (a < 0) cs = "-"; else cs = ""; endif if (lp == 1) str = [cs, num2str(abs (a), 4)]; else if (abs (a) == 1) str = [cs, __variable__(tfvar, lp-1)]; else str = [cs, __coefficient__(a), " ", __variable__(tfvar, lp-1)]; endif endif if (lp > 1) ## elements in the middle for k = 2 : lp-1 a = p.poly(k); if (a != 0) if (a < 0) cs = " - "; else cs = " + "; endif if (abs (a) == 1) str = [str, cs, __variable__(tfvar, lp-k)]; else str = [str, cs, __coefficient__(a), " ", __variable__(tfvar, lp-k)]; endif endif endfor ## last element (lowest order) a = p.poly(lp); if (a != 0) if (a < 0) cs = " - "; else cs = " + "; endif str = [str, cs, num2str(abs (a), 4)]; endif endif endif endfunction function str = __coefficient__ (a) b = abs (a); if (b == 1) str = ""; else str = num2str (b, 4); endif endfunction function str = __variable__ (tfvar, n) if (n == 1) str = tfvar; else str = [tfvar, "^", num2str(n)]; endif endfunction control/inst/@tfpoly/uminus.m0000644000076500000240000000170012273411257015632 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Unitary minus operator. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function a = uminus (a) a.poly = -a.poly; endfunction control/inst/@tfpoly/uplus.m0000644000076500000240000000167612273411257015476 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Unitary plus operator. For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function a = uplus (a) a.poly = +a.poly; endfunction control/inst/__adjust_frd_data__.m0000644000076500000240000000322612273411257016614 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Common code for adjusting FRD model data. ## Used by @frd/frd.m and @frd/__set__.m ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.1 function [H, w] = __adjust_frd_data__ (H, w); w = reshape (w, [], 1); lw = length (w); if (ndims (H) != 3 && ! isempty (H)) if (isscalar (H)) H = reshape (H, 1, 1, []); if (lw > 1) H = repmat (H, [1, 1, lw]); # needed for "frd1 + scalar2" or "scalar1 * frd2) endif elseif (isvector (H) && length (H) == lw) # SISO system (H is a vector) H = reshape (H, 1, 1, []); elseif (ismatrix (H)) H = reshape (H, rows (H), []); if (lw > 1) H = repmat (H, [1, 1, lw]); # needed for "frd1 + matrix2" or "matrix1 * frd2) endif else error ("frd: first argument H invalid"); endif elseif (isempty (H)) H = zeros (0, 0, 0); endif endfunction control/inst/__adjust_iddata__.m0000644000076500000240000000212212273411257016270 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## Author: Lukas Reichlin ## Created: February 2012 ## Version: 0.1 function [y, u] = __adjust_iddata__ (y, u) if (iscell (y)) y = reshape (y, [], 1); else y = {y}; endif if (isempty (u)) u = {}; # avoid [](nx0) and the like elseif (iscell (u)) u = reshape (u, [], 1); else u = {u}; endif endfunction control/inst/__adjust_iddata_tsam__.m0000644000076500000240000000302012273411257017312 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Check whether tsam is a e-by-1 cell array of valid sampling times. ## If not, it tries to convert tsam accordingly. ## Empty tsam are filled with default value -1. ## Author: Lukas Reichlin ## Created: February 2012 ## Version: 0.1 function tsam = __adjust_iddata_tsam__ (tsam, e) if (isempty (tsam)) tsam = num2cell (-ones (e, 1)); elseif (iscell (tsam)) tsam = reshape (tsam, [], 1); else tsam = {tsam}; endif tmp = cellfun (@issample, tsam, {-1}); if (any (! tmp)) error ("iddata: invalid sampling time"); endif nt = numel (tsam); if (nt == 1 && e > 1) tsam = repmat (tsam, e, 1); elseif (nt != e) error ("iddata: there are %d experiments, but only %d sampling times", ... e, nt); endif endfunction control/inst/__adjust_labels__.m0000644000076500000240000000245712273411257016317 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Check whether a cell contains the required number of strings. ## Used by set and __set__. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.3 function name = __adjust_labels__ (name, req_len) if (iscell (name)) name = reshape (name, [], 1); else # catch the siso case, name = {name}; # e.g. sys = set (sys, "inname", "u_1") endif if (! iscellstr (name) || numel (name) != req_len) error ("lti: set: cell must contain %d strings", req_len); endif endfunction control/inst/__adjust_ss_data__.m0000644000076500000240000000312612273411257016465 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Common code for adjusting SS model data. ## Used by @ss/ss.m, others possibly follow. ## Author: Lukas Reichlin ## Created: October 2010 ## Version: 0.2 function [a, b, c, d, tsam] = __adjust_ss_data__ (a, b, c, d, tsam); if (isempty (a)) # static system a = []; # avoid [](nx0) or [](0xn) tsam = -2; endif if (isempty (d)) if (all (size (c) == 0)) # ss (a, b), ss (a, b, [], [], ...), but allow c(0xn) and d(0xm) c = eye (size (a)); d = zeros (rows (a), columns (b)); else # ss (a, b, c), ss (a, b, c, [], ...) d = zeros (rows (c), columns (b)); endif endif if (isempty (b) && isempty (c)) # sys = ss ([], [], [], d) b = zeros (0, columns (d)); c = zeros (rows(d), 0); tsam = -2; endif endfunction control/inst/__axis_limits__.m0000644000076500000240000000426712273411257016031 0ustar lukasstaff## Copyright (C) 1998, 2000, 2004, 2005, 2007 ## Auburn University. All rights reserved. ## ## ## 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; see the file COPYING. If not, see ## . ## -*- texinfo -*- ## @deftypefn {Function File} {} __axis_limits__ (@var{axdata}) ## Determine axis limits for 2-D data (column vectors); leaves a 10% ## margin around the plots. ## Inserts margins of +/- 0.1 if data is one-dimensional ## (or a single point). ## ## @strong{Input} ## @table @var ## @item axdata ## @var{n} by 2 matrix of data [@var{x}, @var{y}]. ## @end table ## ## @strong{Output} ## @table @var ## @item axvec ## Vector of axis limits appropriate for call to @command{axis} function. ## @end table ## @end deftypefn function axvec = __axis_limits__ (axdata) if (nargin < 1 || isempty (axdata)) axdata = 0; endif ## compute axis limits minv = min (axdata); maxv = max (axdata); delv = (maxv-minv)/2; # breadth of the plot midv = (minv + maxv)/2; # midpoint of the plot axmid = [midv(1), midv(1), midv(2), midv(2)]; axdel = [-0.1, 0.1, -0.1, 0.1]; # default plot width (if less than 2-d data) if (max (delv) == 0) if (midv(1) != 0) axdel(1:2) = [-0.1*midv(1), 0.1*midv(1)]; endif if (midv(2) != 0) axdel(3:4) = [-0.1*midv(2), 0.1*midv(2)]; endif else ## they're at least one-dimensional tolv = max(1e-8, 1e-8*abs(midv)); if (abs (delv(1)) >= tolv(1)) axdel(1:2) = 1.1*[-delv(1),delv(1)]; endif if (abs (delv(2)) >= tolv(2)) axdel(3:4) = 1.1*[-delv(2),delv(2)]; endif endif axvec = axmid + axdel; endfunction control/inst/__axis_margin__.m0000644000076500000240000000362412273411257016001 0ustar lukasstaff## Copyright (C) 1998, 2000, 2004, 2005, 2007 ## Auburn University. All rights reserved. ## ## ## 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; see the file COPYING. If not, see ## . ## -*- texinfo -*- ## @deftypefn {Function File} {} __axis_margin__ (@var{axdata}) ## Determine axis limits for 2-D data (column vectors); leaves a 10% ## margin around the plots. ## Inserts margins of +/- 0.1 if data is one-dimensional ## (or a single point). ## ## @strong{Input} ## @table @var ## @item axdata ## @var{n} by 2 matrix of data [@var{x}, @var{y}]. ## @end table ## ## @strong{Output} ## @table @var ## @item axvec ## Vector of axis limits appropriate for call to @command{axis} function. ## @end table ## @end deftypefn function axvec = __axis_margin__ (axdata) ## compute axis limits minv = axdata(1); maxv = axdata(2); delv = (maxv-minv)/2; # breadth of the plot midv = (minv + maxv)/2; # midpoint of the plot axmid = [midv, midv]; axdel = [-0.1, 0.1]; # default plot width (if less than 2-d data) if (delv == 0) if (midv != 0) axdel = [-0.1*midv, 0.1*midv]; endif else ## they're at least one-dimensional tolv = max(1e-8, 1e-8*abs(midv)); if (abs (delv) >= tolv) axdel = 1.1*[-delv,delv]; endif endif axvec = axmid + axdel; endfunction control/inst/__conred_check_feedback_sign__.m0000644000076500000240000000231712273411257020731 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## check the feedback sign. ## Author: Lukas Reichlin ## Created: December 2011 ## Version: 0.1 function negfb = __conred_check_feedback_sign__ (fbsign, key = "feedback") if (! ischar (fbsign)) error ("conred: key '%s' requires string value", key); endif switch (fbsign) case "+" negfb = false; case "-" negfb = true; otherwise error ("conred: key '%s' has an invalid value", key); endswitch endfunction control/inst/__conred_sb16ad__.m0000644000076500000240000001351312273411257016110 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{Kr}, @var{info}] =} __conred_sb16ad__ (@var{method}, @dots{}) ## Backend for btaconred and spaconred. ## @end deftypefn ## Author: Lukas Reichlin ## Created: December 2011 ## Version: 0.1 function [Kr, info] = __conred_sb16ad__ (method, varargin) if (nargin < 3) print_usage (); endif if (method != "bta" && method != "spa") error ("modred: invalid method"); endif G = varargin{1}; K = varargin{2}; varargin = varargin(3:end); if (! isa (G, "lti")) error ("%sconred: first argument must be an LTI system", method); endif if (! isa (K, "lti")) error ("%sconred: second argument must be an LTI system", method); endif if (nargin > 3) # *conred (G, K, ...) if (is_real_scalar (varargin{1})) # *conred (G, K, nr) varargin = horzcat (varargin(2:end), {"order"}, varargin(1)); endif if (isstruct (varargin{1})) # *conred (G, K, opt, ...), *conred (G, K, nr, opt, ...) varargin = horzcat (__opt2cell__ (varargin{1}), varargin(2:end)); endif ## order placed at the end such that nr from *conred (G, K, nr, ...) ## and *conred (G, K, nr, opt, ...) overrides possible nr's from ## key/value-pairs and inside opt struct (later keys override former keys, ## nr > key/value > opt) endif nkv = numel (varargin); # number of keys and values if (rem (nkv, 2)) error ("%sconred: keys and values must come in pairs", method); endif [a, b, c, d, tsam, scaled] = ssdata (G); [ac, bc, cc, dc, tsamc, scaledc] = ssdata (K); [p, m] = size (G); [pc, mc] = size (K); dt = isdt (G); if (p != mc || m != pc) error ("%sconred: dimensions of controller (%dx%d) and plant (%dx%d) don't match", ... method, pc, mc, p, c); endif ## default arguments alpha = __modred_default_alpha__ (dt); tol1 = 0.0; tol2 = 0.0; jobc = jobo = 0; bf = true; # balancing-free weight = 3; equil = scaled && scaledc; ordsel = 1; ncr = 0; negfb = false; # positive feedback controller ## handle keys and values for k = 1 : 2 : nkv key = lower (varargin{k}); val = varargin{k+1}; switch (key) case "weight" switch (lower (val(1))) case "n" # none weight = 0; case {"l", "o"} # left, output weight = 1; case {"r", "i"} # right, input weight = 2; case {"b", "p"} # both, performance weight = 3; otherwise error ("%sconred: '%s' is an invalid value for key weight", method, val); endswitch case {"order", "ncr", "nr"} [ncr, ordsel] = __modred_check_order__ (val, rows (ac)); case "tol1" tol1 = __modred_check_tol__ (val, "tol1"); case "tol2" tol2 = __modred_check_tol__ (val, "tol2"); case "alpha" alpha = __modred_check_alpha__ (val, dt); case "method" switch (tolower (val)) case "sr" bf = false; case "bfsr" bf = true; otherwise error ("modred: '%s' is an invalid approach", val); endswitch case {"jobc", "gram-ctrb"} jobc = __modred_check_gram__ (val, "gram-ctrb"); case {"jobo", "gram-obsv"} jobo = __modred_check_gram__ (val, "gram-obsv"); case {"equil", "equilibrate", "equilibration", "scale", "scaling"} scaled = __modred_check_equil__ (val); case "feedback" negfb = __conred_check_feedback_sign__ (val); otherwise warning ("%sconred: invalid property name '%s' ignored", method, key); endswitch endfor ## handle model reduction approach if (method == "bta" && ! bf) # 'B': use the square-root Balance & Truncate method jobmr = 0; elseif (method == "bta" && bf) # 'F': use the balancing-free square-root Balance & Truncate method jobmr = 1; elseif (method == "spa" && ! bf) # 'S': use the square-root Singular Perturbation Approximation method jobmr = 2; elseif (method == "spa" && bf) # 'P': use the balancing-free square-root Singular Perturbation Approximation method jobmr = 3; else error ("%smodred: invalid jobmr option"); # this should never happen endif ## handle negative feedback controllers if (negfb) [ac, bc, cc, dc] = ssdata (-K); endif ## perform model order reduction [acr, bcr, ccr, dcr, ncr, hsvc, ncs] = __sl_sb16ad__ (a, b, c, d, dt, equil, ncr, ordsel, alpha, jobmr, ... ac, bc, cc, dc, ... weight, jobc, jobo, tol1, tol2); ## assemble reduced order controller Kr = ss (acr, bcr, ccr, dcr, tsamc); ## handle negative feedback controllers if (negfb) Kr = -Kr; endif ## assemble info struct info = struct ("ncr", ncr, "ncs", ncs, "hsvc", hsvc); endfunction control/inst/__dss2ss__.m0000644000076500000240000000663012273411257014721 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Convert descriptor state-space system into regular state-space form. ## Author: Lukas Reichlin ## Created: September 2011 ## Version: 0.2 function [a, b, c, d, e] = __dss2ss__ (a, b, c, d, e) if (isempty (e)) return; elseif (rcond (e) < eps) # check for singularity ## check whether regular state-space representation is possible [~, ~, ~, ~, ranke, rnka22] = __sl_tg01fd__ (a, e, b, c, false, 0); if (ranke+rnka22 < rows (a)) error ("ss: dss2ss: this descriptor system cannot be converted to regular state-space form"); endif endif [a, b, c, d] = __sl_sb10jd__ (a, b, c, d, e); e = []; endfunction ## Test from SLICOT TG01FD %!shared a, b, c, e, ranke, rnka22, q, z, a_exp, b_exp, c_exp, e_exp, q_exp, z_exp %! %! e = [1, 2, 0, 0; 0, 1, 0, 1; 3, 9, 6, 3; 0, 0, 2, 0]; %! a = [-1, 0, 0, 3; 0, 0, 1, 2; 1, 1, 0, 4; 0, 0, 0, 0]; %! b = [1, 0; 0, 0; 0, 1; 1, 1]; %! c = [-1, 0, 1, 0; 0, 1, -1, 1]; %! %! [a, e, b, c, ranke, rnka22, q, z] = __sl_tg01fd__ (a, e, b, c, true, 0.0); %! %! e_exp = [10.1587 5.8230 1.3021 0.0000; %! 0.0000 -2.4684 -0.1896 0.0000; %! 0.0000 0.0000 1.0338 0.0000; %! 0.0000 0.0000 0.0000 0.0000]; %! %! a_exp = [ 2.0278 0.1078 3.9062 -2.1571; %! -0.0980 0.2544 1.6053 -0.1269; %! 0.2713 0.7760 -0.3692 -0.4853; %! 0.0690 -0.5669 -2.1974 0.3086]; %! %! b_exp = [-0.2157 -0.9705; %! 0.3015 0.9516; %! 0.7595 0.0991; %! 1.1339 0.3780]; %! %! c_exp = [ 0.3651 -1.0000 -0.4472 -0.8165; %! -1.0954 1.0000 -0.8944 0.0000]; %! %! q_exp = [-0.2157 -0.5088 0.6109 0.5669; %! -0.1078 -0.2544 -0.7760 0.5669; %! -0.9705 0.1413 -0.0495 -0.1890; %! 0.0000 0.8102 0.1486 0.5669]; %! %! z_exp = [-0.3651 0.0000 0.4472 0.8165; %! -0.9129 0.0000 0.0000 -0.4082; %! 0.0000 -1.0000 0.0000 0.0000; %! -0.1826 0.0000 -0.8944 0.4082]; %! %!assert (a, a_exp, 1e-4); %!assert (e, e_exp, 1e-4); %!assert (b, b_exp, 1e-4); %!assert (c, c_exp, 1e-4); %!assert (q, q_exp, 1e-4); %!assert (z, z_exp, 1e-4); %!assert (ranke, 3); %!assert (rnka22, 1); ## test error %!shared mms %! %! mm = tf([3, 5, 0], [4, 1]); %! mms = ss (mm); %!error (__dss2ss__ (mms.a, mms.b, mms.c, mms.d, mms.e)); ## Realizable descriptor system with singular E matrix %!test %! A = [1 0; 0 1]; %! B = [1; 0]; %! C = [1 0]; %! D = 0; %! E = [1 0; 0 0]; %! %! sys = dss (A, B, C, D, E); %! [Ao, Bo, Co, Do] = ssdata (sys); %! %! assert (Ao, 1, 1e-4); %! assert (Bo, 1, 1e-4); %! assert (Co, 1, 1e-4); %! assert (Do, 0, 1e-4); control/inst/__dss_bilin__.m0000644000076500000240000000460312273411257015444 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## 1. Discrete -> continuous ## _ ## E = alpha*E + A ## _ ## A = beta (A - alpha*E) ## _ ## B = sqrt(2*alpha*beta) * B ## _ -1 ## C = sqrt(2*alpha*beta) * C * (alpha*E + A) * E ## _ -1 ## D = D - C * (alpha*E + A) * B ## ## ## 2. Continuous -> discrete ## _ ## E = beta*E - A ## _ ## A = alpha (beta*E + A) ## _ ## B = sqrt(2*alpha*beta) * B ## _ -1 ## C = sqrt(2*alpha*beta) * C * (beta*E - A) * E ## _ -1 ## D = D + C * (beta*E - A) * B ## Special thanks to Andras Varga for the formulae. ## Author: Lukas Reichlin ## Created: October 2011 ## Version: 0.1 function [Ar, Br, Cr, Dr, Er] = __dss_bilin__ (A, B, C, D, E, beta, discrete) if (discrete) EpA = E + A; s2b = sqrt (2*beta); if (rcond (EpA) < eps) error ("d2c: E+A singular"); endif CiEpA = C / EpA; Er = EpA; Ar = beta * (A - E); Br = s2b * B; Cr = s2b * CiEpA * E; Dr = D - CiEpA * B; ## Er = E + A; ## Ar = beta * (A - E); ## Br = sqrt (2*beta) * B; ## Cr = sqrt (2*beta) * C / (E + A) * E; ## Dr = D - C / (E + A) * B; else bEmA = beta*E - A; s2b = sqrt (2*beta); if (rcond (bEmA) < eps) error ("c2d: beta*E-A singular"); endif CibEmA = C / bEmA; Er = bEmA; Ar = beta*E + A; Br = s2b * B; Cr = s2b * CibEmA * E; Dr = D + CibEmA * B; ## Er = beta*E - A; ## Ar = beta*E + A; ## Br = sqrt (2*beta) * B; ## Cr = sqrt (2*beta) * C / (beta*E - A) * E; ## Dr = D + C / (beta*E - A) * B; endif endfunction control/inst/__frd_dim__.m0000644000076500000240000000300112273411257015071 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Number of outputs and inputs of transfer function numerator and ## denominator. For internal use only. ## Author: Lukas Reichlin ## Created: February 2010 ## Version: 0.1 function [p, m, l] = __frd_dim__ (H, w) if (! isnumeric (H)) error ("frd: H must be a 3-dimensional numeric array"); endif lw = length (w); if (! isempty (w) && (! is_real_vector (w) || any (w < 0) ... || ! issorted (w) || w(1) > w(end) ... || length (unique (w)) != lw)) error ("frd: w must be a vector of positive real numbers in ascending order"); endif [p, m, l] = size (H); if (l != lw) error ("frd: H (%dx%dx%d) and w (%d) must have equal length", p, m, l, lw); endif endfunction control/inst/__frequency_response__.m0000644000076500000240000000552712273411257017423 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Return frequency response H and frequency vector w. ## If w is empty, it will be calculated by __frequency_vector__. ## Author: Lukas Reichlin ## Created: November 2009 ## Version: 0.5 function [H, w] = __frequency_response__ (args, mimoflag = false, wbounds = "std", cellflag = false) isc = iscell (args); if (! isc) args = {args}; endif sys_idx = cellfun (@isa, args, {"lti"}); # look for LTI models w_idx = cellfun (@(x) is_real_vector (x) && length (x) > 1, args); # look for frequency vectors r_idx = cellfun (@iscell, args); # look for frequency ranges {wmin, wmax} sys_cell = args(sys_idx); # extract LTI models frd_idx = cellfun (@isa, sys_cell, {"frd"}); # look for FRD models ## check arguments if (! mimoflag && ! all (cellfun (@issiso, sys_cell))) error ("frequency_response: require SISO systems"); endif ## determine frequencies if (any (r_idx)) # if there are frequency ranges r = args(r_idx){end}; # take the last one if (numel (r) == 2 && issample (r{1}) && issample (r{2})) w = __frequency_vector__ (sys_cell, wbounds, r{1}, r{2}); else error ("frequency_response: invalid cell"); endif elseif (any (w_idx)) # are there any frequency vectors? w = args(w_idx){end}; w = repmat ({w}, 1, numel (sys_cell)); else # there are neither frequency ranges nor vectors w = __frequency_vector__ (sys_cell, wbounds); endif w_frd = w(frd_idx); # temporarily save frequency vectors of FRD models w(frd_idx) = {[]}; # freqresp returns all frequencies of FRD models for w=[] ## compute frequency response H for all LTI models H = cellfun (@__freqresp__, sys_cell, w, {cellflag}, "uniformoutput", false); ## restore frequency vectors of FRD models in w w(frd_idx) = w_frd; if (! isc) # for old non-multiplot functions H = H{1}; w = w{1}; endif endfunction control/inst/__frequency_vector__.m0000644000076500000240000001331412273411257017060 0ustar lukasstaff## Copyright (C) 1996, 2000, 2004, 2005, 2006, 2007 ## Auburn University. All rights reserved. ## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## 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; see the file COPYING. If not, see ## . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{w} =} __frequency_vector__ (@var{sys}) ## Get default range of frequencies based on cutoff frequencies of system ## poles and zeros. ## Frequency range is the interval ## @iftex ## @tex ## $ [ 10^{w_{min}}, 10^{w_{max}} ] $ ## @end tex ## @end iftex ## @ifnottex ## [10^@var{wmin}, 10^@var{wmax}] ## @end ifnottex ## ## Used by @command{__frequency_response__} ## @end deftypefn ## Adapted-By: Lukas Reichlin ## Date: October 2009 ## Version: 0.4 function w = __frequency_vector__ (sys_cell, wbounds = "std", wmin, wmax) isc = iscell (sys_cell); if (! isc) # __sys2frd__ methods pass LTI models not in cells sys_cell = {sys_cell}; endif idx = cellfun (@(x) isa (x, "lti"), sys_cell); sys_cell = sys_cell(idx); len = numel (sys_cell); [dec_min, dec_max, zp] = cellfun (@__frequency_range__, sys_cell, {wbounds}, "uniformoutput", false); if (strcmpi (wbounds, "std")) # plots with explicit frequencies if (nargin == 4) # w = {wmin, wmax} dec_min = log10 (wmin); dec_max = log10 (wmax); else dec_min = min (cell2mat (dec_min)); dec_max = max (cell2mat (dec_max)); endif zp = horzcat (zp{:}); ## include zeros and poles for nice peaks in plots idx = find (zp > 10^dec_min & zp < 10^dec_max); zp = zp(idx); w = logspace (dec_min, dec_max, 500); w = unique ([w, zp]); # unique also sorts frequency vector w = repmat ({w}, 1, len); # return cell of frequency vectors elseif (strcmpi (wbounds, "ext")) # plots with implicit frequencies if (nargin == 4) dec_min = repmat ({log10 (wmin)}, 1, len); dec_max = repmat ({log10 (wmax)}, 1, len); endif idx = cellfun (@(zp, dec_min, dec_max) find (zp > 10^dec_min & zp < 10^dec_max), ... zp, dec_min, dec_max, "uniformoutput", false); zp = cellfun (@(zp, idx) zp(idx), zp, idx, "uniformoutput", false); w = cellfun (@logspace, dec_min, dec_max, {500}, "uniformoutput", false); w = cellfun (@(w, zp) unique ([w, zp]), w, zp, "uniformoutput", false); ## unique also sorts frequency vector else error ("frequency_vector: invalid argument 'wbounds'"); endif if (! isc) # for __sys2frd__ methods w = w{1}; endif endfunction function [dec_min, dec_max, zp] = __frequency_range__ (sys, wbounds = "std") if (isa (sys, "frd")) w = get (sys, "w"); dec_min = log10 (w(1)); dec_max = log10 (w(end)); zp = []; return; endif zer = zero (sys); pol = pole (sys); tsam = abs (get (sys, "tsam")); # tsam could be -1 discrete = ! isct (sys); # static gains (tsam = -2) are assumed continuous ## make sure zer, pol are row vectors pol = reshape (pol, 1, []); zer = reshape (zer, 1, []); ## check for natural frequencies away from omega = 0 if (discrete) ## The 2nd conditions prevents log(0) in the next log command iiz = find (abs(zer-1) > norm(zer)*eps && abs(zer) > norm(zer)*eps); iip = find (abs(pol-1) > norm(pol)*eps && abs(pol) > norm(pol)*eps); ## avoid dividing empty matrices, it would work but looks nasty if (! isempty (iiz)) czer = log (zer(iiz))/tsam; else czer = []; endif if (! isempty (iip)) cpol = log (pol(iip))/tsam; else cpol = []; endif else ## continuous iip = find (abs(pol) > norm(pol)*eps); iiz = find (abs(zer) > norm(zer)*eps); if (! isempty (zer)) czer = zer(iiz); else czer = []; endif if (! isempty (pol)) cpol = pol(iip); else cpol = []; endif endif if (isempty (iip) && isempty (iiz)) ## no poles/zeros away from omega = 0; pick defaults dec_min = 0; # -1 dec_max = 2; # 3 else dec_min = floor (log10 (min (abs ([cpol, czer])))); dec_max = ceil (log10 (max (abs ([cpol, czer])))); endif ## expand to show the entirety of the "interesting" portion of the plot switch (wbounds) case "std" # standard if (dec_min == dec_max) dec_min -= 2; dec_max += 2; else dec_min--; dec_max++; endif case "ext" # extended (for nyquist) if (any (abs (pol) < sqrt (eps))) # look for integrators ## dec_min -= 0.5; dec_max += 2; else dec_min -= 2; dec_max += 2; endif otherwise error ("frequency_range: second argument invalid"); endswitch ## run discrete frequency all the way to pi if (discrete) dec_max = log10 (pi/tsam); endif ## include zeros and poles for nice peaks in plots zp = [abs(zer), abs(pol)]; endfunction control/inst/__iddata_dim__.m0000644000076500000240000000437312273411257015561 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## Author: Lukas Reichlin ## Created: October 2011 ## Version: 0.1 function [p, m, e] = __iddata_dim__ (y, u) e = numel (y); # number of experiments if (isempty (u)) # time series data, outputs only [p, m] = cellfun (@__experiment_dim__, y, "uniformoutput", false); elseif (e == numel (u)) # outputs and inputs present [p, m] = cellfun (@__experiment_dim__, y, u, "uniformoutput", false); else error ("iddata: require input and output data with matching number of experiments"); endif if (e > 1 && ! isequal (p{:})) error ("iddata: require identical number of output channels for all experiments"); endif if (e > 1 && ! isequal (m{:})) error ("iddata: require identical number of input channels for all experiments"); endif p = p{1}; m = m{1}; endfunction function [p, m] = __experiment_dim__ (y, u = []) if (! is_matrix (y, u)) error ("iddata: inputs and outputs must be real or complex matrices"); endif [ly, p] = size (y); [lu, m] = size (u); if (! isempty (u) && ly != lu) error ("iddata: matrices 'y' (%dx%d) and 'u' (%dx%d) must have the same number of samples (rows)", ... ly, p, lu, m); endif if (ly < p) warning ("iddata:transpose", "iddata: more outputs than samples - matrice 'y' should probably be transposed"); endif if (lu < m) warning ("iddata:transpose", "iddata: more inputs than samples - matrice 'u' should probably be transposed"); endif endfunction control/inst/__is_stable__.m0000644000076500000240000000235112273411257015441 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Determine whether all poles in a vector are stable. ## Author: Lukas Reichlin ## Created: December 2010 ## Version: 0.2 function bool = __is_stable__ (pol, ct = true, tol = 0) if (! is_real_scalar (tol) || tol < 0) error ("isstable: tolerance must be a real-valued, non-negative scalar"); endif if (ct) # continuous-time bool = all (real (pol) < -tol*(1 + abs (pol))); else # discrete-time bool = all (abs (pol) < 1 - tol); endif endfunction control/inst/__labels__.m0000644000076500000240000000240112273411257014732 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Return default labels if cell "name" contains only empty strings. ## If not, check whether individual strings of the cell "name" are ## empty and mark them with "?". Used by display routines. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.3 function [name, n] = __labels__ (name, variable = "x") n = numel (name); if (n == 0 || isequal ("", name{:})) name = strseq (variable, 1:n); else idx = cellfun (@isempty, name); name(idx) = "?"; endif endfunction control/inst/__modred_ab09id__.m0000644000076500000240000001325212273411257016100 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{Gr}, @var{info}] =} __modred_ab09id__ (@var{method}, @dots{}) ## Backend for btamodred and spamodred. ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2011 ## Version: 0.1 function [Gr, info] = __modred_ab09id__ (method, varargin) if (nargin < 2) print_usage (); endif if (method != "bta" && method != "spa") error ("modred: invalid method"); endif G = varargin{1}; varargin = varargin(2:end); if (! isa (G, "lti")) error ("%smodred: first argument must be an LTI system", method); endif if (nargin > 2) # *modred (G, ...) if (is_real_scalar (varargin{1})) # *modred (G, nr) varargin = horzcat (varargin(2:end), {"order"}, varargin(1)); endif if (isstruct (varargin{1})) # *modred (G, opt, ...), *modred (G, nr, opt, ...) varargin = horzcat (__opt2cell__ (varargin{1}), varargin(2:end)); endif ## order placed at the end such that nr from *modred (G, nr, ...) ## and *modred (G, nr, opt, ...) overrides possible nr's from ## key/value-pairs and inside opt struct (later keys override former keys, ## nr > key/value > opt) endif nkv = numel (varargin); # number of keys and values if (rem (nkv, 2)) error ("%smodred: keys and values must come in pairs", method); endif [a, b, c, d, tsam, scaled] = ssdata (G); [p, m] = size (G); dt = isdt (G); ## default arguments alpha = __modred_default_alpha__ (dt); av = bv = cv = dv = []; jobv = 0; aw = bw = cw = dw = []; jobw = 0; alphac = alphao = 0.0; tol1 = 0.0; tol2 = 0.0; jobc = jobo = 0; bf = true; # balancing-free weight = 1; equil = 0; ordsel = 1; nr = 0; ## handle keys and values for k = 1 : 2 : nkv key = lower (varargin{k}); val = varargin{k+1}; switch (key) case {"left", "output", "v"} [av, bv, cv, dv, jobv] = __modred_check_weight__ (val, dt, p, []); case {"right", "input", "w"} [aw, bw, cw, dw, jobw] = __modred_check_weight__ (val, dt, [], m); case {"order", "n", "nr"} [nr, ordsel] = __modred_check_order__ (val, rows (a)); case "tol1" tol1 = __modred_check_tol__ (val, "tol1"); case "tol2" tol2 = __modred_check_tol__ (val, "tol2"); case "alpha" alpha = __modred_check_alpha__ (val, dt); case "method" switch (tolower (val)) case "sr" bf = false; case "bfsr" bf = true; otherwise error ("modred: '%s' is an invalid approach", val); endswitch case {"jobc", "gram-ctrb"} jobc = __modred_check_gram__ (val, "gram-ctrb"); case {"jobo", "gram-obsv"} jobo = __modred_check_gram__ (val, "gram-obsv"); case {"alphac", "alpha-ctrb"} alphac = __modred_check_alpha_gram__ (val, "alpha-ctrb"); case {"alphao", "alpha-obsv"} alphao = __modred_check_alpha_gram__ (val, "alpha-obsv"); case {"equil", "equilibrate", "equilibration", "scale", "scaling"} scaled = __modred_check_equil__ (val); otherwise warning ("%smodred: invalid property name '%s' ignored", method, key); endswitch endfor ## handle type of frequency weighting if (jobv && jobw) weight = 3; # 'B': both left and right weightings V and W are used elseif (jobv) weight = 1; # 'L': only left weighting V is used (W = I) elseif (jobw) weight = 2; # 'R': only right weighting W is used (V = I) else weight = 0; # 'N': no weightings are used (V = I, W = I) endif ## handle model reduction approach if (method == "bta" && ! bf) # 'B': use the square-root Balance & Truncate method job = 0; elseif (method == "bta" && bf) # 'F': use the balancing-free square-root Balance & Truncate method job = 1; elseif (method == "spa" && ! bf) # 'S': use the square-root Singular Perturbation Approximation method job = 2; elseif (method == "spa" && bf) # 'P': use the balancing-free square-root Singular Perturbation Approximation method job = 3; else error ("modred: invalid job option"); # this should never happen endif ## perform model order reduction [ar, br, cr, dr, nr, hsv, ns] = __sl_ab09id__ (a, b, c, d, dt, equil, nr, ordsel, alpha, job, ... av, bv, cv, dv, ... aw, bw, cw, dw, ... weight, jobc, jobo, alphac, alphao, ... tol1, tol2); ## assemble reduced order model Gr = ss (ar, br, cr, dr, tsam); ## assemble info struct info = struct ("nr", nr, "ns", ns, "hsv", hsv); endfunction control/inst/__modred_check_alpha__.m0000644000076500000240000000241012273411257017244 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## check alpha for model reduction commands ## Author: Lukas Reichlin ## Created: November 2011 ## Version: 0.1 function alpha = __modred_check_alpha__ (alpha, dt) if (! is_real_scalar (alpha)) error ("modred: argument alpha must be a real scalar"); endif if (dt) # discrete-time if (alpha < 0 || alpha > 1) error ("modred: require 0 <= ALPHA <= 1"); endif else # continuous-time if (alpha > 0) error ("modred: require ALPHA <= 0"); endif endif endfunction control/inst/__modred_check_alpha_gram__.m0000644000076500000240000000221212273411257020252 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## check alpha for combination methods of grammians ## Author: Lukas Reichlin ## Created: December 2011 ## Version: 0.1 function alpha = __modred_check_alpha_gram__ (alpha, key) if (! is_real_scalar (alpha)) error ("modred: argument '%s' must be a real scalar", key); endif if (abs (alpha) > 1) error ("modred: require -1 <= %s <= 1", key); endif endfunction control/inst/__modred_check_equil__.m0000644000076500000240000000211412273411257017277 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## check equilibration for model reduction commands ## Author: Lukas Reichlin ## Created: November 2011 ## Version: 0.1 function scaled = __modred_check_equil__ (equil) if (isscalar (equil)) scaled = ! logical (equil); else error ("modred: property 'equil' must be a logical value"); endif endfunction control/inst/__modred_check_gram__.m0000644000076500000240000000235512273411257017115 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## check choice of frequency-weighted grammians. ## Author: Lukas Reichlin ## Created: December 2011 ## Version: 0.1 function job = __modred_check_gram__ (choice, key) if (! ischar (choice)) error ("modred: key '%s' requires string value", key); endif switch (tolower (choice (1))) case "s" # standard job = 0; case "e" # enhanced job = 1; otherwise error ("modred: key '%s' has an invalid value", key); endswitch endfunction control/inst/__modred_check_order__.m0000644000076500000240000000233312273411257017276 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## check order for model reduction commands ## Author: Lukas Reichlin ## Created: November 2011 ## Version: 0.1 function [nr, ordsel] = __modred_check_order__ (nr, n) if (! issample (nr, 0) || nr != round (nr)) error ("modred: order of reduced model must be an integer >= 0"); endif if (nr > n) error ("modred: order of reduced model (%d) can't be larger than the original one (%d)", ... nr, n); endif ordsel = 0; endfunction control/inst/__modred_check_tol__.m0000644000076500000240000000205012273411257016755 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## check tolerance for model reduction commands ## Author: Lukas Reichlin ## Created: November 2011 ## Version: 0.1 function tol = __modred_check_tol__ (tol, str = "") if (! is_real_scalar (tol)) error ("modred: argument %s must be a real scalar", str); endif endfunction control/inst/__modred_check_weight__.m0000644000076500000240000000265212273411257017456 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## check weightings for model reduction commands ## Author: Lukas Reichlin ## Created: November 2011 ## Version: 0.1 function [a, b, c, d, job] = __modred_check_weight__ (sys, dt, p = [], m = []) sys = ss (sys); # could be non-lti, therefore ssdata would fail if (dt != isdt (sys)) error ("modred: ct/dt"); # TODO: error message endif [pw, mw] = size (sys); if (! isempty (p) && mw != p) error ("modred: left weight requires %d inputs", p); endif if (! isempty (m) && pw != m) error ("modred: right weight requires %d outputs", m); endif [a, b, c, d] = ssdata (sys); job = 1; ## TODO: check system size endfunction control/inst/__modred_default_alpha__.m0000644000076500000240000000210612273411257017615 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## default alpha for model reduction commands ## Author: Lukas Reichlin ## Created: November 2011 ## Version: 0.1 function alpha = __modred_default_alpha__ (dt) if (dt) # discrete-time alpha = 1; # ALPHA <= 0 else # continuous-time alpha = 0; # 0 <= ALPHA <= 1 endif endfunction control/inst/__opt2cell__.m0000644000076500000240000000225612273411257015224 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Convert option struct to a cell with field names as keys and ## field values as values. ## Author: Lukas Reichlin ## Created: November 2011 ## Version: 0.1 function c = __opt2cell__ (opt) if (! isstruct (opt)) error ("opt2cell: argument must be a struct"); endif key = fieldnames (opt); val = struct2cell (opt); c = [key.'; val.'](:).'; # reshape to {key1, val1, key2, val2, ...} endfunction control/inst/__remove_trailing_zeros__.m0000644000076500000240000000213712273411257020106 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Remove trailing zeros from a polynomial, except for polynomials ## which are of length 1. For internal use only. ## Author: Lukas Reichlin ## Created: April 2012 ## Version: 0.1 function p = __remove_trailing_zeros__ (p) idx = find (p != 0); if (isempty (idx)) p = 0; else p = p(1 : idx(end)); endif endfunction control/inst/__slicot_identification__.m0000644000076500000240000001650312273411257020046 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{sys}, @var{x0}], @var{info} =} __slicot_identification__ (@var{method}, @var{dat}, @dots{}) ## Backend for moesp, moen4 and n4sid. ## @end deftypefn ## Author: Lukas Reichlin ## Created: May 2012 ## Version: 0.1 function [sys, x0, info] = __slicot_identification__ (method, nout, dat, varargin) ## determine identification method switch (method) case "moesp" meth = 0; case "n4sid" meth = 1; case "moen4" meth = 2; otherwise error ("ident: invalid method"); # should never happen endswitch if (! isa (dat, "iddata") || ! dat.timedomain) error ("%s: first argument must be a time-domain 'iddata' dataset", method); endif if (nargin > 3) # ident (dat, ...) if (is_real_scalar (varargin{1})) # ident (dat, n, ...) varargin = horzcat (varargin(2:end), {"order"}, varargin(1)); endif if (isstruct (varargin{1})) # ident (dat, opt, ...), ident (dat, n, opt, ...) varargin = horzcat (__opt2cell__ (varargin{1}), varargin(2:end)); endif endif nkv = numel (varargin); # number of keys and values if (rem (nkv, 2)) error ("%s: keys and values must come in pairs", method); endif [ns, p, m, e] = size (dat); # dataset dimensions tsam = dat.tsam; ## multi-experiment data requires equal sampling times if (e > 1 && ! isequal (tsam{:})) error ("%s: require equally sampled experiments", method); else tsam = tsam{1}; endif ## default arguments alg = 0; conct = 1; # no connection between experiments ctrl = 1; # don't confirm order n rcond = 0.0; tol = 0.0; # -1.0; s = []; n = []; conf = []; noise = "n"; ## handle keys and values for k = 1 : 2 : nkv key = lower (varargin{k}); val = varargin{k+1}; switch (key) case {"n", "order"} if (! issample (val, 0) || val != round (val)) error ("%s: 'n' must be a positive integer", method); endif n = val; case "s" if (! issample (val, 0) || val != round (val)) error ("%s: 's' must be a positive integer", method); endif s = val; case {"alg", "algorithm"} if (strncmpi (val, "c", 1)) alg = 0; # Cholesky algorithm applied to correlation matrix elseif (strncmpi (val, "f", 1)) alg = 1; # fast QR algorithm elseif (strncmpi (val, "q", 1)) alg = 2; # QR algorithm applied to block Hankel matrices else error ("%s: invalid algorithm", method); endif case "tol" if (! is_real_scalar (val)) error ("%s: tolerance 'tol' must be a real scalar", method); endif tol = val; case "rcond" if (! is_real_scalar (val)) error ("%s: 'rcond' must be a real scalar", method); endif rcond = val; case "confirm" conf = logical (val); case {"noiseinput", "noiseinputs", "noise", "input", "inputs"} noise = val; otherwise warning ("%s: invalid property name '%s' ignored", method, key); endswitch endfor ## handle s/nobr and n nsmp = sum (ns); # total number of samples nobr = fix ((nsmp+1)/(2*(m+p+1))); if (e > 1) nobr = min (nobr, fix (min (ns) / 2)); endif if (isempty (s) && isempty (n)) ctrl = 0; # confirm system order estimate n = 0; elseif (isempty (s)) s = min (2*n, n+10); # upper bound for n nobr = min (nobr, s); elseif (isempty (n)) nobr = __check_s__ (s, nobr, method); ctrl = 0; # confirm system order estimate n = 0; else # s & n non-empty nobr = __check_s__ (s, nobr, method); if (n >= nobr) error ("%s: n=%d, but require n < %d (s)", method, n, nobr); endif endif if (! isempty (conf)) ctrl = ! conf; endif if (nout == 0) ## compute singular values [sv, nrec] = __sl_ib01ad__ (dat.y, dat.u, nobr, n, meth, alg, conct, ctrl, rcond, tol); ## there is no 'logbar' function svl = log10 (sv); base = floor (min (svl)); clf bar (svl, "basevalue", base) xlim ([0, length(sv)+1]) yl = ylim; ylim ([base, yl(2)]) title ("Singular Values") ylabel ("Logarithm of Singular Values") xlabel (sprintf ("Estimated System Order with current Tolerance: %d", nrec)) grid on else ## perform system identification [a, b, c, d, q, ry, s, k, x0] = __sl_ident__ (dat.y, dat.u, nobr, n, meth, alg, conct, ctrl, rcond, tol); ## compute noise variance matrix factor L ## L L' = Ry, e = L v ## v becomes white noise with identity covariance matrix l = chol (ry, "lower"); ## assemble model [inname, outname] = get (dat, "inname", "outname"); if (strncmpi (noise, "e", 1)) # add error inputs e, not normalized sys = ss (a, [b, k], c, [d, eye(p)], tsam); in_u = __labels__ (inname, "u"); in_e = __labels__ (outname, "y"); in_e = cellfun (@(x) ["e@", x], in_e, "uniformoutput", false); inname = [in_u; in_e]; elseif (strncmpi (noise, "v", 1)) # add error inputs v, normalized sys = ss (a, [b, k*l], c, [d, l], tsam); in_u = __labels__ (inname, "u"); in_v = __labels__ (outname, "y"); in_v = cellfun (@(x) ["v@", x], in_v, "uniformoutput", false); inname = [in_u; in_v]; elseif (strncmpi (noise, "k", 1)) # Kalman predictor sys = ss ([a-k*c], [b-k*d, k], c, [d, zeros(p)], tsam); in_u = __labels__ (inname, "u"); in_y = __labels__ (outname, "y"); inname = [in_u; in_y]; else # no error inputs, default sys = ss (a, b, c, d, tsam); endif sys = set (sys, "inname", inname, "outname", outname); ## return x0 as vector for single-experiment data ## instead of a cell containing one vector if (numel (x0) == 1) x0 = x0{1}; endif ## assemble info struct ## Kalman gain matrix K ## state covariance matrix Q ## output covariance matrix Ry ## state-output cross-covariance matrix S ## noise variance matrix factor L info = struct ("K", k, "Q", q, "Ry", ry, "S", s, "L", l); endif endfunction function nobr = __check_s__ (s, nobr, method) if (s <= nobr) nobr = s; else error ("%s: require upper bound s <= %d, but the requested s is %d", method, nobr, s); endif endfunction control/inst/__ss_dim__.m0000644000076500000240000000422112273411257014750 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Number of outputs (p), inputs (m) and states (n) of state space matrices. ## For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.2 function [p, m, n] = __ss_dim__ (a, b, c, d, e = []) ## TODO: create oct-file? if (! is_real_matrix (a, b, c, d, e)) error ("ss: system matrices must be real"); endif [arows, acols] = size (a); [brows, bcols] = size (b); [crows, ccols] = size (c); [drows, dcols] = size (d); m = bcols; # = dcols n = arows; # = acols p = crows; # = drows if (arows != acols) error ("ss: system matrix a(%dx%d) is not square", arows, acols); endif if (brows != arows) error ("ss: system matrices a(%dx%d) and b(%dx%d) are incompatible", arows, acols, brows, bcols); endif if (ccols != acols) error ("ss: system matrices a(%dx%d) and c(%dx%d) are incompatible", arows, acols, crows, ccols); endif if (bcols != dcols) error ("ss: system matrices b(%dx%d) and d(%dx%d) are incompatible", brows, bcols, drows, dcols); endif if (crows != drows) error ("ss: system matrices c(%dx%d) and d(%dx%d) are incompatible", crows, ccols, drows, dcols); endif if (! isempty (e) && ! size_equal (e, a)) error ("ss: system matrices a(%dx%d) and e(%dx%d) are incompatible", arows, acols, rows (e), columns (e)); endif endfunction control/inst/__str2idx__.m0000644000076500000240000000254412273411257015077 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Get input/output indices from in/outgroup and in/outname. ## For internal use only. ## Author: Lukas Reichlin ## Created: October 2013 ## Version: 0.1 function idx = __str2idx__ (group, name, str, id) if (isfield (group, str)) idx = group.(str)(:); else tmp = strcmp (name, str)(:); switch (nnz (tmp)) case 1 idx = find (tmp); case 0 error ("lti: %sgroup or %sname '%s' not found", id, id, str); otherwise error ("lti: %sname '%s' is ambiguous", id, str); ## FIXME: error for structure arrays endswitch endif endfunction control/inst/__tf_dim__.m0000644000076500000240000000233112273411257014734 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Number of outputs and inputs of transfer function numerator and ## denominator. For internal use only. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.1 function [nrows, ncols] = __tf_dim__ (num, den) [nrows, ncols] = size (num); [drows, dcols] = size (den); if (nrows != drows || ncols != dcols) error ("tf: num(%dx%d) and den(%dx%d) must have equal dimensions", nrows, ncols, drows, dcols); endif endfunction control/inst/__time_response__.m0000644000076500000240000003315612273411257016357 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Common code for the time response functions step, impulse and initial. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.4.1 function [y, t, x] = __time_response__ (response, args, sysname, plotflag) sys_idx = find (cellfun (@isa, args, {"lti"})); # look for LTI models, 'find' needed for plot styles sys_cell = cellfun (@ss, args(sys_idx), "uniformoutput", false); # convert to state-space if (! size_equal (sys_cell{:})) error ("%s: models must have equal sizes", response); endif vec_idx = find (cellfun (@is_real_matrix, args)); # indices of vector arguments n_vec = length (vec_idx); # number of vector arguments n_sys = length (sys_cell); # number of LTI systems tfinal = []; dt = []; x0 = []; ## extract tfinal/t, dt, x0 from args if (strcmpi (response, "initial")) if (n_vec < 1) error ("initial: require initial state vector 'x0'"); else # initial state vector x0 specified arg = args{vec_idx(1)}; if (is_real_vector (arg)) x0 = arg; else error ("initial: initial state vector 'x0' must be a vector of real values"); endif if (n_vec > 1) # tfinal or time vector t specified arg = args{vec_idx(2)}; if (issample (arg)) tfinal = arg; elseif (isempty (arg)) ## tfinal = []; # nothing to do here elseif (is_real_vector (arg)) dt = abs (arg(2) - arg(1)); # assume that t is regularly spaced tfinal = arg(end); else warning ("initial: argument number %d ignored", vec_idx(2)); endif if (n_vec > 2) # sampling time dt specified arg = args{vec_idx(3)}; if (issample (arg)) dt = arg; else warning ("initial: argument number %d ignored", vec_idx(3)); endif if (n_vec > 3) warning ("initial: ignored"); endif endif endif endif else # step or impulse response if (n_vec > 0) # tfinal or time vector t specified arg = args{vec_idx(1)}; if (issample (arg)) tfinal = arg; elseif (isempty (arg)) ## tfinal = []; # nothing to do here elseif (is_real_vector (arg)) dt = abs (arg(2) - arg(1)); # assume that t is regularly spaced tfinal = arg(end); else warning ("%s: argument number %d ignored", response, vec_idx(1)); endif if (n_vec > 1) # sampling time dt specified arg = args{vec_idx(2)}; if (issample (arg)) dt = arg; else warning ("%s: argument number %d ignored", response, vec_idx(2)); endif if (n_vec > 2) warning ("%s: ignored", response); endif endif endif endif ## TODO: share common code between initial and step/impulse [tfinal, dt] = cellfun (@__sim_horizon__, sys_cell, {tfinal}, {dt}, "uniformoutput", false); tfinal = max ([tfinal{:}]); ct_idx = cellfun (@isct, sys_cell); sys_dt_cell = sys_cell; tmp = cellfun (@c2d, sys_cell(ct_idx), dt(ct_idx), {"zoh"}, "uniformoutput", false); sys_dt_cell(ct_idx) = tmp; ## time vector t = @cellfun (@(dt) reshape (0 : dt : tfinal, [], 1), dt, "uniformoutput", false); ## function [y, x_arr] = __initial_response__ (sys, sys_dt, t, x0) ## function [y, x_arr] = __step_response__ (sys_dt, t) ## function [y, x_arr] = __impulse_response__ (sys, sys_dt, t) ## function [y, x_arr] = __ramp_response__ (sys_dt, t) switch (response) case "initial" [y, x] = cellfun (@__initial_response__, sys_dt_cell, t, {x0}, "uniformoutput", false); case "step" [y, x] = cellfun (@__step_response__, sys_dt_cell, t, "uniformoutput", false); case "impulse" [y, x] = cellfun (@__impulse_response__, sys_cell, sys_dt_cell, t, "uniformoutput", false); case "ramp" [y, x] = cellfun (@__ramp_response__, sys_dt_cell, t, "uniformoutput", false); otherwise error ("time_response: invalid response type"); endswitch if (plotflag) # display plot [p, m] = size (sys_cell{1}); switch (response) case "initial" str = "Response to Initial Conditions"; cols = 1; ## yfinal = zeros (p, 1); case "step" str = "Step Response"; cols = m; ## yfinal = dcgain (sys_cell{1}); case "impulse" str = "Impulse Response"; cols = m; ## yfinal = zeros (p, m); case "ramp" str = "Ramp Response"; cols = m; otherwise error ("time_response: invalid response type"); endswitch style_idx = find (cellfun (@ischar, args)); outname = get (sys_cell{end}, "outname"); outname = __labels__ (outname, "y"); colororder = get (gca, "colororder"); rc = rows (colororder); for k = 1 : n_sys # for every system if (k == n_sys) lim = numel (args); else lim = sys_idx(k+1); endif style = args(style_idx(style_idx > sys_idx(k) & style_idx <= lim)); if (isempty (style)) color = colororder(1+rem (k-1, rc), :); style = {"color", color}; endif if (ct_idx(k)) # continuous-time system for i = 1 : p # for every output for j = 1 : cols # for every input (except for initial where cols=1) if (p != 1 || cols != 1) subplot (p, cols, (i-1)*cols+j); endif plot (t{k}, y{k}(:, i, j), style{:}); hold on; grid on; if (k == n_sys) axis tight ylim (__axis_margin__ (ylim)) if (j == 1) ylabel (outname{i}); if (i == 1) title (str); endif endif endif endfor endfor else # discrete-time system for i = 1 : p # for every output for j = 1 : cols # for every input (except for initial where cols=1) if (p != 1 || cols != 1) subplot (p, cols, (i-1)*cols+j); endif stairs (t{k}, y{k}(:, i, j), style{:}); hold on; grid on; if (k == n_sys) axis tight; ylim (__axis_margin__ (ylim)) if (j == 1) ylabel (outname{i}); if (i == 1) title (str); endif endif endif endfor endfor endif endfor xlabel ("Time [s]"); if (p == 1 && m == 1) legend (sysname) endif hold off; endif endfunction function [y, x_arr] = __initial_response__ (sys_dt, t, x0) [F, G, C, D] = ssdata (sys_dt); # system must be proper n = rows (F); # number of states m = columns (G); # number of inputs p = rows (C); # number of outputs l_t = length (t); ## preallocate memory y = zeros (l_t, p); x_arr = zeros (l_t, n); ## initial conditions x = reshape (x0, [], 1); # make sure that x is a column vector if (n != length (x0) || ! is_real_vector (x0)) error ("initial: x0 must be a real vector with %d elements", n); endif ## simulation for k = 1 : l_t y(k, :) = C * x; x_arr(k, :) = x; x = F * x; endfor endfunction function [y, x_arr] = __step_response__ (sys_dt, t) [F, G, C, D] = ssdata (sys_dt); # system must be proper n = rows (F); # number of states m = columns (G); # number of inputs p = rows (C); # number of outputs l_t = length (t); ## preallocate memory y = zeros (l_t, p, m); x_arr = zeros (l_t, n, m); for j = 1 : m # for every input channel ## initial conditions x = zeros (n, 1); u = zeros (m, 1); u(j) = 1; ## simulation for k = 1 : l_t y(k, :, j) = C * x + D * u; x_arr(k, :, j) = x; x = F * x + G * u; endfor endfor endfunction function [y, x_arr] = __impulse_response__ (sys, sys_dt, t) [~, B] = ssdata (sys); [F, G, C, D, dt] = ssdata (sys_dt); # system must be proper dt = abs (dt); # use 1 second if tsam is unspecified (-1) discrete = ! isct (sys); n = rows (F); # number of states m = columns (G); # number of inputs p = rows (C); # number of outputs l_t = length (t); ## preallocate memory y = zeros (l_t, p, m); x_arr = zeros (l_t, n, m); for j = 1 : m # for every input channel ## initial conditions u = zeros (m, 1); u(j) = 1; if (discrete) x = zeros (n, 1); # zero by definition y(1, :, j) = D * u / dt; x_arr(1, :, j) = x; x = G * u / dt; else x = B * u; # B, not G! y(1, :, j) = C * x; x_arr(1, :, j) = x; x = F * x; endif ## simulation for k = 2 : l_t y (k, :, j) = C * x; x_arr(k, :, j) = x; x = F * x; endfor endfor if (discrete) y *= dt; x_arr *= dt; endif endfunction function [y, x_arr] = __ramp_response__ (sys_dt, t) [F, G, C, D] = ssdata (sys_dt); # system must be proper n = rows (F); # number of states m = columns (G); # number of inputs p = rows (C); # number of outputs l_t = length (t); ## preallocate memory y = zeros (l_t, p, m); x_arr = zeros (l_t, n, m); for j = 1 : m # for every input channel ## initial conditions x = zeros (n, 1); u = zeros (m, l_t); u(j, :) = t; ## simulation for k = 1 : l_t y(k, :, j) = C * x + D * u(:, k); x_arr(k, :, j) = x; x = F * x + G * u(:, k); endfor endfor endfunction function [tfinal, dt] = __sim_horizon__ (sys, tfinal, Ts) ## code based on __stepimp__.m of Kai P. Mueller and A. Scottedward Hodel TOL = 1.0e-10; # values below TOL are assumed to be zero N_MIN = 50; # min number of points N_MAX = 2000; # max number of points N_DEF = 1000; # default number of points T_DEF = 10; # default simulation time ev = pole (sys); n = length (ev); # number of states/poles continuous = isct (sys); discrete = ! continuous; if (discrete) dt = Ts = abs (get (sys, "tsam")); ## perform bilinear transformation on poles in z for k = 1 : n pol = ev(k); if (abs (pol + 1) < TOL) ev(k) = 0; else ev(k) = 2 / Ts * (pol - 1) / (pol + 1); endif endfor endif ## remove poles near zero from eigenvalue array ev nk = n; for k = 1 : n if (abs (real (ev(k))) < TOL) ev(k) = 0; nk -= 1; endif endfor if (nk == 0) if (isempty (tfinal)) tfinal = T_DEF; endif if (continuous) dt = tfinal / N_DEF; endif else ev = ev(find (ev)); ev_max = max (abs (ev)); if (continuous) dt = 0.2 * pi / ev_max; endif if (isempty (tfinal)) ev_min = min (abs (real (ev))); tfinal = 5.0 / ev_min; ## round up yy = 10^(ceil (log10 (tfinal)) - 1); tfinal = yy * ceil (tfinal / yy); endif if (continuous) N = tfinal / dt; if (N < N_MIN) dt = tfinal / N_MIN; endif if (N > N_MAX) dt = tfinal / N_MAX; endif endif endif if (continuous && ! isempty (Ts)) # catch case cont. system with dt specified dt = Ts; endif endfunction control/inst/__tito_dim__.m0000644000076500000240000000307412273411257015307 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## Extract nmeas and ncon from plant P which has been partitioned by mktito. ## Author: Lukas Reichlin ## Created: January 2014 ## Version: 0.1 function [nmeas, ncon] = __tito_dim__ (P, name) [p, m] = size (P); outgroup = P.outgroup; ingroup = P.ingroup; if (! isfield (outgroup, "V")) error ("%s: missing outgroup 'V'", name); endif if (! isfield (ingroup, "U")) error ("%s: missing ingroup 'U'", name); endif nmeas = numel (outgroup.V); ncon = numel (ingroup.U); ## check whether indices of V and U are in ascending order ## and at the end of the outputs/inputs if (! isequal (outgroup.V(:), (p-nmeas+1:p)(:))) error ("%s: outgroup 'V' invalid", name); endif if (! isequal (ingroup.U(:), (m-ncon+1:m)(:))) error ("%s: ingroup 'U' invalid", name); endif endfunction control/inst/__vec2tfpoly__.m0000644000076500000240000000210312273411257015564 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Convert a (cell of) row vector(s) to a cell of tfpoly objects. ## Used by tf and __set__. ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.2 function ndr = __vec2tfpoly__ (nd) if (! iscell (nd)) nd = {nd}; endif ndr = cellfun (@tfpoly, nd, "uniformoutput", false); endfunction control/inst/Anderson.m0000644000076500000240000000506012273411257014451 0ustar lukasstaff%% -*- texinfo -*- %% Frequency-weighted coprime factorization controller reduction. % =============================================================================== % Coprime Factorization Controller Reduction Lukas Reichlin December 2011 % =============================================================================== % Reference: Anderson, B.D.O.: Controller Reduction: Concepts and Approaches % IEEE Transactions of Automatic Control, Vol. 34, No. 8, August 1989 % =============================================================================== % Tabula Rasa clear all, close all, clc % Plant A = [ -0.161 -6.004 -0.58215 -9.9835 -0.40727 -3.982 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 ]; B = [ 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ]; C = [ 0.0 0.0 6.4432e-3 2.3196e-3 7.1252e-2 1.0002 0.10455 0.99551 ]; G = ss (A, B, C); % LQG Design H = [ 0.0 0.0 0.0 0.0 0.55 11.0 1.32 18.0 ]; q1 = 1e-6; q2 = 100; % [100, 1000, 2000] Q = q1 * H.' * H; R = 1; W = q2 * B * B.'; V = 1; F = lqr (G, Q, R) L = lqe (G, W, V) % Coprime Factorization using Balanced Truncation Approximation Kr = arrayfun (@(k) cfconred (G, F, L, k), 8:-1:2, 'uniformoutput', false); % 'method', 'bfsr-bta' T = cellfun (@(Kr) feedback (G*Kr), Kr, 'uniformoutput', false); figure (1) step (T{:}, 200) % Coprime Factorization using Singular Perturbation Approximation Kr = arrayfun (@(k) cfconred (G, F, L, k, 'method', 'bfsr-spa'), 8:-1:2, 'uniformoutput', false); T = cellfun (@(Kr) feedback (G*Kr), Kr, 'uniformoutput', false); figure (2) step (T{:}, 200) % Frequency-Weighted Coprime Factorization using BTA Kr = arrayfun (@(k) fwcfconred (G, F, L, k), 8:-1:2, 'uniformoutput', false); T = cellfun (@(Kr) feedback (G*Kr), Kr, 'uniformoutput', false); figure (3) step (T{:}, 300) control/inst/arx.m0000644000076500000240000002551612273411257013502 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{sys}, @var{x0}] =} arx (@var{dat}, @var{n}, @dots{}) ## @deftypefnx {Function File} {[@var{sys}, @var{x0}] =} arx (@var{dat}, @var{n}, @var{opt}, @dots{}) ## @deftypefnx {Function File} {[@var{sys}, @var{x0}] =} arx (@var{dat}, @var{opt}, @dots{}) ## @deftypefnx {Function File} {[@var{sys}, @var{x0}] =} arx (@var{dat}, @var{'na'}, @var{na}, @var{'nb'}, @var{nb}) ## Estimate ARX model using QR factorization. ## @iftex ## @tex ## $$ A(q) \\, y(t) = B(q) \\, u(t) \\, + \\, e(t) $$ ## @end tex ## @end iftex ## @ifnottex ## ## @example ## A(q) y(t) = B(q) u(t) + e(t) ## @end example ## ## @end ifnottex ## ## @strong{Inputs} ## @table @var ## @item dat ## iddata identification dataset containing the measurements, i.e. time-domain signals. ## @item n ## The desired order of the resulting model @var{sys}. ## @item @dots{} ## Optional pairs of keys and values. @code{'key1', value1, 'key2', value2}. ## @item opt ## Optional struct with keys as field names. ## Struct @var{opt} can be created directly or ## by command @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. ## @end table ## ## ## @strong{Outputs} ## @table @var ## @item sys ## Discrete-time transfer function model. ## If the second output argument @var{x0} is returned, ## @var{sys} becomes a state-space model. ## @item x0 ## Initial state vector. If @var{dat} is a multi-experiment dataset, ## @var{x0} becomes a cell vector containing an initial state vector ## for each experiment. ## @end table ## ## ## @strong{Option Keys and Values} ## @table @var ## @item 'na' ## Order of the polynomial A(q) and number of poles. ## ## @item 'nb' ## Order of the polynomial B(q)+1 and number of zeros+1. ## @var{nb} <= @var{na}. ## ## @item 'nk' ## Input-output delay specified as number of sampling instants. ## Scalar positive integer. This corresponds to a call to command ## @command{nkshift}, followed by padding the B polynomial with ## @var{nk} leading zeros. ## @end table ## ## ## @strong{Algorithm}@* ## Uses the formulae given in [1] on pages 318-319, ## 'Solving for the LS Estimate by QR Factorization'. ## For the initial conditions, SLICOT IB01CD is used by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @strong{References}@* ## [1] Ljung, L. (1999) ## @cite{System Identification: Theory for the User: Second Edition}. ## Prentice Hall, New Jersey, USA. ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: April 2012 ## Version: 0.1 function [sys, varargout] = arx (dat, varargin) ## TODO: delays if (nargin < 2) print_usage (); endif if (! isa (dat, "iddata") || ! dat.timedomain) error ("arx: first argument must be a time-domain iddata dataset"); endif ## p: outputs, m: inputs, ex: experiments [~, p, m, ex] = size (dat); # dataset dimensions if (is_real_scalar (varargin{1})) # arx (dat, n, ...) varargin = horzcat (varargin(2:end), {"na"}, varargin(1), {"nb"}, varargin(1)); endif if (isstruct (varargin{1})) # arx (dat, opt, ...), arx (dat, n, opt, ...) varargin = horzcat (__opt2cell__ (varargin{1}), varargin(2:end)); endif nkv = numel (varargin); # number of keys and values if (rem (nkv, 2)) error ("arx: keys and values must come in pairs"); endif ## default arguments na = []; nb = []; nk = 0; ## handle keys and values for k = 1 : 2 : nkv key = lower (varargin{k}); val = varargin{k+1}; switch (key) case "na" na = __check_n__ (val, "na"); case "nb" nb = __check_n__ (val, "nb"); case "nk" nk = __check_n__ (val, "nk"); if (! issample (val, 0)) error ("arx: channel-wise 'nk' matrices not supported yet"); endif otherwise warning ("arx: invalid property name '%s' ignored", key); endswitch endfor if (any (nk(:) != 0)) dat = nkshift (dat, nk); endif ## extract data Y = dat.y; U = dat.u; tsam = dat.tsam; ## multi-experiment data requires equal sampling times if (ex > 1 && ! isequal (tsam{:})) error ("arx: require equally sampled experiments"); else tsam = tsam{1}; endif if (is_real_scalar (na, nb)) na = repmat (na, p, 1); # na(p-by-1) nb = repmat (nb, p, m); # nb(p-by-m) elseif (! (is_real_vector (na) && is_real_matrix (nb) ... && rows (na) == p && rows (nb) == p && columns (nb) == m)) error ("arx: require na(%dx1) instead of (%dx%d) and nb(%dx%d) instead of (%dx%d)", ... p, rows (na), columns (na), p, m, rows (nb), columns (nb)); endif max_nb = max (nb, [], 2); # one maximum for each row/output, max_nb(p-by-1) n = max (na, max_nb); # n(p-by-1) ## create empty cells for numerator and denominator polynomials num = cell (p, m+p); den = cell (p, m+p); ## MIMO (p-by-m) models are identified as p MISO (1-by-m) models ## For multi-experiment data, minimize the trace of the error for i = 1 : p # for every output Phi = cell (ex, 1); # one regression matrix per experiment for e = 1 : ex # for every experiment ## avoid warning: toeplitz: column wins anti-diagonal conflict ## therefore set first row element equal to y(1) PhiY = toeplitz (Y{e}(1:end-1, i), [Y{e}(1, i); zeros(na(i)-1, 1)]); ## create MISO Phi for every experiment PhiU = arrayfun (@(x) toeplitz (U{e}(1:end-1, x), [U{e}(1, x); zeros(nb(i,x)-1, 1)]), 1:m, "uniformoutput", false); Phi{e} = (horzcat (-PhiY, PhiU{:}))(n(i):end, :); endfor ## compute parameter vector Theta Theta = __theta__ (Phi, Y, i, n); ## extract polynomial matrices A and B from Theta ## A is a scalar polynomial for output i, i=1:p ## B is polynomial row vector (1-by-m) for output i A = [1; Theta(1:na(i))]; # a0 = 1, a1 = Theta(1), an = Theta(n) ThetaB = Theta(na(i)+1:end); # all polynomials from B are in one column vector B = mat2cell (ThetaB, nb(i,:)); # now separate the polynomials, one for each input B = reshape (B, 1, []); # make B a row cell (1-by-m) B = cellfun (@(B) [zeros(1+nk, 1); B], B, "uniformoutput", false); # b0 = 0 (leading zero required by filt) ## add error inputs Be = repmat ({0}, 1, p); # there are as many error inputs as system outputs (p) Be(i) = [zeros(1,nk), 1]; # inputs m+1:m+p are zero, except m+i which is one num(i, :) = [B, Be]; # numerator polynomials for output i, individual for each input den(i, :) = repmat ({A}, 1, m+p); # in a row (output i), all inputs have the same denominator polynomial endfor ## A(q) y(t) = B(q) u(t) + e(t) ## there is only one A per row ## B(z) and A(z) are a Matrix Fraction Description (MFD) ## y = A^-1(q) B(q) u(t) + A^-1(q) e(t) ## since A(q) is a diagonal polynomial matrix, its inverse is trivial: ## the corresponding transfer function has common row denominators. sys = filt (num, den, tsam); # filt creates a transfer function in z^-1 ## compute initial state vector x0 if requested ## this makes only sense for state-space models, therefore convert TF to SS if (nargout > 1) sys = prescale (ss (sys(:,1:m))); x0 = __sl_ib01cd__ (Y, U, sys.a, sys.b, sys.c, sys.d, 0.0); ## return x0 as vector for single-experiment data ## instead of a cell containing one vector if (numel (x0) == 1) x0 = x0{1}; endif varargout{1} = x0; endif endfunction function Theta = __theta__ (Phi, Y, i, n) if (numel (Phi) == 1) # single-experiment dataset ## use "square-root algorithm" A = horzcat (Phi{1}, Y{1}(n(i)+1:end, i)); # [Phi, Y] R0 = triu (qr (A, 0)); # 0 for economy-size R (without zero rows) R1 = R0(1:end-1, 1:end-1); # R1 is triangular - can we exploit this in R1\R2? R2 = R0(1:end-1, end); Theta = __ls_svd__ (R1, R2); # R1 \ R2 ## Theta = Phi \ Y(n+1:end, :); # naive formula ## Theta = __ls_svd__ (Phi{1}, Y{1}(n(i)+1:end, i)); else # multi-experiment dataset ## TODO: find more sophisticated formula than ## Theta = (Phi1' Phi1 + Phi2' Phi2 + ...) \ (Phi1' Y1 + Phi2' Y2 + ...) ## covariance matrix C = (Phi1' Phi + Phi2' Phi2 + ...) tmp = cellfun (@(Phi) Phi.' * Phi, Phi, "uniformoutput", false); ## rc = cellfun (@rcond, tmp); # also test C? QR or SVD? C = plus (tmp{:}); ## PhiTY = (Phi1' Y1 + Phi2' Y2 + ...) tmp = cellfun (@(Phi, Y) Phi.' * Y(n(i)+1:end, i), Phi, Y, "uniformoutput", false); PhiTY = plus (tmp{:}); ## pseudoinverse Theta = C \ Phi'Y Theta = __ls_svd__ (C, PhiTY); endif endfunction function x = __ls_svd__ (A, b) ## solve the problem Ax=b ## x = A\b would also work, ## but this way we have better control and warnings ## solve linear least squares problem by pseudoinverse ## the pseudoinverse is computed by singular value decomposition ## M = U S V* ---> M+ = V S+ U* ## Th = Ph \ Y = Ph+ Y ## Th = V S+ U* Y, S+ = 1 ./ diag (S) [U, S, V] = svd (A, 0); # 0 for "economy size" decomposition S = diag (S); # extract main diagonal r = sum (S > eps*S(1)); if (r < length (S)) warning ("arx: rank-deficient coefficient matrix"); warning ("sampling time too small"); warning ("persistence of excitation"); endif V = V(:, 1:r); S = S(1:r); U = U(:, 1:r); x = V * (S .\ (U' * b)); # U' is the conjugate transpose endfunction function val = __check_n__ (val, str = "n") if (! is_real_matrix (val) || fix (val) != val) error ("arx: argument '%s' must be a positive integer", str); endif endfunction control/inst/augw.m0000644000076500000240000001235112273411257013644 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {@var{P} =} augw (@var{G}, @var{W1}, @var{W2}, @var{W3}) ## Extend plant for stacked S/KS/T problem. Subsequently, the robust control problem ## can be solved by h2syn or hinfsyn. ## ## @strong{Inputs} ## @table @var ## @item G ## @acronym{LTI} model of plant. ## @item W1 ## @acronym{LTI} model of performance weight. Bounds the largest singular values of sensitivity @var{S}. ## Model must be empty @code{[]}, SISO or of appropriate size. ## @item W2 ## @acronym{LTI} model to penalize large control inputs. Bounds the largest singular values of @var{KS}. ## Model must be empty @code{[]}, SISO or of appropriate size. ## @item W3 ## @acronym{LTI} model of robustness and noise sensitivity weight. Bounds the largest singular values of ## complementary sensitivity @var{T}. Model must be empty @code{[]}, SISO or of appropriate size. ## @end table ## ## All inputs must be proper/realizable. ## Scalars, vectors and matrices are possible instead of @acronym{LTI} models. ## ## @strong{Outputs} ## @table @var ## @item P ## State-space model of augmented plant. ## @end table ## ## @strong{Block Diagram} ## @example ## @group ## ## | W1 | -W1*G | z1 = W1 r - W1 G u ## | 0 | W2 | z2 = W2 u ## P = | 0 | W3*G | z3 = W3 G u ## |----+-------| ## | I | -G | e = r - G u ## @end group ## @end example ## @example ## @group ## +------+ z1 ## +---------------------------------------->| W1 |-----> ## | +------+ ## | +------+ z2 ## | +---------------------->| W2 |-----> ## | | +------+ ## r + e | +--------+ u | +--------+ y +------+ z3 ## ----->(+)---+-->| K(s) |----+-->| G(s) |----+---->| W3 |-----> ## ^ - +--------+ +--------+ | +------+ ## | | ## +----------------------------------------+ ## @end group ## @end example ## @example ## @group ## +--------+ ## | |-----> z1 (p1x1) z1 = W1 e ## r (px1) ----->| P(s) |-----> z2 (p2x1) z2 = W2 u ## | |-----> z3 (p3x1) z3 = W3 y ## u (mx1) ----->| |-----> e (px1) e = r - y ## +--------+ ## @end group ## @end example ## @example ## @group ## +--------+ ## r ----->| |-----> z ## | P(s) | ## u +---->| |-----+ e ## | +--------+ | ## | | ## | +--------+ | ## +-----| K(s) |<----+ ## +--------+ ## @end group ## @end example ## ## @strong{References}@* ## [1] Skogestad, S. and Postlethwaite I. (2005) ## @cite{Multivariable Feedback Control: Analysis and Design: ## Second Edition}. Wiley. ## ## @seealso{h2syn, hinfsyn, mixsyn} ## @end deftypefn ## Author: Lukas Reichlin ## Created: December 2009 ## Version: 0.3 function P = augw (G, W1 = [], W2 = [], W3 = []) if (nargin == 0 || nargin > 4) print_usage (); endif G = ss (G); [p, m] = size (G); [W1, p1, m1] = __adjust_weighting__ (W1, p); [W2, p2, m2] = __adjust_weighting__ (W2, m); [W3, p3, m3] = __adjust_weighting__ (W3, p); ## Pr = [1; 0; 0; 1]; ## Pu = [-1; 0; 1; -1]*G + [0; 1; 0; 0]; Pr = ss ([eye(m1,p) ; zeros(m2,p); zeros(m3,p); eye(p,p) ]); Pu1 = ss ([-eye(m1,p) ; zeros(m2,p); eye(m3,p) ; -eye(p,p) ]); Pu2 = ss ([zeros(m1,m); eye(m2,m) ; zeros(m3,m); zeros(p,m) ]); Pu = Pu1 * G + Pu2; P = append (W1, W2, W3, eye (p, p)) * [Pr, Pu]; P = mktito (P, p, m); endfunction function [W, p, m] = __adjust_weighting__ (W, s) W = ss (W); [p, m] = size (W); if (m == 0 || m == s) # model is empty or has s inputs return; elseif (m == 1) # model is SISO or SIMO tmp = W; for k = 2 : s W = append (W, tmp); # stack single-input model s times endfor [p, m] = size (W); # weighting function now of correct size else # model is MIMO or MISO error ("augw: %s must have 1 or %d inputs", inputname (1), s); endif endfunction control/inst/BMWengine.m0000644000076500000240000000672112273411257014520 0ustar lukasstaff## -*- texinfo -*- ## @deftypefn{Function File} {@var{sys} =} BMWengine () ## @deftypefnx{Function File} {@var{sys} =} BMWengine (@var{"scaled"}) ## @deftypefnx{Function File} {@var{sys} =} BMWengine (@var{"unscaled"}) ## Model of the BMW 4-cylinder engine at ETH Zurich's control laboratory. ## @example ## @group ## OPERATING POINT ## Drosselklappenstellung alpha_DK = 10.3 Grad ## Saugrohrdruck p_s = 0.48 bar ## Motordrehzahl n = 860 U/min ## Lambda-Messwert lambda = 1.000 ## Relativer Wandfilminhalt nu = 1 ## @end group ## @end example ## @example ## @group ## INPUTS ## U_1 Sollsignal Drosselklappenstellung [Grad] ## U_2 Relative Einspritzmenge [-] ## U_3 Zuendzeitpunkt [Grad KW] ## M_L Lastdrehmoment [Nm] ## @end group ## @end example ## @example ## @group ## STATES ## X_1 Drosselklappenstellung [Grad] ## X_2 Saugrohrdruck [bar] ## X_3 Motordrehzahl [U/min] ## X_4 Messwert Lamba-Sonde [-] ## X_5 Relativer Wandfilminhalt [-] ## @end group ## @end example ## @example ## @group ## OUTPUTS ## Y_1 Motordrehzahl [U/min] ## Y_2 Messwert Lambda-Sonde [-] ## @end group ## @end example ## @example ## @group ## SCALING ## U_1N, X_1N 1 Grad ## U_2N, X_4N, X_5N, Y_2N 0.05 ## U_3N 1.6 Grad KW ## X_2N 0.05 bar ## X_3N, Y_1N 200 U/min ## @end group ## @end example ## @end deftypefn ## Author: Lukas Reichlin ## Created: January 2010 ## Version: 0.1.1 ## TODO: translate German terminology function sys = BMWengine (flg = "scaled") if (nargin > 1) print_usage (); endif switch (tolower (flg)) case "unscaled" ## Linearisiertes Modell, nicht skaliert Apu = [ -40.0000 0 0 0 0 0.1683 -2.9471 -0.0016 0 0 26.6088 920.3932 -0.1756 0 259.1700 -0.5852 14.1941 0.0061 -5.7000 -5.7000 0.6600 -1.1732 -0.0052 0 -15.0000 ]; Bpu = [ 40.0000 0 0 0 0 0 0 181.4190 1.5646 0 -3.9900 0 0 4.5000 0 ]; Bdpu = [ 0 0 -15.9000 0 0 ]; Cpu = [ 0 0 1 0 0 0 0 0 1 0 ]; sys = ss (Apu, [Bpu, Bdpu], Cpu); case "scaled" ## Skaliertes Zustandsraummodell Ap = [ -40.0000 0 0 0 0 3.3659 -2.9471 -6.5157 0 0 0.1330 0.2301 -0.1756 0 0.0648 -11.7043 14.1941 24.3930 -5.7000 -5.7000 13.2003 -1.1732 -20.9844 0 -15.0000 ]; Bp = [ 40.0000 0 0 0 0 0 0 0.0454 0.0125 0 -3.9900 0 0 4.5000 0 ]; Bdp = [ 0 0 -1.5900 0 0 ]; Cp = [ 0 0 1 0 0 0 0 0 1 0 ]; sys = ss (Ap, [Bp, Bdp], Cp, [], "scaled", true); otherwise print_usage (); endswitch endfunction control/inst/bode.m0000644000076500000240000000761412273411257013620 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {} bode (@var{sys}) ## @deftypefnx {Function File} {} bode (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) ## @deftypefnx {Function File} {} bode (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{w}) ## @deftypefnx {Function File} {} bode (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) ## @deftypefnx {Function File} {[@var{mag}, @var{pha}, @var{w}] =} bode (@var{sys}) ## @deftypefnx {Function File} {[@var{mag}, @var{pha}, @var{w}] =} bode (@var{sys}, @var{w}) ## Bode diagram of frequency response. If no output arguments are given, ## the response is printed on the screen. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. Must be a single-input and single-output (SISO) system. ## @item w ## Optional vector of frequency values. If @var{w} is not specified, ## it is calculated by the zeros and poles of the system. ## Alternatively, the cell @code{@{wmin, wmax@}} specifies a frequency range, ## where @var{wmin} and @var{wmax} denote minimum and maximum frequencies ## in rad/s. ## @item 'style' ## Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted ## black line. See @command{help plot} for details. ## @end table ## ## @strong{Outputs} ## @table @var ## @item mag ## Vector of magnitude. Has length of frequency vector @var{w}. ## @item pha ## Vector of phase. Has length of frequency vector @var{w}. ## @item w ## Vector of frequency values used. ## @end table ## ## @seealso{nichols, nyquist, sigma} ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2009 ## Version: 0.5 function [mag_r, pha_r, w_r] = bode (varargin) if (nargin == 0) print_usage (); endif [H, w] = __frequency_response__ (varargin, false, "std", false); H = cellfun (@reshape, H, {[]}, {1}, "uniformoutput", false); mag = cellfun (@abs, H, "uniformoutput", false); pha = cellfun (@(H) unwrap (arg (H)) * 180 / pi, H, "uniformoutput", false); if (! nargout) mag_db = cellfun (@(mag) 20 * log10 (mag), mag, "uniformoutput", false); tmp = cellfun (@isa, varargin, {"lti"}); sys_idx = find (tmp); tmp = cellfun (@ischar, varargin); style_idx = find (tmp); len = numel (H); mag_args = {}; pha_args = {}; legend_args = {}; for k = 1:len if (k == len) lim = nargin; else lim = sys_idx(k+1); endif style = varargin(style_idx(style_idx > sys_idx(k) & style_idx <= lim)); mag_args = cat (2, mag_args, w(k), mag_db(k), style); pha_args = cat (2, pha_args, w(k), pha(k), style); try legend_args = cat (2, legend_args, inputname(sys_idx(k))); # watch out for bode (lticell{:}) end_try_catch endfor subplot (2, 1, 1) semilogx (mag_args{:}) axis ("tight") ylim (__axis_margin__ (ylim)) grid ("on") title ("Bode Diagram") ylabel ("Magnitude [dB]") subplot (2, 1, 2) semilogx (pha_args{:}) axis ("tight") ylim (__axis_margin__ (ylim)) grid ("on") xlabel ("Frequency [rad/s]") ylabel ("Phase [deg]") legend (legend_args) else mag_r = mag{1}; pha_r = pha{1}; w_r = w{1}; endif endfunction control/inst/bodemag.m0000644000076500000240000000676712273411257014315 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {} bodemag (@var{sys}) ## @deftypefnx {Function File} {} bodemag (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) ## @deftypefnx {Function File} {} bodemag (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{w}) ## @deftypefnx {Function File} {} bodemag (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) ## @deftypefnx {Function File} {[@var{mag}, @var{w}] =} bodemag (@var{sys}) ## @deftypefnx {Function File} {[@var{mag}, @var{w}] =} bodemag (@var{sys}, @var{w}) ## Bode magnitude diagram of frequency response. If no output arguments are given, ## the response is printed on the screen. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. Must be a single-input and single-output (SISO) system. ## @item w ## Optional vector of frequency values. If @var{w} is not specified, ## it is calculated by the zeros and poles of the system. ## Alternatively, the cell @code{@{wmin, wmax@}} specifies a frequency range, ## where @var{wmin} and @var{wmax} denote minimum and maximum frequencies ## in rad/s. ## @item 'style' ## Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted ## black line. See @command{help plot} for details. ## @end table ## ## @strong{Outputs} ## @table @var ## @item mag ## Vector of magnitude. Has length of frequency vector @var{w}. ## @item w ## Vector of frequency values used. ## @end table ## ## @seealso{bode, nichols, nyquist, sigma} ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2009 ## Version: 0.5 function [mag_r, w_r] = bodemag (varargin) if (nargin == 0) print_usage (); endif [H, w] = __frequency_response__ (varargin, false, "std"); H = cellfun (@reshape, H, {[]}, {1}, "uniformoutput", false); mag = cellfun (@abs, H, "uniformoutput", false); if (! nargout) mag_db = cellfun (@(mag) 20 * log10 (mag), mag, "uniformoutput", false); tmp = cellfun (@isa, varargin, {"lti"}); sys_idx = find (tmp); tmp = cellfun (@ischar, varargin); style_idx = find (tmp); len = numel (H); mag_args = {}; legend_args = {}; for k = 1:len if (k == len) lim = nargin; else lim = sys_idx(k+1); endif style = varargin(style_idx(style_idx > sys_idx(k) & style_idx <= lim)); mag_args = cat (2, mag_args, w(k), mag_db(k), style); try legend_args = cat (2, legend_args, inputname(sys_idx(k))); # watch out for bodemag (lticell{:}) end_try_catch endfor semilogx (mag_args{:}) axis ("tight") ylim (__axis_margin__ (ylim)) grid ("on") title ("Bode Magnitude Diagram") xlabel ("Frequency [rad/s]") ylabel ("Magnitude [dB]") legend (legend_args) else mag_r = mag{1}; w_r = w{1}; endif endfunction control/inst/Boeing707.m0000644000076500000240000000433312273411257014343 0ustar lukasstaff## Copyright (C) 1997, 2000, 2004, 2005, 2006, 2007 Kai P. Mueller ## ## ## 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; see the file COPYING. If not, see ## . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} Boeing707 () ## Creates a linearized state-space model of a Boeing 707-321 aircraft ## at @var{v}=80 m/s ## @iftex ## @tex ## ($M = 0.26$, $G_{a0} = -3^{\\circ}$, ${\\alpha}_0 = 4^{\\circ}$, ${\\kappa}= 50^{\\circ}$). ## @end tex ## @end iftex ## @ifnottex ## (@var{M} = 0.26, @var{Ga0} = -3 deg, @var{alpha0} = 4 deg, @var{kappa} = 50 deg). ## @end ifnottex ## ## System inputs: (1) thrust and (2) elevator angle. ## ## System outputs: (1) airspeed and (2) pitch angle. ## ## @strong{Reference}: R. Brockhaus: @cite{Flugregelung} (Flight ## Control), Springer, 1994. ## @end deftypefn ## Author: Kai P. Mueller ## Created: September 28, 1997 function outsys = Boeing707 () if (nargin != 0) print_usage (); endif a = [-0.46E-01, 0.10681415316, 0.0, -0.17121680433; -0.1675901504661613, -0.515, 1.0, 0.6420630320636088E-02; 0.1543104215347786, -0.547945, -0.906, -0.1521689385990753E-02; 0.0, 0.0, 1.0, 0.0]; b = [0.1602300107479095, 0.2111848453E-02; 0.8196877780963616E-02, -0.3025E-01; 0.9173594317692437E-01, -0.75283075; 0.0, 0.0]; c = [1.0, 0.0, 0.0, 0.0; 0.0, 0.0, 0.0, 1.0]; d = zeros (2, 2); inam = {"thrust"; "rudder"}; onam = {"speed"; "pitch"}; ## snam = {"x1"; "x2"; "x3"; "x4"}; outsys = ss (a, b, c, d, "inname", inam, "outname", onam); endfunction control/inst/bstmodred.m0000644000076500000240000003037712273411257014674 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{Gr}, @var{info}] =} bstmodred (@var{G}, @dots{}) ## @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} bstmodred (@var{G}, @var{nr}, @dots{}) ## @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} bstmodred (@var{G}, @var{opt}, @dots{}) ## @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} bstmodred (@var{G}, @var{nr}, @var{opt}, @dots{}) ## ## Model order reduction by Balanced Stochastic Truncation (BST) method. ## The aim of model reduction is to find an @acronym{LTI} system @var{Gr} of order ## @var{nr} (nr < n) such that the input-output behaviour of @var{Gr} ## approximates the one from original system @var{G}. ## ## BST is a relative error method which tries to minimize ## @iftex ## @tex ## $$ || G^{-1} (G-G_r) ||_{\\infty} = \\min $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## -1 ## ||G (G-Gr)|| = min ## inf ## @end example ## @end ifnottex ## ## ## ## @strong{Inputs} ## @table @var ## @item G ## @acronym{LTI} model to be reduced. ## @item nr ## The desired order of the resulting reduced order system @var{Gr}. ## If not specified, @var{nr} is chosen automatically according ## to the description of key @var{'order'}. ## @item @dots{} ## Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. ## @item opt ## Optional struct with keys as field names. ## Struct @var{opt} can be created directly or ## by command @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. ## @end table ## ## @strong{Outputs} ## @table @var ## @item Gr ## Reduced order state-space model. ## @item info ## Struct containing additional information. ## @table @var ## @item info.n ## The order of the original system @var{G}. ## @item info.ns ## The order of the @var{alpha}-stable subsystem of the original system @var{G}. ## @item info.hsv ## The Hankel singular values of the phase system corresponding ## to the @var{alpha}-stable part of the original system @var{G}. ## The @var{ns} Hankel singular values are ordered decreasingly. ## @item info.nu ## The order of the @var{alpha}-unstable subsystem of both the original ## system @var{G} and the reduced-order system @var{Gr}. ## @item info.nr ## The order of the obtained reduced order system @var{Gr}. ## @end table ## @end table ## ## @strong{Option Keys and Values} ## @table @var ## @item 'order', 'nr' ## The desired order of the resulting reduced order system @var{Gr}. ## If not specified, @var{nr} is the sum of NU and the number of ## Hankel singular values greater than @code{MAX(TOL1,NS*EPS)}; ## @var{nr} can be further reduced to ensure that ## @code{HSV(NR-NU) > HSV(NR+1-NU)}. ## ## @item 'method' ## Approximation method for the H-infinity norm. ## Valid values corresponding to this key are: ## @table @var ## @item 'sr-bta', 'b' ## Use the square-root Balance & Truncate method. ## @item 'bfsr-bta', 'f' ## Use the balancing-free square-root Balance & Truncate method. Default method. ## @item 'sr-spa', 's' ## Use the square-root Singular Perturbation Approximation method. ## @item 'bfsr-spa', 'p' ## Use the balancing-free square-root Singular Perturbation Approximation method. ## @end table ## ## @item 'alpha' ## Specifies the ALPHA-stability boundary for the eigenvalues ## of the state dynamics matrix @var{G.A}. For a continuous-time ## system, ALPHA <= 0 is the boundary value for ## the real parts of eigenvalues, while for a discrete-time ## system, 0 <= ALPHA <= 1 represents the ## boundary value for the moduli of eigenvalues. ## The ALPHA-stability domain does not include the boundary. ## Default value is 0 for continuous-time systems and ## 1 for discrete-time systems. ## ## @item 'beta' ## Use @code{[G, beta*I]} as new system @var{G} to combine ## absolute and relative error methods. ## BETA > 0 specifies the absolute/relative error weighting ## parameter. A large positive value of BETA favours the ## minimization of the absolute approximation error, while a ## small value of BETA is appropriate for the minimization ## of the relative error. ## BETA = 0 means a pure relative error method and can be ## used only if rank(G.D) = rows(G.D) which means that ## the feedthrough matrice must not be rank-deficient. ## Default value is 0. ## ## @item 'tol1' ## If @var{'order'} is not specified, @var{tol1} contains the tolerance for ## determining the order of reduced system. ## For model reduction, the recommended value of @var{tol1} lies ## in the interval [0.00001, 0.001]. @var{tol1} < 1. ## If @var{tol1} <= 0 on entry, the used default value is ## @var{tol1} = NS*EPS, where NS is the number of ## ALPHA-stable eigenvalues of A and EPS is the machine ## precision. ## If @var{'order'} is specified, the value of @var{tol1} is ignored. ## ## @item 'tol2' ## The tolerance for determining the order of a minimal ## realization of the phase system (see METHOD) corresponding ## to the ALPHA-stable part of the given system. ## The recommended value is TOL2 = NS*EPS. TOL2 <= TOL1 < 1. ## This value is used by default if @var{'tol2'} is not specified ## or if TOL2 <= 0 on entry. ## ## @item 'equil', 'scale' ## Boolean indicating whether equilibration (scaling) should be ## performed on system @var{G} prior to order reduction. ## Default value is true if @code{G.scaled == false} and ## false if @code{G.scaled == true}. ## Note that for @acronym{MIMO} models, proper scaling of both inputs and outputs ## is of utmost importance. The input and output scaling can @strong{not} ## be done by the equilibration option or the @command{prescale} command ## because these functions perform state transformations only. ## Furthermore, signals should not be scaled simply to a certain range. ## For all inputs (or outputs), a certain change should be of the same ## importance for the model. ## @end table ## ## ## BST is often suitable to perform model reduction in order to obtain ## low order design models for controller synthesis. ## ## Approximation Properties: ## @itemize @bullet ## @item ## Guaranteed stability of reduced models ## @item ## Approximates simultaneously gain and phase ## @item ## Preserves non-minimum phase zeros ## @item ## Guaranteed a priori error bound ## @iftex ## @tex ## $$ || G^{-1} (G-G_r) ||_{\\infty} \\leq 2 \\sum_{j=r+1}^{n} {1+\\sigma_j \\over 1-\\sigma_j} - 1 $$ ## @end tex ## @end iftex ## @end itemize ## ## @strong{Algorithm}@* ## Uses SLICOT AB09HD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2011 ## Version: 0.1 function [Gr, info] = bstmodred (G, varargin) if (nargin == 0) print_usage (); endif if (! isa (G, "lti")) error ("bstmodred: first argument must be an LTI system"); endif if (nargin > 1) # bstmodred (G, ...) if (is_real_scalar (varargin{1})) # bstmodred (G, nr) varargin = horzcat (varargin(2:end), {"order"}, varargin(1)); endif if (isstruct (varargin{1})) # bstmodred (G, opt, ...), bstmodred (G, nr, opt, ...) varargin = horzcat (__opt2cell__ (varargin{1}), varargin(2:end)); endif ## order placed at the end such that nr from bstmodred (G, nr, ...) ## and bstmodred (G, nr, opt, ...) overrides possible nr's from ## key/value-pairs and inside opt struct (later keys override former keys, ## nr > key/value > opt) endif nkv = numel (varargin); # number of keys and values if (rem (nkv, 2)) error ("bstmodred: keys and values must come in pairs"); endif [a, b, c, d, tsam, scaled] = ssdata (G); dt = isdt (G); ## default arguments alpha = __modred_default_alpha__ (dt); beta = 0; tol1 = 0; tol2 = 0; ordsel = 1; nr = 0; job = 1; ## handle keys and values for k = 1 : 2 : nkv key = lower (varargin{k}); val = varargin{k+1}; switch (key) case {"order", "nr"} [nr, ordsel] = __modred_check_order__ (val, rows (a)); case "tol1" tol1 = __modred_check_tol__ (val, "tol1"); case "tol2" tol2 = __modred_check_tol__ (val, "tol2"); case "alpha" alpha = __modred_check_alpha__ (val, dt); case "beta" if (! issample (val, 0)) error ("bstmodred: argument %s must be BETA >= 0", varargin{k}); endif beta = val; case "method" # approximation method switch (tolower (val)) case {"sr-bta", "b"} # 'B': use the square-root Balance & Truncate method job = 0; case {"bfsr-bta", "f"} # 'F': use the balancing-free square-root Balance & Truncate method job = 1; case {"sr-spa", "s"} # 'S': use the square-root Singular Perturbation Approximation method job = 2; case {"bfsr-spa", "p"} # 'P': use the balancing-free square-root Singular Perturbation Approximation method job = 3; otherwise error ("bstmodred: '%s' is an invalid approximation method", val); endswitch case {"equil", "equilibrate", "equilibration", "scale", "scaling"} scaled = __modred_check_equil__ (val); otherwise warning ("bstmodred: invalid property name '%s' ignored", key); endswitch endfor ## perform model order reduction [ar, br, cr, dr, nr, hsv, ns] = __sl_ab09hd__ (a, b, c, d, dt, scaled, job, nr, ordsel, alpha, beta, ... tol1, tol2); ## assemble reduced order model Gr = ss (ar, br, cr, dr, tsam); ## assemble info struct n = rows (a); nu = n - ns; info = struct ("n", n, "ns", ns, "hsv", hsv, "nu", nu, "nr", nr); endfunction %!shared Mo, Me, Info, HSVe %! A = [ -0.04165 0.0000 4.9200 -4.9200 0.0000 0.0000 0.0000 %! -5.2100 -12.500 0.0000 0.0000 0.0000 0.0000 0.0000 %! 0.0000 3.3300 -3.3300 0.0000 0.0000 0.0000 0.0000 %! 0.5450 0.0000 0.0000 0.0000 -0.5450 0.0000 0.0000 %! 0.0000 0.0000 0.0000 4.9200 -0.04165 0.0000 4.9200 %! 0.0000 0.0000 0.0000 0.0000 -5.2100 -12.500 0.0000 %! 0.0000 0.0000 0.0000 0.0000 0.0000 3.3300 -3.3300 ]; %! %! B = [ 0.0000 0.0000 %! 12.500 0.0000 %! 0.0000 0.0000 %! 0.0000 0.0000 %! 0.0000 0.0000 %! 0.0000 12.500 %! 0.0000 0.0000 ]; %! %! C = [ 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 1.0000 0.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 0.0000 1.0000 0.0000 0.0000 ]; %! %! D = [ 0.0000 0.0000 %! 0.0000 0.0000 %! 0.0000 0.0000 ]; %! %! G = ss (A, B, C, D, "scaled", true); %! %! [Gr, Info] = bstmodred (G, "beta", 1.0, "tol1", 0.1, "tol2", 0.0); %! [Ao, Bo, Co, Do] = ssdata (Gr); %! %! Ae = [ 1.2729 0.0000 6.5947 0.0000 -3.4229 %! 0.0000 0.8169 0.0000 2.4821 0.0000 %! -2.9889 0.0000 -2.9028 0.0000 -0.3692 %! 0.0000 -3.3921 0.0000 -3.1126 0.0000 %! -1.4767 0.0000 -2.0339 0.0000 -0.6107 ]; %! %! Be = [ 0.1331 -0.1331 %! -0.0862 -0.0862 %! -2.6777 2.6777 %! -3.5767 -3.5767 %! -2.3033 2.3033 ]; %! %! Ce = [ -0.6907 -0.6882 0.0779 0.0958 -0.0038 %! 0.0676 0.0000 0.6532 0.0000 -0.7522 %! 0.6907 -0.6882 -0.0779 0.0958 0.0038 ]; %! %! De = [ 0.0000 0.0000 %! 0.0000 0.0000 %! 0.0000 0.0000 ]; %! %! HSVe = [ 0.8803 0.8506 0.8038 0.4494 0.3973 0.0214 0.0209 ].'; %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [Ae, Be; Ce, De]; %! %!assert (Mo, Me, 1e-4); %!assert (Info.hsv, HSVe, 1e-4); control/inst/btaconred.m0000644000076500000240000002110312273411257014635 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{Kr}, @var{info}] =} btaconred (@var{G}, @var{K}, @dots{}) ## @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} btaconred (@var{G}, @var{K}, @var{ncr}, @dots{}) ## @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} btaconred (@var{G}, @var{K}, @var{opt}, @dots{}) ## @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} btaconred (@var{G}, @var{K}, @var{ncr}, @var{opt}, @dots{}) ## ## Controller reduction by frequency-weighted Balanced Truncation Approximation (BTA). ## Given a plant @var{G} and a stabilizing controller @var{K}, determine a reduced ## order controller @var{Kr} such that the closed-loop system is stable and closed-loop ## performance is retained. ## ## The algorithm tries to minimize the frequency-weighted error ## @iftex ## @tex ## $$ || V \\ (K - K_r) \\ W ||_{\\infty} = \\min $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ||V (K-Kr) W|| = min ## inf ## @end example ## @end ifnottex ## where @var{V} and @var{W} denote output and input weightings. ## ## ## @strong{Inputs} ## @table @var ## @item G ## @acronym{LTI} model of the plant. ## It has m inputs, p outputs and n states. ## @item K ## @acronym{LTI} model of the controller. ## It has p inputs, m outputs and nc states. ## @item ncr ## The desired order of the resulting reduced order controller @var{Kr}. ## If not specified, @var{ncr} is chosen automatically according ## to the description of key @var{'order'}. ## @item @dots{} ## Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. ## @item opt ## Optional struct with keys as field names. ## Struct @var{opt} can be created directly or ## by command @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. ## @end table ## ## @strong{Outputs} ## @table @var ## @item Kr ## State-space model of reduced order controller. ## @item info ## Struct containing additional information. ## @table @var ## @item info.ncr ## The order of the obtained reduced order controller @var{Kr}. ## @item info.ncs ## The order of the alpha-stable part of original controller @var{K}. ## @item info.hsvc ## The Hankel singular values of the alpha-stable part of @var{K}. ## The @var{ncs} Hankel singular values are ordered decreasingly. ## @end table ## @end table ## ## @strong{Option Keys and Values} ## @table @var ## @item 'order', 'ncr' ## The desired order of the resulting reduced order controller @var{Kr}. ## If not specified, @var{ncr} is chosen automatically such that states with ## Hankel singular values @var{info.hsvc} > @var{tol1} are retained. ## ## @item 'method' ## Order reduction approach to be used as follows: ## @table @var ## @item 'sr', 'b' ## Use the square-root Balance & Truncate method. ## @item 'bfsr', 'f' ## Use the balancing-free square-root Balance & Truncate method. Default method. ## @end table ## ## @item 'weight' ## Specifies the type of frequency-weighting as follows: ## @table @var ## @item 'none' ## No weightings are used (V = I, W = I). ## ## @item 'left', 'output' ## Use stability enforcing left (output) weighting ## @iftex ## @tex ## $$ V = (I - G K)^{-1} G, \\qquad W = I $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## -1 ## V = (I-G*K) *G , W = I ## @end example ## @end ifnottex ## ## @item 'right', 'input' ## Use stability enforcing right (input) weighting ## @iftex ## @tex ## $$ V = I, \\qquad W = (I - G K)^{-1} G $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## -1 ## V = I , W = (I-G*K) *G ## @end example ## @end ifnottex ## ## @item 'both', 'performance' ## Use stability and performance enforcing weightings ## @iftex ## @tex ## $$ V = (I - G K)^{-1} G, \\qquad W = (I - G K)^{-1} $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## -1 -1 ## V = (I-G*K) *G , W = (I-G*K) ## @end example ## @end ifnottex ## Default value. ## @end table ## ## @item 'feedback' ## Specifies whether @var{K} is a positive or negative feedback controller: ## @table @var ## @item '+' ## Use positive feedback controller. Default value. ## @item '-' ## Use negative feedback controller. ## @end table ## ## @item 'alpha' ## Specifies the ALPHA-stability boundary for the eigenvalues ## of the state dynamics matrix @var{K.A}. For a continuous-time ## controller, ALPHA <= 0 is the boundary value for ## the real parts of eigenvalues, while for a discrete-time ## controller, 0 <= ALPHA <= 1 represents the ## boundary value for the moduli of eigenvalues. ## The ALPHA-stability domain does not include the boundary. ## Default value is 0 for continuous-time controllers and ## 1 for discrete-time controllers. ## ## @item 'tol1' ## If @var{'order'} is not specified, @var{tol1} contains the tolerance for ## determining the order of the reduced controller. ## For model reduction, the recommended value of @var{tol1} is ## c*info.hsvc(1), where c lies in the interval [0.00001, 0.001]. ## Default value is info.ncs*eps*info.hsvc(1). ## If @var{'order'} is specified, the value of @var{tol1} is ignored. ## ## @item 'tol2' ## The tolerance for determining the order of a minimal ## realization of the ALPHA-stable part of the given ## controller. TOL2 <= TOL1. ## If not specified, ncs*eps*info.hsvc(1) is chosen. ## ## @item 'gram-ctrb' ## Specifies the choice of frequency-weighted controllability ## Grammian as follows: ## @table @var ## @item 'standard' ## Choice corresponding to standard Enns' method [1]. Default method. ## @item 'enhanced' ## Choice corresponding to the stability enhanced ## modified Enns' method of [2]. ## @end table ## ## @item 'gram-obsv' ## Specifies the choice of frequency-weighted observability ## Grammian as follows: ## @table @var ## @item 'standard' ## Choice corresponding to standard Enns' method [1]. Default method. ## @item 'enhanced' ## Choice corresponding to the stability enhanced ## modified Enns' method of [2]. ## @end table ## ## @item 'equil', 'scale' ## Boolean indicating whether equilibration (scaling) should be ## performed on @var{G} and @var{K} prior to order reduction. ## Default value is false if both @code{G.scaled == true, K.scaled == true} ## and true otherwise. ## Note that for @acronym{MIMO} models, proper scaling of both inputs and outputs ## is of utmost importance. The input and output scaling can @strong{not} ## be done by the equilibration option or the @command{prescale} command ## because these functions perform state transformations only. ## Furthermore, signals should not be scaled simply to a certain range. ## For all inputs (or outputs), a certain change should be of the same ## importance for the model. ## @end table ## ## @strong{Algorithm}@* ## Uses SLICOT SB16AD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## @end deftypefn ## Author: Lukas Reichlin ## Created: December 2011 ## Version: 0.1 function [Kr, info] = btaconred (varargin) [Kr, info] = __conred_sb16ad__ ("bta", varargin{:}); endfunction %!shared Mo, Me, Info, HSVCe %! A = [ -1. 0. 4. %! 0. 2. 0. %! 0. 0. -3. ]; %! %! B = [ 1. %! 1. %! 1. ]; %! %! C = [ 1. 1. 1. ]; %! %! D = [ 0. ]; %! %! G = ss (A, B, C, D, "scaled", true); %! %! AC = [ -26.4000, 6.4023, 4.3868; %! 32.0000, 0, 0; %! 0, 8.0000, 0 ]; %! %! BC = [ -16 %! 0 %! 0 ]; %! %! CC = [ 9.2994 1.1624 0.1090 ]; %! %! DC = [ 0 ]; %! %! K = ss (AC, BC, CC, DC, "scaled", true); %! %! [Kr, Info] = btaconred (G, K, 2, "weight", "input", "feedback", "+"); %! [Ao, Bo, Co, Do] = ssdata (Kr); %! %! Ae = [ 9.1900 0.0000 %! 0.0000 -34.5297 ]; %! %! Be = [ -11.9593 %! 86.3137 ]; %! %! Ce = [ 2.8955 -1.3566 ]; %! %! De = [ 0.0000 ]; %! %! HSVCe = [ 3.8253 0.2005 ].'; %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [Ae, Be; Ce, De]; %! %!assert (Mo, Me, 1e-4); %!assert (Info.hsvc, HSVCe, 1e-4); control/inst/btamodred.m0000644000076500000240000002373112273411257014646 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{Gr}, @var{info}] =} btamodred (@var{G}, @dots{}) ## @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} btamodred (@var{G}, @var{nr}, @dots{}) ## @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} btamodred (@var{G}, @var{opt}, @dots{}) ## @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} btamodred (@var{G}, @var{nr}, @var{opt}, @dots{}) ## ## Model order reduction by frequency weighted Balanced Truncation Approximation (BTA) method. ## The aim of model reduction is to find an @acronym{LTI} system @var{Gr} of order ## @var{nr} (nr < n) such that the input-output behaviour of @var{Gr} ## approximates the one from original system @var{G}. ## ## BTA is an absolute error method which tries to minimize ## @iftex ## @tex ## $$ || G - G_r ||_{\\infty} = \\min $$ ## $$ || V \\ (G - G_r) \\ W ||_{\\infty} = \\min $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ||G-Gr|| = min ## inf ## ## ||V (G-Gr) W|| = min ## inf ## @end example ## @end ifnottex ## where @var{V} and @var{W} denote output and input weightings. ## ## ## @strong{Inputs} ## @table @var ## @item G ## @acronym{LTI} model to be reduced. ## @item nr ## The desired order of the resulting reduced order system @var{Gr}. ## If not specified, @var{nr} is chosen automatically according ## to the description of key @var{'order'}. ## @item @dots{} ## Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. ## @item opt ## Optional struct with keys as field names. ## Struct @var{opt} can be created directly or ## by command @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. ## @end table ## ## @strong{Outputs} ## @table @var ## @item Gr ## Reduced order state-space model. ## @item info ## Struct containing additional information. ## @table @var ## @item info.n ## The order of the original system @var{G}. ## @item info.ns ## The order of the @var{alpha}-stable subsystem of the original system @var{G}. ## @item info.hsv ## The Hankel singular values of the @var{alpha}-stable part of ## the original system @var{G}, ordered decreasingly. ## @item info.nu ## The order of the @var{alpha}-unstable subsystem of both the original ## system @var{G} and the reduced-order system @var{Gr}. ## @item info.nr ## The order of the obtained reduced order system @var{Gr}. ## @end table ## @end table ## ## ## @strong{Option Keys and Values} ## @table @var ## @item 'order', 'nr' ## The desired order of the resulting reduced order system @var{Gr}. ## If not specified, @var{nr} is chosen automatically such that states with ## Hankel singular values @var{info.hsv} > @var{tol1} are retained. ## ## @item 'left', 'output' ## @acronym{LTI} model of the left/output frequency weighting @var{V}. ## Default value is an identity matrix. ## ## @item 'right', 'input' ## @acronym{LTI} model of the right/input frequency weighting @var{W}. ## Default value is an identity matrix. ## ## @item 'method' ## Approximation method for the L-infinity norm to be used as follows: ## @table @var ## @item 'sr', 'b' ## Use the square-root Balance & Truncate method. ## @item 'bfsr', 'f' ## Use the balancing-free square-root Balance & Truncate method. Default method. ## @end table ## ## @item 'alpha' ## Specifies the ALPHA-stability boundary for the eigenvalues ## of the state dynamics matrix @var{G.A}. For a continuous-time ## system, ALPHA <= 0 is the boundary value for ## the real parts of eigenvalues, while for a discrete-time ## system, 0 <= ALPHA <= 1 represents the ## boundary value for the moduli of eigenvalues. ## The ALPHA-stability domain does not include the boundary. ## Default value is 0 for continuous-time systems and ## 1 for discrete-time systems. ## ## @item 'tol1' ## If @var{'order'} is not specified, @var{tol1} contains the tolerance for ## determining the order of the reduced model. ## For model reduction, the recommended value of @var{tol1} is ## c*info.hsv(1), where c lies in the interval [0.00001, 0.001]. ## Default value is info.ns*eps*info.hsv(1). ## If @var{'order'} is specified, the value of @var{tol1} is ignored. ## ## @item 'tol2' ## The tolerance for determining the order of a minimal ## realization of the ALPHA-stable part of the given ## model. TOL2 <= TOL1. ## If not specified, ns*eps*info.hsv(1) is chosen. ## ## @item 'gram-ctrb' ## Specifies the choice of frequency-weighted controllability ## Grammian as follows: ## @table @var ## @item 'standard' ## Choice corresponding to a combination method [4] ## of the approaches of Enns [1] and Lin-Chiu [2,3]. Default method. ## @item 'enhanced' ## Choice corresponding to the stability enhanced ## modified combination method of [4]. ## @end table ## ## @item 'gram-obsv' ## Specifies the choice of frequency-weighted observability ## Grammian as follows: ## @table @var ## @item 'standard' ## Choice corresponding to a combination method [4] ## of the approaches of Enns [1] and Lin-Chiu [2,3]. Default method. ## @item 'enhanced' ## Choice corresponding to the stability enhanced ## modified combination method of [4]. ## @end table ## ## @item 'alpha-ctrb' ## Combination method parameter for defining the ## frequency-weighted controllability Grammian. ## abs(alphac) <= 1. ## If alphac = 0, the choice of ## Grammian corresponds to the method of Enns [1], while if ## alphac = 1, the choice of Grammian corresponds ## to the method of Lin and Chiu [2,3]. ## Default value is 0. ## ## @item 'alpha-obsv' ## Combination method parameter for defining the ## frequency-weighted observability Grammian. ## abs(alphao) <= 1. ## If alphao = 0, the choice of ## Grammian corresponds to the method of Enns [1], while if ## alphao = 1, the choice of Grammian corresponds ## to the method of Lin and Chiu [2,3]. ## Default value is 0. ## ## @item 'equil', 'scale' ## Boolean indicating whether equilibration (scaling) should be ## performed on system @var{G} prior to order reduction. ## This is done by state transformations. ## Default value is true if @code{G.scaled == false} and ## false if @code{G.scaled == true}. ## Note that for @acronym{MIMO} models, proper scaling of both inputs and outputs ## is of utmost importance. The input and output scaling can @strong{not} ## be done by the equilibration option or the @command{prescale} command ## because these functions perform state transformations only. ## Furthermore, signals should not be scaled simply to a certain range. ## For all inputs (or outputs), a certain change should be of the same ## importance for the model. ## @end table ## ## ## Approximation Properties: ## @itemize @bullet ## @item ## Guaranteed stability of reduced models ## @item ## Lower guaranteed error bound ## @item ## Guaranteed a priori error bound ## @iftex ## @tex ## $$ \\sigma_{r+1} \\leq || (G-G_r) ||_{\\infty} \\leq 2 \\sum_{j=r+1}^{n} \\sigma_j $$ ## @end tex ## @end iftex ## @end itemize ## ## ## @strong{References}@* ## [1] Enns, D. ## @cite{Model reduction with balanced realizations: An error bound ## and a frequency weighted generalization}. ## Proc. 23-th CDC, Las Vegas, pp. 127-132, 1984. ## ## [2] Lin, C.-A. and Chiu, T.-Y. ## @cite{Model reduction via frequency-weighted balanced realization}. ## Control Theory and Advanced Technology, vol. 8, ## pp. 341-351, 1992. ## ## [3] Sreeram, V., Anderson, B.D.O and Madievski, A.G. ## @cite{New results on frequency weighted balanced reduction ## technique}. ## Proc. ACC, Seattle, Washington, pp. 4004-4009, 1995. ## ## [4] Varga, A. and Anderson, B.D.O. ## @cite{Square-root balancing-free methods for the frequency-weighted ## balancing related model reduction}. ## (report in preparation) ## ## ## @strong{Algorithm}@* ## Uses SLICOT AB09ID by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2011 ## Version: 0.1 function [Gr, info] = btamodred (varargin) [Gr, info] = __modred_ab09id__ ("bta", varargin{:}); endfunction %!shared Mo, Me, Info, HSVe %! A = [ -26.4000, 6.4023, 4.3868; %! 32.0000, 0, 0; %! 0, 8.0000, 0 ]; %! %! B = [ 16 %! 0 %! 0 ]; %! %! C = [ 9.2994 1.1624 0.1090 ]; %! %! D = [ 0 ]; %! %! G = ss (A, B, C, D); % "scaled", false %! %! AV = [ -1.0000, 0, 4.0000, -9.2994, -1.1624, -0.1090; %! 0, 2.0000, 0, -9.2994, -1.1624, -0.1090; %! 0, 0, -3.0000, -9.2994, -1.1624, -0.1090; %! 16.0000, 16.0000, 16.0000, -26.4000, 6.4023, 4.3868; %! 0, 0, 0, 32.0000, 0, 0; %! 0, 0, 0, 0, 8.0000, 0 ]; %! %! BV = [ 1 %! 1 %! 1 %! 0 %! 0 %! 0 ]; %! %! CV = [ 1 1 1 0 0 0 ]; %! %! DV = [ 0 ]; %! %! V = ss (AV, BV, CV, DV); %! %! [Gr, Info] = btamodred (G, 2, "left", V); %! [Ao, Bo, Co, Do] = ssdata (Gr); %! %! Ae = [ 9.1900 0.0000 %! 0.0000 -34.5297 ]; %! %! Be = [ 11.9593 %! 16.9329 ]; %! %! Ce = [ 2.8955 6.9152 ]; %! %! De = [ 0.0000 ]; %! %! HSVe = [ 3.8253 0.2005 ].'; %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [Ae, Be; Ce, De]; %! %!assert (Mo, Me, 1e-4); %!assert (Info.hsv, HSVe, 1e-4); control/inst/care.m0000644000076500000240000001501012273411257013606 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{x}, @var{l}, @var{g}] =} care (@var{a}, @var{b}, @var{q}, @var{r}) ## @deftypefnx {Function File} {[@var{x}, @var{l}, @var{g}] =} care (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}) ## @deftypefnx {Function File} {[@var{x}, @var{l}, @var{g}] =} care (@var{a}, @var{b}, @var{q}, @var{r}, @var{[]}, @var{e}) ## @deftypefnx {Function File} {[@var{x}, @var{l}, @var{g}] =} care (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}, @var{e}) ## Solve continuous-time algebraic Riccati equation (ARE). ## ## @strong{Inputs} ## @table @var ## @item a ## Real matrix (n-by-n). ## @item b ## Real matrix (n-by-m). ## @item q ## Real matrix (n-by-n). ## @item r ## Real matrix (m-by-m). ## @item s ## Optional real matrix (n-by-m). If @var{s} is not specified, a zero matrix is assumed. ## @item e ## Optional descriptor matrix (n-by-n). If @var{e} is not specified, an identity matrix is assumed. ## @end table ## ## @strong{Outputs} ## @table @var ## @item x ## Unique stabilizing solution of the continuous-time Riccati equation (n-by-n). ## @item l ## Closed-loop poles (n-by-1). ## @item g ## Corresponding gain matrix (m-by-n). ## @end table ## ## @strong{Equations} ## @example ## @group ## -1 ## A'X + XA - XB R B'X + Q = 0 ## ## -1 ## A'X + XA - (XB + S) R (B'X + S') + Q = 0 ## ## -1 ## G = R B'X ## ## -1 ## G = R (B'X + S') ## ## L = eig (A - B*G) ## @end group ## @end example ## @example ## @group ## -1 ## A'XE + E'XA - E'XB R B'XE + Q = 0 ## ## -1 ## A'XE + E'XA - (E'XB + S) R (B'XE + S') + Q = 0 ## ## -1 ## G = R B'XE ## ## -1 ## G = R (B'XE + S) ## ## L = eig (A - B*G, E) ## @end group ## @end example ## ## @strong{Algorithm}@* ## Uses SLICOT SB02OD and SG02AD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @seealso{dare, lqr, dlqr, kalman} ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2009 ## Version: 0.5.1 function [x, l, g] = care (a, b, q, r, s = [], e = []) ## TODO: extract feedback matrix g from SB02OD (and SG02AD) if (nargin < 4 || nargin > 6) print_usage (); endif if (! is_real_square_matrix (a, q, r)) ## error ("care: a, q, r must be real and square"); error ("care: %s, %s, %s must be real and square", ... inputname (1), inputname (3), inputname (4)); endif if (! is_real_matrix (b) || rows (a) != rows (b)) ## error ("care: a and b must have the same number of rows"); error ("care: %s and %s must have the same number of rows", ... inputname (1), inputname (2)); endif if (columns (r) != columns (b)) ## error ("care: b and r must have the same number of columns"); error ("care: %s and %s must have the same number of columns", ... inputname (2), inputname (4)); endif if (! is_real_matrix (s) && ! size_equal (s, b)) ## error ("care: s(%dx%d) must be real and identically dimensioned with b(%dx%d)", ## rows (s), columns (s), rows (b), columns (b)); error ("care: %s(%dx%d) must be real and identically dimensioned with %s(%dx%d)", ... inputname (5), rows (s), columns (s), inputname (2), rows (b), columns (b)); endif if (! isempty (e) && (! is_real_square_matrix (e) || ! size_equal (e, a))) ## error ("care: a and e must have the same number of rows"); error ("care: %s and %s must have the same number of rows", ... inputname (1), inputname (6)); endif ## check stabilizability if (! isstabilizable (a, b, e, [], 0)) ## error ("care: (a, b) not stabilizable"); error ("care: (%s, %s) not stabilizable", ... inputname (1), inputname (2)); endif ## check positive semi-definiteness if (isempty (s)) t = zeros (size (b)); else t = s; endif m = [q, t; t.', r]; if (isdefinite (m) < 0) ## error ("care: require [q, s; s.', r] >= 0"); error ("care: require [%s, %s; %s.', %s] >= 0", ... inputname (3), inputname (5), inputname (5), inputname (4)); endif ## solve the riccati equation if (isempty (e)) if (isempty (s)) [x, l] = __sl_sb02od__ (a, b, q, r, b, false, false); g = r \ (b.'*x); # gain matrix else [x, l] = __sl_sb02od__ (a, b, q, r, s, false, true); g = r \ (b.'*x + s.'); # gain matrix endif else if (isempty (s)) [x, l] = __sl_sg02ad__ (a, e, b, q, r, b, false, false); g = r \ (b.'*x*e); # gain matrix else [x, l] = __sl_sg02ad__ (a, e, b, q, r, s, false, true); g = r \ (b.'*x*e + s.'); # gain matrix endif endif endfunction %!shared x, l, g, xe, le, ge %! a = [-3 2 %! 1 1]; %! %! b = [ 0 %! 1]; %! %! c = [ 1 -1]; %! %! r = 3; %! %! [x, l, g] = care (a, b, c.'*c, r); %! %! xe = [ 0.5895 1.8216 %! 1.8216 8.8188]; %! %! le = [-3.5026 %! -1.4370]; %! %! ge = [ 0.6072 2.9396]; %! %!assert (x, xe, 1e-4); %!assert (l, le, 1e-4); %!assert (g, ge, 1e-4); %!shared x, l, g, xe, le, ge %! a = [ 0.0 1.0 %! 0.0 0.0]; %! %! b = [ 0.0 %! 1.0]; %! %! c = [ 1.0 0.0 %! 0.0 1.0 %! 0.0 0.0]; %! %! d = [ 0.0 %! 0.0 %! 1.0]; %! %! [x, l, g] = care (a, b, c.'*c, d.'*d); %! %! xe = [ 1.7321 1.0000 %! 1.0000 1.7321]; %! %! le = [-0.8660 + 0.5000i %! -0.8660 - 0.5000i]; %! %! ge = [ 1.0000 1.7321]; %! %!assert (x, xe, 1e-4); %!assert (l, le, 1e-4); %!assert (g, ge, 1e-4); %!shared x, xe %! a = [ 0.0 1.0 %! 0.0 0.0 ]; %! %! e = [ 1.0 0.0 %! 0.0 1.0 ]; %! %! b = [ 0.0 %! 1.0 ]; %! %! c = [ 1.0 0.0 %! 0.0 1.0 %! 0.0 0.0 ]; %! %! d = [ 0.0 %! 0.0 %! 1.0 ]; %! %! x = care (a, b, c.'*c, d.'*d, [], e); %! %! xe = [ 1.7321 1.0000 %! 1.0000 1.7321 ]; %! %!assert (x, xe, 1e-4); control/inst/cfconred.m0000644000076500000240000002667312273411257014500 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{Kr}, @var{info}] =} cfconred (@var{G}, @var{F}, @var{L}, @dots{}) ## @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} cfconred (@var{G}, @var{F}, @var{L}, @var{ncr}, @dots{}) ## @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} cfconred (@var{G}, @var{F}, @var{L}, @var{opt}, @dots{}) ## @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} cfconred (@var{G}, @var{F}, @var{L}, @var{ncr}, @var{opt}, @dots{}) ## ## Reduction of state-feedback-observer based controller by coprime factorization (CF). ## Given a plant @var{G}, state feedback gain @var{F} and full observer gain @var{L}, ## determine a reduced order controller @var{Kr}. ## ## @strong{Inputs} ## @table @var ## @item G ## @acronym{LTI} model of the open-loop plant (A,B,C,D). ## It has m inputs, p outputs and n states. ## @item F ## Stabilizing state feedback matrix (m-by-n). ## @item L ## Stabilizing observer gain matrix (n-by-p). ## @item ncr ## The desired order of the resulting reduced order controller @var{Kr}. ## If not specified, @var{ncr} is chosen automatically according ## to the description of key @var{'order'}. ## @item @dots{} ## Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. ## @item opt ## Optional struct with keys as field names. ## Struct @var{opt} can be created directly or ## by command @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. ## @end table ## ## @strong{Outputs} ## @table @var ## @item Kr ## State-space model of reduced order controller. ## @item info ## Struct containing additional information. ## @table @var ## @item info.hsv ## The Hankel singular values of the extended system?!?. ## The @var{n} Hankel singular values are ordered decreasingly. ## @item info.ncr ## The order of the obtained reduced order controller @var{Kr}. ## @end table ## @end table ## ## @strong{Option Keys and Values} ## @table @var ## @item 'order', 'ncr' ## The desired order of the resulting reduced order controller @var{Kr}. ## If not specified, @var{ncr} is chosen automatically such that states with ## Hankel singular values @var{info.hsv} > @var{tol1} are retained. ## ## @item 'method' ## Order reduction approach to be used as follows: ## @table @var ## @item 'sr-bta', 'b' ## Use the square-root Balance & Truncate method. ## @item 'bfsr-bta', 'f' ## Use the balancing-free square-root Balance & Truncate method. Default method. ## @item 'sr-spa', 's' ## Use the square-root Singular Perturbation Approximation method. ## @item 'bfsr-spa', 'p' ## Use the balancing-free square-root Singular Perturbation Approximation method. ## @end table ## ## @item 'cf' ## Specifies whether left or right coprime factorization is ## to be used as follows: ## @table @var ## @item 'left', 'l' ## Use left coprime factorization. Default method. ## @item 'right', 'r' ## Use right coprime factorization. ## @end table ## ## @item 'feedback' ## Specifies whether @var{F} and @var{L} are fed back positively or negatively: ## @table @var ## @item '+' ## A+BK and A+LC are both Hurwitz matrices. ## @item '-' ## A-BK and A-LC are both Hurwitz matrices. Default value. ## @end table ## ## @item 'tol1' ## If @var{'order'} is not specified, @var{tol1} contains the tolerance for ## determining the order of the reduced system. ## For model reduction, the recommended value of @var{tol1} is ## c*info.hsv(1), where c lies in the interval [0.00001, 0.001]. ## Default value is n*eps*info.hsv(1). ## If @var{'order'} is specified, the value of @var{tol1} is ignored. ## ## @item 'tol2' ## The tolerance for determining the order of a minimal ## realization of the coprime factorization controller. ## TOL2 <= TOL1. ## If not specified, n*eps*info.hsv(1) is chosen. ## ## @item 'equil', 'scale' ## Boolean indicating whether equilibration (scaling) should be ## performed on system @var{G} prior to order reduction. ## Default value is true if @code{G.scaled == false} and ## false if @code{G.scaled == true}. ## Note that for @acronym{MIMO} models, proper scaling of both inputs and outputs ## is of utmost importance. The input and output scaling can @strong{not} ## be done by the equilibration option or the @command{prescale} command ## because these functions perform state transformations only. ## Furthermore, signals should not be scaled simply to a certain range. ## For all inputs (or outputs), a certain change should be of the same ## importance for the model. ## @end table ## ## @strong{Algorithm}@* ## Uses SLICOT SB16BD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## @end deftypefn ## Author: Lukas Reichlin ## Created: December 2011 ## Version: 0.1 function [Kr, info] = cfconred (G, F, L, varargin) if (nargin < 3) print_usage (); endif if (! isa (G, "lti")) error ("cfconred: first argument must be an LTI system"); endif if (! is_real_matrix (F)) error ("cfconred: second argument must be a real matrix"); endif if (! is_real_matrix (L)) error ("cfconred: third argument must be a real matrix"); endif if (nargin > 3) # cfconred (G, F, L, ...) if (is_real_scalar (varargin{1})) # cfconred (G, F, L, nr) varargin = horzcat (varargin(2:end), {"order"}, varargin(1)); endif if (isstruct (varargin{1})) # cfconred (G, F, L, opt, ...), cfconred (G, F, L, nr, opt, ...) varargin = horzcat (__opt2cell__ (varargin{1}), varargin(2:end)); endif ## order placed at the end such that nr from cfconred (G, F, L, nr, ...) ## and cfconred (G, F, L, nr, opt, ...) overrides possible nr's from ## key/value-pairs and inside opt struct (later keys override former keys, ## nr > key/value > opt) endif nkv = numel (varargin); # number of keys and values if (rem (nkv, 2)) error ("cfconred: keys and values must come in pairs"); endif [a, b, c, d, tsam, scaled] = ssdata (G); [p, m] = size (G); n = rows (a); [mf, nf] = size (F); [nl, pl] = size (L); dt = isdt (G); jobd = any (d(:)); if (mf != m || nf != n) error ("cfconred: dimensions of state-feedback matrix (%dx%d) and plant (%dx%d, %d states) don't match", ... mf, nf, p, m, n); endif if (nl != n || pl != p) error ("cfconred: dimensions of observer matrix (%dx%d) and plant (%dx%d, %d states) don't match", ... nl, pl, p, m, n); endif ## default arguments tol1 = 0.0; tol2 = 0.0; jobcf = 0; jobmr = 2; # balancing-free BTA equil = scaled; # equil: 0 means "S", 1 means "N" ordsel = 1; ncr = 0; negfb = true; # A-BK, A-LC Hurwitz ## handle keys and values for k = 1 : 2 : nkv key = lower (varargin{k}); val = varargin{k+1}; switch (key) case {"order", "ncr", "nr"} [ncr, ordsel] = __modred_check_order__ (val, n); case "tol1" tol1 = __modred_check_tol__ (val, "tol1"); case "tol2" tol2 = __modred_check_tol__ (val, "tol2"); case "cf" switch (lower (val(1))) case "l" jobcf = 0; case "r" jobcf = 1; otherwise error ("cfconred: '%s' is an invalid coprime factorization", val); endswitch case "method" # approximation method switch (tolower (val)) case {"sr-bta", "b"} # 'B': use the square-root Balance & Truncate method jobmr = 0; case {"bfsr-bta", "f"} # 'F': use the balancing-free square-root Balance & Truncate method jobmr = 1; case {"sr-spa", "s"} # 'S': use the square-root Singular Perturbation Approximation method jobmr = 2; case {"bfsr-spa", "p"} # 'P': use the balancing-free square-root Singular Perturbation Approximation method jobmr = 3; otherwise error ("cfconred: '%s' is an invalid approach", val); endswitch case {"equil", "equilibrate", "equilibration", "scale", "scaling"} equil = __modred_check_equil__ (val); case "feedback" negfb = __conred_check_feedback_sign__ (val); otherwise warning ("cfconred: invalid property name '%s' ignored", key); endswitch endfor ## A - B*F --> A + B*F ; A - L*C --> A + L*C if (negfb) F = -F; L = -L; endif ## perform model order reduction [acr, bcr, ccr, dcr, ncr, hsv] = __sl_sb16bd__ (a, b, c, d, dt, equil, ncr, ordsel, jobd, jobmr, ... F, L, jobcf, tol1, tol2); ## assemble reduced order controller Kr = ss (acr, bcr, ccr, dcr, tsam); ## assemble info struct info = struct ("ncr", ncr, "hsv", hsv); endfunction %!shared Mo, Me, Info, HSVe %! A = [ 0 1.0000 0 0 0 0 0 0 %! 0 0 0 0 0 0 0 0 %! 0 0 -0.0150 0.7650 0 0 0 0 %! 0 0 -0.7650 -0.0150 0 0 0 0 %! 0 0 0 0 -0.0280 1.4100 0 0 %! 0 0 0 0 -1.4100 -0.0280 0 0 %! 0 0 0 0 0 0 -0.0400 1.850 %! 0 0 0 0 0 0 -1.8500 -0.040 ]; %! %! B = [ 0.0260 %! -0.2510 %! 0.0330 %! -0.8860 %! -4.0170 %! 0.1450 %! 3.6040 %! 0.2800 ]; %! %! C = [ -.996 -.105 0.261 .009 -.001 -.043 0.002 -0.026 ]; %! %! D = [ 0.0 ]; %! %! G = ss (A, B, C, D); % "scaled", false %! %! F = [ 4.4721e-002 6.6105e-001 4.6986e-003 3.6014e-001 1.0325e-001 -3.7541e-002 -4.2685e-002 3.2873e-002 ]; %! %! L = [ 4.1089e-001 %! 8.6846e-002 %! 3.8523e-004 %! -3.6194e-003 %! -8.8037e-003 %! 8.4205e-003 %! 1.2349e-003 %! 4.2632e-003 ]; %! %! [Kr, Info] = cfconred (G, F, L, 4, "method", "bfsr-bta", "cf", "left", "feedback", "+"); %! [Ao, Bo, Co, Do] = ssdata (Kr); %! %! Ae = [ 0.5946 -0.7336 0.1914 -0.3368 %! 0.5960 -0.0184 -0.1088 0.0207 %! 1.2253 0.2043 0.1009 -1.4948 %! -0.0330 -0.0243 1.3440 0.0035 ]; %! %! Be = [ 0.0015 %! -0.0202 %! 0.0159 %! -0.0544 ]; %! %! Ce = [ 0.3534 0.0274 0.0337 -0.0320 ]; %! %! De = [ 0.0000 ]; %! %! HSVe = [ 4.9078 4.8745 3.8455 3.7811 1.2289 1.1785 0.5176 0.1148 ].'; %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [Ae, Be; Ce, De]; %! %!assert (Mo, Me, 1e-4); %!assert (Info.hsv, HSVe, 1e-4); control/inst/covar.m0000644000076500000240000000434512273411257014017 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{p}, @var{q}] =} covar (@var{sys}, @var{w}) ## Return the steady-state covariance. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. ## @item w ## Intensity of Gaussian white noise inputs which drive @var{sys}. ## @end table ## ## @strong{Outputs} ## @table @var ## @item p ## Output covariance. ## @item q ## State covariance. ## @end table ## ## @seealso{lyap, dlyap} ## @end deftypefn ## Author: Lukas Reichlin ## Created: January 2010 ## Version: 0.1 function [p, q] = covar (sys, w) if (nargin != 2) print_usage (); endif if (! isa (sys, "lti")) error ("covar: first argument must be an LTI model"); endif if (! isstable (sys)) error ("covar: system must be stable"); endif [a, b, c, d] = ssdata (sys); if (isct (sys)) if (any (d(:))) error ("covar: system is not strictly proper"); endif q = lyap (a, b*w*b.'); p = c*q*c.'; else q = dlyap (a, b*w*b.'); p = c*q*c.' + d*w*d.'; endif endfunction ## continuous-time %!shared p, q, p_exp, q_exp %! sys = ss (-1, 1, 1, 0); %! [p, q] = covar (sys, 5); %! p_exp = 2.5000; %! q_exp = 2.5000; %!assert (p, p_exp, 1e-4); %!assert (q, q_exp, 1e-4); ## discrete-time %!shared p, q, p_exp, q_exp %! sys = ss ([-0.2, -0.5; 1, 0], [2; 0], [1, 0.5], [0], 0.1); %! [p, q] = covar (sys, 5); %! p_exp = 30.3167; %! q_exp = [27.1493, -3.6199; -3.6199, 27.1493]; %!assert (p, p_exp, 1e-4); %!assert (q, q_exp, 1e-4); control/inst/ctrb.m0000644000076500000240000000427112273411257013635 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## Copyright (C) 2009 Luca Favatella ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{co} =} ctrb (@var{sys}) ## @deftypefnx {Function File} {@var{co} =} ctrb (@var{a}, @var{b}) ## Return controllability matrix. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. ## @item a ## State matrix (n-by-n). ## @item b ## Input matrix (n-by-m). ## @end table ## ## @strong{Outputs} ## @table @var ## @item co ## Controllability matrix. ## @end table ## ## @strong{Equation} ## @iftex ## @tex ## $$ C_o = [ B \\ \\ AB \\ \\ A^2B \\ \\ldots \\ A^{n-1}B ] $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## 2 n-1 ## Co = [ B AB A B ... A B ] ## @end example ## @end ifnottex ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.3 function co = ctrb (a, b) if (nargin == 1) # ctrb (sys) if (! isa (a, "lti")) error ("ctrb: argument must be an lti system"); endif [a, b] = ssdata (a); elseif (nargin == 2) # ctrb (a, b) if (! is_real_square_matrix (a) || ! is_real_matrix (b) || rows (a) != rows (b)) error ("ctrb: invalid arguments (a, b)"); endif else print_usage (); endif n = rows (a); # number of states k = 0:n-1; # exponents for a tmp = arrayfun (@(x) a^x*b, k, "uniformoutput", false); co = horzcat (tmp{:}); endfunction %!assert (ctrb ([1, 0; 0, -0.5], [8; 8]), [8, 8; 8, -4]); control/inst/ctrbf.m0000644000076500000240000000713712273411257014007 0ustar lukasstaff## Copyright (C) 2010 Benjamin Fernandez ## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{sysbar}, @var{T}, @var{K}] =} ctrbf (@var{sys}) ## @deftypefnx{Function File} {[@var{sysbar}, @var{T}, @var{K}] =} ctrbf (@var{sys}, @var{tol}) ## @deftypefnx{Function File} {[@var{Abar}, @var{Bbar}, @var{Cbar}, @var{T}, @var{K}] =} ctrbf (@var{A}, @var{B}, @var{C}) ## @deftypefnx{Function File} {[@var{Abar}, @var{Bbar}, @var{Cbar}, @var{T}, @var{K}] =} ctrbf (@var{A}, @var{B}, @var{C}, @var{TOL}) ## If Co=ctrb(A,B) has rank r <= n = SIZE(A,1), then there is a ## similarity transformation Tc such that Tc = [t1 t2] where t1 ## is the controllable subspace and t2 is orthogonal to t1 ## ## @example ## @group ## Abar = Tc \\ A * Tc , Bbar = Tc \\ B , Cbar = C * Tc ## @end group ## @end example ## ## and the transformed system has the form ## ## @example ## @group ## | Ac A12| | Bc | ## Abar = |----------|, Bbar = | ---|, Cbar = [Cc | Cnc]. ## | 0 Anc| | 0 | ## @end group ## @end example ## ## where (Ac,Bc) is controllable, and Cc(sI-Ac)^(-1)Bc = C(sI-A)^(-1)B. ## and the system is stabilizable if Anc has no eigenvalues in ## the right half plane. The last output K is a vector of length n ## containing the number of controllable states. ## @end deftypefn ## Author: Benjamin Fernandez ## Created: 2010-04-30 ## Version: 0.1 function [ac, bc, cc, z, ncont] = ctrbf (a, b = [], c, tol = []) if (nargin < 1 || nargin > 4) print_usage (); endif islti = isa (a, "lti"); if (islti) if (nargin > 2) print_usage (); endif sys = a; tol = b; [a, b, c] = ssdata (sys); else if (nargin < 3) print_usage (); endif sys = ss (a, b, c); [a, b, c] = ssdata (sys); endif if (isempty (tol)) tol = 0; # default tolerance elseif (! is_real_scalar (tol)) error ("ctrbf: tol must be a real scalar"); endif [ac, bc, cc, z, ncont] = __sl_tb01ud__ (a, b, c, tol); if (islti) ac = set (sys, "a", ac, "b", bc, "c", cc, "scaled", false); bc = z; cc = ncont; endif endfunction %!shared Ao, Bo, Co, Zo, Ae, Be, Ce, Ze, NCONT %! A = [ -1.0 0.0 0.0 %! -2.0 -2.0 -2.0 %! -1.0 0.0 -3.0 ]; %! %! B = [ 1.0 0.0 0.0 %! 0.0 2.0 1.0 ].'; %! %! C = [ 0.0 2.0 1.0 %! 1.0 0.0 0.0 ]; %! %! [Ao, Bo, Co, Zo, NCONT] = ctrbf (A, B, C); %! %! Ae = [ -3.0000 2.2361 %! 0.0000 -1.0000 ]; %! %! Be = [ 0.0000 -2.2361 %! 1.0000 0.0000 ]; %! %! Ce = [ -2.2361 0.0000 %! 0.0000 1.0000 ]; %! %! Ze = [ 0.0000 1.0000 0.0000 %! -0.8944 0.0000 -0.4472 %! -0.4472 0.0000 0.8944 ]; %! %!assert (Ao(1:NCONT, 1:NCONT), Ae, 1e-4); %!assert (Bo(1:NCONT, :), Be, 1e-4); %!assert (Co(:, 1:NCONT), Ce, 1e-4); %!assert (Zo, Ze, 1e-4); control/inst/dare.m0000644000076500000240000001373212273411257013620 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{x}, @var{l}, @var{g}] =} dare (@var{a}, @var{b}, @var{q}, @var{r}) ## @deftypefnx {Function File} {[@var{x}, @var{l}, @var{g}] =} dare (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}) ## @deftypefnx {Function File} {[@var{x}, @var{l}, @var{g}] =} dare (@var{a}, @var{b}, @var{q}, @var{r}, @var{[]}, @var{e}) ## @deftypefnx {Function File} {[@var{x}, @var{l}, @var{g}] =} dare (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}, @var{e}) ## Solve discrete-time algebraic Riccati equation (ARE). ## ## @strong{Inputs} ## @table @var ## @item a ## Real matrix (n-by-n). ## @item b ## Real matrix (n-by-m). ## @item q ## Real matrix (n-by-n). ## @item r ## Real matrix (m-by-m). ## @item s ## Optional real matrix (n-by-m). If @var{s} is not specified, a zero matrix is assumed. ## @item e ## Optional descriptor matrix (n-by-n). If @var{e} is not specified, an identity matrix is assumed. ## @end table ## ## @strong{Outputs} ## @table @var ## @item x ## Unique stabilizing solution of the discrete-time Riccati equation (n-by-n). ## @item l ## Closed-loop poles (n-by-1). ## @item g ## Corresponding gain matrix (m-by-n). ## @end table ## ## @strong{Equations} ## @example ## @group ## -1 ## A'XA - X - A'XB (B'XB + R) B'XA + Q = 0 ## ## -1 ## A'XA - X - (A'XB + S) (B'XB + R) (B'XA + S') + Q = 0 ## ## -1 ## G = (B'XB + R) B'XA ## ## -1 ## G = (B'XB + R) (B'XA + S') ## ## L = eig (A - B*G) ## @end group ## @end example ## @example ## @group ## -1 ## A'XA - E'XE - A'XB (B'XB + R) B'XA + Q = 0 ## ## -1 ## A'XA - E'XE - (A'XB + S) (B'XB + R) (B'XA + S') + Q = 0 ## ## -1 ## G = (B'XB + R) B'XA ## ## -1 ## G = (B'XB + R) (B'XA + S') ## ## L = eig (A - B*G, E) ## @end group ## @end example ## ## @strong{Algorithm}@* ## Uses SLICOT SB02OD and SG02AD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @seealso{care, lqr, dlqr, kalman} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.5.1 function [x, l, g] = dare (a, b, q, r, s = [], e = []) ## TODO: extract feedback matrix g from SB02OD (and SG02AD) if (nargin < 4 || nargin > 6) print_usage (); endif if (! is_real_square_matrix (a, q, r)) ## error ("dare: a, q, r must be real and square"); error ("dare: %s, %s, %s must be real and square", ... inputname (1), inputname (3), inputname (4)); endif if (! is_real_matrix (b) || rows (a) != rows (b)) ## error ("dare: a and b must have the same number of rows"); error ("dare: %s and %s must have the same number of rows", ... inputname (1), inputname (2)); endif if (columns (r) != columns (b)) ## error ("dare: b and r must have the same number of columns"); error ("dare: %s and %s must have the same number of columns", ... inputname (2), inputname (4)); endif if (! is_real_matrix (s) && ! size_equal (s, b)) ## error ("dare: s(%dx%d) must be real and identically dimensioned with b(%dx%d)", ## rows (s), columns (s), rows (b), columns (b)); error ("dare: %s(%dx%d) must be real and identically dimensioned with %s(%dx%d)", ... inputname (5), rows (s), columns (s), inputname (2), rows (b), columns (b)); endif if (! isempty (e) && (! is_real_square_matrix (e) || ! size_equal (e, a))) ## error ("dare: a and e must have the same number of rows"); error ("dare: %s and %s must have the same number of rows", ... inputname (1), inputname (6)); endif ## check stabilizability if (! isstabilizable (a, b, e, [], 1)) ## error ("dare: (a, b) not stabilizable"); error ("dare: (%s, %s) not stabilizable", ... inputname (1), inputname (2)); endif ## check positive semi-definiteness if (isempty (s)) t = zeros (size (b)); else t = s; endif m = [q, t; t.', r]; if (isdefinite (m) < 0) ## error ("dare: require [q, s; s.', r] >= 0"); error ("dare: require [%s, %s; %s.', %s] >= 0", ... inputname (3), inputname (5), inputname (5), inputname (4)); endif ## solve the riccati equation if (isempty (e)) if (isempty (s)) [x, l] = __sl_sb02od__ (a, b, q, r, b, true, false); g = (r + b.'*x*b) \ (b.'*x*a); # gain matrix else [x, l] = __sl_sb02od__ (a, b, q, r, s, true, true); g = (r + b.'*x*b) \ (b.'*x*a + s.'); # gain matrix endif else if (isempty (s)) [x, l] = __sl_sg02ad__ (a, e, b, q, r, b, true, false); g = (r + b.'*x*b) \ (b.'*x*a); # gain matrix else [x, l] = __sl_sg02ad__ (a, e, b, q, r, s, true, true); g = (r + b.'*x*b) \ (b.'*x*a + s.'); # gain matrix endif endif endfunction %!shared x, l, g, xe, le, ge %! a = [ 0.4 1.7 %! 0.9 3.8]; %! %! b = [ 0.8 %! 2.1]; %! %! c = [ 1 -1]; %! %! r = 3; %! %! [x, l, g] = dare (a, b, c.'*c, r); %! %! xe = [ 1.5354 1.2623 %! 1.2623 10.5596]; %! %! le = [-0.0022 %! 0.2454]; %! %! ge = [ 0.4092 1.7283]; %! %!assert (x, xe, 1e-4); %!assert (sort (l), sort (le), 1e-4); %!assert (g, ge, 1e-4); ## TODO: add more tests (nonempty s and/or e) control/inst/db2mag.m0000644000076500000240000000261312273411257014035 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{mag} =} db2mag (@var{db}) ## Convert Decibels (dB) to Magnitude. ## ## @strong{Inputs} ## @table @var ## @item db ## Decibel (dB) value(s). Both real-valued scalars and matrices are accepted. ## @end table ## ## @strong{Outputs} ## @table @var ## @item mag ## Magnitude value(s). ## @end table ## ## @seealso{mag2db} ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2012 ## Version: 0.1 function mag = db2mag (db) if (nargin != 1 || ! is_real_matrix (db)) print_usage (); endif mag = 10.^(db./20); endfunction %!assert (db2mag (40), 100); %!assert (db2mag (-20), 0.1); control/inst/dlqe.m0000644000076500000240000000733212273411257013631 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## Copyright (C) 2012 Megan Zagrobelny ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{m}, @var{p}, @var{z}, @var{e}] =} dlqe (@var{a}, @var{g}, @var{c}, @var{q}, @var{r}) ## @deftypefnx {Function File} {[@var{m}, @var{p}, @var{z}, @var{e}] =} dlqe (@var{a}, @var{g}, @var{c}, @var{q}, @var{r}, @var{s}) ## @deftypefnx {Function File} {[@var{m}, @var{p}, @var{z}, @var{e}] =} dlqe (@var{a}, @var{[]}, @var{c}, @var{q}, @var{r}) ## @deftypefnx {Function File} {[@var{m}, @var{p}, @var{z}, @var{e}] =} dlqe (@var{a}, @var{[]}, @var{c}, @var{q}, @var{r}, @var{s}) ## Kalman filter for discrete-time systems. ## ## @example ## @group ## x[k] = Ax[k] + Bu[k] + Gw[k] (State equation) ## y[k] = Cx[k] + Du[k] + v[k] (Measurement Equation) ## E(w) = 0, E(v) = 0, cov(w) = Q, cov(v) = R, cov(w,v) = S ## @end group ## @end example ## ## @strong{Inputs} ## @table @var ## @item a ## State transition matrix of discrete-time system (n-by-n). ## @item g ## Process noise matrix of discrete-time system (n-by-g). ## If @var{g} is empty @code{[]}, an identity matrix is assumed. ## @item c ## Measurement matrix of discrete-time system (p-by-n). ## @item q ## Process noise covariance matrix (g-by-g). ## @item r ## Measurement noise covariance matrix (p-by-p). ## @item s ## Optional cross term covariance matrix (g-by-p), s = cov(w,v). ## If @var{s} is empty @code{[]} or not specified, a zero matrix is assumed. ## @end table ## ## @strong{Outputs} ## @table @var ## @item m ## Kalman filter gain matrix (n-by-p). ## @item p ## Unique stabilizing solution of the discrete-time Riccati equation (n-by-n). ## Symmetric matrix. ## @item z ## Error covariance (n-by-n), cov(x(k|k)-x) ## @item e ## Closed-loop poles (n-by-1). ## @end table ## ## @strong{Equations} ## @example ## @group ## x[k|k] = x[k|k-1] + M(y[k] - Cx[k|k-1] - Du[k]) ## ## x[k+1|k] = Ax[k|k] + Bu[k] for S=0 ## ## x[k+1|k] = Ax[k|k] + Bu[k] + G*S*(C*P*C' + R)^-1*(y[k] - C*x[k|k-1]) for non-zero S ## ## ## E = eig(A - A*M*C) for S=0 ## ## E = eig(A - A*M*C - G*S*(C*P*C' + Rv)^-1*C) for non-zero S ## ## @end group ## @end example ## @seealso{dare, care, dlqr, lqr, lqe} ## @end deftypefn ## Author: Lukas Reichlin ## Created: April 2012 ## Version: 0.1 function [m, p, z, e] = dlqe (a, g, c, q, r, s = []) if (nargin < 5 || nargin > 6) print_usage (); endif if (isempty (g)) [p, e] = dare (a.', c.', q, r, s); # dlqe (a, [], c, q, r, s), g=I elseif (columns (g) != rows (q) || ! issquare (q)) error ("dlqe: matrices g(%dx%d) and q(%dx%d) have incompatible dimensions", ... rows (g), columns (g), rows (q), columns (q)); elseif (isempty (s)) [p, e] = dare (a.', c.', g*q*g.', r); elseif (columns (g) != rows (s)) error ("dlqe: matrices g(%dx%d) and s(%dx%d) have incompatible dimensions", ... rows (g), columns (g), rows (s), columns (s)); else [p, e] = dare (a.', c.', g*q*g.', r, g*s); endif m = p*c.' / (c*p*c.' + r); z = p - m*c*p; z = (z + z.') / 2; endfunction control/inst/dlqr.m0000644000076500000240000000606512273411257013650 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{g}, @var{x}, @var{l}] =} dlqr (@var{sys}, @var{q}, @var{r}) ## @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} dlqr (@var{sys}, @var{q}, @var{r}, @var{s}) ## @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} dlqr (@var{a}, @var{b}, @var{q}, @var{r}) ## @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} dlqr (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}) ## @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} dlqr (@var{a}, @var{b}, @var{q}, @var{r}, @var{[]}, @var{e}) ## @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} dlqr (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}, @var{e}) ## Linear-quadratic regulator for discrete-time systems. ## ## @strong{Inputs} ## @table @var ## @item sys ## Continuous or discrete-time @acronym{LTI} model (p-by-m, n states). ## @item a ## State transition matrix of discrete-time system (n-by-n). ## @item b ## Input matrix of discrete-time system (n-by-m). ## @item q ## State weighting matrix (n-by-n). ## @item r ## Input weighting matrix (m-by-m). ## @item s ## Optional cross term matrix (n-by-m). If @var{s} is not specified, a zero matrix is assumed. ## @item e ## Optional descriptor matrix (n-by-n). If @var{e} is not specified, an identity matrix is assumed. ## @end table ## ## @strong{Outputs} ## @table @var ## @item g ## State feedback matrix (m-by-n). ## @item x ## Unique stabilizing solution of the discrete-time Riccati equation (n-by-n). ## @item l ## Closed-loop poles (n-by-1). ## @end table ## ## @strong{Equations} ## @example ## @group ## x[k+1] = A x[k] + B u[k], x[0] = x0 ## ## inf ## J(x0) = SUM (x' Q x + u' R u + 2 x' S u) ## k=0 ## ## L = eig (A - B*G) ## @end group ## @end example ## @seealso{dare, care, lqr} ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2009 ## Version: 0.2 function [g, x, l] = dlqr (a, b, q, r = [], s = [], e = []) if (nargin < 3 || nargin > 6) print_usage (); endif if (isa (a, "lti")) s = r; r = q; q = b; [a, b, c, d, e, tsam] = dssdata (a, []); elseif (nargin < 4) print_usage (); else tsam = 1; # any value > 0 could be used here endif if (issample (tsam, -1)) [x, l, g] = dare (a, b, q, r, s, e); else [x, l, g] = care (a, b, q, r, s, e); endif endfunction control/inst/dlyap.m0000644000076500000240000001155712273411257014021 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {@var{x} =} dlyap (@var{a}, @var{b}) ## @deftypefnx{Function File} {@var{x} =} dlyap (@var{a}, @var{b}, @var{c}) ## @deftypefnx{Function File} {@var{x} =} dlyap (@var{a}, @var{b}, @var{[]}, @var{e}) ## Solve discrete-time Lyapunov or Sylvester equations. ## ## @strong{Equations} ## @example ## @group ## AXA' - X + B = 0 (Lyapunov Equation) ## ## AXB' - X + C = 0 (Sylvester Equation) ## ## AXA' - EXE' + B = 0 (Generalized Lyapunov Equation) ## @end group ## @end example ## ## @strong{Algorithm}@* ## Uses SLICOT SB03MD, SB04QD and SG03AD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @seealso{dlyapchol, lyap, lyapchol} ## @end deftypefn ## Author: Lukas Reichlin ## Created: January 2010 ## Version: 0.2.1 function [x, scale] = dlyap (a, b, c, e) scale = 1; switch (nargin) case 2 # Lyapunov equation if (! is_real_square_matrix (a, b)) ## error ("dlyap: a, b must be real and square"); error ("dlyap: %s, %s must be real and square", ... inputname (1), inputname (2)); endif if (rows (a) != rows (b)) ## error ("dlyap: a, b must have the same number of rows"); error ("dlyap: %s, %s must have the same number of rows", ... inputname (1), inputname (2)); endif [x, scale] = __sl_sb03md__ (a, -b, true); # AXA' - X = -B ## x /= scale; # 0 < scale <= 1 case 3 # Sylvester equation if (! is_real_square_matrix (a, b)) ## error ("dlyap: a, b must be real and square"); error ("dlyap: %s, %s must be real and square", ... inputname (1), inputname (2)); endif if (! is_real_matrix (c) || rows (c) != rows (a) || columns (c) != columns (b)) ## error ("dlyap: c must be a real (%dx%d) matrix", rows (a), columns (b)); error ("dlyap: %s must be a real (%dx%d) matrix", ... rows (a), columns (b), inputname (3)); endif x = __sl_sb04qd__ (-a, b, c); # AXB' - X = -C case 4 # generalized Lyapunov equation if (! isempty (c)) print_usage (); endif if (! is_real_square_matrix (a, b, e)) ## error ("dlyap: a, b, e must be real and square"); error ("dlyap: %s, %s, %s must be real and square", ... inputname (1), inputname (2), inputname (4)); endif if (rows (b) != rows (a) || rows (e) != rows (a)) ## error ("dlyap: a, b, e must have the same number of rows"); error ("dlyap: %s, %s, %s must have the same number of rows", ... inputname (1), inputname (2), inputname (4)); endif if (! issymmetric (b)) ## error ("dlyap: b must be symmetric"); error ("dlyap: %s must be symmetric", ... inputname (2)); endif [x, scale] = __sl_sg03ad__ (a, e, -b, true); # AXA' - EXE' = -B ## x /= scale; # 0 < scale <= 1 otherwise print_usage (); endswitch if (scale < 1) warning ("dlyap: solution scaled by %g to prevent overflow", scale); endif endfunction ## Lyapunov %!shared X, X_exp %! A = [3.0 1.0 1.0 %! 1.0 3.0 0.0 %! 0.0 0.0 3.0]; %! %! B = [25.0 24.0 15.0 %! 24.0 32.0 8.0 %! 15.0 8.0 40.0]; %! %! X = dlyap (A.', -B); %! %! X_exp = [2.0000 1.0000 1.0000 %! 1.0000 3.0000 0.0000 %! 1.0000 0.0000 4.0000]; %! %!assert (X, X_exp, 1e-4); ## Sylvester %!shared X, X_exp %! A = [1.0 2.0 3.0 %! 6.0 7.0 8.0 %! 9.0 2.0 3.0]; %! %! B = [7.0 2.0 3.0 %! 2.0 1.0 2.0 %! 3.0 4.0 1.0]; %! %! C = [271.0 135.0 147.0 %! 923.0 494.0 482.0 %! 578.0 383.0 287.0]; %! %! X = dlyap (-A, B, C); %! %! X_exp = [2.0000 3.0000 6.0000 %! 4.0000 7.0000 1.0000 %! 5.0000 3.0000 2.0000]; %! %!assert (X, X_exp, 1e-4); ## Generalized Lyapunov ## TODO: add a test control/inst/dlyapchol.m0000644000076500000240000000635112273411257014663 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {@var{u} =} dlyapchol (@var{a}, @var{b}) ## @deftypefnx{Function File} {@var{u} =} dlyapchol (@var{a}, @var{b}, @var{e}) ## Compute Cholesky factor of discrete-time Lyapunov equations. ## ## @strong{Equations} ## @example ## @group ## A U' U A' - U' U + B B' = 0 (Lyapunov Equation) ## ## A U' U A' - E U' U E' + B B' = 0 (Generalized Lyapunov Equation) ## @end group ## @end example ## ## @strong{Algorithm}@* ## Uses SLICOT SB03OD and SG03BD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @seealso{dlyap, lyap, lyapchol} ## @end deftypefn ## Author: Lukas Reichlin ## Created: January 2010 ## Version: 0.2.1 function [u, scale] = dlyapchol (a, b, e) switch (nargin) case 2 if (! is_real_square_matrix (a)) ## error ("dlyapchol: a must be real and square"); error ("dlyapchol: %s must be real and square", ... inputname (1)); endif if (! is_real_matrix (b)) ## error ("dlyapchol: b must be real") error ("dlyapchol: %s must be real", ... inputname (2)) endif if (rows (a) != rows (b)) ## error ("dlyapchol: a and b must have the same number of rows"); error ("dlyapchol: %s and %s must have the same number of rows", ... inputname (1), inputname (2)); endif [u, scale] = __sl_sb03od__ (a.', b.', true); ## NOTE: TRANS = 'T' not suitable because we need U' U, not U U' case 3 if (! is_real_square_matrix (a, e)) ## error ("dlyapchol: a, e must be real and square"); error ("dlyapchol: %s, %s must be real and square", ... inputname (1), inputname (3)); endif if (! is_real_matrix (b)) ## error ("dlyapchol: b must be real"); error ("dlyapchol: %s must be real", ... inputname (2)); endif if (rows (b) != rows (a) || rows (e) != rows (a)) ## error ("dlyapchol: a, b, e must have the same number of rows"); error ("dlyapchol: %s, %s, %s must have the same number of rows", ... inputname (1), inputname (2), inputname (3)); endif [u, scale] = __sl_sg03bd__ (a.', e.', b.', true); ## NOTE: TRANS = 'T' not suitable because we need U' U, not U U' otherwise print_usage (); endswitch if (scale < 1) warning ("dlyapchol: solution scaled by %g to prevent overflow", scale); endif endfunction ## TODO: add tests control/inst/dss.m0000644000076500000240000000757512273411257013506 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} dss (@var{sys}) ## @deftypefnx {Function File} {@var{sys} =} dss (@var{d}) ## @deftypefnx {Function File} {@var{sys} =} dss (@var{a}, @var{b}, @var{c}, @var{d}, @var{e}, @dots{}) ## @deftypefnx {Function File} {@var{sys} =} dss (@var{a}, @var{b}, @var{c}, @var{d}, @var{e}, @var{tsam}, @dots{}) ## Create or convert to descriptor state-space model. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model to be converted to state-space. ## @item a ## State matrix (n-by-n). ## @item b ## Input matrix (n-by-m). ## @item c ## Output matrix (p-by-n). ## @item d ## Feedthrough matrix (p-by-m). ## @item e ## Descriptor matrix (n-by-n). ## @item tsam ## Sampling time in seconds. If @var{tsam} is not specified, ## a continuous-time model is assumed. ## @item @dots{} ## Optional pairs of properties and values. ## Type @command{set (dss)} for more information. ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## Descriptor state-space model. ## @end table ## ## @strong{Option Keys and Values} ## @table @var ## @item 'a', 'b', 'c', 'd', 'e' ## State-space matrices. See 'Inputs' for details. ## ## @item 'stname' ## The name of the states in @var{sys}. ## Cell vector containing strings for each state. ## Default names are @code{@{'x1', 'x2', ...@}} ## ## @item 'scaled' ## Logical. If set to true, no automatic scaling is used, ## e.g. for frequency response plots. ## ## @item 'tsam' ## Sampling time. See 'Inputs' for details. ## ## @item 'inname' ## The name of the input channels in @var{sys}. ## Cell vector of length m containing strings. ## Default names are @code{@{'u1', 'u2', ...@}} ## ## @item 'outname' ## The name of the output channels in @var{sys}. ## Cell vector of length p containing strings. ## Default names are @code{@{'y1', 'y2', ...@}} ## ## @item 'ingroup' ## Struct with input group names as field names and ## vectors of input indices as field values. ## Default is an empty struct. ## ## @item 'outgroup' ## Struct with output group names as field names and ## vectors of output indices as field values. ## Default is an empty struct. ## ## @item 'name' ## String containing the name of the model. ## ## @item 'notes' ## String or cell of string containing comments. ## ## @item 'userdata' ## Any data type. ## @end table ## ## @strong{Equations} ## @example ## @group ## . ## E x = A x + B u ## y = C x + D u ## @end group ## @end example ## ## @seealso{ss, tf} ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2010 ## Version: 0.1 function sys = dss (varargin) switch (nargin) case {0, 1} # static gain (dss (5)) or empty (useful for "set (dss)") sys = ss (varargin{:}); case {2, 3, 4} print_usage (); otherwise # general case sys = ss (varargin{[1:4, 6:end]}, "e", varargin{5}); endswitch endfunction ## NOTE: The author prefers "dss (e, a, b, c, d)" since we write ## . ## E x = A x + B u, y = C x + D u ## ## but this would break compatibility to a widespread ## commercial implementation of the octave language. ## There's no way to tell e and d apart if n = m = p. control/inst/estim.m0000644000076500000240000000516212273411257014024 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{est} =} estim (@var{sys}, @var{l}) ## @deftypefnx {Function File} {@var{est} =} estim (@var{sys}, @var{l}, @var{sensors}, @var{known}) ## Return state estimator for a given estimator gain. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. ## @item l ## State feedback matrix. ## @item sensors ## Indices of measured output signals y from @var{sys}. If omitted, all outputs are measured. ## @item known ## Indices of known input signals u (deterministic) to @var{sys}. All other inputs to @var{sys} ## are assumed stochastic. If argument @var{known} is omitted, no inputs u are known. ## @end table ## ## @strong{Outputs} ## @table @var ## @item est ## State-space model of estimator. ## @end table ## @seealso{kalman, place} ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2009 ## Version: 0.2 function est = estim (sys, l, sensors = [], known = []) if (nargin < 2 || nargin > 4) print_usage (); endif if (! isa (sys, "lti")) error ("estim: first argument must be an LTI system"); endif [a, b, c, d, e, tsam] = dssdata (sys, []); if (isempty (sensors)) sensors = 1 : rows (c); endif m = length (known); n = rows (a); p = length (sensors); b = b(:, known); c = c(sensors, :); d = d(sensors, known); f = a - l*c; g = [b - l*d, l]; h = [c; eye(n)]; j = [d, zeros(p, p); zeros(n, m), zeros(n, p)]; ## k = e; est = dss (f, g, h, j, e, tsam); ## TODO: inname, stname, outname endfunction %!shared m, m_exp %! sys = ss (-2, 1, 1, 3); %! est = estim (sys, 5); %! [a, b, c, d] = ssdata (est); %! m = [a, b; c, d]; %! m_exp = [-7, 5; 1, 0; 1, 0]; %!assert (m, m_exp, 1e-4); %!shared m, m_exp %! sys = ss (-1, 2, 3, 4); %! est = estim (sys, 5); %! [a, b, c, d] = ssdata (est); %! m = [a, b; c, d]; %! m_exp = [-16, 5; 3, 0; 1, 0]; %!assert (m, m_exp, 1e-4); control/inst/filt.m0000644000076500000240000001323012273411257013634 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} filt (@var{num}, @var{den}, @dots{}) ## @deftypefnx {Function File} {@var{sys} =} filt (@var{num}, @var{den}, @var{tsam}, @dots{}) ## Create discrete-time transfer function model from data in DSP format. ## ## @strong{Inputs} ## @table @var ## @item num ## Numerator or cell of numerators. Each numerator must be a row vector ## containing the coefficients of the polynomial in ascending powers of z^-1. ## num@{i,j@} contains the numerator polynomial from input j to output i. ## In the SISO case, a single vector is accepted as well. ## @item den ## Denominator or cell of denominators. Each denominator must be a row vector ## containing the coefficients of the polynomial in ascending powers of z^-1. ## den@{i,j@} contains the denominator polynomial from input j to output i. ## In the SISO case, a single vector is accepted as well. ## @item tsam ## Sampling time in seconds. If @var{tsam} is not specified, ## default value -1 (unspecified) is taken. ## @item @dots{} ## Optional pairs of properties and values. ## Type @command{set (filt)} for more information. ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## Discrete-time transfer function model. ## @end table ## ## @strong{Option Keys and Values} ## @table @var ## @item 'num' ## Numerator. See 'Inputs' for details. ## ## @item 'den' ## Denominator. See 'Inputs' for details. ## ## @item 'tfvar' ## String containing the transfer function variable. ## ## @item 'inv' ## Logical. True for negative powers of the transfer function variable. ## ## @item 'tsam' ## Sampling time. See 'Inputs' for details. ## ## @item 'inname' ## The name of the input channels in @var{sys}. ## Cell vector of length m containing strings. ## Default names are @code{@{'u1', 'u2', ...@}} ## ## @item 'outname' ## The name of the output channels in @var{sys}. ## Cell vector of length p containing strings. ## Default names are @code{@{'y1', 'y2', ...@}} ## ## @item 'ingroup' ## Struct with input group names as field names and ## vectors of input indices as field values. ## Default is an empty struct. ## ## @item 'outgroup' ## Struct with output group names as field names and ## vectors of output indices as field values. ## Default is an empty struct. ## ## @item 'name' ## String containing the name of the model. ## ## @item 'notes' ## String or cell of string containing comments. ## ## @item 'userdata' ## Any data type. ## @end table ## ## @strong{Example} ## @example ## @group ## 3 z^-1 ## H(z^-1) = ------------------- ## 1 + 4 z^-1 + 2 z^-2 ## ## octave:1> H = filt ([0, 3], [1, 4, 2]) ## ## Transfer function 'H' from input 'u1' to output ... ## ## 3 z^-1 ## y1: ------------------- ## 1 + 4 z^-1 + 2 z^-2 ## ## Sampling time: unspecified ## Discrete-time model. ## @end group ## @end example ## ## @seealso{tf} ## @end deftypefn ## Author: Lukas Reichlin ## Created: April 2012 ## Version: 0.1 function sys = filt (num = {}, den = {}, tsam = -1, varargin) switch (nargin) case 0 # filt () sys = tf (); ## sys.inv = true; return; case 1 # filt (sys), filt (matrix) if (isa (num, "lti") || is_real_matrix (num)) sys = tf (num); ## sys.inv = true; # would be a problem for continuous-time LTI models return; else print_usage (); endif otherwise # filt (num, den, ...) if (! iscell (num)) num = {num}; endif if (! iscell (den)) den = {den}; endif ## convert from z^-1 to z ## expand each channel by z^x, where x is the largest exponent of z^-1 (z^-x) ## remove trailing zeros ## such that polynomials are as short as possible num = cellfun (@__remove_trailing_zeros__, num, "uniformoutput", false); den = cellfun (@__remove_trailing_zeros__, den, "uniformoutput", false); ## make numerator and denominator polynomials equally long ## by adding trailing zeros lnum = cellfun (@length, num, "uniformoutput", false); lden = cellfun (@length, den, "uniformoutput", false); lmax = cellfun (@max, lnum, lden, "uniformoutput", false); num = cellfun (@postpad, num, lmax, "uniformoutput", false); den = cellfun (@postpad, den, lmax, "uniformoutput", false); ## use standard tf constructor ## sys is stored in standard z form, not z^-1 ## so we can mix it with regular transfer function models ## property "inv", true displays sys in z^-1 form sys = tf (num, den, tsam, "inv", true, varargin{:}); endswitch endfunction %!shared num, den, n1, d1, n2, d2, n2e, d2e %! num = [0, 3]; %! den = [1, 4, 2]; %! sys = filt (num, den); %! [n1, d1] = filtdata (sys, "vector"); %! [n2, d2] = tfdata (sys, "vector"); %! n2e = [3, 0]; %! d2e = [1, 4, 2]; %!assert (n1, num, 1e-4); %!assert (d1, den, 1e-4); %!assert (n2, n2e, 1e-4); %!assert (d2, d2e, 1e-4); control/inst/fitfrd.m0000644000076500000240000000567512273411257014172 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{sys}, @var{n}] =} fitfrd (@var{dat}, @var{n}) ## @deftypefnx{Function File} {[@var{sys}, @var{n}] =} fitfrd (@var{dat}, @var{n}, @var{flag}) ## Fit frequency response data with a state-space system. ## If requested, the returned system is stable and minimum-phase. ## ## @strong{Inputs} ## @table @var ## @item dat ## @acronym{LTI} model containing frequency response data of a SISO system. ## @item n ## The desired order of the system to be fitted. @code{n <= length(dat.w)}. ## @item flag ## The flag controls whether the returned system is stable and minimum-phase. ## @table @var ## @item 0 ## The system zeros and poles are not constrained. Default value. ## @item 1 ## The system zeros and poles will have negative real parts in the ## continuous-time case, or moduli less than 1 in the discrete-time case. ## @end table ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## State-space model of order @var{n}, fitted to frequency response data @var{dat}. ## @item n ## The order of the obtained system. The value of @var{n} ## could only be modified if inputs @code{n > 0} and @code{flag = 1}. ## @end table ## ## @strong{Algorithm}@* ## Uses SLICOT SB10YD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2011 ## Version: 0.1 function [sys, n] = fitfrd (dat, n, flag = 0) if (nargin == 0 || nargin > 3) print_usage (); endif if (! isa (dat, "frd")) dat = frd (dat); endif if (! issiso (dat)) error ("fitfrd: require SISO system"); endif if (! issample (n, 0) || n != round (n)) error ("fitfrd: second argument must be an integer >= 0"); endif [H, w, tsam] = frdata (dat, "vector"); dt = isdt (dat); if (n > length (w)) error ("fitfrd: require n <= length (dat.w)"); endif [a, b, c, d, n] = __sl_sb10yd__ (real (H), imag (H), w, n, dt, logical (flag)); sys = ss (a, b, c, d, tsam); endfunction %!shared Yo, Ye %! SYS = ss (-1, 1, 1, 0); %! T = 0:0.1:50; %! Ye = step (SYS, T); %! W = logspace (-2, 2, 100); %! FR = frd (SYS, W); %! N = 1; %! SYSID = fitfrd (FR, N, 1); %! Yo = step (SYSID, T); %!assert (Yo, Ye, 1e-2); control/inst/fwcfconred.m0000644000076500000240000002354512273411257015030 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{Kr}, @var{info}] =} fwcfconred (@var{G}, @var{F}, @var{L}, @dots{}) ## @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} fwcfconred (@var{G}, @var{F}, @var{L}, @var{ncr}, @dots{}) ## @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} fwcfconred (@var{G}, @var{F}, @var{L}, @var{opt}, @dots{}) ## @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} fwcfconred (@var{G}, @var{F}, @var{L}, @var{ncr}, @var{opt}, @dots{}) ## ## Reduction of state-feedback-observer based controller by frequency-weighted coprime factorization (FW CF). ## Given a plant @var{G}, state feedback gain @var{F} and full observer gain @var{L}, ## determine a reduced order controller @var{Kr} by using stability enforcing frequency weights. ## ## @strong{Inputs} ## @table @var ## @item G ## @acronym{LTI} model of the open-loop plant (A,B,C,D). ## It has m inputs, p outputs and n states. ## @item F ## Stabilizing state feedback matrix (m-by-n). ## @item L ## Stabilizing observer gain matrix (n-by-p). ## @item ncr ## The desired order of the resulting reduced order controller @var{Kr}. ## If not specified, @var{ncr} is chosen automatically according ## to the description of key @var{'order'}. ## @item @dots{} ## Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. ## @item opt ## Optional struct with keys as field names. ## Struct @var{opt} can be created directly or ## by command @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. ## @end table ## ## @strong{Outputs} ## @table @var ## @item Kr ## State-space model of reduced order controller. ## @item info ## Struct containing additional information. ## @table @var ## @item info.hsv ## The Hankel singular values of the extended system?!?. ## The @var{n} Hankel singular values are ordered decreasingly. ## @item info.ncr ## The order of the obtained reduced order controller @var{Kr}. ## @end table ## @end table ## ## @strong{Option Keys and Values} ## @table @var ## @item 'order', 'ncr' ## The desired order of the resulting reduced order controller @var{Kr}. ## If not specified, @var{ncr} is chosen automatically such that states with ## Hankel singular values @var{info.hsv} > @var{tol1} are retained. ## ## @item 'method' ## Order reduction approach to be used as follows: ## @table @var ## @item 'sr', 'b' ## Use the square-root Balance & Truncate method. ## @item 'bfsr', 'f' ## Use the balancing-free square-root Balance & Truncate method. Default method. ## @end table ## ## @item 'cf' ## Specifies whether left or right coprime factorization is ## to be used as follows: ## @table @var ## @item 'left', 'l' ## Use left coprime factorization. ## @item 'right', 'r' ## Use right coprime factorization. Default method. ## @end table ## ## @item 'feedback' ## Specifies whether @var{F} and @var{L} are fed back positively or negatively: ## @table @var ## @item '+' ## A+BK and A+LC are both Hurwitz matrices. ## @item '-' ## A-BK and A-LC are both Hurwitz matrices. Default value. ## @end table ## ## @item 'tol1' ## If @var{'order'} is not specified, @var{tol1} contains the tolerance for ## determining the order of the reduced system. ## For model reduction, the recommended value of @var{tol1} is ## c*info.hsv(1), where c lies in the interval [0.00001, 0.001]. ## Default value is n*eps*info.hsv(1). ## If @var{'order'} is specified, the value of @var{tol1} is ignored. ## @end table ## ## @strong{Algorithm}@* ## Uses SLICOT SB16CD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## @end deftypefn ## Author: Lukas Reichlin ## Created: December 2011 ## Version: 0.1 function [Kr, info] = fwcfconred (G, F, L, varargin) if (nargin < 3) print_usage (); endif if (! isa (G, "lti")) error ("fwcfconred: first argument must be an LTI system"); endif if (! is_real_matrix (F)) error ("fwcfconred: second argument must be a real matrix"); endif if (! is_real_matrix (L)) error ("fwcfconred: third argument must be a real matrix"); endif if (nargin > 3) # fwcfconred (G, F, L, ...) if (is_real_scalar (varargin{1})) # fwcfconred (G, F, L, nr) varargin = horzcat (varargin(2:end), {"order"}, varargin(1)); endif if (isstruct (varargin{1})) # fwcfconred (G, F, L, opt, ...), fwcfconred (G, F, L, nr, opt, ...) varargin = horzcat (__opt2cell__ (varargin{1}), varargin(2:end)); endif ## order placed at the end such that nr from fwcfconred (G, F, L, nr, ...) ## and fwcfconred (G, F, L, nr, opt, ...) overrides possible nr's from ## key/value-pairs and inside opt struct (later keys override former keys, ## nr > key/value > opt) endif nkv = numel (varargin); # number of keys and values if (rem (nkv, 2)) error ("fwcfconred: keys and values must come in pairs"); endif [a, b, c, d, tsam] = ssdata (G); [p, m] = size (G); n = rows (a); [mf, nf] = size (F); [nl, pl] = size (L); dt = isdt (G); jobd = any (d(:)); if (mf != m || nf != n) error ("fwcfconred: dimensions of state-feedback matrix (%dx%d) and plant (%dx%d, %d states) don't match", ... mf, nf, p, m, n); endif if (nl != n || pl != p) error ("fwcfconred: dimensions of observer matrix (%dx%d) and plant (%dx%d, %d states) don't match", ... nl, pl, p, m, n); endif ## default arguments tol1 = 0.0; jobcf = 1; jobmr = 1; # balancing-free BTA ordsel = 1; ncr = 0; negfb = true; # A-BK, A-LC Hurwitz ## handle keys and values for k = 1 : 2 : nkv key = lower (varargin{k}); val = varargin{k+1}; switch (key) case {"order", "ncr", "nr"} [ncr, ordsel] = __modred_check_order__ (val, n); case {"tol1", "tol"} tol1 = __modred_check_tol__ (val, "tol1"); case "cf" switch (lower (val(1))) case "l" jobcf = 0; case "r" jobcf = 1; otherwise error ("cfconred: '%s' is an invalid coprime factorization", val); endswitch case "method" # approximation method switch (tolower (val)) case {"sr-bta", "b", "sr"} # 'B': use the square-root Balance & Truncate method jobmr = 0; case {"bfsr-bta", "f", "bfsr"} # 'F': use the balancing-free square-root Balance & Truncate method jobmr = 1; otherwise error ("cfconred: '%s' is an invalid approach", val); endswitch case "feedback" negfb = __conred_check_feedback_sign__ (val); otherwise warning ("fwcfconred: invalid property name '%s' ignored", key); endswitch endfor ## A - B*F --> A + B*F ; A - L*C --> A + L*C if (negfb) F = -F; L = -L; endif ## perform model order reduction [acr, bcr, ccr, ncr, hsv] = __sl_sb16cd__ (a, b, c, d, dt, ncr, ordsel, jobd, jobmr, ... F, L, jobcf, tol1); ## assemble reduced order controller Kr = ss (acr, bcr, ccr, [], tsam); ## assemble info struct info = struct ("ncr", ncr, "hsv", hsv); endfunction %!shared Mo, Me, Info, HSVe %! A = [ 0 1.0000 0 0 0 0 0 0 %! 0 0 0 0 0 0 0 0 %! 0 0 -0.0150 0.7650 0 0 0 0 %! 0 0 -0.7650 -0.0150 0 0 0 0 %! 0 0 0 0 -0.0280 1.4100 0 0 %! 0 0 0 0 -1.4100 -0.0280 0 0 %! 0 0 0 0 0 0 -0.0400 1.850 %! 0 0 0 0 0 0 -1.8500 -0.040 ]; %! %! B = [ 0.0260 %! -0.2510 %! 0.0330 %! -0.8860 %! -4.0170 %! 0.1450 %! 3.6040 %! 0.2800 ]; %! %! C = [ -.996 -.105 0.261 .009 -.001 -.043 0.002 -0.026 ]; %! %! D = [ 0.0 ]; %! %! G = ss (A, B, C, D); % "scaled", false %! %! F = [ 4.472135954999638e-002 6.610515358414598e-001 4.698598960657579e-003 3.601363251422058e-001 1.032530880771415e-001 -3.754055214487997e-002 -4.268536964759344e-002 3.287284547842979e-002 ]; %! %! L = [ 4.108939884667451e-001 %! 8.684600000000012e-002 %! 3.852317308197148e-004 %! -3.619366874815911e-003 %! -8.803722876359955e-003 %! 8.420521094001852e-003 %! 1.234944428038507e-003 %! 4.263205617645322e-003 ]; %! %! [Kr, Info] = fwcfconred (G, F, L, 2, "method", "bfsr", "cf", "right", "feedback", "+"); %! [Ao, Bo, Co, Do] = ssdata (Kr); %! %! Ae = [ -0.4334 0.4884 %! -0.1950 -0.1093 ]; %! %! Be = [ -0.4231 %! -0.1785 ]; %! %! Ce = [ -0.0326 -0.2307 ]; %! %! De = [ 0.0000 ]; %! %! HSVe = [ 3.3073 0.7274 0.1124 0.0784 0.0242 0.0182 0.0101 0.0094 ].'; %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [Ae, Be; Ce, De]; %! %!assert (Mo, Me, 1e-4); %!assert (Info.hsv, HSVe, 1e-4); control/inst/gensig.m0000644000076500000240000000537412273411257014164 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{u}, @var{t}] =} gensig (@var{sigtype}, @var{tau}) ## @deftypefnx{Function File} {[@var{u}, @var{t}] =} gensig (@var{sigtype}, @var{tau}, @var{tfinal}) ## @deftypefnx{Function File} {[@var{u}, @var{t}] =} gensig (@var{sigtype}, @var{tau}, @var{tfinal}, @var{tsam}) ## Generate periodic signal. Useful in combination with lsim. ## ## @strong{Inputs} ## @table @var ## @item sigtype = "sin" ## Sine wave. ## @item sigtype = "cos" ## Cosine wave. ## @item sigtype = "square" ## Square wave. ## @item sigtype = "pulse" ## Periodic pulse. ## @item tau ## Duration of one period in seconds. ## @item tfinal ## Optional duration of the signal in seconds. Default duration is 5 periods. ## @item tsam ## Optional sampling time in seconds. Default spacing is tau/64. ## @end table ## ## @strong{Outputs} ## @table @var ## @item u ## Vector of signal values. ## @item t ## Time vector of the signal. ## @end table ## ## @seealso{lsim} ## @end deftypefn ## Author: Lukas Reichlin ## Created: August 2009 ## Version: 0.4 function [u, t] = gensig (sigtype, tau, tfinal, tsam) if (nargin < 2 || nargin > 4) print_usage (); endif if (! ischar (sigtype)) error ("gensig: first argument must be a string"); endif if (! issample (tau)) error ("gensig: second argument is not a valid period"); endif if (nargin < 3) tfinal = 5 * tau; elseif (! issample (tfinal)) error ("gensig: third argument is not a valid final time"); endif if (nargin < 4) tsam = tau / 64; elseif (! issample (tsam)) error ("gensig: fourth argument is not a valid sampling time"); endif t = reshape (0 : tsam : tfinal, [], 1); switch (lower (sigtype(1:2))) case "si" u = sin (2*pi/tau * t); case "co" u = cos (2*pi/tau * t); case "sq" u = double (rem (t, tau) >= tau/2); case "pu" u = double (rem (t, tau) < (1 - 1000*eps) * tsam); otherwise error ("gensig: '%s' is an invalid signal type", sigtype); endswitch endfunction control/inst/gram.m0000644000076500000240000000754612273411257013641 0ustar lukasstaff## Copyright (C) 1996, 2000, 2003, 2004, 2005, 2007 ## Auburn University. All rights reserved. ## ## ## 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; see the file COPYING. If not, see ## . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{W} =} gram (@var{sys}, @var{mode}) ## @deftypefnx {Function File} {@var{Wc} =} gram (@var{a}, @var{b}) ## @code{gram (@var{sys}, "c")} returns the controllability gramian of ## the (continuous- or discrete-time) system @var{sys}. ## @code{gram (@var{sys}, "o")} returns the observability gramian of the ## (continuous- or discrete-time) system @var{sys}. ## @code{gram (@var{a}, @var{b})} returns the controllability gramian ## @var{Wc} of the continuous-time system @math{dx/dt = a x + b u}; ## i.e., @var{Wc} satisfies @math{a Wc + m Wc' + b b' = 0}. ## ## @end deftypefn ## Author: A. S. Hodel ## Adapted-By: Lukas Reichlin ## Date: October 2009 ## Version: 0.2 function W = gram (argin1, argin2) if (nargin != 2) print_usage (); endif if (ischar (argin2)) # the function was called as "gram (sys, mode)" sys = argin1; if (! isa (sys, "lti")) error ("gram: first argument must be an LTI model"); endif [a, b, c] = ssdata (sys); if (strncmpi (argin2, "o", 1)) a = a.'; b = c.'; elseif (! strncmpi (argin2, "c", 1)) print_usage (); endif else # the function was called as "gram (a, b)" a = argin1; b = argin2; ## assume that a and b are matrices of continuous-time system ## values of b, c and d are irrelevant for system stability sys = ss (a, b, zeros (1, columns (a)), zeros (1, columns (b))); endif if (! isstable (sys)) error ("gram: system matrix a must be stable"); endif if (isct (sys)) W = lyap (a, b*b.'); # let lyap do the error checking about dimensions else # discrete-time system W = dlyap (a, b*b.'); # let dlyap do the error checking about dimensions endif endfunction %!test %! a = [-1 0 0; 1/2 -1 0; 1/2 0 -1]; %! b = [1 0; 0 -1; 0 1]; %! c = [0 0 1; 1 1 0]; ## it doesn't matter what the value of c is %! Wc = gram (ss (a, b, c), "c"); %! assert (a * Wc + Wc * a.' + b * b.', zeros (size (a))) %!test %! a = [-1 0 0; 1/2 -1 0; 1/2 0 -1]; %! b = [1 0; 0 -1; 0 1]; ## it doesn't matter what the value of b is %! c = [0 0 1; 1 1 0]; %! Wo = gram (ss (a, b, c), "o"); %! assert (a.' * Wo + Wo * a + c.' * c, zeros (size (a))) %!test %! a = [-1 0 0; 1/2 -1 0; 1/2 0 -1]; %! b = [1 0; 0 -1; 0 1]; %! Wc = gram (a, b); %! assert (a * Wc + Wc * a.' + b * b.', zeros (size (a))) %!test %! a = [-1 0 0; 1/2 1 0; 1/2 0 -1] / 2; %! b = [1 0; 0 -1; 0 1]; %! c = [0 0 1; 1 1 0]; ## it doesn't matter what the value of c is %! d = zeros (rows (c), columns (b)); ## it doesn't matter what the value of d is %! Ts = 0.1; ## Ts != 0 %! Wc = gram (ss (a, b, c, d, Ts), "c"); %! assert (a * Wc * a.' - Wc + b * b.', zeros (size (a)), 1e-12) %!test %! a = [-1 0 0; 1/2 1 0; 1/2 0 -1] / 2; %! b = [1 0; 0 -1; 0 1]; ## it doesn't matter what the value of b is %! c = [0 0 1; 1 1 0]; %! d = zeros (rows (c), columns (b)); ## it doesn't matter what the value of d is %! Ts = 0.1; ## Ts != 0 %! Wo = gram (ss (a, b, c, d, Ts), "o"); %! assert (a.' * Wo * a - Wo + c.' * c, zeros (size (a)), 1e-12) control/inst/h2syn.m0000644000076500000240000002032212273411257013741 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} h2syn (@var{P}, @var{nmeas}, @var{ncon}) ## @deftypefnx{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} h2syn (@var{P}) ## H-2 control synthesis for @acronym{LTI} plant. ## ## @strong{Inputs} ## @table @var ## @item P ## Generalized plant. Must be a proper/realizable @acronym{LTI} model. ## If @var{P} is constructed with @command{mktito} or @command{augw}, ## arguments @var{nmeas} and @var{ncon} can be omitted. ## @item nmeas ## Number of measured outputs v. The last @var{nmeas} outputs of @var{P} are connected to the ## inputs of controller @var{K}. The remaining outputs z (indices 1 to p-nmeas) are used ## to calculate the H-2 norm. ## @item ncon ## Number of controlled inputs u. The last @var{ncon} inputs of @var{P} are connected to the ## outputs of controller @var{K}. The remaining inputs w (indices 1 to m-ncon) are excited ## by a harmonic test signal. ## @end table ## ## @strong{Outputs} ## @table @var ## @item K ## State-space model of the H-2 optimal controller. ## @item N ## State-space model of the lower LFT of @var{P} and @var{K}. ## @item info ## Structure containing additional information. ## @item info.gamma ## H-2 norm of @var{N}. ## @item info.rcond ## Vector @var{rcond} contains estimates of the reciprocal condition ## numbers of the matrices which are to be inverted and ## estimates of the reciprocal condition numbers of the ## Riccati equations which have to be solved during the ## computation of the controller @var{K}. For details, ## see the description of the corresponding SLICOT routine. ## @end table ## ## @strong{Block Diagram} ## @example ## @group ## ## gamma = min||N(K)|| N = lft (P, K) ## K 2 ## ## +--------+ ## w ----->| |-----> z ## | P(s) | ## u +---->| |-----+ v ## | +--------+ | ## | | ## | +--------+ | ## +-----| K(s) |<----+ ## +--------+ ## ## +--------+ ## w ----->| N(s) |-----> z ## +--------+ ## @end group ## @end example ## ## @strong{Algorithm}@* ## Uses SLICOT SB10HD and SB10ED by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @seealso{augw, lqr, dlqr, kalman} ## @end deftypefn ## Author: Lukas Reichlin ## Created: December 2009 ## Version: 0.3 function [K, varargout] = h2syn (P, nmeas, ncon) ## check input arguments if (nargin != 1 && nargin != 3) print_usage (); endif if (! isa (P, "lti")) error ("h2syn: first argument must be an LTI system"); endif if (nargin == 1) [nmeas, ncon] = __tito_dim__ (P, "h2syn"); endif if (! is_real_scalar (nmeas)) error ("h2syn: second argument 'nmeas' invalid"); endif if (! is_real_scalar (ncon)) error ("h2syn: third argument 'ncon' invalid"); endif [a, b, c, d, tsam] = ssdata (P); ## check assumptions A1 - A3 m = columns (b); p = rows (c); m1 = m - ncon; p1 = p - nmeas; d11 = d(1:p1, 1:m1); if (isct (P) && any (d11(:))) warning ("h2syn: setting matrice D11 to zero"); d(1:p1, 1:m1) = 0; endif if (! isstabilizable (P(:, m1+1:m))) error ("h2syn: (A, B2) must be stabilizable"); endif if (! isdetectable (P(p1+1:p, :))) error ("h2syn: (C2, A) must be detectable"); endif ## H-2 synthesis if (isct (P)) # continuous plant [ak, bk, ck, dk, rcond] = __sl_sb10hd__ (a, b, c, d, ncon, nmeas); else # discrete plant [ak, bk, ck, dk, rcond] = __sl_sb10ed__ (a, b, c, d, ncon, nmeas); endif ## controller K = ss (ak, bk, ck, dk, tsam); if (nargout > 1) N = lft (P, K); varargout{1} = N; if (nargout > 2) gamma = norm (N, 2); varargout{2} = gamma; if (nargout > 3) varargout{3} = struct ("gamma", gamma, "rcond", rcond); endif endif endif endfunction ## continuous-time case %!shared M, M_exp %! A = [-1.0 0.0 4.0 5.0 -3.0 -2.0 %! -2.0 4.0 -7.0 -2.0 0.0 3.0 %! -6.0 9.0 -5.0 0.0 2.0 -1.0 %! -8.0 4.0 7.0 -1.0 -3.0 0.0 %! 2.0 5.0 8.0 -9.0 1.0 -4.0 %! 3.0 -5.0 8.0 0.0 2.0 -6.0]; %! %! B = [-3.0 -4.0 -2.0 1.0 0.0 %! 2.0 0.0 1.0 -5.0 2.0 %! -5.0 -7.0 0.0 7.0 -2.0 %! 4.0 -6.0 1.0 1.0 -2.0 %! -3.0 9.0 -8.0 0.0 5.0 %! 1.0 -2.0 3.0 -6.0 -2.0]; %! %! C = [ 1.0 -1.0 2.0 -4.0 0.0 -3.0 %! -3.0 0.0 5.0 -1.0 1.0 1.0 %! -7.0 5.0 0.0 -8.0 2.0 -2.0 %! 9.0 -3.0 4.0 0.0 3.0 7.0 %! 0.0 1.0 -2.0 1.0 -6.0 -2.0]; %! %! D = [ 0.0 0.0 0.0 -4.0 -1.0 %! 0.0 0.0 0.0 1.0 0.0 %! 0.0 0.0 0.0 0.0 1.0 %! 3.0 1.0 0.0 1.0 -3.0 %! -2.0 0.0 1.0 7.0 1.0]; %! %! P = ss (A, B, C, D); %! K = h2syn (P, 2, 2); %! M = [K.A, K.B; K.C, K.D]; %! %! KA = [ 88.0015 -145.7298 -46.2424 82.2168 -45.2996 -31.1407 %! 25.7489 -31.4642 -12.4198 9.4625 -3.5182 2.7056 %! 54.3008 -102.4013 -41.4968 50.8412 -20.1286 -26.7191 %! 108.1006 -198.0785 -45.4333 70.3962 -25.8591 -37.2741 %! -115.8900 226.1843 47.2549 -47.8435 -12.5004 34.7474 %! 59.0362 -101.8471 -20.1052 36.7834 -16.1063 -26.4309]; %! %! KB = [ 3.7345 3.4758 %! -0.3020 0.6530 %! 3.4735 4.0499 %! 4.3198 7.2755 %! -3.9424 -10.5942 %! 2.1784 2.5048]; %! %! KC = [ -2.3346 3.2556 0.7150 -0.9724 0.6962 0.4074 %! 7.6899 -8.4558 -2.9642 7.0365 -4.2844 0.1390]; %! %! KD = [ 0.0000 0.0000 %! 0.0000 0.0000]; %! %! M_exp = [KA, KB; KC, KD]; %! %!assert (M, M_exp, 1e-4); ## discrete-time case %!shared M, M_exp %! A = [-0.7 0.0 0.3 0.0 -0.5 -0.1 %! -0.6 0.2 -0.4 -0.3 0.0 0.0 %! -0.5 0.7 -0.1 0.0 0.0 -0.8 %! -0.7 0.0 0.0 -0.5 -1.0 0.0 %! 0.0 0.3 0.6 -0.9 0.1 -0.4 %! 0.5 -0.8 0.0 0.0 0.2 -0.9]; %! %! B = [-1.0 -2.0 -2.0 1.0 0.0 %! 1.0 0.0 1.0 -2.0 1.0 %! -3.0 -4.0 0.0 2.0 -2.0 %! 1.0 -2.0 1.0 0.0 -1.0 %! 0.0 1.0 -2.0 0.0 3.0 %! 1.0 0.0 3.0 -1.0 -2.0]; %! %! C = [ 1.0 -1.0 2.0 -2.0 0.0 -3.0 %! -3.0 0.0 1.0 -1.0 1.0 0.0 %! 0.0 2.0 0.0 -4.0 0.0 -2.0 %! 1.0 -3.0 0.0 0.0 3.0 1.0 %! 0.0 1.0 -2.0 1.0 0.0 -2.0]; %! %! D = [ 1.0 -1.0 -2.0 0.0 0.0 %! 0.0 1.0 0.0 1.0 0.0 %! 2.0 -1.0 -3.0 0.0 1.0 %! 0.0 1.0 0.0 1.0 -1.0 %! 0.0 0.0 1.0 2.0 1.0]; %! %! P = ss (A, B, C, D, 1); # value of sampling time doesn't matter %! K = h2syn (P, 2, 2); %! M = [K.A, K.B; K.C, K.D]; %! %! KA = [-0.0551 -2.1891 -0.6607 -0.2532 0.6674 -1.0044 %! -1.0379 2.3804 0.5031 0.3960 -0.6605 1.2673 %! -0.0876 -2.1320 -0.4701 -1.1461 1.2927 -1.5116 %! -0.1358 -2.1237 -0.9560 -0.7144 0.6673 -0.7957 %! 0.4900 0.0895 0.2634 -0.2354 0.1623 -0.2663 %! 0.1672 -0.4163 0.2871 -0.1983 0.4944 -0.6967]; %! %! KB = [-0.5985 -0.5464 %! 0.5285 0.6087 %! -0.7600 -0.4472 %! -0.7288 -0.6090 %! 0.0532 0.0658 %! -0.0663 0.0059]; %! %! KC = [ 0.2500 -1.0200 -0.3371 -0.2733 0.2747 -0.4444 %! 0.0654 0.2095 0.0632 0.2089 -0.1895 0.1834]; %! %! KD = [-0.2181 -0.2070 %! 0.1094 0.1159]; %! %! M_exp = [KA, KB; KC, KD]; %! %!assert (M, M_exp, 1e-4); control/inst/hinfsyn.m0000644000076500000240000003712112273411257014361 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} hinfsyn (@var{P}, @var{nmeas}, @var{ncon}) ## @deftypefnx{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} hinfsyn (@var{P}, @var{nmeas}, @var{ncon}, @dots{}) ## @deftypefnx{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} hinfsyn (@var{P}, @var{nmeas}, @var{ncon}, @var{opt}, @dots{}) ## @deftypefnx{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} hinfsyn (@var{P}, @dots{}) ## @deftypefnx{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} hinfsyn (@var{P}, @var{opt}, @dots{}) ## H-infinity control synthesis for @acronym{LTI} plant. ## ## @strong{Inputs} ## @table @var ## @item P ## Generalized plant. Must be a proper/realizable @acronym{LTI} model. ## If @var{P} is constructed with @command{mktito} or @command{augw}, ## arguments @var{nmeas} and @var{ncon} can be omitted. ## @item nmeas ## Number of measured outputs v. The last @var{nmeas} outputs of @var{P} are connected to the ## inputs of controller @var{K}. The remaining outputs z (indices 1 to p-nmeas) are used ## to calculate the H-infinity norm. ## @item ncon ## Number of controlled inputs u. The last @var{ncon} inputs of @var{P} are connected to the ## outputs of controller @var{K}. The remaining inputs w (indices 1 to m-ncon) are excited ## by a harmonic test signal. ## @item @dots{} ## Optional pairs of keys and values. @code{'key1', value1, 'key2', value2}. ## @item opt ## Optional struct with keys as field names. ## Struct @var{opt} can be created directly or ## by function @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. ## @end table ## ## @strong{Outputs} ## @table @var ## @item K ## State-space model of the H-infinity (sub-)optimal controller. ## @item N ## State-space model of the lower LFT of @var{P} and @var{K}. ## @item info ## Structure containing additional information. ## @item info.gamma ## L-infinity norm of @var{N}. ## @item info.rcond ## Vector @var{rcond} contains estimates of the reciprocal condition ## numbers of the matrices which are to be inverted and ## estimates of the reciprocal condition numbers of the ## Riccati equations which have to be solved during the ## computation of the controller @var{K}. For details, ## see the description of the corresponding SLICOT routine. ## @end table ## ## @strong{Option Keys and Values} ## @table @var ## @item 'method' ## String specifying the desired kind of controller: ## @table @var ## @item 'optimal', 'opt', 'o' ## Compute optimal controller using gamma iteration. ## Default selection for compatibility reasons. ## @item 'suboptimal', 'sub', 's' ## Compute (sub-)optimal controller. For stability reasons, ## suboptimal controllers are to be preferred over optimal ones. ## @end table ## @item 'gmax' ## The maximum value of the H-infinity norm of @var{N}. ## It is assumed that @var{gmax} is sufficiently large ## so that the controller is admissible. Default value is 1e15. ## @item 'gmin' ## Initial lower bound for gamma iteration. Default value is 0. ## @var{gmin} is only meaningful for optimal discrete-time controllers. ## @item 'tolgam' ## Tolerance used for controlling the accuracy of @var{gamma} ## and its distance to the estimated minimal possible ## value of @var{gamma}. Default value is 0.01. ## If @var{tolgam} = 0, then a default value equal to @code{sqrt(eps)} ## is used, where @var{eps} is the relative machine precision. ## For suboptimal controllers, @var{tolgam} is ignored. ## @item 'actol' ## Upper bound for the poles of the closed-loop system @var{N} ## used for determining if it is stable. ## @var{actol} >= 0 for stable systems. ## For suboptimal controllers, @var{actol} is ignored. ## @end table ## ## @strong{Block Diagram} ## @example ## @group ## ## gamma = min||N(K)|| N = lft (P, K) ## K inf ## ## +--------+ ## w ----->| |-----> z ## | P(s) | ## u +---->| |-----+ v ## | +--------+ | ## | | ## | +--------+ | ## +-----| K(s) |<----+ ## +--------+ ## ## +--------+ ## w ----->| N(s) |-----> z ## +--------+ ## @end group ## @end example ## ## @strong{Algorithm}@* ## Uses SLICOT SB10FD, SB10DD and SB10AD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @seealso{augw, mixsyn} ## @end deftypefn ## Author: Lukas Reichlin ## Created: December 2009 ## Version: 0.3 function [K, varargout] = hinfsyn (P, varargin) ## check input arguments if (nargin == 0) print_usage (); endif if (! isa (P, "lti")) error ("hinfsyn: first argument must be an LTI system"); endif if (nargin == 1 || (nargin > 1 && ! is_real_scalar (varargin{1}))) # hinfsyn (P, ...) [nmeas, ncon] = __tito_dim__ (P, "hinfsyn"); elseif (nargin >= 3) # hinfsyn (P, nmeas, ncon, ...) nmeas = varargin{1}; ncon = varargin{2}; varargin = varargin(3:end); else print_usage (); endif if (! is_real_scalar (nmeas)) error ("hinfsyn: second argument 'nmeas' invalid"); endif if (! is_real_scalar (ncon)) error ("hinfsyn: third argument 'ncon' invalid"); endif if (numel (varargin) > 0 && isstruct (varargin{1})) # hinfsyn (P, nmeas, ncon, opt, ...), hinfsyn (P, opt, ...) varargin = horzcat (__opt2cell__ (varargin{1}), varargin(2:end)); endif nkv = numel (varargin); # number of keys and values if (rem (nkv, 2)) error ("hinfsyn: keys and values must come in pairs"); endif ## default arguments gmax = 1e15; gmin = 0; tolgam = 0.01; actol = eps; # tolerance for stability margin method = "opt"; ## handle keys and values for k = 1 : 2 : nkv key = lower (varargin{k}); val = varargin{k+1}; switch (key) case "gmax" if (! is_real_scalar (val) || val < 0) error ("hinfsyn: 'gmax' must be a real-valued, non-negative scalar"); endif gmax = val; case "gmin" if (! is_real_scalar (val) || val < 0) error ("hinfsyn: 'gmin' must be a real-valued, non-negative scalar"); endif gmin = val; case "tolgam" if (! is_real_scalar (val) || val < 0) error ("hinfsyn: 'tolgam' must be a real-valued, non-negative scalar"); endif tolgam = val; case "actol" if (! is_real_scalar (val) || val < 0) error ("hinfsyn: 'actol' must be a real-valued, non-negative scalar"); endif actol = val; case "method" ## NOTE: I called this "method" because of the dark side, ## maybe something like "type" would make more sense ... if (strncmpi (val, "s", 1)) method = "sub"; # sub-optimal elseif (strncmpi (val, "o", 1) || strncmpi (val, "ric", 1)) method = "opt"; # optimal else error ("hinfsyn: invalid method '%s'", val); endif otherwise warning ("hinfsyn: invalid property name '%s' ignored", key); endswitch endfor [a, b, c, d, tsam] = ssdata (P); ## check assumption A1 m = columns (b); p = rows (c); m1 = m - ncon; p1 = p - nmeas; if (! isstabilizable (P(:, m1+1:m))) error ("hinfsyn: (A, B2) must be stabilizable"); endif if (! isdetectable (P(p1+1:p, :))) error ("hinfsyn: (C2, A) must be detectable"); endif ## H-infinity synthesis switch (method) case "sub" # sub-optimal controller if (isct (P)) # continuous-time plant [ak, bk, ck, dk, rcond] = __sl_sb10fd__ (a, b, c, d, ncon, nmeas, gmax); else # discrete-time plant [ak, bk, ck, dk, rcond] = __sl_sb10dd__ (a, b, c, d, ncon, nmeas, gmax); endif case "opt" # optimal controller if (isct (P)) # continuous-time plant [ak, bk, ck, dk, ~, ~, ~, ~, ~, rcond] = __sl_sb10ad__ (a, b, c, d, ncon, nmeas, gmax, tolgam, -actol); else # discrete-time plant ## NOTE: check whether it is an alternative to compute the bilinear transformation ## of P, use __sl_sb10ad__ for a continuous-time controller and then ## discretize the controller. ## estimate gamma Pt = d2c (P, "tustin"); [at, bt, ct, dt] = ssdata (Pt); [~, ~, ~, ~, ~, ~, ~, ~, gamma] = __sl_sb10ad__ (at, bt, ct, dt, ncon, nmeas, gmax, tolgam, -actol); ## gamma iteration - bisection method using __sl_sb10dd__ gmax = 1.2*gamma; while (gmax > eps && (gmax - gmin)/gmax > tolgam) gmid = (gmax + gmin)/2; try [ak, bk, ck, dk, rcond] = __sl_sb10dd__ (a, b, c, d, ncon, nmeas, gmid); ## check for stability K = ss (ak, bk, ck, dk, tsam); N = lft (P, K); if (isstable (N, actol)) gmax = norm (N, inf); else gmin = gmid; endif catch # cannot find solution gmin = gmid; end_try_catch endwhile endif otherwise error ("hinfsyn: this should never happen"); endswitch ## controller K = ss (ak, bk, ck, dk, tsam); if (nargout > 1) N = lft (P, K); varargout{1} = N; if (nargout > 2) gamma = norm (N, inf); varargout{2} = gamma; if (nargout > 3) varargout{3} = struct ("gamma", gamma, "rcond", rcond); endif endif endif endfunction ## sub-optimal controller, continuous-time case %!shared M, M_exp %! A = [-1.0 0.0 4.0 5.0 -3.0 -2.0 %! -2.0 4.0 -7.0 -2.0 0.0 3.0 %! -6.0 9.0 -5.0 0.0 2.0 -1.0 %! -8.0 4.0 7.0 -1.0 -3.0 0.0 %! 2.0 5.0 8.0 -9.0 1.0 -4.0 %! 3.0 -5.0 8.0 0.0 2.0 -6.0]; %! %! B = [-3.0 -4.0 -2.0 1.0 0.0 %! 2.0 0.0 1.0 -5.0 2.0 %! -5.0 -7.0 0.0 7.0 -2.0 %! 4.0 -6.0 1.0 1.0 -2.0 %! -3.0 9.0 -8.0 0.0 5.0 %! 1.0 -2.0 3.0 -6.0 -2.0]; %! %! C = [ 1.0 -1.0 2.0 -4.0 0.0 -3.0 %! -3.0 0.0 5.0 -1.0 1.0 1.0 %! -7.0 5.0 0.0 -8.0 2.0 -2.0 %! 9.0 -3.0 4.0 0.0 3.0 7.0 %! 0.0 1.0 -2.0 1.0 -6.0 -2.0]; %! %! D = [ 1.0 -2.0 -3.0 0.0 0.0 %! 0.0 4.0 0.0 1.0 0.0 %! 5.0 -3.0 -4.0 0.0 1.0 %! 0.0 1.0 0.0 1.0 -3.0 %! 0.0 0.0 1.0 7.0 1.0]; %! %! P = ss (A, B, C, D); %! K = hinfsyn (P, 2, 2, "method", "sub", "gmax", 15); %! M = [K.A, K.B; K.C, K.D]; %! %! KA = [ -2.8043 14.7367 4.6658 8.1596 0.0848 2.5290 %! 4.6609 3.2756 -3.5754 -2.8941 0.2393 8.2920 %! -15.3127 23.5592 -7.1229 2.7599 5.9775 -2.0285 %! -22.0691 16.4758 12.5523 -16.3602 4.4300 -3.3168 %! 30.6789 -3.9026 -1.3868 26.2357 -8.8267 10.4860 %! -5.7429 0.0577 10.8216 -11.2275 1.5074 -10.7244]; %! %! KB = [ -0.1581 -0.0793 %! -0.9237 -0.5718 %! 0.7984 0.6627 %! 0.1145 0.1496 %! -0.6743 -0.2376 %! 0.0196 -0.7598]; %! %! KC = [ -0.2480 -0.1713 -0.0880 0.1534 0.5016 -0.0730 %! 2.8810 -0.3658 1.3007 0.3945 1.2244 2.5690]; %! %! KD = [ 0.0554 0.1334 %! -0.3195 0.0333]; %! %! M_exp = [KA, KB; KC, KD]; %! %!assert (M, M_exp, 1e-4); ## sub-optimal controller, discrete-time case %!shared M, M_exp %! A = [-0.7 0.0 0.3 0.0 -0.5 -0.1 %! -0.6 0.2 -0.4 -0.3 0.0 0.0 %! -0.5 0.7 -0.1 0.0 0.0 -0.8 %! -0.7 0.0 0.0 -0.5 -1.0 0.0 %! 0.0 0.3 0.6 -0.9 0.1 -0.4 %! 0.5 -0.8 0.0 0.0 0.2 -0.9]; %! %! B = [-1.0 -2.0 -2.0 1.0 0.0 %! 1.0 0.0 1.0 -2.0 1.0 %! -3.0 -4.0 0.0 2.0 -2.0 %! 1.0 -2.0 1.0 0.0 -1.0 %! 0.0 1.0 -2.0 0.0 3.0 %! 1.0 0.0 3.0 -1.0 -2.0]; %! %! C = [ 1.0 -1.0 2.0 -2.0 0.0 -3.0 %! -3.0 0.0 1.0 -1.0 1.0 0.0 %! 0.0 2.0 0.0 -4.0 0.0 -2.0 %! 1.0 -3.0 0.0 0.0 3.0 1.0 %! 0.0 1.0 -2.0 1.0 0.0 -2.0]; %! %! D = [ 1.0 -1.0 -2.0 0.0 0.0 %! 0.0 1.0 0.0 1.0 0.0 %! 2.0 -1.0 -3.0 0.0 1.0 %! 0.0 1.0 0.0 1.0 -1.0 %! 0.0 0.0 1.0 2.0 1.0]; %! %! P = ss (A, B, C, D, 1); # value of sampling time doesn't matter %! K = hinfsyn (P, 2, 2, "method", "sub", "gmax", 111.294); %! M = [K.A, K.B; K.C, K.D]; %! %! KA = [-18.0030 52.0376 26.0831 -0.4271 -40.9022 18.0857 %! 18.8203 -57.6244 -29.0938 0.5870 45.3309 -19.8644 %! -26.5994 77.9693 39.0368 -1.4020 -60.1129 26.6910 %! -21.4163 62.1719 30.7507 -0.9201 -48.6221 21.8351 %! -0.8911 4.2787 2.3286 -0.2424 -3.0376 1.2169 %! -5.3286 16.1955 8.4824 -0.2489 -12.2348 5.1590]; %! %! KB = [ 16.9788 14.1648 %! -18.9215 -15.6726 %! 25.2046 21.2848 %! 20.1122 16.8322 %! 1.4104 1.2040 %! 5.3181 4.5149]; %! %! KC = [ -9.1941 27.5165 13.7364 -0.3639 -21.5983 9.6025 %! 3.6490 -10.6194 -5.2772 0.2432 8.1108 -3.6293]; %! %! KD = [ 9.0317 7.5348 %! -3.4006 -2.8219]; %! %! M_exp = [KA, KB; KC, KD]; %! %!assert (M, M_exp, 1e-4); ## optimal controller, discrete-time case??? -- test for bisection method %!shared M, M_exp, GAM_exp, GAM %! A = [-0.7 0.0 0.3 0.0 -0.5 -0.1 %! -0.6 0.2 -0.4 -0.3 0.0 0.0 %! -0.5 0.7 -0.1 0.0 0.0 -0.8 %! -0.7 0.0 0.0 -0.5 -1.0 0.0 %! 0.0 0.3 0.6 -0.9 0.1 -0.4 %! 0.5 -0.8 0.0 0.0 0.2 -0.9]; %! %! B = [-1.0 -2.0 -2.0 1.0 0.0 %! 1.0 0.0 1.0 -2.0 1.0 %! -3.0 -4.0 0.0 2.0 -2.0 %! 1.0 -2.0 1.0 0.0 -1.0 %! 0.0 1.0 -2.0 0.0 3.0 %! 1.0 0.0 3.0 -1.0 -2.0]; %! %! C = [ 1.0 -1.0 2.0 -2.0 0.0 -3.0 %! -3.0 0.0 1.0 -1.0 1.0 0.0 %! 0.0 2.0 0.0 -4.0 0.0 -2.0 %! 1.0 -3.0 0.0 0.0 3.0 1.0 %! 0.0 1.0 -2.0 1.0 0.0 -2.0]; %! %! D = [ 1.0 -1.0 -2.0 0.0 0.0 %! 0.0 1.0 0.0 1.0 0.0 %! 2.0 -1.0 -3.0 0.0 1.0 %! 0.0 1.0 0.0 1.0 -1.0 %! 0.0 0.0 1.0 2.0 1.0]; %! %! P = ss (A, B, C, D, 1); %! [K, ~, GAM] = hinfsyn (P, 2, 2, "gmax", 1000, "tolgam", 1e-4); %! M = [K.A, K.B; K.C, K.D]; %! %! KA = [-18.0030 52.0376 26.0831 -0.4271 -40.9022 18.0857 %! 18.8203 -57.6244 -29.0938 0.5870 45.3309 -19.8644 %! -26.5994 77.9693 39.0368 -1.4020 -60.1129 26.6910 %! -21.4163 62.1719 30.7507 -0.9201 -48.6221 21.8351 %! -0.8911 4.2787 2.3286 -0.2424 -3.0376 1.2169 %! -5.3286 16.1955 8.4824 -0.2489 -12.2348 5.1590]; %! %! KB = [ 16.9788 14.1648 %! -18.9215 -15.6726 %! 25.2046 21.2848 %! 20.1122 16.8322 %! 1.4104 1.2040 %! 5.3181 4.5149]; %! %! KC = [ -9.1941 27.5165 13.7364 -0.3639 -21.5983 9.6025 %! 3.6490 -10.6194 -5.2772 0.2432 8.1108 -3.6293]; %! %! KD = [ 9.0317 7.5348 %! -3.4006 -2.8219]; %! %! M_exp = [KA, KB; KC, KD]; %! GAM_exp = 111.294; %! %!assert (M, M_exp, 1e-1); %!assert (GAM, GAM_exp, 1e-3); control/inst/hnamodred.m0000644000076500000240000003401112273411257014637 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{Gr}, @var{info}] =} hnamodred (@var{G}, @dots{}) ## @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} hnamodred (@var{G}, @var{nr}, @dots{}) ## @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} hnamodred (@var{G}, @var{opt}, @dots{}) ## @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} hnamodred (@var{G}, @var{nr}, @var{opt}, @dots{}) ## ## Model order reduction by frequency weighted optimal Hankel-norm (HNA) method. ## The aim of model reduction is to find an @acronym{LTI} system @var{Gr} of order ## @var{nr} (nr < n) such that the input-output behaviour of @var{Gr} ## approximates the one from original system @var{G}. ## ## HNA is an absolute error method which tries to minimize ## @iftex ## @tex ## $$ || G - G_r ||_H = \\min $$ ## $$ || V \\ (G - G_r) \\ W ||_H = \\min $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ||G-Gr|| = min ## H ## ## ||V (G-Gr) W|| = min ## H ## @end example ## @end ifnottex ## where @var{V} and @var{W} denote output and input weightings. ## ## ## @strong{Inputs} ## @table @var ## @item G ## @acronym{LTI} model to be reduced. ## @item nr ## The desired order of the resulting reduced order system @var{Gr}. ## If not specified, @var{nr} is chosen automatically according ## to the description of key @var{"order"}. ## @item @dots{} ## Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. ## @item opt ## Optional struct with keys as field names. ## Struct @var{opt} can be created directly or ## by command @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. ## @end table ## ## @strong{Outputs} ## @table @var ## @item Gr ## Reduced order state-space model. ## @item info ## Struct containing additional information. ## @table @var ## @item info.n ## The order of the original system @var{G}. ## @item info.ns ## The order of the @var{alpha}-stable subsystem of the original system @var{G}. ## @item info.hsv ## The Hankel singular values corresponding to the projection @code{op(V)*G1*op(W)}, ## where G1 denotes the @var{alpha}-stable part of the original system @var{G}. ## The @var{ns} Hankel singular values are ordered decreasingly. ## @item info.nu ## The order of the @var{alpha}-unstable subsystem of both the original ## system @var{G} and the reduced-order system @var{Gr}. ## @item info.nr ## The order of the obtained reduced order system @var{Gr}. ## @end table ## @end table ## ## ## @strong{Option Keys and Values} ## @table @var ## @item 'order', 'nr' ## The desired order of the resulting reduced order system @var{Gr}. ## If not specified, @var{nr} is the sum of @var{info.nu} and the number of ## Hankel singular values greater than @code{max(tol1, ns*eps*info.hsv(1)}; ## ## @item 'method' ## Specifies the computational approach to be used. ## Valid values corresponding to this key are: ## @table @var ## @item 'descriptor' ## Use the inverse free descriptor system approach. ## @item 'standard' ## Use the inversion based standard approach. ## @item 'auto' ## Switch automatically to the inverse free ## descriptor approach in case of badly conditioned ## feedthrough matrices in V or W. Default method. ## @end table ## ## ## @item 'left', 'v' ## @acronym{LTI} model of the left/output frequency weighting. ## The weighting must be antistable. ## @iftex ## @math{|| V \\ (G-G_r) \\dots ||_H = \\min} ## @end iftex ## @ifnottex ## @example ## || V (G-Gr) . || = min ## H ## @end example ## @end ifnottex ## ## @item 'right', 'w' ## @acronym{LTI} model of the right/input frequency weighting. ## The weighting must be antistable. ## @iftex ## @math{|| \\dots (G-G_r) \\ W ||_H = \\min} ## @end iftex ## @ifnottex ## @example ## || . (G-Gr) W || = min ## H ## @end example ## @end ifnottex ## ## ## @item 'left-inv', 'inv-v' ## @acronym{LTI} model of the left/output frequency weighting. ## The weighting must have only antistable zeros. ## @iftex ## @math{|| inv(V) \\ (G-G_r) \\dots ||_H = \\min} ## @end iftex ## @ifnottex ## @example ## || inv(V) (G-Gr) . || = min ## H ## @end example ## @end ifnottex ## ## @item 'right-inv', 'inv-w' ## @acronym{LTI} model of the right/input frequency weighting. ## The weighting must have only antistable zeros. ## @iftex ## @math{|| \\dots (G-G_r) \\ inv(W) ||_H = \\min} ## @end iftex ## @ifnottex ## @example ## || . (G-Gr) inv(W) || = min ## H ## @end example ## @end ifnottex ## ## ## @item 'left-conj', 'conj-v' ## @acronym{LTI} model of the left/output frequency weighting. ## The weighting must be stable. ## @iftex ## @math{|| conj(V) \\ (G-G_r) \\dots ||_H = \\min} ## @end iftex ## @ifnottex ## @example ## || V (G-Gr) . || = min ## H ## @end example ## @end ifnottex ## ## @item 'right-conj', 'conj-w' ## @acronym{LTI} model of the right/input frequency weighting. ## The weighting must be stable. ## @iftex ## @math{|| \\dots (G-G_r) \\ conj(W) ||_H = \\min} ## @end iftex ## @ifnottex ## @example ## || . (G-Gr) W || = min ## H ## @end example ## @end ifnottex ## ## ## @item 'left-conj-inv', 'conj-inv-v' ## @acronym{LTI} model of the left/output frequency weighting. ## The weighting must be minimum-phase. ## @iftex ## @math{|| conj(inv(V)) \\ (G-G_r) \\dots ||_H = \\min} ## @end iftex ## @ifnottex ## @example ## || V (G-Gr) . || = min ## H ## @end example ## @end ifnottex ## ## @item 'right-conj-inv', 'conj-inv-w' ## @acronym{LTI} model of the right/input frequency weighting. ## The weighting must be minimum-phase. ## @iftex ## @math{|| \\dots (G-G_r) \\ conj(inv(W)) ||_H = \\min} ## @end iftex ## @ifnottex ## @example ## || . (G-Gr) W || = min ## H ## @end example ## @end ifnottex ## ## ## @item 'alpha' ## Specifies the ALPHA-stability boundary for the eigenvalues ## of the state dynamics matrix @var{G.A}. For a continuous-time ## system, ALPHA <= 0 is the boundary value for ## the real parts of eigenvalues, while for a discrete-time ## system, 0 <= ALPHA <= 1 represents the ## boundary value for the moduli of eigenvalues. ## The ALPHA-stability domain does not include the boundary. ## Default value is 0 for continuous-time systems and ## 1 for discrete-time systems. ## ## @item 'tol1' ## If @var{'order'} is not specified, @var{tol1} contains the tolerance for ## determining the order of the reduced model. ## For model reduction, the recommended value of @var{tol1} is ## c*info.hsv(1), where c lies in the interval [0.00001, 0.001]. ## @var{tol1} < 1. ## If @var{'order'} is specified, the value of @var{tol1} is ignored. ## ## @item 'tol2' ## The tolerance for determining the order of a minimal ## realization of the ALPHA-stable part of the given ## model. @var{tol2} <= @var{tol1} < 1. ## If not specified, ns*eps*info.hsv(1) is chosen. ## ## @item 'equil', 'scale' ## Boolean indicating whether equilibration (scaling) should be ## performed on system @var{G} prior to order reduction. ## Default value is true if @code{G.scaled == false} and ## false if @code{G.scaled == true}. ## Note that for @acronym{MIMO} models, proper scaling of both inputs and outputs ## is of utmost importance. The input and output scaling can @strong{not} ## be done by the equilibration option or the @command{prescale} command ## because these functions perform state transformations only. ## Furthermore, signals should not be scaled simply to a certain range. ## For all inputs (or outputs), a certain change should be of the same ## importance for the model. ## @end table ## ## ## Approximation Properties: ## @itemize @bullet ## @item ## Guaranteed stability of reduced models ## @item ## Lower guaranteed error bound ## @item ## Guaranteed a priori error bound ## @iftex ## @tex ## $$ \\sigma_{r+1} \\leq || (G-G_r) ||_{\\infty} \\leq 2 \\sum_{j=r+1}^{n} \\sigma_j $$ ## @end tex ## @end iftex ## @end itemize ## ## @strong{Algorithm}@* ## Uses SLICOT AB09JD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2011 ## Version: 0.1 function [Gr, info] = hnamodred (G, varargin) if (nargin == 0) print_usage (); endif if (! isa (G, "lti")) error ("hnamodred: first argument must be an LTI system"); endif if (nargin > 1) # hnamodred (G, ...) if (is_real_scalar (varargin{1})) # hnamodred (G, nr) varargin = horzcat (varargin(2:end), {"order"}, varargin(1)); endif if (isstruct (varargin{1})) # hnamodred (G, opt, ...), hnamodred (G, nr, opt, ...) varargin = horzcat (__opt2cell__ (varargin{1}), varargin(2:end)); endif ## order placed at the end such that nr from hnamodred (G, nr, ...) ## and hnamodred (G, nr, opt, ...) overrides possible nr's from ## key/value-pairs and inside opt struct (later keys override former keys, ## nr > key/value > opt) endif nkv = numel (varargin); # number of keys and values if (rem (nkv, 2)) error ("hnamodred: keys and values must come in pairs"); endif [a, b, c, d, tsam, scaled] = ssdata (G); [p, m] = size (G); dt = isdt (G); ## default arguments alpha = __modred_default_alpha__ (dt); av = bv = cv = dv = []; jobv = 0; aw = bw = cw = dw = []; jobw = 0; jobinv = 2; tol1 = 0; tol2 = 0; ordsel = 1; nr = 0; ## handle keys and values for k = 1 : 2 : nkv key = lower (varargin{k}); val = varargin{k+1}; switch (key) case {"left", "v", "wo"} [av, bv, cv, dv, jobv] = __modred_check_weight__ (val, dt, p, p); ## TODO: correct error messages for non-square weights case {"right", "w", "wi"} [aw, bw, cw, dw, jobw] = __modred_check_weight__ (val, dt, m, m); case {"left-inv", "inv-v"} [av, bv, cv, dv] = __modred_check_weight__ (val, dt, p, p); jobv = 2; case {"right-inv", "inv-w"} [aw, bw, cw, dw] = __modred_check_weight__ (val, dt, m, m); jobv = 2 case {"left-conj", "conj-v"} [av, bv, cv, dv] = __modred_check_weight__ (val, dt, p, p); jobv = 3; case {"right-conj", "conj-w"} [aw, bw, cw, dw] = __modred_check_weight__ (val, dt, m, m); jobv = 3 case {"left-conj-inv", "conj-inv-v"} [av, bv, cv, dv] = __modred_check_weight__ (val, dt, p, p); jobv = 4; case {"right-conj-inv", "conj-inv-w"} [aw, bw, cw, dw] = __modred_check_weight__ (val, dt, m, m); jobv = 4 case {"order", "nr"} [nr, ordsel] = __modred_check_order__ (val, rows (a)); case "tol1" tol1 = __modred_check_tol__ (val, "tol1"); case "tol2" tol2 = __modred_check_tol__ (val, "tol2"); case "alpha" alpha = __modred_check_alpha__ (val, dt); case "method" switch (tolower (val(1))) case {"d", "n"} # "descriptor" jobinv = 0; case {"s", "i"} # "standard" jobinv = 1; case "a" # {"auto", "automatic"} jobinv = 2; otherwise error ("hnamodred: invalid computational approach"); endswitch case {"equil", "equilibrate", "equilibration", "scale", "scaling"} scaled = __modred_check_equil__ (val); otherwise warning ("hnamodred: invalid property name '%s' ignored", key); endswitch endfor ## perform model order reduction [ar, br, cr, dr, nr, hsv, ns] = __sl_ab09jd__ (a, b, c, d, dt, scaled, nr, ordsel, alpha, ... jobv, av, bv, cv, dv, ... jobw, aw, bw, cw, dw, ... jobinv, tol1, tol2); ## assemble reduced order model Gr = ss (ar, br, cr, dr, tsam); ## assemble info struct n = rows (a); nu = n - ns; info = struct ("n", n, "ns", ns, "hsv", hsv, "nu", nu, "nr", nr); endfunction %!shared Mo, Me, Info, HSVe %! A = [ -3.8637 -7.4641 -9.1416 -7.4641 -3.8637 -1.0000 %! 1.0000, 0 0 0 0 0 %! 0 1.0000 0 0 0 0 %! 0 0 1.0000 0 0 0 %! 0 0 0 1.0000 0 0 %! 0 0 0 0 1.0000 0 ]; %! %! B = [ 1 %! 0 %! 0 %! 0 %! 0 %! 0 ]; %! %! C = [ 0 0 0 0 0 1 ]; %! %! D = [ 0 ]; %! %! G = ss (A, B, C, D); # "scaled", false %! %! AV = [ 0.2000 -1.0000 %! 1.0000 0 ]; %! %! BV = [ 1 %! 0 ]; %! %! CV = [ -1.8000 0 ]; %! %! DV = [ 1 ]; %! %! V = ss (AV, BV, CV, DV); %! %! [Gr, Info] = hnamodred (G, "left", V, "tol1", 1e-1, "tol2", 1e-14); %! [Ao, Bo, Co, Do] = ssdata (Gr); %! %! Ae = [ -0.2391 0.3072 1.1630 1.1967 %! -2.9709 -0.2391 2.6270 3.1027 %! 0.0000 0.0000 -0.5137 -1.2842 %! 0.0000 0.0000 0.1519 -0.5137 ]; %! %! Be = [ -1.0497 %! -3.7052 %! 0.8223 %! 0.7435 ]; %! %! Ce = [ -0.4466 0.0143 -0.4780 -0.2013 ]; %! %! De = [ 0.0219 ]; %! %! HSVe = [ 2.6790 2.1589 0.8424 0.1929 0.0219 0.0011 ].'; %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [Ae, Be; Ce, De]; %! %!assert (Mo, Me, 1e-4); %!assert (Info.hsv, HSVe, 1e-4); control/inst/hsvd.m0000644000076500000240000000655512273411257013656 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {@var{hsv} =} hsvd (@var{sys}) ## @deftypefnx{Function File} {@var{hsv} =} hsvd (@var{sys}, @var{"offset"}, @var{offset}) ## @deftypefnx{Function File} {@var{hsv} =} hsvd (@var{sys}, @var{"alpha"}, @var{alpha}) ## Hankel singular values of the stable part of an @acronym{LTI} model. If no output arguments are ## given, the Hankel singular values are displayed in a plot. ## ## @strong{Algorithm}@* ## Uses SLICOT AB13AD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## @end deftypefn ## Author: Lukas Reichlin ## Created: January 2010 ## Version: 0.4 function hsv_r = hsvd (sys, prop = "offset", val = 1e-8) if (nargin != 1 && nargin != 3) print_usage (); endif if (! isa (sys, "lti")) error ("hsvd: first argument must be an LTI system"); endif if (! is_real_scalar (val)) error ("hsvd: third argument must be a real scalar"); endif [a, b, c, ~, ~, scaled] = ssdata (sys); discrete = ! isct (sys); switch (tolower (prop(1))) case "o" # offset if (discrete) alpha = 1 - val; else alpha = - val; endif case "a" # alpha alpha = val; otherwise error ("hsvd: second argument invalid"); endswitch [hsv, ns] = __sl_ab13ad__ (a, b, c, discrete, alpha, scaled); if (nargout) hsv_r = hsv; else bar ((1:ns) + (rows (a) - ns), hsv); title (["Hankel Singular Values of Stable Part of ", inputname(1)]); xlabel ("State"); ylabel ("State Energy"); grid ("on"); endif endfunction %!shared hsv, hsv_exp %! a = [ -0.04165 0.0000 4.9200 -4.9200 0.0000 0.0000 0.0000 %! -5.2100 -12.500 0.0000 0.0000 0.0000 0.0000 0.0000 %! 0.0000 3.3300 -3.3300 0.0000 0.0000 0.0000 0.0000 %! 0.5450 0.0000 0.0000 0.0000 -0.5450 0.0000 0.0000 %! 0.0000 0.0000 0.0000 4.9200 -0.04165 0.0000 4.9200 %! 0.0000 0.0000 0.0000 0.0000 -5.2100 -12.500 0.0000 %! 0.0000 0.0000 0.0000 0.0000 0.0000 3.3300 -3.3300]; %! %! b = [ 0.0000 0.0000 %! 12.5000 0.0000 %! 0.0000 0.0000 %! 0.0000 0.0000 %! 0.0000 0.0000 %! 0.0000 12.500 %! 0.0000 0.0000]; %! %! c = [ 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 1.0000 0.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 0.0000 1.0000 0.0000 0.0000]; %! %! sys = ss (a, b, c, [], "scaled", true); %! hsv = hsvd (sys, "alpha", 0.0); %! %! hsv_exp = [2.5139; 2.0846; 1.9178; 0.7666; 0.5473; 0.0253; 0.0246]; %! %!assert (hsv, hsv_exp, 1e-4); control/inst/impulse.m0000644000076500000240000000663612273411257014370 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {} impulse (@var{sys}) ## @deftypefnx{Function File} {} impulse (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) ## @deftypefnx{Function File} {} impulse (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) ## @deftypefnx{Function File} {} impulse (@var{sys1}, @dots{}, @var{t}) ## @deftypefnx{Function File} {} impulse (@var{sys1}, @dots{}, @var{tfinal}) ## @deftypefnx{Function File} {} impulse (@var{sys1}, @dots{}, @var{tfinal}, @var{dt}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} impulse (@var{sys}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} impulse (@var{sys}, @var{t}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} impulse (@var{sys}, @var{tfinal}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} impulse (@var{sys}, @var{tfinal}, @var{dt}) ## Impulse response of @acronym{LTI} system. ## If no output arguments are given, the response is printed on the screen. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. ## @item t ## Time vector. Should be evenly spaced. If not specified, it is calculated by ## the poles of the system to reflect adequately the response transients. ## @item tfinal ## Optional simulation horizon. If not specified, it is calculated by ## the poles of the system to reflect adequately the response transients. ## @item dt ## Optional sampling time. Be sure to choose it small enough to capture transient ## phenomena. If not specified, it is calculated by the poles of the system. ## @item 'style' ## Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted ## black line. See @command{help plot} for details. ## @end table ## ## @strong{Outputs} ## @table @var ## @item y ## Output response array. Has as many rows as time samples (length of t) ## and as many columns as outputs. ## @item t ## Time row vector. ## @item x ## State trajectories array. Has @code{length (t)} rows and as many columns as states. ## @end table ## ## @seealso{initial, lsim, step} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.2 function [y_r, t_r, x_r] = impulse (varargin) if (nargin == 0) print_usage (); endif if (nargout) sysname = {}; else sys_idx = find (cellfun (@isa, varargin, {"lti"})); len = length (sys_idx); sysname = cell (len, 1); for k = 1 : len try sysname{k} = inputname(sys_idx(k)); catch sysname{k} = ""; end_try_catch endfor endif [y, t, x] = __time_response__ ("impulse", varargin, sysname, ! nargout); if (nargout) y_r = y{1}; t_r = t{1}; x_r = x{1}; endif endfunction control/inst/initial.m0000644000076500000240000001246612273411257014341 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {} initial (@var{sys}, @var{x0}) ## @deftypefnx{Function File} {} initial (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{x0}) ## @deftypefnx{Function File} {} initial (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}, @var{x0}) ## @deftypefnx{Function File} {} initial (@var{sys1}, @dots{}, @var{x0}, @var{t}) ## @deftypefnx{Function File} {} initial (@var{sys1}, @dots{}, @var{x0}, @var{tfinal}) ## @deftypefnx{Function File} {} initial (@var{sys1}, @dots{}, @var{x0}, @var{tfinal}, @var{dt}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} initial (@var{sys}, @var{x0}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} initial (@var{sys}, @var{x0}, @var{t}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} initial (@var{sys}, @var{x0}, @var{tfinal}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} initial (@var{sys}, @var{x0}, @var{tfinal}, @var{dt}) ## Initial condition response of state-space model. ## If no output arguments are given, the response is printed on the screen. ## ## @strong{Inputs} ## @table @var ## @item sys ## State-space model. ## @item x0 ## Vector of initial conditions for each state. ## @item t ## Optional time vector. Should be evenly spaced. If not specified, it is calculated ## by the poles of the system to reflect adequately the response transients. ## @item tfinal ## Optional simulation horizon. If not specified, it is calculated by ## the poles of the system to reflect adequately the response transients. ## @item dt ## Optional sampling time. Be sure to choose it small enough to capture transient ## phenomena. If not specified, it is calculated by the poles of the system. ## @item 'style' ## Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted ## black line. See @command{help plot} for details. ## @end table ## ## @strong{Outputs} ## @table @var ## @item y ## Output response array. Has as many rows as time samples (length of t) ## and as many columns as outputs. ## @item t ## Time row vector. ## @item x ## State trajectories array. Has @code{length (t)} rows and as many columns as states. ## @end table ## ## @strong{Example} ## @example ## @group ## . ## Continuous Time: x = A x , y = C x , x(0) = x0 ## ## Discrete Time: x[k+1] = A x[k] , y[k] = C x[k] , x[0] = x0 ## @end group ## @end example ## ## @seealso{impulse, lsim, step} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.2 function [y_r, t_r, x_r] = initial (varargin) if (nargin < 2) print_usage (); endif if (nargout) sysname = {}; else sys_idx = find (cellfun (@isa, varargin, {"lti"})); len = length (sys_idx); sysname = cell (len, 1); for k = 1 : len try sysname{k} = inputname(sys_idx(k)); catch sysname{k} = ""; end_try_catch endfor endif [y, t, x] = __time_response__ ("initial", varargin, sysname, ! nargout); if (nargout) y_r = y{1}; t_r = t{1}; x_r = x{1}; endif endfunction %!shared initial_c, initial_c_exp, initial_d, initial_d_exp %! %! A = [ -2.8 2.0 -1.8 %! -2.4 -2.0 0.8 %! 1.1 1.7 -1.0 ]; %! %! B = [ -0.8 0.5 0 %! 0 0.7 2.3 %! -0.3 -0.1 0.5 ]; %! %! C = [ -0.1 0 -0.3 %! 0.9 0.5 1.2 %! 0.1 -0.1 1.9 ]; %! %! D = [ -0.5 0 0 %! 0.1 0 0.3 %! -0.8 0 0 ]; %! %! x_0 = [1, 2, 3]; %! %! sysc = ss (A, B, C, D); %! %! [yc, tc, xc] = initial (sysc, x_0, 0.2, 0.1); %! initial_c = [yc, tc, xc]; %! %! sysd = c2d (sysc, 2); %! %! [yd, td, xd] = initial (sysd, x_0, 4); %! initial_d = [yd, td, xd]; %! %! ## expected values computed by the "dark side" %! %! yc_exp = [ -1.0000 5.5000 5.6000 %! -0.9872 5.0898 5.7671 %! -0.9536 4.6931 5.7598 ]; %! %! tc_exp = [ 0.0000 %! 0.1000 %! 0.2000 ]; %! %! xc_exp = [ 1.0000 2.0000 3.0000 %! 0.5937 1.6879 3.0929 %! 0.2390 1.5187 3.0988 ]; %! %! initial_c_exp = [yc_exp, tc_exp, xc_exp]; %! %! yd_exp = [ -1.0000 5.5000 5.6000 %! -0.6550 3.1673 4.2228 %! -0.5421 2.6186 3.4968 ]; %! %! td_exp = [ 0 %! 2 %! 4 ]; %! %! xd_exp = [ 1.0000 2.0000 3.0000 %! -0.4247 1.5194 2.3249 %! -0.3538 1.2540 1.9250 ]; %! %! initial_d_exp = [yd_exp, td_exp, xd_exp]; %! %!assert (initial_c, initial_c_exp, 1e-4) %!assert (initial_d, initial_d_exp, 1e-4) control/inst/isctrb.m0000644000076500000240000000722612273411257014174 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{bool}, @var{ncon}] =} isctrb (@var{sys}) ## @deftypefnx {Function File} {[@var{bool}, @var{ncon}] =} isctrb (@var{sys}, @var{tol}) ## @deftypefnx {Function File} {[@var{bool}, @var{ncon}] =} isctrb (@var{a}, @var{b}) ## @deftypefnx {Function File} {[@var{bool}, @var{ncon}] =} isctrb (@var{a}, @var{b}, @var{e}) ## @deftypefnx {Function File} {[@var{bool}, @var{ncon}] =} isctrb (@var{a}, @var{b}, @var{[]}, @var{tol}) ## @deftypefnx {Function File} {[@var{bool}, @var{ncon}] =} isctrb (@var{a}, @var{b}, @var{e}, @var{tol}) ## Logical check for system controllability. ## For numerical reasons, @code{isctrb (sys)} ## should be used instead of @code{rank (ctrb (sys))}. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. Descriptor state-space models are possible. ## If @var{sys} is not a state-space model, it is converted to ## a minimal state-space realization, so beware of pole-zero ## cancellations which may lead to wrong results! ## @item a ## State matrix (n-by-n). ## @item b ## Input matrix (n-by-m). ## @item e ## Descriptor matrix (n-by-n). ## If @var{e} is empty @code{[]} or not specified, an identity matrix is assumed. ## @item tol ## Optional roundoff parameter. Default value is 0. ## @end table ## ## @strong{Outputs} ## @table @var ## @item bool = 0 ## System is not controllable. ## @item bool = 1 ## System is controllable. ## @item ncon ## Number of controllable states. ## @end table ## ## @strong{Algorithm}@* ## Uses SLICOT AB01OD and TG01HD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @seealso{isobsv} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.5 function [bool, ncont] = isctrb (a, b = [], e = [], tol = []) if (nargin < 1 || nargin > 4) print_usage (); elseif (isa (a, "lti")) # isctrb (sys), isctrb (sys, tol) if (nargin > 2) print_usage (); endif if (! isa (a, "ss")) warning ("isctrb: converting to minimal state-space realization"); endif tol = b; [a, b, c, d, e] = dssdata (a, []); elseif (nargin < 2) # isctrb (a, b), isctrb (a, b, tol) print_usage (); elseif (! is_real_square_matrix (a) || ! is_real_matrix (b) || rows (a) != rows (b)) error ("isctrb: a(%dx%d), b(%dx%d) not conformal", rows (a), columns (a), rows (b), columns (b)); elseif (! isempty (e) && (! is_real_square_matrix (e) || ! size_equal (e, a))) error ("isctrb: a(%dx%d), e(%dx%d) not conformal", rows (a), columns (a), rows (e), columns (e)); endif if (isempty (tol)) tol = 0; # default tolerance elseif (! is_real_scalar (tol)) error ("isctrb: tol must be a real scalar"); endif if (isempty (e)) [~, ~, ~, ncont] = __sl_ab01od__ (a, b, tol); else [~, ~, ~, ~, ~, ~, ncont] = __sl_tg01hd__ (a, e, b, zeros (1, columns (a)), tol); endif bool = (ncont == rows (a)); endfunction control/inst/isdetectable.m0000644000076500000240000000660412273411257015335 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{bool} =} isdetectable (@var{sys}) ## @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{sys}, @var{tol}) ## @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}) ## @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{e}) ## @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{[]}, @var{tol}) ## @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{e}, @var{tol}) ## @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{[]}, @var{[]}, @var{dflg}) ## @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{e}, @var{[]}, @var{dflg}) ## @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{[]}, @var{tol}, @var{dflg}) ## @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{e}, @var{tol}, @var{dflg}) ## Logical test for system detectability. ## All unstable modes must be observable or all unobservable states must be stable. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. ## @item a ## State transition matrix. ## @item c ## Measurement matrix. ## @item e ## Descriptor matrix. ## If @var{e} is empty @code{[]} or not specified, an identity matrix is assumed. ## @item tol ## Optional tolerance for stability. Default value is 0. ## @item dflg = 0 ## Matrices (@var{a}, @var{c}) are part of a continuous-time system. Default Value. ## @item dflg = 1 ## Matrices (@var{a}, @var{c}) are part of a discrete-time system. ## @end table ## ## @strong{Outputs} ## @table @var ## @item bool = 0 ## System is not detectable. ## @item bool = 1 ## System is detectable. ## @end table ## ## ## @strong{Algorithm}@* ## Uses SLICOT AB01OD and TG01HD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## See @command{isstabilizable} for description of computational method. ## @seealso{isstabilizable, isstable, isctrb, isobsv} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.3 function bool = isdetectable (a, c = [], e = [], tol = [], dflg = 0) if (nargin == 0) print_usage (); elseif (isa (a, "lti")) # isdetectable (sys), isdetectable (sys, tol) if (nargin > 2) print_usage (); endif bool = isstabilizable (a.', c); # transpose is overloaded elseif (nargin < 2 || nargin > 5) print_usage (); else # isdetectable (a, c, ...) bool = isstabilizable (a.', c.', e.', tol, dflg); # arguments checked inside endif endfunction control/inst/isobsv.m0000644000076500000240000000535412273411257014213 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{bool}, @var{nobs}] =} isobsv (@var{sys}) ## @deftypefnx {Function File} {[@var{bool}, @var{nobs}] =} isobsv (@var{sys}, @var{tol}) ## @deftypefnx {Function File} {[@var{bool}, @var{nobs}] =} isobsv (@var{a}, @var{c}) ## @deftypefnx {Function File} {[@var{bool}, @var{nobs}] =} isobsv (@var{a}, @var{c}, @var{e}) ## @deftypefnx {Function File} {[@var{bool}, @var{nobs}] =} isobsv (@var{a}, @var{c}, @var{[]}, @var{tol}) ## @deftypefnx {Function File} {[@var{bool}, @var{nobs}] =} isobsv (@var{a}, @var{c}, @var{e}, @var{tol}) ## Logical check for system observability. ## For numerical reasons, @code{isobsv (sys)} ## should be used instead of @code{rank (obsv (sys))}. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. Descriptor state-space models are possible. ## @item a ## State matrix (n-by-n). ## @item c ## Measurement matrix (p-by-n). ## @item e ## Descriptor matrix (n-by-n). ## If @var{e} is empty @code{[]} or not specified, an identity matrix is assumed. ## @item tol ## Optional roundoff parameter. Default value is 0. ## @end table ## ## @strong{Outputs} ## @table @var ## @item bool = 0 ## System is not observable. ## @item bool = 1 ## System is observable. ## @item nobs ## Number of observable states. ## @end table ## ## @strong{Algorithm}@* ## Uses SLICOT AB01OD and TG01HD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @seealso{isctrb} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.4 function [bool, nobs] = isobsv (a, c = [], e = [], tol = []) if (nargin == 0) print_usage (); elseif (isa (a, "lti")) # isobsv (sys), isobsv (sys, tol) if (nargin > 2) print_usage (); endif [bool, nobs] = isctrb (a.', c); # transpose is overloaded elseif (nargin < 2 || nargin > 4) print_usage (); else # isobsv (a, c), isobsv (a, c, e), ... [bool, nobs] = isctrb (a.', c.', e.', tol); endif endfunction control/inst/issample.m0000644000076500000240000000661712273411257014526 0ustar lukasstaff## Copyright (C) 1996, 2000, 2002, 2003, 2004, 2005, 2007 ## Auburn University. All rights reserved. ## ## 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 . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{bool} =} issample (@var{ts}) ## @deftypefnx {Function File} {@var{bool} =} issample (@var{ts}, @var{flg}) ## Return true if @var{ts} is a valid sampling time. ## ## @strong{Inputs} ## @table @var ## @item ts ## Alleged sampling time to be tested. ## @item flg = 1 ## Accept real scalars @var{ts} > 0. Default Value. ## @item flg = 0 ## Accept real scalars @var{ts} >= 0. ## @item flg = -1 ## Accept real scalars @var{ts} > 0 and @var{ts} == -1. ## @item flg = -10 ## Accept real scalars @var{ts} >= 0 and @var{ts} == -1. ## @item flg = -2 ## Accept real scalars @var{ts} >= 0, @var{ts} == -1 and @var{ts} == -2. ## @end table ## ## @strong{Outputs} ## @table @var ## @item bool ## True if conditions are met and false otherwise. ## @end table ## ## @end deftypefn ## Author: A. S. Hodel ## Created: July 1995 ## Adapted-By: Lukas Reichlin ## Date: September 2009 ## Version: 0.3 function bool = issample (tsam, flg = 1) if (nargin < 1 || nargin > 2) print_usage (); endif switch (flg) case 1 # discrete bool = is_real_scalar (tsam) && (tsam > 0); case 0 # continuous or discrete bool = is_real_scalar (tsam) && (tsam >= 0); case -1 # discrete, tsam unspecified bool = is_real_scalar (tsam) && (tsam > 0 || tsam == -1); case -10 # continuous or discrete, tsam unspecified bool = is_real_scalar (tsam) && (tsam >= 0 || tsam == -1); case -2 # accept static gains bool = is_real_scalar (tsam) && (tsam >= 0 || tsam == -1 || tsam == -2); otherwise print_usage (); endswitch endfunction ## flg == 1 %!assert (issample (1)) %!assert (issample (pi)) %!assert (issample (0), false) %!assert (issample (-1), false) %!assert (issample (-1, 1), false) %!assert (issample ("a"), false) %!assert (issample (eye (2)), false) %!assert (issample (2+2i), false) ## flg == 0 %!assert (issample (1, 0)) %!assert (issample (0, 0)) %!assert (issample (-1, 0), false) %!assert (issample (pi, 0)) %!assert (issample ("b", 0), false) %!assert (issample (rand (3,2), 0), false) %!assert (issample (2+2i, 0), false) %!assert (issample (0+2i, 0), false) ## flg == -1 %!assert (issample (-1, -1)) %!assert (issample (0, -1), false) %!assert (issample (1, -1)) %!assert (issample (pi, -1)) %!assert (issample (-pi, -1), false) %!assert (issample ("b", -1), false) %!assert (issample (rand (3,2), -1), false) %!assert (issample (-2+2i, -1), false) ## errors %!error (issample (-1, "ab")) %!error (issample ()) %!error (issample (-1, -1, -1)) %!error (issample (1, pi)) %!error (issample (5, rand (2,3))) %!error (issample (0, 1+2i)) control/inst/isstabilizable.m0000644000076500000240000001225512273411257015705 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{bool} =} isstabilizable (@var{sys}) ## @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{sys}, @var{tol}) ## @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}) ## @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{e}) ## @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{[]}, @var{tol}) ## @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{e}, @var{tol}) ## @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{[]}, @var{[]}, @var{dflg}) ## @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{e}, @var{[]}, @var{dflg}) ## @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{[]}, @var{tol}, @var{dflg}) ## @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{e}, @var{tol}, @var{dflg}) ## Logical check for system stabilizability. ## All unstable modes must be controllable or all uncontrollable states must be stable. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. If @var{sys} is not a state-space system, it is converted to ## a minimal state-space realization, so beware of pole-zero cancellations ## which may lead to wrong results! ## @item a ## State transition matrix. ## @item b ## Input matrix. ## @item e ## Descriptor matrix. ## If @var{e} is empty @code{[]} or not specified, an identity matrix is assumed. ## @item tol ## Optional tolerance for stability. Default value is 0. ## @item dflg = 0 ## Matrices (@var{a}, @var{b}) are part of a continuous-time system. Default Value. ## @item dflg = 1 ## Matrices (@var{a}, @var{b}) are part of a discrete-time system. ## @end table ## ## @strong{Outputs} ## @table @var ## @item bool = 0 ## System is not stabilizable. ## @item bool = 1 ## System is stabilizable. ## @end table ## ## @strong{Algorithm}@* ## Uses SLICOT AB01OD and TG01HD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## @example ## @group ## * Calculate staircase form (SLICOT AB01OD) ## * Extract unobservable part of state transition matrix ## * Calculate eigenvalues of unobservable part ## * Check whether ## real (ev) < -tol*(1 + abs (ev)) continuous-time ## abs (ev) < 1 - tol discrete-time ## @end group ## @end example ## @seealso{isdetectable, isstable, isctrb, isobsv} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.5 function bool = isstabilizable (a, b = [], e = [], tol = [], dflg = 0) if (nargin < 1 || nargin > 5) print_usage (); elseif (isa (a, "lti")) # isstabilizable (sys), isstabilizable (sys, tol) if (nargin > 2) print_usage (); endif if (! isa (a, "ss")) warning ("isstabilizable: converting to minimal state-space realization"); endif tol = b; dflg = ! isct (a); [a, b, c, d, e] = dssdata (a, []); elseif (nargin == 1) # isstabilizable (a, b, ...) print_usage (); elseif (! is_real_square_matrix (a) || rows (a) != rows (b)) error ("isstabilizable: a must be square and conformal to b"); elseif (! isempty (e) && (! is_real_square_matrix (e) || ! size_equal (a, e))) error ("isstabilizable: e must be square and conformal to a"); endif if (isempty (tol)) tol = 0; # default tolerance elseif (! is_real_scalar (tol)) error ("isstabilizable: tol must be a real scalar"); endif if (isempty (e)) ## controllability staircase form [ac, ~, ~, ncont] = __sl_ab01od__ (a, b, tol); ## extract uncontrollable part of staircase form uncont_idx = ncont+1 : rows (a); auncont = ac(uncont_idx, uncont_idx); ## calculate poles of uncontrollable part pol = eig (auncont); else ## controllability staircase form - output matrix c has no influence [ac, ec, ~, ~, ~, ~, ncont] = __sl_tg01hd__ (a, e, b, zeros (1, columns (a)), tol); ## extract uncontrollable part of staircase form uncont_idx = ncont+1 : rows (a); auncont = ac(uncont_idx, uncont_idx); euncont = ec(uncont_idx, uncont_idx); ## calculate poles of uncontrollable part pol = eig (auncont, euncont); ## remove infinite poles tolinf = norm ([auncont, euncont], 2); idx = find (abs (pol) < tolinf/eps); pol = pol(idx); endif ## check whether uncontrollable poles are stable bool = __is_stable__ (pol, ! dflg, tol); endfunction control/inst/kalman.m0000644000076500000240000000740412273411257014147 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{est}, @var{g}, @var{x}] =} kalman (@var{sys}, @var{q}, @var{r}) ## @deftypefnx {Function File} {[@var{est}, @var{g}, @var{x}] =} kalman (@var{sys}, @var{q}, @var{r}, @var{s}) ## @deftypefnx {Function File} {[@var{est}, @var{g}, @var{x}] =} kalman (@var{sys}, @var{q}, @var{r}, @var{[]}, @var{sensors}, @var{known}) ## @deftypefnx {Function File} {[@var{est}, @var{g}, @var{x}] =} kalman (@var{sys}, @var{q}, @var{r}, @var{s}, @var{sensors}, @var{known}) ## Design Kalman estimator for @acronym{LTI} systems. ## ## @strong{Inputs} ## @table @var ## @item sys ## Nominal plant model. ## @item q ## Covariance of white process noise. ## @item r ## Covariance of white measurement noise. ## @item s ## Optional cross term covariance. Default value is 0. ## @item sensors ## Indices of measured output signals y from @var{sys}. If omitted, all outputs are measured. ## @item known ## Indices of known input signals u (deterministic) to @var{sys}. All other inputs to @var{sys} ## are assumed stochastic. If argument @var{known} is omitted, no inputs u are known. ## @end table ## ## @strong{Outputs} ## @table @var ## @item est ## State-space model of the Kalman estimator. ## @item g ## Estimator gain. ## @item x ## Solution of the Riccati equation. ## @end table ## ## @strong{Block Diagram} ## @example ## @group ## u +-------+ ^ ## +---------------------------->| |-------> y ## | +-------+ + y | est | ^ ## u ----+--->| |----->(+)------>| |-------> x ## | sys | ^ + +-------+ ## w -------->| | | ## +-------+ | v ## ## Q = cov (w, w') R = cov (v, v') S = cov (w, v') ## @end group ## @end example ## ## @seealso{care, dare, estim, lqr} ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2009 ## Version: 0.3 function [est, k, x] = kalman (sys, q, r, s = [], sensors = [], deterministic = []) ## TODO: type "current" for discrete-time systems if (nargin < 3 || nargin > 6 || ! isa (sys, "lti")) print_usage (); endif [a, b, c, d, e] = dssdata (sys, []); if (isempty (sensors)) sensors = 1 : rows (c); endif stochastic = setdiff (1 : columns (b), deterministic); c = c(sensors, :); g = b(:, stochastic); h = d(sensors, stochastic); if (isempty (s)) rbar = r + h*q*h.'; sbar = g * q*h.'; else rbar = r + h*q*h.'+ h*s + s.'*h.'; sbar = g * (q*h.' + s); endif if (isct (sys)) [x, l, k] = care (a.', c.', g*q*g.', rbar, sbar, e.'); else [x, l, k] = dare (a.', c.', g*q*g.', rbar, sbar, e.'); endif k = k.'; est = estim (sys, k, sensors, deterministic); endfunction %!shared m, m_exp, g, g_exp, x, x_exp %! sys = ss (-2, 1, 1, 3); %! [est, g, x] = kalman (sys, 1, 1, 1); %! [a, b, c, d] = ssdata (est); %! m = [a, b; c, d]; %! m_exp = [-2.25, 0.25; 1, 0; 1, 0]; %! g_exp = 0.25; %! x_exp = 0; %!assert (m, m_exp, 1e-2); %!assert (g, g_exp, 1e-2); %!assert (x, x_exp, 1e-2); control/inst/lqe.m0000644000076500000240000001000312273411257013452 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## Copyright (C) 2012 Megan Zagrobelny ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{l}, @var{p}, @var{e}] =} lqe (@var{sys}, @var{q}, @var{r}) ## @deftypefnx {Function File} {[@var{l}, @var{p}, @var{e}] =} lqe (@var{sys}, @var{q}, @var{r}, @var{s}) ## @deftypefnx {Function File} {[@var{l}, @var{p}, @var{e}] =} lqe (@var{a}, @var{g}, @var{c}, @var{q}, @var{r}) ## @deftypefnx {Function File} {[@var{l}, @var{p}, @var{e}] =} lqe (@var{a}, @var{g}, @var{c}, @var{q}, @var{r}, @var{s}) ## @deftypefnx {Function File} {[@var{l}, @var{p}, @var{e}] =} lqe (@var{a}, @var{[]}, @var{c}, @var{q}, @var{r}) ## @deftypefnx {Function File} {[@var{l}, @var{p}, @var{e}] =} lqe (@var{a}, @var{[]}, @var{c}, @var{q}, @var{r}, @var{s}) ## Kalman filter for continuous-time systems. ## ## @example ## @group ## . ## x = Ax + Bu + Gw (State equation) ## y = Cx + Du + v (Measurement Equation) ## E(w) = 0, E(v) = 0, cov(w) = Q, cov(v) = R, cov(w,v) = S ## @end group ## @end example ## ## @strong{Inputs} ## @table @var ## @item sys ## Continuous or discrete-time @acronym{LTI} model (p-by-m, n states). ## @item a ## State matrix of continuous-time system (n-by-n). ## @item g ## Process noise matrix of continuous-time system (n-by-g). ## If @var{g} is empty @code{[]}, an identity matrix is assumed. ## @item c ## Measurement matrix of continuous-time system (p-by-n). ## @item q ## Process noise covariance matrix (g-by-g). ## @item r ## Measurement noise covariance matrix (p-by-p). ## @item s ## Optional cross term covariance matrix (g-by-p), s = cov(w,v). ## If @var{s} is empty @code{[]} or not specified, a zero matrix is assumed. ## @end table ## ## @strong{Outputs} ## @table @var ## @item l ## Kalman filter gain matrix (n-by-p). ## @item p ## Unique stabilizing solution of the continuous-time Riccati equation (n-by-n). ## Symmetric matrix. If @var{sys} is a discrete-time model, the solution of the ## corresponding discrete-time Riccati equation is returned. ## @item e ## Closed-loop poles (n-by-1). ## @end table ## ## @strong{Equations} ## @example ## @group ## . ## x = Ax + Bu + L(y - Cx -Du) ## ## E = eig(A - L*C) ## ## @end group ## @end example ## @seealso{dare, care, dlqr, lqr, dlqe} ## @end deftypefn ## Author: Lukas Reichlin ## Created: April 2012 ## Version: 0.1 function [l, p, e] = lqe (a, g, c, q = [], r = [], s = []) if (nargin < 3 || nargin > 6) print_usage (); endif if (isa (a, "lti")) [l, p, e] = lqr (a.', g, c, q); # lqe (sys, q, r, s), g=I, works like lqr (sys.', q, r, s).' elseif (isempty (g)) [l, p, e] = lqr (a.', c.', q, r, s); # lqe (a, [], c, q, r, s), g=I, works like lqr (a.', c.', q, r, s).' elseif (columns (g) != rows (q) || ! issquare (q)) error ("lqe: matrices g(%dx%d) and q(%dx%d) have incompatible dimensions", ... rows (g), columns (g), rows (q), columns (q)); elseif (isempty (s)) [l, p, e] = lqr (a.', c.', g*q*g.', r); elseif (columns (g) != rows (s)) error ("lqe: matrices g(%dx%d) and s(%dx%d) have incompatible dimensions", ... rows (g), columns (g), rows (s), columns (s)); else [l, p, e] = lqr (a.', c.', g*q*g.', r, g*s); endif l = l.'; ## NOTE: for discrete-time sys, the solution L' from DARE ## is different to L from DLQE (a, s) endfunction control/inst/lqr.m0000644000076500000240000000575112273411257013505 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{sys}, @var{q}, @var{r}) ## @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{sys}, @var{q}, @var{r}, @var{s}) ## @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{a}, @var{b}, @var{q}, @var{r}) ## @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}) ## @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{a}, @var{b}, @var{q}, @var{r}, @var{[]}, @var{e}) ## @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}, @var{e}) ## Linear-quadratic regulator. ## ## @strong{Inputs} ## @table @var ## @item sys ## Continuous or discrete-time @acronym{LTI} model (p-by-m, n states). ## @item a ## State matrix of continuous-time system (n-by-n). ## @item b ## Input matrix of continuous-time system (n-by-m). ## @item q ## State weighting matrix (n-by-n). ## @item r ## Input weighting matrix (m-by-m). ## @item s ## Optional cross term matrix (n-by-m). If @var{s} is not specified, a zero matrix is assumed. ## @item e ## Optional descriptor matrix (n-by-n). If @var{e} is not specified, an identity matrix is assumed. ## @end table ## ## @strong{Outputs} ## @table @var ## @item g ## State feedback matrix (m-by-n). ## @item x ## Unique stabilizing solution of the continuous-time Riccati equation (n-by-n). ## @item l ## Closed-loop poles (n-by-1). ## @end table ## ## @strong{Equations} ## @example ## @group ## . ## x = A x + B u, x(0) = x0 ## ## inf ## J(x0) = INT (x' Q x + u' R u + 2 x' S u) dt ## 0 ## ## L = eig (A - B*G) ## @end group ## @end example ## @seealso{care, dare, dlqr} ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2009 ## Version: 0.2 function [g, x, l] = lqr (a, b, q, r = [], s = [], e = []) if (nargin < 3 || nargin > 6) print_usage (); endif if (isa (a, "lti")) s = r; r = q; q = b; [a, b, c, d, e, tsam] = dssdata (a, []); elseif (nargin < 4) print_usage (); else tsam = 0; endif if (issample (tsam, -1)) [x, l, g] = dare (a, b, q, r, s, e); else [x, l, g] = care (a, b, q, r, s, e); endif endfunction control/inst/lsim.m0000644000076500000240000002310112273411257013640 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {} lsim (@var{sys}, @var{u}) ## @deftypefnx{Function File} {} lsim (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{u}) ## @deftypefnx{Function File} {} lsim (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}, @var{u}) ## @deftypefnx{Function File} {} lsim (@var{sys1}, @dots{}, @var{u}, @var{t}) ## @deftypefnx{Function File} {} lsim (@var{sys1}, @dots{}, @var{u}, @var{t}, @var{x0}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} lsim (@var{sys}, @var{u}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} lsim (@var{sys}, @var{u}, @var{t}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} lsim (@var{sys}, @var{u}, @var{t}, @var{x0}) ## Simulate @acronym{LTI} model response to arbitrary inputs. If no output arguments are given, ## the system response is plotted on the screen. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. System must be proper, i.e. it must not have more zeros than poles. ## @item u ## Vector or array of input signal. Needs @code{length(t)} rows and as many columns ## as there are inputs. If @var{sys} is a single-input system, row vectors @var{u} ## of length @code{length(t)} are accepted as well. ## @item t ## Time vector. Should be evenly spaced. If @var{sys} is a continuous-time system ## and @var{t} is a real scalar, @var{sys} is discretized with sampling time ## @code{tsam = t/(rows(u)-1)}. If @var{sys} is a discrete-time system and @var{t} ## is not specified, vector @var{t} is assumed to be @code{0 : tsam : tsam*(rows(u)-1)}. ## @item x0 ## Vector of initial conditions for each state. If not specified, a zero vector is assumed. ## @item 'style' ## Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted ## black line. See @command{help plot} for details. ## @end table ## ## @strong{Outputs} ## @table @var ## @item y ## Output response array. Has as many rows as time samples (length of t) ## and as many columns as outputs. ## @item t ## Time row vector. It is always evenly spaced. ## @item x ## State trajectories array. Has @code{length (t)} rows and as many columns as states. ## @end table ## ## @seealso{impulse, initial, step} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.4 function [y_r, t_r, x_r] = lsim (varargin) ## TODO: individual initial state vectors 'x0' for each system ## there would be conflicts with other arguments, ## maybe a cell {x0_1, x0_2, ..., x0_N} would be a solution? if (nargin < 2) print_usage (); endif sys_idx = find (cellfun (@isa, varargin, {"lti"})); # look for LTI models, 'find' needed for plot styles sys_cell = cellfun (@ss, varargin(sys_idx), "uniformoutput", false); # convert to state-space if (! size_equal (sys_cell{:})) error ("lsim: models must have equal sizes"); endif mat_idx = find (cellfun (@is_real_matrix, varargin)); # indices of matrix arguments n_mat = length (mat_idx); # number of vector arguments n_sys = length (sys_cell); # number of LTI systems t = []; x0 = []; if (n_mat < 1) error ("lsim: require input signal 'u'"); else arg = varargin{mat_idx(1)}; if (is_real_vector (arg)) u = reshape (arg, [], 1); # allow row vectors for single-input systems elseif (is_real_matrix (arg)); u = arg; else error ("lsim: input signal 'u' must be an array of real numbers"); endif if (n_mat > 1) # time vector t arg = varargin{mat_idx(2)}; if (is_real_vector (arg) || isempty (arg)) t = arg; else error ("lsim: time vector 't' must be real-valued or empty"); endif if (n_mat > 2) # initial state vector x0 arg = varargin{mat_idx(3)}; if (is_real_vector (arg)) x0 = arg; else error ("lsim: initial state vector 'x0' must be a real-valued vector"); endif if (n_mat > 3) warning ("lsim: ignored"); endif endif endif endif ## function [y, t, x_arr] = __linear_simulation__ (sys, u, t, x0) [y, t, x] = cellfun (@__linear_simulation__, sys_cell, {u}, {t}, {x0}, "uniformoutput", false); if (nargout == 0) # plot information [p, m] = size (sys_cell{1}); style_idx = find (cellfun (@ischar, varargin)); ct_idx = cellfun (@isct, sys_cell); str = "Linear Simulation Results"; outname = get (sys_cell{end}, "outname"); outname = __labels__ (outname, "y"); colororder = get (gca, "colororder"); rc = rows (colororder); sysname = cell (n_sys, 1); for k = 1 : n_sys # for every system if (k == n_sys) lim = nargin; else lim = sys_idx(k+1); endif style = varargin(style_idx(style_idx > sys_idx(k) & style_idx <= lim)); if (isempty (style)) color = colororder(1+rem (k-1, rc), :); style = {"color", color}; endif try sysname{k} = inputname(sys_idx(k)); catch sysname{k} = ""; end_try_catch if (ct_idx(k)) # continuous-time system for i = 1 : p # for every output if (p != 1) subplot (p, 1, i); endif plot (t{k}, y{k}(:, i), style{:}); hold on; grid on; if (k == n_sys) axis tight ylim (__axis_margin__ (ylim)) ylabel (outname{i}); if (i == 1) title (str); endif endif endfor else # discrete-time system for i = 1 : p # for every output if (p != 1) subplot (p, 1, i); endif stairs (t{k}, y{k}(:, i), style{:}); hold on; grid on; if (k == n_sys) axis tight; ylim (__axis_margin__ (ylim)) ylabel (outname{i}); if (i == 1) title (str); endif endif endfor endif endfor xlabel ("Time [s]"); if (p == 1 && m == 1) legend (sysname) endif hold off; else # return values y_r = y{1}; t_r = t{1}; x_r = x{1}; endif endfunction function [y, t, x_arr] = __linear_simulation__ (sys, u, t, x0) method = "zoh"; [urows, ucols] = size (u); if (isct (sys)) # continuous-time system if (isempty (t)) # lsim (sys, u, [], ...) error ("lsim: invalid time vector"); elseif (length (t) == 1) # lsim (sys, u, tfinal, ...) dt = t / (urows - 1); tinitial = 0; tfinal = t; else # lsim (sys, u, t, ...) dt = t(2) - t(1); # assume that t is regularly spaced tinitial = t(1); tfinal = t(end); endif sys = c2d (sys, dt, method); # convert to discrete-time model else # discrete-time system dt = abs (get (sys, "tsam")); # use 1 second as default if tsam is unspecified (-1) if (isempty (t)) # lsim (sys, u) tinitial = 0; tfinal = dt * (urows - 1); elseif (length (t) == 1) # lsim (sys, u, tfinal) tinitial = 0; tfinal = t; else # lsim (sys, u, t, ...) warning ("lsim: spacing of time vector has no effect on sampling time of discrete-time system"); tinitial = t(1); tfinal = t(end); endif endif [A, B, C, D] = ssdata (sys); [p, m] = size (D); # number of outputs and inputs n = rows (A); # number of states ## time vector t = reshape (tinitial : dt : tfinal, [], 1); len_t = length (t); if (urows != len_t) error ("lsim: input vector u must have %d rows", len_t); endif if (ucols != m) error ("lsim: input vector u must have %d columns", m); endif ## preallocate memory y = zeros (len_t, p); x_arr = zeros (len_t, n); ## initial conditions if (isempty (x0)) x0 = zeros (n, 1); elseif (n != length (x0) || ! is_real_vector (x0)) error ("lsim: x0 must be a vector with %d elements", n); endif x = reshape (x0, [], 1); # make sure that x is a column vector ## simulation for k = 1 : len_t y(k, :) = C * x + D * u(k, :).'; x_arr(k, :) = x; x = A * x + B * u(k, :).'; endfor endfunction ## TODO: add test cases control/inst/ltimodels.m0000644000076500000240000003240612273411257014700 0ustar lukasstaff## Copyright (C) 2009 Luca Favatella ## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} test ltimodels ## @deftypefnx {Function File} ltimodels ## @deftypefnx {Function File} ltimodels (@var{systype}) ## Test suite and help for @acronym{LTI} models. ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2009 ## Version: 0.2 function ltimodels (systype = "general") %if (nargin > 1) print_usage (); %endif ## TODO: write documentation if (! ischar (systype)) error ("ltimodels: argument must be a string"); endif systype = lower (systype); switch (systype) case "ss" str = {"State Space (SS) Models"... "-----------------------"... ""}; case "tf" str = {"Transfer Function (TF) Models"... "-----------------------------"... ""}; otherwise # general str = {"Linear Time Invariant (LTI) Models"... "----------------------------------"... ""}; endswitch disp (""); disp (char (str)); endfunction ## ============================================================================== ## LTI Tests ## ============================================================================== ## isct, isdt %!shared ltisys %! ltisys = tf (12); %!assert (ltisys.ts, -2); %!assert (isct (ltisys)); %!assert (isdt (ltisys)); %!shared ltisys %! ltisys = ss (17); %!assert (ltisys.ts, -2); %!assert (isct (ltisys)); %!assert (isdt (ltisys)); %!shared ltisys %! ltisys = tf (1, [1 1]); %!assert (ltisys.ts, 0); %!assert (isct (ltisys)); %!assert (! isdt (ltisys)); %!shared ltisys, ts %! ts = 0.1; %! ltisys = ss (-1, 1, 1, 0, ts); %!assert (ltisys.ts, ts); %!assert (! isct (ltisys)); %!assert (isdt (ltisys)); ## ============================================================================== ## TF Tests ## ============================================================================== ## ============================================================================== ## SS Tests ## ============================================================================== ## staircase (SLICOT AB01OD) %!shared Ac, Bc, Ace, Bce %! A = [ 17.0 24.0 1.0 8.0 15.0 %! 23.0 5.0 7.0 14.0 16.0 %! 4.0 6.0 13.0 20.0 22.0 %! 10.0 12.0 19.0 21.0 3.0 %! 11.0 18.0 25.0 2.0 9.0 ]; %! %! B = [ -1.0 -4.0 %! 4.0 9.0 %! -9.0 -16.0 %! 16.0 25.0 %! -25.0 -36.0 ]; %! %! tol = 0; %! %! A = A.'; # There's a little mistake in the example %! # program of routine AB01OD in SLICOT 5.0 %! %! [Ac, Bc, U, ncont] = __sl_ab01od__ (A, B, tol); %! %! Ace = [ 12.8848 3.2345 11.8211 3.3758 -0.8982 %! 4.4741 -12.5544 5.3509 5.9403 1.4360 %! 14.4576 7.6855 23.1452 26.3872 -29.9557 %! 0.0000 1.4805 27.4668 22.6564 -0.0072 %! 0.0000 0.0000 -30.4822 0.6745 18.8680 ]; %! %! Bce = [ 31.1199 47.6865 %! 3.2480 0.0000 %! 0.0000 0.0000 %! 0.0000 0.0000 %! 0.0000 0.0000 ]; %! %!assert (Ac, Ace, 1e-4); %!assert (Bc, Bce, 1e-4); ## controllability staircase form of descriptor state-space models (SLICOT TG01HD) %!shared ac, ec, bc, cc, q, z, ncont, ac_e, ec_e, bc_e, cc_e, q_e, z_e, ncont_e %! %! a = [ 2 0 2 0 -1 3 1 %! 0 1 0 0 1 0 0 %! 0 0 0 1 0 0 1 %! 0 0 2 0 -1 3 1 %! 0 0 0 1 0 0 1 %! 0 1 0 0 1 0 0 %! 0 0 0 1 0 0 1 ]; %! %! e = [ 0 0 1 0 0 0 0 %! 0 0 0 0 0 1 0 %! 0 0 0 0 0 0 1 %! 0 0 0 0 0 0 1 %! 0 0 0 1 0 0 0 %! 0 0 1 0 -1 0 0 %! 1 3 0 2 0 0 0 ]; %! %! b = [ 2 1 0 %! 0 0 0 %! 0 0 0 %! 0 0 0 %! 0 0 0 %! 0 0 0 %! 1 2 3 ]; %! %! c = [ 1 0 0 1 0 0 1 %! 0 -1 1 0 -1 1 0 ]; %! %! tol = 0; %! %! [ac, ec, bc, cc, q, z, ncont] = __sl_tg01hd__ (a, e, b, c, tol); %! %! ncont_e = 3; %! %! ac_e = [ 0.0000 0.0000 0.0000 0.0000 -1.2627 0.4334 0.4666 %! 0.0000 2.0000 0.0000 -3.7417 -0.8520 0.2924 -0.4342 %! 0.0000 0.0000 1.7862 0.3780 -0.2651 -0.7723 0.0000 %! 0.0000 0.0000 0.0000 3.7417 0.8520 -0.2924 0.4342 %! 0.0000 0.0000 0.0000 0.0000 -1.5540 0.5334 0.5742 %! 0.0000 0.0000 0.0000 0.0000 -0.6533 0.2242 0.2414 %! 0.0000 0.0000 0.0000 0.0000 -0.5892 0.2022 0.2177 ]; %! %! ec_e = [ -1.8325 1.0000 2.3752 0.0000 -0.8214 0.2819 1.8016 %! 0.4887 0.0000 0.3770 -0.5345 0.1874 0.5461 0.0000 %! -0.1728 0.0000 -0.1333 -1.1339 0.1325 0.3861 0.0000 %! 0.0000 0.0000 0.0000 0.0000 0.8520 -0.2924 0.4342 %! 0.0000 0.0000 0.0000 0.0000 -1.0260 -0.1496 0.0000 %! 0.0000 0.0000 0.0000 0.0000 0.0000 1.1937 0.0000 %! 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 ]; %! %! bc_e = [ 1.0000 2.0000 3.0000 %! 2.0000 1.0000 0.0000 %! 0.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 ]; %! %! cc_e = [ 0.0000 1.0000 0.0000 0.0000 -1.2627 0.4334 0.4666 %! 0.3665 0.0000 -0.9803 -1.6036 0.1874 0.5461 0.0000 ]; %! %! q_e = [ 0.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 %! 0.0000 0.0000 0.7071 0.0000 0.2740 -0.6519 0.0000 %! 0.0000 0.0000 0.0000 0.0000 0.8304 0.3491 -0.4342 %! 0.0000 0.0000 0.0000 -1.0000 0.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 0.0000 0.4003 0.1683 0.9008 %! 0.0000 0.0000 0.7071 0.0000 -0.2740 0.6519 0.0000 %! 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 ]; %! %! z_e = [ 0.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 %! -0.6108 0.0000 0.7917 0.0000 0.0000 0.0000 0.0000 %! 0.4887 0.0000 0.3770 -0.5345 0.1874 0.5461 0.0000 %! 0.0000 0.0000 0.0000 0.0000 -0.4107 0.1410 0.9008 %! 0.6108 0.0000 0.4713 0.2673 -0.1874 -0.5461 0.0000 %! -0.1222 0.0000 -0.0943 -0.8018 -0.1874 -0.5461 0.0000 %! 0.0000 0.0000 0.0000 0.0000 -0.8520 0.2924 -0.4342 ]; %! %!assert (ac, ac_e, 1e-4); %!assert (ec, ec_e, 1e-4); %!assert (bc, bc_e, 1e-4); %!assert (cc, cc_e, 1e-4); %!assert (q, q_e, 1e-4); %!assert (z, z_e, 1e-4); %!assert (ncont, ncont_e); ## observability staircase form of descriptor state-space models (SLICOT TG01ID) %!shared ao, eo, bo, co, q, z, nobsv, ao_e, eo_e, bo_e, co_e, q_e, z_e, nobsv_e %! %! a = [ 2 0 0 0 0 0 0 %! 0 1 0 0 0 1 0 %! 2 0 0 2 0 0 0 %! 0 0 1 0 1 0 1 %! -1 1 0 -1 0 1 0 %! 3 0 0 3 0 0 0 %! 1 0 1 1 1 0 1 ]; %! %! e = [ 0 0 0 0 0 0 1 %! 0 0 0 0 0 0 3 %! 1 0 0 0 0 1 0 %! 0 0 0 0 1 0 2 %! 0 0 0 0 0 -1 0 %! 0 1 0 0 0 0 0 %! 0 0 1 1 0 0 0 ]; %! %! b = [ 1 0 %! 0 -1 %! 0 1 %! 1 0 %! 0 -1 %! 0 1 %! 1 0 ]; %! %! c = [ 2 0 0 0 0 0 1 %! 1 0 0 0 0 0 2 %! 0 0 0 0 0 0 3 ]; %! %! tol = 0; %! %! [ao, eo, bo, co, q, z, nobsv] = __sl_tg01id__ (a, e, b, c, tol); %! %! nobsv_e = 3; %! %! ao_e = [ 0.2177 0.2414 0.5742 0.4342 0.0000 -0.4342 0.4666 %! 0.2022 0.2242 0.5334 -0.2924 -0.7723 0.2924 0.4334 %! -0.5892 -0.6533 -1.5540 0.8520 -0.2651 -0.8520 -1.2627 %! 0.0000 0.0000 0.0000 3.7417 0.3780 -3.7417 0.0000 %! 0.0000 0.0000 0.0000 0.0000 1.7862 0.0000 0.0000 %! 0.0000 0.0000 0.0000 0.0000 0.0000 2.0000 0.0000 %! 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 ]; %! %! eo_e = [ 1.0000 0.0000 0.0000 0.4342 0.0000 0.0000 1.8016 %! 0.0000 1.1937 -0.1496 -0.2924 0.3861 0.5461 0.2819 %! 0.0000 0.0000 -1.0260 0.8520 0.1325 0.1874 -0.8214 %! 0.0000 0.0000 0.0000 0.0000 -1.1339 -0.5345 0.0000 %! 0.0000 0.0000 0.0000 0.0000 -0.1333 0.3770 2.3752 %! 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 %! 0.0000 0.0000 0.0000 0.0000 -0.1728 0.4887 -1.8325 ]; %! %! bo_e = [ 0.4666 0.0000 %! 0.4334 0.5461 %! -1.2627 0.1874 %! 0.0000 -1.6036 %! 0.0000 -0.9803 %! 1.0000 0.0000 %! 0.0000 0.3665 ]; %! %! co_e = [ 0.0000 0.0000 0.0000 0.0000 0.0000 2.0000 1.0000 %! 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 2.0000 %! 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 3.0000 ]; %! %! q_e = [ 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 0.0000 %! 0.0000 0.0000 0.0000 0.0000 0.7917 0.0000 -0.6108 %! 0.0000 0.5461 0.1874 -0.5345 0.3770 0.0000 0.4887 %! 0.9008 0.1410 -0.4107 0.0000 0.0000 0.0000 0.0000 %! 0.0000 -0.5461 -0.1874 0.2673 0.4713 0.0000 0.6108 %! 0.0000 -0.5461 -0.1874 -0.8018 -0.0943 0.0000 -0.1222 %! -0.4342 0.2924 -0.8520 0.0000 0.0000 0.0000 0.0000 ]; %! %! z_e = [ 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 0.0000 %! 0.0000 -0.6519 0.2740 0.0000 0.7071 0.0000 0.0000 %! -0.4342 0.3491 0.8304 0.0000 0.0000 0.0000 0.0000 %! 0.0000 0.0000 0.0000 -1.0000 0.0000 0.0000 0.0000 %! 0.9008 0.1683 0.4003 0.0000 0.0000 0.0000 0.0000 %! 0.0000 0.6519 -0.2740 0.0000 0.7071 0.0000 0.0000 %! 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 ]; %! %!assert (ao, ao_e, 1e-4); %!assert (eo, eo_e, 1e-4); %!assert (bo, bo_e, 1e-4); %!assert (co, co_e, 1e-4); %!assert (q, q_e, 1e-4); %!assert (z, z_e, 1e-4); %!assert (nobsv, nobsv_e); ## ss2tf conversion by Slicot TB04BD ## Test provided by Slicot %!shared NUM, DEN, NUMe, DENe %! A = [ -1.0 0.0 0.0 %! 0.0 -2.0 0.0 %! 0.0 0.0 -3.0 ]; %! %! B = [ 0.0 1.0 -1.0 %! 1.0 1.0 0.0 ].'; %! %! C = [ 0.0 1.0 1.0 %! 1.0 1.0 1.0 ]; %! %! D = [ 1.0 0.0 %! 0.0 1.0 ]; %! %! [NUM, DEN] = tfdata (ss (A, B, C, D)); %! %! NUMe = {[1, 5, 7], [1]; [1], [1, 5, 5]}; %! %! DENe = {[1, 5, 6], [1, 2]; [1, 5, 6], [1, 3, 2]}; %! %!assert (NUM, NUMe, 1e-4); %!assert (DEN, DENe, 1e-4); ## ss2tf conversion by Slicot TB04BD ## Trivial test %!shared NUM, DEN, NUMe, DENe %! A = [ 0 ]; %! %! B = [ 1 ]; %! %! C = [ 1 ]; %! %! D = [ 0 ]; %! %! [NUM, DEN] = tfdata (ss (A, B, C, D)); %! %! NUMe = {[1]}; %! %! DENe = {[1, 0]}; %! %!assert (NUM, NUMe, 1e-4); %!assert (DEN, DENe, 1e-4); ## transfer function to state-space conversion ## test from SLICOT TD04AD %!shared Mo, Me %! INDEX = [ 3 3 ]; %! %! DCOEFF = [ 1.0 6.0 11.0 6.0 %! 1.0 6.0 11.0 6.0 ]; %! %! UCOEFF = zeros (2, 2, 4); %! %! u11 = [ 1.0 6.0 12.0 7.0 ]; %! u12 = [ 0.0 1.0 4.0 3.0 ]; %! u21 = [ 0.0 0.0 1.0 1.0 ]; %! u22 = [ 1.0 8.0 20.0 15.0 ]; %! %! UCOEFF(1,1,:) = u11; %! UCOEFF(1,2,:) = u12; %! UCOEFF(2,1,:) = u21; %! UCOEFF(2,2,:) = u22; %! %! [Ao, Bo, Co, Do] = __sl_td04ad__ (UCOEFF, DCOEFF, INDEX, 0); %! %! Ae = [ 0.5000 -0.8028 0.9387 %! 4.4047 -2.3380 2.5076 %! -5.5541 1.6872 -4.1620 ]; %! %! Be = [ -0.2000 -1.2500 %! 0.0000 -0.6097 %! 0.0000 2.2217 ]; %! %! Ce = [ 0.0000 -0.8679 0.2119 %! 0.0000 0.0000 0.9002 ]; %! %! De = [ 1.0000 0.0000 %! 0.0000 1.0000 ]; %! %! Mo = [Ao, Bo; Co, Do]; %! Me = [Ae, Be; Ce, De]; %! %!assert (Mo, Me, 1e-4); control/inst/lyap.m0000644000076500000240000001202112273411257013640 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {@var{x} =} lyap (@var{a}, @var{b}) ## @deftypefnx{Function File} {@var{x} =} lyap (@var{a}, @var{b}, @var{c}) ## @deftypefnx{Function File} {@var{x} =} lyap (@var{a}, @var{b}, @var{[]}, @var{e}) ## Solve continuous-time Lyapunov or Sylvester equations. ## ## @strong{Equations} ## @example ## @group ## AX + XA' + B = 0 (Lyapunov Equation) ## ## AX + XB + C = 0 (Sylvester Equation) ## ## AXE' + EXA' + B = 0 (Generalized Lyapunov Equation) ## @end group ## @end example ## ## @strong{Algorithm}@* ## Uses SLICOT SB03MD, SB04MD and SG03AD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @seealso{lyapchol, dlyap, dlyapchol} ## @end deftypefn ## Author: Lukas Reichlin ## Created: January 2010 ## Version: 0.2.1 function [x, scale] = lyap (a, b, c, e) scale = 1; switch (nargin) case 2 # Lyapunov equation if (! is_real_square_matrix (a, b)) ## error ("lyap: a, b must be real and square"); error ("lyap: %s, %s must be real and square", ... inputname (1), inputname (2)); endif if (rows (a) != rows (b)) ## error ("lyap: a, b must have the same number of rows"); error ("lyap: %s, %s must have the same number of rows", ... inputname (1), inputname (2)); endif [x, scale] = __sl_sb03md__ (a, -b, false); # AX + XA' = -B ## x /= scale; # 0 < scale <= 1 case 3 # Sylvester equation if (! is_real_square_matrix (a, b)) ## error ("lyap: a, b must be real and square"); error ("lyap: %s, %s must be real and square", ... inputname (1), inputname (2)); endif if (! is_real_matrix (c) || rows (c) != rows (a) || columns (c) != columns (b)) ## error ("lyap: c must be a real (%dx%d) matrix", rows (a), columns (b)); error ("lyap: %s must be a real (%dx%d) matrix", ... rows (a), columns (b), inputname (3)); endif x = __sl_sb04md__ (a, b, -c); # AX + XB = -C case 4 # generalized Lyapunov equation if (! isempty (c)) print_usage (); endif if (! is_real_square_matrix (a, b, e)) ## error ("lyap: a, b, e must be real and square"); error ("lyap: %s, %s, %s must be real and square", ... inputname (1), inputname (2), inputname (4)); endif if (rows (b) != rows (a) || rows (e) != rows (a)) ## error ("lyap: a, b, e must have the same number of rows"); error ("lyap: %s, %s, %s must have the same number of rows", ... inputname (1), inputname (2), inputname (4)); endif if (! issymmetric (b)) ## error ("lyap: b must be symmetric"); error ("lyap: %s must be symmetric", ... inputname (2)); endif [x, scale] = __sl_sg03ad__ (a, e, -b, false); # AXE' + EXA' = -B ## x /= scale; # 0 < scale <= 1 otherwise print_usage (); endswitch if (scale < 1) warning ("lyap: solution scaled by %g to prevent overflow", scale); endif endfunction ## Lyapunov %!shared X, X_exp %! A = [1, 2; -3, -4]; %! Q = [3, 1; 1, 1]; %! X = lyap (A, Q); %! X_exp = [ 6.1667, -3.8333; %! -3.8333, 3.0000]; %!assert (X, X_exp, 1e-4); ## Sylvester %!shared X, X_exp %! A = [2.0 1.0 3.0 %! 0.0 2.0 1.0 %! 6.0 1.0 2.0]; %! %! B = [2.0 1.0 %! 1.0 6.0]; %! %! C = [2.0 1.0 %! 1.0 4.0 %! 0.0 5.0]; %! %! X = lyap (A, B, -C); %! %! X_exp = [-2.7685 0.5498 %! -1.0531 0.6865 %! 4.5257 -0.4389]; %! %!assert (X, X_exp, 1e-4); ## Generalized Lyapunov %!shared X, X_exp %! A = [ 3.0 1.0 1.0 %! 1.0 3.0 0.0 %! 1.0 0.0 2.0]; %! %! E = [ 1.0 3.0 0.0 %! 3.0 2.0 1.0 %! 1.0 0.0 1.0]; %! %! B = [-64.0 -73.0 -28.0 %! -73.0 -70.0 -25.0 %! -28.0 -25.0 -18.0]; %! %! X = lyap (A.', -B, [], E.'); %! %! X_exp = [-2.0000 -1.0000 0.0000 %! -1.0000 -3.0000 -1.0000 %! 0.0000 -1.0000 -3.0000]; %! %!assert (X, X_exp, 1e-4); control/inst/lyapchol.m0000644000076500000240000001072112273411257014513 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {@var{u} =} lyapchol (@var{a}, @var{b}) ## @deftypefnx{Function File} {@var{u} =} lyapchol (@var{a}, @var{b}, @var{e}) ## Compute Cholesky factor of continuous-time Lyapunov equations. ## ## @strong{Equations} ## @example ## @group ## A U' U + U' U A' + B B' = 0 (Lyapunov Equation) ## ## A U' U E' + E U' U A' + B B' = 0 (Generalized Lyapunov Equation) ## @end group ## @end example ## ## @strong{Algorithm}@* ## Uses SLICOT SB03OD and SG03BD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @seealso{lyap, dlyap, dlyapchol} ## @end deftypefn ## Author: Lukas Reichlin ## Created: January 2010 ## Version: 0.2.1 function [u, scale] = lyapchol (a, b, e) switch (nargin) case 2 if (! is_real_square_matrix (a)) ## error ("lyapchol: a must be real and square"); error ("lyapchol: %s must be real and square", ... inputname (1)); endif if (! is_real_matrix (b)) ## error ("lyapchol: b must be real") error ("lyapchol: %s must be real", ... inputname (2)) endif if (rows (a) != rows (b)) ## error ("lyapchol: a and b must have the same number of rows"); error ("lyapchol: %s and %s must have the same number of rows", ... inputname (1), inputname (2)); endif [u, scale] = __sl_sb03od__ (a.', b.', false); ## NOTE: TRANS = 'T' not suitable because we need U' U, not U U' case 3 if (! is_real_square_matrix (a, e)) ## error ("lyapchol: a, e must be real and square"); error ("lyapchol: %s, %s must be real and square", ... inputname (1), inputname (3)); endif if (! is_real_matrix (b)) ## error ("lyapchol: b must be real"); error ("lyapchol: %s must be real", ... inputname (2)); endif if (rows (b) != rows (a) || rows (e) != rows (a)) ## error ("lyapchol: a, b, e must have the same number of rows"); error ("lyapchol: %s, %s, %s must have the same number of rows", ... inputname (1), inputname (2), inputname (3)); endif [u, scale] = __sl_sg03bd__ (a.', e.', b.', false); ## NOTE: TRANS = 'T' not suitable because we need U' U, not U U' otherwise print_usage (); endswitch if (scale < 1) warning ("lyapchol: solution scaled by %g to prevent overflow", scale); endif endfunction %!shared U, U_exp, X, X_exp %! %! A = [ -1.0 37.0 -12.0 -12.0 %! -1.0 -10.0 0.0 4.0 %! 2.0 -4.0 7.0 -6.0 %! 2.0 2.0 7.0 -9.0 ].'; %! %! B = [ 1.0 2.5 1.0 3.5 %! 0.0 1.0 0.0 1.0 %! -1.0 -2.5 -1.0 -1.5 %! 1.0 2.5 4.0 -5.5 %! -1.0 -2.5 -4.0 3.5 ].'; %! %! U = lyapchol (A, B); %! %! X = U.' * U; # use lyap at home! %! %! U_exp = [ 1.0000 0.0000 0.0000 0.0000 %! 3.0000 1.0000 0.0000 0.0000 %! 2.0000 -1.0000 1.0000 0.0000 %! -1.0000 1.0000 -2.0000 1.0000 ].'; %! %! X_exp = [ 1.0000 3.0000 2.0000 -1.0000 %! 3.0000 10.0000 5.0000 -2.0000 %! 2.0000 5.0000 6.0000 -5.0000 %! -1.0000 -2.0000 -5.0000 7.0000 ]; %! %!assert (U, U_exp, 1e-4); %!assert (X, X_exp, 1e-4); %!shared U, U_exp, X, X_exp %! %! A = [ -1.0 3.0 -4.0 %! 0.0 5.0 -2.0 %! -4.0 4.0 1.0 ].'; %! %! E = [ 2.0 1.0 3.0 %! 2.0 0.0 1.0 %! 4.0 5.0 1.0 ].'; %! %! B = [ 2.0 -1.0 7.0 ].'; %! %! U = lyapchol (A, B, E); %! %! U_exp = [ 1.6003 -0.4418 -0.1523 %! 0.0000 0.6795 -0.2499 %! 0.0000 0.0000 0.2041 ]; %! %!assert (U, U_exp, 1e-4); control/inst/Madievski.m0000644000076500000240000001252112273411257014614 0ustar lukasstaff%% -*- texinfo -*- %% Demonstration of frequency-weighted controller reduction. %% The system considered in this example has been studied by Madievski and %% Anderson [1] and comprises four spinning disks. The disks are connected by a %% flexible rod, a motor applies torque to the third disk, and the angular %% displacement of the first disk is the variable of interest. The state-space %% model of eighth order is non-minimumphase and unstable. %% The continuous-time LQG controller used in [1] is open-loop stable and of %% eighth order like the plant. This eighth-order controller shall be reduced by %% frequency-weighted singular perturbation approximation (SPA). %% The major aim of this reduction is the preservation of the closed-loop %% transfer function. This means that the error in approximation of the %% controller @var{K} by the reduced-order controller @var{Kr} is minimized by %% @iftex %% @tex %% $$ \\underset{K_r}{\\min} \\ || W \\ (K - K_r) \\ V ||_{\\infty} $$ %% @end tex %% @end iftex %% @ifnottex %% @example %% min ||W (K-Kr) V|| %% Kr inf %% @end example %% @end ifnottex %% where weights @var{W} and @var{V} are dictated by the requirement to preserve %% (as far as possible) the closed-loop transfer function. In minimizing the %% error, they cause the approximation process for @var{K} to be more accurate at %% certain frequencies. Suggested by [1] is the use of the following stability %% and performance enforcing weights: %% @iftex %% @tex %% $$ W = (I - G K)^{-1} G, \\qquad V = (I - G K)^{-1} $$ %% @end tex %% @end iftex %% @ifnottex %% @example %% -1 -1 %% W = (I - G K) G, V = (I - G K) %% @end example %% @end ifnottex %% This example script reduces the eighth-order controller to orders four and two %% by the function call %% @code{Kr = spaconred (G, K, nr, 'feedback', '-')} %% where argument @var{nr} denotes the desired order (4 or 2). The key-value %% pair @code{'feedback', '-'} allows the reduction of negative feedback %% controllers while the default setting expects positive feedback controllers. %% The frequency responses of the original and reduced-order controllers are %% depicted in figure 1, the step responses of the closed loop in figure 2. %% There is no visible difference between the step responses of the closed-loop %% systems with original (blue) and fourth order (green) controllers. %% The second order controller (red) causes ripples in the step response, but %% otherwise the behavior of the system is unaltered. This leads to the %% conclusion that function @command{spaconred} is well suited to reduce the %% order of controllers considerably, while stability and performance are %% retained. %% @*@strong{Reference}@* %% [1] Madievski, A.G. and Anderson, B.D.O. %% @cite{Sampled-Data Controller Reduction Procedure}, %% IEEE Transactions of Automatic Control, %% Vol. 40, No. 11, November 1995 % =============================================================================== % Frequency Weighted Controller Reduction Lukas Reichlin December 2011 % =============================================================================== % Tabula Rasa clear all, close all, clc % Plant Ap1 = [ 0.0 1.0 0.0 0.0 ]; Ap2 = [ -0.015 0.765 -0.765 -0.015 ]; Ap3 = [ -0.028 1.410 -1.410 -0.028 ]; Ap4 = [ -0.04 1.85 -1.85 -0.04 ]; Ap = blkdiag (Ap1, Ap2, Ap3, Ap4); Bp = [ 0.026 -0.251 0.033 -0.886 -4.017 0.145 3.604 0.280 ]; Cp = [ -0.996 -0.105 0.261 0.009 -0.001 -0.043 0.002 -0.026 ]; Dp = [ 0.0 ]; P = ss (Ap, Bp, Cp, Dp); % Controller Ac = [ -0.4077 0.9741 0.1073 0.0131 0.0023 -0.0186 -0.0003 -0.0098 -0.0977 -0.1750 0.0215 -0.0896 -0.0260 0.0057 0.0109 -0.0105 0.0011 0.0218 -0.0148 0.7769 0.0034 -0.0013 -0.0014 0.0011 -0.0361 -0.5853 -0.7701 -0.3341 -0.0915 0.0334 0.0378 -0.0290 -0.1716 -2.6546 -0.0210 -1.4467 -0.4428 1.5611 0.1715 -0.1318 -0.0020 0.0950 0.0029 0.0523 -1.3950 -0.0338 -0.0062 0.0045 0.1607 2.3824 0.0170 1.2979 0.3721 -0.1353 -0.1938 1.9685 -0.0006 0.1837 0.0048 0.1010 0.0289 -0.0111 -1.8619 -0.0311 ]; Bc = [ -0.4105 -0.0868 -0.0004 0.0036 0.0081 -0.0085 -0.0004 -0.0132 ]; Cc = [ -0.0447 -0.6611 -0.0047 -0.3601 -0.1033 0.0375 0.0427 -0.0329 ]; Dc = [ 0.0 ]; K = ss (Ac, Bc, Cc, Dc); % Controller Reduction Kr4 = spaconred (P, K, 4, 'feedback', '-') Kr2 = spaconred (P, K, 2, 'feedback', '-') % Open Loop L = P * K; Lr4 = P * Kr4; Lr2 = P * Kr2; % Closed Loop T = feedback (L); Tr4 = feedback (Lr4); Tr2 = feedback (Lr2); % Frequency Range w = {1e-2, 1e1}; % Bode Plot of Controller figure (1) bode (K, Kr4, Kr2, w) legend ('K (8 states)', 'Kr (4 states)', 'Kr (2 states)', 'Location', 'SouthWest') % Step Response of Closed Loop figure (2) step (T, Tr4, Tr2, 100) legend ('K (8 states)', 'Kr (4 states)', 'Kr (2 states)', 'Location', 'SouthEast') control/inst/mag2db.m0000644000076500000240000000264512273411257014042 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{db} =} mag2db (@var{mag}) ## Convert Magnitude to Decibels (dB). ## ## @strong{Inputs} ## @table @var ## @item mag ## Magnitude value(s). Both real-valued scalars and matrices are accepted. ## @end table ## ## @strong{Outputs} ## @table @var ## @item db ## Decibel (dB) value(s). ## @end table ## ## @seealso{db2mag} ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2012 ## Version: 0.1 function db = mag2db (mag) if (nargin != 1 || ! is_real_matrix (mag)) print_usage (); endif db = 20 .* log10 (mag); db(mag < 0) = NaN; endfunction %!assert (mag2db (100), 40); %!assert (mag2db (0.1), -20); control/inst/margin.m0000644000076500000240000003065512273411257014165 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{gamma}, @var{phi}, @var{w_gamma}, @var{w_phi}] =} margin (@var{sys}) ## @deftypefnx{Function File} {[@var{gamma}, @var{phi}, @var{w_gamma}, @var{w_phi}] =} margin (@var{sys}, @var{tol}) ## Gain and phase margin of a system. ## If no output arguments are given, both gain and phase margin are plotted on a bode diagram. ## Otherwise, the margins and their corresponding frequencies are computed and returned. ## A more robust criterion to assess the stability of a feedback system is the sensitivity Ms ## computed by command @command{sensitivity}. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. Must be a single-input and single-output (SISO) system. ## @item tol ## Imaginary parts below @var{tol} are assumed to be zero. ## If not specified, default value @code{sqrt (eps)} is taken. ## @end table ## ## @strong{Outputs} ## @table @var ## @item gamma ## Gain margin (as gain, not dBs). ## @item phi ## Phase margin (in degrees). ## @item w_gamma ## Frequency for the gain margin (in rad/s). ## @item w_phi ## Frequency for the phase margin (in rad/s). ## @end table ## ## @strong{Algorithm}@* ## Uses command @command{roots} to calculate the frequencies ## @var{w_gamma}, @var{w_phi} from special polynomials created ## from the transfer function of @var{sys} as listed below ## in section @guillemetleft{}Equations@guillemetright{}. ## ## @strong{Equations} ## @example ## @group ## CONTINUOUS-TIME SYSTEMS ## Gain Margin ## _ _ ## L(jw) = L(jw) BTW: L(jw) = L(-jw) = conj (L(jw)) ## ## num(jw) num(-jw) ## ------- = -------- ## den(jw) den(-jw) ## ## num(jw) den(-jw) = num(-jw) den(jw) ## ## imag (num(jw) den(-jw)) = 0 ## imag (num(-jw) den(jw)) = 0 ## @end group ## @end example ## @example ## @group ## Phase Margin ## |num(jw)| ## |L(jw)| = |-------| = 1 ## |den(jw)| ## _ 2 2 ## z z = Re z + Im z ## ## num(jw) num(-jw) ## ------- * -------- = 1 ## den(jw) den(-jw) ## ## num(jw) num(-jw) - den(jw) den(-jw) = 0 ## ## real (num(jw) num(-jw) - den(jw) den(-jw)) = 0 ## @end group ## @end example ## @example ## @group ## DISCRETE-TIME SYSTEMS ## Gain Margin ## jwT log z ## L(z) = L(1/z) BTW: z = e --> w = ----- ## j T ## num(z) num(1/z) ## ------ = -------- ## den(z) den(1/z) ## ## num(z) den(1/z) - num(1/z) den(z) = 0 ## @end group ## @end example ## @example ## @group ## Phase Margin ## |num(z)| ## |L(z)| = |------| = 1 ## |den(z)| ## @end group ## @end example ## @example ## @group ## L(z) L(1/z) = 1 ## ## num(z) num(1/z) ## ------ * -------- = 1 ## den(z) den(1/z) ## ## num(z) num(1/z) - den(z) den(1/z) = 0 ## @end group ## @end example ## @example ## @group ## PS: How to get L(1/z) ## 4 3 2 ## p(z) = a z + b z + c z + d z + e ## ## -4 -3 -2 -1 ## p(1/z) = a z + b z + c z + d z + e ## ## -4 2 3 4 ## = z ( a + b z + c z + d z + e z ) ## ## 4 3 2 4 ## = ( e z + d z + c z + b z + a ) / ( z ) ## @end group ## @end example ## ## @seealso{sensitivity, roots} ## @end deftypefn ## Author: Lukas Reichlin ## Created: July 2009 ## Version: 0.9.1 function [gamma_r, phi_r, w_gamma_r, w_phi_r] = margin (sys, tol = sqrt (eps)) ## TODO: multiplot feature: margin (sys1, "b", sys2, "r", ...) ## check whether arguments are OK if (nargin < 1 || nargin > 2) print_usage (); endif if (! isa (sys, "lti")) error ("margin: argument sys must be an LTI system"); endif if (! issiso (sys)) error ("margin: argument sys must be a SISO system"); endif ## get transfer function [num, den, tsam] = tfdata (sys, "vector"); continuous = isct (sys); tsam = abs (tsam); # use 1 second as default if tsam == -1 if (continuous) # CONTINUOUS-TIME SYSTEM ## create polynomials s -> jw l_num = length (num); l_den = length (den); num_jw = num .* i.^(l_num-1 : -1 : 0); den_jw = den .* i.^(l_den-1 : -1 : 0); ## GAIN MARGIN ## create gm polynomial gm_poly = imag (conv (num_jw, conj (den_jw))); ## find frequencies w w = roots (gm_poly); ## filter results [gamma, w_gamma] = gm_filter (w, num, den, tsam, tol, continuous); ## PHASE MARGIN ## create pm polynomials poly_1 = conv (num_jw, conj (num_jw)); poly_2 = conv (den_jw, conj (den_jw)); ## make polynomials equally long for subtraction [poly_1, poly_2] = poly_equalizer (poly_1, poly_2); ## subtract polynomials pm_poly = real (poly_1 - poly_2); ## find frequencies w w = roots (pm_poly); ## filter results [phi, w_phi] = pm_filter (w, num, den, tsam, tol, continuous); else # DISCRETE-TIME SYSTEM ## create polynomials z -> 1/z l_num = length (num); l_den = length (den); num_rev = fliplr (num); den_rev = fliplr (den); num_div = zeros (1, l_num); den_div = zeros (1, l_den); num_div(1) = 1; den_div(1) = 1; num_inv = conv (num_rev, den_div); den_inv = conv (den_rev, num_div); ## GAIN MARGIN ## create gm polynomial poly_1 = conv (num, den_inv); poly_2 = conv (num_inv, den); ## make polynomials equally long for subtraction [poly_1, poly_2] = poly_equalizer (poly_1, poly_2); ## subtract polynomials gm_poly = poly_1 - poly_2; ## find frequencies z z = roots (gm_poly); ## filter results idx = find (abs (abs (z) - 1) < tol); # find z with magnitude 1 if (length (idx) > 0) # if z with magnitude 1 exist z_gm = z(idx); w = log (z_gm) / (i*tsam); # get frequencies w from z [gamma, w_gamma] = gm_filter (w, num, den, tsam, tol, continuous); else # there are no z with magnitude 1 gamma = Inf; w_gamma = NaN; endif ## PHASE MARGIN ## create pm polynomials poly_1 = conv (num, num_inv); poly_2 = conv (den, den_inv); ## make polynomials equally long for subtraction [poly_1, poly_2] = poly_equalizer (poly_1, poly_2); ## subtract polynomials pm_poly = poly_1 - poly_2; ## find frequencies z z = roots (pm_poly); ## filter results idx = find (abs (abs (z) - 1) < tol); # find z with magnitude 1 if (length (idx) > 0) # if z with magnitude 1 exist z_gm = z(idx); w = log (z_gm) / (i*tsam); # get frequencies w from z [phi, w_phi] = pm_filter (w, num, den, tsam, tol, continuous); else # there are no z with magnitude 1 phi = 180; w_phi = NaN; endif endif if (nargout == 0) # show bode diagram [H, w] = __frequency_response__ (sys, false, "std"); H = reshape (H, [], 1); mag_db = 20 * log10 (abs (H)); pha = unwrap (arg (H)) * 180 / pi; gamma_db = 20 * log10 (gamma); wv = [min(w), max(w)]; ax_vec_mag = __axis_limits__ ([w(:), mag_db(:)]); ax_vec_mag(1:2) = wv; ax_vec_pha = __axis_limits__ ([w(:), pha(:)]); ax_vec_pha(1:2) = wv; wgm = [w_gamma, w_gamma]; mgmh = [-gamma_db, ax_vec_mag(3)]; mgm = [0, -gamma_db]; pgm = [ax_vec_pha(4), -180]; wpm = [w_phi, w_phi]; mpm = [0, ax_vec_mag(3)]; ppmh = [ax_vec_pha(4), phi - 180]; ppm = [phi - 180, -180]; title_str = sprintf ("GM = %g dB (at %g rad/s), PM = %g deg (at %g rad/s)", gamma_db, w_gamma, phi, w_phi); if (continuous) xl_str = "Frequency [rad/s]"; else xl_str = sprintf ("Frequency [rad/s] w_N = %g", pi/tsam); endif subplot (2, 1, 1) semilogx (w, mag_db, "b", wv, [0, 0], "-.k", wgm, mgmh, "-.k", wgm, mgm, "r", wpm, mpm, "-.k") axis (ax_vec_mag) grid ("on") title (title_str) ylabel ("Magnitude [dB]") subplot (2, 1, 2) semilogx (w, pha, "b", wv, [-180, -180], "-.k", wgm, pgm, "-.k", wpm, ppmh, "-.k", wpm, ppm, "r") axis (ax_vec_pha) grid ("on") xlabel (xl_str) ylabel ("Phase [deg]") else # return values gamma_r = gamma; phi_r = phi; w_gamma_r = w_gamma; w_phi_r = w_phi; endif endfunction function [poly_eq_1, poly_eq_2] = poly_equalizer (poly_1, poly_2) l_p1 = length (poly_1); l_p2 = length (poly_2); l_max = max (l_p1, l_p2); lead_zer_1 = zeros (1, l_max - l_p1); lead_zer_2 = zeros (1, l_max - l_p2); poly_eq_1 = horzcat (lead_zer_1, poly_1); poly_eq_2 = horzcat (lead_zer_2, poly_2); endfunction function [gamma, w_gamma] = gm_filter (w, num, den, tsam, tol, continuous) idx = find ((abs (imag (w)) < tol) & (real (w) > 0)); # find frequencies in R+ if (length (idx) > 0) # if frequencies in R+ exist w_gm = real (w(idx)); if (continuous) s = i * w_gm; else s = exp (i * w_gm * tsam); endif f_resp = polyval (num, s) ./ polyval (den, s); gm = (abs (f_resp)).^-1; ## find crossings between 0 and -1 idx = find ((real (f_resp) < 0) & (real (f_resp) >= -1)); if (length (idx) > 0) # if crossings between 0 and -1 exist gm = gm(idx); w_gm = w_gm(idx); [gamma, idx] = min (gm); w_gamma = w_gm(idx); else # there are no crossings between 0 and -1 idx = find (real (f_resp) < -1); # find crossings between -1 and -Inf if (length (idx) > 0) # if crossings between -1 and -Inf exist gm = gm(idx); w_gm = w_gm(idx); [gamma, idx] = max (gm); w_gamma = w_gm(idx); else gamma = Inf; w_gamma = NaN; endif endif else # there are no frequencies in R+ gamma = Inf; w_gamma = NaN; endif endfunction function [phi, w_phi] = pm_filter (w, num, den, tsam, tol, continuous) idx = find ((abs (imag (w)) < tol) & (real (w) > 0)); # find frequencies in R+ if (length (idx) > 0) # if frequencies in R+ exist w_pm = real (w(idx)); if (continuous) s = i * w_pm; else s = exp (i * w_pm * tsam); endif f_resp = polyval (num, s) ./ polyval (den, s); pm = 180 + arg (f_resp) ./ pi .* 180; [phi, idx] = min (pm); w_phi = w_pm(idx); else # there are no frequencies in R+ phi = 180; w_phi = NaN; endif endfunction %!shared margin_c, margin_c_exp, margin_d, margin_d_exp %! sysc = tf ([24], [1, 6, 11, 6]); %! [gamma_c, phi_c, w_gamma_c, w_phi_c] = margin (sysc); %! sysd = c2d (sysc, 0.3); %! [gamma_d, phi_d, w_gamma_d, w_phi_d] = margin (sysd); %! %! margin_c = [gamma_c, phi_c, w_gamma_c, w_phi_c]; %! margin_d = [gamma_d, phi_d, w_gamma_d, w_phi_d]; %! %! ## results from this implementation and the "dark side" diverge %! ## from the third digit after the decimal point on %! %! gamma_c_exp = 2.50; %! phi_c_exp = 35.43; %! w_gamma_c_exp = 3.32; %! w_phi_c_exp = 2.06; %! %! gamma_d_exp = 1.41; %! phi_d_exp = 18.60; %! w_gamma_d_exp = 2.48; %! w_phi_d_exp = 2.04; %! %! margin_c_exp = [gamma_c_exp, phi_c_exp, w_gamma_c_exp, w_phi_c_exp]; %! margin_d_exp = [gamma_d_exp, phi_d_exp, w_gamma_d_exp, w_phi_d_exp]; %! %!assert (margin_c, margin_c_exp, 1e-2); %!assert (margin_d, margin_d_exp, 1e-2); control/inst/MDSSystem.m0000644000076500000240000001310412273411257014526 0ustar lukasstaff%% -*- texinfo -*- %% Robust control of a mass-damper-spring system. %% Type @code{which MDSSystem} to locate, %% @code{edit MDSSystem} to open and simply %% @code{MDSSystem} to run the example file. % =============================================================================== % Robust Control of a Mass-Damper-Spring System Lukas Reichlin August 2011 % =============================================================================== % Reference: Gu, D.W., Petkov, P.Hr. and Konstantinov, M.M. % Robust Control Design with Matlab, Springer 2005 % =============================================================================== % Tabula Rasa clear all, close all, clc % =============================================================================== % System Model % =============================================================================== % +---------------+ % | d_m 0 0 | % +-----| 0 d_c 0 |<----+ % u_m | | 0 0 d_k | | y_m % u_c | +---------------+ | y_c % u_k | | y_k % | +---------------+ | % +---->| |-----+ % | G_nom | % u ----->| |-----> y % +---------------+ % Nominal Values m_nom = 3; % mass c_nom = 1; % damping coefficient k_nom = 2; % spring stiffness % Perturbations p_m = 0.4; % 40% uncertainty in the mass p_c = 0.2; % 20% uncertainty in the damping coefficient p_k = 0.3; % 30% uncertainty in the spring stiffness % State-Space Representation A = [ 0, 1 -k_nom/m_nom, -c_nom/m_nom ]; B1 = [ 0, 0, 0 -p_m, -p_c/m_nom, -p_k/m_nom ]; B2 = [ 0 1/m_nom ]; C1 = [ -k_nom/m_nom, -c_nom/m_nom 0, c_nom k_nom, 0 ]; C2 = [ 1, 0 ]; D11 = [ -p_m, -p_c/m_nom, -p_k/m_nom 0, 0, 0 0, 0, 0 ]; D12 = [ 1/m_nom 0 0 ]; D21 = [ 0, 0, 0 ]; D22 = [ 0 ]; inname = {'u_m', 'u_c', 'u_k', 'u'}; % input names outname = {'y_m', 'y_c', 'y_k', 'y'}; % output names G_nom = ss (A, [B1, B2], [C1; C2], [D11, D12; D21, D22], ... 'inputname', inname, 'outputname', outname); G = G_nom('y', 'u'); % extract output y and input u % =============================================================================== % Frequency Analysis of Uncertain System % =============================================================================== % Uncertainties: -1 <= delta_m, delta_c, delta_k <= 1 [delta_m, delta_c, delta_k] = ndgrid ([-1, 0, 1], [-1, 0, 1], [-1, 0, 1]); % Bode Plots of Perturbed Plants w = logspace (-1, 1, 100); % frequency vector Delta = arrayfun (@(m, c, k) diag ([m, c, k]), delta_m(:), delta_c(:), delta_k(:), 'uniformoutput', false); G_per = cellfun (@lft, Delta, {G_nom}, 'uniformoutput', false); figure (1) bode (G_per{:}, w) legend off % =============================================================================== % Mixed Sensitivity H-infinity Controller Design (S over KS Method) % =============================================================================== % +-------+ % +--------------------->| W_p |----------> e_p % | +-------+ % | +-------+ % | +---->| W_u |----------> e_u % | | +-------+ % | | +---------+ % | | ->| |-> % r + e | +-------+ u | | G_nom | % ----->(+)---+-->| K |----+--->| |----+----> y % ^ - +-------+ +---------+ | % | | % +-----------------------------------------+ % Weighting Functions s = tf ('s'); % transfer function variable W_p = 0.95 * (s^2 + 1.8*s + 10) / (s^2 + 8.0*s + 0.01); % performance weighting W_u = 10^-2; % control weighting % Synthesis K_mix = mixsyn (G, W_p, W_u); % mixed-sensitivity H-infinity synthesis % Interconnections L_mix = G * K_mix; % open loop T_mix = feedback (L_mix); % closed loop % =============================================================================== % H-infinity Loop-Shaping Design (Normalized Coprime Factor Perturbations) % =============================================================================== % Settings W1 = 8 * (2*s + 1) / (0.9*s); % precompensator W2 = 1; % postcompensator factor = 1.1; % suboptimal controller % Synthesis K_ncf = ncfsyn (G, W1, W2, factor); % positive feedback controller % Interconnections K_ncf = -K_ncf; % negative feedback controller L_ncf = G * K_ncf; % open loop T_ncf = feedback (L_ncf); % closed loop % =============================================================================== % Plot Results % =============================================================================== % Bode Plot figure (2) bode (K_mix, K_ncf) % Step Response figure (3) step (T_mix, T_ncf, 10) % step response for 10 seconds % =============================================================================== control/inst/mixsyn.m0000644000076500000240000002421212273411257014227 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} mixsyn (@var{G}, @var{W1}, @var{W2}, @var{W3}, @dots{}) ## Solve stacked S/KS/T H-infinity problem. ## Mixed-sensitivity is the name given to transfer function shaping problems in which ## the sensitivity function ## @iftex ## @tex ## $ S = (I + G K)^{-1} $ ## @end tex ## @end iftex ## @ifnottex ## @example ## -1 ## S = (I + G K) ## @end example ## @end ifnottex ## is shaped along with one or more other closed-loop transfer functions such as @var{K S} ## or the complementary sensitivity function ## @iftex ## @tex ## $ T = I - S = (I + G K)^{-1} G K $ ## @end tex ## @end iftex ## @ifnottex ## @example ## -1 ## T = I - S = (I + G K) ## @end example ## @end ifnottex ## in a typical one degree-of-freedom configuration, where @var{G} denotes the plant and ## @var{K} the (sub-)optimal controller to be found. The shaping of multivariable ## transfer functions is based on the idea that a satisfactory definition of gain ## (range of gain) for a matrix transfer function is given by the singular values ## @iftex ## @tex ## $\\sigma$ ## @end tex ## @end iftex ## @ifnottex ## ## @end ifnottex ## of the transfer function. Hence the classical loop-shaping ideas of feedback design ## can be generalized to multivariable systems. In addition to the requirement that ## @var{K} stabilizes @var{G}, the closed-loop objectives are as follows [1]: ## @enumerate ## @item For @emph{disturbance rejection} make ## @iftex ## @tex ## $\\overline{\\sigma}(S)$ ## @end tex ## @end iftex ## @ifnottex ## ## @end ifnottex ## small. ## @item For @emph{noise attenuation} make ## @iftex ## @tex ## $\\overline{\\sigma}(T)$ ## @end tex ## @end iftex ## @ifnottex ## ## @end ifnottex ## small. ## @item For @emph{reference tracking} make ## @iftex ## @tex ## $\\overline{\\sigma}(T) \\approx \\underline{\\sigma}(T) \\approx 1$. ## @end tex ## @end iftex ## @ifnottex ## ## @end ifnottex ## @item For @emph{input usage (control energy) reduction} make ## @iftex ## @tex ## $\\overline{\\sigma}(K S)$ ## @end tex ## @end iftex ## @ifnottex ## ## @end ifnottex ## small. ## @item For @emph{robust stability} in the presence of an additive perturbation ## @iftex ## @tex ## $G_p = G + \\Delta$, ## @end tex ## @end iftex ## @ifnottex ## ## @end ifnottex ## make ## @iftex ## @tex ## $\\overline{\\sigma}(K S)$ ## @end tex ## @end iftex ## @ifnottex ## ## @end ifnottex ## small. ## @item For @emph{robust stability} in the presence of a multiplicative output perturbation ## @iftex ## @tex ## $G_p = (I + \\Delta) G$, ## @end tex ## @end iftex ## @ifnottex ## ## @end ifnottex ## make ## @iftex ## @tex ## $\\overline{\\sigma}(T)$ ## @end tex ## @end iftex ## @ifnottex ## ## @end ifnottex ## small. ## @end enumerate ## In order to find a robust controller for the so-called stacked ## @iftex ## @tex ## $S/KS/T \\ H_{\\infty}$ ## @end tex ## @end iftex ## @ifnottex ## S/KS/T H-infinity ## @end ifnottex ## problem, the user function @command{mixsyn} minimizes the following criterion ## @iftex ## @tex ## $$ \\underset{K}{\\min} || N(K) ||_{\\infty}, \\quad N = | W_1 S; \\ W_2 K S; \\ W_3 T |$$ ## @end tex ## @end iftex ## @ifnottex ## @example ## | W1 S | ## min || N(K) || N = | W2 K S | ## K oo | W3 T | ## @end example ## @end ifnottex ## @code{[K, N] = mixsyn (G, W1, W2, W3)}. ## The user-defined weighting functions @var{W1}, @var{W2} and @var{W3} bound the largest ## singular values of the closed-loop transfer functions @var{S} (for performance), ## @var{K S} (to penalize large inputs) and @var{T} (for robustness and to avoid ## sensitivity to noise), respectively [1]. ## A few points are to be considered when choosing the weights. ## The weigths @var{Wi} must all be proper and stable. Therefore if one wishes, ## for example, to minimize @var{S} at low frequencies by a weighting @var{W1} including ## integral action, ## @iftex ## @tex ## ${1 \\over s}$ ## @end tex ## @end iftex ## @ifnottex ## @example ## 1 ## - ## s ## @end example ## @end ifnottex ## needs to be approximated by ## @iftex ## @tex ## ${1 \\over s + \\epsilon}$, where $\\epsilon \\ll 1$. ## @end tex ## @end iftex ## @ifnottex ## @example ## 1 ## ----- where e << 1. ## s + e ## @end example ## @end ifnottex ## Similarly one might be interested in weighting @var{K S} with a non-proper weight ## @var{W2} to ensure that @var{K} is small outside the system bandwidth. ## The trick here is to replace a non-proper term such as ## @iftex ## @tex ## $ 1 + \\tau_1 s $ by $ {1 + \\tau_1 s \\over 1 + \\tau_2 s} $, where ## @end tex ## @end iftex ## @ifnottex ## @example ## 1 + T1 s ## 1 + T1 s by --------, where T2 << T1. ## 1 + T2 s ## @end example ## @end ifnottex ## @iftex ## @tex ## $\\tau_2 \\ll \\tau_1$ ## @end tex ## @end iftex ## [1, 2]. ## ## ## @strong{Inputs} ## @table @var ## @item G ## @acronym{LTI} model of plant. ## @item W1 ## @acronym{LTI} model of performance weight. Bounds the largest singular values of sensitivity @var{S}. ## Model must be empty @code{[]}, SISO or of appropriate size. ## @item W2 ## @acronym{LTI} model to penalize large control inputs. Bounds the largest singular values of @var{KS}. ## Model must be empty @code{[]}, SISO or of appropriate size. ## @item W3 ## @acronym{LTI} model of robustness and noise sensitivity weight. Bounds the largest singular values of ## complementary sensitivity @var{T}. Model must be empty @code{[]}, SISO or of appropriate size. ## @item @dots{} ## Optional arguments of @command{hinfsyn}. Type @command{help hinfsyn} for more information. ## @end table ## ## All inputs must be proper/realizable. ## Scalars, vectors and matrices are possible instead of @acronym{LTI} models. ## ## @strong{Outputs} ## @table @var ## @item K ## State-space model of the H-infinity (sub-)optimal controller. ## @item N ## State-space model of the lower LFT of @var{P} and @var{K}. ## @item info ## Structure containing additional information. ## @item info.gamma ## L-infinity norm of @var{N}. ## @item info.rcond ## Vector @var{rcond} contains estimates of the reciprocal condition ## numbers of the matrices which are to be inverted and ## estimates of the reciprocal condition numbers of the ## Riccati equations which have to be solved during the ## computation of the controller @var{K}. For details, ## see the description of the corresponding SLICOT routine. ## @end table ## ## @strong{Block Diagram} ## @example ## @group ## ## | W1 S | ## gamma = min||N(K)|| N = | W2 K S | = lft (P, K) ## K inf | W3 T | ## @end group ## @end example ## @example ## @group ## +------+ z1 ## +---------------------------------------->| W1 |-----> ## | +------+ ## | +------+ z2 ## | +---------------------->| W2 |-----> ## | | +------+ ## r + e | +--------+ u | +--------+ y +------+ z3 ## ----->(+)---+-->| K(s) |----+-->| G(s) |----+---->| W3 |-----> ## ^ - +--------+ +--------+ | +------+ ## | | ## +----------------------------------------+ ## @end group ## @end example ## @example ## @group ## +--------+ ## | |-----> z1 (p1x1) z1 = W1 e ## r (px1) ----->| P(s) |-----> z2 (p2x1) z2 = W2 u ## | |-----> z3 (p3x1) z3 = W3 y ## u (mx1) ----->| |-----> e (px1) e = r - y ## +--------+ ## @end group ## @end example ## @example ## @group ## +--------+ ## r ----->| |-----> z ## | P(s) | ## u +---->| |-----+ e ## | +--------+ | ## | | ## | +--------+ | ## +-----| K(s) |<----+ ## +--------+ ## @end group ## @end example ## @example ## @group ## +--------+ ## r ----->| N(s) |-----> z ## +--------+ ## @end group ## @end example ## @example ## @group ## Extended Plant: P = augw (G, W1, W2, W3) ## Controller: K = mixsyn (G, W1, W2, W3) ## Entire System: N = lft (P, K) ## Open Loop: L = G * K ## Closed Loop: T = feedback (L) ## @end group ## @end example ## ## @strong{Algorithm}@* ## Relies on functions @command{augw} and @command{hinfsyn}, ## which use SLICOT SB10FD, SB10DD and SB10AD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @strong{References}@* ## [1] Skogestad, S. and Postlethwaite I. (2005) ## @cite{Multivariable Feedback Control: Analysis and Design: ## Second Edition}. Wiley, Chichester, England.@* ## [2] Meinsma, G. (1995) ## @cite{Unstable and nonproper weights in H-infinity control} ## Automatica, Vol. 31, No. 11, pp. 1655-1658 ## ## @seealso{hinfsyn, augw} ## @end deftypefn ## Author: Lukas Reichlin ## Created: December 2009 ## Version: 0.2 function [K, N, gamma, info] = mixsyn (G, W1 = [], W2 = [], W3 = [], varargin) if (nargin == 0) print_usage (); endif [p, m] = size (G); P = augw (G, W1, W2, W3); [K, N, gamma, info] = hinfsyn (P, p, m, varargin{:}); endfunction control/inst/mktito.m0000644000076500000240000000704312273411257014212 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {@var{P} =} mktito (@var{P}, @var{nmeas}, @var{ncon}) ## Partition @acronym{LTI} plant @var{P} for robust controller synthesis. ## If a plant is partitioned this way, one can omit the inputs @var{nmeas} ## and @var{ncon} when calling the functions @command{hinfsyn} and @command{h2syn}. ## ## @strong{Inputs} ## @table @var ## @item P ## Generalized plant. ## @item nmeas ## Number of measured outputs v. The last @var{nmeas} outputs of @var{P} are connected to the ## inputs of controller @var{K}. The remaining outputs z (indices 1 to p-nmeas) are used ## to calculate the H-2/H-infinity norm. ## @item ncon ## Number of controlled inputs u. The last @var{ncon} inputs of @var{P} are connected to the ## outputs of controller @var{K}. The remaining inputs w (indices 1 to m-ncon) are excited ## by a harmonic test signal. ## @end table ## ## @strong{Outputs} ## @table @var ## @item P ## Partitioned plant. The input/output groups and names are overwritten with designations ## according to [1]. ## @end table ## ## @strong{Block Diagram} ## @example ## @group ## ## min||N(K)|| N = lft (P, K) ## K norm ## ## +--------+ ## w ----->| |-----> z ## | P(s) | ## u +---->| |-----+ v ## | +--------+ | ## | | ## | +--------+ | ## +-----| K(s) |<----+ ## +--------+ ## ## +--------+ ## w ----->| N(s) |-----> z ## +--------+ ## @end group ## @end example ## ## @strong{Reference}@* ## [1] Skogestad, S. and Postlethwaite, I. (2005) ## @cite{Multivariable Feedback Control: Analysis and Design: ## Second Edition}. Wiley, Chichester, England. ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2013 ## Version: 0.1 function P = mktito (P, nmeas, ncon) if (nargin != 3) print_usage (); endif if (! isa (P, "lti")) error ("mktito: first argument must be an LTI model"); endif [p, m] = size (P); if (! is_index (nmeas, p)) error ("mktito: second argument 'nmeas' invalid"); endif if (! is_index (ncon, m)) error ("mktito: third argument 'ncon' invalid"); endif outgroup = struct ("Z", 1:p-nmeas, "V", p-nmeas+1:p); outname = vertcat (strseq ("z", 1:p-nmeas), strseq ("v", 1:nmeas)); ingroup = struct ("W", 1:m-ncon, "U", m-ncon+1:m); inname = vertcat (strseq ("w", 1:m-ncon), strseq ("u", 1:ncon)); P = set (P, "outgroup", outgroup, "ingroup", ingroup, ... "outname", outname, "inname", inname); endfunction function bool = is_index (idx, s) ## (idx < s) and not (idx <= s) because we need at least one Z or W bool = is_real_scalar (idx) && fix (idx) == idx && idx > 0 && idx < s; endfunction control/inst/moen4.m0000644000076500000240000044615012273411257013733 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moen4 (@var{dat}, @dots{}) ## @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moen4 (@var{dat}, @var{n}, @dots{}) ## @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moen4 (@var{dat}, @var{opt}, @dots{}) ## @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moen4 (@var{dat}, @var{n}, @var{opt}, @dots{}) ## Estimate state-space model using combined subspace method: ## @acronym{MOESP} algorithm for finding the matrices A and C, ## and @acronym{N4SID} algorithm for finding the matrices B and D. ## If no output arguments are given, the singular values are ## plotted on the screen in order to estimate the system order. ## ## @strong{Inputs} ## @table @var ## @item dat ## iddata set containing the measurements, i.e. time-domain signals. ## @item n ## The desired order of the resulting state-space system @var{sys}. ## If not specified, @var{n} is chosen automatically according ## to the singular values and tolerances. ## @item @dots{} ## Optional pairs of keys and values. @code{'key1', value1, 'key2', value2}. ## @item opt ## Optional struct with keys as field names. ## Struct @var{opt} can be created directly or ## by command @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. ## @end table ## ## ## @strong{Outputs} ## @table @var ## @item sys ## Discrete-time state-space model. ## @item x0 ## Initial state vector. If @var{dat} is a multi-experiment dataset, ## @var{x0} becomes a cell vector containing an initial state vector ## for each experiment. ## @item info ## Struct containing additional information. ## @table @var ## @item info.K ## Kalman gain matrix. ## @item info.Q ## State covariance matrix. ## @item info.Ry ## Output covariance matrix. ## @item info.S ## State-output cross-covariance matrix. ## @item info.L ## Noise variance matrix factor. LL'=Ry. ## @end table ## @end table ## ## ## ## @strong{Option Keys and Values} ## @table @var ## @item 'n' ## The desired order of the resulting state-space system @var{sys}. ## @var{s} > @var{n} > 0. ## ## @item 's' ## The number of block rows @var{s} in the input and output ## block Hankel matrices to be processed. @var{s} > 0. ## In the MOESP theory, @var{s} should be larger than @var{n}, ## the estimated dimension of state vector. ## ## @item 'alg', 'algorithm' ## Specifies the algorithm for computing the triangular ## factor R, as follows: ## @table @var ## @item 'C' ## Cholesky algorithm applied to the correlation ## matrix of the input-output data. Default method. ## @item 'F' ## Fast QR algorithm. ## @item 'Q' ## QR algorithm applied to the concatenated block ## Hankel matrices. ## @end table ## ## @item 'tol' ## Absolute tolerance used for determining an estimate of ## the system order. If @var{tol} >= 0, the estimate is ## indicated by the index of the last singular value greater ## than or equal to @var{tol}. (Singular values less than @var{tol} ## are considered as zero.) When @var{tol} = 0, an internally ## computed default value, @var{tol} = @var{s}*@var{eps}*SV(1), is used, ## where SV(1) is the maximal singular value, and @var{eps} is ## the relative machine precision. ## When @var{tol} < 0, the estimate is indicated by the ## index of the singular value that has the largest ## logarithmic gap to its successor. Default value is 0. ## ## @item 'rcond' ## The tolerance to be used for estimating the rank of ## matrices. If the user sets @var{rcond} > 0, the given value ## of @var{rcond} is used as a lower bound for the reciprocal ## condition number; an m-by-n matrix whose estimated ## condition number is less than 1/@var{rcond} is considered to ## be of full rank. If the user sets @var{rcond} <= 0, then an ## implicitly computed, default tolerance, defined by ## @var{rcond} = m*n*@var{eps}, is used instead, where @var{eps} is the ## relative machine precision. Default value is 0. ## ## @item 'confirm' ## Specifies whether or not the user's confirmation of the ## system order estimate is desired, as follows: ## @table @var ## @item true ## User's confirmation. ## @item false ## No confirmation. Default value. ## @end table ## ## @item 'noiseinput' ## The desired type of noise input channels. ## @table @var ## @item 'n' ## No error inputs. Default value. ## @iftex ## @tex ## $$ x_{k+1} = A x_k + B u_k $$ ## $$ y_k = C x_k + D u_k $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## x[k+1] = A x[k] + B u[k] ## y[k] = C x[k] + D u[k] ## @end example ## @end ifnottex ## ## @item 'e' ## Return @var{sys} as a (p-by-m+p) state-space model with ## both measured input channels u and noise channels e ## with covariance matrix @var{Ry}. ## @iftex ## @tex ## $$ x_{k+1} = A x_k + B u_k + K e_k $$ ## $$ y_k = C x_k + D u_k + e_k $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## x[k+1] = A x[k] + B u[k] + K e[k] ## y[k] = C x[k] + D u[k] + e[k] ## @end example ## @end ifnottex ## ## @item 'v' ## Return @var{sys} as a (p-by-m+p) state-space model with ## both measured input channels u and white noise channels v ## with identity covariance matrix. ## @iftex ## @tex ## $$ x_{k+1} = A x_k + B u_k + K L v_k $$ ## $$ y_k = C x_k + D u_k + L v_k $$ ## $$ e = L v, \\ L L^T = R_y $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## x[k+1] = A x[k] + B u[k] + K L v[k] ## y[k] = C x[k] + D u[k] + L v[k] ## e = L v, L L' = Ry ## @end example ## @end ifnottex ## ## @item 'k' ## Return @var{sys} as a Kalman predictor for simulation. ## @iftex ## @tex ## $$ \\widehat{x}_{k+1} = A \\widehat{x}_k + B u_k + K (y_k - \\widehat{y}_k) $$ ## $$ \\widehat{y}_k = C \\widehat{x}_k + D u_k $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ^ ^ ^ ## x[k+1] = A x[k] + B u[k] + K(y[k] - y[k]) ## ^ ^ ## y[k] = C x[k] + D u[k] ## @end example ## @end ifnottex ## ## @iftex ## @tex ## $$ \\widehat{x}_{k+1} = (A-KC) \\widehat{x}_k + (B-KD) u_k + K y_k $$ ## $$ \\widehat{y}_k = C \\widehat{x}_k + D u_k + 0 y_k $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ^ ^ ## x[k+1] = (A-KC) x[k] + (B-KD) u[k] + K y[k] ## ^ ^ ## y[k] = C x[k] + D u[k] + 0 y[k] ## @end example ## @end ifnottex ## @end table ## @end table ## ## ## @strong{Algorithm}@* ## Uses SLICOT IB01AD, IB01BD and IB01CD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: May 2012 ## Version: 0.1 function [sys, x0, info] = moen4 (varargin) if (nargin == 0) print_usage (); endif if (nargout == 0) __slicot_identification__ ("moen4", nargout, varargin{:}); else [sys, x0, info] = __slicot_identification__ ("moen4", nargout, varargin{:}); endif endfunction %!shared SYS, X0, INFO, Ae, Be, Ce, De, Ke, Qe, Rye, Se, X0e %! %! Y = [ 4.7661 5.5451 5.8503 5.3766 4.8833 5.4865 3.5378 5.3155 6.0530 4.3729 %! 4.7637 5.1886 5.9236 5.6818 4.8858 5.1495 3.5549 5.5329 6.0799 4.7417 %! 4.8394 4.8833 5.9212 5.8235 4.8931 4.8442 3.4938 5.4450 6.1287 5.0884 %! 5.0030 4.6000 5.9773 5.9529 4.7148 4.5414 3.4474 5.3961 6.0799 5.1861 %! 5.0176 4.2704 5.7405 6.0628 4.4511 4.2679 3.4401 5.2740 6.1678 5.0372 %! 5.0567 4.0384 5.3888 6.0897 4.2337 4.0604 3.4083 5.0274 6.1947 4.7856 %! 5.1544 3.8381 5.0005 6.0750 4.0433 3.9602 3.4108 4.7441 6.2362 4.5634 %! 5.3619 3.7112 4.8491 6.0262 3.8650 3.7893 3.4523 4.6684 6.0530 4.5341 %! 5.4254 3.5915 4.9444 5.9944 3.7576 3.6428 3.6818 4.6513 5.6525 4.7050 %! 5.5695 3.5353 5.1739 6.0775 3.6696 3.5256 4.0604 4.5146 5.2740 4.7417 %! 5.6818 3.4865 5.3693 5.8577 3.5939 3.4987 4.4413 4.2679 4.8589 4.6489 %! 5.7429 3.4767 5.4474 5.7014 3.5475 3.4547 4.8540 4.2606 4.5341 4.4315 %! 5.8039 3.4254 5.6037 5.7307 3.5060 3.4083 5.1544 4.2630 4.4560 4.2386 %! 5.9187 3.3815 5.7307 5.7844 3.4547 3.3790 5.4254 4.1898 4.6196 4.0652 %! 5.8210 3.3693 5.8503 5.8235 3.3986 3.3766 5.5964 4.2777 4.8662 3.9431 %! 5.4474 3.3644 5.9798 5.8943 3.3619 3.3619 5.5866 4.6000 5.1177 3.8113 %! 5.0616 3.3473 5.9920 5.7624 3.3400 3.3595 5.3546 4.9322 5.1666 3.6916 %! 4.6293 3.3815 6.0848 5.4157 3.3742 3.3693 5.0274 5.2838 5.0567 3.6525 %! 4.2679 3.4206 5.9407 4.9615 3.5207 3.3986 4.8638 5.5280 5.0030 3.8259 %! 4.0115 3.4132 5.8039 4.5952 3.7136 3.5793 4.7612 5.7405 5.0982 4.2240 %! 3.8503 3.4523 5.7917 4.3314 3.7576 3.9480 4.5707 5.8748 5.3253 4.4242 %! 3.7112 3.6355 5.6037 4.2972 3.7795 4.4120 4.3681 5.9554 5.5671 4.4291 %! 3.5695 4.0384 5.2643 4.5829 3.6965 4.5854 4.3974 5.9920 5.4670 4.3192 %! 3.5182 4.3754 4.9468 4.8613 3.7771 4.5146 4.5732 5.8455 5.2521 4.1385 %! 3.6525 4.7270 4.6196 5.1739 3.8870 4.3436 4.8418 5.5280 4.9468 3.9651 %! 3.8186 5.0567 4.5146 5.1666 3.9041 4.1556 5.2032 5.0616 4.8809 3.8870 %! 3.8626 5.2985 4.4340 4.9199 3.8503 3.9847 5.4523 4.7344 4.9810 3.8015 %! 4.0115 5.5329 4.2850 4.6074 3.9651 4.0433 5.6525 4.5341 5.2252 3.7014 %! 4.3534 5.4670 4.1214 4.3705 4.2826 4.3070 5.8552 4.5341 5.4596 3.6403 %! 4.7050 5.1959 3.9456 4.1825 4.5219 4.4218 5.9065 4.6977 5.7234 3.7673 %! 5.0836 4.8858 3.9847 4.0384 4.7148 4.3534 5.9529 4.7441 5.7917 4.1507 %! 5.3449 4.7637 4.2191 4.1458 4.9712 4.2240 5.8284 4.6196 5.9065 4.6489 %! 5.2740 4.8760 4.5463 4.4315 5.2203 4.0530 5.7917 4.6440 5.9920 4.9908 %! 5.1275 5.0420 4.8735 4.5561 5.5329 3.9407 5.7991 4.8320 5.8357 5.0884 %! 4.7612 5.2838 5.1544 4.4804 5.6525 3.8381 5.8137 5.1324 5.5280 5.0225 %! 4.4511 5.4914 5.3888 4.3754 5.7820 3.7307 5.8772 5.4108 5.1422 4.7832 %! 4.2215 5.5964 5.6135 4.3705 5.9554 3.6525 5.9554 5.6257 4.7759 4.6855 %! 4.0457 5.6721 5.8357 4.5585 6.0359 3.6110 5.7820 5.6037 4.4902 4.6660 %! 3.8748 5.7722 5.8845 4.8589 6.1190 3.5646 5.5182 5.3155 4.2362 4.7075 %! 3.7307 5.8308 5.9554 4.8955 6.1336 3.4963 5.1275 4.9615 4.0237 4.9126 %! 3.6623 5.9334 5.7624 4.7417 6.1532 3.4621 4.7637 4.6196 3.8870 5.1959 %! 3.5768 5.8992 5.4596 4.7441 6.1922 3.4547 4.4926 4.3583 3.7527 5.4157 %! 3.5427 5.9358 5.0616 4.8760 6.1434 3.4254 4.2337 4.1556 3.6818 5.6232 %! 3.4792 5.8943 4.7075 5.1055 6.1678 3.3790 4.0115 4.0335 3.8064 5.7405 %! 3.4547 5.9187 4.4584 5.2398 5.9920 3.4328 3.8552 3.8870 4.1458 5.8992 %! 3.3595 5.9944 4.2679 5.5182 5.6525 3.6232 3.6916 3.7722 4.6000 5.9285 %! 3.2985 5.9578 4.0530 5.6525 5.4596 3.9749 3.6355 3.6403 5.0030 6.0506 %! 3.2252 6.0311 3.9431 5.7234 5.4376 4.3803 3.8186 3.5329 5.3033 6.1532 %! 3.2008 6.0628 3.8259 5.8552 5.3400 4.7148 4.1556 3.4352 5.5524 5.9651 %! 3.2252 6.0408 3.9676 5.9627 5.0982 5.0738 4.5903 3.4279 5.6159 5.5866 %! 3.2276 6.0970 4.2801 5.9847 4.7856 5.3693 4.9883 3.4230 5.5231 5.3815 %! 3.2740 6.1239 4.4804 5.9847 4.4926 5.6037 5.0762 3.3986 5.6110 5.3717 %! 3.4572 6.1629 4.4926 6.0555 4.2362 5.7453 4.9077 3.6037 5.7136 5.4865 %! 3.8674 6.0408 4.3900 6.0628 4.0677 5.6525 4.6489 4.0237 5.8455 5.5671 %! 4.3217 5.8455 4.1971 6.0555 3.9334 5.4010 4.3778 4.4511 5.8992 5.8210 %! 4.4926 5.7722 4.1116 6.0701 3.8235 5.0152 4.2166 4.7930 5.9944 5.9138 %! 4.4315 5.7991 3.9822 5.7844 3.7307 4.7099 4.2875 4.9029 6.0921 5.9944 %! 4.2435 5.9236 3.8674 5.4401 3.6110 4.4169 4.5903 4.7808 6.0921 6.0115 %! 4.0506 5.9285 3.7673 5.0567 3.5646 4.2362 4.8467 4.5903 6.1434 5.9993 %! 3.8577 6.0018 3.8723 4.9419 3.5500 4.2362 5.1397 4.3363 6.1532 6.0188 %! 3.7307 6.0018 4.2362 5.0103 3.5573 4.2484 5.3888 4.1458 6.2337 5.8210 %! 3.7917 6.0604 4.6635 5.1348 3.5134 4.2215 5.6892 4.2166 6.1873 5.7282 %! 3.9212 5.8821 4.9712 5.3131 3.5158 4.2972 5.8845 4.4340 6.0140 5.7405 %! 3.9554 5.5109 5.0665 5.4792 3.6941 4.5903 6.0433 4.7148 5.8357 5.7649 %! 3.8479 5.3229 4.9029 5.6232 4.0726 4.8931 6.1703 5.0982 5.7746 5.8821 %! 3.7258 5.3717 4.6757 5.5622 4.4804 5.1348 6.2118 5.3595 5.6867 5.9260 %! 3.6110 5.4547 4.3925 5.3302 4.7050 5.4279 6.2508 5.5695 5.5378 5.7502 %! 3.7160 5.4376 4.0994 5.0103 4.6123 5.3790 6.2093 5.7722 5.3278 5.4157 %! 4.0921 5.1593 4.1141 4.6660 4.3851 5.3644 6.0140 5.9212 5.0543 4.9956 %! 4.4804 4.9029 4.3265 4.4145 4.2020 5.4523 5.7014 6.0555 4.7002 4.8613 %! 4.8149 4.5878 4.6440 4.2020 4.0262 5.5671 5.4694 5.9627 4.3949 4.9029 %! 5.0543 4.5024 4.9712 4.0482 3.9041 5.6721 5.4792 5.6428 4.1800 5.1031 %! 5.3033 4.5952 5.1593 4.0799 3.7746 5.7698 5.5573 5.4352 4.0433 5.3644 %! 5.4865 4.8247 5.3888 4.1898 3.6916 5.8308 5.7282 5.3888 3.8772 5.5964 %! 5.6721 5.0640 5.5768 4.1312 3.8455 5.9236 5.8821 5.5378 3.7527 5.7527 %! 5.7795 5.2716 5.6525 4.0042 4.2020 5.9651 5.9847 5.6818 3.7282 5.8455 %! 5.7991 5.4670 5.8039 3.9163 4.5854 6.0579 5.9016 5.7014 3.8699 5.9285 %! 5.6648 5.6159 5.9138 3.9602 4.9029 6.0506 5.5817 5.6159 4.2069 6.0066 %! 5.2911 5.5280 5.8870 4.1996 5.2569 6.0726 5.3717 5.6672 4.3558 5.8406 %! 4.8809 5.2545 5.7991 4.6245 5.5109 6.1116 5.4181 5.7405 4.4267 5.5182 %! 4.5585 4.8833 5.7307 4.8833 5.6403 6.0701 5.5109 5.8039 4.4535 5.1739 %! 4.1849 4.5170 5.7624 5.1373 5.8430 5.8967 5.6672 5.8821 4.5219 4.7392 %! 3.8894 4.1971 5.8137 5.3790 5.9749 5.7551 5.7917 5.9505 4.3925 4.4584 %! 3.7087 4.0018 5.8210 5.6232 5.9358 5.7185 5.6989 6.0726 4.1556 4.4267 %! 3.6232 3.8064 5.9285 5.7624 5.8210 5.8210 5.4840 6.1483 3.9651 4.6025 %! 3.5695 3.9041 6.0140 5.8333 5.5280 6.0018 5.1544 6.1165 3.8772 4.8223 %! 3.7185 3.9236 5.7649 5.6867 5.1715 6.0018 4.9810 6.1776 3.9700 5.1837 %! 4.0335 3.8699 5.4132 5.3668 4.8101 5.9016 5.0616 6.2020 4.2582 5.4303 %! 4.4120 3.8064 5.0982 5.2252 4.4535 5.5573 5.1959 6.2069 4.4218 5.6525 %! 4.6293 3.7209 4.6782 5.2398 4.3803 5.1739 5.3595 5.9920 4.3363 5.8210 %! 4.5585 3.8186 4.3729 5.3546 4.5659 4.8003 5.6159 5.5646 4.2997 5.7063 %! 4.3949 4.1409 4.3925 5.5085 4.8052 4.4315 5.7624 5.1788 4.3925 5.3693 %! 4.1800 4.5292 4.5903 5.5964 5.1251 4.1947 5.8577 4.9981 4.6757 5.0274 %! 4.1971 4.8052 4.9199 5.7527 5.3546 4.0066 5.9480 5.0518 4.7612 4.7050 %! 4.4315 5.0860 5.0176 5.8748 5.5891 3.8503 5.8357 5.2325 4.6587 4.4145 %! 4.7148 5.3400 4.8589 5.9065 5.7649 3.7478 5.7063 5.4840 4.4902 4.1458 %! 4.9615 5.5329 4.6757 5.8943 5.9236 3.6428 5.4987 5.6867 4.3070 3.9651 %! 5.3009 5.5768 4.6196 5.7429 5.9407 3.5915 5.1886 5.8992 4.1263 4.0335 %! 5.5671 5.6672 4.8345 5.4474 5.8577 3.5695 5.1177 5.8699 3.9724 4.3729 %! 5.6818 5.7917 5.0909 5.0250 5.6941 3.5280 5.1910 5.9773 4.0775 4.6831 ](:); %! %! %! %! U = [ 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 3.4100 6.4100 6.4100 3.4100 %! 3.4100 3.4100 3.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 3.4100 %! 6.4100 3.4100 3.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 3.4100 %! 6.4100 3.4100 3.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 3.4100 %! 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 3.4100 6.4100 3.4100 6.4100 %! 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 6.4100 3.4100 3.4100 6.4100 %! 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 6.4100 3.4100 3.4100 3.4100 %! 6.4100 3.4100 6.4100 3.4100 3.4100 3.4100 6.4100 3.4100 3.4100 3.4100 %! 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 6.4100 6.4100 3.4100 3.4100 %! 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 6.4100 3.4100 6.4100 3.4100 %! 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 6.4100 3.4100 6.4100 3.4100 %! 3.4100 3.4100 6.4100 6.4100 3.4100 3.4100 6.4100 6.4100 6.4100 3.4100 %! 3.4100 3.4100 6.4100 6.4100 3.4100 3.4100 3.4100 6.4100 6.4100 3.4100 %! 3.4100 3.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 3.4100 3.4100 %! 3.4100 3.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 3.4100 3.4100 %! 3.4100 3.4100 3.4100 3.4100 6.4100 3.4100 6.4100 6.4100 6.4100 6.4100 %! 3.4100 3.4100 6.4100 3.4100 3.4100 6.4100 3.4100 6.4100 6.4100 6.4100 %! 3.4100 3.4100 6.4100 3.4100 3.4100 6.4100 3.4100 6.4100 6.4100 3.4100 %! 3.4100 6.4100 3.4100 6.4100 3.4100 6.4100 3.4100 6.4100 6.4100 3.4100 %! 3.4100 6.4100 3.4100 6.4100 3.4100 3.4100 6.4100 6.4100 3.4100 3.4100 %! 3.4100 6.4100 3.4100 6.4100 6.4100 3.4100 6.4100 3.4100 3.4100 3.4100 %! 6.4100 6.4100 3.4100 6.4100 3.4100 3.4100 6.4100 3.4100 3.4100 3.4100 %! 3.4100 6.4100 6.4100 3.4100 3.4100 3.4100 6.4100 3.4100 6.4100 3.4100 %! 3.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 3.4100 6.4100 3.4100 %! 6.4100 6.4100 3.4100 3.4100 6.4100 6.4100 6.4100 3.4100 6.4100 3.4100 %! 6.4100 3.4100 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 6.4100 3.4100 %! 6.4100 3.4100 3.4100 3.4100 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 %! 6.4100 3.4100 6.4100 3.4100 6.4100 3.4100 6.4100 3.4100 6.4100 6.4100 %! 6.4100 6.4100 6.4100 6.4100 6.4100 3.4100 3.4100 3.4100 6.4100 6.4100 %! 3.4100 6.4100 6.4100 6.4100 6.4100 3.4100 6.4100 6.4100 6.4100 6.4100 %! 3.4100 6.4100 6.4100 3.4100 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 %! 3.4100 6.4100 6.4100 3.4100 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 %! 3.4100 6.4100 6.4100 3.4100 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 %! 3.4100 6.4100 6.4100 6.4100 6.4100 3.4100 6.4100 6.4100 3.4100 6.4100 %! 3.4100 6.4100 6.4100 6.4100 6.4100 3.4100 3.4100 3.4100 3.4100 3.4100 %! 3.4100 6.4100 6.4100 6.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 %! 3.4100 6.4100 6.4100 3.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 %! 3.4100 6.4100 3.4100 3.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 %! 3.4100 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 %! 3.4100 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 %! 3.4100 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 3.4100 6.4100 6.4100 %! 3.4100 6.4100 3.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 6.4100 %! 3.4100 6.4100 3.4100 6.4100 3.4100 6.4100 3.4100 3.4100 6.4100 6.4100 %! 3.4100 6.4100 3.4100 6.4100 6.4100 6.4100 3.4100 3.4100 6.4100 6.4100 %! 3.4100 6.4100 3.4100 6.4100 6.4100 6.4100 6.4100 3.4100 6.4100 6.4100 %! 3.4100 6.4100 3.4100 6.4100 3.4100 6.4100 6.4100 3.4100 6.4100 3.4100 %! 3.4100 6.4100 6.4100 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 3.4100 %! 3.4100 6.4100 6.4100 6.4100 3.4100 6.4100 6.4100 3.4100 6.4100 6.4100 %! 3.4100 6.4100 3.4100 6.4100 3.4100 6.4100 3.4100 3.4100 6.4100 6.4100 %! 6.4100 6.4100 3.4100 6.4100 3.4100 6.4100 3.4100 6.4100 6.4100 6.4100 %! 6.4100 3.4100 3.4100 6.4100 3.4100 3.4100 3.4100 6.4100 6.4100 6.4100 %! 6.4100 6.4100 3.4100 6.4100 3.4100 3.4100 3.4100 6.4100 6.4100 6.4100 %! 3.4100 6.4100 3.4100 6.4100 3.4100 3.4100 3.4100 6.4100 6.4100 6.4100 %! 3.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 3.4100 6.4100 6.4100 %! 3.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 3.4100 6.4100 6.4100 %! 3.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 3.4100 6.4100 6.4100 %! 3.4100 6.4100 6.4100 6.4100 3.4100 6.4100 6.4100 3.4100 6.4100 6.4100 %! 3.4100 6.4100 6.4100 6.4100 3.4100 3.4100 6.4100 3.4100 6.4100 3.4100 %! 6.4100 6.4100 6.4100 6.4100 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 %! 3.4100 3.4100 6.4100 6.4100 3.4100 6.4100 6.4100 6.4100 3.4100 6.4100 %! 3.4100 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 6.4100 6.4100 6.4100 %! 3.4100 6.4100 3.4100 6.4100 6.4100 6.4100 6.4100 6.4100 6.4100 6.4100 %! 3.4100 6.4100 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 3.4100 6.4100 %! 3.4100 6.4100 3.4100 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 3.4100 %! 6.4100 3.4100 3.4100 3.4100 3.4100 3.4100 6.4100 6.4100 3.4100 3.4100 %! 6.4100 3.4100 6.4100 3.4100 3.4100 6.4100 3.4100 6.4100 3.4100 3.4100 %! 6.4100 3.4100 6.4100 3.4100 3.4100 6.4100 3.4100 6.4100 3.4100 6.4100 %! 6.4100 3.4100 6.4100 3.4100 3.4100 6.4100 6.4100 3.4100 3.4100 6.4100 %! 6.4100 6.4100 6.4100 3.4100 3.4100 6.4100 6.4100 3.4100 3.4100 6.4100 %! 6.4100 6.4100 6.4100 6.4100 3.4100 6.4100 6.4100 6.4100 3.4100 6.4100 %! 6.4100 6.4100 6.4100 3.4100 3.4100 6.4100 6.4100 6.4100 3.4100 6.4100 %! 6.4100 6.4100 6.4100 3.4100 6.4100 6.4100 6.4100 6.4100 3.4100 6.4100 %! 6.4100 6.4100 6.4100 3.4100 6.4100 6.4100 6.4100 6.4100 3.4100 6.4100 %! 6.4100 6.4100 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 6.4100 6.4100 %! 3.4100 6.4100 6.4100 6.4100 6.4100 6.4100 3.4100 6.4100 6.4100 6.4100 %! 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 6.4100 6.4100 3.4100 3.4100 %! 3.4100 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 6.4100 3.4100 3.4100 %! 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 6.4100 6.4100 6.4100 3.4100 %! 3.4100 3.4100 6.4100 6.4100 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 %! 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 6.4100 6.4100 3.4100 3.4100 %! 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 3.4100 6.4100 3.4100 6.4100 %! 3.4100 3.4100 6.4100 6.4100 3.4100 6.4100 3.4100 6.4100 3.4100 6.4100 %! 3.4100 6.4100 6.4100 6.4100 3.4100 6.4100 3.4100 6.4100 3.4100 6.4100 %! 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 6.4100 %! 6.4100 3.4100 3.4100 3.4100 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 %! 6.4100 3.4100 3.4100 6.4100 3.4100 3.4100 6.4100 6.4100 3.4100 6.4100 %! 3.4100 3.4100 3.4100 6.4100 6.4100 3.4100 6.4100 3.4100 3.4100 6.4100 %! 3.4100 6.4100 3.4100 6.4100 6.4100 3.4100 6.4100 3.4100 3.4100 3.4100 %! 3.4100 6.4100 6.4100 6.4100 6.4100 3.4100 6.4100 3.4100 6.4100 3.4100 %! 3.4100 6.4100 6.4100 6.4100 6.4100 3.4100 6.4100 6.4100 6.4100 3.4100 %! 6.4100 6.4100 6.4100 6.4100 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 %! 6.4100 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 6.4100 3.4100 3.4100 %! 6.4100 6.4100 3.4100 6.4100 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 %! 6.4100 6.4100 3.4100 6.4100 6.4100 3.4100 3.4100 6.4100 3.4100 3.4100 %! 6.4100 6.4100 6.4100 3.4100 6.4100 3.4100 3.4100 6.4100 3.4100 6.4100 %! 6.4100 6.4100 6.4100 3.4100 3.4100 3.4100 6.4100 6.4100 3.4100 6.4100 %! 6.4100 6.4100 6.4100 3.4100 6.4100 3.4100 6.4100 6.4100 6.4100 6.4100 %! 3.4100 6.4100 6.4100 6.4100 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 %! 3.4100 6.4100 6.4100 6.4100 3.4100 3.4100 6.4100 6.4100 6.4100 6.4100 %! 3.4100 6.4100 6.4100 3.4100 3.4100 3.4100 3.4100 6.4100 6.4100 6.4100 ](:); %! %! %! DAT = iddata (Y, U); %! %! [SYS, X0, INFO] = moen4 (DAT, "s", 15, "rcond", 0.0, "tol", -1.0, "confirm", false); %! %! Ae = [ 0.8924 0.3887 0.1285 0.1716 %! -0.0837 0.6186 -0.6273 -0.4582 %! 0.0052 0.1307 0.6685 -0.6755 %! 0.0055 0.0734 -0.2148 0.4788 ]; %! %! Ce = [ -0.4442 0.6663 0.3961 0.4102 ]; %! %! Be = [ -0.2142 %! -0.1968 %! 0.0525 %! 0.0361 ]; %! %! De = [ -0.0041 ]; %! %! Ke = [ -1.9513 %! -0.1867 %! 0.6348 %! -0.3486 ]; %! %! Qe = [ 0.0052 0.0005 -0.0017 0.0009 %! 0.0005 0.0000 -0.0002 0.0001 %! -0.0017 -0.0002 0.0006 -0.0003 %! 0.0009 0.0001 -0.0003 0.0002 ]; %! %! Rye = [ 0.0012 ]; %! %! Se = [ -0.0025 %! -0.0002 %! 0.0008 %! -0.0005 ]; %! %! X0e = [ -11.496422 %! -0.718576 %! -0.014211 %! 0.500073 ]; # X0e is not from SLICOT %! %! ## The SLICOT test for IB01CD uses COMUSE=C, not COMUSE=U. %! ## This means that they don't use the matrices B and D %! ## computed by IB01BD. They use only A and C from IB01BD, %! ## while B and D are from SLICOT routine IB01CD. %! ## Therefore they get slightly different matrices B and D %! ## and finally a different initial state vector X0. %! %!assert (SYS.A, Ae, 1e-4); %!assert (SYS.B, Be, 1e-4); %!assert (SYS.C, Ce, 1e-4); %!assert (SYS.D, De, 1e-4); %!assert (INFO.K, Ke, 1e-4); %!assert (INFO.Q, Qe, 1e-4); %!assert (INFO.Ry, Rye, 1e-4); %!assert (INFO.S, Se, 1e-4); %!assert (X0, X0e, 1e-4); ## [96-003] Data of a 120 MW power plant (Pont-sur-Sambre, France) %!shared SYS, Ae, Be, Ce, De %! U = [ -811 -592 421 -680 -681 %! -812 -619 477 -685 -651 %! -817 -565 538 -678 -677 %! -695 -725 536 -674 -702 %! -697 -571 531 -676 -685 %! -697 -618 533 -681 -721 %! -702 -579 549 -677 -699 %! -703 -487 575 -677 -694 %! -705 -449 561 -679 -678 %! -705 -431 563 -680 -692 %! -707 -502 561 -679 -686 %! -707 -583 530 -676 -751 %! -710 -458 540 -677 -700 %! -713 -469 543 -679 -731 %! -715 -506 549 -684 -635 %! -713 -590 532 -681 -715 %! -714 -582 528 -676 -696 %! -713 -575 538 -679 -690 %! -716 -382 557 -682 -701 %! -716 -476 558 -679 -690 %! -718 -425 565 -678 -686 %! -719 -409 562 -679 -615 %! -719 -508 523 -677 -737 %! -721 -569 523 -679 -722 %! -723 -434 542 -681 -735 %! -723 -395 544 -676 -704 %! -723 -428 542 -677 -729 %! -722 -402 537 -677 -706 %! -725 -380 534 -681 -696 %! -726 -324 549 -676 -701 %! -726 -211 578 -675 -614 %! -727 -113 569 -677 -738 %! -727 -208 554 -676 -737 %! -727 -320 523 -684 -697 %! -727 944 605 -680 -587 %! -729 396 654 -681 -708 %! -729 754 637 -682 -685 %! -727 419 522 -677 -715 %! -729 378 494 -668 -703 %! -728 363 493 -669 -682 %! -729 390 496 -665 -713 %! -729 106 483 -664 -711 %! -729 32 495 -661 -718 %! -729 517 585 -661 -641 %! -729 455 625 -659 -703 %! -730 521 649 -687 -669 %! -730 540 627 -689 -705 %! -731 514 605 -694 -682 %! -585 525 558 -685 -611 %! -586 534 520 -680 -668 %! -586 539 531 -681 -679 %! -585 519 507 -682 -663 %! -588 513 505 -667 -668 %! -587 509 539 -680 -616 %! -587 512 535 -668 -628 %! -588 514 557 -667 -648 %! -588 553 563 -676 -613 %! -589 519 559 -684 -638 %! -589 521 563 -682 -652 %! -588 518 547 -678 -597 %! -589 552 549 -688 -630 %! -589 520 535 -685 -623 %! -589 547 542 -678 -619 %! -589 549 531 -684 -524 %! -588 544 522 -1540 -580 %! -588 564 555 -1538 -584 %! -588 684 545 -1541 -564 %! -590 558 546 -1541 -609 %! -589 552 537 -1550 -601 %! -591 532 526 -1548 -580 %! -590 544 524 -1542 -565 %! -591 559 535 -1538 -604 %! -592 555 542 -1548 -629 %! -591 577 532 -1549 -587 %! -593 581 530 -1543 -585 %! -592 562 540 -1548 -583 %! -591 568 546 -1536 -587 %! -593 550 557 -1533 -569 %! -592 550 537 -1518 -527 %! -593 568 551 -1533 -582 %! -590 528 540 -1529 -492 %! -590 542 532 -1525 -585 %! -590 556 535 -1522 -606 %! -591 637 535 -1516 -571 %! -591 608 539 -1512 -582 %! -591 545 527 -1510 -577 %! -591 603 534 -1507 -548 %! -592 567 521 -1507 -539 %! -594 560 530 -1503 -583 %! -422 549 534 -1487 -542 %! 5 619 550 -1488 -609 %! 5 572 541 -1487 -545 %! 185 564 529 -1488 -528 %! 185 571 531 -1497 -512 %! 187 590 545 -1489 -472 %! 186 658 544 -1485 -501 %! 185 639 553 -1486 -512 %! 187 604 532 -1486 -490 %! 186 584 535 -1486 -505 %! 187 572 541 -1488 -479 %! 186 570 531 -1486 -477 %! 187 579 539 -1488 -482 %! 187 694 537 -1487 -512 %! 187 727 546 -1494 -474 %! 186 838 545 -1493 -470 %! 186 703 527 -1492 -510 %! 185 634 502 -1490 -486 %! 185 659 502 -1490 -446 %! 185 569 483 -1488 -472 %! 184 552 494 -1487 -468 %! 183 541 492 -1487 -411 %! 184 544 519 -1486 -471 %! 184 577 538 -1487 -420 %! 183 536 546 -1490 -455 %! 183 586 567 -1487 -421 %! 183 554 566 -1485 -449 %! 183 564 558 -1486 -455 %! 182 558 546 -1486 -426 %! 183 659 543 -1486 -398 %! 182 545 531 -1487 -425 %! 182 542 513 -1487 -297 %! 181 549 502 -1486 -407 %! 180 558 963 -1487 -391 %! 182 546 1105 -1487 -388 %! 179 540 1166 -1487 -387 %! 181 519 1221 -1487 -390 %! 179 510 1254 -1486 -382 %! 176 528 1289 -1487 -379 %! 178 510 1310 -1486 -389 %! 178 504 1313 -1484 -357 %! 178 507 1328 -1484 -383 %! 178 519 1333 -1489 -426 %! 183 509 1317 -1483 -377 %! 177 585 1331 -1483 -352 %! 176 765 1334 -1484 -375 %! 196 689 1328 -1484 -381 %! 178 570 1306 -1486 -398 %! 176 997 1338 -1483 -360 %! 176 839 1318 -1487 -366 %! 176 879 1324 -90 -394 %! 175 763 1302 -92 -436 %! 175 739 1307 -92 -430 %! 176 791 1336 -86 -446 %! 175 774 1301 -91 -405 %! 174 782 1304 -91 -414 %! 189 722 1335 -92 -360 %! 173 871 1341 -91 -417 %! 173 825 1337 -86 -383 %! 193 836 1332 -86 -449 %! 174 832 1325 -87 -432 %! 175 834 1326 -88 -383 %! 176 899 1332 -86 -341 %! 195 827 1296 -84 -371 %! 174 897 1311 -86 -366 %! 195 848 1320 -86 -416 %! 192 777 1286 -83 126 %! 171 788 1309 -84 153 %! 171 810 1307 -84 173 %! 174 758 1297 -85 182 %! 188 910 1329 -1036 236 %! 189 944 1344 -1669 245 %! 196 859 1330 -1668 249 %! 190 797 1320 -1669 231 %! 191 784 1341 -1665 248 %! 184 737 1335 -1656 240 %! 182 733 1342 -1655 245 %! 182 696 1350 -1653 253 %! 185 614 1341 -1658 236 %! 188 708 1370 -1654 238 %! 191 729 1366 -1655 237 %! 183 714 1380 -1651 262 %! 186 695 1378 -1651 257 %! 189 758 1387 -1649 276 %! 164 572 1364 -1649 257 %! 163 587 1343 -1650 246 %! 161 683 1353 -1658 261 %! 160 572 1359 -1654 261 %! 160 607 1355 -1651 267 %! 158 580 1349 -1655 273 %! 161 631 1362 -1652 272 %! 160 706 1382 -1657 298 %! 161 601 1356 -1654 277 %! 159 570 1354 -1653 274 %! 158 547 1347 -1657 261 %! 158 582 1332 -1657 257 %! 157 570 1340 -1657 267 %! 154 556 1343 -1657 268 %! 157 537 1345 -1657 -425 %! 158 555 1331 -1653 -581 %! 158 551 1315 -1654 -643 %! 159 590 1322 -1656 -687 %! 160 566 1315 -1657 -737 %! 160 553 1315 -1653 -767 %! 161 644 1327 -1396 -731 %! 159 640 1335 -577 -639 %! 161 726 1334 -577 -730 %! 175 729 1310 -573 -711 %! 175 854 1330 -576 -690 %! 161 729 1313 -573 -636 %! 176 706 1314 -583 -745 ]; %! %! %! Y = [ 117 129 -47 %! 113 141 -42 %! 83 150 -37 %! 144 174 -3 %! 156 196 19 %! 174 192 6 %! 171 193 3 %! 169 224 14 %! 155 211 14 %! 137 175 4 %! 130 165 13 %! 145 172 21 %! 128 173 30 %! 119 194 30 %! 127 188 11 %! 147 176 5 %! 162 183 19 %! 173 178 14 %! 131 161 4 %! 112 139 -11 %! 91 133 -10 %! 75 127 -7 %! 80 115 -10 %! 87 132 6 %! 51 151 6 %! 28 167 3 %! 22 167 -3 %! 9 171 4 %! 7 158 6 %! -11 155 5 %! -87 149 -8 %! -153 146 -12 %! -184 116 -20 %! -167 118 8 %! -563 78 -4 %! -694 -3 -155 %! -1000 -39 -168 %! -1101 -28 -135 %! -1080 55 6 %! -1075 162 89 %! -1035 254 117 %! -894 329 148 %! -747 409 218 %! -774 416 231 %! -781 361 189 %! -825 288 171 %! -897 220 166 %! -960 175 169 %! -994 157 196 %! -1009 202 237 %! -1003 267 258 %! -981 326 267 %! -947 361 276 %! -921 369 280 %! -894 369 292 %! -876 359 302 %! -869 356 318 %! -857 334 316 %! -857 336 320 %! -868 331 323 %! -873 316 324 %! -870 301 326 %! -867 294 323 %! -878 293 322 %! -877 300 309 %! -891 317 233 %! -919 308 160 %! -919 296 111 %! -898 304 94 %! -884 336 101 %! -876 344 92 %! -877 347 77 %! -859 354 79 %! -852 368 84 %! -852 362 79 %! -846 337 67 %! -846 322 71 %! -836 325 82 %! -831 330 81 %! -848 332 84 %! -834 334 89 %! -830 314 87 %! -838 322 93 %! -859 313 73 %! -864 317 59 %! -852 318 48 %! -850 313 59 %! -858 327 65 %! -849 332 82 %! -822 332 77 %! -721 377 121 %! -517 492 193 %! -306 596 226 %! -117 683 244 %! 22 716 212 %! 87 684 157 %! 151 642 129 %! 198 599 105 %! 233 549 93 %! 244 512 83 %! 255 487 70 %! 247 453 49 %! 225 437 32 %! 175 410 4 %! 105 386 -12 %! 86 379 -35 %! 101 382 -16 %! 111 412 3 %! 158 451 31 %! 217 486 37 %! 259 504 29 %! 301 503 24 %! 317 495 7 %! 354 472 -3 %! 361 441 -8 %! 368 413 -32 %! 362 381 -34 %! 354 370 -42 %! 310 360 -36 %! 318 369 -36 %! 313 372 -36 %! 298 377 -28 %! 311 341 -34 %! 339 292 -33 %! 362 223 -52 %! 380 161 -73 %! 397 113 -90 %! 402 64 -117 %! 398 30 -136 %! 396 12 -148 %! 390 -22 -189 %! 377 -47 -211 %! 366 -54 -227 %! 331 -52 -240 %! 227 -74 -289 %! 168 -117 -355 %! 149 -104 -357 %! 10 -101 -344 %! -77 -115 -374 %! -116 -88 -330 %! -106 -53 -223 %! -82 -4 -98 %! -99 5 -40 %! -89 22 3 %! -79 34 26 %! -74 34 42 %! -101 28 61 %! -102 28 73 %! -124 22 74 %! -125 19 90 %! -132 9 100 %! -167 8 102 %! -161 7 90 %! -185 19 105 %! -207 29 110 %! -295 24 159 %! -361 17 293 %! -411 12 436 %! -401 48 540 %! -441 86 601 %! -475 118 553 %! -448 146 472 %! -401 172 428 %! -366 197 400 %! -304 231 391 %! -252 253 387 %! -183 261 399 %! -123 255 405 %! -107 247 397 %! -76 228 392 %! -71 205 389 %! -66 192 381 %! -92 171 371 %! -40 178 356 %! -15 185 353 %! -27 170 359 %! 15 173 351 %! 23 175 356 %! 44 178 338 %! 47 171 323 %! 4 153 294 %! 23 141 295 %! 39 141 306 %! 52 139 313 %! 53 142 313 %! 69 142 312 %! 74 136 306 %! 196 164 277 %! 347 208 133 %! 461 230 -58 %! 526 204 -251 %! 581 161 -385 %! 588 119 -458 %! 549 63 -528 %! 497 5 -550 %! 420 -20 -498 %! 327 -49 -464 %! 198 -78 -438 %! 154 -80 -409 %! 130 -60 -377 ]; %! %! DAT = iddata (Y, U, 1228.8); %! %! [SYS, X0] = moen4 (DAT, "s", 10, "n", 8, "rcond", 0.0, "tol", -1.0); %! %! Ae = [ 0.9811 0.0574 0.3270 0.0003 0.0358 0.0403 -0.1366 0.0276 %! 0.1043 0.7634 -0.1308 0.2252 0.0203 -0.0117 -0.2328 -0.2516 %! -0.0612 0.1437 0.8378 -0.2400 0.0367 -0.3205 -0.0367 -0.0978 %! -0.0213 0.0149 0.0706 0.8902 0.2415 -0.1329 0.3080 -0.0143 %! -0.0076 0.0680 0.0557 -0.0469 0.7084 0.2852 0.2565 0.1508 %! -0.0016 0.0603 0.0071 -0.0448 -0.0870 0.8608 0.1495 -0.1148 %! 0.0046 0.0120 0.0040 -0.0272 0.0117 -0.0654 0.8348 -0.4557 %! -0.0058 0.0133 -0.0112 -0.0171 -0.0353 -0.0892 0.3328 0.7650 ]; %! %! Ce = [ -0.1635 0.6294 0.1157 -0.2129 0.0812 -0.0238 0.0745 0.2027 %! 0.1775 0.1736 -0.2839 -0.0750 -0.4986 -0.1254 0.3740 0.1598 %! 0.2012 -0.0045 -0.4447 -0.3289 0.4767 -0.3377 0.0200 -0.0978 ]; %! %! Be = [ -0.0436 0.1911 -0.1345 0.0409 0.2828 %! 0.5541 -0.4223 0.0001 -0.0151 -0.1778 %! -0.3644 0.2868 0.0754 -0.0457 -0.1691 %! -0.0372 0.1270 -0.0772 -0.0714 -0.0255 %! -0.1251 -0.0021 0.1094 0.0576 0.2121 %! -0.1372 0.1139 0.0030 0.0141 0.0493 %! -0.0187 0.0712 -0.0042 0.0075 -0.0221 %! -0.0834 0.0509 0.0322 -0.0089 0.0009 ]; %! %! De = [ 0.1581 -0.3111 -0.0350 0.0179 -0.1403 %! -0.0037 -0.0461 -0.1177 0.0092 -0.0242 %! 0.0476 -0.0237 -0.0159 0.0174 0.0464 ]; %! %!assert (abs (SYS.A), abs (Ae), 1e-4); %!assert (abs (SYS.B), abs (Be), 1e-4); %!assert (abs (SYS.C), abs (Ce), 1e-4); %!assert (abs (SYS.D), abs (De), 1e-4); ## [96-007] Data of a CD-player arm %!shared SYS, Ae, Be, Ce, De %! UY = [ 0.0531 -0.0313 0.0495 0.0342 %! 0.0526 -0.0328 0.0525 0.0342 %! 0.0504 -0.0482 0.0485 0.0567 %! 0.0423 -0.1048 0.0285 0.1542 %! 0.0269 -0.1515 0.0555 0.1192 %! 0.0072 -0.1404 0.0635 0.2067 %! -0.0091 -0.0936 0.1885 -0.0558 %! -0.0272 -0.0770 0.1145 0.2292 %! -0.0602 -0.0720 0.0985 0.2767 %! -0.0962 -0.1012 0.2485 -0.0733 %! -0.1266 -0.2732 0.2705 0.3017 %! -0.1548 -0.4999 0.3675 0.2567 %! -0.1831 -0.6836 0.3665 0.3492 %! -0.2225 -0.8477 0.3145 0.7492 %! -0.2638 -0.9533 0.4615 0.4067 %! -0.2865 -0.9926 0.5025 0.4917 %! -0.2877 -0.9519 0.5355 0.5942 %! -0.2652 -0.8100 0.5835 0.2917 %! -0.2229 -0.6546 0.4355 0.4417 %! -0.1690 -0.4802 0.3175 0.2667 %! -0.1022 -0.3147 0.2265 0.1067 %! -0.0262 -0.2181 0.1655 0.1717 %! 0.0508 -0.1214 0.1295 0.0167 %! 0.1181 0.0027 -0.0375 0.0642 %! 0.1639 0.1290 -0.2015 0.0767 %! 0.1915 0.2491 -0.2445 -0.0933 %! 0.2141 0.3501 -0.2085 -0.1833 %! 0.2383 0.4384 -0.2055 -0.2083 %! 0.2591 0.5325 -0.2915 -0.1533 %! 0.2720 0.6505 -0.3725 -0.2108 %! 0.2855 0.7959 -0.3975 -0.4083 %! 0.3036 0.9837 -0.4585 -0.4258 %! 0.3180 1.2078 -0.5175 -0.4108 %! 0.3278 1.4001 -0.4415 -0.6958 %! 0.3333 1.5244 -0.4445 -0.7183 %! 0.3201 1.6123 -0.6065 -0.4658 %! 0.2920 1.6983 -0.5645 -0.8133 %! 0.2720 1.7388 -0.3875 -1.0058 %! 0.2556 1.6854 -0.3775 -0.6208 %! 0.2279 1.5986 -0.4115 -0.6783 %! 0.1954 1.4945 -0.4215 -0.7808 %! 0.1667 1.3238 -0.3475 -0.6483 %! 0.1384 1.0917 -0.2985 -0.5033 %! 0.1039 0.8539 -0.2995 -0.3083 %! 0.0697 0.6475 -0.1155 -0.4483 %! 0.0391 0.4233 -0.0315 -0.2033 %! 0.0027 0.2235 -0.0775 0.0317 %! -0.0330 0.0966 0.0155 -0.2458 %! -0.0606 -0.0817 0.1125 0.0542 %! -0.0827 -0.3000 0.2685 0.1242 %! -0.0939 -0.4675 0.2865 0.0642 %! -0.0950 -0.5866 0.1685 0.3717 %! -0.0840 -0.6702 0.2735 0.1017 %! -0.0611 -0.7676 0.2505 0.2867 %! -0.0432 -0.7891 0.1245 0.5342 %! -0.0289 -0.6736 0.1945 0.0842 %! -0.0126 -0.5516 0.1885 0.2392 %! 0.0003 -0.4055 0.1795 0.1967 %! 0.0159 -0.2097 0.1605 -0.1208 %! 0.0348 -0.0408 0.0925 0.0217 %! 0.0506 0.1208 0.1395 -0.1408 %! 0.0627 0.3078 0.0795 -0.2183 %! 0.0723 0.4773 0.0175 -0.3158 %! 0.0792 0.5095 0.0215 -0.3533 %! 0.0752 0.4314 0.0085 -0.1533 %! 0.0590 0.4053 0.0425 -0.2683 %! 0.0378 0.4174 0.0245 -0.2658 %! 0.0103 0.4410 0.0295 -0.1783 %! -0.0258 0.4940 0.0905 -0.2633 %! -0.0652 0.4837 0.1385 -0.2758 %! -0.1035 0.3611 0.1805 -0.2258 %! -0.1429 0.1376 0.2035 -0.0383 %! -0.1847 -0.2251 0.3095 0.0167 %! -0.2340 -0.7017 0.3245 0.3692 %! -0.3036 -1.1050 0.3355 0.7517 %! -0.3827 -1.3696 0.5995 0.4917 %! -0.4557 -1.6423 0.7655 0.7017 %! -0.5309 -1.9082 0.7975 1.1367 %! -0.6018 -2.0464 0.9805 0.8317 %! -0.6458 -2.0844 1.1445 0.7692 %! -0.6613 -2.0949 1.2125 0.9217 %! -0.6589 -2.0794 1.1595 0.9317 %! -0.6399 -1.9906 1.1525 0.7942 %! -0.6009 -1.8632 1.1895 0.6867 %! -0.5490 -1.7523 1.0765 0.7617 %! -0.4912 -1.6356 0.9615 0.6342 %! -0.4272 -1.5132 0.8845 0.5817 %! -0.3567 -1.3945 0.8295 0.5517 %! -0.2766 -1.3215 0.7085 0.4392 %! -0.1868 -1.3317 0.5175 0.4792 %! -0.0971 -1.3609 0.3765 0.5317 %! -0.0192 -1.3473 0.2125 0.6367 %! 0.0466 -1.2796 0.0715 0.5192 %! 0.1089 -1.2096 -0.0385 0.4117 %! 0.1644 -1.1582 -0.1425 0.5742 %! 0.2056 -1.0522 -0.2015 0.4542 %! 0.2331 -0.9216 -0.3305 0.3817 %! 0.2478 -0.8330 -0.4485 0.4142 %! 0.2518 -0.7613 -0.4545 0.3017 %! 0.2470 -0.7081 -0.4315 0.2892 %! 0.2276 -0.6960 -0.4605 0.3442 %! 0.1865 -0.7076 -0.5155 0.3692 %! 0.1253 -0.7396 -0.4485 0.3242 %! 0.0472 -0.8146 -0.3375 0.4292 %! -0.0473 -0.8961 -0.2235 0.4967 %! -0.1521 -0.9436 -0.0515 0.4692 %! -0.2577 -0.9516 0.1265 0.5667 %! -0.3484 -0.8765 0.3575 0.3617 %! -0.4103 -0.7632 0.4915 0.2542 %! -0.4523 -0.6816 0.4825 0.4667 %! -0.4835 -0.5694 0.5725 0.2892 %! -0.4953 -0.4093 0.6665 0.1417 %! -0.4786 -0.2418 0.7055 0.0917 %! -0.4345 -0.0829 0.6615 0.0192 %! -0.3719 0.0565 0.5455 0.0617 %! -0.2949 0.2073 0.4655 -0.0808 %! -0.2016 0.3566 0.3255 -0.1433 %! -0.0946 0.3950 0.1765 -0.1383 %! 0.0180 0.2803 0.0325 -0.1083 %! 0.1239 0.1148 -0.1245 0.0392 %! 0.2137 -0.0357 -0.2785 0.0642 %! 0.2851 -0.1776 -0.4545 0.1267 %! 0.3386 -0.2838 -0.5135 0.1392 %! 0.3724 -0.3703 -0.5395 0.1992 %! 0.3804 -0.4262 -0.5995 0.2692 %! 0.3606 -0.3882 -0.6205 0.1717 %! 0.3143 -0.2657 -0.6005 0.1667 %! 0.2456 -0.0453 -0.4925 0.0092 %! 0.1633 0.2726 -0.3835 -0.1683 %! 0.0757 0.6140 -0.2705 -0.3183 %! -0.0088 0.8954 -0.1175 -0.5333 %! -0.0827 1.0590 -0.0395 -0.5358 %! -0.1377 1.1857 0.0545 -0.7408 %! -0.1707 1.3715 0.0725 -0.7933 %! -0.1911 1.5865 0.0695 -0.7758 %! -0.2027 1.7486 0.1445 -0.9933 %! -0.2042 1.8322 0.1265 -0.8733 %! -0.1901 1.9362 0.2065 -1.0933 %! -0.1550 2.0756 0.2185 -1.2008 %! -0.1150 2.2175 0.0835 -0.9258 %! -0.0782 2.4161 0.1225 -1.3158 %! -0.0382 2.5968 0.0995 -1.3508 %! 0.0009 2.6974 0.0685 -1.2508 %! 0.0392 2.7343 0.0955 -1.4683 %! 0.0755 2.6634 0.0165 -1.2133 %! 0.1076 2.5477 0.0225 -1.2458 %! 0.1431 2.4412 -0.0305 -1.2558 %! 0.1844 2.3062 -0.1165 -1.0908 %! 0.2260 2.1947 -0.1755 -1.1083 %! 0.2587 2.1622 -0.2835 -0.9508 %! 0.2798 2.1829 -0.3055 -1.0508 %! 0.2967 2.2071 -0.3375 -1.1083 %! 0.3114 2.2195 -0.3515 -1.0408 %! 0.3235 2.2042 -0.3295 -1.1133 %! 0.3315 2.0932 -0.3775 -0.9583 %! 0.3365 1.8795 -0.3815 -0.9233 %! 0.3446 1.6517 -0.4025 -0.8583 %! 0.3561 1.4464 -0.4285 -0.7183 %! 0.3619 1.2298 -0.4995 -0.5708 %! 0.3524 1.0610 -0.6035 -0.3683 %! 0.3355 0.9913 -0.5375 -0.5383 %! 0.3266 0.9109 -0.4835 -0.5358 %! 0.3218 0.7731 -0.5415 -0.2683 %! 0.3110 0.6149 -0.5715 -0.2408 %! 0.2969 0.4368 -0.5525 -0.1883 %! 0.2860 0.2525 -0.4825 -0.1483 %! 0.2740 0.0546 -0.5115 0.0767 %! 0.2521 -0.1300 -0.5075 0.2217 %! 0.2261 -0.2571 -0.3805 0.1317 %! 0.2065 -0.3238 -0.3155 0.1867 %! 0.1931 -0.2987 -0.3305 0.1942 %! 0.1808 -0.2329 -0.3565 0.2092 %! 0.1728 -0.2060 -0.2655 0.1117 %! 0.1778 -0.1696 -0.1935 0.0042 %! 0.1933 -0.0814 -0.2805 0.1292 %! 0.2136 0.0401 -0.3195 0.0017 %! 0.2433 0.1480 -0.3015 -0.1308 %! 0.2830 0.1864 -0.3395 -0.1183 %! 0.3231 0.1801 -0.5095 -0.0508 %! 0.3548 0.1985 -0.6255 -0.0283 %! 0.3828 0.2212 -0.5505 -0.2358 %! 0.4071 0.2130 -0.6185 -0.0833 %! 0.4161 0.2078 -0.7505 -0.0233 %! 0.4070 0.1729 -0.7735 -0.1208 %! 0.3820 0.0580 -0.7255 0.0892 %! 0.3472 -0.1245 -0.6195 0.0492 %! 0.3091 -0.3883 -0.6545 0.2617 %! 0.2664 -0.6903 -0.6355 0.5492 %! 0.2262 -1.0013 -0.4655 0.4792 %! 0.1930 -1.3467 -0.4925 0.8692 %! 0.1636 -1.6417 -0.5175 0.9717 %! 0.1427 -1.8525 -0.4415 0.9067 %! 0.1266 -2.0179 -0.4015 1.2292 %! 0.1118 -2.1203 -0.3485 1.0842 %! 0.1018 -2.1909 -0.3845 1.0817 %! 0.0912 -2.2222 -0.3635 1.2492 %! 0.0774 -2.1564 -0.2115 0.9892 %! 0.0614 -2.0300 -0.1995 1.0467 %! 0.0438 -1.8759 -0.1595 0.9517 %! 0.0385 -1.7096 0.0155 0.5367 %! 0.0457 -1.5773 0.0455 0.6742 %! 0.0461 -1.4479 -0.0415 0.7242 %! 0.0371 -1.2867 -0.0325 0.3842 %! 0.0259 -1.1849 0.0445 0.4142 %! 0.0133 -1.1751 0.1485 0.4092 %! -0.0023 -1.1735 0.1255 0.3992 %! -0.0234 -1.1757 0.0705 0.5492 %! -0.0427 -1.2288 0.1825 0.3642 %! -0.0546 -1.3379 0.1545 0.5367 %! -0.0693 -1.4457 0.0385 0.8092 %! -0.0862 -1.4768 0.0965 0.6067 %! -0.0960 -1.4632 0.1635 0.6542 %! -0.1013 -1.4416 0.1445 0.7117 %! -0.1098 -1.3817 0.0555 0.6417 %! -0.1307 -1.2943 0.0305 0.7067 %! -0.1687 -1.1853 0.1585 0.6017 %! -0.2203 -1.0350 0.2505 0.5317 %! -0.2805 -0.8197 0.3175 0.4542 %! -0.3427 -0.5362 0.4545 0.3067 %! -0.3950 -0.2783 0.6245 0.1217 %! -0.4257 -0.1265 0.6745 -0.0083 %! -0.4347 -0.0352 0.6115 0.0642 %! -0.4273 0.0849 0.6455 -0.0608 %! -0.4080 0.2669 0.6375 -0.0983 %! -0.3808 0.4593 0.5595 -0.1183 %! -0.3378 0.6035 0.5465 -0.4158 %! -0.2776 0.6956 0.4895 -0.3233 %! -0.2139 0.7767 0.4145 -0.2483 %! -0.1485 0.8759 0.3105 -0.5033 %! -0.0798 0.9496 0.1465 -0.4033 %! -0.0138 0.9867 0.1065 -0.4133 %! 0.0481 1.0353 0.0825 -0.5458 %! 0.1014 1.0584 -0.0285 -0.3958 %! 0.1417 1.0195 -0.1245 -0.3508 %! 0.1810 0.9643 -0.1175 -0.5058 %! 0.2304 0.8987 -0.1325 -0.4633 %! 0.2784 0.8223 -0.3155 -0.1833 %! 0.3158 0.7741 -0.4165 -0.3058 %! 0.3477 0.7241 -0.4475 -0.3608 %! 0.3700 0.6195 -0.5515 -0.0458 %! 0.3809 0.5139 -0.5905 -0.1633 %! 0.3896 0.4472 -0.5885 -0.1983 %! 0.3935 0.3697 -0.5985 0.0417 %! 0.3879 0.3296 -0.6335 -0.0308 %! 0.3781 0.3844 -0.6795 -0.1183 %! 0.3661 0.4741 -0.6555 -0.0908 %! 0.3493 0.6039 -0.5805 -0.2358 %! 0.3240 0.7004 -0.5635 -0.2533 %! 0.2858 0.6189 -0.5785 -0.0933 %! 0.2432 0.4427 -0.4435 -0.2383 %! 0.2074 0.2354 -0.3355 -0.1458 %! 0.1672 0.0128 -0.4075 0.2967 %! 0.1183 -0.1060 -0.3275 0.0767 %! 0.0720 -0.1569 -0.2185 0.0792 %! 0.0281 -0.1837 -0.1755 0.2942 %! -0.0110 -0.1465 -0.0965 0.0092 %! -0.0430 -0.1124 -0.1035 0.1892 %! -0.0694 -0.0907 0.0345 0.1267 %! -0.0822 -0.0402 0.1395 -0.0883 %! -0.0840 0.0366 0.0545 0.1267 %! -0.0813 0.1044 0.1125 -0.0758 %! -0.0744 0.0936 0.1615 -0.0783 %! -0.0736 0.0579 0.1215 0.1442 %! -0.0809 0.0546 0.1445 -0.0458 %! -0.0869 0.0402 0.1665 -0.0033 %! -0.0882 0.0025 0.2585 0.0167 %! -0.0891 -0.0893 0.2335 0.0617 %! -0.0989 -0.2016 0.1095 0.2567 %! -0.1157 -0.2898 0.1755 0.1517 %! -0.1279 -0.4203 0.2505 0.2192 %! -0.1321 -0.5523 0.2425 0.2892 %! -0.1353 -0.6380 0.1515 0.3892 %! -0.1451 -0.7266 0.0955 0.5492 %! -0.1517 -0.8032 0.1775 0.3517 %! -0.1402 -0.8444 0.1445 0.4217 %! -0.1103 -0.8473 0.0825 0.4467 %! -0.0677 -0.8711 0.0725 0.3342 %! -0.0286 -0.9469 -0.0805 0.6842 %! 0.0023 -0.9579 -0.1245 0.4242 %! 0.0381 -0.9479 -0.1135 0.2117 %! 0.0664 -0.9993 -0.2065 0.7217 %! 0.0742 -1.0048 -0.1365 0.4642 %! 0.0735 -1.0174 -0.0945 0.2817 %! 0.0619 -1.1243 -0.1855 0.6692 %! 0.0339 -1.2704 -0.1235 0.5067 %! -0.0041 -1.4761 -0.0475 0.6292 %! -0.0512 -1.6788 0.0215 0.8992 %! -0.0973 -1.7716 0.1645 0.6467 %! -0.1341 -1.8061 0.1835 0.7942 %! -0.1695 -1.7935 0.1665 0.9717 %! -0.1988 -1.7171 0.2675 0.6517 %! -0.2107 -1.6368 0.3285 0.6417 %! -0.2119 -1.5489 0.3375 0.7267 %! -0.2123 -1.4181 0.3615 0.5617 %! -0.2172 -1.2714 0.3455 0.5342 %! -0.2319 -1.0671 0.3335 0.4817 %! -0.2558 -0.7123 0.3665 0.2467 %! -0.2838 -0.2669 0.4385 0.0517 %! -0.3123 0.1531 0.5195 -0.1483 %! -0.3390 0.5226 0.5215 -0.3008 %! -0.3576 0.8555 0.4985 -0.4808 %! -0.3583 1.1684 0.5345 -0.7233 %! -0.3436 1.4304 0.5085 -0.6883 %! -0.3233 1.6427 0.4625 -0.7483 %! -0.2932 1.8196 0.4685 -1.0258 %! -0.2534 1.8815 0.3835 -0.8933 %! -0.2164 1.8872 0.2795 -0.7883 %! -0.1816 1.9679 0.2695 -0.9983 %! -0.1423 2.0907 0.2485 -1.0408 %! -0.1081 2.2150 0.1715 -0.9933 %! -0.0923 2.2823 0.0785 -0.9883 %! -0.0926 2.2505 0.0865 -1.0533 %! -0.0974 2.2151 0.1815 -1.1133 %! -0.1033 2.1746 0.2105 -1.0133 %! -0.1130 2.0369 0.1895 -0.9683 %! -0.1261 1.8613 0.1905 -0.8858 %! -0.1377 1.7249 0.2185 -0.8358 %! -0.1403 1.5793 0.2285 -0.8208 %! -0.1310 1.4183 0.2345 -0.7683 %! -0.1180 1.2871 0.2165 -0.6133 %! -0.1102 1.1936 0.1955 -0.5383 %! -0.1015 1.1864 0.2075 -0.7283 %! -0.0886 1.2592 0.1275 -0.5833 %! -0.0749 1.3410 0.1485 -0.5658 %! -0.0470 1.4143 0.2895 -0.9458 %! -0.0031 1.4604 0.1465 -0.6733 %! 0.0402 1.5447 -0.0435 -0.6083 %! 0.0876 1.6959 -0.0645 -1.0383 %! 0.1412 1.7869 -0.1525 -0.8083 %! 0.1883 1.8245 -0.2255 -0.8208 %! 0.2252 1.8679 -0.3275 -0.9933 %! 0.2467 1.9045 -0.4395 -0.8208 %! 0.2469 1.9533 -0.4565 -0.9058 %! 0.2301 1.9731 -0.5135 -0.9308 %! 0.2034 1.9264 -0.4865 -0.9233 %! 0.1679 1.8261 -0.4125 -0.8458 %! 0.1191 1.7087 -0.3975 -0.7083 %! 0.0578 1.6395 -0.3765 -0.7758 %! -0.0120 1.5785 -0.3385 -0.6708 %! -0.0860 1.4653 -0.1925 -0.6008 %! -0.1515 1.3092 0.0135 -0.6958 %! -0.2008 1.0958 0.0985 -0.5583 %! -0.2418 0.8423 0.0795 -0.3258 %! -0.2793 0.5898 0.1115 -0.2908 %! -0.3053 0.3063 0.2445 -0.3208 %! -0.3232 -0.0402 0.2745 0.0467 %! -0.3460 -0.3642 0.2835 0.3317 %! -0.3602 -0.6486 0.4845 0.0767 %! -0.3510 -1.0138 0.5625 0.3067 %! -0.3365 -1.3782 0.4035 0.8092 %! -0.3285 -1.6311 0.3775 0.7192 %! -0.3177 -1.8760 0.4785 0.7742 %! -0.3025 -2.0846 0.5275 1.0067 %! -0.2861 -2.1696 0.4745 1.0042 %! -0.2632 -2.1988 0.4385 0.9742 %! -0.2280 -2.2098 0.4705 0.9567 %! -0.1835 -2.2121 0.3835 1.0492 %! -0.1343 -2.2346 0.2365 1.0167 %! -0.0799 -2.2940 0.2005 0.9267 %! -0.0296 -2.4018 0.1485 1.1567 %! 0.0054 -2.5377 0.0265 1.2892 %! 0.0379 -2.6953 -0.0205 1.1017 %! 0.0850 -2.8762 -0.0155 1.1667 %! 0.1365 -3.0209 -0.1045 1.4792 %! 0.1758 -3.0638 -0.2865 1.4992 %! 0.2069 -3.0199 -0.3975 1.3217 %! 0.2399 -2.9711 -0.3785 1.2517 %! 0.2687 -2.9543 -0.4125 1.3817 %! 0.2813 -2.9447 -0.4615 1.3142 %! 0.2737 -2.9591 -0.4575 1.2217 %! 0.2385 -3.0112 -0.4585 1.4592 %! 0.1778 -3.0317 -0.3535 1.3667 %! 0.1115 -2.9655 -0.1805 1.1367 %! 0.0469 -2.8414 -0.0535 1.2642 %! -0.0254 -2.7009 0.0305 1.2717 %! -0.1049 -2.5296 0.0665 1.1567 %! -0.1749 -2.2903 0.2005 0.8842 %! -0.2261 -2.0294 0.3485 0.7692 %! -0.2709 -1.8409 0.3965 0.9217 %! -0.3160 -1.7059 0.4925 0.6592 %! -0.3553 -1.5587 0.5645 0.5542 %! -0.3887 -1.4311 0.6065 0.6467 %! -0.4132 -1.3691 0.6915 0.4717 %! -0.4202 -1.3607 0.7465 0.4992 %! -0.4079 -1.3743 0.8165 0.5242 %! -0.3790 -1.3781 0.7885 0.4892 %! -0.3393 -1.3442 0.6355 0.5792 %! -0.2925 -1.2459 0.5555 0.4817 %! -0.2378 -1.1148 0.5695 0.3467 %! -0.1856 -0.9931 0.4825 0.4667 %! -0.1486 -0.8185 0.3805 0.3767 %! -0.1216 -0.5874 0.3885 0.0717 %! -0.1015 -0.3821 0.3235 0.1667 %! -0.0898 -0.1778 0.2855 0.0667 %! -0.0712 0.0346 0.3355 -0.2858 %! -0.0379 0.2085 0.3175 -0.2483 %! -0.0027 0.3772 0.2065 -0.2333 %! 0.0236 0.5655 0.0175 -0.3458 %! 0.0438 0.7329 -0.0445 -0.4733 %! 0.0635 0.8253 0.0225 -0.5433 %! 0.0801 0.8649 0.0045 -0.4633 %! 0.0903 0.9308 -0.0115 -0.6133 %! 0.0901 1.0208 -0.0875 -0.5258 %! 0.0744 1.1279 -0.1185 -0.4933 %! 0.0558 1.2299 -0.0115 -0.8233 %! 0.0408 1.2587 -0.0005 -0.6233 %! 0.0191 1.2574 0.0385 -0.5433 %! -0.0063 1.2484 0.0785 -0.7158 %! -0.0255 1.1921 0.0205 -0.5933 %! -0.0336 1.1108 0.0425 -0.6808 %! -0.0357 0.9984 0.0135 -0.4883 %! -0.0415 0.8908 0.0155 -0.3583 %! -0.0416 0.8448 0.0965 -0.6158 %! -0.0291 0.8026 0.0265 -0.4233 %! -0.0135 0.7560 -0.0525 -0.2958 %! 0.0064 0.7406 -0.0195 -0.4958 %! 0.0347 0.7367 -0.0165 -0.4208 %! 0.0633 0.7939 -0.0945 -0.3233 %! 0.0912 0.9579 -0.1195 -0.5658 %! 0.1225 1.1168 -0.1215 -0.6283 %! 0.1480 1.1866 -0.2055 -0.4508 %! 0.1662 1.2186 -0.1875 -0.7083 %! 0.1851 1.2276 -0.2065 -0.7058 %! 0.1996 1.2388 -0.2605 -0.4633 %! 0.2131 1.3063 -0.2195 -0.7858 %! 0.2323 1.3793 -0.3485 -0.6333 %! 0.2558 1.4242 -0.3975 -0.6083 %! 0.2937 1.4094 -0.3555 -0.9133 %! 0.3392 1.2810 -0.5475 -0.4583 %! 0.3757 1.1218 -0.6745 -0.4483 %! 0.4103 0.9746 -0.7225 -0.6508 %! 0.4441 0.8090 -0.8085 -0.2808 %! 0.4710 0.6612 -0.8195 -0.3258 %! 0.4931 0.5291 -0.8975 -0.3208 %! 0.5052 0.4500 -0.9735 -0.1608 %! 0.4969 0.4825 -1.0065 -0.2058 %! 0.4640 0.5571 -1.0395 -0.1783 %! 0.4134 0.6007 -0.9225 -0.3358 %! 0.3525 0.5695 -0.7705 -0.2733 %! 0.2808 0.4708 -0.6625 -0.1683 %! 0.2038 0.3850 -0.5825 -0.2383 %! 0.1330 0.3329 -0.4905 -0.1808 %! 0.0800 0.2964 -0.3315 -0.2783 %! 0.0499 0.2154 -0.2585 -0.2158 %! 0.0356 0.0501 -0.2945 0.0017 %! 0.0345 -0.1225 -0.2425 -0.1633 %! 0.0424 -0.2963 -0.2555 0.0417 %! 0.0454 -0.4329 -0.3185 0.2467 %! 0.0459 -0.4041 -0.2455 -0.0408 %! 0.0501 -0.2796 -0.1785 0.0867 %! 0.0562 -0.1394 -0.1245 0.0392 %! 0.0708 0.0026 -0.1095 -0.2233 %! 0.0921 0.1000 -0.2235 0.0242 %! 0.1173 0.2755 -0.1985 -0.2208 %! 0.1574 0.5562 -0.1505 -0.5558 %! 0.2034 0.7663 -0.3005 -0.3233 %! 0.2345 0.8696 -0.3995 -0.4508 %! 0.2466 0.8681 -0.4305 -0.5183 %! 0.2426 0.8135 -0.4365 -0.4033 %! 0.2294 0.8375 -0.3955 -0.5383 %! 0.2117 0.9195 -0.3865 -0.4633 %! 0.1889 1.0417 -0.3415 -0.5258 %! 0.1615 1.2338 -0.3415 -0.6758 %! 0.1260 1.4168 -0.4065 -0.6508 %! 0.0810 1.5369 -0.3505 -0.7708 %! 0.0342 1.5810 -0.1615 -0.8558 %! -0.0091 1.5314 -0.0225 -0.8083 %! -0.0503 1.4241 -0.0285 -0.7283 %! -0.0876 1.2739 0.0045 -0.7208 %! -0.1141 1.0825 0.0965 -0.7008 %! -0.1308 0.9130 0.1345 -0.5608 %! -0.1446 0.7945 0.1385 -0.5108 %! -0.1608 0.7183 0.1425 -0.4833 %! -0.1846 0.7185 0.1855 -0.4508 %! -0.2169 0.7908 0.2355 -0.5133 %! -0.2502 0.8577 0.2985 -0.5833 %! -0.2747 0.8571 0.4505 -0.6633 %! -0.2911 0.7965 0.5145 -0.5358 %! -0.3055 0.7070 0.5125 -0.5008 %! -0.3153 0.5460 0.5205 -0.5583 %! -0.3242 0.2987 0.4875 -0.2383 %! -0.3392 0.0706 0.5795 -0.1583 %! -0.3528 -0.0710 0.6875 -0.2433 %! -0.3649 -0.1759 0.6485 0.0217 %! -0.3827 -0.3188 0.6335 0.1142 %! -0.3987 -0.5033 0.7005 0.0142 %! -0.4061 -0.6932 0.7185 0.2192 %! -0.4107 -0.8736 0.7015 0.4317 %! -0.4089 -1.0089 0.7395 0.3192 %! -0.3942 -1.1045 0.7075 0.4167 %! -0.3738 -1.2074 0.5835 0.6192 %! -0.3490 -1.3199 0.5075 0.5067 %! -0.3125 -1.4543 0.4785 0.5492 %! -0.2685 -1.5904 0.4425 0.6667 %! -0.2324 -1.6779 0.2805 0.7667 %! -0.2177 -1.7222 0.1215 0.8817 %! -0.2177 -1.7124 0.2035 0.6517 %! -0.2191 -1.6440 0.2945 0.6017 %! -0.2262 -1.5442 0.2725 0.7342 %! -0.2446 -1.4283 0.2725 0.5967 %! -0.2675 -1.3620 0.3145 0.5392 %! -0.2852 -1.3847 0.3815 0.5242 %! -0.2915 -1.4221 0.3885 0.5442 %! -0.2859 -1.4241 0.3955 0.6142 %! -0.2662 -1.4117 0.4345 0.5817 %! -0.2261 -1.4121 0.3795 0.5092 %! -0.1681 -1.4674 0.1875 0.5967 %! -0.1067 -1.5856 0.0025 0.7967 %! -0.0484 -1.7123 0.0105 0.7017 %! 0.0055 -1.8149 -0.0275 0.7892 %! 0.0441 -1.8852 -0.1755 1.0267 %! 0.0662 -1.9856 -0.1775 0.8417 %! 0.0769 -2.2193 -0.1235 1.0092 %! 0.0690 -2.4788 -0.1095 1.2917 %! 0.0433 -2.5547 -0.1075 1.1892 %! 0.0121 -2.4502 -0.0515 1.1292 %! -0.0163 -2.3174 0.0695 1.0167 %! -0.0431 -2.2535 0.0355 1.0567 %! -0.0690 -2.2237 -0.0085 1.0267 %! -0.0830 -2.1826 0.0905 0.8217 %! -0.0802 -2.1610 0.1245 0.9717 %! -0.0644 -2.1314 0.0895 0.8942 %! -0.0389 -2.0083 -0.0235 0.7767 %! -0.0144 -1.7807 -0.0925 0.8117 %! 0.0039 -1.5045 -0.0555 0.5167 %! 0.0181 -1.2185 -0.0975 0.3967 %! 0.0257 -0.9135 -0.1055 0.2917 %! 0.0253 -0.5901 -0.0405 0.0192 %! 0.0119 -0.2804 -0.0405 -0.0208 %! -0.0223 0.0284 -0.0525 -0.1183 %! -0.0722 0.3668 0.0375 -0.3658 %! -0.1248 0.6931 0.2185 -0.5433 %! -0.1762 0.9826 0.3255 -0.5983 %! -0.2279 1.2387 0.3505 -0.7408 %! -0.2801 1.4081 0.3595 -0.7783 %! -0.3313 1.4824 0.4385 -0.7633 %! -0.3714 1.4586 0.5705 -0.8483 %! -0.3940 1.3294 0.5915 -0.6908 %! -0.4058 1.2356 0.5915 -0.5733 %! -0.4124 1.2560 0.5965 -0.6108 %! -0.4123 1.3012 0.5405 -0.5908 %! -0.3988 1.2608 0.5535 -0.6983 %! -0.3752 1.0714 0.5255 -0.4733 %! -0.3563 0.8491 0.5215 -0.2658 %! -0.3428 0.6776 0.5805 -0.4083 %! -0.3337 0.4690 0.4925 -0.1158 %! -0.3337 0.2571 0.5005 0.0117 %! -0.3316 0.0998 0.6345 -0.1208 %! -0.3140 -0.0275 0.7025 -0.0458 %! -0.2848 -0.1338 0.6455 0.0317 %! -0.2575 -0.2528 0.4625 0.1967 %! -0.2342 -0.3685 0.4365 0.0917 %! -0.2083 -0.4770 0.4665 0.0767 %! -0.1875 -0.6038 0.3695 0.3942 %! -0.1767 -0.6891 0.3645 0.2767 %! -0.1647 -0.7274 0.4225 0.1342 %! -0.1496 -0.7568 0.3685 0.2642 %! -0.1427 -0.8146 0.2315 0.3767 %! -0.1438 -0.9273 0.2285 0.3517 %! -0.1384 -1.0284 0.4105 0.2117 %! -0.1249 -1.1491 0.4185 0.4717 %! -0.1147 -1.3249 0.2665 0.6917 %! -0.0989 -1.4528 0.2795 0.4867 %! -0.0619 -1.5434 0.3525 0.5667 %! -0.0081 -1.6087 0.2615 0.7242 %! 0.0507 -1.6067 0.0855 0.6692 %! 0.1051 -1.5640 -0.0405 0.7317 %! 0.1482 -1.4225 -0.0795 0.6492 %! 0.1804 -1.1516 -0.1505 0.4267 %! 0.2027 -0.8082 -0.2635 0.3492 %! 0.2135 -0.4165 -0.2375 0.1192 %! 0.2148 -0.0383 -0.1745 -0.1108 %! 0.2076 0.3144 -0.3045 -0.1433 %! 0.2004 0.6244 -0.3415 -0.4108 %! 0.2110 0.7909 -0.2105 -0.6583 %! 0.2361 0.8213 -0.2295 -0.3833 %! 0.2602 0.7620 -0.3495 -0.3533 %! 0.2841 0.6144 -0.4395 -0.4783 %! 0.3056 0.4209 -0.4835 -0.1683 %! 0.3176 0.2084 -0.4535 -0.0783 %! 0.3250 -0.0407 -0.4695 -0.0783 %! 0.3287 -0.3328 -0.5005 0.1792 %! 0.3187 -0.6266 -0.5085 0.4117 %! 0.2961 -0.8894 -0.5195 0.4617 %! 0.2740 -1.0959 -0.4995 0.4492 %! 0.2542 -1.1684 -0.4795 0.6467 %! 0.2321 -1.0800 -0.3895 0.5542 %! 0.2110 -0.8808 -0.3495 0.3067 %! 0.1900 -0.6415 -0.3965 0.3167 %! 0.1682 -0.4753 -0.3005 0.0467 %! 0.1458 -0.4414 -0.2055 0.0917 %! 0.1163 -0.4386 -0.1425 0.2617 %! 0.0891 -0.3733 0.0045 -0.0933 %! 0.0760 -0.3217 0.0415 -0.0408 %! 0.0669 -0.3010 -0.0135 0.1467 %! 0.0560 -0.2167 -0.0305 -0.0708 %! 0.0476 -0.1060 -0.0405 -0.0458 %! 0.0458 -0.0230 0.0035 -0.1208 %! 0.0540 0.0155 -0.0085 -0.1733 %! 0.0668 -0.0147 -0.1005 0.0117 %! 0.0792 -0.0398 -0.1425 -0.0508 %! 0.0933 -0.0347 -0.1735 -0.0508 %! 0.1089 -0.0374 -0.2045 -0.0283 %! 0.1195 -0.0380 -0.2625 0.0292 %! 0.1195 -0.0179 -0.2725 0.0267 %! 0.1110 0.0673 -0.2335 -0.1483 %! 0.0916 0.2159 -0.2865 -0.0383 %! 0.0596 0.3960 -0.2405 -0.1733 %! 0.0267 0.6076 -0.1025 -0.4333 %! -0.0017 0.8519 -0.0395 -0.3883 %! -0.0248 1.1211 0.0015 -0.6533 %! -0.0414 1.3389 -0.0415 -0.6833 %! -0.0505 1.4805 -0.0145 -0.7208 %! -0.0418 1.5473 0.0785 -1.0008 %! -0.0182 1.5086 -0.0465 -0.7158 %! 0.0047 1.4786 -0.1455 -0.6858 %! 0.0286 1.4618 -0.1135 -0.8933 %! 0.0544 1.3645 -0.1525 -0.6733 %! 0.0735 1.2553 -0.1945 -0.6583 %! 0.0804 1.1186 -0.2285 -0.5433 %! 0.0768 0.9336 -0.1345 -0.4483 %! 0.0700 0.7648 -0.0355 -0.4333 %! 0.0642 0.5964 -0.0615 -0.2583 %! 0.0608 0.4208 -0.0495 -0.2258 %! 0.0602 0.2307 -0.0155 -0.0408 %! 0.0659 0.0514 0.0435 -0.0433 %! 0.0820 -0.0945 0.0105 -0.0583 %! 0.0956 -0.2256 -0.1235 0.2667 %! 0.0948 -0.2807 -0.1055 0.1717 %! 0.0868 -0.2945 -0.0515 0.0367 %! 0.0754 -0.3494 -0.0825 0.1942 %! 0.0574 -0.4033 -0.0815 0.1867 %! 0.0357 -0.4587 -0.0115 0.1717 %! 0.0156 -0.5346 0.0505 0.1867 %! -0.0023 -0.6237 0.0135 0.3017 %! -0.0165 -0.7228 0.0525 0.2717 %! -0.0230 -0.7928 0.1605 0.2417 %! -0.0284 -0.8219 0.1615 0.4642 %! -0.0327 -0.8036 0.1625 0.2917 %! -0.0210 -0.7466 0.1915 0.1567 %! 0.0111 -0.7242 0.2005 0.3042 %! 0.0592 -0.7573 0.1465 0.2667 %! 0.1231 -0.7844 -0.0095 0.2467 %! 0.1999 -0.7794 -0.1375 0.2692 %! 0.2804 -0.7513 -0.2825 0.3117 %! 0.3560 -0.6774 -0.4315 0.2467 %! 0.4198 -0.5854 -0.5625 0.2242 %! 0.4650 -0.5277 -0.6685 0.3242 %! 0.4975 -0.4888 -0.6675 0.1642 %! 0.5329 -0.4856 -0.6705 0.0967 %! 0.5714 -0.5286 -0.7535 0.2292 %! 0.5974 -0.5528 -0.8835 0.3717 %! 0.6036 -0.5237 -0.9285 0.3542 %! 0.6018 -0.4513 -0.8545 0.1417 %! 0.5995 -0.3414 -0.8395 0.2067 %! 0.5916 -0.2010 -0.8205 0.1942 %! 0.5754 -0.0626 -0.8065 0.0892 %! 0.5542 0.0470 -0.8155 0.0967 %! 0.5375 0.0963 -0.7775 -0.0808 %! 0.5306 0.0637 -0.8045 0.0367 %! 0.5296 0.0065 -0.7795 0.0492 %! 0.5319 -0.0821 -0.7785 -0.0208 %! 0.5239 -0.2330 -0.9285 0.2767 %! 0.4911 -0.3534 -0.9875 0.2492 %! 0.4368 -0.4041 -0.9135 0.2767 %! 0.3774 -0.4396 -0.6965 0.2317 %! 0.3299 -0.5189 -0.5085 0.1617 %! 0.2946 -0.5876 -0.5285 0.4617 %! 0.2732 -0.5118 -0.4495 0.1917 %! 0.2735 -0.3676 -0.4335 0.1092 %! 0.2897 -0.2488 -0.4875 0.2317 %! 0.3188 -0.1107 -0.4445 -0.0758 %! 0.3580 0.0310 -0.4655 0.0367 %! 0.3999 0.2099 -0.4825 -0.0933 %! 0.4416 0.4537 -0.6305 -0.2708 %! 0.4758 0.6744 -0.8075 -0.1533 %! 0.5033 0.8167 -0.7235 -0.5058 %! 0.5249 0.8812 -0.7385 -0.3783 %! 0.5302 0.9226 -0.8115 -0.2858 %! 0.5213 0.9572 -0.8195 -0.5783 %! 0.4967 0.9528 -0.8725 -0.2483 %! 0.4535 0.9563 -0.7685 -0.3808 %! 0.4022 0.9923 -0.6685 -0.5258 %! 0.3435 1.0462 -0.6205 -0.2433 %! 0.2816 1.1181 -0.4365 -0.5508 %! 0.2276 1.1811 -0.3685 -0.5858 %! 0.1752 1.2622 -0.3765 -0.4508 %! 0.1188 1.4145 -0.3025 -0.6808 %! 0.0624 1.5738 -0.1975 -0.7083 %! 0.0118 1.6516 -0.0645 -0.8358 %! -0.0333 1.6513 -0.0625 -0.8383 %! -0.0826 1.5769 -0.1065 -0.6158 %! -0.1318 1.4702 0.0125 -0.7833 %! -0.1670 1.4121 0.1115 -0.7908 %! -0.1917 1.3594 0.0985 -0.5433 %! -0.2125 1.2994 0.1295 -0.6108 %! -0.2249 1.2767 0.2415 -0.6833 %! -0.2319 1.2354 0.2795 -0.5283 %! -0.2430 1.1914 0.2665 -0.4958 %! -0.2598 1.1599 0.3615 -0.5608 %! -0.2818 1.0552 0.4915 -0.4008 %! -0.3076 0.8983 0.5765 -0.2833 %! -0.3210 0.7477 0.6535 -0.4083 %! -0.3101 0.6146 0.6765 -0.3383 %! -0.2900 0.5163 0.5625 0.0067 %! -0.2723 0.4557 0.4575 -0.0683 %! -0.2465 0.3869 0.4035 -0.2233 %! -0.2099 0.2499 0.3495 0.0092 %! -0.1739 0.1037 0.3055 0.0267 %! -0.1512 0.0119 0.1695 0.1517 %! -0.1484 -0.0519 0.0805 0.2842 %! -0.1510 -0.0699 0.2045 -0.0533 %! -0.1495 -0.0575 0.2485 0.0517 %! -0.1572 -0.0494 0.2205 0.2867 %! -0.1715 -0.0612 0.3355 -0.0658 %! -0.1810 -0.1391 0.3715 0.0442 %! -0.1916 -0.2317 0.3255 0.2367 %! -0.2045 -0.3066 0.3375 0.0842 %! -0.2152 -0.4015 0.3625 0.2167 %! -0.2228 -0.5104 0.4315 0.2292 %! -0.2264 -0.6669 0.3695 0.2817 %! -0.2322 -0.8304 0.2035 0.5217 %! -0.2424 -0.9202 0.2115 0.4992 %! -0.2438 -0.9549 0.3045 0.3742 %! -0.2288 -0.9232 0.2735 0.3792 %! -0.2076 -0.8649 0.1505 0.5142 %! -0.1881 -0.8226 0.1345 0.4142 %! -0.1670 -0.7409 0.1615 0.2617 %! -0.1451 -0.6425 0.1015 0.3617 %! -0.1230 -0.5638 0.1275 0.1917 %! -0.0984 -0.5363 0.2195 0.1492 %! -0.0803 -0.5953 0.1945 0.3917 %! -0.0729 -0.6555 0.1085 0.3267 %! -0.0632 -0.6865 0.1145 0.1717 %! -0.0489 -0.7249 0.1485 0.3442 %! -0.0439 -0.7028 0.0995 0.4717 %! -0.0451 -0.6042 0.0625 0.2117 %! -0.0406 -0.5269 0.0245 0.1367 %! -0.0383 -0.4894 -0.0435 0.3392 %! -0.0485 -0.4438 -0.0455 0.2067 %! -0.0679 -0.4331 -0.0395 0.2042 %! -0.0895 -0.4768 0.0445 0.2217 %! -0.1077 -0.4958 0.1265 0.0817 %! -0.1329 -0.4951 0.0275 0.3717 %! -0.1737 -0.5221 0.0445 0.3217 %! -0.2132 -0.5739 0.2165 0.0742 %! -0.2403 -0.6589 0.2895 0.3267 %! -0.2575 -0.7592 0.3165 0.3442 %! -0.2639 -0.8295 0.2885 0.3417 %! -0.2594 -0.8865 0.2775 0.3992 %! -0.2440 -0.9962 0.2605 0.3367 %! -0.2267 -1.1301 0.0985 0.6167 %! -0.2183 -1.1910 0.0655 0.6417 %! -0.2123 -1.1804 0.1735 0.4192 %! -0.2063 -1.1308 0.1145 0.5367 %! -0.2103 -1.0522 -0.0135 0.6292 %! -0.2177 -0.9723 0.0595 0.3867 %! -0.2085 -0.8974 0.2295 0.2317 %! -0.1816 -0.8520 0.1905 0.4017 %! -0.1471 -0.8541 0.0715 0.3917 %! -0.1048 -0.8622 0.0615 0.2592 %! -0.0576 -0.8463 0.0615 0.3767 %! -0.0136 -0.8192 -0.0185 0.3392 %! 0.0235 -0.7788 -0.1415 0.3292 %! 0.0551 -0.7021 -0.1095 0.2867 %! 0.0856 -0.6467 -0.0675 0.1667 %! 0.1120 -0.6449 -0.2705 0.3217 %! 0.1297 -0.6291 -0.4115 0.2392 %! 0.1433 -0.6098 -0.3755 0.1167 %! 0.1493 -0.5649 -0.4015 0.2967 %! 0.1413 -0.4200 -0.4795 0.1742 %! 0.1251 -0.2349 -0.5045 -0.0333 %! 0.1035 -0.0723 -0.4195 -0.0283 %! 0.0714 0.0871 -0.3485 -0.0533 %! 0.0300 0.2866 -0.3345 -0.1883 %! -0.0115 0.5233 -0.2235 -0.3508 %! -0.0474 0.7916 -0.0725 -0.4258 %! -0.0765 1.1562 -0.0105 -0.6133 %! -0.0981 1.5229 -0.0365 -0.7958 %! -0.1162 1.7436 -0.0585 -0.7983 %! -0.1316 1.8822 0.0025 -0.9008 %! -0.1349 1.9916 0.0605 -1.0358 %! -0.1202 2.0391 0.0065 -1.0233 %! -0.0932 2.0123 -0.0625 -0.9483 %! -0.0609 1.9210 -0.0805 -0.9583 %! -0.0293 1.8059 -0.1785 -0.8458 %! -0.0052 1.7253 -0.2625 -0.7733 %! 0.0091 1.7317 -0.2195 -0.8883 %! 0.0063 1.7910 -0.1925 -0.7333 %! -0.0175 1.8525 -0.1535 -0.7433 %! -0.0460 1.9114 -0.0405 -1.0208 %! -0.0656 1.9435 0.0365 -0.9383 %! -0.0793 1.9967 0.1075 -0.9433 %! -0.0890 2.0655 0.1275 -1.0708 %! -0.0971 2.0547 0.0985 -0.9808 %! -0.1056 1.9936 0.1425 -1.0508 %! -0.1133 1.9289 0.1445 -1.0233 %! -0.1202 1.8841 0.1445 -1.0283 %! -0.1278 1.8653 0.1605 -1.1133 %! -0.1456 1.8273 0.0905 -0.9433 %! -0.1796 1.7730 0.0805 -0.9833 %! -0.2191 1.6584 0.1575 -1.0358 %! -0.2544 1.4743 0.2565 -0.9083 %! -0.2854 1.3089 0.3565 -0.9083 %! -0.3208 1.1494 0.3295 -0.6758 %! -0.3642 0.9927 0.3655 -0.6683 %! -0.4052 0.8263 0.5005 -0.7658 %! -0.4443 0.5780 0.5355 -0.4133 %! -0.4891 0.3103 0.6355 -0.3558 %! -0.5373 0.1107 0.7275 -0.2808 %! -0.5849 0.0334 0.7645 -0.1008 %! -0.6212 0.1017 0.8415 -0.3308 %! -0.6375 0.2141 0.8055 -0.2608 %! -0.6349 0.3187 0.8195 -0.2683 %! -0.6100 0.4173 0.8785 -0.5558 %! -0.5747 0.4404 0.6735 -0.2058 %! -0.5453 0.3679 0.5525 -0.1733 %! -0.5116 0.2496 0.6265 -0.4183 %! -0.4674 0.1314 0.6485 -0.1408 %! -0.4214 0.0316 0.6365 -0.1358 %! -0.3811 -0.0349 0.5035 -0.0783 %! -0.3498 -0.0504 0.4445 0.0092 %! -0.3165 -0.0772 0.5055 -0.2258 %! -0.2736 -0.1911 0.4325 -0.0983 %! -0.2333 -0.3845 0.3495 0.0917 %! -0.2116 -0.6080 0.2855 0.1917 %! -0.2140 -0.7873 0.2095 0.3642 %! -0.2278 -0.9055 0.1795 0.2642 %! -0.2368 -1.0029 0.1665 0.3317 %! -0.2350 -1.0601 0.2255 0.3617 %! -0.2232 -1.0793 0.2145 0.2592 %! -0.2166 -1.0744 -0.0305 0.4942 %! -0.2288 -0.9663 -0.1795 0.4292 %! -0.2482 -0.7630 -0.0595 0.1117 %! -0.2598 -0.5967 0.1215 0.0967 %! -0.2618 -0.4925 0.2025 0.0492 %! -0.2590 -0.4010 0.1605 0.0367 %! -0.2550 -0.3328 0.1185 0.0867 %! -0.2431 -0.2946 0.1605 -0.0808 %! -0.2166 -0.2787 0.1645 -0.0383 %! -0.1817 -0.3122 0.1755 0.1067 %! -0.1408 -0.4076 0.2485 -0.0058 %! -0.0955 -0.5121 0.1335 0.1192 %! -0.0580 -0.5406 -0.0965 0.2292 %! -0.0371 -0.4996 -0.1945 0.1292 %! -0.0357 -0.4631 -0.1495 0.2142 %! -0.0497 -0.4436 -0.0065 0.0717 %! -0.0737 -0.4519 -0.0165 0.0992 %! -0.1119 -0.4687 -0.0865 0.2892 %! -0.1561 -0.4543 0.0375 -0.0208 %! -0.1950 -0.4876 0.1145 0.0817 %! -0.2343 -0.5827 0.1375 0.2967 %! -0.2695 -0.6924 0.2895 0.0017 %! -0.2983 -0.8815 0.3295 0.3067 %! -0.3325 -1.1117 0.3055 0.5492 %! -0.3656 -1.2956 0.3705 0.2967 %! -0.3906 -1.4858 0.4285 0.5417 %! -0.4198 -1.6773 0.4905 0.8242 %! -0.4544 -1.8112 0.5555 0.6917 %! -0.4817 -1.9092 0.5635 0.7317 %! -0.4984 -1.9624 0.5865 0.8517 %! -0.5052 -1.9578 0.6725 0.7392 %! -0.5043 -1.9750 0.6675 0.8467 %! -0.5005 -2.0244 0.6645 0.8942 %! -0.4895 -2.0492 0.7325 0.7292 %! -0.4713 -2.0865 0.6905 0.9517 %! -0.4485 -2.1329 0.7045 0.9417 %! -0.4108 -2.1318 0.7525 0.7467 %! -0.3562 -2.1064 0.6665 0.9792 %! -0.2897 -2.0510 0.5845 0.8717 %! -0.2097 -1.9414 0.4475 0.7142 %! -0.1240 -1.8255 0.2975 0.8092 %! -0.0458 -1.7261 0.1825 0.7217 %! 0.0176 -1.5932 0.0225 0.7017 %! 0.0662 -1.4228 -0.0535 0.5917 %! 0.1049 -1.3030 -0.0845 0.4792 %! 0.1335 -1.2418 -0.1745 0.5192 %! 0.1483 -1.1914 -0.2385 0.4542 %! 0.1466 -1.1992 -0.2885 0.5092 %! 0.1282 -1.2520 -0.2755 0.5542 %! 0.0992 -1.2430 -0.2205 0.5267 %! 0.0699 -1.1510 -0.1345 0.4517 %! 0.0478 -1.0541 -0.0455 0.3867 %! 0.0322 -0.9852 -0.0195 0.4267 %! 0.0207 -0.8964 0.0005 0.2817 %! 0.0094 -0.8166 -0.0155 0.3042 %! -0.0108 -0.7687 0.0055 0.3492 %! -0.0421 -0.6628 0.0855 0.1892 %! -0.0816 -0.5166 0.1335 0.2067 %! -0.1240 -0.4531 0.1985 0.1517 %! -0.1587 -0.4955 0.2175 0.1317 %! -0.1765 -0.5726 0.2375 0.2242 %! -0.1697 -0.6386 0.2575 0.1567 %! -0.1396 -0.6945 0.1815 0.2542 %! -0.0986 -0.7609 0.0965 0.3417 %! -0.0577 -0.8911 0.0185 0.4417 %! -0.0179 -1.0590 0.0145 0.4917 %! 0.0260 -1.1811 0.0785 0.4217 %! 0.0683 -1.2444 0.0305 0.6217 %! 0.0949 -1.1920 -0.0365 0.6392 %! 0.1073 -1.0508 -0.0215 0.4067 %! 0.1155 -0.9975 -0.0025 0.4092 %! 0.1214 -1.0199 0.0115 0.4092 %! 0.1192 -0.9884 0.0035 0.4167 %! 0.1011 -0.8955 -0.0175 0.4642 %! 0.0706 -0.7734 -0.0055 0.3317 %! 0.0435 -0.6574 0.0385 0.1417 %! 0.0254 -0.5681 0.0495 0.1792 %! 0.0072 -0.4466 0.0325 0.2567 %! -0.0080 -0.2535 0.0875 -0.0533 %! -0.0115 -0.0873 0.0575 -0.1208 %! -0.0112 -0.0130 -0.0395 0.0817 %! -0.0089 0.0369 0.0145 -0.1758 %! 0.0030 0.0533 0.0625 -0.1708 %! 0.0194 -0.0025 0.0185 0.0467 %! 0.0374 -0.0338 -0.0445 -0.0783 %! 0.0607 0.0134 -0.0985 -0.0633 %! 0.0869 0.0666 -0.1175 -0.0358 %! 0.1116 0.1083 -0.1945 -0.0683 %! 0.1329 0.1776 -0.2645 -0.0883 %! 0.1515 0.2269 -0.2495 -0.1808 %! 0.1643 0.2195 -0.3015 -0.0533 %! 0.1677 0.2351 -0.3745 -0.0333 %! 0.1713 0.2860 -0.3445 -0.2508 %! 0.1813 0.2769 -0.3195 -0.1283 %! 0.1898 0.1852 -0.3195 -0.0083 %! 0.1937 0.0800 -0.3415 -0.0683 %! 0.1960 0.0125 -0.3745 0.0767 %! 0.2058 -0.0679 -0.2675 -0.0358 %! 0.2313 -0.2067 -0.2205 -0.0433 %! 0.2604 -0.2975 -0.3315 0.2442 %! 0.2806 -0.2723 -0.3645 0.0692 %! 0.2919 -0.2029 -0.3955 0.0117 %! 0.2899 -0.0986 -0.4325 0.0517 %! 0.2731 0.0407 -0.3855 -0.1783 %! 0.2420 0.1252 -0.3585 -0.1008 %! 0.1990 0.1201 -0.2645 -0.1433 %! 0.1551 0.0612 -0.2165 -0.2383 %! 0.1148 -0.0002 -0.2735 -0.0133 %! 0.0804 -0.0214 -0.2015 -0.1033 %! 0.0626 -0.0484 -0.0865 -0.2383 %! 0.0590 -0.1404 -0.1335 0.0367 %! 0.0604 -0.2218 -0.2005 0.0567 %! 0.0731 -0.2085 -0.1645 -0.1383 %! 0.0997 -0.1695 -0.1575 -0.0058 %! 0.1295 -0.1504 -0.2145 0.0242 %! 0.1556 -0.1147 -0.2605 -0.0783 %! 0.1749 -0.1237 -0.2505 0.0192 %! 0.1857 -0.2165 -0.2005 -0.0008 %! 0.1859 -0.2956 -0.2755 0.1167 %! 0.1726 -0.2906 -0.3025 0.1892 %! 0.1556 -0.2457 -0.1625 -0.0583 %! 0.1417 -0.2264 -0.1545 0.0942 %! 0.1269 -0.2038 -0.1905 0.0842 %! 0.1129 -0.1753 -0.1785 -0.0658 %! 0.0992 -0.1663 -0.1525 0.1442 %! 0.0875 -0.1169 -0.0275 -0.1183 %! 0.0790 -0.0582 -0.0545 -0.0283 %! 0.0663 -0.0174 -0.0605 0.0767 %! 0.0562 0.0665 0.0935 -0.3133 %! 0.0531 0.1512 0.0685 -0.1408 %! 0.0461 0.2151 0.0115 -0.1208 %! 0.0374 0.2488 0.0475 -0.3083 %! 0.0370 0.2115 0.1245 -0.2358 %! 0.0492 0.1377 0.1595 -0.3158 %! 0.0650 0.0180 -0.0255 -0.0283 %! 0.0750 -0.1500 -0.0805 0.0317 %! 0.0891 -0.3396 0.0055 -0.0733 %! 0.1133 -0.5416 -0.0395 0.1742 %! 0.1401 -0.7139 -0.1485 0.2417 %! 0.1603 -0.9009 -0.2485 0.4742 %! 0.1780 -1.1065 -0.1815 0.4742 %! 0.2099 -1.2319 -0.1665 0.3667 %! 0.2553 -1.2788 -0.3375 0.6817 %! 0.3076 -1.2666 -0.3695 0.5117 %! 0.3685 -1.2250 -0.3785 0.4217 %! 0.4305 -1.1970 -0.5295 0.5917 %! 0.4856 -1.1524 -0.7095 0.4792 %! 0.5373 -1.1079 -0.7375 0.4042 %! 0.5897 -1.0977 -0.6755 0.3842 %! 0.6362 -1.0851 -0.8095 0.4792 %! 0.6699 -1.0496 -0.9775 0.4067 %! 0.6894 -0.9976 -1.0365 0.3367 %! 0.6901 -0.9060 -1.0275 0.4142 %! 0.6719 -0.7677 -0.9995 0.2142 %! 0.6371 -0.6139 -1.0315 0.2267 %! 0.5849 -0.4463 -0.9335 0.1717 %! 0.5219 -0.2783 -0.7995 0.0167 %! 0.4573 -0.1421 -0.7785 0.0567 %! 0.4020 -0.0451 -0.6615 -0.1833 %! 0.3559 0.0389 -0.5805 -0.0758 %! 0.3050 0.2057 -0.5415 0.0042 %! 0.2521 0.4271 -0.4775 -0.3708 %! 0.2065 0.5643 -0.4755 -0.3033 %! 0.1686 0.6331 -0.3475 -0.3783 %! 0.1358 0.6722 -0.2895 -0.3708 %! 0.1037 0.6797 -0.3195 -0.2408 %! 0.0778 0.6585 -0.2575 -0.4533 %! 0.0624 0.5950 -0.2515 -0.2558 %! 0.0517 0.5407 -0.2285 -0.1908 %! 0.0473 0.5332 -0.1815 -0.3383 %! 0.0465 0.6105 -0.1795 -0.2558 %! 0.0382 0.7590 -0.1585 -0.3383 %! 0.0154 0.8366 -0.1745 -0.3208 %! -0.0179 0.8604 -0.0875 -0.3733 %! -0.0470 0.8872 0.1005 -0.5033 %! -0.0626 0.8752 0.1875 -0.3783 %! -0.0602 0.8813 0.2065 -0.5008 %! -0.0402 0.8863 0.1245 -0.4583 %! -0.0124 0.8391 0.0235 -0.3433 %! 0.0192 0.7919 -0.0165 -0.4783 %! 0.0554 0.7361 -0.0555 -0.3733 %! 0.0929 0.6751 -0.0475 -0.3683 %! 0.1304 0.6184 -0.0965 -0.3933 %! 0.1639 0.5700 -0.2405 -0.2308 %! 0.1967 0.6093 -0.2875 -0.4483 %! 0.2338 0.7093 -0.3125 -0.4933 %! 0.2645 0.8005 -0.3845 -0.3158 %! 0.2869 0.8915 -0.3885 -0.5983 %! 0.3091 0.9385 -0.4365 -0.6158 %! 0.3251 0.9464 -0.5195 -0.4483 %! 0.3311 0.9586 -0.5255 -0.6083 %! 0.3313 0.9269 -0.5245 -0.5558 %! 0.3224 0.8837 -0.5195 -0.4508 %! 0.3000 0.9051 -0.5285 -0.4733 %! 0.2679 0.9557 -0.5235 -0.4883 %! 0.2360 1.0002 -0.4485 -0.6033 %! 0.2076 0.9830 -0.4105 -0.5083 %! 0.1760 0.8692 -0.4285 -0.3633 %! 0.1395 0.7508 -0.4055 -0.3758 %! 0.1052 0.6499 -0.3275 -0.3558 %! 0.0774 0.5699 -0.2655 -0.3033 %! 0.0517 0.6138 -0.2495 -0.3008 %! 0.0213 0.7287 -0.1975 -0.3383 %! -0.0184 0.7977 -0.1255 -0.3633 %! -0.0668 0.8589 -0.0445 -0.4283 %! -0.1192 0.9156 0.0605 -0.5133 %! -0.1747 0.9026 0.1815 -0.4483 %! -0.2323 0.8126 0.3325 -0.4383 %! -0.2839 0.6700 0.4405 -0.4483 %! -0.3233 0.5204 0.4685 -0.3258 %! -0.3485 0.4290 0.5085 -0.3033 %! -0.3550 0.4219 0.5735 -0.3533 %! -0.3426 0.4701 0.5585 -0.3108 %! -0.3172 0.5523 0.4785 -0.3108 %! -0.2791 0.6432 0.4565 -0.4733 %! -0.2315 0.6805 0.4115 -0.4533 %! -0.1894 0.6917 0.2995 -0.3708 %! -0.1591 0.7669 0.2685 -0.5033 %! -0.1352 0.8755 0.2685 -0.5383 %! -0.1136 0.9348 0.2695 -0.5183 %! -0.0901 0.9419 0.2325 -0.6033 %! -0.0643 0.9225 0.1315 -0.5033 %! -0.0407 0.8522 0.0945 -0.4833 %! -0.0225 0.7295 0.0265 -0.4108 %! -0.0137 0.6081 -0.0405 -0.3008 %! -0.0151 0.4741 -0.0395 -0.2883 %! -0.0274 0.3231 -0.0395 -0.1408 %! -0.0520 0.2134 -0.0215 -0.0958 %! -0.0864 0.1254 -0.0295 -0.0233 %! -0.1263 0.0256 0.0055 0.0442 %! -0.1653 -0.0778 0.0825 0.0617 %! -0.1988 -0.1712 0.1285 0.1667 %! -0.2238 -0.2647 0.1945 0.1292 %! -0.2412 -0.3741 0.1865 0.2617 %! -0.2549 -0.4006 0.1935 0.3267 %! -0.2573 -0.3240 0.2765 0.0892 %! -0.2433 -0.2505 0.2645 0.1417 %! -0.2231 -0.1534 0.2415 0.1142 %! -0.2069 -0.0410 0.2085 0.0342 %! -0.2000 0.0238 0.1645 0.0642 %! -0.2001 0.0544 0.1985 -0.0808 %! -0.2037 -0.0099 0.2065 0.0317 %! -0.2104 -0.1788 0.2635 0.1042 %! -0.2160 -0.3564 0.2935 0.1217 %! -0.2186 -0.5024 0.2335 0.2917 %! -0.2186 -0.5871 0.1745 0.3217 %! -0.2108 -0.5916 0.1735 0.2567 %! -0.1901 -0.5845 0.2265 0.1692 %! -0.1679 -0.6241 0.1165 0.4067 %! -0.1573 -0.6377 0.0325 0.3817 %! -0.1530 -0.6189 0.0765 0.1342 %! -0.1569 -0.6339 0.0265 0.4667 %! -0.1734 -0.6051 0.0855 0.3067 %! -0.1951 -0.5319 0.1385 0.1567 %! -0.2237 -0.4474 0.1275 0.3742 %! -0.2571 -0.3082 0.2075 0.0317 %! -0.2879 -0.2211 0.1775 0.0992 %! -0.3188 -0.1793 0.1985 0.1917 %! -0.3429 -0.0881 0.3475 -0.1158 %! -0.3541 -0.0297 0.3825 -0.0333 %! -0.3618 0.0134 0.3265 0.0117 %! -0.3716 0.0785 0.2805 -0.0033 %! -0.3719 0.0910 0.3965 -0.1883 %! -0.3546 0.0535 0.4395 -0.1708 %! -0.3345 0.0320 0.3055 0.1492 %! -0.3160 0.0821 0.3255 -0.1533 %! -0.2892 0.1773 0.3235 -0.2208 %! -0.2587 0.2922 0.2255 -0.0133 %! -0.2214 0.4446 0.2095 -0.3608 %! -0.1671 0.5549 0.2005 -0.4208 %! -0.1050 0.5845 0.1275 -0.2683 %! -0.0486 0.5966 -0.0525 -0.3083 %! 0.0032 0.5948 -0.1795 -0.4133 %! 0.0516 0.5806 -0.2155 -0.3683 %! 0.0863 0.5808 -0.2465 -0.2633 %! 0.1019 0.5570 -0.2995 -0.3258 %! 0.1007 0.4895 -0.3555 -0.2833 %! 0.0823 0.4475 -0.3445 -0.2083 %! 0.0486 0.4517 -0.3085 -0.1983 %! 0.0106 0.4461 -0.2495 -0.2433 %! -0.0204 0.3968 -0.1525 -0.2433 %! -0.0427 0.3374 -0.1145 -0.1308 %! -0.0570 0.3425 -0.1035 -0.2283 %! -0.0662 0.4094 -0.1785 -0.1583 %! -0.0749 0.4980 -0.1755 -0.1458 %! -0.0767 0.5981 -0.0495 -0.3908 %! -0.0689 0.6888 -0.0465 -0.2683 %! -0.0577 0.7881 -0.0605 -0.3833 %! -0.0469 0.8619 -0.1055 -0.4733 %! -0.0422 0.8321 -0.1485 -0.3083 %! -0.0387 0.7466 -0.0695 -0.5408 %! -0.0309 0.6634 -0.0885 -0.3933 %! -0.0268 0.5794 -0.0795 -0.2908 %! -0.0307 0.5002 -0.0445 -0.4458 %! -0.0508 0.4760 -0.1505 -0.1608 %! -0.0894 0.5679 -0.0875 -0.3133 %! -0.1283 0.7078 0.1175 -0.6508 %! -0.1663 0.7919 0.1845 -0.3833 %! -0.2133 0.8265 0.2345 -0.4483 %! -0.2599 0.8374 0.3125 -0.6758 %! -0.2969 0.8162 0.3435 -0.4808 %! -0.3210 0.7420 0.4165 -0.5058 %! -0.3215 0.5730 0.4795 -0.5808 %! -0.3013 0.2979 0.4085 -0.1883 %! -0.2680 0.0143 0.3635 -0.1408 %! -0.2172 -0.1931 0.2695 -0.1933 %! -0.1568 -0.3482 0.0795 0.1542 %! -0.0990 -0.5055 0.0565 0.0917 %! -0.0475 -0.7178 -0.0035 0.2642 %! -0.0025 -0.9341 -0.0295 0.3692 %! 0.0428 -1.0834 -0.0325 0.2067 %! 0.0814 -1.2097 -0.2115 0.6567 %! 0.1090 -1.3175 -0.1885 0.4517 %! 0.1336 -1.4127 -0.1795 0.3767 %! 0.1445 -1.5065 -0.3165 0.8592 %! 0.1424 -1.5894 -0.2155 0.4442 %! 0.1379 -1.7094 -0.2005 0.5842 %! 0.1194 -1.7628 -0.2475 0.9192 %! 0.0871 -1.6474 -0.1865 0.5092 %! 0.0541 -1.4894 -0.1495 0.4967 %! 0.0205 -1.3807 -0.0495 0.4817 %! -0.0189 -1.3325 -0.0365 0.4492 %! -0.0630 -1.3452 -0.0175 0.4417 %! -0.1055 -1.4067 0.0835 0.4317 %! -0.1473 -1.4711 0.1405 0.6042 %! -0.1886 -1.4663 0.2055 0.4892 %! -0.2252 -1.4405 0.2435 0.5292 %! -0.2545 -1.4530 0.3345 0.5367 %! -0.2726 -1.4790 0.3915 0.4667 %! -0.2804 -1.5291 0.3805 0.6292 %! -0.2800 -1.6064 0.4145 0.5967 %! -0.2711 -1.6577 0.4125 0.6642 %! -0.2543 -1.6503 0.4445 0.6142 %! -0.2332 -1.6413 0.3945 0.6267 %! -0.2186 -1.6598 0.2995 0.8167 %! -0.2105 -1.6905 0.3655 0.6167 %! -0.2016 -1.7773 0.3605 0.6767 %! -0.1990 -1.8767 0.3035 0.8442 %! -0.2109 -1.9359 0.2905 0.8542 %! -0.2309 -1.9978 0.3625 0.8267 %! -0.2464 -2.0725 0.4795 0.7117 %! -0.2598 -2.1566 0.3915 1.0417 %! -0.2729 -2.2060 0.4415 0.9092 %! -0.2729 -2.2146 0.5805 0.6867 %! -0.2651 -2.1907 0.4845 1.0592 %! -0.2563 -2.0544 0.4705 0.7217 %! -0.2420 -1.8793 0.4675 0.5817 %! -0.2313 -1.7438 0.4625 0.7617 %! -0.2284 -1.5795 0.5095 0.4092 %! -0.2306 -1.4005 0.4165 0.4717 %! -0.2380 -1.2226 0.4445 0.3817 %! -0.2426 -1.0615 0.5195 0.1817 %! -0.2387 -0.9443 0.4795 0.2317 %! -0.2262 -0.8374 0.4195 0.1167 %! -0.2090 -0.7585 0.3505 0.1867 %! -0.1902 -0.6965 0.3525 0.1167 %! -0.1702 -0.6160 0.2955 0.0917 %! -0.1530 -0.5535 0.2285 0.1892 %! -0.1379 -0.5331 0.2845 0.0267 %! -0.1232 -0.5745 0.2955 0.1692 %! -0.1141 -0.6693 0.2535 0.3117 %! -0.1051 -0.7692 0.2395 0.2017 %! -0.0888 -0.8714 0.2465 0.3167 %! -0.0706 -0.9784 0.2345 0.4467 %! -0.0576 -1.0470 0.1525 0.4467 %! -0.0533 -1.0386 0.0805 0.4942 %! -0.0564 -0.9563 0.0985 0.4417 %! -0.0595 -0.8278 0.1525 0.2792 %! -0.0590 -0.6936 0.1335 0.2642 %! -0.0571 -0.6112 0.1255 0.2042 %! -0.0560 -0.6221 0.1465 0.1867 %! -0.0570 -0.6806 0.1365 0.2192 %! -0.0627 -0.7056 0.1195 0.1917 %! -0.0791 -0.6703 0.1115 0.3067 %! -0.1047 -0.5488 0.2345 0.1217 %! -0.1276 -0.3868 0.3215 -0.0508 %! -0.1452 -0.2989 0.2885 0.0592 %! -0.1579 -0.3142 0.3435 -0.1133 %! -0.1698 -0.3930 0.3155 0.1142 %! -0.1872 -0.4033 0.3395 0.1592 %! -0.1990 -0.3194 0.4595 -0.2333 %! -0.2078 -0.2826 0.3695 0.1642 %! -0.2264 -0.2406 0.3875 0.1117 %! -0.2433 -0.1958 0.4715 -0.2008 %! -0.2512 -0.2855 0.4245 0.1467 %! -0.2515 -0.4154 0.4715 0.0942 %! -0.2396 -0.5006 0.4585 0.1692 %! -0.2129 -0.5207 0.4565 0.2067 %! -0.1705 -0.4377 0.3985 0.0617 %! -0.1208 -0.3532 0.2195 0.2492 %! -0.0686 -0.3256 0.2095 0.0667 %! -0.0112 -0.3184 0.1815 0.0317 %! 0.0433 -0.3352 0.0535 0.2317 %! 0.0918 -0.4017 -0.0255 0.0992 %! 0.1426 -0.5515 -0.0725 0.1567 %! 0.1971 -0.7994 -0.1095 0.3167 %! 0.2489 -1.0643 -0.2455 0.4467 %! 0.2920 -1.1858 -0.3815 0.4692 %! 0.3209 -1.1632 -0.4625 0.5017 %! 0.3329 -1.1275 -0.5055 0.5192 %! 0.3346 -1.1285 -0.4975 0.3542 %! 0.3295 -1.1701 -0.5175 0.5017 %! 0.3165 -1.1697 -0.4415 0.4092 %! 0.2959 -1.0758 -0.4215 0.3492 %! 0.2624 -0.9392 -0.4725 0.4917 %! 0.2233 -0.7484 -0.3445 0.0942 %! 0.1902 -0.5707 -0.2465 0.1017 %! 0.1574 -0.4626 -0.2065 0.2217 %! 0.1245 -0.3397 -0.1795 -0.0258 %! 0.0987 -0.1692 -0.2115 0.0592 %! 0.0892 0.0685 -0.1245 -0.2233 %! 0.1028 0.3453 -0.1275 -0.3658 %! 0.1273 0.5826 -0.2405 -0.2433 %! 0.1497 0.7764 -0.2575 -0.4733 %! 0.1646 0.9231 -0.3065 -0.4433 %! 0.1718 1.0326 -0.3265 -0.4683 %! 0.1809 1.1361 -0.2795 -0.6558 %! 0.1953 1.2657 -0.2505 -0.6283 %! 0.2050 1.4464 -0.2775 -0.6108 %! 0.2068 1.6188 -0.3545 -0.7183 %! 0.2126 1.7093 -0.3495 -0.9183 %! 0.2281 1.7044 -0.3355 -0.8058 %! 0.2457 1.6703 -0.3325 -0.7608 %! 0.2611 1.6585 -0.3575 -0.9008 %! 0.2661 1.6143 -0.4705 -0.6558 %! 0.2578 1.5015 -0.4585 -0.7583 %! 0.2451 1.2956 -0.4175 -0.8033 %! 0.2207 1.0253 -0.4485 -0.3858 %! 0.1768 0.8074 -0.3655 -0.4483 %! 0.1220 0.6616 -0.2795 -0.4508 %! 0.0620 0.5891 -0.2285 -0.3108 %! 0.0002 0.5812 -0.1485 -0.4083 %! -0.0594 0.5578 -0.0655 -0.3083 %! -0.1114 0.5396 0.0895 -0.3433 %! -0.1434 0.5741 0.2125 -0.4708 %! -0.1458 0.6506 0.2315 -0.4908 %! -0.1214 0.7486 0.1975 -0.5258 %! -0.0806 0.8194 0.1325 -0.4908 %! -0.0301 0.8304 0.0945 -0.5433 %! 0.0299 0.7454 0.0665 -0.5858 %! 0.0900 0.5891 -0.0315 -0.3883 %! 0.1351 0.4885 -0.1265 -0.2783 %! 0.1632 0.4505 -0.1695 -0.3683 %! 0.1762 0.3982 -0.2285 -0.2433 %! 0.1710 0.3510 -0.2465 -0.1358 %! 0.1548 0.3268 -0.1755 -0.2458 %! 0.1398 0.2582 -0.1175 -0.2033 %! 0.1272 0.1084 -0.1365 -0.0433 %! 0.1135 -0.0557 -0.1765 0.0192 %! 0.1006 -0.2035 -0.1505 0.0517 %! 0.0938 -0.3889 -0.0855 0.1217 %! 0.0944 -0.6404 -0.0965 0.2717 %! 0.1026 -0.9610 -0.1245 0.3942 %! 0.1201 -1.2709 -0.1525 0.5192 %! 0.1463 -1.4491 -0.2075 0.6042 %! 0.1781 -1.5392 -0.2885 0.5967 %! 0.2058 -1.5973 -0.4185 0.7367 %! 0.2213 -1.5830 -0.4225 0.7092 %! 0.2301 -1.5379 -0.3435 0.5192 %! 0.2335 -1.5207 -0.3875 0.6617 %! 0.2284 -1.5386 -0.3855 0.6292 %! 0.2245 -1.5724 -0.3055 0.4667 %! 0.2271 -1.5665 -0.2665 0.5442 %! 0.2266 -1.5256 -0.3165 0.5842 %! 0.2127 -1.4837 -0.3835 0.5992 %! 0.1882 -1.4411 -0.2855 0.4917 %! 0.1628 -1.3895 -0.1655 0.4392 %! 0.1359 -1.2722 -0.1825 0.5567 %! 0.1069 -1.0629 -0.1565 0.3892 %! 0.0833 -0.7969 -0.0815 0.2242 %! 0.0679 -0.5100 -0.0695 0.1892 %! 0.0615 -0.2389 -0.1075 -0.0033 %! 0.0664 0.0303 -0.1485 -0.0908 %! 0.0822 0.3079 -0.1295 -0.1783 %! 0.1140 0.5658 -0.1465 -0.4283 %! 0.1627 0.7941 -0.3005 -0.5208 %! 0.2134 0.9634 -0.4675 -0.4783 %! 0.2515 1.0687 -0.5295 -0.5583 %! 0.2738 1.1300 -0.5445 -0.6233 %! 0.2803 1.1322 -0.5615 -0.6283 %! 0.2668 1.0979 -0.5675 -0.5358 %! 0.2311 1.0801 -0.4795 -0.5458 %! 0.1799 1.0888 -0.3715 -0.6558 %! 0.1121 1.1266 -0.4035 -0.4358 %! 0.0311 1.2269 -0.3055 -0.5658 %! -0.0402 1.3304 -0.0415 -0.9458 %! -0.0970 1.3157 0.0015 -0.6333 %! -0.1536 1.2545 -0.0375 -0.5383 %! -0.2054 1.2245 0.0305 -0.7933 %! -0.2445 1.1415 0.1235 -0.5958 %! -0.2725 1.0068 0.2105 -0.5658 %! -0.2878 0.8388 0.2305 -0.5408 %! -0.2910 0.6395 0.2735 -0.3933 %! -0.2874 0.5035 0.3115 -0.3133 %! -0.2779 0.4273 0.2875 -0.2908 %! -0.2564 0.3242 0.2965 -0.3508 %! -0.2262 0.1788 0.3125 -0.1683 %! -0.1995 0.0612 0.3315 -0.0883 %! -0.1818 0.0445 0.2725 -0.1558 %! -0.1738 0.0600 0.1725 -0.0008 %! -0.1659 0.0355 0.2655 -0.2008 %! -0.1461 -0.0219 0.3315 -0.2508 %! -0.1285 -0.0978 0.1775 0.1717 %! -0.1227 -0.0947 0.1175 -0.0583 %! -0.1180 0.0203 0.1475 -0.2958 %! -0.1209 0.1808 0.0885 -0.0583 %! -0.1447 0.3916 0.0655 -0.2633 %! -0.1867 0.6153 0.1075 -0.3983 %! -0.2364 0.7858 0.2675 -0.4633 %! -0.2797 0.8695 0.3975 -0.6508 %! -0.3113 0.8415 0.3245 -0.4733 %! -0.3328 0.7698 0.3295 -0.4683 %! -0.3393 0.6590 0.4225 -0.5358 %! -0.3336 0.4096 0.3615 -0.2583 %! -0.3268 0.0623 0.2565 -0.0833 %! -0.3236 -0.2521 0.2545 0.0217 %! -0.3274 -0.4415 0.3015 0.1842 %! -0.3401 -0.4715 0.3165 0.1442 %! -0.3613 -0.3861 0.2875 0.1192 %! -0.3928 -0.2126 0.3465 0.1017 %! -0.4270 0.0263 0.5095 -0.1383 %! -0.4483 0.2006 0.5895 -0.2933 %! -0.4524 0.2266 0.5585 -0.1858 %! -0.4430 0.1870 0.5985 -0.2108 %! -0.4182 0.1108 0.6425 -0.2158 %! -0.3771 -0.0376 0.5545 -0.0483 %! -0.3187 -0.1650 0.4475 -0.0533 %! -0.2411 -0.2002 0.3935 -0.0583 %! -0.1509 -0.2036 0.2985 0.0642 %! -0.0553 -0.2188 0.1135 0.0367 %! 0.0448 -0.2304 -0.0875 -0.0033 %! 0.1459 -0.2073 -0.1945 0.0142 %! 0.2399 -0.1473 -0.2935 -0.0083 %! 0.3167 -0.0702 -0.4665 -0.0133 %! 0.3672 -0.0015 -0.6225 -0.0183 %! 0.3880 0.0378 -0.6905 -0.0008 %! 0.3879 0.0570 -0.6595 -0.1233 %! 0.3785 0.0166 -0.6325 -0.1958 %! 0.3514 -0.0870 -0.7245 0.1167 %! 0.2945 -0.1448 -0.7365 0.1692 %! 0.2217 -0.1525 -0.6035 -0.0558 %! 0.1512 -0.1462 -0.5155 0.0192 %! 0.0848 -0.0799 -0.4575 0.1092 %! 0.0256 0.0141 -0.3195 -0.0783 %! -0.0216 0.0462 -0.2265 -0.0958 %! -0.0663 0.0041 -0.2675 0.1267 %! -0.1129 -0.0417 -0.2395 0.0467 %! -0.1489 -0.0732 -0.0465 -0.1133 %! -0.1735 -0.1401 0.0665 0.1492 %! -0.1959 -0.2071 0.0965 0.1167 %! -0.2177 -0.2551 0.0575 0.0867 %! -0.2382 -0.3215 0.0755 0.3017 %! -0.2444 -0.3974 0.2365 0.0692 %! -0.2240 -0.5052 0.2665 0.1617 %! -0.1884 -0.5983 0.1795 0.4567 %! -0.1441 -0.5736 0.1695 0.2567 %! -0.0834 -0.5133 0.1105 0.2092 %! -0.0064 -0.5083 -0.0085 0.2642 %! 0.0780 -0.4662 -0.1285 0.2517 %! 0.1629 -0.3218 -0.1705 0.1792 %! 0.2469 -0.1316 -0.2225 -0.0458 %! 0.3188 0.0698 -0.4895 0.0292 %! 0.3657 0.2711 -0.6915 -0.0558 %! 0.3947 0.3881 -0.6545 -0.3083 %! 0.4166 0.3752 -0.6155 -0.2233 %! 0.4322 0.3157 -0.6895 -0.1933 %! 0.4374 0.2851 -0.8475 -0.1083 %! 0.4346 0.2856 -0.8755 -0.1283 %! 0.4354 0.2982 -0.8335 -0.3133 %! 0.4374 0.3127 -0.9455 -0.0808 %! 0.4289 0.3315 -0.9695 -0.0958 %! 0.4117 0.3484 -0.8695 -0.2483 %! 0.3875 0.3695 -0.8635 -0.1233 %! 0.3534 0.4046 -0.8965 -0.2008 %! 0.3109 0.4103 -0.8595 -0.2033 %! 0.2621 0.3735 -0.6865 -0.1533 %! 0.2091 0.3471 -0.5615 -0.1958 %! 0.1487 0.3500 -0.6085 -0.0883 %! 0.0755 0.4095 -0.5965 -0.0558 %! -0.0007 0.5566 -0.3735 -0.2433 %! -0.0624 0.7375 -0.1545 -0.3708 %! -0.1055 0.9106 -0.1155 -0.3558 %! -0.1340 1.0728 -0.0775 -0.4608 %! -0.1476 1.2037 -0.0005 -0.5433 %! -0.1445 1.3093 0.0225 -0.5708 %! -0.1205 1.4124 0.0125 -0.6983 %! -0.0755 1.5512 -0.0005 -0.7383 %! -0.0197 1.7541 -0.0045 -0.7633 %! 0.0390 1.9343 -0.0825 -0.9433 %! 0.0935 1.9883 -0.2615 -0.9758 %! 0.1276 1.9447 -0.3705 -0.8358 %! 0.1302 1.8773 -0.3225 -0.8033 %! 0.1103 1.7874 -0.2095 -0.9333 %! 0.0776 1.6447 -0.2025 -0.8183 %! 0.0259 1.5027 -0.2675 -0.5433 %! -0.0390 1.4181 -0.1615 -0.7108 %! -0.0957 1.2941 -0.0355 -0.7858 %! -0.1442 1.0659 -0.0665 -0.4158 %! -0.1955 0.8406 -0.0395 -0.3733 %! -0.2470 0.6814 0.0665 -0.4008 %! -0.2951 0.5478 0.1495 -0.2533 %! -0.3391 0.4030 0.1875 -0.2308 %! -0.3757 0.2509 0.2445 -0.1508 %! -0.3997 0.0973 0.4195 -0.1908 %! -0.4133 -0.1007 0.4435 0.0092 %! -0.4258 -0.3112 0.3315 0.2217 %! -0.4290 -0.4816 0.4055 0.0417 %! -0.4116 -0.6439 0.5125 0.1667 %! -0.3855 -0.7518 0.4715 0.3892 %! -0.3658 -0.8248 0.3845 0.3667 %! -0.3557 -0.9450 0.3525 0.4867 %! -0.3478 -1.0281 0.4715 0.4367 %! -0.3283 -1.0926 0.5655 0.3717 %! -0.2970 -1.2113 0.4865 0.5767 %! -0.2629 -1.3095 0.4455 0.5692 %! -0.2277 -1.4162 0.4285 0.5542 %! -0.1940 -1.5722 0.2955 0.7242 %! -0.1658 -1.7209 0.1985 0.7442 %! -0.1448 -1.8574 0.2275 0.7892 %! -0.1375 -1.9598 0.2405 0.9342 %! -0.1496 -1.9831 0.1605 0.9617 %! -0.1754 -1.9571 0.0975 0.8592 %! -0.2079 -1.9523 0.1425 0.9042 %! -0.2432 -1.9481 0.2485 0.9167 %! -0.2732 -1.8977 0.2955 0.8142 %! -0.2909 -1.8860 0.2895 0.8067 %! -0.2993 -1.9321 0.2625 0.8917 %! -0.3030 -1.9254 0.2225 0.9267 %! -0.2944 -1.8378 0.2495 0.7292 %! -0.2680 -1.7114 0.2665 0.6842 %! -0.2381 -1.6035 0.2105 0.8692 %! -0.2142 -1.5457 0.1815 0.7167 %! -0.1883 -1.5002 0.1355 0.6142 %! -0.1554 -1.4121 0.0995 0.6692 %! -0.1165 -1.2429 0.1295 0.4617 %! -0.0822 -1.0065 0.0435 0.5217 %! -0.0685 -0.7615 -0.0505 0.5117 %! -0.0718 -0.5596 -0.0245 0.1767 %! -0.0823 -0.4178 -0.0155 0.2067 %! -0.0983 -0.3206 0.0595 0.2192 %! -0.1120 -0.2728 0.1795 0.0367 %! -0.1158 -0.3035 0.2005 0.0992 %! -0.1137 -0.4179 0.1345 0.2017 %! -0.1111 -0.5628 0.0385 0.2992 %! -0.1055 -0.6991 0.0785 0.2917 %! -0.0926 -0.8462 0.1725 0.3192 %! -0.0805 -0.9604 0.1215 0.4942 %! -0.0829 -0.9911 0.0025 0.5617 %! -0.0989 -0.9748 0.0055 0.4517 %! -0.1198 -0.9313 0.0895 0.3517 %! -0.1470 -0.8188 0.0865 0.4717 %! -0.1825 -0.5767 0.1175 0.3517 %! -0.2078 -0.2504 0.2775 -0.1133 %! -0.2118 0.0583 0.2575 -0.1083 %! -0.2050 0.3599 0.1075 -0.1258 %! -0.1866 0.6426 0.1025 -0.5283 %! -0.1520 0.8930 0.1295 -0.5483 %! -0.1091 1.1596 0.1155 -0.6283 %! -0.0649 1.3843 -0.0185 -0.8033 %! -0.0246 1.5324 -0.1305 -0.8133 %! 0.0046 1.6659 -0.1205 -0.8933 %! 0.0178 1.7974 -0.1815 -0.8083 %! 0.0241 1.8634 -0.1665 -0.9808 %! 0.0406 1.7408 -0.1085 -1.0333 %! 0.0601 1.4745 -0.2045 -0.5733 %! 0.0706 1.2181 -0.2795 -0.5683 %! 0.0761 0.9181 -0.3655 -0.4383 %! 0.0813 0.5557 -0.3455 -0.1333 %! 0.0948 0.1924 -0.1705 -0.2608 %! 0.1104 -0.2105 -0.2785 0.2767 %! 0.1106 -0.5572 -0.3925 0.5542 %! 0.1075 -0.7736 -0.2685 0.2067 %! 0.1162 -0.9587 -0.2095 0.4942 %! 0.1310 -1.0968 -0.1835 0.5617 %! 0.1419 -1.1625 -0.2115 0.5117 %! 0.1387 -1.1825 -0.2185 0.6392 %! 0.1236 -1.1781 -0.1115 0.3592 %! 0.1019 -1.2740 -0.1395 0.5267 %! 0.0726 -1.4467 -0.0835 0.6167 %! 0.0408 -1.5448 0.1065 0.4117 %! 0.0016 -1.5764 0.0855 0.7292 %! -0.0515 -1.5247 0.0165 0.6792 %! -0.0978 -1.3839 0.1515 0.2642 %! -0.1198 -1.2895 0.3075 0.3542 %! -0.1232 -1.2714 0.3285 0.4542 %! -0.1137 -1.2652 0.2525 0.3392 %! -0.0937 -1.2585 0.1695 0.4317 %! -0.0676 -1.2220 0.1545 0.4642 %! -0.0336 -1.1269 0.1285 0.2617 %! 0.0051 -0.9943 0.0255 0.3567 %! 0.0358 -0.8408 -0.0185 0.3917 %! 0.0583 -0.6968 -0.0065 0.1442 %! 0.0780 -0.6212 -0.1115 0.1767 %! 0.0897 -0.6090 -0.2035 0.2367 %! 0.0864 -0.6100 -0.1845 0.2517 %! 0.0693 -0.5884 -0.0925 0.3142 %! 0.0521 -0.5452 0.0195 0.0817 %! 0.0422 -0.5450 -0.0485 0.2167 %! 0.0304 -0.5974 -0.0775 0.3592 %! 0.0179 -0.6380 0.0365 0.1317 %! 0.0090 -0.6589 0.0385 0.3142 %! 0.0029 -0.6802 0.0675 0.3042 %! 0.0083 -0.7241 0.1465 0.1517 %! 0.0292 -0.8090 0.1455 0.3517 %! 0.0665 -0.9103 0.1315 0.2267 %! 0.1175 -0.9751 -0.0355 0.3342 %! 0.1700 -0.9540 -0.1515 0.4492 %! 0.2239 -0.8772 -0.1285 0.1217 %! 0.2782 -0.7929 -0.2845 0.2592 %! 0.3202 -0.6856 -0.4145 0.2367 %! 0.3485 -0.5863 -0.4115 -0.0058 %! 0.3620 -0.5588 -0.4445 0.1667 %! 0.3588 -0.6270 -0.4405 0.1317 %! 0.3445 -0.7807 -0.4595 0.1717 %! 0.3223 -0.9466 -0.4315 0.3642 %! 0.2962 -1.0383 -0.3285 0.3042 %! 0.2693 -1.0274 -0.3485 0.3917 %! 0.2392 -0.9591 -0.3755 0.3742 %! 0.2038 -0.9085 -0.3265 0.3042 %! 0.1593 -0.8824 -0.2615 0.4042 %! 0.1061 -0.8394 -0.1675 0.3567 %! 0.0545 -0.7459 -0.0505 0.2442 %! 0.0122 -0.6037 0.0655 0.1592 %! -0.0254 -0.4611 0.0855 0.2192 %! -0.0626 -0.3247 0.0695 0.1617 %! -0.0875 -0.1777 0.1505 -0.1158 %! -0.0905 -0.0481 0.2245 -0.0983 %! -0.0766 0.0802 0.2345 -0.1633 %! -0.0549 0.2306 0.1405 -0.2558 %! -0.0366 0.3284 0.0435 -0.1458 %! -0.0207 0.3329 0.1075 -0.3483 %! 0.0026 0.3131 0.1475 -0.3983 %! 0.0262 0.3154 0.1045 -0.1858 %! 0.0400 0.3280 0.0795 -0.2658 %! 0.0476 0.3332 0.0685 -0.3658 %! 0.0513 0.3067 0.0155 -0.3033 %! 0.0436 0.2422 -0.0525 -0.2133 %! 0.0191 0.1745 -0.0125 -0.1783 %! -0.0154 0.1173 0.1125 -0.2333 %! -0.0520 0.0566 0.1405 -0.1883 %! -0.0912 -0.0241 0.1125 -0.1083 %! -0.1337 -0.1957 0.1615 -0.0583 %! -0.1775 -0.4680 0.2625 0.0967 %! -0.2182 -0.7258 0.3555 0.1792 %! -0.2523 -0.9660 0.3795 0.3267 %! -0.2796 -1.2414 0.4355 0.4692 %! -0.3002 -1.4781 0.5115 0.5442 %! -0.3161 -1.6356 0.4915 0.7167 %! -0.3243 -1.7215 0.5205 0.6517 %! -0.3173 -1.7280 0.6125 0.5417 %! -0.3033 -1.6605 0.5655 0.7367 %! -0.2915 -1.5221 0.5125 0.5692 %! -0.2740 -1.4133 0.5035 0.3317 %! -0.2508 -1.3893 0.4615 0.5317 %! -0.2274 -1.3097 0.5105 0.3317 %! -0.2072 -1.1267 0.4385 0.2692 %! -0.2012 -0.8891 0.3175 0.3692 %! -0.2073 -0.6029 0.3925 -0.0383 %! -0.2127 -0.3371 0.4275 -0.1183 %! -0.2136 -0.1458 0.4635 -0.1808 %! -0.2108 -0.0281 0.4615 -0.3008 %! -0.2106 0.0331 0.3555 -0.0583 %! -0.2045 0.0892 0.4145 -0.3483 %! -0.1740 0.1431 0.4105 -0.4808 %! -0.1301 0.2082 0.2505 -0.1883 %! -0.0931 0.3034 0.1765 -0.3183 %! -0.0690 0.3629 0.0665 -0.2933 %! -0.0537 0.4034 0.0305 -0.3458 %! -0.0359 0.4826 0.0655 -0.5758 %! -0.0191 0.5747 0.0015 -0.3583 %! -0.0119 0.6836 0.0125 -0.4958 %! -0.0100 0.8082 -0.0155 -0.6258 %! -0.0110 0.9267 -0.0725 -0.5783 %! -0.0131 1.0266 -0.0315 -0.7833 %! -0.0191 1.0669 -0.0235 -0.6333 %! -0.0329 1.0852 0.0475 -0.6808 %! -0.0476 1.1486 0.1005 -0.8408 %! -0.0613 1.2331 0.0555 -0.6658 %! -0.0695 1.2863 0.1305 -0.8658 %! -0.0629 1.2536 0.1935 -0.9183 %! -0.0502 1.1622 0.1295 -0.6433 %! -0.0420 1.0762 0.1075 -0.7283 %! -0.0378 0.9463 0.0865 -0.6458 %! -0.0383 0.7694 0.0815 -0.4908 %! -0.0424 0.6196 0.1055 -0.5508 %! -0.0527 0.4838 0.0825 -0.3458 %! -0.0750 0.3620 0.1135 -0.2508 %! -0.1029 0.3257 0.1775 -0.3258 %! -0.1237 0.3916 0.2245 -0.4083 %! -0.1362 0.4953 0.2215 -0.4708 %! -0.1525 0.5921 0.2075 -0.3783 %! -0.1774 0.6786 0.2845 -0.5608 %! -0.2054 0.7145 0.3265 -0.5958 %! -0.2364 0.6962 0.3055 -0.4108 %! -0.2619 0.6799 0.4275 -0.6658 %! -0.2722 0.6582 0.4825 -0.6183 %! -0.2772 0.6341 0.3975 -0.3433 %! -0.2753 0.6139 0.3925 -0.6433 %! -0.2569 0.5279 0.3515 -0.5758 %! -0.2352 0.3880 0.2905 -0.2933 %! -0.2256 0.2776 0.2425 -0.2983 %! -0.2253 0.2197 0.2435 -0.2883 %! -0.2240 0.1661 0.3435 -0.3258 %! -0.2194 0.0552 0.3135 -0.1083 %! -0.2107 -0.0586 0.2945 -0.0883 %! -0.1862 -0.1745 0.3505 -0.1983 %! -0.1449 -0.3729 0.2845 0.1492 %! -0.0923 -0.5517 0.2365 0.0692 %! -0.0331 -0.6555 0.0805 0.1867 %! 0.0188 -0.7057 -0.0615 0.4342 %! 0.0632 -0.6388 -0.0115 0.0117 %! 0.1011 -0.5252 -0.1195 0.1917 %! 0.1224 -0.4038 -0.1795 0.1617 %! 0.1294 -0.2700 -0.1185 -0.2408 %! 0.1151 -0.2191 -0.2065 0.1567 %! 0.0729 -0.1642 -0.1515 -0.0483 %! 0.0192 -0.0712 -0.0105 -0.3533 %! -0.0439 -0.0512 0.0485 0.0167 %! -0.1182 -0.0612 0.2055 -0.1708 %! -0.1887 -0.0999 0.2975 -0.2733 %! -0.2494 -0.1813 0.3405 -0.0633 %! -0.2982 -0.2755 0.4775 -0.1683 %! -0.3334 -0.4156 0.5205 -0.0333 %! -0.3602 -0.5483 0.5275 0.1142 %! -0.3767 -0.6765 0.6015 0.0492 %! -0.3788 -0.8510 0.6165 0.1667 %! -0.3733 -0.9980 0.5815 0.3117 %! -0.3666 -1.1136 0.5495 0.3617 %! -0.3586 -1.2004 0.5285 0.3817 %! -0.3497 -1.1950 0.5185 0.4042 %! -0.3411 -1.1416 0.4925 0.3942 %! -0.3308 -1.1319 0.4865 0.3667 %! -0.3151 -1.1897 0.5185 0.4042 %! -0.2909 -1.2479 0.5295 0.4217 %! -0.2559 -1.2221 0.4895 0.3667 %! -0.2137 -1.1087 0.4145 0.3742 %! -0.1715 -0.9637 0.3655 0.3142 %! -0.1311 -0.8325 0.3315 0.2117 %! -0.0919 -0.6882 0.2665 0.1967 %! -0.0507 -0.5098 0.2545 0.0167 %! -0.0053 -0.3457 0.2025 -0.0408 %! 0.0384 -0.2101 0.0915 -0.0308 %! 0.0784 -0.1111 0.0025 -0.1683 %! 0.1181 -0.0751 -0.0865 -0.1308 %! 0.1605 -0.0730 -0.1175 -0.2033 %! 0.2059 -0.1001 -0.2135 -0.2008 %! 0.2462 -0.2077 -0.3615 -0.0183 %! 0.2772 -0.4270 -0.4225 -0.0558 %! 0.3007 -0.7541 -0.4925 0.1717 %! 0.3146 -1.1303 -0.5105 0.3567 %! 0.3186 -1.4819 -0.5215 0.4617 %! 0.3091 -1.7927 -0.5565 0.7917 %! 0.2890 -2.0763 -0.4785 0.7642 %! 0.2692 -2.3198 -0.4585 0.8617 %! 0.2490 -2.4531 -0.4775 1.1192 %! 0.2292 -2.4601 -0.4055 0.9467 %! 0.2131 -2.4495 -0.3885 0.9992 %! 0.1952 -2.4696 -0.3775 1.0642 %! 0.1710 -2.4586 -0.3765 1.0317 %! 0.1456 -2.4272 -0.2785 0.9392 %! 0.1230 -2.4762 -0.1635 0.9317 %! 0.0921 -2.5929 -0.1965 1.2292 %! 0.0478 -2.6509 -0.1055 1.0467 %! -0.0025 -2.6497 0.0055 1.0742 %! -0.0578 -2.6410 0.0905 1.2692 %! -0.1096 -2.5957 0.2545 0.9617 %! -0.1513 -2.5087 0.2895 1.1817 %! -0.1795 -2.3898 0.4275 1.0492 %! -0.1794 -2.2767 0.5375 0.6942 %! -0.1570 -2.1483 0.3505 1.0492 %! -0.1248 -1.8914 0.3095 0.7342 %! -0.0796 -1.5767 0.2835 0.4517 %! -0.0317 -1.3301 0.1355 0.6567 %! 0.0092 -1.1046 0.0485 0.3492 %! 0.0457 -0.8055 -0.0545 0.2217 %! 0.0755 -0.4035 -0.0825 0.1117 %! 0.0943 0.0059 -0.1495 -0.0883 %! 0.1011 0.3715 -0.2115 -0.2533 %! 0.0943 0.7130 -0.1945 -0.4308 %! 0.0694 1.0155 -0.1785 -0.3908 %! 0.0356 1.3196 -0.0615 -0.7733 %! 0.0046 1.5734 -0.0275 -0.8458 %! -0.0314 1.7202 -0.0395 -0.6133 %! -0.0681 1.8521 0.1035 -1.0408 %! -0.0942 1.9659 0.1055 -0.9358 %! -0.1141 2.0471 0.0675 -0.8083 %! -0.1209 2.0915 0.1535 -1.1308 %! -0.1063 2.0434 0.1825 -1.0608 %! -0.0888 1.9430 0.0735 -0.8483 %! -0.0915 1.8424 -0.1075 -0.6683 %! -0.1083 1.8053 -0.0255 -0.9108 %! -0.1202 1.8339 0.1335 -0.9908 %! -0.1316 1.8332 0.1095 -0.6858 %! -0.1505 1.8459 0.1255 -0.9133 %! -0.1761 1.8897 0.1255 -0.8433 %! -0.2072 1.8891 0.1965 -0.7508 %! -0.2260 1.8554 0.3535 -1.1083 %! -0.2255 1.8173 0.3455 -0.8533 %! -0.2197 1.7742 0.3785 -0.7258 %! -0.2068 1.6928 0.4225 -0.9683 %! -0.1823 1.5929 0.2655 -0.7583 %! -0.1528 1.5525 0.1635 -0.6833 %! -0.1153 1.5768 0.1865 -0.8233 %! -0.0639 1.6492 0.1845 -0.8233 %! -0.0036 1.7389 0.0385 -0.7983 %! 0.0568 1.8252 -0.1795 -0.8408 %! 0.1135 1.9303 -0.3065 -0.9008 %! 0.1663 2.0578 -0.3395 -0.9508 %! 0.2171 2.2149 -0.3865 -1.1108 %! 0.2609 2.3688 -0.5255 -1.0583 %! 0.2903 2.4811 -0.5965 -1.0783 %! 0.3116 2.5456 -0.5985 -1.2933 %! 0.3302 2.5368 -0.6915 -1.2033 %! 0.3386 2.4999 -0.7635 -1.1133 %! 0.3349 2.4705 -0.7265 -1.1508 %! 0.3272 2.3935 -0.6665 -1.1583 %! 0.3200 2.2373 -0.7235 -1.0883 %! 0.3069 2.0341 -0.8575 -0.8508 %! 0.2852 1.8725 -0.7935 -0.9233 %! 0.2581 1.7540 -0.7195 -0.8208 %! 0.2203 1.6180 -0.7705 -0.5283 %! 0.1816 1.4957 -0.6725 -0.8258 %! 0.1549 1.3512 -0.5665 -0.7058 %! 0.1282 1.1388 -0.5585 -0.2658 %! 0.1008 0.9536 -0.4685 -0.5208 %! 0.0874 0.8015 -0.3885 -0.4808 %! 0.0840 0.6058 -0.3185 -0.1583 %! 0.0854 0.4115 -0.2425 -0.2633 %! 0.0948 0.2596 -0.2405 -0.1983 %! 0.1089 0.1118 -0.2375 -0.0158 %! 0.1282 -0.0454 -0.1845 -0.0983 %! 0.1559 -0.2334 -0.2045 -0.0283 %! 0.1806 -0.4327 -0.3215 0.2567 %! 0.1940 -0.5798 -0.3475 0.2092 %! 0.2039 -0.6991 -0.3195 0.1717 %! 0.2138 -0.7922 -0.3635 0.3517 %! 0.2221 -0.8503 -0.4145 0.3267 %! 0.2299 -0.9164 -0.4665 0.3792 %! 0.2400 -0.9682 -0.4465 0.3692 %! 0.2545 -1.0512 -0.4625 0.3767 %! 0.2670 -1.2018 -0.5555 0.6217 %! 0.2737 -1.3174 -0.5085 0.5317 %! 0.2764 -1.4090 -0.4815 0.6092 %! 0.2693 -1.5248 -0.5265 0.8217 %! 0.2531 -1.6471 -0.4865 0.6892 %! 0.2321 -1.8015 -0.4525 0.8867 %! 0.2056 -1.9496 -0.3925 1.0067 %! 0.1804 -2.0230 -0.3695 0.8967 %! 0.1599 -1.9852 -0.4155 1.0367 %! 0.1436 -1.8214 -0.3455 0.8392 %! 0.1329 -1.6423 -0.3275 0.7317 %! 0.1199 -1.5459 -0.3995 0.8667 %! 0.1026 -1.4838 -0.3475 0.6542 %! 0.0885 -1.4278 -0.2525 0.5967 %! 0.0761 -1.3787 -0.2145 0.6842 %! 0.0645 -1.2595 -0.1895 0.5417 %! 0.0588 -1.0485 -0.1635 0.3892 %! 0.0552 -0.8090 -0.1595 0.4317 %! 0.0479 -0.5480 -0.1485 0.2867 %! 0.0420 -0.3196 -0.1045 0.0467 %! 0.0378 -0.2052 -0.0815 0.0967 %! 0.0258 -0.1789 -0.0605 0.0942 %! 0.0006 -0.2476 -0.0715 0.1042 %! -0.0359 -0.4128 -0.0735 0.2417 %! -0.0730 -0.6137 0.0265 0.2317 %! -0.0993 -0.8314 0.0895 0.3617 %! -0.1153 -0.9895 0.0605 0.5417 %! -0.1249 -1.0287 -0.0115 0.6092 %! -0.1250 -1.0177 -0.0275 0.5817 %! -0.1093 -0.9871 0.0055 0.4892 %! -0.0832 -0.9130 -0.0565 0.6292 %! -0.0526 -0.8006 -0.0585 0.5317 %! -0.0077 -0.7273 0.0065 0.2742 %! 0.0553 -0.7710 -0.0665 0.4267 %! 0.1270 -0.9222 -0.1935 0.4617 %! 0.1985 -1.1668 -0.3345 0.6017 %! 0.2688 -1.4234 -0.3835 0.6767 %! 0.3422 -1.5956 -0.4405 0.5992 %! 0.4068 -1.7452 -0.6875 0.9367 %! 0.4443 -1.9072 -0.8405 0.9867 %! 0.4553 -2.0635 -0.8345 0.9092 %! 0.4476 -2.2464 -0.8135 1.0567 %! 0.4252 -2.4329 -0.7825 1.0967 %! 0.3876 -2.5541 -0.7555 1.2767 %! 0.3383 -2.5291 -0.6055 1.1367 %! 0.2853 -2.3477 -0.5295 1.0567 %! 0.2304 -2.0738 -0.5415 1.0692 %! 0.1821 -1.7182 -0.3605 0.5542 %! 0.1429 -1.3468 -0.2425 0.5842 %! 0.1032 -1.0234 -0.2025 0.4742 %! 0.0679 -0.7153 -0.1825 0.0467 %! 0.0414 -0.4370 -0.1845 0.1467 %! 0.0237 -0.2054 -0.0365 -0.1708 %! 0.0103 -0.0543 -0.0845 -0.1233 %! -0.0138 -0.0096 -0.1945 0.1042 %! -0.0442 0.0084 -0.0665 -0.3308 %! -0.0775 0.0274 -0.0545 -0.0058 %! -0.1239 0.0529 -0.0365 0.0892 %! -0.1740 0.1041 0.0725 -0.2208 %! -0.2155 0.1382 0.1855 0.0092 %! -0.2412 0.1550 0.3675 -0.2133 %! -0.2493 0.1734 0.3055 -0.1183 %! -0.2515 0.2194 0.2315 0.0167 %! -0.2507 0.3222 0.3455 -0.2983 %! -0.2498 0.4421 0.3345 -0.1158 %! -0.2534 0.5567 0.3655 -0.2708 %! -0.2559 0.6360 0.3995 -0.3958 %! -0.2582 0.6567 0.4175 -0.2383 %! -0.2604 0.6446 0.4565 -0.4358 %! -0.2618 0.5815 0.3395 -0.2633 %! -0.2665 0.5052 0.3425 -0.2233 %! -0.2708 0.5100 0.4235 -0.3608 %! -0.2728 0.6079 0.3875 -0.2883 %! -0.2742 0.7203 0.3615 -0.4683 %! -0.2795 0.7793 0.3085 -0.3733 %! -0.2924 0.8673 0.3805 -0.4158 %! -0.3020 0.9995 0.5025 -0.6983 %! -0.3037 1.0591 0.4755 -0.5208 %! -0.3040 1.0871 0.5245 -0.5933 %! -0.3049 1.1507 0.5525 -0.6233 %! -0.3058 1.2644 0.5195 -0.6358 %! -0.3004 1.4334 0.4955 -0.8358 %! -0.2875 1.5499 0.4055 -0.6808 %! -0.2652 1.5844 0.4605 -0.8508 %! -0.2284 1.5971 0.3825 -0.8783 %! -0.1892 1.6190 0.1465 -0.5958 %! -0.1537 1.6781 0.1075 -0.9083 %! -0.1213 1.6967 0.0525 -0.7883 %! -0.1047 1.6351 0.0045 -0.5783 %! -0.1042 1.5375 0.0525 -0.8158 %! -0.1170 1.3787 0.0375 -0.5208 %! -0.1449 1.2041 0.1245 -0.4508 %! -0.1783 1.0765 0.1865 -0.4958 %! -0.2074 0.9696 0.2285 -0.3758 %! -0.2269 0.8117 0.3565 -0.4383 %! -0.2434 0.5263 0.3285 -0.0883 %! -0.2634 0.1883 0.3275 0.0292 %! -0.2766 -0.1724 0.4035 -0.0358 %! -0.2855 -0.6067 0.3515 0.5092 %! -0.2971 -0.9636 0.3975 0.5592 %! -0.3002 -1.1742 0.4425 0.4867 %! -0.2883 -1.3005 0.3975 0.6967 %! -0.2630 -1.3348 0.3585 0.5892 %! -0.2244 -1.3593 0.2655 0.6317 %! -0.1732 -1.4072 0.2425 0.5767 %! -0.1119 -1.4491 0.2175 0.5367 %! -0.0519 -1.5377 0.1075 0.7042 %! -0.0045 -1.6482 0.0515 0.6342 %! 0.0222 -1.7353 -0.0215 0.8067 %! 0.0255 -1.7833 -0.0095 0.8492 %! 0.0200 -1.7957 0.0855 0.6017 %! 0.0138 -1.8427 0.0605 0.8717 %! 0.0079 -1.9256 0.0775 0.8342 %! 0.0100 -2.0111 0.0645 0.7467 %! 0.0160 -2.0729 -0.0805 1.0792 %! 0.0231 -2.0740 -0.0975 0.8967 %! 0.0388 -2.0445 -0.1065 0.8617 %! 0.0597 -1.9906 -0.1435 1.0067 %! 0.0807 -1.9170 -0.1825 0.8017 %! 0.0969 -1.8479 -0.3205 0.9292 %! 0.1029 -1.7495 -0.3275 0.8542 %! 0.1043 -1.6604 -0.2355 0.6392 %! 0.1001 -1.6211 -0.2395 0.8142 %! 0.0841 -1.5806 -0.2095 0.7817 %! 0.0630 -1.5319 -0.1415 0.6667 %! 0.0489 -1.5022 -0.0715 0.6367 %! 0.0469 -1.4700 -0.0835 0.6692 %! 0.0566 -1.3234 -0.1335 0.6092 %! 0.0811 -1.0251 -0.0935 0.2617 %! 0.1115 -0.7103 -0.2095 0.3017 %! 0.1288 -0.4227 -0.3555 0.2692 %! 0.1352 -0.1704 -0.2835 -0.2308 %! 0.1320 -0.0594 -0.2505 -0.0183 %! 0.1065 -0.0067 -0.2275 0.0967 %! 0.0680 0.1685 -0.1365 -0.3083 %! 0.0335 0.4148 -0.0715 -0.3258 %! 0.0049 0.5997 -0.0175 -0.3758 %! -0.0195 0.7006 -0.0445 -0.4033 %! -0.0351 0.7637 -0.0225 -0.4233 %! -0.0299 0.8425 0.0905 -0.6383 %! -0.0055 0.9276 0.0615 -0.5283 %! 0.0178 1.0462 -0.0975 -0.3783 %! 0.0368 1.2729 -0.1145 -0.6858 %! 0.0674 1.4969 -0.0265 -0.9283 %! 0.1083 1.6066 -0.1025 -0.7658 %! 0.1448 1.7228 -0.2695 -0.7558 %! 0.1778 1.9169 -0.3095 -1.0808 %! 0.2111 2.1262 -0.3605 -1.0633 %! 0.2372 2.3387 -0.4795 -1.0733 %! 0.2550 2.5757 -0.5415 -1.3358 %! 0.2666 2.7617 -0.4935 -1.4108 %! 0.2636 2.7910 -0.4535 -1.3158 %! 0.2380 2.7246 -0.5335 -1.2708 %! 0.1975 2.6043 -0.4965 -1.3383 %! 0.1524 2.3566 -0.3465 -1.1458 %! 0.1037 2.0830 -0.2385 -0.9383 %! 0.0570 1.8917 -0.1875 -1.0133 %! 0.0150 1.7363 -0.2315 -0.7908 %! -0.0242 1.6378 -0.1455 -0.8158 %! -0.0589 1.5875 -0.0665 -0.9083 %! -0.0979 1.5152 -0.1345 -0.6183 %! -0.1459 1.4203 -0.0325 -0.7233 %! -0.1901 1.3044 0.1315 -0.7433 %! -0.2209 1.1849 0.2195 -0.6183 %! -0.2339 1.0649 0.2275 -0.6983 %! -0.2355 0.9365 0.1425 -0.4533 %! -0.2337 0.8784 0.1855 -0.4658 %! -0.2214 0.8990 0.2485 -0.6558 %! -0.1964 0.9349 0.1745 -0.5258 %! -0.1659 0.9811 0.1785 -0.6333 %! -0.1372 0.9916 0.1725 -0.5783 %! -0.1158 0.9395 0.1425 -0.5083 %! -0.0970 0.8657 0.1345 -0.6183 %! -0.0792 0.8086 0.0965 -0.4358 %! -0.0657 0.8370 0.1385 -0.4958 %! -0.0552 0.9112 0.1155 -0.5783 %! -0.0518 0.9266 -0.0175 -0.4133 %! -0.0560 0.9192 -0.0425 -0.5208 %! -0.0578 0.8932 0.0005 -0.5783 %! -0.0564 0.8007 -0.0235 -0.4083 %! -0.0591 0.6940 -0.0925 -0.3358 %! -0.0655 0.6191 -0.1015 -0.3833 %! -0.0735 0.5441 -0.0995 -0.2783 %! -0.0841 0.4197 -0.1085 -0.1608 %! -0.0892 0.2639 -0.0675 -0.2483 %! -0.0801 0.1240 -0.0085 -0.2133 %! -0.0661 -0.0027 -0.0185 -0.0408 %! -0.0647 -0.0929 -0.1255 0.0367 %! -0.0828 -0.1350 -0.1705 0.0342 %! -0.1111 -0.1750 -0.0195 -0.0983 %! -0.1424 -0.2431 0.1145 -0.0458 %! -0.1823 -0.3343 0.1235 0.1642 %! -0.2282 -0.4034 0.1845 0.0017 %! -0.2684 -0.4463 0.2355 0.0017 %! -0.3042 -0.4858 0.2235 0.1692 %! -0.3374 -0.5038 0.2585 0.0742 %! -0.3619 -0.5260 0.3695 0.0692 %! -0.3751 -0.5692 0.4925 0.0867 %! -0.3804 -0.6271 0.4655 0.1342 %! -0.3838 -0.6946 0.3635 0.2492 %! -0.3849 -0.7012 0.4405 0.1317 %! -0.3802 -0.6456 0.5245 0.1767 %! -0.3685 -0.5710 0.5145 0.1717 %! -0.3432 -0.4960 0.4965 -0.0458 %! -0.3091 -0.5027 0.3875 0.1642 %! -0.2816 -0.5650 0.2855 0.2767 %! -0.2575 -0.6307 0.2745 0.0492 %! -0.2333 -0.7767 0.2115 0.3092 %! -0.2177 -0.9320 0.2115 0.4467 %! -0.2103 -0.9808 0.2295 0.3017 %! -0.2077 -0.9820 0.1235 0.4517 %! -0.2091 -0.9672 0.0925 0.4017 %! -0.2067 -0.9320 0.1505 0.2667 %! -0.1964 -0.9354 0.1875 0.3117 %! -0.1862 -1.0067 0.1385 0.4092 %! -0.1835 -1.1249 0.0845 0.4417 %! -0.1878 -1.2659 0.1145 0.4717 %! -0.1971 -1.4192 0.1755 0.5892 %! -0.2082 -1.5634 0.2345 0.5917 %! -0.2205 -1.6030 0.2205 0.7092 %! -0.2334 -1.4712 0.2515 0.5992 %! -0.2378 -1.2802 0.2915 0.3067 %! -0.2371 -1.1340 0.1805 0.4742 %! -0.2418 -1.0239 0.1895 0.3717 %! -0.2467 -0.9961 0.2855 0.1917 %! -0.2506 -1.0394 0.2625 0.4892 %! -0.2481 -1.0708 0.3205 0.2867 %! -0.2255 -1.1285 0.3115 0.2942 %! -0.1851 -1.2190 0.2515 0.5392 %! -0.1284 -1.2780 0.2205 0.3617 %! -0.0568 -1.3066 0.0485 0.4992 %! 0.0190 -1.3093 -0.0745 0.5842 %! 0.0980 -1.3169 -0.0975 0.3817 %! 0.1790 -1.3629 -0.1905 0.4917 %! 0.2470 -1.3928 -0.3335 0.5942 %! 0.2906 -1.3799 -0.4495 0.5667 %! 0.3119 -1.3872 -0.4345 0.4267 %! 0.3070 -1.4366 -0.4805 0.6267 %! 0.2694 -1.4497 -0.5195 0.7092 %! 0.2157 -1.4180 -0.3445 0.3267 %! 0.1572 -1.4131 -0.2795 0.5917 %! 0.0900 -1.4020 -0.2475 0.6467 %! 0.0252 -1.3726 -0.1455 0.2942 %! -0.0329 -1.3701 -0.1075 0.5992 %! -0.0863 -1.3388 0.0435 0.4792 %! -0.1235 -1.2708 0.1565 0.2142 %! -0.1478 -1.2320 0.1245 0.4817 %! -0.1728 -1.2034 0.1555 0.4392 %! -0.1952 -1.1628 0.2365 0.2667 %! -0.2103 -1.1065 0.2765 0.3317 %! -0.2217 -0.9840 0.3265 0.2767 %! -0.2321 -0.8129 0.3975 0.1317 %! -0.2489 -0.6673 0.3905 0.1867 %! -0.2823 -0.5045 0.3435 0.2217 %! -0.3208 -0.2971 0.4725 -0.1183 %! -0.3473 -0.1283 0.6145 -0.1808 %! -0.3655 0.0017 0.6595 -0.0633 %! -0.3824 0.1148 0.6585 -0.2158 %! -0.3984 0.1791 0.6025 -0.1708 %! -0.4094 0.2068 0.6665 -0.2083 %! -0.4057 0.1834 0.7515 -0.2908 %! -0.3881 0.1013 0.7285 -0.1283 %! -0.3652 0.0076 0.6865 -0.0358 %! -0.3341 -0.0852 0.6455 -0.0683 %! -0.2841 -0.1695 0.5685 -0.0783 %! -0.2157 -0.2379 0.4245 0.0317 %! -0.1411 -0.3204 0.2975 0.1167 %! -0.0709 -0.4622 0.1965 0.1842 %! -0.0090 -0.6683 0.0635 0.2967 %! 0.0471 -0.8651 -0.0275 0.2617 %! 0.0923 -0.9752 -0.1435 0.4992 %! 0.1202 -0.9762 -0.1835 0.5592 %! 0.1442 -0.9324 -0.0975 0.1967 %! 0.1675 -0.9128 -0.2015 0.4142 %! 0.1732 -0.8419 -0.3305 0.5317 %! 0.1625 -0.6695 -0.2815 0.1442 %! 0.1441 -0.4938 -0.2375 0.1892 ]; %! %! DAT = iddata (UY(:, 3:4), UY(:, 1:2)); %! %! [SYS, X0] = moen4 (DAT, "s", 15, "n", 8, "rcond", 0.0, "tol", -1.0); %! %! Ae = [ 0.9893 0.0081 -0.0844 0.0299 0.1262 0.0815 -0.0379 0.1779 %! 0.0076 0.9694 0.1352 0.1793 0.0965 -0.1041 -0.0373 -0.0045 %! 0.0018 -0.0115 0.9413 -0.3450 0.1674 0.0302 -0.1098 -0.0087 %! 0.0036 -0.0197 0.1766 0.6550 -0.1178 0.6168 0.0028 0.0085 %! -0.0010 -0.0032 -0.0507 0.0624 0.9293 -0.0034 0.0229 -0.4511 %! 0.0032 -0.0012 -0.0397 0.1255 0.1578 0.1833 0.7586 0.3125 %! 0.0029 -0.0048 0.0422 0.2343 0.0321 -0.6549 -0.0374 0.2232 %! -0.0036 0.0028 0.0080 -0.2437 0.1074 0.1599 -0.1012 0.2106 ]; %! %! Ce = [ -0.2226 0.2072 -0.3129 -0.3937 0.1722 0.3232 -0.2113 0.2928 %! -0.1680 -0.2205 0.0698 0.4049 0.3210 -0.1143 -0.2451 0.4844 ]; %! %! Be = [ 0.0857 0.0026 %! -0.6433 -0.0314 %! 0.2445 0.0044 %! 1.8942 0.0488 %! 0.0549 0.0151 %! -2.2093 -0.0622 %! -2.5072 -0.0925 %! 0.8189 0.0280 ]; %! %! De = [ -0.4997 0.0451 %! -1.0011 -0.5567 ]; %! %!assert (SYS.A, Ae, 1e-4); %!assert (SYS.B, Be, 1e-4); %!assert (SYS.C, Ce, 1e-4); %!assert (SYS.D, De, 1e-4); control/inst/moesp.m0000644000076500000240000001652612273411257014034 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moesp (@var{dat}, @dots{}) ## @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moesp (@var{dat}, @var{n}, @dots{}) ## @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moesp (@var{dat}, @var{opt}, @dots{}) ## @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} moesp (@var{dat}, @var{n}, @var{opt}, @dots{}) ## Estimate state-space model using @acronym{MOESP} algorithm. ## @acronym{MOESP}: Multivariable Output Error State sPace. ## If no output arguments are given, the singular values are ## plotted on the screen in order to estimate the system order. ## ## @strong{Inputs} ## @table @var ## @item dat ## iddata set containing the measurements, i.e. time-domain signals. ## @item n ## The desired order of the resulting state-space system @var{sys}. ## If not specified, @var{n} is chosen automatically according ## to the singular values and tolerances. ## @item @dots{} ## Optional pairs of keys and values. @code{'key1', value1, 'key2', value2}. ## @item opt ## Optional struct with keys as field names. ## Struct @var{opt} can be created directly or ## by command @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. ## @end table ## ## ## @strong{Outputs} ## @table @var ## @item sys ## Discrete-time state-space model. ## @item x0 ## Initial state vector. If @var{dat} is a multi-experiment dataset, ## @var{x0} becomes a cell vector containing an initial state vector ## for each experiment. ## @item info ## Struct containing additional information. ## @table @var ## @item info.K ## Kalman gain matrix. ## @item info.Q ## State covariance matrix. ## @item info.Ry ## Output covariance matrix. ## @item info.S ## State-output cross-covariance matrix. ## @item info.L ## Noise variance matrix factor. LL'=Ry. ## @end table ## @end table ## ## ## ## @strong{Option Keys and Values} ## @table @var ## @item 'n' ## The desired order of the resulting state-space system @var{sys}. ## @var{s} > @var{n} > 0. ## ## @item 's' ## The number of block rows @var{s} in the input and output ## block Hankel matrices to be processed. @var{s} > 0. ## In the MOESP theory, @var{s} should be larger than @var{n}, ## the estimated dimension of state vector. ## ## @item 'alg', 'algorithm' ## Specifies the algorithm for computing the triangular ## factor R, as follows: ## @table @var ## @item 'C' ## Cholesky algorithm applied to the correlation ## matrix of the input-output data. Default method. ## @item 'F' ## Fast QR algorithm. ## @item 'Q' ## QR algorithm applied to the concatenated block ## Hankel matrices. ## @end table ## ## @item 'tol' ## Absolute tolerance used for determining an estimate of ## the system order. If @var{tol} >= 0, the estimate is ## indicated by the index of the last singular value greater ## than or equal to @var{tol}. (Singular values less than @var{tol} ## are considered as zero.) When @var{tol} = 0, an internally ## computed default value, @var{tol} = @var{s}*@var{eps}*SV(1), is used, ## where SV(1) is the maximal singular value, and @var{eps} is ## the relative machine precision. ## When @var{tol} < 0, the estimate is indicated by the ## index of the singular value that has the largest ## logarithmic gap to its successor. Default value is 0. ## ## @item 'rcond' ## The tolerance to be used for estimating the rank of ## matrices. If the user sets @var{rcond} > 0, the given value ## of @var{rcond} is used as a lower bound for the reciprocal ## condition number; an m-by-n matrix whose estimated ## condition number is less than 1/@var{rcond} is considered to ## be of full rank. If the user sets @var{rcond} <= 0, then an ## implicitly computed, default tolerance, defined by ## @var{rcond} = m*n*@var{eps}, is used instead, where @var{eps} is the ## relative machine precision. Default value is 0. ## ## @item 'confirm' ## Specifies whether or not the user's confirmation of the ## system order estimate is desired, as follows: ## @table @var ## @item true ## User's confirmation. ## @item false ## No confirmation. Default value. ## @end table ## ## @item 'noiseinput' ## The desired type of noise input channels. ## @table @var ## @item 'n' ## No error inputs. Default value. ## @iftex ## @tex ## $$ x_{k+1} = A x_k + B u_k $$ ## $$ y_k = C x_k + D u_k $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## x[k+1] = A x[k] + B u[k] ## y[k] = C x[k] + D u[k] ## @end example ## @end ifnottex ## ## @item 'e' ## Return @var{sys} as a (p-by-m+p) state-space model with ## both measured input channels u and noise channels e ## with covariance matrix @var{Ry}. ## @iftex ## @tex ## $$ x_{k+1} = A x_k + B u_k + K e_k $$ ## $$ y_k = C x_k + D u_k + e_k $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## x[k+1] = A x[k] + B u[k] + K e[k] ## y[k] = C x[k] + D u[k] + e[k] ## @end example ## @end ifnottex ## ## @item 'v' ## Return @var{sys} as a (p-by-m+p) state-space model with ## both measured input channels u and white noise channels v ## with identity covariance matrix. ## @iftex ## @tex ## $$ x_{k+1} = A x_k + B u_k + K L v_k $$ ## $$ y_k = C x_k + D u_k + L v_k $$ ## $$ e = L v, \\ L L^T = R_y $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## x[k+1] = A x[k] + B u[k] + K L v[k] ## y[k] = C x[k] + D u[k] + L v[k] ## e = L v, L L' = Ry ## @end example ## @end ifnottex ## ## @item 'k' ## Return @var{sys} as a Kalman predictor for simulation. ## @iftex ## @tex ## $$ \\widehat{x}_{k+1} = A \\widehat{x}_k + B u_k + K (y_k - \\widehat{y}_k) $$ ## $$ \\widehat{y}_k = C \\widehat{x}_k + D u_k $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ^ ^ ^ ## x[k+1] = A x[k] + B u[k] + K(y[k] - y[k]) ## ^ ^ ## y[k] = C x[k] + D u[k] ## @end example ## @end ifnottex ## ## @iftex ## @tex ## $$ \\widehat{x}_{k+1} = (A-KC) \\widehat{x}_k + (B-KD) u_k + K y_k $$ ## $$ \\widehat{y}_k = C \\widehat{x}_k + D u_k + 0 y_k $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ^ ^ ## x[k+1] = (A-KC) x[k] + (B-KD) u[k] + K y[k] ## ^ ^ ## y[k] = C x[k] + D u[k] + 0 y[k] ## @end example ## @end ifnottex ## @end table ## @end table ## ## ## @strong{Algorithm}@* ## Uses SLICOT IB01AD, IB01BD and IB01CD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: May 2012 ## Version: 0.1 function [sys, x0, info] = moesp (varargin) if (nargin == 0) print_usage (); endif if (nargout == 0) __slicot_identification__ ("moesp", nargout, varargin{:}); else [sys, x0, info] = __slicot_identification__ ("moesp", nargout, varargin{:}); endif endfunction control/inst/n4sid.m0000644000076500000240000001656212273411257013732 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{sys}, @var{x0}, @var{info}] =} n4sid (@var{dat}, @dots{}) ## @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} n4sid (@var{dat}, @var{n}, @dots{}) ## @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} n4sid (@var{dat}, @var{opt}, @dots{}) ## @deftypefnx {Function File} {[@var{sys}, @var{x0}, @var{info}] =} n4sid (@var{dat}, @var{n}, @var{opt}, @dots{}) ## Estimate state-space model using @acronym{N4SID} algorithm. ## @acronym{N4SID}: Numerical algorithm for Subspace State Space System IDentification. ## If no output arguments are given, the singular values are ## plotted on the screen in order to estimate the system order. ## ## @strong{Inputs} ## @table @var ## @item dat ## iddata set containing the measurements, i.e. time-domain signals. ## @item n ## The desired order of the resulting state-space system @var{sys}. ## If not specified, @var{n} is chosen automatically according ## to the singular values and tolerances. ## @item @dots{} ## Optional pairs of keys and values. @code{'key1', value1, 'key2', value2}. ## @item opt ## Optional struct with keys as field names. ## Struct @var{opt} can be created directly or ## by command @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. ## @end table ## ## ## @strong{Outputs} ## @table @var ## @item sys ## Discrete-time state-space model. ## @item x0 ## Initial state vector. If @var{dat} is a multi-experiment dataset, ## @var{x0} becomes a cell vector containing an initial state vector ## for each experiment. ## @item info ## Struct containing additional information. ## @table @var ## @item info.K ## Kalman gain matrix. ## @item info.Q ## State covariance matrix. ## @item info.Ry ## Output covariance matrix. ## @item info.S ## State-output cross-covariance matrix. ## @item info.L ## Noise variance matrix factor. LL'=Ry. ## @end table ## @end table ## ## ## ## @strong{Option Keys and Values} ## @table @var ## @item 'n' ## The desired order of the resulting state-space system @var{sys}. ## @var{s} > @var{n} > 0. ## ## @item 's' ## The number of block rows @var{s} in the input and output ## block Hankel matrices to be processed. @var{s} > 0. ## In the MOESP theory, @var{s} should be larger than @var{n}, ## the estimated dimension of state vector. ## ## @item 'alg', 'algorithm' ## Specifies the algorithm for computing the triangular ## factor R, as follows: ## @table @var ## @item 'C' ## Cholesky algorithm applied to the correlation ## matrix of the input-output data. Default method. ## @item 'F' ## Fast QR algorithm. ## @item 'Q' ## QR algorithm applied to the concatenated block ## Hankel matrices. ## @end table ## ## @item 'tol' ## Absolute tolerance used for determining an estimate of ## the system order. If @var{tol} >= 0, the estimate is ## indicated by the index of the last singular value greater ## than or equal to @var{tol}. (Singular values less than @var{tol} ## are considered as zero.) When @var{tol} = 0, an internally ## computed default value, @var{tol} = @var{s}*@var{eps}*SV(1), is used, ## where SV(1) is the maximal singular value, and @var{eps} is ## the relative machine precision. ## When @var{tol} < 0, the estimate is indicated by the ## index of the singular value that has the largest ## logarithmic gap to its successor. Default value is 0. ## ## @item 'rcond' ## The tolerance to be used for estimating the rank of ## matrices. If the user sets @var{rcond} > 0, the given value ## of @var{rcond} is used as a lower bound for the reciprocal ## condition number; an m-by-n matrix whose estimated ## condition number is less than 1/@var{rcond} is considered to ## be of full rank. If the user sets @var{rcond} <= 0, then an ## implicitly computed, default tolerance, defined by ## @var{rcond} = m*n*@var{eps}, is used instead, where @var{eps} is the ## relative machine precision. Default value is 0. ## ## @item 'confirm' ## Specifies whether or not the user's confirmation of the ## system order estimate is desired, as follows: ## @table @var ## @item true ## User's confirmation. ## @item false ## No confirmation. Default value. ## @end table ## ## @item 'noiseinput' ## The desired type of noise input channels. ## @table @var ## @item 'n' ## No error inputs. Default value. ## @iftex ## @tex ## $$ x_{k+1} = A x_k + B u_k $$ ## $$ y_k = C x_k + D u_k $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## x[k+1] = A x[k] + B u[k] ## y[k] = C x[k] + D u[k] ## @end example ## @end ifnottex ## ## @item 'e' ## Return @var{sys} as a (p-by-m+p) state-space model with ## both measured input channels u and noise channels e ## with covariance matrix @var{Ry}. ## @iftex ## @tex ## $$ x_{k+1} = A x_k + B u_k + K e_k $$ ## $$ y_k = C x_k + D u_k + e_k $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## x[k+1] = A x[k] + B u[k] + K e[k] ## y[k] = C x[k] + D u[k] + e[k] ## @end example ## @end ifnottex ## ## @item 'v' ## Return @var{sys} as a (p-by-m+p) state-space model with ## both measured input channels u and white noise channels v ## with identity covariance matrix. ## @iftex ## @tex ## $$ x_{k+1} = A x_k + B u_k + K L v_k $$ ## $$ y_k = C x_k + D u_k + L v_k $$ ## $$ e = L v, \\ L L^T = R_y $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## x[k+1] = A x[k] + B u[k] + K L v[k] ## y[k] = C x[k] + D u[k] + L v[k] ## e = L v, L L' = Ry ## @end example ## @end ifnottex ## ## @item 'k' ## Return @var{sys} as a Kalman predictor for simulation. ## @iftex ## @tex ## $$ \\widehat{x}_{k+1} = A \\widehat{x}_k + B u_k + K (y_k - \\widehat{y}_k) $$ ## $$ \\widehat{y}_k = C \\widehat{x}_k + D u_k $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ^ ^ ^ ## x[k+1] = A x[k] + B u[k] + K(y[k] - y[k]) ## ^ ^ ## y[k] = C x[k] + D u[k] ## @end example ## @end ifnottex ## ## @iftex ## @tex ## $$ \\widehat{x}_{k+1} = (A-KC) \\widehat{x}_k + (B-KD) u_k + K y_k $$ ## $$ \\widehat{y}_k = C \\widehat{x}_k + D u_k + 0 y_k $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ^ ^ ## x[k+1] = (A-KC) x[k] + (B-KD) u[k] + K y[k] ## ^ ^ ## y[k] = C x[k] + D u[k] + 0 y[k] ## @end example ## @end ifnottex ## @end table ## @end table ## ## ## @strong{Algorithm}@* ## Uses SLICOT IB01AD, IB01BD and IB01CD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: May 2012 ## Version: 0.1 function [sys, x0, info] = n4sid (varargin) if (nargin == 0) print_usage (); endif if (nargout == 0) __slicot_identification__ ("n4sid", nargout, varargin{:}); else [sys, x0, info] = __slicot_identification__ ("n4sid", nargout, varargin{:}); endif endfunction control/inst/ncfsyn.m0000644000076500000240000004761612273411257014215 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{K}, @var{N}, @var{gamma}, @var{info}] =} ncfsyn (@var{G}, @var{W1}, @var{W2}, @var{factor}) ## Loop shaping H-infinity synthesis. Compute positive feedback controller using ## the McFarlane/Glover loop shaping design procedure [1]. ## Using a precompensator @var{W1} and/or a postcompensator @var{W2}, the singular values ## of the nominal plant @var{G} are shaped to give a desired open-loop shape. ## The nominal plant @var{G} and shaping functions @var{W1}, @var{W2} are combined to ## form the shaped plant, @var{Gs} where @code{Gs = W2 G W1}. ## We assume that @var{W1} and @var{W2} are such that @var{Gs} contains no hidden modes. ## It is relatively easy to approximate the closed-loop requirements by the following ## open-loop objectives [2]: ## @enumerate ## @item For @emph{disturbance rejection} make ## @iftex ## @tex ## $\\underline{\\sigma}(W_2 G W_1)$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ## @end example ## @end ifnottex ## large; valid for frequencies at which ## @iftex ## @tex ## $\\underline{\\sigma}(G_S) \\gg 1$. ## @end tex ## @end iftex ## @ifnottex ## @example ## ## @end example ## @end ifnottex ## @item For @emph{noise attenuation} make ## @iftex ## @tex ## $\\overline{\\sigma}(W_2 G W_1)$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ## @end example ## @end ifnottex ## small; valid for frequencies at which ## @iftex ## @tex ## $\\overline{\\sigma}(G_S) \\ll 1$. ## @end tex ## @end iftex ## @ifnottex ## @example ## ## @end example ## @end ifnottex ## @item For @emph{reference tracking} make ## @iftex ## @tex ## $\\underline{\\sigma}(W_2 G W_1)$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ## @end example ## @end ifnottex ## large; valid for frequencies at which ## @iftex ## @tex ## $\\underline{\\sigma}(G_S) \\gg 1$. ## @end tex ## @end iftex ## @ifnottex ## @example ## ## @end example ## @end ifnottex ## @item For @emph{robust stability} to a multiplicative output perturbation ## @iftex ## @tex ## $G_p = (I + \\Delta) G$, make ## @end tex ## @end iftex ## @ifnottex ## @example ## ## @end example ## @end ifnottex ## @iftex ## @tex ## $\\overline{\\sigma}(W_2 G W_1)$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ## @end example ## @end ifnottex ## small; valid for frequencies at which ## @iftex ## @tex ## $\\overline{\\sigma}(G_S) \\ll 1$. ## @end tex ## @end iftex ## @ifnottex ## @example ## . ## @end example ## @end ifnottex ## @end enumerate ## Then a stabilizing controller @var{Ks} is synthesized for shaped plant @var{Gs}. ## The final positive feedback controller @var{K} is then constructed by combining ## the ## @iftex ## @tex ## $H_{\\infty}$ ## @end tex ## @end iftex ## @ifnottex ## @example ## H-infinity ## @end example ## @end ifnottex ## controller @var{Ks} with the shaping functions @var{W1} and @var{W2} ## such that @code{K = W1 Ks W2}. ## In [1] is stated further that the given robust stabilization objective can be ## interpreted as a ## @iftex ## @tex ## $H_{\\infty}$ ## @end tex ## @end iftex ## @ifnottex ## @example ## H-infinity ## @end example ## @end ifnottex ## problem formulation of minimizing the ## @iftex ## @tex ## $H_{\\infty}$ ## @end tex ## @end iftex ## @ifnottex ## @example ## H-infinity ## @end example ## @end ifnottex ## norm of the frequency weighted gain from disturbances on the plant input and output ## to the controller input and output as follows: ## @iftex ## @tex ## $$ \\underset{K}{\\min} \\, || N(K) ||_{\\infty}, $$ ## $$ N = | W_{1}^{-1}; W_2 G | \\ (I - K G)^{-1} \\ | W_1, \\ G W_{2}^{-1} | $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## -1 -1 -1 ## min || N(K) || , N = | W1 | (I - K G) | W1 G W2 | ## K oo | W2 G | ## @end example ## @end ifnottex ## @iftex ## @tex ## ## @end tex ## @end iftex ## ## @code{[K, N] = ncfsyn (G, W1, W2, f)} ## The function @command{ncfsyn} - the somewhat cryptic name stands ## for @emph{normalized coprime factorization synthesis} - allows the specification of ## an additional argument, factor @var{f}. Default value @code{f = 1} implies that an ## optimal controller is required, whereas @code{f > 1} implies that a suboptimal ## controller is required, achieving a performance that is @var{f} times less than optimal. ## ## ## @strong{Inputs} ## @table @var ## @item G ## @acronym{LTI} model of plant. ## @item W1 ## @acronym{LTI} model of precompensator. Model must be SISO or of appropriate size. ## An identity matrix is taken if @var{W1} is not specified or if an empty model ## @code{[]} is passed. ## @item W2 ## @acronym{LTI} model of postcompensator. Model must be SISO or of appropriate size. ## An identity matrix is taken if @var{W2} is not specified or if an empty model ## @code{[]} is passed. ## @item factor ## @code{factor = 1} implies that an optimal controller is required. ## @code{factor > 1} implies that a suboptimal controller is required, ## achieving a performance that is @var{factor} times less than optimal. ## Default value is 1. ## @end table ## ## @strong{Outputs} ## @table @var ## @item K ## State-space model of the H-infinity loop-shaping controller. ## Note that @var{K} is a @emph{positive} feedback controller. ## @item N ## State-space model of the closed loop depicted below. ## @item info ## Structure containing additional information. ## @item info.gamma ## L-infinity norm of @var{N}. @code{gamma = norm (N, inf)}. ## @item info.emax ## Nugap robustness. @code{emax = inv (gamma)}. ## @item info.Gs ## Shaped plant. @code{Gs = W2 * G * W1}. ## @item info.Ks ## Controller for shaped plant. @code{Ks = ncfsyn (Gs)}. ## @item info.rcond ## Estimates of the reciprocal condition numbers of the Riccati equations ## and a few other things. For details, see the description of the ## corresponding SLICOT routine. ## @end table ## ## @strong{Block Diagram of N} ## @example ## @group ## ## ^ z1 ^ z2 ## | | ## w1 + | +--------+ | +--------+ ## ----->(+)---+-->| Ks |----+--->(+)---->| Gs |----+ ## ^ + +--------+ ^ +--------+ | ## | w2 | | ## | | ## +-------------------------------------------------+ ## @end group ## @end example ## ## @strong{Algorithm}@* ## Uses SLICOT SB10ID, SB10KD and SB10ZD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## ## @strong{References}@* ## [1] D. McFarlane and K. Glover, ## @cite{A Loop Shaping Design Procedure Using H-infinity Synthesis}, ## IEEE Transactions on Automatic Control, Vol. 37, No. 6, June 1992.@* ## [2] S. Skogestad and I. Postlethwaite, ## @cite{Multivariable Feedback Control: Analysis and Design: ## Second Edition}. Wiley, Chichester, England, 2005.@* ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: July 2011 ## Version: 0.2 function [K, varargout] = ncfsyn (G, W1 = [], W2 = [], factor = 1.0) if (nargin == 0 || nargin > 4) print_usage (); endif if (! isa (G, "lti")) error ("ncfsyn: first argument must be an LTI system"); endif if (! is_real_scalar (factor) || factor < 1.0) error ("ncfsyn: fourth argument invalid"); endif [p, m] = size (G); W1 = __adjust_weighting__ (W1, m); W2 = __adjust_weighting__ (W2, p); Gs = W2 * G * W1; # shaped plant [a, b, c, d, tsam] = ssdata (Gs); ## synthesis if (isct (Gs)) # continuous-time [ak, bk, ck, dk, rcond] = __sl_sb10id__ (a, b, c, d, factor); elseif (any (d(:))) # discrete-time, d != 0 [ak, bk, ck, dk, rcond] = __sl_sb10zd__ (a, b, c, d, factor, 0.0); else # discrete-time, d == 0 [ak, bk, ck, dk, rcond] = __sl_sb10kd__ (a, b, c, factor); endif ## controller Ks = ss (ak, bk, ck, dk, tsam); K = W1 * Ks * W2; if (nargout > 1) ## FIXME: is this really the same thing as the dark side does? N = append (eye (p), Ks, Gs); M = [zeros(p,p), zeros(p,m), eye(p); eye(p), zeros(p,m), zeros(p,p); zeros(m,p), eye(m), zeros(m,p)]; in_idx = [1:p, 2*p+(1:m)]; out_idx = 1:p+m; N = mconnect (N, M, in_idx, out_idx); varargout{1} = N; if (nargout > 2) gamma = norm (N, inf); varargout{2} = gamma; if (nargout > 3) varargout{3} = struct ("gamma", gamma, "emax", inv (gamma), "Gs", Gs, "Ks", Ks, "rcond", rcond); endif endif endif endfunction function W = __adjust_weighting__ (W, s) if (isempty (W)) W = ss (eye (s)); else W = ss (W); ## if (! isstable (W)) ## error ("ncfsyn: %s must be stable", inputname (1)); ## endif ## if (! isminimumphase (W)) ## error ("ncfsyn: %s must be minimum-phase", inputname (1)); ## endif [p, m] = size (W); if (m == s && p == s) # model is of correct size return; elseif (m == 1 && p == 1) # model is SISO tmp = W; for k = 2 : s W = append (W, tmp); # stack SISO model s times endfor else # model is invalid error ("ncfsyn: %s must have 1 or %d inputs and outputs", inputname (1), s); endif endif endfunction ## continuous-time case, direct access to sb10id %!shared AK, BK, CK, DK, RCOND, AKe, BKe, CKe, DKe, RCONDe %! A = [ -1.0 0.0 4.0 5.0 -3.0 -2.0 %! -2.0 4.0 -7.0 -2.0 0.0 3.0 %! -6.0 9.0 -5.0 0.0 2.0 -1.0 %! -8.0 4.0 7.0 -1.0 -3.0 0.0 %! 2.0 5.0 8.0 -9.0 1.0 -4.0 %! 3.0 -5.0 8.0 0.0 2.0 -6.0 ]; %! %! B = [ -3.0 -4.0 %! 2.0 0.0 %! -5.0 -7.0 %! 4.0 -6.0 %! -3.0 9.0 %! 1.0 -2.0 ]; %! %! C = [ 1.0 -1.0 2.0 -4.0 0.0 -3.0 %! -3.0 0.0 5.0 -1.0 1.0 1.0 %! -7.0 5.0 0.0 -8.0 2.0 -2.0 ]; %! %! D = [ 1.0 -2.0 %! 0.0 4.0 %! 5.0 -3.0 ]; %! %! FACTOR = 1.0; %! %! [AK, BK, CK, DK, RCOND] = __sl_sb10id__ (A, B, C, D, FACTOR); %! %! AKe = [ -39.0671 9.9293 22.2322 -27.4113 43.8655 %! -6.6117 3.0006 11.0878 -11.4130 15.4269 %! 33.6805 -6.6934 -23.9953 14.1438 -33.4358 %! -32.3191 9.7316 25.4033 -24.0473 42.0517 %! -44.1655 18.7767 34.8873 -42.4369 50.8437 ]; %! %! BKe = [ -10.2905 -16.5382 -10.9782 %! -4.3598 -8.7525 -5.1447 %! 6.5962 1.8975 6.2316 %! -9.8770 -14.7041 -11.8778 %! -9.6726 -22.7309 -18.2692 ]; %! %! CKe = [ -0.6647 -0.0599 -1.0376 0.5619 1.7297 %! -8.4202 3.9573 7.3094 -7.6283 10.6768 ]; %! %! DKe = [ 0.8466 0.4979 -0.6993 %! -1.2226 -4.8689 -4.5056 ]; %! %! RCONDe = [ 0.13861D-01 0.90541D-02 ].'; %! %!assert (AK, AKe, 1e-4); %!assert (BK, BKe, 1e-4); %!assert (CK, CKe, 1e-4); %!assert (DK, DKe, 1e-4); %!assert (RCOND, RCONDe, 1e-4); ## continuous-time case %!shared AK, BK, CK, DK, RCOND, AKe, BKe, CKe, DKe, RCONDe %! A = [ -1.0 0.0 4.0 5.0 -3.0 -2.0 %! -2.0 4.0 -7.0 -2.0 0.0 3.0 %! -6.0 9.0 -5.0 0.0 2.0 -1.0 %! -8.0 4.0 7.0 -1.0 -3.0 0.0 %! 2.0 5.0 8.0 -9.0 1.0 -4.0 %! 3.0 -5.0 8.0 0.0 2.0 -6.0 ]; %! %! B = [ -3.0 -4.0 %! 2.0 0.0 %! -5.0 -7.0 %! 4.0 -6.0 %! -3.0 9.0 %! 1.0 -2.0 ]; %! %! C = [ 1.0 -1.0 2.0 -4.0 0.0 -3.0 %! -3.0 0.0 5.0 -1.0 1.0 1.0 %! -7.0 5.0 0.0 -8.0 2.0 -2.0 ]; %! %! D = [ 1.0 -2.0 %! 0.0 4.0 %! 5.0 -3.0 ]; %! %! FACTOR = 1.0; %! %! G = ss (A, B, C, D); %! K = ncfsyn (G, [], [], FACTOR); %! [AK, BK, CK, DK] = ssdata (K); %! %! AKe = [ -39.0671 9.9293 22.2322 -27.4113 43.8655 %! -6.6117 3.0006 11.0878 -11.4130 15.4269 %! 33.6805 -6.6934 -23.9953 14.1438 -33.4358 %! -32.3191 9.7316 25.4033 -24.0473 42.0517 %! -44.1655 18.7767 34.8873 -42.4369 50.8437 ]; %! %! BKe = [ -10.2905 -16.5382 -10.9782 %! -4.3598 -8.7525 -5.1447 %! 6.5962 1.8975 6.2316 %! -9.8770 -14.7041 -11.8778 %! -9.6726 -22.7309 -18.2692 ]; %! %! CKe = [ -0.6647 -0.0599 -1.0376 0.5619 1.7297 %! -8.4202 3.9573 7.3094 -7.6283 10.6768 ]; %! %! DKe = [ 0.8466 0.4979 -0.6993 %! -1.2226 -4.8689 -4.5056 ]; %! %! RCONDe = [ 0.13861D-01 0.90541D-02 ]; %! %!assert (AK, AKe, 1e-4); %!assert (BK, BKe, 1e-4); %!assert (CK, CKe, 1e-4); %!assert (DK, DKe, 1e-4); ## discrete-time case D==0, direct access to sb10kd %!shared AK, BK, CK, DK, RCOND, AKe, BKe, CKe, DKe, RCONDe %! A = [ 0.2 0.0 0.3 0.0 -0.3 -0.1 %! -0.3 0.2 -0.4 -0.3 0.0 0.0 %! -0.1 0.1 -0.1 0.0 0.0 -0.3 %! 0.1 0.0 0.0 -0.1 -0.1 0.0 %! 0.0 0.3 0.6 0.2 0.1 -0.4 %! 0.2 -0.4 0.0 0.0 0.2 -0.2 ]; %! %! B = [ -1.0 -2.0 %! 1.0 3.0 %! -3.0 -4.0 %! 1.0 -2.0 %! 0.0 1.0 %! 1.0 5.0 ]; %! %! C = [ 1.0 -1.0 2.0 -2.0 0.0 -3.0 %! -3.0 0.0 1.0 -1.0 1.0 -1.0 ]; %! %! FACTOR = 1.1; %! %! [AK, BK, CK, DK, RCOND] = __sl_sb10kd__ (A, B, C, FACTOR); %! %! AKe = [ 0.0337 0.0222 0.0858 0.1264 -0.1872 0.1547 %! 0.4457 0.0668 -0.2255 -0.3204 -0.4548 -0.0691 %! -0.2419 -0.2506 -0.0982 -0.1321 -0.0130 -0.0838 %! -0.4402 0.3654 -0.0335 -0.2444 0.6366 -0.6469 %! -0.3623 0.3854 0.4162 0.4502 0.0065 0.1261 %! -0.0121 -0.4377 0.0604 0.2265 -0.3389 0.4542 ]; %! %! BKe = [ 0.0931 -0.0269 %! -0.0872 0.1599 %! 0.0956 -0.1469 %! -0.1728 0.0129 %! 0.2022 -0.1154 %! 0.2419 -0.1737 ]; %! %! CKe = [ -0.3677 0.2188 0.0403 -0.0854 0.3564 -0.3535 %! 0.1624 -0.0708 0.0058 0.0606 -0.2163 0.1802 ]; %! %! DKe = [ -0.0857 -0.0246 %! 0.0460 0.0074 ]; %! %! RCONDe = [ 0.11269D-01 0.17596D-01 0.18225D+00 0.75968D-03 ].'; %! %!assert (AK, AKe, 1e-4); %!assert (BK, BKe, 1e-4); %!assert (CK, CKe, 1e-4); %!assert (DK, DKe, 1e-4); %!assert (RCOND, RCONDe, 1e-4); ## discrete-time case D==0 %!shared AK, BK, CK, DK, RCOND, AKe, BKe, CKe, DKe, RCONDe %! A = [ 0.2 0.0 0.3 0.0 -0.3 -0.1 %! -0.3 0.2 -0.4 -0.3 0.0 0.0 %! -0.1 0.1 -0.1 0.0 0.0 -0.3 %! 0.1 0.0 0.0 -0.1 -0.1 0.0 %! 0.0 0.3 0.6 0.2 0.1 -0.4 %! 0.2 -0.4 0.0 0.0 0.2 -0.2 ]; %! %! B = [ -1.0 -2.0 %! 1.0 3.0 %! -3.0 -4.0 %! 1.0 -2.0 %! 0.0 1.0 %! 1.0 5.0 ]; %! %! C = [ 1.0 -1.0 2.0 -2.0 0.0 -3.0 %! -3.0 0.0 1.0 -1.0 1.0 -1.0 ]; %! %! FACTOR = 1.1; %! %! G = ss (A, B, C, [], 1); # value of sampling time doesn't matter %! K = ncfsyn (G, [], [], FACTOR); %! [AK, BK, CK, DK] = ssdata (K); %! %! AKe = [ 0.0337 0.0222 0.0858 0.1264 -0.1872 0.1547 %! 0.4457 0.0668 -0.2255 -0.3204 -0.4548 -0.0691 %! -0.2419 -0.2506 -0.0982 -0.1321 -0.0130 -0.0838 %! -0.4402 0.3654 -0.0335 -0.2444 0.6366 -0.6469 %! -0.3623 0.3854 0.4162 0.4502 0.0065 0.1261 %! -0.0121 -0.4377 0.0604 0.2265 -0.3389 0.4542 ]; %! %! BKe = [ 0.0931 -0.0269 %! -0.0872 0.1599 %! 0.0956 -0.1469 %! -0.1728 0.0129 %! 0.2022 -0.1154 %! 0.2419 -0.1737 ]; %! %! CKe = [ -0.3677 0.2188 0.0403 -0.0854 0.3564 -0.3535 %! 0.1624 -0.0708 0.0058 0.0606 -0.2163 0.1802 ]; %! %! DKe = [ -0.0857 -0.0246 %! 0.0460 0.0074 ]; %! %! RCONDe = [ 0.11269D-01 0.17596D-01 0.18225D+00 0.75968D-03 ].'; %! %!assert (AK, AKe, 1e-4); %!assert (BK, BKe, 1e-4); %!assert (CK, CKe, 1e-4); %!assert (DK, DKe, 1e-4); ## discrete-time case D!=0, direct access to sb10zd %!shared AK, BK, CK, DK, RCOND, AKe, BKe, CKe, DKe, RCONDe %! A = [ 0.2 0.0 3.0 0.0 -0.3 -0.1 %! -3.0 0.2 -0.4 -0.3 0.0 0.0 %! -0.1 0.1 -1.0 0.0 0.0 -3.0 %! 1.0 0.0 0.0 -1.0 -1.0 0.0 %! 0.0 0.3 0.6 2.0 0.1 -0.4 %! 0.2 -4.0 0.0 0.0 0.2 -2.0 ]; %! %! B = [ -1.0 -2.0 %! 1.0 3.0 %! -3.0 -4.0 %! 1.0 -2.0 %! 0.0 1.0 %! 1.0 5.0 ]; %! %! C = [ 1.0 -1.0 2.0 -2.0 0.0 -3.0 %! -3.0 0.0 1.0 -1.0 1.0 -1.0 %! 2.0 4.0 -3.0 0.0 5.0 1.0 ]; %! %! D = [ 10.0 -6.0 %! -7.0 8.0 %! 2.0 -4.0 ]; %! %! FACTOR = 1.1; %! %! [AK, BK, CK, DK, RCOND] = __sl_sb10zd__ (A, B, C, D, FACTOR, 0.0); %! %! AKe = [ 1.0128 0.5101 -0.1546 1.1300 3.3759 0.4911 %! -2.1257 -1.4517 -0.4486 0.3493 -1.5506 -1.4296 %! -1.0930 -0.6026 -0.1344 0.2253 -1.5625 -0.6762 %! 0.3207 0.1698 0.2376 -1.1781 -0.8705 0.2896 %! 0.5017 0.9006 0.0668 2.3613 0.2049 0.3703 %! 1.0787 0.6703 0.2783 -0.7213 0.4918 0.7435 ]; %! %! BKe = [ 0.4132 0.3112 -0.8077 %! 0.2140 0.4253 0.1811 %! -0.0710 0.0807 0.3558 %! -0.0121 -0.2019 0.0249 %! 0.1047 0.1399 -0.0457 %! -0.2542 -0.3472 0.0523 ]; %! %! CKe = [ -0.0372 -0.0456 -0.0040 0.0962 -0.2059 -0.0571 %! 0.1999 0.2994 0.1335 -0.0251 -0.3108 0.2048 ]; %! %! DKe = [ 0.0629 -0.0022 0.0363 %! -0.0228 0.0195 0.0600 ]; %! %! RCONDe = [ 0.27949D-03 0.66679D-03 0.45677D-01 0.23433D-07 0.68495D-01 0.76854D-01 ].'; %! %!assert (AK, AKe, 1e-4); %!assert (BK, BKe, 1e-4); %!assert (CK, CKe, 1e-4); %!assert (DK, DKe, 1e-4); %!assert (RCOND, RCONDe, 1e-4); ## discrete-time case D!=0 %!shared AK, BK, CK, DK, RCOND, AKe, BKe, CKe, DKe, RCONDe %! A = [ 0.2 0.0 3.0 0.0 -0.3 -0.1 %! -3.0 0.2 -0.4 -0.3 0.0 0.0 %! -0.1 0.1 -1.0 0.0 0.0 -3.0 %! 1.0 0.0 0.0 -1.0 -1.0 0.0 %! 0.0 0.3 0.6 2.0 0.1 -0.4 %! 0.2 -4.0 0.0 0.0 0.2 -2.0 ]; %! %! B = [ -1.0 -2.0 %! 1.0 3.0 %! -3.0 -4.0 %! 1.0 -2.0 %! 0.0 1.0 %! 1.0 5.0 ]; %! %! C = [ 1.0 -1.0 2.0 -2.0 0.0 -3.0 %! -3.0 0.0 1.0 -1.0 1.0 -1.0 %! 2.0 4.0 -3.0 0.0 5.0 1.0 ]; %! %! D = [ 10.0 -6.0 %! -7.0 8.0 %! 2.0 -4.0 ]; %! %! FACTOR = 1.1; %! %! G = ss (A, B, C, D, 1); # value of sampling time doesn't matter %! K = ncfsyn (G, [], [], FACTOR); %! [AK, BK, CK, DK] = ssdata (K); %! %! AKe = [ 1.0128 0.5101 -0.1546 1.1300 3.3759 0.4911 %! -2.1257 -1.4517 -0.4486 0.3493 -1.5506 -1.4296 %! -1.0930 -0.6026 -0.1344 0.2253 -1.5625 -0.6762 %! 0.3207 0.1698 0.2376 -1.1781 -0.8705 0.2896 %! 0.5017 0.9006 0.0668 2.3613 0.2049 0.3703 %! 1.0787 0.6703 0.2783 -0.7213 0.4918 0.7435 ]; %! %! BKe = [ 0.4132 0.3112 -0.8077 %! 0.2140 0.4253 0.1811 %! -0.0710 0.0807 0.3558 %! -0.0121 -0.2019 0.0249 %! 0.1047 0.1399 -0.0457 %! -0.2542 -0.3472 0.0523 ]; %! %! CKe = [ -0.0372 -0.0456 -0.0040 0.0962 -0.2059 -0.0571 %! 0.1999 0.2994 0.1335 -0.0251 -0.3108 0.2048 ]; %! %! DKe = [ 0.0629 -0.0022 0.0363 %! -0.0228 0.0195 0.0600 ]; %! %! RCONDe = [ 0.27949D-03 0.66679D-03 0.45677D-01 0.23433D-07 0.68495D-01 0.76854D-01 ].'; %! %!assert (AK, AKe, 1e-4); %!assert (BK, BKe, 1e-4); %!assert (CK, CKe, 1e-4); %!assert (DK, DKe, 1e-4); control/inst/nichols.m0000644000076500000240000000730312273411257014341 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {} nichols (@var{sys}) ## @deftypefnx {Function File} {} nichols (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) ## @deftypefnx {Function File} {} nichols (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{w}) ## @deftypefnx {Function File} {} nichols (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) ## @deftypefnx {Function File} {[@var{mag}, @var{pha}, @var{w}] =} nichols (@var{sys}) ## @deftypefnx {Function File} {[@var{mag}, @var{pha}, @var{w}] =} nichols (@var{sys}, @var{w}) ## Nichols chart of frequency response. If no output arguments are given, ## the response is printed on the screen. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. Must be a single-input and single-output (SISO) system. ## @item w ## Optional vector of frequency values. If @var{w} is not specified, ## it is calculated by the zeros and poles of the system. ## Alternatively, the cell @code{@{wmin, wmax@}} specifies a frequency range, ## where @var{wmin} and @var{wmax} denote minimum and maximum frequencies ## in rad/s. ## @item 'style' ## Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted ## black line. See @command{help plot} for details. ## @end table ## ## @strong{Outputs} ## @table @var ## @item mag ## Vector of magnitude. Has length of frequency vector @var{w}. ## @item pha ## Vector of phase. Has length of frequency vector @var{w}. ## @item w ## Vector of frequency values used. ## @end table ## ## @seealso{bode, nyquist, sigma} ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2009 ## Version: 0.5 function [mag_r, pha_r, w_r] = nichols (varargin) if (nargin == 0) print_usage (); endif [H, w] = __frequency_response__ (varargin, false, "ext"); H = cellfun (@reshape, H, {[]}, {1}, "uniformoutput", false); mag = cellfun (@abs, H, "uniformoutput", false); pha = cellfun (@(H) unwrap (arg (H)) * 180 / pi, H, "uniformoutput", false); if (! nargout) mag_db = cellfun (@(mag) 20 * log10 (mag), mag, "uniformoutput", false); tmp = cellfun (@isa, varargin, {"lti"}); sys_idx = find (tmp); tmp = cellfun (@ischar, varargin); style_idx = find (tmp); len = numel (H); plot_args = {}; legend_args = cell (len, 1); for k = 1:len if (k == len) lim = nargin; else lim = sys_idx(k+1); endif style = varargin(style_idx(style_idx > sys_idx(k) & style_idx <= lim)); plot_args = cat (2, plot_args, pha(k), mag_db(k), style); try legend_args{k} = inputname(sys_idx(k)); catch legend_args{k} = ""; end_try_catch endfor plot (plot_args{:}) axis ("tight") xlim (__axis_margin__ (xlim)) ylim (__axis_margin__ (ylim)) grid ("on") title ("Nichols Chart") xlabel ("Phase [deg]") ylabel ("Magnitude [dB]") legend (legend_args) else mag_r = mag{1}; pha_r = pha{1}; w_r = w{1}; endif endfunction control/inst/nyquist.m0000644000076500000240000001035412273411257014416 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {} nyquist (@var{sys}) ## @deftypefnx {Function File} {} nyquist (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) ## @deftypefnx {Function File} {} nyquist (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{w}) ## @deftypefnx {Function File} {} nyquist (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) ## @deftypefnx {Function File} {[@var{re}, @var{im}, @var{w}] =} nyquist (@var{sys}) ## @deftypefnx {Function File} {[@var{re}, @var{im}, @var{w}] =} nyquist (@var{sys}, @var{w}) ## Nyquist diagram of frequency response. If no output arguments are given, ## the response is printed on the screen. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. Must be a single-input and single-output (SISO) system. ## @item w ## Optional vector of frequency values. If @var{w} is not specified, ## it is calculated by the zeros and poles of the system. ## Alternatively, the cell @code{@{wmin, wmax@}} specifies a frequency range, ## where @var{wmin} and @var{wmax} denote minimum and maximum frequencies ## in rad/s. ## @item 'style' ## Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted ## black line. See @command{help plot} for details. ## @end table ## ## @strong{Outputs} ## @table @var ## @item re ## Vector of real parts. Has length of frequency vector @var{w}. ## @item im ## Vector of imaginary parts. Has length of frequency vector @var{w}. ## @item w ## Vector of frequency values used. ## @end table ## ## @seealso{bode, nichols, sigma} ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2009 ## Version: 0.4 function [re_r, im_r, w_r] = nyquist (varargin) if (nargin == 0) print_usage (); endif [H, w] = __frequency_response__ (varargin, false, "ext"); H = cellfun (@reshape, H, {[]}, {1}, "uniformoutput", false); re = cellfun (@real, H, "uniformoutput", false); im = cellfun (@imag, H, "uniformoutput", false); if (! nargout) tmp = cellfun (@isa, varargin, {"lti"}); sys_idx = find (tmp); tmp = cellfun (@ischar, varargin); style_idx = find (tmp); len = numel (H); pos_args = {}; neg_args = {}; legend_args = cell (len, 1); colororder = get (gca, "colororder"); rc = rows (colororder); for k = 1:len col = colororder(1+rem (k-1, rc), :); if (k == len) lim = nargin; else lim = sys_idx(k+1); endif style = varargin(style_idx(style_idx > sys_idx(k) & style_idx <= lim)); if (isempty (style)) pos_args = cat (2, pos_args, re{k}, im{k}, {"-", "color", col}); neg_args = cat (2, neg_args, re{k}, -im{k}, {"-.", "color", col}); else pos_args = cat (2, pos_args, re{k}, im{k}, style); neg_args = cat (2, neg_args, re{k}, -im{k}, style); endif try legend_args{k} = inputname(sys_idx(k)); catch legend_args{k} = ""; end_try_catch endfor ## FIXME: pos_args = cat (2, pos_args, re{k}, im{k}, {"-", "color", col}, style); ## doesn't work! it would be nice to have default arguments that can be ## (partially) overwritten by user-specified plot styles. h = plot (pos_args{:}, neg_args{:}); axis ("tight") xlim (__axis_margin__ (xlim)) ylim (__axis_margin__ (ylim)) grid ("on") title ("Nyquist Diagram") xlabel ("Real Axis") ylabel ("Imaginary Axis") legend (h(1:len), legend_args) else re_r = re{1}; im_r = im{1}; w_r = w{1}; endif endfunction control/inst/obsv.m0000644000076500000240000000416712273411257013660 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## Copyright (C) 2009 Luca Favatella ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{ob} =} obsv (@var{sys}) ## @deftypefnx {Function File} {@var{ob} =} obsv (@var{a}, @var{c}) ## Return observability matrix. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. ## @item a ## State matrix (n-by-n). ## @item c ## Measurement matrix (p-by-n). ## @end table ## ## @strong{Outputs} ## @table @var ## @item ob ## Observability matrix. ## @end table ## ## @strong{Equation} ## @iftex ## @tex ## $$ O_b = \\left[ \\matrix{ C \\cr ## CA \\cr ## CA^2 \\cr ## \\vdots \\cr ## CA^{n-1} } \\right ] $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## @group ## | C | ## | CA | ## Ob = | CA^2 | ## | ... | ## | CA^(n-1) | ## @end group ## @end example ## @end ifnottex ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.2 function ob = obsv (a, c) if (nargin == 1) # obsv (sys) ob = ctrb (a.').'; # transpose is overloaded for lti models elseif (nargin == 2) # obsv (a, c) ob = ctrb (a.', c.').'; # size checked inside else print_usage (); endif endfunction %!assert (obsv ([1, 0; 0, -0.5], [8, 8]), [8, 8; 8, -4]); control/inst/obsvf.m0000644000076500000240000000516312273411257014023 0ustar lukasstaff## Copyright (C) 2010 Benjamin Fernandez ## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{sysbar}, @var{T}, @var{K}] =} obsvf (@var{sys}) ## @deftypefnx{Function File} {[@var{sysbar}, @var{T}, @var{K}] =} obsvf (@var{sys}, @var{tol}) ## @deftypefnx{Function File} {[@var{Abar}, @var{Bbar}, @var{Cbar}, @var{T}, @var{K}] =} obsvf (@var{A}, @var{B}, @var{C}) ## @deftypefnx{Function File} {[@var{Abar}, @var{Bbar}, @var{Cbar}, @var{T}, @var{K}] =} obsvf (@var{A}, @var{B}, @var{C}, @var{TOL}) ## If Ob=obsv(A,C) has rank r <= n = SIZE(A,1), then there is a ## similarity transformation Tc such that To = [t1;t2] where t1 is c ## and t2 is orthogonal to t1 ## ## @example ## @group ## Abar = To \\ A * To , Bbar = To \\ B , Cbar = C * To ## @end group ## @end example ## ## and the transformed system has the form ## ## @example ## @group ## | Ao 0 | | Bo | ## Abar = |----------|, Bbar = | --- |, Cbar = [Co | 0 ]. ## | A21 Ano| | Bno | ## @end group ## @end example ## ## where (Ao,Bo) is observable, and Co(sI-Ao)^(-1)Bo = C(sI-A)^(-1)B. And ## system is detectable if Ano has no eigenvalues in the right ## half plane. The last output K is a vector of length n containing the ## number of observable states. ## @end deftypefn ## Author: Benjamin Fernandez ## Created: 2010-05-02 ## Version: 0.1 function [ac, bc, cc, z, ncont] = obsvf (a, b = [], c, tol = []) if (nargin < 1 || nargin > 4) print_usage (); endif if (isa (a, "lti")) if (nargin > 2) print_usage (); endif [ac, bc, cc] = ctrbf (a.', b); # [sysbar, z, ncont] = ctrbf (sys.', tol); ac = ac.'; z = ncont = []; else if (nargin < 3) print_usage (); endif [ac, tmp, cc, z, ncont] = ctrbf (a.', c.', b.', tol); ac = ac.'; bc = cc.'; cc = tmp.'; endif endfunction control/inst/options.m0000644000076500000240000000445512273411257014402 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {@var{opt} =} options (@var{'key1'}, @var{value1}, @var{'key2'}, @var{value2}, @dots{}) ## Create options struct @var{opt} from a number of key and value pairs. ## For use with order reduction and system identification functions. ## Option structs are a way to avoid typing the same key and value pairs ## over and over again. ## ## @strong{Inputs} ## @table @var ## @item key, property ## The name of the property. ## @item value ## The value of the property. ## @end table ## ## @strong{Outputs} ## @table @var ## @item opt ## Struct with fields for each key. ## @end table ## ## @strong{Example} ## @example ## @group ## octave:1> opt = options ("method", "spa", "tol", 1e-6) ## opt = ## ## scalar structure containing the fields: ## ## method = spa ## tol = 1.0000e-06 ## ## @end group ## @end example ## @example ## @group ## octave:2> save filename opt ## octave:3> # save the struct 'opt' to file 'filename' for later use ## octave:4> load filename ## octave:5> # load struct 'opt' from file 'filename' ## @end group ## @end example ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2011 ## Version: 0.1 function opt = options (varargin) if (nargin == 0) print_usage (); endif if (rem (nargin, 2)) error ("options: properties and values must come in pairs"); endif ## alternative: opt = struct (varargin{:}); key = reshape (varargin(1:2:end-1), [], 1); val = reshape (varargin(2:2:end), [], 1); opt = cell2struct (val, key, 1); opt = orderfields (opt); endfunction control/inst/optiPID.m0000644000076500000240000001671412273411257014220 0ustar lukasstaff%% -*- texinfo -*- %% Numerical optimization of a PID controller using an objective function. %% The objective function is located in the file @command{optiPIDfun}. %% Type @code{which optiPID} to locate, @code{edit optiPID} to open %% and simply @code{optiPID} to run the example file. %% In this example called @code{optiPID}, loosely based on [1], it is assumed %% that the plant %% @iftex %% @tex %% $$ P(s) = {1 \\over (s^{2} + s + 1)\\ (s + 1)^{4}} $$ %% @end tex %% @end iftex %% @ifnottex %% @example %% 1 %% P(s) = ----------------------- %% (s^2 + s + 1) (s + 1)^4 %% @end example %% @end ifnottex %% is controlled by a PID controller with second-order roll-off %% @iftex %% @tex %% $$ C(s) = k_p \\ (1 + {1 \\over T_i \\ s} + T_d \\ s) \\ {1 \\over (\\tau \\ s + 1)^{2}} $$ %% @end tex %% @end iftex %% @ifnottex %% @example %% 1 1 %% C(s) = Kp (1 + ---- + Td s) ------------- %% Ti s (tau s + 1)^2 %% @end example %% @end ifnottex %% in the usual negative feedback structure %% @iftex %% @tex %% $$ T(s) = {L(s) \\over 1 + L(s)} = {P(s) \\ C(s) \\over 1 + P(s) \\ C(s)} $$ %% @end tex %% @end iftex %% @ifnottex %% @example %% L(s) P(s) C(s) %% T(s) = -------- = ------------- %% 1 + L(s) 1 + P(s) C(s) %% @end example %% @end ifnottex %% The plant P(s) is of higher order but benign. The initial values for the %% controller parameters %% @iftex %% @tex %% $k_p$, $T_i$ and $T_d$ %% @end tex %% @end iftex %% @ifnottex %% Kp, Ti and Td %% @end ifnottex %% are obtained by applying the %% Astroem and Haegglund rules [2]. These values are to be improved using a %% numerical optimization as shown below. %% As with all numerical methods, this approach can never guarantee that a %% proposed solution is a global minimum. Therefore, good initial guesses for %% the parameters to be optimized are very important. %% The Octave function @code{fminsearch} minimizes the objective function @var{J}, %% which is chosen to be %% @iftex %% @tex %% $$ J(k_p, T_i, T_d) = \\mu_1 \\cdot \\int_0^{\\infty} \\! t \\ |e(t)| \\ dt \\ + \\ \\mu_2 \\cdot (|| y(t) ||_{\\infty} - 1) \\ + \\ \\mu_3 \\cdot ||S(jw)||_{\\infty} $$ %% @end tex %% @end iftex %% @ifnottex %% @example %% inf %% J(Kp, Ti, Td) = mu1 INT t |e(t)| dt + mu2 (||y(t)|| - 1) + mu3 ||S(jw)|| %% 0 inf inf %% @end example %% @end ifnottex %% This particular objective function penalizes the integral of time-weighted absolute error %% @iftex %% @tex %% $$ ITAE = \\int_0^{\\infty} \\! t \\ |e(t)| \\ dt $$ %% @end tex %% @end iftex %% @ifnottex %% @example %% inf %% ITAE = INT t |e(t)| dt %% 0 %% @end example %% @end ifnottex %% and the maximum overshoot %% @iftex %% @tex %% $$ y_{max} - 1 = || y(t) ||_{\\infty} - 1 $$ %% @end tex %% @end iftex %% @ifnottex %% @example %% y - 1 = ||y(t)|| - 1 %% max inf %% @end example %% @end ifnottex %% to a unity reference step %% @iftex %% @tex %% $r(t) = \\varepsilon (t)$ %% @end tex %% @end iftex %% in the time domain. In the frequency domain, the sensitivity %% @iftex %% @tex %% $$ M_s = ||S(jw)||_{\\infty} $$ %% @end tex %% @end iftex %% @ifnottex %% @example %% Ms = ||S(jw)|| %% inf %% @end example %% @end ifnottex %% is minimized for good robustness, where S(jw) denotes the @emph{sensitivity} transfer function %% @iftex %% @tex %% $$ S(s) = {1 \\over 1 + L(s)} = {1 \\over 1 + P(s) \\ C(s)} $$ %% @end tex %% @end iftex %% @ifnottex %% @example %% 1 1 %% S(s) = -------- = ------------- %% 1 + L(s) 1 + P(s) C(s) %% @end example %% @end ifnottex %% The constants %% @iftex %% @tex %% $\\mu_1$, $\\mu_2$ and $\\mu_3$ %% @end tex %% @end iftex %% @ifnottex %% mu1, mu2 and mu3 %% @end ifnottex %% are @emph{relative weighting factors} or @guillemetleft{}tuning knobs@guillemetright{} %% which reflect the importance of the different design goals. Varying these factors %% corresponds to changing the emphasis from, say, high performance to good robustness. %% The main advantage of this approach is the possibility to explore the tradeoffs of %% the design problem in a systematic way. %% In a first approach, all three design objectives are weigthed equally. %% In subsequent iterations, the parameters %% @iftex %% @tex %% $\\mu_1 = 1$, $\\mu_2 = 10$ and $\\mu_3 = 20$ %% @end tex %% @end iftex %% @ifnottex %% mu1 = 1, mu2 = 10 and mu3 = 20 %% @end ifnottex %% are found to yield satisfactory closed-loop performance. This controller results %% in a system with virtually no overshoot and a phase margin of 64 degrees. %% %% @*@strong{References}@* %% [1] Guzzella, L. %% @cite{Analysis and Design of SISO Control Systems}, %% VDF Hochschulverlag, ETH Zurich, 2007@* %% [2] Astroem, K. and Haegglund, T. %% @cite{PID Controllers: Theory, Design and Tuning}, %% Second Edition, %% Instrument Society of America, 1995 % =============================================================================== % optiPID Lukas Reichlin July 2009 % =============================================================================== % Numerical Optimization of an A/H PID Controller % Required OCTAVE Packages: control, optim (and its dependencies) % Required MATLAB Toolboxes: Control, Optimization % =============================================================================== % Tabula Rasa clear all, close all, clc; % Global Variables global P t dt mu_1 mu_2 mu_3 % Plant numP = [1]; denP = conv ([1, 1, 1], [1, 4, 6, 4, 1]); P = tf (numP, denP); % Relative Weighting Factors: PLAY AROUND WITH THESE! mu_1 = 1; % Minimize ITAE Criterion mu_2 = 10; % Minimize Max Overshoot mu_3 = 20; % Minimize Sensitivity Ms % Simulation Settings: PLANT-DEPENDENT! t_sim = 30; % Simulation Time [s] dt = 0.05; % Sampling Time [s] t = 0 : dt : t_sim; % Time Vector [s] % A/H PID Controller: Ms = 2.0 [gamma, phi, w_gamma, w_phi] = margin (P); ku = gamma; Tu = 2*pi / w_gamma; kappa = inv (dcgain (P)); disp ('optiPID: Astrom/Hagglund PID controller parameters:'); kp_AH = ku * 0.72 * exp ( -1.60 * kappa + 1.20 * kappa^2 ) Ti_AH = Tu * 0.59 * exp ( -1.30 * kappa + 0.38 * kappa^2 ) Td_AH = Tu * 0.15 * exp ( -1.40 * kappa + 0.56 * kappa^2 ) C_AH = optiPIDctrl (kp_AH, Ti_AH, Td_AH); % Initial Values C_par_0 = [kp_AH; Ti_AH; Td_AH]; % Optimization if (exist ('fminsearch')) warning ('optiPID: optimization starts, please be patient ...'); else error ('optiPID: please load/install optim package to proceed'); end C_par_opt = fminsearch (@optiPIDfun, C_par_0); % Optimized Controller disp ('optiPID: optimized PID controller parameters:'); kp_opt = C_par_opt(1) Ti_opt = C_par_opt(2) Td_opt = C_par_opt(3) C_opt = optiPIDctrl (kp_opt, Ti_opt, Td_opt); % Open Loop L_AH = P * C_AH; L_opt = P * C_opt; % Closed Loop T_AH = feedback (L_AH, 1); T_opt = feedback (L_opt, 1); % A Posteriori Stability Check disp ('optiPID: closed-loop stability check:'); st_AH = isstable (T_AH) st_opt = isstable (T_opt) % Stability Margins disp ('optiPID: gain margin gamma [-] and phase margin phi [deg]:'); [gamma_AH, phi_AH] = margin (L_AH) [gamma_opt, phi_opt] = margin (L_opt) % Plot Step Response figure (1) step (T_AH, 'b', T_opt, 'r', t) legend ('Astroem/Haegglund PID', 'Optimized PID', 'Location', 'SouthEast') % =============================================================================== control/inst/optiPIDctrl.m0000644000076500000240000000122212273411257015071 0ustar lukasstaff% =============================================================================== % optiPIDctrl Lukas Reichlin February 2012 % =============================================================================== % Return PID controller with roll-off for given parameters Kp, Ti and Td. % =============================================================================== function C = optiPIDctrl (Kp, Ti, Td) tau = Td / 10; % roll-off num = Kp * [Ti*Td, Ti, 1]; den = conv ([Ti, 0], [tau^2, 2*tau, 1]); C = tf (num, den); end % =============================================================================== control/inst/optiPIDfun.m0000644000076500000240000000310312273411257014715 0ustar lukasstaff% =============================================================================== % optiPIDfun Lukas Reichlin July 2009 % =============================================================================== % Objective Function % Reference: Guzzella, L. (2007) Analysis and Synthesis of SISO Control Systems. % vdf Hochschulverlag, Zurich % =============================================================================== function J = optiPIDfun (C_par) % Global Variables global P t dt mu_1 mu_2 mu_3 % Function Argument -> Controller Parameters kp = C_par(1); Ti = C_par(2); Td = C_par(3); % PID Controller with Roll-Off C = optiPIDctrl (kp, Ti, Td); % Open Loop L = P * C; % Sum Block: e = r - y SUM = ss ([1, -1]); % Matlab converts to SS (and back) for MIMO TF connections % Group Sum Block and Open Loop SUML = append (SUM, L); % Build System Interconnections CM = [3, 1; % Controller Input with Sum Block Output 2, 2]; % Sum Block Negative Input with Plant Output inputs = [1]; % Input 1: reference r(t) outputs = [1, 2]; % Output 1: error e(t), Output 2: output y(t) SUML = connect (SUML, CM, inputs, outputs); % Simulation [y, t_y] = step (SUML, t); % ITAE Criterion itae = dt * (t_y.' * abs (y(:, 1))); % Sensitivity S = inv (1 + L); Ms = norm (S, inf); % Objective Function J = mu_1 * itae + mu_2 * (max (y(:, 2)) - 1) + mu_3 * Ms; end % function % =============================================================================== control/inst/place.m0000644000076500000240000001406612273411257013772 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{f} =} place (@var{sys}, @var{p}) ## @deftypefnx {Function File} {@var{f} =} place (@var{a}, @var{b}, @var{p}) ## @deftypefnx {Function File} {[@var{f}, @var{info}] =} place (@var{sys}, @var{p}, @var{alpha}) ## @deftypefnx {Function File} {[@var{f}, @var{info}] =} place (@var{a}, @var{b}, @var{p}, @var{alpha}) ## Pole assignment for a given matrix pair (@var{A},@var{B}) such that @code{p = eig (A-B*F)}. ## If parameter @var{alpha} is specified, poles with real parts (continuous-time) ## or moduli (discrete-time) below @var{alpha} are left untouched. ## ## @strong{Inputs} ## @table @var ## @item sys ## Continuous- or discrete-time @acronym{LTI} system. ## @item a ## State matrix (n-by-n) of a continuous-time system. ## @item b ## Input matrix (n-by-m) of a continuous-time system. ## @item p ## Desired eigenvalues of the closed-loop system state-matrix @var{A-B*F}. ## @code{length (p) <= rows (A)}. ## @item alpha ## Specifies the maximum admissible value, either for real ## parts or for moduli, of the eigenvalues of @var{A} which will ## not be modified by the eigenvalue assignment algorithm. ## @code{alpha >= 0} for discrete-time systems. ## @end table ## ## @strong{Outputs} ## @table @var ## @item f ## State feedback gain matrix. ## @item info ## Structure containing additional information. ## @item info.nfp ## The number of fixed poles, i.e. eigenvalues of @var{A} having ## real parts less than @var{alpha}, or moduli less than @var{alpha}. ## These eigenvalues are not modified by @command{place}. ## @item info.nap ## The number of assigned eigenvalues. @code{nap = n-nfp-nup}. ## @item info.nup ## The number of uncontrollable eigenvalues detected by the ## eigenvalue assignment algorithm. ## @item info.z ## The orthogonal matrix @var{z} reduces the closed-loop ## system state matrix @code{A + B*F} to upper real Schur form. ## Note the positive sign in @code{A + B*F}. ## @end table ## ## @strong{Note} ## @example ## Place is also suitable to design estimator gains: ## @group ## L = place (A.', C.', p).' ## L = place (sys.', p).' # useful for discrete-time systems ## @end group ## @end example ## ## @strong{Algorithm}@* ## Uses SLICOT SB01BD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## @end deftypefn ## Special thanks to Peter Benner from TU Chemnitz for his advice. ## Author: Lukas Reichlin ## Created: December 2009 ## Version: 0.5 function [f, info] = place (a, b, p = [], alpha = [], tol = []) if (nargin < 2 || nargin > 5) print_usage (); endif if (isa (a, "lti")) # place (sys, p), place (sys, p, alpha), place (sys, p, alpha, tol) if (nargin > 4) # nargin < 2 already tested print_usage (); endif tol = alpha; alpha = p; p = b; sys = a; [a, b] = ssdata (sys); # descriptor matrice e should be regular discrete = ! isct (sys); # treat tsam = -2 as continuous system else # place (a, b, p), place (a, b, p, alpha), place (a, b, p, alpha, tol) if (nargin < 3) # nargin > 5 already tested print_usage (); endif if (! is_real_square_matrix (a) || ! is_real_matrix (b) || rows (a) != rows (b)) error ("place: matrices a and b not conformal"); endif discrete = 0; # assume continuous system endif if (! isnumeric (p) || ! isvector (p) || isempty (p)) # p could be complex error ("place: p must be a vector"); endif p = sort (reshape (p, [], 1)); # complex conjugate pairs must appear together wr = real (p); wi = imag (p); n = rows (a); # number of states np = length (p); # number of given eigenvalues if (np > n) error ("place: at most %d eigenvalues can be assigned for the given matrix a (%dx%d)", n, n, n); endif if (isempty (alpha)) if (discrete) alpha = 0; else alpha = - norm (a, inf); endif endif if (isempty (tol)) tol = 0; endif [f, nfp, nap, nup, z] = __sl_sb01bd__ (a, b, wr, wi, discrete, alpha, tol); f = -f; # A + B*F --> A - B*F info = struct ("nfp", nfp, "nap", nap, "nup", nup, "z", z); endfunction ## Test from "legacy" control package 1.0.* %!shared A, B, C, P, Kexpected %! A = [0, 1; 3, 2]; %! B = [0; 1]; %! C = [2, 1]; # C is needed for ss; it doesn't matter what the value of C is %! P = [-1, -0.5]; %! Kexpected = [3.5, 3.5]; %!assert (place (ss (A, B, C), P), Kexpected, 2*eps); %!assert (place (A, B, P), Kexpected, 2*eps); ## FIXME: Test from SLICOT example SB01BD fails with 4 eigenvalues in P %!shared F, F_exp, ev_ol, ev_cl %! A = [-6.8000 0.0000 -207.0000 0.0000 %! 1.0000 0.0000 0.0000 0.0000 %! 43.2000 0.0000 0.0000 -4.2000 %! 0.0000 0.0000 1.0000 0.0000]; %! %! B = [ 5.6400 0.0000 %! 0.0000 0.0000 %! 0.0000 1.1800 %! 0.0000 0.0000]; %! %! P = [-0.5000 + 0.1500i %! -0.5000 - 0.1500i]; #%! -2.0000 + 0.0000i #%! -0.4000 + 0.0000i]; %! %! ALPHA = -0.4; %! TOL = 1e-8; %! %! F = place (A, B, P, ALPHA, TOL); %! %! F_exp = - [-0.0876 -4.2138 0.0837 -18.1412 %! -0.0233 18.2483 -0.4259 -4.8120]; %! %! ev_ol = sort (eig (A)); %! ev_cl = sort (eig (A - B*F)); %! %!assert (F, F_exp, 1e-4); %!assert (ev_ol(3:4), ev_cl(3:4), 1e-4); control/inst/pzmap.m0000644000076500000240000000705012273411257014030 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {} pzmap (@var{sys}) ## @deftypefnx {Function File} {} pzmap (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) ## @deftypefnx {Function File} {} pzmap (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) ## @deftypefnx {Function File} {[@var{p}, @var{z}] =} pzmap (@var{sys}) ## Plot the poles and zeros of an LTI system in the complex plane. ## If no output arguments are given, the result is plotted on the screen. ## Otherwise, the poles and zeros are computed and returned. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. ## @item 'style' ## Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted ## black line. See @command{help plot} for details. ## @end table ## ## @strong{Outputs} ## @table @var ## @item p ## Poles of @var{sys}. ## @item z ## Transmission zeros of @var{sys}. ## @end table ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2009 ## Version: 0.2 function [pol_r, zer_r] = pzmap (varargin) if (nargin == 0) print_usage (); endif sys_idx = cellfun (@isa, varargin, {"lti"}); # look for LTI models pol = cellfun (@pole, varargin(sys_idx), "uniformoutput", false); zer = cellfun (@zero, varargin(sys_idx), "uniformoutput", false); if (! nargout) pol_re = cellfun (@real, pol, "uniformoutput", false); pol_im = cellfun (@imag, pol, "uniformoutput", false); zer_re = cellfun (@real, zer, "uniformoutput", false); zer_im = cellfun (@imag, zer, "uniformoutput", false); sys_idx = find (sys_idx); tmp = cellfun (@ischar, varargin); style_idx = find (tmp); len = numel (pol); pol_args = {}; zer_args = {}; legend_args = cell (len, 1); colororder = get (gca, "colororder"); rc = rows (colororder); for k = 1 : len col = colororder(1+rem (k-1, rc), :); if (k == len) lim = nargin; else lim = sys_idx(k+1); endif style = varargin(style_idx(style_idx > sys_idx(k) & style_idx <= lim)); if (isempty (style)) pol_args = cat (2, pol_args, pol_re{k}, pol_im{k}, {"x", "color", col}); zer_args = cat (2, zer_args, zer_re{k}, zer_im{k}, {"o", "color", col}); else pol_args = cat (2, pol_args, pol_re{k}, pol_im{k}, style); zer_args = cat (2, zer_args, zer_re{k}, zer_im{k}, style); endif try legend_args{k} = inputname(sys_idx(k)); catch legend_args{k} = ""; end_try_catch endfor ## FIXME: try to combine "x", "o" and style for custom colors h = plot (pol_args{:}, zer_args{:}); grid ("on") title ("Pole-Zero Map") xlabel ("Real Axis") ylabel ("Imaginary Axis") legend (h(1:len), legend_args) else pol_r = pol{1}; zer_r = zer{1}; endif endfunction control/inst/ramp.m0000644000076500000240000000704312273411257013642 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {} ramp (@var{sys}) ## @deftypefnx{Function File} {} ramp (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) ## @deftypefnx{Function File} {} ramp (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) ## @deftypefnx{Function File} {} ramp (@var{sys1}, @dots{}, @var{t}) ## @deftypefnx{Function File} {} ramp (@var{sys1}, @dots{}, @var{tfinal}) ## @deftypefnx{Function File} {} ramp (@var{sys1}, @dots{}, @var{tfinal}, @var{dt}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} ramp (@var{sys}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} ramp (@var{sys}, @var{t}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} ramp (@var{sys}, @var{tfinal}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} ramp (@var{sys}, @var{tfinal}, @var{dt}) ## Ramp response of @acronym{LTI} system. ## If no output arguments are given, the response is printed on the screen. ## @iftex ## @tex ## $$ r(t) = t \\, \\cdot \\, h(t) $$ ## @end tex ## @end iftex ## @ifnottex ## ## @example ## r(t) = t * h(t) ## @end example ## ## @end ifnottex ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. ## @item t ## Time vector. Should be evenly spaced. If not specified, it is calculated by ## the poles of the system to reflect adequately the response transients. ## @item tfinal ## Optional simulation horizon. If not specified, it is calculated by ## the poles of the system to reflect adequately the response transients. ## @item dt ## Optional sampling time. Be sure to choose it small enough to capture transient ## phenomena. If not specified, it is calculated by the poles of the system. ## @item 'style' ## Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted ## black line. See @command{help plot} for details. ## @end table ## ## @strong{Outputs} ## @table @var ## @item y ## Output response array. Has as many rows as time samples (length of t) ## and as many columns as outputs. ## @item t ## Time row vector. ## @item x ## State trajectories array. Has @code{length (t)} rows and as many columns as states. ## @end table ## ## @seealso{impulse, initial, lsim, step} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2012 ## Version: 0.1 function [y_r, t_r, x_r] = ramp (varargin) if (nargin == 0) print_usage (); endif if (nargout) sysname = {}; else sys_idx = find (cellfun (@isa, varargin, {"lti"})); len = length (sys_idx); sysname = cell (len, 1); for k = 1 : len try sysname{k} = inputname(sys_idx(k)); catch sysname{k} = ""; end_try_catch endfor endif [y, t, x] = __time_response__ ("ramp", varargin, sysname, ! nargout); if (nargout) y_r = y{1}; t_r = t{1}; x_r = x{1}; endif endfunction control/inst/rlocus.m0000644000076500000240000002336312273411257014215 0ustar lukasstaff## Copyright (C) 1996, 2000, 2004, 2005, 2006, 2007 ## Auburn University. All rights reserved. ## ## ## 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; see the file COPYING. If not, see ## . ## -*- texinfo -*- ## @deftypefn {Function File} {} rlocus (@var{sys}) ## @deftypefnx {Function File} {[@var{rldata}, @var{k}] =} rlocus (@var{sys}, @var{increment}, @var{min_k}, @var{max_k}) ## Display root locus plot of the specified @acronym{SISO} system. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. Must be a single-input and single-output (SISO) system. ## @item increment ## The increment used in computing gain values. ## @item min_k ## Minimum value of @var{k}. ## @item max_k ## Maximum value of @var{k}. ## @end table ## ## @strong{Outputs} ## @table @var ## @item rldata ## Data points plotted: in column 1 real values, in column 2 the imaginary values. ## @item k ## Gains for real axis break points. ## @end table ## ## @strong{Block Diagram} ## @example ## @group ## u + +---+ +------+ y ## ------>(+)----->| k |----->| SISO |-------+-------> ## ^ - +---+ +------+ | ## | | ## +---------------------------------+ ## @end group ## @end example ## @end deftypefn ## Author: David Clem ## Author: R. Bruce Tenison ## Updated by Kristi McGowan July 1996 for intelligent gain selection ## Updated by John Ingram July 1996 for systems ## Adapted-By: Lukas Reichlin ## Date: December 2009 ## Version: 0.4 ## TODO: Improve compatibility function [rldata_r, k_break, rlpol, gvec, real_ax_pts] = rlocus (sys, increment, min_k, max_k) ## TODO: multiplot feature: rlocus (sys1, "b", sys2, "r", ...) if (nargin < 1 || nargin > 4) print_usage (); endif if (! isa (sys, "lti") || ! issiso (sys)) error ("rlocus: first argument must be a SISO LTI model"); endif ## Convert the input to a transfer function if necessary [num, den] = tfdata (sys, "vector"); # extract numerator/denominator polynomials lnum = length (num); lden = length (den); ## equalize length of num, den polynomials ## TODO: handle case lnum > lden (non-proper models) if (lden < 2) error ("rlocus: system has no poles"); elseif (lnum < lden) num = [zeros(1,lden-lnum), num]; # so that derivative is shortened by one endif olpol = roots (den); olzer = roots (num); nas = lden - lnum; # number of asymptotes maxk = 0; if (nas > 0) cas = (sum (olpol) - sum (olzer)) / nas; angles = (2*[1:nas]-1)*pi/nas; ## printf("rlocus: there are %d asymptotes centered at %f\n", nas, cas); else cas = angles = []; maxk = 100*den(1)/num(1); endif ## compute real axis break points and corresponding gains dnum = polyder (num); dden = polyder (den); brkp = conv (den, dnum) - conv (num, dden); real_ax_pts = roots (brkp); real_ax_pts = real_ax_pts(find (imag (real_ax_pts) == 0)); k_break = -polyval (den, real_ax_pts) ./ polyval (num, real_ax_pts); idx = find (k_break >= 0); k_break = k_break(idx); real_ax_pts = real_ax_pts(idx); if (! isempty (k_break)) maxk = max (max (k_break), maxk); endif if (nas == 0) maxk = max (1, 2*maxk); # get at least some root locus else ## get distance from breakpoints, poles, and zeros to center of asymptotes dmax = 3*max (abs ([vec(olzer); vec(olpol); vec(real_ax_pts)] - cas)); if (dmax == 0) dmax = 1; endif ## get gain for dmax along each asymptote, adjust maxk if necessary svals = cas + dmax * exp (j*angles); kvals = -polyval (den, svals) ./ polyval (num, svals); maxk = max (maxk, max (real (kvals))); endif ## check for input arguments: if (nargin > 2) mink = min_k; else mink = 0; endif if (nargin > 3) maxk = max_k; endif if (nargin > 1) if (increment <= 0) error ("rlocus: increment must be positive"); else ngain = fix ((maxk-mink)/increment); endif else ngain = 30; endif ## vector of gains ngain = max (30, ngain); gvec = linspace (mink, maxk, ngain); if (length (k_break)) gvec = sort ([gvec, reshape(k_break, 1, [])]); endif ## Find the open loop zeros and the initial poles rlzer = roots (num); ## update num to be the same length as den lnum = length (num); if (lnum < lden) num = [zeros(1,lden - lnum),num]; endif ## compute preliminary pole sets nroots = lden - 1; for ii = 1:ngain gain = gvec(ii); rlpol(1:nroots,ii) = vec(sort (roots (den + gain*num))); endfor ## set smoothing tolerance smtolx = 0.01*(max (max (real (rlpol))) - min (min (real (rlpol)))); smtoly = 0.01*(max (max (imag (rlpol))) - min (min (imag (rlpol)))); smtol = max (smtolx, smtoly); ## sort according to nearest-neighbor rlpol = sort_roots (rlpol, smtolx, smtoly); done = (nargin == 4); # perform a smoothness check while (! done && ngain < 1000) done = 1 ; # assume done dp = abs (diff (rlpol.')).'; maxdp = max (dp); ## search for poles whose neighbors are distant if (lden == 2) idx = find (dp > smtol); else idx = find (maxdp > smtol); endif for ii = 1:length(idx) i1 = idx(ii); g1 = gvec(i1); p1 = rlpol(:,i1); i2 = idx(ii)+1; g2 = gvec(i2); p2 = rlpol(:,i2); ## isolate poles in p1, p2 if (max (abs (p2-p1)) > smtol) newg = linspace (g1, g2, 5); newg = newg(2:4); gvec = [gvec,newg]; done = 0; # need to process new gains endif endfor ## process new gain values ngain1 = length (gvec); for ii = (ngain+1):ngain1 gain = gvec(ii); rlpol(1:nroots,ii) = vec(sort (roots (den + gain*num))); endfor [gvec, idx] = sort (gvec); rlpol = rlpol(:,idx); ngain = length (gvec); ## sort according to nearest-neighbor rlpol = sort_roots (rlpol, smtolx, smtoly); endwhile rldata = rlpol; ## Plot the data if (nargout == 0) rlpolv = vec(rlpol); axdata = [real(rlpolv), imag(rlpolv); real(olzer), imag(olzer)]; axlim = __axis_limits__ (axdata); rldata = [real(rlpolv), imag(rlpolv) ]; %inname = get (sys, "inname"); %outname = get (sys, "outname"); ## build plot command args pole by pole n_rlpol = rows (rlpol); nelts = n_rlpol+1; if (! isempty (rlzer)) nelts++; endif ## add asymptotes n_A = length (olpol) - length (olzer); if (n_A > 0) nelts += n_A; endif args = cell (3, nelts); kk = 0; ## asymptotes first if (n_A > 0) len_A = 2*max (abs (axlim)); sigma_A = (sum(olpol) - sum(olzer))/n_A; for i_A=0:n_A-1 phi_A = pi*(2*i_A + 1)/n_A; args{1,++kk} = [sigma_A sigma_A+len_A*cos(phi_A)]; args{2,kk} = [0 len_A*sin(phi_A)]; if (i_A == 1) args{3,kk} = "k--;asymptotes;"; else args{3,kk} = "k--"; endif endfor endif ## locus next for ii = 1:rows(rlpol) args{1,++kk} = real (rlpol (ii,:)); args{2,kk} = imag (rlpol (ii,:)); if (ii == 1) args{3,kk} = "b-;locus;"; else args{3,kk} = "b-"; endif endfor ## poles and zeros last args{1,++kk} = real (olpol); args{2,kk} = imag (olpol); args{3,kk} = "rx;open loop poles;"; if (! isempty (rlzer)) args{1,++kk} = real (rlzer); args{2,kk} = imag (rlzer); args{3,kk} = "go;zeros;"; endif set (gcf,"visible","off"); hplt = plot (args{:}); set (hplt(kk--), "markersize", 2); if (! isempty (rlzer)) set (hplt(kk--), "markersize", 2); endif for ii = 1:rows(rlpol) set (hplt(kk--), "linewidth", 2); endfor legend ("boxon", 2); grid ("on"); axis (axlim); title (["Root Locus of ", inputname(1)]); xlabel (sprintf ("Real Axis gain = [%g, %g]", gvec(1), gvec(ngain))); ylabel ("Imaginary Axis"); set (gcf (), "visible", "on"); else rldata_r = rldata; endif endfunction function rlpol = sort_roots (rlpol, tolx, toly) ## no point sorting of you've only got one pole! if (rows (rlpol) == 1) return; endif ## reorder entries in each column of rlpol to be by their nearest-neighbors rlpol dp = diff (rlpol.').'; drp = max (real (dp)); dip = max (imag (dp)); idx = find (drp > tolx | dip > toly); if (isempty (idx)) return; endif [np, ng] = size (rlpol); # num poles, num gains for jj = idx vals = rlpol(:,[jj,jj+1]); jdx = (jj+1):ng; for ii = 1:rows(rlpol-1) rdx = ii:np; dval = abs (rlpol(rdx,jj+1)-rlpol(ii,jj)); mindist = min (dval); sidx = min (find (dval == mindist)) + ii - 1; if (sidx != ii) c1 = norm (diff(vals.')); [vals(ii,2), vals(sidx,2)] = swap (vals(ii,2), vals(sidx,2)); c2 = norm (diff (vals.')); if (c1 > c2) ## perform the swap [rlpol(ii,jdx), rlpol(sidx,jdx)] = swap (rlpol(ii,jdx), rlpol(sidx,jdx)); vals = rlpol(:,[jj,jj+1]); endif endif endfor endfor endfunction function [b, a] = swap (a, b) endfunction control/inst/sensitivity.m0000644000076500000240000001072312273411257015274 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{Ms}, @var{ws}] =} sensitivity (@var{L}) ## @deftypefnx{Function File} {[@var{Ms}, @var{ws}] =} sensitivity (@var{P}, @var{C}) ## @deftypefnx{Function File} {[@var{Ms}, @var{ws}] =} sensitivity (@var{P}, @var{C1}, @var{C2}, @dots{}) ## Return sensitivity margin @var{Ms}. ## The quantity @var{Ms} is simply the inverse of the shortest ## distance from the Nyquist curve to the critical point -1. ## Reasonable values of @var{Ms} are in the range from 1.3 to 2. ## @iftex ## @tex ## $$ M_s = ||S(j\\omega)||_{\\infty} $$ ## @end tex ## @end iftex ## @ifnottex ## ## @example ## Ms = ||S(jw)|| ## inf ## @end example ## ## @end ifnottex ## If no output arguments are given, the critical distance 1/Ms ## is plotted on a Nyquist diagram. ## In contrast to gain and phase margin as computed by command ## @command{margin}, the sensitivity @var{Ms} is a more robust ## criterion to assess the stability of a feedback system. ## ## @strong{Inputs} ## @table @var ## @item L ## Open loop transfer function. ## @var{L} can be any type of @acronym{LTI} system, but it must be square. ## @item P ## Plant model. Any type of @acronym{LTI} system. ## @item C ## Controller model. Any type of @acronym{LTI} system. ## @item C1, C2, @dots{} ## If several controllers are specified, command @command{sensitivity} ## computes the sensitivity @var{Ms} for each of them in combination ## with plant @var{P}. ## @end table ## ## @strong{Outputs} ## @table @var ## @item Ms ## Sensitivity margin @var{Ms} as defined in [1]. ## Scalar value. ## If several controllers are specified, @var{Ms} becomes ## a row vector with as many entries as controllers. ## @item ws ## The frequency [rad/s] corresponding to the sensitivity peak. ## Scalar value. ## If several controllers are specified, @var{ws} becomes ## a row vector with as many entries as controllers. ## @end table ## ## @strong{Algorithm}@* ## Uses SLICOT AB13DD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## to calculate the infinity norm of the sensitivity function. ## ## @strong{References}@* ## [1] Astr@"om, K. and H@"agglund, T. (1995) ## PID Controllers: ## Theory, Design and Tuning, ## Second Edition. ## Instrument Society of America. ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: August 2012 ## Version: 0.1 function [ret, ws] = sensitivity (G, varargin) if (nargin == 0) print_usage (); elseif (nargin == 1) # L := G L = G; I = eye (size (L)); S = feedback (I, L); # S = inv (I + L), S = feedback (I, L*-I, "+") [Ms, ws] = norm (S, inf); else # P := G, C := varargin L = cellfun (@(C) G*C, varargin, "uniformoutput", false); I = cellfun (@(L) eye (size (L)), L, "uniformoutput", false); S = cellfun (@feedback, I, L, "uniformoutput", false); [Ms, ws] = cellfun (@(S) norm (S, inf), S); endif if (nargout == 0) ## TODO: don't show entire Nyquist curve if critical distance becomes small on plot if (length (Ms) > 1) error ("sensitivity: plotting only works for a single controller"); endif if (iscell (L)) L = L{1}; endif if (! issiso (L)) error ("sensitivity: Nyquist plot requires SISO systems"); endif [H, w] = __frequency_response__ (L, false, "ext"); H = H(:); re = real (H); im = imag (H); Hs = freqresp (L, ws); res = real (Hs); ims = imag (Hs); plot (re, im, "b", [-1, res], [0, ims], "r") axis ("equal") xlim (__axis_margin__ (xlim)) ylim (__axis_margin__ (ylim)) grid ("on") title (sprintf ("Sensitivity Ms = %g (at %g rad/s)", Ms, ws)) xlabel ("Real Axis") ylabel ("Imaginary Axis") else ret = Ms; endif endfunction control/inst/sigma.m0000644000076500000240000001107212273411257014000 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {} sigma (@var{sys}) ## @deftypefnx {Function File} {} sigma (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) ## @deftypefnx {Function File} {} sigma (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}, @var{w}) ## @deftypefnx {Function File} {} sigma (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) ## @deftypefnx{Function File} {[@var{sv}, @var{w}] =} sigma (@var{sys}) ## @deftypefnx{Function File} {[@var{sv}, @var{w}] =} sigma (@var{sys}, @var{w}) ## Singular values of frequency response. If no output arguments are given, ## the singular value plot is printed on the screen. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} system. Multiple inputs and/or outputs (MIMO systems) make practical sense. ## @item w ## Optional vector of frequency values. If @var{w} is not specified, ## it is calculated by the zeros and poles of the system. ## Alternatively, the cell @code{@{wmin, wmax@}} specifies a frequency range, ## where @var{wmin} and @var{wmax} denote minimum and maximum frequencies ## in rad/s. ## @item 'style' ## Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted ## black line. See @command{help plot} for details. ## @end table ## ## @strong{Outputs} ## @table @var ## @item sv ## Array of singular values. For a system with m inputs and p outputs, the array sv ## has @code{min (m, p)} rows and as many columns as frequency points @code{length (w)}. ## The singular values at the frequency @code{w(k)} are given by @code{sv(:,k)}. ## @item w ## Vector of frequency values used. ## @end table ## ## @seealso{bodemag, svd} ## @end deftypefn ## Author: Lukas Reichlin ## Created: May 2009 ## Version: 0.7 function [sv_r, w_r] = sigma (varargin) if (nargin == 0) print_usage (); endif [H, w] = __frequency_response__ (varargin, true, "std", true); sv = cellfun (@(H) cellfun (@svd, H, "uniformoutput", false), H, "uniformoutput", false); sv = cellfun (@(sv) horzcat (sv{:}), sv, "uniformoutput", false); if (! nargout) # plot the information ## convert to dB for plotting sv_db = cellfun (@(sv) 20 * log10 (sv), sv, "uniformoutput", false); tmp = cellfun (@isa, varargin, {"lti"}); sys_idx = find (tmp); tmp = cellfun (@ischar, varargin); style_idx = find (tmp); len = numel (H); plot_args = {}; legend_args = cell (len, 1); colororder = get (gca, "colororder"); rc = rows (colororder); for k = 1:len col = colororder(1+rem (k-1, rc), :); if (k == len) lim = nargin; else lim = sys_idx(k+1); endif style = varargin(style_idx(style_idx > sys_idx(k) & style_idx <= lim)); if (isempty (style)) plot_args = cat (2, plot_args, w(k), sv_db(k), {"-", "color", col}); else plot_args = cat (2, plot_args, w(k), sv_db(k), style); endif try legend_args{k} = inputname(sys_idx(k)); # watch out for sigma (lticell{:}) catch legend_args{k} = ""; end_try_catch endfor ## adjust line colors in legend idx = horzcat (1, cellfun (@rows, sv_db)(1:end-1)); idx = cumsum (idx); ## plot results h = semilogx (plot_args{:}); axis ("tight") ylim (__axis_margin__ (ylim)) grid ("on") title ("Singular Values") xlabel ("Frequency [rad/s]") ylabel ("Singular Values [dB]") legend (h(idx), legend_args) else # return values sv_r = sv{1}; w_r = reshape (w{1}, [], 1); endif endfunction %!shared sv_exp, w_exp, sv_obs, w_obs %! A = [1, 2; 3, 4]; %! B = [5, 6; 7, 8]; %! C = [4, 3; 2, 1]; %! D = [8, 7; 6, 5]; %! w = [2, 3, 4]; %! sv_exp = [7.9176, 8.6275, 9.4393; %! 0.6985, 0.6086, 0.5195]; %! w_exp = [2; 3; 4]; %! [sv_obs, w_obs] = sigma (ss (A, B, C, D), w); %!assert (sv_obs, sv_exp, 1e-4); %!assert (w_obs, w_exp, 1e-4); control/inst/spaconred.m0000644000076500000240000001724112273411257014662 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{Kr}, @var{info}] =} spaconred (@var{G}, @var{K}, @dots{}) ## @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} spaconred (@var{G}, @var{K}, @var{ncr}, @dots{}) ## @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} spaconred (@var{G}, @var{K}, @var{opt}, @dots{}) ## @deftypefnx{Function File} {[@var{Kr}, @var{info}] =} spaconred (@var{G}, @var{K}, @var{ncr}, @var{opt}, @dots{}) ## ## Controller reduction by frequency-weighted Singular Perturbation Approximation (SPA). ## Given a plant @var{G} and a stabilizing controller @var{K}, determine a reduced ## order controller @var{Kr} such that the closed-loop system is stable and closed-loop ## performance is retained. ## ## The algorithm tries to minimize the frequency-weighted error ## @iftex ## @tex ## $$ || V \\ (K - K_r) \\ W ||_{\\infty} = \\min $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ||V (K-Kr) W|| = min ## inf ## @end example ## @end ifnottex ## where @var{V} and @var{W} denote output and input weightings. ## ## ## @strong{Inputs} ## @table @var ## @item G ## @acronym{LTI} model of the plant. ## It has m inputs, p outputs and n states. ## @item K ## @acronym{LTI} model of the controller. ## It has p inputs, m outputs and nc states. ## @item ncr ## The desired order of the resulting reduced order controller @var{Kr}. ## If not specified, @var{ncr} is chosen automatically according ## to the description of key @var{'order'}. ## @item @dots{} ## Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. ## @item opt ## Optional struct with keys as field names. ## Struct @var{opt} can be created directly or ## by command @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. ## @end table ## ## @strong{Outputs} ## @table @var ## @item Kr ## State-space model of reduced order controller. ## @item info ## Struct containing additional information. ## @table @var ## @item info.ncr ## The order of the obtained reduced order controller @var{Kr}. ## @item info.ncs ## The order of the alpha-stable part of original controller @var{K}. ## @item info.hsvc ## The Hankel singular values of the alpha-stable part of @var{K}. ## The @var{ncs} Hankel singular values are ordered decreasingly. ## @end table ## @end table ## ## @strong{Option Keys and Values} ## @table @var ## @item 'order', 'ncr' ## The desired order of the resulting reduced order controller @var{Kr}. ## If not specified, @var{ncr} is chosen automatically such that states with ## Hankel singular values @var{info.hsvc} > @var{tol1} are retained. ## ## @item 'method' ## Order reduction approach to be used as follows: ## @table @var ## @item 'sr', 's' ## Use the square-root Singular Perturbation Approximation method. ## @item 'bfsr', 'p' ## Use the balancing-free square-root Singular Perturbation Approximation method. Default method. ## @end table ## ## @item 'weight' ## Specifies the type of frequency-weighting as follows: ## @table @var ## @item 'none' ## No weightings are used (V = I, W = I). ## ## @item 'left', 'output' ## Use stability enforcing left (output) weighting ## @iftex ## @tex ## $$ V = (I - G K)^{-1} G, \\qquad W = I $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## -1 ## V = (I-G*K) *G , W = I ## @end example ## @end ifnottex ## ## @item 'right', 'input' ## Use stability enforcing right (input) weighting ## @iftex ## @tex ## $$ V = I, \\qquad W = (I - G K)^{-1} G $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## -1 ## V = I , W = (I-G*K) *G ## @end example ## @end ifnottex ## ## @item 'both', 'performance' ## Use stability and performance enforcing weightings ## @iftex ## @tex ## $$ V = (I - G K)^{-1} G, \\qquad W = (I - G K)^{-1} $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## -1 -1 ## V = (I-G*K) *G , W = (I-G*K) ## @end example ## @end ifnottex ## Default value. ## @end table ## ## @item 'feedback' ## Specifies whether @var{K} is a positive or negative feedback controller: ## @table @var ## @item '+' ## Use positive feedback controller. Default value. ## @item '-' ## Use negative feedback controller. ## @end table ## ## @item 'alpha' ## Specifies the ALPHA-stability boundary for the eigenvalues ## of the state dynamics matrix @var{K.A}. For a continuous-time ## controller, ALPHA <= 0 is the boundary value for ## the real parts of eigenvalues, while for a discrete-time ## controller, 0 <= ALPHA <= 1 represents the ## boundary value for the moduli of eigenvalues. ## The ALPHA-stability domain does not include the boundary. ## Default value is 0 for continuous-time controllers and ## 1 for discrete-time controllers. ## ## @item 'tol1' ## If @var{'order'} is not specified, @var{tol1} contains the tolerance for ## determining the order of the reduced controller. ## For model reduction, the recommended value of @var{tol1} is ## c*info.hsvc(1), where c lies in the interval [0.00001, 0.001]. ## Default value is info.ncs*eps*info.hsvc(1). ## If @var{'order'} is specified, the value of @var{tol1} is ignored. ## ## @item 'tol2' ## The tolerance for determining the order of a minimal ## realization of the ALPHA-stable part of the given ## controller. TOL2 <= TOL1. ## If not specified, ncs*eps*info.hsvc(1) is chosen. ## ## @item 'gram-ctrb' ## Specifies the choice of frequency-weighted controllability ## Grammian as follows: ## @table @var ## @item 'standard' ## Choice corresponding to standard Enns' method [1]. Default method. ## @item 'enhanced' ## Choice corresponding to the stability enhanced ## modified Enns' method of [2]. ## @end table ## ## @item 'gram-obsv' ## Specifies the choice of frequency-weighted observability ## Grammian as follows: ## @table @var ## @item 'standard' ## Choice corresponding to standard Enns' method [1]. Default method. ## @item 'enhanced' ## Choice corresponding to the stability enhanced ## modified Enns' method of [2]. ## @end table ## ## @item 'equil', 'scale' ## Boolean indicating whether equilibration (scaling) should be ## performed on @var{G} and @var{K} prior to order reduction. ## Default value is false if both @code{G.scaled == true, K.scaled == true} ## and true otherwise. ## Note that for @acronym{MIMO} models, proper scaling of both inputs and outputs ## is of utmost importance. The input and output scaling can @strong{not} ## be done by the equilibration option or the @command{prescale} command ## because these functions perform state transformations only. ## Furthermore, signals should not be scaled simply to a certain range. ## For all inputs (or outputs), a certain change should be of the same ## importance for the model. ## @end table ## ## @strong{Algorithm}@* ## Uses SLICOT SB16AD by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## @end deftypefn ## Author: Lukas Reichlin ## Created: December 2011 ## Version: 0.1 function [Kr, info] = spaconred (varargin) [Kr, info] = __conred_sb16ad__ ("spa", varargin{:}); endfunction ## TODO: add a test control/inst/spamodred.m0000644000076500000240000002035012273411257014655 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{Gr}, @var{info}] =} spamodred (@var{G}, @dots{}) ## @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} spamodred (@var{G}, @var{nr}, @dots{}) ## @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} spamodred (@var{G}, @var{opt}, @dots{}) ## @deftypefnx{Function File} {[@var{Gr}, @var{info}] =} spamodred (@var{G}, @var{nr}, @var{opt}, @dots{}) ## ## Model order reduction by frequency weighted Singular Perturbation Approximation (SPA). ## The aim of model reduction is to find an @acronym{LTI} system @var{Gr} of order ## @var{nr} (nr < n) such that the input-output behaviour of @var{Gr} ## approximates the one from original system @var{G}. ## ## SPA is an absolute error method which tries to minimize ## @iftex ## @tex ## $$ || G - G_r ||_{\\infty} = \\min $$ ## $$ || V \\ (G - G_r) \\ W ||_{\\infty} = \\min $$ ## @end tex ## @end iftex ## @ifnottex ## @example ## ||G-Gr|| = min ## inf ## ## ||V (G-Gr) W|| = min ## inf ## @end example ## @end ifnottex ## where @var{V} and @var{W} denote output and input weightings. ## ## ## @strong{Inputs} ## @table @var ## @item G ## @acronym{LTI} model to be reduced. ## @item nr ## The desired order of the resulting reduced order system @var{Gr}. ## If not specified, @var{nr} is chosen automatically according ## to the description of key @var{'order'}. ## @item @dots{} ## Optional pairs of keys and values. @code{"key1", value1, "key2", value2}. ## @item opt ## Optional struct with keys as field names. ## Struct @var{opt} can be created directly or ## by command @command{options}. @code{opt.key1 = value1, opt.key2 = value2}. ## @end table ## ## @strong{Outputs} ## @table @var ## @item Gr ## Reduced order state-space model. ## @item info ## Struct containing additional information. ## @table @var ## @item info.n ## The order of the original system @var{G}. ## @item info.ns ## The order of the @var{alpha}-stable subsystem of the original system @var{G}. ## @item info.hsv ## The Hankel singular values of the @var{alpha}-stable part of ## the original system @var{G}, ordered decreasingly. ## @item info.nu ## The order of the @var{alpha}-unstable subsystem of both the original ## system @var{G} and the reduced-order system @var{Gr}. ## @item info.nr ## The order of the obtained reduced order system @var{Gr}. ## @end table ## @end table ## ## ## @strong{Option Keys and Values} ## @table @var ## @item 'order', 'nr' ## The desired order of the resulting reduced order system @var{Gr}. ## If not specified, @var{nr} is chosen automatically such that states with ## Hankel singular values @var{info.hsv} > @var{tol1} are retained. ## ## @item 'left', 'output' ## @acronym{LTI} model of the left/output frequency weighting @var{V}. ## Default value is an identity matrix. ## ## @item 'right', 'input' ## @acronym{LTI} model of the right/input frequency weighting @var{W}. ## Default value is an identity matrix. ## ## @item 'method' ## Approximation method for the L-infinity norm to be used as follows: ## @table @var ## @item 'sr', 's' ## Use the square-root Singular Perturbation Approximation method. ## @item 'bfsr', 'p' ## Use the balancing-free square-root Singular Perturbation Approximation method. Default method. ## @end table ## ## @item 'alpha' ## Specifies the ALPHA-stability boundary for the eigenvalues ## of the state dynamics matrix @var{G.A}. For a continuous-time ## system, ALPHA <= 0 is the boundary value for ## the real parts of eigenvalues, while for a discrete-time ## system, 0 <= ALPHA <= 1 represents the ## boundary value for the moduli of eigenvalues. ## The ALPHA-stability domain does not include the boundary. ## Default value is 0 for continuous-time systems and ## 1 for discrete-time systems. ## ## @item 'tol1' ## If @var{'order'} is not specified, @var{tol1} contains the tolerance for ## determining the order of the reduced model. ## For model reduction, the recommended value of @var{tol1} is ## c*info.hsv(1), where c lies in the interval [0.00001, 0.001]. ## Default value is info.ns*eps*info.hsv(1). ## If @var{'order'} is specified, the value of @var{tol1} is ignored. ## ## @item 'tol2' ## The tolerance for determining the order of a minimal ## realization of the ALPHA-stable part of the given ## model. TOL2 <= TOL1. ## If not specified, ns*eps*info.hsv(1) is chosen. ## ## @item 'gram-ctrb' ## Specifies the choice of frequency-weighted controllability ## Grammian as follows: ## @table @var ## @item 'standard' ## Choice corresponding to a combination method [4] ## of the approaches of Enns [1] and Lin-Chiu [2,3]. Default method. ## @item 'enhanced' ## Choice corresponding to the stability enhanced ## modified combination method of [4]. ## @end table ## ## @item 'gram-obsv' ## Specifies the choice of frequency-weighted observability ## Grammian as follows: ## @table @var ## @item 'standard' ## Choice corresponding to a combination method [4] ## of the approaches of Enns [1] and Lin-Chiu [2,3]. Default method. ## @item 'enhanced' ## Choice corresponding to the stability enhanced ## modified combination method of [4]. ## @end table ## ## @item 'alpha-ctrb' ## Combination method parameter for defining the ## frequency-weighted controllability Grammian. ## abs(alphac) <= 1. ## If alphac = 0, the choice of ## Grammian corresponds to the method of Enns [1], while if ## alphac = 1, the choice of Grammian corresponds ## to the method of Lin and Chiu [2,3]. ## Default value is 0. ## ## @item 'alpha-obsv' ## Combination method parameter for defining the ## frequency-weighted observability Grammian. ## abs(alphao) <= 1. ## If alphao = 0, the choice of ## Grammian corresponds to the method of Enns [1], while if ## alphao = 1, the choice of Grammian corresponds ## to the method of Lin and Chiu [2,3]. ## Default value is 0. ## ## @item 'equil', 'scale' ## Boolean indicating whether equilibration (scaling) should be ## performed on system @var{G} prior to order reduction. ## Default value is true if @code{G.scaled == false} and ## false if @code{G.scaled == true}. ## Note that for @acronym{MIMO} models, proper scaling of both inputs and outputs ## is of utmost importance. The input and output scaling can @strong{not} ## be done by the equilibration option or the @command{prescale} command ## because these functions perform state transformations only. ## Furthermore, signals should not be scaled simply to a certain range. ## For all inputs (or outputs), a certain change should be of the same ## importance for the model. ## @end table ## ## ## @strong{References}@* ## [1] Enns, D. ## @cite{Model reduction with balanced realizations: An error bound ## and a frequency weighted generalization}. ## Proc. 23-th CDC, Las Vegas, pp. 127-132, 1984. ## ## [2] Lin, C.-A. and Chiu, T.-Y. ## @cite{Model reduction via frequency-weighted balanced realization}. ## Control Theory and Advanced Technology, vol. 8, ## pp. 341-351, 1992. ## ## [3] Sreeram, V., Anderson, B.D.O and Madievski, A.G. ## @cite{New results on frequency weighted balanced reduction ## technique}. ## Proc. ACC, Seattle, Washington, pp. 4004-4009, 1995. ## ## [4] Varga, A. and Anderson, B.D.O. ## @cite{Square-root balancing-free methods for the frequency-weighted ## balancing related model reduction}. ## (report in preparation) ## ## ## @strong{Algorithm}@* ## Uses SLICOT AB09ID by courtesy of ## @uref{http://www.slicot.org, NICONET e.V.} ## @end deftypefn ## Author: Lukas Reichlin ## Created: November 2011 ## Version: 0.1 function [Gr, info] = spamodred (varargin) [Gr, info] = __modred_ab09id__ ("spa", varargin{:}); endfunction ## TODO: add a test control/inst/step.m0000644000076500000240000000657012273411257013662 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {} step (@var{sys}) ## @deftypefnx{Function File} {} step (@var{sys1}, @var{sys2}, @dots{}, @var{sysN}) ## @deftypefnx{Function File} {} step (@var{sys1}, @var{'style1'}, @dots{}, @var{sysN}, @var{'styleN'}) ## @deftypefnx{Function File} {} step (@var{sys1}, @dots{}, @var{t}) ## @deftypefnx{Function File} {} step (@var{sys1}, @dots{}, @var{tfinal}) ## @deftypefnx{Function File} {} step (@var{sys1}, @dots{}, @var{tfinal}, @var{dt}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} step (@var{sys}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} step (@var{sys}, @var{t}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} step (@var{sys}, @var{tfinal}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} step (@var{sys}, @var{tfinal}, @var{dt}) ## Step response of @acronym{LTI} system. ## If no output arguments are given, the response is printed on the screen. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model. ## @item t ## Time vector. Should be evenly spaced. If not specified, it is calculated by ## the poles of the system to reflect adequately the response transients. ## @item tfinal ## Optional simulation horizon. If not specified, it is calculated by ## the poles of the system to reflect adequately the response transients. ## @item dt ## Optional sampling time. Be sure to choose it small enough to capture transient ## phenomena. If not specified, it is calculated by the poles of the system. ## @item 'style' ## Line style and color, e.g. 'r' for a solid red line or '-.k' for a dash-dotted ## black line. See @command{help plot} for details. ## @end table ## ## @strong{Outputs} ## @table @var ## @item y ## Output response array. Has as many rows as time samples (length of t) ## and as many columns as outputs. ## @item t ## Time row vector. ## @item x ## State trajectories array. Has @code{length (t)} rows and as many columns as states. ## @end table ## ## @seealso{impulse, initial, lsim} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2009 ## Version: 0.2 function [y_r, t_r, x_r] = step (varargin) if (nargin == 0) print_usage (); endif if (nargout) sysname = {}; else sys_idx = find (cellfun (@isa, varargin, {"lti"})); len = length (sys_idx); sysname = cell (len, 1); for k = 1 : len try sysname{k} = inputname(sys_idx(k)); catch sysname{k} = ""; end_try_catch endfor endif [y, t, x] = __time_response__ ("step", varargin, sysname, ! nargout); if (nargout) y_r = y{1}; t_r = t{1}; x_r = x{1}; endif endfunction control/inst/strseq.m0000644000076500000240000000256712273411257014232 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{strvec} =} strseq (@var{str}, @var{idx}) ## Return a cell vector of indexed strings by appending the indices @var{idx} ## to the string @var{str}. ## ## @example ## strseq ("x", 1:3) = @{"x1"; "x2"; "x3"@} ## strseq ("u", [1, 2, 5]) = @{"u1"; "u2"; "u5"@} ## @end example ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.3 function strvec = strseq (str, idx) if (nargin != 2 || ! ischar (str) || ! isnumeric (idx)) print_usage (); endif strvec = arrayfun (@(x) sprintf ("%s%d", str, x), idx(:), "uniformoutput", false); endfunction control/inst/sumblk.m0000644000076500000240000000650212273411257014177 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn{Function File} {@var{S} =} sumblk (@var{formula}) ## @deftypefnx{Function File} {@var{S} =} sumblk (@var{formula}, @var{n}) ## Create summing junction @var{S} from string @var{formula} ## for name-based interconnections. ## ## @strong{Inputs} ## @table @var ## @item formula ## String containing the formula of the summing junction, ## e.g. @code{e = r - y + d} ## @item n ## Signal size. Default value is 1. ## @end table ## ## @strong{Outputs} ## @table @var ## @item S ## State-space model of the summing junction. ## @end table ## ## @strong{Example} ## @example ## @group ## octave:1> S = sumblk ('e = r - y + d') ## ## S.d = ## r y d ## e 1 -1 1 ## ## Static gain. ## octave:2> S = sumblk ('e = r - y + d', 2) ## ## S.d = ## r1 r2 y1 y2 d1 d2 ## e1 1 0 -1 0 1 0 ## e2 0 1 0 -1 0 1 ## ## Static gain. ## @end group ## @end example ## @seealso{connect} ## @end deftypefn ## Author: Lukas Reichlin ## Created: October 2013 ## Version: 0.1 function s = sumblk (formula, n = 1) if (nargin == 0 || nargin > 2) print_usage (); endif if (! ischar (formula)) error ("sumblk: require string as first argument"); endif if (! is_real_scalar (n)) error ("sumblk: require integer as second argument"); endif if (length (strfind (formula, "=")) != 1) error ("sumblk: formula requires exactly one '='"); endif ## if the first signal has no sign, add a plus if (isempty (regexp (formula, "=\\s*[+-]", "once"))) formula = regexprep (formula, "=", "=+", "once"); endif ## extract operators, remove "=" from formula operator = regexp (formula, "[=+-]", "match"); if (! strcmp (operator{1}, "=")) error ("sumblk: formula has misplaced '='"); endif operator = operator(2:end); formula = formula(formula != "="); ## extract signal names signal = regexp (formula, "\\s*[+-]\\s*", "split"); if (any (cellfun (@isempty, signal))) error ("sumblk: formula is missing some input/output names"); endif outname = signal(1); inname = signal(2:end); signs = ones (1, numel (inname)); signs(strcmp (operator, "-")) = -1; if (n != 1) outname = strseq (outname{1}, 1:n); tmp = cellfun (@strseq, inname, {1:n}, "uniformoutput", false); inname = vertcat (tmp{:}); endif d = kron (signs, eye (n)); s = ss (d); s = set (s, "inname", inname, "outname", outname); ## NOTE: the dark side returns a tf, but i prefer an ss model ## because in general, transfer functions and mimo ## interconnections don't mix well endfunction control/inst/test_control.m0000644000076500000240000000612112273411257015416 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Script File} {} test_control ## Execute all available tests at once. ## The Octave control package is based on the @uref{http://www.slicot.org, @acronym{SLICOT}} library. ## @acronym{SLICOT} needs @acronym{BLAS} and @acronym{LAPACK} libraries which are also prerequisites ## for Octave itself. ## In case of failing tests, it is highly recommended to use ## @uref{http://www.netlib.org/blas/, Netlib's reference @acronym{BLAS}} and ## @uref{http://www.netlib.org/lapack/, @acronym{LAPACK}} ## for building Octave. Using @acronym{ATLAS} may lead to sign changes ## in some entries of the state-space matrices. ## In general, these sign changes are not 'wrong' and can be regarded as ## the result of state transformations. Such state transformations ## (but not input/output transformations) have no influence on the ## input-output behaviour of the system. For better numerics, ## the control package uses such transformations by default when ## calculating the frequency responses and a few other things. ## However, arguments like the Hankel singular Values (@acronym{HSV}) must not change. ## Differing @acronym{HSV}s and failing algorithms are known for using Framework Accelerate ## from Mac OS X 10.7. ## @end deftypefn ## Author: Lukas Reichlin ## Created: May 2010 ## Version: 0.5 ## test collection test ltimodels ## LTI methods test @lti/c2d test @lti/connect test @lti/d2c test @lti/d2d test @lti/feedback test @lti/horzcat test @lti/inv test @lti/minreal test @lti/mtimes test @lti/norm test @lti/plus test @lti/prescale test @lti/sminreal test @lti/subsref test @lti/zero ## robust control test h2syn test hinfsyn test ncfsyn ## ARE solvers test care test dare test kalman ## Lyapunov test covar test dlyap ## test dlyapchol # TODO: add tests test gram test lyap test lyapchol ## model order reduction test bstmodred test btamodred test hnamodred ## test spamodred # TODO: create test case ## controller order reduction test btaconred test cfconred test fwcfconred ## test spaconred # TODO: create test case ## various oct-files test ctrbf test hsvd test place ## various m-files test db2mag test ctrb test filt test initial test issample test mag2db test margin test obsv test sigma test thiran test __dss2ss__ ## identification test @iddata/iddata test @iddata/cat test @iddata/detrend test @iddata/fft test fitfrd test moen4 control/inst/tfpoly2str.m0000644000076500000240000000461112273411257015031 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{str} =} tfpoly2str (@var{p}) ## @deftypefnx {Function File} {@var{str} =} tfpoly2str (@var{p}, @var{tfvar}) ## Return the string of a polynomial with string @var{tfvar} as variable. ## @end deftypefn ## Author: Lukas Reichlin ## Created: May 2012 ## Version: 0.1 function str = tfpoly2str (p, tfvar = "x") ## TODO: simplify this ugly code str = ""; lp = numel (p); if (lp > 0) # first element (lowest order) idx = find (p); # first non-zero element if (isempty (idx)) str = "0"; return; else idx = idx(1); endif a = p(idx); if (a < 0) cs = "-"; else cs = ""; endif if (idx == 1) str = [cs, num2str(abs (a), 4)]; else if (abs (a) == 1) str = [cs, __variable__(tfvar, idx-1)]; else str = [cs, __coefficient__(a), " ", __variable__(tfvar, idx-1)]; endif endif if (lp > idx) # remaining elements of higher order for k = idx+1 : lp a = p(k); if (a != 0) if (a < 0) cs = " - "; else cs = " + "; endif if (abs (a) == 1) str = [str, cs, __variable__(tfvar, k-1)]; else str = [str, cs, __coefficient__(a), " ", __variable__(tfvar, k-1)]; endif endif endfor endif endif endfunction function str = __coefficient__ (a) b = abs (a); if (b == 1) str = ""; else str = num2str (b, 4); endif endfunction function str = __variable__ (tfvar, n) str = [tfvar, "^-", num2str(n)]; endfunction control/inst/tfpolyones.m0000644000076500000240000000177612273411257015114 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Return (pxm) cell of tfpoly([1]). For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function ret = tfpolyones (p, m) ret = cell (p, m); one = tfpoly ([1]); ret(:) = {one}; endfunction control/inst/tfpolyzeros.m0000644000076500000240000000200112273411257015270 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## Return (pxm) cell of tfpoly([0]). For internal use only. ## Author: Lukas Reichlin ## Created: September 2009 ## Version: 0.1 function ret = tfpolyzeros (p, m) ret = cell (p, m); zero = tfpoly ([0]); ret(:) = {zero}; endfunction control/inst/thiran.m0000644000076500000240000000735512273411257014176 0ustar lukasstaff## Copyright (C) 2013 Thomas Vasileiou ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} thiran (@var{tau}, @var{tsam}) ## Approximation of continuous-time delay using a discrete-time ## allpass Thiran filter. ## ## Thiran filters can approximate continuous-time delays that are ## non-integer multiples of the sampling time (fractional delays). ## This approximation gives a better matching of the phase shift ## between the continuous- and the discrete-time system. ## If there is no fractional part in the delay, then the standard ## discrete-time delay representation is used. ## ## @strong{Inputs} ## @table @var ## @item tau ## A continuous-time delay, given in time units (seconds). ## @item tsam ## The sampling time of the resulting Thiran filter. ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## Transfer function model of the resulting filter. ## The order of the filter is determined automatically. ## @end table ## ## @strong{Example} ## @example ## @group ## octave:1> sys = thiran (1.33, 0.5) ## ## Transfer function 'sys' from input 'u1' to output ... ## ## 0.003859 z^3 - 0.03947 z^2 + 0.2787 z + 1 ## y1: ----------------------------------------- ## z^3 + 0.2787 z^2 - 0.03947 z + 0.003859 ## ## Sampling time: 0.5 s ## Discrete-time model. ## @end group ## @end example ## @example ## @group ## octave:2> sys = thiran (1, 0.5) ## ## Transfer function 'sys' from input 'u1' to output ... ## ## 1 ## y1: --- ## z^2 ## ## Sampling time: 0.5 s ## Discrete-time model. ## @end group ## @end example ## ## @seealso{absorbdelay, pade} ## @end deftypefn ## Author: Thomas Vasileiou ## Created: January 2013 ## Version: 0.1 function sys = thiran (del, tsam) ## check args if (nargin != 2) print_usage (); endif if (! issample (del, 0)) error ("thiran: the delay parameter 'tau' must be a non-negative scalar."); endif if (! issample (tsam)) error ("thiran: the second parameter 'tsam' is not a valid sampling time."); endif if (del == 0) sys = tf (1); return; endif ## find fractional and discrete delay N = floor (del/tsam + eps); # put eps or sometimes it misses d = del - N*tsam; ## check if we do need a thiran filter if (d/tsam < eps) sys = tf (1, [1, zeros(1, N)], tsam); else ## make filter order ~ del to ensure stability N = N + 1; # order of the filter d = del/tsam; tmp = ((d-N+(0:N).') * ones (1,N)) ./ (d-N + bsxfun (@plus, 1:N, (0:N).')); a = horzcat (1, (-1).^(1:N) .* bincoeff (N, 1:N) .* prod (tmp)); sys = tf (fliplr (a), a, tsam); endif endfunction %!shared num, den, expc %! expc = [1, 0.5294, -0.04813, 0.004159]; %! sys = thiran (2.4, 1); %! [num, den] = tfdata (sys, "vector"); %!assert (den, expc, 1e-4); %!assert (num, fliplr (expc), 1e-4); %!shared num, den %! sys = thiran (0.5, 0.1); %! [num, den] = tfdata (sys, "vector"); %!assert (den, [1, 0, 0, 0, 0, 0], eps); %!assert (num, 1, eps); %!error (thiran (-1, 1)); %!error (thiran (1, -1)); %!error (thiran ([1 2 3], 1)); control/inst/WestlandLynx.m0000644000076500000240000001067312273411257015342 0ustar lukasstaff## -*- texinfo -*- ## @deftypefn{Function File} {@var{sys} =} WestlandLynx () ## Model of the Westland Lynx Helicopter about hover. ## @example ## @group ## INPUTS ## main rotor collective ## longitudinal cyclic ## lateral cyclic ## tail rotor collective ## @end group ## @end example ## @example ## @group ## STATES ## pitch attitude theta [rad] ## roll attitude phi [rad] ## roll rate (body-axis) p [rad/s] ## pitch rate (body-axis) q [rad/s] ## yaw rate xi [rad/s] ## forward velocity v_x [ft/s] ## lateral velocity v_y [ft/s] ## vertical velocity v_z [ft/s] ## @end group ## @end example ## @example ## @group ## OUTPUTS ## heave velocity H_dot [ft/s] ## pitch attitude theta [rad] ## roll attitude phi [rad] ## heading rate psi_dot [rad/s] ## roll rate p [rad/s] ## pitch rate q [rad/s] ## @end group ## @end example ## ## @strong{References}@* ## [1] Skogestad, S. and Postlethwaite I. (2005) ## @cite{Multivariable Feedback Control: Analysis and Design: ## Second Edition}. Wiley. ## @url{http://www.nt.ntnu.no/users/skoge/book/2nd_edition/matlab_m/matfiles.html} ## ## @end deftypefn ## Author: Lukas Reichlin ## Created: January 2010 ## Version: 0.1 function sys = WestlandLynx () if (nargin) print_usage (); endif a01 = [ 0 0 0 0.99857378005981; 0 0 1.00000000000000 -0.00318221934140; 0 0 -11.57049560546880 -2.54463768005371; 0 0 0.43935656547546 -1.99818229675293; 0 0 -2.04089546203613 -0.45899915695190; -32.10360717773440 0 -0.50335502624512 2.29785919189453; 0.10216116905212 32.05783081054690 -2.34721755981445 -0.50361156463623; -1.91097259521484 1.71382904052734 -0.00400543212891 -0.05741119384766]; a02 = [ 0.05338427424431 0 0 0; 0.05952465534210 0 0 0; -0.06360262632370 0.10678052902222 -0.09491866827011 0.00710757449269; 0 0.01665188372135 0.01846204698086 -0.00118747074157; -0.73502779006958 0.01925575733185 -0.00459562242031 0.00212036073208; 0 -0.02121581137180 -0.02116791903973 0.01581159234047; 0.83494758605957 0.02122657001019 -0.03787973523140 0.00035400385968; 0 0.01398963481188 -0.00090675335377 -0.29051351547241]; a0 = [a01 a02]; b0 = [ 0 0 0 0; 0 0 0 0; 0.12433505058289 0.08278584480286 -2.75247764587402 -0.01788876950741; -0.03635892271996 0.47509527206421 0.01429074257612 0; 0.30449151992798 0.01495801657438 -0.49651837348938 -0.20674192905426; 0.28773546218872 -0.54450607299805 -0.01637935638428 0; -0.01907348632812 0.01636743545532 -0.54453611373901 0.23484230041504; -4.82063293457031 -0.00038146972656 0 0]; c0 = [ 0 0 0 0 0 0.0595 0.05329 -0.9968; 1.0 0 0 0 0 0 0 0; 0 1.0 0 0 0 0 0 0; 0 0 0 -0.05348 1.0 0 0 0; 0 0 1.0 0 0 0 0 0; 0 0 0 1.0 0 0 0 0]; d0 = zeros (6, 4); inname = {"main rotor collective", "longitudinal cyclic", "lateral cyclic", "tail rotor collective"}; stname = {"theta", "phi", "p", "q", "xi", "v_x", "v_y", "v_z"}; outname = {"H_dot", "theta", "phi", "psi_dot", "p", "q"}; sys = ss (a0, b0, c0, d0, "inname", inname, "stname", stname, "outname", outname); endfunction control/inst/zpk.m0000644000076500000240000000676412273411257013520 0ustar lukasstaff## Copyright (C) 2009-2014 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## ## LTI Syncope 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. ## ## LTI Syncope 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 LTI Syncope. If not, see . ## -*- texinfo -*- ## @deftypefn {Function File} {@var{s} =} zpk (@var{"s"}) ## @deftypefnx {Function File} {@var{z} =} zpk (@var{"z"}, @var{tsam}) ## @deftypefnx {Function File} {@var{sys} =} zpk (@var{sys}) ## @deftypefnx {Function File} {@var{sys} =} zpk (@var{k}) ## @deftypefnx {Function File} {@var{sys} =} zpk (@var{z}, @var{p}, @var{k}, @dots{}) ## @deftypefnx {Function File} {@var{sys} =} zpk (@var{z}, @var{p}, @var{k}, @var{tsam}, @dots{}) ## @deftypefnx {Function File} {@var{sys} =} zpk (@var{z}, @var{p}, @var{k}, @var{tsam}, @dots{}) ## Create transfer function model from zero-pole-gain data. ## This is just a stop-gap compatibility wrapper since zpk ## models are not yet implemented. ## ## @strong{Inputs} ## @table @var ## @item sys ## @acronym{LTI} model to be converted to transfer function. ## @item z ## Cell of vectors containing the zeros for each channel. ## z@{i,j@} contains the zeros from input j to output i. ## In the SISO case, a single vector is accepted as well. ## @item p ## Cell of vectors containing the poles for each channel. ## p@{i,j@} contains the poles from input j to output i. ## In the SISO case, a single vector is accepted as well. ## @item k ## Matrix containing the gains for each channel. ## k(i,j) contains the gain from input j to output i. ## @item tsam ## Sampling time in seconds. If @var{tsam} is not specified, ## a continuous-time model is assumed. ## @item @dots{} ## Optional pairs of properties and values. ## Type @command{set (tf)} for more information. ## @end table ## ## @strong{Outputs} ## @table @var ## @item sys ## Transfer function model. ## @end table ## ## @seealso{tf, ss, dss, frd} ## @end deftypefn ## Author: Lukas Reichlin ## Created: September 2011 ## Version: 0.1 function sys = zpk (z = {}, p = {}, k = [], varargin) switch (nargin) case 0 # sys = zpk () sys = tf (); return; case 1 # sys = zpk (sys), sys = zpk (k), s = zpk ("s") if (isa (z, "lti") || is_real_matrix (z) || ischar (z)) sys = tf (z); return; else print_usage (); endif case 2 # z = zpk ("z", tsam) if (ischar (z) && issample (p, -1)) sys = tf (z, p); return; else print_usage (); endif otherwise # sys = zpk (z, p, k, ...) if (! iscell (z)) z = {z}; endif if (! iscell (p)) p = {p}; endif if (! size_equal (z, p, k)) error ("zpk: arguments z, p and k must have equal dimensions"); endif num = cellfun (@(zer, gain) real (gain * poly (zer)), z, num2cell (k), "uniformoutput", false); den = cellfun (@(pol) real (poly (pol)), p, "uniformoutput", false); sys = tf (num, den, varargin{:}); endswitch endfunction control/NEWS0000644000076500000240000006342412273411256012253 0ustar lukasstaffSummary of important user-visible changes for releases of the control package =============================================================================== control-2.6.2 Release Date: 2014-02-02 Release Manager: Lukas Reichlin =============================================================================== ** hinfsyn, mixsyn By default, hinfsyn and mixsyn compute now an optimal instead of a suboptimal controller. Furthermore, Matlab compatibility is improved if hinfsyn/mixsyn is called with more than three/four input arguments. (Thanks to Thomas Vasileiou for the gamma iteration) The old behavior (sub-optimal controller) can be restored by the expressions hinfsyn (P, nmeas, ncont, 'method', 'sub') mixsyn (G, W1, W2, W3, 'method', 'sub') ** h2syn, hinfsyn, mixsyn, ncfsyn For Matlab compatibility, the third return argument is now norm "gamma". The info struct is now returned as fourth argument. [K, N, gamma, info] = *syn (G, …) ** mktito New function to partition plant for robust control. "mktito" is also used by function "augw". If a plant is partitioned that way, one can omit the inputs "nmeas" and "ncon" when calling the functions "hinfsyn" and "h2syn". ** ss The conversion of realizable descriptor systems to regular state-space form is now possible, even when the descriptor matrix "E" is singular. (Thanks to Thomas Vasileiou and Bruce Minaker) =============================================================================== control-2.6.1 Release Date: 2013-12-10 Release Manager: Lukas Reichlin =============================================================================== ** LTI models Raise an error if the user tries to create an ingroup or outgroup with indices larger than the number of inputs m or outputs p. ** thiran New function to approximate a continuous-time delay by a discrete-time allpass Thiran filter. (Thanks to Thomas Vasileiou and Spencer Jackson) ** end "end" indexing for LTI and IDDATA objects works now as expected. =============================================================================== control-2.6.0 Release Date: 2013-10-24 Release Manager: Lukas Reichlin =============================================================================== ** LTI models -- Support for name-based channel selection in various commands. Example: sys = Boeing707, sys('pitch', {'rudder', 'thrust'}) instead of sys(2, [2, 1]). -- New properties "ingroup" and "outgroup" to pool several channels: sys.ingroup.controls = [3, 1], sys.outgroup.measurements = [1, 2] sys('measurements', 'controls') instead of sys([1, 2], [3, 1]). -- Support names instead of indices in commands like "feedback" and "xperm". ** connect Support name-based interconnections. This means that the LTI models passed to "connect" will be interconnected automatically if they have their inputs and outputs named accordingly. ** sumblk New function to build summing junctions for name-based interconnections by "connect". Example: Sum = sumblk ('e = r - y + n') ** tf State-space to transfer function conversions of static gains, e.g. "tf (ss (5))", no longer error out. (Thanks to Thomas Vasileiou) ** IDDATA identification datasets Support for name-based output, input and experiment selection similar to LTI models. =============================================================================== control-2.4.5 Release Date: 2013-10-07 Release Manager: Lukas Reichlin =============================================================================== ** Compatibility to GNU Octave 3.8 Replaced line continuation marker "\" by "..." to avoid deprecated syntax warning. (Thanks to John W. Eaton) ** db2mag, mag2db New functions to convert Decibels to Magnitude and vice versa. ** d2d New function for resampling of discrete-time models. =============================================================================== control-2.4.4 Release Date: 2013-08-11 Release Manager: Lukas Reichlin =============================================================================== ** zero -- Fix documentation. Function "zero" computes the invariant zeros, not the transmission zeros when it is called with one input argument. -- Added new options to compute the system, transmission, input decoupling and output decoupling zeros besides the already existing invariant zeros. Examples: z = zero (sys, 'system'), z = zero (sys, 'transmission') -- Return an "info" struct as third output argument. It contains additional rank information as well as Kronecker indices and the numbers of infinite elementary divisors. Example: [z, k, info] = zero (sys) (Special thanks to Ferdinand Svaricek) ** resample The "resample" function for "iddata" identification datasets now handles unspecified sampling times (tsam = -1) correctly. ** Time response functions (impulse, initial, lsim, ramp, step) Fix a thinko introduced with control-2.4.3. In some cases, several responses were mistakingly plotted on the same subplot. (Thanks to Thomas Vasileiou) ** Various documentation enhancements and fixes. =============================================================================== control-2.4.3 Release Date: 2013-07-12 Release Manager: Lukas Reichlin =============================================================================== ** resample The resample function for iddata sets now adjusts the sampling time correctly after resampling. ** Time response functions (impulse, initial, lsim, ramp, step) Don't use subplot for SISO models. This allows the user to plot different responses on a single figure by calling subplot. (Thanks to Matthias Meier) ** h2syn, hinfsyn, mixsyn, ncfsyn Third return argument is now an info struct. [K, N, info] = *syn (G, …) ** optiPID Beef up documentation. =============================================================================== control-2.4.2 Release Date: 2013-02-16 Release Manager: Lukas Reichlin =============================================================================== ** Transfer function to state-space conversion (Thanks to Thomas Vasileiou): -- Fix crash. -- Fix bug if denominators are zero. ** minreal Fix crash in minreal for state-space systems. (Thanks to Thomas Vasileiou) ** sigma The plot types 1, 2, 3 were no longer supported since the introduction of multi-system plots in control-2.3.54. The help text is now updated accordingly and cruft is removed from the codebase. ** mixsyn, ncfsyn, Madievski Beef up help text. =============================================================================== control-2.4.1 Release Date: 2012-11-01 Release Manager: Lukas Reichlin =============================================================================== ** impulse, initial, lsim, step These time response functions now error out correctly when the user tries to plot multiple systems in one window with mismatching numbers of inputs and outputs. The problem was caused by Octave's built-in function "size_equal" which gave false positives for LTI objects. The problem is solved by overloading the built-in function with a new LTI method "size_equal". ** ramp Added a new time domain analysis function "ramp" which plots/computes the system's response to a ramp signal. ** c2d, d2c Added matched pole/zero discretization method "matched". Usage: Gd = c2d (Gc, Ts, 'matched'), Gc = d2c (Gd, 'matched') ** doc/control.pdf Revised PDF manual. There is now a function index at the end of the manual. Improved docstrings in several functions. =============================================================================== control-2.4.0 Release Date: 2012-09-26 Release Manager: Lukas Reichlin =============================================================================== ** Multiplot feature for time-domain plotting: impulse lsim initial step Supported are now function calls like impulse (sys1, sys2, ...), step (sys1, 'b', sys2, 'r', ...) lsim (sys1, '-k', sys2, '--k', u), initial (sys, sys2, x0) The multiplot feature for frequency-domain plotting has already been introduced with control-2.3.54. ** Anderson, Madievski, MDSSystem, optiPID Updated example scripts to use new multiplot feature. ** sensitivity Fixed a problem with plotting, introduced with control-2.3.54. ** doc/control.pdf Updated PDF manual. =============================================================================== control-2.3.54 Release Date: 2012-09-15 Release Manager: Lukas Reichlin =============================================================================== ** Multiplot feature for frequency-domain plotting: bode nichols pzmap bodemag nyquist sigma The functions above support calls like sigma (sys1, sys2, ...), nyquist (sys1, 'b', sys2, 'r', ...), bode (sys1, '-k', sys2, '-.k', sys3, ':k', {wmin, wmax}). Time domain functions are not yet multiplot ready, but they will follow in control-2.4.0. ** plot A selection of experiments from iddata identification datasets can be plotted by plot (dat, exp) instead of plot (dat(:,:,:,exp)). ** sensitivity Fixed a problem where an error was raised about an undefined function "issiso". ** All SLICOT function names have now leading and trailing underscores to emphasize their private nature. =============================================================================== control-2.3.53 Release Date: 2012-08-27 Release Manager: Lukas Reichlin =============================================================================== ** Added new functions for system identification, including: arx iddata ifft moen4 detrend nkshift moesp fft plot n4sid filter resample ** sensitivity Added new function to compute and plot the sensitivity margin Ms. ** feedback Fixed an argument check which caused false positive error messages. It was a copy-paste mistake affecting non-square systems. (Thanks to Tony Olivo) =============================================================================== control-2.3.52 Release Date: 2012-06-25 Release Manager: Lukas Reichlin =============================================================================== ** Fixed a silly mistake in MIMO transfer function to state-space conversion. The bug has been introduced with control-2.3.51. (Thanks to Jim Rawlings for providing the test case) ** dlqe, lqe Added new functions for linear quadratic estimators. (Thanks to Megan Zagrobelny) ** Upon request of the Debian maintainers, the tex-files control.tex and functions.texi for generating control.pdf are included in the doc folder, next to control.pdf. Note that functions.texi is generated automatically by the scripts in the control/devel folder and the package generate_html. They are not included in the control package and can be found on the OctaveForge SVN server. ** Minor improvements in various help texts. =============================================================================== control-2.3.51 Release Date: 2012-06-03 Release Manager: Lukas Reichlin =============================================================================== ** filt, filtdata, tf -- Added function "filt" to specify disrete-time transfer functions in DSP format, i.e. z^-1. -- Added function "filtdata" to return any type of discrete-time LTI model in DSP format. -- tf models have a new property "inv". To display a discrete-time TF sys in z^-1, set sys.inv=true. In order to switch to z, set sys.inv=false. "filt" sets property "inv" to true (z^-1) by default, while "tf" uses false (z) as default value. ** ctranspose Conjugate transpose or pertransposition of LTI objects. Used by Octave for "sys'". For a transfer-function matrix G, G' denotes the conjugate of G given by G.'(-s) for a continuous-time system or G.'(1/z) for a discrete-time system. The frequency response of the pertransposition of G is the Hermitian (conjugate) transpose of G(jw), i.e. freqresp (G', w) = freqresp (G, w)'. WARNING: Do NOT use this for dual problems, use the transpose "sys.'" (note the dot) instead. ** test_control Add a few remarks to the help text regarding the severity of failing tests. ** Makefile fixed to work with non-standard linker options e.g on Apple. ** The conversion to state-space of multi-input transfer functions with common row denominators is now handled more efficiently. =============================================================================== control-2.3.50 Release Date: 2012-03-06 Release Manager: Lukas Reichlin =============================================================================== ** Added new functions for frequency-weighted model and controller order reduction: bstmodred btaconred btamodred cfconred hnamodred fwcfconred spamodred spaconred ** Anderson, Madievski -- Added two examples for controller reduction. The m-files are named after the authors of the corresponding papers. ** fitfrd -- Added function to fit frequency response data with a state-space model. ** set -- The set command doesn't need a return argument anymore in order to save the modified values. set (sys, "key", value) is now equivalent to sys = set (sys, "key", value). ** Require Octave version 3.6.0 or better. (The frequency response plotting commands have been simplified. They now use the fixed "axis tight" command. This is a first step towards multiple systems in one plot, e.g. bode (sys1, sys2, sys3). Furthermore, the code takes advantage of the new "arrayfun" function which became a faster oct-file instead of an m-file) ** Revised package installation and cleanup efforts under the hood. The new solution compiles the SLICOT library in a less barbaric way and creates only a single oct-file containing all the SLICOT routines. This also brings along faster compile times. (Special thanks to Hans Buchmann, Carlo De Falco and Michael Goffioul for their advice) ** doc/control.pdf -- Extended PDF manual. =============================================================================== control-2.2.5 Release Date: 2012-02-09 Release Manager: Lukas Reichlin =============================================================================== ** Improved Matlab compatibility for frequency response commands. It is now possible to specify a frequency range. Example: bode (sys, {wmin, wmax}) where wmin and wmax denote frequencies in rad/s. ** margin -- Fixed a variable name such that discrete-time models are plotted without an error. (Thanks to Renato Caldas) =============================================================================== control-2.2.4 Release Date: 2012-01-07 Release Manager: Lukas Reichlin =============================================================================== ** Compatibility with Octave 3.6.0. (The makefile must specify the libraries that mkoctfile needs to link. Thanks to Marco Atzeri and Carlo De Falco) ** ctrbf, obsvf -- Added new functions to compute controllable and observable block Hessenberg realizations based on SLICOT TB01UD. (Thanks to Benjamin Fernandez and Alexandre Felipe) =============================================================================== control-2.2.3 Release Date: 2011-12-07 Release Manager: Lukas Reichlin =============================================================================== ** Improved performance when computing the frequency response of transfer function models by orders of magnitude. (I realized that "polyval" can evaluate a polynomial at several values at once in a vectorized manner.) ** bode, bodemag, nichols, sigma -- Fixed a hang when plotting pairs of purely imaginary poles or zeros. The hang was caused by nonsensical (Inf, NaN) axis values. (Reported by Laurent Tissier) ** Use single instead of double quotes when displaying names of TF and FRD models. =============================================================================== control-2.2.2 Release Date: 2011-12-04 Release Manager: Lukas Reichlin =============================================================================== ** Improved error messages for place, ARE solvers and robust control commands. ** minreal, ss -- Fixed a crash for descriptor models. minreal for dss models as well as conversion from non-proper transfer functions to descriptor state-space models should work now as expected. ** ss -- Revised default tolerance for transfer function to state-space conversion by SLICOT TD04AD. ** Better performance when computing the frequency response of SISO transfer function models. ** Reorganized tests. Most tests have been moved from "ltimodels" to the files of the LTI methods being tested. All available tests can be executed by "test_control". ** The NEWS file is handled correctly when using Octave version 3.6. Type "news("control")" or "news control" to display the news (3.6 only). =============================================================================== control-2.2.1 Release Date: 2011-10-24 Release Manager: Lukas Reichlin =============================================================================== ** tf -- Fixed a nasty bug that prevented shortening of numerator and denominator polynomials consisting solely of zeros. -- MIMO support for descriptor state-space to transfer function conversion. Usage: tf_sys = tf (dss_sys) -- MIMO support for interconnections of non-proper transfer functions via internal conversion to state-space. ** ss -- Support conversion from non-proper transfer function to descriptor state- space. Usage: dss_sys = ss (tf_sys) ** c2d, d2c -- Support bilinear transformation of descriptor state-space models. ** inv -- Support the inversion of MIMO transfer functions. Inverses of 2x2 TFs are computed directly, larger models are computed internally in state-space. ** place -- Return the number of fixed, assigned and uncontrollable poles in a single "info" struct instead of three individual output arguments. ** rlocus -- Clarify usage statement in help string. -- Check whether system is SISO. ** MDSSystem -- Display bode plots of controllers instead of singular value plots of the closed loops. ** hsvd -- Added option "alpha" to specify the alpha-stability boundary for the eigenvalues of the state dynamics matrix A. ** isctrb, isobsv -- Return number of controllable/observable states as a second output argument. ** doc/control.pdf -- Added preface to PDF manual. =============================================================================== control-2.2.0 Release Date: 2011-09-26 Release Manager: Lukas Reichlin =============================================================================== ** ss -- Transfer function to state-space conversion uses now SLICOT TD04AD. Conversion of MIMO models is now supported. Usage: ss_sys = ss (tf_sys) ** tf -- Support for interconnections of MIMO transfer functions. This is done by an internal conversion to a minimal state-space representation. With the current tf2ss and ss2tf conversions, only proper transfer function are supported. This limitation does not exist for SISO transfer functions. -- Fixed a cellfun statement that caused problems on MinGW32 builds and possibly some others. (Reported by Bernhard Weller) ** pole, zero -- Computation of poles and zeros of MIMO transfer functions is now possible via conversion to state-space. Please note that the state-space realization of SLICOT TD04AD is a minimal one. Therefore certain poles and zeros might be missing. ** zpk, zpkdata -- Included wrappers that create transfer function models from zero-pole-gain data (zpk) and zero-pole-gain data from lti models (zpkdata). They are stop-gap measures for compatibility until ZPK models are implemented. ** tfdata -- "vector" option added. For SISO models, it returns numerator and denominator directly as column vectors instead of cells containing a single column vector. ** doc/control.pdf -- Revised PDF manual. =============================================================================== control-2.1.55 Release Date: 2011-09-07 Release Manager: Lukas Reichlin =============================================================================== ** c2d -- Support for "tustin" and "prewarp" method added. -- Transfer functions are now supported via the state-space methods. -- Improved Texinfo string. ** d2c -- Discrete to continuous-time conversion added. However, support is limited to the zero-order hold, tustin and pre-warping methods. ** Conversion from descriptor to regular state-space is now performed by SLICOT routine SB10JD. Better numerical results are to be expected over the previous naive inversion formula. This conversion is used internally for ssdata and some other functions. =============================================================================== control-2.1.54 Release Date: 2011-08-22 Release Manager: Lukas Reichlin =============================================================================== ** tf -- State-space to transfer function conversion uses now SLICOT TB04BD. Conversion of MIMO models is now supported. Usage: tf_sys = tf (ss_sys) -- Display an empty line between title and numerator for better readability. -- Display whether model is static, continuous- or discrete-time. ** A PDF manual is included for the first time. It is located inside the "doc" folder. It has been generated automatically from the Texinfo help strings and is not yet completely sorted out. =============================================================================== control-2.1.53 Release Date: 2011-08-08 Release Manager: Lukas Reichlin =============================================================================== ** ncfsyn -- Added support for McFarlane/Glover loop shaping design procedure. "ncfsyn" stands for Normalized Coprime Factor Synthesis. ** MDSSystem -- Added example script which demonstrates the usage of the robust control commands "mixsyn" and "ncfsyn". ** Texinfo help strings of several functions have been extended, although documentation still leaves a lot to be desired. =============================================================================== control-2.1.52 Release Date: 2011-07-27 Release Manager: Lukas Reichlin =============================================================================== ** hsvd -- Use scaling unless state-space model property "scaled" is set to true. ** norm -- Use scaling for computation of L-infinity norm unless state-space model property "scaled" is set to true. ** minreal -- Use scaling for state-space and descriptor state-space models unless property "scaled" is set to true. -- More accurate results are to be expected for descriptor state-space models by performing only those reduction phases where effective order reduction occurs. This is achieved by saving the system matrices before each phase and restoring them if no order reduction took place. ** zero -- Use scaling for state-space and descriptor state-space models unless property "scaled" is set to true. ** frdata -- The frequency response is now returned correctly as an array and not as a vector, unless the "vector" option is set and the system is single-input single-output. -- Added help text. =============================================================================== control-2.1.51 Release Date: 2011-07-21 Release Manager: Lukas Reichlin =============================================================================== ** frd -- Support for Frequency Response Data (frd) measurement "models". =============================================================================== control-2.1.50 Release Date: 2011-07-06 Release Manager: Lukas Reichlin =============================================================================== ** ss -- Support for property "scaled". By default, it is set to "false". ** prescale -- Scaling for state-space models (SLICOT TB01ID) and descriptor models (SLICOT TG01AD). ** freqresp -- Scale state-space models using @lti/prescale.m if property "scaled" is set to "false". Frequency response commands now perform automatic scaling unless model property "scaled" is set to "true". =============================================================================== control-2.0.2 Release Date: 2011-03-18 Release Manager: Lukas Reichlin =============================================================================== ** lsim -- Fixed a logical error that refused valid initial state vectors. It was due to a thinko introduced with the changes in control-2.0.1. (Thanks to Rob Frohne) =============================================================================== control-2.0.1 Release Date: 2011-03-06 Release Manager: Lukas Reichlin =============================================================================== ** lsim -- Support time vectors not starting at zero. (Thanks to Rob Frohne) -- Improved help text. ** zero -- The gain of descriptor state-space models is now computed correctly. (fingers crossed) =============================================================================== control-2.0.0 Release Date: 2011-02-08 Release Manager: Lukas Reichlin =============================================================================== ** First official release. =============================================================================== control/src/0000755000076500000240000000000012273411257012333 5ustar lukasstaffcontrol/src/__control_slicot_functions__.cc0000644000076500000240000000724212273411257020570 0ustar lukasstaff#include "sl_ab08nd.cc" // transmission zeros of state-space models #include "sl_ab13dd.cc" // L-infinity norm #include "sl_sb10hd.cc" // H-2 controller synthesis - continuous-time #include "sl_sb10ed.cc" // H-2 controller synthesis - discrete-time #include "sl_ab13bd.cc" // H-2 norm #include "sl_sb01bd.cc" // Pole assignment #include "sl_sb10fd.cc" // H-infinity controller synthesis - continuous-time #include "sl_sb10dd.cc" // H-infinity controller synthesis - discrete-time #include "sl_sb03md.cc" // Lyapunov equations #include "sl_sb04md.cc" // Sylvester equations - continuous-time #include "sl_sb04qd.cc" // Sylvester equations - discrete-time #include "sl_sg03ad.cc" // generalized Lyapunov equations #include "sl_sb02od.cc" // algebraic Riccati equations #include "sl_ab13ad.cc" // Hankel singular values #include "sl_ab01od.cc" // staircase form using orthogonal transformations #include "sl_tb01pd.cc" // minimal realization of state-space models #include "sl_sb03od.cc" // Cholesky factor of Lyapunov equations #include "sl_sg03bd.cc" // Cholesky factor of generalized Lyapunov equations #include "sl_ag08bd.cc" // transmission zeros of descriptor state-space models #include "sl_tg01jd.cc" // minimal realization of descriptor state-space models #include "sl_tg01hd.cc" // controllability staircase form of descriptor state-space models #include "sl_tg01id.cc" // observability staircase form of descriptor state-space models #include "sl_sg02ad.cc" // solution of algebraic Riccati equations for descriptor systems #include "sl_tg04bx.cc" // gain of descriptor state-space models #include "sl_tb01id.cc" // scaling of state-space models #include "sl_tg01ad.cc" // scaling of descriptor state-space models #include "sl_sb10id.cc" // H-infinity loop shaping - continuous-time #include "sl_sb10kd.cc" // H-infinity loop shaping - discrete-time - strictly proper case #include "sl_sb10zd.cc" // H-infinity loop shaping - discrete-time - proper case #include "sl_tb04bd.cc" // State-space to transfer function conversion #include "sl_ab04md.cc" // bilinear transformation #include "sl_sb10jd.cc" // descriptor to regular state-space conversion #include "sl_td04ad.cc" // transfer function to state-space conversion #include "sl_tb01ud.cc" // controllable block Hessenberg realization #include "sl_ab09hd.cc" // balanced stochastic truncation model reduction #include "sl_ab09id.cc" // balanced truncation & singular perturbation approximation model reduction #include "sl_ab09jd.cc" // hankel-norm approximation model reduction #include "sl_sb16ad.cc" // balanced truncation & singular perturbation approximation controller reduction #include "sl_sb16bd.cc" // coprime factorization state-feedback controller reduction #include "sl_sb16cd.cc" // frequency-weighted coprime factorization state-feedback controller reduction #include "sl_sb10yd.cc" // fit state-space model to frequency response data #include "sl_ident.cc" // system identification #include "sl_ib01cd.cc" // compute initial state vector #include "sl_ib01ad.cc" // compute singular values // #include "sl_are.cc" // solve ARE with Schur vector approach and scaling #include "sl_tg01fd.cc" // orthogonal reduction of dss to a SVD-like coordinate form #include "sl_sb10ad.cc" // H-infinity optimal controller using modified Glover's and Doyle's formulas (continuous-time) // stub function to avoid gen_doc_cache warning upon package installation DEFUN_DLD (__control_slicot_functions__, args, nargout, "-*- texinfo -*-\n\ Slicot Release 5.0\n\ No argument checking.\n\ For internal use only.") { octave_value_list retval; error ("__control_slicot_functions__: for internal use only"); return retval; } control/src/common.cc0000644000076500000240000000435512273411257014141 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Common code for oct-files. Author: Lukas Reichlin Created: April 2010 Version: 0.3 */ #include int max (int a, int b) { if (a > b) return a; else return b; } int max (int a, int b, int c) { return max (max (a, b), c); } int max (int a, int b, int c, int d) { return max (max (a, b), max (c, d)); } int max (int a, int b, int c, int d, int e) { return max (max (a, b, c, d), e); } int min (int a, int b) { if (a < b) return a; else return b; } void error_msg (const char name[], int index, int max, const char* msg[]) { if (index == 0) return; if (index < 0) error ("%s: the %d-th argument had an invalid value", name, index); else if (index <= max) error ("%s: %s", name, msg[index]); else error ("%s: unknown error, info = %d", name, index); } void warning_msg (const char name[], int index, int max, const char* msg[]) { if (index == 0) return; if (index > 0 && index <= max) warning ("%s: %s", name, msg[index]); else warning ("%s: unknown warning, iwarn = %d", name, index); } void warning_msg (const char name[], int index, int max, const char* msg[], int offset) { if (index == 0) return; if (index > 0 && index <= max) warning ("%s: %s", name, msg[index]); else if (index > offset) warning ("%s: %d+%d: %d %s", name, offset, index-offset, index-offset, msg[max+1]); else warning ("%s: unknown warning, iwarn = %d", name, index); } control/src/common.h0000644000076500000240000000235312273411257013777 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Common code for oct-files. Author: Lukas Reichlin Created: February 2012 Version: 0.1 */ #ifndef COMMON_H #define COMMON_H int max (int a, int b); int max (int a, int b, int c); int max (int a, int b, int c, int d); int max (int a, int b, int c, int d, int e); int min (int a, int b); void error_msg (const char name[], int index, int max, const char* msg[]); void warning_msg (const char name[], int index, int max, const char* msg[]); void warning_msg (const char name[], int index, int max, const char* msg[], int offset); #endif control/src/is_matrix.cc0000644000076500000240000000317512273411257014647 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Return true if argument is a real matrix. Author: Lukas Reichlin Created: June 2012 Version: 0.1 */ #include DEFUN_DLD (is_matrix, args, nargout, "-*- texinfo -*-\n\ @deftypefn {Loadable Function} {} is_matrix (@var{a}, @dots{})\n\ Return true if argument is a matrix.\n\ @var{[]} is a valid matrix.\n\ Avoid nasty stuff like @code{true = isreal (\"a\")}\n\ @seealso{is_real_matrix, is_real_square_matrix, is_real_vector, is_real_scalar}\n\ @end deftypefn") { octave_value retval = true; int nargin = args.length (); if (nargin == 0) { print_usage (); } else { for (int i = 0; i < nargin; i++) { if (args(i).ndims () != 2 || ! args(i).is_numeric_type () || ! (args(i).is_complex_type () || args(i).is_real_type ())) { retval = false; break; } } } return retval; } control/src/is_real_matrix.cc0000644000076500000240000000314112273411257015643 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Return true if argument is a real matrix. Author: Lukas Reichlin Created: September 2010 Version: 0.1 */ #include DEFUN_DLD (is_real_matrix, args, nargout, "-*- texinfo -*-\n\ @deftypefn {Loadable Function} {} is_real_matrix (@var{a}, @dots{})\n\ Return true if argument is a real matrix.\n\ @var{[]} is a valid matrix.\n\ Avoid nasty stuff like @code{true = isreal (\"a\")}\n\ @seealso{is_real_square_matrix, is_real_vector, is_real_scalar}\n\ @end deftypefn") { octave_value retval = true; int nargin = args.length (); if (nargin == 0) { print_usage (); } else { for (int i = 0; i < nargin; i++) { if (args(i).ndims () != 2 || ! args(i).is_numeric_type () || ! args(i).is_real_type ()) { retval = false; break; } } } return retval; } control/src/is_real_scalar.cc0000644000076500000240000000315512273411257015611 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Return true if argument is a real scalar. Author: Lukas Reichlin Created: September 2010 Version: 0.1 */ #include DEFUN_DLD (is_real_scalar, args, nargout, "-*- texinfo -*-\n\ @deftypefn {Loadable Function} {} is_real_scalar (@var{a}, @dots{})\n\ Return true if argument is a real scalar.\n\ @var{[]} is not a valid scalar.\n\ Avoid nasty stuff like @code{true = isreal (\"a\")}\n\ @seealso{is_real_matrix, is_real_vector}\n\ @end deftypefn") { octave_value retval = true; int nargin = args.length (); if (nargin == 0) { print_usage (); } else { for (int i = 0; i < nargin; i++) { if (args(i).ndims () != 2 || ! args(i).is_scalar_type () || ! args(i).is_numeric_type () || ! args(i).is_real_type ()) { retval = false; break; } } } return retval; } control/src/is_real_square_matrix.cc0000644000076500000240000000324612273411257017231 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Return true if argument is a real square matrix. Author: Lukas Reichlin Created: September 2010 Version: 0.1 */ #include DEFUN_DLD (is_real_square_matrix, args, nargout, "-*- texinfo -*-\n\ @deftypefn {Loadable Function} {} is_real_square_matrix (@var{a}, @dots{})\n\ Return true if argument is a real square matrix.\n\ @var{[]} is a valid square matrix.\n\ Avoid nasty stuff like @code{true = isreal (\"a\")}\n\ @seealso{is_real_matrix, is_real_vector, is_real_scalar}\n\ @end deftypefn") { octave_value retval = true; int nargin = args.length (); if (nargin == 0) { print_usage (); } else { for (int i = 0; i < nargin; i++) { if (args(i).ndims () != 2 || args(i).rows () != args(i).columns () || ! args(i).is_numeric_type () || ! args(i).is_real_type ()) { retval = false; break; } } } return retval; } control/src/is_real_vector.cc0000644000076500000240000000323412273411257015644 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Return true if argument is a real vector. Author: Lukas Reichlin Created: September 2010 Version: 0.1 */ #include DEFUN_DLD (is_real_vector, args, nargout, "-*- texinfo -*-\n\ @deftypefn {Loadable Function} {} is_real_vector (@var{a}, @dots{})\n\ Return true if argument is a real vector.\n\ @var{[]} is not a valid vector.\n\ Avoid nasty stuff like @code{true = isreal (\"a\")}\n\ @seealso{is_real_square_matrix, is_real_matrix, is_real_scalar}\n\ @end deftypefn") { octave_value retval = true; int nargin = args.length (); if (nargin == 0) { print_usage (); } else { for (int i = 0; i < nargin; i++) { if (args(i).ndims () != 2 || ! (args(i).rows () == 1 || args(i).columns () == 1) || ! args(i).is_numeric_type () || ! args(i).is_real_type ()) { retval = false; break; } } } return retval; } control/src/Makefile0000644000076500000240000000315512273411257013777 0ustar lukasstaffMKOCTFILE ?= mkoctfile ifndef LAPACK_LIBS LAPACK_LIBS := $(shell $(MKOCTFILE) -p LAPACK_LIBS) endif ifndef BLAS_LIBS BLAS_LIBS := $(shell $(MKOCTFILE) -p BLAS_LIBS) endif ifndef FLIBS FLIBS := $(shell $(MKOCTFILE) -p FLIBS) endif LFLAGS := $(shell $(MKOCTFILE) -p LFLAGS) $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) all: __control_slicot_functions__.oct \ is_real_scalar.oct \ is_real_vector.oct \ is_real_matrix.oct \ is_real_square_matrix.oct \ is_matrix.oct # TODO: Private oct-files for control package. # unpack and compile SLICOT library # Note that TG04BX is a custom routine. # It has the extension .fortran such that # it is not deleted by rm *.f when using # the developer makefile makefile_control.m slicotlibrary.a: slicot.tar.gz tar -xzf slicot.tar.gz mkdir sltmp mv slicot/src/*.f ./sltmp mv slicot/src_aux/*.f ./sltmp cp TG04BX.fortran ./sltmp/TG04BX.f cd sltmp; $(MKOCTFILE) -c *.f ar -rc slicotlibrary.a ./sltmp/*.o rm -rf sltmp slicot # slicot functions __control_slicot_functions__.oct: __control_slicot_functions__.cc slicotlibrary.a LFLAGS="$(LFLAGS)" \ $(MKOCTFILE) __control_slicot_functions__.cc common.cc slicotlibrary.a # helpers is_real_scalar.oct: is_real_scalar.cc $(MKOCTFILE) is_real_scalar.cc is_real_vector.oct: is_real_vector.cc $(MKOCTFILE) is_real_vector.cc is_real_matrix.oct: is_real_matrix.cc $(MKOCTFILE) is_real_matrix.cc is_real_square_matrix.oct: is_real_square_matrix.cc $(MKOCTFILE) is_real_square_matrix.cc is_matrix.oct: is_matrix.cc $(MKOCTFILE) is_matrix.cc clean: rm -rf *.o core octave-core *.oct *~ *.f slicot sltmp realclean: clean rm -rf *.acontrol/src/readme0000644000076500000240000000624412273411257013521 0ustar lukasstaffSLICOT Library Root Directory ----------------------------- SLICOT - Subroutine Library In COntrol Theory - is a general purpose basic mathematical library for control theoretical computations. The library provides tools to perform essential system analysis and synthesis tasks. The main emphasis in SLICOT is on numerical reliability of implemented algorithms and the numerical robustness and efficiency of routines. Providing algorithmic flexibility and the use of rigorous implementation and documentation standards are other SLICOT features. The SLICOT Library is available as standard Fortran 77 code in double precision. Each user-callable subroutine for control computations is accompanied by an example program which illustrates the use of the subroutine and can act as a template for the user's own routines. The SLICOT Library is organized by chapters, sections and subsections. The following chapters are currently included: A : Analysis Routines B : Benchmark and Test Problems D : Data Analysis F : Filtering I : Identification M : Mathematical Routines N : Nonlinear Systems (not yet available, except for some auxiliary routines for Wiener systems) S : Synthesis Routines T : Transformation Routines U : Utility Routines SLICOT Library Root Directory contains few, basic files for the SLICOT Library distribution and generation. When distributed, SLICOT software comes with several filled-in subdirectories (benchmark_data, doc, examples, examples77, src, and src_aux), and five files in this root directory: - this file, readme, - the file Installation.txt, describing the SLICOT software installation, - the main SLICOT Library documentation index, libindex.html, and - two template files for building the object library and executable programs, make.inc and makefile, - GNU GENERAL PUBLIC LICENSE Version 2 text file. The last two files might need few changes for being adapted to the specific platform used. Details about installing/updating the SLICOT software are given in the file Installation.txt. After software installation, this directory will also contain the library file slicot.a or slicot.lib, for Unix or Windows platforms, respectively. The library file could then be linked in applications programs, as usual. Specific examples are contained in the directories examples and examples77. The on-line documentation of the SLICOT user's callable routines is accessible via the main SLICOT Library documentation index, libindex.html. This file also contains a link to the documentation of the lower-level, support routines. The SLICOT Library is built on LAPACK (Linear Algebra PACKage) and BLAS (Basic Linear Algebra Subprograms) collections. Therefore, these packages should be available on the platform used. Basic References: 1. P. Benner, V. Mehrmann, V. Sima, S. Van Huffel, and A. Varga, "SLICOT - A Subroutine Library in Systems and Control Theory", Applied and Computational Control, Signals, and Circuits (Birkhauser), Vol. 1, Ch. 10, pp. 505-546, 1999. 2. S. Van Huffel, V. Sima, A. Varga, S. Hammarling, and F. Delebecque, "Development of High Performance Numerical Software for Control", IEEE Control Systems Magazine, Vol. 24, Nr. 1, Feb., pp. 60-76, 2004. control/src/sl_ab01od.cc0000644000076500000240000000724212273411257014413 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Staircase controllability form. Uses SLICOT AB01OD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: August 2010 Version: 0.1 */ #include #include #include "common.h" extern "C" { int F77_FUNC (ab01od, AB01OD) (char& STAGES, char& JOBU, char& JOBV, int& N, int& M, double* A, int& LDA, double* B, int& LDB, double* U, int& LDU, double* V, int& LDV, int& NCONT, int& INDCON, int* KSTAIR, double& TOL, int* IWORK, double* DWORK, int& LDWORK, int& INFO); } // PKG_ADD: autoload ("__sl_ab01od__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_ab01od__, args, nargout, "-*- texinfo -*-\n\ Slicot AB01OD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 3) { print_usage (); } else { // arguments in char stages = 'F'; char jobu = 'I'; char jobv = 'N'; // not referenced because stages = 'F' Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); double tol = args(2).double_value (); int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int lda = max (1, n); int ldb = max (1, n); int ldu = max (1, n); int ldv = 1; // arguments out Matrix u (ldu, n); double* v = 0; // not referenced because stages = 'F' int ncont; int indcon; OCTAVE_LOCAL_BUFFER (int, kstair, n); // workspace int ldwork = max (1, n + max (n, 3*m)); OCTAVE_LOCAL_BUFFER (int, iwork, m); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicators int info; // SLICOT routine AB01OD F77_XFCN (ab01od, AB01OD, (stages, jobu, jobv, n, m, a.fortran_vec (), lda, b.fortran_vec (), ldb, u.fortran_vec (), ldu, v, ldv, ncont, indcon, kstair, tol, iwork, dwork, ldwork, info)); if (f77_exception_encountered) error ("__sl_ab01od__: exception in SLICOT subroutine AB01OD"); if (info != 0) error ("__sl_ab01od__: AB01OD returned info = %d", info); // resize a.resize (n, n); b.resize (n, m); u.resize (n, n); // return values retval(0) = a; retval(1) = b; retval(2) = u; retval(3) = octave_value (ncont); } return retval; } control/src/sl_ab04md.cc0000644000076500000240000000673712273411257014424 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Discrete-time <--> continuous-time systems conversion by a bilinear transformation. Uses SLICOT AB04MD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: September 2011 Version: 0.1 */ #include #include #include "common.h" extern "C" { int F77_FUNC (ab04md, AB04MD) (char& TYPE, int& N, int& M, int& P, double& ALPHA, double& BETA, double* A, int& LDA, double* B, int& LDB, double* C, int& LDC, double* D, int& LDD, int* IWORK, double* DWORK, int& LDWORK, int& INFO); } // PKG_ADD: autoload ("__sl_ab04md__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_ab04md__, args, nargout, "-*- texinfo -*-\n\ Slicot AB04MD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 7) { print_usage (); } else { // arguments in char type; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); double alpha = args(4).double_value (); double beta = args(5).double_value (); int discrete = args(6).int_value (); if (discrete == 0) type = 'C'; else type = 'D'; int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int p = c.rows (); // p: number of outputs int lda = max (1, n); int ldb = max (1, n); int ldc = max (1, p); int ldd = max (1, p); // workspace int ldwork = max (1, n); OCTAVE_LOCAL_BUFFER (int, iwork, n); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicator int info; // SLICOT routine AB04MD F77_XFCN (ab04md, AB04MD, (type, n, m, p, alpha, beta, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, iwork, dwork, ldwork, info)); if (f77_exception_encountered) error ("__sl_ab04md__: exception in SLICOT subroutine AB04MD"); if (info != 0) error ("__sl_ab04md__: AB04MD returned info = %d", info); // return values retval(0) = a; retval(1) = b; retval(2) = c; retval(3) = d; } return retval; } control/src/sl_ab08nd.cc0000644000076500000240000001623112273411257014417 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Transmission zeros of state-space models. Uses SLICOT AB08ND by courtesy of NICONET e.V. Author: Lukas Reichlin Created: November 2009 Version: 0.6 */ #include #include #include "common.h" #include #include extern "C" { int F77_FUNC (ab08nd, AB08ND) (char& EQUIL, int& N, int& M, int& P, const double* A, int& LDA, const double* B, int& LDB, const double* C, int& LDC, const double* D, int& LDD, int& NU, int& RANK, int& DINFZ, int& NKROR, int& NKROL, int* INFZ, int* KRONR, int* KRONL, double* AF, int& LDAF, double* BF, int& LDBF, double& TOL, int* IWORK, double* DWORK, int& LDWORK, int& INFO); int F77_FUNC (dggev, DGGEV) (char& JOBVL, char& JOBVR, int& N, double* AF, int& LDAF, double* BF, int& LDBF, double* ALPHAR, double* ALPHAI, double* BETA, double* VL, int& LDVL, double* VR, int& LDVR, double* WORK, int& LWORK, int& INFO); } // PKG_ADD: autoload ("__sl_ab08nd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_ab08nd__, args, nargout, "-*- texinfo -*-\n\ Slicot AB08ND Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 5) { print_usage (); } else { // arguments in char equil; const Matrix a = args(0).matrix_value (); const Matrix b = args(1).matrix_value (); const Matrix c = args(2).matrix_value (); const Matrix d = args(3).matrix_value (); const int scaled = args(4).int_value (); if (scaled == 0) equil = 'S'; else equil = 'N'; int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int p = c.rows (); // p: number of outputs int lda = max (1, a.rows ()); int ldb = max (1, b.rows ()); int ldc = max (1, c.rows ()); int ldd = max (1, d.rows ()); // arguments out int nu; int rank; int dinfz; int nkror; int nkrol; int ldaf = max (1, n + m); int ldbf = max (1, n + p); OCTAVE_LOCAL_BUFFER (int, infz, n); OCTAVE_LOCAL_BUFFER (int, kronr, 1 + max (n, m)); OCTAVE_LOCAL_BUFFER (int, kronl, 1 + max (n, p)); OCTAVE_LOCAL_BUFFER (double, af, ldaf * (n + min (p, m))); OCTAVE_LOCAL_BUFFER (double, bf, ldbf * (n + m)); // workspace int s = max (m, p); int ldwork = max (s, n) + max (3*s-1, n+s); OCTAVE_LOCAL_BUFFER (int, iwork, s); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicator int info; // tolerance double tol = 0; // AB08ND uses DLAMCH for default tolerance // SLICOT routine AB08ND F77_XFCN (ab08nd, AB08ND, (equil, n, m, p, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, nu, rank, dinfz, nkror, nkrol, infz, kronr, kronl, af, ldaf, bf, ldbf, tol, iwork, dwork, ldwork, info)); if (f77_exception_encountered) error ("ss: zero: __sl_ab08nd__: exception in SLICOT subroutine AB08ND"); if (info != 0) error ("ss: zero: __sl_ab08nd__: AB08ND returned info = %d", info); // DGGEV Part char jobvl = 'N'; char jobvr = 'N'; double* vl = 0; // not referenced because jobvl = 'N' int ldvl = 1; double* vr = 0; // not referenced because jobvr = 'N' int ldvr = 1; int lwork = max (1, 8*nu); OCTAVE_LOCAL_BUFFER (double, work, lwork); ColumnVector alphar (nu); ColumnVector alphai (nu); ColumnVector beta (nu); int info2; F77_XFCN (dggev, DGGEV, (jobvl, jobvr, nu, af, ldaf, bf, ldbf, alphar.fortran_vec (), alphai.fortran_vec (), beta.fortran_vec (), vl, ldvl, vr, ldvr, work, lwork, info2)); if (f77_exception_encountered) error ("ss: zero: __sl_ab08nd__: exception in LAPACK subroutine DGGEV"); if (info2 != 0) error ("ss: zero: __sl_ab08nd__: DGGEV returned info = %d", info2); // calculate gain octave_value gain = Matrix (0, 0);; if (m == 1 && p == 1) { if (nu < n) gain = c * xpow (a, double (n-1-nu)) * b; else gain = d; } // assemble complex vector - adapted from DEFUN complex in data.cc ColumnVector zeror (nu); ColumnVector zeroi (nu); zeror = quotient (alphar, beta); zeroi = quotient (alphai, beta); ComplexColumnVector zero (nu, Complex ()); for (octave_idx_type i = 0; i < nu; i++) zero.xelem (i) = Complex (zeror(i), zeroi(i)); // prepare additional outputs for info struct RowVector infzr (dinfz); RowVector kronrr (nkror); RowVector kronlr (nkrol); for (octave_idx_type i = 0; i < dinfz; i++) infzr.xelem (i) = infz[i]; for (octave_idx_type i = 0; i < nkror; i++) kronrr.xelem (i) = kronr[i]; for (octave_idx_type i = 0; i < nkrol; i++) kronlr.xelem (i) = kronl[i]; // return values retval(0) = zero; retval(1) = gain; retval(2) = octave_value (rank); retval(3) = infzr; retval(4) = kronrr; retval(5) = kronlr; } return retval; } control/src/sl_ab09hd.cc0000644000076500000240000001666212273411257014422 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Model reduction based on balanced stochastic truncation method. Uses SLICOT AB09HD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: October 2011 Version: 0.1 */ #include #include #include "common.h" extern "C" { int F77_FUNC (ab09hd, AB09HD) (char& DICO, char& JOB, char& EQUIL, char& ORDSEL, int& N, int& M, int& P, int& NR, double& ALPHA, double& BETA, double* A, int& LDA, double* B, int& LDB, double* C, int& LDC, double* D, int& LDD, int& NS, double* HSV, double& TOL1, double& TOL2, int* IWORK, double* DWORK, int& LDWORK, bool* BWORK, int& IWARN, int& INFO); } // PKG_ADD: autoload ("__sl_ab09hd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_ab09hd__, args, nargout, "-*- texinfo -*-\n\ Slicot AB09HD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 13) { print_usage (); } else { // arguments in char dico; char job; char equil; char ordsel; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); const int idico = args(4).int_value (); const int iequil = args(5).int_value (); const int ijob = args(6).int_value (); int nr = args(7).int_value (); const int iordsel = args(8).int_value (); double alpha = args(9).double_value (); double beta = args(10).double_value (); double tol1 = args(11).double_value (); double tol2 = args(12).double_value (); switch (ijob) { case 0: job = 'B'; break; case 1: job = 'F'; break; case 2: job = 'S'; break; case 3: job = 'P'; break; default: error ("__sl_ab09hd__: argument job invalid"); } if (idico == 0) dico = 'C'; else dico = 'D'; if (iequil == 0) equil = 'S'; else equil = 'N'; if (iordsel == 0) ordsel = 'F'; else ordsel = 'A'; int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int p = c.rows (); // p: number of outputs int lda = max (1, n); int ldb = max (1, n); int ldc = max (1, p); int ldd = max (1, p); // arguments out int ns; ColumnVector hsv (n); // workspace int liwork = max (1, 2*n); int mb; if (beta == 0) mb = m; else mb = m + p; int ldwork = 2*n*n + mb*(n+p) + max (2, n*(max (n,mb,p)+5), 2*n*p + max (p*(mb+2), 10*n*(n+1))); OCTAVE_LOCAL_BUFFER (int, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); OCTAVE_LOCAL_BUFFER (bool, bwork, 2*n); // error indicators int iwarn = 0; int info = 0; // SLICOT routine AB09HD F77_XFCN (ab09hd, AB09HD, (dico, job, equil, ordsel, n, m, p, nr, alpha, beta, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, ns, hsv.fortran_vec (), tol1, tol2, iwork, dwork, ldwork, bwork, iwarn, info)); if (f77_exception_encountered) error ("bstmodred: exception in SLICOT subroutine AB09HD"); static const char* err_msg[] = { "0: OK", "1: the computation of the ordered real Schur form of A " "failed", "2: the reduction of the Hamiltonian matrix to real " "Schur form failed", "3: the reordering of the real Schur form of the " "Hamiltonian matrix failed", "4: the Hamiltonian matrix has less than N stable " "eigenvalues", "5: the coefficient matrix U11 in the linear system " "X*U11 = U21 to determine X is singular to working " "precision", "6: BETA = 0 and D has not a maximal row rank", "7: the computation of Hankel singular values failed", "8: the separation of the ALPHA-stable/unstable diagonal " "blocks failed because of very close eigenvalues", "9: the resulting order of reduced stable part is less " "than the number of unstable zeros of the stable " "part"}; static const char* warn_msg[] = { "0: OK", "1: with ORDSEL = 'F', the selected order NR is greater " "than NSMIN, the sum of the order of the " "ALPHA-unstable part and the order of a minimal " "realization of the ALPHA-stable part of the given " "system; in this case, the resulting NR is set equal " "to NSMIN.", "2: with ORDSEL = 'F', the selected order NR corresponds " "to repeated singular values for the ALPHA-stable " "part, which are neither all included nor all " "excluded from the reduced model; in this case, the " "resulting NR is automatically decreased to exclude " "all repeated singular values.", "3: with ORDSEL = 'F', the selected order NR is less " "than the order of the ALPHA-unstable part of the " "given system; in this case NR is set equal to the " "order of the ALPHA-unstable part."}; error_msg ("bstmodred", info, 9, err_msg); warning_msg ("bstmodred", iwarn, 3, warn_msg); // resize a.resize (nr, nr); b.resize (nr, m); c.resize (p, nr); hsv.resize (ns); // return values retval(0) = a; retval(1) = b; retval(2) = c; retval(3) = d; retval(4) = octave_value (nr); retval(5) = hsv; retval(6) = octave_value (ns); } return retval; } control/src/sl_ab09id.cc0000644000076500000240000003044012273411257014411 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Model reduction based on Balance & Truncate (B&T) or Singular Perturbation Approximation (SPA) method. Uses SLICOT AB09ID by courtesy of NICONET e.V. Author: Lukas Reichlin Created: October 2011 Version: 0.1 */ #include #include #include "common.h" extern "C" { int F77_FUNC (ab09id, AB09ID) (char& DICO, char& JOBC, char& JOBO, char& JOB, char& WEIGHT, char& EQUIL, char& ORDSEL, int& N, int& M, int& P, int& NV, int& PV, int& NW, int& MW, int& NR, double& ALPHA, double& ALPHAC, double& ALPHAO, double* A, int& LDA, double* B, int& LDB, double* C, int& LDC, double* D, int& LDD, double* AV, int& LDAV, double* BV, int& LDBV, double* CV, int& LDCV, double* DV, int& LDDV, double* AW, int& LDAW, double* BW, int& LDBW, double* CW, int& LDCW, double* DW, int& LDDW, int& NS, double* HSV, double& TOL1, double& TOL2, int* IWORK, double* DWORK, int& LDWORK, int& IWARN, int& INFO); } // PKG_ADD: autoload ("__sl_ab09id__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_ab09id__, args, nargout, "-*- texinfo -*-\n\ Slicot AB09ID Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 25) { print_usage (); } else { // arguments in char dico; char jobc; char jobo; char job; char weight; char equil; char ordsel; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); const int idico = args(4).int_value (); const int iequil = args(5).int_value (); int nr = args(6).int_value (); const int iordsel = args(7).int_value (); double alpha = args(8).double_value (); const int ijob = args(9).int_value (); Matrix av = args(10).matrix_value (); Matrix bv = args(11).matrix_value (); Matrix cv = args(12).matrix_value (); Matrix dv = args(13).matrix_value (); Matrix aw = args(14).matrix_value (); Matrix bw = args(15).matrix_value (); Matrix cw = args(16).matrix_value (); Matrix dw = args(17).matrix_value (); const int iweight = args(18).int_value (); const int ijobc = args(19).int_value (); double alphac = args(20).double_value (); const int ijobo = args(21).int_value (); double alphao = args(22).double_value (); double tol1 = args(23).double_value (); double tol2 = args(24).double_value (); if (idico == 0) dico = 'C'; else dico = 'D'; if (iequil == 0) equil = 'S'; else equil = 'N'; if (iordsel == 0) ordsel = 'F'; else ordsel = 'A'; if (ijobc == 0) jobc = 'S'; else jobc = 'E'; if (ijobo == 0) jobo = 'S'; else jobo = 'E'; switch (ijob) { case 0: job = 'B'; break; case 1: job = 'F'; break; case 2: job = 'S'; break; case 3: job = 'P'; break; default: error ("__sl_ab09id__: argument job invalid"); } switch (iweight) { case 0: weight = 'N'; break; case 1: weight = 'L'; break; case 2: weight = 'R'; break; case 3: weight = 'B'; break; default: error ("__sl_ab09id__: argument weight invalid"); } int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int p = c.rows (); // p: number of outputs int nv = av.rows (); int pv = cv.rows (); int nw = aw.rows (); int mw = bw.columns (); int lda = max (1, n); int ldb = max (1, n); int ldc = max (1, p); int ldd = max (1, p); int ldav = max (1, nv); int ldbv = max (1, nv); int ldcv = max (1, pv); int lddv = max (1, pv); int ldaw = max (1, nw); int ldbw = max (1, nw); int ldcw = max (1, m); int lddw = max (1, m); // arguments out int ns; ColumnVector hsv (n); // workspace int liwork; int liwrk1; int liwrk2; int liwrk3; switch (job) { case 'B': liwrk1 = 0; break; case 'F': liwrk1 = n; break; default: liwrk1 = 2*n; } if (nv == 0 || weight == 'R' || weight == 'N') liwrk2 = 0; else liwrk2 = nv + max (p, pv); if (nw == 0 || weight == 'L' || weight == 'N') liwrk3 = 0; else liwrk3 = nw + max (m, mw); liwork = max (3, liwrk1, liwrk2, liwrk3); int ldwork; int lminl; int lrcf; int lminr; int llcf; int lleft; int lright; if (nw == 0 || weight == 'L' || weight == 'N') { lrcf = 0; lminr = 0; } else { lrcf = mw*(nw+mw) + max (nw*(nw+5), mw*(mw+2), 4*mw, 4*m); if (m == mw) lminr = nw + max (nw, 3*m); else lminr = 2*nw*max (m, mw) + nw + max (nw, 3*m, 3*mw); } llcf = pv*(nv+pv) + pv*nv + max (nv*(nv+5), pv*(pv+2), 4*pv, 4*p); if (nv == 0 || weight == 'R' || weight == 'N') lminl = 0; else if (p == pv) lminl = max (llcf, nv + max (nv, 3*p)); else lminl = max (p, pv) * (2*nv + max (p, pv)) + max (llcf, nv + max (nv, 3*p, 3*pv)); if (pv == 0 || weight == 'R' || weight == 'N') lleft = n*(p+5); else lleft = (n+nv) * (n + nv + max (n+nv, pv) + 5); if (mw == 0 || weight == 'L' || weight == 'N') lright = n*(m+5); else lright = (n+nw) * (n + nw + max (n+nw, mw) + 5); ldwork = max (lminl, lminr, lrcf, 2*n*n + max (1, lleft, lright, 2*n*n+5*n, n*max (m, p))); OCTAVE_LOCAL_BUFFER (int, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicators int iwarn = 0; int info = 0; // SLICOT routine AB09ID F77_XFCN (ab09id, AB09ID, (dico, jobc, jobo, job, weight, equil, ordsel, n, m, p, nv, pv, nw, mw, nr, alpha, alphac, alphao, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, av.fortran_vec (), ldav, bv.fortran_vec (), ldbv, cv.fortran_vec (), ldcv, dv.fortran_vec (), lddv, aw.fortran_vec (), ldaw, bw.fortran_vec (), ldbw, cw.fortran_vec (), ldcw, dw.fortran_vec (), lddw, ns, hsv.fortran_vec (), tol1, tol2, iwork, dwork, ldwork, iwarn, info)); if (f77_exception_encountered) error ("modred: exception in SLICOT subroutine AB09ID"); static const char* err_msg[] = { "0: OK", "1: the computation of the ordered real Schur form of A " "failed", "2: the separation of the ALPHA-stable/unstable " "diagonal blocks failed because of very close " "eigenvalues", "3: the reduction to a real Schur form of the state " "matrix of a minimal realization of V failed", "4: a failure was detected during the ordering of the " "real Schur form of the state matrix of a minimal " "realization of V or in the iterative process to " "compute a left coprime factorization with inner " "denominator", "5: if DICO = 'C' and the matrix AV has an observable " "eigenvalue on the imaginary axis, or DICO = 'D' and " "AV has an observable eigenvalue on the unit circle", "6: the reduction to a real Schur form of the state " "matrix of a minimal realization of W failed", "7: a failure was detected during the ordering of the " "real Schur form of the state matrix of a minimal " "realization of W or in the iterative process to " "compute a right coprime factorization with inner " "denominator", "8: if DICO = 'C' and the matrix AW has a controllable " "eigenvalue on the imaginary axis, or DICO = 'D' and " "AW has a controllable eigenvalue on the unit circle", "9: the computation of eigenvalues failed", "10: the computation of Hankel singular values failed"}; static const char* warn_msg[] = { "0: OK", "1: with ORDSEL = 'F', the selected order NR is greater " "than NSMIN, the sum of the order of the " "ALPHA-unstable part and the order of a minimal " "realization of the ALPHA-stable part of the given " "system; in this case, the resulting NR is set equal " "to NSMIN.", "2: with ORDSEL = 'F', the selected order NR corresponds " "to repeated singular values for the ALPHA-stable " "part, which are neither all included nor all " "excluded from the reduced model; in this case, the " "resulting NR is automatically decreased to exclude " "all repeated singular values.", "3: with ORDSEL = 'F', the selected order NR is less " "than the order of the ALPHA-unstable part of the " "given system; in this case NR is set equal to the " "order of the ALPHA-unstable part.", /* 10+%d: %d */ "violations of the numerical stability condition " "occured during the assignment of eigenvalues in the " "SLICOT Library routines SB08CD and/or SB08DD."}; error_msg ("modred", info, 10, err_msg); warning_msg ("modred", iwarn, 3, warn_msg, 10); // resize a.resize (nr, nr); b.resize (nr, m); c.resize (p, nr); hsv.resize (ns); // return values retval(0) = a; retval(1) = b; retval(2) = c; retval(3) = d; retval(4) = octave_value (nr); retval(5) = hsv; retval(6) = octave_value (ns); } return retval; } control/src/sl_ab09jd.cc0000644000076500000240000003032612273411257014415 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Model reduction based on Hankel-norm approximation method. Uses SLICOT AB09JD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: July 2011 Version: 0.1 */ #include #include #include "common.h" extern "C" { int F77_FUNC (ab09jd, AB09JD) (char& JOBV, char& JOBW, char& JOBINV, char& DICO, char& EQUIL, char& ORDSEL, int& N, int& NV, int& NW, int& M, int& P, int& NR, double& ALPHA, double* A, int& LDA, double* B, int& LDB, double* C, int& LDC, double* D, int& LDD, double* AV, int& LDAV, double* BV, int& LDBV, double* CV, int& LDCV, double* DV, int& LDDV, double* AW, int& LDAW, double* BW, int& LDBW, double* CW, int& LDCW, double* DW, int& LDDW, int& NS, double* HSV, double& TOL1, double& TOL2, int* IWORK, double* DWORK, int& LDWORK, int& IWARN, int& INFO); } // PKG_ADD: autoload ("__sl_ab09jd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_ab09jd__, args, nargout, "-*- texinfo -*-\n\ Slicot AB09JD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 22) { print_usage (); } else { // arguments in char jobv; char jobw; char jobinv; char dico; char equil; char ordsel; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); const int idico = args(4).int_value (); const int iequil = args(5).int_value (); int nr = args(6).int_value (); const int iordsel = args(7).int_value (); double alpha = args(8).double_value (); const int ijobv = args(9).int_value (); Matrix av = args(10).matrix_value (); Matrix bv = args(11).matrix_value (); Matrix cv = args(12).matrix_value (); Matrix dv = args(13).matrix_value (); const int ijobw = args(14).int_value (); Matrix aw = args(15).matrix_value (); Matrix bw = args(16).matrix_value (); Matrix cw = args(17).matrix_value (); Matrix dw = args(18).matrix_value (); const int ijobinv = args(19).int_value (); double tol1 = args(20).double_value (); double tol2 = args(21).double_value (); switch (ijobv) { case 0: jobv = 'N'; break; case 1: jobv = 'V'; break; case 2: jobv = 'I'; break; case 3: jobv = 'C'; break; case 4: jobv = 'R'; break; default: error ("__sl_ab09jd__: argument jobv invalid"); } switch (ijobw) { case 0: jobw = 'N'; break; case 1: jobw = 'W'; break; case 2: jobw = 'I'; break; case 3: jobw = 'C'; break; case 4: jobw = 'R'; break; default: error ("__sl_ab09jd__: argument jobw invalid"); } switch (ijobinv) { case 0: jobinv = 'N'; break; case 1: jobinv = 'I'; break; case 2: jobinv = 'A'; break; default: error ("__sl_ab09jd__: argument jobinv invalid"); } if (idico == 0) dico = 'C'; else dico = 'D'; if (iequil == 0) equil = 'S'; else equil = 'N'; if (iordsel == 0) ordsel = 'F'; else ordsel = 'A'; int n = a.rows (); // n: number of states int nv = av.rows (); int nw = aw.rows (); int m = b.columns (); // m: number of inputs int p = c.rows (); // p: number of outputs int lda = max (1, n); int ldb = max (1, n); int ldc = max (1, p); int ldd = max (1, p); int ldav = max (1, nv); int ldbv = max (1, nv); int ldcv = max (1, p); int lddv = max (1, p); int ldaw = max (1, nw); int ldbw = max (1, nw); int ldcw = max (1, m); int lddw = max (1, m); // arguments out int ns; ColumnVector hsv (n); // workspace int liwork; int tmpc; int tmpd; if (jobv == 'N') tmpc = 0; else tmpc = max (2*p, nv+p+n+6, 2*nv+p+2); if (jobw == 'N') tmpd = 0; else tmpd = max (2*m, nw+m+n+6, 2*nw+m+2); if (dico == 'C') liwork = max (1, m, tmpc, tmpd); else liwork = max (1, n, m, tmpc, tmpd); int ldwork; int nvp = nv + p; int nwm = nw + m; int ldw1; int ldw2; int ldw3 = n*(2*n + max (n, m, p) + 5) + n*(n+1)/2; int ldw4 = n*(m+p+2) + 2*m*p + min (n, m) + max (3*m+1, min (n, m) + p); if (jobv == 'N') { ldw1 = 0; } else { ldw1 = 2*nvp*(nvp+p) + p*p + max (2*nvp*nvp + max (11*nvp+16, p*nvp), nvp*n + max (nvp*n+n*n, p*n, p*m)); } if (jobw == 'N') { ldw2 = 0; } else { ldw2 = 2*nwm*(nwm+m) + m*m + max (2*nwm*nwm + max (11*nwm+16, m*nwm), nwm*n + max (nwm*n+n*n, m*n, p*m)); } ldwork = max (ldw1, ldw2, ldw3, ldw4); OCTAVE_LOCAL_BUFFER (int, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicators int iwarn = 0; int info = 0; // SLICOT routine AB09JD F77_XFCN (ab09jd, AB09JD, (jobv, jobw, jobinv, dico, equil, ordsel, n, nv, nw, m, p, nr, alpha, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, av.fortran_vec (), ldav, bv.fortran_vec (), ldbv, cv.fortran_vec (), ldcv, dv.fortran_vec (), lddv, aw.fortran_vec (), ldaw, bw.fortran_vec (), ldbw, cw.fortran_vec (), ldcw, dw.fortran_vec (), lddw, ns, hsv.fortran_vec (), tol1, tol2, iwork, dwork, ldwork, iwarn, info)); if (f77_exception_encountered) error ("hnamodred: exception in SLICOT subroutine AB09JD"); static const char* err_msg[] = { "0: OK", "1: the computation of the ordered real Schur form of A " "failed", "2: the separation of the ALPHA-stable/unstable " "diagonal blocks failed because of very close eigenvalues", "3: the reduction of AV to a real Schur form failed", "4: the reduction of AW to a real Schur form failed", "5: the reduction to generalized Schur form of the " "descriptor pair corresponding to the inverse of V " "failed", "6: the reduction to generalized Schur form of the " "descriptor pair corresponding to the inverse of W " "failed", "7: the computation of Hankel singular values failed", "8: the computation of stable projection in the " "Hankel-norm approximation algorithm failed", "9: the order of computed stable projection in the " "Hankel-norm approximation algorithm differs " "from the order of Hankel-norm approximation", "10: the reduction of AV-BV*inv(DV)*CV to a " "real Schur form failed", "11: the reduction of AW-BW*inv(DW)*CW to a " "real Schur form failed", "12: the solution of the Sylvester equation failed " "because the poles of V (if JOBV = 'V') or of " "conj(V) (if JOBV = 'C') are not distinct from " "the poles of G1 (see METHOD)", "13: the solution of the Sylvester equation failed " "because the poles of W (if JOBW = 'W') or of " "conj(W) (if JOBW = 'C') are not distinct from " "the poles of G1 (see METHOD)", "14: the solution of the Sylvester equation failed " "because the zeros of V (if JOBV = 'I') or of " "conj(V) (if JOBV = 'R') are not distinct from " "the poles of G1sr (see METHOD)", "15: the solution of the Sylvester equation failed " "because the zeros of W (if JOBW = 'I') or of " "conj(W) (if JOBW = 'R') are not distinct from " "the poles of G1sr (see METHOD)", "16: the solution of the generalized Sylvester system " "failed because the zeros of V (if JOBV = 'I') or " "of conj(V) (if JOBV = 'R') are not distinct from " "the poles of G1sr (see METHOD)", "17: the solution of the generalized Sylvester system " "failed because the zeros of W (if JOBW = 'I') or " "of conj(W) (if JOBW = 'R') are not distinct from " "the poles of G1sr (see METHOD)", "18: op(V) is not antistable", "19: op(W) is not antistable", "20: V is not invertible", "21: W is not invertible"}; static const char* warn_msg[] = { "0: OK", "1: with ORDSEL = 'F', the selected order NR is greater " "than NSMIN, the sum of the order of the " "ALPHA-unstable part and the order of a minimal " "realization of the ALPHA-stable part of the given " "system. In this case, the resulting NR is set equal " "to NSMIN.", "2: with ORDSEL = 'F', the selected order NR is less " "than the order of the ALPHA-unstable part of the " "given system. In this case NR is set equal to the " "order of the ALPHA-unstable part."}; error_msg ("hnamodred", info, 21, err_msg); warning_msg ("hnamodred", iwarn, 2, warn_msg); // resize a.resize (nr, nr); b.resize (nr, m); c.resize (p, nr); hsv.resize (ns); // return values retval(0) = a; retval(1) = b; retval(2) = c; retval(3) = d; retval(4) = octave_value (nr); retval(5) = hsv; retval(6) = octave_value (ns); } return retval; } control/src/sl_ab13ad.cc0000644000076500000240000000713112273411257014375 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Hankel singular values. Uses SLICOT AB13AD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: January 2010 Version: 0.3 */ #include #include #include "common.h" extern "C" { int F77_FUNC (ab13ad, AB13AD) (char& DICO, char& EQUIL, int& N, int& M, int& P, double& ALPHA, double* A, int& LDA, double* B, int& LDB, double* C, int& LDC, int& NS, double* HSV, double* DWORK, int& LDWORK, int& INFO); } // PKG_ADD: autoload ("__sl_ab13ad__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_ab13ad__, args, nargout, "-*- texinfo -*-\n\ Slicot AB13AD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 6) { print_usage (); } else { // arguments in char dico; char equil; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); int discrete = args(3).int_value (); double alpha = args(4).double_value (); const int scaled = args(5).int_value (); if (discrete == 0) dico = 'C'; else dico = 'D'; if (scaled == 0) equil = 'S'; else equil = 'N'; int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int p = c.rows (); // p: number of outputs int lda = max (1, a.rows ()); int ldb = max (1, b.rows ()); int ldc = max (1, c.rows ()); // arguments out int ns = 0; ColumnVector hsv (n); // workspace int ldwork = max (1, n*(max (n, m, p) + 5) + n*(n+1)/2); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicators int info = 0; // SLICOT routine AB13AD F77_XFCN (ab13ad, AB13AD, (dico, equil, n, m, p, alpha, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, ns, hsv.fortran_vec (), dwork, ldwork, info)); if (f77_exception_encountered) error ("hsvd: __sl_ab13ad__: exception in SLICOT subroutine AB13AD"); if (info != 0) error ("hsvd: __sl_ab13ad__: AB13AD returned info = %d", info); // resize hsv.resize (ns); // return values retval(0) = hsv; retval(1) = octave_value (ns); } return retval; } control/src/sl_ab13bd.cc0000644000076500000240000000747612273411257014412 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . H-2 norm of a SS model. Uses SLICOT AB13BD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: November 2009 Version: 0.4 */ #include #include #include "common.h" extern "C" { double F77_FUNC (ab13bd, AB13BD) (char& DICO, char& JOBN, int& N, int& M, int& P, double* A, int& LDA, double* B, int& LDB, double* C, int& LDC, double* D, int& LDD, int& NQ, double& TOL, double* DWORK, int& LDWORK, int& IWARN, int& INFO); } // PKG_ADD: autoload ("__sl_ab13bd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_ab13bd__, args, nargout, "-*- texinfo -*-\n\ Slicot AB13BD Release 5.\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 5) { print_usage (); } else { // arguments in char dico; char jobn = 'H'; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); int discrete = args(4).int_value (); if (discrete == 0) dico = 'C'; else dico = 'D'; int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int p = c.rows (); // p: number of outputs int lda = max (1, a.rows ()); int ldb = max (1, b.rows ()); int ldc = max (1, c.rows ()); int ldd = max (1, d.rows ()); // arguments out double norm; int nq; // tolerance double tol = 0; // workspace int ldwork = max (1, m*(n+m) + max (n*(n+5), m*(m+2), 4*p ), n*(max (n, p) + 4 ) + min (n, p)); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicator int iwarn; int info; // SLICOT routine AB13BD norm = F77_FUNC (ab13bd, AB13BD) (dico, jobn, n, m, p, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, nq, tol, dwork, ldwork, iwarn, info); if (f77_exception_encountered) error ("lti: norm: __sl_ab13bd__: exception in SLICOT subroutine AB13BD"); if (info != 0) error ("lti: norm: __sl_ab13bd__: AB13BD returned info = %d", info); if (iwarn != 0) warning ("lti: norm: __sl_ab13bd__: AB13BD returned iwarn = %d", iwarn); // return value retval(0) = octave_value (norm); } return retval; } control/src/sl_ab13dd.cc0000644000076500000240000001151312273411257014377 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . L-infinity norm of a SS model. Uses SLICOT AB13DD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: November 2009 Version: 0.4 */ #include #include #include #include "common.h" extern "C" { int F77_FUNC (ab13dd, AB13DD) (char& DICO, char& JOBE, char& EQUIL, char& JOBD, int& N, int& M, int& P, double* FPEAK, double* A, int& LDA, double* E, int& LDE, double* B, int& LDB, double* C, int& LDC, double* D, int& LDD, double* GPEAK, double& TOL, int* IWORK, double* DWORK, int& LDWORK, Complex* CWORK, int& LCWORK, int& INFO); } // PKG_ADD: autoload ("__sl_ab13dd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_ab13dd__, args, nargout, "-*- texinfo -*-\n\ Slicot AB13DD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 9) { print_usage (); } else { // arguments in char dico; char jobe; char equil; char jobd = 'D'; Matrix a = args(0).matrix_value (); Matrix e = args(1).matrix_value (); Matrix b = args(2).matrix_value (); Matrix c = args(3).matrix_value (); Matrix d = args(4).matrix_value (); int discrete = args(5).int_value (); int descriptor = args(6).int_value (); double tol = args(7).double_value (); const int scaled = args(8).int_value (); if (discrete == 0) dico = 'C'; else dico = 'D'; if (descriptor == 0) jobe = 'I'; else jobe = 'G'; if (scaled == 0) equil = 'S'; else equil = 'N'; int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int p = c.rows (); // p: number of outputs int lda = max (1, n); int lde = max (1, n); int ldb = max (1, n); int ldc = max (1, p); int ldd = max (1, p); ColumnVector fpeak (2); ColumnVector gpeak (2); fpeak(0) = 0; fpeak(1) = 1; // workspace int ldwork = max (1, 15*n*n + p*p + m*m + (6*n+3)*(p+m) + 4*p*m + n*m + 22*n + 7*min(p,m)); int lcwork = max (1, (n+m)*(n+p) + 2*min(p,m) + max(p,m)); OCTAVE_LOCAL_BUFFER (int, iwork, n); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); OCTAVE_LOCAL_BUFFER (Complex, cwork, lcwork); // error indicator int info; // SLICOT routine AB13DD F77_XFCN (ab13dd, AB13DD, (dico, jobe, equil, jobd, n, m, p, fpeak.fortran_vec (), a.fortran_vec (), lda, e.fortran_vec (), lde, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, gpeak.fortran_vec (), tol, iwork, dwork, ldwork, cwork, lcwork, info)); if (f77_exception_encountered) error ("lti: norm: __sl_ab13dd__: exception in SLICOT subroutine AB13DD"); static const char* err_msg[] = { "0: OK", "1: the matrix E is (numerically) singular", "2: the (periodic) QR (or QZ) algorithm for computing " "eigenvalues did not converge", "3: the SVD algorithm for computing singular values did " "not converge", "4: the tolerance is too small and the algorithm did " "not converge"}; error_msg ("__sl_ab13dd__", info, 4, err_msg); // return values retval(0) = fpeak; retval(1) = gpeak; } return retval; } control/src/sl_ag08bd.cc0000644000076500000240000001711012273411257014405 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Transmission zeros of descriptor state-space models. Uses SLICOT AG08BD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: September 2010 Version: 0.4 */ #include #include #include "common.h" #include #include extern "C" { int F77_FUNC (ag08bd, AG08BD) (char& EQUIL, int& L, int& N, int& M, int& P, double* A, int& LDA, double* E, int& LDE, double* B, int& LDB, double* C, int& LDC, double* D, int& LDD, int& NFZ, int& NRANK, int& NIZ, int& DINFZ, int& NKROR, int& NINFE, int& NKROL, int* INFZ, int* KRONR, int* INFE, int* KRONL, double& TOL, int* IWORK, double* DWORK, int& LDWORK, int& INFO); int F77_FUNC (dggev, DGGEV) (char& JOBVL, char& JOBVR, int& N, double* A, int& LDA, double* B, int& LDB, double* ALPHAR, double* ALPHAI, double* BETA, double* VL, int& LDVL, double* VR, int& LDVR, double* WORK, int& LWORK, int& INFO); } // PKG_ADD: autoload ("__sl_ag08bd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_ag08bd__, args, nargout, "-*- texinfo -*-\n\ Slicot AG08BD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 6) { print_usage (); } else { // arguments in char equil; Matrix a = args(0).matrix_value (); Matrix e = args(1).matrix_value (); Matrix b = args(2).matrix_value (); Matrix c = args(3).matrix_value (); Matrix d = args(4).matrix_value (); const int scaled = args(5).int_value (); if (scaled == 0) equil = 'S'; else equil = 'N'; int l = a.rows (); // l: number of states int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int p = c.rows (); // p: number of outputs int lda = max (1, l); int lde = max (1, l); int ldb = max (1, l); if (m == 0) ldb = 1; int ldc = max (1, p); int ldd = max (1, p); // arguments out int nfz; int nrank; int niz; int dinfz; int nkror; int ninfe; int nkrol; OCTAVE_LOCAL_BUFFER (int, infz, n+1); OCTAVE_LOCAL_BUFFER (int, kronr, n+m+1); OCTAVE_LOCAL_BUFFER (int, infe, 1 + min (l+p, n+m)); OCTAVE_LOCAL_BUFFER (int, kronl, l+p+1); // workspace int ldwork = max (l+p, m+n) * (m+n) + max (1, 5 * max (l+p, m+n)); OCTAVE_LOCAL_BUFFER (int, iwork, n + max (1, m)); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicator int info; // tolerance double tol = 0; // AG08BD uses DLAMCH for default tolerance // SLICOT routine AG08BD F77_XFCN (ag08bd, AG08BD, (equil, l, n, m, p, a.fortran_vec (), lda, e.fortran_vec (), lde, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, nfz, nrank, niz, dinfz, nkror, ninfe, nkrol, infz, kronr, infe, kronl, tol, iwork, dwork, ldwork, info)); if (f77_exception_encountered) error ("dss: zero: __sl_ag08bd__: exception in SLICOT subroutine AG08BD"); if (info != 0) error ("dss: zero: __sl_ag08bd__: AG08BD returned info = %d", info); // DGGEV Part a.resize (nfz, nfz); // Af e.resize (nfz, nfz); // Ef lda = max (1, nfz); lde = max (1, nfz); char jobvl = 'N'; char jobvr = 'N'; ColumnVector alphar (nfz); ColumnVector alphai (nfz); ColumnVector beta (nfz); double* vl = 0; // not referenced because jobvl = 'N' int ldvl = 1; double* vr = 0; // not referenced because jobvr = 'N' int ldvr = 1; int lwork = max (1, 8*nfz); OCTAVE_LOCAL_BUFFER (double, work, lwork); int info2; F77_XFCN (dggev, DGGEV, (jobvl, jobvr, nfz, a.fortran_vec (), lda, e.fortran_vec (), lde, alphar.fortran_vec (), alphai.fortran_vec (), beta.fortran_vec (), vl, ldvl, vr, ldvr, work, lwork, info2)); if (f77_exception_encountered) error ("dss: zero: __sl_ag08bd__: exception in LAPACK subroutine DGGEV"); if (info2 != 0) error ("dss: zero: __sl_ag08bd__: DGGEV returned info = %d", info2); // assemble complex vector - adapted from DEFUN complex in data.cc // LAPACK DGGEV.f says: // // Note: the quotients ALPHAR(j)/BETA(j) and ALPHAI(j)/BETA(j) // may easily over- or underflow, and BETA(j) may even be zero. // Thus, the user should avoid naively computing the ratio // alpha/beta. However, ALPHAR and ALPHAI will be always less // than and usually comparable with norm(A) in magnitude, and // BETA always less than and usually comparable with norm(B). // // Since we need the zeros explicitly ... ColumnVector zeror (nfz); ColumnVector zeroi (nfz); zeror = quotient (alphar, beta); zeroi = quotient (alphai, beta); ComplexColumnVector zero (nfz, Complex ()); for (octave_idx_type i = 0; i < nfz; i++) zero.xelem (i) = Complex (zeror(i), zeroi(i)); // prepare additional outputs for info struct RowVector infzr (dinfz); RowVector kronrr (nkror); RowVector kronlr (nkrol); for (octave_idx_type i = 0; i < dinfz; i++) infzr.xelem (i) = infz[i]; for (octave_idx_type i = 0; i < nkror; i++) kronrr.xelem (i) = kronr[i]; for (octave_idx_type i = 0; i < nkrol; i++) kronlr.xelem (i) = kronl[i]; // return values retval(0) = zero; retval(1) = octave_value (nrank); retval(2) = infzr; retval(3) = kronrr; retval(4) = kronlr; } return retval; } control/src/sl_are.cc0000644000076500000240000002102612273411257014110 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Solve algebraic Riccati equation. Uses SLICOT SB02RD and SB02MT by courtesy of NICONET e.V. Author: Lukas Reichlin Created: December 2012 Version: 0.1 */ #include #include #include "common.h" #include extern "C" { int F77_FUNC (sb02mt, SB02MT) (char& JOBG, char& JOBL, char& FACT, char& UPLO, int& N, int& M, double* A, int& LDA, double* B, int& LDB, double* Q, int& LDQ, double* R, int& LDR, double* L, int& LDL, int* IPIV, int& OUFACT, double* G, int& LDG, int* IWORK, double* DWORK, int& LDWORK, int& INFO); int F77_FUNC (sb02rd, SB02RD) (char& JOB, char& DICO, char& HINV, char& TRANA, char& UPLO, char& SCAL, char& SORT, char& FACT, char& LYAPUN, int& N, double* A, int& LDA, double* T, int& LDT, double* V, int& LDV, double* G, int& LDG, double* Q, int& LDQ, double* X, int& LDX, double& SEP, double& RCOND, double& FERR, double* WR, double* WI, double* S, int& LDS, int* IWORK, double* DWORK, int& LDWORK, bool* BWORK, int& INFO); } // PKG_ADD: autoload ("__sl_are__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_are__, args, nargout, "-*- texinfo -*-\n\ Slicot SB02RD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 7) { print_usage (); } else { // SB02MT // arguments in char dico; char jobg = 'G'; char jobl; char fact = 'N'; char uplo = 'U'; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix q = args(2).matrix_value (); Matrix r = args(3).matrix_value (); Matrix l = args(4).matrix_value (); int discrete = args(5).int_value (); int ijobl = args(6).int_value (); if (discrete == 0) dico = 'C'; else dico = 'D'; if (ijobl == 0) jobl = 'Z'; else jobl = 'N'; int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int lda = max (1, n); int ldb = max (1, n); int ldq = max (1, n); int ldr = max (1, m); int ldl = max (1, n); // arguments out int ldg = max (1, n); Matrix g (ldg, n); // unused output arguments OCTAVE_LOCAL_BUFFER (int, ipiv, m); int oufact; // workspace OCTAVE_LOCAL_BUFFER (int, iwork_a, m); int ldwork_a = max (2, 3*m, n*m); OCTAVE_LOCAL_BUFFER (double, dwork_a, ldwork_a); // error indicator int info; // SLICOT routine SB02MT F77_XFCN (sb02mt, SB02MT, (jobg, jobl, fact, uplo, n, m, a.fortran_vec (), lda, b.fortran_vec (), ldb, q.fortran_vec (), ldq, r.fortran_vec (), ldr, l.fortran_vec (), ldl, ipiv, oufact, g.fortran_vec (), ldg, iwork_a, dwork_a, ldwork_a, info)); if (f77_exception_encountered) error ("are: __sl_are__: exception in SLICOT subroutine SB02MT"); if (info != 0) { if (info < 0) error ("are: sb02mt: the %d-th argument had an illegal value", info); else if (info == m+1) error ("are: sb02mt: the matrix R is numerically singular"); else error ("are: sb02mt: the %d-th element (1 <= %d <= %d) of the d factor is " "exactly zero; the UdU' (or LdL') factorization has " "been completed, but the block diagonal matrix d is " "exactly singular", info, info, m); } // SB02RD // arguments in char job = 'A'; char hinv = 'D'; char trana = 'N'; char scal = 'G'; char sort = 'S'; char lyapun = 'O'; int ldt = max (1, n); int ldv = max (1, n); int ldx = max (1, n); int lds = max (1, 2*n); // arguments out Matrix x (ldx, n); double sep; double rcond; double ferr; ColumnVector wr (2*n); ColumnVector wi (2*n); // unused output arguments Matrix t (ldt, n); Matrix v (ldv, n); Matrix s (lds, 2*n); // workspace int liwork_b = max (2*n, n*n); OCTAVE_LOCAL_BUFFER (int, iwork_b, liwork_b); int ldwork_b = 5 + max (1, 4*n*n + 8*n); OCTAVE_LOCAL_BUFFER (double, dwork_b, ldwork_b); OCTAVE_LOCAL_BUFFER (bool, bwork_b, 2*n); // SLICOT routine SB02RD F77_XFCN (sb02rd, SB02RD, (job, dico, hinv, trana, uplo, scal, sort, fact, lyapun, n, a.fortran_vec (), lda, t.fortran_vec (), ldt, v.fortran_vec (), ldv, g.fortran_vec (), ldg, q.fortran_vec (), ldq, x.fortran_vec (), ldx, sep, rcond, ferr, wr.fortran_vec (), wi.fortran_vec (), s.fortran_vec (), lds, iwork_b, dwork_b, ldwork_b, bwork_b, info)); static const char* err_msg[] = { "0: OK", "1: matrix A is (numerically) singular in discrete-" "time case", "2: the Hamiltonian or symplectic matrix H cannot be " "reduced to real Schur form", "3: the real Schur form of the Hamiltonian or " "symplectic matrix H cannot be appropriately ordered", "4: the Hamiltonian or symplectic matrix H has less " "than N stable eigenvalues", "5: if the N-th order system of linear algebraic " "equations, from which the solution matrix X would " "be obtained, is singular to working precision", "6: the QR algorithm failed to complete the reduction " "of the matrix Ac to Schur canonical form, T", "7: if T and -T' have some almost equal eigenvalues, if " "DICO = 'C', or T has almost reciprocal eigenvalues, " "if DICO = 'D'; perturbed values were used to solve " "Lyapunov equations, but the matrix T, if given (for " "FACT = 'F'), is unchanged. (This is a warning " "indicator.)"}; error_msg ("are", info, 7, err_msg); // resize x.resize (n, n); wr.resize (n); wi.resize (n); // assemble complex vector - adapted from DEFUN complex in data.cc ComplexColumnVector pole (n, Complex ()); for (octave_idx_type i = 0; i < n; i++) pole.xelem (i) = Complex (wr(i), wi(i)); // return value retval(0) = x; retval(1) = pole; retval(2) = octave_value (ferr); retval(3) = octave_value (rcond); retval(4) = octave_value (sep); } return retval; } control/src/sl_ib01ad.cc0000644000076500000240000003163612273411257014411 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . SLICOT system identification Uses SLICOT IB01AD, IB01BD and IB01CD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: March 2012 Version: 0.1 */ #include #include #include #include "common.h" extern "C" { int F77_FUNC (ib01ad, IB01AD) (char& METH, char& ALG, char& JOBD, char& BATCH, char& CONCT, char& CTRL, int& NOBR, int& M, int& L, int& NSMP, double* U, int& LDU, double* Y, int& LDY, int& N, double* R, int& LDR, double* SV, double& RCOND, double& TOL, int* IWORK, double* DWORK, int& LDWORK, int& IWARN, int& INFO); } // PKG_ADD: autoload ("__sl_ib01ad__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_ib01ad__, args, nargout, "-*- texinfo -*-\n\ Slicot IB01AD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 10) { print_usage (); } else { //////////////////////////////////////////////////////////////////////////////////// // SLICOT IB01AD - preprocess the input-output data // //////////////////////////////////////////////////////////////////////////////////// // arguments in char meth_a; char meth_b; char alg; char jobd; char batch; char conct; char ctrl = 'N'; const Cell y_cell = args(0).cell_value (); const Cell u_cell = args(1).cell_value (); int nobr = args(2).int_value (); int nuser = args(3).int_value (); const int imeth = args(4).int_value (); const int ialg = args(5).int_value (); const int iconct = args(6).int_value (); const int ictrl = args(7).int_value (); // ignored double rcond = args(8).double_value (); double tol_a = args(9).double_value (); double tol_b = rcond; double tol_c = rcond; switch (imeth) { case 0: meth_a = 'M'; meth_b = 'M'; break; case 1: meth_a = 'N'; meth_b = 'N'; break; case 2: meth_a = 'N'; // no typo here meth_b = 'C'; break; default: error ("__sl_ib01ad__: argument 'meth' invalid"); } switch (ialg) { case 0: alg = 'C'; break; case 1: alg = 'F'; break; case 2: alg = 'Q'; break; default: error ("__sl_ib01ad__: argument 'alg' invalid"); } if (meth_a == 'M') jobd = 'M'; else // meth_a == 'N' jobd = 'N'; // IB01AD.f says: This parameter is not relevant for METH = 'N' if (iconct == 0) conct = 'C'; else conct = 'N'; /* if (ictrl == 0) ctrl = 'C'; else ctrl = 'N'; */ // m and l are equal for all experiments, checked by iddata class int n_exp = y_cell.nelem (); // number of experiments int m = u_cell.elem(0).columns (); // m: number of inputs int l = y_cell.elem(0).columns (); // l: number of outputs int nsmpl = 0; // total number of samples // arguments out int n; int ldr; if (meth_a == 'M' && jobd == 'M') ldr = max (2*(m+l)*nobr, 3*m*nobr); else if (meth_a == 'N' || (meth_a == 'M' && jobd == 'N')) ldr = 2*(m+l)*nobr; else error ("__sl_ib01ad__: could not handle 'ldr' case"); Matrix r (ldr, 2*(m+l)*nobr); ColumnVector sv (l*nobr); // repeat for every experiment in the dataset for (int i = 0; i < n_exp; i++) { if (n_exp == 1) batch = 'O'; // one block only else if (i == 0) batch = 'F'; // first block else if (i == n_exp-1) batch = 'L'; // last block else batch = 'I'; // intermediate block Matrix y = y_cell.elem(i).matrix_value (); Matrix u = u_cell.elem(i).matrix_value (); // y.rows == u.rows is checked by iddata class // int m = u.columns (); // m: number of inputs // int l = y.columns (); // l: number of outputs int nsmp = y.rows (); // nsmp: number of samples in the current experiment nsmpl += nsmp; // nsmpl: total number of samples of all experiments // minimal nsmp size checked by __slicot_identification__.m if (batch == 'O') { if (nsmp < 2*(m+l+1)*nobr - 1) error ("__sl_ident__: require NSMP >= 2*(M+L+1)*NOBR - 1"); } else { if (nsmp < 2*nobr) error ("__sl_ident__: require NSMP >= 2*NOBR"); } int ldu; if (m == 0) ldu = 1; else // m > 0 ldu = nsmp; int ldy = nsmp; // workspace int liwork_a; if (meth_a == 'N') // if METH = 'N' liwork_a = (m+l)*nobr; else if (alg == 'F') // if METH = 'M' and ALG = 'F' liwork_a = m+l; else // if METH = 'M' and ALG = 'C' or 'Q' liwork_a = 0; // TODO: Handle 'k' for DWORK int ldwork_a; int ns = nsmp - 2*nobr + 1; if (alg == 'C') { if (batch == 'F' || batch == 'I') { if (conct == 'C') ldwork_a = (4*nobr-2)*(m+l); else // (conct == 'N') ldwork_a = 1; } else if (meth_a == 'M') // && (batch == 'L' || batch == 'O') { if (conct == 'C' && batch == 'L') ldwork_a = max ((4*nobr-2)*(m+l), 5*l*nobr); else if (jobd == 'M') ldwork_a = max ((2*m-1)*nobr, (m+l)*nobr, 5*l*nobr); else // (jobd == 'N') ldwork_a = 5*l*nobr; } else // meth_b == 'N' && (batch == 'L' || batch == 'O') { ldwork_a = 5*(m+l)*nobr + 1; } } else if (alg == 'F') { if (batch != 'O' && conct == 'C') ldwork_a = (m+l)*2*nobr*(m+l+3); else if (batch == 'F' || batch == 'I') // && conct == 'N' ldwork_a = (m+l)*2*nobr*(m+l+1); else // (batch == 'L' || '0' && conct == 'N') ldwork_a = (m+l)*4*nobr*(m+l+1)+(m+l)*2*nobr; } else // (alg == 'Q') { // int ns = nsmp - 2*nobr + 1; if (ldr >= ns && batch == 'F') { ldwork_a = 4*(m+l)*nobr; } else if (ldr >= ns && batch == 'O') { if (meth_a == 'M') ldwork_a = max (4*(m+l)*nobr, 5*l*nobr); else // (meth == 'N') ldwork_a = 5*(m+l)*nobr + 1; } else if (conct == 'C' && (batch == 'I' || batch == 'L')) { ldwork_a = 4*(nobr+1)*(m+l)*nobr; } else // if ALG = 'Q', (BATCH = 'F' or 'O', and LDR < NS), or (BATCH = 'I' or 'L' and CONCT = 'N') { ldwork_a = 6*(m+l)*nobr; } } /* IB01AD.f Lines 438-445 C FURTHER COMMENTS C C For ALG = 'Q', BATCH = 'O' and LDR < NS, or BATCH <> 'O', the C calculations could be rather inefficient if only minimal workspace C (see argument LDWORK) is provided. It is advisable to provide as C much workspace as possible. Almost optimal efficiency can be C obtained for LDWORK = (NS+2)*(2*(M+L)*NOBR), assuming that the C cache size is large enough to accommodate R, U, Y, and DWORK. */ ldwork_a = max (ldwork_a, (ns+2)*(2*(m+l)*nobr)); /* IB01AD.f Lines 291-195: c the workspace used for alg = 'q' is c ldrwrk*2*(m+l)*nobr + 4*(m+l)*nobr, c where ldrwrk = ldwork/(2*(m+l)*nobr) - 2; recommended c value ldrwrk = ns, assuming a large enough cache size. c for good performance, ldwork should be larger. somehow ldrwrk and ldwork must have been mixed up here */ OCTAVE_LOCAL_BUFFER (int, iwork_a, liwork_a); OCTAVE_LOCAL_BUFFER (double, dwork_a, ldwork_a); // error indicators int iwarn_a = 0; int info_a = 0; // SLICOT routine IB01AD F77_XFCN (ib01ad, IB01AD, (meth_a, alg, jobd, batch, conct, ctrl, nobr, m, l, nsmp, u.fortran_vec (), ldu, y.fortran_vec (), ldy, n, r.fortran_vec (), ldr, sv.fortran_vec (), rcond, tol_a, iwork_a, dwork_a, ldwork_a, iwarn_a, info_a)); if (f77_exception_encountered) error ("ident: exception in SLICOT subroutine IB01AD"); static const char* err_msg[] = { "0: OK", "1: a fast algorithm was requested (ALG = 'C', or 'F') " "in sequential data processing, but it failed; the " "routine can be repeatedly called again using the " "standard QR algorithm", "2: the singular value decomposition (SVD) algorithm did " "not converge"}; static const char* warn_msg[] = { "0: OK", "1: the number of 100 cycles in sequential data " "processing has been exhausted without signaling " "that the last block of data was get; the cycle " "counter was reinitialized", "2: a fast algorithm was requested (ALG = 'C' or 'F'), " "but it failed, and the QR algorithm was then used " "(non-sequential data processing)", "3: all singular values were exactly zero, hence N = 0 " "(both input and output were identically zero)", "4: the least squares problems with coefficient matrix " "U_f, used for computing the weighted oblique " "projection (for METH = 'N'), have a rank-deficient " "coefficient matrix", "5: the least squares problem with coefficient matrix " "r_1 [6], used for computing the weighted oblique " "projection (for METH = 'N'), has a rank-deficient " "coefficient matrix"}; error_msg ("ident: IB01AD", info_a, 2, err_msg); warning_msg ("ident: IB01AD", iwarn_a, 5, warn_msg); } // resize int rs = 2*(m+l)*nobr; r.resize (rs, rs); // return values retval(0) = sv; retval(1) = octave_value (n); } return retval; } control/src/sl_ib01cd.cc0000644000076500000240000001457012273411257014411 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Compute initial state vector x0 Uses IB01CD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: May 2012 Version: 0.1 */ #include #include #include #include "common.h" extern "C" { int F77_FUNC (ib01cd, IB01CD) (char& JOBX0, char& COMUSE, char& JOB, int& N, int& M, int& L, int& NSMP, double* A, int& LDA, double* B, int& LDB, double* C, int& LDC, double* D, int& LDD, double* U, int& LDU, double* Y, int& LDY, double* X0, double* V, int& LDV, double& TOL, int* IWORK, double* DWORK, int& LDWORK, int& IWARN, int& INFO); } // PKG_ADD: autoload ("__sl_ib01cd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_ib01cd__, args, nargout, "-*- texinfo -*-\n\ Slicot IB01CD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 7) { print_usage (); } else { // arguments in char jobx0 = 'X'; char comuse = 'U'; char jobbd = 'D'; const Cell y_cell = args(0).cell_value (); const Cell u_cell = args(1).cell_value (); Matrix a = args(2).matrix_value (); Matrix b = args(3).matrix_value (); Matrix c = args(4).matrix_value (); Matrix d = args(5).matrix_value (); double rcond = args(6).double_value (); double tol_c = rcond; int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int l = c.rows (); // l: number of outputs int lda = max (1, n); int ldb = max (1, n); int ldc = max (1, l); int ldd = max (1, l); // m and l are equal for all experiments, checked by iddata class int n_exp = y_cell.nelem (); // number of experiments // arguments out Cell x0_cell (n_exp, 1); // cell of initial state vectors x0 // repeat for every experiment in the dataset // compute individual initial state vector x0 for every experiment for (int i = 0; i < n_exp; i++) { Matrix y = y_cell.elem(i).matrix_value (); Matrix u = u_cell.elem(i).matrix_value (); int nsmp = y.rows (); // nsmp: number of samples int ldv = max (1, n); int ldu; if (m == 0) ldu = 1; else // m > 0 ldu = nsmp; int ldy = nsmp; // arguments out ColumnVector x0 (n); Matrix v (ldv, n); // workspace int liwork_c = n; // if JOBX0 = 'X' and COMUSE <> 'C' int ldwork_c; int t = nsmp; int ldw1_c = 2; int ldw2_c = t*l*(n + 1) + 2*n + max (2*n*n, 4*n); int ldw3_c = n*(n + 1) + 2*n + max (n*l*(n + 1) + 2*n*n + l*n, 4*n); ldwork_c = ldw1_c + n*( n + m + l ) + max (5*n, ldw1_c, min (ldw2_c, ldw3_c)); OCTAVE_LOCAL_BUFFER (int, iwork_c, liwork_c); OCTAVE_LOCAL_BUFFER (double, dwork_c, ldwork_c); // error indicators int iwarn_c = 0; int info_c = 0; // SLICOT routine IB01CD F77_XFCN (ib01cd, IB01CD, (jobx0, comuse, jobbd, n, m, l, nsmp, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, u.fortran_vec (), ldu, y.fortran_vec (), ldy, x0.fortran_vec (), v.fortran_vec (), ldv, tol_c, iwork_c, dwork_c, ldwork_c, iwarn_c, info_c)); if (f77_exception_encountered) error ("__sl_ib01cd__: exception in SLICOT subroutine IB01CD"); static const char* err_msg_c[] = { "0: OK", "1: the QR algorithm failed to compute all the " "eigenvalues of the matrix A (see LAPACK Library " "routine DGEES); the locations DWORK(i), for " "i = g+1:g+N*N, contain the partially converged " "Schur form", "2: the singular value decomposition (SVD) algorithm did " "not converge"}; static const char* warn_msg_c[] = { "0: OK", "1: warning message not specified", "2: warning message not specified", "3: warning message not specified", "4: the least squares problem to be solved has a " "rank-deficient coefficient matrix", "5: warning message not specified", "6: the matrix A is unstable; the estimated x(0) " "and/or B and D could be inaccurate"}; error_msg ("__sl_ib01cd__", info_c, 2, err_msg_c); warning_msg ("__sl_ib01cd__", iwarn_c, 6, warn_msg_c); x0_cell.elem(i) = x0; // add x0 from the current experiment to cell of initial state vectors } // return values retval(0) = x0_cell; } return retval; } control/src/sl_ident.cc0000644000076500000240000006104212273411257014446 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . SLICOT system identification Uses SLICOT IB01AD, IB01BD and IB01CD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: March 2012 Version: 0.1 */ #include #include #include #include "common.h" extern "C" { int F77_FUNC (ib01ad, IB01AD) (char& METH, char& ALG, char& JOBD, char& BATCH, char& CONCT, char& CTRL, int& NOBR, int& M, int& L, int& NSMP, double* U, int& LDU, double* Y, int& LDY, int& N, double* R, int& LDR, double* SV, double& RCOND, double& TOL, int* IWORK, double* DWORK, int& LDWORK, int& IWARN, int& INFO); int F77_FUNC (ib01bd, IB01BD) (char& METH, char& JOB, char& JOBCK, int& NOBR, int& N, int& M, int& L, int& NSMPL, double* R, int& LDR, double* A, int& LDA, double* C, int& LDC, double* B, int& LDB, double* D, int& LDD, double* Q, int& LDQ, double* RY, int& LDRY, double* S, int& LDS, double* K, int& LDK, double& TOL, int* IWORK, double* DWORK, int& LDWORK, bool* BWORK, int& IWARN, int& INFO); int F77_FUNC (ib01cd, IB01CD) (char& JOBX0, char& COMUSE, char& JOB, int& N, int& M, int& L, int& NSMP, double* A, int& LDA, double* B, int& LDB, double* C, int& LDC, double* D, int& LDD, double* U, int& LDU, double* Y, int& LDY, double* X0, double* V, int& LDV, double& TOL, int* IWORK, double* DWORK, int& LDWORK, int& IWARN, int& INFO); } // PKG_ADD: autoload ("__sl_ident__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_ident__, args, nargout, "-*- texinfo -*-\n\ Slicot IB01AD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 10) { print_usage (); } else { //////////////////////////////////////////////////////////////////////////////////// // SLICOT IB01AD - preprocess the input-output data // //////////////////////////////////////////////////////////////////////////////////// // arguments in char meth_a; char meth_b; char alg; char jobd; char batch; char conct; char ctrl; const Cell y_cell = args(0).cell_value (); const Cell u_cell = args(1).cell_value (); int nobr = args(2).int_value (); int nuser = args(3).int_value (); const int imeth = args(4).int_value (); const int ialg = args(5).int_value (); const int iconct = args(6).int_value (); const int ictrl = args(7).int_value (); double rcond = args(8).double_value (); double tol_a = args(9).double_value (); double tol_b = rcond; double tol_c = rcond; switch (imeth) { case 0: meth_a = 'M'; meth_b = 'M'; break; case 1: meth_a = 'N'; meth_b = 'N'; break; case 2: meth_a = 'N'; // no typo here meth_b = 'C'; break; default: error ("__sl_ib01ad__: argument 'meth' invalid"); } switch (ialg) { case 0: alg = 'C'; break; case 1: alg = 'F'; break; case 2: alg = 'Q'; break; default: error ("__sl_ib01ad__: argument 'alg' invalid"); } if (meth_a == 'M') jobd = 'M'; else // meth_a == 'N' jobd = 'N'; // IB01AD.f says: This parameter is not relevant for METH = 'N' if (iconct == 0) conct = 'C'; else conct = 'N'; if (ictrl == 0) ctrl = 'C'; else ctrl = 'N'; // m and l are equal for all experiments, checked by iddata class int n_exp = y_cell.nelem (); // number of experiments int m = u_cell.elem(0).columns (); // m: number of inputs int l = y_cell.elem(0).columns (); // l: number of outputs int nsmpl = 0; // total number of samples // arguments out int n; int ldr; if (meth_a == 'M' && jobd == 'M') ldr = max (2*(m+l)*nobr, 3*m*nobr); else if (meth_a == 'N' || (meth_a == 'M' && jobd == 'N')) ldr = 2*(m+l)*nobr; else error ("__sl_ib01ad__: could not handle 'ldr' case"); Matrix r (ldr, 2*(m+l)*nobr); ColumnVector sv (l*nobr); // repeat for every experiment in the dataset for (int i = 0; i < n_exp; i++) { if (n_exp == 1) batch = 'O'; // one block only else if (i == 0) batch = 'F'; // first block else if (i == n_exp-1) batch = 'L'; // last block else batch = 'I'; // intermediate block Matrix y = y_cell.elem(i).matrix_value (); Matrix u = u_cell.elem(i).matrix_value (); // y.rows == u.rows is checked by iddata class // int m = u.columns (); // m: number of inputs // int l = y.columns (); // l: number of outputs int nsmp = y.rows (); // nsmp: number of samples in the current experiment nsmpl += nsmp; // nsmpl: total number of samples of all experiments // minimal nsmp size checked by __slicot_identification__.m if (batch == 'O') { if (nsmp < 2*(m+l+1)*nobr - 1) error ("__sl_ident__: require NSMP >= 2*(M+L+1)*NOBR - 1"); } else { if (nsmp < 2*nobr) error ("__sl_ident__: require NSMP >= 2*NOBR"); } int ldu; if (m == 0) ldu = 1; else // m > 0 ldu = nsmp; int ldy = nsmp; // workspace int liwork_a; if (meth_a == 'N') // if METH = 'N' liwork_a = (m+l)*nobr; else if (alg == 'F') // if METH = 'M' and ALG = 'F' liwork_a = m+l; else // if METH = 'M' and ALG = 'C' or 'Q' liwork_a = 0; // TODO: Handle 'k' for DWORK int ldwork_a; int ns = nsmp - 2*nobr + 1; if (alg == 'C') { if (batch == 'F' || batch == 'I') { if (conct == 'C') ldwork_a = (4*nobr-2)*(m+l); else // (conct == 'N') ldwork_a = 1; } else if (meth_a == 'M') // && (batch == 'L' || batch == 'O') { if (conct == 'C' && batch == 'L') ldwork_a = max ((4*nobr-2)*(m+l), 5*l*nobr); else if (jobd == 'M') ldwork_a = max ((2*m-1)*nobr, (m+l)*nobr, 5*l*nobr); else // (jobd == 'N') ldwork_a = 5*l*nobr; } else // meth_b == 'N' && (batch == 'L' || batch == 'O') { ldwork_a = 5*(m+l)*nobr + 1; } } else if (alg == 'F') { if (batch != 'O' && conct == 'C') ldwork_a = (m+l)*2*nobr*(m+l+3); else if (batch == 'F' || batch == 'I') // && conct == 'N' ldwork_a = (m+l)*2*nobr*(m+l+1); else // (batch == 'L' || '0' && conct == 'N') ldwork_a = (m+l)*4*nobr*(m+l+1)+(m+l)*2*nobr; } else // (alg == 'Q') { // int ns = nsmp - 2*nobr + 1; if (ldr >= ns && batch == 'F') { ldwork_a = 4*(m+l)*nobr; } else if (ldr >= ns && batch == 'O') { if (meth_a == 'M') ldwork_a = max (4*(m+l)*nobr, 5*l*nobr); else // (meth == 'N') ldwork_a = 5*(m+l)*nobr + 1; } else if (conct == 'C' && (batch == 'I' || batch == 'L')) { ldwork_a = 4*(nobr+1)*(m+l)*nobr; } else // if ALG = 'Q', (BATCH = 'F' or 'O', and LDR < NS), or (BATCH = 'I' or 'L' and CONCT = 'N') { ldwork_a = 6*(m+l)*nobr; } } /* IB01AD.f Lines 438-445 C FURTHER COMMENTS C C For ALG = 'Q', BATCH = 'O' and LDR < NS, or BATCH <> 'O', the C calculations could be rather inefficient if only minimal workspace C (see argument LDWORK) is provided. It is advisable to provide as C much workspace as possible. Almost optimal efficiency can be C obtained for LDWORK = (NS+2)*(2*(M+L)*NOBR), assuming that the C cache size is large enough to accommodate R, U, Y, and DWORK. */ ldwork_a = max (ldwork_a, (ns+2)*(2*(m+l)*nobr)); /* IB01AD.f Lines 291-195: c the workspace used for alg = 'q' is c ldrwrk*2*(m+l)*nobr + 4*(m+l)*nobr, c where ldrwrk = ldwork/(2*(m+l)*nobr) - 2; recommended c value ldrwrk = ns, assuming a large enough cache size. c for good performance, ldwork should be larger. somehow ldrwrk and ldwork must have been mixed up here */ OCTAVE_LOCAL_BUFFER (int, iwork_a, liwork_a); OCTAVE_LOCAL_BUFFER (double, dwork_a, ldwork_a); // error indicators int iwarn_a = 0; int info_a = 0; // SLICOT routine IB01AD F77_XFCN (ib01ad, IB01AD, (meth_a, alg, jobd, batch, conct, ctrl, nobr, m, l, nsmp, u.fortran_vec (), ldu, y.fortran_vec (), ldy, n, r.fortran_vec (), ldr, sv.fortran_vec (), rcond, tol_a, iwork_a, dwork_a, ldwork_a, iwarn_a, info_a)); if (f77_exception_encountered) error ("ident: exception in SLICOT subroutine IB01AD"); static const char* err_msg[] = { "0: OK", "1: a fast algorithm was requested (ALG = 'C', or 'F') " "in sequential data processing, but it failed; the " "routine can be repeatedly called again using the " "standard QR algorithm", "2: the singular value decomposition (SVD) algorithm did " "not converge"}; static const char* warn_msg[] = { "0: OK", "1: the number of 100 cycles in sequential data " "processing has been exhausted without signaling " "that the last block of data was get; the cycle " "counter was reinitialized", "2: a fast algorithm was requested (ALG = 'C' or 'F'), " "but it failed, and the QR algorithm was then used " "(non-sequential data processing)", "3: all singular values were exactly zero, hence N = 0 " "(both input and output were identically zero)", "4: the least squares problems with coefficient matrix " "U_f, used for computing the weighted oblique " "projection (for METH = 'N'), have a rank-deficient " "coefficient matrix", "5: the least squares problem with coefficient matrix " "r_1 [6], used for computing the weighted oblique " "projection (for METH = 'N'), has a rank-deficient " "coefficient matrix"}; error_msg ("ident: IB01AD", info_a, 2, err_msg); warning_msg ("ident: IB01AD", iwarn_a, 5, warn_msg); } // resize int rs = 2*(m+l)*nobr; r.resize (rs, rs); if (nuser > 0) { if (nuser < nobr) { n = nuser; // warning ("ident: nuser (%d) < nobr (%d), n = nuser", nuser, nobr); } else error ("ident: 'nuser' invalid"); } //////////////////////////////////////////////////////////////////////////////////// // SLICOT IB01BD - estimating system matrices, Kalman gain, and covariances // //////////////////////////////////////////////////////////////////////////////////// // arguments in char job = 'A'; char jobck = 'K'; //int nsmpl = nsmp; if (nsmpl < 2*(m+l)*nobr) error ("__sl_ident__: nsmpl (%d) < 2*(m+l)*nobr (%d)", nsmpl, nobr); // arguments out int lda = max (1, n); int ldc = max (1, l); int ldb = max (1, n); int ldd = max (1, l); int ldq = n; // if JOBCK = 'C' or 'K' int ldry = l; // if JOBCK = 'C' or 'K' int lds = n; // if JOBCK = 'C' or 'K' int ldk = n; // if JOBCK = 'K' Matrix a (lda, n); Matrix c (ldc, n); Matrix b (ldb, m); Matrix d (ldd, m); Matrix q (ldq, n); Matrix ry (ldry, l); Matrix s (lds, l); Matrix k (ldk, l); // workspace int liwork_b; int liw1; int liw2; liw1 = max (n, m*nobr+n, l*nobr, m*(n+l)); liw2 = n*n; // if JOBCK = 'K' liwork_b = max (liw1, liw2); int ldwork_b; int ldw1; int ldw2; int ldw3; if (meth_b == 'M') { int ldw1a = max (2*(l*nobr-l)*n+2*n, (l*nobr-l)*n+n*n+7*n); int ldw1b = max (2*(l*nobr-l)*n+n*n+7*n, (l*nobr-l)*n+n+6*m*nobr, (l*nobr-l)*n+n+max (l+m*nobr, l*nobr + max (3*l*nobr+1, m))); ldw1 = max (ldw1a, ldw1b); int aw; if (m == 0 || job == 'C') aw = n + n*n; else aw = 0; ldw2 = l*nobr*n + max ((l*nobr-l)*n+aw+2*n+max(5*n,(2*m+l)*nobr+l), 4*(m*nobr+n)+1, m*nobr+2*n+l ); } else if (meth_b == 'N') { ldw1 = l*nobr*n + max ((l*nobr-l)*n+2*n+(2*m+l)*nobr+l, 2*(l*nobr-l)*n+n*n+8*n, n+4*(m*nobr+n)+1, m*nobr+3*n+l); if (m == 0 || job == 'C') ldw2 = 0; else ldw2 = l*nobr*n+m*nobr*(n+l)*(m*(n+l)+1)+ max ((n+l)*(n+l), 4*m*(n+l)+1); } else // (meth_b == 'C') { int ldw1a = max (2*(l*nobr-l)*n+2*n, (l*nobr-l)*n+n*n+7*n); int ldw1b = l*nobr*n + max ((l*nobr-l)*n+2*n+(2*m+l)*nobr+l, 2*(l*nobr-l)*n+n*n+8*n, n+4*(m*nobr+n)+1, m*nobr+3*n+l); ldw1 = max (ldw1a, ldw1b); ldw2 = l*nobr*n+m*nobr*(n+l)*(m*(n+l)+1)+ max ((n+l)*(n+l), 4*m*(n+l)+1); } ldw3 = max(4*n*n + 2*n*l + l*l + max (3*l, n*l), 14*n*n + 12*n + 5); ldwork_b = max (ldw1, ldw2, ldw3); OCTAVE_LOCAL_BUFFER (int, iwork_b, liwork_b); OCTAVE_LOCAL_BUFFER (double, dwork_b, ldwork_b); OCTAVE_LOCAL_BUFFER (bool, bwork, 2*n); // error indicators int iwarn_b = 0; int info_b = 0; // SLICOT routine IB01BD F77_XFCN (ib01bd, IB01BD, (meth_b, job, jobck, nobr, n, m, l, nsmpl, r.fortran_vec (), ldr, a.fortran_vec (), lda, c.fortran_vec (), ldc, b.fortran_vec (), ldb, d.fortran_vec (), ldd, q.fortran_vec (), ldq, ry.fortran_vec (), ldry, s.fortran_vec (), lds, k.fortran_vec (), ldk, tol_b, iwork_b, dwork_b, ldwork_b, bwork, iwarn_b, info_b)); if (f77_exception_encountered) error ("ident: exception in SLICOT subroutine IB01BD"); static const char* err_msg_b[] = { "0: OK", "1: error message not specified", "2: the singular value decomposition (SVD) algorithm did " "not converge", "3: a singular upper triangular matrix was found", "4: matrix A is (numerically) singular in discrete-" "time case", "5: the Hamiltonian or symplectic matrix H cannot be " "reduced to real Schur form", "6: the real Schur form of the Hamiltonian or " "symplectic matrix H cannot be appropriately ordered", "7: the Hamiltonian or symplectic matrix H has less " "than N stable eigenvalues", "8: the N-th order system of linear algebraic " "equations, from which the solution matrix X would " "be obtained, is singular to working precision", "9: the QR algorithm failed to complete the reduction " "of the matrix Ac to Schur canonical form, T", "10: the QR algorithm did not converge"}; static const char* warn_msg_b[] = { "0: OK", "1: warning message not specified", "2: warning message not specified", "3: warning message not specified", "4: a least squares problem to be solved has a " "rank-deficient coefficient matrix", "5: the computed covariance matrices are too small. " "The problem seems to be a deterministic one; the " "gain matrix is set to zero"}; error_msg ("ident: IB01BD", info_b, 10, err_msg_b); warning_msg ("ident: IB01BD", iwarn_b, 5, warn_msg_b); // resize a.resize (n, n); c.resize (l, n); b.resize (n, m); d.resize (l, m); q.resize (n, n); ry.resize (l, l); s.resize (n, l); k.resize (n, l); //////////////////////////////////////////////////////////////////////////////////// // SLICOT IB01CD - estimating the initial state // //////////////////////////////////////////////////////////////////////////////////// // arguments in char jobx0 = 'X'; char comuse = 'U'; char jobbd = 'D'; // arguments out Cell x0_cell (n_exp, 1); // cell of initial state vectors x0 // repeat for every experiment in the dataset // compute individual initial state vector x0 for every experiment for (int i = 0; i < n_exp; i++) { Matrix y = y_cell.elem(i).matrix_value (); Matrix u = u_cell.elem(i).matrix_value (); int nsmp = y.rows (); // nsmp: number of samples int ldv = max (1, n); int ldu; if (m == 0) ldu = 1; else // m > 0 ldu = nsmp; int ldy = nsmp; // arguments out ColumnVector x0 (n); Matrix v (ldv, n); // workspace int liwork_c = n; // if JOBX0 = 'X' and COMUSE <> 'C' int ldwork_c; int t = nsmp; int ldw1_c = 2; int ldw2_c = t*l*(n + 1) + 2*n + max (2*n*n, 4*n); int ldw3_c = n*(n + 1) + 2*n + max (n*l*(n + 1) + 2*n*n + l*n, 4*n); ldwork_c = ldw1_c + n*( n + m + l ) + max (5*n, ldw1_c, min (ldw2_c, ldw3_c)); OCTAVE_LOCAL_BUFFER (int, iwork_c, liwork_c); OCTAVE_LOCAL_BUFFER (double, dwork_c, ldwork_c); // error indicators int iwarn_c = 0; int info_c = 0; // SLICOT routine IB01CD F77_XFCN (ib01cd, IB01CD, (jobx0, comuse, jobbd, n, m, l, nsmp, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, u.fortran_vec (), ldu, y.fortran_vec (), ldy, x0.fortran_vec (), v.fortran_vec (), ldv, tol_c, iwork_c, dwork_c, ldwork_c, iwarn_c, info_c)); if (f77_exception_encountered) error ("ident: exception in SLICOT subroutine IB01CD"); static const char* err_msg_c[] = { "0: OK", "1: the QR algorithm failed to compute all the " "eigenvalues of the matrix A (see LAPACK Library " "routine DGEES); the locations DWORK(i), for " "i = g+1:g+N*N, contain the partially converged " "Schur form", "2: the singular value decomposition (SVD) algorithm did " "not converge"}; static const char* warn_msg_c[] = { "0: OK", "1: warning message not specified", "2: warning message not specified", "3: warning message not specified", "4: the least squares problem to be solved has a " "rank-deficient coefficient matrix", "5: warning message not specified", "6: the matrix A is unstable; the estimated x(0) " "and/or B and D could be inaccurate"}; error_msg ("ident: IB01CD", info_c, 2, err_msg_c); warning_msg ("ident: IB01CD", iwarn_c, 6, warn_msg_c); x0_cell.elem(i) = x0; // add x0 from the current experiment to cell of initial state vectors } // return values retval(0) = a; retval(1) = b; retval(2) = c; retval(3) = d; retval(4) = q; retval(5) = ry; retval(6) = s; retval(7) = k; retval(8) = x0_cell; } return retval; } control/src/sl_sb01bd.cc0000644000076500000240000001230212273411257014411 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Pole assignment for a given matrix pair (A,B). Uses SLICOT SB01BD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: November 2009 Version: 0.5 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb01bd, SB01BD) (char& DICO, int& N, int& M, int& NP, double& ALPHA, double* A, int& LDA, double* B, int& LDB, double* WR, double* WI, int& NFP, int& NAP, int& NUP, double* F, int& LDF, double* Z, int& LDZ, double& TOL, double* DWORK, int& LDWORK, int& IWARN, int& INFO); } // PKG_ADD: autoload ("__sl_sb01bd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb01bd__, args, nargout, "-*- texinfo -*-\n\ Slicot SB01BD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 7) { print_usage (); } else { // arguments in char dico; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); ColumnVector wr = args(2).column_vector_value (); ColumnVector wi = args(3).column_vector_value (); int discrete = args(4).int_value (); double alpha = args(5).double_value (); double tol = args(6).double_value (); if (discrete == 1) dico = 'D'; else dico = 'C'; int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int np = wr.rows (); int lda = max (1, a.rows ()); int ldb = max (1, b.rows ()); int ldf = max (1, m); int ldz = max (1, n); // arguments out int nfp; int nap; int nup; Matrix f (ldf, n); Matrix z (ldz, n); // workspace int ldwork = max (1, 5*m, 5*n, 2*n+4*m); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicators int iwarn; int info; // SLICOT routine SB01BD F77_XFCN (sb01bd, SB01BD, (dico, n, m, np, alpha, a.fortran_vec (), lda, b.fortran_vec (), ldb, wr.fortran_vec (), wi.fortran_vec (), nfp, nap, nup, f.fortran_vec (), ldf, z.fortran_vec (), ldz, tol, dwork, ldwork, iwarn, info)); if (f77_exception_encountered) error ("place: __sl_sb01bd__: exception in SLICOT subroutine SB01BD"); static const char* err_msg[] = { "0: OK", "1: the reduction of A to a real Schur form failed.", "2: a failure was detected during the ordering of the " "real Schur form of A, or in the iterative process " "for reordering the eigenvalues of Z'*(A + B*F)*Z " "along the diagonal.", "3: the number of eigenvalues to be assigned is less " "than the number of possibly assignable eigenvalues; " "NAP eigenvalues have been properly assigned, " "but some assignable eigenvalues remain unmodified.", "4: an attempt is made to place a complex conjugate " "pair on the location of a real eigenvalue. This " "situation can only appear when N-NFP is odd, " "NP > N-NFP-NUP is even, and for the last real " "eigenvalue to be modified there exists no available " "real eigenvalue to be assigned. However, NAP " "eigenvalues have been already properly assigned."}; static const char* warn_msg[] = { "0: OK", /* 0+%d: %d */ "violations of the numerical stability condition " "NORM(F) <= 100*NORM(A)/NORM(B) occured during the " "assignment of eigenvalues."}; error_msg ("place", info, 4, err_msg); warning_msg ("place", iwarn, 0, warn_msg, 0); // return values retval(0) = f; retval(1) = octave_value (nfp); retval(2) = octave_value (nap); retval(3) = octave_value (nup); retval(4) = z; } return retval; } control/src/sl_sb02od.cc0000644000076500000240000001444112273411257014435 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Solve algebraic Riccati equation. Uses SLICOT SB02OD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: February 2010 Version: 0.4 */ #include #include #include "common.h" #include extern "C" { int F77_FUNC (sb02od, SB02OD) (char& DICO, char& JOBB, char& FACT, char& UPLO, char& JOBL, char& SORT, int& N, int& M, int& P, double* A, int& LDA, double* B, int& LDB, double* Q, int& LDQ, double* R, int& LDR, double* L, int& LDL, double& RCOND, double* X, int& LDX, double* ALFAR, double* ALFAI, double* BETA, double* S, int& LDS, double* T, int& LDT, double* U, int& LDU, double& TOL, int* IWORK, double* DWORK, int& LDWORK, bool* BWORK, int& INFO); } // PKG_ADD: autoload ("__sl_sb02od__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb02od__, args, nargout, "-*- texinfo -*-\n\ Slicot SB02OD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 7) { print_usage (); } else { // arguments in char dico; char jobb = 'B'; char fact = 'N'; char uplo = 'U'; char jobl; char sort = 'S'; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix q = args(2).matrix_value (); Matrix r = args(3).matrix_value (); Matrix l = args(4).matrix_value (); int discrete = args(5).int_value (); int ijobl = args(6).int_value (); if (discrete == 0) dico = 'C'; else dico = 'D'; if (ijobl == 0) jobl = 'Z'; else jobl = 'N'; int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int p = 0; // p: number of outputs, not used because FACT = 'N' int lda = max (1, n); int ldb = max (1, n); int ldq = max (1, n); int ldr = max (1, m); int ldl = max (1, n); // arguments out double rcond; int ldx = max (1, n); Matrix x (ldx, n); int nu = 2*n; ColumnVector alfar (nu); ColumnVector alfai (nu); ColumnVector beta (nu); int lds = max (1, 2*n + m); Matrix s (lds, lds); // unused output arguments int ldt = max (1, 2*n + m); OCTAVE_LOCAL_BUFFER (double, t, ldt * 2*n); int ldu = max (1, 2*n); OCTAVE_LOCAL_BUFFER (double, u, ldu * 2*n); // tolerance double tol = 0; // use default value // workspace int liwork = max (1, m, 2*n); OCTAVE_LOCAL_BUFFER (int, iwork, liwork); int ldwork = max (7*(2*n + 1) + 16, 16*n, 2*n + m, 3*m); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); OCTAVE_LOCAL_BUFFER (bool, bwork, 2*n); // error indicator int info; // SLICOT routine SB02OD F77_XFCN (sb02od, SB02OD, (dico, jobb, fact, uplo, jobl, sort, n, m, p, a.fortran_vec (), lda, b.fortran_vec (), ldb, q.fortran_vec (), ldq, r.fortran_vec (), ldr, l.fortran_vec (), ldl, rcond, x.fortran_vec (), ldx, alfar.fortran_vec (), alfai.fortran_vec (), beta.fortran_vec (), s.fortran_vec (), lds, t, ldt, u, ldu, tol, iwork, dwork, ldwork, bwork, info)); if (f77_exception_encountered) error ("are: __sl_sb02od__: exception in SLICOT subroutine SB02OD"); static const char* err_msg[] = { "0: OK", "1: the computed extended matrix pencil is singular, " "possibly due to rounding errors", "2: the QZ (or QR) algorithm failed", "3: reordering of the (generalized) eigenvalues " "failed", "4: after reordering, roundoff changed values of " "some complex eigenvalues so that leading eigenvalues " "in the (generalized) Schur form no longer satisfy " "the stability condition; this could also be caused " "due to scaling", "5: the computed dimension of the solution does not " "equal N", "6: a singular matrix was encountered during the " "computation of the solution matrix X"}; error_msg ("are", info, 6, err_msg); // assemble complex vector - adapted from DEFUN complex in data.cc alfar.resize (n); alfai.resize (n); beta.resize (n); ColumnVector poler (n); ColumnVector polei (n); poler = quotient (alfar, beta); polei = quotient (alfai, beta); ComplexColumnVector pole (n, Complex ()); for (octave_idx_type i = 0; i < n; i++) pole.xelem (i) = Complex (poler(i), polei(i)); // return value retval(0) = x; retval(1) = pole; } return retval; } control/src/sl_sb03md.cc0000644000076500000240000000702112273411257014430 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Solution of Lyapunov equations. Uses SLICOT SB03MD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: December 2009 Version: 0.3 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb03md, SB03MD) (char& DICO, char& JOB, char& FACT, char& TRANA, int& N, double* A, int& LDA, double* U, int& LDU, double* C, int& LDC, double& SCALE, double& SEP, double& FERR, double* WR, double* WI, int* IWORK, double* DWORK, int& LDWORK, int& INFO); } // PKG_ADD: autoload ("__sl_sb03md__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb03md__, args, nargout, "-*- texinfo -*-\n\ Slicot SB03MD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 3) { print_usage (); } else { // arguments in char dico; char job = 'X'; char fact = 'N'; char trana = 'T'; Matrix a = args(0).matrix_value (); Matrix c = args(1).matrix_value (); int discrete = args(2).int_value (); if (discrete == 0) dico = 'C'; else dico = 'D'; int n = a.rows (); // n: number of states int lda = max (1, n); int ldu = max (1, n); int ldc = max (1, n); // arguments out double scale; double sep = 0; double ferr = 0; Matrix u (ldu, n); ColumnVector wr (n); ColumnVector wi (n); // workspace int* iwork = 0; // not referenced because job = X int ldwork = max (n*n, 3*n); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicator int info; // SLICOT routine SB03MD F77_XFCN (sb03md, SB03MD, (dico, job, fact, trana, n, a.fortran_vec (), lda, u.fortran_vec (), ldu, c.fortran_vec (), ldc, scale, sep, ferr, wr.fortran_vec (), wi.fortran_vec (), iwork, dwork, ldwork, info)); if (f77_exception_encountered) error ("lyap: __sl_sb03md__: exception in SLICOT subroutine SB03MD"); if (info != 0) error ("lyap: __sl_sb03md__: SB03MD returned info = %d", info); // return values retval(0) = c; retval(1) = octave_value (scale); } return retval; } control/src/sl_sb03od.cc0000644000076500000240000000700012273411257014427 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Square-root solver for Lyapunov equations. Uses SLICOT SB03OD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: January 2010 Version: 0.2 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb03od, SB03OD) (char& DICO, char& FACT, char& TRANS, int& N, int& M, double* A, int& LDA, double* Q, int& LDQ, double* B, int& LDB, double& SCALE, double* WR, double* WI, double* DWORK, int& LDWORK, int& INFO); } // PKG_ADD: autoload ("__sl_sb03od__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb03od__, args, nargout, "-*- texinfo -*-\n\ Slicot SB03OD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 3) { print_usage (); } else { // arguments in char dico; char fact = 'N'; char trans = 'N'; // char trans = 'T'; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); int discrete = args(2).int_value (); if (discrete == 0) dico = 'C'; else dico = 'D'; int n = a.rows (); int m = b.rows (); // int m = b.columns (); int lda = max (1, n); int ldq = max (1, n); int ldb = max (1, n, m); // int ldb = max (1, n); b.resize (ldb, n); // b.resize (ldb, max (m, n)); // arguments out double scale; Matrix q (ldq, n); ColumnVector wr (n); ColumnVector wi (n); // workspace int ldwork = max (1, 4*n + min (m, n)); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicator int info; // SLICOT routine SB03OD F77_XFCN (sb03od, SB03OD, (dico, fact, trans, n, m, a.fortran_vec (), lda, q.fortran_vec (), ldq, b.fortran_vec (), ldb, scale, wr.fortran_vec (), wi.fortran_vec (), dwork, ldwork, info)); if (f77_exception_encountered) error ("lyapchol: __sl_sb03od__: exception in SLICOT subroutine SB03OD"); if (info != 0) error ("lyapchol: __sl_sb03od__: SB03OD returned info = %d", info); // resize b.resize (n, n); // return values retval(0) = b; // b has been overwritten by cholesky factor u retval(1) = octave_value (scale); } return retval; } control/src/sl_sb04md.cc0000644000076500000240000000566012273411257014440 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Solution of continuous-time Sylvester equations. Uses SLICOT SB04MD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: January 2010 Version: 0.2 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb04md, SB04MD) (int& N, int& M, double* A, int& LDA, double* B, int& LDB, double* C, int& LDC, double* Z, int& LDZ, int* IWORK, double* DWORK, int& LDWORK, int& INFO); } // PKG_ADD: autoload ("__sl_sb04md__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb04md__, args, nargout, "-*- texinfo -*-\n\ Slicot SB04MD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 3) { print_usage (); } else { // arguments in Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); int n = a.rows (); int m = b.rows (); int lda = max (1, n); int ldb = max (1, m); int ldc = max (1, n); int ldz = max (1, m); // arguments out Matrix z (ldz, m); // workspace int ldwork = max (1, 2*n*n + 8*n, 5*m, n + m); OCTAVE_LOCAL_BUFFER (int, iwork, 4*n); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicator int info; // SLICOT routine SB04MD F77_XFCN (sb04md, SB04MD, (n, m, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, z.fortran_vec (), ldz, iwork, dwork, ldwork, info)); if (f77_exception_encountered) error ("lyap: __sl_sb04md__: exception in SLICOT subroutine SB04MD"); if (info != 0) error ("lyap: __sl_sb04md__: SB04MD returned info = %d", info); // return values retval(0) = c; } return retval; } control/src/sl_sb04qd.cc0000644000076500000240000000566012273411257014444 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Solution of discrete-time Sylvester equations. Uses SLICOT SB04QD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: January 2010 Version: 0.2 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb04qd, SB04QD) (int& N, int& M, double* A, int& LDA, double* B, int& LDB, double* C, int& LDC, double* Z, int& LDZ, int* IWORK, double* DWORK, int& LDWORK, int& INFO); } // PKG_ADD: autoload ("__sl_sb04qd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb04qd__, args, nargout, "-*- texinfo -*-\n\ Slicot SB04QD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 3) { print_usage (); } else { // arguments in Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); int n = a.rows (); int m = b.rows (); int lda = max (1, n); int ldb = max (1, m); int ldc = max (1, n); int ldz = max (1, m); // arguments out Matrix z (ldz, m); // workspace int ldwork = max (1, 2*n*n + 9*n, 5*m, n + m); OCTAVE_LOCAL_BUFFER (int, iwork, 4*n); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicator int info; // SLICOT routine SB04QD F77_XFCN (sb04qd, SB04QD, (n, m, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, z.fortran_vec (), ldz, iwork, dwork, ldwork, info)); if (f77_exception_encountered) error ("dlyap: __sl_sb04qd__: exception in SLICOT subroutine SB04QD"); if (info != 0) error ("dlyap: __sl_sb04qd__: SB04QD returned info = %d", info); // return values retval(0) = c; } return retval; } control/src/sl_sb10ad.cc0000644000076500000240000002062712273411257014421 0ustar lukasstaff/* Copyright (C) 2014 Thomas Vasileiou This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . H-infinity optimal controller using modified Glover's and Doyle's formulas (continuous-time). Uses SLICOT SB10AD by courtesy of NICONET e.V. Author: Thomas Vasileiou Created: January 2014 Version: 0.1 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb10ad, SB10AD) (int& JOB, int& N, int& M, int& NP, int& NCON, int& NMEAS, double& GAMMA, double* A, int& LDA, double* B, int& LDB, double* C, int& LDC, double* D, int& LDD, double* AK, int& LDAK, double* BK, int& LDBK, double* CK, int& LDCK, double* DK, int& LDDK, double* AC, int& LDAC, double* BC, int& LDBC, double* CC, int& LDCC, double* DC, int& LDDC, double* RCOND, double& GTOL, double& ACTOL, int* IWORK, int& LIWORK, double* DWORK, int& LDWORK, bool* BWORK, int& LBWORK, int& INFO); } // PKG_ADD: autoload ("__sl_sb10ad__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb10ad__, args, nargout, "-*- texinfo -*-\n\ Slicot SB10AD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 9) { print_usage (); } else { // arguments in Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); int ncon = args(4).int_value (); int nmeas = args(5).int_value (); double gamma = args(6).double_value (); double gtol = args(7).double_value (); double actol = args(8).double_value (); int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int np = c.rows (); // np: number of outputs int lda = max (1, a.rows ()); int ldb = max (1, b.rows ()); int ldc = max (1, c.rows ()); int ldd = max (1, d.rows ()); int ldak = max (1, n); int ldbk = max (1, n); int ldck = max (1, ncon); int lddk = max (1, ncon); int ldac = max (1, 2*n); int ldbc = max (1, 2*n); int ldcc = max (1, np-nmeas); int lddc = max (1, np-nmeas); int job = 1; // arguments out Matrix ak (ldak, n); Matrix bk (ldbk, nmeas); Matrix ck (ldck, n); Matrix dk (lddk, nmeas); Matrix ac (ldac, 2*n); Matrix bc (ldbc, m-ncon); Matrix cc (ldcc, 2*n); Matrix dc (lddc, m-ncon); ColumnVector rcond (4); // workspace int m2 = ncon; int m1 = m - m2; int np2 = nmeas; int np1 = np - np2; int nd1 = np1 - m2; int nd2 = m1 - np2; int liwork = max (2*max (n, m-ncon, np-nmeas, ncon, nmeas), n*n); int lw1 = n*m + np*n + np*m + m2*m2 + np2*np2; int lw2 = max ((n + np1 + 1)*(n + m2) + max (3*(n + m2) + n + np1, 5*(n + m2)), (n + np2)*(n + m1 + 1) + max (3*(n + np2) + n + m1, 5*(n + np2)), m2 + np1*np1 + max (np1*max (n, m1), 3*m2 + np1, 5*m2), np2 + m1*m1 + max (max (n, np1)*m1, 3*np2 + m1, 5*np2)); int lw3 = max (nd1*m1 + max (4*min (nd1, m1) + max (nd1,m1), 6*min (nd1, m1)), np1*nd2 + max (4*min (np1, nd2) + max (np1, nd2), 6*min (np1, nd2))); int lw4 = 2*m*m + np*np + 2*m*n + m*np + 2*n*np; int lw5 = 2*n*n + m*n + n*np; int lw6 = max (m*m + max (2*m1, 3*n*n + max (n*m, 10*n*n + 12*n + 5)), np*np + max (2*np1, 3*n*n + max (n*np, 10*n*n + 12*n + 5))); int lw7 = m2*np2 + np2*np2 + m2*m2 + max (nd1*nd1 + max (2*nd1, (nd1 + nd2)*np2), nd2*nd2 + max (2*nd2, nd2*m2), 3*n, n*(2*np2 + m2) + max (2*n*m2, m2*np2 + max (m2*m2 + 3*m2, np2*(2*np2 + m2 + max (np2, n))))); int ldwork = lw1 + max (1, lw2, lw3, lw4, lw5 + max (lw6,lw7)); int lbwork = 2*n; OCTAVE_LOCAL_BUFFER (int, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); OCTAVE_LOCAL_BUFFER (bool, bwork, lbwork); // error indicator int info; // SLICOT routine SB10AD F77_XFCN (sb10ad, SB10AD, (job, n, m, np, ncon, nmeas, gamma, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, ak.fortran_vec (), ldak, bk.fortran_vec (), ldbk, ck.fortran_vec (), ldck, dk.fortran_vec (), lddk, ac.fortran_vec (), ldac, bc.fortran_vec (), ldbc, cc.fortran_vec (), ldcc, dc.fortran_vec (), lddc, rcond.fortran_vec (), gtol, actol, iwork, liwork, dwork, ldwork, bwork, lbwork, info)); if (f77_exception_encountered) error ("hinfsyn: __sl_sb10ad__: exception in SLICOT subroutine SB10AD"); static const char* err_msg[] = { "0: successful exit", "1: the matrix [A-j*omega*I, B2; C1, D12] had " "not full column rank in respect to the tolerance EPS", "2: the matrix [A-j*omega*I, B1; C2, D21] " "had not full row rank in respect to the tolerance EPS", "3: the matrix D12 had not full column rank in " "respect to the tolerance SQRT(EPS)", "4: the matrix D21 had not full row rank in respect " "to the tolerance SQRT(EPS)", "5: the singular value decomposition (SVD) algorithm " "did not converge (when computing the SVD of one of the matrices " "[A, B2; C1, D12], [A, B1; C2, D21], D12 or D21)", "6: the controller is not admissible (too small value " "of gamma)", "7: the X-Riccati equation was not solved " "successfully (the controller is not admissible or " "there are numerical difficulties)", "8: the Y-Riccati equation was not solved " "successfully (the controller is not admissible or " "there are numerical difficulties)", "9: the determinant of Im2 + Tu*D11HAT*Ty*D22 is " "zero [3]", "10: there was numerical problems when estimating" "the singular values of D1111, D1112, D1111', D1121'", "11: the matrices Inp2 - D22*DK or Im2 - DK*D22" "are singular to working precision", "12: a stabilizing controller cannot be found"}; error_msg ("hinfsyn", info, 12, err_msg); // return values retval(0) = ak; retval(1) = bk; retval(2) = ck; retval(3) = dk; retval(4) = ac; retval(5) = bc; retval(6) = cc; retval(7) = dc; retval(8) = gamma; retval(9) = rcond; } return retval; } control/src/sl_sb10dd.cc0000644000076500000240000001402712273411257014421 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . H-infinity (sub)optimal state controller for a discrete-time system. Uses SLICOT SB10DD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: December 2009 Version: 0.5 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb10dd, SB10DD) (int& N, int& M, int& NP, int& NCON, int& NMEAS, double& GAMMA, double* A, int& LDA, double* B, int& LDB, double* C, int& LDC, double* D, int& LDD, double* AK, int& LDAK, double* BK, int& LDBK, double* CK, int& LDCK, double* DK, int& LDDK, double* X, int& LDX, double* Z, int& LDZ, double* RCOND, double& TOL, int* IWORK, double* DWORK, int& LDWORK, bool* BWORK, int& INFO); } // PKG_ADD: autoload ("__sl_sb10dd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb10dd__, args, nargout, "-*- texinfo -*-\n\ Slicot SB10DD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 7) { print_usage (); } else { // arguments in Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); int ncon = args(4).int_value (); int nmeas = args(5).int_value (); double gamma = args(6).double_value (); int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int np = c.rows (); // np: number of outputs int lda = max (1, a.rows ()); int ldb = max (1, b.rows ()); int ldc = max (1, c.rows ()); int ldd = max (1, d.rows ()); int ldak = max (1, n); int ldbk = max (1, n); int ldck = max (1, ncon); int lddk = max (1, ncon); int ldx = max (1, n); int ldz = max (1, n); double tol = 0; // arguments out Matrix ak (ldak, n); Matrix bk (ldbk, nmeas); Matrix ck (ldck, n); Matrix dk (lddk, nmeas); Matrix x (ldx, n); Matrix z (ldz, n); ColumnVector rcond (8); // workspace int m2 = ncon; int m1 = m - m2; int np1 = np - nmeas; int np2 = nmeas; int liwork = max (2*max (m2, n), m, m2+np2, n*n); int q = max (m1, m2, np1, np2); int ldwork = max ((n+q)*(n+q+6), 13*n*n + m*m + 2*q*q + n*(m+q) + max (m*(m+7*n), 2*q*(8*n+m+2*q)) + 6*n + max (14*n+23, 16*n, 2*n + max (m, 2*q), 3*max (m, 2*q))); OCTAVE_LOCAL_BUFFER (int, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); OCTAVE_LOCAL_BUFFER (bool, bwork, 2*n); // error indicator int info; // SLICOT routine SB10DD F77_XFCN (sb10dd, SB10DD, (n, m, np, ncon, nmeas, gamma, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, ak.fortran_vec (), ldak, bk.fortran_vec (), ldbk, ck.fortran_vec (), ldck, dk.fortran_vec (), lddk, x.fortran_vec (), ldx, z.fortran_vec (), ldz, rcond.fortran_vec (), tol, iwork, dwork, ldwork, bwork, info)); if (f77_exception_encountered) error ("hinfsyn: __sl_sb10dd__: exception in SLICOT subroutine SB10DD"); static const char* err_msg[] = { "0: OK", "1: the matrix [A-exp(j*Theta)*I, B2; C1, D12] " "had not full column rank", "2: the matrix | A-exp(j*Theta)*I, B1; C2, D21] " "had not full row rank", "3: the matrix D12 had not full column rank", "4: the matrix D21 had not full row rank", "5: the controller is not admissible " "(too small value of gamma)", "6: the X-Riccati equation was not solved " "successfully (the controller is not admissible or " "there are numerical difficulties)", "7: the Z-Riccati equation was not solved " "successfully (the controller is not admissible or " "there are numerical difficulties)", "8: the matrix Im2 + DKHAT*D22 is singular", "9: the singular value decomposition (SVD) algorithm " "did not converge (when computing the SVD of one of " "the matrices [A, B2; C1, D12], [A, B1; C2, D21], D12 or D21)"}; error_msg ("hinfsyn", info, 9, err_msg); // return values retval(0) = ak; retval(1) = bk; retval(2) = ck; retval(3) = dk; retval(4) = rcond; } return retval; } control/src/sl_sb10ed.cc0000644000076500000240000001364412273411257014426 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . H2 optimal state controller for a discrete-time system. Uses SLICOT SB10ED by courtesy of NICONET e.V. Author: Lukas Reichlin Created: November 2009 Version: 0.5 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb10ed, SB10ED) (int& N, int& M, int& NP, int& NCON, int& NMEAS, double* A, int& LDA, double* B, int& LDB, double* C, int& LDC, double* D, int& LDD, double* AK, int& LDAK, double* BK, int& LDBK, double* CK, int& LDCK, double* DK, int& LDDK, double* RCOND, double& TOL, int* IWORK, double* DWORK, int& LDWORK, bool* BWORK, int& INFO); } // PKG_ADD: autoload ("__sl_sb10ed__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb10ed__, args, nargout, "-*- texinfo -*-\n\ Slicot SB10ED Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 6) { print_usage (); } else { // arguments in Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); int ncon = args(4).int_value (); int nmeas = args(5).int_value (); int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int np = c.rows (); // np: number of outputs int lda = max (1, a.rows ()); int ldb = max (1, b.rows ()); int ldc = max (1, c.rows ()); int ldd = max (1, d.rows ()); int ldak = max (1, n); int ldbk = max (1, n); int ldck = max (1, ncon); int lddk = max (1, ncon); double tol = 0; // arguments out Matrix ak (ldak, n); Matrix bk (ldbk, nmeas); Matrix ck (ldck, n); Matrix dk (lddk, nmeas); ColumnVector rcond (7); // workspace int m2 = ncon; int m1 = m - m2; int np1 = np - nmeas; int np2 = nmeas; int q = max (m1, m2, np1, np2); int ldwork = 2*q*(3*q+2*n)+max(1,(n+q)*(n+q+6),q*(q+max(n,q,5)+1), 2*n*n+max(1,14*n*n+6*n+max(14*n+23,16*n), q*(n+q+max(q,3)))); int liwork = max (2*m2, 2*n, n*n, np2); OCTAVE_LOCAL_BUFFER (int, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); OCTAVE_LOCAL_BUFFER (bool, bwork, 2*n); // error indicator int info; // SLICOT routine SB10ED F77_XFCN (sb10ed, SB10ED, (n, m, np, ncon, nmeas, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, ak.fortran_vec (), ldak, bk.fortran_vec (), ldbk, ck.fortran_vec (), ldck, dk.fortran_vec (), lddk, rcond.fortran_vec (), tol, iwork, dwork, ldwork, bwork, info)); if (f77_exception_encountered) error ("h2syn: __sl_sb10ed__: exception in SLICOT subroutine SB10ED"); static const char* err_msg[] = { "0: OK", "1: the matrix [A-exp(j*Theta)*I, B2; C1, D12] " "had not full column rank in respect to the tolerance EPS", "2: the matrix [A-exp(j*Theta)*I, B1; C2, D21] " "had not full row rank in respect to the tolerance EPS", "3: the matrix D12 had not full column rank in " "respect to the tolerance TOL", "4: the matrix D21 had not full row rank in respect " "to the tolerance TOL", "5: the singular value decomposition (SVD) algorithm " "did not converge (when computing the SVD of one of the matrices " "[A-I, B2; C1, D12], [A-I, B1; C2, D21], D12 or D21)", "6: the X-Riccati equation was not solved successfully", "7: the matrix Im2 + B2'*X2*B2 is not positive " "definite, or it is numerically singular (with " "respect to the tolerance TOL)", "8: the Y-Riccati equation was not solved successfully", "9: the matrix Ip2 + C2*Y2*C2' is not positive " "definite, or it is numerically singular (with " "respect to the tolerance TOL)", "10: the matrix Im2 + DKHAT*D22 is singular, or its " "estimated condition number is larger than or equal " "to 1/TOL"}; error_msg ("h2syn", info, 10, err_msg); // return values retval(0) = ak; retval(1) = bk; retval(2) = ck; retval(3) = dk; retval(4) = rcond; } return retval; } control/src/sl_sb10fd.cc0000644000076500000240000001410412273411257014417 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . H-infinity (sub)optimal state controller for a continuous-time system. Uses SLICOT SB10FD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: December 2009 Version: 0.5 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb10fd, SB10FD) (int& N, int& M, int& NP, int& NCON, int& NMEAS, double& GAMMA, double* A, int& LDA, double* B, int& LDB, double* C, int& LDC, double* D, int& LDD, double* AK, int& LDAK, double* BK, int& LDBK, double* CK, int& LDCK, double* DK, int& LDDK, double* RCOND, double& TOL, int* IWORK, double* DWORK, int& LDWORK, bool* BWORK, int& INFO); } // PKG_ADD: autoload ("__sl_sb10fd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb10fd__, args, nargout, "-*- texinfo -*-\n\ Slicot SB10FD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 7) { print_usage (); } else { // arguments in Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); int ncon = args(4).int_value (); int nmeas = args(5).int_value (); double gamma = args(6).double_value (); int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int np = c.rows (); // np: number of outputs int lda = max (1, a.rows ()); int ldb = max (1, b.rows ()); int ldc = max (1, c.rows ()); int ldd = max (1, d.rows ()); int ldak = max (1, n); int ldbk = max (1, n); int ldck = max (1, ncon); int lddk = max (1, ncon); double tol = 0; // arguments out Matrix ak (ldak, n); Matrix bk (ldbk, nmeas); Matrix ck (ldck, n); Matrix dk (lddk, nmeas); ColumnVector rcond (4); // workspace int m2 = ncon; int m1 = m - m2; int np1 = np - nmeas; int np2 = nmeas; int liwork = max (2*max (n, m-ncon, np-nmeas, ncon), n*n); int q = max (m1, m2, np1, np2); int ldwork = 2*q*(3*q+2*n) + max (1, (n+q)*(n+q+6), q*(q + max (n, q, 5) + 1), 2*n*(n+2*q) + max (1, 4*q*q + max (2*q, 3*n*n + max (2*n*q, 10*n*n+12*n+5)), q*(3*n + 3*q + max (2*n, 4*q + max (n, q))))); OCTAVE_LOCAL_BUFFER (int, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); OCTAVE_LOCAL_BUFFER (bool, bwork, 2*n); // error indicator int info; // SLICOT routine SB10FD F77_XFCN (sb10fd, SB10FD, (n, m, np, ncon, nmeas, gamma, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, ak.fortran_vec (), ldak, bk.fortran_vec (), ldbk, ck.fortran_vec (), ldck, dk.fortran_vec (), lddk, rcond.fortran_vec (), tol, iwork, dwork, ldwork, bwork, info)); if (f77_exception_encountered) error ("hinfsyn: __sl_sb10fd__: exception in SLICOT subroutine SB10FD"); static const char* err_msg[] = { "0: OK", "1: the matrix [A-j*omega*I, B2; C1, D12] had " "not full column rank in respect to the tolerance EPS", "2: the matrix [A-j*omega*I, B1; C2, D21] " "had not full row rank in respect to the tolerance EPS", "3: the matrix D12 had not full column rank in " "respect to the tolerance TOL", "4: the matrix D21 had not full row rank in respect " "to the tolerance TOL", "5: the singular value decomposition (SVD) algorithm " "did not converge (when computing the SVD of one of the matrices " "[A, B2; C1, D12], [A, B1; C2, D21], D12 or D21)", "6: the controller is not admissible (too small value " "of gamma)", "7: the X-Riccati equation was not solved " "successfully (the controller is not admissible or " "there are numerical difficulties)", "8: the Y-Riccati equation was not solved " "successfully (the controller is not admissible or " "there are numerical difficulties)", "9: the determinant of Im2 + Tu*D11HAT*Ty*D22 is " "zero [3]"}; error_msg ("hinfsyn", info, 9, err_msg); // return values retval(0) = ak; retval(1) = bk; retval(2) = ck; retval(3) = dk; retval(4) = rcond; } return retval; } control/src/sl_sb10hd.cc0000644000076500000240000001174112273411257014425 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . H2 optimal state controller for a continuous-time system. Uses SLICOT SB10HD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: November 2009 Version: 0.5 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb10hd, SB10HD) (int& N, int& M, int& NP, int& NCON, int& NMEAS, double* A, int& LDA, double* B, int& LDB, double* C, int& LDC, double* D, int& LDD, double* AK, int& LDAK, double* BK, int& LDBK, double* CK, int& LDCK, double* DK, int& LDDK, double* RCOND, double& TOL, int* IWORK, double* DWORK, int& LDWORK, bool* BWORK, int& INFO); } // PKG_ADD: autoload ("__sl_sb10hd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb10hd__, args, nargout, "-*- texinfo -*-\n\ Slicot SB10HD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 6) { print_usage (); } else { // arguments in Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); int ncon = args(4).int_value (); int nmeas = args(5).int_value (); int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int np = c.rows (); // np: number of outputs int lda = max (1, a.rows ()); int ldb = max (1, b.rows ()); int ldc = max (1, c.rows ()); int ldd = max (1, d.rows ()); int ldak = max (1, n); int ldbk = max (1, n); int ldck = max (1, ncon); int lddk = max (1, ncon); double tol = 0; // arguments out Matrix ak (ldak, n); Matrix bk (ldbk, nmeas); Matrix ck (ldck, n); Matrix dk (lddk, nmeas); ColumnVector rcond (4); // workspace int m2 = ncon; int m1 = m - m2; int np1 = np - nmeas; int np2 = nmeas; int q = max (m1, m2, np1, np2); int ldwork = 2*q*(3*q + 2*n) + max (1, q*(q + max (n, 5) + 1), n*(14*n + 12 + 2*q) + 5); OCTAVE_LOCAL_BUFFER (int, iwork, max (2*n, n*n)); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); OCTAVE_LOCAL_BUFFER (bool, bwork, 2*n); // error indicator int info; // SLICOT routine SB10HD F77_XFCN (sb10hd, SB10HD, (n, m, np, ncon, nmeas, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, ak.fortran_vec (), ldak, bk.fortran_vec (), ldbk, ck.fortran_vec (), ldck, dk.fortran_vec (), lddk, rcond.fortran_vec (), tol, iwork, dwork, ldwork, bwork, info)); if (f77_exception_encountered) error ("h2syn: __sl_sb10hd__: exception in SLICOT subroutine SB10HD"); static const char* err_msg[] = { "0: OK", "1: the matrix D12 had not full column rank in " "respect to the tolerance TOL", "2: the matrix D21 had not full row rank in respect " "to the tolerance TOL", "3: the singular value decomposition (SVD) algorithm " "did not converge (when computing the SVD of one of " "the matrices D12 or D21)", "4: the X-Riccati equation was not solved successfully", "5: the Y-Riccati equation was not solved successfully"}; error_msg ("h2syn", info, 5, err_msg); // return values retval(0) = ak; retval(1) = bk; retval(2) = ck; retval(3) = dk; retval(4) = rcond; } return retval; } control/src/sl_sb10id.cc0000644000076500000240000001134312273411257014424 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Positive feedback controller for a continuous-time system. Uses SLICOT SB10ID by courtesy of NICONET e.V. Author: Lukas Reichlin Created: July 2011 Version: 0.3 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb10id, SB10ID) (int& N, int& M, int& NP, double* A, int& LDA, double* B, int& LDB, double* C, int& LDC, double* D, int& LDD, double& FACTOR, int& NK, double* AK, int& LDAK, double* BK, int& LDBK, double* CK, int& LDCK, double* DK, int& LDDK, double* RCOND, int* IWORK, double* DWORK, int& LDWORK, bool* BWORK, int& INFO); } // PKG_ADD: autoload ("__sl_sb10id__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb10id__, args, nargout, "-*- texinfo -*-\n\ Slicot SB10ID Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 5) { print_usage (); } else { // arguments in Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); double factor = args(4).double_value (); int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int np = c.rows (); // np: number of outputs int lda = max (1, n); int ldb = max (1, n); int ldc = max (1, np); int ldd = max (1, np); int ldak = max (1, n); int ldbk = max (1, n); int ldck = max (1, m); int lddk = max (1, m); // arguments out int nk; Matrix ak (ldak, n); Matrix bk (ldbk, np); Matrix ck (ldck, n); Matrix dk (lddk, np); ColumnVector rcond (2); // workspace int liwork = max (2*n, n*n, m, np); int ldwork = 10*n*n + m*m + np*np + 2*m*n + 2*n*np + 4*n + 5 + max (1, 4*n*n + 8*n); OCTAVE_LOCAL_BUFFER (int, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); OCTAVE_LOCAL_BUFFER (bool, bwork, 2*n); // error indicator int info; // SLICOT routine SB10ID F77_XFCN (sb10id, SB10ID, (n, m, np, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, factor, nk, ak.fortran_vec (), ldak, bk.fortran_vec (), ldbk, ck.fortran_vec (), ldck, dk.fortran_vec (), lddk, rcond.fortran_vec (), iwork, dwork, ldwork, bwork, info)); if (f77_exception_encountered) error ("ncfsyn: __sl_sb10id__: exception in SLICOT subroutine SB10ID"); static const char* err_msg[] = { "0: OK", "1: the X-Riccati equation is not solved successfully", "2: the Z-Riccati equation is not solved successfully", "3: the iteration to compute eigenvalues or singular " "values failed to converge", "4: the matrix Ip - D*Dk is singular", "5: the matrix Im - Dk*D is singular", "6: the closed-loop system is unstable"}; error_msg ("ncfsyn", info, 6, err_msg); // resizing ak.resize (nk, nk); bk.resize (nk, np); ck.resize (m, nk); dk.resize (m, np); // return values retval(0) = ak; retval(1) = bk; retval(2) = ck; retval(3) = dk; retval(4) = rcond; } return retval; } control/src/sl_sb10jd.cc0000644000076500000240000000655112273411257014432 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Convert descriptor state-space system into regular state-space form. Uses SLICOT SB10JD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: September 2011 Version: 0.1 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb10jd, SB10JD) (int& N, int& M, int& NP, double* A, int& LDA, double* B, int& LDB, double* C, int& LDC, double* D, int& LDD, double* E, int& LDE, int& NSYS, double* DWORK, int& LDWORK, int& INFO); } // PKG_ADD: autoload ("__sl_sb10jd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb10jd__, args, nargout, "-*- texinfo -*-\n\ Slicot SB10JD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 5) { print_usage (); } else { // arguments in Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); Matrix e = args(4).matrix_value (); int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int np = c.rows (); // np: number of outputs int lda = max (1, n); int ldb = max (1, n); int ldc = max (1, np); int ldd = max (1, np); int lde = max (1, n); // arguments out int nsys; // workspace int ldwork = max (1, 2*n*n + 2*n + n*max (5, n + m + np)); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicator int info; // SLICOT routine SB10JD F77_XFCN (sb10jd, SB10JD, (n, m, np, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, e.fortran_vec (), lde, nsys, dwork, ldwork, info)); if (f77_exception_encountered) error ("__sl_sb10jd__: exception in SLICOT subroutine SB10JD"); if (info != 0) error ("__sl_sb10jd__: SB10JD returned info = %d", info); // resize a.resize (nsys, nsys); b.resize (nsys, m); c.resize (np, nsys); // return values retval(0) = a; retval(1) = b; retval(2) = c; retval(3) = d; } return retval; } control/src/sl_sb10kd.cc0000644000076500000240000001115112273411257014423 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Positive feedback controller for a discrete-time system (D == 0). Uses SLICOT SB10KD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: July 2011 Version: 0.3 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb10kd, SB10KD) (int& N, int& M, int& NP, double* A, int& LDA, double* B, int& LDB, double* C, int& LDC, double& FACTOR, double* AK, int& LDAK, double* BK, int& LDBK, double* CK, int& LDCK, double* DK, int& LDDK, double* RCOND, int* IWORK, double* DWORK, int& LDWORK, bool* BWORK, int& INFO); } // PKG_ADD: autoload ("__sl_sb10kd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb10kd__, args, nargout, "-*- texinfo -*-\n\ Slicot SB10KD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 4) { print_usage (); } else { // arguments in Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); double factor = args(3).double_value (); int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int np = c.rows (); // np: number of outputs int lda = max (1, n); int ldb = max (1, n); int ldc = max (1, np); int ldak = max (1, n); int ldbk = max (1, n); int ldck = max (1, m); int lddk = max (1, m); // arguments out Matrix ak (ldak, n); Matrix bk (ldbk, np); Matrix ck (ldck, n); Matrix dk (lddk, np); ColumnVector rcond (4); // workspace int liwork = 2 * max (n, np+m); int ldwork = 15*n*n + 6*n + max (14*n+23, 16*n, 2*n+np+m, 3*(np+m)) + max (n*n, 11*n*np + 2*m*m + 8*np*np + 8*m*n + 4*m*np + np); OCTAVE_LOCAL_BUFFER (int, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); OCTAVE_LOCAL_BUFFER (bool, bwork, 2*n); // error indicator int info; // SLICOT routine SB10KD F77_XFCN (sb10kd, SB10KD, (n, m, np, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, factor, ak.fortran_vec (), ldak, bk.fortran_vec (), ldbk, ck.fortran_vec (), ldck, dk.fortran_vec (), lddk, rcond.fortran_vec (), iwork, dwork, ldwork, bwork, info)); if (f77_exception_encountered) error ("ncfsyn: slsb10kd: exception in SLICOT subroutine SB10KD"); static const char* err_msg[] = { "0: OK", "1: the P-Riccati equation is not solved successfully", "2: the Q-Riccati equation is not solved successfully", "3: the X-Riccati equation is not solved successfully", "4: the iteration to compute eigenvalues failed to " "converge", "5: the matrix Rx + Bx'*X*Bx is singular", "6: the closed-loop system is unstable"}; error_msg ("ncfsyn", info, 6, err_msg); // resizing ak.resize (n, n); bk.resize (n, np); ck.resize (m, n); dk.resize (m, np); // return values retval(0) = ak; retval(1) = bk; retval(2) = ck; retval(3) = dk; retval(4) = rcond; } return retval; } control/src/sl_sb10yd.cc0000644000076500000240000001042312273411257014442 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Fit FRD with SS model. Uses SLICOT SB10YD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: October 2011 Version: 0.1 */ #include #include #include #include "common.h" extern "C" { int F77_FUNC (sb10yd, SB10YD) (int& DISCFL, int& FLAG, int& LENDAT, double* RFRDAT, double* IFRDAT, double* OMEGA, int& N, double* A, int& LDA, double* B, double* C, double* D, double& TOL, int* IWORK, double* DWORK, int& LDWORK, Complex* ZWORK, int& LZWORK, int& INFO); } // PKG_ADD: autoload ("__sl_sb10yd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb10yd__, args, nargout, "-*- texinfo -*-\n\ Slicot SB10YD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 6) { print_usage (); } else { // arguments in Matrix rfrdat = args(0).matrix_value (); Matrix ifrdat = args(1).matrix_value (); Matrix omega = args(2).matrix_value (); int n = args(3).int_value (); int discfl = args(4).int_value (); int flag = args(5).int_value (); int lendat = omega.rows (); // number of frequencies int lda = max (1, n); // arguments out Matrix a (lda, n); Matrix b (n, 1); Matrix c (1, n); Matrix d (1, 1); // workspace int liwork = max (2, 2*n + 1); int ldwork; int lzwork; int hnpts = 2048; int lw1 = 2*lendat + 4*hnpts; int lw2 = lendat + 6*hnpts; int mn = min (2*lendat, 2*n+1); int lw3; int lw4; if (n > 0) { lw3 = 2*lendat*(2*n+1) + max (2*lendat, 2*n+1) + max (mn + 6*n + 4, 2*mn + 1); lzwork = lendat*(2*n+3); } else { lw3 = 4*lendat + 5; lzwork = lendat; } if (flag == 1) lw4 = max (n*n + 5*n, 6*n + 1 + min (1, n)); else lw4 = 0; ldwork = max (2, lw1, lw2, lw3, lw4); OCTAVE_LOCAL_BUFFER (int, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); OCTAVE_LOCAL_BUFFER (Complex, zwork, lzwork); // tolerance double tol = 0; // error indicator int info; // SLICOT routine SB10YD F77_XFCN (sb10yd, SB10YD, (discfl, flag, lendat, rfrdat.fortran_vec (), ifrdat.fortran_vec (), omega.fortran_vec (), n, a.fortran_vec (), lda, b.fortran_vec (), c.fortran_vec (), d.fortran_vec (), tol, iwork, dwork, ldwork, zwork, lzwork, info)); if (f77_exception_encountered) error ("fitfrd: __sl_sb10yd__: exception in SLICOT subroutine SB10YD"); if (info != 0) error ("fitfrd: __sl_sb10yd__: SB10YD returned info = %d", info); // return values retval(0) = a; retval(1) = b; retval(2) = c; retval(3) = d; retval(4) = octave_value (n); } return retval; } control/src/sl_sb10zd.cc0000644000076500000240000001210112273411257014436 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Positive feedback controller for a discrete-time system (D != 0). Uses SLICOT SB10ZD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: August 2011 Version: 0.3 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb10zd, SB10ZD) (int& N, int& M, int& NP, double* A, int& LDA, double* B, int& LDB, double* C, int& LDC, double* D, int& LDD, double& FACTOR, double* AK, int& LDAK, double* BK, int& LDBK, double* CK, int& LDCK, double* DK, int& LDDK, double* RCOND, double& TOL, int* IWORK, double* DWORK, int& LDWORK, bool* BWORK, int& INFO); } // PKG_ADD: autoload ("__sl_sb10zd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb10zd__, args, nargout, "-*- texinfo -*-\n\ Slicot SB10ZD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 6) { print_usage (); } else { // arguments in Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); double factor = args(4).double_value (); double tol = args(5).double_value (); int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int np = c.rows (); // np: number of outputs int lda = max (1, n); int ldb = max (1, n); int ldc = max (1, np); int ldd = max (1, np); int ldak = max (1, n); int ldbk = max (1, n); int ldck = max (1, m); int lddk = max (1, m); // arguments out Matrix ak (ldak, n); Matrix bk (ldbk, np); Matrix ck (ldck, n); Matrix dk (lddk, np); ColumnVector rcond (6); // workspace int liwork = 2 * max (n, m+np); int ldwork = 16*n*n + 5*m*m + 7*np*np + 6*m*n + 7*m*np + 7*n*np + 6*n + 2*(m + np) + max (14*n+23, 16*n, 2*m-1, 2*np-1); OCTAVE_LOCAL_BUFFER (int, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); OCTAVE_LOCAL_BUFFER (bool, bwork, 2*n); // error indicator int info; // SLICOT routine SB10ZD F77_XFCN (sb10zd, SB10ZD, (n, m, np, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, factor, ak.fortran_vec (), ldak, bk.fortran_vec (), ldbk, ck.fortran_vec (), ldck, dk.fortran_vec (), lddk, rcond.fortran_vec (), tol, iwork, dwork, ldwork, bwork, info)); if (f77_exception_encountered) error ("ncfsyn: __sl_sb10zd__: exception in SLICOT subroutine SB10ZD"); static const char* err_msg[] = { "0: OK", "1: the P-Riccati equation is not solved successfully", "2: the Q-Riccati equation is not solved successfully", "3: the iteration to compute eigenvalues or singular " "values failed to converge", "4: the matrix (gamma^2-1)*In - P*Q is singular", "5: the matrix Rx + Bx'*X*Bx is singular", "6: the matrix Ip + D*Dk is singular", "7: the matrix Im + Dk*D is singular", "8: the matrix Ip - D*Dk is singular", "9: the matrix Im - Dk*D is singular", "10: the closed-loop system is unstable"}; error_msg ("ncfsyn", info, 10, err_msg); // resizing ak.resize (n, n); bk.resize (n, np); ck.resize (m, n); dk.resize (m, np); // return values retval(0) = ak; retval(1) = bk; retval(2) = ck; retval(3) = dk; retval(4) = rcond; } return retval; } control/src/sl_sb16ad.cc0000644000076500000240000002302512273411257014422 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Controller reduction based on Balance & Truncate (B&T) or Singular Perturbation Approximation (SPA) method. Uses SLICOT SB16AD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: November 2011 Version: 0.1 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb16ad, SB16AD) (char& DICO, char& JOBC, char& JOBO, char& JOBMR, char& WEIGHT, char& EQUIL, char& ORDSEL, int& N, int& M, int& P, int& NC, int& NCR, double& ALPHA, double* A, int& LDA, double* B, int& LDB, double* C, int& LDC, double* D, int& LDD, double* AC, int& LDAC, double* BC, int& LDBC, double* CC, int& LDCC, double* DC, int& LDDC, int& NCS, double* HSVC, double& TOL1, double& TOL2, int* IWORK, double* DWORK, int& LDWORK, int& IWARN, int& INFO); } // PKG_ADD: autoload ("__sl_sb16ad__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb16ad__, args, nargout, "-*- texinfo -*-\n\ Slicot SB16AD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 19) { print_usage (); } else { // arguments in char dico; char jobc; char jobo; char jobmr; char weight; char equil; char ordsel; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); const int idico = args(4).int_value (); const int iequil = args(5).int_value (); int ncr = args(6).int_value (); const int iordsel = args(7).int_value (); double alpha = args(8).double_value (); const int ijobmr = args(9).int_value (); Matrix ac = args(10).matrix_value (); Matrix bc = args(11).matrix_value (); Matrix cc = args(12).matrix_value (); Matrix dc = args(13).matrix_value (); const int iweight = args(14).int_value (); const int ijobc = args(15).int_value (); const int ijobo = args(16).int_value (); double tol1 = args(17).double_value (); double tol2 = args(18).double_value (); if (idico == 0) dico = 'C'; else dico = 'D'; if (iequil == 0) equil = 'S'; else equil = 'N'; if (iordsel == 0) ordsel = 'F'; else ordsel = 'A'; if (ijobc == 0) jobc = 'S'; else jobc = 'E'; if (ijobo == 0) jobo = 'S'; else jobo = 'E'; switch (ijobmr) { case 0: jobmr = 'B'; break; case 1: jobmr = 'F'; break; case 2: jobmr = 'S'; break; case 3: jobmr = 'P'; break; default: error ("__sl_sb16ad__: argument jobmr invalid"); } switch (iweight) { case 0: weight = 'N'; break; case 1: weight = 'O'; break; case 2: weight = 'I'; break; case 3: weight = 'P'; break; default: error ("__sl_sb16ad__: argument weight invalid"); } int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int p = c.rows (); // p: number of outputs int nc = ac.rows (); int lda = max (1, n); int ldb = max (1, n); int ldc = max (1, p); int ldd = max (1, p); int ldac = max (1, nc); int ldbc = max (1, nc); int ldcc = max (1, m); int lddc = max (1, m); // arguments out int ncs; ColumnVector hsvc (n); // workspace int liwork; int liwrk1; int liwrk2; switch (jobmr) { case 'B': liwrk1 = 0; break; case 'F': liwrk1 = nc; break; default: liwrk1 = 2*nc; } if (weight == 'N') liwrk2 = 0; else liwrk2 = 2*(m+p); liwork = max (1, liwrk1, liwrk2); int ldwork; int lfreq; int lsqred; if (weight == 'N') { if (equil == 'N') // if WEIGHT = 'N' and EQUIL = 'N' lfreq = nc*(max (m, p) + 5); else // if WEIGHT = 'N' and EQUIL = 'S' lfreq = max (n, nc*(max (m, p) + 5)); } else // if WEIGHT = 'I' or 'O' or 'P' { lfreq = (n+nc)*(n+nc+2*m+2*p) + max ((n+nc)*(n+nc+max(n+nc,m,p)+7), (m+p)*(m+p+4)); } lsqred = max (1, 2*nc*nc+5*nc); ldwork = 2*nc*nc + max (1, lfreq, lsqred); OCTAVE_LOCAL_BUFFER (int, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicators int iwarn = 0; int info = 0; // SLICOT routine SB16AD F77_XFCN (sb16ad, SB16AD, (dico, jobc, jobo, jobmr, weight, equil, ordsel, n, m, p, nc, ncr, alpha, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, ac.fortran_vec (), ldac, bc.fortran_vec (), ldbc, cc.fortran_vec (), ldcc, dc.fortran_vec (), lddc, ncs, hsvc.fortran_vec (), tol1, tol2, iwork, dwork, ldwork, iwarn, info)); if (f77_exception_encountered) error ("conred: exception in SLICOT subroutine SB16AD"); static const char* err_msg[] = { "0: OK", "1: the closed-loop system is not well-posed; " "its feedthrough matrix is (numerically) singular", "2: the computation of the real Schur form of the " "closed-loop state matrix failed", "3: the closed-loop state matrix is not stable", "4: the solution of a symmetric eigenproblem failed", "5: the computation of the ordered real Schur form " "of Ac failed", "6: the separation of the ALPHA-stable/unstable " "diagonal blocks failed because of very close eigenvalues", "7: the computation of Hankel singular values failed"}; static const char* warn_msg[] = { "0: OK", "1: with ORDSEL = 'F', the selected order NCR is greater " "than NSMIN, the sum of the order of the " "ALPHA-unstable part and the order of a minimal " "realization of the ALPHA-stable part of the given " "controller; in this case, the resulting NCR is set " "equal to NSMIN.", "2: with ORDSEL = 'F', the selected order NCR " "corresponds to repeated singular values for the " "ALPHA-stable part of the controller, which are " "neither all included nor all excluded from the " "reduced model; in this case, the resulting NCR is " "automatically decreased to exclude all repeated " "singular values.", "3: with ORDSEL = 'F', the selected order NCR is less " "than the order of the ALPHA-unstable part of the " "given controller. In this case NCR is set equal to " "the order of the ALPHA-unstable part."}; error_msg ("conred", info, 7, err_msg); warning_msg ("conred", iwarn, 3, warn_msg); // resize ac.resize (ncr, ncr); bc.resize (ncr, p); // p: number of plant outputs cc.resize (m, ncr); // m: number of plant inputs hsvc.resize (ncs); // return values retval(0) = ac; retval(1) = bc; retval(2) = cc; retval(3) = dc; retval(4) = octave_value (ncr); retval(5) = hsvc; retval(6) = octave_value (ncs); } return retval; } control/src/sl_sb16bd.cc0000644000076500000240000001626512273411257014433 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . TODO Uses SLICOT SB16BD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: November 2011 Version: 0.1 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb16bd, SB16BD) (char& DICO, char& JOBD, char& JOBMR, char& JOBCF, char& EQUIL, char& ORDSEL, int& N, int& M, int& P, int& NCR, double* A, int& LDA, double* B, int& LDB, double* C, int& LDC, double* D, int& LDD, double* F, int& LDF, double* G, int& LDG, double* DC, int& LDDC, double* HSV, double& TOL1, double& TOL2, int* IWORK, double* DWORK, int& LDWORK, int& IWARN, int& INFO); } // PKG_ADD: autoload ("__sl_sb16bd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb16bd__, args, nargout, "-*- texinfo -*-\n\ Slicot SB16BD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 15) { print_usage (); } else { // arguments in char dico; char jobd; char jobmr; char jobcf; char equil; char ordsel; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); const int idico = args(4).int_value (); const int iequil = args(5).int_value (); int ncr = args(6).int_value (); const int iordsel = args(7).int_value (); const int ijobd = args(8).int_value (); const int ijobmr = args(9).int_value (); Matrix f = args(10).matrix_value (); Matrix g = args(11).matrix_value (); const int ijobcf = args(12).int_value (); double tol1 = args(13).double_value (); double tol2 = args(14).double_value (); if (idico == 0) dico = 'C'; else dico = 'D'; if (iequil == 0) equil = 'S'; else equil = 'N'; if (iordsel == 0) ordsel = 'F'; else ordsel = 'A'; if (ijobd == 0) jobd = 'Z'; else jobd = 'D'; if (ijobcf == 0) jobcf = 'L'; else jobcf = 'R'; switch (ijobmr) { case 0: jobmr = 'B'; break; case 1: jobmr = 'F'; break; case 2: jobmr = 'S'; break; case 3: jobmr = 'P'; break; default: error ("__sl_sb16bd__: argument jobmr invalid"); } int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int p = c.rows (); // p: number of outputs int lda = max (1, n); int ldb = max (1, n); int ldc = max (1, p); int ldd; if (jobd == 'Z') ldd = 1; else ldd = max (1, p); int ldf = max (1, m); int ldg = max (1, n); int lddc = max (1, m); // arguments out Matrix dc (lddc, p); ColumnVector hsv (n); // workspace int liwork; int pm; int ldwork; int lwr = max (1, n*(2*n+max(n,m+p)+5)+n*(n+1)/2); switch (jobmr) { case 'B': pm = 0; break; case 'F': pm = n; break; default: // if JOBMR = 'S' or 'P' pm = max (1, 2*n); } if (ordsel == 'F' && ncr == n) { liwork = 0; ldwork = p*n; } else if (jobcf == 'L') { liwork = max (pm, m); ldwork = (n+m)*(m+p) + max (lwr, 4*m); } else // if JOBCF = 'R' { liwork = max (pm, p); ldwork = (n+p)*(m+p) + max (lwr, 4*p); } OCTAVE_LOCAL_BUFFER (int, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicators int iwarn = 0; int info = 0; // SLICOT routine SB16BD F77_XFCN (sb16bd, SB16BD, (dico, jobd, jobmr, jobcf, equil, ordsel, n, m, p, ncr, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, f.fortran_vec (), ldf, g.fortran_vec (), ldg, dc.fortran_vec (), lddc, hsv.fortran_vec (), tol1, tol2, iwork, dwork, ldwork, iwarn, info)); if (f77_exception_encountered) error ("cfconred: exception in SLICOT subroutine SB16BD"); static const char* err_msg[] = { "0: OK", "1: the reduction of A-L*C to a real Schur form " "failed", "2: the matrix A-L*C is not stable (if DICO = 'C'), " "or not convergent (if DICO = 'D')", "3: the computation of Hankel singular values failed", "4: the reduction of A-B*F to a real Schur form " "failed", "5: the matrix A-B*F is not stable (if DICO = 'C'), " "or not convergent (if DICO = 'D')"}; static const char* warn_msg[] = { "0: OK", "1: with ORDSEL = 'F', the selected order NCR is " "greater than the order of a minimal " "realization of the controller."}; error_msg ("cfconred", info, 5, err_msg); warning_msg ("cfconred", iwarn, 1, warn_msg); // resize a.resize (ncr, ncr); // Ac g.resize (ncr, p); // Bc f.resize (m, ncr); // Cc dc.resize (m, p); // Dc // return values retval(0) = a; retval(1) = g; retval(2) = f; retval(3) = dc; retval(4) = octave_value (ncr); retval(5) = hsv; } return retval; } control/src/sl_sb16cd.cc0000644000076500000240000001511512273411257014425 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . TODO Uses SLICOT SB16CD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: November 2011 Version: 0.1 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sb16cd, SB16CD) (char& DICO, char& JOBD, char& JOBMR, char& JOBCF, char& ORDSEL, int& N, int& M, int& P, int& NCR, double* A, int& LDA, double* B, int& LDB, double* C, int& LDC, double* D, int& LDD, double* F, int& LDF, double* G, int& LDG, double* HSV, double& TOL, int* IWORK, double* DWORK, int& LDWORK, int& IWARN, int& INFO); } // PKG_ADD: autoload ("__sl_sb16cd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sb16cd__, args, nargout, "-*- texinfo -*-\n\ Slicot SB16CD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 13) { print_usage (); } else { // arguments in char dico; char jobd; char jobmr; char jobcf; char ordsel; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); const int idico = args(4).int_value (); int ncr = args(5).int_value (); const int iordsel = args(6).int_value (); const int ijobd = args(7).int_value (); const int ijobmr = args(8).int_value (); Matrix f = args(9).matrix_value (); Matrix g = args(10).matrix_value (); const int ijobcf = args(11).int_value (); double tol = args(12).double_value (); if (idico == 0) dico = 'C'; else dico = 'D'; if (iordsel == 0) ordsel = 'F'; else ordsel = 'A'; if (ijobd == 0) jobd = 'Z'; else jobd = 'D'; if (ijobcf == 0) jobcf = 'L'; else jobcf = 'R'; switch (ijobmr) { case 0: jobmr = 'B'; break; case 1: jobmr = 'F'; break; default: error ("__sl_sb16cd__: argument jobmr invalid"); } int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int p = c.rows (); // p: number of outputs int lda = max (1, n); int ldb = max (1, n); int ldc = max (1, p); int ldd; if (jobd == 'Z') ldd = 1; else ldd = max (1, p); int ldf = max (1, m); int ldg = max (1, n); // arguments out ColumnVector hsv (n); // workspace int liwork; if (jobmr == 'B') liwork = 0; else // if JOBMR = 'F' liwork = n; int ldwork; int mp; if (jobcf == 'L') mp = m; else // if JOBCF = 'R' mp = p; ldwork = 2*n*n + max (1, 2*n*n + 5*n, n*max(m,p), n*(n + max(n,mp) + min(n,mp) + 6)); OCTAVE_LOCAL_BUFFER (int, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicators int iwarn = 0; int info = 0; // SLICOT routine SB16CD F77_XFCN (sb16cd, SB16CD, (dico, jobd, jobmr, jobcf, ordsel, n, m, p, ncr, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, f.fortran_vec (), ldf, g.fortran_vec (), ldg, hsv.fortran_vec (), tol, iwork, dwork, ldwork, iwarn, info)); if (f77_exception_encountered) error ("fwcfconred: exception in SLICOT subroutine SB16CD"); static const char* err_msg[] = { "0: OK", "1: eigenvalue computation failure", "2: the matrix A-L*C is not stable", "3: the matrix A-B*F is not stable", "4: the Lyapunov equation for computing the " "observability Grammian is (nearly) singular", "5: the Lyapunov equation for computing the " "controllability Grammian is (nearly) singular", "6: the computation of Hankel singular values failed"}; static const char* warn_msg[] = { "0: OK", "1: with ORDSEL = 'F', the selected order NCR is " "greater than the order of a minimal realization " "of the controller.", "2: with ORDSEL = 'F', the selected order NCR " "corresponds to repeated singular values, which are " "neither all included nor all excluded from the " "reduced controller. In this case, the resulting NCR " "is set automatically to the largest value such that " "HSV(NCR) > HSV(NCR+1)."}; error_msg ("fwcfconred", info, 6, err_msg); warning_msg ("fwcfconred", iwarn, 2, warn_msg); // resize a.resize (ncr, ncr); // Ac g.resize (ncr, p); // Bc f.resize (m, ncr); // Cc // Dc = 0 // return values retval(0) = a; retval(1) = g; retval(2) = f; retval(3) = octave_value (ncr); retval(4) = hsv; } return retval; } control/src/sl_sg02ad.cc0000644000076500000240000001605112273411257014423 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Solution of algebraic Riccati equations for descriptor systems. Uses SLICOT SG02AD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: October 2010 Version: 0.3 */ #include #include #include "common.h" #include extern "C" { int F77_FUNC (sg02ad, SG02AD) (char& DICO, char& JOBB, char& FACT, char& UPLO, char& JOBL, char& SCAL, char& SORT, char& ACC, int& N, int& M, int& P, double* A, int& LDA, double* E, int& LDE, double* B, int& LDB, double* Q, int& LDQ, double* R, int& LDR, double* L, int& LDL, double& RCONDU, double* X, int& LDX, double* ALFAR, double* ALFAI, double* BETA, double* S, int& LDS, double* T, int& LDT, double* U, int& LDU, double& TOL, int* IWORK, double* DWORK, int& LDWORK, bool* BWORK, int& IWARN, int& INFO); } // PKG_ADD: autoload ("__sl_sg02ad__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sg02ad__, args, nargout, "-*- texinfo -*-\n\ Slicot SG02AD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 8) { print_usage (); } else { // arguments in char dico; char jobb = 'B'; char fact = 'N'; char uplo = 'U'; char jobl; char scal = 'N'; char sort = 'S'; char acc = 'N'; Matrix a = args(0).matrix_value (); Matrix e = args(1).matrix_value (); Matrix b = args(2).matrix_value (); Matrix q = args(3).matrix_value (); Matrix r = args(4).matrix_value (); Matrix l = args(5).matrix_value (); int discrete = args(6).int_value (); int ijobl = args(7).int_value (); if (discrete == 0) dico = 'C'; else dico = 'D'; if (ijobl == 0) jobl = 'Z'; else jobl = 'N'; int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int p = 0; // p: number of outputs, not used because FACT = 'N' int lda = max (1, n); int lde = max (1, n); int ldb = max (1, n); int ldq = max (1, n); int ldr = max (1, m); int ldl = max (1, n); // arguments out double rcondu; int ldx = max (1, n); Matrix x (ldx, n); int nu = 2*n; ColumnVector alfar (nu); ColumnVector alfai (nu); ColumnVector beta (nu); // unused output arguments int lds = max (1, 2*n + m); OCTAVE_LOCAL_BUFFER (double, s, lds * lds); int ldt = max (1, 2*n + m); OCTAVE_LOCAL_BUFFER (double, t, ldt * 2*n); int ldu = max (1, 2*n); OCTAVE_LOCAL_BUFFER (double, u, ldu * 2*n); // tolerance double tol = 0; // use default value // workspace int liwork = max (1, m, 2*n); OCTAVE_LOCAL_BUFFER (int, iwork, liwork); int ldwork = max (7*(2*n + 1) + 16, 16*n, 2*n + m, 3*m); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); OCTAVE_LOCAL_BUFFER (bool, bwork, 2*n); // error indicator int iwarn; int info; // SLICOT routine SG02AD F77_XFCN (sg02ad, SG02AD, (dico, jobb, fact, uplo, jobl, scal, sort, acc, n, m, p, a.fortran_vec (), lda, e.fortran_vec (), lde, b.fortran_vec (), ldb, q.fortran_vec (), ldq, r.fortran_vec (), ldr, l.fortran_vec (), ldl, rcondu, x.fortran_vec (), ldx, alfar.fortran_vec (), alfai.fortran_vec (), beta.fortran_vec (), s, lds, t, ldt, u, ldu, tol, iwork, dwork, ldwork, bwork, iwarn, info)); if (f77_exception_encountered) error ("are: __sl_sg02ad__: exception in SLICOT subroutine SG02AD"); static const char* err_msg[] = { "0: OK", "1: the computed extended matrix pencil is singular, " "possibly due to rounding errors", "2: the QZ algorithm failed", "3: reordering of the generalized eigenvalues failed", "4: after reordering, roundoff changed values of " "some complex eigenvalues so that leading eigenvalues " "in the generalized Schur form no longer satisfy the " "stability condition; this could also be caused due " "to scaling", "5: the computed dimension of the solution does not " "equal N", "6: the spectrum is too close to the boundary of " "the stability domain", "7: a singular matrix was encountered during the " "computation of the solution matrix X"}; static const char* warn_msg[] = { "0: OK", "1: solution may be inaccurate due to poor scaling " "or eigenvalues too close to the boundary of the stability domain " "(the imaginary axis, if DICO = 'C', or the unit circle, if DICO = 'D')"}; error_msg ("are", info, 7, err_msg); warning_msg ("are", iwarn, 1, warn_msg); // assemble complex vector - adapted from DEFUN complex in data.cc alfar.resize (n); alfai.resize (n); beta.resize (n); ColumnVector poler (n); ColumnVector polei (n); poler = quotient (alfar, beta); polei = quotient (alfai, beta); ComplexColumnVector pole (n, Complex ()); for (octave_idx_type i = 0; i < n; i++) pole.xelem (i) = Complex (poler(i), polei(i)); // return value retval(0) = x; retval(1) = pole; } return retval; } control/src/sl_sg03ad.cc0000644000076500000240000001003412273411257014417 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Solution of generalized Lyapunov equations. Uses SLICOT SG03AD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: January 2010 Version: 0.2 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sg03ad, SG03AD) (char& DICO, char& JOB, char& FACT, char& TRANS, char& UPLO, int& N, double* A, int& LDA, double* E, int& LDE, double* Q, int& LDQ, double* Z, int& LDZ, double* X, int& LDX, double& SCALE, double& SEP, double& FERR, double* ALPHAR, double* ALPHAI, double* BETA, int* IWORK, double* DWORK, int& LDWORK, int& INFO); } // PKG_ADD: autoload ("__sl_sg03ad__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sg03ad__, args, nargout, "-*- texinfo -*-\n\ Slicot SG03AD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 4) { print_usage (); } else { // arguments in char dico; char job = 'X'; char fact = 'N'; char trans = 'T'; char uplo = 'U'; // ?!? Matrix a = args(0).matrix_value (); Matrix e = args(1).matrix_value (); Matrix x = args(2).matrix_value (); int discrete = args(3).int_value (); if (discrete == 0) dico = 'C'; else dico = 'D'; int n = a.rows (); // n: number of states int lda = max (1, n); int lde = max (1, n); int ldq = max (1, n); int ldz = max (1, n); int ldx = max (1, n); // arguments out double scale; double sep = 0; double ferr = 0; Matrix q (ldq, n); Matrix z (ldz, n); ColumnVector alphar (n); ColumnVector alphai (n); ColumnVector beta (n); // workspace int* iwork = 0; // not referenced because job = X int ldwork = max (1, 4*n); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicator int info; // SLICOT routine SG03AD F77_XFCN (sg03ad, SG03AD, (dico, job, fact, trans, uplo, n, a.fortran_vec (), lda, e.fortran_vec (), lde, q.fortran_vec (), ldq, z.fortran_vec (), ldz, x.fortran_vec (), ldx, scale, sep, ferr, alphar.fortran_vec (), alphai.fortran_vec (), beta.fortran_vec (), iwork, dwork, ldwork, info)); if (f77_exception_encountered) error ("lyap: __sl_sg03ad__: exception in SLICOT subroutine SG03AD"); if (info != 0) error ("lyap: __sl_sg03ad__: SG03AD returned info = %d", info); // return values retval(0) = x; retval(1) = octave_value (scale); } return retval; } control/src/sl_sg03bd.cc0000644000076500000240000000747112273411257014433 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Square-root solver for generalized Lyapunov equations. Uses SLICOT SG03BD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: September 2010 Version: 0.2 */ #include #include #include "common.h" extern "C" { int F77_FUNC (sg03bd, SG03BD) (char& DICO, char& FACT, char& TRANS, int& N, int& M, double* A, int& LDA, double* E, int& LDE, double* Q, int& LDQ, double* Z, int& LDZ, double* B, int& LDB, double& SCALE, double* ALPHAR, double* ALPHAI, double* BETA, double* DWORK, int& LDWORK, int& INFO); } // PKG_ADD: autoload ("__sl_sg03bd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_sg03bd__, args, nargout, "-*- texinfo -*-\n\ Slicot SG03BD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 4) { print_usage (); } else { // arguments in char dico; char fact = 'N'; char trans = 'N'; Matrix a = args(0).matrix_value (); Matrix e = args(1).matrix_value (); Matrix b = args(2).matrix_value (); int discrete = args(3).int_value (); if (discrete == 0) dico = 'C'; else dico = 'D'; int n = a.rows (); int m = b.rows (); int lda = max (1, n); int lde = max (1, n); int ldq = max (1, n); int ldz = max (1, n); int ldb = max (1, m, n); int n1 = max (m, n); b.resize (ldb, n1); // arguments out double scale; Matrix q (ldq, n); Matrix z (ldz, n); ColumnVector alphar (n); ColumnVector alphai (n); ColumnVector beta (n); // workspace int ldwork = max (1, 4*n, 6*n-6); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicator int info; // SLICOT routine SG03BD F77_XFCN (sg03bd, SG03BD, (dico, fact, trans, n, m, a.fortran_vec (), lda, e.fortran_vec (), lde, q.fortran_vec (), ldq, z.fortran_vec (), ldz, b.fortran_vec (), ldb, scale, alphar.fortran_vec (), alphai.fortran_vec (), beta.fortran_vec (), dwork, ldwork, info)); if (f77_exception_encountered) error ("lyap: __sl_sg03bd__: exception in SLICOT subroutine SG03BD"); if (info != 0) error ("lyap: __sl_sg03bd__: SG03BD returned info = %d", info); // resize b.resize (n, n); // return values retval(0) = b; // b has been overwritten by cholesky factor u retval(1) = octave_value (scale); } return retval; } control/src/sl_tb01id.cc0000644000076500000240000000575312273411257014435 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Balance state-space model. Uses SLICOT TB01ID by courtesy of NICONET e.V. Author: Lukas Reichlin Created: May 2011 Version: 0.1 */ #include #include #include "common.h" extern "C" { int F77_FUNC (tb01id, TB01ID) (char& JOB, int& N, int& M, int& P, double& MAXRED, double* A, int& LDA, double* B, int& LDB, double* C, int& LDC, double* SCALE, int& INFO); } // PKG_ADD: autoload ("__sl_tb01id__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_tb01id__, args, nargout, "-*- texinfo -*-\n\ Slicot TB01ID Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 4) { print_usage (); } else { // arguments in char job = 'A'; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); double maxred = args(3).double_value (); int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int p = c.rows (); // p: number of outputs int lda = max (1, n); int ldb = max (1, n); int ldc = max (1, p); // arguments out ColumnVector scale (n); // error indicators int info = 0; // SLICOT routine TB01ID F77_XFCN (tb01id, TB01ID, (job, n, m, p, maxred, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, scale.fortran_vec (), info)); if (f77_exception_encountered) error ("ss: prescale: __sl_tb01id__: exception in SLICOT subroutine TB01ID"); if (info != 0) error ("ss: prescale: __sl_tb01id__: TB01ID returned info = %d", info); // return values retval(0) = a; retval(1) = b; retval(2) = c; retval(3) = octave_value (maxred); retval(4) = scale; } return retval; } control/src/sl_tb01pd.cc0000644000076500000240000000726512273411257014444 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Minimal realization of state-space models. Uses SLICOT TB01PD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: September 2010 Version: 0.4 */ #include #include #include "common.h" extern "C" { int F77_FUNC (tb01pd, TB01PD) (char& JOB, char& EQUIL, int& N, int& M, int& P, double* A, int& LDA, double* B, int& LDB, double* C, int& LDC, int& NR, double& TOL, int* IWORK, double* DWORK, int& LDWORK, int& INFO); } // PKG_ADD: autoload ("__sl_tb01pd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_tb01pd__, args, nargout, "-*- texinfo -*-\n\ Slicot TB01PD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 5) { print_usage (); } else { // arguments in char job = 'M'; char equil; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); double tol = args(3).double_value (); const int scaled = args(4).int_value (); if (scaled == 0) equil = 'S'; else equil = 'N'; int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int p = c.rows (); // p: number of outputs int lda = max (1, n); int ldb = max (1, n); int ldc; if (n == 0) ldc = 1; else ldc = max (1, m, p); b.resize (ldb, max (m, p)); c.resize (ldc, n); // arguments out int nr = 0; // workspace int liwork = n + max (m, p); int ldwork = max (1, n + max (n, 3*m, 3*p)); OCTAVE_LOCAL_BUFFER (int, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicators int info = 0; // SLICOT routine TB01PD F77_XFCN (tb01pd, TB01PD, (job, equil, n, m, p, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, nr, tol, iwork, dwork, ldwork, info)); if (f77_exception_encountered) error ("ss: minreal: __sl_tb01pd__: exception in SLICOT subroutine TB01PD"); if (info != 0) error ("ss: minreal: __sl_tb01pd__: TB01PD returned info = %d", info); // resize a.resize (nr, nr); b.resize (nr, m); c.resize (p, nr); // return values retval(0) = a; retval(1) = b; retval(2) = c; retval(3) = octave_value (nr); } return retval; } control/src/sl_tb01ud.cc0000644000076500000240000000727212273411257014447 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Orthogonal canonical form. Uses SLICOT TB01UD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: October 2011 Version: 0.1 */ #include #include #include "common.h" extern "C" { int F77_FUNC (tb01ud, TB01UD) (char& JOBZ, int& N, int& M, int& P, double* A, int& LDA, double* B, int& LDB, double* C, int& LDC, int& NCONT, int& INDCON, int* NBLK, double* Z, int& LDZ, double* TAU, double& TOL, int* IWORK, double* DWORK, int& LDWORK, int& INFO); } // PKG_ADD: autoload ("__sl_tb01ud__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_tb01ud__, args, nargout, "-*- texinfo -*-\n\ Slicot TB01UD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 4) { print_usage (); } else { // arguments in char jobz = 'I'; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); double tol = args(3).double_value (); int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int p = c.rows (); // p: number of outputs int lda = max (1, n); int ldb = max (1, n); int ldc = max (1, p); int ldz = max (1, n); // arguments out Matrix z (ldz, n); int ncont; int indcon; OCTAVE_LOCAL_BUFFER (int, nblk, n); OCTAVE_LOCAL_BUFFER (double, tau, n); // workspace int ldwork = max (1, n, 3*m, p); OCTAVE_LOCAL_BUFFER (int, iwork, m); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicators int info; // SLICOT routine TB01UD F77_XFCN (tb01ud, TB01UD, (jobz, n, m, p, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, ncont, indcon, nblk, z.fortran_vec (), ldz, tau, tol, iwork, dwork, ldwork, info)); if (f77_exception_encountered) error ("__sl_tb01ud__: exception in SLICOT subroutine TB01UD"); if (info != 0) error ("__sl_tb01ud__: TB01UD returned info = %d", info); // resize a.resize (n, n); b.resize (n, m); c.resize (p, n); z.resize (n, n); // return values retval(0) = a; retval(1) = b; retval(2) = c; retval(3) = z; retval(4) = octave_value (ncont); } return retval; } control/src/sl_tb04bd.cc0000644000076500000240000001067412273411257014427 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Transfer matrix of a given state-space representation (A,B,C,D), using the pole-zeros method. Uses SLICOT TB04BD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: October 2010 Version: 0.1 */ #include #include #include "common.h" extern "C" { int F77_FUNC (tb04bd, TB04BD) (char& JOBD, char& ORDER, char& EQUIL, int& N, int& M, int& P, int& MD, double* A, int& LDA, double* B, int& LDB, double* C, int& LDC, double* D, int& LDD, int* IGN, int& LDIGN, int* IGD, int& LDIGD, double* GN, double* GD, double& TOL, int* IWORK, double* DWORK, int& LDWORK, int& INFO); } // PKG_ADD: autoload ("__sl_tb04bd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_tb04bd__, args, nargout, "-*- texinfo -*-\n\ Slicot TB04BD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 5) { print_usage (); } else { // arguments in char jobd = 'D'; char order = 'D'; char equil; Matrix a = args(0).matrix_value (); Matrix b = args(1).matrix_value (); Matrix c = args(2).matrix_value (); Matrix d = args(3).matrix_value (); const int scaled = args(4).int_value (); if (scaled == 0) equil = 'S'; else equil = 'N'; int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int p = c.rows (); // p: number of outputs int md = n + 1; int lda = max (1, n); int ldb = max (1, n); int ldc = max (1, p); int ldd = max (1, p); // arguments out int ldign = max (1, p); int ldigd = max (1, p); int lg = p * m * md; OCTAVE_LOCAL_BUFFER (int, ign, ldign*m); OCTAVE_LOCAL_BUFFER (int, igd, ldigd*m); Matrix ignm (ldign, m); Matrix igdm (ldigd, m); RowVector gn (lg); RowVector gd (lg); // tolerance double tol = 0; // use default value // workspace int ldwork = max (1, n*(n + p) + max (n + max (n, p), n*(2*n + 5))); OCTAVE_LOCAL_BUFFER (int, iwork, n); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicator int info; // SLICOT routine TB04BD F77_XFCN (tb04bd, TB04BD, (jobd, order, equil, n, m, p, md, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, ign, ldign, igd, ldigd, gn.fortran_vec (), gd.fortran_vec (), tol, iwork, dwork, ldwork, info)); if (f77_exception_encountered) error ("ss2tf: __sl_tb04bd__: exception in SLICOT subroutine TB04BD"); if (info != 0) error ("ss2tf: __sl_tb04bd__: TB04BD returned info = %d", info); for (octave_idx_type i = 0; i < ldign*m; i++) ignm.xelem (i) = ign[i]; for (octave_idx_type i = 0; i < ldigd*m; i++) igdm.xelem (i) = igd[i]; // return values retval(0) = gn; retval(1) = gd; retval(2) = ignm; retval(3) = igdm; retval(4) = octave_value (md); retval(5) = octave_value (p); retval(6) = octave_value (m); } return retval; } control/src/sl_td04ad.cc0000644000076500000240000001045412273411257014424 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Minimal state-space representation (A,B,C,D) for a proper transfer matrix T(s) given as either row or column polynomial vectors over denominator polynomials, possibly with uncancelled common terms. Uses SLICOT TD04AD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: August 2011 Version: 0.2 */ #include #include #include "common.h" extern "C" { int F77_FUNC (td04ad, TD04AD) (char& ROWCOL, int& M, int& P, int* INDEX, double* DCOEFF, int& LDDCOE, double* UCOEFF, int& LDUCO1, int& LDUCO2, int& NR, double* A, int& LDA, double* B, int& LDB, double* C, int& LDC, double* D, int& LDD, double& TOL, int* IWORK, double* DWORK, int& LDWORK, int& INFO); } // PKG_ADD: autoload ("__sl_td04ad__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_td04ad__, args, nargout, "-*- texinfo -*-\n\ Slicot TD04AD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 4) { print_usage (); } else { // arguments in char rowcol = 'R'; NDArray ucoeff = args(0).array_value (); Matrix dcoeff = args(1).matrix_value (); Matrix indexd = args(2).matrix_value (); double tol = args(3).double_value (); int p = ucoeff.rows (); // p: number of outputs int m = ucoeff.columns (); // m: number of inputs int lddcoe = max (1, p); // TODO: handle case ucoeff.rows = 0 int lduco1 = max (1, p); int lduco2 = max (1, m); int n = 0; OCTAVE_LOCAL_BUFFER (int, index, p); for (octave_idx_type i = 0; i < p; i++) { index[i] = indexd.xelem (i); n += index[i]; } // arguments out int nr = max (1, n); // initialize to prevent crash if info != 0 int lda = max (1, n); int ldb = max (1, n); int ldc = max (1, m, p); int ldd = max (1, p); Matrix a (lda, n); Matrix b (ldb, max (m, p)); Matrix c (ldc, n); Matrix d (ldd, m); // workspace int ldwork = max (1, n + max (n, 3*m, 3*p)); OCTAVE_LOCAL_BUFFER (int, iwork, n + max (m, p)); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicator int info; // SLICOT routine TD04AD F77_XFCN (td04ad, TD04AD, (rowcol, m, p, index, dcoeff.fortran_vec (), lddcoe, ucoeff.fortran_vec (), lduco1, lduco2, nr, a.fortran_vec (), lda, b.fortran_vec (), ldb, c.fortran_vec (), ldc, d.fortran_vec (), ldd, tol, iwork, dwork, ldwork, info)); if (f77_exception_encountered) error ("tf2ss: __sl_td04ad__: exception in SLICOT subroutine TD04AD"); if (info != 0) error ("tf2ss: __sl_td04ad__: TD04AD returned info = %d", info); // resize a.resize (nr, nr); b.resize (nr, m); c.resize (p, nr); d.resize (p, m); // return values retval(0) = a; retval(1) = b; retval(2) = c; retval(3) = d; } return retval; } control/src/sl_tg01ad.cc0000644000076500000240000000657512273411257014435 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Balance descriptor state-space model. Uses SLICOT TG01AD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: June 2011 Version: 0.1 */ #include #include #include "common.h" extern "C" { int F77_FUNC (tg01ad, TG01AD) (char& JOB, int& L, int& N, int& M, int& P, double& TRESH, double* A, int& LDA, double* E, int& LDE, double* B, int& LDB, double* C, int& LDC, double* LSCALE, double *RSCALE, double* DWORK, int& INFO); } // PKG_ADD: autoload ("__sl_tg01ad__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_tg01ad__, args, nargout, "-*- texinfo -*-\n\ Slicot TG01AD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 5) { print_usage (); } else { // arguments in char job = 'A'; Matrix a = args(0).matrix_value (); Matrix e = args(1).matrix_value (); Matrix b = args(2).matrix_value (); Matrix c = args(3).matrix_value (); double tresh = args(4).double_value (); int l = a.rows (); int n = a.columns (); // n: number of states int m = b.columns (); // m: number of inputs int p = c.rows (); // p: number of outputs int lda = max (1, l); int lde = max (1, l); int ldb = max (1, l); int ldc = max (1, p); // arguments out ColumnVector lscale (l); ColumnVector rscale (n); // workspace OCTAVE_LOCAL_BUFFER (double, dwork, 3*(l+n)); // error indicators int info = 0; // SLICOT routine TG01AD F77_XFCN (tg01ad, TG01AD, (job, l, n, m, p, tresh, a.fortran_vec (), lda, e.fortran_vec (), lde, b.fortran_vec (), ldb, c.fortran_vec (), ldc, lscale.fortran_vec (), rscale.fortran_vec (), dwork, info)); if (f77_exception_encountered) error ("ss: prescale: __sl_tg01ad__: exception in SLICOT subroutine TG01AD"); if (info != 0) error ("ss: prescale: __sl_tg01ad__: TG01AD returned info = %d", info); // return values retval(0) = a; retval(1) = e; retval(2) = b; retval(3) = c; retval(4) = lscale; retval(5) = rscale; } return retval; } control/src/sl_tg01fd.cc0000644000076500000240000001044612273411257014432 0ustar lukasstaff/* Copyright (C) 2013 Thomas Vasileiou This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Orthogonal reduction of a descriptor system to a SVD-like coordinate form. Uses SLICOT TG01FD by courtesy of NICONET e.V. Author: Thomas Vasileiou Created: September 2013 Version: 0.1 */ #include #include #include "common.h" extern "C" { int F77_FUNC (tg01fd, TG01FD) (char& COMPQ, char& COMPZ, char& JOBA, int& L, int& N, int& M, int& P, double* A, int& LDA, double* E, int& LDE, double* B, int& LDB, double* C, int& LDC, double* Q, int& LDQ, double* Z, int& LDZ, int& RANKE, int& RNKA22, double& TOL, int* IWORK, double* DWORK, int& LDWORK, int& INFO); } // PKG_ADD: autoload ("__sl_tg01fd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_tg01fd__, args, nargout, "-*- texinfo -*-\n\ Slicot TG01FD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 6) { print_usage (); } else { // arguments in char compq; char compz; char joba = 'T'; Matrix a = args(0).matrix_value (); Matrix e = args(1).matrix_value (); Matrix b = args(2).matrix_value (); Matrix c = args(3).matrix_value (); const int qz_flag = args(4).int_value (); double tol = args(5).double_value (); if (qz_flag == 0) { compq = 'N'; compz = 'N'; } else { compq = 'I'; compz = 'I'; } int l = a.rows (); int n = l; int m = b.columns (); // m: number of inputs int p = c.rows (); // p: number of outputs int lda = max (1, l); int lde = max (1, l); int ldb = max (1, l); int ldc = max (1, p); int ldq = max (1, l); int ldz = max (1, n); // arguments out Matrix q(l, l, 0.); Matrix z(n, n, 0.); Matrix empty(0, 0); int ranke, rnka22; // workspace int ldwork = max (1, n+p, min (l,n) + max (3*n-1, m, l)); OCTAVE_LOCAL_BUFFER (int, iwork, n); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicators int info = 0; // SLICOT routine TG01FD F77_XFCN (tg01fd, TG01FD, (compq, compz, joba, l, n, m, p, a.fortran_vec (), lda, e.fortran_vec (), lde, b.fortran_vec (), ldb, c.fortran_vec (), ldc, q.fortran_vec (), ldq, z.fortran_vec (), ldz, ranke, rnka22, tol, iwork, dwork, ldwork, info)); if (f77_exception_encountered) error ("__sl_tg01fd__: exception in SLICOT subroutine TG01FD"); if (info != 0) error ("__sl_tg01fd__: TG01FD returned info = %d", info); // return values retval(0) = a; retval(1) = e; retval(2) = b; retval(3) = c; retval(4) = octave_value (ranke); retval(5) = octave_value (rnka22); if (qz_flag == 0) { retval(6) = empty; retval(7) = empty; } else { retval(6) = q; retval(7) = z; } } return retval; } control/src/sl_tg01hd.cc0000644000076500000240000001010112273411257014420 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Staircase controllability form for descriptor models. Uses SLICOT TG01HD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: September 2010 Version: 0.1 */ #include #include #include "common.h" extern "C" { int F77_FUNC (tg01hd, TG01HD) (char& JOBCON, char& COMPQ, char& COMPZ, int& N, int& M, int& P, double* A, int& LDA, double* E, int& LDE, double* B, int& LDB, double* C, int& LDC, double* Q, int& LDQ, double* Z, int& LDZ, int& NCONT, int& NIUCON, int& NRBLCK, int* RTAU, double& TOL, int* IWORK, double* DWORK, int& INFO); } // PKG_ADD: autoload ("__sl_tg01hd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_tg01hd__, args, nargout, "Slicot TG01HD Release 5.0") { int nargin = args.length (); octave_value_list retval; if (nargin != 5) { print_usage (); } else { // arguments in char jobcon = 'C'; char compq = 'I'; char compz = 'I'; Matrix a = args(0).matrix_value (); Matrix e = args(1).matrix_value (); Matrix b = args(2).matrix_value (); Matrix c = args(3).matrix_value (); double tol = args(4).double_value (); int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int p = c.rows (); // p: number of outputs int lda = max (1, n); int lde = max (1, n); int ldb = max (1, n); int ldc = max (1, p); int ldq = max (1, n); int ldz = max (1, n); // arguments out Matrix q (ldq, n); Matrix z (ldz, n); int ncont; int niucon; int nrblck; OCTAVE_LOCAL_BUFFER (int, rtau, n); // workspace int ldwork = max (n, 2*m); OCTAVE_LOCAL_BUFFER (int, iwork, m); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicators int info; // SLICOT routine TG01HD F77_XFCN (tg01hd, TG01HD, (jobcon, compq, compz, n, m, p, a.fortran_vec (), lda, e.fortran_vec (), lde, b.fortran_vec (), ldb, c.fortran_vec (), ldc, q.fortran_vec (), ldq, z.fortran_vec (), ldz, ncont, niucon, nrblck, rtau, tol, iwork, dwork, info)); if (f77_exception_encountered) error ("__sl_tg01hd__: exception in SLICOT subroutine TG01HD"); if (info != 0) error ("__sl_tg01hd__: TG01HD returned info = %d", info); // resize a.resize (n, n); e.resize (n, n); b.resize (n, m); c.resize (p, n); q.resize (n, n); z.resize (n, n); // return values retval(0) = a; retval(1) = e; retval(2) = b; retval(3) = c; retval(4) = q; retval(5) = z; retval(6) = octave_value (ncont); } return retval; } control/src/sl_tg01id.cc0000644000076500000240000001014712273411257014433 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Staircase observability form for descriptor models. Uses SLICOT TG01ID by courtesy of NICONET e.V. Author: Lukas Reichlin Created: September 2010 Version: 0.1 */ #include #include #include "common.h" extern "C" { int F77_FUNC (tg01id, TG01ID) (char& JOBOBS, char& COMPQ, char& COMPZ, int& N, int& M, int& P, double* A, int& LDA, double* E, int& LDE, double* B, int& LDB, double* C, int& LDC, double* Q, int& LDQ, double* Z, int& LDZ, int& NOBSV, int& NIUOBS, int& NLBLCK, int* CTAU, double& TOL, int* IWORK, double* DWORK, int& INFO); } // PKG_ADD: autoload ("__sl_tg01id__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_tg01id__, args, nargout, "Slicot TG01ID Release 5.0") { int nargin = args.length (); octave_value_list retval; if (nargin != 5) { print_usage (); } else { // arguments in char jobobs = 'O'; char compq = 'I'; char compz = 'I'; Matrix a = args(0).matrix_value (); Matrix e = args(1).matrix_value (); Matrix b = args(2).matrix_value (); Matrix c = args(3).matrix_value (); double tol = args(4).double_value (); int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int p = c.rows (); // p: number of outputs int lda = max (1, n); int lde = max (1, n); int ldb = max (1, n); int ldc = max (1, m, p); int ldq = max (1, n); int ldz = max (1, n); b.resize (ldb, max (m, p)); // arguments out Matrix q (ldq, n); Matrix z (ldz, n); int nobsv; int niuobs; int nlblck; OCTAVE_LOCAL_BUFFER (int, ctau, n); // workspace int ldwork = max (n, 2*p); OCTAVE_LOCAL_BUFFER (int, iwork, p); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicators int info; // SLICOT routine TG01ID F77_XFCN (tg01id, TG01ID, (jobobs, compq, compz, n, m, p, a.fortran_vec (), lda, e.fortran_vec (), lde, b.fortran_vec (), ldb, c.fortran_vec (), ldc, q.fortran_vec (), ldq, z.fortran_vec (), ldz, nobsv, niuobs, nlblck, ctau, tol, iwork, dwork, info)); if (f77_exception_encountered) error ("__sl_tg01id__: exception in SLICOT subroutine TG01ID"); if (info != 0) error ("__sl_tg01id__: TG01ID returned info = %d", info); // resize a.resize (n, n); e.resize (n, n); b.resize (n, m); c.resize (p, n); q.resize (n, n); z.resize (n, n); // return values retval(0) = a; retval(1) = e; retval(2) = b; retval(3) = c; retval(4) = q; retval(5) = z; retval(6) = octave_value (nobsv); } return retval; } control/src/sl_tg01jd.cc0000644000076500000240000001355312273411257014440 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Minimal realization of descriptor state-space models. Uses SLICOT TG01JD by courtesy of NICONET e.V. Author: Lukas Reichlin Created: September 2010 Version: 0.4 */ #include #include #include "common.h" extern "C" { int F77_FUNC (tg01jd, TG01JD) (char& JOB, char& SYSTYP, char& EQUIL, int& N, int& M, int& P, double* A, int& LDA, double* E, int& LDE, double* B, int& LDB, double* C, int& LDC, int& NR, int* INFRED, double& TOL, int* IWORK, double* DWORK, int& LDWORK, int& INFO); } // PKG_ADD: autoload ("__sl_tg01jd__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_tg01jd__, args, nargout, "-*- texinfo -*-\n\ Slicot TG01JD Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 8) { print_usage (); } else { // arguments in char job; char systyp; char equil; Matrix a = args(0).matrix_value (); Matrix e = args(1).matrix_value (); Matrix b = args(2).matrix_value (); Matrix c = args(3).matrix_value (); double tol = args(4).double_value (); const int scaled = args(5).int_value (); const int ijob = args(6).int_value (); const int isystyp = args(7).int_value (); if (scaled == 0) equil = 'S'; else equil = 'N'; switch (ijob) { case 0: job = 'I'; break; case 1: job = 'C'; break; case 2: job = 'O'; break; default: error ("__sl_tg01jd__: argument job invalid"); } switch (isystyp) { case 0: systyp = 'R'; break; case 1: systyp = 'S'; break; case 2: systyp = 'P'; break; default: error ("__sl_tg01jd__: argument systyp invalid"); } int n = a.rows (); // n: number of states int m = b.columns (); // m: number of inputs int p = c.rows (); // p: number of outputs int lda = max (1, n); int lde = max (1, n); int ldb = max (1, n); int ldc; if (n == 0) ldc = 1; else ldc = max (1, m, p); a.resize (lda, n); e.resize (lde, n); if (job == 'C') b.resize (ldb, m); else b.resize (ldb, max (m, p)); c.resize (ldc, n); // arguments out int nr; int infred[7]; // workspace int liwork = n + max (m, p); int ldwork; // int ldwork = max (n, 2*m, 2*p); // int ldwork = n * (2*n + m + p) + max (n, 2*m, 2*p); if (equil == 'S') ldwork = max (8*n, 2*m, 2*p); else // if EQUIL = 'N' ldwork = max (n, 2*m, 2*p); // FIXME: larger ldwork should give better results, // but it breaks the test that Slicot provides. /* LDWORK INTEGER The length of the array DWORK. LDWORK >= MAX(8*N,2*M,2*P), if EQUIL = 'S'; LDWORK >= MAX(N,2*M,2*P), if EQUIL = 'N'. If LDWORK >= MAX(2*N*N+N*M+N*P)+MAX(N,2*M,2*P) then more accurate results are to be expected by performing only those reductions phases (see METHOD), where effective order reduction occurs. This is achieved by saving the system matrices before each phase and restoring them if no order reduction took place. */ OCTAVE_LOCAL_BUFFER (int, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); // error indicators int info = 0; // SLICOT routine TG01JD F77_XFCN (tg01jd, TG01JD, (job, systyp, equil, n, m, p, a.fortran_vec (), lda, e.fortran_vec (), lde, b.fortran_vec (), ldb, c.fortran_vec (), ldc, nr, infred, tol, iwork, dwork, ldwork, info)); if (f77_exception_encountered) error ("dss: minreal: __sl_tg01jd__: exception in SLICOT subroutine TG01JD"); if (info != 0) error ("dss: minreal: __sl_tg01jd__: TG01JD returned info = %d", info); // resize a.resize (nr, nr); e.resize (nr, nr); b.resize (nr, m); c.resize (p, nr); // return values retval(0) = a; retval(1) = e; retval(2) = b; retval(3) = c; retval(4) = octave_value (nr); } return retval; } control/src/sl_tg04bx.cc0000644000076500000240000000674312273411257014462 0ustar lukasstaff/* Copyright (C) 2009-2014 Lukas F. Reichlin This file is part of LTI Syncope. LTI Syncope 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. LTI Syncope 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 LTI Syncope. If not, see . Gain of descriptor state-space models. Based on SLICOT TB04BX.f. Author: Lukas Reichlin Created: March 2011 Version: 0.1 */ #include #include #include "common.h" #include #include extern "C" { int F77_FUNC (tg04bx, TG04BX) (int& IP, int& IZ, double* A, int& LDA, double* E, double* B, double* C, double* D, double* PR, double* PI, double* ZR, double* ZI, double& GAIN, int* IWORK); } // PKG_ADD: autoload ("__sl_tg04bx__", "__control_slicot_functions__.oct"); DEFUN_DLD (__sl_tg04bx__, args, nargout, "-*- texinfo -*-\n\ Slicot TG04BX Release 5.0\n\ No argument checking.\n\ For internal use only.") { int nargin = args.length (); octave_value_list retval; if (nargin != 9) { print_usage (); } else { // arguments in Matrix a = args(0).matrix_value (); Matrix e = args(1).matrix_value (); Matrix b = args(2).matrix_value (); Matrix c = args(3).matrix_value (); Matrix d = args(4).matrix_value (); ColumnVector pr = args(5).column_vector_value (); ColumnVector pi = args(6).column_vector_value (); ColumnVector zr = args(7).column_vector_value (); ColumnVector zi = args(8).column_vector_value (); int n = a.rows (); // n: number of states int ip = pr.length (); // ip: number of finite poles int iz = zr.length (); // iz: number of zeros // For ss, IP = n is always true. // However, dss models with poles at infinity // (filtered by pole.m) may have IP <= n // Take pr.length == pi.length == ip for granted, // and the same for iz, zr and zi. int lda = max (1, n); // arguments out double gain; // workspace OCTAVE_LOCAL_BUFFER (int, iwork, lda); F77_XFCN (tg04bx, TG04BX, (ip, iz, a.fortran_vec (), lda, e.fortran_vec (), b.fortran_vec (), c.fortran_vec (), d.fortran_vec (), pr.fortran_vec (), pi.fortran_vec (), zr.fortran_vec (), zi.fortran_vec (), gain, iwork)); if (f77_exception_encountered) error ("dss: zero: __sl_tg04bx__: exception in TG04BX"); // return values retval(0) = octave_value (gain); } return retval; } control/src/slicot.tar.gz0000644000076500000240001156520412273411257014775 0ustar lukasstaff}Lslicot.taris9/k~yq-"gbw%kOLܠ%Y2K6)Z\5rĚH$@/G?֟P=Y¿"KbW8L_?7]/Φ_-.'hϚm"0"u_+e~_4jH}q'5`'I!Wпw>A#5OP ֽb&Q4*PQfF1&]deH{ VߋA[[Qjs|TQ!Irn(9Dd[L<%AWOd&,E['>66nEBTu<4ad$ ^;I17E02abA2*ֺ:"okJlFf WWSQ1g_[@UIaEe*pw+F+(EQFj PhvQBlFYs{?ߚͳiB:?aUzo..((uZu-e)2a(oh «KiGaaEᴨ,I(ͭlh.R@I% 3M%ͰS[ CfjStykN=E~\Iv,48]S݌3Օ t$wઽYJj:foYisWZ~~B\.QD>}95j}a8jW֜m??R֜'c$s+R2۳(K#$N#c|)[D|n`7fEP灪4 M0E4ҍFR{%ܣT GxN'8UCtVn@`vd8X/%'gY0W̜h)W]{"*kH;ARVL CuhLH$zpvDB%60vgyj'4݉e~@ɈB90ZS;HHN"PYS2ӑj$K<`ka8ۈ2ŚjEK԰Gńv"6,9q:-SdZfȠ0N"6r{DJ'qǐxjj9J%!pdtNh{lbYl&Ke#pL-"ˇDy{$b:D9&y/CaIPRkpĉɼUC*PzX8US'Ղ<*Qn&C+,tf iQQ0%,jEQX&)I(HfZW|&: *F\MK %#MN 4D"{R' 5 X#qb927JLFIIvL}/*ڧ}:5)uUS;FnMc #TtA1MGFHͭA ZBhM#["#@&m)yT諨.Pșۥ ̷nWI\O-"c@z,raYΏp:2"8u3ޓ̎| e'Z{tjGB_R"Ŀ$q1S% ]ʭלZ3~~ZZ)M0(C-05V>IlgAI?fG#N&iGPP؄%m-Soyfa!M4rgXIdR2+rĻa5#+ QfΜAKHwq\ [Q( `ݢFZY-xhO37\-X[dw1P*hX&F\*v"z2{Xi! :罢0 FJ2]4J\s]R""V6Sv%Xbyh,vl@2;hIlg}f`g,tPv4D` ͻiz/i͑8ب %;/,9%ױdNm$54:Kh 6r UbUZa4bqN%%Ӑ9o9CןQO]1qꞪּ~1f&sOb`ׄQ` R!M0nHFT'@6UTL8u \]YaP J[zA`YecR ׮ТKjߵ Ro'3`#a PmC: xQo=# ajR9tȧƞPQ 1Q0DPL ҏO!KO4bunr! !dVTl e!B.4G@45g-VX&YdNF>ED,wN2C *"7ȉC}ӈpWQcBfd]-T;+‰tKB3qX:/op@ca 5LGamy#aC`SR"w} HUGb} AŽfIG" D!,@E67CFF4C;TϭtdKS0\ܶ=L2$FⲚ>8.z!u)16Z];vRK2L U—d\C4^ vA$\hYVIXWe$%BTN~ArtìCdF1Bn*&OIT\u.@R/N-efFhy.n;-PpADUfA[Ye1r$оoI4ȵNC+a 3 GMMJ+4 eQ3 'G0AVF"AEKlFlm2rܵ-]Vv $IjNc `!5XaYcd6-Th\GXibY`W}?D#3'$T]VeIkV<6jG$mT=t70gXv= Si~Rlq C(B%M 2sW JO \T8-Mv@^JPٕvEj;ҩ( UAfhæuܸ5U͡gjAE5qrT0"ʝ1h" *,:v@cg_J{`QV+UZQE-SDA`S(u*-<_> ~ceVKOf>=Ѳ^x\rfcCJ'B(v>`/vZ>IdKfJ1$(ʐ~GaFX~u,e9-tҫjG~oe[G'Y4|*1+qAqO☍YިYGfH<1Rro3.٥اkU{ףK ^z>='KfKo ]!$eGEt}zGx[؃0MAe>Eyy1ur Kx{(,R>bqG3yi0զZ2-H9Ze>d(aO1Xp.8dEZ'n0Jks&]&q)3B,oZ lE7BVscH,et"TwZn%3ԥZKy.NK )GGĵ% /d8`(=䁪g> mĩy! I RVfB;}#* ^fף4t+2G]YqH_{q>K[BjMc,\,]Bp oT2D`6>iY\~~VK/vLZ7Xy &C+AK}3`&$f˙Ԉ gv$ZPu61#vf\x22f4Tx[8dƥ= 4;pAYZGpSdkMJ# Ԏ;̭hiđ C[;ΊiA2%"a4#kD7Wr7~QWD_$hqz o@P;qY4:XILPJ&)c3Gj?iK9_a$gRJ )Uʹ,vt@I0x(a\Dni,vHl )X!YM'}HqI!VgwBfor)笘K),LDz3S2gOErL̲}"+؜B2^KrHt4V߂KfNQaO|nŵ"vs]zGVXj]VÞt}&اM>LէG9I4ڑ8Y3kFMYcyyjHHs4e|ny> ՐQ5S7#^Js*1MI $6;'S)H0cykL=^JYJ/'`'W !46e4gܚQP)۬Gv4x#a(j8F[I4q}*<>D"8J99=tOngGQ qWjD{)y}Qy3bq2sq ܌~j!ؓ>p>K!ٙgKQ{ż7(L9{{(hdeEOE!͗0f^Dq/)R8'DGqx*W5s8x3.!,#SJGZM*rZB$ (\9C__i|zyJTp.MS.oHcOG[ AĞi%q>xrP~!|J` r]7:ϩ #R)? S,$n !}+~XRF`ejNr(e=65S5SR-{֧O%o(gŤSK!avtCl/Y"2t}@=}=Bݧ '@*#MZɗ͏0{_1x;g>љ'B[}'E/ӯoN~nףRSO!mjFOei؏f?k44Q4PG3ov嬆$|6%z9_r/pOQR 벿U>y w,(h>~1CEdSj(\ׂb6K#>S3xtG]L?I/wRfI[K+2ChdJc!HYƮ9_d(,ɩI$\K8cdCqxE,mW?y>ݵ-ziP [UCɷcO vNIQi~u9jrstCˡE8erdi`ᣌr65xwMt-_'@3̦0FEeR*Y - YEI_M5.?\,k$D^0R̉-\4i[!izi$#2!Yk0ՠrk!a (4V\F ~}sO2$?Q[~ ggj_/400% ͼFQQƲv)re ^0Cޖ׆tH۞m~])J5'@̮il()2=J&]҄L5Xl,41`O &6=穑e<==j.rk]L&ql0&1JrjԆT!* jN$800s#(KP$֓kfҧihávup_8q?%ĭRh-eկ`>hIS9)[8o5IHGa++ɇjPGC`TX6j C.!rvvCQmRUU`4"]l :B#c(f:-`>D):˙FQkS0h`\2 `ݫ;/bi)^ 9>tdGK|Xn>;SHbB@NTXFT6p{澻zVVjsoƃ2Ж[[\]zk͡xC>!:*4K6H/7F<]``i:6ai<ߺGkXE>Tzܨ/Y%"Y;BuddI2ԫE%`0j ZM˸:3¸2j]uP8x,S(49$aQ'D7V>XOdN~`0Hi/NNE, kfej 2BUfL$3oTYٸ^8*5 QeQ FqZb3!_ȴy՟SZ0* jUwiԯ,9jTjr YsXeY/ZO gU-D,tA6VQQt rՈN8\S!jsZ _Q~pݭuY&XeYԴ;UYg͝W6scqNsg-Dw-ƌ򢺙LCv݃v0Y\jVfeBc=5BJзҼ!e  L1ҮZImbld~}5hX_b(hIIZYi!pk-B1«AkaZ#Kh3L1'BV_j[r P`im[*\G a)5" Np9rDHL=48jYXrfٍ5',-\ڐVn ǩ눱 5IX<)jEɰk6`Rd232ȒJKFrʰH&CsT (Lqh'ghedlѱ!>p`˗0fE| v%63C4-=KEqI2$f"EFY[qŠu}X|_mii/Zۼ}-m^q/7Ži3&μAM~'xl?a:{%ֽlE#@@yUj3DQlAMzJa8\"1"yQt5Lֈj1UTbk Mݬz:?I%L¼)oRMh`C;)mc. )X7וĦ Q0ݬ|^xur1sFku ^ u(-S[A!]o&a例|lV^]cb|_/by~ 2**I.({vBGsnjmDcs c̊aƵ ʑb.BeMMLWj>js#qð;ۈ2ŚjE bH06 n/9N©q2I!8DdZ0`D#04ŀ FO^MHp/29p!A^cc[R"0,sS!Q^CB$Ӂ͈M%ȱ0{%1$(b5Y\s"D0W:GCaaa; OBx&xQ  :U b0%,jP8w$LEIe5qgMYp&P8uP(YipgN0Guc4"5kE$09Oj]#qb927h/)q0Ɏ~A銦tjR$&j[5bq #TXǙFAN)+MzJH!C 7DF*5LRէC 73#gnKDP61bŁFr[ch\(*D AAx#3#=x`8mh)uY }IERbi;LKOr5XbXL3i{j4)rOlky@|@p(nHphdR42X4#n( (lŽ9ӗbZj ߄`9 o}% Qf!GV:̜9tnϑ$71҇ za'I7`%4;9cw~ hRoؒ/ư VT,QiEe==N,^aܭ e:`Qw]R"0YNە vcQ[&m3 ;&l@2;hIlg}flagnQv4D` { N `Xbe`bv _8˥YpsJ2cI$5jz%3ۂ0sfzZt1BV%-kp8Qt{bE)Ym%̵4XwG!:z&R)Сq{4fMVճ,AJU#KVj{aȭ/e-5fS='pRb잾7*eAtO #m{ᙄ=x3jj7%.EZ[zZn鋧Nt:n*WG-y]ŎhiZiRi\esa}MZ**yqҲ-I$mɊْX ݧӤ,wXOM@r S24//"< Dd(EaYQ5zv]2minw=kY/ {FGs/dh MH{TjX8vs9툰rT⥕.~>'>! E s@bq9l3c1d`At(Q?*0Q0% aPQ$uՆ̀WGzB~EmU bF}wkĎ'd+9bCpEJ}-AEfYMW#3f>[H_0=]Kp(<SF7ًz ]<$ּp94ɼXO_/Y=3x 68})a8±\D8Pp$=a0 Zu1~TKU45NJb< zYx'J1R. τ͉+ SmC#w_J{}` @1F*i4&:8SB2H6_U8i՗r1Q32An1*p"2s(:M]F)RT"vdL]ROA5)bڠ;V a4-FM$2-2ˁgkݗR/cqJc &#(6xA/#NjbX)`J-j2Ő=RRQ($S0KM` $ [@tVi`3%v_J$L ;6XRѠ 9"$E@850aS 2;KYla#.Oi%xX -͹} y#}) jDeE=T[NSØA 6Ϲ(6rC?1{t2^vdp![0DaHPa9Puk2F 3>BSx#, .!(Ia%\W[44aZLX_  '#E2ѕ2DLKT1jLUYt` #MdVsֿ-2 y_0龁 +(b&g."FR L!N@NܸߣR% 1u,ScUCcw<90;-3hWTb|GT?'}A! $3s# 1>S{tץ 0v[ä3!)oq6.7"yݾD)-q|hJQNݣ0Ie튓*=DW>#z=\0rP YmK(r]ck/&l(M7E՘>@BQc.9LSLTV%zτn3؈98p j3xTaؐ`Uuqs…K#h|j΀!5SYq,h@*kƒׅδOH/\ ;ΏGݖ$2>7Ƒ έaP Uv8I*= ޠ`GLFaZz0b *67rJKho,̮mWŠYKcz\wpTvٖ$xےx:6Bef#:9(Gٝ|?f.z"qwwSr%!>@R)Z]Y HJ%LUB;]lHv"9#%K7p @)Vr\Z4Hs䔤 I-߉^Nc)0jEƍ 0tΩxSksT+ (NP}rs3ݔ3}$a_&ALyeݥΊ끕X|Ӵⶰƶ;*yM <%lQ4]A AOMy)8GȬ(N fg^/FnsW5.Nbz|X(~ڳ n xL&mcsqpy9H/ΘlJ7p6 qj?'{=(Z PϊuφX"cDu֥d8Kv1"tX@<{ Fӗt)8CLibTRDҡ"sb]Κ+Lw>fg>"3bX-VJU>Ir^u E6(RTi=6\5}σw,%tZ~(nLؤQɢYztqZB ?t}Hj84MMyG5Wzǐ\g{00n-5>!>:+; R[L_JM= p&13;=ˍ}vς}) hKς}) cς})Z İ  ɺ5&=gՔRTR/nJY{KYkubܢ3a_28'I_ʺo- iO=ӗr?JAx{ؗJa ٘~`[Ua]W?Q,1c8"C$)}Ob)%"l$"(D\.`NT#3ҹAP aY* eStɅ(t~03f_ҐR#6}8 yl(9Q ӬX5ERI5%4,l&!@]TQ*,Q9Ҥ98|G [&IvQjWMwM"6/(S?aB wWQPYY}M@_# F Fzwr C/ Qf&Qi!(jb?4 TP^5A~(.rB(L)( V3QdټX+hPAV*3vb5uqp{i xyj3wNF.4Gzƫ(s7$DQlSD3] m@E#4QJZ,2\R7m"qBK>!xژRP*"Ҷ3av6=j~l8Rn\`f+${N O,8K?"IA}gW ïqK:ڳ槢$F.(PA!DXXەAյx};82-s&ҫŋ7$sY jju仝3Kۿo8 c&|inWSC1*= ȭ,Km_z&_ǃRfFM;$)R=:C"AX6+yxSXJTHx, 6SKvj2NEjR[MթLВb6Tp.e N'wd(L LM8Kv|\ $eζZylS)hq4$-tZ1؄ ?n\cH:IZƶ3ҁ&: AlԌՒT2g!Qt;&j\]-IdCyF0d]%?$*QRZ(c%L:8Č)űY&%˩J\:"V̑ڗWOEmb G1h"rz/d4>s\O=Mm#R+~m(#%`;n|C*sd{&$l5?_dz\7>a1y c W۽ݝY辁ݯT]ěI[J {#_rKӳ9HczxدtyFh;7 @=sU-Vza~+Żne)j`V]xob+]n_ ˏGQ".pwi١7KQ,p3ZK2nUVuHBFAQ"^T;_G_^3 7܀d]+/;%VD6 .qhQ_70Ƙ l9T20F)^zAvѽٌtoRal^nKnjV9VxOXst 4kxV#Uj\F߃bw͙/9M#ĩ|gPÚmP2c@Gm ʂR$W@6¦I֎KˋT/arVl-?,}[T!n~q!׭>&/OjN/k9 gH3 wun?.%Cr1uu]?4pfQ`@@N(0qj$u02"-'2p5-eUbȺ bNhz]CK}F@S8#,62]<@Bŀta :+q~G~xK'iw>Q-?F1"y +\0*8wp"'|,1|j }CQ 2)쀳#qs;q`2©Ra,ƲQ*LY-$$|$ha&R{e'I<#@ siFʿ#XڹXxHLs1NBwA熁JR,`,6:$;FrcS-BVݘV[]@WR@ڐ{Bk !6&#{aͫs5%~@J׺E })ek?N %4 Jf?xҹZ%SxS*}u ;QQ'ܑqN3th-\5&Kjڢz)N2<*]pg@cEKu*n#׶$W-! qݒ|`{zK3D" Zԍ?Jب9$y -R~EmLS0.y$?A8v)MI(n fR[yĠ:BW^fmIոǶqX R֞bŚ`TMVl%ђ"2|;BRE`9Ys83Ebےɔat9 FnN\i&^Qd03ChGp WjL UлYcWB~<]n?o R7]vu|V77Ijw-!C펨܂Ía`P" -=|(L?d10~ɊJPUw9Y;hcAG(`acԀ~CN0]DK~aO•?γM'$qU<-p,Qh|7 HHPpE,0Ca~KlS}C&ԈGY"2+ 1,A BA1L#U榁V"Ba1bAMJs2eKe2Q[ FQQj2aIP5B0RcH )3Yj9y&: 劅4R@r"bдŸA;JKhΚdEG,S2ŹtPG 1T8ZaƴHy$uipr*O50X(5QV਍"'|uBOdEZ"1|+ YdQPSO\@5I9JwyUxL/4;ʐKd ksyu< Y<-%GHV9D4sLm*Z—F+Eć+b-,7cdT0n½Ido (M,KsěYygV#ǔk^6 YuS$0rjHHb$ҌST8ϓh!,idxr1ã%EI^Ey ;UKV-̂) Y(fg9H_r)! tD/+Ȣ`k$!JR-Sof(2BHW1n,ߥk`y\Y19f1q9b 2~3Xy†8 9{j+˕5RL>0eK8rdm.s$! EY|a9E1kR6!_RsƻIAM.KmbFBrgB᪂ˠvHr&5"J\.X8k@@+I4J4C"[bD\<%hYLyd^AJ?SK_)v">+\,LXN*Uтx6h4P1eC1/I3ᗉZli I-7*i(j9OI25b 1bG.CIiqTb38gt/".o{җ'%[BpI\atɈtD+ir'ٺ9SrL\Y+CLN9)FBz2nbW0avhR/Ou]N ]Lؚ[؆ę=Zf"Ӭ`r6l$.wnּ܁5Gʴ$lCԴn!dxXYҼyV_M!y˽52H΄ ]Ȗk8nuy\[/:\9;5-vVpvOzVo׺" ʢk[FwV`4u:f~)4kLcUgm#.t" uNSNCn^섞JD$$||o׼BsXy-g)+rVs&mZ3xUJ1*|Z]e\";-vtW&ZX$3D6,vࡔ2d2m^(df.aK$lrܴv)qS.˹4PxiS0ȣFz(YJ{] ֻlʘЌrlZ`Fw'V AY)SaW;6\I)OM]&c.4nŖ;8OLˤI)7wI̤z:QӼ%`r1?n^; /}!a&2V̎ $b?|Gشށޟ0w2mo1[M2o4w)Nj[@bJ uy;+D7 ?XH-BB1Zd9CHIiV/SȎ`bdzJ|1Ct5wJfn?ӶaW$n:a]d(mfKkXr@3r)_S ]Ȕ޴9ilQe)6բ.&vV7h^;9K3Oʹ3*y,fZaᝌG;e_"K!2;՟DTL(6Umx.vVpPs'_,ҩ.,w- >&t?e0Iksw-T (85<˗۾8\]EĔδ\2^2u v&Q-"Ә+XV<"au)/B"4RO6^;%Y*Ԣn9 rftf(Λre6%%9Q#jg Iq❛f|alϼs,KMX:^]2ɜHU=-Z؜HJĉF <+K${sp96SrA[^*b_IPJ^ 2Ep d(2K Ŗyh䛄0' Cwy'YV!Z,"^q.< =zqM#u+!@7߮hn(XD^w L5$[MrrEWŮ_dÕEsldx]F,ٮ+L G)6$ӭ-j >^9Pj_&J6P\N-?KhsI\&v&,c>P}W3M 3芓U4OdW Yx"fUQKf! qm]8d"2䲺XDLIk%z I"qX;Z8Jx"g Q;W#-^IhFRfegOLi(9P+3?J0y IhV~LϮ,]! rЍOLfr9`#vМ bgI> G^/W4I+_-.rj*Qd@^UVSp'] @Crqavf %^J#0..쎡B. c_k!`iOf]r\&oPDyjr./v |S]مrOO'_'7jd} f_&٧/<8~8=> ίL.'Ňh믓Jq4P}O.gLN@lx52OՄ}]ojrgo3wWd|5b6X5o[>`U|~͂ *W)g@U1u<=+@=qo'gU>L&Z ˋ/~!cT]ӒzsX | *Rճ_{7}7h'ϴs ;> cmÉj)d&բw~2хϵ.OI.@)pcˣ7ǧ;z1o\|UJ Hgk1XiZ_Ǘ*f4>pz5 _J nC R v~΃oã@w]K0QږI+***t&\Pj 3N稻6M} 'j\AxqE)8J+rqS 9N*'K\nԋ5V_Dz>ܞ\7J>* r kWE&3EO,{MXZw,m O_զX-iVN*ڑk*l 1;cbXag+\^ࠫЍ52!`K3R YPDkBvcGAQ755wOߦWQ`wClVF(fhAx,,fDI}=Hnӻ:g\KٵQQ3Oy1@QkT. MEfQ9nzYMK+hW5gk_HO]N>!Pj4\T > FMxsJrel*_u EDžKW:uJMW/txMT 柡ڦ*nEͣՙ/l( 1zWZ pڿ|gֳ[W;j/Wjx̐gJ LWg.OSqx 5ݮKY`:VUQiL<elU]ݍ vĜ;zdFCVEˋSзq>@U@^\ rkd`ɠVŒ"PCWE@8Z3rPL;50<_:o.)x5_h;8\>~a>_NgWh߈ێ(Qϑa"gt`=8 w%ʕR>)϶]\):Q$V4?|_).* 4_&_U! !kI+8O?to:j:A0+ ms 75kaL{={ƏT+.FDg5;{CDE[ȶe D+jy,ik{l fAqt  R3~|bޥJϯ/QDM.EKrbX=~-{1*%/|sybWf Pe(@ɠgohFѝW$[sj}Ǝ7 ZJ`4~Ue\(h.EmR"(;m2d{qlM!m7pQPʅ/T9^{Mr/jՕ=藦 4 ~W9cx F׊Gű^_j?3#Wt%7Mm}EA7C[~ub!n~e޸%c '/0?|b9fGt1]=dFa0zj|3"v uAɆ/^?s9[q_= HUj^82l ;'37iQ\bW[B>|=:(Sy]b-Y3/& t[_l$R^cRQLq(eh:8zۭiu]>pz\M ,M oCm0mo loRF$v#Rم)%ġ^;ώU?߼QUR ?@6YRPY(E :5KTFo!~~M))Ըu;c[#^Q '4Yi2R-ɦcvc}ӜfyDXT8"=ĈG W@9\FUq\c֡}j{.E-,r5ڃRk\P"f`S|Hia&5 Ry!!/WBQ( 3w}U:NJ ׿ Φ'2>_N>u4A_.ZS֫`Ǵ vǟ&WH/0pڼ?ӯX2o4 |{:h꨾ã\`ASi#ǯlzt6N.C{OT_~ ?+GJYi=Z=Z ]濏:Y/qkk_i1:$%tQmϾmcn8_X@`f/KpDmE%n7ߨMʥ q/./J3(=RR5xūEs_SaHMjF?u_})L#YVIURVg jVr'bY#5e%" TrfSjT"U;bKyYQ]]`ѬW|~鬝r}.N=S]RZE`4|: >^l0=4_}xo릚78k* g5CV\,YMz MzS/Ѿzi1?}sQVp@qHs1hw 6pMP~,@Л¦t~-0.˓/x;2?8dC&is‡ѕUg44;`QaG9\{hGBS=*H5grZpB`E8/:s']n8wGf8o݁巪^}n`rjygz1C{4|W#X^2µi䊄ju(%sz~m-F ??\nk( =7!HM[M.ZAh1Riǜ79#F{SB+z>Y02mf7:@7K# Bo p][jvL8ϦDىV̻ ~wNX+q;׉vݮ4Sڏ/fWj}mq"WwlOY㖼5]ފ#9Q%1򜉚zFeh%GG5GjiSI]U_>3Tb-XҪoq)5%l!k!4qɃC]Jj! fyR󕺟([^cYIժn0Z wjɐ:qj)/48MF(D tŃ TKV-XuUO&-B Q1QK[]ZJL+iʾk5_-VS/v>w3~=_oQΨ4ż?bc/@x{}BærU{G9q#Wp!=4XK{O_7z7D? AՌ\yO Oz(S-64jm\ˮ{UbQOC YMqx^qɁ} h:ڸ\S ,n4$ir^5(QkV'`FMnص\/ƻ]Mۖ*;H|e8x]4RG˦;gշOAxUx)7^o7GnfoV&oV' YZ0f?St=t{Dƈo%'rnRegpqYi=gghq-3Po\[ߒk+{}1Xsm ]]|9⑄fU;X &/ywۃ9xp λ;~H{7ϟܒZQY뽐?zLQR˖T*3^Uw6VU[HJ:7PG}MYkj6N׵֥~qfe. '΍bbL<>$VYFz]VkϭY +h u&j:/8wfBks\X›=vW>@{``YՍ )!Xi?{koo0V-29!9+ukyֆM\iU}XޖE|v~z@t~[cy!ϙwf-4]##6q. f2ײG`e8!\pEr@#4;o7+e>ʊ/Wʰh㙠tCti 5#7,o[]g:"lmcT]/0OK:7߄ ZRLJ-^?I6Mz`zz`QCs6dUHZJޥG>Q0F%P)m6r妹C[c[,mᬌ<!J)ƝA0 vefyhTDZT‘1UT>9޲[ J֐; iLsjf-w uR< fIoM;OvK:wXW2nxvh u!kqѲu}*뛫TbP;cZ_PO):W°W~j雔lT_.N'V C< ADv! NsUd>acl_'45.̽3`72s-J~UnY (_Ppj qs1- ֦Er;%/.. جio vjD0?O..b(dQ>9*-}6.?jBE3 2v!T^ nƪ ^mbvEVKϙj>=?S-jK*imb&Ƞ05Jޒ5!0}Rq@"7yYWsh"o;e7{7+d͐#HBtGzV: dwV}HCBjRMo"oRX=p88b&ԆY"Z8UskEy0V Tٿ-rslzbG|9'+AQĖAxَ>ĭ%q \a`THUFڡr_67k &8 +My`Q>nsK6"#2BBB2or!RJRrH 5삎Q QWi裠H]% J!_XϺa"% Y ! tՈP;3{Sn~}H߀y#oXhfIVn7nǵֽ h(n@kZ[ W_r٩q+MNxR3eJI cYRFu!VHw\idh4!lq5F0Y\vBߌ A+hk:n#^)Dz)̾ލ֥~n֭_>gTſn2TU/3Tmj{Aejˬ:^*\1IsMeǪ.cUV5r7|io0Z]&:]\m 0tM7 2WfG(^mܼE[G..+dw;<8d_[TF]{A:;m|  d`-<-`VoM ̷ fkrY>7Fl '_T_'!ݯ{O6<'`uVQeG+ٔar5}<6lSt_nX8 jCnQAP&]lw J*+W4[$\01_j h:i٨[x`?0CJ‹;2ƪlQJE#^)jg9HS܅E73N#۰jPbdo3r1ca]"r+V;gOC+~j`h4ΚΘqa|6F*6c@\iM9\՞oozdų"m`gôhba†1ąj cLѷPQИrD1J DxkX.:E-aW=S1]%37~n|vp1Y˛+i6(|<Ϡx_'Z%6 _saPRn`K7K鎠$?j2=m}U7ɍM`~l1k14-mc/qejs7u^)M+1?^YB \nɢejF⠃uqKi7ـ𤩹s;x#/ܽDk)c),@7=L ՙ1Es9bD" WioE ' oo;я-51%F(2$80=z>yfM؅srʒA=Y6sT>ؗ܉YE0Wf#[ʿT͎_bMA%ku0nJ_'g># q׬<.ԧاR?;FWLK6e>b W (Ԏ)!ujx%JVbMvS[F)&EGM@њZ:mibޫ(='Jpk(ZZR&+ .]=~6T;R$KB~:h6=Q֯oc nڇ%' ++=bx# NC\{rWw`ug Kq :k|7Hdļjx4\A4l&_NiԺy#ф~$^,1zh`A@%XƥDtnϲWhehT949\&twcw9r9vɱ 9X,R:kr|`1=h-LB'2Sm:MتJO|_!=ԾH6N3|%W%zdӊ22DA&Y(ju,{(ǫ=]Dzz-C6&9O;A#Ȟ, 2ǒ>ғ>IeX7ai'r'گЏ?]dSEbI»MŵlÔfUp^--+D}kcٹT'g_)h\^gY!בcUpѦOla }EY&o'ňJS*}dw>BG; j/8R]r"~_@[o._"m,r `ZO b bv5! ^fbat`,^4^0Uۍ):4eg wO>ug~b/8#0ج;/?@8ؑKД[.CWu)VrS3)a+yk@:tF?L8>c2 '@Rjb$ '|r^}*΀g&)nVMڮ>`:@뙱{4!`z 7ko#/dAw (Kca6z,GJ7෵'2}%vAb.T/]=L bb[7㠷9/ !@ Q')f-3B}nkBX-OO8O4y~0$C^ݱG 4wzşRTH!+䘿纡1!Ú4j mMO}=V_y4P±)o疰KJVl[l+.-_}#64#03E܃,=7z, z 7SւD%9cId,Lf:pX嶶MYQDekUJc: s #)BD\>3k]kq=5h߯X*ڪ|ZLᬬ3{W7ۦw(z7RԒv3`c)OϢN4wKtqo/=mnt槧뼽%sWvv!U ;w4_OGk4_5@m?nA܂&S.-fPs> AR,XCN4&fÆ<~!ϱ'/ɆI/OӐ屌 hu BEq Ha‘ WRALFq7#Vd9qȡGQ3`:zl7#u?:u"Nނi?N/;G;QM;=%S"!WV P?rRZm1O G@Wᙐ[o}ĖlH<"\fJFsԨݺFTɖg߫Zcf%7@8J`sxpVy7@8lʿF5Dt, RJA ҞLtq~F88u55r*zu [;QឮN< q0Z*=;h*!/`^X*X[ EB{7ӽcy8JlS7~+\R`MM%R;( q x\ʐ8A⨀nnǦa7 W}Q%h**Ep zZ.bQ.*s˩@\Ԙd+K\4[, mע;fEh*ڛb7PbwDX퍘>IJm AԜ!,qt34ҽY0 ZRp,\c|ܡ[aCGX*mQBnH&ڿ>1zQ!PT *h"^j'<&W)uhfג7ml !P#j~2[GȚ)Е 0En0-Q??\;C ^jeW6qpo.iAi6/gg*}Պ\*ζZg6h׍kl>CFl<A#)H =BБpQ4xSe߭-|< gowrH9Nߍs>w.[6=X#v6F/3k`Bñ+|x^֢˚xww޽a͝\\o.YQw[<mִw\Tt<ٲC)5ea[7dY,,M"}-we<ҒFY/or/I?̃~7hG_t#=~׍ho}nG-e_n[k8ŭ޹ۛM[gpc8(m٪"U_RjZ[뾥RvnK1jlSNMTf9%y$Y‘ CM[Ɩ =g%ѩE7t;ۯ;IX:&kqp.pWý] X]??mm%"bSc(+/Ujm0MVIlGq=֥;l>'5' 57tH`=mrӵp;CsuA_ ;9Rc&kR|eWoΡ`3+Ml!mYX#;{# RTK]xNJ8|{Wջ$ɹy~u#}Nr!KLVm <ݍ~K{N݈xwNwࣽ_=}{g1.) /[N xٟ+~ZcKd&^}ʳfs݆)W`9]lt%5ԲpȽclc_l'X+7o٩}e-ޑ'kɑ~7c^{2]zrUW]2(xuު7qVm-W"zkgN~[Vx %5:37h-&pw3 ;c6o5&t> utʼ7kx]^r5\8Auf){]>˚i7{-Tr<Οqgw-OWwׯJ;{s0ޖ5WzaYgWNJTE+Y)/oQ6z6ٯ%,+c2ӓ̙(kc h(MԦYL4Pďh>տBRJd]$1߱}Z{ާiEJڧyNGGx kY]WXcihΝo-lEXe \}wp}8>taᠻzހI/oXw+/ A/ҥѠmWE 8̺5̨{0F|^_;~OxT^HzyByBw~bT>w}Q޽jwu~M/ܣWrx;\O2_@b{^=| ]+5 l8 Kqahc޶t8֮pkv0ýWY@n9`+;bDBV 9!Wm3Nѐn,9X66r0[ n,$NfB%4-`rH:w{fntvo{QnhAg:w{TCc+^Ce#w`޶<~k[Cj8~n|g IzhI=C><,uĔ^En䒛6mGT^! 2|?ixzWUaBWthehz!GXIlgbeq5Rg 9"?*I5l8Tx9V{E|[40ozqW?*O[j,n2F|?mrwSضmDm\n: ??ÿ?#$P~՟W{/T],Qmgd+U>B{N-skZnllM+sM Pvl9v47c쀥PucЅ-XP5bm0{d j}݈2o @8xio?o @g}݉'J4#(>wZ(ٜJu ?N'r48B]pL./a1/6MJi,n!`_5g35D۽=e 78\rqXn%ڻxXnAZ]R_sM7`U!ӣby^5[7+sUon/d,!؇ysn`&kO~_{k(1e$Ϝxh?EGȌxS_40qxŏ{sŗ灪M>]M@hFQߧW]k5#GS=ElnHaDc9l<úsD98vLN`c6rJ>dKDh'OS\]k$)Ƞ}sPb,^hU%oiP_Dm>"pN/ye:1mȗr5-k+b_SSN78^==VCUC,!qXqU;eAszot6Ps#%z&v QWHo2Wo9xs7F|BzX5Cɗ3(}o0bKD+Ky| L7?/:W?׌VD9f >|JmX\!Ϡ(U!<~Q>ٰܟ!OXܫ7ҨD4~Z?O' _e^Jiӯ(p{b"Eh041bUZX神<  5zqyosשKboY .Pϧr+{elQT4եȸ_槃}#Ui`? i"OauU`75½FНDe{$|rUg*md|ɺz_7Qqx([tu76_Nr AVEI \y&j:94k3c~!ÿqT[yJ}9oLMmCT D$h,4R8WROՆaupk\ⲴL7*3ݙ)$4­'Q9ca3]^ 15Rcr#( q$wZ~nEm-t17/!b:|#Jp:vG8q^ͣa=|r軥1mߕ3 GZ{f:w{7A ..KџF} 0V,JgcǘkZew(d`ݥAUvb-@VڠH7Ͷ0r,,tcH"0,s)`鎾r~U$dE^Ym+>J[UW)_F4Z2-,R mXW7el+o,u-VB-m(- @(-- 0(-- (,jWE)Xռog ,f<O*w8OR3k]_jW-c&0U" #xPb\2;>TYX\ QEv\i$o෰~''"18I񢻌$]*fHSźBwlt#z4ASP6^(ky*׍ HUXӄz5 >ttxu  Py۠Q<8Rzas-a6$b"8FZqУ@Dbx`4FmX`9怣mAD˄^bq n=IEM^ Iմ{9‰w3>x:ѻ=fG;;i?nvϮwZLܾھm6jov_$*&4*6X*59|Dce.}?δ_⑍벞7_܏ο\fs_kA7G_y'3~u..LrM1dvL(!j{rXtˤ =>޼&;5V/jƢ'-? ~Xs$(յyϜ93g8v@uϊojn2:]׷ŶI:\.acYU]`T!fЂ[P8i= v7t3L*˓'ۻOl*zwǫ^%r J0P`嫹 \Glv cs^{T\.j| R-UPFm{N8N^(Q/Rl9@=%!R0evقcpa;^lA@}M)]aO;[ћ"Yzy6j W 6;]= ySXeY Y撾5# hB3>|*r!6$LU.u @O_h%TxлtONgU!?Q&O1t[4NO5eOVql m< f+80~;CԴ@".S-3R|mWu3b`!vనZCu|,g{bQv~޼|}cc* )vZtV 0 kT1$b*Y8OU#=cnGd豄iJ{6!2SmaD}ʉ\cT}q2e 7l ٚP/oF/gX$k?(&UY@j>pc h[%h2,"5ǟ&pRMPϖUZկ<{bN όD#9O6XPJ 5Hnk7Sv9(z&` \@z4,ir ^C/N&jʹ\ =~I tbSkdfD/`s~ڸQ7e̽g^6-"D_L`۷ׯ@b(SAy_/j1<O犁նjŅvp8[2yw.`Iϩ=Hqb{0>)]3@XƗkCqpo>t}$7W =}?~Fq'I+ 6;w&uP]_u{}+oK0yeK&A[kA\9]#*|I4P=_}CrQ9}+^)wWJRz_Rzt2c#iJtMIz $o&IoM&iOgq&r:?9?eg+ى E{ƯjadTXiX%0ɹr)M4L'Ԏf@U Âhe7Ez `i/Үt2;~ {=Q6lxk7ؤϏU7V4^QDWU;'# ؉L- UW֗jjC^󫗯xSGZ U wow}ջ>&![Sm߀;sH¾,|{_·[{esY\}:ts{he)etEwA.R+'2N'.'xoY %5EOzpEXzU=U×Ȧ:~axQ@ {öfkI]鶾t"VF s(~,\֓Ɵ_eؠMoP\sbF8koyw\J'-詹Oll[\޶=(5bQpdu#$To |rJ;k&^UY5MƜUH=|s{+Saw h%춍aǰfd,5$ . nyH}87w1qFhm0liA,XzS_* G ga69 {{E{5ߕ?QBю"_qo)WoD Dn"e@HS{c.|"ẺÇM0pF}џMe' 'p ef6ɩמN-q pm-ϵTN?Ml=M{;զ7;Q'ہҋaGUX݃)`bys޵9X4egdZF@5-sGC?bm3z"m+ԆU:QRZp a^&tk56uVcר @\Odൃ3=^[5jP*nY&=S뫳ozA:PG2L*fv9ۏ?>{Gɶގ:,nF(*u|qWN}лۍ6Ty٥+p^-w[M|*H= [BnVH0%(.0*=EmHH1f̀7WK,capn];[Q6#2UO[?;lnm1':25"Od*z"UX4X#m1&-M=Z0c lqJ/kflU,w/lGxSI^mԅ}fgN^c9Uy m߀\^GcSd dR/\7nVmX~|J9P*|6= L~'uW7,&mٍce}V_ڼ~M.M!sng޳\J5LotWT!TXSM쿒i8дuIDik)d:ܴ " yA;&]γ5x-n)EZ0TmY,%CؔЌܨmI4' oE -/,%(.:JCXs+-^1iQ+˚|iKmnqK9r"ښUZw$-[LԟT9U!yO[Բ?q۪&9RƟZkզԫ:qnO._'`3{]L|L5N\@m;wӪ\COWiD zosyb6HE?<9؄ra\j<9wZ1ZIڞlohOBMNݰ@ZY=&&f_w~DPTD%|.+[= kl,ψc^y-fG"l.I'~߁<_'/mU䏇;w/Ђ}gw# >^Y L}˩t쀖LbJ-22*!- 6 ]=EuB=,W/yq?4FsP-M?Mpq<˳M;XL  $N Mص+=t0fO_jYWܫ38e޿I>( ICvS^N~ fwN$Sߞ]]|EN2w*_5_rfSBSٗ~ S7yv|MUJ85Z}ߟ` 2w&epG~0Q^/["5o+*{s>l`6^+9 G*pNs9]}xpb߇pT>`hWmBKBq~X,Iw$y%{gI~QKK}$Z݌ZߍQ_ȨaG# i$AhG# }}$;$~?HH}$Ik,4PjIp-PO p8hU1"y^WzD`P{DĊN? k.aSak6BaYeM#wc%*yJc%V>VÍJ7ǽ#dbtхL|PBؖxȉ 93{  ˁ%R `YzN{vb.xRjl}>jX[\*jE@XdA Dr}@} y}@o lԊG@.2 CAA[&ț@>zC C ~?O_3c2)?&i?iTljGUu%] h7'.jzƕA5-HyQ^HzLx9^6z!WՌ\U#MY0G ai.؅O)u *|j}j3~ Wڵ |wu&\^sAf'IghkX{opCdPQ}@loA׉[lxv$ߞCR5CG5A׆'RhXƦB;ld_^h h45W5 -V騤G/3X~5AsוB->;KB2MTnnshq,T+ع~>)N{r<;]NkXx6-N8DCKfrJ2Ž|}|$u jb RI-V Z{~(nW]9Nޢ?NΫAVVb ;aYq/x _7;~myi2%2pjUV;=&kZ/j9L+/8Q(_UC˭h ]ny4$($4H#!NqjSjK'%R4RF/~mG?^A0?T AJh]P,)ZiW:HioV-x9?OAO/4-[R8u=l\)1>TIcxq;!pȝ`F6#ږ_- &i3uAO}/}tV\|0 G bvuLnbhqjǧQk>8ίF vlQDH#)fZCY^^^_0 E%4# (r;{o_T޼Vt9ӶC){g<; /O+^\e"Jtgqh0 6F_*5bz"`z1 ¾a''חojY0sE|\|>%Jh\O/9~* T:.ؼxhAe(ft3ѳh.>aKsvPCyOd.Y8س|ΰt58gC)w a8 c&耊!ҋWeMF!eB!RF(R/CoIԥ4/CJVWK YM%btjQͪ177T`}]YK}[D4C;}2?JDTK)Y4 z&չ`Q$OFaTA #'H,EiץVӠtP[j1Vcb5+R%rZdJ|Ic6$L2A$2e=^(UǙ}TiIB-E{4ԍKE5&eN$ozw"r"i<(T@SraR{xWFi04z_/%OB@ggq2>8%0݅{wal HvS8`_jg!Β4Z)e:4ϰFHA=wz|Qۀf [[`;E ^o_67isV|$bt꽏z>~E-nMj,KmGsVm954~ei hsw_2+_Dosw_vurfqٽP1sWޝ"RN !7#m}?*r#kGV@O{C6,7M7M8l7{$7M2; TI j|:^|i@->Ju.6Nˍ2]"iAHq #wo)im#q}Sfff:Ic鉉.zߍi_7>}xƧ}|{`4ؿnμ;{cIQ4۰Eg +7duWTdnQGUk:puhB*Z&L-Dvcn*pk/?tG鑗35KwQ5QcgϬ8LhmkKmc%|/SYhŠtٳ`n\JOB ErNr$yh޹M(X 4W2?Q%,X/ԇ+2FK txQ2]>ad+f\G9^u.e+ݾb%UMl[}N:xrb<@Jݚ_*uk RhjovVmL]21vP6hbXI-I$z>T]>Ï(UwQ5/7Fu' T qFM8D 4LRc(ԖC '菌Gram0B*,PZu-2.D% ^(Ue}TE$B-,ra$*xY4UQ_d ߘ[2)ERUqՎ FM$*,{\vˮ\:/.(13#*tH02?7uǺu=UJD\+4?>׮[J>,X1.b̢."X$hXM0UAjB fj0mpA]İ/A%b"G1h3=tl?M.̀o0M nl=Vk㸍HdA]DK7wlG'kicÕ/bGbуX AbуX }G.zGUzNj+ŋ+N(=2Mq&-@<Vcz d|6Nz1qvI;do{otrߗ97sYAs?oњxBt?~}@>j̃w ½)>z5N=0+<-MRӫoH1+&mcY Ʋyq+dVg^[!;Be#im=-{⸷8-;wlqio@ RX襁AH*V6;?7>%j mo@KN7e`ā$G57aoo>=~*!::V[p?ؘhjI8co8Γ*e,dK]>ȁ~ q} _//>֯˜tgeo5eՄQBVa?VQXE (5U/f5 _̮6*A`6̧޺XV<[~ ;49PDQM<\:Ķ]"^J,h|UЖB 6wb Bl.u[j Gg`&yAxpaaDKFQ󢑔ެQlrʼO] \(TDzy6YHh h_b1lIT; /D(^( xL"l!P,*RHDstC$ !u(X &aaU{T*&D Mف);h,{0„oT/vQR7 ׇI\SX{(Q%{u<EA\DE,OaB-o(6m=.EK\jjpeP 1zLӡt1zLӡt1zLӡtCC:+Y'Hn qVdz@dC=ƐguT_iosur=_7"$?7޴}oݹNkY;6Yulos4TF6|h~SE4X+֙)v1CĶv@\6w$- +a_]#_{qIt-テrLQ}ÙKE\]9J{߽-LYRnnqKZy--M4+ڱgfɐPXb~fބ5H*ݻ.B$810<] g3:C%ʨܙge=ՙdt9sLJJ8ܮ?C4}ԇ7,MKO@00jCiÝ[ϙ.#ˏ!rs6rkHMŮc_1Noq-]eڏ+6Ib3wXBs~k7u& A%_='X-xK ){5+i굟վr?_ͼ3b`yv_/?6;R=(Jxu|rwڕ?lzzß*<=C3$q W}`Oa6qm0.b.lkD&A{P^4aRWA2ܻǑEalQf(5QcStP|o@2dǃo{N{Wutл\,Mp{4 wI4Uz4v4\k;>V WGCx:8[g9oKO;'s9c!k [m {hu]^L]lio50BiT:ޥ+Ucj դ錐ۼHhLю]O. l AEjЧjKӠT t; m:QiCj1ض$pSvʕ- lQ|0%m{`YS~n8qZ{O?7>{ﻂ=F,ހbӠ? 51Ľ}kg]¬Q[NiZ;z-ZXk7㭍sxfxm  3t:p>g/՗Sπ|.`"y;P\45XCsR;H%JOP#{8bކ?D'[;Mɹ}=q]&?z}A P,ggd?r+m: Zy89MZ+J^! {cͶwg{*^r78VKJ5%:n#Qk_Mcjˬer-521p"Ő_ qԊ8q2`MVC[(i14V-`&mM:%$0F3_ 06ͱis流BdsػPQATeH#J*?~<?>H B}؂JVglqp~I=+v6^D[^Q2떫ufEaY N/e!; vΟZBSY鼏!R֧[ ]Msm]FU@X~BI{) =`6+3 $Ɋ1@0UgW[T`/mk@|JI;_!~ab<>2BGFt=M`Hd[,w޷!Ia{6TQ[F;%qK` ʇ*C'L''sRI/-Gk1T.oNʘ>߇deg_XWYh)AyȜYKvjB W$u(å[WP~16A^N13󫡏V|c@d-M||>ܞvz" 8|?@f-{laж0h66`K$%]bn9c91|xDJFĂ)!VwBm!޶ooM:od7˘,[->Λe'K7"'+ uɯMhym!R@ơ`T@MF0sق5z+s,(iƷO!K/4}RrtCF`uѪ|hr! Q{o [`-XVp!PɴXC:Ӏ K%`7*(Ó{q&tup"F q P!xC?iȎ$U!  CJJf(-\P&]2F&4d2&{ZLjj-x8Qn5ņOn)L"{aT1 )]tTC+ȂAদ;Љc 3gYi(E"=gD9JF*nr65ٓx2We{.1Į#@n`b*Zuj0biVq&F@~+.7YqelV"ף!o /BլӅ?3lT?D,=h6 (CX]D,>5͝^AO|17k.}n!iq,@@!9Zv$c? $> Oxp|g-Z$.F&o${ÐO m;\CWj궥)ugFhBEp.5順(eʉN A5C/b`3 !E|g_cJ\wwQ! m^[5y68#3b,`AIW!8(19yv}?6+xsKx-iDFXAXF\567r_-YF@$Y\0L9-cc<Ɋ%F'l6V' Ge@,$xiXuMӑ_THk~j6p}",YO'J۱ҖQ4H8l&dj]3DZ*,S6H7a17uӘ9d!#4l"\+ݺ.81 " ΃ &zbъA,8-N$"yst6mq=Z}I#6YgzC߱)es9ٜ|sJ?්H+|tg8QP|f%gc 5La}3 B%aXed,Sxk8*0Ј bfX捆h! OL/ýg(KHfM$;!x\bm`۸mڠ`-bb+ݛI{1c݇BX)niKX@X r}_ܶ޿_a;%TVAZ5mrXh7.z![Njx,БK$hO٦[ 8m1%_#&ym]ϋ9^I 05 Pi JXlhz5M۲ɡGUyJУaƖ_9(@5zc@Bu* jQZTZ&sKGbo:s{˒ nƏ(A+nZ=3eki4jtR*"_!2 ï˞-zyE\ =O9p1!%x6PBF$Hr$`|(7; Ec_ !s0¥qBt0.~YnE*`*>Ruf2|,AlK 8`MC J|,>Ǟa-xwe߬wЬ|)D#B+uzЃe~=EG\[ |!{k=Zڭ@-kgL$DRuJΛB%@sze_XJ(}~wP##pW7jzʤQU+U#`0\tI+E%W7耀d;r +aDGe/h*ͭzK#*|pTl+끲TH{`8!JQtpv]#jU*Ar  BEGR+{U:H )G$3k !yP#=d,;ނmNm_q࿕oON6vNLt}Zvq -ALu jבA uk9mZ&Xgؔ/4Sn)J:.[0K/b.򿕦 鹐q"j8b@>>kSzY|-S1q$` Q0G>Ǻ_Kc9适bӧ +%^Zl96+>,Dkt9FrmX[,gxr\ },tLt"kE},wHIAAl P9r Nӂ[X2l&@Kⳝ.=h [-h25L >|` T.0c0S挒߷C'ׅ"kfX"k~ȚK)TB,sTΪ@<(u*GqLjj*eJ-"K}BB"@DDHaH`xs2!Qٛo# F-Y9W')Q%ڇ*^fETN$TN8Q p:bW_K>!rRY{ʹW!}AP:*g.*G+۰tP᨜ )au )9zՐÊ'[l81eŒ OU & WznǵrϠӣ`?z'1O͆@=sRPOY^6ʀtG 2\7h÷ڵH3cl!+_ R; bVy NQ0[[PK jyN3F-_x!LBO_êg;ow'Esv.i\):os&=1T !5J}^uȗJ %ȗ QgRSl{Li@ZEi~h[-ʹž6o}플}6K͢jcXOĂ]5߱EC1!Maܜ*= q}qU ڠ.hZ~V|-9pBG+5]`oKD5HHַTxܵ;Tg0vY@o 'ԮF帍*U'Tl ZV*xxi!i m A%$~Eb9?|N?D0Rir~29[+0ia fKjV < OwS%tdR5\|qʣ vp=crCDtPj#.]Q&Pp4Aݙ׻]uk 6B8̷ T9%OE8s؟!(y( rj܈78x=cW~JU1'S6m-F~6V0B[ ~t|  +O CrV%i*R_mPi `'rp:݀.e~&Ʊ(,+;At509GNUU*Jfq 1 Xg\>{R8q3\g]nW@Lx`~XN FO Av`pA뽊H[b{ &hqc!JaT'~a$ʣN"VAN"Q0s{B=~i&p!Q!rt^') &~PXa;~6@(KUrMN"!la 7Ќ~Y;SBe#@-G4rZ&WOC,02%->p!m<1aNѠ me}%YWčBfB\b\Adzy[L[T@9qM3N䔞!L7EFNvy.qcG/%29(˦_O$p<!v5s@\#$YA4jvE`^_ih.@Y N!RKSa}60z]çՔऌ}ظ2_U8;f5 MtXjv;&J3\os_E[Gse$*6nxkC~,m—fD+Zm뎝:믶uɤ_l_wRvij ?1w[% wľ:{AXߛUJcuv!oAS+-{o'++r LJ%>+:TG]9:4rToJG+GAHy_;(0-]0ײr6@\dc)oX5ʑB F;*VtڥJHVcg(MaÛ r7Tf0vD14ؗ߫uY앹 vint4_= ;xlwO^*}?:?yw]w #9 7xb?,xlU!3XjH .jA“ڐ9pεm|o `cȹٙ 'mI|Ob n9vBojyghA/ c;YG Vk`zqYEF7:|lX,ܣE ~v}MX 7ؾپپ1&'V.K$Sv2_#h;-@;>S|so6TE u*M-佽?\!, b7`7`77` >2bB j'C^fj^%^!I_ ^EWģG8o[~mjo=@[ -x d7:<^Uv/BoB(ILI@ǘOY HVՃU*XX-MĐ+>̞ '^ QV321[m!,@Kb10%,w =XCaC ["p2Ąvxf ǚ`EL},,JX4V/qAy!A8[UK{xw$ .gRmWepЭ-׃;u| p5c8-`rzA .׾t?PwtO.\lp/ stZ~yb/pʥS<^_6 j|?#\ x6^w 7c:m oKB@bv ްT;{X!J;]v؟`&-nKb͝DM|Sy㳋8?yu:N9Es.P~z 7vryJ7As_),rgB iU5$sH1_zSK2LpJwyF{hϬ/,x=<CGC|Rт8](aȍl6~[Q;k5 9=NMoL6%(}9s 7W^u%=-)J:B]/ 5"=+c7$4#j }4 s?&ܪiB@^no+$H[BZrz2N\LR14y=ddKdضIrQzl- j߱y3clK3\R LP'L=\9c\Y^!$"s%ұ\:nٹk 0qm/}(c|=e)cx7f>o4דy2'XǮiE[:ˆ4+ݴx)"iy[7wjZ5FQ*=4V:lEֳ߲NO{E僃}T<9mnONڸ9՗PHLx)vlG^<$ J7<ܷף&$` ~gXv@xdl?KDpqber.y2?4 jLxmr-(s-^ʹTam 9L仿j2ZBC5 Rp bc{Oyb.! A QNiF yY(k ?5[{ xING |wɫ 3"* ?_ghQè DHV1'{;xm;xm;@`pkk5Ir@'=l` j Gjd͜Kx odoy; $ovN 6p 낲 tH~EY\b|YuYhr6(gr6s+T?*r6=C -tѫS6%mh#y %rֽb_2h6qahkݲaEp6-4>PߐS+ ve!̃]hlAv Z;}+XAZo!JIRZ/6>ȝEowi $O2}┭ZOΐd?Ļ :3ˌ9}G*7_:ˊ]pY,#)@Rf#m>m6W:,jb8|KuB@T٬?|9[XMۀp%*p 1:cJf c.s\ WM V6>ߺbޕ?~KDJFtU Hwy*m?Xk }7-YUT-?LsTOǹid~7guuM9Bj[KmMkIϲ)2e;LL^&k4xq4**X UwUPNV\aNRLj2xHbWp3,*TwqAVx>s+ iULBUet҇ɦ L1F=(kN k]$ΎiB8XKOk}~a}jע?UhVZUzj\7ԸWSԸ񰡼Mc܊;*c-ո}[KQͪqc=5njոR'(qӰI5Ӵ:kIDXj2nnݛ{hz\;)YpOiyKva 1~akcœQdxN?ND8WhDVTWh 2.҇ IJδkoKQ$=m>hlmzU:^8֑IvQSrQǥݟY>xȷ<a"b!gb9kuWp&1{a) SD>7IK]pnki@杏7ƽp#ȅ=a}湚L+V,`Mq&"0Ƌ;_m'#ا5Wo˦>0{Ƚ Qm0*w3'"xAcNd^or2fVz*%"!8ٌ<=HA7#fRlNـV|hVѴ#s.؄q% Iքa|glq{=NF)U";W A? s~G{A{݋uT1mb w# j"8GG0ZɱYM]K IqY4f$& II<q .c 9 OfVTg5L 1mZLᶢz DTVf jk-N8NYREC: T|6^`-.pf}-v5~L48 M!,)־'kړrȿ⳵(Ga#dJ߀8uRl^尔SKD?zs஌: 0A56 Te`#)B\JԹJ.4"r,iaccuG T!|lh\q5_!cR 4n&/5Sr(BHDnj8ԩrw*6kEN+qQ#v Y{͞jUlhF % >0@LQiWcQf5.rZ4p7ȬRV"I4)nJ'-8D8Ȋ@֦:or]  a6)eeZЍ">*0;-0r dqCN-S67)dr8vVP a\Tߔ`(nM; +%2_|9ꞇȔLo蛘k ʤ(-k :NUBhtH@pbK΂pAP3qE5P*Hu-8CW**--]#9#Mje{#xyJu0N"Y_l2l"Uj ́_^ i|&yUPzm\@X9ckg3p:`LHFZnh܉Aac#dSdڦƲbj8(Cg$+F5i1 Ft Zb ~}*ùH`J:z}`to;^#승|`*=n1hEO`ŬCP q8[,/#yvQ^7A g2곹1uwW A! ::bVt5 B(U6 ._|4U1rFBЂF'J~Qy6hNpJ5*T"U~zl1b!d,kR6>'TTV`J2v.Z™ &/`Z*U #*?}g$ Q@OYX}xݏpqh2tIeg#ɾ#mj8ۺk.t펌=^Y a^ q\7jqLo=l\]z}r^kwMn++vxeM\)R^rF1F,TUU06s )+g"e?`F/YhWp1Jv%Fh4o*$ʬz5nuVw#M6c_טr psS?Բue<eP@竘  ᬮ#SdcWrܕ0p8){{#EkSKePv2 "<>(BC|@qK d>?%)֟lf-Q?{ll?V뼣J?ڄ{_!mM]v1W.XO;S. Z.{`#yE klmت#l|zz<"ׂVI[AAz'ۑs"I>GArXY8Ba` ԅy hRWDÞ#yܧLųVDI;œbW-M%hgVhY_-{ĺOx܁)Tom6vgigЎS&2YטlLѮhzMj-v9n ,?*PsR_wMyNxv!U:'YJp}G4N"}rIҨ}]}ETV]/ E) u*)ʣ5fƠ$I x7IN so:K:Zth2yy-HP#@!8B !0B V!7B t(#`Im9yl/M=ki3{WiFA#qVH׿=]S 65|o|K|b{ e3Qg5 ^>l֗_$3WH; ^^)}3!={DCRhbFQwmKJqg)aTէsqykW|WȾ" s_q/|)G>~Ư"uL5WgCuGtu];>SVEo'|eh36%2pd^;i2 /vÀg#J_<ء{2oޅLJj~Ⱥ!4ˉzQrVȘ8gI͉660*&Qj{Hvhk9]wjM!!TkUPkNS֞VO33hiyjA.#4/Ptfd JDJpubIy)Lz3g8` bTT\wbpR)#Ρlm]FH?G519*s1/;oHMUWwI iT2,%G"2aJߥowΆ "ןOdW6doQIs2O8&-TayڢT,J{b9 r#'Af;5^ 蝭X(*U25G焅kjQWv뚲bcW笍iLWg/y1]_@#,.⇿\&s0f}6]_\rU>a=O\ΈPltH#,ch suzX!CB;2REV;}u:MƗlG?qq3&x* E?b3]`!lf9(otWſTj_.U!]U6Ʉ﹟C4 ҁSϿIUkgdGbԪ t hU,h?9iRE;KTOKKw("@'MMp;T(,Ni,yc7Ygq|z+ _Q"G{bflbk'zuk9Sw[r^8plG j.G ]I~l] ν/^}lMw{(܂zH=5"~ȅ$y6>RXVܸyi4Pغ@\TۻX>jjRh y#=΋ V[Z,S4l=ll +[uBKo#7T_Eh&jV4Nׁj]Gٷn4Tcj)j̀D( Hmt5 (q%5q]7)(sWpkɓ0 *¸멊&7∬GgFl JAhf 3u*ϛS[}Րb'/3_8$wmAPUJOU'NapH- ԅr%Zse8-܎)"x|=IKJau%YA?XlZ?å^&n|cXV7b%8ygA*ʌ+{MSGơ~n(^VzV $2ǭ.&q jy=HAѬ'cW'_6?'bGM7/ 펜:#A "=Oꙣ9C8>'NL:z*+\3p͎ XQ(#B]-<)2&YVF *-xɡ]AJVzBQZ$ДKCQ:(,-WEԻ@0{3ƶ⑭AE GO̾DG`ZtQ@ZUViMH2 KH3۟wt1ōjs&vr I)JLƿip={F`\&QC|wQiT-EpJXVTFϞ%Fr=N +ڜ՗hwX4$!88C5g.oৢG}8P*Q!TJ!@FH@&޿_as-o;n.=vi8=5ޗBq qU; V٪6::iB&A{z}˦n1Og D <gk<ȶX# 'e\h g= ȦJ%zR?҃$Ru~80ۍa!-!NNe^?7R4x%~ZcbJ{st' /ct4rB$LUtPd_:;: rǺp8hs>/OwPmep_ ?MZ+]a:D)3Ma6almac6xa$/A}2yi3Ew(1dkwG6,sXV/5)õy ϙ^24Qm(8 ]hq h<2"t;ܘ\`O ( AqG3n}Yǭq .B8IX=K/.Hs6Ӕk]bȋInODG", l|[rk%0!!h "p0l«qw1&nF ފ'r;VfRY(uUHFEddS6!38|!kL?Kˊ3HfzqAʉnG*!tsm0Ψ3"Bs e1O̫FZI Q~gƴBƀ%;gLW ҍ#4BQԏ_ ={gpb0?̧]Vb /"%r[gh,JI}5&]*z$W^G}}EbB &1} #5liCJӼShY/WUԵuܔ5~ZafiB*iA~WsC< L۰WN[Jr!VūMm1RjyF1鼏7ȾRc) ]-O(&Ym*jvfܕg‘w=^K|^]Uh n)|bsUKOvyZ*cNMp#u×Giq-o-]Ș k}]:ڝS:;w}\O&[_!z]iꍗhkU[^֍V٪ZN6:1ma+7lcm a5lsm]kulzt7vrr6kۦѶ5۶Z֌=OBQ{342R̼e}fμ60fށ>F>̼%ͭ[_1zz^w!Zp}v׮u]kk}vmӮuq{^lLkX]F6vmlֆݬ 6i:Vguͼ̼+7msmM\i+5 a"(=z5P@Jɕ>3208:8? |,}P6wY(JFbLb YsV`-m)H?&y*i.Cy0ϋ2TYp1@yS-H ..7}Gce}<GW|h{69byJ`o@8.m[ibH@!pߦCjiB':6Sj~]^NQ`cUXilr]եgM{w0 1)S6NW1Ll}?gB|qh(%z&Emg25.S6]r>fxxp*jMe)`?5ZV stG[Q!@٪lGR1@LM+z9AȚN_MFW,FB}ePoSnЗOym|bMuH5lJcP[?.KLw{Po7U'c'jOo7S f_.śzu@!7%|F.H/1"wXYKbȘx+|grɃXKdJ- 7@ML5e̓@K$Ķc1!\DOZ՚Б)iW3Dk'J" ld!<TSp٘2)07׫Ts$꼑*@!HڠoFY*jb ޸0a,@lC^( V3ӱTx=l1d${@=R|YwL2e8n1t d|$l}N>=2=!}ۆܸ ?5^4"؉e17<^glHvRF|D`bV/ |;}]UH4FjLyh'J~$>J5*T"*(Kl4°b(B{]F5tx">s*pTIY%.Z\F.GR^=8Ӱ*BBA108<7nFeg#psg|-j5{},O*wP?<q c{eli2 =,[o5 a-ͤ5A"LpKaz,ggD85!aC6d*G7 ${nn[8<: !*'=ܜ!XU 6"B(}?%W<܃QY )р P RBy@hgh ԕj2|25FۈyX(sILL?ZD%q! Z%ݸ)}Α;,xc @YX#䋂ɁQ|UE=ݿȟI"Q:3LNvy. Dvы`>%O,hUb@x7oOd@mdmj OHlp?؀ Aw 6Wqb Jo/ S0A8ܤAOJ0! Q}@!1"E+RlWx \&'$0+% sGTXFO}SG 5Uj>m pAjK8=\ QY)+ɹ/ DO:G| kQ;;A;'A"l: _w`}#@y.$ƈ ,{ Of >g>7 <9..1|zѨexEkh~d]&\Kq/\0=P@S_ FEl{`Ziu8k1 X_O`!M; `nI{nPl*z=EC gm  DdVqe9րAppgTNKs!j@(!\ɬ"iqs&%ar/DDW8=3yde!IX"қҍ&e)'jEmV;o~[lUX=}oeZhfJTxPCRowۧ,6y3 !ON,ĢMW`,䎄FQnikhj E0]lwҡ%”C* H á>ogk>M,)^]R:(OVs!y*b(<ȝ:A͈q?,$:5-\  W|B-)ĥ_u%mGj̏Ǯ31Uq9?<H%Cb-vA-&p"Y@QhOǹiоd"5OufI9&E[KxMk^ϲ)l8F*:9`B~0x:5A t?q +AWf<^uQO+Z35Ҍ@C˚Ƀ8J;u+BWkͣ!5P4ˬFCޟ2Wkz,R楨U+.;Lܛܻk-t$,f /b+R]Q'G2AS%مR cuh+!@ZOeJ0-K*8\gu뮨yDyݥGvL1Ǭ\j(RѕQbM DE=`6,*:]ktt=G%UM{+jҕ!b-]sJIgYt+ځkZ\a'rf5fq.7Kըp3Gf+LL$s$MZےFG 3--VQf,BZzV\ |~칫s˺lbKgʘq,nƙ:xZq(i{,ԅle5aYj24KDK x ~g/͖k`Yui6XqiR-}0xV~R!-iU7٪}R9{$ShJPϹ/Q;4N#Y]"Rd]ͦl'HP'9?i&I57Ma]K4 Q触G\# 6&o":†*bc hѨ<5[op,cV* vvף"A:a*4_qqxocddۿhFؿ}wGvݔ:p VEa!o^h~FK3FKջľ,́pE=1ְ2Gf2dҪIK})X.-ԄVo9sW5 6?K'Τdi&]R!~8ڙrv~X۲8 qkY~;CQ>-{|2/7:t񵂯aA?pd8hG&GCU,hKn.<hC7e/ފ ˔X|ڍÀy0ȇv;惗v hTTvl*;hڻmlPYTe *NUARe+Ya4ۃFe#[UBgXc3vB+JU9̥Һ '6p(xS~P}KlhOU8F#KRnjU޲77Z8 雞'q0_?88嫰Ѣۮ^D[^Q|)E<֖.Z-jl䍀ۦB {PR_Udi@5]P*KW_8#8nƉ=}ud:wVckFWOQ ;VuR@aϢJX:VK].U}N;2" x}'C7 ѵ] c80G?Nz_߿gut693˒}Jis 4"]PPV!h:Wޗɧ<`:.I1 qb uPqS pu-y%9vJvvГUHU۞\ANK8UncjzvU糤=Rev]VY]j?ƚaip~6>xjZ_'jCob|-#ĻX\B0pPiF;T~p"bxo2 e# 3x?߳/Vn s< ^\/`FKl~)9bt s \I%$1e1kҘ84d&%Hji-_xe3 (xq@@.eط;֏hL8|~C@uGWSZgN4πJwbxY좣@,h|~03X4f`Tu;d_B9xI ]fO$RT(xѧaxdDٳ]BO {8rF 7G& F83qDCeO@:[z6"OPF'eVQKVp2b59FhS6歩}1EL!0I͹2b"9Icdۣ,Kq fg~ u¡vDf. V@ YfD_$ʃc % 8wU >PHť Cf9PǬpw>LvO F 9Tl.{UZ+nM_0<Ǐ\Hu(`Lbio ;eg! Wp6+JшmY^]N&K;CQG UXA+ΆlX PXojB\^p/2:vb+Gre#YH'&Rmdm21sj3hs!V˧lLQ#~1g-.U8]q`cpDսBU(YGdl{$ty8^08/fLdC_X!Zo^T*^dJtT*2}`DZTZqG߳ HB(a0l$#::nJrgz==bXJaUB5sLV-of PQGʎr˜WpW\*EA tŔEGvV*9K<4 C^~6b#!Viԡ-a]E'vpzwS4w_`5{*ʥtN;`T3yXTi;p{yB(HR-({/-jvKG}K/EB< bmG%NrW?]- Nzyv%o׆4^hFB'9O"@Tz:˳4ٗ$uHT7M?AhtAhfd ";=h+bSp+-U1ؓz'S `!+ ؙ$dT5eTlduM,Y)y첻I KBB\9&O_.vlQtRR$W-[ˇJS$9*oA[" b0L x+o6h>Qx\RG{zYA% UcpcU:iGIKHЄm(I%U>) Jg+EjivqlY!(5Оz\xox2,QQ\Ӯ1) pR|MyDl.} ډ$(BgC)l@KؠX @!B$A܌:$UmWJ [8t$M1w;ʯM'oVni.~6\ʝvz,xQ]ӡ` d4<18?hap܆M< f#a‡an(),!H\z/s_|_ѕ`za1 kkPzZ&%x^Ѧ)%|t L4YP9;{ej>xD50P4oq5c׬HKG9ơA&<[9^R4xq [/@x`tAht~,vZIݷ^Ud=|ta# WG~4ˊhy|'rcweTX1Si4^w.N;o=3JՇ3oNuCxߗwd*{' _ɑF:˪\keDᨄYлxeԏ_kAvwQy=/w Yq&vN| ۮep 3c@Kj}3+}`ɼR6z9~˘q\k`9"-8gI͉xXbèa#5G۝8Tst9Z=m&mǚwwlD?ԥԼx dٕYq.35k ې֫h#Hyf * S_ } ЙP)WA_bTt`=魔wwd|?!͜L~2qf.ەYeeb/=3j^R:~'L&<UbőA*M6a\7Q)#E4s +D[90wtPFF9?DAHM+^)F2$ J=z/nڡ̸v&zEG2wFʐ2TJ 8,+Zs9Q0}.V蛃CKUܹ&l*9ӭdbw6/ PpVp/Yj C Z`.taXuϧ+zt C&# ]!^ս m4y-^Fzgf#N s3uū2>{/LӦH,:A*eRz?ZKUHM2{|o x)yԧUkg4O~A{ 6aboe$aFD4j;KTO L~ʐ:*r ^ЌWH]Ӿ=6p38( &?:+^{g2W3fL? i۽b rvHC^^.ۮ?/ 4>x=B Jg8dkdxsy=̷a6a|. 8 ~I`lp$}X?DH>VU'ˑ7(eF 3 > :hť/KXbrYH!.tgT2x .rDTӀ=~IK3Ç~iE[>n ioл7^ݤkG'$-yUA~:u#Mm9:(,&%bHg앸fîX u/:Ƀ*~\ń+ X2UjyP ޓY^1='Y^2d:Wƒh49!S,ʁ1m }z4A3Q2mam+D^,+ϱa\ɍ>?"Nn}ҁ(v]"'cS en$=r,&_wNKiǾG6GKRҍل/4D}>jxzR^nq[EX'I~!N(,5"@9 ? RŴ9(LR;D!п"YIYCQo}`8]ƒDkp$(vfW!#ej XB8F|@֍p3y?@NOKiZWu YpR8CKxꪌ"'(#~: C?4qbFa80)'A!paTR 6Dž; Οq7Uyh,9.mm$)аLAZ (!c(9V2L;ĭrXYɻXmYD"ی吱ENY[5Z˂NڊqYhtAJNOPې[tDIX V'Ic8x9ǚ[ZkC#Z-F43q8\gk#͐z~q2?[1uE?JRYz_Fk#2N\xvS$ j =/L7;yE"QGXޏ1؜G&qf,&& Q@O .Nk=606-ǻA(Ԥ۰;S_ ڇ'JpKy:uϿYʨDqh*hj0%ܷݍa ]ͻ|}b'9Mx(#j u;>MC胙ևG j`GWNy+A3@\26izr)&%sw/oe !X`ɾ70x`+mww5#хzLZ0-!'_ *ÂjlPTutzv91'h~Z-s6T_gɣdt5_Z''xjċ 6K w۫$PMCm f#hYu΅\0v~^HA- }mلm,dJC8rq^;[!l-QWḹc6#I]jZ_uy*PDA/Ga"揫-ZeW0]{9|xlRLqoRG `M] ơH (%KQF)$m,{!H'Li\qBt;\;w"e3o_t.$?E%s}2x/I\@A=~eK\%#ȫ8tk$9Gij kbz0J<A!?:ˆ{_?‚ڤ/PmFT J_sx1͝15t0W[~lo};ؼK[o$?I^ ݼ@ l `%̄;ؠlxr$LХ`OIZ*g9VtVW b`) = '` c<2cMta% `("0n 3A.LUd))XpvMp<98)`n蠘YVK)sX`i14 [!?loCǼO[`xky@j0&OHVpa9]Jhym{_^qY3L՝0e7#xwtNYu>A=ͳLy$a+zC#Aܫ .~UԁP|ŠN30r[uo|d2_wAC'~ZwOLtnc M/iM)r ^mA<5ا<ذkUj78k\RÇZ5sU=ݣ~A?~GfwO 0J/O;Hh>ϯӖRA>ˤ>緓W;H>e_eLCV;G%'_Wvi>}~kϯb jSH9H>j?Z>|~ߖϯCX>4}__w,&0 We_,X%O=+97ˤh@9d9#f62wwPu+:zgޚs22 eu:n~N?'RՎ}n;؞8ō}ַwC^"r'Y"3y=oև]{ .ۀTKz;e N;X$6DȎXl?[gq)E$Ss}b' UZty%d)n]hfE|2lzI*T5kM6Gyp5]MFeYΎocAM?U /,~)@jFYTcCo!Ŗ-V: g z83VnW:rE䲌C9Ku$4#![M5ԗ{ѱuqwVoVwl@}/o:{ 3sLƓQxse82.f~26'v!- q^ATxS7?`|V,C6wkL7"Hi7x@˴S|¾~|5^LYه>>?a?Aj\?f^)}Y}SkH@-(h6#>2*/ DFg=Zu||1Sbxw7z] eN;t.qb2bY5k(kŮAT*KQ^Fv/R*G@;c8WMs&q4G/Hw{}6X?7`oq[ݞ>;ߟ䤍_Ŧu{1PG¦rkRg{0~I,l,'NK` `"Yvޫ|YiIk\ٓ,Gm $8=EoZg Jy. uɰΊ!YV| |M|^ dO?N/ ^xkY~yg-DP;n@M>H/D'`C1x RHu}Wye ([O,SWԛS5SK42`0.BtiW$vϳA \2mF5Z&poq9[5 Nx K3Ȉs3;3ˌ*>9uy9ec 0/AtlVlY[?lnn gcaz< B,`Ϸ.kB s6ژWL943GnM?; NшDѵt-9,vd 7'8˶br8}-KW™8F.R{IEX7՝)!mnģtpo_twfo=>i漽$rbkZfan$2MU>Όwh~!6xo5gP~B§‘Qo2ĥMnsa :w-5(pXy?vN و jP'TťnR9/t~>ߍra}-=>o@"d$ G*!] I]wGSKP cDk^pꇾʹB[FE ׅ di_u^yXy?gD-oW @d>gnyܫhڍWh(OOޣy'n%vL@XkZ# 7F)bKt+AqzaR|rN %'Z}m]Wse~tOe_QK Y/y18A;*1̪E=Bc屧]8\OGd4sQ{EQ7ًdCmX:Ki%c+0{ʝ#kfER[*up9^Q 5t0yJ?Mt%9}3KʉT6)L_oPkZhw~M-f1B'L/V6xqYG}#!}qLe!vMWDvK3J&/k& m Jje biZFe\|dZ;^\;Xq;}/1?8sJ᭛ }TB EѼT;jzk}g=`?T u[l,S|r^aN&QuϤzT׎@#=Y[+Ii#{?|:4gおv7ӯ:Dm_iiU^wڪjԧ mkj]F8Gj6C<70IuI35ݙͼJ7eC~+rn,@1Q z\yl+oEvXaہ~+J2al{.Wђ0U2i¦f݌~HVtaMq7p,1uOZL؈}xg9m>۲D/LkS`˧Yv()2DT[Aq1Be$^ Y:q&-@4 "| ntf:e:AFV"ITOTDC7X,( hbD{W VI, мyh|vopFMՙFܙ9Y2 ;3#j$˸?zRY}ǣꇘ"S MM l1QG?/n{Q6Zlnұ>P`_ٲA V]Z"nXzƬJj0'_ NVgD@w. ϒ4$inlUчVkb0NIUc'Nb93b~P w1]?z81 ڷ Y ZzRB9tY[gDd wGd9|ȕf ?9!Ɓ1'0CBF/4Г` 7}5T[h&vˡ6h5"(;dhDۭWt~wXٚ8G:Hk2 D";m @{Wish:_ ^\/y`0c Z:̓匟q 9BgK1?fI/!Y/.Y^ƌ!4)G"2J-Hic>I0Q9#vOhY)lj<5(E/jN;)Zn> lyO5.U@PM`"q 'Ye*(u eQ@]TqOh-=q \Є? "h'iIST(Ga#aʀy z{6nP?nqtXqGPj)T(j2ւ!GwA%˧h ʿo<ԳQa6ep2j/D( *M_ĹҔ{"4x̃!qxXtM#g3B\[1H˄@|BAYB^N?!@,Իc<& N"9nY\,NKj{V!.9|K\#a=P1l^{@\>*+>pO<0Δ@O<E|('MYp$EnYE1I }2訂WC\΃vGN 냟Tо1 Ar%fmA? S1rxY +Q!TJ\QR X'eT=H*Yb{FGGu?ލXiBo_LgS81e3\QztTaHëG>*- 5c&*8〦z<Q"VJL 7bco>jFD]z}r^kwšCB<[+"M⚇/I$$ǥI b$I!$EYBA\cSi%mJ PrC1 v>S}p3bQwmM1"곔Ic{N0xݹ8r+>dZꆹ/ߗwa~j}#Zt: +w#q>o.{{v _DryL8MɫL8O˔@fxЭ5pOgW(#@m&GGdV|+B`j`_RLp JYddnd|ɶ?7}g^X/(.9k;;&ˀpP*`}T߯#~TtQeRGP$~J||3LH6OO?&}V_^Cj6ćM2j 6٠3ҡ@H4;KTOEN4GIJVd/ ^Ӿ=683]3a[ٙ\3M|r&U~4CA13Z,g(F<셍^b?dA^m47t e#PKr-.0ByP3-zҽ]q3ߪDwG/PdX.) 4s T&Jw@i ޵׳&ϣɿsknRi==`AxȾNx%J59fo({l<ǚ+΍qu5AMjW+Խdjw5pGFDh?_}Tx&<ْ}YNǩ5|?(ZI~UFNh8V<ذwXa{ћ_ ^{8<(%ĔO(4dͶq~8FӆUU*dbow͈.]` NjE]i\kmo/ˣYsm~Ad* j f4Ӵz*u ܎ɿ0 WsM[5rfb=mi uA۱̠S)]'Tz Y#m!jB>nn$u7AAF5bg'>*\"$0ƅ!+ʇ`b2%J3P+Rŏ=rpa86)glg!.>}+OE' Kj Q1y` ~Ƀ{\ < 6ytf 2";/<d4GՌ\ | Py B- 2Ty.Ɉ*m{D6 GHr)drLel̂p\01x2a-8O(![=Co9\{Ճ s6@N()94>kx.z4icy vD6$;,QfKFvr8#"2YL'=E;: E-H$yNѫ:Suޘe6='AZ*9iOǹiɲdR32uI9yߢ_o$,d[Zr``~$6@ 1 v1a!ΪqΪQU>~V "|rmr^WT`G쑙Um d"dirP+{/xC7EX/9Tdk9dVў FЬ y/5^lPNBהcM^B[}("RA_ډ0?&]-KxeqͲMʷS%]٦[*FQ~ݝ{bD&}Bµc)K6p!-yIu&ϵ.fp!mn8MQ#:`QTZo]1$zVkbmʭAc.:5bc;@iBl9مf=ξF9 lO?=z9:1;p gyF' =ئ 'S g(T ?JJ7YA-Ŏ->ó;SzQmyENF[IKjû^KZP e%oĘ?-LoMB47,|R0"N ih}j2kE]CϺؤpơO-h(Vof5x |uj&`$5 X[P{ؚ ~0* C}NO"('e,|2PVp 6/I3݇qoeDO{YhZߨfϝ'|> ʹ퍠icG @22u' S^X$f[ᝧwܯj΍9}K¬1N\1݆wBh jS FoM-Z[wGp}j(ӛy.خ|1a~b%g, &U O?.OEa'TC4*Q!TJ`xb3mIcW @C5PMY%N۵Fq0ڍ^[lEg&A{z}LbP @ ym]ϋ^ZV˅7^]φW_G8&hbtv™ FZy6^'!v阵d'L7⊠[?@T5fֻ̋ 1BW\* RT :lh.Q_ybQIBvRPc,$a%c65Ig_5(%Jv[->Bx@[$i.!Tvv)ˮV>,`;*DOC!+J2P^@Dv?g4JVAb3X$NC'VUxa>_K4]*+i,jL-fV>kO'73 Ϭ;3I8;+g*8+{gvz tD-ytuO L89ϳ"I1G~}o )EN kUk@"Hds;?6:2uOTwN)]KAy?(R7.^[@Jh^+FW˞?1 Cࠜq~d0. qJD.ˠc ].pp!K[& +V>cFm>ǣ&+يz5xE" ""';`[*d H}K~pw?NuLWgCu8,_kAvǷ?oޞ]v[>Pߊ3(-'fL Y~dfٗY^uCydr) T4ˉ8c%5'`XQƺa#5G۝8Tst9Z>~hwrfp#VvQ yZkJAP(7KATl"4LP(Kh%CGe[o_uX0eT.)F_/b8zQ{Q#@X g'<?pe6crb7!Q+zVt(B,#:L{!)W2"REVǻ,Ug2D`ʓ  /co_t6/'&ьa/p aaz0aӉ Y{eBXƮJ5Mn-*&2z`1iߦ%a?Sk>옦d[#VL寂#A7˯- O ͰaA2 -r 9&*nc1 [-t 1Omc1[|1[-v;fc4P4ˬFCޟ2Wkz,R-OKsA1~-P~a~-q~". [eeT?ľO)MvE=Q252N|UsYGkb'T[1{=E`9!u l Ĵb1m@L[ Gb PC_(ON 4H&0>Pjk232SlCƫy Ljb2UL(uԿN7d}$* 6hߴZވRV4v _g?lDaGj@J*$RT/ "fBc#ymJ`cIh d{(UezJ-.}5"dV`+U|U&oc4wjJ%Mܯ)ڔHFw{9-s:=fϡ49tt?Wt?Kꑏ߃k@U9vXUu@U2g\eӵ Z&UTlj u]B]9R.=Ld:PV/UY_O͆a~S)&>F`+G .r}7,7b)Q5{}E"LV& i&m\S6oU*6W^F(?>1Jhڏ_O@ 6$I_Pyͦ%-׆b? )cgp9kabD̲.vx:կ<>Nq}HDŽ V_AZT8\{je$+/N؁+] .C2'TDɝU] A Ko7hK@,7odiwFQGT@:S9b8C%+ 9_(%>clHTnOsp,ȆVQ=;=nO LW B # o XYSڴgVP+C=slu8[='?D~!QB+WR{Ԍ<Ϯ` gg0D{-kClE4X:e#-Em!zlȖ-ȳq;M5;o]}U՗;&PecLoq ]yldvS<` ]Zn3g9" Pv#+-wU[WIܘ}ND%5hb OLGq]v-9;|P#2O7v9 wP'#*{cIǻRFplso\nE[$QBnƌ02d,"Qξ;-:`ҍxĆ|͸xm;Mf6HޭDr l%6.a[*^N4%Z+vz|~ ,-x=2qgv=C[d$-j3ciSSYCj+uRma`Q=hNtk'$ډjL  ۰n:CjFL&Dlܚ5rFk! 4[ݒN^7>Ȇ.]hth1CZm6dpK0x~D>2>#{S?U~>/m7TOu ѳrТn{Cxm]l8$R[e`9𢡄ehV7TxfKwWu5AǾH}tt`0-(EqKo=:TW?fc\6`< lMo}^9hjG@~Q (vW~+RJPl}96n_#ގWggބOqo"h/f{Gu~J8trs;7k ~FOl;=:Do#Mv"gX^îu,5l,vSN:C+ U8Wh͚WTp\UVT8x?YoKv5A"XѮnY_nm 4j.^n@sd(XBaYk{Xh pe~ehLӻ}R%ܩ YCM&#>W# _:z ,Rf XOڢ0FO{ZEKH d2'/G᠀gt tR]LPb_hb:ae-zf[ /l + kO Xz*V :8&!X5M,P4oQB\y=xb0sQ x|s7_/Bz~ZE[)̐:Țn@eXW/6KX8/ЧCn]ޒ >ZKBz\kx&> 4"ܢR*Bם|+\Wp2$.6?ozm5.HH+"@,jqk~VؒȮ+U0}k8!s82~vS:jECeS0mыs ` 8SϸCJǮ bŲI)Er9X`J H #x+ #b "/ٜ2Ek?T7 c79:ᩱ犼2UV'e0lk[VtuVjߏ[Ԉ.+@kᕶhk wp1H65@5@$[Lb/Ôipd8^h&dI\J J \ fZIBqaR90zl9:C \:' C.81Չ?W$!_.>ao.T™\z:MݗڙY<n!o011sz' ߾6bq,& weȝrl;sD/+kB7dĨsB**A#8K5l%ԭSq!h ho X8c"$2S"v.Α2wq  B9(Ul0d[},S+=>aƷxY*&11fpQCdx|ؿz?+IvW<+ /:-4hfִcM3ɦG)OWoQ g;oy`Cy+;< qhVHѾL08eG*YfiZ5!yG/3#_+n4#ƿ<{ cCޗ@L ;7^3}. Bx$}~\ 磍;=:,R]˓L.pOBtPM?ȁ}y9^E9ZQ\27? #`ں׈VMuփS#W\wwO8a!-nx$4 {߈4|Q4 JC!X}rv#J~m}loK5xftAFxz$&] K&R}Ŝf^W5+W%ѤԧV|goۻelgJ[߲=y M?Lת͸XMR C4q Ş隽r7bkboXbobB2fr_Is-r>m{[7a,S6YlcnoL{E:a,^ bijx3,4Eߜ+sVpVfn|Y. :WD֌fDzXw;! Gv%U YGe0NZ2(1''a=P %0*a *<<(2::rYnY+J55'޳'%l8Wm%;[(b[蛱<]b+yM XBդ0WLuVat3S;9([%gYeઌ&d8쬘n+aiʾS.?w2/,;VFM(vO-lVQ5̒F4klMDzk>9A;l57oMeGjX#9eo;th箬nk zҏFQ#<l@-5׃ݠ+2k#/^1ug!4Ce(zzæ06~b7F-4|) )Bpr٢H^Jq{ol#qi;V޼==ME5_lߖxm&>.7d%;lJWlk||zGʒ~e??$^ַg> }+ ?p(o`Tk&&6*hJ p&9Ÿ(AYb+h!2?)pa<l9[wQw>S7<@:=1O%.z!\l|&+g'EM`pl'R/g/Neh/zZa I`ScK|,[Q;Fr"m+,R#n%Gz_V ċ&.>%^GrOjxg%䋯T֏wr #2\%DUEغ.]Ua7霄ՕGt!b3}iWHbʮrBl)3}GAQy4JT{6I2 yx3b|ͭh/iCXJe[<"*pe{:lu|5,>:JJ* Xċ w&e!_[}rZhPjB?Y~%w+hH351==Ng$SקgiI1%ZE>nO1n]B[ƭe?XZNѕ,z#n$ܓACNC<򿣰K)B AAqu^"yy=~U+Ɖt&׫(L҉+ nyuꁴA^- V~魒R"jYmPMKHS!Nbq荮F&o08ܴ c1r]RL!Y`p}-HkZIT+Yݟ5Y zg}l#V8Th[ld""aH^.Q)o:QRRs6/exu;WX>I vk(955W4t%FFQġ8j6cB?P_M< gjҲ8$W21Ѻ5*.'vƟX#!h.LF=w%Ua{46H|Bl/( \0%Ōlp=xaP,-ϗ󍧆z2Fw ".36찝*Am#ohȯ5V!W1F]!]~RmĂϹOcpL]Ÿr9[=aL?j_a/${ >h ':='OJ-WQ} ĺ:(+vi BeZk5VĆڴǚ3opg'[?xEbLLq5!?1/2vإ ClMԭ5ᆬ %Jh1)_@2ƚ6@ sNe xSqv2X|wǤ<lɐ; Jas[z׾j_2k6fU}҈Y-,,X XK$Se[QqXr0#Cv.,P[bI`Ʉgzд9|;UeprL9W bFomt\06ߎףVyBFn?0UZ|!+y%2N xz'hH.H|s[e8AUǓ9qATG(} ˀFF '墖ܱP?noiA&z@d!aH"@f2i?{cyu(D!_pƋC,XkV^FUg10:gux&=,& A-SODDz>T3xAX[p(`)~'(3D&_=eڎ^eHkxD6|FDKt*# #\01Z)Z }- a,6T[N fR)nˇXt)^}]0XI3P"7<syGȃv2JA-^ ]0}ٔV~<a(1UJAZCaD鱓YZcC_>&[_B@ }6m+By/BټLtCs\u1J\Wm-K +'\Ym.{ 7[dGP)I%`<o6'M'_n7c&Vчƕ0ePOy! [&9-y i@~Ԏp*'ӻd[<[B@ F1.+u)Q;#:&63ΗBLF"0>剑IRk`aY1$琧¤u(y C0pA8{`u ,.PZps:p_"Da:4+p:jr)J%)޻`ψS?VU^/#2+`%􏑂&~p4:,!5 JV[~&}_.*G=lm(rpT)Z["+=>scG~:^50׵*6,~3XE c 1 o|lyx]#3|V0Yq3e"<ͱo.jZfmL,]t%k(mCcr)C^; ꪱ-u@K)k.{eë=:)S =h@)KVF= hT (t?e:5A"e{#.uq>EPe%Q -!MRYC 6DPeXN5xi~&FW<=uF'caэ6 z,ʹa`h,m o[4P }D]m IB-ͳbi5><3u<‰~XG 7[4"YŖ#v\+-˘uȬʒyDgpd{0'%a}R4-gqsyT]Ƣed"]}X5鎳$n3""s:Xmܧb2L#ɨw0*,ৈ?F5:eՙM'#|39m `?L6OGwllf %SX:[,ME/b9̐ERвJU%4hzPDLyGKãrZy%֒ip:<=x,XFAm1CNᘗ, 1_OGs+R9j9OfXeXA+٦ifMʌW#= +yC0kR6*V_D(&];^"2=?(2'x@Ń f%ms7ep"8C9/n255jpjrjETCTˌiWS0A~0I A#dLf+%7QZVMeɐo1BKy_}i>6Rz5n>g+(<3ב'fXX!qū-mH! J QmJq/-@qB%Ꜽ!a(n#xw|㠨oX_AAz#UB&ts[;GN$;{Ȓ)%{:[BgOuD}-orWRrIP,deMzi@Bkj](yN|+ ھL`wyv:Ee)Ȝ.%6\}`9PI^"vχFX'0D_ӳZӧE]*_5+7qFj5Y33HZȻTViTt+D7XpS=#\11n`4milV@EAE:z֊>Ucgj,Qf!Se=Xu'yx("A}=E3<~F:hfXh" l gj@ DZ<;vb\liP+yؐKx`5o2hSf{u -bgIEkyj ,dW$2 >)dQdD6B!/TWK"6n$fI 1kp;1J&'K-Nذ8QU(,dq/XB sZ>G=RuΖzZVZ훵eJ9.bh7tNy^Ц mtG_ͬeR{+lRzZű戊"[ű ucn ;<{E-pkĒaH4 6l@F[8cM[M+tR@G*\+iW|;n%*{N5R(H{dR7ۤtru4tQ;]T-)5[|$ftPJmi%H*J;G{#JЊθ}G ?f V 5>c">?b $G9lI8GUsP{pg)P(DwY8UIH8HBF< +RdžLf~җzWM.7K'}`ok`@򟜴lPManA6 볰1 38$N79Cy0La=liF&ޢgVj86'kE|wf1xӚG٠V؟ldk0Rowo%\c;.;AOUXzvЅA[ap:d$O5az[.6Yǿ|sh4ro_)tepͣ3g3d9s0nǽpGU%uK =CK*JRIUw0ODW{cc2RG|E$/+)'"# ~ 1 Hw]qxlеw˲yZVfp=)Bv: )._T[oiO<מpf"j$hdXH4[&jYޙD6%*etdjv@h"ƃX̀{SH|NO٦\G2Fĩ n2 :! g{RY:;St3һ|`k2̵DQ* hJpP} >:翛MI]inNG~i* TF_k&)% Eq@K+'-ωTbidRjH1}ɋJq%}+6]|>Ք!&KsL2Lkl__ew5yb.☠ԘHy*U `)??.JD<7 F+čB ]!~ԅUW挄JM\'IzGWTkD_gCBi$}5(Y!1_S4)tJ>QId83!\$Ґ͋YM}`Je4Aテ yb 苙,9[ pS\9 \<Դ&?qn0{C N9cY&x8=܍ {DS!8c bxw|L\mӋyh0+@$ZFHǾ -Rřuad{e}f:H%0BeEaV]AZكl \w|KQb Uos2ɲ^DW?HX5v΢|)Y\HpC=P.W/鵀F4Tʇ YEnz~;Ŝxf4WgF3OQo f$"byi &b%ӓ|໲ta\Հ>)7XuD݂ 6]f2[mHڄrGiz;cVb~k37+IGE# @FVV`Z#pCbWCRۏBl?"~`Q++U>%|8߀S&2Z2X5&XXՍv^`Vo3F7Κ68]CGh8\Mdn(h1&-8h0K4,uP3r@V9ò h*)Z~5Om*fJUK!N\ȩk](~W.$QV3y>݆̉C@(*B GBP^]PMvdn"6ߠJګY}B%maWZG~#0k|K-)``wCw3m*\SgsH;gc*y|"067i# VZz߁ʢ=}MABOL@x=]M)EȸoXlsR݁=_ݹKJl6Ŵ>o[[l]$N~jI6(l$Kz-ă~C_\>ђ(1AvGݦ{|F#ϰlѺ EN NPZ<^i- }co'lÑLhzJV8,1ÌnJ ܗz k9Xw{B5El1|4'ڱ+1XB%5j6]4bp׬(̮(УaѣÖFF(pY7&I`8OVr)@Ȇ 8X"rSu"Km{ݩOvN8x[SxP9* jj8$5 8A!Vr`bcFXXqZ2 K2Qj hҡ0!aRDJ tECFd ܗ4@){ȭN4H#GPҤ>gJ8 =񠑄bmE}`QpIg" vc7~e7.o>a>UbpU dC/c#f Z@B3)ue lN*[~*Bm"Ozgc͓zk&<`GGw_PʠZOSTFS;zuo:XyLIŀυ|zO\{~ /QeY|eIQ>!I HO\@s)?`-٠l29 KbJ˃Rڎ1v 陸s ':80o˲!Hܹ)6=ՑWX7W/t UuZLzV_\$QWqτ^gYL|;^P tJ2)M4, Z&(ljTQtSdkc)"Bʁ"Ѧ1x5饙H?yeȎB+u@"^t)R%ZsA{28ܘϛ]K#m'*R]O>}DLjh5Nkw.De4q}@5 ;T.ٜ$#atΨ kWr/#}F7fwlyRn> y[m8 _HA7C5 ͘TyMwˊ~ش~'Ǯ'?#7V2ʛ,(%`NH0X> T8"^>+ƢVl@L'أv'm]EB"c!?0^ &IK"ŕe ʓ}!ߕVH/%I6e&XOヾ @9C] ~rNs}-<ЈG D^5įZIG/܅Quh%8K[Z3 /z""ܷCE/tWQ\arr 'V=$KX.T!iuǐJDɔxOh/3fLSj riId)cZD#=4ҋh$ix=*yI%8Zj9jXK#24h1Ԃ9,inemKm%,Ad٣$e{خtmȲe;pSm @EYqʙro']o\/0!ṉud?=\v[EeZM@5_S-2"7͗@Q5WZ ?s]Fj?7Xk&ϳKfnSp!2FiL=D\ lO " fHݡM Gcd&sfR\ܹ⒝ERȻrTtiͧ\5&ѕjٸKMOhct 7Vűdck [j+ M Ღd (aN!xmQ!g$.BB͒x/#UUyW=+W= ZWeN~dI}C"НkW_|/Xz/*:wrq=.3)RDBqLE5^mSjl SxK/)Q{AA4ˆܻG_V3k ;Ei'& /ine&CMMI1R+X`ûv{בQ"FT⪳L^6X_]_-m2{\˗ߵZ|6Y٣Z{= 27x쭅C%ab=#[k!3T)RiOH KaI65g.T=Vh;HPDC.`)v_g+ϊ#%>CG3̪M~JFɼڤ&zF^p(84wP5F"=Ȑ&Z(i TGv]|C<ߨ7(Ho*іˎ|G+w=sZr*T"D`N\$R QE )L?cZ֢_2kd9:u5]I3a$fEoeZ)-O'T%?I$"qh/[VUtBSKT8؂" ')f(Vxbj O-%*tRbkܢEK\r&[b[P1;^ P +sښהCҾz,cPURl6*b#vtSƟ_E1@- %D1k*˄L)/%McRc)!X6>VkLQ7Ji^+%f8E3ά!$kc GFQTM9V eVW(sw+1k#;0MC=bZ,;M˫6E{+h]P3I,syq456wx^﷜ٶ*R0s+2~/?nH0q 'Ry9HPѭjTfF#ˆJIo*t+1[Cd:o:bpYKmH{<\o†'v70l;6=:ğlxqRz*T'|&ȏ9NrTz:t&m8r? $Μe-.{W_-z.X|&0%/~NHd^u 39@b?AAo$KEY5al ,?&Xrn5XS.|eS /[HtK.7f4q~r)5n*UjW9mOR'xŎ[Ҍ |Ѻĵ:^j}zĉrwFya=%_X2'1wqDb^ hkK`DE?BfbK_')Mȿ1uMrsA _D196P<:;0H ƝPp bw޳(~>>?? qN[Җ_ůTU6HGQڵG=Osg9KI_v|2oׇ-UJ9ew_xE}X!oz<y z!yA8q}X։Kծ%/C^YސǞH9y|.x}օa2K~O7E!S6ܷ*J<'HXGm:,Ro69a˭'L;uKrkRPFKztW&j»q2?w/+;&qQ!,NuYUzEȯ۵+;]RDZuB@F zGU ]μ>󆁣͎^LϏ iC. Xpy<V= Nb=> A"_@ѻߊg=VbQ%Od<@"t8d ׹&P;Vcny: l/dK%4)?ch$ @QcccXm,y*%1rXȦ.AEJ4 N~;w6S›A."qזE3t`kPᵮW&7Z'RЛn-"sj-SUQ(OK;A0Q/DPfj+{}~vg,BW .<CMF+q#JսI,DK嗲IAGp4pHB"Hl \,Igr L4NL,U=x<,$~wMvVۉĦJ|kz\Ⱥ/6ɕ*OST^HYAV.88w:>˲OXs!CSto8٨ZLtD5>,0w܇܇? a/ ||x% +p+R] 86H_|><ڇ5}XWWmOa㛅|b_ ^yiLXmfXR,h8D19At2tLU[EMg軴dΝ{'=,mXm ARYF0 .4-1z0M27:d$QWq~":6Ǡ=t%KY$phiڛ-Z|GѵOQTH"P$~8זuvy9%BoD:wOd')GQydtSPk.0ݹ/'3skFw\C(A63ZL;y.xhla8`ʛW#: &$w;^ɽ$:~o޴~oÙrł Dcr DBiu%@h^EqE+ Wാ} ^"@|l NmY?ݯ=*? ٱ]Է~{aGSq4Qw|ɽGVܳK|@Q5[&вtf[?5DEK-8 KsRiO|BZZ ^s~ַJ=YoTFN[#M˨ t:ВCZ.OrB#=4ҋh$;66H:ƛy9G Fki#Ί4h-SK3C-vIh~N^VPdYC]cَvM[ i ]ݐe v|/,8tQ4 MJ=3Fl^/;!Uu΅豕DeqO=jEdnG|:>#mWB:D˵@/pi8c4ec9DES!H!8}h;@eB x^Wj5O!YszBf Vj** Ux" ֯YdSɞJVU2+ٍotQ:e0L=cT]%)QR 6 R~+ >Db;N}IN`7dyN19f*^.jx-h\#t:~1}6lI`‹|4HXtxugFugYJN2ԝ g<u'77QyQ:[gqX>W+@6Qdo Ȯ%;?ɒ$EtW; rY:8?ߩ_^TpMu|/{`]fRCpśP=j^lۦM>_?cҀ=T %o =p1‹{7(ܣj;E'7]HY2&& ύ̽QoLa V#$î3׊))l*uj+5;Pl&-"XWXۺK7Z|G>H3rM7v}d[ﱻD8Kf԰p\ ɠ,fOʄJ{D l}rj Zi|PwtKbm ܪ/D]鏦g(NA~J Fɹڤ&nF^`/ᵨ#j JdH-4 va9:t|߀B.jƺDo*Dc.JhK^\% pX=*W+bB RvӎaXbJhT 9QU-E1mŎ`}S@DmafO䜮6Ѫ[,n1-Vkѯ}UD.Ԥ&LHg /fYWћA5dVq D2U E(:ڥ|+2;*~w#[HRXp*Ub G[P8Xd$  /[L^XᩥQŞNJUlmR[TSWhKU$s B u*fNj@JacpV[rvSW^J"J G2P}Ďnʠ(ӛh9Fu !^Sc)2ŠiY,%Dt&Чj>v&X7w hƙ5Dߖ9d-p_wlݓ(jW0r|Z(3D.ӟl>#bnpV>RLNہ3ي}dٙ\^]".[1DK RT4rEk&ܩS εO:7Cy07T&+ L|5@}t6:3N۽0%&zMCIɴ3Mȭ)lYD5j6̬=!DZhe}+j +8&g9cQV|f2XdIeu7Bэb0R DGָRE6߷~|8b=/{4u((d N}V[Q^E]+e*DϦ'8d X:`U`JT%麽F,+*כ^9FzY@ =>-P(W{0- oIhQY/Qn|v0a1;Ss=*h6cVe;AMmcϭr=A΢}KbsF$J_LIJs.Ј:JUZV_lÒ8/,v)it$x:<M*N e1{N[6tXǼ6\R-9Rȯ |@f yA::l&ȸӤ_9n*EO40oXìr[E? v5H8JSTQ 4!tD_C5C,~#AJ/OI18&sbEjfSz]%[n _̹b&TjHt"PH%Uz33Wf@:+OJo(ܘ2C~qV B6u/ d%㐚6wvO$.|~6.3!6/ͩvAnT]Y"tueK56E6I9.Jؠc餹"  8ƌ1iv@F(0bבZ"k 00{Ma8OQ-_]Vz}Z!ߝ#щx*UZz,4uIV<9H9h*<i JJZsd''W"Uw}i-IO*B+ǚӵ7t=ͪw]dZ~Ԅ[? Μef>e )e;~)÷)cұj!Z2ΛV!Xj]V]VصeyIi((H-On֟[My8% ?$<,rW^ Mx\&|͠dʘ%;AS>l7Uy ^|ciqʷ}~] pY=t}L9;0^[/,ؘ4"])5kI4y0Yq`pcmVy3vpa WL~.O U PV r-'|qV8q5'[-=?_*>m$; "}3k /<6{L/sLduϵk/`՛[v\.2IT;`Ipk[5w0yЖU!Y&f穷&O=Rܕy\%agунSl1cF"_{<+1z}^V/u4tl#3;w4/MF1{U.zſ=y]xճogKp0%D0̫n^' jި ARKJQCٻ=R[ǫ pSJ Φ>QmM50o3|LCo3Q߷e@ȓ"]ɠL F+jvYT/U +Ջ߉Oc^b{=~o^ R=|0Xm҈6[׽ @K&q-0J*QBDJp n97ZE`-*}4tN"Sw5ӂd%RFP.Hˏ=R ?r7' rK \{0=5㛟ZQK (ߴ2Ol53g֥ J/^a7\i/h]Z,|g?]T[MOK?H !:+R|K`ܜ<\C2hȣz?UDC`F,V<ٿE WzMr{8<)\dR O xnXT\mLrLWc:>aI(ĕĔ~Uʖl7' 9 $*[ I_fT3|!9>>"kʙ`Oޟ_{ww}1|%g'揫ز]GPxC_h)ʣ ggeUsPkg^ wb9ѡp 4t*{ݼCNēPXbט-(f[9;_{ 6~bh>X?T/uIYO>ex.ȇǹ-KAmi'v0,"(5 HuõhNqywȽўԭe\ke&1P_t"DA6V=jI@Uم=/Q)CYX|I"-Aa>㵰xåi1^}]@j,ܮWbENRĢ9p W~QU:y5 WvY?l\$5d _greh(Fo [ېc6okVwI3@%MR`k;uEĭ*HXk#936tG208s"6UPr70# i@ SЄ#JLZfHeHJLLxT?xPϴA-ҠiW#h%?C_\#U;?թk X?cg*+<\[a;|L{}S~C/-t%HN@az ֩J = "]B4#&0 rp8S z.RٽB\I-E\BuFoTekbf%d$.@Yi!qol;QorC2'Qc./wFO;gepEiۼשtϒ6y[N,xiYUee!mso!%gFI5l4%vdƙk w&vwy(k8{ԮAfvYMu}ErS]i3|e m#At$C13Q/țIh 87y삇G(OUJ@xai{P%a#A&iLl1:YCp'zֈ)ʋx>!=X&ib`hfv=: n<:ѿYArob~gIMCNo/G\XJ٨tʛ}QlFv؞ؙJ8 ,{fI¡ExP]'mbPGPGLM ^aCX%9 )">d}})2oweA)LUyt/ OnNtWAE&`VP]6ez*8ʆt,b6 ll*Eͦ%fdSLБ+~hK !oa\$E%Px.(x;'ĤZ9}v8Y[KTp;߿<8K;xt0v}0ud`tHT`K,nT ,?F>j8~܇:ׯ;!`̻=pcg;,eex)n3U'_c ؝~</\{Q!/bчJBHB_~IRQ$DzS_Ftp?';'7Pa6u>3E@vJ^{+3&'m) `݋Ej_<Ә4aم Vۺ`NO]p>Vwېa݅x+YNK M#|{(cdj`v.{t$l=/?ѭĄiǴ!mpnnL!8Δϗs 죑0 ՠJ)^7'\`1]Rcy)mn}(PD S^:#Бv/CP8)U"Յneo8(q _"a _vrYߌt B휜s?yw_p\Ru4-/|\iWć&9yK\ZȜCQ~%X7 '[qnKHkkYwUoi墚ҙ=o~ȟƟ mE0?4C 糒]ˍuzE')`!0V3V3A[`[$mCmVju*!odfh? I–$au 1W%W3n!(=S2XFrWLKZ,_HYgCePoC%E|{gR,C:;=K&v]KJ`v$E hi\@Nej $A:A$VH%ʂY~~aYg{z_nTkZoZ=~F.SYP"wPq{_+,/W֥aQ!min |Jp +z&x jJQ~JZ-&win8K$&FR KO6bk\(T .@(@G PeV_VNE|DvYT㪢SNeSyI0ۑ:(:#u־#-qU w5n[GN0j+uڣ:i_n OKEݐ[N.ιXRx>t)z^1^]U;%^](uM>ҙ%jeƲT:@ْREi0 xRj( 5uk5U3pE>?%*Ja[>ʰKpA\3.q-_|Z,N1/zY1UIZw,ȧT޲T!J!~R-ugva|#caN@k6)+J4 cV* :q>(? C0R4w~"R%zch-H'm-,)\x0_()?i-R j'ˀNW?Yftii`@W2 ^_Ggw0uf${aA>ft^;).ó*0$:]̄f<㽟wg^a^C]?(˅."avl8u.#t3"B0_9( FZǜ /#;8'`={P0gN+h9ʞ r=)FaǢ3S /nm"JBZ<ׄ y@E2 sL1u$8d<!>z9+!t172ee`vBYb JHˎ%O`o!CvGgpMp&btTO؛D_+sXJ@S ]VLP1VaaYevh2;VKPR;R ֝١4؞s?sG^ vlAk&,SzETSVCJd}*ea~Z>{=3dQup(R{iZѲa7Aj٫P+\/%6 ^rL?S[NESkh`fPڀ;EԎ כ224,McB[T &YC񧲄`m_7 {:(an x1L0=+`@^4| D@L7 }8pg?P]sB_tr0DZr(l v$ O\8΍v^@s+q&\::KQz9@jr@Z NÇϺuS>mͺCEnG u`Mg zD[y5l@UP\~+nfQ7R{YU*O)"mCHjY(|LOHBh*=F>+DGJF#GkZzMJFOOTp <Ʈ׈k9? c~AM^0߈OṖ2L Oɽy*2akV^lږ;.nhY^?s1 3iB#;$ҕ#ɷxy9hɢq5FT\3B#f'wk?zz> Xg#DxXA҇3yˁYiE5+{G[`cF'4)GDr}uc/ ߿K1j )%QBaoZKJ_F >/}62l8u|-+i .bhDJJ}+I~b4rȓB1ji?: 8-ALh!7 MCO)wXqb0JC4Rc/ b}KY,=pd^f SM`$p:0"gPMز,JLYP!9zzYVeQc@/YSGv0BpK;=0K>ae0Hz8*Ap\\kOWOc"jjvqfpTbX0xBW1a t T!3¨,E'*Qfk6g(r^r|Z RCUfp ϦRa<V^H_+~}{/~Su`Ebߎ @y\ra4nVۻۻ.Oվnj(Ղz@!c,a!W~+\;/3}?vσ@f=;c03xX88ڵ)-x)@ӹ;W#^zJp;ad܉d,nOKC/J0g<{ N{^ Wȳ3{ 9rl,d ҋXZ d)? ?H|43$T_m _K:ֽhs: 1ڜHk!k5GM(c1-3]jȶ@x&n0QخYD~q~Qh#_h`Ҵ %hp?i1a-mZZQ\CLfBFϊR< NJuGq+NgZ|q65mٳGoV3Q?C~6 ^,G sdnfL8L|CPC A4>Wp`M32_ RTMa -Kp*>VCQg*j4N&8pr !"6:|ţbȤ,(!LV)2XC-Ok1]wgR"hM2h1#$qFjp{%h&"$F !zBnqL&Q0ID0MY);MK[rⰙLVx- A3P_!d&-^~La ʡIYyXojV X.TS**7;XBH?+6=]*M?TXeuۼZՠn+oe7WVB͢ȖrT§˵C~TDKbaV|آ|Rl=JZ>R8,X6_))/drV)_DC  V ^)U H<]rUK7~MCS`]%9&!Dᖍ)&9&!],UjHrX,TjJMRRCPa(KC\UYFXZJiN{R.7vl<漚HBgdxZ9R(mvRӽ_*U_]6^_DWikﻋzF_ڨVCd~v_AW~v_k~bv_د].k~bv_د].k~oد].j.W"*"v_L~22滏*"v_ȯv_ȯ].kG~U"JȯhI#]/|_/ɀB@q5UDmȯBEE*Y5S8(*U(ˮRDTDuX-VKe$n\R\KJ) -PlV;.VDJ2IĔYU&)/ ʒQbo%z*ެR1TES$b&9&!X/Y5('Q.:j&IyͩlQgs,Sx$dgsLv6';dgUq6ȯ_zW`m=ˮ._(*U/Bɹσ;Cwh,mPžS/?ȧѯ k.bBvd_nb}㗬tũGgj?*iF^FUީ6_ք éx*U AmdKS5@.Sf5*rȒ]x?"wk9]( Z[TZ@O킧|.#BJ"0qSjR~$(GMLl%)˷GM]e݃7/ Onxx-(łVu r惿, >ė~T|JRQFε3#q|52|ɵ_ddڜ=痉{Ӟ,vӉwY/XWQH@q1mf",.@^XFȸuFƥkHthXDp)`a/0 "84Cre#'Z HBkM%6zTzD0V[PPjGD]2!lyuby0/[c5ǭ5DԷV[3zz+[si x̔ts55TXe.LBjURvQc;/NL<mshtED|cag~Y_~yRq!,.c` Jws@YCtF 7CB6AiM6wNE1iaŤ%I#ei%"lˢB9&J-ֲ٤v|n=)?GZ@7VDPZVh0P(" ء?&FBQ@\l1зHRͪ_].ތx3rX;" s6[DMV4,2z[R#Ϫ >+.e?"\K#4貎]ذ^2dž-JK*d67eMzVbIC+dS1qW AB/PzU\&ʎ"BԨFDTU3" mp4 GT="(,LYJ+e;<\ceo_Wb Be B%!5i83N_WՑpJyY 2T**M@QZv(Rla?z]X42}׿>(O'?7%|M|f.{">vkPHE|">~X.=c{D xowVEб~(s9wkcQ~(s9ʫ:۩q!%bo>LpLWJap5&+PΥ}ҞХvv/ʪVaѾGh>=ڭ3?ޙ9كΙ}̾sf9&tgv{#:cg) 93% d</YjL?΅zIyQ:J2~+řsxυً{tey/xiz|2L],YV.V^ϿrvpŁ;8R\ϯ>|:\ąz\˝׶>@*k< w\W? oә3&Z|~R[7n_8+Ut&|y=(63SV+ ?vg󧨕i#uh$TO6/Wo0݂uQOTOxs}לGștou).8˃_kϯFkZ90/ ֆ@]oNUJ#lPW+/KС7- |GpN1U  HȎ? \%W4]ȗ@/uEB/ѻ۪2s<U+Q-QCjǓ ^<$~ 'Wv,? tѫ˕+.N&|1yrg ? EvmXĂtM rƸx}}~z{mEſ-+1?Ⱦ4pd8y84ߞyr1A~^a(=/B96$gF]$̈6o 3# 3}eXZ" OMG|7U XԞ>'HHh3o:?\UÞ6Ln7L79m8'Bjبp1b1L|)2|ЧOϪt@p/w;O/{_?em2[ՠ[Ϊݪ*< 5ir1'0I~6+/y]Ű>=m􏤋uVj묵RuKYkevVxx!oθF^Mؒ2Gp־1'j}]i'x m= e(h/ǃьW?1Rܝw1׋VEd{d[DvY݋#{:Tg )5φd1/Ќ %!lHC 1O룺=vѮ5H9F,>eJ<S}"օe2Qi}xBf㊁ ]Z $9LA#ywcΖ$f|Ysh! VEEJ=~aq'Khc hQzIQw*Igɂkm]e[vMœ&ê`wnE}~ -XU־xFeV%N^v3ټl"o\о‹ކWWʹVi)$#^ W6 *ݖ{3, Z½!fH%Ez3,c$ِ3͔e3\fa٠]jm_߁SWPFNdg5ø^ƉnUm w1 <:&#I)jCɈ`Ô9SPH& B|K:?qv4ˈMdb¹s a|![O"d\Uw\pL;Yū"ͿC ?svy0-SMĿEx25wfwd\r<{40ħvť,+CS,7? gublE.jXFY6|qit^ڻ"mW_>=pp!1G<n!4sh4LA4*h&p\$0nH#Ɉ!B_bP+fl>䌽`"yA NԙEbAFQ' 'N% Û?Pw7š|#Q}BeO{Tr2ԫ>bO+lM# ?;{Śwdj@|zv3\2t_]+6s~@hZ@*z7MiYJ>[ᬢ2$O~b82sK;F?Vny# Y8|qĸ_/1!5,qXgiI[8Xx` cEP>6T˖i|õƄ59.[[\eRA҇P|p%qzO862"H5_3w\0B~ 7\ HDVl!xXn1cL<0L9K`v5#*v^I3'f/sJYMNGƗHb3Ʒ<@ mPR)q(YR@)qKp(2 X-o+7D.2́ѽ< Ә_Jf-Ls|tDKTw)t^ɰ Vt"ou^+lr$H˧O}{eEVaz vxIuxO*g0:M1íX7jYug{Тh tp?!4!γ>-3RS1}?Ae0c_MuaQI0H:H:[,Ͽs*3oO-Ny㺢DLv7z3MƛNQjk5F 3<t/o+geQbiy+lcޔmt~ձqKáWxZSp״O j !.j\k֗:w5~.9syg۽ta\[0G]%csmkoL@9cyUZƠBg&:p7s0¾ fH5Z!/pyɅ=WX`;s$8yp`rd㊾?gX7Ps q5"6y^XU.{vxB6w)Z/8sg[lg:4o>fJrk@"I=Tʟ-kp;%S :A0l3`֜sͿ#lE7w0&Q<|mOAz jax"?O >7G cñq|:pQ\kńE0 o' kPWyW -]mR(\A;ϛECN{4!˔FT5lD\hRzlsEaQ/ ;=qA$g<G*~~SXN&봰X~v!vfld8ҧQY.Cyd!}uڂrX˰|N'|65Ob -8V7mN_NtǏ,,l#}>-z\}YY->[Bm"6JXhЙ1(yHyk$v :;˳4m8!`b` )WrЯ|NSr7ʯQ `#\>a?觝d޴rKlHD>$bP\ڂ4`㇩Y!H®{g @Ϛ[. W Oݕ)ƵQW2zbB_b;T w7\{l0M0:%}3q"Iz.ZeH"tK6zbӾ ˬm/?>3oTbg"F#2WT WF(yy'K2U1CBƶB֗(d*9A6OY4pQ'f8y>*ۅ!Kxi𖯋[bAdN܍)_PZ~0;S ,Fë#p & ֱRAr0iGC}rHΑ1?ֹLP[D acȿ)QV6OFU7xX}Qgx[ foнvfʗʇ5PŁ#m 7 k0P,9k ?gvX1wd* qysjfp f-1 Xm}t4beOAY(+>Y[lRu'iAdl-éLwkgxk~σR z++b#i77 +t@0a|W8HۣTa8lA=*$D@i6m~T #F_mqIOo=ĚK3Ŧ8:gUr?Уg=g˟\=/~r(`JL'*<xס/w&|pi٤9Рf_`POd,'7'@‹8n~+ 4CW;D:"ʙq@0& r2݋5n0+F]ʉ?(?';E;{wzAAc{[ۓAh/ O"]up|,NDx,~qO=l{l.=d)%1 #E_>~9_r|w9GK4?S:Ҳkgǿ1emW>y>gb: EmEMo9yNdE봼E%Ku =Y2hRB7zb}abD^]'ͅܤĝ?mTlB|<^k?+;@dwtwxԓ9ve )g6qd *\|s0r_"~u}+3 o4Iָ۫@2FaΛ\6dƭݘXܿkl oƋNEq²3Ml3 Uw#͸7,wZ ;xBċOC>Z$\B^6tS$ ]@+($Tv;x˧OFoLeͧZ~Z@Ê[MZ,+^b;AF‹4e}Q*ek[Vr %qxaYC9E}j/ѳ~]70:nRb1۔Pb2Mt%Swo}}aR"r%gϴt8:pӇѽT;pk%6f7MIQRtˍD*6hg_o91ޜ,{ꮓkhi`x9n7bgh|2 j73NsὛ\%ot(]n-ʪGӛ!E30[JKIB)CKd6ZNhmZ‹V)}@6szeo"lXF+)[T5T3`z'^r0x_n&|+ǫk4|p8M~s](p;~|A"[+\Qa̽a@PG{)?spH]kp%ǓhPN)и'SQt~]ygpL9&Cw@q7,x>НxhN;Ew[xUzz3@L;r[U R@Lxx%V h\ԙ=0c#gL q WhJz|->ɍb{bwC|ˎ= iT7Ww|},; k:ԥE3@/YSXtJ4ըB;sv>yp˗ؙܫdop]|]hrysm|'ՔB9kT4SQS/v LpVEMjF`Yμ5w㽧<)I3piCM$CDm_t)Y÷pI]2\4G `d>`rw7e ԩ,pc;<a#j{_.~&TH Si^CL;4yv>wg0rYڇV({=<9MOspg #5v>@ hJ>1ߝ)⩌DeeKsvcTWiۇ'geʹr8yb 7>uwəγK0,p̿ :&ԗ}9x݊ì;AK7DTz{|Naʗvd(>9['_Uvt uj4~q`2{?vwFsjrmCTnC+`=sAP;(o{Vy-Ǜs@:i7N/X@όNTa=᜙)x!=#;,,kggލ]|v5 0&o ZmUڽxjapxB.ߥN>5<-{(ꭑg=gAyV8˓xK._|'neYww㻿LJ) ;Wy,i`CYC~'?/?Y=~L?½0Iwnmk]/ɭ8YݓI"<plx>wwa7s0f͓~^ʉIL kRV/̟<$,`J% FZ޽_R5*N?e1펫  7ۓ鷗>f:~*:-&2\ͲoTwGu}s';Οىŝ2n2 M[Q^_8390on~ ؞wu3{1]|'N1\.?b; ;@vsgNawD^|Jvr 4hrB__|)8ц_xt9N 糃=`̙<_j Wg:? yy+_~/p8z Ckwz7q˹ {;y\q`0w>/NG 1K"qoMұޒ1 zW>;w6xg ]Kyn+UB+d= ^zuADvu[0w<!ĄGgc ;yʂ+swſˑgBÚ>_= aNw'{ށDY|%lpe& `(({K2GؽLlacTrAwX 4Ǿɚ&}9|r?޲!'g2\le ;/\?!*]=0XGRkFND`@ |U߲qAX8m}IUe}:v0uD~qg0]@WRE#_4%Yv5gK!L7gj+ c+\tH$g@LGtAPLZCAA*`#$~\~) ? (^\Ʈ'y: g9ׅq*87C? Q007? |†\Pglpŕx6\0?LQ q62Pď߈UtP./N)b+IQ"w>oe]>$~WL>/lh7q,̱#&~ v|WS=|b>9'V.:}ӯwE 2ſ?:iu16Ōa6_Oou@]I@5 !mwRm꜡eZM9lJOY4~?X_©% j]yK|Y^)HFjX$D֒$kr;wJf il}us<}%.h!_4>Zn7E#vux6~lpk\V/Mk&F~8)s^y\Ӑ +>/xU Y%c4廐5.~muķ~_Se!f9A[SkdK $U%e/Yfs})2Yg@ щ械kL&=H$ XVFWm9|j{Pyy:[R%4ѕL f{$xMMd3d}d%ٸoj6A4E! {1j8B{bxe6m)4~/Xz/o;8W|L-z=.SLx_E-wUvEڂ1דy{Ct ?{^ (+VwV|mHatp0LFi~h_ȉg,9{ z$vE^nHy#45a(L*l$lȚ&*2Wʪ+Juisq6ZN ^G.NVoYW-[?N&mѯmޚ.1W\{i'x'-ӤU6# 0CMFֵ$yC !6nd/,n4N;.;}s 55{lccbHVg.,dҘr˶,y#019/)DYLETwGxPm5pYL kOTm'oڍɪ\}A\9oQNߖNFŽߝt;%!_˲~qE!kCa8-lgeyGr#LwVy iv_ /P}߯>\[Des=}?|M/2K҈?ҳ$mvvi!]zX M%wtW&GWq\s%^/{*}0653~eeaG|܍0{ng^GVn=V]vn9sKRq'in*2D\);puL:`!b?/lhhJA#ol{.hXjNcA+gqʬSFx~^( ?R`ʤB>0p ˲kc 4~9+ &:@/vC"GzᣑZUxoL|lz3`B/k/1ң0jwۏ%AiI&}hވ8E">w-{OĔvbLî1V |##O<򢣏K#?0cG?Wx>J'8"l|C rstp~v^fV ?nӑ3XM\W Sk]ٗ[g_wc\~DdU8nt<K^b ^ ȴ8̜͒3`WkTe0cdw+A6ͥ*م1l|{qK/`x-p Wݞ||l ^ep` fSTz6;^R|cSxbw`< pgA~h|]l?!{sYP[󲝤4NUegCl( ;tv6HA1m( E4OІlPSϴ/;KΒ$;$FdIv43_~xC?’Yv%ijgZvV&PH>m[F: 4b*\=.DWDюY ,wDYgS2 )@h[Sd$l?/#6Ǻd1%$#/qynS}J~[mM_s?+#o1rlqXwc;(Kΐβ`i`g;cL-g܎V\Aprn0_a d3=6_ 1vApg܅zIHΪ|/ 滔b;\VszroO/oAcKG]deC$j1~z+GJ]dg V~NBgɋ~{^3l ?װJbXS4Κ?ʚ);3F4Cvf51~[K2~{bS¨30Y4~4ȠaI4l ;ΦxMᷝIaB(,(Ev5%]ӭ}»MU-hxw폻/1p7|Z=k_Suw®\σ;u9oS}Tf~\)uYpO|N.SuGKZH{!F'Mlr~]M;K`niIC|z+.[YJ֗{8*} _G[ӓ/=_OO{ pqdc^t8\v~q`1wx~?P f*NrtO/Z\-9e.A{mErp&.!_g7#*3pa5X%@L[v;O8)5 mX%S`+Hbdn%V-)ofp8>` gK4,`uC[bsQ'ÙfIGkxѝ'C>%|jqTYU@l,PKtqk+Yw4 / ||4!HqPVU`7ğ1׹2iH} \./I<Sa冶nk ]< ez Y&N2"+\5^Gf(vS- e_Z8P~P99}nO|Nyoŏ9cbݱ:4IZ|Ǟ D%?~ɽVIvxQBw|Q_KBB!Kg<'+CI+_ nEЃ?+%T20A6e;@\IEW{]sN?]]m{1=s lIJ2Vbh`nS}JsH*07:Q_J(C()T/ J"Eț LUjJF Af +|04I}ewܤܤ7ލΫ5:PH'7j]ZBK{wD{_q:u0ol7<{gu/, * V{~Ǜ_/-_SB.]$3e'EG53;Rx2F]#/?]uNp pHW\ ɄTgL3+<ݜ?F{aSkA |{/\89}c:D9R{MJh&8+Mo S;y1܏h[t}3|7?~d}?">*( ge&gq'DP&c d\/%;sɪ^^SD?K*_دZ&!H3y|2iv0(1,@w/ NPn+pT]5)|!cJ݌&PѴۙVkZJc ,?cKK,ao- Σ;Ëz2O30{7DKf~/K׶?UP b^V:`9J%˚Y6P;SL=AǍCy۲y-Sԙ778}!\h‘hLӼxu߶m1"dl(UH{i-9E^,04dp*eG3R`KoC $|[6Pay\/q?e%%ĵdp\C)|t?;u M"pj/?NӶyФPm4xs} }^XV|Y8Jqk⛆;RKD|1vz"Wx K+7gg2?{BEQ}U"~s̿mhBu|ι{ΆS}拚K$//XGt7 VIՋVQ_b˭;17;>qј\ Wdxc%|վ m;@.pLӠ]BB WћnSg8τ vid / }UjQ&/jvk`vW&/fFMu{oOE [ 臁hoq v*X 95C u`jkL5f5̸"Tg)tv|![}0dLA~@r8-`Kc>]'c K_7Bd> ^8L0Qm`uC/n4F40l) \` #bq[iԴA@FCG'0C? !ZLB HB_<-!!'Xy7 2}ep@8DHMY[w X{s #Sޅ6]~F]~"Nhv}#]ՃfK\0͕KSo js x-u}[פ&‘+dTyFu%o0BG>d=͆{`L"B[ubysE3oIdaC"  fD"`CdaoALf78R|lkFDf󘝷8=+% yVJ"T*T cj+VFxFEZ uʅX$ =Rv(n*JPhI+_T rX\)Ң3^umr}W~_W+LŸpZ;K K௃^9d)lW# ˜Jfj.M+hՌEk8i{-C`MB:/7YE KxZ%6:_:jPe=B\?p&ދ,PCyTOBDEDŽQ]OQ止yᾱx3.-,BndpYu)b ˜Ob_ܯhbEŧ# 'Y?(.oa_pNc>eFn2`fqg2X'wmKftk[iNmvik<(uDՠp9P9)8e?Ë>94QPtAz||Yy'yb;߻]߻.0^ópkKPy<駂niь0k+|eoEV\J]nO1y&uFY`4~~vU?!j|i8+TPZҥfF~Kch`]K#| Q6FZ]KBI8rIg6}ȖxTxc$J%dkе1pmC*ڲ 8TU@O~g%|z'&A2K\GgL$;wu{یܫ9_ oF>^9KͿ?7esd2g`'YbaBX@v+Eu:]}p-إO_k6{: )d|3>ry\6~D+  __&L`7MF>uTH^Uw} {)`4!5c *Ӹa4:}%2fm+>R<ܿXJV Uo*%,(aA J$6D1œ5枷Ÿ+UP 9/Z*0raP`5_~ /TY^98̗@jk/=@}ϕZ1m4T%DpۊgA04`x6qfӝYc^S[R1`?x?o׏V࿿5s77W6|EK 0|&پ=[BxkI1gc6Zs'Z#фvJ6HkE |1,~糇5\ 3hWȜ`mœo,W8J{0_p#nw(5*F#/svuFd ES/ pU'3Lr32MUit-N٪DD'01(-U{?og[we 9L-I(}OQ'o)v!u{2=NRWi_폀2c?:)"""ZCpqn^bYT>!{6~ofЁ|іQ ɹBʷSRשׁmEP+ע]-'PTB('1+9ǕpWwVӵ"ZrТzdtB.+B.ЅB2py㣂uߒUV^_R?[)=Q˜L{; 05x氻fYfw)`h -pvfw`0Eu9/p wN\ V6WGU>F%j!T:ZOoGow3q;Y˲s~o{oGI}4 o _o'1U8ω1jܛcH9} E z . BpAUq= CTQi|jфMCwٳ4>qto>#iŝ:άєUjkGi2^nx 6'.# ۟M*A.ו[p]l#oAX.=!g[z|~ wJ.44-df'P5K,GJWs^#82zL$.B&˚3y1+`8'#,sN>+0̤:xğ_Z #\DcD1eaC&B2d8'ztkt-cσU:Ҧ簑殾 :sml>"d 1m#f~mSsH&*X!J Adx6>|a'%1Us9<}tOr*RIpA.&Y%|Xe:g/GMJ`z9A݇07t sz NЃu];\u(ƅH>I⹴ ZTdF؟O{GW ֐̼iDo0dLz$/Xmy*K]^4oy% Mdu/fz鋑aHQ1fiP;j<5E;FUu \`Ϧ,x^1+z DQzڕ^gN?O 3筨!Ԝy]U!Nx% {tH.1j9%?((P L+31D_,`puĝӯma+Key%X}}\@Xu>v?uzp5yHZ\R@`n\AGt}`JN t>/A'/0s) -1UtA/CYavc.E DS7 DzY0_0'WOaF-\IK 4ޫ7JK^HIU+dh*6MѝN|aG2>О.\&d͚DaRi|4ZLLwq~g+,ދn慽߃6%a,O]zls=~/eJ瘯H8w2j~a 5ịXh2tis%y虴=t[77g=놊u83\4|*Bl$F@a;T'](nkgbLB1넫ܷѵM\8_Gw.]v~9oaSEu#k1m|3JkdGr?1g.pF,k?/5kܛYu/7Qmߝ;_oikBl$is)Dk˴2v Xe]*rƱvTщjtt:߸^Y[#/X'_,1fHJF/c1̏")|¿I>,\{JeD }bWFpMٗR񹟤(18Q/nIlu1d O8#Ӡj5bT-Tja=0Z\=4?ĻY!l TK`+n\aR*:b^-k!rѦ1+TH4RH0SҘ4Gy"qO4!_rPl_?K_/yBaVxaM)quAƈ2fpo%v4!XL0Jx w")XLpY녗ǹKm5bQ%q!ddI&CqdvP2K@GBdvH2;$ "Ʉcd^X(HHjlgIBw@4f YFg&WpE)KBaԃdI0hy؝ÅJl=*Ig칉!?X0m4^,:ځxs1]/xy?'_?: O|MO|]bv'ө3IKbPBN)@ b! C !E#i`;X; J68 Z77 s]Azw<+ey)[\X@ vFh11Y P#~D)F6H_E QG5@H.NFPcK4Yk{E>o=@Gh{==JhhNph{JGCF=qqb= ?.ܣܣm UCRj~T)ܑUR >T . Bifp,=%XW|,DS*>U-TS=eKjG&E*V^QO:OF'C ew+_ m鹂>a|"^ II";Ӆ%]ԏ~Cxiwǻ7.K_|KKJ%eU/cX/4T1Q"Jt72i :CX jj.lMK:  Ä{LLe"xf@bb$c`Q bJr?-HE*llK:093֘iđ ģ=6t1}9؍!S9,U~P V =\,6 ط}ڒC(U?9~YlILr?'!,fA x ED\*اo& Iȸ{pK5 +mUX-RL $7c ^5h" +ba<# \э{MnNȫ4Z Qe&S*6u9tá2:\~LAqVuG! \ 3sAġraiS_?DmJ%_]*Qf0sXyiNtˠ`s@(+aσsT xb9F6CGc#t]p=Φ+D +Lfrn{s@|ܹe$8h’x p*$X>_53>ޙ8VZxIV[ϤJ{\;4kE| 0 R !)йgrN.dDkڏ[Q0 0mPaLt~l"m*7 зI)4?^k`鸈r&t hRBw$eW"$Iykv2FU??ѼW pw`O;.#_Kbu O̡uo? Hi~[_f~4"Uu[ww`@Ue``raYub95A+v_̋~'?2!݅pIsςUH9MTDK!V%"R  HË捞 4g+N 4+O SK&[.(b'Wə/>(7l_y+ #IرX,@%`w+"(,D'i12U=\Ι0OR%*чJAo⃉!t&]/OJ)JwhU*#2S+y^(gKz %&S>)_ӀD$yMKHU#Æ!)ݟrZ +VJwDL+ {SNS5"$Zig$)fioW+"$ΔG ݘhbF|.؈lp` BD3CA%$V$ew2`$?F#1 Fb覅D*H=DIk_/T"?SRCY!,*_ g 2Q ({pbJ/MTb$t_$Ȣ&:r>uG||H2/C?X\gQbЀQ$Z:.88u&~Yd$ƝaCO˸"[yRCZ#%it,I1ZuȰ}h?Ru =T?4`ؽBHv9 ,>1LJ䮄%jO("R2)Eq8`UCxȔi4e,ЧQ*; J>QvXkVazVUc*ˏX6XBT@V<挈 {{q!Pr1;D`>.ӟ2;Av)[Tq.!cK#cZE4G42&YF%2&Y9>ĥc$ X)q)%$`LR"VJ\J@uԊEe)+u\JYTJOivER"K "CV2 /TE%%oآ]3B)kQ\RQ[U>>j[j8Pz'MOp8 KѧZ+jWJ-&C-Z6/SYDz6cV UѬX[eO$-2AlڕU)oyfO*aj _E@v U%|ⳖƸ$.ʥGs9wMB*Aϊe?X?0^ńM'Q8} f<ДYTb%dXMZ4F(]Ebɻ3x?Wi?Th2# dcY١`E4Ⱦx B#@Dw`zV`;( {A@)A@ w;$}B8K;`?{;+D\U\W0$$*+ hr#WcosAO[>Zv2dYwZG_]"LrxVWOr'ÓI$wxOr')I$wxIk'Ó$wx;<O^[쾀'9?c MknA(w`*`;ICܡMz_lm{%CV4Mxdńh+&D4VDhʇHN3n2nrF.1W4AT2eJD$6 DpjciF׬d1ӆZb~e_2_W__V׼ OGb؂_ق_kM( E5TXPΆ !L͍;ta,10Y Qzޮwx#nWQ<0e+ YD#G>U~ uS_E iG?&?] U= 3QPsz|XQ !zS`N, CQE5CO=G75N W_9jo2jRTESUU5aC,aWU«XVWH U`Ut `ՅX5X5zZ*eFUЇ]!\aR0UjڇʿQҀU-K|(-C%}61V3f)6Ov>na;`U|?6gѶKg+ .?\1 xoE=ׅIfW3m (8%ZjC`?~ |R~d[/'xrouAx7#v,1mmHtE4#2j*ʷkH&I e[ >&rj>e$`{aAc-vX g7BK_Wml@2T2N.2~/iD).Chl ">\!䑟  8uŶJ@lmE^ Nw?XP1(ę3SL6p;Jc`)QNAPzǗg婰 eʢrƭpE)B9( l56 U y1lt[G`׌kz:I naVN*<>N21>ې{G"'n x6tg$.-݄u\׵2:7& ȳ  Gj߫.}. U9'K.}c6û`̚ ='/,So)lK}/D gV#&:l~}icfa.9Xdy<6,FoE ˠQPv~j8)وEhIvaJ0"` ρtj]mph^ IFk  - XcD;r(-1!Ө[bd5:2.M0j4:bԘiԡ5''f2`% #Ӭm&!`‰ 2ŀN gM5]~Eq$:3DKL?i~0HĿ'Vp']VO18(vr8ܹƤO U9M<#~{΅T0ZH$ֹmlʚK0qж2vSEf~O)|B u틘_b+]]ݎWbwC Կ8 lIJ}F5wKv*O CprsqIDҡC[Ox=M0k/Q`L0lH ;M4Pb`@_Oe_=q,k|2}}w~odׁCL2qDβI}b D}wa)-j/g.ű`BJ(K*QCDYlUL욹+Go$[.[ȍ0œPI% `3.؊`P49RBqj8p)0_{<7Szɺ h|/EВ a^{jx!Y%$DeٖeOP,#ÂxB08Ver2  T'Cd\ ‚p;T'CBHWroYrP9"V& ăP=Ae{Ebj^* k5U+#^ȵjOJؿa}CҢ"p۫ UFу0HVUDyQimP!vʫ+S%o+:v#~Ym:dyb]YU& 1C+QʅCP.w[~d/=Y[+*`_j27IT;ݳyߙXB [Sl2HSejcc4OFk0e3tߡ)S>n.z݀sF Z^p Jj֣znb.=a}FuJu˞?Ϡ9y+\ݵz8^$^T 5qy["r$A<`Z  &Gd}~< {^{Tׇ~S ?$._n4Bz^s_-k<\ĺoG8>Lt>jfGh%cGze*= W/:Sr~ %D= e"c|yЕ~216yՒ8#y;RDkf27[T0[c ~WqAi;_ P7 )%*"x?(mA*#K @&sx2"Ry* ÷FdG.X蘠?k7iPX]!?K|DPgtcBҔ`HZ={aӮR.2b+ke?u7sql#2VUkjD8f,@\2k蛗çYxWY D<=b+1腕 (**"sDb?k -I_"k|"Sj16VN64LQD q.k#!ǯl>ϞdL \z~ !Q7#q:N/˦uJ0EiJO}\r@``$jaH Bpq y{f"w_KQ ^R: ^qzU)/ok;>/S4 Ǽ0Ja:>3^{ p_t 9>e2'ȰO}O|za/p/t\p~J!u rMK>3p^ cc` R%M7?ZQpp*mj,8H8A#c Mh\M>STh@"<%.Jzh+8:+$ > wlFG];YڼHCt@0|q, fnnSoQ LFͿ/09I/E{v] py789áy-geYu$()C]¯%j$x-WN;?n) oyF$Gt}:g\&dh1 ?\cZހ6VB GG%.(U({Rb|U1TCrPydY>}GYaJݥeª%G ` 7̟<%TÓV p ~Qެc01;{[x40k֮O/;::sݓ&]NlQX{ujٹFJ?g,f>߁Tc-=#骁yP@Htb4#z?1w6wJ);Ī G?ЏT1p{]Om&RQ6HtvǺ{*]xzo9u&Qم~s҉{.;}z֊ˮo5PˣaW6$g:IԳJ(VҪu|3g=Rc _`,Oq\]ުU;x"+-ym`G+P0`.TwP,ѬمRQ\s ǔOjWx+0 8C_'AdRsRZ݅cMق&괷sbTZh&gM%V uTI访Ɔץ%m~L;v]+n""mj @*mϝ(զз:Lw:|O\wqhCAnMY'{Gmj?۽] ]eo ߰ ۱[z߰?>V`.*ޗ0VƌX]}vl/ ~٫-2"a>+'aloym/s}F<:w"MXDbF{X2Doy3Lg/"Rh6|‚Z o?"714ʪ>_Qw:?DhmL-@aٸ)aUq5RKX/4 [C Ygpw.4✺VSoww|Isa"=Ydf&p%OrAEb*ŧd1x\8lPG7`IKBǨ̫~G W* r@oփ8DX ʡϜFl/0QLg Zm9` 4Q1Itؐb3$"V/&QۨAxJ3b1&,aRI%bd')GE̦5R-ݨh[MRNcZ8΀Wߪ̞^SUa`d,+áGgRwi䭮%YĥJ-2}ʺbJ^i.ɂ!wr(u#WiCn7vh7fZ\_}A4Q  7j=ܭYA$Ȋ7!Ǿ@~^F & }1rSϳ'{6& jCalڬh=.ymrleM6J< |X߫HY!_yVY&z'<4u7> aW$bW*{>sdh ж+s =  $T&n9Fݬ*TW‰U־}xꟍӃ5:ԡ('%(@cQG4q"ʂpfCH g]B32B:SKN*q*7fxO6+W\ :h\LoBԯ{3sSI(ի"JO BLsރCޗ+\aW0@`+\ʴN)%ɼ?2N!ј:Sѥil_;JR d`hrio:Lƺ_"rMRJ?6F6I؁Hmϕ2czL56Ý/wfsҗ9Hی+Pn@%]|6C ʠ:_1kvr߻|2WL57c{ +ZfFS"Iՙ6)7%U(R+::.ItW] C2)8t[i DNY1MQK ?L4i$.wS;v?:gSTFyzsX\ئ2S%|A'MhqT\@\dY3Wܦ>5a)W{@KLޫs'V@]>TabE:IPC'} PS xKTY|s %NL*E q@kfn o{28941g!t5(N6AIzJU"Ż0Hr1'Ta VQ R]+QWmE+p+o1eO+ <)ȼQvY] 9-znr Ӷq ܔ2Y"+}ݷ0=&[N͉4k)x>Yh2HaenA|([ȅ}n"9%8MtZ1v^^ì6sF1fxZ_)jDCNtt[X?fc҄peZRk֒Dްyڳ|P`L7&/RckE.d4t:8|u `fYdVfThb:&f,Ϛ%J6q $ )ZK]X-Eh5^6D%ì@1٤⌚"ЧZpXn\寿Pl`l_ %Fֆ",Ӟ# 4DxA^RyX+| ,tNT/t\V?Ijb3^M oOzU41 yy*zb$ G8N߶5[ `&SL Y9H;N qBg_*gZ沍}K;9>U+aw&Rmъ~e8;s<:;Ys=\:Rt<ŠvN՘RLe7hghn~k40EwH_q5߼xR``]cR'\` ̨R|nGKT+I}$#'w$B۔3,DQI}->e?wD-Ubi2 (IXP?7n1_( |u1oQ;XM m?50Bw9~vN "[JMJYu؋Q Gs54.C-KP8={ eV3Sl:Fu&*hxޜh)=C F\n9vg}<8p V~EzeU?soJ\axד7dPkq%hXV[G d;W.?ފveeA2^a*c[,$/B4scu$J,0g8.U0*#sGx4׻&Utwǫ8X[Rr?KЫ-e} )Saƞ6O}wB˛ R^?MV*{W_b 6T|#rEo tH6Fthb3^5P ·^.`:ULf}]*Ald+8!G/J5ncqCp#on%?Ⱦ.4E}/lAH]x!uh21gDwNOJ񭢖wl=`:8/``|%cf|1/TJM:[k9Z\" j&6Rꦙ?XǷ)]v 0D</,m*0X(+ uDwi %a[!8[Zz$-(\*SX^Ɖvj9 )6T"0 wCPCQ`bФ7(4+E,r=p [ hs@rOJ?"=`LzjNBi20]U#2Asb471n&̄-fY3 ARqp}N90ESl}$? NWα^/^K[ީ\0.~!e ]~[F1hqxʜ^ܼ}lbbb|E 8pE<Cu`ҚĚ9(g@&5y*;ŖrS^滞X@9[VCC{=tB#ͼ+Qi> AAj}TBO# T iURuT#ޝd)J0.U*% gGG.m 묖T~ȿ8\*4*uHWs; 8Ң"%[*4Υ]FZ/iBRp _ͪW`i%Z&azި+|ҿE% e%L8zD_G)ݦw)Mo71{e~%?n[E]Ut`T' 9I) cJSUVSNWWM. g˧Kcs>jR/l/=}΂G6>G3@ʝlf0F0g]d⻅?XmUvӏt^)QwkU趉!kLULĠ\@ANh#YX;o<%A?(ZQJa  P pW{.E $g4,R< 9!ٰ B@P_A hMIGo<[sDu[* P%\3fy\VPU?N([O(*ťNhAO](Q*0}eV~ %;r#.1g*xLE~C% KIW7ߩ2[TOJܴ* z :+Po1jѵEDAY:<T73+W0`E#i)H׍p q 8ΰgAvqO[#jImbK<9=MlGMDcPFӝU2s=G ΀d1^ͻoA `lCd ڏX#u9Ƿ(oBw< vv~]t!9Z-sǃ%Zn F lsgX *r(wn)IriMKTt C(m.7Fvb&0}ډ!mţEM=?\)g8.7K^olOOAg[Pd+EYRZ(PY.4_@µtL@_rpHhCdƭgU(֝u]\=G\I<ͬ퐳qfB=_ӊL Wa$堋N- .CFe?ip> 2xkCBm6vӆ;j,aNrT׿вe#}3*36ɦC_!_`ڐh%i!0a Y]#MRM aWXbXWvps-%J6qtN˪N彘&hLS^4zy.` >\$8 TUc[fОU^EHj,ȉ[ 4XtVv:*rVګQRDt2;ݱ*V\K6v}&ay ):Uo/rFӢw쩝EoS'L50|r>~6 W.MԽzNL@ZCN^Z19SB@KŁI^]lk.sO%pܥ\/&kב_zW)qgVTL6,.@eQwn+o k<(<*Qi W4Q& anhmFr@BE<og_A<sq9?CP:9Bd1iNg3 1 ,LEf]@zesJM3Ur!Z+;zAY Hٗ>_]Q.z68%ZQh7RvA_;:胡` `6 ;aó=R9^^QhEq?L~T P''E& B3Y6ΕiS um P4-D &BZXOmӌ؏qvNi|;Y]Ҧ'n@NrD`P 10d˒UBC'-]Z^5p†9P7ޠF/ѭ' ` 9޺P}0Ԅ'g6S^ݺ@tOHTub;Ƨɝ8\# 0۬!jQ:8Mhi3lb/ ;ueIb/ t{_vlT6/fҰefÃO/7j,(1砡ԛ|Gٸ,(b' ܀ 8xU&ZCñ xBȦ*>_#rPn#6v{dvZSEd-VA]hMI}MP"E@Mo n|bXx~YeMo;l\ޓT<QP.6뇮5̄ca\]BqxucGO)% ts<K.0Vv2akpJ$}޳XA1>$/EP^4iU_a. U(H ) >r<[[@ǣo6v?]ua^r[؁RSSRDKދ5pXqC͜I{GOXECQVUjq455R,V0n題МGPs?)YCl|73e,T߸NDd{M%k*}~cca}GmII_PR]μm2<eVd"x2ML7NF /I]7M/ڭ |JHҜùx50o36#ʁ9$]Y$֨N[ 'Iͤ`"5t0.]pPڀCCU7At?|يQS-ϯὛLAo h iيiE !thWQ!31}۴Lk-o30|]ugr}F̮|2[!4 lv"97 T./|3n2U+(ٌX*"}땣"PDݒX|d94!.(GVr3z z{'q\Mn0ɘ̤E'_h12IfL&#Ȼu6vAF[QSEoyG,JGik+)a E'92ChRɈPy q耨ǓZ?(kO)"BR`JZ~M7c+*Ŵ?wiy_CI_TBik)j$-nS4Y)``';8ݙ56yub4Qw3rDؙNj`n~೜ʚ 57tfSdX}Ä'F/{"_ c_# U$݃࿪b>Ƀ*j)?M/K KʞXP=S+:/XWW &j!*5n&63/<ݧbYxXmX,``Ic8u^NR?lumBzUcEZ·|7܄B+kp"O"NBBXH.\Třjy99! g]k׋M_:c'U8A}Q^Q_lY=]Ԟo[w,6|lϡڦ G `pGS.{ƔCshd)Pޫ0ސst8fx82AEӅ$Trn~2ټrǗG{ jJ(ku&ş7`kz5Y{-6DFL*[A+)85S#P ؝͉\Qq)ʕU0YiO"PmWϚ3b=nY3<BMSkq^۠V 6GÏȠF:yW<+{ٲόΖ>ioԦZ, ܂x`nbN1,U65'8c5ݧK^_}1/'}uC6݉[=]KCww[8X]2?U+թ- Wnaԭ!jzʤ(V=D&RɀV1l'r8>9|t=vt[r'vOkcY 's)jo쇪Fk<_Wy/qbAJt;psa~z~*AyJ"t˫t*rbTTa]r(x›=&*eСWkׂWf\3iol֘lVrvN hOOo&~mMJ^~3;wH#WgTZ[l,:y{Sw{ϒ#_ޟJUܷ oS{_[S矍o-Zg >=y*=eK.]7*Sw_:}*Tgo:[[C|ݷS񥧢o}T<6_}l>w~f+MN2@ڑ+eDpyNC '<~;4@~¨m@a<2-\0Jΰ3< Dg`3n2v2,g[AmxZyacn OK02e@d Тv IWg2Q̴i,A)&xl\by >.,zrl_{X֦zhK!Vf]S5@W'Ӑg 4$s$A}$h }֑%  sDl&>B$dE>xMIeV3~sVmb ,R? hx[]QrO"[S}'HV} ( / ) +4)_IaDvR0k͏ M]gFܙLgP&|)vbAn 0DCC4() NʾV>r՟ 2A0I€iձمˇMXwB,8; 2mjdDDb{P^ W]n&#KYj')dSIf}MnlO)Oc$I$-C)(ߖVg2Q!˻vzãXFt"ul6`ڱrڳ`Vlmg3-9е 0HgnTmmD7 aa~';.t&/abPX 1aYOدiKm32"z`_  4DI'e$ ,rdžA~0Ųձ|?@fjZw~/ -bڦ"%|i)d{3J(̤<i {m ipVߎ=@ ?Ҫ{M4f{JӤ_?Zl8)wIgJ?MިD<<ŝ#-?HJYGÛu0$ҒA\tx;,/~͚ D3AMh?-#MZcLYv`%v:Ե*|)ḣ1^p۔{F ܽz \_kO٧g N`}@p}83=+%}tRozZLa.}쯐@IbOMrڗvܫ8>jPE1qg ?¯(mlCZgYש[<;,%׮k"awDNPKI9du-hCEguSwٽ*|O8:!۰z7rCI뻳:C"󷳞֮kw[ln~P9fCL7vRIoۭH \׹acXFV4{.܍7pb$M ^#fY{2E#铔~闖ѻ$2-aW+i ˜/| )^gw+\|ʘ"P8Xvk"|\pb- ;ώMz#ٿODf[VT 9~]֓ݹz%@YCU_Rg1t`XgŎۗ> !@'}ҮU*|K)@cUxbJ鷔{Upb6{²rl쮿({`8{psW6ie=wL@$}`vn #dLB&kܞגoȽoKA^rv:l/sbw"c`H%HKQ{}Y>:Νu6Ɓ;sUw&W*IRj <-R$K0f_G]#cH,CVtW\b˽T+ݽ**RڎNꎲbgܙNg:\[[?Ze=&cS!%Z=)8xôwJi4@=D-zx,zV;ꆀ { /G0vFG}j]l>#f+4i?xg^Чn7`\fsPߠ.^gxSx!Lx r6YL<[ե)kP*qw2kD()lC'ѵwˬ cT~9{# φKj~=BȏF<ޛ5pT}AdFH%.އuFiXtV_@T}3$>͆%zq-Ɵ(/{[?d"oSZ -wbsU ~G M?zѵ3tӊw(%m^G7\e7ЅnxW;?e:~9|[]v7{ R 7YK宱]ZܹWWiQyϯ[ړbz3;~}iS 3v޶`Hd8SY6[U 59_yzP,Fl8V-%zdžs׹,-܅zd&HlL;wѴ%6s1εpH GS -n<^Ln?;eWKt1kj⮠NbwWdwWMgwo-~]J Cٶ_e^*-td*nx!.ţ`ԏVG3Rg$-DȆT.K(R#S6g6d 묏.y(aӈW#~7֋I^dgxML=[eYEo@6n7th t%]{Rl}BB]' (jQfoq&+ϧBs߇Rlw,Wh>CA@`1-d(l8!*`REy7$-">㙺gp9 er32C+LQ6^;Ѝ(+F\REf9*SW4+^W; 8ՁZ&*Pװ <(ð彋6E 4+̇-ؔD_R/Em4|ʦ Zh\#*LP׿@S$#ڨϨS.|aAIxФK*EhYUZ=E#ri[吓^;J^痶}J R7%R@bӫUʜ{Ip$@n¼bKsiĐ+ Կ#S8HqAdp2rlKSY\@r?TS2i{)i7&nGmA`5Om5To8h$qQ%{qƎJ[ʵm{%ᑣ2mZ6ĐPCCt/vp5 ҏxGSuE1f_\O'~۝m)|KsF >hBwWeSYWJ5UrF {O'vם]wEOl9zp[Wf-u,Q*5ZAs=yvv ua=I6XAgX$*/t 6ҨyR G}|8Ѽu Sx+n[BG{ChQg(,WpemY+D+Ӈhq(Eȃ(Cf2hW˱b9~K+lY*(dyޓL8 <8]89^N@o*i@*J0<%UQ+hωڝ;[l'Q617P *7-3F[ G]㗸1Sfs7Un?V!V8hZ;,缑1CtAG.A6rzJwĻЕԲ61fH^Њ<7h0SÚHw0/UacdTB#Y7`8݊fhn'^ sh|#ޛE$,9PhwƧk_Q/ }7ggYul['zZ~Ɠ䯣2o @#U)_臤0(0Yq׮;˛:*u<wgd. LCD(I9eK/\b蝎kl3otq#btuRImX]E{VB' {[{&- 't*21@pB!=hF&<¬re7ht\nJ{o?4l̀0pvt[rTl:+69c&B&ۚvAmy=v6o(#B=%w$^9F!49N'y U j޸9p\!*ڄWP ?DU][P7am|FB')ȩnl!&[< Qsހ>JӳB'=ruW[Yar?TW({fje UYЀxhvz*P n"Fk33! Ɉ7z6T)>Aوl}FrGe_Q{˹ -S+c>^B%tϟ޳ G u'G5,S;VU@(\ y}s-g9$Ʌu/{ n2cw+h۰M".gP^,Yf u&^Qb¯`hɹwMI'7K,{,l3=oΕ}jJ^$4"u4:³E wj=o}t :q6@yI<~a&&`1@*0Jr{K8r@ov.OTp4ALll>UЙ<{d-dӉ=ҹ* l 3eI$Rqw 9&hG}}~h]:^x!nf iIn];PpupXMc6Ȳm5WG\9id0=*uځ<Hއn4FZaSl0Hc!hEDxvY=`}U. ;EΔ)XOU܊׿\5SL>vNg4\@v02>9eOh85k2u=|w٣ѵkqÝTh3#grxgn87:MPl 'Eį.ouJCo y3_OySAOMFME&@ lv"J %?.lM8$9gQnpsX7WM\VЇKOq@ɖ(ٌP(+ [Q V.N-"fsxl³s2 fV'ӫŔ) *5% gɉ`9S<. ̄9ҵb'PZh՜x b_$lxiXkuq {V@E^hx\ű^̕|,VpБ,:Qt3G͋V0(dͤ`Ƨelr!y\t/$h!!GȔh'=wrTFie .SMc܀n1R Q@)A:M$M4P}i7A5Q2å^m'c.NjPuDi *rǛ?)c}D]2 SR\t- . lSr@C(q"u :$H) _WWI+2gJYF l &ZeLƕY4"7 (\P@ebg<{KLnnH^mPB7C?;/k<ЅMb*dS6Ss'հT1xJʜ?Ks-S*F%Fod0uwN>=z_ԿGUʦՃhIE7 $YROUu7=!x~nTc?^R':< RC!$Qy0˪Ou# PX" $(Vh#xhv,z5BȌ{ߚ8_1 7e=Bq1־Ww&aClY zsEg+wVְC7ZӍn.Rdj!g6T݇P@F]zYHO q1 RC z peDxYڄ"X+ }9?_9;Eѐ<~VWCzUCuu)Ee]!bw{C!?V熷uKrNnQUnUYݪ ·|7,:*Tܢ4HBXkG 8Y7qNlν~UgUTЎ*nݥ-gTU_uSdv WrZ#\4-Vηs@*b29z\M]=#XJ{G=D ۦ Uz6l3c0_dz @~xߤ@#! ;F2'SX WVY0 i,Les\X)냩\ΌCP1 hokWYZ}m JR7\VWbWU1<Wh!uLcI<9f`K '(4?v;'m2s535 KP^GM'4dlȪ('KN5잘lXh+b ڙ-8ҟe*dTVʋC㦹Wt[ه'FAmR{d^Z⓫ Xub$'+4 Pdj.;@M߃>6,Wqd+2O~P;?@V!pyRFsR{Zo?)AAbgmw3lLw&͢lb9Qtמp'Xǚ`TTjxWhC5 |lќ8u5C'ӽ|O!]ҞꞴxy5+ohEH˜g7=QjL^T0O;3;eSjtޓՠ6)A~YuF<E`ڹۺ{H¶#-Tj#T S4u)捞6ɍ4:jvC)DPpSl)Fbӈ9MYemSk*u[Vq4nWӒ-m+fJ;Xf}x~#Pa3:̓% :e ?Pfgu+f xh$kP|Pj{ud=FzҪkLTR67=y*=eK.]7*Sw_:}*Tgo:[[C|ݷS񥧢o}T<6_}l>w~f+MN2@ڑ+eDpyNC '<~;4@~¨m@a<2-\0Jΰ3< Dg`3n2v2,g[AmxZyacn OK02e@d Тv IWg2Q̴i,A)&xl\by >.,zrl_{X֦zhK!Vf]S5@W'Ӑg 4$s$A}$h }֑%  sDl&>B$dE>xMIeV3@NC4C?f; Yƥ~hy@qB;̣El (MOZߥ ,PX_+ SW=iRKx]݉xH{񥀩a֚Ga4(>3?Ϡ[MR:ڃ? aliQRl}5Vg}嚫?K?Te>aӪc ӛԍ5vYqvtedpȈ @U 8}0HLGRNRB ٔ R*NǔI !HZRP-? ,d=CwFGvD4)0# u1fmc刵gdچ{+fZrlkI,a֑ځ> n „NOkw|[]αM$;_&ŠAbhϱ? eQ>%0 䟰_NMɗ@f>`eD$>a%7ʬOZ_WU~?gK[y- lXSIg+n%n|}-[>4MyEB'wyK fS7#<$fZ~goQI;M&x8P!j$ +6 ۏ{*ZU #ZiIh6q|SB9ؽQؽyxw; !G[ 70`H%탸H-kwX[^* 5fރ6~ 2b[F؛rv;KurkUS>cv|ٷ){)"֖O-rA3X?\qkf(`{VK }#@I1@)7"04b=\_!+֙ŞucG/ W%q|Ԡx1b Z[a~_Qia؆(ϲ} Syt}w/0 X&J>c]E>ps>Zц?pV++$7{U7(qtBa(co~݇>7wguD'og=!#x /,snC Z-.cS|N])ֈQj؆ D s̆o&K= A[ב /:l=,srǰ :ij\$eoČI /:G̲% e܋G'))d[ÒVf1{_@Sr]V.1Eq̃`D]Z=wrY #"Gֳ];̶B[yAr'sa.K ^&a;%L¿$rcӁ/}B.4bO%]Tn$S#̱yvݗ{I/ю'SA<ڵ#|:?o)-Fmem'r=O,2]Q ˋD3p '̯Xm@9DW{H3~+(;I(` 6nGUɘL%xd[ƥHa̾0d,hG XI_ĭ餯ұڗ{V&{U2NU!e/۾3uq]H=fܫ]gxSk0aͽLγ5}sYzq7j0w2X5dtEC_6ɩYǖ+hx6g_WB~1Lͭ}>}Pdog12~$o?#+c9ZycQYpxi6/)כo7C?NO{?)26=ŤlڟzGux=㹪KV84׿~A5nZq E?aZH d>+G@]o1:[t#q$]~X;?e:B1~9,WoeJ[KLU?K dɹ*KeAFߥw&Wi=UI-)yxu;ޏ?< ~bz3?I;x|ht(-h`0rI fX޹W׽l0@@㯺-&u\־նۍnbWPRvڟfЂyݛG/M8vv fnÿ}AixU4Iș. 3T"^@/ςOxG?./"хw0jJ@tx06\Dz}Sک*NSEA[VNC/_ td)kN48K|pnq<#mfԣY,!\cfW*bpJ%^9>>:<=ye}xO߃lR\}d<:5a雰wKyW*#GI{܍+[ Wz]=lE#BH7I\ӌ}+N_a}ް>㣾ycg,mOw5||ז6Yިcܲ % PҼ񨜒UJsj2~1ZgS 5lhT@UTWLy;HmǃTY0\}0 ez}Y=vd2ʦxtݷ:9T;Dyʍ{nj(Z37B|tn "Pu7sh%bObGJ e"; Mc $y>$RN/q;EL\V{U(!a} D(@GAb$!@4*,ΖbH{oy<0G6rOZWWz_:wlu:ޔ 0a(ή2DE0 CɾރvzU綦EG;QuKʹtPo,ke,tŠBӳ8iK4bWԨl%_mzGf%l1S/t܁V+,ۭ% QuPtsӗɒfh rKNqUb 啈.%(r\|Cw6`*WB5Q p0ΡեA6||oPUϺ G!>ZXքFq3YzgMiA(Z`2H"('x*RR2lk#a3k搴5![x[mtΆkG ԢA{YPp3L%t5J Lҩr9_ܪ-P&,Jfɚ=I[t@ãmIy8UH4(γe0u)!zKS@eh#w'BTEqB 9\~K\_TkeusF[80$NM!9r` nt//]&=;lޔ-^ynT)JŗɹwMQ%AE Z{lw,%Xg!JNUَ}<1q*5>O 1\DsG֯jH{GT_\H@FQjF̨Rnh6^oXv@YpjٗAv3/r$_g6G{nR{37A 3˝aCi9Ɣ5gJYVbiu;g}LQt @eB}B_;JRa!iLJ_m K$Ji?x0XL[,F˫LD]. vaGـø`0dd%D}5h%D͆A›xlAӓs0RD hԶ0|ŧScipd)i*ι˶@Qcp{/3; l6:&O+ : 7ϳ`;u L~V/}HCrM~@E<Kϔ/vn.v>,v"oI*) u/jy'JJؚo[7"HށR:xMG3m6hvkϘk:$uLj. ok18 e5ȅk~I \ǰ̏Q]6|׽e^I<&gHRJ|4[Sv)'dls,Յ؏|@7>S_o8c:î#bY?uцփ߃&o m 5nVz[R;_99}p y2v8P2}TphfL'-KξKC+" ܈ y:it9jARZmŐ^3+}΍U}dm|F#%}-~C:V UM<,0kF77pbhCيCE1*@^ƖI5~_^1oXPh+曀fvȵ֊ /-{]O.mN }Hrxdʽ> })C~8"Wo[/i]))k);D}3ٗs%Uަu{Ck' (!N9%2(op/VȖb ͼ}lzf2`ʔRp@7rEΔ=[j5.HoM=$ f11V5sqfo{J{4 (`{] , 7 ~ v1C4hfQH5ϊ7"5O fz(SG!ktds)"ջq@#D4@˔44, =N6)fB[9;W:kDSd\5R(~12Ur \y[/aZ&۵FxgS4@ZWq c A\&`ɐšMckQR<KHRu5 g*u@x W&qN[Y:[8zTT@ DQ%6tBW{ТLuVU‹ V #XR![t9#P E_xG^+qɚWJpYyz.khHљ7Uo޻lzπAzMʾ~*4|+dCp*L sʾ R:[?~0n e7<94 o{eӛE6\L;ۉ cbHG[o6w_/rp!9x7S{1/7{]\7= dg`t{NQ5ewa{{Wc{ƸBmtl)YColst8 e2{\-ӜPcRtuG"t,iZPk!& AT7{Mk5՟АqFVEq-=ibtfĴ} +ѵb)gͮmv&BsnA? rb>SyV[|5/O@*z>}xb&WA+> U(FrrYLI EvV"*[I=M Uaj6[~?xɵ@,BSJ]SzimO( WϚbgnY3i[fIBڹ^2xS C,eFN7^qF7X ZY}A_;WQ6x[wVt/l9~ mNUa(^k3E_4'Ki;Y=`w2bN1E/uujW-qm\J;XfM~#_H)e&r(5 |#E^J%G zI>Ҹ7]gpAÁ+ &X>%%KNm&ﶋknffSI&+яf0p.}6{m_6͚:<::H֫O' y𾾦5Y N׮, UxNZM1/^XG U1kUY[^V(q*FNEe4W5ލSNU_;YUl8uUCׂWf\W?*roD5EdY+^g;3Lr{Ivѿ$*EPW K|w7R70Oo&~mʝvhԿCe(4mdG;}葿y}-Xx~h6z*yϷ^G_KOjkTXT|kp_>{[S׷jx~*}j~Wk>6o?q~c4aeV$M;9HȔҠ8sv@?mʴmi>bӎI[ E~V'~~f;u laF9M`nd4LBq3J7oGgmb'[N+ B'oA㊓ӊ[WmFˑ h3/!6;˂Kahʷ#my)m~p ԕ2Ӊc~N`Us <cJ?a6 P`FEN g؎I3S΁wL;@mepb6k'm62XdڇC;4.9~Nh ` ',Nk B;,sY틨ws ^i8|4 n^,W0ځ!ӆU5Lma 4>HVEtx}~9 Ua L"u<&2+B~SsVmb ,R? hx[]QrO"[S}'HV} ( / ) +4)_IaDvR0k͏ M]gFܙLgP&|)vbAn 0DCC4() NʾV>r՟ 2A0I€iձمˇMXwB,8; 2mjdDDb{P^ W]n&#KYj')dSIf}MnlO)Oc$I$-C)(ߖVg2Q!˻vzãXFt"ul6`ڱrڳ`Vlmg3-9е 0HgnTmmD7 aa~';.t&/abPX 1aYOدiKm32"z`_  4DI'e$ ,rdžA~0Ųձ|?@fjZw~/ -bڦ"%|i)d{3J(̤<i {m ipVߎ=@ ?Ҫ{M4f{JӤ_?Zl8)wIgJ?MިD<<ŝ#-?HJYGÛu0$ҒA\tx;,/~͚ D3AMh?-#MZcLYv`%v:Ե*|)ḣ1^p۔{F ܽz \_kO٧g N`}@p}83=+%}tRozZLa.}쯐@IbOMrڗvܫ8>jPE1qg ?¯(mlCZgYש[<;,%׮k"awDNPKI9du-hCEguSwٽ*|O8:!۰z7rCI뻳:C"󷳞֮kw[ln~P9fCL7vRIoۭH \׹acXFV4{.܍7pb$M ^#fY{2E#铔~闖ѻ$2-aW+i ˜/| )^gw+\|ʘ"P8Xvk"|\pb- ;ώMz#ٿODf[VT 9~]֓ݹz%@YCU_Rg1t`XgŎۗ> !@'}ҮU*|K)@cUxbJ鷔{Upb6{²rl쮿({`8{psW6ie=wL@$}`vn #dLB&kܞגoȽoKA^rv:l/sbw"c`H%HKQ{}Y>:Νu6Ɓ;sUw&W*IRj <-R$K0f_G]#cH,CVtW\b˽T+ݽ**RڎN뎲b7ߙN\[[[;a1=FܢP m~E!7)`|jPՃ!)[I…T>W-CobX\K"*x"uiCKJ1W8Sz/ vR(jN\6=Tʏ[jDhN:_`o~Z ivc.jޟ?ߦٟ+hl+?eӥl6ν7uj#0WOx)`rWt_wN Bh;F}V{5a0lygyy5!G|1#ܓ߇_N?O f}2y=%WsUR=;.I] ڣu'}ɠltcTAfDup`+D0#L)Fwgn *W+(1W-!S1r0.ʺ㟯V75X3LDaH As%*z\P>VԒab8+k:;.$4F}Qhjr]>Q=ܴc9*)ʆ2;{vAU'ѭWOƛ-}A9Nژ{v龺 @\-mo (}ONJ򕇳 <BZ\qA)7>DKY6 [X-QЅWb;fA x!Rj> 'k9*di`-1ξHʸ;0CƤ32ڟβqa0e}0îf0͚Fd*ĀᅥumLb.9O8zN B` diKD9ytƫ3kM {j%i2mW>,FHKTů`xFf9ذϑBgYu`z]75kb}/H:Nb Ca0h 4)>7ϔwz.'UH zӫhҼV`ԢO L5̖T"jͩy7jϺ{!3yA|PʅZ)=NȩV 9's8hA`~6ĥr=e(GKPA㿯5w[5ݬ$A95u :1+?7.b/~t=JOYLATT!7  /j^#"YUC9\R6dnv\(HFb67ܜܚc%&|) xsb=`5&^9Z\ 8<,ס˧haW`(z e 'f L32$_&q4[UsP΀ ^L5y*;ŖrS^滞.zOQ]}=4  > AAj}TBOڜ{E~x~hRƩQӰ &5 r(vCu9TcN*Z5:攣Bqɐz]mhoQ0jZT֫#{};yi(DǤ`SGJי̆9j"Q8)>#׶bbLg"^@灰/8FcY҄CoѿZ>zfҢɮ]rKJp;MBp$.zk@kU2FZ>Ḏ6Q 3tT`T͑^yޑ+<Xa15~$תc*OP& :k8c~YUGyg[] J;qභZrX$6*Fd Z_jw3T?jtA䮐2׆V6FY;iepZZ9WUΛ-ʁh#i Xs-'gI/j' W?DMkOiRnU{Gr5f-+u1԰+K-Vzsj_ ,Ѻ+&eUCe_wvثPMr =d *NN$L_KFc3] x,zZi;mj=Jpҧ !R'2"Ya,+tCS`~\R,А=sµTPu]55Y$"@֮$)fk}!Ɠpn ar29@]A/nXޝ;dS22*fs݂vޞZaMx`:UgCUx}lx dOKmvҁH̀A Ri#4(C[+pm)@-D#^Q&1pVhy"Z{Pt T7jK>Jt'2#9T6창h]8i5ie<7 -/4yThhY>nA7G -K4TT sgrKbD0Z>dETz†AaWC(as֮3o#C%~fƆWbyz?PJa̞p֘sPM#ӏl\~dGBG܋m7sb6;Jꃎ!O&ZCñyv<%F(FߤTkrKT^ ئv(4oM! ׅ>_ WK> ($ Ӭmsb:/k"$ "TzOBUgE9Sh/nU/e-eQMwޚlb) L ."wS zԸ4@a?9]>yQH8F.V ȇE B{دTsqCdƊGD?ef]f9Ӄk7 :$U̅ S(ĞXApL\( ~eӫ~vMw9(Oo~ul0p;{MT|եE2k٦j @A%;VϦ3ϧQK҆ws oxA1ù o hv6^|8ƝU9;+ V5N$I;Dj0Q`\ <8tO\u A~0D ?|j{ڬo- TὛLAo h iيiE )@m'2d2cZXvH@ Uw&g$Av%&6Έc4 lv"97 HܣWH*%5;P0c2`|*R/(%xxq "Ҝܸ|d94!.Cw; 4>{'yϯ&7IFO.`e/Qbtp2 !`MoYY:~MemnAEDwT F PGb07MQ]?Gs"HbL ȼiuL[f -B.`1pM!-+TkQAjT8c5m Խw1(=f7Hq{?#wN ެ̯AM< NĘ(*ɥ.X t ʓ+Xd UQ+wKSz]{҅0 #-QЫ)I(Hv`y Y_odR`NC^W Sˈ(דlpH+mCnfѫV._3"„!˴#< }H{ ̳<ϕf[٩q$2w`)9bbr%>f;[i2=V Yn2o%i\8~O>:Y_/ GGާa<  ft >(ljQ0>KLrU3eoW:KVw8Kc~?PCz5G-~?PC~?PPbϝ]-Fg `ܩ Bq`[iKH[ٵy.Qpk]ZJCY<ţUxcmz>GC,Q (qB2mxgESvOsd2;ǵRwL#ZSZ˪SH9[ڃ* oEX+2E %.Q_j[QZuӠlx)P eb߈>&ԡXs^DށKA9{0Lpp53ڽ^@k c.ZN2A0]i7h02<ˢ;_~Y\\d0 #$Ff J[nN:lQ;i0Tbz}ihb U{r]-|7l[fZ2&ݕ) I.=~QIsD(9+\s6IPy0?xn sJGZ 0$V't^[ pI@w|1 jz@7{oP"DۙOhmċTOȗWDA+ʡ49b[Bw==,Uw-_n/5nlFIltWAӸ%mЌzB%VM:Y2@gzFSY_?g+(FjCww5W7>p>MG"8e\yf5joYa3χE `2X; h )q~N> B} H!$9)B幹5Է,ŇH^_rUcm>Ҵ/ տ駠q'%_Zo<fo!)ԦOjx; o[P瑊ôñ uֺ'u!e&e,N~f>d4Ɠ!4D?A|fjx#?;tOGbTeya(;fQUS݅vyorDFY˟fKOc&藏ZQ?v\To{xlhSnƴQ+Ck4z|~[Cxn*ePS;5BIwV3Kfax5Jw]Nmx6q9wduWvd/Wione&V2y a'%dB ᕴYBKj sSl."0Me1%_hFQqXsiESv_1묏ʭrYu\67H\Kc=]$h:h;.3rM$36Aڄ.ʪT: rF {O'vם]w)Ol9zp[W$"3]^A08".3E*y9X=޺]:-_χQ^eSݭΩ\yl3ۅm>P2N2EأNCH 39ǫOx 靂EYXjjE fUY̱؝ >|Ӷk/[{Lr7]ty$t=O}gsJۇh8S 3k6r\[]ލ[ڟY8Q.3^ܱ :| i;t&yxv`rjJ{d6/6 wOq§ejX~Fr5^e8 4IvS5lDAQov<  x{TVOF[7i mMu͏qp!?msW7dgr~?zZ6TFb׻f5w蟗A[ˉGG4l}=mW+ :MJl4H G511p6r;L%:HaZ|K|Sʑ1I7~DcwfP_%9 Oյj[= ͞6q[YlyӃZLJ7aruW-,0+l=3tre#x^{{$a?kURKl}}?$fLYՙ uꮞ ŪԮϨ I4oBTEc~Y&le3_.!6,ȪtHᷚJD(TgAF؀L`jBЯͯLd =e/ ͘]|:s@KӟDLe&7;v $ҷbm3?8;9+[ZuQ: ~Dv$ʤ%2IQ´qm)p3}+- s'0o> Rpi2t*bk^clQjsԜ>O*YSc!b8BJT1Ub:XS)T|χa:ƪcȺe-4JM>l]0g 1#f.ЮsȷaO>O^P:}T2t2|L|oeـU n>pb0ʽ*yƛMMuh}N"y6{lA٨pkUvı%|/@(&2PIڍ*r\Ag* Ӣ0ޅHKqOS}`i X cU ( dnׂ$KivϛE 6HYpWlG+ǽ yG&lMUؐM4$0cyϋË*0x$3ӡUok@'Rmva7@סG'0,~ [ocOB/jgݺ dRP򨹽B[諌l:8K!Ұ^}o\^諭l?kqdBkBkC!ch35-E95`͚%ui2 0yf&[2frŬlnsh.׃q5Ǫ15"x; Œ4̲d8V8,Ǡ亄T\W ={jvYޛ(%~1JwUc҆sR|U7-smsƯv8إRsiʓ~=,ϗHe3z]k4px53J7PLMli XT>`E~KQwNo鲜dVM=<+W`F|F)R6V9M\.=!z[,3>qec(:θhm [3 ZgrM ,dp[Kpb箸}qŪX1mRI&' nF=" mU,a[VA*Uq#N`]`f7Q,.z׽SnIoRzR2m]vPb&7K6hz]&8OJr1,ä PZp)%9it6SVMyo|m?AVprTQ ^t7uD(&#tꋐc57f1Ua`U$p;V:0Xgq#'&aklqR WK\5PZi)5U:`֒Ϊb[sPת0< *^݈8X%{K..B #K@XfW1"7 }ܰ,t{Jp>BIjϳaJ닸Pm5k%(fUw~Y[e-a1|BBFd̝b̩5܋y>`XgI 4Sg+n!oήWf8v j -Xrg͉o9}{}PԶQ^P2{u]/X km(/n<2h L_r*߈KHܒ䯸 Nӣp*'o'Zz"PrTF8 46146}V>;£9U]/ [ 67mZ ;N&(={6\ROuoȢgXW.Y! 5Dܷ\7HQQJ/e:5D^"Yj`Z99rU' g8uXp3PlzO[F9QvE rg2<ԉ(PR/IdHA#^eRP(s]<#bR6$w(^\_RѲ]!TgpƆ{^*}AbzY{ {o)0 xտn^ewr:hv1RbDJ.crUDY ,}Lz\٪'$F%9.bҋ#qUNGn 65>pIdEo9g: j$d%sN:gJKL5Λ!XN*o⯺-3Jͯsl5vv+2!fMIFM*=YPOuot}dO"h»TXCi]o5ƢNZ\KdTvʭSeT8uh^Q}&Q܂7Ja>U!'&q.,[vpRƯ<:g'ܧ54WA\4p¢ՋQɢpEރV j0>u#(V\8gh$ ^9 Н;9 #8Z 'sq:hV4sK&mр hñsY*CIrHݳ`ŸKr:R+ KzH-߮}|%~y%Mᓄۺ$6 Um+lmYQ>Q"Vp([xő:l20vI8l^ +pX Q(ѭ*(N\ZXU5_jWox95YTSV0էxo\r>9/n)o-[ry_\̨D [Brxb_Ţu &1d*, # źbPlݍe^jan1u{qSϲrsږvKVY%T-(ӵz9i5#[>B 9\~FEB_TkxfM@ SSpxe | v7LݷU/rL$?NWXҕKI.uW|I^e.v5;.ȸ(*][s+fh?v@;)ѧ?4Nœ08|LPٕJ=*c2̓yrIf*aV=?˴QkNór@>fuN]zѕq[trZփ[U4rrbA~ڑHqɘR: P2q`L&"y\"xs(PFMX}?B# 5惯C&™χ$j?<]>ꕅ[ϵ9V@JZ6~ oXƅ&<E uһuz؆/ۺ _lraӅ&ﹱWnwL0u]A}L9/kԍ.-{u?K.ڰ;~{ބu Fm܊^o+޼}ݗB_|`m<3U *tk%/,[ p=)F^wSA\!.K50uX/?XHN3Bo&: ]IrcftC+yƔHT>Hz(FK~?/+ğe-(o+* oص /_r9,nfPTyPTX<ԾDu~MqPU@ _ߍ-—Z/5gUEԊL?J<8ɩ8"Kne3")2n[A7-)4C3/_^oBLՖs f )cݦp?# 7]uBk16F.1@#J`{jfiQRL kӄL!̢+"74 &DhkŸr)P(CDjLgB!&ZmU"eʖJM*n: Jx/Auv>Ű]>E>U u1]%HdF *k֙\wkdH0-?{Ǖg>'Jy[@ij=1%ƈb(8<ϻVz* V궀\~[,< a7~t_S/., *K`qy=D!zے,wvfцFQqllz]iyit>~ `/~;w`?84OAKYN0v-~<).Ipʤ0:LA{ˋ77ooO!=8 )K:>z`#E+=B l (]_F{oDtN߿ԧcNdu9u]߰'WvMw&٠OBM?;0dln;"`SrENbza7-MbN:Rh$Mw|/ߝW}IX?{S~9>?}=kħ_2}陾%4Ufc{xdt`&ދߑ{y)m>Z2w5ȵ#KG'w#/527dn(PzoIN&k-C%qs%qoٍXzxn,/iwMs>f6w=6iׯ2[ RT/)Kߡ/9C{|kr^ܽ%w?%w`_,;5|<պ)ebJYɒK1!B*AH8`VK'C] _j'/u6cJߴ1;\?4E$ݖQ҅,/eeH75/ wOdHᬌ65- wh>b7 Tɢ1^ڼEt~/_r#q7dFCL͡U="ė~rm4A"QZfz|R0,- r Eƒ?Y gm~/|{Ho";bW辳7.d~'kS[L,wv%$>S F'KkfM+h=c77Z9ۏ + a0^'DZ&X/1wY/A_l3xY0ݭ.2)atVXuR&XKʓWAJBB++ÐnQctR"A‘?It>&W\4\PJz9mu dҍ'n OϦ>hC[+lɴkʶĢC d$I ƕ-¯\u_ܷ# &l}j߶l/765OB,[eb\p]@Y~֤v<8ߝ󽨍`| Mgxn)kFRsQEWE;E+{jKhՉov9ejރG\4xN|O;΁k!@N;fџ''׳y5"|N Qi?68'*aSR։6݃ch1{ߎF>X<xpC+i8=8W7s|/0t){WJݢVZ dKK@Зݼ.ɖ5q[$a?~SWYĢF:z l~wZ, ܎X .#7N sh#xSZ7g18>z-t qBw==y6%va Stk5 6K0cZIsL8#g8έZZ5VH$b@i A\A j7:>wǻvfl4W]0z J|1E$-~&n g6!!]~K^D3oe& L7ڬP)mNp 'WwNv)DϯsBٲv CEgRc%5nrTґizczZWz+|Ԯ~98 i#GУ^`y-[>s ~O_fAϏf)ib8胫~2DjGK6A ߲gf۞B;(݊+\ҁwd6#i/M>wWYU aIDyϐo(Qv"Qzt"I_Z|x64~Q>9a ]*7+-G7^Ց9l}ajl#+8궉j> nYZoCmWkgeYDu4='PXd%X2vq9;7ލGgЁǕ Vˣ12Sas69dx^Op`E̺r<nO'o$Ci] s3\_^-sfp܈.hWJr_+L⛑F"=gë7mgkS[.n3v{#'ߓBOߺ-ib]f3lY/r#%#U#%ߌ6kZB&D<~1lk7}t{w--|5|a/488ػnZh^e7ntgR;]nfKIM@p#mgc9Nr &y"1QmFq򗧃:WLߴ-byok֭>XOkME^ ;LunuhztE`q jH'q1KLp{hx?pLC@%Eg:e{ShU5=dvonJi6 voWnR~Nty0tx܎xc inLukٿ3RIW0fOz'8@Oz|rpEi߂G}H? fXf~cC;tb,|1ߊj9]r3Ӊ{g&6h£I&?fz%[a]b"1۔w10؁>E)u4^?kHCb} c48j{?e_6m.w:m$HalT=(ܸ_M6Śz|%kkһn vƵ "OήO[ΐוݸ'/l yL~{77:\D+)Ż+B.\s픺 7g+ݔiinJS/ٔ{-\h ӹ/|wzר)pw+f}r9{ |Wuc(p}ZdC}:Sf #`J,zv9ֈ~[(kҋIucxcp)v4dByI넗!fULҥln^j1Yv9&IyTV-]~YmMC>7_2Nw -7 y͞΀nDo`޵VnY x~A}g B$ߒnz=\n Q~~:}]:lLwg_X82!&? ;y1Pfў1v]k~ȣ!y$xQbb8u;OF׆I1Y&{t[nqkue9qu 6bf#ڎgan/?1=t[􀋿rL~ufqSk[ֲ<:-4eNe9B}#C{,WiK^-_.݄coy"5*^JYkcKomoIʙܗb&ƹ鵻dc,3[m"ϒ8==o@u^=wQfR-~:'m[`-7{ksCq:7PT־2#.NMۯk'ڂ_ǛF[*Wٲg&.C lt:dq cNOG+nyI׀h}+/75pZh=W \vbh=!iYW–7Z1\-{q;:h{sêjr~Y\QxĸyuqCM 3ZЕ}6#O#c";ܮH[h'Շ KVn[-յQcc,ڳ1?d9~e&#n@?X/ɕ+%>1x+Sv1?]}#=\)E \M+}7ڰ?m%q#/ď;gO<'\i.Ip٠'0`owۯ+k=`jqTיK_nnN *7f?r7 +;KY}a-ok xp]޵nAaLdahRRW+3a3'go}FE+$ãUgx7.,|cg !aQsgqRC?ٴcYsιXeNyWmyF/S)l~c@=dZ2Uog^(yWm?2 Zs }1{k6wϵ=Wq+GN\"vCE[`:iKʝV߷Sp#Pٞ%l:gXL| Y29=g_p1d\4{Vo:vϟ Я%nA80š907i&#xG syX9mdߧ<]K2`"F]pҘ!lm'.:!j7 y;diAEr>0>0B+?µ5%=~24C &37U'C 榱?;]Vq *pӍ.I2rNjk.9ϲ2&1tἸ/X',~զV8et~hϽ겼-̱&a&K^jNV@'ˮX]K#5gj]Cåh/\`Tp]ciU/-n[jM:cEiҁG#'OC:v/]ދŒg4sW\xI㞜}j [L*Q#B8O-RsJBYɓ <ܾ8#)ܟ`!MGŻ$x1oZǦ`dƬld/}g!uFǓ3tN?U;쥋(]"dʲmHPp*ТvͦtDws}9|{&?vYm_e(5>>~vJTa\޾6N64i w`82_%=Y-skup^^vGl=Z5Ϗo{B={+Ş))|cӯ@=]?ZvDk75,G}[of1IߗݼAkECz|tRء#k|S9>(|': ,7lnzc;zGB<֍[Ge>}8~}<h!ԢqB1no.n9G-X+xYb/Tvy"?d"u (ШvG0߬s`Qvg`Jۀj mmAKAJ_!(4u0?6$w3`!Ar8ޟU 3H~*!{M,g{qk>Pz0Vc[êoMoTȊ#4Ekq}yBuqQ#--2弛r4_t`]!'V#OkI?T> Rnɴ { poO[zW~GT)-ZwGm~ܿO]v|?r^l^oZJ}߽wk}}kq(>M N:8AKNx׫%uo8潣+l~]W;uhˈdhn(oPn^n=~8<|OtOG?.=>clovv:wW_uկ{4{tD2͓k/ czS^8Zy_8XyMhn.ci3I㽝q{<w;RbiRk;{G;ޓP7tO^x?OLƽG-{`=!Afbv^Fnw,\M/s6 xxl69? {owl#>zw)Nbl-$2ڮFoq҆k@o#\ovnz7ojN`j[{w.l|$W_U˜,%(bh}J'2ʤ{>Õ-֡XG!ؑeV G!? TsAr0_ް*?C3j4$;3+z~uw[Gàwcl6e`6v}}Ńd(P ۭ&廊sdW-I7ߒ/6^9{~W؇[nH5`0 RC6B!@QYZšNQWd;OɇY&V/f4ǏQY4 -yDj+,uCYwD탧zGŋ'wb;7E>x3%Bjw`{u)aϞoG_ i:9zw|a4"2]}} 4nT]_EϬL š=MqZ`(kNjz] \(ޥ.Ia},Jjv"7Wg8t_,!];A&67s/lcWS,\T[ HzcYmdh׎zvukQEkIMo7wz >>޾ǰy~_ƼWd|'g=FqYR ٸӪ+<iSu EViA8ͳ$)I2:MڿIUGyK|yo4yj[@줚P MUz颕rkUh`c2,Gnc8}ҀQ9pYqeDF}S$B=OcJA@1tDM 'ǽt-$!3X GA1XV0aҠ!E B=8N4'My/~ u2Lie@Z[P֢@නv *DMLNg AӺ-@L^DP]BV 8j 䤆*spUxSju,a.=U;<-"-p,sYc%XlYQU4" 99.$V[ 'VBnظ\xP5Մa3d8:r\ fUoꀺhRlOY£ $]pfjyCu?٠nj B:7xRnj6X5CK:[8TUw |%z2e- E&!#dK R9Jdy!P5~ HϪ,T[$k1 l kNDH0 P?qBA@ޠ,EķDJicQ"/D+v ])AZRIyCmdM)#!3 Yє@8삦,HB@(T`ӀBd):D]i(yL2 -KLjTƍ7&mpBt*)٥l@Mub)TgB#)Eヒ-UP(|B'g^kU*$L01ḧ́MAjXY @/sY* Y삄 % ;VS=B\ϾN:p4K`F<W :a u&ZD}M lkHز4r .ǹTQuGـb3S6zrJi!HMaS:^T̀iq%=͓iDXFv*4(YjvIgvCfh0m\⠪"dYR4ͨbv1x\-4$v`T ?8pYi]E8hMe*SKPVr~AV}S8N9PBzQ `%NZ@4-ŨY D.D uzu`cEAOie)Dʚr v6zA4lVV7H.TNr` L;n"Uu #nmA\-2 _k^6A9΂kaBҁ}}5I%H9rZVY&{JMŚDf.8@aqjCUA+>!raA/ 8+zICHdBPゼnb7t9e˞AQC"zTUr3L@Š2:-@tZ۸!r1TS]CqQ@ZRRgu $@HX^tB1;i.!;Kj%rB o=@edH 1cCvjѴJZ~*`(yndq9@<5PC&Vz(ge^ HYɸ-Z0s@:)Zbw .5tJ+RԷ{,TK58=Hv-(@ $!%6V4UaD8o 4v"[V2kq  O?D).RXY7偌" Qg-p;9y&GA`+y@SETT@kuaTKd8*@q`$,R{;Jq *HA:  i7@Јj 1p FBJ|J)ynY ހ#gH Hթ\i$`XfQ$gc$ 1nrBfq,MBȴC6z1 bрQ/)9lyPAMՄEd(tөرAٔ"05 Ѷ{yi ˴)}vd+36Oդf% HF}YLBq3-x%rp cbצ͠56qNf bF 1$JBx5sbPFuJdYީ~Yb&Rhu4ݔS *3N]1Q#HMU vGAҎbsU~ZZ[0:)^@VP%__$΄\DʸP`ƱU5E7!zЂb[9=6zjR$1\4!=,5/ބl µgv6%ki18Le ζy|YT"\.GIoDB,Iut3uBU,BBqRa-<\M_ I2̰T>eN^bi/ipq$iYؿɅ$q{f4Ńg4- 2Aomaaf) r ,I S($bG Q l@K7jK5,\r5B̕$Yt] M ңXU3~!e8zcQ(yZXP%)% ! 4<X&,>Mk k1kZhME{ **!J9 AX&W"}B n/c:h`|L0dJдMkmK؞VG;ƌ Lti*$`#$ c{IiJ%%&QbX8̃ CӨ yg9F>3L00S:\pr&嘦JpBI0:$\yIǨbC /HdhQ;?i_jô EjN4Md@Q" hAIqTϨ6I_& hgPz b VI |E;1i<0e𺺗`Kp8hka $`ަ"561紜KBS%/bǒ_=hJ,h)jdBWmPb0K:AFM4h|)ȣ-H4&=cV +(iHD#HADbbv%lLRd5)H5BK`J1j +l1z9gvZj9[*R4f֙R)2P8\R2tq b" Y$TI΂2A,< JB/%#!CFb 0*'#0| !"; H;ƠZpO.mjMY\MڋXT)ศl@aq9VC%$^N0:d0Ա j"9͌Tw%rkf.9kh.S URȅ{L1TOS `^& u{MEȮi4rQ]h9*)s ^d0XP4 =i,$e acZndDtA)RIߠZ)褴be9c6sQ4Ap &x43:¨RCR1v1.'I9!XJB%ꗁ ~Dzzl53Y4ljCPZEx꿅U3g0K(9ih5D%;e-cbVˊ2U"R2bhql)7L1sc4Ue6!܃BB쌅: *(h*TCľF"ǽ`AZ~5w͍^Q 6B#c∉?('L{*uqJKJRa6h.]@e*K_rj&u-"FUбhEP:KsU6L^cJ]R)k)e X d|Mij,~@brq/Ҟu°VXzҵ1@ 1ejAŬ\uEzIyA{)TcFc!">_b 1{J{%ӔB|ʹ>^v]ȃ]gX}9El䤧p^MȲSe"XnY%T|hJ&v=.b΂!Ak&&B"]N$-% ܙ(yI$M 4VW$DZUs9l{|ECXc+%JwB"Tt#EXV&d˕ ӂ^(c8XKy@Q033 yp\ɤ4![W99AhV@ϵHF*#˟Hxv秩;5KUY!׬نk W bIZױI,||X@I)4i,:lY-2'9ǺRrᰘfu0dQ*7Aƭ 9#`VS jInzR THXdE3SECLb0G`:zЎ* m,?gou %Mx@\ -"bJY+~i%|?^lT)1<z 4E)8ׂdZs3?],DJu=%R2dpO6(T.u`ʐDz‹,SwB'"A!ݸG9dVqRO ͪ9Z1+YH^]2?RQ7-Pgh!oB3dBN1$4}Ejek`b/AXJ jTM,EʨfƝ! UL,ۺLQ#BH2.K:P3%>l^DqX[7/-C1\Fݔ1EeK3ITӢHH/!fA*1gfu~J}0  r!-5LKThXG=#o/jȠj~YBOt~@&pJX9wd,6ׄK ;G>y(J+2D26`1i֊Sjh̠pF^*`!ʕfMw1JAhbɕ\!48Q!Ke]hNQcI3hPbFWdN疊iiβQMxd"V![Y1h?R᦬,i0J{ىDB K bx76%#s:(N}Md0E+D5X$wC_Iv4 3%јV ce=*x<覬>GI0VNR2u 2Rn&RPe/Li fnV[Y[~K QC7k4 >$0%)fްPJ)A]R| DFB՜H%,Yk_)LͶ IiK .Dnb-/WE,E+O/hMշ]Uv0FJeD+v7[3 8t<\B T$/zYUp/[, QOhCI4Z}LcʲX++ΘMt7oC)b=8Y n+ߋn47%ìɀAJbPX M29)\&@Ll`^tA]zs2~Q&X,=X#$1߃T$DڛdYgIH2 ](5ͰϢ‚ ayyl?ۯ{ߴZ#>nAxkF{W1"oЛ$,b~/XGEiVIU,m]&OE>OF^"&h\w ^1 hF7&iϫ~SrxL?ԻboEXZ|,,tlXlw(@Yl̒en:Rƫrյ5)vnXҍe H*.`Wfi i^QEjc2}gOW/vϿ=ޏw^ݻw/z6;Eh&z7.l=p1Shxz?%ߝ]M/'W"?ʈֆFk?ONgDI\t[0:{ϩ-g6l`1`8Rckq 6;/s_Xna=aheX_kKi`Sܙ@R; Wbxshul3{q'`C}ōf{ ~75`=)ݪA[݂MX KYW $ő5S;D2%^AjTnxЋ_C7N~4]N<G{O?\<}!CrM/IJ?=|]ͣӫh~YLO]lFhM Wb~}y§{-pӑ1u.bOa Gzx=Q XןwqEg׳wW89l"ODӇ}s~gp-_=Dm?[o@POy<$a9ZQx/ߢSNbz ϧc>'<ng7:=ƁA r^_N.?Dޣ z%LXLOuߵ_|ofzfvbG b$=xg9\/gWs&YRѣ??Gӓ??[Fۗom נsջ{> w|̠kG~ܛ"D :qtםGח"BHt<7x : zP)"z3뎨wbvg4]f{K/˟\wF&'>Ag- ` U\a$:fW]A@S:dqI n\O6!lo~xoGV>oG7|uM/dSMFQ:(:8$̷Fh&cIKUt,Nt֝(<=©ܣ;u٣h#L7ަqI9 S'KltA滵zqΫm6 Keqt4].4=5|s})3;%H_£yvҟڔރG\4xN|ߧ#1l/8{%́a~Dкmޟ]v90]A~,Ϟtρ|t29;>?%iNZvtn{|.ӑBM<=؉+؈vvwv_%g:r}~rs:"ﵿ|+_EBQrdʅw[/fdhA$ַ}y906- -}e~ܰmm_o x} tݷG}ыgwT[ɽ0%@_H{ѻSҥPəC ǣ諽@«t0my.v9~+!$mGv!9 6T:+l7йl/M]:Ib',Zo]i'W u~wZ7܎`!~b 5n">N:?LwcNV%VX~a qBI 8ov>wm >_lIvwƣg󓟰_a _ b칮kY૆g ܑ⪕wy^1L6v>9z*Ż)I x)G DoQX;mMisIqn߹[s3xԂW&^{ǽo6=zsvFAd>lp2|8A`ٛNFҭ{P lP6 @ao{aMt~y t t3\Dkto| >|y 2A_wڅ:-Im*ִiܧҁF`xzqA'O~:[pQ&89]N LNNWgN〕+ &au b^e}#+8)𶉼sh2Cf5{fi*mWkgeYDu4='P,L ]\΍w1@t1_HqǓ K~Ap}-!RNofnӟ`nqytݞNpI3ChGfDVDGtr ,RDU;ˈ\nU~p+gbi͇SOUH7Ԃ=$޺iŸ-\eJԸҳ1x?9ؾL:fs H Frd^x7&Gʼ$z#-ˑ_F2J6G1?G<7Mߌ6}9^{҄˱kp h1ٵ߲wTMoۻ߶wKZ^6ǰyuݼ{ oۼǮm^tw|m'qpw?"^e7ntm7r9In|ۄZel 芖@H)y$G}Z=PNΤlM.~zu8NꥭWLߴ4BߏoVV`Sk - oVztE`q?NOMK2:7EWmUAHy_Ǎ uHNg"fo4נ{+!Tlf6ѶNUҞ^M7R!{wnrggx;1e!b2YvnyU;t'Y3S$z:].I9Ǎ¹sUe krn n2{_V!νu!:3lKpGϽ g'Fb2lyNޛIϛ ڃS_^B>} e\CZ~Sc{x'=`'֑bpl,h ,"XqZ;\k\}e'>]Eui  X /-C&Z.MYM$%iJdKu~?莮5c#ygZ`GvL܂}kO[HV'_VO%`(VqjYXa$Ͷѐ d ;q].e"(y';Nj-j;a(iHO8Χdoq+6ҁ{Zo=__UӐ }ɨϊ^ߺy^ڼsda/ڌ6WJ,%~?&l{CWf!n-Cյ! \H,oǖhq'!ဇ (=r1lܖ/,iľQэcJdR!SޏJ@L>rIa7~& GC] ksƮ)n,Nex@8_<v;]Vխ`5 k8p#dδMj|D|rw'-ن*uӹLsjeed62w+i8҆<"On8{,%͘@~V܋W@{D K,(̝hkk{(;NMyc{yнɦr&&繎[5U>`7\5, nˎݘ>ўIg0)F p*CdV{:lJy$qL1[=])r.紦f6QNo~ 05WxsT-3? 300tb665]8 ,~BZ69D ,/-^k2'Ѥ_.ouVh}-vY6@?S~i#|13u۳i6;/;i~|Asд|҉ya=L']IFn/iI:hhQ{…׺<]<~_#_G>lϣ˕HX`AnjV#3< vy~l8僝qp.+WBit:{;r4c,4{@Z1'qv Jgv7om.mbiF/8X5$_כƐbSbeTr7Gb8ќ5fh?2f>!+ys}fFOVy@"z.MN-l&rve Gu ^#'xiGsyNp]UvVKVݧ<]et>~r|sl;!oaɲ=9u a8bX&gGǰfarq}>9'0U3Szb=Ņg2Cdܚynz?il%.h6|fM{H͓p"K/F`Q?K?k׼K];ajY𰇎 ՝:˹u&S!o vH}mإGO.#3ϧ_8%`a^ӟ'W6OK[`hJ6g0BK^"2|@1֦0vQ(C){_i@vz=$? {Qg9[8.u(jۇm-|탷+'ct 8}WXᶅ%`E˩ Q.!0܋G D`ML1oeދŒgI[rm7ȁO>` Dњ6 ia^. /ZF:D?-gy(vr񑣌AB[\]ߏ;-){^~巩u틋3ջqtI#V;~m"C& Zṫ˖ahjE}T(J%tS%7cM*a=EvDft8פbhoGϺA)[ 2H$ˍOX$ھ~˴QM/0*UZV>iL.ptNiG@^Wt>rSm2{M݈_St#!*/}@,ar1|;G;c[( 53tΔ$:ɳ F.wva$=6i3FXms:&c?-hE\r11SZINF+;P4Nˑ]j u 6WoyyFҺf ծrrGRCxh[]*;O.go]E',P>Hcgpv/{[XRP՜v6W;,{աw%~`rWk;b+X+IuD9u:;չ1wo*vDk75B+Ȳeaow?_ݼ[>{m}f#cdWL-Q6 Gg:cc`J.H`V!vphSO# J!Ik'Ĩ淑b7/Vޡ^X}y?✗鮧a}?-KK-ͷLDq0kl,XEz `}ij:G򾹐m-wޮ92^(AwpG@S88#y0>jttql` @Myj=(Iu->>/|-: ,`7lclzc[7Wo*D{X y;1hb` 7IBG-X+xYb/T0y"?d"u k7 gc7:u81}ݙ1_h265BJ9CYa#ErG^P;ӧ|  'xGc c>55n]}oc1G)fuhe@(2vgud+|nUTI{s#u[5>T}"ᣟ`ܭ!Q-`5~VZ} S0;k&kg3oAl{Ͽ}'~G\: -o2'‿+#֮6 j/o1b-It6uB8A\^-ߵJ|+:a0ţ$G̖%>i^ŐF]eH Z}6x"$o<9Z##Rމ߰|oxXBg Y|wc[qպÝ{G_&"0J#U\߷@A5x>}`ڛ}5{ʵ,PЇD26#@Gv1Tct [Ho$FϚqWwg0E#$&,dʊX "{-z-+V7.#no]ڭikQZkoS)ZM!fQO!sh^y}}9?$ 'a!"4v1/Ot&uAl"\6n⴪ (=(qu>qexA5N,ImNoARQ_'q>Mu;d\eYu;l2.ʴ4QeV'Ixeq Uդyǃzepo㸩"NdbEi-K9 4)RʸX5Β8ӢI4tyq&Im2&Y^$2lSgy"[`"֒a-uJ,60l^IܔN..[ l0 SVM..*a?8ͪ,My *dG=_رD6(exuF ge^֩Cnb[\5.,Dq6IQ`R`"|H2 0eؐU:h9f(˸2Vauu%e^7y,\bGgG-g@&n< ֲA"(,jlD6(%P:mZgB bX)=bJKjDR0 oTUeuNuoKۙ+`e 3f7EQ[H$L1bm p jODzA2AMt$GitR7p 8h7q&6Ҋ: d%_uF^ֹ T0lƐM1fBUX@a!l18v^ VlPtoPv1!1VY8*YG逃lr^,/wdi)Ҏ@@Zd?4g0,n 5i D9HP;.j$ @zw*աIT TI&I&&d<@PS %UWMRTS2j 0u %Vuֈ_%J';F5a%fqx'%`(oP) n'RobVJǠ1zrr9 $ɐRG CfN)pMYD+ Q *-RuRP:Ae]=@C[ |ը1o0qA1NM,J 8U4Ss 뎲 " glm*B~ ¦up, -$tbI$GKD^ J{A'ұT$iF51iQPdT@a@۸AUUE {#hQb:x5ZhIp?58$K2plҺpКFUNXibp`rYRSKXiZQt%N]A\VS.u"R85@Rm<$9di 0 o\ NvD( ,%} /F܂%nZe׼lrW @ Ij2c!Jr䴬LJ]5_]q (Ԇ.V|B‚^@ph5VɄJ1y$or0:=݃3Ef *ԙ-$euZ贶q3CxJcJS^g"S@T#7LVdV[U4 縡q**^_џ~gݠE4:T)81KvYF kZSR_Nx qL\~<):9J zu"2 qQN?VU=NE,EIc]RRAJ)\&jZe i#w T蒬31DddR(ԚT Niu{e3M!$p:JEGۇ +Vyo!0mx epEZNHey;Dp*ba|9yC'թvʈ -HCQ}bѩN+I jE@ , I( L.8˱bvJp#]&C&wRK81w2-z \L'db!KbƆ*բiɕ(% eQ>0;9a:h׍U2 P:x*+ rzyjX%*L,R!Pʼq[|auS,@]&jLŕVFS;,>o"=YYj.pR!zh[4=rQHCJp -mLhˆ pZtwbqs@{MV󀦊 ʩ4jŠDPCqTbH(YT L3vdKATЃuIorW{@b(@<"X(2ĕFSܲ@.h퉽G`Q*S+25RIpmA͢I.F+ I c"KAXt=Ni%jl!*RYbJŢ3_Rr`%[5٨󠂚 )t-jQVvҧSͱc%)Eakm!ӒAzy<$rr)ZഡqkQFbRJe)hIPF*, @wPL*(qe aXNlBHNlSĖK)qhM!QNZK $2 d(#W5nǀs@t*&\'YOI!fU,υ@[K婡3dfnx Wru<[ "AMpR\ՁҙALKiR',GE-l2#Cab^py)/S:-EY%1 {re=LpBA9.qB2T[V$aJ L. $yyrbI^3#M&}J03Hl NqS cDknBaŔd szl ?դFI*b 6hBzXjR_ %k Ϙ!"$m J"bq0~ m%4<%E\օXR(ngB6X&%ZFby87dDaT |4\^7S +IFe +H h i[+e&Ni bS<#AX(PHLŎVAb؀F*nԴj6XFkj+#}H M4\qG8g" Bp8q3ƢQ`'  @KRKCAi^=Ky.Lh!P[27X |*A^bإ״Ш,Z*QUTBr rMEj}_(`u=:N;(`Ȕiִۖ‘=qv'A(Ә UH82GIJkz$8JJLJİ`q$Qh!De08s,|flk``l-td xgM1M+˕(5`jUuH2Q)d y4^%!Aͽ_)P3"Дv~ҾFՆi"ICL%Ԝhf=ɀDЂFe]z)DQm,!sE',40&)pSMδWm<,vbx`juu/@q @H4k!4MEkmbi96J_4Ď%zєX:RȄ>.ږ`Iy,j飯X$8ꦦQX8IBLIݣC^" ( 35$e(Dtu4$hbpJwѧU&X L ֒C`Jiᦙ.CԢeUz *};*1CS͚Jʂd{]BQqxCuvXRkB E%HI/)Bs Y)ZAЮJ  jc$i/f92h=w>-J<\?"+\F .3JmiO = FvqGZ ~Y@&.U*ӄ)1 J Xh$#l_[ oi<O3GXΌCؒ\sa<6JsW,&8((Ba 3ЛkzF5@jFH eM-*w6fZj'B`HPP *e)z`'M WC4%BJ%M#u2pB̓XwʞaC4@;ɀߔ6" LkPCDB~b &o<HH0%IpI2ݰZ ZX$k-G눣j4׋eBbyvB'(0Rife-T dQ8.UP=fXx-,(dfNrU!ßy;PQW:BQP kڂ1DfZP#I(G8ϐCr7ƜGR_\̲\`SrIjWH0Ȥd?$Cݏ렜1|[2iL#{ Э2VP.>GJ,eq4J٘jR"@k,@, rcBCV ,cxC2 r쒵ԒsTkRi̬3R le( q"ɩ|̗e@D I/tL+eP1& ̃Yy|^JFC.e@FaTN1F`rC/Ev͑0CwAߵ4ؙ]B-$] A dW~SqQkـr4oJH0katȨaXcDr#?]9:K$ P2\sш]8 (b؟TxL)͋N{U=tŘT%?b(Ql(= d\B2@([u :iR Gu}JGE-?Qj!OUt `C 2ޙ(a6tW#UzY~B-K&[DbŘL VX) J~f)2'y٨Sby"h8Sp=ȴXI 6Pg4"5fC9~X',\%z K*Ky U VA93 Z7 B sb-9<`4iBn@Ī>*A $ lš-*SdPQ䬸%:0&If#J=vceYݛԨˠȁ$|ȿe I2lPl\n!]mapY6SſtNEB^%ʻqs0⤞W UscV"Epe~R=5nZΦBބ&f*.e":cHTi *X_<ֱ̃",ĩ sśYQ͌;CTjXuϙvF&z7Te\ufJ^}ټB' 5H< nH_Zrc^)cv-fEmC%TB ^B8b5dUbꔫ&Fa>BZj>ѰzF ^"Jo])A: 6+41#D -#d7M RM(sLXl @Zwy|BQdEWd6f?Pel`>c:ӄE6OyNP /$څ0M}o ,=,A:Q/1U*ZC+E śX:bxϝ(Ŭ3+M+c!BhqdCzD˺Мƒ:3gb%ČRɜ-!ҜeMd1<X$EBԷ,OLc aMYXӌ`$nAJolxKF&tPܕhC`A)VVk$EI# %u-^ hVvgJ15L.z0, U (UyMY}`x(6doef#'Mʦ_x2зP4壆n.(KYi- 1ίRxL,XFn ^QPd ]RAJ˰VQ05Xb *3KJ^͜j0nI#F\6iTRaT ӵ!eZzNH߻``^pg^[N.ޑP%*ėL)4W2D)8xTi`IpcGz2;H[UL:͔wVé:x塚x}>ӊ)(YRS MNR}E3M><JsbޗDy"ų(Zwc lkC%\/frU^Nn-vh&^pӸ-V&jR0&8n(iAWՑi-z( Q;#V`p1WTpeŅj.67ϥI,P_^D& 5DI"m􉔣|ЌnMh':5ҞWM9ɧ֙&~2wtEߊڱTᵼXjeY/VұQ3m硁>,~+e%ݓ&HO#u"&W,!kjTS(+[ݰ7LߙU)$Z],38I(-2Ҁf1 TCx~Err k)9V>.4.վq[4\Z+a/"^D84BaIL-\Hֻ7MPž#qĮZh> 7l[o,"wc 7`HgKf!]=Qj/ɰj/Ų,FDy ȖC<'M#R׍={2fֻ{\K BGmv.-:fOM'#d|O_|sOyq9{9yNgW?=|e8?v^mۉ^>p{?:9zw|t/}xϣ鯳}GNʳ,J/G7ջit9]N'g {-ju،-߿^rr5/##O͛6?OήWZ6uSk?ONgۤM-grqq9u~r5kpX*ɣ Z Yțd(rT+3|>kbf4f[4@4ATr_n6,v1#ۜnZ,t鞱. ̂82*rj{tC?\ ([PeׂQ~uf+a02ptF\ mK ?/ڭw 8NE0#)Tqno Xv8߂SM3mޟ;\|sOͣ!݇W:_M.o rJ,7y{ypx`Gxeos\k`cQ_='0 w1(:%o:v=\݌>8/oD&` :W__Gb&;$#%Q1˛η; ¸۳kH+HӷxB>ؗriFӳ V_2|&ӯm r|=xs` EK;3F.^Z.X XNئ6Mgn~}0?Hi/8NOjA)C;7KtE\8qbkpӋ邪/f'/x88g <N7v4zyKӳ/zOΛ^%Yi=_|#"<~u$ߤIC=IK#mx:c⩟ ٛ|:+/xNAΓ罍-#ApB}:cSmpa㐨KOSz~n7Q  7s$-vڭy}siϯϱh rVU; q}f{SP61 j CgT?QlFfY˅O9ɇ1ۋC!n}{hǴ4leXu|^C'W&WAnϯюgG[MU|89-ٞYp[ti6`2pU7tq:oYbo'c#qa*(*elL{%8jgi9ha&YEXYء@ǓS n~2Ñ6sxONp:tNL?wÏ+h1y|/ts+R\,)oCj{.4G_ƱOO4p/_L:8ی>L;Ovv8 l`_7 EVcB8x_gW#hzy9$\_^jNYg/˗ѣ(v12lǯc/N #4_qxNv>)#m&+'Zf|B$cRq<2:;pTN =G 6| Iv Jl9&W{NA]Nhq_oHcONc(RC MG+۳SA MH ]/axFAoB7( '^N$t:ROlX Azv7iʦ9ޝ;mt:~}8Z_mx_:ě Rhf?[VKIW=[\^\LN=@>JQ~8GEol>{:8a裰*b&~{sÝ'< e f'VѫuJYG1;J7{uKMQ(a'hb3V}[:oūz40V>=6}X>oͿ| 5hw{tAb2j|q|{Ws$~>y=ٓGwZb ą܌[_ǡ߽Ӻ8M.~nX1pn+rk(J8Nl:kxsl9Q[Fxzd L듳)N^K.6-76 =\Dȳ7[69'϶wzxAF!l2pK ^lBWYf ,0rs9WG˸A[f?MD\hbjy?=߸3/w+cc~1{_lF l76z?1f޲G̈~h@yl2 Ęi;±)a#2 nrv_v~+/mgIgpa zz2:i9<|~s:_:pu~EN ck.I o/px9`ygxcw+kf]]HHG:Wޏv>vAJ=+NSi֠^?pOzQjOgTv:=93eڈNg^Rt5KbM<\J3N[ `k#CƤwDx4$ʯ~}n}'_;rcF! a !IybHzjC7[8ڎ^_Φo̞\.De貸bFnlGm/g#;'CmxIH:P.ll fZw=-БOh+⫍;϶_hSVK,j4pzv&ZGN5bh9s<%cbg)Ójv|=<֐gskɪ ķ`5s -֖Sm["y< ^>0`P3^ 7] ɤhxp :3uBUKhJ>l:>nGɕϦ ϝcb5ɴ'HwF/ \ ƚ!3~=2~FA-dl%)"N&W+ZﲝWaMh0k!3Ī q12d0qޑ;*jq>0DHځNT?NlՎ qԼB+QDw?}s;zՅ8^NŁ/Z YS|5}21U/:1ni (#ʾP~m`>$[( 8}7T^Tġrj %|pN!Phq})P3ݺhX Ayf!fvzWo3װv{ vÀe~#gF_V5},-ʋT_ y)Th;bf-~)ʲ]dx uc7lFwlGqB"G_uq}SOGitusfZcEKA3[L9e'D09ɤɅGџNf@`u[\fK-cf7?Dlb$*b>j'fZm\:vA3vh@uN|9}?y`0+g&o'3X#:q ̎tiKκ~ޗ|79:T6owNS5!}6nm#IWPT;UBvnW .!pfq{7zX> FQ@zm"Vg?^c-F!lR33:ou7oZOWZq`ذ$Y@7SQ 7|3p)^JLp4؃ө׏L1Xd 4+?lT+j?6BR}N7XB/.tГpS*׸6͑< 3?<!Їڹ<6ӪG@kJi0hH]g~ۡ_zDtc|K\d2͸82BLDO "#dp*٥ߖ5G}B}[ܱuAr'wfXӖG;;+ZD?ofe3vҌ:%w,%/tS,kv:=ί#ᾡH 0bpj..!=MLjiG"돴*mO5wp#C&INw|.uJi]xd1S'<$Ef\uC̪ZM]zu:)ٙۚٴMmami/9^󴧿:39>چ`@Ƴl)[1OU_1~ )+"xyю>qKZ6NdBm!S;o,QqG}ĵfؔ\ˁa?>?5v93gh kOHi왺 ˊX]e ̯OqF9O/Qb ՛e,c ymܢ.պtr⽥quk'"eo]ʸe9 vЙ3^H7i$NiW}X 7/+3n$ vBz`I0|Ql,6erJ=]U^L}*!Zt4VY f\6ƦK Z-fÐnso~|\{Y?%f52 .jXz{ Dsww2>Z/J\<ӟ]5!N']9u鞽bBj?Ski1*ߨ-mlˮ˖;h޻.1~%5ڄ gtH]Y迯WT\!AK,[nٙE.KI(^ggI9U0w|}I^rilݲw\yks'?vx~+K |A\FI[_dQ>y2c'l\ВSҚ2TA~ tw}"#&i+`f$~p ,fP_k9lrRtC7<^Z\s}jrf-y2|q8>Ď;(V3fPoO+_xfg`We8Lg_R^ 7'K2ĝDB'ER3@L{ؓ>{P~Ej"#|~ ag;'] :-89~0 v3*Z޾E[¿QWbᥓ3 v/_m7ZJvˈ;ٳgO-ѸWYzjtƖxKXO*\ȅa_E9l/Q;gmk9ɟuhrm:Yt}!s v. O&A\Go赶Ygmossb5L͡ˬYutezU ŲɇĨ'uIgH1 _oNlA'X]O[_8yտiWW_m%xj5 ҎYW"[\:GBKsښ7@d~9SViobE]9]=.km}vIn6$`rpnb*:eKw)n^O[trqչ+mKbiyճr)#'>b/d5wzF+}j Z r!5|_ln`8V6Cl1hp<BwQ1ʙ=*\>GkcZ=GMb㝄vČs_|Ԧpw{m>}'õOTQ[M4NS4=b/`we(D(](brïGݯO-ߣePv]ٯCX p+V-@،cvQn%vQܝ3!E^E3GQbjYiX99?qɬMm魜[;ۡ+Eo\})fROCH3d\V6J)eJi>պ+oW?O/76=pzr ycj@bEzC|,+_tru*-;˷RwC}0҄.xW5۬ӗWk߷VẛZ.ϟ77h~}/w?מ]e@Yt䫮&@ 'CJٹ9z2~?\E`Xp97.&s&[8 rXii?'SѶY(=&Q( 7x(ɋ" vw=Uڗ/$\Z/[7tǗ\{<@S(wyoޥ~⧿<,sUh8~8˖,3tOz?ISϦF .PCe~,sW{lbYӫɗ>?]ނat?m;t0n4pJH vU!鮇b~Ə,`l|:8F+?'y9f]Kz`|7~/rNaww~Jl'@SI<.&̫N>gr˦]:'ٽOf.hC{ReZ24bY7'iiы'3>~E~SzWBg|f+T|!_IVUB/z/G7*VXzk(rL/?@u׻W)z"뤄xm}QGkQx2nj{Zfy1uzwhcksHCp %֓2]z:`Q]AOBr~STAMt49RsIq1.xxcw%{^1K}P<پeWvyUmo\Xصfɝ{#Qn:*djPR@CÓhvkk t.km_ ;~:w{n! <]aXp=ty߽R$3q).Qudۮ<_TY<y9>'^'wa}knqvyvѧ L;]5%/§UF}-zjw/'m\/LʽW_nB>8.Y=6@=0`ŘLZ$cw+n>0ypiv!#j>Эq{vk0*Olc7L_ނNWXн*#(!i?l?ߑw+X^#}?18,|[U䤇:a4 ax fu|ZݭҦHDwjR/c2m5^≽ʳ>~%=g-,V?Oɓj5"??IW]v+]y_DO$jPi&tF'emc*?9)ob(:0S'='*ǵR1`_u nOn>'HqX_[Zʟ/+,]u4*d^b~E_/B_<{{xoM='2[L09Xv/ĭp}%\1jvKGuy2?~>A%.f^xp@!p9\JWB/r'rf.g5ba:hO: ]Б=\/l:1:T+KښOHF=cR\Wݽ!_'gE*U<溊/Qs}VSnY/N?IWYky]5 OOݜhFCq]1V@`XWa̫s%R#P`m1'up>0!LYoZAVy6ykv|NMJGOwoVa-:W_>{2h ::MW")&T8Vjiw-K88wjg֌cbk:y aGjg7Tٝ;H 7|\Ԥ TD?'3$fTY/Y]_ w҇ávtfVbn3f6FVozOtV7JjgUdY+/gzﯟD6dGL~QgU<j+)_/u7M_/E"Y ?U^9>Ot%J ,zMeE_c2_7gUm=㴦Ĵ))F%%M~)V~dVjMB&c2ā/>7;2c\9X9~ٺ:,$kco\F^GN'^oRYV9_͚g27VږV_t^vӳ):Lίf Vm6ln`'g lz ]k=ngDNx'nkP.k;؀&#t"r%_QZ?'2"Zxϓe_|?׫'+/0Q(_/""?*W:駷?+OyQjIcx9D xties -'*nxkne&tI'>/2^|VEi[g勽R/~O-YO_ Th+9a{݁Սs6rW_^}]VfW3]+& LЪߠ%1yg׉+qZ|] xDމf1˯{c$,$dsL87ufڬS/8;wo&ᷴZ:ht [|%ևYu-3Vgr6TN>nC4aC[ߔ#[(ﺙql)Yy5ax" [͇hz zMW=ZGpG;3v fo 4xH$EI:R79ٹp_.Gm޺oz8w_/ŗ'v>gV>ggvgg;YLmjdս@գA_l 7]ְo2?ܪajvo4Y1THjٟ߼:s:Mia__ԊC?+/'e*|>ϖ>-9]_d@\|53vbVEq~d./DV[wFp㨽C}nD[ѯ i~e5@4!eo&6k:,_SLSZV|n^lnZП#3(Q ~bw<{~7cUKО֪!*ȻVƉ.Uo7P:^Z!Kk`V+ak &tچGڿQ5JK . 4kP3;߾b|mnn7MiG"\jKǡn"}~v,||~z[/,?1ݸyynrǗB<Ga~zInW媿:S5=?J|vŒ{$x _eYSVi׋)<.g?xq"z ~J1t(n&gN?DP ܕd'w{`].wܹ4 wA0X/ՕکH[ɕ$qˍL'$nf!wS ?N9[RWN[]L(ώ"<{d ME"9)9ޖ.jbFDj;ۍV7umAN(gOګ<ŽC~d<)p'*O{nyu 'Ke#z,rHc#V蒩F-  \}I%oV仝ü _֚ CC\~H)Z@,1vj|RzH ;RƸwiۂ$f\Zb2+̩,*06;,P"nq +oeA0-oIzg?Jޢ᳀<]FUгmp&sM9 glx Gw-w߱\r2CoѼ ɝH86}Ի gm+ӹ@443+Ӧ^ջ7aM& 'w ~ ?i.Q❿rT`~:Og9W gW]Hfjaml9$^H̞(͆1voF }f? 8|/:"!m[珧Gdw S| E+1l=xѧyo,"@[( GǁƦ٫4\] 0gFaGčҺş#Pv wcl>? Bvp ߗ3"D R}:8+=WT MqhLxAS9؟n496Zϐp3Ihox&]"uYT Yi!ca+C[hty5@[VrVL-{D?4^ZhՄ9L­ǫesf.i+w˼ w%X`&7ĵb$_Z6jC%, B;zr=-żṔ{_ZKKaK㦋O1 j.KyClSARqD?#r l_/O}/vKwO7h;#]fp`YzՇC3sbR58%φ[̓J{hx&wbFq׍wRi$~^+cBW[_O@ri>XWy-\f-Lxm!2? FqM5>r>agBO1$FvNPJyTBߌE05$+l`e/C3mСFP1MxL'_w{ˢd`ħ-D*N.{c08#(q^^?O h#vaN 8r|`*Tɝjٛ]`"C4 Xt~-%p)9 y]*6"+݅ƽKm :{ }wjx,B:mRGIKӼ' Ʉ.zk,\w-0JSז~Deneް_6pS$o\yxBv]2i &38>Ov+ګӦZHC֭4 BJz&^gP|ʑĕK3/_GkΨ,bh  " Yk\kqZSW Cq%SD:QUܰ4뷭;/IAIm+HxKep ;JS.(3 ?YxR{ٷP2"?u6HMk / :8|OaOPƵOȞ)JQw8HB灾*QF0B5p;19ݱ y+no3ۣ0r@ :MaIVZxs҅7/'K$iedhX'W0 Vq; F`Ʌ5ʸKSle6&H-e .x-]\6˨ Z0".ӆcN,y$(\lEߋ)&>>L?# on\o5N|L_h4ZAKGoxH%/CCÝnʹXgk5jEgMl;ӧUv1X̹ d%KIĞaޘ1Ŭ&y}1VriYn!1.եl-B PkIbԙo#ʻ&] =2muKCKpЄ>D3UPh,sTLBwg* A ?a, Vt͢g;5`5>Sv1͡W=`i$rq /2"좰i{`ػ3lفI;K>\ep(9`y'㯃; hP ?o+lx_a{_T6ўv\*E7u<>ke 4" ~пb_L85m!g ('"BΩ_)6WgBPԳtMǣ[ߎ`.s"i0XwLĚ]/zTbQ&?蹚 =:\mUXZoU $?/@6Vlx 2; Zs"iX'J̢CPzFهs*n{L&ES,\.]AD/a v^c#5TD9(V਌jw,g0û V +h^Dې"#dw ]"|g2ωA~h7Uo~Bv( Ϸ07W Uh6+k ~~ҦM r jZA2O/)zC/"n>W1l@Z?m4?a/ڨf~Ռ 4#?VV/Kh!.Oqy?pNq`#FAO#Bogqo,lI Tt4U6G}n r耏hIz_QSoR*dLvq(9LZOd&<(v# o,i/sn0J(9k"YrL rHmAYNY!È?dXc^չҲ=ݻs4Mc*9o2U`{v"ItDŽa ߟ:Q ?cN[Hyپ`y|ee%sxyya A;؍1:a~ );@R@N!U cx ջ`ˀ.POMNt|hEfRƋFB(a";[TCw+R;Twy"ŒC_g :A~O^qӟ41^52䲵qu>h3Y1zftӺ 3yU9%XvB0,giMF(cN26y'U"W/(7 U+JU hd bCǽ{KxOD&*n ZYMBެWD_FM54B0L%Jy }^ԷFLb[~X:hm0 U*[{@sHBKG>:R"h4t .GIR:[K "=tcծЙ 8Ibg$#%*^,9|)Ζz/4r_jX7mguω#$gz^*L w1u1)d=0L-z_yܶt˄.wCq^]4"6bL &Gk^ Rin7)n5S# mOv҇ᘟM;mhc3Ɔq{ךS.a|:3}цa nIB9i\2O+=S'kUc"e i?<2kh#'㛇uxQs<}&f]AYl۝՛gӸQO8I\W5X ^}YYG*:hʱCǦcl4/?LgWH؊u,kZչ>AҠ4Q֨YѬc⨀Nu20d2z*?!# h1Еkw+M TοƼVW}1r8eH|B}qTƀD~V#SZ\9-#/c)[{9?'ln99rt6y;XXDžxB -W>PmC!WwycqXyCȚ7~:gsg3 g'g ظl\?r0zG4 $8(| 6`7L<(~Fr#8al{Ul{1Kx-kl pv |!tC’tsYbŧl.F><~Iʚa2Ht;-'KIN\_ZkxJ&*΅L:l?avkOǚRU6u<^!,g3~͏76S"L9Q R> KD8޽$K}A$EL P|66`{spԄ=^Zִ K٪`H}WBx9~.;ׅ&TejF ,dݒ]Q {49XǕ٣ ?l G,E޲DFT)=]ۣzD"y -]ChcOL+mch'cĈft-1Hv altݦ"H Қd&֬s؟;$p JGVz%=2d昋@罵~i r'Q{ m- ZXC+fAwj ci }_1P.?1er ELdVճUʄJOd(l~'\wX-D?gWszϥ\z%*7xn:6Zj6{6d0-^ Sex=g֓.fѪKjsi2A$H׼P S(V _#}$o)12拥i|{.5}?etRWǿsv&- 5XV%1| |n"Xmq|+Ǚ=}U.ۯ^̧PC@.1 >1E oL#rD!rn=0q_ą_] O#Z/Ts++m;[%б:7WhcNXq('i1;F1N?#Hu"56@ 7PCD,Nll#XxۥUkaU)H N1V߫51L`KuCkrbZFubסki_0-{ܻGGn0FdIm-QuQ8nNj[/ ݰJ\ԯ1ZaQiDJI]!LHPV׿:lR:wcb?]DE;vUcY.fBK=VI>&y)/пH|L!*+q |KՁ$B6) p+{ 2R .ⷠ70>?îƔ1Onri7RxVo}'Vj=r'43Vj>ZiX<,Gde"숤CǸ{Dv@3ݣθguF5;16B -nʏɬM7pv\䫫3JLGjLGOd+QWL/+b%m}G[ַ4#Aa! {L&JDGd>,Zܭ?G*UfJEsB~mW"֤H p{z0梯G`C熐:Zn\1Kڀϰg 1F"CfaA}̘VFD+mfusƌD,n\[Рc֥ۗx@Ƭ̬tcV:ژ6fZ#&Z`Җ{^HpO`34$&]01uVdqk)RiiL:S"(O=6j:8?H#!:ΟzLK,!YM3:3dDc;vt><\DlH=6!Nj1T64yXϽFY3v9 ,kwN 1*ËnިT];Phl(ͦ۟Șmp,=rH!m1nlV⺒H30yE$g=X92}Y"$`ݜ_|VHi^[ euJͫNt/{<3AP(mA|ov~m>/ 1D6,zi pv_O;AKU!BRO@J4~"x8NE9"?qhb2 {fl)39!FA*NXB֮0Ťk{WQ_;ZSK/޿{: uĬG{ӝ ^pQcsipOGqf7ڀ/@2[I[̖ ntU7,t5?b_?aX]uSsaJ^k#X~LRW>+7b._Y=@l&adÂ4|u}#hY̨*l]LV=P١ $jb\`=n_h:l@Swߜ0g|iպAz˷w/e&Εd|'oK\`W+:etn;R!]̽W2SU| C@ā~_SLhOj]JR?yW?w2YEܦ﷋p ,,RUsğתA̭͢ߗc)W"(Hm 'uaW|(o}MDp,-^.$!6tG|>Td%;nö,%x{G/ZbZ<'?o/כVa>MzFi W,#3P"DMkgT)&t*arS2 |yS9q4k"܇ppEVEg9MDvWnx|/b?0=#o*hSCuLEf*lS@ \SZ \M8HCA [@|e f@j炴:`WVgV^kz hp kZؐvC{~&i1'Q;; $\h N,hrcGߴΖ?ښ-֭OF% ,Ϗ bpxoLk=-`\p`F 2n%D&24T@"e8>(ZŴ~Jd[\۟Unn{ۃ!t;fUY3aU?d~ȋj.6Z>QK&wz?VCXe@ԇl?- 䨗 3帰Z?U\md'F[n@X| ڛh7g L%hj$:||-FyxBSj 9YaX5ey5r\' ubT4a{[V#CV >xf)3 i%Q:n[X7akY\؎ln/1N]+*7IûQp%601O=ȵ 7Y_[EtzQMSϛ 6Mĉ^=Sn?x^ ߮nQYkks%]~;e򷵿]KniWNowK_PEj9V~Mp75GZyS?P+O.v_4k791ҾIdp'{ g{RDJqr)VA2xwJD*}y>i՚g: ͼjC{+ZIw2+m#=ȅyh)Uj76;23Eվ,}3f;g%%vQ%)h# F;B *‹2,te ]x)nmc(D#?N#my2=^nmePN8GjOF[0Mʧywjg돣t̐3 8fc"@Ab_8=p)CGAWfM`*Dqm0HxuƲ-ml& ؆_メP%Bߠ3wSAFz<ĎØvǣ߂=o)=! (Il*aw|P߮sA}0 3t.ol=OAʅhgyoEv 'GyxpsVdԐDU"BR04LP55LkxgLb߈Xqpk\G5ЦTE6MQss%±Z^@mk֛>܄F57 $jy{&p%u |0 w]q0yƎn<Μ/%.kVԸ?Fa4d`a]UP/`^Ə>U&7XcXcXXH|*O sÂImoW:5n6{AfvM%2ē4hD|=ہhGF+9F)_2PçK{N  #*rR9`5xǷ놂FCEm-TkDUӈ$1{25Vyj"zw 2ْ9?]9oW4p$c':Mr}I'Mr}4YbjY&J=`nNn1CT#n-QPbښ\Ca-0ea?b.l eV- ̄lkv}Aj"&bK`,0YaLRZbUؙ%F^g>s%>t>er[ _X}nH*%[9SԴU H;3N y@Qk#nϜCvE:#ig@|~Zwx7op>$%>+RNI柌>|E8DZ:9\iHpn~O t}+Kqotz6 q|w$l LRU@684Qqpmn<9FO)t2%|y~'cN!(7u<>!7!Go3>u>S?M$s =1<]OT> {0oI‡S:%}eE:9[œ1#I[̱!!qU{H[WR&":'VofQ BY1.7䱌kZF> _#z:V-zxuj Mlmu j`lA'.91p! n:s6+1tXwC[:U7t-d`Ԏ Flp\GVGXzL'|7l?EAQ^mJ`-O>Ws1HsBH~"ب* KH-i)ؗ|m3ƶkuN%V nCQG;ΝFa SX' ӻ GSp,ۅvacr7JY_AbƔ;|F΢.l\"dg^OV!=yi[n,~:ޮˈ [+$*O`+H9X-P(!UtNh:Ԗ2˚](3cI-N5m#$~{^S,HI׳7ώYYOɻw -H$}vZ j]x>}wh֎PVIlS.)a5a>0%HN4rΉ`00~7of0 'Aa&6 &;G -߀J**(}  |wC6ň1g!ǔv8gnSૻw1\6 ^x?6Y@Dv(gc[]w)^/ <ܚJJ|B^nqDvud6J'-,Yı!*(3ع@V L]+ʧyQ>)עjg}78i' rʧ,I?AoR54E k4]Iڵcϊ^R` 8A ;ս5C9seM[ߵDUitO֖[KӭU-_|sNh0y55:14"ڋy\Lh;漡rtsuAd<#k8zIEf8$z->W#%36kƉ WV|N" q8F_{Q%Fɱy[gg\*gWnwB?hhVzm4@ Fm4@ hJdžQ4k2Q\%bjb7wGCᢎ,ز7bˏ'l~aʺNr?kh L|/KR "K,qpӿ%n7 V^z3*T{1b7afkz"&9ID+ATXNԛs[8c?mTóMc3(B.hM~[s-՘W xNUPA^(kDB_und3$fYO ϪގhNjhA5=zx4s( Mcъ_r|w Ht g| OĂ-uy #ltSv𷓜αGGق4~ AxozX2ί{B30uP ۤ+ =à }ʘRi%T4LJ{7|9!bO1 :,HF*I)#+i _lj-^žbObZ^]ALX]XlBbΙo\g/f~5mO;͛ZEdfqcIKMZ7MwèEPmK&\LKBχ1< >gE=r!G#Hn0" IfrS{B0[09`zo;hFQ1pSe7،𮰶JVE}m|_Z-:ߵ<> {?4a#h?ɟvnÓkc|r`!|6@ |Rٴ @A 6ݱ7R=MibS'1Uaqm?RA˱m}z]t(ZA*ȖC(vGnnlO"{ZҚoO\ΒxZȒMsm$$^`=N,;C֜ >|:Y,2J/k;,Y]Tmzх'A0hȹjITA/E@AXڴ|UV>VF–T,rYR7kO[Lmv)7!Dσ*j\4f33.HI3bEZe _D ۅ`+H+a},1b?]2'玕0t&1ING;nĞ\N{F!ui$:'h,H &舓hxzuH{Lb}oF;6;r!]꓏r`Q)n~.T{׎ !cymh Qm;b.c;ܑܖ/߼hE#I[P->Dn(nbJ񌢥 r{i^/GCM@jd$o\ȨUXDv6zj]5f"69+x1 -`3=E 2V:m6A[D]::Gx;T],幰vc^ܸ k ;ˮ}Ю}vm4o,b xB6EM^h9tb12iԣնU5i/Qm Q#gg!M Kn[jhNTaPŶ]da=J`.`>ڶqƿm豶]l\mƶoBM`~Cȃ5| ߂~ћ9xa o .v7]ly2ʡ͉~D eivEm: s?i2Wfv@@Y0'+}>]Q(Fqźmkw2|}1Š 9-ma~].0Z.:MWzh.ǽ.v:((/h0-%r10@pyh4,kО)4|QlkRSF,?U=rJGyDKC 瞠b0F|7}I2؍cu؜FFEG}qT>f Um.2ERwp͝b-w i*QёMs|E[CO/>bE7:'ʫɳo0XRQ]J0!p+啹R^_2>zbxELΥD5u'(Qv@vEL-يX.D_冮pmySsLsɢy͗Jgώ[ܣY3D1}0fL1KSr)/, 9irB3|9 828pC+g#ֵ1p\]Pv .n Ɍre< ,b}20hrHE<H.*x߁spG!6F&HKP vF%7;nԃ@/|O~:-SSMމф^CimM7d\' B>G2[F~"!hd;,wT,v!"m|, ,hek;N`{9TM`{{P{ z.&5]%N41N=?ӇB#Tw@ߧ NQc0ܔe1ʅ1vLRs Gtֿ !Ծ;}biFHiT(K91mwAԂ7@#;b=8. iҤ߇ rPH |(ݏØ.x3^?O汔1^)]o^u!]Fc| qiT(60BnY|*+^5dmaGJOkPfLӯ @e o.~B .O"xwG/G?9VU5x/$; &cQNqTA1WSڧ347ǸV"tdsL08bLV5dtZШ)5Ih!)Kp07~ESˇ5oj,o^7j͐NG ~&2Ձ")}Ь'z>ڿ~/+,!2\sbO{c89 #w;^ƒV:6svl $C7-\?Y_|0_o:y5 GT2*Gy~@'}C/k{0q5k0s-p);(T\g+i;6ccx/PYHZh~µ_6:1=ٵE^`pEsVI\1C$t&_Rn׺ q+/a=RMHWo23 `ϋgTkKo0J`s(J(x,5U898G+?λoNCN [>ɺsx~oA',Dژ7d|';.q]@w)iP޲w]ʍwLkի Wuw"%yL e^zmxC?cEa\8q8Q%Ԥwxf֭ O?z*O|>BJ/PъVEљ?$ yϻrl M߆UjRT.7J[Ž]SbERi_)NY|C%>i|yOTRj eAz,FM*&bQ#%zZ_u<JQ`1=Q~W>%fg ߕ;ڟJ2̢Rnd0AbhHKEk. bQploG1_0rE0j,sf+Tc!;UVWvܨϣ[ۗWξ?i10;ajQŚ_2m.V UG˭\B1Ci?⒥_g}t,dw l5I}G0n(CΩ?C[5t}Vb:52)N!89SSI(yЋ7ޮu&+Ҝ悳\ІpH Z>uPQpuڨ:}e5WMs0nO/ÿDKU}t6<>{:%!NVJSs=O1;F,1VR a"֒3p,F. )N!]5JSQ'Ra[˚PՊ"prB7 q(m+ ڿC;*)l*pgkUvHtbKw&nҏܙ 'MHHMR((J-15&_B5èф 19Ln5;X1ɂs6g;7!(! [aqy)Μ7\_{f")cΪ LQRB1rz󂂉`❈Iw"fJ R9DHcowJ\v=Z]rSQֵ0 X|ngيO%څ F2xmʷyH2NI F`ng i>Xc܊@`kF" ˞17Fi7^%A#B阃Nv0R򠇫v0vUںoc&P7cڟqӷ]g!hwwDT   iה*,6"#u;R@L8±;rJi0ʅQX 13 5Ҧ]`+Y,D.e^?A"#N֝pG6,<&}t 6E(`Fj`:vcfGv?@G 1 Fl@)g6`G&کmM1?";|oh78&# RW{ҟ9Xl$gp˜uE.Ӈdp;_p;|KFHl)M-F8f\I ~M>[{i 5O_S0;"/);i ٜF/veqح5F=9E#%_(oԨLa5WX&Fn3`~(Ə -Ӫ[{ny5g^!faaU:-HY^.h 4Ω(ᬌ O'[lbm؆`2{y^sie*nh{쒌e؎}/Ū=O߮\o:at)HZy,Įئ5+]Qފs7^nniVRԚlD:؎w/,-/#jr$qFfFd`a71u?seBEi^c9[X\^|# Vf^:DOE$ %3|PՖ`;Fҡi,m,/L.\p3 /m\eU{#eWOI lAeN#i:#ݗ-"ۛ*^t^*~눽2.: lXYZBXaM5 Pk^*bD s"xG4Ѡqo9 ҋe$\-poIj*iJA;xH&ۮg~:z8}ٓ[ O]sn"]BG T\GMvY`G/[,W &Z/jn\}|k.m)άJ>AΆz}/ٷ+]aя\kCa)xXW LF]u`yfR4Q }wyEQOK>i{ufg s&\bopJ߇PxW:N-7sTUd)~ &5*ZؙtagJcugјj|--X0j`T.Pk 4~16nácKWuOT5ˇ8Ewh7<Mw칧qaFy 3=RQZV!CAlc131E#s T$A9jqػ^8ku>.\N>_s\@=;di$[Y>Z*7I,h'ބӐ(u!鄊|ݺA5?JS arw]>Jbˍ.nG2صMr<E+ yD?kT rSݭl?x|#H[c6O?}Ÿȣ@ψP9]ecY^ᲧEIZsu/_ϳ9?:@!=o\vݘ)Up?c16\ӕ `5l`&|?RR;[}Y:9Uf?ҵ-] Öj:8Hsbu Zd]Jgz :"7+?N$0zh'7+;<8@K"-N-@Ffۂ:ilP\҂n[vтm^m ۜC@y1xFI|u҃XQb`]Ri`.R}1+Qv2zh5$̱:;9 %MGV`jwhl>Jbq|MvLQow0w0Lx49%)RAAw\`+ROmc; ׀xS2cfz%??M7qzvF -(eq ~+<5{ï#цa#j(!%M#99Z6CXQ_Z$G['}++/OzE(ee"Xϊ^};k.&{}ئ"SP#A%ⷐݓ0G.̖*Sϟp#x<։OϘ7HM1UY7T.DEf1,N ˈevRti 92/bw^XU̙dD7[cf,;HW{[_[f^X~"I6c-ne>0__6[>&vß}mIC[|̡D=}CRD zWQdؒ4K&˞ZÕ@SqO :LmN )o F9 ۣix9}q06xREyi.AO5Ǘ v)G'z8 spէR*&X I?-;Z>_]'aNڹV&TK`ڇa9{?Bm]t*Ng"Z؅qSAqMu+8P?gry{ -(G (L10]V+h{=NKId)d @mk :% ͫeWcE^:K]* A:QOef>۹B*OkPW0 ` p#?( J~]|lˏ*b;5fw7:q}1?tXPgBe {`ن UQND2!4ǸK?X焗k͕\q|Ƭjr*U < kϓ1[ih( +ǀ(k %$ܡܨsꭔvN2L#{G9'3.<\\/ľn b P8_aOBgЗk>"5߼:nԚ!9N[>H")}Ь5N唍w`}=ڿ~c*8d,?:C a_/[~tipϗWq!l'V/y\$9+Io3[j=G΂Ж0yNR7 ϯy{tOgZ9ð?ш {IYZZZb*څ[ˑduw* @OeޙJkXQʝNǓ Ֆ1i+Z8hb%E\ۺW?܂ ֱY/&ʷ%[oX<D[&&-8ۃhc,RẐ># /\֙Yu-cZZuv?Xf+#We7zpʺTp3́kT )T}*/'-!oK3VX0dHB'ԧB5+ W)eRh+!T $ zS)""I~\Tww+bZmO'A1_KER؁2TدŴBU_WxTK\޾Yqg_ֿQqOsh(Je1Rȃ#](.rJoT4%1ݝjwWj=QI*E6#һn$5$(`w귇tJ8=R)a1=Q~W>%z&d ߕ;ڟJ2H%|9\;j rKyPT/w%яǮNEyo_-GQ^rm,[e?vd? 1R69~Hv*~'Gq|~ُ]kƜ >\.ݺ }e,y(.'R*&Z()d1*E9vBpTg̞\%evE}yXU[}?rX$~*(X뙏՝YI>,y%$ZKH/z.0 Ⱦbnuxh+HpwݸQ-%y(uGh?RZ~XQH'?o/8?yyNq%epYo7+~OD~(2%3g$+t0oo);ZއV;ENuDY#F;g Ym<\}CЎy>>@}n < + J I( L+t<_8aegLb+b|΍I9c0Xz[$'ٚ#a:SaHN;<:oMvK>ѡPcF-};4SEJ6XD'%$`$HG5˒ǜu4Sj1ؚTf%~*_=es*t"CFR؝Ā%qWᯊP._ٯ\AS{-UpWܭʂPߓsv VjGx#=7|"/Y.Qݍ:/mn̩ߤ~_v8&}hdRn@`qGϜ6,;8lg #+ f9 1''FSx,P׽*~{77& &wIJM&-ls1&LҧEQt}H Wþ'L8 i}oFT3'Z}b_*\`d'V/zªX㱶ʸg}7\4iNEyC[MJ-]d¾^-Ln#lӜAix2+]שV#@LTCwpTo):8rI:jeۧu'N|-ܝOቫ`a;a| UXm]'G\E_ Zէ\ϩ̺Iq!i~%{pIdKd2{s>1fesYި-粤O'|hPytb"O&ӓIx]]5UʭVjv^N%v1[|eVr4G\ 1,l.m/ ŢmhY-L^/mlt} ƣ<$HqM~}"MG%zA*񎺸@"TNy0x\j2b>7i_PyH{0%c4!{l%fN$\9I`с6- R+hId a[4$6d zmcEyt{>?fK{}c/ oA]Q.S }2zFg;]b]DqȬ|[(Rzc7"+YdyۖsVYE9 ԝC.FЙס[Ww|䓡5C58Fq^^JE~#* s]iJT;p頾mxWjQ~S[BwrPoyTߔ{,!s;\.S(oJ%KHWr_U*u<> ߤYbȷՉ؍́!s6uL2jN-4u5m_v-H Ns!}/%Zz+ϣ}rDf3rC?Y/@4dePlIOWyKw?"AԎgFx^pCs_pfFQz(Z7 yF#mEud fte?:Hw&zZM^(o]xKU`!=}*ͥ]j&wUǼ^{#M b8ng8%7z'olCm>zrSL|}'vQՈnds-h~EE1)ΑY0ػ;tfQ0PV1p҄dҫ>㷔XRtyRFv+>$mWU.西Ɨ.}տӾ-]P=<@>!"jQMtkAI 'VƎ5TyZV-ZZi+̀~Z3{Lg%G28t4-ޢhm( A.Q TN^8lU o;fEoҾHR>YP?B ,<.2Y5 /R`D. n2wH=E>YdT=4sԒ88}|[΍P%gE@(of|~\Halr ˻a})<ԐvrBtЂ#Z.ptB8uSU+nXxMč+ƕgr6o\N )c N2äw-RAn_kcUOIxI5+5nzƿa$3TdsM6u.)>¯[Mo/ -KK%ܻls^0sZg½T*f+%AhxgTE" ;ܐǤzLm<ŝTPROtr/o;  }a1 ,~<-׮t1Fhv. ^pfjj$e}!uqXoi-$Z4T+BRofZߊq pD/\hd"1 +KkWf<מaZF? :xc9?ჴ؏?'v {(3a֗f<;i$"AwO{n\𚻶F ǻ;<[=t'^pL4grV.k4Vt_g賱Iթ{ncҷ$I#6ĩRp]y&iv=5A+x&vC""D^{nf_l ~y]_,zd/k8P8RPp.>A`u"<6V~ K+rve3 /Y2ɀf@ p_/l~4zݣ})FF4|Eɂ2}(DN6/٫-}8HO?©b uO&=丌#轿kj,XSmTE+$p6Y@XEPXEƏkG/$ʽFFAalP?, hlc< qt7{5AMi8!{3:d{ bL/SoQo Կq!4ѩ_xFk2>̋Ka% 8C4ZGa3/e(L ͤiT{: +Iy&&d%H3̈́5.tMj^J ťɹ& @2q%6bf6f6lh , i-7$DG%$(K@wW6"m2GMn¹!39$Osy4ToCeҶ`24V: d-& nTg䵘8^ ޲R${{+)-72cfK*ݾ[[KDrvҊWB'8D ө\74VTN3D4~W+B=t((?<$= ]""x(>T &m(lR,: )>"X(Ƚ*?%TB+L<. @,h"& >8e@ L_f6]C&1"`*(}$)F*pw5*I\ÔXiDHS gx6^ď[ W_ߡBRq&8a)N;3ˮ ۺ|v=󥼶b.,˥n\×ј;q;쪕v2nTB.v/y9r7V"3k4沵}״SedSAɩLb9)Fib+]#Jd zeDV ݹE.PpA [#1Ɓ,Xmri\X<,=NHӻI,1;;SDZىۨMڦZէPCFFpR9BEx=\0 JNPcm5XJ~z芢EY- d^8&Lc;60/F%ƜX7,pDŽu  ZJl`i7E,6}Nw@'ȸI8 /QY,b h }y`e+lѥS@PImeۙZ>Q90SCɁgr\GpM HehCUO(e%>DHPf7oxsoMȪelIx-9ڋWgA|dho0"O Kՠ_I%*Xe> !qnj+KHLtTyo;^v2DÁ>>kEI`B: 2qd]ȏpȟˠ^! gNοDZ_MV2{\I{GO{rOf;lz}׽?:*W|Wyv_Zn󑺋~O_/2)F%v;S .K"|[fB=$=&]-sjIP}XJd* ?+.[(1rʍ-erYτ*{X?*ɷCqW4Z"CZ`BB„vu E%>XQ-sJQ٫-1c*}(*2S/Y-*.1$F[ޑŕPs66dwWH)VE=&T>_iR4Yì]+RD?`#w*Rq)JS-GLU%_-T%](j>V GߩVZuŊV2"fO!),S*pP'E\lAzO$Bq2*_TхRIT+f_]Pw/9-PgKH@JvRT`Ef ܐݢ<ꅢ*3Z>zZ<\S!\x?\ ϥi6"kpp| ` 0 0O |.'Lt@T*]zǃ0ʈ|ߟ=0! Ux[j@8p:P< No2x6ri)S R?ؿs+l@jǣ$yp-SX.'~;]3tPTTקo9;d+/d;h^zTQFDao0pz| cV}e&D/ћ$3I1qAk,@Vzu?vj0RX`Uy.WqB>„,,g*A=rrƢ G}<ٰʂ`bб'Aac5WC@(εveQPݜǓ&*"|--ɱ`IIs8dO&Hmڦ)3}Xdt,(.b+,b3$A=)-#zmBhfkU~pe_H$J:b/XGNJф"kpޝ q{>^X`\, ZQ@r;B4n6{ŝj)v ťo/TQp h6[X,ܔJU-Gv׿dHJ%y.4KC\pFոz㛴 }Ęr1E2%.oP32@wye.D'U)"Be[>׉ubb}%ngMz`|pςɠݠׄdI5YY1YY9Yنč}zD:ϞR dlD]6,KX:֠zّb:w?<  wrzeQ-M;;+<m],\\]4o \ϞRzۅ7M \4|/O\b\tzN.\1n7HyM˨XTD>w^z}m ]]14/){@'EIǃCbnaxyqKQaRr"]jkK=1X x|In4DBUi8ѕ],G+/>ϙF!.On4c5 BĜ@%uŏm=щP>/JP;m83n(C~A>H~oߌ&kmZ"֥&t8kRKǬSj2\Qu; tԛ" +jn@'R `)0Xz*檯Gt|S ,]N\\7V96-tVXE i4WNi1ycy&6yD]VxLF5Fߔj0+K7R!vp=!FR ~N,\ԀK8šFAv sr`܎`B|8 HJ~BCX ҚVSN_iȸFpÛ|\- :[ nGb1uO7BLOsބF<ᚦc7z&,Ñ{9~ td5"2$I`Wqc4ɣ4bHp"ܭ+)`P>BnH{A0M&T7& , xgV7kiUydG#AENn Ӹ H%<%Ah9-DbhrRd SLj6/Ú.ay}m?/IkwM wol!/4xF? -׼鏩iiۆHa>bL=6+HZ٥Ͷx)㎳ ėQ ;Ww?_T"/2\PQ*]ww䧪Rԧj^IUU^e_~)_ws_?٤J@aaɴ}5O>Tbr0]_?Ll>*p*eh([m?V؄9<7h#0g0LzB$O+-1e8T: OA/D~)ʵ3[W\3acS1.շLjjڧjMoo9BF Qǭȸlv+?Zp,yoECzVS!3i.&E;tp5 Qhi .Ϡ' ^} Ma e eToݶ9q);ë>V}lOWH6s=]6(8:`oQ޷;ip*1 a7 r Jz.z@U@dO82SoF:@&0@,Q}0 >rBΜ c>xN7L(ѦHKb{߱:M_QbxͭX֗N;t<;4OoK(7^OWƖ>e Q{i/7e][}ԴGs9 l2zf&:5WHo{#23GF/ﷵ7ǂ>I|AI+{|DQVovVU|Y}BĪүJ֊9(^82υuhgɲjQ1@ŚH9uew PI$ > ?.>‚l yz/΍hާ>aOϥJ >Ĺ]D@CyKoNkᕒAjnVxn \G eo~}4m=,#pkkHGFE &70ʟFJuD9tZ(`_؜c0䬇?LvdE@u#2.¬˼\m lo'.?ANdh%Q@$xj,=U+΃'H,PXH4ΪTvLK/r 2XG3 =&.@wE5qѾT@m.vhHZ<1 $tM7T1PdS;ethm s1fM+/߿5$]Ip5SO'-HP6iH pĹ,v};sTr7T *p\]CI]jݢy? ?ܞ wxAE@Ajɨ~I Êp;jrFBtq9c?IfCbTK4MO 5N[h]_dv•-q)~3Ӏf+ Kb&1uA72}u~i{[C`Ժ%J8pS^2Cvxi$[X[LoK<³mDcm݅v0ɨީod0Ѣ^.˅O8Rq')ѹYF<=?cEKtIJܤ\uYRw|qk>F Oϊޏ0r ^`D7GJ{3< )>j+pZ=I L3 GOn*h1]/srslೃkIE+K JGV2aYD%8Ls5rDi*I\' dOhmS \]w][?=I\N`Q\+%`5oӁRjO,į&O[`o_!{|%^ s㿩q[ Y U5 1pGKp t6p-~_C;aW>~Yk`z J6~m<0vgwX/erp{¥?J88r@/\LZ%]C[k@f0bwqqп+?Tx8.8}>"s1`X43&w0pr+v%hf Pg6@;ܵcN0 `,]G))˻<+{jFw'7+p]'dUP?p&YMx AO`_b돡C9u!3ᔳzןP/ Ei=y'vG 33:cلnB֐[r iuOPw_ż7 AAlҊ~&xƅbPYLi6/YqUMxTBX1ߒ"GxɿnS8nVkޑưû6?v"41^ ; h&qx՛D fV >`ACDn0ww<&V@Ћ֕>3e $eGD~ؾyvdN?&EGG n}}μujTȧXC}-QyDKE71q"靥A_%:%ҥ$ɢuQ"}- ML{F]A7aT3Fx ɎG S ٰGFyG 3tP۩)HQ]MMEBDTA]^ɍ{|!Y"2jP~14m"z=y#| +p͵D9nkQ#k&b,ܲ|krF{ H;Dg1$H'!@?\f1oDhHqNY\Y0QpaNjU(u<N+81!F[B݁t{KJ10iH F0 *1vu,R@}> ᦏ c7Я.fC3rTpţBr̬l9Zz0걷TۚQ"rdH.^ HVg%UI@ 8=p2o&My4v8vuxOlǨQ.* V7h8CD`E8D6e|AtVZJ.` B BD*cZayV, t0!eň-}T-lG#s@V EM6 yAݘ>4B*8CSȓ"pp R!dԂ"TE SDh]j]]bwͣu_)jΐ?pӃ";K©_8ۄ\I\zD36Fyii(V.k& 5Fmh\jFl ܪpk-]48*iҰZEU1>?2upX0Jļ⣞B}2AshD%Ũ͝F]z˞Iq3?@#V z݌']_PG^~M?D_͈J5ftgFM3ъ1 tz-4N" K,iż!cBc.Ƨۄ,u?]&ΫA_6a} kwmh9JE9=*,/BC1,8 9ꃣ(Is$+_9 8Ӱ;UBiSZ#0Htx/y[Q8h-irk>Ll#|Cਾ^ 궄LsM>Tk~)u@ ÀƲMNM|Fsg,VXºYޢz@80}ÉØ8M!տ$ܮKipҴe;'^ nj SCvh=q& @+CE3Pp\0'N=HF+~CsP+!T#lc[(( |0 qh`PJ%{e%t^AG-EA+S~Q5Ս0?=Yv=鎶Mn6Z. Lˊ8͌cI;F3ފVcзL4)q#RG-DfG KJ t;Qu%/GzM?XFoZ@4c1 (tJ7g2ȱ 9%)7sMuԣ0i &Vhkh.W)82Za].rZC Gd`w5͘5Բ&QQll=VZ*,d%A51Ƽb0r 89Wdįe)^"ZcG^Jܻ'sѤ uvZ(J5--ΒAQ338~|{8nf_.*]8.J.O]>b1ɴPL;^ dhFD݈q9 S Q习a*OT $GT;]ȝM+P>y}%JpuٝhOAT+Zx?c PBLuwEYbGtEx Kӕ yn(8&HQ3YO5#Ê9_b w=l:fnWȕs&B CY#(,1 z&֋eH?/%Jqx$&AagG]eJ)*9-bnl #Gm)Ic{hysJxfj{gcŕyFq@bBpAF(Mh -ôVuaZVVC]6]G$]݂"- Q#!}~+0R=66$*Ѯ,K-b E,š4-Qd>Ҙ>&4ݪXlTELW<\G+nU{|PN8DT>>vLeD3:l >KL" h(PBPUƘXpgU$DԐ]A^YڱS#mf&6RR5i%21 Ln(fɊK^+ѐ\j?w m+R%' /rW&lS2cgyypaTf=\*.z/dN37JT6q X# t)sO kiD0G a譇w2r|t&1dRWgNۈ=7>6 t ׈h!C5"q" dŵUF v?261'w*D֥u+íH"Sȍ1m {_p Rʕ70L{JY}Q1o*xEquoKo,@ƄF٥didQZ -V UZUpt;ni~۩RTrbi/%Sł`,NPI|(*J,`a%_TIEFŝ}GtooBo5=X"˛ky߭>;Gsb56Wg0Г=W?O"}NsX#G84gg;TAsaڜ/:=ny`s/14u4D3$S/c3"XJ?v LrqA8zCC(~A_O.d.Nztʐd< *᏷1[OL=l4)F: Gi$ަcB/9]E -h&}L? _ԭJ!cFa9 'F/koJ}aƾ~caTCߐ=k&U<ƒ;Lt6z]t&\lk oaxt8}ѷ0ljrL^AK@) 5V4sZqx+(Un~vc[~7<}jZװ?3Ht{)ve:}Cىg}rG&;F!޼ čR>AD ;BS8IFFHɈq g8#x<yM(maoř<&Fr  6Yķ16(og&Y;腳@QV΋`@TJ4s2c4p{JY|d8w S3lZV/p\f/*/dJGvk@rm\hgA ASch3^b Q!A'^0P 34ˎaGm"]#Q> 5Jͧy!)iM[=M!( lp 2kOe|ǗE{;Ih P}8呮MbU D3h06) B*SW#%DX45Oz]#̡0QW4EFbŮ-qZo9B(~ \%\b CwYxZ+#1܍)WC ~DKBbi8_V?>Ipp*1ha접3<|қ=2)Ŵ?ٚaMxqC,z!OeJ@(hV{b,JƓB}ο~בȓ:b}jK:SF{013AMWA̚R&o2l4a6n>1iLV\wO ̊_hp<yJL7pIw _ӻ,GVh FATh{+#lvYm׾"ImUv _ThRb,XQ_"72'3`Rٓsi!bOC-ۉ4N2Zw݄/#4a[,< t7\ ߄"`YNT, GUؒliQF]Xf 8Ѝzڬn/9kYC>ZzׁtXlcd7)u_IM[͉Qfr>u"RrӬ~&2rIR#izSΖɀh?Ec&R'3|`l ؆1&\.lXyԢfl;s$`#`XmN&M3mFɞ̲4Y=}VTf3L j6["v&)Vlu 괱#R-ʰr'KSVޑXĨoV,w7Yucr_sas9']b?[${Mcj2=>OrP5 HS"MX9bhg%~nmy^B8j؈RqpGc'(>{Hyxw| 98(*D652B"*OI5s[l6ԕ$6hRrSOsh_tZXw u׎pQ_C!IF,$^5s>>ЂL|߫&)-pіX*Hc+}? AYjt;筧96DŽO)bW)CO i 7/D쿧˕j[쿧 _Tl9VZI"#釧Jfwu[.޷;GsHD.f=yfleQ(4zS/3.yz^]eà0`hd;^%}?O@gC7yRF6 Ό)ukE4,hyG4qV>{멥}~eZ4YOsqqEu ''OAL`si?ř4:lu=|ѿQF;vjjЇ /c;9mLxaF91Z`%ZBg%"JM+[/I3C/5[y%ǴdG>FLDK \TS#QbPNWrZ'`WopiJcC/C8}Tȑs4ynu.i&#t֧gF2:t{1aXՃ 5ChfS6&@MʡlZ-2<Ϻïbp7tu5Gm1cV;Vj]o0Akաl7qۍͺfXfYa]?f:$q ia v7Sj2.W^)eINա\jp+/i@H} +,WK^o]sUo*bS =pDGg,:OH#/`Dz}^S-|陧B1̢ef7[Zq`f^[SXtq"BzHOO&ɞk+nI_0luFr:A)w6g;y \rΩA !kiصhR:9U:=kPBlt18táKF$+#~^B?q!QItQk.32-\Pg_;|n+7zPcǽ3nnYs6%SmfFΟjSA磓wMmXb^o` r32+ ߬h=݈giZJþkSyCzJ7sO6csY>|UF^V8cttvGWWd4*:}=sYqK%P D?e Eǡ5($t4݆r|6s#!x9-kQu,QPA!Aӡ-c:b_:3Bvh 4t`kD.1GHI;”m̾^bt0fK7U$BWcIgA5_FH&aGaB>)[ JV@:ͭQ]h  h!9֦HDj wcC^0e{yejE򶠌>mT/Ix.,af,Ow8$F`8 7]2KWOp#'_ayW^cȢb<#u7QJs ?p<+JIz׼=нj]?`4o~ |น4b K)OBe뾖1',ߣ̽2»N@MFd-CdQJ! U s ZF% }8?A{hW$:p{!pd)#SgtpLէr([Ax> xyܕ%ZG=-N]!ԅ(黑x3żm2~ҧ9L;eR!}TunHEG-+Nֺ*D,"&ɐߌuu=TkXD>"GDQ4qw+[)j-b1NNW"pB6y~C~}P 3M|.MӜAn$NzAqBM!m6dK AaGq2RǧfaʎaB̩et|Gq|?3y3uMXIPB帪,WldljnTKLC;BGӑa bp|yYH?[&bcGpگJ3Ta B>bVag#VYN1Pxǐ'Ѩ~LgPg~z?M*lMEnq߂>`Ov@1Mzj8`teh- .CEL>ЈmݏNE R(kݰeRnҀqwBdK5 x"ϳ?Kb)]y&gqϞ l G 2UzvFH]u@WzO 98o2g>RareOdClwp: #`6p SFMa9S[2s1>mcXQH?BGipEǍe_*P!qvؤoT0OPRv+r%!4{PjճtMǧ<„p٪]* +rM%VHo@>Br8c^@R򛹱uE̮CM$bţTMKaOe|]^;dF7x6Tz2j}bC61 |=,Wܗ6:=[tbҌ@&*^)ʐoS4WĂTR3dS~1JWZ>ISǖU3CђzpZNe6;dNT/"Z0QWXA:Ѫ,453on?nw*3, .BGA=ѳԾyK>j8Za=z6(B-N)m(U^4𚜌h^F"MJnDh0e , Hž:bqu/z=4SPf /,tKYMDE!M#BK?P:@*] iTH7@*poC4rBiFahE)>$hX r7R2N%uMxLM<SR"W8MzWp#e^ 呇f#v5T k۔p$~Rn,pܲ }1[BJ yFw+|f/O:U|d@0|\ "W!2"O \퍂^Jf?9t9Hi|r)jdR(2G2XEt@,dϊ[ٺ]y覡^.ܙu ;]5cާW]Y {OͭElGhr\FеG|aD~ 8ttuOȔִNi U~u2kϪZ딄7:V=7oL_gRP. @ox9׬1ctBxs/֠C!pT5(5hџx.cȲեT#~]4hv-2q5)IA3W5E2vΘe|JY1X5Mo6t8'T^{=R4?I$t{ZE>)qFꝯٜ^yy' E\r;)+m= Z|j9̿a?F ?\X5?F΍kW`(;*MkW߿~886!=Xɹe >>? (D5qsAjvfOލZ6sX;BJg2q|/7<|~ͷx9w5SG0,A6o/ڛf^뒋=R[L%0Ls;i_-}{ 5ˑ>*u b@.LmO:ߥQúGn\p_Z*ڶԂQˁ."qdK8E't0&Cu(A v d]Ŵ1dvLس D$s(Yg7pu'bxĵq" m*+?λoNax/ӪuO_4[E8yNB4" ,_߷r%~W{cs-^ us @f8=˽|%õXz)-~/,Rs&@6 FЈqKmwQd@~pb%Ss݃ZbT2W JvqH̎,+c 77]Tc/GI@)Y3 Ͽ0dRFvv4;; _,WCP)wˏD؝mv牟(ݚre7xV{',_ ^w䫇D?YĨl~wiR8\F9f(?B^*Ph7H-+3.̅i'|E-}{ p@^kD@F[w\,TOESbCO~ZCTd;.[ې7LGQ9j1Pd Eӽe-B.89҇GspmCQA"1#ST vXPhW ЈM 'tڴ {\^CBC9)]̧{0asq[ ϯчFLJNC"[ 2&gŘ}{TO7w@>4#zp=-S̥vD? F \ x9E7F$剫jh'1Skᱺ d<FjQ5Bc h  )t(o="JwEx!<"ܣ:[ .tNEuUݛ4A8"$ޟn\K;NQ(MwDHMoҔW=6@Ϧ绲)aahQ@}"MTSRASdt hr-R̺[o#$@dtnj3)md>eG$ɻ)298܃@".3%L?{򘔲#`hS+$ Al9b Ӈ)l*FsHo*b;#SgY}ǎ؉+0KGh]' lcYCGdxBmDHIr\ ̑fi^l]nA9_Ms隵 f-2/HU̷E͢)˙\(yŰuב0)BC#\ct{$n z^l/6ƣ{@dE+u) ;c$:(Q.Z`"͇;q=T'몽{Ah噀#)A'Ɂ)(gzm[R O&0 nAb2{( C$댤p$$:HOZTD1B~!]QdmI@JN#ļ%tA4$AeG8hDÕ|+c'If&~*՟vBY:'cFkd?Bޯ^^?Jf=ЏJ Z?_v/jA@eVhԻ jVmBnƅGgS_:hꟍj*ިv~LՎ6*'Wߨx6ϯD?)VK&Z|?i^8瑍g uxf`D[EkR=ۃvU?s~Fmy ZZP˲~.RYfƼJy_,}Q\4[ʖPc0s:K/J+ }qAHpÉ~uyK$] $̈7X8[zet~.PAC0нHrJblB;qL#$mcJ†p9  7Ϝ[i2([H茚uHMϢ0~k{85aԛ3l}f׻:,"Ҋ_y%K=;2#5J8ALH##sÆ-OCE#yE=^!_[u3uCh"Pqw.x^eWz)u(Q'ȸWCNj6-R=@ki@/f(skk׊)ڇgy5qĩ`ZyӁ;/gF̚U,N!L%rLx1W]$wwCPv 4N.]W{Ny)Sv雝rA+i*{eRqBhr ]re.hZ9.i}> 6D0Q&cjyXaAN-mg~6}*AQ(w0*SNm3#c0ـx!x7;BFjcT*gWz6A `5T݉tn!mz@v'A1q4E xl"FG%mPnC-a{Q JF/q6n9gODsnR٥)n.Vs!.l'$,GTK 2Ow2A7C:{[;4R ]Y ngtoG+xp~Txp8e84Y YL>I2kbDJ0=s9O lMIi^ f08:p=PQD@KK $-oM)΍5n*eϳ6Ӈ;z3n20[ 59up.^՚G5+ߠ 1 ?εSt?Ws~]+7Hs&AUzs`%PE p턟"Icw;ij4}N:upЍ阣넠?71 :3p^Sig^N#hZY1xF.ց431z{!tQsbjoSaxսt:܋9=1ژ#Y 3nBh0z̑t" *ޭUF%>e-ˆXޮltFw_X܇$|jp3D;6.SZxM򩿓R/6is) ^XK{@h,#)@35 [zdKyG椖iA1 t(߅O9Z(s30ݼh}(_S;UѿKoj#IOQq aIn~Fl3s64c!͜}KUuUwu낐iw.]YUY_fJ:\iCh lhu RŞ|X:mi T& I1;wedA}jI/2{ v+y% Jp,VLMceFq׼A"sGe OL i壑CsXe.̫)''"2wȨ{E,mAl8.6g˟r 9)sa ~\xyNk S"i%Q $N#c\XXқs'm4%8ss| ht A}sYg}9[絛F$sY1g&vYF1 sn5&j)e9vrvs$" IU#@9ޤ̈́zF U/@,@=i` /o1N/<__}%כuRKy 5@fXYeؖp%J1P%A99/5=%JwimRVhY>n颸QAр;)XxBH=X.SDd`7'WB)z} |C{;m/ɞif'{ަWs[SL|y=+?#fԓߡ36-ݼ&uk^i H.@jckj**:%5@Mr޲Th&Ypnȭ7Y(F- |@ceYuh%g # 4Q(Ӓ* &9;ݧ'֘?~=n "i5{5 Xewyݓ0 !@U,!ґmޱ(Q hvNUn}\Yi&kR(r_zx QR__=%˱]yZN7i5gS0YZ5u3opOIEZ"[܊_d]Rpi*ƾ>SML]=bcT͓W1 '<#KysQ|6٦\`kG'm˖34[̜J*@iĤqpa4_o[$1JqNpO2!k ДOjg pTfNs0Y E*lҿX"pUY:u݀UxҦgVi:v=> ҇Sl5[:ZKBaRl3N9>($ i4HD#9@H sX,/ eQK /ivdR4b\&p5؅h  UQ-;^`AnD fEk@HFP<o 3 ^$P["@a@U'IDVu/;&u2 @\ ZB>PeQU#oژQ*az_aI;DAcsL6dp!At|kي|+f-y譱n%%)|`\X{2Ay.6C)!H C="'Zcs j:C08 BXҔ*yw[g{%MDIi0T:1%g łLytQ9|ph.Ԕ}.J.7fi[ "Ҽw@ڇJ~COa*q L®> S}}65LxqE6݄a0 'eI62:׬'C clФ<ϷEwn"q* nn \ϙX%#|GԾJD%,^e\݀2ѷ䒄 nu׋/I(wH wYqwS^yD 8A+)#Bmcy4/|vBhMf2cT}gBw7o¸(ak8 ^ ;3'Vرw8K^P{t<P$5 ]`Nm^g3{Ǧw1?+^YMo+y?.?Gc<-F>Cpn DWzP /jP"En%]RUqeU9~n⒆Lp-GW"o]n ȈlGM."@$<* ࢏{y[`FJ s:z:i~-Ju mȗZ+%/W RRژƢZ \ap-4գZ*,bź'L] '7~ql2nu!.%".4spй]Qಷ ͓2,>m恈8\y>,,Q}% I5!딎*!U FEJA!A$kJ"r]:r,.I] pJ:9Im0'݂ p3'(cu+FxFWDny#ڤfpMDXU<3S*iaF+G/0V+!}(n+̅{x'kPֽ-ƌ7͌gBm O-L #qL>;6Y~W]wDPXmtv@ΗyoHy|:]]C jGps7>T ?Ho)*i?䯉=lAno"YvQ^1ɻm_Sbhm !5xo|8 J“,\†.;(ilF(poK9s+Jyc1{zW/=QFG?3\uӺʇg(8-geMqvozT'cy_+.C4;x1lQyjܑѸ#lܑqaǣ'&fr'Gz[̈Q:<\@5i!n/`CLj!r;l2p*/<NۃzDk'rևهc`!/7NZg"vLwϺ_sY]HЌhªڂE)՘ MDo}۠U\%EQ _^tJ&5~"G9iJ]z7UyBͨ|^f=ړ2r]UEoW7u~h4@ROFsݨ ?5fYmCZmHJ2<7_|h!~o['{%" z47 z䐮<>9^a&F[EרOB#ѐ bLkj(2/YiiFߤYr)TgAN/fͳ;͎x![;#uBJa]@cfdeNˏ 2}5ؑd**X'9Ubf<,! K%GqRLQ\&6!7,-*X]lo6UYs6;oV 668Gu/6- +Jo/`sa_"|jUόϴCʸTQQAlB/Z·/4qjLXrԗTDrs#Ϗ9odx[>(~; { o$.Io+dYŻ-(iBLfN1bןwp/RRݠS!\`6R>Y"Y0"\jC˵pP581OvR ZREEhC`yD+ݜO<6$%OGb WJ]k2x}+G6F[1\`[02!]b6ZT/{,cJW5FzDEhew U7=&9~ 93.S[ JExZ;E,lЦhugrS<ZSl:7|~3C44`HaHw'Sqt? 1ӽӔ>#y3:$/~t϶t\^ÓM.w]Lv/lT1٭< 9-ב =KFp #1ap9u-͎ZG-ZJ?]{O镆|'ސw^Pa}]%0e F*vM=f(* 9FCA= %#d,cR' }8-fʎ 8E*WLC` C>mx݈[-D54 |G`%1"شR)vWw #%37ꍮrS$q,T4]=m9&D1FX: O stVb8 ^o.w5 ?i;0)Z>evoSJp.p$f KfX`5B3 L]p޼ݞu!:L" (>-L[Yb,vX;Ka-`R8ƳVQZk>2I |WŗExc,T]ÒfmAG)v!3frfY=KB V6T2/e틲ҭK EHaWA3)!!kλưe| &_I߻ Zߕ7^@߉;ގ`p-xлG1LZ8hIUڹ!>$k6mأnn?? (uJWB.W2M,Z:H|FgBJQ.h9j?t-xaN: '7:BQ"H D>@4M ْS ] ?1[O^T gH|.:){dw { <05x%߿7́.va^ z kW![EjM2lXCZ=TE|@<1c:IߡB'\a?*%06GPs0cO)s$U:\Q1}C nCN6O'"'pԁ駲q@ݩ7r`n*P*FHY Nl4?D#Su8BI!Fll^`9'5\*=p#ǫdͩͿXLͽc"~+X5B9Z4'0'q%k)OVhXĄ7R-ՃE!wOz 5[}VP?$aFhu76BKȲ&Dt)켌#OC,7BA?]`6TRu/!E̹B2XwN1Mo n?l꼧 98ۅ0Mt ˢÍTwٻ<#>EIȤXt{{x@Y|MEt%X^ٶa4 7_ex]ul(U=%Sj\y_zCx jH;VS m1r $fbu*[c~Gm~.Diuqjњ/39wb̌/ ]':Yz}O4IfhiUAq?vs V8uYprL-,"`Y'6A)MFfI8,TR`W529״Gm\E=9QZ`1[yr7+F]^v1B;Mnb/BT L8|ػpj>VF$ڭDsXڪ54moUٴW[N0Ǣi$`WcJuhRlgVhw ‰Fצ%uĞCcCzŮW3>^q&0Jc-[]DYlMϞ ߢg7 xhׇ+=[>=GlU،Ծ^Ɯ Q9 {: E_4Ge`k e9K?^)\y3Xy=xsR0YZG"^G̣~F#tօ`b,h1ÆMpSZTE ΐdf(|WVF8<+3҄L\aP5_b1R#sKrJ=˖1!2NYP(G$Ue"-&tx={g'[a9(F&d_Khv%HȽj/_o?Y=o=bҨ=Txp:d[M!^G@4aK8<`t ЬƪԢNҌ~=RHлjGQ :@7hQd(O:y{35z$stޡg$[w=9R2tgy0Ri]4U ф)Zl-9di( B'Z~hەg|8 /PJU;<*X]qt~x'xIT3HrOSXڃ`:6)y8B_PEIwn8wNī]F@9bٕ'8Y~'XI:b ^$-Ё8' '=8Y_F֗+)۬7 Z_+UY#,>*9}Q+]痰Mnlő|I3h)fꨡ?׸R;~Ql)ts&)M]@cut#3mf5[<咶Y}R.dxʣI, * ~4S!B1*=3>@ kӥ\K&g1jOĈj=:^#¼a E{:,IWjʊ|㉗/rWyx1 !˕F9|Uxۥ0DYO7>a4_7,W\[?ɈV0L$}_ m0cMwt)d$Zn>CM)5G]J%1TM>PG FƝƷ}~`,ZD+]略ۯCdҩc[$043ƨ~[ORo>=pݜFڄw-Knp `t~t`d'/6>l+I,rH!˟ˣ5]B f_|]VK}Ny7u(&(vHʳGe.ߴ@ t Ly9U7p_qOJuKto373_!(~{7pļ}S73-i^bjӇɤ7M^(d!ooQO'R/ MI_ke㏣l\~WR/Z:wT/;/odp4d`IWKcTψeK7_ce ,i)[#X75 N mFh~ޒŊ2YOpTDzLPwqG^Fwѵ;a#-xJqX,_)RfS/u y.H*:Ex<꜠èmް{ ZFl {t|[!sBsNnVHy8QjwR}u%$&҄G-Ե >,[JpFc}KcA;3 D=-T¡0e^H&4DLZsc) {yNQ9,r(R3T&ڇA zmߜǓ$p9hn'_;J:S#+T ӲقffJ:Y,J71w!e ;ApXޖ<:XT0ffĢ2xp9%tׅAl_C8MCvU7 t|`}x;XFv$/׮\,f[uzP2Ϡ~` 2sRJ{1ѡ&{9]+$nOIۈ 6:>Ϣs<2f.r`a@@,^VhnL#(XC5114'2ޔB0|oR.s~s`^m"vOEZ-:a/k:.u(/4C5Zw Sٻf0n0W9尯"^G 9eAu}^%i 8FYR∊֮ vxc44w2EqR!؊ k=HI$"O!%~W&NeVJ~M1!É)R3s$=>FR#U#~Jq25:;w pEjU͞a|R}RPU! m:GHVi5MTRųP,YZџd7VA$oP5o`Map'ᇷmyS SY it>\{AwD#U%Dv5(JZ\>p.1oJś#Pӑ|+5Rp՛u8]cfaט4^ .+ ߞy~}#rJAaw?*lYG'_/.EajL6C, wl:ƫ4eaA='6p6ScCPާR/ppBi@/qTb &$Md.l5{WzR{<'(HQa;\'E80C cSs:ٴ~[`'gZʾ*g L*HJxs>KMjjlO%ޡqWt_RZW%X!;saT+KC{9=ip[bSKQ+i _n73:ufLKBK+kudRN#JsH ,#)'4Ǜ阷H=ږ,[M'Gp {[*pz:ˋ~ ax޾Xօ:Y~ /7A?]eQ:lbCKD#*qAZ$T!G<8Uۍ҉R~Km{ϵ+Dh 䌴.b)^6ژ;SCg xx"?W{A(}W r wݰ<8N,;vgG=Q^?W~Ÿ5W_VJ.?7qm7ӢUqj&EO^X 7p |ʲ5PGh (qNGڼhyyk{m>yʪk@cCla*XNjG`Վ3e33˟T7@b>'q#=(<' YDБ9o{`l/xm;3-IE Hްoq 棇3\z<~Va_Q9$Bm_=Ny5}4sARS}OφxoΆ=g[B~{u$¾E?TɕjAvQ\4҃ 0dEϕ.~@IbSsSU&MmSmX:7kJbfG҅ϠIBKs3b7`Bv'B4G?/{M⤚|@*Y26Qv `h057ΡCd1+5@,jk&O i\<ĝucu*qiҙΘz ǭALc~4daARHS8kf+B|j0HH ӋxT,}&x2CBWȋOOW&'쇭{}Ks( Et0fNavЎOW9C[KgO(]I W>5S(4' IG )A7EP`4J J ]D}PR[WۉZTa xvR3™fΡ=N΋^ ʼn戈wb>HiInfV6-gGY3/9"-J%65-`Ku!T-hvTJ,)\Y^^G$<^6Ɔz&C8C袴H)ci'yeE^cv«l‡W*X#Ypc9q^fā$Xi{a?H_oi/arxyz֏)dr"m4jimz$,8!0(;%H)M8{M:V_=q8*d8#Fޛy+%q`WҗÇ%_I!i_JȰ}g%N$Z NI!ZzwiizSL<[`@qE B?r$OEq("3 fLWqpA/Ɵ%Yw'즎/m@G8q~1PFmWDIpRz 0}I,52GG] .o@*">n8y Uolڣ;/e^s5|g 3YLfy%{+4jZX?VJ-'{++{ 7b={H|J-#fOħ;;0>a:<㐰m8\8(bɂ0El1?~pD@ ?.Іڐ*τ؛!Y8=qHs)2X'>qA|'$qe0 t\|4I9 lCo? ? 'o1z|ngN\&̗aFgh$fZM34R)F 9n]'wSўZȍ KP;>y})>6 3צm1iۂZEK>YgŭnCꥉT䢄%r ? ؚnڸq=N8F%JxQh>[^xq^$spESozF=U٣;ZY6~m_WJWn6_WJ//qipp)e|0{IX*hK8PlnΨ8+bܰHh-L?^\ c)X8ōHl0:T-d4*gEGWu&xlH10# @Œf#\ ,ăĪ[`!| rBVIH 5AaWS?yt^T#M Լ..=`EH qoM+ mh Qt[B3%vR+υN=`8@W/!l1|\IY|ۑ| I1eH!<+{A_EXx+ ˀ=f29} F+P{y 렀&>m8/eD`IG~WqS,0D>S8U4pE{p=Vo] ᡙhCPEX99 94D*VUZ|?S#+ sV} n&j}68~iWQ(yCSj?^'!@ w7+OjƵfLVkԚ[Px;fQ  #hZݷ$u^BpB~LM^N1.FB;YNK%gEAy .Q5W^gxR6vA|}'~' EJ |`NoDm/ڵ?v$06G!&xё8 .`_gpxTgG/9˃7LŋǙIDj{xq,a7᤿<׈( 4hj"ǰ]ܓ^Fu;TnBITІSEߌ; "9kѦkspK}ԔQ u 1Jܮ] 41܃<5,S0+T"hw|(o (/ʼn+vo+]fjqv56Md8bw}j6,bxs7&wÛd\$>M:#ø¢h@hhyZ>[+")^*!l~zӪ[ >qPfiԋ` itq1NPAB&On ϼ19(K0{2r*2s/c?6aoY捰\O"Y(n Z ,SD3lj?ӟ'D(Y%\0n{ }X7_W4npCQO4G_w_.~]:g{5 M!-D cCA/o"'{w#Oݖe#rj)y̓nx r$)/{=dtA+ ^H$("| ԹDѼmLm;)Dml^6Y(ߩ `Hcxb9:’#*h|RRA3^(^xӭ7$m_dʈBE>e1%uO%b)>o+>j\ڲ-+yGP]jx«3A\Ň|GԮu0Swx/#6;wyjkTM?x[;Y;m},4GYj\gh.~w&˦e1ˇ;߶|ӕN/E+a$jhB`{"t"@pهb5P$fr1PI2z+*O1ytH(W`hˈu vec0dq;^=`!x:FocIʹ =1lkXH ͇أnZ>OV1 L#iQaNNXt,ޔߴeS|OFC&OzaU/`<ۓ|vz %`&+A}\g,zމ =veT (Mm;&JɿDzWcr;vΰ2œWZ@ŃxA3n}&8Ȩ%ݔ}II^(Fak <Δ[6K=% cbHqD]rcq޲b<4b kKx%8}g!;/nT!ha܀d #⚫p d$vULj}'хuZ72E¬x g5NG%2jE-2Xh]ZV,|]#BlJGޙ,S0Ot1%;ޥ0qWx4+ݘ{c2M4ԯ$GR*N'HyyNJwIȮK$ñNXKchYDq!NXRqcc+>`K2{̾XOlF=Ʀ0aW fD\Ub{՜U_U kaJ\ļ-R H?nvN{t9?"W /vETCn |@xIZ:gA^c@{|ȂLxəyL Lz_͊-yPL=&Cxt. Wr~컼E=CؠwSZ<+*F%?8a븵\ޱ{݃Obd=bC}K$@ '^9a9ld}N$J鉶ȀV.E,2'Ѳ$<tMBqFy`k3^5޺3ජrzIwCQ- l!{uIA3^m/{V_7&`J=xZu\Ϯ-aJ=q"2i$H 1n@kl!KŇܨfAώNM#l٩ie}4Ǽ'hWxOAP^XYFl~=׊t}Uk\-vDgqo<~UR{peIAH"\STO\( oolhMC cʒ~{ӝֲ[@_{|־_á֛p phjn"B"HAfCߝrtBB}C] 14 s?B)At ]g>C:: qv ݡ"䏝r]8Υ; -T.#Is'JKΞϊIpc?d 6w BmWjoQ5wT;vHFoi xHv 覒$e^zš;@{a'A{ ΋]wAzkhڻkhڻڋfW<pn`H>j Ӭ)uRǗ:35 j4BU GJd Km:PJwx\KW5t/]K5Ԙk|_BZ2kttk4gN#g0&D4K!"ԖdC9-"F2`dvhB";ޏB^Bba.*1?jl =mS)z*Ij8%? ȧKt `g2>=BɊ;Tᒹv =̟/sgjiC94Z oAM8 6殈;iS=m{㑴|\Y2-e-E Ĭ>v yUN̈5{Csпŗa,j͢h66l+[2W2>(CڬJ= دT@jbWi6jgg}\+|🧈…S1[R`pnLV[>D]4(VLUJ"F}_ePlXZ:z Dd&0)HkvJ@$ޜWY]^>E l1 &-*_*h8`E(dU$ƒ^m#|7w#y]_^˗R&0i8';#_&'pc+>%P ̌9iYGp$d}~?4 "Ee-`T[u"xx=?tt)/ բf -,' ~:; 8 yY6uHeGt ctQ|g `I0@/k -Z2Ty%Znp.% ?%J(ZDp̈2g:ӓo3u.}|3"l*max&$lJ܅ `?l&[?|ڏ^: > 쒅+IF2d7|:Dيg" כa*Swi r1 FaP1š Pa(ZFh'[@3WMv^x'}b\2fޕHZg,sYRqZmd4"љ3C;nDZRz@e ,u\s27B. '=;)yl"[$V"v[ 0^_V8otn e'vԡUǗpn8oQ!RҞ01oZ3J)D?G=4Sb\m?rYŤooZ5?[+U|ߞ%`v0NĒސO~k5OE z##l73pJvx R?=KٕxWSOUD ߆P=mrKB?K1~Ss3 G H^Bn:SG+zF=N3I{,RXVU%λg:oک yȳΏ<{/\u+]_3|!32?wN̰/~ L"P6괌 Oq~o:#@ PθɎ(HJD9>p鈒'S,>i?K>c]c4EfMLη[M!56=@q9anf&n@IF$ ##̝dl[_RyOIvv-wI.g IB%R F=?+~&YA%sE O>lv0>`,j=%5VF' !=UB}r\r&@:;LɫYۯ%@ՄU    1)^1`a%ܱRԘVsxH>Qky͡;7,` Ww?tDPXmʇeÌi#jùJy܂z-tJ5T]# vNxfħ?+YDZ('~9lۛB~j2>_ B@@ۨ/5nmҷY b$IT3S1oLV+wYħpO-W|~vChL!.zFBsX>LBE?%6k;20(;ШD "52c24%@!3HjT *BP)7CqR'mbBct{+TU:<>hUZS?kE$K^82ȜA=Ӣ7}%67F<7Kɚ)]X@gO;|b>t py=HG^Q%&6ȁ!\.]MI{tۻEݬ\TM ܔt~=m(7GxLl Gt?$mJU_&=Xɢ#E5tӊG@@O~b+4Zb R><+WDi޿=+gj' aw?*ڢ״mF9[5٦-Eaj6{X8 ӎJCGq, H=i@/qTb &$Md.l5<霵;܇üFZDɁU%׶P1݂9[4tj]PnayE8 "H:F>p N<U"2y',xHMِ)IS1N094F[+*[. J I?PIB ޚ%2¸A(r| g7Mo)$Gz#9h*)$ P&b䄈=%qo Ư>~ZYȋ7_$Xtceb=RJ=TN5i)ltNd3)̀ z) ͐Z%zSx =wvQک=3)U˭]lq<`c<8VQ:ˈ+P&ApCúPV}9nmbTyTԭRFl8R cTC]O{z#}tzd=|ێcNSrTEѻF+H8JJ3\XJܝ|/zpJB \VVt+sčNS+q-dY+f^PBݔgNbhE[Sc?-[MC׿́6Ҵ嚷p*),p3Nќ iv%^WdhO+MuÛqk뒟V;ԄԉbYQoyZ"2[LFO ~鋍8bzWCͳ6 x+OѪXgs9VpzԂ t#x=?< ՌfS8Lex"ԴorVZ|Y  /ăRzgQ-}盿F$JPjR8U{TlQ:T&k|g_:Ѭ7++Hplzfj9zW6_lajp~))5]ᇪ5tfW=DAo~!w E--#kIo&2`Xck3J]G`|6\N[ b{mFANwї YyxAa|ļ'Ss`ʧRéd!Mvی|;]ol͈ H׊cp-x)bŀ!oZK!˼3F=@|5;תZdP eUQ:dN>mhkq!ӎ=C .Y5(BPZ\ }ng:V+HF>CU>d:F#c'^(CpL -5ʩ&w&c6yW(賑:o plGիZӼ0* ȒEj ,: ˽tL3aWj7{lص0O0ŸqʍNݙ& 'p9>rC,@ueV%KnWETK}LZF߳c2(5+ܨ>3|/:|Lc؎*DžP>§꽔}>0ݣ0iX^a~kfn;QQVwڌ4zʩ2c ]r6*O/Yxp [WN{_2~0%L6},NS7WN~/G3[a|,t$*R'jK&ԔxKtwcɍKdQR>T# ֝}0C"-zԇiԍ$ғSCqSp(i$p1`cj8x<|;ꁼ[x^n0]Ul{x ? h&h*6:5M:;b}&"s8o ~9./~YԚElTKm~\;h=CÕU՚M#W]VJ.?סus 3 zwa2Ye_d 43~Ѧ_J4,R@H0.dx%-I'DA_FHH䋵WYY1A. غE֡6`j'y! ^,J'hG(9X:"-3Nd&b ʾwBB[0pzv~2]>;y~(O<λ( *L%o¾N37uK6%fb9v" bzSϤ(YRybEN|36xlKd7s=yT?YާѠΖTbdbxrO4%Ue f!N1*+ZRJU(/ے& Hej;a' T\{݆}:ٙL['Ȋm<1cbl2$VaV"UIWS)lvd\^:?GRGMepaF|KH++)0o!E3ߩhycqG3pH=SO=&[T_u76}/`ř2Ҹ%knpE/~#2EC$i+-#DN5?TC8/xF]P<ܣ{&g$au2z;" G›k|`y"iAWi&hǏpA}?fFɬI\GXb>.bDލ̘{@?aT;Կq6!9oiVsZvE7;2ZS5SEW <ȷc Fl~T _+q&bkj${⁊G)2مaڗxXh_۷mx@ʽEـ%mQ;+:?vV{~z)3q)3y CooAaγC͈w#ރ7MR:=N$vʏ)B[{R))6+YV`);4Gzix㙋F J<5zռۙԓO0;gcmjG0=O+3|s3TGei0v2Wr* 7ؙu9;'ǒcjyZ^CNC@ =q!8q-l?]&ffō)ʹfTYPĻ`?16A,>5;vtt,cH_cVWhV__gRb3kKE柅~!&S^B q2&qgEu:Bwwq9`Ee '$'P49dp!qhI0By"0 @+LpKZB33w$03#),،1Y+d3. . e;'BT}:~8g{&NDGCV7i0bXoE૰*h q4y\ ls9@i$=n+΍ɦmv5C&O27 ;_Bx;W82oqKW{jinYA3q6[v=O| OmAѸń5,l88 jG_2.ひT>܍*O[ӥAjۍX>? -~+d[yD,1{&E`0Y, +/ 63 1Iַ$Std3OQHUzg}]z3f̖R$ÝR$|n̟19T: ;E{`٣qkzʕz/5j[qjYx3sXZT-UڢoJP-׷<;ENu<f*{~{P4=W1S}?Z "p;E_)>x%Tkzˤ Z7zS-զzS֩1P\ Vd)^moJ< =[[-rYRvwߪW˵*^4OOW5jvLѓpu <6hl5;m4̋fl)^oȡV_iP`\T̫R ̾gISsP۪3 6Z͚rͫ7i||J* ׫*0)僇YVS&pnv:y<+qqꈭZܫRf&\^fRT^TyuVݚ4 ϴfFm{3چWPԘ6oprz3ؖ|!۪s rvl,C/h߶j[hERL0>.Qp\7藣"Mz_h @z7oa Bmҧ\#_9o`M[QϸI;͈;ES3e\GQW9"]Z_Vo:QsWZ: dsA0sX!#L]Yɭ#|-7Wo O<g(MPQb8P20F19>Ey$W.}߼T6C z9 Wpˍ}w @DbSYx lE3}P \E׽>gԝth Uh_zt:\BsZYuǙh%έ%)`KMcbSw3$}C ζ8]NCvi g̠#(Ϳ.ɚCdhLq$szwI;ބL\ 9q7Σ}DU3':@]!_FR}]0#:(i-8M%  N'9-3@y''3L'j@j,/96/y(CuY?=MQ#>sjEKJ!b W`t*E\pOcQ]2&t번4I]Uľt<Ƌ.1Dr> Xa.&SLx׎ſ+xT[~"WWl}.L 3AAI]JyBM{:xK,b_NEe.% 8V"7b+/KmF`'RW>ZM$!]6$-C1hPJ k/|p?ͅjxPo=*b7]\QpGSUoG!ſ1Z_I" b^ǨGLpf܊Ξ K+[$t ӽX_҄I$,е$ kDE @&FW3pl&x3?T*ّM]#ǽ7Q7CSj> ڥ%1J%CS*Uݛ}gOb\% 4;-qb9l/ND{.7 d_h%x8Us㣪 <|+8F5o} } }ҋ@i)H􋢫r|Ec}`φzE3+ - +V3,J{[. Ly_jTyԤOױ3&O {|hwCWR3ʟøb99~@7|s=C/̼&_1E/υ kD'd\r*]C@{H(SDЌ5v]#iF$? rHa[MA"/Ȣ?$DmbHؘbQ6q_ $n ,j;={$$L 3(?9'K"׻ -*c(,?M;# _ʑBYf5b{1ЙWR= )эfa?He'` &%V ?`}i]3ĩR [A2Qrt3vyl"hв1Y׊}rXG|w_v{ZiRW!Ț<wglav9 Tٮ=?Xq!A2NP|(S gcvQxWt wܗ@&*ïc,FSq9y!H/Gw8d _YgQ02j}{{,}l7-4Ж4Mmk{Zrۆ&F뇣(]Wc3OUve:]+B&529?E]ZDV+Cgw]@Ϙp&^YTm$i3K#4@2I xp5Fa_# NEB̌O]( haXp2Y΀L2*f>1[S}LFqԤ9#O?av0CL> @^W0FGjX1qh㽖\ήS`[h[,*QoDY[݅a_jHV-F`Q$cgWFD oLeL8T3 pWZ(݊h2Р۪#lգA$ş2S*i%Tne=yS͊02SpI|yGZph(@>,F%X1<07K\QĨK7hD5!ͱ dej30Hs8ԉf6leIb"{MӐZrfj';B*9f4Ny @,t^ 摄vX&ɺ$/2$&Ys|!@Zܲ9숔l!h"+0ߒxhY1%A2W&'364zY $,ek sFU9-ʄz8.e `V-*Rs3bs4}[1W٨zHyJLL#ǩx,M<WǁEGC}&"5IÀnÕԄ8Ίۿ( ?8LzE7$\.C!Ґ {0L @qJ+OQ{0&E +Z,ʣ}qL}x1G~rQ1.*(lvvdRb.: "b& ݴ-H5inzƎKoy$֓ >Tr)~<tow~jOwpiʹ{O}oD ~ď\3cΟɄo|&_&;eLhxٱ>ޣ-$'5oZ|>(kd@~c#|Tr8!|Ӿ[>bbK_%^DET3ɮddlJ]%g+ތާRM.n^F#wW.'谼WJ!?A˿Dߗ/}g^Fl_zW)egIO']M!6:g=5 uMg ~)jU?SS{%5xA? [4m$ZO(d<^  l:8'πsNe^^L̈́׳Ah*-Q009a0ƨPs( 0: 92j~ *Bf)B18#Cyh/bnLs6h+Gd'p{X#xEZEbLu! YjCs=4HQp;'xi*tD B nqNM8g +d}@[ ekD]QFԭu# ]Y^ִ2!rKdB-q*'( d'Y5J'pS֪Kg k~fZN+?5l}*dmVCdXrkdx?f1W{W{jyau=Snb{ ʌx'0x X?$LR7X0G]q>D;VnTLI E o#Y`T&‡{i59F(62› ߽^<gӻſÂıieBq~“AWkR3r7،0'Ok/?VHZsp7Sp"\vBUV޲6< 'ۘtP\s!@pHCm~%'RJ4JN}CXFeni+y@\=[rSx:@_u:: bQ87J zkot%(CT#kA~W_z=ݯxX:^j/ j14ll7;$U ?k){``!r?D}z<F;= ?X/XѿN_c%c}_'y)aюfnEל2y97-P-Civ3PZc8~}3%ÿ́AjZD32qgΡʌ~@Ef}&?<~`hӰIg:w|%gƲg7it5 "1D53/I4wwy5 rϻz\EnBqJJ,g2c^GrFP8^~8^;лOՏER&峀R9}_dӠB&'?#*rB#@wD1zrh'u]CP5<^tR[rhGO x upHX3Y?ExcF tD <~JSvBBOBw@焁P4" ZM2yĠ렁>_╊_~c%4*Y`?O82^`.|. i' 0mUcGF8%8c,9: ֱF$dHASRѲ#Gxπ70T|VT@sL JQ ѩ?48O]G\#qkv*_kة|a;/3ˋ=4{d$~vϏA>:<>he{eDq}i&g Pmzf`Nqk|.J!,YdrHr}oīj2 >øPY]gLll|oւ[Ɏ|fvNرM~\YigR*X)$HM[ͨ }.Y "iƍt[YrV;'; NuԲIJÈԕr>yHÉhK?!^Qۯs1ֿDZR{H>wEm,gmKヴIGg 5M81>2q[n$H=N 5HS+zI~Wp Ѣ^^jWs"7{ҽ~OYU/W(R&肷ȩ_^d%Yj@,6rJ\JHHDIq<(g/ٞx &p\]dO;wi:97zgm+ŽUN|P)aϔGhqhP`EN"".QhZ[aHZna{Sp B€ݯS5Nm׼,n2߹P1mC5v)ؔ?/sas.b"٪}*^3 0yK^L_3  Q1uFoqaN@ 5ku0HRsOgUS[ c?qiFs'Ekx HBgetR!FQ2{! 䗹H/RB lj WdA+ުDq~|z" #F%H$i4曏wCѻfеq(k^/8M.Q/~-zS ->c(lA+{L 8~eJ~c)YŏP]fILwu+'Dg@˘>rSZӝ_A+_^xprZ{pKiqv`t!<(AzDU$9uF[V˘0!{`O7r^vهnQEq_~^*Em7 oW5}a _m쀮*ƐlRϥ [",Hv!1: LgOk֓¥I,)5~x5¢"I戍?=[80}x A֜뤍[M'G\N@, Mkd:H߾$RP\3ռ?oF. cA+ēWпDnGV~i?X~]jz{7;$E}iұVr0RtS5pZB g} fK5:|%V<o5T?I?:t_#ϥ2 IgE}o|B3ƻ"XaM8nn´fbbI,e(Pn*BPMOL W (6̒QQaAz7r|ažVZi ?}b~-镔WWe-*/?}}fC$:>Q {EhT \!JTWQ4l(WB"sJL )hQ7$ UNa;E{ѝ-: ۇ(; 9kIo^~ka1a?7.˩6v=͇b5D#FT~1edظA{P%7~>9a4TKNO?ZQى w8}d =pرK,ؒů e?4ϱ]hH X7q4K}yN5_\X5Q㭝nZF6 CO8Fr[ eso[cOzl66[湧cD<C8](l2:I{,rcNxUR!|`hl{7{y{~Br!ƝME&9gLj^pgU6^%VJ.?ߩwNvv$ > KZ8k]޲RApF(`۔0D',*\m BCPSȅ=!"JTr:ҧrd@6؇@҈7d9Tre6$=ƍ7Ы{Z/SrZs`c)CJgHN@s9Dp3Z}b>57M(M\(w"i]Ld 5M]q(@)Q`-*/r23w`d\Ҋp9}r ;'#ΛGslA8:)AZ7,KxKi"1u Bpyg=S/쾎6d76 酝bݝEy@/:0Ш[8.F>`ou&8 dF@S7:J)byPaGםb̰ )Us\̯T&$(#"'sa42C>ҦW64bFQL(lK9]ČW6~Ydxxކ-K]T9;,&9,6I2*a=tD+}? 1m\`{8X42Y^?KƮJŴQ7e;àz~鑠,Q.J Bv LWr:}Ĥ@ۜP]HG?:2QrɽhHloQ R0 3(?ZN7/K規13)-9b} Ei.E,~ӒӘ`XFY~Q#\)WWQ xDf{ bq#5t*VXpg`x=86q*H%'tA| X0QBeLϞyȥQ`Ux\&}6Ǎr(2Һ|"(LD_=a@xcAZ&LZ֔:R is­պ\.Я3|< l ^ڸ!{YI";<1&9.Ykq*_ x:3|,#]X`#fʟF?V!%k}duSKbHR 5؛K/Ød ,ehB8,&H 8a3Y%8~Z.5< IUBWb*dWX:\q%߁{N^\_xi _I3&~՜h} S7>L YIU+lf̤vbjڜi$!{Ҝd nhkpnzМI1Z8i-0`0̒z$a X4")FsyR1jR i \}\-]D՟~k (4kBKbyRd4Tc̈ՉnIOjgE1ƺ cݝZ_0.ǒL Fk>}Ycf ;D&ܧdp@"|A?O\loqg\l(اv\H.fZi/*z/_ɷESu8gkWm/FmJvsW%H#=-q,(POo/?SKRz_JYuՍRv2OF?YmY}Zi(k9eN^ Õz6 Vśs t*3~=(oU_R2?vmAiN׉VJ:W;?WJ_~S442i:(tΊ@~O!CDPaF`ia)`T9nhYzHs?,d}hVfK<6C?E30ИbڶY4%#OWD|'RߗdӌI+"aC`W~~=B< %!PGtndͶyrɠNpr]1Ha?fAahR ay!QF͹|'ߟ\%ݓ/S"c+fᥝ17 ʽT G!͙(T5'Ið@V2C lXg>=%pܜސYel:P~CIWx} jq nz%1}?ksTw͕٪NqWH*s?G>Vp QBc(7юCw\ve:eN[K:rf[晐8ӓڽg~z hGc6W'{ZrL'6) ,~9,=cK|cd{k|w1#ȉ!BS< +]/WR|p~Bi"*},ov{rw>?(;8N&#}vABNCFS yC ͹'Ah9C{rk9 I MңD2u V9f݃_AaKPXNZDE췴_,*Y;@]"ĂvهnQ EfCc[~&{\;(~7vxB [.bw4x;)pWͫ(zww&(.|>| #*O%P~ZC; j=>m!>WK w+zk׋Uп {3csq9$.XBR;Ef|ukL !&c#zE:xz:<[l$?WgNex79G>`VVd>+vazrN_>~UeTO hkВl@Iδj8`<›}%/J$<|0p&}҂0Fcl )KJx3b,؝dٌ~Y;e.ЭZO; &tNeFd+uhx,30zEҏls0h\XV4[TWGbJ7%eL(N6@2IbuK:ac= յKMzC2 pXiI]l얹pb3z}0z/Edua>e MOy4tg@#gyZ(L1<}C5zӂܛ%FZl|whxwğ YsE_/.Cyб|Kh= 2zKWoK*gcj-_' v嚣xs]f:KΛ6O, ֻ:}›lv73&o2+7u Ĵk!$'<=1hPeZ(V6}ά1<buzvG}65K܌ʣ7kzu"%&/#5ަ\:G:?5ȣ[>V?3h|³R6b 'q޷a [渶)MȦk}46j6j;9`>6',N,4'Sev/P{k`7>ܠlr G2t{z "De#q@E#xx8/IFP u`+HyyP}ޯR)Y6e?,/X7 +mG<Gu7LSY"ґu|}&9H:ʏz_"`+lxZ-uu"c0"R:э,j6FydZ; /^@bRo˂5jt|hN`lÉp+oE7xC';+g1VX[Z- ^ٴ"vT'MzK]_Ocj١ozp=C#y jۥfT*A6|ZlnV !o`^<#z(G;!.'S  \)?*%$܏ %(%g1WG7!lc0~Ld!pHId >`%GoBmU=%X J$=B*V*SbRH{#c0L-MT ~rM"hR449yNiwΥ%5A2ּLn$s6R9FIJڙ۞$dT!^0cf[xM'ܚBy,^1sygT˸ftkNR+V jDmpnƔ=<xbc|臵Wfeze?x~lsNZڤn{yN|X IS> jH i +|~m#-vđ{y*SaLh pm^vX/WB)Vw0dFۓHI,3;=;Ok#"GFfy\،)kg.o+]8 \6qnďMwj[lՌiW ` 6f%TLQ:P/J+vBr,K$=mAFrgC;Eߤ[(x ǩԒuc(kbc(!-dLf]XApz:'=[G63ϑ8!o3Ip5ҦCD ]`~EqvmĬbRUx=ZВ?UlJ*{^()ƫL!~eM[;2Q!ufkSJI8Lj[>5Eq4q&af{ }S8"(ogq_ܾ>r7"E}T\phvVtK:+lʲi3ѰP475&)f\ȥidg2jjD(ϦTצ b5Eqz'k-(%'Yr>W-5Ç< M'8ra8=rl4Nn g׵i.ZV̜7Q[LiB~풇blmf.uͯ/MOou|v ,4o3tרyVْ|ߗwr'4Umה Ղm\J׽.쥿e|U5T?Wn{ϼn+W+M-ūz*k/|Q5*rV<_Q.4sAGG#GzY8$GP,,g !GGP,o޺:Z[[ FN;mngê+oIJQeG|ݜo})qU[`#uxM碲4ԮFV톬 \+jlֶr'Jz%,W}P/CzU s?-2:2J8WzDjWj?ten,sOm8K1IIcja|.ᡳ/Ld>Hw@?;%JJ\)ǖR ʭ];eEԍ@a@Pzﰵ_;NݼhwZGEksvfLH(ޡkvߺպ4wTx%~N>ٷCc]cVRHPc;KKK] ed2qfOs羦{G Nw_nY)7>%Bl꥝D-̢P~A[9*) 0ANs~|҄bfA'{}i=OhR5<j iIr> Oh`|9 ) ?+@ZnMZ"ha Q6:"?g=?s޳K祿yIrh;ksKHZw`|Gï2#Ÿ{EF_BwnIq&BL~;eD猑&Y%Mn-I)jT mA{|' 13-8SA[ad:(_F"6%:u +pb)ƩlqOhݠ1 _XU4X#ߐ`a-BA{X)n B2@Z YYh'RsDL70u_ʇf{Ww~ _f;_~s<ݰxdPx E*|?H[L#z>Tyr"sy*-ygK$Gcھ' <9 $InG)>()/⋬1:i{Š)s9?rIJA%3R y]b=,5r*tb>zcX.o8r´AuBUknT歹ZAQUSn0SDBeV)&-N /P+ٝsRJ^vl'֢Z8SRjDVZs19+I6KBS`<fku5)1U\z,4>oea#\' \8\eFQ63G`h*3 F~?ް{~RhzӪ;Bkw2fX: {;Dxb)'73U)էN1}M=Rq*m0 Abޡ+ Up&n^=P ;^FD*ɽVmߜjq1 qJ՜E|:Hm8Qh6ؽJ<+qrd?{F ߯b[!w3l .I8'xl o?$4?0$c=jZVՏ N&LaϜH5|9\ygaUQVZ$e蘅s<KqG 0l.yo= yr$ύeg'YyŢ*CL! y}<#dM.2٤*Mn')< J2 Kw|сC~6<_G]{h}!b;VsX8["I0#L,AB_-rܸoћȭQI$@$ù 0O8p ZIJoRea'JH}"IDNF &(xJ5"aRf ~SШCLl@q$Gty<$H8DÍ8''a(eq}@ qq<ٖe:-/ Ćϧޠ7ll6 en<wu_=1W7]ZhÞѹ{:Z9aVXuv]? Gu<֍'|~§'z/f@\f잚yE]7kh C[+- =m[UfrfF8`ߌtkQ8p霮-uGY=@Nbqvm^e%PŽi#unvre\_ o_q\qS]Ze-O0oADwf`wl*&e|et6['K?ٛԭEjj@2*rfDj%44QJ?4ZgԜ+tcX>1֊""UD"ؑo_9e.qw!˖Xydj+R_MIa#FbvqbarR sECS 4u?`h-$sfh~;A7zc,\SƁܗ^d 6 nLC>w!c,ݳȀvMc7"YTۻ?{rMgwga'Co]D&r"RjOԡu@.6)v*<5l.bAb!.a[(4=NjX7f)-? 1i 7?!}3чVД!s˟ KF67X|6K3yX>ɦ88葟#kI{'o"!T 8 KJ`-~ &BxJ !|Fz2&9-A\B =ދXOok)Nu=Ul [g˿.y'(ah%೿JD6Z"$GW'+S5״`{?W}{WhUˁ4pyΜ2Pd ڿ1L>G~e1ʨ0a̼2pk:LG*xu{37dkI?cd?S-v*{Lx{kxV#9ƃ>~_ k"6qC w.8YZO_i^9?[Ti|}%?J坐)sjo녝7a؉V+uJxÿZCҋ}ӣ^Do5%.NNJw[_o'nrMp/v>)|V636}lx4i l+*v5?}q~lօ? {0k *@C8duϳW@=jղC[A|?̞.ֵvH.Xg&(u#aloWeT$PM};ZwwDlY} ͫ{gA[>mkP|Z|]dBET< g ^vx sW:WGr6ZLf`:H HH9/~J?'ϯv-(pf6y\%(z(ӠX-EUo'FTj\ © n/#㭬+fbCQLTbq&նTBMn8vQ&ͮ 8ƑīrUy~P% W ;&c^7R}=,F;dCǸt'4nW^#x iς}vA.i8mPCK+AA\!8h/ɲ+Kz|#sP2CO4F{ڝΩ<:Pk /{㸸#O=d I Ɔr{>TzYvi Y $*ϙ![_IfXkzhۊ&G8AzsV*z{Hb;Z90k&tr`ɜR`+^3r oC@#AQ;00uHa9>BH Z~&nsXe,pa ?b,p]<"EIY Ä 0 ԃ5V.VObdB8oiмf+#.w4e.[;j%Q0)Ҿ Lʡ&+M0VvC؜aD/aFgD>I FSJӀ bn6S&w04]"* !F 8p ~\J$|LȉVf{jd2۾^2%^A}i<#)ci$2o1a e[eŽИ|⍎uϹYƗ!0juZq (9KvoNj,V'g6=W.s2 ۗC!LQwԃ]m.243e` \yE 4`qrZiKSkTbkX$3ғ%g. "CmhRS1I~V(M%]IE:i 4{X|XT{D/h! Ij `P{"; /2j cnk.gn;^ʫ7c3솓!e2X,c&^Q\W ߼E^ewߵ2°9?@RS)Zy`8M*fŘ}sl=oqi;̸bM{d:]Q7+fGv1.fمed3̈.3̰%ؼrUA ͛aa/V~:'I9{LV̳h21Xip$НI"sҩsiR9Q04'GUs(6 ) 逦!cat3~uϝYo@/[Ta=Z%DSˁ4fSP #yk}fqԫ|Җ'-{D_,}.`o>/>M3E}.g&/g }.rW[P68~RRx/^LLz/< P!Gk|{$l,l \S\ӊ-%eaBEVvx+4YõC#%{'2KccɋصIE|v݃r;~5yg;|8}Gz, i?TYO:f04H49ٙhytAO.vtǾuj==ڃs:Oo?.G]jOtpcq TDի;>L{ݻ.>|mTwR^+j^tڰD:KSt[1cdkd:%V &J>V:Y}6<wD?>|5o5Z{h\w>%dy{W~'^īgމ?,!$= bos˫]]iEg&H1(xFI_a1:%Ǧ szi . C.4ЩYKPi * t:Ei . C.4)U\x댘kGNze5i)53s<3\Ǐ,QAn؈)~սH=^D&UѓCr@s..s]þof35xli84+H\)/ꅀxwAoNe 4t?/wowB]gPy{(Uh]^Bh@&!y.4;QV*RˀgnGeְŀUT^iSߦ΋W^+[Q0v}YVͨ3[Y._FUnϮd<ۦE" _X$ [|V5ˁu6Sx<+*x 9l۟ w$s=jwfxnvdJ5fG4P: ;>Z\B@BS\R꾲tѫÆÅ?ڡiq/Pۿeˍ43}P$pk YBÇmi`]8\hA hrU-EqgDSd@ظYu-q 9R<. Ħ`KmG]}J =L;X X@e #nL39)r_8C. ޢj¡ wx?>9 L桊yTB3$j XFX!N|˞(ٻeQd"^v?O}U& U^ .tw0C@&< Ǘ:_͌.ǵr/[,W.*;p04K(h,Vs;_NVљPY .~i&FUL̯EyɲڲZuU$[I$ꅤOM U _gSū=U mf,LsVXq4U),gjXNe'ۧę4 Kk,9[U6lP[=S] Ae}k ÜI*a7S|(^6ڷyGo%Lϳ  L+xp nuJt$vvRu ~z3T2`fhM& rΥ1M UP,L *JV?D^5"Dedc5^(jO~QBd t/CD$TfcBH~R4l#E) H΢Ӌ՝2h٘ib!PRtr.՘E Y{rZ(mI5_J~W9E,[i^В_3VP~*\U0^3"nQpfXQ83/tV43՟e/Kq}թknڲ传9ti9-'U|ͬXDkaJcQeNL$!t+n?6ݖxMaM[qhxRQ yT3HjuOu#[XzI\X2@5},i+>AZo}@֌\Q,GHa(n}ףڦ~k7$'|D/zǧ1=>u)#„-iBOno!xˁ-U}x!&G-15Ә&@(eX{sY>xqi>WG-L$b&>R,  (2nYdUQd.ȫ4x/ؚ5Gf)_x]%nfP9!T+\–e3VtHS-mʌy 0FG,sl҅|3^4tEEԯ*g/PDWi:!\Vaԗᗼ1vD@J?la֤5-8>54WU$!I1,&)(G A-\x9(|'.)|Y#k9::pdAy,/NBS##' /1x%^e^|쵞>vwۇx,O}/q+ҽRjUMLPowp#ש/6+ţ^5xO*рnR! Az~tӣr?)Gޚ ÊQav.^k16j`\!832J`│ugcűa>&d|5_xFmN3yߝ-2U¤rƱx4#>͆odFNI-Te$4".W~BF}.LҊC D=ixZBsB]>K8s.uZm'iM1ҸPڸG͵&gѧ(+`~XAͼ0Qިw۽<j("Vؔ3E x%A;ǿ^봰+ ~7(vME+ $Tw?(n g>;rU$t5=hmΕle)'yUraGQn] % װ a<Hv8G!l;|)mKUg{F[2HrV$ kmmmFZgP<6"JW cRVSRd)~fy\KB=f=u{nyܒY5˼*EyʙO2ig(G={tLx:7%5\B`vb;YHQKq3p=wb}7ľfZ%s07VE(_#+H_:؞ 4!_naH}MNt&)pZ(+WNHhw0A1 Ž^~'̢&~dFT&,p<ϼJ;Qi,=_dִD[(c߳ t<Y Z0eو!v$bMNlj>/O"}^E99m}e=ϫ9{AĞ=?g3gpub"%egp9(>ppSY &H rvpP & 87R]bFS #QW1$& 9JRV@\d"sBr@A`$1\feE{ebO0190yGY33̎;Vy.uoЮы ] {ʹT] /qdȵ2jyxS߅蝁J6YX ͼə&֥5ōdpvSwYj K1$<mɭ˼c Dzkwg1<#ʏJ婢dy %%Hald0FSQe8Q!Ky.sdӐÛ` ?Үf>(lV9C|erqaEan )hf*?pa>% GFfvwQn&>`"da}k/&rf!;A9?ֳ"mKܺ"p_J+"J/&jBOQ7E$ab2AR@lc}+ڛ.ʫ@Ⱥ* K^adv*kRy5 *zu/i/N{ϜowZ[znux-cr\~;>_e٨594?כOD$-\~uCXRI:^:?iEϨe|z8_^N_\QTB]B_W낹10(O{RWz&ґE"'YHoJV~K[wB_#ڮxzQDpš5o!Էċf F2ؒΞq׎JO2eiiԴfzmTxRiiʛW(ý]bw:61i# ys+qLo\fA=5ӓȗf ktsΐVJhYf+AIN)VçxZ1GK1 uS†DC6h1nL1f`Sc@!h={: S fr"vs2\'޹A؞L7d:B̿TyU[#V*{a3>> g聠{(Ķ#[6Vc*rjԜ$ֺ.}3P^ rl Po> 5(|V st7O5k}+Y$Ciխi& 6T<"{6یoo/70g4\LLA[EǬS&_R)9ȿ:;dF#%W9S飆)(IdO݊JdGp՜V)y''fi<V9/L:5ϴ3E|VWZOhNy睙 [& o)a⛄ݵ3Ӥ_f-3$imyO \B)U@Z Qk5fR6a=x_Ǭ%#s)r#gS gV@T sKnY\?OL4ԋ 45\s;w V%00S_D0MO?z"nIIi,$M0ShF>~80Zn%a*\Ћ [3IAGI+nzL]/H0 $re! 1sKb$hIi0PQC[%a+N+ZJ0ăQGAc/ؓfmc?J(cu7^nD}=7z # )t|cA>II!Ln$&( ԇ)N!,0pf/4Aʼn޽& pƋZ(NPQ QzV M$ICE!nMQ|-d)$FjA+t%߂yILc9hGQK#`M0W Z 0~<0@/<`O``wy3ʷM[0a$HhXJ% DP=X hRyXmG {@DюGbm0FF!:53PiЌ R ['<H;Hq[2.FfJQuӈ Du>h\ |\!tqpHEHREb` |Th c)c jc caMe]h ]\jO`DZQJ`><X u mAEmaǩRQl[ /4HLH)j [\؟+IP0`v 4`gYpȂ|\ݤE oY  jXv0-1` yYr5ph)K8x f]` Qt>>ꯠ2! pgC@q 6XP0)>G p,PNYxb #L 7,e+>Plz,#p@v  Qb|+M+e ҜΫ,(j$wYaQ&Òty`5ĽɄ>l.Z`vqg 5O\ Heh*i7ED^"j )#&ʣSn.i(H ]>ƻlDR&EeZt<98o!=N4pq0 b@=  Z$07;0Z^<_0u`@V`fԤia(3@MQεb4e92P0䲨a d"L("X.~+T&ͅ v?4&sNVG{c3FhޅE.3#  $9&,7 hجu4g@`18x[{hGv޻aTߡ-36+&h4`S@ Z-M <4pkQT ,kh"Cp]5b0mhAcU1ƅ 4D!mDm 0 \(X+L xRhv&p,)b)dxX0q3j?yfBt, ѱ,DDzB| "f$XbòŅg$ذ,Će!:ŅEVn!:XcYNq!@ %W06V"]_SIPgY^_P:,k&C U(R$d]϶өsƷH 2tp}"Be1g(&5q"YjҰn{}BB`lc=٤e:&˘{SL_L^pUg[qN(M~ԁX4+TR^YӍG낢8nxߝP# ;~w7leh91#ڪIEDꗎ̞X@u&EM=WYiWt$ؽp-ߡ'֟nH 5uz"!9R,S^{#-OQu (KPb?baGA|q7ʗfXEqL-28u("廖 ,8bzb9[7:Us"s1\L3?;?"7?/S 6(*n$:}1kNlԋ-&Z(57OZ ΙB1uWV@j8zBI{CbE8}-'a5hlw  ~՚b%vۓnd"^[%&$gNX(9=m蘕hԊ^tG yCv&3dJҨ L@ : #"o'=ˮއJ k v(!ڵ?^yԜ6A/o~qYk9Q+~EFZJQ 0n2ZM: kH_j嫩3a u_C&'5,*|VbPنgLĺ0b$ _Wʡz#_f-~xq¸A@{{P[JȂZiE꨾Rh3X\! Ieh٪Q4لFOދ { {{1 ^H{/LBrE)^ϽMPνq/ۯ69 ˼U@Ne^$.W~鎮ELߨ..ɼuI)d"Յ.oG$ɪ?/)*XKz੮GД;Du zIŷ)kηIFIU mIǐ+<%}atؽpT#zqX$gGsT 9%pq.%Xբ^Tbq-|TMH,<.Չtq+R4.49.*RO[)d'VN),PS Q_W$J3+L()S+Gd&ԌR.ȗQ=3* wдz۠CA8iXUI9Pj/ s=Ӝ_TEwL؝cy<><|BZت u`ڕg]3x~DòE\Yq.p.T휫%svg I5wG0H{7|__Xs]Njkmm_":Z?MKu֏YR9kܽ\,"nM)Tl%.~0-Kp4 ;J%SwA %^H_4(̈O )֝&K#~繾Dl  "%l3H\s>e5 T(9p3 7%ABYFew.$hd ?@/s@L :I' , ~aK'pw%yrȔ*Е%AE-OLJKz- &|QD c{_^UlD\wg`,T싒%|0Cגι||_ F _\2_Xk?}OG^7q/4A#J$2ghh^n_?7RE>PfU2BXI H,ȴѽ~t 0}#!N{#6_6VBsSe8;uCu6;;8۬j?"dޖBtDY{u}{|Omd pD{:+ĩwcbSİ}G(3`8&3j1w7):Wn)2=S {z}qަx' ށwdq9mMbo{ow74GfGx73۶rHTGΣhO3W,S c3\)^5#[o+[G$3{G*s}@8|@8s!ḥ 8E#?ŅvJyR/N̠<=>'GV9XuVl:Scӡ:U؈GV_,_DLt>~PnJѦ%lw{w}c_>ɩX9YS-C moiP<]FiAA M^Ue:+z+AL󿽢?2Pͼ@5`9c%,وh OB[k)YO@w,"CPIw}D%Y>5 zt& u2}K3TT(O18K{> Y,+PzR"0b혋3iqwLaЙjqwˬdح*Rl7Vw=%}gZܝYO'f,|b1mvw\ tŽ-W9"ǟ,kf2t9'dab矩&xoѳt5PB(+ ͕f{Β͉ΥAǚ(Q gȬm1rqԟﭹ?w{g+q=;ri2dlE"$n2;"Kp޺?̵?L<0 :Z\Or)[?̵? WWZJVVX0+uo^v]qs2sZW-^'-S!qOxP{ٵof!󨒼mqBz{ g9^~WF8HYH/uļd"\:jNV/ߥ?p}!Ɔht9M-46g]BKn<+/0k=)y>ޥglxt?ҵC_\:nŖ {Ȓ|ݺsYwa eWe @oʰ6xa\,&7,:]2Vfב$&z=V^Jrc#c綔La1:6Brfx-rt))?ߠpH/\Y8=S],.aBgoP7O$k被gk:L `T G =|/%h0ل''۔%ATܽgCCz4䐞GߠQbyPڏVBmM]^uFZ]n!RU^g(['Ǵ>||ǰH{ Av7k2 姃a!u}osas,l[QVe.]/Ks ./ȫs3OU"?vB.tl0ߡ!ʣ~4 ? .#ߜ\]']Jіը./ˇGR>N]So9ily+_/o嗷[Vp-^* p!}kT;5]ykiYׂr%k."p K>W8+1h8C8$2>(pqD>/j #ōgLɝͥ5>D|Nmk5k5hJW/o~qYT܉axJa$hMdJ)^s/˲*,&8r1i0 *[L i\tX:W,+7+ ]3eY[ z+Ƴ6IC5iZM@Ox5_-֝_G.lHZEOt-pQwǢm#<~n[0_a8bǽG8| ߰aMc;ִ<`ܽn!IYs3\HФ+l9uV]" :df*U-p%ྐVۿ-f$('"5X XbυYWAq(WFۯ60^V="b@\/o{M7D9Kk 9% zwqׂ)GHsK,q}#~s PTX<[jkIi6H03}\Tb;261c>՜ZY`E ҃h1D)~ZqlEn(&WY\Dc=XMed:@<9༙J1Ƒ(P# 8TcnB_h%t=k*BIߍ/ |ﲭゾOrP[_Q&/1?@`_KƗ0Ju/T?ey+N<`ä4'q/EQ64K i,a{7Q>E?3f,M/hBSe\r R;rs/N.I@S]गx蛖ED'I?pp#hOn\ut&CV'}ok~_ .vL? jjj1f&ʟk.ϵu ryg;,Οxu_KS1Ptg5r3e4pJz(\4(\`6AXN1P;>5{#.rI\s_8I'Xȫs"E>q 1Y8ȣ+̧+m(,M@0yM T<)`@a"x٨fdoGxL4rN8[))ޖL\u u-J>u[%m1횳vpN9zWwnԝS,M:~y~{sNw nٗU f܀S{T M$KM?!IJ@C؟.W[03ި!F0e)g^O5 ?sܯ4oC1z ؤya3VV_; f>v=$Q7fCggԣ5^(L{Vw>z | ԣS=+{W"0ߕFaGs!9 xӇF|$e/m6= 9oxz[5.GB R3y֍N9BbV\(N1wz?X;5́My™7^ϊ90 oT^cA?; <A~bI1ߙ~fcE\lv5+5N+!sN i7;qd$v,v8vNvHsYVsƤ8ܳoe9˴vni%aN{L;$Ӟ'ӾNi,KdڹEUq;g~N{W+Y, %Y1gU=ļcۢ3ҍfHaP<6G)*!w5Sq]rR/Ө'1z'nP8ȏs;sHF9Gŝ,~āvlT<:]9(NxV/zoZ}G t(IY L{qZ' q'}ʫ5vk"jE|r5;p5tI^o=[VߎAhnnZvK3*i1een6ПzB`ny\}K? Ap_'hE3xdãmP$~D0L8ɇW ,| ^#YV.o8y;=Qzٻ>{!/>Cv8wW 9 )#1 @\*2mY BѝZм7v=O Uz(?Ӭʯ ݿ|)z8~cfwu3.tPB :>: 4 4it!?h&_?XIivi0ճ86HNL'+R删ئ82BO8ᜆ_@͓?Fjs֩L :~]y簓1t8+Aw1;>~m_u{wp:|m3y+)3ZQ,ɇF8])7TPQ(\N5Κd*Wkog-5n#쮽kԏ ;,8yx UIM(Ijnrtzlr݀=RdiyXwv2Nlbr ]y@QE$Svwۇצofph4€,ciL@DI?/*_| Q"_e&Pn=JXK0W5au:2:` "f>h -uFO*e g.|Yk,F[b}klԝǧv:}Qdo~oC|QOͿ^w[II$Mep$tA:sSm^ݖagEJv J`k8ZzT}ZCw;;t>;*ƅ;x)ws=1\5KHQΉm&$9gCn?s+,/k{9oVqeR'#3O"qf#e.4h(C"Zc#)*W]@f3ʓsou^7#R>ԑLnBs4uުquUTE@wCsu8YNQEDX-Y{hZ`ofnr{:ؙ湌 SV+ԝ>R[p+g&x }Q 2ӘqY mGҹ-#^+d#0b,-cc"7 /JP5`pEd(8 Fqoe?X EݣnDl51(1\ںкSٚ "d>^t"(.^ϡEAր=9{SD`nzG+xgsܿBUځ <!zyk6_n52f_r5l+%?Q J(}[V샂xC׍-㜲fEDɬyA^{au[B{>4sz~ 'uNXQ/"iW,a(Bc9;˗QA=שwF~y=^ڎ:Ƚ1/0ubE)0,P?qlԕga~+JxmB)N%^l Q<)KQɃW,*֛@4n1dc9JȻ jZ֚ᎩF eoԙzǵnDy\O-.LjOyq|]LN ,h9Z@;}>O&w ݮEbdҥSfYx矧&n3ƿ=yPd|la%IBY`i<1_O]\dAsv{>u dR)=HyywN..Ơe,=)r좯ϡa%f/1qV3d\Hx hp\/ J^wW@Lk eY” qp=أ;X9+@7[q!.vp';Yy2еɿ:9U CR;;ˎ#tvQP𸟾QqpeYnh#ͷQĦVQotUoq?lxy•8,x$;n2d8\"N-Z%ӨܐB?zԺK!\o[O7Nj G7|sݍ[Ny\Y7ڥvEeuڋL^Gp{m.=;:`p*<p"~ @'V#|ُN*]u}H/ס#D~We<gfggƟ40}[`'4߬e\7OV) 1 u=JW>$ 8 _MDĩHF8s!PF{D8AeHh"$< _ FD'("Rpە;V'y\2|[ڜmlo+j+WK'#Zh9'i=5 ayw{ \y /\Nӆ}#L>OTwV{Z[[U:'1QWr A ͽ47isr+OǶNYO3|*LM.]`]ܓf(kj_ѯьOjoךͦ'ӎ"eԮb0O%3Ԑ̚yf@r=mj@= S18@c~|d)SFBf%p ̢KT@C?n\ܤ5&3MD`P*1y}1nvV|7k!s2ei~ʫH xpA68`\@~f}#pj9P%wӰl.eo%qz߯9]۫ާ+֘|QGw|B=o>j[p'w뻔Nma.tϖMS>U&؛7?%*&Y !nl?q8ZId}zjЭ8Ke0;:$vBlܹi$(%B( R*_Rj'-FJORT;H)mztpT yT>D߼=o:2c+rwzZ{dֈ!Ag if]\@?z\0RWf $a#aT$!1M8n%I)PqӐԍZQDOri (bb? &)tpT:' 7Nch鷠l$~qp`z0]^iP2eH`Y݄!p[QHPFBي\`'O|²a^Y{>M[a0q @̆0wAOְa8"?bX&֏bP߇% "FGCˋ[B蚦>lq |4JӠEl[>s<P$x#&+qMnQLISc@ М8`FKAyITp GQ0t )6dFaFDwRVF~tM ^7"I]-50/XA+N/`f߇aL 2 4N1@c$fs8p9C];(@İBRHð`(s"x>-(XEVBü\ ŏ&[nNpbZ0H!PBTVC!4pYvvc+@#q&`9zE$Z& G TNRVsKS@&9Ha5D N%pM#6du`t[hn1]--BX W(y }5FAxNRh@Lu0."cB! 6?/je 3ֻ@z;!$)0 (0nyN:n@K!s&Huv[܀ `bN@ڠガwy7 qFwHx=: ?j-$$J,]L&# ՞Nيdf 2 %YObP|fkr@VWg.hRhJ( m ; .,qG RXNb >bHa s $пAC-! *PTkzQ.1X); IQB Oh~@D=d7WL8 E`+9=Dp ʥ]mXY)[!/Z ֡lKj]I @|& 5\O,#]reˆ!l5Ra3ʙh$,alERHRC>(. hrOڇ|K ԬFZ_H Qbe.`|mI.IBxғے`EfvR4H+[j ?aSRL@ʸP~lOù_RK=ɵ_}A>D ^UR`sv07h?\ }H9D[VtxRH0="GaVh"1Q]T7.w֣|`vqչXu~]u.P֊IgϷtإ^I%¾g5 V d <G>(gx|b sLA )ڸNAwy@A AMk m٪ } Sw (̇YC;; s((1S{߱ ّـujGWǾ-3UHنVYr#{hR~`ĬnP=1LӪ4+HcfE'sL;FGOՔؖafl}ϰsx[|`ri`/9ˉ~]L':\T;yT#ƟgpȮPa_ĭ (Z{; nl7+S*L)~Ev H2T0')T ؞EFiؐ/Cr8#MӁ8j 5;1^M &9ԟ禾lzQc#^ !4UB,8߰Jm?oo_ V_kXe)hwX &v]?bIР m;xJ\F)v!Ox.$H=F>xqO1(X;WOtր}\ӄE1<$}Fn.`pt5 DGUvE >*`#Z ƙvST% -UH 2(^kXhhsg&ПsL ,AkHHgy6jC8%zSͫv,ftjb'[sU|rlc]5 YL{6 Yp O.LCV ]ԝg€;[\PI9WEY9I9=ʿ\q׻p5p\5Q 9z5E+_yì`dFhW;P(Q7?*9]A+AkW!21̕|HVy>VdqjheixYv|4յb㝙xglL3?{4=T͋]8+PqFә~ D_X! G2LD?,Qn*~"O2Y]I AףsjU$^vq7Q@IGV'_ e0zzx%1n"(y3 .,}Lȉ&TXC kh0),ŭU 9} f5k^hOUVBn k)_]=! ܡAЂ0¡D'%^ \W%eV&(1&I _jl?q <nq d^m1wj^"6ݪ$%n {YlXj8"lp q[l{Qc zeLU+A|)a/%U}-.yY~PPzPbaTN ~ -+BNzJ ip0wBe* [(!fO?F"*Ox;s"1lnivwsnɺ%$a]=b^d׳c8b]@ '9 s.8z*v$1P1~̗~uk/ WEmIEmfi4ixزX/]Fw{ S)/e<#~1T\^ӦY(SuZ.@!s 5CwkVή{R#ܵ6P-#|\{kdE&02ᇼJe\p[|Y7ݵC7%*;==@mP@`!oa\QA`п8.SZNt*6"z4~/o58CO*@{߳q*/ޟ!MD."Չk%t1q)J% o1'X5qݏ 7r}ڻi{xp4F'ݠ🺳CԾ{0J'3W~r + RT~؇lkoS ޏO}bmT*Dzi9(s{WY۷rzdydFw52amZ+P=GF,L+oF]'eX1m)oņ2wOe)l,aA3y h& 8.ML0Jt2'#_Όl=h1%h緫JjWӦkMgw~\e?Wڏ qr? (%f&U𠤗:FOXP'1@ku[YKh%t꘵Lj xk'+mTR/UbBA G8XZ>ٟg\󙂗tTnZ۴ek{U5NgXG:Mfh=AX%nԒ؇_7IEya([k@3Ӂs/Ħ^x3} #~4>-椲֧tif;C6HBH4X ]߅-f0tK?OEU@LRAQʁa3Z-)DwE 3 j\-`~z<>\N SN pa% Pb,m&z^3#WqFb/Z\)XR[`Q hUp} .Cnw]A{?f2\2(Lu[L<_c1+GFBb.ǓAA@ ,QǶA 'ż51N6[:B+4\2(!\<.8QsP0!^W<׭LWLY~#\3*S ڣap ]1&mD͖GC|Hra,K+D@ z&1i[1vPX2q"n8obt-t$>BW0hPяw &Q36_s,ąs&@(Ҙg-F~Da9Z+e*2X  `$5+[4!Ճ cդDiCa2Ib;3Be[>M0{1#t؊y=^N ^ +}W&!,)L> zcJ,? qZ N ż+&E&KsfNKDLlB*?( c%r!!DB*X2Ӆh+o c, aVE,Úi*ѣ2,L]&_EGx\Ƙ$vy#cUL (@BD9{/xo`T& ,?V pT@˓PE,lOyQDtﳢf,&%'3=1FRчϻl;?YCA?*BGHObj>ⓔEL_Մ C%+ B8iIzbJAAgyl5;fI=/ ,puEg)L1*g#1G/ :i ̢wN  @J@b?ddzc~kSmd,m!luqيs7o$(ZS㯰1.3Qt5\z+T.xTJbLIӎj1?gc*U-)GSAj!oPdž,U4[bAR!%Wbc8qۅiT ZiD+4b w~B#+SZ:G֢b0N|΍ø}xrQ@s y 8_?^=8GfRI9,08}j[H0- ( k_uq0]W,)+ em\<ml4p^̴_׏]] ai[q$6^3/Isp ʟ3`0}7ݱxTՇxTC"ĒҒҙ(ml4 'w/ؐ JWf{+f I2930jl&vRa5 %cp GkMU'I /RrE:|Q7a`);7Vܧ6 eH0֙M#wY@K}uO]YZL!B;qʍP\cBBaCժNGnaH s14LdH5 S9]F阫J`؅b>[3]‘HHQvsI-3U1 Y@cQi7Pax햬Oooȥ.߰d!^-UW:2ޛrܲm+/ egQ D[[)/FPmT|Œ_$Od7~7S-4^s-wBPv4L.-mkɸ8[RkL'L}>Y0M3cxAMJf9+’.dI8-ěo^'jw1L`g/P7j`c!, L93Goã2YvyxSY3Lfd-\2:zl}G4Y,'Cg1r֢)NՆ~Q]9N~f>7u9No0 fRiY_.hTVl,:Gu**V)Qmfrk5*46VBVSU&]JRMx?B40u!F3˗p46kGpG_^b޵\3SA1c[QP|6-{ZeïR7[MSeWZ ZV@STf.˲˲8"&bYE ``ozbc(0TFdYUQ6+彊cpsfZ8GǺQog+h [Xk=UO')z=r* `9Jd*S4΂V-*r?{UȗzXPXԥq!=Pa9, ړ}B)UOp;eKʃe4 [ٱu2u f\l[ͧGn~%Z)RȦ_O, ̆X~k̆[hյT,bTF 7e /hbT3 13K̂Y Iu jJKIs`V(l6B-l\xL%q$< \ LP ,ŌZ4 M"񧔶ڒ77 `o-e~1Is+X1@Q*zaY%Uk%b 2'Ҕ"{B*L<'HQ ,L$wU@dHXȁKUPI_ddn rI(N"v+DRwL.W{#gHMH(q$sC"x*KUr/$3P/&݌LG"v(_; xD2+J x&wi 6KQ?! ]N# ArɖT,ei +1dbh03JńܖL/Aa˝Yn<B2L1y*v!KK(*XFFQ\-Q!r[Xk^{F2X~$SP }?E(z-뤂"@,tK̑LzTs^3W2AB͗9>CGI_U}s7E|N;'(D2b2_{售Sm;wשSFƖ%1$B]fm^K%c1= <9oV}Wsǹ aqo#tlE5wh8^mxu>li˜+15WU"2~a,s t_?hW>s'vråyuw1>n/o{M3|q{/{Sph>Gu?audU~ԇ{&t}MlF= fQIwlYUCǠڌ5]qmbPL!mUm*s+LyO?WAV"cʼnk~*|>k*H ?{5ee$aiEU^[A> TƍlqP&24F LvFT[ĞsbepJ kUE~JkBJԄԨ9oFޠ8^-d{x`YE!?ۃWgQ4" J!m=:P=/!78P^Nml?Wn?yMildwd]tQ;Ctvj?ߪ/|潯ff:K${7}LxF4`|^ sd:Rkh4}-N6僧+oW,>yMl"M@}iz$~:m<'6r3GC7q?kyo]?oPFSOr++IMyZLAh4o0垆lಕkylWvYf2q&[ !KSY0f%I^' +vC_/&bzR ݜW[zʐ /ruf9`澥s; RWK̷%T,LB݅iw'uG. oL5;G|i~g N>Z`9ԮlԅE0BJK j(yU'Hef{QJ勜h8KI(c {FpcwrѨwmsbNX,uY4^P(vW[IU AǖyZSs+_UR{y)~bAܹChqicB~d2]JOg^Iч=h:|5xG*.Z(<D:M@lX]uTCfSFtS u@O ?7ߖQ9%|z6]KM 9Fs¡G$ Wu.3φ2ט%A YzcvT~1UŴ}i^EaKKJ?'ɤ|إ]Y]/KO t4. xOрܼU x\FN Lf* 4!K y9zG9R[.CuxkDŀ8edLHS1~f 8laO3/I -ѶThĀFm֕ h,QvƓeXaZEw4laY5.G kmE^R&"*m\RXFeFYփ@Rrq}zL oE9?t́&؊b/`SΊA^,y]SkMJ 1uX?C\cʂ>BQ9 a'C&]ڲ(֝X;`E$XlU;|E|rcmu'VT=Kmc Kแ #G3Ve°A)%ˀd\M,6fckt-C]Srɀsz_[&_^+^zWׇ}_r_ X`<ElGX}(k)ç~Ռhp8oouޣK"Uч-2\ ĸVq\c͕+ yfC_ FC)cM;UoQ_+ qPH`g\V?tإn\43AdrtaS9C!}IRJ-PiD}co5ip S?&Z#xcs& Nߏh7Po@v=|]>]l 'kj|nuuիXΤ}6VLU or%`2r>X6FX;ӝevȯ8DN6:DZ_`W&OǏw|e}?dc {{,ΉĢ!acl蚸IxtU|iEKvrӿQa 0k1,XrS4b8P^%5dCC {kV 4zgBmUEN-Ow[y#|ѣ?[[yJ+kYVavӮo{kH+@EBp4Z+J>KI`BQ j &UwFǃ]YfO4]}:ZN.sG?}RQ<[ao5(&&EȔ82'm/Ojn tiZs%ey%`2Aq} I֧9BI;lU&MoXC5\dU,H_@A49B[5YG3<ي-8pjM#AWcׁGǚf;aj!Y!t6ȧ/Li?ݫ&Xt 7Xbլy Uv@NY{59q} eHM:=yrA^üAh\}i a@FQceH2N9V֋ۯzR@B;i+P`pq z᭭y~]/LKaXh$p-u ȃ-AS!r^Vfo ~1Pע뻺 aML7㺐GhHH=I"(;3tBp^xų)v+:ݽiA@ `|V2 U A)q/~7)tLʴF)2X ;]^w:_{5ZN%%W$*أ\rݖauFWȻiN\8bEwNq 6 LJ/|:nI]W: ]1E_IVxrvc]_hZʮ!ĘtG,d@jUfһ-kIJdBAם^R~A (zkƘW hVX)lؽ l&ٰMjwehkNQ-9˕;rhL`FUKWuuOҢHXXsjp ]vE:;DD27Xg_9oA7!,yB6-1zAo%r*B>>XC>B>Ja\#G!Ydf /A~q#2l&ߐM/~Z2] -;/ ae A"Y0ͽ#E'D ,k}Cݯ AH4 %`w=NYXt q)=.e]kzNfMEW%#e@*/a0&e79] "'}wkƟ,aq# wӝKU `m('ٓ]Qfi=%4Ld m}JWp@syr=cI-_fl=PoA'\qT?6eEs{w |oE O`cTWc|Y6Wus[}nÛmw{|V+z~崁zٽ zmfs]] Qu,,-ʁYqŽw`r- ~vYU p 5ė ]wgw^Γ1ԧ̎ݤoO@" :%)W~@xdwCB)/{ǧ'~=<׀#} no?w#/~f qܮL=>* Qu3?ef݀0^Ŋ)#manQ[̓<-9٢zH빖e2<wxkW*bm+يxy]eϡ!t8ZLe*/%a߂^-ǞX] Pg?+n-<"7PkpH[0nP߯tn[2mE2[dz QkooZ(NQL2$k{~3}𲟠9 =㨟~rې>I']~r[ҟߔsD4]|)uJG27O4Л4czl _M،X8516K՛Q a +oߌ}ļ+?o׹>leOO?w2W>tGO5Lt*hkk^.fViq~z[QAJ 2ИT' ~Wuqe܄1g0%][.vUy?O|/#7%^e;;Fb|KvUuZ+u\oYeaNnGl]:,yeRSEgvyUt8ȧ;aN)F=yԒ 4qc-fM|@M6qVm`w05.w}gǗHhM=X T 9dUmg%ޭ;^y]DNڔcߏq @ӮҏU#iQ| ;٬IkHM}<*Na_{0XSJRf̥ 눱 6MħX)D8LeņFIn-q&FGmbSL kDL-+f@**QU^AtqKEOi9Cyb3Zkpxg<2gS Q1/ rV@DFmzfhd |FO| 쎹rj$2Q˒o"O*' ZݪZE2o+EʟW|?'_3?_7W|,_Q&$loĂ&K} L_ `@ ˌNL9΢1@&L.˞ĕQM|^\YW ʘVtQ)>tϣATrb;<~sז͙?&7LyS("ȚY>x,E&FABܙʣyԣT=2Ȍb#'2G^.#YTY켹@љ)^ 'RO\ 3.[,Ro|RgX K-|)֥/?|&95wS4 X 䓵kWi>Fs=)O<4cv/@hYuGP~he_uoo21=u@|yψ}YOk0DU]o[Q־hz,jbo푇gzBtz < lhq6M}FzS6р=eYնWY*Lf`A ϛ;[Gv\J[3n߽aNsk'ցvԚ]d\ȷZսJg;]|`U42Rkԕ +ԛaS?< CbX˜s*!ppa?@=OL:#]GK,6||qՖA r5j8C?@0`8_hTՓEfi8 %Yn|7pBNjj㕚FnNVQ#+J0mf"*vUv.Z+`Yth峝gjG3:0NhB-D" ,LVEh%J[m+Na`ZIS˗VLnkP$rM>>] hwF>iltXCȺL-:ʫs+dmY\ "KerWE8q5)qB^kLXրI5E|lC=TJn<51KEB_evfhsr$ER42k"\tPw>^ gX?BcmvasEq.EȠ:8ղ >ctg$1@XQ^-^hxfeCLn2v/|o8B~0+MǺ#'<>>1 W8њҗSJ_xڻi{sXMnO!j_\8~nbdBE}3;?9vp_M?n1l+ЕuλNKpZ0N*8oMgOփ#pj[30?B> 1R`GW7piwݭsrl b%ۦ%˹f)8l8; "^ƿ+QَWH5r9ݭ-b0DFۺ54<#?𙣏iWb ]nAɅ1׻crgt<(9.(yǎ{6;p){},*x?? Bww"2 ݼq.CZ= 1(乑[/8/c34dʃtLǛg渧}n͜,iQM+7G3wxeE뤳U{Nt2qO ѭ5ZNx5dK:YONL`b_5#)_)1G0 -FW Tmg]vz1@{(6:xQuuEi$o[8z`|Uɬ3Nx໛56t>p+8PZ> ~9wȧϬK^/bOJif5eyVJ3TpJZl"B$f,\Xp/+5yR+kM0AS5sUʟrnGAtdysa<*QHL$cvl "g@G:|?|FIDp*$uԘ>uK3$IgVBay˝7؛oq=릃^̛ta)fl^ڳy5d=@>nysʵ}Lĸ|x 6Ofo=ǻj粉.e[ү,3ir0ne21li{yw47-$ klL_q:;Cfx{qF'FZR"Tq*>:tuYkKLE݆ZH> ,( /zkIbuXrΝ+q|šH|Oeۊ.Q Y.}Ëb؋x?,A?m͡E'f3 + :0/ `7gO `5/ oqUg٨;tY9BݫHꈼ6}dws V?Wt/?kLWjV{|\U. Mǀ e%ht'#zoPnwǫ/kWP<uadN cªnZQ 7ee(Z3hÙo٨q/U+:5qS+qZc\JLE -5`:pb.u&9[H>.N!F7)J ڄ1 ڵڧOT= ?&ޛl<ӽF/7@)%{Y$獝2Y7R1J[ N}'<} 6 $ 54=j faŕwEy%]i|h3xA}иoxXJ8hC'P8T/-U#K _:Q5|R1uƬc` _,xfxepC~{3k\9]s_d ~˚ O&C0Y⇽(#œFEa5ZL:#TהAU ?7hA'X5Ul Gn\E9#Gn & OahA:G+xVoUMB%L}ANf8~׿|M*/^? ]_UjXB/ߩm/;-pZ,bp q!q`^,8@ k?q2`^2 svjFb~1"_T_Ou۸_,b&_]//nի`xn%?/*??Mq<4^?psSbCx.{dX?K_=f7sd?jȏ]eG1[?w/aWzcQ$`hXgL4{l/ZFeOsOO4X/ ` }Jk5~ Mܽs=ܿ.,_?«`qGKK-6]YI%El8. 2KW̵/٢٠+ |͹׌  xr=FJ/݆6R]&vCOdhAXMmSZuj1m\ -xf+uU" 3*Tz'Y4z$/ +f9;{[,h ?.'&拹Rn8.\A }xk³ !  wcOM3;eI3喦9L:Z۪&W&CcŋUZg@J93*>F߼86fm=LyqPH z4BsycO ЖQ&(CBfBfӯ־`|{.J8 "Zn!kerV쪤 F16Vjus3򭉻bGv3mx"W*ZES=Yn4nƩzɍ;RWN@U 4/+ǚXNĽٚ 99eY';(9F]%nb`\,l~X9oB=H՝;K^F\T͖+ߖ+ z{%E2{ tK h)SY\7 /$6__׏VwTKīl{D=n6I6 ?M oL{WC&پj&!uoo\)T4fڛ_iОl-47gxM0Of򯼔9)kɍn/1V-V9M{&3c61,Vj3c*%U&x"ӘwL/d4h/+pi_؟?7__Li4]M{KSs ~/ѫx3W0So4KKB-y>^k @%a[\~N̋6ARBX5},#E*V?0V`]OQ1D(RE t[,=aCk}V #:a\gh^[VWg}3MtKwF)! J`f .ouNqu.V^م7 (iZ&bؘGEb(Ĝ8[dR0.z^@]B9 >CؚH3PjIE1]4%$}4mBov202,3Z&ݏr Jvc;(AxUeP "Lats$tEa.Q_>$! 4|26i)<'c04JDD×^o0 i ̇Y+D9?b1ރҿuI:)?D8%8lZ!;@2-LeL`'5ZOe3Xv$Y&-k xZfA !$Kj A 6s"gMEia-6> nV2`ms 64:-FmߤYRwy#PazC췫v/+ i1F8V-iyf_N1u ,鏯n-Ob/<:LNh4=޿7ҷhg~I|2=kSPBƀؿvN8v "?zF/MZG z}k9|}wNޟ6#ԮuzsgSԙd]@xw{49;oqZR:OFlBŒml^%z[Mf zf5~Ӝ7L47ig9e $VŽB kv¬Jv[AGq=7u=kHƏ8 +ƙ:k0{mEY3|G옽W@xasߕt{p6Z!䕱kLA6ăM ي叓ӷ@Xf7oۧNmLdo흞`29F4MCV9<]A58-Ш?zwk8څk]iUhذS@IS mcB1ZH4K 6ۧ$hCQ|5]C.ψ~ƮϷ_~NwT=LS#FU48D5DÞ Q|1[ç]/Ȗ9_ $.yy,@?Km*JVfUYɥzJwPGh,:Ha[5^u\K;XZZײ9)o<9̦4G_fZfzZfZ}9VuƏ2>6^yq/c2`×]9T>ibkxIx뮉XT_C?qB Ο2Fuvs^,쳬A(o*f\r3aIx$i1I|)p2t\q*+)m>5*)F=ЧvEn*MFSH;94QuG@hI|>Ȳz>G[%[ =*PM^WHj6E 7C7گ:5 ~ͣr] uŬU;;܉gRǚ kIxYy}c)e'?⤊FHVf8VS5'b [@8NU~lޔFoޒSyЧZfK*/d6`I-ަgӴD7Ⱦh"[ pBqVahOb qŚZίB@25+ ]B~[?A)ۗ}7p(Ix.|NN?-OJytf_r؎V S] _jZ5؍7(.7t je& "B+7KoХ7*uV_jyuE&}#3 ,OvA)<__ :z]z>GRϟT y.] tMw"bsSꬺsXk_&g]9{Iy'n=r:TRdpWBv n jrn1 Tv)㘴@ϖY Gێ2bU M؄${zZ]Ц@_9oW,t݃ PoFL}EqF5|gOQ/Z/aI/?Y諔*qPJӿc@ٟ2(z*:~m^-\n&#{u䦡}}gs(]XΑ~0I'aLW,'+Bɐ>;*IWjh L@I%A*⑥jdg&NTH1XiZb|j0 LXl9 yZ[-<šy-s ~ҜM~r[}'!g!3TODDEwMQ3H#"C#niD˪6Yr†LS?oݸUxBk&I+~qxA?v^E'/x{{VJ7$n3cthELZI(zbded{޽xG/ E^Nl`(xڸ@k mhm۴Ο'u8UAWxpOj_ОߺzȟQǁFi.uW7_m_RG^UڠDP"찧\ʷ+蓈zX 18tW~ZGB: UMUmcnT+q{3=OϽїQ7}|nZa v%ӓ:LK=patF6I$OBЈzdd:ε`iPv5D\QΓ{_z^c)|Yw203o"$+ OyGW:b 66e;ӧLNr;d rt/_rxR xi",i-p&,';%~mS*j,VBe0*Je\nXAXHӧrӜ$ 'kt)Q N&O4gt=4>g0l鼳y~Mmxp)`5kz1=@"T5 8"9,*z@Hԫ7^pNT۸º?rA𦀧sw_%#RMp$|rB]3<#X:P&y2y3/]gކR3\Wѓrۘ>7OKisc*0`ܘw>7ɰܨӔ{Bmxȼ%dwm{*ўO+ǩ瘎 MOIԅuÐiщ^Lq#RA: 10B7WN͗0SN6=V}GPu:=r).}~҈Ҏ#Lʎ[#-x:\[s^ghC .MNIJp#Niؤ)Ft υo_Tl\&X^%AR KJ/罸y?o}ϱkU\%w3|2N@yW*.WJoRЮPVi.Q_2=%c4c_1 x; ?v;sr#a9!^a/wwۇ᠏]ys) \ ~C?*+Ddv1Y%?u~wcqmlNmq,da~D7W !f⸔ 1"L`PJ&rbhdT:&/g@3U 0?Pw0U]|) '}3aw1<mqRU@S}vPmC< 8a5ْ/"~N巅ow|@]x}fRŔm_CTN^ ׀@kt$uoo:lt5 p>-͟!*_p7kr$Q#c/; n3}C.}$2g=C/9}J(`B)෺TӽĦe*a$l`X$ /s$0RWm7va(Sjֲ%[z.Oll=%?ّ.( ?#P9fIgMfXh) A ?yjZ#4[1Q|;})Yπ!++FNA˹7 K-7`xb3w5찶aD] =[{14]=kx[# @IAyK^P/;>zHP|e-ߴ @\bqǻrŢcb-sq[XnAmFÑ4HC.w;Wpl|q2f,+E{m1 Aɽ 9@c%/!q-W.-THMS/|_/pe#Y#_oc#,|5J` m~#җoėo[ݫh_+O_ɟjvڳ] nK>׼k}t gziI`#ײ sF|ToQ pP_6A٘9/ژLS;7^@gqMnt@F<G藡BdDə\!2?3}{ *mޟwk ?Eg{ U7ZxH&ЫrLp=H*J*cs:*ikKڒ.¼wv=&Xy1|KSopOȷHǯ]!G^NkejE5 z>Gy84M% JQ;;?Z( Ǹw_0,5o5DF ۓމDzMCdlW \5M7Rc  R uMȲ"A?&yxElTNf{ȀÜ iۙ) Dއ(_éiX.d}72wSt׎?$,)߹9f"r?W锓J(Jpx`) &ϘyËfWؐ q; ]g#,*й9EWKT[`HRTftSe}wxv9HOGz{ĝ1^pg=;cU0/[^I*P83T,H@ xrf$>Ϳ 'Yb0c`,`P&ßA!/J 7* ׏={~|6#'ʩc"0_7pKgK9Le)PъƌP./[@bqvHKqL-P`DGԶl!KbNl(i@r' *|`ޙrMn%kƳ);DĊEiqs:KvȂ4\La4 ަsԦm!5(/vM!O],9v6줖ILA 8~^ߐfct0[xmQ;!Ql=\λ$Z|<{IJ}072,_R9PvBg 34c61e8[WצZpK}X1Ov'7`ڂշrX]i̾pIn׍Ocփ@LX j%4o /Aa]IILFYr Z-Hm+9h 0/HBWxdT'2j*2Mq&\.ϵ5= ym}hKh/{ʚ0QhRs)ߩ&߱o?x盛skߗTU,Ƨ8ƽn*煓TOVT?KA 2"}jRުU|֨[ݯU[Rk7%/ Vko aM< kRԛ_iUš%_Wq/\?Bx9ccc$cCQnk7M7jy衧 ]3:-Nky3_i%;ó}n: 9V3 rv~_;kx:kw >(kwg>kw߽q~?_;iRX;c?h+umήr |UcvA"Dw^{KK>vy٧]a\}K^HcK:W+yߝl'w~}9 &rHGJOyA)kԚ Z: tH$ZjUhaI:ôtO| F&}Qk 9~EJ )g_/C1zMšO$ _o(m)p#4zj=5%I%=\<%5Fq~RI5"SXiTRi44x'9:9]n&U_EUJAR]'(7|*\W>Ս؛;h&s)_T}_PB"wUq,0iA[gp~O{j ֖ԓ ږ ҬQ}V _. roB3jI5N <38+WbJ^qDŽ7Zk~'3Ё7=٬1$+;+#tK2߬l5I;A=×ɓ{SCK . lٽY>9OW6 ῇ">@|b`Xg 9@wI6mQ zw ğ=wW1Pv! :Žiz;n׭Ιn۴G77pPڈBN ~gӲz<-$2nX)se0\f,B&HB|Imohlp\q3躈[5KaAyr'K|./I]0^욤r`1z7%c .op8) v {WUC]ybg6UrN_ӱlȭ$rHDx{^k_[Wq~?ynsBǵ2._4E=Ihx~gBùgh(n=<Li͸NƉoxɫHiT?= pvjy>r<Gp6n|?j5, , B[c'PW#'PԄb&h!ta0o #ohXvq;={wK1D UE{rYDwIҥEI-}t @a@pQ$rۡ;.Ma8{:9KG'eKNh4=Db Y-h8Czv%^o&$E'|Lwgtua*^;1NLe, >(^14~/I̗EpJsZz0n}@j ZYܡk2,p6h_Žyc{~IYuQa}ZnJH }:=t;DHǚҤC\mD2:l*z(zi)τ4ۆNԂ1ұK &4o&^$)_(R`G4B2E/Ig*/ėCu|Iu|? Mht|s&/NM|6|M.{j#qG\I]%͒gx-V?wtPD0YjK{;&gfh^f8S#@D4r⥵c.^%hd!vuvuk;:]:^g&mp03~Zg34XpuƔ:5ٮsٮs <T0X.:޺ghgPW1ҥZ;#AM񛃟+~"zR¬mhT9Iclclc`UC/WsFVjl JVJ 9?iΪзgIF0V(U)KꧣLS8+t6=S8)ҷXJ>pJq"iaC9V|ҏ] ǀg;I2p=O$X6Izsޙ?Sl Ǚ>NÁ~P5l7Bꆡ0d͑OO1KXVXHI? ۏuJRE$M@Ñ*hJ0 mvrk[g[ L 0f?iL8`3h)i pƿۏH@!jl*C޶$u$-Xئ NC1 >-f9bPq`(|ULvB] ).39Tbnpzwh܃s&Jۛ{`aEqT%$4o~{L -28hk|0^0ݦ]NL{vaz (zEOKĹ6p4p?bAC,em߯M=̷kSzLk%10rjG0]aw棑kێeEfq>_݇n T!S9_XҪ3%tMM " SIe _-z- hN^"G0c"gPFP0;6F|IO/HeOin/CK^PG~ L juR %xe(OnϬ&~=t{zM3"(s3k-iD#X{oޛ ѩFY6YfP/~~>kj >M2fC5 sMV{iXrk!ZHWΫKhg? ?KmSsTkk~Jk*>N?Bs^apaF+ίuE]Gu\gպ8*xR +-sFF_GF_L.QQ:*8}^?M{1f +qwh\ k+ ?D#zR%._*Ii|(8>= 98s!m_aεOTු/|rQI'l^;Zp?4AJ-oH3c̋Kv<"Xr#YiZJƍ=NHhׇsÆ#/`4YOsB5RPwKűS;ۥփN?RKm3\?y%1.U3{_6nc\wsԽ V_^=>+m)]`\HU{Zz9^;*zE}E ۚe/AvÓQ#UWԐ^Í0\Drlq=/ 5֘P_WP?HpK߄}T8(?NHh@X8H ȁԄ'ue&|(JO?!'t'b}`Wȯ s|""$aI{nFEz.7 aϠ /3h]|'V7|{xCl{Cp ډ7>0*R. ,uy Xƭ77t&M8I5̓_NSgϧѱWc{Nױ= ~]VMLGL﫧W˟^d1We`G Sk*au$eLʓ4F957I=rë́YDZXNLt,k/0k LRcg|Kȼ3j$Yv5,2I3'swOfMezPr~4*|,^Cx{BuGAE@S0$}Wmn ˆڲl ;Bg8iᰡ,c s2q8g},kzjM 6y8 @BPu -:q:ԇ}^/UJXzҡtDOdPw%FR׸*R,83L8Γ6I #lNc~8NpdyŠ#ixUG-Gk!%b,IH$4@g6!cgY@@Nu :{kdSZK) hѫ'5TNӶ'$m3"ǘĎᦵ:iM({IpYH$N\G \ݬ%K!<*[[ {Usx&ئC;8-Rℽyn8ʒmbatuʌӇZX-?FGpxaX06ZD]g(Qs4OhVXᗀp]efLSegM/0aU kMj*״2*PYGJf7O# {u:>;tryTy;rQeMӓOwA}Qi*AZV(Sc)h{]Pq1Vπ (fB%k5@ٓ=pwӿJjTxH}3 A+jc*#@Gҙ ]_rq ë`;+m:L[]/oP]R$|wxDř tjtR_|6TT{u/e09Jgltӭ䘂AtZ'jY-ֽoHg ) {:hkbvZW{E{8lU740ý+Y@JiNUD 4W{t#=݃95}C.hN %l8ޟ!FW^"Z={ڴo]wxP@z,vJЛb{VKP|Wxw'p (:+b{gR%eӽ/{J}5t &$mM#\FG+pB%fG6/DEHc,F t!@v` ;x&`K Ƈ6y3"T1.lL*N~B5} ;"3#x5l.y( L1PFsqW'9.u%u|>9al&UVQSD:<y1`VQ+!GZ̛M<p"($goO>)NO_ԇ~64zX=5xnR+lY)X`*ٕyqЧG>-)@?BS!F'!.p9\ FnpOl,)yZ4[=@VlG>\Pje@'K˙rݨIna9?jD=uO:Z$Iݞj]r{~|㡲y9Yg[Y.ѿe*v=7NF7v. gh~2;dsĒPkmkE3˸0P]{OL[݈h[Ge=dn MDl %wR4]ڨoS,6-m$%uҰh  X& r48tF+U3:]1Mi45I:Tf#I_j <-}%;`ڔvS Ɇy{^dJnlf>9YXAN i3t,'Esf4}6ޭ;Q7WӨ/D&:Bux$θ_L|4gEOSڞENBn h`=*Ug7t׀޸:Vj'Hݹ,ZAḣcj[sTt 6tyR~R(Ng 3JgdGe=|L}q _NЛ|jy?g&هKQTDCO^:PpblC:n֮:k)22t JZ-jެg oz77dfSj4ijƖx[ÚҨÊlooo _TƱU %ųf%`RE+0ܒdeh.PիX_R*)dK ސiJ%իB8*b@KjJ%ի#!!n b@KjJ%Dዂ8ʖ$l4~֨[`*׬65.zC<Z]NtHB ^bælmVeAlUV CIct 1.(Юq+ͺ@, ~#ȆTÆYګWŷz* AwlEB -ٞ%Fךf1ĸ bJENeU6C o6gKml̸_( c[\ïx`kK aXWr&굪xAC6H  "AZ rYTj10խ0 277UHP |*$%ުg T+^ЬKN(o5%cr*/Xj1KT H^]mIZķJUUHl[.jUQڔhZV]zC@%FOMcIMiT$i,i4zjyۚTdOFOMcIMcq~RQ"FXLcIMcIMcq~RQ&7xi,ix'` ^ɯ f! Ӱ\XzUHu?#-ITV>l7[(wje@tYc; o4Z Ɨۉh  9rժrkjE7њ.wtZM6T%ǯV.1oO@PrC|耤&BNV39\SH.JCQz]2J V< 9߂r= hF(gUcFmlm$ VT 9oTWF$"(F%7)2k@-M5BI -ؔ6ܭ,1wIyʛr!/." -1ՠL4By*C NH&oA=R 5*l8ʺbh۲4"w9`A5sT#uI5U?jdF)2@g/>UӍT+ UguA2z"SXRXiT=i,i4->I*F'S4O*F4x'!g􈙘9wc߻o׻E/+;|~eIwTF~/M.yyt>w0|?9ʉHW ~<|]ӫhC?g(bmw"zpw12.C Н~2Xr8NWTVq8]~St)C2cn~ ڑLm愠BFf)!CwNי!֙!~XfSB.-DvV)I!9!9!9!9!9!9!9!9!fG焰N:'}9![sBi_1VNu҆u҆u҆u҆u҆u҆uIk uIaS:\fv񧕬9Xǟ:E1 efyPmAr.Yf`m?gO5yY{˚OF6&фβ'dWWDt+OC=\K4p 8- KO7C?äHzJt3 %xbl0(zſtIy9;EShI UCv6G0kХ8ujm"E] L)Jhd j"h ѝ\q*aS*nc3~;:*mk4GY۞.7MN~c2Gw:jUBw?=h?I{װgxQ/N3F&آ.uߪ( \"`wc<<-r%ߓl? >ÝGj"SwgxdQs{hFۦۻKL! T$;"Iz"y 15u($uʵ7ʫÁ<5Mƿ/wnۼ\.Bcw{3h`9g7-½_S0Tl#~EO>aP9v>;Rs` En*ۘ!,h)y%p@(D xJGcW`9VJ<]Ji_qRIrͧ7dׁXz4gl0a8i%,8 CK&`Bp|{r>u'NsHed=8oԴ= 7{cݭqˁHDfZUɓ3rnF$v8[>tw.;ie*M`1c:{:QΒNظz'CG2‹`'ݥ-Qp>QԵYfdl/ F=|p&3by2̄V鞌|Ykg˾7SXf<s1HپGQokBI|sWH+ rn[Q1xҼ,arB:4^e@|D֨>;h-W6wZgB"K|zmٵ8.T*<Eqc 2.CcWNwA.wkܟgz#*>.;,E ꧻB0bv{ :Mx˓Lj&\Ԁ5&ig'k!o,w$o֍ b3NVCeozz  S˛Tߗc\16R*/][{~\ *]d?p)zQǜ-?euKb5B|F "~#Zf:]vǑ!b4xTuQ9=JfXh4I5q\lNM`'כqhۥ7d4#-_I)ڥä3n_t, SB6ep8H"RJ|'!L! d_N̄VEY&rp Q)<0Of)(3y%8I"hjg.ZKXZ$ vV_b(  d/I.l~8(Ƀ4WOa&E5b+h1-M!L5ʛS4;oO_ԃ>˅*I{o_HEqV^TSdWDלy"4r9AomHoNptgssiۈs{.) "6=X\Q.& U;hS=6Qr6:!mwQ[,0~5NKgX^0dnj*Ob+{<$w3q5:i+r%ԎsPG,ץ0nƂHgp,[Uq^Sgq95|B_CernhsNK‡F,(_l '-"a6VȻ{Աorlcoz_}4bRvWAPtI)RKHH뎽v&NkHSlkɝ#k{9~RHh.}a`fA[#! Sq8>E(Ѳlkf0ĕnnPeS]W\[GƑaҫѫWtJͪKj/ e\ COo0&BEzn[E%Y GTg=]Q~ȤK@]"q6b$uƚMR657AyEE1>OnxBrt<y"U ri)JkA0.1mtjt Z?Тrcn+v@b~1f8KN!5a+“.(eX2 2x`/Ȣ)qx9BҌCde! w\E{rTg,}<`fj4a nfב C/ 8 %!# ?2þ^ٿb pon]J 37iF¶<^WMwl ^Ђ{Q?q7ؑ=tf$̉Mݙ]kȉ=ypJ5(wo+ <3.3ܪ{^ xzap\& w4P]u !?'yYKCJ㷔1BLl%=B%uβAtQxhq@g3N0DGLDt/G /_$g _a0|-oۓ0qQAd͌5u%l6g'P߼-ܷ9x򤮐#J"8tޫ(Bsa]íftx l+/]yqEcQ{3qI!uGHÉ8 j! Თ{ y7;pctWQ%OC(?%Hb<0&e_x3D[)ާwE֍veBE'ᒰ5>NEvA;c":ek,'sc՚F#3R?x1x/^hbS 2J_R DS\> i'44ß>,;%,/&sK'5|q5#:9%d!7.W.цuk)XpFdYE1NN'96 Z[d 85O8v1 .c2ġR6O#pDR啬A+~wV}^.s Ps/9/!zXߌ Pg ,,sa(PUUB1:Ӡeqܣ8{3 ̙C5e/5SPz"UmBy'|AeLdLTx030Rۖz[~Ro+cs1R %ېZknÜ% bF֜&0LSP$MyKDOk6&K S̏ih6~̰*DgBLDȈGzArl@t ) 8ؙǜ_ᙯ6T<̑;6X;ԓ|{kT>E/#%'jq@>x5kj˄EA*jdC0zAC$2  T.m318 y*ڑbUX991nX2^2܌oXZJlcCu@2JP}\:a'a#S:*>h>A#w@;Fی` ^hx߻DFCftp~K H,<1| 2T ;u44eb }[,!*wjXV09j9jCs+@3[*ix(3;*1l1;i@8 [ nUDуmmڸЪʦ6olRۑ[lsK.b3| VǾ MZbagD32ߌhgt舷s8kG#m:hpf L, upVsٝt5 @v?ghlkE5)ebÛ>`@Q1^r]U>/@,@_A$p fYϸ_?pb:91c>u]wK1L] [zN?GBs4Gc>fBNːaJ+L̹U@9ܪԡivZGT J)wt;(6;E/K:t5@˺6$->^P[.HmwzCN Ti;t0/- #Ȟ羸kd\'$ej{Zmi2.tpֻw| ͏KoO]?z]i[@ ?3Xg1dS*-??ݲdw"^K@%ݟdߺߨU-])=YDO #4Sr!U'V\˅,2ah)"ŦΔH\Ȅ_az">' :%TpZ"|ԁ:С*#wN܇ɵWKզ/;t'Mun@u˸9wG >}`a,QHc"зm+R#ZKwqk%%p|Sfog];j bǂӢ[P/!Fj61|WuK CdÓ@O*ICw4˫%U s]<Igu7Yx~E3);Q/2̃U?eY9m-qCQ d0K,s%eQF7h1(z2P^^F*(3ahDb-e3SGf#ųD GewXv}%RXk~k~Y'?_yZ`WU|υ|ŒB_11pJuh?luhuhuhuhuhuhuh?ۢ\[[[[[{ on= Q\&jٰLmx|Rn#Sʬ,:^3dVuhk}Z뵦RT J:_uYǥODOۤA׏'G7<|~-^)zH% ΅tähpxNڏZ]\Xb])S{6W^CTĹfr>yH1Y vt?,.C1*;dj7D$D[=k&x,:91T}UW;TQiń#a-z!+sHs0͏/^_jM~c,p2ĄN*ay㚗Ҟ8g4FBP&RKd- eO\{8@Nb0BPci{ޒTW&LS7TB4h0j@S^hWm8OЕ1JbGQwBŰk7d(,'ӪnOz“4shG9q,;+]hh VRk@hT eVIRE]`v}]&fj(=^4Xz:MF=taƽ0 Ძw4d\DR]jSca C Zᆁy>("8]bvgH)>U\q̺ޠ7u`u.-#tlr-;kv1h~'Dhˊ.%IrUrsӖ ڥ_ps S$uzYzϐH3 n.[Bmc9fpjXcb`*o48փ1<ƁRG8!rGoU=4*eE5rxXްs]:K3!7k> If}%XffH0^̇vVs7 "]y9 &)ˮt'D`4wwlz썣v 3 @>[rL+܍YbA}M-y sV5}HfnGuldgs;kw,Cmg'?k/gY0 pZ'u:0| #htN1Z`hm:CZ:C;oahAAR5aӃG.©siM|ecq5Y+nn."Xx({J38%yb!]tz|86Q,=P6-9Dw>nqQ#,/pHc4[ ӳ䆝VI!0Z$@X{hb 0! 30 a]OIΥ#K:2qb)Ro$9\5W/5Oi EGFرIEj0Bճa?uلEcK w: 3{ŋJ&%c'w,$?Q!xjک $.2=K˛[~2ncQdgto`П&P.` S=(_HE\40 v{}9 t`k//׽ÊDyy5t_{W54,F: @T> m}}>.QL)c? H%% Daفp]  -͕9!'>zWz%򤤜džQbAfu,#{UIPi:̜1c9ʬ?zw+!ƮOi96F@a"mNFq4_3+14'W: ѩ< @{yS4=! e3;hvަzu:S(m#c D <⩂%яp$ǼL*ig͗.zB 'pwtE ST3aj8f*UU_f^wqQIztM˛Aoh?? 囮cw!UKN`3AX:1兂ji>.{њ\7p3Q=^^I\aCatXcbld.!|±/E]TÙ WՆhRfK8 7ѕ< $X_"/9A+;/LO\Ph*r9>я$N"^%/hO)pѤ3AS5YY[D|1}yˇQ1|bAIjxxqx=(R=ccrV,T?9-XYҘ+)3`l S{L?$,z܁IP   CFeNXp{gZ$5Ƿpd5W(pGU?H^Y>^ ('M(c\ŀkJ ,1s.(PFswtBK(6:MxG\*嵮=3$EƱ/wa}I(@RI\czn\-VUQZ[W$]#y#\{ k\jʻfJ"qeOTr4.!>e3sP2)""IG?n1CG-xS@,]")fR5EMFq&Y'H"@q OQ3yQ >ڲ H0._F2M4ǽbo`ɳ Apq"JqlŞ;{yX܍{f;[pB6MІ=yxx5-ƨc1 6Su5&ERxX]9w Zhw!vܓx7ۓalײ É ?Q`9P;i [hz `8 bs.ٯ٫<"JuxDwNZ@{DwV5TRP+^{]{̋ʝFAx; i.p9zK9*1G937 (pj\ źnhPu2%pAhx湁= <(evH> hc)#@h V'{W8d]FEYC&!ԣVrlgѦxPjeECCg'+NNM7uݻ#l1λ++H/XWLi~t i<"Hv~jNrȃ4k/gK U ]G2{$WOڍV˽ojapPw4Ӈ MUNfWG#^9oH)gg8E*ނdl#pŢY~iVVҌ;z=!KX"xe+Aoj_`Y\ WKdl僳r+;NYY@ mخ=`f{糝" j pe[fx@+\k٧)ko`ս!CQp,z\&x.|3%nAW V@pncKr%5qjzy6gOG3h`Xy uXHI:sltOEZK=x"%n>]4UVcuNSRhb'2'$U# uTL$UMH u&Ir-P$m[X}VC$< "] p597Sבis/4DpL4/H'z:= rU r X5&'\cPVXUWۖ<X /'T99՝y:yH=՝TwSlZa_2\sa#$m8=Ucw'3/钗읞np -:D[@V& Wh]Ե:gmyދꅲ^UOB`z(Wej^\~8m:MJZ  7'|s@YZUށ5!K]UAڏ|ib*t L8)99<͘aBqZt/ձT,}Z;5u cөYDj\#k5F (4UzZ 4yѐkk;sbp:nuUK,+^X%I/uIT@ _sq`yX 5TXR=V$/YªU* 3~]/B4l% U-ji17{^(JQc  u^ЄÓP4-W솠0I ,:=5qrijpU[\YIPkp!7Lac ͪTRkrZX[R jKK60l2a(ZԫMnVncRv5ߨsGꍪ舿Ceّ62:YLi Ψx" *}0:h mT#VIJG"ʷKY:`+2> .(%&s'a\ WqE珉-i: yas!G峾"T`~b'U8Kݝɨ//=sʹ7PFJ8_P[􀈋mx19Kæe;۰L%f@QGnxi)#69ݱHY^.nהhS)DyD̥2f3[I'Cs~Jر ({y;;;Q>T'%հk*>.(?~LtE ʔ)ZJ$) ZÁ]# $̀*5)'˿qv1˧|Q HxSnCԈ8M6plT rŠ]+ _]苮 9F|M˨p-Z\]RcJ%}agK7IBbd P)$UB&x$Czq/#$1>'#g_uDfeKC?2^8 ɻKDoLU,g;,vyf9ɡY8fYN!ne(ۧcJs?ZYe7KO8 |oZQIOobF< dQ䄇ՅqQ[7A a|i0`t8eǰ}]c} Gf$cH(ȥiM􎗽MS,e}6N%Hw_sKr.QӾCVLH}r`}drdߓdR9 Ŀ[ۧ91~{J'S&Nd8/}~I\ljZ^uvuvfXfJTWyJ|tDwciO2l1l\q2c)BA3ccGzY26(儱{ʎ_:a#p>5VSzQ, W'E+w2W9-y5Ofts\KXm陟ޙMꄶ%hRxDQi*_AjR' 50K(3&})'RBHQR,.BD8raKIw3*f7n6c֏F(._=`p#j/? !+iE ĸnB!?p'JZ)ؐpW7 NKg!-nW* wuPh,E3$d/ يzRǧ+AhyɁE2$2DV(2Sp!aSο\r.0|\<Ͽ" jőǝb IO3+&JfG-)HArnѝp+3/ȗK&U1 990IO.BCܚ)N xkjbk`i\d,HђOFrztbm,U֙X$,K4*|EVM W_*IT8g(l2SFTF9LR78(\=O(̧ ͑OhLXr܊U~wV6]{Osg`OвPY8S3ϸ:{wv ;5Umydcy'.Iuo|#P}x99rPJ27өrfK*qN&y m8rl5sфԌ?$f*r* +Ndd#7f2mB'@Ll3S7oX-58~,!o8Z3}Es6HRg}aGbi>>!Sjʆg}:s 7Q/w=J\Tk2JD@[)PLMh)P(JR+36,4B(ReMy6,YUtPuT?~ދOX)\PGx8x6[ufDg7mO1**<M JOY+6#^P@|Tm2”= }+BKfVXӶ֏{/t2!_jiD`8Dی\T<6|{Fo7w/5EeNr@|&8!>=w arf()S/Kԇ&z D7J d[9`Yu9>a9Xpg_%<(zoPdnqk,d%)g b eCʥD8Vh)R:3C*K0ʛE=<urJW Sfmulr$^S,d&҄fd9" W<îQ]ޠCs$R: = g\ ']"UC TW h] :iyQq3ƒ~p+gr?[*Sǭt65יy:\g?"GʒX%b"Y.uodI|{ i(ވNw 4l2:c,LphfO}'NlgnV vuM/,1[i>phWё:{SXۻf>;008y^⊪jZä5ryB9" ީ'oDG3#K"o7OXőE>ra#SZ'M$qdɤ48KSMI Hh0yqmIO?SXy d4/Nj.hBg4$@*2'_2=<`Q[]>TJ}6q04Q2D&aIdoYȜnG)w"?Xd tF.c1!9 L9_|>(2A@ IUe;v0]Lb ԪKon7ܖ9J)z y%X3K'7$gH'\rT`7x],R??c8ˆ00S%.ޫk^t0Nd564C;!dq|?/Lvv L r co_!Le,Iqz#dTxJ>+[a)zт؍J_9hWaR&אt>?%v0o`RH~8N7(7FXVpI~OJi Qi?Ki>OT~h{O8s(߰D%)K\ޏL0`+O32~ 78yxF§)d.7;+@p40܌Q \OB? }K{ 3 { i\]7\?F>ygҭ'&'G 8%M_og: SvdK88?FPx  HB5C)ⅧPI9{9`7PWuzl{2#k]DtZ~Ʒ8^6.IE9Gg-@<h 0$ ^Mݜ,ZGWvI53[Q$'"YB&RPFUZ3UTOK]4`edHRi?lgoVlŤml+!vZ$9OKPxq/JqLBŞNB*F9O2s:k;{L:ǘyz}:YLQ4`—޽L"|8F^iqJ2Χ]ibz&ɨm[D`h]W/oM)ZOON͊sHT3C"I82X8B*V9̫fUC7"=*3k{rz_Sv B,d8΢AJSkE۫;"jإPk iL:b,ZV%2G7eo0p4ӱ@۟t/EP'[i4ap,5e=%p@40!;zxTƛF}z"A]Yܡ=ɥ_JŻ%/|K+x_yC*$\φԪ@"!^E|Q#Ut Jؕ}-n'a~\[nztlIp%V&l(R ޱH W…Z˶y0ܮ>C{ h ]t<.w!@k(Uj:a&9|< V`$\L s"80~EiaP}{U\Z>߈xVw(n<&fJ"˦J(" hܠ`jOwVHy-ry8qvb,7(7ra.8_^aFC+hZdksnB4ME1;&8#tGN{7Y%hnjbV((H,ՂM?-w.51*"]jiOS(VfA3dYۓ2dඏ1[LpLsɶZxkK韶?lvitrmƦWyޅct@%:R*3 g0ž RFpS#wFIl/_мpZ6KlcRc>~M!c}I6٤yk3U"Jzm"Bkd7Ayjf_O~c)̽C%;JRCQ›y.̱*?2qURj3l#^ٳ\{Y5|DDk;wb-5+Jd0Ɵ̸d q_OEk͠ahf_hj 9Ƒ"̆1X,FŠ˕m[ :X*S="l0Hڤxͷ~yYR+kˍZPAއjԁV F[r[@;&7=? ec>vcLCwQRA* k? }Un^h:[Y9FTĪFR+R9\}36~C5(2;SNE jǾʨFJn?GVhNwQ"Z_Sx#Q+&C@I /|*>V GkpI;B'{ DB;8` =~b[:hwHhwp d؏N2$59,J&bY bi/FХ<2:q;,u2K‹ p + SN|9/>1G{ctao*i5 xnX!h fL713^ꔊ&hMJ!1t$?VaPQR-=L~׽_:g0 %ht,ie^PY|tIW<^l]Pl|яJx>ڝJA c5v{e|'O6g'F 8gh@cv¬=ixGM;:w4-m WYr8@A@J `|EJ:>f1)LJ5>}7R8ih}h '#*3,~ *C1Nos'&) XݭYfIVt',gd>CA'D)U>=O!Gn O𗗻k|Q_EI@\ u.:AD.-K.u%5 2 0ړ.G==w'Acs3WcHbb @[$ѻ9nQ92g3*~E4q1Xʶ N0/<>6N iˌU'8o㈘3 /:5~†-5#ߣsZa4l\'LrD=k}$\qߘ˳IXgRE^!j)LvJ^2ivŁ8Ђ䥱<ԵGʽVL:9.<,h CĊ1sg_Í*lyU m%y8H!pFtDu8[̼Q (T.+^M`Rwՙ8l3OPr{Xܐ"wLIk(M[@SVܓS(w/8Lw2] a~]E2Hp8UAL1C!;-".JT#WއxFvAHqxϯRF! DȔ >(o7(9vBcjxaWqsiF7(Fĕ4#lv]#dv_uL ]{Ǟ\ni1OK4 ;+lѐK>e)p=hz0l6yp%\<,N]ݱp$W;# /b^C_$8T]DŽJ0􁁉]'#sꏪI)hMpHwAۀ9Eoc'"&̠&$ҋ \K͐b75Td]`ŸKo|y3F̊Zc>|ƽ~I탷3 ݇"hnp`)Fu|魨/\. pvdbzJ1 zw!{{L^ G^b!מ2O 1+9g&Եڜ|H teh?.ϓ ]۹(u'`=}yzP SG6߹?'IU$V}\ݢkDJ+ 9k$ sI#IYeOH|[-،0V:hZwUo!F`qǢݱh7u|au/cp2x\Bv:U\F(Zmhh3ڂ6,[pe7-uS32_^3ˎ ƒ ZflY*NfV<46l6a;պM]  ^ -sMH/im\ԂrH ^r̙=kopE.מَ=:zYd9,7-@x\|U4Ԭ6 A6Dz^ί? [F47LUOSV@L*4VH_h _P;YoLgn~w/\MsXpe97Z [LpU I@YfZB;F9d.H`"4l hh[՚xMZ>Y?j-eV߫8?.RYl D9 ȥ= a.g6&/&#kZ6r-΋l?vE ,mOqL&qaLS8IJqa}!Bw~!>f L *aICVOeD6X[-`l(C*g=&p'm g^w"&:οWo4*uqˏ3`0<2/n93[ER{Lx罫l4S8rjBqK\!qv rfz:-F{7g1Z#Ccw\;~;CqAj,$Vh-.އhNh3$Ig$Ij\QH ds3C; S{0%z\ZD8OȌ$y0syCYԶu@a=]_'^PdSWa}_{w`eO &ӆd'U: @6X$DqZ}OHFv}$w`.G ם!OOr{GULkƑqNSw^"('4Ğ$ $M> ;])ǪqzRRB=\ 1VO6?XIJO{ueڨӗVkxiֶA@)*jʀ_j .]Ar}+uVkKW*=ku4ƭYr_aՠ՚Ͱ&,YaU Y2x/|9 z6KC> {;(ַ䗦(MQ_z Jך|-#=7D( *(eBjH|QYot]xOH)xXenǻ?I,Cڢ,kS *iYl6; u5*$1>E0L=*ꗤ >iBam{W85K_;3XV{w*u:݇[do֋#hMrF>Vy6Oc+#Y[D[`+Z0.;R<3!U148O^NxUM5~eBU>Rj01\vt/^ 9soO*`S/bn=8؏0z}H "R >I24-/"Yl շ*a fKΓxjϝ_jRٟG7ަS0PXܐD+h h V3?LugpݾdxuGtu&nQ61 ¤mFd"VZt1J =P$GydcrxSp; nmN€}cu~G{{9y D$_pH 6\znQ#NGb~,bJ+q$=,6bJ'y`[ bsջ$6p!`9c1!mD m]:3wOO@B ̶=BmDR)aE֘zaB9T=tކg3c@^1#YyOVvA66`O\M'-+B._h .,ܡmyNf@r4ƋP= \ZƐD &\̶%K1^ w֦2+4yΙr׏mb20d.6ZBNaXPjyIR-Ro*)z NdXbXc Wy$,I;wU6 Г8gz3a\KEh,["v4泣ٓ'mig2 * p 5ûk&Pp@L 6%k:9h*d!i*(6" ֬sTdhCWfBac#, ʵ-4\ҀrӯLP-W+h4 4rTQGl;fhBro4EmApLą inmٲ,퓶YuJQS?g%3g2,!K=rXB#"hIA#(9)Ic]|GIi;L†ԡF5jN޼ۦp:µnqV6%2/ j ?&I]e䧛PB;1Wp5N:̘ᬟp: jY{!]'9r.=i/ -><,0VNmzXXXfhE=Pd>qE_hӱZ+co_̱:]Icψ .omɹ7M,2b d .E&.L~ۘd헩=RYGikIC/`&&oMհ)ET*Fc6˱tɦp}Sa"Bwx ܊w26mi_j5yod?g[ubF [eop9898? Hk}Dh;9I.h-*XP&4D;&H #2@CíK!U$x uDZ*^ƬΦ8ٟ}j2z\vDC\"ٟ?߇Oy(aw O?T?3*P-`CgMq#,ɣs*BVFT!X6nB>. ';ڻeAwj-x h&bax6@|Z0RVuv+7"Dwl;nXRfl5rL; 1Ӷ.F~&F؆&& ߝaG)+0: إ1 @j.2X!&fk&CQZbhP%'ǁ{eNj^CU;O * Ƕ"~`2N_nI G(Y/%_[}~ Tx EvHl1l;Os |h[x{ØqYoh1'97:ÍP g//yew3Mr6D=>C[7沴q :i{BPʽ+ްF~<*0/T뗦R؊ʽ6Mg/{suj=);^NSIkHkhd};t)EۭC!fa1 bд<&^kQ,G!vIJrI5Mx$BxO *I0(s0O@tԭ 1W xD^d udb[g6V{kB㴷ᑳ'Q)a]f̦Y$bh5aiVmO!VXd^.Jg:fnx4aȻ!78P2%!!ӓC䀰Tn;vpAGq߅w< LDw yX,Ue6(Q4q㋃Q"ے0ɯqzL{Un=uO@8 eFw#8%WeWzmjQxJ2JdF_oJ~^9aߞ~ 2}KSzJX^^ {z%GJue _FoËy_?2MZyp&/ܢO?NnlptcA&Jb 'C!0(L{c#/%i/0(s >&2B evNK[~ao*0. /pq ssOOi<ؘ*TC?I7j-_$G+Wu@.zkkZ嗳HQ@'e pj pl ?Q׷lxK"ÌИ F Q̱CMk̦GkSŵ)`:?J j@X&a-I@ڢISK{B.J+:}dvl0(@o5faP9{wn^ vf 0M8mڤ>k〵qq@KlV3@O5)`8 XĤ`?ȴ@eֆ^;m`p8JPTh<0-ݴ@/c[p8mڶ`mSe1,HɭbX',`W{3(^ӌ 05ej' ;f#n{3 Jr`CaxSZ&ӒlDl;,RAkC!am!ߩ重Fc,WO GNukE]%7k)qEe>ݎ߭R\/pn(-/J] y;NUug}ʨ> o%PAuMQ5FIitݟ_#(q\c4r:;%\pu|-EU`V/Wo2ӉL8m"%<1ic,>,_B_TP`6ɦpNy;} R!eܚo3o$Z戟i"^absFײ]<$lu{Pl}}E+)r2w낷bR%~ԑN<e0G$`~N(Vꋭ+> ]SAmc+g'w&i 6~czJ1c1L!XoV_@bꆐL$AvYDfU2c+P$&Ms(?tTq@ D`gN!>??9yik0ay* rZ:%}S5NQ8Jh~.{V3))K믝n(3+iL㼳"MW9ЎrFcxr3q/~]Cf|Nl^yVgMmV#rfmvWp IBTJwU!fIZƫ X= T>a`r4\I,m$` ƕ/y?`SH fKIPל5z6Tbڇ~ß[%=JĥxZ!ij*i?jOdZT9{V¹IH5'j01qV*t$YDy֯%"^m+Q*"TO@jR{H[jrSpYǥi/_vRӑnJН(~V,W3%,ytlxx`V9&mqtrt&N6m~8YXsә|81Zt& $]so }ƦrT0E"Yj.O/Zd5ZsiFyCJO hHUU c`%F Ii*>L /#kv0:@u@䟒 bIdO"eŲ ʪl5NCsZm,jH ZzkQo1"qqd>J۞E+d??w8囷/^&ܝ~LUz}ƴ؞ ϧ p,, )urЮqS d-C(,,-*Y,[H"78؆\` Q䕪e? P6dl>Rp\?KV/W}\w˗wINBvDRO4''X` T8MJ{y UH3{W,"ah؈/(~"yi~n7H|u" p^p!ޚ`> w}GF}p == >Ix/"|.8s=IO5)3DBSDD~cA s#M8a@zVFo,f%w9ZD92Fxd'# E#:=rcOςDLRp%t Zn >Rȍ0 Ʉu8Yr_?2um>ۋX] BŠhһ\'}ifi߲֟EJ{[>gBl o.0;"UőD~mQa|pV-o+f 싉Ÿo]ֽN8WUJ;'*yXou6Q/Z8"wnA3 &)\:ēWPg@?x_);܀pl[t㾵 .,22V$WVrAϚJk#Kݓak7{P馸AQݒA?TV9n/7j[^V(["Tʕ@M%if^T_Q4/W+q\-tkFJ\̫,JZؽOJ{~k*>.GB{4]0Z jC%G%eQZл$Յѷ~¾*-pg4}dŰxݎc`(vQbܴwDY`kQiI\Z NHmJ{K>Ͽy:yre 3ZD|JrfL%oeO B !B叒!E4PQ 1(vEȖ ظdn7UM1aF:FPc8Z z~\Rkje-])|G!87\Eoe(kO,Notg3Ng:ůPq-a^KN yx-ĉdE1J EL `(## |+% L[tO9B̂t2["aK>Kiw[<[k.a&I$N\|-u5ÅG6GrCPor;~ģDS.k\M6N9")IQ0wLEÀ.F.ڨAeew xcL驩(!Iw=>^`\5.t5%Ȫ5WRVʺ W ^NL'z7 +k˘!YE\i _{LS}N ӄejN2GVIZ%^s  OeM0 8U2;L Ws;PQtp GXnBzX̕JŌ/41Xh#V’ M_W|j-Dt',-]OBƈce )ݖqrnFcvE3Tf,7tlB쒢!>Vʇ$[i]zb86ohJǶ\oߴ oc󡲻-30#FbDbڇet*I^]X͊IR% B _Ĵp2It?M\+rݼҌ#X'?/NԺȓs7?%YuBv$y<-qq^*b^"Qz+bL,xȚ_Wv?xpoh'fg#OE/ˈiQn.ՙuuR|0aw<^L`ܽJo5m,p-Ͱ=miw[Hy[ҨV]VwpX^BC'@OmKN32=V/et{kʣۢۢy,o}l-=hoN#smɶ~xzmIFg*R.m]6{%)KRƲѬ$E6V0N7'EmPT+FV3-ac^שlI2̎%{L 8b80O= R>,zUZ)-ڻe=PE|En?ۗrwο"M&-5PP] ap:qCc[X-Y~Q|4Nߴ-HHWR jD lm.#f8ڇYO' ݲ-, 20Fx#xKvv^اB*$9-!t<?~n536J2K d(Yqx*,ɷx[@?jkU|\'˷8'IxU鍤ݑu7](Dڵӛi3SHMgGrEQ yad S*1&I C7є0 ܮΞJ-B'3|l}$>{!'цG|X4g/V Qp 7H 5  Pk#SRw}9'K>^;v9#޸2?(. ٻfu7}}iɅV5OQZIo|ݾ$aUBzZ.Ϋ?`y<<3Cy曇`y4>簽qB[r@op={skg%SdtҘF#4lj Knc쬽ia&BfbAI,b(%ɸVļ+} Tc\@D/bKiuNR ^.JVY[l q@V[1W '-=z[N|M~Y|so_I O+A VzzZ{>͉(-$oaE8۾zxDS>Ͱ/dQؘb䗷8d()}x*fh`} v1tstۺ{kI}{F9@=R }}ɉfdy ӻ^> .9 Nd'Uh@k׳O9,Zd IyylT3KFji&3 ."LF?0%LB2YG`#+QJ&4{roBGo2:Xڰ nnY,@찘rYq#e3Gd$(B>u4 H #0/VJK+8q[{)fnr)msKCSHGԲLftߕ<7BVV.laciA{ ) aQA_<_p)(sI .Ӊ:*H9߭i{(q5k0RNR+A5mt4i_&Ӄ  G_!6YA*tG~kG嫷aw=10d(7!/`JͫpW.dBfCtE6a`a"EHV$4|0DsVwL[yc 3+Er:ֱ#?qr[Dus~r;_w/Ѡ~ӽBTl)u(O^Γn+ e^A먵6w^ 715gKhW;n̐'P#]3Koʉ;-J龈R:m ~1pG3|Hsl~t&@p]m֡\20E}+F+UѨ>MiOƃ7컺7(p]<C\+*. o//Fr}iTR Bδ1g|pG+cKyB_xdcb{labF @S 3N-jxO+UC1Ř"ˏJRA4o )гyDTrqjNð0#oLSj[Y%`K svwmΘDiU:&ԅ>OT["Sݡ>>r)d}Ăg8I r8*wشz_l5PP~ͼ:SHR{/S[XtsrjzGA.V^ͮgwSPgRLblRX3BddQ痃]yo굺EyuuibgسW\vLNuHZX?)٪Afk*>.gBDh{&Ya V/Iͯ(%ApDrJ~|؂1.֊^#HJ1:y>K] \Ɨ#h5 wDZA] P6H<^kTRK.SPQ*QSP]0ǽ+J= |]m΅Ogp0XEu;k}?*MuѤԄxyveD33Dڟ lN1N10gNh0zX?B(X3k0vEfƉ,^3 ͎p{Pml1pXn7Dq&Kf0a (GPE6ʀb^gXD1R7pSyxHwÑ`/>Ep9̻8Ȩo_yv|LY̵? XL3h㰍Il,4w}c5#38?TW)B,Rvf{ D]Dn<y]ޠ\x_J)ݦx5 {aK`sw'r#d9jbr'A $Gȃx\`urE$ Gͱ F;+M>@b[q1Ild(h;g7E.t7u3[۹z?=؍b+\GPn245b>+hѨ,*8|U#;8NFhE G!}>¹Nj[4=HYoau^G]z0"hG'SY.Е}Eop[ j:ְvbX;" 7Z|lq?ѰUX$%]|7b"6{L"_9xxu8B&UXUC {B{)ʒ{6cKo˾Ap:o"i~"(7) 5pͯlmlN,)!G hL5a Ђ'0,k0PRݜiĶ<iw RRM!DhIDS~P%FL2v vOm̜͗d%fȤlfM,\. ꔴiAe1+ə DV7YKfIJPCv+e0 qSʚHQd^8m=lm~R?guqto?p(~н0$$evbHf@Oe4DlZt^>w'd?NLmqϘCIJ(W p{-Yt,!gpWp*8%q̡4nEs4mp éŭHLSQ U2\HƆ+-:cuEm_"AHvo53oo$;Ik4 ;J1+:FW fiLZŭ!=*C<)Pmg~qT $7P@1_; ~Jc 'x.k\L^SrS$(Pʾ+ؠCN4fΘcQ 3I_.0=NFl2 Հ^<`h=᝻Rm{!HB@_2%xWmPNOrXW/¹4z\Dfx'F:f3>ӈ:1]2FJ&ʆY%Eq v {W^<7W2?*ҥv:m,`y؁`S'V0,.M>nuj `m P^ʚy.ErThfTИ Bhnjf}EtL-;-Qǿԗr|(_Ӣ@Bh S[FIX%/]"k!ne(vZ/7/zSRo'e"}roX)oK~B>)=~NHtEJL^J^Efo bܭ"'6sZm |_Lq2@œ4póοwb}O؋osRcB~"g}z)( S ?▉)O9Jl7[$FtPȅysx9A2qng X.īH4+ Ɵo ѐy5ZLr/WxJ=怕2bfبǼ19@I,'οϸ 𣦀}H3O>Or0JN [`P H5Duy|6y+,7YI0#h&YFiAִfYbMt,:<>wf'<\'ZJS?8?@  ʼnǿG.f<_}`gϔE1 xMǮoQDlR#M亗7IjZb#Iy'GpA<} ^u g:su 5'> k8Fޏ!9A d`%0`N% cC9Fq,00FQIb_|'u~N"ou*27 *#ZH=Aw];'$!H L޸-fٲttTu%HiӉ)u'N\1Ԋa0P<gڡ7E-+-G J0bl`*F2+&G-TIh /gp1"X,V۬Ʊ5n@1`0`v`v0o@x8f=Ҳ bli[qI)w^⽥#yQ&oQ꽳c9\7ŷfgV3mj]h1 1 x = [n6m0X]ϔ! C#nX t,c& yxCfpޒ#: h:ZLlgs$W*I{6fjwBK"Ҭ_a f0fb,V>353 Rq#AWDImCD 7SfXo𫩅krK>YLw]p@0Yne` { NH@\(Y *MK`$)c1̢:ŗrxW">pB8!ڰ㪵Ws&?uh7k9MU1kZN6N,tcQgbIq/,G@=(SyUwKAeWUǏ:=z7E{M/+2 y_XJ~ݙQ2r:cz!-Lp5Zj!S B#_/lzL.%F@k\*j!jz[FSQmjp6-. %U+ D)_"jj آt#PiQPz]Z֟R?+j::J>.9ug/DZf'U/gH+^@Ou|vߊ oscT~o9Xj~}KOH&||x F`b- 1GQ# 0Os왜kR(` 8|^ed^۵ՀZ`ɑ+PVlЋ3O<-۷S,ae4l6S{wIYim~R6O >Mg=NDʪpxg XVOCUg~4Ҽӽc O\HD]"@teD>$=`fƚe74@/!;NJj!\x䦫 SO"݃AKWG<.Lm K|oVR:-gzRKW(v&@ًy @޽'= 84g wȧ5I9>KnWmg نɼX7eh-f3hR6d@ |= žWYxx|^q7M1f!% d]u__EUzWE L[6_9V>7K :;z<}XD UmC{-,ŋp 9%eb|{~/O- D2d+Zp?D Hb(O[c%2{V6Ž<=#{`s&r~4MQu'~hDƧhu238&7< MĬu~OmQB1d! 5ДdŒ\ q N Qi;t^9^H0ĐbaEבe {C))2s#.No%I7Y%",m Ui%jZ W,#Ō1RC|5s!Ma$|$6=@ RVu">Hi]O7[PG*#Lrڿz,˃DM .2SMTȯj5;@Q>I#)x;K["m@_]*NLv#jnI rQJϦq X8.-g^UPhdv}؞aB$ABDV@5G-FFqo0.Jfvjg0T0G>J <DžShkx W%l҃K>d}j+~kFbH5B#-!e);+KYqW:6miVxVU- 6'%Md$e|>J8H8PO 3[(BaqDœOt/Ƕx9Ne' spFw b<:S8ݷ< ꡯDFESTOk*)Ί’L\Xo.e>0ߦE'fx Bٔe'x{c]hD}H!d[ދwG fJ0$Rڽ>oyTW|[~ӥe!w×~* $LZo;:im4)=ktEPO Gt$/@7 c^1m$F^TßbfGy7myRIwJRs_ zjjì@mfn@w(Kp}2]ݥt}*W),tw|W Vstoן_bJQ SU? QZW yI\9|wG/)WklsuoZRWbQӶ>->h*z$v7ֽSL{?J?qY {ef]o.k- l&Bl$eB݄E {ީS?(4l<?tG@"-۹EŪп>cV$XjW|(k(,): )2zaÝ6c/](A'w @L4xM?=cLMZx?HHWC~]EbRt e˘`7IT D8TlIb'>@+ͮI@-y &J3U P+.O.:6ډBSx,1_ =ʋ<9ʸ39.<"!~o#0C4/it; d(^|{&w(Oxx&2ΤPD0 5c6|ۇʆ>98\_j]K/ HDCXʮ[&?$&{/up8{[`#h쀾>ȵ/lc<f!1]pAەr=ݞTQx?tx/$)LIL(z7(d;1Z_q,2:ݢ^I D&Oy<3rk',;ZǞȕg&:$bVpTOWʉ*&Ͷ̪m^:L[zXs,5ם-ྈ[HqKE(ʥ` =x+פmIJ*-K\;C_Vp;xx:ˊ-B(=vBе< MӖQP]0Q'y ȧL):PyQw LQ*gќ!=dt_,bf4u{$dÅ6UE|:6&`Ƹ^ΉUbi\$8mNI.k S> gsnx]S5ttZ|&y޷ywǖ <]?\ey!q/P\IQ7N&A!uQP}PZo:@YR)Qf}+try[yY2̤+ \yVSݼkf}L:[l=A)-6G2rTg/3 Re؉[BN:<'eB%2i:+]*:3aw*wN콣7C#b%l7(]ckcv+UwH^v- Uyت;j]J^}[۾*Hֵę"k}ZɮZKLuppfZ<  B?nJ2Ο}VrG0N활wA}H tfII@rLjg.6N&1Q4Y?]De(+:eghImj276=06g=VR66>nԔScf.3V%eYhL78rTi{$sX8;0p'*QL)6|^7%TyS<'I#r:)h<}Č #\}2V!+ɵusMu"|uTuաYIULX烐\'[|*9"];7BPw7~tt?qQUS,ִݴ{"LnLO.~,ս9/z_mځ -&MZFb+ƚғ6:?ǃTcK(R6'p0 \xG(0(H?es1"F308$$Df7<1S1Y{Nvy6wX!{3pf|0|,͸sۑ3( LvtF69nOڨ^VrX,Ghǁqnҡk IT #dG y($DuX{Abl6i |UZ:Nn+7R~.6c%A8W9AayQ՟GcxrrT]VW(t)}~4%.G] {O{{k\Ml Idn$\Mo-r<@ȵ.EtK ![_QonT_#a3d,-"FP^> z"ō(թm}z*_Ljq\g2IP&vڭ\+jocէ n![għ%y<㨇 ͔&EYΝdJkW/lME!Yck7fJlr*Ytd*CtC0ݔX['bfEO=3?6ZWm0*.ە t'SsoǛq?d`~_␰@x#]:8+bE;wi`!xԲn$Kr<@Vpt(v՚?ʳGb5dbڽ%!z;R488h}lPI~s1#xi~(b:HHloQ5xNڪ^2/+!c`jx@1jpy(kj?!VeNDŹ$dĠؓ}kZI˨d:w-÷< ܳƺeM5:ҥAZ\&Zԇ2 kBKq^RJ /[2;2q ;1 M4k^Qnո&Lj 3@]8#-nmqc4 <{+]p"\F%$gYB0QX^L, y8S D`N&ۇ"o'N@S5U&%n>rIX@;ΜgfTyć3qbO{a~js9w>>%?UL1Dd΁ɔ[ q48hV5 Ri x'8:3#T(t՚< e8PM2Yx3h~hwO\3\QZfxRo5>0 C2t;Go!PBv_ָ2j1 ysn$^Qr.UH! qxb}/-}uQVZS9xN\y>*u{'о7\.aګg fW䒋MRMUu7NV$e:cHbGvQH]pv@$dx&FSbtSJJTjaA6PyW@H .VI LT%%3ZVK(dɎ*˳=icťU]H|H%jF' :q] '"LڇbKq+_}I~Nˏ`GI63k/1kFt8[@,P8$圾|6;[P:[ Ը-IT]_p/-V%H-%\6ڬ/|r20 Vp@./E: 5V66V hEͬn# jǚ\FM^dWU?DW(1ط6eⶺ¿ %1)2=J%@<:4=wBSᎼ.4U!h,`i;pQ(P8@:<O@w aVXH*aPP+ F.½{ݻC7 ui:NR,DG3SDL\ّɑ`Lp,l¸k> H՚0NÎ:ס/'~.۷oiw0/V*aQqx{ 5mc-vD?Y;Eqػhua zzb85-JieF[Sâ%(\WN~W|f/V"Ɖ1`tm(`KoGfn<#j=)͵hh+`o)`e܉O ,K+&7O`iX f]C.֬.]4SV' <'DF\$4+#Zsq.=a?t)Aє22L|(U(]>^t1ȞX^ jڤWB$U nDoKbEf̌#"TO%_V%䏁}΄@FÐ'@ȵUBQ!'U8{Ax`zdqQbCCF_*o.==@g--WanaqsOG~uM˲.R ث!onl~ o_KWceN~[:"gU/ Kv^ck&yLQ0B$N= fţbIEZ]C5+k?GM uױWaIj:q jFpO-9 SK̯&Sdu ~tiYѼx;"y^jBz39 G`'bd5VΊT߁Ih@{e7pwj%F4҃v5PIl"3=iu1q)!pm[oFz*KYy $HΑ>'dQN}gJXeaTr\.Ц2`:DșW@nPY0Hc `H Vx7Jk-3di_ o+UANlQmg藮*%4IK6֌,qYHIa;-|m j4K;%zUᏇ>: Y<8IVdPY^n3KI+FAߌXOLpebG5p:wVPeS|CV-;\%d5.75.ѓo/kx~+2#֋ko+S2ֻ]@*uYP,+V(4md DWOk/%ϕ7,v::a%$զXI½CMˍbcYZ(cW£Q)EWJaz >5%/q֎%f2fc}{v^"yG3'ryn0`%_*,մJ3̚̚~f-Vu0ɯY@M˜` D8bs.)$+=Neb$ gzf[slf0JYq\-v"XЊ<3";#mAiXȩz;*yChKcLCv-uS䘨k05 =v¦KK IR%Gl"7 K6^m>aO6֊5xP#Լu\)ducvip |_);ogD@%}\.7VBߖ66m[*C%szn4KQ7ujyQ׉;a} gYoVk7~/4Q"_uf_mA`vR`؅ko fNŕžGzx7{R!gqc,wIcn4o#d0F˂wxHAq3$RPȺtMal2۟JcS5*?t. U 5 K9ci4 .9G^rp s>R[ ˪j[Ræ΅}$τ嘇$m~ݻc| ϷBqYަ(a^A(?;ीTz!eodT UE?^ uF! U6*a[EڅD{v#a_@V#BLnz]UKeR"r V/G?h(tfcGlU&z2)+!C N[^L vP=jлƠ%^!ft8v.^Ը߿$Nʹ{ _*3i!{'%DOH>/iY"c}k=n:3c;[3 /2 [ !CҫEEEuל/2|Qwy&}y}y=Zd^"""z5el1^H$a_@7H.Hc)%.:v8 D ^KAAf9i?8zMkz2'|~j8J`] ^x\SKVشf:e r2؋L֣3Y2cF[VX7 xiv ^Wh4N:K^05t2z*0Y V%;78 ǜؘKTF̸F2l k@ld'YwKB:kjU郵s3DX6qFDVUO,9< w G'iQpW mYkX$5|čr-> y:oI zT!6|ma@.*F05vcY}5-@c f^]뷃o՘5<}i|*Qيc׼mm#DH25;LfQ{4@IH"{<Ӻ:Zׂ$O T~G?Tr->5 a[{}>v5B6O.JfzB5 avQh2%^+#'vh#m 2*pD?&20odpU@df̥F~ .dz }_YD;XHJz?eG>#ڙGndx%RV[E9.0*HpM*⥇t&.v˫Wd ,)/ʼnt/VkI^Wl]6_3FJ䱌թPgR}bnZeG+yd`J \GҜL,S]|pA5QHb)Ņvƿꆃa54EӘoPQb 5Vt8[}ӛdi$Si.-7!;;7j@O^F%i!zx&tC ZgcjpBgC&u!qHɃIkGy2bMFN`2Y{4Q%@2wĐCAGOd6 Qm##wISA)z XŰ ÜjڧҊ|ZY9Yhc<RU]DoŨKD2Ԁ$I0jE+WBj.|4 ʚ^NT3!m6Xt.>B7cDrT\%I.L2+.(I]`ysS#u.^p$G !/&1b*ZU!^7[rR:bd:YKٓ4B=7aΛmOWK{2zb(^po̗Z?}@RN$BlVq(L4yq6܉fV2r*ikg VG /_4Dv[ugbXhCc49S@)cdAv'?qK2Zi,m_W:79 =7)ı{i-a?!VHh)%( k>9y A. cpz?LIA޻wȺiYw*G2^yUv#gҾtY-fMR.ey)vB;%ǶvK1C'<ÞoM)׭knq \`2+]Lh‘oZi;#zjX?ju`x p솅 V16מ2>y,kNbckQFӸf0;ɕ2vDQCdLͷ&<7*4N"D8o-5h s^ҳEND<(DA$Vh0Pt40Z/rd]UpXe[j@Qϭ!JhCAd&:h kEdg8C|9CN1=s\ݮBUkB~%'h2&ƃ+1ܹahb]Tʬ0'T[J&.ڨY> }rI0̼3sSv(lJnh/i-am :_҆z V~Ofgf} 0XARCNּĻ` YQHl 3f<5ۘjy‚iEfbG)L0:QF xx%ƜY1sBT9εf~$\I2tؙ11y C0"ͳbǐ`,`#: `E&_ԄR+2)`T(/?'h,&@PCRG2k^Ql6n &EG2TCd: M-ͺ[jc4 ?729t NۨNc7rh sB>H$_;L-;l6 hA4-;1nBTȫ(-y-3viqrY{~ь/j{MOwCAJ]m. :$#aeb7߻ 09Nx6]<*-0*Hj<Ùb JkGB(NRjgX̎7 r(  $<ѕj JQEOF*"tO34Zڅ(ʄ;(2pH@aSJ[4V4?4N'BJ*+dR-֪7 ? XhnwZQ^G YHN؋Vb;Kv\29+r 0zɨ>ui5'C{U=ѡ\e_w0С,%u h5W@wU6g. Z/hG(sL6kqg_2^IdIdM㘶6\8,Oe$3Mb&w784wnQl ̨a e^`&/5e-&;y)B?*uHW}p,' cdʵ<+MMݭIͪ_%|ܡ#|9m}BtШ@㺰HO&@/:d-}&qXٞjx4쵑kbQU~&L3U,tLt?GNyBõST B*="ojәP\FSPݸu +%%7vYtKSF)ë ˽Nl;*N[![Z- nU}m79:Ŝyqi\H*0Xq9޺Bj ?D7Z yg. F56LbH[kuR]@RxM襺/ QUcV}({u]~g."s &RknNL(b_]S X{gurLt{]Hι1GIv6d\ECQub7zPJD˸ ꊔSz7Im^]ޡT2 ahsR ]c73WFT߲}N vJ`DJ;I,g^]x(ӵ& lm\̬ZKl9HneHӔ'h&,V<4qV%̑U9^yb4iS dn4! '"2F[On40W^ӌ UE({kt>Ҡ 6#洸y($hy-*0hW伡UcUܬ$̤'cvĊaMܔ6:?(*MwB+C0KM;Z6)f9{RPe64}HaF19 h ='I*@8{ ӭۿSztJ" E8Һ; gb wAўSL%lGpi3;ڞVyyҕu&=OC7ҹ'*l0g!zj[^1I&b6a7Wmxp`z mCWk'?oTktT>ݻWoDTTJ咨wOEP[f LjL~|a]37{A?ZQȬFy>B|E?IGJI{Xj<]=F?܏e+>D7m節IQ/&:+hɚ <2'<y Yu_ T˞:'qɳҩ9<Ó1NoG\%NF?jגlu{ o8| őޘF˟i9xW_:G&F&l\BKi/tqEVIUK0Ѱ̓Z8FP9KQ!MEe]$@'`kH,KonkMp5f2_5v;LTK’&韗@TؼNnw=G]j 62;uGVUP+1HyiƤ]ܑ5k8B%q n]Ǻ뮺GT_'o,5%8y妪S뢐ـ8OԾlDS)^Jm KL6R5{#y:k=hڐ&]vvwGwF#] #p`Gԡxye(:n`ǎٛ(PY|DJ!2VMڃP@3LZfQ'-.&n`#uDw`Rr?'fL/eis[-k XZ}*\.$Ѡba+W7Y*O yTBߍur@ֽ뮔soMq?;TxWsE1E>feKTuwUlN]@a(ߢD"|50j{l(JGvvqˏ~RdLd.Ly`8dw~QR7)צEGTRIiX=&i|F{>%C0HG(ɴae-@-k ?!%.Z)K-!::٭I+Fq;6HZ%S_U?H`٩VUV>zg>h |_uzߠMzMoFԧ[z\2W[z\U8;+<R7oӚ,&Kq 55uq|[ܔ}Y[)aeG^5 Uػ)}jNkXVQiq_ɊM /%Ŵ7, 7<}%ӛb% w e7l5(Ugm$#_a0{"hEFXtׯ}^Sb] lٮPb+c:gw.9x4s"+R)fUgg3k*8 Xf(I.AGa>Q\|,".q"{b^낒 +i0!%ڀzkR5ח2Ж?mȟ'<8a5DOES3^6F4_QCca.S6&0$RwdgcVQ #}0:! fJ% Dwň % ُ vBO8MO~ HWVȹ(čxq 7nu9xЮy ;n$l4h&g \ 9>YGuݧK-RBFYrGTi*k$Tkkc0 ;a} g[*yU܁/^EZNDvA"f_mA 04eܦ rj6 =P{yy ϑ _Vo@f[zp7({ |֎~c[`os2lץ[~N{zemRZQe'^Ϫʈ,ҳD+TSPgv+h4'taQ˙ԞV+{JLɘHn,'}|%%4~>\ eOIT%՞X4̦Jҿޟ8+@wASљPtFIw&ZK11:ŵS]T-Zcʔvd)V?FI(9(L̘sees]fL$>sʘ;_Z(ehGa[(qt0Np4BmNP}x[M@ypv'&!t]bbDgj2b3z3d W6LJZکI{1lU|kAJ>"XV1kp0y583"GHDWMmfHP.Ԫ8q$#BUY@HQ_MGM{4~VC2Ëʉ:>b1t/hBc+Hs&qyOjDI-յ0J0Umuj(lշiߧ.U6BLߧ>IߧodT~; Njl?J(ƐHq**(3di/ *!-#B5T xXgj /tE&pE~йb^ӂL$xSRHD dm1|ƈf0ji\Mi~1B X+x88D# T6:C[MrOPMt)v5k^xi"L>W(n_wWOW_Q"_~wTY1`'P-͚4_2{qdRex,9v'bPx.Xg1Ṗsždӧr)}1EH;*rx2RZ)\|-p;";.slz>yB5O% Z;C38}?=k`lYcu|. Fe#tQgxՒ;^{FǗZVhڠБ^g1q,Qxf~/?_(H{s Gxϊ\ls՟M@ {_is3]=+S;?R_ɍA/O1=%'D9F_{+/-$*κWXYYI_EÛ]2W"EE4v%|ѱ.u_ِ8w*פB Ne1JX5#Ab"qnk iT\6 ߣ/+F/8M k_AAڑFSIq[#R DfSѼ9j]S@ZL]2q^Itt7yԻ? nA~cWRI wYJXa{-A;Ss^9?b~¶Rzȳa?A&kJ&jQ6Q?]{;~.#g,+ !fRۮVC.uBҸ!'C^,ׅYWBEYh]7/z_wg5㖥+zLm1W*1RS[M8&6[gR!ß- ~ bT\)qҌ:Aߧx㑚Oɿ[(Ӂ$hE0@ S\4lUF}vE LsVN-msKnO3޾_m?bi!aa2'?ť@瀭 %#|EYâ/0!!}Idx̓Nxb*-+QЊe1wq΢ At en(h4jk}A\6*q9ΒJ}+(7skDϲ:*:'3'K#Q!`Q8 t=D94 )\ 9ɩtϓ].!GEYeo I>̦yq%ńc±ǰvx)I%2@?vk'/OwIUqp@^P$zä+s{D}<ݵ݋3otOF8\ZbARpɍM XJ GtMv%6Dmv14w2*ҕ,"E:{S_mQ9yo T;AQ^ g4 G``Hutg) |%A,Cf.mu?owg.#"5# H TY'A ~/z*ĘO>C]˝rf?:$zd9:݅[z>In^mjni=ՠgԭ6xJƲ2KoLj=q6|t\\ɸ&7aOڵ/*]vrR?6q^OZGub9k/v5L_ Hnc?tMqF!T2ğeg u cl{^NPeuC@{QHӗO %m q(ZFF2_F:G\GֶM6ly]>"[([U2p]N91u &=|4&ܳ>#NCˑlq1|^lL1Ider؎R~nuF43C{>/{نÙ|Ù&<%3@2)2sƫ~[c@ _xfC߮8:=XagS?ѣ;DkCWd&[wk?]s?`>gHWL^xh&SvkO0rV+땶<:zWdi?:ex:p x_Dp3.8Lp6Y`< ة4yA'Sn#vNYNʔX;7;<33GaVCWp(&C.t | e9(hؤ?~ cYI:9s8㣖XT޳gx=z&%a"L)ozYyg<9 em  ƿXȫ?exAAW?W%(~_Qx|k}g_ꍻWG1_ǣ PU+sCqއ}*:aABVum>(˰f f`jI3DsF YuMQsN=d"1"aWi]׌w`VsF$.2D1aw'^兤f?'ge=#A< z9he%zPF>>n$]scU]* +y*٠wb0ʋLhQB$\_@gU=JDU>N1HnYߋ2܆4O]7y,61?&X?~|dkd99#^O0waM`yk} H+euc (`GOͩ[kɶd}:M#M [l2\O5i)ݪsi $T|hA:i}&EͣLZ}ԨV\F wu ]V~)1[H IFNiZLҬh`+YKCؙTo3~O En*GM!+w7oR2:JӪk 'V%;_25%h\8v u3\f?bmY>aoJҋLj΍bTBDN{ND]dM=LGvZNz}b# R~F:ﭟSپ ˣayA*Wd(bL *Jvfyve^Hd5I-i.2K-U.d9;7)vfd=\d7k+)!<~7f&kT?yv_uGfeרd} }ҵ_;"r<-{L32ob@8<+\(,e2aOt [0)$іxg?[w$X֫Ȟ0VxIQA|iKp<k_IḴ+sxΚ/JN@.%;7~ϗ;\I-3xp;š#q8MɃ./:J|xz q\^<+3?>d#'sRGCJAkEdw a74A8* y1T!dDqWaNdA R91mD2yi RNa?C 5`GCNL1*!' > ȉI PtDi|T JOR A`ō8ǧ. Yxذ|B_DB/x˅[bREٕ;ϒ6rh52ձ*j J d`vC8CN"#4˟c;l'"t͚XѤk uZܮeEP8Av(sE.;PYd*6@T%PW #' E"E,BPCʇمa',hFbH-`Ƈ$*TqxF\fyoB$ycey.Bb*~ȐEd"21Ed!ȐEdȐ8,C3:db? "Bbh١= eLjnyGz6%;vr>P97p" .H) 8(30*Y<. [ Y-[2(࿋(k0/?L=H9mqhP7R9~^:Ark:kkDȞ$&;/JiuN`|9YX@G;< !':}SG;d:d97_x?'Fi]si*ɜ^«Ðv_x/<ƿ+xnM9^ߍ7w#FLB|%G{F']]ݍرƒ{2Loly!Ύj))e j3mKT- ,95U[68ke#w'4~|q~$ʃ ܰ'.n9rW+M;',J!%ܑ^ )L2kysbG(^iq7A&['!%NNԳ6(vj4u|DH皔Wz>+J?F K]:֩t+Q{6W$=O__ik>J/ȭ4nIk͌FfZ9-g?bt&vT+5+܄An>m|FU1b+%a#n>'2ugK:$ l )JÈvߥD8b 0b՗ޱt@{F<\bҳJtӬ3\k/ܵ O*N;gS{sluFp8"Ȥ䁀+f,Y LO0go%./*fw!l1R8 ?k2*q%<9luLA6Ѵ'5D+Esn{ten+ʼn?zybV9{%N$|UmE9n3Fq5])W %#P-$BAtŘq9u 'p 3gN)R<\v⹑E:^/z)5E 3}$/@P#^BE(]bҋif.ZLfRb#Si{R6*^^eggE|BџϬhAmYvмzYWeﲄwQ^]dĆ].bFMMؔIhǎN!~8H4mX^H:[4OrX6]gΝ"Wr#M[+(i{2۞ N6VN?m) $v\ꦻ64DV!c[AMId lu Ѿϗ 4=k%!Ѓ<щ;UW?n<$G; }."f {8>ui&0-~4Yw}ϲ,G%kz^#Ӛ3"Ifd qwU cDQ3 p|[ݭYc7Jds;ی*:*\fyb?X)UO:ȩ6': a8ᶫӢ,PEmP;"V:_s ̤ EkA&$T6B 2,t| 3CdYY}~mcfW#!B@.9im>XNKѴn*mLѺ#)ӎ*V.FI9 /:0 +twc{mA yơlM>Xp[ծ|N^Y[Q yI{OS/F߈G J[vRRw_Γ:ACai נ URǥl9LdAJM`IڷFK{ [ݰ 49SM{ۯ {gPZ*&,z+4R!BAr"CX`F߳ennjPȬ}xPAٓtlNpK*^\SGDnZ٘-w9r5F,{1{.,|UF fYd Q% /v`hu }f60('kdv$UxPj}E?;Ňˈ(YϏ5+ǿߪ  sL.S{複px$"No U[@TyWƾL1)Yދ#+WjFUjwT+^ 9pv.tG59>f@0#JbLr1l=rh'X2N b8EZrIhrc\z4u/HA !>-'_w$?xF痳h7,^fG=ffO;(%#!rQ0!Y^a!J v8aTNlCi zHP&OjA$NAĄGBiAV1 Piw6xmbψO‹iŔ8$D; JC K"אy4PG|}m3#gb'!zBn!2 &Ҍ΍*1rq4ĩ|h&pqr,$q%+[**yx`4S +K%ĕ:1u+}'LiqT$+Z ۭAV{gB=qT B,)uu/NWпF艒md5uc/TM"섃{vJQrRSZ^Z^hBg 'gB`jv oqk BP!.T녨Сzc( h6 Ϯ{],镩8{GՈ$E_VVD>V7.\~W^YyuWX9\/܁L?zRDs|tx瞭}&}YJft z-A_ t ݝAϭh=_~GeF~v]6Y:KMAK.$n3lu MM'>+)u7jG?zW4}3 BL&X=YXT(X Af N W^.e×=LΟY?UJiBLRw>$ / ߌI$eXW e[JX)āBr%ie,:6,5t.xᅬwkfw"4Y B;Rm_DyR,tNˬwAm=Xhڃy?kmTgye>^I>9?nq[5S㖒xY_OV^oN S?Q9e"^mVDMwAxu8JHraUh S9? 9ЦGW|J0 tT͵l cf.4ɝM~ʋ]?Xyx쉣|ķ##?srZO)4:;9BIZdnZ_ ayq1'f=Eء9i&<37 *SnŇƨDGPhm U VE"M [+T;胴L=WUjg.9г"arTi%3UCF`S)neJ:iVrf"*DKT[?ċl~,"E1QI€ y/@0+T,7Oºdev=s0ӞRq]K´2Vp;))u^'JI4*M` ]2v1V&JNr +uVWϡ}_L?ћDsjqAɝ84J R N ]a4<9Doi;q Q /o$cmd.z.в]m>[ei*$%fi$"r='"5?nt2I觳|F#seBƐSZC$m^#ֹL3\ϼ~~ HFϢ *<ԩ=1?剉#dKI.w!5YRXiܕԗ\}%mYGP޻`N^vqqRf|=B.-{p +g\&v^go뾲\&6݇o'ߗaua_p7&쿎.;}0-Me3 + /suѝ hg\Y/'?k9^`ÒlZku=h*CٔVL+]=mδwQݩm̴֍wblP&Uz2J~@!NEF0MsѬ8p i}h+(?TwwfUbO͕Sx;Qs|5_ Hksn-bNľVb#w^AlŖ>[l・O[z[d疮~.6IgDҵQw-ʘR-s-NĤˣ#˖ #fxqe?tJ!90P09Y?2c.΢IASb třCŭ-KJ'U39h薎 ,Tk=GjcᲭ=َ>+x#[+%\/oeu=6Q[_hCPC\c~Uc;q_{+3~^DZ#1pos5ð_Yi ~9 K❸ 2_dxUzE _IP'F%{r ə}\}-edSb 9t %.;s9yS\qB ^w%↦@wz"*&0T/Z?z-עۜ0ɺ*H1hm :Omw3A ៟I8qh>{VYhZ[ڷ=ڑPb#fDz%aSS,q ڪ+lAps;4vۀhS֋;%P|gz֛ #iauP>\*F3-oJ٘lݠEhHK/X]4K\&~o) fue"߇h7y׏ӎ\Z$"ȇnF7|qt>f~k0$y/6>nؽ 糷پ?j94AØ^YqZ" zb b>~`Ϧ cJ+0<+3#9V).tH=8l}O7[=||/p#>;o|ž`_A'N)XXӶw-Xds;"#*.imS֚~oxK>^gxNvT!aoh:m|S^>~r-\ʋbVJFsGgpS8Ooӛy?1Haˇv?Cꅮh3jǬʕJ}öo{$THf|XY-D ,|K"ښvL+wYGqj42\+)g==kA;)@lj-NiH󦣏<;@>:_Xտ(8aɚh*}DaBdGuMbȁ9N|i\?bۛ1ÙYd7 w#f59h9F0_A"_%7 l`׫)`HBe<ѥ(3}"TuQtRȲ=j>]FDtuw"Q*caKZ DL4>=fʼn]\'ދ6ha.np¯;z<4]yo8ç=q:*$ZA w6swk*7 MЙ^Th͂.pfA `^vbUs1b$RnYQ&nID>k'҃`ђ\sahk4j/f.Q aMŬS$,b_a^sIJ54pQfX#AKE!E"?c?N룜_I̞xa е0LrKl !ZFvz >`\ܡ< Z&ǙI3im/IJ!f~a3s*I{ h+ä Kt0sn{ݠ L{ǿ¯۱|4>v2e3=Y)Z/-*=pc,NnG$?ȓ8c4%*a?ak.";/ٟmYy]_@sHy7{r}[ѷmIԦL ?4h<_І>79toX7QA[Q\h8%;gB̛_Iߝ.Cq<%^ OAm튓A?<2JRp40P ϴba}tL=9<`EyX3x{Rݗf+0k 2\< LLedߤёn֓tpӞݣ_Y&)%9DA$/y)%ܗe/lΤVyS,΂xސ)+fL7y͔- llCMق}~7P[p.MV{?V\L +gpviFk>w I 6~m4zx=uf_ (*ck_0GgEi&[$l/(E`,qy_`a2VaRxͣg%OCH4 $"'g:f$Uv~֓(5gek?27% "3OCdfU\Őtk9㙷!Y8A'AD׽Ns(L1)=mԴ݄]r"^,ϕSuAv 0.JYϟiJk릤ްl7n84Gyw9O*?ʯ`p/lh527x@zJŷ;.ޏ4*ӝ:0ʌ3oջ}XnL\~ =cKӬ[ҥno c.zp7u")xϻj j<,N|\*n씞$Mb r„AW|Y8Gg+m;7:VAy,a^ O*z;+Fwď֜[pO9Mm iNȦy0;g4/ k_ 7eﭪqa 55 b;х/.l^QUEYi^Kt뷂 Lb7݆U~BYmK"6 Gdc#^ѿo )Լ : ޟ`˛졷sdm1p9V8O\/L73; }PXvD\~6n"FU*S\ҏ= Lgy~}/KQwUV=?nZ=y&':Oҟd*6ddP!kI4jn^]lTkjSE ;6I:ln8O/Hh_HS[=P,}O{E&V8mFQ~ jG٨ӻ8︹@] Q* |r Y8 Z]Kn{J8?>A0M_n?"|8ԡqvHqpPA?߂s73dGC7"8 䳛}C441q΍p@2[(ǝY=w+W-lb6s~t3fx?/Aí\n(9! l} OICrgrp'BH8(nJ$y"(Љ#SĄCgB+?dTk7c&%)e^(o<<=q{;ѝ[X7?8ys22a^oqvȽI@k \AvLp7m595EC+А@ݳq&nx"h^q X2LpO/I/Ya5Ay&(#h'ʫsXy&t»;ػ-;b;X;dU UxhK8^(꽯tһqwtvAo>j|iVH䶷AD.Q'ħ=/ kţtQtX@4mGG f0`PnHn#dKבSTpVo7dPm{:'< AuUgwDF`u6/_{L oA |'[!w~N6aMpvCK(zW:<}3`FY jӣ؇?{gp«kq MÀb?xD8Rϛ1> N6`͜vW]>地ڲo]#[;i~g4 4KV+ecN?[dEz^LqidQnJ=ͅA]0q<)c8 ,`c_)YZQ=@9. z݋E6 BJSP@&ڽ" U 8cî ֵDCL<ĝQ zuH6& `RM2qoاDzV15yR`Cx[8o 4\[ ;TD@@{5e FДb¹(P2}RpNvGglwƄ_y$8 ׃˙݆=N(~Zbx9~hFy8}@[d+@D%Q{*D]V],gf yT\TmTaBwOi5#&ƢB濼ccID,"1S/{QVMދnNт9ދ 5[Skz]YT GiQjc{UnNUv7mfþ-h $7].ԹnE>6NwEq5<`oT7|ےx-BDizuOi`t %ystO^/]wn}`o+%]"AnCV=[cyvt48! G$q$V1&0 im5;>rBF[En=9kKJPhx4VuX%gi0Epbɿd +='jf]uֈAO\PI{&*$tMSӵ0x~Vii;h$/So m{gGG:`ko'Mfz~;[$wE$ޗ=@gN|[ tb:#Id zC^7吧e:]c&z9AFz󁣦ޗ'=_3HvpNgo-k2 } N5%qsP\{@a$3;1+!Dcԓ\s-#~{LgРS=f4?YH(Tlo[8M̄,CI a 𦝺uN[~A :5]Þbk t |>ɲ\;{33nu.8aO"!6OEʱg f|Hd߲/8h!%ܙX`KS{ͫns/]tw9S})͊bo//#wv›WxnRxb*n{p?k ߠ\W3$d~ˉ'z}쐗 !a_fI&{̉<# .GQB=1KkndHD]Q8~((:S̅`o!b.)&؄ӡ(q? 2ަА%G N# rJ jh\*aO_\mOh]zQ]{<1ióݞzG+ʧSo4dC/?nO!%=k ^noK;>g9S^8):x{nAB52R2GJåffVvBN*Ӝϥ)W )B:\^ Ν#vbҌHr}SL5,TOyC_h|h|&P,&S)V" mV.T? BhӅhJs?Qz ^";*dUڠAuy6t~ _6|wa?h+QE,dlo_dyrgL?C\´<~q;Cd)V޼X[__,^])w9kŵro*r洼6{rNrڛru5גr'jL~p'hWW~kUꯟ~EM-% _#DQBnegR1P$LyG{PvGV!+v5ԩv9'T? :DDE t‹7~* 4}F^~o*FzU~o0yK%zc]rtumsZQyOaUk#ٖ‹߿G VFr1("瘏/-:AtDR%h8 x1}ep'ᷰy8vqq!ֵµqu)0 1[h0JvdoVm(M@ s8 !cmCmu3]~vvxm{z!&i 8Up<hwP\jB:&L=PkB=T~ }^~Y`$םy<^0 rzQdGU oo{}k͍lAj )--7Ff; ~' Ղ0"A>,,P"N_6ypW~7 7u=^j>Z2#B(B}QsTڡY%M(+k f0@Vw~hWb%fǤr!ࡨ/[;/UQo?q?ɪYCkNzU@\_ebjEm(5?MI;?֯X_֯ؤYH볹p2\XCgG㿝?a8%<)r/{Ssǵ\H1$5mZC1t3N.F\Auer- Ѹ$Ol`ӻߋw8; rB?OLq~T4U&Ō;艰|5 9?cTh┣|a2ta~x?:^gxM+j{Q60Rch:=?QCud^ǵ3!7X_| 3%Jc>i7<Й[ aoB5S $QíG9*CFg}|$a'~Yo Ja.ӊ_ZhB)ZqagBV<3r^Y{nu*/W/Mêv( J&ǎ ̹n,2KƉm [>Dk)@b&e͟$?PӚw=et;zH9/:=`_hQA-iV=)}C尫`k+ɉ%V-gr[y=ތSO؛5 x\gqYG5d{Rg` ![t~rIRF6B+hîn* T-ra>Jy ۟ܲЄg˫6N}-Ș\M:&+ǻnc~<LIo(5H>xMxI>Mqk@K FgI ,ƒna TrZ4Nto8puP4x[nOE.C%=3N8v ZX= :2-g{D;7}پmrb(ΪcFC{c4RWl1ycNAQItF6Cq'vث=GBt3^x(Ϧ]j ,2Ϧl~ a(c,S=YpJOn1bm,3*FZ-3u&Ӥ6ΰ/Ap E۠*)<~j*W&|~~|~ΞYb _O3 s2lIޘQI5(^ T?0rO3y46\8ua2i}ٚ#j`Bn9Oe5 p|.gf`I ^ h eB14vA='`^<L.UDga/ \ 9(DE,ݓ&G$|ѿ[3W '4޺Fmd:ށH'&MwbZܝxɆ@*]~Cg^Kt[BZ$,Jcq5 Ck{ջaվ^;(`8y*eM~eocսrrMX[c6uj8^xhʊkeoO'/ #Řbvs @W` S| {DI~b1 r)-$ Hh./JrӬ*zOS{ؗ&JKMiH䘓c$DC2];̙3.[ ] W< ,RN;RzzlOq#YU)!Z\/(/0,yx6YWw~%[>&QpR5Gѐwz@@%fZ3j!Fk^NX?3ᶢفpU >YML!Yc= ]r%MYo;^Tid ^ü  5U> C.JX^ k1 Ę%H@]J zC~|-tх+)N{*գK} 耹~=[a3lIe V] 9>ÿxQb򟸁IgvUi!}EǤ(nH34B&\1Ɯ`Q?-]HGDU8eOK)s.}4hAg۔$aMNGۻMҭn˜^|l@^x kA0U2kK[7li %RKo= On lSn7y@YOA$%6݃]!5Ck &, 0y6Pn z[YZX t9S6i SeO%ۈ! @DM2" D} pް Ks& m^.`"E) !pI[G+([y >z7X)B,s&Ht_7T!Qp`b+"_n Aˢ{ ӌiK 2-QѧIprbp/}RkLv|v*8B[eOY[z~EH5|>g׌hԍ?#, FuTRLMn,S/* HJyq Xv1=*@/QE7 5N57'̘q<>kO&zYe+8WEtOv^Y˪fVǃԐa'Gjg+d\1ꑱYfUS "'\NuȬmVʶO>n>bzwa5Dҩ7UH2tYr-EEɾ$ʼn0תo4UROceL`fc2N%Q-7Tљ̋%'}JN珟}GҌU^QؙMEZ)߰Y26ed&1%U!#j*A\obiJgSxޔަ>z5#j ²$~XfɪAtt0z˛GImp'IL:٠ 2Ŕ@0O*T/|(ZVW8FG[plb4ͺlS%&Q =M7*+ 2~Gf T |2 R$JQ~ܨ?'@-3$X DsvUo)uJ u ׽%O} nt9e?:Fb)'+|Q\KNv@j" lp5D]fXmd4rb)eM55%]>򝴷Qi^7o9N*+lw鄦vYkkURx)Ey%|S7 a0Ylؙ%8TOamVW؆_W6oJ%@̧+kQ~Gzl}X|le~̥KctW6򛬧VJ Uyj%*n}^A8vI$&ТpOڧ͏4<қכl7<o^by\U`+ox*o؛rE5!y+kŵo=vQX[z%56:q7FicUfkRNB-IxRsE aW"!P]돂\@.&\C.I%y qu/ʸoJ?3Gis\J_/?㕉q>{sqFvEK=O9$zOa(HOZlBD?)B/@D~'D%zr eyvagg9uO2y;/MOLБ2`,c 5y~ C4L4g`n S{Q-<@=qtnV;2@}B4j F, Ԛvґla⸨PY2iEa۰#wQ*V7-׬Ɍ1YLf R{ek$Fy%Kܭ麥d]6%۝x8d=w2)O] I$5^U>PXn6Qv]nrj!hj(䙘UK#Jep[`KLG՚Z#0󥟐)i_0J%J e\RЬXU3 ߓ/d @q\X?} I #l<>zbٗڥ.MZ(վkP}7'Ǩ&b9:H`K^N5Ͻ< c'({$y2x ؐ>+9ϓ}|5j-!ai1ai]ƪ+G՛(8%VHd*lC&[!I(jv q#UP3T &Ю_dߜ c4;ƨp)(9ęlx,DIcAW|^ Y '51}vS&1(l;\Ŷkv~+0ymƭئvaZlE]XYsib#*3R' ą5GO+Z@MC}r\) *NEmcJ"׫o 8U)V"th,9,E@x3 ]^mJyUY%t\n (y+q cY n!qWY6J9,1L16ܓS&/8)^cvlVwC8ŏE#I/tw~8Nc~[۬eATmpnlY؆Κ}3ѹŧ^Ɖ7O҃759)|JY=*&ΪBBNY( <;IOTF1W 'jFz!puYb9Q)/[eSgQ4&A;֍fE贆|.w?Kj-۵moO0gU$fX$lߢH q?x,=5tq.Pd.@]ǨFGӆk$ȕf1BxHMd? A^y%NuV}SsE|Nv ? 4ʆmI>F|֛UUQ5ms։qXH }NPY[{+e͛ ^,U*47u*V~[U٤DY.^R{Ϗځ^Z<++co{c/qbѠ#m/k招dj|V !ԋHr$k#^tR#ɵK98n9Cc#TJ:E9% V!/ ˈf'؎ɾG31#{0Rs%|I㿿&Hrz= t< |[9u={kftT19:ܽ l7Vx` <Vzg>DTfV"h^!%:`q0FfxIk N5))4BQwN<,h"5㙡gܾu8? R>kQޱF@: lF cz(#]kҁcGWsm.(oɢ[Q{["ݬۥN!{Ζk?WCӫoT`>fs`#u:m'5N]/;<\ g-˜uT*>!kt+k7׸dS9R))O?J<+KS=GMԒM>tœ=/zTk{`ӯkwC)L`hpmTŲ@ߥ-Y=T5Ym*3Pa1d}3j-j]" + 6Ew#vjS<\zpaJc'iH &R8*/HmjhB::vX2PQD3naM5"ZzLg1*øM@G$1qO17 wSq՛Ȋ;kdVۭ6XCg۴h.I wJ7-/b%lx|;.أ1ז^XꬃEUE H">`[+f,VPEbH G붓u,`$b4gYJ~m}VOJS>HzW ' aD4}\ߔW+ TÈ^O7 j}fL,wִIO~Ӈ5hG&I&y30Q[! q*n'D=Tj{c8hlix&Ƒ!ũ5K"Gs}&7 i[4.Y| XY+GT4qѓ3 8&8g8Iha*PG" g,X~~ * 7}w˪t\͌34R]FLз tۄ6 Gbi$)֜ C8+gBjpLD' 76/ o(o.>MX,z˰vnH j R``H* 4Cr.Gʂ'Nssz [?6|9V84kx;FLD5mb.C4R~{rh4^v. [ҫ/oMA~lqY;3n[ lNdH|3݄Shy 8"R JRG 8T%.r,C wc(gt6A!MWˆGh{dıYcZ vO;)(tY]bAQRhWb42Ao/|YddC]A>]cyOFL̈ق)%f="4< ,N/"yx ruFyCSN\u'T^<" /Wֻ@lu1G nm.րc! ?f"XN@tn=Oe4z^p LHYXLaYhS;BO)EK?bn^ Ի0B$5*JMxM>"B*qb0d:=xAE ;gD1*G2Wu̞EJˢSqS ^ҝƕJ0-Fɛt:›|n^Iwˇd60ͤ]{=YSƐs @4uRq}x6crVF+ծNDZBO) k|+ǐOZgUd}s8*;0`sXY,N_T.+9i xWQI2h}z**/+:.2(;+:qyg$G@IleQnObtY$6Nh,a)92ͤ~)>N:L ~a4pG݊03Y_FrAhb|]AVJdq"JS< |3T{HI@T2(2egD%X39הeD[,ZI+nѠ -Dy `[)dm~8iiQ<z.8wNhոŜ`顉\e< 2`qz1?{dQxveo,2IOfWx H,AH0FJQNTk~KrIk Y `NΠB1qLwՕ=VF{lD@eTݥT;O|2a '8BH度,2Ņ*sWvP^aWPn)fj.F^GޗH&Ю0o|AwpFXOc''?#+b l3!#LꙦRUT0[D<2[_߶Ny/CmITU+dPfRܘMh8GN~ ;NݪQ!V>/PD%(CHzfiG?\|aeY9<1I!,6 aK waX k% cqGX?pԗke59EH$op5WlnlSk gye?T?&{&U5xdl]r EOcp5͊ii?t+Q'~Wđ!H#0< ){K$RQBYȉdh9Q]@.tVg\ISLvw1ls$*ht:: Gzyrw4 ֺqdFQki6 r4Iof7 k^uTn+-ῼAv3z' <Kw=NQqgG,f?86+_48gphg#r_Gk%yt2qE5- vB:|+F)0qsG9-f]%g<;ovC!Pox7D3 l_# {mH PlgBKzϖ\ޔ0%َ6Y 4$HݤgBxub%tFsT8Q*}t|\ G/lF |F!ᥱ9L*hP13մy\|MAopGAKV~GϦ9 N?2V*3FqǦ4ްz̦Mi![fkHQH/oـ `*"E 5*`|,?}x2 "x|8#zb:8A3q =՚ O1 ƘKW9_Y{j]0`_I$QƇ׆B)Y4\RHxR50<8sUc&m{^'MT+@+>&kN$kUO΀;'ǧY;Y)rRtHn S>͚kkJsa &)xNvMÃWw*jzZSګyj.#SN,QG93<3wL5 >9SȺ.K7v-o~dE.l^5)4rmG2i &Q,b -hw4 Yh.#:X3X#c&Kl}~y*Z˺*πK}HvuOuJꮶM ;=|[h#kS8B6Kj#?pO#d (eH(\˵=\ c0ba( ]>ufAT \D cѐ~8#0"_VoMƬ@'?I1W[!qi]*b p!ifQ4<Qy!p@0tљa$_[FШS&U4S=.!9XL-@盉=NeAJ(ҿivs$]!nhDGsDpin3_on??KlqK`J0|M YL\) &Z(๒}R@v!Lgm )r۱?~IoiTx1MIIeZ]~m҄~aGMpԳMnn/5m$g&U} v+n|$s1&}ٝeZ%a1ɓTY&a7Ju(IuLBE.RKdD n.;&B=IooW;!MY+j ꯠWa2*Iש܄ PWءN|`%7\ȪQ ?NĂKRukIy^Z-Ux-uWï?2&i#B{^iDЄ\8Zqӑqٖ|P-9mEK*̹LڡsRF\0Y.7pUv|)"E9|ّ$p! !a-d_HJ3~ڠ!`~H0bh@x9}[=FU%E_N8OHIWAQvx M7;Du( 'zvpJ^ ";}Έ9 VYuwWptZ)!c(N; /WW$4eFM`ѢqFk+9Lpo;Ur >"+Y螲\&5cM;D]|t<&Hz2K$UIJ -DȈj턤F&NwO۽>ZEURR)KP=AbnY>\,g#|~~|pNG`71ҵpJWKx>n2 VL-dVc`o.؄6toghg/Etz/G^;m|"?":z&K?hUm\8 eN]=w$!y,uqzs'Y'J N6bdM%d1Iǰ?pvdA88@)p7Wecv $h7dD<_T=iM|[%hsBIX,T*$d~9%pߑY=[WTjicS} aڮDa'[P{H/ 'rHW4LQ*I' SX<$| ^>ڞgkG(!i*hĪ 5gjܜ,N[\ŏ|6گqJjTNj_rreSc?\*{YkjG2XӵtԅsE $|WwPLxXTm)>JD[Jr:/:/ŵ+Vih *y,&]1%fv⓴6Oh-jѡ JBZf9mr/4K;JiyCUZaJ`n`OKbSEg_nZD;*Q.vs' Tk@y?X]JQS)Fܟ\PC;&0Ǖv9̊.+I/9 ;]}-)>_ΣD 7RJCT3eJ UЭpaLf lG%WURo^UU[HeKVJ|AP"[ F ̋&<}p޺U=C>EGm;KU:P-p<~9<ϱAINPaꦗ&?=o30vDl sqXwAI4O><[3CJ{tлmȃ$м>ވGPMD\M류e> ^j~ "Z>7!٧W}w՛"w&1VL$sh?Z^9&7X ,:7qB\kY+qt@AqvTM=)CXHOnR?eԕ+A1$h*c6ҢNCFϻ$OclЎH!fa$RCk{ZĴpEZ0 \$M kd/XqPlWfy9$AUѪ%Cx -'g 5}ie>2eRr3iRr5x ѳsEIzC\YG|cG0 !Gtsgi|oZFPQiHkuaElq7{Nu>@, {4'|e<}<UK?OC=`'AL=O%.'`,Lo}/{CRf6^qy홓Q#J>+6.Y¤qVช(uߒXBD~ļ1ѡs!"^t ;{ .1˵,Pq@h`+`LA-IIt3CA?OGM9GVCc6MZnRO=ČIbE]p]]> MS^S8fʯVϛExf撌D׉y}]G4#,&/2N.;rxJ{*-#1$E86\NQ b2{Kr팵9AZOx+('-5,I7+"3oVX*fef %!|~"y[xju؞!=Q ?[n=X2[F so02RY|qU|;I-a7^SRrj@)I Ud3A+d1}7ZOOw"n7n*C,K+DN2x4@#p~_ &-:Zp zNSTqvz zʩ5y;}/HJa#cO+7~d/碧s ~}[i2 nMM<}3b\舵< \^2pz:J{E~y /}5bR%iBpw**Qh/ޜ$b#`-S|  hDߕʼ7̃:>Б5-Xjqf;2m3S#s{\s2D۳'}%gAyQ튭21Ys:4cVg= 5>aU2GgtC.NAPh CR=8Ǿ?l|?*JYj?ˢyﮜgZSX#>j3 ;y1'l*XWs?5 ^3<&$CKtRMMkwŭߕ"`l O]I M0 T:ܝY4ljDs,䆋NK<9+Y,?z{5~h\[ع { p5jt7_B[b3nRVRg y CKby7NJȌ@VW V#_-u&࿾َfGi7"Z/y"]F"(!eةɰZJk֢^jv"\29Dyż[H:TԾ?& @,ݛ\C-b]xVWp:nL$TGt OO4j(9*rۤܦqUӨ?oJta72;|Z㇑HqP'~ԲZ ن=;o'y6btː&\0{"wM@z0e9n2 )W& qk=.99IR טu +b~rUKvtB!TwIer=^g~,2:{(F_)MPI(uP Ɨ{< 7$:{%42~}t2o ~g ^t#|gD+ _0Q'2/ˉ= ǢLH+ :"iZuq{) #[Ϗbm^ӟők?g]<Bc.uq6Oiҥ 2B0<&1$by|1bC<1A)S-n3Q{4+owlVy}waIJt ?[)P<j9) ò3~Ǣ"/FSL.5K%{gwW wx4Ml+c}fnW#CEP4 E49daw@'lWC~-[g#X`I#r9l`)RL 28,9v!$0L/oyȴo)lF.|\9xb)ިn-ިyF,OpTW.)6@"HgQ?$/ grm_O' 9>gb~lSs),FfJ_3CzPt(+!7 MT}[]ERirSBSKµ>Pnt(aƓ[$Ld|JF^eQJS_IT}_ o }q?!-`:O528J0_xGf`"2H9_aSnfw9~[b_2D^*;jO2y&jԢCliEF6f;{2ZCDjm=<%L׫ih<ú0LHS'RLj4^o Z[UP{ LcB3 Y=:x5(N-_SgO<8KC~26(`ɡI?KY1BuJ[=N;Wmvs/6 C#e"_|Q1Z7Rmo ]誾Ny'bDkJ K.3@Vg`Yvybf1S7p;B~̤2X(y|L"y4b}+|mH*M=:oR$EH]m"]Ʉ 7 X}R_Ƙ .mqXгGaU%ߢ"~^^/: A Q߯ 7(l <,4&9BR^^;@ՔtJ7vꯛn`^~0_)`- 7<"BNc0r0=tьLD])wunu=G7Hoq{ <=G˸4; Ux|X#ɲ1N8Ǝl-զ]Nا}_ Hm7;{k6ygX1%h0B 04\7d`e2! ip<~7܎v6GK5ǵkf_/ߜ=ÈH($.D_^ϿQv(R4&H<Ɉ*,]pG݄^7{3xˍo ԟ'WBmpNf,@v#],ae*t/㏀ {3on_uO/JY9~lqj֎~>  Gkm2Sʂ/J-4V^_?Nz_"IZ3:9,*|u]pgR!;\DΈ&SG!~oT_փ6@'x՗,eh !- <1[l#}"},͗}6e ϳ=?.eO'ko%} Rs>{pV) c%qs^]fS:b&QM/ue&#n2Pm#7kܐLVZ tES^bY "hraࠏ9?ElVhhc Ն-Q-n.aَi݋']1[ո{| a5)Vm%'2W4?t?{֑KzlU<?%5u=!z32QqB8e"QtR1v!si%`6'˕/ s!_<4u'wȊ$ J_Fg,'FÊKa,}^$;PTtYOG6D"B /ApʃBcqqZP 69p҇v; `#y.#0 mOَ5ͨoTreTN]Y<&|}Um6ә\ 'VīOr՞wEsn+~`6n ؏Gߤ|DTjFno@9Gg9-#$R qhú}EFBgdְ;H@˜G- IE1DEP7}b0,B]tδ3 <ΊUM3j,Ps #fc 8n696S]Kv q BQxv[E_&k ^^" n 5:r5:u_/%Yw K`)`ړuW#&Nđ'=^ \Uaw[ Zτzxë#*$ ]|-{f&Eį8! uNNQdQG,Q fo/[A&qWETP8,ǘᴡ7a0I^OyT_sR+@5ۇf@ԞY?YYK00eвx=p7 /Gl  U?.@Z!|dxn%5hYHV#($Bkų,09Rƨ,3ygP5I5zAs Q )Bnzy+uF cIpk1ԇ_~Ș;jTES#,2@ vطl# PZme" Vd;=xQÿAzl+nt~XE泮 ƿLJo%B?Q4 HI]4>\{қ& $FDf,-{9anEҨ"puL )g }xSv , i>H'>*ER(NۊL܋-D("87bיg~K onl:ߠiY׏Lc|\0=tM Z9JDc`t'2.t!yON}f˔xA`CudB(RaeNI'!5Kqᧂ/3ADqB=?DGKB!/D`(6rKH8kx> G(k8@D)?|@)8tZ]9OA?du!fJ9.$fP}8iH&~2 [P2R ^;o]ΏBe~X(6Z? .?EmF .?مJ<$J鈻a{ I%7}SY p ?tY% hLQqԏl+J~mI%wVhjlQ@-/=suQz}2ˏWeF*Ʒk`Q9Ώ"s,@k1o]6HGs(J /κA3{ > 0{q8ܒy(c'ի ~I RlTU k^m$Tm~pD-|\& 5f_ϭmN^]-*;jN-`'xFH͖ܞmqVlӜ9S^zbc|HMOFi~>4c}gD_e74vZEt`UgIpZaJnLnd_ʂA*Z1UunȋWXLD!_gM0rohɥiuXXXcRla0c@;-D> 5_*\҆kWs_MմZ~/0} דOʸ8#{z0O`5S&`ɐ<%q;lEaE zt5%{m/@<$a0m"P\!L8$Ť5wW^&50.ØQ^DEb-QUot)BsG|WoES3"~J1qяL"퍤E٧]zL_So8POn O51k-79BB7P[u1r9O\&BȦkg^|:Kzkx"w"MܨX COHe~X Ή," c8L(SHBkOD΋xKh~*w 66O<NȦ4)cojuT9Ϛm5T| 5q*KK5VVL>~UfX[tcͤc% 0Q`IG,,LSKHl#9 &GrʪU`xGlEn*D{R$,˃9òksPF˒K@nˊ<_l6j9PTik^}y@Pg.wq_$Zw۲LɅ+X-R`iWSPݺS'ğ<^bXr^o`Ne2YVYQY OnڷUf&I7YsuіO\7Ę 1|dh_sWEa/1bgخ#l02{zcDb.nKn31| 5MNQ6Fjolcx O6[l8 &M&lEij՞e[#Vr4PavR-ȹ3ڨΆ{.z#^N3ޏt){(싍`krr 7"+#6$~qUw|ʙZ/:Gv'G`&grk5!Kbfq`t=f!m:hX6c,p"{+8HZ]g<f-,Ϯ~ϡ9$,'Zbc@~Y5{)'_cy1< +΅i?g!QKbh5Iz̧*o$k* :cq@8"Wb/iG\Q>EnŘKe`qXrkجImje\J>!im餾J'5v-]Tl.9|%unIEjV I>M=ii#0Sp}xOvH[$]X( N'YhX-cf)psل_^vq65\ЍQ6D[hHvD J47}%- 4̃hw|7b. \N:8D++^ѡڙt1%.gdL^QOƟfw#wNIXؠqn)ot˪JǙ_~(.yB:0F> ѽZ@䏣I8𠵛@X#:; :ב[=FK*1Ď3& G.戳MHjW In=gZPUhs\?0T+ ;Zy1`ڈuH~BS ǍOus`oh_j^`a֖V.O7QmџR|{ppe+&I:|L=lp`>lV=eifPu3${Ӊ+EDz6lme:/ḏg@u86%QeC8vpr",7yjae!:]6@n-9Aꚦk~󲰫n/Zp69Dw:yjDgއ,K33a3t&/K&:uW!㝜u(* <`Zz墧=^rTG}p ' ; <('|>fiQiދN3lKeϽ|΁ҼrzOB8:a~/?Bb "S`D cmT+P:cPyZ N,6A8y{МHdX?x-ԛ|N=>O HDS+n[:^ paQ0OH4 Gw+RjL1`A?+ÿs} Ӥ3xDIcdw"'8nqx- 6Cu&C7?(ϔ*URTE)RV ̹ʸ@"BkAHT{!~ O@w'tƉ5m+ E1xf~BとWjpelc ]LOxƂLMFLI+ReL&1e錀7{Dlee;"XW<'1‰ G_G|N1"T‰CamMp5_ vh 2,af?cЫDD&F3A8jxϧ>/7fOTJX-PG,|@`I^Q^i%j+7YVh23-.c)eJrJ0T"Ru40oKI{ m;J#(ˮdFu)zrIWANs%@-H>M#h=Hi/D1 8\1\ E@Zz.CG(ܞY,]݄!1 kӻM2} q"JIꍎ~DTENr+[LVҌ[:N5u@1't֖")w'⓮l|کgge+WrQLo> QoyxBbrn/dU`UEz.NN=ϧ[Í&$|y0$5]iTo+HIq*I߶/\p|<]Dw}N,gYAD xAE. ?S8aF׼!'n< ;?~ݯ{o mӐh!Fp] /;lBɫiˢ_#GҡF):^RGaϴgj[v &k&ƶS:_ % Q=è FԨ #9`$W bGH1wZ vu_o?-j<%SAvpyO|E_Ay(dy%6O3MuZ0Z"IޒnPz .kiC>^>jGPB%C߀߇}=Ь5Z#6|rĘJ  rM_WVٍ`쳭h%2yz{q{Pi}=>h'GloeaG w(pɻ#XTV' ^vVM090 B.@B)b'M!"PK ѝ6,Qf\+jdဿgp,%!bNF1yH: 9 Qr>xZcF N2_hbpÉ\-qёK\ 7̳ }K bXN@݅,Ԁī 3 0Qa}K{,&P0K8Rps)?rv_qnY}ߎ۱}7M\'踍1Z&Rd-c<Ć* X۪\YƳ9<% z/xEګzyKQ#IWBg+'B2VPLTFɺ3Qi؁܎8oH$ E,HE=1R [4$#)Ia/Ȋ$"(0otOz36((ȎX /Q8xe"QRt5 =ߺ-N*{#}#m8 0u`AZ >S{| I`aD~; `w&وLo<ߴPQ &lHƭkNZBXl(Q6Z^4ͬzӅqeBpibxig"Pw0\aqk(uxkk,Bj ;Y{+[omY~[Ko{:^]J0#dϯ3^;b]u%`,1z̊4 `̬r,$GVzo?zVބ …Gem?Z(Z7'2qOqC\ ߈G_gɱ-jd'e]BhQ]St?8g! UO;ͻF2v{P^MFt(C/jtR8YN:gu>;BC [ZS, w&9)HwXyQBV6yNMb܃Gpö̘Ge2e;`]iÒ:+2+37zz;xQeT8{U`~Œ U<&IY5XgX?,9*X`z/Q0җ+􄡽^ł<1.!P~ / ,S⅁ωzhVJ?Հ^9Qq.9|p㉃s"l]&zu&‘B}03#% M!L`OGrqS% $Jz9[U>ǭ9^6^)*9 M.{2'V"XN ӃÞkG R$aiu8ny,VL؉QbH}Sq+Kk_Î{.ᇎ!+U1oLƛO1~KJh̦|l[S8q"M鷉G i< c"Pkep;%]>ӵˌ43m.L*bh)AvTg| GU(Nz;of8jsA93Ne'?FRD`rK,G768buY'CՁxvέJ XZ$Qb* 9UЎUd6?J*v4m"|[*hcT1u 8kv/pjIVc<#͖<aɾn;"=XS۸l̅ -`Az4NWp}KA;|BEta w%iI|`rITUYfJ+% 5^k4{\YbaOTa $p*4 OjY@^<ݻ'Jgm.'}g̳ӎO#&'%}3)~(qК1 N,LOÜ5f^VThMbrКc?^2;XN;q4;O Yx7wICKdHnSsnnI3,19yQۅޫ"_yRo|\؛sg|"AdN#s697g~ WzgliA='\5̆qE=E_2 m "@PUs?{^qq9G$VD-}99+тǂwpE!B&"<`?I`&,_|d+4L/ɥH&igKҙ El>$<~mcr;c#,5lf-/G7#~wwq{%Wq*f&9E ~BXIj(Muy'Iq,ک# [`Ox%.}~ H-xFɪ9BGFJ?:816eD Z>1*@*b[+;dEP.Q6G=[RnQ"HF'9"Ͷ'9T{,/@[%y9*Q_8GsbX=Ƞ>e"/יӆ&^iA:[]BB^:Ͱ Et kYts>#A[<'qt`W{ `jZzZ&Ah>.3SY"9]_ȳބJZ2=B>} f| -0M2"; 2-7F@.;U/g#;?W(]>ͻgk9~/p>D!C}܈h>H6s/>z ڒ c(JϗeV'ӈI"nc0*ҥ9*O[S+vpV+k1gћXg%  X儅żJVǒw>e k,`d)M^afc5Vԧu%{GIHaœIQ<..='hVw`,|IH sJ)|Ux]A;5 C/+t94^#B/jػ:R|w^=;,Dw-=|M܆;(m(((tJ&''qzي_7$\x eOb\ \{l+8Qߪ#|+d[VċjM}ւﮆ.1^4pK-<]¨<= ,0?\į%0B;xFW}% 0HVdS3YScOf<dL.>ؔZ<{~&j7c.@w vۀ:հVC8e /*=aDq9Y@JP#a"6mqw)v97~K<#%t8CK.O7/j2 t@D.j0Ē{4xbgdLS?!5;[GT,3u;[!8;VaV TsE x,^pMK_5"V%[x;w0=a_¾mr Tl\TsO)rϵ yK;קY]3h} g@ G/0&G Z.|/`9kOu*}2A)f*|ȉNM`ohz:$FOJ\Ӎm.O4Ǔ( h ~j4Qbd0:+nK-&<V2݂9 }.rxڛ3')ʞߠm6*^xiu<+9Y#^VPMQM\CTOq>Dz] pJgPLYW@ {% 6<تm7NӼ,|3+1<4@QD&;yPɏw Jj_0Z^nI9 bӿ/_^\ %գǫ)߭H '_xAANJ=Z#GLHU- 28cOGRR>mL{V (o3>խA$SLf`MId,~JxJU +߅%J@-GD)ܚ\??!(oO/dDMSn֭SV?ɳlgG +G% ypP>8r}k5MCY,^/QZVwqT{pͼF#$y, %d/)7.9֊)#bC;FRtL#NJ)agɽz<04=?3D XU92W팴M>)Ȱ@FYEiEY-!6N[E>نl:=!C-9#এkDI߇'Q‹rF O~='bh.wht>ONEP7Q7[aŮ5|hs 5 D& uaݫP؂{SI-9|dڮ{Mr;^ FߡzbY& _*xOrRuQҸ [s}7@f>TSBޮ\6O@8'H{/ !+JBĒAX#y2A X P@lXo>aU"\Aa4x/ 5O ?is{ξ}sO\zA'ť'̓2,2hmB1Vrc>ֺ <*,$.]iq=;g y).@x{(8kh&ff4yP%f*f *9O<\.! e8d+ )Z<)O&KJyAZR4o4$J %R)7 )AE-W]PAʕ] ?K~UܕY%FbXa;voRWeVov跔+*eIUʒbC\Κ?^(6x?:=ɭ/Ï}OSX{MEPs#X9,f 4'5JF4WK]ZH4#"5%ಇ}TTP@D%ءsIypL!Mv1(x7- l0jKS4p8ѿ@ۑDj)RǞB@>Hnp.̪eHw!I' X<kC- )6ԭ +{“aFJiZԁ>6Ӣ2ڮMY v =Rᗽsi(6txW1 (hl(Bofܷ9g4gUz ڠj{ 6ǎ> s7x?)M'x ʱѨϦ3>ļ "h4@t){WYAګD(m*r~7nÇA/' ?'V*eáAFCku;p# Zxa%)P4a=Q"[uGa7x2/[ tmSڃ7Dz߷k ]Mu5>oϢ}0JuM.jZr;F9+nZ0(oGuVnss~^mFQj]*ԳR1Gd^&6Me⇯_e1b0ZAqIS>Qc&6Z%V8]m|9r@G%~M-r_LEZem9Tli$ʔr&)9|&hMj ҜICFx/3+.աl~IǢo~6;_CFh/W?=b vʆBbNI\s;xz`eS肅B]'sT^wU+QRo%FIQR ߒ-ox^ eP;7Fjeh?TpˍxV Fo4 F` .&l<h7xhɗ][(oiw]+^_\T4;|FRE0=LJ4 H@pE=Qu~l4J(N x7F-J! G[<"FA*ybAKR "QlDG¹㸦8ܨ{/@0ْY'緮10hcPM@to* #8IFC:iU/SGxVq}1DD_2#H~Pب3#MT^s@7a  R.+v9# ~I*!rzJ@UQD@v> 3[+T[\10y1jEۡggd2mE9,?!KI,\v6B(- b1MAe6 BKaު,`6}Mp}n& Ux=%_8|W܂<}vRP4g˦ & S {63ԅ!Ű'd|ܹ"=aX̵,x~& WB!R}La`ݽhDRaI1WDE"XN.#C&b+)60!nYtI}Ny ^xh`=qVݓ#J0UTO;#5oNRwvp65>G+ф'\AKxfQ!h!֕; n`,|)Ok Aye+=ݍ?太m:8`GѻI}S1esDO#_X]`SowPBϿjy"<+jHc5$~cclp2-?46-5O :vi9_?⌂{A0 ;i]ZNtp.}.<8QѬe/RxwC Co01۰]M4C+">сũ{{|%\'8 GzCcqB9-+-Or bW/zO6u4OxîzS2"3Y+%a+E]u(o>,𢅴Cb8> }T&HC"քؔszgwN~bKF1M}"Bw|J)%'=Aߒ.iOhWK !SԂO/rƒx]*:*j @d}gPh`鋦v7[gӓ=gi#eti䌟WQ5]' ,*W[%&:8QB5!)6wlAQpg3Wּn`iTʾXC't#yѼ JC @عMiɕ ;/Dbdbw-Jr?1o9 mӾ)aSEr8:`swCkiK8.֋P|kѦV^0c1'I&!瑨F N3- S *Ezg̉9Fp(ŗS/4<ˉ$5@Ph:Juosd_>8@ Av\6O@ o2"C[a_aHt;qf"S ;?]J\^8ڢ!m?^m:5()S4Ridô Nya6F3EW"l$ k&!n='ԡ$3@'pspmУ05r<=9 I!Qo8K,.?= u S3t4 bPō#q8`34!:yѾ7܄ Ó<9R$ޝ>;X&%]0]c6٩wH^@ Z60ܣ9K8=79F`>x'.ʒ ,_ᴘe'H)Z@\dNFT(8 nցGX@0gЄ9Sgo@.;_бỳ=WNz"DEeDNI<3jQ,Vn~JݶxhxV*JۥBjox8נ1?3yXհiLqp?F6:pFc+ɭ^XɎ =o9:.]i}`_E]B},-Ǡe%д+£/; jTO%<*VxhPr‡3]&4ʰ*>q! lt)  v*Vʹ|WA?Du~5AiO[|Tď|U W͸x%)4_$Gb|F&UMZC/9d7!+lU(|qÜ{/%J\ ZLnzhN`Z99-Jgx?gy='"Xɯ<~Sc@!rN[(BiJ o*j͸&Fr(iQu0PY9. H^p]:J+1Sף';'ۛFՙ&u@@_Ac!:4|!8ZnrYw4|ʇ?>`L;C3G}|+u>sj=(aTktƸ1DݛN #i.L.ƃC- ˟Uެv w*|, y\?a?g|Y^iVN֬:Ve6iݍ>Q-Ǥ\D J3!>ETR!]N;iWr+@*Oɇ廣'n~}&&>텯Sԍ%=b)a[!J@J;ծ+Gxsn&v$Sl{{/~(vr~7-je6B ?)vT#ӑHlzXuvZ؞|hשzz_Vߑx48SG?=v7Ͽ'eee$լ7ɿR`$S8ՠ@s Kga@!7=e:~\÷7lq%uf\$ r2pP4 WHv!F'Askǿs6_ 5W_,Wc *l͔Gh9^dD6Qϯ6Da+" fEyP1RV(l0󵎚I_x`B͚IN5dͣ|рgH4Oc0TTGsX,Ld_\"6g%b"Y$V"J1aG)vE&8#2% m5T;5$39vjhZij9a 5 ,<_[i*ݑhԮ&Oy$K@k 9~9"wYA33Ock3W*\Z$ŏ"`EӐ[N*M+UDܭp2Ña^W @gECSKm1|U:3D_iyX b&L {%"G4hcB'i?y%ZyJaXY*(G+W 8g 2Q<9qXV%g$:82PN۴O꫓вS몭UUUC&я#kij;mFh3ϦR _"ͪ38u\,2@=<$XMa~wI=?e)Ɯ冴ߗj<;Ffϛsid3HaNV)l=kjWك! Eapu2MJ溆8-3η~|yXó"ヷd`- \j`M+3;#u'Њ8Spx6#ɪo @{|D a ?W`&\4P M1+p*%`RtxpxU{Lt0: ^KޞZy ; yv (\|YC-Xh~_4w]y\vصtύ\}a[= ^mXTz rŭPz:yV[|Bt:3*7C] }G91Iv:w5@4/KffQ'E0ÈV`DGCM^^t*b*P,5}P32] .M 8P^~!H@? RraS,Y=%ҍN ߸!s DwN1_|gwVM00ˉB_@n gv0Xf?,h|$?X*:a$/sG  Vy/[O%3:6N(i+s٧xӋcABy! 9 I1@_.߅)lxoW~+o-fky"n3F‘HB ,;Qzm^Y1P!>^ߡ@_ tG1vg4FMY&f~Ej{ 1$ti~9QHqIJU?K*'bO}`@<P`y{/FV+ *"\MZOsHq݃ꤲ0n }?$O22 + ԦF7p<dP{:bnC"zjn:V-LABֵQ+cw,6P6X>p#8b%07%M3B=^"@ [0K]Knj,BIKĬqY@\խ4́nd\P㙜NxrZu|iqxk|mw12>u4#96Pv!Y%{t_+fW<3$YaSLΪgVn(?[INYQ"sNY3nĻ;=woI!g9:-уrA,/GyuQEѰz3Ͷە q֮,ܟGEG)jpbG]EeL#iA~+MR3{zp0oS6|yc_˱W.8y-xD֮W Gvf[ # /W^b:c|^aH@!< # +-MQspNf^]/+plt%m } #>-$I'ot'i;ɕ|ᑔH;8ޡ HAu#=' kog9vR9j(I*n+m;'=ojUϏynf3.P34yu3 L:#7̅+ڦ57W{p&+Jԥ!J^6UI|邭Ӂ'D#\EtZ[@l烸UI$~:Ո;,ãf\8P~i B'|sV\W JzCچfrrZH 1bQ~ɀ+MJտF5hGX BQQ*#|QY^W,8#'U4x3b$+>nHي˥.aEdB7ʼe-p ZN.(Y|yt5A,6|ia]+g#k|EِwxdCm̻;W]K0Y#lq"WhO y{.αc0+CGX|/7BG:l?_XmrjL^J4c/@(DYHwvsF/ފ/N* )#JޏN\&k[~bU-*5 U"ޏD2oI mIjXW n9Zhh*["p:13& %"{{Np&fwj3?%ǪX 'G.Õ-rQ NIRu+$uTjt\yVyϐIu]@=ŨZyd[ Pe(w /9z3'lH 48:GP};#܈SBɂ|nV%D`W?Y- ۬lIq{J/ʥ ԍ<'Q/zF:4A. Sp xkxŪϓSp1s= !o|ƪJJ㭶At;mli"O<&(Db HkCb^ogj<ƒB5f:eA- U%G$kEx@} wzppOůKœM_^$I$h)t¿KN a 2 =>\3<5|{O q2:"xWGдD+>/v!˜ W̾ LX7_* Z^!_ua㿪Å =_sVEV3[x2ڛ0ޝ@I1F+3[&ŌJJ)e Gh /Zs~ @wN[絏6 ]d<:k(Z9KMk&u-p6n.K/z}8v) W7M^G6KDl250!,PS-_VQR-b/i m|vhy1O_M5ܓ$zH&(ef#;0)=\dW'3T}kp;n4t1ɱLJ<(<=mTIA-6g)߁yV{6cE32*yoxnlx!y ^tlCɭKE/,-VҊKH֦APY-tv~Sz;qCe yDžZ ͧhvݜuLH`؃#3'GFKFF_i1.?F- JPr_(<=HR 89Ng-is*q?F#ȜZP3Ժ/EdZ'CC:Xz?4} z8(4ӾGG7dNtÿ=;#;+-M" dzȎX7#_ӱT >|{o`Iohޒct5Hn`1* w2 XvvP3/q"L$N`~k.&\\XFɆʐwc#:תNsa:Gx%6*>5U=Lz| J(sp?@F1;$,lw9mH EFq@Ra.T_'aϞaEP,lExGp}Qn%g+XoÙ~lAdD&l)z.=xpp}݃+nS- 9l rn!mo̢Qqcr 9-)z߿f}iCwCm,0>{Qw|Í'B5zS (ZYNv+w^7+u֮v≣3T(Kb5j'mϿͧ|^3@5@۝uyZ lix.=)?dKp~[L`~st|O+1-e񜼎E^p=~9*͊1s^JaYqi CpvxJNNFPɸ E!bj,?-@jPQ&HL8'E`^GH$ZC"8mqS Ct!z3=RVЊ"Sm6_G7Drǧw9.RkPl k\8'ֺ(ڈG盵F&O0!5ۃfEf]Ň/^\,W4 F.% XOy#NF}-+۬Viɔem/sOFnZ ͟?k7UMj'URk߸=DnMcPlҢ!k?yITpGIq*$68n!\%yD&\L%u@[%JmRpxwJ TXOR5mk5t%'}zٖ\=f*>?А23\vQ:l@rl~|5:U#O]N'茯 z\ `2,8h6!]IpqVXeFH^IsUTdڄyBju^E7f>I-^HZ Y? z w96KF?YxN %6;#<0A !vNЍ>Q 0ہ me|h)Y Dz+tlV[vk+ϒTX5BNp(ڃد[Zߟ|[*`EGKt;9d-V&6۳N^.()jg;Aa)ɪRiEq5fb%PCi>0Ǖ61+rsjh i ?.|(.}%|*@^E9 5WoJ>`ҿؤݽWR)/yq0a- >PīށD@bHb4 ,/f.?7 ?tW0C/1CoC~ʇӥ.I+* 0<iU;(rAz-Wd#'OoЯvAڄY_=\ t}L(f( K뤘O9y-׌OÙ:A^?dZYx]yq'\C aM.9v՛ҏ:@<5A)F)ݏ_8)_")`{$b9hQ]ufwy~G}@ ;ԎAq qp@~_ALǴ@XvL MiiOLǙ5H8m:ucm/гM+jk}v[ 5HS>aXVA2uz W 6xϸ8c z}=]S(MR ,Śsv;uo:_>! ݗ;Ni~'pЫs`,oȔ 6i׽mIzрZcF*eSkkm?nm_IchH%~cȶ^Cm:썙xc&O /T,BzS]B%_GoaSIyj G7z&x5N'(uW6L$koߋq[' yV,v ,9]ݷ`_د7˱6TJMio-](iCnl+N.*򺜱%I;OȞ`E3gy&cdfw-dw?voz ǃ6Gr,fCnw , l8UGOh(pBQ/k{LڮcUk{]и022WDrPe_XcE&UѢ_9J7j!ov@a^L,mZ1n}1e[W5YkS`)3改LϾ|1F}lHmNEGr kPf@__q}Ca|q;XX{".R aWqW!9,ãfYC @3cȧ`Ƨ5l? Z+v`'[}E?sTt^WAgxfIkL@c& ,st^k1W&F'q$|4@m]7ZQnᑓ?<Z.>nDY9 ,^"} ڒ \(Jϗ)0a>7 ۀᘠz炎Dŷ9mQ RExY%t~`/gA䚱@/X,X Jk(YT9**a;ZND7uE4jdJ+IOs$ҲX1q"?EM"ve*o*FhЕ*`~G*IU\Dw٨GJ!pݚ?;9:o*x|` 3 䄖٧_T<(BIӃ+8`܎y`!)Yjx{Np>] aq<`pDX3&5c|MtK6J"* -T;XxuT>(!fѬO(ӰؘQś;ŴÄR# pF;,H,"I¼$R&P``iz(=2J$  o~*/)V է΢xsqF,jqA61kN-zi./Z% \p %/uD>fR!7iO"Ey20sV _F&|DžZ ͧ qۅaۓ#%r|#4n|yΈd$Z5 UXҋƹ1I1BP#nBy?!CÍ`#dY8]NP"n`KAӛrUSY0P +oB+Wc2jx9(}-`PP 6 6'-ؠn?.Gq`^H=k"s,5 \(X9e^ f&h1K/qUd7JK?JTq\2í1?pAPP5PN (N2EO88]9#E; (FfdƧG}x_L 9y5(y< 8$݇}xeլ7~׌zN}IlJT\o3Lh9IC:䒇+t'=DBfi2N$( p/" 5sCLjG_#ˊ $NރTD,6zJ)ĄQUYC$w ~Eȕ`B/f}%`j8k侩aDȱ8%oi"HӺDtCU20,:Uy/n,kgQ<2ڭsYvOP0}aB]* Q=Qm~m>8ը #ݜ+ԪmK#\Xv1nOaY:&#+O_*3b䯘3޷{Jv]>vx% ]Y)으u, ki)^[eD/DahYqa W CpvxJNGJM@YJ9[04>1r1L-V37q(I# ax#R$B6)IlKfUN pz7VjJ?&Xe>>q-|`뇅bdX9EF>}=߬5Z5i ׬8] 5ۃBfEf]Ň/^\,W4 nx%JY\5wmV+Ǵdʲ9r#7(-{O˟5v^,7UMj'URk߸3=nMcPlҢ! ys|AD+~(=BbӼΏ5Rž'Ldբt[2UMX׶[.qb*WB㥦34ǞJ%mgTCXb\meac(3ek$繉槷ZS5\n$pڀϫ*3mٜ$ 7 ?NoQhANEF$ )Y&*rKUQpoUhh UXyݘտz*&;aVh'hMdNjRQk,C͞|(2(i$Ns/N4OM v zHwyZs>>t99k ]1Vʽ,$%BPL!VV>2ӞoFRlL]h.vs' ~zpm?"bj:83?}9!OJ˘?5PCǵrŢR}UUi>voq>u_wv D<J ʋ/j&Uo of~K¤Lć|\(O \<(ILQ}Cky=?tP-w Z^A%&|m(MppQCA2-JK`x8Ҍܫ wP:cW0}d"'PgH(kK3n?;N t3ko_cn@qh7P㟏Ae`4U?T 8J˰IOzӦee7sZ2aIFJs>hk8먠װm:ܼ=h1ڀ7UGmؿj>OyX&vM3;k!TKuQLp Di1 0y vo.Dɟ ?yBsPM[K.˷`$A1˚Ͳf{VE|*k 0&fsbhS ? da*a gT0ܶVq-)Gw9$=Yzhe`x<[5yUoWWB?K? =9kMS̻E)zqS>M9ҹk!HѰ:ޛ5v ?P;+l $^DS zd:V'vL MiYk1 &Z -yE@6%xc_;Wnw.l7|fUh!\s+.WS4x?3j(Sʛ z|]sr|(9RlbM9QDսt|= ,d Of_ wo5[c fv+gZ~Cm:œ׮|'@%|7o=`p7v1^A#hqynX% $"A-FNQJzm޶ݻؽ7VU?aUVne##CDPeCU hgt=2b#T솉̮Lp1.,ojeռ2aӱ˰:Wը Y!SjoxnˢR>cUCEDƞ&{j 5顅uMU9ufD(?"?="8葿*lCl€{ ) %W[ &ƒ es^&?ncVk]Жy~YhPNmJE H15D^a H I` ~ U`X1M~$fm^ '4d! 11ށK$ r >Ihӈ 1?-"钉X% g5(}p " A~cWWŪ$|͹h9yz%uī%G{.XD/YCMWc_c.Wv5aǽ=dr0>A[0-3ӻL.3[s| #['P$Ez d| 3#bO 9o-:yĎGڒ fWYJϗ5+z߃=j9]rʥDi@rojdL;-)t]ug1w q *⢩5Ctr2'oW!"*Ӿk_>W~Wp]pZme~Tɢ(ߌyڄ5{}>|a'2 k ԷanXxpxTI[o -Ѡ3ʄnnoq1Fyܬ B9fខ!eLҺ̈+*=+p2 76]A lPFHq?nfO*d>YMM<Y~*8[聹f:Ղ!RL%>*.׽tg(Ym08;D]IH{ɣC+e)l,((JحOB\) 7\HF>Oauke_L1r1V*N|Db eM@̚{AV%s=>G:x7A}PBoRs2.G.7_dG?=}h@e^Dw.K;_9IM jB^dgOr ^E?ގkvߙrWMXr 7qK.ЖȦ?6nήG\Id]G/דΰRP.֨5mϿͧ|^8N4jr֑yZD]zS.nnr/Ib$կ3޷{Jwh }LPSRP69yXUPQ/ g!?ũD?ڨ;ꚐM-рѢ.yDVM'N<ɫ5S!\$tAH} uPEMH9J!}!>DU~s ,T'AgnՀӳ5ޝ0T6گqj"}UNjZ1_GS~/Tlh$J/8] |_n/v0_ arA$W~KW;aaM)vF}-+۬Viema Ӡ'{O˟5v&+kjFPw89,j3a.`P9-4_L] VQEI@*|:gQ. 3WIror ɷM8n%vnq%\Z'Qi1/jۧ-pG w.WvV9$uQ~ojW޾Wh]>GNœH`j$q5zHcܧ/.e@mT5uz:,r뗎J`gM7hUd.ʝ#u0l~5:դU,(s'Z~:JzNy jkJbE eyNaUR 3F[:5&ˠV]C}vg `NΚJBWf9mr/HeEp .E6nj%z~O{{)$`EGKt;9d-ր:D ~[hRnp [x3O@iOV}p8l3?}U!LJ9˘y5 G)aM)ʿ)~(W~_vCiw+P.SUqW~`lJD /TPAS={ŽN~_&zRO|agȋs o"^'J.FSDp\6SG?=v7Ͽ'"!EIYohu@+G}E2~!Àp /2'SuRE9AFZ"PxtD9q;@26>D`9R}yhk`Wg_\RΆkWg_ՉiٿVh}quu!ZxaڰmؿYlؿVoؿjoؿ6_ W\6_ ׆kaڰmؿ6_h6_/- ׆>/6_ ٿN{ycSHؿcr/5jCm6_m/ RZkZ W,9$ 9qk\ߒxkC(z|"[mҋuڲĉZIPm,/h7,\P WR.k6pA,\ k}9KׅӰ&v}W\`p[(40g!/MKd0I*,oc)V(RfÔPa *oVݜiHvՔMk!|$t^yHe$wU%|:zܿ3dvg6L-⼭qElu`^{|,+|NWw(m1 K(J##:N>,da/`O\} tA:\X%Kir$_f-{RJ0OObrdP+f"tw+>)^>M9 ufGxj-rGxrG;tψH=߭tf0pyMC(yE_V:I.;99h@pwvا5I[gh 7t\"<^y(" ^##T_"YPà $aܚrp[vmT^aK'.j9~C18 uw;cihv=Qȵ{hIVDZ C٪tU{>S_*'̥Wgk:CͲ ?zÐـC6ac'غ?{z^߼]kgv_*(WI^6g캚32ϲp~1( $,N:āyp&jp ң=:%< ,5͡ћXoq:6" (U!p;T~UxXFxT^eߒ {W`K,g uwR.;Xx&i"ɇ] t넟VX=LG4Xs606,5{/%XtgQj5鋃,5⛄OS@Nc!,r ORu'} e!& V@.c4Ų~Hf]9Q+ֵաru_bxz\ Шe=eBQ%)F:Ͻ/M2z~[#A1(\Ws^ig7_Mja j|)70'c ;Pycxu3v[%T,n錩ͼB0Ztw̹HfFϼ"QNֲ+ZE#ˍZ9E`X|zRC59+ Ǡ{ϟӒ*HHl4-$ (epvF&S'VkDSKKV?e lWR㛊nh!hYWVLh_:H9&ߘE-DZ%e)He»༽A4:e  w;3I{7DByBVQ"T*u/UDb?/EG6jh&\b7u.rn=*c̀`<ֆX9bQxE#)bXl ;o^?˽[;lxV'>cB=bKFH=7<#;@-6 cU6!9M8_7 zcވdv&m6 q$'gE<( &_}<(\,pPIL>1Cǻ|xlMYa~ʋ t~D+eˑa`?%Ư U*iL>: D/cȰ*θz,^?JOX" l#~v~{k6n=S4;Abhvf(<γt OYQ: XG >P.+e9-==+%TƿW'Bb޽JY:Wz{v*QW>[za{O++?P=L8^XD܃oRP}hY_  ZH6/y?!V( .wx22 'kY݋F*";Z&K+8j0͇-aMOS?NĢMIHbit,eE$ 9p)_0\H0rkPܾ=d7};H:-@&{j{$S{8&"sq osWEŵTv3#{c`9i76Jmw^A5Dm9(;K}|EYzu<: xe]Nea l~PM%lqujFAGʚ'h؛zt#A򺘠&eZeu.1"-OUlT,JMٺw&Z^!㿝ogqG3×`i8 ԍgۚ9Ճeym4F@݊Ǫb.rG;ɩRD͠K7s4OJC.<+ ?@"Z0";!퉃5pK}n0*Wrp1?@%}aJ0q"ȣ.3y+c a ퟘ._VUq5ǝjF+~;;<&/%&QCcU2rzkyl&9vZ< :d(l? 6( $W (7Yxl 9E! N< " v5mg^*RkOiM q[gML7פ08-h,7*,ʳX!mF7vXTA`<bueG\ Jh܍ᲞU2T¸Dyy"4k8n=;g 9޾1>a Vg t]D&I[S.#]oK D^4^-(G1:̆w$pvgz:PvSAC0ϔ=@a:j-#N@uiE:8K=VK礵TM䄮ajֻnȯz|֌'xW\=+j3}jz&ȹE6"h+~߅ {ه^(^ѓeKZ@7_=Ve֠3zт`Y,M},L㏊Wfl ="JWdj@TbBPMp|t O!Dt . ,RO^}Ϯ2"F7%g10ſ0?Ke@/;鞳iy誨v'}|9v<ὄQz5`9oT|s"t)Q f (_Ws{A Bۅ牨ô^=LX#*'Qׯ¯ FǬFc?f"uc4'}՗U Ȧ7uZ EةDf04w>FW&Z,M\'gZ_? |xol*_P _|xԿŏ #pŦ= f^8۱rBK9YQZ329F_V"p=?x%_m?wp+[cl r-kB1:b~%*+S >uSjW!S'~8[l(\A<9P|?PR'"Sw|P1ЯgJ%(dYsBު# B?@?"6Z4\ۖ*5~ ˱Gh6y.;GtpJexkM3/dnEK_;^q+'eSg\~X;+^ٱt:}u, ͯL-].Oc5|A~UiY;OZKϳ:ǭoF?pR~:tr/aة\U_;*:r W#_TP_)0iC)jj8硈ل/L{xȳb_d!wOrȽ[r)Z :i6t~ER>8N_R`/o<#Q:WGR >}cO>oo|Y==Sxcox6z;,u[ Ot?ժhl F7~:'fUKb^^m*aiv<;'&e܀)sm2NG^T,r|o5;ro-l Tq6IKWoxg]E6C*`&RShuM#~xr.ČA(N|/I:ɸđd0coJ7?Ҁ`=K+ձXlulYl߿Fo6vBn/F}8+j$>,bG{ A.?6@+;uNFg!~}YiWt|CdWhA04R=obĵLEHl$00W.Ay^VGo|+WR䔻GDO`%4rRTͮ .Y:D[nuRgj-8?|AKBKBiT(Xvt֨Y?6ʊy#%&(&O) / G $qmqi|v1n/[^pv ԫ@p s\tUPb|OīZ-"IF-}\_NŵT5g/rπ1L/0J>O;DT44>N뚗"}s.q!:]SG^!uZ򆢥Mǧ'vQ 9_ W͸x5(ytpo\hդ ^2Dd AV$lUX c'uX^KItЏt,6ެn5.8S4)F}=tP 8 {Ǖv)cV%K>D1nE*EN;l!KȡH?v1_R֎ҁx7Xʿg+E*=l=$jk'P*cPS˯k"b9J+^JjyU -^oL"S\`GW}[(LMJY.y o^ѨTЫVzCCt[tŽ]zUҽ:(ɢ ^>+ؑW.WW]:|yH/J݉>("nJ7[r{uG )Nt 3IKqgߢ~ppOM/eoru<גz֛lκ&`a 2 Q! qw:~\÷7'-Ԁv\su6В cJy"jrޜ )= Sߗk..ކ{ /e0C2 }++`={<&7{) 6DPAi%:hiQRDi8 8`cB@[L $IwNAR*fyX(XbաlqD,*I r#]Ío p7NEPe8-pM2pX! x D+IJۯ[J< \  BEt;Ͻz/AW7VZJڢ`rZt.Iղ"'?R`%ܕ2*)Pթ)ˡ$cm:wҜQW|Ǽȇe!~ "&[L%Fc#:i!pY=:)Wg u uQ'|,uƬ$r9-OekcEmaxMUDot4oo3l6@QנZXA5^MO~R{vGGFXwn%lvM.|YkvBS<2Oigxd#+;@ț-b<&p%(] c kp _G(c/i>HH9_ G3yev}wK>Z]n̶c25Ϸ٧ŬW'# wR_"|9Ku>7#dA)=Mt~xWRW"hQ5LP|pM6]̉`/nuab3-l?crBL;N˹2|߿J =#6_Ud34D>|u?fW?{oڝ6 z΋@}`'Bl'䬾m%L?RI* 88ծ]=́?vVr&`?`韉=ȑ#~1|Thw^H/Sor 5=o(Z$EHW|2z] b' {j4d u[%Y,mJ[ul9Y߽äxUOD_Znj-=”8ׁ;7YΗgޟ́[O Z2!#Wb-\;_'|ɫxJk[]5,d)ku@~pju'Ϲ%|.eMxe<׃X>ZWFⵖj,#9OX9È.h( ku7pIZPp[⿑un9Ru#V|dFml[xD\\pAwݯ˙$Z#P[&R/*֙};wSsK"OjrVu^GCW)SƉHOcӑ[HivJa#G,͉6sU"K)sG9?rKX/s&*m+XMߋ]@L !oƾz̼F7UqiFSHS #;8Ri?>eXŎ/Ed.PX+qTۗp{-bVўgJ#c)cˀ2k^TEgl1E۬֒;dShF*?%Ev wy՗=e}8Κ}N_FN} E_CBGgD iBo@?%"7zټ)!zV"nlk~| iFoŝ5[LGNZ=tLF`kNe `I%xLm'}G.s['GBֲ~^ 6l+tWYԓ6U'"Ai-Em5y] p:Vt 7u{gËr,HlZ{/)S)轰qY#;_Ɏ"^: Lgj6)33~3f4`7eV)[ԄIơO'rb/^R?&|9,H"2pPic1CG" Aϻw{ JLhxaT0|4D Zb8`pb;I#)X;/qיּw{  1_H/K}'n6Tk9ތ{*}WIsb6^g[eUecX.;e}9-,.R;T4*nhv"q+bX7e$AfCO3-FiaSXn=-TM3fҗ%=_mH9C} X!r\ccÑսOGG"+G*f|`U ;_ ૢ@_~s }ej@}"ԤjCM+Ε&H!*ZCԜ@;BiLGdJD9b K=H)qI2OR5(ƕ\]sΊWPE9X%Cgc K =7<{M<e|vjaiV.|k|\Jb~^ ];miH>Pa4V AfzX.n12-$@mG> ƈL<ʥߨKQ;AmW˳#:KUw'y%3…yU(zT*yjE~`4Ⱦ`d}lF Ub$gY) D.#'fmM"S4'K=6'K@6Iw.$;1I$G 9J0@h2nB WL4iD%i҈.K%i,!Gq ѿP Jaeà@cT{)W¿/_:|H#~xƤxUݬ髪rzqD撈 3jDE׈XL vy U5ʁHKY/.flz +wZ"|~gƉ/q"{=Wخ]|W,?ct!&4[TvuS?NuMdk832Nߎx1:?Ens,CWBG3_P0QmpEcˏ:ρ%!xJt o.IϋGֵ7-=~Y^ EL*ز /R)\?pd^j% B\)*=?*&"Nb𑋳Ge+w_M;ZϒW*iOc(HV {FՊ/B?~w f˂Νi 3K"iZDQ5Hכ260n]B^z?#έ + {#n%yw1C2xS*UKTGI71D{Rv=(v5R꣠;"jz +<x`\4-s/s~s?bkce+}o[ujg}bo}#ob#9u,n#pK`8u N]AOTy= wJ~`A^O]?V"R>ZhS압-G \ҧG/av3>;_{2:FTODTGTw3NR+w?kp>O 003 a>0\.n]W.mֶ w7k"pۇF~:zd9w֖sr-O'5bގBM($I2O돽Q܋ӃX"7*oƸRm(GoRf; v"%^8;tJ?MY2+RfEzž:vaG:g8ϋ}!H"ٯe,0 G:q6mNX ȟe܁U:%cA%d~X<&IO)b[%E:Qd}yV`o#APBw=&^r!FVωsQs["?ڪ` MFxD 9SPx36z8%m[XA\^/Fԣk;oPպ:t=W3̐1^UU2Ԝ&Y5%~kORZyC{N%J k9E15J%&.m! bUXsnpo%LRggI @ِ5 FzfB2ph+m(St`Klv)ov3섵vsVRD;E$!Im G*MЄSBTblFe)py8LrrA=޻? Lx$s/ӳޖ! ! V0MD S?~wgKNC @J8sLVd'0  $gG U7a=xvG%x{e=B#P6ϗH&-M0z*y,*iE^ 3J> ڪ]M9`%XAW-ea}>,f9OcL7Pp:uΓˋm;B[&7珀1~[zy\4e~AS"x1'PQa'f'%1-> Vhc*jG̯ՎZNW .wYN4ݒSe#S*lL-ed:lS2w=N-eh~M#:^aɸS߱q'_n_GDCs4wa1]"dYв+xe?jLs 8·ϣ04 K(llƦ'f+좏`xʌ-;uW~#y:'V-l h[&s 9l16DOK,H ;D!%@puYAIEb'|cQnVEk 0'*oP㰐׀NP#,&rIbHGbp_][AB6-G!*$uyMH )XL8Nf*c#[5Q6}{L #[Ru- J^%ٔлw]|kk.DA⻖Ṇ;'K߹ZWB5ۭCx TǷhrMM~i6j+yv:r|cjrN2<[麌[s*U\oni3toXF.~k9:U)+{BȠuEUh:۾י:C[&g]-'_fl}泅0Fݥ |Ŷ+sq嘐h5ŧЯG& 1Zy`5BEq҃lWiPT egIUljGaƶB"aEEiQi).ɞ@һchucZHpGz:u:.gbt&g1@`ҪTA^D)R5ܯd"Lu ]>$ȅR~^`i2B)j4TS"gHqTWph'H=:PT!>N!'$*;$xN%6O-Zn\Yv zO<\} J6Mi"}4(SXc?iP&;,,)EĞ1|;,lF{Kq¼Xhr@L!c*dg!ip=5UJ` NDBGp~wAanoE2VZŜc_x) '^TͣWLP&+VĂ}gm=ՎDAOmqscKyx_VWq$[`_#]qel[zb` /CFJ0R|1H&23CʨaĞaOMBYI:QЎWOWLaiFb<)8rfv0og KktMi?g* f{y";lyr` Tn jP^YcRy)k2eͶ5U2)b2EL1?_cIZA %dbP芒ؓN*T%J~WDswS8LWlg~ϴCgLAI(P#LaJ@GBpHZ98A>goNxfQk3~5:QC@ާ.鬗ڝӗEitX $R\s1 $-#5v4}TZ^yH@3m|1} S9ч9=alA 0Ln&!eVU֗a1k乩4 +Rؼu6pEh_eGzǣ% AZ%W5+BW7bf)hs! vzFmOP= ^ .gXuSG(0r(' 6Z%0̀OG ?LL\B4AH4QT7r3ңwj|ir/D4q/`_YzWGc*˟ '̪YC|khx}XQvOB*Z@T r AN;[`9a"R4{{+;JWa{2}^y>w%j"ʙ&/eZ捻4>HtyE?Up3ǽb?y-?"Z^%c)|޸^@\n'w )mYZ6|'Zq)5h,ljq͖z,8E&rɎu9]}TTrc*A{a@A΢-/4 Hoo:?hIG .Edxc, OR62ER(ƤN#Glh45ؚw#lu ǧЎATQ ԞQ>X~m.EKLi{Fe%F{@řuB+!{8{7"io"sO}RUP9Q+}N dUe*i<#J}T2 lV_>zkM#\)2S1^QVLWoD߳pߕ?qCL_\DwݽݵêxCѵ3]2]Ok7;P 4A -gux%: ){@޻C%\OKћ1ROpFI1 Bu;՘m/KЖ/;֔ԑ ::2.g7:2j;(V|XDR%?Se*[8]?x`l[$%H?} on,1y5А:n{mr>%_z%J2MNbnzSs /0Sa\ɗnGyof&BwKJ!5Cp,|(q$sp+s;y/g Eu::/7'%H9:Kh(޴<4 ͛Qb#r[_Or|^$ZV/ِ qO~ihP}\..~*:9KE%~?ljʡ..N L$Cs) RPF [3u |2l]X?"A&?]ʑd&ˆaZzƯ6]N^ML܅G^Y B}V#||_ (1?(Ǔ8ć_zߢI>@p =\:RS=l͋Hf>ՍY quQ@4h_EaU۶C9ϖDtۅ'4_R|ǩaXi{C>/ !xCXnP2kl ] 1я69`ol,WC0WR [UNS_IS"0I=:B ~|kJ)-5Jׯ&Zq[WQ`ܛ5T8Z!oDm'>ys4l29,9(Z2oifmVwoT$=J4\0syg9h h2g%+ҟƓ梕_IzWZc~ ybWIdwHg}j[*dRja)"gGgϋ x6<˗+ =Ü;LS6B>66vܰ2]g}*=9)R丫e@5=}䤫ǵNϡďc!B8]]VԀ\NGGhVWe巓~h ]L(vCµ d) nǟfE v57mT֖Bsu.>L:plNp6*'Fsfg[>v(rɭ\O\9#<ƶȫ̉m\rD" m*Ec\[qE82\Z+9ܖ S'GN"9rxz+jnћZ 'F 4lWZMبbպC40Q@ZUTk4܍sץ iy}VmQVシbalHKzx;x"f-toO }@̻w޽EG" JW{y\C-6ϣUkJ&xʿA0l!3;0ޣ߆]Ag\`H/ B7_:W.~ >Xuf,/Afw|BT[OG$AOBx:_%=ԗdxFEߞ B9Q0GuyH,NfwW"zQ 7Yk/p=ǁxZ{_naK/'_U̖o rW0r?og-7`1~_@f[aXDu5_MDޠ+ȻN4!||(%ډ+ EQM d]TB 'Ew|R \ wՃ AX L#@ P|JIeKPO~ ئ8ůqZt;s2\JАT)!ҹwrl sO,=e7t,;+~ ?- `(A į^xɩ @%'n~dʯO{d1 y 8F=;,\.N~Qq:M-fHk#Lh4"!{'g/2;IMj̙(^ģe1nz.r)Xꆛ/unM77zUK DO[\z D kS^ݞumN(1P/M}MAW;UEcS'X4v$@}]'0<,agVĜ;+(s~j44nw317O%=y {ҬOd&b̖9Qv%B*Y E- \FƲdn wڽ@_Xa \n_Mf{1vG0k n0!,Yja7cq18OE mBގ˂AQgaa ۡ'sZ8,䆇NX- >*dq"w7F 0\c5^Gr4#WL4+SY33jtoϬODı@³EAF,}4`TD+ҡ"|W&TjHOPsz R`u^'3QN#R+M)Fq]P#he1zRhe@WSn3WnmW<2[X5q ``䑁-Eߏ,- Ƒ,klB?F±vԒ+$a4vscܑNjY9бJ `rw`n/ 69L :qVwو$z;O@&4DaC."L/HбgO*qU6v7v͡( |)~"5+I `PV })`5v(\2Gpqb A+$aL ݸqL /#v Pi>#r[gm?RՏS:X"VŰaaSQ[!fholmֈD8-7״},5r5Y]lZ\cbW%۾41vRMñ)6y Ŧł9R#0- b|%_ v o^^UmlO/[Y7ʹZ+ʙϐZ0P"C1V5kIM]<zVYZMtɁV_~nxW7 =;dI?q%+!KGY#'/㦹/B/@/׸_^%8[t2 pD+\J0FV!8NWW+aETW8FjY$%i($R~&_p/\!0@$aӲ Ad$A$I6W !"d CЫ%>nHڒ ]Œ"A E"=2p \$IIg"}W0HV2 \$E~pp1RVO3c@og ݴ'Бd?ezБ^:t#ɑd#|:+:"q0`:C@ FVG*+@;Zvrʶ#lMPmnA?|^anikSJP !H.s$aPvPҕLr}5k`+J!"UC !pD^l~nԹZReD6u cC,c+pt@Ga^c@d d:bDCZ51[XmMVꢍ5ZIJ l0NV8H`TZБb)}MJ"zո/H@[Ae!k˯?F?q}#q8%v5_]{瞗| o="A?T_XN{Z3$~ ~YVz]aEUuF%;r\Ø' ZCH!$!jX[Έq`CԈ8 ƑJ{:|X6 Pl#F4C֠!6d*$` #%!6BpGq*L`*Z,QF1Gp'֜2nɮxn8Rhq!"Lqx6sMʃ79L[叉s0Kx v$@ /,wx `nj8BV,OR}*"Eї=ɴ1Cc ն_y7nD1 @}ʐ1! E]%M)QB9n,|<o) bQlp I7fyJow9U5B7nў cCA|caKZ%=aŻuNϑu# j;*F/)k9|1C.r0"N -B8Hr?1f΃t6|q71ђrZiV3x쓗&&%$`1"6dM Tn'Ik+0ulCaΙ露1Kh,# WK$6|tW硁txK7e<AH åa1\֡>p.\0qyp\>J8.Vvpeh'p?CgXCX}ў@Pa "[D`+g%4A;R{Wޱ_,nп.Mpb=V$^i6)[(n-vP2(d}As'_U2J%JO=W< B*CE'Š3aH+BO&HGadE§$S2i"([!) c%X"i8-:{0+}/!gV~VPTgkPD'W٬i8BJ,9'fPp7P(TU~:@HRǜd*7Z*[&*>5!'3q+Mjo8*pDU@jm48+M[›$> &ԪT^R U1jDӨ ۈbH@a\E!Xrݱk.aw0PU]V8$ZE]lGV'x:l*CNf*9q+6[ŖOUZ롪`s&] S(&e; ͆ %=Z2c"/q ׎؍r}cr9K`$ʯz"V}!ԗk '*# NQKD,s䱶_QV`2/oA_xw0q:>L4[CGQ.|dM/!S4&7()}V P+Z¢h8+6FA`/p0_+|y/n86 Ǔ euu7ҹ (a %=)?)zS@tW*覺S8)cS`#_$&0{}F19n2W/(1#ђR*)NA)E""IZ1PٸȈLU8#:̭MNF3]?+0?2HtVC|/NԈ0F:2ƈbD1fv ǡt2T_ U7'C;FDH@!|Jdp|`+>Hҗo#_ՂBLQgbuIG؃⃰=qzd8K豎+Vl0xc%=2@ Cc( 73IEp:h|p43vj|{{M{XM0ܢ78΀>2092 #Gִ cOtMCtC^%| vZBmJK'mGz8Fp U\tjP @8a9eZGri>p(SC['8\s$GJr fٶ[vGrk:I|cn+ʐdVq+.ߨ4{JM4nZ!B\A4H]`J$ی$} I&eMp@ܨ8!97l[ bF]HBb6 ._H[!H\Y4+zĮW[ڴ?J SzL+p$QkãQqTuRZan8C刾"O` ?|WÓ?<OG:ńgF"#U^U*΂/Ί.{1g3,OER[W~̲ ֋m/ I/YʬI26I+Rx,,W`x8{?^Hi">i Az0CzZtMӢc 6Ţn20LBx(*{OA`yb}҇y/BCF+n2ǑDzb"(bP?ҡۘ%$skov^̑9Q;IN$izb*:ljcSs8k2KMcH 2V, H\ ly2 G0Z9R8 ^{rtqvl&oюp\{0T(jy [*-x@ $W%nتȣ*mUr"z.{ &Ww2N`$&gS.Ms`0AWn!Xviڒg-A.Z x(sjrG hދ,d+1d q V}#ϓczE?OVg8 u? ͙2h_7Bv½G3u@d3Pwof d@)gf{&q խ@g뚁[bbBSbdƠ1(9uIfںQh3CfL@뙀VliqI6ۀv  (ňܽ h5lol@ !؀"&eB3%M:T .de{23efemqܪqW}O_"Giv6ʅ@] @[3ID"r7(o/%OA|lG(]ғʰD,|F+$bɇbc:1)ƄuQ}SBnZc_0-t"?$F9ijY}BtJ7pd 7YO*lGJ:lޖeצo ^`2.x|D/BKp){BH=Z>JĈ{gGE(wlTA땆- 5j6i(hܾ}RdrHC<l#AE:0xiŃ.C?6Ch~^UJډ+1_;2p*Gq7.V&z۱ڇvJɬOO_Vbe+X' \1@M(D5"pբՑoXwj`Lh|L,jţƳH= h\_j{Fhat %E qRƅ7lyyS_G⣼\{JtvmZQ✕Gr|cdac]~PMʒUE&=t'-*3;a'PՙZUڹ11="ҽ;OA,԰\Y\%sw)Ȧ{֚.N.\'{j(#iOF ~y 7p>!xR_&ib>K]M6X+^9jb_ΒFwhy_A SI ‚+YlrYpN#&nbT؆PiV,k_`Z*x@)CV`[  p?Z1|4jͽW]2+ Q|?z^;1el)S26IR6e_f#cȘa[i녆U'Cr0CrOHK$~ g:%63a'2Fcӣr,VEhڌ`.rK u]2#S]a*]iZÉ~[5 J;KK:STO$ODFQ\'{Xɟ0t;s1ENH)4z#&r_%iSZɠIj .))*qd@_%-Iȥb6ɥRih&.B/(%Bفk %yHRxR+^[*<=,5˶!+ \]O()'@Q2c1qmbڏR̠#Χws#Tie-ElX.`ݘ3M{ A8hyqo|`WIB4"zZXQѿk Rt'rU=QGLV1)E_v OL ,RgpC7wc|1*׼0y 5x7-w >RBri}}Xwξ8F:5|e sj =/E\Bً޿!obq:BYwcqߑg+jz4{R|:&o.ܱH:Kna>r>L9 EYdFTh.ڗ;YUZ8Ymh1 $Maw8th> Xd[$wxY[};}߽Pqﻺ x/=:.LizE#@l.)ZOm*ߧ%`QO?O{Mp(\35`8M7S;Gu'S'G{x$nj$%e;LJar)[0t#E(ze63NS;H;0ewt) <*ËFx!mgEG7LG\.&Đ\Llr,MHL'e\}DA?r /oIMXk'5yjE@ʪ.b?aGʇOެn`,qIN[}O=WoALp) [QHCrv"1Vp"i-iڢB:ڕ +^K m951s`{.P=/HhCX_/!61uYE ih+ w[`L;*ϻ;hܥu7C}tXyN <-HGAǢ m-\4"(/yl0bNh/F?Qsn:M!xTXL5a{@)9qsDF<&"١e2~ ЍWaر'Ziǣkxqw &wzZd'[40imT?D8Q@I>3>Hh)FQ!٣\}JVqp⊏^*'2O]aT` $ZMd_%KK|./f>n7)M3hZTccP>(Wf7unc_"hvtYd;Q]nvסk#ݮF/&ÁzRS Bɧ""RD܋|jCA*fũ寔>5J2u*X3Du6ݩzmّœ7 WbkxLNL!ޅtoqwS+9nFJ~]Y7TKiSMM07UcV[58  ˵-nz.%lVWMz!(g[^*ȞtA=Tw6vtjI){|]i˭57U?eae/$/A:4qUbъ9M&ܺ#Ġ#h'T>+Iou=Zȸh !pB4M-CMK PXZOXgO ^|q>͘[ͦEbun¼f:a9z#BȬmoskρ[-hk{C"pVE܌8`A+B ]xX?;Y7He 1897{uU쳩7Zͅ>*7~di|M12^ h6؁bd6BpKIp r'oA.@p[,—G 8.S9b6FŎ )갅Sl٤\JM&Z2 %<6$2N%P0-ʨѳJYXe(qW%7A ig?wHO܇CT.y6qn697\?ZXQZlfɑMc@F{Çu<;3Xw >^)_٥J2Nc(옭ψx?%tvꔑFi|:uD N N#Q`XY{k/:r"@=E]D:#)>~ϓ*g+DYjj28m,7p=ZD _B!pJvqJC>b=S۶pYepY]*0v nF_e]w;4S'6Yp^M~nvgfwL&&-FZ-3@Ç&-%t=8hoL3| LSVL&ͧ:'FmRķvdReat2n$nRz!ۏ4D* TZ,zƃ=Dx]m.^H28ɴezDb bJV\3voftRiwl/ |]!x*I8+Sp1l.NH8t7N7q!bଖMhQͅ >syHBU'(QZj1(Hy6W/$M֔WՈ},/EFA[ou +|P>xXJf]yU^G8f{Rg+j7ZQ4a#YKg+T+Hh]T&Rq'"01b)UWr*>x ( rǖ21VϠw;TkaVRDQL0prPFC+(,DLieA*-/ Z aЬ= Qpvgʋ*'"T?IRR- .NĪ"ݼ 5\D~hEB@05 J&\^f&nOHDO9sm/s*W1:|jΏN/ )` ?Bߡp: a ֍ 2c[cliUtJ*EFK5 RJEE}V>Z!%+L `c #WgZ:lɐ_J`̭198~aEۦmTum;QXNnpﻸ+lipdžԊcwh5Ezȏ̋n ` S!<;>pdѿ(Ā[`\8:BC g8-R=AH` 7|BZPU8F"9R)я=ZMl;!C ed-z:xk'*{"CHw/ *Zل2Uf5.-qTDh]w}3 +}?vΦO##^@t%R C*eiZ=pn. **! N(0{7 I9F F=xdN,ZpVhYVV (^K* By$1g<}1SJ|h-Ŀ|#YQq-ѷh}M*]o%j6UΈbk 55h GWG.5?EL2ssWjOG13tu ?]f h_dYl՘Eok-?>s-ŌXf<=>/epIChX $%:TOt&hL8͛4(2zT[͒]p⬣H| B[5N6B8eP]V}x:heweC[8:"D{koVoplH^q#+蛔V\U#GNbMX,45bMX,W5}mm"]$D[5p_QV-uaa720LE6*qx(ޖAD5u10̰ɪuמ2`T ;L U1z?>Ɋ)ͺ +V`zGiJ=+wy‹ =nsvOɐID[ ΙHQzn9 g37_8s!]+N|w Kj[mmR}5b:.=V*KJMƕr+1A0- z3H;615cWޣۭ"6OjW*]D7;0ӏ;žs Trӿё2%^ s}h 6W|<51 $G::gng*?k8GS~EjapEA~- j> gu\_]3U\lyMc4ZwZu@{C_{qXCp / /XT!րyTħm>NhF1%Q)à&X}CIspĹ^tf\޴1HEtq4&IVʴqPRlxNl?T==8nNPA5̐W#pя!,;{gS~.=,$8;.q>!"KOaR{};!(Z?uovg?~ GT5XV3{v>`c[`"swF]nbW,5w%a/Zʰ1~4YđPst9"-g_~]pl>H Zf¦ɸ E.^'^D};LfڮPMJ2VI]LUR.Vug:Qיx h Zq(:M>KSLVx *B$,o<&XE]x(՜80:Wɗ?5G-Йf_G5h6AXV?Bs0":T1sdȢåF?pIwGu.瘽\`ysf;GW6MN|bHA VӭFl#` qA)eE~#`}}aI$Pq[a ,D:v2xyz/gS:!;Vu^(6w#֪Q֪`+jDw1T7N@'U4R½'VrЃr`p~N{??/ܣ8ӋG6.Y#36s3AG 4A%u/=RR!WMT-TQ+VM(> Q$9]ٯr5?'?l\Ujڂ:h+Cp*ԨDK% aLg)\  $Kq!f4=^'R5/T)7, q|W?6^o|W?z¿} ?f$mU:xijD$;-JcmUR.~QUTUxn.WjUE#m8R}b2smˇZU  mV S* AwKl.;2ѯa$/Waxd7^ܠkۀA˕k: Us&>ܬ5]өV(ם*U&f(Vke׭VY°..VQna\(֛48Ĕ0 lE[vov;eaHQn* bT&0pӭIlh𯖝,d(yׁ rN!5ñ4j!^[5\:`oXMrʎ[vU;} H [vl׫McP+NrjeRS[&>;C.; T*UfRMnqͮlGԂVQz (Xڱpfj&*+NvzV1;4 :$<ۮ4IuFy7_1acw3.5V+8-bGFbF^Vh jS}hͺPw+Uh]6N a [h[U>8`;rO4^泽Wh?vv?F#+h?G(HGXf??k]#~v@! XQ("cU ~V`B9Vc$#XO(^RKz7fס*l5y2(uxDS3+;Aܚǟ)TkxR1ʈ 7l!>F-$N^3H ' qAh CZHMOOv|e (ĉV~5؉ؗ`'8Io]n ᭋ7;@Ɏ)t X"[C9ںNS:vLd;)ѴtњJ$fҡ@7p$d,ÏGgpJGB'aeV)0V\(rQL0)Zf@RTw/GS$#V )`:]fq6p` RXǎ,T` $I.AE DRgj=/Rvhjn!NY1#STEjoSNhLkE0)R=B,nd.CZ6O3 bY/V,=S$@{\{Jm;lfw5K~fX!=F89/s>j zr N*yc}BL9 NnơI8??4QEh"n2$58ȃF[\.#Q1cy#A1ᛢUC,;`wd1dpl0JM`~mv_K-e.K+Ộ]һǬHEtYtC!Cp\(.bnr .ix-d-Q&|f-wJFZ&8 bz]858F[Whfagj{ܪW$Iة7\Q[CaEZӠoj]b[kr1`-5QIîV%."hDh!$ʶ٪ Ŝz=_!F`1X` \Lު7Ңo5kZ3i2suX4!jCS½`1*Xm*uqRKڂ-QбuE+Ш6WU;bt*B•`̤[]ڂ5 4D[@7Z-[ Q[%jKӅ,DhPUl~o2=Z2vd/{xoXG_J)9|r 0b<-28=V\G h=&a A`_JfG Gxo}ORαa g"0#*B9VaǬF9c~{?JcѳjDbT}щ|a i"_r%tk;jvkv+lQq_4/x' bKb}/4yxMlAE:@W9k2? jZSݏ{-\k2t ]fg2L.+CL |7XdLTpDL Fq CyhDpLEBP78ݐ[Ρrd煡9|}0[$-x`FM&? ^ts7^Ƞt*ʋ>ǐa^0FB fk gEBmvX^@6ʍO9@,p=bDcK1ֳ =[D p<"~iA|L-yÆY+* 2K +/^P'azEbz cF G0a c:%=!Y 4_$K6̋t3C_%_&``[%l ?!LfDJIt~(C6bXhp1Ih1AU:ؕ:-g3kq]KZ8XlnܣˉZ>B\4bW1{VAox:b F{#/_Ko|f5e_ Bf&o!=8 "Jѷ%Kx)B"{l+y!! ^IEt1/>Z ܳ;^~U<0 UҩDm4-NoQNį e:#-zR3k7h GWGs~lFV~b:ܕb B᧋lr9"-?]W@vbQ&s&'h0NMj5KvucY~ o 8'FpjSa,?Ϣ8EK:]~hڥxEkâ<$O_s@>06<iuSK1n" XƓ. #`$z~s6$:=̀vLĘ<LT 0QmwD0D6QOv(ݥQehhd7XkЃG5"<G5|m`oFaܠMQk[F5rR?Pj2[xץlvkք^nKWo]u\+ sp  8&^DkO=9::YlQk ^/QH Y}brWE!EZll( UT:\KǠsEwd[?'Tu%{BjKٲkNqۜrRuj4 uIQgZufYmҰ9-1TJӨթ/k B*9n%BNˁb%hk#&OZu8 רZ$VQ4kṔwuĔjy@^v88BuD1s+zriʻ:w֠It6uҨKߚ]vq EW4 U `dmvM@U-eגXtEAgU~Vm 4z* F] 2 ajfj6$Qm2\ݰ]d;Jd>.xw:l HW}!Aam#KP=׭2-q\nm;U[B4h9&hwB(: ]-06]e-RiPwj:J: 5XOz% QO9ɵIB>. LwӪ9x C{gykׯ}UX"v5+ ? "~:Gm|:7>+-$ !d HU|jHd@{@r2 =|}ua ޼{:J/? ]knjevݏkep:\ep:\ep$: nCt8Ńo1Vf|T/BO&`E_b@@SClz1 -]pVעAad"1a4,LX_jwpIQ %.))$u?Xب ~G0eW9o?3&&+(#Ds6 {.qF>1 ӥ('u6&j? 2 d.Kӟ %h26P\+,=PT r4If"LN҄F\VCnlc%u Iψ hqc"–0f0;Xʭ`v Fc0 cX IƿHnx=8܋a/ۀ@<-^8և|mɱ`oD`/k[ră^Ƽk%7 y76 yF{}wS{$=e^p<̇ÁTAۭÛk00pHópku`]QM?I wcK.7 _ƄðVlriadoZ/;UJ8eǮ󷵲Ӣ0kj•-1֫8JUm}T;40vn XnTjlժKb(WdjV)76v0I\8rn|kb/E~MfM\u]f50L$jf ́FiTmZ l1fUZo˚h^R! Uh b%nؒJZMƀvRwECn6FYí[1^"rơOZ+P>jqc{ Nݕjs[ fZ.xlصsG[e,Z`$\5AG-q4:jiV%5M.'65b|@2;SW`5dLcn>8 r~9W$dc5[=~= %g,Y MpG 6} ~º{;Mah'zTo=1u<M1;6X(r6p|^POZјSπȳA5~Oƥ>KGeHMm&jHu~TZu~ԇb}e Lů _!SİNŠeLs߻ܻCT :p|x#݇_d 7ʗfWH8$ v8ݳm~|n#j5ۿO߇ݏ[5'\e?n%"< Ik\&Dž?vاqsHohn# h0zʈBKc?:f×6  $Ɂw];D%53K\-os`&8R05 X ] ٩In\r+1 %2Ws-wd\oZ*YB# ш5 Xŗb\ۗ:qol]S U.nYk[,doպCZOg<}7_Ar"`Lڎ8Ⱦl3蘲 {ݒ(+[uިJzK^$VdP2l"3 5V%F3* Yˡb/kUWV/j7ZT3rjJ)¿Q_F}ɜD}9:壾d~@/H+e&X,-jc ׻}z-9,4YS=Ov&cᰧwyrc̓ڳQI|,)ez4dqalO]~#E /%]ID^"K-,JsQUm-:5I[Q%\Bڅ/֡)ܩ+WKkEa9E용]݃:J4p7ȚE΄B02"fUD=zǚ(q3 ?\P>~Ԍg6[_ .D+DŽDx_ Ur^<JTp:&1Q1c|ټcLJUțzj$tKL 2`j_3{ Zkz&Lr\PLׄ6c4zzbGHG艣)B(GvD4,a:D;;*4x!ңEzTfe&^p} |(rO~U.^䐎P[p)}`ƭ`F`p]Q %{СaI(K%|1r!6pH/8ɩBqn5>"Wڪ$@h4T.^q?ۏ9?SpxVK*P8EM t:"|K9ڻ"Zg4hP5 &ЦgXѳЦrqxc0i@U7>GA}7oHET;->]e 5[fWh&:]L w`xHHC yuFGF*0'd0ip`b?,|NvaN^㑨)>DI{k/~wsa Tj^E~Iczq_h/ϵOl@-O?[D+<(r+ }Eo5dЂB}q5F)aV.9ص֢jTHqxpzqib`nb z  y5ZxKFq>툲uG+K GkwC8U zmty/Zzݠ's4&\&eczNGO d._Pm*;vv$/UBSsӷCvo!Ѿɉ-nb\vld: z2 4kȌN$W ;B6>v/R*H~wq#=绂N/Ǧn|KW)aѿ4n&t]Eފ".U6 ʂITk1fkM{J j<ˊ0ȡnƻco\ʺ{9 hVu?}Kc49&ƩJbfc,\ݧfQ>ֲ_+BUB^%ۘheN=iHuJ%x",$k zG-kQyFB,"Zy|Vh3- aJEbПAѰR @`DCnޡ&jZr%Thъ=^CM#፮>p jmWј1&,`zmlbpC=G<*KPP P05sO$8, 'V}~d=Ͽ_'V::8/z3[.Nٻ;f> D7ωEJ|/ Nۧ:Yڧ/H`%G 3ۤbA/4 hs-]]y4kߔ #饷yb=s^Smi1[b\% )h..[208sbuQ5gjtv>iS 7'; oyM'_Qk쥇}gDmdoH%klwd[m:mbFJ>7hQuw  )LaSx/9ZoBu/);A+VR8N߈;z'm1E !H>d5ToW{g?Ɏwn:zB/ƔY9T!Xٍ$ 2B*C|.@~JW|LQBX߀iPkӥPYJbqG' eCe iji u$T`,X̘Fm 'T SE돧fapiTjko3@9x6]DoV RڌVMgh`c2qBgQtZ„GIh"l[a j.ʂm'~QX3x~7^R F3`q]^$|$ĒIÎ t9kF0֯7J1%m 4́QaEnإڥews],ho&$+=%5E60W0ЉiQydFt7lʹVϖPҹPzWaXվf鈡$q2K|rbb#8t!п+̡ Km ›?ZXOמs")ҡ]^)֡ Xٰ!bs2} a2zEVeQ[{wW!俞q±CyDzh>M·/DC<۲:3K1c]Ald0> QNE:Hg88(xCjk0SXۓ?S?Bhq>`NqM?j^-;xozFf[u( kI֘UlL!4?(_U0~<>X/A<'%YNb鋗9!*s&'0z;g0z0zkpMDYӊ~1zUp,P~k{y}2_#~_YzG@K5S Y_JqbZ`:fKYL}H@g]]<(oX* P7Y(;r׍Kuad?E.}ᡙ xu\2/^1\z: mb3W]· w/ ٍd4] xh )H omC sE0Ha\o(@*86XXww߉x5ת1{^g+P҇#$ev:"WEN&|*r\KX9hKm3gBsؤ4YkP7wjno'_PF2g Y l>(fVW&g\OYҐZ#{77I)02w4{$a @Zr[{eV#?EƷ(pn |9|˝odd3yь=Bl eæ̿7;X+DFy@fXa5̧k^7KUkw}ϢHhh>.3gF~RK\qS F$1b=-y˟aި7Y n o" Ax]fQHo/7QQśEL m'Noe3)DѪTm{㶡ENOY`׃؁Ją>#@$؇0HR/\_+XvO-D?Um ~ua~O'jE! |n/Űwk@' ޞſAYlf-nP;䗼ckE *|ȭq6PXX%R{p=Kd9XǧrSX Coò1Gaox]"Qaņ,Y{m`,7y^Ek-?>sdx-żX@DZM~/k]FCj6㑰) R^ ! r|UUbg,U`ã/OjJ„C"r:&,Rgec71d>Vj ኱9ee jhgu}3usҎk Fc><> dc3Yb.>{00kpCz 7+G͡'tP='D=zнN?Ax $y>Eѫ<|2fg>σY9$5|ߏ: 'ט(u1UBWB3pʉ{x9kچ,w\֑FhIdB URu$jIrbۂ$w~&$^gu.x#yYYP07j{NkF2 :ˠ2eHݤ=@,ݼݐG^7$3FRóLosB%t8.pˑp³y\qӻQsWN)^Xgz`!#tW 8~Y Eϥ) iO;~3 ]"/ 4 cUYQhj+kD"AOע ;WǚnE!^PQT_p9ZiY9n_1}h]4/ _ 87=$y'v܃C\:xNQ0n}|hf>j0pcyW|_Nvj>^q_:_/Jrb(H]]`q5;S ̧k>]Q]:r|x`^ڴkTׁ+&bpdz@Oмxѫ"0Pe|s ñM&dE~Iܯ|'cŽzʀc<1͸䖿ˢHm(z%=>Xחe~}¯z>gD+H !ath9 uv=d~ {2и 4$MҨV#iTf60}0@ :1%һI49]|qUFd] n.zvqܹ K:=4bF+VwGN,k:7NZkn}Ry7pAqڟ& ή0V PdGesz#;?,2<&XV].1RVnLWic +Gq` [: so0>-Rib; aM&ϫm!KqF,Zul?-@:g9].}*bC̷R8/.mKP3#yy*̀MUa f]nS4]|QȽ8$kCg2Κ/AppP'4-*Ξ9|?4v.C=w`%ݴ=2d~~\?/{e<3OG&9^Iq^?O_` paCl={q,83󕐪fFrxX B:α\'| wp sdn![H,L,LGfȱlZ&fEˏEˏ7oq Wn;Ȁb?~ <\OL0Yb èx{Ocn]?#T"=T ooZC2?0VY.TRc t`ixffPh:ˬ}5cZ^ؖ'g^~v9}qwkǁ{06. [ϊ`Xz2i1>n5Kvh>w$s]}(S,܅ߦ7WY;YÇ8y5w.- e\dİ46>qQP@W^8pH5 OcFfN4|GV W߿[P:Fw J_7_-$|gގ'\~?aI?7Q`|f2|h&C@_Eje:VΡ[?mĺs=D[Xh{ULC?`Ӆ7v4lpSSowڛ crvrvl-g^:7Gwt#ޞ(?#ĽrAPXgxXg ~~,g7VypY|o^}JylF߄%MwswY~1oYװ{وq_L?7w7SߖmzDC2.6 |}9UnvCFZx&prV{|ZOOѠ׾{"}?zNF֬;[-j[܊Z Zj;6VZZ $ʲ]H2r}L~)>O^zh5K۟'ЛzA)So["`6#a%]: )|*wf}3mpyb^tve#U{5U0pa% h22̮&cdh¡OP7KBuեd)-K貂*ěV Op'm'D@Y0(?U0J֒1 Z}l)l@'۪NS<S= BA Cg~op{CP ,t6U`̦xgy2S#ܾaI0>R$ooӤasUU^zL U8135r` t8F0H{8E'鰞~z`XhMO}(ʧZyKoCtyTq^&,Zg XCQJ]所.HwR;2(ٖ'por-6C65c]IdɳU Sz1tF `HH0P#$1ii{;u5:JjB` *:Ep̫\3 &~O4X01G sIbXHe+FA)& --UW {xjhx{J ,Q 򻾻RgĵC /(r$[.}>Bi}y'L2_U|x':)6!e.)T'U64YsO}IiLB' ΌVt08D⏕j@QC.hxu$h-3p^qInD$e U|>\m=Roou-LeJsp !jצvrroіipB5`NCbheTy'~|oŰԻMdophyxJ%i ;\+5;bCyoLN渭ƂdS:**VRi]Mp]tF VQwDjZ!c)Ѯ-K,H7wEnOWu$iku6 x>-JT)5rGDづzT >3 .(,D*AQH4<70*wZGóAFRm 4y;x 'Wtͱ_8;,ac|b:5oNAǰźn9,7ܨlh{0+Qq%ox[X3 qpھdVN /tr||zO*v'mI~xw*a4d,%/ĊFXIV>z= H !2&Ǩ|#n:)1>b<ӽAI W0 8H' t6Ρ&:!N~뻹鰳;$ j܆xp`F=Á`~P%ARxt?ʛ,&aFĚxXQFL >ܲ?f->? dÅMPxmuED$$E?Hɮ hIЀ@craؓ ]ޡV&C%su>`BG TEW : xX['ES}? A6`g`Cɍn#Z o/Z6~Ԇ}cKl ѢgۿVz϶6O0tтi")!aܜM~4rKvoFќ{??d 'Sd /Tw|yTx]|V]RK-+>F5A.?2e,@D9x)ٵJ.cS {\mIoOcsMF!݈gRQ>NWA{{i,H }>( I/ whp_W S!_\,Sl*LRm/Gy{?$! 9ny)ix BEC,sK.:1-z4;Xtއ[]%lVT*] ldqb_/H65醨6BTFfR"#P"ui&%~#gW^(O0ļzIRG4Ol ii<}7rk6-JӒD0 Yg:&XJx2nG7bEZz/K峢T*AI̐CJZ˸7rIn1絾4^ף?L[^y2ϟ Dwvu>~ai8 S+GW~U>(eb` ]Ё9>wr~`w⓴.P"Y')K鋴I~.KU^'$N -:q pTk ֈ!K5$e)~Z[^rBJUn0'Vj2p %M)*$09R3[HP9/attezRfݨ͏DzDyYC<)a:۵jia9X7Cti?t9'3V<HX`P&豹G=c 7?qO8:Z4%VXÏ\yWֱ$ g'i]:GÁg(\2w:—RU=;t;ƣ~T_+£vIQ.H-5џ 0ޥGl1>R>(W2rQxziJRARاGL#4 9pMts'?a|Iat8oӔ.ߍ@/k`:]JҊiU U҇J_^+0pW\uĢ$8K"z9!p8ў ^ٔN/1bEscnW5WuSzfUW3y̦yc|1o !o؏EE!⪾m˯ 6Á]՗ (0 M#5Eq9"Xqw Z0w =Hh4kob5AP98Hl0k&R >CF"i x#b -X&*utAmr7T×4,c〴گ͘wp.8kCz<WL#*adS%U45 ŌB;bÂb䣊ǭ\| TZB>/2l17_p=4yc&C:@DkM$Q"o>?*䞕!J>\?qe")BX$z35^^Q ' Nσb2  -U1h?j8y=1~Q-z*,V*,T$3j*Lnp;)=)<['E(u& .e'EmZC6t9>@?;1ZA|ތ\)vgzq*"i$ BQh|Ӕ>ӥB<:yhxyrZΏN Z0,Z.HHB -b$^,~3dQ:G=|:/D=Kk&L_}K)!bֈ<i݌GFx$!\tx$s;ԣbK[7[F[J+u'Jkv&? W;$?K)wg⬩ZX up-8 aHzQ?*\o.1LYOzk@*hMgE:C-z#҇BRtz*lI;B܃byebgd't|徂MD:㫞Ek؂{"i|qQF{.|T,r|;|ϓ<>ꍏ_5| pо2$Ox_qo_YOX5Dsd+E{Erjr-4 㚳]0SLOgsbykon,@)d/"ͨb u Z#Pn3nnk* d(tXH$+[!ƫ*-cJ ;J@9!^\P&ˢhؼQ=ZkDEA*Ex |)dzM D||ѓFhwN{%m'p`9W}pOHbb ӱc?k-9'̚aIہwK;D&yT%d-ǩ>ɯmm4PX֔8 g6V*v>({>{}i/WZEtr^h$*%& kAӇt4X#BV$;&髥#@ԑyN̑ 7 !6Ix`f4RpQK>|>;}փP*n>k@}QR%.J`EEQw57G a[w;D Y< kf "?y-3\kEBCH?+MfWKZRHQg"}?7ty[q ܧWċ& n* Eܾ tAi}pE7`#7[{(S/hyjW-`.nqv yt41IiYGv#;ޣ#knoFx[/eW$})3|ݣ+{d):\#ןafn77x0D]mJ4ѥi~*36 {VM׻ވ-R4; L0TYBHʆ鑳ZE1S(ú"-0+Ξ2\P1(`]"}){8MѣJrXHeI >5ᘵ+$鶄^/ cqV"@\Xѓmň

~ǥ#:62#,1lL#1n_g?0.N驪1a <| e7ņ.Ƈ1c0_ >p5'ndTQ}Z9$aGhi| P(ZgG/gG=+ٴFQ8_BM갎)z؀CF!GiD^!vcq(4W dJk*;fy1DH*M0Ok}}piAN@gm+9}@ASc0 kDtl?Wk0]r!M|iNu_10xaO| vH-`sR-Ejs#ҰQ\Wcxi)ty_h2FkԢ// w7.tN#{Xr)؟x(4#w ӰǦN4A4ƜٛLJy B`ww0ݽ P27&_1 eP>8p7g}L|%'HSB2?)unmpǐCgPXy-R1`hs@/q't]qL$l)S/C|FҚL1G\6aNaj?]!EЦ+.u/Weoh\@1U+,P*ZWJjA\zz)܋̈Ѕy'B3%4`yyC5|SrI̍Az88$XTJq=lB)2úЖGC:,/b8>0i7P 0# ܃FöI#=ҟyf!4@I j8cT%e/. I8! [»|Y@~?y3TXSʰKF6O]:ֻ̾b )^R˂rIL]J ?"F/-ϵ Z7kԓH E'Rczb0G0E+(p(juE-8>~Cr.4eׁQ9 4C&at /HLEY) 0R "Zc_ pfdv^TU҇Ulx4 O&/1RŤyhᅋpxg6Δ 4F-*F),. WkXx<B[aTTZbyС,~S>^g @cSW'-;_@FLޖ-ilv1լ4\GES_ht{ 1iww%df~I}NMxX G,`_"(+v }/#r=6*?ʒNz5-"lVRf^ǏQ#fWq_?vy?yQ$Pt3͋N(;~yx%-]PB{ &1e)3÷1!O{[tUvW8.`ԁ^b/2 t.Y?$)SnWb{槿h<ݴW 9ٽۺ#DR ֧ m5,0!ϜZU&꣐8`|zW;x);Zy=$PC'z{=_} }xy-~~DzೂCb{y;a Q-noIW+kl?*'pO+ehDy6|jT,488qWNls2>Z}-y:?R 9z,E q4b<FʧG*=fIcMz5[[<{MP=v$Uu<ޟw+}7b}m @Nc0vW?gacN0bHڽÿ5Hڒ` t̰U*JSWM+s62BZbÜ-\}l?}_[THes3uR1B\2~U{k57lH!-15GEd-{f--]VWKߖ#6Q6k~{ا4N&ta H/XbvE~bc,1K4҆/(SY[e>['xpUSMsLym\4OG l< _OmBt>E*U7kj@c#聭 /8~l'ױ_g'-x~xn΃>88>?Ƚ.i硰u"қا\`[xaGE4[vA$`2L.]w j~ Ȑ|9)јH)1#xHQ'B0H0C Ї5IxJ% Ď^.2JDs'4~ Y73 1vi mq g$kA&b ] aIfQtP 0H!"Avs\7#ǒ_O|ghyP-f|WTAegk)Iu.e~c=H?K[)i[(VbUw z*Yb,J%xlAmUIR*7+Ԋr)(.8H2]"G;ja흿R nl*J F[&)ceskk7I,lߩ܍{ |'3>{}G{dig\^ _tnxǘs&H 0 D؋tf?饤g(؝Mx#' Jb-!)#g?7?s>pvyTZz7Ӈ ?}?a#O crGKk ʽv2)weYA (,vQhI&sVr&;z1Wd~3<:e:ehŤY  9KUn08R獲23f/\~ރVl̽F89jD7/{DNˡ:B2_\={_8/Z]%0}/;cĢh^ zIh{f=}5ДQY7 _xI$ *oW?/rjEaVI|!ϺY4=k=yRnx!R0ڰpZ50jfDžhkDֺ Fnt_FDИ`)9+pas&9c~yՇ BmodjB] *F@WPN1P`9Mr菊z jCz/ F[##iӿQC>0B4VÑ/՞R|!U1N]YMIi9}ޞsib V0E GrNca6}&K23f[wurv ϓm'2|#9S`uK*}~AKZjit fK'qHe١O"E= t&Q0^.nC(,qر6 ڄoX j;k^ 0 s1#н7TJbn16jtwӞ~[Ebȉ>X{ņQ8TOandOANq\) ջC|p'P=ltLC#|p#o~U.*2n`%ဍO=B 9|:|Ei߶JŊc"YdrO&'7TrʩBአp&6aI8rףTtaxzTu/%6ly'h(޵V;52Xc#-c3a!z^g*.UTDA ܽ\BQ|,y'NVk۲D >F1qș6E*OzO}{܏d!35} Q# (fDCY!r%=-eL̳v?{͍Zh>eSK_mY-q$l"59Y;PIyZЈXuxH[#Z:\E\ЮBO鶤7UHP[}HdFV"yQF_=rvJqQBm5Ӹl›L ][T*;!t9IAL9#u;%ƕ$drVTEg KfG!Ym^l5 kb/&qbOӼw|3LJ#(*26(9U/ xߟLLK&‰UGj㩁Uڳ^׾e.Q.Zl=L26׎BáDLYZƒ7F&z\o#T:9ychvi_rZbútӛM ;{ڴPٱMGh9%s=Vra!5O&7=;qt"2Z]$ׅ(~80NoqϊuUf*c4" |ɣr|neX̜(ۥH,F2M#/AW; 9~%BLG}Z9 %zI'94F4:L( kv( n>d3ÚFqlkv1?\DXtrN5#φE ?j,s(H2dzv/Z2g>bH )9BCLĮdؘJ2|Ym u:ܴ|5N2?\uj%kğ%|t=FF)ltq$O2FI^J"Rh̓VH4u ["R͗*"EsnG9~[yOFe=sArGxRhQV?{MgC~(x4@\Gh$7Bp0 B7cn*un{ I>-#Z">r[Dh3'"l/K0 ~lmFNӲ1M;lJwp6"RnvWE0|#/;7Rlp0В0؃;jA;gXro PGpXvX*ͣI<RYpƄPvrLW+zPs4c.L֨]([o QLw o[ o WX&ɵ)`0X{Lx"RtP߿T}bZ&DhO C9+ńX &D# RT*:ΪTNxgӂDl"iu4)YOHUȇhM d^Y!%5O؎rfoɢд 451hmjdA(3'"?dYK|!qh~F^ +7pXߙ2mhݬ+*<%a8'np(l >jIFTM^wƖ3ܟ迬(H>h'L&4qsjl88*/DKc*o *-SU&> I+d ? '׎;W & 75=C\FB"ČDC"E!$c]_7ή^.0J%Z-Ķ4а*:OP yxv^ ub!j@;fA+JECNIAp̙)E=nwTL/ *mw *'\r\r^Q~=բygJH![,oԷvgG;UuqB5_wgSzN;ǿ=:oBYFrnc2"c-MIh67-b􀡋є#F愁}I"BskBuƮbW_wQ%^>_#Av $sIo cލ,vrTb;rFN u{2(k=Z5k>oe?Pπm(l;j[m¶>VOQU0I`D_EttF$]ch*"J3vQ>Y) db0ϳFmf3#Ioox N0 OJ/^#4Oz魅!A=e}\8eܟN{"r#Nw^Hb/BIr=ˈ%qPC׈FD}!DT93Qc;j `HBtZ爱"OcA'}F iH#~'SQ^gglI\Cv/1aF2{=j1_Cq``p__ӽ5Cۙ$4Z!nYZfE0uG3!ḧPqoQH7[эxy Gɐ&Qt$8A4$3JoTj-Phkɯ#uQ$u!9P$W"< De0$=|$B\ @2}KGO7Z<2'\1=?jHKĢN:>M,KtEܻAb 59=!=w=D}%7E¦uP||?svHuV/0WЋA.uͼ 9tLͼ 3=F\e/.;|NL/#: -OshC<.iRCՅt`g09^.KTrpESObzSJY')Sq6%% ;g4T/٣~RyRIE\,&MqM0S˔-Ge>k>N FCatbzѩ9k`N?Y#P5%JgiSww,/v[ۛۻ:zgeMͰCyV;;R$?gqs\Vwam Vu{sR*SݬnT˻\=2 mխfIJ(Т|a)-m]`oG@$])mJT"- RqtßKZBU@5ßXUުnV cWdebz$X)n3"D,r{G[Vy^73ՊЬBW͢ݭ,A1XOd2Hꉈ5"_Q/ 3vi3Y?_zy7ӣQl/2ЁtO5<Ã_<[ٌoX?ix^>efw?fnSx=Э996bˈXXm@j)6;|75ٵヺ >ƿq؟6BМZ˼ta5ۂ9vHblJ[Xỳ4q \`wJX1.LJ"a 5QxwCqEn3#LGo~rax<2p!H⹱kێ2G:\F~Q#30? !3^h9ܣȈm(_90{', .=O*;YlP8bfZbu1l_>hyXqQ/zX-ufnkWJ vwǎŸvs86YÌp*No4:JTZ;e)k/uUDn?^ 5XA8˜Wn4:=` .^Xk[DIcEEB7Ҳ$7j`>~2@K`ډ&Udvr 2(8!;6@}SEG\p@.@0gmxɗS߆XB&0f-DZ9a ƾz͐Ci<~!M Awd¯-EO}]oqn<-1T%=$WU`)PXrZ9iA = N`G4U όN3S|5)VMtn5RoְcGM]Gf mnz\̮ *+rRJҫYt7FH!(pֽ|:}NQq4Sk(-;Pl*SK_>OԻ)uc4 (?e,MY%'ɀIˡ -9 'QOAT+@^4u>nj0vCgCxnBȜOU:ãYpܰYR(P $ƹ5Vy7Ƈy.h7wZ=΍-wBGSKO~ܿԎkmsCcz͝_l0$,OF YQYc* >#9+`=իFoL $%qn2% Y wQO4Ü.9;pxJs"uhD$:i$Hr˨V.N(2!+9O)(VLξ5;GV#gOhSǧ=:;SҐ܏npg(Ba+İ9]n؜^ND)2(qqvdo827W8lp?f671i'T/5ЛNw1U.-1 w. 9AX{]?x@U0_5ŹoZZxzF4..#܍ u'ެmc2\zts+C su%k]p((1JZq~1~(JI"Cߥ:º~nyޭR *t#}u}Oo.]2kĵoе\jC6^gsc(EbzQ, |AgDzf}Krp0H9 []@Kԉ&J0ZK]tz*OTrKꀾ}~OPvYNM~2~P1v 7^5֪Fܹk 4cHԖY qXl.0#:_UE 뷃қj1ͲAs1c^ t:)fV@ 5?Q&s u3L_=`QrT.ƀRd I2פ q]gLﱮ(."U&ҹ"$c6GASi!QDocѠ3=-L#tmJ^#^ઓ(^Y1S We4G>+vZ+ lwasxhV)\T*IZlc(aWC#2@uD"[08йv=l" u6ӫT-2!$"*M@V?6P>I3I~hH1ѵƟ [JF9<ϙڄn1f)Hl-aԌNxrpɫUIغ+H<[F `̹Jkқj~/X..s{IǠ.  STt1Y͔n/KŠ Gy+ʊ -1È`]4B[5@ I#x0x3wп-7("?.޶*ʈjʘŷ5V})ClѢg񋌟`(I (Fׄ '5E!~ķ8"g&=^.X ELbCj95*+IBKmƫ#{sxٰ;Z 9 tP{ zM\=/>G_1$ g ˣ+`z@iƎ"Eǐ 3enqCbӔOg./~L3b_ijQgDV#ya ִ?B` $>j<\8{SHQYQ} X@8K³OO [ L;xwnגi^qF: nX,VZdIqbB1(Pxs^I:8@sf}w|vp7( rF^ɷI$*Okhk`Ŵ 7'&bFgIӢot"fYG屭3Zd}BD}`?ښ&mt+|kn#Xx,`V{ op4$ӤBYyh9x]@d^LnA3)bF}c$XhX* 3cy3wfߝ C\>2N?s88>?Ƚ.Ng(/wTZs_?-ӥN6O7&*uW7DU/ph%*zDKPM#y:HaB eW+!8Ԑ EK{﭂ҴW*W fBPRT}~ ƽ_ |w_>{CiIdnig\Z>ο&c۹ǿ{ܲPG=f.~{K 8 {-xI Փ_Yk@Xˤm|@skZp_*/Y,oEl˓/|f<⤇_qcYbC]~Ү0zkCAxsI/QCgJ 9FgT -X aLO7Z 7s/ny`81&@ޠ ƷїP^2<QHTg߰?j)v534%S?TC<k3y4l'0 q$bsÃv܉v;_usD[1Fiq?yn% $f PziVdDX&~_$)]KHawTuki$RH@ }+<F@T h5y$6Ֆӡ=:G{nBKeMW0[+ QYKx1f=vL*q Jޮ F2 eY@>^98;-( g?m]zM-r?qn< k{.|>%HnG 3B$N'Uf5-juY.xUz`~& tx-In"[^>jӱ/74GYHFWV { B;X8ܯ-rJ0q(QB*60x&H*{+lhQZ-ck)L&ٌbPJYΥ9-'Q ߚ dY\xRņJ&C qC*nhxP.8:>. r|ޑ #k=G7QOӻǑKrJw@ ;Bn(% gpUMrmpۡN\HD :uu[ѩSW:uU`RаKeNARүY+fdgm(:z,Jy(x+h. xf+b^ƣp5Q0+Bq3Uzuֶ~y]k| u7ΗmОZZ3\jKցb|(;8;N w}QLWڰ#{3u1zdc##Aᘩj[DeMBm.ۆیϚgl4W%PJt NHיa*7&t Bs23{>14ZC(h^21lieZXo¨Lafr)1r/֩!bmbVEϢ^'VҘf J.ac7j&5q Zaq v8\D~c ݨ@(DOwAh ^hAE)|5,s-Y[jצY{7Z;4kȯ9I1Q(l#< dM˖ngȧHE|\XF?IIY6!)l>P!`'R, /P["BkA?}#Jŏ@t7@_4e-G8P"$JgT|"Xi$*h ې$}Q KYY`[l(2Q?mFTv}t*1j4rӭfa 1;5!^k]9kB5 GܲsВ'A*@o2?)7U8˒u-E]f(rS90h 6R%*G#4?SJ!!>As".u L^+ƻ @Zk= ˞e7R·/øbG*T08w)g MA©+%us!$ÍzJ_3h5׾6|B}!Y߶p"Da @&05s L}!E`ΰ89w)?5Ol:mE?-g"_L.\/~5 G0 Ah Wĺ73c7)k&h294wbe%wd8dg(#:}OyVQqxCy Q;=¬ZG+6|^=nGle.L]@ =QP@/SWvU;; 5ȅYB89V->4G1tR0`J#ب;yw=-?`0 -E ӧ\?-aY/8géAƫa4Fg 7QtElEHS 4XEb֯|aRZFkxy.Wv).otۦ9u5[UH{^@8^K~-uJXQkpAp!Z~)88b]*R$Hws3ClKn6 {!:rߓ6]s#IIcBq(d3%.6 Q%^۪~LvtL(Da:'pT9 -:`)hBH[pR/.WqP# !,bñZ{D҈p*)gQN4eH!cֿ=}HE&L rRB앟#Q=1g1%_Ǹ^Q=ѱ>e۵wB7vbd4#M8MqQBuߵWYQ9̈́;YbG}ƿPw񏵆G^Y7ߗxyVo _;0fm,V.m>Ah~60Jـkۀ?mkmkmkmkxE{/y\َKk|߽Gn4M>=qX:$:bm+vlV?21g=/2h7ϰoԑJtQuX"ƚ_+VCOTb/̅]-$1ՓYkx c90m`E AfXɌZ*7v޽lE  >|Q0yL92674x8} -%p4I-SpN ;;g A j f==|'FfhșQ ]"6nlbnf>9B3"]t:?UŞm7ڛ8M>=ua%pvw{ ']Ӂ_$,>W9_7'xt ۋ\htWF [< tPc0( {2e _H(T lku*|`ҷ~b้|l!! *nWV›~_)x׈>0I?#Ql0.F9= eLL Fh%-p+N.ǔnq,qrG)ln4$%7g%ywS>zR]m0xRF_z19:s 6=&yx䵓tnDZ_afޝ#dYd{dsd@# O:`4蜸ԏW3B%K !xW;jArj!a&ML'Mi82d Gbg*p'udov'-G.Jm?eQLzW7 `'@>/!&V5T B񡌳B^ N3t"L7 +j(?uB}OgN'&ΰh uV} [Q?=(B6]DSs}Z(q<9c3`EMNҶ;i'>9bOH$-d1~)Sh DQaNj%9p.Qpro<_{q^B~8ah6(Гe3R\RFrv q'R<nSX|$ü}N|s"\ZUIʙ'ɄQ{%&EgZ \Je}I~f*'љ8@>gvA__Y~miVwBJD\P3]ʕ`AS+M%J%.ϔ (҃9WvtQg8;yuf2=L #=La*/=JN, @7ę3~ύ?Ο1Yeuyq@q#j0'Ciw#.cii{7݊3rEvЬC':ya <@H k<͏7dP8 5G.%\&páޙ4т?YD(z:N* 01ʒޑhp3ɉ-ޣyhGԴN1u!ý(&셡=7=ʇș3Oh[_&9FD5~@\bdu"oq)1Ba" rC}P|՞_/ ?jyX(0~(g:Sa}LH0T%jqUy}½v_g̫FZd>}s6emW׷a $<{yWW;0B[f7cMfjXP9Y?65;hgAY΀<=X0 |B8!i_lex{tZ@c𪋜X2!kZ\\? 5;N(,Li Ç )vAgY.w-w!arNy8Y#@# Y0]O.8+Όs<i*jV@ eP+ +S@ uy`h'F7 ύIP {/ oĤ-_  є\K,bc6 d T2r4~˖|T2e@O6kTZZ*j%t)Z+~@rrG %]' (s|vU,/,0$raq:nnk~NzөKCc!b7_O{$ nmV(4A[/Om+v-EuNg3/a GlJO)A- G[a_lϒk0/@gLnLuymd`Ln;Sڢ.t8WJc-~/&JCU({_T~˟~sf{.P%hfwWdiJ,"$/ˋ4Ղ̤_n,e3禗C*ڗEɪN,..kT*L9Oa T2e EeE`XVK;Y[۠[kޔѯ_{E/^\.noE+5KOcThN ` NmDRd^+} Sȋ iK4'CH4sI@o?Cсb`ʝb 2؋:&t LD$t{1A^#gV#tߣaNb#:8SqoD}uH= kO'N8A$b @6RT`?Z؏c nҮFIX 6<%1/=~{agL% OM` tb(='LPaiسnʪm*^vZ'$N + 𕤐'U'Pm P# B {1P]  0aGkƍPPN-THr*1CF$1s# S/@/`n )t%BP GM }m`#0nd`̦!L@ۇ?HB(d?NI2e1X@$e8%SvgӐ4LGߎ}s%|O @ )0S-5USz yM. D TnHOɩʅ1||>+ڑE4#8<|H8>g_L 3ޛG*'{.{Ƚܫ|Ƚdr=gϥ SX>`}OK.t|Nm^4[l$.Xz/F$+#Ľjz'Cv`(8wBz$z^ #/5#2V;/=D(r΄o >D iVYT$cw/vA.TOV@{撞`Qѽ؈* BTD^5 :DKqſ W`ZF>ѯFWF_'|F9A9{d;FӯcԐ3˂>Fr!PhY%),_|S~S#&̨N%E#wnG9B{2)G >S{,qjMfҾ\^ڗ&Ы\u[<"TihsLQ眎i8qhe tǩYۼC^ٴG?`7LFt킿^C>O纁,vBNr qfA C':>vzJ|S.w[x^0a8 qgv GoJ0Cc4=S.7(BsO|`>g78M*n򂪴wny_V.WJDs*51KB1 G;o@8hv?}A7)n E28HE!8ؗ }љ<:O˯*?K^vn4|?Nz P8Mtf Q1QlĻhB+T  l \ ,{7f10>%]PBdD2V@9'V@ߢ[~֢?/}S-V/\R\>5_xjAhJ(jG b@( cK;,ˣg<& [y: ky2ᗵ}dPb/x.—yJr4ѢHc}yޢޢ&j`>v䂋]А^_x$tZIYV UOA,y-i~~gFpj#*`Dg$=D̚eM6amu$Y6p6m0 FZnΤGb\k\F֠ L,N} "TܖKUwݠj̭uO] Fɋ4קR*fBk>Fu+Jא{V{8Ukߕu[V bndRXg2/oy4W=*@xI2u7euX0NZ9D)K%^{t6_6/tSx.$.r,1,.oE z]Bذ=QYC" 4]Rm,?C˲X. a5D^.`b0=;"HȂ'>|[W "qtZޅ@Mk-Bz cB?[/v%۬#ˎVM x>sHABY_^}Wד_/|W*ru}/߇}m\' +ʐmϡAHayzDV׏Gᬝ?w2t%:2GFNICh:KXݫzHCՇS1n\P?=~ qN]Ñ0"0|QqC~ N<]q~1ccQ{Yո\Wu]P;.(?ڮVl^R)3i#sD]9!1M,r`oE>+QsRk3tvN2nMW/8]s$ٙ0򰇶kl >!oB`p,#Kad>2 ݿ:[a\,o+V/2t0L=w ?{_D7I+om9 Po`q$3^`E yh.' y@θAoSXOf35|ut&W}x37 G@kNMB3moA]Xyy^vyfl͘Ȩ^w~X#'s׮Momo1Cclһ{G |wy& Ӊg-UIH81hoWW4#9-fXF^2g UQLgH^ORO_|\{c;8ܝvwm7T>V:h"\dE}G;EN?!$6hߢ p4Bзb0'“aK)!s6ӹ;Dy ;CE G70_jgg F4C=S[r1W6\6q\ډ+3hfOD g˨2}Voy^eɩȠ!PV,2KHl04erRٵüs/6 8:-oG7GVG 1: S=DU~D!dq3g y5!B&…*IX8Dr XTeb͈qd0Ц7ry͇ QP'J099\(*>U|mٴ9h9hv^<\dvxʧvEzE e@ uc8FҶ lmz45BlS`0[d|aY6XV_j6IIlZV(T:z}֬V7\'`h_%mֺ?36ǝ>bF9L[, FZ;3G5 1d8=ڧ7ExV=[=Bg:txׅJbR3F!G p2|)v8ݣYRi:m>J/<8E3&{5ͽse6#eB3MgB^ЯD}衁賹4Re |B 5oMGsЖ&oYBѺ$GL4#>.hG{=ݺ߾֙MykV֢MQ#Y/;Zj'LK:4Hŕ|`-[}ws@ܼo/"l1IPܲ:Wзm=%$VK{ b^rh_$71x* mۜ4FRy)B*<ҐP[ku*:GmkAŰP0#4tJQ+)ˑIĦh8Ј 1<\XL1Frqf66EL6HDwp4K#pQj/2u+l+=mLNanܱM]\'tgrxt&g &D>^M^=y*[F8->Wm;\tcÍ B]R,?xiWx\&ٖO/=Z_qtqFDFǫ&[Zrn-۪sIqWgVwjY guԶWĕBǠМۥP2&!&zZ92{eQEiueR[ڵjQ$P+8SԮ;Dl>.܋ȑ;Y)]>rV#gH_%7/v9-sUôm= )O# }>$UßD;˚{AlCQs72GAVE-V"0Ro5<Hs6䮂9Qy(Тcǃş/V!ޭi9:Mc7tx0]p zQJ>q64K{/'@ ܚ & fCr =L;MU‡C ;ɇ"~0,9ԭOno>l(ׅ_'7[p|2 ]>+Z2,6|MAFDW Y0 E}1ReP{%WYkE39ɨjFrAxӖJیAЎbrdUZxY\5:cl4u698 b EB!A GBmZQBp A:"jzEMmc aoa&I{fxowYkd[A&zXG]K;q-t;#kj'8Q;aXE,lQ>M"iGh[md ^QNa]+¿D:56Mz% *ZiZmIú)bzGR%Z ?A:dym_U_&}ZIbYus'dh]AlV.NEv.4}b<:? 6 uxKZWjŃs>۳z0{G#&&J46Pfpe ;?X|{ 0ڧK hipX6TuGCah~廈zsL14ଌMLjG)7.L NKtOyHաa%"g[XrǑ7'Qa{rd )֒*8;>noq*>Xؼr<њhJugnew]8u+.!B^srotb{GC#\;W59+i}JS,cpjвEr~nxj?_k1ϩ~3:PRsUW\0 ~ svJ99 w{[)6M%;wmȱ±]"c^yfZ4B^L~1̙<]-7qElݤ % X-qƲ꺲Za]'nq֮_i*fF>$s{Q"hP=ͅLk1戙з_Fݢd$&c-48%lus7y?\JՊq.rgIщ[u@gtD`m?Y]rX,'cUmbF  tAaB#X&OO}f: ˲n$S<sbNMo%#+"1`L둚 ?yI{ ( @etW ^-/@|S T7&+qzל  S*LޯoF8w ԉy _bׯ߬c-Z?_*:Ҁ> G a& c<EH0' ^88! a-c[n|BGj҄ ·=snI~|݃I ^@~r>zg7c>6:ֲ|Чlu"3潃k}SfaR Q| YJ2Aid/՝ ;Z(>!H3 {Z -ABaܝuc.>;Y`H{aB3BZ 4ʣCA MYÅ6k{퓋AsF:d/4sA#e`?;G2 ̧8x?׎rQP *R|NR֮! `Ex&| !GZ"^4W$EԜTF'7F7!B&ƬR4L'iKAjW@fj`ixL~Ҿ%بm ,%9Ujmu,]_t3nn /}D9!MQ]~gjk9,SzIA*P6FCb\k 0%LA+ -wu: X~KPynUjV;{ÍXvJkQV,1bi!$#-S&4HFDjLdfj;cNttjCsal^8 C3@a^Pl$F3pٻ%pt+mܣ 0cz5=E@>ӆJPAjR3ի&7$)`Wfƫ?)`/6mԊپ#tKlxx )dU K@%Z$eIM=A{[h 1HRi84VT"u_^/qgϝ,=6hGEN {Ϩ)q7Чn[~$2x?5==/תwv}G^oi^_&wv,m3K^ 9Jq%Bfi}Kb3nU7bHQ_Up/*i (.KlGccHg)`Aq̺5~;v݇k*==Ed~ }֘~j#a0}4Ep!z|l5مBC''r$RMZԜ-x&v~Yݐ sSmHI#'t7= ]>5Z a1ql:A[!ƮAg_^# 1Av;,W?ލn {A. ߏq'y/~Oם}}߃L8yݷH'x4>3(qQqU .&FfֿqxGώjh@ vw7R j9Ga-a59Ҧ~8SZP(i|iS tk<gT&?ﶔ-J :_Vȏ-_a/ܼɄ:1J?Z\ƳĘΎrv\{Y,TV &CmCwQg(㕓 k>ƳX\cE4\K} F/%]*_VPz>:?^  T]|N8NdļLީ}:גAmTHg6EKY#'9 's^ h_*XAXM-oЙ#6,O54\\ ex>ieåd1ڊc4<2q'זR>}SϺ;+صX:^ش7aM~֮D? Uc$d]%OHil_,uM sZ-! jMMf%=-/k{sYk%geJlNacDuK  DI/rhJr Xn>G?zd_;!M"U7EX(jT@+!GmPIL!6%,Tj",T*Tkd")C;[*T%vs)RKbJ%iD 2}ބwP*lmUM%P~PBb)FxȋjTС[B{fq18I0ļJ`3c8Kx͏cj+BAMǯ) pxӗ>V%Xa+8,!}n&zf&%ADqFs}ɭ{9 h7aCpq-|,gRU}M?N/^a&ՙ:N#$-Ϡn%%" 'MVr&Ut޵(X]fI8ptsT MaT}~ aB5V_wȫY6O;ǿIؼ7秚2zD\JIh67tgON!Gpʑ}gs"0Xˤm|PΞآA?Iny3}/m9G^RV#ߕKWW+kwj.9ejLz _{kov?9^{s|^~}׾k{%չ2+-^].x~K~_I7~%]+ߜ t]׳GPK_][]K(..pKr_%U{%1:_,=|JcGYNU%_mpEZ]}E^E~ͅ)Z:ZwV=((_@ ;~@͝7; DV0nZDe@wl6uYHe=0i]ocCe:xu0M4jL"?o_:,ەj4Ci/_x+??AF//vl0PrK0@ӏPsjxO[K7d`qot:hEaD̦xtns=ŤL7=y4T `'ެ2ZZL8OZ`*NʃRwH%W.=NP#|/;/g/duH焿l5򬨳>?nCl>ѓmq}$rI.k=^kMߟ:As\'};OocIO p+I^WXq+`7nיLvg*_rdwB]= ^4Em#4>LJ5;OLILGOk'v!<*"Ñn)W)eHP҃T`ևAg5@fҿqwoGcJQ4GT'0F%{[#l$[`I~r:oA;݉ZӳF#KPYԋgݻ٘=oTNRgBܠ_'AV,7o+aQa(0 5BF;ͫUҷ byToϗz]f\!f'AvihʈQu+F8HTJA! 9 pw.[!BvY#}B}o8wlq7yfz4EsT,Y'C m7lkY)\ M`TB@^`ʴ='74ơvp Ec(Q؍n V G$f$: N)c._kK# >1Er!r/_q1腂 ݞVg8B=bCZs|bFCd<&٥|- ғ1^ϗ%Q\$ ,/YHLlԥeCdx+$ Qxd$UF͍n;Тm}QSc̼nUaą:"[`5W$ YFH)Ԏrjˆ-LfvlUg im? ։]0 :O^$T c9jB/SvV-i:M۴b}Ew>k~*C?R&Ǚ{ p*s1O:1h F2u7dl;0'>jlzLTѓB HNUvkMŸ{(q~?Iu5e!ExjQZJ%gQŚt:3;nu6 4BMIyA ;@s|J#e7z V% tBlpj*\؊֛ ,L=dZwJ?Sփ1}p 3OڜeZt' #ۅ?7l,5,~P7Q!iVPa'=v& } { fm=\Gm6Mm!v^;Wㆰ1ߞΆ)2{ԛdڷ>Y {Z'uFw\Ҹc^yNth6ӌS#. k| .Z'l皒ڦqbsD]e2!jhdڋ Gc M͗#FFdT|=*̝^;lC^z70%f7GAS9n.~RF1,$p]HB5+%c,sdph2R8epKATh}FW[ϲ9 CzF~+YWXk1}0}mBUїsDk8 I!#5"9Wgv oI~NO!@%yEH+YѲ=dH!Ln qXQ>xmXnw̄kcofD?*QFP Pp<] ,e Oنyrȑ>M09-+GxژkK̊8?у]W~s=# [iФcؘP7FuƘ81y,?A6|q!z.X?<DE Po/6ب]wsQl>SQMFd"I ]GJCN{baYů) B- ,PD ZGbkGKS \JI ($/ D7ȣCݯ)Ax+;~tMmϡ6tE SCQFb0+;G1 T4 ȍP/pRM`f Z?QRÈP§܊ñphrK[3Nkw\Pk dm>sMSsN7WA#4rFFq 3}鈋~I]qm?NM 9GM'3s%IOh܈۲/Ch4þU]_hG0la88>ysT"Y31?F 'iQ2ћs|PL A1*p֘kh-O ppĐ+:TevTQ$%w_2-P}Weq +?P<՛/y,?΁¹P٪; 3\%B[o1Y-lT tYn+U҃JyL6uNiӡ4Y,(**zncFi$[M].ӕJެbS":S朼Uن ,W~Ze]TRa]2%xWwCyP.XvAz(ny'ۥ{wuc]m"͗Q%^>;Ɵ޿ߢo-W話tvYmF.$V;DZWfhOJrVJ]`J|/^rAjEjۯ Qnu" >߷w&D_|N[=&{vuou/ck᷵v}_v:ONw_`L8W\ ^Nn7j[w tΑL>rC]ToS/k Y<X{9{(A.TB=w8(1{BAAMig>HVλ֭U/?jnjqv96AnȳtXewޣЖJygijYENaq|+j̾ۥnUD_R.m[ی[T6|S$lU\nq 78,?-!_%Wg`7k'^)U+DFN1|`Qy1Bis{zYة7՝t_.wv3\o77͵K|ompTP%Ge>qSmUvK݂:$9];1u]ZﶜixsfDWt  1 |r"K߫1P ?ҝ}[|Gz:;w:'@uKA ހO-5\=1=Ɏ 8Ү˦w]G{lh̔zCmDo~m}=Yd עb{l]c  F5Djg;tTWKו4z x=>ȷ3[0]GؓTN?Ʒ8;Eq+0&Ò`z&e;ٹXrfcK 'n{2q275>?"hmKem4ݰ"R{F,rši&ۜFD|Y'>6=9b,Բ@u\+.yֳaEͪ?~3{;Ǧ`7m0-H}ҙpj8tuL8mU^)%T^ V#*825VbJ'S,edtghh1%ۙV2@ V;Z /sá)Ǡ RA#zƒD- u !1#ڳv jj"pz~IʽPSr%;J+E]HQh0t'NcqԘR`{iqu s%,-" d&| ыG jIt6ը-rtZ&=8"'i^6֩OkHGk^fpnpbzo B=5yNo҅ThIA'}cbd?s`l$ӓuF܌&7mDhxZ LzM@UBޑ(,"? t(#nPn;4v5^K hϨx ?AǑ֜|" &KSav$'rVw>"'M1 Hy| qÑj|+ibfv|N6g_Q6|P'pv)&d_/t3r8'~-h6Am8 sqVt yGqh@}"vŻR`2iF#X }g@iD)Glt *t"sSzOlq$L5lIЦ5FZQjGuU ݢ .CŪUe1A/- G"Ɉщ+-=WbCg#vwd]ۼho!4^@͙0¦[hK|T87 A3Oc]5р&C8!,=?`ss\!ͦB VϗrC!(JRyJ`. 3{bfg~֏X,PP}\ko5qojB4GMCIuuyLŻl-Yh`Glwq&'lǻ_tcL~):,y^}w8hw}EC>D4.9(ɦR:p+Z2ѓel-߃bBD}gw 9ei#K:! {FI)q A֞E5]T:G%v6xPSNj(11RLzEu+E%w 0>["Д&=Si*?Pz흃1f$OHO5%┇:9-ә5̕ aC @b 9 )pا<a{Ma}dӥB5.e2Yʎ2";rP(Zb0}emp_hc:2BЁq }>%NםI/O| 7%?uic'XЊ[WFko].<: __Fȗ} h=lf~7GG9 z]mМ87t>gv)'s32.2?jݕϵI,8՚ h !sbC}z3v*ж!ĤW^ p<OшA\wD%Z鐤{Rv(R5Ӷ/N?q ŷJ_N t\3-vX$ ,⊱egr{!^osٍHd:;68m|3#>k{޵xr8$7%)c_V'bӊΎP\س|Y=dS`r ay~(?=ň[o SFr3z Rg0т> '_ϣ0NIi)?uA~W-*7`Pdwp tղz)`dJ.6#mq6"P}[KxTI|UNXRkbהћ;֯S^ P5B$6bl:6^l"%^>_ =|;"у8״;~g>sOod7o2xp6șǧx3Qr)y'cdݜp$_cB:&?sIHO=7h]x2=:0S0jxNF  DS7]]OR/GtV#KqĈ+l _rai ߅zW׺ 0v.Cջ'B{w(AJ?NX?&W *y  15x+࿲L)sy$ԊṲVEfb-_*Z I-)}TW[j\EEY(}p4V _cE~ @[F}!z[cԬ.M‹'eXjH8ZM<\7t!WB&╚˰F?uD(zfZίhGpL#1]hbJr"Ghw.xK#3`}(|%/M̲W`go%V^D ,V'LdNT3 bax]md G}GLqg hUP=byl1:ul`v F#QO ș<Qjl#p.>[x"HH˅ʡnbM3Dk<ЈZPsGA3?ecOӹb"yJ\,FdyGcOb>o}s!ksaw88?@/h)ѽGj.Wr ,W3D:9˯V>{f[0$HMes;cq] ut@UJcVx(#9Mn=]O &(&$]G6 ~Ƀ闭WITSN[oXxgGr$JjD;I_2>0:xUu<9?PAt8Q*יS:8'(j 3"Gg} UN;OϹQh`M?V1kI(#!uu.9eT(ٕwR^rZ$ۂn);DGz̦P#傷(.昄߬DФAF3AawP܉7cЏ6OUt[IbTa773X 95La`}HuX![jI㐦F&B̏{x>O{K ݭu;;6 83]wn`_>u'RGȣl@ tWнXZ<@_tDjēIDefR$R҅!L&e"hW9DXz*_q# L\yVa~y\u^S"#˅reKdS9DbsHdcP4yI#&}fHo|ɦ':baggorJ O XS_w/_*U:%^w'9jOp;*qaȍn+La+ RL~g_!3Qp\ gb_g1wxξPl2>>̇Bܼ5[o8}HԜ~$K0Ai罹D\)$kA֝/}p o!FG+;Nke;65%zep䳦<^Z;ܫ3a:#phXu~t.4|.#Q06 Hו:WzJ\~s[a ǀ y5E/˪Wumf<iډt={'8هi% ƥB>jfǯJWiՒbI##ƹYmtHs RՇ:O@'<YsqZ C Gt5>n4{ +gnxdP{T2RLb(h^ؖEf,ţۨh 㸵,hC*Z(v kf=̖aka'q[rw Cc:y`!NTLQeHpֽñz *d`qn0g:+*gJ)>F5TԊFn.x&]/Tz Q_o`3Z$brD|+|&sw[?_pe{}E?,_C炘Oko=RJc~MLwlJ_Cݺ?w%=ů/ח굾|/^X_ϡ|WfM,}N_f5kNOq0j6ky~[ڸKxDDvso٢T=S\"K|G R "$xFp2ryh>:XzKg 5 Vwwd1zևo]$zt!'{gReZW뫁+bRis^>y4^uu\MgЕP-۝@r(ĽJ>\ldk 0;i&Èi}dO&$ ^B|W^],"};?z@ѝH"$ eLIa^#z}{VuuB~6g9xAX " ƥԊ5GOrjWg~YgHDX8y%e ,e"`;;r %-N;޲בC]zviY7c//Md_^O\X R3Q}w qzR ⩗15|^ciZ49uk+텴NV#.E ;ʹ 4]7ྃ )Q!!J<z'^FJ ->O2 mȾUuf/Bi>D|`=pX0SI8A~{k]dh"5:ЬlY }v!*N~;C px0 s<(uO)a^!{zQi_8&֠OFL ;s&lQh"Gqsd?X?^*QbtT`ԡQGB{ɒuf5Jb~e`UbBwhZ/m%g2x=.-mdCnͤ;gwvaـԘ6}#43 ^f38Mk8T|vfaPCEFx:i| ,0pƁPb2uE'x \0{l>ҿU!1Ç5O?f3 74i*ѰW`R;'=*VYhˇ88+F@IzZ T}P$I솈jixkKAFTy{(y)cϛ& ㌬md[1@keY_&}CGUl}cY; ^#(WT Mx3Q%8G fյ~1pL`4}X0geߙesF'TI{.8NEM tY1<59S4 #;8 k 0'+9!,wchľS{BQ6`Y|u.iڿ|z4ַGTRQΑgjZWJ/ÜmeJɼ"}I(3ɔG e\"%rz(Q^IzwzQݹ{X<,vGJ£5BV_搠qgRޚO{qX&RsՌhcJs? gPnT])A=WνSg/` p2O`4!ƒ'1kكh|1h0j\DY7'TD,j-VìUz8$i0l9%-(J3LC+1 ?9G[βꤗd95꿚vAo¸iaEAcAHG_GwIYqc$oU,6uv4V򎴧ИR'Nk51ppZҒ'V>\cg"Z#Lf/B"n ގ %5[Y@Ǽ@6#uͫ4kS(L_Ⱥ 2}<PLl_.hh,g.[Ԏ^pL`8{Q#[q|g@+fP  z.3a*N8q5PCАr_0 b,+~smc%=Ÿ}c[t|EϹQhrA7Z_N{7O]BN¦ۖ ?S= .g ]W3_d[ Ba#*r  Au7YO;Gk3]c.8+&6Gh4~00XhS[A y=ySG R叠Ż^0> _JNٰWqu|樮%c@Hf1J8yd0&]5ّb\/OMwEH}|ʳߣܺ<-5ٛcr^38iaBWjfpV_+L(Bɛ]c6sfFd1TtElnH8 G_hk%6?q|;vVf&φ~ LQivuTT % oEo<5wÕ+r”ϕtٱ]&U|o6,؀*k~ؓ5xU%B($zv]_[Mjʘ|ysTWU.ʢYͤss&;@;\nRބ99in#ReXQv?C | ,pW%‚WE)8k(+C;q,·Z=nSީ!&hTU9~H ^`^X-Cvbd 3o ^ٕD_treZg]eTj/S܂E^PU5UFCŜlFhΕupAGXx ;R9JO2)ɺb*\Ă X;s!ǐ $9rGUI(_dWGr70vt}>Gǹ2S`oѸ&!~Jo9Ʃ*p* b]]|m0}mkfՂS@s]+E&ԟe1\XKa0XĽ,;XcaUZx{٬WՐZ&&vCraSEя`˭^T\@]N=  rTHcc=WN9T Z}PiӚ3C|/D$6L|0 =ʹB`/?)jqI [uNїhPMbB$+:3X-` }#q* Z^icY~)?Gt}BlH4nshƦdG M35i86= 2z򻆍*gg0CwԻ] *waϢO6~eW>+, Gro32PJh [SZ6#/o5f0Ba+Gw W|mF"E/ihB6-]r+S9z Q&K,!L!%Rfȵ5ScZ<}<2,d'Uݚh>[ck,dS}7`s8.DNh%Y,<ʋvj2|#јQ.7NzDAFJ4lVta3:0YN'&l &Ňߕ]cR_; n9zw ё}sTKD}RQlbC0x݃ Z(UҌ-}OiHL;M ]ƒ?{ +VN3?/=]gTT7 F7({(-EWDwd|<~\3!t؏'?kcy!jPj1?5e}te$0|9u,[Y~~cҊDM8f.d{lS ï| ΎE5b ?:yUbp 9` 0MiQp~iٸW_Iբ"4wת_ k/liu`n#OkNcĈKN ev5`{s2Qku?!-͂10nYl]xFb ^;۬ ׇ9H-Ab$<+#;NX%p+Kשt=q7;HD]z ^bc7~_Kt;"GcᗫaKۍA瑕E  ޏrF5yCBH+B}9ǡgXĢ$Pn␐}PáU!H32҃H?]+MEtC"rۂ Õ, DXiK\AIgσ f~y}Aֆ:C+5-Hu2@ݰߕ(Yݻ lH\]Hr.mJb,c?1K†<6r*hEJ4DV\] hGZT伺K *N=>Z-9Ntaq-& PȀ?"Cc1\B DK?K􄐑0R )Dԫlܚ@{%Ɠ/@Sm~.'rj< J JB .>*h"Ƒ@ y%xd%dEsÂ勞J݃>Z[ ޿%cLI~v<G3GeF/"D2c.뤿9w^!(N'-b jKwf"~*I#3"dOKu=9_dg@O\k,ah0L ..%-X^7MǢ$k~sg@ь7m"y^l6%B17#̡{97sh2M,'"M&X&pkd ڎ&:[.tv&ㅐpׂ\7sLXƴBeUU@0&1ޤFYbV zbDfL$W|BeԟC(;zW@ZJPV(!++ ʲJ'Zh$]J .C)"tԒ[*& EM?Ywv}^&h >o3ĭ_iӍ"'DsIZl pg)@-]m(yR݊H50'v%pi.Vd <9*r]τ32.3d%ADZfhbHlDj"VsA"]*ȥbuxhB.!Bh#Ko"ҸH*qu"DʮAƟe2 Sć+MxTBw;3̭4ZJz0rή͙/bAog.\[uVpr;^]a\N:\ X&ͅ,${ "L.D[lCGK"-69T??%ğ[xpJ -# 0 k/ VkI`?cŸWW;.\C:O[ca7 qC5PS&dçI FVtĕe.+q/`4L10U`@MBt.̮$$g~}D|9z:5<ۇө{ ~"4({?{ڜF5cx2b檙$a[3FE;v@h?Uuma^k+*UKаGT½qċo՞O4g q2 ª'u2^z4 8e ɏh!}SDL3[5|Ͷ# n|kK5I!\ت(i暣tsͥ ḟ'ُ Z*%UD:U]q*ۦ{sU߬'BtUz@*/백<-WH@R |`-{d8)?gB7H2@:&, ˥#gaaXe80O1VG=TޮTnm'|ـ\L"=:-Ss[a~+ko55 v5X.ֆIVOޙSH3ji!M6G!@xE #Sˑ/aBϚZPM|:~XS/1P ! o9ACtLǣ#ƣR)qyjd&J%D<Ѫ-nC6-¦Ws õ8Gz' eÃ~<@h}DhUH(uŝpY{w=uɌB̡ TnТ’%C NUiɁ_Kefʷ҅ eoʷI8eKpqMm"Bh}Qnb9 , MAyR9Lw_9xϰXl\@g>u Y>bt> 7&PBSp3e%T*"N߄dZ #ciA!*(lz?bbL~6 CѢ3y2y'eS~*v'Nrq| Ex{b7*ӛ.@,:-^@ v ZG90:8MThs7p<%GNd$m=p ͈G te @x~{ܮKJ]""N, #<<7ot`y; )okx,'lL4Ӳe=:;CH>ըߩGỠCUs'ؑZ`mD8/Ə|)0pNP5 :K`NPc{uhsAjk%44o𽄊`9g#9?Q/.ϷƹYi>h]6OMV`9g&ЦDV?a6 ״IQ A`\0A$5~ 4ǩ،[!α[Bg(J6V>FчUq@rΰH ᵵKd^DavBEGEr$a @1,@1,-ّ/L l"֋N9 %5`%6A-BR,@GY/&V1Vtb3&sm,(tF@*jnsVVHl0vg|84+QDa;&0MTŇ[Ȍ[SL4D_Z(5&aj"r^ SƏ􄡊\IR#$.dtA&t{* EYz M0(jh7Jon/(91e '-Q&$CoUfI tXijQժgInHxfAPBդ(5Y21r5)0AZdnp/ zM%T(UԾa"W8}(/TтmQƶJ*Q]F:6S5SO۸|O:O*+~LPT+E˽KEߎ:bJdH?xA6-]!;Z!h22" Sco1xS^hq #rGds#of,o1D :/wF?Q1Q9xs~=ÞO%WGt3;PDK))Y2i/)JUb E#O1ӟ^ }+ D,5U&(( ()HדgNCVꎕhl@OjL6|4P|p'R tN&2U7 UCiCy'0}bcLPЪҽh83Fl č @8q8 \UrӃ$SqΔ[3bo BuzæxՎ^Üm탎:9f<{V0{*Mц]|i)YDl9ftCkN4B S\Mr< S*d >y aZ?+ pW^3bqz+pMoI]?Y-MEUK2lpS#lY(GY+jдB!vgWB>ype,3ǿ}T(^qu݀QaY<&8W$Rs"I_e*j="&MzGHȍ0…A@}=L*A\eF0Gp;4 j}%LۥeiڣkZ (] yenGn|Df+nD8(%Np.,M+C+N= ,Xb-@a9,Q"Xٗ/r$?4HM E"ũNT1nx7exJGlT>i~ :art5?M\"(K*s ׳B9G\).R'bx\~`L6}@ VIb(1?|>W 0xzs X-m/`=' y"Fj6XgC9H1?q|@$,6界,W<zצ6ŁX2uɽضܓ_<{ͪ@]>^Ht.Ea}d!mن*QpGX-J`d:*p'x& x&-xr0-4VSz Bx' >kژAy) Y"! 9ۏuJjŻ.OBD|%>u§N|L׳ [ ᣻_ugL TIx( R*(P,϶u Te޲}V&fAzz4d6jطQ}a7 ͂.(Wo%МGVBUWqlX yY+3E@,y6;/~ɝ zww1U\M6r.,rWU?U;m\^ϟ?61x.+|{/8f3RN+eEmΟ٘"'<]5*]EC&\WjX{E] 56OPccO9~wR:T^?o%^V窺5^~ywp{Kh =AA+b{Ois#/S[9|= $A:"1a 6Ա3O*Ύ߼[ 'eD71a9`}Hvs@$\4hƸm5.>̦?(!-M)'?? xu4zНbXAfje|*@U$b3U*Dp$nm8~!C-=b KIҫf) dͬey>>;yܰ @v 5lrF%\Oх8H@:92igrNIy 3X%jZcGѕ<J:p[IgST&9Ѭ"7@,+k0 >?):aVi_+*}&#~#Vm l)4MM8W+jP,>5 =#ؖ-AvG*`O >ِeҏ:ވJA?P|_Uq6~x_qP:4ap?˕+G%h &&Ob]'>D<6:Ba&M%5bN% p{=sqt ߜt/_~*~TxpWs>ϾScPEȲ$SmNVPOD2IOQ9-{<%(LtĮ*sJ46DCфg8\r($hĊ0=l4Va5[#:, Jc)Tqd61 |])3p%:Rײ d0qyG6Ϥ )b<~,)zzl^dP #]rp9mXo2^FUt6ͱO'~!bi)5[A%&&̢+8e>V71<&uZJ cqlV<(1$bb6:bm6pD*ϻl]G Kx~Pڴl_FцǦC cH=_L5Hgè-N꬗jP+jg0I_'aK\Y mO[nfA]Kwy,JR:Hk 0Ve^ I[cۆt<\ƣW#IlVbg|!s5pRX{Cb4nK[kt='8+YɪOv 8 *g CU 28oz}!<(uAwNmƞ6GTkKpg)º_?g]>ePq|S=lީqJHh RBκ/ ƔnET2N Ĵx&9a!3Zue6| s_QYN]4"F= ZLƣOCϦ\%[iu[Nq]Ʒ.NYsmb2"ؖ R 5) W4M~ EL.vn7D7iYUa_H:-_O7STԵö G)!tˎu=3#'$<3ѰqMl K8Lgh7rʹ_O ?!g bDK\<[t"KO/N6ocꔵp>W AoKxIpE3ޘ.,ՏR t/) 7ljT9HDFU$ i0_`uR? 1>` 6jp3ht1(.Ygl! :7 슁Utn/$ABucTFuI׬w?x6dfuɿ8`/QEհ.RQPb;.c7o/˵خ6k^){+78{ RV۾./ ;:-RXz@P]NK2?K1 t!/GߑH?{4zW*n1 \|ڏ$qB!{ ^69sUB^5dw$AٳQpPfC2L2L0<.ǿ'10+f(fqZ34d uV 5鍏Ido D2ܖƙ<sMGvϼLbb O^ a?cnva$Q]<\τ3*Ή̃f81O9cձ0fN \&/KZ_vadSo9xy >\s^|ݣ xbv(ysD S,leBZwc`wR*̱,(TN.+ՠ_]Vh._wX_U#TE7N.` 5; rmm w w*\BBi^RRǥ+CA&ʾk[M,񡏯}ĉT4*:] M ߋ\b28Aasr/CrXހ;C!`SîqV^;Z;(ar3%i*u.hVyQMʻz'CE<[x pZ~\%qhi*6i=<[J /bm=^O/;^p1y_ROS-~]HV)ay }E"w$)"ĺq-q-6\}5#M c ^9?\߮{bS!q"'p2L@(G%# 0Ma6꠭3%wܑşʢf1*V8 S)ӟOPNŎ~T~b'w.<@ x*cj0\ew JG0#Ȁz |0Â2@$_ұ7ab*)WET(s˼xG|b4:ժh96.`$6?^+@!$\12ҜCl8I T4D D_{#_p/iB,~ ݠrvp#a)مrgBnY[m(,!mS :'Wp&u|Q^w2sj<#+?λ1#G#93?鯟:!/|&Vj-$Ds2)JMAZ(ۗgdW*#nR2.uGO @!On T2z8]SN:Lp T[ d89fO9 8Fb&ݵ9j hxk`f &)J 쀙Nw˂ <~e@rU$ޜ;E ?G}T+a=2C, Ơ j*4Th&k$%L3Z+RǸ0/>ysP 7k`F_p>UFt#w30&Jb|pչO6Th,-Mva5KYsB C9rl*iQ tH)AJyZBH U񉜹pf}hẠfF6%B݂(4H<{LSO\=I ީ| *jguB&l W_Wy4@}i.>G9/5P/)>LǷh wpb]#D|qAe#) nnlBz2 w`R8,YEGY? ۅBAkC%Ba  ] u5oNQ gտ̏HCG 7 W*NucF~'\WkWjW:Z?07OiТhA␾P z)e౽L.C:|DnQNȾGfF^pvXR9p|Ä9oF#uG$%Ŷ5]_ܕ]ؕry\OڕyW"gB> Oq&cG"2{Dd 1,WOʣ+"E1Yj'I037DV$%;ܒ3jܫeI~E&:y&{z{SS,FjYS1lUǝG2qjfjFUV"+~BtSbHBٻJ; r-V+r(/R-$6e>0 OwC +Ju.q!`tiow'?Dɡ޷:&涊&7#FbѲ+y21Hf`q]xvjK0yj' rS QFR1LT?.F t{tke";VB4xj!D#^/؆*.=+gukQ$dYܱɟj%|%'Cll#S]`rE:DҌ. dGg::[ol!+N~ -v,T&+3H :[mH9z5F“KynҸ飽)E/"$o` > 2l7-3ϋp*08B_=%q/;87o 0EYQ6!Ti:шZbFȾ8'PMwJbZ/iϊ :R"? ೿LIvmG#Gυe+ضb(jY]'zn8\Ԁځm, vY:$љR&UzߢEӘ0y*%V2x\V%blmxF̅o.EK$!X<{YҔ>NB("wh 42 K`B/= !3ͫ%}Ҩ&T1SrZ(bUk˺*pYZ^iZnn(3[ec+uOmTbrm%GUz٬D%O"Z{gexr&Vrwak%  bEUM5R쪄yT߷Q5jjղVJtW@ejaDHY[q3,2? y*~ ?槒*9j4DRշ o_ƦַR%֬`Tv7&7*˯_W}f7.W}H8ixվ(7aUq, #!<jd,&nX`&)E k~cl)0_M_ m;A ZW[8Nti<͙;rx:.yWBDLuq1t<ﳎ&}VsK' iƦ%Bns]/H hfYÇUIl4 SN:rl6slAz .Vq ]幷%ΓeyIM Zd"Y2,&I+XWJ'&7<>o35 F/B(="`}?MgMT4_ա6/ZȆ-*&a+*4YJK1nMo!mpU= 5 koY otnk6tp@67<ND;!hA2Ogi|VtǴ]\^HQHcDXKE&Xd[)'ߧ8Yex{*E /_ìPL~^D᫨X2.K9^]ceq#aDt)~窤L'{(WY'r:B4c3W_̷#k oU< +/| @ GCIL"Q,? +0j}ޏHbj>:FfࡒkFn0 4j?ZGK{f*5օqcwԣ{TĉG1 ?⽨ZnPXlr:9 _Pʋ&vE4D_P=AB$xJFM4:])?S(>|tGkщMCr@sKEEE kư3/S NJ 6c|d-<)N m`#I 7^I3N N;BC /las֖y4Vj)j7 B0 ab^-\a;Y1Ԭ즷fbtkx\*WO,Mm;XZM?K._K25.][nWP:pE,*vS]j믄s鰈o^5tn]^:דtjn\f߲3W3u˜3fX(Kv1Jc<5.; DvǓWQH g5Hԍk=} =,"-9{UYEFQztSblGKS箶wWsaM%]9$Xͻ%.KWQ߉F[`pMYg\a.ދ a [}G?fˎ6.v ~\KEg٨o{᣻7R#țl"`8 v5ÛtƤCx}w2Pttq^f?5+;*&7;oEpv<[bp7th lwD[=|Rʽ[|KP 뀀@)ܙ!"Y[O;xM BG_?ʝV˸";ObǸ`R<;q.lݕgIi6OV$xK 3yٲ .0 `t{U!!}^*r" C<'2.[ͳ']GIo;pum:g D2*Y&y𬐑fʼnX)Ü|? ߰i~yfd lAW<`3Ȯަ *l`7%=hF0f4B}yFiɥz4woa1MS,)Ȱ\w~'f =@z-[G֧d̝IbtK@JSЭt Zo7`?|TZ-- ?>]D3{ uQXXVⰬGR5IN!QEyJt63oY|0*\VR;D$KL젣A|;0?|Ł([X,wWfR ͤEےNOjtR6ћjt/ŝyuLom/͉JsjO;qYWJST]߱aQȢ|=ʰbH Zr ۚm bs^ 1LXf@4koM,>*yvpa,%uw0;" ~56O[䂋K)aPPYv7; ?*b. bDlC5f0o>aO@mԨ_ߑD, dF=O钳Ee wm3!^7 y01? F',2܍~zc,90pdv U̳5UCv iF( 8)<ũ{gc^4sO3\H4q60><pq,"gu8L^/甽1GN(SiF62Pގ⽜ )) 3(j~rqXm<[)s+up^LI[`֬Z!W%. ZU1=Ħ:h9t-Sx_3C $P~0hH6bg-_kg*3 pw~YSeNy]u7G_q+ẤEqҰJs&OxD2:5+黇X|U8C '#%䆭N ofQ]bPB6泡G0-.ؐrq8B`iF[-ш(I ktU1BJM( igD#4.C- g"W,0)1x\)CɋTPq[h(}|Ҭ!eWwn#@`zq#'DNW4U "\Dnߙolw.yv!3P49Ga*a3Ylӄ=3\m _K̊;0 OY? ʲtTB aFc:McPd[ LP7f"I1x ) S@eξr%ĹYK l/c7/Fz"Y#YW!J(N')-qGM*|Ț6B:p)ぎ^\8W 3ƥ&V/z`PI2SFQ(q}ꩣG>rpI41PډRXpGI80xj&!?O+d;|f\ͤ4x{z|qɲ-^ެGrɪsI9ґ*)`n8rPKR=xiα ۋ\\^|%W[.ReAS*WdH?LueJPM%%<3MH6m?PB6>^RvAʐ̋aiycZ:yНSYG37HjG'jGQ=? ];?ejVmӫ(gK@W/H` 椄) aFe~`J9y\: 돍N^Qkv2[z\Hz;r q(;Qӝ:zw7`A Ը#&GNGH;pm8ltq4ĸ]IJŌ;qG1GWnj1<"+/MAy*ٹ@|w3>qhxg.[ʿ9W5;7ր 8_u;O#@X>u yC76(cYv|vBSD3GcM!U7w:f) jf@r)"3#LJ<t~h)~J:qZAɺq364kISʖ̕{UK06pG3q* tsj=bMĽK<3gGwyvyڢeMQ=6wDz3~^ ;e?׷\c=f?7rm\n?9}v 6A5 KYGx.d3\W5BHLUO$IdzuKKp-6p.ֱI/R`_*p#VĒ0 |N?I&00?OׂIwLjMć-l &5 Jr(LQi˛} F̕#UIdCIn"53BHu!PPA[cי P U\9FhEk#>)Q)pGh&? (IҦU37%m\mJlAqI5Ψ%XCDL4~R覥5-aQґjIrMF@Z(qmV]$lC9PNrҤj $a$E<T d*yA,.P% J T)J$=UH7 ))B,@zBR )T\@-!RHP *R7AB LP B *RcNIB@LqlA!jTCC9a <C y\}Dh퉒Lo^ǓE%"tR+ Z{Q@@a]\ *VB.f X}#l zl"5(Z==lXmV@qKJ `&C$xY20'[ rS\*ݡ7 @\VxK# &ŀwс" $؋hp-fD d]#d1Qv<_s0%LIW0e)b{<I %tpWtgtHr,FK <#%C"%Q ނE(0-:2FdDo2"ٮS53L~fv`\H"L>P4ŠISU!ըOkmWz j5W۠( ШȄfi^ Q"R’"D!j JRDQ |'Qk(7j j 6XZ( WF  e76zsm\aw^Jō ^?}̓9gxhޓ9&^+7 s`>*X%zr\ MHF`'<t(a0۞oӿGo{Ǘ/{ڇtSO<;(tNM:."o,OgĕpX4VHbg ?zs<9o7k,MGP-q,Gn%ɟdd'S3_{1d/Pe-t`8?$GB.zR _`>gՓsPq={7Si PámC6)]g!CRWϺ6RH663 8(DzoAg&3Ď1SN ''s661f?</9[%/!-hC>mo.^Z&x}FsE'{E"{B\TSwNF5AMJ*뒒5veJM'Peu=Nm%GTChw[qǘMHĵ|` H9ԏ(Ij 3@Ѳ NmJr$堯 v 1Ǿqw*ᅢ]>N}NT=]-"M$UC-a7&_U}'&o{JҮ7#Rתݏ++*Bɖ+* \e5<ݶ7m\N/vq҆PCgH1.Fwý=m'v4<xC@Շ@dqRI+&{^@ Wmݱ ӆ: !;.Y}#a$8<f=ߏG1`mOgi;CAiR*Q$29`[ W .҃8"pl*H^ B U$' ;9>_J\);fZNhЖe.GͶndヌfA4Nńcޚ%UGRPk0鵪AMw3H U&l2 @WroW)t{.HH\eԖ b%+m?:q=_)аW %ѯ_7ʀ媍%,f_Is a B(B}M/ _ߍ&IE7`ٺ bްM4-K`c&0ܿze+P K~e\--F%_YKBS8+\qs 4H_Wj %e@4{fIkn;Fa@vz_Caϣ7d@!7^ ۯLdz &A|Goc#acA p"{48:i8-ΎgV}BƦJMo$G #`~&,A{uu`z60 __p^K7/,,&4F6zCw}]#b gpK |ߋ=o1BRQz'[(m?“ka?k#q?gW^iX~`ffZnu7(!D-4ƠE L\+.'ȳI%8ĞmI|2$hHŌl5gHbnHcl՞ċPPRe1RDJ{\H7ćZ.rb;Ȝj{~% EdN䝯Ⱦ9Ѥ4~*\۰/5P7L|G {)S%Q|B.jKOwIenDW&#<-@liw(6EXodNWd r :HT0nC FL6̦MD&-FEف-6m?[4I4'QcY+ղ82iFt6mjPfP'*T7l*=i/B"0"7{'4P"Lxb? 5ji~A:U!`ZQ_Q3CY%Ҋ&oTF h>دDh!mY6fDm44Ky?*t(gAËj+ h?jG~ :>F~T ]}T]ڬG cjRjTU^G-Yz V6be +Z>|j6* ;5 ^mej6U^єʍy]_ kz5kqi<f`]:7|i(&9aʸ7jke_FCEzQ *W`nQZۆP$Gr.-fHdTD좄A0H\G4O8Ҹ لHÍW9<7`^!ܢP, /2(cH5SS#bu"&2nMq Ok %֌^g[7({u Vͦ_m;sVqz;ztQ 5 z.r\_{Xd3pc.`CH(OxN=Y?yS^"֨G@} ="!+>=\g},QAbC`v8MRO;: Ua)E:qZ HhzC]de&\ZsNɱsl᧭ɱslarI5ɵ&+jM>kb{^sJc d$ u*ň|<'&[idul6{9?N<$T0-&;1F nZs I$["TjEEQvȞ(roh$e:-Kic)b)GXʵj ;k0ҳsa)S)9~M/Ki_ȉjhy[Zv,Z}({9v.Ͷ?FQ?6.oLσ OC}b= Z܋ÿXtnʠs2_nHwnKGvb >-_Bi8)im՗#^afhW$ѭc?a:b5lF?r3X9-渒}"{"P`@7l!ݦB4kQ&ꤳN 3͕6X_!U9"XaxF ,Vaf.ѡVׁ^t%3rڝt}3QH%_%&>9DӛB@8|`3Wc tB5- >\~;.~~#U FLg7xͧf+X{YХhL,PaB;9wI- L ;[_!qP]Ʈ %6꣛h#6eH )tȡ J{l5j$_*(`kG%jO5K=YE%%bG$3XȭB?*F)ӦL6 Py˸Oj~~<~.U.yׁ)r:еndMuAg~Had[kүt*;q>2I~[hVJ"ۃӇ:M0iG1AV1m=8]L<IX9~Bwy+CXyssl &?_ԗ_1~%TڥRCV l4ZX/\(KVpmK7Y6|IRո_KӚ{4(i#TSdJ:iϑy`;ta`!YE`ZZ71a4.jbІL48NPe 1$pY:id0F/W[ ~ѯ|8{IZХ2`ٸ+·5+*z7zwҝCw?vLm{T-L/JvNV[[ILLr':٦םpeV]էUz ~_hTϵjvuHn}rn78!~Yoqr+d*)k hTZބ֨e7e&ZU{ ɂʢTydX %8Č95ήBځd/ fԊZ7xmVC;kX۸|}%? Q~pp?:k)z'v &Os]$6v/,W$:WYH++SU:dy/k#徦KA[u-sr[~.~[NY[~e.g:ɵ.;VU\eG#`e7]]5@4X@X?%KW+ٚ"9N~]ίgۏӊOyzPse R ~aByG A>=liWwÑZj⿨C*`5Wvt؆o6lSXъBw9Ǡ5Szi=TJ9U,SCدlt`rQ@gb%;Kd+kl&Ѳ.t~;~~ #Þpܶ(HNY(m\VryZ tO2 | VqHގa#T&/9Ep&OkFT6h:dGHM2Jh($Թ H/GXfdL1|sWcć؋Lx!*'(4Xn7Qe׺8BEW!OC|f[>H (ig>n3}ib":yYFQc^{4!O/EP蒚I!o9ny^w84tIZ!6q<,e[R`uVf݇3ţz#g Fz2d6}aQXeV%5`U_{a|fv*e7/6ⷴ/O !D^+Q bzOdzQm`\c됱 lW3p{ kor,<lr(2Mɔcp.%l!P \٬Gڲ}\/1ߘB|nѼVͳ;@ŜQdStZ%Ҳ=v](TP{)z|vot}<En+{}ۣP. /oY uF!XvIs~K#RF_#f0Sv _u1NIew{S={V|?aֹU8̔"ggb&#lF<'/ሉqt Լ`\`ao(Mi+ c8N<0Js@MPM *Y4B}?gp; ՠb&QtmBQryز_U( +cʠꪝ75p5F"a" ޘUÔt-[lޚ#T6Rr1N"0jE:h0T(f !ӃUjPN)4[ɬYjPĮRä?\UBm'khd,GفR.^I  PѸõm?O(j .zctDdN3.M%I%^gG7d([of!MI?O+[N^ͬ<9q_J*"a >kOS"k{,@,Obņl/>`ܫY)~e%d,v؉q dGF-P[2D zz0(e6Z0ٝI u*1g)7xݤ癅c%Y'_d E34CP-jQUؗ#+R1C4H_EР"(n%a*?٦e8 ;,T;yR7e|:ݨVTΊE98g'[8Ǔ=Nn Uݎ`~;i$e`Hn )ct[>ndY¦WQJѕD*A7DB+lY Ame]uѯC IDfsXgљdV0: UgSdG6fpSfÕPJ͌*hbYe5--%X3:܇z tc1~mYIӝL'3C]3Tf? vZx@i+K@o` P%@A j&MԜ4 r`yVh/1O>- סB8ݐKjdW{:#Y$!C4!xdQCOV"TvCQ5da0܈S0Y,yͨ׭-sc49MrmԢz͎?[? 6k$6㿱 F ei)ۂ!dlxHcf6/nFy7]. EІ,I=`" l|AȼiA-)YlʺE×ʓ*>)i#ȵY\M>OǟYnG `6Z|JNYx{4tك2ݗw<"ğU(|p74 :bgr ?@Y%+`у{F`pxX y7V| WYB'H6-0dzO?_a!wDJ]Qyݰ o~ ãGI@~ :>gn–<88윰Tof םzJ;c.VU;y x}W2* :Es7c[ ::"K_m^T@P֗%=f=ɧB (oYWJԊ۟vv~vXc:j*f{&Uvs,/wY`b9)R9lAi{RRk [E@7֨iO'àת}gzM۪8\znվҪ3@(f436lo 67խw VwW? J_?b#($JDK8X5,ukwBzkGz㱿k8s԰YnETz$^?Y"GsBLB` yɆ-\ F= .(كw|B$P4rS*kP;!j,Gh U"9x5'׃;d?_p|N7'W|ӿ/fgxp^X8;o;bӑݦ=X?` n6^cp&Y{ Gvsypq3Xc*A6|p/ll!\0h\UR", f ۺ]cَ 7'iD7- RSif6qjg3=J|/(t_)t :`*7.7ݷnD!fϑ/Ϳbyy;B'x$)e8-Wr ᴤEvv5R$w0íIMrK?{XczʔteT|FAz; )w "1`2L4ɤP I ݝ q7 tjN@@'L4OEsIE*l>ZBkkZNmCE[kWʢ[+ЩoaAerqڟLZ|/`#=2'¿ep?]w}Đwȸ}7~" uv+Qht0تMwT^ܥclw0dl GaRl8%HpPt)}eʳIpD1yYQ`M^ G*:dJjRj:2+'nߘ՝:;ũB}w*;uQ}LvRfUM씸S 'ݝw~WuGJ1tP'Q4J\QD>¾Úz_5q,N 3|\rE-|-EH/4;0XzO0HFIV]TVIB܅FVl fыj,h(aFd[h|#:X]a: ϰa{lm՚-qy6wab na;vӻ _aS漮;/3 ހ7` {fYD k7wzؾPݱvr d@Ga'*jxh4F0:w9܄&ΆpIsnafnaf'{p3 s7Cـ:]P+DԜ7exex/ë02̽ *?L8s]eƓ2ʽ ŕp2L4ɬe: ^{^oeν }' +y^=/E-؇at|ira?bѻZ|F,Yʇ5a![zgT4%Ut4HG+"}DktPeXH,bUqnëon4!O~ˆBq6eun\]KHXnFFegoP>|q#h˩7L!*,tq= wπSūp}ڵ??u=cvhCsFcsE <+{\-y ?R:P؞r+QE] 5X^dxq''ϊ 鯊Toj՚Rs5]M80)\@ Xg\gM?T+t5I$y[A՗vvo[n)q'wPxt? Ό7g#5=yD 9gC嵑#xHqAG)v_j:X!ϬL{$2U $!([RG ?-, Q+:zu9%œe4WemFS?W,=c姻/ֿͯV_;Zp)( U[dv/kxV3][˼BzȦfhp-Ap6ݼ voK_WjA#Q5@]b}R7e/i :m\ý9-[Y!FI4_X[۸8XgzcɑgB?+{@RN_ACޖh7cElM:,K"`rX'㓽Nb~ @c&[,Qc4uQb}P; IYkeg,t&&x6/ίŜU־>ށ 3,OJ׿rv+Ru+G׿zĮo:M{K,ĞDU>fa2k~vw}=ԝ2w+__7)6=K'G~#bX2zbv` !œT7;56.ʓ B*&Gk(qv/wwA2|ҕ }QwjE^v|? NeO]Ǫh¦Ax?SVkwPrT@)ӛO|#Ì4m ?$~sѿo'$ ,aF>9D,0&eNp 2hY2 gH3H]Mz 'ئ[8)s˔Ly@5:~< c"`^Ջ!+1!+#pK<547qpsp@f>O1N!G@ ):NѲn%"5׬}F-W* :#be)uϏ㱐T^MUut0 b vX/eyuzlQngyyCny`4JB:;߻NgLPqLA4 ZGAC͠9(lK!=@,mlgWw/+m+o=;ݲA8FaoJD/0aGEaU'K iw`NmԏN4[ަ p~FLj|ld nϰ{ i?~xGryQ*ζl$p {qV'QeX`!#nh _y@R@wrl"N**)#TLƚ"pv tI qx8uW̓;asf2A!]NӈIVˉeƐf:њ)ނ6x=}!6`]duc[ksoD,|m\'drbX%5V9-x8yEEN+`[qh,ÝV$:fk5SŬ'biT)Zm猅ӷ yq<Ԃ|fee'fm+WPm;)bp`( ?*ddOGէ\'z4YOtIT +!wV)o0b̺@ѸG$`4&#A= /D^@uo }<]J:wRIuE.3hO3-[bEp nφP|}lli #_u_qABqJ=ӊ{Я*׌̚g;;ձ!y7 ԵIq U h BUN/hiu˲CLvb2 8LrU#*뺝*u~O/j>*hO)!) g5fn1T^ҪQUmM5(YFTr ٻ*p%kUQاڈ͒5٨Rm۩xJ، JHlT7Gv\u +VN7U,=Q?*/8?2oҁٞH0[`!lʥو%zFo(0Fרx"e(n+jinv j~nβ1̎sZoBnmo{Xw,v&aFYj%ݫrgJk* ho!!/X'b{OU>pi+amy*xT9WVɀOSE;\1~c8 wU,C/ankZv$Fn~fx(G϶ 0&MݺӁ"D#jQ+ctJ[jjGh">apjwymqvfvX~].4BEnau'{ qUB!gׅ{:#>^fde{+׶=u-.M{\Եuf>f{+qfPx'Zv1Rֺ1RA@d+ֺ.W~ck]dֺRBfoRP#l}wnjpGtc/.6|چb*VO՚buw faԏBQToڵ0 4(e7r\ 5 Zם+(DզYID>6S/`{(+'yZb? m5lhM@ftjQ[sOcn~QqZolM켇|aӑz&Gn~=˲nhZoTqr:l @TvR>,q6V;0- 3vܝv RIlPh ufP!yyee|(v4sZ : Dvxѝ -#07 mx&myr ٹ$~&ΉeHM.d}`n r0͆`+qF# t> V$@QyfW`F66Vca@X)!m3RÉAat"Td{Tx5q@X qzҟ~g-oNdqui<`ӱ/FNR] 2LT`PMWKXK~0Qk$w>XCVQōCm zJP,;;ʷV |CkuV(ՀC(+E L QM\i]W]Š_2p7x ?+EkxхtJ/g{B-EeHѿn#zm w{= nO*lL@u?5hӠ-ۂ(^X ۅfŢf5ϫGQX?h4iR&>|nx +'El 7݇9byõHenp-(ƹ84 w},V3{$.f=]w~6޵2^*0K<ND2N%a'aPUִYۙU97Nl@ns}8b(͙mdSq3g3t?S6җp6PY="5a0GM6bjuP|ȑf^||lUˀ >ygq?ڍA80Z,SN>}q n5-ηPø7@s?ތ!|hFcHtN_*A;I;3yamW|sXzfNM0:;Wn`4l.}?9Ad TA`}O`>tZs:"g# -Ùr *exLءǣO{dďVx/8*|CIB9 vnpJlaz7RXރ'َ$s9Ps!p9:bsN )l:D' XR/.Akjq8?76qADU,$ ;БR,kܣ%brMu@#Q&]U;[`4"v:AHj_۵P[P(cB1dvM(w =YPv8Kc u-\S?rƸCR Z}C3yʰEݨYݨnm+-wD2#:^;ƋZx,Y%Yuߜ϶*#W5),bgSo٬cFuaFSD~a߄Qxl:w&n쓟p/ FJ,z(~q~-Ӳn1*zx~)laYYB?LƷ8b0I(]EP!kcؖw>C c6t:!4K0[h1YV4#w6Pr1Kvi0D$;6JF.8eW0aeƇ 2Mzk<%K?`'*';PNzSdžͱ3Ľx~:/sdYGQ)O'9Nc:GY޿*qP=>edf=9bOؓ#d)zس5wĞ9bO# 8Kcgޮ{׶{QL**fD=sQV@A޵B|i``j}GP.{ 8&J;NT# 4i=Z{G@ 9~(pn09lD9zMHlCamUo=~Z]~ޯCUmTfX5x/'Ӫ;zH}Z{Ԧi)1L=,*1KC}W{GZ( >:72GysmzlX?zˋsy+sX?A&Tှ5@ɱ ֺ$b(Lآ=T9 M[ITK wg|VAW1kH pЕ,J8yk7lob@IA)bp[HL- Y'P!n,9P&DRfG(ptADZ-rc-i5h#AKە,(uzO=ϒ#[dײ3j9ROԓ#9ROz]Jr*UVp*+ϕsH>W} }2\>9ϳ1e'Ɂ}r`\>9%2܋a@,˾@*&`MUo h=4M(G x hBCJo&_8C&$.â>ArPT(UsP [@ PwFc(Zc>9ƐVxNgcᘌ^>C#@?*XD:1DQq|"!ifN fc?D#b!ʑQ';ҳ#H*Usq[Ƭ,FM2 IىqKhe&@dq "2}j'$Znqm?#}8rl(-mb\E2`H Ф WJB53={V{D ѩtbSe 4QLms%ˎqt8#puyrR[ki1(ٚ\W9W~pY_z96.룍>/Nz=/pMh;g фxXAuB%A@$c Ra۪KuQ 0Nw.ڠGߨ$FJ6tr-Z 2EٸBs :j>2?!-TLXAg; !n" t1LȐ.LH$ݫ"QU?RꝘc2Tt gYQ'摠s´Fל_Oz-W< 5l1x(J`N{amP.(RBG9-p ʗ Ub ϗqNO[zW5X}Pv1oڲAuL[ CrILiKP?ΐzdg{C!yȇd/HHk_CIltK\wU+_U{$Uyeb_k42~6|qTOl(5O]6% '#u+*i Kxf7?eU[+(%ԉ㦋(G'gc.".Lрvͧ9ab4Y g7@݈^q Fk $*gFSɯV9z|#+JM862uR6a6eJ5=Ꭱhlt7]3``3/e^ovY { ",eThޣy$ƞa124V"XP,}?9*Y6[7+J/ tz'[Uf%J9 _rѫ-k'l_9 t"󑒟ڟ^*384޳l 5Yy)RDU?$miV$ =qeFvh}Tl5J&2NNRHc9ƍ&$4 Y Ae{$F BUF0mR=zIQOB&im9)Ob-Gg4^3:!8b$[sp4g G[3TtP|>GɌ#~|"*ohԛRpӰfCRH(8V0bu رۏv޹y%0"-TOr{e pQ0y/<մ |ieX l6t=`kN0WL|>S &˴]eZ.VTJwi+~`HI-ĪTGӂzbڨi 2~/?4  >>ODgj|V)f(5II1D}:|LRM){*))TX+wkOtT:1x}62X1؎!!΀H$ -HH<&0]C g7O=V Hj. K1*A 5z8 ;y36˄6x֡b#_'t2r6D8{`mhE1)1ڇb%Gh HE,KyޒuC?5ol:i iG0и׃9aƕqp[4K]bbo _ 'w'<+M~d}q%*O[KOYxr>Cp&r=e՘4Z>={3XI,[ S|'Wq: uk+qUuc_WBvlWAfdҷHU,?wϣNr+r NKCǤp(J!ldHI q![@й50Â̼ ڔ;ߎ'7ide?ZBՑ8ͧdQj9fђnZ_So\{RH*_:  DESH9$V`I7{a%jF-|Rtl6Vi 7"zGu=#wanF :ɏ_DAR7uzoҧV,?SբzXOɪ [*Z$v9[ՈQH>~ܮvK/e⥬$l8Pm.nEm=HiصFM^~seOk+0}V(%tJw+@k~:5 ?Z3OS kU[$j2jUf.ѳZzJfl~NY=QQn6s vh[)ӯ;]\aah'uDݳ٪- \ESuNؚNNdl_C r-\^6k=EKظO'ShECl"t+5~܀J3 = yt c}+HIGqG|E*QoA8+<<֙*Sw==uGI ] KRÅt%XjO΁?I+,Lɣdnvv[v!M܏\+8Ĥ\iUO:,1NVY}htee J陰ER3DHs2$uWt#sˤeAXzsXbV[wD@sMJHZ =iZ9JBep1t:+8{lӼ,Q,~ٖSMk#6=$k/㡾JyVV@ &++He.- &f"ͫ ݪfc Ge>d.@`-Y!1_ED1Adn kvl{+?0w"0cRB]{ r8-3Ρts(mC dDA U_8|_?Vw]<^(1õ/ {R:RO{œrfs,y'C-_jΡ(dU\U N\BXRy>Ta[y 4뒧_K˝i9 q%Ά2yS] :WY%]tTYi*sB<ʞ+Aoo+F/ &s 6 {%uƉhwO͗ݔo`jE<:UVwpYK1)XW`M =ip^ d+G=:*'.tUՁcL-q[9v2N GMīIX믴Ou LI끉y8'O'GI 'vfm'vX'{89N,r56qb-=(n5GTE KC%©B!:-dը<&x4.PP*琞!=S@z,TҳϾ3Hϓ33g1={nsøධM=#?;Qvt4{&:h. \~#ךgqY?G[iZq6s|_z??frgwX܅g.PCPScnq-O@,[VƁXa W= *sLڗߋdмѣH?I]f.ܲ{`U M!y~63"w?GDbQL$&ҟS kKˍb?"5E UweT zz WƼIՓgL#܁hUUKDD5t渘jGW;baC7Q!F9^S:ef2\A0GU{sEG+:4WtԹCsEG+j;Wthlq;WtBW+KsE9W7>Wt}sEgsEwSs>W#) E4z_ڍCZ9ܯo|$)T,={o?xXx%YSN%8 '>O6ks",eOvg:9)͘\K384ۧ ` Co|L@X\ D!RdXG|yLr=!SGwU..I`TT_Y-ΆX>^eyٟOe ou>gv ͘K ڗd5pL plHjǗ/鯜t>ނt0DmI\BǶ ay(#NW؏0]"s!/ugח+喹JR-DmatFUȔݧF帽g\x;sieӲ&S1i_C{pK%PH<#td<,nGmKѸg[#R*[F'w^;Nj ;x p4M3 uMCsv}Pwir6jQGĘsSҍg,sSH?uL@| h|?]ZmAO=* MF m4mЫW:nп=-K)gn=}m^hʴ+})y%"WB57q<$ 0qќq/ׄg>o].l1t3.ާν߯k]Wpߪ rk~O{>]5J;ikrlxN=Փɧ^R܆jTRM&,Ku[O^[BJ =-8,cĩ7zA4/Pl!prC*at7}UTbx@Q͌} MQ#^hj"mUtӐ(*IxʹȎgGc<fxPz!N4&Q@ሜ- z + k;_YCjIK.S>)O [[%CSĖ评-sd ?:䱠9T"so4[K2Y >_1?\nY560=zOް걉?JGO'`9*YCiΡ ǾإuN8߼yu9 .]/_xS j5ڋa ȇoz`XRW*eQdl2߼;,׮b"ZO,Ӡ]SJc6SŨJi|.sX "9pR&Sd;Pkpl6IJl?2&> 0?3MLEǁX@Y?l̅\] {H4ɏ'l6eM:?] t 5-J].lb(/Oav؇KO{w? {J|,v#HK;ۯA飝!%J{rHVN.+ՠ_]VhSvJ!pګq7G~g mTrJNr%ԯ>>ԫXR}OAV*9xXC_创Ux(%po1Js99_Nix&j#%k^Vz]s;Hn&qx: _ӶNud$C,3o9>z0ѐ.>&Pl`ɬI UL,:,aH]DaE77V=›z>/kWIlՈEרuM|kkي7M:O@Zi7"6j6BOB$j9njV=ZmH);:OH&ndT]}5,=p6ԇ%vl72 (_\/ݳ'읣n{9 %R1ac:&!PRAmy䪐ĠDI)ٮ#ەFdpwē +ݭc>mq!zd`_F9"M? bjGp9wJrxNiL&)!1OԉHD iŀ e!yh6*bCzsIs@HQK<"{2-cXype]Y/^eĊ=SY즄bZ+5)819$ e .?lƨ,i:\b[TRYz+d"̄CL4y:f(hF!Xch-AGGio:F#Gf,o{:z#{D9j7(' dPR$^ ^@ |e"SNQY$ ;;o g$QR8qC:2VQTu[gYT!/{]o µ-9ƕi`/C7A$Ht$ZN׍OW+ja?sar_5\(2aK_evsg=U &Jʄ1VUcIM0_]#F]-Wq8PQZ`h&?$ba g{!PMh {A6b{^SMqM1& M4[R ue>x3M!0d=xn9*^^PyhJ1|v(%j Μ3ّj:R,O?9f.Ni,lyDK[JɦnvJT5CF@5jr0J&E{M}S;CercR?8)"u"n6]j#KM5ռtyS;ZZY#w7ٺe=[ts*MT{dzaS3t`1DZaUS?ǽ`itG$҅Pd\ P ]U[ Ä]ԶgB؝=Sv'd3 2'#xm k?TcK z*}ħ 6dk kr&8OZ蜿cQ8/G\-gSHs R$3<ϐ #Z۟EF*^N&q/0 I $8Bu,pY/P5 \ҋ(Vy&ǂtYVm pCXչEaf|#8k2x!-3,䊅X/Y+zh-jqr1]YX PB%R%eO_ VB[e?X՗P+LpwUk5G֦'aUڄ]Pn'-גܢf*lyVk4jZzP >G?{լI6( Ј縠 0 HsjRWdpg HʦrQc›VyV9e= WfFGzòs@ZU5[ͻR((P`ǮMkFSwX8mϒl՚kQb¢82ྟ͵Vsa,jW#uyZ˻I%n֩:jթ}k=5mIPԐ7P ـk4ɻřaֿ=XWCͫZ` +ڨyy6[- my?9۟&yl]i`4)!6# `r !ѢCb-r +ƸA`!zhSӽH`e1H=wGskif{@gf7&dS4Zpjo:'S߂Iu=fǀ}ˆvӑA?[Bս(oϋn7w~ )nO‚s8p̤y0P9{wa0ja{A*&<ӊhJ4'/Z "iUl$+e"Y!zܣe`d0,< =&iB:\/_ZӀ|nL6#ӤAYMVfo%F5bVD#]eBh y!T")!Vdu l<>L;tF_f8ީV$yw ]}.\L:3ޟ/#=MExl:Pbj?xZn 4*-t%[i՚BMDۂlMC["kFu78K X~G 7㯄4'Н^iט':9y+$4Q8//Ӈ-wb5zcc!rY}U!y_S8H]# %5Xa2Z)>L:+8' >loڲGl&?K{LPVUGQ`6U||x_/!{rJ|m]/Gg iF˜\HKr&“(/jo^M_^Jp''{ HٳsgWٻhLÆ_Y͉ы>R2\pf:ed^&J9I$u)#9g)g!HF*X9@O:7h6} CV `5z|7-9tx3Wȗ}{T C/S[[\_-/R+q܍rtj$@\L_^$*l# sv[#HIOEϭfO~9/1Awh=U)Ҙȑ嶒_DjH*O-MCߨS 5cf!Uzz~G K2AbVPӦd8&o/F7\KUȯPFNui)`%wG"~ݜ5cV~qTXTҏM.t[8!vsCZb~PEr# FG7e:|'%puqj|گ\"? -EZ=6}dOFNpƧNsb$u#S\q@ CYxe$R? `B+m818:-sd)5D $LsygkN~(-UFDq6U g_y>ˁuNHrp%-k!Po)ѳq{\WNtLNh&I8$``pn2MH^9BGvۑJ7K9R Iq#Ǡ$37(^E6ld/C=6abОy:[Y b&N@1 Y,0h.<+rR"9p:n$_$`;U`MыmB8ߺbx'ЍA!d BJ=L+_y|&fɆpEУ#(HkAXgV 8-ֵ p4eAPQ i * BT!-=Q:&f+ Rֽd:uOAgWoFyVnFY oκSCkɁll<_c-F?Q8:A9bx4 )3M"6L#gMYj{3'X MƉɀ(tB|"qmٮy['x&idaQX*p]]7IԾ=BD A-͜`x"TЎ|U6 7 6Ԫîip{5vA9hU{dg6Rͽ4W_<;-˦/>lD $l>mP,dC9J0FP =1 nj7f=7/ĄvO}P$/O{ģ|"B'qt!KEPɆ\1L@_:G=bnP'r/2 /llnE948þK(Xr> p 2}fz=̇ b+~n 9{MbNm7o&{XS~5VeXa-@3/ڠ :AQ  BPPWB|uE߁LʢʢOY]]Y2E2jEN[~C_^nTr:/nߣqhw7^q76.CqLJRղ MKZI'Z. #@/r HxM>}KD"$:fSCH5Қ|S$rHC@;l?uD׿P'JGXӿ?ϦBaMEiH!.jfYa~{+~m&D |X:BCp o@k7lruE٨jOAt\+" "\*ZA-ߣB07+Ê/k>iG9V.y% L`q;>u*!%F(S;H 'gD"!ݺ<11H#sbTquD-eT, g/ f3g$^-;M!91 k[4)+4wu&|.< vA<+|z4n} 0$/s%– $cex&z J | DƘWNޔ>D 椖xw~#8,jpU <9S0|={S?ӧ706wE ={hP^Zа>L 네-;j֐ٱȬˊs85Эt#qS^Mz7a%B~ %jW݆^(O1€n}1n`]//l">Cq>1xj6_)Zp!C5[^ fZSVӕ/CC?̇3D O~qp= > HR<$p\e6u}(RE5& _`s Ɣj/ 2σ.bj&2~?X_!>GT;&.:). صb]7,a| aVVaG MV &9B=9EFq3S6)'f#G+{+rELNmFl,̓7`8z?`NfAxVz:Bu \7삳 xiҶsGhuNf.60p:x0#2Tx8BM=d睪>E̥k(`eʰ!` &{SYJ=V3wmLыoj7c\Q_! q@4`6}*'e ŝؾ; Zy-Vj֛UQb_?n"֕7Dz[¿Q^k^oT6۫au TX* 0^>"N?uϯVMl5yϭ\+ЪzvK#a8c{d,neo~?*!PP+FG7M4zF1}6U3a= 򢀳P;jiIA~xPJyx`AVJux6_l0V)_ R# 'jtO㿷?+W@ͽd,)`O]iC jfK/V[-kY#^[,jŋ|TkIk|XLjsd~:h_pRx q27eARXþ;wì*9D~"lFyu>S?=٪`?l _! CIx`\0csaB&0@# db".F\|G\Zܧ* MFW_-H NDZ,,gGI /_߮/jv+EGU;yW4hjHl{ '7qoͧ-oE?M֑*M㤺u0Bh<5{6!Sg\!g9pq\YQh#?PsѿS{qH!_飘HX,a$tX{5[h %GJ(..OV.ߙt% ncUidI>숿N:ʒ52Ul{FJٸ,V(IK3bq4dRrϣo=WvȖ+W@͝E%B;)o7dxPNjT!Q qC ݀rCF&dM͔ C&IϛL2OYP2AڔҊ k)?L%騿OURrZ"]{'4KKxo=W\+~P);(jf|o >K8KH/!^j m4 G%-7=;Ҵo+olx3al&G Q^0!#)w|x7Nu[z]pfyٓMAT3-S@T* 앶bg(26lS YyC^Q%gH~ċ\ PAA[w[[i_g+W@ͽD HbiXgwoi۹|_nn6"H! /͂}l ?Uߎd qn4[pOt=[ oy\5ͬCMPw||wo3 .#f DRa  ={vفClf~]gEIrWuŇYyIpvm S {vCQUhPD*z4SGq4UifI)i{bcT֏MQrƿ3ƂO* B)z|( SI͋lz=>S訇k iV;M Cn'[ B5z_o!`BJ]J{7(- fd3Ui 'XƲ l; 3b/F7#flBܭ)Vk8X[v{2c*U욌&v 0<NZT} B8~)]|X>Sܤz-!QT k(l*?l"(%v[]ᶠ?^ZEm}z$4jf#iIa:KSiu"K[3T}#˖1ty-M8 #FTc?a.oߕ4(q ZE;-<݂sl77m\+vAka -A@=2zʿl+a)Jgt#^YF% IcU$VD~YjUHS%m}Kq'j%uЙTʹa0#MRWg&FNK>"+u3p:\=qx|;oQ97?JR( onv7A{2gØ1p/am$v#t?lqf@Sn<9QCԛ rw#tfA  6^{Ҩ ~un6ulޯ6n=>+t1~KJu6{s}v1WɳVOIU,67)5\ᆾj1KWM,nI]Q؍] Cgo؎(tѦA u\XmSܩ|kpz==lUwsO=,1}8L[{qymD?l߬ϤGj!a= Qm7 l^ٿ R3'-kEB& ٿ5CEq*I~ I*t%Zk_Wl{$o\&Ϥ<*GA.r5&\o9[evi8hsi'hѐoMA?y=+7'p܏..ǒ'z.'+v&@ܔ]bUU9\t\p,KJ>,,뛴vxl:ڨ[7n{_OTPwWpdTo8I~N'<}5j5^tyѣxRˣ_i*F)I#W)cu,sV8W"F)]/g{]`vLn篋oCgM}YYzOnzWKh 6|H%6Ͼi־+Ͻ٥͛naZW>(aw96"#. p?a4lB"`=, kfO~Zl5'/bG}VﺴWPJ|P=_if+2]Ut~O?dj2?G23׾KY6;;&rˍ|yc_z9o8 0SN~ @EUq1Dx tɸ0t@lz0|۵$bz3.bw%'zڌ'C;)AJ6G'L,]`+}aT!!oծS!F4^m*K1jQAqؚ9X'u ]Vp3_5 _n#mKgHY߻?~/LoռGKi_>6nX g/zuꇧ޼|UC99edTUyOBzdVzNWC'pdګ@PþU 0L Q9!67 %HUu1+CGkW`DNc`FjITYƒXMCm1>f.n~JH%}V6;5^0%h Q[^(Sf?&5j*.ƒkZ@`7EW.YD2Ք\ɏEI8v YS6] -}s鱑oo;c5o_W3͈Zè{0UE2Uu}_Br8`!Um%A2TF*SXW!OI$v_m~xU#Rgv\ z{|>fMHTΌOXC0MWVkJLcCemh%`ccЉÇJn/fm+jz"Yz?wI[w@A%ZW~aFMNʱg{峟 $BYF.acDžh I-?$zXùH=$.YDio5YQm"Gx3Nrqe BIMgV+e5 &dncҔ렜W$,'E^D ef7tu V8y_|4BjMaa-&Ȼǩ}QCfgW^2U9wϭqG79翆QUhՁ|OOPdtN*X5H9loz15?hx+蔷X| Xe1nʘ3j7>h,ok>Y&Ϯ'ŻjR?Iۿc#ߞ?x= ;ϭR@1%gobEUy?>u j#1L$bK0 LF/m @#*nB{*'J< %S*znѕ8)Ͻ~a2]q?_-;=`׾y6ϋ±$}4 j>r+{ˁ({R;2 ('Ǔ?jwCX !X % gU쐆7K_۵/0;q#&(ra'Ͻ$zl[4z!'o(xGo(^ӱO忯DQ $;J|cv{hr^'UQ?Q0N~WvNUsz#vyT+onZOYkV_s[96//~xՂpz5n.@utV?o/^~=Ywnm?OPY$m#L9 (Ҍӧu7,[0e~TdVgo^= E/U6h_-R/勿^xקU{e+/gyoM/qjܮ,XďxǟOO? |!piLꏺaBc|(w~xRh*-5l:/o{6>d|*OoUκ^g}[86m.m+&?I[go޾B$ ep  Ep?ӱ{<C: ~ܣ{K׺y~۵nt77_綅n>,>,>,ٿһ/oq׹4箸4/ >-;M{-ܰt>i5y_zjr}'6ۓrl{ߨx_F?\|sL0"vM?W6&z_r/_>(Sr˟d_Q%=xAhϟ-L~lN¥^w᏷~C5QB[_O{WU#$a-{g))y/k,-S&LϟnKSafi}ti:y7p 7b$߸ }cdRZeVvv_[9F~8:{T|)LP|7x=Jס~EQZaǡ0?>_>=zL~()m=YY|:{Ds&K3eӶ(nh3j's zWm&ogvo ķZ1rg'L;1nV Jm+8{{Z8;8?XN{j@ɐcwc"0;]- ߽xۿۋ7"zWqW7Z]>yK߯~xjuj˗Bk*&ǽU5yo|ZVN:]Zzh$Ѽѡ<ʀ6^~MH/^Y/`vQ!ۦ@qa£)w|rkaw?xiƴX?՞cߢ'X?[~'oXm`}?:w[Xك5Wewӱou &axܤÁ7~ȮC%T2&_ʄA7qT"f dX1 ~/ckk^nq(*_*!1j@`P!q?jܢ6v1'˦Wr|uy3>MK.c$7~mȏH#=9VoWr'+{-7%"^B]Dh_8@sk[[J-B5ˆO/ݡİF5—)|J G4S{\'Qfd0>" c1qtF 8n1*Ro cXX\ܣ1ȻaS{֨ȳQ:\ܼ;czl\Y?mXm`];5@b`qwU)q!"uiU?F);+*֝{H^d[eRy$i|UZd^iH[I>7q~U(mu񓴎nbOled`7fUVJV^ʚ=j,zŚUj(q#UU hЩ= (F4cY4X^>vE=ҥcjcwǮo;hcǮ׏]ՏPx_"?8^.7~l\[j?俭 Z3|,:}. ku#oS ޵Kcqo9gqoG{|߭ `҇kٗDX6"lݤMݷm.nPn7aJGr6co V3 vV8b^CGŔ};#Jxf|(&?bbZU<߮ZMШh(&V{^T84Qx]1zv zl\[vM_l. _O˱۸]vy@XR b-S;k\ޘ7F{uFgJtLh8HIzuqG|'掍sc?V_9VpoՈ,rؒ/;j"I5(jh2h[klR@)`;g;Vp_}a_6=a_6nLǦi?yūwD(w&)Րe$T\TRbu9v<&4Mԁ\*f% !wPu4ʿ C}C͒H YΙ߈mwW .+jPsظMSu #ewVڑE?򎪍QRaXI, KtCPmF1Qw}QL~c5w]ݒh{X{j2[9G$C w(ܡp w(?ywбqoS_rEO_y~OxU,K޽A*|2v K`TL.)SXu!?/#)} yFG "tB?- 5CSQʯ"V0~)ߘYNұio=ߗ/ߨ3تV#JÍ+sT-9n wcm6~.V]}>w?9հr޸Gy.joVdlUxh Wp> cBtN=81!Bc3rh= UVWʛ Q46I Nb3i__`-qߜl0S0vgV?]-rv_| mo.V^˧/jcf o'c)UlFœ.PNЂ]dRc}L1ʇ}ǧ/V}q"JmYM/l83E%mCIxq m~*x]V8ܿu5ob'vVM忠!$ڡJ9&!1x[P֭*`P덢.zp7}",LXUDPxuّKX%/jll6_?۪'+.Ʊ=&Ue*IA^*N˪Ue,HR5&xت\V/X5~ؘ*Ul*}}EX&*'ꡀ!6 P7Kt_K%(\qp ytrI~-k Ueܡq&G;kNJ:?|  ;T|W/`MӣP!1"ƛY튁I#n+WLeNBglGl۾xFW?\>s ŽnF$L)LXңѶ!0oUTP:iԊާ)m#m>ߛ~T}s\~Oz_|k_RSOO>>S3T>~|¿~-|}[t?X|C},~sm?zTKk>TrǞj~K?wTj>s}_j|gCӶO5.k>l{>|<|C}{v/}-ϟj~j~Kk>6_|}cs\0y4Ɍ`t \>s6ƫd˹C9w>9U}T VJ'ݛT YQѴV:W.w3k)R 1A!_v<&*jSΑQ+KgsѷCwq?`?JF'xujߨr } ~|i|mHktn9 *}׬ueTl}l/U{6iW5ʵ1πz|mL .sVs~K+9(?>Bu|L:.QTqmc=Sm?衞K:CJ#xdi^e:6h˨J4Z+ŊUj^EԜjs1(}54><u^9yŇv7Ivns[[=Qmڜ4κٷH׾1/~uYiRbjB}d_^߬uJ3tk]G3ϓ,^^Fvݵ62MmNVU>q\=!zʹ&J&wFoƷѶAҹzosaґ>T}Ll]HtbAFXjcmmJ8q:^Y"ϫN Aʷe}}$Ÿ^[1$7wjr4o}.)xuPOHXu?![e15%,жȔosOT^)ƴkR,]lm=PK2;? xKmZ۞"Les+=dyid.(L+ͷUgmǸ?,]]~ɷ2p]6&TvÉL7&s$QpwT,d^_yM&7yL֎MnDu2UeCϑMK¸{ll)-<8Nf :&Rǝy8kedEhtD|hW2Mn Q=]}C,-]/ybǹyEQBKCiu4rhDMv7~<^u~Rh u^J:..V-o}'ms;DkEa MG#okSmZofm/f99q><0z]v'ڻNArHKItٻ5%yT^1e8W\2!~DsڡH]R[_jM_)S(_Gttc&u.= &u.mQwR!6Rfq~Нf)oz7辮SQfL[lɮOms"(4yo+d> -l|{:KL7'Q5Z> ^j2|i8\v.B|Ȗ`-\>z6 et[VB=KUᶾt1@s\*]^fl{q7L2?2BVC{Ӛ-lJND>Rm Mwm>("|w~L{D=b׺w5q£='E7Y 3j2atd 27:O}molKݟd-1En2RTCڻ*Mqu7^AzҮٝ&<-]t!}X҃1r曈qMmlȾ,M:KߗL۸$t۩#[}튲5튼N~93t]9gRV/ɇ粶!Y3`ۈ$lt", n WLRMf&˺#ѴYb_әبQsZ^+VVxm0:evgzv?!<?ၢv2f6.y!6]?Źz%.C[6" l7cuQϓ>6t כÓI&gS٣}׸eT_}0m6i$fv^D2I1Mfg 5>kd-O͎$s~_/m 7YǾvȦ*gMbvKU.0 4=eYw Еjv±>YY^w *Z}Oabp&6_ZQͽ'NsǜZvQ}>l}j(l8&!7?]~|}dKm/kzz[e^N~ jz+'(v_l$"wlj9&u?6.ܹd{Fi\o2Laú?ٔ6[M/S4ʆ upߒNǶʉEk}}O8Nsc+jw>ױ qZ~s#Pq؂}~oKOr9 ugͨpˇ^HDcMHSk!Tu7VTA+3 GpjQ=rR 7X^7w[9Vp(+V5y#yw>oԽ>>VjNR+S}ߧJTηO^/>s#?>Ksʇ-׷ES>Wzt>mko{TöSmϣ?ޗϾ/mҧ_ۢwcՏ9;(A;(z x}ZAA9] |  6 캜d;lxwP=b[ 6jg`Gyf;`Gn; 6`x`Wr 캝a; ;(;(qAl3;(}a[ v]wP3޵`w'<6?nUL&džZ]GW7yu @bUUt 7 !jDOI08='|`lA sH|!5eWw~Ooԗ>*/nSGXF*jS*/ND3|,'|f@gNǝG w>_^ ֆJtjesE&bYɉCߟ|Y}Z#P JڣƓ4mj[+QJ[Rt\iڱ^|z~tb%6e]_vXý]߱wy<7;fm~T?u珕[> çcu}̯M'k_*x|P>k_-o},>yֶ{=|Ï5~|*9cOZc ͟}?5SO5>x}nui[xߧ5=j>n{\|}oOŗ>O5?55~l>١Pߡ֣w(eP;z&́ v(v( p p ;2Ov(#ߡߡ;|Z#v(uP3/ڡzxgv(x;v(Px.Pݡv(sC}C zߡ9C^v(uPGu<];xw|c#gAql^ {~S`W׿|qx?Rp<10~zsq F+=[68_ 5Pj@0ZedV'XZ֋]% V8q!OUBmB"BGE!=FDXZb)3 LrC =ݺ0LCV}8(t?D(M~QEuQvQCacAw/ATqZDϗGE.J|.T ':y6?R켢B4j:ITS=S*H1Rc5qhD<;P'{yLÌ!:}\N2ErVQqJ42X1[-F4rPDOIPhNJRk|[@,9: m)ABBv! v:HzbSdh \N^/hZ:bJ`2zq>WpwMo MGS  HPSdǹ^Z@:-BhPaNzcBWb } '"JTmo؇Dşa菅n=.q%yH5;J#OZhD[V&G: _Gf{DQUL-[ u . |/7^*tƧd>ǜK6yfѮ[/ȗ6.xp:%OeW7C_F6O׉` E֗1yd%;L \$1lA 3QsdtC#&"穮6?}FC/f0GNVF kPf`0Ē.@uYD@T:OiaUJW+#M\Q` ]4OįY7%p&I"2gOe`tyl*bl#*8 fej- ʪm[#,ceP&4N'kpNHxgGUitᳶh[CmG 4p̐t?dkD<ӝG&L˾|[@`0sLG)>##K]4Ч=Ay^갢0$.Y S>N \ a۝zQ=tLc!St_9" = 4 &8pڸ@t02D5}>2צ"yчUbR F #1X., O%9tx7m _"^(k"d؉&O,m'fIҖ-&Y=Es$m1- Cɲ$[ֹ6}̫29GM6 ů0EIg:R)ȦoGM"y*F-LJ*$M{U6u" ڒDs}pYF%'ʰ(Z"4Eqt,Yv0*ǟѦ|Li˶EAHB!IAMȠ// $oN6np)YM` DcvYG4X]*ȎYqs2,:8:rL ,{i_Q9O2=VWQp,({ 4H =p#F@b ikN "I'}b1b`DPj2? [V7!)M2,ZtF , 7{O)^>}BaedQFQiUmC"mZ!MK4ރ#ȒDJBaȀ#.EI:=V>jьnH7d)X8,B,!ۙC 6V','¦h v2r֊M"Q-}b F1>=lֲ#o=C l:3UyAOyFlBc dMt$SN4qaa=ؐ==(-H$I;[ze:x@zu|B~jjI}%bh`eSu҅J8id=&`xK,N(+=H:CPfmEdbSYYe4P΂"u4 ־]>2 DӚ˶H0Y ">C2SikDJ1Ă5# ꃂ @-RdKU4ң4l,lQ ioxZOld! IL!v0e$DZ衖 ջ0 r"4FH]I軼M…)л&[)xe+lDpBr&u% 5P֞*"K ns#QC4`<$Zkt[u(V;Hc<dwlZ`^ v\E l[* $AZOO]93pp*G%fWmk;3xG>C} M`"BC7q0D2U+ B )d}R܅ .gAQDRgB'yKBpJyW3}XH4j@E͋a^) yMev /;rkDޒՖ:)\>EWGHPd$$j:ma̢ ME ˷m-XXRo⃈c䊗/W\]wDVHB(qF,iDG j-8#=)4>d=Rw[ִ|әALF8S s5d0ؤ<)К&B'ؾvoEQ) )J#–[%$dwHUI n]ah @Ф~KU[/tN~vf"/svQ5/4"M rɊi S8W6p5\ї۫hi\q!^Η++(mp`5Ec))_V8N?u `0.{ewʲ' dN@+Y~FHmM#瑒ibZGvl^[h:ȗ_ OԷa~:@!lv2R=zۉل]8a1]Ć6*3C7`I xx.l@ 7.6PBY7.%1pІ-:r;9D𽪾G0UQNIQ; LdA0䀅1 $p ^]c`5ho.v{af H!a\`(S8f:g($hWR \a \ ,d7`yen@b{8Yi8 4&>MKyށ4`DKEcfA[6!sbsL$en.}Xkrζ')aGfn[zY5#xR)9!&w Re)-we$yj-m@T6xgG_dc)[E0pČQ1ۂ~ޑ}JS;0{4 zL>sId5mZҡ 1~bw[ɚ "fNgvT$<,O8Dߗ=f"&ZKhkv/OD& f|(;Atw5BO=B彡߲feo4ۛzayP,9t.`%~Z&^p RaQ{RVL{"'Rqc{YxzCf*i`HqTÆzy՚M.^)39ڦyŔ vPnsĕ̃>5f% 5XDDVY]1:[AĔlEÌMt]hD:[2tsY]:8`9AyMEAopĕe@> {|=5"f"2OO"'ƉRˡ B`:X *& D6`,Z˾5fqI} Ql9%{> ioyԬT0L"ݣ=6jf(Dk5Ԁhٳ l4 V)8nF,VJ|<@Ȯ 3 im.y|2M~$8,N!-HkpO"OE]ha׳HֲI Mb jj7to* "\spAm':(I ٺ#xp !5?ELв Vd"q\'QBvzG.W pd'J2Ne=Ee/1&1߈gל (< ;(@r֢Oe&>ȃ p+[L[2 DlR3ʹo",Q R((&ǎ.A L£=R3slrsYLvL[ LC ҃XbYd_78{czl' :1怨b M\ x+XudA@.ɰ cO]H#d A! /]" MQ찃{DC]44niG";噃5L 8.Aɴԓz#*OzgI Ii4XHfgrOo ET&!Os\F[-4?3q9Y2j:9fЪbODULYQb24TO+}*lD)+Մ #଺TdQB AY^8, MKeN/IiE{5IEcJIS(<YYuEW/xhր5 E 䆁mUvNӸ(ؘ}KXk~)5jFR#|\-6C&сrEȶ-;BHBZ \czČt%)#GDB<f>xPPJDCp{4̏hL"6'1M .I9(27TpWדPE•t`ES5)'07HN ; |i)*sNQ9O'Jl/8^R9޴E [/ȹgM2ʤńm!;qZEVY%sA!E;nдaWkшf84S*S$2 R4 E"10VhH܂dxO &O9gCEآ\s ҁ` Chhu>LzF6܍921LB+< -hl|?y*DtC ġNg0M$%0YQ̓b#DSgB-C k$L~S@!L!QV#KToa_E'",eA 7C B g;Fӯ& Ŋ}CipᩌxzP'`Vprd%#-#q)asnµ L[H,xl!Ko'hD DzS2pb`ysE4"KA@$#γ')R^͒,6. @o%7 N;`˪`# `?dP+g.H8&c-oi+K(0trܸ( I@"Q P􅜲gq(N |copf)7]L喈u 02ΘK c=d$p*Z;24 =_*cNXVAQ&)@v0`Dh1nRaܓPRj=HkN4a4ThWvd ]2]dr8oCE,`/ 9= 6Ȫ4XnB9͈pR: ,Q g.vWMҲf(=bƩ.Wd S$͓<#BJJ⳱GeQLgsr!(3 2t *\OAQ.Q@DH^ɘLd>-s[K&f/D^^jr`f3!PQB4c7ue dR/QC`ַ5#陬0A#}`"jy*1&3ɉC] Q-eqHd498Mcva)fq؅emzD\l3le)  <=V0 7Cnt7>EFcPYE$DC7dF0մ^`E, =::V=""GR' E}Ȃ)S :)Fι ZKgVO12_O.d h1W:ct39kIb3%̶#`Ee.x.Msߒ!q hA>Ş2Nk֒RL=2<+RD0҆6J-&w2Ht`!o90e)rsM6V !vMdR)doMZHw@Nd7[Bkx#3lY> %` /Zϐ6 P~`!n9ٯ VV"k콇=P%&f6q{dWֳQ DQJ"zr \~l$xgv @tD1G> F8nGeːCc>Pqic7 Lq3, I@ GT@fY D$idrTAhsRdz3zRǔ)^[  PaI)虏F!9.L"i#"FXIkbFGG"EECŻBh}46iNQ?m+14V̹0%`"k.*" ukհpqD;ULHf AƐs-%>8%U@,plk"DOd)l/ƀSSO6Ҟ H|$b@/Ù\P"QX HvyKn!tHY..Qj6~۲ZQf'W /MKuߣL#ң~#8ϪFB@Cu9Yv0Kq!ۓf9y@0t~cIǷPF*#O(<[ qND|)+Ar̊1v`B0LJ=UQ>>xWr+ $ h2oNe'9i1B4p65O0da*|qACdE OȲP5@V<) |_ 5L>()Dpl3nRv\TQ%| ov 9֋nA%!І*"c14 Èth79Efb}b {ZET@⨅iy`&Qg8"?>FefIn%zY,H\ Eytߴ i\Plv@eaXXAhz.`qI{"v{E+}V) D]-Ϡ# ;0}&A6 <Vq\%B.w@LR4r s~]F]@l_@ \ ;@!񽃆߳9H_rxz5͡]Hyϻ/uΚ '8-h]+C# XrH^.TlGTtۼzq63/D%420Dd/ #l!A|PA*DdxX\+BdaM\YiC3dfjPgl7ld[hR$\ >6SdF 1Q\qzE Wn"_%(ִM0ѴU1f`@&yN0'AX aAbq#=#KH)B# _dq#Ot~@|2M\m(΢dBmf(1@T>pѶ6f'hw >s,̀Ob/6NJ[{+F%>q@hԧɬ/H.M#蠘m!~kh$ФO@Ĉ2mNE0 #jsW%m9Rߌp ʘvSsي*-xڴ#r`B Ct8vM`:Ce#i0XCNR,NVv+ᵠ!=jb1k(Aj5b@Y/%`<)`1ieEpi򔩃u (DQ줊 x]߿6з~ jޓ쀸I(vx#ou$R^c Ňn \{pZ"Y/FY#H 0VL] \ *Ňr/l/,*/h Lﱔôgrf-2 3T'14B$ t[ˬ@2B,*&Y+7CD/%!ނf9漢GeǐŸ8ZNV}HC2Y+7gS<:Vl(..Zp T"E#-~'8$5"Ki2C帿,`3@l2H\p8DnM\X@{'!&M)QTϾb0dlǜev9<anAtmЋ;C7Fkuo-;BF3H.褴B(:mF}¢c EkY>8k@=)a3Mip:0A /i I0Be8:BGH$lB[slEWxep%#`FMhuv#[D@Ra;ED5Rs0CU)Z =kIK`pP:!Bϰ2Pm *b! N?DJ$GO!S*?L+9d.;g@G~5XE!)(3:2lDSs0S !;섉oZA6 r!׆lnd7ϞzB=)~,JݞDd46!oQ$F.QT0``'89~ҷ9p'&%|+l= oΛ++dž\Jee}~Ke&'SI5fN*HȄdPJRB²kQԨx-n2)m2]yJ+fiI ـm բr<α %c)wzZXd i*{**MȪ2|'6_mȕ[ʌWD+(3cVg|5k'bIƍ/+W"XlHq5zevҖrIc.^˴M,w~ e܁Xx'WGD$3;c58!02)PX0?W7'wtX^9먚QVu6A%-ة*u?;O@gs'eC8$ed4%wFhxqH Bd_^9a\i5kcHDF$$jʋɁ58jАJ:XE]}#9Y`CFaSb`<P9Rh ć\T`Ãm:.\Ƨo:sR@h849Q)E9>HZwa8}+AzA& dC)}vVwK2FEʰ(Fv|!1)aNtS 2jmɤՑlYbOL̞<ΉE6$?Nꡛvš)qpB2ѢLJ_ M>F<[`9dFFI!m1 yl #(B !U:9L.^q`p8qh'obt#btqVFa"&XV$ܴxS=(̚L3"WXZR@BO1DH)8.e w5"514#9ᯌsqקCDOO'pRfF*̠Lxѩca2F߳͠) W11cU\a(A G)9[w0L~(ͱ僂,[3 ”BZ%4{}ƵbSHp̀+x,R_Fvv߁1uDF*GQ=0LpRyYpRVdiC"~r#?NJz7ހqEivce͏5O8ezdIӱG e { :p/[IP|GI_@=:I{T$IeDWsE>D:¶#wSϚDZ,=jۛKN.v< Зjl0$C%U h!r;rL9e`"N(:.!$Ӳ9d9VQ.[1HyG2{a>ֈM_6Ю f3-ɖOGiX&$H}r/SYK7 91u[@2 &@PKs Gӓ0 t|TF u%Az6uzͺ b n4N-P.W^sitoyxؤȷ\Mt6'fiLI^%"㣄"LoѮaT $GG&G"t&Urxўظs.ߚ&ED42;xM)@M &E\щbDÈh.|d>PG>-aOܝ C#c,!Ktib7l|]v=*1]PY`ܑ&3 Pk95l ~NQID Aʘs\& D$//c.I+D)(oFMmUw?% 莨 Y*EjbcypjVK/ U)axr &K|$kF.OF$P8-o9 2u[<6(*].y/(wr Fm(Vq9<Ǎs* c6B\ZA !sH/=o\Zc8͖?XGiG996v-Q7)zS }, =d;G )7n2b!"'cq.gAQYYF:gB'dq'#l (jam n0ӿDWt+N!-@/&1gt-+0u ]PD"E:#ۢ*CXƤ^/[7`Ql cѺ>P<7/=6B # qPxb&7q+ 3):F H`?J*N vzbO|YÞ&:Ql9dIʔ2nsjNSPВ5-P-*0q(EiQ``4Ck tT|$Fj[g9x5B"zȲA 8gEy3坿z?6#[e"tʗ(De@w$pP_;6 ,mEa@D3:(E[M3A+812b$`*8p5h΂[s)Rw1 47R뎌p2~{RNE3)}YzVCZK0 )Gd+0D˃ Ubibyr@A-Xíg!֨ep,l؞+`% Iq@=N,P'Į91y"M9{ӥKlo]NFy=,2l[yI Dpd!kSd !+qFl"xylLahё=ܐʎF`j4AF %z}Ur] s}9FD1'")sj}"N8/u(>(>@$̐0.~Ϙi`)aMqTA,¡&Ҹ:Խ) kCpH?ȼ2QcUq8ihfRI|}ǰi)&EEa# (2͡o(΃ &$TNh`n.}#Omrv\rCE`IvGdQ@uFƐJR ٕ:"Z2rّ6_nEf%HXn  Hbv> K45rf:I$.91.5zvO: n\ cjCMPx Bb 8DG3ţTDTR!T6:RRw^I<Tta °f@ v+cQesWQn# s)r,*iM¢a-p#آ(Ra_DO*i 3kc{(6AGEIzV%\8*aCQ<ǎ/KWLCD1I@;05#n%OJ*}e9X DVY];4@R AS=yXIݵvA#C@̂RQ 'hR0D02: o2BL,g$DrC@sDQ̤:\'aI~b"Y[&o%i3).DIb/(\2' t 1xezJf-p8%{ #}U|$rk jf^O\([+ޱIM/R> eS&)yTn/%ځ\f="5f3à;=\,PƐx z鏝;(Z"\ۡIڽ]&M RH3ؠβdϮ9PxuBCَ pt((!E.sXӖְf&bꞑU}G bjrh p=XiQfō{ |0p=*>7PQ3.k2D S&?8g9b,\O]qPY^s*=hd` d+X,WAȂ\5uuc}P'S{3r2-&?(`v=uvpukM4niG";噃J{k@p\h?HR\?IJS$%$10 8{J}B­2HGe> (+iRɚ̔R2`hUT")c^R)PxUO+}*)%v~jb90y=&> =| %zD䗕K:!p "uytW&pan bRdQyz3K퇮\GҊ&T7x0piSw cͯ>p4%p?6ׄ5p>&5qHlS̶- 39:ŁIѧ(#f`X`0isJa8SBT~| (hl 21L׵7`y/rk͹ SM%XJ` T ; \h'H6Ql JR"55nq'B:o9 Ь֒dbo jz0e 90DJL T*0Du".b\L2C B g_yP9BxSkrHOe8 2=1g?CC&JQ$qM%asnµuhθHT^L6ԐHUՎ @Q9 jЛfޮޛ\8z!a 7Yj]B"cG(A) mK[!#2Y{< wyRHv磼X CLF]ؕ3Is$BʁL1б,%b"}S׫-JdC"ФH рwT1}!Yu ?c+Ӓ ~)7]L喈u 02P~d"z@%Er._24 \{U2]@fT Lq_%a!Oz.* 3 *Gslrvmk-IB#9{.k9)$dgiDC p9.P`A6˒(s# lu@$X^ \"g6Cyv3NE@I2.p=C ꌮ8" !CE.GeQ]R>e\L̤e2`{C AkyL t %rؤ4)?d,.PK1<0MJݝn XqY,*(RM]A$$Ƞ8('q %z'TNDa!'=A0`"jy*1&3ɉCE5.? Fq4H34n&|M| a, m6=#û{YGФvľD2(OQY^  = 0i:c3ºbP5BZ쮤,,m! lM\by\]h*2"9$Z2<8D}JZ/0k"(8/9:TCJx]O=bfD)FN̸'| K'@fJmF* 5 T0]%%`DK8_̱٪DEx5jh1Dv^(e,(S>"RdNdE&H@`/b^G2zE*ʼhױ9.dҸDg$; Jvԕdv z@{xLQ$ /6 /.'Ywp\ Ɇ)C Rl➔ 멢ClbDmO CBg@2āeD'E0,c]N %_+ʈʰ}ZŽܤ򄗃2UjR4w@p>G:Q+sֲq9_#F_|9_fUs;J[̤V/J .6FA(8<,Izن K/blSJ'OrߦEUV. .r%XMe3ΦFb9-z!oܱQVK6%4{w ˼%Q@+pl\9m[+rrqMak.ҒZd#t"8)8BPK<EL)34)q(M,^1H+NvU(̓_M@ڥOx4sD&,CN0E&i&@DN FPWC),g^t)V XY,JRi 0Ɍ 0V80YZ1h.OP{3hBB"059;ȊBf#ެwEdKC$+ "ѣf˧ѥ\ED< ^GXP G!YM\5jd (.h](8%):^ek p8 evM+DOd)l/ƀSSO6Ҟ H|$ @/Ù\P"A`!hio'|! J y,.Qj6~۲ZQf'W /MKu%6[գ~#8ϪFB@C!\!-6)hOYN0 *X-  F٨w;V\("sm26ĆP20ԋg4ā!eźޕJ,Ij2<@pSIl|ڀb l `& fcӪ2 "Yؠ e("wА eUMɁGs$Q9 y׳aUH{FU. [ĐvT.vareb(25͡]Hyϻ/uΚ '8-h]+C㤞<,s9$WP*#*Nlf^Jhd`nu<%Ay[M =`s]\P4 5qgaӓef͐ Aqs'nФIk:`3%JMl:gp8{y5覈)[rbM MKQE^pj6 d7d~ }xu)73P"T]ql0E&.D Gg;-#+dP53% =^3l."]|>QЁc' @(B}Lm97m^sN(0L}o),=Yk^b6l ȷ(W%>q@hԧɬ/H.M#蠘m!~kh$ФO@Ĉ2mNE0 #jsW%m9Rߌp ʘvSsي*-xڴ#r`B Ct8vM`:CqX` 9I;c*sZ55S v1 s,ޗ’d}0 Jvs "4yE^wS"p(vCvRE@`i ՁLiF_r[G | Iv@g$x|P};AJDrs7L\[:s)1C7e=8VVQ;NdEښdyW_#)'`f[0)vQ(p1(ʽPl?|riwcyLl:c)i%*Ze.gNbiR5#H鶶Yd0Y>UM8Wn ^JBNsSʎ!3? Eq(Ke\!VnΨ&y8uP\.]#7E΋FZ$N:q*)=(ҳ0IjE*dqXf4)&'G5#0e5h] Wqěʱ4GOdCMRi}'Qg`>S=&$َ9?rx6>ą%El۾wo(Zvf\@Ii#Ptی&zE0|A* |q!z GSbgN\wZudC5a<_ ٓlA`(.pt8QGk"A+*fIdلl<}VJF* 6F9vΉj4qaR;Az֒ؗ$СtC*ae*bA>TBA ~ xWǧhw勋mϖ8ܫ[8}ՃGo?qztg{{;xtooV?zc?49|JxVovsۧ_fB< }?Aǿ\B7|j/m޾x[V>{˧G}ӟ~z2)\^|6?*DD^Qk~ \o'FARUV9P'C][F=Ư?3Ȭ94xU!i=xsxӠwC+Wmh5fzpƻJ0E](rMBOdժI__R*Wy dV.&W3پrXt myϐ?6eTI v-t]7SOٽXRV_}cZξst|UgѪ΢Epd"^ZE^uWo_yyחy? 뫧?ƞ?]x1\=x~^}}/%go^b3ꏐ5bJ/__|:xvwĐ?ʾ`!wP"e]vI_q_e_g)oS kSa6q d \x ~_rgٿ|[\|?.^PqzG_uϿI={ܼR^Kxh7囿U7W{*o.^w?_1%h\qy3wӷo^tNt7U/ד~)2֍7xӧoGw 2"dXe!(/+c?\_\C^ʣ_|BޫW¯_}]NrǗIu0~b#Wr! VF *hcz&Ż Ȁ]<LڄY' '?\>9|WzGǖyFx~~NWn?VLzƟnrs}?~>v_Ļe/F!wt> ڻ|e2>ɳapzo7ptZܞ[܃~>j 3BFOoӣ~zOoJ'~z~OM唹Ooӣ~zFH[Ǔ~Z-7e$STSOm==m[BVR9>i|{rzޟڕ+'eq~M9[ӛL?ENQ?=I?NHO~tF^a?=ߴ: pzo|O;Mv=vjNouBqӴ?'>,M2Q8}Oy?~Ngq8>iqzOO۩{:!>gtfF rOS { i9rZe:nNtwŕ[Ǔ~e?O]~zO =;:}N;wホq;=W,0=WM;Ozӓ'o~nuoӱ^)rWr_yXFWH#:D>O$F҇XKbˇX? G$p#HP_8 G}J_8 Q_8 G}J_8 HUo$"xH$Da!H<$GDxTH<"@#hDH(#hDB@#hDH(#hDBH$"D"HN@U$休LEoNUj$nM"q8"GDHGD⨓8&DHD⸓E$n[DV!qH$N 8!' 8$nD6]H&;/ėDK"e!%C$;DN!qH$"_WWDN.K$]"qh&ZD+5h%ZfY*,2KmUe*+ D~^7V@#qH,$n8"GD⨐8"G18&D⸐8&ǝ-"qH" [DV'qB$N 8)$NI'qJ$N)8-$ND͚rX-+#|^Hs!߷/I#|n9&JB ]Hh"; C$ 0DHN K$,%8888.}qL}q1Eo۱M+G/}{uXma"x@$fՆ68x.$_FB6=!qH#ĽBI'}"qO$jwޥKr>n!nAI߿u[a7D⸐8&ǝ-"qH" [DV'qB$N 8)$NI'qH&B6I|I$$_/ /ė"qH!w ;DN'H|E$*$"_wD;"]!Koq.w-8%DHDⴓG${D^!qH$D!xXH<$;3"qF$ΈY!qF$:o7D"M! 0ԝPwҝ4ԝPwҝ4}"qH/$"H<  DA'AjhP )jhPMTH<"ģBxIм04/ S慡ya(k$Džc"񸓠ehjZL-CSH|K$%o/#1>yh^8 GһzGG]+υD~^|V/x#qH+${}"qH' D>x@$"xH$Da!H<$GDxTH<":3"qF$ΈY!qF$:s"qN$Ήy!qN$;o7D"M! H|K$%o C44;Mf44; NSf㮛qs!߷׃0k@F#qH,$nzFzgEO߿hHBHwDHBH6Hh".$4DG${="qO$D~!qH$DxPH< :D!xH$NxD$G#"8#gDHgD⬑04Р2A54"FЈ2"F1ԝPwҝ4P_P_s"qN$ s"qI<&c"xL$7F҈X[F҈>"efiٲ,-3ۗA4ՖA4efiYZf,3Kefi^X-Ҽ}^XZfef2l_fSwzN_Swޝ񨓈GD<$HE/M &ie ľ [DE$nĭNH"qRHN&x i2#M'x4"F$4"HH"HE <ႅ+ D~^-ч8W>ч!dQ:'9Y΋E~߷ky%ѻtuQ###!G!GCpNƇs2>Eo J [HX"a; G$pDHXsE9XB5XG$ĽN>O$}"qx@$DA!H<$D!xXH<$;GDxD$DGza^I㹐5롑8"G8$18&Dž18$n[DUH":"qB$NI!qB$N:/ėDK"e!%C$;DN!qH$"_WWD{a7$xw~^M9y*8*$Q'qL$18.$q'qJ$N)8-$Ni'qH#ĽB 4 1TcJPӃj L"H<  DA#A~3C~3C~3Sff,X cKh{L$Έ8#g8k$ÚH/$y `$}{= 찦u fOnt'}7$=I*v^O;;)h} ' k&FnYMZ#=P0'CaN9 s2=|M$&_ }ݠzV Z7JA+F'A}a/,-}a/Z^I;\ՔǷaZaU6wL f77L v' v\#6p[&mW-k}6+}=hl"8.}pǭ7q>@ |`FA#(l`JJ%}nh n77]D^#J]o0#pXۥo/v w7} w>aL47'P2zGWzFlcj0#po"p~L fiDcj0%VɦXz ;JV]o0#pXd%78jQ0ybɧ f',%78mt<8-tqU}T >3Ǎ>@ fn558ij0#pX<@ f45Xww|G f7Xi#F`qg3}a5l}|,rjNN\T@DMD؉~#?P4@ f0Mh0a4}y`6SYq#x`FM$i"2Dvo:{Bn4l7qe[]ʶei1.DOs|p%i*2Tmae06v02vqww|wL fy?S'MSu aO ӧ0}0}Z ӧf>d>-EȖ mXJ[o0#pX17,[rZ%PF`?P"C9+٢~*E2@ fErVEqIg"3m"l3e"+-gM=$QlQ=H"S3E!gY6ɉgEN<[q-&i1ٲbmͳ"h- ݴlYLvq16y`Yq7YqJYoNvѦN<*x؉G6}QOh&dl#'/~qMp\>xZ ck9IH'̓M̃ypX&vRX"K;ּ.L15x, %7]J178jU7j) fn5j( fNEI3_6j& f4"`^0rJX%.d%5lN3G<(Ydq#8JYo0#p,2AkJ &NtaN09 g2dLMPg2L̢ɶ@)Ŗ@bMΨ8?c9)L 䄯L`LZ 0sIә,`3=i;"1G7Fd'`n")ae@ 1yL 1KFR\c/#駗紎g٥Y8ƘO/^to~iٍcңo.{μ٥٥#v'Nujgn//ݞ_r~W ];ou:to~7K4G.ݟ_z04 h~i^«~;d<4b&]n~KOfַt:ߚx٥f}]Zrcsf֗l1fh>gk{,\:1cvtvi} E1`~ң٥8/:/O?xvi}ޏ٥Kg{g9x44xk~d~iA\K'8ҝKOfٌlzLxYKkFN/=_:_z<ғ٥o< ['avhvɭ8瘣E~9f7e<^'>qъ;t{&l٥[K'K_/OlU\턳KGKKK \4}|`vio۹hfܜ_zou>5Z]eG{~BgokoOxJ}[m%YԙSYoӲKjHyQj="C 5Ǡ Ԉ_k2-=?"i@(FqXihtp'dZp 5$Fk |ZcHk(h謁q5L2MȴX# k@`([LVJXXAZ6=r@pTR .1B5ԧF?xJ#D%n.`52=&ȄIx{dȥ^=M~n^%X(nڌX]{Y}^gkǓuBgrir '\bo>#6вo^Qotǽuo]Ior{ieou\WWi{}~[|oטo#TaCqo6q6L۟טo#aCܺ}A:l[n_A֕uoWoE:lXW?|?|V z+ ^uph}z+cE:lTW5ާL6ȩ?O+ayo~\پϓ;}=޹zO GN_w~+zarzwP+4QWє_O a~\J(Vk5N Ha5\wwhӿR8-Y܇tz+iɐ>k?'谚no^Ʈ:kWx_djoFGRV5?_}/s3a5,^}:s>~ZҪA{iӟZPϽIo]ϫ^qz{iW^^QarWQW&ӫ?GM+W?7WNnmo58:&ӫκyvs4WcgyvYή#?u:Yx9Nk_^κ|rvV/5ڟW.]G>9u䍳.?]G~8u䁳sXNhr;uѷ_gޟWף|uf3|^G}R;+% z+ ?rؐHnC|ϟu{u:䰡\VoAFg+aCJ}z6|+r? Gvg+ۛjym6wյ}w{+ǫbgVW5ڟWqX]hߞw{u]ⰺJX؁s~{y_Ǟ_)8z+Kś8lWu&q؀%lzkOϯ#WhÆqe{_}:p nOz8]8\?su?Mȯ|x^T|Ws.W7Fy|rݼQ}¯~?6W?3Z֚noش:{oyuO^~ٛՍ|YFPNB912\:`QҾFFWB,r_iw'UFk_[&{>鱸>_[5mحmhoMsjNg]+}˲Q g ./~[­e"{nq60׋yjp^_y_^("6Q .m㉊aI{7朏|FZr/m܋:7M7X?Å~u2ʍ5\CI*7Xo,NRHܹcr?ng1v]{V=7J}S]ʽR4Ig>..c,c[9VSVw^<{ff?OXz߯d_|Ϟxߏ/!7K:{ _Rf\1x?stcWWY]lOSBDz6ŶFnrWg^9 }3'`Iqv{;6msnoXm`mW_kӿ^~=}W|ԕj(^@ShG[l}?٫^zW, -D+?N؉ \W-KILϮb˭fvho>9,s^χxA ^Z n{'|qooWXr60Lt鋿}.V$G 29ʠ(vC>] ;;H+wm JH9fLNt6vrĝ-2RnKїhgJhcR#mKTbj6)owj1i||q!H!9NQ msF>QB'dBJQT+.&\;LxGŜ.c"gע8!db0d)]\Bl s>PZMdkSvzqQ3 m@f%9ЭKtjg/ B~[$g-&Qsb&^61{&ӷE|;>DZo?[8V6i󋧯߬^OeZLVZLH5'$] R3}듎IʼnMtI"]7]{lh3SgT*ڽAj&?w8ڛ ga]( D/7zvv6=ܬKm ܚ7{E7;pNʱ*XSr@['s63jpfU\4NKhhMsV5BC*@GPLNCcSMI6l4bmKrYygKҵSՓ ad$RbI6Z3Z秒m1ZF9ss#vì1#Et\{#+2>?Y%۴j;/J@%2ʘ8Vp>ݧUөhZ Z~ ^K*+sXGߚL'{§e*dڔȴ!́w=>۔: YڌxF.fi=v|9Qx؆B:+j ~P:>{́q"t^gH;;M[Z5L[_L2+ۉΖ^!=䓨Wk|~mʅ5H CsլL*kM^an_g;K8?;^6]+?,t,+";G_&oiïAcm?cwVՆ {oxuի/KdG#/ذQ=4F Q ;c=hDPzQSі/J`t]WI~bp5^! GkRF(ЂI-_;괍Ŭ5=KvNABO:MY$|.^͘8X\ycDD#<'n讲#bebDzww_v1;6ȼJZ&,<˭jE8s<a蒣nYt[T7TϜ:zCi'#k'vo1KacaŸG#F{|=s횵,35HФLTϼin:v,]V8@?Ԑׅ Ft8CR(J n͑%9[Yf+ qEL*IcJP3A?|>A.D0|" {>ٸP{oش?p>{ g?hĺSCF~z󲵗y~c%(K4VbpeI8o/^G. jC]Ƨ^ag"z籼mwt~_U3 ~MM\Ǧp1?z__xſ\VF݅@00rEJ(~  \1劬(ML R\Hr&٬{_]oo_^:,^uo`dGGDn7[UY~xj|՝{=uʹZyӱKW>0]+:W+|%.ymK1P}rZs{^qB=P'*0xjl|-m(l} FQ,8i؃JZuQ:X-2eyr(U}'"~+Hը W/ JeC6Dw*~MڭmTᇋgo.~"gZuM\Yל}skiUϙi1pz"juKb)4R0;pcym7>ױ{߃VݫU^?MPyi]yu v@_݄+fólo-fJs6wvMCi&] c>hbNqGuNQG\X#&=VMj"z{3=j?ې3aA0n48 `ų˟^DJ˳/̟xMX=p-ov:Vp_k߸oVjַ~i[wl\_wVM:?Z__)2kk zW٠Ƈa=6oPc S?)IU.Bzkup /cqۭA9 rq?[>wV $|?U"s}6g[T,'cK jtjkOī@>6-8v[96gLqϿoO)< ʥqVΥY< c^O ISt}Aj`ZJrT:V ?%4LbmC qW 윾]͓S~*ܕ,Q=(r(XF5pt,%_ uؕbA5AQ(%Wdab*WhC^էci\U?q0i*5ugK(J4COE~ʍ|yQ[;S&v8 l ?;ulZh{__-ackv2oظ)fqlX,jvڡDW hÚr)(,{^]uŦV`zBX1TF),Xk OnV7\w?W'B^f0J"S𴒮ǧXJ`I+&ե+Ø xfgTAikWgyKrHv+aᦠRmuG|h,\$ߧTI*N8/nY_o n.[9(A{(1WUta>KW.dNgO8AacA buͰBApS&lR{X##@`axs8>kHKn 'DfE[ 4v1аZGm:!Gczmxe&^g`}Ѐe-0q-r\qz vhY$+)Qx8gyOKϻI[{pymo58EBݪY&YFW!V! .%ҺkawFӕ ݚ׵%{4W ==}@quȚ ZGYs$uSB2C:mVӘk)eHvV pD&c8ݦBp(&/T'EfS YJks202Ɍģ|"OxȀ$nJK6 t{eɄYZoB V NjbG@%lF𙗙ھϷH[йpDQU^&h[4Z=,ac)^vg0I&BN&oVB*W+H5Yq\Qe7Q뱭O: V"^Z3$S>䵴 䆥tlhQXf<<’ qt/¸qrg`4ܷܸmvZWlj7?/"nO ™~2&Oy{-C5M![QhYQ.KG{^:dyp= /t8]D8Ẅ R*,x~?ݭi(#ݷX_cp/8w!c ?߶6HBQǺwCp_ GÄ{O^㒩*8Wti٦3+;\{~y< _?r̸֢Enۚ! |8}=)$ ;*xT.ݟb\C4.翇ABhwGyrL@ jmBd\n@9!_6ޭ9;=WgQ5Ao9M9|C> n<3r B~[߈矣ٙEgYIpO٧.ʊ/ 6|251^l/S3]$xO^TBeH(t5%)QF=JEYL,͋T]W@ ]bs=1+LH3+Nְq,dj3aY R­XY*9N[.c7 Z)Nh?U-@!lqc-qv&|;> RޔxA_nroXy8*2mTZuoeʿ6:7WRʯRph?#GoZ?.a/+geJ2i87EyH4H#P<2,⦅)aMEd3~)%yDlRvg&㩮9e"tgf:Z"'~^5`: dy .E9`g&6` ԘE=ԓҝ胥!Y7yVD;ٕʰ96Jp#C)ŒnL9da[i4}k{N_2 iA}4>'$cs,e;wJTLf\$6q&l{˦ -(oVlQbv9N'c;]JK~"6|Ilaq[RBH&O62]*}$wiJtE }?/H}˟x?xW(2cxsm/Irr5?q2U/֮3m2rWZA1V~2$||WEĮJJB,k9Ρ#J3=+UǙOJi˅wIq*]oir%E1g{cil+eNri>c.\;Տ w4kp>cU^w!:\_VDcj-8)DRѸa%f I1Q1b'kxK75ik P4Ǥ -RRKT !XD蔈S7˩2BI$g1ɢ>c4¢| Rh$Hxr4SKdN<5@Q"n\noJ"⊱f,nw*ĭe#H\C[gO ! l%Wt8Z/ѣ/MmR9 (#O‘Q.0YYhElWK U*2"  ^0H@&L$&N*Mi9KaI,R=Ǩ࣢b%"mT;H硊tZO?Z6&♕`eSkZL;"DT "M] ĮS(݇,=~JJ[C%x>1Btϰd"UDY9aZ}*-N-ߣAvP?^ǻ@n0 $SB%MrJr:Ir"0*ly$~0rR)Qd*2!P aa!YDf94Yl$~QuE`Q*"II X)#M'yEyF*MHMJD`P8Qt06 ^ǎLr&uhbؤE;P8/R(#T6 :Ň2 h{2$OzGtU:ShzKXqI\~0&-VHZf޵C #V,F@E,6I ^apd:-dnva CMQp(FOJ`:@o(c46E}:39&2e3(s-LTD U04Ň :\Pb8] HXiW`\ L49U" ^p 1yQ:2>Zä/&Q2-8s펐eAc o\;<`0˞" Y (ȫ4ڑp^e)P Ԑ*:tho2R[\bK`H K4Ѩo\`UñSaU̠xX0b,g# ,Z !)ʎqI[9lgRb B) z!k̯fgB&(R-L]0`(]עBjP*Zۓ cR}_O[VΙp>j~(jMŒ9g-a{&'4 k>Ƨ o ݓ*#k|=ph+ g6Q=vSTi+8*sƈ8X-6 L[iT]C G߭$Ɂ~ d'Ixy΅(HHמ dZ.FvkO;aT@VA3a4v];vLL"dR_ΠA1 3AGa&VH+%4p%8j9ShN"f=0a'l1|(SQ3my QPkvKp2e1 IPn9Xf"e* #$. FLV/L!E {ر5 I"qQbRÌHD1@\kt3dT\H=+Xg!4e0)kpD ;!?RHB1TS*$F"  e K)l52fAxJ4I#_p?b  a^0`[aOirYb 0t!Ɗa Rv)mCU*)@MrXOE̻IL-!s*.p5 CvԞ$@((e9?`bob:;yj.ĉg!N< qYQ{!Y"#B< 1,I{!pC qYBx⤽P!ͅyij#B q Jc 1,ȳ' P!mT7պ/ GfYm&T!`P`"\.Tdrj[Gr'0@b,UdlpԶ7`kaK 0>ef@ql̜H00!ႁ*q̦1Cb 2̞}+1VFrg5>'f9Le _**Ȥ'E܁%aɃ9d P!kÔ6vؽT @ P `4UDüC\A DkXW#;_PYepxFZ}e@\No]4yzD/u5Γ%8\z։{e8o`$We}{.u} 8 dKC(@4 ;7 c>b1U ݉`B 15M5u%L+c Q(#'띧5=׌vGJ^_Zǹsx;2L9uS꼜3e8F2Ur,\݌e2em21sD@nx kYYq#MKGK&N@ 2H:M0*k@4gyg^dIe6=& M[G37vqNh|q͌,&pR nzdi"3zp %4J-dNe9㳷TV_*`E+Jǖ^??q[/*{3IWٱqJ$ePR9q9ZMJh1(]lyQr>aQڭ2]t$nl|L:8^$љ(fH1- K$;(6fStXbR<%)= +IA[ą;X1F-7;[qe7X;!Ԣh|1a +Y(gk7cfnu&h:)'; `iپIL Zp z}(Hh;d(?u\eVuuC9F7'8їG'i'DzTß6=|ڵ(j+8QhjQ<}foDy\$sI57Tk?91`L _G;h)c?^ǖB%`u +ZH屐`yfBzu -$Xn!a%: 'M VثYHX˺YHH/IBU-$ʮWHԴ`!xB"!GM<[>da5ˇĪV-BU-Xt_|ȖQ4-YުCҶ|0V+!X4$Pj m_W-lQբu k"Ӱh`EϮEVm!Ii%Y4\ŢAVjjj 9T-V-o͢U VnjuE,Di`RVY4X" aͨ) sMa85w^UVy[aع/i(҂j(ʼv)CV*fܷ.jlUUYhkwmԪg-,*|u%X}4xuUk3PSPM\TT5PMAU5>Bk{MU*Pմic8/6nMd#ldw-6U-hq襡JSKT53k~Yհf5 kfV}̻u]Y0qQ~V$)~džuuأTZzU/M۪x) U -m@sCն%,*s!φҮxmJd7Ze?=m[֥q ˬ9)<*GCkUR梑sΜI1ZcR] 7H8_ww=x5$}+Ԅcpk7bRM(.,bcq&vU7S A>1>-3gHZ|''B|Ԅԯ['t(9  |5󮔲V;>F*|e0(©"@{^G4[sGAB2tSAQ0!w<Q$g £W黼qbe]qfFN~32IDgr#gΥ4qt evS$d8|2ՉZEz۹ҊU ;_dg,n٫c4Y_AQR;3m#-C)XpkfgFKe]( ѶJxmfd:ORe)hR+)h9RZs?`g2)-\GܮbJ)ֱk#g) j_l3Rv2splvT d\r1!m7"ݪmd;?Kb 9 m;qfѬb*KI]ںT?gdMf-q5M7ĭ{e踙")YjRq u=؇>!?hG֒$#3HrBQXQR 'Ա҉59._<9 ɄLT@!-b9Hda.0sgodw dd0A剖ґօ;u29fdߌ,P\Ndtzf_6oD#f !pX0{;9B~ 6AkɩЉ]'Ywh-ˣɵxF1WJvT̵t3ʄ Ok 2X_!{&</i& b mSX.YV~j16ݒ$eO iTz4(ALb u!ǖJFij3K+@0,aMЪTv|!l Q,K*=5!?$<u;ljew,<X,PAgE je>nGh,;ثL,[/eV!p埴/6EUZmes"Xje]3A#mߢt0 //4F@diI|5Uj=ra)B!,LftL]@u%Ҋ$S\PLS ͸UxL!HI-&zaܚ<#rX9z |ȫ YݗvD Q{tӖ*3¢UhITvl=(b/)'s$HÖ,@Y4VHŭXwL° 1mwTm>,9b{ YCH[89 ئ I,Җ2vڝ=&vcP;ىswb, @IyD,H);[EfQN  [*Nmš vvf+$8XmP&.Pqp\ىɏ=-E2o?q8TPq2'aRgvb'Omc̞hmQWma8ESD"zzwčcnT[D♅aH /*;)!;}8%ȸ >r۱q`jL2A3#Y6vnDs^4¶jZY3r]=A? Fo=n*ޒ)qliљuiAd-JbI4~.cvV3j-~xl]<upf`wpjbXʻܪtc̾זo W8HIZ]̓{'ܝWHҲwvj^ٔUnlljOxK aqRMxUH(k@?_1x?m?7k8d05TȢVKk+sk a *vr 2bEZ rhsSKZÿ?!ԘW#?H@A1qyr| DO_Wg㳂 x&xK15<,2vjLlj1ML3QQBZN,Ǥ;r4ڕ%<93u$k[ WIxA"yn4-dQ" ld~!F.8.֋:ַc!?ЍysC?p@< -1gI诙.O/̿ޯQ+jϋjz_z}^a/qB.|:G 4)ia#9V5`HVRz僞nyrۃ>BtưȘ>LD,DEKq"P1>,]r㑦&q-lpłBpxkqB[SlUHUye S>&U2g0JdQ!К7ۛJO0ZWJpݐu hĕ7 k0Bs 8~'f!FBho_8(7h$S ]|_irÝbT#qSVY{Qa^#4Xa݉ pߡܹ-^6Jk ;20F0F0N*a0.?UH5p*1*qøTi0{R KWVhj]{=Z^+GUtUnMA"s4NZ CPf:=*v2}ΩT VG瞽g|,YtRNS1$ۧ `6l7(~PBe!8_&^*-C\h=HҊZSxjL}]Eqiݐ a!5Z(WQftб+DB*|wMݶO<Ņ SI15%6Nso.$qhƨƈq.D;z$0Nx*>=m&x_< ?|?k#J9!4.^ޛ{G[ /cg+S8~?ABb#T>´׿ _ZDFP6tUq~=]<~u!b ,r9o$A`/XWoJo`fE/TBF(D Rs6OrHALX+AϜetLʑYY89%bj,֕,Ʀr~|0یr/!C %߅-d0iD$D0]p}.@v K ˯'8.`sz~2:2\n)uP(6x@B{>1=z;݈,6:Ol,_V(+Ϫ۵⹘xT!$O!* 74u,Jm'FrNF ;iכZ4I2~4}_>~}t}_+]otca_ GnBycҒ?a LT$ws!oh1HM3_VwD#I%wy~(~WS{~'ҨT>Ƹ(Z7E LΠv~?D <>6%T|cq?z gy?x㑍'p`G )9)*0aC.h{l988MTֱGʾgw7w !^_Yޅh'k+ {cZ^8!ǪSBqBq鷫y6g;/n>LP)t /a@uB78[L LVɥ+ hT",ߊN(=mvf6Q (s*e:##d%(Js6='/SĶ8"qPˎ}vz5z:Go_~tliXܒA)fy3>(0CQ) ;Ne*?~ ?.eaAXH&iJʶg2 "?X%DkF&KtjI؟#~H+QM5r"梖M%5GCpHF?GABh/M!^rSiJsIadN[W)r|%R&Άc ޖi(ńARqD(Ğ-bKB&CC2cuRs]1Pc+@xBu|)_%췋ҤT(k;Xf>rM&vP^E6ZżD&[i"r,-&KBr.9,vʓɲD; հ߶ " G)/Q%:Xp7n3_&n@!?LVq$zD a0jn4j%1nyzK&$: 2fdh;?9|8Bߘ#ŗkdN"j8r}'dFşP!,Naƒq"&a_b- ] ?BZ' ¹`ygz~9$m[7Q eJ&Qy"iFhD(4sQ(Qt+(*=пGwp/K 17ģ !h8g~Edi5S{_+o_3!B˷BT+-{'Nz@Aᤜ,>o#FOoj3&pO[f@ ſ/>WY} ;P]ag1XTFfC ΤheVY1qM:Ԣe4g}tC$D<ܒ;ޅ"gMmZ{!:߃WIدBWjڗ*/LKF-ߨ7PxqK؏^2_m &StTp׭3 "|z\-?#?Hq~^2$#lUR<֗I0,<;x=C a&]"E $[ڶq &Fb!ObxB;"ίU:Q.r'>ܮٗ'{aGiLB w]jXh7w"yɺ0P`][!r.҆uGLQP-LWL'%uWFT49NDD4}DMpxbBhu8?z` pxwg/xGb#W nQL%]*2ĭæ5TZVllږKU{űa^\ZT,ic [FfkH Te2J ^/1gp/+5Z6!P)vw;E d5EogUstk^e4nj6S]+X?Iq:B뿁YwGZ!# ~o¨kTƸ7bw{?@D̟bU N_Ӟr5BA){GI8V %LX,&"K󢛶|Q=xXm|$D<O0GYi+-F/}5Dž<\Cʶtfx';ipOdQׯAU\UN3'eo z˶7?Dx#AHT {PmQ{Z%a swUKD"&2#}pc/fǟT_?4/GÄ7/_^ [|ݿ#7%&=Z&ի9SX.Nf9~|~[ ܸ.@1jċsfZؖ?C" ~?9;J\?~'V(2:4{om[e Un` n¦v(zEFtv~x"*sePYlv7xa΢w:@ߝ -J[VvhjvB߾Ja~ZӵC%hDWHa.O z0"XoNբ+;Dkr]A (vD(l303_}KnA!_y_Q1Vܰu]D>eB?:eĵ^=? lt#:9- jo?i1OpV V,Msapwɔ,?v'x$U2N"\ $Z>?Dt;%cB4-QGl_bM)EW%ԵWw=ܭ\??B F(ogpΐ?]gty*1?݌y;&\AdStfDFgOTP[N~!TfyFMFJԙNeB*qirz~Օֳk:髫<QF=4^vI::M6yh}~`S&6;?bſw-omFp/<2bv j1fhwGT/'6 co5bQS˻_Qm=?ADpAx#?H~'kr©HUeiXhh$gfbMD.pI(wIa?Uk S =0Cpm=4Pm|ai7=Pq2wi&nwaaip/M͓BԱfX~i|3Bpz$ym:@]x^jg_Ν,i-ٟ{Xrpg!^pUv*tG ?ǥW>W^a!9GABh7ЁP,408hWÞio8LxW8ت}WxN${$!7HN< ?8>MEU_)^F$yV*^yHvH4^0-)IP߽$q"NCp? B%Vo 岚]o "<S>GABh| x! ?o",D/mˣ?ĒUžijfp*ew=\C B뿧_b=@p zA8}F "Ux5{3drטz0N4A%Se3$0)2BL#9Ǹbqf6 S]bE2ӊ9j Hl5l+9t0t\ÝB },Ԩn"=Efao_dbӷ4OB{*NVAL/3U*M,MRZ)Og\ŗjeU+b;LqAJFTVD.Ϥ+b_e'qPH˘\v02qDɌӜ d ,:adP= y_hsIb:|Bü [N?Om !E-U_P1qڦF !{ъ|RIaN-ri \ZqNn-l] 9e)4ER CZ!ȍ悌sŎ-u* 5/ a??&D< V=lʓ<-d>.K=d J]RDR[ʢ8 >s+Y9'Й%&Lb,tϤ.'QcZ,{'k_) X nҭ%XFGORm,cIL\X܈ȼUN,E&,T5` cGH}&J5 h'k\#mzCpiEk B~uv|}>z|#2JW2ɦA&7G6W* & kҤ#FO&MXe7x=(~Z($D?};v]}y5^PD!NDm,UĔ䳞ӚZ&vSzҖ_^7nCKk\8@ʹnoL/K=ҕHi=NFiY g/wwv I݃? _zQ/pLjYg$cۗ1@w]Aɥ7+ "i$}`Ä%acd!i'B[51e1Y7;ֹUN-TKNX; AFu#Cƞ[3v ZlFbd [H2e&"}F:t gKGa**یZ=?Gr;[H ԎR7n̵EeBFJ%>fv i&R68c&\8Ͽ]A]}_cgV\̃j%dCV(m\feZ( [2X4BڑIqFLӶ=&NCdUp L;f=_9^kgz2MJ0l$dnj+KBZ93xs&fgp=lIca]Hx}+d߹{o "#7H+%]6Imi₢7h;HYk[,8f$ڳֳXY*[g֏*-|ĖvG$GVZ~ wT*"Uڗs) "nLolQ.?bc7~Щر(N>$NCv86eY_"]#>ElOg%E74]ɤ\Cf714KtVg䗉+=*7vipYn 'I`ve2X9fYg)#&Q=j7G7GV[[M78uY;GPh;,ZopM  l/ \F2q -ݯEn)q2>j'? LZ&|r;0˽(HM0Zptub9tSHOJX(Ǹ.#߀[ZGcÖ5g./BDAmɑ'[$z{={o ":#=^7 B0?v@ޥ*I#OON&'fE3[DClX֨,QȚM } Bvi!*oENHҔͮެ/:B3c_ be*Fg-__e򿞣6ڙڥirmG'Ox"EEu5!}X\'0!'ϟ'et9w_O4Z|_"ƹNN<)2$8@#f$}ѕ4RT$/EaZ_~\]@ݕaY Q Br0URK[N݉0ⴽ$D<_?yxx?\C`Z_ ZK>D!*T!Q)juq멆^|X_I? "o+3|L"$*.P\W]_O.݊Be,] $sp_g'pf6.f埳zG.SDž@c..1VO#K۝ķE<Ֆd< wgxz V%+ @ IR'Ҡn}=RjEVt߉TdL\ur+;j֢H ׬c.KUϋ )Z~Y j16WU֥h6!*j]˿̤D䯵o*n$?9$i(Y`Uv!BLfvC_2O? ur~vuq~z:s:!NgP!x(:[W3e.d m0rfLtHK{nMF|s(ե4t'n J؁F]It#*A$ǻYH%xI=Tx5e̠""g]BÚC8&3BKVefÖ$EBNjDגMu&% U`ҳ0ynRD)dlwcyFH&:ȥL1]uBmBzERbscR"v6^02ѥJ M,pLN69r-{4 8,ꃧ)kBIVB9R߃2W:95W J .CZ&?&p ]^꿚}>骓o_~]\"lȓxV3G.HT΄1%!*OD$~HPtJ_>@!Hi$g fԉGkj[#jm3}Xks쭁bm7VyLRgL r;~tIbam2ΤDYBR$w.tIvp2vC$e~:0Yr߈ڛ'y%($bwIq,ޱgʥVnt'qh?-42EڢmJۺC܍2v.[);ҮEb썬h "EB{Cޑq4>1O=cnO,?-N jIaiEgÉt&e[oob䴥"E1cNbW"묞ҠYWQdb[e\kZdۚyU(y7ir ʥ%ޢM==EWҒQU]?b"e-'J{W^?-S ‘ X6h<Ä,/@+£Seu% ۈۚ:74] hjS֞Yn}*I(G_ <؆ S%3!bftlO@#/NAطNn/ņzV"AjXflQ0*CaLO$6[g sv2))4&qTjQm'OcR ,3)h8\peuQsb&ro@ofk0/RwGN1$rVөm -AEҖġI=O<%.pRf!` s$?,a}4z|Q*'_>MNϿZ:K=sEr䮘5-̲~P4&5(cHC1 4&ZQQ[ώ/^evRP01]ch< 2ODSU?U[&!#rRՖ B차&߂f†X(~k#pP^C*ݑZ'Ei B|Y|oFbHs艆r*:2@kAKFj|\jo8CꞸڔL/$Sf9JOb R{f,1@&< o jU6B`F2}F^ecs0d 3Yv^푘Ԥy3Tx%fe f[JSc,-#age*9E 9T/gdP$@f@8LǍ&})XQǚJt %A'S0j FZ~b56 P(@L'G !t/9=)=j┹qNw4srfv1wkH127v32yZ#ÌaӺ",U~]ʳ_rX?"?*M*ߏmEc?/U}HxםBpx;wG!?~#eF{@R^ע Exwa`h=HxC翲(˖w{ݚ5rguqt_k\{ Wq<ƕ~Ii&eb+Mm/%*a_\Mvi_Ĺ?YϢ8 `lpYM_=}u4o<?Y&)u7e -{Ox'6"xso=ٙUizi|:Vm g.#~ܣM`îr^X۲@}|==hxGg]ߑ4po>|OӘ4F3ࡔNW_Wɤ=esX.V9 4i7?X=JeSGuhfG{M,]H\bD=؁v~y2oj_o֟H O3LD sU= JRUš -yҩ\~=>XY؞axXOH.a9ӀSWZ57ek%TȾ[0~ulrIYPsWGWg}9f+Ej72VՌ0  v|l 5ԑi9UFw0 4n#;H(mD@؏!Z+ZC[!YqfMeVO=VnWp2h5 rr%WxgG~VbU*_ciӵܶGBk8ay6p6m<áwL6 zGF.`;3=y(Nvd\*m%cnD6ޭZ{{JشfF6R0GG_vZ vthxGr[Z ԫ!!ТЅ"i  Z $ *qI 9s~==?ˢf?r@lϴѴZjlUf2?EpNٿz\*1rZ PÔF%ž? ^ )7:m?0^O_z)a(Ba`@m}38|nM~={GA?jgDxب̋{5rxT{ V׫WY5"O`VnhnEWѷ_?0__Bϫup`w'$~O[s/˫3Z,ڹ.s}HǏ>pKH"1]Mn^Th!V ^umA-NӗitFv R?6yxΤ  #R_>p}:{]?N$h 7u\ Y!?;0|!ܱPj:lM}ukl!~woC^!V-߁8;^C6GU4hpjCTvd,bE+>"\Z(P.MoHkyZonlmlo<6 vF|<)ݶ[?;;F#k;rL1QܣVw!Zub*ݾ#8TznvuͺY{-+L~]ͶCZxנb_Q?oHjAB $h;nX@`>هiJ&g^WPؒ-5Ҳȍ`A\+\M/="a$áa[b&.Z;r %{a1p҂:^=ڈ|n"X؍H48YluF-iB  D[ L7fPtfRfmc6汽"v0";Šk9f)4).3_<<5GTAhXZ.{DGhC>:Su&IEuGqQ@JόT{H= շʈ;Z%џp/z;zF 2%KĒNfmDh'($+SQzYؒ $ >׃<|/ ;~䍮n[n嵘O{1|X˭g!N*|DQGfЈcuĞǞ[039)}GyG9ǠEt9b0/цyWx W]j)l'[ -va>-Pף( n]^_6Zs-gҫ =Vb{b=!U2 ]-?f'WUPfv+lB@<&>;'!RGAB>|Oaw_Vm+XscLF9"(}ܗ7 &ۍwqn7d;lq(ll+l+Fضt`[SWV+n_>޿QE.a?bA (yYPJpJï~ W^FRkb=r)PQSx^NSnzo}Oi=f'qE!ƩmJQ=A[QQ.Զҏ [~ǥeĵ>@Y ^ d*2,TnSB1Sof|]PulFz]kzge/^ym:RY߸*@.b{"#wGuTc]<\%ׅ (ު4>Jz"Fu~ xӭ=<^Ic_5C{(g C oVGb!܈F+B#WQ!}|w+1˜ ѓlGVnT;4ڡ;hpk]u)rjT_wvݔjt3ګQ]Ч7~24YUYӿ#.h֎2zFF=!;ԥ-QFfWu.ר7T]FfW|.ר7]FfWz4; mXTJQEټSw?f&UGJJňJ}ߏ`~ zs^?VeaշKXOr}˽enw!Go~|\ /`P(  [U'u +:xZt3"O]>ky {*<6{/_ۮڂT--/ '#v K뇥DW"@~LS:CNb״u\ŇU~jzd 97l uG;"yb0G{o]jܐ=ÁAL?6.,7Z:}UY-2 /';eF 7aKN4yνWuy7kp)?jjRiC$:5jrnLiᄇupN4C߯,"["|2׸ÏGmmOC+<^00 o9P*?sG]rE:VKQ?oh)x||W|ƾ?YU@^UGZ2Fno3+M՝\p?a` /4U]vR[[?3ㄗ`dC<BwۻLU yk2Vî.dT͢zx#\Thm/-h_F IA<}~msŌـFxf>w=(~}dȢ$E)C]2|mג!AG[5.y]^6 mq]|>CeaFe ƧRJٺFyQmفg -bCd;,}k}2ԇ;@'|(-'W/`KޑhHK{`t(t0^>[ Ѻtp悴[X$ LV &Q3^rY>S/p5g줜0/# X2!pR@_xnV-.۶W{4NCtAşǿOW>9lό^|]2\g'a=vGͯ~'N$Kd_E?_o=(`77F3H#; ӧ%Bďήf̫^@:/3RX%_Cy 0#ivr)La0{fk?)46O]Ef1ERY⛠RuA`3`rǷ<=^S[zo5;Ȓ#PK̯ZcLy~6jSJai9Imvw茋sT?_Mi]3 Qz^7)[_Ҍ P?ϷvSM*bu"($YͦzM}0gWYSc~Onũ]DQްVPa蠪tQH[=;07W0Яv^u~>~z*v^'dY`g H;ߚ0|}MTa:zqs0 $o͗ss;ek=86jSs I`sMu'܇򷜔6叺g7v]-Wjl/CWB/߾Ju[iGb6] g_?NkIZpFyo^Tg&FX: o.[𭋐CV}·)e]=M}nN?cp 7#քʓ#րJkM r " W_ ld~Ww.KߑPu@Z;^H#n nR/Ҏ(FWL_%ё_^;һd<\*)[l")ws0!lX$mG"\c3W"ŨuGvF7]FKMG0KvBHS`J$< vЈhϝ=;SqmoM 5m^<F4jq.7FmtQ}TދpEELz^EԣR@I :TSjUDF/aZWAvG5G -y;d?zݥ|HO"#wG߃gB<_|=.uvzWߏ\cFEL0`je]^/c>wie8NbStBoFW*oՕW=1uϴ(=ZڳPCE?T=p(z`QtOS{xU#x@/{%ÏBy!IӶWFgP?/F1֣NJnbMDAAەNm *|20S>ʔݤ*n4 bF]0\iH?NGgP??}z?[b]mռm,h3~׺ 5ryF"뵊W ls9 .?ԞP-nxzMkݷC=^z]-57F¯7hOc[ wi ]wW] 77c5YݮGvG(/$W~Ⱥ:? ~yOƓbfCRźm'GoP{cgx{C pVP< H>iEڅ{@"և؉jһe+_!Yͅn4{Pu*Tv%LzԷ1*'C-C/whOo?W?oD8԰%tuI_]lv׉ X'"Gx5ք}[P3<.Σ*#1ۘzeNYcga=nZ#l77:ʽQ\.AZd8͠>[lyv' EiM4]>ѓ,k~٪t m{G}R?}{?$}X~F.rA"ͰU{cK N4YdY+o ꗎ%M}W&{PhebQ}ʢ9:I?` 7{ !Yl'l;<Ұ^߮y\g2kvԣja˫ZaՖZan.U' VCX[{djӵtV 56 i-Q̉UbPt=T̥{ɧDӝ`SΣ`Uī`sh:tcҢYzD=Ul6MԩQ_&`}tlV_&^4l<(Fr[XQQ_{S,Z1HFAOp;hW#o'n^tY(۾q tϱ\ns+s˺kW~}/?TanINFНCغMw)~l֣?~Υ1*y%d.ϣOI 4?pw]~>5=q!,]$W,+ף߰,k=.h_9Ϳ͗#;$܌C/H:tq_3Z/QH׆7,(WzmNX^{Ul'hNMmaڼdLeŴgveJczq#,d wSip+!m I[oFoP[#w_=5rίa>gCeYW+^l^x-Bq`w|n({GA \/et~I  Zz$pPe}׵4*PL/y{8|q 9*.փj= >B aoYR Cro-`eݾ641X= X?eFoP'JOx0 y ^Ͷͦѫ@ gLPq{bNӹFԄ(F7&6lqfC#K󐓼ou)}o=<9T4y{]F媹0,lбѳSDcU=@0z.TcM}ŕwmX?]:LR4b-zp!@=hyWߝSzWWS"MW/6o!zFҳEz.9i  >2ۣ2OWvQ O?9Qr#R=MXfOW i2*5,D Op]v\ޗ(}>ECMu %]H4蹏]Ǜ"e&M >?nД>kMStjJUB.J҅hh[4[ϖkXRZE #(WaUOzukT^?JY u }tGnٛ#‡0*Sw;J}Wx~/jdMA,(_PxrH5LmK%/nqu ⽧:ÍCIx5X,O iŷo@Yp76EGiҶ3$Xyҥm^5oxY!)uUyTpswq yApe=dfC9љ1eы 93lPG= rٚ/ĸ+z0؁(*gр_`>?G|$mmo|^>w;l|~7l n"mu96QPdk(^^+u">JW~Agbzà\/2JQuu/}<^s} {QE:6HQ#s( J-Su]鴐<8BtQ0*N??4?Y@-I]z37K{A%L Ky](-tU'\7R~]o[]$grW$g2əə$#9$gI΅i-Y"WOϮ.OOW'X9, YOSbFI^G$+yy_":ztm5pKIV4ɚUHV͊7ӬB*H?5D'3F5\ۤZE[}gT"wG]v*rwbX^U?>B1Y]ά%@LV ) .Zc˱rgg^jvTgO.3ܛŇ?.3:=Ò#k8A7AxAhy%(¶o$a@0G<]Hk:A[ -t2mA="PO"zO ׇzRBTWmASlCK"ˎz\ToJ{HqW?!S-6Mv:&kߝ9-ӂLa=N9|[V_{gC}ʍNg/f'. ˯Wt|1ƴFu ӧ7oKwe~ON(8]N*$v+ pOo_Ox[nv#/>7v??F!޶6+W1waz6\Է=*,=^ܹ[-G]|IXIӺ,)4E֦QEno_OCއҎlM^zz*Z%vˈ`T,y '%/OHj /DD#g֠ퟕ^MzMR6& NR꟤IkrHZ݈?$ߪAGOqF8e!cG5xvLcpL{q>~Gq;3{wNGwT*.YkWJ7=Curu;u⣗Z3C֫!Z>ZU6#VٯX/Vz 1Kd*p~ykÖYrUW^ ט9}JΩӤ+|׫tY._L5g; 8*t+1CmP Bl 2:ECpe''4(!>FGk选bmɸdܑybbG&KDyG'6oͿO/=aф㪑 +X7\衈ɰ"26Hz55lMz / U8#?$67_#XOeIA=Al}boI%p?T&D}y} _}?oQ_Əjr{?$n:?Dx| : ;4 3S>o%9=k6 QCIJ 4lyPJ b)WQjAELmN#)M(' D?W -A.'ʲ92㫜l%PI՝`»B{?$]&ͼJ0Sh8M62x!h"DT3,jro"jBzj2%iy X/JpҔLa`vmbKLMM%!ZLyUg6T[%㠝Y͠F;'@ -b$=њ0'P,NEOx})] ljY&rbB2nXVKWcT$52z#A?mDBýI Ss"c:(bƒFLeLFit)JKIRl^+q5˲+ELds^_1v[!bX/Ÿ*O$*: "Ě/Yҩ"H2ChIRS-$};Hi^I"0;1)NZ)^e:ڌ597 -m&RGhnKPXYO d5 0D׾* & D3Cu~$%RRfق]˿=Gp>Y" &(>(1kOa*v?qZ$Ox}Bpyf\Cz!2?GX+H|؃SrH-&2y' &D/AZMDH d&5'ͮ~ˢ;vߨ}/95q)m F[^Z\Mke S<=J` X!(y|wƴ6@|AY{4{+lAZ.`ù/׊j{o:O!^W:p AwqR !тw-xG h}dVĭ&D<ܽ* :#!=1HNha腨%-T>'E$~ 5 ^ ZfvpȒڦgIapFu7ݔ*xyk3"]~u>\[ w@%E"M-"oOd54)[W !{;Znb|Cc$m/i1@bjrgE5׵Lq&QYjIUז?zebjKF !눿*2@:=`װ؅y ւI~ZZ_.pTg5ĖY~dtYPJJc5 ^"y_+zg&4D)dT/K/N2E\=YoDßf]feN(2*5y~2JR g'o-9:_*DjvA6F-KɄkH z*KUbnce uo67{uotTx !r#%I;5:"yifɷd+P`~_9Q{L5Jk%:|E,hg7>_4FnR]&3l3Rūi"2oŷlW?PK(ջ+0w7eF_{ u<_/MkV=^o1ߵioZhNFnUaYWk$7Ng0bfg'ÙzڿXoVom{7H/)?]\Ξ:kw"F$ZmP,zn'V,`|cetc/!`'11?HxF7ykx۵gkg~i$lH`6ݷl~ZDN/_/ }{``#:xp -c} GsCcB^0 9{>,å܀?[g?OG 2A68lyqqwWhn{um`ݟnD[8Hc{?:+Blub;u_Ʈ+|p.]^mo,ca'z4?aף'ξw_.v$&7:+Ǘ# x^+3-"o]sn57|up͍΍( Ȭ4^{'JVhʢsHSL:r\uInp$ך:zMN}:DڿiQNyౕ^k OVj/ކfjhx!0N<u6ZBHfΏ◧k8;?q~}8DdOqH3t"j 'N*|+'>9?ԧҕݵƛjma#ݤo^U;^/OOSIT"mWǵYu^>8Dz]IWC%$vQ%$v/q?qZv/ϳ~Z,k E?7 !OQ b]!`UwTy~㞻ߴU"m`MJ|NffH S+-ą'.e~ד (P7O޲ϡVG@yc+cQw AD𗎂?nG9Ng!st_QWy-yt5cҢoCyG%ㆾ6~eCEܻiliRK:-MHO ^E)G #p"Np272Κ4H/ Ԁ?ӣo5[K`H1zIm䛓A~UA_)n8a߿ a6 qE@W!/w"jRnGV,N>cQ7!#!#{,ߚ>t(j,bOmX1X]>uTA,6w4P~H/88.DPeV3-WU^MX)Os-8wU4YS4X$IC͓'O=RffMe)jl=.hU₼rXǧX &źWUdV,[^PY&n ygU32b ;-jl:v-U;NR[aq'PILne@ZJ (I*A"Ѫ⬎&4nOל .8H+,1mꧮb.k]t4_&E]Yn_&:t\&f.eoV61}O參iC| =x[Wt0 IYܗoǧߗW/,LfCDHKH`fT?ԣJf"W[,Yhٷ/yޤZ3jR_T+]ε^]͕'4x4_'?Hx{/+/F"qqҢZucHvzK/M.ۯHc!km:@-JcsdѧώO. i\g=TʛI<2KNm#jNٌV$xH3V|ek=?GC\3BKJ&{e] +(!vH(('Z涤OUtuq|ve~yCg ܱN*=ޗ: L&7{lOGjфj{Z%WpQ /fmvv7҂_. /2鰎ـJ= dg?5l!YLuA$ ~* c;; C 3!T#3HxWϠNQt? 78)pfxT* xg0,I|HIH}M etRuuSȔ(6qi|f)T=$q+G~JӠMNtgI)D$. 9dYRktq'6twKWJ*T^n0?!Z"Imw/SZE'%gk\-. GI` YC1zyf#ߜ(ԑ 8˧e5s^q}ƺʀnx̷ ;)2i29QMp.`mۯ`&jx??;1.WGSx~vJ]!DXqޣA.݁uvKtr~7b[2rCN"?.t=xZk*F+qy-5Ruj˜ؚ<نQP=Emӑ6i;.IU:26 4cM^7W0MhӡCɦ?'XL\ws)h{ΚJUuC7}vE-~M!|M6F#xw!@Jd JpKmD^T dsGAڱk·(<,BlZ40R:lëP#u8G=It !>迼"vކJ]L.Z&doq B9 ܁01-0B149!Qj20??C$եm쌔 o0-"kڽYpCkih]בW|ԝIy7 ~=z6h_aF=DOIS&DTs\kYAv>H~x$WK('m{GЪF2U_ͨ1Hߋ%o`goi*=Grzb/!Fh;Z4 _ ƞϸϿ]g!*jMLas KT%LT3Ƶ4Yb =-zNH<@ /Ru284-g< q1. vȗ{)H ЄQU@7'j |mB\o#̈?gWeoo">c. .X&S*b ZT/eq30G?DISƺ&YoU%Y`BR_&DFk?oO=|]#m__7zYPPcGؠ~$6|!8G&DnB_}Pҋjj8=@w<'Qmg=LߋpP`œ v]0~ӿc8|k~kYMsgc܊/Zy '.gV?M't2;T [bn^ E{Mы+s jM'M#۾0|Oq@CY' ʅmm(7{nMa ݻwL堔lP2+̵~kH^/D1|7o|XQ8Pau4}!*q+$j\i5~\I k D 8q>;j`?7fq UBRc2bqPXL?D3ܐk?M?}ЕȪh4VI ChAM7|d|P jPxT%CUZJՆ\\Rj!R2JΊ4uN>?u ؤ5IKD:GǵJ:fT7.8}^~%4u ~=^-2ܩ(le._/\iq??Dl׏8oԤ C*p\%2N?W>ԫ z!s#14rHt;1fH|5|| :̛U|86k|UU?YmУ\#x\ßkurz͊~+ \A|k>{bD/x molѶɴ=n|d6\hhz}Jǯ?p/+dZnzFgtG0-3 ..忹" \ m<q\zŜL|63]1>K7~O"+|3V9q$JG…vWd\9w/$|՟Qi^s#}^%~7wp+l",[HKCw&ljFޫLJKuA0u8jZU8yWq:/F p)TZgkҪO\IH&/-X bT˯֋'9]+WJ =Cրr {Sh B=h^nAm=Ӿ@kw;J#SaaK2_--G~:T?̰XbFaLW>Ʈf?lhl~Pe9RMX5~[m,Wš&{aK"nd?g xx~#KvfD&~׎P]-z}XI]έ>p}^oqB?^9@+}Oa4vX8>{\)pt'6.(֡ ݄-O.Ow T<xPH  ѻ@K5 hMlԜp-6O5YɯIpΆ9K2sd&1ivXQ2(h:k;s8 @ްل$GߠiF 5R 0+ᰌx~նwf^!ͥ7V&6,~. :4Ns)[tCT6 %cj:q?qL͸\P!'}wx(IPX,wL1J91Xc¬d&yU_%EF P"g|Rt_a@ !!C", x* "|' UO_.)GW2xAпS ߷ 9H>r 0[S<A G]߹"z,?85L@<Fo&rFMN:@8^V[C-(AR< $_lό)6r.6!P8-E29(L|0W3F {˘W c0I pT-]Ȱ׬ Z\ěnAHNƓSwldl#< ӈAJ£@r2pu3CBytbb/N \1"l is>`1 ԉ @3U{J*@QWr^u$ݚWLG`+/MX'8 d:+[@-*^W{Nzk2;ggGno޴$woHP⥋78 xU xaj7H6Yo."wVno,Y!`!¿& L޻J$CJ[Ay71zLZ\\.PPY"P=~{čN6\Qzr<;Ɨg 8NZ2k3R/r/7 /k ,򬀗 xyGɀ^V࿍\R^}$wdGAw ̱@;|h} 9Z5ow| {hfkq"~q(rP뀏w^7ނrmmcHȵ}ݵ} S1DWPD#DU׋ʘuԁQHz0/I,N\ e9)q1[4⹤l5qHXet۠U -tYSDVݗ4<}80݉\?ݖBˇ՟qd= GTF wPA'w+~+@ ?D<'Wqh6:l7!0zU(ڽw@KU"\+:h ݖE.ǿz%̈26,}mMFԲ ׃|O~zVpO"ݢP`?M\T$p}}0 VI5h R|~_< '!0pzX l~K+_><#`lGGXA2\.q+A7;Sv2Y#L0jY}LSyOi&`!{,~ܟ9DzgNrԙ1Ѥt!al=,R^ASDD v+%T*6xTtC~*+FrT^%q }S~S1"4)2J+G" QU%T"s0>*;tvW\ c*o6j$&=ŪV9 ,OU磧vU8P'[R)6MU7ru>Agmʥ?ðk%^lvUFTA|U O. *KoXyp?wޗZSh9*ޮyKs98;HP(iuܮOЦ&%1Wwx%4mªOdĢFi`/k呲/ h:DA+}{χ>@ X>WtT.4N6*" ΏɎPQ{X oH{#2x~%?hJ9 %(*RKAv ؆c1s=*!P%g̤_<l0{CrWU|mŢ[w3xDD&dJ=@?~HpL; _򗿥˯->QƵԴUMݾJ^2W"]w=)Ǻ/뻟-n}|_e-vyo FaPE%=S[ /DFU!Ѩҷ"Ryv}\UsW1G R!~=ƯuS \T~UE? @jbԢaPoQVCF~i5- P-Ķ!Ć ZQ5Ї1y-3`zj4Nl@5 <*'Տd05u?6GaY%o*"47ڇo$؂v4!lRJ'OUÐtq-lbvtHJL3/RE򂢱"!ulC|ڈS ?b}͈k7g~h / }4ϲs_. 6_t.7 !mC~>dB> oU?o7 ?F)==6kTGlTTFkt YcĄ:oHU›UԷb~BY! B2Ǖjq4˭uMqK\Z-T'DF;Gd€J'h\9rIpL@zA'$)S+O~*0b դ B^b V9n`Nk!"jucUA7l V)cR;&8ij!~-$U 5J!#+^hSLJȄX?ĔnVBj+bq1i*tW!ۣ΂5%6&C#lrflY T }Uo>k0Ɋ%sId cK vȯ7q! 9zES&UCF٩O8F^6DŽ6$Yc1@7K-jHMvkd )$~erǍJ7 5NjԎ)}|G5_@cUm?FF?ڬGRD$OǺq|]3h+@p[A[.9 "VQWRGj(S(u5-jyw][먭NMB9܇0Fj^ k57,\0).}2%_B&'0/~EeG"eD*Oİ 26İ)?%X,*ҔNZTJ%UW*xC"6֟HMOLwCX:rH?XQHj1*{&Kio<.WGWLZTnJ #B-4$`_J^ '` &21ߌ/X)>9nrP"re&I:Ӝ~{$VC3mc5{^\?juZy$2&-,J7{"|NI fT+KU}(&ˣ ~TSck5%2fABKwb%c^7o1qOUo撀aCG]Wޒ Dh= =||XBii}y8| ֫+J_YDU)z@mBjX1xQ&xZ@uV}QIF -}*F!8|?d[jUd5#oUjX13j Ht4Cj'-lf@}nVڔBQjZkoRsZ.riPFqոjجmoJ@#j lqȞ_ ]Ak$;223Voga^6d~+0!jF3|U)CkeVOOصՓjBvM$o+cY=>̎[!ᚱv n׎Sկ2_Z*3A j?A;*U-@moN^ -ҫ%k_!h[? UjԤMT0^47!TRDbFvޫ W#FeׄkPC U{5eD"ep6c.w\CNZ_Ko??KH"o7gDrH1h`d;Q;a. 12l`oQQ& *Y&22:p+mqL8j1#j6 a$;#n:y\T{ "%;md:C^hp~0߿}0!?_U7(sID-6<-~YnX.?'.bxx7o`?"\/.O0w{}XXh'H|@ʻ88Ĉc>)cxTI d E>,cABo4bFpR~PȌ`ck$4~-Q *˃:Q*Qɚ_kcUkMnjڟB䕇ZsZ}J"ۥ*tC-w,dSWaNc + J3УڤSgH3Ϭv|5*a*,&n5~3 +v%dKJR7حLnC4=Z V+Uep*AS$=l$OZ=]8UBEn#ZB 7< [m\jk4:nt+=Ԕju&fËB؊\p֨xGJ߮яa|.}3C=W /T‚r g':ǿ"AQs>}btY7<2_,7#Ӭ:7Qt'er^OoO? [e0D=‡Fxxm"Ej5H^tv*cq!HA#9K}2sX[wUJk5-k]2ԄI*a+N錃_{`L=—RNk0:_Fg8%;Œl Nˠݚu>\3 y 'ioٴhe| z/z?:9_[2p:CƕGh!=l}O#0Մ5}Z ]d3#N=\>PO6DRƁHOn4?r;2:B!F~\mO?e|-xcP`85q҃GNR=o&%|kN0u*gT2T(tC{'{h|՛k&i/@~QG?6.X /X6dA?Ύ*e?j2=)ѠwTG#b[`e)Ԡ  f;+YEBs whЬ' MԧBUG A@fNs ެ!|{u@| d( e e&g'5p*Nѱ$ ^|%] kvEX D K}?֫R](*Nzŕ BRwzK_O/h{b=DLf#ÛY[v"-pb< {79șyAoW^4S:{cY-}̽ѧҀAai"<֗ OctlYzGt'ߏ ,N;5PF*qe =O%oѧoĢBhz%TJK8Q3įi1Qkfe/pcG#5cZM0=,8#6#;]IG1ͩڄ*p/ٱ/-tv>z'akS+O>dI`E@ ^$G+!?5TG{e 5.fs ,51@e gJC[z)c(e$]m]B@F"퓔Ԅ,~<P I]I󨺿OVAC:j|KJ⿅W.)m!ơ^:襋^03qQf:ݩ`_e! 4yW4!˻- $ކivw߀\_7!%Y0Z *ADUdnTKYZ#E*ԟ#O VN1H,%LFmTU.qˆ`KIz]7)\( 鉙i]c2&l4⅖{)d ZG6 LA ذ4=]֎ɗk]-o\qdCZ;w\rVY;GYщa\5sp*2YBlymdL-Mv<ݒLuzYbSrf i2)Y'H:az2zb*Xm5;ezCd}2 5Kqy`siY`B[h{Q*>q"`)W"hp ~-x[5ᦋ·jB6_[kz$43 2|Ϊ`VWZP摈MCF1 BUHm83zUXmVfaRV*_dz:RT; $˴iv"eKShTrluM n$;Nvq3:|NCgeFGBO .&&ʄ.lU[Z0/?5b]jBq~?pߩM]3\VL_L|x9]c4u\k3zbDnѸHvWDe la%^F`a*L6(6dxa2&뚌ɸd\KHi7x5 RaNh)Nsjx4Q[vNEvb\ډ&ِv jW2Xbq43 Z7o-uCf)IRѣc7؀dw7]6:LWt@7n+ݘa3wކ4 ILA@BbTD,樖"oYh5T]o Rr\՛7nWS`l'^5a?ou{GbÓb@M9i4־wu,ȼmGZɶЮ0~ENzNad{|Zi;\`Y_vlhLi as-V~ɐnlYz뭵Y~j;2v(mZzoU3o [d ,Rb&)AJyea |&".[:k6g䂏,(ls= 63djz&]XQ \j7#KE+ĬgdդGgle-FS9,*L3Dza9%SaٛvF6[`Gf/eiH>,x(tR]| ).JMJ !nUw;;-]""S<ЈK$?SҊ萱Gƶ.}2:eXڢWbMy ZѹkPNmct Le]NօȻ+R_0*:*;ݣQIsj,qeШ1Cv"4uTH| \`ֆp!˹Dͷ1!N갠 08lHĹ;[B{M8`.O]U@sw=c^'zeFB%ה;g7YC $ɽCAƒTHEMIF짔\U{Nf` qN$AJE#E8± pG_π?S;||GHL@SDN;#!DcӿZ[{ZO`%шٝ혏-Ȃ_|{cڭnQ A|n͵!4&`n0[P:|!ķpYͣdtԌf[axI .T$L>y Lm偶Hy`$? 4RlbOG/Gsr nn  Fc*8Dfqz$җ]kĄbߡVZ$yHEvp22)zGZ d&Iڢ#oNVwzLg(tLI*}۾|+'ՎTR?h8 F:S*Ja׀p40Rʣ8~ 0 {BA &oJ`j&f5S( %uѴ9$#t#WcYH3M2nxАb4H"%SL]sk91h,5AU"GftXBoksyw$:_7-LmL&MVchk fUcg{DjpZdN|fy4@ >`Rq=0ffѝŔQn,{}4@ZCTUs*f2yn\O&/9>6a~G{ wN)̟'agY.)flH%jR.T.,\v%_2ʢbcXInY:̆hSfhηKopgV:3{O* !U-}na|n y-"E'ܮ> e+D5d<8zЇl-EiQ4hG 9fH %@H85` W*֣ y׫ljLJjId8 HBhx`w]ұ+vXԧ͵m,[ʸPFfZyؘ'+p'םYK8a u,H6\f 5< 4-2?2R6xKr;g'w!{&ݦ"u]9G]1SyAi#Mdp~zgت'e2W1j#KFy.|JKoبj# vvﵙyͤ/̧fDyƢ:wVJQOVE֦-WU*P$ VOP\@vGZ-=HiKuDqkmuC uC7Q7)}ep65 ^RS4IS4tES%:|8],]${lbb'*x F^T6@md]CmxS*LJ:l+܅vMj0vAjNn)>KU-Iv'@NxuIgM%{+U/Ղ3&`*F"AcOV/'C蠴s e ZJ"O22ʷỎ`v(mFM`sp4EW³gjPz扄DRkG'BU` x~Ik'c-}F1NM,l>4fL׋ȤhufP<6=vz}l?Eb+f&H>NUΗXu ouۛ\_" =p~ry[бw~=Х9O~B<:c?˺(=>[x9m;_ͤXT\X<]3YdM`TуsH[ڥ[Mtki1s.^9 Kr 7N+]sL H}0jGۨmk)yܘEs/y6ly|DIɵV;4Ffl~6kHكdqDo& 2IGbèamj1H+J9)0GͰq#S㪔Y2'f lᤞc/Jʹ^Q@ga \H8~.KW5y8-M'Y0W+ ? P?+'N?'|65566m%uJ&s=0obaлP|aȖtP BSL+qQ`Ԭ:b'w8M Mm6w _@HێͶ#նVAv*0bZ7Ѯ;^wFsx\=AVo4) a5oBwof6C{ 4r>4*f*asMlbNѱ*tC$Y#GNijP\-F|%\:k69 s_AC*'E(Á(\#J|ရwynQd;:I!U 8@!g IuDFZ62qU4`~jA)^ LA49y1-:c' uR&'빴Ĝ^I-`qd`\:))XLm 2O%nu3鏦whL4DEYvѡ$JAYfC6THzSUMC$$/.1Ԣ@IH\ Md40U\sksГh&# h9Ȕ^$L*kUN™f\L2z{&:R詋kvJ:Jj~W=Cx"X,f!:bv-jx,܅O2(=CɤTV44s e6H_Dѻ9ݜ^ybM* ?'&:d{ч ڀ)T~$Cɇ .ȠEN(S-n:O1\QcdP' OĂN:&x | S 2{߷ZS3-k]s鷓}Uzݜsգ֨{Lڤn43Vl m qaYىWIYM|1ߘ8Ië zȒmlJ\:i$)&Q> _ۄ$Fאs[c˙/=9L l 8N3i`fV ;t Phɀ|SK/I@|HȲ#텠$pEjpQ&0 0)^C|Cc;Cdlnkqᡑv0 c`y'Η¢cT>/NVzqvi?^y}#DYU|c z,]| 0/㫙' (%\PBY XaBa#@M(@;0oMV8 A,a>$' Jsf!y\obۇcDzƟV' 31z|$m%3hH3|"6cEa"`NB(MR ȄsR[I Q0qn0p~s.PewVt; gLN-Tπ[&]@:n Q1doq 'J>" ۯL=恻^EA$F6SD0'fP'2&USUk =h~G3$ZzZhҗ񺉞wb"Iy*% pA ve'MGq3F"Rd2O+rM`D-~ֿ`:+! >'x>zٵsGEg @SYd~o'jPz\K\C:$0kr)]cG.}-K#<|p[j&"]GYzVLɻ jfYX6_6B f_(W2U)2 hGl4˩`GfF[u8,ɷ<&-_/䄗T/GHO>`!ÿ$,ǃ{eg?Sp8SZ|ӂ-( '3PpzaXHva wd/ E\R_wOS`y:@d/8W"~^+6ܺE3*oHӀ@AQ<bUqDvG&s 2^ Z-A Pvs?M.fX]FږwD@XeKz^^FoӾd'l3`l rCh-EV)+>bO~!eL̨hK hUJH5=_f.')V۸ibQxi#I'&+ fȪgY-qFVpWd`p)vXIۣV($w@$ݤiDǰe)2j<*ykɢ(3ƧAwpa*I-?~,cC-xSl AE $xS3R–N~`}&Ka&?Q)R$O ?!Mj7 ?}ImjL6sE (,@<(+W5( 52gE];_y4'F565|.#dE^=U٧=@%?'g_"N:j{UA̒g|;Rbؘ%,8$g+$ңBV2P%Z,c恽za@_HG >dVo\ʑXϋf}],rw E^ϸ2^͑)d`}|\ vp?<űZ Ż:h=:->+ jS /"^uC7dѰM_q_=n1bt=܁ 5ä#*U+7a &,5RGZ|@#f& -F0>I3ЅHRg)IJ$Q]?`us*G/5_Hw ,ܜ^eZw5<E&V.lHzeC-`T6R?Q!TZ˶Mm'<#]_$clˉY1;Le^ p;YëtQKJz/lת5ЛZ-$ ??890)YCv[9nsf1&7AfG) d+>\_%=G{z& -Mzk^Љ Av_'@?{V#⏹=67vBē2U6o +GFR }f$X"piŤTև 1vD:;D=$e8l_5BZH*qD G?r V2@ Z(>)ŖN4EkIQKզR-+c˭}I!hj@hVRQU4nĉ [ޒ$" EbZiͩd7?V럋;"*.6eQ`WjTXiel$ٸ?hdđϟ7WFH?o/~3rR(VY!A&WL@/m @]pjE "/ PԟMG"DO=67}L57uf^__Dwz~yet,@G(ïVZx%/a#~wꌿ)TG6>P} OBfDuH:$lMS*ݨJznV(QCml(}8>w?kKTpyMGqJ Z-ֈu!R8f7ޔIUp.J7%R y =>/%W _8O2th;)d%VĎ*P0ɡrnkW02xx`~8IsL8XH1_sZ#E ~mi{j-q錋`a3d:$1dpoW]%N=0~'4P8j5[ X1dTLtq}ʿOsHeEVV-j&q m\RҘ}ے/W^JJO^QO[*, 4|T"!L:?dD!djvx-R I)M:@4!"815v-H dg+'ymf p0L`%`[L_91 v`ǠQ;IA:#Łނ!nq_Y +TIꉳXO I;H ٰ6kBc埪b P%$tğQ$_`!,"9pcG`11CP9%"!IeC'Tpt7bF| XԈS}q.l)#YdG #Mv@iq7SFj2d7bPXvOfͣ?dAOep̠m(]'{ 4w#3!wdAv{]KcKɩGגS~bPg"W4B$ 0$F3$!|>!QMd쌓!H{*2h6h'ֆ6Or%^ $~|pN?~\?Ovy_nh JVlt7w C1B\b ðInLnPӛg d/VϢGq[wf\e"եi""&YV9St{~Q/#X| Nf[*-~V>?][9~$ͱ:53(p{~//o_l}JމIE0nL De}O oa?ǠH3,G;‘Du 0mj\l`Tt=1$pCdD/E1 &Ux's -{:uR?&{Lә`E$p{z/:5e}Qy8rIC/ Ac!4cG1ں2xϑTrrxԚpA.J%+dV92CSI zBjzttzxqe[#V F yw˟?Ub/#iUbt<0hyYmKPoɚ#d9 qF(K,LvO1Z{3"s {lF9ժZ!"on̖(]WDVZ9Dq_^۝KbV!ft%:5zqv ~E/OILHTr\$=hN,KN5U(*o'篣)M $W7]d Rf̤"aYFWaYF.]$>D g}1I 5:3z5BIj ]']֥{_WЃ/`k 8hlђ^TBvQi'75 -Mz7]Lx\BJ&}nu$&=D.6bxXLѲ&+A1܂=|r%>_cJ{ti%H}-btƏuEМY$sY$t{{ Sy ,ϡQz~e8_{@am~]H|~CqE\R _K#k?pk\7 W0 I6L0;Xk, xod/44a"◰I`fewtAX.@]8."Gg+|^/)h;O}I3 _bG17HčP 5*3=e5/>/ g;c̏͌yYk^2yb,+aoPꁽ+rp]=jXtY)+J?ND o Ǖݹ(QWb^@@eT13Xc YdPjB?jWXh I. mU"ghh^K]Wfe4JZQ/p`~>S>!װ]{sJQ$<5Ti"F5BZ] DT >RJ uA) _ \R$M "w?ȏL'3S%_{94pT)l%BeԬ`ڿpC>+ʚYj( NAi/yEH8!Z!:hfvѝ,%\[ SnQ:ݧ{0L$hge2¸%kV(rbWEw\7f57.6FǨ%)v|$ s7 MBJ)z Axq*^NAI5h{֗Y.YigũLJU"3%*ut>|J'QP n0>sp{]!6= p N=Y @/9SKx|_/)IjhI(`,.\֔:%r.][xq[ B!(MX(޴¤삇MtBK@{F(2_({Dߡ{\`g+0VX]䜯9JmkdbjOQ]z q .hP^ܢ '?JR^)ECJ!00A{נ ^&OJ &(>,&tce̾M隆1P^TL\r~4uX%r{xã`kͤ'|V%bCۈV3ъ5p0o2\4’Q/hkt*8=Y)3%:'+/\\a.iN4*.͠h͒H_NxãW&MA|`Ɏe)Is[9wO PݲMP7t:p68:i>*GoFҬb$f%yBKە&2ԉn5NO"0tiQ-޾!;n40]tZkrԎ}޸ֵZfuhF08:nX$aȨݲ;/{ [C鹍aD/֍ TNg".ղs-k 9oo?+]C8g?mq5&{"粰_g8h2O\QBL0j C~%`[bDq!B͑#;SNf!93z r >:&eCFn1#RCI=, 7q^tl1op"7V A-' JnFS/!I8V쳹[H‡R'\&c5EB&%pd-9 9_kRIjy23~.C}KUi=HDh2/qIº^_P꤀6M&.dVi $M҉Zk:,d4πi-iƀ͋L$ hfULeҩ8XXWke6lX`mzRB~vx]l#@=55*;: wOwA ̓Eav51Bp0wN}]ZePFġcUb-דX7^2'm kZ/Dv;RnQnI8y'5G?JH/eoW7*# ,bV$F$q#ePw|9_` 7&d&4 2 -b!t@~t9(}gZNa7[ݗ6=1LZƢtS0)$ PL'07/\7$v\7p]=nBv¾I!@c B0KJ$@72ۓ5%'_=zkeɰJ^BG~%fe6}:q"I ,aL@JUKF#.Vn @Dbp8ϓ"0݀EXg꩑*7:ċU΃2y-S&B&Ev4>HWFf\. u*P5ai꟨Su=[YJ >$u5][;͗F~cC7n>p$Yq$:vIisrSih^]]'4vHAhֲ,x E6S5 SRii$=Sʦ#ɬssxaX;$)(5|& Xzj4(eQ:Hn&q{uyCu8G( Fyu7fgAl4s5%wX<ȐJ-G䙷UU\ 8`K@M`rd&d1e\9e.*Qc#sxv . +Ӹ(%#<}ML Yt2= NHz Sȡo4 rW+?uruøQ`:"FxM{h:0{DpXu)\?Z=0b"58APP#.F24@x;g.*=yU`?xzZ5Je Mtُ 1ґfm*[᎓f ׷GdD=v!,r\WQ{_'r~<^HCOyTK=gICCӤAIB_#  դfٔo`B B1QƼBcn J@ *Ǽn4y=ƐD D́Z[*#doQ/Ad z;z a-egKSUĒ”~ @*r#W=A+5X$hjlqΛLaE(/0q1LξN27yԕJXy)vzK9!A}R.Rxt֕<a}j2_! Ԃbg-aC[uxt`iǫ `1m )w׋kz='(1ԯ e9{> #:=E 8[Rx0xsu "kfUHEs,`';?}KXTRh;Ĝ D+C Q.(m;_w1{#S#?ym$+FF:$H̲Z9$$i4:v 4Mm+[20F3`280jǏ+kPfF"~r⧜&IҪ$d& 0| J9jznD%Yh%hzGUHu%a9ux=XO]ͣ*6IU2Pg@ȅ/> g*3(0_xW`QhK~X ə +l,X?؃L\UZ)>ߧbĀ+aEcCv$l`e.HꫠHA DۑN ed't.Dן !kJE@`RvUBJ~aҋ@=23@ ~w|wDHt{],;|D\2s(_*s櫯]QE2POquD(#dktt|ڠuXTm@Fj1.GNiSC'f"p"AGUHPdƎ[*_k/٧[ivt;1Ubq\BULɐyn;mgpmkY_ 8/Ss9q mGQ\72k $jDߠP] a$$\k𖼀uۺGQ=.uVgx8}Jhn8zP[5Ni.Rdj^ j#E7"u75\72\@[ C* z ԽyȥEalW> `6)Mf쩬(<>0%b _z9#yrwqJVY (&.Єiƻ 1w+ lmҍs n1b!9Ͼ)^o"%m'anxz?-/-# bݖ`] &B#^,:-aW.<9"cs1OCf)ax|<'Y wrޖ:'?VuODj_C 6 D"6\_Ki#?-O cP0%%D$L_K8.N&[~ͯ6? ?$ߴ4. ;1 re*hP9#QդT+SH B) hd\W&@bh%/>xBH|IIUCKH5Ecʑ謍<1Mww'LvKBHlMԠ;{k,E axl ! 8yE6;qR~cc5kj}آ&kA_9y`lҫJo @ff>}⿜wxen[+(O9qJlHžT|:'ia֡5gY{&ۚމ_ԏ&5}dNsUš)"u4KF(D2iȃUL& ui#FD#"Ѱ4܁Dr?b)_j[6|5]9DC1 `Tɻ.keC//P >Dć:H x=)* Zӎq})O._˧?2?Wp.s\~2忰ҨB#EP/b?߮tiOz%ٞflKve&/wmPe6|N 5DyX"@6{g8[LeG<O2t.:*2Q[LOa*wQ~d5W5/S`?oЩ`l',G%feFe157c`qNwg#e fyssp]<ގ n{CCL>:+dF iϳPΨwɊ-K߉>ʳp)c1*el(RR\w1qrIbTigKDeӬ((ń,أx\:2hNW,g\(FߌD+T ;gEdfʔC@ՙuT5k QG.5ʤED]E7{,Eg%DYO |UT<&SkPUϏ$䉣\i dG;Zc8W ~B>Ed7v~j'U懼WG0<I].J}U9a7%;FZ+,\pM@0!ϥ]\:lp!$Ȣtv$EB#KÃGK <2S*A[0ņ*lOeY;w"dumbj?gC~;HۓgMlR2m ^ [$24>!^ ă:EjW\T׹_u?0/-*9nhM?ߖ5Kz+.3Y{'Y1Q/~ͩ,]zR=M}²%Nf\ b D""xw:]X7tC7Zw ʱZ*k+#\b)쁣G;뒲^/IWcQJ>ܮ1mkjFdG bÑ\fP<6 E_Ru: 1pM4*y.kG",>Pg;KǺEBZ`F }Vo!5,̻]测EOV;Ic.!UMyl-Ys#T%e_JX;>iL+nH1q^]Yl:k~t'wB7^cK_놷C{f<0uInFOÕ1 2Pzaf)lH6hWԙlm'ўX裊#OHDR:wφАՄgȐa\EL 'NyOl^µ?_'8; Mg \&%=26/sV7 BGͿw o%B[qe=e-*z\.-R- =n-zh8 =n*Sq =S =&z\ =S =.H^F{Yq =&woP5"+H;fPmPzǷ^-3p5DHP7h2QY)w8REg<|d+1U/cclafv=&| 9EnYCV1%7Y\mtbҋ>eL.<<(HC^cDgA>2aC2e9jˍ$P(vdON!۽ڋO{J$E}iLdɻ־eȖ{ŧR·,EhpeJw,F[Va~'k؅Yn{4z}N ;4Qn:$8c {|QLÞteB':+p_W~e'̝!/֫|e 3E_C[h Xբt̷l(!U%!b$K5b=U3Q=Iy-t lY& OtmO%VU7ϟX.uw?>Hf#Zʖf!٘}g;/J]Qؼ7n@ ӸE,;il0%)sj$i;дH⳶2k%Ms<>CR񁩍d}Xࢶ#)id+ݑik}2D#Nh?R \֒gWAB3K5QƑ6ES A0`b@F܀NmPC %ZwЕZ$ ɵ@@85(F)yh6&au4ȅDYN#>xe4vJ4CԉbN[Y^1f[e rcNQs34MN+lg6cU_lf*/7Q M8M?}Դ'Fx>W_xW=Y8!V-複twd5uוQ 8;Vmo*oqjHqsHm/AMP>'d9k?~IښZE;?c fHݤ:KС_.E^YlTYlr8zMbwJ^WhvI\Tpb(<)S>\Ai R]%}-6<;>LZdaH;`3n0Hhv=ŕOH-[0>7]SxzeyB`" >@ji 7^o tڋks_<&=E!iوwn qTa8QX*g)IHfl֊'tڋa$Tꞻ]]MzEz͉Dy>t:M178O1!?K?TļP`. '.c>|kd2`E6e ĵ%_L1C}tGh{S##(L~)Rmj>k_ 匦]NKҶc:GǤUp-,'Pc8WlƗDAKRC} )c VRaR뀛Zf! /=.EӢKhZ-tZr0C\٢e"EsUĹNGUUB-pAi9cCߗUVZC*ȰV/ɟNlyZ Re*oWbz ԰T-cf̵1jLH@pF" = ۗȾL ]+Tk>&Q|c7]ˎ]ؚNj.Zak3@vhҪ,G 4'9S/Oɦ`Gv$$Ei+i~p\ GFҮlE=,,o/*B$xg4B_r4[;*'xMĆp,U.[$8~%GR}\i7Iru 8^A`X[Yu4DG_FgCÄ QV{5|ʲf;ru= $go.n ;w5p|{$ x0 ZsD5AF?/)gq0GX||%S鏓 M? T%E=z?`찭LkXxSVjLO4 ɐwp T_X#`jg;qzj/|#} 휏=Lѻ220tp"L-Wן XF_R`В8{ᚄg]iƹzd/B c4L%!_ıPl<-zZ=,GNe ؤb>BLD@#ǘW. ¬kߪXʡJ*WJw*[1,mI\iLưё0Viow:jᯚx-N$|r [\ )FqWric!|e2h|vv<ߨHȲ 5І Pmل.݋:Rb(YoHV =}S\"[;H j5i.:Q}= $T4HQ>6]7%'/"P} Ԅ1W/}p?äU/>_!7g2KRM5GecAL4o&YUp2MV> ~yZިH6T5qrS {9#=al箴wW0ɻ1jj^S+GwwWz\ $V:]7 VkYv(L5h:;fl#rY0X~y%Dťm5N2D@ÈH97r,HG,wdՂ apx?ܫTpzʼ#".ox9ghnqsq_ƴ$Fa$[%=COv_ RBqWU35.TPvZLWojYw5 F ͨaTB٣t?5) \hvJ a$_yI+ܙZ/i%̰Xzo={ws~ҹޥrF ?B 7x\%30л>એnWefj0KwឳOf\X{arMvL|yy^Z>O{>z2LREy0psM}:;9Ų0\b0,; 5_Qy;/n˜?b,5[*Ѷ|r$FE`nT㔍I~inpi фA|e$Ot"s:wG%s90Cd]%8\>@^p>֑x%q~0kn%U}$o˻3?aaM:G3'Ìd3q8t(T<8YvSL)K]"~ev%dL\89{E$ltE݀?/5iɼf8@3Gw=gq!ˠ?@;cpOx?-&=I>Ε&t&&rb d@\P80 7M@6:)3л1? oGpe 4C MselܷQR;["A|(0|c7f#PG䓪8ĠO`>e3cxV ?t2)@6^. jq-p- p؊QxߌBWfmaP@uC-j|uC'}pooHKڒ[ֵҘJ,75-6-@\CD؏mFL>/䨀Ŷ@P ]KI eBщBۄU~hÊȧ-P%W!-}g%z]:*0^tTNDO m_X kHwչtO[ a"|<ڌ6 n-R7O+XtఉmDIr` gΏEf_>_bI)7D$,A@›-%wHw_ I]/ $O6 R$M޽780 DAPܠ7fgHHIba--g5F\8Hɧ-UWRsHsY'os]KcƢSSH_wGl :C=$􎃸;AJ17Sws|cJOքrkBҚKM:جPjV4K#Oi-F'4 OCQG'%oZaf W$IΚB4kDvDsʎ€Aؑa+ȎؕdbBr}9ɱ*4X\R䰸U RU7Ygxc`H9WhB֯ 4OZ/^)EN_ٔ} $9O2wjwPpOxD9:l.Oi! iv>d-6k؎<Ϫ/s@fhc:3)=\s zrq2=מo{H%KJcxWv VE1lY8詉,N&HgSBm1)elV?F<4䌱P>rs븁PR×}͓.CqogjM+)E߬l^Fw,betC O[z r^W%4jv\fgB2lvP` ;Αago,9"Dn  !vѲǿX^<qh f<0:>qD e-≍~d6B…ZVcXa5)駔rdeqnI Wkn M6KK l3`a5'Zylil)h0JƥZ3Q8BzKL&FK72tvQM3]gB*XB..}˚II,}kvKjiኾ$9@?::4t4}GNFtcIZXI ; o)!!Nʕs< 5$X 5T.$DS>m< \Modi[*Oў/ $-X+06궕O[/!2J™qbjD`J{ojt{N,KU׍@w ;9J Oǔcs\h;vZGw]9u Ouq_.)>e0$F(EXh!-/v6kՎ.7LRMc>!Z AQ쳹C@~^d˿7;6L&:c Dwsb\NXٴAwi'J^.tARL){&LEj+_$Ν„F')SR_R8CH(A3S 2p@]3V[Fg-UΑQ1dQBܴX?`vsmhlÊz<I:\y,,qvtFk]b=؃=ln"euo_ѿY/H'Tp+*73Ab?[D"D{$a?9>~ N@z0Iׂ(vcqX#w2p~1oWߗsX?OR{oIp E#hA5G u#=GNG(NSjb>b{×/^ HC=G3?'g&%;9e08|7L0]`#2JbNj\ Esܮx~\<ڶ@U>sqG&3nzc6]|?ڃGV ITbiI)B3 tp@jQ-S3Lȟ c=>/{u7<9>z҈ao؛A6x,{ = #nj$OO--LD#L$C8"ߋMD>jC<aƁf vb Z*H">TžƓ2}Y$MGUtEPx'{R+ бG#b#*B>׈3' ?p !FMVHOh"qTtv9!. $:R =Lo;?oW4;Ds2w_+$Tz؛dZf2+y_V0;kw` Y^F]VlөvO`.\ kƭGF.Nږ^?"vIMw:=-:VDoF]#W+??{Tc0evOCvj"k5f{Nj&U}4tO7S!a ب`µзFߪa[ۅvnVقLMZ۩UBʾ~VPUT+^UЫJB!<VTuJ=cZdM?Y-df v̝Ijv\MiJZ"#ڿod鏯fY̸ % Z 'L&?wGCVHyD\oz)q#/.2"PL]v.>y)aG+3 #/܋rL<*P#"IF;3KDS3Z倆Zj w@yj0)VԨV}O6 I8JxXxZ0l?Q(MN5!nDxMze;$3fFMNZ 8j7[d}C|DI$GPF#N09BKw^<`-:4'n,Bhc49b+:]jJuyB7?DrR,`oתk%n &SZR ΥCu.O[K( R"cbb6юun! !fL2cS_mw#t_ذ '8)hpZW*A*X}U[p3u-Vc* `]E>ִY܉#)BM-P;Qv+_TUK`~=e^.]S{od>%԰ P@HU2gL&6WCn%-TD1q+!EM" i.<4)h&G@Ur~-9Zޮ$RLCYE$߻h$rq`4g޳]~7FLRv:.Y{\~ư0.~;!.LИoLc" {hOg,nH|#NzQf0"8%G:zR= ʟhLe vu('?J"2` IPN7pb#zЛo%Įhu؁EPA܁c¥7 фq&?J% nK%$ lIJy=oiZ]Cly[WsuZZ5T<9Ov>HMcBPj NZ؃>r_S5hf@CKƞo=jk1CQҋ5j%2!"!}\{h-qIreY+K4DQHw HxEup/nW:<7}{A5|>A>iѧtӻt#dns;~v}#dvu/\Qb kYuHBGZd/BL_8TqΡ rWO1B-B#i>CǪVzq8 СHtO},jl9LE EEQAO .]=-q]H15OD\} !—+{29@O+K俋`[/VBᥐa m-6%aЯtO@P ӍLVRƦv+SOL?sΣ-U>SM*F| 8[k|9L*ieg#md >[HhM,($=%7tgU z]|g?,Swi d.2w'ᾜ++I[ڔ^y (G7Z=n^7iemg]&ٯd'(YaFk:BM ž35US,SR30hlgl,#5 !2S`d2\pl."(OVu٬+l%W-p UNU`HR4SA1?ĉXA!%&k C^(7ZHH^ PR^`I҉&tvt2sf*5Z cfy|~jY<ׄ[Q~[5AQM3/Q2aPWZ"R?c)eH3!DZ&dUc-M\~8ӄ$l1xJ1-a:McFe"oibT0E7`6ĸΒ%HҮfC7@:ZvCX<8r:?ht>;4[8iXfl}Hĥ֮Ӣ4ê;]0he鑙`XZ p1WB" 7d^` ]QND-}d^24> S{:g ѨLFM޶]1q<Dxv 4Go(!S?93o0oM͐Dlj+izڛ^ Vִ7C֡_[cf$jj<1hu6twRa,+cQM] `bzܮ!eۉy鴰/}pʉY,l,Ơi+ҦuNK`4-2Wç) &N֮%ץScEȉ* C:0FSr#.kRJ0Sa[ྒ4\ /klQALp5d&0I y?_rJ\jn{5?>KWOGx7Izr[I&_|t(f ׃PvЮAFL=b؁C*Q!!o^.N%&8s?[xT喺]á:>& 荨F*ĭ|v;>e$PZP?2.FxWӱ0$EDYMbnvvF %X J/?+jX-rx+cDuE,~X: 3yV GK?1fD\ OrK/oL /E&aYrCo6T\ sW9['^{_ ^ x>9X$hSk'7~Py_9LΡ٬C JgoE趹ИI;-CS.ݖ.uOq_Kܴs4ZKs(!}:Mso7wD;§:"h(-n2Y0'bX.&VbNXS8j eBZ_8Z [ -cFN\Nswq5fr0͡EqSRd[c, >6+rL2OUK)ް`dU Fo1|sѯmwU FbT F$5{A2_[F`dI;@1Ji,eyWQGOCr1tq\Ȇ ;6& JC{H$y+ b886|}(B.䃩2n $Hj^<4zX Nj@$VM7Q&z4 <بlhXHVA9 w=L]]IUEQ ?p5[-_ n#b_)3aOA袗z9A/cz5J2!ڝx Oc !рQ)'K%6r>ʈz٤?)KfE/mdh^vzc;QJlMACҞC8vIT_ĥ7gnuÆ1&3g6qcA&"~MAJThڸgsJwA,۾!'8pJtfN-Yv1ޣ' =̩5&>0lC]ˬ2Xm4ޭ(FILmUbzcl*1_#mUb@6LduDR{] ` [a]k!^5U]u/tu7X2ص3]h tb{o( g y $LjJِѤӲH.ɀsUR"w?RAަHS8 xmz)skYBF%Ա?(IW9(D^--]N]QzU`S» *A?*&/lY:9: bz{KeE!U,0?)[lE3w'.x72A d4b >F~JPtfkp?WO ;tDfF# Y!oOqdMХݠ<2B]aLK8.cFY%Or~; \.ߔ?lO^fԨ]̱NvXwp_̟pRsN0ɶ>*1AdA -s7pgU"UEZj-d4`;'| ^߁ d0 ZIO?}uE0N~SI/7;yk_Pp?_(ɓ tVE=u'HC{5`P?Ax,w=LN8jTZzYckk/?8Lc\ov駉'تo&a(."M" +0MmזTt{qJ:I{\ צTZOY CS=YUBUǨcCU-ELXzX'jA"k6Ju&~(w} #`i݉Y3 v' N$$DX",B'Fh>U̡"W녪֘Ln7:UG7>LEx8KbW|SUX8F$tw8ۣ`lIu!LRjsn1,6MC a"7;W ~fه&J&;4ǹ\&WՉ,d=nG.s!A,4asya] S\d#ˇO<ھI*\hvż㶱c)2BwmxM@̯ 1 12ԢcrQo0n_WZ"[;-[`W|HX̻8 IaҺRr~D,w5Z8d(WFrӸlv $@r $ב#ݗAr)\Ұ-_]&;+:64.׀v[M&@0f#7j,o@x @xbɀP #Eo?odk%dM*q[M$[쀍pdCWd,}Gf s 9J¼3y9qŗ{|Mtї@dY2\q``0. S< +N."Eɀj[iO=)WgozU0i{R "[ NٓEd5"[ "K!ob3 _&): R{R R[ Ezdyj[%Eݖ?#V:&wPsB܆2:Mxf vx+I*+ˀI//db|$O&P<C` uCL:2Pu[QuV? O'y\>B`9h?Wtx\_qjrDm.ќ3.d,R`"L^AB rt]c 1$%n4ȕb9X'ickLm))=ҶvPK[®hI4gZilhvcy{]%mo r؏{1uom{zآCKbu)ȌP)CCqryknK/Aahqǫ&W?JXyGQ+)e.s;Oيo~gc$='_W ?wQiZ }zNkBn&:|EnO)d6@则`yKY[!6mMeϾ; 㮅}'~ij2$fY)b*|zx mČ㝩^@pquP r]4"6NC6@d*ݎHvN*CU#\][ID$a 1g8Yyp ')?s"-~Y шZCr8{7h]QS|neXqh |*pƺ7 :*gHcfdݡlf=m2KQ3 ĺUb>cB2l Տ?*X f9T [ϟ`^C *\ZypYR.`U- hkvYtolbl[g"%C%L(Z~C[J~AIIyj2!p=;F-S׶Q낢vop~(KnN}M \_ۛ4f~{z}Gfgxh"hn`\ik@qزEGn9Lc,FkeSD_e/3w+xܢ6gs;5r&0epF1lHv"m\?t`QQ AbWs( XbYՎ ͆c(^GmU{M`xe œϪ̝xᱟ,:<3i~|eXn>\MƊVs)x+N>C9؂w /Bi8~QmG/ݐsS/FiOdR*["׻%_3 )`?+0\K(eM_V '.25.LW?d Z}PxStx}J%QYG/{f5`K LY6l"L~#L3JNPJ2 RH/_~XW"_.)>/0O HW˜MBM4|l&Pp E489ᣍFG5cp+ $y1Uь1EH3 -d+QBtBʹV*Lf ]a)gn8 ۄےO@;^vsDH*܉I1fU*fjF$6np--+a3P"ݤJR['C".4w _ح[}Y`7,SKI)#BBIC ¾O k0 QaZ]5*LKT8fEiv ?xT8b(hŽZޯV]l0zn!n{#"6;\~H@']1sr)i(ɤL=u+i7hQ1픅"*,V2, GqF UtaA$ɫCF]zBO +$䎹$\H3 Gj ƟIx!hRkk2Y!7d7l;uࠕ|Z2ܤʠwqهїs"9~B ~%TvtIDP%Udzg緖t$ b@ #m[Od׀O "8hL~a1YxY(LցukY|3 vBu u3pI8RCk%ZTQ3gXúqV*FMCO OcxC%bh^91H6  u0kTD冫퉇V4-~8eHFOŭttbT5zMwp!6/'@.LT mrjG`.˝rׂzE۾rОo]¢{62Tk~,fO"V:䵱w5+ ]!'M^q ǀf6_hY h.pg (~5|=/&&#P`Pyq>ƈ`#{VDyhIJ Oyeq @u brh [1l޹lLz7 =d8,I%# Dq72X*MraJniGE[Arl.a@or變vq2$h*t Nz aL{ccGwL`=MvbW}=}O4I}jt_3=u+Bpـ3;r%tF7G:woópy r=$nHyt\숵TE+rְ,Y-a$j\c2aϹG >"4ڒt&;B+[2m$T )MG2mU q*4YFUHDvU:}5!QAҳVtޅc3ɡEH nH1VÊQcOrwш-Q}IebcJ6T' mYt2V>I Ww a(4'J܆DʨEl&cH{ʲBP#N[$ Rުn;Եw3hg+Hc ~oVkpXAd"H`HM\IDɄG#e@B/*bR¢US$lw M2 J]D"dRjp¥FJ=y~|šF+~?OGH!C S3X/Y$/mSDJ6W'X >u4|8x&Mv! .bȘtDHen݇paKF(mwܶ6>:/$gWkٖyhs/VRݵܒ6O 9FmшAظV8ysgwþi5tOi* %XAA5)iD_|ȴFM`y )sTJc6ltE`n`nv]{~^#%jמZu_Y߷Srw 'oGQS׮J|܄cvTU&O&] ֟ky]=SF/ZL{=o f?>Z=տY ?@}׽WVǍJjY i ~@S^Gm^+iͶ^Lw1|k9IX_σg/Vhhu]IhE={կ?d|Mdi:lOKߗ jj8 w\#y<.MuTI9P !P|t~]mf#I'9 |fgz13?w?12_1?y?1?=?\q{ӓ9+{ R f!E.ΥEܽRoi | {XK:ubIzXi` '? Lג1 MqRzx|4UU/\GQ5 wvZߖ9^6Oh>zGM}}\)̕%qytj joENݯR[oJ@WQ_VO&?XG $͗_|ij%DonK=XK7Y3=?<;?R`D~J_>Q_W53ŏϾ**Ͽ{I wk:g ]S=yvʋ{Bof^Z뮼quz޽b:uv=3x_}cڭŞ7b zHzvtN!$?_&kb~d⃸+$+&qp=Sr [֗.oK[5Qn@.|@#vUzq՞VcP_h]yQO:n.0)B=obnxܟŀU:*uoώ\$9E;e߁cDa:_ Kg?7n.Yvնڻ2Jg4adkٍ:~ٍ,jc?=_w;Ry巯fςγ_[ anާZ$̔>&an̎w,8uC0x}]߂$!{ B(TQ8땀g22V4Ebxez[᪏3MMc]򦼭8jh!'_ uHWuuaeձ"ubh5k$GXnz/ t\nP~cKe0~)7_ûf<ԍ.3c”"m˷LJͿSÅ95Nx5Nj2K]iR 8oNłnj#s4|}]uڡaNz٘}#GOc\s?z5bk&f?F9ḛYeVWK%̥VM7?Rz韛R\)y4V_՜??>sd6C$k}LqY5̔75sĔI3d)!ns%JrItfq {Eza爵GV{v:iJ;>G~Q#Z _ rwiN*g|uI {}W l%{Y5 O05Z)~l7X\;Kcwg[>| Hn۱>eؾѤL/dKaWNs4X)FyӍ{7`^X}G@6p-]Yו R`܊DI=4 1Ym)1djzK߇Iֺ_<$f'y$vy(^n_uGK +R/]`v:>#kceoeFvQ)Y긋7 %. r^.FWjSׯHץWf,R2u"p7{l2V%T<~_I  Nx˷V~qgoNN馇0vej_\rC!ޞCLjzOr$&wWxb]h @MjC?ky,[~9-ϲ9.^sqQ_9QFQH }f꛿?ɖFWϟH}e_ooK2bzXGh3|O36*m%@EOq<{:]Q^:.ygO:|A݂)qSGu/5&(LCe"u!F~֯Q*d嶹h϶~XFWajVKZ/ FMuW/nTp)kvۦKL̎r}[ƔD}qjpFviscS۞̶D8pvCV`%pY/ȭu-Z=[*+9VL.Bҙ"Ie$7;c,5󹒛7/5=0HmMmH2CdlAf[В5b4+tIL=kU 6Z7E*;IVa[͒/gGGFh\io矏G^uDA,=\@A]$-ɶ[n2 SEۓXml홦ccx_F/EI7Q?6}޿p~  +ޤAg -Ͼ~kKɻU4XX72mۀȼay{_co(,ouH L.Qs:i(sͫXc6m/S->Ͼ_ڗKwݷ=ml}.1wتY;lUŪ!jS,l[VeK1mʆp.N{+2N >n,Ɣ*Y32zI]gpyzKP^M^Ӗ<{96q,i{Z*v,ܦ[,>>{&̛bȫ0ۏǘ펽+l]MBO8'LH!2!RPcv3%PyƣD\wvDYsqY&c8̚]+7ؘlgsLG||7D/eu-oH}Y)`d"qSu8x=SHɨƒD. rx@w=&ͼe0oǚZ!A\C Sؿ'3?Nlz585'5iď&b/1qI&ٻ(W. TL[N~>$pX+۹ƕo9[E%=v]F-W7lp<֯n"Q(n@vKu3F~u8IȄ-aƳ=\ۃ:p@ r:aQ{1aCd\Gte0i4JpbC]z1ƣu^P34]o~n<3mT#nd›W~q[qH 6e'ֵx@)X33aNCx)ogo#v܀||knhh 7=x^_esL|&]~;G빱?zٗ8ǘ+8S[z/zfx5{(wmd$dk1>Sdwҷ"Zfn#'aP3'4ay -Տ~T8oǮ6'i>r95 H<ۯWrE_o~>;?NNWG)CVbeb_\25jx[F4$!~N3x,] XAer~}~I_iv|4e.^Kޢ5ɬdUǡg+g9q#OƟzs]yQn+fV%9[ZLUXujz$, ]= #aZCuG6X)K*x7/1+1OZE+/f# ~$ELݧC<\pAC{uC Tf n/ZZ~}\-pkmה⥝:%Wϱl aᆄMQ2:ʓ?re0OLzs#,Lsy |w[HF?TL/k^eseB/tc9*]ijV_}-ۍfڬS+ NR>ctat!k I,d(G֌d)g\XC8m :߬y͐:0}g6HGuǪ/yk};6(R׉ٸֈٴ2Y%ɻB`YysP"fjAnThû e)6%>@gU,ɩ/,UPRф˪,,U%x{|vbIi]wN@wyXŸ6.nVocs1~ ?BOeTs[::'k9_>w_aZ.h(7Zm\vVڒV2Rp^…? 1l/x[;f<'ר1u|KX7թ?zuϬu2B،7~]2 ?ɤS2 t1ܐ~HErYo/1]#J:p݋ B5OܾA61-7F|M `;ҘRk:/J&L__SI84%aBmhVmgJVoVq11Wo~~&2=Rz@kѻËߎzv(3|1q'WmI!/Cﷹ 2"2WCYϯw-?m\ȃW+?h @ pNnpWjn= 4į%3}گ`!ٮXDR{v܏qYQzދÛ$` kdȉ z<+tS[Su>Q9F&:B7> piq,lB# ЌQaF ZgHd(udАˆD!QJ[چߍ-m+F?>9~D*G'9EfsݝR^}Knҧ?vcblzV,o ՟G~.q|)ޝw?r%}q!4Pޔݻ`-~=RC3f!Cy{Ѫ"/K5Y۵ywޟl4FS.,YJEm}\.Ղtasl1l4}'sIWG_ڀ{{v6<~뢙s7BLxUOݱe kW0R&eR+S +[.WG^؟x0S`o_gn!,ض-o!^ xC6ա3-7l>ؼŸןܹ,eyDETZOåR_f4^]->c! fc:Gs/P>tfu6x?o:ey\w? qJUX\YKHlb av墥x3HwWI#zY+c 댵=n?gyKO+nc2$Z`fzƇӇ{{{pO*@bf}OG~5hlԁӱ&t7ug9iE{n!~4c/:UJ <%6co7uƍJc|G2b.k儿tvZUMV2??NZ'9w0wJ[eeߌ| 1|4j!`2=reU/keV#jy0F==Foy$GW+~J?VLW U<](|+OIg@NͿ}zqMC7d|wjs'ӯqn}~W~Yq}{\[[kkxR)_UnۗOYWmo[UmI:ZnoUl& k6}}^!^@0Գj5+Y4<6] kkkONO/> · -߱S֪Ó#a Q {<07+j?X2(T2]6--)Ix(>[3#< Z#=rd^\j\9x2r͓Y31_N9k3}/gfG;4pw5*Y5_ݢ3({~<^ 3}~>/OO<=_yg^իo^mfAD?qţ=]s-={{׵7(hc4hǼDZGrǩO}gySLNd k$5MX(1#,٥ӿdQ1:,?eCfE`Pu0#ioK߮}ƚ]^H/|t bD|F ^xQ"j"œS޿nF<ǟ3.RՒ(/v!˳U}/uy&ӭx ū߮y_7&:$\bAEr 8P?zMG# '*#߫)?3c(߫YR_xW˓^Q\>7l[ilmG<5G+L:ju-լ~ޢyf( y&2ѕ}}}O^9O;~vm_M( >>{ӧqxN:1~_zMʊm\ԂYL<˺Y}Po}+rPOT|N!uؠxu'^tc=;^uKt}ebAt槣O Ԥ5p$!ɕ'W62.Ƌ_9qejcP=cOKP$+ _/N:bv!dhzR#b( 2]o/E$mN`I0`\lf`~6,%gd\y>|Ίvm3P4KnWf-5W]N ],ufeuc pWtq>u٪u;j7tXsCPR69Yaac453Lve=\qg>?hmuv1EIwy'r_=\NU wӁ=\9R甏@QVǫʝ.RX*.};Ǿj|-^n^|>L0?t]s{tu?]ӯAiΟ,/ȍkxuuFE*3۰cDߟT7siLU<^?u_ .h__Ճppգyq#W]"7dȼ#FtfPr7y_mHC˳Ρ 't4tOSGuUAj!=ETK[%6^TݪbCךgsFϨڣ>cRp> ۤF WanǷ: c.ڜeyuxop=S٤pgv1lT"St׫tzZ Z4(ri?1~1)2;MrE 53 _#\9|&|Ȧ qе_t2] 7S3ҽ1?H^F.ceo"x%by/khgxgx4d4{i{rJ/Pb8;ߞU]Kz@$ϯ&?|sLj3lrb \tNEtIt.IKIt~$=F]څ1&ca0^cg*z'9F߯&/j1jE4곎䛱q5Qh~z+JH_zW?uz5ʙz>Cn@ywΪh85 QjsPcR2Ӗ_Oy d7"-Xiӊ\(zz (t;HzmRPlHViMY'm2E^+u҆  f;ס:s^ gEo^itꮽvwYu(S'ePY~ue ;ysJ0ݻ=Jj閘<"gy"cT|~+Q4l{jLș[->KbM. '+' \ūww&grq;.zrB.t~tۦ"j&wޟ8w6aojn8 n2R/6t\rmB5t>U]y]{ 6w7%a?/Ǟr}mWOO;*Az]@Em]{ڵR4ՙ^z|vvÛc,!z,g=|rb[X&x!" WjtO*0ҕӽ/S R;!4GWFh Ҋ& Wۢ4GX}?4֯A( kJ¾ڈּ)p@g OKx(ǫŸk Ÿm ~s6{KiIT^3V;y{|ī|;otiml$c0Q?|tF_GKD'K's'ѻwOoӞ˺{\wM~B-HH7{HҏЋ푢}xHR7s( JRs.eK'A%zqbѕ!N70<ؿALv i֤bPE]蛄bӱ݃F,F-C?9/<|A_O~rfKڑ4_~ˇl1e3_\4ͧkt\ W~:`7îS Hj4+T={I^_E(7kax>vA}cx2 aXYd`s005ǖ#ɤo'3;0p0;2Lzr-ᣄ< @P&J\3WBOfTT8 3(o1\ ]Wt_Hy!] w=p%agm]{(WEc!RoP|Gu~px&W3rJxŦxfnj\@$?ak|lz?e;Qߋ?r\ *[0םZx`oazt8qӫC7^m:N/ώO.>E<\%;g-EBiSj]>V4LjSvy?Q{I7lQpAmXƶV6׵K؀7U\6+eegౌ:?a?4z?8F4}CiO5;/N#M#>oT,ҟ\Aυy)_B+{G0mO1ώηuKֿ׿Q{g'JqK0{?i(FE Fտ '$#*~ZY:G-N^˗P]b/q%R!9 [UuQm>v@ .B}Iu3b꒻#/9Itj YOrxd.ק!؎O4ӷ:vċ>?Or\}߶v{30. AMjx Ƈr݁`-Ocă5?4/.]'MZrTK\%vkN_߮3/qio//=D1',V?cKiWwh;lv.mrl$Zkj_5ۿ@ƌӉʫڷ6O ԠMU5U ǰ111/[N~v"􉦣`݉ 60Ld-4xt3]x ֿUsIKgјkQk[09&-ksJTUֿ2opRW[X wE I'̲?1Yom/ggltOiC?IKW6ܿfdO?oUzc3N1vG?zoΟ#,7Mz٣ @"'I]ɿ/ra궟}>Vi7sI_?@eR`w1;V= EJs"U]+N_|pZ<;;:|w?B$aQD)T0I7;,~]:/zVvS{;UGoóWU߉o/d/ϖo|]][d/[y$G^%ZB|3O[n߅v2 NJ?/K$.8ZDsWM^i7IZoDz9}s)RͿϛó#4;ɡJ롕ܡ;ݮ4tH1,\])hR֘NT =K~o&Ve7hv}=HFI'$n\:%,y{%Gz֨>vQ=L2]3A]Sߺkc"е ~i+tOcloo9He&ĵHmFP86HZhjڈ>,5B'F!Jg[p(T+@ܞPvUZ p3΅(Ku&cuvaW *㓄@h'eKbYEѐPOxMJ=8 ooϏtH1q5(',T|cD).37Ѥ='ME=gMq\>\{+d?+v[ d N2K)ng[nrKpApw1o#\Y%樓Yv_$G^Zo͂)om=Rdů^ u'r,pQ:yW/[]zp!WO_w{X?Hcl[-Eǝ1OdG9{˖Vmz2nrn}]fhZ~^-76_e5xk21&,kh@~Xry[9);=99zs75dEHQqe~Gߤ_=XYnh Ќ]o9 F/˝ld7M̝\63ZPGcr}}5?GYsiRW}9d,W mcR!oMz3E+d7Nr-{-q+(dfxJjqdȘdQ-=lemkhfL-9)&񟬼f x}+s$džn|1Z1Jju׎1_t4eogx?St?㿏 ]2jxZpIO6no-GgmK?1wh9m_O远uMXUl7};-V7Mr9;I(G/:p?M枹 8z;]gxq :vCqȲ{PvU>p~+o|l~/n9I&KdoBG=]D *8r,{yXqs47/HfZ47iI^F ͝eyӸDŽ/}|~γ[c_-yOq4e_lg!Yn{bOWi Nr!@͆1vtv~44pJ벁hw1z2f` eLƆuWK\on&9;ͿPQL!'e}MoN:?:-S4v۷GoN?NS~z\to>/X}to;5?OdK` =KJpG1գ'-\t7+{#ħ݉ó(i5h?:~/3i| z3T:zghv>[~㓮O됝dT'\ju쥣 #Sũ2:*_OdJi6jOx$z}?$Gq;Wimg }&kjmI7kbIwo3~C9t&jnҷoLJt7}}k|ձBOa'o-UŬOr s?7.Pl,=zx]Fh:llI/{7\;>p3?EI&U;`*RF:[fU"qC']jLg#0H>Si-P1\RkЙ.]=kz0V^ߵXK!G#-~ia;7=VofcL?"~xC8ۣw8=9Ah@; w?$/@+uc0.Vכw5I!?P݇m,6#'4jX͞v&{;'$[aݰ:- I.~m|)0a xE<>+.:;Ii!+C:tCMCn".> 'w+Ju 2@¤"WgBԳu1dJo9cI/g#>t,8}1ݒl{ZDXH`[URBA[/S{N0`~i 2m'-+ϗmЙLY[Y{>tݺaqn1Nd7Jo(t,*JI9Vvf ߑQ7(;)WcBO:rI/{w+" K>T_~ŋf2dw_{>eeof_CzQm6ʛ 53Kϴt~9#}/YK,}5z,77W\ggcL{HV%k.s^aH'4 t3 hΨW ra\j_ur> O:r֪ql_\^D9{CؾɠajfcL?7rI9kI/{C_7C}?#`i_zt-tɣ/zK7 8l ZwdAvvtgP0i=l3 R;P<撳iTBBn,qTE :&vG %j>tg9#IDaC C7n,L {]o=B;v3vӵ u.@!vw]ǘb_9w# _8ߓ ϛg?OXl#ؕ]v7=_\gJ.F ̡X!'9wI/_ώ5?8=]sѩiĻ{csVIKӷ't^#$XxпC &@!&da9;Qsчw91m9$G^5D)CD+A7GVU{ScS~q_o D,  h\0]Pb1WU$۳ &"GvVo{P/u U0'!~vVJE`|[n bRK dChSCz. 3N졍>4u(jERl\wO&ar~'$ǢwmZj{wkh0&MYsi&MW.IP.YV:C*x>Tdi"#>_㟣7c99hT0 .& hb1~V.c\A򆮍.o#_2/.5,]˟.;O뿊՟_T#~r_Ͻkh+T_8c,8)RPLz/l=HHٳj)M*D,^k[P$1[ՋQN[6fk]S )4'97niUR:?k:f@0wcʮC&"Bw zZ ?KDz31&f b8Ui;5.l{V RntĒt:d< 2zwh ZVLKH< a;gpY0mGza:loa$ L%6w3 y'_fwI/{;G|[>VsI1??)󿘁$G^u?vSǃջ|1zk Www[!' $ǘ?=7rȷ򒌎6iTrm7%^G|eBM Оh;lNxG#\#۾wǎ10iׁsI&mY3n<+wbScPF/4w4^԰c5ӾUFD1}H1{p}1Y{۾J/ B^A]l>ɾKV列;ԏ俜Lr4e_)#&|3リA$'=V?Z35O~= }`gMK0%$XB6@qkr2 McZP3;Ѥ}5W}I>'(pkwzc Iit=WK{AB|~խIf>6>pr9'9`)[@tvNZu^ړH۫+/=6uvXT) ▄?2gocl/}?>f`", f_|v>?Ui):uܼclO_j'96) ⷩóo*? vYh˾l/cPo9IiľءhWD~|H,2z:w?Y2P͈(Am|s(Z!ݼGc?i!PԿ¯V&|-$}U2;]ιj;3\ևFaZN|k78i*Ͽ{gjo$G}˯V K3Gw_LG#aE$Xu~#ݯU_we;P$2UҕnU~Gթ ٺ bkv^͈$A23h̵p_z /=ӯU_J.~IWGJ3wQ. =[ldA[?Tyd`.:~w|{svyE/eWZzP9>9}a< sVV*6[SS~5Ѥ}4R싇~J+ ڥ㇇!/_lM<؍M=T þW{\k43,t0n?XI.=cW̃`:!o61&k~g\|8C Jo gcp)„_lI/{!3&v}tÀX,}˗ue\ы׹l/.]&n{\ۛ%׺lkdV;>jwh]ra$ej`ŻL]4RWnFZ?;cKɇ?p'?_5t)cW98S>owo2%/>8fq*9:e}w=E7ߧ;w:];=U&D/ݯqJʍρDja/CTדCS.26 7jiZzG7k g;FJi6*Ό$G<!I\gj:--]ᖮ6iqiqVxZ^KTt[s|-=Ku[[~kr`,SXhy^锡AZ ?kˆM_|ώ1.p+3E8Sc=~,_Ŝm#a`Gp;{5/ۑ;{^ -qc,jhF@???ӟ~tAC})> av|L9Oܧ|R>)>5W#uz/>‹TT6}c\H$4(tkoa4M*kwXK$<V$o)H(gNS]n)@2_#:$Gz3+9gglT=lZUmP# &[i/amvH҄6Y!Ui-KoALrui{=` m"=RVl=XCҫ5#L X1M::ځ_i;)DdP?I)!{YU-' vǙ!Ov|RF{_.wa#RPk|n~]>lIawh6llKKIaw?l?nM]sI=+?c)ߌ&9P1JolbXLܦ ~<ڥoY s$GzG=VyOr4#`lo_/w@X4.adMZōKQwg8S!pb9KI/{4SkIGyǎĒmGi;Y1,߶'ZuРl"J=d2RjE:j:+@ˆsu_ogI_Z'6/!=8Nʶ"ɀn"Ĥ-Ȯr#Ʀߒ1 {!$Vz1_N/1Ѥ}>c^cB =P]MzcLYif -ngw8:ez+k( H lyroqiE>- ѳXX?ݼ'9?9}+=yϏO:xE"Rf\T#nU"Z@ -ຍ؅ p{Vض.aJZjӟ|4^=TYRpNtV$ ?rgI&;8cNW[ AW:;ŧ_P]Q2MV;"pIv8OҧUlELR{BCPJIӨs[][SɁz<Ѥݯd7,< ?B +$B~`NJ?? Żٞ? c {JNU|ڻwevu.&&~:m_v3=}B }DV_}X9Uz~K7w -Mzٗ/:]_K[}モ^ u%X=琺+NJ?rOs1s9>y{U{Iix\/ג.^)anT(^))<2(i{ⱐNK1I/{t m߯%%)PK̭ Kek\>.滨qBi?B't ^P"Y'Tۡ'C)qm!oB+9JIONtΤ{DwRO`gB5!>fl>cmgI1__,B>Ei.7՚SfdnckC:I.+}nœH89ե⴪7 -霩"A>|jKGO.ĸNk[J^˘vduMz;+g|oŨ,3f=V?1&RI!h*>dc ;eY7^.T[ MOUH( JWG_6J!2je_d:Kpl7!87K{cI/ue=1T[zk# Â1 JexG%'NxѢ,fBW JJۦg+ErV33ٟ!{+z?nq0"=[B??2>|Lsvtv~ߦp0JTj^>P\GD;yVێ t:-ѽpfK2*=כ%̓.P:>T6nxt {6nFd~[c)Ѥ}e7)+!ҷ]f7wX!oI1]uW}۸yӟZ!򮯞li~R>+OTbOa' ~$1q'@c):/? #dwFbL._EJ(%vxn }:6n2]ǟwLɳ<2ŭjg"Nbt5XcMW_o{BOg?1&쿫=G>YEKm d{duCFFz(KZjcor>u22o'쥙JK׻H%/9j%_'''ΜQ3 55MD ?7|th1&x?c0/sI?9So/{. DWڀ TQ{jt:fwL#U#Q$-9&YgfA ݫmQo^#4<+Kj\uI/{Cʦl}W&P$#n_E}B`~-[9m禞mmUۿ~ˠt1eS.oӈ~<}A~<1Hs;I6V6?>…N\ޅYQv[_k, n&Wm0JQ7Bx?=Ѿ!7JgZe9iG_~g}[%3Y=|^vR>{Dsj&k^4m n~B{ Jim?}ۦD`8I+ |`ﱢ|߻4Tl[1}_X_X26y r:XXeN1Ѻo 3^\A繧,ɁV~^Ym~wX/|Ө ѮU>6Х%l^(^׋yNjkҳ{~i 3tJlmhxZ߫ZߋV.RAK>uF|h[cgK*~vH"l٩و- UY*%Mzt>x~[] &~CI׆<'ycR6}ib~B=C/ӬP?DZW8}UA1e^ujeLh FzM/_Sel! OӭQٻ \,MXqǜZ _;e?X7CgA[e!5E"-tӼДswǿȟ/ ﯥ%حwEH"_{!Rƅ{mgC#1u.qJ}5[Q2ͲK۲.^e6Yhg?WNe|K/`cKi'+ V7HɌ9 Isu>wd?9I"hs&RgVLK3?Khېq>|RBkEiudqiD~Zފ|rȓ~9>˺ihc@8֣.UƙGs*H(dX\^]kʼ.8~彘dk]^ |s瘜ρ@v<&ڋNp,h@ zqh n[e9T~E>4\ӄƈ "ۼPY_)YK-3^ettExM@=K<AN e>>-ed=z*Myy*2?c%Ӵz͠^;dA;k,V{Z7+.T~ Uf IMX:9 K9&5=&_t7ƥ}4Ö1JNCj;ԟPZx8k5~<]"яU2Jgg/i>yql\2ˁn IϢ[{I[ju1?@q)IZc3qlb2a* e譚M \,A2ڶ?Z}K烴w'`fGRy 6JF='EgHeLߺڂtAtmG>Kje[-{R3uL҄3F R!^x biβ}R;U2-`*D ϔUs"^L(s2?zG͜Yo3ן,\W8.&CٳhRϹD>OާI{\+ 8i+Vz(9e5$Z2w+3=J97[=o&yO `H2br;"7<*!W}6!Gn4Yʾ\1a2.t"mwcp^Ӽgdcr1}Ƣce΍v' #QBe]2].eusW}9ߒs^4l1R>Tv1|g$%9?5yrަ-2isc2faNzYVYv!#$At?A!U2W+G s&d}inRqS wqݭ3A[+-Qmbk2| )!G>?EUv%u"^Tr8WLmڼ~ϱ־_T{ ?_gy9cP'ue;ikY/;sYdy.n AfLαG}f9Le}6ڙ6#˰Am tL 6V/\ n>L[}g+ WO.Cn2&zC2Fh&(縅4DùOR8^I3IfljrAG nT51ϥMqϴz54>W<-۠Uy/a:帥ǚ" \u;fzfxs &g9uKC<>g 8ᤵf.T( r#&:l W;j`go8a@.*Y3+Hl63Al]+)x+ÒnDT>\frތۯGa~u8{YW|ZF\  *1>'-|܎L#qrqN<]d{P-b/oCƨgBY,ȟrmz/B=ܧXy:cZ%Bkm4ߩ\o+)u>KT+*"18~wq_dC9%Ηr]cdݳOK1>4ؾ@Q5J/'R#bξyNW%- d\֑i{,kq)c*.8omU\|uvOZօ?6t)3OU,ܷ3kʶR~9h{bCsFx9f\cؒUq^|֯/߯oƥ==-2/EesgvJve߷:1R$@;\ /cewnmlŎ\s$s1]a2pݟqJ1/7'\RY/AgnhC{:2s>=Uq?U.\И' x8]W3c,cY.{d-a'|xG#G\ɸDRFBƬ0T/Q ӺMU")ץNܤ}k\ol[?9$G^ubį_㿏_'s~]5toVhMZ8o+4c7|7S?:n_e~WM˓Gojrn|/ڽ)-w%n}8OoM_\WzwW߶Mm˛{־p_]Wn3WߦM͟mۖ?SΧMm͇r㰩ݴMϻ)tSkv7盚7- ٶ\ݶ>s*9Sϩ`E9l7oT9l? s*{ͩ`Sv}SƱSvgNTa<.ЍU$[>f1nݧG >|?DI:} y, ;WóÓ7}[^s8vݐaKDwȗv\-~ܻ!Zyϥ웳k#_RܳMhL?2s[:GBitU6ݟzmEutM?qSwSYn}_M̯iyr[uM3wUM7וE~>U7%%{޶M^7<ۖ)yyS}ykrM]rtޔugut4:z0|z]U.^w6y7%nj~M|S]5ۖۖsgY=bܯ9 pEsfYϚ'<3gN,InY㺛2g,7eܯ9 "0g^ s~,i/9 p?g,œ_ws],KkڙǍ+?NW^Scb?0|r|q|ߎ\5])axjq]^iR<֓#_?*+m0J8Gʥįq7GbY$"MlL-OZ+ M+Bz!hѮ鋘Gxlh) (C_QD/!(3|)cˮh_y!H!5کr鹄qe@"A {1DpRd#?: ֨$^.HuR:Bi-=nDK#!I6@pveZ FyG)c1'աV"7JP`쨣 A:s>?\ feHWy<4YSIDySbʳX8Y΀[-ؚRVC˺ 6@NkETr g JyogBCZ^q̵BBI7--"]l8 m{ٴ&U[-=|0.T.Kݦɯ5( <'giKǪfmHm ~0. D GVA[ xJLb00 txAۇLR'M—@KǗ:Xt$. π,POz8Zrҫpp.֑"v yj*6 G2?, Xye:|1ºr^B n:X*6O=yV`Rrk|&L?1hIL L#xKLj%mi ]a m7Y2E{=>fy`dATO:Q{  0O:-Ki+]ʸ*[k`B;$)tO˔89rM^F[1e-ݶL$Y{@ƕZAےٲG,-Z$[@1{.!y5©k\P;hئպ yҎNFa@g$e5!M~zQJ|+uے+Rr4f@ Xrn#0|jǔv kGC޾q4D|;nؘs-uMzڶ}43E N\Z&OQQ؁+4~N1ReIjVϴh-~UBEGEBX, p>,"~aR[Q5N4<%]X Jc ڲ rdd@ Z!=7;ǀ^wL(=~ɚE{!Emp@d۫R~MmA[ED|A( I #mG0~JmAt\VP-2PHCI;(@|{& 8b@>l Z=Toҽ5aBv*cD|8l⒞!g4,OZ? *?~wHSHf3ub()vp_u 6`{\`{ C=L/-[k,0PMr]#_P| u**V߁$cX&vKHC)HR$\wԠ4`$7@([m ɏ,V$g@hsxhIѦ]9)S-4?C/ &U9st[-0pb v[Ornc3F& !޷:(qItmZ4@L~ c|;P|&<cBښ2I,#n'Nvmmqo(Fڲ Ӈ"颵 Nx0@|Gr@NЅn6[&OVE3 +8PF?҇rLY0-c 2Yj#96/`LnZ9Wņ"ˈ9lj/KlL<1i|Ю*Z8GP&<ŧ¬2&r"DVuZ)EY^ 9Ws-]/ì3OTu$4 :$ |Kr)A8{6qi‘L~ /F8Tp֦ Gr 'Tk5Z05N( z( ۀhU^/6 5xi_vWfii[ZqD T|L=6[s1~o"WTWZo"ſQ\|3 H0&L FqJ  ,yO++t g7f,-J<UP)!(J-m i&7ȣ~Ek"c{f`pi$,~9Q҆ %t\C %Uxd;q/KtvnL&34r8speEC Չet %T u  ش$O+V*%F^aqPp[81V2:O.xUuHZ5dC5P\ me4N"1yX MP005Rƕmctx@#*8-G[ ۢ{J8'V@c,eq=(NG i5 ;8@o_Q;F9ePD(p J,> zŢh~[ ⢻K$-gIb4COnʹ6:T1pE3| Nn=S부ixF5x-M0m]y6=*`- Khl !K`ZfK wLu|1֜*Ψ[V$XXPH2Hs%v_ԦWŤ6²Wإ/B9kٛC-/t<ڇ:\y*2HoG$FC /D2tzMK{Ū3FH-GSJ <@硲H NϠ䫽Atz[Rg$L4uK"Z;p-nA@W96fUP/h9e"QS`[V X8 k.&m[J"yy ),aZ8-#.٘J$hE 0$,$Ŋ[ Bgs <mZ(d@pO_cf=-k4,t pPǮD5;z+r h!\H1<VxԳg%-3Uc7%//.EQUZytV(1kEQhmY5i9=H3@ѷ<Di' `hn7`0p< 4dSd,*MDۜ%|7i_I'b"( & ,&(c+y7ߖnz5((bHw`^H(SsgKi%{-R$l%EL̶h@EGAZ$\re;F}G'N+׸f=%.~ S%QjE "=Q 4 nUHڭ!evS665 Hb3a0pbVe&,>kJ'eQGWkG.!²i(=°!Č"XS{L"0Wmۖl(r*8_)b(1g^Y,ȅ4tY/SD&.h&fK ba.*,)IVLЉBXeZ)(%&Qf"T1fXõI1 ~9Z&p`I5(OAC@zzh+XkBנJmo j9UbuUr`l./E[ed!-Qn131֗\&MJmS=b*gk$>c(a+üAUh8`ײB ߖ?m F# d/Q%Ľ,*j?8>j8í+] bA$e} c<{GY8p^4qą*)ZA--9:GڊR'R!p*Ļ0.I{lR1L1=CZj:Z8M VL%XQkF}Ku[a<.BayFOaO S\KjC[+͓$d#9oib P0E8򸣗S^6) `XEQm>Xr`F}n$*Iced2\xێ2)b`Z*B:%`PoYF74xD=Shfs Ʊ1ERnH#dbM]uEָű~Kh@VmM|̏Sr=;<{|*:XI=?)QW%^=Yy"e.mtd )l˗zLV"EEAN)H Q8OaQYC)PU

D#J;+5+Di5<:W~J⃇d* DD r(l8)pR9) w>$P{b^GrA tbR'hFSiD6ߒ y5Ă!n=WIZ|7m%٘F#Wv+auWLCR~XUniʷ]j`{0f|R' f6 YXD*#ҟ0l)`;\Y ő eVhqcl8b+IWGBISH8+1Z,dܢJ©h$G4>ۀ9wAY*h08  <`Γ+p)a)2m' IVS4%|Y *P/]HIxp?Ƹ x\"amk$Fa}%$ Ef"m ҈MKRE,OxIT Nבu2?er\sÍeĢz SPurC8;J£-▸!+V 6q*.ٔ)(M"J' :pEdT UYC-w11mkZQyX7F|˼]`#rfGZr+1 L%sൎ%^E4*֧ÓK1MK#e2䨐\l#h,)jc@FNK+9mb(9]ƢxnʪD"-7mMƜl?M'+C3[J$0 "U<۴#yU24I☔wmSJ,V`p Oz'&ԍZA#C阍5S$Ah5ŐxYpKP>$O|E`I.y%7kTui}t}+o'9y< >Ȳ $-F0*֑\J9ξ@x_(ʪ.bvBEK),oy1AqV"v(p!$Q<(B-{O%Bw\4CkBy]FnZ-*!fuc[VU3L61֔2+@·Sil靴U^8x/8Zyhup({ъ2@̘+UUMè[: bNJ@d fev{6>me"`уY`sHnA76 J$YHobn1<}GVFv$l>J>%L\dl:]a0Z2O*.:Z 0 q:*e/O B1,mgj rŬ loUb ؔ>' J#&ᠾzԒ- ТtOTydQJ:迼ۇq'<+aK?fl@u(%P/{ɒg[w#' GT"H.a8ĺ/Pm!3)6#1AOU%=l+-X7/X%嘈;]ڮ2mАƣ}9\jOMZUI-QJΰ@ MFb.e1}CE!,yx gq2 g}Y#]FZULazAjRF??rH J-`zZXیHت$YրUGTP'{8HSE!`y dҜǃ CR Чvt,\j>b%nE(2[$ R_$#f3eRHrda %)(&ˉrⓩgUId Om=B̯ͪ3s $-t-m~ʽ?-{>wG=|뻣sЏΎηszg"j'`Z+Ԉ~iMџ&?xi7_zyNF힜oNn.u8~yWZ ?83{|qtvxq|zr M?׼9=~98j~9;|{|trqi'owAv~ߜt|F _NKӄv~CyQ'PX3??s7~g<<$0 7~462VwRx&Rӄ;!/^NZP:H=, ;jl+Rou''R=vVu'u%Xzm,mi&[sU Swhef)mm XJNF6q,&Mv-b"ƊԓO{o/s_&J_Q+=)&%GDR(GboE:݋lwcw+/:TDRUtqes*ab.{SzT.+?OcQPzRV)b;8=ǔ ,* ~)$]]r#ixU8v !B >) Ғ(eV60x(ADB!uMkY >4F!ȇSl#1Xŕ`СoS j ́K\8,0 <>,؆H"d6,=HYth*m 4RulNi<UoZ sF;B1NX☴t18dAʗ兼",1D!9R6FFWZ+5QZOͰT(]RÔ qYUdfE)W&nٔBbɽ7C,XS֨!mcx e.Fy|jB9ҡjf t4iUq6ux&Y1\8YmE"wM – ɠA*%29!j5nS 1=[b>[3(!s$iwc:sEIH'T&A:f-*!t-Ϯm GR(Dkҷ$MS@TQ:V!(uG> 2ժ*^2,;v,EU3N^* 2wim**:!|P[NI_< +x HX}!"s|\ qgpmB^8/.<M 3U$,gئLw8pgeE%ϥɯ5,a7-7#hx) ZCҼ:H)nنE%`a)[^rBJV)RH)!%`ˤ%<d 4р(œdYfՊ|ROHW)mHXN4Uܨ1gkZG$_yF%+2J8e,U0覃dVmɕCe϶&&5,w<1h2OʉXCFW-XQgy<{f&Ѫ*3GT$O/Dl)u2!'p#W3  |:WrSWekKHZ0L S4H@ O*ږ(Yg*3&/eQ;G"XL-ڂP, !>pRId1 %$=FZ%ڀ0q\0&,fË0WT><[d -XoV$L-\Cmfh׊M@PK KN3ځZҴ{h^ SpT7Rb~ 9x@6mIsl@qs&qIi<^ZVTF$#Pf@橿qZHԐib{ :I oE5̿#b)Ap:O FmQb~jDJA*cAr[Ĩ,F-Ғbcj_S< OB3aX[Baj<*rTA0+ w7MO-[؋ -{/X"t.@hr>,4,wE2l!E"+x\\y*DƜlciM$_pEmQq8"[,Vfr/ɱRfË/幎PӎPs"2궒1fB ,cGva=EͲژI1ɘADp@p(Jc mDv хj@I>g"A.P԰,BĖHց&'q}<{%M'xE>)He;CŋG t֖+4D˓ta@YrNT*,N[֭m) 0>+/*׎盧,wm 1) q qLZ#5"6= I% Dtϋ=)T4_ȴŰ諐)/NB1ge ==);v bFE#=2O@b=R[\((R剭.Ig )b"j.&KV71-K/M)fAZtVD/򴴣˔ػ7 c{9R!DWlRNK\/dzS"ޘ"(SjHDHI:^Ԣ$]D$ ;ދcNVpIAxMVUN¡&h\/u{u.  9ZC"ln/ʖ qsUrrUEsIU% uæ%9O[*&G@3 >Eixp {*ᄚ'ٽϤ[Vz1WUmmNvcXHT@(KꌆWC(K*dQF|q'hɓ.1:D_nx"ImY" eٍn5  Obn|$9Vlp-A'̸$QAF͓NZUBPY0>4$n L& gހQPW>  d 8T*V A2]1Ue +Y^taqaF;+cx-m# "R 780chQ$/c*iӘfS >HQ<ʮ"@I~-X½-6YF8|8~a]b{%`J^/F_9#'Zħ](}/r-3`J \Ii+tb%PT AHi'K𰋾kOGBx"aQdcUU292^e9f"m.ph.&QĴ΁\[2MN8SF\Zb訉$A,_F xb ,Zŋ^ °@ (Wy^МE"-<y;ĸ-E $>0UykmJ`6O*JU%qJMiGh;>-ʦM 1#Au[0iq\v  3@U5a|ĩ+bQMl4P@,E$MBܰWH#LFN.U\.BIM$BeCF} r<:&.HctGd&J$5q5wԳz`iQfÍ*9׎(`GuZ k2\Z67t[ca|Y^7 _sE?%d5+e4N!7oxE>J xFiXM-Ԣ2gBBny3}/89Tn匀C;ypiĪM&:4ulGB0ފL9FlBj<$!)\+_*xbT% n_NԴBHD0*V")).YO) 5]ST\_k8re 4(6ftnql *#z g #O+S$\yQG{e p[81V]E1Revhk(*ɣŲd޶2{<{|bu,DԄ0>2Ј NI xm/Fr6cqcApl&a(x̄=Ծ|EAxHXA)++ٳ󲺴I-occqLqTs%cbERM4 0wU \&hk-g;R)xuV2nZQ <9zjYЕG*RS٣b\}FPr-TӲ^b0oT e1b>:ߢROc͑ߕG [nyXET,c%5 xJIݱB}WkdcNbIa+ciVIR_[K~Ҟr>:2qRJQCB*00V{ Ҁs <mZXo 1fJ4JFy|a16].4<)Ж;zT~+r h! 3cx0P:rk%97"SL5Tī,YC, p.4U&zGQLJږQÑUETuw\EuPHj C.M)X^M.2y y, |mb9LR"K#lγ@6)"$ -8貐hYP"Ny|[ Wrvѽ[PRH8^PD*|YK/Mb b>p׮8֑YAhfyR(@+R*X1Y7 Ӌ-[x?R#^UCx?PܶJ!~ o*yʡOl|fbpKLe5DCuU!D{^y, O*CE6O);ݣ#T,&.LUj3x+ZΏEOp=!R)Cܝ2lZ6cEPӶ%!k`Z.A![BapxţnKh/FIFSdi\dgr4Z)F$M<A+_IEJ/A:Z 7t_] .fn9fiT:rha1;Obl1w{¡rl^s$+qw4Jl_ 43 DIlbA:&my.(UFJF#ndEM DžܹD7BBGq>/"b1g ST%;E[Dv* a(1c[u*ſ5O/)%/(Nbg50F OM-H8;(=f[QGx?@ FDu!(#ZyBX3BGZl)92@򴤌ȘLKxVggrPJVEs󹧬%-2 <ӳ1xt˽*ՋGK^О~[ ($X< IWmм~)B9qF1 )طȴ  GVT8cgJvxz!nrVK(bCe$r){"[D7pDh9mMrEIlE Wr8T352?v H8CZ+N dD"~0VSJI.Q QYxH1< )wX8eP E3zd2T?ԙI <7J 2 "&#]UqW"([HeQ~ 8$'M[QL.-2 9Vc '`:DRwܧCYB[= y($3絆wPYoVúBҔ0XZzE Bw)"BB˨í^qW CwC4z Z8Bt Ց%S<$Sҫ D2:W(l8)pR9) w>$P{ ^GrA t !{Bl$76Ad-IWr"y%s=N2Hݰ$o(4 t X ۴;Qb7u\h)|]ˣ 6)b[8YEԭ4a"R!gٳQBr %O)#,Vl|WhIJ^ &-2SHh|SsRU6$3`&qZ=' 'Th5x1'W$*SrRdNhYbcY5$8hJ zFU8Czdma߀*ֶ=Aon׋]J³ UDkL \:l1DJ]KH&OQPQԔ@Yg8XH1[4$=WR=-]J# ]6-xBj%g&]8QD@ⶆ\7pB+9rv!<7iBkKUOzEd\A㻉a5eQӧripC*Grd#VK$r1 K~EFG@:T`9b1(@,x‡% .B^+:V&v$<|IhC~cH BDaU6Ӵ4LHzKm]Sh$BU%stiJ>lQ%$0%u&7jMSga&kZ߶ ش$UN>,(yY'SP-X`j>'9h[F,0UW,?4)|- sDC[XKSZ-ąPBgSjh$kKȘƼ(}Q%TIf1Uه4YkEa5W-v [qVQI[元G/ 1mq!]?"( !l!ˌ\QՔ<:Pl,]ߜ -ƳZ1.at# PK*! 2Sc)K)hW 0i1=k.cpݖo2rRs@6{@dSTYfgRvĺyyd~vL'oJ`ݮ<2 _rK$h%KGKHV0n&x'=JJ⓿4;PUbö?ڂeqʊ+]^Xߥ*f )k<oCŬLѤUEzԒQH 0ܴHjTk.b[nx7T|<"GX yv1)p֗UQ0e]\UI6$&ei-Ɋ;־HY4͎Jo XD E@y/$>^ אAJ&x< *J {=d, }Z*lG'_r5*V^*`0O"E@N(E2b6S/,-@Z[b.=h(7*>zV՞ATHЖ#ڬ:8IBR۶ |woN/|;: x|;׍|I?{|6Q_ȟmS#sLJóoWwpzr4E&>xW|ы~xw;;ͳ?zuМ4G=h~>;}_WiE|q|rQ'gӟ54{~8|wOp@4Btts//OOΛ?%o>,]-_7?Fy_NK9?}!2BM? a$ I *jѣ jŬ+ {lG hM?HRJOm>nMT+dxwWHZR{LQh0Bhakg}w˯pIaʤ'_ZN00.vi0§]ib9b!ӽ2=Ӊ0'A5WҜd^CcN ]ܩ|nknGb g?mϞ|}ϢCB}/$ '4'o''Ogg7i _ߟcԗ7:>9:۠+6WGϏ`\:qivtt|{ݚOQ7ћ#Xœ&+ZF2QЗuǛͻӏeGѿN130^wf pAfߞ~)sɻb}7S/s'9:!P|gd:-=!z.nS'.Nv..ſzyߎ\ľQR7qahc=$)7NۡѠvߖ@[G.s{zzx0E {>vhzgZi!һ;-5Gg+n}rzѼ?;;#y}~2O /g2|H՟hқ^*ڈmd ;z?/i0a+k}W?)L=?WS%7 =4g8_MËox{v^r{v9/&%+R;A;'o}xKh/=}g|&4>v?o%em*!P(h'~t/k#Iֆu;^4cf״m8u6Agzwx!UR.%O9==^ǝSx|U -|q &_f)˦ yQG!ԧ%Rxn(=2+bM0}6!Z;Qg俣?|kAlD8G x D!"A"BF2$AH1b4j)4jihiӨ-Q[L-Q[|kAdZ׺y "rlb;Pl C o[w7xA ċ^AE{Ab?؏ b?p*ȫ"* ⺓&Z|F|N;zcȷ$N !#C8 ,EbFb "(8"(@ Fo#6xKLݎfv4SiF ւ(v݉e-N1[ "u'&AlFbAL"I1!I1"*"*"BEDTUDDTUѸ؍n4.vi\D ւL{ɷ>Aǐo-ם\CL#)AL#i؊ "b "AlG6AlGE"xA ċ2xA ^e؉ v"b v"SSSAAAAAABDxWQ)^ExUTWnAn "b/#b/@ Do"7&x f,E3E6xA ⭇Qs9EԜSD)Bs9EԜ"jNA)9~AGA 8  8QSEԩ:UD*B08  08 ѸѸѸ4.D4.Dtֲu񩳈O1[ NCL#)AL#i؍ v#b v#]#A xAE{AE{b?؏ #}؏ AqADqA7ěM DoaqAFqAY1 fČ fCSEԩ"TA*NSE#"Q#"jN5SPs9EhNBDm!-D"j(8 (8 qqAqq!d#2Q#2f2f2f LF*NQJTu *i&i&i&ih0d4.d4.d4.$  ƅi&i&4Qs9uԜSGͩCsOD> !C> my &&G@6|+؊ "-؊ vAlGAlhϣϣG=G=G=SQGET"*EA(RNEpݩ <;xǐo-;5CAlV #b;&b;@ ^F/#2x v"b'!b'@ ^E"W*x N"$8!C7z!C۹<=fIfDbALbAE8 gxC@?|kAu:A 6#b3$"h;W G ւvӔ"W*x ^G#kxAnAn "b/#b/@DAq@A8 " "qAG1AGg99@D'IqB'ĉs(:<0zcȷԨםJ$Ab3، 6#M، 4bAL" AL"PQETTUDQETT*I"Q$Q:"Rǐo-蕯;ssB9ssUdUdUdBDD‡Hp H1[ N AB dP TBE".Qr.Jǐo-(;e}A^ #b?'b?@DAq@AxA DoM&@FaqH#baY/ ċ<"1[ CL" AL"IFbAL bALVAlE[Alb;؎ b;/#%A ^b'؉ vb' ?E?E?E?Ougob!!9!ZMYwv*bALbAL4FbJb v#b7%b7@E{^G{Dt<)ՈHFDJ5jDT#RDtn&s3Af":7DAqAAq!s3LйD87jT{d#IGF=rA"Y1 f1 f֝%8 A 88 #c8 =QTGQ)GQ)B)8(j#j-0 =[|F|&|cȷ̹֝iBgϤ |`Lovf'ěDI>$Nh7s>Z0;[w&ha b;|vlFsd3#٤9͑'"5'9HIԜDPs#5A ^iԍhnD3ufF4S7D2j Q[x=2[O*$dtZzhtL^4JPm(A@*ȶ*Hl @jm@Q6P T[(jL57MipQ*@{!k녌z!kB B r w`6=f4JPxId%L= `:x`FL>4S3Z5M3[HPyq7Έo5;,v=@c/'pL+ψV53O+hʳFZyfM@も/5и(A h\PfD5Ns fqA?k$gZQ3}fb{FĶOPL+ψV53OHFRwf5@㢊/5cHd͈V53O'щF:bdmIdInl&4gDh MIM&II6N&ǁlƁlO&6$M&8oDֈQ76b>qy$ _D j~YۖqYϷ<@$ _D jQEj!A m(4ơ^h>'[ P4ZHP3gMN-$ly^Vj!A `Q j/=@8,Bh}ZHPxqdN<@#Fi!A@o8HeZHP-TK jвX YڤUI]H j -$(YYB+8-$^O5]иZHPKY5и ZHP8$Y5cHYHP4d}N<@z@g!AQQYU,$lzDVg!A `9 WAUAQTCMCf!A5⤭'ԈF*Lڪ0*L6,B*-URU*L۪0*Lu0t0,$yiViۏqM`ql%mmIۦ%mqIv<2kx3=@#@e!AS S+ j<Ѫ,$L=@#J6e!A `4RdQ=@#Jd!A hTɚ,$xf/ kɒ,$(AiXB4" jS8Ȇ,$z,Bh\P~,$(z!nf0B]kΙ3s&ˁ8h89h;gt$ϙWdm,Yd"< `%l:(AG jGGm%8ڌ|,JP@/ :YekeB:ty& ;ӉߙF,$/` `$JP ~.4ZOPA A3KO'Ghtݼ>tFp Ι97glМ)rfZM9'g,0)xE4 B e#e7ќ>y.&hNyb$\tq7N ZH7E m8n&DPR4ߝ0ё;9;nv7ZaYw sd;{tG{yA,y*'Pǥyfg5tONRaܩ;\3/ߜzmu[Sh,?{ˤH/Cy2Q!Z*}(Z*_-S~mݻF[MHf!>2퓅ɖi<ϗIo={eoˤeOC2BeoˤҿX&ː2wBeLW!e҇Y,3>0ފ%:Z~ ok{Z~/1׺ɵ8vHxC7[ւUk;Nh{Z /^yZαO)4D{ujq~W{?V ҿ_,~/_8'ujAW<(3]N-N/OuPjqhoC Ӈ qg>{OOBN;_i;rNwGуKE>E>|-;_ ]r)K $i݉eIKH_.Yq;qB.YH;g!d;q"w.~~z3~KN޶DÐ~zKN~DxRsH˟u'X\"}X2 g1?KfNDОr=2i; c'!Uh ]F^+u'1^"^H<O!a=z\0_>L}udq~!܏{O$Ӈ/3> -#uCֽB%{!ӿ Ǻ8~!z{ ^/OˎucqIHxLz\^nc{Nk%ҿ ʗH//3ƺ;z_"AHp= e]ź;_"!B9Xwӻs<(󏖑;9~|q&ֽt I{ ӫ~zhz޹X^"W! G˜_8?!q{Sz\0_H8 ;~x~)z\~+_;w ޳/Cs&,NSHP^\!{OB{ sc=,O.9)XwQˤ?Hob 5r`- ;eK? G-*,HO I'~-~;^~7'.y(yXIғ] =J_CCo~x1ɲсԄ,M_)i5+ɅI%|wts{z$ӎt{W>sH_6v^o%/7v*acPW_aؼ Ij9ge oߑl~ߪZKEY֐륊>to:|cR6^B?ܚ>%GϓI>^_tvl*TtZi _$|`̥4տ+3qgR2u2IzT)`Ԃ/*9ʿF~Cזif>WBv73}_I??}]lB BؔEi|q$BV0J$$ TCbLaeSj WT)Rغ,/$hZ.eaKB?= 6}V 7CA;2Zʨq'qxE}ZȴN/!iYIOa;v!ZC%y*,Czml!>|]YhRqc(>yuu!]=2W-'tYev JX"![S^4EiHi%Jl0Fێ# jP͸FCʼnn+,,~ɫnsZXJWE6+塵[_,SR@k+Ŷ۳y㾶$Za[++@ 4Hᇗpo:A4[MS7X\5͛6{z=>,; mV?\? םCiԭ!_bva-w$)u)N fBҰFUpA/se6а'ۚO-Y`]_'?]'MbJy)1Lv#yuIog2X~nur 3|xeEU^;JG&^±W%`_>-a6"?mg\ _GHZw۟_&^Kn̟͓f?M?{m*B .R:Jhҥi}0*Ւ9b*y’6&J$b#8#K', N Y NC^<=aAKn6cuo"E0Dc3_󿗐,  s}zۧ `D6Αӌ1Ebéqav?+2ƹ,2VgoƿUmԧW濔#`_*S@^J^+-X#TIoȶHSmU@UڷY?cM?d(c#$- @EG74-H0122DJoNa$osO*l"x'XgQN -(qAR4MI+@iA'LJ̖$i$\5\,ws2.(IF׊LEd!Fr2ŧղ_-sB\Ѭjmml}L yDLQdfؾЮH[xj766$#*I3J l>%+CZ#Z<ԦVJJՌ%Byk!V$W*̰!ʹ X+BT&r8,E@L$) eY)ɖtNR"@Xk{.f=ǁhsg=Z+Bxm"i5Df5 ^ڇZs~k2*SȘ_zkf 7{俜?{ ם_Op5MÿU^UhV43"i7:ڧ%V-8o+t}B5/Kl">^%6ke`9 Bgd )U1VEJ4cw?Z)b5f ?G~osuxQOݘ?<'֝gq7Tɟ+Ý^Y'[ڋnnwFf,8B 9B @pel`&F}N8 C!. X.IK. gE t7P̄2'IM| [|MrSiX;i_kK+N)\B_SӇç[4<{{@^ϒӏ4i9+́CQuKr{ӛԿ^?X/%/7Irz=(u!ܬw3 "6u}?!^a1'fHS,xh)t?AB_"%xz}{~zqgӋ5?F'9{ vp Yp$&FPϹI"| HĊ8}>osכgИfj}|wߟ_܂ 9=YsggyuߓO o'4xl).6dN ҂TݍNB R:y.IQC<#KqF <:8>Of,uƻ\H^8t&U^ >gR j7$^ ^FYDѷ7ֵ_ _/!nz'% ~@!A,1, ~F cƞsyR0{c'l%27~~v{0l-sOT5MR82.:\ ߬9H0o]Esİ:,Otӻ\k.]x1`?rW1wΪ(NskDnsIϝA s>sHiϹFxY`9趛3Qw6`@01dW`rvuVӇ_Ve/0wpx6yC;{uoV*[rQ o :o6{&/Bcksɟ8Z;ڀXw3ka]Fb̹3M yU TW A; e>1&3ǟ_ng $55 bG̟Voe>~ \|v^0bq*%//BQֆeߛ+?%[o$fDy {s+ʝY`?!=`z=֥pȨj Ir *A:ZN(Wm.,Wt2q#+<⦴ Rsw}q{5ڣ[Tбv  a% vfRg9]5݄̹Y%S(yR)Ѹ'Y-qƀ~jܰDrSa[*5;iޔaMW#KɄa3XJA͢^YJ`X,ភҺpī2d'Q*(BFViBe|>5ָsr0U՗Yߜ'^PL6N';/ o ~XER#fU_ey[Y.&mmQY!ict(t̔5 *_3M* wRؾ:8\0Sݝ9+-,HU0\QnRcO2 ,%/vZS%'M^~ A4LHPaOn%gD.|_ZC ʝ;<@9Lazý+[ȴ`dI9PijqSaO'}b_($h +?3D׆؇1P6Iy ,3#/pq^:{><{z/'q^:CPC$1U.*Dy`g/T2(oyGGM68/t;[yW!^B/p0֒I"M67p5tEN_q푠=_hK/!^j?o.txߺY-JIIaB @mYaNΗ:rx ,pDf:s^Xl'rg_|Q =t,_/mx>6$)ue 0]2;5\Y<Jb{!7˅x(1P i\ jBZVxDHLG=(FHVt'f, ukhiC̨̿X?Tְi,xFJ9#Gֲ@s:Н\gr4#\J7 ߄YNa&?^Bݺє,q#I7~bu.& bŠpRQzr:2jïmsg[PYS%ߛ 0{mm_7n^&y7]_}?x4KQiTY#CZ)CJ"b`K'Rq`n &,9C"pYsgr/@sRwl-r++wm\PXhBeX9,2Hδ*gWѝ h༛<+hfĩr9֦(e+{s`8EJ;As(,?mjV^u /,5FN&+k,m{}ߟ0I.qy)jW`&R+N \89[X\JHF62ՏxRz,,.E4$ZEץDm)Q_@O\)L Ćв{Ż_O$ggWq|`JK%=]i$Ÿ~q+BQ%NwUJG(,u%ӊk 38nQ陷2 sN5qɘA޲wr*]Ou%eWg{EyWTK^XUVJrn,w`|֙*s[C33Vz;k+eWx+RrꔶqtFUV%Vԃ#߃G y6b߃#߃#dQߠL||&؃ʣ7a|&GdQׂ?x=g(1iŭkerrvzyuy7qZH In ґgnn{UrÓ9:iB@ejhR@>Y2nѺS ^n( t!n0ƭVp/*VL+|Fq׌W,sxT:1~';Sjz v߷ ӥKi]7*/A!BfNOA@O362{*4%CXqՍz~氶A7oif_(NY`%\"#Uą&Rդ`FnFtrZV j3Va:'+DNiEO,Z5r0l&y)Vi^.F+z|bpMmfO&r%;Cӷ:o5o)$- @>!r6o4{WpSg(*r+CEdU0}/paFfQppf9@r >>)RR%Z*7D `f,ruPfdO (6l0( }3-5 SF)3CB2苕r!$Z(]L`!WYTEF"3kJץaPT 3ua( \LrΥkd櫨 Lю)UZB"f6hEa\=3]hgZط#ǁ fI ´z^ f4P&5K,3[I(/ܵ  `ML%@Q7לd +%xk6PA"/.M硊=b`ZC(T3є Bkef/ ę64[i^C^e)3Ѧ:qgpDh_ B^%o!7 ў_Yp;ѼɅ6,Da2)%(A+W,3N %'`Y/237ˌ4?h="sS,mʐS16Ύath,gf4P>U, 1Bf/7JfFgnkWÑBf L뒅hrB;<iD\xAgZ˪Ye/~YZ.٬?hYPpfFs`&YW^+4j>[%TUW#z ͋=AXAl!hmXx`J>XZ䨖a R@Ϭf:b:̐OC7/PSSHƴY֐wbQxY,/mΐXG̚m^iʭ$,&|KIiD12Qf0[B-Y6 3$H.rC>l9!@PeР&E7=hvL$!M3f9 pyj6h*&`!;tDH0=bI5j0ljx ph  ͟Æ`O)e:LĤa"& q0DcA1@=JR.K3u4^70u3kPdfD,D+ʵ k df>P,3mĈ;1=jHL|~jW̊Amf#J0ngg901qY9fp~7x /u0aZ pla G >4 2h\A,aP6-)ť*SIO3AAhXf5Trf&@+ ?AkZKpb5[)UpT`:p04YFLCeٚ06V81 .#Lۘ fhUXvܻM,1o51%H OefiԱ& @pcM 2Dd6!vFn1p; \R܉ָ悈8`^1$0Ѧr[e{ cj` 81+ m tfU8@`z׬ z%s# Hٙ}63#妋iYJ0ua8ۀB䚃 (Nq+0|DL&b0'b He"&b0G qT},(#Չ8j8jI}"ЪLĤa"& 1iI}"4 o- oN7rK3"o=9O\MCVr,$ ~YsyuNОWe#AXLqv;w<@xcfT8?)wE`:4"Ex?qN{Q\D^O# eptBiR箇k2?;.EN^"[ ]<-j%ܔopۢk=s>sN > vj<'=e˙af\m$]%>A[ qfAW,A\n Xr= Uǯm٬27lX:V-|>&%ҕ)El ov 7B02̦hk5C4EQ󹧴9[2HR%f0ܰ۩:]+k nx i*:*e WxpjO*>PVy!CyA<;CYͧt&sXBkǖx?qK/*5#dv\Zer=Ѫ.Օ=b0/p>aACY&KG⦎̗̆ZJ;>G̏?$ ~4'V,)>DWQ kA,{RmOlda>s4`.=|nn"s<w:A:(EɮO\vEZ6l\v`Ļ[c@y"޽徉X ׃̈́/ i[Uaf8~ZPkO[u]V\\;@Q:u#S2_y? =ٕ(dLt]s7;p^< mȩm\9s oC4i.QHf˔.s*k5R:h2ʌ֐f"woNr/'?X#֊ ^nx")h+8_^oiu +Hrո@ޕ57Dm={Cs>Cg3_Cndle/ xVB <,YH}@izBž-$Pl!AڒZGU T+YHeBtJ\4dٸQBLHRC𒅄쫖hyR|>,4ƖmZ>}!_EqbT|H3dyc]|PV+jLׇC`ѠP'hֱE [4d&,HbрJ[%]e) 9E``!dѐùȢ[48ECFECʲE,Pel@eTc-[4`[W,Ae:^h "a() sIa8Sw+ 0ܗTy턪(*ce^ZKʼe^X6iK-ZhŊ)cmi(+ZE\Q`Qdƻ* TkHAJ \ZF'56:)Pq*i,D8NTnNMd#m0qZlNAwDZ:zhq㲲:uN旱5,iX* ? KϸZ '^V#גrRE[GP3Bn/.*^U2j+xd9ːXMNNlIM&jrhWV&؜VҠ–uRY-kPa#XԽI_5C3R/Q^7aNYdqk ky"}y{do)%̜ FJ:h`r4UH$cHe2L#g;)-.Jҽ-.*i,kalCvZ>l$ޜr`jqnp}~zy|gq%@1)Wxx`7jaWP.Ċ]<ˈ_EH+Bp嫬[V@x2Ji(=)7sH·+rkPs].<%E껓\SôO܍+{Uq?i!T%/(~.W1+KF Wpxx&{^54Qa rD*v9\}<7dZQ^,Z7 3Y83_7yt,8,,m$,?A0Yj_nѰ|#i53`_&6T39N4pT,G35-S8X˜BUenxdK(z+6Su`LX}G|\Xg.i'PfSV88HD}PBkCfI,35 {@µA 3T_x՞ p.[68P>[bǺiiM^nV_,(l[z|$ς6`H 1IX +*upb,I-hnH-3?QTR+ OJԢ#ƬNE˜)S_I|n3szP;)nЗܵ4u pqqqAG N9@\.G1m&k+ZF-X,h.quʔPbaw5ˆ˼5C ux PgCN3^]ɀ^p9m-.K@wܙau5Gϓ[q;C 5P$4i$GloIucpu^Bkd[RƃA[&$K3&i#eXXar/{Xh G kdig- "tȦ)_!nJG:Xa@b]ݞf rvZPFJe t_uYȬvV% n$v:RBH;hהqTSppR:p}.+VRZ`0W"HZ(J!VX"xd̤хWQ0q<‘Vp`~e7 +Ͳ@J$iƾ#!CD¶%iӢh=A s#mąU}/3L2 )GzZ_~e42ѐ9}.+Pʭ /B]J eksqu6O2AU+3DTutfņ\Rc;@co]brvњ[iQ2}7X"VX]`:KZxv5Vp)M!H*E_+Άqy[(MGvC=+,L(5DNuVeeԠMlYmAm  ;e2t9q@˱~d(t:(4j}ځJR5>?!& WPɔ}iVg&VNӿ4c*)cwgif^-t7UǫVDq4q̴խ "n+.#FV)5~ZuoTG$?mҺèu/4ul4ˏTD4kZ%N#UZ˺fJ:rqVqe!1cog#AK<١>ßAF|N%ܡN'4!Cş:Ghf G$H(jK$!1IԞs$Od'?% =HKye?wiJ":s.|Ě־X?܊&NfXiEF{(E8Ȕ!{wJ"sy.;lJbȒSM# tV SswhH xJ W JU"Rr{g 1Q\?}K2>CߗLв77Y Nxff.H`ڬ(e93`E3mV9H}Ji ]f4 fF֬E0)1P]I`Os$ N[K~j$Њ .2{|fRʰj-¬; nC\вBqa;ZzlBjmX$\ J> df1h[vªՠp? Hc^4TJR YA f jTZ^ pxjE.F`s-Զp:Pm6^4`hFˉ!%zNҔZ\TڷP0#;E%9#f`ӅaBi̎$SƔ\Z2wR/wr 4=3nϗ Ci2VzUy>i/Ns.h z3vEme=E@IwF*F*;%\;sGn9 HR1ˁ0&$Na T1/D&i&NL= q4"9cpR "wNZ5eWA`E:)L('II̘`L=BB\he9IDR@NF諆wj+Njφ2Rc$K/38mda厶sgoג!.Q߻"7~}w~}:dd_FߠO^_<5 .qJr?+MCv WִLhWEwU`JOnqe/¢qj++j]L{̸2=f_$5 Y6Z`~a$ @')]J{`k##Sr;%F<5~T //͔aHvܜ^۫KOvX'F0쨆{؎9+nf9:C5&G䔛5><8qr1j/|'q0i\B'Gufd 2{Qnwś$ab\d<Bë'>ݞޞ_]]&n@ϔvbU9V4CH9V\dA Nu>BQ8cXdLC#;msV^Bݺ;4ߵD7HNK9x5{Q}; _ʬ6aWlhۦ! :Vx |!rE)Xf60l(wƇ/~`|($٭?nwFGvKLHh"^1G\C:?KhG0;z #G{ hL/Bi놻qޓm(l5xO60; Q@_yJIHWvi2kbNfӓfDpI=Ma9U"^+tr Vt.N;Tc9.89$a4"SA˄?dҐ4Wt zO,sz[yt՘]k.͙$#濗^zgr64r>+ 'kB&ť}/+ sJ1" DWE]„σkD) *2p{ኘb2NB,=lXT]W !9jm0wAr 8⧲uTP9]0iʹ(ԕs:\1wU*X#ɪp&\I^:6¼+笨},)ܓ/?"s0UONY&j駦-nȴ?qԇBՆJ&ԍ#ߍ#ߍ vC\؍ƑqRuwcqݸPix7Vߍ#ՇY?<+_Zexi]K>i/)m:LX:G'F૶tu\Z3Ėлm\I0p-SdiJM1aԖY8ɐEs˔t467};XݭߔvDa\+Ms3o$VHl2(iG2?Y)VMmBt7>^ gώQ>J?,^5[KlÍܳk/(;H[)5I,[pI@`GAd AP @IRw-#k E%_1fx[8uZ֌0jH$.\n3r3gD"S(%k3UagI5u6.YT[ FSn6p߱W:~W}ݽï۬ QxmwޥCS7&ߍ#ފC\؍#ߍqRdwqRߍ#ߍ#Շ ?ӖZϵKr|[8g'i cdه+[J{"m+&?0{ϛmSS&+z F}BQy dIC"CgҶƺ^UbUᅣݞH$΅W8B;O {4YΗ%`LnjUM Hk h!ӁFwS}ܿnIIO[t<ԭ"K ttԆa0Z|aG #^s 1Uk5a( 5ȷWk5®9DP|;|GX+WaXډ O9OL%m!DJ;!O}TdkUĐД:PʋS/- .!\'H!5,ct@ R$Q\;I]a2SN%ro) #S2H+1NX5M jŔ|>SRvOĐHb s/`S/!i!HIg{#Ȳw-T8mEJ8et#Lz^) /qCyˏv|;7|L V={9XYXtRoIfNĠSNq^xl0Dn=ϵm-RY;H./UOׅf~Gr&nH&\ao٤;LG$')#4e Wm[O?$nna7>T5nn,-r{ GP7&ՇJ#KT(v1yk('9HB+k{}eACB* o*t*/y'#2   mqe%$7E֝jok8Ʀ^W.fpKJi+[IC?o_^^޼` <=`@0p7[}Q>Slj;V"j[KJ@_tOPuQn.13_ĘO_@l5̎6v[ /cGwp^;u;ށ˯5[ )]7%sJvՏ˳ ؔͳg'ϓ>|` zf#|!ZkZHjZQ7ʨ>M[?PӹasnzBA%k(F *.ҔZ%уMvïk$n>jMOտx7q~O.w7H{ Z)E7GZrdi2J6 qn,5KͯWޝ9\ /#}0@v=жYӃ`g/鿑9jyFgh"stھDuCyTI!l><,5Ĕ~RV/5K)퀟SSMX@SFWrK4pJAMaO}!2WMhAsY=ş~7=_\ Os!q!μxnւ'#`f?cnn!~61%GD1Qs96[.XY rFW@Þ|-wOY0* V,T:ɵ'a$*Tby]f"/H_hZ:Rr H&(sa"kh.33Lfixu&#|t;QO Da3 /q~!v_?9>o'=yJYDϒւoaIm{ ۿ09eÎ;ٰm6 r_~8e0s.\[zam;>X g& XR$sW:ȱ:1na'r@qnE賑[*bOBꦀ. LuE߁yBj'_PrEe\"whTǾ׵j %$ *d^QYP֝T6*^Ì*'7:o` 6+׿]]|=a||lh)Q\ñ'82Ll:!쭆B l!1P;J6$Q6ٔw$H?qJG@ҜME6b;/eS,EE)?-]~N|-7zNjsi{_ߝRw? uL, RtN%73*])<f6|9n Ń@M b,ƺbF|6OO^_/!^pgaUf&`lieI! Ȣ*- g.iȭܘh-:o_x?z meE 5NSVRN[W9Άy[viHmM ,67GZ3 dONW⍖`1BRcHeĬ!"ݶ uV'E(A^KovE0)elSR\Cb#xwLfB'(5g9%H1OsJrZJ5++ȉ:l) gꂞRwUs`-bXYжy[=;Ng^Z iaxc:77)dp8=,gfPb3 tY Nt:x4 g`V` m/M\DƬggOoF75L2΁G|q8M |4旷w˳0|B?IYA#KH=ӤM2u[__A3mK\jI`%˫fmk&߸?>IM8fylL5 OY% &a"IUTZ+IT- )} a:/o/!^3xl?vzCmo'6ns= -?ki5c&;N;a9 W:(m*u?5B,Q,"y@I>V, 10S/mW?ՙ?x5N?fLQ8~۬,Lx.;bg6%WS);[S,,|4fX!~(*%KC2g}]C`gwiy%Mh?ߣKhkoG{,؏Lox&3Q)OIbDhoz~B.0^vC7{ vv_Z^LcE\i: HЃ0tK/m_Oo<yds ,9;1gߘٳ'H6O bٞ 7ޕ0o.5k *BYɣ;Џ`lG} `g/S_=1{Y}@y7ɧKp^̝K`Ӌ|tC~mma`gΧ7[ G?Kh*0Y27-!>:d+s쟵7#shu%$٭?]Z=gc-E*P/mJk@,| co{ m|tn24c7-vi<[Vַz){TT붊FhO v8xY?x(( @"^0"G:1mݫx%Ĩ5ܕc\MG|l:oƆ*V?y'f|ꁉ@'1L>IY .q"2Ԏj.rY3@X:(RFNߐ\[oaj3 KD┊7r*5P RgP,uo}ӪA%$ h?uOi-qw8qo7baWO*K}rU em/1{@EoO/?]\|<='xw$g8Uy1%8_k=(եcJ(ޘ ,P \6ԧB$)vJv2iOS"R5a1Ji1,F-,cٛS5F=иOSO_/!n=[S ?U˷%1Bm{o->4D 'pO[PRV} D.%?]z~zNv=NesWnx<ȫ )aY%翽;{_E nSHv@ <1{а/m{w9M__}pyI@|4>|`s@L~L/0{3?J^z >JwLX-֖ToO>0^mn|"Ԑ0GQջ&._̝MT5WixPl;:ٛLZxnbflUyh01]Mqunpr˫[h֫Z!kV_*k:_n,Ʀ. 9&>.ؐvOv.oɁ)zsCA~>|wxmm'4,P3NAa)9#a OL ߜafs55p 46GfUpC?!Z~l'p 1V;pyՏpYXX ݜl$QYee2\BޖjU8.Gos#ޔQkcp %yFݐ]}~zqSMfv=w /p}e0>^]XcҙiX7y?_Nu8p5x%#dq!%9MUa医oE]_7m%O(r<)Xq%Q%nF|i'C(9yaؚg'?U(6d)#O /\]&u c56 ;Z9e\YY+36\ :N\fcE{$mi)`g/_ڵ%1`=Oh}0^t^ z(ޥQ - vvݳ'cɊ1|51{0{ m?=KyU;q:w:/;{ ?_yO/m/?^㍑/F Krm0 vRS =t:?6 ?-YZ`g߇okkL𽆎R(g. 柬7,!R`JqW(reXo }[īr$h/: 67 2Aߟ`&_,>h;{$:k#woOedYobELS U: 6`F6=3C"}Q!7w|:A6?p}&vAZ뇨_.I'W?f(0z<_/8]]"U+/ȧ3e6{O?!^w)W:osZ噝fz-c3f'ES(RfdI Of?Ih7%$`KhwOcR&A.?;{:O/m??;{1vz m_/^B`A?E;x[RXD72FV~CO?k^B_Nd| #/4@v_jʱ*R䅻}{`q n8 >wòyB?PH[/{?~7E#Ox3 )3u[٤o 2  ہ<*XUDD &3"4Y0/ ޛ/Нߟ=iou@Z4N}A8k mO??!^H?f!He̟yb~R ؑD{}}m~E!YS``ֆQ*-(Rw2+\֟3>'=\5<xDEF"\#Ӛ:xfnS~UElR&M >l$RY&YxC'= ?y2=t&v)Xz@X ykdfR%*r\pUtn9)?=iCFu)6*%UNռ#oj#l[+o8ȒyRSOR 6k/YC3DS֥zR:?z m뿧a~} :n AGnD Ld*d_!afaD!k&IMGʼ8+ ZE٩,H:XB%_Izi .t1[2j8nd [5eVLMXΗL1ӐV^}r~8L%wuO.=͠2E\K)}{*meW7fcq(yiz6s C2REէ[SjWɛpr̊LJ8HI,[g}ȽrYQPr%iQҙ)"4blRƩgͲ#P5 ?IQv3Nߴe.x˫]e7ЦA!AEM N8ڂZq:E. ^ -#s&N8\$wɽYѶOz v -=?%жߙs,Y :2 4$_dm+OKjHiɳX-s#Yn btJ%l(B+`Eu߇p-9tQ HWjoQ?BSV?PcQ4 eQC?fd' Ed?4 g|ijvgo;\.s̮V,ϜwVes("Nh9c2ՎYގ<%&3OcvEzdBi>r4Բ4gr7nfG)v B[}#`&p`q= elXm=0GPdy/YA}g|<x x ;0g+#=55qʟz=?L8uB |gl8X{uU&{]kH3-٠6D:k:[tW _C_/!Τ7_/mOPw?AJb\FNl8pRi %8Y1cG]nQԈrgV l3JiUJuvɘe:#/&YqkR+-뫜T;".KU;>4^B﵄ ]W#kϾ#8tu6gW痷7}Ӌdz=47vrڝv$-87#6,~7R|^2;P `mr0鍈xrɴ'vON, =;h>ὥ.e#W/qh߯H.UƲe ퟢ-Aʀ, PUK|K"i.5k_UZZ~rQk{16)킾bX{]`Kh[+_gWWsTA^k |4ng4_{.HgfUfٵF 8W@SXs)K{A*#m wKI *`gٸРn"L6с]Lb],^24\R\`O&O)86s.~ Ƭ`5@qBrTej%3mEkIa2t?)xIU03т"7UDz2Yd`9@j3kҵTj[C* |Mp 4сV!nSfg9U90xa_lHfB*zFo,eDL-sFu4dde|oy^2GK VNSa c^<-K졚Z3 QVDTGZa&AqΡ1-z32϶py?9cVlIG,W/!^@㴀["c:?&cJ>&cZ5S57'ּاߛ,m_ߡOg .d/O/5Hn/taӋOskoƸ4sk=b7FKXfO3\Jx\ FBY֎t7!ajc Q!:`/$6+d ӋJSäk?z v*nlWWֺ/TݯԊg!(z[} (@ `5!LаPf %PO6 p/$kgfI ,v^ks s~xZ2fJr1J |\pkuPo_=Th? v~d$pCj*Dž0<5C1KTq{DnE(sS,s{XkB~ ĂٴйKD>RCζ9/1:d)jY7'`N#DN̙1L9dng$/%VfV=t& >(2{#'AKH;o`Z2}BJ&ȉcs SB|ȉ#vDCLeE x)&Bd[2&c,gLL<+OЅ* fInh1y4ER9a9&ӱNoH yN/'3!ThmH-9q̴iByVԱ/ T)5aF^!Ӛ*m(H׎쵦7?wz?gqO K?1iR p+u;C93|]wkYlbnYH9P)1yGf#<ôޑBMK}UqHyIcKH((nF>W5h#e_^/HW2>t~c:vB|u*3K9V%IC}l};m$e٤'^52r{ߺ_mZuH+B4ik23h,R,U¥wZu=>Blx|kc>! |MGL4 3rF6> ^WGD9QYKMBJ?{4]Ö RikUߢ* \"RJcBdϿj{}uvzi܂M?[^r;M'x\;O^LLI]Iקv}{ 4d ==?6 NL E:۟.`7 zŎٓVvfnEoex+Q]#ZnV/0Oh8[~>9ڂagd{n_oӰ]s|z{q%=2LAÓ?X,y 4J!ch19ztڪ$5V\'OvdO&=K{\N)3a4٩?^%IBZ?旤835uHvEl$zo7hض9rPA=ރxG&1d Mߑ5V*>ئ ;Jv%wzw\!ud wö.U۳8ԏ͝`ڔcwlQ_U =R}CNS2Aq?kQ6RuGpdoWY֞p̐EJJIC;NL5˳Y~L' 7mDJ М$?`/5}!cny |1'X>/ E{n?}8YiX{lVؔmCa ,WZ,D?} dw9..nn!,wC<&5_ ׹75#r0QMLhxV3!vo'k{ps_kMj n TɓTʝPJ,n*'".9彘Q-v$W㤫f0u;Y&u>3: \w%#FFӮOǾWC|ީ.vr;jK !;!:}.h/J`/&tQ,tZBh뷪!N.d-r//RVjȸ@XP7>2<74Ȼ߮_>,~on* ְ:&eհr~Еc+ k҈r6;fhw/?gt]@3ȋE<=KHNԋEE^]a9ѱ }n[GO`TP揷I+SV"|u{{j/6F>`{gfhmLnO?1APg@ǝk֮Uy͑,hEdAݢu/i>M Ibd$KC[pH>Р`[hPmyYU.,s|]Anܾ`Uyx)K|v'<}/mdߚo%xO~=OV1 ~wa'`C8D\nj1D6aƵqlG8< tAjԤ62u<ڽy23Ma`9!lA@AZ QV`JؒOJ%>hiE(6 Gc-l<|>y>}:~q`qy:|jWf^2YF:`d ֲQ/]&[x{ 9ͻW.>>Kq'8Oۊ߯Ӧpf-(ku+4dZMM樕9@0" rEg{XGb6|226}XY"HUc%?qylyQd;R?|Р!*.bfW3R+ѶءˍģY?|<-x݂Z#N[5iCgMaeWI NH@H [s+l ;BD&D-$" H)¯M* {u E]ei+eŬVbh͂W ˈ_u覰C4$[_υrR ߽gEeķi\5]F2|ϊ6X贱Kk `zM2;ȣyt3;9;Zj!~MltB]Wx!JY1YjXKr|%A)O>eR^/׭KyJy\.%O{/6BZMj;yw6N]wJAGf\E#E*皘  t#:aomb^2^/W͢]RF%ntS a5BPA5vwsW.)ɽ.mH̵|vIJz׻UZ;~IY*E-PZeţWyeβ?./gP?wì$mD~5{X&A_v.m{F dnl_uw EnX$E>}S%Eݒn(b9%]!7 AYŶOlmĶ8&Yy;ǻUKcY|UDɻE>~Ly$W^$}Mpc@1/Ѓ)* _G(%+e*H?H? 'B7o)VAG߃oR7"mԶ$xR2ے基_XKZAkE@b֊Bփ{ YH2*dUڇ*ށ!ORN7:G 3?%گ s/T%4+zPTH$%t_ABd;Xi}XKj^%ׅ[RE5`HzؒG:~E$x0Hpoet?8U7W} {M?[@ڇ.fҾ+פwQ!4H FWͷ(Ƭ- d%,`?תYCGzwvNRZmuszI$~өs&G{5)+4. @j]YÿK5YEK&&KhCvK5YEɵW{yU~RxMUwcj/ܯ]҂o,_`%ݪ _xP.R7TqHlQےg'+}*?M/AGï^wz)=DG~q$H6萵wVݭ$9??NV,P;8XKM쯖N.|`Ֆv_5.tq(OۻtIa;Hi 3;=U;!o- 'CLx^νpDf&ٞ]@\NY3O`*`O`J;O`t> pЪccfF[*g t`T.o3v̶?/a:T[9Te/}TZein'AU[[<^M)x0l*tEnxco:+:?]vo֎зw>}y^mg\Nvb}yDW%Ue[|aw'uyۚx W,6D|bID'-Uc&K@~wœ$]uz^cF{nLj+^aD~7Ugtow>[阢e:>9EPO*gw98IcS}#Т hc.E@DZEf4m!?srd`3^?^[ ;I>:vIC07%?}6} gav sqv ݾR-k'>Km1)vq걃:B.g8pb?@ xN~$⇲>/RVnfCʣ7G\AX]} r; +@/|L'=on;dNgԓԯ]|ɸvj.+ZU"ZMuIErAm+Jw)2rlvx''#9chŠN[hv .q]P~g7‰U$2A,!| eN:,6ϻ- >D,Y`A,ZBnZ8^e%wxiXIjnEM_ɷqg t rڋż}{g?z_agKY"ݚ&K1+qMl }u@/^6L`T${RGM{j2d_&ٿ(f~|v+s|{n~ U TQ/ߝĬ=緿["mWAcǹ]{kIs66 ׉b'Z`wʦ'X`nvB oJc 7btI~ػJ^] "狥*ա>ߖ7K14-=j0|K[WR9X]e)l(cYrG҅K VjoVHiϼeq{yK|KyZojmnmm`|E[$A M R /̀c"=o7N`k][m]Q߿]ތ>ܥ&6Ee;;OMI3?7Zwonh% h؎ln%Zy Agsk ]m4#P n|'+yYJ\ܩ+%]/ݾ׮tPx}Cp14z|49=ivcˏ_ozżQ/jΟ_ZUy<7~E7GAOH #EosC]|WWll]Ag|9$js~OZ||O^\M}7ZԻ & .ޟ_֩u5<1KitMc\_o>^˹a(=ïNmn6c>TsÞ&Oomџ:EcckHUu};ƨ5[V_Vv4~J9[V6·A\;dxrvu ʛTr/WS kYՆV%ϓ߫x+Oe+[ e]BI__iՃW/EB#*ia _TNd :;h?ܿEլ>,t2h>=?"ԠCnP|*ѬS:f~J6j:>@-eRh,&0Ϟ8&j)FԆ:Z!3O?>MPyp/֥9|Ϛk1S3;O{1Zݑqف[Ri,߹c |V{v%u+(![9Ϡ|)M̼>M ۺO>5ݧ38nN_9JfnmԗoKq'K_財&rCl{zuYUEdsv .7*S*PɋV}xY.q ҘAsGiL)}i̴[Ca>;xm頳wAv0e|շOkY^BYmPGs%z@6z:”5S "_Tڛ B:[ߐP6ñFO6|6iPhk"{j^ k5uTZTLGA.⮭A蛔m|d0;Az4\mʺ(?WÉ%Q4ku:I˴I"%Ye%ћW?Eb CTipY$f Dˆ}(STTH%?*> #ַxuE7=^`~?CBc9C^@kܦB[NZ_(h|Qc"ThlJJW^kݢ}هn1\%2>V"MGN_>҄^9Ԅ^5ք^sj ߟP7o^\/o1'7̛ F8j(OXUHy_A^1񛆏Ȉ*AD "9)mn0jt8JKW^VS$K,䍖PmZBn?/i%VB 5J?X?/qBI^Y&:6&y}6ȗ0 Be @"?h:UiX1 Gʱ< Ԣuv7呾H+XKV׿׎v_ur%J[)ʁ5n6@JH3cn]ꈛ4Lc\| ׻ .+6ٽ,fJåѸ1ͦ +CdaQ+] ] Of葳> b]4q@*|M=}MG,^\ @yQ|O!Imi iA&B&m"6. R\IqBiH`SvE!19mR|d8R[,qb_\*1)NȱyEun$O#F9=`p2@p-~qy4W*w%;i;.Qfmfnj?ara#-z,T3xR b٧}zCicIlk&N>u̗YGdY}Q;cX"9Zi8 kkۆj{lVXy(؀1f϶l-7pj(, z̶m+VbLp>* VN3I)JYΔƞ^5љif6ZS+͋6X:oɖ&zmA6pAVKzhfZxKe[ 7#Ԣ;n(Jr0 Χk[C$ _ZV;8Tz1Fυ4ZaK^H7h;~2gm{P#Yg6psf<}JNuh:|;4KYKe)ډ^{+rR**XThyBg|Jt([c[7~ ^Qv^O޺sR"wIU0s붵L5VVJ <[NюvV09ěRh!t+5Z ^pv>#mD مE+o!Kh+"[#RԾ$N}Un& ݒ<;Dc-w(_.$_Xb{5ߖNwSt#1RI 2vp=fi\"o1XH-xRi̒Ij,NdPE;"#9O&X.&KAt47vrm-t\Dz6"s4Ǣ86K60vu͛dC%;0& ȩ˻DFi .G`K)'yEnﲟQV5&E^NF’%ǠF*im˒d`lHZ:9mR{o ; ??p~\]-ČM]6eyW&Asl4)j+w3X>朶\%[[dA!"& O`i HdU@߷"8BW鉩NRV Od$9f5Pr= B iqCkJ˥RњxeWrF"``VL~.y&XP,hO4ĈWG6L&h7D&O]N­m˻Bw6\&q.f?/bT'ź sשUl;"~ɗijf,.1wޫ{/RSH3&Ih-:^Z/vt(! QxLnE-F&yAdqyK/T;YQ$D݋i|wF[͎md>SMg&84`SRG'ߎDK0tAϫW횇栠3V}/m#5/Ɣ߇? 1,W}L3xBݓQu02h]7c=?'*YOL9?;:t<+ (=c؁a,2lI8DmwΟvy- zxĬ(O # p:`pe)n*vƟ-U30ߧάs7zT2#um6,D Hif<㸇Nx0a}.'-KBB1$81_#;n1xHvZ_d AD<0K$̵|V<EscKlbEѐaƣdR *Dx vlsYw(G;?x#/?2iiG1O3{¢f}77dua+"k;Ճ?7Xeh?0VDIX + '0Ƃ2 !ѷ {tB`|heJB`DPn^Qd z޳IiqhҐ%]咍vPrP&%H.E?\ 6d3Imo/5'PN3EA4̔MineSpt"똱TNߪrW\rtsqZ\E/C!Hk.H/TN$Ncqݣqfˡ[i0 IAs-ՏHnk'-áDRZV7aXdjD(~L*6^/OeIr6'Gq|j~l~ x-I'*aTLMN22z{NF/1z2z5ݗL2y6? t`}Z5f}S.k~6\,g\,gd9_.Yr:˙AIz{Xnn3I ),+&9Q M>38V=le=|,k}#asy0=̲N7fY $o̲w,kȤaY3q"lggbZ=dZ_L3@%j.SrZATʝ3wr.iGʝ3fջh>rCV埋;.(;*A"/ԄmK+ GYHmp><Z֮c\/M%!b2p-/?׋{s6P§W-¬\ * BUW2P Ch.!| aBdnZsdKz拀z0 asNRe*6K)vВ)ː{h)0Ar;hqs^/WwәSqgN)jMJEwJ&bw`d i~vq=`o8q n?nqba[un߾OCWF^UrwW,]UP&PS,7#9v .Y30/W?oo|(ÙGcL^Yu[ ==ֶ#C۾iI7QqcOԼme,\b;fm+#n LDOT>bꊤM_"LZg;s-Bw;$" C,錈$v ͼP'qF7Okۨ96rgY#.AM90͎rt7ZlC%myb9\]/oLI,_ S4 T@;,}l\}G-:-~,#_b'w.#.Ĝ~2CɄNB&TJm7Fqc}1DY ɮ7YG>g^<wkƸ1l` R:)ԔNj^ h:;Ij'5ɴrR#;ytҏ%Auz:s<,OŖx}H'-_AÕsIL34 \ QzFM%z|ldewJ4KY]:B=9puqeuJ~7{8?՝%Xz5@O0eq sCD!b"JGD# $h?սA}<^#_~APD@q9,jd!ՠ;uQNޘ~C^Ѧoȏ jЃD^( ԑ;hԂyZ8*L HRXi*?ʒU7~]>tב{wa Z:yrf͇Du2le8`A;/tzӫv,zq~ۀk eld%]IhؗO9~0MPNjcۧ,kTyމǤ1]Lu {6 ¦)ri0MH a㦃d9Eͺ!hϼƀ'W'eEnԹ{An—?oyxA#}_!:5U U_ibܰ< K?(ҿʓ B !_F !+$ԠH#gȩF!lZhzB#@r([!u-Fu(;2 ^i;!n$#1Oӝ"tDh 6Ӽ0>6 $Omav'!'.oDT鶁en"2 'Վ85:I\|O-$ ZU!a2#ɡS?'B;IRCXjDh{: anREiɷ "6&a4&!2Ly(f qw#ZF2e/k3/1KhUQ[w+ċo+lUP;< ث5ۍ6]O|ѐ~>"/H<>A!է4ARj3 =ګOF@dAH^JޤȏdQz8T)GL GbR_AȓãCrf H>)$| 5rL_1y9ʿ4뵠]ѮۍN0"ZH9e5!'8Zdz{m#m@֗oWV,m2^(WQ jЧ|H(y3x5-:4!8pά6jhIs3ȇM2q|¼-a!6<%j[#}u8u-5^m!mIWCGm @om+mw=` \ 6TQ/"r7y; e((oX#הb[FV2>h )GEV]1_by YC 3iO,('2[^9k-fp&Q)vM|۵d:7B0'ӢUP =}-k,]H'|"$l(ǘ769ܷMëEHX)< "leM d%aD>"Qk)Lb6W;l-78aoSV-OD;۸ӝ*ʿΔ#x (6va4J(=XO-/nk5_D0y^ؙݒ`^oZMWE*3Ra!C`9 e~;;/B w^pRdVonɴj;1z7FThg;5(Q[2bԺ'?-2AْRJ}5&8%=b0{7=Xa@ Ó/Þ38_I@&.Ż-ڣa`:X5Aw17:\c.!%I[S0/sP֒X4|ǑH~!YI2& H/ֈt**oIMN};\/(#uХ-_`KW3,NYi?/ ͥq2Q뺵 F/&;ſyJDoTS{٘JM@y9< [H.Wmu W-$ 3,J/,aMeo`Ze<[-O'xQyUgC6Jhg;"6% 2;?mBM83yanyEOsdF*"'.&pLkp>I2GT>/UYD#J mU')-'JO`i\1z`5s\ 3XqUoBi'1U͇Yz1_FwkB`Xk.kI,PVN,4U&,䔥)/\(Ɠ4/ޯ~={0B_oPD;;?Wr~:Xa_`*,֫{=mK1w{F͑ >o,(~57;ZrK9rB|󎴆.Ø-#V5~IQ_nr'9X[ ilorZWJ`~Zkk N|j!GQMIs2̆Qois!`YZ5vɯcٶ12 6_+&vO=O81 j !:ݣ)E޿qDzUq <?Ww_(V W].l+˻?.?Q<ԣ$aP%kHzy!1~?J_!aߴÕEyn]{w|^"m>G4ZVCz~ X=`ܟ(*ηG@4h4 ~@F%G>'LbbZx$neT|t>NÒ#N Ӳ.ViԀ /w[qL?  >iF9\]cf?bv?b]^TA?p?g_G* ՠ~$wg-d;9?"c'cԩVQhDt++S3C!*-4H y\!]lO|Z!Ce~hl%ӊc O0 TiXnpݏ8ޞhĭ7{`xEmd3a^IߟJxmz|X-Jjn^O$~| `g@(e:8WȤ#A9c/ATXlKLp*,s~WkS݉fvOx\k_Wz`<*+@v;08RiiE!tI @Ƃ#$cʫsȫ̫@k @̫y64wp&da>:!ᡫ]D{dM+Ӥ:E=Glc貽mlK6[a d+RPFt"99/JXqT50JH˘R##JJ9N5&J͔ļd=zvlTϺY-[FT"k ԘS<俧7(EBkDx䖦QA1#H 99co9?.;d +edFQQE4 s͓c 7?M("pl: ]l=) KmolX) C/ P#:Fo3!CgrdC'bޡHNsȶ#i)bޡw-n[{w(];WE/moTQ#'LDт'Q UvL'St޻}G8VwX~\>-D8 )ZQ;J ))d7~F_no4?r鶔M^%&LiC!mф|yVz{EH]!q]zO8NnK [BS!qSznH,!q(=7$l*$b] s}V`~]V?kni2?aj)(`F;V1fO?S%޶ъWHRO+dg2ZF_b"/q_/FW/*P]TbmRmwQ6nXiPFr `a&nHgwaR@ 'FsjQ_@OØ1 =otLdFG,g0G 0g9CJzg@0zP\ArY^3_?,*_DR‹REK?)__YߎOކ>IJѿfݺwҫan;yxr{X($ u`.R\!y\ ^BqOx [Q>I| qBH G#s||2׋2o?g<ֻw s׫ŏ%AVNvy7X9zM`muz"Y)Pܨtl4B^š`JYHJ6OL}Dl'&ˈcȸVwdʕia/Tihg&aBI_7Y4_dњ£X?5//Ly(!4cqoqq__v}U¦OW9_[>9T7?~^N;\p"oR! !v,wb昽*7E uPضss:22{;2Qo`%<̠]= NH簞1j>fDk'~|V##]TžDdTp?H'^Qsp]ַzu_4Q-O\.J?.rq{*<+uz9"`QɉS/<$;]\,ЮUƒL+;.@}hX7UiOк?fg'I6hЂ?b*$L=<[B:.~zvJUAM1&nooIok|`&1(? 17)M*rlc.yMX2U3) ᗒ;|5ܡfNJ A}{F3T/$0t: ;3p 7kDpQH7>0BhvPaAepw^jCXDfK1.~}0*U^NyDZ<"J,Lqw*Yh'Qo^0 Wǘ^7"3kJɘXSxe>|^DlNyY12e(&_t mZ=w\$+"7]8w95B~[`H+\Q̄]K8p;Zr6qajSF K)dZ8 TCʚMt눙~̖g`KԞW -0i^…Z77?|đB Rؒk՛u#勔0JM]62yDjEe }L"i˜D2yFHͶ!^W  ڕ>L?.r/yhggɟs%`E~+}~3u0+9{ ue:L[ )aoI <,|?)Oϥhg; _ [Bfe[_ot p;1vbߧ.g,bVzx۫@꾿GZn\!įTa(vx?;**Ɯ9O'GGGx;:qGt ѭpoLtIF>isubM~ZqV`<2b3cF376oBLV: 3O LR4ٯNKKfC ,—߬0 W+boV.`|!CɔV𔦏@3c[ } r#gL&QD DD=uA/9h Oa#-&د4{2x9*HqlO Qr0rF̈́\ͮh츢+x)e9TpQ/S=:]IpD8M6$ΐ|UյᜱU+d-u ]U&(K2p 4JO "̃&i$MQ-R0&ҭ:"M`ĉ<XS3*B-.lF9:u#A_mJk*+̸T_<誟V.n6Р,H`R°l#!x\Eb$Uoj<̎.\ƪYYom$k:6-1wC/ Pd}vwp]h. A_}F87bߣ煀E7I5vƀӞ^) D #+n+b%x\x|64~kp%\qxr2y2 +I 's8mp2Ո.Qe%\%^4Eg%\//ߋz7,($[9a X / _ ĬsQ7_C'A}29\>;?'tsh;3ÒoV1<@OsOq:ނe:>:[:>}(S1`FوT;D$^%*Y#ԑW+:?G8?AUd˫4WB\< " ra/d,)KMCV9MPszwIH獇yS t+S<pp8a"~o3ak^D~0XB ^\agtXr-M̎8Oc}"/83"U5~k;xtus!tZOvx;뜝͝i2t;<{ ؜glm!U8ɱ6<5UDӥdxŏLx Sxxm1ë.2*J |jQaqŏI#JY#}Zb)uRqU^J"I}%/_RX RT[S_*XBJ0dU%4%YAɌ%ӥ'Z7/,xF:hMo'#C=2@A2 tT3 6I6`CfkZa|q'e9'@IB=!t@6E:/Z~Ce%?uyehT#kMFjP( [q>=+HJ;k;C@Vb9;^|_*FXE0;[ٹ?ql=s\qN{YZ"G3{X5ky㉱0g./q&z" M4&7<Τ%W߃\II/BTiM54WZ{{&Ija}"bx&6sce(.hcac;yxuKK@Za%z3BXBD.8/Z7;xg~!ϣѫdHL4ŋVXu%~+2 4|%KjڤC/co,&\5ȗȸk^o'߯h_@@ ɒ޽#2%2vy}ն^o 5^o_t~-ZDbhza$76$D ׇѷ[+% Q%=W<R?ayb_2!x_'~<xA#_D}W9]|)D}$X'sH *^=Nhr)”u)ATwI RUBXC1q3!WP$e̤73wrVB=mH+T9T ݦ`Yz~[b`aؚOy%Y wkrݥF%u{ .Dv)􇺇6@ۮQ5Y 6 !HTJ< `aSÒ+$оvT{HV4 L*>n>PM>Bξ<$MS|5T7YQ2/$ Y;0nfo/ab ڭz|4Y[4RïԶ! aW :j4i6ɚMX0#j'\>@P>d{Xh!~6ɫvHIA1Rۯ~0z&y]*D]@si6èi0h66aqCx o/KP=__,̣ "y5LV2YCt(F8ġRެ5TȦxsD<Ǹ5&h'ÆcoJeg# {^`ZFo!uFfN2 <a?4zA'!Px}˄ƌfڌAh7!8q&B^$cak11dIa_&EmB z{i7qè WkAX͑bt"m9&e6{'$Bh1^ aM797z~rDاjpؠh4dKj-Zf=uzEolHxaV'"RzPf]@,9n'+V P=n,\RZiZA;bYzV $@v/l7cJX"UXŧC$CH 7{` <[?qY->Ѫ}' uC;EBѷGԕL~.v}kڷQ[c!f雔|3 =TvP~axNO<Ǹo GL:r9Q&F8xEbT&2yR&F9%1G m&SF$D@4`|*Re*Df&|"ҳXM'ȶى1x;喟 aD:ى"Kj)նMk=N#}#BCd $}9"ˏ(2zr b@r #2\;Ai(Yv!u:% Sdܤ0mURG܏qbhmdϽ냉XFbk"%ɿN|4^4gRidFe>eYH)T5] 9jhK~JMHT1F bqMKnfY-B2l[.5pzusC-9_? ?~[!oycyb^ p,{r-ZByVw .J 7}f0@ d ^34?x߫4՘?"x<d_WF#dM^F==fg|?d։? MhrF}Z@J;`vQ/gIv+ö亀R2`63hMICo˹a= E^,WvSo#`iw}fᅩ/FA+zIt;9$Lܩk徜fCMll֙a|;C0.`z+aBx]kiԙOx襬W~KXUkzX^fOvЍpD=cMk)4/~Rr4bi$vͩ~vߘޱ乙2<[0B񿖊_!cSDvLMznj44 "TuЀ]=ܰ M4bTvMD>}hڋa-#fq Zϥq[,겗Z? Ȱշ4O^<=@xEdN?v:B'J@ڄ~  4EhWh r`}gOD"_dɤY[ oʜ((F[ 6ch .Mr ֔H4%eY_** ;u׋l} .Xu_./V$&@%?~,֋_&fy?1@\|h?`%HPc.: 1A|䔞xTMv?[-х3ܕc~n4V A#r_s7i6iЇkЦOZM*^r?`֘ef7*YKsa,z`bszj̀ D^5lc$]κ9ނvn@~;U= &$* s(A͆ǑX[xkչOg^;䂓JpEGg|[V&s3:!M,úTz$\0d=ah͐Q= )hhl4٘p;91Waˏ6kpXqȼcwfPiVsmї0^ZVċR~l);yF)a|r4Hh24 HRo4-ܽ]ȏzݘ)2TA^ڧw}sZ=H&DiyCdϚDN^A!#>wU+wQםaڂ_f㌴-w1\]o 1<9t;8?fo@ 3,\TAa9@^ioMYTvw}@}-d QYU2 K,lgic4uͥ$p֏W8_{8;6X}H=2xe^֎jf72'kWc%o@VZ0ř BZsVA޲>2`;[vӖ U&3ԑ]-H=Ac~ xNQ2sʊ w,nnDH $^׋hWh  Zro:S%rDaa"DHH -IV8PN"쬱;!+Ve܎86|ģgPv5DZ.䭔 XERvLN:LQJ`|OLVi&qdHG7׈8QOD B%vWV9݇E)Gf1fjѴ[ؒ~N&(d:ab;&$v轇cb2Lу‘V9:<73%?ȧO>l"Df4Ec= }OHyp#6t ,EO%)2~\O&ظGr'xaEhHȟI-^t],D֒0S2貍 8VhH;d4&M<)w̠v#ֶb:pqHqwHsQ@a'OeÌq⼜P\^i}9L3鲼O$Yg6j/.*{F0Pe$~|v|v aNTxT!\*S;v+]LeU;˒$𕱣f "ҟNAC:**U~%&**]3exHt}*J m֚ ǺUIT|R TZTLā@Hg_)ûwHQ YhƋ.G;x A;d[ Oz:2)w !̈́$tw!gT>3ҠHTҌxl$6,}+irL<@OwΎ~C5|ۇ/y Slkc6úDA'ۉLmqvumW# I/5MnnKGRG4v\ 05Dkņvs::7R 'x`f?MÍ&T\8~=Q=c-KgzGVQ J-MiAYf I2NRfGY;K:Ķ&ǃ_ 7QNDO+@ 4(~ $hta26_FnB? %׫?z!ed"V5o!͋Wz?PI uide<U?6fS JBiI'diːDilG Y}/J'܎&mac6DY8Qia4S:l:KVhQɓZl%kju@'<[sizh#^lG\o HgX0o)tcq;a:xgfR-Y8A)$4x Y>]w`%:&6|t>lďzƞXßzז5a1~>x)SxoA^a5޲]M« )M_i8__i"^s򥉸5&Ai"7Wߢ1(c=`B<ܭ@IL+ 5%nl_ڲ}Җ/M'rn'10eӽm_?ݞbM_7kxh.m۫pdE@J+;w s>ٴq` |]9ht}ܨz}<܌]'n0GmC~$b1?d7Gy-ljѵFA͜QF+z~v#FaL cX|RLEGN=ΑZt`PZ5q8\>t\\?c- }D[cVh?v7v4i[>,7.J;YvogÏk1~dvֽ@QO;ptl[oͲ6nV۱ٶmٶWgw9C&- C#17KeXh Sv-t4[gdli6I>[-X}Pfh`f&i['Rf3bF+I2(ie,TbE)i,W1^KR7[蕌[N$O,+=gzJ!vLBtyf}YlIs`EFIs {߻ڗ"1 >ӔYh$HȻ|_!m<1MiPj=n5"Ŭa9qJx$wNzr5h$wO]Ob'$ R30Bd=r%cRlDzd|bsn};a9Aa_T Ęi&~A p817pjlxte;,7b'/##YNlꢀO[Ԥڠ! O.ddاv$GDåWR5 2b Z `!oF/-0e2QKƓy,pd}"#Uݧo{H4g:}7c7R?S#52_Qg_'3#7*%xN~G?VkNhѝUpMmWHDmi6VH' 1ѴB!Y{3Ոd3ް32@FƝ&|$d #=!Gf dJ~~>0@@3sSaI9E~W:*r 5xh:x*D&]uƖc"Nzh]#k(|$5M۽YZ2^,]{g7~W[C)POajUN xsCݖW>{c-!z=Ϛ8҅ddK"BXj'WΥ"%o >,)ڦSsSXuqPjG}qm w;nH4p9$z c%+wb{?ݬ@gϛ\uw2fbY镫JԧזPT*ЄZEg}o0/li^EXvpG$Qgzg.2D<$JynHC1<^f5k,&oEa'zx}[bͣ}$In Ae7b)VyF.(ܯ=Sދ=3o< &эT$["dKmt'_9Re+@\FUq3 8]qAB.9~rAc.Ģކ\N3j u y!YcJ < dP(A`YJsL|f4ܓZ{va'yBښisfBlY1NT26(#.anBKI3ЮKGYP,jDqDu FSu rIu^-қ#Ҙ[coI$F4 -?]\> "I7\nouA1j =Zʓ}Zي} X[n[Ô 8gn-T8,'lH +$Սʅu+Clp꯬ua5S'6J'͙Y+0:Ѻ.:*~IǮ cQF,*Fef^h9,j`c "tfq,s)`Ա([P C+rEOTi宠i" OKvl ʡv촟ܾweSM1ř T|\ k"ȡ)~CnI⛒؊%2W7j#7=—}4-Y&[9;w5 ћQwB괨y7Rz*#rUq J%V.[=`!swqZ[Y%*/>7%ΖuDIkMuC uC7U7k?Y^{=<`arFO))99ؠ%:|$U,[$4܄ POTE.60yPGX ,̪~"kg|8Zbd3Fj.9]h74'T &Ȯ ȌՍ0:c܇y*ҵ%Ob(a ߣ3\g>ۻLnqAVX9fJ{fQPozg)b",XIT<L<&Vѻ> _t ^9()090dF>̚@1ߕ3OGV*6.4 No]T__*TH[&&nUUxYs F s]TCǽ.*s6tIzPG4?˩L`tsZpD737GnʺE/@C,[K)!)*%sVtԜj2cNh4x>G3=T3O dbO /i.FA>1M͖fn}Jg&>3!EdZX-qƫ3,\/v{P)V%!]TXBb鉿鲚>tדNԹ2>DM//LBOv:Ҭ_*Ǝ糣W injhx@`hq5]HJRvLkᄉd7S Ɗ}Uhu/ROwe]AWBiizKB#93ZFYα!ҨbԪ[*Gi>:sSc#$#H|! N-`Pm Wƍ;YE-_b?wo_ń6r4EsWpH9F]f['y|qK>h6to g])$pV\b 95/Y BA4i -c$ ' MZ͏ 0MoW )snq*I8[TYr!.t+dX8 2qʗ)|=Xڻ wt0 Q@`!&::묡@8$0R76BR,戔s 6n %y.wNgEN^W⇱W A}h'D{CU9?6b:LuG=6rj)?*0 YQ. ό6t4!`–v]]]Q U㴊"ޣ{>` 6,f!2UapqHۖH5됭T ,k NjH0?@VIռN4`՚o\D~~>(HLTٛusVkqFLhXb. m qᰤyMKXLr1F0m9r ԭ pP=ZW%鑱*IZ&k_f)ܺn\,S j"$'0 es(Kw;;0rZ;0$$Wǚ< o܁7g 0AZgD'Jz?~3Fwg8ةY'EE@vq|Q_tvD%6Ϗ`D 9%G)b+ɺx-l&I~ n %*ҒSMG†E!C뫇LlI Dͬ$-9m߰D= h\M> *y ?׫8]8a;!?otDfo 6y3*S\Hk?!b3vZ&il` ar,F&>-IRfa# a( _*B7Z<Ą&Qcq40C||j̪(:.x `|%Y@ 0  ˥_F}NVLJſEJ۬3 )_lV,x=$ sPÚY:̊mhČ<ȌސQkIމmb1Mذ"'HKOc?xqb  8$%;0]4_/Ĵ!d5s K <0?BBU [4)`HX6?cGȃJBKX\O.IF^( i_}POHLKh:IB nF5k@fA8Kt8Xρ)Kȴ?$mxYa4vɄL1v SP>CkDƌ6_ @g[eiZb_t< |#!y.pS5? 5zm*Ɂ.r aIHD dJL,. tȚWlPH6q۫&1aP6Wb$n/ 4lp~wm~X`փ]xȚ˘B_TiE\c]Bm!Cfk,/Yi v$xǠÎxRL4C%[4r۹9[գUk!'ƕB"b5(vo Mb#*&%na#>jtcr~s7œ?%.zod#W8${՝*ɿTNNZbOYQn*(p4MJTo?=/ΏDˑ^[݉SvlpXߗ׿)tjg~E&`V î-qۧ-n28Ivvoglgl-ib.`ّ$NG܁߰|g^,#*ZJ#Zg*_VHn9ON?F]E J; 0LQm3&.eXƁk\&S<zU4T'ֳ,&`ҟV]Li;1cZ 38W %671#*5cek+R冴Z`E d͂bz SA)3ّefFE>ER-9?S3@ѩM-Lf]E4|X9t,Xr[E^<˜ђ݌ʝz1ZqP7kOۢVHw`ݠiņøfjNP"~ӂY(Gx: 껕N0.|r."CW'?䳈'[X2\ﵼxVef @#Alǜ(͊j( 7+ k,.&_dh뎘% n*'2p;&]ydc1$U$OH1 ("%GEӘ;\TXgTΨ Q-+)?UԧϞM2l$F\8@Xm~**42 9MXqb򈔒%,0kS\H_B[ W-;c|AϏҵOD阳?.~qm Q,@E KOInU2cEHNyzsM%gK˔~褭a)N]}Izb M.6Pt,.$Y4"d[颃~yN&OT7xx0 ^'rXj+]dq55rl&?TfĂ% F0/RH忋mt vHL.5>n:=.1ަfGơ8.zP e6)]zɁ]]C`0VTMe)Rh-M$= lE/Ҿ"S,&-}֧~OщjQ0׋asMN0aD>'scF]+\8m)Y"3[TdEzE Ǥgܒ 8"FF,,22-I,xZ Z^Q:و̑[:?"A!bƣ{HP˲hF¶_8qCɚ\5A X휫vSnX|eXn.4G\<'yv(k CNl5RD$S*$EY,[1K93i{v׋*Z),5Q?f|F37q>wo2]|` {Ety?lqrpX9Lɑ3&iVRrý{ܴI@`FR䀣 /՟tԬNe!4(^<1wrVHkAIF1[Qdsh|;Ⴆd ҷz=dk̙tRDE,j $n$1YO3"qִ^zktP_X?>Pw4~|Ij &sȧ|DeGiC@F&v FU"'ĉt!z.  $Õ8ބi ɰ%NqيNN$ØUp9q˴k!aERtQ\x1Gbյ`hڇJ-m^v[&n4&{C$#ـyCFvÆ%[Dߧup9Lk`Ϗ l,Z E'-.clz2>e:㉹/@=kiW.k<$^ ط9x'r\ϔ*{U>SckQk=U$${Y}z ,%_/5#ŋjG _v6 Zhz' /X\ ,to2j/Xj.Q!)֏k֋ş_b *8o(0'u\XzR)ƂC{<xfT§NX<b0v-lv qH\]9MǀgQ/njS^񨠝77;@Ov" =ʲih]pD=yڡZ-VHXw4~h-qiӔhDBzt͡EW2I]T,| )lm@VpI@BLH:%87ik;[61Xʲjpt@XhpgВ^|,]TZT)TCRUCU"қ[`hQ% [c"3^DŽ@d4VY 8>! 70p[͒"YƯkMvFb-k&,t^y]Aʯhong<\I&nm'[֜@goKǢ5gj^Ӫ=.Q )w pH-4d@񀈹0 ?-6-ix2`| g&0?r4] ltA{) F+lv F#B@o02 "#FTzZK|N`fđς!Ş-k1wk!TR~NWJ~%4𸷃Wx^!K:,m5^\0 jwIf@Ao#ޣʽ &ψ>6n қ[E^Y[)ƧYШdzq. z%k F,Ѭ"ɤ<2hRUsH@~ L@p\aC)=7r0p 9d Qiu5cQzDW E3!`M-Mjt;Z?wv}/#dk|_?H.cau߽$~.7U+ ۇ#_<'<;Y6c(tOx,g^o~ܠgzȤhƟX%G{arLifIut .[L8\x"\eӭ ]Gt:-[ˌ/4Zld+06:cѓ62i}0Ø.g EPp U톗i2N#= >k%F,nq/tQgTQH^Lw(ǢDCCSFgT _/,"BQOi(Rbe`f7-? _@MK$9TǠ})7u$yQ:a5G.r08VƄ7Czh:=2=xyeG HUYBAR.(`6vG<]V{|etKمwnuteHDe;/p4)}8cY|[=.i?^G 2Q-i*`4_ 57<4{5 a1c=sqZ {`mZγSl_HWop dltՏ]_ nc7؋tq Uw.!U b;ZwQyiKtN|De:@ ͣQ. 'ǎ,^ )CZ|qa_zbobMR5hvFd5 $7mzD)fbsYJSЉKk'@CVȍ,)$I2 (ֻ#դKzy8z1i[VS#X+$wSz+Flի9~ٜTl3l#p91ʈQF-U%E\gt*2EiذKoga%eCQ6<pWw+Airq zxjjAxl.|ZwξmxSjyyC?T`9I c76pK zG=%zz=8M:L< mMv#"ǫIj)keuS>iAroDٳH'HHqBy;3Cykq.\7wH q+B=ϫÕ~̠oI/y_`'A^=SIk;^yomO?=-y3?=z _O(?=}2*E2M:?ل-iq?- ("B?)9V֚s$ [[p|sNF|64{o /F!'VS}ޙx/neu֢IgGs(T*BそFg[cL}v[k^2q ~o;$W+h炾ށtZ?,_ܣP_x xN 5?ݺ(ݬ|bAUP1 xcsề:@0(f Q* -Z"1%=YZdM,ۋx+֜bW* OzT )6djn$VłW6C'su]Xո%P5\iMMMzD0?_yR򟅈,]c0险IhY]( 7bHS:#xS]VEOp6phTT5)U2-^Q8~zz VPƺ urf?RBzÁB>DI|HCKBufT-, w6Xtܢ .En/RȍO*LgH} m*rl6T13駘.H=@H v؟~wW9S 1Vv!A?{ӯ:$)œRDE_!G7͜W׉ ](]Ó/}؋*\ %pVh_1"^tWHX,FRNNTQ2W#I<&ՙh+TUIH4"QHokl*8=;kuŜa.iN4*H;â]ѽ߭kݘJ@Xkt0ҲfsrD]> 9:~ ɏ[5n0?El(O+"BLݞ< _hݰA.lim1%7B>->`jK"TVּ˩vkY'%h:)ġg: 櫠L&O"U9瑁2,9E(u\ݓK`S tvDufÞG>c0E/͒/"[QT)ӈF|?%S0vDlGFol:S1 HoڒiDf.9%#| Ot'=uOG'T̔gI=4-YeSX_u^bT?*Ww?f8E f>H?gEXT4L yf"('$Kra$NuIj5<{O]BSRghb[ϔHLIYqH>G;=Il|ةk::7" >H/JjF+Rrݷ7P^q%hՁ.JnS/^AWYh RMNPj:@̆a4mc" kWb+Yj< É8|B!K{崬SnxnC\B#vA4 ٭b 2 ? `5I a_r ܔ,̹ξ3Kx hU7Nsh?-TwD>YL3&=ϯ5I,+,.'MDQ`n`-?T??RvWytuf I\$p۴?Ǘ?qv_TqpŅɕ 6"NL䯈 xXpg">J(K}EgY`6[/@ mzDWْ^F_o(x/WO[$[[%l]]%E]m +}A|& TAh#Jd'iDJN#reyceaCuB-|xiWatb=@EvR!H㳔>AI. `$X=nQ6SPI'IQT4:'kqb?tXޯ` Cv^*L>(\L r( ah}d~95\Y),p=(.N=4kz,nMd%H`(6tmfmn}{[[޶iL`рЭ7Rr4dUɦci4uY8`(cY20h2gՙ)ϕJG#B> f; }s\ ۇz! MUFݨsdW7&R43+(%ACZ4NCk(c]#᫙ONk՚TRCh>̚v;*Fi]kf(@;YmAq^ƩrK_ 縸8& I Nm/$NI˯걕=Q3/]֠ S(GKƦqz<ɳ%D[\,eSst^΃?/|d$k7tЪShhys8G nzB}TE Yׅ~hϔ2:K+wG+H4utpu%9?~@cu/qN]0^ƚe7Z VW$2L83J%ΖHxh#wu4Lbi0E.1EO|% Ʉ(. /ℱaּbFAF_o@A Fw[:ڙM-Z~q~C.Dw4y!ݜnT?gH{]l. L d0L MUvxiRt#" 6 W\mf&/u!}`$${z-Ek / ';M5M9|$?u*Zs Sr҂©iX65K!(376-3)u Gc\Utvd]bk|:i0y+Ӭ__Oa(0]*w6m,FW 7;HQ~Si݈/\)~Qʗ|c2J2LXQ/" 5@1/lc3)@0 LM9]R팝j}@Cw(W'qg*X%=v7Amc#jLeE(O yj8![g'֛߫OFb<Wga{ƎЙ2f!1p0[~ LF\Tt-tb503{Eq\dO-[*B. C\^FGGWŪM[ ny3;tcGe@-QCs(؏41+nϪjTލW>r9!tOeL*ٙ8ggRL= bOiiЬRZ'R*rU*ډoYRw쫔5RBsRR̻JJ[Dh<*{ -,K\r~_/ "(S`WsE&}Pgw>3d,:0 ^va4bc5sG2!i8aKʏ:N M9_aS'>ٗ qp)Pi<+ljD|Jw#rUӝsEMN֑w)VeLʠ_ `ވ:FzWm[AvQGͧ<(IWo4Jcwx@ f7_˛ c:?wTƐOほ+\qמY;"6$h}Gl+c>ߔ#ܢMO4lg& D)&B\4I.7*l}?4l^U)FࡖxVcz.ʪ*[3zwM ?gs(y rL;B`-?K>;p1kmW'ȇ\I?W%zW+*zt#zd|RC[+IxD-G4ԣFW7Mv+Ą[gq j;3 ;_Lcg CەH\*ȉ@;iސ W>]ΚތG$f& Q@H:΁j`vEw!Yqh5` :IXJ8dD/\N\ZHDLJG)F(FQN=1qrGpn?зK{.oR.=q;[bۭK=3S0Bm<ॆn]U & /@WP;nalg+Xrlt? flGFc g+S<Kj`%O̳,vۡn{Ɍe3Gێn[K\S$,TiW~*4 I'gnlHjAɡ߷F uk5iH@%EGn@xgk@x?EtQxŭI<ŽEm;-GZj ) p4p60ۈaج+㿽g9x?=6=rGK(" Z靏F_+p2@+?8?Vq&l++/DF+# Oߜ4FT'hn7987/_V<.JAgG K|$ gt@ߍn|״E™%܄:>?Nw4J4u9lɍ4_,m19ox3한"SG~rNw%PwxRߢkȈ?~OfV _K /8FV' !cSJꎞK=pX OעYkoL7LAqv#B,&g:Ycnv?o/L`rFNZa-3Ugf5}Q2gX`.]h q^Z~Su@.t(OIbhIq0`8jk5ALER v{B﫿oEw{m,Ye`xk !u888 "\F?IE񒋥RtӴ;\=r/ CvUŦ3]hԗ̃'DÁ =5jѫxW$YMrYZWCW@~`Qg F8QEG-XlkW>xu"E֤qq_PR+"gD*ihD*SIsn#_c"Q|vw h7ڂ@r=^)i+[!U64Nt E.6e/WBg,7[}jq@|G:(j  2lR2S5f.\!̥Gq®:"&C7)'j7 !*t h!1Ʒ|Td\B4)CpnhBЩG-rD1XkhiTH>َJ%_uZ"%ME:%BX6i Sދ-^)2ID{H ]:xIE LV(Zm#}Q"j4 z+T/"B/qlKK0ی_mkFF?Xk2`UyD"=D{^^-y.1M42GQz-pc,yQ6{y 7-fHI{5ju@0'f3PK'Oe [4<"0'V~rjZ4nVFԹ$_20s#=$@xhy@n0UdSN NnJ= Nx2e"2\&\,p=I^rE1B(yiutMT& d^aN?%3,ctJXFnv J_`" G}Aň "؊\Z+eԓ(Fό: K$̦#ZesS^'K!4FIQb^})s I"urT⤘R;usv2G5hr3tRL)&O-vQQ W($=2y3*1 ć@*Th|th`Wp/ܐ^TXu:eF ^ iwП+J{wVd>B{^eLF2йW!r?+79O?AJ~ UڔcZ{шwNV#@+y;:5 Ϧ14L K?W C=@n׸7N纭Gі qvO.QZYS[,Ob,* h<`w MC!tCX7Ktmt|ژz7B) vy! Lܫ]KŊJI-w*\FYC* 8/'-^p@J \Aʺ6\ 3nH1<񨸲tu(9^{om0ϊ:7-_=[/$3vw|´Gc( =vƷV8=3Q _:*cGJT茧YbFBLr1=c\A^4:vƸs:sYgWrSU{M-ӝMMzqcNDBkY| Qb@,GZm$]@ W%{k6l j/.?+؄SJʹW}JӐO׮Ϥ?0_* +ޱ!lXSigG/";5ˍd)]'4iP#$Aĩ[؉&4ahiS4S;Z8!](ulkZ>.<Fzj; FG3~8I9Gg)7Qz)hqqP vMN*}VeKpcݲ// 4 oJ%5ϴB^4lsr|Ā\]/o*{ήbS\ঀ[4Z]i6 7_a-t c:0Kp.á:Ci!F? O<dR:Z`]Q+77(H(AuޠaݦJSFAaLAfDm|rV't̬'6v2+Q$,56%4v#PlR63BȏJTf" K'H3u|M+z9 Yf$ JX=}}^hTpݸrIKdoQB_4o$>^Cs6bDV=T#rlcgMjf-LCaxU'Kg:&ur2!H.͈ ύo/(jF?OL@m|P;D g}韋8N+d9 p6)7`zX! wO| :ϧ2ֶxòvҰ҄z5oh);^6< +y/uF+~,T4H8c&fぎ48Nί ?ttKac_D^=A^5 atGV^(q(Pn8!׺BrAnF*.H(ґ%LU8i;Pf:vv:; ddJ.ޅLDbS葝rDKD`.H3!ɒcƂI/CC`Q%HA%D ]%4i|Oůi$`_vFyWM~y+`<tԃ٠f6c3[O8+I| ?''x:]t\B 銤r@K[HCBEX͵ ɟۅ-q4!%sX(( $REhRv* e櫧XcVR&Y#0OdOѕ|Mוsn_IMdTP.:, Vx WZ̮\u']oFwW;:4k70JeʒOY,G`s<`-~0R[^7s9X# A`V~B,vUƥ';^e46HǼ&1o??׫&/\`ar!,Vͬ8}xFQBgwp<``/Kő]'l0 xka|tL,-=߫?Z~⿥w!!o8öڧ5ٟ ?η2SfJmOG~"H@''`"?Mmd4Z톏+hk-𳯣*F?hǰ[c{8د\]~ N։4 >Q2В֋5u o϶}{yēiȹUhK@ZM{B﫿G9n9948: 'FfKX[8z3P.֊¨K_xA?"[Xn}7m{gFp&%Ax,w4}j[WNrr\ !6I#ZziЂ6*z7]Ж䉊<9Pg{\7oQ@\,evMEce  LtwH0Wô^@F;x? NIJmqsm05dh+z!4 X]?&8|ȃDOȴVO] ?ONt%2Kr P*>HͲ'nÎ:1L^fg~=˴7RW>EcM{qYje]=馻a2aa3ovJ{wYmW>xuoF͘ T3?Qq43n υpOb3Hjl9 ;Vᐶ{ ,>߿_Sؒ6Ctx% "$^5as }CQ>,hC,w`)+.1{HwgT5jX`+t̙'g e܏1.ɁQXw Pt]Rqܬo_VHy|h kBXkar-fL|L|mT؏'4/,BBMJ? ÇMJUu$_:ʾme,FyXI,U7GٴC={ܙq?-lo-,"B!/{Gv5P3,jnL{G?|TC!X'$+Q ы($o& L7!Nni Q7ٗo~(G ~*>59\G&GX*SO*U:](~Nɦsay:I_%:pPŶ@P ] 6KN-uB4M[dI\ c!`BH5H70CxVp+j 8ʫW.N8͌=Ib?9%֪2Î*CxFVmyk0s lhd_Mv *X`ҟop [4Aojz^܃SM.'u1VZ@U$.)TR^jDP6L68;yRR*_NR$#?+KBB^?t'd޳jte;{=τ¡C}!6r#5 ;Gn­^;.3뛞< ̹1As)Pfф*UԏlrD#vGC`%Ҙa\9&Tvmk5 skflgֵ ӹ߃M !mG/w t9g PhX'Tn>Iq*HW!גPAyi;`j#wV6_Oń;+?hNDY,X+BxI`΋U\cp>LFY@_f UM*pC9rf3{gI71~00x$0y8L[}[oktO'ݓg'fF"0c3hױL& {Hh;e,UҐ' ̙%Lcމ;]"+IJ&0,4DAqhyf+gV) 3jbU1㝜$HaQ_bBF3SrR"l1w*>vU~\_҈Rgeʿo~ԣ1Y\_wkJB_?yW&q>{w7O^` es_I~_hWםhͤuwH^`FR ! 2tde6ԛ ԗ=3qy !jz#Fo/#/!o} })Nz_^oMOa!ν*:Yoּwe*`SҰi5)S8s.&B:K06m*:@BiTS1ZB1sc5dKvz Ӥ>thk*Xx//W'Pa~ w!DX4/-_>_os o@撓4WOM$r [?ԅ]zAw\MwN;mW։WD)>1eLWhWҞUۤ-[9H8] r)w0#U)=Q5vA3J+R짵ZھDۧGlqs71 YY'+D3}Bvĭ9p"(HX. 4,:giFONӎ-4kL)"4h.oҦdR;3mǴ2Գp]7 E7vDs<'fY=4dɖ#\s&->*44D05Seq4d:HCv1pli`7ܦ7: uK)i9Q /T&F6sAxWR`8MQbfD`_5 a'QҬJUǭxj:J9M@)Uvk:ٵt<)q=){aOM0?l5zbmVE#gL{&\` X&k"9mЎP>!ܟzo 1激V@fbBȔ6|g.ڈجc{AE>Oc fibcޟw5$SĪsCDYUiRد׹DDk,żppEHB ] H擹omQd6`Sg'Nh 3 G^ &źO|f0׌B9,,EA#Ĕē"M*,L,H iNl@V&ֻD?T-JD|t}wq3{!"E}Bڳvt3{aAZmm0f:DByw!URM@l mϴ9r|IV8`i fʺ9+ӼBo fW}-;6d+!ŗ6n%r;0s17;|Ǜ\qPxB>x9\ЭM(ZcP8Cm@0+/bĭ.|"#2 ޕ[SdSuU21%o H6z;xX H()L\D8PHR[2-7eĮvu|!QL<\ _?HxMFwd8d+]4RRͅzxX_o<D0"ARUܞv2 RS oEM rɜ ^L`eT?Pi֡^OA=oƙA23v CG X ~(үը6V~IE r:鬂+FmO8[f[[zdC|3eO+qE3qi l ~(M 3MB-v<:7)x~6 %0GåU|[ƥ3,氇NߛLɿgMN[K2MgiZR"0ݞx[0K<ߌ03aSޙy$}W}Cތ$ٷBf2}q:}}[}ٳ\(Q`'`2(~0qKYD#$N8#̾wc=$%jG л]{Ў e^h$X{ Zd`FUYCv[ۡۓ#/g>S^c5ZuE:<) Ҳ[KIsN(,|8o[_nad'Ֆǥ3(LN89uO@;NAR怀q٘!h%<]qXdtKqGq(޸u {Sqm':ֻhՏIV5n-HR!W~L+2iW-?2)w}\Q, z 2>&&5>,>,`evmu_|yO[ngg8J Ў y5Q2g *H6mğLqBFyu ]7T)&>S(K^}ʺ쿅݃n[HYv6wHbV[ foX~+efTOn /Me9EPΌlRA VT_!DcZ\UK1NKsj%0a-[U9sչFanVˇj ۰K K9LOooMͭ1ZḘDJskemV݁MYXZ+-*>~hkjUMjU孩USbVMmMUTegll{&Zl^y҃9`ɾzŶyVʊiti%lH9lޣ?'݈i?jƧB4OivH8D:!&1Z /(w\Pr"|WKH$B*tK8b`B\8.Rw ۜ5z!,@ ϯY*\{-Dc-1wJA!t'gJ[ftrt I7~wxֻ˷gH^z: *݇3p>]fWBҷ6o2wlu$m˓ nkep,yeVvkp:M b#h??'2 s\)û@*VkPj̜Ĉ )ma}ocMi8w@@rLk?"f <1!O:o'pW&νX"prY"s4#o 1r7fx/ srY93:r R= 'Oq~C[%݈˽IĪo0'X?lkzND<#I[g>r#gmJutDevS˵% fkyv?RMf3hjjbd++z;G+=dɎ"`I򜽂` 'dO > zIox;fKX -,z@m3Vm~ PIı07 *vVFXOpıb.ƆtF!tiSnfJE{خop E%gpdb.QDLIޓQhN82jGٴA2xbHgTV]J-A[Zn .CQx[e8a.67Mﭗ'[}ik ^ ;a34kOdlZ(;Ŧ=A,ȅ"hN"o"bJɄދ3z"fgJ9x{G9}mŞﭳ,Ҁ@-6 HД^}(C r|cnyH)=EbUZ@#4T04Q*Q<ʹaClp? ލ__:$d<TKjqTFC$IqoIoJ&L(ͦ{{fY\BmwA_ `@h@Ye;+r x#zlZ]އ<\/ '.ǰ;U9(-//(<oY9[`2,v ۤE 5B >&pX<.DlDEk :mBߨ /2Ux2~], /abh 3#-,\ @m>rro'BmVeMb{;-ya_x1Z#;Fȶ,'ƃɑsEŷY$3!"!œ[Yo[L^b*^udë*nռh?ⅴ}Й4܏`TlصycɀFN6T/T[k_CVV`I]5,*t8QH/x8tU;M4_ޣW\@r#!u04UA`L(r _JpPm_'.XozeShn$쾐fa֐@Z^H4Nj̈́q3R4[(*|6$*%=+y\aiKG)Q}y\}H= b{DsWD sW(/t7 2),{9-t8㚰OYd ^E(pkw?#4Y$Z{Mx)]^ZTEbF*[yRXo!ء .Ź%9Q F9 kA&8WX:"='΢ɧrz2%X|W;$'=,N3*^rn=U(?NϽ ks<|;+3GAhXwWVNd>zg;Ҹ uV8!7m&2fڙ*WgG@?Y1J2NuD[d+_(纼ПHCaݰYz\d0,KM B |rXVSK,7HTaLHopxz 8zNg1ج47n4^5Dč[\qퟮ½֦/<{+v>xgQKR)TrġZ#r6SG'w>o?vSoO_<6%&2):x"]"`,0Ն 48lTlQ` ,U {Qd+sV8YY˜T+"뫀 r9`[0E媨b D4AtQ&R[9@ 8f&0 ޵++nef1i%[JRKdrQ`U\fy5r̗sb׋^- \sC6Į,[܉AF*K&-^#مG-PŠaǵy bc:l_>_;  R>o %I%6%ǶV@JSnCPkCa|x_<b >yYDmSAe[ TX+$\EaLʞ@x!ChSz%gAdUabs4 a頥  na*A%kLUT ʐVXDEswt^t^^}jːO?vh(C/8OkxkXUT| "s DE[Z'|i]W |ХBe)&vmWCS?Ŝˬynn!,! JA *>oI1~ rX#mArP`qOUYҢ m^ֺfyPѵyY6W3״6ӑ/tdY^O-U˥@)>QT1'(_*_|/Rc?X^F6H_]}kѕd#(d]Ai`țiƄUGX&ݤ\yܔ%-m{KM>xHרҏ_2i* YB<¡ qArp6nd:p5ӽD𔯠1]6 khщ%k`9X7quNo7갠FGungcw5-7>:C\"hh| qG24-ܪ )ö=b+Yhn.AV^p&S`2cY} pkDY@rr6 N7X, ._jE5O5DITEGCP`OM svi/Qw,01faZ֙cʪm 7 +ƈ@zޅG]?<_sf*h$YaŰ?; L)xUqL3%!SHjJ[&rf=ˌ**9xY2TbtW:Py55()j$j⎪|l4NDCN!B+iX:@nNDբ}qc06٢jgzi +p`t"cXV, ",b@B*a9֟_n'1չ\KFqY5.'zYۥdPъjs=&FV:dыA:۹Ӊ8|9c4P(hk,vS牞/s^`%A)X )^/x3Rn 'QWǠ\sUR誜E>ueR/?T[{i7/}˚kArK_gФΕs[ҧ?m!,[eB^Dg$ u+׭#gC؉$L]p&e{G)'Ok~o*L7uU7u}"p!tnlWk&M]pSW??HOri|~3Βofo)nͳ!l>l(fWpq0,Pu;Ա+zcpL#fi|p_i Is,ŒcK.Xl OQ>Tu6q~ƸJ 9 ;z8aۭh {UU&,)"e-ssj}-f4/8{P,T[;̭)aQWr>14Ixy~|o;ά'/TC>Q&2-ss;.ܝ՛2?)(nv dEB=o'R Wx᫸t1w+$0j.nD9?Fӥk_"Ejeg1l5qv2_B>[Fm لz,̛ "a2[ln"MgNaр81{l>DmdG;;F͍-rIЬqh8߁LxGJGV]Z@~kln4]KW|'Lyk?TZӻQvt^,Ř|auS (Z^x8r_#Hs/DAm^|?S {WmO`x~^lق%[ŕ 6mj(jqo8M|đؔ'=WźP S"Tq'?vY?Oൄ{ft;Pӂy{fg(BDǐEF,4;<7%/-EJY\ٽ\ Rx/ ,{TG Y~Bw"svl8! JŕcFؕCDr槗AZj# tǽUD> W7X,')ʬacrJu'/Dsf/_bNvъE%tE!%QHw֖ R9Mu<Jc)zo ͘m0&,E^(DZ\ZKџY'zO-R'y9XրbXl*:w&Y69[c^8k?Z?g)?cq [f9%Z!,uY=ug_C@0zaTm  k[Ez*rTcMr^<|)K;8 /kKE,^Si0Xq|,4e:;mr.p+ l{;LΛEЊyÇA qnWq5>7ƭ}<ҕa$1F$DbѢHR#M;lj)^ IٱYZ4O'\tݤpQ pE,:_/XTKѢ-xVCpR(9\dQS(z\Oi}υY#ҫr7u œM‚.x?:(ϛwۢF@A~SdD9!z'sS]pw^"%˿G ~1G%yfJyӡ{1o Bz yA{ɋm4#$kOdm&nⅭyM\EjTSZ-=Hg4ގp .֘Tc"N>T Hg1wƤ]?*9&ON@C]b$<1IE5}=3-v+1RZ?ܗ#Z#Zh1yVшs/ǻ 2xw5q/2L4w 3d7.0yt?u~ў$ꊛΣy-5yer$ĉ?[E9X܉s\Q^͔Sz3rm!1^RB6B ?+nhR2~4'wLHMu;|Hf'^h3a-O_?zWлD+ḯxZ y2](~rƿS> McL]f?* [{2tƎ5n:f{V5[5rx="ޥ)e}qV#ya5s<*,Ë}(7 'fwo@`%妳I-feC?oZo UZ6Z{j$L4z6w,B; E |tF,a4F\8XdE;Dy~K󏣆sp9e/ȩz4Z@4ߧV_ ]KL;Okyi/5)}񿝗Skr-"z'}K__|)wxϹIM> elԩYQD` 9dj \̍0#BRE{d7w1;gD|?& %-힕,7<re7Zq9)w h8 yZ q"VLƓwB\l„NGUo{Oo=+Aě N5QwLAEa@>uf] ywGؗjմUV\rK 熯Ֆg>a `s7_O8c!t`\pX_Ű>%bOkX~oJG<`wjX[ņߜD12nQSHM3zvm5%[.t[\ܮį@!Ib{8bod2/,ח*}h[*_ݽ4ZÄ?@MI87dM*=IXȍ3T:qFl9X:`-/i0Da!NaT0WDK qƗr'/`.vV_,E;#2}q5$PG@7`.a=hm}lrX^m]$)6Io+vꊻtS44Mm;Z6U!TvX5K{ۀ-qd'(B{]j"px@_(B6 ϦoyN)*OѦ%~rTewb˦jK0jhBjyTCaѡPKx \1\)'[[#+:ojgIhWZ3Uvq\M [KaMa¸ǁq TMa\ֱMa_m}nu,3\tsi<ܵrۉ5 nY]xx»)»|'[_/og-OSQ ?C_3~_^\>i5Bgp ,Et3Y%ϸ$7W8[2)Ȝ)z@W8N}z0)ljw7\࿇)m xC=L1M1Ud8lɦ/ɦs:aRjS6jS6}PȇZmtV}k5"ݘ`{ 9xP2 xyX58ƫ˯, _sE%{ A>HN)3>Č;'</P-%D:* Dj7y㪎@D෠W1M ztMO-^1G3zW/>Xsi1nr9GB8mNi]aJs4XWNC q!Kc~2R7st?*w4eԌ+33<IUeSLEӬD+D,f oUt**ѭ&GDjQ"^p5*G)#)[(^"W?zYicw5M|`Ezd7{Sإw+NJå6qz [վ OS{vEyMoҖխ-[X2[pp'5mݴElB*9n{t= Vt38pSw;݅|7_yx ʗWW|*>(׋/&u`E*Zͱv0{jǡwxOr{x* 7Fۇ_ *]our'(Mqn/??㔯}TjG Uc)! A\5HɊn$l;g.t&+ |sK 2|p[A߰ML[HcQT]&k\tdxӲ;G㼝ʩB')Mnlfs(nKn.1TB mˠ Bc6 E` [w^95,-im8:<_"5Ik΅ fyRx t@ p)3(?I$}0zRc[pV;LFEN[|@hשVI[g:m%?P[4=\|Y;1vfOu _&0Hi*$RU|.H;SEBwh^3JZ 4F|4,EU1څܰbH W[qUdi՜#2Zf|PEǽ,jGcaaSDlVx `X O6:R*c`R!PU)eBRLeɴ/XOn%/`jބïj;-=@yO]Moal W)J'vKz׻1ߗB2p\Yh\$4+/Y|4KT|0uqZ7X(`Gt[{%2S0]VkR\351\h݀S a(R2E.(f ˄8˺L\Ʃ#-W8R-XΧ:{u@20 /%ҫu*Ya0Ru{}b3(n)W *?hTV?VY;)dY )++Ú9™QxX~7(&Ͼd>_xh1oR=>^^Pn!nv'sw,ͳrԕvߕ埈˪qOiI F`^ۈ(okE${Cd,aY(;pyVBP~IPK6C7V w1)6"EY"H!#RίF}_z 8H@^ }lSdao0P 4v)Ʀ0+1D'6v%'?_,'6†_y)*^`qX&/n ETRO 85Dt,O=៧i/ƒB5:[nۼ޴W6mnem!8u6O@b~6zͧ@K_cm-Zk_\~ @q?1hkVQKAQS(*^ D>BVTv:1"N9N `E҄z Q='o)jF1ň^x#2's>g/Kӊ(?^?Dh_Cbܱ8А }I/)'HC,ůeK`5I6g&\q3hpG%.Rt'Ew^ "G#mI-,+rीQ JEUh!"ŋRy?.gObR1H&?_q܀ P!W~Ma sAyy㩥8̃IhƞjշDJDP=0(v RզFceasP W1A$j`7h[ ?*Y<[p̓D_ʝ #; XZ(c*V RΫ:oB{J6i֭W_ꍣyT4]C Ã..o.6kH@%n6a[uRp6B1 <tQf_|8͸x;Dr#g5^fW¶57w4-F:.eP7>TT˶ jmTȚ LUKgFLSuw>wjpDUE%wuԵl!a*,Yf~_^K[eRuiĒ9~kZjnaWz=d݌^N90U7wLRƅ%`.*H".rD$$d`2™x! *soia= ZDmF!E%h KI7x4=KIj N :b/ G­}Ж1qXaD]0_مҲ]Bw컱8m|cwE~9 `wr JEmpUF !.~4FFM " 0&By &0-5AfLCZ0D,8D;L]; 4٠7~3.*# &`{Bjg ڄlzUW.>~;"X8 '_YiZ6a?)~=TB\~~ĩs5q)mԌHc磏ż ?d3ՔXz ]],\+Ջ K[H֌,WB! b@lRl)Quގaye??Dy |QA+?͹$.J!ћ99;}=nߚl젥rjtS9r!-o36䪹ZYQq蕃w TbYxg(tD҈]P'G!Ѐ<5B~QXڡwEl@|}PE3^jiLbxW7X-Zw-OUSo_/!K 1r:a$:au:fv: Xx:!+R-P@j$f F8@" tM`jɮ`O `Z %hr`cSmpS +݌öXs@M+ŕe%`:"ae_#\Acÿ}"Tp8Z'gGb#8Y1zףhI)K4Rdq",.e,.98 }%NHɸ>?K@u ߑTE$\1|%E<*:tw]waLӶflT6l0{-zֶd]Y1Uو2ŀflтfU6()Ln>8h' nˌ^1F}Nw\>x)!fbWkoIܭ$h͂'d4QbG}uNF\$(l(u[ʧh"uR$!5D9AaIv_qkYsi~_uf#ԾOgW[rܘGHbCKAݨ^R0ZO֑`F~Ώ - ?:'Cg;@R?%"(@z梖w3qTKr܊RV|n<<1HDrA}!;w:L*aPi-c>YΜLhNB*Dbw9@b[4$Ƿߪ i獤'xR?t(bc'nH>5uz#@ +CʈЭW7g⮦hBW.jH5_Ǿ^tmFv16 E뼏ƥICڨƎl*+:4eLq"H} #g먪(ƂL5kF# OjG1Tp M&.i#4me΃okvBk4Zo+菱.msw9+QKT[O] Y=f"5O^2or@7n@#ĩ5 ]nqݯ#v̚աh/A+{ \~ wD4U_XOoYsX8:fYY ׃wӻ9ʂҦE)4-lD>'Ga\#WuA®+nXbRf+C)KaMi!hihZ$NZ3s?yzXn>/oy&ܪ 0ns,}8ڥ*UK~H};r3ɒuEƤ9Vo͡~>#|&9i5Յէ݈uЈ3ƖNy޸4յW +ْLD@PK@grHdK=Krw  ,K62|#lһf5f,g*s֎ߴ>b<ȢMF5M7y*k> *Uq$آy PT5dTLxCdPEPŗq,G.R/d _XΕB?/R50Uy5WP/X|VjPN j`1Ux鳞ǩ}\RoO}L%|02rcEŗ\(vt%jfJC뾞@ c_ Տ>I$-;NKMx)wjtW7ByYɆ*b8*H<" ˗.n6Gu)*IWQJ|cyZi)Qlm "_Z8Ӛ:?ie2/΁D_"1B6v $wL,7<]r!r=yw,ď98 md7[2]c9 ʆ#KސJTPw̔Z/BR?}(tcpvwzPE _ džy6y!9Y#SO?=?')?)$R'I,'q]?tl(C?)?y,"|/<|c?؊IvWd ri1Ag?xzdO<|^(G9;V3qa:hƫ_T,%ck6s(MibI$4cJJ($Jz)&sMB54ȉ){ʛt^P~O&PYf"0KXH"L$646 @ e> gm%hhĸl*q.HS}֭[EtfPa}>髪f+ t\YFSu)cgM7RcG9NS|_knj'ZCmo.I+QWJS-Ekx"ҸHwخ&oē\dڟr{0Sj6ktT[gZA KVR,{ꔿ4)Aǩצ~ htk/^j+X:sV79wNe/-N9j;NOhcQ~&q'visgo[d/^e~09u8~竲hHwy=p҉TOs[;q9$(-F//N=;\Kshhy4fxA?LyU / { ݐT:{Q=jA.СJBu\%wJqg ky,k𚻒%k^LnqtL 1*4QNM`Z0'խ6Zfdnf=wg+>{ʱ /a?.wtxfhw[Io4]86+<"^cjdXkhXvJTS?_-ZiZ@?OGS/I# yBFZQ"lX7;+ p>nŋC*'3p?ͭv9y IZ w*X HYS@8jgYL 9s1Xֹmsbm:mhaI%`W 8HFP&Hf ~~C%DWsXs"\-J@- Xְ ^=n,[Wm:M-26=G}sy1Desz1/Ѕ{J-Xӕ Xj ס?V؞>jN(#'V5awXDLrH&y,-"M._"V]!#P6ÁJ-T#{;/g"w|xĜV _'䦶ǥk)b?L_nOy??.>boc;[l]EQZ)Ϭ ;M>bF\UvlD~7dWz-ro (@CGnGsK'1; 'DC_. 7%),_|3ft$ }b>)Y }V 9U͊K5HA{ekthuUQw'!F _K+Z){a$ ϻgzG{qI-Sg,#M&V#;il7*ojN#XY#"F5K,94Iĥ*&e}w ]s' $9tJ l'qZ`&@66tB668K7^>ik#S$\LKNjy%Sٍ$u7LglTPʼhu~`3Y ,K4h2ޔcl5..crA&vۘ)%\)4=DJE!5R*5 _ʎb߃ü FeV(0zrmݥ*D_族~:w= 1}u<k#1Q4oTC,չK\Pk:1T؝3@H4p,aH&qlBf X!\3XtI#1W:jF̻nuY#mWU?.R,9!T 5NZ;YTa^/-#T>d3? gwX-I/py?3CvJk6lS@:##䒣jÖ5ϝkvgoCr[6icI]/t`& x,8A,6h)F>')H#_KUorzDe'm2̐uQ_5qp`c_漍N@@6{aw6$_ 0a(+A%78Dn+0?sC )r Lt (+)Op}A"LӺW:&6Dzit5C*/%PuQX ~, Ys eyKhS ٹn [Qv`~nDVZ ֍|2^6C"8X50w˴;8TH΁ YfDV-#kDxH `yS''t0Tz4vf؆-` *%l6k%o*/`艕7/I&~VV>lV5et i[eεA(`kB -W_'Mt~Pb ހ 77> @\%Ɓ] u+>A=xX`_;<-b˦婰5\d?aj/a S鳖ib fk˘#Di"",Xf+ { {6r׵ yu_-O^Vjv"SުMx[ߓD{zt^ٞjf/ٲ7Z9,s=1ByG,[0G-sЎ \0`_%?xʫHV䓲3dwE%W8= ^ׇ2sѪ?N9!wTnd"VdKXg@" DŽ k [Hb yF8 p^7پI}zR6$l_;.2Zg.8YZ-Vߺ`.U_~,W949o}?m)īJDh5#k]IӞmLt'>@|IY/{d 7(mk,wNS>ۜeݸe48>Yq@~ ԈD@d|@7θ$qdG!+4 -='+eZE|8ПfVnBs]a7XWV~S;?Ш0j- X3{R>7Y*+Y?sX9ZGy 8 Q5)>`\sĒ?76N= {u{WZ\L+FГ )GoTa-TС$Ql)]ߩ;T]FqNs퓏 ֟>ޭm}Th݌,=lj6G#|n׻=LQ9s%-wGgN;lnjA;,\Nw12T\<+ˊ"YYK5=zbUnDeɈde_CfVt+,J]yd|?=q %dO{MKZۋ&oK; U?zYb O&"Vg^7pxSmlφ+8۽eM0 ݆1g([WJzǎTwkwKy?4/Q=O/5j<G~P(.ƀ]Xk7!,eYc >^X_4H8C.TG #QSIFv! aP[MBUвG%+XVza0!`# *΁}QWT+Vf((Ѯ= NoJoYKVW#o[/ C<%2p@LT^$f&My.,Y"U^Q[f]ckxK2xs#l-ǛǞBauwqy!L9 \2ynώw$nb6,3&<4p&MTIPnƸ+u:ed6Tqv :.?Q095 \=au cjjuQ)ۅ罙G~bRyŐ [gn1TJu<sdp.g8Io@N=$&pZf 39H1YyQCɺ"ͪu w|d9 +Vr. 8zޯbY;B])E)BG.v)BZǎ {@:i4zSowgohޞ]Ž͓RrNLz씋,{zΊNj Ɩ 0^ͭYI|U5A|gY`bsr^S'/G;S-kk )?4ĀމwnX-7^pv;??ρV%zZoڹQ!:7й(t 2EϬgHg8ѡk-dD ](`D.{(`rS2iq@xX=) /QbM4ロ9p?H /)xaMmS~ ' PH ($XKX/+ @&;fd!Y`M#2s?M?w?ڣȁȶѸ; .k[;_Ms#eX8ϗSdgyK|N$ :޾%s+;).o,hR\p @"~DM*D:wUC2bcSIŒVyWy^ؠЭ2kjkDF~/=mdl~ncv/ˏ1GA#pOԉ!;X:kvb<]ǾoZ%ThNlȿ 񝃐dwvBK>ک%evZj~e]cA0pMjA-:mknM۰Rj9 s#&j"PUK2wNJMno^T2 d=4lȢ_2ʨģ&Pb/ XLHPت̈́ `^Ab$0x6C_t f㖺0o~z¬V=bG[ƻjoԤ}K":*ERcXre{=mL`JڂǸȮ/'q}@g%B?F1HJzc pWDDX{iAa jj \} 5Do)D(lקG]vm)G⿯ K'I?#HRg9V|µe}|_GΥFUQA.JĘ>:~\;DpQ TVUUk y4FXWӏ󁂆݆U Ph8g,Kͻ|EWyǽ_JE LΣM9f6זBJv-#V_GWbfh h!YyGy{Bt5(,XEth݅B7q9qrv8GQdZG[iUef))4k-O S?_NF?O< jWhTH5u?NRO z?G%He{<l_]M< +sp9툜N紓ͮC -+fl<4(K]e?p[%$=,DDX/VT[I,WV/R>>sXuiSQNTITDpdU~|L,P;bQ7ל>Q.:\'oN`0j3҉Iv>mW"y|0$LM1FGY\TCɑ69RH WEjf[L'_(_Hp=(kfW8쌨 *VީNGƟc8*ם&D R_I:@r>-C=[GTۅZZꕔ'Jdde_]!Z,).ԥ~y׼#Uq\pI D=.wFw@ϴbqdC7ԹZ,~йe]q4=UxWBGn]7#'kʲ_>'Bf{ϓI(hS;dJFêҡ}t.֮▁P0+ ]q~:sR0[.{PAno:66`yk獓 )ϟJo5iϛثi%9[9AwϳB'*Q|TiΪ`Q*,wʦnZ⊚^hz)8MXn.&.7h:UuxħS J(OBcrmICbßGԶ_Xljck܄r:=3;W*g@]ߚD WnDu%7chuihX]/* }һQeW*o<'*"+1zF5 L.WyO_< o"/"~6,+@M5`E$"S? *6դzoƳ/R_Fo8UMh.4Y6QZJ2{OjXv=1uʭyX.qC3`xF8˯ = wVA_A\O\%+p U~ i\*c#JEE]a;bODU1hңnu[QӝgEnpnӭ~7̢.,WW HE @)=3cB_],hXZ j"*h+S(\+&`*rYbuk 0Ou<w) s7%mo^q>2 uv >Rd/EF0Uo{o<] vx"Q4Q'Xcw')k5)7׋&fn\L?OW.+0\pŀR`1_`"oO,wkE>2X5œYLś")dѢL.,6^ 8IqET*h0>>Lh{[^:[(Yg~R379QW17r@YNMlA uVf9 [vj~[ro{+:B,"ч9mkQ(kx:_3\G6= \w-Neh7 )_PlD%",]O1 Rwۛ دbB;*;(Cf$/?#?V缶 )Ye6/iQ}/ wicFZ&$|vwkm`68=,N.<0n `⴫PCܺTImZ( )Hv! nEy[Sѭ% r0I5#j4png\ >pPuEq&KVvNYLRmuɮJ:*eړOdZFNrQFA؈!JY8B4_O,;N){1e|N. Jf 08"~P[z.j&=EKڥS&ejP_u_ђc?_5柑XMb T]J GMܖqAbRc W5>pB'OE$a' YcSָ'Q+eFn̻Ggg,BL3\J_+xnֶww=o%|RB_/B__;ڛ|W#[RpUt~\ޭ諧vD?YMs~?@Gnt+~]DJ_.u!Y7vw pf8;B)36p^Vd-ğb KQ1.cb"l Oq"I;GDy>ǵW( ?_ <|$2Z}La?H2AQ|Zs>_is-(/9Şe ("bj${(Bהjk bXK<V=o>Z<~Vi~g@Zۅ}C;E\mvJ -|?=cO=DXk0ŽGS}Ir? nud@$bc @XIqJ.U.>hHoO`~OY,j=>V/qy٪ʐ KB߮>4fHr?= 0d`b3DR~ >%Ag=Wꕖh&Gݤ=>{[xD^'hR*_);%=}s\뿵82㿨m5ک3kqXayZ9^h{ YR篗e/e~?؆rgqb~_|^?B>_Q;>4Wou<1f[yfC˿5V7wsw8}; KG5]ë\wzÿםӜwؿzh*oc۠n.Hfb]LG4[/gS߃w/jKO2, JÉ]f}7NS$?M`0_d`8h2׬ 2s2h8ߥ°@'l#џdyi >VN#4.\1QFpH {qy;Bʳh73 >hR;y1Gj]>d`X8M6yW!cm F;4_nA*ïAc70|rȒ1/Yg8!C / ~'9Y@"Ӏ}aM3 ,w8jŁ BT>?= m%W\F[eT`g(@ ,'YMa/6p)KvLn%; pDToqFL a%pMœN^t+yJlɂ<›8(> *фaӁ7Øx9u[:hF - Rb OQ0(WI%Q cvXfIV<@]J7˛x6 =ߓ_FJJ(h UsKG)^2,=J^CI`] Ӿxs'7d m5Zı#;y=Aa2L!*D5Nfc18lRsH+a`7Cs߿fʁw{\p`m3HL;q5=@] T}B-xA$ C2d*r>tz2fm0UrC+c`}1kjbb0g)) \9sxGYv;&2lg7ft,ޱ:?Jr&mF7xrty%[ _k}IX/&r|zp՛Mxj!2b*(`li`9 ibx=Q;5*[[;voHx5[ӑO8[Sygva-O,Ѡr$unP*#zg;-lJȆyD|T @֣ AyJ00nAz!`qR@PBf4f aZڎYwU,&Y`3+[Hhtsc/`Hy?OcO$*}v;ڑ=89  1@ Bx8 NW#d Hd{k8 hOiAb#>%':P.R?S'ӌ kL9j,x0K7UvLCX[џFcemjbύ!j}fƹÍ; U)jHF"w1ѿw2A[z?&XlJخIyW@mtg BUԚxR>ICe̦+NK6\rc712 鸓''8'CIgP9YU)1vP U~b7MH1M&` ϐVTl98q}؃`SGc8(e&>͸/d\?r!C[%#eZXvr0Fdp6pI:Ͳb6L46{3jtd aLGE Fu6$,pW(!(b)+m5&#Fe:Uͽ1H:qC4q\<akVB'mF|1#9.& go 㼻I(Qh2$2@  t&B&Jd"#K?nH*hDx ~!' #gqDcA2fx LYHQ3zZP/Jd{+Ch0f!)4 8p C nŢ 3eHSǦNhwy?5TI!Ia&LL3Vr@vp 4w oO(ec/Sz?0:p0}bVhg97+5t96jQkl~DC~;̊2\>xz4 3?jb5-#&$*}.XݴMі;,oO}88ny3J6*XoxR{+a(nWwOaB(SAIٍBv5nعNh ,Qi3]'$(r DK7|>/Lw}Wȍհ\gd3QdaGb,w~NVG hˢ`42rA_Va3BX<ew~*?]v&LE|gw.V~F5(zxw?C`L6[RO̮tLcxZ6([D-1wD>8#i^k8?@{h$T@?Xi!{"3@^ p(.q3D{-$G4p'Gi ݐ-J]3@}&uq\~>2{B'y\)*[%*<^l&R&3( a}fɜOI6Qd3cըlJpP}nuK[~bdڞ{#,k&J{VN@8Z4=*_>f-UKg[t pS$k#І޻fw_%E5f˰}Xv%2{S !w d`;l+D2UV 20H&+MeL)En{]\ hV GJ^}2ݲ)G,bspGg" 't}SiA{;}r˺&ny -,6yQ{9dkN UDq agiݥ?|CjLX ƻ!=픊7?hýƂo@[8hйAѨX hU |2v=0gAx a"{,#!"[c `~K;Bv Q!|BplU=P'z`CfFV&xpyEKHu3Fu &:$83UB{˝o^ܨ8d:vÏҝR9m\RD2L'v OA䵖\٠n/NNlãJ[0^y%5sXlMJKѩD'Aͧ0HxMN`fxoWyڪTTZ;'kcr)q>t]oއwc"U&]gtÇpm 20?\lPCq=~V~Џ4fy0Ŏۨ0 @-*La>t(`GA$ T@X"NiۛH: 0"Mz75l,}'^&>207BWy0Q|A>?p.促`넩Dߤ4CZy#R3frFYNO;+h_k 7ƽtɬ2ܟGΒgF"+>)(AǛ g&cȼԌAt6D bks/:Q **lb-FCt2]>ȊsPZ!(MW_7J]j >N)N\`HlS)|DED5t"z&"cs6:M,O ũnI? Ž}wP,v1^~7{Ҩҝt0_Ηَ0q`= E}tH]8)w ޒ/R {<rΪ`dRZʦSpsNTE~I(Y)2ߣأ1?ҚZ2U<9oףMQMF(ԇAñ>0Ut?)Տ^HU| ^}B+'宗&t{^7mK0r9(,.+Qol=9xПۙlOXR3Y0Ή;̅ 2֦aJr!Ux{}{ nOesW4dC^F,B($ uab9yYтMp*"` D 4cf> c FL47 VjN _<U#c8@VByQՇ}m yb98:a^w߾ߓߓ5yMSlt\pċYtTےttSxrbJEa߈2sR"ȥ,m9*<EzyV)P*AZN}+q*0v5%C, ! ä},S[OGo0c00;Ȧ5e$c^y2 mH,ȹvĖKyzv0ɰq6& y<'&,Kz"Hx:|aaED0 /T3҉GSP-`4fB+ T*<gض$Du(@f 6=\;bg:\Q*)9nrUr01z}Pɜ2756TBl4Iu|*;-X4'4LY -oU9>.@m vz2/J&jxCrlBU A0E0CS2QbŦ_hj=В߇I0tdz7>DiiɩΘXdzf {q$Lv߁w/pc)pT VIP1?`vj;`J2AC=/{fkV{+ʮUluW:Hn#ƞcc3m<̡__`^Qm&i,&D%jj5՚={'Ojm{H|rtG&!F ߨpGd*2- z?mvZqjj뉙k3X8+\:FB$`0 DݱR 6DczzGFwZ[ 0B}3^Rʦ]X:/:/VZ'Kw5pM[ ?c?84  SfW53#,-e u.&u_hg}@i[g^xg|lǂKJEtVf'J>}g6ִy]OmVD/.VSC4 úǪ'^ r<5DХ@GeF4Pkw >}L[h9CGf;v0'k0I0S_kr³=a#F@~41ea/$dA@xUEBGl̬M;f*z'ibF1k!%jkļX6sBPN6x9'|mܒ +~3MUHYL5>rfb=TsDxaxaπQqKB,F*hU(z',Tc`1OlZ{I;χ}$Ab ` %d/}4DUgI븫e{ gUI?8#1 ccpaK1TvIc pǷ9AmJh3 apD˞e豺JX^'rV1sسU0]]ƽ n.5MtlC"xC;=#\3U2(97U}-9\E&>mlֆjZ>"A 53%WsjVc8)$E9' ^a֊fE芌nŬY~Fw w>U6.e0f[e2MV1ض#&v}Ðd]Ŀu͊4˽/Ln eL@h ~3٪<3a[.ZHfZk 3NzwL oQlYϗ8Bmŵ {h&MwZFaZƢkMJD@Wp+5&z<{>[Kx?=lѐ 5i}QNih=) kН҆x=LiżZ0xI>ENJnܔ%pVgރk-->Sԏ+MP}I- k1#ѥVD}ଛ}YPV+Lx3a8Fm.b4IŚOgK{FJv.2.뢗3;uͬG@\V9x z#x5=s ߴq$^e˹Jh"I_a`h)Ȁ4bTd'Z5=udOlԃ(j֌oonWQ0U0ڥP7+ :/Qnѵm 33jRit\!ύE[-A֭t6@/5wL蚞 G .Qmxd ]Xk{Y(Nn_5}kqLꈴڪv1] XbfJyE)\zc'Es?)pt*ckzW[.,5f =*^]rx흹$ /] 5d^\\̬l>"װޣ;n6|Z1jcb.K%bPgyG\34AC20XKG}0@SLdΘI ^zue pK|ڳn^aE55ߚA>_+ Ţ縰"fg-Ls`WphTP:R"&ͫTJ :ۈ7MȜWVxʟtG#L:mrIm$꠿RXmUUٹ֝}w<&&9A9AEvGj/fF %4G]? {wD8¬Q_DϴSooGř$pU ؔx5͗ _20P;fT1,QHmLQpm3=jW W#dۘK0svdtLNsK< h9+{z5Inm*s<"܀2@\hSQ=Kj,lD_ jI+s/`LYg; {Q$~k'祚K5d j7اfO`:T)l7@cL}JfO9x,%< q`$2kh-SMUX'84wCcG0Q]}-^fQmjkõ-+Yo(Wrѕ!G=!YY'aeq,`];2U^W呑}`U$\<(J/Ȅ)֦\M+nX%ܙs{RGROkN555ZSa{­|Ӛٚ=)rhlRh2w 5tx6xFX=/zY Tmmimi,$n%ZycL [" bJ&ZBKzi߫ Ŏ3|)s (fw|J Iљk>C*z%ewIj''8iLHQXiRӤ?iѹ0\̥3g#ټynvn^7@bRWR\#R%0,kde; b& ɗr^awwJdv-gGe);oIB/F *2ߓٰMt{NEֵYW]&nXE2œ? A:}RcaD0VS $[)6l\-?A ;t𜜖kK\RG{QZ$_?vP Ah}Z1O۞eY7Ilќ4*IcG1o:flbfh.g^&iܰnq7#Lw/`<jW#vS=ÓQo ?o^_fDFW=Ug蟷[l? LjaySrʉ0ZI+}r; K#4G );4Xdt3or_{۠ݣrЛd4wI_ ]7)3/[=Q`nzY 'X)y6 hq$peJ9RTGx2 9AXbQWp}A.5 eI2"wЫ&I};3lB-y^HSvwl>35\rMp'Q'`Yx$OVW&FuJw=4AL+|4|LրЃ=^Ni¶Y!I{m/8GPpcn \&! w?TۮT!гvOfn@C7t a{dʹskjfEk(#+d2#{YP˱+յ7_$fc} >02^XjKwTwm>>_#رG™#J狅bPGPOu4(?*5ЈwKC@t̗!6rPLjߡaa-ݣY!+|v)fLv3 mYj64 z{&S~KbVmnzXZu2q|]\9OMٙ_iGMۥ|J\G0n_,dt*fRk^'.T[93sδʾ6?sl#Rư*K/g2PM v&_s~$ !6,k޴>]>)9\9) 2 N1-U9~y!W5%^h[ݺ&+@;f:[Lscͺc5}z~i.vEf O#!p|.ŐQJHў_\‘oV\G08n`)JѪ{އlpn伓Sw?gsߖ[ G/:hzjʪek~R/#XZjvkAVw>/X$^[!N>@;tmјӸc~,1ݓMRK9(R8x՞]Hȹ1|7D-C%["CLlOh[n8,)Ťޔy\0<ԆdiH(ꨐ{oGh"W CF4Ύ'r[gA+$>jj1|͜0NYTT8i}Þ6Zn@j;gI W}ڭ4~iD9]R#ޱR0`x^W>(ה a|r:4-n u\`)";N}ϝhQ3hh0_;$f=ӹH3s2 \}{=zo <~_ ѭXR,~?!F\S3M 5Jr`B3(',buxy3Ҁ-1#𕣇^7뭳d[:Oqߣ)Wꝭ15NkPgfB@{ > u AMp,9i P Ho;l#]6}2j[dѸ: U]eJ$AIv5]XG}~dfê ^_J}^"3J3HT='N&M짧%_>.W8W(ɲ~]~*J^#sUG{hΤ6-ܕC\y{.D,g+}Fs'[ l҇C7~#0AxfޓhHf!9/D9'!0lkn!+{N3[̱_*ަh |qDDI/ *}]ܬ++hB,f=']XC XhU"=Ě G퇵-j~wQX4#~KSav8hW/*6jB{°{;Zof5s%^ FrN6.w2zkPMi&7gǧ5hp$҅ P dqN9u! pM()o !솟|\3Fї72_b?pt K-"Sa{. zT*0.[2,IṲ̊DՂ,,k0- leG&D(8L(LoE_ ~8])T;M`Oqw4-R8l3GhltS1t<UNީExls~Ns'_W{xڷdvjv!iTeaz ZRnbVɷǣ,a a`'9h gf)˻; Z#[2i*${rQkUwor^y}| m,(m,k TLN,{Tz}*MH0!Ψ $>9@60vai/3GuެwWUDf}xܲ0n__t5X`=uN ǣ $l_wZ*'nQΦB~ܩjG[?q=M;rМl# m'C҅``rzξRuUbړ{<G8;lnx DPigJZzKX`B˘( ;z;ӳFpܪ[P5  M&/['38n\ac 9 ̂f,oϭ](GvU/p)SGU >tU5 D6AGrQ*k;r&؉]J?D"{ D@) awNlSLe5RsLSUE+x=iq<9 IPF6"&pѮi~#V; sf=`͛ tԂ.@t×gҍeaPo ;|CԅmVLAqzTa6aJ3Z&_ ݠO> > 1wܬQ !|礮qOXC(4V&/%Ha%lks_z89mm1[SQP-N;Gg;pa#;P%B@Y?LS Hg:/sGbj1fqPGnaF$wsXkA"o-l+l##oC[ ~d 㖲'VmMOQ#Ϗ9Џ7^^F獏y<ZFVG/'*xRQAAɄEصqkm*ai.Y}({PgCɒ<Z*Lnq?y'ťA13KJ&jkR'6B(AQf@fڔ'')h('.,^](ԝҡI/E~삛,OE*돿s/]T앯PP"s 2(4 Eaf-_W_D6)+W2 R4˳!#_j("ῂ6~t<6[)^w J+^ЋzE/Ũlip05?_u w,ȪQv\{Y Z_gu^[ȱd2x7vv}`!'Dn2V OIY-΃Yl%=xmHd]uK&+5F+OFGG7c7m8{$GcĄ$Oj4 I _=ҜZƫ4mYsʝq呒AW$od^lx9*L\ɘ-{U|Vmz*W<, ; ЃScxe0_[$bU)is Zf[5xn {uU2\ ]nQgCOj$:Lԏ8oÉϗ S"ܧXxc2̌I}/v g]1~ORA1N HX4S7DNv8ͩ,`]ARߓCUȀ,b@dA0H@[P}l>@L& hեP,ZurD5կRrApJ ]A{e V,3N /;MnSsC,~\A,ʓIښ҉LMl95 Q~#޿Ä4Y ?y1ӦnR_fh-5X(㎍ $r ؞cg|xPz.Ufh~$Ql3`Co(orއy!YzJ@X5%$pC ^S''rLU;gT3 ZE܊TΤΡ)*x_ ezٹ&'Z2M7B?7{}SpB$h7B'g3N -%h#(yO%i}MQxKhF_ (.[[ \Vv!RD !l%h%Hn䶸Źu ?K`x Kn7 %h8%Ph&y""DT'Q|n֒[38t)E3pKQ(`efaY,K/q2 ߌ7B 8;2i7:)ˁl>fJʌ`rafw=3n<~ʡ/*q0j!tꩣ@i*&)^4i˓'Mjg03w1BtOΘ!Xx#LEYpO$P8qM^5(y@z~٭9{aƀSn߰:| 1oMaT$ݰd,^!vYvT/v!*'؈5˷%6oxas]U* [LfW_-ndô̥_\+c s>Ì3~̝7hk|՛9=mKU%ͪy䯖U񒪰zw )'o42KL)ZܝM͹?αbMDp" f6#Tt|-%c,YMx.l (v'}\wzV;'>#5" koBٻ,MbRjY7yÃB)#g9c<9w9g)l$ݎ&ۿ d*OMgD^?eĉ V;ʇs^y?d>lJӠصfGmWvY7G39{"",-79K@N{oJBKju=9ēGp _'n67 *S#}kdl`^R&5L Jdd_R\L|K>dOd!_HgDB¹sJ#E { )B{6@ ;0W_$VSxn_E(1YTߖڬ#9tIeuǼlᄋ>sGJ塒CUr%r !3쑅dzTUspn IL_?"*\lIJx͒ VP,G=M!gar$MXP*%,l2 I{G_=AiM@29Mkוl2ٞdTВ0IF蕝 h(c sFoxΣ D%9t"aTB.- I%= L yB?w/`xabY-"'_yڌc|Cܰ-Zxp%3 2s5 ;ӡjP|b)᧳r{̂ LP@&A<1oNĒ$D ZN>\<Q22 c 28R$ 3LS!ò,8w74jMt`pXwh5 \a&f Xޟ7,mx[@#9s"X$K` Z<XB6`${/ڗ-ޚK4ҧ16?5SSelY ~@R˗+ZrEXc&?kR_v]>gгy$5tY-x =KMC쏵8 a'QORU^)e#riY.qj?|7՟C ݸ)\SuF8"}܆Fj-R1…ͭͥʑapT&5f`( e|ĢH\(Xy&KM3h s Z0w]?IC₩&dgiePH,P%zHaң)RZ&vE$IW^5TC6TNёeQ.ѮA%=NkudJJ|J0E*):wcVT0O(^,_l'Ն<˴XG0#76W(HE..-K2 ZԱhP3Yڤ?{= 9or~W`}yP]#B(BC&7dQ7."8F)ߒ0DU5B>7 5g4m>54oZ`u10^#)WA:$ui":ڼR Hd=1!3Ռ=²iGBWkW-K Hg{Ts1fxc3fZ=+JxU9?IclzuRxnP+n`M&gΆ4xL+U$+'WNbwk{P}[V~GͣMbLqȏ#ju;a&> oS504FŶi.s> ,4EOUeuNCVipfL &;D6aPz)ؗO=i"khW[FU_sU!Š6׽%S ^li+X% %1>U1Sǒ2^Jlถdu4:J/ N{zl!f#7On2XrgE~Ê#vn'Nۢ Sc0_sGv~U"ިd wp{dId;;&qU.]Cޮ e^3[\́љ;tf'iXd 0ާw)=n߿-. ؿ`zݶJ;+VY@[N)Sm5n׹S"M6fVTϑ 1/n?XH^􉞷(r=pMw")"C-+1퍲ܰ_U%k)Cn_%ӗ{Vxv~,;$@XŇBS.nJ O,3܇V~vamye݁; $Quqid eݔǗ璚|%kb6e1DoC15qӸwPcњd"|ucѕHEy&9O\KVP6q9PM4ҥDdw)5+kc\W"LYm4~n|YMNz Gž 8'odz1Q_1L7)%/1Jtru94qޥ`kO!gjdvY_k E К/87I_%Aochzru"#\A9q|0ݘ4^^wHN& `IsYt@Ciח%>KPI@-SA z],1|ndnz?')<ǘ sԸ0Zo [ji.n2>"AE ų7 M5GMF .ƾ-,}285[O@DߦBZѧ˨tS :R>= h_}{$~w>#C᛭@Ï}E""(^S֕aYc;9B}$(<3;礴"t̻w\ߛ^!۝y f هz)+w{zi!CDWܽ&$NׅWUr=( j( COm|.xٛ/~3f 95&0~80/r4!7Ds< Kv >"俅,p#~/ ?(;h@o n!NϧFY BhJv6Q R<c9mfM͜PшL%{[\7= =b#&Ʒ Pl ֗P%ԊIY4"9pv단]w : uq5J;~ng}vX:< C|Q7RGhq%k-'b=N%[GN ;SNd9DZ_D-Q+&:"jg䚲2j/v#` l[жزuR]бe9Y_-PYŔVny%E6Az 8Y";W G6V|yDZUa l;Z[kow+Yw/yO*&IraPwMM5'Ԑu>D@_O^!9;EVhŽbН!#8ݹ?VsG;?G;0627՗,qCۓ';9z֓ o" ?,Rj}݆mS,rBN-bxx9XDwGݼJs*Թ{rEqF Ȫ=NS t9FηDgnK1%`.B }7sbz\g^ݐE$B`C9&Nc|x6Xo:X q0*עۅ:n֦pϊR]sw+MAD_Zct󶗃VSz4|e `1+ $.-̴J/^0bB.oT|Ul0%shm!Jx]P T]"9f=og)~'gA,){ܕGl\C $O30}C46 "$ʭ,L D/f0uNH^6:7 vN27|J78GЪ#]{ݮ[Z)oi;:+ ޖM+.k&]L RA }dwK8H,leB\L S]j>êOHM K-^1w}Eu/<ȸ]7xxA ͺU n?8E ^sq5Ft+'nM׃h̝F.!nOaK*nH^Ñ^#Kz p<0r{@b Yͽp[vBT;=g= 2SPjS={0'OU)g{JYf1BM^оrQlu<;OuS΄.++ /3%'*hjWzb0[_w 7b%Y$滵rq +ޣ#OlvUtt6(zУPd^OLgн-b5S&d/ck^%iW%|Ax:%PK:+ܮ~ ~iLYKˉ̖snT 'K[qbFo]޴w0Gp_JXg e,旗 l0E .乬j$C@x_ wi3U5)2Z3Jl&kyl0GK/<>e[ry|-O<h+6D730tV+0cV- ADIS2jTT*U8(׷|?1+ʟHzE*f dy^TAע+玅%z4Ҕ31h8Qamzx/]UPy֪OѪ{,(M''l^^4 "~2ѳJƂx~^UԹ QN-ǝ'2ˬ6Aֳ&Ȍ4 jEC; jEC; zk3AEC[Amh9={7(`ӽI%s7(ה5j䁧|Fk VpJpCMGsYx:bzEذ??; hɟ,TP۱:Pl!aP bS EJ0(|B > fy" ?S ="g&N&?rtpزt!.E,CKJ2{-oȴi•\uLsLVlS4Kj~ ſ+~ɻu{AT HRAT HCԫOHE z'@q,+IJ/k v>Y[#6܂u6@M[.Q\3TyRyrw,{% uiĤrZCUsYvM6w ٦b|UʼjI?&a xA]@-j;yR7qV$To1?NSLA¬Wgk*fm1߲jYJ+hv:tKD&R&3B99)MS鑑\Bys׎Nƨ?4H`>'4XXMP)c GܮQUՌMA*y JYMՉPwk*V|UA͢TUOV%9Apߑ%ʦ%m@_{V'|L8\KKkt^Q$SrUWI>mQb5 Pvh~\U^v0jFnY_輮U"IT63Q̓-Ԑb#ȁq)8&@2FYG3|NH7 Rԧ0iaEg6.3tkbuz49ow0o(*9Nd RD.Tg$~jAAwe j$ AN" =RBq~\C(yD1P2tN $XP8<,NKM~+e5)~YǓj?!n)~xL#OzR侀45?ǦAꓪg+4DXJcZ5HZZE%Hw|q mfBukad<>",1G'TO2PwTHkTʠhR ܖZP>BB͌ Ya9:mn>w-@ *zC; ]5ȪC𤤎 (,gGYtR`fIR`\lgfё0$ ߳0݉#_U^ OD=Xe } CGDSYc 4EI*DF|&0oGX"i|!,kfC6O9 Q z q+EU p4̲8ʵ&0}Uxja,C{B9iqY1hgUND&mVn WF I^L2<(J%mXKrRڠ\I!QyV+ЈG6JvWRTl6ICcY=^~ 0t8TZQ|/X!1ӇDr[`i[;k잷J/$o}1 8P,_zO|aya0$q O.!%gndV_@ӣ}[!wDU,[TA쿤ݓy]7C_ڹ殠00b2ovs3-1zs;Qtpj # (Sqig|x*\āb":REYC q(xKE}0WY 8ȯ&Cjrz+c%JbK[T=ܕ똓J_?ݠ\3SƄԄ1KdqMfz)ƫpX3@ ]p[&u]U&њc\ލd16Zy6Ln׬6K_0`i<cXQW рU *'Z?}.edպ(Z2{|•YV9 ^,\aUW*¾0W#r|v~[\\5AY[dU- .<* ..W .CNupq +.sq+e+h\\u%BGj,7Y ֏)þ~ư͌AVp}Ga:/&5[}Rg$"˟E rg_Hi!֢SyoTݻ.g86~UXJ@?R7$Dt~ƟP% N`ڈ.ͽdRB͆cD ֺj=vgiE(x{'t{G.A|WHfevA!i|0&Xc|/4=H£ wSGկC'%TM S2n`YkǓcsxNhf5O1|[r>IKz3dyg'$;JhG9q(ggK^S#zzF&ugId%bMU_/ GU)[ԊR]OҊW ԟ9h}| 274fy.>t`AW\9F╃}٨)iU[=*o"d~1X p`(P 5 Ԇ-tkCJ5Sơ%VU{.bq {XSe)Ů+Q׉{Pc% 'WD1xqo{>:0SkޗHC8hEQgbCX- [)}ؽۻ^~~ /[oFYK`xn,i ? n,/5tL(jY'hV&nث/ˉL|ߒGN k#TF tUCC0B/H 9Y$A?]Ǯ~ .rr~~*.3o0gʥEQ'#q뷈|{=u *t/WUZ`]ӷhZcLA"\tyd %Ԝ`ML<0)O&l8; e,Z+s޹w%jdN/O}] 4H+v_KsIF6`o>"z*z䠣\p ;rUmb{_ =,)@< @r* fHXDc7/ʴsur KTҡw_pfΎSe6| <ϫG<)?bs?R _OJ)E!4U $__O0E#pG@py;¹ & `|?b2+fEȳPՀ$$JT;xΖyԝ~z@Gϙ_%Z҈_emJۺT !!*-̂< zl5vZ=$>ĭ 1!rn]k57VWa WV.rEZ9W4֫H+Wv^wT U8񃁾9ܪm̗UnN%=O4Zqk)=~@Wg)'.(tt: ZgytY UTVDǮVmYؼtar]D*8fm-ueʰoF e@%WA{u,ܼҦu]Bչ!" ڽA&NYVUَ-=̎_l݌+σG1 9O/!|=}UOTF@Hg;E-yC)& }}15ۍv0:q]>N1o\{!ˡFXL.'9.ݵ_DWtG.Ǫo]N}ۇ:KGzؗ@_+W\Ehvm~e0ŭJ oݵ ׿_07r* ae0+ngKS+Uz @Tվ%~*ұ9(a=HCЍ~/C>9T}`.8N3LktaD,aD&у-..:2y[8 &frD6G&MR[]6estbq?dj,~e&0~r騇Jo:h>%KJV7x\5䞟.P1ގc.&H8 "畫4u<[8WqV1z>MCQ t3{zŕ102Ug/g3iU-s(zN9vW~0-*/c c:x}rGe]4ЏPˇE/1pz6kF ~rW.2XCÝ@K %܋qT->XiG3jEU :?"~:#M=@ tUL1y>&z`g~<`.%6aΣJ(nK}r C'>t*7kڢI1(dBrRiЫQknYU#󃵟[f޾VuɧوZS\Qq/aeh[U+*jk>|DH|s*Q ԝ27ÙϨQzq9CmHuUY CQpWIa*L"wbu*7oGS0?6LC;&w؛#6L@_s`?RҼ4P1;(t24lHXɲ'Q,1'ޢ(Vϯ c =R?|!cԆՖ!9 I9JĎDޣޏ=R կƖtؔk%Q9\; RXb XHpzH}76mrskCKUI{nc@G^9˪w 4_S>Ku ):4~?ZG?|n O`q"zcPVMZ(z@.@|k_Sܼl;j  pΣw㕳rrQ9e{ua$VOngP))mr;EJ7 rV]C^}@?@ք&iQ;9F9 u#R"=hv܈v%Jג@DͺE ͥZf/dZGױWRo.Y9 NN)tSb7Cb34܊ND2#}6G Pn  S)N$r*sҰCZ(.Uw?h;1rT2CC)ːC*#x)P:l ι2s(v2i S%b_JNJ/( oI&WwO_ϻqtW33"J СQyD3շugpw ;Vű,'vi Mna=zaMkj8tm :p͘X=BB|9Ѻe5IR{V߇׭?(5g9p3c2FGPVht-wtuv48;d/ YEj &0r,L}b p}KKrEj!:,"66 F\_.cOvvzy-:Pp?BUs9a;7vR2SMVX~$'Txo0?R4G/(<Պ NToq- x |VWٶ0u ̖)2 ޑ G.c=DF"A@@ |~66\/U/k) SfrK׻ zE_x]ciPc)9._&K\Ii nᖍj{ڨv6{{ý~{O{2.k]fĝ')fƊ(\ERAkpA'U2[ۉv㭳ta 5]ި;>L_MϫIQ\= )a N]7u(wSP;dsŞ>R*akʈ`uc5׍6p3{p5"*"f`8:k1$QW';b $e\`$"Q7:F'~ @/h0# 649nQ+\itl)4ǯz~=go;ScHAƒ&= .V8B8JMjN G6K/6| o/6i B 'm5o^75j 7kD~A>BL~t[oTPgq `AEs*EgclVhr.TB$ldN:At*WT\wssED{o'W*W}y>m:}R>ƋsdaSM9 1Ogřpq&8rh1G'I9ڙsb1t!H#ү4> <#T>_*=ioͦHsOݍ-GOu{pO;O4Ukt:Wky|QWB[wT!vتc+T։AE$1dySbrn_R5*=ѯV}co.Qq?Gt?xGt=P'2yw+VHn>R:  n'Zͼ2 3/VRtcAeMbvRtObDP_a_zUM ZҪd&.F]ɯ:4Z,L(".gV_Y> LaƋtBrQeaL@}R,hlo` Kм^Lg=@I[VA,D-GQZ5XPD!ɶeе+ uGa[Dz)Tv-MVŝ #VJYu*ZtjpXa44nkvG/ۇ @Dj!jP{h(}%5wU^1$ܪw1Y+$#vËȈb=Vqq}qnJA>On% ?X EZ$qIb ktÊ Eʸ;#S]%RmcS=7k V _+XH'#R~_#xOx9b5?|1}km$WpMWIA>OqE(a5i2ox+zXkqKމk}9χ n4HDʠW&ʙ}YL[=qծbL` ˎ> uO#t؉󬭃7X${l~a']ơdXRKHT/M"*sMz~K. d.B*,hg<'"?a!n1Fun=YŲ1܃?%FP +]u՗8XVݼ<M)#0|UHޮ ɛ F 3SHDK?ےd<{ġ~b/<sD\ ۾3T "7dl0, x'ȯlfZ QG8nQHvw>֣!#Xt{a (7Z'MĢLk1lB!S 5׸<9*J+'bŐO&HRp=1ڄ1^iNVao`Ϩ= ZvZw5bH QcSye/<Ūv-EʴF19*9TJmv3QۈFIJ%J/mvnKd02ZIZSJXiƂygώ2}E>{tύ?Q>ƋŎ|?{NGA4l~((Ah"4 P_,j)0FTS  AHV#ª-@^v<')G4@{lA}"{C e|f VzQ_(_aTa{)R E8<;ǟuHRM'.͍7~'u$%.;1xd`p1I422ZK i>f-m^Il”'ʼn-z9'%=Icއɉ\NpELbkE!,=¹9odPҭWR1 yCBW,F'ONâPF]'Y)8iȱXNn|JA?{r̻vu'!/,)_ F E9 8;FBefrӣq9R)枣quhsfts[S oJm2%ƾq7nGTWL`fWWD豱٩h3] c ,FgAc*R0Gzg*^WdB` ߉ [Nx͍v]%e5Q|aԩsE8ozxr VM5S"J0QC%TpVA+h)_3Vd7i&-EeA?&#fI+x['ƕ,nAw*]9q͌v4Kn)t/Ʋ]aƩرt4.<2kE%ՃQ2%G\[Vz+i<Ob'4L>OWSP|AJP[h߼S /F>֟vwYF<&ƋdAs4Kb-Лr ֶf3EMM/ʴ0Fp9e/&b` H_RÙ~狛sN5Kj~P/iWѦeUqbxU!nQL MK3@g×hAN(poN|kƓk]vRRƬiFr@Ǯۄy;Vma%P{j3{I3A'͓oqi^0P{bu'ͦDׇvTȦ^QD^aò}ݍBVDL/b`Pg) dgRZ$LU8$pcRpNP}&w,?TJqsJ{ P# F45yį)E#MV(G $#]nY>. '._LpxQEȯ:cg:KT ]޲}f ȫmav^9,fZ=zB1[6ó@_eU"+cn;P퉋P5rWJb 7G~;܉$C1N貾>תUD󷓫rCԆ1gHgK)WR'pֶ̮I)Pk( Z6,4S1-ed[(0=yu3y1YV#Z5-]%>#.XH:)S0lw7X!lA#ocݙ٦-w>aY5&Z0E5#5XO7[>.?%1?߈07EhZaN9E~ԟ9c~f ̐F<,=ի{6*FRqq{y?N:qo87ĉBEQn(AW[7+o)4*'34MZ"4*uP%oJqraCe0資=1RkG^Mo+}7_ pV&+>;7N0u_q߈x72ޔm~~qo";%;ԗ;}sS ?}sj~jT?]ی< (5'Mjp{&%58#MzjFqCDRcz}67e&-Tf%#L%LkWLjvXje"S/*jḥE!o\#@]T׃c>yċݩώ'+Q pG m0.nS-gŸ~dqr5.b5M(03s"b&i -&ut=:WB^+-p*(iKOQ{vm+V X))y.-Odz 6Ĩӫ)hkb&70 &n͊muKhL*z ނ.hrn+kUyD#;|)b]nx DJ{ ~. *ZU2Ux΄]Ѫ=ceax:uTT.OTS&7pMg_VEDΫխ*ˈµm>q!8XUL n \e)q`ZmRA^cGK4jUm3m)7ujKNhr: Ybѐe%|Cx/hP9Dn (V?p&rS>1EjHW[NDcܛdQ=Nǵ:nR]踁긻Xkkq3.E.M|ӏƋS|tVy^_" !ci޼y._KqE]AƯkQ񯀸 ? { ή%n툋Lldl )Ƒ ?pd~,0o'pjde=&F5i_wan ^<A'eG>`yYgIdt9Sr_N5P[5pOJl~/'ebYm 㢐"KvW.qaq8.l-2ɞ;C`OҜ%6q.n x2<~ve>\,ofU4C3,9~DHٸR.% uw`5IohY}D VJj2jv=x(~r < `XܴmW7Irr5~5~&9|Z嗧^[R`dm: juhOC< &a|V5 F2ȍ(׃k!ZWyKKR`c!`DZ2Kea\vv Qe'œJ-ǭ4yFyb_> _A= ž8I«[oW{`. JHCÔ5 M"WH FqM,/6{i[.|8:ʻ7aq&^J&kh@pi?@hx9n@+~,t7dğZ=Q xݪT^S )Oܾ@ڢnl̸`/H8~?+axy>z"\s[tCPҧ]7ݞ<k7[u]]/Mt=l=n}ӌ{8֌%g7NXU/eSq%YeBe$iI>dz9Tj֪hE7{=:Uo@Uŧ= 祈De|T+YR!f0G}*?!(Öl6*S4-<YF!Je ($F#+Æ._ ^)Cx덨#j,]rk悛} |"m: e՝[DLxTVGvNzm;hߪۈ`FjQ ,-e3ۉh;f|ix= 4迱!8my C۶@.6l9߉z=3vVGxcx?PEF'z&H zwra/l+^1+c9ȝW,:#<^=e8EdƂ5c.)o_/(5F˧;w(#FNFfኊ#>U㟞ߜq_jNWdP[g~)VbX@=1LH-1XoTI7GK|% F#,1!yxKA7H7iP! ^ֱʅt$&TeR6E2mWn]nWYч}ig&G Lv/RPR~씽dviٖV#] ))lbۛz/d 5n^ /Z/zٷIԓ|V %l꽳Z2%tux[W2 N۩FJ/N+@,ɦO ?)SH ,tJ/=]Bdlpk%ƶKGG%S摽[:ՍFho6'oJtC|]ǿ]S1 %xX|t2$/#W>1^<(\Vwܧ2вOW]Lmy[A54Isr +G,j1JlNT'IF܈=c#i@xԫ6C-E=ЍPB1=Eط5|iS:c bOn&Ƨp`Pfn2uë&4Zm FsWi_^)-c r)D(3SJvcq2>gh4p`ʼn/yJA 8_̯|&<[׈,–ƳM`B$<;\$#0+X#P: Shca!Ӛ8a^Ex9TQbxB4!7T%%O!T;\IWI&3BMkTp|w$f&xɅbvaZ,,VsN/f |)Yٗ-'5y,KS3hsUDMPwe`@* _&Y^Уǽޠ'8(2%KwfpJ"馪yT1F8A):sBt1@  6B vW)BmmJU/ٺ\jdN0z=~!2h<ڇ b }nx `p>GI!'!q>E yB AvJ ڈ5ҘcѮ'nhZD,o ) o -Ź,4t=rHSOYw4<ҫuۀE AKRS&°{HA^N}4 xl>%zW5Pfqc#u*$1YWt3zP PG62!7J>elōa8e:6^ ^%pSojM qv#Ɏ~>DGIL#ϼ2ĵ')l~QS/.G%@ٛbճv?Z ;/O6E >3"cmgbR" #}Mo}giVwfk+=-p,m:aڰ}z6G\qx~|oYVfDQ9\s| ,зLi--|GdAڂh*JֺH1&"~U$'=7I!%&]j"#& n&IVWJ2^1jLdQB^UV oمdTx?Kl2H2Ni#ྃ!{~$^|v{! ]h`%{[c`wJ;B4bf߿ppt,4"KŗtJ'DkoGȲkB*6ԦnP¶"*jyyT7J M׳ 3Otr-їU pЃu<APvD0"{C8A&xu$`hTJ2˨[,ro,d8 Rʜ߉74siOrhSWgd*.C$X;W,xsOm:p蟘Ώ}SC|P&#{quv˚#;:AgYhffe\"Նؑ0`MF@-kqcw D.:ӟ.;@kfxf蒥1Oc44jXD:Z֚ sL΁A4ֹ=gj#M v6Mي e="D4>5K>n'({G8\pwUڤq)zWЬn8\cʮ3!+S-7;ԗ[CkêMöC P HjaOp/v~O}-E#ls϶M5^|ŋ_>ÛG}Z?<b#?QO b`ђ5I2 &b95S*&7D$Q0I$tN_lJi K<42X>F-re@=׶_"{kxT-x ' Z-ì\EtL o'KtkUB 4eJSheopRij5D"`0N!K%nօM` jhU{!tT0ZqaFk  CStI9]JF{}i% !B^F']5܋5IJg}tPV@p³G})>˗1oȺ~18]FuEDHr!? 0j)RAn2 )DPk 60)t%FZiyF"l>C3oXJ:E"$*$o9jE2EUm} xzjOh : Y])|>O<W;[|.<^˅}b /MCՉbjJT9tD RVtY+(Ɂ..[_Uk?FxUТkE^r6;NʋFU!*W#6TwFBe`$V>cW^|kp4ۇfWNdm_F(рRެ&?˛u\8l.oasX%$SnW"[&[K%ݼ,Wͬy=^XEIfެ@2˒̼'L7? pZ& RGؼhDjsg&vń(6o6׮^u銔e t/M*@&zڊ*-$cd+W=vME(e=l⴯jwt|'eon:8 |9gF8O(Ru-P^[Xu- 6߯Ķrb.-q]!}pNkqRHKs&{dKp5b17v ؠNv`'Yf<=wf? AM-wG>6b9鰼w 0W,xPX[9vTppNČ$Τ+D:м,Qw98;eMAG3&JC%E^XIP<{P y+V"'->7{ &v6ِe6,A?u$NX{Q~c{Y.20 |ɵ&7?G-<~y5cMTbRqE Z6Aw: Mu$Eɠt T1!!Cp=J_RľqqEPq̛dp: :Rvo"N3Ф|[w}ޞ{|G;7Q.wYsN _pKDr"F;$>9y8Aril|v7 cbKfN1ff̠xļ<Ǯ@ qm"N8}C(~F svZhc$>" nn3k.B8Ui2c6S9I(MkbXo:x5?XrO`nf|K ÙiK0|Q`}h\-^I6Al@Jd/#5ɲ/uϘ JtfSn(uHE=x;y8֌qm6NaN.@$w.6gp IDO\1\McSs;0(.{:w9tSE+k .%MԚ`Tfe1A,M@p\߄G0-(Sh<(ZܢSVm,["T;*EJTuw1n"X4;ZHAd0C|7Mi sWD~IL._&>c$eb]7F孩)xIA{|9FaQ!J^_23n$Ƀw3a[M؋lw4c WTu;ǀ0`Z M y]^+HvR>)tzY?j_,XK[V5'_ZXBF+ʨ&:2`o!ơ3]O Flbj f7<x)Y$A8Ah?S+f6&ȄЎ_1e%esZm.WͲmoV oTdk<+^w[=r g[ooҋ*jlBlWT,8m#)I:4*#D =%ꥣzYf/={h^zB/zW:r>Kmb0zK#[˒n4B[lj>@ySG<튟ahr`0Q܂  vA5_./#~m?-#@ц5ԋ(= "ݹ|G}Q7e9}g_c0X&[T[j{Q~!O?dĺ۷`E=,F0Q#9Â<څb>˩9jROjͱ[ ވ$xh0DŽQ]lp, Ò%"5h#0LLXKL]4vo}SDD,:< /B4X<6!RW9U:Sw7v C㑃ŞoNA1CsϮև"ڔ>CܴdoŎ ={^|z1t.<$]Gkc{~LkBz56E$MBS֗c,byKPbsؔw]wj/rzn\釩ZXp/L)#)1=sZ0M._D'lo&w2VvG+~y!SH7u3Pдe*-.9V(yc9ߎ,e@csa*£n?vhu}M%a'?%$ %aǡ$CI( 1) a  LF'>rT?5u2 3B:<~HbcB9acfH$%CK{1j- j_۫\Ӛ F1;6T`صp`=3|@RݞGk d5A92MĶ'v.Yhs!J&jJ&hmt8Ĉw|qflOgLU[O<-6QkE̎MOCH6-6/S5?S^>KL>O.d&>pD竃dCݔ>FzCA:ڢۢInɉR%В^YʂIXƹ }Ш_cf?UOH )7  4ZjGa.Uut2YcF1WPߺL.>zк]Z"d/5flQKI'[dN9( ITsBLwmh5!4<xLz[#f̗731Nl݅;`jvJ/} VbKrVl+L/*<nloi}Co(h:yT)n~Of;}鵏GUX ̰ D;W74ͭdoS$MLZ\ >rY&7b4/"&5qǟ3,9ދ f+C2n&ﯦk1*HCj0lz9i0{1k+ lo%/Nj1i2LЕN"klR֝adq}9/MG}ЛЕuOSh:i"UnqB{:Q?a M`Kvj5b23Aw'BZ@VŪA1}z0Ҵ2R4LJ6_h"x$CmCw/2NLI7mڜ{YvVOS4y8AF ]coË_U |8/:7ѯ\u$.w-.8IgV/"vSℓw"}C.xI9z9r>0[n7t:=Z2lJr3NJ0ۡ^JĽ>%c`ٽ^x2zC'ΊwIBwYBwi\J=Rh_rʼnfB=pg<,02XiYX侘~ivlԓ!METuxQ%I{ fpߦ΍&쳽S\=նfbKrY ZD\K .b:~7ǩR'T2U7&ՇJI#C\ȨAq#ۜV 7G7sCI/ (X+` <#v]lG 9` ,5;P'5*Eu@eֆ_p~t(cV;/@ :PiC*~"f줨:|ɽ{=/O r kiR>232S6 B5-oikpTdԃf@F=0cdԃf@F= u/^ǯ:~'{I#m0Ն>a;>bLy'=hr:_FQaZ}.̕Fh<x9U{R2$ޤ jrTZ0o+X=TͯOQ#gLkLӇNLImev[tl"/j3*+e՘K ov,/r[v2%VRuM*V5 W|l]з fPb ˨TNIR Γ|Q5=t !wD$V1HInMYF|bD`/rקDsOYN 3- Z><3ʉtfjuh7$0XGz ڀ9Os1Beӿ`nS&;d^85QFA<ꡙ* W!N *5*:\q4Pf̮ Im.xlFpx{ur5 HܲbԅSIDgXe\نI*ޝVю[? @R`R Ũ.=.3{iQJzu%qR4LJ'eQ |uZW$f`DGu&paP8Xf><|ho,4~ O֭r<ֶŤ6,rJD.;` 0Ewl4z!T2%;I_嚊՞OFwqQ@i=f&9[nDLضcPdɦ+zR" ]a0Dhr5}enҶb:֒kbX<ńИ]1CK9g9XnPWiA'M ,!zA9)&+U,(Gu{x_r1R׭3*J<%t Jv9a#ư[:VIRBj@s7Uoe?M5 Kۜb92{+"j|<y5 EE9L#ӎ) 4q"&N^l#B!o١Q禜N"M3GI;#8n) o<®XW:X9=KYp-v5 +Q_![q ?:g|tձq dtIs|yT,8 qh !K6@CU;A"H P Y@82͚,nno7=tޥѠY8}ѯc Bݙ(TOB0.ʳt)/3P[F$2¶ Q ~²H.C`u :u u,hWAHױj, Ƃjܡ;yGF-Κhtf7vP0n ]"άAXabb&ֿr)ADmj+] J*]$a=̓lt7ܼ7 hWU[%% |?,C%b,8* oRZ`J,,D&ηttn)V~.ǗŤm]ExgyO0|%tlq{tI aIt9&JRV̓lȣm;F61d l4|yОvlIFɃ&|-!V~BĐdCWd"HZMk5eSwoo/icT n uUgNc4O5lo%/Nj1A hI G~(x|T2Dgv}[7Ct&Cb&O;='ǻ(v?QLV=""mg'Do$v>]GpU'A nHkvg{tfL$;d{Q6@.SˎBcCƹ>U=pz`'ǐIލ0@ߜӑUH ^ӛfO8chdAʏh-)"(lTW绠)lu0\krC$.~44K YD$u v9lހG%ЄF]3w fNҬtp1g|"O%ot(Pt1AK?q=Jƀ0ِtc &2$T<uP|XV& u ^sAX, or":% ZRvƔt"RQ,fw=]RMSl)h?ju )k!IOF]ID[YVQyi*DtC{{6a -BXIGö:;~d瓧ۍS?Ū?"^7xKmP-{* *6CqYFE!P3NL ;kxnV,AM令W8v ' Rm߶-~Êᩨ&{ =)`~ͿynB-@ PQcçsK=\#@Z V jX-yRsWcf'uoc@M8^_3>%r&;[NePLݐ˩%JK@]@m͌n@nv_ˉR^(Ý\`dz2@ A(_̭b"Irr5SGl(O.nq\ߥZRwo!]E~)?W1s{RHOey n,߹FxZ ۂy𻁼 }2/=17*NZVA<  QX<22HbXI,onEeUQf!P!Uꦯ1λQ 9](:4_U{*>ߣyUqwyW8=8f~cz=/O kr2djbX 4LK:Jit[nV`ؤqrTZip+X=TͯOQu G|dqevKKX+؇*Ig[6M"<)|N%v/,#0,oj|;/ݨ-)Ҕ35{ިW*Qc삾E5a%VbTVgqD0<'4_T~96Cȍ >%8r+~SV-t, *y\ :wYLhd nS1sH'vxYGOFz!O/^:/`( -ј~ڜ*~%:⼵h1)oas #+2  FȬBya% ٱ%@O+v!(0IقwOT5fO8ObnZo͕^RK_w |#igݰ9Wa/3W ,w` MsŲiI%?$z*H ?FdӠ-@>luFFj绬|"Wӟ8.+GEw=~L!lFA5nta瓥ol/oK&ގró~&7qm)At)M Yk[OTSX79'' 徕?q1or5}|{eקc7*l;\M!WT[O,!AN߰ocA|T5kH͔ dF]jx/hGؕ͢a,#{bKEĄO wq2"T QY뀭xd۟?2aJ<oݜ~1wC7t=I~ȟbV]1VzT{08B+0->*4{U0<Մ :cK/$Cx95>-[m^qu: ,Ɉ2I*UAy X#k{x Lcԧ z:xdA:hj1F&u=F돥N= -U,˛}0|_\SđQHF ߐ.9^3TΡmLnV| 1,X V <|+-`_8h9׭1c=2hces\T3XN< 'ahT 7>}RaJiq'ZP?-ʞsjjeu(yt*V 5K%kA Gc&|gݭC'buZ9mf{phFSꑶ;鎇luW7Uڈ9&2ބ Aޣ_)HaFZ(1'ӫVzZ/ ^jz:ǣ;>TD~#i 7/bgH!N(>zCD'}Q}IvH3G.=q_/ydݟ=n/[4'#@܉r잙K-// _X2P'P?+(J4P"'OnDx %،%fЌt)q3$RR&^ aSQd|`a9~. a{d *E;0ˡ5!8ިy6H=䔣eR@iʝ6eq;H^չ띂,!:zf_[ /8 >}QR/( JqGE)^:ȹDB ]_9w8s;܀qV50~lr|[SF"Rߌ+T$l68Wo*l'b;k7k%`\ {P=`9+Qs}:.ƾH9 qɷ;%M&EpC2OΙ95CGqA_׳gɏ`4g3I8Ɲ!⥤.Y2-XaؼVBvmˤ5b|y3~Ow͇H Nl𫚿1TE+۰+۰SV٦6|/Y,҆H/Ɯnt~s@L/ǟJ]. I Uǿ.>qN v}[r#XM"1w{`)e4:<#enq&7( Ñ&<X:\Uf}borۯO[nu[Rcջ3)v>2_$lt((E獑,>$ $2Q-&jPlTEq-2j1%ҟ^D{ d#qw+9 uMh\o@իƈ|ؤ<J#9o"Ki6`X+J/6~kO")+x'qCx^3Pr "h4&a vfz+:rGh( %rw.gD,iՒ=<68"â>=gG8vO:%-(R06d1Si扮GqjbjsX(ZM)hju˞tR2WʖrU$ʁݳWNɱ4v{׏}>Ƌ\Y? w?u c0 TA`0\;|W_adG0@\qY .@\ ĥ ctKp C sGXl  _j,tӫ3LKalF~A(-k `46!,3`50cP+X(0m0VSVz_0Vիc}=XqM2FFNg@hr:_i2\j 9.rO_/'&pI:)RwŧnMUNwJx3bfP$TMcnjE.f$Sf J" uþl? BԑRcX^_ rrl>O7% ,P>l+)5 ?tI"vTO~Mdf["2ͼjHmI};"]o=(nyho K^BIcۺۤpPhXi'):PIښ򶪯MCQެ&Zb|Tؐj3Gu2 ucxaß!)$Nʼnv8i/aYn}fv VOCЄMu]vp`Q%԰*/(79Qџ ȗDJ?ބ{Je?>𠆉HD44} k忒+xu^ v@oo+r{58{Fk*O$/x ]9>+J!+d"<:4ƾ8E95Ktkj5¬L.v#A;VZO2g) ~jWA/\EO-/P\j n4Ml|qT_U⣺B 0]Vlݠ|)gs8,[[WN]lk߬ٮJ~JJJW;Ewmz8mШ(4!W+0%o娟㾃(hyVʴ^L-S]6ޅDm"Q,s F"s3/:].hedUg^`txVY)@ ^ ]jdUfAm|PۯHU[)yݣæeTt>h7v`8Pg`A,W "FzhU 4W]աQYi 9#8TcxC nK]/Zr-7>SI\MtGrʵC"f6ŖQ3_ls;Sl=vΓ^Wcz+Dpأh.Xnyc\g[ĒdWS|e`@!S3#!؍ltΚz?!뀵UY tlzk2;'ه=$2)LjGu(sÊ]}O-{n-"umH]Ss^qBշWVqLMPŽln~_l.ʒqiXs\ݹ3 4ePP\YN)YCbScwN1a#3ӲZVHz?n,]N1FynEZ4F՝&|#`un:9~Myp/ngS^$p pE#O8|v{1m7ͅN)F 4a]G&*F4/=}1u;w场MzS0DXBɰ~H71b%mez)hj "q(l"vNLq܍.[-oߺޖyT[`̕)&O n(vUnv_ Kݓ2u=6L/|BqMǍy( / UKë-$AIpv"ya'39̽=y| rSXFlyaSX,3ɯe2LXs{cԸ$6S@d8M.]nb e^埔p}f_;Y`W0icy'Ke 4*\x?<ϒ*s=5"NJ]0*q&9.νMJ~Y<Ⱥ1ևO¥H H*rOubT{.r1`#Zb~-hd '[&[Ӌ %mqI'%)=Ju.O7,ES\HzX8124wJPl&żt[& K)E!EœނeSuZz*;O*irP;X5 ͭMhTtI:Y.e pQ B8C̦1q2 LRvl)0d"mXfp;_ ; 3.:zjMfxX:gf ںoޭzǛue#A}QҶ2=Ɗq4<](`ARZ̭63sVUkUd5QB0bZn?5)BF #-#@gpoooQxbr0,[MUs6s<u| $Tc?0Nj[J."e2jvFQ|qr\ϭd*QM儈?`צ7yI+%~qavN{Gg_j :~-m- LKՃTs- % Q5U=~q7WҮfa1q0K&?6'd0LJ4mZݶ(J I1R͑$*,ʕFWBXH?op(t؅<"#I=Mg5_$dܑUT)FSY8NRڬ^YEEH1El*.JbD #0qY\)PX,16bc2bjdx03KSzٶfMflSrٴCb:'gI>QKi1#zaΡXU"^RDpFQd TTę/`͗H/Pv/=$rlmb-&99vq xM.~eQAC:5/jϩͧ'_zV.#I(*Ma'''o+xi+aH3pJzSl]H(z/v҉sP8v%w|iZTaR 1o)t}=c%T%ɽr`+X /3xrXeŎwefjS]n'rI2i&)H"brx <ەfʋ `?<17#VnE;%w'rAMkq}B;XIfm|lN jn4عmm?;TVPɁI؜x1iz Ƣ ֥zo\s}+r̭ȊSPTcN5.c6Gbܝ&TXdSЖ(U`Yyu*Ҝ;iHzQ zqT/3DíN7f vB szxn|FYܔ&'xb+C3&$sip¨SSLDE!~3%{z>De_L7>wRRo vRR|`ge܅fkO/U]o1~U4\e@x'v~Bw<ɼsNPcy[eڗXƺ@cz*{zA*?GPꠧw7DL9$Wuc>իGgȞh XfH--+a7nDst$"|_)9wx\aIAO@yT@+w+GgC?H>b걃^e=qw}=|O l$HFѧ>7_6okru犄H9IH -oe0uE Id누CNq(١CXTY[VwKڎ/WпٷIRya>U J"$aMp6lPWN=Ԩk̟g\gSEa暿=ql3uL~)W"\Wz v V2#-+ Jf "PiT 4ca?}n*sjc̗pb<]oRA9zu43[[[8e'|z=.ksdiyooOJ Օa喓 WBW=dO6Hpd$@ņצ6f 3f}n e]^NϧNEhG,ema˺f{S:0}鵏GUtg}&1Ѡeos+ٛ%-,c[IkkA3`IibUF %M 6m2RjŷFl皰*.>gL#$H!ԮzmNm>ƦM 6)J | Wa4=2_8̱l6[+E@RJWvQٮewLԋKŬ׷FGؼ}؂P]PܜjȢ)?|+"vQDC*RDx< }E=ݸCސ[ puzʵ WgTd=%)զы ׷ [@#O H;yjVnUT5PT*nUkc|Lx6./݂C[ele!A9ӸCuelTt+!-l K EW 49 yMkPt7r-ĭrUxہaf]S10@{@9=㬚:.q3{EHtqP=^鱛L& ) Tn%JRI? s_l* E>}-JtmrtX2D]x:TL4_uyw>ӿaͶhH<4ԨX1α?<))m햹>FE%줛G`*XdH]p"β5>Kvf~B_yqJq6_\57*8cnf6`M.W||U}qKoc~[v8D6{S\(n+/e\-Vݨ eB 3 ִs0D*OǎI4e2]; "}޺ sZ2|a$gaW04yf &vrS5 0Zf hXbO{x׾,QE:p)ݿjtxQe@=I@iW~jR0=G+xS|]׏w`ٿv'|ɝz{l~#+l>uX)]%ؠchݪO>G')u\|Xq$`sσ>s *57lsV^4S|I͗meȶ/ewSyV'i1VdP)ib%ML~j'+Fn#AȠClnnoER [ 8^@HCWc1E]H:HSI1E|c1E"uxc1E"u̚XYcjw4i4ڢُFkvcgnlqE = @E KOY-W*r#kM~O,AR2 {-7kpV4EB"מ)[U}>o:uPz#.zRJ"9ɤ+]cOvKMZymer8`ܮIM!xNɝ-2/2.Ub,4Y8M=g*o k5)$O/ZU+8{.o4JŇI H3D*',JvXՂOJ +V,Î;g%W!s*U+f?5qMQoԴl˨Nc&-9,=togS^!F~?.`އ|yWۋ%#u*U.4pi \=dJOܗ-`qOwҝ*g=rq~ɍ\dOn19OE`S}b<2vS8+Lqcؑw er"RwWg o%wRWkv6?iOs9|kq猜>)H!pm^)HʼCGR}djt5Mt'pH7p~j2V[qj4NKbur͔E"^aȰWd2D7fgس۷n?e!Gf6*z֢!(|]"4gGj睡~YWΙdr[.|h^;#zgZj%u7ɥU]rw=Nq_.5L|wVz%%i}&#%M q ӦҴEЉ8no-_;ʖMlG 'to :<,4r_CN r@s-Mw )0âuim QS0mTk1ͫ<@:nka8N5֨1*sUY/,:PB Q-G:p^+qαH́?ZbLIOo(A[xf0Ky"a!1r& i'X<9Ҝl}FGfaaYTEpJ xbr}r.  ATE2YwDPCZD -.2fm q}#&~bvL(lVY,W8{_HSƁ}|i:ZKɪFgsx~ o >"-Rg W*  Hr$QrӅZ@bϓiNORLDrz>@wK,!iU4":R+9OM쩿C2JL7;OtRR\ySuagOQ$eAg0N>s2xv\D _ )nחR܋hnf<{v Xh]ܬ =@Y0M`G-1CwCdSyMN$r:Écޥipwn&T&TnuDFH[M?BvIҶ#_c#g1La[.NKr,,HKuk@fb)gLFtĔ(q=LaxⓃÇ)h HC9B -'u0c roL}t0;s :iLcg򲭄JrNz45=-rO^imH{~qT/J@m>gELɸُ5u0R{l~aHE^-Hq A #GV!:m. UUK#: %| qVB)2??42=H^q'!NJ߬GJ_үt~dH2R$)IF$#dzcK!콸}(F5D۶фC&_F^:_'6TT7AF]*7ǏXILJtnG{q~{]e[\@wגuwMa}-2( [|4& z<4+,GM!{Ms0_MBQ@HQ$~sWq~n"5KFj9؁`]&QeІu\AEg/m&ٲ ӅC?'J|3"9 hrťLlvʼnAp=Mo=~ΖŎ'n 8 2ym/"q&q7ȑɸטI,J Pazdut͊\!Y>.[4H#_UKՈ׫cJ512oBQcnDG|,YQD]if8+FD ubDO<9spή&H<ħLK $Qc #L>܄-00Hj7!k}sSjk{=/K:(NupY{x~UPwQ&L[r9o홟*,UxfAj FRya % ٱE hzBIM}W"АPEɨapf80+CS 8oT-y[28B5ߢ滞DDtWȣ^2Z PQ'\a~y(vU&磤4ꫴjܫm_C L>!:ƳOc|$Z e)@`8آ7 (?7v䴞6]:q,=8\룽oD칸>N$>rr̵' *zRONxv3wrq;gqQ/H'G3Zx B5Hqw/6#>eV :UaVѸ}WyO%֩G1Si(Y,K>ѕݔEtG&M4$*(NהoLUP/Gtq^6R4uǐx~#I/<5O#QJ5{ $*Qؒ4)վr4|,GS@*|;2F.'w%9j0':2[HΒ&QLr($׊5KlZ%c Y&蒛&@蒛&&&3Bh0́&!8.QO#vLf~N>bFGF|y|}{5h%^լx/ EL4#QLn(WdqoZÓĄ]KO(cul$L~B0ټ$»lO7 Oaadd1 cz\|(x@rf9n+ҽ#*IԎ SjG*qfb@'=C1Zgb╊ >Mjio{Axأ֚ LZn pן0{GZz as|Hԍ_r h3GtPN0|޸n%Nd} X|>df@h eWertIi?T57Cٚ.nm #4b?>sVY4!RH}Tᇋ t]qpص[b"faw,%Sv-Z-mJ6vEy>rXހedªz Bx/23Zuwz+M{&P423 iv POQخcO/ߒ:f3]4b"Qf 7apZml"6h rX2vDFIϋvGqq)PZzZ!3"9F˛bSb(ljye_J}aA{*׉ i'I}=H6Ĺw4)!OM_.GT|e~xB~p`>?u Gy4Y#2h3ޏWiìF;_5^9ՠub _x]9G#Fbbe$;RMxO4oF;`.'5}dsDXA fU-IRlhۮ{T ͔;O υ ȤnݘiݝXiOy?1fcQt?\%%'6*%* g)'&::`- X%ޕەw} bۘ9$. wEkբw (̙ V<_zi}{w cx;n L0t=xiIHJiFSgəP 7ůvJ!t;@t'l_M S(l_MOJӉF|VDeM@@R=f(Y9}9\0}7;]h$#A0($*6>\˸OjlL.b¼<yEE)ѠYҡZ+uFN!x6W:(RZ7#bWV8ssqNry4;}uJ|J?an *lEtz5=$ăZ.>'㿧p6p]or>]&ie%H^q(+BcMJ],$6~±95$E~>8K''۞TΪ~t"c:x'ky+=F҆xc?{!''4tO (u.n6Bw07֯I$Ż#=)Fj^b1/Im,AP?aYIwtJ/i|uc  A:^立: hwr y"SW$=ꑕt)Gr!vdRb-s+*a qrGsoU4U7:DJ.xNʓ#ݥyv^DMncۮ%9,(a.,{ 74'&7 eDoy>w&u};M]t8-_Z' -Yb(\yI?34VϦocŚ>Mn[]6eDnq!Pg^ a[K0k;lbz k#N`$=!HF3͜FGx9UN)?\ - ݰ}L|oOlVҜ-y"O]2k9:yD *Z bXC?Rf0NFl DW# tEnyBmf SR ^gwҍ5u,nyqqEOt~n7CȢգbN|O-14471N̏o"g(٥.&Bk!{;Fqd;7%ŸH}|KՓx@[[b쟈c$gK})& @\%83 Og>JG0nW\ErUEz)f.jZK㫿&.Hɰ[Lhˣ`Tի q +/<*V`p`yp4ۇ 4qP2:.A!Ju9ޯL(M\.b|XGpuD:;?fߺnMk@-oiTi9G# F,)o JhJ-@'Ic4ZgZuK8%ң8D3-jݮKaqQoL^kFu:XkNu;%5S/H|Dr/n/&TUhVvs8pސ[^dz{_v1\2i/՘cS"pfu^*{NpCЪkީFRQ?$}FWD81N0+l;^7$sx?N9 S@b=:ڲ2oz=lƫ#8Sb4Y?XƩS,;(Y{|Vj1e6PB|ފ5luv={^|z1@<t <\]kc{~\s~ `=F s~\o4:^i٭VaS": ֆcNi:uNûg+mEu" ߻SvN+QZ f/\ai@A(]q>Eqxw/s]aF糈;gYh=Ŵ3w S糴Asp0hZg޽ :v!`kيc&쵤@:Z_[oUu}o}\cߌDr1쵤@:^_ 0*N|oo;*'+2ݼ ;:Ξ;uЍΚYQ7"R)=28g.oߺGv9;PFOFd&ȧF%`S]nHQ7》9q!9hXq `q]7<GPxU:1?_I |znoSK)6)Fk "I"Yn0dE|U]s)5U,Tf+J@pͭ37\L.Ƿ i"r6Ɍ\Jbv'>G >}w5_0$U+)1R9#DkqM1ο.RW6bzX֮[5RؠՓ9O;{6< {ܫ|P/h0 N{~=ugij |k#XBl\-)x,Iا؛v2jtd,Z#,F5hh k+=r5B"DrGHG!*Un YnΩq*CR`mNC;?Jnϑ/}8?;F|#5x䫣q!ۃYdˉ[*tZݩ eZx fLP4K!P) KQތI#`w*NBJ5>iHFy%]FT043]^ʨw9(i\ 48Pʑh!} )&Q\A d^ӋVCPw8g3|. QoQI@9YMqG>"M~7Wc=ϸg޴jyw|*RmzY!l 3˒9)5Bt#2A  ,Q܉DK,!=7Vv^JBG.QeƤ,,9"3u_,&'IbR!{/oW a. ?0[\6-Ҍ-a}O(QO Վ %tiF*{PSƁj U0<A&P>d}`0Ѩ<ǟ"v!V@Fgl%往N~H,||~` LT u(eѕɁmŬOT/Ԡ[֫Tׄ|!O7aQEb neURXEil o %]He )E!Eœт2RuJ -#’ƺ`nAw4doϫn@=n ={I-tأ}̬dgW%5]YYYYYYUYa:mJkfdKɇ+SEyg',8W3x`Yul0`" ʕ xylC;vV*I8qNXYU"mquNKF)j*Zj%ƌ+ieNTUQ\F.!ARZ}PiqK0 Oi;y`iC 2I2ͣ}VY,{lNO೟E MD,GֆX\ğ)WHKm+ |4-dZr@qXGPnAi863Boz (z<9=Wo9BYh^U6ksVu5c!(+g$DxQ .DAS䰈hqtDq(a ֱB!-`;h!6|xZ~ؗm@,NOk1쀧߇|>K*÷o~+i%kb߮ x}/bSR3|>9 !זWPi4)z>37TXC4Y VՠsO@;gwHѬ:Lh)An&%w[ uUgXjY\*YC:}Pk'BRQTk6ᘂD:D"Z{LAt{ѭW4_Mh:$&:%^SOjItXy W|;32<5Ew`*x~@ %.Yi`t1fCSwX[;Eqo6X.1j]֞Q+QTb;LwfrOà#q1rfA}Sե f)&&uNQ9V<@@` oԣ|4 E iSINV^i_OEp(X]Cِd9\/hseŠw8<5~,Y sZl f7ffxoKXJ*m B&I2o'ɼv""IZȗ B񆪗_2]^2yP2 x} ,ˡǏC:@=bIFRYjoQ;AE1Hk@ "SdWpv(a [4(Nbm")k !Z%n(ʂ/Id huL}/jǚ0(IO>{}%bMK`sQs>o왊ĥz.6(Xhn<ʋ&8){ 4_&ISMkhJ&M5qWiviq.}NC:w֕[z OZJxJ%;)T1)TNsIVH9,qd_ 3c< 20]p#i3}YmryOt,=U{p%\ EJn;xF(_|s9>c:Ëk˖59>Op:3~IrD*Ռq.kk-: ~xS |͗w31, cE,FDGDL0zx.CK3t/<7,;9 %둚:YɎ=AS!bH\J52D 8b)Ny95wP)}Vz83Ft]uugUKJ,$diؚ` ZWGJyъu2>g:!ɋH!^z<ϴ?_tT !&Pޓ_qÄm ΀:,h\h!"O7l7Q!Zgua`W/C;;1>tVZƨ\߇puGe24***'E7rd HUxi҆ I兹@aC .{hX>(R(K$îU;0:RVd['ټ>y]eZ0G*b@Lц~e- _ٖ~>筤XP2[Dac,+J_ ( gR|Vݱ"=&OH7^?Tvp&qi8-5i[zuͯWهO $HYw,n!Ri[c>꨻ފM!;;[X]$VtV3(d&2\CpVsc—uiwAnz-(}@@ y[պcM\k[qz:/z:ӹxRo1\sMPn=IX6Ra}u WӌӺ h0d=gyCqUU Vkx/S,)"EzuX~~V`xafk)g[?¬_Vf'N*1I9"e›(j'uO5]qmƧ®9EykE#Cm31BPMfm(nY\s(`c  f/9右:7r>Rd0Y#>^aqUœSX@0%Y]Hfx7e |(kX9 N !_XA+NXNP\¹CfS\H=2PJ'KB7Xcw'~O&hoWٰj* z[i?J#6R2W_iJYAV[{*y[r; 7k.\v;FsgF^o ?0'F"@nbXP:߇)#&3X@-"%Ζ[ݟˇ_|)~ 8E&jvɯ|<H26}Wl&PNNţjT:ţ|RU_$c_Xū=ϗbde9p$'2NQizSE>*ADI)I*f|oOv\I#Jw/ߕ.M A=VhaP M6OJ).rD9f,Ѽf.0;g"?R8ЮT1L#KZ dZ1,8 fK(~Diz!}@PULG> P]eJSf%i XZGH&^%f%0'u0ōu1m&^@?d!TstS= Ž%pŸ8XR͊/|WZ̼)HjiĢ4liHmwMbŸBֶMI̦C!gfQBA_:0+}3 g^<2V7Vn.wHJ_iA~_9͡v "\wy%2V j(u]U~1m yvv dd+'hʊT^ۂfBDdyq򥄆F i%7y cʂ?9\¡d]bk =,b {>JC7!eಎ',r1;}5SE+OsgUֆ{,ݡЋ{Z()mӋ#Uemnl?ʷX+r;F?wzhP:tq,ɶ* 6P-|2gprR8vH86Uu b`Q0 ^9"b~>P015FyEĵla^P/)3Eos&/vjoU>ڝfhEoi .EǚeR݄՗&z>Jqܻ渠~udbSKy_ofQP`}J$N#2ylbGƠ"mCa42OuPXvhPa)/ekYlў-8'MLݔۄusޠ]*(:U4} x*p;]o@?s fo 7͡0^ښ=w)(Aok`_Fl~_rpyaf\O?ѡrVN^ƄGŮg;7P'G'?xC t~?,bS)Ÿ?5'cظoGRi&Lt77ӷ:A nD`o.SBܾ4-d*;*Jj$yXsA%WM~9xGL~~|[*֣2CMRee"}RQLC2x\DS/Fl{|me pvp 3JnYSꉓ%oٞ6O?-%x\"@8_~t**֍_3(o AR(]'9 f|/)}!0l}XH hѩZq]}8tLvy) [+2=YΗBy)N!&0#@h;rĦ"X O'+dCC jkwAވ- 5YeZ.2}+z fPhPk×/o RMl.߽&,MAllᆪCo\U2! R T*|U@"J-ndũMY? A qv0Re}tf r&y#j ,8_ |u*/g{~F/.%^3eI{!jXZZ+Jgw[?->kw nW爝!HjRRIMlU@ O#㊠ghyա^7Nt%}~^`E=&#B. ?*kU˕볭*>n c*&iꞯ q)&*S{ `v0"Ms õKuZk@y`gyHP|f-7$JF8>>-mmmc 5m+,\s=!jP2 jևQNGb+)3rۙ@gfv1: ]Zt(ƁpڑCFz<П?jqI,-|oF/0ௌ9N7dמ)Na#V L_9"ԉΏP38!7 i?A7t?_-?@~s)вx`q5 t( AL{(=kfcJCOͶj}p$B7k\_QjIyh,o_rإ<`33L#xW(E)qe),GGW}#I6hP1% Zz8uВ89 y OfSZ1:8.'ԣJ6X "N+'"&#-`{T>V!n%t 8"Ǎ7ց?[oN'&p6A0]* !IxL`/(PMvoFj_vվUվ-YH>zXd(ZZ %mR&ZjT _)XhwԮGI7|4gk2H6qi0R&|`fyP r,0p ]/ѹѯ/JQpU4.gzHV, kyKTAa0m򍹐$0"ks )*D򊞻w1h+Fxߴu8ءWysy üR ֟lk'st܎::I Lbc{{p| bN ^SZe8Ϗ& \azY⍖-,Ӑa_8+30#͇g /1ׇ^z/37!⿤i5T!NХNH 2Iu?"3p3p3p3alxGHt` xx:qwD_6nE<؀ QZ&xzXU)47IcS;c zͧݷUmIۮԥ`Om5RJW"82 7(X1=33MM ;Y'5D[+x2JLK2;d1Y0d`? A_ò]͠XQtM a'_uq=۠PX UCYI,NPrñIRz!u-f|\Bw~CG'))(^G x~/GGHaF6߀M~LǸ?HR{2|MlǼ {\C7IOyƚ6aQ? ~(1GU@f,X sX҃t5ƞt,,$:X5)xƩ@7px z6Yݫ*}80V!tjCJ64o,"-rb6>Sy8H#|DoOvhh+Ym:Y_pvODs $vJ+z}`Y4:k;%$o+uضSr{ScDY{6rT Xxtk{OI,PYYj섩NoS*Ýtcn Ӎ P3dZeN#Fe`0nig ֽU\D"UxAknxA 6PJm -;Q\W^ zu^nmzlo_ۮkw"$rVoM;M׷m,է;_VVv}_߾끾oM,è=LnҠ<wg:u8íաm9= ]u4u^Fè:Q{8x2n^ݴk{m[3 8S{m~mSڠkC36^v졙]׷z[v}}îWIuN {T!~GE 㛀C;3!'##F9&r;EE(D.b45`AQ@V:+r7x3!w !w3 yj˸[21Sq'xKfq "a :ɵ_y /4{r]^Ą  ge|$,R9@+F>MZ|]Jw5d`[wK*t!7A(*emn]'jOn{f+^]ެ3ƙjUYI3po:H[nh,()*]* !f,WTr*Jk9:"AۃDu;axoZ>y M RйS劕B\ ?m` )N` O5C&3TacN-mDoYQ^I!ZzPͧ3jCH`mvavy!0ʯ 2!&!tVjB,bbcZ>Bm4%\*`: $th3l>v/J89 x!, Ȅ/)%Lºq<>'R( (Ȥ@< Cc'J<lDS@yIbuSEy| 2A)itꀇC~RP<~4h@x ! ZJA )إ `vA_PWz }l$CiUKCLU=M#ef)G&&u1<,C (p6˴m3ak] O܌a舺Elu&Ќ^mu :|65$<#=HCI4 DvR_O%Z@4!EԚa@GUSV= tT-(҈:JhzYGQ@vݬ2y`9?>=,b34E(+xfȜO Knw΄+Y'Fx M|N1+?N1kAf!&0;-:㘕쒐*軡V+ K)q/<fF6@:vLle: _} S[{cH)rz\9s>uL"/ÿYHc_m+Na\P8g+jgڋYdv0j:] JF9X$/vdEzׄMXIEK@\!+uw+W7BNn,O*0#i'aChpD~@Bfp]LC$ӲB-sf#lHBJP{hY [*B2fW tQK v~/_\PcR\{eK[r)3욶3Hbq\:P+!@ֻ]9@% x*"7/( 0wi4a㇩is>Qi 8iϐw" 3%d. ƔPrF{/\//-II@> NhE7׌nExG^'ռnrB`݃AD;U9e#Oh$zzqv|YL|&<\pq|VP h.^,b<(>ÄKd7%gBPG(no..m`ƻnHj]&H15;jbJAsӑܝX7qԓT۝l]"OHbu+5[fL{aj5AI< -w̉+?輋Y!:$'*A980|nTfq<|] (jBl ?L;bKKҗBTؗoO\ 0q=%:{J 8`qXt8 b"Z`ik f/3yͱW-q!5+N)ֻܽxH&f,aeZoĭ( gw4+w{sh=њ]PVx 2__2f9:(JBYAx{GiC/8:kW CkywXX)g;I$n'ߛQm6$W~whyID2nrԭ___BrklY  (}|HFC1_5 *)+Yٲ`4юIo&Eſ'R2] J+xY>^0ē-<ԝ4K+,1vhҮp g9waT/^½ w{0ݭ=cWFP%o>km۾q/m_2=Ю5MQЦ-6}kΦoB@Stb< kC?FvYai+7_oӖ^n3 =z-}zm&nĵh7Q_?,VQ(6nw#v8PCv?Uv6= ' ӿpv+aoc.LxM\[36+u򟁽Za?~rOn&Ħ7ijNȔ0 )1~n ';F_VUq"\!3lߏ>_aTxd4vI$*=$ ҧYg-Czj̰eUηFqz )8v xW_s-"*)%=˔z_t39_o5H!l98`l|kdb2-_'>gc 燥WGG?JWׯ^pX:*`OGZ,Gs~A^{6?uڽGfŀ & |e|WtEAP;ܣ Ȼހ.rfr+Vp]>7*{Y4ᑃ1GPQP賸h1|i>Ue1]~axsr =KQР\Ux5^/)O7:+"||O1S9M'IOp`=YA1|?g"+ VXNP(%hM@gS~dFNn8w7{y(hdVv5.%φ;"ȠvS|3|}̳SJ?#;(U6ϛؒfEU0HY<w۹5r4Z)2G7~FIĀT-ޡ0gLNtFLZ,e2bXr˗/OUq6t0hDCuňA@BydryTGyTjSxai*j! u#AA _hxR rL)WTw+dQ:/w~jRO72!ӹJ٘^XBJ[ȖY xl @[ d%MGkHB?. O"\~=-,>g<kEk΅e Tb,D}r0;frS2w0E`SGH`Oy$ mѡыr@*쟘)4IKӦ?=W1KgP|o:9}nPěJ xvr6(IN<*2u0ađ y!!;]f6&s ZJoj6A\p#žQ^`i-wW^ēxڊdL:Eɴz$ bH ~|DO$m#/2A_pTs=mO\BŸ7$|İ pZ#{ZvhrP$>Oŧ3U&2:\H|ٌ2wtEyUt8Ģ4lir"$q%5HP0mљ.|-H0:rZ#~Indڝ2ަtYd}yJ!ɎxoD21јFaf }dF Is,`qxDVmFo5jm0z[[^nYPmpk!pitč^nߋ"'EIi^emm>p7ح|~mߏ"'cЏDe}~n4:uoٍ^Xv6tQ{ܑl~61&n6Gzzbl͞KV[pA=pii9h{ ŀ!gbf'])7٭(JB'M5-tV%3(gzNS<=ՍV[TyYֶ7-h|hQM-t@U{F[Mk }M޺s4͡ :] Y oQUOdXc%?;k}@G7zƎXgkz~è=\gIvHw7Lcon>: ')0 wRJz"g+7 ΞCA-ôzl=2f;VT7n[ houSf[ިo+Mm \3AkÐOo݉nsL6p ooz=] :3[wM;yē'3h\Bנ' J;%_9- 3Vૺ(FJݰ'Éu5n(D` M7@R82~FަQVͽ=ʃtbgv-:@J։cR\\`ht7Ÿ?"##WC#Fи&SH:xv,׈ 1eVaHI7t$Bc!I2`a=3!| $q s1#25j~K61M O^VHko9!KZH měPvlwC)x;S:!xq'\z.h%A GO>{gŭ]Nhxk 0A+쫒#{*JEHJ~pH⼥YO;׷D_$s}X e=f h0L]- >%ݕ+DS}N 4I}a/n5l `R zQz1܋>TZb/ژilzڌb5>Lmz7}؂[/ZԾ>vt(M4KM&7"Pրƈz>6ʵ_ʁǼhl CBa7POQ/X4\˛@4!!_F&aGs)r-K[% QP5HSWhCl,℃ra A`um}q X։ƣ\2 gc!HEޓhNzIwZFR;ta ,06$^~!oWAIV6A*80.Fp@qbɊLX]òlqДO-=\ ײ0[`dJ=>CÅ R4Z:߸ `T'v"\@x}psF|T/y=1,'Ec}`*y PM 7ң?&N$56/> v쫿|yD2?HàI0|(2Pj陸ҵԠ{DY0< %5>µgHRx8C^*>EE&+'^ER49p}Қ QI7e`s[1#HXEjPn4&OԃaV%kW*lǐgXU6Np^onݝk˯x߳4W &?%MZu LoBڐ.o ?=Og Fev-E,fxoz? B>ց4Q()vGGMfn~38/#>'k:_+rpBV7񷃛ezZ*\Ë/JRnbu5<."~!RВ>tѕ?| \H #Z \YHP3U>s-7sTBvP~br'Ct Pp>ʻ%SbQ9>- ͙EũΌNr.FRZmy(-l<fC+DnX]LN"/O/ )eV9SJ:w*2Csn`jΠ5|YoU> \ f´٧a[dKQEfX}A_Wwjt9:MjNP4`oh)vz5]p oPw14ÿhe%}7J*\C\\-7lଉ&z@r)+OV[,3Uf tELl#/0mJEGƀ"qvnp |1$$u^ 0gCk >C⣦fR!A]P%EYXت|6@]kV ۭ4TRcJ>4!"'&`D<\}mjב sS{>J5~?>🨅d_9=|].-yVK:y??4x_DDקkj (䚍W|5T"HAPW4@sjǞ~G`wazAO3{MB+]/9H(YϱJiqfDj*9L`|(9JJj^xN ;sS%Ip` m`$B67NeDa3%'aS.xhgô ".Hӱѡfptb궊~+"ƑnZc1f Uɍ n,b'^%G-xI«Ge==B-8h"OSaS@".Oë]|פqA HB"D۲5C2.T !N 8*JXNG5ױ|a9F2k^ORLwhPB/)$5Uirif| ^az7nVC@gMO*:HiN pfEjHV\P&sM:L":)y~8m-J' l {YVzXe-\zWX%.'t!M-)Df p-(҈_O%Z@4!ETx%SfUM%Z@4QTVZUO%Z@(z a++c9 aY3]C6fJPk*WN*I .Gpxx7N3m~S{0Xl`bhHz‘w߯2qxaX5͞rIk,16Au|_H7GxZL@1ĎhUa?(Pa'UFX k~V\FT&|u-!f 4+:}7O'pr?– ^D6т]/$b9ct7 Ao41(!m&x9iiYV:D:f|jς WJ삶@3X;xA%g_3EhY G„&4I+@$73I0#bmuy9|4o⛷^oYWn8"ƠaLEۣ| v>ȸ!~VWkK!Z{RrCW @wls{vO_mS aX# gC{[Ț(=ejZ,P֯W̽ >yn(ڃsLΆ6EO,ʑDԴ/ GŸ*r냀^d_Aǩ4fa^NDMZU{oRnVfM ۗ͢swjJ|_ 6_}?سk 8 [{wƷr;BYfrMmQ‘|X%V>, 6(6I>oN'@Ռ e{7h3aJ4~jl 1 q2'x%ܙ>8DN 7vNI*ZO-g RveN7&uD,&^ތbD.6L@{9M^2 sVxc_@2B^:uF og>ct*{5d|FxNs>? ?b )_}b-\ꦵ` ѪkAeSC:K-uOåM2=-O=u Ʒs>IfU *iS_9BE~o؍/t "S6^NZ,q=Nч8 FZIز2_%oQ+0[P`p]3D$l~.ǝ+w;? qOY9Щp H{Ś:'! gΚi 5PP`I/M,╶Tۯ{~9/յS?7R,SH5wi"<6p}5ԋؠIp$]2:$tKFݠ256!Q'3Y첄i'\RjUDANF.=: 灨|?p']}*9 كn-=VN#<~v373 \(06sB* C̋ט_U;R9 ҫ,31D*M&Y,ur[g=Kh2ʖsdV+Q-ζnT1h #;c-mB]YOytV>יv,B-_B>g.[3۔%143f&J-X0 `:>zk}GJX# l3Ii-f(eؓ":boAF\Qy DR,Dyۆao#CG7ín/ZMK* wn rtC9n6y:WK/_&'7>G(pv3Ĥ/y=6xǔ |dCP/}Kʋ]3}+kJ&l;NU?ՙCѣGL` Ѫ6>&jLg0kWMnZMhTg7\#<߰#_g7aƳ 7^BfF+Z? /l8 LCpB Ooe];NoWL35~o2|e;}xq Oor Oo7C~2fH+j{Ficl'4ʶO&Df#~z:DCW=_o}u'VOwSx; w|g ?Uy|G;>Z d~Y/y\.oX" ϗ%/Kky,|Yy}/K<_>#ſO}Y]>ߖ;-~{WvYxm8OKs/MW{jZ^Tx mvB%C@sȒnWDP%m[yv>Z,o% s]I:͖?Y*>qy}x?K_O?=^K(G˯_tT:>>1 I0?|^G)g[?|.݋~0O _ڻ3NJ69/l+0>OݽshhyeP%,wʇBHgqq_X|tOהqMqA3^,+tO`rCg7G|!{r8%b> whk'IOpNf@{ā1ݤ[eFrrEn&EGpt$to$3 m2LU +v5 φ;PNVidJ[i?7s̩aġ}tjtkTE}rWsAa2HuP[B`0nWSΟ=%2`AdsQا10{b_ݠjQXe|rm`z|j+V'M:#xWv'wnotf=P7:W;5h:`RM&/ GzP+D JB=SUZ$@ZLJXuGt9Q0@nѐjMSƶ|i*n$&&)/G4>i>E7u!fEYPnPB|3XEJ;T}@:Jơ)&h(36Y} fW[Us cb!k>xiTo@ 1tln )s#"rp[sF%Yg{f#Yrɳ MhSl@-h쑿!btmv (F[pY<;$ ͫ0yyuZ׼h3\tdzf <-Rӱb=HARB&>i:EN~U4ixsG`L7G^,HʮĿ )b}6 jf"=r+8Y9CXodМz jQ"/w0xYru\Rɏxq-FҜ47ub/\ݴ{y"~/wg7 P:15{.uUd9U;r5Eq &&n$ UwXU>Ws{-¢S~el쬴R:5 ċꚵmP_߯|uς|Z$}}`f12`m?Xo'mԝ-&WXZ')gݙЛFzSϤ7*^bf=d @yxu dBͤ}\n>,` >&+Wy{8}9oi<hw ;"w'岿%Uv0+cs n ՚KW{dIom yʬ  1[\VNЩO #X:ˈWKp}ClfP /ˑȒ[kS i+[Z c w Fǒݍnhg`2?yE!#0X-9̺KRs9'oG <qo;kH-el2=N> œ? {_{%}'9qa*2j PLL Ai fmI%|N.eC j S8Ѧ.<?g`;b7}%5 w`?\|}T$]WY.0P_+2Ll}0,6$GiͰ qjU"״n$ ^o\ꍰFE]O=Oo)- CcD bDw4= [ߠj*k H~ѳPd1 /ݶ*TĬ(4U 2f k40'c Ӊmv\X @f7D\zot}gr^+\%֨l;r+o : 0XOoS:ݚ 6"PTs~o -J1ۀ:SjToS!6i4Qkayim{1y ?ve ┌E^պnZy_ YR @ H>!]f簀7Б3P3s4)I2~#͠@-^reDao|U}꒍?a IˉO-_oAbV]?ۧ諶IM_}{ P>Yeȝ6ZыDYk`ް?}D+.UxzX˜V+&8b|cgv̵$P~ֱg|AM $'M>Tcx5F@C#Tkn,'iJycB+bICc@VUzM1y^2gQ˺ .wOg70Q0"+|b[ "h&̦+dQȡL}V:U? %$&,!)t[IxI$֐T*V4(HylD_w3H/Wo>` ҼD4܋7KI-&)M/=qGO, ƓKdԠR%VBr{(_iSq-?eO>e%ZZD rT߉FzmQɢ=PIʄ9rq#xޠDn^r_Cc‡b1hQ!; F0[S;HT6 Z&]Gݰy-eaCD&x$' *<ϥ1{1nOI9ѻ<)9z=F|E`1Cx0"͟ XKG)amD357o:X lHq#ғì/(D1:Cޞ9"aX |]6 g Vr-&Y}O $2H (\Nacpm'n̔sR$̞ѭAaԄ᝜f' r]YD{#eMHgXᴚ|I5¡4Fa4HmyF(+:|tmj4j[5)+) ,IJ K"VȆ1-^۰ilsu_~)fښ<|Y0 ܑLhZAqbHa`JHι~YgV;%4)BI JaGr;b0O1ȽĹl tLW5u[9l'r$ڴOh 0@S]JX;JIuvu ,]$.J** e5jX<ƫ "*ԦO0ʄn Z,xhV>LJ2%{zXş!$ӷ|1; ~#}:S0s;cf sO/ɺgBcDf|OuhA:*JL:blKCxo4' ox*;Wicp3N_4 {:m Җ'u 4cܤ3ci{YȄDcȾ|"4=YDt |̼f#׊MhPdŒM<}:Ou%~zgc %qa?JG`OGZ,Gs~ߏRkϦ]V&F"J5F*\[6&x~OۗT\ 鬮`5"Rny"wW$ǸbQmXJu:{,'(;&EҬ}MFK]:Y7kn 6 _Ɠ j"fx wȆnoQX y?L@ XM)Bi5wPRm7%'~뱓.`~vy^esk19XlJ9fdy9O4!x!5htF=lk#e|/_l`©-~ѼiaF)YU{Q{v~{AzOt;ܗya6,ٽA(Uբ>rF`,ԇ IH8ZN XDF?ǓG= X˼p}FEA, yHņw|L*&dͣƔhґ@-81u\[u@FɲU!0@c Y}Bq#Mӽ\a w”KO,WFWhnb#wz/4Vo; s3C0f{ý &E#R„sJ{hE{u=SU"f@ZLJ\ˉ g i"[4"Z-_bus+ 5r7:TBSL[D4 %>54%WPdQ;F'auoTz? 깙q0,:􉠥/8sZE.7gg:$RFEk=g<pOBrZ^Zkp ahKT3qXk*n 8qtq{̾BFKQ&ؤy-yG)2! W k9 o}uuNjm&yuhRDtۈZr=ݺ$y5Bꭨ5:OGJ;*Wy!}Ƈ"uO[0E _,H44"'TImXKL1XckZ/D V3\M̵"'b%o:6;ێ8YgOwR|=Gh^m5 .ǩC":NS|(S껩SȉթbyəIQ{Ѭi$P{^GlnCvC śN!_IҦnJ < -)Oc(IR^;URZ[^7~-1޾7C/ ݜ(iChhi׳9nhBGQf5JbUgkGm;m҄[M#hƾdu1 ;Fq6gg7z>~0<u-Rӱb7bLAsrJn>i:E|U4ixsG`L7G^,HʮĿU)b}6 jf"=r+8Y9CX8odRaԪ%1(A75Rv]~e^|χR#h`: 0O֕WeT=5ybI1jFRuUs{5in0ײ/,:WbR.wVZIAk2o\5\;P׬jH0~ړ{{4ooK…Pm$SLCie lo1K%UizL*)x:J]R dз_Q}nJi34y+uO>QDoO.Lv?Xj),r|r:[~w;:)/j 2yρ_ӯ&nX;Nb1,ICuO fr=t -/؀2Ӱ =y◞>fw~= KƻqSfJKb*caiLM wmzDr2$tt]MH]Ҫ]}\ntC+$Ň`L0.˜Va|;OIऎLJ]DZMo /ƫ˵s\QY8$ɥa(Dma w#Ղ_߅]?A|އ 6ʌxqa/7{}%5 Oh?\|}T$]WY.0P_+2Ll}0,6$GiͰ nBjU"״n$ ^o\8FE]O=h), Cc8 bRqvH#,I<3Qd1B%U<9FOЎ*Y*ZӲ /UVH"phj/BA30;V]Gra:a/2J`Ω#DOQWTo$3Q"xwW|)P F˥8itZCG^ b::;hbO$߫$%]h0Eψ \ óx. 73 /k@|9?VyFn?o8GZ,)Wq&rƙq~hp""-^g٤ȎaqPdW?.^yқ7/V۬UYiԌ S'Vnvy1ƣɧ|3C۬^/v(U4Sxz7" jJ ԋrtLWx0xuu}h+hS**3e"o0x=V7"'5y6ƀ;65z|]aڊ3hwaJ`5Y?$+(W`rLsHFL>%/<:xSVit`;4yY PP]ЋXE,Je ER]urkLp-RTom\:H9Ku[~W^ V7etk*<%EYy*B&Fޓ b Oa!r3qKQD %Rw̻"=1 *6BuƟ0(DD|i{0.%W?j"'Q|~k$1uI簷6el#$ ##9x"+c' 1WKCyE3b<]Crl5O="܏?wzhՐ @xgz$'W>Trwc*oAk{_#3j}|]y=&-+mMq$94^pMpF/ ըeݒhsMnm`Op>*+hLoZ7mEB`?"Ѳϊ]ݽ!=5ERv2JOMI4T㢭h*$.v<@L}+N=~~ZS[,s%#/)T''cc֗$~(\* *qJ&tKJ;MY!IL0ǰFu]&#¿ AN;qRIg@&HIN/_XLtb:;gV3;] \$QYj|Af^xI [CL%;~I?_M4/E*-rXJۍ T}UW3a{lGEPIBHsDS m<+ϕ2%-VJnܔA(E`1#;e@ miS 9emD3>$=LTZ>=AB0W_yF_x0>TPb<^L29|n"4H\<=7g 'ƛ%.pTY&&԰om-ؚ{|;HJ"DOAE+7]$SB"z$m!(ǚ7@K&'Q6C[BϬ ɒ҂p.t mζ=W@at}e?TgXR2^OA'pWfʩPR҆8sj'6O1̏6)CG!;@1@ ƥȧ,SLiTNKkB+z#fu<[7.؇:I,=*V&C'a1ڪ3nԥ>:"qg0^JY L vl3`h3;7dq܇;fAtt!;<^E`MreO-IŤ4i~J!MemԹE3N;ND 'cOXl#zլ9#eh!<3 u{ʾuQ(ynI(af%ɬ,xw% JNf}f;[1nl;&w(A4jIQ 7W\cysnH'^%px1SE”ݢ0UsdW},px-cǓ޾oxV_`l o+]o-_U,E"}OG_`(Ja(ٛΦtȰ<ԥo391 SIO+jf2J%5i4, FC4vپlWh}Lđ莾 >~ XxZ{x!B=&OCXAt6hRp6rjJCn EzJsP~4Ư棸޺ tͰ^Oc,Z|t՜Si߫kAlŋ%RK%|UM w0swȕ*7VdZm9yb(4)e^ L,9mr58MAu0XWFL{hǚ3`Vc$m lfM7Som+[O^^j%;Ý߳ 4_zIڙ~:a\"'٨6%._<]'.aء&(0c숟DEbGLz=GtH^Cf6f !N>0&>0X.io{2!5Ifl04ӧ=em,;U[ƹ[9p:y ?BB Gebj#>=Sz!K ѿu4`g𐴙pE;1OC5f벑+)>lހ#' Ų8< #b:~>YDph{+$IU\K->Yo#6l,W啡1 c̗z1 Mu y7cj4*=m*5Fh*f$9^8^;WOKc]x#1>a6Uv>Z,d$>\W_?<b2-~&[}:^<z~xX>,>T:.__tT:.gXy1מMo7ܻv/.M0*I aHy=eWG >hMa#t$to$hAV@['ăZ-D5>6@X +nD7oϱDR jtkTvxrUP}'qI⤮9Aj$\rGal K]X@mi{u^Lj:<5`F~X,#F^4w 7u;z*s1ijoH)ќfEb$'z L<h"xnVcO Լ\tZШ/Ώ+uPQtau(Nq439װ$(FG5&f_[}Wru#⑫)ɣ~&t6O"~|t(PאF x ۞NS@| RVO)Z<qvbr3yILOMK<4"u6_\W{t|FIHJ'qюG!̚@[d~b;bG͛~Gj;=ck_"SLJ $x3[PjǦ`6BB&I%l,Dlx'kކUZ*6h |=_~-7tD%%}C7=b# vY {~8>A)cBp(5*z#XbA72( D*%sɝ&ʥ&]tB b{XNr"QHa=[@C__6` :8=5GÏտmO\>J?#̏sVب|E9l4OaN|<M5y`@ƣ'ua*r_7d** V7Fu M!0jh"7][V:p:TsX鶟(q1 O" OX26}yz31Snv:nYrբ>*$Omxz-z8԰jP{Ȼ0Дϱ#]F *z18|p:/h 7"ш*ҿ=j 2vJgPsu­BU'̂`NJKE$7WPjd=Eu j\i4sޣL(0&)l} w LzFӅ4d_.6tiBՁ[c{J>c-ux<g8F,է;ݣuN>4'vVCDPՔgPJv@B*l*$ D&Chщ aE BFNu!M*dBSw z+,z;xtOYGn P=3Eε)rn64_҃_p5@x`a]P] \YjzqoyseL . Aܘh?P 0"u`@#h$ܤC]zTf`ghaAFXB2ja T`)]`px|s%'<*iwia13 ^lZ('*ٚcM84]cHpsp!5f9˞5I.@t) mp,gu:.EbsT|}AZFEf+NT:,X|7alOsFZD;D&b)?r/MaP/s|bNid&"$FL""}:okoenXyҭy"=;.)0 _a`TiEkgo~ o85_ɝRNɫ)y5mvPֿeX2'ԶnzJ[ymMyk[KnN+qjkP};կ׷Trqz {d{r6 ;~k&_t̠\pPDoklD}ˣ$v8ee OYiXQ2Ub%X ~w':"?09vMٔs9.IoA|C"]܎g(%KnϚP¤tvq2".$@Z3\n*ķdFz8N4cHpVxf/>]gV)XoL3~1[5gfP]OsZ - 37%#}*PB%=zT2, ]`VcW$&Bw^9ӉN)SSct/:hbtÈbm](Vfcͫmi`9߉ l%6bah9qzmJ%5 `}i!0*6myVP<͛X){Ϥ-͙~Z޹'b,H 7,QB2{Dn|Qnp6j(JpA>x-48# iPc4Y tFˊ!0:Wkmhg1>#5\ۧIC{Ds\߆cH< >^WS/o7L9h rhPX"e,wtb*7XX>)$4{2s!kuZre-#p0h) u+1I\3`u$"cVΫ ܑ7w)ka.NDV*T\ʬ.&T*n-I$lK͖[%Lٟ܅UBeJtMޢqsA#YwFfaf4L!+"ZOrRT-EfË^ ZZj+XX75%g$w'i)?TSj%|ҮD<90.JPhš͎dxm plh"&ajbN9EP;%d/YeiTK  :ʂP]/F_l^m"Ù˚%{Qz8|y\`MFk1vt٣ubj O?7,N+HaR~ؖZe?H.ÙDNp-tfF4H`Ngt u6ڵsGX)]gX/^{q'Dizm)5XW{Yu0k泇j?E w}n{c{_9*zCp\.[.!UzF*Mm= 2r ^GנF;aD * H|}7CmϑZcc+Gmp&V9C?n'<_a>`C٠D)4d` @Ub[l@N՘Xz)IvQ!J*!Pi]HCfeX"*xY 9FO~pU!^7x4Cwz'ܚ^4MȒJəև F)5'N#9bDIp,Go&Y`[7JG@<=& 8G-x8]H̷O!T(gY  xФЂK 4P$ }oMR|:!fVF ?ڀ_?߇kC](#EP+АTV.:}-p>Ӂ>EXFzWOܚ{-- ~fb"Ŵ4fhW|Dց^o^JH䠜BoaK.D&dFvy-Z l4ztT(ԠAkE GI;uxB:ﯩõ Kc6EJ:Mv +Az^az߸w/]N 4469rG@#{Z"֤t!]ȑ6bdGH1e9f.8f4?f-\zf,]3=H#d5h5рkDF4 z*z -bT2o4j*j߶Қz*z^G*R jNƾeKt#q~Bar15}5A(W^ W4ݵ}MJ2k2NzZO-00Ϛ׵1[qKj4ga@ ESJu|RQ~i*[oV[M U (:v˓^$B/n !Yc鉣5 ^ڷx6|պ|Dl¸҄K-@ΜX:C{,vLZbV t춃gx¾@Wr6}2٥Z:0exig _P`gDmS]*ډԐb@,o Z0|s\KE#|y7@ÊOrjHqH##a F][%ǖA}g4o⛷\rt+4HJT={Q.Yabs) #nO@;O0l.>+nZqwvO_=;mSan gCTiԣY5FG!j Wd4ߠjyU %s9,:c9ң!zVjt(amCPlPnDvSWC6 %>;Q\b性ȇ}SczЕήlשKqz?;ꫴQ־8)zb/lF"Vg6堆K ktŻ3uq7hȷvɒwf\̃"U͊\VɵFpIFy}E-"If1%bVh6-雐|K6P1xݮ@c_' >2+&DYgjӹ{u^ڸwZ96$Sݼm]^ 1yyrثdY[JTF؄3;jE+;p'^Ù ;`|XR;mz?S9c?|^j'l ~G؞jl7RgbIل)̧I3 N%is u:a(,<'i{ >F`/wm31>\(ڳ6i7,.̻e 74Yȁ>%]ēSu\G.u҉}Qݻd.oYX6Oe}1$)3n&5x^^)Mel$dS&>~K?z>!NΝT|XH la+/Hd_^m*^kvW}s< E^ɗ5Jr73{]4 ykOֲWR:a # &el= LJXfu)6i::7k(xCMn- @,D:e p5 N$;tnH@V|:K,U/ddץIXjUu,,#9sc .8C`9t@8իDQ6^MVz7 ܸg7^y>m|Q6Kh:-b?-0 mc vJ[Tik;(mmw#1 fZS߯v2XWmyz&ֶnzA$<)xΖo62`cYuW˄;}ͭvN":[_߲v~ehþn@7 l~be;hn>DRO +ô)6~u}Kr`r/|uu=xV㴺VwSZ"V7UJ[ȶ _m+/XmH*mmak`jg 6UG3e ;u~}ί:e7|?M&.ӥxOcHWnwxMщ]hOٍ +/|ߵgs}Br .5HO T!Ja|%ڦ$ݖ'\3D8ecJ'BϦ*vd +LB@d7|~ˎ~wgCx;RKOUo=bj<coaϬ6f<]G{=wl$_s}2y`]!_a UL/T rYE(h+T40D#)<ԁTLd8Xb^2@NRnDNb/B)fks>nSޫDG5zG]?kX݉=*$7pI0_Q2TlQ⛒ I$ bAĢ&i {A[6 p4?i2C/w.]]V/V˅NzVPGal,0 ;lK0l= 8aiH0D/O2 $*et[d4x f|]Id$%$T9(])\{@:&jL@xPݍpRaGυ U?m@?X~` 7 ֢`=_% dt;[%DBz2+Kzj ĕu`:7ηA\kT$%jd մI))(p%3P%s0C!af( a3Pig 0Cf(Q4׃u8fa ( h:3S60$JQ@ &` ^2ȿq 쉦"QoWNA=# W4tdL`h#Z>J.oZQC>xQF*ڜxLS'ikdJx&Ne8vhJ:Yv+2|~-㫤hhBc D_ /ZEl_C  Ö짯ۖڶ8HW _G;v׎oG[jqxcP< x 5bBT¶>L| ,׆oWNA= qhB(vb|̈́̾nB qNo8!fBQpJ[&oՇ 1 W[ھZ$zL[ˏK)IDf}d|FzʁB! V&9 xjS:gdL):E/cIz׃<׊u ]` ;ןȱaxcrltZ:<4F]gC-q(~)۬cp,Eؠv.e66z kTonvpaxt ՞R6) M 5)g&&BMî mc80d@S>seop l5;èvtMKVZI P̩3 leE fXhKl$EJ^6f 6+ XhZnmͲ\Lt[:ڬ|]m'6nLVҸO -Tnl1aL-U4Z;v0Pke7M]R7MNQ_ 'IF4iK)vM>(_m=Wɹ/Eeܣjf(k3-H1WpqE `!]ky֍ձ%س[lSr(7;=ttc4zܨ= 0ڽ7T.u57+2m_ƋdC;Ӗ'ߟv"T&XM{5i?1WzBv[9ꭵ;`9ʋPKp;qcGk1AAI#ہߐo0Xfٸh?΅g7߹ baa Eʋ%L67Yln0I~Z`So͍_bd=FW$zWw ojb&c h纒AߍO`1_ϖ2۪oC><ğ/'óJѫW8,ʯ~`OGZ,Gs~ߏRkϦR.݋~ׁyyc[5ΥQ=.L/wiԤ(݋ػ bsˏc+ E?qGHZ9܇xިe-S=(ʠ Eڍ>RA;1ShE({v=bNP0_tv#>^MՓP ?MV2O>ANzv2#u"sF9+iqeʪ- sJ9ߏl2Zɒ HHn~S/3jol cG׭ҭQ"4SDZnTGlInz*߬]W:FRcF6xbr-8RBy|?c2!v Z?d6$j)t"t\>=8KtU?L8/7P_3=9I0u <%<Σ|_fOUt$P6F}Ez/t¡wYf2iq5v"W1?_M1c1d xq$M 3>@2.)S^' KOi%`@Om!uLk:wcmH$C'ddĉ,J9\ z><:]'H\bS5xRC4%|>I'(UTó x[C0'{*s!d]MrUҋVe[78n SbbOcbf0Ш%vh|%xmj[4伇ɾ N0PTbaBZYe{R5yxpQ:4{Ln{g%@m_hc¶3d al_HƘupb]4._y\Fn}8ҩ[SB^Gn?F֩WV&1! 3 IpҾ7%YTbE w-ir'I;%P!q5wf3uE0#1q:_/ L!А`4 s.W?]M_P͛YsgדMlIPAi+m4%$|4Ƶ4 *m}P8-I}b²!+r˰UAc+mQ՚sgV؛⛇lP^nߋ"'EIi+XaWvcLE<,E_ņ^A])$vR!Z҂.F`f@>+.l[frN9(]Ж-1Ϛ%4n`)1{>^SlցOAӐ3?^|Fyσ7$Y^ً6_ʞM"W&$50A!HX`W;|o&?bSlG,,iȴɝ/HemNw=pAogX3. W~&DMD>5/$"xs[6Deږz0R/QOR4遹yIBʓp{ĖJr/$X u) 69z2[XQ N,8rcAz@q19r``4_yiOkfUwJd,^fȝL$|'(D>CXή}^w\SJm:%BGӟɣB\:xz Qƭ1'dxwU݈lStiBIM=<-SUT]EWPl,]FօBSErߛ&KWç%MhU4w >C IDU?*`D3۵.5r!\i/չcTؒHBNlR a415Zqv hh] 9#YԿHOk{El@u_Fcij-hlٴf("|s,_.b٤Ȏ_EGW:*)׺Y(B N ;u%!T7T8٪z͓JVߋ`=9r5⯕޼)Y؍E֘luSd| OaB1,׸Yj7\8~el n7^G׏,Z]w>G!.xKCXNf#1 ֆH3 "'т: 2|=4Z=_'|[)o{z÷{*ϝ Fsq|m(l> 02*QCJB#j&OEz~i~$uxȟW ^9H\ _U">BoIŀSnT"_EyH_i?'!FD2t^ k~i&Iw$JYk?l a(I %װ{vIwHTmu6BK򎕋'vۣ^kϳt15&kiu>(b{훜-tBq;?{'{O1:h7Wu MQ4mazzҠp NV+oC@%!X7.k 'F^be2 G4U4IB"xCo\6tzl;O{6]~9̍$o~4MͶAbE u99( @%'֪<1S #̂Q:)`|# 8i<[-[ËĸQ;\}?_lƯȋ'}#_ͼ:j*vk*uy$7;Vz}`ҬcN&{ƍS^&JU֨N0zi \f S0jXԅ[%E,Ь g:&-aB* `JZK/g'CmO}v !/x^TgM9|3դ?Ns&ɫr:0[:IЂ> >*$hP]#coΦ \p:'D}eʐgP=ʷӑԨ%(O&F'! Q"dFjg|Y+mv1)5nb_ ;W"e:Ӫg:i/G_=N"s?y`cm` <ƟkF^ZɃ))39QReMIҜ!żzT9,+z"TȒgr>zSX0e9t5w5i.=]v9sڥovS}o%-IzKe%`¨L-0EywٜPxX3I*YH/d6cx>lIH^ZUah̴8LIUfRꉜUpB2!7KJfmBjr/tɞ==E$+)(L^RFv2F'$')tv PNQ[::,O?}Aw]/\%r9pZ(L%@e&z9S8Yrea>Ŋ-IZ-<$F3ɠr~y%Sf:rFd{K<=H_kR-S}fzf7L; ߕXl WaxhF$!|܍>A//1B71%_#ǿtџPnRvj:^ -X, ٽϷsʯ֩loFi1ýFAboqrk/Ar'b"`dKp¤ƍU ]^%|ac'n\֒$kلzҌP>p0J?G|n2=xܹ.ΦkOu6] ,bb ~MFULwZW;2.8]C8^y%Vcu2]|m_dٙ-0フKhITޤQDb1?ebm$ᕼYzS( =Vߚ{~+<+{t]7@=Wat}UVڕ=ivڄFKCjcgl)^\/_i)`EQǓ5urxU~ġ5T௸͇Q6ˊB+{}>KGF{Oῗ| K`/αgiy$2!N[dB ]cMQ~,3v⋴{DGtx5b i\qn{O bM[L[` 1fYu o}ܶ'h1%i+!|CMJ YIRcFjN8$^kzP]z}ekt-#UAm zgsGAXx:*~MUAV$a>91Kai}!%=G}z޿eI|%Fk~wY"J.!ve]$b~0rзڭIϋ CvWj R~;91\zxt ?{2y3I#քyRkBڼ5!m^ddd賿(L}ĎncNITɺl.^ҶWO>ӊrC9YwylȏOkH\3W 3IeNS*ci-Ðb=q>Ă t$WsCqf?<@K1L{s9!4^t8KOm)CAJUI:Q*"A*I A;PFt7ếmTFtvD hiw88y7WYM-g2mIɋr{%lޡH]9 ݔd'g,ݍP( Zx>8O!qt=9@2ך騳C :n:ƏzCT2Bu[@D܉3Hg %9fLhԥt>{+[\z+pzBkk.]C%S*%!yS3h+- x#]-Y  Þ[lfLl1 :@'"/}2b;P)ݛʚr Ę8Ѥ2<J DFGSsX/!fz~9[Ƕ8kQ!?꛲0H?e2 mSPSgw֩ vzDd?xP5ٿL9ǿ. -t0Ipcb IoؗrNځ:%DMwvzi~Ev/Em_4YebRPx'@}ycY',\a\.7=BV)>i_Nj^nYgP8+URڠ[ǗBί]F5Z{p1sh]'س*/˕ dDCPC8彦Z BO"[W{Q:e}[k:oˆf$hcFbX{8'X c5J`\B_Wx:n'r Z+{6,g^*ͷ2K3`g)A|${е:^=4\Bud(eG|Ak5p_ 4˙mlPpƮ]7yi@ J8-N{ O؄ /aDŽ$F[p|ɶ>҅Hz7+\9E4 Iz@@{/5e~ x #ϩczFmd<= shmF~xzN9P+:Ц-L3B"Pa:Y+Y+01VA~; qJ(1zt 8N>q}ns zQ8deñriD#~ibG6HT@L=ulތmUZt6<(Jl8>R6 qbᢟr\k3>|[תfAzNU7~kWwR9>l#ɇ3}7&uLQWQ_n#\ԝsf&R ''}dFv=ɏ6 sRNt$,5(EWzr S+6M4^^oLgo+U;dAY/8A`Y ^N\B*y!B9З{^ß?!ݑaP.,qI"m*>[?/xz 5c9PO b_ǥ5H)e'k%^lwr r`Q$HW(֫;MO`/]qn(4tn)dt Jļ"̜b zQi!\pHNsP*7Z~ w:? \O94.Ccp1!=fstg/Iƅ[$pw.W҅yF&@>:9lnA`d]=}wpG胤`%b)@~+(YoqKk.qi{P4>tըWaQT=wXFFiX4ߓ]~7G|Xp Ӡħv*4>ID[Hd0w?TuSG^v[vpT$5ԥ!ò5nq&,>bި(|x_K+9Y27ؗ W++%N;! hmy57llձoFGD"6s?@@!S"< W+\#Okx4)dwkl`^YcaD)2L6ItG?aTc_ K/l{`<n:]O1tm+ɨCц0ŘA0Uv^v(—ٝ;;7KSGǃ)>2ij5>sv;K5Цǡ3 s)R߆I쏴m+lw5e%zx:3myuo<{)I[aYeEXh %THǷDrouf/^&ʪq7x8DHʞiM,nVp ö#m-aΨp(J&Z,Q_+ -]W2S"`[oKbc bw_ 4ɇpjd71Z%P!8Ÿg(sx?Jjk_ 0!t5rm7AS|n1=nfƟbNQcIR!f 54T0i6 c|?D-OR&0bnwRT>:5m>:3tFmYFsѥ2_AϫmKƼ/S6B Pcp+.rfRf' .>qa=*1DVj\װ'#D| {<ʘ`~ֵv'1;a{!42Ts%5fǩ"zw$y n@(싢¿PqiC" q-s-u&]m!INEHn>2 I?MaE+x[: v1-M~>vW-'|p廨^‘ݏ`Z}mE}xz ΁7Iy洷 h2|YlGt#mXc˙O_``W l]ΖO ~,Lt6x)GzPaDJ rPK '%-~xOYs hFiji̕2MgjRhgprΤ?o0XZ@tQɱ9Q/eIai4,֛%"~NiT|=#;˘1y:άlb5|((A"S}^ Ǝ&F>a-\Y!ԽBk72ML`pc*%PqT pnSπ]rg@ RȐ,Ba?a'loo7' yT3ܯ׃aڰurbhV^~m~15I#F`›c8)hlo=S..5Dzc=eN:X8}/0Sp/f +)2P T̞ o֓.7Cڞ)6V6䵭jߡy:T1ͪo~k gAvW8{m{xۺbV?gejiG=k^PoGn2u{AV7$ge/L^ ښ_b,Qu޷Q X-ÕB"(7v kfh7[03GۡtZ2+!:_E8E BҺ "љhٱa !O*^6OրPJ:k7:u~pٳ/WcgqOZ3>oh #.9Yt{ 3P_?C}eQ^/Ev* K_MWWF2«?ńzf^V:|zsq%LJ~U㋼a=ڱ/w-o^.v:ެu˘o@8Vj4uϫt'%`r"S` a [nTH08F2TV* gȁSIVTnͷ Ʊuϗ_׿xA xqXaohK ֣-9ERCX"aqm9@9;憁*>2D톶Vwnnd毰@ 0Alv!/@Ukqh@$u#%t %)+o$W̤)Bc:y7hoTnFx>7: Oe^`D[M,v15ؤ. Tya`HT;\`8rrň?ԁ#o\hb%J'09kqwsAģs3 X';$EVTHBQjb|=LJUA޸Arb.n/<2;p AD޺ 7^P1Vs֘)t (jR3yx GF+6#.oorcqv5 N(P bq2ez%ڋN=ik\`y32Xd*|J!86$]?Z_40>5[]IMޘhZ=¬d0LFflk#zǝ2:?WŌ萀x2V7;z֎Ԭ8gm'4k6KQ!BiXbn! ;!]b (^p5xk.+S/p- ˸X_Pt}$G-7b~oDT^A0I?9`nղt' )^.WE 2Jr8+1 B)/z =ʇ'xaUF$(eTנa,-iޔh\AK Z4 Lr|W۷fHa]cH_c8pvE#D% ۻLvX-lgNcme(Ч4']Yc%ۍX|_!qd֬e4)j`! OIblj,;&} %Xis @~Lz&K60P:o^%n~Bb\e$D@*b@yIs=9v-_UWCD0YTQ =Ǝ$zѶrˑWԗ` MѾBL|X$}y5 8]߄4SQ{1;\(Xx6QR5 ϴT[ $_* r 13ghq|oT=l!rP#R\f驼K#zK1_0V̮Wխa< ׏M~PCjkJ$)Jܴ.Id _gA;6 }-+Ci?r Aw‡$轂T~$䯌E#Z5vLPv3=&hDŽ=EN j*6ΰ;5}IV|e$i=i(?1/6kpgeɎE];kdJT3A!!0(i 󵥓ݍ&͗>aL'>va q866͐e糁0ej*?`A~ܔ9 _C&lMh}9LsmWdD:o1#eǢq2s`[M'i9$9#Ns9y2-RꞦH3Ͻ NwfVX)GJX(O& 8[:Zh n0$*_t61h&DQ"ΈK@tT"^x+PN@y'^+%Wp5tTEf` 2b2r(I&Dٕ^6H/)m]fr,ION+U ]9yTM9ysHy霐 QpX""|ܑ nTɮ_ B$氳#eHbSg)x(~ۦmiv~@6Q$Ĩeѱ(8_FX',< &!<@sP@ßU&wL ~knmTM p~-ʩ? ӽ0z8z'l)Dd_(V"gIooL*eƒ`ш[b%K1PRՎAgq .?z) M8ޮgNW&û=LO⧢؟̱ţʒ>/)-.DXb$Eǐ,j)F%Bhf_l %)K@/)Դ Y$iZfǔNj{iK)(*P2-Pԕ)k}eJFtYϮD9~J߄M )yd2zn=7!c'ftECA鎘.5E L9s"Z\85Ks 0kEͱ%"ryň9TRc;:q*k XEp 3\Ox6ƲWRH-J`JYMj7H8Q&Wў Zՙ fӭ %iet"q60 w-H M3}X ㆙)qWHu KL/3y+y9.%O3͜aV뉻Jd[ 6eݞ@򷎵pU3bEi M2:t*BtVLWz..' xW8*rjl ls( 1"l,@$HO⋧I`\D2>pjο KN;\"- Y{n%xkVpUcN 7>WEk'"dj^Z&{P U7SٺZg"KzKQe |CeT㥸{cM@6)>2K78̒/eKkBk0fLQQN7 zܧA [ze# 9Ģ5ޅDX6O*$=FeY[E0AuPSAIj/dn@Jk ќӓH})hxzSzCH8 ȣޭiUune{Ye#gԳ٣ f/s0k1ygY=n B,H!A]IqRM3Z$HLaBz ~!'⋫%bD΂jg뇵nr[ b^#,%XzڊxS]}w"h =x2Ar/<ng \&>R<7 ]@,~rU>6tyֳHǕ{PAS~ Ry \%8(eC3\RaU^45?j"0O2PoN)]7`K]%:A"_Od@+2=>(M@~z A9 !He#u YIjuՂ&΂?XFOO KNsYK֩^mIs4Ӹؙ,~npJơb:O$;t3=PslUlԨ wbH͉aWQ;16ҠbC+iq#*MwovGiٯu=6NN(fT`{Jx>|.byu7y^*:BKf]|`9a@%+.N@E'mKv&T:EX0*3qNl/(Ve(j+?"dOdc4U;8X/G=r6gb[ln.)܉`ّXBԦ"~ys8t%v f `+^Y|@z{є֨Eԃc)$b5s Ś` Y⎌@r?o5P":0p,S3Ndh>aGw $?mqb2#뉋X꬝_.qՋp@XwP,|YP,\`[zd!64! \JXiƯB P2kxT>`Ep"rX0ۉ*19i0EO0/#=̾㰄k]d䎔>3f[yAuC^a %5:U3V])J*4.Dkp 8U2ަT(3o|ՒdlS& +~c)$@Tp],b'ruߟҌY 5%AwP3#HXՉ:b^p$[or/E4y[3%Ɓ+z&B|',-0 K[s1H΋Q-ä.`/5{l#K\:C<_'8m+rvKMVK5Q1É!n -Қ+ipv,HQblX7ŚU2&fgA4P͍/ (}珹]\b2XpLr%>Ô Qgz]Vw++7W0h@9>a'loA ǽ˓N!Pn4,t iDDBhEf%'2ɟ ,zcFs/wԣAGq^nxS;teDSSKzIżt=SԴ&rHiim2n*m~j7*:" .uT E!<~R+% ӵϥqƶ ߝFoBmޛ (`dx;<b2q7N00tEgW.I+hҎ.脚}a[<-O6 7˫ԟ77S%Eo׭l't,Od!G6@ne&<+SZ㐄J6^T[nߤN!<QӇGШBpk1y u%gn,弜.$C<~;]6f6,Bf5|bݻ-J+v/ g' [xT<)muzo9f[`(%e&N'M: :h[[QLZD^&(Kk *&:Cl%F%$#Mm#8"p' kM|8qa 8GG>IK6! HJR8] T̯Й iw0 e fG}o= `vw2 RL.$.D`+$Uʷ̀!:3Z{;Bŏ4*" $'^[xj!v;Ȋ"p;BjmIH[4jTv&=zQG={t_.J@Q>r _IQE=^?xi$EYRc? j4~hw ztn%q% nQj`J^+fGx;fS0JfYFKqBF(]b݋RɠZprc3p'_]nV][`jE@ܷ_e[jTtoF'3jp0vFs+hPy;~Ik]k⁼m=JL&~r@'m;x{ [_j0L>l.qK)ج'6- |T-Fv4mkhHxk({kÝ&=Ԧ~~F8 l[u6рP&@# \VѸ#smz9_AɛɿLȌCGtfIC&?/ec5C'{r&'&Qprš|Y#Q ~dVܯ A.6ꆞύڐvא5/cj>(%9s.&cmTOA>12sQv3@O1r6r&a_۠ iFFdL e9?!>p'@X=rȫ`nlՋ0Q6 R'eWg 2;BX,m<6g9<_-> SL"_$=( â?jED;Dя9Y,YGX!b[l J~r+RaQYoix2W4?5̯e osUHJefzؕ 2l}TP!"5aQMK_\*e@_5 (&>mAíjy`8W{^1/D+fv>3RCum:L| _?)_o?!Ui=i9U<_ &@ᅼ6+`\OQ񠍪[Zqا_vUɻc[qH)MUT!8VR~(!<|JEjYz͜JĔ1Yk֌i$%GUd gsd(suNC ^n dV&k>cQ`@ <ȷcSpB@/s4}>/KTiz &tqSe,~7jYqΧnu!2A)7. >ׁp]@TxjhRRn)뒕6ngZ,:5DO^~@6o5x/4kBďȭqm`5ȰJn+CH%٩Nѿ>2dj3?OԤ.Ihuḛ>9 rC k@tYqvpӍ/ޔj#;' =l#ȝnrfI+>ب/jR87d iA;k/¦=(lykLnЗD=D(R7#]u $R+GwFx?3qb7,'j  (p"oXV |}#ǀs*C!!] v=cy? .5$TGcvG@퇿D{ى aCB5آ'=Fv34ltuk  2jfXblLT:K`Oz w([O-po-BCK aKBT3C|\Djd5Iױѡޠ 4*ȕwq:܊oWv o<Ew9QV>3gtе蕕Q2.g LщLQ<]ñ_LDZNvyZjʎ *,Xʑ &tSӁDQ1d,>W@;}t"KԊ34DELϐ?C ex )Ȑ2dV^2\8_$|{ e=N?݁5A39Vj ;){2I؉==EV^vOhG DyOz^l0U%wby)xXӎdN^󄳸?Y۬RR@A{X[:p_WykK)-d;׏]~=݅>~dwxvvd?l8ݯ/4rKYeqݛNٰ} _e߼HRLOJ8#=d3.}q(}ƥ \&}S>=&_vv!a{ym5yJeҨ78]!/2잲t~9gVS~qכSmyѫjv l$.WFiS`VH:gRб׬?L]T~gV{ -} , CX: _w42(6 |t E!17.3ot8&t-8PW @fwsy0'g97hOSÀ7|ˁ7ݍAw~K5[~#et؝L˓1kQs|kc6:N&2 iί#/|q35 {Uzξ*oo叧;u4hAYfsӧ_~Y>=ӿ궉ZZ[xF©}ᜭ 0ywKEwkuqr5m7w \Dhg,13o%_)s%Ӱa0u) uJЃ&4 L88 Tے(\vJ$CSK~V[@;ðHPo€Aj*+pF .6 yn 4"j@tb4`ܖTv 0 hD rJ׷K0>[ 4޴̬F~Mk 7/!TV:NANlT?%: I>>P3qJ>%3a:vB6j dsX~`hOzTՂA/.ѻo8[,]wq#@\uv9?L1C 8@@{4.}ϝm̻ۻ)Cx9%:0jYt!Ԥ˰aSN@;1OO6#DC4ˠwNO $Fw_QN.рO(l0kh{@I룁0SKNgI;_r$=!\l)VǞ.q0u4Wg%qɂqY}#n=O5MC1 ~fk'6fU*X[-7˵Dn݈tNl5|ػٔuM0Pkf^m G!u`ojgV(| sqg%Ukz}@b5Y :1+g_~h0O/W0@yD@`pqKJj;b'Yl ZI썎[3q3Ϝ, 3> f;o>_J<лNlZןj=)1%iXriƛo-*U;E[3N)\&x5')> t]s2EjL)Wh "`jZvav"xov,jێjn asڦ`%s] ޛ MA=kV ҽRa! A$mŕ>W21"6! \O#bP! # MN֔)ڑ!57.(l%>nfV{ND* i R+zLq:uCu}JgΙf>ʄ^̹j- qm3{0_y96AoP`R+Rj&b*gǐ}[C%5_B򒃖1&G}3[\ G{jL ܯUJ_^d LfrNFvF3Pcv X߃ZI m9ud)b ?uj`0v56}V'>9Qǜ bh`%oq'|I|N T&^Gfrw!ݞ@VG &y?tǭ>D'x9Dj|ɳz '=can'\Ϩ`x85U"L \7j7S5[u( ,/h(ߴiE d?X@:6b8ϙrMv{1! < pv~$ Qc=pI0NYsl&uqϲ%hc|0 {h+1ޢ+j5 Y9-{!Z=I Qr2? v*ki CS } E-O.ɶg\ ʃv}JVf\L=j:2{@jB*0!T`#=RD/Nw-1e~?}_:>x7)$nݑ"a'x#,9jVeS[4L6 \D >׷O*P4լ\o. %R4/#&Fd8:te Gz蓄Y pVSn꽰Mwhmn ';V2Iq,+ˑ}pID"8 \bnO VyY\7|# ; h/@c{1y@rj*EدC9|N| cY@w8MTC ʜ}Ogl03 Dֹ㊨3x- g'nQ]ڇglXePP#H}8G͵2 E(SMUg#}sܹ3'q _ݗqlom|"thtzpc4O I zE3HUqi״NAQ^ʚG=PIr}~~^^ɳg^dgq$'g\@2K?y_czǯjQLr- SLg05'Z omRďurdA2`L!6i̤$jidﳵ {M? h) _!(Q[P2 ^x \߆U:Lu9x(f{qws F75㘔T}zd .^p±ZLEݭ)&}{w9]͘Niƚ,.e$bF''g_D>kl^[Z|HE 9"pI#KLA6 gDW+f)n$@䨦L} v>4&F1 :pjZ񦁋 qnmRpˀysN˩Qd+nzyy^~#Fɀnc;ddm<ܬ%Xf>1Aw4ΖAVdevJr_T_FC" OK? j+(u{^H$wpC.B%b?Wlswe8 {=Ym]<]|Ķ7B*Cp- 3w7q2_0vl {j};Rz!J9E/&,T{b?( ! ]ǿE:buA2l &< @T@P'&ړAX/YV* B\N&*&2UXѴ=C)e2AOcu:QSq'0',_v1Ir4fE o= U KJ]TE/$j\dJ#J̿XeME/HH|&kڛOd{KO6d %':S 'f`~^P(q`f z,Ϳ#`|0;\"&^2C;clPd %7I/.|ote \ޒ 0*8_|) cR^Uޭ#QWwH>CV7z_vah7.7$?;p7Nw+07 AbS62Yݤ:A )vPc;A/#?YkT{ 8̅f5}8o sſ-%>Cs;Kwco8HCob,&MO7JŵhvRѭVr<@o۴ migJ`[q14O8vs1 Ͽ-7` ;u~^t&]xU>s`7x -<&\KDP!|g+m)WcZ5 z)֬՛tۈ#J R9>?(| 0N^.̩o|Vgo)+'kO.L;CbD5c:A&2PEwt*=cX!f@8~}GE<3y9/NuQ}&K*ob;hM /Wp' }ߏg-zArx8t>OgOw0B%W1/zLg.#29 > X"~kZb`n;yRlOysyͯ|}2fqWxqa+ ߁KnK\t۶tzo!fG.{&qcOgzvsuqY9QGf!xA$",n]Io͒h!P?JWsOnͅčI jr60j6>~i 6Ak&@4x\ռG6usL79( 4 Bؿt>( ҥTkpɄ? StY8BsU;|H8%AV-,L/4%ĬicR+r=4_pJrw!^16B(CzyHM I@U xPA:,O=R2'DJr s˓k(aZga±#yQ.hCF#u &`t v* MtƆ6(@WhCh"vг3sy/^c/w~cҶouO5}+:t(]_fm}nک+DLܕ^Dy:(9rN Z˩B_dˆ1׊?  ??xASǠ7i=a#%-t3T-aPNO7a@H:mI@$ Ke*$ 6IW3<_ 8;hT:x4Y-sp@i.0ԑ8Sf:TfcΙix)/܊\`s#ƿ6/ 6L;`u_koj2υWa @gstҌj `K"d(o8 >vR#]JY7Q(fBk@6.<.GIL)sVY@5Xc !W6aπIO!_B?}J!E$S,.2!EatAqd [j `m tU.!PJC7JP,]\흪 WRb]ee#9+XMa|y;0[oOvLy:?/UB%\' rR6kK6\NkgsNf&i`d2jSB3!v MQ36XT %q`g׵60K]|æ_j΋i)}]G5".p1;}Shܷ!ސ6\j#ӥkSߛ ?4閠}vǝIItϋZa9h>}=@x9S@{#ĽIA]X%h׸#ҫ5~u{^VUja|IV./a%Hxм]CBCX.5OWy R{0HOOi>`7# rw'Т>X7-I37foTh{TD]%te" $DW0ߊ(J)_ fH7'՝@ :@AogD67XgCW P=NH<+ "tAi3H[oGyr!)&t;@>q,-Xm}  ENa k,e CIwD@|]{sizPKz8rF͸cyM+%1,hY̍Qiu* dGMj@ P)593%pzaVt6\rGE @XDH*!D0,c7n *"8 #G_鯣!yF?w;?w~1ai$Ɛba2^FKÄGY|?wKPSEƌ#O5 Dǘ }mن N¾ߍ-$?/9ow/S*pN9Z6ӏ#oPcaR ƗcMdO΁?3}iazw=ɃєJ#6{ YXo wLW`6̀Cpc;$Ύ@}"." C/o^ly&yha~wK'(=yXl탲t.RqJn%W˔)[U:sb _IOC8Ȱ㔏%~!ovXwGwpPxD|=~$8?(dH8W0Ӕך B,opNmVIx8_"7e:Bǘ1 X~@f$vԪ܂H#l!i0:tWNۥPS&o 7qjox ^"Mq>T}dF=A|siFN~ҩ߂#&5h& 1֊_@́a1*,x#bQ N廫P'[ac,S* uvIje䯞ٰ`Do#EeDX["Ήh_ ]>X 3BX1 r=l7<'kT<\)W1X SJӛU8)z6~A#_(@ȁΊqxVA[kD(qDFS8*`2${{F֚ LYա]FfT5b(f6R.]Ia7Cc^{kϝ?\ɡ>'!3xja.B=]+9G[DOO|xEӄ(ȳzdqe![>}(ʪbJ`K6%nN9JrExk,C 2X^QS3^s7%CDKpySc ;2,Q띶9k |Wқ[%@06!շfviɪnКf56K~5_!%8q'S3 4 #!kZgTKbN:02I?ǥqjF{: ^g;A7ocbl&,A>P l8Io7)n &5n1OH K!ezWKhls'gc_BJ!~̨e,d^Uj]_Y堝Ol0}w${0HIPf+B ڕ~B+լ6y`!gg<Y oqx8<8z82! -~ßsA#$7-Ap~&kJ/Lf@@Y?m m ˚21ֶGAx}79q~>ϡs1t:G s eI"9b1t:G #Ys?C爡sk.r??-?S& >':ӗy>_2x(}_]×?6[mx5<\aң7>M1cΫ{'逸\w?&f@9l|PN4߬s(9? )zN& e>E* r'c>uNNk0P}WOew 2QpyloN $eu9H{\"s?P03DþC3Ʒl/ۜ7|ϓc3j0,Aʉ62Q[Tus,=a;1 (%9 }qD,PI$&. IVI2@Nl>Fwod-?Rqd Hg=Mb5(~TQ',쟃s7fA ѵaJzc26*۪JdLm+`N;Mp,M7G1I7Z& b@:VEAB$ ^ɧ_,D;ȥP(Az{l{GAU2!Vp [,c+!xb@|R<s 񩎍 d=eĖDVHC--^B69Q'iM:1\w0b3qހ8 wM,^5bRƂ'E' _jhi/ :1Z=c( #5a|0I&,!|?C$:<*# %UYFOLr^Ԉ `zNi*:fts$S]оڸvik whܭ ^{xTn1"Lݧ{̌3{hC8ޭ U !PȧQrvn'x*GOB}<(~!=:ַߍ} u]nxmPNcgmhknuo8uQޣ^51jsMNs79M Su&{{&{? i^?s:?rӌ:G4;霦9N'=oMsL8!=p~F3t ͞sg9㖠6:9dݧ7 :;ot (_`,/hVkmcnؼ< yz\O݈'/5#(--E7[B4T }+SC$YD["3a^9WxC`G:".GPcyg kKTՀ R" ̻f=I{&Р=j#g 8#0:W-C½w_ t~H7z`S{9Qm:; 17 k02 ūҷ[Tw0ļpnx ڽo1a_rUbH_ 1M. "*Acez DDž6TYaŗ1o8Cgft1\%G_TKhbGEZEǞJm)y&}$e|*?/ g"GָYJX~zEcO !A%ɬ. ",)8l9D\M`sOqan܀h3^]2d/ , U G(Wl2ˤ !ǎg4a":K#-Cb7/^p]VxO1R;u7C[)tf1O > Grr_dTg# ,pG쯩UlNJ*C2 8Vܑ.x-{::Ls  juzAGs(R ^U CK{촫\ɜ\ r;R:()lt(m~O@Ӆ]zw_3$ BIM.0[j4*S=+ҝȠ8,֠3Cqt83T(z Cx؍UkUdk$1AhU4T F\ ſ WђД2~"s6x^73g"pW\tfbmJyovݠ`h6x>+a(RIYպV7ia`sfDB5V]NN=$'1t DmH)T#Bl|sn6|(z| Y8xaݞUyf,BE.*'qFʾ+/ev+a<_A-C2^h^C0ADEJ%^KejnjzUJmPf%٬hT[{-Z!\"zRg/a*={վ\ ^wF}0{A?Zh:솳DuHٳ 9ЍgV8qQQ\=\p޺}l㩫 ď2V-Kn{)|ZP:EmlSson&PZ` Thl\R{ !7a:CBYݕj`ՔJvqXwìڏ3K:XfKO )\x9#j7p/k_U,&>%3fk0\R9R;<`c"YR3s"}$ww4=Rۋ)|BHB ~h/t& : ]djK {!X^_"x<:xbg_Xi4 QEۑa]r_淼p $@ǯH{e/l3Cg!PD1M,Ş8V{kP FVPEVܝ5!@ (} :|끈Tf_wwB2$lBʹѪ\\a,{Ն™ ( V&dZ&5L  @L('Lg1YoڤR[5 Q`Lqeָ'nA^I4N]%{1P9_㏡y(@;ޤZɭ)_<{O?N@ϧ7W Y´Z]IDWQX';"e9 [tkSUfCc> jݢ4֤6!]/QYҌB1N3咭nυL=Ðs SM 2 (P) +t7[-aљ`C pɺS-uufTZ[[z]>;,>^{-If}ɐgBN3O#T\5t"gDyи"Q^7Tט$N28ک/O=>]#gZThE6 aDG ؏~XˎN̴Pʣ?(o7<t}4T%;0iHӐR]GRp!Ӑݐ]LWYb"rgS~eQQfQΦ_dYy{e,+-+f?Wt|ina|QO'noe}<|mZoy_l}^ByītMEY0QQ1UqAi#u!0btR/ {v0҇ڟ&.rIŌ]hRQyڻٌ'k6،ZU>/|7))zTBr= N&qTNIyC~2xѫ?ϖ |6+oTEn.B|}TPD-Yc=^OBn4]mO!Fg%˖ExEry4{&fH)@LH@Pk{d$ ԥ$E'A{%TNN]A7rqk2!حWm//͓Q>!qlH'0N&F*1 )E҈A f{$ILle=5iF*&4Iۅt 4 s&,tf<|{xpMT9 h^l}=K׈jIg Iǧ $yO;¶Weϳ3 L$/S{ٕ>ms҇LEqD(M"L?sǹ&H\ImS#Oxx]2eڢ1J q<1,̐ ۘ" N#ddkSí FE!}GH *<`\XIJ?K *m\*G)Ic>hh P-(,sH0 1EGx99}r .3,.Fn &-y(WԳڍh=d5A=8 ;>Jԟ\̇$ɳu?B?զjm댿}N-CrZ~ӛ\Zyy`<ƈwS5vrO&l+ t6e nZZڳUիf `{&)οmfb p[\\)zv ol}3ݑFFDGeÁMffmf&ݜHX C{flf*{d:@<:bXY<] P 4Ņ}0BJJSHy/3 &zԆwc+#.9[^d/y}#"d5Tdϳ's xsD6$plmD[67V!um64qa4®0o6Po՟sWC [VeK:ًAUkqZ(%PPTiԢ4^ 6j*[ͦ=ՈPAF/H6RPh*SSƘ i&fɂ3X( hl&! _Aю=X5b{Y!eŨ3GS=&j?pˢǹ,-sY41jI̯$ǍeI=B ۞e>@'!F=FHQ(9HŚ0]@Mm(IuZGz^( blhA-غHq6|v*15(sW3L\wm}-wf~uʅ_NM1f?8L|Bt0Ѥ&؆ևut,g4'?ʧ\"ڳv>aI3ξ3}۹ˍY< Qܘ~Ɔ=,P^)ٝdmKd>y=6"'}6%?%"UqPU 3{p?{ Ckt&jH+.b?Qձo>);j ECCH?H 4݅?;Sy„Ì>Uy0bYRpSMot16;+rqA,FEQ(`th*4^j| 38{ {1A G[^3˞|Qcz_yVn5!hV8aS:,aZ/ɊQQ&CA%Q1p6y nrdy%t lU*֟5[ޠŸ'~<]giu4ps}]~=݅>~޳g$~cpn^wt|Yn G_HZ3N]F4Aj D'&\Fw8aEs=7a<"SS9Ws-SmON6']vVO7tYfFI7v,y_><[jz۫4et¾-tVlY.K6lz\ 7˫7}JW#n2t5?LM-_N7,Z2-a/| јj|~KZ߬@\c+M7Ѕ[B2o76nt8&t;pП΁~]5N_qbG97o>/KJf7.6t7q/lӏГaw2a/OƬFi}ol%^tO02p~݀V*LgG>kb(q/ Ϫ3'ez:XOX[=ȞqA> 75?r0p+o Ӊ[p݆є$[C٢Xl;v}[WLW<]`*ba 9p`s#(E@ҋ1' .6o5 6X0K~g >9_A0g ݦ+O8*h ,S|B.]P,9HE$E^94ûMEMٗϑ٧)' >|1븦YeqݛN b:pʁj5[_q.>{o] ^sě\fW9},p! zu3[n\&\\N#N˙&X)I*]7^g8Nj賧 B̧`~$ o5pN( 8sh`aӕ;(7wH)H;ѠrCvC\ZQ=aep9?yb 55!Z<.Pۭ9`0֕lI KT'X/Wo^P2x& ڨ5OQƥ@F/~.gKVY#sHʃ'n%P/A֟ߐDd-P!yF zYR{Ҩ6c=WK'ꂣ:Jmߠ'/o-Ψz1` 9.$wtI}t m`ȏdAUH Zpxzdjz/>qqqFv% Ρy/I;nc]N;݀Tː'#N]%g9RÿK3 :'?>pwH+Knt$z;lwfoV˔&=yB& ߁ʯ'4|8s/Cl,osMx}'ԷBM##މ*?<>9eaaRo5κ7ӛY}8M\cw= w56Ʃw%KKbec ?njlwew#Ek|i5Nd7kZw+ #"'XQ~@hO?snjFݸdDך 3Լ]aG:p> A%G>G's 3,iUpK U_ Ύđ &x8j) Uhy۩rOJɓ X'fGPJ[A.6IR祊 pO˿E&ii@ /_P-/9J^O ;o>zp29>y69z 4а֛7{^K9Fqv7fg Vl_Mf;inĚx]N>r,|Q#Lo_礛??=dg1}v :ep {$ҩnC! )ڗC8 y\Qra $L$Cd8Bnݩ&ǧ?D! kbRXZVd?d'-iaV\d~}3D>[:B[0}+(+(r5D'Qryejwʊ Mqy$pᙹD|fuo^b09VpYjڸ^rz>Oo;&D:{Q ԛ| p9X7lFN,Ӷ/Z.'5Q{l_ u &9](]b(C,E2tE='HVo36xxVmt[|}n~^<~ȩBFTNʎ!Zi f̟d[p%{<[\ISӹ4.Z^`cqbbɕ@Y[bC//PG qCJ/ `Q/RWpfP4'DRHuAz$S4KYݒJF*,<]2ˈ7_c~X7Ս8{<23Höp(RB&6Tl$&)". 3;9m:v'2h]+D3νhuK]Z,8Qrw8wx"F*Ƽm5`ȳ |UXbkNSU%wq$:аRaE'ņ.ZE_{Tr6'SM&$~m$xpVv :E<N{N)zett_ m/e2|!>9=k AVWXFeu (;<W`͸wd;g G̱cv}v89'bot`e!+".jR_k:_ڋb"שR'R!3rh%^D"K%c4*  Vװ̑{ s(<ɹ8l ]E;2B ey蝭hV%BODmqB'rA$QӓAk7TEϲH󯂦A/©@%ZAo9C3z*Mh" RB:Z` $p " m- g9[OOAH *OR.MZsG p:C<~L%E$jv0C6qY^XFd H) > ިP@AMBǴuX^%a? ێwŲM(gUjOX:6Njna#(Gtᅿw\im0y&{%G'vZ#j1xLm.;Vh4C7C{3ÏH%խ(Md5օOO>YCo~mfWϰ?> }^xB#RsV鬻ZkVkjY?H6:[wUjV]>3~<(i9nOJȷrv=KIy*]lfY_|e_f8CVqDGY[8b=.]]Å `!8yḺ>ll~9Prd۽'r6ȥ= *@ḵC@/mv6gܗ3T jCM{( tN6 K4izZ},)! A4{?mتCG֌9F]Ad 2g`$/F%4s Nw6q_?2K@޲\|yI{84{.=390{ LL`1ft4:]{t4:Na N7::{NXKƸث6CҢ!iCҢ!i=pHZV`HZ!ikHڹfp,یJF 'v`$$h?l$ڽ% _f3Zbg;=o;!w" Z0螾:Xj <QQȄ" 5_7wVSW v~p~7g7H;CwDʬاQ6f{`=Z$l|;/Y[cujZ68 "lMo@Rəb%S Azil ?&y{ U[78Lk8t%4ostu{=N``0IF|I9X#!N=Y`RĻGz>4d(||>2wWP @]c<|s<.͍D7{a-c,K6nvd"~2 &x# ^l;Y y(y>{=XOpm.PW^[{#RAւˣ''ڡe ONwz阿DyMH]Kcs=tN/wF<rNP6S1]UAm ,\8ƞjf*)6C}#1?of\" .kha.R:a9( ġ\ /s ܭ)1be:{ΑPD<5DHgiM@JoIˊ @q#}8r,d`I;> o]zLfk;6|5oԿ#\}[Lofks|L\"F<2MA3~t1 X>e{JSSǺ@t ؉fO/c|Qi[ԤS6 )6;&xP oЋ%7gq;}F*`уӈ*iqL`Gvt_ثPl$)#YF_y7nMt,(Oe=˒בiavIDCf6v FkA9mkIM U*B gj|yGإR+I4\fj7!D Kވ~}uàFؓ|ТiքJ =5u@_Vl$If p)(K7YIEV#Tgb1ռ(KAhr?w딏6 _^x ̔F=Ё1Lj&'hK0ǩ +qz8 JЩŴ[F[6@tDv"2T+4BɸT}~Dy_ax\~*_&ؗ;i L4Փ5\~Ii ųQE$8:I'X/ P\LT !cgH*BϹ0VceHi>Fu Y+;h*);[kSv)'7` `_8AY{G(:]P.  EN; C6ڐqatvLA%?.uN@ Mz86ມ=O" V}F.U=zt* F/BfTw_gUqWէ6p|vٻ[ѫdX y*Kjn{5>V?yWy y{ͣٵ@DD( ڮ4-k׍HJAyg.-|aN?Gy_D!2%k2ߏts_î&:~&hs&bYRT,?AJ-BbM ',eOlka!2&D'690ud6WSHjK%_hcNp#MuvZUȤ iU獤<ì ̽P{ohU=c$<[)AigN9gkpqB.G$MLEi~lf;w PXwƒo)&U=G$~\Vz[빝R*-/2 H.WO(\}P7'0Vcwpuu‰LXGeb Cf2x=6VXIQC ۥ0+]jMEQJ3ݛdYeN&Y%'Z}JF_Bd߆H0 :!bp(59g33h;gRbu;w</'MmjT-8g&s!GN5s2P||6Z1{k7ǻIS|<؃Ñvn[>,"7 |c$` <ÿ-T~WO&Lyx\tՒݱ>ebkIų\"y/v ,wJMR,!F2+OoȥSC88ly].gA5'1zz۫TL>b ǮӄC ,-4uG3+)xl,x!>q1l䥷EҋvvK&/`Hhyizj$P 0P^V },p{cXn[zV‰ ԯ-?6^6< ʾE/aV'BTLdQyu6ٟQ<էOxPzYa)U8$#=#z3ez~,W"9elyhsv45衈wI6ʼnYYx|;m$X;=fط˺ӽ DGo":X0ӭJe+ m1mR]kȰM7pkȌlOZeMtTF!EK;K`b8*Z ۓwr&v|UZ^Z5]67 ]%}0P` I0w+HiڀteV_k сE2=Q1[2}Rk2VU|%YsN6RD?ڬlxK4Q^CPR EJL#Ӣw סkPCheq4҄WfzVM9ꕢ2~pi[ ϥ7@z!t2]S()z4wFMS(}+@2U?RȊb BA6!$ /fxҢ jiD2j٪7:Katc&npHei5@Mw&;ԜwDYk%FP=򾍤u,d8b_{hM=BUA]lxH/5;F_Wx~L8LR1K[sKAӨ hX^%\*>M".`rpB3vNo,gW`/, Ӝ9a f-ǰ r8).r]\=  !z|9l\yS~ )1}gw0(wXpNatN0]'DŽTgcL!AJB i9h[!)dt0MI7 X%p[rQftC m:2@b{ ei, ó-/!eœ#W*/V"'";%]h3Ђ 9 }.7GnHKPҲdrZ:V|XcJ F|&"A^3#ta 6xggqx;aK1G)}SLsȇ[H2 3CEld9^XaIMM$f,BЎ11J Ay̔" ;R.)~;DrMс0RG rGXd'ckpci}eͬ%#W7?v??fH/{ɩq.2қ@ F({υ FhLַb]3z?7U$zsihV1-%=Goi舺)gP̍3gi8ƪ2P' U,o1;-:8߹3 n>7@b*Bcw0yY` fT 2nsB~ApSa!‚< u0nDW ҜUXGKV֛p3~ +y{?Ɨd`y;NX{l!:.8NMGQVLPn_ܐH+\f !"!YB9"2+9^bi?J [c=3ӸƒW;P2N),c!@#G7v_iác#BT@)TnjL?4L hjjd%_)C_=@ìSVvTګ NR/JJδ\kׂ(2k yxo: rK\&3nDUSC5xvXٯ>Z /ڎx8^}@B; 8Ah.(8u۱e" L فBȐe2ٕ+jy1`C+r y"]B* K:]ʭ赁QGqp=PvbE#*t.yC[ 6weK8G:[)׍ibjW2bLdC3DAEV MHRFjhк?AVѿ(&˅q%ҁ7-80]tΉ܍FSvK4R+3ɮ)nV(’OY,4KIm:G=&+L *h9FT6[xV5 t2RKW3 x0o$/""<#艾ׄ @Va"-ZB¾-{FoF~(ZUɔ"f`rE1 #⟐.a;?J| ~]_bE_ >S?.W Z&snɸ7~t@ݭb0npn#wX~] 韬 6SEq]?'UR"Q ?.+[4M̶Pb>*uMYcdVASt`z6ǰ^P‰]7+9axS'}"HJ/][HFnh c#fkVTQD<D|g7_}y[c~;6E@Z-1ou&@<Ĥ`f^ Tl9M$*%$]W0],Qrf"Ըj `NĈ61mڨZpcyU~@iF [l8>;Y{|'{ %5ثUyPϻ.V+s3oiGoxj?@;[&p St~g'Η$e̿{g3!"NTzbu %lL}l#Ny@Zbʡ{ .Pgd`%9 2 qC@KߵrmKT?tlseՅ"=z:$Xpm@.`ŀ6$D1rnT> &۫%z\vnϟr]Jkǫ:_ɜ󏉃)o#oY_Ts'xsn2V懴50emP> ę'5An/Ǫ/Ҝ[1 D A]ؼnj1cY܁ˉMVYBY_''7PMcD{qȌ+0H掋{kFS#ursnE9cp@BB_; سċ"TSD'uPH+pR$ -encZ,\HraFIBa׍J͠{ek"I'cE.\  #/6jH4ᭅ: >6ٝnpqW4^[@Vqv{qj8RzSxMy8}kHRo\ iIFnl8T^g]yh? m8p9'q noW): 08R0P1eMiu6Ooiz um5ŨęaW|v3ې5lf4޸]M X=)*.=V(DC*#Gnͩ!f>3eo) Ą6 .Bf wvt\)<)!|]YПT|T%v,nm{y'-~#p:Y6L{/W57+ Zؗ4eCΎ^;)T[(Rɨ&;y{Su.mW˼e|[ؠmwZHA#ujnppObppV]k*IQ@:.=5r{S7E HЯ:bw:}ZP$]EFX"#6t~ߎnQO,by/McF+$.3$~DؙۣH% g(ySB{:0Dop"Q_V0<&fZJЩŴ[]M߷b;pf21D.QETVeоpM罶?x=%H|p(yz_c ")9iP]`5f_&ݑsёlx4D?w'b#33qDQY5 J,Ū#0$\{{5xk]4 aa) '7 gz9T n̹ r|<kå+3#Ȇoy)A4 74|=c$4 Q/ȺYI;~V +/rD҄cߏmx{,QΏ#fYRʲ @Z]UyT( _0U0< b31T| a~ώ-Od@0 S#h[*!*LTu"AY(%f^w;uSH2@DCʤ@~QSAaa\4aEZU/ȗ5bWY1# Eǯ ǂXM]CڀFK|!ODk7ǻIS|fA< )9;?=g\s4f $<+/?@f;MT('LpnIZXkzU(b:UkP>/`tp-*a& Lf!.Lw@^οl"3LP4,aNUC3_: pii]gϠj%10ԣW?SENI"mP~*c+8E9)*0̱'[#(M'. \2@+ḍv \1P:p#ψÁX? Z1tQ> վ*=>V{Ygޣ8X^(s<)D^6lddBrB sN{%LDȒI> 0٪ӖSaF JF&N#5>Ped>3U,i X!WiQEQFѴ(b{aw~SRS왕ÞlxJiY[NQyuId%$D$Τ*eb/n븝?(#3 z=[fyؐ*+Xߒ D醼(nvy% \^Ǭ;:n>ˢ7IUMjmHG6 <|vO0yAD+S fLr&^qa/Wˋt1[JHAf 6?h0gqX3IG Jl3:h6u_jp|-9{}tk%8 bz{3ƾQQO\ ai0{!_`w<ǵC>[ Q*"rCJؕWH_r0GE5CטN]%5 9 Vi ⥩:D+Ee6RֶTS*ѕRE }iMI0-H1Ty2͏F1rPV:x|Nd6P%9<+X~;QkfԆC1-o'6kie Ռ- n Ʋ8x]9Ե27]uӥ&2  Tqw^IFҜKF?ԂG}x|G*(-#8yr uCfXDx̍Kn.9/>Z?OXZUX^%$*>.up3CB+[TmʂeѯL ^ cϠ3JPo_^~׬(/8EFȋ_sVtRaQUdDRB鶢u #(p O,EJ*R UZbB>6ðM#~)(d8S >rxo86$oTr?[2ux\Z GBkϊ=+ܽY ĈOۊ$[d4Hѫ ;:o덆 Zx[rXp1+ KDxˁ֊Ȋb _-0ܞAE@<y}էótt{'WM1&niZ2m&H7sQ)#3418DC3`0+BF+aM-ݵICp=V=[NRD#k!sYgs钋\i ׍n9Dd4!:3Mq/+Q\*= M I{߻ObcFlű^hhc1g L9-3S"SBG-&@(6}e- 3XD9.ضI.>98+gwy(%#`hq4R3k }oCϊedS@*GV), D ~mZ"5<| k!+ΏEXJ˾Z4!)O`_[h8_|eVQESB@R((;e-A=Cb\5_s"|ME@9ibP_.RP:=p]Tg^v2KtCrGx6Αp[ckŔP5x~:HMHAF"-ɰ, ܉1{0?Ì /'7lt37w3hYIi,S}JA3~21!_ېFv?w3z7\Ew4j;3TDmEY Ur- X|\f .ԉ`dT.:Y;x8+pK%{(.&Ɣ>ŃS~$ Q]Os>(fv`3&1tWٓA]b_m`L^*Pi@"En @ u:njU ytQOR'LUsv -.;Gqu`49gV qÓ !>'4_n#^~6馦bW|!ŀN;,o1?-:f߹3 wz>7@bk*$cw0y٦qgT qTnsB!!Aѩ"YOs{}Ѿ$7-XyKᶿ.΋3y ,˼=$|S ZfYj6 `y3KB859S ^D[1B}B"2XȀrI)88(rd " e(xZ$:+1dn ,J+SУDkh,%cě,9xQ?:TaDR/ i8ulD(^#fq@i3ZX W&q0ߔiő*)ij{5Rԋ3 W``=0oL7eۄA-b!Շ:n%rb;i5O$#-K-#F!<+VW9wмΖ1E@x:ew1gN׬뛡0yC ہBPp2ܕ+dyqC+v y‘]j K[ 赁QH=PvbE#*.yC Q jB%G)L;=l G_gk1uO,FAYh٫]W"ᷭ+$c"ci!I“d \g(*ETa\.uU>`K3,NG> |+3s"wCbjrNj+T r;*HSL D=D#xh2*RO $,j ?{!3BPPm7޺m}Q_!#y %(%о FO&uº4W=Euh 6uDn33Z LGB [dpHv"Y%X?h@!9'd+LNO?0ؔqQW?EᶸOOmJ+ lz=]sG>uRiFɚ/`gXE '!E &܏Z j6#9+CC>kGu{02\3a& 7غ$>m5@hgoS2 / tK0qaל5T޸ N ㄦɄS-LЁ# '>`8^ߓ_!FFzod@(7OxIxx9!ɘ%> R¯S,==͘ҼQm QѦ2kx!4COҝxzAj.|OAkO=柣)~_g pzl7O|&#Ae j>S$NDjNoǧ&6qgUTǒʹB[`T)ȓE@(MZ~g/4,"chjRPPd j ڋM Fʊ! fHgHcI8*^Fqq /MC/dFC7xΤ,$gGgVWvطcpE, xw~ZhVYw[o;Ƭh.>E5sz[LJ|lY+DQ&w@w-286z7h[}|Q8vnX mH$ HWGOeL+4Jmq+bIsޮgs榨6/u3C?'nbЍLPѤ?zLUMGi֬4>my3׃όћ<@m|a`@g;H[- |<1o' -\CE{){_z5 i"r^ _nnY$X`7.BIN=2ȟSR " U.Z b /Aj>LG=@8 Tbbn@`Ŭ|;IMT'GT*[@{K:FG!qwͦ(1a_Őуrw{N >RZJ^-Juf0`ySҟ0ysҚ18''O[us3ι1eMFeY!KkrwVvٞߝfjΊ/F8blH_To BK)ufyv:ƔOIsz5\ .cu^}“EUrjx܄GF8񸚓ϔ4TC hpjDcbPNxwUMF9&c%seǶweQ3,Y%"L@ `KF%$V8@2( 9Z$ ŒɔŠѕCn1oTt(co_aM,qeABl !ɥsEhO51NŮ2}g;+i?.]xvܵU^pC!{>C|"PGx mr7цYNA `IcNjmpl)! ܽ-fϸE4.֔PeሏNIv֯R#B`pwʎlF0ڃk a3Ůf!K7Jiq ,rd |夗St!ZfCgɗ6FUFvNθ 1#O@%8/4IL{n+hrgyGGS2p\՞]}.AGU`IiGڪ7<-mrYbJSh'F 6wԬU|ɮ7gܸKk.(w堢"̀y0ڛa" 'TI<d ȅt9x z.Ulo2 %<9_pF9bဳ&+4Nh ږԓH(ds`@]kV;p3 öf)ǞYFONI:'J{y7c]^?1|s("s4D x8ͼޣ7r6PM͔Vlbz<#Ed:|Ё#fB3!#fkRV:Ȃxd%,G&$h{d%+ha; F"du}"]&HZt*R^ P#:B*5EGΫ^;)uT\!,LtJsI5RkWT#ꁍZF6n][YڟT_ѻ{-],0WQ/Viy-OԆ'uT)NX? ȿ;Q< a>>v.UWKˁķ% We2kaL,g\_ [ bשQÙ! (*X@~]1iǼC}"rp*,gCPNvz1ESӶV_~TܻśTFŽ ş6rdoxϽ$Rx"۴%"e[J*YզH gwLEj{Kb( H$tyc@6EoTeSVJHA=v\XGӯfS d~,m U߶8p:K;X,"ݠė̮7nW :bS90N%TuaDCś]_hW--9+n4 gPU6ĎF_zեo*'"I&vv2m}#'<_Yeᨈ~8$;IP$u-jTT1iZ7f \{qF8r]efl֏0 k%Soh炥9D=d@YİJ)Kd`bs]T^jm?W𡥨Ƚ٩AD6$=-ie>*g^O)Oi vĭQ3_WxrF,eJ:E4폿{l@ DŽs`&]V|יv;%)DœY%6|+z'Ԓz|QQo6JC>BۜÑ@|(rDuO{uLt7 +MH %iaLĘ(.xK\nhN'hW`vExB!\ Yo4OKCWjdP$|׭5aQ*\P5 \Ew z_lV*ݘ `dQѓy 9O0R2y +lCjdL9Cwx4o 7Vow.q:U[+H{67G3!2]B_ M ,o❆'V\Җ/YAŦyFU*a\aQ37g6p;PR+Sk1J2؞c<Ƙ/S_ZP_/_V;n`WPT!L+n 1ΕB pY)MzT}?C_.-\5{+*үf:6P TwrU(zDGvt tygBN"!I&FR[טIfC>C4Rq/5iUVd12x;f0b"X<|q įZXO:zXȧ$qfvn=kX0HNRdM< fGTj S'Gp!ʏt6mkG9;4Թ8&P YmBDx\9gF`<&/_+xUl0j,FŜֵۻb:v2egu3^3&wCj]Գ ] Ȣg0p%k&Ed? FR \,AEg\1CQ> byF+F7 ư.O.USݒ&>ҖD?-)ϞtO:U{Rړ>.'UrOY`O:}=i׿'<9}D0i>K-]}JR,!u I3)08TꐿXY AL)."5nmk`t .!8ޖ{Q^'‰OPYh|~z57ttKopg'"ϽۈF*@ݑ"]Z@ZP{[&jp,%KbQi$Se}\VeV͹u."" [;ES8T364`LMD hp"r'#ɩ3qĻLÇc1Cgܸp f5x\)Hk0H| gOnFc*Rt Jf!9:Se9iYS}5S'C&.ʯxп"ur|a}%.!qH:X^O97LM:5}YMгk!Z,wD&l78;w}ym_[Dyjʼn_޸Ff&O9/Pk-hʀ' {^W|[sm‾|&ǹwZ+sv Pv$H4fh6:ASP7_ kg~S:MV5Rd}I !QSFǒFΜz)+ vxe]˔pxT;:i˓^L&#m0Ev [4h{jж1iBkI2/<)2H3+oMXudAoHّ6 &FCW +RMI:*'`T.&UbM75XC׵ZB{lo5mR.&'_[r2u񽏭j[50&bO7w{N8+&nG?K)95?>DJl]$i AzÒbLG񡫛+Oi]tOEo+c^0W6B4uxV)ӌUYVa5m. OsB{[8EwEޭ]iMgh+mXi\i+mYiNNSsVڹ(*u^[g֩8BJ# J),1U&+}iFW Nv%b 朣 N{PѠ[ҥRmLH0'o6>5>͚)\Ħ`@SyS_36KMI:! 6]x4Dv ,i(Ƥ%oI>8x0>;>ڭSVbĀv EC濍!P̕n3…hO0閪 W(w2:9=Fu'v_vۍ$WV\zKh8EJq^ ?I= mcG(. F6888("kjJ0PkDYT1tj[n4N7ہ 02Ÿ%r#%U_5:JvQd[upXdq.v[\[!eйž O SYty3H4o!M_̎#`z;-ҟ{e ?dhLJ]4zÆq9B_켸SqgگoaBa),ŦEH}=cʅP+/ GkY1I, #(@avL̆WkDU fy{ 8֋g1kJMhD\*7'Y줛7+ƸLh/ݝ"-d48H7F/P@h}B%iiFP$$[咂.zsMy6KؿUK&TY3.ʬM''6Zx EzGƃ?rYf*h?Fm' Z1KZ\KTMȹY;>tNwn RRnnc! ?o¸oĸw 4JP vݝAh@|Z{u=f5XNДJ!J!ԑ:trUWzjdX5):mkxð5& a$'0{3xXOzN{-/GmOjѿn9[ |[#>w~txu)JN|m@B ';_ Q#a/6ʷᯪ됟 ώV&Zݴi5QTp'SmhrU1hfKi4yX?lszlHsL6sTTCI} )L{V-Bf\mb BCGMb..mnLgJ>37yrͫfqm;lr&M -pKs~πڀ0 <-6A?Ab'aY` %%Vٖ2RZM+7SdE"+۞zU/Tlib5Pe* C qgU=xFuԿ4wrtS-嵁IRz$UFU5|o 4K\S{-.Ҥ#vw@U|܇+zUiGDյ-#_s>?q9^F㢈P.͆ 8}%T@.f)M6^rQ)֏Ǘ>8M|O U2Ԯ` =G0J~$:rt؏hU_P;L[8PP_% =ZPbp4ۯA_BX_4L$?vz =ºvґǾ&IiF{kxm}hW(z-FZo!!/VIfv{ߔp#DPU&gM$SC4{/(=S0g+/ 9YJbk5mh:ʷ\]Nw yڗTqL2o F誄o/r<@5t@&Q?ۥmޫu +bpCSv=M!_M}b/ OW>΃0#t+5ā/w΢Bu'uжL@_ \to/5|0~n"Zq rPpH2)n4({=Չ IJC< bXhЂ%) $;?D;P pki`Et|mZAI) e>)j ^[I̴͵u1ȫ QYW+ߩUv!u^ᛣ_׼Qa6؏uh*NQ OIotVN _f_FM%zb!)Og+Vf {ޠyuiϏYCޅ) 7R|4nWJ%{q 6R $6gdú*̳x*Zߟ52t:d9;a{dV2+٪Z ێ4Db=UVq׮(}!juvmg'=anyN#uL`teu.Xؼwgsq%<|ֿ>H+Rd7\q퍂t IeinNɂX'bLVIDHy!#:eOQ*BT(U*ft-D0mPMZmI_tYW9*S"ʕ7So5u^oRtUN.MuY+Eܲ̄BX ܯO B_}Shto$Ǥ&%r^c[\i>bMU%*J+PdpKj|Ci6_D]_l.ti/Eq?Dv|'!+e!x@o b+(?k$*׊ʟ+|kP7xUXo#Sڔ{'`n l[ ,O:Bg54prѫ\knWS{,lR%\h,aXoqyfF+-ie搅DtQIJ7%)\B.Ǜ5 :/hR]tThSX9؎9cg#? \K.Q+; }S!HwhYO>\ wKKJtS˪MgU[{&]M7kAH)]V!n|Q7}JG($( j$*(5.Rʑh~ GP lCJ1QXwV\kqioZMYU /CI*'kh'gh}+i6XܮW 邿>lxL#Pm\[rg=?UQ$b39-"qc#4RKWdnk稍ʿ/ah = rR\ zSJJ)@ mbD^vU(M\Ȳe"gѩCs/}מ#sc\pwx{TrrmQ\i3sU¼򭖮h3&׬9r(P)VhQ7h>JlN.3_ČTբ`#VYFN{M-?ݜ/iY=U]:)h7푐W]y_6̑j}mی-Ɔ^nދue*bQe6|o_ݞ50;q=H^ Emn$/+RqVVޅj\(Tׄaj**-:/c/<#Pm3YZJVGL}mjCU1uv{r=&(65ٓq]Jʭ)Ʀ% =:R;S] 7˚mCmS13oW½{o-6qR@m$޶v>*æ_a {8̨Vڑ<#rCo4W獀 bx vд |VtGzk<4ҼdoCV^@7O%băy5_Z+l 2orlyX±ҴE#nvBTlPDbu_|w&xV)ÝTIOz?G{RaSy'Ow%͒9VW_x.]3nqj̽|nmco-+2G/CsP,:sHrl?&'ڂD,T-V2u1n`l2]$dg;'?=3ӻ&bv!>W\>у-A۽J \'A+<-֬^yddd=Lى,a/`j4uKTL5 ؐ9Vb_al%\ m?Fx$AtyQےI_Sn4J"EK犽%j575C6(q=s11'`THڮe''BU|D0ߣZ{Zrx$7(*6i HM:`>@ָ.Nī] 8|Y)sP(!P|zS=Q#=>0_3MRǑes.<͢J $4)=T!LkE演H Q'NK2MFSgS% >}l0h}o/dQ&g(4qT ]Ty. .b>ig#ǒB2# aXBHS(ľ&ZK_C2NSڧTTE Ieۏ֍OQ(K JܤQⰫETj'ހ^ 1r&<tA{qr&SGyx9XsK;9`'_x3rQnvL&"V( /ճӬ/󬤽L5so:]/]YCq6nԘKv*%=@yǨi]ʼn]f9(i/k5t򱇺ѕ"[tйpϋW$dC ɃL:S;KAU yf<?HaژxsbQ?56_ 1&4,*S;4v7].P;aaaꋪP&9tʺl*gXP yfu=Ԋ ~s(N:Jg]测 %{Ә/!VOe2YDJ MeHRPX;ӻc:[0=+F=f@xh^rwO桿>7RPŖl뵐e~/?I!p:9m5^oޞg\ٯtqRuzRrD(UFsK՞ fVu aM6"/d ukd0n`٬ e]dxRz1~W/Z.K~:׉d( P7зyj֓8 (]XщzAR/A+َ.SuԘԘӹjLEő%ڐTE-s9eй:O *)7N"#A>[pƠf/_¾̸/o!7us[-'7![=Ҥj.cO^ZMͧ"}ʳ<{=.a.6nlqqm܃ FN l{:]zqi.\س!+mT<5SF0.Y\%3iWMD tLur9n,pcǎD|-vNC^[e]dd{dz!z/_zaK.뜜>mNd枬&zz*,|/R~`JpH Xu߆o+oowUិ}s ?%ϋ}Ci<愒ї.ޘTV7slr}wӏ; H͎t0?KI{[ʧ5ėd|kf:ކN wݿA5n{{*̶l2I|( 3Czݓ:vH*8)chH 3ҤG4)^l&]O ړB\KIy,| Gm!E!/@ݏ!a"+\Ê K!gCUڇg,*H #xyܿ8dt=G/h.p_()ڷFcf廇gëhi4?^߳03ːqm8;~rCP'z^x'17z kD#PO\d1+01Au{6OH|%7;0RFXAɋ׳AQ˳7X}u٧7#4QkrC~Q8>6Zzu Fu>ث.Yn7֋Ђ"Ƞ9eRDx0IhOrpn_ ;d]̄3sf/f $dmG̞o:+t:X?`M~S] ?GZfoqFsiqbK:KS>2,t]XE(9jr>Nx:{)hBoK: v !) < w[})u 4LR].:4 )/ܓ85(|5gsJ3 Yh6s ~}ZT-~2-bPӼCbzl| ѐrbY`߄nLJxtVrqԭ5֋IhHPH Z\c 5L\^lx Ulm^ i *B:2k,6RI}Z71#-ffMA2-l LjKXrv_d*3,%#,&>v_:7,TJY]hvUoj(%TXDBeT86#Jk 4![dw1cB۬69z2PQosM$'/ "-nۇ1@ 2kcE#T(?8u+ƂIj[C?BNUxl5B_g͓C6ZIU͛P1I!2WHǜDw/ MM pbM➆EwRkj~pbXWv#lͪ TۡrꥂbP6$fJ*yȪzɷce7pj !n6^sx쐴oi#ˍM))U KtL?Ɗ3'C|pmKBrg*($NZR\4DŜ@ oiI:%Xy+Frj'>ZUk(kZ:ɁϮ]}fpA82 x )5i*)kDI{'Ɩ2$}ˎgOD:Վ\̾vUx=+y)vJ'itZm)(L\&RG\/A}Si5$n1w:*W"&n%Z34қ:䧰#R蝏©7~:yc/` =guJ&{$2* ɪ֋=i(ffCd>Ӕ' HCA-̡.a/߇1t5 sY߇Kl_~ӌVnTh]+j=G/ݗ_2ph#au;~w_M}N5W}h^n1E?a\Pf!.nRUE$lQD bۓ-9j(_QpϽ<`ěpcX}d߁]'c+٥k +mTU^?FUkO٨vب7jZUw}T]>}ӿcv}ZZ~IXB? )ey9lQ{RtXR(耱:thK 5E(HȲ> 8 6}aAE&zN!flUW@ca͹o qۦF"D}M0}׼`˷%ȋOum;;bdLp~N^7|V E3۴M~NIw> <ٝshmՠYX%U<p_y0\Ep}~bHf`r% uT܁Ao%Y澆a8F԰e8`ϩ۝V*a0Z*}i0祶1DFskcBӼku: Pmxn;K^),& @ߜ!eJL+c]Ry  Y,۫B Ok[<,XWgIZ|}^Ϸ~?o\SeWv"r?J2aߤwD=ȫa|pR 2Cb_vjjFlD~BW>\lwQ3#:Djej/Y[.Ez&WM !FSFH#thTsRB1=TEZ/S&UeQ2j0SU6'Mao(Nm,OF$M.A¢$km7%y;jnJahژJ_BS8{ybw=l:ΟDv(wɔ)D[Ẽ1 eº3Zՠ_ R6ŢM WYXRl4ZtpW:AJۊ {z.z$x̏\_C i&G( مB ;g?qV<&?"w3hfYJ]6qQX.gZ)830iXXj63xe_kxϷST_%f/dvyM&[H_lDq?70.]`W?ޑPEXKzm_ӗ~[A3412zc$ZKzL0 <"T(8S(({\;Pn,U3/&T!gp|>Bn7CJ >U/ @ܣ@`JNta̘t]%YMZ:xǰxǀx80wf1FwfP,n(u3z!ll8gX J @1-5^HVX}ġ(tRpG˜"e :o~@g1iTTRuFYriݤ^?ǐ',ª_U9WxG2iEph _hY'!W`Kx5^^ɭZx3MEbτZ~Tw9!"R0?fXdE-~riv{#]՚R[#82Gg~ 4IjZJ7z&( =R^vN\fĶ[Ɩ^ H j-^ժ?yp :Ww= w;=uV~ ͒i# @#7B>Kv2_'Nz8輗p4Lԕ9'(cQ3xoM8rn?=FP8Mb:?L.g[#r2(BO"!YrM~VP+!=?aP?10$bZ͠/Ko+Ah 5T.po4z5Ь`qSOf7D+9؇9]̓.8aZ:V!2V55=DHO(ay\}.N;zOb#{l?c~ҙr ~  >~_敄%r#qۿH\@4<Ҩ'%iwm )6Lg>?aCBE=R;.}"w#49P8wD_0O,͆I4G8A" ZbPS{DxSW1>?TtK$/Iu"-ȅ &6+oYɛHi6sw:XlyӰ'%K˝-7,[GR,:F,U;$s ;'Hd$%ɍNPjg.jS[UQoԏF;TJC,nʔ%֚Ry>n*O)[UD|JZl+K5Yh8L(nx5jBԨ+ԮvqfwAHfor;M):i9StO4e }?E+6U<0:0AWNc@M֗RƓ3pw2d.3'##==4"Ls>`ϙtn{J] I;Yi%Sۺᢽ Mr; zOKZ5Ez#yxy r{]ݷJv3ǥ'NƳg5_{󳁽OO$W(yi[z= C6τUiv3һd$(l[=>v͟3Eb!xjσ"j{0=*fS㊆PJToJjjj]x xN)uWM"!oPx{އztCۂw]E>L JV[D!e+.TUMoY8N t#MnSIۛ"_wUotΛah;cwaavA9}z yK ,Ŧxrė }q%87 Jex-2 |\ 9n@ *Zݕ>bS%cm %c㫓&"枊NiWkb?cـi[k&%e/Za4׀⵫^o*~1)fNfN`kq̲r\Kf{QVsqM{xViOѼV'>$rXc4–+`00T]cܧޗս5$zi%;D\" z 0rH9RT?ecn޴d^"CX, OT㼾ӴMX-a0+f7`^jo:v0ifd:W=_ E\0_7؆x+fu+85\qpݪRVPVq/9r^R|Qހ16 9ZߎVY`'"/'f>t'ئ\k/.hW\\;YO]ir=v{0zVъ&l)#Q=Osޖvhrp?48\f\I)יhC(}y/kb]OLqK{k>R|݌Tbxe!wI ߥEW|EX8)D:/+s*\`,hR\DA&uבnRkYn|Nӧ4}:OL)=  Mo}Dny>(޹^L_ƽn'3tMMmdf'RdqzזC9R`6yԋ`D%c\n."Eh5 ry=eOGWbMaHE}/=3p0!ΐ!g!9 MhYDoZQ iUd!^UQ_uϬ$,xrt9Nk9*g3KXzjh9Xir@F*Z=vCrO^ïOa;0UcĐ_XOxMwІF02;vjv3;8FtZ 6X^3ކ_u bXf4&_jhn(os\H@nemh&A|IsC ^CëK|*;i1 f|"t]@,hH'`aPhQ!q^^u kgzwLmi2zD{éŹP[@:%xgJȇ&0A]wb[zC smtr/r|~a^yD!ڭ+׉~@4yP$j-(UcIXm )iU{n䥥75< N!m P 'Bj(u_$ j$̘M~u/r9y4Vw9`(g=Lk 3mi׻#kj!+55^VRtyq4UTӹKEő#ڐTE-o9]3E%~ZēXk=@sz_ulyXaBx<&!3V,em@yww=3so6Ε*iApw2c!T%9iі_iR5e&3GWVnd)wp]g1qc6lUwwZ`Z5i4[h'W;l62<@E'L! VrKd^4pcǞ꫄0ة.NC^[EIFD|A~R-E{Hv9uNȻHn.7Y]iWL,|/R~`?p(xB9ŒoCU﷔BAZិ}$5\nc9eA6א Y0&|),=CmPX;Ǐf`ֱ@h:0;@5\Ig&r4ݚ/x*fNi{3۩O~] w+ jXvTG3Lcu3ʵG9z=gCF<@w.V E9 JnX}6"aBjE)+\ K!g:Uڇg,*0ƣ-$พ~돣~4T\ !)F2*1I"v"3Onga4Xgv;Zp%~ W.+IO]PCjH꼞h0f; ٠?MjS"#y3(e(x0Sl]g[go8GZXvkO#4*ķw7 s 1hxkꭣ'ɫYcNg#.;ﻝHZzQ̠9ގ0& >`挛W0]FWȃ.9W͟ON6BV5E6d5|ʣ6׈}>LxW |]#(b!_DtUy ?( X&׺o(Abͺ*)(P-XhG~l$}e4 }ys|{OK4{3H#OrA1{wi=ԂPvWi)c$K%%0T僰V=`!De_߀&,4/P)aTE3 $vhN|&*P%j>dBG>\IJkSL;B6Ev!Q̞hH,\Nc򧙳9d@Ǽ _Z"V{LVD/Hǽ$nZ? }O0V"P\IڳvƠIXXꊼMZʑ -AiJژh6Y3=0ƿFWٯo/kuּ :_-WꬩHcfbN89D[وt !9[%bVfoXYp2eȋڣq)Z?:BAV&b$'f$4pH?UPAƑ6 >WKvOWƃxNv{iޯi'[BY@MAC̵5&!k:OO5?,'gÂj5tr$wÈScϮ{:}_+-?HMQSęG7ad8j+v鑉mWJEP7zHZ҃=HtDc,Y9Z9G&zmPY i\v]=լ7# ߙ}`B'E6!mb61\D25"n[Ӈ[[~25`RtT֗n={n]n}C4O5珟[K >}0RVnb۶ )2:ĺpu $7c[O6|B/T,wCY.xϓ}#(PD6ˑݜzWB|I dhS,UBcp̵A@BGtnҤ)udCv I逸sSfL0I:dt/~<ٍjGo3^ xSj];sa^^簡z<3t> S;YOd} &;&! oSLBMYRt|`'~;F"#HBں˺{x&J,]d̬ R3뙙PbrOwy"2M"= #[6#'nyaηI|(\`vnz`S xuJٝ&_&g+ :=s}B5}Cɕ!"{y9;;9?WĄrZ/yݞ5'gwNKeCg? N/X%>w>S=,Cjh I3ifĚ.-Igyݲ/D5%@*`̔ix"]*@.v"ôbk˃5 /2/ "k(`"A-l~AIpP VlG}(vj ]4HO96Y"ZҁS ܆>Ù kvBnK6'N#CV&q֝y>C`"' #?M!urT"JN%.Ǜ\Q8C jޖZ@Xv@zHxE'2ҏرh,DXk-[GdޖG'u_ZoKn"~0bo}j2}q*".mß~-?Zv?`-T!i |## Tܞ־-䥟`"8 HR2pNOe, ꛪÇO×D9K2Fhz+%U^?ZxSF?"گ/W'ZA$nlh7ӖeWzc썺Wf:^NK{RC=UIH 5àzvOrT&z{U O&IB$:7ysKs\x/Kse)Ÿ0y?-8<ҍ(qKrVT5QQpYJe-ܙ5XkY);(hU F9GG)xRL{V`Œ@ 9 {ib̻hjA@\?n>ۢs v![:R ǭv=C8m%z>{ι@*]ֺwAПO}laAbCY|^i8?5@!,OsBYV?+ gBYwV?+ gBYV?+^s!̕0WW!̫f=Y;>d _ _DFtI~lGIٱU@*Z]Q[ӽҥB+O՗D+gA`qTS+|+QĻP'Yp#8upF R w6[C~̚5J,ڠnT-ܠm%ׅ7a۾`O:Ɖ#V'?Ϗq{1N$} RL%m-Vu!K , kx-Oi)Qv7lA$s(՟ /1_sN W/զ <2lۀ&l1_ e mT_XNY~ؿnr?F&J0|Ⱦh _6Y/F{*ҐEfX)ņr!Ӏ?:Xs7ksN|{1@I>#I}<2q SLJfI8xb `$9BKy|Bh.RKgP D $BQJA6~D("B$Ht7 j%EV._{ PZ$1<v ?6m~P}ˆj/'8ۋx0b/q/[~ [%> \޽AkW`ҿGs?,$++VC+c"02? TX) IB¸MI \3F*;SYӦŴurvN=XkQ4' Rt 4j)AжcZ&a9;z_t4kAGW˦{PB\ۡbIC ˴@ $MUCYA<ͲX/s{`hÕM,6Fv0 }(S|pٳy6"*`##&SDsy6ԀI\XR,&d1;xA3#آ/x6oca" $,M%,ʤrKDah0ԣҍ  r5Muԣ<52\A?BMud:3J 05:NM@PM<( X5Uρ JP vݝAp2(ti77sF%PT$J`l ɫ!!Qjg{ctZmNz🍰}{y55]- yU4H5My.P#`9.Ƿ&X Ҷ'}zYCz[jPVh)t [?IC7@.C=ŝWws`fw;%Oyr&/\s Oi6]LW\K/ʏy"=X<JP!ը5+_aʫ :@6<Gt)1n $uę'X?_S;ww̩}62WO?h8W^xȿEݘ 0ʈw-6ca +Yc'1:Xb.s{;I91l~8b⇟vck_h:-k9/Dy$~1*s8űYq޼Yӹ7B}F &6sbg@}_)9N)LS<ո #.+"0pyq5ݲQ<3VGgcx F"{~P8^݃ 5:Ύ4b^@L0l| `]sHDM|9p&xbey կs>ʴӪ+ +g,+fGl.`$EMD{ncoT \F b "%jk=ğyC:7t: >w/'GMpukE 9. Qʀ1i@=tkM}u }p ?WT6IfK$`b tPg6q!QcLO"¨]c獯G9_4Nz:$uaXlѷw/k| gyMCNY|N#,{gwb\ =TwGyV[M TNj* ST\ xl.Xm7*Oy̫xOOthHsՖz۟˕@ޮ[d9˛;xےsҚK!sXxj7}7?@h _< soh(VI&-bmkP6axj=5jWpЬgyM(1֚)nWdDg0Fy{ ?Y-P.|520ܘ~BY~ t_7W Fd$F~aHeT$YUb> }F@9ۙm(4yǓ6wCj'a&(4аJs{] v*Td;;nbS!lS qUvvdJT1җqBh(igjgWE*:yk vJiaCiZxyӂ|b96T %Xyjlb TFy^B1KԼ/[ K;/erٿ°x\U٠^nChZW؞'Seؒ#+9.GKP^jڕFTǼZ#|5y܄O~Vrt~77.k_=3ۻ`0G[5! 11Ln;vCaO+wVJ۪T*^K҆t%Oj-ykI֒gx]]rXuΓXKAk\?o2/b6yĴ;6& #NA aF.P 0t=[ e<Xq7+zJ3f9߮zkml8'cF9\IŊUb'lV=u<'pww7G^?WU}ߒC7,k2zX׹{Gž_p 6!#ğo.b]^Ε퉂r+oP yNU~%PC.Z\Wz+M sm\NHs 谢Q76{^[!{t_E<38Ǽ^wSv=}cӎh??ͩWY" Wks e׃@)ɋ]Y)`&9'H<Z".i?42Oܒwsqjw}ݵ)qfI~XG-WZǣ)_q-tÆ(wtӜu=]}J{fEᣳԽ>}αUot\[;"F e =-e:5U-eUm%G%]Y4ЊVaxu78} "gRv(ao44z.~)/ sn]W"a(CegAU*Onڤ`fDr{gR+vY1";ێFZI0Meq_""de%?Bck0-46'~ٔu)EO)S߮>e9|ܻ?6gP{X=k8v/^m#{EWW ɶ/k?jJs3yKA{lQ䖱jl>:+SM]tߖpio=OGy^kS{M:x`u9©v3a*%NTC/CEmLC6j97Ҍ^\V9-|-evZ/a3fىNqTy|+єʷڢ]~*ߘ]~N{ǀuא]jխUa>Y.6uSvwrReSF*mlPWyL.z//ћZSc 8ڻ+CcKc|oi{H+/ T#s81s/>is[]Q,4ڻK8s64@/R) %軘1V0O}~7.yU:YJfynDB`i<-\|k 6&_FW>Wϧh?0b*;ٺ|E6dN^lm}y8+ƟdZ:lh2_#9Bed􌌐1'">hKieLJ5Wl|~%F }72/7 rP"`Lʯ!y8I9=)7- ou{ ڂ6RP;! 2vd>2qt~ ~Ւcw_?>lk)GW0JyYkΊ{]אi %#}|;ѓ~q UtA4;d\"N @D(PyymSdENS~z}ifQ"2 ͔ֆ$"rIb.єu4s VtːT[8` R 'y4]}:;h pOj fӭ̦cvWN-4nvN^mrg\! 4@ky$4gl^O^h\[55i%ΜMШMT;VJj}jLL: :SFC#e4LDdΒYB֑♭|з1XK:zdqJ4bv W@ˤCLa"L%g<$ՕP@ ,VH+ .Mi?xS{d7z .`A`l;Ͼv(RuM}mߟtY PH^%qY8{70܍Y_Dr25m,|%\`44;p%*60|j온S8G+>-ߊ3&tV]._E:|@ l=@~R'. IἷeH">3'7"D=zob65}HEVݙ7#UubkUOFy^͆$a7\Xj(=qSz辩7WzYr#&lz(&MY)̑)ES'QҀO "G9?IĜ:[8:]Φxy`Z*jҙP'Š@61SȃUS \KW,|8PL^f$$:bս9AďN7ITm*ثURKIdpkB{q[ZNJLφ7Y> B'c lWG*0\3x.H ?qRA6(G9:kKZ+╙3J:ByֺRlcOp Wg9@M8%8UCcz嗛(G(+}JY?BxjKOup lqAy}y+)»woT zS y^/z7d {873xk.S$8YO*NfSD5}C YUYߝ3ZnR"XIUAzhYC*\zCSR_ dOYaIGM=q~ OK ގ1i^R 腙3Ǔ7[8ۨ4r4bp~ ``1>ܓ?"2/A ҺYRKu9_Ažp\ݝ{3wy `E<= |_Ld*]2!@%m>$mWθ<ⴻeЩ|N7mocQKA(ڌ?SαYyBCf_7mզ#8, ko F9gu0@Y1݈"+e>"w/{?Q4{,Wxv[d Dؓ'l3,oE0So pf8Uˊ/Gkh2,eiSDS:0Ǡqub[F~7WE>?j.XI˩s;*Flev-qv3oBƻ?-n!xj¾}U' V[KO: ZlkX<azUQC֣"dfOXh؟8)Nd|7agAx7M3њ~U`hF麔0Zo֙mOme6\ˆN;p>[ƫU0eP7+}u}ZoB'tI`W[}z Ѐϳaa(U5puR\t6(h($n-iSZA]3l);y!q@|Ӽ8ls rQO& aux 3Ԑ\f'o۪w3K9 (ـ1BȖ)EVE'5OXe|:FC\RE`i!@/q7FDcF;s]aReJYu;C{vVo@{5u}ƙ{n:Uf!u56Hy{ a)GX{HF Sܫh{^?^BP}\pt:L! uRS*kİ X ?x~x4pc0PT% N(7K .ޔirWu 69[:y>m:mVhbm蛷mzɥswp)Sn̿WQ렍dF uTk]a=#\LjEDz% _tǶή#bp{f`E7C&{z4"b˼8A# h߁n4ѓi<[_Bz%'p4beh\MTiqXgDSgE w;73@rFg'J/yZe-/; ΑkgY_iN:Mܤ-~M{(@&Хk6Eۢo;Pk1yzl^ܥ{<ϱv>ciwzZ $;:wW-R1; _ /qPF|޿6ں5[h'eyQ`] 2_R4o{h˦FotVFĂ`]uL #~|yӿWc\.[1TI#Z`_Mᙂaz` ܘVّAC79L}0,BMh~" n5TUR# ;Cz/e.bB?ɽ}LDÙ;, 1yqy٫.0{U'HT,ҌmGND1tΚvRf9g `9i{yeMnE%<עصjrI^q^d~\|߫hp9Npz/yX|8fq{uC]]u~?+0iRX_]ڵ ))+)1cs|ynT,JՍ V9>`+rqId 8do{ a\-]w,R\j ՌI3]czr(<2 YˡVzlɧFeGK~fV<}72$ p1gw^/\@L !#r7r ѩ30,׀rמ\cu61$/(֋r~kk衢I2kc^/ W֒Wȓ2{[E\h w\1-)0\ĐT97dҙ =(h-bxq)0^_%',V{JnLU+B E}c#+?".)9eVk>ޔ`pÞ^܋6m deռL",kX:D;-d|IM:4/|+1o /Y7*K[KuK_)B[}IH*毇(/c6"ee|>[u70I=\SF +4J_ojydI+Yb%|x/`.(|r#_}p|­q7i@.R'?YçKD$kWJXl3eI_L'tH$\Xr4}8aG Ip_ &|a$|&a81Rb3/:հch9*-~ eYX5!V2|L`,>SHWҢ m>(KCi?>t.i#n%/]K)x"k`mo.*g[V/k|y]SAgy(Y]LO=(F}4BzYEh,=~,g,d${mKSk.TH5,muM}APdKs-5#4!c?״$kN%,UX#v$3 -\8dޑMh#QMHQ?4iu,*i!DA2\Gq\?OVgwZ$K?]gQ-?2V^q\Ke|`[EV3[yDAhF6t@jJ4kyW38]<йcIE,{]c]%AGyh6/9@SX y9ŪՊɼNP4*Z`qKwEbn߭2ҸY2Z~hLf)F^b/$t}vq4Ex1РY& ٠o\Gk7 pnm@?ᕪǼ<]\߷LS1˛js+}|^ML[ቤo[cjBSK0v[NQNZ2g BsזHr!pԔF*,?oF( (Q\KFQ٧# KS[e@y Y3y27I.M";l%HD0/|S~O?$e[x~]F=cE̘Np~˞uã:-s&O/.pKJFݫtzk&Eϕ&rwe&7kUO￵ܲނDG3O2ɺ.>IJƂT%'Pnuv>_GIH=ΒKdp8A3VY K.t9Iu=g#rtV6]蝛Ίq$R鹦q]Ʒ"ð]6nj#qAc]- ʕ܂i6 1|`T)]_%<2.;\Qu2>E ?ҿZ xl$=n۴F?a^-7r;鏭 .SKp9٢*v9jW;Dg:%ZDKpDue6%ml6vA ]t}4H$Au7h8fI$B JL"wlnɟ(ۚVBTПwWw?a7uTVgW ,جo&&]#րѸúO,Ha5r99үj sҵ/+#eDZ+co!2,9ųu#?B(ȫ"05*khrB -my?N'ϿB69A~閩ÌONN& j c (g?@~$jB 8,;}J>­sUp8'$@~_.6!:U@"x,EvN/fDwe PbWxh2"jBz@@օ: @,ɯU2 Xܡ7;h/).)w5o˗Jz)"NJ^%=IGNu=دjD;zڹ #ljO(;Zi>)K[ hε//G"bT*T3 8OrmJ&!ىZR ߫Sr8{TRD湣KZY{Z]n%@M8n%;, -K9Ǹcx:´JH(;h eю1|H5,nsb:x{EWjyVU3p ˷kݦIYt 8Lf־EhE[.닦4c@I%I(lL =yt\&Aec,DHX6 FHbA͜>^<[i(!HnI&{H4U{ rg\%B`YNJJH4쯢 c8&<5T:ȽT]L_u4Ay2џ ~ϓ)ɼ9ǵS\҆S጖Hr\\&]岽eCWYnnh|r\XeeGkoYO|z_;aCWjӡBz4&6Tv$/`%="3+–x+U6g-h rP6k3JB̠Q7kUzFLv- 8XZQrM3NZY˨V+y3zu~9<{G*g`5iWA/zR\7pj=P|Oѽa]|h_N7K ({0α 1";3#;aɬ.Zۙ_8V_YOtϸ& 8JgoH6<޳Wνpi6&ˤX Z I DT0uCf? o@9}G|N)x2IOǎi,M/O D(Ad́0͛j ZMl=]7,#jajytޯY|t.砣!gl~ = 6#!#\ @TmZ0pU4,鮪|ĜVW~b>|^,˯9$/3m:@ɥ\zptK\ߞG>W971eU{RTIL zNeތ`zV}p]+WlB@| _G#`{9nyȋ;,wNNg0;/գ y}[8#ЩtM3dOA!rRd%~^uѦF hsoȝ-5 $['' j#atNSv 3.i"ݪc4Bi?;\7? ӣ5NzŎ=8YrG-iOek@}vUxNй7UA~sW^;*ZLZi?&sX:h4v@Sq_5 ]Nv:ŗ_D㠧ݍH[|HDtK,+wqb_ZG\u./@ ;Abt|{LBWkr-c|Ѕ\M]n }!Jr#AaӻA7E5OakL"2,=\kTW2JuG(p|%HihtB|lud$򜯍hI} {1@d6&QuχɔL䟳d`dR£GiJ{"tX]9?I?8 G~Dt7!2wnB(d V&va/% e짋^r֊L'xRf=22 (gophߖ0K5{U` Af |O 7H']5$ك4 )~5lţl17fvB0飀'V֝2bgTCn,JlzJ$/^ջ/j% ŽK(&dad=#L٦Da}#8$~)l-"n ]yp;g]$dEo( ˞zRs8{$ uB)B=QK-@eM1{N՞{U;)iO> .RwX W𖻨On(WqAeN,'Q 􅠚7p?9B\RYI@*WHl #g'~Np3 N)Ҥ JL)Ī-E)# R, 1"4IH? EAx{.? S No@0Z}.%5L$ffJe>bh( SPV~+?w7@8N}D F}qMpUCCYth⏁L#?>j{.QM8L/r ENg+n17O?#<pRw>6DCkqc×+.dBطXau') >Wso7U.T]n\&݅J[6,o<[}mU+z;QUALlf+ ;;xٝN5ٌC?!Ϙeb'K4NZ TݶKsvh8WCm|lK5:Sq[ =;E}cC /$"=ԅe[8%)p[JHTfr_\LˆISn)ZL~A}yn1[,cY)u 3#u3r9^Rmv]r&awRon5RLw]KM8 fQ/ &㊝Df<,~Μ-J&_A'L;p6hEftb͟ݟ5a}UN[ !vk>h/wsNV&(5Ev ? _f7?g'GM 5ǑG+{\`:)7%-?ƨriZXx*rXP?=]p:b"hE.w6 aG#0vbH$Z(r>fpn.#M p/ţ/1^XV3Xsٻ,&w` q"&yfK!"gw6v(D c\֛TFioPW!\^u"ߌ eu9" "Odl?R=}FFASIDPZImRB_W)o(:X&Fꂢ"z'a47/ lL,.G7[QF`RL 9b]q v=hgю izڙӞE@]̼3 _~.]ܗ b+-L jNgM0q3D/9b\Jް.IL\mnbcN~#V{s-0g?㫚KܻpG8/@\8O"0"$ ·y!(yL{ ^s̝[π Eo|6IS1xb|e4e}{ U3P[~jej;ef^<;sg5}hᇂأ&qС> Xjej;&aO0?=%kYdώim(}]s#ik s 6׹ 'Ę"(pNf`or5(BxV ,P`A-?@rʹ6X LnMɩMhM-uy>CD`Ysmo[kJxM(æT]Pȉ2(Sj:[ȋe.o)3YHi}\Fch:҂fL^sc(܏D *ݼmO>ǡ<"b^Cn3<)HZ|25]|D;wM -hpYn&#Npa^Սy-d6e,mH3q4> Ղgi &1Gl՜J@ڗܥNNeֻ.k%<|p-L<5k X16\T- bлhqa4 y T1pHt|3w `b.!*?WsvYCP6WT{sWyd94wvʔkBoDYNWh\O~-g^i_Ec/  AH{&8YqHHp˽k }ݟ L%aú&lvzEEXXܜs;e% 1 oL vTdr_[Hգqkǃۤo1ܮ   H;\dċгa!Fk8otFI皢+HSrl+?AqD J0]X!><1y܃#VJF^ 7:{{x3,;R z=G3 {v+_J*^ nֹlD\7zF|u`&EpK,2vGU&{C^c(ІU\5,`D`f owrJY8f (Xf.C|m2:ܗˎ;$uhahPtz Jeծ:}~fgRBkA&GQ翜:}cf3 8Xv?XAgBgP\&SQBU% 87\'9!!9ז L#ˡB0X.;ƿKV:*zִtA"%V ꄮM$W1lZץ T;é&?>_śKxq7&odJ gQc e8|Mq%A}NCh:g "6Ә͈nF+>`Ow?H Qs>r|B~ǣјޖ?z+5% , Ev8g29ӺPSA{;/[kM Jy7I.lD˩,P#E+uo tkT[hƱqzSV.|bwdaR wva^4gzϥ(mAFKx`v4$iI 'mκ}I@MF\!~!%ENK\kf9ݳp*< _ەdTydֿJUفSŒ%rךD+e@P#Tz~eS9aB!R1좓J~I P6SKGk `)w^@SQd]ׄz\f#ajL"miE˥R3O|}xtFy=q\!Y=?˿)GN*f rIt{D~*L*SqRB"u,d:Hɞ@=uT]Ν@A`mU8|..cjx"8e=JmNJ}N!?-P'%&!(tXI0q'Zܕ=t{7 LgiaA=Am F' ?˥ve* #uħ'tMHBHXO贺^yiD#w5;ZfA >k8gz0θ8 O;2x1]~GX4ʺ : ]ʞ}sr36#]z`CAKder/࿉ÁT5^I׃{9 u TD/pJt,6< c_*`GC< oGT%TēO)4y$ፘ[ןp+Zg0JhW7r:rN< $#|W1Wv 0؉R~?P·uT;l('Sp=q6zNBEpp'::XI#ho랚e]/5׎~il{X c(Ny^dW8VBȏd]n_nb n$IbMqMT1!.Vc~7g4N$ۤ6` R4 [EIwP @6!,Zh%(U" U}&HÌTHdQ%L}dd M(#R% t>{OX15`,KY~ ")b?"6Cr _S%E-]>$ifOfL`U'.R}km+ n e,7/I+a@0d( :_8HN< +pU(ŘZe%4X]sP=>u*jҶZ^/WQdS6l>%6u zi0aH8aqؚpk,X2ɨ'YY4mVy^gy}vJ5pV?!+ gp$ 'jQĸYI륲Z%th Zp@v(>ΆE jBT\[ڤ$b5!]"vu^{ 2?+T *(KO@ۜ Axe@ҷHE}xvme Nli67N Eh"MP(B+!0$x<P Eh"d<~!V B+!8~-3*BQZM~,тXD(%Z$WA"2{C/8D &4Z_J]N (S; ZKޅ˗ ߕ=!ſwLRR~GF<,=g\J1Dʁ`,( ӭF@LXԟ[*1L.p)ZKQ7_-HL IG)lRo{1']e(c Wv*oJY+@gĚ<.(?TLLV~[SbXŤTPůd(>-9I8ZD^A+v -/Ud/ώ8A,2 ~|063q?> ^kjL@[ՙ]AnyL[Džj(ȭC!RS8?FFAWfck~]KSg>JalW.p9hSTۦ^/K_=ƿU1?jE9V:u/)E4.<S:> Rg /h’kބ(fo0<5Rew{xQ"W &tH$wmim2E )bp;:Vg<2V4ِ\p{"X8A=fjGC 0ǧ[rſ oSlIozoSvm0Ε=jp_d_Q)0 1 Ye09a/W5_PsA.<!UGKݎVB3zM 7wtG-p`0G{̋Ҋe EG@+qެ[[K?':lд4:, E2t2 mid+fQ{tȳoZݮvwGKۡ623{;DCbҏpO4/fծBZoh.2Pא:+ #kTgeBK tEŵ:?@duz۸ڞ> -F?Aӵ Aq~1m|[ 9jރ#9 &i@pj?܂^427'ŝQuur*uSc8-Y:3RJ[Jr-S;{`9GOt% ʖ ֯7q/0\臰V@t` nsFtCGƞ/?G e$EA{,FgYEF qstz &sjO?Lj(đ{!N)'C9ĝÔg R!0ˤ#9-t}pJMّ$0 ORgxsܶ []oV7;ڌ2&ϱN noV6Xv.@/*Vy_9.Y׶ˉQ 2bb_;t{06u^Q͢@0kZq6SFC{j_SkH _!(Tf2{JCn3S[<_CF /cNF&^$uO{n(V ʫ#t~i\G'Vsu]&0Gt#,cdσq JhX 0t@S4WPS{¶Q*X ]RT A;nЮSf{PN.q3zYR%~T/Yicl b'_S~΂~(WV0Ow\xG8\LeXDOy!<. e-@//rS)3);pR,Q^?5ݓbd(O~$e'w>M@e ͎ݕ?X8W>, 2u*]OFO8vYX\@3n&Ds?|YB᷷l31>]i@U!s|n|?,>vp!>>CH?B!Z B:i(!Qy.3=ANK7l}4Z[m.<3 $S #YʄvHtrhW`:P^}Y ڹC]Z_O:ZuxGO6ZC=Z5!>_VK`ЊemXSʝheߓ8yx?D#6̵ pќYb\p1$8Ĥz=9u`m`*`k0 ۛ? X޲-c̅#(xR}:>9 f`Lf);2#d@ޭuYSNPCq|vmyu8ȎЁ<;40Qt{r>&noV??Զ{rEyAƴ "(TyXO0+< *԰JEC.M&V&Dρ⼝iG$;7ĖϜD/qa,P|̿ސkՂ =vaC5|, ftPzpBCf"DŽ]l Δ:Kw\Pp`)"iJ 9e5;طDbx0^a#Ѕ̷A IfNoch`AELfo_<9A2--a=)l& GVf򁜧\[ V-* X"w9)N} ,H\LtX[yCNtDAH`5G[=-7G՝ym`@ [QC1 GSЖ \ߟPB% B* "@[v*$&O^R||UB&Qlx ܯKPLz³;š7W}GӍ)Ai!a>A^fȀB0:B%l)#Za RnLc @܄* x̗!.',bD2(1wn(@ɠnŔc~.gFZqH_vѧxp}dVsD`N#pݖx}QH~ L &jh땉D?*vm/3uMvfi=2$hdsR"ӟg"ӷ]B_`kH `;,SOiEs~|p6?{n=~f࿧㾓1' o]'W+wlzv oxs//5:4@\x4D-Ok+T_ {Bм {߭мA1Cav QsoOIՐ8, jY};8nO6%D>&vx 9T)q7f~-kMg[e1?Ae #)}  |_+x< |g+x< |_ۛP] 8sxo~1⊯S>bÍ <|;<|AԆ3<7oW7lkis9!jee~|=e9J%QB۳熗_Y T A8Ce v%-;^vzqU,%eDJ vK;߷p&ϊ=HAhV~]S! 7Rոb.|9MQ#B͗P e?`~jt IVz=cQxpSQxO/g, r2J9#l=>d>G0nB-!/pAw ;sD\{nZs1yxL{`{ޡ^{X^ NL:+1lYV? ~+jB]?Z۱1Y8G n/_g6]o7].WVX3Iz|_ _kU4,_.Wk-dY V3oL,^^Qm|Z 1Bz^ PsoA¢ބ]J@>7^_d]_.'(\rŜcv!PWL$h=+_NPsPU8.%)o ?`4[OxT*!gdk $<4O/0~ǿ ʉ?C& n_s] v\:Vo+I0BTW64`ݯj##$K!%H߰&'T);zknЁJ%,SMT=f3"V{TnZ-.'ݙ~msv8mAͅ'Qb=IKA}$ $4Ix49<$xEvɒx(tJ?VgVB7I+ |͢:Vd(}TΥ7ررag;7+1_!^} Oe@0&$V%/ŹZVz)4^>cd?Ij-b?cB~τ߅N-`x7؉OAOԳ MBWc0H}.ʜZmXPƚP!*`[i|p~BOn9&VjG4FWne*(+To)NC+X<67h6 Kʦ2 ?ef|̀Aԯ/O}fOf-=&Q^<秢Ao,O~]HGW^OڼhWq'11enՊr#GDOoD{?% ]? ZFrnɥa;ZP ##/|LfrL_/h3ؕ[PfX`Waxnz]CN)I )g3\ 25oD]aV{?Ox)g<>wxp5w(SIoйX;~6i:wejD,6H@/Z`#Qq.Ӕ|^!ލŦ Z NjeBib-Xsb6Hأ#?^HxXfzD~`mЭšTS5TweAyԣfehs~!e9P _ֿ]1_k_#s#hwƤUݾF%\4ңM[.!, E\^-/ʥgn+@Tzi{>oBʞQ~O@ m6»P4F/sn}@~5֘. d iQ%?߫6!'eq0yab w}nz.Y}rMI4zgg焏0sr} zttBc}MBF>2Rr9;s`8A*7A)2f*4X# ve,wc#&`#ޮ^y]iAX!9fUuB7 ]A0R)YB+I\}e4WW.y;jWegBA4My[4]Uq:mJ:wzM<3h)rb@ EHYkm{y|2*J;xp+8oĿ8]LEuLyo~nҮSIgYHbQX` 5+V?M . g`Ǻ$;]OWB0P f` ~hi2@G` dvP{0t+C&qyO._5Ȋk=]Q DֺvU*ogMFRHypNx MnaOߪ|87PK، >}g LM[2}&<cxߊqc.9BrQe`!W.F|`_z;ࠫѓ/(^0V75nr>BaiD\D \4ݩ8s upq:A;) AF:hn¸*X-4Gs4EB] o4/ֈ*En^EbwBNn\.o~] ɰͫjؘ.RMjChrU+v]jXT(0RQrG|oaXh'ڝl<o;4.4`Ĥv.vF$ȠM 7ՠ@qJa^~"׭;V3&SRNØ+L$ ϶F:t>qVw\{_1 >j(q%8RD 'wȞIh+zqޫQ ,Jʈ+B.PR=%IJԽ>fI|EDN( 7dY%-TH2Vzj7o4&Wz,rBB{r j3g[XRXϓ%W\+ƣo==̠0>t}PouKtT{0>0GY#T׊J! ʿ&kd-[J + k/X8xGc{]\ S`HSWgB OftI%j^P@9UBW:}:CjlE gtf˜>a-SgjKR\kr5llXF_|;ҬiB̉YϳTrbaPˠX.GEs\;lD3P\*Lo tz 旣HeVGz?/%{n~2g/Pj s&QSѽ+h⢺moKrQziȨQPL2j;llBN/ZH/e5銴I0sO)\fP2/8횮Fh8^t)` $DJ-X_aGvNnZF)ҹ-I=Zv2!g>{Pav=RLf5TR_|dis &HCҐWo6Z)NE3K[wrp0! ψ"-:'g,eh>'bLNW_-i.EkuAަ)4BE[No 4KtDGyxY|/{.))87X͸l&[ڇƉ7|Bb \)~N_7+6wtW;0$8 8gE*wP?"㗊3nJ1.1^Zȁ7oCܰg^x+Z9k6Л2Ɂ6x|IS׈G|-&=\.4ȼِ@>G#a4O[kRN1zT٦ ðVv:g{}"E y㺏jݳ׹SCkuNiL <,&`"VO⡤JzFV; ᰥr,qZ_ouz]k,bn9YDEF*k$=deJ^ v//MFҢqUy+aQT 䫘Op]߿B PBW|îR[U|xRTЕ.L~%Z aIhApR"K1PfI9vmcB[3-x_0?4JƟQw3Xɉ2 e]l$^K؂Q [;A|-;A:xB^h̉$3k5TCI-, I#yO_W'zͬ#Ĺ.:[ػ @kϡ  TMA $TU#`5A)*PTc1RI'-FDBV}-m~#9b="ERk`^)EJЗZdU53j};H̭1#^ 7j~V{{N_,ZtZ@v#oO"A dj 5N]MރB=!6 ~~d"PaNbOr阽\ 8AlKEK2.哰 ˯L'M׉!!"Eb!^\+eѿ'+J&xp_f/4yPBp( RC {w| 삐+x5QxD 8AY1w|r0.6t"Mh6ћギ5RE8 z_28"-VK{4{8DUw8OWNDpd˳@>M`\f̋&jE\,m*hT1P\cӸ,a11l(Nh'lv+>L+BH mNQ4W|n(?R%r|jHRwQ|Mu76~~F7Q/ W#\$ɦos3Ե,ԋ$k-1g>8iL[%u).͠]h 5Ef*\?4>#*uxP$?yB!txIS6c+^R%G⺁I2 g8b7U\{oZ䫕l1tKR{MBƢϚ u&h1Mj:yL3C 8'{5kxr\# Y˳bOcOejD̹gIH R ;\wi 8#AZPXDԕ (9P=D{54ТBYy7.ä&Z|̐Վ_㥙m9"4,e^+L3!2@ gbT'N+O׊ihr,4V;Yf 构v ĎX9Y"-;FWiEGv$-}iKOb16DEҲ Ū!՜#ʓ_LkRPW6y}m$/=B&EsFÙAuE4\%܀K\sȎ 82q>F˶lO>ew"ҷT"mp_f^*t!_̓V pvJBaQ5ypi/!1V-VdT'濫-~ !+'=5뚜G>\jLx(j15Ԯ+ AeZ'?޽;#ϧ5]K mN8BBr 9ʓ-u>u{F=soUSNfF 1A؋&uKO3b=Evu&Z1 Wi/~v6\n|N:PבP6QYӛlCyTx A0[LJm?V{h_#^_;v|-d%3c؞T9z&[ 0FdɅj)OGMf%(C2g..5Mg2P b|w ^ *k/L1^NRh@{*27jpa/)FĚUpc R3d]A0S*n'cBځb=+Z}l9 ̰7q)*#n26=5+HN&h6bG݇Nm/muYyYdĔ%IW`-7QoYq NV랱])qNe\ :-zП08O׺0M~ykD6tޭ<*cꯉ?x\ף{r1Y5anJG]%y ׀O8NxG+'Z(.O:,G)8XyͥrO.`Kp>"<\W>EBgb{42{Zs(&2ST?@=ř2zP-O{ϩ{n#Nx~+{۞gYqXlARnBmř2=u|(>k2gJ!o]TJkf_I9{4f"] w.Y_טM혎wܥ=R9IdSvQX !qRcFD Xf6Rٙ5*ߝktw= !ހ VX΋I#vZ[ExRFȬpRA ik$1NA` :K0Zzl"@puJjIxO/YPr,!x+`d0ްyި|ɮ/Xklr>,XG8-<:Kx<EeMMܛEe#SJ{+/2یY;jD<[|l㸐<vrRrA~ ;&G~X1 ;2SNDhrת2n2D4.ş^ۙڗGuFx#:?_oo״ѝm!"Yb@DkTڵ/W jyy?'kDy':^pgb{Au4=5 R֪n쀓4KC[b7\B\ Pr@P#?'R)u¨|'.xJۏ[?2;B|C'툉`YX^B#t`*_Q@l.yF6sLGO fbm^cUGu_`B"!1Q0>5 ;zׁCL>p8jGgsǤ\ք%\0 LQ2JxݢIƟZ8 p>]1IP2/͙0׷)fI`ycZ}=&^ҝFKu ox G,7>x*2{~`m2erEhI&jk0.M;ܗinMC S4Qw>4诂j4RVU`c/8"}5O;mt~;Lo 0Z*kcD3f"ڎ>)I(p̊W"R=Gk ڋUe9M@1jo^Ujn.Xݿ #OM)^syOCޮE s~en%%FdX춻'i˷ b^Vctɀ: Dݒj9Ca">&U3ͪ5Zv˂/Жr;m̨SN?@ajӅa?D[S,g#y,]x_kWq ULS܂d~re.peo){C(DٯBQ{ [j_7cl 17]Rh<|vtu5&۞[YFc *^IQO-PQYb]oDnOn6{O'9]ՙ^fGCƯ"&rMџ0p/q~̱ߐ@]p1PP- )asP4ʉ !eᩚc7fP{2yK1B9U3VঽeI)\,'3:sc`TٰɈZR_bCĢ[J)6i gtsga{IBl-9@YTU]&zԱ`]:7sbڗ܉&ՙX<a(8"!FH;av &J) .9:gRPȂns|eFzeq. >L]Qc觝sc VK}H#p=Y;t8B][yw-MGfՎ3'ԨkwζNExG5Kd+7^` ^N`ׅLliLَ 祓LB+KB`2@?lZI'B?άz?0}֪A9pZxL*H\݉=tYXi;T 4?yGb^4IY h<ZE7xg!n5 Q##""Gm%MNs#,@Cͅ5&G}DD, mCP)b7P#E$Ed=\.̍.P=nt)nUշ[zyJ+!1F=4 L8Y,f_ȱYG׳Kw|aI?-&=c%^W8~6bVI6ߋbJpMSx&NP(5Vuv8\~l.b}0e¢uju5jV/-[`z\ +  Pno":k6AmGtM5-#("ns±c,.r#QV{Ѳ}nxY q6Iv{:0]K`:ze"݀CP+LoSt{wH:/]w$U8)#e Y#P *++˷s +E:Y5!ll-wrJI`t،!3p+W]_r'2J-V̖V1j%q`X@J%>p:rSjZOZ7z  D4qa Y,+7 A2-؂E(^HEW_6 !0tWA܀NUr1;4DAXn>L&1ah;-"2@꥝H^W}j75^={omE Lm&M#?.9wO ?C>Bÿ m}k =wo4848TJ>`W, I# S.ɝ\7V{gc[0ѩ&z,z$!~,BdKWukR'7[!A#!^HPcz$c+&I~: /kE'b4-ÄNGGo0qS=HTg[9$8iAr@2 2kRxP2@u(|-H0j[7#yg*{VBd@.%Q}|E( a-b-l14#MB >+"RP4!2ckX1ܱkte/.;v؝3kX(Җ/E LY|m)*WG+MȣEV =3FvthDr]0ld-N#!P\<N.B&$ cu8o\j)C1va`YIDo{{Q<_/9;.`iP@ՁZ8FKKEf-}=*NGD}@ bB3ǝp6 FG#tE)4$@kx0[ bj -蟧w<4dxUY٢#`++G !DZ8)Vy#HN5瀦st3إ ^#x~\,ݥ+W.$zf)Q9p~8m ߁')i $Pu'/3 ShLF>]O`-Rئ{e ,kmg QRF uL9qlc"\?JnqҜIhl4=/x[5}0kSIxaQ>˚8k5N13Eo 󟌫gWk6YSCs\Eu.C\矱s? _Ȏ {@nr2^Nx)v.*07[KdC<3B8-fA g@ͮBwiE >j[:onIv7smӦ<8E# "S9٭掚xԜ7\Wv㟾%ǥO܍1nP1ưzg:7 rs0e'.ff3lQ~W}%H MqScاt?(:0PYsPTR,Q ydhQ’TEx 1@<cxŢrN^k֊"7df G3 "i{?{]=f̺`Ή'PX osY)9͗MXlfJw } B~It_DA5u4jS}=BrȾ×&H W-Z"g=)G&qk _?9OJFPN-tY7mKbF nZvuN؞{d#"hN1/ {iv)/ a`)=."x[v Ln#P2\Us mboǽ2= q?!774g!?V2d <29Wȧ-JHN-n~Q$?Q9PnI%8jK &$r,p KScQi= 6|v4~9h}mgm%6L2doMaDh=Jr'eE׺P"obNKi@E|~_` KIym6Xeldx9*t!U? Ձ5j $C NcGl"ps}4T8kW{_66j=Yl0"k5kDz;ѠBpX 5H_\1,]O$Ϻ*f ^p ŬhJAȑrcX"Yl \/GJkcրqE9">`;ʻ1_D0Po.07h!kl^ otf\hލ5Z4 fbq7L8g䴏]LmzxV +kܙC6 bHަ@Oݛ I1BagZܹDhuyVGv 1 V%C{ekqX0P v>7pWx'F/X1R!&@ z r` .h:$sy9PFj2^!"^'_jzSerӉ T+X|$a#/SoU\6֭ıސ,c^u7]_:EF%|*a*cLyWi "!,ǗQx6j)0^@(Uɳx˜pCqZ j\ .0:;/x&٠8U^A)6"}͗ԇS4" ~~pBVa I"}7ܸe׏&hwhz#!CD:䧃tr3^1찅J(#ĂrG MT)W_+QטCfr^(x'pq4 !&s"BKV$T6lBO3;$E"ssL+QBZy] כZJf{Χ[3 Z6AW2/"wiJ\Zg l >?JC1C >@8R%@ ]`57pۚ?aާTûK 3jQZZځA"KSwxL)w&DyI(lHxK: EbM1`TsBt!kZ{:K$e:bVM2z1>R|ܱQ$bX"DZsy t"_{*w%5M0J0~tka%B b /sqIwzwXӬ 4brniߔ++Chvi8pC&g4g5ddCJn80ytB0T-@ F:i <6x!APP/a .a^G nBJ6BʓikC9m(J s`|vEn$̦G7ԺҁNdd?!50Gz=R=h|H4?{GpC5Jp9xn1_ iU'Gg {$n)=wG pO_%._x0|#$6|#"<6GEȡFR$""8߻O*ܓ ؊." ?<(րV!VӶEET&5DP1\6e|ԗ^GvWU0H9d#M`-[1j-܉]7t͞l"RDfBOOH5!2'aROCEgC-"xEU٭f|12爐{<"$qK|'fſU1VJJUt%!x5l!ykaD+-GN2*.˧^@kN-ZN4$H7^P3+wXPC=4A\unm~H64m,?ÿowG(}qiv+FAM:a'M͸V91l[g/ 92?ǏOxgY P%m{ij>}%-3ERh m) JZ |u>e`(%YOV#Vڵxŏ_oGګ]|֒ .F{¤}wΪW< ?1[^\mD,=+3dDZ=G*<Jq)5J9).y{-O9y-2$[`4)Y-sE%H3Vr 2:wyDbA~="TrGuЃ& ;;8= ;U9cf .ts-DM)C:ܔϧI KkX)tz?LWń-^`RD 4Sg_0E1}ZAx4A@^xJ1r-uvd `zj)|4B$ [~x[7O}e`7sunQ|;S7܃PB=^_YcJy!?§5M?rwyhIzG.~C!AA$bNS9r89tg;0 }!Ռ䤦xJ,r/-K e˸&L )㢍yګ+.4^WẺa*.⫢ygv.E)zTElFu==뀄.7ȏM=yyw(\CֻկKAa`oXk|(lެki ̞f74rToEGCv OkG˟:>b>M9$3g't s[KU=p5{)vt8#*,F Bu)4u3pkn(F:x&#Q';Rwe~֣!B!B qqRܸDz-!qt:]RL5x~'XC[QA4O/x>uRReSaF ؾX"5*:@ G P Y>h$ Ȇ*2V3J֕^)D %;ݠs~ΰy:$>>Dƒ:wHCM V}"m| 9=̒fkl\陥3=5 rf.^?ܯNʖqV!1ۻ7`,s6z:5S֕$ixR6$1a᜸,Qf<kX=%/>[}B gFU-V~cv \D{]?ԝInn%gM0Zxn`-W?]7sįjp(3%*_^e”jԴԭot%IocwWѢ4@9PZѺ9VrT>Y*>` |~h_/NzR¥eVҴzJpBc%] %v#7{1Ie8(\)N8axT~ToKMPT1+mJ8hM$z$BOº$ JWvN\N)(2/a:S>|tXW[$$ QTEoFy=6=ZS=kR&nR/sU >` ZUYeۿؕR^@%vHf0*D4zE[&wce`ECI`a9*bH7fȉL%tAFva[+yTẗO٠Er?3LR^!J"1cZƞ \9Va2krT0]'9J\| mK*Q waVlGs-mY뻰Pr}n(On8(v@;}J+,r:|gr9*#0U"9R@qXD6Ɨd_q{4ٳj3 QjA (r2@?^#|j+g4k}\Ua|B鷨bX $? ufa-fd1(k "@@6Wkx{6mv}c)5E'?o'#oebL2$j\? n(D_d %W1P5>D — R;<2 *>a*ŦVI(%TgށџR@Q~3"AvJgoN@.F:vZ]\ʛyP+श/~L!Yҽ&`=~~۽D:}qr﯇vv hoLcNi:5vo)epu[48"fҳ)VmԶRoL_ŰAsh,xΆ7h>ةS*zûي\zM/sK$TdhÅN&X<L:mx6P& Kw|kf+VWMB\>[-[ہJ$Ô~BAW6:>v3mpFb<1 Ud5gGdqt16AϬ]\Q#UCM'HGt-_iaGjuEX2"ٮ&,Fgy>}Tg54Mv:z~e慼Y 7A2pddlH N(X\*HLSs!ܴ=A!5z&0"&w4H8؄ `C6.a]G1Q+ a.LقAlnA'fGf0 Yx7gxrl s&Ҹg Glqk=c@3v">̆f X({"El2*w6(:S|$)GYh8Sbz1aazIlܴ 7R=ڠ18fqdZ}Iy7q6mkPYm*?dEJÆm$/8?x]C%L3lL]3_Ld 59HHAkBP!~R|3{gXEәY/;s'u}$sFxKh] X6L/2~psbJ'Y ޤ|Le-T$m1JsGx8o.3ODEbj ), nCngcx1+|{h]1[?~~s{=pH۟eqwv S}=L($x2Z!*\Aưu"jMcWl+-+m3;=I}h uFE])kvHWl&I)uv8 w8Ւay",7 5D#qP,e,sEt}Yw:|9CQs.hX@}@n?I.kgaZʡQF˲*zG8>&=;;8= 'Ry$g[n6O^$s?at ћC?O`2zGęa8lyg]._xtUo^LmQ ¤D8{hDLNGrVrbq8#)E`: ~TU{&Hr$i{ u D,=wc qVN5),T88dbggE[GYo8cC$$(E"֘tފMzy.{?!4v6Iά{"t Uàڹ"~aA g4[~8-) aiX91أҫ„ZLīƣ^9:2VΒM9L5lsUH`D Deʘ :VrMy4zgSYΦl*A= }3 &R*%$U {qD1'k kX0}O c'ȐovDG-Ԙo .L@z,7\LH_LR!mRj^e!OW0wV -e$JmTӟiH9eXV_aY95"54?´3kÈ'MtOh/lpw(`LL26pxu: 5*7ԶCXrd.Te^bRQjNC]U#d[![/>!g]%]ְT"40f4U'?4bosQŲ\%-*[Za*`г.`yA$m1 Sחn1?s8=6??si 1ǘf+Ge^\k0eOFMh$rSADU0\ݠd-Kib&`*U]Ĉy2˃kÚR3mgp~"CbizAϣq?~`ا;zT q&e<">-{ K5\L 3^)SExݣpaF>+dmۢn}|< f_ƴ$NQt0 *m ֣)R{dFwRszQ`7ן?:U MpS:ؔ' @'p2L)^2'=)SVs DZQ^mt9&\ P G |qL%}  Oæzx75zL`sTJ muXISܐ6= ;vÞؠNЖ,ZS݃=k4wÁ6{TrWd>rG=j-"9ђm+H܅Oێ2Jx\\N1xQ)@w0բӴMȍJSbPj52T({‚7^­PP*>:M6d\0Mwm*Z8)o%haӢ$FxE3Aa[9 Wqܫo;@?ҋ9l%ȟI9_[TQ FJ>[D=5up"Cφ_|c|k4 䴴NOΰ&\`twmaH@u5]EL=:wMxJEBI}"fUIjՁNTl4@5z#J)Q+S bk 1lP)w Nnf#= z"|^c yHмu[@Dh % %"wۆ"H7ɠsA>5J7ZzFtQVmWvo7Vԏȏ;X;5;%]]B/qP碲QvlU>D@.; V !x! #,r8HW!J5q #@!5+doD*r.C (bGYͷR/#2pR"Z`.фPN-U,UNU7(yIٔkQ6*Rvzl:[r-[1'a9tcF8z"oaqWqe@SIL {/%^dK ++aD$W槆2]e_0 7#RO~s?zF?$o%l*[Ú9UH}lcw#􊌬Ȝ6NИyaCKJQvm{(<1Av"C65 _Vod# _dk4UvB|7ō4DBOݚ)0H9U/(G%L蛡)[ꘙ \ 3VYGvWƾB;)I+w;jǡc%ڐ 9dɸޡ?k+ 6`1d<5@^B(_~PrBe)B4.~" $b_u['@}ϕbbĜ 9Ig Ba#Ʒfo{GܗK;kjS5B<ttv+ρnH[)ժ4N~wX6^~,!vD.߷  &pޠJGB6-ϔ#d RSE1,GtpW:)gk/ SH, BUE)WK" @PDס뀺>:U]xG+pQ=rsgoJ`xWTtMʶTYpxĎ(L#Gc]}G?ER_x9N[]jl2, '?<4ʰrFƄ^wNLPaNd-NZKNMwYK,L^zA\ѫ=ؖ\ *Ez-RR)(̩chs J`'T n~t]k&FG2Jp\}ɳmqߗ;z-M~U<;y:7?K\,5jf.t66@IعuIƋwJ:v 2fp,+z%OG2ώej_p1`~!d$3kzKPaG~*A.k؅OF gĠDpb c9'|-c{L n7vL/6 g5t R۰h7v+W»f*험i-7^R0%Y%d-U_ʁϵ(^3ۗ4p똞{=C/U 3P['IT**gY?mkp=' ۖ޶a "Do|<}Ν\wU>UjfIm c6AL:op&Xk4<84<;8V+l؈Z-gj%/иoP Qѣ&% 01]0b/9TiDAUvh&EMUDç3"DQ`uSoW*p/ #}?w)NG'd1t.j cSj7,-˜erCR#*V!d-`nkG"8`q5?<8$06E;Z!Qo2{6<;rء\Cr8n Ɇ 2W.<gXFm[-l9a"cwac-n33>XڇGk\[CV );V=vZݎaǠ/{O;͙}ce78uJm*BGKҳPeO|؍`[_']{8=_OGh1kYO}wRM!cYzx QM6\<>T]^Soj,{Cg3H22RM5[WkSKNm[mZ7Ntmpt2.6(Zg6\_}^V'ɥ[on}LOЏ7} f z zY||B7& F޾IөLz^pD>I8_~eͣRDNZ/r&>XBc|06vIbi{8w!ؙi´=as`r͗Dq؇*kH:hza<}Ã(ɭ|=FT,Y rŏuu/x*:5$6};83ZkQ3%-Ctc8(b6}# ~JMLRvG?by f̢Dα)kOYAV,爣׫gZE<%H?g*y">m` Aرo w,vujCӅ{hHCQ~ +\W}˯x}BzE]Cٮ< -(8LX;]Lm޹"bil7FVP1 ؋X7֛-@l3+ {/3n`~sl lo_~mԟcm4rh#Ϧv,{mmpVb;oIQw^gJ4څq׌vͱQܫ18]|,̣ג؄q l!1decWxm3TCM6Q @`Gw}D+TVm /6Nƙy3IqyF%A\ FL3 e'FvJr'LAlU Vc.Ow$ߞ3)^+Ѵ?]p!<)RfeMyY/0 TV&=Vt7gWH~9N"H9۽O׉8ma).uJ:eMgRAgY2O/hQF*Ra%'u].RԺgu_2A]Pڹ"׊X$S TEoT v^@wZ}Mσ{k'22AN/OT\ǩҬ=NfH?uO(~4/RJ@:ꃡD2J-$o# Wxi8`Jn&78F2bjPNܨ&|S%Bx[(:N(OA6$I\( l`欨30ATK`$O@h0W1!{.\yq s_fNc+a"fxA7jEskɾ!Wb]NP]D#)ݟ ~+3֥ MOH:3r.#Jwqf8ORo=:4kbb>YU>c&>s̲nK|19EݓV`GRxzΰ^ 2ϸ'z$]RB9Ŵö!; m:T 牺DxcLK̨,wF99LVu5aVw5tuWϗQhȨ&z%Hv 3 [1AeRD0Y $=,|g2 U]2q_z;XTGS5ڢc j9V=KGO}ָ#kW-HFޤrLWT,5&NN5Oǯ2/Nd@VA xamtvv7]Ԟ#>ړث Xb}q1ocO{ ]fu{ς`VVc;ɂ r$b4=gM(FJSR|[yaԠo[\o ;>GswOTcv(!)N|sWb§ fLJ]kE^gE^Eu益>>_$`#cz6&圿gDwO]˹et١&d<^@ߛb1fU]z W{.j/kV/w^nQgnGZ,s!i!WRs4/Zxɹx5XQ /?kw}qz?=U!x,r\fq8Xajr+q Z<ct!ְFtL֩vϟ7Uu6y1!j?qG|L\c Oi=5_=v ~i<4Һ*r%%O2Wrr DuGC| }`ƣ{= 7U*Nu^ 2 ?6óvӽh|=[U+zBkƳk&g*CjR _: N!*|.'WZlte$I ;wd] wp2 piOInhĤ#ɐqEFsyLCY\ZC» COma٢ hjН -?a##%!zcۋ0E)42̈́ y\\$5>k?m4\<.DPIE_As_OdwΫϖԀ]rI ;UE1*==VUhdhs3OcB@RҚFFs݂Ȳ2?^hۼdkg}b9:Vsw0]PTaǣf,0E59#ȘU^e{MO?SKw;Ԓ(uVE_oognn :YԒ"YZBhBe_:b=ǿ9U"QDb$2w\7=}qiUI3 #<= SS* 6WzX>t|?_jvހJJ?'WS{7͛sWtY)HZ+Dxx#)p96:Ua=-I"v_7*zMo.RwawESԇXME`67XޮE&77/ ]RNjxDv|d N7Ogy(@[\-grIɖ$lRmZÞU^ann !F)2N9ey"*զ N2z`9FjEnWoA!{2d|&Jn=@i$= %NuWשd,q i:9z`RY#ZX02r0d4*0ugjonͲןwfG4G/;`r_y:DBezjf Wcm5Y92zMJ7t8U'DWuk̾3JX-՗{EygǟEY\Of!)Lh;gI*{9ϳ8#12-Rt'wi so@k(Tp$m{ի:˯8@Lsz3Hޭ&t"W I `z.!eȵm9_8L"ێ! Q4%O2usY$pNВm?IU֍K9-i'Nz*xoJHY!vaP#,M֋ܸȲ ~@hЙa˟@==5KvlGFj 6Qs͚o9.Z=J- +ʪN%:\gв?Fl0K>٥Œ+^v2P"=+P 9rKGJu2R ] 4 MdDN,FivTg^bmNd%.o/™EkhپJǗS"[Sl߆n~Pf9{DLg"׳vکyE`-pcv z$]^JmZ%2xf>7  &,'FA\_Z&y|=fL:hZWh]r__>NfM:h+*T=AJ*Q *x ?j~L*<|\-~k?d𙺹6err.\8ɭb1CGBZe T?V9apCXYJtWPRA7&]'@1R: 3Av9R*s[B KW?g_ѯ5#+,Irɖ|%xxQtCkE^ ='{{z3F~6}7S 쨡L4>Zf.Pӄjn͟:jxS6TBWj6DIi߆Zbe|^;K=c?#'#K#o7;!gƨtkPlAT֞F޸s8@uɶPnfT$!1II:I@ ]0B:vG:.]3E՜jy!X>onЗsR4#u+꽮:V/ؤS4Z]8DґjHVRw#b}Lf܅FPnH&u`z1U. q|t;ޤ|Ax+b% !nC |IP!j(}8~*_. CzD:=:@non/63YnlHeR-yG*||7]]II8WEHtAjĠ1v'U/XF_sJ4~t&(;'M1 8+A Ot)`g[PЂKg\Vɀ`q9sKAqY9^M AA(7NA( lx=Q T-: &c]J Eik/͖/ h\Ǯ|݅ګ=|ww_jjr_|ZV}vD_+orsI-k+s)r{wrb,Rhc!Ya6a9ߔOF|tq&K98U Epv0RFeOWꒁDDZh>|xy*7p.lRl_0`J ^Mr (;X흋N(.؂[BBВD<6t >aS5d9@Np ]MA\:{$L5(QITJqR>/~j(C4{B^;#gY`6?t`=(K5ڝ}; I_jSY /uRsPP]JA-@/t/nQԄtϧ5KkX"ʼnXo/^|z3]UgxiwLj3 @ykZUM[eq3l a#о%%DRp$7 >tw) ][gJye|6N3a{=Y`]4{)P>(g`')Z(t(5}*% |]~y5U#{¿}H5Dm'A  ͖Ǝ~h%#d# dn#^@0No5V'I*T1:OR@BĖyl/8!~ QT2MYېU0al6ls.ؤQ@76i"} zJcTb`J1Oh7tL #P8QvmIGN* F>A|p< w+Zdo@gm/ |nܔ0͎y:Q Q0%(Yr"gl?r/_+3E',k'b9 \ID ;OIL_q.V`L) MMך#H9i5B?,fe&RYM`M9Rtq-x-dTrKzUBk8Ub&\*+,2{ ol/Vn';[wD1Mkr3RMiPS譶MAvS3afj4A o85xB\2q4ݍ=kjViЁ<ȾϤ@6b( ve<&խ0Bn [|K7g؎YpLsVGȆ[I% Qdn"SP_ @KU: WCzjamm,yyp8#;ɜ}UCǰ`!%;32U-PZp2)@c&-) Bt)ysW.QMacF|ƌW1 G)&K3e ݃ǴYCX)ljdZJ lW#B@̏n|O gKHN%PG4kaYzSֵ9W2hq %cR%-]R_{AƪQO;tz7]> ,h~Ap߮ ߤ*_lW^t|IKҴӛ孻*"LJnnw?KTƌٻvg_l)d=^>Svf6R6Kz>r 7/6ےFC)׋tf͔\*\`f5ROLRS$;9Krm"Tr펟S6\0RNIeEU\ YOT@c{dFVK4]_<熇ȩ,A =D>18@=>d1B ^\1Lқ@! pM+w_ͮ;,+k{v=<5P'^bTۙ CZ ?=Ē+ CHGts2[Э^\%H|joY*RBk^7kMY!d!D- I%2gzG"گc:7nZJS[eܞLD۹y)jqWX%jQX,^!"wHĻ7M #4;VtYPj.D/q_7P Uo˿m؝kќ'qD OVvo"M~eÆFf.5z/Q@4n{Bm~0łqcto`'&Ey 8&\-gp q66DfejeYD~ٓݒR.G)2N9ew`W+զ } *~8SU`9] FjmQ[~FЯ ;:Ց-[Ko&by_gId>8?;>VyBrܮr/%&=PrVWer* ηffP*H&Wk.(?2.䡠ec75w"!wU5'4jպ^)= 8cӜ$??R-~ShGfQ L ڥoD@q?rCWdԖMh@#d5g'E[W(٪>[\Z{i[ŚF2xbqQ~b.cj젉$>"ku͟iJ?Zހo*%ݤ&w y-8̮,Dv/vqݥu=@3h~|osE<%'133fϻqcWџr JL#RC4Hk:r&<}i2?ϒ{}=a: W6v`.ZMsc=D Gp$$4 yH&քw8szkd=/q(6PRG! t9MSv^ :#$aG09 $NLWO#:GPU4ډ;[}AN?w>59,1WVv܋Ga [͖kx!_LoҿKk1/S|z)w& ,K&-ת6s:(屁k8&|F;'Y0uBI QGı`9S&rи˰? \Me6G[zCStZư@nCXhw  bvqQɔj=aGmSKƵEd [`HSbB*~4X;C0B#73TƖ=*OR]YS^ ȸm GPN(2{IEՁ+ʮn 4|=fKe)3[VBJ}*#BC_qNl^a|/C<da,!%EAr8+B#hyΛ a>i<U( Nz~9e~(Jp8Opw9Ab8BN€'F\5z9YFt<*ޫ_<&ߌF W@TjB Ʒ{& _tR43~Xs:5wxt*pRWʳ b77Zy-8I]QxGuvhGf?f"ٍlJnXTr)U,@.;[>4(eNŀpځ|HJ،]O1XFZ$:oFXO[;g@6ta~X݊1QUA2MoqfSPMTtuߩ%胟O랉ԯݮoP>)]7#'U5lً 9/\r֕NFy$0Ɨ0,_:Hʼn_ql:RH޿nƾsXD Rqd`'wij]$wi8WEH6ܶxԈ:s+t]+UF W/{[s(ra8 Ye .LH[^ܙdW܊ Օ-yoO"rUƲs˯UN X}L$'V"$$ӣ{B.Vih{G~oݟa7<Rox;h0Fh4I 첞@_@QB#՜'q"ȺKq(CYgf6]}N(,ɿ>;e ^!")X? ?nxKQ+I0;xeplJZ_ȁ)VQN*+Bn9DԴ5Y(QKڣGse""/9'AݲS>q^WT28Xyg7O-֒Gmά㪲e 2Bוu66%#7T7]^PLV[ (7K^Lgf9)9Pr'NĬUO/\vHACnluj%x㰈D?Q8nN"TV#@P~n03(\rd1$p$vܳ%ꁙP0`kP MZdI%nU~ʘI_wZcH$hCm4CۀӤb)W~{_y!Z )KX Z9Q$]|ì5"W^im,P4 B-2x j,蕩Rys|mFN`j;jBbyn"b:u\i60+!玝)*n ӹO2} q /n[sa ?f^fMMo2qb]}eZW٤N|j#,FPK+9n4q/06 mCoE{ M͹O*?$a=S"k}.o] S5>_=SKo^̇9ڱ.oQ߳S@#;]^ֶ%LY֑1 IqG VF x$\9gӈMA,v01[wa258=mػ9#d*  @Oϱ Sб pA>%Vevy~ҢFcտƋ6ó~G!?vH4! oB3,u2jΦmKX81A Qc o9P`C`t1k /RYRt<_DH#i'LOݭ*!N/Db"G[@o??d1pkBY1nq|#GhaXOgP(l%ŢTոp F8pZ_PC1HG=5 ){(59 y[JVq8|/F4:-Of!/?U_c;*+AX?Vp2&H+ < [đW'8bS0THgW`GXs+׆GLz|>bN7ϱ爊]Lг Y}l9 ̰7):x/| = 1״T`nhXx ? ONYdD{wt0*FK(>&V}DmZw}<1PjE!kˈ~lR&`O]/8Al9RvJrARK90%_s: .7x!ߺhozn4N^04rՋ'~BSœ9dgmW&ɅiM6f2#S ]q_\hYh8Hbw&k7\kc.lp 1B<8%Ւ`j|=mKY6K Rhͺ=gBe zcsV2Qnj#>]aeɊR oȦwΪ8ZԿ܇v'dAŒ90<&ϬienJgR_xIntųĽ|2:H&sPĀ/h跮YzY)<=k#e_FdMjIFAT9<M/+0.{.1(D[+xI#(Ĩ;*0_4I,.ȕP.B -Ojז׾7Ƌ8ѿHvGWru߿뾡]3] |0A ˔X}l 0c 0]~M粱^ҟ?gG%^*|)3qg09ceYEfq*joʢ Fp6% 7Н(|G/({Қ3^nt)FeqHP)#Q扳yC;5+,o,li/f$OD8 WcR8&.:P4.*y!ztd kWT\ͭ;iP]Zp#3Fk4^j2 & E0*cް9wύBʮ(-,/EV|"fL^!o3 RݯjBSY.q "Fzshpt)x-8*ʬ@-)y@w~GRd *v8yYt 2<"^P*ଖu/Xls/Ual@7_:4ǵ4FKc0ys)wHE֭|]'u}(M u`}'t`F<v iͨ׆*N9ԽvCš5)".` :7QC6^37(rcX }af hR:tﰎz/ţ3]CwIuvg\o0ZP9V28%7Ag(~gfԴxQs@:MaDMͰʓDVI3>#mSLΘGƺ h #nE o!3y4أuz=4T[GO'„S8&u!@=(d Zmp!ă{Il&?vF6yzǓaqH(T%`ol"H~A,E2V"qAzZLVjl,q:jm%.7T:NO;+W\6J(NrT={̆ޢ=({#Wa?DᎩHx0z kHM.o lkt_dᑗ-Bu K~s}y7V0+ ͦe.$,%qv"#yѼ Y w&4ްG Er⧞,wmZĿ5 Ŝ^Sd<>l|p0\?йW]?9瀟*^6PPXJ] 7lcY},$I ]"JV#b!•Oc%,CUg=PN?M[VΛ[tiZ+y6smӦ<܁)ϜVdsGM?E,r!֣bF3@ڟ=W>9'~=X. ;<Je.}#t K  Y9^X$)< bS+d_ DMGE1) x=24Џ ( uLp&@^`O"d;]%7k~BOέHC"">KDV^5S gN|P&X)toiJb7F H5ng DXoC0m=c+6 =%RoS.'v;ݺŌXHSqcH SP9~p)C?LĠE?wi($\[aI "d4J)};³RuiQ;ILpYroSjDj>/gG(nB\\t<4NHU0hs8 s1[n,{ǣzNtsuQuBp1g,CHʷ0b}[/Mo}83H4DSeOHkt}\wR;.%`LT7P%nח+M;/C UR~m đBџF+)k67Y5/E R3/GT6H9`ON6xGxgP[Y1x8A=g5w h܁07Хގ7yD |(ʖ8~׊xTZF6wS m]T{58^Bxv὜.yM}P9$UMT\^PX k `گj ,qW{-<lO8LCWA,/X? gVL 3y_|}CxGb jT%Le! 3'$?D[ŵʄƃ,:C,d;_P%njn{QH0I[3)Om)4P63a&w|>WR&U8f~m[#ҷ؄yX8G3y6_Yty.4*0\$Jb^vh"sLv4ΥL5Cy*?Ry*c42/E']!A:ǩp`<3*4Sh3 -t2*pN_܁uzU54 )-l SwxLw}I$XdQP.⣌L2qĭ%fӝC_g# %b댚n !9Q4 ܴTP,60(ΦӽA CkrXrA ndz[eN@:B10qb}0NG\r(z1l Qe$JVmV'&XM1,A##}qޤRxyMbHz҉G=Is_VD3U>9Qe+OTE6{xD' )i@zw=f}ܗE8%'HcHq2 f%5CRs/Y +cD$`V/PbJ.bdӫr2$fCcĶ1b?Q>f.iqRn%p.9aaɏ93:Y@7xB:7}A[͟Bn~dC҃@=`>|o?{O7JJȮoFt,ƕtJ^dgm=>tK^$H^}, @Hx?i(~H{`Z pRb'䟍qiy])キ9yltpɩG.}c-u98S:w?qpkp`oCw~Cܭ7[ nߍsAA;kd$YI]tQJsyy7*#"|(/oEoe?~yyeyTv`6\&|KTXY?ַITB=sϮU ƅC1jɎ.УFu`?1\Ye|ԗV@S4ޏX2A#n$}42Q[$$O ֠ 6| eYd/J}T]'iK54!*Pa/5k̳V&ѰCɓNmRc$>4zyLb>bɫ8`SnUD]n! y jZa]We3KM5o둉s9=qiF1V+\ V{vTlc%(kx4 Q\7).];;湟 ;&UlE(>eC~6.!CH ``Į'?  l[RR}5KˁthVkd1Wa'x3ۣPw޶5wt~x bHITz+U)i%oՎ])cd}[IX3n}5Dodu~0|3gp0vXCq*)aIB$x]PGG IG&Nח|跾_$Qjri4Rmy2qf?aNvh8~7Fh h{_!bUvwrK#lGNX2WTϛ\BS2X2{:VCFxذK~.Yq(Ԁv(lV::+`TZKb|,(mD "2 J)7QS T c*Kc5=ofy <ƻpZv\ݛ`&nKOum _7lCz϶lLxT: YVєl-v`{TA$h|W FJ*ǟfKkڙQ}xN1 "T2V+Qoݐ'C8 t!;cOU>L\4~xJ|r$5YAFNk3ǽEâpd12!8^M&f/Ѕ- odM31Ԋ˼%[9[:q"޹nc嚂X N(Q` \@%n3 n%kR_w@4>jR/ : @b͔+ײF)y2DCdZe*w+3|ͦr+ױ~B !1!x%s.Y4~ 26)xo~K,p8Gv"'Y=%߳6jHo+.Æ&tpq/}t@C%gQb~jZ'ZIm{a$"r) yskqF(TD0t,2 խ$x?ӣ|J䃎ܫAdcHؾaHqU9Gr^pvMp1#M;0psNĶ'N ;|YfllDK~fc!5v@&9TPwؔӑ' \ x+Fp,@ʳp썽P=F&}~|gx Dž(` ^O,<S}<&; Af}#x˅ڠ7Pl_ҁ,GvXP_b czn #jh0M!n:oJNsxW\lѭ}lhpjFi :n{)!KϵVA7rZښ(¬љ!CV4s2A@p>DrϒʃEn F<=2FhZK͈ڠ ҩ_ӊBd"6'la#b^.hh+ CC`- LGF[־{FY>FI,!S5]C'>LSUj=ΏW&d^[RWMֱ}Ώ_h'CSObuL҃w}:#S;:-tB^ ( ^f'umqȮqyn+C{JpD<.VZi 4FG'v0^|=-lo t6&i':ՇNlb9 iXvx7#כt1gyO;dq ]qek2?oޱjOMwZ7X ]TwC$tPL @] [7vK$ˤ,kwֹj1cs]+>H9Y( zَ=;(gZs<e_=v2]$ "{&>o`^>S2g:2>zDۙvHt|gjG8/.Gw=_-露|)')&fLQUS܎CfࣕNO]F]ZS[wڞU6-_0;$\IB>[ kd|UTNY90*8"d'[W(VΪ\3|ߙر}t&h6Jp3 rӐV dqxp}1DXKrs +nC^D[3' bݱG_/{`' 4ݹۖM==YUKK.Zű"mAs0 \e˶J24$>{VOeK3Kpa"R Z/߽ )֧ܡ٭Vj>C*'Тvs5DvyG"ɛ^gG]j[LX&@h}#mV"~%s VFػ ,N3Dd?Q=Nhjimuo] gR#8gD ]CtWㇵW[~ SFq.wMsrt78ΓU7܅%}^eVT /VZPP!!P`T {{FBOUjFJsb&EV)M_DA\˸+H?ם<gb͇R YPiE5(fEͷ=iV_fm5(r܄W Ay|6Dl݀MCvˈqT!8o|#xx5𪲺r61_Qzke2d;UМC{ gT/bL)#y̽^R7}]AZAER(hxdB+:(Y"7Ow ّ6(Q-z3VQsL[EIRsApr'+lTr7JAjV,cB5.P}~ԑ!E6o~_ŘRcW5L|/f$j3 T <.^ӻׄL+ iMSr5v!ع[o&P<<:(tIo?ALCJfƻ5@7vPZ+qpԦCa-JRCʚ%2nisA=Pu,C-$<'uk+mslc+KtG>"mb"#Z{w5"ɐJpNݣ)Es$5=_57pDy!K+uɱ'DZh&f.{zzY*ݯl%FC˓N}%jzDw.Dե\3Syfg{~qK7@PZ2㙤=$*C'͕;cX. sv#a:}>og|s/y:&[gLb vU,ay8p5,uPz,l737m%@~.w$za%}/8UI=X:)!Fnz}WNzlx-, 䉃Sx86hYYCם_+:ˇJ:#.8x*{H7%v(/z6Տd8ߜ}/:BTU,*u~\FPCS2`N 'X3/lZ~Hz_9֔Ҍٛ/3.V5,er{:ins9Q2ʭRj T=dÂTóv[W{y|;:-T'HzaF¹8 WL\mF62(` F3@mؤ^`KlXӹ'`99z{*7߸O]T  #pG:1mGXD5 nfS|UjbCCi ,~-L 'M֮Mx+mM=WΑ8b yʸ GJ_Ǧ^'SNs } :+'2n;aw+fSm^C⑪Yp3=n섐dO]P p9^~єVSKo5֣.N϶òyUu@jPH͂/2sռJYD+s/#> .ahWӪ;kϺ4(J$MnMytXr9EsdF̚=;O9N6^T%&HRw2WN^C1-g]=KsS'88:ON^;!7XiF[aEcS=E(R ԫ9jB0{5zIY;Ykhk=*Ǐ*QF!'|3]`L= /<, e41wUTҶ9z2^*.s{3ohq l\ySY-%`G&`, 8?;NƩ+S&В.I cO"͈-'2X| B:Hb%z萢NnJD\z\[\0nmyjB'k<;8jj[ۀCzۤy!m=mHP=%=}9lYƾ$c. )DZT9Yg;%?LU*^@ٝvrV0ԡߒer/׌-'88Y׆3m;ޭ @umI' 7[O*2a&RLDXT7ٕ %E ͖'%p:E[h ͛9-/!|@h\{-OnB:G 5]ӓ\B0kX S|IQ3N]cp/ƓIzhz!Y㣳OZBQ)LA_T8"kҪfSU͡jFpq_\K sL l֎G#sKW1YCJjǓ+ߧ2.I{h_>pcdG-XObICD&)3dutYPJl})c﫢VUVIXۺ/u?3'`uݦ'Iّ<vUVy%NL;R0 \ 8]k3ЉFD|M ٕެZگ|Y}kD/h&wՊhq/A'hVmU*@b1ˠ2Sv~a88AHrAنCy?Rq>2/E']}Џtr3^%8B[Q}кIdÜw͚T R3k; ݆1ʑ[8.(zRc2Q8L=^k{k:"owԠQJ ƪM&?njD)ɥX6k;aKW {iHz,צi~Z)/c?B OczwK'dO%2B ?!ObM邔3i?w,^*Cx,|Uc:AT"ΩgWك"kP߲PI)n_R 5:gѧeםs'9tg,%(LɁ?|EIb+߹T=B$ ò oB\$h ¬K@ 5B-Y97N+㆕jg`pE1vC_/Ϝ/??^V_l?<~#>4 L+E$T0i:(<&WUdI'wvt YGEvt O@ҁ8@*e&&ՎmScjqx`T{'NW`ۧ(HAN)Ȁ6USʃ*e 7Yl 5&fVO@9 氋oM\J %?M0N!='dT el(hAɫzA&I0b^aj PLϩLb^թ֧@HʴD$[;!FFЙL?1N+R82QF<)Gp }g*BUWD^'JlwLj /EZ%H dTB)W"WRIHB,d˟9m+C%yO^ 9Jj@fSJZr#,az^aL:U\WD0/WvF.my UeL)ص0W¥\\SzSL5R;0Á\ҵ[pfјa*RLAG}Ҏ_-v!?lvbļȢH6.-HBKq5f@NP+?4ۥ Dh5DL,&A$I1nZxc #9<+OyuC&! ildR!b=3IJʅјzqfQ RQid+TBnǼ#ڞ` ^1irYHͬGA<є2̏uBBQἈ$iA;/ ]7#{^YiXEgY0˴w]?ӀY-wEmR @;pSxTj¢[YbJY5TRt*$NJ7f@Lbcq ,3A@vܳ2GHNԚ`yDf^{I#KR(=U,%.{C&k?)5Kv:G!uϰeeZ&Պ֗b0V4ϛT" X*n>/!kVeZefi zss~~L9u^FZ|7ATq14Άqr5[e-Ȓ MKXGdk* d'Ĭ^%{*< Ӓv,6wÛ֣C NF^H9SlaW}c>` "| !=.HhR<(4]|j8YB)'k9RD{1tZRD-ÄEͮM+e(ZJ[Y3 &jd6'c-+e{8 $rMt䄆%őlB'w35z>vD I6*)wr%_Q6|UU&s5I5}+Wd4_$rM |lApcs*{Nƃ޿i5@7dDn|+3p'ʕAh=`Wk6MFQ?éSVFav,0|SH8(NuW% R HЄ~!Jn]9;DzCs2[ȁc'#fg&EHg_!p f7)Hm7ya@QKL0G-*:MGA;hগ1Z)CsFP>g~~_&AÂ$0Y}}r3R鐗Hd^:LM^Ly׭[z3KkP=Tu|-%aΝڭJVt@9|=[Y2 S?*MRza}f?deܮDf70R ͰyntrB5&LΉiPRJ ə{{X,w=XF5~MydS =9ڰZ &jW5L\8h{1mT@Hu)J~g"HpY1 * Uh-j-4,Su͎3>*"]VP:3k4aTFZ]r?$:3-˦æҿX6ɗiS蜐+Qlk%-(Y\X7ק&H3atLT (s&쥟R:\Nromtt:f\63XSLp.’3%Gs9l͍uQx-,4%'JRl,Q U-ܿLFr1bPgo~vw`ObC?V, flIЯnH;|ua}poCn'NJʽXܦDQ,N =h:;n,G7,W)ťQNM \K+&>KNMM\JYs fHL{NbJx*cR v}D_ꦀ5أN?22(EWQL7dr%#A$oqMI>|uH) FlCAŚ^ABS>+k\Lc,٥YnVFmV*m1OO's:Nf﫞ܶ T`AzPdԅ0f)g 8Hko?ڪR{!F/{,wZvL*Th &TTJ5 /H0퀊I8+L?\-]#}*ґś8"Z-_YB=lAA:>< }s޷N.BDZ4~J^/z4ӟd[rwN!g{G1n.%:BFA U$gK".6[Oo RjZyy:Ӛ  #T\L HpwZ4T.Bsqכt q,~rt;VJl;  1[gY5C Y*60 SǦDNY& V"v%Vsۢ7T-ם{81.(erl7p{o}@8Ho;otpziJi'Z֋̪$ H:'DmLUUJ:JKS0؀ PÛބ8^YPv͠\t׷,5oM7d;ʙp`jJGi$qȫԽ~5s^n#?EŌO% Cd$ d/`.~c̲v^ejMrxxr^>FP^G]J** Q 8=DJ!j x=#7`P"Ը Gɟn~DiK Y M^HeL 덇(d abhZ!E'-VOx9L\s TΒ"a>a>@0tNER0t@|П$d~ez%@g[e @V-L>P[nُ  7pQ+ط} d w=|;QRhS' ӝK(F8S>[;ņN1:d .'Yςֲ43hL{p( $R뮷h/xB}z3Ygx?v<Ĩ{hJXwDgN\~<+alN {tlrѓ*$[p~&3p"~1 ; g܄1D>zdY$ $o/GuHj*-0T ĽV/ ;tG5:]u y$M@BMot-ɏC"$#ow앧Y̒ArD$1 jj㇝Bu2̔,$RSfۅ?.`vϳlXm4]}ixC\>L`jzPwjSY~Zn6FTo؟ubKu DFl,8@MxD(l]dR8a*GW Ö{X"o'xNGuK| xbW䂮f ҏ]!BP4%FTX@Ξ$ OoS""8Se),WOJnx M_*DrL\ബUya4KQp`sY5(x-Q, OgJTN}R+AJБ7l;/Ƈ| lŏUw'snjZ%n,n5h Oۈ57mUkB.:ԤA,\7 `04Յ~WP*I>jYǷVZT[(d^rAtxmj'Kᓤ=)/^u~Miڶ:H:I~&,J^`%ۋJiN!%뭠gor;ΰy;dU'Lv)dWXrCAgTZj^ 9W?~TϿSt:Nƕ-Q81B)8Ȝ~2Fe2PYPsCgjuUy11t~W#AxR>ha>CAQ#zƣ41XZ1Ӈ ƈ\$\]kh.L~n Q7z oPWY5i49RJdl|ʎ~>WeϲLbRyTujC @Nd' 1TUl 1`l3'H,3$V* (C@(!w wH<3ɑ0T8A8p*?>^MDSKȉ61N)K/.ma"& ~n v;rfge h-m8Ӄ6},<] M-!3Y&tFA /fo=:P!ƔUNպs/kso>m_h FY3M X)8Y0zPd? ]hquAg.J=`$+XBc[rkBבG6kX!*š6{E~xȁi:%BTr H6|!wk/ݞOQP0۬1A.#C4~|= 5 ZL{2K숓IE-tuĿ?Y5?U D俨,mzʖDI idbL.m7j'Cr!Q{ >+eϟ,w`XV#-ITTsYa͒ yRzfyi3ʇ t,:']LĖ\wETδ3fM'LewZ%\hGM.$eHZrDNdBV?ACdtŊ=pP^>`S 0="3$=`,"O_dVaÿmٽyj4gS 8|TKz-Fc56B r ]Mr+u^*h3NН rfAwn'hFhΚ ف*fBcqʥXKc Ӡe@8k.:{М ]9Sk7<[uJs}% Mį<ؙU_ v?C ~rho|mvyv_}E}A:py_&AB,8;9'_rχ4n#'12g_L#E ! (\KkEU`,<.`yPPi*8^8ztONIT]Q@r{gBvvwCK!"|RG"Tj;X ::o]ИɳtGJ4)yaA@ ~1.=\xŸ\M#I@2 "q2Ppՠ1Q?-׵FqF~[ #55(\\5!;^c]rj['|wRF*+*x{R?r JE _* DQI"רftڀzqSt[;{fc=!1In{HY;;r,$_1 d120<œ{O1! 3G*tuw'5?lVsm\Pp!Oa oŁ  Qy<@jiC^`AWFG;78K[4ߙhe~2CԄW~6ǧ;ԭ[!m?Ϥ~doY}Pt#4:= \)xBÏ.7vh'b.̂!`H"H.%Eh|@T"tI*S ٽUyp H>лqpmm} Y#LD$ DMp>15}h:ktMB(eBg<Ƚ< +ف—Pmx_oxsnliX R`$OvqpHCuaqkEt؅%g%d6gc!m.t4 6dC"$V=#iS?ms!XybS͢TQ , r%Mn+Wʳ>mj@uJl4\(ZmjXhA,,(EJ($5U{ m{THWEZd'C8+q:}iG#4؇DnT.$dGwfTj=_ʶ"Nހu#zd@P@\B]U36NU~=Ӟ੓:K :813a+cP_fZ[/֛˷5.hyYu}C|d⪼!u|벬ĩsd4ޢmT6+0Jp|Ógp%BAmKqv힚 r7b@wXZT*J wedm9@*Bl$UVrkVvN8rr [V^:왻pC96f )~Q #gݰT}cVP2D`:|Jaг89IJ|}E[>'W߷T܋7^&%U'nRIoxHUyh,Hyȹivk%x-%(KJ\$M2 2w*~hee󑖹rl}9P0iLeZkww{Ε2XGU{ο}H9OZ}s-ޣ S}c\s̊OhI(j-i.(՞\DB+[eןbdL2 Q*>![ qBi+-֙`(W."9",7k-5EtMYJ-C#5s] "T|lP䛹m7HRhyg`0S0ߣs4T Eedr5.~o6cᴪlNv&P8xk8I,Z'o,jQS\TD"dPI"NHr"])̜%;,)FKt2g*9AxBjꇰo8{(ާ|IunyL–Q9;`Y%4ޗfYTj>Yl-SjrDa54[ز(Kٷ}gl6IR6k^PpC3rVA) 46g, 2s!S^d^dm0ȧqQ(15Ww&Tr\P'mK<GkӒJP^=d "bvmZUmγL[meb#-w+{m3bX$uOh[i]ѥʵXk.T?ڦRN 5~&!')͋V3! f/o,hsCd79F87vi~ #piɶ5BkbZ}<&OC]y'J]`"p]xHz71:MU!4_ IC>aHei]9dĘaB yH`%GH ^|eM+حd IV,M|DzY}Lơ6x "Ղ#Pro3I9J>hty*Kuo#q$i=MĕC Yv+L/Z7">5Z\I?< 6Z~^+F}rZ؊J׼ZqIB:U9Oe,6%R*N%j(! pdj:u2&tn nRzدԊ5܊9;(1VPrjrxn F_M?P*T̜_WGњeǵ)yy*y4:R'R:v"jnx'"4++gAbĒ9k/`RoT*;[՗/sJ_##Ky"_LBdG3gGgFo+N* X*/c G^ّsy0 [)o׺yݓ/zXݬJmY*0fM#&X& \;J}൸1\SfEþ_|tـ޶['Or栟qH BP.D%m<U)cjBoM`03{4X#݌ʺ,>!|h#%j !GO.ŧ?#op(g 5|}RM3ZwTh6N/%~+;87ݳf#N:'2l$}vn!Yo0>͐7p !dxzr_7ԌXj$3 p0J%RO#8h6*?If&_Fncwqf߳>p`>lTvDDvlӐ['F1&ƦӍ1o_ז`u^{ط6L739W/e*at$SU,">:5bf&mk FpAFֿYVQ~aߊ oBٍMZAvۦoxE#4 3L3{dP@%h^:{{uf-mEbz|WX.JUG&R ]\\t\ta.V"Bf1E<`^p·kq.8ㄽ-a2(;8=&ۯH3UwabOseTyPIV*uYaF0R%#QEzk ֚S¦'#>I&6ǑLt'̻_oS J ɑ'ٸL o Sz*}55";KK~ycDtu="r$_@=J}0I"Q LDz)SbNɝ" e7|8Ox0J%:0]:!p<˃O-[?) {"x_|2N9F) d#.Vqqon(%v@dN14{CʆJ}=)|z|C{eϲ1>1w`+W\6n)/Ձ}!8O)r!="t U/_jat^v1k%M05@C~}-iCRjhНz~[ Dj KeB9AYTԭ+ܟLGځrGi7|HJh%%:=VnV\Bx6>*w\tG\GB[FQTrP" MbT+7x(рQ){^--+_]Щ0G:xcaHnP&٪)*t.6~΀4s'Ӹt5L(FƩg:{!JT5aQDfJ~ؔ1/Żш>kX夬^~EFyS~go`H&7Z6UcRJfWw,wߤ0@{^[+55ebw\B@`u[(xrWӿ~\z.%\t7sNriGt*/o#׼fGKwun)Z~i:q:kwuOwSv @(N )ldcQcCO;qGP]):ND*L  -(K>߀ܒ{ݤ %[H}VOHꋣ O{72ӟSb'ܸ%q?sg&U.[/>od^{~W6IS &[2 %r?|؆'mԛr>9 dߌJD4@9N=׊ALV2ç{My)ΊkAP}k,bՎn5rk 4s H-.}Cd=bX6I_` MKjt6!5<RD/w /. ޺@a\4&ph#8>gpk_9a>䗬g4 i7~;} 08& R#7?"N γȜ{/JY[%A.#l3l $%Uۻ8isOvM5ǩyW7냓DY$` Jq+{}NAf3.c)Z+I!(tm;)JUͨVuc sB{JYئ'(q,CƸ'q(qKpܜd%^={5,0U3eXe+ԅ6TJB@> 8HԁRA9>δJyS8"!f S AL-ٍ TѬzWxhZ.mDO1D@ߎdi2[_XpF3EdߛܓH`d"&{Slɯ``YՇKu13M*NtLCgZ`&a̮k% cQ>,xmNH4m`iאm =wפ!ҡZӛ "sxtbË܇,/ :: 3y-kLO,p2jS: έ5Z!L))k{uRKlVDjB)1\\12t*TJT$.Sz,#=i!u9405,8&p>qsmVoXvl!(;Rv bdnrX~ΉI*~>"`'YI^ V߿yR,I7 f'tF$h8'oBeAHK3oְ'dDөh(Ϋv8ѥ&u34KKG=V$APnz Y+|UVa>&Ő0  @|sJo1t`gJ`w'<)僜A~楡€SHE\? 5C.] ]LjŇ ƫ'01i\H ڪA79?&2G;ʣQ{'U/_ݞa< myBw@ъL dcD֣DR) 8g-U}.i\p:_6.}T'lֈRoYtbxFxdtf:7UF&S9J8]կ nSwHЅ3PdpUP,*S 萯0M A0@Di)rLgj[I>K]>tZ.5+ os%5\y2>-{M0jj2uҁ,JnNYrŒC,ô2!|e0OXd5ekb Tb#?^`}E@ :RS@pP7穊-q 35%r َ},'&%:Lؚו4Pte@ϾQ?-=.yGfyђd_d;WW܂c6'ˠ}gN.*~9 :[P EtZWWlN:Ъ1o-^cz&X'bu?dw%pyvIixm?Uw?NLghy&}1HhL伸v-_**jS[6眲"}'JSMOL- 7ޏϾUԣI=w?}'9.'ZIe1Jϣnl^|>T~w>C(m8e'sK /:ټݰ+v.UyrmQ|/Um-EV9¢[H[@-Q/XEbB8qA\(Ę'0O״3qI|9s}^}pEBaK@sEqY;)vm\$@e!J~:#ooဳfo8Xx |~gp_]b#,o֐&ދ&%CMcQJ>v֋V G|c\mS:ZmItO;hppmmt5N%[0oߟt09E'rHa\A\pppqBA<4x}Me4oLapmk;=WΡdDia׬6aTz՛˙QsrJ~_+r+ oBϡݛ0~7(k՗8R[ge;^$ˌ{S[V1ܺDԹ0On#Мzb(dCWxSY fdrbUБWYn$&jR$dA>ت.(f^<(8`*KN FDOi5SPg az]pem*KoN=P,\p B'Dmz.&Gp:>CvIUהp ZWs"U{U4+t4 ()\q7k bZc[Es/˲V^|Jk%wyԋO(iFo>Ct0#5ZkHq}1 ' |X{ƔYؾ[v@}ԏBkQD#8,HYD\Nf5s.h]HRb6QH5Q+!}X+D^M@)P12\]#Bl S h*12D "WU0Ѧ!KJ^0Ajۃ)ӛi+YaTl@Xw3On{ftZ-WТR $&͵ ^E]}h˚K ;MLF?Sjld0C2=*C'`a\>i͇}.8hR P<'LU 亂sWRǧL{W<&) 8f99Юomg a1a"·3U^6(2YqƂoh6"Jw^XC ޥ" Ȇ5_LVV{ ig xy.[şT"*  {%l]}0$nܥ=t}za.O/>忚^OgNϞ 9IpҒ:*BsZDuum`q y E3|Wd^Zo:$ DylnJ7ַ*R 7mDsO:6[ca"7TCs=\RFE-A(;zF)L̮W7<µNf?bהd)k ulm{E.4nC)uNo g&s 5¬zHl<*bT恰>m̀ی5·=xꔅ o HyBv="ߥr?K&0p>^ {]xyqtU=fG-%[4\Gv|~t|L`SKYvu{G_$=M*;6(aM-$TLNMMC#mY>Dx9fUC9Zgt8$) fB`J2s+05|}細-.g$:Hxur@뛩$sL=|ROj0"*H.d VV1#嬹&3+u.y42qML=%;+\JEs)\0K\$FA6NutUt!OL=~ep@<)gOSqgC T]`G{ wTo0( ,\e & # s_ꬶ ,ei2+IQXMʔc~>K6R<2kxȕ簸&WgUZZ" ^F ϰ^PP7ɚ;o>;})bYKJ'@QҟuHt l}˞C(r9"^q7ӱo]B8wd7^fT[YMd}ioCv^Tc[Ri"I-`G;|mmuf-AEFs3z*u9KǶPpPTA(IDanWc]m]~MJ=z3"7"0."ªB %,EYuT*~n`SYGMgZ#Z= #TbS ^fV\ Oz )ex^Y ,'Y\s"gR:,"VcK< a[/{_&3U3B.-puFQ'=HF>WhN-w>(I X:qonjIG $qIW? beFfJb{{K`LlnE'n`Y5By8Hȶ=xG;mq0PهY@3S*7[!~~6zr+b!Z+M :5^.IBҴi9ޯ,c[ﶙVRa+GBڈ.L%N96tt( ) +p(!j3mys[~ØrC& - 35Җd!L\~siDKGο/) &(d{>p(~u 9u9r,%94KZ9!0£œAT^B㉂b8KbS۵2\0lLoxaD[|6VplJE2.Q upD i{/}R>nn0H}?U4+e-Wɣ>SHX=)@U %3V^ 1MP4}1UWQ /Fh *Trj}NQp\B.att#B/ [ 6f<'P*8mʪﶂIf-ah\3}iMXtv9rM]ncNP灣dcO{К"oc2ĸBUK.]'9ȃBut-Z%M`/xٍ: ,&h ȓ a`5eCN QdB\?. #W X/(Ɩ+EAvC Y\u*߻ƃR `/8}dƓD1i&N9V;JAvĉWtS0B;U- e`R2l-Ok][~ol4Q"&Yv|jKJ^tcKIdA 9Nd]'kܗn3g'7r{ n=Q8!3O?d/{W$%)7˭r " KLpEꈎ 4^F+ nG P7"s(ĔۿO,!eTN5';AZ Մo9`{mvE )E7o=GI&d~#mv4笶+ndEI9-R;˝FLn gʢ#G-B_C3GD) F1 |d<_߫Lnmr>&w+rDZAR>nGMR`Mb1Nߗ7b/;+6@,ӴUKQFU ՍjI25_sS 35$z+yeAU$SL&cc&U.[Y9_*29ǓZ&uw[{[PکqaPK\WțgV%eѴNY/a?[ӯ=_޺E~mU썦r8gpO&40 ivxT~v%qx .e4HV5:@zpX>f^TrqPaݾ@ :Pe]@o-Ln&IK]*k{DW?Ն&ˢ6QJ-@,2qj|݌=nuC2z"nك{zuͶJd@ZCN(8şSE ͨ<ج82LU[ϐ͹SSoSQųeNU$_V,1$J J] g*7?қKAbN#:~I)2'IVl2k8ij }"- sPX[<^Lo>6on3"uްhmWbА_Ȱ(;^F~AɎl !u??pBk|fR;,QzY͆䷌QlCW$Ͷ%g!]Eh6ɴy[kZW0kp ;XRfH˶^3e{Py!Wؑl*MJWXtD]s9v]9S+L98&ח/HXG飅'YI&TXvBO [NY3kah:vaFAjHYސ]\7p]0i)$g\ q\th Y ^EQ>{$~-X]f!pߠsccH3Z5roZD^^CO\*M;&]&We86el>en<gR[iHN)nb3:%Pc;80EWdkEЂ:?.½FvX2 m|ʔ"_7x7]{ w hAEl,|2U:Hc!kwm~U.UWj*~d"翃flZl=}lMM!0;N40[inCi^bf x7q>ľa\h\&"~t{Rf99h\ͼHl抛}O[cnEHދ>}K/:SXٛ&+dkJZG\y;B=RQqUo$SEQ^.7 TAՌ+H~5-gyz7ȩ'"CB>|SB>7!FZ:\!rSIM%РM#l1TCEG?U+*7buCʶuSRz:"V^`"L &0Գ\,[Mۮ[hȷ,2ڔ`Y^rB[.r.۬TO+w<(YHjs8n;@l󇞽ĠIB+sb ,6z)8f =(Nm&S>`sHvDLVZhN7s06&qv$55fP\lnT_B{7oqx.GA*Y얅e>FSʳJbEnQQԍ y-00Ԯy6S҇׍J=ʼnzR6u-e1dљ: )V"^n*oJ=),mN>J;m++sfC}}%[;@@%UIO:oi[!a#tB[稾3ŖN_KSAx# {lC1esAaC!C`̩6QPȰw,CexY"YqzZ3pS |x>mNQ)ܤ=qPk$eħ٬|ތOfc bΞ3-1t+El4(UEkuNLp^PRt4Po>q\Ike_.񙶑#d=^P2j<L$ʭpdQʲRJ|#K<_V`8F}/ג[ LÁF v`ehDгmclɦ߁Ou ]$"."vwבž\ f2y|C>b}-] 0boV"+CWI\aOؔKy>L$i<O+vdXKw:Ᵹt[.jk\SVݥY*kS1W^#} dc21~:HzX`K(X`)68l# RjR)kԛQ+3|u˻ɌMd8 SghqiuU0uV բ7AݶMPeK4^5a1OnhGn_J UH\6c-%],hn0 B' A+"Y2`*H 6huK7X'vB r`[ª}/i,c8<6&a"V&E(5Mєֻf"RA>oeߊVcp& gXWl0rVxˬ-Rk T"U@E =w = D B6;m;op&k@U=p^.R2YMKWkTQXkmyɿ3h_ґB͋>ڀ%K >|1  ^ 4Ș>L\E(D1Jiϧɼ?k^#hF릣w[J{$;/}祧kڮ^u*^6AEx*3ʨil)D@@+YFV9kdCG|c5ٲoU ]oͨ鎟e[M]sڨ[6 Cu#<[8ʏC,z-~4XBntф@lW-yߕw[oU+/wTv//_佭[\g>&Btpx=%?>?Cs{VIq/TT+ #KnPUd)& v ۍ[s7k}eA'뛙(cY(ڲH{T$6t .NR ROWݏ4I. m3e=ܞ z<&[m>o1P?ɩ(~2& (kj嚈M8" $GjlWDKP͠ v8,"`&2=a3ߌSV"P)LqN򙨵/N}zFxRo KGo!zځwvRz84Nݮ8xG6vϚ89wˠH~}c٩ɬ7NM\ff$dg=7㩔XKnfukƳLg^?{h^O Lݸf g hU*~ULO=X)pp":Jf" kOjGYqI_n$Y=riFBn-0hS[agm]^]>mؔ'M^=tUK_?*E!2rYUbY} VM g%A O=LuTVv!:csjn U1ip3n>PQ>ڜ.[şaOR* K/My6Ԁ2ځX/VR]) CاOᲩS}zQ&i}z>]߫ZpRZU ܨb2:Ngɹ&ȅk Oj7ddDTi.ۃdhZ,d7Ƭk(Q?1&*8)oaD-%[fM!^YIL4:b8 e/)_D'8M7"Vߝ"DR]d>?Fo"Йwp݇Q-wll#\'>% 01K4jzNݎ(Q dt2IHHPb}F>Qo`M=B$A58 Vf.)ͤfjx?M/TC]~4`DGI[vN9էwe0Ek`<\?߯wSP-WI6?≛x34_GAk S>(<߁dOHMTҞ[3!aEcH2D5k3D w:lp)Ȳh=/̎4ӷY{`<;jLF0w):uZH%{,f3LX6H 2HuW+ffvSv= 1klAO}>8*JAa%V8)t͐)F<_\ӟ2pVuě4 M">wZ#=ԎʊYWT.N$oUre ej_L߇)@~֋Ǘ) 6| K \'ڰGiINd /%]##bkf;"MoZ`vF6b6 MYƏ%gf:H٦ٹJ{+67qFȭ(#BquqMp~KCmUx)<ڬv֛*jr# Ц|R6Y) 21 msp7R@CXLqj*JmȠJoCOKăxx3Y~ 5osit__q?Pk];pB[g c6䦬v,2Cmd.p!)SsL>´>?I{ۉ( gܸLqz#vN]]b"r\^(,LYx ޞZ~Ϝ(7-6< PC+KRoLEϔ?d-JEnd8Mm(z,͹u"璬 粑͒c,bh0H2+9[`~UPѶ2'˱Kh("Zf;M"ޠ1a>jGimV'E7K༎>Qq@{<ᏺܙ #M3\qEy(3pEWKM}砶{%Ts%--M8^ HbZYy߻_D/rʟ{U,"ur/Z%ypRFZdЙ]ӡ*W;˦gvӕ+(NCJֱ G2[Я(>-]Q:gÏ閲{3\Gټ1`f!h-i2й="M!k?Rqd@b^6 &{)N$ K '=(zo9=J|X.'Ѝ.wRu&ے8*2lL֦\y|JU$XZMY $j$="UWtY?21M0$wrG"j櫭͗;%Q-A$9rܒz^[/S&%X!X.r kIpxim]ojoIDIb2va_kUV\T4';÷d"jk>ۢɷֹO?MF _AW?拒]jG YmEtфpkgĦ#5mV2 (5S`fEN8-ٗ}Ŷ\3~L6?$aZWK$=/)\b<\wweJ>߬T^@|eE;ZSԺ'Vjbmۤq,i/=p%w=B@31pۻ21W*a[?P%(P4nYK0K"2b G2Gե"%N~vz1,90맒x_Rycb`0HːWbK!%)ݤ̗'Gx!{`Q,l^PӚ]W Jj޽&U.[_^9p gt>w( 6{!{?(9)ܴ*J@ةȮDW9Xa. XT6Ղ,L%VKcNWR*gT]r5kq/:2/SPb P)SjPOQyM6])]NC Ϥ!دg/!cYސv"ނAl+{mIEc =kl=9u1~vۻDDu h0bM@[@~YU7߬e!0{1}RϝQ=uj0ͤUpO6m$Ih=Ge-v' M¶Em=6J]i($ۑ2X (lX7p_y{c77v[g}LA%.d-s=;[8nUr"rU'HswraJ*(t.@Gֹх? @= l*sSa6RqSl6 8,6T]v7÷ Q׿r66j`ddk4uvOiɘB0KS,)5SoJrε:5rBV~ Iw;L&qE)@ *ǩDjq!ߙeyR! ߩ7k} 8MX5`+69H )%^S !2҅-%&&J'fF t AiЈ(*qoHp(&GÝyz][)GTh#fWF]nư2u_Co3lV}y)ibL5`ПN'AxsN#j0lrv-2U6/Vel/DWS0{gP`+ksu|6aQ*C*7ih{&:[`οVpRYayRLrReE;lC6p(F(IۈUo>$D R٩"Y]oq L #ȧu[/ŽJԽJBIQ  x˄:a ,Rb]r<[c,]7H A,̪R⧷ɭ\87[Ycݸ:s` /԰!%Sc*NpeE~:[ C"ţLPC]g7Ab܍r̳D"Kd[I!G\'5Pw A]1W` IW$SDdvqn/oh,WE|psHMG^zܺzgA6v>LV]~.v~~cW] h+d&'mElHY`90B#rjpCyJѹav@k'R)qH 9S1Pd)M|jPmH/F~-'OW䵉5=>K AW뭒8evNeo*P.EÚFm鱬o{'#1ma*ƄNId`(Z@]@;oQ֥]oJ\A5XX)RM}3b|]r ذTNqڨXp()8%֌6iekkt~U@DvXs m|ʔG_!6ڧ pqat u;TMCi4 Zo? ~ ~S2Qf·oM /NًE~ާnލYI=BLw1ܛrԶUg8vgc*մOՊʯ\ݐCƷ[udݔTރºN碈WFmh;ȈB'fT g,\5XnngY2)캅|b.3%(4>|!^y6S-J&q6wq>[d -] v1_11bo_"KCȤ`aL0)zٚ:/I֞yfOFWBHXu<{-Y˹Xm ^4ָ,K=ގRHK_^O&ˇPinxYVXlι3o0#f'heʷ]REMflXE{p/1J)Q` C~zMvo[ғ*p޶!7([!d }RB;+W>} ,E^6R`wOߍTiJߏ3O / >JO(]a ї?/g:/4jX?Nt:/W'[Z,]l[y!b]RMaKl y{,{K<<uzuۖ~  #a0x8&KDeJ|zuXE4Rh-ڎB6U1opF#@U=pu$DlHA"$|kg 1/N61F\2nBM)Z2Z2.s%˺|YzG @d yq)q360e6.e@`e`JSN Lt~,@TCMT-CJ|s3^uF8릣Y& ]{Qw^`QKG7 ŀATSQ9t=ʝxnqަԳGcΣ X.T,dsi VTWK{o-S-Z| )Y]ݞo' P*+ȡm\yeQ[iߚmE6ԙNp!Ey1J!45Q]!qzOKt^Plbы&2$A}SMxl:?k0gUv?[rk +/?ޗ;;T*;[՗/sYl=r=t֛/m/xI9>Ba_Ĺ ):E2c0Xg_e |&뛙(Yc-ڲH{T$6dNr+_>_;&rͽY g9vrpu#cG'dr_og-u4=s74&]8Kڌ& \ᰫj,3DKz3h„}t 0StzOt7;N ֿZX[@ZBHQکO/~pA-MzٽiFkNqvqG贱{֬uY主_?sMNLfpjB7#s#p$'8,>x-OX RBխe̠0Jf6{ׯ_ףyy<~6$jg3u㆚+Pv7L139mj6X3g|MGHc2y$l/FA$SHX5cdot/ꔢx.\4`)W=k-~vLGD~ι 7$V5r=>:&u# p<*n3_o:l.mYtHZFOìFa@K41((ƒ>æ//KQv5;]d|+]@+ns||E$23,hg YOpiP[6@1#.R7˪Ydhm~]W% GVEFe=LDž @iw#*wðoU= t0z!_RF g% /4k':Us~:$ʓi 0$WG)xhۓ/܋9@F"H7] goaS /j7uS6MD<'7OG}"wӟ?zUzYy!?y wƼz ͛owIISޭAZwZ#i{=L^s}.}THV5No2ȳz1|٢L׿ 41E96ZɏhRQT 4I#oR ]!HgcwLףbQR Su- ~Jkzss is~.nji!/F-]&jUSnp h cxZ5.GJrT݂i5J*Ilל : w{u8yFWےhYIB8U߇ON14W:.O3V`/nDc -0W|\63yMUXc1Oc4cWе?vi Um=~će+fgSP hu|OF'#_h+;rG@`cƌ9e:fBhPQ$:^6z>;1嘾Da>|(7wYC QB u\i,;kTf/|a~ rJdSչLJ4JIN=k@Zw2#Qr[wL&3ZN}5̘ʲ(FױjpHd[=2<+2cL1@<|=Ch pBfKZv@ZYGb_yT.C4rx6ߞ1,Scfy>߻ub |ɧۛ^}몾uoͯo-W}KԷ] tlϮob)w'?U-LS'hh=Of YV\KʱM!kVco\k|ĶqrҤ{']W|\ J$N10n%VR#Wҧ_ވfd]χuȏ6M0j,zXο]=ֻ{"zjݲnG}@Cn4҄vh{;>F 7G4j4$7t W.7=OY~ckZ\2Ck3Y~g{&=1sj'$X"R+4 D.IՀ&֔p6#S~93:_g.߉QV':xsz/mɶ<>-4LRRm}FM2)ħy$l4G|3eLDQZM[X(% $g@gOk`BBlHr?~b],>U_ HClm9䲵YW":Ԭm|Vl?wu~|^c.C͆m9cZAǐUH٧#`( BO'Y} >^l/ܗ f_əyX,>kNXɰbJi䴷~{٫b6JwEN7o-cy_2l?ody<?O?ǭzœgSz@e=2<zc4&<įF_ˌFHѯOF?'/^ *Oȇgm5gO'ϓgA_Y2a@[9YO;!Iogf Q2vGͼ̼O m1Dr 0!m=:[UV,h xwlcoGěpIZӆ3JdvqRŖ6* iv!ֺ(x[fy $> y$@h)J wwr.GBp~$!!/!d , ]v^_[?Dݺ wxC5 fpĂeV7NN;YvS=9+%@Z^Ҳ9,Ԅ!Mũ&z|̹)%t wC>#\0pS [70. Yu{; $L  xV& 46*h;ߒZEޢ/I zbmMk/wVUV}VUJU n۪jVrЪg۪cJcKqfL3A!)|OiiW^<W_ i?w3D}3VG>S?NN ɓ dRl>/fO Vn' !JVe3?쨽 0HYdU &-$˶Dy|x}ҭ@/'k9[ep$,hyv0Q*ڈ^&MjegƧnq%?'j.nԙI-t_Aj-h;@2dS@D :T!] U[WJoIZj%&4.o+MڧCV-37`iYSLb; *,n٫CL S?'/#>4C=^7?Of쏻hYI wqXD-ҦJb_M@52c;h5o,be-7^7. /4:&P(iyN5{4E`. aRDΠm9 8>YhbbYgl$NYTٝygsv v^ښ]Y/23SJKiU}';{v;🷟_~ȇ߹sݻ%-IYyp|>mScB ROH6HV)b{į} xs/Ochݰ7$3洩TpK"^Kzb]|M1Kx_Y[EqSW؜ʧ% !k nw~+d8]LVSx4 SY&z |5!$4-|/tU)fmi+Ԋ; Ym v^[[ .VӀ;:n+Ճ`Ǒ:SKžβ^H}PY%]t)XDNNvkpi)DqCE59ޕ{:^+32Ml ^Y-tOhKY$*I2\[.[Y;;R pXsH9ch3iL1b[s(1)e`N+^dl<2JL_JMªB5oS GQuR\ h0'+ Qne,0;M2- #Qd^nH;sXsX{`!br^Fv6G[V7&?̾$CT.cm}EGxo4ǜ ihXL[R!س4D+#  gZyI\L6B2Rq4u]igI.xp) #ɏd RYe/AtgmgLS.{x HCC.s FR(XӨ m陶6$Bcge] ^li"h,qb =u@'*prqK\dczWIa/ʞxleBdҖxaNs?Ѓv4l gh#bkYƤ|Zl| ɣi5GHFhg2Gt[/۳OV拧Z2q>JoWhƂB"%R_"76!hVl h@%rtE=An/q:k")S,hyPv(5)[sy[)ՠr}qGL<`vigR/mw}Zd " Dzwю8mFF3)R~#/?|{'oQmf3?ߖOsO>-|d>~2Di+(|i) S} "ˠ}B|SU:||׻ gѠ@@+;Y s\y {ߐ^B~\^g,2ԙJߣ A:;ay@~XPS:PhCd9#@@.0@`vg gy߅cz,_z$.SmtpARՑWր׎6j*г+(J4FRes0ߊUү߿]Z艍ʒ}!*A%Q^|"U} 5O[L +8:/l* `R`t~q{lydX4|+eeg<;xdcxgZ7xmuD$Q~uc-LZ~;^ٜ(}BFMfVz2z+>_Gys1Ie@㔌m(G<3HoDC=,yj.<(~xA"'luYmrdXp"D&)dF/$Wğ[pRZnSV{&ݕdX~KnY%T5z@^ث% v+=a@(%FJ\I1G_4{X򬕼xe1LG mΠS}ZQt@N 7s vGR&k8YrԄe%WELFޫEB/WEf?LW9DuL kZpIwAIPQT?D8U*ST^Z:Ux[aYG(\;@k8i(k~E?NU$]* b0u3iA\K)ЖVр&L4ۛH&GJӖX@ 6u,Nwjcኀeƽqnͪn3\]SQ1inKVJFbIcJիZfJ+g9ɬTfҌm+T6=FV5~gݮnv~ć7pO N-'~WѦեd~ ˯'_'_'_/x?ؔ?|]qҨm|.$ t%GD }o8]yp SV6,yr.;Jveg59υi!p$I窟K~pt*N$L]+v}>x#B?\+uPruҫ =Nm轗:2MGauKʫTL%{%!!UCj,;'W׀.Z+V/+2frԛ20 j^fUUnr^]rqTMNg=Uc 2h@cEnS%ג$ϸ"/DsGYͽVPV+NrVYځ B&yIcq EwiI?8$K7;]7|TéWGm3U}J ߭\ DVPhF_n*ӭ,|Hh|]}SMq]bz0,?0]򠩾t,+_._p3R 8ȥ7ce1͖:>8Oc~j0|s?;Ϸ0˭/;p˧W轉bLa}HKKw Iܳ%^ߣ Ɵ~K3oP;BO>V{ 0M8?@LCo 0&.Yl m)+?bt/q9Rz%YEEU^"J薤 N8Sɪ_ʢmZ{g. %  zAU1USPEC8܃6S.K2TU1#Xmin ]7tZ!rHLǷ :eZҧ2%KJ RހT /AL!LvȢV_qw_p~r|Y׿u@Pշ*//vOz9>nKհR3ua89D>v@8Tw?ꂉpWUWԹ+SՆ8쑺RmH[X=:^_gTW;:DT7Vꩺ:zv.>8D>TWUW/:olbmuG5g[5g)Z}T~.O۝smmպB=!vBtGN;m}ʪ9.Յ';+vNOř.SE%z`烾POqQ3eG͔ g/su(IOp}Ww:~TՅ*{|Pbۭɶv\]X2.5uQWuq.  X uu頋HD.:ꢫ.u%rvՒ/ONlD~.T]C UXiIȮ]%BQ햾8ln>su]*}QUmUyw]%Ju|*fo:wՓ]ETt;uL]|TLdGuNpFg}"vNzD=ޭ{U&Փ;UdayjW](}.[&ީ-}d_i?3M頋uN]4š8rhMuq.ޫ誋SșA]|TW}qB/漨]} zˊ6$ I8SGuq. ۟J9Gꢩ.Zꢭ.Nԅ'?S|ꧏιpxewԝ}?Dvxqs"DyP׳}[f7!t} ;.v-Nr=.,28ԘOB*J'YVY.gF^WwՅ~r/m5pd0Dp[mo[n)~8rxHUH?*Z*ΩNW__V fm lQ/ZU_%}Jysr+6:Ԣ|US;O)/EEEڮ>O9>;mYI$ݻpTɻ-OkخA" z z dB3#4NooBc?gs k5kkbC[e^[kHi G00~cN뛖$Aˠ\aYT@#~WkC]Ner>둟#Ԇ9$[%g%*m :#Cqr*tmyӣՊh 8A(ӳ5$,j;GS8;JLXv<?!cOw $CT_08=a^_ꥣz <߇6CAr N#: sR+L..44h"/絡V8,5`0 pXVgk2VB4)FEro ~%NyacEHJ/xX!C,742R=2ީW|x=^\|x|x2^e{prd>VFȖ3jPx&s5gF1bL c,5uB @*Rɹ8 9W+KS41="`shRL4J!sFk~ x x H~Y<~>왝?eGCGm&j-%ޱ_JsNO/_s_S<h{~|r[k6#@|8CBrR(o}9:~пaH^A t9vdQC\|EbuOx"FtH֟ T鳤\5oE)}$m|qZb*Eg:jV1³sfuNdP!GaXnWP>{jȩnzTI"wUa sɥCȳxoeXGgF(6^єZðKKw3d|Yz{W~㡛2?÷,AW;[AtYTƣ_J ƒo=hOdb[ϡ3/H=L~ hy`| 'Z)gGkUW+&bp)8cd?;lk#@ K‘5 {ެA״p5L1W+E|)ѿr߄Jl2W>se6wߥwXNfGƕ/ŧnt}UvMn>LZq[D]YМe^@74 3S,}2 ީ3+H wX|4+[Bln8/eeA dzoĩRd#3seۻL#oNK ! FlI$/4a%Sv^.r6 1%~iTW[?7~*Ǧ?eϢVgkPMO:ء6_§$A,їKN9m<@2EflSޗ`hQdV"s5s΁z,ӛ[9x&dqw7HVM{Z2o?oRl}jCT/e'/#$Ӥ7#Mg\C:%Qoz3+L[®14~Xajg'{"qΤ ө'H<'~Hӂ`T)Qr"1'x:1rBUq_ZܜOw|*'RH k1vO.JvO)v*J(K,TKr'i5vDݝ9NgWz$~ȝsCtGFݵy\ph];= qRSiU}Zi2^eX0<8k~DmE8uJTG hbgH\s,2eȶ,0t{XTPH'N5FZ(!ڬ?0h-*`X7Ѥ_=*Ÿ⺒MU-?BڲaULrV6 v}Oe0F.ۻX]>9 كd.7+P!b"%$ $aD1^V`ųNP?HvbNCzw͔yl:O˟tp+701L_=ZC,z{!DoZ_{e3t zeP3H*<HR+TJ"@-QuQkd_.= L:$@'EPA4u+@82)ljiF <҇ÍQ#S a'Zp=i}v+x1J,%{ۋ7Z<^eݼy\q٪ ,> F࢈zpc9Z 9MɒL@6Ђd_ǒ&" f@1n#54"eVo>[<vy{&W#n ZWguÝՋ >#Kv.3m s{XdN=OJ;z9-=щ}LMl(mhFoZ pd[?-+Mw^6/JDT(k4ђkhs[)2y(KX_˿؇M]{AvS?AU[/!bWvć&vws%/.2|)))?g~6$zR))~L>BٻǛ*dr3g*#B=D|Xև T=DOqIhx)D#cbz W{lhLv(̹=1u΢-g0_CT{L"%TBp|'fiZ@MԋDZ! %ؐNtRDk%p#PS?/"(Ch pJR$R& ̕SGiXыA-X|n9|z,o \,.Qvx4vHMrH02bX1XBE^ֽź.VRI JbU)i VAjIh*CcVls6JvFhȋSڏVa3 L'6(O0V ͱbs1.碐#'BJoSÐд 9H~] :9YʋI24r/9!TIJk EѢσ -B3L*aC?bQ BUB 67 l;`2R*62G??agt;.q{EǻZh KZ|e*gkDǓ:)zS5A-`r j&xSD%|"L\T1C ;i?8TLgשΛb7]-ۋj|qnʯ83%ͺ՜TP=w; +<.Vv)I@RYFus򬠁;@xT$R#Ƚ& IA>Y?/Y[V0 f|75Bt@ʺ5}7O~h/8%fřvZϗ{V/EdP0]P)lUF38=ƫ!W3#pD*zh~U\9&\0Y1LyƆS'bC0e6zL7Hmgzl]] S* i.z޼> !]>Tjc{k "&S_UyU~ćՎi e$'''/σJg8hWo~ >_E \,'/#Wgw"( `z'IH\Ol&30Ə0xL.! jk?wqqTc|;,Çua}OaR0ၙ9O~RܬǬ%y~E}2=B_܎i?3k 1?Jajo;bc%?u d2x ۘs*CD7g=Cl4d -L+Rfu[nOZvCK>N5uٽN|y܋{ l" t=S_EnNDGsk SaÑY>rYE/6ퟳFXr?_)sRek@L HN~K/g?'?>ӋjœϏN {.Ӌ}&);+Z7vc<|Irzrzr(`@=]C 'Jn%tLk@W,9'\3Vi,Vq7ݗo2um[k]L.3<2vG!֌-[cdE,z ZBNaM§pK&SK/ I#Vݍ'0$2C|KmC?GM@rO)PwW!?^xv\̷ٕbGHNE{ʄZ!;5{rc\p,W$*p5gykct89pA"oe)rG;e?=~8rBh)RSDO4/N5S2$] W ydpz: B6H׸^qR]3e+pR5PXA%M5к` ܘe%eR+|ET£˗0Z<>UoQonUH0('w'Ge)8xb8tҜk FՅYibS|AnBN#tŢ:LYnIvhs}Z%i}#a;sq_j.RbeF(" |ZƩ݂쥍/RY[ ~a!r, jhL줎}= >#%wPgDQR\l0D1U'Hd,Rv$ܙ'id_>m5g-ސZ{f_pd-W/z[!7,=^Oo((kvKJ4Z~O`.6@t6H%ܐ{cGvs$q#q{N+qQ6(W=0UY Xf3t#qe/6hx jE=-_-wZhX t==Gx f%KBc AzR5KrL# {`-7ۚK2C ےhO?ri;`r D2Pc4 f`A¹NA_i}(5; 0r஠f9">fR^]ʂ6AoaQ~hsxEI+3y7nn "^eNT60Y_.LMڨYCQ|"okZ}8I^+m~g[ 3>z7J7y޿7${}>EŎI`Hv9O lm /ÿY몥 `Vݲ2ɝq#J.=u  ƏM7AxRul9^$Vv7^+/{+/g;|+-o&C1}}[Pbx@r6 &FEcMDY7Ž7*Et9y+!Yr 9 ΦΩ`_bOޗ3-puhF0i,zltlo|%XGav`os8Xq3z|D_5dǼ&$5>͝]]Z>߬OVjTRL{h\=+;%e,vsf,eIgf9Tj!H[܋CߧW/F,Rg{0R֐%޼n8n#媃ŋ57y=k*ի^\x |u'5{ZdK9p 7=6xGKg9oߡ'>UT4Jk<-k]9;A!즛ɿf;Z\L-1|G,YBײ1VW&a4hU+Sˊdc)v'bi xg  뢜7%k9iK%k&POG) W b-3s)߸-Yd,¥4-&MW.,qZbWWukT`AMt`2F}J4~Y2 u6 s;ۥ#9k,re~jWX%+Y;=jN]BFICNȵbKή6]#Z*s|Vڢf Pv\򑤜JI+8/H¢@7Mn{:tXʾb Bt@sJt|ng?u_aheNҺvg ILm2bn}/?o%pr \C$7ot6~m0M7t%{6D@@v]8A1cd_J,%~YL9u$ U 02t:ixwGk:!L5՞cГ 27 ţ–2ʾ .mUЋ؇d|(W4iT,nKbsMfd2&h40 G~#p(%Ϫ%3O%dʤCο mG*r$0'A\0!& b8-3-ތdS5<Mx̤Z*iqC"wS,c!q8η}ZO[C(E 绚1joyݘn}TϜ>mV2#Nޙm1bӆPALiZtֈ)%Vg̒5.^ ۃD$u[f7M<{Z'ifηALm6]9Ѳk _858|?x%Ŭ/:^)>\)5E~%zf 1pX?36X֎OZ_<`A9B@ ^8U1]!nq&f߫(wX3}c^7@'Eb[NAR4lh+`&E(H`AXΗb1S| fGMJ*Wj"v*VM4EnetЧrI'AANئg GrYYZ#ei[DIsf#:OTB?[AJJM}LQ` |ս)s}1Pv!z<j61ƨhEy _}ӆsBReQβ`uم߯fkJ$^|&  j"vDv0$1Lw8yMzkQ)qMw=@"=*hC!WQ bAVE&cR%vxv*~wި VءHŪ exJ]7Z6)K닥f]*;\ 4հ;0Ȅ.jh{ nXܟ`,rw&G ioa2¢m HuTu*:x# Z&ǔ /c [vQ |'k;j:\`gQŌ9>>_Łn)ٚ˨q#3zș܌9jdi1EZ~a7tɪz -zBc"o|\>>pd#oGPxOOvR{?/Lx< *QgSⶹ>Ԋ@M"Ka5`jpZ,s}X:[%s@JuxͮAGNkPM +xRRODTSZCA@=gL I8jYó_}sx+GʣK_(_گ~ϛܾX}9IܾW͊ XBh[C.pЇW 2Q ԭ;ݣK^wF+٭yܚW+f,+7*Lwl_k<łhנ4iFgok0Ld/XKT+9fާh4]l];'GmR;o(ӫK&@Via!z꾍yR7*hǽ=]Wzre5H2.]74&rn7~>/-lGVf +˿$]E)@qx_a8!a9i3@͙ sL:3 Jw\߽ 9<š)hNV%1L4|^' ~QNӸDˢs64lY W%|̐ {*[Գ:5&[Lc3,֮N?#/Ÿ8uhphS6قڐ~c[dԛ[Ea`zC mr56߾U7\o>]zrQWΙ.[}] ˼T(B-(^QܛDw2X/i}ī]Jv>ݟdӌ_ ?DgɼLC=e/㢬 8-/qY'ԢEAk3(*udhPQ1 IjmaV8p><D:`0_6de֖O9 91-%!g$A J?IV*"+I# ɡuH$,-Ei>>ەYYNoԘOgˬ57met;kZlvjlv(w6IDM %HH>!$/u`$@ LZmNx0@̔_<,y:U(,] Llv:@tb.|_^ճxK3=la }U?<*@ i pC CJrB?UՒxBi=Ϊ5β}䀦`AWhT /VՋC`hAv+Np }3_hO=r~"QC?"X ϣ\#(#Lj⽻{ļ!`lp1}cK2kӄQc7'Ua!r#ŞPqbtiq8[RƭzksE<MrVV.+#tc/ ת+5ט?x@>/-@T̛5T$[.7Gg=dBdbȤ$Uѫj)ޤ[I@Z(-Y /wxKxұ e ҽ\>r|[X rcs j!@?!>f9ҡجs Ȉ7V]lEQB-8G͇Pf8Y8jMYux6|Pų>{2|K .H7#mfEF @4H7atʳ4-%eo@%"wjTPܦ,L=pqJBf _ J#!6P䇆U9ttueHѴn78+ܮUD[U'u-Ua:kb]Kg6( ":l>ؕxɱX|Y{ٰD-qpw3]Gd _ 2 s7q7&y @%5l֒԰u,>"hph(~(c6P Ti&L3' PS q84=F"JBcJ:DIј'X;B4O/5i$[ffւ^컝K4tspgn,!>"j̆{B[Ab/ę[9ƌ=ɴtN$2" bG}E)4y{=mޮ&Y\~ > FB8fƵj#~#>O-Z7IDb5OJXpeXg0.::0K ޸Q'ɤ7tUYh|`h:rcod4EOl4b~VУLxLɥƞoqMa*I㹈&=c!$GӀݔ53--Lp*2> 8븱.lןYKRl(ƽ6ke,61'쾜i ݌4B JJ^˜a^qw^a9j6''?;9q,~"q披p jKO锻(|jw|睰-X`Z+Hk*>WzORV K- ㅺS:@O>RW~ ~;Ta2Ҷzc@ H3. ͭMBFĎ4-w v4= .[SӡU]N}R"eɪ5us5Y=Mvݼ5Lyq*Nz $t` -~X驇^H(njW1)Ÿ%Ars֣=)hZk>Vno9 ӁPcgtAI |/a~#B*5V(iP)eM i6'(7 \e2Bӈ\[I;Tl팓vQeᦹYm/RQ -ǵqH-BNTն5Fhf3U ,u֬CBfȍ(Qy a P!y\Ut X,[!9C2fDo!K wZG%GT*н_=(o)Հ rtcbċU"Ћ=cƨߒuLRUuH;ȿ)>#V$Ǹgp@ujʯQ|0͋uMpUAbLଁBTul) uϠ>#",9v_!DG0qve±85+n ^`ix`( 8(.=lr%n﬌DZ_?~wVxڷׇΎX/㨻. V Jbc&~S+Db X0ވ+LW4G efAu1Ο|Vv3)@3o&3;}:QY !nIs ;puAK/9KF 댛ی(|~I,ziWx/Ļ,+zNa'=kέ3j}"|Z&Dydi) Bh~ s6!(QFfm Ų3/<+NK䁪swPFgKы92~c 6q4Q2%K$ߌ:Øk0Bb @_UcPC:eEYх`HP5 ؇sw-@"=Qp ƳuqcyWtī%^"FmcpÉw95m';wWO0NqflX VndnK@.+nߤqqr r @{{#gWk7_0<^Cl7ۭZ|Oq0W<2;hDQW;E.!(ӒXYTsJ|U ^("°O8t׵W5wS~ .ݒ->:!ȪO`oR>}_#٠O+vy(١ww׿8DK{kٗ_S8^ầ-R׵C;{?ݛ'Jɴ?2h7Zͧ.*|oq"'ʴt'DN"GZCw}~#A$'qWn%++󸕠cw*+qc( ]DcM KQ?Or ؋bl[K9VBz4.YcVMOvxTyU w'MT_5Hsd9ݏ{A^8"\H$Ih].Z|o9MY<ȼIdn$2c!2rZ>(F0%9:ѵd_(݃37uR k)S5c;:F^Wd!4$u^v"^yI[>^$'Iq&&{;j.3Mf(B%ɛ S<6<`C%+GVу|XKI߁d򿒈sm8ɵ <nMR=KM$c]V'o4/qm.+'$֫|}D*}&+|Şffk)@Yzċ/>#6[-KΫ$m{/vge;Pm ~{9lgTQp8)o>WqIC~7's)w?7{BA30n')q? ֊y/lsPV[gZEw* Ⱦdu 갷X2v%ԉuPU- bd9<13UFˏ1̱3mV*mf"$# BNÝ{5+07HoNCxoՒsHA&|f*o[HٿK ZNcw6Zzv"`X1ZmEP &kj7t)[VR q]ƚ#'6|kZNV}qS,k5enҿnb}F7Kugak5BLޏi9ng^cDZx )p/ }}Ԫs4E7Er]$ާ}w8,_, ~7n_c(=O?!r~=) GLo\B*|qȔ\GY"nt- Q۷[oԥd&S0ʙQzZ"69T C ƃ>b[.UԻi{7=e坝ݤ&hoH_X9ST.*3z)]6+j"L?(y@!?/+a*IƀB:xإ9sUH~oanDCx(oܱwj/0Vv Uԃ#D*w& ns_$Jhq .31o#N8B ~u_V㛖v)Ae\cSF[8TRFJM*U˨dT[VNL $1{N }jzY{o<&K;ұI2w𤪟;yRAX̹@dEe+)dDw[T+igGm@g "?I8!bH8OR+APlA OM&sp}h*Z:Q1t]1 ֍EmGiÝϴ. /c[d&ݟ_AM4^7l#AFF^#܀{n꬘&ZvꢆP!T!PpDnbi\UaU)bO(ό.@ 4Q=Cs71^LRR, y#b](bWDjq?TV.Y*J |饟O^a.\h~g *4 ; 6T3e*2Auv&nVgg2AUcj [&gY[p mX+nj g&hmU>L2U cd[grH:7FӢ^kUj.k4֪iMbApÌJ@m[M~MS+|(X(ͣԫzR|S nwNڤv4 д;fI!8n}o{ՉV쐬Go{ ]U ۽m(lC[W>t?fg>ay˱U,U;)bv#*5L((^a_zc0M?$D?u(B&};]"Ğu8 φ TaC&h5_Y,,ϻއ1&*hȿ5'O'T/cH:毛>Tÿ* D 3jhVTәro5T8frGN^cɂjߠ w~j uP\o~hN}Vzk?9]ӯ򫯘~#̲P٪YkK\ˑ7:1DG}]pKwR5Vͨ5Tɛl(mjyFPg:T$6"| V߬p* 8ddD5~IΒSr<"\ˌ)?;i~߭?Qn+fzL?= dHn>P 䄞K9 -mĵ]E1[i\˒<(;R1-/=8 9pSvN=70Jr&Wh믄' +ƒue.;]aU8ig_ ϤAj7\}ct$˴ }6+wpJӘz 3愖f0Zd>ü|Vӫ_h`'aE] C~'f3zLn:{9ċfBGvŜv2N{%)NL2;sby\l3R\d3.HXX:PǞ v3XZZi1c  <<@XAh@ ,PbJd;Y)8ҏAVZ ,{ӃBV!+=?Y)8ҳᐕD{X(Yi1@d ҏDVJE"+-bF6dr?bJ`dFVJE#+-xdE $+-HV{RJ$+0ɜɲ`PYv%+-JVz)dTT`JφKVZ(0Yhd2J?.0Y)8h , q<˞dŀ2J/NVZ|1e r>dk?~&Mnx{+'ȓg'2j`9; ܘ%2vTYR҃mTR'2zMKIZ6Dvj>X`p?38yT*lƬeaÉu`q )<W=ӎ[`MxoD:zq6ymώ_SzNd`/r+,1szNdSg%xh+Azfr" Vfl,80N?ٛsŝfb~y<_Hv3,1sxШcK=ٛԳŝ,l,< 2qÒ4lj#&NdoSow ~3S↟ p"},`A2ֵ1lNdoSow~vY<`Yv ?,*S=M&NdoSOowr~;G~Oy<_)6XrcJ0SDVIWdɠ3o^?ܾ[pav^=Iwv*ʻ;ׯ{R_dg>iwL}ﻑZa)j.#x@"h¯HN迭"B]h<+qئo??;A[u8Po{g[~W=|?~:Hʍ-:oΧӈ~c}Z9߸;~Whk'TZo;H;-Iyj Tk׍J\\/ί)Os=^Gw%-UKt'[GB%7q}EV;E2wi:}ի_n>n_ XmWR}U5}>wl}?:F<)6 b6˰Dun.OpZm u>nsyݣy;C:t* .$ZtT)_S^} }˵KG:c [79J&CoQʝI:k_њ.H`LS tJW=Vm^}|!`nU@+&3 v )@}klzCǤ?@# [mc*^pޱ6Tej P[y>d 0HM ^Oզև[-/Y҃M=lq8{z,# \_M'N:w|O"0/sO9}V/hLՆ;5A NS=$Q&şa #H8mV/B&ex,Jxx/LV:k ѿ ܗpSz ݘ?k*ǔS'nݏawP$@>VGqⰜ@P颉 ъTSγ yE#~x\`x7]8PkQ8y}{[:[IuHѼлistL)4[&O*PduonF66*WdzcNHn6LdboBx j|dݲ5Wx7-WGLR3>%`ø[t_QnȪ'_9[ψ"9o z|$FT`;ww]?6wlдFI@V.R Hi2@cXOΤvWa=OyTS7vƓrCpcDĠU8?ťUv}tx]㽀_P9P蘾X$Wã0YQHNU)'y8a#ҷmq;uz@ʴ?i5ådܪq~y1{ԦQN TkA ZWu%aw8~Ք . RSo@5ʃo2;`aBBT(_N GKxCZB"{iճՅ(UW``^9T 3}ZB$ B>HB1FrBN[ wr: RVgWntw2>%P"eߺe+eKPɕ\X9(ơ;;7D؍{T~NPptQo+ow:Zg_>o>A%xQ.m-p?R-u B"_WL"\u ɇܛxG]yqVPˣ͘\[ lnON-V=©uͷ`xYE_~YTO}G<Y5)ۅY{ڢkxu"ˉI"}.;yad'kQgNJía&PqF߉C1g# سsvZwl^k mKyeLşEʅJK8eDys.6{Ѿ;G xfixxnԋ Vn/B ~m }_m^ƞ]7оO"߄O0ޚwݑ3Ž۹{;pc.nsAN/퇇}0,{ἙiO4JMFq1y.(i]Z%JՌŅ6]=$tLpF7-fcP2R(%i)eiiV?*iV2ɓqmvS(~qP;m{嶽rێmsrF65PAiH/k444G`v /I3iz7SJwh,Wc:ݰJ=]SL2?0:(\C+nK %3- dyIM6^XȎ.@Ɍ~@^v鎜NKi@G~R":S(Oj4<syvy38^!)^!*vk) {Zo g3_/LhJUfc-bRN.T?݃TǷ`Q]0嗶``6@7բ_f3yXNûP {d %eň yyшg.rdxۿ?o{a`ETouku[gu[2|W֢N OwW^~ȻH^z8<kV C#D e&JDō&n[!(7{H/ߡlES^W&cﵢEY:GD5/>opT蘬KqRp_^HJ%p^P(#m~_]Ѱky ǧ蓴d5 hS?\<@ =Sw*˱wpBtuM6fpP ܑ[·?: 4y9a/+倏Z[*t&ngP* ޤYso"Iguz?Q.{$bfMY-f,>8j~8-/,$tÑ!XXܐj[ /J;6u9Y98g[M@4 lȷI|lV|ksx?{wt<֓mrC5L137-v |AHWtOLY8kCt־<_cۼ֠Ydx?-&eBBqCDFrpDa#=0-h#7igAMt*A|½HqϠw7.31h:q^"Xb ,WT}FP$Q^T^Ek|3 QE-y:Lޮ} Z<;3yK(I.3P ,氽Ճagý ?V|@G4ySy| <ن_z47v0Oܡn ١X=7?4heY8Aժ%طZlbGAT@T0x,>hʏ8(YˎޟaYlwxpAvjKxގ="M:6qa+ev|,^'36NJyi>̄X j:M#nCsNbOs:JuT|%:$dL& z̍bb&6빶/ χw慵- p8ѝ,bt8g~[QZu U5Z5,>P@izrU:qx܁/pP*v :vB'6;n'zM(([s\V:b61#+ie0#*F EĻ^RΧ(+3ir9aE+R";1z[ћvE'1y0ndncꑊ^-e6@AyP3ö(ňC*q ldۓi4KI{ŕJ,UY:}P*}%LH4W@Fw^gi.1?uJ&<@! w ,| CI, P:lSqfٟ͸?=d?' |TO+fBoBSI!|}eԍc\2H%!YdFЍ]q\W}AxoSQnͦitfXίcfWQ-ZPƈ[aF|*1a#76M6Cu~4~mBN`6瑬<6³*i53L~=xљIhaTW'#{tWK&OYtQ#^sl{V(`] Bͪ Xo)*ܟI֩<,K)f2ZG`QXCNI166EI+L`)-6k8(-"rmLVx_MV,zwǰ6WttԙP2l?ܟyffnq.o#q0I2*4r7,=f,Sy[qKF[bB(j4,RpG/(FN-YB70v?X=N܇ `]aң4:2W!ف2tZP|Bb 58drQj i*}4jՎ} }Q u`2ƯhdNޠ1ETS"Ԏ^^i{7q6{<|w۷lL9j_Q8H 3 pأdڻ'pvwVD&XAamPrh]7ڈ6P8YPBpdM?,|zJvIYWM>%)abm >]e>%N:H/TSSH{ _0?}2qFf19}i]8j1'zIxMrh 2]ߪOdéHe*AIzZ_c>SbVdW%ϣ*P(iT2 ,Ǧ;+O]e/kE`ksa ^D3%L!f[daEvB,\ɼc%)[HuNL4 ޱ\TR_q 5- J8"A_zO+Ƹ 1HR_`%KܰvAM(ƻ5Gk4)!(_fiv>*{Ki UO쎑Px2ЎY ѳ 3k+XWS#ȆqD/C9M2[X-Mve6s T kqXm#Nh CƼqAt1O~o;/9Z88+ 67 N,K]Np5b9y.f#u<8NuF'5$:/QwZ+&l].v=B jzd4yC x{sgD`"aiU`8媯!QN`vi7[ n}`oi3yWbԠߛw:f˞Nv_]Wgn 53{&Zo:۞|3%qcQ<&W) +*aWetX2vU`pb IF7Ia oҧuxÁ RDe^-K=v'Һ5ȉyKlLn2Yz+I 0lGt9QY L²`TދHଅ[qJ1'FqMJdP2NEQK7ɛ6gE>oUZUVJy20t&jřsqoco},! ;\&@$ :fTOnϠYu'T,YVزUgtx#}"}Sռjβ6(yf3&Q &g2k[OmenCDL6f̬Ԃ43@3vv033Yvf%}mg֤Йۙ-,ײ(Sؙ̫Uj=gUnsGDvv2g2=?qFNeD#hf^J6>/5ȏ`|ayvy6d0zr!odXi}l"Oc|ذƤc']:YOdNu *5R-N;i{F;d^\vO9&> ħUlFBg[uUM,ٍ{ jN/ /VOO]* >akfT(k.䒪"@Z2F/Ոi@]a@ | 5*ky-4Kv\ jB)=U cQ]Uv% -vck'WߍԴ1꣘Ƈk1SpPpC_^}0mw$`i}SR&`|p^҂ #ע:CŴ! r`ɉ(XVn~ǗĎ\[CH/QzIRx}^X}-'biZ E2Awä/{ph0D?T ǡ(TYJ@%}sA8 nV:V`AX,#m["P;r&/5/+s*` t= sf JiעAKk­jJnV&[f֙FÞqqQW,Y!kZ0ͯo9☊ ^;m<6b_ .u6}NndL!C]L†:({TCHYy[nzTDRv>>G&GsCGl <6,9^1h,=4.6gQp㕰M\lѥh1ڣǛe$Z;lPPJ«ϓ#'!WFj~䵾x.2cAJIX!gw to fE!|Sgq>ow8Be0!fǏim.BB3¦lasl l_iT ܁|1/?zn\ ~c=\sĮ!'C.m*Z;7!e(=4YHJ~}x.<%tu3P5)NV*mwo+U.?d-qqR)zyԡހu -G: OE|$|i?Ўsب4k'1ڗV)qԝ׋+a=8>j\ea Q?cQB9?%r)v#̙TW* 1{bm1el!Rp %($DDQӒR 4>VdǡգiX~U :c P=Udy_d$p\-.Y <:CU|Q)I b_; KY†@ V渣)¿,lrzkbghLFr^:]NL2]Bwf&S5fx_1Q4d8TA_Ҍ~KJqƘFb.x5!CzM(EjO }&hf˹|y 8xPBP vL}ln =%@B +Z/L/jTYdw6[ euaĠoׁf/9~KwCVx1C1(Koz娡G7LǦ١Čx4Ul# 1ˬ=FK8WYowH~Lk:fFqh CkVÈa4a,,:޹b f(:@Td.+:nxZlY2׭yCjXW%\(7[^@:A%,F?/IMۮJYHHT~9yD4kMJXG,VӤe3-7FjT(6ڸ[r7;ٕ8 Jb+dtD ?'p7du%Cp{e eW5SDtPSB)yШ%uhߖZJ°d_ LΡV>,37ON(#6<; k+.)N}Eh[Ms3ūC~(dgpxpD c`yqЕUk6%nݩ ft8YyR觐SXt=~$1Glv"#j&_2-έhI}>ìmQ;3ؠuƙ^à{G;L>ĺJr}M񘜻m)MGuqnJdJGN=StBa܍Gp _|4k8'BPdkb-$.ic9}778|6"Kr&[Iv)@|/56^]1GWFD4n"VӸՊd,ClWc IqeĂEFرtxNX2REBƪSa:M1V^u?C]3.!عfEDHivw'4;6,bWa$ʌg"<8X,zbOl҄v)EzK~xck^Y̓ V[,.!}l_ԼF%w ZS3 8l\QmU8|V}р- egGd&h'×wR"7l{’P9]im֫n0*-F-h~cV$| a5"FXÄhcU11~^f&bn8NȐfb^tX"_*('6Qo$ɈE["[be"&K'&`p"qSJE͉d>6&`fmIX}+dopǵkR2xEӵ,!U򄉥rbi>'|%AJh[un]poY\![ՙٻ˱D\D$D-QK:QeϚKRV*piDekj8t|ClMH !3bW59rU\\*W5u/u|vfuXr˺A\^4,1υ|*kC>G/>m{|:li̚+IP}[>JjN%Y\( ċ C>Rbj乥8Vj?n|~U-i$˹*5N ڐ ty~5kq4}5߼bIk}^=IwvU*wvʯ_J"; yLcBˤߍ {Oџ'~⸺ϯ:≋e~Nv'Hv 2Q(X1Ve;,c%Uv%m"iO!}8P a[KGX=| )ܬcڼ-HlGZHCzۿiY!a<8bR̻qG& >zt-*O~S!5_j;|8ČvOӢ܏[Nj3BF7HW>OT= \w3*2mF˔k.F[NaT}P;X7)|+"?z?w8YCz WJ?9Xm{ zKB*F];*zFi]]wmRd{z*}q~uMypsbƠ ME:Snz}SU)FÏ^uRuH&=??Mzm_o|jF ʹTP%/&1'@{HQQ|! 9'u!9VGlB1lQ pd)WF)1=Nx"/VqLm=ϔLgyT9& 罓RWY^q3C R~'Hdql؀TJKS zmR.yDLmM0-836f%׳dnޕlN9!6,i* .ij/e;!9.]Hnuե=wդN nޚEh8ܪHǖ0IgtrE䕎+drmh)"XŪ97NG>m]<9d '=awxr؞G'C'cI1# 8%7}2ח,.qP*&OZl=%-߷4`B<`bF'g*I[භq7 oh"U.#$޳\̥=FUx*kвIlGwm,E4؊wSٺM_v>3V%vzqf꠴Lb=BYs{dUaKB%uv\l ѳ ~)3M͖G4Y=Mg`Q:!T|/]OyWMu2ǂT|Qr΍\rq9yqK:ڨUfХQXI{e`KEwjGewf̹q)~z{".ͧW}K*KkjUۘ4lAYI_LO+oVۚAOxvxL&K )# eT{AX$=:!M;;ڝU7$j~&Wn{^w|rdڟ ǛOt*XNr60d~>;jH%vd5+$PgԣS0ߘUmok#/xjAE-ҮPF=jR``ps߆0&TPkX:Z7+J& B.֙]32KcU,mT+vb` أ noF,~oPefBߏ䵡Ѷ15(C1'Sݷ")bzϚV @Oީ\q~T;*/D SCqxä+ʢ"=媖=ڭZQdWG C"$|Ԯ6*u(S ߞ!AFE7"D+[q0+$JۻM85-V(! Eto!w $R^^`^a9p5;؈q"Rf!C|Tް?"]i0Hqc^>n>' tuـۜ&WT4@Thd W(x?Q`)Њs \@Aw \p|+-\B8 sh_ 8p;ZC=_Ǫ-xR]b9YSYoȑY n,#~xقXg{R[8Cdr BɴI%w:d568uܵlU.}X2*jd .1RxhK]RI"R8^R8EE,Pv)*Ѣ|JSկ䐪"{۠F)f2 )lj4e[tYckE{F՟>UUƲWɤON g=}juNlmC.P{ j:~yQ@^=/ڗH&QiXX~OƽA v$~d=_E><}L^,V "Ł'<6B{ƏV=3Axz>7xp 3#= w0%dܼaZd%d8]#m*Xa>po ,mih쯫3856S<94EL^uu#\oupPC|3DD8.H!H+ýЙ* R}l 3<Ӹo#|?{4$>ش/A4\=]=23(!j}8%4=墖4AԞ&Zޯu(CОf 4A{(hcY/,I]Y4yC(==ₗW_+C-™ԝ:!7 T[&b1aSƻt0aF4;X¬}Eo#md>~Ej!urm+%{b$o/ݩ$^zAPPR"&"w>;~N3hx 1]nK蠹E>)K-#<Tʯj"fI gO l NDԦٲfzM.2;s=nV%Ob<,j= 1n4lPdc9T):]P&Oݨf?,w쇥S}g@, m@,-܂63=&E<8QK4"ljM]&ZSLj૘t}5R5͆?gaejhgP\ (qHjQUG%7U8UM`،o;N.9\G_@ZkG|iUd]f(#Ee VYP"3UYD%y)NZu))$f[Θ5[9np惘]mբݓm Hkۆmg6U*yBDoMnNKrN9zDI~=-{~링v0%b[BdhPw0);tN&>zذ ͘쑚8S ۂͦg~].R˶(,PE@![;!%XHM sߑ^HZzw8{ܪӮ"6 |*/mv$&ʻ8ɍ+~c_0'y̸h68G};~^iSGy5lkztA t̶Hއ#l7VFV7 \aqo]lpL]nP ;+tp%ܹ9fB}ׯ翇S$v;+ 0^N>8{q^Jr8}Y);, B8Āpk%gfUP{-/|EE̋K#Elz+G#XElU>n93xT:BRQԡ $e>mk9Qa< HfyRH˄ıU5Zhl]}]mUGӢ0MEq zb B$`*p\U .;S==0yh8nHL"ĵ"V"ܐ'"z0 =[D3E6cx<|=߬\$neE!:epeClY2CrO5|j1^L;a8-x>/ٜ n}՝A6d氝&''*X{BnYYt:>';'g$~{=e:&5>/Gg^|*ioՐa&X9g6U:x~I5<65N,JTm%Ձd K?s4.C2,(u."W3hُE;8IFmkFWb3m.ܙ]ұ 8%ytt9k-k5Un~ծt_݊؟TGV>:b:>dޜd\}$~ᒛ/eŸs+\ 'Z_jzXM ܢñHQ*ήn18N7 1WO"ۙ٠~$E<ѽWR5$=o=dxh,'m-.=S4z:ƇDZ;zN/}Zs V~J=D2tg}%V @͹O";p"$;*ː#%[%b%G:ܟK {sJsby;*ٕqbtV2з+o]Yݕ%У,|]7jsfMSqI;>ݸLݧz~i}fO_Fz!%ګ_ jCN.]:ٟc4[fd/4Ɖ8<|ޞQ[<qxX բ0Sfou_ Jls8.6F0$\*Hd$ DnEPqj?I>%cYBv>XDzL&۷ r /g\w{OҧOu8ޕ_JQpl{ʌ t?`yW}-=B"`ٝX&X:6(Azd l#[Ǯ ND0.Xpl7%?HLkW;] T٬ w<HgN'}vDdbVHBFƞAà1]" I:)3D1$L8X!0.1v'`1ӻ\Lnl6`-'P=p\qL&`^o'XjV:d É!Ro> ?#t%p2S#OxPrf DrCD`SR_tȥ,ҕmc^ZnWW9W =357Dl`p-HYȄToU)Rhm;N k$wMpLx%?w Lz/tS*Ƙ6jwc87|h\^g\xb:Nb0t ]9[=])[Ȕ-2Lm %>hR mfA\ o>lO;/gEuq{JsE{٫Ǘtȷ2-!< h[W|ah̔U :&r\,H$r/9.7" 7y:s5ԥU2&=ZVgNUV~2[5FG0uC%EfBiS3f?ׄ*bV.Ñ}^v.m~,F<:-kubm*//Q 2ؕ)JB] ~+\IգбKj#zxsh"Fd)mcLٓ7pj )ԛTS\$}+1&LƄ X wPd * ,e86`?l;Cv  <|f^Δ@r}cezI'(gĜγX- z߂{9[Osv'laØ$bA*"R,h/y/C)!.C6@|rصz@돵r<ɿQhml7ԀJH9#6 ʇ1ч HͦA%L ~h_a{{s)hx20Rxa+xI />b¥7Ugf01GrEDUD\|zkTҿqZ#uN_"g][T}~a|zH7cuE4.ZPx%`WJ{̄ @y >[Sm u792^Ӭ_HHUɴwO&(=̗EVNY.R:M !`)w2*-lW.T'b;.Uq9?ݬ'}3 73HT)L?U5JFEŢR /BضUW!!5"UArEaGxf9dP5FF$Hn.y0Y"p+Z=mSQ"~4Kcs<Y:+: ci,ӣ(\'-p W`qQ2X^P+#3ChEni.|b#sY1F #4XTzRGi!XytGrVRp:t,0Q|AwaxEu%S =TK2?lm6@Loz w"}uYK jn27rub8-vuq+K@q y,9avES%cxtKa7!9脪Aq v~;u5 C{@SN"1u{cğ'/wΈ(>f'673uDVf ^mmֹ`F1Q B0,u9vIyh* ·ц;,x9̚Eo=z:y[[hW H+1i F?iw:_i@f0 Ḽ}BNSؑM y,T_3-Ȉ9?>),kF[n[g K~>9fM#a`x>#VFg2"̼H`/d ,2i;Y4F))4;;q;K#E|)N4gݜ,SBM jBք %[. Jռ\SN <>>dm`A-~nkol8b.bvv\S9 =7Ȗ[)Kcl]UԷУjySJMϦ=qa[ U#9KtGOvJpcMgM@Ĥ^x[}GG+aL(%PQO=Txex`Ek>5{H2ADeBGxM2׳Xe4썟*mq2Z,d $\C'H+Ji4*Lk#bIF0c4/QL3-f[Id23+?Õ# ݗdk4aV[:mI_c`Sdv"rQ N8n Q:[я$wL5|>zc;MBw|QY̆'zi0G9;owqoџp ~R*J+Hb*ƽ/}V-ZmV%dvaW.GK5\NT6sbWŒg!b= GI(6vŪƃݒ Ic]i4uxNo j洮zѺpڣ?z7K!b ?}6t@>V%8(q۫ 3@¤hAtv[<ɢU rSӻPtJb1l=$iм OY . gm^0 w%eu!|t}.B|+L/Vo75fJG f|y4::])wP8FE8 Ύ(N~K \MY+':r_ 4f\yj 4`tu-]* Wr-MV8h?mZ0`W j-S"k_q(-֎_%qlvgį8S{]t/V@R^m׈*eٲa8t>znхBfxZΊ!#,'ޘKN<,3< D~BML;f| M3`#}Ӝ@p4]S"kvMA[%~]ӍϿqgsg<7)JVs|\$Brh\T"wlj;~/'o`[V߱2 xÉĀdoXppY\bɈ;?ʧno^GbEJfEEx%V ?%!lze {sEι!dEsq|YczF>Q~5, H5yD7;V ?SWDyYNמ0ָWVɧ.ZVṎ\%K'":굲Frق-k\۽m񪙛5Xj O'L`gG\:CG1s A,9vE pnk| ebrUli!} ituMozt&n5<֝TK hJܢC@ vw(Cqb<Ϫ"8:yƼx `|h(G l!Ia♈K#l4db`ދg'?vǷluu?}Oݿ`;N6*ڙ4<^T;ʺXglkQ%y2%sG:3N%d!jaѴ|c/,a2x<%\Mk͞IZBg,XӔXmSǚHų "]tiVyOEڤRlY1*ԊHRx4WѥU7Tx1 &0CGHSwTWuM (LJ@QP U=ZOئ+EJnJC}a?sqU$`=M $t4~[*ba_7kY쁵o• e_玿clp0}=UqMKXJnBuq]J=*mX,nVT?07}y!f0'B+Ǝ6]|9aƼF$Q!#u+^F!f\E."t[했p ;,;5䙏B-"]!ͱkQ9_ {6?`/PkX\"JԭpT0_W!=Bi|EO "RHS>j9x sC 1ZL\.lA&61å;}cwT1F,t;|ExUVzvx|t~`-TD V׸ձy!@MR6 8#[Uکa:s%vF~kUTR(GX&XZc4-~<0w$㞺4I b c޿Z7bٲce Ӫ}V$*nUaκ,6އ=-zamjH qqjل. \/!8!ް@C1SPmƎ%#R Uab߇ )[>AV]%Zk-K9Ud\V^naQfs0{ $dl]Փ Y|[^씗0=S$G?<'NA,MAbac?) PyT7@< 5I%!ʛpgTx T82XNO) ~K36;_mjw7chYbeS8cʝ'A7Y?5'o՞-]*Z؛<֬=K.ьj<&D pdlU1{JYsi[ɣli-UyfbVǮ試'ƨ2UƘͬaG;3R`2P`_c&&<jVHs}P4Hm8 \8\sk_Wb v :Q;x+ Fs7M0\=^A@ {ZhXAnPPVs aowC{r>x,i]D{iz1v@@!=L<& ^o9CP/p^(nv,5umb vzq5^Xm(K:FUeutJeu& Y0l5V5{!05bM!Qxc˄:Fn# .SVȿ5ɒUGD(#J Ko <Ir(j Vz WSXM {Ej0g[QEKpga4c I3*}8X!߼r%GE'%Ogl\;|a n5 ⧄{L;IpBY)dכ҃1xft9otpp*7pۀcKy㛤-|mLV޶|Q, Ww ? 4b:x"Xc6a?mG3Bpp³ .g^sj@8u@s177wq͌;dCw[=lnb:NfD 0C&nygVޞ+`gqD? ԏ= z A՘ f#%i3.}jr64@X֊ch0t & @ӡe;hC /#Ԭ씁S8b/P=#O$lCN8h" jG 4 |sF A<&a 98P"BO lr@}h<^o\`N ] 8C)S ]؅M |ch8 Hf x 0S_bkƽ uڃG["dp*0b+NUCu!B?b@o,<(ﺐ:]WT `Bb'VƩʬ"8G#O.J#EC-L[}m܅f@2U#ZryjrŸdY vGM6a 5Gޗ.#t`nڰˆdo-NGt~,v&70ָFF˗mr[*k{w[GHL ɂە YP2iQ`Ꝇp1$ A5fEY0읆fۭ ~ דH,T5d7UkP9H7h7u:h稜1К4IFOhݠO{+;5Ͱ q0?A2UEʕ-""0I%Ü˩@]%Q>@E+I&w,Jˣ.qAJxܐb|x10^pIk֣-uږ^ӒxDɕ&`& bZ[DL 3Qi}6:}s^dcG2f+9f?8O (wYo̥R-4SscX`I8@u'U : <LFr D򚐝k $+ׂl$Bf./3,3WD(Ntid} ԄZ5lj yvLϾê9K]қƻ;N/Z`WM_vDJHhnqFv-d ZCZ$-l P5Bl}aRM3 z15,0^PħlJ[ Zh[CյopzտZ?Armg^ns y|BC薮б&5 ݴG=׏ˆnBm8gIh V% @1lsmxe%k@*S^wbllzh}[}-̬&(9o.?{\.&7,rk}<39ۤkVU3hܘ/FlE$rns(W<(h^fF>>5Y̅=X<Oӳ$֙[SM*wCο8VYx!"z\:,Ӹ$)wlY^~Qk3>,|MFWP!lizA9XfQ14.`9ozJ?D~v#f?:~4\g3ϜF7IF'8Sשh^pnWK{;Wiwc NWfqG$k5}2*Z{/at:o }4!@y N(7LL T9ضLA=ƫ0k3xۻU@Gm .Fp9_?*kB,vpG>rRBXe$8"feW{?v]HjFCVևw`l65x =mQGRV#I “A=6IHB0CGY]E&ʖ}e+,(o0TրVVTNPq m80Ajhl1FhncH۵| ]'4]{mCUJt0HQkl_%fƥUtJ"L&MKsL|zG"hPD'tjخF~U :#'DU׮ (p2Ii.cvT*nCH8fhHg+63QjX-St&x}(OԊZ ^̳.Uka'Wc-a 9x5zn0+WfeVZC`kW>Ft.L)6ZQ<5-J)7}i@I ;xo4 %^@J= e%ĀxT3P2fh9Ү&9h 6(19W;۩N.*vtW(K eI6)왻nлFYbڼMt'MѾZ#鴂\ r)}E9Qhm67 /n%#^yS?f tlW?gT;;?Vl 2JRRVx5+L&ӏDWp̀d,SdmjxݐnPiL2%yh@'jRto\5$ (/?xG\xy⼈?q=Wsc#QFAs1?;\rBSB~"N =5`[^7wg,:JC+0v9<7ϻz\?@xS|3MEpCl^M{h¡Y׿d١&evFLXh[z6MҌ(L}2c3Ӟ+uW4`z`8f3bs'Ps&Y/-^*;?K~ !08^ dsYaDؖo;Z<-O,A8.'ƃchlbFIՉ&L{5,bL0 je5Y~9Xmd`YE#0،m(y/{ml \4Ea͠Q ͇^; a/ UC @1wmfoX^ ĄrQf7a#MBvZi54V$R %a98UTP^;cOFՃ' N:F`.Ag_hh*Ed%j+DjDS2&}!9.-PK“2~KpU\SC]|<}gZ}l>k|zL:QfDtP$)^is^8~gJ0S˲aE2\w=YQ6|`R~լiv.PhdF*,u E[fk;EζcC0YƖ^d d1:ss% (WcӁ\e@T3/. ӪzEEĊ^̦4G(1j."6yf@R[:I:jms V)8N{\]D夫r^8:h=E,af)G:<5״8tlB<t^BK YGi9/8զq=sc565tfQ^[&}o Ǩ(vM^cp&s!+zMG~oy9V x'+w]S7HQK*ͶB+  1TDTE?/`C?!8k̚/"EimR}>%gMhn ԼY"eE#G)Qomfٽ5>|7Vm.TWj8ko Ak{z=; Z.IDA 4Lկc[ec܌;:6.fia=N웼km@A47cVf8.)\l^Ǻt F"``"nr &y4ŁQӈ45?邈j'VT\<"UXP5K:ZPaq\+[S.,[դ] VEw=U_m6 <Sp!ZXiBJ.;X\\Xeft҆ҩ\]ڨXj%byXT\0y8”UG8m |H_@.p&D/lF&";'ߪ's-ا+[0厔Ep>AE_ mZI{i;z}hD Z1a$Hw .O[ F2Y__A̭ 6s~1Vʪw9,0KE\O0W;oЁf]2`.Z ~'sW'`K`IGDx.]bPs6x\Ywi]. ZS'zX>~3Y iH*u0 ? yNOH/L0kȾ kj,۵4,uOȋFD`W?ۥv)A.gb3z$mt]Hǟ@Ib;]  V"p) ɺSW݌D}٠t ؊ DPcu=2āE8X#軉d7]0_Iױ[Q 4(1qXb!?|Q+<'x'#0&\%Ĝh-5qIi'ħQM5ysyAӤ%LK)6232AABO&Ν`LUx"_4dL#cj.t|^YaYWf%ּ] 7`H.}'&T|5ɷ-kE8V}OЄ5mI [ߕIx۔ 1ItxaK*;=m ^(/F+Y>H\=USE%I[1 ^h))--S yqK>[ ۛ~JYIZa(+51Qt5~j(a0!x{a:M0\1|f`_98yqxIeLQ O>sOg`\3]:ھW??# P|Ʊ#?/dy?riY<×ރ3٢ sXQHDVHA+R;S\y:aF$qt'}nOLJ0{D<ӄ>YpC!60>opE"6Y<7 "i; @TǗB#Q\@P~R>h@9"@`F oʙ|o`X,…`JAڤ{/Yt btУVB+@gZJE`)xvDAXx7V K@PQ\TYem@<P`ut>{&">` +O#G& H&}ŰOߪmt(I%,\fHstQPK9zWƷlݔ#;! Y2\F:La=zQBGSZ(kW&ntd7IEf>㟬.=uSOQXu[rԮݮzKeA*]Q 8P8ߓ`k [#U,bR$, @*\k%EP['m!|CU*r)}( CDW68'`S61ݏh3Gn1a./s -o=ӯZ=ہE[?}v4tF–5JV? p3PqH08 ]܀xfwp?}P8~(p ! #Dח_5CsYWНfw8 > - mP~J~1\b ˆ[.pHp)C !(H\UNz$\hM??DljFZBsA6n:-a;7Bz}cKtWxP*pUps5J;u*k]#t7M R&!akZRR32Zxp/=2p.pWhe<fֲ, tG`4\L`+{TҀ3rYxYG lcPc.a:0}{|N m15.>9|[eTqYf(lv 㻲W`KDEZ~RxZQCl`9i$lT$9㾙#>`W n(0Q.glu@kHz茋? ࣙrQpy.k# O,RIH!RMQN&t&0Pw6 vmt&Dxӓ!7U2Fwpw<:ÚNZEm/0ΜݾӁXPf I:VnJH@ @4 4V^IMTP)UmET. Eڋ"!̊Lt0V]\uVԍ CQW$q|4}vP9JC7̃( 8&Sj 4ٟ>ڭ&IglPζ' Tn0!v3a_ ـCw+lVi_8t";aIvt>fq^ q; mf-{s)69p7C&E'nd<@vx)>g48ꈄDc[/iR i>ҐńoN\7il$7Rr`C4H.~bʁClW"#mHlnċ!8c4a%wAy~!Վa}T:Eו |V(=ѬM3@w&Kl10}ɴ&;%N2;ߢ9cCAqלnϧc2=L!.x%nl2(d0.kTEJL@.A@f_ۂ-fYX@z!OLٙ3Cmb+6o.M̻  &RMf/#Ep`G}wb'h$lć;C1^*6Ϟyȥ'̄YIOVi ɠ/1R 7mZ PWλ8,5a<ȷ=]3tiSEEq8?qH;mD[ޣi-n[{x(lϸc$gP~p.r2x($ MF)aK<2ɳ~X}L=#,K;sŧv:{ 5cޛ5==B[&B 3L}OiaYHGv_+MGS_%;*ꪅ).Ǧ ,,.*71(5xTN(s8_:>R~[}VplE0֕]$IHGJD|/ Y***L( C\3\ç@>QjJeC 9a& d+'aܧgMOK٩:2Ha9%~G>>`a@tg;AiGҲ0 ࿹w=>|A΃R&PQt' aI=8ḭx6g|ia&^\zŁ~ߙ=Ld0S/z &g l0sUd凙H i$"c*2+FxZN( $#]#ljU"p~}Y2@y"3޻>eq8|tU`035ќ KWp@k.)9X7~WiVCJT*Hbe(8ґ"ѝqghNF!?7Diހ*DN\_|L̑ȺbL.(+pmy7; uzɒV&2DjLV^hvUgg>,aOLγD 1{'T˃5g(=-&Z%oPX1> %jχqmrZ+ӂ;ӂs\]#_03` n`lEm q/XuSNT@])Z(gSIZJTIkg523~OXQ}y8,! 0<@,!8tܷ9hqBhGjB3US,ń @P8a"86(gJlB*%ʸHI!j:Gb_fIȊwSKR 7+ȋsL`d8&ҰKՄPgA]Un4if"%(DJImރVzJ~X&=`I ׇ -MUΠ )HT ЯSMXYFc~נ9fxj n8|P'0裏[fg0ZТ4 ;VBt4=%41H(4N\vHx.ʾ&a} 8KC 5Nd6LHI:X6v77hS;s.Fz}x}Q?^т}X#􂡭uRڂ>|1@Һ^s<8]fh5.{ f1e5wHi#$*}.~29t aPGle?GY`ùT1Q2{'tQ#Bh}y4 ( i =x= H=;<K$PcKKeT`13fFIPAh+Cn2@r jܯ6%0@GʧAN towM7M >6}/Q&C5SVx,TqF!gsVDafdǩAdxLb߳~S]PI,yXZu,rF(&NKFnKE2Ff&-%%(< :Yj2_Л4Dȟh4+-n:KEBZυ^|)gdAӒwvPTy}B ERdw#WkIvC.8%;IGC3=amܬtT_8O= "Z0RfB$;gX^|LPS%\#eOe̎ngqz$:j|sV1Nx`C ɦb [.iʽE^tsa-2߰%'k@' PԳiL,xhix+ &`((|*T<gZ6c]o'V4Zޫ1A*O[Xz>~n9OkEAWDŽ^g?q(tuOd]~d!غd7r;p˂~󹃮]S Ւ]Njaýeam+1Q -xC?ѵxrۛEQW*h$v@,7 G\ȝ:U:nҁ"o!Lp#mk|mNs7Rw.^oNT^=͙P#1"yA}v_L!zG>z-Gykr[ yZU4=#z~9o,Z91bϮ4kϋsaK !LoA}U n<$^Hј準4AΆX)ӱ&q\zԹŮ7zE()*lsyY[':Й$j;Euf#'=@͓<[JKР2ձ/b,ɝRYhl}t5T$fs_r =&lr zD~҉u8qՒ|<.5q<v*HJl垘[G_dP7o0edIz D&C^թ?OoK 6F!bFf1p^5VF#9~IGGxzΨ̃BJ4U X{"G{ï<^ޅ]dfY'DۧN{\Gm9z]M'BMyqu9i<u̪ƠPeV%mF~)gX[a&<>g(t-Q) A/3WH%! z mXqrKrػ?>>&3gSfNz[j[m)OC+'Ug$CyMrVH_vfvrt"BZm;uVWFwɽN7I WDPTeeGT~D:8Ptx%" 1$p}r}.ȕH{ ÀȅWj/ī )bJ<&'nXESC |=A7Yج 1p\s]N }N[w޺ cMKp̯LgDt5z٣?XWaak u*CƳ$XaXG}+CX~]3'9n$n"#=PyTk]aL/PFD~h<4I( < ~ $R/C8i{=R&d&ޓ' t6+ڹ^IѹV9hW7(Pgڜu*=a *bT@i6ЎNq0Ky+p2i8Mx,|,щm}^\VN^=oKH=4bZNO/b1|#Ums mM-RmD쒓ZmW%yºÆĸ73:Ncoi4Y.s+qEg}s?`G YOį-Zt[+I%[[B`w .1DQgg^ nZy]s}o<`7V*w<6v_ܾ5v_t{LK6>`2tRݍvZpfoĂ-sǚhWg$J&@L6u%b8Li2y Nr>9JYML % dY:L՘_1B9wSkxLL,1Qh=Mq yXũDIh,N/%œ6id<K0' b"vrDrTXptzf:ųԭR5(g.易yKiTU#3Q2 /aR? ::b\&)dd\ݙ#ֲlMKxF#%%FfNbtGM@taE,G6LuO7l "07! s1u;!R DifV xQQb tOQe-# nrVl#uÉՃwFF4fWPFbP T@p%8l(3glK&Rn_1]{_N\JP˨WQ"NʙIi K zGQ>nn}]03&@|˜Q/eo* #x5RNpJn$sV tLFp:Ev0(,Ս2$`AP`A3gswE9dR.;6/ |sb ]~JXUF~Ws>ϡ#'`mA%;3rAy94 Sy6QCv6W!\.B|;,]vy]EN` Rgp& )II転TV@vH?lG>!!ZPU,g%/ߘb>V(6owc%"lxM IJ*y~q2v,#^ar\2.WG$H[qu)IqI_YLzU=Eu26){u;`i:$]us\ĺ郞$WK9́Jf5ONBw'@P#(&$s3/'8_p+;P@l:^(ZA8 N͌<%=ؾ,-p7~BpAU5MC4sC3qnFm$ޤP%H$%RkE-EcEeg mNuu %7 /rfRk*ڴ½+.L9[TdNP#-meulf٘DFS|9IY.OgpVwk!\K9<.,M8cPƫflDp<Ǩ^{tpӌ)ĤVm%ȪI$9"Oa[XnZ+e:Dc]h~)Uʠ5'M.URUM;'MN i 7)*.QAԵ6w7Tx!)`szSn(oU?\\ǫ_SVa;QQ=g2P]{YU';^E4_}|a*ƌtb9zM_Z":09]~ A"(a{jnsShWFǼ=h58>ٯ siU;q|nw8oU|$v:MݫM`k#SۆxSl>-,tJ8Ӌ;>$@ΛUb?jciwV|fX }Q Z|˔gpJj" #>TI$~%ၨ2߻5#P>1pyyI-WbKxprnNꏙ; K'QT"j|HN3Ҍh%.q\ƬZ cWTڜ;  7nn~-|'[cx:zm(&3ggys>l:@=tF+V^+kʩC bإQr!9Vhift&SNXӫlhϞ9>n'RơkdCr"i?.>Q%3;ڙq|l29bHRTDC{84:H}6 ,\H$ {Qlz)Bet0ɩf 4oG } oc~uX?jb|fR1z٘ Pv/Ԅ" o&wc4Fd~#5ٞ-QXuC_oU:EQ3'KӝIPq#Z:qY{d0  aU3E'ޏkw{w!%{!z$Gp}JWtKSEvce]!\kbAҫ[bU1LZ[J7wD4fS*QGYroPB8 ƚş$M%H /LofOoPPlr7Bј*\sc(Y'۵/bx&XZ&^&G!e a5Kn1}4݋0bA&bqWzZJ\fңzˋK$mJ, 8 eA HT%kv$?^y¯"D M9 j,<4Fmb+#ʘIByVKBZV/(_0\A*zT9 Tms:T)qX*gϵd܉[:m< -b@{r؂l.:d4AM(JM$jcz=AU:DS%SB[L7'rdrsZ?ΫpBO+OH "2О,s=N'&\wdlĻ%gtED9K}w މX "0I>8$Ր"'+ :iȝy' ÉfuWWeWJA!tE"bj,$KK҆Q,fۭ,yᴛ~M2V7ܨt]B*JwǢ;2ku[(lC[,"`F%MK͗;WOAk0`Ԑ5]wx}C1erkcLAޝ͜9x49v .Q7 86Ю[GIqvs3r˦~PBA{ nЕMy̌V ,2$7a)(xn4Uu%DBXj! ۚ#AH^殕G,}!WP]y̟G1+ǡYjhm戻bpW ]E`B4>>!%AiYDݝZi(t7ұ4O:OZ: +ӝ؁bμ !9%сC͈*@&Ч<[SϺ!a966i>QޖoƇW!bB3&$ v,ٝec0hPCط?;Yb7LOFv?8-̻2^ _%I UR$$V&]mxHAU}d'R[RN=mQTgP3m"\k,)㬜U @g5u.:qw)-?%>I4|@{Ij;AKP{l-8zˑ(TI2(򙏇d,a1,7%vrQ`ޱya9{%Tdχ)Ԯ j$˒āvΨks@(z%dΏKqO4m69a|!߬is MT;D<s'sjKۤ'0 {[I.l#Vt>3q5Aj~}g[xQhQA$qJYbhK,+ ]xO\8e^gX$.Y.e!ۉKl&MYRpd*8)d);N`d&{?Ls" J=8kVH-3td}C6k숩ȞB\ UNO}nHA9+pfdf"?;reXe:aZ58=W"Mcj~P @j rHgll׽T-'b1<ًM3GWŇR jەodh5:>@$*,Zlºv=#g%MǦ|#+r V y;L|l lc吀֠%U7\XO&jf4fJT6l%C$ 4(ckҙ,}`o Nqt$KErx_ 6]ͲC@칊QYXeyy+hE_D0 -L)+#^$5u^&%?;wOd'/&2 e.?}\e2}DO ydE~bT֢JktrߴFv?t}msoi GUB~=淓8p .!Bใw*/߼=5?:‚BA@@%QZ(2yIop8ѮNԍw`g&V&:)Foa26q+:DMvz~DNЩɷ9k;fRyNqr"ֽ?Y)̩Y%S~XpRPkVp ʕ690|aK}~Ə!کt䗸yEn--ȈYˠ #AI4鷊SX&9[tzZfgTFoY^g9R(לy6\f":KPrۀ.82[^QAt{$K Uw^P,DiѠI¡E9Fy>67O0V߄mTӿ$ɳOڷvdJMEka;1}SURL(fIӢ@ބڰ2ϝp3*ބo~*)Le=~Dj)8'2 =t3f=n\ j؎c8.4t?'%!ѹLD'Aw_s=}2w @,oTpT͎-ts^;suO|wJ]+CR<GDt7(HRVVkNPp^/;(]%v$m+R:tXe'94Ֆ*Uy,+LwOBS뙖-ZjAU+k)1ǥz%v@TI%ROb]^3\ՙF~ܼ݋b4 \Q4`ΡFr> d Wusenj{EURCZ weDn&ޢH-{rz. RpޚoEY9g3R{9)wUݷ#DE-ЉLm*9 f,|J{i'ƭW1`c3s.bC83,"tujҊDqYLEoNi5u5MN+Idw[EZ%4 8/@joڋ{-tυxlƴ6BIKe1g#9* JbQ Rc߳$ez`^f$jX6d ܈e"KGPސmɱ/iH8k AͦZweieq6m9(_ Z[Ԃ>@|,6!L$xPb?ҢBe9Gn5fWϐ-Sܞ0Ȭ&]mfrWMyTWOYy9;EiN;kVԜ$$YzASMjwߴ/tjN;~_۶hY3xͪ]rY͔q#%˝ut^p%[N lS϶t1jy C 8cްm'4Lr|SJdJz,m3!jb_ƲUߦ~6')p?|8My{3GxOwzG3zVo;E>1 =aMht"jIHwo5GM' MSwo;a3pPF QOԁw3LBKwDVWJkDKa$삀ETڒ[~QC|cO'>P' KX6*K9LeBYQt|&/mq@0/h$Fp؇Ikh ~'9\"Yd7 (*9S͝v=Gtd4!bnvw| fdSΜfB ya62~ivȔk!VoSp1Z#mx2&T|~ɓ/_ԮwɈk=EM T*A(G5d㟟2gF@V3]'~[#0}d {A#F~"ƞBJ E0[ƖuW\cr) p_&vfMQJ̷WPY 0?' f^:DӱSQ3{UXEF!˜N_6|5*wEF.N%LQQ~^%[̯u d.|=饛w| ^=~N VwKhnxf0DbC4|(jT圴s:# ei-pC >LjX]up՜]hda3PZ?ăЏܢ2K'_7O5|gxw wE靱|BQһE4S1z!VMM6m15s.ޅ֨[̚OM찟xhWEaDXInm^zpkZr9̭{"?wū`d7ivjv|QR}p< oT_>|A57Ԁxyf>3WnL=A3uytnh T9~ӄ\@(jGZ!4 O.=>>zܽ$"< H/f9(}S9-|+g G %YEj&hqK&gڡK 8 8Ÿ I1XRTEx|%"1T`iDo_ycZNpfBѤrylRbMK$=gF_VDZZD% H[,'+Op7y!pKd@A>mC_6G%sv=f~p~t=2nbP{;$64{`W;޾ >B]ih0xD8:u^7â=d$v1ǼΦk-7S]WC`Xl' -M45\̤jI1[HvXV!"k2-4 Gˮ59+GsR9+ Ės6, " iM3(Ӷ^&x~w$U@B &'d`d@T( W(3BY'/aK*d>d6:MkqLCo-MB1ng3N8#}ByS Ň"EܠdTaHC'Nqb[! Ȁ ]#jc%f_K^̸ڡK縹X>K5hޗt{)m.oMˁҡ})iy;BExN@J)l1q0 ^@0I9;y{sa:C㳈`W.×e5(AJȴ@ M YB8 0$ê3V᫒y+;ȋ>{FB1,9g'([4gnBAd! #mFE%]JG!o3!shz}L:p2!C}_]x]WP5Jg3֟^ޖ4}(+53P/.JjҼ^7*ߠ=}|`2gWrlCa"l&#Fuw-sAv>&oDA:Xe&TIu}Kz%0*$]:ˁEJQ۠qKT'%JܤJՁ+pPEv{֎ ;޸$nHD 1BS_qHrwcvTUP#-9@[WF~ӂ`>bM>Z׭2\bMoMS=ڬYY{-N)|VIR7c=xn);oPaγ {kB ׺{!ƜZ5p1y-L@]xR&G]ք@*:SQƿw;FrVn&|ԛ0AϓSbt^aJF]`vA%*7nMy_?iGR".7}M}mNNv)jpywxEbbb+-'y._k [vZՕ2W>8,#h&3.9YPvRBHeyrse"әk7Uڳ[e?c SL_ȩD.lJTPMiFQ4)׊*YGw mkr6=VDYq ap9za'sA /N̄X/B#L Ĵ)QѪTb$mD.<@?V= >PܛgA`T!p3M1%{2[PTQ尌5?f=]87|wu m-c9VѩfP h2󙤠QgAbkwar k]@Z3cf/y[ 8RUWܙK4RȧGjz^5DN-cRSĽomg5,Hu丏˗Lȶ0y(%PLP-.-ڨ$ &fĩU؈e1l")Nèһo/!mUWWE/S)ݓ'V0)ܠ/ Do{k5j9zр)Ȇ6ruR(L/>i0`#wb&^4J3Cb!Ӌ7-gv?C"3iTrybVP2~.o걋tnހ5PqJ,2Aq@xu3g4F Ja K,ôQY Ҟ/[SZ/(s)h+%_ʫB6"g݉/*t(8|Q2ނΰP;J/e:)#<H 5IUڱt=DϼIN= {sWxLNg2C`XT" Du8[<%Ƽ*0%UW$w^Qnq wT d|2px,`6*pz"'ә@5Pf.2ғqQhO)+ӈq="5͊DSs~:SUT&)^JebɯHWwpCezjM]oFoNmHDzvNՍf1'%x6!R2`f[ Vs;#1}$ۡ˾Tv cdK*I?53cFnmps77UFlЅt54)ˣdd6IŁjS_OUs1{.>, fD}P%0tuәCv PChdzFF63A@SO b2]3=v=IyCIodgºG,9 aωsR.f?!! X0@s r'Wz !G5Am3hgmG;FTaC|Fk<4F31L$, Sդ1(gu ^A? Ix5 S514ev "?U5i`j#3Ց)3%w.z rf8)1#t@-IY$D{dM*ƞjt_M8U)`ל/ vA;[6E`' pOt%滽zgi6ԭTBN-/ELx!#Յ0}{`i%*e@[W F)&agPm8Z筇 ?I6g7w7VQ /:0h( /;S`BABټhFJcȧ"&hAj*ə4 +|rLq)ѕ"Fq<'ab({D+g?E+)(`v7ʋXnq[K,YXaqY{U@g %gb=+>{B/[C9?_(g!U{hH$g0Հ |0"ei']:D}ZP=ŵ[x]ӕ[2wvTB}7 lm&ܷy@prE}ŷ&܎F{2n3:,>if[? ٦MܫыG`Ɯ`BEF#(q˄pUȆsrL/7omy<rԬռoI !9!tM§;4궠ѹIG\݆̾rp>(N<1,Pu%#LlB`uǻaX''(.MGi"r#Q"BWWSKƺ7{;{ԴXUP$ 3Jv@t#uVҚ ߴ$\dG-cE ]]:cxJRhNt٨ݙAsBiK9Kcl>E:|@8x*`-_,e* =okIИ` TCi " aT6#SBҋE\L!yD|{9fhYq ?-+aFdTsEf||؜|e1E[xWbs7$Q@x2`ý<ߓxnċ{ hO^O^(ۈ Q+w}7;`ıJWKUҔU ɟE=2eLrow装89lB~O?|PGta`18f0V|.>·ߐlps"Xp\%_E16pbqD{ LXS p{#'T4pͻS7.O6 Db1%̋laү5w*O02E#%%Dio9$xlQ?Y] {Щx> 1G,cc.t,Hőu'۲F=xlB([K\Q0@R?%YSJ"Pkc.uzu)Tsv/fE\SIr0)+՜J61ggՇ '-bL0!$4 NSǥ~.L"Rήzv觭k*ϵH?6F|!kOL[qd.\t.e|{qb~1TtբRʉA=bmoRHd|Xr qaγ= (ڄʡ޹MGX#J_\v^KōA^B r{WfLER3OaC'/R ߑ_Mz ]֢<S!3)  ,z&Uhs#Bm Ax(O \QT5|&mSb;:=F :q+PD5 %%  e$[G(w_'6tΌ3Ā+|d|ss)PXTRTdiMe2VQ+m&MEKBteg>Fv}~ &F`Csf| ;Tz{264Ў޳QNCHAɅL@ '>tA-E^> ,``O9\M~o;v[i]~ k'>ˠrx< yl !x<\mN B`;]47;<{Cz}އmJy(lг^PGѝI&_8U&H]@2pE\Nᫎa0B6*Y\D69_u ` xx.",  "舡QW5:)0V5Ş{>@Oa>M[c> &裪Co8Yw]vI&Xʟva7!̶+HNJtaM 'cը9J ;\Rs 3j9է_zx9AtsˀuD(4NqٹM~Swxgq0t5tpkZid .g@G/'_TYR(URW(ds$2LVʻ]do^`dY9ވ:}'BVڽcShf'Eļ=ɎGX_oR"(${vѮ- ,%S5b3Qx:I1Uf8wWMW.+5XURn~(LyyU'%LMaN: /`M 3~0/Û'bsN2%Q֡0 }5bJVT\O&A6;2S$-|4b9`/3Xr32d;T oI#=,?NYtPL[lрV8adhD1i~bo0J9=&bf ]uC}/@-9ct%; 5!t&ר8}|gQز"_EG^+xcCSs}.Ƒa9]/Y KًA8&<}ft/Ut%HD#v,V, I)SVOIg*<8 wKŠKknַ5r+:G@M4ditҫ9BD\RS9.>6%&c-Ã8S.uiso!Et;~eMZ*# %i%5q*QG{p"щTsvP yq՛jI2c^{G Gפr?v1 0B;2C{21eCd[Z=[y!ۦy~4DKAY!qXw[xZE#428tԦ|Y{Ջԩ*tjxYxEq;=|=QeɷHEɜIP/xP5- 4r]vK[5( gt>6a@mOdlDg>%^`!*3 K2BuL7l=@iä O`!Z>s!z+#O<1ѾRekFmU}˚7xtt Wņ oS~*icZpq>/N, &v&^>ׯ?1\~ċXHo>hLX^0^0^0^."ldRal.QJ]UK-0#^\ɕ0Qh^aD~ulo7}'$O6G-B:f#|+u+8 ήubAIv/ Cg10oLݪ8woBd| cޚǩʼnəKKt<d<1%&Th#[`ũ궁< &YU%I"vqhJp7^TLsA#.0 DiԼe9?)Q6,#5  |wڠ7VtBzդ d 2Eu̬!d(Žƒ;>qvbZ;cF{8x8ZHz.3FcܕXhBliHЄ;Ģ)O t$=BDxw])-/<3ˆ@#0tnF 7\C۱ǟmQ%ƒ5u|dZH6#[<>Fx1:qBvxcY.X Xq~cXAT uUaJPA4Yf8r6$]C:C23!ԉww[8_JίpSLB:B c +~I >7*wmc~z7Jʙe-TˍjH"E9U(qaւQˆJ'/z0*rI TQopiHDT/*Ks("ԉ0]:t&#KW DOzM 'ѓ^trvȦ\"ыun5x3>RGn#-Ů-4^A~IO}FP/Y~#F\콫!H v}^2.Mǂ&EAMPN:q=ln4iz@ir<9+V֚8A-&dXذ*IX jҒT/T퉿U) NardHt"-4Fl a'wPPXLGph"qv+gLh"׮ٻ>^ޖ26uuY jC1D r"CuFft5P1"\*W@wt#d@7`:GJ&0֫aLN40C*C'M}VQ|vtqPk ^']gw7p9AH}n ۪<0|:Ե)6 l[zAl=I%nv+/mX6oJzǚzG|ej6\f <Й2ssvAC luPV\+?07`!@lM&pv>4Jt{VڦD-eW(*7=gاU.5?7%>鋧W4B0EMXbqh*d#RhZEzC'ex5CgQsoy>WէQ3,a!ٲUe7kؚwSŠ[(QZېu0Z@:0gׁ/g!$V|+dBtѡ. ʏv\8(evM䅇t:xٵ&!Y&`*8}a q0:MGb!DˬMC]!q8N9qpb:΄%WTy(°BWq@r R*F֪o1c-xG_Sj*2xG0yT?*G_C8s"$~rosQLa]*ec.wP^fjfl+kC+k!u*ř0zqRGոۭ?U}^wQ=DYbJzT?UǼ^-8sNLSHn^LƗ`V *ڂİ%Lls]})݄.)#.cݟi .2.T_J׎[u5yPWlЪxX:j `zs"nH:ۣj:^Q[`@NEAc&ޚx:lYI箵D t{W'%0rJ+Ojb<[Dͱ>NB q 3G6UM-p$)%5NtEcj,|e 3sFVG;/@DJ< Į*soܮDs|gU`1õZFw]LF = JAʰ@6QN& WE=Ufhu%;V 4TA~9wKDLQ:B* F@h$DwE ϘaA`jbӊIi^9Zs4dW ufwfy`@َ=Dfn $kZPYlxcm[ˤN ZjMrO?Eԯ ˠn4w1ys#{FI.2Oe9Fy62(\{zݪ>n*f$qSoV/3"K*fVQhkEGͭc:;\&qaY*,! Q]|=呵[Ș3M 22 1t{RMXYk6p'#"dVWWb.y8+!AˉCˡr(%ۛ=У]`^<ԥ[hF[{жn)@|z"O2Iw$f{I1?ft7mcRfr<9d )0~Of?aK@O!Ox p ưzWX0?}?<}\E a/@&2Vm6_ǬT^,H/+ v"& Vwd]|_?[w|4&2egmlo,P@:dN[^l6Od.?'zSw1;OCO)Z=/ ԝg]˳-xoV[J0J4wps e:ɛ7M?BA`=<|d9~<^Ey&&x&HrHɌƷh-`~C;IpXD4TȘ~3Sܖz _avpWn/*Tj5g<@CMa)@%C(=$l>ӷI=qA>nDC,,,(C"3=m]TF&^2ljj.S\,]ރGN*1Q@/B l.cbUUv*}W nm5!A 1¨VՅkå*b⣙͛SϰQW&ܛYh!WN'9OqT/."fjkASN)/ wTw'BM%w?J#;%_ T'K6Ugdl(Ǎ:D뮡+R>5di^%hډ#[W{ Y!yf3vỹ!o_2 %-xݍfQw `s 聱A\ZgSMd jPHo}`|D/_mȍnlvóiTɗ!BUWk\tfh|Щ]]ԡWF}7*W `^G뉨' Ӌy*Ac Sى>0NW>t NV'W$ Hg)1vrT{'Q\\qҥd[7'—[KHefe:HǴf;p/b[Xx Nw]+];U@%Vov2:_\ة8aiYi?f,%RJї3wdĻvj\]WH<{KXMSIΩ>:Uu \7t2 i(.;<ҵ }l^p|apW&ޱ8W+^Wð-DI~p;gD!ܢH$I/u}klMvo4``n. kd .H43F٦0N1Jg80ޕiW/arUɜG3'/81j)GV'T¾*n/V=SUeŞJU"O@+X#&:r о:t^]E1Q( *,COϗwP'ȫa` 7z3s8$}t'_`]ي_DPrͬKþ5ny4<4z}J1DŽE~]|fy?8gS W xu[*FmE=d/@ѾmT $x2ŐAVIxk[VaJH~!xqHon\iu*<֔N{-4Ӻ,&˻9$Ό&BE-2pV31(9Mưҋ0zc5#8yozcL `J]Kv(#rA?WF:#?O2Ȑ"!}?.q6-ǣ4b ]C%eYmT_0.o)}Bc0rN7~BZEz:աbh59韦G3qnibvD 7Bu?SI iýX%$ȧAt ZEsD53")RqvQƾn[4NU6tXc9Rņj~G- vHGP0%԰W,$Wˮw q}>NqΝJ]浊?hi ]~:"&&۝^]*Zjq%ma{[-=}0L)8+$1GS8W [x4 >Aޥ(k)'{>].Hp:eG]@x 0.ьq? Gj V `Lp&4~$ADOraB9sJ&ЯQNX7F/j5k[[a~Sg^yB1a(EV"8d*j;9#cay2O ?1>{؛P<:  {50ZNKМ^yzH{qK=7fr7&5jGpn fԍi|IGDnIHOeԒHZJ 3Uo Y;;>5\{2`$/ _QLHm*yjⳬSFlڹ#咑f.(0UAsƯ$_d`Q1=2ӲL*/w#Q:EL* >h -j)) )c鋸fv^W/`_[ ۦA['6#9!+^ׄ2ݰBb qO::ؗ}Kf`o%z{M_^- ,&қ|ʵ3 4ACrfs4]'K ezۥxub/eu2"yWP(%) CAkQ>1~:OΨ'3vB(*LthM*x_4gkKk82cr[dU( %-ԒB2eKOXNDKp<C20>I\]F'&y IIGV^2ATL\n+( ]"<-N9R.#fFސe1zZEmEYh4 GK`8cR}=,tS/_ WN4}삪(IW46]e lj.&T36iWQpZ4ko ?tbφBK1}S|@ǯb4wIh{m5r,ImB*.J' 4K]^CW<8r£Zlhhh$59.ڻ3[`~,L0>\,g~E H gab}<"¢L Imڏ!PP;ض\[?.8ğ# T4->/^Ž}*[#ZV^;abTpΑöOK;6g݅W8aHCpCb}w4`ٝ-f46bE sFjQ~%aܗxO:%c1Aޞ?^\WU_%9gZBnj\]zp ḣ!|OX|+/ɖoףkT,w^bFKͨil_bJ6t2|] ŗx~K; ԥ7e2nЉooVDrQOS^>]1mj"sM_>9###\ ~|%j&þߴYe58"ie'7Nߙavc 7ApM NuSD̉~ {n>8<&J'MAY;Ay7svhک `f Xؙ$o yLn8OÐ3Fa7)|I/;L[yi6R/LǿzR?8 k  Sct΁4|ĻE4[, s*? 5K*XPx&MA;"vBz2o2n6/?%=zVOvg"T ︌+Gn-P8?0lQ򜝫AГdA”Hu֑7Vfl SRk/(<BO^ Ǣ҅oV^hlH<ڶR?~=DH.k. hm;66E5o\ǁ]+7©ꂉ瀿o_+pÊHct2ZgV$+H̛ZLr98 CJ(3'Вb-"檺*3#蒅36 e:Eox]7HBWA5UǼ`XKRuU%>%:;L̏U̡$bZ$m@Η~>A`=b1d뒱q@jK.Akek#HO8 ,N;]G}U|&IeYXC讬F}P~pjBK3¸*#d|*x`}B5w7HNKDIQyacR?Z;Z=/n!p+ԫj2&i%#ݪPU2Dn>i4rryvs>i :qV.@v`f(ũͿ9͊eI KE4WV&H "߾F0xPQUj蚥;DccmL!1O JAl*pVG6>8[ܛRt5!w3z m}л7pz1Mق|8pCtdr&œBjxOUп$^|j!qBShL!I I5$.w6qmTvG G7Lb* X[$a/Hlܡ]mO4lKpvUIa>(4)jY-ӓ?STȧ|uݟ7`Oci}?7ן?϶??%ؘcy(<Ǩpa  FM>E"/L`(Ty:0I(Z\ӟ ˌJ&_7mUJWC͐uwmBXU)+$'%ٌq0|]|jfᶫv!yqc0Y$\ ]:#Vq7}H.+'ުq Z#uKjZJVr>SB+iP5}]gޫjԪH5[\ BSw^؍xdN`tfM_:<(' 4' {.y:槒? *B*eŸ; CI{QpuNR"~|q|y~ xe<+R{F{c16lڛgsv簽Iվb7IGeXV*ЃOǓje5V46RGG-o4Sn}@z4;R#h^;b(-3`z 6`$)F/q"i4䲏x`) 4^X+ /eyp^VkE69hm;IF&1F? )mNaM(q&B9Nn$qfqʭ͋<N ¤ۓ1PMᕙ͏x}{u(,13:r1r!cdͻkJod;CΖw>=PeK{;PrJay ^5zwS_Ņca$jGa^.שϕ+n9^xF ]!) )ŝJ ݭ*oQQMV4r$`YcYMNyZO;t5ii_q>?]vPj L\Vzu=|tg ::0vbd/添 t|a霜w[{NPdU"jɟ_?/?fe޴[5Й9MqpSk7/+>+Jy1xd/  Jn12[DgX0qBqp ;u yK CmF7[ny`| SÜg_X Aӄ$Z\&BsYvǺ2*..GgHLki.IhsS|+?': TJ/.gإ]U2h;C YJ }=`/Q5zҊhw2V@ל: ViAg!mXJY=_yy?l7?{ܱOQ# OvkKkw[:*%zՈGAmQ@W7M(yiv!WiSVgs\rZ XnTTeQ#D-+##vdo()>蛙,b25l3xIRuu'p%k6_G/nDǜ$j#fWV5F8j)xhS5&-OQ Ͱ^j%fa쳏^eM +Y,s0B*}2$-W׼!qF7fCO-_8Dzh//Vg0sbj)_b:R]iqa @D_SCAPEprIQ<|Yes2Jm-VReיBC'M t|ITLd!dWLn|JFMtA$i)nK"Px .K!=2r Z4И5Mg˄/DRJthCp(D$d8ʡnZkPd#ڶ^/gKcP_/u7 r6rg)Q.,%_1洣XP$ꔮYY`9b$ؘ!(NT/A.Rʄco_&O$-kZFQ3_|h3.4q#7FjY㍎!/|9I*!i)(h p+pB(Ctr'1q&A t}BRQʐ2Ia8*բ`~G )#Hp3t9t0xMH:+ldoO[ &P=6 lh'x!:&LH}؇SU)ׇRS)3tfVBcp،MDDʇ%sXt :%I>CW?IY!ˆ %zaquy/}%JXEufiξ_@v*qE߀ȋNӐ=Kp*愹v[ߴBLMR0"|bcEaVf٧xjFjsnl^Ւ˲+Q۽s_&6T87ޚDoOHSxK~7&~l8z|-}Zk5WQnMrM$?VVw(>UTŻ7c纪^@esZv ж\  87CHRm.Wk8ϫڛ@dVͺU]:Teyt-٭%Ln?,Ge-9ƫb5:nTZ򴱹~zƿ]:S:bNcA npOqcd %ft6Jal ]]ЇVx^M~]=7wOz WjyN8Sꐭ|Zk|3{~K _>=bh2#QwrtgXh0ٓ"ɗ3BK#\#(2_7Ox^7oy))ї5AȏW  \zN. ]Ґ}>U[_ɢ3:nd}+~rp2T^djEF!]n'&%PHRV* S ]|DqIC_bB? O^AU)&L|1DA6L\qqN~ERp 2=d>1mɭLFk;Jd CQmgղt;ygkˎUryl- kYƟҵjuxqp?#M焿EW ׈~ɲGűAQY#Ⴠ~;$mG-U%~O*n&'ػẃW^Ԟ߹ݣLa#L~_tnWuDoo#?o'oHv t,+C?ovdf-dq8w{Y;9:H| ^"ޏS8E(&ϯ:vܭR3/gDbd~ɋ^oz]^C=7Ϝ-xf6{d$+TM-ph wL{N;`⒡ V9`[LUӆمD;y.ҟ?b4\cr6 ΕnYGxD}H,0hp*`rEܻex C^N"&Sm@ nYӧ<Gh%?ZVo>!""I'lAx^~^ۏ?%X#L&y9"ޛ}v#.i;E111`HQ@Ydg x¦[4+D1hYexX\M*GT8p_c'&)n lwûO3hɭb y^-. 1a|:3` wSre5NkԪLoçZx|t(RmD 1^`(S\ ϰcczѮuj[pNqTvԣA_vq HSYqm|f5w |>[S nQZj۲%*sQt+G**4nm巸|-!S+Ց?%PP^KPpr_D-rVͪkȮ\Rҭ̐"',Y͗骭*X9/KMI͙F^:.۔~:b(1ȏ,C_&jX=1N͒C : N +gXSEQr5-&}Wò"$/-gNFhpZA/q?"c¾V8Ѻ@*>yɹ.\/$y?)ҏEL ;lnqjȅq!=dEJ z4p0MV!#.eg ctWPDX{^-ᤅg|rM.Qd68<ơ1')'ɼ+Q+Oy߫+]嗽!|sIwIC)>NF70$SM=/z>XRe%aP."!N.2 p|7ÛtD}ËxXpMw ] ==hyXM?fe: i?;m$Vy ī#}}$m{<OOOFD)c5HP5.B+/.C؛ @)(1r1|U'~tb&1*v^ :>?K^i8\*WIixCc%.m8ྰa"'>+.~|5Q_S!9`F  2F +ع@F2;ί΋$yA%,H",bx$j ?=zC[P yɠT;sy'&o)JvgOA\8 Jp#b勯ObBCHl<,5n]ᤍA[!nBw9{][xÏ|,a(X-nwwVer qtlF» }~*1'|+ n$qp92ДD סF Y>{e/x1G_wKwwPbwIn&' ^`#0wNpnccce+%2G'Wx^iwfVҧM&teLzIMs#$e6djQ4T9W?8LNz.;{C%ɜ %FVV7UAhXO*=9c`Iv$g0'@&3h[%a0tx0Ir%R=U`&^c)L4*ol~wl ze 3[\MPl˱ e 1M9Y'5^2) 8AoB?F>GhEGhzq 1 n嘾LƫTwUxVX0;PiЂ$FCi[:@5ҲSC!vbJαy1qAy 0eZئ 1$įAô9I"|  /6`(rx, ooGn,kU^K`G҃0rUѫg+ؿޚ\ex\lKUQB)䜧{֣=zRa2\G񙈇R,zOrQC{sIX)"G~"U K_u"p MIc6& > *ZiIq9N=⎍躃@1ts)uk 7Jp|v1w#l_F.bWTSReYI/~`:+9"w/숈7V[&{ªV=J`I 5cp󙦖 ܷ̱ 元4)0(DNvu |ώ,_lãtȇQ00]]#)vx %ˊPlusԩ$|V! /.B<ء]Av`w|KӼ8ND< vD 5$2klVcCrT*TeO35qp/69t&A"{QO?4JJLrDZ'tp wyB/J.nMR>˳?#<'oX5e\<:"H-@S@EWѩh,v/x)I~#xhd?XAp\w-vĥj 53q@PwS+]'#CYl1Ҟbr_ݎcR/\Kox)T`h3P[dw\QXjKk$4!:YH^cj;OTqM5y[3 =sfKE~Q7K5oYz8%g/USaֻ40udMh26OPKo'piv;/67o 3w h䶪 YYB á|g  @(; ހ::u+:vb7`EaHEI 'Q]rop&1̈́0RTczn*帠ɓMOtHT S۩]F iԙu7X™uEO٧Zu_.\h?,WuEZkvJ^!?U*?@f+: H=ҝ_)Z}&7;<^ͫM7hV: &L; uzX2d>0Wtɿ~+}ukxQb1麷v TW]uO0b WfI`^,p '.t1\baoVquĺYj:N_{UwDX J=]`;?CVC8_l,+r -@G' H!0CNM1)3DjE4$Ps<+PVAJlGg+vY;6*$I1C'*Hw];N÷5,3[QCxj0驦/8]B!qQ+zȝmяc%zoYoxF΄t2wʸ8#RHkfNKd~ ZQ7Iy>13;U5m\7 `ZiLS,|r&c'wHц "q~wŪ\:j*YFU-ЁppI43P$t]SK/]{t"w pV*aBL _d-%.napȚxt\ej^\)ҍ"9_by 8~E2^߭<#w:b^QUQX-nF].HnD NZG3m VUeQmf;Z'ca ЀqO }FH* 4:M{#q%/уDD*K CAs:67R>঎b.R mu|?#ssPIQD7aZ{X  p)% Txb +3[H0*ýPob! l\Up/Q f;cW<Y^"Ɗ={=S2hw١9R'4y-M|} jtݥg OŸ~1^Z\kdB:}1ރ2JC*H*ȭ$"2Z%E?NN\笖,Yy M-0㷞ۓ8i責m] ̷d~l7xl嘜>Rqʙt|*CH@Ff:ݪ@F_0וA揎?ۮ703xQGc1GdR? +o%v ӿp(B~111PɹL<}TR]կIB+7B `ߢ۪{ Uoo  nA\&TѠgzt3$bF8F*&l]/XrrJ\NFƓ GjB]]E:ɚ` Q ]cwc!*bESXqO ZM>Ќq4F$24ǰ25 ϰ[bCCrё,jiRRL:Đc~*i}"xh.viš@e pU59L=ZKo ` nQ2x/uOK҃0[*+jJJRtS?_i8|ߠ^jҎ9~"{-ڪ&{u[l+B'R70 =HOG:D&_5ԟ`%u\h5liBO ن-mBVtlFRM:f}Zlj iT6۶H $FzN! X QlM[VgA y *PS;!ժ}3˚ yl+\~r!k@TLElMb^DHu{ѓ ߈Mla;DuZBiB R6Tz33jG0 E_zYd^!uZ+y')m!z`%3}B[&xg4x@ڜۉe %c&#*YXry% or|;8|-tC< RLN'K1{ם \+)!'"w7$FeQ1R|&Va{bzgH\HS/ `geґ>%|{xxY 'Iv͊p뉽GShoVنdVH i0 zbm4̷7yo>۪o{#y Fhw%-ް3>'h8y4? C>27 oټ`o2˯?ޱ!ZHk6L0 7jB<˳S`bյi28TB;S(HN|iNl4`v@j<=/)n(+ = WčxzO,cm0ʳP[(DÁc~Ƿ*[oszB֑XM[ rlQY@`Q"~zE9aT7}@TU̯ Xp.TYGv{JN4ؽzNN+2 +Ni .;&emX{ iliH[L–>ȉ>lzhzCFMXf /_o dpY:}Uf?q ?n,fM<)RJs4zYXt˪Wt۪5S,;z9E;}),q֊LkE"*|yl(5%t\RpQ-J w;5,u0vU>/ʧ<4vc} )&tipf, eԊ$4-}TL#3zHV@Q$G!ʒԅM9zM@'¡PpI 둠cL@v#/SZy,#z[cm^:"QV*(kÐRZ85yB@HsgL ߕ U@Lb+:MІ7AҐ:*蕾Tk緁{bIl&с,K n $@<ˊFރO"~"}8,8ĎuS&ۃ"i?{z䩒95yBXwf{N*/^lQE ˆvÈ֏׷6cϏxJ9>5:Ơֻ<;qn><(f:t\rfeS 9 [\STTn)nnMF/l86b*ZRvCbDx$DqE {6nnRuulCV?#u₫xOmK%DzuwwRgA.v[+?Ne Fs'NlR1\h<:)[28T:_Us,'; TE.{xw;ɑ(gx[^;В6z8tTMzw9t5Lֺw7:3Nϧ5Sp%Inl֝H`l!X G4Eo{Scy`P豇F*;zFƌI]vju"\ZfS,C)ҮՂ;/ͽ> 1]v3Th =3\l 1 >oXU3h4$`9PM^1bwFْa²p.) Gz3+r $*iw u|pA4_o˯ m敖8ͪzNɤ˾M0ظʈ0#7 ko9D6jXzQp搞 7&- 5@,Z 5fE##6l}vl x+"&q1%FwWq@.Ê9!4 B}!8!ɒ (!V&kBnpL! ZoH Ƽha;D Z<. cv&Yf $jE0]U&s)bΕlݭ".O4o^D^6_wGS!1²90x''g7A%H EVȩEpWh͚E">?AO7sYDIs[n栬k9 2u-}/}FWvn+䌉[A? x7]׎!2 Tލ)`SiW';a3aӜE[ _bOrUH8|LIPt W\8.|s@ C |Ps;J<<8u;^I` 95CoBP~9U p;2*01!2QE" @HJINk:::}N=4O6ڙ1d` !y,Y]Mz< z*/=S+Fϒ ZD[[&6u.H䡶ajZ-΢i@QCSݑd7-/;ӷkgc\3sIH8 Bx)ė`GHY"<-;ρ1٩_4S6}"k^r&}\bJm1ْݡbBD%}]%Jc!#zBheF%qA>Q t*nk]yǁ, V4>k0w7Q_՘ph Zg b|da%=dkCh=Jz }I<_؁J}죂ZATcϞ?jx_[~Kw'kTݽ}_Tvw9޴1B,pÓvt9?N㉟*^1:]${fh11 FƗ,S~I¡]}@Cs+ >bpWEwV7č> .)Ä)dI 4ar9H7qƔ8M yX2ՄX0YnQw!}qv7evĈSNV >wjm] p}$O~4xBI$'rd==ryaZ 4(nSkFfÝphi>${(#}n8(?#m :}4dO G'+Α1  a|8#ML{|;wđ. @Blf~RT9f'i(2zl z3eC8=A! I/Hp5&_XW2zp*SP-q 6辎OnB\6erXfӘ-?ႱjEJ; ݹ:1i4B l idah H S[9-<rFTovfbypi)NҟG.N~$ 0`xQ[Y:lB؎DAKh)]d6.łAWT0Sik ".N Oj`V{㠭uNx Dq {BR, ^UP?#I^y#/F4jM}'d'd{!Kskκqw_4]{4B?M7pLg3ũnAz[Z| ,FQ;p'1(+/!e@_ZwqIr$pFAwt:Vڿ(fwׅ`ܤɪżBu@\Q8s%o`dd,^KoZJsf9+=Q.4JԹ]3yCp0c_/؃*w'Du*YnAFqar=~̃.ϟ"';n-5: onyqե~uѨN=ZI@)Ї hl'] A˾y#J9tQtYfx&p84M>`+ yz$p ϡҐ҉%G(ɀdde ȦuK )њuϢ|8^`|rǫFAs7F tV%`gR-sE.~5S+ONF oXf>}&q7ww OvEL*&Hd%3tt4nEzL? =S%mɑM66W*ebzaE3ߐQjF 1S9ui8Lh;´"kgwy3\M'7!>v h̍8=M'ܬjI6&=2e4>WZ7y{)z!YT;ĜFK="wY6J+h(C&h^lEdge73i[b˩'n#Ԇ]ԯAԗ"N,C_]MXV᭖Y2:0jIԽb>z.؆s))P1!]{O'57Ss 5FLaj*%f7FϓQ-?n7Oj2`ݴ Uv`QF+XG5wlqrڈc>J_[GF-8IRjχo8wרaixͪ\dI0kA%@Ю[dTpюX߈ށ*cHZ@Gi8|ktum+Zr#h 8l՟t0'!古JkRwoN#I)*NFξM22 3L Բ9Fb}w3.]U] ${fa!fp/K;b:+kE$JO.jH, Iݺq N؁ddnZ@xNDb-YIlQ~zIqu0J>DBPcM{C޷N-n60x(hX*FKWSӡ~2WC :168y"L1J /WjbHV,#Zi ~bK"dbGqq5a)LCDT%;P6;ƟS dH3 쌾Lz> '-bc4ouZ*!NR<|tˈAZnzy9;ixeɊ"őe/z^&2 oJI̯Aq}Y~HfyC==^#~s$!9|$Ξԋ4!da`ť"9Ҩaf+#向DVi> rVh3Yh3._`-9 ?6Ch -EJD|"43"^!\' 1UIU1-^zě-Av5n{P53D䫨k7aky՝C:g@1^!ȵ02'6?K9;TD/k9vF1T5ڠ _%.+8~JJ]5Fg!wF(A?KıvtH .,`e׆}C mG; ·҈rg3*B  G4ڂdRU%@z^aF]2t3͐2x~ʯ'i$3Jkݴwߟ7! mŅh[ Pd,l^>ZME?y DY,/Y4g(ĔstKn?ET\6 L(dPpV:+En 39Igfuf YSu-Bඹ=>>0+R@A\&l^0wk :>wFcr֨|1")(&9 B)p .UZrY8+^ZEKh C1^RX`[@uw;6*@"ѥ^l&]C>& Ꮯi&6nlS/>gNBExZu 7sz!5bCyj<>L谆w1Sb0EYʜz{4gG,㞒&ofWl:6tvdװus=pwW>餵QgRDX) Ș8ΔSZ9UF-Ol- UB zy+ȸE?Z`CǗE?e,rԲˢˢek&S,zqۡ=?AD3;؀ֳeW` EV3PG$MH_f i"nNa\=Y jcf+o*1&7 }A1]t{?tO˶1q,$ ʏ"Am.3=N.ds" /GđbS7-R%?:+]S xG~&rJS\B7Bc~ lTGVp*'.J6O9),|ZfWsaX$cRK=?.w"sV}iR9F؎1K>Dk_>uJoC P^t5,,RT1220mEͥM+⮿tǙxiWn%(ϤjJzT݅dלW⯴Td>e*WxdlηHZL !l!t& ,xU~. pa3 e~/'7 ZI &Lݛ;mJByg24L].3У&T ٜk/377@5?қZiKgqZB/~5v.ހ ^1nº &w$ 4h#{$ћw:z˿4ţd<%zO8stY\L:d7%x? ֜s_ؠLA)T-R2, 8RTr}I1OZSBt=($щ3&EIq~*d+4̶G#?<>q>ﻹ|3[''/'| R\}@k;EIXM;u@sSq@ 樹Vv3*žƙPt SoIv۳l9;onγγWxyȤ`҇k MLdLRNFM1%̈4.Uaz,07gsLo@:z]lI7FC5I&XEVM}b&".6ܡj FBaq,9w/NIc&5Fv/v w w0>cbYLIMn>Z=iM=F '299a/q+zxen!s(f$[ΌTdiܖl)y4 ն*‡%{h󓾜v̚eè9wO:7gQtrܙ&;r;~7j[K17TVNUzwE&MC1HHn["'}x&=>AOnx4#oN4&:c' $ +q ƅ5fe1"$TS%D a I3s`ÍV܌0V6;,}0f0Ve Ž1bƶsaα|sNoi~4^8%  T`%aj=J0S&4[ X'fJ|v̲n:XKf+LQJO,miæjl3]lt@يe\ ],؎>1 y[.)q. i,"6v˂HS Ƥdiƻ0sz807|oci \N~jj?66=df'[oj/㤎4l(E^R<:p?{Ym#j2N/5v1iH ZGmv02gbShkqKƗ C{9pK pȊ6FDŶ9;T7+.;)d6f`v'̧ 3Xvmy|.R{nLX{'~ooNDRNq?;;U <):)#tM)͢We>YUַdQBi(&Tz2͞ ^F+ (fT}I"Kޓ(_(V8} oy\KABa̸pu0l]S= Y{Eא.; NM88]57a ~M>j` e< qх +Y{ȧ9sO1YP^[^&8o-YXZb~ 2|rvqk=فK;&Fa2-YødHKb#eBd0-޺^oޖ ӡ eBVU,@9 0cgb=^BF |u6yȃ )F_h2-9Y  L+Х#Dgȁ*1G76 ̸)EFW1n}6ʍmw('3){zZ=zlѲ]G*9!k v}EoK+bwrn⬜^jĝg݈|iɦOLb|;-]PNWs`'sX0Gi4~Mfq7fXN7R4kOz<7zڷP-Oͫ\y#O;l!mcjArO$:&w K"Wq#S*?QWN8e.ә/LsbzGZC7<-"d\t֯]&yxIiӐ&elb"O–IGջL:NrY&}kځcw6˩ #h!}MQb]e:\)ECIكPOA$ gi ϤLh}"BNhIy4= frfPo9Z|Jlj?L Hl+9>abElAvOiVVnrڀR,L7WR8l,Ӝ|\0T*kZWS*֡7RBKA-(K+OmabJג{4wϛ>% ͭǑ8JcڶsUV%1Զs'R2{XݨkŽ6%4%Wk0Ϛ4Zϸ<5Ʒ/IPoM7Q]]kJKy~%o 1KT03CR۔/.#v~|+A9ue5Z-EPNm, AJ18Րf9J8\o18=> )zr,wyɗ-O'l>Z kǷILYb~b{/Z?>EpS:6ȇ7wIs( 9ut.9LętRtN#$X}({'Lxڨ"/Bly>AY@ňe ED~_-F~ w<wx "la>|#]=it˙1cn^~|(M٪T%< {3ۥx?كv8NXkbQ6?%t6YV}Ng8;DMf7 \,lj+G H [fq7~ ۝I{k j Vaqz_Z!p a cDVt%rz>>6Ft=t>@=1Y[tdB(oWϟaOyi&:`m ˍ芢yg7V~/w/(#~(JR S#WVo8Pg zzV,h &<:m-/t3ﮁc9[KxSKw@Q.:F#(rWbJT)Sh2yf0A vmGr« )۩F78|~XIv1bzU( GV$kHč'+g" cZn;@X|5Ě/*>Ym~wӗF$X*HTr%^|Or0$;R∢`Fazzz*ۂ ^ \MS۴XhU~~5<۩ { l MВsգh%XwtwPoL*?W`ߍJ?Ziϖ 5mi\GK*T<[C]?֙\/F "H[).`5hT$͸axV2hZr5 P9>_ԏE񕊶7nuL^ u+GM470y->pW!WhDT,Z!4Y[Zܙ#KvVӆ ACxrw@rSiյ}{N\7ӕȂR0~} ԬrƁȶ Hoq|&A,[8@4DA ;Kh@ZL{n|5w< f+-T|(A*+Ǫ q"*R{lY_WTfPrsv2Z_@e#f7=Kg͍Cr?韃ư);).Ee3NlM.+_nׯ|bߋz=Kh׀s^bxď"4M|?M|?iGS%%8J"w:f؛fŽY16+Ek}r^]V|UVUS1$h <64h6LB B 'N&|o!;Zk<<A:0>C{IUV" z-0n~o vq0+!.π.!e2|@Pz҄0Kd+ 0KD7%}ޗ~9h ;ɻlIc;W`/%v#+IV%pL_$p3g6s6]N0 :iYg&|7 6?Eѽ@I?3waA*k xhݝ<рiG6C:Uq>")UUF|bh&YI.b ɄFā䳉PCX ӵ$V!1,8<5L+޶=݁ȓe~e~e1\O+*&gb'rIiV&,M#|g3x4C]/ߌ/|yҙ0fWx!Ifj@j~3jX64:+_F[\ Ijd5+zSh\dg:4> /$>R8'v20?{XOvmSojWH2]fg2Rzf PY`#JedQ*RnESP R-6$TaVD)IB/>-G(he9b& C./h"]i6dR}B9.%Ql_'b0P! 1b-kD|gq[9|ڮQޡֿF8"}=xM/Z r,v.jrz9YN"x>y9?2H4q,W~uvy^`DC9xxr(&IÖ)A`K:NhǢmt|.xnM[p}~:}v#KB9v-Nj5rT}XTHå %d@xRBDF/PaitNZVъzь\.*%Vj>v5+7Z-ޯK.\z;`t+~2r}MΛ/e-dϠϵϢKAuŶ{W-%v_IxT0nvK7\l|QM윧GZ &!:U턇a1MV}?Wϯ4Uo7jV\)g\d_h /lǸnhd ,?'`p2F]Gch4p'٧V)@ϸs=À\nQAYT$~Hh' º{_e۱ 9 to_^7AO2)A [z)"S .58 ,CsU=4zo`wP,S%e2(aA3jAPhǓs~JB{`NJLuǥbASB'6䆿ͫ.\%h`mHvvO lHdFź /j$ 1@kXT?;Hu #eJw_ (i DekVNsNm1XJee%cGbP>}6[@ GcCS;qwW_,b6Ϥ ~.^|_aU8x&ȼHH=X7oⱐCM"ΑUw)ЈnQqR=ͫEM9?qkQ@bh>!YY!]~nkӪ^Ze@޴G*#59*z@퐺FU7LP,w\ݨԀx0mM\ŤT*=DHgKb\MHT7QC:gǺfc4(e&LA[L6q9d6Y%/7Mg"Ȳ 򈸓L4rޯȁ9KWB: r|yEEPTT.-.-7O eZ_IvkC`tsu;en6 O:4([8{cGB Pb̓ :0&}]Rf!jCՆjVYmfֆ d)&_9,KV)s"IWL\'5kɪtha"fsof]o23jf-6]jm"òldL` >= :6$.5'0 I$ېLP5ې84'0;}{m0dJWFyF/H>8*B  ن^oC7tW`_A6雼ͧ=~2VUT,[PFjTRUčޙ? V¤ZZrwIf䏈'g|L}TSP9m$!>Y0R_X81/$h9)k 0DАO-'9؜ [q\lYG#Dw ƌ_S:^FᆰP;4sN*VHʰ)S+;|NW9T0|sڂ ݓ)K0'<2'U*OY=S{4?q!|ϫ= S䇳3L9PN >'Lҫ37Bӕl''){ SoGr~hF>S1T w ]f^C^PчlAAJf;fC;afl;)uPa.uPq2uPs E]o(91c"zYٚ9^.9L̘^VO1SfN`NAoA3'1kfY3'{(ҸT@P1B$/+c6̜ނ2gNPά]Slxv5恧(n]{v{˴?`jw)7DTӎ>!eܩ%c܏9^#v+Pw+&LjZ,t$ MĎnic$7D*а4b&h-$ɼ$HipMlGxcٓNc7Z J!ZFhIu  #C:/2sBs3!q@I4(0gmwBG͎M6ȶ_N1Ȝ6e~L-_Q"ymKypw=lm߷u[#:ݯx]x\dˍrƅ 0e޲0e޲0eae{\eو?&^nh/'{4'DLONs# U.2!.$wҨ(pHLd=dƐ{B\*0zjj OgZ^}kWup| Wq/I8Hق˃DZ4\7 ?7-̿:c -柆'5C6'U #c4RM|P[xD4hJbIq+aNr,t:V3Jz5Ҟk+ "lA%H(!Cd< 0I0 P3_2fXKI`xsH90?ecCi8Q[jL8Ð?k (21$ -?Es%ɘSaʉ‚^i,=d;4b@XX^V1Rڈe6x%GU":M"lRx bd%eXV>TTnGiOZԤ1Jpras XE8Ě 011 p "392ڼ,}7+sc*T^V1 k'P^; zUv ݥQU xQ#J"J1HXf,@fJ8*3+i_V1P`iݍ+h`0/c@EA% vioB@nC%/|$0i{$Vd"ԕ-@\k'0OJE"ddSȧM6B7g{$ok:x T-"l 8^Vw?9:lAJYJDSKcT%FIP=~`A/ÍPH$C@u}; {9QQ^$^7']+]pc<.TĂGl`G`I3&.r׾bϻ gP$/_u:gV\hZPhrs%x\ů C6Sh}%lX;mxJ'.8JDz7xrCWnH𴬎:`):|HKJ SNUՊu~κv4<7]c~JyD;"|^qg2*36YV?ȑbDWow4#>d̶v묰ra>\W'(IoCW \kÏi8NQ˨ʨe]e ITxz 4R2H3wEđs(gsSFcz=mOOop3w-Zf hno%HA1zƖN?h)^9ܶ7fZ֠m5fv5a.7s>4*i]3L,tH >Ki$ژy<#E.o/\c+#v3_Ub0 t(sd:] e:/ҙ"#R!! ,EYTGO@y[,MR5U6uM]fSTC"1Pjo6GaǷ`VtO zeDe8$̳{fzdAJs>k-]٭0;ϟAϟPڐX,Ha!?RK?7a4„i &9F$/l߻jZi_.U5H=K#3$-쟠h}>!^"iW^zNVV|tx.RH59dz8ˎߒ q2R~୺ma R)d=L+ڇg=Rxf!%( )%BJ\TgӯĭvdJo"X6'H'0ی\qfgm 4Id6g?6{}>|*gN>R)>Rh)ǍܑBD 9qOu{hA<v#Ň|߁9*?<όy yp"R#%zB닌UQDEҷ~x`"hG;ܙ;4t;˱;z ݍ5/;z׵M=rRgaY2ؖeq.b^,cXր1ci G|eg?NmpC]4OYVMn{G-_OE%fulnqQöv%vW{ﯽ_쒌W&cʮt1 \Ť6B P?cgk_M"pR_Xhb1koVSj ?sKjpSPا(H7Qd6t71O@HA⓹>uzLdaa2PvD&4ѳ~haɨŧ"(x]Q[_ a)PV1O`c ێI_̿.pOU%fN9ۏmtgl'4rA<k\*`8uTMX<%,X`.@ [na&U% p{$6,7j@ќX$oIJ Wإ0>+֌ڊWLX J'sU0 o}*s6qu  [Q%Kד6B.奧KqxDhYwmn:`bЭO+S69o _@ϒVCTgcvjSHTyBl|uGAޏiHL..@߷E fV^021a6iTEk >pgyP<{VlW!ģͩTh6T.CFgJQ Ӟhg<\BT% %<9,=yN>H lpM ߐ g= \Q<ҘvN!4 bRb]r<*'d(ĎaQA-黍{'又Z<.)@^r wCDO"1*=Y,L~XT'7E >919*She =VM19zMF̤*>xD<;( ?_k|v*|E}ҁ+L_ha`$ $Pɀ~`r,RN$ E>+&LtK?.8[C1oxR R[`suܐBz,XSWHѽpb)N09EpC&CH?zˢ=ɮ`װx`X?;M2'  vVc^ %Gzc=P&# q?QRT&:M/mڕ…LgF'=usErAЉW %* xl ٪>_7 vdR\*KP^?+xV7aߠ.mFdǟ1g[gi Q7 DږG}q;e%f:xfLMƸNN*a GX{|)P)a_v4d%q9֧}fHruDxxP!"+fw2O!SxEhŧDdDk2(ᶩf??v ;Z-5jA8?Z: Pc($Y.,?s7irHFR$ y܎$|]z$HiUྶ.IYoqE+Wm\xQUC|/#T?clZIɅwMoyG`\mȷJF#A- w82F,u"QcAF`/VA71;FKMaU7I}M_.+ѷ-N5p^7OQ=z*Q<ŋ3ȿvG%x}>ÊQZ;⣔!s$pŁk!~PLwt e GIA>D׈$Hh5k&n *Eb: !4]9*D)gJo|D : PM/ +ZrD% 42~ "kl٢~T԰ #:mz}9<7!$43Zt_ D2`}oQ˜N[H3aspZQoh>Ԉ%aJB B S(D({B ---jZ֘3@N~ \S8Ϳ=f`7z'n?(~ƟJD>[ gDj,5*bdoGk{'SΒgl'4Sj;.mRVjyg%x'S<)+J`߯o /~q_H40lq :O%ڣ60#v&wrrNަ~\K:,1 eds}I,nb[:ࠢ97qʱ;dQH9O*jmԔ%ǛӒc_K /E]~jMԠYCj7][@L8p$yoNF<'Fގo$ގJ3xU}'?ýS?M~ eޮJ7h1*x=eALxB iF=tggz7%\V ,'_S!T'm8fe:bH;p-`ĭmKQ^#h{<4SO_ |AޘrW_r]G$_Mtd\_-.("hr_{ծa(K 1JƈUCqj`2'-\meWJ AO+<{嘛8( Xc+~ Q,x֤Q,GoX>U2 B^ OjH7.e.0 Xؠ?&m _r9RB[RePتWJEZqF2]j&++wmRĠzBWox_>r1᝞rp̀oNGxSVxr0AT,MD 8oExݖe6.qF&;gE) ]Krfh Zan"P/ܐRK9^|1/~>Cm$fן=74NJ1儺:*j _8}n$1cs󑃊xK(t̆[2_H^Z ;zp8WDXnk*HLǚVu5iWCX;(;de+c>-!e`l'>\ڒXx*H dc#Hw 1cFc >2FC^zCմjw 9 P՟VvF#i/06uCZxNAcb)/N:y,:f "(` `s,nU`mpUJj%ՉWdY_ );)@wKs #óZF"b.Uga )l"8÷'Fl H/AA8n=Osd}݆SuqitGV컲fM18RL; aL+$u/W;WI=Y\pޣhdnk`:)Ar2Clfq]gֹSmJO;)z{N{4+աcV0uV_jtwl}w = |mxτII[8njʑhg2XQ-kml>e8{/EJ ~Uq\ @Exy"x8"ߓt 'v^, gq3GJVTZ:hU`e2|튈8񘼢n Qܼ~,LQݰfN8q촴ϝtIG.3;ױ*GGWW>):{7??Z^p;`~1L\ nfo )VѼVA'$"RK$:sDrE}eE3aXQiRMpd҄MӮ˽P>NHqm?,tALb"yHg7L3aT{c˔Q:ŒA|{mRU% f%Yg;5b_kT%hǞB% I@QΞgр̗§c < 'Ƕ#*D&(mq T]${ثdt<)#^dgЄtQC$OBh&0ˉB-+;9 _K~J@Ғ].GR *_9VXa ~G0E ])g=eP$<,i0fKǽrKhm(cpo^/'AA "'WN }o^ᷫ xKf 큿xKaD7(@v/T" lth_bF}Y?ssN+R濺5X{𷐿6z DYW,zZzK+Aīy%S[UVdYd& <<`R_c>>o9͹+zvVg%VA}Q#ZO M@3| [StNK#SNqM 7IJ5)#M}4QsD8 (J 3*VOCvPĪvp+-n Ѓ ݞ9)>qs8T_ڃ3~<ce >LfdDʰigŷKUM- t3L53Xw3GRLJ2)9:boI#D*WZmiI}RbY,5]vڔIHa|TqGɽBE/'ڈ.^ѭ(MFTU\<nе֖bqv.沖k?U_[Tg+簑)> ZR]\u0>5k+5= cc=f*ESW4֦kUGsE 81Sw^NYjDήt}B*f%V^ F[GF1 R"x/u9x;Q8ڮ:Ebf p&փV >9Iƈ9]Mu/cLVF+BgrMV%'eާ%h[ː0^Bu3<nx4?7?Tj[5Յr؛ҷk[й%UɬUIŷ: f Ϯ`@-7%d#3 ]7nESgCH3}s3xbvs%Ng[$AleH+҆]iKVȨ4u4WzVx`[kШ0c: dmlBHH+FRjJ2#hG2X, Ĵ6tfTcNw@5S]UV"ZPR?f^nWF*_QHAJ8!@k;gie|3m>I`O)'!~oLݠK5״ ˨& eOʔDEԣ d02mjag7u Z=׎vvȇlFOy$S і|X)F:MUFhԞCG( SS%̑Зl|Y=Z)_WSLnazm!uja>6JܱMڙ37o_LAr*_Q-e- {7^_yw|̞|jKk{9G1na4YL&b;I46/i^V;}73ZݦYD D[jw&) vYRDX`>ckyuiyч+y̓Jǫxx]Q9'Z[6ck7'#Om88^ߙeiٳ$iucÛ>YF:kotൂ"N.b'EKBH$"7{6@ؕC%3m$з#s (1gef .3ӌ _՚l;(s)U?6y@rpWpTO6[߫edd::g]e][FӱTo5sp0#:bO0տXx`)#֡yt\-/NLJu׽C . *]=1J㍮ke͍t.kN+'x ᱻON^RsG8es)LQ}9A4ЀYmƠ#㥭XuNw1dZ0QHmyxKlSrrJNq{< .nP N[.(c__2˵wJ?eQށTlI G-.D暑{9{^ܷmw: ^қnەߧ 2-ODz:d81D6c%[dNN6c-Yx:};:w\Qu-sl2N]M_OY[dCt3S8czKtaD>hVO Cل͵{ra2xj 逩?#ҫmnvTN["݁4O'fu5I=bPiɗٞ^TD8Mեg(j2'eylg9gRl|͵ṭ#0d|^u7S_6~Nn?HwR zj~0~ u'Hx$et.O[^|nY[jionr5%gHclxqpeG8{O͸ۏgbI7&D2^"P"4S).2.e'[72YxCE]K1.-0ۂܗN_{/jY}^qSjܠA GMVem෣ I{\nfrQ LKWCI)䦬-N"+TC_yxOz ÝM 'S;)GsG=ЛRdz.dG&:1w-/=a2>Q{.SHjQ'X@f9슪sW#i]5VrK|4I.pODj9vUr\sR'. KIHMg^4f*_"8~85CSE7,CnrZVÛF`Ӳ:Ҵ*3$gDi5)ъ4Ĥ<VD%r3&0 w<qI~8<-l 3:I˜bz$Y>G^l':H!ѝCAg˖mˇp$+O]HN0 : : 9 9Ϊ C5]& s=t_lA(Ϲ`9}λӬ[#;!907t o#<e#37A2QL\>p͘=ϨiXTvOb2}{@L4>ȅÜ!bw 0g/[Orc/o"[a=t}`˻nʀYޔ,tڃX Ӱ@(.e?~<ٱ~Tik%86ړsv!Sc |qְ;-3ЎalyyЁe<9q&q쀾3?8l~ŻfPf۶1\nޕeVz*y|aӀolp^].3ΟFjo=}K%]B,]aDnn̛psAn~ط%꨷;,wnվ~\ UݳZB}Jj'wT{ִ6jhON<'% ]!Z>]5}YՈ+3NfDm78eWr:Wϗs,Yݤ#x::ՋczQP}Q= ǯ^/ ;q;r5Z0(%]o>=O?Ib 0IAe%U&m}.'BN"'dMU [Kwڍ!0~UrO2`GGa9b=k YT9N<8YoQĖ՗"z;lzɴZݿ~˗/ue|K[>{6xЉIpn~uAc/F3QJ})Ml2=>h6LhkQԴ0A`X 9J j&uXCh 2=ovq7Ԟir& 5FbfSM(~z% i4A~Z_s2ؗi>E=&^,$T@PN(]CL߃/ "GD1Y1)`:LuxhSQsWr z 53 n]ESPin`BpאŻ)~.g 990l;!7^n҄rZjbIW"""x c?zÁ;2^oi(M_k [b`cp'lLj.F[`"3,9x}Gji5+{;N_lg dCnLƄZe2&T+[ X'+pǒױEbtlΕ،5[z>ap0AÝ/-\pC+0Nl%M;hw#w/.öcш7 7Ie/@P޽{'0Zzϒs#/ak-B́kbϊrZd! r1[]n*A>[JD֓ ,bRԱkRYʗ ?/ (; -hV.be갓Ka5,G?،nE*8.8Rkbڳx9x|$kD]OILm& /Π}b}Xjqt ''x"j|<&;zAױBJG:"~_b+gID2_ ReQ0Nf .g8Hjn<v#qQx\gPLjNZVъfѢ.*%V 3_6ڍ>BgBMz.\-@|]?H9Jhဂrz XEGQ۷5L&x >IBSEǫ9Ne nTbhLtGp4k]3)J13Bkп ?GQjymZH3._+RhI] 3g%|ܤ_JE;Uo,t2_83E_Տ9@QѪ5(#B@_4wPEӱѠ` oM(cZAf\ )ҩO( <EvIē5v҉I6Pz3k@!JW3/aQ9:ơV,@K_bwoSQ"/H%},M:w$~Z;$EA zm|h\Gpyӹ(6%|uۮW1̃% t?aI Dp%Z%sE!0Km^ɠ%BVoEJAg%ȓƺ2L=At1BZ6Ha/ǁwhI5tk.v8R_ḞzCld*bdKc̭=;Y\IeH' za_:ݾa3JMUUn4h٫1K=ڌ;!lV/<&Ms@ԀV}yD)|%ԍzv$:LN%lFCZڌŜnZ̦ =4<=$Ql $F) CL csqq¯Ҥ`5vt+=.֓G[_xVb\`ϥK+5WKT1BO-a&PBvSwބ*<5ݥji T5n?ZU\#nD}q2*#FT^C៣ŗdMHL 3gUuaT Nى㙥bݙ4tA,fŭle*hG^mǞek~0C ;.wmi?XPtE@MU֬^}P(2:A̚Q(HzуY;ίq`790{%yP^a" j}w:J]됯.(}#t Ts`̌-8ˎ>|_@4yzoA=&OY-P(ANҼw\|70eTLH;漇yX7t} i 4j*䲃Zf9p7:= ,U #xmp@jY:N-ñf4 lZWsHg\uSߍf 2n+0Xrݰ~;.yn7`2 ,sB^]앦#_ᐽuSPXIiO}Έ;ۂͳl9R~n[BL ?ӳ+j(`f6;멗{ ;XǛQF:{@}38G} U|OP7X|[ U]}&fd'HW[b|+L)+Y@傩Wtg^}of۱vKDcWn5̴ƒLk-n\wn>͘8H̶ˈF\=FgOEp-o zz^ Ü/5si{tnBφ?gY,':BgM} He 92^ L:R7:mW\D^z×PMV8qzfթTJqbVxB{Gc$@}uJ3qWZE|HBl4 .hB)1%tr}[86u@•ayfsyjFw[W.""Ø4P39U,6TARo_aRQ5_X}qZKqjw2R3#}Cǥ_HE|ZK\0~,M6寚l7rF7ҕEӵg0PvnFt}GJOk琦6j|qJpa̗Td㲍H{uz<ժ! &CK4Ȉk }PJ4f +zC#zJ(Ff' !dS6 K3`3%|iz] 1 9Rv!I񺱒ْu-OցޓvVN9ZO6xP:ɧkxu-duMѪziWBL da>x8n88b!Ż bבYx`y.|0 196xp3aƙ(a`WBV<ꊲ5`7]Q2p*vEɉP<ŮWl` *.[Q|!{Yv> B&# N<nAX9&2;o킀lU@Ȼ6ti[6:LC5x ywA@ 2ӡr4i 46hȏΐ!>I :(+ ]@j_?Z 4E5[QxIUn8%Loc8_6%]z((]= dD{S3v֬|5-߉D>ʈV]jƧYN?6f7](7XXd0t2$Ys_*ϗxz\#}*;^=x~tW/ǯ^/ ;q;r5Z0(%]o>=O"?b 4;(oQA  '6%653?bo?C2:+ 4atڍ!N ϋQ f'Ob AkȢq$>,Fwt@oW_F P:l'!7Uxs`R; J2p HeTQgNfdeN$BQ;TuèfQ`2Hi<'ẗ́"(ٚiTfS#@tA,E}g QVs=,h~iv.[TN)N6<Lӯ%Ӂtt[PB^(ESOfPaƄA~7z"ZGl=4B@aVWVo8Pt7.^HExSVX'5XD "#ďFOtk`Lv2 ^;<_A}p8PkIJ0H|^]"Z'>6d H&wtt 6aD l+v%/dϓ5ME!mq*xwN[}>ߪݼ Q:V-]͇[p ;^Û8&;O}Z=l2Ysm$%@$aPMw$6Fs~n: ZUNjTqL %jHtj*ZI W&Γf \QEzF8HCw;/AJ)h93XIm(}~N.VQ 10RIV _k"Xس5, Ph/rޙAȡ(p[.IFHqP7:Z,4itd5:p^zy^+ dVyjk*j\mD+35GI*g<1+9)=^NBx,t8\AsRոg& >BFIS­/[-[ GY7jh>AHG73*K; >iD{>85plָ`֬$0.! %5WNPDr\Њ Op6V|6&g^gwk p!i֕C=Ú|yV!n&i"Z%4IhU~/mɆaj>zx:U %d.D)!2Y^5^-A( 쵿a2/im@ű42ra6 D|!~>",r'(RTX 5k. :41Gm Y  GBf(6b#k6ji_;- :h=6ϕ"hK!v'I|N㎇;,l EҜ0i6t@$~c PQf~kx m{m%Fn"qy 2ߑ߁6 #[R{gi{nڅNCcd7@Wt5Fyn 춣+AĴ:mɪM1Lp&&i9=&)1y7%oC9D5@ B.r/Ya/cTݶ<0#i>nr[bޅN:ۋ=!&Gh6Y#uwrkPmf+9ńjGV\ѻM*w(%#,쒰ssy!<(ŧ67>q]f$|y@C{Oh51[12"K>M2XvQkz,`Z3 Z 9 W>a/N{D>J7x=1;t`H@ ~g>%޽d6" }@km rތe Ŋɚذs`'ZтIG@9'不oBL$>$Cxi`Gŷq-XC Y/Ě'2q I] Lb| PSRZyHP!O1d2A_R(<~rL&վT=4P ZG:@)O36cy9oI r)%mC|s?ZjBn$.-L}y4^pկwj11ZJhR&\b>ʖ1vOFi(HaH,"a-n0vZ?Sd^΀"q~C2 tϸ?}%>wy_֯SlGP^E#v5{ }%f%V_TЙ~gZ\a%9 [ wo{xYb#pjFHjՅH8II7Aԋօ$|Sbl /05q}QDBaaxW WЙhQN>ךglq ~*t odyvQ׀q[ eNyxTqE/XkBh)7@ڪp[M BK6%Fz*B{ G k~9誅qi(>>EO=]lhZSdCdɨxSdo;s1*}}균o#v~:z?tTx '`}-fVi{_q$AGmXia[ d=s5vodp?(qkyhXE$!"D-؁1ǩvKH|~_v¯őn"OMh; !#X,L=);u I{]E>~ ">SRc)l* uUa,.R`i& >pIS);yE(Qƴ3E5sϜf:7mϙL'utcxܰLϙNڜss:g:OB3-GYD&3H,A%R 8 .uLkjUk/z9'|fb6EՌ_rz[On',l80 ox"ʕOdĵ\X{`e,†Ӌbq7#s`k]|+6lϢWx8i0Ɲ+qo qjFE VZ*")/=1|٤8z!T}T:-̎o3ˉژ2t\] |M# KdJQ-zm;sWR<B;/+֦ mE(^X>C#?Rj̸bh5m5/s9ٸ,g!o* =toZZ>sR f Stg,=0n=2 BQ)av[AۍRm#Cڻ$':9/ Щqy3ήPA9Lg9#>,dq1րC8_]׺IJ( ^H@ 387}^8s> Dbr ՁJ9(VJb'~hŇX&%mK+zⱜE lGvn\ Mx\Xն8Jk!IuɈ8Z&Mtn#cP : a\߫ZK8JpTR}\=ԫ9?AHWN?̓`Q j`LJ!csY؈ơQ!yov~s4][&Ňt.ݸ\@͘.p;n "çE~ 7xqTS.$td[uix6c PL~<)?Q@wu8 Keq {i¢1X$F|g ^KOjrT&d֌Z|3#:eH@\?An|GңF"ObG?\"kэdaX{RA/8FuIMHa6 'f~T˃$!I$ɜ:sv&1 e dFrx(C=,i{T9Y}Zjf9:ٌ}5cWflk(k(Xb,dڣ[&3b9qRC =R8enVfE[3Rˇ8*wr`iWibJK; nv#Ow_+ ѓ}ճoҮ!]#q${ f Y=C%Oր4DLi+|: 5X;_$]Ύ/x?﹎ӶK8r1=(7ڮv?ʖԜ5xc.jy+}|R#Q'Io$eJ'z4 7$YY,1OOM#]y{t`< z:^" pyQj6Y=6D٥*Y)\m J_ Àl- åVr.ػ1n2#sYy{d9& qv(s,͙ bR dIuUҥ$@n&MτQ>,ɒJ1O =f3A "4:PQRoRE0|(જ4r]I0 =87:VsJԜ/]^c1'uk9y8{AܽkP6mҽ,deebin@.>h|-6ؙSS)1R8RJ tͲh}B/ϦU\29R>G9oՃbp}FUvp&gH8Gwta MC\TQ\ 5k)ݪ֯0pB{uxy>;Kit;xԛ&qXk ~.!ދ+У(("8)vRl:RhNU ɯt2QA)[12~'񰘤Y"*.ӵUV! qmi9gw/]q̡e[!9Ewh1!h 6F ;4OH9=Kjw7;TJ߆\EvDZ'7%+ƌ .q,a9çDtowslE-I7PU*m+f/6b)CW |pKh{?bd*{ى;f$Jk`[_TUơ4_S uaXdٲ7M/L,8 6Iin|a61I/N9i"7֖ 6*zr?ئbopA!ydtZY+L P7,(kt:ϯpmD }'dW) 5ͯ9tKY֥G;ak, ŗsi g{0:~+<9Nsl(J_9j2a&TԛBxb{ 2eBneWIGv8"A |2a*N淞L\@"p wW5mJ<Ɯ0!LJE6i6mt?[A^Dc9p2ڄ ㎇$ 6״Oޭlϡ)yi!n6 `h `ÔF?:PAa4dijv8ߊTm(*Y4.:i2y}1hT :Ԟ,Qxh8q6& .q֪CSxG|c=څ9b,RB0r2C?6t3)Jמ ؔ#2^ǜIL&V[i!Aj,\ϩ.fk4 n.7AU{k xZ Ӡڄ}AO 9 yɃ !n ᦧȓkHZ|0&C(ւQ0䷟;kE:c$XJC ;\;0"~K;0"~?[ M1g"s~}!hA_l.6s[Tu`ֈǖps> "n.x{Ak]dwpuLj,>7c)Ggi2 BpY+N01g+<l7LJ&Gx,OGۓ+1v',eQ{ vp|L;C mu ᙡ*-QHBl OrS*03X<ٺ`F#ORT9Riaτ$*il1Il1['`MVN6q%ҥ}-V,BՎ-=Lz V=[(-$KQX5ߖ:Yw7 /fN&6P*M6%[vbeæR3Crfe'QX؆A+Pry\Ojy+=6T[^2վ@i4 igڂOo>DOIN~x;Gm­$Ø>Ur:pJ=Lu[ڙ e5/HGw Z2+QUYpxVݩ1h;TcRKȱ'9i:4OT<^[}O46ʺw%Θ+Rk`+|HP?]nLM.Kq7`qqcs"p!:dk寺  CtCS\ns7pc70Co-wCd?7D9^ۗ:?I>>/^D@%_^9 ߫T-ΆoҦaney H+4*e@h />b"/޳qHO76xs+^QM]c81?!{g 7TăvЂ$7 ڕI\q#l޲U͜f,6n/};?b~XQ8O1I/Ѩ] $ܝ[TFoChyɴFQR>n'OK-C=|i\4iٟ',z[vh<t[|"kO{e2Jq2v4`gcq^W"AsU.ZvR{k;E,SF\CqoOD@C|.v]^`@aR7un iaܞIg|m !(Bu 54@<'QJl= A/ S!TY0T':Ou <;EhLa l g@MD%;ɰp< Bv5::gw'vR;;|>Kg9 -ř|fB]l]Lad֐Ka{1;E,C#d%h"gtrj Q=3WTg`TUJRFГT`8+Tlt2"jbQ5]:T?%z9,ZAjS\vSB# a'{>:B'ل[ڥ#m} q)G1> ]nRLcCrz;o)S)ObJӿ8m6<)9LM{݂@ e: 6VJu̾ (017Et\&TiЏlKUxsY3hramPÞ@\n[<٬bo]>grY/5n_fesWwm_Jb }ڞΜzF}bi㮚 <5w֓D=%uB:~z $g ;,vK ӹ$~+̆ϱQΣ3;ms0aI)'wĆJG/Ǐh,P6lԕ#cV8&I9&լ,fۊci&<&L?Iѱw}#mgYiǖdv*}K-M6.Wi'2;+Ќ]PԮOY|&"}i,ChrDe]\QlO{@a@ tPK,߅OO?~:CdGPv2F$D+0⏂1w"%h!2@5ʴ -)Z̨(,xC[#X]X8։8ɒ6%/g%z5˵x?'V[egx.ʍ^uf8q2 WBv8}7?qkR.ne|NR|ZeѧF`ws~x,~ynǦ,,"߉@~.ujМ$ѻN;^{f;9G.`d'5Tu(ɼyp??IboA8|j{Q9Wc~C~ph YTN~1ݱ ڮ-緫/E}xVr\$n Qfr^*Z-QޕF5?LlRr/?F7+e: DKx J,y|K2|~+ |JF+‚|vr)w(Ip^F]{Ɩz^j_Ii9M'-k܍nxjv={r7yE?l7@dWAFxpVt%rz>>78|6*{xJmC߱vHA4 Q!4ooϲc9/V* L!y-:Z|(CهtģtA{pޖejkƴ YTmB=yn^S}b]9%P-Cj1P *Rn)1t}3%UxZGopF-ET>?&>gM/UhcesZ4ыF ޯD20jz1$/< |b$| j>GrIO+Y~o~>K|.EC`T (iW!h'+s,5XNW,o7b%_3(C]SfhܜZ ~z~^`يg[9~Lxu[Lݜ@.!'94E6 wk>+.}^B C8r}rDbAʥ',s"40@|*mrcԐJTdtBIRSzjDWiJc VIS.K&f0ȥml dUtkl)vD"Vj&N* V YعrW*l  T@w D&L'&2* !gA真X jzEz3޹Zϗ7Y}cREW0e5U@ȅ/P }2)t1IXMCOzwϓN">C졊\ò*عBSᕃ,Y~ɓJUl[8,QhCn'3{3?$RzF: DJҳI35==FnJ`8sV [6c{C]ZS}LكR'6>_GV%jv)Vvh3(tT1ݴ ~QiP!3EaŇ~n h v7w?43yooׯxT`r7*!^м6T/K.MKn4(wG CjɌՄZ3} X)װbJz/5O[or_e ; 깺Fj6"P|p%V~ЃdDjl_X?iZOwf|t%Sa+₋~`GMX}D`"jINO??Wl==+i|vEVY!OʉSDDϣ_t ֕;=Q+uPdM&wda!Oԕn&Y&gqaK㦂 n7n: ؁Kw.3ҝZTIt<)w |PSvcf./7۝`B* O<8d8Pyٗhģ m+F ek65x'tmP1M m50..^ mӻN]y\fRD/)p Z㌟%xpt?1:kdp`V~#m UaU#Ҽ ;'=}~[`4+#5.YL>GS{ (bEu& aAm|+2 -z ; f k'MlSHsܹb @ID؅pKXQ/H_Hx#!}Ő,H/J߲CQTQd|Ϸ<Ab3W+^Lw#ސNazO(5s6(PO? ]w4gȶ)'_W"RD=xGGL_&U O"2Z~dTƸZG ZCG_]Q2MBo#ҷń\xIP%7v`έF =r}B}_h-JF}dBJ(71r=I]sxG{DFbSm# d:>x u1Jܓma %yjSklP[Ʃ'S8^0P][!![K"<\Ot{=zo<}HNN*8|NLѣJ*UJ#gUm;6)1BଛӚ"E!7[a٤:.9>pM4Wt9'rS9=Nc.Lی[7Hjʑ#31awp #NDbp ߹پb//+J`. `9Hf#jG*JMEA:9EnZғq1~w\A Bmn }XFNv1;1!sDo~ dYil鹖҆&i˩9i/UH)> /J"s5`玾ғ .bBHՀWVbעRw';L|JیsJ6G|P݈(g='b߃p$π𮩡#.[w\+QJ~˙Cyݰ~-":C!Ŧd!d h2q&b;dyҘ.Ëy"y 'm"ԀB^oS֏Rֳ #0A0}Rqvh;B~!Kx(,3\.shQpw[ :TM2OÏ}7q?or/G|n}NkIn)L]gnuar+ lf{ɉh2GgAy:FF @n_w@x 7XO}ICaC&OrAh^j;||cDb`/b0!.13(h0rV=xπ6r-qgt$\7=v!n/(BhK܎mEGYt/ p 㦎l1Zn.VF1gh|VNq@UBZ/5֮1׸.ža5/xqO($AZWyFi u }V~48^\7<}+3%W<{`H'|qѝلIfRuwZoPvudGԿff^Q-d&puU4qv?uzMcё㱛o元:7/D7{ l͞U=hx%ZO8ߞŧcدT =ZVL9:]{bP1),Y=mDW_Dx-f NK;DjA}M%c0oO xdTlWtvXaZ93.K*G,bv5Z8,vP{^,U9fDߺ NaZSlfb`$qk~U N|4̏E)&K9rNe< }r%D"ڛ1=\hf}fַlf[Ph&Od43zwf@9jGLT \)khP?qP}r%ۭ0><%Tsn´fVCn!s'dH!ywgך[۩ꬻ[+ljn`+/ޖ%귈V$-qXXE.ü'[L5P 7ll/ MSX`'V&I8sRdxn,9 i;RKOsEw]E {9k4Ðؖr_( VXWܑ7R] ` rpp-+~j.]ѥRAO.A ۓJ٦mt$zFiHj(֚];K!Zi; D`+,"!ELQIboAD>-fTOQrnT(]"7Nb1[ <33I ? _%+7%' J8Dy%xNrT肺04pvkܳ0r0jr"Dҍ{`SnBC\1U ?;wlL D{j 4@[FWF9NƘ9J!;b/^. }h_a4د߁cf' F׸S4Tg?d_lŀBjyBjVkb Gq}@*X[rw QH&ǗzytDuӫ'tq-hi*W/W?}PGGQ@wu'|Y#Ep a7 M#R?^7audG +9m}!P^G<J5ϱ+˫V3kN*:~jfwM swq =۽-3)żV1I7~GH1˴hH$  RR u5DCezҤ#VqC?,_VVM$v9WwqyOq9?/CGr WAhtL(UM@h)wWxl=g7}у*=0'RM2kTXkP!>gXȿ =?wg*n8Iqѱ$߄1)ၚ>`/QlJ" _n߯ kSƪX`omל.$N.  4q5: nO)W㢪pe4у#vPq結bg}w}==fH& ۯ M쿯iпu-6Dy_7[Ux¼_yF fVuQwVhq-rwn2VG ,ndxpjaFGQ|qoph#û&.NA)ۓ_Ժ=u;jqCɒ< _"?M^բy1"$fװ2Yd; <H: _bK֔S˘rNa;9.8(%=diם?Yzg˫VyٹQUEr9r,չsr\;Yj5YjMak:o!qqxlH&tO&_)WaJ.Ɗaږڊz/3C]J/{-wZ^ʣnxZJL{V/y'zkmd(ƿ@{/{Oe\6TX-r,zנN-_bqCVV*%ef kbvYzv$kuk= ]!v֍Uj6:x. ] HΆ s梳lF|.YeGEΡ'Ν. qo3kHmsS˶^UsrjTN/{So9rǟOL?rZeN|~jlfN:vCnYcV򑮢ōo56ޗ2cLUn5أ}mƖz_=D33+6vklŭZ\+2+\ó5pq`)6>ML۩FM(SQعw;N,]:oR;ILv[; kGQD. 8z-'73!͝^GU+-cSIdkI(Sj!Ʃ*"K93s6drR4"A$bE3I61B}XQ+:*>H}6X鉨$a$byh 0@|_=nV72p "Edv g(à](̆(7 te 1G$E pe4 1lDf J '0ge q>/o&I:<,F@xXEY0b-l06/`,0D#&L"ȦTbF hb7gh jh{Zf"E4Zc6u=8r,?DƳk{g0W#{:r 1&04;ӵ `X'RR"c ?6=DO -wz~|˪WA'i`ONyVWpFPYM28s1wd~-&S` )d[5' C^d~aZ[/=& k Z4xZD Yhf$%O@I䞍F!z UbYiu3XEDݶTuTߙ}$=rF@;~YdZ,C˱Rw$A'E զTxmn 쬇MB" D6&3:;.t^wAv4wyɯsX e-(@a>-̒ˁC6bղ~Bh>ڦUX;!:Ɏ,ivQ v>uۆ&pT j :=Pؗ|%`JfU_ =hAsI:  =3^K5_a>S؆-tr_6%2)#q7V3* Av=%tSQl` \O ]LA'~5쌮mc2j5R6ڽ]UM6bmP wrB-_ RC&.-D$"g l渡ȮbȠ\:>##f_PТB.Yy[ѥ"1Ma=O*o(U]54'a;/b5ɩcv/0F!XӦ'H0m"OHFKr"PU:A !!HzhG)A!O.|"Ƕ$O5#9 -1|_y1$FQYՔsPNM(f5@DbH@euOfJ0DxW]AԬOllL ڧ뺎jHQ_>.4௜FW1˚~GY~2mr&'˒-ITi^oŴ$7,,ǾIլۙ-=[V& ?8 /gL96鄲ЙWq9=:}&G6zjގ΄$^?cZ'ļbl,Blڿ J^8}dbDCGс֒ReyҚf,\?6e)a Rh_*q\Z7>-TZiyuƸ7t&Xz_?;'3xae2?×?gug). ]Yl[4xxzi|tsm/@]*I\z*U|*3jw"`{GKq3S, x3LWd4{}fl<vo @~5rꌝL9x?@U̬4o %ag0M\CCW &|pWV9j+]CrZ`eףDq84鬰k&BWO+ʏFt1Nmnwյư/UX'3"xl]dLƵij0.gsF5.٬50YF.[5 \ʗ ˙xlpeo[4.T]E㏳ɿĕ?cuJA>&M.2gH1~ o [u3?to h#3w'Yr-\Wj=Dt3DK0FΫxJN'%E (-K]n]tt12<6~J,70&Obd5\+OgoSSW1~Mm$IWtHZsD , -$V=QjaHP++P3b[OrtҼ vMFʚ1jTNshj3]yh y-%c B]Q }U3եMۍ`#T(iw5\Be:oH:=zp&pO6{eg;L7CzNes.K@Kk-<څ_&mk)lŁS4sQS oP]ѐC5]BV~,q@HBG/tGD$(6|lno߯{ c\.{\ow?gM,r@b;M[UjJ{˻Ӵ=W&A^:6L/|6 c+u6vOq:B5{ݧSqstXi9mt5{#P@dXTW@LsP[`rQf6} <-ޕymq|ivM0I; }vɉ;_.9QX7`R-j3<{LT<6H04VL؟| e'38KRb,>g;l#TU w_V0x49Dԭ1ĥO̓xhSTͤkf-8{aųC̒'_&u$*0\btPOl%C6trpSX{׿đS+X?M{* ?QmY5D VIMfXBvU`g tk9H.EBZh!3b!oC.:l(G#8G1|NX~8Ϧl} GڧCxҴS0Bԧj_wwpO{Iɂ{9$)"1߱0[WQf ,;ĨʡJ}:O6rFPkQI}BQ'j9`nhc̓Qh,̺QޞYQu`H)tӔ=ن([BWT8MנGhtW;ɡyέ;Kuhp(~//~:RN+|qld{^2rdDbmҤ8ӈ2,DzNH$~x)&,M $`ipUŢ*gKI>΅M=(᱔ ܖAh5Vae| K/05\aFxP~hXīuQ<w\ av0d|"Jsnpe~^;4$f+>%Obz2!a‰yg``mO6\_p!9L3b:U Eaj e ӸRE2t 8w 3@lsv_w;cwk6.|lMf6kn^s:rbi:R u )ta!L n#}rfCrٝHprra73\EgଽߥSwwʫLɇMH' `)r:F&dɭi|ywtc6˲.'+|E( / y6 3íz=GK̠Дw~w;g5ne S11'M`'X^@; nrb/8IۯI$`j{OvΨ]84{t~4q;[056?@R'}#QVb;k(xx_pb,+Wv|98W'@m>NO}I0y$j چ~[^i+ BR*El?x6᱉R4| 񶌡@ݾb[vo>gYc H18J3el'1 wj}C}w^nSUHt0Zkv׬.|N{M''0=}BK+KFf_?O# ZefNFۖvـohCdXa<?Բ䑈4D%w;xw ^&m.T@  >A\L~ŏR>Sts)](+" Ӆ'ި`+@;E~é?{pȳgG\ nK=E=iF-rr]A߲{FC{~C{NC{j22I=aKﮕU0yZAObz)lG%Y:E:*x7iF7GbژQGEREױ2vnZ=:[s"O gD(PHNC\6ߒz@,hU92M`=#ѓzAm$7p%fI^Գ#?:3ie:5HpV2KOyհR~bDAL`̮X7/[To8] /> [,.eFX^Dֱfs.#=&0*K@T/xy^o;X34rʺB4dpٹ+N9 z$Nql%қL\2(`'ICD\I{r%Lϻ44˜eǍBb6هlju_ښMcjWm`xZ34u2MEMj Xv^]4Y|q͹q )Ļ4 `]Q}e*B Yo()HBE,`DKCJdɔ̬"6{N0#LDݤDRVVaO$DV׼±8ysAPMy!0$ŕx".5o9qr&02qE N\D6%e= _w qz"8ĝvur 3ա~ rJj>IKEhZND݀4~Rpj1Y{!R0\ FNi^& d'tbO.@~<\{V[/\/ȄF< uKo!;XG̴ ubQ| KVl~UO} !W͟9?NHpk/WW"HdrubGÉ/Q[TȢc %ZAo Bl|&Cvf_BLMmuwG?X0KqM(gmS^bt^"NHeLq; efmbLzԨ4oucP|W!b~ȿڭYP;(EoxE8:mM6frz>_J_5_^ܚshlk81BY\҈w?iTkQCm5ᨒ{谨4p!5рi@ѿ |;k߅ A>Qԃ5eՀܩ^IM1xzbaN<Xm/~77Z2uWq7!ɏrcPC?=D~ CөcG*;!Zsutӟ!EH)[,FdeΤWD4\&1D%zi)BOo'pSGNBo?Լh4ݠw>ڟ!p_~dЦ%>\8Mr:K6m;?``߃F݉WwqMy\e*lotvq}#Ԫ&$CP-waK ʹ0@v,c-)؁!|J5O$~ &d04'pg  J\Թ ޙB ԉcF5 ppp_^Co=maZVٳ->y/^N6Gʸᢇ5ԕy{4_p wt[g7n@c@l8dc`^(-{r>e!`\dќUM#YH/LXx{j@MeS{y2YSI#}N&*uxlu8}MZN9Y2f3?6#vPo>Q`[`jҒ#a0X8IkjN)N<I~߯HX2:6t_Eq7q=(qELh8`TS|H??h&Ǧi6@!ug78X%wH? hg s,)0=FX]((̨ufq^Xy X}XQUNpOݖA_go7&AXD%t$>k7 { ]/'REjhPnEY{>! E['!f ܎/ M'R?.5}M,N1 +jpugRjQoc&c$Htkљ.2N(16tWђp4pA(ᲩhY({!\M' ή8N/F24!bUk1srD0"\PNRĽ_VV}EpD]w*i+5]`z_Gq=O׀_&9UBYNSZ\ATg\ gD idib." Eދ @SMX&^q2q˦0#uJf"56: ,R#02.>!+'uy%.vxˌG2𼓾v^ `] YqB>b E ٍ%u&\C@ֵŨ%iW00hD 2 u7>1wR |_=-s2]SryvuSR#A~mp<1 O,O:'aD51˟D Ni,{˧$; R֝$@&ERziIc3PC[uS'ߞbc!IVZWAzs@JxZiO7 %D(XykU$qZ4hpJw5B^zQ-=?&ZW#(jiYߑ^p ,̀fX-o=Rl 0{ְ\ M {*7(4ER=S*>`'~P-2ݷQwsҰ,kE|WG_)JB z>n'q_AXfxU[1$)iaXUI/tVc4!ƈ /h͒*05\w$1tQ;huPsYSR*YwEsX@O%LYw|H# G浪G!,B`䅙K!F), + FۿSS`[BMF $ώ`I)]A?!H"Z\Wg>o(II}XղQ \ga3-]:, `9BvV*$ZPrޓ)0X! lX WWUw/jտR`!ob^͌0Bjpq4ovU}B{VhKdm:a:p.۸XL_-d!ꌻ-,2tbjg*dl0vo{ȩ|߶ ȮNby|d-.'!X:2 p l:դs!CL ]zRնO~bxn6]T4y]䖇f{,bwG,l02<A8z9`O0Ox4@{ Jrʏ[OL>v qɦ@H%Ho?miz]JHJ -3ZO.Cre(?\r hVe6 lp%Xޚr/}1?J9'#qGZL`kdxײUy5qC3) Kv=ycP[O6X+~ږ-gEtd\Ŏ7iz ؘXd\#ő}=]ZVj K /3(OЭw=(JiRIJ>Y'=D6PCzMUjx:;7r`&wUk )\H~w1k˨; Q7Ѕޙꇎ[PNaxhҲjÎ~husEG un`+fFΐ񿛬c鮊} d;O@G?t/Mطw1@C?[Vz݇U:˜9~Psont~hdyr=n4@0Z4𧷤bj5Hx$x$x$)I׀㗦FNe\ d֒6lyV$gauUG9i3&}5eBa3YDYZQG*QZc( z"|rX"F_$5_hL۲SC 'J.TY6.]KDC+A|a.zȜ[iHP[ebBWn.L|wۚrsƿyNPݻ?W:/c'[5^?)zQVxfwƷO[{!,y@z$J,F R{93!Ĕ¼r9e yHtM|>]\g>\[N6}D~4ʹ=3Y[˳npkؖ\?GbvH;02IC2ièZu C){*f$ec'[&;_A)[^ x1cR9{/ [3`w3K/Re~1fcܵ3P]@:ȁ|S )/@ig fW[o_ԵT^OZUC9=լVb@'ԠqziV+rQ`%F ,e.:uIms'Qj;) \騂u7dܟ*b7IԿ/-H(6Pȃzr%[F,(cqfOZ]Bۅpp 9Dc7Ttvx*՜GSV(vׁq)/k?{-\<5.iUϚe}w\r9[kY'x%2+>^MTyP^:އsBK.`ܦ/DmН}9vqHckEAKt=rװɏh Ӑj [[f?%MV4fUfb)RbJUfo,w%FiyȖKb/ޟpWu]icP ^`6(ݹXpSfM+:H%N3;SNu7dQ`({= LN 譥:TDMla[ɿ ]Q sFK:՞-S~%2ᩖi:M=R2(4d*8cJ0Xlg|`UT9mmD:}5$mSG+JKt{S%;l+DT4L9#e7Tٸ%cuϢI<e SM{ɚ^y$(%#2^eȁ1)(|~C(jv=Uwjox;¿']|GxǐW:4Rܟ/UƜM7j;!DA3֜=X 4<6J"ﴒhOdz7IoFsYqW7W;?͊_l\ur|e=v7qͽq}q;oOgw9fsyH3nzg}{Kbuq*s/ʞT_. Ws3ץT+rin,T_QdIݳp! 㐳7dedO'Pw̠|]1q)ve͚ۈo.؍Ytݕ'CftxʙӮ/+/ LeRM]WN7ObdDjĉޣy{M>, P;2Qq&u~t 3 N^"Ux8#EFx37N i=b ,N}piݦqNrBe(h_GB>@S~ Ѥw-Lj7$$m6+.  o5چv7_8pɋ=]v7ﮅVK-+x·\ŤӭUY?kYILb&͕y5.|^{Z??y /wN$71Sj{ttt8%W>E,ά12aH-֘4m:b2[ypQ:;LwS CܴWVҧuMէiPp@XYٵTd!fJK*0 oM]&ݨdgwkf zXd^c3'!/|EdXP.SvJL'.1{ػ<^,}> V9GןH-]8p x87]_w@r+kT>HJN)4#7 }S)3 T4c7ej-iE6:? 89M3E cU0oW!cBN1'ķG\q~Pj_|2^&T`ѻevN?$y_G1y?,]],>b<kp3 ^6h-AV5C'YÝDaN%d~_+?/n=냮7B{~~% zf\ķ>nm.j&Ckh?@Z! m+o逿y[YB;U_{x;.eiܓSI8|rtϟ}ϾO'T劊{AvYǢ2F_/7: OH%6;h2^3\cq%f]՛cHьSƛE/u222 ;?PfA 1 N\\QШɲJykwrdɝK;-]< h޵sob9;2^FR! hx\.<9NWm;8PjzeS]}gxs;R>b\Vi@%.)4C츍1w:%ӎ%BzsFX׍]=1\Ѻ.@ј%3is5f.R,jjv-}1m!p  b~Ayخ<;~TY`Ht$|S;Dld/~+yUX12VW;d'#H]lO.~0Aԍkn]I2[8Y τh  xʁ"ˣD虌AX8[e$&jIG ZgfuČ:ym!n?'6q3}1^ץF~ej9y?0QKt?Ev?Ǣ?A{t4t/ET㮃:^!#8N86JvSio/:v! ,:dKԫ_UaKEv;CUآ3l٫mR z[ Ev@PM"vq@2v^}\B{Gbw-@*w^sE#!Owi^);be𚬂pH5h d"BV@B#C2wm#GxJH^#`.-B퍆]I~H]pƌ0>V@z n7 Ha^) HkxL9/$TĈKKCpBjgr(Iy $ $wMqQoqE2w``"g//ᓣV'Bߵr_2Tow Vaצ-|M傥ǕO;QLӏ*h.w]a4J7xWYgPcc$zPm0yӳErX4gTL,)n(?RCl.!>ػ  T#^WB.8,īk}.hjZUm]'Q5ukUve GBW-_IWŲag-mKx̓3>kʉTu-,W,ގY#3"3$tןXK~ h/=zT {,|KhR`W};m?{yXTNc?W0oZkpWWnx|}x#o7HP_r`_L_،7\l_'ſ:;_k؋{ißbP7fvD )%c0(2`Ԛ12Lm5/H%SC jmЇU6|$G+7"%4*Ko4o ,-=D[_Cv%-\wlF)i$0c%R_<*k]+v$R8P>yw}YKJrKV-ʟI ј0`z߱eӒUbӒ%|Fw/ĸ1n2:QŢ)Rwc7u5R+=#Xۋ]-z4 mI?P?_>tڳg^g/=\p2xlg;;:9az^   JBAcTaӌ?o=FUZ fÊԀ#hM/ @}҃a@-3O&veH޸BvHg)F$m1fvAh</'Z+h|Bptl?P$f,fQX1lUCUll+YZ6@7A =]@ 1?"Gte/.Z3Ɗ &\Qpd_½YC6rV\xDIi]͕̋v4@юkb>spyvp59|Nf|rr>I Gg@5(A"K wfA˨?&P R:wX2lSD4o]g1yѨԉ.֒ o嶧Q,x`eH]ijP/dPGW 2Jd.A?hݱqN9%5%BBƗnrdipE[9ޅCJn %0la|[QL  A^Xkbac'MRV5Î(uď&u iQj]~򷇘'%;";w((3Xzu.ATLm)NL 5PdlUq4{Kpu$D<4ɑkAO.0e f(j*;M=8F&8'g[$9'._`1=BWvH?Kl:3k Ja¾J92{J#jmj@Л+;A]qeG00X2ΡŕSb2dtI`0 cj\K; 3 ‹_^̵Y"H,]P7ő۵;p fC} zO!aM_$B"JD&'cDEz8QL%I[1pA0Jk U4fZf]?c>1'6@`qYCI24S))P3%Kwa?g_G!}@ eY I@ͬ,.V{!ݵB-MWnGy^ipU$$YJBcHJ @F*p)ҰR>c-sԧ1)Fm5JK5/&`P |rk{&3  D:qf ^U6++|xk17:N װwqҀ턧fMaWl|=?Rsq1`YKxeokUszaDKS$"J*-fINǝjZekkK/Hn˞y@ĆE}qF{gOeXf,V]4J@.p2"Y٣%SDUb\űZR$0k5ue:yi,iYv1 BJ?+*%ZS1c߾Qp\dxAJv&BIM(\ '%Ѭ^KD!}?qD@c6t@j%o1.gTX0Fq.]*M҇TI*SxNJQm`hN!錘N}5Sk%$+-A5lINЧmҰq̪A .(x' 8ZoQ%JiI]Ҳ{ jBv:l`vZ3*OڢW%vQz- IU˂ed8F)PR mFc/+c$>+6:6Dc,p'ݾVuxӕXrS݆!c;Xh7u766 25"'7^Hrm$,sOa?8I,,EpWfixZL0 z~w x9$Q,bfˏx[Oϼ'ūٍxKE2yӅǘǘǘh~[}I?Pu@\jk/!s|CgtFV\Q_e 3^и{ćoɳN_pBI_t8j( /ir{FlNkD<)9])؛&fUTo/I..n:զ|˭Sݍ0 F|{&ePJ'q޺# `hF j IVڷZ=̴ŭg\fӳIi6;EOove5˳ :&vW&4`.\=r$ds4SqZcR_k&LCOj|(W,&/&/y[1mW_O,oQSCܼ-ě(7K c^=KT2oU%wZ ?KsGU*Q ~3vu\4(s"EM8" M^b1`51Q;}'᜜DDU<2a Ǥܺ觜:Y 㟡B1b.(b*N {e;4;2LG]34ڂW ߝ/U4"`<_BrEQ;C bci,^*E NQ ($W1^b1MggY\0@rxa9%s'O]k BQ1a>wPyYTu1?k]-p &IjW$'߷ҝ)EmuJP$}CXLTUVV&2Y»wnz [c1XJpRUnyAl b`lIQd ukLϪ!$;QT@Hfcxt~#[_EUSsv$ʎ7gvC|"<GH7RUznDQE?暋>^lwY>&&}Rqlg}FɼdmC3] OpWR0jeI"?#D塬VI3f#K Ǔx=m~?^(P[@^+?,u_^-+ڍh#$?4kMphsI䌨۶v2! .)[`ׅ\њkMe!b;j'T̥ytXir鋊G}A@ǔ?TUNPe9YBb$/}O@!^OwqO'TI;v_r,;^v!S?ڐmHt_08YvZ<{̺ٙR_2;A =H(R L+g1&7D5A@ԥl0Wae~&ېH#d+n4&FdII.iF۪4P5,tb<.F[P{vtսS#%BBm@̦-ʹic P̱ǍGoo㩗;[#g{7-p?6Ȇ;SR ^&K(^A`WR /YQ-SEaY2.liTK!{ǘC&&#dH30Hd Le8W?䆙tti޺XL"K.D?T9 bӃLIkS,.<.WvlpvՏuI#r3M*~D`{"8?}p4,A(P$jP 7~LSÿ( */W%2cH-3"Wv'ds}rN|،I B񦚙5ZnpzOIGV{IĐ6ܜn q*ozukD,4jɫ%Ϻ{%ISxOk9ةz}h+^a>vm%԰<~0ʯTes7xOԃ92^7*ʽ.P81q@,d45(0"7dA7DŽ]Ie&$Oͧ !2eR=$rx70V@e49 w>J+^';)Nϙт'Sɲk,j"$Ep\LIDoˊMIĥgAW UtIQOZ S5FZQlM_%#0j2ʬ|,/>uBj-3>ZFmq8 //uFD/K&+`B .:r,(|D,*͋TѴq% +ߌ)o}pTE!*C̾hu@zmٚ\":>k1,\DbZJ/\r O5ű(AҀł%f֢+^֤S"Nu UCX-$2@M6Bde|lv1c߸@'8\e,Kl%y6fWW Hֶ T>䈆igŌ:֠(Y\[E r/k;zצK@)@KJ{.4'[x7Odv; λ׀H&qh5.;b)X Ml<ÃaYpl%q/T(nb8E GR]VN`z.(캹؆"a\+< $^){J!; f#`Aa C,?ܓR [L̻k l;j.cmc)0RaBv]2P=ϱ;1⿋|DFQwc|)t!cm6Q5yq`}}?y^?}F}n{d2,4 < Nn1:W &BsfCrfqB4H o>4GcT ObޜA9y56س3jr3vчVzOR`N8 k6h -y+vfr5ǀ X`;/c=*|r]b]mjЖU rbf;V2cTvQ\Ytёw" tQ_~{lGt1CfVrlw)@%-IzCp(/y.,WX@[x j.e|  ]x߆awwRbGB_Vu:vQo-tWőz0rnlgNw'_|_k)a0 7mP?AJ~BFy+|LG$wCϾݰ.#-7i#RuVUq?el5`d֗qT^f}s< \QAKAa҈28 ::EU/L#[8vЌ%Vgې]Y(/D3FiH^-jɵQ(МdNsPĹֺ;"^M/H-V[3&d$j]]ҘG6\'/*BcޫK|ؠ.{dG*R }1b );> AB-ފ-*+]'S Oj`|ny[4nbդ4^F*R䌀Tt} '3< ~(62sШgC.&vѯDVіlV4tIhAkf6H & %`ivY8`py\a!z)]Rj#6cPya)wV@רRۆ4u^''3eA`u=W_Eiq*7 AWxI)k_ٳ\<6X2S\{JUC~U,& "],wBr$?j5Ʈr^QlL R)4/xԓճx2|O 4)q0׌xir3;A1_^[:&i3^1BfǼփCmz ǂ9*&kh(VAo! ޳zya Yѽ*06\ѯV+1^?y|tDLTZE\xy?Q$2/c.Iu Uj;61Jg~ž`YAlDl`lMX l:~{]ƳiƯ29Cgk#$*dvA*:]T6Ƭ#*JX;=vћWIotlp!gW,Y; J4iNT#s85Nb \ʨz܏,z8RXVhcyUO 6[;`ef9y_V|;?+c'w3(! |qFv+Ks< T!?5Źe\-3S[ Y^Nzv8ye]U+w yov6>Sqɖ}[#-loQD 7:U9|KrŹ ςY}]AV.~a)%See%U\`&zjOr v4Fj\ QhE[DcyJr4P;bӭUXtO|IXz2tV',ߍk`hazTR ;ЅV+gw[bSeSMl-f;sǮFhWf1d%~,c I.WH[yC0oHd<a@0fVcU$9"1F|vG~?ejp5jeoʛoܬ&,D~&]Eϋ J,k,YWX~+DFH x©[)[wiqDk'Cn?\Rcx6W-wv9S[NNTaJO{?=qs)G|{J'P%^p*:[’sU3P\ddIS}ޒ˄Rb !d%aN&edd*zqWaA9L*uffKd,s-C.pv~5$yC擉vGL`1"}HOp7ͽE;o:$w>| z8L1?t9ūl<ξUlxv?}^h2EoȬ{l-9X /I/Cd=xݜ;}F/px$7R)rp=(Ⴃ Y=tmЕp/PxӇ]` tr9p*cEwJ??Ɉ,7gÐJq#nxiLxB9:/{}¿F&3Vw-Q8BWgh܅3oCP$IJ!06L7(W *~^Rl$LrbΈ.F7}$Ȃ3?a6|'ee%#ح-b)$]'_-sdŏ<$Ɍ,MI;0t˓# )Ik7r1r5gD2U& ͳBSL3: H1>Q?tg}3Aہ'}hq^|~$sdݒPO Xgۗ]DR)Hc\ә̅Q y*( G뢊h<7# 3;3&ğB16Sd$oE4tb`\(4g2΅eߊ>Yk눻(ځ9y JnLI7%A! 6rx>/p("~ؼJ+DMo45Be "egcJ[7wqLC̟> -AͲYڎ7˷u'ן%У*lM!pj#@;TS)⋘M[Hb>Y^WT$Eq}Zw߬o!b9w޹;w M!!śbK]vT!n-r UN-J5/M Ȕ߁LAœيhC$mB֮E"4mT.F]\cm\DMOdQRw혔snLsB˱7)7hkO[s.Km;̈́I}K9A̻J'zYBJѿ"(`-5EUW(T#esҤiҲ4'^QE{yWʶwhwlqCb^7hӧӈ> a2>e%?}L> GD,b ܾ/R}TH؝2ozK<0qGbK5 Dؤc-~G# ;{K^JBl7,̉ra"m~/#Oɱ,`'NN.B'(vNmj-wbdjj3iە T4V=Ut[l۬[Nw J;8. jluBŞl-ƭ%rw6C)xǜ1xm$CzS5A@]pX#朥p.|SL{Pp[_h޻V*K&>ݱpRϑWȫ?XhI͢uG|䉴CgvK;BzJ) 9N:6Gh4 :g<'mye#^X^sݟw5ڒJ;vr8]gVͭw*`F'Ѧ(=-E5g8˘p8dײskm.x AӦY۔ N&uF :UcmRKL3GZāhT3m^r<1J#mx;0f]~u(BYT_lsg-u1u&E $S{t'_<}+p֏T4l/ySL ]{l{l"6a-v21jssE(+*H;L?"2X:a!pvKy0.% n6 x-Sp1rnoŮiU_6`qC}rrs .Zi|uSl!~&\| Bnd>JR]]c)$K<:)nW]{ sl̀z7!-|ݲJ 9l N+j^8FK=:}Ǘ{hggOO_u(z۲Nu8z!dxãأأ(`1BLf8OCUߜePFo8@!*i>\#?{Mz5tC/͜)0Z\Ӌ6A 2zsFj"!)h0L旊Jd}H qdXͪ$P&qZEb ߈87WHAkCBm+k "IatVńakq3Ux4,\'% Cؤ"F027{XkS!ϳ 3O3v` ȚaL^)`4Ii{q@Y8:vu$;P;xpB%=(:oXnaھ9= (FJ+xz99:D ` E`N@ q ]هFpn/$; w.tҾOF|(gXM[LT&?0Y J1;lCѴlWetX4yT2cHQHg}M7љ=Nin0?B. FC4U'"Q?'VQ&}j@`8q@@iel!pjv)+fB{6g&IEq&i*Rړ"v<:fS25$FtRn:5% v؉d?9rr]MX0B˻8l Aښ/ uu:-mSa޳טEhz3$ϞY={jx3B "]!{Н_W>-OʳgeԔ!)RC}}QO6|v50NcyVsJCJ 9314l1af/g\?.`NvOY=tADg|ðؠی@Ǥޕ:*t;Z1ơN!6{RYld!<-!L9# 5H?az )NH)Q0;is-er,iX#@P< 1rUOj:>_ [Q/i+ |;SYUt-'zklv9gBs,p/5܄'п@E/D`|ػ3\%ۗED!n8X%XOe< .-@(wvMlԔ"ԁVo xzJ.7K`NMRӽb`Yt~_Z{Zr\:Ku|@FW5:}z^tt˝wjeEzjNEwOޕ|I:'g]LEX뽣5LGc+m{mwׁήБ•Np;A }%]_8l5EEY팰[SlUpbc5%@s}L:Y[kL{N(ҭggO>X<eoMɥ Z9u;] />  F"683}"OP*_m ڠ4r, ? g=A1nb6$_zUt8nw"=%m@yKt>{IKN gb ƩtF3B$<^:|@+~6ZR7-aQ9.@jQC/W0&1@JqjלmOcsg협]XT/NW6c%Q`Jl~FSR9t1JA - Eae8Ti량[o>'eL8q.Mma cH<]I/ď" OPiq=U?P\)mL)Ts oSbZvNbެiŤmShps~9(W}?,E40KdI@D—VZ$s](X.ۤeff9# D ğ(t͟jS"z&jruUQJR 2`ţ@v"QO$|UN\Pn(# " r@ѡ׸t2 @,8ssOx g3(*Dō),{٘g`X{Mq,+jp/RdjU27'_OU%ao.x-E/{1yr&P#Q`0? ud8 n8:خڗENFL"Ɯ,ZAI8cO;|1l g$bnV1217"],(]uSBc,B[kzrwi:`: 8M23meɥ}gWI&SŪ0X}Ij9Q?R;(L^.K/Ev>",ˇ^bZ2($|$-T\G_W *EPVzJGqH#,ɭl!okapg13,]yG'{Xg %HEB-aiʈGaQ{C`8s7,8oy吓eW2g "+'K!4uZ燑"JLw^g& QNv򁴬Q/Ù=ﴚjjj5֫"r"y-@UY$"!<9K%\@?CNiRt0tp8F ̲L7ҐmuvAف/pS:k4ޯɖH$Q*%BJ+[#`"< Ѩ*W`4R:x9&5l p(C0"L=g+6bDV fm R'hOP4'D[?F7 ߈bM248\322JdDfKi+&v `)X%tr>s'aLb$o*G^08bc+Lp|9v0?^Q99 A noݲH {6LKG7XGQY 3xn&I^2o{"/@;xq9ym6s,^vNNxbg?9πcdG@f2ؤq|;Y3t4S1 # ۨS5FCHgu$@0>{݌e{ -"LJ‰K1 rr]lvG^n99'O^}w҃xItc=LuT́`Z20lh+zA0҇⧳59!Dg5>wEc~_BIw؀4ݲ~Ϣ<ܧxi*|cŒ=@K!(;9öür2Uv0jX}YR zBP> JN БduPGLb1JA#v͸f֬#U5{k%DQv\{`g G=?<|){bnRdy0kKa0ex?q)$I s*zN_sA{ٜ,pn BkĘQ+/GOp@])XdL(+3`(PѽZVn{ţBÎK[%_)\)5~ hN'Jx^;̵X$@rO={eZ|r[Dl*3Wt5EIº nz$9נVU[hWvސn ,oxBae`bk~RThn(=JnWoݢ&DP;t`kJA|F]jѥwvZ>y[%U /95z ď:$c]a[ʣFi%/;Y-/ 5+9P9E.  )Dqo}+O@:T#LBLlI$:HzlAeLaxO]sꠛ|3tg"G;z\ċ-ʓt~^.PU~K2-`P.`phVx '\b-'㉴DC9֓pT6BHz,~ :d40e`%5t%pGsx\>#H υh&?PMD=Nͦ7 Ri:#4%@"|TRG`}.ÜM76ݪxRԠSǖ=muW/_ h~mA}Q]q}x"cbmOjmSI<9+3\]mkϤ $fqg]-Wޭ|ܮ6RHٕ銮{(cEEn H DK9Cmi/Bna$B 4/軪!cEj^iɺáv)-,%;jdljdc5Z*A.dGZIw|'AmeMq5RM1\jxeyŦ|5o)w/X_(=\^On=uj `{ɏ!7Hʦc&q*@|!;EaELۇ'vz%$+fj#Yw ]sd]&y?eI>XNgƷWދSB}{L1ҟ,Nz¤r.F C =N'wQSxr s&Jh3 ⊶ۮNE8Ի <B˿HSLPLVekw?05lV"`ߔu1%瞤\О|!9'ªy5t>&SNxK>ID]>c0xG~rNG`3U| ǜX׈4|_qm͐"-a.jaWFuxO(36[ >:#|sLVSp߈?;5P'mHQf' w-9oF ,;T,2+Ż'X ʎ&^DOۓJY%u LZ;W9LGh6ÿmO Ȁ s<4k:g1I/@OCL<ߛ.҅Gb\wt8FYIzگ`4A6m;Pۊ;eԝHyn_j" 4XbL#lu-}""Rx*,##٩a1UWu0U b?.yZZГ@%jXF Zݐ;D$9E] 0je}T{P$I~}. P&:$f)e)Y{D R`YH K0g1e{;pzk2pz^WonvZeJG95mqzR_tC[|rcT 8>7k*m6h5B'p:QhuBpڽ#xs}Ad^ :Ysby Ond%Iހ{6h$#MF3$"{]3] $[ӊJZ>sV\=p!]1O%>ȈPWh [\W-5WzQaEa@[[EX! 9 *,*$*R2R-jTc5bM]Y+4Ee1㛿xM~4T?|\[40mH6EdSr{!53%‹zk']7R _>ζD-B@RR ӍJtm5{Bc U\gdO87h } 56_muSP6H394N^ (ߐۋޢGn "( 5iy0KNq=t][]@쩂DȢ\ǦҠ4A~dDf)qn)[wrTFpBVo>_g8b0["$0{KWV?kO,lh.wfYRL_ lcP/"OE%h'}Ŭ l-#Z0pZfxР}s_0 8FSe2G) F/orG2c-9J c_RW_s@T$ѵ;aOG~9 XMGe AI}z:ķQ2.3[VCT*jQ( TN ВӪWrBIYlFbqQMm3L䙹`G&\:Ri,Ϩ{zZ ]11+X0(.Ξ*Bnvjr-@@dPc\XΓAN疖MJZN$ڤny5ئvSZfk1 -4vFZ Y YT90J[&oܲmcKNr.?.p~Fk\1:v7l ˘{?RPIr%\ (G_|Da2Pe@ d Juzo$vץ uv׊=皷{3L)+ , ~d &ߔఐk\^keWsXurWm.1Xh}$_121‹d# )0Rܫ1}DM& [ QƶZB}p902*1qqp#aǏy;DT;\5T;+~6G+X>C8uTͬwݚ=Vs؏Ga <$@<#k̼"~H"wةn(4Ux;ٹL&+zX#hxώqf`;]-_< $xrs(Ĉ-ԋ 1t,wx E1b6р|g\V@qrsDjB[NB,4&AD(B`e(F"Ǝ%u$8gׄR6ӕe(㮺}ЀjүK {ۈW͋mGVk2vt-ܴ<;>*-%?wլ9j55Q+*8nXEu:Mw\4^]{b|⁅f|KHZ"S_zJON"uZTNAN fnPpߒP8Ћ _PjAB%7J͗yw;~V$Jj~]vo%r6#{,KϾm{}%;; RkEtVCw^/5/9}Զ{w視S+Z v]8BK&hZ*9<ǩm/j6R)ޔSCrp鶾SdR/2Y52Y;ҟ$p27IB,pIŝ%`]b<ϯpdRyg35|52{5\Tgj͟o۷%Y '.QY|kwu ֵ}?0Rk;PKwŊ[뒾M|?+ƺh(v$6ޅu `]Ⱥub]uu-!몛kNeYqNfEj ͯUME/T<4bN>jzvzv꿝=pړ-[cxq꿝yx紌Ooz<4Xc`7u4h@Y2(QMܕ ʎURqKatQ r/L z* fXgtq& n F9›zTJV7+h=+dzBcjJ1XW5-.ȭ`~?{g)/7c4N.p57E8u-&5=8jn7{"iQ<,1غ> {s} ZB?o\yxYF04a` Xaw7RǧDaSFkIX mrn݂_MFɗ_m آM3?1ZLbWMl|lr|t#CH F{?t\Ny[ +R&ʫl.셪T3?`C[IWeqs>7@۴PNYJ*en!7 ]3&ɿxDrq!5·jAs h&S)esT@MSI+QO+股: , 4TF4ف&O ^M nq >{WǷkBɜ@<Ȳ1 =XI!cL,)C 7r ,Y+]>xUf XWr0+S qeד!<| Li natLQ9$3?g/Dt=A`R@s w6NC(e3s|-t-z_JQ7ޗ>Z,n$[ϊ9V)3;V=nX2bͬs8‘5pJi]M%a^Hbm_5Lmד/ VɱpDkIiD6KN4u4F7XއuΑ5wh $@$՛lخΟʽ]bƸ|$OXqkT n6S85dzp09.r'85kf % &JZ<^ fL? PX6z'bQ{W켊J-C&}fxO߼04E˕}F=+Ct&(D>_}dK{.r#ZM -D!Rz.[\P)jиS!4r-@0? oqvo!&Onvw['vi34Ԑ(?D_-w.iXi5;M~]i]طԲhx"A{;{Sw+łhUN7>qo;NJ}.`N}s$r>_gD9[JLd!a%89 ?ڼ/,C:y/3E ϳDPGrҹi62,tU DmÜm !a4#|dQ"[:NdriR:v&tIE+Q}#~t.]d M,ba:'.*`3NHN>1ot6k Oİ@k Yv8Vr6l Kl1Ng#7@{$1+\}q N7KGSL,.Y&Ƶl t@"e`J:2è+z9H6U퀁+ F^\&ól>6xj;7o .HqF*(VlkyVDE K"`*Od\YsE| GFA&06RD0O2s Gfs 9a8s7ĨY#h^ʘyUh>πzhKӬAuꆵPAi+]=BWˡ0@<,Y-| ' Go>(wq3?tzT.>fOGOqJQ[>mL6j'CeP}ÉP.Ѭ{{ R5K]:p29f0A͎h)lt_Tե]lqBȮkoT$ A.G<1'(; ~P|C$ qMsD9P]yNOF>)/qiDY*@lW 0 !O5nE&Ϸh:o.a$qtv{ǘ+Tab$/}Q?4kMrB~J|l._^–nW] m@ R`C)8ɐ͊kJIP\P'-6>p||jgf}tWrAjлjW͗Oޮ{'f--84rLoMj[|???'Aoq |@ݲC=L(6*jiU jes8^L̡xe ?'ʯ}=W)a ϑ(#/fZkmXM4C :nk}/{wUj]UNosmN.-S# oP,'INjsnY5';ܦOșpm4 [E5|0-nL }B>]P sVGZ.1te&S}:^I ՙC807hik*c4A%G: [Ii1p'-{\W])2#,Qs j N Dn'Ytpesd #:}GM ϿPxA~?YuiDr!'d㟓+y^]<+Ȑ\:Ny%u(o?ފSIQ%L)TP]V+ I7z\B(#jtu=3=UfĠiv E5<;&__J"˳np|$?&$-ݏ.UnU!R^F±Gt à R?Hu sF<\)Ƿ+Apլj,ٹKpHZkR7[4E'֭9zv9H%NRL!f˼NM(e)GV[1_ErlcsP†6EíW[w~w2';ſ~tު@f{8[qA{p ]\/兦/i|3L'U{'dw2@Ie_MZ eS<{rm5m뜗>^{қf5K (Xcr\'%J_(7:P `l2%C'&ۀC_aQJ~Ӳt38xgwI bSf[MŧlL`Ƚb3ɨܙW^?lϟoku%Fd8,3"PE ybqVH P<,clSt4 &}xԭChL*|7X\ӬMg ۉIz)}AoC6˥q0tO U#!9爄P3EGǸÖ 0["K7؋(3L-m nnGgg{Љ[DܒK C=P%OKl}O ׫\' vH$r݌'s|Aa`RɅtie5?㞢=~ .|] MNHzS$!/_V_h9}\}96p&%ZolJ~^/VTF5X>U 7`3tGY5N|J ;?2fթBjx1Y.0z8lRŀ#J%T9Aj#7,8+|ʒ33ʻ;B, 㫅BbtOSpnEJTwU,jF&32RԞ$/L`9q83cA\"'jGM)auCaFVو4'u@s T"@++EMZp7ȟQbm GI#4s]?*~Wd>CwE_A3٧%į{$ԏ)!ү@țtw" eFyv@"ަ!rtv{iȽkE~?SJ^z:Հ Y7XO 8\V JM˷鵩7+Xͪ e Ԥtg7O)cF3bnrRF9bOP75 NE6G2{Q2 "QTb8[x$r -£)pB,L)dg3kS`DZYj=ͪT*-4~|\k^r kz rItt.-nl ofuo urp]p$K?Q&Eu#[?;7B Γe,]QL]3KOˈяXW\2{E$dn? ^q#[yCӧ[ӭGx118~S2i=TVgFaj8f˪ 㕎A\ '屗tD,TW'ʛU.&sAf Y.ַN t~?jlN0:DG%Ma-Gyg,(\7Ur5G3 ;@TG]ĢCFn?li~7TӅՁ [b?'If[ԁB.S;h=T6sw %S*=?1!pG6&岐ڞ\K?:{>:{>^y'STD =3|;wcPN ț~ F&.cGGῆ»4YTP_u*5a=Za0kP)]/l#H>1UKK7i(PGn~t?ֺG Ra9:΍6U/'nj[vN=t C7U([qnr n MRjN;_Ex֘ yx#~0~ٕKO'Tp,aS5X,[)9,1$BiO35*=y+R%ol~Vkݱi2FV)fw}GexGg_* %4IYnj;5*#"@hyK5TyVKZ fEc Mn stk1<#(vWj(c`+ɘ|-|3[a=f ɚkXA 8eEJcLjᅪW FH}ԾOtKjd/u_Dk>$W7aX?o3pBg<4@;~d*VST\Lx悡8~%0U2#Du4BsK5&7CCӫm€>|Cﭔoqz(K#d|Ոxx3W@S8&DLp^NBp0 O'w qXfk`+#vWCd5I)cg%;c!>OQH -WQ^fhڍevJ* *}RKL@Q1-U"Djg|cDAR"\ hZ‹<;~vRYN:UE439Ysye{YЍK^5y51F~vqZvɦX<'xu|j:6.{VkU8*cRZ"7"&LTލllэ4 p="^Qǝ~UΨ` DpkF[ݒ;K%tqC7J:W\{*i-6:Uw=fJO̖P҂9m!-%ؙrѣ7}/7vN$n0z y.aK( t->`)%a,.jk5&w.==5Dz<~˃NνF` Hq$N$l)~qczv] /I5ķrm1cgmz9S(f*y@f]KZߠj`OZB~a J(9%}b}̺wj_l/<2[33xB1צ,֨6zS9m7N[ 򎋃=MZ |gQ bSpm/eoc*Ѓ`e3ZXۨwUՀ:)=iDT`V ^/W=bz/Dބ[đ_x'i/V0*ɥ/yŇ!5LkvJ;8 %O+v1QXk^<;f^~+L܊#`fF_ 9j'q+ &$]%i'godC+4CK صz)V WC - t#-x }뉾VDS?7sV R~}v0* BυЩmaM&XRҠ̇f"p]/ љ6ET0eƄthp+ [یoXj>"*-iEN I:>0xidn $* 0y2N*nHSzbQy#yUtnI/447qwO{W`]&kwݥI&' pZ0.FkK0=|z7[[bVK A,GOz/SW~B^+,.<9Ca1uAQ}-[v4tp̍RAiGƃc4hGHjiW pS!W+ \Ako!Nn`fLɇg\W,9BT҄ 5IZ%TWA=Pbj)U&bS*V/Qe]$ |ÁSq,Rxs3v$G=w7rJ,JcTN߁)81f$fQӢ{)YF5ipk=b-M.I{ⴉ/4Rsg2ʞp%ۯ }= w81 W EduEA8c^:f9=RheNίU "b; X&:MUS-PX|˴@kW$-db-Zh%._ĨGׄL(+C?nʞfh41fwV8TmљW nqx}yQEN=uƢTr Ϲ𣚴ogS/'n~4KԴz"C\ <Y!Kf%5ԞTdޖ5.wQw%s f LEr\CYUn.,<˯P,kSRA2.' 4K uΒ`(-#uաހ}r3ÁSdciK: jwW;VTsUXzf!Ғ}g&GĵqQ__G^$GIG{(ISDb-k89{skYԋT9]_V /dzhb7qNW_k^ZS즧YT4I"\/py:@h:mbvGXNw Q4$7χuaجB]j* c _; R8y63}?t;Fp#ExH{L}.G0?'J<MRltӮg>|V] n x2(Jy/M87f"ZT6 b.oZ,$fF%O]YXXr'<`gwO#7/Hi+:Y)v䡽ChZYsc-{9 KZrO5~Kz={a VAN#x# ԑM6D,ܪ@00Ze3üp^9,JВ1Ql>*׊ 7*9R~MRLDߚi '/3Lw,rM{Snkqy, a7g8۱@&J=J3;kPdbx ?*}B,,138_rҨ!BV.bݛ;Cʜᛦ^٭F~o tIs?ٝ^Vդ_brٳ-N^O+ۖ&}Hӛy=.~d4'~hFeR/ndLy/97[2`cy*:g|12l'*G72sjŧ͂0`1Ŭ5%ث?ԟ(Q5鬽ߥÍaADQ6;x*|˳npBmL¾Mɦ9p{}Xv2ԧt4y K_\k1dgXEyv=[@Nk*[pvv> LT'K[76_ N )9[3.lhjTaqL? $nؒF6fX쵺y6\]ezO9 I' %Ğ_UR>`LkLOMfp"I@.@zY\f"7ބlW6md7G>F3rR?3S0d{Ǟ< 1V{F^MMg7 6Z2Z O5rZ›س'oGn]&'WOՆ!ݜvEW([ZKL, |-?,YxByO/Y]pNfEѯ,?@~`*}noU޶q`-Nkޅ]@Zh":ON~a}?0ݢ)E8 alS' />uBN Kpw( pYNO~@GgMu)"/O8ESjlW,j|{"NctݗmYŏr|v:mvjzbZ{jqfh>h{!Nb%3S^{nLN '6WmR-q൨F[7`x)>e+R) ;kh݋/. [d:k.Nu'x(v݈`t~cONOx H]GM\(^!"Y? ET[kh 7U( #ܡ@֖臥 6UID*<4gq4DVcx$,LaG7}Ӊ9lWF;樝&LOaEKá+|8>9G>t,("WU>rpjӯUg0MeGsXa(oW$o1$ev/"_ | /5rtHBM%1j4"]8XL55<LWz o7zGGxzDQ0U)*~2. P7J$LS||”u6 Q/l65dc=L=!5n^I Ԫp&Y}FmY+h&" EpR[GSJ?me̡Ov28\A,nHj1pP™:kdՈǼ6kbI S#sO҉KCͧoSUqnbc|Ѐ6y0 x8v|:BUN'.,+1v.C`A1!M;v ^}XڀEej'_cP}Soev1ԌW̦i(ÅBb3>00fϴFw.XX"U EQb=71^|Kl!Lo6+`:Z//; j;O)i^9fdcqmN@r6Js;\ -h UsIn rIYT aRyh3ӯINZ=?Y\[ jCPW <'mྃs$@McKt/n^`xYh#ϧTdKCJ7* V VNo,RӸd4)a889?qt L&Ot$Xn9 8a%Mb0)ޔCdi 7A^^b'% #{Z@R u{q+[2j}r >Wj_ LrX)9 U\hoUZEܳOc^\[) ֋W`F{7?l`jg[A(s^Mr( !;kg녩ZTVxw^ GRIᕛ(l O-#Wsy%AmbƔ*{dg/Yp$%@3q(,B@8(fßĀ B g 8RzV fuo6b@Kf|'ZD6XK88 /\ TGYj촣 á'բ}DsDzvM 'I iDST\ ,MDICW}y@cB%6r E6SDkvxhh#]F;i*;/[ƫ =~RLC!pt|T(( \C*P@eP8:D)b*6CLC(=Pc/YK"KT71aUK+K Ra7\)O){1X #I|Oy=}"[!ѳo'zP9d <$ o?$Pͻ½x]Cku16n{gL5yC19%`Y֬ϯݯ d̞ч4x_Օ ϰVt$:_jމX4Tϯ*,c5 `2h/$v0jAQi5tϚy2PI<ކzWa$Ȝmp܅qZ% 4trc۸ǘ]{3~M2O= 8taV;pjpTHD;a$0%$64"i,u޶64 IUG T qΛjYQʮU.aOZM`Si8̵ymu&ǓE!϶ Il:!'&jS :Q _z`Nu1lQE9C9!4rf9y)+iTye` cv9lE!, *΁\iL1͸9()͟Dئ0w?y9 [$o1J> ڹ\Ho؍'10,$WS⬊՚mkOMal1KODt&k߰ZY+kV)*;FlKoczxzWpq{\4ەvo_qj]-eN[a^i `8ZZp%3cXҁ/F G4K Q]0}HD!불w(q/iaB2-2؛nN`"ٶoH::ZI]6+@gUVprMypErGγ Q2#8UͽD0ѹq7^덬y*0P!W=v}N3JGJU21<2>&d9s*~FI/`%bpȭgڽB6i4鏫$E#jHLMbE؏KwqH;WܻQ#pYRD7 †gD6"k V{9<JtעGmVrFG%T pb|''rv=bU6'|2vۏfMag$WRI{sJ bp *Ld+;a ; @m1KEPbӼA/:e\ u8HmgJW3r _sݧq/I.Jqn7/VQXAͫ& ؘU)jfT>ʩ-敷´oUZWd{:^nT?Q}G@7z14ЉA >^>V=XԒ,EZRAʑ e J,) .Zx&Pѥ_jWKU11s3e픥 8y[PHs&݊2 ER;љ|; (ZCHÄKdU݅b헚/7d*^&E7:xww!W\ gF_Σn-'V\*|<_Vw F_شunC?5QMhwPZ6ل@l"bVg!y nZgνbKMT-'%X^!Μj?.5iG%U~\`M\8WKmzDQ_oXi홯~^)i-s KsF_szNs* B99=25&§Jz {*zhxJ{L੃SpăVE#g,4g,w+z=Lh-%#v t ^޷~4_"*s͞JDTn&A/ӷ&y6+0tWWWWWWWWWy4xZ7b)_${X-Ŭp:`{6لSU d47jMa,Í <'ˆO >8q(v.6J2dm;.9-ٲ=ňsT1QK60[Pp9&fHC%yZGlw-L㼱0ߝ/)I/O=s6'_[N\Ӊxf1Uld.޳F@`< VahfH/33VcBmUQ]5×oy["\A ? h,4sBă0ýq y%f^h&gτ6W~Lhr3gB;n& H B3={&p )a37Lp> (•3Fp.$Ӭ-x\KL`8U 8ax~lt\&[y`JQnfG~>V|"ՄHMp<;sf($η8 XK Ж3y-qd5bKo0 o0R8<{쌕QwA^2N?G3 ќ3  -81`UM8@$}:iΒS'͐#q⦃"Ӂ㈎2űK^] 옰ՓFvR厎wط`$jJܬ eyaotuÄ"Wv8o q6&ŬB#vv6ޜ G!nm{ZG.wx4̈́VS_Vi(٪m׶jvF| ADawll{{l-џ pHgt WDUA)3kHwifufti]v|R֊9TUXFIoiWXʖw\ADrmUBXGYvϲGze<i`K"ՄwQg5 q؎k}5Y 2TAZ~R <XKzTC3~y̲< v_=M !@;P蛼s48N_)(E+k}6c or/wco׾ϳc1uv8W)e!R{V;=+"ٵAo_~ 6oteL]C; el ]RvT<++׃bj 7`jC^#c/%]%KyLE0cw`"֦C~I}Ƨ d­smK`}l[ [si3hDaeO׆ Q4r u-)v40zs %J& ^JEB;gPYlUDTj~z֌R:;"?|];a'UY>9+Ic ףQw =w}otrZ<;u;Ae?BbT.R.82z&aK}zߣbcs>t XϲbwKYJMKPؖDOY۪ ӄb F 1僒žbqJa*W~lm\/ ue&r#MeQer+_ʇve@(BzQ]r2%Ƨ(~mlb1ܗ툝o[5ToTZ<ߌ&VMuSmD_J\O5#lnlY\]Bpںδ PhωCl!f!ٞr5WNP$l|~;OfwQg1hR}`3avl+xv`7d/BNW3e@KFM[0I#)Nմ~m~!Axl&,ǃHQ*xHni鞨3hJkG՘~͒*nF5GYBmSr>BBw၀"hɸ \XpG @C5sI[ܘJoA73 ar`'=V$1)֬0<2B-q,hr+Yv7@]q%hCPnkqKMyad`M?s#Q>0ˊ;'~ڟ0tV-d(s߰Iů$ % 5KNIL,^x8XW 'bH^ʴ1h6*4h_/ΗVe/ ŊhH14y|pXTy3D![l,d S!?*P#~[N_/86uGBDǾ3H^hUL|sɪĜ@B!ka1v [/"dGj#8$u ڳHjqIvHG^ u|ZQ;N7}=a  Kqx;RDc'קf m8:sJ&V)*g4K[ 6'&@ǚU: k|Ϫ)$r"vkE6~*R(#?)t%VhϿlN"p ri=P5/4[NAW+-zf#Aε±*[$ 풛$s0cNi!1l-$dQڦíOȨ&kTw^Fx@)fvB<]mzUBu9Ҳ}VL9yy,̙ݥb^Jp'W"CƁc+\F.6TѦԉwK)Wau.e\[>6:*A{F^LYd}J6b$ސܫvLop1zc(n:v"nb#]#m 5X8dmG}E]Fɚu+SS#?%k٥6(ѥ1$Pɮ z;ܱӌن]obؓe~D#AzՆL^иIkNZ,VӋ۱ǐb7CXz b c HFw0 6koa"k0|Na;V>Ô00#~_hUUT+ v̤ X󩦱6NhX.V V(wZObz)'ܖ8ڱ%Mo-84^YBO>CK. X7Y/g]g~^I3pϔ#psM)Gp<WV:I0f;-9יՄ<.r6Mt/+Z&}(ْXk+TqL޵]7 ƙvf\*bi,vh%V<}c舆1;'HBJm\B J݆R=ŤG'ZF芸,yBٍQsdf613mlzes O\/W'OڼSE9B[JrSTe&kS JnԲQ31%ǫ\%+v|*%G}>4?ӝ,;½ ;UVD֊s)"rx}|i"S ɪ1F$љ7^~;/Ofm޼zIz[x[2}y olgxx_3b췯}'\m8g~hꧭfV6/읞`DN|*GȏIqXrOzFWJ]wn5_ïL?"F`{ԍr}jKj{rPiʍ;8"F>nVZbgrx"ӄ&)QHz3 HLGa7}oa)f2KD;W0%QQU2W90~<3<$01?c9 MpoF6h^ȔK1Ie9!(q_cpD֖Ѹ9: e|L3O4|(ԋ|qsYLa^hB; U_㴢t sAoW"E<>0-/LJA׀dpBMc[E:OsG5v2N_bVY T_(Ίl2Mj?M33x$Jϴ3,ŊTA@/%#̞8P(H)? d@h|ZD#JRܓ Gvpw4@)$vHxGC>O\ZKo)yKOȿFV%`lbQ#8:RrY)cEV:n_IdJ>{D]1v3?0aO`$~qTVp|3N.N05:̮͙z,4SO^)ρx޹;Oz0$JD\/M>Re2s[/H_j|~s~F`zd~`eʖLܔYE3FgS,0=_} &>dFmF ~%/_u_;k.ߒ켞.osVW͵<7:+pL;275%Jmd|V |{k ʞZ/6ȓFx 7hixM0]F]<-4mNKdMLL:uLN6)2?{R Wjy.ysoThHoZ >s䬝`H RUb\:zg|~HHsd}\JvS\R\m1Kr4wIsn>= dϚ lcl %]35ф! de& ̀S\ {hgʮ\  %~oLgQرSq1!8>pX&ղCRl&0T#]9+'ud\ 9 r v߭w%l"v@9sٝӂ#Y(*!w;r (&w/ ywhwhrf3|`vo3;B<^l R*M&aQ6sg+#%V $mYlj÷mx;qLq3 G)?xz)O6, cJ11bR(sHAydb|ljh֪dWqM|Wun(9)|U?j V~MɰYmY/]Dҗ*܌j#)\Д ݽNa =M*y٫]Klv(*PҵmbN69C4Qr9w>k)(Pv2&ÇvGxpP`8&q.C6ak8AY$. R (-FI~ ޹Q|&A3)@{gyQYU=ӁndՖXU(XҁEǵ$s#ytHY3XL'WpH>2plMJ GۥG"IcHj׵?P֎@^8|kqX@=EBـqn>P[T"ll#ˣHxZ7_;g4.4hns"(qlr诶QW6gtSx /x] Z*U`k(x1s 1R03W}1(-8TnU%nSBM = \H"˩nBq#͍o,$ջ㞍q-N:6*1.Vԥ8*r r|L c>nThbfC1MSv=&ZkQZƧ貋gIKMMF O/626pOig1 Cc, d4gmĴ#dl+1V;5Pzi]8/b5%uy MzDrw$|0:sMm *VagLztjDmFuqt-^j}p+_@ԾkiEaX:Ceazx;}:6Q 8Rxea\qu1%(F[ O 'W)FP!xRT -`л롧8b; Hn^+hAVE+8f7:_2#k u4 x/r1F.b*y#ru"20| hn޾ /$%8].ztx̗`Q'ɶ\:z+N@EoWt2(/@6]Sca+ QtJe&6`G :6@p}FM3ft_C3EA^M4{Q76akA1!WJunjҢMRLPLJ =Nf śۭōOŭo'::=ɯXJs<&yHn[ ߦSYguFU cso5{dZLH ?73ȳX=S?v<߬^l#WZ\蕨,D1 ` ;ځˏ7"yV,YǑ̒/]vVys Ѫ%1ŽJi;v_$ "4Y4`wçb:TKC|eU!3lB7C$i3i1#@Q3uW QOfBaŭ# m}7_ʖQeD-ȟ>` B A,Mc(Hzh l'JMqU ^it ΖVucϻO9KiD*7IV1E= 9~}MO/ R}nQzbtvgbz)I@bJ# EEb.xaF1n[ӵ"yᖨ>ˍayހ$7M .G<GhrܠrBS<Y |6$$ @bXBdilˉKP\bR1 'F\zJLWxt@'S.A)eI.*'PU&LƨY@ʻI#4w+=cE9^^i"*Z/(* 13Ѷa4 Nzm6D-vM%=]CyVgkJ<y2x(MJC ιG~6# ɝI~u/ > D~b!U})Z>|2uߦᖉgysGYVFvM,>VΚMCm`Y}ׂK.W>/?? ^kfb8_{ʢ#dU?0WIAX L:b` [^!kɉGRmM{^ nH$C1VߗȖa[l킮o/aj ٶJ X$ǂ/vD~KK?6(N<G=> K\B!K,e'MdY[$4Ͳ##o# #P\ѝW>Ճ<>W~cEX!_}?z/uC8r5hIgr<{e3 v_Ŕ8ަ9TŒ8^$yzJ&nj r!Z0-^Kݛ7rod,5TޜA8Wj*%&Ήr'yz葑FkOoQ;?"38F^#-N45nZ3Z]8S{ iUV]Nߙ:s?g㌑Ks$rڨ5Gf{U!lP̈ڟ *q39}>a|͢Ip>.q}>"| #)츣X,8+U.x d5z{tRiSnqЏ.\d*s{2!>'gBI{&9 W]GzK!=ܥ"hANq$gA b"c֞ɉ\hځ5y=ȹ޼ÛP lP.4[us޾-r̫&o=z/&՟ ;<%+%utR(OQh8Y$T{ʭk~9; nGQU Ksԃ\NL]HX:1'QTo+hߴjج+M')N[Sâ"H!by{-20a=$XMI99oΦ%Ұ|{M_۵rc_ʐΌ/`"* 6U+3,zԱy.s<"Y&U4 <_n$H[,c_K..?$ c1뙡Ņ:'',grq1niHE,"#I&gT|šh/+췚ֆYbKC . ,xI. qX`ͻ!?AO2gwM`NXޑضZ$5.Pb6Cث S7m)flGcs,Yhg+ּUrQr$qYݨqI#gU;f%DH[ ϰKZ嫸ОO̹[X\lE%b*N<\evb4'q3||%C ŲXb~jESq]#0JM0:\%x&p:tZp#5{z+b%fR8CE* :?CsӋ|:J< V$W$+xlwf@deଝz6 c?Ür1Xšx:6U8S PZ9SOK]. g1F0p)nQHAP,E+PG/ , %`I l"xҬy~m.3瑻F-(-S=mo7MGdND;Uw!{s!fm`3?ڕzd5dA|^RHHES3YܗQEHym'ZgY}ym3uἂKD7ָx{Q¤1,c>r\ѵ9f<U%f9 JYݴvG0 = ɂI"Hj~ͯٳ$(_R_ϴjwVq5O+X3^V{dΪRI~L k˝sHe/wXEX̿@x>'kQrYԱdfc2fN>yfC ۀކgȂQkǖtik?j iaU[Ӆ`oP1 j0k(4XхvΑaXib$s*> lYw禇V\xjT[Ǽ{L^R!JbDK](ZdcU ͞g9*j۳0Vƈ%Xf;7&~!ٌ#F;b{Lk@c'8ܿI=5oZ ^R> ̺y, \~AӢyâ<$PɈDCj̘K@aW??fyd Y̲zMҶza $tﭘ{Pɡ>/cƳHۺQ-<31Jfӵzӵ{]kY0^Dz9Yaر-?1ERW~b^/od̴Co&?YFi4RC唭k~s+sb9nsVc2Ai/#xZZԣzX6Q _uu u^MMu'JWsUsUԌNTDDD?Wu'Qr, o)*NQ)*DޭSSy{Ga.|^((tcdr\7C 3U~ tMqD(Vl?0#Xڙ^*ry)b6ZjgD=})f_S$kNNIaUuuupb"O:AEebbB NOaB~1#9E!1/;E͞lL¶I/)fy7AEgq=c(uuUhqRTr$)%:UE:,~Tg(5SUF/YEfd%&i=%6kŢx g.ge1qXgՖ_*c-ŤY"y+_(fd-2WneflM&R-BgM[ y+b?îV<VZxc3V>)+~FcVBg"?u G2Vo3VD@}NPtt * *< Rk31M/_%AEBK2NNS:5ESSSS_y)RaKabbqvRۭ3RbHAuF ?buu:thb9IQObbebEODDqY(kBd+SXnX(0I(Ra5B"^d//"(& [f؝MD;3nn~u"&u"dQ<ߛb}::B SG \+dLaX #&G 7L:_0u89(K(tc ~b77Į܆*}fx+یZv²P<%~<^Br(b6Z2g\=X}(feSk$KNGJOGuJuJ uJ4:%:%:%Œ֗uJ NHa!RRRR_0!LHG?ٗbMlL6Y.(f[|7!Egu=cJ:)"uR'Qs9ϏIL񳊞ujtXԩ)4'JMLM krЩz hŪ1sL~jʿ{x}5?7q|޼zI/߼Px@7o\ar7bMX`\jPVn0ߎ 7zc0ގ: >ތ7(|ϾpOF)Ho>u;>P܅l~9a8G>;^lb^7C ||^T1iL`>.Bjh@et&؅>`M;T)un=^ϮBZʹP<4UX^;bC5rh~C`!|qRAbR4?cO*Z`uVdgzתU*%FozN:8g1`ٿfw! {7}; \5{<N8D#+ Ya$ J,dŋ`n_9?#DGhzw=O6D8d-dO{ Gx-@o@X$u؁uBp=@U %<HP@t>Jae̦[댾GNY_jjk`>CPNʵft}dx>$zzXP`׽.tBh9P& ) oht`ѝ!nNJU7-`(̆4пU PMn:o|B@_y}t)r n8O^fJzuRw'Vrgmvٺ{9w/e|w+` AM@&,an GiN wEqi 0 AHleBb<ރ\58õqos8Nf ҹ>9m}-Oq8RQ]JzE U$pJpvpEk2Z񕼃M*Aɂjy e!%3*B;pC; 26gLx8 W!Fn_bz;$vAiG턓Z]>y]ew3e2].|y$. 3_y4}l MjhEVH.cӘ[?#r=drtFSR:׸"co6˚<: e0C^#pH2EzdS::}S{S1dQYφy PUx6b=ҢUfYM /wN#Tuxx7 oPɧ `8 X鏆2Wc02`u!(0M sVT5`,6/W?hhzWf?A߿dap G, ?‚eHpf b{n ~Wt6vr5iUlo8KyV<y;<-^]Z\GC+6{1HܤelN3`⚇aI1 PˣNcgtƓU_[Ե^)<;FƃpeͰ{7RYkgp}CPN4 xk݅ZvIeiYwɲA߲0s#1 Gųޱ2mW%mZ@gGdőTa.ףYi6# bZV_mr'RZ^hR&8&-Z5"ۻ{R$c&޶9 %)[9Cd'N {KdY<F5j<8bL(ڤ+ybVW3Hσ fɷ4>j1W,A`:^MLe'hoawJ5`m, _і P }rG|.|9nf2Jy6yTE^R+})j;@JOyṿ&5 ꨂΦX_l-k^&bq@0" h'c`@rq@9@`mRP.멭SoxjQinAT.g@S#$N&d}?b7DZD'umߍ, 'UN8(y9`zVu{b֐A$nד^t8$)ǽ=5VQ>0{z!~n|׻A6=I`\4W5!37-ZQd3AVg^I',] 0%}u7=m0%#σ\P`\A~Vwu҄\gyVXdK֖ T\0E=3CQr E)P()уġ(__GdZ_LuONb:C"募Hc0kPg\5 l̒N8" J)P7K=9ͧ > كʫ|2@˞ML7Nd `)>ITԿ&@J&Q;$.qv7}AgRx$*2U5VkqrF_q9ӫIgE4{=N4Q|{ˣwa^ JpŻ]{xe^kxgI /u6M\ g%nq'jM糺Dh`PE.kJGMl% k v^E 5kވO|%_#zS1~SFw9 ip"^y<ނS]ՀA$~qWV+3N.7sa]/όtA,9-8Ό`)\l}>k*}oS,Ͷ VF."uJxFzBߔk#r^$[,#h߶?I&W}Wuk' 2B2`ww20s0QM? AyY\P"Ĉv8?G|婌kN!|u剏t>kqwԻBvoaNOͭbkC.ݞ\DӇO*lt_:PTs[,pB!j#Uw4җf*=.3(dud4'mxޏy o߀ xY:,Pv` C?=os!7wy!{G3=vn»7bkYgum9.h?]V"K6Hx<FSϲdMM?(_KTI+ NU/֋J Xw}7,WVx!6Tld =>ʒU=IPWu]\EIBOv>'U^U?bM/ p/fآUOA& z43@ W<<2< @evHsK}d3)~p(?Z;+Gq}S%} RٯqK~SEwX~㩝I੽w~⎐CڞaFa@y{.υihfyÇpp{ M:(Nn x2|x@6Ի踤 }I*CeP¥ JB5,/*?d֛VD"I $#^,vGo̒䂨3>zJ+ni3̄jR5%!ᒱ\Am^| vCR F#dg\KE< ubD'pz=́u C5B|}ϰ,W3 dUŷgPEsx4  hUxh(X,ST6=tїĺ눩Tx͂0I6Ÿ~K4"5 R XP`r EH-ɘ (Б`w qq-@lN2n(-CJy;a)I?& k#-C$rS d}v;gɐԥme;O&T #[I{Bg C5r/gyc'辷ӲHHN&ᓣym d1/`#l"䄵y-6 UJda^/d{͒ ]uu/>jh{= tỦ-Kd*hOj߫5=y 8TP=ĂpDŽd<m+9uTJ=^V*6(x+:i zFnYhh/H3~t0chV#3To,' Wf1r^ _.* ggU5y/74d\] Q@c46/DP rDa:uDRaE!y{zzحEL:K׭ ϔ5K(-S|3œ9Sb\V~-TamwlcYvj%"[#;L/u(xtz(nݚR\@fc.`S5lW7&05ZJx|nI$yO;if\SED{j3`+VlTIcN"l#YH UTCk>W()ӎ||T1F;AKt " d\æEDdN.brbrR\2x:254JDžĈ I {/͏Ϙ2/>,F1 q%Q:K%c Ya*W_\#Xr2U{UTBd X= ߃`@d z8 zʻfuXA\\v)ȗdjfe?쎸::n.EYJ@ 8z1ا7HDZU+n43aL/{ϝw^=NjO;)KkcK5XӵӵӥүDYW^!e0C!Mb$9c͋ed(@7&t''0StR}]q%5{LdLx~qLWbB=5#Ru=Ky#fuٔeˌk,Vږԣo A$tX=mN';* v<ˠgu]RoWѤ(^T:Zԃ.{jw8>gMW=QMN|oHl t?)LASq]*Ʉ3;m-PBxyѢ5/};ȪF`=ro^5n5Z~D`vJ$T}*ixdJO毁55 MWb n+ tw;4بڎ:8uX)vQa35Fѫلbُ:]U1'w'3+R4-/ܛ{O(J! @e)qL'vz詛nd"yaHtΘl̼ŝY[!vh,3GsQ[/IusRIWLUb:dJV] XsT<)X\.1 EF.D7|=^x{2u7P8r[bm!r[6l` UvW/e&:_wA;?Jhp1- Izbwbt,eM/ Dc1z?g@fwR 85x.Ĥ1XYJ/o]`/ N8YFʂ{<>7&fB2ǵX!]9H)L)*YM쩐aj@'7U6p%rY\1r\fwK=RSLOٗYbIzn_,Noz呢9sHuJY-<[LwesqUF{Ȗͧ ƌ צͤBs @MT@wN)r7W^`_V$=H9*)á#Z3]X1}qݕD>N9G{yZQES,T_=%TMu멳=?DOiz16g9Gs@A&D U8ᘨ?ot/hV+f0ѳ..ey? w ,/e1NOomveG7^Cī"cOo+O]HƫT^PX6 :kuzCj:^m Б ik㾏`B^>ŊX,>Xuz s "wB;+mG\-:t3X ӵ7qkk|Ba eRx=ۇ!pT |cqFw(ԗGu7._@V$2rݙ4rPQm20:Uޠۻ Fptfz*"!Ý 7phcko=Ҽ'Խ f! uKpKL76Zk[Fk=)im7jXzHɌDZkH2jUm?E!Emm/olWO^^"U'FHL̻i2{HS:\40yaD);1Bk5N~uыGad3sJAH1HY"mkP_N@@qyO8n}q|l*ZpQa`tҋӡ_ q+%:1kr9^ى 4INH [y -~H=Uʪ:kZ`3lʍ|T1l+몭% I>b>M{ĞN `HwpR=V7 % C! 8ݯC;ɷL:(yM=eNuRrG;#?KTsWQ?Y*p=r3ɘ-6ő,=H䧹᎛ȸȡiR gĂɝڑĔKUm>OEŨYڭmUklq#k=*~VuӽF/ρ,HF˗D KaZ~ A`$@h5E Dueh8Kmع9wCk,Y>*FmZq,Z)Kr&X%[gJƕ1Ҹ2X+˕JǾ?qeWy%+yl'eeFWj6W+ۅ廽Rl/'+\Vdeۖ1Ҹr YN#++W/+. +m.+qmʙ\yʋlu2-/S[[׆7{SϏe= nm^AH%HJ{zn5fqhyzp_t8IqӆlhN}ѯ3M_j>N]* O*ùFL4o LwZ}7茾Aڿh9`ӟ'Q0ۀ3FƦCi7Ptoչgz^GSdz]Muƈ$_}=[l Mb9aD>*E c*6<3pNI܍'!O?\{z ïxOGʈL޷z~cPȜZHk_n`Nqv@ L'bYR{ "sm+ۡOKq|"^$,gk"צ.a$ 3ܙbE1 P./`U| WG#.0]Iv4iʹO4B@'IWQz|#52=t"jGZHj(rMޖCI ;uv;1z}ݻRg2F!fxP TZJb<5&:2:h9Sh*<$tmhVw*&:Z( ׀_ ` ¾V1~tvəu 4ۨthsB!Kr<(ӱP䬵4diPac# 8=JqtOTq^ +~N3'[-;;. ԤHL x2g͘RE#k1484(Ʊyv25EWBd- xihJըCUA"rM5{ΠGɲ\aC<Ё -v_˽ybo va,lh܁4ˎLCab,qփH.?wS+Ҳ"mH,B*3r:*ҕIt;*HP\(ji1c]LuyVE)"NmcHXw7\U"L)Y0xY0wa^*FW ]\kO8~Nu14G fc<5 nrwQn+bߠ^QmndLYD7c* E؟^(*f?KobCRD~Er*|՘7,utjI'QnTe=sSY[eGi֕ZF 6(&lf-c k+r"1H߷_ĊF^x Js(0Fq0g ЅX 9 ]?:GC$:,|^ >1\v^v*İ`ۥO:rUq2ΤS Cg'3bWXγ #_GxJ@)|JʆoodYN\WD />h#p|F똀3Ac7Ԝ"V^Xf^ŽqJ<>(tRw8#ŢG񸡩H^Ԣ>(Q!S PPi&YʑG%EI"o?DsLkj-ma#ЈմlXt-ƚ~fUR9@gWls9RfXca-4lz1[ՍXkX=ŔXنܰ0ްDb+KmaOsN* +X43d{ҹ֝Gy,Rv \la@:H77oXXA~N qn@ o$@®ngJoC7I692)$+[=<yf[Ay_1y4fl^l5f/5~E_, %[جa cslQ,-Ã(peޫ1cgolR*,elE26cçMj柞3Ny|eI9=SY/==粬l,􌷵ymId͚-\|#G;M+<64Ke%n"jFp~Iccm.-D,u !mW0 wl{-xiL, z%ML}/.kycsXƒb+t6bkZ(6b3_kZŴ(6bq@FQxpBbk(2XzǭjmyMTD&jmZD&jm6QMTrmZ&gۊ=E4ۗM'4_l'rBwV*"vVz|`D,x*;lPg mcE}/++KJ({sh\ܩ9b {q4[3^ը/g=a?k")MC6*ٲh#W@HeGj~8x-E99`yt8z}\K//q I!F:3, |Z?L5[M]7<Ĵ'n4WJɀo}d 1B*< Ck)R%Mb .r_$B`8;Kmuqƶf%t(ŷG xMGj*5Ix ߪHP4SNEVBoJ ݿ([@D(T~(l0qF?۬CRRu3{ɉ>5"r6SD44ڂ?e*SCG?{VC>9!~9[OLim)ΒYN^Ȝ+8{3L"YVIZ>m5gw%2lv3%t߅&+ hKq)gt9Rfqũ1 K׹::ikF>AORdKTYZ%QWf#mE/~NE1rjip 3JdWdLZ$j@f-)q"< 6,|0%B fUav,(|95$FmEF4DT[=R`ULjixϽ"&˖-UY)Hiyp:6}mSs _M=_l 8mtWO%SnEIꀫz0+Ԣt͔?EtUvD c "h4|w1ɟ_B7'YXDyF=d^ְjaG# x"͔;(w̱[\ę7{"^臭 v?~g@dR i󖊷q1D!+?xy-/157'ը)-n=*6?` G_ahsig;mSyEڟuטq6c˚qHS3'tRxf:Y~BNyu(ޱ L7qm8OCԆ):qXOcQS*T )abxAq{YQVIvЪ5+5avYxvf:蒇p]k` cg^l A;G&޿_+buQ~fm޼zIç7AaBez'xv olgxx_3b췯}'z?<>*O[ \gPzXnFcjko  LvGJt5<%kfCßC|?ĻC @xV 0i3[q?4: 8-jZ r u*/H$tid\l٫N^֨w{7a& vv\\jPVn0ߎ 7zc0ގ: >ތ7(|ϾxOF+t#Mp$`{7tYM=iZp+ ?`Xy;XdSĤ!0aC% 0>b_ rzr L #6|w>v<%_c)}7|PcgW!Ûi?+@y`07+>b^5?'wC5rh~C@|qRAbR4?cO*Z`uVdgzתUPH9C u8aǀeu5n 8vXU)t-Gd$+7*ơ,dŋ`n_9?#DG2 qzɁb:_zz@[6^:pLG^2@v߁q uM xun{;|O=* HZ]~EݧWa\k6ԓu:@t|}TV2}6n#>4耏]{|腓O`{`. |c1R H< `1)=8~nX`;OF©NG Eĵ+R`a8Ud0m1|"i:8+Y,/4j|.1@iE+Ax k) x`$Uћ$ӛ1Dob@jHՌ$G$qu!tA/v' 2 3퍼X]qɽ8M%t=̿qR=ʸcWb !eG&f$pDk#rNdkX@ ϝDO6Z2jÉCztDJ*$\ Le1$$p#}/mh4s PTG}2Lm3AklH#i U;C? j!Vj47'J3v 7Ք[G זLQZ1-(gS >*:w@~ Lo;>6J݇tJ#RX@R;BAo7Mg~OꂁtD1!\G[z nD)GM8 ]el-" 38Bϖ&KԚri:$V0᱇f:9I {0UAZ-,֦ q,ahAOmҋX*[ %[I?@s8;FV],#"8_>"s*s3G9O75ضB Zc7 Cc;=M˂ˣoIvN4+9 Psz2^ `8{7&Jwtt (ɓic~"xS~+Y dE2@ ǶAALʹ+'ka,5jC  Җoٸ<2̷wW=$QWUjZh[)ԃ,an-7̭2c]j0_ G_ *XܐVeۖ+UV1xggOȾ@$I/Qd5saQGO Bz\\r0sz#6sQID䢎TtLbcTKQ nXbچx0  a@`(KgXc7Ea>]1oT?.J [}sߜ]^;K/C9fQ*>eZ*X<>PS^NU `KBQŒ t9V6JZU0j"% \wa c誇vs QSc)~;_TK.ɚf|QڼlnM㲏˟/*fܺTuGx̮~Q|`3(8Ƶ%KE/s_9^aNy|n2up,h&pӓzゅDqNpޟOVb P$QYKK&84QPL+喇 Ϻ>0'mG#@)'w5 ge#HHx *?Q\p(i2R|vUkAǛ޴\E)ćMc37y!!'Cr*NN-$$JO'Y]H}Q #Zj <(LF-jHP H$\Rh`񍊿k5ٔ/I=U g VKi!a# v` ~?<0^aj]2&~l0n~ök H{LJ$ԭIkȟfhLAn[CC %%@xe,xkfUabSZreۓqdZ_HI[hHm1\ '&OhD>&k\Bxgi3~Rkf4[^Ql`.9c@D"9?/8^jzN=SeD.J q3m0Sg XHLvS( mnIfKlZVTXeKC}Y=y9'ƤA"ireռ90捅׫y7C6BO= Zhz~ `|J^Wt ;$ɰ!ԙSɛ0fN-Vk&Z-g.hlcx^>d$꓊t$X̾Ԑ32; K2Ox3W$Qg3m3ZX>Y[p'+/\K[FF0xm<&KOj]~kCI ?=F.q<e14kWHLv4A$>ăXDl KU}s4I:9`5ˏB=|jxI5y?r,W{;{PFw6)5ǸArǻy+[6>(1oqHԒ٪kZ-?x-58(1uHj6t*[3L5Y/Fmɢvh&,|68֙9X͐Vǁ1u1~8ޥ=5 bjK 5Ͽ8)Wg) j+7UF4-t{Wv  & l0o{}huf4N׽iJJ+!3jcO=I^l\ߟx^IKq__!Y*PLD?>4bm1::ל7mFW7=FGUms[j=N0cY;Zk(uq 'la(FK4%9- m_;.n[p}Urp8~xM=QpϦX&7o ~LVOmr\Wi7Tmk"\{y5<}gh͹*F-=t'Zw:]+VG?PG#z;-籶 }sw kk-Zip6sU[v9KZߢ=u raΝyYL#w>}54땵H^qIGbRq<&&h-@-< } ZY'ma^Mfvn}m+9:Gx'Џ(I_ PO h>+2nkEuv 1$\' Uvb{htgat ,i^lQ1Sƙ=kNP8FK,XlND#'@U'"l.u TZ3'.`vtjŠpYi;D5i10QDI7zZd_缈S[Ea WUu2<迦oyC3X WvŞS**sb_{<E,2/]薡5ʌK m4W-Kv1dFm-Mg)=Ijǖwю|/^tR*%&ԔUv$1qY3>}|֯ʿ{x}Yq;z7^;;ݗ ov^~ «ΊIgo_ǽNBp>>3*O[ nʌ@}<-eA{[;:2Aa u{#h &&HX=;*&ySJ͢<2ù|n3z\ƓQ Â&9zyzwO!1 G*Oa;^g^7#S(?ڇ`@deYðy*C XO@bLg]Qf`IT;Q1/>,WJx8e*(.*#`mV}fzXk~)k8Y~>SN &ߣn{GPXT+ؓJVn4i1)CתU?;m8$!xZ0cRnlYjx 8J'HFdSpBeD?&/^<>>optϡ_&:WA1Ux>2h!`9vuD[ cc0OkE]ߏr}@HqU7>x;[Bӹ I=_('-k0H8^a#CZ&@9Ed9͛6*[pJ9vh -Y(@yah } զStvض|Tѹ4i0HKl=;$d#4G.Q!8#%ΩM\%ǹďQ`)&{q0N /igEe:S˝>݈mNLKH#4B@ <-b䆎i !RFt0;۴ Uv~Pj~؏=m|*T9buRiyN0HH=UF5A"?=❜ unwxUV~8㗫A:4y#7X'bkbΨP*zbwk.Z/>5T8 Gnj&`uܼMyakvМLPGӅYCCSm0H33`7,7&?A1H&ԹAw5-$|(!VY"Zzd"5AN:f[s^Nͅ0g&y} *Ixl:c@?H2A1AxD\ 9 XH)_Nq@kUSsq| +w1AJA<```L |  L/&gW1g䨂JӽcnwvH5G'hy-\&ۻ8[ lG>&27@=nR'7aB gs0f ,{|_T,"C骙HYd[jk@I+S8 l&n& ef_ npE<:nL1!hs /FÉ@?!v7 mP JФQSS{ݸT܎htxn+Ҡ!,؞|=sFO 2+G)鏇+AU;bL|Pk{ȧ+PYv`;vYVC|z6ȲvP42cX8 k SyYG=aon2ɇ⽡7]@="y@ʹ=4Ao,;  ؛ I^+VYqVCkw M,w_;kc4fjl6=H6Eo{ ]jzj֣Yڙz K{ػeڟt J/. ( %pEDa;q2#ЁDw,#&)˭z{Sg6i7*-b- <.K{M(YceԦK50&ۻ&"(F<+֋ aS^**O~g{oE~n"" n* eGCG96F̺ /v u,qbG)1D!wM^K+7z$ں?bBB<}~_Óᔠ/煌 I2 #F՚N<H2&Cg`^5UU^5U/3[&SU*zD>{=-6UjY DAx*?;HL:,`@KlL*,m%TUNVE Rc̍ ՏYv3Wj X@Z Ys"=KF'ca+Ȳ 8YqYu)5ؕCw6qvN2z|{UB_st Dnj\L@Z, T'{0)쳊 fc YѼJ,Z|1X~~<̊I~r^{o~ lH!WxLW I\G;؍kVTTPK5*U,a<هIS܇qX|"?ĢMawu2B%Ǖik Gjۮ&9^ӶOē!]~c[5ߐ'M!c:]"?-md Wu~Gİ 憚#\EeUl2- N` Er#* j='W<=zf@Mu.%uHh|apLWƈԥ̪#eDZMw Gd Te@PmDpq)WeET?]`j}D^z 5vILm8 ߳:HUx7Srz1gt@73r}CRtp7~&j`1yꏰ&|ՒA- )!u=u3 +.= (Mf8J)(=B f(Pyl2\ [uI "~18, ^1 *W²ւe[A60%bc fYdQAIR'5 >) HUҽZ)ENH㣅˅]J9}$Ѣh&>ZHʳ)`/Sc$As syΛ&cl?Ϟ,n*lr{4 NYs^G_(m~' b\dB{e~,`V?%X"lԃMH!ONv|zW]QE>1UvnɈz$S3n2FˍaAM !8NhU^79@`'ز&2)j9Rlu0EuO 69b(O KK7P;ݪ>|٪-._j]}͑.v%ˬ\RT[:n][ϡi}w)cgYH:^>tez88TZ%OnxF~Dr}7Hc;k A닑(-JdBյhr#R+Sq-O#x|\br{FV^Vյ7S2&x2q=PptDy /4"Iq1mN1IƳxTl8h8*ݚaMos>;QcJ6G/|4 Ii'љQǾ#-5s1eRWof)y z+z:WL5"yů~ q-w!nG4z3qD?zӇڧV}}kR?N (ZL~S8,b7}*-Ė?fD4LdDތHQ˯i3itOC5ICŽS&FO|n;OrMN0IfrZL+cښɬZ@d=7(4dwp N<ܝgQы!PCqanTbQ60SrF'=K'i So-\'z)K|ze[A@gʏ b9gE;d e `Ykߚ}G8t|kT|N"Fbde?Zn^-\16 d}]mU8&EMagdۜĭS)rbPعQq{ϖ5ف{Kl |i[e7Xv# phsLI"_9s]4@qs-Z9k i?B Ru-Ha}.q7r1Ts&rƌAXxz?TONV g;W}kݸj쳨O@T dیaǸ4ӎZDR53ۄkG̒VKvay[ lYNwIº)=(F86i<޶RCL/g!/_3|GF3{-+]5crFHȥUc|FKra=K_L~)Y[fnXJC)09L+0w_Z5Dz VC`t\D|^mjkIc |[DY s/obro*.cyyͣtd#cBW9N̵#2v4Ē8VLNCtݿV4^JK-}oT+fM']2b,,Zs"Лe~g Omf>B!Dzj‰;'X\,1nGѸ3夌FuGK}iɌ6n3f'={a+7ɡZ܂*bëtB! 5 K>aYS=aa _Վl%lx;qfzLYl0V0bZv*sb, R)>z(¥(|'EDK9.>vR f wj(>ޖcSrFX~)lRơ墛ٕh޳83ѓ-].yXjY3:,f&94ї Mg6Ҥ>#]ݲb:ֶw׻0|(WCo ,ؘa΢l gŇ "rw erݪ0^OĖ2 (݁{^Ma#OaHĦմOcx#E4F[E>, SvCE 7498b Eᗏd?=©\m!Jd6.\A_r_CWm4w憺߈Ì,knNv;_(*qOOH!Q(4ƒ57!yXUk?HMP¯Fŕ#` Ďp F(ө؛ n|UBֽwi6CBZM-x!%/!ݕ!<`reDr[}2__9^Di?s /<ߍy2Ϋs){}cI<«L[X05.omJb6å9,fyF |MC^:]G>@f6WDF{7'(?rH^~abQ[[/)f r=z"ǔuF]8I}#.&̝׾}W˕CVȨ4t!U&5m^+71Ce*LZ0 Yt?P -# maQm!,a[Mm BHiaY[9cAltЭS+??,- j?UOO=e冩ukmR^pRFJhgrUy'wpE}]s%dYyZ%o>hd(VkeV`'o3IxO!t;Qv_e~dG(@=׀)DFعq8Q(xQ3ѬZIڛWZsy]CmNeɘ,=)y"; 9|[l8:tܴeI|lSE_ p|qʶ?Z zDg̓,<UVl|d&8x^t?A ,9Pl֟\5.Y3> 7!QSʿ{x},oV{ͫN!yo7;o _rBY1t<wI(W_|4ZiYUTPA(?eRoWg־7ڌDc ?D8UIGD @9S(mUnazZƔ\;y;Lw;;A.ff5R+7YoGXa4u*|3 1?3 ߳)v亇CD7p$`{71.pb5M`2jhg,<7bĤ!0aCq>b_*;@ŃLg]Q=3S)uZf۹>H/ {*d1Dɪ/*#TV}fzXk~kiyn~C`9|qRAbR4?cO*Z`uVdgzתU?;m[O@s4>Z0c:t {_1WOnD#kN5ICY4?ݾshFF5>T z\}?z C{N t) m1Àl^=m/5aIr3=^+lM SN=i@,4bMa#5"șND=2lS1'!ɐ>:w^T>":yl;$#HlwRh=Z&σ h(O:1PȕC)JmY:b*#Ð.D<*KG1W#qYLVvvr)B9rD @9~]NyDp^,&r!%w6e'y:C¤cq ̡d=BF:oHHQyn|F}![0!`

nl! w~>ly(Gq@q|#L0(ǟ8 =p5btrܳL nY>,-$|93nuhŐPdRL.uF=G `2dupӁQRbi{"PيhĹ~:yNpΜE{hN%_7\ ߄@w6DÝvob9Wc$6:@_anؿU5~dQƁ3Z,HZyy\࣪)? .B\T~V3˄eߡrlQC\V˲Ňyl/?2fR{?EI LJ$N}{J#]dsp/uOm)G!gy\LACWb3Ņﵐz™Be֤58ء290"YVCp0W9 dW/j1- .tJ,9=-^.] I*ȺNoYi1ObjJnZt5t?<3gyھp) JhOCøc10''?ov-Qf >ZmD&'׈ӦcaRq/zaHY~1u,Zv-JEebB 3m^aNliD4%+3߬ bf1ғ֙79XO~.tg- yqN?u=zļ3<L|əne%Z7flzQE;@Cw0KTrVsCatC"Plw9|>s3 & aXFg3Q 9(6 F!ÉZ)J5'^`cy?wQ]KTr!D?KaqQ7qww Y?&4M(}ı͸NCOdN]F9֜ Œ;7ث\{׿#z#LoJlj58Mm cXP2|'ɧASрߜJbMu*O@{VߺJE"_ɪĬTYB84XDFhTK@"Ɏ$URb{0+I[(uR~zoPDVT׍i覒yV ղ)Օ)ͤ"b(Te7fqBrRG` m8\Bep*^܏򞍧n8l*E4qUpr׹Fͤd V=Zu=P3Vk݅ Y{ݻh緡\'4^!xrt_Sj-N cn:o)DvLJA-~t+`bp.;^1vA;uT"e=ڬ+$:Q`r@yVL]]h}o_.zWB) P:ե=1nYIxkŌViִՀGֲư?Yush(:`vj5 @Ao,; X ؛ I^+VYqVCrzz ,(:/5.tN,cvL!K;V0쁤Dq^֬WJi={ OAj{0tLN8a7S#(HB$EO!VxE*ՙM oKmh;The5=ySM+)B30WI-S{]X'CIoޕ:0Z( 7pÂ0PK?%h-*^lv{h7HP2{Vw;'Cg7KCRJHM5–6ZdTM2ʾ4 C#DL ΍;|Ax5V+ax/kr3g9YaÁ* Rd5N~=LW")9n )Ʊ7Yy'Ҵ9j-;Bp .6T,DJx5ܱq:HRZg24#m*m$9]bt?!;0ʒ5Iʏ7Igml}%rZ[#%[xFT&(ǖ]`q[DVW昙x_m%'pyM,.H:֍NBT^s@'X MIJ7 ˉ{,u|UGwE5/"2N5sA1, zΚa/*3OOfBS2Sjs։ZKN|ēXb }G$.-)9[) 4,XV)LHS*E+NiP}QK)x (<!)s.N,Ŋ6ϊ:!s>IN2(Ndgc.Va{QN@/Zg)d,b9KYLTz"@!\TuIE\[5kB[Mczy*sg٬8[soVӻx m[X,ua| auKnfO 1au.H>MнYp3;p ַr}+zZh;Hsd/%J]JJcs0s:mn:OanZr1)-g\(-x>Up)BA4.ЉgK ̯ rlg ˜ƨF@<э F8cy飭c[x5uWCw1|*o o8yڦ".nX~]3'X f$IZ"|(~)F)ʢH1>լٔ<'cř>SY-Nuh vasxnAe5X]=^%yQuږ-߯}H[!چۆভslLA&EƵ@a?[঩`.VRVWk5=2ol3~v3MsdQ;7|iC50^ߟHǜ;䜳'.gk?Zs{(kL cE1zRoƓ|mhvҳ=Cn+BFtOPE RZ< z lYs)گHAEգX>g¼{][Y{ UJBW>Xdn/ !G| /3X&+Ljk=Ҵk޸bR zcCɞQ 1MpQ02= 6N kdEOWfѽ0Ff`Y:߰[|KS3GP@ki\'CBUuI6E1E5 '%ε``lq @ŮGDR, 9鮷KYV傡9~IeRx(Egeʣ9Y)6@.L <|i_q $qwD~j^ 6+ '1 M7_qVY 9na(W iA)}_t>挻.j AxۡdA&+MϯS?,- c?VO~%;` U{/7*U8y yU1ݍ1A{w\ɼE Twax2~#͠s@+4V*"jFEw #˸<DZ75C=*XZ0O1qCmhI8 l07|^vwl(W}eNhq́}%M볱-)ͤ0c4ҁ|wTl%3pܣ$Ѳo,. A'^>_ pF?[?vE9ie"Q qՈ&W냓]&y_Vkmm0jbvZdkte1,jK]PzKB܍K_K$UE+zgm)U=Ӯ^%aqV:@L?&p=Ќu,ft&؅0w֧v<% wÇPs'clMzlʳJkE^/֚'~ }?b{ԍr}jKj{rPiʍ;8"fkVZbgr' L 4.[dݤcQ {W0O?rD#kRq(q7<1;懣}m7hӧ|n@zTq^_abCS/fS/(qXH,&9`5;/f9LԶ@#qv|,@3O)Nx4^3ŒVܛRR`F=ȝ\!J9 Saw8.\Pe y?HIͿj9x]@f ,cG!7QVPe@ϓ^NʵfϢ,9&%%$CeaGin)16; Q !Α iTP)wBjn؍3%Ҟ2 ,icKE֒hбJD zqJ } xJ #Mh|1Gj{\^k\҃H$퇝kdd1Ceb<;TIrt`i2MkE3-HJ !x? F`{]:< dr@5@-ؠ%"vecr_x?L+~~'#[U. Da=wኍ=H`;< /*c<VQ8~%kg?q5'n$: 5@Z6WuO%G5/m4򊸸DhBA$gH>rj ĀtLp)g ~Y,Uib$l}*ԻQz\2!zQw]xRy/e3k@jP|X7M^RvЖ _]]Mi?CTѮNؤR%?*bUN$s6Q$Gp3 ;ʩsΜI)dF#T-j(6۹")[h ~zK=uZi6tV`_1Ћ=bBݏHa*¼G1>#Ճ^)qqgWjߛ哳eO֓'{z_&c_lx㓽#ivrʩ젝2~Pqx.@L\-9630Ȧ4Tk4coL; kV\RbjjFOZSFXVhHh=SL`,uٿ9\(1{sZ9WzWel9gvlvS1 ^.l[9`d`&ZݭH4[rkm_E3FM|噙92Pi㠵c,[[r Sre{3i021rO|6ZNiˡqwZ}~0ӗ?x)g7-^׳k) LaSN](iw>;MA#F U'7>~*yԴZ^C3QQE`GT˓aSz**"dìq\j~,41sHbXiT< C6Di[#\Q4'fg pM`/ΜV)At^A.]@9Fa`R6 l-Sڱ%3X̳j YTT!!#ۙU" a^Na[OB!FhPZFE%CՎXُ/arݳgKwbJ-Ι$'ImKV,"ǁhFRSu`R.]R]@jyqL' "tDNJ:izY^u4p:[C!&D@7y?i<*ocyL2HPqHx12S;OHu,рш06A>díkB(B=$#1U8/1ߎ鈎~x[*<~!rEԇ=Ğ~/Ec;Y„PӈʡH/+F3B'݀00duҔQI3SWO a&,ĵUA |k<x,璯þ -Mh~J0ǭ^&PpYs[a@pVT [|8ȖH1G_(笣SNS#ÉX^sjf/ q:7@:86S220;ye#> @/=t'aPu Yby!Z^zty~K;z9ij/\ɾO3]ָr@s;k5BEc}ttǞ/h2"l85Qb5pE'MG 'KVQ>ð"b~;vQF|VT_ris{V*[ӟ|5TCPVH0%3pjyq2}#BNԵutjx2{~XR6*0-9%g2c\Q'%RItw6Obzi5ݜt`twlߦG7BG{ 3VL<{FK_&Z0RDD={Q[ fI'X!j6Ð8U->G ?= 1}Jt%c:Z,kclS#?N"Q: $Eho'=V A9n\_R=mg> :9MKC8)z,8Tuz5'I\UNo'Tk[ $jg gP" >jz6Sυ>DzF|ّc`4<`w |ndπLn5J^\<)"A5yt XX٨6S)r0 ciB_g_9<6۾Pfb>hkZ50_։] l-٤593dPxLQX)?uO-[ <@`5})x֘6P#b@0JbN,V*Y tC#nvg& 6IFLJ..8Xe2ř{82q*4Nud tļ|hIH7 U, ¡ϋ*A΢ Icox=@o:'by̖׃.[@ ly #Le`0+M KG0ۖQSc+D@td4G = \f֘|!#34@QLBUȌ.z|l wܖ=Nh[ \yBF;'d2 .OWew6x).LmR_<$&Q (B4%9lD}@/b\v%9H[S4n7dnJhMP}NGӧ{c,p$UZ35?d7(nS"$lMp>e~sC8ل`f"ؐaI0IP/KʜP7Y(O9(>ros*ktwW⁈ 7 Ȗ:3(l V5Fb{u(sj|?b~d$AQ[uk+Z:I^%\UC ȴYR)RN)υbP o~geZL -S_<"x+r84Sw mߜ[hhñ}(*?zxYȽ 2yvUhZã廊iKRJ 7lf ҅y7i6\mb3=<)r1v &Qq"ؓr⨪踗§`QwyD5 /Li$0b0T܏o RŝxKqHoc74J,` He]0Qo=|y7iB>jP-Kœ,D]̺D+y 6|2Ae(.ܕJ %ƐpKhp_@ucU.ER2j{LIzv"[(H8.Lb{,6E*'ű J_,mQmvN,oTTy徶`f6EBg1!  'XWby!nMU9ZEiL?]xzFF :;<| W7u !wQs7PCevCߢ5]~37Z1dihp[H $peJ(c*D$WS,jtOr:XЌ=c9V)`hу3?F/j=b,:+61{yV?jۺ2AbِaM:hxQJbD_$?@\6Y/HJ]">D+~C'z&89F*-$H~D"D UџMȴ̺P'e# 6AH{w sFE+ 'jM^$Q/^EPHxH-BO/1\|9B0ӤM=+Dn_/'iER]4д4z8] @ȋb7IMQ7}Z?U?Njty28a}c}c}9~܈i(hR/PPd_G2G^HH[ lH߰2\ N n<948v(=.8}qXgeҋ ^G]e<߱h3>IFr{7ZQ`%b[fH Q*bLn~p`]m1 ]Gc ̄m`cAI:Rd #70;o4ˤT\솶\sSV p{wrPr awJ8b!rFbLoWD>6B"9`S~:h:Qڕ\O!Poj-ۼ |xGi~1cDa@[kJelĵ.-%vs']D^&z9-E҄!ݧ%W[vZGb}zXm%bl{sN~a[{!GSz&}.C1xdޠ-\]OMp+ze*lXN$FROwU.P :$P)>YY~.UKɽi^yzXN`Vj?o,H'^ 'k#P=sUFbxoBTt7WllAA޿ Q&Eb* N?SCw>qD[1l0#M BZrzy%(k-VҎfmh[+m_HaD;!'wya,ygyȺvr#ЏԽfW%@agS}578 ,ǽX}M3Cy #Hz|覵kN$r=%_4&:#dJ##lb!bNjM$nXtE&Őܢfu|\Y*JO%B?OB?[:#Sɠ(z \ ĪӁB1-+*%EЁ.Tb"e|!UblӰ݅'":"TX[Ee h-az2_/l)pStsEŦSb])B}ї^lO碌FV^ \\KxC~g7 LC$}@}0 $w!UBYCaȁ-B+s 5t57XjOo! "54OgNOO8WEYQ1bS}$1%GU}HW*ҭ>~cGWDr೾H}9DhEYA,JJ\jYRje76\F#"vdE |ko+qPC sI( o5׀{K_3 >F)eOJןǟ{|eC@MJ(xjx9d27jQD f6JOG \Ә'x:vG (|A8 {=C3R?+eAbM 7b:Nv~81F^RɉӠoT0Ԟ{0FetZ h-ػ 6<(UoyrtG7  %m'Gi-ӉEcŻ)(ZBvNGM ]s:Ɏ_:*LFO/R?Kyb͉ & $P5_^׻ \T6qgH6| x1"?>D=AoV 6P?hɢu+t0Dǽ㈮ hо7nR8/Xn^HM{l}|;<V ?x7=a (ʱ2v A7Hz&\ ;nMT,^Q*eVkEdTyBr*?,"yYJ?O(ʮQz bp} #P/p\5EsE)jQ |?̦LOZUX̊u-ׅ?oe[knU5>|"OK;Zޣo.fMp}JtqZ B8֎vhhѻǕ`uXagoUAitLۣl*,Z8 Wg'C!'jѝ}zB3?W{!J+c9ـ3|OOVVq#TjԩG~GNchF[ Ubf_XCo -k?D_Gxel5ںpR68)1tMDB uX(4I G<(EXa d kGμ NB+R_˛1 2Y4b ܸLwG (΁󭼳VT,/B[ *h3MA%)6Qb潜hC[:# ;r.;rެw|WG-">tSހb/x;;?;-zvuc!%2|}LWJSo{+ +ʢ2St_,Qd+BUﰠRǿKlp5Gu\_ zrqڮjG#@7[=(E~jӆV~ 4y–cR$FNvagJq.eK7`ԨP:9\d(%U{ ߮|?/v#; R3byT(xZ43bΓӠj AAVfEUHM@ Pa WҢ5%e9XκAn2i4df4W[d5/SJ Dn1>,0c mG᭤Z[\r8(H.ҏ)҂k.μQx%RKE5{vJڼvKO:Gp45K[`, Y}=7OYTKZҸ@ /̣3<ۃ,d()xN DBh'8)n 969""(ۣw!(rʱGP3*u=O'""sӡNXx#Մ8`LM KOӎklGs8ovіwN[)zI%o !ON 1lBj!ÈBvx]678"T]9yEN5Pڞ1N|F 4-w%M|fN1hTMt`,hI]N3X䦳XCa]Xb`Ĺduq0@/J_} SDw̗uXin { 1i)\#H d(~翪=F}kwfyt~wqYS~cm,8yE=GA>Or<1}O]B6C3;+^: |F~DlzMequq=#ӗN-eY ELY:uKUpBX8J~lE(Q={s6БBV'U9kN[SCF)(mWzJnj8>w!79`@ZVTN"Q9dWɣs!<;ZY0&."nLu þ |*г4GL)ACIuPp*<# <u4ʃՍA`b,@ޚ@t r{Ξ'\F-uo)Ψ^k QcR0};b)"i)PA)Is|qvм-Ω+@ujPsn | n--Z~t-S2xS%C T; K_ ^K^b^c2``O{"V^DIr.('vMm~o1#i t㛪Nuu/mK6DV~6I _N(ҍSmH\D)I6EK=JUQq!Q.EcE,ׇM.E18)9k׹^㇔b&!A 0Sb[U Z3mo,.'X%n~Dg܈gHe`) yK-k3}*\])Ni UPlUʬgI Zүu%ʹE(Be\ 2 uJ%hyӣ(D `ĖXXqX0˰AvOq"Mh9 t ZR'2 b|wcbm ooYwapauCwwUSjIbDrP,G [lpT6^h1-uż*AǙB)T^{&:tƒ a|: rq+0>T|'}(-.fx䊃.yV :&ĕ5j-K'V(kYY)[{6+҈YjM|gR*MKiT'{n}` =KDa;5>t0e2X)c$8q\f"2yK.#'eYʘ\=05Af+𺼨w?jP.F M-0bY"uh@}YU۝]`mO>md;@&R+9 du̅dŢ4w?F|#"5ʞjןOj/s3kEu:udj!$SY\'?)__|)+!P Dr@R{`'_RN) ,u"ZL& J1]sT/Dmyn{+{ /{b$&أn5Fy,KN&D}A:v8gC7!}vX$!"Bu5'LC:"$Yy陫Qlʖ%p$Ial:F~R;%Sb+Qڞq-ݧkՒX&,(`lX*'ZD7 횟ݮ]KE)k~]C要pt n43W->p(@'=394:AP}#h&ZMsvP7 #Ynb%Wwv Y2_u>XqH5F- Z,|k [Է<^籎rDv6]I~֊f<}.ViݺPtds>ٖ1W*EE;6 fnMթk*"\_iZ}cNzvA[cQZc=Vm.hn>E\[ۯ_N.{T{ꟼ}Һe;Z6~|J?ھƁ'Wkq嘦7vo4w)}38as~CZ #O, ]w<ھz.nHAIc}[wb7A kjV..?]t52.jS#d?:Lk]{\[qWxF-U^ P!)!HfԔߊM- lT+Q5nsF,,f]լ0]㶠/N AfYg<0 @̩=+V-劭U_͢^+;#(t,T`'a̾j*=?3*b]wl{KB3bePLoMS3[cs* 1X)5DqI;̦.OSU?^RR*KR,n8>2g;3JTNT݅tiU2׍QT/t-/f,{{4nylKY6KNhKY/|c\^rmX|y)"8KK;^^^Ϲ혊8r0^^J~^RƳ3-/EG/ $~dB贁d/X;&zK)d/sy͓ ^^z Qr:ם,iz"cjNu!OE9\xjWjͤnE_q˖ΐln4s{҉7߲(2#r^66gS%+Te!GS,PΤ*e1MZnN%n E9䕎&e"v4VW@e)w7gT4;IѕzSϨ8I7V8wЋQ[_DWvD+:'U%8T ePsvNSj}S·IDէSFʮ!;Tʹ11r5p}Uqk5)[oT婴E*cRLR;`K=0QZ_.*JΤ+l+ĕOau\+k ǯdXj d̞{%c P, +*0,KXɈ3d[Ɉ {+k엌JFtT̪{~CL.RW2֨ϴD丕 3|/EML]p*cR_JK\cf vJ=󒛜>`4`*gVT&94K=cd9gs,uOKپ5ҭsd}[G_}fL] KQo}~v_sh_0l,Pmx˙JUaXJ0_ %F!kɞ+h7Ev(QR6H 4%EL ˈGKYبOy- 1G#.hĸ:C.l1*Dn’*ply7oa~f_~[RQ*ޞ̜XTm8`n1Jb*%MDQ- H5s=HQb<,K HWa 1HO\J;tc9Zg2t|޾\ i~3xٲ63'zY+_9" BK<3gvsI*ߙJQo J1٠;Ǧ=6}ٸ~&OM SY8f&'j[X51k`ab@< 78WNNmrtt- ^H@j 9䲓NQd`VrWU% "KDW/Ե@8+pV")*4+R9W8+pV tVJ鈥J6`"Xˮt 3v1-.,p{Dl2d&diuXx&'q<<>0x7dt7ްٸw۟LO3;}52Fx6 N妽~9i^ް7 ;ND!|r߻e~Pc-(a#(;폆yc7wC5'JγјSl˜1& 0w4'߲=D ~S& /J}䀕rUnv>#K?<P8oNho!WR?w>bKQ͎[.ʭNzuVny2ѣY(#wPzۛvIȃrp_{7Wn@SŐ>d+Yc4&=W}V<Gϯɫ5Q 7Ѹ_vXГ߁o2 ėl6eA;@k=R0dGlJ+>1M lҿygd!HP<{<{sAO]L~g,}'g)) >>O1@9aQС١QHn±@AX^h4V&̟*gGuTMG'r'46 2· m )wop5Q#;r@@NQhh04OА{ѐJ "^Pf(tQ;x5 Vw6\; C5wqTh; ƣiB/l0JLQ97z!˵H䲕` N;l\Q|(tchW4Ahp>h?B;V _{X݄}596UT` Ej\5I n(8VSc򇜗o*ƮNvm2hTZDbf>F ;y<`VS{ʪKS 7w:O~ ?|9}KEvarEĥu,!G/M/xBs4|O#r%s$ jQwU"oH7]'z=LՃFn~[4Lne Q+fB==rI@d b!޸hz$< +201Ϭ7&qN&ޭ)7d&A"hl>" r:&țn]$Ǔ)7 LB+-pz1ΩzI3sTOu?*gcGTTߛҳCyaQ h?)Q({>7K t܌-z0}-z5e"vԄ Փ/cQU`kELiS˷&.ݔ%fU\u[a"ka̠cW";;<;}*2 ,utMQ^7u7i+ wB\o&P:f]wXeC)A1vz A-1e \ĂqOט쭅_AQŢ2iorySn\[e0G@r #TsYXRaFE+JkbYyv[]ݖ2M(p BfJB@{v~B2.ZC޷N/:[NXwPlxfGkzR(~ o> o篝]yqʋ-,C*x[f8xG$ޝJdfFց0Inp ?9M"".b!m}f#+S }ӈO/ӗgw2@o:w[+$//?Z)Pqvq#ᆉKrlzsV9 $T]`?>/CǗ\ӂckT7d[MGm8dPd#3ש# B:D,k\8co+"'CZbQwvT%v n/[28|On H' u7l_%gR9R7۞?aQMnOrh}͆3pVڔo!>é5ҷ` 'x~(}ϣѭ:r̋?/ώ1?yv?!rߍ7l$p.|-U1";>)g3Ηt?"@7&4=0nB"]"Cǡ Y̿Fv9gsԻt帽UcAdYȮ3U*Wm OCAR8' $1=o#l >ί5^vU{V:o/fkkG`Zf;/O)Z5M,\gSl:Q3@}`֬(ı!UGY}j )\n ɛgv[#2Kd9neue"dzT=y%3>&JazgOW|`D: ⩵*am7|_TO'A`N'#1l!_N}=vXȭtpFZY);(f$זj>Kl'mj147r5\rSmvd3ԮffЮ ҮQP6*+՝G<%zǸ;'wfs1F+D biTahi?V[ڵwxq2Hc]?k5篌Y=o\}ȟk5ȟ z1?vEh(x1#}a)ca?2|8, S+'5S^|O^#՞7bF@7G_ S.6t6S UMʀ#m4wDu܎eS&ȴL? prxQ hԦ%x$G?`=FIYGXڀhQA8ZGx, 8LpTo8z#_?~ , sAQ&hbHQl)Thi[c46ZEN2`arH4} zPFLSA8(H4oij[Wxqi7ޭ^V7is3˴9#<y)דGb\l _+lG@_*fēJ@;v9 ;neAA\ cl:Ag;h dr#j٥9u`ht6  4if-u&LajK3er#%CS t{mg11s漾sgsAmdKg ca 9o :ƪ=h(E|a!sÖt.-/vs;/8+ i}X)+#3[ #PFBe浸-\ z^9CrC^ITr'8 q=JkOFq RG4(+ʥs//7QEpMD^)Ƿ?<ŝ s˿]eV?vKVXɋ qZ˱|Bn١ " u:D #`A}q51!qx=:݌pCR7LBZnިfƭ`f.찿U%ʂS|9gܡRf&*-h?;A Z PsVA*VCEb54Zp ẽu,}%؂MAV71)^= %\8i=6cg͞3%Rˊ Kx>aL ւ5UT[(<%&kA WiidobJk $׶ŭ"жCd#˔.}>lҿZ!m~-oޤ>&} pS,#H`Șgv1 caWtY'knUFTbcc,iALf@u۷XP.nlrWXA(5r$&bE+ .%&HRER.K'lcwH/U*x0ew1B.D$E4SA6r9@S_$0LpaʁQJ} S6ԁ yrĎ*%dm<>G$Ci@Hc]bTk4xh6-.eq26o)i8pR]p.>`=5魥D|F2Y゛?Ww0!R~pkoFbeoO((sU|Ӑ?8Kw%ib>ΈKg|hj觎2B>̐B>t>qȇd!Z`IxϵxV{ +{A!됏uȇXih8@d wXc,/yC=hxAFP3#ԣ1g4ql: y8FBǙ0'ނg9"G䀲['qfj R؎Esz+g.)c;#. "ʩ: 0P cQ Pri9\jC:5&b5/JuohZ`D {1 RŠWdG=,o]գpq1Q1,?'7<—Z7ȳw|QstJmƪym ?uq _vrio8_2a0A_y:d^\kp^*F9dֿU$ox7n{>c=ѐ=0+ G`LQQD> ʼnmwX-D2X<\?a& A $|ؚo k ^N1rr`ĮA'=fe9w7=9fW[yE,W,` V|i'wEPD/ypw5H=#r1V# HhDU+T ܖKoމB-a.0޵9Ps59JV[U+ >u3.M%{v: F4^ҝaxW5Ēw%} + /m/z)E~IدMΖ-h*)Jgl=oE4YrxNR9]iE08ޏa --Dr~[l<0hP"55.!lsVZ9;`7Gr܃m8TkbKoЗd-5ൗF]M''T xxqCͷ l)IQӺ:Ҍ6$ьKFvDCʉPhޝ9xEՑ a:#E\VcqYVOs?oV:4c1C+iTf ?WW/i &1]ZJzx!/%OAɋ'2eq{BUTԲMg}{y\r18:9:[7>(47V,1UQ+6= o C ] q<@YIEЅڟP%t&)Wxܑ_I\qrI5K7JP sI}&O;S/^#H/5v<5ZvB.A\@>9M1of&ЛZ"6]/srT ƙcqŲ;c,c A`l/MQ<&Bi۞rc]'&hA9l/ 'z tw"㤆cކBxRa\5(Q—$T~" Vk$QQ ` uy/ MH@q%;@1-fO3]>4*VwAd2ՠ1mn^K^ꘅ0>]'P$艂g yi,|c QuSB4q%_XXE:3Db%)i%?bNP0xZu_-(~ϐV"|1xcW(tuP wCE&s[LU\RŘQYCa٦,J,TC`LXIbCӾCw5_Wuk3<5=U< Zuúa]fXɵLfMpۓ.rF29ŕ+eZђ&F`v{&PGk~ ׫jfW3fdB`bMU"`tG9g-tD#A1uE/Fb,Ey"MK9ⳑ#(=BT|w* 6JOܻ1y۸EǼp8a}&ޯ\Z!*=Ťjrx/SM;(vhN*)SXa՛5 Qt-1DR01N{eo4֡QQ1P5vq1@s4IqT~UgCnLFvrۏ6V^-8ƅ;8܈TP]*9^}ᛐhunK Jo}w^ÿC\k5א^Ck{ y!{Q7@xDh9[P7R9GpAJoCCz`C\ln+U_!opPzWݚH-6Bk/"R )kS D/hwhiU3uP/z;b? $=)+:أ@, a$<:񶂯b8/YJCdN2xS#v~T9 "O};sNGwyӡ[^]WdݠPVEm͟soexIGb&A;Ұ,=#;)anӷs2v~?Q|%B\]ݟ9KvΒY {=_KkAMWRҕt%o!0iffo&0v]s75o'e6w+$rU鐡R) kM){v=sO|*ǜ{ޯZ=%^wT(Za\a92羢j)+Q5/=5OKays0/5h뵆` un't @(t(^K5?sq6p|m|-sV MUnh0k,h^+^P&/ L㟵Z[(Bs9eжϺ T kSJS;TP|}, psw=:E8q]YY!/l%`d0z `I7$G?mr2K(evP^c/8 w01~k #H1ɔtbbPF )z3wtQ+1ʱus4@SI?! q_pSNpUv|uX͈cBkr4'9u_ix_ѵ,Hͥ!ͦ옋;&lt-? iv4iZ unYPz=ǽOt Tgwc&J.keQ &tY̗,{FeqȲt3v24c>i3j9#`e"RmXX-'/o{Mx919*_ zrņ,߅ۨUP$7,z8Cy\p(Ơ3HJH2z9C -. !ᩡgűg=:afĎr޽quzX_Jζ:f+$9dDZٷ g+cNEHN 7LZjn2M*f۵FͶh˖Ig4iXPEX)ʶo ih|J [ep1Xj?±1Rۺbo"T7\DSc lc-ٔ> LoR9_vy{V:k/f{\sF|u| AXW%j?娭_/%7Fh2;Uw Ǯ:_nX ĺ;<+>EZkk9}m; 1ÂḀ+%*=Mu!qӛRM& hC~[Ca/Nj.aM{|vD .Jǣ>\ΞD{ד[bOk#Pot I݌\X|{>=,U4a5l+qZxfBYGgW Dx`WC  le,=PD`l}b{Ȧ )c o*j`k$}⡖(SÙ̯XNm۳E==LM7ōtɃ=EäCIl7g://P:mx1t7آnޜëtIw1ëI^mkz!liM!'’^aGkHNwbQTI4-f׊Lfg)P 3#<Nt #&̐`,qJGS6?L?'#=$ ܿy=/..sz}?8\e7t T8<C;0Ic;9概O%DM@VQU02>q<݈Νg{@,ePk^Squ\Vt vrԸ*41ki9#pan[h鰫 |T~M'x _%!O=xlTx&klqAg1jCt+`#,TuckǃhYuٷ/RA_$94VtҟC+ :kJP0݁@KOxTCPõvyy-ӼV1,+#|__usI{{CAg^/Lm㟵gC0Ls(?<4õXtJC-ʟ/ke/v? AK|Yz[[%݈ev + ~(1pIGʆm]&^Ghb {}aDu ͝!P>07)(' e+y cIIzӎbigW0`٧~&9$J1Bk!'(cDW{ FwwAIFQQpP$fSZt oy Y+A('?@mbgzuϧW|0vXf)qo:>݈Ǩw!jCyc ٺ 'T,ʾG4u$2+$2 HF _ "9>zw<_yd8l-Rm5#tg>̛`ʼn܇J\|xt8_lЮ>x$]H=wV<.EXy:+v \ OPp\{4u`h&edfN3z͊J2 3yMRn_@3YCM8P'Vӆ+ ]D0ʱo$#oO)*Z p)E8Qx ;r&,d~?”iP%\4Or!zh:=I0^chF9S#tŽKɍzɕ|E]vE zj#*?I%ޱ oLii=%Pc:Yǻ>ݳݩTrEš2,IVlṆ(*\g˓"/$PINJEd2e[͊Kx59J>yPV!V& ?>pAQPq`KN4,&"HD>DYsr"rr1~\E)N8|̠1K|\Lk0^HTyb2 >g//:bĚ- 3b34=UivMFʲBg K7E "U@sw|+'gYSzMB]ŸzȄeq n{qQC+}uFsadX@ rz߻H+_sg_ͧce"Ǻ.WysE_`̴7i~2W꙯tCfߦ22df#)vŪ?0G~Qj *.yt_::J[`lY?. 'QzWuMu=id{nP`Nso;Vї(3xsi3%hM9p#O{yXd~T<_i}ǪÙȝ:ǥ}I]"q?TB=`}'2@OX}G|M€,V(LĆ tr eTԤկE8J^K]T%3 $-sUh]*99\ LPXiMޅ7<ؚy8CCW@ai! nT]yi$(AP!' F)z[bk>tN]\Us Е?72w&7`\ r*$)9̃hX_> 8: wm!K1Q̛_{* /daQWvguPE ܟ4 s ~BlWzzGFQ(:8AqGZ%1rTԤXί ~J&P&V, I Q-^3HP)4Z_Oo?"[Y"vƑ:X\F:|Gs<(sof#Kȿ-dM'yik86LԃWp~4|}ci F~_n"8y0Iw>ڲ^n %ɅY;6 CPnŵ#SO/#I 'uu9k쭤[*u^`ff&Q8i/CҜ]rf79A<.W9qNTg?'sO|s2,g[.p5sgNm <+<_I-PuE8NI@P#U('Tu8Y}ҵ7rou>k;V&.HsWMef"(\..I*AP)+]2:^'r'y2O#L=`22yG|N&9g%|9~a9,?1')ܭm3U@\w4dS!%?U;b"W,RRҊn슥>}r7aŲLO>v*ׁRvt#2 ܹdJp+j=Jr\ EYDdV#G4ثc%&Z 5+Un6ri\ĤT!IԢ]v":\-/[xDUm-b]fH3biqsp4HBe5gI ^(Ą0 4l](in֦3 K IZ5,,#:F#dIH4M4YӸ┕b-X5bêLi"]V1o4Ēe9i#]p].љ }04x͝"iioCj&~6Vsj<},+Ib{ŝpQ=?OYf 5!Kz0q?aqǻq&Mwd:Oqx52Fx6#-Iqw.f@YY7Xw" y{0~Pc-(a#(.ko<̇jD!Og1u؄1=bMC[D[XZvB[ w7E)wނ$r#{_nh8_{_{CϚ8jUBr~V|Ė;ͣvX][zbWQdD1<F޴LB|[vڃn]p$(; ?Ta+Yc4sfW}V<Gϯɫ5B݀ ݇`:ATm0+_a/kIKb.+c § %C)L~<<7UMG{u 圍Ol !ћwp(=02쮋˖iJbaUGMB@W8W KI\iuxie52S2WUY"νĞu莼'D݀դ-B HA&oy%Kܒ|yR8eҗ͂ҠtL&Y2qw| hNqbSVFiY s,hjjpRegF4ZN,ez N ~42y'44l 40/CӼMtLgc$,0nE|f93|jV6+[^VW't@&Kt3ِEZ hlEn=ķCR8-~ w \aG1}MwWa+XTIo@f7O`GHOJkϥ.z?P`Vu;L{NQ8dM x gt8ՂI -gh8+QT8АmfÌnjEar?,eUxX~6hc+qݴ lڝ-ms 0'`dfԯr_s*'Ήo7Lr٠CG\` %7C܃Fc{6vm̶-~S-ESFKP܁Zy Rtf`q490ޟ>Z*4A}t௏rDơH* AM+/t5; Y4[[%F]qC1K Xs0Lǣg}|>~(ut|:jVªb";.ro1([Z">-dސl$\—kF3`ާq r<g0I||,2T*{;|O/V+Q1#c;ֹ04AJ7#|Ы=E#GPP[yV;A:]蠟ݛe8V!9tgWj L 8A[?L$\1Nb$x r|{M&}|TDbN=+59% aMj0]W6FmBB2I Vn@h&!iEf ,c#xCcl6_nFJOɾ6bۤiQ!N&I* :`> 9>ߓI3m( ]pRmMe!UݯC%ɱbuuTo`OM>q'O9$_OktfRQ ;1%O*5z5^\ f'S'N?m#C(چn+{\p!&AHC|4n38.#-e))S#A%d74lkB;/N<7 S)4 p-Kn4uSNºE E95SȁH'j0z2:F3Iĺ}quahv'tӶ` L)Rk/OBҢf/4B1%A&h/txr8e~j,EPG@9=K{8V_JV_ŋK_%>>>>XuxS*1gh.wǟjp-Jsзs|tgotZ m `x\e#:o'E7c5qu31Hy{ byy7TO-І,"p縢KHKn -"۔+; ;cP~H]RSx`ioy!%kUG?6 a&̼6 $63!?łnZ!+}$q@6T8$ 61~\QhJ~)"Q96hzm>|yZTw|; ǎEnzF,8 {Hh0fM_^Yqk-̾A4sh!WIw(4GjI@Kzs$ji֔5Ra6-ҺjA-hѠwg(QYidUJIm9HBMϫ2yyOa&z zͣ<ڼr:ѫ|EsںTP.G t0i:9%hin!it/7ZSznTZT4g7UM"S7Mj!4(M/֡]| gwu׸[&@1Gd-^6ko)#-PON @HItKކ<΂%Pɉg7YT^5Z6[kjg[׎wӃ{vI@I 7?8N;$mcQ*|㜵Lc`:Or!7OrDI_+>Z<].9oOj6===]EВ{ۋ&<= +y &yBx=._9z-6  g9}^Qנ踶6L@)GQ/G Ah@=.QkP?i`^4ao˭rs ֈ@Pp%TTnx4( 5R_<G]ƻ`061]af&BVRHRު|?Ԑ=xi8&P[CE,J?SXLahp3$0J76b!FmG zww>0G^(>2vf}鉨ӳ <<<;}*2T шL`ࡤgOc )ŬۊV-mݼr|X:@lփQm55M$jţFF|뢛 l jwG驃VٻjWа|Woÿ`V\Ck| !5dא2_:h=;?! W{ *~%e@l[=7Z#CSEGP.Gb,%r Ɨ0SEHI9):*I>Oܗ)uُk٪dߝ}#P-遒@K}쥙 x&A^ȡG<偖@<5.~^az(K3y2LAW׺^)_k)_˔u^|xZ__õ?kIZR+/a &""\ZCPs,v Ӻh%Ѿh&h&&hF&hf&h&h&h&haoĢiEY"Le:w}E7}@qDCɹX”%jln56[oؠ-:/NqONE_f#.Eo66N[\3˵jTjW.5Li~ww~e&y݈bUr4xcHKiӬ%/}ߟ _Re3iIIZ҇/?̈́uvױ]DlŸH`ttWI&~wn,Jf|"d&Sm)WZo7RʈRrL/-f}%>+KFJvc)޳eHpVgL@_("ۍrۍI{1,.k̬fJ`)챴n/oszejue_JJn&=T4kvH,BZYnDwE3/E30IF31I6F32IVF33IvF34IF35IF36IF371cgF'LzQB(e~, .++*Y_k/.}e%:r̳vut-KxӸԸS ]HʁY|F[oF$oRעck1_#6N6H c7aU۪X_m/2ɋk-4?ArrM%c[ R0n4ݰ2TP RWIg$kq?$̽;BS+M+MH})iw)[MFיe𲿄ehV/*Gޣhv'!|;z $t3άHe2N0dÑj)j$[#_$%_ɿ%_ /H?+E?gG߈;_q$}J! ya2WUQtQЖm>8ܷy7}ß&M|4M\ 6ܖCشMOj tׯ (*\bp.%钱 +&q%ɉ #ykH-Q_k#J= _O'AZ fp{_Ꜫ-؀| X"g 69%*yfJiV Ve*e*+o)o r1 e} 2ޔa1+il"*T<).uCO[/j%1`)" rQoU'a˚ƒX]'.97cP]^4JT( 4PM!ΫV <3$L%}Lo~HzM<=)zZKӚ5ZJ==֒aI, 1'NOSV$,5UOϭVD֢S+i'd94F3C2Lߌ&/OYͤF!r).Jhc> =hW3Jg aW3 ć6v袇~'q=ܺx0kw0# 5DBC ]Chؕ, NGM K>A5.o ,F&dr7PM'% Y^s1Юwf[P  z-+l InգpO/v:Zq^;Oh7&Vn\+ɳz|,wvJ (鵢B[ws?#5Jƃ0Nz9 _\ð?ֻѢN| Rf9)w@yѮ(et>SCQEgK7w"Dꃻ|Gi6~5!ePoksV#?s+TOxUVʼn״)ӺȖ¦uz~͂7lXU5Þ;eDg8 Dc~gZrXnA!Mk՛zh>D F}.,c*|ti*4 #%P0t7$$$ e,L"]MV0mXl9^c\Q;᩠7Sf_R1%7cKE4/8k%U$0;RJ8yB&~j.or)C` ch&mRƿVs :jy{@~CD!N:y$'$= 116w;prn+JH4)lB/' lE^*,X /2O8P~(+~$HH2U¨߼:\n-!p|GO1߃ 6@^U y~_"eKȅ*Q`C 9uS :nC`u~ z'VAjP,팴rV̱Ĩ,&P" oLCPw tN&5c:Wy8z=ͯ:ɯ/(7|*tToZ 4"6e_-fxKR./!ىĆ>ube۝Yw(EUז@n8W{/Y H)ZDIZ0Ӫ&L^\+6YM3h,-'thrOilW/-ZL;%QQvR;$Y#]Y(WiHnac &A%3iVK[c<ßn`q{7׬JStݷ/_x. ˽mѡ7ݚU=BC#g -c== ^\ֽPK(NFͻ)MлHW"K}s`j.Gim;V1uT ?zSHWԒ]*Kdj*UgI9q-1yS#6Fkj|zW4'jf1kOTy=잨:*9ʺ\ dQw̿+z=y*^\USk]U;[%wj(,O^@n~'v1%Pk(5R3Tv:[ lI?{x$xeWK KOQ g*wZ1+i-o屖Z[d}ҡ/$/՗  J*;r$-屺 EJ[75ʃ(ύi;S]bdɉ&x˛~pdBBjE)J*޴j%1kxr2CY?_v |A!#br`5 KtB nw)H&dE*BVQZI)dJUt!érd,O> 1I6,O#KM(Oe cpV>5a 8j 0 t!m07Gl;7#NŖl{aI{ȳme~^?S=%)/Ky ^B%x %/G;m_ğ]d>w?7k\*?Cd?t1CtHN]tdiJ\]# 7ƶe) .!ze9]r$%K!z97ϐ*QC`&Ь`leyu9>._+]rmu9 I+OKԺum!ĝ/o /JZ?,MMtKp)4]l.oN T.y%on=qR vbNFom9SQ?ݯ'5v'r_;;fkgc:A)i_nT]>]`k4B} U7uI ;DhnkwIz2ٝ~MWXXEx=MWKlm=4乔N[T R9vy1J<w4Szo$f?ZO-qُLPCAmVG)R=uQj9|ŧвV<[sFuj9iF5AeiAsW%ucL7qt զR3-S~m~DYL;&ԷuF`/6b;-|iqrq΍Fgrzm[t`lۼDӒNk)or;Y'c-SJ}BxE„ʼn3J1,ǵF6$V3\tRӟm.9.Sj&YZLON(S3J>Ŭ֚k%[z۲fl0.~3皻qe]e6BPY0_ڦŸGe;Bb<ÔuwsER,#!RWq3V"K+XC;-q7}0-q7[0#WWaVSG3&-fi_FpF7,奄3?So izDh^#챉&V&VcZuܟф9G%FI+Fzf0{I4&F^d5wm v݄1?ֆyiӚ&ԿZ{ϾmZRJ+^)~ֵWl}^6V+I$Rbbz%:xY 2(acf83֙5HA:ĩOf#k$ }VJNdZ):Ѹ/(Gv/b`;r vV὎_JswcVY&n%O*a=ꙧB a$#"+lH(;/ (YBZH|ͷvOsaDo9D"ʙ0XCI 2wɬqmWÀpCLHI[PŽGPvׇko<̇jD!Og1u؄1=bMtahN e!}?zPj(?O=6f(ҳ[Vn~d˭Vޏ/8C>?f4Zշ\;%Nf-VfV^:+U}TQ(#wPzۛvIȃrp_{7Wn@SŐ>d+Yc4&=W}V<Gϯɫ5†|ҿ`_x_ҿ`X# t^ DMEbO_?_JZk偯ӗ}݇>&IW}IKDՋHҡِF x)1O2A~X|4G߾AYAYHs$l72:j5;Ictc]о޾)kX"_&87TTeHLH{)ZK{U'J{Uߧ/Y]駒䷆$s[ے>BGII~oJr-D+$ujƲxmH&z2ao%Ⱦ$Ehc"锯1U m䦋qƹDln3[FCkX~}SjAb\jEkL򦮉p=’rlsgEҥ!mn{+G&ոqj.ܚjE)}y:0KG>mGՀpD2=Y9wuޏ_&ݛ^8ףCJMR%ZGQ8´o2 ;<00I!~y4Tn&Z!uXw`ppDžR&Ls[j0mkЃ^c Tͭӭ&f+h-_^I $ڧn0:[6A yӪW`P Nuz7CjZdxIoB:sU{JZG?aP\Yͳw3>B,'Js/S&&鈰~(#T-,(4d"dR>Bx°Э_AQŢ2obȒ~ޔ;S0'o<a8ܩPZ/Tc`Y(Hfo@1r+h#vae2W۹ ?9*?wrXVLf=y[ /F(# -g'v<#u<; Ч%6~m׎|JC)qMc/=)ѓ=)hßz n(dz Iۘ@>Wvtng-<߭S<2\rw3v? z g/!r֧p:~M&}Hn4G wr%(w޸\ Q<,GO^& F[nh𖧥(3_}YI{FyZ6m 8R\?U*G%)/Ky ^B%x %/7 2Dוp+xxz絧~(SFδ$<ŇmDxZ7c:wtsJB0EL/W,xB}И\Th(4"@\](wwq S1tR0buG:l ġf FO шF4bPLɳ{ d27z] #E(Xg '!: zs<<>yh&o%}HjGM͕EBq$GG,5b}e UotT'uYgת=QMZ- |ٌM x sٚ~4Z$bPlD5xj2(z3l*8rhɾ`bu,*qu̒HO"hf3u<~q ' _mn|jXPwH4 !G2J|w i ^ n SeNɐSvJKҪedN4 VFNiղSd' )N[Kr N* * h߹蘳fڒ#V&9AЌJ`vȂ<">WCy~nl+8n~g>Iܙhosh2F^N+ZӨW >ݦX]l_7_ol"VɖT<~9ǚ]J|DˏA")!s!寀T< NDsPddWi(%Z2 lvGqrӹVhk=H.JQ|úcާjtn/F.;  !}Dnx^GlgQ|ǍfvyPӓv+zKA4bwX4%=GɪD)["do)΅:׿66[NWpLe"VQm i^K:K)^d69^tco0{L.Ԉ]X&+:P҉W[E\łK,E\2łkFqWGEELz7LrCY\ҾyV1Zb!qwzmˀ|syƫ3Kӄ&N%(]ENLPs0n+oYs+zvS7!nYvXvu4_U]JrzF_= gaQkk+mKZ4%oӋyN)Wt7Džq,mřkff|@ݳUϹʃ$DQ)vz^RI\L*e3`F2hz?R4KhD4hڑsfStb%{^l4+Jqz-T!mU8, vr|$g.?z7͞]`ghip"?= ]Rb\??V,Ͻs/&UuZf5Oo5vi6c2BYO kO :sz|  ]*#o>gA͸wd†T F^$O:0,U7KƶB<az6Iވ*8$;P@UptS)Gqh. ujH(1!.ᤱ$ļ.~ι oceYՁ1X[RM@ D nmΨ&&Zj!P$BF'2|IFq]F ~VN5m`-(daq!lZiN5 F檗ꄃq4W2QN@wvY|85(zN(ƲX XʞL9ƅ# 6kIJٞg82Ʋ@X_ D`}2ex ï:d؆_BE2*5>dlV@0L).uCO[/j%XgUj8*ivt2aYX29x*Ӣ2#;\-ݙ%GDAhCW5Fcj*|5j#)G~HzM<=)zZKӚ5ZJ==֒aI, 1'NOSV$,5UOϭVD֢S8PN$^6m$8/o66݁Q`FkPgAVQ+yJBoX`ItB܊&%ǠDmK7l7xS{IB\y'ނJ`lq]a3h_h!>ƱcwYu%9ftUr[4*Mu6tČ <鐖xno {"ּ xIHg1puɳGY9,cGBh]zhj*/{Illz"Y~4|4[[A$NGQx}*\(+ CeUPY<.F*/B*C qCp/$0<CI0DLqѹ  l)Ag4Yx[|#MԔiJyٸ8MhMSA/o)|^Z佼/&~?jwo E!D+3\wVX`i \rYp@.!yý0H;'n3<Ӷa{F }_+Tx|WFd qo68aCίl0_clנ_S4l4sHMDG8 eWޕ0n58vH" =QzNebe '0)\np]CIb)6D/=Ng@|}wi[gKyXd<_dM?E>&vHM8i QcF)տgG."'x*VrhT$!w7ހ[ {ͳGjrZ ,/gW6?Xŕ{jn5A%^*'jЇ}~` 4l"A9]p_<ЊR`%}a>S7o{[w !?9j_GS :NѴ2S Px~6%9@׭z(!B ~dr+>K OC%v&HfGޱ{e9uLO٩dzyZ.G V]7PoD,kؙ1SvQۼ6q]!4ڙg~ө8g`߷?xq97:S\ @'~s .q8?- g"ZGEtպf6݌&Qˠ"֊${ʛMƌwa<L&Y$FN=w:gI2c4vTfVE4/ذ2L` Q`sJT<ݠ2|fh·s]xB"s 0%V˗4QVj<^" L)nxq~& ,8 %#61Dn_@k*PŻ 8PW {S<\IdGy<5rr?e}Og ~jR@>(`G(ML ع<<_3G|~#SB#~t?z?zUst9a{hY3s(gaJ҇fC*}hGNRNECTikԵS5fQ\q<- T|"JVpMOf|FAc=G5> };h5u{vGFGB]&Չ(iUT(Clm̍Kx$8ϲwǙPOgEUPk ĩ|B\RٷM~ML.nr1D͚T,N&U셮Hz],8;}jlWAX+$/6@\O/_&E+|I&BmSyWˊ>!+^Vw䝹խʸ:Ⴤr7( `kdt6؎mnX#F)i66B y*)edky+t4},.|Hvs i!_p`{N6kD~6C#0׿SsPiCCi~?~i9@ ObGcCKs<`DԒg4ݘ4b_:[t Ca2t`Фil;;p*:v G#, N!$S-[hJx}vaݟɫaǻ ʫ{6휛vNύj'UݮM+05+\"}g3~;`4cvY|i|a|i6fC#ʛ96W!GqR|J'yT독} (Ğ1qs[nG,CӍrR5ZN'fOwܸhN8 mf;z~6֡;.oU-%y!Ve,Uf_. .kV6Tkb1tk,51 ]2^x$Qѝ FCgd)5%>$r.WyAvTg8B Gw9U%8|Hd 6 f4f:w xu"1Õ spoPDMOD-{"K͗JD-n"~74adwװMeS!j VF:~C?p9;TTM+g=۹,U$l8 p6”~2I!2p".%)1+evCǔtfkn: 4+-uuxűŦJ׺Q0y' ֭lB?,k3ĉ!'QT/N\NΤ&zWg%Gl $6LpD ,rsS5VL"1aMlӌB9B:%)(Zi] ZYD"Z;IʶfܑhpիG3:/M5J /iuer%"Z3IM4wAlV\߃jKFs-Eڟkg1'I#^M=DPiг/.Da|NyS;]9[;9XZ %XmK3BhrL>Wb=aڞ9v RiFY0Ď͇ '!嚞zzBQR M9#,4l~\̵9dw=9gp@ApCvs':'AõΖo<\?Du|0qj"qI̹7ةbb7M}=X|Cb=;xqڂ;.NQ1kή/3r}LÛv3mYiǑ-j 9׸Yjbx<,7ѿ{CRD&,"r|b''Ob"9LJ10LS2$̮$Oi0fKkAn(U9do09̪l"Q9[c(jvo7+d6̛4/Hh֧E  ncbe:*Y"-. Ȏķn|L/(w lsW묏H,>iYh1N6X÷b(%7^h:ּZ{I['0^8,?w/x&u<;ZJp{ gk(I ;gdS͐:g[{2sq7\7~j}czs 9"vf 3 ;{b)$NY5e9Ģއ9ZBVϻE?6 }1wpڌ If֧]t|ޖ%hϏK]r.,[]]srZ?:~b z/1 N*'cS)i1&'O;K>;ivN){["-`)z4pZ6Wc$=JYS1P)3xHc pٿ@$@I5ݤ!WH^'_@ ECF$Ֆ??gEh͟*r;nߟqJNf+!IRQD?+^Њ>*D ))Mb9`9J }sUvD9h%+h6j͇"p11{F.izKj+JU^#%S•7dMĕOn/02`SțưQg#b_ʰ9= oe\'W)qS 2Iћ w7wt 9EHphm8@[HXm$d{'GwN09B}Fn ,{QۇnQG6TZ|m,X?*VH`dO9YC= %JFskaF(3#6&h9(r`~ґ0Z'j8L;J%g >g\E])d[N QoK:n5n+W㶸 s 'Jn>&@Np[<U9F"jS prnơ9*-IH@4!դzBZ'=5%"5](Z ْ̩R^P;\X|>)"!D)#}~z@RH+ݹ!krdz!مz.#9[0"9{Kou_B Z&ShwdR2! u2x.~ސ@NvR=/nnb JZ!ToovHU!;C,'VtCp\A )LOρk_*RUu>,Oy৬%P[t /s ~RKy][kr*Il7B^n!~?-Z*E'=_B YI-DﯿV|퉲Ea,LX{!gV|MH;.AP8, &y QO]WyvUH}jTHkjR 5wLDm 9a} T3%a"AVX9;$ބqx- O _n2; b م!!uPYMh_m}[Ů& Kfs"W,mY3{0=и5 2 `F t}2Mo|g d<਍V^U+?sF!2 ^\m#ƌMvS& |ͫCۯuuC Z+Ŷ+2t 'zఓ4Y5{T`w_p6 ͌+R^d e*kJ{o? f}[T oTڿ$;d!:,^Ȇِ)Pz; ^j&8sSo~hmg!dm)CwpzA/H_q,y GpFyku>^OShre]Wʂ v!z$:lB.ҜB. Zm6. .YHlрAdtժ# aܴ^%]@ wX_ kݟ%\Nð*Y7,R!dN"ea+gA!_9[aM#T L|ÖgwU3dfRYǾ`(a;LVJǵ И!q"%hk$]XPUP *5Nȃ0|Tŀ5KJ|7oP=ᚇ/{{rJ0i{f0/֒}LOodmo:ŁNJ}H!&6x$4}m\FFܞj2bߗ#o=aDgn/ǰ4w{+Iquo\o!w<(AĤMfՌ6m7ceJKЗ < i <{{7<+jwj2-ĜT+#b ޒMMAKH&=|2_Ӌ#LBTE=`KDKW tr;^ g0}!.s6PrA )aݝ.3 3f"Ugu)\?R "(In79 I%,CV݂_^ rr50;w6_{4=zbP;amb|"+Plζ|>vnY藮=r_E`_|!|p@~"ylyB*a Jo$kfYP~O,%\)̘_[܋bPZ|oӈ]E,56R7с.nT&Z}8ea fۀfDǧjG IL(PQ+ggV:R=$U雤|ˇџ֒ױ_7;gL|NݞP{ = Yћ}Gwٞݞ끣gD_ì^p6}lқ=n&ddGRSW҇ed+*Bx׀PnNq~p$%u5B288iH@cyΓ:$@_;9fB~- UdD7֒$o?FRDӕ8!>T(QK~@"ˬ ` ?Cޟ-5M&G[@ r{Z\KCJJѽFNEXLIwC>3LEϠ.R7n`oGG~Q$3Ws6-Ϙ$lAPc 5^oD:b+ fNǷ{'>U7Z[=v$֓ $G:qyp44d -;syR3tCP _{Eg>,sQİgZ,et\x#^Z5< -n,0 y:TR4bQ^ʉ]'鍯 |02reKWw=ᬩ𤶛QA+Wjw\lxG/ui "qJhqRzfBO=\$u!7MZ>9QvB,ҏiwr!xua6kPn?"  $r[Ȫijj dp@ 7 4 l-%r}pJ@ؑl^ uu\j1086S s:O n@By8F%ICH# 9}rzGu?/]F&w^,{|7V_ēG{{n:9ﲻycx^m;Uw淭zZMF}YqAQ`펞ѲqE%Jr2jxTk&En͍V)AU _3~R!:(VAǴ}{ߏ+ͣQ,$QU(X#@b1fn=jaKEhrz3nimXg.73nNt?˿{/k瓼xui8୍ķb,o7˛л62oAN} nh IIxM)q Q=Y(cKA-oB! ^W802c}uF-$g׀\'|ۨn HBC7GXym/ڇ\0ǼWIěq X.qJƬzz]uȺd`.0}s!yD(OUc5;[>Q%\>=2\2\Fnq.o[-  td lsN|J##ZY-/>J<ŧRt%xwjȖ%D8x%ף zǠ{PV9R#5?6T,ߢy B  %;Wg߃rhN/BqʋL[$YN_]0Wĺ)- VS-+ ߕFEs~:]Hܕ벴]-|س!Ry.Meb. LXP1xj-WPiov>7߇'[^-vC .zџOBFsy \^W5 SI2YiI\7f7 ^.C&qn.PM;:$lS ][o\I07:C]%& 8Wjn##ꨎC9P0/4q_ED |tG '{OjZ`زq1Ѩ9tgkB;_+Ź!d c "\'G$=?杩hٵHLgFv*|{7Fd±LK$;忄=4jk՗gr5bRq:LYܟdEoy@|N<;Gy(7_vp/;͌k/ը/aVeMd\ޫ0KƷg1aN,p ֟SM&wTds DbbdG0ߒVǿJA2JykI!~/ 22fzse汜RI,p]to o%0QŬݠw@9 c~^H͢`#<d7<\@}grQmLC9*ӃҶfi[cG,44 ^r0o]xCn/T綛ʨam.ÕD^Xio3a(elP;X;2\SO`*XrMPXj26Ļ>Zva`œ\|AF45]OqQnnIS,:  ]y0`:#~g2 C.~E+CK&.[?>! ?U|;?Yg_H7<_ftXVq$@bf9ua3 DJE73 r!Ji3KdmWk} .U&=iTf ɅgT6W]ZRE@ݻRlRkx68\ W;ubxn1I,Q?O-t\W5:RTVxPA7N`5az3"J*XMUmL 1mgvI7n;&n9z͸MsZS*98np{/Oέ8_ALTJ([?5gSV7F~=&zs|ujgvwct?ʐwVlX %1~n˟Q5fN3?Om0fZ_Q>cڶLX:! fR+Hf*磻oʺNjc[2Һ}16-4(ܬH*vwJnifзK=57CoXOv~T3%?|b|7jKx v?>7{mߦcrboVLYf\$5:ˑZZ>u{'$8moON!`(lXuϯ4fݰAIRXm=,l`/TCX\"v|t/J?C;Zf;.tY\w43=)cfϬz=lݿȇdTY<.}Q>Kǥq<6XP9 Es bQbB"hGx%YϓG%uWPUA)}` v|?>x=_0We',;GvzqfJ,gV#ONI%¡p)~t,G:ewuJlg:D|򡸃t*Dih=t1eGW˩;J&$ R²;I1 /Ifڰh mxC?=ֳ-6Zu:xh0xEc#鬁/|2F $6JYgJHh?iÉp+̶H}_mf6}ΜYya\uCi_a3I1Ӑ[6! o)Hݖgs֫2ÓB{ *̡ii7v>z{zR hi4LIA":+e"о ; oMsJ]_ ѐ_Ȱ)sEl,Њ~WԷR}4&7nY3+51!˦j?DVcN"Њgy-_)0yWGϒh msӈMɋcn}>8(5A,!jFfaG9({#:5<.J֔45qy khC;G׊,a&qcB!ҚS."n8VOM%)e[mӠ)g>1(ѫ)[9!s(֦33'$a)E{r2OQfwff "V.>V.cעWV|7p17m!dyZ)2l, Y0Seg.oZS`h77)S.-N9 C J\SDѰ Cè;%PPv?$]kR3!NMT"F7-C9j8eNh-{NEr;Hݕd$T XIj'& C=ިHh^[C4]Ϟo Mm7^,*ao:N}1t.ۯַ٘Nl _omޛФ'TB: ]k1K7J$,}?UrYV6L3~sJhJ@G%߇h)0.0!KIuy)$_<';Wyyr5:t׊e80Q22E# #GP4 _ݎ# W\YYCސ !_1< bhAvʳϪeNA85ԁʉC9J )e:]jSJ.vz^1,7LexEƕyqu:9|Dmm.ijl<% n2PZܲiP9Hm a'^[6'K=I)7}i嵈%нV2?4(jßv'iP?q*8d33j((޾:h[XneXoRd%QjI7lVx'|&e iȚ@2SGM/DГ#X1E{c8NL`& +(5&XSX|pkwT?&0$Yӫ5qwK}5q=h|53gyOyX>ŋy Rnp /]xJzo ,x1p~t ?ҏtG#}r?Rb@ B(F@1#R%, I[5>D0Pц%24m=՜=0&,`T jU%dl `4כY/+_I?x/+EVO)l48VNʧu{UN@yV%.l@d9 #-G/Iu,ѽuC!}}7{h\"X?c#}u.h(.[߳@]Eaٗ$s2:RQYp=yzxR8X3\,J'4ȓBP̜C9K Pm3c)nj̽'J~& Rx xpIFL{#&*̮ir>XYGQlUM;-!?]Ko;;xJr +X1㟎޸qtq]-Ќ xFT\Xg,3O/< F/,4[?"YP`rւ/b:b, Þ!R &F=ecbx#'ؑΆ#qjqn16gC N^&^ AZt0"~' 'znqŒg)J}DTi\7dII.=CiB&P ހ:&m3l$me%NjQ 6PccJdHQ-\ɒ.2 \rKI㭃m8uL륐 w],ˎ|L/E9g)Wk%2d"H5 pKypd^IJZWƶBIsX"I:WlAtgmo>\h<7= 'qhQQTHT7uPg{>a'| ?>x,bE݀/n?BD3Ed ;NE?Lc>^̿kH?9ư!)eHgC%d"[ؼ{,ZAP)kb4K#qKP8h`ѩ}NoB-KϏ7a;u;6c1AՏZϚUDŽf7sA0$dő H]h6pNVFӅ=Q#3h<Ŕp!%eIᔑ> 46`dO =V։!~ilNP]LzSi27#PY1@MTjtjFT,zIa=ҏZ#0+qU:SKDF ˴\]9n.]—b{0 2K 7^&UGY9ܫHhgF{&9O-QϮ1RY2řP;?Gtc܎N^1Dpȗa'5tև\5h;{?cN}Lr4e[4cnB\kVi.5s~qNyѦL MFe;<AIj8kMb\Gf4J k } lafuZ`6N?r|=e}%Q}y`EPJkL~$:qz= O,'}X3.8ظ8/ؖDQmߡiUu_WS pm*],7^ Bq¦VMJpOCnbBmw.ȃr?,]f"2h.39ubFgjgXhr?!`85n8{ڕ(SFq+@[N) ƙ{naz/,)(GfL#E,q n5b/l\VNݜv?<ҝKρƻw>-̝2.AFRK0Kźs0P n9W~ B^$Xf/ \xo\9wQA-QZ^!=0(&o68 ~ o󣗨W dQr;jd<ܥ^^ke#0֑ '[ǣЈ "t W &IWt5arw8]pn>7]ߕ1; ܮ|!ZQ+xgt@Io ZKocWg8bZs'(+_N?W|V)?hxGxp]|E7Ad? "U~rV.:4XvwZ# '%fY}ŨHj['x2.P?_B`NKߥgjPdOR3$)Lnр?Mǣ[h=dB|04?d~o&$葤Z]aM#f 0Q4/&ි%>%j ;L/ [9l5Vl5j~6UTC,˾沯uX6l.TcpL$KO'b8k+-R};1-|#Gp1ˢ*ըդM<@$k@pP0'x1aT6HxJNQMr<|~x{Rm*v/j 5 (*CَnA#Q=Uг0"ոXƷ@s8pDv A+wk-O ki.ݸ_ ɬ]DX93}ILqgNviۓU7gvw9E=P}uۡo$͞`)(OuTY|ƣa6_|~DE#]M.sh e<  6LPs\j?2xHg±u@aejy}DGs8h@e>vt)lCwqu 3Z"'2neH([me/7UGX`rl39oHDIzq2Sv>_?zh:ZnZnp|1mBٮtD%a RG"WۥW+&X8ϰܡ[FJIsot:GI]Jv=Knv2z0QL #<mI@7o/iO$R="J ~u G;wi!Q!$SX=Jo=QQǿCr֢ykV6Y_YIŽf467C! ^s9EBYd+rFLu/j'|;" 󞑙yAf52|\Տ1 322Ge5]Zmf2f7WBJX ƱSZ=5vԹ6%+Ka2䩺(x玂7;Vb "hv" WRxA{"YHL^N~%DQr>%#9L\زV4[7:CCVaʳ ^R ZCo;9fR.QF Av8N:(]](*g 7v\dBqu(:6X-+ޫ Ƴ6 Ē!5P2n:ķ(IQF+gXiLՍ\,I_lSn 9SWn(Wi",D{lNX@}jdwv^ݴ~T|hRh{q8Yz SIȦ{dj Dͧ啙TF0Q[y! DC r ϝ g>j=?>`nyE@,܎,I) 6{j_s67hz (]q& 5w3\!b,Ak<댾~ORc 5YYj)e',KBk#,u9};4?{=,_-فB m g  tFuˬix0Jjg1,KJ=nx\,gw)r:D^W?_?ŋH>RrBn,NX^qvt_/?̴MNn +>Yg9"cȘeٗ2|#} oC==Y$rÓ/JaltB<OlGLt(Ҵþr?˝;ܫOؽ {B19:#.4RX&*F37(hwþ~;Oo%Sr~?)Vp?VϞ[5 [Ô~(5p' :zI5;bh\^IKSʼ xlDA"[ t-KW٦uŅd9l5s$nGOvUmxst-%gK_Wbmvߎ P|1P(Ag).+I,& hvn 2P ^YY/&QOc^CPNp!~<]qs$vPoFuB6t0i[E!FqlN ^wLG~oG؁7´sqKɋ*{~˵U {r蘽

E]弌a8s<2'W˩qXg g>)|H[q`pV@ܑj(6\`6 ͍8۾&oĭ[g<-'x-kB` hR[65wDeEs bY@YI]Cߥ(b3:xFEǽnBs tʛ#EB}{z?r3@9jo[)uE }ި'';Os)^LeolbW;˻];'%0={{>{qsbӳ'÷'!>҇T:>HSԩSr;١oJ4ҵSکqǍkVw婸>X}L\yOEZOt1.y5$SޓO)R#5yCn|?y)Qs:*ݼE>şOw"Az7﬒>jދ` +^q?R#nFzh\W9 ];FNq7L- ⏙^7ɦ!2^/axaT gb^g]ĤcQ~7KBP;A , ؙvA{whfu~[QQ{z9N_b@_ywChֵ{.i4FJ=.߮?t&<A6M"TTNd~89uT4,ܕw1^:FõwaXBSEG$AG7wde[i!qu畤$ Z|:$/_%uaҷ^6-\x'[(Џ|%0~0[ Qo6vqfvz#эEF Bhſi@DpqrllDvVq P?†!P ܯTa105mC0/`}e(MN2bl@dk v>uhatf7ϪjDKΐ1&;!⃈^m eL&n60HlQ̟(kܒ$Ѥ;xJ`YCr| ]d5j _ kl~6NG7><Ҳ:S@eӖdcv-Г-v"ЩtzU~Ռ:zHpxWL["W%[P1>ߘf?5/sU~RcbV=/gB_iF-{e-yshߜvI~=!?#;_U t)d躕ɵ=K~E5Qb*Ln՘NN7l |gL>\]SXܧ|.@xσ?+ñ!\?'OyQ]<ŋ +0A'UZ:-N@B{#Ը7aar de(JOFZ?;b8:$I&טe_c\.˾P$]Q\Yi͆%>b4 lb2!$UF]Y/-stAJsyIaUio 2mk}x*x{Rml4A[qյ^DٽP g^I-Ql?]ף63RZCJ~_]dWjT @t_$-؜S<[=qzDV \g;}I wY}YĘ7"{o P4VRy, ! !5לNAqc# R|؎bk{yδo&6n4ok&f5Ԝ2ڏ\HڀliцFg>qzXx}`NSϽ|VR0Z"'2X m{+{?/*q.ڿ%"g#6?n8I;pvݜ9۬d;T[V.VJɫu6A%a_2@?ZB>}7&+󽰡yǵ5Gzβ5ߍ}Ϸ?Lѷ; с sQt:0yat|`s(o;k-&.bC[ )9-eD@g5lT{0e32av4s/K ZcݦfleH3jy}F3blV4Sv'?TޠTVF4Y5Fc+/=&`r2mbVdk ^~OQapII{nqWI&-4"sG|R_0ܳ!#˚N7 p rB K+W2Q= =#7/؉,-11(Fj51ꯙ2llĺn,J 4I@2ȱ-ÜzHʢeu)'ʊ{x䒍F4Pt ˙}ĖWZ <c,\{M.bYTajԜ|\K#aI|`W:~?+o k+ ,i!`¯fl(~^ŕ,yFEV,Ƒ5w9r'##q3=75EjuNva1n?Qss=cKע0rb9Ku&#wXo.ܲuii''\4Z3yo(w+GO`򞒑?Xv|CFn퍅ٶ:3,rɕI~g[>ݲd??w}4)D%]mw1Γϱ3_⿭-?4~&4XjT~vmXKIY9()&?GyNcmx)N{6t]zn^gI-̣PMwhl"D`u naVr1g4$gBЀ}r ҉Q;":O(-_G[ALG~{u,@2`B _E !#"`p3GV\y`_]j6k.zn]V;*s"t): 1CwSՐ'p,'$Kjp钕7V+ vkZDEPگѰp7Qm~y~ E,>nP.l[wM"I+˰_Zi!n:Fk % RdXB KMqyrw˂r5a}GqagG9-(?K?43 `&}SҗznwP &#}ܰe r4Lpps,.Ѣ5ԝ3Mo^TJ -/I`YZkAMh#`(wםE)h@ǫ]b ߰#f43W1<[ap߹k_*Rn(V!gsx +c:#bBA8Yb`U-?O\ZwR<FjA}NF.^nzȗQ|"G d'w@rZSrHp4dVY{@sʙ! Lfl&LRT@Up" ߆WuaR"sG}oqQA@ 2&zTTJ{&IDK\ Ϛ(DB<.囨"D[g /8РDi_#+(5WN ׺.Я-Ril;PEz>11`%բ$BUR4YىXى}b5-5™7?*Yۆcx<<1(\(Xqm/ *CދCc4!ۏ! rȬXXd.$3Yi&<}py:/<]E ^E,Tȶd<WY( BW EʐenX)`nøC]6kOeiJ>HX=Hf *q4bMޫJ A&1Rz4P<0rd9O#3rXϖ;?xn^-X$ p$ިF^IǣA:S6 )}F/1>0>]5P˞}W*;R fT@:% ~ad 8v>. o5]&o1Cf#Sn-Rina'Mu^`z0]FI!%%&{埏0(di0DLRM`L"ί*VS1X1Fc $ay޼̃/GPTwN*qcPCx6!r"&T`qIvO0p WH(Fvr1:' d|cb/)? nUEs LaU)c_ܛ n;7(3+Mazwwq Kg*B4'~}rw k ̢&30Q0KS㉶O?&szh=]bdM}T/ϿW+j4PS *DLf3otRc (F\f)̿@faZ'[cU-XW}UˀǃBX +)th /ivT+r<4ίFpDӯ `9AǔEAh̒~A>ҋĤ~ɦEQ= q" \5aIݦLbr>nqL HuqzxǛQr\d V|E#]_/{rDH4q,jS6 D[k99Knz~ l+LUQn!.JzųĀR-9( cמb^nTLI^J?e-TG񓊛v7M/z༼ ~ڴ.WkWj "+PJ3d9s 깮Pʾhk,)瀌EgD~åir{K JðhBL^J?\0FNYXQBԧHV EI!׉4 {{5j KC)…fbrk%܃X@=eU#Σ" b!0OQ0I42Ko7$z={زw>- =ܬB0RJW[j1jo ўT&i!հ(ĭbJI.:gJ\Wq76ܝqP*!$rL _6B-?Gˎ-a?!/[ n:y7}n4dfcVgat؅^K+kJ0iHS=ږgGh9cIv<@֍̂xG |"!7dmUJv+˲>g.L8N}ՂcA@ _GߢWfDzy}}0_掌0md+=c'@ZpdC*Ɩpk 0eO4|{'-ڸ&t<o CwBi+Icڤ- G)d?i3|$pp.%ǕLR*yOZ֡a5atpjVRwpvCH.rUlT} VCacp:ȱ`K11KחAB=k/rACkWu!ݐ*_^ū4"sRG4 [luW^k,zM>FI |UYYwC(6fX7&w,b71?d0`Ŗ|&Mhmͮ&f>{E' u > =j᧿'Jva2oc}>&.SJ8c^`Rt.O!A3Ni]@k(D/%P!pc.Lqusnm9 ~~\z;6H#"wI8t~ ,?Ͷٷht$y=* |֌.~[J%5_:ښqKȫD5Ȁ ]/ENqjqqRe:C7Qb|~"? ߒq(J@A6T>d*Qqx+; l!yMd3/lIƼNxMG*_+͟Y\E_jK\҆jB ;Wi\F*0cjvl:n"bijPEl?2+(G(4\knũPa*r(w7 ,H-U?D8+7o``38\~)U@|A)k9U%.']#j RD,h4cvE&#\g ~a1_@/=ݚ V+i0NՌmFT }t @)8U8&<낌Z9qhKsu ""f$I&ۋEp#\gRu _DG!5Lʄ2C?e_[i:MxO{3c8EO.Q",H=_7Ih'dT|.L"ynoSD^ Io$N{깁KXDI^X|βEʼnB.jWyղ+ǭ+WlE.BO*D) /ŎXC/]a_GOV05 Gr|ATYOE(2%B@! >.X%&U`C6/fP?y-+au$ՉTa~8m HA)To3^HFpR±'kpwH]2ӣJ1B"Q GB‡2Csb=""v(ÖoE67q|ivE &n kT@֩i=𛞨]/U-UA[VeHo?ǘ,*Yhb/'kj XeN#ȷ!f#02K3 Ưq20XKI?d`|?lrHidnv .2*@N)([uCg30d_CQ|6M dWӢo a 9-c=+1wOl %88nGK{{'åOi%H'ςx T+2{:Ry&]_u{:4 Vd @$P'Gn66q1]8\wSz')x't+G e\%n豿L<;4&+%OţNsR=+\>B$>91B6qi*bA|2_ގ_{ #jpR@n}@K512v#RTi+2ʤ4vDibyۯW W7o S!a3@%][|fl?a yrLpoC\[WO.#.Cl|:dF郏h(C&S#ʘ{D-6?P2KT$Gm#_y˴]%.Bɀ6q*x`b TifQʿec5|ӫ @mgϑ՘1GFcj{v:rĉ)@ rGIq]H.h2 !=PH΃}v0OzY)Euk.w;zAk>bxrF^+Y WZשM\`"S q# k! 4D\^6`qhXlFKe@P;g"WW3 ܱ*T1Sx\X3X2Ig-c6/<"&l']^1E .q7S#9v+ w8 'BiA6s9xP`%Ƹ f6#̵i W.XļO<}w]Y^6Z4ST.#$eZA !/ENJ1Vx Frok߷?z? ƌ]G^mX9U<؊?wş^ wHs8"+TxV^Ί8Ԋ!{\JW{Kij`"R"S K~Fʇf eX"!Ebo ~&dDϋOɬMnC_P1 { 3dnh+Xl*P*gY7W/ }E>ޟBSȺB ՄS%/+nޣb, a}D@''F@,aJ_ 6XʀRx/.-fxg$jN,kp9}(R0ڄ!i`\,}:pЎGGVVL_ g2g(ym 2aQ=J^BJ^S L7tGD1ct@{a0=4BCs!2XOƬ>;Ԥ0}a 4VH) w B6oՉ2LDFu"!]kCT~JBv>rY@Ik8ԤZTҾxJ_L_Y[ Q)L "E^ eRT5<KfnG "3jinFg,nQdgmvIѸ@irXìjvYm,X]J/zZ;^_fP2s(O(D`@.TO%~DzGA#$&)q5 q2"w7qksbv ?s!  " /Cs%qN+2j}K|;|{"}O%/ ɐQ 8Sajwali޶[ҏVMJeߡݓV3㶹5kحp11O[;1؞HÜyY9& !Iux1Ărz)#= {7Yxi4dn4\PYtMu3LGv0hCVs㑪)2/Me{E^;vTҿs|CM<$a\;_iHSPh䌤U l(@F IUD~j(y7'UF;&NSyh˺gbE$ yE8PSrT0Z)$9_~2Rd)"}/bqp?IW/^'{%7p~>\gwm"c^gttS}u_]pl{2H8'83B^~crl3?3-,6#zzjD.Ip^``he,C j/rJɄ@وܵbmil6T"(+RFdgm[#12뭻eÔq; ֜aPi*ܶ*U RrOHOcمxYݹ!x{c!=[rTI:10l zUIO PK%n$]? {p!jZb|FHρ!Y~l`sѩ1>CDΜwgEײ7%@9ƀl?9xs]$\D&E 0Ċ7:"JeX~ v3q-68l)>_uR@juPrɷ; Gv/Q+Z۝Peyq?C"ϼND`f`}DZo;y.syb3WAZ @.9̵?IԉlF(ݜ+B}.r4Q3F8Tl)6QЁDrJA8 ,-?mdï|}GP+Z`{u%F߃UeB 3^eH"ۛZuB@Xb>/FǷKv|W_ʏÖ! *v)6n1Hn63Fݠ@yXTeFK闓3&qj[o8 @J~&dGWXM}YMge69!2Ǭٌ̦2C?Oy̥ Y9dxÇ|G'/I˓+zzi/=%Sx9O`':h[BmWb:hK%IH@nh WC4ߑ֊KMIWs0:\7W+;\aeUgg^FB-~jY%=`%>er>E>7Fzvrb9:9AՓcdU c^tCsXM: H]"32͚>U5ߐ`b酁N^'N#9 +{+1c%>sl|F(/C(g=5"KG7Rx4~ is:ԾjXC %8a ]<1∯T CZN!AxD*"XI7t5YZ4mV(7q-YkachγmN讁aDy$b Ρ!;7HPݨ}ʍcme;{xAV#@=E Bwqﮜ(BlA Or-JŠ'BsaL%suKu 5A1[Sp3vOΨS L0Skh^`yʟ/ɱK,iLEǣzN @2N8:73ޒ}Bys;D`ćYĘ\#H o(KmcatSj+guyIDnyҨYT9gLDyAXrpwY&0ifJB%,( Qm.x|Ot)D"J8 $=N9k\# EB9yIH਽~~hwy"DG6sW  IBv*: w-~ 1wNΘN7\It+1++^ _#9n@;Q"胈U G \.psD(TqTfAzBQFpZFJa%^3`] aD1Z d/%R=Jp-1r7 ЎͬcS.(<<0E̕l#2@s)y!˵Uqp@(*۬ 6:Tњ c#LXU%f>Լ5S SJӫy?H໋?MOC:&RbzF$K !2ěDJL![J~)%j˗%ʉ| lj"jxzr9R\pwVpar%FRix绸@k^Ӽ˵t<W% m%utԚ4 tG%9Bj$;qB|E y:IL_ ۜcM$d%Io'Nw/oQ2JUT:uppoF)KT0(^)Ie[.ߗ{Wh_q;aվe4יBo̾$m꣊֘K>èB.Ҷ|#a Èy:W t:y+ %;= 2EFмFI]XSг3xZ,*DD<͜&*&:M)I&")^AGcDw48`-E*78В0i 7M FŰ.Ff"q{_6aEm0jkdsR@S)p ѩ=1у_{_`ϻu[`z`?B*5~lRz{J]ٖۍ42`|ݔb9= 3.{GYaسZ=wրo', qMd I`^./Tr~--+;#MXɥ9vF*C gI2J{x.?_jO7"@0a66QSJ9_V~:a bV B5qpqthct0dU%u*N[PdZI!}\j*`_h@U҂GF\CNьpF:F;ow!ږnv#e~`zs"݌ʂP! 9eENQ N)X$m,o m?34 7Ro~X' mp 6E1jrDNP2h'o~+P Vo"]m6UؐCJ"f2.$2jJ {h q7q ]Q␪l"KcJkF} B*&1Z+~+':%+Gju[,.F!pư얪E!&78Ȝ]]Ywtxv5]TEn =ЬMvοPʃ5g'CC5N/n]sZ+EHvԬJ~qas7{hUֿƂ (jU Q7f'FeS!+-Awf]SNGs QYIaF᚜Մ!l8h,QyTڡ@)|_%~,kn%Jòj'\1ArZz5DvyL>CB:pX :j]nx"`MxX}bUPXDKw&T$hx[ygȈwJH7j7X$)b uw9-myeo<:⑼by1N*_Ϻb @z 0QLukdcklD[f+]X `T髭~X#2Mpg55)-s٪DX2'*VxJw[etQ-E7N3>[? Mbly8[Ζ ,x<k>7*a[ԤwɣX1ٮYHo$5֫#E qI[%no AbZįYhxAa19Nш$Ń''{W)ͯN[oWk҉)Q o\<<gq9]ǎ ?H‘+ FXYߋ7_{~^΂>tkg,c-Ġgg9^.S?W7yO)^Dm'BY߯4?kS#ß~'Ef)i2T@7QK%D%LѾP_H^Qَ|Bp4,_(} vj)R7 é|.c2=diLFhAڐ:}r ڂE!x//uJ)AQ#Z|bL7D"+Wi J5$˒Sl>frX|S^2I;ؗT<| wHb6jqNp( f(wfn& z6]J3^ns\Fg1LJ06HίF0w ::M @kXU;(+eHN]bna2{Do*Ȑ `Zq]yv>7Q#ИF|VB7ı2{x17o6é&ԟF"st ]'DzOֹ .&r>h@?&~Cj$VL I?τLMk}!rZ<\x*N_' [ D)} 5M_f\HؚR϶\NvY@'zwh\?VYKQWpfAK8m6mn/%绻! <]?dIE-w1/8TJ>YX0M#]Ó 1 $Bj5yP-ZpT: &l4(jvIO [H n1Et@pD2 us}(fgw 02UTn>7V[ht*:ӷIUYp1? P'Y?-EG\J] C 3 NG 6dM»~)cFer^ϯV9ۆJ 0,$TttE_4[3ӪB=鞨3**zN$&dm.qUPKד@'O"~K< Jb"PzAc.R20WP{Yg-@Z"X?oI.#`:Nqj#/!?:-ɔ`}?0@M yD1`$B!*( AwޛHmU2{GS%ג"M!Yx7qp&857~?ؖ@[R@o@7jે^)*fЗՆ.;0EksǓa~6뭤~_Q^U˯חl:^MbW=೟Cr~5fNܤ 3bͨw.ˉvГ u7y.|o!wzjqMwPNG3' }f7y}$'hdXki`vG^=o=_gbb؏ZW& Af%{t+~ VƂ^MU! uJ00d?c>ixoDŽR{w,Ufz}|[^=8Iip4fQ⳨6A5uߗ =' 2mz vќJqZ E">"Rh( Մ/O `6Hʩզ[v+E B*(ѢC*O Hć~^$-XaEAXN)y;8tl;>z)ltaWշȗe2EpuD@ӷ~Hk sX>Iih",p"Su5 zGKV *\N2)MyO}7~^::̜5H %؉af>}{FyQpP rK c*Uc=5W 'sHgS*=G TnFׯ2ZJ֘ݎQ#is}mڛ|ț WbH KP+\E~Ng#h~>h5ٖ)~;F9KQ) R /ayІ"FiJh_*C$<ԲSqh'#¹+i8xT&բ]: ){,h.YT5Kn6b7m ŎS2,4ZAԇB,%.[mf=J7!l $H ͯtwf`e2q`L] ¥E K@QJxB͠dGo٨+_ѸEuwI>V Q%9C]d3WP"29NmZY0yb:U+f7QeFy2| '4td2>@œl=h%Kf-a*03D$˙]%>*mi3mi7(&K~x"5RCw,- S$\ȗ0s8͵:ln`ڿ f[&]o/svEڕnu]̀9f?@&P|IԅL{RKXPe פo%vpxs vI9l e՚Ab-񆆧MR |RoWwrJ.2_UɏpDp,j+]tSD,sO, w4`2LkAV!P\d‡c骤thj$eI/M29HSv%*<.GSg Am#̣4ƌ HބT<'=G|OU{Qݨz_/_Ob wmß#BBpZz{-^J#RaIlPeF3G !6ۧ+{*{~D6f~C/ڷcBq"%QcW wP7" ~D>0mh|GqJ6p,;f.]K'q)A5?f+k2ЁLp)՟)꽸^@}=Eo>iw FӤBGAۮFGy4vJkKm:Bmib0I'IF<񜳷 )Yc{r3-$5)&V&#k@­v]1&ΕpLdg֯ l#kv*Ek!IRROnKޘvqp{}0 a2zioRR)PJ pT.{LYQM_&ouVU"XrJx2AsI'|o(ۏ+!bذu$n.m&d^@j Yȇ;p{)_b!m߀fKoq0|%kGB-UڂU=WJ.x%QᗨSPM}>6-vсy&71aôidmzoG6ic-aڇ}w-]o) xfqs kr2nd䴒D-]guGom؟׻[w29on=hN"+qK{E{7oUjP(yaL~f5ZebTyi-,s " DR9M&w7.3TIԄ-M[AhCg*p7> Jg֝F{i{H34`IL5G}T@"64h% FOAz6e-2+Nٻn~ǘZVK\Z ܈hwA,\̻h Z&6FbmBf&w@Uئ7"MbeቍZ9Qo ׻ cP'ӞfҘPoV,\1e*1,)6-S0 ʬCمbGM;vR4]TEB%w $"ul-ƐY,}/\~RiCv9QeI M}ʚH],g # RG &)# K:^T!ݦ6_JJ2wpM8i0 BۂZ'i-WPq䛝wdgyrl}*͒x{i4P>M3>?ˮDֻFE( ŅOʔ9k)_ō;Dɻ$E?21D0\G1r@ɚ364pQ1h ?7YgDÏ! xOZdza}%$펢j,LRҀk 3 |L>uIC >g|mBQo.ǣ%HS{s :3r-h':xṑ8 =,ivFGJ. /FRX0[Xn-y6sv]U"j\Erct6ZRbaUg @*F#6BTќ kySG8kk$e(A{,0˯4v휆G !/_j/7/=)^P6Nܗcu/K_/|]Q&!ju3JHN['xg9@ KhqF Ic|jbq|{dae:ĂR$qyG!a ξkkͣO7>ћG`}xҞ7vT+pV+ R9e.Tƴ?7jXA+dvݘW2vbؤP[iXf![E}iCZ`]/LX@ =% Me͏]RY:M14X-j|e{nѵ22t%&!bR1 q%Q<> f&Í,FU8\RQ\'8L^%n8݀rQ" P4MHE:f ɱՉ6J+ڎ-]lhτ~&эy3enaRrɸ5˴1g| L#`rq- @&{ے%+#qb3[85HR +EGAb3"oοYFP̻(Ё!%:zE6G3$tTT0%D_5S2m`{); @_\Uφ)\UA]c(NܺU]QF,XlR(mlqD;QcgZрPkž)J2P-K<&FE$*wF [+[?J3'' f؛Yl74ioJY `Ӏ\Q`5j;PS_yd#BPȉ ~a۞.olJ!@%:I/(?S0n'DB2QZ0J.eQ'R-o+\"Ncp\)mXwptY) Da7JZEHtChsaη ?FbE\v{/ 퓙u*IY5_V.24 8'ǚ޷g1MmtN@IFz`&@K@#J|({(VS/4KN?26hEtRr$)#)G S\U˕_V%PJ$xXxydʆ6KߦL[HZI}Ek^ttAl>HŖ3qZ-CBC#xRi-)dĕ™dH9*cT\2Dec[mXpt*aw=L@"?A4v0g(C64c-Hm'qUV5~Qc;rLjJ .]?mxzbTw߰W{4M\{͝iڬqBEOy}䋑eV cE-,$nҼGl*6yJjepw48"G[F0| <&߱дMU&ҊbDkU+\Mqӂ0m:*Am R(_\]|Mɞ!+7nn/>uZG sbXBs3|ZLaZ sG,Xru47. u).'T_HK]\-.ك^WB B4SB1H8ɩP;ST@SSA3]%U8+23`-"P(ZHT_␺; AaGEY;>+_eOrWİe8Ո(J_U+a/?6֟?ԖŤ)no7;;Hk ?6o\R8wK$b;z-azȲH*ĥ3EM10^␖H}J&>a!3t1.uԄNFX'dlR .kv \uMq,EiVx8qXX %;MROuжĉ l¾|H|VM&_ލiC=cf=k%э\=7Z-G zq$| ߕ9k|~3!1 ͝b=@sA&SNc )dN!5Aj5ϋ8H{@@(VU!>QF$g^7ɩ)7u G( :EgQ/'%-yN m,cDIߌZofLƏӈunWU&u_"DglXNiI {,w>#}F)Hx0o%[zٴƟ'FC$ ? Tj򲏮*.Ww] 8QAO$"Gwy t +bQv3ˣScuqG3망_<4*5noo) 8|ٓ^0_',CeAm+Sjh<b V屭()Y:Jrmnc;z&8l0qݺ,,@acY)Wt&\A'Eחt'SU3JNh9R>CVp]gz,`\a+aJI;Lf9A 8 ?vzHY |_z}Ŗ;#pc!/RCh/7$Sc!ϰ7G A92ϺgRmb2&H}юj[+:Xj /7﵏ ؿ}>i- 3/}p?4; 2ݣVUԚ->i3 ^u@g]Lt%X;g.gm#c0bKoUps_ VRM3Ҭ #dxNXdtgY"(PT{J<煉;09k~cuzj=6#ZɒqliY45ᔶ )4~\+ e*K̕2@grTBNY++KbhgBmHNC+,V|m喣-qҗ.p ވv$58fQtCZQvj^6B8-i:NljJˇn{44o3+(J/Z[Ž^&Oć2݊P_E*? ŷT\"} 6>UWYFHu"=1!}P'!)L~7\ Up)Q=,m!irtPHӠ_) U=Ey才\:9^,:ZB౩U揫*e:ɧ{/3U|Uz") ŭMg3Ɛt`lB5G&0-7k/AyJZ&X;21gaY)[ "@"ٓ]*E dߛ0Ȣ+N\ ~VynWZ 5,3YcKBPhP >dqxơ5FH!ș.3ywxVh,ǡew,?@^ 썦Z0kg3Hٛux\= Xbȍ##C k\~=E0ܣ׋|LW/$)J.նE;K%((b`󯽱+%B7ΫP>`\b-J(΍51ڗ7ꕢ-Lǽr;֥˔8%g\oD m-@yZmp3(9I&ܹ?: H ^Ac duH3:tOH{w;~[>x/Ac Î IIX) @"V.~t39hxGƊ_Ñ+b;o Q!Ux͖?Y"jUPdh= ɒOpb,%X>y{=(owc 8:a~qH)qz5ʟYʌSnr&r#X,!H2u_ٻأ|?J$`Wk}xAr|@ŕ)+'bo*{ls!L`u%?WX9emʊ`T+ + w;mPz9}2pQVa+5bkEAM" W?w@D[a(\ J,IbmH;A.d-.&gGՔ]} M{ixngd1ݬq&`7q-<9=+oCLHF z<_Q(AH<(304Fڎp<IB.U$9 =lS&7E +Ame') n e6#,z 4!$-nCEpk;# maVoC[lԄ7lv] dx0bUP/\<-pN˘ǯ/xCoQj`! ҆`k%bsl<5 vwP[-X8 ?&ta1SX.Yh; d{eEzy\Kj8P2-NZ[ϱ?oA}FA@otGR ʭ!tMzԁԍ]mfA8pʟ<^QK'ě3:$)騋0/ŵ'd͆@S:NmM2#s;T{QLaQNaӒ'Ϣ$6 %;vR"Ud*CIh,f$}c5dt.&qFV`Ch' l̐(@"'\ԮEJu[\?YJgm~jغ7hhaC l!8`5-J֩&+4. UoS9Ҕ56c-MlBtHSvyD~!ڋ eHx汗!91~+J &⫐Uhv$ZκJoL(OdvA[^NH+B2mMR5 E&zVdtF#*Пnv<~(uU"c]hihi8lD QOFuX_?=KS $݃M_ރ8NKK%zCo詣9NLezx)CVoh0peD&Œ&Z7v"XJxEREFe()0$HW!R|$rXCBp2K.E#%lfg35aGd\]-NDZKTDw)`L4%䟎<yz(y2J-)g}nBd׉ꬕ+ 0ڿћ,?zcᑛ`#f#= 䎅cW\r YndJ9.ih$$q̐Նmޠڕ2(- ,_̬i~(J>zH mC_ʑ#Vimd q-%IRI='дm [3}lRtx>P.20qZ6A ݚ'E` Ն0g% ;4^ZY0`EZ3|}<Jf[G|Å6!|}:h/v}.M:onvL,|.ɅxjG?Y7g8MZm'7I LQ+@r(-+ʞ:U怫LJwu Y\j5IiEN49}?/t)GjuW=V/tb99Tnѻ4r.z[P3m^-,:vkT7ݴhX&8XdsKqf S6+ {9!sSđq>5ǟKMh/G~kk^ZucK4PHZJөQEu\?Q> `ysC'G?Zognl+*^/z#>*"^6h%QtA~/i PԄ",EЬ^wlo_FS~tUayV;%INw@H` ڊOE x~=nB'EF@r/@h ߊ?-@s$Cr49Kdv=y\Jk1 H, @}M7Eb_7m&I.F)WSW(Aƅլ뉖~<: S8 ,κ!lV/Zk޳I ֢ohΎWwctỿJ N)Hv#='|&XN9g`6jDZy))L^ƅdqzCV 9COF$Krs^_ht@ y5cέ.HZ ҿSHp%!anPC6,>NuM)ɕ E1)QD͝}9^Œ#W R2WJZJX$VOֽ cJ (Q[35 ^ڛ`[ I7/Q"H&GXbT_29-HR &Z -үI_2YKɑ쓎PyEODAs^64h2sDt g9jjr<5"Rrx^31P#ŵ e7!NuHnhyIb,[7i`DX)&SME.?faX+?__iFX&dʒ[W"햘`آ*Ձ[80%8 /º +UFɲ%HD\`>IaDު%'Y.DA")\zJ@خ 4y]b4aB3fttYJ**ԡJrܳ&_^kVeK:Yv04ӟѹp']!v -TTlgl1[ZBFV;k9{=^q&РSmL'dl]jV(]3X( f& 'wW=f^eY*v{CL)x dm kK-Jg>NeE Z X >6ϗq1*"!|kIWMA|DaAS{25~VFյa帺AL'_[\֌ҷDU(:M([ɖ24ڴoq'uW#9`Cź4D5mMJ[,>L] @0b zCޭśΕCYDu_&"_(`SKYV~mq#)} 7+rf`ƃ0&ct!zہwpfW9-[I Լc"}xDVv({q >[(8 71,2v8MnA1TI3o_Ֆ-f0&NE=$ ZzI%2 } {MvʿL /!q `hXԡ]|{Hyx17YaRƕUVB4EΪAP:I0q}(Ef)G)hZy(XU Q PhjEdS\. 9 !U) )_QJui:3&~Ϊ+Jj@Wr<p=I6sg(DT)X"l_̈^|)?k/{ޕV D$UJBAML TL XS/u_kjnvw콮s5׼|C\U*3[r9vgTg"V?~E?u(H(0F\8М?]MqŏF3?YPD*&^CssFyo 2ޞKgq~ <ҡ$JRSj+tj ^H &(tnWF4(t^W۱yQ9sjlʑO-U4h 8Q|dWᠫpU8ZnbcET17%=.tƖRi?]v%CK@qCu'ݏ *ՋUھETi-4QK/4P[HIL)ջ]ϴn SBM2G??6\h8l-kK 5;/m:*W)qJ7% Kj @bLjV/\c%vU* uB]E?Va懑O{ ۯv5X懙Fڷt{3}6~h\i֭TWY?"0u2.5DږF>sUP:ύUE&Uf`<"PHp%aN*0UPqQ29Uv,n}(VcN+O-ɥ;TAlERS"Oqg KE7g1k0Ȓ.zeUh#~(ko4|!443{yoA{UnJ_?73%_AA FW_J xݩZWz KEEB8V H+ ??d86̓#w58'_ ׊Ȋ.E[aZ#rw*ĮX_͂=՗Ce_yu nn310TX]JiAF/Nfs\C^ms"x}!Zh?O eY b;.X/;,'DFabwWyYm78ZzԏֶVq K@:ִN7f ] NgԓȸIu=~(xXV? ?Dj"~\"-S _USy;oG oej ުT*k"gmj<86u+cMBJ,e )kog'QC-p;FtGM%N*סעC܉ue"hzώLCߨ.olj7,^!.IԦc^!oY)hFo3B5RLq/F+W;oy_F%^-vq0kfzџ[f|L]|9/͵tCήҝ4Drs/7sfYXNvĜd8oثxg?enV@+JjYy.p6cKQEaۣTej-6g0S %LoΦoêMeߡQ%wP2Ňf@wni xb]Afs`tRHB {Cڀ5iGn)cV(B8YxONk Ooa#_GSQȨqr^ hW8I{F@ckJ( ޝ_CkCZ#Jk#jmm@H٧]Sɒhmڥ9?PvʔOK,Ra,1JZB`gs>:jc m%U+Yr_v^Ǚ ~ڲj6Wl> }lmöӒꬔ@o!.^ Q@n|p#C܋*J RUqAcgro`.JxQ@pxbEGn~p]@Z dnݣCQ (&Z:A* :^$ 8 q<Ȓezsm0".@`~o X]^t*@~f"+ P+x.2+b0J}0g6&ahW N=_o"辺Z4?IŝMI3$ljf4j1?0rOs]}T[FDaϰ k KaMBMt9w1@Kq<- {Dò^5E U*,9#^=".uu@w'O͕!.^+JwK_ l[iD+3^JO(7ZL&A% qãje:;B=i"{Z07AE5KD88h ޏ_CSh3كYi7k$_p~XnH):̯{ f*Ħ _~~AP.~SQS vOQ\6\(:JMU3Jj%V$CBGR2U 1Qq$FT0K+%='Lkr=}cn2su8 -SZr(@3Qp$asjVPZQC.r$i7b`inR e ;g 4줈Y)[gɳ6RmMG 0UI /悚ל~Z OV|o[ZGb$9A8p$pI\i#4s4&\) WJ•;0OILf;r8]UzWj=]zzj\kw*\TvK [T7 -,3R}g:-78< [ʃ]YiW0 xiVW;n)-F=۫ހzOɢ ]iwnin. EO/KUC>-}\lOX, z_7?@SkFuQj0LK`bv{rop®cY*KdƁh:VLfcQn\ &s4NS_Ϭ4П2>D&;Hp䍩yV䐇Wʛi]o2#m|hR랟gYώYߋs ayb"pIIZ7;+ ^2g`S9C5<Ϫ\aI2hq_ i8/-Es5-Wz 3pcքtCŵX;k=k=Ԯ& HFe@4"(-f-Yjn%˲ݱ7Bch?/߮Ǝ-p&~&0nc`U}cSRufJ0(3Jڴō/ZCpxEf g]G,8GP\?+RD eU:2+>oT lz bxOМCF?hMk!͜a8rr:gC:\c.hAKYxXzpCZ%U\^8,w^Ak::,`Ԛ:v~*]? Vtll#Vf:v4w,>dof9<$??u4ەY{?{r }5ϴ`)ϛ]}Ε״ 0A'_6c<<#5NOtgL7>/Xc5ZJOhuۑC*DDǧC[_Z-^ION*;X#6+1aG2#P مrǓŬM1ۣ} ǩPv8wm߄ dd+uW!.^ KЄXJMV!pe\"`2VYqXc}[#=\gQ̣蔞0>CTCK֖a:']AnJwYUUIUvkZXUlvu[-]]P2e{MECc U2ÑJT&3k]V#{NT\jjX>T2C2&ߚ6k5^'LTm{gA6[pz@Mъ bv hzjfzjOO힦Ԝrzj==[VNoӞNP Ka=P֩0G`;%Ԩ*PK0 N@n7^ &cg'u5 @ Igaj[`(z?7HtaCfJ.4M:꟏ )A5҂MHpyMqet iz] :h }NU5I5NObTKɨ$î2n`JAC{HZwbŇnϝ~q9+n_MGzRiƗֳܦ[~Mdb^bM{m ~h*!\?5g9+c~X} lF:+;c| ,i-I=z\}0 SCM|"LL/%صs<@""E_`{s*jơu U|bu5aщ O-lq%Ӥ"Qn<lux ,91w W =`h=<xVӳe>o[" "_D@ BfZ)2,:5J:ĩF96}D 7䚇CjS踠*A1z-')q0CV6ݞ;q`f+E0U&ic:Xy k_K(hO/ji^?޸"CoT^ u>^;":4C5Ѧ4=7D͛bmjBڎZvW: _#f)VKu%n\nnc,E\*<{i(-Wŗ؆)n9/n&jMZ[}=~;A=)[4KÜ.  9~Ԥ-dnNv{KZ:xb];cD+xK>.Օx UMy?auv` ZBun%/IQ !N ïM4Kű&aޗM룉4dOXsa0fdw';UVd!24pJ5GmHP{`\$#d4b:I=kbZ/(}:Vo7R7>2&K3 2lMEiXv5޺#o0Ǘ1,tIkY{>HM)7)c$,dK}2#P #h껶ſEmyF$SeBo^=P8WP'Rۓ%Ɛ U@/V0I{B+kk= 2^=E$0sCEo+"MpFû\~83t:y,|G]l>> ??^`cr=.iL ~+[m,nZ_%QjW=OIm4Ƭ7]mУL.;(WWNmjr m}=G,o6eX5L`b'y˛HōPP2G __o˾7"J6YՈdP1WѝT`)Ba I )+j12MȜT1D)*Bv1 k!Z׷WF@AN@tbGf z{6MYr[3wP]U9[bWx;}vn?Ye-;ы1im(: <_.ܧeB,T9-.o~Rx7¾Z_/4ᛕ^/SZpGՊ7R@ԝ:کڂ_q9}x%JOKTcRUFtQcK<بR9 n+Mx aK1[4P's;!,{(RApg)RգO>d,1C(4Ҹ.&ΟZ@<ŋ׷і~N+%/&8qH͗-egH ʎ3@ ^@5_* aBGxr:X3s9t0W=*9pfkjCN<>B X&-]LUʳ^_GbӚxQ]rG!b27fHʋ>r$|]_PFz\Z74xܶ|Ýq`:t6 @*ԋ5OU]$nn6ݚ9?% 5,9˘ՙq\,諼g٠#nXwjuYOS{otkȀ}dcM4 FȾ"0TQ͗%ȶR-b42MRMnzu`lc4k1:s ҹ0R0ͬ_,Ft4ՉeXQ-6YȆ;>jު3) a ?qkq5>Ť{P(pueVb(P i M@p' G-B=@;$Sk pe n7lpJ8'PO>[cٽdjRc1Jmu C9$ֿ F6_"|=썠([;%K!TnF@j\pDt u?I`&Z͜,Eg`8|PE ̒y#ygkkϐ)5FP)©σoBv޷|oOv+.웅3*W%@xxl B˃AymFCUo:5Db Wq ZwG9+"k ] L0!]:I\MC`\{VRede/ |ͤ;U1E ƚ5AC4GQB/ )l}R9m 0@$CnQ-3hAȤ~P%sYgP1C_]3s"w b||f (~CxD8}OgC }:ɍzPL_!ױ`aD 8㘅·xj`yǎBM4"~(D<θma!/ `iR1VE+BMc%8ɮǴMTfꦃSo?u%iL0.7nZEւ!âKOF/b`4bV鹦[Xl2{ IIl| (WeH_myfhM B|$R fEF8Xp3&': GOs _£bܟ͊8Fl#`B絜XHC*!%+{b1uRu>i.MW!%fӯ-MAuvHȣ*3nX~@N \ HUiǧQDڻO4M*3^ Xi, ޗŒgGϸ#IJsl3hd'J ?6ceZdfw;%I>_ؠ̊_1Qu^2OKڭu2)"E(!Ysʱޔ!YSxzO=\Y{#*z_ƃ JPQ6gȕr8WνaOسזՃ[Fy(/EgYb<ޒ0-.zɰd0̌ޙn%^t,^;ڌ8C'ﴼ_U;kJĩ*W7X+i u1E٧zZ$~eK~Ux-S~x]-WQQc%pYĉu6]d_,BI}RԖkf)ά5GpTŶL77׮wOdCef)t>VCg'h+h؅VkaVm8mCnm]ÿW+ϕgd0L6vxeZk(zU \ֳ{8(S:iN(,rEDr2Ɠ{Iy!Mڇ"Fͅ-@޼Pk?^: $21Mzv{\w6|b :s`iMQR^ʤy:Usa&&͈6zK TƮ;Daxf :$uZw,~RK?ak ȿD 'xNϷ_RBڥdGUڟ=Sf;oBMDة?nп00} *WCCF:zAs3jݲl'BOOIB> BB2^Ҍj<&(adhQɢocg+OؚԴY~SLV@ o?yw`*y.vNV;v*Z-r3-o_yH6A GtUYCP85"FԶ(@ >k "w#y 0Z(bFnt$n%Vz}.nrh%k9g9&)d~GYEU 89 }))wOԐ-lhF(e,DeO^dA7#O'( O'Sӧ  :hgѕH}]^Pzf7 wLȻndJOb2cfsi]^=G0sOLٻnpJű"xՇ?,oǰe}ŕ9f9Y&4Jz-8H?B2)o^ :je#3jX74m@jjMF }s3skeu^sRʅ]Vz=`ӃV6Q6u*YkNCkwwjN#2W5* reJd6O#>N*~4dnX"9S[n<*mqMއݢݒƣ8'H#3Xk3hHR\NAw_]PGmQhGnΟ{QX`Uo@ZڲwzS줊{wJKBAv-nh(6$ڜß;sFYY=?cwGۮ(0lb1ob׻n>ٌUW_q1{_N0w ,7++U)x?#pz,7[[OS%q[*øIIUo@To=1ݸ@cy@ϩ68KRx)\ʠ.N#\Mʸ][Vg#||FL_nЃx ;C`7aq:E[_!t\푴Պ][}uCިyK-8qI&>6{ ҵ̬WL0bX.J&m ʍjW i1 m.7$hbt|0y,s m!B) zF¬%^WF(]He —9$Й7K*e9u{%e;x)|xsI-L:*2ZUС0][A]r>ọ~*%TZho8r] 5ƴ5.qTqKGu=py`AT0-7ɚ H!CeoOkaA.&AW4PȺ0b_[% +mۇw%UwjxgܚSVYi Wȕ2r;H+^fKrL;J:A[rpI%- ~@:mpo}w)S% ݆ ݾ"{ZDJ23f4׃`=q57W ]uS|MXTcnQ4Z`Un卅G$ԵG%]ɢ=[IMUR +ٲ*+Xb} Aٔwe}*c*-ؕw&c8fYAهse-,yGLVj V_{y? $jw09WY:Wq+x1)ц2VaPHu*h_]_/|.-hHCE߉uQϨhs`>ˌjU2P#EٺGUKU6JJsO!`%'>8LpÈ狛2J>Aư{ز.>dh:M&\Ihp|aZh\kJ|lY @@sqZ+Rf :RWͽ9fN@fZ@+kp9*WjWj)RK]WjWjWj1RJm1Z|J|v{R=_EVl[ԊEJ-+[h+R(_[)/e/^}֍d(>TlC7"5r+-R[KKiSt% xRK4Sϗ _򊱹TD܉[rRRflp3+Y'$4IO;5V?Z̲`LSʂ.{C%ʌLb+s+4P!lTXY6'FG߭[U#pߚcRMwJ[GZE.rY|RcWBݸy#ٶS.fs·RoYZ͎ƒ%AKfVrU+SV?3}aRa/i]?35yL`]=?>?7K0RU&>!OMU_HIj X[| d*IU]YZøo2~a϶PC )߆Iξ+-f" z~_?RTZ}e-~,<`4,%`$ɏPn ~rn( 4Y>y(+iG&MoukI7Z-vgnj5O1}f){UB\a{dr0mbM:7j77\G:[Qy;|6+[s^yMDJ O q-Y[WY+RZTi Q?/֨]U;QXj~jKUoUTZjɱ [U-U?@ڐ(@ƶ^:ۛg)Gcj_} g03\췼<0auF=\o4Ogň L.l`G3h0f\b {ڊgm6\p6%Ic?c O m@/nõ򺃗ZY,{ΕݸCh7>V$80z`29׈뿡c2 2bRj)OeJ&#bB!b$>o Tʿ>T 2MLd'z݈֫|Yl+gGtr'< eGLχy^%yQFLoԤ| JKUJlzUj1_6t?$Ru-v{;\/8A*+SJGiyxS >&HɿuWB0{(ZMN~ݍ 6!{i *S)I -+ahzajѡՒ 88UUgJd+rje+<'!.|(dR9,)}R.v xz~??:JRŗ*P>.'Ϝ?U*`t@Q]CYo:ɿvׅ)o hz] CT*tSԘ/xF}È'qtʳr7~7)*dv%OaUÈ{̆ksJHg}E旝RQ;vٍBc!93a^)KH5^/)csޯ~yW F{YoY*lXh5q1=;CIҺc*(WƗ>慟ZP\#˻g~_G$Y:H΀08:i0ԅA1<|c|UWE@_Qݎq\ADwKr`gٯ(sg/%-w%)2^.SC9,@<9_r WW8;}ff&LÕL||]2ۀ'+\ɮ@ݘ#*pnIojE/&m \*"^x犑e]WaTޅs'[CQL8nZgd2nY'xXRC=$/8fg#LQ㏬M}M[;P~oܪsW9-8m~vHhih/8lmgkz@¨tjc%WGF;*-yfqgZV}o^/s%X=WZ֯=ڜ#:j2X)1Hl}넋79|F+87iuG fVFt:>G_ZNj˧OvꏬocM,s[_ϲJ#i0SkeW[Eڌ}zQs^xrcces|"ewhcE29>9 = &cvl,r>LNF?R{o$Ql<8b#ٚ7kry8Sw'/~9O; ;9)Z$p4@ Ioqm%kKr4f<E~0s-1pShD'3E["9TCnSQbq+&-yC7GE/Tt69bB󓊻4:%7^O²#06۝C]UiQ揍PUip>INwZFQE!Q j3{)Zڤ~Gn-5MwQDt_ѶO߈hGa݉R66Κׅ7Es4 y^^>e;ei;--__CT0Hvk6 WYх& &-~io"TLU!~JSjPL-FF,DuۂE>t[n 􇥧`?s DS@Ba7̾U涞[BTh U\ajK0%6P Gt6 fm?v!ْL5?' _1eO=e}=W.bsJG:BxK|Og){顣x a x+_~O|hI[t5 h+iv)9TP]}XT!KOҍJ1*#; 2|1KETѰ7H.90$M,SctQ\}B`@Qs/bj5_*Lz_>lezk-j ĕ;C^^oDm6.Q bKv8(Y(lzM^/wFYS!tUM].쨛802d|vP<a(vKFk5 3򀠨oˋV9!{*Hhx/Z]f峙nF{+s0ww_tut/|[@#h-|;xۭM]顢iv*lYcd;0)ּIutl<|Hvٵ#;' |~\}"`0cs2Bu3ȟ(Iݭ o+3|62WdML:À;s^¡1I,y22_BUq0'8D)w,~άnb&x#83!7 aΏ b6Q۝CJĽ% 7xn[3΄]b.KO1xPYY;V$^C97]qZ5!+'{Lkh K0yWnUƫ6EK[PNZ:Lfz:xFW:W~|~n*HBF1}0&8휻ڛ<-` im.:> &H.u>6 cCqlG*>,unI+ko;Xt $VLfzm1 cMh #ƲܟѸ8 ,8˾(}jT["J84JӬ""V4ga(6 |b]RE./VIb-gSJfԾͬ~:>/$(j-PE@4HҒp`H1u.nhY :AE>#2.$kE'fmEMuB x` ✏7 V ^*/Rl/+"ddžj1u)gH$"nM ȍ*-CPl4yq VZ!NI❄ ʹ'xqKH-fAA`2&.qU5kpTj 6tў[Eyxdŋ$<ǔ] c5?)d01} :Fz^1mk񶓎EFM 9S<ʘ0ܢuhC\G,2Ҁm89n ݰQ$޴ [nsuGߍ} >w ߭E`7l"?cp?r~rX [q=(v yR`ߜ{!K"XNܑ9Py־H 219+OOCtL=5c0 #񈀠,~+}&;eBB/* %DCKmԔB/4CFYT}%˾ J ND(x Z e]baԥ)}H\#J5Rƫ\Cb1ލ4=:̂Tbrz7y i3M[v=b@r0 ?jň47mPf`{ NHK)Kw>#D8'16oC>2QYy Px|Ñx, fMf Zbٕ.`#BT0a\~z+qg )$0G3-qR#ev,;_E^qmotSRRy.28{Eg7k\B nlc㍻֕A, HV8P}ß(yk-0LOO!*\BS {\1VpLnf\8#uqIڍt*wc.w VFIS \:ۡCmy /enˋ9kˆYs$ * ;Wn[0l.777kgj.9-E1I*#bӨc{į@"V Yr$+MaV_9ښSu5ywǩtF>l.T:o, ]$U=PX*ԜQjF.@*ysƭ9oܚf Hۢ9tS^e2ַ񭾵7EqU9gTiE Z5Y9u<_)B>q#oMBǮ8)T+}75SﰺUe>ܷVgfgE_CZa"iv,%GqJ-8 N<C =4|ڑ8IV\{&V$QTkvzj1 ЗW;Ew^|@M,JhM=򵮲Y*&j6jebl$D ML_cl/=kg?wk{;xk} Fn\oɛ0>W╾؃H:墺Iӛ{T i|!@P0mo>+O*?NJ\&&(tli`1Ȁ&--(8Sh5,>X&{(0&zJ;JpIr%5 XimϾc ?mu#5yQݝzryQ4 /S/&j ^^E-^H *{(DD'@3*G,[y`7v%?l{OiLlJ NK뿎'<3-l2JɎno =0(. XE{Y9R.ז*vr5h[E>*+U<"UM7W[A{Evt N䎙XΈveva)l ̂DY(A5ڳ?1k$}.7uIiER)vt0e5 fA[7f° [3b)ijT3J22^dR)B⎌ <BU/ AEOW$,),'Mdx-pE}X ?"l])fQvs} *Ԩv 4˛(m³z+'@Svm8WXD2Dp\|O mqTOx{.i=oayP3x;5E0'K|&$JoB hu-L%P`I.r\т9r#bZ}Ym?z'>9`'- ݆ףa kzAh>[;#EN&mEvWD8wB .$!OXd[_e 7"8Yue K5i6 vyTᇡrA\B2̮mW" R*WCUiyWsuYUH,fl:]WcG&(:V}-cvJuL΍W~4z^^ 0bz0R/Rܒ7iH^ P!W@2` bl *Slg:Ed0MAMj҇MAQ wsr"0N?󜓖yy#f\> cˤw 9oY8o}^i!/PA7]<3:gw_`EWti+Ԝ:e6_x񐐊 Iu{:VjqORK=ZfRrг v߫UKVU }Vk߇dXDiYʎp&{*YF3yn@A::=Oȁ`8_4Q엲ݗwng D^"݋lvҽd+'BG*9"PɈ#&zu~haqvoU\t$ABl|\ o7-4ʬ' OIFځ ٚDl7HSkigX{YAac_/agpy'mܴh5 jUMTV:"h9flKd Ԭ5֊,NJgZk?9d=tyv=Nk՚E@%8?"ę^Dֳ+*77~\y 畃Μ ʆ/ eel&j[gW9c|q4d?CG}c>F_廎m(!}g>֞/io8#1h Q>U.Jf@+ eXIg@x|7%& VZ//7}u Τr1gqsn1|[\/IDeeG^;DrJvDKAS Y1ՁB x:u  s|&M6 Hp6T6IhgKÔ{)bu|&6u4Q}I!$i96o.^I0/OP{KdQu8J;-iC-l Mثdu4H+%ea(ziݑEvIWu EI9c"O #KpG+<}dG~"\T_&So TUYjY(Y8[p39u~#fgT9z4+Sf.laF.<@?,+W k[>?j`9.,:w(ߜkNSIĂ!6Bm !QDhlWꬕSunC3*IubL'- V.V?8K[!tΦD5uԞ=.: :wIĬ`{8V-՚=zВiSsoRcgԵ/bPHE qXqly,DK "nIR˯.I+>8IMSO!-Ei4}К83uq1`ANF1A0JТwhZ  BZ/}TqJmd=ld A ,CnDyI7BKE&(ZJTcL5kiRϨ?kOZ-H벡-E?k b^b?%!ubR ɒS;m`ۏ{("QR(EEDђ/8u& ,Cm0𷁆1>݋ IV8ҟjL:VtPSo}68g7RNRg}}@IΑEh)Ry{:w[ƳB RE(Ym.08Ok5ӽtpn,)B=fiC1$m?uyĦ',JqqZ"Z}?:TW_2+8d/sP*\CWqZFh~g Zԕs3՜J~qyrkf] &&Vi؛m,3\0,z)YIa/9j2rbD~!y}Z7vBJO(IAhJ5wxqyo8Qh@ꤴ-nOP+1Fz>gK%" lrVVјpOm|#lITmӇZ:B_?TPYM+ȃLJ-R 'AI1'BtLvI.tCUo&tj\9kڔ *5j ۽ .=͗ϰocURž] pl%;w3B ǧ8fH<1_M42sLA=]zV{bi *%%u:\QE]K9X/q\^T#\KLM mI"+GsIFQ% FeNŒg!&" cSfsFl[F8Y]Uc`CFpyltl  +W+u1~NtCQS7/u/+hBD8{nӂnTVrظD.SJg٨հõhHM NSY,uxx̞38G6 V6>'r'BܒU!}r3Ojfa-JDdw$u<G6K.}0giOT1r/y䇦E!'y:ie~P 9gs"s;WWOcʰΕLWg1{EXr}FStZ۞`t>!'lDmd緹D5(-ǤuV\q=r0#G-ՇhkLni^ҷ<@\(!E/TU*\"\bv[]%0*E< ʼn+ qo=F7B%2L2Dy Y`4jg:O ހ)sG'%v^; V9J5ޗ`H)ߒGu2lY K sQœ`2@\gH(pwa"\H(XX`oI`/=Ga`A|gK5\i9ZR= aa4ܣʂ3[E6G`Pn@yO 9L.(麉yĜƔevI6`3?L<ZzS Fwj0\z-QhS*\uO y.1vB[no+F Fd0,|\*r#n:jq1?>"=)I^'CK:nOLqŢ`@r(FC lW?m>EX:4"+܊[GCgI/o}r<&?:cd|!g `HĻpb! !ލW'Xðw`@0#np.* UH(I%98;s31?B8/U,ہ%G)Po&ܑK1?No*Cئ, siGOZ>E;ʲ7B0H*NI2+%kr?~p=:b cBدw_Y/BZhҴx9g%Box!hX "(+,\ o/ݗeaRG@Mcn_/?\I `"tW]Q͋vRwJEڬΥ-g*\1ϼ%BD^9.<+&u)|t 6\dt<ke}+dKY;j@ۻxWmfߙk!p_eE_N@$Mt@m'`d-K+`!tG٭٥bؗ>P:zRyHj]MBk&b,1BQMQ5%?:D"x-FLKmlR[+}kVx]oB:HfDSK2^- 1c UNq_Bk}$RFbl5l4a͵g/G2sb>&v.ńRR}gOM9]/$={Mr%pSNd̋,K|Q_'oH67vgu=$M4$=q8Z {EXduLDH}A02x(B^coKIsS>Z3W+&3_͜cIqrr޿rxV WfdXmx" i|QBɜ}]q "a$5MD)ҟb#!mSM1J5R鋗k[Z,ḅ_ :+ 7Ql1/ gd SU(cvsvCEد?Az&FE6 /u6lrl--t*>3L-&zկF݃>Z|ZsP94.O^V8U0?l=+e/+*T6LS?F =m*+UEd!J֨d{O i_Fh@ЩCt.e;!tsJY~\4emz|☜;cK)2V'[pDWO}@UstBv阇\>Y|)?i7~V?:lZR?4F,I#Nq8>#:H(\a*xBfm<d?R(0Щ8TyP e0H†Ȓ4E%[UI6r fCѩS3+e4 jSKY!U܅"8#6$*bS[((`D`7o f2Ox:QNUmNͦ-&Xja^7ia* %6Ogeutd9*wmcw;r|*Rɑr{y+ z{JhbsIc*?{^e2u![?:SO)=_6Eca=g:'P2k=Ĭ3Pz6 ;dy?Yr(Yt8'\tA3mjy 6?%EemvZnv^G9^{.G)e/ڳ- A)d ^5GC]/{7Ù5t6wl&㱅D>x#I&-W`8#9{ت7ԯ|_QAbM4lj&}5! .Xqk:m]ҷ8 ~7;NI<(hh:ԽLs{z}_:TnƇ>IqGڂV r6X{$hQ-@Eg `|qaV^%LĦ{z~c+VmFmzcHγ-5JaX )w6DbsN˴ ԩnd6UK O>fl2X U G =VY†\Ű]Ģ2|٨aHnٯpjfN+ԅ "jAI}^ʬzH7HU!5Cac{raM}b-u4 v ,61TÛW(ڀ &nJޗ1s^Ћ{h yA56ķ|iDz"1p4(Ç{%:dMn4+ bѹa(tH% 3䡚b stp˒"VAZ<1= Oҩ{G/'Vٚj}~)* h#NY@] G̈쉓s.wsRwYrǐkoj!%J .gs苴1u2*ņU8Ij tF6HْtkUy4dzG#z؄&~V>ަO?݇ړUn׶l֞>[+ۼvDf2\rGh_4LgLa3$Pi0*h=LfAFVDd,+)\:Jy+om8qएqΗ}PxoP} #yM)8}tџ_J䙽$avxs (GӾHo@_`K%ً1n7e5@b.r@6.L(m<* *!OĆl@QyTϾkBz?$+s# D@WV}:~=y:4ݬ;qkdÓQ` 3 H@TJ0΁ϧ G-B 2Z!hf=k2||4Ҧ~5mZЙNՕ +.A׃/ceJ2%h& W6B:ɽY*7&ޤ揤ח,XSAÂXu;Uy#q׻{ PTeT=WvYN[_ AeD W$OFGLQIHAN zIٱ劸Mn/=`@HI-kOq!,bh< @g!Fxq+$E oŀQ2_:9ekE͞C`s4@Bk"H}&frRWN;x]L8E;R\rp\$g}[/L4DTeu+Lt&AA8gr6 D}vO'!TbT:~2=!!'Aa{/ܔG've'2ZX>'qa~6\D.[D!aD9)iX'} boLRq/6xHN\tKl/ X H 7)!Zq@]1:4 q6Y/9sʖ rN {K8)t6h6[Q+|-* P0HJ i:z2u8 0}2+ޠpS&B.EA.& %k5#<Kl,3]%"b8IκZT`CN.deVhd)88*bR7AnV| Am /:Srtzh{ v Q}-SQ7 ) ,ipՕ ԕ\4C6R:yAk-W?4譜_( y~`%Ƃ-SfU౟#%^٦$h8kui74_GkGU9܂FR%żO4o.bBy>z;!@%&0ЯMƊlّWQ`c^䙗gk͵kfTRyI|6L֡.*l N({0bV*kR3x!C3EZr$a^|sH 'KypI: ʦHhlJCϬuΒTӡ5Jp^waޭml$qe\[_lBf kl,aBpޏ.<Ց#[̳s+KMxtiEg5a^F$OiTEV(lZT*%+u8h%@Ϭ$wa為ЬBG*I$<;ذxczOp˄{uaiN.VJU v:'jnuX $Ay-K/ʜ#ke .{*wBw-@)TXs3"G}\*+wc;%W\VƢU_j):!DrA,!3¼#cw,<]l?9JYޜ?>cK8Tq- C@8P GRcdžB{ieJ!(aI/3~ulS{iSdns1}qM88=G٢;D๰pf0qi]j !nn>nN>]@2Zzagg{A\߃)p4Ĩ눀g7i u]R!_&n׭<Lxo^SV{$c&SmHZtU]VBT7n? ?OWq?:pfIX5zEj#mx@ NqX40`̍y-] bNW@01\+w;rG!yLbCF 'zeYHG&F)VBI2s'KDWHJ5a tK>sf;fjW3\1JKn?A\>0G7PJ*ӅՊHaڭa'[6e.Qb`,*;1aJ1cWH>,/ iI8T)wyGxpr<>JJMZ$YZd7 SdbxʖtbF3++WP)7Dvgg <7(U V3U;:&ϏBu.&N@O UvUcUFxժKé`^daԥv/ CZ-aDW<#TPO<. Phmu?uH y5 6pyX6?oTwNlsAԣү\χ=*Yѣr(Y `D4L5fҾgE[L 쇇 9m@9-QY q`IJ_cfpјBudT8_7V55|L&Dx)09Š17Ù1"uZG ]loe xWYdMRLbnbPKd!T:S䴡AOMi&UW$эRF7 eg$Wwu))vC bdpL)y(jW?o <@}h> Mh\GO "WtY号[rH1ԘeQ:߻qn!K* :9,!KJ5%Ao֮!g y}$K(C>(ѽIЦzu{.^V~J!v 0aer"_2>!h}[ޅRPՕDW׏9]@.}w>u[$9}%ѕ#[ )?QB~W k;n&3XRt`}6[oyD.yY\CT#Z{r$YZR!XI#Ee . X)ˀnm ǒYw>euj&ƇTd7Gc:]!hOeNeIޤWמ xq&+$汉!koad`uGVn!yВH^)>nb^!drAVBHZQX]QdaGsbp'p>ްWaKr6@lq]KYF {=kMSV7pX]ʕP84`~)9(ibkX&n++r4׭ԵTW }Ya^s⹬W TL׼"VkCpi ]y^]/ >OS[LƼ4?Ra穉0nAHԼk(8ΎjꩂT^ &YPH=;"u)$;d{Ihu6ڴm)Ӣ*4.VtjKp`upӋt&;ӗ(`յ uFnU1sv[N)BdkuzRLF: Q|07ͺ3 d  Sh X7Fdhmޜ)D!R9I0VueY $;-;lT͎nc~*3C@ח(w[.@K%%XpiO0sdu 90b_S\9/XL6 Ou)'J1sd<+W2I E4C{!y4Vf oum1 ׹77c,nKdB^ nHZ3RƱSt,JbP+.yf| ޽1$$)$ [!+E2ᄾ~'9NIix3(7'~TpW,/PTA=o|LB@G᥊o+0Ks'#Օlt"@* !( .R,@ ʠ/T"5q0Y ДGh`MѠ=DIw##ıÐBPSJB =-i$-cJ]"~~P4MRX{U :y)ΰHB*"I,7 L'D^.P3EvD9Sڄ9%ÐmKx8?XX%Q:{o0y ’At{4 Ċ` 4lK*åWf טe@˻^VZh32¨2.WJ aCˍf@O%(MpTph-HK5 $Id W, E( ne!U>V^[h0$M ;LvڜĴF&tdN G4e(hbF"<"t YvjI`4^@GF ǁ+&`F@)Fq WwXG-OPSA"e"72fXwyGYDMiBI}V{8 yRO\6@w DӪF4-`6SBks|0xBd$jnM(F8upfY_ɍr,`hH6UX@Oa BgTBw}A$xxB5 {: G$ QOIOJR=Dmt7`p5i(_L#  ,ϟpl:p0U?th2\D 0ǨW /8& ώt ãbT9c蔲z.ɵmSs_4ǃb/Bʎ&zq׍)ڣ^{hSF}s4/*δ=x2c=ڐ <R \`#cMӶ^|[fjoif+'b\JfyGek 7㏷1L(o|hxrxTP"TAQtSWE7{"`|S}fw&kB4 QQ*8I*ZO(+.EGbνND09ޏx9lTiy GۅfmϿg۽e^^Evjn}vʝ,|Wrb20]r1n1`sa|7"qYbs;E6̠QZkwvݪ#v]H }ϣ˯vWol  {l{% xCeݮv@)'^Z8x#"/櫦I#7l($Q@`QJ.eQBv*RY D#!F.}',&}\@L7cz2Ƕߋ%*J-ݟ._- Ū2V^5 ڳlS}No]ÊYހaz.yԷƧ",e٭NsnOta[K[b!#OP:9dG5mޚ^~G2vcďc63 Hh&K{mE3@nVaO"Y%^` D4-ٷz&frreg^ 4YJSRr)8t!ߞPVvF"FF,X.(3ߧ0DŽcثm:)s8WHX-hN8?zjqvGvDUq-HvDA(B`gNJR7Ǯq5݌(Y jjmlj0P9+ Y-mu QELKD!`I)AD#'|V:h?UÅj$Lb @ #bg߲rvm8n̺lMpѠQ'XC.Stı\f6I(C-gdeA<ԽnX4 zj"$Kk$B!Y0됭Y1y{ef:-w_gz/VݴvYBԐ8VP4'%wwcH4_mб%aQ#F(%nBI\ȂSx֛u"5OJ 5!H5i_ Ӡ^_WǵOvg?j=cswg^^wEmcB+5c7lRdENi}W,S>53w죽2V'[=X?¦?>BsUa =}F|'TrgOvY谹kg[&.n[q a>gm;m>0 xU\z6s亴~" }^)>%`x S^t_5A8 h;̈-UoSZtfOU^.Mг }#QBr]GjŅa31RAE]` X?ZXΤ2|ɣbj.<)XuTbݘYѫT^Y]DZ%YL) KAՏy GzzbI,~d OR__5Kކ`%LX?xIvꍣ}DTkÿ80l: ߅ŎTE9=vtQdxw?j93 HNzЄu_flhtF4ڻtY/:KFtvȷF[?n9nbW*J%b,Q(l[T/tV~i0>n#``m5:e=G[)m} vޖxW UIBT85-t Q9C;ȗRFlD&Y֛.(nH7R5zgPx'1jS9.Uc u`b\FZ扣GVj<.VE!t+nP^^m D!TW5vq6*./A%N~붼ەf~T^WW^,Wx#BZ#GV8?淯8RmKf)omi'-E5uxҬ yd=Nnc&Є޻WT/ حI.$o.;ӀǍ8M*q9:6U،i;(Ø +dkVʂ6O =on[CJYL0 ryyF &<Xa+v5{wf8~c$xQDizxx7a.T47"VyĖ_eEVCOϲI,Rm_'lYŁcl]`T;iM̱0qdm7YDxw| }f-swKݳK6wu`d JmxZ!>9TKgx#f#G6>AId2r}[ ۅ[Z)-?fSZj3 R^;{wZD2+ qj%X*odm c '[q![ܥ㑾Mƽ Ad"_9C NEKAT S.;܏;=? }9%q)Ѽ㑑d3~w{/սv9=+8CԙT!OP#\rs܋a+4E xSK)_^9oCW= םBxo>z5P=fc#\d4-+U.elHa/.~'BF'͂l{'l7jEoѪ3we,6SF[&9Z4f$P\*U8BoJNw7J f`N'ls=)CFx5:ٛὶb%F\'8'pA]晴]x~ܨ[Hp3~>_5wbb8뗶VHdj}탇SKY*0WmF:ӻxL`Gϛv| p<)mڇBM G"xm!L%|9BE5ou߆ c҄R/B-2C|4q֜}fr T$J)ZY25c^m>{Oyቴ?s`( X%y !M.BAIq_J|y,.2]ޤ7}*8Ji@'$ uX Ѵةӊ=*GzjysCZXSs`w9z #vV?"\ 68;-j|ަk7&V`+nj7bQNj#y؃i*6͏1nt3YDJ5InYo)o'z{*gELD%Ց/s1L!-p?Sb&@>8wP\{ %+&!շ>'1o֏貊nrB$©ߞAy>J \o's#cٕJ|ڍL1w#Vm])RwL6\y jעlyac'FfFZoWTtg3?n-2 F6GؠAN7(w"j8GG.@Dl$Q$?D8S2]uwj{W4[l>[O|n<󸘫<ǽp{ * >tM>ǵU^&lJBVbtיw>*(&7e+gCcy6IM5!=FXՐps<ѡd%wF] g.VÞ,v4#=꓅1wwh8(Vo bgזSIZߟ2eBҐM K3ex. , .qч=ϐ SBR4*wu492`ej0:^$s3+ .a5 ۓq* lvKk|-v>3|Ѥ71qDA gÛ$MYP~<>HCm .w_Ǝ& ۱:ѾWvp|7vW A9>[οv1/|CEb3o?+yUMtrCB+ou|էOZݮm=٬=} U6]f}z9uƣC/ PrS‚yRO٦ьKjH6&xZqGOp^ZuN8Wڀ7*qңIñ/g_1R:>{#<&k< x}QIs(Û3Xo?Mk lɑ${cw{S5N6. A&^$1T#!aџײeB_ @eu )wg( 4o&1+!fM7+xoǞhwGGًnVGNx=هCIYA7پeNsD Y@Ru1x-azwPd>lϧrGgf +#B3Llvѣ_V>n*GC.mWo~ăZ"w%Oτ#tR B@z/TɼT5+YeQ`8.nN@ ֕;w$)=xBз bQ>Le sv3E#v=Nk"i⊅ʏPzN"Z \>2Vp$~XHȷ ֡uR|߄)<9Mw=X1%.i\Y.l-w֑VDs$ʘ~E7u/7UBUkbjM>пOߟrF}gz\jrU.X7'R# mtV~Z&9[ƖoS|%EO\y"mFZJhەa=LN5åp(.NIg9fr˿ꓬM3O 1R;*zilTmSρDZE2l^}jujEoD(,6ڜ{t9:1h+Jt6c Z*q>--V2lZ$9Y#Ц6Kx 1'MYk d23 ;mMV&kX~فs :&ڦgZxm7 f kkYG:o&)3W{aʓZ4=p5FJԪXXBOnn+C\H=iADoqYW#~xR8j騙vPze :G{Y WeT,OKAb*I3%H9T/q0JeUE8Ȋt'ǃ W uJH)8.ϽT!o<1RN(XS(r` | C:Gm ݗ'.irP2Ko CK䤘Uo*X&utnQG*A{xKdxNClA|8CMɯ2z.qv66NWd 3/+{E9TPv^9 ޝSek3t wy98u-mW~OMgfQ2U^1fGZSy`?q{#CМɳbTT6Ku4M)VsC4!Ͻ`mʣ˓w;儥]ZԼ֬Jr[6yя5#[Y%;O.#\ 1R]j̽TMXF"0Sl@\~4Aʙo@adPnʧet~W(x|Ȳ0 Xxnt]UQ2m%51+H0C_.aNX-h-lTW; įU_(+gK "#Fwɾ tltپMJL@)(-9 is'c0eWppz٤\Xn]\഍z<\9Pոxm6ҿC{щշ%3034P؛qC]Zf ,x/ЅVZ\mĂ75UEIl/[pD ,2ɉ}B(i}kzji7'Yƒ溡ާJ?7V۫Ժu?[XO꽖8MinbHlr Y仄\huAE m7#:HhzuLc~~~dV i 0e"dOJ΍T 8ߖbF$g0;@NC=u#TxKy'V22s;h FU5y1 ?/9j[X 3ʴc2`0Ms/8jvZ)/Tsq nA2RF/p%Gfc& VSAfe8$A[mZиh3وܰ`ƼY[? kGz:1{ƆK~O^Dд GeҡõB}mC.,FhmȢ*fj8:훌|{FKETL׫)/pD+U8 YU,B!xLFT#g)12Q Y{V&21N??yPŘH9Y2J:Q]YD-ɪ DZr]@K.Sn.Yu;_9.8-Va딸#UwaG[{6* us=b >4m<SМB{:rdyvn埄DKGKj寁ow6 (0ㅤ#Ш.sB^@T*i4òh5ٸoYI.uQ2F帊*W#1\;w.+Ż \ fw.I7Vr.ӰatQwN4݅ BH}_a7*H3U׺LUWUNU~wQU VXel3PC|OAݱ[3؁`s 58ഘh/d<l,鰂uf]>l&Q|A{Jᑆb-$+PTvH>]Ċ09+O!-cK q7{%1^څpD~y]W:Qėd,FqI:Y ޅ:4^ B ưჍpj:F3!a|0G]F?% ,&_'N{iA:s=-e0LN (DWUHAz@3$6qbL>I߼ 2p]ϔVG=1~4TgKgQLY%zMFE:#`( ?N)7DDgzTi}|A=m9zXi9Avdkz$.Rb۲bA#7^ƜqE[C= 9k(0#?=n4zVRW٫%3LUS9+ڼJJ^'1M7 Q_bݛ}d% wz`w6F11OۥOvHIma~asWW- %4,7e4;WS%+{ mWu#KT>6 u*1TSl2{8NmQ`ا \KX}yšqإS ( %M\MoVe);0>\ [*bGn@إ#X JJضE ]9]qm#hl7rv6)4sr'^&dSQރ5"#4iS:sy$yONvD!t+" :O.1FTţ(/w5~nO^ 2/jg*/aWqMMfsJ = Ty=s~݉[$Ç 9REE`E8C\|ˮF?/gq6jCQ <ڮ r'ǃ6 Ly)yQ(ds+@56Jxc|x.[z=OpV5>G!U+Lv)2L#sOpA}&Ebeqև72u=(`8لqG%:6.S$})Ȋ ]y{vuٛvQw}2Ya)VW&6\v$)=Ԍ):{ONvmWڛ8T{H OeVjfENמ2yiЉU;jze+ Q 3mL~n9%*~>܏S3vE+t ^F:UJX|[f$C~WڊDyAn&99Fz)$j#L0C\@U,'( XvU,:qD]8x,]D'CH] H^n"|%Ų[r˦]1C7qӶ7,k褫pv,//XjN wVhv +cz`;yƝ6a\ Ƚ͟Qj*Jn_oV:[2|T≀{!Ce\dRZGBW$*Z3CO/'V99F<9UUK\9]DQKީIR PgVQaގa s.ey G,Z >sN/?##'?(6զ~Z<4fFvJ hوp}>BtAs&RR'fVvjҠfNT;:Ҝ@5|vOs[/kF/OxPcMJKw8ћLi6b%iNnRE^R 4'ƣX(VI$$3"S wˆ1 vOH\,qa["/7b,>W.E,cv.G)^r4lOkXWy8lϨf}C< Kne";d$I㽹Sۈ ?٤S0vl9%$rr@ O%9,)EAVPJibSM9wc:E&y(#,?O0A.l2 Y@4M*q}}' hTMk;nӽTҽ&2!r:O+GnҢ#P+=JzHih2s(n^^LVY{E}S<f!1vmtebQ(KG21\uV }:8%ǒ`+/S' EU2~I6m1a@bzb R'Bc 3[Af\ȴxa2_lZ$pD/=jPGh45tic5ג2NېW"d$) ea -6mQ+ibHw!D/9-wO\l[f`:Q會L{)twLΤae,щț1ER'Z`ݨXmbtރg2+88H+:E0dNa+yY7nFk1-7vwlb[a'Bm2'D.z貀ϗC|̜Y+e*_?mh9Y2LDab>Yɣݭ љe#1cOIfm>ȴ^ ~ j-˺#X#e5ڣ󬂕[.񢛡F{T=eDʊ9n@)e[V7l3&؈ Θˎdٿm$t^-NXM ',AIK; 6UsdMA ešk7T(UO~K:.B(8&JZekTJ *oGTnZuqkTT -ʼsB2,eiUl`}QZ;w_;G_>—QX>{g*L`YppL3'qN|%qWX B|N_shz>SR157@2?hQ9Y9p*XA`Dms׌)Y <'N_X1_j^J!!h _{Ԓ\;l5:|;xV2!u1Z/HSG;h@1ceMa[& .D-FV ԌecvY^5 -t'YfP q4[2-NLvF)pgCZ%w~`QcB&Uv \m#3>4w!w6ͳ촀́´}Y-33; ~iiXSS+JZ?> 3 g|\XX9$Jim3LhkS|(#9P[` +[Dug Xы\la1N4{.C_S`v9KV]CGxyICnƇ\@V. +\@VUа mgZ 9իzOյoUYyJHQDP6Sb{rB|KnǝE vv>m W=_(i0ـ⫔iY7V)J Dio1y3cUɚH3}?m<|ӧD SS/#T>aF8 0GOn,8\7ԋ@|dTAɉ9Կl&Xn'0xCy?FVӊpS0A>TcB>q?Mo}'ć u qʁ}*4ͰjT;*Aoq/;C L+:ZFWX'vsP:bɛ?q|F9.лwvR0_ũzx35^ruҳ}Ww5},eT a f2mޤ&pq \g Ow:`J)psxxA`ª+EbD~t.viUmCdidvZ/;cۥI [y(v?R;{Bnm्0FN)8Հn ,F:~Hʩ" L ; "8Fמ5>,3D^"Gpou?XG h/E+ª'*iz0#dZ5avYG>f U*Ǭg[a4ߔ~CCa~S98}@XwԱ#mak]rR `!:,U_-:^cY\@ zz c|iarI,ݲh*0SfQcBmlT7_G,D#d;XLagi"MMokZ;}kmÚD%. k#y[`ݳ_TB@h C%|P=2yu:!LQMoX50ؚ`eDXj; zEưIG!7@:eME XD%$Rp/{!gLt`+^|6*(ϩ~g~g&u.Q ܚ .;ӵڦ z ({({?;$oG@`Q =wE\y:K1V s#KN5p9=+u _[M^Fr[Xk w'ؤB080iMq'8>k<2h0qA ikwD\s%1fFrOc`^(<b- sKAv>Om^ik͡G)%j,?0i>nFyD ל*ڸqf6,Kdn9oJʝNl7V>brzYoɝۆUmӭvR{K SdqI&m Zҙw\]+ߩ?C'+x{;Km%B_;Aw^4&'m?{UL*&`HB ![eв dc; J3ԛvמx>FX}CZ.4+nϘO81!6͎!c>󋾽 l [GTg/*Cy[[;etpɜc(}I^TLL;WIz3&?Ɯoϳ];ŰL )<{];oZ*^PfDvRiҿ{l*uԹ% v[KzXi#8x8m!N^W!@%J5bF-r sxfMWbxB+/*M!DybJ )}:\ˍ>ᢦK^;|1ZGܜY!`)q8#h|T]*A"W@ K~:TxՓƠ. s(u'TqDBZI@XdJܒ4DLcRjR;y锖 _,!~9prDDa+ >^{z rO* 4(Pt\ӽ=gVdORsqVeflJW5k]D:zm7Y)ek5$'W8*sawրL+OkEed iBC՞lÃ\J=ώ80ȠZ8hnH)yT|NHse#$2g; -Li\Z:rJ͟rѰ6v(ucÈC{ki,acuG+Ih#"jv! GIHW"(8>LU:':$B8/h>9^ 9tM`9 a{zHA W#d'l8t#nzt+TK-VX5 V ?۾hɝU4ƻW/UmUZTP ݗ1bysN]IɭR[]?yaTǮ 8 6RWh>z|y ~<ýg XzcA4jT9!$r:ziչ Ѱjj4;d/sU{ZՕ!.a?'7ϕ_iO_]>`NAg\W|Qos3SqN# _@ǂRl0# G8(4t䌙 Le@D]#Ns>>)Ӱgg:@[~o]P3䖉FܕWfVrxƥbt9X97 M%xzS*WiŁ,İCf?NK9Cpzt[͛v6VuQx_2j,mؙ"w-cu >w(}ko12n/1o2He%k).).kڪЏlcӸ^A3qM3"3Q=P&Cc,yB]#y$(;uxcTQaYX?)$s2z0.d|sC,_ Bٴ 1(.i63Q <zx5="H uX>V^_nX5{0323;eəm^Aۿ)yz&8 SOg%,z&lycI8|)'4l{abfVkyoG``Q~Z[K`OGqU_à)Ҫa q/$Ǭ%%MYFh7~ }_`Uo1} Ʋ70sO}V/e; FJF 3S`)Ad|MMqrD, * 썦J: -ZCxq$dn ᕟ"hBg / <{I@xqQp)0C !q*%P矼bAVJ. +aB>+g߳bcQwHJ|,ȤBSa1,HXrƘ#L6?<6\ST4>=sYzODo[r8{>Sq+vpy@I Z{.Y@Yz/tuo_Q|Υ ,r9צ#`9gJ_NB,ik$.BӋujy',r!p:i礳\E%0@5 {(nWv@mkN<{HY90&aV gJ=rdf')à2X%DzH Qo}ƺU:}'tq)x%/kK7EFK+ݏɰ,aE9jXa Rh9Q%Bq%;De'#@"c J ^F\n$%i,oH2k_'\ ߔb矼h~ROҀ1HhPRnm$J^v ;Ajy%LM M$x𨔽*&W߅E(@ǀ JjsS| t)Ͻ eeY2asĘKT؂Sܼu#. RFIvsɉc2. 7G;ʡ㠜IVʩ>丑^ޠw|IT17O;BVW \M6l!X.gnr O{\?sr~ @a2!DMIqX^F,/Nd@. i'z,WƑn\h CcvJScSNdF{yۄdwqp 63,쿗 o.:GW,%]4p= t2SP`e; Z?3es*m kYBVVnfw7 -jB^2[*h:HhE*_ύ/"U[WW8Tœj@[{lвܤ87wNK@jZ4mʂߠ]1 &@5س-SƂl}(^LgvFǻ[2ZE޻{S =޷5Sk8OJfHK6 *'!AA@! 3uVН5_:X mz 1]D7uAê YJ\#nkĮti"&#H_ثhHE5M~uO?%mj?]JlVd|Ǭ39G%]3F3)>?9DP Le%׶ obAWGi=!s+[j F MXۊ D2[BCW5(cUqq VԕL*t0DN%M|mNUV  뢬pkk?C16n9ctrRl4Z+D\ NWpdn&,hQ~ΆFVOra+Oaٮ5Mܖr)G5/ŭ0 }&!e"KT[()|Jeۮw1 ٸ0׶UC\L?~_XbW1;K~ع}3e;x>Ђ====,g|x};< abmRVOY!gxP?l=ތ6Wd=z?6JR@bꇔ2GyFR欴0-*<X0-B"^'[JJc4Lddwh b b "}&H AntS:Sq`i \#Dt "R!LbTT +Ʉ4_V1b"$DO$P sGɏA3m@L:yQMV('"!^6\_(Y1ϼB́\&VetnBbcl)4HN=;f>6oNGlsO>?+σ\>=aO/jt[XkM5o;H2Lj{bV6FIr+ܛzcl48gr7A On?Ɍ^f߀_8׀w(I*bRw1cKY 3Tc]n[X Ő+^ Ǚa" yhlF44eEHafZ @زs/,md(?]>wqdgnd, vo y̲ߤPHgFyW_,J48&(K^'f%ׇkЫd%3wp7RE8Uz bF 0+KZ*I3ɜ1Ye57CTG <ش,!G(|t o|Rqw;>琙2#Rس=#` H ^PcшC:HdǐCJජ";[u $mI CO$yq u.(P| KKgFp9t)WN]ier;[J&,'N#17WTCٕ{ &&r&O=(rcyOgdp^ 3>WVS$@ݬ S,d4ʨ ^?[ju#W2IWsvXs}ІzґQ%wK{^U; mp̊+:._m 4n6>^)&Opr\٧dSɀȬv dJ<$%ðbOx4qp@Frrgg)/ պ+ H1 .P(X({2Ƒ v`u69An(A̸h 2W2}V"W ֿ-flbr<#'1%2^i;9ʷ yc8= M>Z宥;upyK˂e&2Z\r/QNy.? :sTWj|r0-S`n&1ٟu@҄Ư #s$\K5X@邍}=؅ ]KjPqm׆g_/kQ&s~I΍5ܻ I/=RNٕWwwdžؓtgX2r_1ҝͦ JOk5Z.s;ͽ]lVZkCi! 0z}xM.38Oʓ^Z,9c&zY\HN:r"XBk/7U" gT[̕0qrzI SW_dٔ=-Ք~%O]-?ɇ?s:qB)D@RȴdML0lf  B'i#'Zet^+f: hz)X9X#)Wsdm2-HڳgVΉz l27>ۿ oysƆŽR48e`Sa;\NSs1Us@}FZ` Ƥb0Z B p7So'*aʊA^4_tb+g6Ŵʺʅٓ =D=9mKʇI|t H๦!\/XH c5 Te2oK 0-:*CWjlJՊ(^^Kϐ*H3wϽ搉B@@4aM"w'楁 3Q";W.{%҆t&csXj e|jBLN-t$@Ý \Xi!'W҉} nhgl<¡S3fGA 4Pr$j"&3XC<4>kK+5Gi "Dr R c#Y>= z qȷ%-t'cGK\ [SƟ[ vLP=DI u 2PeZj*3N,yߏG#1^[a @-l=Ӂ{lfYGAܽQ Z]\ ͐v9o_( H&g>:ə4AV]|Xf?y‹8zze=-E5 HSR`8ȋhRObêu;u49NB3z*I8@F$&;}3_L PC;ײ3ۉBEx}Ť^(2>`h:54J P3 úRŭ2zBI1r$*? *qxƟ8 DwH]R\aq RLVלiGu0Du{ Cà`KX%46'xS4Z YM ǂҍҶYp8 ؄IomqcL1RFd*:=u+)>!PBAi0^NVu3Pl2M Mѩȇl+F91%=ˑTD~VJ:M*zCUτe˛df %=! FRb/1çg3]ˌ.<ѡx7Qfy<_bbGN#HZztE|60EpW@_O=Ë>NwItDxXϲp(^,!j*\ٓ?e>? 6mq3#1%<4 bt`/#КPsϿWV^7…pU]V}'ۙz# Mw;q캎[Q)xl En0[ $>EaRM"tg`Ix&Y56 ek=g} z$%G)0  Ђl2lNz!K:[E#➭C ɱiCoIvAhᘻf*?\N! i}ѡ1;q|+Ϗ(a.@cxU lZ#=#" QFtjarOsSWm9g1=,[.;o\jHSd @=eԡgIxজ9x'-U?t;V{ aCANæ"k7bۉ2#%tDK Jo1J[1UpiJ l{ 7< 6L->9ˡf3gdzɒ^L N Ս DaO"h}QQ gȓѸJU~%j9 6^q ҟ)  L r."E$`UMf)}6@\_mSeB/ʹћupR:%|]G^vQT/.!u --!J8Bi+E`gId kFp?8N&ؕ-1n4gclg\ _Ҡ#cveKL5ler4#%ôzBu-bk_/7m+iWMg[@*YS/tOnH|<67nX֚<\eߺiD:{Lox`P6|i@9: UIî9 Ƹ-_nt"DDnPLĤQ+-CXACi#<.=HZFAx fY"*m:j>Kj1 D@y };%5iNƃ J\Cˤz}$^I b zD/QN_VgB'?OwB#xh3'haaׂ'gc}'vCB<-ą8~_2`)~H#VCզ[ǧW-&>r=z^Q-SIY>%PU|,6()|z(Q|z.R/Ծ1ͦ6Ɠ90@y~o?~ Nf;?݁wȤM#yž B}з _ٟt# (PɟVeg#sҹR<ˢ$a] -l*J]T`-s C54 af 5.>PT ćl]#w~24iyL#ilAM@v.FWR"B^2w6@ _乤wHi*8ǬY78r U0קz?* b0'D:ykwq>n壀B>$5 |'yG@G@(o#a.Hb }4^!GyOvI'CLn.|XRtMLY kqt -cnؚg/1wuqb]˪c}x†09Iɾ\=WBܯn.4}>jFhQTGd?pz]hs.β8W6 'w]q,@jo0ڥúeEGFе5PwDN:(3Dh n6ĒFC3t9D. Ahy岀V w4ojiZ5 Zb8L UMOb;a|]T3x_fu42@6im>,ihS1@rt^-4 $M\J}ܝԥr.܂tv1koi 7\wD6v)D@J9v/FkZ4J{ {hnHf+Q1Q7 ) 4;uC+ji[A4աk{A`mb֜vΘ3]j<>E'@gy;NRBӣi=hPn]Ji;"+Z`I-pt;bI:A/l~{|]Ouf ћ.*S]\La)prVc &UCa^"2jJB(i! X%љӐ;Ԝ)heV! ls[bё'6Ke!pq=qwZ됓H,?g1 \@T3qr %hykƹSNr$,gm`{Y> `b@guGU_)f&tTat2I,}*9(:3|o")ΠKDMϓ9 ;6#9%?/8N?Jԛ"tbtNek8.O)M ?!5&xgg] "|cd iN=>M2/^x _<|gJiɯGk\-YFةÄ#F#F#F@0c˥KD$nQl{F;'iԜdz& %ZuHf 4 -}4hH?p)p*?T:15Tş0a8-\QRa"Jiud'*&bWyzxpH74:;F$]C%i#Ӂۡq/,o( bա J;x-{=D0۰ɒ#JSIM%˭z^pn6^!}-漮ǍF!DPI˴9L <s nk8lJݜFBGG~J> qA)-nI4ʅ}SkXb/Y`. 2ǁ`\HGÈB M\ L8c_lI YWc|{hVއ#g? 'Io`Zʊ@aޮTA>$[±t<,2B Ƙ-+YHVJ3di @8*0 d%\ \-COOǡXj`ܓ^ Cmr޸\K4v惿PC@kw:F(W{ٓî@0 a v47\6N`0,j# 4k#p4&>5|f 6A~};^}8OK Ms))N-{⥪9aŋV 4F9* 1!(--J(ϮI@dw0~b =jUԏO'Ƽh?:;~\WS%Y)r" 5gxlYJ;L HUQ$9B )8-8Rs",Yy%L*@X^BhT0Vڝ4"KztseXAt:^D@`apZ-M' $@uYƎHnE@r֘đ1PFԜ8TR;Y2ʳںRn@$|7_Uݢ)xQ***)1%jCѧQ,psᏠAN$>. 8 *yHz%%DʲeXTF >NE9buu{:wo7RD AUwTՀڟ&W-bhNíL3iB9ٕ=cTAGJO^ϞQ8ܘ ,;w3$|'GiWN c \8/ѽyMG_Q zYWkI !\#s$Ox[_k뎖۬02qKWSMܸnM%٭KM&E ZWFͤ%>Pq^=.mx+{^7P~w'{ygana澸)w~E9մb/#$zm[qO, ? jZGY2},!5Q-$NUi3&Sz;eD 'ϑ" t-C A'K[;؆R^*qDvu7=pshpjC*$$2LLAO-\GQ1Ï3Z{e:B Rv5gўiN]VG/9J Rt L±F3\g6T`iqfS̫Bt."BaZ@y4Fj"]V% 5T,Q#*6<:G3ݫ!"t8?<{ 9K+dEI mLTd`XKd@I,eJi`bs!{PC +]QK\t02  r6lq`C ؁$2Z&sLU#;*7b&^.H ha{ӂWy Q[-G[Ls$5KJ2o!d8(s2dvd'fBW*}u[v?eHӛm4ʏ!!ڗ`ʆ4Ơ}&#rCPk,I6gr.w6^4QglԞՙӵj[2E:.־3o#h*uUƌѦ.f4JLJG5{(LGK#.N3+~ޙPy.3=i6`Lɗ\1]? Ԧni "{bQF3NQS@Y1ȝ5âWo1ԜIh gp=1|-Of'A^Ԫ4'% n#0؁z>do&}DJv~'Z`Gk^jջ`m#e0.)NcJ/u).BÖ Fck{NXa_;a3kOzP\NNVo{svovgfwŪVz΢؇l.q(',JbObr_!~r+LPpXAE/W %:p/pH>#צ|9`Fc)ȰGDѱ`u %ԟ#/Ll`O71ΪcJ;<M#c;(a|h g-(YnM̲TA\WSCiVb3"DHjmUdu)"hգG>dCȑxJsT[ĸdrwXbB;SnT?W?A,:9Zq??iy Z&?׋)\x_.} _S`R9A X\vQkL;pO:)ϟT 3آZn^u{kˇK80\TM 44%)oKnA' $UU@x;  ~ȞDt3mQK㴍FP]#Э*NcEװ whxzxliy/3B[' sHطA%&#RʽhӰ  1}JO>'"e,urYD8L-ϭZM> nXpk.uL5safX\/k`8Hp-S ?57AO;lCdHUgl8pt9^S !ZY|N"B[K|-ju]C)Z|v^w# x}+^#&&6{"T%=Q1-gggfzPdQQ%BXJE#u"s%H_B'BT|]H,qYB}jgM"Ⱦ+DKз$*t\#ZPQsVmz-ృ'-Mg*r0sWVʉ/c<7'0w s&+0Gtb4 X/$:$MQ[YDmdz_4 i;h zMR%lMW->C|ԫ奁|/-BPӵ$;?SQjM'܂yKitko5Qh)x;D{&L^@\)buESLS% Qv--Bڷ Y(/AB%'AƦO}|.F&ÈVKRD߉ɝӡ M$eZD"]eFf݆Î,mp `Ũi!U('b>v~mZoi>b} 9&\`&o,(ƆXE>Y/c3˳"  Sh2qgޒ:;<<"VIn[o=իVhLr+Y4 UhT+eO s&6\aRVaa8Z\09zIyD}=Oqp< GqƇyB7imQNjXCTZGЏ<ĬSr195(((@hM0o3P јbǟ\'C=ztrPCGY^@,06%4} wgOTeps)7ఽ{?lz&tT+iDٕqu\~LϽ2M,U 6zíoy/ד_!}l$/9OY0Q~t~W`ʒ+ ޱVd"~Jr.  V Op| r-rb} b~qx?X٠>mXRp깍sɱZO?:І4;& R="KuPUȣ(P$S`OZ՚Sx#wq$jlNW3WP#-)e3z#?̲` AvѱF%o`-z2'3n1T*YqZCX C4.J||_lV[Dй'Z?>ԩt&j:~^\+S_kĎ#,uoV1x0v jhi))ET Ѿ)ЕkO`@nGOvhEXWiL^.ڃ l>t a0:ZX$i7{uݵ)׃aK~݃hz]؎~=wLrv!)tμMHDdj{]o4H8?$=uyзakÁ5 [ {OP1aD&L%{Z3]]8W &PuVx E{ M&ς2{\&vPe^e@28J5;R}y @#6_NP) J4 CB ciәw6`a GǛ\e_+3Kp "ȶnpS.\riܠ2CkM:j: 񊁸D/z0&1^D/ 4Ț 4y&0?+bczzS#6=5rȫh,zk Iixl _z _zTFlպXHDMo 8AlRW6$Tv=!@{kEX^-In,C}R(K}9ؐ{q!ǰǰǰǰ?lXǂD:$@<{c͏ tGjV|.Ey]C޸1oqP 1"?"5g,LԵcM;~`;LDJ)9joF XpoMн}#1BG5(.ËJވ0ӝDB ^vsofOJ,--OG~Mv!%C ,ڦ3#[!q' ͏{(,ϣ@ a+撢ON5աzɓ0I zwUgX@Q=Q"|7Fofx|QRtOl wϊR<^?^?^q_ }ʄY^#T7?kOuxD1_C}ঃ#.#.<>>zN<~︠gb>)p1{}4*z :̯D|>HecR,yJVq]u1 i9[#}d38kp]zGKX~!DŽr8 4ng\;2]ʯ=~P{lEm~6D} 1Jc6!agSsj>]WSm|e1[|^Y 7R`)ɅjWɊ{wџb g5eU=Te! AyF}+7kv+pOnX>=.F. Ӄ;x"?ZE̷KH^DkPƛ9 澶K $oVK~b(KxMmƮ(zGL\#1FM-0h_Ls"#c.ܙ v{:f"{Qe7΅ɻSސo_6Ty^x#/ȭGgg=m:*9 "$ἻJ,z.0~^:m6\v#9O»ğĹ4 XM29MڽvwgP11 4cUv*x ?ξGE[<}GGGowе:@⋔87JLn4(אTlz!5 0p1|+ 2 &@? ࡯'~^nwy7~_vw6WpMz[ (xn¥׾}{]Mߩ>m<5>1˱z2wF\7ZWbt2max5D}7q.  /;ۅۅ oz,MjmE?A;7+.YOkWWWkj{1CꒅsD̳[<[}ZqxL$57Yu''(_QR||ZVFQ+-$uvGNvX9,^%p9Y yS $H] ;w> ͏ͭ.ڼ9"[83^<>N\ya<~Y=M|="w> ֡?}+SRTw毹 RZ3,+s{ oAa>>UWqUp?N/.VMd7AySy&Dk(|J"r~iPq*LYhйd$O/-wrS+ X#R,/D19 ypw cDkݡ?X.IB7,&3cF &/ ];QvPLFQ'ETs[E*Ԟ֩dX%6gex ~CxژSꬅ!{IS}yBSj (#z(TOX?Fd>}Y:R`{;MydP4 bT3 ЫQEj_6w֊N5qFEzY>チCY6P7 %\1"b?H@; ?79fMup:@!@zr{8Q?OFdz/'µL@зt{vIiwF0$y1Nd;1qXVPv( -!&Gfk(K!xnH;< /vy8<&z.^&oc^&l6Ɖ& k[VЃVb4Ј>͏T3!$:3C&aukikv DPTt~B|-:bNg!K'p{~./.}^3LorV9R vMv>ݰ :dy8purՊ>9@o_2KRX9~Kj8Bj9p߽ Z#ya4}#+{͸qB=`jZ1Hu˩SJVתhByrk~ɔ5 牺(@Pȷ^=_?Z4-^rG ]yɃvldyZqP OW!kܪA'fKgᗋ`eIo;E HsN xO* @VA#=ƪ"at*X&WlMʘiOζ'Yw%7sח[$ n7yS$DY .erW2栝D6"0ǟq(^>Fi< GO]Wlknv<~=& / .I?KA6:lۛsJ .<6GO7+ŋb6|" ›!E{j-j+9,t.OnV첢赏ۻ/EG6׈cjlV:%:!zO–i;rGoe TJ%;-)=X+p7xpo$)<7bv~=== 0L\O8qeѥbCYo6*횾\ޞEEϙ/+z[tb- aM?dscXn\Ā ϧ`q7DMvY_M2.s܃8ݵ]ϑkCzOi#kx/2&?lE2]t"5n!CET:?@0Р^=q~e`ڡ}e^I"uÁ;L8?0.?X[N_v%W`JR-0M74/ngS۽ HGmT2<5A)x"4,-dAnaf 5^P4qO\OYD;|r5=_QQE[xYA^|8Ww*.PB.KPѹ NC[N.aU`\,_?v]υSN/ ^)'ha2%$@~f&V{|1,ҹ"K݀đ]us>/'?W=Lb)G_gVJZßjU)4[xsWA?Zy7 ߝb|ŨddLjͺ%p>|\v'Nƒ?g>5[388+ f_76[O7" َH\ žMn>o&7qqwȟ/* b!*h*'y`"!*栊i[70s n!c4+cn$X &6X\J4h!-X"[m9)s/(5;]!o L_ "tT7ŗM2Yb$jGΡe9Ka&vqR X Z~9_r$V;UhUNhƠNSyFW 8!Lrfh{Ѯ4isW[:-s1qf(|#Eb>FFWzl Kc~BS+=|M5rB|*wxzk/Ok7x/[.&3pG2.a*Ov 9/E&Su;2 ȍmryTB*hR2D'8> )0Q -v/[S:jpp;WW]R` QQXSlj/Hq i 9f$T@H-P7]^ٰj%i8n㠖b="@+ه|nN*C5IC֫(hC"b![Wp)\fy ݹJj j,F3S߇Dܥol݇v"I/sTg=MlA ρ~WD"'}Bg f+2iI..مYJ).X2d0SI~&pRkv- Ckt&yj0|8m>-om>:2ūWLdF \%Dz"S\^fq2IxbnĖ}l_>բR`x&^. My`P>7,&"'Jjڒ W%RȚkyv풌F؄HmȀg!g(hFxu^_ iS!i$=w9x_✨HCizb΁=Qr`0pe_[*3|(<+Lor%\VHpg%r559:AWZi^Xe?3)4B ԙT6lޔ`N'&_H ?@3nR;ɼvpo}T'^K t^bei|= to\إL~[o=x|Q&?`E!G$xv#0?SA.GW2B lװZ0\JiWw!Pn+)a:%Їn)oC伾<_U|}_`wB^{% ^`wazFfir-g~ e!)0[\!s&'uf$فVUkYksԎ =yҧPp0zUWcpJa`gs*_7r7V9٫Ox~ϷؓSfy]a3(D?/<0x kqc&O'eNAԣrXXaAR~"K G/@x4ڃ='P#$j$trʾvʖ1,{PF 7 7\<y&gz5ms[B uarx}l̦0nYKUȥ`v=h`g{~Q6N >05k02gs6Pn 5<|y(\$gt-)/\:v*d8*qrD7PadNN4L'Cw&@f8`>0oT{'rpZ OvC~-${<~$1 3P/"üGVurTeGU/=sАCd(mW}C8b"7ǻ8<- -X^@@R#LL̶ 5hMdv Wn1uȵ"Շ&Cё|/0#IAsTDT.k ȼ PIo;UxʙW4DF8|K/m` L9s>x!/á/z^"| n;^~) & z 2s#:$<7_Y֖^=ΡutG8M1KBRIh` YwD[|w|B`XEX0hil#JAֳ=ťDIK)9|p./A)~{Jv]nbB:͖+:/~ h;rlqĹh8c9`}q%ΊNびisvdf<=ہa4WHFK 4ЧAVHY|7NFXT(3- cyاPMx!Ԅ Qy035H|?B0U[M:f?9dhD SxjGqWG[ׄM-9 2AQR;)I.9|sw PD@?J?ۭ09_`rV*6|*G6%hqTH6oAn-}VBB2+1-{Ht>5-}[+ &"){:U^MkXy/ݴ<^qZĦYT/C e=uQ!fd"w?ȢZ9(6g/ҘqaRTQ`-8g'/~rhI= 9"V2եOMS FVogq4NՔ "at@AS<>8!a5. ~|u 9(w~~[_d.r?F),:%++GpT7)aR" yf$@dcċ@:@>+o&~M@U?kGq_ZMm+ϸQe7 N߁_kUΪ]ɞϧZ۶Q%"l% ߈Tu#{(W/yzQ|Wn'@[ 9|bdb\(K X6ܖ;_6<]:%"P*_hHDJ63ӹUkW1o[7ͩjy5@c `ܤLPwZz/CKrwE NcKw,kzE~Ql<q,EXm̷4|cny-ݹlw2޵r谴yFgav\0% ̳Hqٙ,j&VhR-nIHo!Og }@RI[7r46z# U|V8xj_饜_^| HB7OcQ! "R==Ҝ$ImV6h,Z$xL6G yEPmi+U.Meڥg ^.W⚗^zJM#]G= " R=C{v>ik¿$L̀j 8\]G^8l3sm [dy,4vg}-iW:#/$WB]}e.P`f,:4Z @v;]٩5eU)$XHcZߕ(οtʴ's5+EFA"'&p{$)?b.^5vGH-9\+׍sԣ0*be?D. ?}g M|RJ;+خ/>f_|̾H뵀+E=z>E쯸򈱎۔^[`'tCF*r9dOҍ[irG[JipBp}N#hqMiD5a>X87VU)-:uϺt?ICGv"GlʆϺ^-SRI%Q6!J#3In.UcčHT1uElhZ-h#+ <H""*FSzv-;^F6y,f~80::Ʊ3\/ m4}&,)Qȁ1؎qr?.cBlcK]EQ1ckYGOI[>ZEKfU+_gwx.[F>]sm[`O ^w>%m6MA\:5]"\lIᬸh6QL0V# :)d%:<LHܤY# *ǘȚr+qQ2cfҭE闞⢩Ħ|w|D~cF40 ڽ^(/ [}<^j7g@\7ңӣaqc>Vsfj<_擫R'2$S@ƫÚ!4avS;X3ֿnj IlԆzqq1~<<#%l8MÓeh6`%GvLu畮( *<ݜu,y}X1pNȶ$]jyĢa,箧ԭ'Fq}|$ܔ&{f9ݦ&}mj>"8# Rpͳ5㡩}/;*z9C*!fb<ʆz-fQ($Z1cLU>12%~V6։~O%*X )% ALUJTVwXpZ~-}eww$QHj 鳜t:-nw|¯MG~+Ie vwײP.@ {݃t&(!;Fz2Ͽ|$N&otfT=eo sj89b˜-gxpha?w}Jt'Xd.u K'fv8UKA^zQ Z/=F(\U0 EaH>F{nx"2x~<48C&" JE@J>4㳒rQK@P* )Z$<_.W:75+͟Uqޟ/X˞nMm5p``OE+KnGHH!cSIK:DhfE§U >_Z4<XK:V4"]L~>|{ "N(RÛ,LbU^An-(/MѢ$'/ )K `7r(Y veɈ#kboD?*, 2PLG.>޼9Ah]e$ ɕXݹ$l_R4%KH*:a ,BCO[ާPC\L D N].5{ jT0 *TQ "\jӜlwXoӖւ^sE&yjD ءRQޣ [Yq=x#2b XJwɂm> z6La"Wo/ .'<,zjkB G()d- xfA'+kw_j1Sh1L;@CR1[{.VIz1^Tׯ[Y@'Q]RtɑgTʿ΂R1$=@pD%NiX_cݺ_v[iZEbd+ǘ& K :&&rCO$qNn$؇$;];Ռ+UPTX ͙-A䴸"F,'6˔>lTg *rp?æ5:"Z@;)N!.R %n`F])]_T#6DcYG{k 0n:P7nw}7' ~f9;t7sdwvY@"+rR5*^Ba!seWc6i3TF \dnV ^/XNՓ|7#n.vŲMY-Z<%DF$ԡ0C5̐FE- `9(Cɽ* t4͟6c;Dfȋm}Zr$G~ hϭ!7&5WB܆Eupr6G-{v ,K{is̕Oޑ-ʣEv8!N6% V= -m2*t~Ξo-(;Bw =q} ( l 7_ښ(Hϐ 4iii m[et"n;_ R `I?P1xqCn ż}ub*߉IBS;]sp&O'_XMzIytX}RQ_—-Å·˻U=\:T.e3&FX --éC8rF{=g劽;$"39U,:XkhV`Pz&Dz~ 1OM[gҶֈ%hZ_}4; }6>Drx2p00bS9=vZ ]o%s Dɤ< ?e Ɣ*_o5qF*0/b2F_~vx+IaAH3tD&WL.lh.`޶uXrbٵVŏ峗ϥne7Pĩ$@ECY}9V|T.Ac ¶S fxʼnq{q.5Dv@M[=hn?}Z!"G%Ԑ&("(١$0OC7f}T&LeC# ݰDRUB"pMws)]<AjCP]U TKQXb":+Wr@)^G\ n>|䙚M@S0KQXeu8,E } R)WiM"#Hrf1q(Ydu-$" u;4;Hj٫英NjFd6]xɼi+ V@EOwr"w0)^I]ȟH>s=i;tZOHǴ#6h -^;pfB[.k1+'UAqX^+vxW A&#=E"6 Mkvw*4cTaƎ%t7CmQwM+܌;{g9"׬M7hº3l]—\ocgPPeC}0'n[~٤ٕ vHE!1lh8RppZ~ݓ=6vuW;X/ \G㾊qn]yV;}rzU2^\6pv"_HK?^c+)ę嬠l><·ߑ$Z^;25Ş{SD7RݞSyJbҌɠl2+vH@S!QN#e 3*H0%P]4MF`<cliC:Q+X+MwWդ]gsoӄP!7Qˎ_PJg7YYXS `97!l]ƚ\c.+<,YI8@=Q7\^\^䦹Qu?i^WֆԠr{>P^o6P9`8~џtAği;3sR.!F17yR륟rCZH [NC miKF?sN[1a 0Y|%x&ű0{ kf4Cڅ AP_RJM<"?W6 IXMכkb-D.jU_"v~'U!5M85QB=VGL-#+k}.tRiX xY씔hJbnvr4& A؏6;׊- y?–{f7 /$V]X7LLN=lUT} Hp%,c5(p` k(MRՂǪpHgEB@aXX޻e,٫.햳2ߟʺ _Ys).0B{,C1nl_K%8;T?c R;8̱Դu-P?:+h5;8!$ ZOq&ZB"x_e  JEt`2 RRR/Q_uIZiKTbJ wZ1a9 4 [M(Ma K_Y/RiCM/-?\2EA?jLN!I/E6aa4))*]P_kUEW{wӝ#C%b^"gMk>)u"on!2ٻONK~415RNhvl/ح埛w^lh\v6SuJ"zd{-grW8L,'հ;oBzx)?! ̶,ӑڿy/-TĒMz8A,nq,ϦX#[Rfɦo&ѳܓQc2O J:84C5 zMȮ(86)X{1M"T|@+|>^2l>nXKMg")Laٙ~piXtOshk!$){ b"Yc 8|_|fT"&LӦ=>`Jiڭm_P2_K _!Vt}Nʥʧިn@㽷ḧ́o6=V[` $uMP&EaU/d -*a_xw_u _8_{"_ hZb¿ ' 2ͩ^C;?B:zl k:1j2MwOa&b[esY6i7U&n掍&nfu[LxKTh9U [J{FҮ:-jZ0d"p-& PkMM7]z[itm~b2΂Y[ qscѤIIOWn%]uimef(D亴*$ǩ?P_ ۪ ?W:,z36;-kvr7}Z" <']Ԭ'VYQ >za-@ !b'{AZ-WhGo`G.%o<* hN\rVJAHtYm?J>{ >} Y^wa})y ?_Ȅݏݏ n #/jh= bk􀡏H jt#"B(`8T՘<&X_hO@prfƋzWFY0P\rjWڐjSrkdOQ:/.7r?cĽnɌqV_Q i;T PSvOO9.n,11ñ%?AF 9'cܫ`ǡ| ?89@tTVM5h!hz]mh|t^f8 AJB;Yx[Phhȟ/ngSA#sΧ/^Evi{ }w`1`ŋr{ce8BŜʒ[}?>E !q0(;JYxP*  >>JLۭv"TY ly;L='./l~RR%th|<ҕ?އi` Gzga.i Xkt}D4X_ c|&K,)Cjw'Fj ]'K\B8Gsd'Twhuz 6ig:hCssǿ?`QL%I%kVht+z۪a( /딻[+' ½Ix;"U&EM`pwǁ3+M5k3U{cdBPV>妐L"_T >w~$ uşrrJ[Qy#[-eoQ7[N7! i7-)eo؈ݏ[q>nYTґj3>Eg12FCK3I>ƛuv{l_;ax&W~U#~Td~ފ '̓ p΂uD)'N6q Ës{oD^V]p ~l2ۂ~2 "_yudym+ ǐPocS>>UYu 4~{dm~W"x1!t촁 l!k޴|C\-#R ߘW>D4DtEXd0TVWJ(ƌ>3[QWrP ,x,T 'XR;~}"GKAKIM#$qdv(R 6A`ܒo1֦dkk YcqROla_ȑdojXjNhQ }/ o). ݗ%Zx -)*:N<9TR3)ˊ7=pOn;$;-E_FmjyZR ~v\}@> ?{EY3lxm'أh? l`M;(<<@UVS@%gk3C7c(#'3`] FW2'ǝ'?\=X Ml ȟ~GLo]@f\nt5ThcWU~ |>=\ gV@E:kMemRZ艉3vOLJI%S,\Z5*5g N9@;VW$T]2+KGOJ0|]vAJOI9FD Ғ+= ~8uCrkPZOs0Cfմ<ًJ!'LCj1uD̠;%i;jlNRSw go?o+oʒs/5A58)(:NT +3&9"su}󐊀 "Y6DO Y9d+,Uc4Yww&{#GoBR*DcWM2I04E=Rp?a:ۻ0Εk?z5z-{ 4e@$vS`F6WY&[GH6T@J0°u[l<.H"EȻz`(00ӉN=|ޱN[ٸ f,mm's1㶝=T+FQV#Fa]9}'J" C>1baSXAbvu|6zrWKr r4_V7-'KMٱ$s+x)XHzx⛤˦6^/jMt+gG0BkBt7^CLc`q!Ru-X8{I.ťd$la ۷Џѭl9%RjlS̗=8S$N "DEG.5Bbqxzsq'=sqVͭG(3@;zojt@}ӥC4CI}/PDp__Rin۲rF4kNh|-oW*[ +.9dc~H\NeS|=9q^9{YDޱd|[fa$\:UiXtn6L$SMɟ*sZ D|F5. uF4J2fkSiZnfbE 8^k^Bsva?=~q>~^/j^I .xz/ٻE Yלpcؖr{Su!ҩxI{=G+H/ryQA9ᠡ^z.zʰ?#~OJeP)l`Xc !xxxr)KǡWKqWId?)z4Ks&2@P{r;aӉ=n\.eFf']]vA*,'͝o[tSUWQ$3D@CV)ܐoTeRFtT?R&3MyŘ5Q|Nta {d>1tV^FPm:z"$tv^8ݺ9PT{Y'Ѻ# U„{By AH*$$Ww4{u5ڃJNޑajiiZ馚*הu BS5R(d!*: ;d誮 nָKdx C;5n9ql_ qPH DFSLjT! FTȒ̑lHT`, PՈg>YQ *i-/kA79O-x$MtK$o˞,z4ך;9(*У˫ltZ+KuI!=SSqwEu3OFOEHyu*K5z4^OD%NwE ,'`@mz<FZZѴ0=Czޤ<&Xe;jzn>~4_bT8Z-|*?"{Ǐh}^l?NLS:vO᪆(A]ɇ+c2Of_,OOT.s|K}:49O `ϔskNjwۛP -_p'9~S/E|.Fʘk!e 47 V=.ȋK,`.-ϝ Fb 侥NE8 ɗtJ!cWzU:_5i[ =pf&nwFpe<1WzGdv!)K6#]GXSdEXcunѮrZG%|<",Ox_/oWZ)0?&s(m{.eѦmmM !WuJL gg( ܉nAkuM{Uj膅'S ANEpGޞ!#S"$–ЏGQ5U7Ι" /e眙>do&$"%knDl-D!fgS ^gWTs7M]wr1(٬@^noBʈ-YG; jCt@5xrtM"}X)f#Z}GH6y95pBg/~W?:X`C\C&#qYD鰘x}v"[BE*Ԃ,#`؂VT1bq0*81yQB-J)4lp A<^B1ڦ>I1Eh2X Ur%d W|q+%'KQUDZaZ]lHQqdB@# l\lrb"xhNtZ̧: 879dQWc<9y&tί] G̰+M/_@)I&I*Iȵ` lKcc- h.UK.!)~4\钆$pˌFCx/ \TUEElAWLtU59H2Vku+#N_&0 qYxÙ/:Dq"Bp0책*[,P62M=x"8Ф24$LJi`i9r~bWpJ;82,aJfe {6r*U7WFZӪd|8nH.OzЈ¶Z[z!ig3Gco`;.N=*)>ioK)KM¦ûa*ҏuN:I*,AӝOPVN|aWi :)֬XqIsڈ2gWH$ܝ Jh`9 (^[m9KPVZcpddЄךu ZpAH09+o4_,`A9:raZc6݊{?gH['*UFw-9i!jF5`P r*p@$bL"eY`aa1*LVaՆ{:8imN*0LKZl 5WC VJnA;@Ɍ_9W曮o"x /VR_/ 쨶&_U${ŨMWQNKCc1<##k#Y+,]P;<-Ȭ"jvJOmo W Z$;HU$@5Q.ZZ+&7mط-XT]:4S ujQS$?@<5݉N A![JJPmtB;Uzlx&gFiNPH*\:6@4o[gɳyPv>Xr0jX䃖UxWQ4 <i2[(eIU{.=%v{~O) =&cK͇eSL'ע-+B}U_sD[ȹ3%d e`aaxrJ2﹖-u'`nRwKNj|=y LRE|?¥j0li5$2}JWGkbh-ž:~0IA*IcVU231DvQߤԛܾW졋pړP_g~:MKXBQ/[cҪ!]KaJZYj?kmn)WUujG l4N7VP$|͋ :NKiϏ%a3s&v>>y}.(rHlAlK-`IcLYK"[7ꇾHYhqLc z*u0(U#4^bE-bs4%BmLaVEu70Ke=K?m_|qogmhX"^vj{M*2ݐsbt9粒ca $_q>9G0FFo]ޙ+6ȦI\eŘ1 cvsu&rLq-~${P09 N: Pj*r[X)TnTjWWR2@So^/D rw$%L\OS̛U:\crK/To<.}>#2Ba#)9T0}6LkFJb4WX]dDQ̐Fkv6[HD'޽u'Iv15wCs--]D@DҤL Y*z@* v,YGVFm#hdTO\nڻ}ɕN7>!4DvhqC6[o=SՄVLmě&4vf/6\\D .]zmős?n<ο37 W{B jW@1.w )PxIXϗ?Kuhǥ'fW_%M " <_D'V*n>Őx +1NJRvgo~/[^ɢ]ʾ8Szo׵\lT8/ђdᕲӴJPlZq3$tܛH%Jl-(=-ɐoͳW俣b,.$-iIoU(X=,;lmwv2% u!&9 6cK[W+Qs&{iCq׳;akWM݀f_ c?@5 K[(l6H}.L!j{a}s_!a )AΏB㥛A'z3PZ-C֡G _ ʲYfCS?Ԙ ^ rB|3|$V}8Hp8s?_7Q؈0Wp3 'O` 2Juq#ņQ@S/L\ "a_z6=vn|s;s'Շ䄂YM6Au{=í. L?g_XeF+(S٩"O{HY#/>P.,/U^~̤aYSW50NG ],28L;UBp+4kl D@D\!' Zqp;E1..7ZA*yt"dGSϳAq&#Kxf>RB5L(K {T|uaBeSH>!솷6ޤ-#^I(qf+)!A6}1ϸ;9Щ}pm  Ӯi! i3.hRT<'Bea Z>~j6KQcKDj!,|P1M0'ʩq ԑL`fMCd'3Ի?xD eF$m^7xzkY;4]$^>oVN,:2R SjiN_'دK b^;u0X dȽS2+6X#Hg+ &B߉>}-"( O>m i d7U|;yp,a" \/V&*TVNK߹{YTTb/&ҟ\㐳z_S}Oͧѣ(=xv_s<{* UnN@l$N(5Fd|7]Jdys[}xH9, ¬OGi'xBzE ?{ÛtZG:r{5q=W?;9Q:{}]T5X9=%zɣ^BRb@L¡/zN\z^R'TU8]$Wqf%Er[(a/n-:քY|] -̟٬7F4$C! BTE¿GG/x;lf7SSBT;YЧ xf2 \_%@8cVNrkR&d)}ܸcN7גV\Cyjp*\IK /L>*[YD-]@a⮩WQ`vSgQ/z#`㡷/ӏOvpc=FdS'a(vg1i7YhW*/ #<ҬD+0c:אcF ONEo#~dCCN6f @#OI>m ϯiD#:Us#@iz6{3yA$}nl0 $VYv-BBeoĺsOJvtK8p]3w8wܜ(ʩ%qg6ŗu@V_߅:UwK#.LMw#.ܕ: TMj$7==|"9x{Ŧ=Z;^A||nj{ǯNR39g,Q㉲*yj Y*ml !3( /h;lKpI t]bQ1y[ L~E6⑅W*֟d,ڊ$.:JCG1tecaK tI6-tm-븋+rum)\׫Xh)6V{%4ރinӡh#;Y*Pn #tjr[ԸH8Zʂ< @r+e3zG*~x|ycX{";n*Ns@3J2F^Oރ9~h$%{ۗ+f}&!]fm~5"<{'j^ 3W:ZK$9t+Yl+4&w]pHӫo٫0#q^iуc0r(9Gq>ſVPmT phWkt>wt~nVmg_ltȫZx^eBv iX k1+N85J-*Mw-9ލO }_=JlRCwzdO΄F:x]Fb%4 VAHJME^BGg^ CO;t:~! c5,t=!p!} bWHwJЃ!] u4=Z:'Wtؖ)97rk4)>-#&rL f%3( ̀Su .Y(^@ wr3 _Y@X=ryjPH  ~c1Xo l`ԩZsπF," t\LsPjPl o+?Z؊?׋|jF*&5?#{bqaB)c!kRWU_Liϩ$l;] Rʒk^7 |n:7ٌ^M?x /=kp>_ByE)6B_y v`c #?.!tϨvhP-OD~ԣéY͗3[paA 2 ui"@/W-被|5uTo~Ӭr V|D[AOjZg~۴$O5_ # ǁ )V(ӊ<dN#v額j^Q a`E  6@OpRNX`"(B}+K}N㯽HAݣ=3mv9Y\2=:I:)__V6DRO/{m2B!s׍4D7\ ߵhz󷥐=Jك9KsЉ/- b2 rhM'+HE}vMwpZD9c+d,z;`EB`-0 =tz wWUgऩ8hHCu` oT"81"v4] 09V;s}=X}Xt6XŗNx+tj! X$܋pONrNFUрS}NRXI$+A9Zw$yproH==@O5cϝ/vvB!?OvGGG"9|aZsi _^.Χ;̗ĥ %kZ(X-2[в`@w5}Aq3:%*j-‹b'aMU`oX7/#٤phv74)-PK )lRkfhVBO_cCX#`ԒXU_aTvA@=Qc_qv~X@0=8̵^!:p>=)~sģ˵VxXd%Qw{Q"bF|0zn%Qa}z`>x"Hpk-w恅ؓS`jȘd0z[ǎ_O3|U`G> z" O֩vvo[Y8fiofy ~aInjVaۅbX 2J'> WwC^#u抬r":9@;t(*)9':~No"aBhj)YZ18o!AbO!^7FQEXnt5=w0A)a OtmGVzu.X#<$ 3{òx58uw{ۧv作UGX޾7[80SHx-& (^KP}3書vxTT:G?Y4p]ЉdӢT̲q:d_J@lW*.g JB/ Ib%3<$@\a&7RʅB P/eշR87⩩;"/n>:" y6BN{.8gop. XR=8nfN 'LKvF8T׸ @?s.Kevћ!`-ĖA1A@s0~'ܹҔ%"+w]vwjmL[OET@|Bm9`N.nȀ 1S^l$1:[kWJ۔K)7 ̧p>.f%⽩;nn-3 >_ӕ&R|`$WRCxϭ}|_;ʹˤAibg.]]䚓8&PeQ7Wʟ❑ nR95`{A}2M?kV{!,*k\Q1>q88c(Ù&WΚWjvU?oR l#I պnrQ z߭ CїBZvު_>N# -5aB,OY{ Y?x}s.x)/_%%ґ#9BKb`^418֢$8cƷ=aK`"ʬLWR lRy7HwA'<F@bM`k92nu,5͂N_uxFQZ;ɋFiKF!ȗ죬#Z!)alKm/9ܷK\9I!$C`v(˒]NhmUfck -Yw~|u| |HCIywgiKP5:ijG0b nύO.՗=Myfłu:&) s&# R{?;0Emq:j}UKD:i4Y3"X& UĊ>Z{ֶswƢҚ3"LbvA -Tm1 .x~cXZMŁ)Lly;[SU^Mf8MCz=ySpMw#'h/w;uy @ XZ5@wLrX d5iVZX!kOS~NXTqά l<Y,B[?0xP`2I6'zp (`ob>1IuںZ@6h75HGRt=y /^Md+&g"jp%ia2&_}B+܈b;^h}fYx [,> Y[|hmpNby1Eig*) X"{{s>fLx?[̉\)f?L瓛/wi.|s9Cq:K `B-jpo΄2{1/vlf ҾsdqDGok8Z2;q)%=T(fG[@:9ϡNU T'NSAD&F1hAGlaVxDzгGkohhjMv9*.4ⴃWbhng@j4/,'ډN8!ߢ%>>©R/$]\1pv(y&AU/C&ƈ4{%qv(iwUz])9Af;NZ08La&آbO; m쥦,ںʆԆ"ʷr8qz3 6R@:cD $G- Xd qwCR^EFqҚD;04i rD{P5AN#拹ľ:V-1Nmt&⇝İIJuu߽N+JU^!NiTls,@ QQg{pɻ\Qoеjv#`o]x%;wYN_zO^%){ GU" m__pPkxI]f%B`;ƝwADEA.p 5qo_.+F^-6^[ГTxWKeK)̅:cD 8Q* |1%p.^5Yޗ[IG©;3A)q{O;~u:<ΤaG'֫$tI`5'6:~-T$xrӢKrjKKƚ. :Hh"@0Y4!2wCܝ){/V#a+[U4TQхPʐ]]-c ,@w@u#[ì3ma c$40cQil2P`ITmq!~v\Ip/Swir"UU-q6>B MR[5`HMfAE1>t񘎟 9;<焧">"rm*ymTv($/;Ug7R6{"u?3Et|3p~X.C;Uְ]<;|;ᙳ4g_=w=yU]wý,|Ehp_f D^C;Ş,2h}8ZHCXdM1'Ԭ!s6܈3 MEx* ,Oh27 IA0YJ&9 dK;Ph݉-5QJ;ev#g#HOKyo:gpX%l*뢍k ?YS?ɞlBϸԝw_U`n+bT5.d)^ wW\!ϤA6*m=%~I#Q U&QnY`pb=/.Zyߴ^houYDc#Ө}^=n.'#=Ydj2t=O sNh4#lVC7y6M:x;j3ü,U{6TPU]M>WZ;q6 d+Qr\X2&0ef d [-D-1ۗr,-w#Q/P Rxm5Zːğ#gV^o/e,y*У >CIstpe |ib:$ 7 3Z_r#ؒ/8R~5DbAhj-bqU8)~$q(Q] ꘫQG!Usg&7яQN94UDkHx7{Pl׳ `lrxBÚǓO("Kkc)no+W er~ ['w"Tqu_No )$}5.]^Nϧ+ "-9ڂlDiM-feJᄑh :zB#̈uW2G-2M~[LU/z4$MTCAA{&*n3]-0=SGњLA_[(ӏv: \\(InZ%WQ8RY \u»W+!wUnڻF[R VɯŦt{jTn1O=UAF?v fxf# Ϭ]Sk҈nL&nudpvcX-$ߒ_ΦK 'mtnnl.7iٱ{U?,2Rh8ةQh3aSO%AT2i -9h3Y'q5fTi-3j9}nne$E ;D3 査s9}8+2'JNA+{cã7ѻx3|49i#u\cxT7ߚ$ʙq6B9 b58\h_W*1U#ȉ(?R5̩ҧC*v:>;O_;b`*Sӕ-NԕIh.ReYt,0oԄ{~zZozJ.C^K'ȣԮu;^)yX2~9.7HVгғU0Ƕ_K$Zm%3J(\V,oDUܵJEVRyEw69Txy[o%ܺ.+ee2sR'kP99d{܍_{_7+uT*17 }\ҟ$ƃ?E$vT,Gw{gu+z0]rxD~a?*ʏ~w$~w`mlaE,SQM'Vv+/1  tچ٤he-ohQt6Iuko{&G82u *`nM.58)Jm [/A P#ӮS6>SWe }2@Lv~?RyG%Xԅ5[B!&I:X{ jz=nB֥\h8ty4,)p;(1 r$YRk;t8 5UA·̿l^ѳ(=X⤴~IyZ!l3ڽ8_ˊ,)k"^@O%T)F&XN4Jb;o5csΜ8/HK Ȍ'OzwC/637_!or&Ԯ|h"|`:֣E#Av%9zȬ%o). v9PsO Cr^d;$t(% Pq|dy+w._U7Hx- w&r G$\J: Ae.5 $rFGb5̬7~=|#':9&DX*V5jEf Bysۊϭ&&#w* 9#g{rk MGp&ooRӻZ3r@Jeҡk]QJ /E۝QvhnBEya60A ?7xSHhݼË?03rnk hr9!Ojޡ*_W;Չ)?P5wLbRm.CeV B:b}_GмTpc]fwu :](9qcsTՂMʅ^g˱qڵ 6q΁A9r!ybPDv^VUL,2k9ْi9Xb3t[z3*n%P c`>eBO&MGJ{׭A'-:[3ewQښ;hmZ[s^Ufo)Z.'Ӈ6Cоc찝#ߠЂjɳܾr<&O9AeݎvfC19@/U%4T;CɧazH[%Fy$|DB'ӌV@ t(uфy#Aa^ߦ 2|^s[Mn7V |\y,}aM;)e}&r.[=#Vv[GU)V4fek}Fl1I 3icv@՜Haif'PЧ32#f9,%|#Vd&DDrlD#nDl yX}dɖ rs.ZR]B^U~Ez57ً{07XiFU E?l"3<> IkIΚk~m$%ldSM>p4#珹 Z9V#ƎƑZ֫\UyiB$-j#ě.e#^\wmR.lR^}_򷝧σ_J:zIJ^ O\`i&IFu?ŎRFt=g!GWֺ!b#Cs ?勯zTq@*j:[-S @):W1Og<|z l% )`[O0Q/(ֈM90n/]ODKoL;MS $" ,+}H_3f&2vX 3•X޾GXR #2^+N+ Q*iFMEFc7TpZ𲋼6ڴk୾\s%X厯n7̀o*3/$y3' +i:횢r?o|a ۈ^:RZ2qTqUڎdg+Ficךq([>E{鄀4 *TV]BP4} zݡUP|*{ϫYCCpgjNs׭f=&K$gc2P9+N-z}jBlߔPKn l6 Zs>3 4JPQ1i^t5"QK8=\F yDF3ŬQ[QB? Kb#RGr4zQƬ؛oLW _':w!u0Jps^ՈZT>;ӤB?W-I)6*3>|'H7q3RfGOia*ɥ,!'WAVK/5e|ǔ,Wc `ȹR6U) 2#Fr!zɌZO,6ʥc{T-QYXVvNeYOIn-$Hbv(ϫg$i99 @ɜA (c R\ɩyhgeL-;7JDw>9]wor0gvZv8r<O`0syόY1ɀvLm?+i@~ͦ6:stsLEy{ [Cßw-bzwiwTh10GO+h*Tko, xPMmox _Ғ [ҝ?_8tg /p>P&^%d}9Bu,uI19MDM̧RqV٥_0r6p1mYZ9|@sZjb ؃'!e"IUoo2DbZ#5}}:0djrQ5(*,q{eEAhws&Ķuc٢SJ'^1֞c/yjUh|eBussZzd^"JrxFޑ*#^ ."ZR8ZHϙ^OeVǻ؊IB`=ݾIx۲18i5jGk(|0Қʼ TS{.&⏳K5}eo^sY?wNanRƥ 8ZeW"PmsB/RLAD=2le?y)|OU+Ad:9sP9+Ѕ7^9TOz⡦ hqy)Υˊֿ]9F^Pq:wt3_c_-/}GMg oȝ^4tFx8{"b-L 6 D%LJUR+0hhA7g05GcŵH)pUB]'+ֿj;R \*ZJ EWrJ*vU>GsUXEAc|CKyB] +Bsw}.9 Xf֎|#2M+"ϝ3DfM5 y 3`+R{@wϊMK/܎w߂U'B_mokK+_5۠:]Okb gƤ@ ^+Q$I.8OÝ.7=~+(C8|V'sb(}IH])|߷Q \΀<.-S_Vhg)J)) áAU*CnL\ٍDg`wDivS~ Vafk9< nGJ:ƤQGzQkHhj֛;jd}iO]%0+9ERFkP(>//^@ݛ)fe<=eQHJAG L-Vn꯳NA ?CwVAKìaBU$ r?D>_$y$M}9n&ܜJF~U-U<_sx܌i0Qnw@ade/9R\NW{K!=\,+ XN%(c:?n.J1,wX]KDž ;XۖxC$O~T?V?mO_ Ȥ +NC*L/%,$ I1c[Cn[Zd۫$&?BQVjir%:[m'qw:y8lH[>A_/ٟ/>._$OFY5:ܗZg`js/;l,wgobgn'%J!A+O5&IY5Ku0}ۼj4ļ턔Kɝ2Wa[JV @ŹM%gZ*a%^w# 8e0ov[6=1Bx"l'yX%| e!KzG]ML(Hϱ.` 踙n1R}BB,l35Fe{>r>qCɘFQC~Ot#kER Iح_%:&x'Ṵ̀\D>;@d ?Gtx?G9_w^Ic(x>.,M͈@&e<#9d0S~R1f!d緤"i8V 9exd~gZ%>IXohM~y p_8 ^u_//t>p cb!R`I"q>hj39UAyI!5V=EyāOh_T62duP5qj8{Zl Kn|{Vzr`Y ˃,TNrX#a^xHqvHat+;Hh'ox`1G,T·~LMPZM鉮(@=!<)J"FM r;=+^v-nqɟ"d> m3f`{ 4U 3]n.+nV g ڸ7?M))h"9"$nȖ76tffPl)T'Aw)Ad=_!FQ`oX\6ʠ;x?[]NiWҩDN̔ 3׍K4NpKZ\A@l2oC[ Y7檎h]Bt)=xu%A5F2B}f| je} h T[+C!ZtMG YELr|On[n 4Ջk.O6|o7|\U`^NbVyz8L f̋p0/%[`-! MTX5ӄ_F[.~g֓3=xKDK%{0\:nlPhujڵ ZAfQqcMGHʽM&xKcoSҫ{3؜xZAFW9H>'799KbTplJ`i2Ƥa~v0H"/M%B7jG1GMpwZx<O{7be$q4)nr*(k bˁFednA@Y,V+τ,=Q\yrp?Nr]1VҚ/j(w:75p rTwPQ;*B?"jI%"T, qDTfέ8mS[f z&+l4ZŃ!o+D(믽إ>crΛqЖoWhkˑpu\d8JG5wɊri J4_8n!Qʳs|r6^-ψ{^>-Y>_ɉd"Sm "?tx\a'sH V/~" zu4+HT˺7.psoiW`o % uBBd BpGOf3Ór$Dl;zYY_ʛzp֧Ѿ00rk;QUa !/Oe9Q"a-MJN}`+%K=ϳG׳ZbOs`@Iz$_ֳL>@Q؎UTu7"_ %58 Cxt[eƁ۳ )Äqn`upl1nnCXf(pJW?AOs[0=[͟Z\Ғ7_Aktn֍@7tJg'݃4HGtUX?5@Hw0w͎)*ltZݏ70tq (#&#YrJx`m728VJ2%V]{qjS݄WI|!hv6#-:8{-ޘ)\"ma*^Ь rM_/sAFlnP;&L^Q+mㅈQ?ݑ3ݝAhFwp9Ss}pF*I]b_C1/irƻ|!LD|]gkp|]-U~k_(7sTs5FjL7 &Rp*{X6.S<̫'Kk=_r g;\pCbOE78Ą"!~,jҭuQHh.|lR ({IM=(:8 T?.`BDo\dRj'4,g )nc[>/gųS?k6vo^5w϶~~DJR'v{<ev0B|QBE*ǿ*9)p/3a]\AUQ9bHq%] dph|ɀW^>s'eq7켇]є *Hp0V{ѓc |H~yPz2➈@Ol x솀YuoF+ Ae~ʔNτQt6cۙR ;ɛ/Ƨ=x+޴0u;(o 2"O_m(pYo1rt?WCцh<[+͙sF7p"Й=V.7!()=Ԙ* )`5 DJ/V5ԻZ]ɧO淍͇'3mVbS $1D #^]|J/ʩK9ǻi$y}>Eż %˗o $##$䝘Y#Oef/ =Y;F@u]2p ok^zL5d4`soӃtѰU'z¥3`οSH;Ltvû&AB Xؙ_ɶ :Ckk7w\\*;4u{h&o!T@ts'U`8Tw8{ggx_ |2GGgH c?OWBb_|FB: Abm8 S_ԓb޳ٟzV?\쩧&x߅Fz-Uk(qux\\@M$t6? $A$x0`1 lS?yR<)~EX'VoW=%Wެ~ʫ,h} K=j5_"f?Z9,0/D.Gƿ1g6wV5nJ;۾Q/b?w Ū }I_{tG+CV{[/Ҭ@bSݚ`ųFm`%!u- g#RXd%1xax̄]R?O"eJ7c#hv BdYf﹞NM:ʒW @^T7CJaede.#NbϲHܒfnϜØT 똎^1N2Wfyɓ9$mubvn JQ+o͗ʗ|rr8c`5zH(x/م}CKaN%̀ M2aWc.bo l#F0 :`*b;sL!ÉePupu f g M:u!;1g\Gǣla2 ut ^rq)w5Ka9pȭ_|ͻhK qIp=3Ds)8El샙)(\uy7)k,ۨU-|t;^>Ԁ`XBr#'DlGd1bwVށ\ʁ{ȼް9pɡ^5sV0DvgF˒ڜEv* _ë+! aҩ8xI"ػdM."fJ~IgM1>&tx)PA@_}}.iq͑ E \ө > @;z`PP.p|D7i$K. p ]F9Sn2SZܓ fdQa~;$IqH-9(Nh;<"`BXXLpQ H˰a=($R=i/# qcj1`Զ-@~\H|'Q ڲ$=N|^gr:a&vЙ%:별!ݚZu3okyl!dS\@ Zl2ף0 橋Efj ?P[GaܘL,SVlj[5b2I{sh%+0bB&uetD,ruΰ*>yWa/0`iʫS}u䰯k9OYT6֚>V͔ )J2>dz!d(܅>GhVg}#oܡZ=|W{K=ρ6VF8 6;Of~vͻb&#Oπ꘶KX.??tjJbl:Y2[]rurjtY\2c|tEJpχfiOϢJs@ ZKSӈhc28R?PbF"9ɕ_Ϙ"D<DpY"MJQfiwfltt6}3a_V7"&onyMI;zw%FNttMKfһLߣ$Yh3"VDߢʐT`-֫=ч\;c3S6:^H۲Uֹ(0(ξTյ fUz%ɣIHƱ_{!|'rrFˏv/'ly/k}@1ܓue!6 >e(Eu*NBͩ| GX7^r1pw "nb!N1T 'P q =& |_֨v 3%,7t=[pM{5y* G23fw `(O=7VPU+z 3Q R\ !t&[ե';tewc"VϷWYi]?b86b,U5U,)[Lj2x^ӝ->W~5)-g еCnqwër7މpfoՅT/`Dw"DW]vgKJ#,=ņ2 .lDzmr[ԐѼv4 ?@|2y/^C]OZì˔Oìawp24;tEQ>mUq4\æGۏ 6gOr\ф>}˜ |/qLyKX 9s~?e8S:}A3pcKS9ϭ z=L890NXx}UEUUQ .?rQ6ѕ׫gKy҂bmIUIzGqzGz7:jMVQhQlahMT4NaDIJ\#6+~*X*F+IaVyUxa@ wAFʬ[xʕ9ɌfDV1V>e z)o48i;y|2hie~ƹ'Zf ២YY||tDTI Imdm,*{п{/ч@5 Y"O;|Pײߏ{G{wi{ H]zbD9 j9r/3Enoȏ0[Vě`TuEh2 zvW`. }3{-k@.ЅptS2vm\yGLTh Lo휓EQvRM Nj֗`}(=}#t`5 vk՘kkyVvFdSFdKF<9FWvxܫ$O :H na ӽ#}[Z՞5v3#SXA}:}U7--Q\[ݒOW=Z]B 04B[񘎚4WF0h*Er;OƗD`ܑnPnujo IZR4.X'~x.?UU߄vx #q x(#{H ) ԈiҳJ2*T6)&v|]p-w̒-v(9(F~&NvS'[ai nanP7YJtNjwڝI8r~I0 >"9*F"}܍RpG,3"\b,ѝK4c(ԏ2zO k!=i@6̕v9#)"/q 3&E786n+AIGي*9bܠwX(>"v.C̘?Bi;L(z[禥!7IDȑ'^ }aNĈ0ǽy܋}^cN\vR{ }|PVTyڳ)* wi44t+ܧIY/4YOg+Ųz9i9i9aAi tDuM&\sRĘMkN;W`}M7g"|WrM [Px#xv꾭joM"KJG`dɎJ݆ g!>#k+?tG@F E+ 3#]VfM%ɅĬ&eMg+k4HK3^z=(YBmXwG'oN|^ZOh) ~ ȭ 0D#+b&r҈놡T+1Vo図>74jY%D?A"3[7 Y!'D 0/?lt}=%_|]C7ï:9/jDhƪ4tlaޕ"j7U$8>3η>|V^?rWlN%xvBu*iRU.L. IJ 4t -҆E9,+>t0 ~!dpuu@AL%YL;u!\?LKH(FY|s "^ (qGBVUyXeѨs޾á3* 8T?dJ!88`&>`}7 6 /6knw0 xgCb7{"/8RjcfهJH QH={@."KY3q6sVf+sL5k*]P*V*KXf7s0ookX6`JmLn xH*R$YP[1oo4WD{ [8=/Gs2IO Nx 6G-]-9=`%aP^$S(ly[ Y1X* E%*.AO h +88qjQ朸RA %kDR:F&$%/r$T ( ߯RN]UBsS^HjѳF{yc4pƂ*N@O+㷝3ANC.QUC~ԛ!=~͂>|Up ?fڒ@r8am/@jԜ-23j(k ͌KS?s3C*G 0՝JmgVX& 7^!*5{USPVJY{KOv=uÕ*Bcڭ=n'ވg>oʬ[=PGPiEi>hD%DN=6z;0ѧg}=Cnz^{ v%( `gϞ~v$ k<pd ޞ]^͇ߔ̰d>D%7_l?yRT~ƙTfGc | 7yA~N~> e*FމL" B|77xO@#^mFڂ1P# X¿fp|5X:'Eѽ $1;!5೅syFDʚ>KQLŢd>pQ:/]K"KVDQ% 2as˰a&0AvIuZL!},rNKc#bt[4Jkrڌ7i!g]x)=۝ Y,&|4C.a5LJ)vF@CUGUSz<$\eQl;Q`*`œ$MjոLʶt|Q! pF|`ƒuT1ap?TDDj!ysƏOFLxSx&FPG`˚6.{qqZZ IY:]XaN8z=^=Y'R| O^Hڶ>ĉ~Z#myOqQᖂύP?>oqtn=>Mӳ>;I!M݀x&o80$Aj`%r{n_~+*㲭=Q|8ǽ#^伆)oiiuKluU'qd5j9_ vsҥL'Ə${Nf{@Nt#eT9 VO65gY= V۠@6No%=z%~{l&y05?8*[28Vq FG@Dx* 4 V< 1PF4xB-e"" 녍^YDN(0[! A97Wײ,64,A)"gBmǐŁo#U0j8K"Sp5Vu~+4* #V6"+U^]߸-h]@yG~Keק/'3.ۚ[%|fo:emgnfݮQ7™:ʉ t5hHC36m.uַ`Zo |}N a \ e]L!5  cla6AiLaAˆ), kYFzѫ1bX1>L+:PrkQ&{ZP 1E}Nҋ'T 6 ',p^?XrE+?_%q( cĭAؚlޔWDə/gsY=Ts_Uǜ,4J'B?qBH+%@ b@0΍3ոϽ̎e^F}JLnd̀IR/h6)"?=RguA=Cޭ7k)(@z΅=]ϖog{yNtg[VH?-'é_]ɒ^w3[fAP-UD315cjnj)!U3d'I1'D@P<~`|q2݄I"~B-L?AE~D M7Bɽr(L|F6>[/I./9bЩFCf N5L%,1@cUa cC ,db uFj}܀/pHH+l':-M)"uXZ?D\%yDK2f ĀwѠcnyIA}$ K 6>k4*$<3>+',…_M%1BnAg逥r#Lb|5Zɽo!u p&hYuZtĺLYꌑrfP_cInxr璐>1.'t8|ŀ PlX20@ڌtt)"DJ\cӍ ' "Y&E,6ԙ˘]w%,,jS3R1mOF >' ǣy^E(ǿ86RTPFLN \".`4%Dw$}cW[OzSpIY 2 |:䀔1`Y~a&:6EILLodHᥣ)] \DS-t:IT j8MkuA{(08~c4"0#o[e7TdT@2UCh"lɩae)\!/S0;{` f)Q{@,Ys8ȸ'K?d: D2@ ‘B3VgHB8)lxsv1[2^0-yY4H5mRM>b%DRll9R=] ]KrB|Y4e3өW>f$87|Mf3$b:;].B6QmdCC~Roa9d~ KNfe昤co|eN4HcWT 8/[ƁҜYtA.wbf<+$.c? 6uO L5z:bJP"ߗ V|7p2<& VT@"@ˏH1џh%D#B́6wcΙ ]Cu#_fօizx3¿OogSPcej)S2%٩@^@wᣕDa%)Dga9.\TP hW{JJ:ծ!A!5Az˜/}ɋ Цd$yul{PʻݎNb G-gb$ Ex SAqɧ'k^ ~>9\V!lbGWeke'Ǻs3(Evg&)ϑdT4 -h b-C֎~0G'@-ہw$h@O9k5ߖNj՛*'7=ޫZq! ΀ R52wk Y{d.Rzo!ň~s|2H]ho{|$Rx5@`ҦjNM&k$y"2̵Eg'Ȫ5Ee.Nשsb$xz僧U%>zO80{.*7Qe zKNi˴2`ODښ//O>ʐeF(`@F; .ezУ.vtQ5VJqP É 5p*nԝJz7%#7Ї؅yR/ǽ*uHZ9"=V><\-~1TL/il3;^Fls^QT)QZh*Uf {TՏ]힪UR}D2YN-gUs]I6' =xdAډHsE\ri ,,|<"i!i Ӓ}7zwǠL'`C`a j[6=b%AB"ʎ9 dnVo7^G(~5).K{A9?EKcn2ͤ{GEGWl'Zݥcb*]㫁;uKFGq6ɴIHfTD4AusÕgAt1Sr$ )Y,)7/at,Nx |?0"`/zr>~?PnStY::,A 3fudv1h2wbA8:TRU(E;wn;d곉G NO]~aEUx-O @R|\ t+6]6,$^"E!b۾ qGRSM#MߤQ @T#*=y #%o"v5 %toe8SpDMUD "@r! 0 Lk\<>WH 羽tk_Sj%w hWXG'`S6xlʑHuhh2IMW^U-ಁ# (|3Mv$Y1+E;NQo։CIFQԅOrN!P 1; ݛ6k$a! *Xyyyt{J^#I."EDtI @rUoOd#?(LLso> vF@|`#,M2qomgwH{έܡ= y^iQ]rq^(ѹ؎ycgO*kd SBfK,tՌ>E3tLADNMkH|K+ՕoZD'h֊%:@edGDJĿ)!#&^f|Eԋzz Γ TpVY8_ӐR֡Σ,|B4bh}CoZzb%}'d␼)+;DVWbT>z;lTQЇ︚.-i$HUD67C %]J\FmsR VFeߤNVj1!\Dm:yٽn .8ZQT9i37ᡝ?J::LR6Yd5,%,D`9tR}j% I_E`-^6]掐ưDXsV#yqV\z'}F 鮭x2Zj+z/ McǠ8ݨ_!+ž0Bc ? 奺1访!8?LYQ)?Ɖ6 |OVn}>!…M&JF"Z%y5b@~*% ZgXQe7.o9H3X2f 6^J.}FiGĖXfsoRzo&Crn#9Yv,.0"aX8T>MƲpܻ,Dzy{ы>Wyd/RٞB'gȵZ*Ej[q5HRwy7jwfY }ETv*Xx<,MmZ9XUg>n^+kӵ{xPӀz^%j;k*؞ȁ\A{t8݀fOW6"΄[c@wA>UGe6X:UT.@ĵR-awڟÆD6=ՎJ4M?8(89!@,47+=iL$Q$]u,Ӣ\ )l lic+Th1y_D\c%L E!&wL8 \ $`@9ªYUDJQ(/ 0Ng@ݖ{|kY/gw|#r熱#a[ X вWlv+j2S|3 gJ $VT1޼rWVe[Ԙ`_oƓl:NRt e~X.Lj,)"EqlݍBnT@f.fDv8\nRRMG(&ƣ Xbf/\yn.\񺛌g񓀪^fcT=l") d;!w,>6%%4ADni=p?+su|OK`7"r:WVII̵,ݢqc g r|[&@=ɝb9u!3}\E`f셙tQFij$$vx!u pe&]dkQk" w,U"e5c@D_U] D^ +ǚT 3c %u\k4׮Fe|&-@P">'Yn$`RWee#b64Ω9J\`(ȫj%~KtpJ|qA ll X٭/+[C}̨M37_"6pXcmZiP yh?i\BbPG_wdB҉^Sx(wR扷V "%"iJP[Ү\7_RSt& ezd˕i>BîKC,"d|"SM&q̈́sSI̙u Q-5?a_҆""bӁN&snQ(o%=~~ +;x^~rq)ao%J[oZiyͣC/Kw%)U\K@%$u௨Ū*x6ؙ=1UW&=,і[],:p'L5XLFXWcXza.Y3H$RTY_VQDl=xJ9-zО"?^EUX {#_O.?V _XO"4O-Q\Izsu.&_N9x9`߁>uǰpT+&7$.+dpZ\Ox4ƹZP3sdJ<λDuE* .2ہW!-rT[9O;}%_OۨB_yTsJ:TqgK JerP,zj=&m׫t׹tI}r|;!7BR!5g;0]R磖]pȺ+J|fXK]q^ J1;+$gjP=R״`*38ro[NG6[b@ʤ[@`kqaŠVE.c93pPXD0/FCø?MBsE.TXDcUnU9&|+\${o萔t޾U= ܆,Ė%4`b>9)%Rt_%'fnE"yZWt(^nyyǑl1]ө6ܻSjWS D$xD n8:{"_uJ:b]ox}tpXfNz.xeqHUbC2ILbl#27Z/gWɽ`Mk`>qQO~+ CB%ڼ?C9f8H`twW#rUx<ōĤkɎd^t۷ s$S#4"o1^%,3,(} ]\&Nn fpסZZ.QqZ*jU"88үo NHt7k},[1R.'XEt+ˏbAQ%d¦)sn,=I|Hݩ21ݎ?a>»'eR-e݌9< kcB[^x@#Нijbu$ESy)<Ŝ*d< /V@َHaD8Yk$(UsSgխǛcD?\YqIedXԥԬii4 (e$;@RU|.EK{]LCsݲ3&VtJtb^3P'}W-Um$ӶRL[6t6g$նhr`ȣ ѼvM E{8ZAiխ^&ǧ6vOM/#| %+!a!- Dɮi:̏`ˏ7\O4d9Dݨ/xήD i?sȹ(X޽g~70֣WZv4(5䣨Vx2^~cx z;Z.XR@M5E5o⛤FhǬOXbvu_"KպivDE^kR Z;%Ja-i$ 6!dR,ei: ʆwӊB#]p#Q~K~zQwMY별qX^UЧс^sp|DZ@@ xoU_0K 0)K+HK|.IgԱ/]rvc?-l/y/5XNa|Dj!ه!@N<-\|o?EFUAUOx9R{읍% ok%ay1ΩF]Lԙ TeGhf@a\Nd (C5>mC\UJ&¤TjĀ?Z%,҃%mT6s PxsP7R,uoHBؗS+jRTH+Qnmxm٨u!#UCͅ8^cfy^rX,C  , RAerz*t9gЗ@+3ld'3.UڳFdg EuSUNM(F.&xyJt2vEYs]dv"_e{LG"-Ka?"Cߊ0O=㙢э2JÊ\HLytЌnf?0$#\֏xGCj"X_"Y4 y6Z+CNp E ^]EaJ0q ~6[DG\Zfi͕3GtP*C9ʬjwY5WySJSfU]yʬ C&?ޔyȬxū'8-3~_I V|f #vK}^x}ntcwQ# @tPjUNW\lv4F\ԛϝKL >vx {ڥfSpNSW>hyW3MJ ;`L/v1*{ޫA:'͡EO|dY( ;!Ҩ)E*tCViHKi$"&/*;/LՄ1R]{'dG7{ktkQhjZTjDG'dREo=74\f'~o<.pGd0A+v%ܸbϞ=|%R Z%Èa5^^qMf휫ì~Jeʮ9F3lVsm?߀zxAT_Yq|`[.WYH@Ă,2IL34mxӟ[=<>\3a6Lu fA̛33~VTӽd$tYoko7d :\p͕v+1ɩz U]V4H2=cg;ujT]μC2Uj T~Rv<22 wq8ؽۙ=du{#kp/36hTQ|jՓYc(Am.j\DZ槨h !P+_էeB vB@񽪆 Rx* '(x69Rj'E5BÔ[ⰹ@:ۻ)s^;H]L){#qwk7:}۪P_z?~3^dZ])l"9p;}ao;ʏ/$?.D~zw~ϲS`*u,fk,PZ #6.A1lo+{TUժh?d]s0W|Lޫr, խ-z?=OI8Oʒλjh\gtD (f0ߐdf1f~9 0VP!L>Q.u$C"QuQ'01;EkP*bQGRQm_Q"`C)%dCNA௷^! /,`bT4;3H8orr6.om)!N7sTuD>dUAw|ݡQ.eZ{+('-Jwӄ(I8{uJ=A]()Lps]Gs z[_)9u;}.uʴ{_uGe̻x*2Zx9҉2;珼o݁c|;h]kⷝ:p/{3^~oշsVB@+ 0;N5:uM6?ی2 m6q8 0I:#v7%Dz,B0= UMkv|R%j{p.>b Ȍ__e2ML+XeeH2$v2 tYZePmў@"t_!1*C (@ Je(YFwWe2~>|c@ ǽ*NlHbzR bz+XKQrGDôԩ5-HבVm qZfd/Ha&A!߰Y=`WJ}[OI(lTP-lrkiu+Mfw?df}ޱ3=[D`F'Dh O-L-uZ]c2uÚUk;gy[COuN!̎ȃ >O%:fJTt[ ¿ֶxFC*0S /F~-uc`u-haX oZx:'B]Qk^XQtzG'8eV«+"t 5[]0:ɞUz#+A̐E [zSL=-EJD< kGYDąUՆ,"IK<2Pz$ UFFt8vwڔ;[Dʴ UˠK}H҄ P`.DH2o4U!с G![9OuŽ8 SoYE3WzYNލ/?nvXӘѿn\']"2LXR,q6Ιz@P1YۙR"Z_1XGO\`(*J#L} > r{({7kv@x(0:yQdSM{C3n1lXXŢt-9[ Oٽ0̤敐L(c[x [FAΌGtL7gT֝;Ѿxg\F Y<&!?LiK8wGwGG6:i:a6hT]bzM6o1JAX'$MX6I5 J -- ǡx@9zIte#Q-ITi1v@.=IvRGkIDqqIR}ͯ5pcWӘThIUV^SbUF OSɻ ߽92Ӓ\!- Jo$ވEi˕_{S퐩iC%|38}nw1}W̐m7:b}+2-cuԋe]"` ;5cΛձnv{ ^ L)u]J ^A^_#tVi #]knʱ5#RtVR%EW8i[ 0`@5 K3Y?:wS>*E4g ^Yh#W6f2M#d| ]<V\AA@qr4NB{Lg2LT%WFN2<#xNYgAXՒO6o :SaHT}PH? 5Cw,(?i&& PgP= Qe*\9ȷCep>Ʒ,yΗ:'LiWZ4DN%ķ!$R;[ !| Ǧi>l '3LVT@]x+( 4N=V' K=8AM尛f/zH ?{ՎlHc S! .;ēE6By8INam>ڀr:Ov%EfW<("PM,qg4Ji[z9R"OXI,Ń,ufCO,7Q?^] o&dpD\4t&^?ZU}/g' ^?pk kϞ;?~S{,Zm'J=j|z~_w吟 rt#_b5zg\е6勱(E% 괸V 9\eq* g&t[6u"o| \/ 磗A磫b9KRD77N bˑt=chw|1r4],+5>/z%@Gcܟ$Heb㞊)_p C d"` tzWqV/.(S9ۃלSX{13H8]~8jSFV{hvSﱓqUeI,srGO-rHbr4 sU|Jl?Yf:[j,'_|~UgO&T?u@M@_]3SL?3&7;!VOA qY$%:i (15 !ߙ-ҧ^Ji)ea#V[sxTW@QcZ2Yq,VRx,VvIV- u_\&V4+^n!%boBTqgy^TōŀC\7~kNMoZx t.S-zQ{g6@iX Df@[\#XX~IA)rƓv%t {Pz/FoinF@S*7lЩ4쟩Ğt>&CKN-1L::\ RAkΜSH4k](hr+L:KT3хQ5_LGxn7᫉i~J{^io##&#*yoѲE3fS-`ҦY0!Fwf_R }WX@4b$@F0{6\j|ӆqj[iq.Ah2b= QoQT1;nrux[De1 T?_kZrc?9ipxF\pqg0nH 1UZRhl˭.&Thut.2ƩF$41hM3)k&\C$f" '2x2!{T'aͰkk~kJ׈԰Y#k$eykooV5>8%=*:UXSiQ:Uh(EׯR%~0v]j0h<H1m~DeqIt$j%_C{sy, _ysςo̮ T`IrSjF1XEv;ч ?CSϊ72Ћ!)#9NFeu#o17z;_4 aX`4A+J2LR8eEv= 3Hs/ ME6r3$lm@$ (F1n'ф||D ˟zLJJK]Kr}{Ww$OLA{IMe%Nb2ML qQ١HuG' NpkdȒnN^)կ:o *{ EI(fis&KQL7&N$n$8ʑLoIdfR25KR!3dgʙ[(xA(זh֡d93O(\&Fg}A9~UlY)Pv>@קJ7fcKv5\ ?oI7bqwC%|4TID +!cBŴϻpz ߬I,4/cuQ.I_Ų@U0Py>Cjf,uifzV>$37®Qˡ ]b&<4 !f7 A!S%!- b7pXnp,Da1nA P<{c@Rp_2y@A/Fg`OPdMNdat2yղ]1$1kٯ+~<h37ղ/@!.^ߥd+gT]8ٺdVasAz+-"WטTCWgȋatd>Εs3Uffvb=@Ղ0e&b]sGl[-TMd5rNL?zp[EabK0ww7@vD3fڭs#(QzϑǝYa1k(%aVًza ,xb!z<0-˿>A#QFȃx,Pq1U$^% r'ۙSLuCMF\uR]dW ܇"zP]iF'(ms ȇ:NtnW:, HVГCE~XmVL^溎ۅ ꆌ[e#cM.fhO[>KˉCnB+9s[MQ{b1DŽH EU!Yn#C*iF6!cip?wM(CI<Gv l4FmtM BCbݶi4 Wġ Xi5Jض&  Y敧YUf+7 pa3*s_% ux\o {)!n&v,LtXۛp1#č=x-HrB_׍MWwҷVRwY6: =ݟs*$b0k~J_n<_vv_~ċe aB'ANjXьӑ?Y {QsI!43 N-b2yc[a3^.>hHd伃qjYSdXH(IƟH^>N0Aւ-nQ:Tt %Mb |ud͠\J5~J@h5IObec AHaX âBzI^S8uxaM%%BiS!9**zHgRN5=)W>dCODpT]+,3@?Pz9~@cUaPg0R;D N5:|} &VݬmRkt'/it'ZkA*1rzdW"[JgR񘵰VOʭOʭ+qi[O n}87[/D=+qwQզe޴1`Y<=DǦ+u4sj#yqɼR%Ʉ N̘/]HX^\>]i1*UX"r%._* ]˦*$!FPJ5ER.Ćor 5c5mˆ TcPL#a!Зn7:zZdOdw1蝵x+=s)vZ͇xyw& s1'._PsE>UW.;*|g^34#P3L8!k6?9S?7x {V?_^ʪd4=(7[u2=E?|_xutCrYsO֛c#d:|䊶+,"X{1gRE.x0 G ݝNƟxM0%C~,SHbr3[,M/ MX<|zyRHB)v) U}ΜRxĸzQ|nJ L*G(@P T *bI !sI _E))id, x|2N$) ٷyQbEDqLPr[9/͝dxۻ-:`$k9֬TcΖ18렋ݘs5`F }̯-6Le ےП?/{3 ̮ Nvn?"M'BgPߧ7yr3C^x@/KgUk!B.R:xlh )rUq\rZ0lnw:s%X!.*0pYnL|-VҞ~gy-eVCSaj /?S+?6]iFkrp xjW`sUe%'ܥ<>&Uo/*;/LSM NzsQ mg«h{kx_T.ёmI-٩ԶwЃmۿ󦖟fz^-7 ,:/GU"#2{k6w뿽 k7_B ^Z3$W>z1\Nc(C'$^uY9`T/x^q?U58wO|Y.?Vt٬SN(, Njځ2*jt; qb|)eC塍3XC1)#oo8f|.W W$懝% DJp=\(Tns6Gh>#U] kaϏonFWT:p s^=}vs/UQY@- "a1'(~В wѢ+/?7jזy.A*wZDQJh m">b ?l;-mwDbOv$W7)|Ne`54D$rDA&ʼn}sHp8Y\ qn42UWC,nGjsiLsH;40&P Q];rƾi”lH.CDfѐQ+ Sob _g2{]`UFߴJSŧ@g5~8+ӟ(YJً@X0i &ys|Z{& {B0{A+$>=%VJ YS)? {-Dg ⨎ISo!^^x}'IxF+|[c:?]O[FMТ<eQEg9=}į ﬖ au'^~| -zݧ;Cx42^3.< y2A2w : h*{^T&4k9jlzgez $]ckiH1PBi| ^7Zv7Hhq;BqP~1yߪ-UkbFV$tVL*i%5ZY%")(2(LL@!-t58c0Qq#Fҵ|"7 6gër\2\{3F4ac((,>*_o4fݲq1 j;iKT? @〈 jCT%ŬM硪F3![G,;rmwg;Ep^NJ*՚Wԭ2CuˋՏ]8J.LsAV~a[gL}SR!Za9ˑa<|e\cSyD~H-vW:b>t GWxt@]tJ( l;v-:NHz`%* 9u9a }$_',s mܓ:QRXdnQd?Ʀ G%o(b>OF5_{]7?Wv'6ߑ5pu~ܬ!ܚ%pѸ6^)Fd\He"x_YA!Y+J0)0x rpӾa} 6xXQc4rP B=4&H1xDC=P,u %d[QΒ:,TfT`h!TO: el`cwb!s\JҙhJIC̘>f} 9h.\#eVsea]𓁌"7t*$<~aULzoWHf2)T>^(P>M͸#NM2j/ Nz@ -)y^ER|Һܺ;4J/ݤ d+䧑GKWlAeAm+L4;0 b-e%Yj|nƣKlv =pp;@nb^dgٲ&8@&eUMM~=ol8v͠~L=K@FP9+|ٙGa@Hl@lRyobKZH!FS1d9>p>U'SF׆/Kj9`sJaJ\hnP Tl6p΋R[;OiX)gb)aC25uO;f_ 20fl FdKc)WZ6P;bX{jF[eюS4kxw`_yD=rM;^JY\@,(OF6xF llaB{f gBHi//_)6~an DU՗[$xuS7.Zs{XMNM1u?fZ<;*^d?+o1䳡SE[Z5yCل/ujUFB9Ù?(ɨM\DF*3w%]OՁ#/" |z -֝Grq8BJ9Z'U (p؏A| b> X4jbXLiV">st} Y:TYryqC*AF7vǦt1BZ9V [m B ok"@^e5l-!YKAP_ln'ǦPcuNb*d-;sF} ;)gxѿgOOW:Lʵ{dxuO xEpߥt{>[zG>7CJYIBw&"uc1B8P>IF{v1̦K{8%VDP`r"dv~B Fp;a2[ 3sJW](3i0"N Q ^V,+=~P TVmyxQG˦'Рb+[IIHU6Q xȱP,vI+^xIRo2mhvg=wi/.Udr> T5qXƠCOu39KUgcDzN_R<ПKߔ0%k)hyt-7n;yM aBXva32e1BtB"ԛZ|\ G\O1'?(9jwbJ5Kpv"|E"$/44e+ 6>FN.Y\dOl>ٍɳ7<׆ˑ=}>+oBO﹔"& 7>g￐V>i ˪lߤp{Mx@L?1tQwP_”Nq-cWs3gOȝ}Mk99tZJq&nd01Ru%V" įd|9[>Y/^g[[^{t[OkS$ۻ[ɳg\m#[,sՔrt#_Hg[ѽvX PKZj4Swg H)4弝ϟIoéi;9LJU#esv XPI%lǺnkFշ&z>% _TePB]|;QdCaw />Г ۇh  fS= % a.0 8%٭cI뻉|z9Oz;8 C&Ve#cF|LM;@)JZkT菴t[>?:X ͳNNz'V2`Cx͌j'Fw|E֡C{9CF!\=q2HdZEl ۗO|azW?~FuCUE,$D ṉh:u8-m%:kj*aǪlGuf],#c Xn/B')j c/9%D{#l~>$uHJqZ2 "́#\ |/ߜM}}t- ?&1;YٟFI~7cϩ"=ң"y;HڝZ&vJLsF4N)^l4u*ɑ<۩dEŤSLTe%(S k@Z̈́a+fNmV#߰NON{' eV>ͥ#]e9KɫȲg8J-S`{Y ÀU f\9OD3_aibx]/^^'4?771g)8|\CSMSx$ܼ'~R G( ɟ|:9tNiau'G7(NZLyJϗ*KQRNPBkوԐ@5X""_^~G\BB34N0pq7צh:sE.{)'t'Κ.Cdr9 rx޾F]: xgv'% :1_FJOXTZ;]@o|FFyv'쪧i3JZcL̫P D/++lePEΪT]gZuF}F-1m#{ogtAtswc"ąH4movMf+7[ WV; ,jFZJoxyҾ>S16XM(mJW͢eeV0حHs773wylvPe'V`:0ɣMdxjXc'ӿ@`- Oÿ*Q|=6w?ٿF\3Sn;{| h z8BFNC-U3`[95R2@) -Q'OfX\4g |3fo!։ 3r6iFFRHdؕc+,"2DZnJM2T{?5⥈E>l#[D-7utʯzl Vޫ\Φ銋ɺ R. iqA4.$HѐKrt mӾVkWN!g*<u|}GyYT] p"oL{c%VUpvL/+T=/[a`LM&˽802l ?"9(xt " _ÍO KCvo#o~^:Z ѷvpeqy~l"/E~|Kϥ( V"U(>: j Heta|r[_ˏ>la{%GէZ0C # Yab2IEP{?A;RTN.5p;'"1ceD`7:4 4ԡur=hK*o^\W>J48o=jSue,%K:H6޳zwxMz8Aaq2M ԐӤ+8CnM(%Uwk>j~ ̛y_e.Krx'[<''Qѻ89WMn'd7`)؁ΜdϮ./f_oidhw2`iH/Ut&+JAaahuӁAU J9\\&J$W더+}֚Kӈ.J|m ,7W; 3EeH.>R{PU*2*vMFn=Y{'IhQ؃NG^cd@蒑D V,QK]uHnf `Hf)Ѕ͟ƻ3:}YX.'lz|9fy`u%y%c:e_rOZ3Rc>+@#0(rP: lN}k5n+썴%%9fqVĮVn?bR3˳ v*SSEڢsɇP A ͔u*mR596>K9৕%6!wP+ VYhkifAUҌ8Ǔ dtk3% :S\ \"I`qw5 'T^0$d,S22L999 |ˇCa4pBNE'O\cWos`\Wx̩J2`(lBg߬ݬ#9`AP&Ef"ɷ5Z$~vhc%$r+4)'} u))r2{•R%n̗ѵdYh͟}N?ϘCSќvOnu?W[*%~ilxQٸGU5ʿ<Шy?>;?K0n`_`~Aawwf (P .1=1=1=Ы.:v~}+SG;E±'5E^ׅdA,Jjk?':_ω-?t J({$~s7d s$I)uբu$uT `|/0Uf3aP޺=azY=Ō┲Xܶm}V[1 q ItO 'VϠSӅ4Y^h`бYY/a2 &x 1@*k.! T3%e2/=߳[A?1`kkc:|( P"JJYZUQA|4ÿ%ÖV̙ NQW\w!7Qi8v[=&'\ U |5NO1rYv W!Bzmz6tcJ}?@DrWA%:ZvtѽB8(R"Tl#7XOxw!0t@šo(^#(nwd|3ց1#Fp~db.ܺzc |NNFO@c4[n9WzgӒ)|R-7>_fһw77-s)>1h kyU9lqa]󘼔:FV32Ljq*Jl^GU5 1t 3WJW$RY^?Âqڝo{7)m V~4)LCv㮟R YzVDo^^=a|@Ht8;M>w>ay$1kpt"jv_eA}}HӞgս:P0*'W=C6+Z1rh>񺪽rhsufhZQnA=3/O}2PfvyqaJ*HU+_JBSC0C$PG5T(ڷt\FNOwB$o2N#tAJ'a&#/B6)o`x ZtQj5ahnjߵ-$/آAb !W=_4g22qXJi ɖ{hm*bLLj_%*M@;$6@|*w7OB]IJ]5KotUǵ1қl0H-1~MR\1ظlhyi`g_ER]=aН { CSb(dhTNKܮe؃fbZرW@ ٺB-z+ 0r#{&7^ u5jt_nXӐˠ@6v7VPP8D6mEsCͪamxޑ%nx@5jJ8CKYqK5҆Q7{12z:3 *} X rKoį.Qթ b}/ɥ$ #]IT M570p~V "J] ]NUݓa v(kb)1N6QO =H灝URNVdNwmSh14%`;exGS1 HRKNǟ6Zu$B$FFl2I.$F7h c!&:M':M':M%(3f92Y :e Q)2L8=C 76iC !mH%9_4j5 JCyNXx#) sE^:ؑxq8(8_-v~eK}|myZE EoBJ.t$!v'iwK|eE1> q (N]d1s 4I:·շ 1XOkyXph$5Ag-jgtL=Ň82GX>˜e*a Cf}]~ee'fC2sq tIϢvoY;FX=z {z}/bd78Y"b#;\AޏAޏAAf)~Tw ë7DTwVPNZ$"ukpCJK6[=zhhYV,42cQew-S ډא!.DO^`<1X5RBL)z/CբyӣYŒX?׊aKPwl4]οXݨ6"[y}g  Q;c}_fa~IwҭBy[*>Ӿ [m$^2 sz|a8׹t6LR6ƙ)~L o3{x5{ qu,}¶q&L?""ý˜iA)a1F 7F-s!DxD)nvc]jڍqQ/:1^_(lE'aȏ Fkǃ=_j;W^|a:/XwEmu[27fo޸Ջ w0iۢދ^^moyȍQypVx]l{(,C<%xwgB~s;i/wܵE'"&(-ОvvKpN|L` ƔWC7v.4:F=΅r!t.|Ý }WK/ɣߏx?kUãߣߣߣߣߣߣ_:Eae@zr6cPw_onz/w'@9?yM.#t|; : *G*갗M/.K]GoYl]՞'rWD{X{X3_v{?o7z^r] RˬwYT{ǽ7}}}>|Ļr% ِWK|?(5>*0 VJЍf oy#qŸ&]-B(Vy5)Z*M`̓]r%[FE'#o/,!"(N'S0etm,-3|Oϳ2ZOar_r$ofS^In$!pG|M`GQaI\[Ji6V{oete~2;4 ReNXh\f`LJ`3^ʎGa)'2AOL \)C^w=6^9hJPt넿 ݙﵰ1+i~låv2jZHGø[lۜB/9觏 n% knU/w7iEXRؔc+uM`#{G!HWOJn5N?C1JoM& ѕ>'No،A֝Jc)>aHw5Y r_w2}Jݭ?N-=%gOHnN׼>$ڿ دXH2+VcwNkI Ģflh'x *U`~"'U5VMڗ\ %+ﰺR Fo2,* , Ix zȉ,lan T )x gʹ#ZN4Qh ѻ+ {W t )9M5_uvQJ)ڭVv*-gUtFWyJm=]y)={{[򻜏2U_W;fU}v-Y$4@6;ٜHڬ՞^%[.p xHg^ms`9\$xydIuKyeM/PϢ/x7Zp&\wXr&ߖˏ\Q(C_ ?^x'~ϵڋ 7uNzQu{/rb-KΩ;. V-%5-N^GӏkVv=+XN?jtB)|t[AO{tx$v̫ [\7>?^@m ^@m4 ǃ3[XDžn|7MSoj2';{RKEh~WE % m)/hEh/AY{u?0P,xNQÊ;]N=5;z[ s5:Tk/rZ]ϢvTY7ЉGVTi&"( 4hs#,  5NJh-E<|UvSm}v7N\|F 3K2UN\[0}G$ލ/? $ng\MUխNSz5o^.#JR@e很S J@2>RWЦr{ "%I& p McZ7b ?W,uۺo0^xSQ2 =?wqe/1z>Ϣ%2]DΧ\Ͻ)/ޡzf^7~s Qa=l>N2d}>G^hco!␗cۯj᫚%PqMؖlڄ];nӚOIlv vWf+tKY !& bY/8HҠpУs =Xt%1CW:y(  9uB՟"rC9M4@B{.8O9 >I-7D t7;:;Hсp g+5j$/ ujy*V\JU@1(Ym{s>%oΎ˴x 0כ02ɺOGMBߪfb<6~ƪ 'ou:5س"?IfP8a.sp3 Œ xҜ25Vi $=)y`+TXmo9vhD h "GՑBUlWrɉ\ҤU&ʘ<է)%ftFcv9|ٌz8-cµ 4w!huz߷ޮ-!KµYB-]\*%d*Voudo)Sn3Z% 8X$,ؕ~ϸv]G״*2yql8aI7srW$FsU֌Ȓ&gSߥ3IZg>)ΘvܩՔ玿&t9ϮDv) `l>FN@xQЁ\&oKIӫ鍱zg kl$jF^t+D2bX`n=F=1'.2nDx3ѣ3яv&zg[3w`ϼ+Ly~]!vd]!Il8y'?de=>z3R?7 ɟC&y$s|Shvݵvl,yƾ]4?Ufɴ!*Tѕ*Kx]V•oM$%1nu9wF 7h,;ڇ#KB#OcKcojG:mk{0Qg|d=ϡ%Gp{:jC>:eRߖ$~t([/,p}Q (Z fž` *O΄=JdUdgIţT\ybxL)WFr<&ݼnޝln^ xz7[ q,3>=?YC#_CF=,iT{EOB [%/WY%/'gx  ; ;y䁄Jn"Tr P0<5ubtձևϑ~=ϠqH!0H2.p%H\Kd=ʿYb-wzwjc*`oe¿>|Y0}g\W <P_5{n?Xv6mhn=_ yG=t\!C+%V[Hw?1CѺޟ"r^ <-ZE ޒ{ ɏުo%~C5w_k^?~bH/#xaW70!]z_wz/ZpWM~@߯7ec@i>wO#eG=Jy[!w###lFs7mᬸQ7#Gٴ2}oX .lpK)T}%S ez@w0|2@\u ԡH$ZPbsΙr߬t-5= ]ꯂ^$gH^pr:gpK Ynk T} Ns1q"?l(pik+he :DQmOoA"^km5WFSNU.!Ki0t65ܥJ 뇅M!!%) qpSaN/ `HYWSM <3?ڻ0v`+2)WPb@l`Gkxr nt}v;RAvkX춚mO{/tlq~-'H䳃t*0('dzѵ<[ȓPii|%LOu|ã(v;ԍuZB⪈{0c9g4kx|p;T>*|8s㯓\5GJB1R} l:V$fOHP8! eC;.@* q.֊v*`2u4mM?,?5O LVRֶT-Rmbn!b|־?# dq)S/fI 52ȰSg22&ߊFe8GX zBv^nFC}8T5aKIi6" XpzopQ/+^ /n&!h'0KIJ0¡m7R'/E&~ɠ12JOSj5hSgYޘOC$Nd ߼BӇI/քp 厹0eFcu:AGh+ .,#{9`g_/:X¿(ߏIK!bF5#*G!A+m~|c' Q6cbG_$;`5qxA܉8J_80{' N?Vs\Q* _~?䢀U`%:4f$Tx%C#BZ2DKQ'Ea$': DwPg[ D.i%o?ݠF튒vp90i/x:;Hހ\%9}2&apָSUe*Pn%4\#1Xg󉓐 -?ήh_>6re+^$63SD%~/srtT1\4MžX^^U C,zcDF^S8L PF قs{w0*KO7ʎK #K\ M8s$&뤱 ”@Y\ \+T .gs8ϦHЦV{&|]}-RT 7Jv;iBnY\)c8 ]\+  H+l0m;`1T ,KgW/4@;c7]nu__Yۨ LMd8tb9 X=,$tlՠ_ oP:3NQ+h dy TtfJw1F"9,靦rN:eìVcfox^>gR/€t+2FOq''+nz8?>'S/s"dK̓ޗ#hqw2gOޗ(7vr^1}h7̏%,b{ ӏ[Wd[\$L-˔^zĩYTUR {ٲbMm4_셛rXZ* s%*g ޖ<`q}%y u=KiU3dp6U"+ $6!+4!_TSB265;g܎|y|vI:v2$H^Vtkk$FU)a8XD %Tj;;7GqƖQ(4K" $tҖ wgeTXݛ((3>| xX(GHb-Z)Wn`#5$GDAӫ HIq=wo]^nY^r.;~^ !5VT=G9 U2C7NJO?[97>C ` C3[N]jb%z =3/iM^>4;aǗ22iqSvQXo'ʁ/ŋ"bfـٱ;?=u\TVH)/2X*iPp:O*%iunuvO"^^[KǼϞ},fW[Ts ]Ht?tpGYχ{5ہDBZ5v꾭mq b0^QSn R7bC&*.=^n-)lqt!uH}:Rx#0'Ł;ihԓޑj}n-dĮ̇q"M?.M'z-S\)OoŰJ!o+5yOMdX+R \!l2|N?`?L: (=&)Ѩ O S'ol$z&![BIT| }aU~B㩰85FE`- o œoYܟf=+p9-oK~Gcd K| 2R)OA|U}/%TrE>a$at~&g_ DuP$P .l`1_n6L^āpG<-t+Xn]]Z| Q즉n438VT @H1H7Tk#WT`./Q%0h` -n޹TVƖ#I_Q#09By8t44pv J'=edXL!е;:EݡB iwR.ޥ@Ύ$DF>jݕZ} vNӅ ۧP܂J=yp9uNWy%.o;{[ 7${e}eK`QmՠH~nt䗼&--pf_goHClY[[*%QPI ̝-$\\YL_#Qz!(?E pi.eO꾆O];aU\vP/iju>kLf6lڑ:UҋBZ֦c1v}ϲCއT̎Sknzƹ"&IHÛhڡ暺raiЩj7uH9D8fj嶩r%ҥ JC1 }sRxABC#i 0,BUkK\ oۤ9hg:o1p}iH!h&n%Qio5&dN;DkҮmN5PSpqJ*nu>+#8їxIN@A+*eHRcm~3m!tl Hf<9 7:#4#UX$W>I8'kpX>t/X_<ܫJQ0ي$v6 w"*jډI.Rj zAs'Y۸';6q,ڙN] kn]:/pNc=Chi]+S3 !|%9{L_~p[^??E~gʬM ͬ¦1c'ɏ-tpO0}@u+5E|_;[ ~4<|7P›0 /C 5e_15uJc ?* Ycy7qnG ,bpD5 p] y+cbp`cb4⭤+FO ˴LB2"T`!e:KWėe:+ذ"!GI|@Ԝ|}"c2bS2<b"*νsTvId q*]{%<-vc9˅pAli0݂2聮GqjX1G#hZ ʋ CS -WN=ql nmd0L^[ 2eD%Mf{J9erQ*ω-.DFЩČ/=X,㈡[X-C'Nt=vsoN=r^b޴XC.Έ,%Hb pHP?XbFbgB )`Db)^ o-'1(9Z !,BNa7sßs8N]*`MʓI]d )+CXcvNA)$&"F:F"^o-C}X?!ȃixݽpX@m YfC@)uؠ.Z5L_Ex/~_IB~\|Q4a] Pm?\?a9;Qה6r3e=mRaސ >(N #@A-b$%K!o,Dx?Z #z^yhG!^0b@ЀN`G59?/g7t|K8/Y?~`.HKJ_3I1eaMWu$m?^bA*"TGb/L ~_<= tQAn[~z?8fsA+Uu0HB] N;9j&\ɭvWy^ /˻MoIpNYYda {2R}#fU/<@*2-D7 V rX6xKMx+OZܓ4V+ߠCh;+xHW͚w|y3sh 05RXQNƠ_\h*Y) \ vAEc#5t-I2)$f5]MbUxxnŪjVWvز/ЅMz ؟ 78YcJO'r $n9W>۱(籼U2km ST#-2Eh`wu@OxLIպX^#r7 hF97{nƞ-bETVҹ7CaU@}Qa< )$yt>ե5L`)R1{6cHndILC9< S)x?#gA$e_VAZO9a|/QmY6+v!?bBBOBW@_ SWl,Wq,<$ũ:֜v pdtw?Rp|INnB:9{o.6J}8aJj%_',+OHJ-pŧD[NCQ5_B4DžܹA6!O,* `SZJ\:#&T J'TQM A`RNxk:Sf.Q..i5tzGI=k[8Jf%H")BFJWPJ4(mqT;6.}Y?Q>yr=;h#U.p^hصh 8唹yi$:m?kg=NNk@_v5L_4j֏ֳ;^n1Glp?O lI~$EMYT!=&Њsz^1P\`<aHEQ}P.VDgǻ*A#ܵ'RECnRp0kF1+Y2xCK1֊&^|dc \bY*@p+ҩNUvI2okBU.^Q@7DorbFp~X[n0 +˪R[ZI 8ؖ1eOPӏ񹹃a!z0|P*$ Ə(CX]X+`+Ԟ/y>o% =@4/T䊮x󆎯\ƸĘ\Kz]|~Xᜱ>K.K<3AI{yƌ֟^*Kx*CO7q\d4m/qV@su0H(IT*ArE|8+|?َ_9>fjEGVooxkHO>IATmSQ:x:`W?).`kro!|?v%p6H N?Qtg58Nג}<XN\ɻ2ez=|(y$%s,d5*[.[;=z?+ (.^=X8k .&Y~*,`T>,(B(!D!5\<4(KKZD|$'$TGXyD_6 J4_̗UN(ȥC gK$ x_7,-u>bL}v 0qP&"NlIZ>SE5ږ:@"l~<Fw9Xz2^nR}{ti윙]Bs] cN=9|+ ,!lCBQ&zIL5ԫ916vZK9>>19HK~AAI&z&d=݄7PKz5go=;bB5PU sE0+2Iĭ`0B">PGɖP4>`E,§ZA`4?`:I};k ]g,Eh[%VaDdp%Pl).72-T~W3~@}3]D~bio[ ʈp<R3ɧ?.ɂ&6}5BR@-_>gM_ @ 2 C(&Xb,c:W>"+;4ݴ@drZiٔLb{zDxHKJV~SzJ.e̒PtB$v.8.A›Z4o<Qwf_!.+hCm/bh ji .peo&Ep%mkFӑ'FNj vi ƎӹDzK_7ft9OZ%uȷV $ mB!Y I O.'_yp_URj\S}꩟+PK.y ;y CjW VB,.=|)Ke]3r$).0sgN>)HRwE;n$P=T>N/lb[W):u_.  p1 >g"l4)L&ӳ̱zMBfEi0+li@ЯAMOLՔ2 NF"^ڮ5C)ⱀ}QR(mQ ;=/``UMj*d9|zȝ,x5הBmz[f1kcʮTl2nq^9E<͢(:@xD_|өq|H]L;0g ;d%)6ArT$~nEXQ:uE  i裢[e` NVd:2X+=?g՚{3\]З. |7nm[mܺWܺA2zt?Nf:US>.oӗǛQL,o0. ?oěƄQxn'um(Z bDX5Fi-LW]fRwC@6b@5PGmDvM8t ѕD x]'5}~3tIuw#@]A"G!JGzW(܉V݊f蒔F.FQU쬽G੭D77^V{=q&5ZdƎm`~Sڋ?gj-MPdN@7dki20QjwW5z5TMQ@YV< "Ax+0tRysd![xY^"xt D.(5 h G1[ zˡ1nS<ֶ7Ӑ ƇeMި5M2)*L^0Yѩ*qN{t"U,t/" 8D2px΅ ]ttk{9'^OrXgMJ~BF[{'B6 , n ?O./ BRZ20g8zU0Ozr1vܢG)L$Ob'Wm$PӱWz64E@ 8,䛁 - zg{E͘D`ZAp+ZDE#r}\r<‚ Y1!2[խ}uA*Yo;ۃL_.r#wnDy%Z-nHݏr/be/~{Q$?Cqxq&1E0!ݸ0SbWт% ^UynKWLaѻg/k/pKtwʉ0:3%Ӕas+8/rH֭_KneaYªNXVv f k/d 3⧌^Fr$ꪬh7"d) jRJ%/hF,HȠ{)y:NJGJFF:~F7~+uX"pP~(=H@|aQ#fDAF;%ÌDEmPYY{-teQ2+;|ǐνPQPb>7?pOb1FŸ >HӒ[zОE⃢1,UU|PW~_wxHK2]3jN?b6zǧ ̱-'r=j#ՠ+ۣ)kzwdd>jYe, !C&&CԀ.|>ؓ n5Q3 0]әO(0LKH0I:> j\?Lyz#n*a2c,Ku'o?zc|J~JfrlfJN|OG8A'pcAKNN{'vsNAŝ|= h<4=^/CrjHG/| SбnBvSYWO|irW~z2fO&kr1Vt#:[T!3gkx0oA'yE+{; TSu.B `\tF,d}zFRPx.kK ȡ.^up0$阥 =?z^Rh"c t7auFϞ=N,1 dƄٺ4m~.UNu%Ѐ rt>x"LJ`J%Q\=Ly'C8uLe :cn`#`%^ #D6ÁpXRKi2Sk+PBI.0lT#Xh/60C7S=ehiX%Mf>v`K<.%ۋqj{O;@'OptK2I%1<:5 { <96ŀ+\? knX7ׂ,Y,!'ryf&\OҊv' rAwѬh3khB<`/iDv'it['=Sys-u`֩o_]b03cd3VӀӆSbKXO>/\A2X;P_O[R+ )  VTl '0l;JNwͣAk=rQ91:gRjS{pmN<ʡ]ڪd|q6J9H'v7yUq*1vs̤*Sګ.Sbmj좱!n*S9X~j.W o] Xx9N'>ZJsKv9I^pμm. ұpƃq 6 a08i* aQd W뙠60W3φr=%V3j9pA͎328#ЖcNOyVw?Eܞgira}5^@z|/|bYLܜ^">?h쾆Nv'jHt4k&,ʕȇՔ=z ?eݵ I<+L̳)^$3dxXRêӾqO.G9^50R"o@Wxq}u7&r'S!M2trY~^n4m_D`<_23aan*[V-͑g:4ŖKv!p|<VT'!7|$֯pphNxMH]BPfa{ 4!xNP0?]aewCxFOVCa[^M' n<3M`mQ,g蹔/@`=}uhPaA L!f`l0prSzx}qg3d,vVH8hh Cح^~h4(XiW.'CP$ffQm̝<1L,JELdӭRI%v=LT-+G40|Zq$V01{A"'bf3lt&1@6!1|ߋ5̈ӯJYWvƋf1f*|uz 00DY p:#Sƞj9A`lz}?k2L12|BOF&SXv ±|g6}Sѣ $ma(8v>91Ͽ ="Zj=:I`5RO}ù꯯ɳH'е"ECWk¶u yY#@ DXs) }Q2>Ƃ{o L=]!@B&G*~}RXf*^.ek{n/zAK_Nz7uى:Z9rR M+JFY}VNnn*s5Mɛ5x`w('ʡYW[4Vaota[Pt4vwowog npRxe{ ǟ@&?_KY[˜P4HI3 ̀i=? ޴{Ic_Ia/Uwt4'kO]#P]Sgt:w>+Yԛs$O|2v;B7ρ\:!d_<7H&7a@o7ay41F~NZC洸BG\*HOy4:!M`Np<zqOC$Uv_%+IZ+'o06ж u:}$GݗtRNt`⪿Bkxv0Yeku'~}t 4h~Ypxo鵬m(=9X?cJmH5{$$&gTM5S'+VzQhT#]?qljDA$ɹknT 7 $<=_Ae#Dޫ)IQ2hv,ZC볩. QFs>߱r'˘QXzwt?(>d\.Rzנ~Jd2F4IE UX@t1d+jf w.ݨ}35iIpw}zz?ۃQ;q{vltM.x 0G;өFI@h!zMtW7Ұiyafv(6iH,"%G)d.'(~<x!sY|a>݁gǠ=T*xwRǺiѡTd>7YS;Fϙ̽my0R6^FAJ̞d#6Ɏkm8FQf#.F tKnwgkkK)Rce [ф 꿩WF 'ѹi -+FU>%a-TLԹfl>Mܯ vIxyÆ'BfѵLvQΔK=ʦ[j]%ↅsb &! \ScXIwsIX!6١3 kҾ>*h]QfVu5R>VJ'z $4/bHĴ&((I׺ &}Lh}VURV#E otT98з:R[Gb>(`q8+Ho`f`,!^\܃qh%R q^Iέ`: MoY!Q'9`+3MlkW QybKVhG{,b S=Q^} B2 ͧ{Zl%pWj]X`q\ڋ~Ѓn"yPMTs>-@=8 1#2LnV00MDD6k:,;GnM\ *=2 ґ;z#9۝(,B[G5T7RvYxXO?[pw:H{6Չ{'0g5}vw񙦬LVD%"> Jy(O'xC )\Z`%3x)9't/,a~qE6,'GE)b54-Hds3:ZLO[}iG4i\1AԏCk'15i(#μYS*;6ު(PXR rGo/m9XRD^( Mao_M}EW) Ѫ+Qq̌Q?}&odm6OAa?ey(Ʒ^f9p ĴcK9"J^\dKydv^>:KS,a4`y+6r/zY=2G" yTeMvSҸC%SA^ŷ3XBefܶl9U^x>U|Yq}bS:[>IFGUR>-tFCV=%fW:NDˀv[L$K }8q_ ,؃>x5N Rh; 2!S-çtK& 8'SUYmd<_ݿhQ5AR"%rƪ;.V}Hj(x Mr3#[ԿLz~+qe@/Io0‹'0 ӈ xD0J=J|Ew 9`:\s~zOnh?3ڊxՓH7Ԧ',JMd9֣ҸDKLJ{kt5 CckX+b85:"*fI:85Zv"85zBAyTV©#b bx Vh)-.ТxM^;~Fo\x_ˬZbgU~&>Gga?NM}oj~=~Eqz龯 @w? z׳@ NHz AHOk Y* Vwq `~ɼ d'mkt;sHdy1luS}U_W5.U3Jj+#T?W2''tٺc ؏ ll(-^}#KJf(IIW9E2 &z+d },U"nߵ$?_QY= Eo#TC)$:dc3,V 6z 4tu|5Bt,U:vh61v;)ݯ5wj]]q36@Bs6c'; ng`2hh A^@v<5:TQ%t{fX!Q|;Yѕ'D$;IvYb1〖,1;%ĬfVT+:PEkcV$#ˎlS԰zxVg2ue_UFrߡЍ S>e%+$[ 8‹\f fI9='iv N#kb'$f@ &yYu%@+8qƉ6ڦl\U>{|fqyp5cp*+eokԴǸ;2c!qga^{mk+"̻֒ndkν':|v6ޛm=&ux;ĵAP$ɸsyBiMO3"?l }G 8x!"m:Zwm=~ /,Rnlh|rWu_&qh._`|M-oB5!T+IWw+5 zYyBHh f2 + 6qq[|L6D T2p Z+֨&ĠRYV"bq02 oEIΧ-c D_XE,P{0:IT+9nՒm{vCCmG)~R}B/c-_[mkf>KhmC\r;.z`^z_GLoXqK:^s{_³ր׬k5A,gӢʀ'VdQ@`=hBHkf/$k5藿&b*fLm6B5Љ҉ݒ015bLzDez'83!6ͼG7CymCVS׆1ɻܜ\׾%{BG"1M#7̭#@09ZzwSc2f%bi먹#ĩ.`__NbČy?t Ħ<Mzy{GM?bF?lQl7 g>]tȝsGGŃD6Sm辍}',W7V_LI4W"(q\D*MhTJ&ʗzG2!."Qe2F}@ac+ eMnY<67(cuסFAdhr~/ſww젺ll6#7a0 r孪>oR4@Cds铓ug5ǚ|VjNbs.* ϙdv3Uq](hQi SD]\Ne:T"dN ړVm6U/umv3Ler#'B+O_@!(aP-{-TĄ-Ah$`9{pUΞx*o j>pY-W-@tÔ?bp x%5^eNLl˾0[Tbӟ)8z^:P^BWxCt>-{,|cQXG clGag9zXt,Yz弄P߲׫#wEvx%gךkkMQX=|*#WrվOB.o'so"BkFAs0TԁKMUrb$Ւb)ۡKTcUS՘1MpKOxJV$v45Y[&exg[r .%Ә 6=}-D;p|88[h@u<(UMo'\*_S^P>p9{~|P~nٗa g,i-WÎO[ B!'GS~k܁p9yj5|,x)3N-)1ÎrB3-jWrӾtJ;t\zq֥*E8)}a~E{%Wr-Ƀab_\Dx/RJO=,Ҕ ӻEWz1}9O+۟UKT1T@^ީ 9̇6_5^Nw٩w’!vjW$'aW6i&UdUei޴SA,c͍>_0nCp<#s9T_.{T&ZYkF\+S0_$cHTjiϵPφhl l ?pz{{v{e8iF9ٯ7Wփ9{ovWN>3J+|BbBbBBcQTTO"J6c6UYf$ABڱzʔ3KoD:E+_~YNK~O37[̅^G^o$@dCf}N}>)MsCYKP2 m3 TXlBPU꺌LbDT#T$5/rG$D=!-#ҜEzdzUuplqO @`f76^1[o2 n+iOi Qp?0#9 Wj 7&ݩ,bлvSzI}'Fujeo~Y"gBwxy6郜e >"hlGu)޿^ޟK1q`~$ +ڑFP[MIҁ6w0&&mR|E=G|,5UU0!_PwUZٴpbT 9$lC#/1tnEJ&nR{plC';]\Nu$c.wj6G2 HN[mٿѝ; WV:ã;vM2==c>E2(Y7,62TWpħd;H8wZ%cP 3C xzfxQBh<: >ͧ!b %)c&ӃxownY 1g@rk=ڀ&`,&WHH8iiSQtR{8?XtN &V?eKݵ4( 1:8(g iǭZ[<$?m6O*KyA;d(3qWMɰ!f#ԅƣkHCHInF_sK}wiΫW>Vs50f"&zrVw D.vms~7b *fs&r|%tyB('ʛ )'+*vN*;ZQ[GTtLzi&@:% ؙhnq@aIvK1 bhۧPBzIv7ӲJЄ:}>dET)Vd@k-6-:nI<#ath'9]tfm ay1j]tor#7Pt^" ]2'hqbf:O "K@ .ZBQbw9B[8]ѥ+jF>JrM[Y$LcJaauH+E=p,&)Cn`Lfjl:1Hw=7)spW3l񁩾 I`c)Ëϸؗ$#Mi[gM/^:B M<@< A$Ɏ4d'eNɓJr~)'bg}Bw)FiqbP'W[aʨ%rFQ)Nm6> Ե1.㣗JdYIzucd%i)hP? ~3fBf;LZ pPUtT~{cJsQ8HRF^8TW{zB%֩^w jLT FI/ENF"eLȲiEvHC%A3Qdp"\R]+ F~;ߜ (~[+mb `c#7/EqF9.z՟=?]DqڍO,Y]F[gO>}֚KXQ5L.Ji*9*4髴 $RHZf8DU1ك8Z9K sI"A4t^*b3jH Ậʅ|əyw7Kبu3F"ë1 owLefM#6<߃y NT4ES"\ 5k kJ1Uظ%U< UxOĭ#p>Z}e!V2٤a!BY꜕rZj0H;sMǙ*N%בvK-fn Τ`6 R`Sf웪T,e(3'ŢZ~kt^ٳ)君bޮ衳5p+~9UCu#dT BN OG}pW8ôL ?\n hc?pT* ZHM5)Suim:B0T(>Ӟ@:X 5 jbA^ǎ|bw>]>KH;]0Ӯn7ԁ5qG32fTу}GZAul:6bCx ̜NxSF պuoO ]{F݌}O 8O\ؒPnr+]Xk[Erx_37Sd6ͦoi+6AG`:lZ h3qIR&΁Dg/aƦ4!5":\ v =8ub(Ј\Q8N-Hu8E#  M ke7,zڏ} U! EEyQzIc6%fݠj7! KL]P5r>(iS;;)2fN@۴ ZiX7:BDM~)Gv&6^> bJE/*VNou/zex \*Xgxq)&E%?Tf 9-_³vXfΝ:ހK'}["q?Ȏ]rFn  %=z‹h)#̀ 8N|u[("su6p%+\ c< cU4=C9/npBCԲX{b`ٛR0FqIknqm6ŀ G,Z!4 ߅tXNqe8)ButdT+[Su*[P2ԭv143V/@Lr:lV<]gs毜AL{CcD''ͩ"zr M+"Sxv)G"Sq=41r[j XC_F:0*QZĝL !r7>q"KKHDDz2^e#Tm}gr} iնݧ{}T {1 `ٯ1Bh7 V#XBPK 0;y0X͠P2`: RbbfFEw=0 z09XaՈ1FB X˄w; Nr}=%5Hd7jV3B0D ǁ '`E%Ӕ L?EDNd 2`ЛCCdO9_r?57g'*Ǒ|)+|'GC/%0.%RRtBO0=P>lnbjX$8RM l1 &zbPN`(=eY-W(oaI.*{=V1 V`trVތ>}lV=WENAJ172ul[8e:${{YR=ݩf%S9uiR^:nRT6ԄrYPyUVT P_6n.a:l^\ Q1CccY/c= #9g? ~:U6JR-QMoJ-VGږWGj,QWuBq$)e;aI 3L yĆ $gi~O,#!||ZжtSns&nC1Jmzè.?1Zax@,p/5cwV˫귐x[KkYs`RZ)\ '1U>hr^| B2P4lOZo}oaצϜ~5f3eR2Iӭ֩C{VPP~_NP&]<*2MO --Lgs^ף wr%)R` ָ&,v)k:;_7b1ZT;çXrB 9uzh& ͜1#[RkokM!,f-8Gth+|T|=H6C()"vr_K }^-%F/ cCVjL7-!b # RiJDH]C\zֵ5П,3K$J?lJP5/l 6nضIoF?F}˅V3/ybjfVӚqx(ze~9@N,XDԂfp"`EGBg9h0mь>-Ut˧ 4*'$yTz @ObxhLhV-yF[%ie~IRo}J0x.p-n(sfE2Y8Wȿ+-m7!4ރ F}[M{wYmヌԸX/,瑥?=cЪ NҞt@z$K?u@+dpAa z aXVr8{EecѸ_D= @vfw5M{c.,uK,è?WmPjd5o!],Cb_93B3Wcta (XD6!bgl"6Id ? %O= +Rct7 -u9 p\D<<Ѕ5{gZuBo4R(Q}Z]UZWB-4{^PWf+O8`6E<'"dT2D6/>8w\,tuv엑YYCÒ5 L_ߑ~׽^~GS/uGyw?LuuNPa0#XEs5e8_CӍ_UHr$C^Sa Ʃ, B9R)ET2)%V*#%DJL5D==bK@׀?$<;!vy% KcfbhN.e//)`l.ѱ.HJLspC~xGGnYFŠ@‹zh //iǝ|q1ƭ snxSMpHyʼ U \{ûb*5J0kGJxU)PhJ6xhGUqW8|fy+i1<Ĥ!&^ ~)Cc@ gBssD=XcAc=?BJfԐu&M@,=˟UM0 1;⅘ zכTp¦R8+V^Vw~| rL`Kt gS^CL_zEvYטksfISz~;4 6 X^5~Kg)Lsqy VЧT´ԛ^'\_+ ԇgx$Z̭GgIIX'>tw_( d=l7M)$@^Cy R}Iőa|?R_.{Kz%/}0_qjIo2('|QY~XTi i8c[.c40]Vo Ap#tqvk#NXJ`98 2 "mH-׈lQ8XQl1Tj$Ft1/{=<ȫ1B+ hW' +X>cT`s uz,`D`ZD3A(X`0` + 0I^,\GPj{c3CD&>7 }J+H%(]SwC"6"G]A?saC 5}X AZkV'6M_.N>c+o&DwK`'yS'2*AIX E_-C t$RnhYFh^Ԟ??bp>kKl5YGRo=ݴ󯩠P {I'HG?G{Ng|"4=aG3dlz1"ᵳDӢO4#I(EEHJ`,w lnI7L`f ڈ#X\{a>u>5Nff{u:i@:,h -3ig4iʓ370) O)oSj30oY-?^`ή?gԊƒ A#TLj`eCc~eO`*߻i]c&2 ZԜݤǭtL12zuԋz YT$_G]4 p,Cѧw=3! o7e$zL(-ޜREws䠄Uug[~/ {b>67pS!(H(KZN'_*ȓ1+hB_W@*}2p '́Gp;*H7!|d !dr1KpΟ`E`$̋[B+<^1Q^0Eix 6 P&2-5lT:1M(.&,KZ$ z}^ANcV**)蛴9:H5 J^H,U1K1Kt#h.XȒD2mad)HWKvR9PotKa)QK<^|S.d{%J݋gʸD+^x4 BewǽXM @?^dR <=_K3B`QY^{B}\},D9,Ҹf$4NNfV?Ѥ×8MIa1NI~SHdNI()YISzJ΍u)ړe$bCA:B>Bnﱛk37'pDG@$D8GCFt$HɂI^G^-9Q\ `\$$)`7Con+. dVvQ|ֺݵi q{u_\K<=4*f7d>T\ \"NZY}?<ZecA[u-̺͈u+XLjcD1 ĈT49+đϦŹ\C./N_麩cL'&U'XNTd.`D\˔>af*T n~.)L jC6ϼMt\"3)R*2aE P!9u8E zw"kRdqǨpܩ=l<0+peoN+%ɥCrrJdcZ pR>x%Hb0V틥gwJq(/QvQ{5Nr-m(R ^|oQv4Eh6p-]|3 DXOdJ΀qqjԳFfQ:Կ ЃB?ſXb$3_|Qg<Ѓ}tث&_!r )qw78Q"UvNi[8MWo-,D=s2a(c_t &;0'6DD?~dX+"8~!DE>]'ı`:Z%':4K-P*Rć^iLH7SIaK$3xsotD1De) 2(Vo2JMTcBWYLwr2=(?fę2qP%o" TBD^0DZ蚐1 KP@o6j0ӯƤ3]ёO7}$g] Ldo|#J%q]̭gg;Nh@9 xNnp^a9e)<.+qhSSMV)VD?i+`u ڎuC מ>ajާpA=s=röc܅9TqoPEtb_N8<$7P2$%>8im}+, %džOD>rx3f?Ö@[ ^k ^^g?xOx )gy@*T ߬9C!

?vlg 4tn:lZ 3q߯R&Ё -9632ɗA+Lj 5":ԉ4v ]7ub(F\b8N-Hu >/0#,Lznac{% hNx_R#nWaSlHjh%zPST]=}"!r[XL麢G*;މ OTd*S M$J~a IYsZq"!KZuKhV-tœx6= ٖЦWړnNO^5I'mژmŀ5fS@yf:,` @)5à/W6">Q`5stfTChq|JԨnW5Hfạ`=B^i ti_i59-F1D ¸y6 "@":"d@BJW!4R$(20]>ezP_`ЗlKosht| wSܔXbU"*b*qX0@{bgqM=Mϕ>.K>5梐SIŷ-22Xi(Q At+t‹F|N "p`Y zq+t\IvZ{S#U1`Wt; rLYRIQ70reCkEZR(X@M|$7>b:{q1DE6 3 %70dtjdat lNnCaVXIH :)]S%Pr;dq#6 :^nPpq4Xi$qs: sD.J/Pn6=3naj54`jh|^-6ܩ8H: !5F+0 vcP ѠYiҿq+nc;{_# 2YN>CB88i)cVP+ X: V{ o> Ei.L ߢーnkZ /!CgbÈnw:eA|qz?;r*G~?p$T`x%6h I2\\L;Xmi䃗%0zUĒ$xݨʈ g_uE9 g.u)%bi0M_, *8)!$U a(gRDwQsx]"mV]38Eek'_TPU­Hx, *hǮe*omPTC]Mg;7ZxS Pd*1Q>YnCjkXaa!PYYmP U!# \\Yڐ#t`Ȃcġ`5LL$e lua)B H3dUX0Nɻm .0%Dvy'*j<upأUh=15.?qMͺdfU܉Ł'wqN.m"7{ wuwݚëFp` :0EȲV9 Ht?)INt554G2Snx-ıC\Ln O[Љ,՜]чhu&h3@EC~9/5_A-ڬ;CCp *K YǘNJW6g(Flty"BŖ($LY8Jkq@loӑcqJ*dN}k6Ie 9 0]W E>ư 5]9zFt=5 8ư8my[fuhQFem>iLؓR*)^?ŲbS9fo5 @\_q3 3g&•MH{1W.e,c%H mvޛL[@ 1f'1:g_izO7˧zy{X 6#of1Zea޶XEq^RovJx5(.(qufağz2mNio8~o3;Vi sH:'6j~7?ÅүYj7x¨AG؎HFx˛٩$O"&LxQFE nS%}'h=+E1楻bQ5CnfX2G`,~GWռϞ?<Ƌ+ T:BPoI`aFKPvtpL Jv4{9AKx&epƹMwB'bD'Ng&a2){k/]GxGE$, 63HǞtp(}>-6vyALybsq0LvA2Wd[PÃ7?:p _ϝN4*<^ ? E0PtxyI?,p1nh% e_j*\AP.ZaY}1euf5ۣs^s`Y6ͪ(4$xn3/k*8hya*F?-X6QC$ƛȄM4tyDMDC2p 'gBus1D=XcAc=?!VTB+gi6o=B??t*Ig8\aK*&Oy`{/;{^|\@E H}&%qt[ 12'SݔxF16F&^4kD>R;@> Nh2D,(>NFCi>WHj[<o7g (d>l@7My)8@^y R}I1a|?fR@F`.< Kz%/}0◈ `ŁI('|Y~#eTiٝ-1 Hw.7 I GY0PvV- y+C+V͂dA͊b9O堙,3  )\3ݣ pAmyk,Ya \6?\)z;[E˝ uzP.0a0]4;gØQ\h`XY DL贡O#2pc 1cOC'zfY~%BzHMo3R&.~aO\m>>h$|E r+Ahh* ,O3C7&;ܭX zE*seU{ǀӍ-k4k 2>hCq.ikA ?S9ď1wG-9 N^TūXG#֑a0opC1P j]:+y sOЗ~4J|DYΌ.+(9v8M/F%<[4:{&Kn~xOǮqϡ̛ B*1o5wSO,||bS ),C6p>|C!oKBad0uY8쬾ĤafML(>t#,<yG-22eN6q>xs[u˟k.mM(=@JR9x8ćA#\@1ğё?"'Mt[3feF98!DIc1HT0ׁR1R%ڌJVSBS˄Jɕ*ϯÙ{%!Hyt3}ףI)1A^vSNή@f`d`@fnU[;/}JҚ;٪C_`0F͠H(Db,f>ZN'_}bШ@{VL-F4եPEYŤ\}¨O}Va;<2of2[)ZP$[Cc<]1U`]aJ&)mJCaM gٳّ|"Jomux}>P%,іh-0uz9y4^oҶ:KJ*&K#fԨ~P;y?`[GݡŦ"\knfN׊?dfea4KbH acɇ:_~ħČd˞ 8x [Nc llr@6CQznq"߈F^x4 Bewǽ^I)?8^Es =_ K³U#HpKd$qWg(ov5)@`;=oĉ{KB~KU%+ KBpJ`<\xu>7`' R)@Ȭ#,IS:#'4K$+ If>/SI?ɂk@I^ P^9Q@,Y8$Y5W`R+cl@g/ BD أ1-{i93ʬU> gTkGwzj gwvn)~P3k_e~f$jV}lTFYθ.O.mwWw F2(Zk]Z_k]wZ\uku2t]&u0dڮٍlm7C>x4Huı;h=rg߽x1;񿃖ۯ7h*H\\cԹaἙ?m->"^G=g*:Q~4͖MWnDZ!0vkO%/H~pv-l6Che0(SنO bVL2Ng3Dg8=Whkj<*Sg3/xWy pmگvrG:n6 WFF"nGuS'-L[ :8Mpfw7,e*V&#t 딼yͰ͌2[҆;euk"REu&mIcDoNu8 =:Nf ]r${b[7lQJ]G<^:1O8Jg+t ϦgNYq2ZZEzoݹM.g>ޝ;zOЩDsG#pj^4{H`8R(4u C .X; UYwjXҀZR'GqT†\SQCrjǝ3;Ѹs?&K߈$|aNwY(i* aT㚤p3@% {q =bF')lȁ V2ʖtL4wV0hЍmVddXO1"%!Y32-zU/Ғ{XC+ODj 13Y$rPa_@!w!3L )c,7)H%F!8px8F폇#[H9i?TbuujӗSrdR݉'у]tϘۈrv˘ Ϧ'e"د730$hlVJc:s*XuHc}jf4q^V5}\i |&ʮd?8u4MY4-68 m:*: ^?k$ Eo>!x~i_MdOC n Djּ̈́S5/gA㇗gr%F}Bćk6,b%Ǹ -;:ّ@N܉c 5+d#![̓Rd P2#r3_]^ɫ|0bW A^s#oxM9I/0Y&EeV]%d)sLjT11+YJ_@{uI%BaW5 8fH/]u:*wPt2Q4ͫj&1 z ;+t&FƓrN!.WCO/4Z0xӟ_v@[|+xpQsQ<’@SS'Yl)$RsXC/x0su&ۦ/h4بqni*v9ɂDXJotsEfgSsV rhd#_dllh0,4BkqwWj BȱILcH o2`U,Ӷԃe&82A Bu1ˍh% + *6]L'8d"q1+6t3~67Ol:$*I7IFUb^L :bPeL6<.h);oJe m p ͭm98}s=pup]&~ 3:.9 N*Ev3&&Gp? e 4\t(6a`i51 K7OQ;}i|_d!DIbfnzJE;*[%tRnȾx refE:G~ G eؖE!mK"2ۜJ&ؼ_a?a7TæL2 Ap, dT/>:gu||syQA@kUᗂП;P\?k5g\Wм\5s LQ?Ek5s ԯo ?!?s "LlӀ.+\r kI5s\='c*dͅp5mT? tmO@~ƫ)*oOTcp.X5[Xo7u7Z ?:`;PfBP|Am/Yrk^S'YSv(Ź hI,ΈOĩܙ?Bŷ-wr:+y;,X&*gy1蕦$P=9 w^pnͰJA~[6;|3|{? r9AM۾~ul.zDPiS=AЭ_HP]s1PQ]:TTa.ײ$t"~^Г:Tno3P45nmFFUkTtT,,5Ut)TQ1 :UhQA0O;w&~\6iWtYkC;˵Wm"m&F's ͽLXYJrgR=%m:^php_<ȲAiY*R 3!VPp*wC Wtrg9އ"#|sX I D^&pMGѰgp޼h- t~}3>M N[S }hl)V$* G|rZfdFSk&ִMry\|S zCbsG!G7+G["79Uˉ3N?֢">lp8ODAfS1"fs z;}.'}zh:o;pUg5ch)={g'|젳cC⨒/o0EOrjXݧ ƹ`@±:k:lr{fmRB>ĠKZ =roiW#p"q^LS$?3"gxNE}?gvV>9W1vn gB',>d4w΃x&= ;aW]u_ %?B0En ^q.GEM3l f 8]TF 4Z>$[P2.#궶.6?i0єyF.S8Y.L^iЇ.nGhB5A; '/BW71E\|M:;GQ3jȟ*u"6Sʼ蜏xo4 rRNap"7V2޳:u)9` Hr:ک>[-lGXtPƬh5"{=7yoSX!ϩ4nh+#w(0۶ȼOQo掺l]c ?6KI0r@H߳+t5V$ܡ6c=_ w?a885=Nv5|%XOBILZ£4H:"}BnMdO(|h-A @|ݧωvw,3HQ=Ju'@,K.]C]uh2q+Ss8%zSPmT F$rp-8F!a`Dž.ix5k8!!ڜIȝG[y} aۇAaa}dzwb̚&4k6ݩt)|dI>UR%,mRP5W|RkKR@yYDqC?/mG ~2Ov'93/Ym/^}nG:jcڈDm uN3ߦg]veAMo}`<.)Ac/GCkp\G!&+'ӯ;v4 !Vy I(iN+Оbp:] =HP{.ޘ3.r3{I*K$WvzĨמr##$m9R`7>a ca9{]Ƶ;bLޮqt4WSAM W.F;&EԚf\f;FПMXn\2}J63{ L(Lt2&bMg0@/FtPfqs;1 = :oO /--UZ/ykt!pu9A_t.:9F8zx0=Ђrt|\qMYgm?g3tz"G HVcUIIGUAnw0j|s(AiX:p/ *CKY h݃qv6QcW}OG$'dRʐ2E m4&)|r`Y_ƨD41LXU7j<:U:x/"flϑ1p;|W†%x>/KHɞ7m#ikOZso=ʥ×Vc="O`,Z|xa[/;5(^Uu[k ]9vG dI1rz^"%7+\n3oeUNUqgj~0&d2<K0*#BjO5uX{6ݵWͫ*n *~IW-!:/ѹo2?ଢ଼C7xE;ո`0Nؽ9tàL)chxNW}U cyh`k4u)z! AsrK>V,xGAG~Ȩ'~v\-Cp9١x7nmwރOCj<sSTvj"itкËAٽhQ Xmu31~&cͨv([߸/͈)&dxuPר15e2{+'}}/4tRԩm~_x-D뙗.18AxJ޶7=3+T!1cXCG?>lo[Kȵ\/?F c_7[+JZ[5bێcv_uw/;;~>ϳ3t}9?s\'?ޭуuw)lZh K8G|)6r]b'&#Wk ʔOnCb],,߱F4tt(z޺.$˅N<=M5ݾdڍ޶ :]@C[ ;m֐l+ʎ])7quDM֋yQeϞzdkkGy b-(n9騎4dn08>RTl'>ÉX9S޺Au6na>kL'eD:NGYBF[dJ % dl4wF٨v6g#"w]u5w]KBk[NjWs"*/:+ X'Jql;Ǚ쇰?m (Rcchu.¶2'uִ&H]35bیAyDر(}h(9uSF@z4#ӈfrw ߠyE5^)f=}悧IR}"QKc9Lg&ZCbǛz59e,0n'8A[7P q^7H+^wT?7ߺjZGNͦ8)tދn%*N5u#K$>J֊/-ѻBұ>zDDcII}¢*g_ўZDV)UXfxUw|gdMXy7hb|!A%ȶ .B酗m: \r s"7 _ף#ڢKYSD|*mJ@ѷb֡g8Na T>_p HZ%~^:(/gT8 &taljԑOvGNFnu@4O {4Z(@:,s~MLiMxtu`I>Ooq5FҸg?Yn2jP K86qHL 3H7 vw g-Aw9yP ./ƭJ/qwyy@<>}[=뾇|\q'~>:~MUw$ꈈwE5گ6Qtq"I99$FoUe/%"z_w[>cLtCIzI lQV}X}`}Ayi[][$>!A\}{?0d0zm+U/XlX`KgB'Ed]UhB"8]=:u*,N@"\Ҝ[^wɻEPPEWZFb1Qs#]-<7\H7܊%?-%$dɈȗ(Xf_R C_C=˿^?/?e|X?r럏Omc}Yo'']Ydw>?·Jg}_鈤qb~;oHۉD}o% xoկ.|Pule_!2}#kw_x r|D.ќ6$r Cb>U1,#Hu$Eu҂xez] ^`WCJ KV TC)%p`C2( -C e MG  GUi|#s.3!],+nXZⳅ}Mнt*S̒UXAt$` S$47jT'QzA㔇r,3XVtsqQg^ғqK- Dg.O34˝;9~+V!ϤU #4M 犯WWG3cY0DsӪTgT!6+ 4g.5RZ8Ba>{Ӱ5U<<''o*Rɸ2qnĚF3$~R:HX!s(;0RUN3?Q7xM{B뇾3jq7 ~ѧ$AiQG˽wf>Y1.lZȘ&Rv }-ustza+9+%w3fӉyYTˇ+ LG&F^/ <xNpA\3bn_m |P=Ƃ(^*Sc6Na;ǨutO>%JZތP$oQ9! kB1qdAӡ ␮Wk(#YNiٰf^Gh-u!E:U3E&ZhBeU5wSI(g.#"eOXxS'51 ʚŅw`ap$G !eA" BO$2 1yGqQ8 JɬCRl)"6E ɡEugk7UZ&1/隳L!@8N^.Ve*C*R-Vwy| ˕n;Jlj2kVTabЭu݂[Gں_dC?\>\T E9.t x[]6*z.gUv#tV@d-;K \6ƽlZ H\dmi3wdn2 %q^eC}hJQ𥉉̀8j́,Iei?<لLb-ǖb.gkd_|lݧ{@v?;\ԯ~k?$䲄فkgڳŞ8%`T=gBá_;<|ez/|i~Ym/^^9>q qv_;g\rznh~BK}Q%}-?t<‹,SaMgɸh eX'WG׎4|Wеgx=gh%w(CKKm;: j~lwwwtlGoZƽ{z7ҹssz\juSg1^Bd?-XiqPQ -'m|G$rNyPѬ:,BZ{!x]> yN~[gJZOx~+D'h Lf^_%JUZhmXm$oNZǑClH'{Zx^nMvːS ҿE&SqMEjc~)lƍ]HU.k.U#P d }JXf%M k6#I`=A A@ ^LGTS%p< ɂ2OmZ+uQ[.dt8M+Hz3n)ݵt34[rn4mSZSU9-ń Iyd.|\nQ.|W -υ|.|[ Ob\q}yxQH0C2LxZ OgS OͳY &<3agK1Gg{¥CrE}a.|<R\~!.\ {e|I,Q="`S27GF_,rp߲fdi02.膜[)GuϋgS\nFg98ν§z4ӑŪiN2E?b i~F;L2J(x~uEEt1tdBϞ߇+on.ԑRPG2BܑW A~NXR o lhQFV3P_O bLY#(ͣu 7xb\F-M4$|al gfFVE M줝KCODM?*dH{ܜ5]'8ޓß2iFOwv-yos=c#Untmm8ss)Kn&ºG&CYX:^Sq>#Y0'LT {=A[턮;WG;T>aע=$1zUL^㸍ٕ5-nyy sŊ%.aGI8^!#9& $JʷIz)gPVs蠒S&C#X#ZoJl9K;`B%XE]v[IƷsk)sU,Þx dLn7ޅ( .aiš3M‰VBD8ŸZ ҁ^̵YGeq۔5 )??DT[Mh2ΗVްA B؁y;a]dqɏGjcD%nY{V #0 fE{]}l׃EkLIޝauP QH+,7?.>B R m%:Bl"RQvw}@#N>k{ncP3|;4NAZ5*T@rrdמIAgBnٖ{GEfyk:ָzꩃv ~7V-榒xl3{QPu=h!ؑIOIiFE(Mx<4^zJN;pܩ*/$ x8hc܉L7A EOa9M/n&PLys_k`r>Cy&"uM`ovnX;a/~ 7&ܩ9}߫{8/? ̱)juLD%7( f3L ˮWo'D3AA* 7{ 췤Ծu* ffsk*e0uNAr~:${Ļylt!&*z0 U~mG!߀9MH2s-eQcjZ+Jxmy~s;# _8Q:ŨeJln%R]zj,lOZFUr}^`)NB6㍃ oNV +!YD1:CwbCu|08FEO6'}ў87ʦq8lG7DxT4ߘNv/iw`TL)Ņ] Rv:3C҇x0=3;tTIVqR== zv'PQ$_G mz? [-c-m ؤW ~?gԂrMhf]^{ '-$q|2i0l5hN6ķ-UQMϴŧ~}9,-H{گS:\m+ uu:~{OM4-zoB8 x+'g^㨮 6|#Q2V?v0U@Qxs̖DPD2@S(Ӱjj{l)~ս $!b(~BǞnyn;PT ,<4ݜZ~%Flڅj~WjyB~M NI?Z#G1jSYJLg=TRů,#++:kn1,' q%V߻>>u.SN͜g_6g?,n՛\P ??.j\[e:kfª"F^LFIPQWq?Qѻ=fQCUyL țp߯GQ`ݑ9ޮ-V\X񙕰0Q{B4UJ6tX`uZ frJe$8aMx$>kN̽< qDsdg܊y0 Җ&x>ADZ`eJJ9UҜ^ΪfiB(omoe:ף ig`0G7ISGIhM,seJ^1c7n`vf4~N/M@id6}x&#ߤx 3(K{9"$E~XpmwW6mJ^si$bpSg'\ëywm)f|cJ']k:1kc27BՃiô瓫n^7F>]q_-mIŷ k/sr0$c&t8FqaU +2.QFgK_T I4q~zNJ6˶sR 5H!1d\&Gk.g3,avlY+i Ü愖 "V>'pB+2qBk!N 2MY4_zK)z 8o%ɳNtJ&pG'{Jy:0SL221TBHatRO퉧X/؁(9N'S c-nK,E:e0]YI;zYj+Kt'Aɚ &@mZ^L?,S2Fȓ|("Sy25Lm,$SKpB; 2 Cٜ9]yvNhqBFC1Nh/ UEwE3kI]jțAk.{c]Q{vݵZd?/SE\gwG]zwFw׀KoFۇsz l]]Dȅc*9[D" 3~.)SQKA}6h& ɞS06e9}_|$/0\w:I?bn6zǧmbFāv#GQo'*cRnmtn{&h&s!mm*6)h6h.$ wKC)S "ܝIF} '}ѓdHU%%ᚍ,jӥ ֦ċU?𥄉<)J`_G1fปWwc y0> o$Cǿ~MLhJŴ|7=N|OG`mq/#>yzT%'~aZ&FMvz DLH[\`E:*>%x:XsɃ+ #dfQWO|irW~z2fOa$r~ Mz; 6yav&s2b={[ fz:jzIW_VMrr#Y#Ֆ4&M_'YfeĊHZSCEv2*XSfL 1DeT|SezB)S: Ӣaa@?CAhdP3R)ŰVMGJ8 8[pA,d 9q&C@^2;'ѫTcpϠ>M0Txe:Jӯh'ebK·N sz5Q% %n=P7Z>&1E[;[ Or3#-('QPNjom)ѭM!UwAu.`'Pz [9#庙YSH6LD_ۺוG`]^J\Fڴe(wQ¼24L4GF+1ړE' en%RgY"^;k!u".I>4{ź'sg;XIzT57U Wd2zepˤK~tiU ]ХH ܧKۤK~tiW޷^K{bemsگp%Af *6K:_O T PeA:}/ImJa2l,?=>2Q"c~;ZG1Nt zg2Ihݲw <"6n&).:qY#yr*W%Un״MgL)&MKc&6گYԙ/f"1vz b&_۞˓)^LF;YhLc$v:)`*$١Oz39R͕ۢ ɿ/u d>3ҹ/ن,XL20VN>nr^`XZ󯩛rXf^JF.k :%% 5.mUBy- ֡&i)t.5CIsɨRff2?QO[(' r㥺.͖VyN: R9ưO@9=C|e36]9uɤq.7' A?E?LU 'ŪQR,L͌|j~'ޑ Όs-g$s4xuY6h|D8 L(KD5< <\8ÅS޼ <\ *97rR߼s-]f6ޮơ` AQ en_T}NK#%wx1%vǰ]9<N 8p'}@w :؟Oayp5Z( vt5$nhBn4FKkB'L:K@ 8Y)僾Ag%vuPjF%5.ɭxG޻ݳ4 V|l s=Zwԑh@E&+e <{2nyNơv DhgNX!9qv3{n~YүOs}K2f^W_&4FOHo3@l 뻊 OFM]~F-Ňs+6,e,^QC_ U)AX,Xc(6'cV@?Et,{SIՅOM#Ҋ0|ؒ'լ^n]V_`_-П=`?V8e"}yIe#="{^((3sw;R=vD7tͧzKw컵ŊZvOhݡS1_WPIlj^u{ē{){?mnzl9M#_pl516\<}U)Iɫ9ߞ#dQKut)QZ*KԋUb.eRЌ.at| UEt!LF-vK)3~PtO5?O?j$fY<5Ib&y&KL^L$R=>G=lĿ0Yv,Wy:sWJKDz$58}%by!^]%aOonl'CpHg)I X|փ ۪}tߤQq  ־~ iX$8ҩet 2{Ml47^I ʞ<xf= T% -/HE%C"cH(dH ,SqI}aPS ݆{0Лe].uIvY>6O:ї0魻rӞ#Ovc}pKLvcu-X`''z'8h ˜"*30(bɄ i`=;Rdo}M8?]M<Hk,D~8@jU8I;\jw"X##ę:OL Dm\A pi8Mh袦KjjFM#bZ@\Q$p!9GF%UֲAǽ. 7EWŔʜ:F4!OJy&z:Ãoc1%͍Ka2pLOVG'\g݁*_:!h@[fIݰY26D.Q#%1uXM A:ֈ[<-&_FC8S\!DcO6e\71CN3Isph* 9mmʈt.8$H%/Kn6mt upAT'7/9:}(FٮGUAjXkHRt =ǭ7i~`̩>#>>r0av/RXy1=p'3#ժ S 5zHfpW|ݐf}e^SEzg-_v"`JAPgemwe9yaP @u)h ASNP;&Nǘ#N>Z@[wIv\mN·weJ9y3bO;o1#7ը37A_spmq EtH^߁y9`r$B.59D|hH93vY?Jvp|9o ~(coz'&:iފ.7Zb{C~3277%hEhmd:B8(x"i@Gfc_T<@Ry0A>D`T:Qr X6/nlҗktOS )hJKm%m)B]}^xυ#rq$ThɠNF|Vp轁qoN{u1,4洋]w ؃ACj:ȡz?{S2&_ 'ʧZ >/cKNV fq27^z~2KqM[ pJZf00r@F3lNnɗY@zTx92tgs sLgnE]aiEZN@-}!\Pv_pET_b KI9S>[Thmd%P&aJA!NyVD\q{*Bs@Ih 1;x'gbk98M*~PJM' \,OIkBlr0_6@_ތ,6)zެ5jU%tJ4 s--LYf,LjѼ,j!;d$tʢגOBz-JcR>,5t9pZ~ZH\st5R\=JGw?J:pIh='GNm&ۤȖ&P.Z*tz1˸K!X&,CȼLqu,'@"j1 7wAlZ`"EVD INB-Eɉ[j3g"8UK3u3M `'s,&gW-ɈAΖ焳 W:, D|ۙ-ԜGAY]q@ivz?AD4bUF6wc?p` V1N$z@`*8_XkzvA(Q.)7f3R^S;=3e43`QD=Q(y k l#43IZ4NAY9QIһ/HF:4Bzw@(t2F+/7CP<^#dRy6WGZap!ݽ(-+/r,Uf~$ 8:~ԏa~#4ltZjqv2S8вQ7>4 ˬoI#0^Q]urψ^W>o RQzP\Ȏ$&iȺ hķtyI&{b05uՔkG/o7]}#/_V^Yr3tR@\H8QQC'mRq>!!O`),BZ~LM?䢩 Fٲ@6Et-WfY 5-(ș*#Qٍ =L )-I*D*L^ 6A^l'Jiǰ᠒)ËRӛ7*e6o 0hj S8m|i%1R81*%@CDCDa Cojx QQ7nom\ƇEhܻW4QVh|XvR,W*ͧ dU4NŽAO:\bYXDDq LZbiq&r11'xqI W164-uRL̋Q+5|o'iNwiP^$/-RڵûHmHm,;;U2m{2x2DY嬢g+dƸ=giжtfNMӦpҷJkݶWMEu5tԍ[4ES^VP'pC|V G]8 vKnD2F)jS±kdROEN.dM] s9LY}K6)S/R8%p:o&!릅|ݱJG(8K$P"چx"p4!sǀ 6RcecGzG05ڕd}iFt`A H 6F0$arYB)$#%#^Io&rQw%vWqKmwʩ ύh`͝;(& eS#L5wJ eZOD @wKt"0灗v$?QTd.nг%}E~wh3&ÙP$K? 5%eU_Y&FYY]DfɌuD%UrbdWI]nIDN-w c_cp߰÷'>}1RN `zذ{ua8'ZRCy7 /orl/o*\FrR5mM`?N+QCw. Ĵ:2,C?`SNޫ%%atDU > ƯDCWd)~cu2P֕SĉJCɏ) HKR$Jt{|5}wFگozX'= eoA<8VD||%.ke-z21|~:v-ivLuonh!5I<' LWmNʷ?OER7\ ФR`*/#AGD-ExHxquSTts{֪cB[Fi#hV+955Bҍj']Z6˻7m=R(98{0Oڌ)?[%rs8\wpY3έOݨsʟs 2=鐾%h[[%w\ ~Gvm9dkˣ U9pOsycՄZlX "-_b g V#nӗGPUvH xwMCOTS#jR<ꄊÚFqR"XU:ɥJ$:jCFaX \N߇A?pBTYc Fq1-(c\7EK+f p)ݖ5WpX+}EhbȘRFx"=xJWE#-HlC  wU"tR {N&;` 1sHKAy"H)}F7 >;,ҔE8 Ie+-͎N0}!`kcR$oʳ0#wL<7a4M Esumlmt͍B!;v ;d}muuu[E ~a ;_2-2HսQ$UACP#ɨ:zD$A._m ތ x ƻ_f%P*)'23eȬ@JL~Dd ̠$~|#dGQw1B-̩5R}lyp^j *ha_>xG%kDbĻJzX䀽'dX#JURl2Oje:B\F+Jt %PZУ?&H앆1d?c߯l@J_l/7a-$=tJQ#y0QO` ܸ6ڣx2jr0(FY aKKl^F!H C|'Y~O*TėOJiDNwEwL/t&t?Ju}v\F&Ա;>?Ҹ:2X部 \e 1:vNC5.>/y W]awoOS3eȦmGf|O긂4\? ~YfM҇AU(J)tQ6ڂINԠ3.ÔO|aX Ab*j)UOxoBPM|@G<"ݶRO`'&|jeUYZ 4 y_v Cɹ$6um[t?]d,3cz?ݔ!=:4p{xɟFu$2j gI~5%3^6h[ߋ '!+|h[JM2rz|R;RÔ$7 3u;_$w\Φ<ȦQ&!=~HE^B݀vЩR'Atc1G1GE,ćݨD;`,|@K1 vb{ wLf%VJ͒@%J&B_2KFh"Rqg3EI.|$j u 5e 5N.w^x$vYo)JdҠԣZĨ։脝eub}zB-?/7ƪ0TQ(}F;ʢk/}jeN6k*8upGE0}ӷ> 3j2 p+\] vtތ~mrh;kmY͉]K\M]?`ACظkr [ʢ6Ƞ)p-^ 4_[4sLDMCh|QÝ4`5@uڪX5'(v<Ϥ-MA*鵆ȱi@8(j@ qEl\mD6p@q qH%- o܊Z8Q'[+|6P 8za!!{zU/t,ݰ^U0M7ꓳtUT S^ݰ; W7z7?d ?]}3YI71~HfZ]TgPRw-5syçw7Oﷶrv?-, (lx5(ם=?6{G@IvƁHS-~쓉\*Lo:~n.[WkrMJeG&BI&O>gti:B#i`|,8|:<[`8Ghjr1xJ%h*6%/xOxq&8Y fk|?_VÑH ='ji53K-W4( 8i0ƪe`4'!L"ϓkghm8gqŗQUw''FC5' 'm5ֆWף!44:+h|tw`4Fduzǧ#`'bˀ%w5^p4K`{]_cXx8S3MƟhP>+ r2O`˲~ϯy۷oOE}2hĭ+h^S4m鼧qOy\w÷3\ Bj=pK|O"9C$&ۭ}߰s ċy<ή9p *YdpS8m|mnU@+F$5%$ݲ8)~GMcWḳ!p NN"ӅI|y9<B ,rRmPùwCt8bL7j0'5D20z^-eq8ui;9CL[hC 4(@_oTN֖~㗜Yj Z$-7ooj1M|ko#eٰƟ#`(Ee }W h%[ZeZE׫{Z>,^p.{5gi>:7O,2ݕ9Y {=>F DZ"Lj$9u}\x܀M_f׃89ґ&}yS&w(^XַRԷ%Xa4_L|`p`nGx2q,[.ө">ur}8}>@4GZ5~!]bR l`&fWqu`5s8ĀTL%fs`Pgp"UW*`SmȄΕO \G=f-e!4[Eo}L<|Ho> vA5UDoC;`np b>-8t0FTz|yy T4ᰫo1I2AŽLk]LLQЎ|U[.\{a!g/"m'q ,p npҰGel^7c-oثWh %} Gݓ~䨗D.{:nAsqynGeHcNH^<%9 0"nv?Nvx VeJ{~%UnuMFa .MDFp)ʋ o,)('WkS]TɃÓ Jݤ_ 5M\e:Ɋ*eԬcWŢ_fRfx89%yfyM:zU/^c^7G8hÏi5p% }4>bkUulvm'5wB[yg/}h?T ~w:mmg[P(^U5:=Q2}8V 43}$avtOȬWѷRh| ^XanK71J7G3^)ږ&m-L0;#^ ލr2Mdg;Rnm=#w%2" + 䰣0<[V9R_ uMhA3'lp G+-&/( 9?:ZpBfCm`U{75_G>"F ">ʉxM ը5 17P%[\[" [:)ʛG-,$<ݟ @ ׄ+PX W2a 0i"` U0tHlMB.r;>kwdǧع`dx9 hz q1Í&@rxK7h8>b4<}@3@,m PpRonc]Lt:mq#4w zp(zo/w]"xo}qY锐JR ]imt7HW4`a{HudՒ RR49朒aQp>7˒trVîy([ȫiZ0=1A{[DK39mzbWjWp;iXLۓn~X-Y$9#}M۶NWr'z$X#@0E 5AH~jSr;=M KxqLȊDhh4fiDBg.Y8{]Sn ˏ0vk~Ro]!^Hu1nTko8%W9q/_n#0lMmJv8U U2`I ӿ6M-Yh_ND~sefZ%%kE0 #v;;l1wHԎÍz ںqže O˞a;~"L-QBġٙWLqzӾ+G-w?';kxlc6ǽkg3;p(w83  Vt4(y&!-&P&@Oba\'cV h;V#hc~_uq66: f>c"-:)fIhtc Į¡Վ4T~d@9SaƟWpjx%ޤ[G.jPĄ\j3d"iMJ>J'aM`֌[^iJQж8"`w=Q hH老B 嘐Nh⾨o1pFQ\d<"d8KKX`kӻ50ߚff綷dv96gFI*/c' T)J]ZQ+=?1LOS7(_8| iAmIN ?lhaH;hB}W?*^J%L:ehdJ gBp|A?7u5l_4z[%^T%za&|Gh\%Ē((K3L( G/߲MBQF8ӼWҳH %2/ӀG҄|ߗ- m[@EN(6} J "Бk-fY7(^Ma{[j~QJVb`m cdy\A(Mڵ11Zeȴy0[kLʗ"EcM|3cķ ND[Kxl>x^+0!G_U`'7́ljj ; Y'rwl5M45!ʟ$ RRӐ|l'{L a/P4",?jU@r9~ؤk3BbU ?y3)Dy0|Vfj N0*62}>we>7? v4ߏ$֎ AJE sAmc2A16y[m6A\R/sSL@ O&I>8,; p| ť8%hGfZ ּn OH7#oK +O!@.!Y4,#*+]1bI+,b|"Cw4c+[rIႷp3'>z l5ڎm]Z<;opxb#Ȉ'z@udP6UhXRM]`ऩt6RSfҊߡcD 23r,O ǣB_!X|uk`,Du,aV.`Y]<x.dslwfEh O;(*I`lemUDnEzU9p'u77O[ *z<`#SECLLbin|ػx'͆˔` @B( iJ 56r:JW[TD-QnԗDyDbd.+LE}& S0r- &Zizn5 kӌcw'r%Jҧ[ZfT*ͅI!pkbќF沶Ihn~W3镫K ƙ`&>y?t:p&72EљĖ5/KE/+T m0y~ Iޜfv_O>A,߇o[Ov"=XqorSE'[\QS9"T{Vpkܭ(~*[RPh9[׼ލW5Evycb,,]걟B=>_Ekf14cwhK'GyvROxD zȑ3#mn+X4 VkxYX!O‚rgUH4򎬟5,a1"֘$+ S^-\`s;(K zϬ͑xs5A?q=#Gc1o:?2t HwrtBªUV޵~`X-N=+O&(hpӈayG1pqlȷYD҈_ a'Ю#hlVʌ,ɷxҺ2hQ)aB,]ټ9˜쭲oFfa G߳ L/0edpmժ&G2>4 #Nd 3g#whlp6YUȂ7~hbMOM \ )nءLxFRP=ա"@ LIK{%H=G^gHg}5KFFj4nw5W#"qƭ6ZP =Gt':u-fPnS!ٹ5dNSuRtW Dϵ; SWiOT>p1' j'u >#:b`^粶[XӰ"!\X5It|=+hq_g4 oEtM<PJϬ 0УbHk3^\Oh@2;BjFEK!g2ƯeM/$~}@1`1^-N EHx0]=(8°koZ _{8nV3Flo.PCRڔa ;02N9'C?ҁo[Ť Yb 8zAiBp^hVIN淴f$D+4N \1MwhePj1emhQ%  ,b*_Y(3^F"c/sveQy7Rwyr/e8M;}YEi55۶뢽b5Qm...kHn؞uzNFnV~CgXpG?M*@];؛KBR[!k9k 6LSipo1)$jPgż~mMY2"@i=́=9P\iupN($مwšC˄'r^T3MvYS\@dFEcG@ $uҾr%%0⑋!'uGO%Jq P۽ GN['(`4BJ=qK\"ƱyimՁ+]b>'x!uGU ,O F^̓K[vQAf)@Tʰ1n2m"'/"iN^`@/xaُw%- d "ɮ~!IQu|# }#yT˰*&{&W?R}J=`m(|% W(LIq"u?!BEWȅg Xq'0Z0̈y04p9.k7",!ֵN{Vpp^k@#wV2%WvA8,/LoC\Z5(a2Dc0:O`yڶhcٺlӋKbR 3PoI\=pާwοrVI UyL\VŜaCf+?S")6d֧ -x3xƾ@6 ^"Ʒ/p@Cc@2slA{f7CC; VЎ]ߐr[\O;#^OFۺ atNUdIq*yxy.$aUSzk+of#:'cς.ߓofOTу +wD "mmT̕  s R e nZ#mL`Ai" n WW%F-B .B=Maqӑً c3&ڡzSjZX;Kqrsd xE7RJmcG^P[ok!>}>~{;[th5kZL]7Z׿uu]?/51]Wlh_* VT"Y/q ]sK+m:Uӹ`2Zhgŕ㦪ٛc7ŪjQlWET7]ǟYxY].WwGdq/~Nߑ;D8Y uȵbhJ|%[#t=ZOxyC2ˬ\D#*JŊ_0 g)z1g 5&D(ZZXW7T'ݑ6i)etI74n/mRXMrnCΐrz4yAB/-t$`:D'#9q'=۔8h>dҌ0CH8Dp+]:[TLluk|>L9D&Ue }'j"38_75P#R䬆>uo6*SFs9 VHɥ=EV.5#{ZP]JO<,Tvg$ (s]:iWY,B!VM,+4 {h {zd>ʳMYqVΗJNp+ܔ gԢ"¸IwLeˀ?.>j$K5孟05׃ u'sqInt5ENU,2%@`e>sa=͈ @ m/İTPʠB2AOQ:?֫W ZUЭ3")QCN{Z4[Q9/mG-@%\C̲4 ̬s|%c P\?@2tZ"tR'"KR"{H]k(ŀWYtkJjs::0Դ] `;yI'w?1:)Kr]>5q\w2H$Av"PJi%MakU+kluŌp9nz 4,7hIKb4`nDww Z^EɾNCBCBl8qM1)HjFKu]Z v3x*E|T83د6VQ4JwOw׉4!fzX$V:ZDMg[#&Y'Px)d,2'yk*;}KIϓc(x u(c5BԮx`V>kk:;Თ"u^V_М,0ߥf{?~M~xZq[ߠ}es/=H+Ĺ 78WqaToqd6&jɸ NMN:MW?"p2gfP :Z!laVrlf@'W 7߯|>pm3\#!yjڢk?ϵs9?Oە粒v\i4M +r*q\Ei=.x]2Wtȴ(Q"x37Lˬ>WJCt*DiM:.wDy#tqOΓnۚ$MV3˸Mݱۤ)#$=$ atvC'\GU#=?[mk5ނaf(B_3D3{YR.wvY}6SUo1IJe [Ta@oL@l: UOairv&4.U͖]q\HCRs]Lg 0_4||=kD&䟆()bpE;z:H(E//B(N8Wav9DXa[Gtm m-]r!cD) ij%yuQ}EI]߉Z֯B#_}YXc{\wKjl~F+O4AvD-}d%ey$)(٭Xp?N5O'ϟW"6$}Lᴼp Q$MJLu<~y끌\ W2Gz,q75:po`y2_b2+®> WՠlϟJP 6ޠڣFשjş&;y8^c[x0Fpp6"\VsL'xYu>[Du6Mafڭx2&в-1͆qU9"Qŗ0Nlp+&TI?Z׊[&1 }ߺwU/ff2aM= T͢w 3nn(ƿރҽatuڃÿ~F1wq'#Y nC-ig9l|d'w{Æ>eO0ݺZ7.] ˴fPM|'|dG$*B_Ի-l-[ %]ح,Z[hp˭WdUa|M8)5f;(a#M]hF%#Q9g~2hUӫlou {)`EF5F:z zt3P0K@!鎄qJ 25Dd>\H#(й[庵;bə&f7o,-=#Jw/_ޒ/A1CLok"]~*N^2= x2}B#$X#id]@9$9i@;f#ξ%^) 5<ԚoBϡ NaO/eK2O4I@yj7S#ǵ_ J>ՕS5(g2WS{2kؔk?<慏h9SmJn7~O]zB3< MRi=7ZmEO](ZԴ(QUx.-"ö!hfjK?)rɉ&}>kt2A _}AfUmQݔ41'>-^q45,JI#Oh{'z[y$3|Q)56_UZ 4 WoჄ0yJj&dux#GIRNW7C`{RS{6Sl@^VaZoi 71}1|iRa8RB9qv'$dQb7ΪA4+Wz }\ w<Ŭ6ǙD !q4T\j GhSﰓχwN̊~0*$WZ(N\ >` aȸmρqf!*"8NG%q"q'b%e4si| 96-\c6m ʩeťpmci݁a| f)rn20f $wѴiuOTW-Fgut jǙM9^m\|xe 3*d]y`YΛZO4QdO~hA xp5J;U>=DI?Ф{k{nj'\بVFI/i0f=(Aw3O))w#k9R~}bg~Cr,g|ձlxSYA՗Uiα i&mAM=>ix%qOyHi\>HvPkf93MKƼL<ӔRR*h͵?ZGc!o-10#r^j@t44@O3$9 >g{U}^%353nw92 >?ҽ%{r)'4нuk[th5l;ޢ?;#861'CS#h?Ms"Ò@wa~ w3V]@6th3ʖv;T|7"׸v3͟$N}F_$3}*5ޒk_mIt#LZ:ݩ?:־|rrs[;+M6;/v,Isk/r׏( d tʢ40 )@i/r-:~rD \mpN쟶V8!M+⤃wgCoKEIn.J$Wt90?;c\F#N`Rvq10<)"zUo o"|͍lGhbD91u+qlx5d( 754*~~Z&A2]P1b=P ;@z<$rRɦ4"tc񧝡6glVl=%\c9[L Z~jU>:  9ۉ'nʓC\2K澦+{j{P96m WV gs40~Pt>ԔxLI*/^KoM+:_w}.yyڐBI;Q= vZ6Tr1]g5 _zīSh_0CZU::~;f+7Nޱ4w2W*"M_i-IԀ!`# g$CGV ?ԭzscNww8 `c'HbZXFl*60`H5`%땭E͟RDED)_m(+?Ѳ V13FFWP4[g$&AdPsF# h3}iBUFXFж,9oªVmKduݣD\_< ½P ʔ;!m(lx˟K ?z(ew~*cɜi Gc0cbz)IZV\xN/0~ɫoi˜dw?1 Zhny9s0;=7aϚh{0ٷbȯW9sr$) db~ ZqYu(T݇LȆ?98J<<pR5_r\ rX򜎶d {;58 聱,S~Z[*R4}-s0YiR4,矧ŧPGl&JK֏; g%4SG&Y;Ĭ8ə2vQK&ꡳi>/g~NAHH;y~4dBn}yIC#oBzXԒ/.n .e]:9XE0aI#NJt.P %g &^&VPJ'wX ?CX 6cāOmsrD5*lzZAr0ROg5~^)@ʱG[&;n"S=͋" ->6  _r!xQ!1.K9t}+r3t*sTkoޑ8%E*4zRm7 }G@CɈ+51f-SLzE㕰o}Ozuq@ˀ:D1SΕJ>-Aڭ?Y3"kF*ձmO,zS);G,Cal=jq^nA[I)6˜L(~3%иH%V~ iSRP.t OeLC,,d g 6KG"K$}pӌɨ?:Ϸ)D%ؖ֒(=^XsX6 5gLHdpնGTaBV/3%Gpo*x`۽jK%tdnWN2@إ@wXxy4=HBf3r8 vb: ZOPQڮgbC>-k r=tò |ݮS&J ćcniu.U;N+RSCE gIR֮rdyV8{sݽN_uxѬEm~Ҝ^N ސ_]] n! X<+- fw FDԄO8~͏}%jg}DP(?k/*[ZW{OckNYuYQfc )Aʌb,z+w-KUCUVH1{oմBqTS"&qT8vj" ETX{`QUU5 isjZW'*&+$#Pxk3\ij!kd0LXD6uq `s!90e] \<%pwQܒ#L2G: b(TKl㔰]I8n"+&U"VX(VbNGĒEf+8*${+]wV nv \7;5W])\,^*8g1d[xFNǬfD]c,m+-YL{B$+$6BVGh6"mS+VWTXŃPRi^cFjE%Q_RA<CâZ&S6#w~YuDqtv@ ?+nz <%f]6blZYN; ilE6n)볽6{}o/V6V $zry '6 F"H`Ʈ"GMi׎I4mP,[p@n] lEU'GȀH 9guP InIs3 }NbjMݥCɍdz=.MzY1vs&\X$/7^yڨ67¶G Q%$뺣C!%uUD 2Q<{>ylrCl'Q33kj!71ȒbUY {+䘣ezd\r"xOW6}N!׆*  tS@۬fd M,Rm/ n`3e+ſR_ Xz|3~J ^\b¼7rMC!0 #9g =bBӉG' z?ʷl!V.!QANl=;=ۻoǏxwwwoJV*VF7]0@C4Ǻ5|Zw?8~kwdR, %Dc@ sC'X%HlB^0+Ť6MٍzEt\;t{=& c6MB$݊M˔% D an!<%WfLaH& |Ұc`"@&zoߡa򎤅 SWf"1KйΒ,-f,ЌEțVYi(FB f|`!W0Tn,ECi*oE1ʜ d;VÐC'R$"ul"ra;*ic CʤG1YYcBO\Y:Xr!`;qMyRd1ProR%clOK_ gƏejM6M~Yb|jmJIQeΕ coZ_h!I1JgюM2І A.Ӄ:{DO^"* &*{ ghBΓ-bG)i{S ƄSʯ5X)RoLAdrvb#51';AV1ғlXQUJ <}Wܬݓ0ɯ ؙE_K{.TH-ev`'K[ӛM^Zi٫h,Mh/UYT);W4VًW) ~˕1PsESϞ$ 9"hq(v4+FZ{ۈJa, dQ&RD:LϵGS^M=kYi,J?lUW8ӭCErVDM"9wڈ%=KJ5g@c@9U B.={$JJ(*IU$#cx\ҕH魑rǘ׊7$d{ȱۗY* o>괻 AU_#q]pl6"$l~(I^6"ĉ?s Wv~,wxsjHPʽ,8^:tKD| =lryAaJWף6F'R49!X^Z(!2|a .X{}NٳZ>€ٚޒ%z<(^a{(69dt q/H1t\505ߌ~,sa~HF, _>UV([+yZ   SL~Ň6# A%"Y@M,3+g.~cH/5f1; +HSV 2^_rNf-8b~C s+u( ^㖭ҮǿP2 f H_}K-ڔH9iXXD[fkGݓ)[Y2%B(sR&L,JNE莶'i3_d"qq cuKaukI:b ǜO. bn&l;)t^2ʞD奱,v jebƚ3Zez} Y6u]]yD $vT_Դv|JS2τR]!m8ʕڣLc  ;ϕx<cX(ySˎ:vC`ߵ7&'9q< qx~DZN7NbHjNjNĵj ZÆyB U8l'Vac^QbQ2~h"˥| (āYi'h|'_C(*A}``Xo5aI %:۶Z,fD>3La45"Xs{bRo-Ξ޳bá`5vg#FҀl:>m` A-Eu MYs vuټ+{om%I!;8CHR-ӝ]HNLS -2z6[<׫{ȵ_^-cʶj_x᷆`L waoEIpxxp9+0;0 BIXUfyuVe3u[ۃ~=v˯.,un.lu㢟LnLk{kbV,U 6`޽ivW3+鹟,?R# :72묍F`mjޢ`o45G,l fߘͳ:K\[h[QL՘hh(h6+tn! DSkXyR޺ՙ4ӓ<줇v;󋮍fgK5>ˬ}g:P]Ab[6zX9m,zCCk;g+S'<}M lʲ)7]1'[ir^N x1V(1e~LK;0ز0t3 AW{e1kzc_W *AЄw`6|6sۏ:;k{yxZ Aao_ v:\ |A1N'x=}O.{QyeiPSTay*i9c?F`3* QR@Y9"_EYx2q6"!fi&;2CUOi(L8CHБL3WJ S!rwDQWD=Px09J0?:h7MnzuYo鮑R:.DJnΒnJQk&5gD=ό5RW^u۫ضBGcXƗ!I01e$YM9E^&Pdb /K5WCLko"A<+Pa(VH0' 9 6V6o ,bl̄'sظ3W Pv @z{t]X ;mS]0m-RF)j$ÐVHՄ;*>/yb۠tg:8dϐ=FCgY 2 жUjV@zpe I_ؕ}C\i"<*uȲX9݄$Y&&ORrض+Um o>Z@E2+ @QN*.=lBҔ1 {V lgw0;lr%$|7 }$t&P狱XBqA@ gӀx23>-Ya')EJT7nwn)" \)62b0/fBHkKGx6C&,=ْ㨖z:sLzDtáj0HY̒맴v*{|]v76޾7< d1B Wi|He;ohV7' {#D+GW"K?qh ;ovP5hv(1DBEBkOZ!Tք98Kj|GU?<#ȧ-96PHqdrMm97|.kף8.1^,FbFì?xJD82}8Z[@ uR v u3C.^IJZ38d [%?yxV93GtX__44l-,]~sw8m]8=+:`DyY.Qː:"L4`C"Oio7 l|2JPb:Uc"DWspYG5,vg~m*)erSA"zBJ}(::qbڪ(48DG[-H@Hb J}ȓlWq82\[8hB+ p*t6hGMQ(:Sv,Kîԥ3ffB{ [U3)e`^[Kjk.6F)]"'W蒄۹Nf0ԏ.8d qEq}y3vpZo \!x:/8A#6\vբpd5 ܊$h96+~. Eq$묄Igoct>Tpo2Wz>CI_-jjPcr0ƍ|ril5u֙NiEi ^^$)ԷOk@%*%f"DU ,BdJ4NmI|H&in/hulj1.$I`OޤU1=4EXBQeړ*-26*Qx]ފZ 'mS݋]smq3}._|"x 6ͨ'jmegMkf{s-jUI5R \G@Ja Vʵaǚ3sWýf3j혹}z4b&J:%JeA!/e[+W$'$ڜ<00F4I5yk,X$SZ߈1a_a) Mr n+}q?跿^v-:~g c`{ZfOx4fϜeBn=ns4و'׮[܁5n?kY|9w笑NGm>Ģ*sƆv>A^?J;py&XI]4[otuleXl[% VL 8r*xfW3d,aȬC=۾!b!t0={/a?1F-KBxZ>^p%It,B %V5<4FF ٫ D_3  |djE~Ё//w롻-WDCo:< B'0g֍̺&PyOoZ9 ÂرEemLXlIh7Aʆ2i-lŚV9~ D\QP|fNneUfs'[B"ɞ2*|8QP`Q¼_b&D{~{y0SXLuy1o5z0bA|S'qRKNspd6'0U}˜d6H(b ?mYC;L@2>G ^h,&qK$-BT-Ig- &F蝛{DwAfd_Qʎ$V +@ A GT.,uqr3S~Y=%Dz51^G1buw$ H5t>6PyH9.3x1iEk$6A_FW3+7Z}|-TPvpSheba-wøMcn.@`Sj1B2!د3N>fzz@]$X.,J6Jjt ?2{$QhfO @3 !/f{=mCo+ X2Iq"p^=r\ZN'F,/r ksۘV 8N.q<uxL90Th{-BiVSe7ASB+o`-;.:v"ܮXLo}7vJ.Ar1?~ Pdkxh +1da,,Aq߅p" '3bRn _G(\tE@Q.'D0yP ٤Z5eq/O/uɹȷDt򺵤+/o]񶮮&A?z?Ha?kVsӏW}q>w_K?a]^{>hF1ɥ(T0jԮ%"U4Q߲zH@$G;S%^qhbmm)W[1 vB_q?ܳ_ORh'j&כk'ﵓT&C| i4fMhz ',zG9NBVC>D7`,X>%K&V0w@|5858&E>iI-^\Q<'flU~]۱r.e2~~:y͵L3QxIv#uB7li&C3;l ;ݤ\{=F)ڝZ Ա>tL&:FD7\B8]KI}eN4A´.t %8~ Œ'M-1W4"'jHYpI65ن* "@e0Lx$D_PKbWO8 0taokZ4pȎ>񹁟}HG&8X1\ x p.x T3Nܷ?25=V橬DR+ҟ<<_8o/zyqqkx=4#4jjcJC9 g|~5y`;`"Or*Hnn`X&+U3tgv;^d048pUg))C _#0לr?ցsׁ!Db;,vv.{,ŵӘz`; ~3N H+y.90 FxU2Z8W?)".[kK^-?1ݢӃY1r:NGmߪ4 2ʀqU5I* ]6Ճ ?BH񡓈. tgHy伋u<5[,Hp=GY 4`w J] ,St+bfCWe|^Hq5GX,:`ţJmJ%NcD&8PMhO暴A E6qm'h4=!j HI4EjRzІg1ҟ:]סnI#;< s6NF*Zǩ8uN{N>xuYFT20nq)уJ3yc84"/5.ņsIзvF59\B=oݥ㾉MvܦHpTQvv6 \oH0s [,\Zx(&+ډ(xGkz_ޠOśܩ鱺2c*9~2KN!]\ bDbaylR1 nbIA?&Rj\߄rb(0?ۭW,,Wd>S֎,m9oh1nvQ }̰IX]%hqɄ-v)wc&a B!&ˉ:Eb +U} =nw <}=YZY;yVw-$``<0)'  [ʪ/E}$ F;z9Y 0C4סTAn蔿hbJuOδI57s^Vh*)hr lfT%M'%-,Oe䚩4KZkV^T޹%>vhØa+`*D+ *gnVqSbiurtR+pB篃ΠYZ΂N(J_4.S28|6M--Dn3"~ IW xqud|ul|t[78|#5:f5\hq5Ni*4{( [6}>趆U;^R9/e5B~/t_uL-&&ln2:(ʬ4` 9ӱW!*}e !?f SB flR櫰.ZGcii׹W*k5V]85V_.Zq/f4BK]`]`5pA!4{hH2ݕf{7`. ]Cc.ZCf4Gp\SBO Cd%ل6'[$V#®粶C/{fJm d }ݰ)zhL61@M[2.7qvzXzߩg&Pו= )2F@*M9yɟS r6(X)9^|_^TRi65y*8ALvWlIζ4x)ʝļь`0 ߅;Nlٳm5T2 5G`G"XL:>!A„Kh+H&Hi[/,NS9W>B*2Q+'LF/>Dq(y$n%c_(},JC h2Lb#㻟џQ&@yN+Nk>tmm^ꢹq#Ĉ'._ϴ5x.DG|:m TC=:2E< %9Wxw%QX5nN%iBFx zzD37=4P}6q1L;~G 3t@s=2弉H pD,epEV6p%e\oT)ՐFC?çTtXJݣãw@bW,]`I,۫oYL镣r]9ކ(9g7q춖t6+l ^{cOpn~pڻkhiwgή;K8ro/qTd9.nG` Z\QL@Gx- 8I'UԵO7Ϧ$ i7:{̈́0)=Mˏt+ɪڅa2,%LT*'հcz1)GG{`]*>!Ok*j_h:j s 'J$)W'Y'Y1Z̎ѳ,nҷ:r6U6*ЕH/%в^1BFFq9jmKV.Y1ZKgvuPiĵ!WxIKtaJ|[X?V< Z GMu1Gx6t=ȰibGR&?[fD!HgZğM VF3m*?{0K-6JmwF+f\Y6Mr% Um8ɋTĈf(EĸQ<_G'фW|g Hj?TM|GiZ~İA{}gdYU%eawt%/~oåOyE |eD;Q%' ^WW(TT7? )(e DQqL1%&Pl/nEKʲIWJxİTK1|5pfT255 %/# $ʠ$!'Ak:k͖ hHҖEDY53]OQFjIJ ?HsIƆ(j9&~QjC5D.c%vI3$H΍ f֥|SDɅDguHMQ ͛AYF-VN)+u3XHc UAG&H:H7I΍A8 Yֶq*ȰhI5 qp#h48gZ p&CINb,͛`iXZyX Ţ$HZ7 5fT&[-+]s$nyl:c}3=kZ`V5db|Ђ_ʽt8xӡ vn$5*3U%`frU4` J0kWIޑЬ,*f2D7Yhl% $0L ٴcf`l{#)ʖNj=!pX LbQϘ*I]zh@ * ; 1m<52fA'm0MUj)vjdzayb偕A/OHU>f:% sB’dq/h."@FyiaD7׫,qqtakX3*=5W}`"` "5H0g!p8-s\/2WKKlq߷V%NT!25Ҩ?,QtʟĢ_6(YUvUoK5iz[F;vVT (]l]{ \v܋[頕104 ?uJ'G6^6r80(W3T.it m-U{g*#{@蝪;Z>{V#QdU=4@F8Bsf˾qHebeؿrm;}کѢ]Y{" { $"D \mYpV J[0_sW"&7y;)D%Kh_O.b!džp1ycdM(IxKjWJQR*ۇjUmj:_ftb;>GE\T/P=XVi *#J\>+i2@i0?* Y.F)H*򦚼E0yK4-QOꪁf ح%4W F'o) J^Jp p]Z$G~ F3|9 i}ެܞwܞan6iy_Ih@oF/b4RDv9qN{1dA3Mރr_7݀Vş! LU?#Bg^O@f5[nWhEpv/$< Cop6}ub$%:!h1WXb<#ܕzAq7P|L@$$tQǃ4R4cPKdF^?Mbm4 QyeW ֦KՄwg&CJ:Q~ ŖݘUS"wZxӐN;I $z?1r)u_?Jm=*S*_!WYp.Q x#I,.iarϿű<K6kJe @/oC0l:sŋ3?k*|) E;(~=O1K`$H_+0R)!"DчK[U+*cPaU#abTبL"8+rf1n:p{u(2N*YF0| 8;2h1P#,)hkk;+ړ TՋg0}hi8GOK$U;7矁OE*q'\Tc)>V}hbcL3IJ EQ2ڀ iDO b)kam-T2eKS,j[x0qP0K`FL.“7!V+t8}}_`G_ȤFrCNTT26Z%YxP Ə%^Ԥ6&mjJ->R6%^PԦ6Tmj߆ '_mt1G8 ̄mzk=C;92yy?Uԗ nY,4(WZ]_稝H!ґ ߝ!JG̊yC`JvM|_d` rwou X~΀AA+[2%Cm " e{g˴;bri TÐ"FZu/JA4\*Ե5#N|>papcD᧗'%-dqvzQQ'?D8; dǾqIPD-v|b76W*{x #&rEᵌDž%k{6 fl[;j3{ \v-kìhU[%|tFTzH-̴aDQȴ*g锯 jď U# |-[)Llt%z՗u[.+'}ܩ^ܜ0RX8O|ѿxd -J~& WiDLk3 Q =/˱\zKЌ/}l$*I%߀;)S^\f \۾iT tYFJ-p3Q}RyVO~)wf3|}9ܨ':n%k_5 VCǪv B=o1<)uj-j]΢cȽBl!1/BCDUP^=1-0 P+&Jf;!D/WI3Iq0υ!.]$쓃fF6QCG\ 5x"+::e_w|'-z_ B!CQvNhϒ b4ڐ1&eHTsjSMYgPP~NRUokՅE*@<*X ?hXRŤZiRME:W[TAs8;q;^3i|O}@?E ]&Ќxf'ٶI_WθqZVM|ϭG_3ļ\dһNXQ,C #mZA{N(TF^ضn NLT/4O-`JG'J&Mq`P IG,V,a.^u(#@~!)+F*+@+,ljXb3zx)ZI]6OLOT9oH'dNPotQJ.᧫ٺ~j6l[ M}n|E<ɗ>{>Tߕf"nFfd }HeCB^T@[쟗stdee^-n=DrXq!2tr ]tх釧,^, !t>g6!wmUVMl؄u2h \63D, L EHC!G~[a݇m5N"U%E/޾sO?Ge$JAS)EvJ6P:RZzPq7~[`~ůX f^2Tݽћ^Tv*z(@]~/ޫ(Seøh=}8b~8>nEDi㚀48!>Mk'4i:ּ^z͞+$.)Z <ɻ#6{&slK_t?@5,%l VWBTnLCtK{䨣{E&*@ٗҎy@]7(YUjlKyټzs-]-7v:dp[d(--m=^ IA7<1.~:̿miFR##ͤd[vh,d;\a!a`ڡbڡ`Rp!'؋1Lɑ>Ti9`XGF^VYfpJgq&K4e7>v3n:Fd;"Bnܝ|ƾ_~ыK1fJ}4@V/0\-4PxĦfsnԔxݪZ2ag h`qX"aKR}Sw͍cu4DT)q"8/+6X/3&|K$æܧN+$nW8Sџ;S @ڸQ#pq^4-cLNUe{ rO;Ǔ/57@Ky.(EE098QZp,&ZaqÌyD9}lfr,A6DCǮ|;lZ4ZL4G#HP,m322Ges-\5hm;77 7r"ƞXC}{ܛoҜ\*HLe)Vit}q.(Ѯ8vʵNT+-jˤL!X6:^VTB.Ԏ^=RNjzDzܜTVJɈX{p(UIMZ) IOj+L͌0TBÆ@0X>CJi,4W y${PKOɯ=ݢ|e"],R]?RO5^_Dϋ *$k: ]UH"}mƊ Ƃt[WƫdQ3eaުG~]$cV6tkdCw9w8^A#]%E΍Xo0$=?>W]nz's:c:c:cJKYyƓxz[ 0|c YPn`\ o9yedL[t`jnNJ B>ԼgY:_KxjER]ӳ1W1"#,'I;.J2.-)wI\(7I|Uc2V3"DDD:::r`Y'2^'2DU6*0Xn^<΍xwǕхL|t>ֹ/tVĬ 7fn/k ȭ}d xyQPhǧPj"v`h?x#XLEfN841IPH0Z"Q -f}uEGhЋ6*vs;to緑c̽h>9){r=q—&{qpOoӢ鎟ZYؓX7^21qi֥"<'DX Rѡ ;1M)epkk"%RB m:U =L`AQjF\Ol"-b?'`jş5֮nRzVPROOR킉U٩t7j_e^R~Wl76\W۪9g4f~41оX2x 1XBWż XC@,g :j [=]f 6xzH?mjT%#giOe 岼d-]%׊Bgvܕ7@GN'>i'j]&AM qه}L1jOSz3^xNC-]Zi;x3^]}vGId31^bQ dV b%aZuӰ&;<^{v|bpx^$;)RgIjqe)9"%Bͤ ߝcm8khș`"F{,cXnpt iA$[9bj1l)iȚo tm'ܔ7i2i¼z{N4~3J5J5f7Z.#Lx  dNs!D^/ϫG?0Sr++-Eyr r|QZ/q[U ^[Y\"VFF 1X6E.rqBW ZW$8Ԑˢg1FT#SIeg7K/%#KFڗ/_WӿzyJ2\.򶘩bn'S_y;9]+1~̲>QRk$(`Mi9Ĉ* +R<s_Ӭ*(&"w<|iLTdOdSƞxݤEKapS;o/ыն U~2zrco2P6UNE駈<ōV"зP#ISLr#cvHRe@"-d j!@1 Uǝ1X/kB"X2S!vhĄ2M eM!~Yd*)ݬi9%#I^DqHBhBw9SN Q`bFFDSM%6~%J#2HFi2\#k3oInONBDՊb!lF%,tO+z-#NZEK΋K2tȁfj<# ݍ2&8OMU32hKC\\`|h! ߲$Gn&Ig:Iq-I.nђZ#\䍕ǯ3/>~e> SH:VEOU4rzM56E c-Z0NL; 7SD3I(ߨ[u/# e7_C<[Z;R'')Klz="W(t2V=RnEMɄ^#nUiUiW9^:'%A 7*pǷ)Vּ9s^%BβLA Y%{ [,ot'p:ƢA2C{d".T=:1O y\é 4Jh$3/&$G Ek@so9̲3B3r021x5ӈIc^`"ڭY&0ohuY;FHJ7RBnBmCk F!p*Gj ]h=x'⥈$insIc њ)@m>[vz׺zfOe,\EvX[Q[U]Yޭb ]%Րw3͜!zwv*\Dxgd}+`S1 %.Q ;*:~dZGg4" G6Lt$xLb, dR -+X;copQNI!F]5^;k1Zit} i֋vp4CVm) zG)3ze8G,1,f-d@v% Z۞Nr>B>r^DwaGI%3r४ xY1@^cE ~L|_ ЕE(ФK09 }g6p"Yobjn715a%?rH,v?4!2 %nvA~<]Qݗ68z ԮDqh2P U ϲ>L;GfVqULc]15$(ð}V<{(4W3T9YGC T>Vpц{}jVV'[\tL4~Zźy([R_S8 uI_)AaLCѧE/i7ĥvn]G[$l[m\rΒ0q<1ΣzIN\!Z@@kDSf |R~qaw$+bo\wnB!i+oAGpF܆wOpәc,ߐeUɼd*;>rrD^VJ )^ 1s(3BAN^4=򓯥Xr%:&gK V11߳2U <$. rE*`f HCXJP*(-{oڷs|B'9A[z:zx<Pj #%$<Ғ)} PeA$X6AW;\]K#x@(]q+O-jYW BMňjC`Z>qo=l{B$Bl+y2wEB&.aI2="ڤt:57T&o(#w-˖g,:RdT.$v¥Dfs ٜI="=G|24?B뗷CGChfc9n j5'p&{'~?; Ir:=lQVc-yk1/`8%0=Q.83{:s FqƜ\),e<_ѷoƋdш[=W261d&"3Wlfc|ɬ360ZF3Ո?oO96'J"Ph\#gJ `@NjȯgSA5DFyȯp)NIL69/͆%eb-J0 JHeḆRm`0OW`< %"eؚpce::)w\w~0-g)*526Q^.heZQA_asJQjC5#Vl̴v95٥'D/4*ǥrC Yv֣#NdRwE%BrFB%T{bb\›ull{\]WF[ujjEm k;QYl=F`mcM S" +.rj7bcJI׭}u1C̜) %ĺ cX0~|~l&'IsqcCbZ8lɐܔudl5~ 􅐓Kݨs#"gw.f @,>jih :7⅄lm)Hr&!*u3XHc UAG&H:H7I΍A8 G$ZF` dFЀD+~±8^\a.HX,& 1ҼX f XZ+%pRQ,Jbu3PcF%j2^#4ڲE0GǦ37Xv:H6$pFB<|LV}J]/T.3sm_wIrөL棔$6|:=TrJVµR=eDv`JLhxrjcpѭicA?ߌ6*J3s^c! oW7'㇂=>4 QdJ'Gaզu6U3 ([[+oՀ3LN`lb84l 2BJde5uƸ14'Tz"Dv$x!+^8XɻpLLl^yiOR0IU嫷GaWʗ!:$P{QF-KV?=O[T/tcY\E{ Uaz.O;yLzq.N 8RP`a;Uf;mÿ'evBPH;F})il%AXy)F6z5n2PCr|"_hN*&}e9)హē;ypa/;)nT=MqdOEpOmJLgb;Nʇh'scoĨ8vq!ܔPtj oЩ, yCfpk ׃W-g 5Ta}V$ݥC8U|w:@1'$c) ҈Ш_D/].FDW*ڰjO >~rH?tNxw8HF`4u5R(ЧpBSJu'2]sAJWwFʓf+)B)1KNE팝P%@?O`G>w>)֧gBގu8PE2?to2c.'7oC& v}7d(8hO)su6j"hU߸@0:mAi@0U`$L${ f4={;M( Z72'W?/Upi\tU,a4J: ^ϒaWC  n,frLŨS):p3c#tKI#=yuPw;Mt~g s|f4noM}dQ 'GVJ<H~79C~ ?,-[ꥎ0,WrՀCb,jހϟ?IF8|WSK[N .4<"zGx<OJj8گ"e ?E_Si"Nd3[U='h6Fp1>4:ɞk]!\3vv{i5ǻ-BĽ#"3z+A Qf%#tHCJ#M#[LqG(Id- {xإB$©kfGݓ~䨗@0O!"`!Ah\[' }'UtC9چ],$-j\.\I(Uʄ-Ѯ<9{! ;Qlg_]ou Ez ~k6<=Yg@'=Sâ6> 7]}4MP2F{>`kBS`d !B!_RR. C^xCa])O;V:Go#Q#(Zs/^?bMz|w|'|dgWv*UgyOR*v|/i*NzbTSJ3sJ 2[Ɂ7 9 =@hVEuSky έ7!J6pAULDpbU:6߉D>y7TiA12<Gc!c$M<ߖ"jP#AO/"ۑm.YуnDEʼ?jpL8Q ɟ@ErmbxjEysŘz"4)]ֺBp;`ut] R5{w(% GބEm>QXˌ@)`jPl\# \d6)owo7)p1'$cMKK7WQW_8'_=|e8#[22_ $×.qLsaaB"K6 [ R,zE$Pp4oh[Z0@-pȝ7T/L8_fl *v\n)'*7p'c:.P99FnhN+l¾I0̇S1+G7Fn?Dó`]W u39:S`S:9o Njb&% t@1%#gkd9k5v>rwϿi"jrr(&GY߈ne(M_}* kז{UV(R?\b*keQ5EE)yW, >|Đe֜az/P7{/Q4acgE _W٣g qVދ+^pe2~p'SN1]L(!I7=}ٻ/Nhg>>Vt"'Ya`a/&eIodff&X*> pLP߃lqVb$cRXqa`_,@%l1[9 gԕ<_(\L; o.F u4Qzj^8yg*NFT'2? E V3v }00fuue $Duo\orx>T*݆ \K3X R##ɬ#ɬ#ɬ#h:::L֑dv~hē$?@%Ux:1Y8] u1a:d !;\;ljY2p\3M ꉉ4co1zf4#0!N_#G鐊E/DhnUyWeֱBֱB~tDށ)gsv:*`=} ēU;8maV Z"Yj~fVC+Pͨ 6&|P!JbnœQL'%,pYlWx6#FiKH`&kBナ-G+Иlc}*o=M)Ĺvprg2-V- ɤŇV('`X<a~0A&Al-4L^dSAJ$]ҏ^\pӄ=Y5ZMbD4uGKF͒>ݿ]4FqW5Qld&Un;Jդ/_!N񻷎SCo1dn/ QblBw=3ZԺܺ͢uFC^Y>Xm2>M{@,^Q㶤l%p+æk=yyż¸Yp|)=#@]`jDG@#pGvY ڰP)~;K `KALDf6PaFjeJ¬FMt2pKQg"IfZ>E*`Mq"ba7Ҿ}檘z}(=QzGQ~LcHE%J Jt1>>,NJ(bB4#~p' n''N^ywH:{\Zi4:Mڈa`m,fVeh66KYYYYYYY,00000&$:$̍BHuD"p n2^JKq#pJ~:Mf<O?AhqB8Jap3")؍AH !{E8 (u{eF~XR;CYl&=j.ov lj-!ګ瑿?p6 nw-56tQ z[zz8^:[kxxYIKq,Ym:9A#9%CH`<2kK%K .|/eY@<]`i/u??O_қϼuS%~p2=]9`tr_,p;#^gJi’gV|[KANMk( N.Ə ٛi:_N lq݆Ϯͽ8n*'XY./45IHyS`/\hܖ?Pg9-?9"?\bQu 7:"b$(nfun1f>@Dt/h#m0(wTq'3/4x"y,bSLQE l80Ywp)ބuwIBqA7&bExXD,̶hf8tD4ͤTyv\#zJWQMbԂv >.%z+ήD:MfEmyŝ 4Rzx#\%pBtF#(9Z 8x*L:p]D=h,]]\Vmi<ᬆO?=}\ϟG7w< ;Dfe8 NNys}= r  yڕ0BySHfbRU:-3WwIq@7uS}(GPDP^ε**C W} ^o=@E?ϱVbSF]M6^HoD9dl5W8z"DY)V!觰]4{A@'褷'~P 4"؊z38g,sDq <'cxx-<LeDŽi0%SE+]~QCM>y[׶;6&Aa%%rlC6WV̶O 紷6 4(;vz[e>>$bO^~FZxNoYo-|~D  mz48כvjoTZeJ+ `FwCn'Vv9+LMJqxW0:G0SC\#֝u.*M@Z;JqgݛH)xAL7۳;,@O̞A:Ga̬%.sCufDU>9nUcJvQQf-K ۇm2' UD׊= m3 LG7};JRD Tw2]l~;~~2 ݸ{^1+:uUJ\c9ttryt)]eKY\7u ^ GLNn:㡡qcƈۈjCbZgj.@uN&f4 v9>tnUC[=›UGSp0- n]bu##y뎤?#|cV$n+ׁ5֬+Q|~&%sS"F.e#eڐf0"aU&=quJſak3ÎZk@56R\u\iOp< Qsp gbs\ʒK^If W׻d27ǡ2ɰFOR:qD88;Q| *latuuKQ\hYOVeiFKh-9s4A--շ32NVאGM kԛRPwfϓ=ҫv}YJp&2QdMM-39SDht,/f[q6X3@7x~Sz qI>EkuAHxokmWu 2><_qIYAN]9EYG4P3g$"U`E [M.b hO ivWWE= O.^5s;bT:FI7m pc.4Id$><r*/R#+/PԪ6o(-;Sd-ה3ҩ5gbK1{;^O^d϶Ծ{Wi6.D7P9V妺UI݅]^6PDcZz4KN)z #8Zw29ra {0UL'Jd$U"ݥF|1L44X[w㩨t$A&M\[N5l %uBm#pWCHŝ_Kh 萊#a َVslg wɩ:")QBF@'ڍX_d-ef[ $eTKS[ ݻ{;z,t ࿽nd']d9>-Ec-v VDǼ@@@9l2+`@:vSR TtW 7Uwa|ÿOSipkHDuU_RݗfX7}b_E:N$ҬZHiqQ}aS{14 )΂atm /n\JE4H5jyN1gA@9#=l|Ț0& 喛0\`²12f,.V\dV/ MZI[nYe*F{tycU]hro*s"gM\YfMf)0J֩ -qVfaH)z=*^e4  I??đ#Jfmlжcd'Lg"=W/4^MSק#pO9:fkhn|9_'WwrakZ(fufz9ҏ/@5&v83a+ ӛ L^ca";OypQ*V4QP+} }Ae90qYJ?Sji@9Yq9n`R Z Zc_dS*. "b iy%u; ,U<0&A{P'?&HdфwE01 &\0TyC F&İ[xG0 5KO]}+Fq(^>pѸPOb]D8ܺ*@tυM o;_GA+T"pUцgIKFEĩ7%Я[!G!l(#^zMs{$dxJhDi2ʖzf3Mߙ؄'Ag5iJb,zkc5SFJm!q HҴhO{FGS^bMM$p݆W斛UPz_ɴqN-ZRYIO""%ej X_hd($G:\"AVE{ QOɚ9t _ZKGef.u7[#آXgt6FB  Q^.^6i9YGH¿_~ CaϮ| .?7Y= X Jny&C`Q hL4RqxNn9>\yzA Oq`Ղ/q/q/q/7b6Zj%K^/yLyW^˗_s|OW<1Ӭ/I=)_rro=sNq0 gr#Ғ^ͦ7J}_|MʂM2~![1A?ޠ74^m[O5hO0J7;kaYry/Gڲ^!}};}ͣv3[zYb2ʮX_*P0+]١z !ykQ-x=r9޻M,+xCeū*^,Bo)h~6gC^r?I.: a-n0^/ϑy4~ /?dlFGw&pr7c,73^R˶(5}ק%#=qP0#A( HqM>Zb&zb(Y$ Tj_;*Y7K8NG'iNSTc\y*۞Ybg a2}>?ʺs | L_lmJ_p;n721Q:rc=V6'mlmvPU,z'vϿ ~~Z|m0(ʶPG'7ӡ'Yv41ZH=Qވ']1-<}#oeφDR x_J0\v7>Cg)6ӦUz~k*rT,=A:Ӓ)RUNOZ(+nV#ҿO;uU,3AVȻOzn[o[[|O{&eGQ!"LPȂdxnM'7}RZb%UBJgcXHkl%S.GXIE'Zr\Kԩo~F]@jQ UݘĚwOC'"gZkJsrr=fQZۏPWܹJ$PSZ tAB|4BR F R ̾5NAql?FMCޡ{j1Η[/QM9F}8650oɺ|IlXoz4$֔nS/>7 ~е۷V)P&@ZGg )ؠYH=XLgO^q;&SNU{svFBVx,![\@gN’>+ %ԻRihs~Ԗ_ l|Ev],;; x\[Sbmofq%k(f6 !D(0)]J7 ]>M^xYٗxcK]Mؓ54| V$ӻC8 'Q$HoBXb1HN`a7ۺS+VlCB'&.O|\`'^ؖsc$:8 @J>![ΠL?H2^MςlBXZDWRܚ-JD_ pķ; 9Һ+ ~mn3 jMJZW˾u:޴-^]ʨz3z˲Ŗ$~k_}d"(e+bs&s-'d5ؑŘa.Pih'H6l -h.H\&I̖E!7 cŪY+=ZfhmO^z%;vlR$9ydY~3$AM]u:$`+K`H@x+Ƌj͊jKOV-/`;X#b]r9lQ <28+ֽ*pDI $IAs䥈r}\pQj=.+=^JW7ռvWzϵҼ07%WX⛿W `Y]zaHxez{:Typt lZ弳nuu|dZu [&W:~fgӠ`N[;Ln:P&k@)Tf$Vnci{Civ&U~FO3t^{p)Mɩp8|=3B)`Yzo{ ;Ybʼal@?] E`RآРu,0T8c#/e :x=9\%tv쥫D]fxpPތʉҽpy.0[Xp_ ;IqN}SUs9Y<>8Vzy};] 8$.@JLf(Gzf1_G Ku#7FTi!I%mx{%bf'tɦ4tPVF >xA ~{[왃ZRxng/[<;iA0pE l ~6_3ឆYFM)%]eEloUX Zgon? 8r̭NŽ+Map4><1B'h8z9_`Ŋ뜑laԼ 7ьl [x ZqFƬl|]k PHvXzU1HcS8qWxt'a9C@:[nOG ApǹPƈCH^L-qџ:qZD'8dCVi%\\/Xl`V`VYŰ)xĂ+aN1an s * ؏IIU1e_,V?&^FK`$&`ݮaQDe';l%.K6  i  8TKI V k+`;`;v ;icRxisqbs>g8*![xCI5(\jMzUC;i22p# Y3 l愰SC-B(̆BQ0' f!Ǵ?CMzďlV-)+@*/S<*ۃvodP86=6ɽs !8g2 #0!;atc\6G$^z`tgz(vlv,O~-F_Ֆv!> ;{:8 !'B6(]eT% Gv'զR`;{=ί]:+H"BRAz[ NI =1^ܚA9TʀŵcrZ/OBv򖛨Q3|aJuݲw͉R]^!<`wa,@Y,`'s^ϴ.)Z2}5i4"TWQp3sRmR/Iպqz)7PaO^%W~2;qJI'HG;n?nl %w)oDw"6<:7JEuл&C7nds] *EPtЖB_KH5?C~ , l\1rdWT=Dm:'F7m(h >Di0;-d&\Ӛji>xbEX3v\ӦHSk>S`"18oј5*2_?No_ośnoZVo*:=i ['lwl6@l{^9><9Y38` ,?/'wjy*O R | >777اVm݊j´ף68N.G3jmuޭRjxUhxZRѻ3эs|!F1:*-k39i$?l4o_J1i܍}vcQ29Nc۲jINNv9Se*P/?>'3R\~>^Sn+8✦S +X8 /ˌXV)y< i$i𘑡KC# @0- 7<2j3G1Gl̹33J_AjvVZA.HzDW鰝`i^̅\@HܪtZB Ϟzx>54{RR$,/]s+T١\:~<]Kȹp` xo~ 2`ȶ \Jg>r=+6?Z߾/` NRV{Y$_ͨY-oo|W/1Ŭ}ZjcDb{/^iF}֓6d5`Fr#@4lߌHCO+uR=colUu{?×b%/֣Yv$[Ѧ~Df-I1+;Xл8}*BQ 1i01V`v>quz+O}O,OޅX`~ O1^K6a2}G[6Q/0SKް&{\&`SMܧ%gC P1BB*BBS <&5BJha{fT3a h~kf {E큣`\ߗ2 @iwˠ|w3b휞pjQ`|]y<5lCEYͣH_m4\|CrkT~jyAk8<{ `w_rꟁ&m9 i{ֺgw䊝taP@KVk9;c;͇V `a8#j)@" OY=c^8e@[K7yl@FTix5-ܰ W61LNA4Y?:`Ua_*Nv=舐-JA;!xvQ6RA60PdtJ۠tmL4},tw8/'8"Go_CUC3~$//a5!Gir)#X~A t\/kP21TJ"lHT&*N*$IU;b,(˂9hDH(Gnā]}5BVZJh,0]/@+qhK5`oL?\xi\QDJH}*bmKt߯n@*,Vs|4-VbKlh[(Vk*nG}T/3@y[@KBn&3'F1ŌFü\1oPWtg}r\άt٢$3d.Mbv=kFǩ1A; @+K\ܽ,1[E" &gl&W3(SJjǤ8F8@1}YmҲ10 ҧJZE$"ߗs^W듨+uk ;x0rw0 5YjT*V6;$4iDci >aYT XK>Qmy 8EFtd S]a5H|tei2.y\:/!:67]SCDJ@cQI"qf,r3,Wu_3׆wk{4q(WUM7JG!FNO{}k-Irtq-z67x R7 wn5OiJ &݁e&A aI`סĎ}AM-TAԸʒëHia0֙0 K#KZQWjHb2`hWGQٯdjGpu~'jK1(i׹`mU@RS8k>p O6'%# -uXF-2w>.kKȑB" O,cq"u[ ֶ̋p>mgeKgL>y)/5MX&3tbiD~IT*ud'2'Ac1ܚ=X>jGzdY1GuS|hq m+ioRenAZ؝IFTasQ!tPAWC_LG3Hp6]Y@v/x2' zl5}KnԶ.#Lz맟-^l^Xn'0 E=.ܮ_{dC9a}<<X^ TXVd 41 V=joѽRQ'L4y}&ٻ/ޒ|vRw(gfw83P| x`y2ߌ'T w;`%;du{J%~Us_Dx0`YNJXv[i$m\lVCNͲ!I".hw+AhYFa$7Y*s#Yx+[nO}Xҙ} 8O^,_' EEl RK(a"CNpܜhg3=E=Bǧ<ҦʨC@ QclWh3*kڕvߌ:b^P N<=l`(# %ā_rHTxKO'##`Ly ڎgANm1$-͢*W\x e |I|VpQt'y»k.`K/6B3[2FNrzye_rh tady;b\Lr|V v7>+ƖYDU 4&H!X!W"_BwC'MdI􎈭Zy-z 3.⽇_Ƌ+$4Z2SV]Ln&FBn7_\۵j~UV ERͣR')buЂmj)z`(u{lB&zыCgvx^aEVߏ371ƣG0ɕiE6Y:Դ wgEԶ"NxYerlP)4/Fq93fF3^njZL1V+F:ޖ  uyL wE)='>j.b%2283:;ycS&~^\$ށ?#^ {`:eo:= ŪҬ"1q=<;8<(3IK2!gE>S,*H€saΫd=$ $^6ϹA eUj\SG,E-LX /e\VХ_7ٷ~h1"8&I-7Q6$!Mg/HZ&cijhpT"JN\%*@D8^ËBhok䫇z o_s{"2fn"\AP77+|?Bh(]I XJ^34e#{&FdnW ,;닱ikrX`*PjhG@ ~dؽKn/^N""7uuwVPzlT_sn9`U"F\ݬtp,eDT+gbWvd@ +cS1UOU ]L90h ap̯`;BqCT[48 ;qtN?n0 l=x#ac9rfAc"#B Yﮅ a<`bHB㉎I0B34 4vz (Y.j&{\77n B 0&66hB${.jJp 0 {@Cv/7/Ǘ\q/ =K z@v#;یs^0l2ڔm|I x@Ce:>rb6LW5?%?bh*L2 M]z-nOgvRpVٔn|Iw!00npŽ4=hjq5ew^ p8Ur{;4 N> ћZ$: QezCu ֌ʧݓv8n]@URpyy&H\/:\RZ*Ed|N@-W1#+`AA2*X+ AiXYpϬ+v+SvI8knVz/_SԣFҗ}}<@_Cv:tMrȺ&L~B"zn4AGn~6&SK<䢉+r>#4žqA޹V Cv_ܞ't3TG₯5ѫ]7Nڜ6EUeGWu5wց60`)UhMo\)Pz8McmMG*24̵YN>wQ\q`~."_{q\pok|rFUʯـ 6B\:0s|g X+HXQH bl51@;z0TɁ<9KH'< >F-E8[jKɆĐ vk^ِl$!YN8`t- H ~v*w;e?qSߜY[c/A9RA-|#BI |pEݖ Ǫ K0fGfp1/TxL_iY3Ű =wھ:0w BL<3Oljui~h=əV+gÖ'ث74wgD4R+}z#8NYM ;ₛ4|a6/'T3CH9Zbjg^ L` mK(OqHiDDu#NW64B0c.8;=Z%}y#:6YCFH;1qtc폅6n9і,o[cā.T \s։ Qg,P$fX>@QlNZtR?e?IwbPrn}[6ڬ wwk,߬Z1gʡյFd NjY'fmnd?w$wXOę0c#&Huw 4)/wʊ͸{S`}9>)Ge;l߀sk?W['W[K30[5Su Z {}\YxK)t vs6"[ ٯT~N()҅*l* b|uMWS- Sྒ&*j"&Ćf *bZZޯzjL.ue'MiL@QQJ~ |_??; s|hZOaF()RٙĆُw$|-ehCpppp(/8``.?/~Ax? ͗^cD#7p UbF1ksa AX* ep`H7,!f ogx!:tb0DM`C$-$EB 4a6u|9Yj"g1z8J~TIoRT[KVb==:{fNLe{6  61B]3.\GYƬOez32Ug" 5b\ȃ ?>:T:+QsR<:y*9=*1 ؑ~$2\Ц-?=Bd]Ț"j͡DLCD?URuڭtjwI8P+|$GV:x ǐoۅ2?^ۓMjv{v.gR4=[:XI=ǯl#Ytk SGD RĨN NtL #έӘ+H kv_A(:1)W842 _/pr^GsO5)WzY°Iph٤%O՟K?lRI,O=,*RI@Il`7eH Db}#(!o51VHkm,~I@ :`B/aJOw$?s#7xun3XV + Fp+1^.T~_ND }j'tF_a#Tz?[';vh4װPLXYpxey6_D*Ek֐|f[FEkn|ݩF{_Ui@Oyu$^AʾO-D4|! .f[|Ӭ''wLO:ǝM/w6^9Ÿ ?Xt Y`}p@VYᕅ+@L0F1 b1UD<㛥 Ǻs5B:e,@:;lwuv+Ư˔}?8٫o6F|rYs#O%cyQӖM%+GQCyU(=Nkoܲ k-m+ZVadN<$;/\XoqD@ujG~mgI;.owd_ëINx_L(W2M@8+q١x.IIEsl2pL1hPt7~ րNQA`oN'car<w _#3J&|7Yn*Nv`Tm½|LjUXUx9L&֊ap`htxkI1ز3ZEPY?@Օfm XՎ5]WJ7x oE]H![Y#'R}Q޹Ś@Ёerz${z=%ȫI06>u gҦyX+VE'Ι022K qWNTO_bIBӊ[.X(ײcUAhg9)WDƓh_RrIa/d2L ^tf & W9d1N (/Ba&X5Lx\BꑮBiƳUL譶"[ RȞ-<&>_ E2XsM%L;dZwC mkjV[2oE9*–:e[ cHe~/t 2>@BO?Om>3gO*ݮ)/Ȱ A(.RyuIӹ8.́b'<xGC"qoxJjf/ɐ /Kh2>؅ZDpWϫ‚2v7Q&@ê)tXHH=t"y]H\*Bۑ\ s4mFlUk8[x_/THibr7P8Jb=PwlXT;6}$ uyCqT0H3KJsdDy^9Em011y~y-  F $-+.^C 'lu!Ot'{ϕ,V yOu?.`0OHJf%J@rW)j;LJ0VȌ`3ysN݌t-dNڧ.9qT9w.<]{2˄F4g ^d<ޅl 'rQg5l#,U^XnUҧ7+Hq^ݮaCiuo\\SN5*8ϰ+H_2heALt- 03rL YpE*J:hj0Ox+l84pϸ҂9v, yv9;3ɟێe(x;;#|[7,t{dz z, b Uh۶3[Մm m`ePgtOq6{|,Ǔ4r!l ,2j $lgm Ɨ[!0 I 9ʂTq;[x`bv3;\0 f1.pp͆,5g:ʄy-2QB y5*DG%H|n+EX&2_1DBŭz;=l2^5 !G>&yq .g19N)o`RW9K3`A6JP4dx`M,<@HUxDI,:p&&ħ,J}:;%K@IVv H[ }UaLhr3Ir ^iTOJ+`KIb~`:4rPXR#9.aC6ݗ,({G\R`RW9@?:Ro,ɿh:Y}r`O2{VCЗ>>;(\iKoX07}DqlKe6_1 @,F>аM {!tJ-m=2hQ7+]4 j{ Te !-;BzYNH FUCuQS0>t*X/qjD䂕>(dWmHO9+7_ސKSY*I(t.nG*zNpa"!Px XR&?Q_9b$8^B'|/ZXS]1D C@ c2ʘG>f|i*܄ȇ1Y-^FTQ՚ 34bko=lӗ_6 U8)9%k r+S H28+$&LPzC~koH\ݰ+˘L|/UaYh!L .Y!RW5?i*JWnojeͰL([}M>Kb4Py2i­-a\cikay4O܁uu1EnV<[t&Ϫ`Jց[bFWY5 'A/2S؈ 7RR vMvO0- * d )m뺍;YIBՠ:Dn:^p.ؽ:Scю7Rh[ɛ;f JIwnsn)!pPyxSxL 19q[ )Wh=czVP^/s+'_T&(; k;d LA/Ymdh| ͎I&^`>/k ?s2!(c@r{"%r$ʖ,tN*{V6F_ ~A0ө?zfĹB4' pjKuq=kd\ه0:&:qxJMg%5=vR$81'~M3`|sJn!xrikt2l=I~pUk@V`Wg= `RMhQ`bX=z:G4e32 ȑ v\9I%C |[,ZM6bs?6'{,oewƄ8%W2bΓlW]=28YfH}P/}Yȯ5KJE7=-"I!"X 9a|nx:щt!̚ff1vM`"h!}3>;芧v|!R6C?Y9ɳ'sX?{x;q?l~N+C?J l]"r5DVJpEv~88:8Zb</y^<Kl,'0% ?l.fŨ:"R"}M5=bO̞-;ZHcs o!'xx h#FJ^_o$jXdB@<$8$I L0VxEȍ%$Z/:nUُj3)c/!>t&~SPJb@LLo`b | oX{6i a4Ԇ2A3+rԛe`ڈ]i tZ10cGA4ވcFJoar[lM.رDu5c/UzUl;WL%-KZ/$:\7d. b/uj:,Ǡ򛼀??hL8V8bz eyl!KQgt!)*R}=uIlٔJGs- |ng)*L_eu|8#J|H Cϱdmڶ!Ph6ln=|lMaPZԣ7'Fl|Ot6^|-^:I2pqE΋d14.ZMUlJyRI5֪+s-n=ZYx0eb18"Ѽ4$*)]q1w Dg_'%`PUhhUq9v7$!^lQB8kLB*JPt]#ު0* s=٬A~^NR)uyrj'.$ 9$_~Ip!P]: kp δln`tZ޾a}! twU;EIp:-^ʍKO4aUPgYl4o|n^H<gǑlʏ L}q7qz܏$x@1k)}1p)|!k@Ԣ&dN*i@ jTaz-Pa JcM &gɂPʈtrU FV q8PL,QtU/zk ] `^s҆A9ɇٷw7i(-,JT4~#G6e~ϸoxuCMFK"Nj4g4jბ 6}?:["3NUJ_|xh%TxK=:@hZpk1nOY8Z`օQp#!\^n3 $$׻H*0 GTuM$Kf_3;ؕy1X&N2۬<40\-l>"EiHeVt8qb!j :i!RLp{:<1j8H#g4W " 12 gkD`j/A9K\ XċpBC YѷmIP` *EI/j~[ |oŞN+k&to2 .sMrrdJ`YfΡ9 ߋp]3Za-Q8ܳDB<,A`hIm>^Z"K3{?'5z6zӅSS9ɘBј'<#VWMxG9 Y+p*Wi#uT!ߴ?㹜" >7wZlU~IUDRӬ.d<4?v| ],+9AIf' X9p>q<ģi72^,FwEv@ f{h1X b,֩f&#@ uǂ/B;Ŧam8L" i dјPjWZCf<2p]K||$0n9hvA7ZwFrw[g(Sl$Iǿ8KNՑ ˬiz02cw},6צZN_x.M^@XTi;[0jec~5BӪB*,298 +(ҟU ,;@1m CIiUG0,` :x:x.;K#U1N! <ЬEeUP|O'P 2Ƥ+܏Iqhs5s]RA+CS|gu /g6T`gӌ_Ef_CPԵg zfYfυZ68-qb 8ZKp"LX`y_*\/x;􋽗_0c;wshp] ѽ uc^y`qsad<ݔZNPgz/k9V[9v/!O$B@82\M?p=///?ʻ ˿'hk%.cEpiG@k^ޛGQ3# Q݈B xx FP» cS@Lg7t% I&~79_ݛwau<%^" v\i`w!i4fl9æpL<;`if_6 xs۴tu!ʭI~JZ볷ϧ6-dy 7ĸ˙?zi֩x"t+ƉТ$SZ,(ˎh:qQ:^iWhra"w&%؇AL OOc l2/SSK")0zVaA"N[Rò+qӓ/6cnF=\U`!CMYG1QܗU<[S&ahj4ܱp,N1v*$X'Uz Eu%]& #Bݪdx}=ny~{SmUQo:qWri_U@_GmpKOETK*D]^-~Q3l ;}uޣ7*ig"ױE%}iZ@+2ŨIZQU)V5"x%hx_B3e]4EaV\[-3eo F]@Z+G)tMޛw}~w;4ej`2/K*=!h]EXPA :vq "Hӛ?Z,C^ CV#&,eg[IU!:@X:U~u~dγ_GWܪ!,;]E&Zp|ۛX"-T8ĝT&Ǫ+Qn5*O-3SIPVB yx<1޵ j J-wgV;+O[u.'òi|lj%Srҝy4 n\ e<9^nfwXK~k{j*(<wh19nSԡؘ{fu2]]'W.=_zF:P54~Dx-SHd:K*H/B1fZ$m M mVF*x,mXq~mОm6¢]rNsӘm4;?kֱh&r|9Lxdc0XH#}z&7ԛ3w$kq>a^;msIb{sl,,+50c&hSd[ k)Ö·rvcKTP{Q/LYM^k[ֹjص2w&*͸xo'LyƎq`OSP("zJvI]n^RVl&H2RV H=>.aFmy 4 APPiy(;#::VΒ]}_Cp!X4J5@ uJiP|ВCq89)+cCsJ>O?K!???E:+4l݃؏w?)4Y[OTEi(A;>J(.4`yu3VI !%?&=I\dbte(uG+Z#}زQQ67~_./c`ʯJ~TI,6:XJj CjY1 &>ۑn-3Ǝi{6t` ̔0:ɡ&Bn7&y.Ƌ]ޗbw֌ㆇG1ID9?v<9&'%gJx—J<4]9zȰ@bu1 ˡF2>Z'ƞNcN҆[c\JA[=TySèNxǕHqUjHXz؉uζWcv֩aXJ9_:OGs:9uTw)AAT?Zz1c߆.$Oօ)Z!_ u+݇e1n7+lp= '>ikDDE3L >w ,[}H"Ix(}iMCV"ZW"$OaǨlg(rsE; &dk#U:v&.Es-`,p&8 nz7M;ҪJ4Dʾj̹䁌ƚJDKt1E0PHp| L ?(Qdͥ?*2&ե X`e?PH>eC!tMQD77֓Bz׎l< p'x/r( w%EA{H {hv^3496%1I=$^_$^Q󼳃ŶKveCNb(f͇_t%ΐ!|κ]x@z|B?X'iͧt\}5+s7BTZdqRe+q]-ר'H IcG FY 85qԘ [ 鍊@(DnCI*S^?M h泙9sJswgf*!+͉[zhm uw 8nDAJ^"( GOD!#.NKUּv86܋OqoxXjf/cЮڌ(,WXXT.t\W ֖/ĵ rt{fdn*q/P+BJM3Y4>@~~*cynXvM^lqLMA=8wC.rN3^~ո } sɒbmdԣy(;$q2U_rcYA$v Ȩ8_glnzm~z-&+x@'̓0\IJMRIP_^^`2_\!wȰkZ3;7V1VW/2M]-UXK<#?Z/=z;w豻W艎&$dz1N rБ9^^p|BR ;!R%CORDcZM3IHeH@ЭYnA'ʵ(()!EMhH0*Ie/ruG;.!dTrφ eo6:aG_w8/eNql YHOEdH"ڼpf R{W;3cO ׌TЍ:)?0<4V^[i`vu䟮5p /u㥹f;88`Ƌs|h}Xli![ [`g濏:?}4QvXe;P8[J>>yyz<-ލ&`ͽP CDx2|uGQ r]jd_h F/J?SW-kuG5@h.X)q޼u7I9+T,ok$ﲯo|/6Bak/j7L^ыɺ9g4 { Ɩ4^wT8v\>J&/LBa BrĂIF dت5n,*0Ip3G_\Ӷe,m3]CZ67-ŒWz4˜ͯ#͛[&H\ R;1J *: FF&DY14,H/$ZH-GcFqY'jhT ۏC L'͔ {1$j=j\ҕVŽ'lϣŷ[p]K=whwӵ%[nϐQK7珜k]ؾMH8 #uD ; \98q/^=i#im1 wL&G/V-psɓJ iSg?9-1 a+\ҧj#ugn-FܛWHLqUyǙ=Ӎ-7` Ď\Լ՚(͗94Q.0ȫ+p6u}L\DBVӌiL \%ĪH^׌pRA2 AwklƘr{̗ᷯ`Au\zi$x@3F >cC]S)ss#9㡙g<22|$-Y]?Vv{};&8*ɟ8'\5qfE:1YﯙcA8Z_vN\+}@ ^zZR- .nkF`(6ԁ&o!&1y9ո6e0r:WUZvЂPXֱ*c$S44O>3wpjf@2Ɉq,^~ yƤՒ/rzuA Qg/{LGhoH#DȎ|tjCǂb>:e6GxiQ#q fL2<=h\=p5pk7Mͪu9:C|=}X*I{X<ǚtj||ǦW˫7=$?~M#wz2ěG/ݢC# Ekz q1=bQ#=PAP។,fn#CNNi=|NmVM /* {# [g] V\tg)Ԥ@z۪kO;N<]w +m$!")JΠntB;N'qr- Q8Hh#oEB%bKR_⤰A16e9|qEXC l1&6*=>H r$MMfC[27OCޠ +nyuԑsхXlh=K]@mję|&ppySD"-#ag|QYkHE}! I2 hʥ Ż{;füO47NSH]%#6\ ]PP/`ɚ9:OBZ-6rǜ\d>7凊?@ZjZT=)~n5YRq|Q}s\pG%$!Y5Nm\lJh[EpxLZRIȄ(]Ss(^*)@,B_PNKڒfU&ȭsH,Ƥ1n*` õ8,=E&ZC;ТXC -]k3T^Us \ĪųN}ծ4  UZTЖ;Qۯ""Ҵbt]Krr`҉%0kF;h(s2l3(݋XU~ġ~$I GKXQ:L O;ck܃yE=W%M挞YY\+)YAqֶGyuRYwKl;@}d/mUw,/#&Y_x!UG78R_ߌ'tk#nq]ުAL30@CF[~*Q5$GO6w}mF5gbﴍwt\ Kx>IbS:TIH! b S21ڥce49#~%s[I*@]6U^um2b\?qMR铙i+:u6y2x˯-m!ƛlV;襞 6n-+F-G#f @]'GA)JKM zTEM o6gRGSD qMCp`p:S6)қv7p%T ;t4o!kaC۰Uږ Cvwkkv \a(-JoKx+B}1$V;=:Q3#ݤiّ51t)Hx1F*|4:k]ΉR#' (*rwN7Y-vgUb3t͆-N$JA!%}?4{6$EٓB>ؠMfm:HE٩^]衣Z pb%򡻊2sf:e 2?#}v';x-<RS;s6w(|bN_JJ7NH6}|%N 5ucѕ[=zmFPcɶv7|9`D=%25Ftlސs3W;u)zLW 퀻?З\,NH1mǔꦦ=WT f#঒BE}=Ivhe&ǎkr(R[C-պϽS2 &v8Q)E g:f)܄dȾ'c\-~R\M>!5CCzRWw<mֵ#)?kXA3::E^I˝M0A΁.+$h,bNrdײB-rC"@nR29〳1A;qv8HMZoGl?7)cxw>-|j+Ogf*ciU_#YYC!I ),w ީUИ0Sq>v%9]}߇}s`d+[K]xي{n\siRܯ: ~3R a|.Z_ԯ24/^p\0OEd=@ 4S71*5'.QKUvˌo U֛-_zh2!@˻SCsaM(,a_2Z]Ln&| 5PYoWҴJe2X B@tDcALW^:j':թcfUΣNaiR@UNcXΣO0uDKW]@=؉zZuO&RFdW1椳05zMhIX>{G 0a]]:V{-Wd-weBf M!A)͕;s{`s) 4F& HA 靊p$>a9:xwv/_;{8CzGYl'@jx;./ɀ+ z~?YB=Nkcz5]AN"u36 ƆnO?잠~=p/zetq]ԇ;)y|t1^_ ]Epdw{6KneEzuSl ./*\8vqK g9TΡ-REoyUb ^U^K'vi&$X$cCvh)[4ŵ`#XÀF0l{:0,WpHU,뢴~Zn| t>ӱNO0Y!]22BHٝ4ri,2ko}ӗJ Dff4ݵl27`Woo7olqoyx`u3z`JD]>Vp]=X Ԁ8q{NZD?SVD1[t&x796>rۯ=-ow<}k?EXp$Sal>ćp nÊ|o YM?+f!RQ "N랮{:rFnc4FaJ^:(Xԃ z%HCH7ޓ8ؓʉ3Na&4p0$i knUcQ._=(@$%ѓ0H({x  cut' k2!jtEq O*}gKQT^4dNˬ1_D)'[DH^FYEڱVUUd5'q(Rf[΂󮥬:hy=ZJc--, Rܬֶr;P vzct?`.N\dibkOO6O9TJ%BkfD*WJm-g%ʒɸ“`o1YݎaY2-C[3C͘aZW4FǴOl/10Zi!MuMPB{|yA[)Uc[JР)]Q"ҥN-^oރ^̾z@&χ[0&X./N@#ӔVM-I&g[EHȻ7a4G2~m?ojl1>5,&lj#oj0+lYcscD S:Fgajgyn+*VoY%6Cò3N{۱m6?hZq җVv?7> ;fMh |;m^;B(nΣ$!}L{ؽ Mw+s#E v{ JW'*]VsF֮?}_kڕ뎺ԞƧ;fo׹~ T KƅqDJ6詤]DJb~&Ib]#)M ٲd !ٖ,=~5HڭGMEΫږ,4y2.?MKh4z_#q;)q"#IDzΛ\ˎ/S9v':9$htfT)YB> y=׮fN4 TX^wʚ~v]mHq?5SdsPIvvTzyیmU6w#)(:g:/d?8g VW63=0lM2X2G.CAiׂC(n֗"pEK@{K<Ζǜ \}/*lh%45z͈~xͩk˺g9kU'P} 㾥Lr!8q(ʟ݌IQOYEj;G wPWFO tóiݳ#x7wjSX|̗lG_%c[dq˻U3iZլg!Gw+8 \VZ60x L($=r\6[7Y7#58QXx\s" L.56g!2Ir]6~5vqIq_%o߹U? ʗ9)8*BM,Crڣ:S:j}d"ڔն:XX"mh NA7h:' mipJ2N PB^no${\jDk\\!OǙ@ˎb`5Um;^{ tYd]c cqf _HW|cG؍ X9"4Ugv\9%Cиfɠ-"g06 zG*)Xc`y#tDqM񥚱9W)RWy 2#lk]C-FgN]JH̡u,ӯ)axobk 0By5Ia 1dW^'y|0<;Ky:Om?,E e1TCUvS#+{sGi^ʉ4W Kv2lu6_@cvNW}bl_@#"Pc=-I_@48^P1C:ȭV%y&|h 5mT]Jgg5)BfՠEvʡFJB QX[`!=9Dg;\ozf&z "C[QjRԐj~ +$Fv+DaPsEA*VgdEl^7XTΥ]U-gh5Z3zC)ugMMM}fg0t+qY~,|@;{$QRvИf 91[R4`_ P[-Gd}sF̖:4ꪜEݵ6 z *XYmXhq wD b2q ?f~sԆl d1۟K{N%s|h{LޡQ۫ГoD/ɷ_o$^"$.`GQ Yףa0?DFY}t3L:Ae 0t.3LTp<$9w0|4U䶺= Na6Zz3܌'㛻p>G 2o\Wab`nz7- +HL>Ta8fQ9o_/4,`Fy]%P?P. GH9Xy=9\@Vᅖ1'ev^nuiD[2? 쏐Q?vOdE-=  urM{#M:[_-aSsjӐQUmjB]59bͭ*D6dL"kbMVQvݻ[Fw|4<}AF^GHGɬLT$`۴ 1ބJet* )ܭHd(Q D!`MQ2n0Q2䊟\sʷzJ)iL- O`Rϗߟ(Oh$idxiVś.{ o5QOD|8f> %<,T;"kڿ4}sTfom%Q𝌔Y ]T1\V`e\Y;ЖԼ2J-lq[+W5DPٞ4u'ozDҼj\2A9K_0WHE%:*ʳ2m15j&W 3;U8pU[́lD"aՑxtW Y^j_]ES<Ɉc7 #Mc\>v(4☻x۽&b1͙:TchUZء k~2c;q64oEy`cUo":(D(ʐ-[S2X[qJd2Pr/E ?Xd!IIJcZ*8hX gVҜ4 Fר32u JTLH 6(|OCoq)96ԭʝda[7(,FnGA}x*EJXVNcr [g1L'쀛N瓖?2DZo1#bLʆ'=)gn=Vzj/qΔl=p%ox6Eh^cjlB1z،O]~ ylAx I/Ԥd(G BI}T_A @mkdf"Dc3ހi! U7_& } o2_.jƯ ,\3EmkzK7d8| [x4} <͵:Esy*Ǘ˻ F{;6"Tym| liʽU7<ٜ:YUM_6Glqls;Gmha %do῭G/}&I pv 64oۦ ;aj}dL(Q"R: CzAR0_=?_h(dUdŦ[d$7\ Miۘ~ÙP >Zl"44w]1crXym!X׉Ԩ6iU֘BDZlrM"55#)e(B{:L hBZHOnl9iݓJlQyy fVh;]®GZ JA>}5^#)[0d *g$'#~F.3 hp\l!H2ڝLk\4G??{ƿQR0|/ @0d) R̐IgKvV);'Kް/Bg nNdﲇP{z)S_)^I?4SL¥zVh1)xd\^yĵ.r2X/`vptLѬy `;!YwFkp;u'y#t,е̮YۭU5'zW)-=Eξv32;8<p7_ғq-#p!h1]KY'[ j댼Iuq9t/VR~^(ǔ;;pUMO1mBrû!:0i L8e)S]w8c_{4539&߇٬?zW0ԈԺaA6byV tZvn7T^/}nYe>ZdH!6zD0L2M| K֍*{ƞ?C$YPܹjᤕX\QU֭z '0mTrB|Ђ`J2Wq5by+VE7L%_v6z :݁ i6:;ܾ-!Ev' n1?\[Df vãnf Y%^񉽕0Wjtב34%-&9*I̮>;3IZ $9 MйV4F< NkuT: DPZPΦȝmZ y_=*=-8xAs`0:oh|=v9~E۔t8R}B^si)rjfUxew-zumrn>-V`ař6C#ʨיǼbP h#5aW3eoCH޾p?g!K{5ueQclZ,gbK+=?OZf-*/z1ar h/tVvtIp8,g9Ou;kmP-8 rǝ*AsE}xjOt5] ,};W)YC/j Jm(X3v ڑsCcL3gw: !Cr(A~4wp)t-:r{+` ?%ѿ5 +sĖ%vQp4tdq $^(_7\b{lm*X :Sm8hZ7WLi@D)jT[٤59s6mV7d`Hc{'Wdy\͢(sx_uיvS_I׭3 Gt׌ַ͐Y>mb*r%?6]iY,Qj歮xԇv:@G>0M0g*ml kpѤ (G\e&N=oґ\!R}[ e(@K@FJn:>87.FWMX{k1ŁP7KN:,aϗZ/ףXodrF<9+j% T#NJ8|]_n[D _FݗZ;f~eI)C\SN݌.O2f>7}9h(;ga l ;xh\'ȎgC+޺%][눝@~yT9=|'Cōb}ZkIaV0u˟~(-?.7.*o6/*_w -U/j(dTA9傻`i*}k2S E tU}IY?Z Z1DDIQ)@^f2YF9])9TdsN7$c8XW&zlnBqWJd_1"CXfnRL1)+ *e7YD~<eԗ ~:^;ONS9jhxy9B5b>ju IUF.1eCVVoT;ZE܉IY™Bfm1{ zj ]AglIqUAgkiw4/0sob  F1n>s0C;Fkُ8`=UўtqSQ8b4 9&}(]|ts{=p5`Eƙ `2i ޸썟d[adzB(5FMR- )efnS=ʱ1.{1 B!-^үNװ-NfW= k0Uca\sRx%֙i *gؒ1/αw>TxU8tsɖl0a xƎ2NI\ι$,sk)Q}Tq,H2uL-C ""U|6{'tW6…ɯc\E,4!jLHdH-$Uؖ_M8xIYooQślO߾RQfUp5v5fU?k|͌bRlt6"Uo4NgxUz;'(dp8FzM [|) b5ڻzN]U>LFR{jݓv8n g"ЀYhr=k^M޴Nu1#PECcd Ϫjxu^A >#f_ u[" JKY5++ո/`mWU!䣝7_GxOd. ׾(7ǗUg# ƨ*q!qxb^q=q^P8`֫ v H{edڨXd\l9CV0⨀<}A6Ja+ P v(OOD^]Q*,.d+|] 9@_J[CVT`t JY\_@WJ.wYuxG z,vxX} 6h{l3ĺl ݽY+GVod*(a"pa8h8e*,dp r†svrpd EwOvy]eHR rygK8&9`'}]啸=(xX&[͍ݢne0Ә}rA%{S k2ԑDN@2a'nO̜-d" p~ NdJJvp)vON$GkڷlQh,nr*Qo,nl|xfUIxh>6K-E5>8;ICK@R6iõ{j~+P@ d< XmeeijQU0&H^1]3!Ω%5b:~єn9RcϬ!VlO/Ū|xߊ} nn%d +QX߿ElGf5/Dڪ^eܲb=JW#ΐJxM/A5YzYEe|XYn|,ל%dž_Q([Ãmdž }[)jYE~ѷڲP3]M0q  (@I%F5A7\{ݥVG_ RHEVHe{ID)4b 6@f4:}՛{uzܫnvn|VχYaW߳%؏}Q0%Kϗ$$0 ;U&=͸ffM;)v}9ϟzrlFO: xܪsuF\m*<\0eaW{I]%eHK=Ћixx/iK9PM,$O|IJ$].%/K^65kƪԭ1?3}_fȱ`ꄦ}ܪT7qȷz ECv<!_<$MTr yd^rm#UPGS81D_=Zu8Ӫ<͎O$ s}HlG>=2Y ! BHN&Px@8sN(_s{L9rvsL8|LkVMoWL)N0bUdr:gի +5?E袕y_ 4xL/Gߏ'a>Yh}:OTA+#F>Zh!9zκ3Wÿ.Py/JH/غ/غնO85)?vuV4 rj#A 2-aߥÃ+QA͸x!k/)M5VX;n2Qfa wRi^ӻ*w r,ojE@ -$X E <`tv/P)0ZƕآߦTM kۨEآ!_1^Z(#<$їCZLKH1$vhs'0Ę*5l*(諞,-] C1b{ V_[in.;#rXl]Rwt :W\mrU3L9eL^cZth!<}?eݛ*>džZtjȳ8^!Z {:K:l Q=9"=zd`Cϔ S ( |ȫU{-u[!yRIl*K"Aa 4[.8h+fr:~#B1mVÄ>^J@6$Ȏ—vͨk`2;6I\Kv\w zv84i]F;ZQ)y|4~[wz:<@[=y8p MsEPt [3TS 9"|Y!p⠚y PG{}tMg29ƿu"&$MB3H*|g汀lJ `}~cn6 VQg7~SGbn Nq6o봃ykD:3:: }L_1ZQx#0ªdow?m0676`%m4x2?6fR4PM5  ]F ~֥T)-I?@"dEo.YAAVtsG8сH 2★★˜>%0 }x`zfc.hC.7{_ xŋozF^P.ҧ4<|LCˣr|φ>\Ё L8{.S-ZᶘuzeDD2}vC*]1KJsvOVd(TKQ?u$?4:0 `|!y79WFHY~+~.>ɪZ5FK]&H,xV  EqCvԋ$]3=py4„LqHB\)BHb $n]l)ڜfiwc_FR8(y1D}llhh#6K臕;RdGKZ IKݍ[Fp}bqԩM8E`3"ht:!:FKq7EZ5w Q d1H&naއ/QeɩHwp"$ 魃a`2wp0YVvQ[)~_vzw-.~KV%C_n8ͻ%m1Fo6q޼IO(RܲDk2k7+--SjfUSG~)TZbu-RXw`lb*mB:ۥzDT: "\@v:"oA4ep$ZkxwҔ:jwܷJj~ ho f*M^kW2]!gt׎9n D-ڊ;rw {'&9n]xmR{ZkX:id gS},2w8ւ1 fjOC%L?¾vL}mw;lF q p`ߘBgѲ,}y)ORiSs8L_'B 3;|inR}9DpnKE{6Ϣ7@(AnqGњMGa3zjAĶ85ٿp$Yf|a>eo4Q#C h#[m"e󢋈#"L0]O>SP$g[HE'iz>ZDoWC;lV^=ܴ`5p 9Kу*PFЛƐUS|Pn¶ 6WHeZJq^;:qE R)mySڻ|>/kY\*d:S'׆<riD >1EͰi͞=H;%Cfת *=X -S9X'd! g ķ" oFkOq! x~IM O k?-||=yL +)lQT|J֢b$dd$e ;$yG{v `4K" (őz k+Ub9e:*~sT}Oݡf~;H|}Vcy>nsr:G;KZŖJ><ܵ[]f}&Aۏݖ%L!5#EQ2L _RR@ ЊVn|j3iSAqY"dE#RugE-Ͽ$SRPGE0Gm{6ˀZxj Q1յڷUv, ۞U7>I;g(}zlgwSU3:Z`/5>GYC-9[tT!}j,04oRG Et FLNP?mV#L=2k+Wp >w$V!'jAC:d#0sFum_L>y=Cv2"s*x2]Hϯ^}erWξk*0HRRڬUBzЮ!{/HGoޱ &[/žM.`qD7+)FMcV3>\t0_e5]Ëj^T[lA" o#Qpp%g:RQذ$_;>٨6NB5 ^h0`u~x^h}Ѐ^2-(FCT2pCb2 %E_'i8?v P}-EܗS3;x )3#$nIN bѮ:BJl2 gvH.Ť {oE([3O|~wH1cX-RIv ɜ&r[=K\v%Pl-K 6*1h-N#9YJE6`oR}J1/@Aw]I˖f<2U>`$Y%)YBf}0))c A91SҊNh_} pR>{n(%$^mRFƣ;͗iQhx";ds' c3@ Tp߄Q ^kmCNjF.SUܭ/"T/"_NNO㟵(2Ay0sVR@=R`!U+_7d2dc'U/$d`gʎP%m S%84G~Ϫ˜IٞUKu^P:kK0@_4$K8w?d:{`%6ghf mVvDpQ>Tњ ۖex7/9,p^{t)%#B, fIB/Ɣb|5vc}fgN=Y]SebI0KM?]C).;43a|V1g,:yy=r..%4r[r(G:mS7{}5nW:!;f3rzp Vkrd)_df%ru2w:5SIi5-Did;Ntur==k*hAiZt5W3"I*979Om)0PERa5 tjfrs ۱K1 뽢º EN>ax lYyWJrzouثS :R<3v*4xi[noim+곸_ Qik3WoӧJ&i/7#}0xi9 xaR8`ض+M]0zN^xG\e9Sr(9qG-j_j ^{әm8sCEp{ct c]^pCc]_uF*zO`ãv+ti 4:>3Įwl0ABtv?ZxΩ|۶%,hIW2iٺ᪾sl P[2o&S T+r3(%8i̱g6w͕>Qi^~V JF[Sc2c +9[o6ȶA:Վy=+ѳJF1GGIexqe%{k%.&`4JEnmMVH ͞_y(r@FN}'__";8Ĝ4 WLYI)WJ^;<;nU p^GWCn)Pvy=W#6`ĹH(-y縻pb=_ ә'p+ <c;FJZ3 #b!QOwKJ+;p}wLӚ_]j O|Iژ>1 yLc֭/WWb݄eٿz7ôުk ^E/T"(ώn_`W­T&9}h[~уmj} hWr+():ZR9H4/(*k?Djޱ+WZ?0k!%ZK׫w;ڠpf/\цtk6i,-o[yhjWe'S0~FJҮ5Q/[N1EG,|U0A!:5ۋ/N3s?0D$p !:g^BD=NkתY9 {lpt)c%eM5u ^^ui:~\sǗa_ ӏҽ"P翡Nw+€ס,wI^˹76t?nڕ}F]?T9cfBn$ܳ\jIww:L!!.*bro ;%k-z-KؕMԑmplv^T涩AZwG@heT ,Fͽ(8S%gT&Uj38JǴ8} ؘYZg1 x`/vPLLj&Drq?o"[̮9_`.U>kTбi5}27FNnb󗮱R/Pcʷ3L\!mv6Ҍ`9zxaױŠnG}:"*"=.jtӬTc觤)?ފ]r[9=A9|WN_ǹM ~6CD[?{ K=)=꾂sdQ!5X50G[;śZQo^}`gatLٽ_b7t4k0v_:I j qxϺ6ֵF=ڽ:ӻ;+Gleg?ë<*2XN`[I Hkc=5y B ˀńFԃ|O˹1^J5F0~o X#جm0Mml[?3U:͡fU?"^=dgax஡[8q !_kd{V+wѯ8q_ZGqvvOi0j{.2\#@Z"2cg'l1|imx=?yM/7Я9jsNSʝIJݚ 'D9#3Uͦ$*RnjM5+oWWSqpiI66p,Ǫ9QRb\Լ0_x }NFpvɢ9MB,36gd  r^jfNjl.K_(g(6NU2t)F7p6#0}+թʃ?z]sg| B^H0N7Z.I$+k1MZ2AVI<ҘȤ ,~Q>`~wALJMGkdXE]IT AA ?Z }'ó~dċ@C!(=n1.GF5}VݗFrxyoX$_F0*U(7;VI󰡺x2_چokZkwDB >ٌ *ut뢐z8 zB{c(2QGl$(  o~pOkm00C)i`0|/%Zm`>/J#fJT" V|{ ?Kʯ3psq]imU:ڛI]o4̆ߕbFܷiY=ԣMk b77ᶸh]2%xКMƅkk1Ta GαvݡpfzDPۡ*9WUJld׹cم .`x~'75-*,?w8mîP\Yb[a T/*L xpL#+¿ˬЙ d.!$Dfdh5Ѕ.X?~eeX^72F!HP*d z{zeWЫdƦJ1Ҵ#r &H)/֪QC P5 n| 4]mCǽ.Lh^ hrEre1Jl^)K9i58mfXtV a![r0ޖ0ATZfO2D˵ދYX=ZZ1:J?kp3>[YWVtYݿ^BR-%;2eYm*>"Wd]O-?"]i%K)Dd29gZhH!1Κ,m/d]ܽ74&l~eSQ_/}y_OnŋRy/^x!x!QFψRbC0ઋQF ;N+Dڛ/\ Ew3ڢ 0 >l_v囅(߄;Xm2>R&s #!GxFzPz3֗hLPl)ѡyަAđ&&x$<1 q'&)ɚ3s,V܊3C?S2ڄAلA1 w7aP6aP; Xj^J{pz_##jtz @ p kLCrxg,Szu|~㻌 Fm yʴ]78AZޠ["AwвR-vF 4|BS|u ٍ{΢~Qc7&D0,ûFcgnk ǧ+ŷ1!W:;' ~Mep5/w'S~!\Ϧ7If%!!؊ӤI+}cFf(֊ f<ˣ?$mH}?L?6ٰEZsa|Wa]FM<; aZ(CoAD R9 2NяM@6~(0_ؐ27鯕ߖu~>ԘPd?OaWE%XCIkg5:b"BgKUrmX`3c g0uhz4Իps-^?(szU3z$Ex `~Jwlzft*.%EX6ɓK, fA3LCdfsRDUu[1",8Bϖ(ӦbDDCX/Zl ,O2wadw؀U մ0ni`x@v"%g%8P52/6V6X lIm5pխ2lrBN1 +F&^e׮CH R!URqab-ul"\mVϊY霁\%BϾf;Ň74.Cmh5\P'GG#tb-, SATl;]^~mnR4jYt%} Ȉ Kt b|%2odJ6zI&#*1| [C>:Qೂ Y$3bu+H n"tqx7FVp"?c95-!*p !7hY(5C˝Ygx/Ի?3]#GM WR`'_X%I&i:S3zZ ]~xbދ|g/^0.cZ&| >{ Aܠ|nP>G(!=\R[gixKqzW8b5$44 ۟@VvNSeP !b`aHjc.+c2GeL@ӜC`S;>ȠdA %`%fn79 ;fT:N!F-i>=^ް$v Kg$< ZfҡьetN* >نt#R#5O%>2GrçLWA,$(wI Oiу*35@JRv[f\mc,[Yk-^:N'AN^9pzK1>O 7=:~K;ZRv*/v{^i/k>t}Fk'E{\F֫n6v_owU4~pc:~ NScRxuVTͲ=VcTkO+;ϫ]nS=D7Zk m~fIy7񽩏'~BbŸl$(wSkzJ)״y߱SB$Vꥵ^cg㑾#{d#}3g(Bzc|1B+{KD%%HuH&+v3k[gMxknਙkoçz!``QgPWuVzMmb3֊fְm9H=C҉^+DscLm dQ%U&f~:PIc!{}Q5{HM:'CSC@a 9Saf$no댠E"xxsq5 (ͫFr 0Ob3/#}hS a8ݹ~&Z̢J5øn5jv Aay޶G< D4b*薭pʅ!-xrq#F!E或= ̓7 _@48rcr)*dNGgSѤ8B\c41 !/coG涣B&v; jDiUA' v̐rԝ.vG| fqrTtU?x.D&higHuϣ'Sϧ##B30ǥ*[ն7A8мu@Wb{ OUh|sD)J͕G]l ŬVP)a=I1ȦI*GS:6g[Y㍧f:6hh<$&;/_RA'dvv`xc708?Ӟ~ UDlP4K:qN1+iP{!3PeF=-lvt}ާ @-A13;KF ܖFDV ly4{~Ê L͐"B[-(T0*$qJQdCgu}d"%&jM`Z/&0WΖ"e qI?45`{ÕA2 Ѡv>ҩHs8DWvA&jsJNfuF"sXkX'Cq[)>VՉiQ@q[e ۖӲ3oypZ)k`#r v?|xY{yj*kAJx@oLDT&[>蹌"5 ETX`%&NOj-3ʞ$)\ΦRk]k|CI,ٜg'vp-вcuE;?$qp~qgD_a ک&M>|EBᤫgVfQtK3e5lֳhAj~륅4z>ࡅWjA Y;!W#9Ti! U9W#rdx3yBFta墁1} *) #4#!Rw&&H vndmj$允+|O> t VJJ݇N{[Ij s]%,&l$ymx!"Q1%a3ZWbc}!&dW5%zңČVsmr<ʟ :jS4|s;KJWZkHBwe$ fblhw$jp1D) 4dCa9eV+bՂ_İڥb`H Tqj#!%J}9+~1>jNg&Xe`_qQGDWYNoEY}Q.ʴ((9zТTpWKϺZrVZ-Z-R;"<$4KD M#sž',%=BJV҈{-^5oplg.&ޘmF e5 lU| İcœq_5*І El1#G[AKGC^ gv˛,/ǵƠX c {е)FK}Pn8pz "bi;2}v˚kSfX$KT MQGWwJ\c=A9 ht C.;@0Pt:B-ҋ~7OP'@΃q3Bo:^V ׎%~̕"cb+jZޑ7p'OE ]^_\h*tux.8t޸w{# S yΖnU+˂ QuɜcnG?Φ_U7/uiY8Nx?V{u--嘚 Mi +(twNvV>kgl/j3,hyTwc/jm ( C~QűF@-!Q_-OT:nWە =նHI^A|z):yGHGR*VIRJ>?y fG1&StR,j4(@u ViR ]Lg@pq{/jtmOe"\y-X>‰q|Ssdn($U=`^{{ ゆ +r%ݏcprma LY'-~ۀ.DG6}C)WR?",<ɇX'k<0\)np5M'S8uuK#q5(V8C% :`CX63;rO w,fk(c?G r"__workC,N@QYy}F/fSr_bIRN.YATGHNWL~%v~ދ^G./5joaTJtbF6wIihZ_gODlOw\,WjBcB j[T@j9T?GZ{EDUZ?WgQ`4pC `A=$aV /Μ)9[_GbC"NԕZ4qZ-Ov$YYp{W2o[xj\$b a(m$ر'/- q&LkJ8KJޟnُQ_2jEGОIXd#Ru)QHR9 K)T޲<WRc`K-eX@$S cWpG8 xqtwSAn$;o*`U}C]7ņ͵"6Pa,-]ʧR̢b T{m F֖+h9^@Kߞ;1SPR,Xw$$#M2ꤏ4IaDlBh(l HBT! GgO=,TĀ^=V 蘇l@(?rvD2*L ~#FMOma _Ny.-)LӀ6fLd܇?-qdGmH^T~K m3E$ 2m8ۄ<(̓.{hM,3(Fx fjǨBzE.~IfN?@j#=n;*vz!0MbJ0ڕ"Pr`AY=w}bKv~A*(*Ohl!1oa"e6Ozw22&6?`L#&w*&0Q~Z4uKuk#&h9=xBf7*#oHHb8S4=?ž0V*/$S0TJ\dNYNA,G)]Tt Jci3Ԕ9r@O$wuD];c#veFČ!9BATKT>_[ 1i3钤h9  `r1 LZwYWS(0D/+@DmH4<#E gW)i!LFj0֜tbmr5amBrlR((h"sü Lȝ`ESyr։-CDmCMc:LeZCr~TDAF6PJQ &$^#&5O'eeԉb/XUlKFGxFll1O۵abŇM̵ЯK$4.LN4.lb'e\̊qX;.xsܬ~9^u5ܸ'eNdnTBKG]HmnK*cWJX^مa5:d]Bdzg_'ncD1߫$۟xْ#\pGbd#bzо!FWţ=WS-[6+\F^[q͉$e&W\bCKquA&ouajcںHzu]b9KAv֭tSRwN֫) T\ 0!HkVhO.eǘ9U :Ltj5EO҅6Xr]$> u;1d.sLRN?NgM]޴a%\|haEtbdńQkR+5? ;^ǹhR ٪IR&ex<FRO7iLވD,?-%Љ#Cd\ړ4"rMY=HmBHdM8(謂|I^0%IU4(1w*YFN2ȱ{MY'Ϭ(TM_2u&~j|]'%!-) Dhf5 pK,⦘F{\)P7ؘq`w'Q;RȬ3GdmlC9wTA3%TQ?exE  ra/yf04bֳJRrȗK^օ*|+;DӾlR ۭbk[-z]Tbn9怏#kvq}\{Jf0$aAﱍt`R -:'B?KeْZGwIy]]=/"$|<wb#TbjŲx;M6o]24::d{"s]Fj v+ˢ%.EyvBs`Jo%.ӢgC|l?Ƥ%,P&p9_/D mʐ<$А4ĐXcHi#Kҍ.zV:,XZ8 Ω혎 ު))qG#d=<Dŀ7}7֙Ȗ&'މVT66% }"tY=p0eL?`$f93`w|[/_?r;igɟzOR٫ةVv/yv_w ͢}î;Oў'~<{G>.y^{j9IW_ޚfnڗhR/Z5_"~M.D bf [clSnLo3w''Rh6Bnwg?DQg1n *ޑ,a F a]'m#1<=>p70*݁ ~|wk6j. HD)|>% 9>Q jC I!7\`q:}4.tVq?Moc6~n,Mf0V5dT~@_|¯ n55^CZn?`OZn4:8E5vzGUqeKʘN3E x1D#5`($gT9S( 'Lh8cWϞ}qrW>>sigm5Q/8;vLn&Ddف$~ mGDT~5%LDgg(\A6ͬ f0 _y:* } vp}Ҡ,}nVO]_/ڍGĔbY]P$<]ESX 21Qy8J1塧_PBF0B$JϏʥ}>>.&@O1G0LSO 3}а;AFp8YC0j\Aq~ǐKN!NqBWH8wqL,20nL27˯+k00I^#)h3гdQ'oB ʯ5dF\qB F]`xmlQ*/!0~ z@Z:ddnFmke,= >ml>5?X+oQ'c(qe<ڿx䢓_ JR5~+T p #/h1&, MGjfM.+r L>XR)%9qQ34ZJ[-h1e.$/)Yg5 sc|? kz\+,Lrʭi~ep oOr *0g *}-1e.$ND9묥GXKr|O(@ s$C֋g]PNXST7RP:#zM& Mx0${3̅wH~??\HTP5/"?`p-Β)$`X 蔣Vk'$}"*^y!T7SքJ5S_"CM}<`NU+U3 Rҡjڠ8T[8^o,lqUJ[l4/~9DN'kHU o'4T[MtfF{̦dt7'."X3@g }J]-Db|uffvLz:qs{"|.?b_*r\8ynN,["g`^Gc_h1y ^fΕMsNcX? iQ<9`HD;ªʏ)B\~831N>GٻY/y[?e9Jk;,&\}X聶!~'VLA9 XWsOR=*RBԜ(KIˍfqNoh_'n^6|P9})y7dZ)S8Ca K/" E}| K0V)fdB)y4iP)CL8& lڽEt3U-GSI,Y&nF҈UYSq~^{@s Awց[S%[R; p"I"nʀcpkY=lsTVKOS)γ_&mG pkÅPA:?Lh_y&ҋio&Ecq`r| aAbB8H$/S- @9fx{xmC  k{.L5T;wFfr=x[(JIZלUC)]şG"k7'#]JA0CWE'T*\ٓ,94J!b?lU6-/2e&LrReS矰+@c?>]N!:V^!Sp[r5BU6峵6˶{FU T?əwrmQ2逄@Š#i-|\1WHPWu(btX~oubnsE x6Cf́ 8[yq_VwJ//0(OFID_vۃ3δ(i]2(I!qlD/Mq/Κ1z%Y!_^er){EX eԖc7w_VJ?S7_CǓQ,]G5| ϛ{+vo3D@ܛ[BѶM hQZ4X!zI13ҝ|KT /__c헅]`MBa=C";+ \W_GPӠ 3B4Č*!7<|DW렎rt CVQ>I{y41 O<OJ1ΩA"@Bj4;YHAQ `pqv6љ{=ٽ i5Ҷ 8좘6nu}b3V E1!ZLrזYΕltCp,nK;|z ~Y m=Mx3- [vW/Ũvjy?i|ˉ 2ы ^ hd:@1U|31oA l9k'6| /lYYTn@Fpd'=NZLW꣈[NbXNNVY/eSLi_EI,JrT෵SĕouT]dcN12Nu>8>Jx_4%J,~#-oJnSMl*!Ip丽XhO*)ΥK _ŨcԚ=K )zrdReh$%VhZ];+Pr3IN$~0rb,qL%\mo&A⍜8"P}Y! %hrD,a[yp@13Vv i a즷p7DrD9KJK,f,QNR;nЮ6(zNSݩ(OZh=7= jd?Y!7h=7h=9rϪgA٣t6@jYpyi]?e+-=Zдi扌Z|FRJŗ|P\wEHzTe!"KCSiQ%qf̵l,fbl=ams" W5?&NA8>*!5*kӣȅ N($ڈ Z*aiK0+˙;mmJyDޅX[| VaFr!@fSӄ&8&\EI*13"WXgRK׽%3|b:M#i+3_ǓOnh dj9TZi^ ^ jw&+t-hNo^L^XeSnzj傕 G>4/CӲ(Y!06d~vVFzݓnh8("0ZXި8k&Eb:vU= eS^㩚MM,(O$F֭9P`[T8O;M]?֊%t4L=\38og {a%;ķSa_d=Bq@@*ʶw?dsYfl;ۥ{@'qf ӾwDTμ ^i"R"tݥȫE ?T+p*Hq[\ ȁ6BLF!&A:cWU MrHĕ$ti9!t2,0>QEG.s3!#^l^(L"5?{jO)^:47X rX_jF{W/FK94N}~٠AjeT5SH~k潴!DSë*IQE~5r] j_N3%3/p߬]4ݮ5H&zNAᅱ JYr'#^8qtRqB}"8ٯ 61PNA !iFDq ,|sfB5uT_r웑a7alVܴ"-_A̒`! %IlXP)pRt1S]wt(֯\3sc_cwE' ,ć\;#nC:t5IQu؏$lGqJk7;Ei&ɴ )PJJMM<ƧI4&ФTB.]ou:5t>>Luas>e0b5{ᢰ6j^q4NZ&}U(!|3iUgz/aۻ"& %:K #?UIE4?Ge|\+,H xupX#% K #$GYvjZ% 󬟙,|#_enݡ־=E NtgW^@&L%8e,te:}d!۶1Nf[0@9H ?08>tؿ{Tن|; 3ɀJ|JЖJm;τu K? 7# }㊣,] eOr }dpJ>"ɣmDg9\[G/O%a,o_F4b^6l- "Bu2IXkXmkeXh e3>mA%g2JiJy!{̜NsҮɼdF:Oh[6v#Or-&ij t}<ʵ tڒhXk(m~kkP'QCpe7ʝ"1qH;u:9DP&1KʡUeYTޤKʭSeٸu4 ƫsչWZQ`Q !v?A٠:.Ha:%+# X0 w\ko~wśܯx/"Jp~mǷ].گJQ2 )0o.7K~e8Ka/RxU\W^n.Ka?_R8;"Cn(=X%dlo+%džˢlp eXKͥV8{[a9_ 7 Xv;c<`~E'R1 <TVIYjB߯+Zu'[)ԛ}nQ- uAsԦƧ8~/Y1(g Nos<˧'5Ag.K<^vL 0оZ^×&^~X eV$#eՇb)FRv"+r/558Au+z4 anRPbl$eMr$B/W|}K⨿Ťߢvte ՑH%EWk0,ߍ ,N 0"1qtRHXŒ@j 0٫t |K !HL$eg/!pBTj`tls 3Hq" !th9͹C$43w! 4n'IlWvm=6rmiV f`po >ٷ8l_>!nϓLNV&&hxvJN!Sw 3 \3'E5UrE}KNC֝h4 pP{t 8$mmFTwJ;QN u;UQ'a$Q;_ĸ(,is: N.iZ tSfbH?*Xro$B΅2j+,QVXj耵WXӛ^ae┓B|er9G#DWs 0 *0g *}-}('u#%1'.F'9'lzIY x?yStҩRPւ!M& Mx0d3̅wH~??\H z[I?>WvD݊S䒃I\,w9%j8eΦ RYi@ZhG0 ҳ M$H6iH4XMsl%FgXKX."!֏"(>C~:}~;o0@gô!Fzd%E. @-wK6\Fܶe|d9VzQZ{nE[z#stVnjB΃-Ƅ{#oUl g1Fa̞񽎬Ad',w*2@FKRld:%=Pz0~$;Żc$~*nU>;(s:.h֓ e^cѿD',wcfA'*Emv%\ h/LF&-Fj^L?z!Ãkh/e7Da`}@x\ֶ.TVԱM^]^]=XWA*UgLT \țu8QB=ϫ}wWQv*z&*I? !7#XOOkMhgp +r-GY.0jϿ'0ZJsQ7񱕍Ĝl=!BZթ7Ր*Sn;x൳nPL'Wfnj8)dQo(ٝxyf%ʍq*UfJħ XCʁ֑gxdRk!' Ee%8F@#R/ q)Vӽ߾+x>MWwcv·{"*6;g͡MCyt h|+? a8ɨ]:'hm-R;4{FN )o9i\xway#rC0 6 t!xx7YСzma!Dޡ Iյ>YGn0+Z/> >-_ۥ_FS:hӕMUv BawEs&J)?{Z薪a7lW)T[W~YpV z^8ؾtH6N%b>pǥ䊴"$ll'+]-A;"j(&+r2.J8&vAW1/E* TR~' 5¯EDs)Զiex2MlΐK*j"V'JXxWjДd:]S^(GDg2P^>4mC?`2")bt}1},;|GYdO[NޕSHu!_~2DQV gE۳6??= ~e hM 0lx\:>,{ſ(9t*ʈ=-J 3 1j®*tk!~^FLuB%vB&mErN(Iy2<[eig yS{NЅ)sĤl$䀅N}?%6qB0脵N _[W?!0nKoqd.I0Nu붚F8 !?Q=\/%~i.jbkۧ$pG.(R-:hS8*YTѶwrL-ДҮV L``al˓\5{vMw`p q yxeHuFG<#28YNE3.tFfm2 H$&*E>u$ED@'᭯> 77pz@/FhAչ0oH"+W4#S,wGبt%9*+(-u'~8 F)0-j*F% ,A ^H^n˝=(u;GxWhFЙ 2@ܴX0` ̘@-™J0Lqf#Fyp-jh:O؁-`N&Ꮉ!vraZ3 XP|\-O0 M59ah.8J=R8]K-z4%+%YH]LƢR?v}Cb@0<)x6ao<4=K.N+ܐ 䬜^_aB%fBOZEEMwT{bn\eLB"2N Z)2t` 6&cȁѮiOvŦF܂8. ̇|fh"\ S8E(~[*-yM5N CW Vl3Fn"՜\R3 S/;ϭx L.\a1<[z%|Ef d 8U"sz"Ƥ< Ӝ#+e~-KL D5!3Gi4 K9ZaQ /Jn-FKKhp0#O]^<}d֣#udEuŐR7JBѥmVg0%>_\'W"IS` P u4YpkEmWJ-裮unVz eA.a^[sG3 u&%4ܘgS(:JXsQǤT㫚9*|*@ ė =!FNTp5uJ]>EI r,v={Ɛ'w`C`'<˪dUt M$$i GV_o3[ ^X_›yŨk>Q?sAbh.xDpF/izuF"TBq/R?Fjcלw?-{ա#j+!hrfa:6F=?$KBT@'A'|DC x'CQd0-dщPOPZd?%ζ#h!*UjTˌHoHϞQZ'P(_P?̌NY%B婺4q%V~ePoT՝lTZG7G!j-C`(!sQdQ V K?ͬHؐ2+bH}~5l8{C{~n&4h`s+&t/?㿾h^M'yu㿮pO*6Z7Z7ZGJ6Sh!z([bHŧpQ騸BR -! BBMEB_:hxEQT!1ɜ/ 5BjlD7r*0X&tМA]#e<'~e,EH9VdU[)2^@jLǮ Bd "E/GXS]ɺ$Os:* \HYpe*:qVPW>ki W,H }{3(]'|[ע9TŰtJaL|g$fi?D_~x5u#I,.c„cR(C:׏8:g F+SВFZZc( }@y!xcuG/I$G a1 uǡDd`, k[G(r%O29y1mpCrB2  P"!IE y8DJgbKgEm[JA0p.CQ6f.xߘ}l ιԏ|+1UЍ9.dȦTWx9K7*Y$ :DX#ۢyͽO ,0V6$" %A@"ɔE@YnHUoNA r 2 s sy 3L@z~'Gyo\ACyqwVlPwdhg3/E}&ۻ%ث&X/lc@cKP& 熘_ҹF@!HSC:Y{Ks0Q_Еp-t'J#@|A B}8] UZNЩA"}rZ:jp+p;ê*}xP ^LACy|3P;N~'HXc;.`xbا j264j7 1N < ğ|1’K@Oō Q#k?;s7jOD *k6 roۯ`K|6H8@;auԌ8;r,ƷĵW`(s t#@Ds5|ۆ!v ~$ =D v(o&qP}oۡ_:x}6PB([4Nʡ޾seFP!_p܁+e6 ԋ9p[A+oV$'C%L3vJ4[pE6L$(l' ~9RЄgr:+!'KLm)4FJ[0V_p͗'}9.>R<g77aGJx&KZI0Jk˘eQm͂f""ǑsɉyCgPJqC,Sk!XXTc i@QY5-gSaNR 2E+t u 0V8ZTL+㬐kG 4zm)aluޮa^ y7+ora!_#sLWνg@MCXQOzZy/3G$G@ffP+Y[T˙ Yj(CZ#}ګY+ |-kk. DtDQxX8qi}gE75J3}-H#YXj(QH-jkegBCc)/ƚ_D $r:c4 x\iLީL?P4/ݗ2O=ڥc AJtvd sy@[EKW9l\W:-nQ'x92rLlc6 N\cWTSk 5ߡ|}x/K"^/ P+OZz*wKc*z*g"֩ze["_٦\Hp )%ڥBnǷҚ>lw!Uk%U(` n*Vίu]yUь-ʦuFc7$!os_x=\+ NokZkS]+ڿVJi~v!wJi-ȼ~TXq %HLY̴9&&V}蕗20:|EUjN&k(7D<})Zv">s_Eu5եP⊕5%N%_BwpC:WIoT;nqNk[Ʃ־kJ~JIoP E:uK_e)2lΒx3Mx_=q{{w/{/6_ ȍBld}w_./w=M_5L u80L3&p00ҎBWa`I6 R|enblblblblblblb+P͸`IkjejejE6V< VVj@+@+y1V*$9x6 &>'}~S^96u,7n/$V |w5٪(;6̵An7L}`=F!YPКL1H0~-1JgO@6 1ZhtroaIxkGe,~$5,ȚarS՝4f|eF)$  :]/1j q%,0$ d0zdi+p##,Ʋav7\cb|M)DYp q(걡M_gP.E훝X\Hάί~':N&,z⃮j=Z%SJn̜MY RCE?ˊG27Ƀ@SɃ,Ƀa*ς}1˼PG/iTtucG갌1U./~Vp<o&w8L@^u((F&:x{jTkʶD6 [yΠu/;[w8*9o=(Bos l?tzZ 5vNpzq Y`: u H/`H!*/t,RuB|fvp*?ȢB54P\4[-߿ p2=J?ˎ/9So9:#ۗP  h~$ê/d @Q @|XPA* 3Xg> û9ǣDb Cf+C)Kt)]G UO*):'ca83h2o!銅 6ѥcH0<^s@ .E|UcH wtqz6uLbTUQW/P“F흇6Jt0akmRb[N_;5w5rlwק= ֻ %UʖuA P,@8~Nu0 %|Yփ\jbn_'܍|?Ͻ7x\y7G|T`A#Ạx>YS{i_aNGuanG52zD4MԂ0MZjLIMo6US62Uej!T]&3_Ĕ AXFQƥT3j~R,xVyUzvr dlp1amHBV|ȩ٣3TORao >A?]ĮYx'Iȁe Li' Wjth(ܞpLCRfj[RN2]yQצV8E[-+L)g?D"y,L#f?iٰ"CR$E8RI5v R{t! %->7uWr2MA:)Nt c:*S\).+*R|N3bĈcOf?9sslOB՝zɹfQVUQuAtuƹ(*1͕{pfd@i7SMkZmސ $\7k[VbYa\䛃CtLjvXE3ah\Vppz8Y+USóƒutZfrQ[k-1J z>=b+>-GqϬK;gִ6uGW8pP[*&[M&=^ei/&] %p6.}t7/"| O87ȣ1~?J:q]M.Kl.Anz7/-F7e9n:^K7rij(뇵~NxQz^}Hpׯ9Wb,/g"ZcPC g86ovBm5bۈ}Oq<]Z 7e*@G9vp7q-mn(pJIgTWb]YezZȸMx!^? tivrfF _ gD1b0Qut;Nd99e4yȉ%1v%g ڃƀHar2.l#4aH,`4R=)\輸)c-X5NAI |FMp+Zs^$_e^k3$X j͔abMjǷ\_u ߿5ڃ3(g'K[qq"'h[RN_&*/k9uO>PQ#k`R|0D-*x{Gek)nÊ@ :bm-R, D|`D>PIp5$PQg\OI$:b<@k1@B. " ijXFu#/brֱn3 S 33+ %S G$qQB>rz;c_wS׽tƊ6W$f#WfL7Y6zllה*VQrQ%tKUjyrcH?#}/-}KX/6J:ioOwx~ Ǐ JR_ko;; t2rHM 4J'Np  ~RV?{'ryr Ε7 Xxr2+{N!"yaq&>fHVR2#9.,Y}*qB[mu)ӔCr^*z&kJ~Nky6U?OzYPCgtf*(ť: 4E7m]@I:i':ا|: &H<@z;oZ3wHd,o8gpY{bJ{dSjggŹ˖Qd쑕ݪ={/P{ ;'ro61% }jFI+LM=['V48SBhw x8&̲߱1ZI9rKN.uh}X:{+{kW"YkϩPjP `1ZxEbMu.F809gXaYZZRiZiZF2nX B6oaBLGQ_y󒥘Xw6/#Jҗz NzvDP'tTfT+ʶ ourX_kk<IJzH.zH2DzH6%9.gίMLDz-]^K BV(Ԓ@!.Y1N*+f*&~Pnzh53~kIb("˨c9S*p?#ɶ aCf-D;C,%]H(K8jWu*Kɇ<! q<.Ԓ#R||Hp IrxPd!/;>4cr38|*Ī*Ȱ<+¶5p"HШHr~m_Tte)%(*O`sbAHIV]&I} G6$ N+ )rZ^9@9٩pܛ;ԅJ%\jzJJ{'y#"H@HE*w^PuVSK M>6ޗb?Y4}(#:k'ΉHo9 PMQMa-\5}<EIX4vs͟ZnI䍓lJ$ATU{(=m:q2ZdŻek1˙˷HHbDDureCd-/'8~T'B{֙oIgO)AGIb-T %#+QlA6Q=:H%t O!̣yHR${<~3VԖiJȓ*!}굆*]e(J̷Q mTBJy\:!G]Gʦ55V%촢浢 )ӯR,_tIR,_X%K`uv%M69J #_?ZNU7(tPiE EЪZZ֣Rl ̼z7S?`̷LVSМJaƥ S A)<߷|-/_+ZgPJP(Y> N9r.!;(mb @ sql krѷD sl^I{@9=(ap]XVLX"+'ۑ{9ؿx$ xgQTSvZϠj5eICLQ)c珰q1?'XഃU# &9/-_4dXvCAۉ`3./yf"I2i rBdbhh`Fiq7_mMߗ]YLP ̹`b!^\ H*bJ2 :iuw0G=Bx7l;Bid9$Fq$vd&;$$j b:,07)~|$f'+s z,@5J ,hOE fAsT@dMUPc=Ǫbܲ`A*;9qزs2`(;^ιYٹ8ko!v{ʑwE ӝ~vcX=e}Y~}^Tnus{Xt4qN1:&>k@2lHEnns`d3jR4++h0AcxKOjK#W.jD֙r:Cu 1}gPA%ʣgiK u`#Pu2!On?_-ч<9n|MD$5_x9L暔¯3^ؼ~EqTOzb8.ǨAn=; LX?#1P dbtI d|֊Xdn< B>尜?'Gilq)8+ !ƣ|1knjy`u]'Wl#vHj5 \c/ruж#;D0}54br0?ѧ -qQO/cp 1_#vgeN_kyC8\ ¼`vzJḿIGY&Z-Œnʴf|FO"bb?O'q7cLl_Nt8bxwS=脙mMO5,S˟? [ ~ĵJkr? 3e"F@@j'mDa ZpRy(䡲RQb3`dWlJo0ղsj'Z~Y^Dg͵w̄ʂ?۲c4 ͣ!t;hZ@PeA6Wۺ8J"SqHlSH8ޠJ冱v? "@I4M(%V9g$0@kTEazZ$S UT"%4c ) #R5N8Ft,/LO0,/ģtzKB خA|Š𧲹~!Kj{:{GR{* VYc:<ʠ@:~F.Fg&kd{a4E$Qu ]NB Q8ZI #6LL>Hd 9=-wb fznbOD:3:!>Gve{#=ّ9()6|T0l.n)}xj$!2Hl$a5XM[Kû*~D-B4rtuR V)虭Zׁ+ü~6ˇ,YF/0Rn<Q)1n5y;f ]0@9R=?r yd, p;0HCN3O)Cz"0 58JL)P7/! tK*_xXCCl`O/I˔DƵ:i&r OZ̔¡ dTz%8LmPPJ&`v*x+~1$ZlM1f#0Mp$|4CU$o{|Fd}>#+o=6x{=(Bhx(d-PzMk]ǥØ Z;;0xa`i#m>CtK<:9^Հ˅(}D,%Ա_;Vv:BI~ZTu9"2 k@lzx88{S=%{=οkC"Ċ>*:J^*rMT\.rݺrS?Oe㧒_O|G5=UvU9|gﭒz*盘O>uݝ]y}Tt?^3j5-(`Iy{Z%m|6>DIAG@WhTM ذMmYIr-ܤĵi'"Iq ҢJ*b<]5G# ~1U8rQԢJd9@[u|"H L( hH' <7,IdhFxExЮ <4l3 s%>_C Q̖{ؙ<}WFr4KэpU԰/gJ3a@s"0o``NX47G+:Dx}hv9]錫TryOH*-nՓ>8N<Q`b\<P  oFsS" D^sw{ 3LcO/?6Co}rwCȈKq NQ9.STv?@Gi:?/ r5|]fƪ"ixhgZq6]2Sd`pN10hÜ9bB8&ϪA#cq#: S`Yݔ":790!Z[:xr nPkj2`Xk \@ݚKnGdfq4AN-d ( 3-o=0CXѮc'"+rSSs!P9 Xy-+̨HVp~ |Ogj2DMH6 kq#$PH}o=--r}#T"{YGh>c2[JѻD$dWX0 ᇻ Ӵڮ+*NPMt l <%WQ};y7*C\ Rs{,`]<u}`v;"ޱI&o}纖26^a>nb,rIy%1S;W^9!Ԡ̼WL_iMFovA^78VJx"r&gttrVE;7nyiѕXcJFtƎ{eg쥮ؖ#mz5lh'AЮwjЭ *8E3atK@؀y5c+;i@Brl-Jo!Yݛ[ 0bICC&}{%'bӅ̵|W?lv8ivLs^}|ѱa6- VӛJ㮽Tl?͈ afp JVXmvm ˭IvC,=%}w3 [ӑ֩V ʩvAK.s];ɦa8pD+H]6p]72썚8#*!D~Z8aZ@r2=_kOb|r--+OFp<@TQdr!j9Ć!Zj91Ԕ(6G-IB $4:?`,ܣ(-0./!7:֠WY&EA|B@,Vg _y*`偀O6JY-ν߷˫(s!OF ӭEfh rE+Viگfh#k+5Rb&}5 NԃGڋ{:'2XcS_*#~=Yy,wnƝgγqٸlyߝ)D6r<6$} Z1rz  Hn9 OCnr6N9)8!g㐳qX7)ƽv OzHĞ7raO4k\up2ZӍ#ƑfHi74GiY:RO!(٩b-|.uݐ2b[L(c=E.JPGJ\pbwfQ@aEZꍁ6^i]{y wt`~]x&7DQ w7KEOHihz420*ۣ Vԩ-oMkD~EOGh<-*ox{GN) SS=/C}V8 sexl.Q3lk$Ep}zo\Z<F]y_< |% 0_Z.0 5@[&ji2cozZ.#s֘M;ү`&5H6,hL B"AePS3phf <_ˠ\Y 1h 8l*7`]dע 5jΙpx,-&HC@qUZS [dN:8p sȟ(*QAVO2E^?ΏL"۪([j_[?[o0$@^}.@٪.k&+[LFU2O/:w}NB*0['=Vs2>If[1g g NS$РL PòJ&5,eòu $"}O\m-u֮!(NmJ-ᤑn<^Vpte.}|hJG[AVAGfM^Q̄v:Ì!(öa@b6d',8XcSNc23Eq}bTBfhߕ_>O7Q.׍N># ռasM) e81qkzj|]qNC2l6-dAX>v|'?n~|YFrpOe Z-ˬw~-}Tu6ǏIѐڎ6nt;Vׂ> v=slanm;P؄n]϶[㩳("=ٮN[(1/ohV{n9[F+!v|@b2jMFq.o글#WCA_~|RM캵6\2#~/3=Bkko@uD~&u ƐͶC= <#]ESEy0:Gde % >!EYX6c9\M?NL x\huF\"v%Ğ`s 7 뵫j=6xʶ.t[z.?\n\?\C!,]{Yn{GAz4H쿻OoӋ&Ó\o}[?1@φǦxyc[K_;6bT\wR;{(`n-lo ^Քw`:V߲sz)J(Si¬w*_J1L7&YM4N?&|c(hۙ61.iqjdƺK ,O$624.dJr4Gq>cڈ[alnӛ$+drv 'WV!TE􎙉3&҈i^%iI| ؊7Sm*~0XIPPoޣ{+)ld -<{#g c\\>/ף <{xB}^[@r--ļNA oG[B0ݎ7Nvy8-3pBoU?2*VNra(8vDb#4sIliH¢y03JԺ D SS+S˦0x=|DHgH 'JYO(%uPNՌ®$;[b%E)6]S:u0eݍTo ]ndPY$cU#E! H=&?ҋ{\:š1w3³9Ξ%|=i:R8h>EvJz) 'I|bREBNSL(Wh+R.|\ O*FoFT$KWGEۥ0 \`>7O"!jCkSrNm 9j1gÔN>>M\+{Mik _ M[Zp-/38,lmD%/uEc w-}nbdz) *7 %Lge+WLj6y/GŴ bTk/m9T*Jg21yL {`yGjmcULR=m0-ϕz(I |[U”/Sqӷm$Q&$ ZR):* Eu7}if.!F.Sd)PV8 N˭iӅ4%9٪'P6Jݮ(1)/}EczeE9+7L䶘RT RΤt UZŰ E$Nt@f6C }c^¸!9D'ThڄyxVMj. UTòUA#V7VyLBz? YCke>**ui2 CYz4~!Eikrή2SwE_k_M?ܷx0Q%ǙKH\B\5ݤg[R5]4Jc$`~S-JB DngKfTCM%?,i§9t"+˿$_㨢%%"br2O=-Q"-uB=y_'|)^~n}Xu1:mk}|ou/TUDٸm\DS'ۦ Jq1YLc! ,xs0."qQ((l*Jjt䈲$ pRn)`+OYA}=0O̪jbU W0z ԫE=vȈ~rr5A܌s#~Yu r5G~  ?r3zfe"f󲺇匱Ľ3_O,qo'VpoFdvoFd]pϚd 2:WQTZ廓Pr,|.Zga@ k /Kt- Xˈ1cO኱X;۴rP l@@#u[Ə{^7|SL"q2R2ٰr."6כ\~¡AP.z DFJmujwBw+߬SjpNǸkVuoq+du^ڇqxBܰ-QUmJP *7 \-}FU@'SV"~pEbSGy1_)UQ9-C2wK-xCTT" lp~BllV"v_ugi8:,e SvRXttj35D* 66AM_7BiPF&kXfA ^c=Iӗ^RrtdxZ).G飘v4E6ne?QU?6o) Cqh_/rw!}o/?!d .Ay(yP}|IS&Q${yZ./vSXI%Ж894mkR4/؅g%>RWh/G,l9;ǨDC=#4ꧧ|_Url%'\¯]^," q!REWSh RplU5T .62[HaL\6[jeiOjsXߘ)&O$ք F(UVsKuroqD1qðlMn~ RI(Z\/á\=4d Ă<Pm)va$8D`3Y7i4rHj`TUlT'؆q<o>%I4WO82lhcEoœf괍)֙jc]63瞎bJ-__.GZ{|tKzхv(W !ߡ('>p'6sK"8a.(ozWǧEABOokHYڗ5n]&9Xֿ}7M5Epk {Etմ<4 dڼ@2aı*QCr\U/I.$bJM,0qJRTv VHݫ[n[/<9q9Mq$$V=d9mE# dRqI f1-jq$T].j9_EeM%s8B76_SfHt>&lr~VSJyFr⹐<3=E $'IG)~̗ĝo[6knfjή8l8=0iA0E: ]֘L' P+W g#٪k yZeZ(?ڽhe[QkÙVRƥJ_n$zwaow7%pbE[o-F B8M>yOWr` +bh(FDWzTRϖvD`;[ٳiQ!:97`U2! v/ rE81˨|3&'4e NfFse01 XX weY$C^(~F ꗑ)=mg"ȅ2H.=+6rWW¿ƥĨ]" =9.@6. ,&7ϿB9@J~3~O,T. xu\JHZqb7mLSR(*x[Gv+fUH[5W9{ξ]#.gML!ge/r`o$+'^gɎ[_߆:oCl PSHY p[Q\o4h9G2_u <˧r's+(Q30ިWᕳRs}`sžP 2p5dN!ĜT.5ԚX9qpq/,`Gi\ ~WUD++ E|%h1mI#9wJГ7Ҏz·!."8\ HMG- D`jᔱZpf5ę&;؃ 4*$E lL'5_ER0HZbTxZܠTQd5X*I҆ ʭd6S$zQG$$ ┒@/Mm "$RIHtz ,淫:(dppY*JÓ84v6 t;Ln+#kSLjX̯|.RELmǔ& 8%@G>0\%)Vz‚ȥnFi>]Fr}`Ѵ;OjgE^'(h`iUM1͙Ņ`S4bHl&z'だ_]i 7 ц=1@8{Gd^ @ 2k={Y Qm8 n3C>j(!2wDkȶbMz27T$}?ƷTbJdKptrTgv4# K@dDZ2d!Hh":M{ z.L~2UGʟǺkκ,L$#0L0RޙmQEYݹڝָm((rO!VєzG{x8 { 5.H8ŨS}ŋqfuƖIgl:6R&rhY1{9z :5pW. >ѥ)!`KV15@#vR xjĝӈ/f.!9Vee+sOVQVvwJݗ^wg;x:_:e8X-kNy ITG'cH%[FtPBҎBah8ǰ.U6M &X²^ DGآ6}o9r }_8IґVs;/e 剙x~*Zށ0D/^tzx}O>MpvL"ְy g^ju(rM c6aз>WE= J C!.[]u8?P4sR.#Bmk!17jX;-eOzE LsFO5])}CM O@AHDsƨy'i(kBe E%~ :5?Pi ~iIH05*Ipp=w E 2pO*b7IFD%h P+H%!Xϯ r d~`UJCs zK=Ŀ%{n_y3#fF츙iU-"J5YTTUzP Oę6XBmaB6͑\5w[s1:KP  ./,+b˰s>Nb7pb's|tbK_L1܍ǪJ-]RW$t3ˈ=lV2ZWy0CnSh֡Yǎt{Tg-r:S$F c.2' }joƒq s(BQ"A҂H܌3%@_`'=G sJbzWrLTdWǧQwT7dҢ(kS(̡2"^ lv9rT[>R/⏣ xWs_quazfz~RH'&F2\3%#5~N6\升Bn2^ ] ;;Wr >jk PsdZJs<0R7pSԖj>iӮFs# M4%f%JHjHЄOnW =(@@zN8V!M2sT JOHj01VhI'f]ngxH!~\{#‡ 'dzXZ E,j*@ ZC<٢N}fL(Lj{ݥ^(M,K:`zz;rgKoܣ=\])G9=E13-}6*¸ 4aa"moC@wm}>cb|7OFRBۮ{#к51>Tq w7ʂݢuu,v!a$3P@ 5)o]r7۬h~_2 5.*Bb[*=dYB")pm!t{#-[)^lj#e FuKxVgxj%fu8)Ɲm(ut'EqF"h͛ IL>+F cFJc03f*bz<wMs/dW D HjcZ4`c頻XV􌈌f ۇ8AL +U g(~  i󅆗F6M0kxSX-p`yQ+Xx(RެxU$~V@LʳK@f7 1F,Q& 5Le8.JcLEI=;G`{E\^1Kk`XÂS/o̔SY@TbV³%*g;mOE4GGLwuH42ltexumj0^uݖ*U!!ǁHˑvrx3e;qY9iԷ".t%^L?h>sX`<'-, SjPh];B6=HV*Ir3CIs)sX=Ē1g}M\)8yf9~ κJw)+ESHۣ_b\4EbX))$" eJn!lWB* b:hI WҪ㶆AVr$^rdGaO<5PgEza@@|.Q,-@!Xm>zR[O(c? ȩSveq 4|~9MYiXWx \֛۔?u 80|y? HͿįp餉M 3LmpREk&oZhl Y8>F1∽#)to@`P(gխ?X:;c䗁ԙ胭2ΕRЯmNR:#lr֘.UOq<^:VOڄ/Xޙ+Vo"d!P|CL %h5)ʩJ0O@<}vnHd$5]Oho/((~͑Ӏ" khzMgXgpS[Q&?B^GGDov]m5b#PVS \E&4ߧfzq|El6p}wLfrJTm)ڍN[5Hv8gwbt#;eOq"4K/`ϳz(TP]6ݽQ|qA@@ ` I{ٓ{u74dB'MNɉcr5oMﳮit =!e:C᳐<ˏ{)nb8L>*RK,~'8ç׵XɉvF_R *aVw; wqoIq}׍{g@EV[ޕ qaŁ7gq's9rr!<ϳS+lvs7{=y=y-vVsy?sfoDmc~tj/Ѩ>:Y]ES8e7ړա\Xz>m&/h bۭ ?6,lYEk7B3lWd YtDRTʾٴWVo5e_[{ _(Mjj@:.6!MGw',R$)T$S(EV Zy T5'd({S\M>TcjMn 妫߄l)oba FcE +Ș͖?r=OT=z&V~xJ4=oYϓ Ek&H{]ɑoHVH+u 줸8kmTځM4BZRJySXa0V3_^Ju!%Ӫ"z^g"IHBX} pg=%QƌM1LfT2mP+\b m09p vOu2UU rI&JO;ת؎gc(0argz~v]TЗgﶿn{օ|)4].c36LäDLmpK-4iqUh'!& ,Om+!@r~ 4@p*˝niܦF-.xp2{ }_hDIdb.qQB[\ibjvgΤ~m_>,dD FJح8j$Xr@A={EBמMDntD{\o+u?pߣ5þd:mM5~[r3,+BG]7Iъ&$]}lJi5me"18$)Έ kT}Wuγ@bޫ}.H1=KHYGC' M{3f&K?ׅsnU6,8$.kRGt%cU]oSs1r4gfߪXO8D9(l$xn q1skOU Tr3҆^IGJM-A2ˉz--?8gWNc:ilLP94GsnFEy9ր:RBk~+4sB3hci3V4c DnndS^|T6Gg9Dy2Y{e xsjV%DmsD\Vb(go'S ޶z[+2FdOBsqĎn|,0s FS\GS=wಷj6'S&\'d.^vtea\!URvPKC7dN8ʴ*Fxpx2dI&zw&><1Ouo秪bo/t烏@8p@I|l6?W|I& $8@FLTQ,&@7q'< *;6;Q+ 7<ܕބ0pi.Η{lk=9+ܧ">YXN9K!WrH)yC#›no_ҿG|gQU9f6Ox{R'w=|=|=𾂷|@Kt+yxBr5͹%z6"+>1V ҳV0z+K2jpҋW`rxj{@vTlDd & ?$,ͷgkH_HCXi8 bces1#j--9!R`x65Z`(l#4@WP} 1 $#k|QCi:&FP2,ΦUDiF̗9!`Q)caڀz D OBz$GV=[ eQ #J 5eú?zy< ^>>~}wNERE`ZLҢݘS)a!W|tMAMe&jw$X[Nb[:ZyQ mKIPE?{oڕV=GP5J1hL$6i<@&TIlV&ISf~o2sؤ C$锐NoFcxZ5{!++۠"53h+ PЙͣ-n$rsA<+1{oosiZdsq֕?p\kAE oռ6opY: 'n؈q<85;!X'"V (`h'H@<WY3dz~y3^Yk~1^wm  w iw޾@c璣qr<F 6:6m0_)B6&R ވrʋ_O\r|c83;̮+°VEY"8ig×%!& 8voG8vʆ&ʘ*3eX36\/ffFI(Z8]Ka֓SdQTwaݞ+p<0l,``QhVXN8&@tHv0nB%[Khm3e=}Cr>[i׿Y;9O?xAFdzU~LBNJBQ1H66Yu~axSZ~Vۚ'K%N+Noĩ\>\ .hrNwyf>wsRn7n&g%k$7bO99^1=\w"pv/k3=-@Mv@z+ߤs50Xc t,訫]P2.$ǔ<*v$;GAp;5 |{kgKp|).# $NXŐ18 [O+|+̰T0ȃC|^15f6-,"ۚ hYFcm6UOVИ*~C:qAWxn&Mw0,L܌L-YeBgAh: m$D9g%.Jd a#h~J|T 2Me &`,EI̡*s?l;1[l$~ЌViEץ,PC)ɿM:6'?tb^GOmI]5|ΪZ;n&/yPXȋ*D󨇯NQF֥Ui/8-)U֮g/Ý-lxȖAzXĮ2 Qò 1./yf״<84~C{I_6CQ=O.3a5̉Dw4l/r$U fwʙ^o=6r%AQZ0\ߜP!!vMf@ tᵋotܤӻwr %?ץT,[7wvh]tn_~`/>3]nKG'ezk}z8.~A{ȀhJg*{~bNYܣYm6e(fٚf)Ao BGpNIka7vƆI$+>we^!w;@/ 0Ed3`,#%sw?N55vn[2,>j^Y}LϧuY\ǻ{)َJE|E~1d$5!Eho#Tr9FCč j{nxHAtWCe}^hY\p(J,DB RQk=!]8 qbI: %a ]x UJy8|9I-_`5 6 /J"ɈH$wpZ&C>Z*$|x)qz}jtZ'nMK-R#.)1CU6p T[`,/G QtjmUy?/5^oGm44a+3oq0v%M4 J3䲹@ʾ)WEԶ㴡(aw>hU^nV}F;nռ`vA|r*baXׄqL+:Pm֝Jt~Gaƍfhg|6T"BC9u``jj[7`Fg)ԡ6Yp4yZeRf9SQp$/Up,Pk.gT@ H?~|_g$V_ V_+Kʕk_+Gjv{kOV_?Wκxe^^9krt˵Zr=}cۗKIʳJ)AMPݧ FeuZ_WvZ_VWu:{ :[_g++cWg?AuhWg|xlZ};o(/&(C+Cʡ'ǡ'\}Z<ϵ<{Zؓ YyY߈}̡Ib=7>E=r~+I#'݃^v+[1UCMX c"`Lc8MQ{c}DٰP O> -t6ʞ <̓>,C`^a49ƺyzgCk>pOc&?#zxR"CRՓ2O/$>戬F;l^7u0Lm8˓Bi-e0dX>5/XiSw*/V<>1dÒ gv;[#a|/O'[~NmoGXtLR[IYI㴒xV惕`e>pW1w nшzL78P҂9\k>N7/p5`.~>kX^q&F҄nv>-kK$ǰzkY(|q/rv1T7&dd9MYk'vdKg۾ SI,E^qr#:!~PޒŖX?J&v]B}ěΟ8BF#ȅ)nDCr$wbuoBܝ-sc΀Tb(@1<-I@.J܀x ʿ%_fR̆"ZRwMuI Z/JLiao0O#Z GL%" }Y,44-<"& Sj)$j+OwjːS:w[< Įՠm ٨ip X_[j:a;L{G{֞!54;h'_*IڭV~:W*MKt8wsґQlg FI43> <yh  }U& yT6wwoO 1$׃) 为o6Л"\*#B mK!Us9i%OyZ[}}O ?ݪ#Nݐ=[4 t5jp6 ;&)=ѨB*YsZڬm?ug5Dd Ʈ!eUB)H$\cp`zP.r侜3/Yqzlgk쥪$(8bB*l+]ti -afz2Ե8joJ2joѳxqB0AxC:fZN-?tOZAu7]'GSl߱TࢇgZ70ZOПɘ#ҐLJ.8p߾__X^JaMl|(ʯ6ȯ(={98G {_:jSu-J9w8z!{@,}uzso{Ë 7&Lۛ ˪%)>BcmztPB5-}o tF¦{kYP4H\صC$)7<77QFm%K5557Hq$ rfJ(>CdAfRK Tj4) ny.tUC)#*K%4Dٜn&Cxےh6p  jF9dri*0ky&o1Rs>Άʂ;^mQiO;SL#9hV52bޕ5] io<y҃D1KL'Rw ϑ7"5r*EK)Y:%j$%$p40%!R`!NJr5,IJIe ꕁQzJn3AzO|BCk/UBB8S4%X%^OMtap|]m:~1Y1V۔T66]D.s_x!s/$ŔmI){ 31iU#s- RJ`X|nSYփ;5tomX=bh݁9H.bMi#GCEp6^?Hx^Z/ݶw5Mo+kAg#ٜjq{QDM;{ڣs9*&sz |+ gpM*S9ڠY 3R4'BFV7p7iZoXC\HYU`Fa+{|$Avn.l$ 0QݎlC.Ҧ{qitwx)۱oR.|2ǣOgs/]=tF@Fi[Baەzpuڷ77:iM{b X`) S1F,Ph9͇]U }*m\"NjEIOSz.npSO!LG$i@BҠL<. J5U`݅ddCbD iCU;/5&e~v@8ʯбD;+:tm^L4fKVv=#{+nR/kT!Ǘy'u'٫5b+r6W+z'-0fmf&ƕJnL7#eXӍm1u;Oӱ6I\AI9N*G /+Ho CU5jTj-ҫkVAIחx';_گxFmu*ޛ΁|߽#dPMp&3x `mvEC `G#(G@k7hd^qm UE5R4+8ռw B'2VGO2qf;LQ̦ۏE_;zuekY E,,U.K xp X­$X%{E 7z<2'OR88F#W:H8nJWi=9T[X "˜ c>ߟD$ ځ3anܒCځz@TbVHEpD-#1> p?0l~⿋kxZGȗؾvD'FpNJQ;4J "8BhOoe|!B4`t 1 !8LZSeе  ĝ('0;U6g,㏚!܅1SZ@&p#\F/ /—*QVASAr3@*@/ن$qW˨kWsBmPK(!l}]T2L(ogpreOz(? vqD5sw2܊(W?wpR3^PT+^e}`OlO<jiv{^V=d< Zf^SO1ZKv4a#5 g`lejòArSEmL+ #FǸ<ɘ0v^RYO"biL!}.VHC8 ەVo{d{ wAOuo6O.=Ѧ|dkPj[ d:db0 'U<XEh:0ҡEy_&Hc4x2pNl>E$H2Bk*7Y10n>8Wl֥E0lQHpqݻ]ݲIPl5$El(SheQ6s:a7uE'+ps TGGZ_e!4^u4w̕86ւ.w >0t&L; Ŏ 4ΝPj&odSɎ5?$- 1ȿGy :ɕ¹:1=HQ:#>>9[!uhL5'"}1;d*zD쫵cd"껄&B2U?m; td4[QDؠ+ Ȗ% yM@Ck jr!^AQ.e&0t$}qR !R ho-_AKl(B}dnԌ|.н U&4PEw>K_xP!4]^yf&(|ML2d` TT8ӠGK5ޠ1LfXm9T9&GI4lrw tFяA2]7v*=޾=$cOv*Eo7,Ok=Cպ"ӆRuJBh Єiˠ&8&8H&&h@7G(tJc F-B^./A h~I}1YPa/^[_{PG6jXuQLAhP.]pTהjC[ ^IX\YRvh *cԏKL=sVlݬh&n<Os(/ H [`8c!QƿaH!K ڹR5@XQ#a/MY-r,$%wL^cnћ7+w&VƖEǾc(Z8b,K4)'-¢ˢeGZ&/%\tHZlȲ%w^fk>'j9 V}-vCn:5E[5KkVͳDJ!Ӹbۖ<Ɣ=d1`Ȭ&oTTdjj޲YL;w`w2Y"b7 4[Vo,eˠmYڵ>d>ƍ=ݢU$4331MI]T7v15M t)#QcO0{ B:{o&ɝD&t/)i:2wuB=r- BK:B A#wEڇɯ[& ,E"VNFWu |J2$ fOU*_Te1P+m ->7oCx(Nf8%OY;+,私2W|ttj+r)V z;%[2$ƟٹYʿ&kEId`S˰0-]Q y>S3w<C {.$@j岻81ew4W˰+:x4mf1`bV]r7&ޗ8yg&%'&gw=sZF!op$sER`{p)6?HB,)FwKɬ=E` Ż W<$w zh8vT!UײZrn%st?*t卖 |clk-~;D>shޗh7¿6E3tXg(pWc4(V1*/m$-X}R$?@*eG٪xlptOAI9ꋨ5)ێRaueq6sd1xrWmīJu6BTZl,;lJv#՟lxvWQrDGdtwsksksȹu0O\3Q6UKI>O5!xl//Yˁr"Z٘ 7@*q#e^)*Nܢ|wjiorXĿ g&$4Pi:(.!gJ](L);57`:}c+Х+">0`RFɧ{ "QL6Ԯ?Of06azR8U 9>eaЁ|O˱k =kDl+T@]QX7.sf?( U W5OM*lpYĻy#UKDYjqk5_j-A/@ȷ `.fa}F)>"ZGa_Q eIrL-n/(Sh}M鉁h);<{t8jv"g"f/c/'6\@+F󗢦՘)DOF 0<'9JwDQj!\qm X3ATO#FAGQWڍ"@W$qq 0T,1|ڣafB:cuH)y+0 mۛq}\q 6>껩g\D}Q IdyxĐu+酃4QKu BT𗰫;ERQR2%~Sx Cb#XufY?C?YFM;({mVjԣ m߷p0OCmoFx "\H -Qm# 3׷}3;%Cn#G&8`ȽdI{yhE x^eR.4-NT.-KzH 熯;䆗E_nLHu;4Hk8K|o~'~ g=2P~Vj 6OV )Tڟ&.0$^0'I/r En+R6tXs.3ViutEyy=\ZUHZ2'??/62vy)}<# 0eWVqΡe !e BrX|CdO2N:[<8RTXԁK^ ֻ}Bi:}OMmc~ᓧgߥ{Y/*gNS|{mfLؚ:7WQ48uu~Fp`=IcsXbbGYf kɫöaNti"eè"=k`-j.)RҖt0}.y@^0&}pH,~7C?M#L -B.b]Fx .wĹEyjFң@!390}YDj8b2oT*lVNYH0g:gwJsR D QCփlr}lL)D5\q^ѓ.$I%8*B=QpVJݔd9Q=+DqӂRĤ3|b'~UW`Tv^[XWa;aߵ$`_׳JrR}Wɍq6b909P:;O/> LnޑK~sR|1wmFoZDe~VFo3HˮJ2-ϽQR1(y?Y|٬p"Il%bJEFrwGZ'{90gfH8%4gI2*i$fqhfT1[15tyX|rQ4D52,j;o:#=F[q,m^JgWkCEڲDe_jBna[ўĻ񿏍Ymo+Gy1񿋝y񿜲Q;z#9iKb.HU@* 6qȅCӉ4c[hSo%wEfӲ0KK/e:'i9j!+ ZȵyOɵ{64k#HS 7[暽 ޢ"f I[;LXC|޻VH 7Dc>9ʱ8/Ik$%ǒNw`֔IN zҎ vȦ[/.ٛ~R6VO-S975Z*pj'uDQf0PmMyGul6Ҿ|wfSfu:ܴt;8cv(VZZO{2*"g[ >J/g>rjϩ(O؝D?B¾R6[Øۋړ'%`IJ'K}ZIx.-[ w- X4ڳΙc\>P(?XB 7eCYq%\,1V[0f?m$&fq$gui/0s橴© 1}.9)]% o&RJRX+ cB]ߞᷪ@3iig - Y7Ma6˵0nmQ(:k3L"-Wh$UTN[lјjъO[A֚͂`Sfq7:M]K[pͽ'Udd!ƶ{vfk>NMLyǰi3p,n-?+[0z! hI 劒ƁaQw< :#SP eSdNʧ,k"Wb5B6蔥iP $sV[]ѱ5Pq6 j- ZW]WSΎJ5> ۗXBаa^sV. DF WSHfY"} rm ]V){k&ոRCAxgsR/kS+a:I* n+ULH5rZc%hgA_P0% 2'U/(Yu``c;o7CĚpPoBn`U 3,zC투RP ]XZ.v% H梋[@YƒA<ٲSp=lΪNCUZo05ȅ'oflon ykrdGj>v~cx#9_M[{x;${oN;f.Z,׭;?m~u~ ư>|V\p_P*i@\ lzV;#L<қ(}ЀZ2L@{RVۙ@`2SOUqJ[&/"ЁEzKq?N皁yTwFbVNji:i \;EO0$$+AMze:A'蕥K `tJf]w@6fh'DD$ glv{`%=%ta!AX gN5/y+ٹ6:8_%UZ Q  MG2a*1%t*@)^1D_>z=I8:el(&.'DPD55Ĩ^tE+I_jo Jr3%jpȬ` {*u㿟dwր6 JWb{>LJLi*|>!d-ĪyTaha9Uw8f? 5ϐX8,D gtarRԤ2Ay-|۳rQ;%XדVMt^s3jX.?4"Y3۳K/_/[Beܸt4@`%ٕR LlL%p>qQpHq%)ѢHZE~14`HB/Y)܁+:xE"hwNyJ 4Q6o8 ꄯ򥮗/i/ bN^Ve@ 9v}|0k.kBo/k{emWeey\'z/ox 3C8uX1xk;s) &ؤ|t% . 2@;eW??Ru<,v] zhr4(T}LQB׌+NRmPÛd?N-TCYn]oV(j0 ]\@QMXcи>*a]A*o㇡rS»S<:`K U6уLZb-`~(0k'x/[kIC!/)B[tCai&Wi6&p7fC P^ w}&.?T&^x%B)7b@<d:k`jxa71Ahvjq/9FJDIs 5 tG&JCBF=x$ϐzHcGP=ADaIJ{e/5= ʷp;Κ|Iep>'Dhom$ ^_i^{͑}5شK ] qpm` i-qDa:6X'ܵs&细ܢNv<~F0O )(3dYǁe"n:7b(M83HuK;h8v-qPaKEfc`'܈Է:2IdEYKM[fjr>\LDqYa ji{1>47d+Tuu(Wgwg q\~Ђ)ZZ`d a@3_bTs%C |MU3"Xx:|BnK0NMH~g] z*wg 5n++-WA0CE[fVuI;@nk3ClG )녟#)u;]K&TrEb{~'|˽3H W2%|n37fc_4YG"O% !DYԡ4.P3[MNAM;Xxk랱Xް8≜;۞ti:stj_i"*ɗɨloW<$77դVoojmA2t8^FGo& Kzeթo׷фsLRy9d6ʷ3Θr8=xН}qzt ayA >ِkbO2$Rz٣}\'4ԀŦ{a+\N {2(O pbpQu!Gw$#H&B)ϸhU{XD) ]shubBC{–yҌJ%4T@;(h}j>S"H^?#DUfL=bQ_f`5 # ,?q^MAS/z 9$v %1f !齌g;q5HxVmmY0pWTNWI9JhqstzFs rPo¹9nuR$FD'Xa]4kՙ)?jֲr)5Ѻ_F;N/Հ\`kX &|o-3i$'i$'ɮ|N&/[FuēOl8Ѳ͢ek,ěv9JJI yCpԢ-_$ODjBE]jRpC g 1rVk$tf)* [ !ϵ% H|^ IY0qg\>'z" j@,(n vBP=S5*̐5fDRZ@"3gX1VYן"~V*츨j)}&e2.u`JWwQŃgS]gI vl8=C3>Nb_Nvu=laډmLтrB 0EII>ѫ -,LZH" t _LB7x>˛{-tS(jiB J=u4_U;,WA 5C⨩}Mz%Fzw1w{ 2x ę58拍#xSYRbC0bEaQ2s" f01 q$ؚ ._;vi:Gi)^ }8H\tB$ ?+ NhjS:6[.0hΉ6Aahzݐ9"ը,R-RQq+daK6m4t7SWN^D&;EJⰠ׼+RdvG)W$%!EQ"J~C]6z Er19|WfpGq$Mku_ WAxaR}D|JaKIhI!!-YHN˿^d]VWX_ aEӒ$D kqג QA/׃Wn82>K =KK l*y}8nWxژGu>{֒({#ӯ?:͊Գp/N_Fhb6XWUb"؉S flj@7dV&tM'&Qd>k1ٯ={zUӈb/瑺ە:|WFR\G gW7/߇G3ϠR3nܤ+=W+<^bbʃd`X 3[ Y;=3lA'<1d ];iۅW7IVBލ!ݹ^;?~'횇~o5rW}> qyԼj^5@*$ۦCJ9/4 Nm~ 4mYe _z4:Xz)j -ԣ TBzű dSB[K/,U€xEUg%P73B-z8LGqs1دޚ 'XgLzY B@fL{MV>D Zr- %K">T9Ƀ *Ag쬒E%ZғTX2zb>fvK (f8Dz2mѵBU醆WkX{Z,@.d? Y?%Zc/*lGW/f_sF'@"HXFDRAwG 8!0Z2$$PrBk7Wڑ9\Ͻ#wYn3dII⡚䁷xh2 xX1 ÒYHYDu\j9J#sep|iInvޓ7% =J~:J|})O>GyȮ-.tl| %9gœ{?KЃsU>0unt:eI^ղ[kەx^]o8C\W+́69Q?$ lҲJ~qQ,WV~T~Xpˑp.~vNS"Nڍߩd~sbNSbNʍuP]ĩ_{ŝô9$pw FrN_|টsmO ļbmJqZ1]^ *O4EΝс cq;Z"bw1QLa&ntΗtZ~L'Y{{wo3sN6cƒbWbqDl^{#1 lcHNT(@k{䯙ff-эgvfOʇg{W[=Ƌ7g0ȗ^JrF'PXVn^!;[Q)hAds14 Zy22ERNis D=?IxaXVv;Ab4PXȻI-|v4kYGs ~t^J; 5@^?!粼ޟN.?LʿsZcZRMs5+r?*tTư5ٗ}Bqo6"O<p+hp<35psd!J;+hm$fx = g6\/fN n,"f4+k{r45% iQSUN l. z[>t[98Mmw*iM*mnՏ-&\U@8tLM[qwsש% {t |n@¸#) ,<1D5k6,_ ZM` C2c3$52qx\39U ] &?n?"᳀?7>oe{uG ׮1nCW};[bE`Eę"~VlYhԋ#fecm)_͎ )*Dts*.躙dw11f7/ܼ~;>j[:0sq w@4dSMWH`pQLϷS^nd(X./06LcqZN5D};]"pPog{6IpSKTqbh.&U'ޚhr;f?NDҧ"B@8o;y5ٯ&-LX>U/Q5ކ9V'榚jZ pvn@@4ii*!aO$W`Ι6QpN]fpA.ge :mtJ:;Vqws!`Jrk/-1~e8^MT! -_ jXÏBUEpHΗIk%˚֢sDS|gGnlĸ 8Ez/?>.I^`*_"hum+Yhr g^z95b.D~M>ʺvpAk!.?rMY\SKHgWQҹ ;ܤS\H&Nv1@0Vttq/ZSB"ɱǁz02 V,cu|ц={]6iƹ )( bs]C}̀8R>z|zp[³huJk@q F|Rc葬ة(hv1[]0XX'P.O[ubM_XL4IY~6^>#GC9ƻNgs2iS\yhO\~9U eUtޯ̪zڞߞ-g_NtGڗ U !^{C#Q{4bḿjr9zJ'ӵbh o}$E֒/Ws}kS^ |.L:EGņQ;PŌ^"DϴI&KI*j€x? 91_lyŖZ+կ+Z2#H&y"$^wє~Y: )5&cj/N%&@44Gg`T>f)@4+r1 g w:hxźMzP&Nƣo;`}44Ř}8 11><>x8TL\o l01GNju׺rsCw5}5i{Pӥ)N}2$UzCl8'sDpӈx Kԡ$(|Zyr}\U];&mac܁hp> Džj2k5.+b8kyG'2§ȓԳWw3}v)! )ʘߵJT *†xP ӏ䖈DA=WAx\4] ZW,C $s=-b tk l9PkEYhPp3{}Ahv*4 T%Sä”4rLzڪol<Gw-4m/+:Ӥ^K;Q0BS G}d/a.Y}Xs7GFl`8b!0/) w17F`ڒo~' %;:=p3/Ex4h8e¶)ZpM謒[}#T2xXqJxtz2 `9=Yfr/u;]KPШu1cT.m"^R|(,Bַ{d8KtR׷xxxNVmK/Eݲ^{ 7D(!~ɩW `[%]/0vɡ\L1`sb8TxW"XSKE.;5J`X(m`͝GCo+ wEQ+⺞vaXs `(~h?{GGo2\] y;i5Յ{КӟZF5L9P%yw/U `B뼬cp۝7"=J]:nI'Q* :?Q-mlH休?|ۆIBʣ&й&Pt pFx/'DBy&`׎Q5 =npޢ*U?.h0sRg,Zn- ɤQe7iIYa -Hpw.F<NBs%YهldLU&R;Ik͛®(?5\jN` T&ċyS<1g3GGR$ A.Ⱦ+?r$ $&Z 6@$Zf' b+ڇ[{\J+![F:We l$$3 / !8΄VT5Ԉi$ڴx!/aّnP"F 'l7=]Ѹ(' ֌(TyQj9Vd'\kb$*ۑJ8Au2ѕnZb`>s KF6Lb:w[:d59ChE1gQz=`!0a_bXV/WZAn6U^x[7ODߞ!#"qG=#Q8R7¢6額C8D9!ߌ NJV[%sH[qs@7xTKhz\x\-> foԇ/d#5(8Z{mRiPεl+0=!EQY҅Z-g̮Hrft7SW0y%;1P$c;J)^") ,&pDNpN.mo%\"'77B%?ҌC oZ~UG|;6"Xj%"E3*RYRHDK/bg!IWGYGR]HV+P+ŵd!-QB[WE$Cts*S)ɀ"`BѓNqIo^]xٽ$附G[-c5%V1 [b!ׅn5KxS/m pGrzхXU>߯$OHත V\cl~_WM`ʸ8 Ns0lo/x8v#أ\F+ۣ= _uzo8h㵬^WX+WJ^?$А oHSIi ;e,bSr˽k@M=O`OJIISۃQfXÊ_4*LJq*^9[| l,s,4նφSn ѩϦP0jxn|a^! x_6$+a|2rfR(ɉŃjd5Lw S _yq2Zd47pb=əH-Yn7אQ4ǯ_zEZRfV2tpħ3 rYBG[ z`<wqٻ/8̓8vr FLFq%6XS >||7/c5Ϲʧ0dT8=N' D8ECon+9Xz@q9ͽ11|9=6֛㩱´_$? MG=A]3Ӏýdlhf'Zmjhv{kOВ) b4D87Gsd<͙S5ޏѹ<,"!j:wi*#Z]y6җ T,B0@3 e^˫ ȉ&#Le[-p=Mal S()u %!`b:B2A@6 Y"(8,"̍&7/9X LQ dܭ_Z%l MIN-Q?<8)aA|( BV;7<5/{_H#p.c BY aP@Tt*+8\~_2axY˜19DNWPEiShkP Z˙QYTSt9ZLTE[)* !WȤ!`y/@NϤ!AQ^%{vdI1WU%g . yr@o҅z0ka {Mw/k\5 bt-h#z`+iZ]]PxN=.ᙠlNp&VR2Tu3{{ fBWP\ʃrXE[d8P)/eT]8^n7lmE=O]ΉaVpX?O, CCH~Ōӣ́p;IǗhhՐ1rڔBr(iL/ Ӽf]!w0=G,}) Ly5 q慒ÏޕAN"<&--G?jMN[juF?wO2"K)_hDzu$X5p s TCd4Zyo[[O*A``7B0ۙzj/-2z跧II"4b?\M5.k~D[įtٖ%U ɗg8NҋOcD1gPp<]eW>O]haf5CjZ:[ҒV. {hIH /lHnju&̢eLJGtvPB! @%*/.e}|KC-  ł+3/54nv+B.ԝQ/`v+Qۀ¿-]##ܪU{r&+AxϘ1m*}CZEQ<ef~sJ73Mz*]^Eƒ6QWNIbћXh2Q 8h(Fg7|Yp`xonR Yd)^TEJwNi$hn\MMZF>XaK,KPJu-ky_l^B4LXeԣp63wD1|D42 ,k|Z\PŲáVI.hw֓&۸fR%M# lW|0!#ޖ8ؙI砱LN+HMb_T"/[8ZnxfҺ*lcp/o%Q r. + v'͍?PG ^U3k灀? ;IJ23 (9:[Lza#wT`yamȾ`ΘGؾ0{[XkǷ6P`aD>X~:(EĄqK!ndP'Մ.VEIS)@vIiBZٽ/ҫ>^uk}BFa$ūebvkW@gN‡gA?ZD^k!oVpYF/,f_`O饫G}]N?Or}JZ7]4ٞRxhB3\dO@,]7H)#{q !psmH%N.(Y.erl:0Si&vvhI%rAz5G<2dY ՚ 8k͑;iC^ܘ']jlǟ']Yr^L)]@dYn HK`[e, lFXaRv#Z$mj;-wg9-&3bAcрK܍ɖJ| Oӵ0I s!ּq'._)/Or~KP0-)|7O 1xDՂs_@ $ Nж>Ȯ\bsɫD^"I+YTSuq?7q# Z? A`̍ߩ!}ƺ2$/GQSxXsF6b+{TC:3J!Qس[䂆!AJwk [p (ۤ+SE'P*k7SBiq o%uŀ.,={ L @2Ӑ)%7|_,:f'N?Ӌ)&D2LbiHB" d0'Yȼgi&%CnNJH hœ!'71K}'j{wtW^7$AԀ_H9aulܕ`iMaq5oC(B8:+y2()0tՇh9T3&c7> K9ϡVraݎQ 7j[k5<9cNm;xvK/jG]3rFz(WtniZטtBH^_6Wkv_'Oz_;+Gy1@;H̯N}~p &3n`oT7,Zq`\$F(1÷zbf^ %%$ͭ*ʫ#|DK:&HPG+q -dS&;"nPa+ZgE9E9e jN+9b( zo=A:"JڄO"~AW5yM;m| *H,7 K]-<`!?\L+ˍ!J?)2\=}w K Wհ1jϘ`(N%q*CrcFaю!xaH@KFLTVMn\|zhl=S `_Evo;<Ĥ!8n]E6'i$&5<|sIQ=NOSK||73Uc4ј/KMM-Kaۖ? fAsDJ}ѕJ"ܕEzGNf@+jU2G}VE'wVpp=`kab; LA| ܌?Ьyw@2zu<< (1DI+-->rV>*#V_w.e 1"< D2ǿOkN}VuuCˇ!aw(ԯ2bL0/!Éh#ք}IZi>]/8vKuď=:Z(*'ɋ g¥%bJ Ls]"'6&0;~nf0ɓ/ݑzv9UQ[ /J"U;X}!t9"F/4 Z%p:pH@{gfP.¶{"+F)'рWG A87g,Q2IK^8`ܞqJnZ`t붮9 '/Xs PdG[/铌 8J_QXNM _6Pb!AC/]fDɊMC ?17D}EyӪGî1ˁ8y9U۪?ݕ1^LTߣtx-i" o; ,^`pr89 SvUeٙJ %'+AY۵tb+ ]f0Ŋ9:ze[|{3lBA0$ct(Y瞗۔C/e{#/DB<#~Aqs<"a*H$ˀwAr6ɛ{$䑞(QbU UVJBX2E}nͺyr|UROfE5m_0;K,U( dIDdL9A!a1fkA{ GߒDKgudafB Y=hy~]^~@oy7 ]k(clOюS*ǍC_l@:f`EY~swM7gv"d.cz _9FW^#a^jۅX23x{꓾z89Kd^~U 2䳪.Jú m씽/Ϳe\ie9 i‚GWˉSkL7]"_ʽJ̓?M.z1kSIC"V^&dԤre:YŎsȇp+plNzt葋 w1WauQKΟO*Dyz#rA_|J/>ZjB }԰:ɫ}RB"-lJf5|7M />͒Y:B1-6 n׊媬Wj֊E;QMJoc1<*.4編SHm*+WlWCiR\Cd:V{a 7/1G"Dw8mL]GtuǗP!ꭨG^S|0bMaI6T퉟At|.)?*˥tVMCgxy[Y+{()pf|$7j4U$>.˒5Vbhkɍ+%le?eqt9|^']Wt2 ·#́3 yP0CT 379DCQvx|H7oodhuInk%JښsXH-BT,J0d,;uLatm: >bF_w2_?gҬVHE_Az:Uw^=յS/'Ajc=$NJ,IhM)ĈfpoV&)-X* V49|oa& cZ}}MGOf]Zَb9ɜzC[dg96iGCoͭ_'Bp^In;$SoZT 嫨;M0;>옞H*'#nHNxG1f(r5; DUgs!,QռEyI fPQ@B5IR\zIֶd'ڎïi\zȥx,Bvچ@{YJ,eQ=%"ؾqjL^. ."pϠZv9G٠~▻äa{/ȝ횠꾟fVfKڎx!Ñdut5 (fK<أ.P*cpYHLަd3jH.2A564/$r%Mb ϊXc"үd!h7OK J)qXPq`!'N~ _#=!y)h)+5_ik=gbザLSOSq+Ns". NCuu3yWɂӦI"Ħw+rDΒ㒝HޒkE<&d$4EeȼW%BzJ?XFӨ7qߙpu] &i~Ks#|ֶcpFYPʧok~)P \: )dgsѸ~}Bَͥd!њ:=g$k_Vu|PBM% '_@Xt>Tj%I6!fJ a pEzF"wC3: -Zj5i=-pzVP(9Nf١ lWʪ]~q|?ɑ!!؝[O7$f$`$,mR@ AICyE &nDHMȽG=G! H&4r@ANf}o؏4p #hҹf&J)ʚ‡r y9A,$޽錢;LEy16hx!z uy&d 1l__ԓҋ렍Oćg*M褶>,;_>&oC}&D4GG _^,ln|< u{/$ceGW8 r-Y7*twgt0,:7yݚ~.`Mw@LuB!`$MpA߸dlbvX8W|.ҁ~ @Xs!<$qwň=v0D;dE٧3 JeAaP32ZDu;Ap ȆOUKU: l:|gDu Ov8N cw˟Z @"C%W ڜ XOl ݳo'+2 -a4Rb;R%`kXg9Xg2h. a ܀SE'CX̍sՂ;>,ݦӍ5v8bp# }ODŽÔi*`2BhϜ`WL~X3kDm;r1GU쁕\ĸq@7#uY7],F?~`u4wῪOpa#+دe.d_bԟF gNFPbi Ե7g|23:u8Ai7ʌt"Nka$:4YU_1>Z4 leҗ dN>](P%UG1،W]o0oz}rD!q1+@Z{ð%ZkB5peD+~wPN;]?og/&3hwÃО9X3e|Jr`.{G|W[*pLD K\%#9&fHOqYlKz:_1toVZoOS)%tgƙ٦&3$FwM:G d > S8!VcN51VC%%C"z>Os|j0fNN g@^5$# NȞ8}+$4*=W/:ǃDjf{E1iwDY̏rs{x_3j(1k:fiT`R,mʓt)Y{޻Cܬri5-6-#OȧA_*҉{ N.\ "KMq% 2BSE @8)J*.RQ^op{$QTDԨ/fCTɢ̨CB*&Ϥ{w<]bWM{ؠoy]dv'"}^zKh py{iA45 oϷv"'ۥ豪$x>/Rm=9asY F /(sd|#1FL0.j=K8GJ()Oy\m*r o-aTFv("eƦA*@geq*}LA+(NSREF bFeZ&]a_S] 8I]bjh$xL li 8vݐz1ġ4h)/Oƈ=g^u]I[ʓ^|X UHdXl*~<4Al[ QJqJƍo{dжבc w1[+>wZ J'Ass{m|^zmF9(W"S0) q#eׇ.L;"0+p]E qI[kd'z8 +M=ݮF?`wC“T% e)тi )"'A_@u/01۩ъ @moql0h6zY[)5)E |3D O F4щϓ57u ,CnE=Lyr(Bt.w­Z{F~Hg QB# j)qa4hmpELoa9``diz QJ* MtH̃Xk ^H+-RSF\ uG/oa  7JovySgDW^Bv10xDQXM'URNˇN-Հ*l2$~ResNLx]a{ w8*Dh8"sɔ3@G|8Mׂ_8;^nIO /05?nSqv),61([^$9rs0X" FА J(OF`$Hļ?'<9dA%وU_AWh|]U]*@&du]ve,`bL5r "K>d'{W?>93e1@tX{겧Adz%W"_D YpH*--uwD3 (%Fq΄)42+p30iK?FVʟGUp̣ѿp].ۓ :OD(Z yC *FsLwsLwܰ )8'3PX>5(Tˢx|XȘ˴^/z-L=Kht^E |'`dT)JDGf$&Pf!Ry8*GvOA1 #m״a.h/$ h.Rœ`-(⅟ o Kh`cʇ'σ );rQGdWϿ\/2ً_x~T_*=kCF6%lPc!#ĉ_:( 6;eLѽ C Ic- 3;2{hj!aaīr[ t f3y1lH])a,֣od"H}X[y0uGX֏_oꋊ)3[6,y7Es6RkRސ 1isWC.!__܎FT/37 7j9"z&7[f!,%o.>Z%z+b3HP`1t277%0H(X#]QġsaӃd0f{^C; jϵb>,*s ϛ(huR*ma/pM%Xms*`V&OYok' +60%Jr3 ͷ73b(fq% 2PsZQBsiGV\“,BR! B_ĕxaܒY[%Y.w,%,dS o$ 3 XϪҤz*|ey-X(A$Y)IR20t颸?<2omgkWwg(/&r7, Ge9Sĝ`ga*zfH8WޖYD+< !HYcqRr6Gk՜]}`z6KU$#"`z'seV~ҍCӕ^VawIGia:DD27\aKZh\^hpM3ojؒd#P$Dk(dB߿ڬiUҢ{Nv:ԡTslr|XHȖ:|_RTs1$ 7H&U&OLӯȪOĕ4Ar0P[f; _,]YY]|:w(q 7"~г"44u3ԩϬ,G.VۮH&3❹eTI/)EږHw{z}a;N\n=ޫj,쀸хu/+q>R5ѱ&3a:ǹ9[Բa 9 6zw-3_0jpelp$0Y)3O`׊]nEZ`xduWYF5qs=թԱT?@=z%?=SfONg\ִ8 k kK&*d rZ%F,8abt1*%ȪR;|pde2qzyxp}~?*?<^6ã\&1o$N:zLAl~CeCl7طWLD+Xש,Hk_:vBA2/'5pFXI!-b"9 ^ڳK68@fIk1xbg5Ͽ[n*V2 mKƥ?m4,݉V[;jLcZv=s{e{ouc4R~އU͕m_+B68RJ]%j5H'{g՜T"m[miuqfzѶRwJ|WHD:.iKp>ZI ^¹jrųgB$R-';dJ,d(AE H%J6h24?'ER}Lx\/X<: GA3Uy/cLg˳&̜9,2yXe:d[hJ1]NԷHlp"K[&)_v@_T`h=yW:JױJױJ!Ua0kʐc[ΙΏ(3##XO(gFN~`=NΌl` : ѲC<T*BD%=:;#_8;Og+rD,B-Z82JG-BΩ#b(QE(GDDsDmq6 -+IJ %[(ĒIZv*.avyLN:7òъGV#'eU~ec(EQ@ xaTJ#qX893as=4$z龔X} SP .MmEvƲ+OrJQd{V?ԉ?(p/aƷ5/-*M,\$~uQW. v]?P ?4y8Gև8w7ZOޟ#݂1M1ݪe,)ŏ^;H " tV4`y~Sgh}oU:L`kx O JNj93?'<யp DLl| n]D pbQ {A>/|dӸ(il%=~-=I{FМ%fFy߻]ooxߵUcxc߻} OO'QW#\mdU`*0{mfdeA@J""Ao a^ M4ϦoIIJT9yY]+-p~{)Kn> T7`kb(IkQ4ٴgv{87jb1rS @B_E®N% ĒS5>XX $9TCKꚉenV%`%/J<`^.3kdcwJc9>rȖk9(nEҳC`n"65L_0-DJ'yP@dXX@A~n<23GOVhuwu_/bNL0zl`'  :8d'zqPYg:6:.nts=u5EEd17Fo'Q}ӳ"@,lG _ŧ𢂝x91)MTAEz>E~Ysg?, ֬mBcR!fеUΆ%s1+bYI:/_Twp#PIzߞnׯHBOC[~^Upk|u>ʭ|]A~9\ng4 ӻޜ!Mv\CSIrSI:W=}L(3"khqPI q_;Cwt_=8+!2orn"^ڗN1\/NBm&Z1aqełQB Iԧ; ytrۦG 9-UpgJU[YzNxG;8 G@y%vIv3ۯ~g:֑KtlXreQNduune̶WRbűX7B@fӱTG9plη0dù?9w"%k}!'U\XGEKڼ)__|+ qM5V=kc@3%Uǽ7U:'#gB6`@z4B=XxL7[-?UIk\^juW]<Nlvp;FMPsp2,Һ>v #^֋2D`(ĹZu7ڷ)dﺒ<\PS_d}M0)V.={wy=ZWX#Gݔ+ gtVdd q3o0ҍOP7py5u5gKk,R+ ̖+URNLV:#wWsPS@ ئWʟ=!BW{-M e}r \9:[. 9J[r2Rڈdts8&@Ho& ÎϿ\M,k؀Si W`${TcF) vB:g;O m$_sL|"vOf溋 .,!?M:؉ W*(JV\bR?z@+vKx1 zcu//+H ق${TE&YNF9g2c'BKLF;<>ස &8nvl06fv|J_!VOJC֜P:pe8!{ <-At&.coIbN&=[K>f;ewT:u^% [y ,c(=tZ:\r mJ F.DioA>8y7ߒ/9&G^d-c ~?]>HA .6|k_Hjꦤj0uVZzb#7:c{q[:nj;qmX*< V~%zk1ŐEO.t9';|JT\|H\(xk( f및zٗ{.y[Q(w,Sc//(,(PE,Lt\d HaoJaP_,'-CQf;1*Dh:y? meK"(h’d 9QB5& Ϣ.b8i*s&N(<OЧGA=d}+Ppxl[}V;=ݎ4#t5sFrY+b4 &Dʇ㉄ؖ' S$zLI_?o:w1^Lc?F?q ne_Wǰ23r0  qŔUBp31t|LIrRunel5p.TU_Sd*3R%I •gp쌥q渂apEѩ0)dZEKYE\o܃51<:|Y9O;k bYSk?*1vVdhUIU? VE~7"eY1&wNN`]>[_〞g"YLd|QP7!l.IktY,bjIA9kz ֲ[QC۪++c_;B[?XF4)JM 5 MpJKjW(źgHɼ\ϲ]g\|lRu6gm3>[}[+Ib^ gy|:jߋʯsǺYC4zq rCMW~#u7 ѓM ǖ;.b"Pp͂?^%ۚ wv0cI2v; iv_5>hLt?1~ӘYҥ5HZfIr>Ifʮ4|$x>hJa :9zaFHt\^]'p mcNTp15C1_J@41 p/:tֱ&%yǰVJ*@kA0y/CRƈG<{^)ZB/x(߽\XT}߽a C)7[a#@}X&#(Jͱ=.NJZ2ͮ:R"4xSS`HTt# KS_sYMNCsu=,9,'/NK׆ljܴR:ej&ԩm ShY$R + F0+4 w1^ͫoM%1Ѽj$k'NWi,)iŐ,FuxK*° pr-N,# `/RxʲGOYd[VUQ껍^b挷?ŴLcXd8.H˥f nGRa*XgT")It"q8hS"DN⊝s)M 2O 2r$,٠,>Ds݄ BĚ a%zΆC`L#jưd7:ԹO{ ̒A@8De\Bl9BKc3]t[mtXƌ>+'K…3-_+lUApcųy8N~*#=yAQk&Ŭ’.,9mE)GGJ9¿|@a=|i[[E7?Dt3C²V1le [;^DžΎ._Z/ǧ[v}V?C'E/gE"G?RqqYvtrO'DlEnL1/ T#E< AfTORt<˙dzRVPEU!SrOؾxI[h`F$/ǘOO(xu0|~K>i-F|O.rn者 ;=z6&faC@lpfc(.I% 9-N1IBa!WE;0$fz i~<6g9.]K*2X~D4G;Q!>*DRL;5M2ql|ŘM\pqLqEގW]5^p#==Iψn6.9R}%^ Glz,n{w t 3h^~, {`˻`MyRx@x'3xhgM D>z aH$߃:A9 .*EЀE~UpRK,)IR)>'1^b_v ah@U[(yܠRy&_ͫt6cws$䈏( x*|7M8?R&Z'㇌WFO.VqT*N'A)qz}c%A8O}'@>> FW̽i6@ QPl`&U |kUXߞ=;,u֫[Vmq5y U:2bTeC7+/b\HL YńF2LUwF!rpX~dOK%ֵf~>Em~>91Ø\Lcƥ5S8<Ó*WZm_Xe xq Ɖĕxq"9q%^D^\nENHȩ媳l|iqt_ֻ*ܑ;˞GbԎ7oIH@"YT:4O FaWFS#Ifٺnf4MoԢֺ{r9< n/2$.[ v^cv}'+xq۰_!{LnB|V[+߭bnD?ڿݸ,96.Q-6z͚"-.ժrFWuhUwA}UP~$ @\#Y Me6SwE ?fMjoDЈX*^~[۫[iguXLW&p!3Yj \;jr8ػDZȍ7Gگ0OiXF>iRY(}G4Y]4.eh}U s+%^}\r`w$Ͳ;di$q,TsatF?z5 pz6LT1X>ҞO`Q¢I{2`W܎26#!?- ֺ YDīGGu?H-Z'4!G8!fNϓgߟ|2|$csf < JHJ)_͞%|:)SX:J \^VFe?fxTOhلZ6o? RG$ 1Z :jOMƚ{x3y''@~sva}e1^ܼ/e}EQO]WԁcyheeK%a Ck1chQu,kZq,Uw%G0>q jʔMkZL%B`T_O^QJ{ 1@%1fڈ2r"l܆Z͙Y +*KM_ v23G6x 9%^s3gle!{Z}U X#̆'(]<)7Qg NM"{sXXV`Goo= =ʋW|+}Mre`^YZTrz+@Wv@-o p{5𛵲~_^D׭JzaIc'H{^T-Wɂ ue[('+Į~tB7HтG,XZe_X6m# M{4#!jѥuw+w>u0dzI4*K6Ά*?o득_=nmeyi?- .d+IaheYVto3~|XDA#uK2P:H \W@%WIj^"u2xAa$jZ4;}'oRȨk.CF vPccxC=4L:pkz8>+$UaE3V6 6#Ww\>s9+Fmߋԣ`qbJ!\y57 Z|kHS }ӻ:.?ćjnaxt< OWWË!8cx7-o98T1Y%bDZ(M+X$OR_Vv|#B}YkHKSZݹ)"~k2+g:! ,|ИBu+j '}? off¹T;%])"ڮOj' *ar6Kl>%ef e.01g(`7Ih; LDqp }c$j^-F'WqmKK%*)(LURueHlv%ǩX{8Zz>zfr| @0yj ΘɿջynX?S#Sb~6r[{͊^{!b?yg?cHi$贑K g+ ӓ%L0-߉y{=KeHf~xXnX%|^yF{sd<Ωyγ,hVKPiʙpQK?]xu8.i=AF4O ] [cG]" rP#+i}dZeL9&l:لK5o~s M\{HM!) ?a )A?/P̼彀yя;O.Oʋ)_dB.UN'^co晀ވ. ]Ci~JSzq^ӌ {\m5muzVft ͽ؋nnK=l$fvVCK[4y6H9J,k F3NN9u7~/f+ LԈ뎀Fj!3HiZΧ3X V0J6U>EU=2RbPZգ* Ô |F^7Ҷ7NJ~2^Ma$&#AOxTГnW%jJw̔ *);nBu(&{"_ֵG*Cg| z:e6g.Up%-]0.o\S rx|np1i  K 4 ~nֶ-5oZy):mz(у#l FZm(˶V[@B"#Z,m:yѪ:AHenFHݰDׄUsZY:KgL) 'J-lԶ-4k@45Z17%RJd=-& ʯ>mL +ŧ(a%0TB kym!4Bx7"uw:[[|wl˭Zۿ<}Q^M?@)?D*S +5_if3*pp J+G# zmu"ܤS3#g F|$x)x?ߟa*u6٢oT{vt|""f DAo[jl1AQ71F(]e LF_RG<[(u6 LRj@nOx=o2E/p:]>x* X1gO% +}q`CQ/*iʩ!˺Qćt 1IH4 aߤSg.f-bLvv<јV#@4:@xBÚxUd/mߍ#bB#p rGѺk<-n֧[0/Nt7Pp,ZcY&Xk#M, AT\%-uJze\3\n#5y '/HCD=x\le[Agm{I]]Opߩ¸W?&p ݕp~{IQ Q]AG.2Jg qcD(\]'\~Y)Qq軹p@NK$+`Ki@E͂gR6%އr:0{#fQWaYWT\ۃmUhV BwUNYn~2 ?!Pfg=Q4M 2U:M u.` k|5WfO<}K ףb%=t !OC6^:=MH{-#vr:`˸ǯAIpJ?vnlLO]Л n$ 7(5dp:]\I$.91)sN{oa ԩPW g&W8Ji'HɘmҚN^Nt|>@7||5[1I/^q~58ͧ[h ?:xLmFur:ί%/o8r#mw@vn> ^ۮUL/+>4Ed/Xt"%Be܆aJaNM5'oOр\۩mv eAG7Z}æax/S qH6`k^Qr˛U:UN\uS03k'>|Kg˗͆=2 wR38 36Xt H oեoheخxl0[]kj]^r},?P)[j>EwT[Y-y8xllDްѶ\?B ^4Zl}Asl&JmنkSNitI?+zccuIm'`mӇVrrK\bK9ŏS×Qڑ1 s#ޝ0x i>~W}nvaTwpoQG_X+T6{'ʃշ 7.>{ _6xE<Ļ\ؙ(vh]-lRkvKpC4: &ǰ]3@pxr^E8*ΊhxAФx!AwhhC]M:H0e9{ThamgQ28)-'8CܿXKI$bѴe kKXTj׮/ZV%= ,z:[ـ\r=Xvhِ,֘p^yYŏ5|c-.<XUqz%pzEZ$Wpvu:#y, F/C#@BH9v0(Hu=]Q:ssf3K]Y k3F4k-Eu>sG;Ouy^mn}Cmn13e Oi2`G.ŅmpQ?(! NRrh$=t)E|i SO1hh[یjk';|.Yp?/VlgeV+oh"O_ 7z Cj:c|g j;{)QƦP =G"y7Rb2#K&΅ڈynhgdtARc"#@<+sXzû~]I*w8-Ec9gqثWhVܢ[vջTYSFK6y|ToqAT >?v,^&'p"?2 [3tĝE DD;*u"k|F/Z* qXҋ$ޚXMs555XTg744$mHO3PoAAIP5-I|":;jjT]=I5H1v WBeͲ]ᣌr/ c^a<}iJ#!2ń 5fdq̠:O\ 1$"H,xHH2OCj|,"QPڎھId") I5-o qbߔ7ApHs;rq |! .j;!oǨAOqHU%l3s'ެ%0 ͒͞D?X_IN0#bas?Du8c-N񇽼*YHu:a`$b>f9lb @ Lgh$L̅ GLCb(apZe+}$zy1_e>@%}x41=qˌMa(d6UVd1 Af79!  M`|MB`D+OWz}'W*-1(Y!WQ x89Һ ټggKYl b ΊY58[| ; ۦ8dzɸ-g!p@L"s4NQcT©KFp)pgNm6_)d:M|Χb[˃=ma}٨=UxS F:lY:.22B,Mz0<.Tddov2bϥz'*9 HOz;\yI:g*rN~.N:o4œE`pR_r9Ose> !ht:y(Ȟ^>dO. ܳ{|0ij$pɉ$He'P/Le}GHhfhF+5 ~`\]P% \^#Ka! /F{50D Pz„`yXҞE5۫)ظÙuJҸU⨘) ZW틸g4%\,dM[w2WZޡ&_@Z5l6RggogUC"KWﬡQwL[fE˙.gY`=v Y/+Qخ;SY֝;o{"0R[;|9m9l;2$ȣZD]RP|vFs9̩ŧ֚ҹ:e=\Qmy-[V3NMo^e^YK)TC8lIh;'K Z^ۢôq*{ I! o,GԔE.hr9 2~~x ! .͑$Řp@RK(9x"+MP4h$^lN ڳluh1nNUR]OE_'ph-{t Ʃ6gɊĉ06<h`x4َԙa\\^ߢ R8!vNl=pS4iBnKWi k?<{rdot)ۘxc;Ig&.oNH0ƘtҜ{<o't0x'YᯪJ=1TJRWf#O):"N`oa+RL.t|{QdJKXޣ`@D9;Ih;)z~= d~ojc>᧳{ By%S>04\>,k5k,ɗ1r"3=@ /0#_3.?k ]$x;vGQș^}p//v6Qvy5K [Y0H⵳4/i@rd6*鋿 υ ݧ?x3󯧷4c`2#Z6 OaOL*P. ~cQ L ~1ivN#ސ5/GhI"D OpKJKi[f&:`, ˦m>.`[L)$6.J k[9鍂HNGuK 2Ji݃](yKfAo=yJbi<%|;S 'l~=C]*jVO:ogw^xM~;o#Yӯ8wNl/'U$Jݧ]`>C7$7h5Oڙ}6tJ{~iq~9C)ub`}~:Idz)p|Q1^n:0 6IQXi 1/)8oٍt&k"YhY| OYڥ~/r#pv'@B1 10 ^լ*&V 8ȀԶ=ZX$+h=WQdlǟSUEyPr]yڣUŢ+1ISͦv{Qm'ɽ%Pԋ_P?j?#X<̔R$͉gȖՐmQƭQ鋬qk`ö3-Uq1e7lR /PBφ0 OPaaַSG&dLߓZ%ޤrTP?\~o?rFK~,Vn;6,힘f&Bƶ0tJ;uwo8.GkFoɄMir['uD֎! f^O¦^T"7y2K'MWJ.Q-|MK,,ҩpf5UP ~wx һtX&2{8;,rQA2]p)U7w*uЗW ߥHwhȨ,X#Jb&񒿆gѵXMO5hDMEJrН-;IxwHRkb!VZw.硍@R  %L ZA-l%^y^,tk0[}O"A+_տNY 0cq n|KBk0u0x@=kv]4ܐ\r("UN3"_;h5 %**lJ{5>&:le|szs5'/_E?sUR.R]5Y7ժrBEU!uf A!j/VV[z-Fw [b7_\0o H%ڿ~=;iIJ6#1Մ7\1 {^ŷ| ',֭=g3b%8V.V,V/3s'2σ /_7ϟyr9uw?I#_ˍݚ)@ƺZ|X.euo u}_=TX͆V߳^<]nE罍CyIXz &t%};ßAuz3C{H<4/=z^?M=Rix^dzC/?&oe{sco]`͹nj!`;׵;I;NOO>']ViNypryv5@TQ/JB^ h}]U\7=XJl[Oxqx^Pƙsy]3*Y:zB ^.éẅ79gW{+;057f <027벨/A܅I 4g?&ga~n<#NK6NEKͳUg?Wst$,CQ:TJ%i2A(S-˵|PZ/xLgMMoϭ {5ك5<,*?i hJjnZ7PTfx/c 1X={ضx๭55_\ٙ9UlJp z%<䫰olNwr@w5L\4>!T)@C'.܋[cbeKԥ lO|˨E#_hKik:>@d^~ZIG'2(EAn]i[ev^YtcvU0sp_IJ '܊8;9m}&e3Xx-u޳d2Cc81sIzn')u0D;1^-tlLrKN"qTؼ'֊|2973=q|:|@vhuv9LڔdO.[}DRqtH2#Ikc4pJf1ږ_r0QI};BqĻoznBO޴7vYihkJC]oY}72WgƼ?S(vPl8 =]77`d>o9[_*p4D=+-g~}=Dletid>$l1⠩W[(69ӕԤi+Yge&nhIFpg=ϰw{j䤀Lܩ\O.RGZ եz-NM=y$G7ʞʢE,lY]"w]ғΝԓp8K'FY}CgYL5VǸW%<Gti=t6e; e[{42.(۪<) 5-p"lߡXXx}`4KRM74):KO gL6k3)*IYjJ*KJ3D/?%mVf#iFD&gWcfpfa2xvKsc ߭}Y"yg󙒱?3%{ΔZΔRZ-^sFlI[GrhJ 1R*ᕽY}Hl*95^E奎(**r^3^koo'Xg~C\LCe2sI7ʤx[U^Q摟eE,8xgFʝ?ì>̲o mNē>=ʺ%ѝfEG?iV(+yҧeֽ6i!Ti>6>=_)@JgQMܥ"'nԸ$J#P%H२AaL(`zգ6sU'C|Z~0|Gx3qI+/w@r\^ 4L„6AA7AA7AAc!4(~u dG \#@v1f\5f&#1g~>H5KvQ,KM]jbɖ)''fҝQb4t-`F>HC@0KOdDqVyEpvH:gюQ|`^CyG;}??k".bTzޠ2&tt   !b?<01}8q2&|8~/V>7b7b1Zd("졣 خ|Tϼ1ypT{!?lc'ڙLȌ2EǍ ;EF8yoɐ}ITzz;?MnP7c.TBixgvZ8"s=1]ݝ3})l#y1pT?g 9\4y' X ܢ Od䵈~ѠER^\V=Nq2,+{[;80"cqLl`rSZXUQcS{vS[ŤNiZŹ2v9o2s+38۱UHH s <.VYy!<2͎Kv;9$ۇ- x.nrIkacD.PsG`6g .o+8`Ljhڜ> i@v]c=5Jkdo'F9Uzp&SA{ !kWz(d-Ъ% ZK)8jQ_IN:qڏBmP+ճX\<; 0w l8z.3lq2Z,j !15zC['nU/8zwom穯&DQIP4"'?ABmrk]t=@(Mjl.C6E2u5bZ4\:!UC- |wU~>zm #D|ggq` x [RZc%/I#x hI5ʇBADen;> H(Ӝ*`IIC{kF:m'ڹE¡cG׷ LhV!'*?Tm09C% U%m%#dA$l'|qc[OfOGo\F1)rfYN-/ q1 gh4НnJ*da]# J=ny{ 'l# Dfk4(ʖ%,`kdfj&8i>@X)x2X>&~e`ƣj^uӝjbO;j(.L]x6@ؖ[Rh6|h:WXcܤu`vV(kZ]SH4x{E&,s?gG6 `POh4BL1hRlQvx~mU9_ ޾Ű#w{,bg#r[*v`iIR{z++u KzǴyW2vV깳lG9qn'cXxxY&@Q^v,m#ɈЭ\X" 9*K1ļwdf4ÒZ՘n6mFsTȠr%Gxd ee~\&9luu{1x-&mB EװPS@ț8R zrZ-ivS*BT Ex*m[tR,%RGF#>(!Cw,hIJ%ؤ:lX]H<)L%I>0وI%/=,\O[e:n;cӀ0`R '-8DcAĭ()328j߄ &&4Xdly 4NabI f$9$vӈCה^ѥzt]L(P3e,w4X( d42GdVg^Cџ,=-S!F*BJT堲tZe t VnnMa!mv-zofnR YF}#4w≘Lȣev.w@QuDDnC9xy ;OLja0@0@0@3jc0>bf8vL?W @D Jɡ rY ^)FCdh莥<@0a[;MdMd 3-2P\(cm- (6qUet,7ۄ[wz'c2b&M<,̲<aX;X;/?FO=}+FO=X=%bobt2c71z61z[o_ollM|<>RwU=QvESG. rnw4|ryxvfS0 R'ԱBՓ@@}oܠ鯼hψ1PEܠ6JpU߇_"pӟ8A}w!@8Ȧ4V>AM <6/rgab.gI/Be UfM.2c3a񒘻!֦߲B]}_JTr-dwM0upD}3Q_fʖ;Q.N%~rzZ 2OO18ikH)'LI )C+y-?k $AKW{ 6g\Wpc J\ɱnݣgB-em5ۈnb!<}KKr٩ްAʌehٻ쮆"zi)#ۚ+e{,|pLcW;crsc1=z]OGNMxhZ^ Wj4Aqa:nU۫+Am?m?m??iApb9!RS2hQ0%ԎB*S\`աvFnmR?WHU&C&l\DBkCVa Aҥsq8,VPa VM,&;Φ1[.!"M<4kI Ɖ!r>Z2=Tи腄*>tKWrͬj]2fI4ѢxSC-@Y!5 Q1o G52 s9:0=8OoV*%vy ?~ދ! /5teIFaNadi˲2kӃ[i_fl|MMg@1JVԝDjCE20ORv F*:c?!YꟆDiH fhߕb`3#K(ຄadбC*PV5;=3]m/9,ʃ34Ӽr@MFҳ,O&5NIiI?}RR>IȜ䕇Oe EE)#Z씉 䳓S|wzi/'IQ+WFqB|HEƈ2,ykԊ o;w >K |mth1 o`\<5Ml_ճQ.|G' 5xu^!O"1|F7ě@|TVl͌GVIl$e2hX\IX)@\7u:v { C&5"[xgJM!A:a- 35ĢY<,r["Ȣao=oE[eOA&̖DD"$_7p1i#2ArX;h~^I>s&a`kJ=DzK=X|·(s?ؾ,>dGpLJ`τ: J ]9EfG\u`bmȷb-yc[t0:$Q nR.d2Iv'q*yF\: ^o҃膽yLO1 wi4:E̕ t9w͝d~`:M^JEskt1i||PO$QXcH`)B$1E &byGܘ0:%_0d * iRk9v_Qc"9##_&Ax;AN E{}Z7|*'tW*_W|6ڵF߫Ze Q*3!K]JМ{ԩ*3@5s}{ϫI}ٗOĞ?k뻽s3n5\5=}a{$L"`-\Zy`2ɱGb%;\P>P.\`r~܌=js%Jȅܒ~?@srÕJtAMFxx3sӄ3IpٍpΪV~Nv-).h 9f" /dX Wq1*R6=N2'p)"18|7J<-x⇛J섹8;OHԘupp~-x@pOW;.46= .λ4˭-&CHnOkz2e2;!lk6ok@86nLT cc+++7"D{C7'ԝ0/۬\0>&&Ӣ mVbb\lv:gvkgv?gvk[)QyyFnj`]"6ROll-uVllw0UN }`$vɸqiM9Ћx8W⧾!Ĝtq\;t׌91ԾލqHjIAd̓&G>RX@[!P2aº! yn1 N;6uCVU;tFTF P"8C!I0~b4~ۧ}YTbL\cP&Z =vNÞ[2A^qR՝t  ӰRT|]<0C>{?O7??,{ZKFֱ/!7 '5p$ ՙ s%D-Ac(pدHPѮ V!|o/|(?XJ:=N@ZtC^Gn7^%סL BۤP(F F 4Hű)$мf?\G]5ם"5(b`<ȭgíSr>/Em2-+|EQx~a:.We)%rj0]ӱd4Bz% ¥A evL AaaԪ= Uv47\_PUW[0fj0ɗi}A,I[ L8DiƋqA qA.oB PWdzu5|4ǦQTQ(сby%3BY jv,X膇"yl-P *~Tm[4q|98qmg$(D6pQrWuxͫ #mS OF-TjGy+^(ln5u]ž"Zͺ0_]&z7"rjQP/r$Š@K.@񝈸r(Ӈ/e`*~E+@hvN[DȐGe~v~EYՐXkȂmfR$䉦8дz+ ]+Ta:<0SwvKXbv cɊ7{aܼӵs6XtmӵwV1T`;ꅄBsiHzh(֪PH-]'i50C@F674{8LĦrMÎ[ $-4|I! Bk2BҪ NIߙu}I B!iDH#BCgm(IբeVI >a`&]Q= GY!wH8Po< .|64Ҵ2pi,< AӤӴrNl˃R]TNx4v3=TTM &&ڇx%?0z`22"΋nƒxpV6:/ "R…4Ĕ6_iNJ qm5X5M*f ;IHCWwV枡j< 0 lpg|UthsMއo 1$nnDaN(Ե2ExȰDӅ@]:E8sN뜷7xSzwq^,`HقU~_y0pqvRE;pίH{,={LwOJ@*ׄ뜁xYȨϺU65Ad ͸IGy42 WD Cor MD5 Z;;Wxn,V~w);L̓shNdvYr5C ``̾rWY@oYZy=o-i P]hWdF.zqѣ񚳇^w0⬉;uW_ ?pNLs0b8:'ؽRz c(_6nt˄H:3$L5'JXAf,o! D ;XXj̪**1/6>| qb޼W߲K!ƿ1l,+Nºyu @WӗhiNqpXL5XxOp))Yv -w%2}1*h;x]. ~0>jQF/F㋸86@6dwQBĝcs7Oat CVz*77o=/&Qj?fWs O۽^3,V1KdѶ0qZ Up\'UU*vZNrW{"T^@DDoIC"'bdž 7vBrq ox;)T`jŠTh7dfWNQc@vIW0:YH`݈ qHuiNu~ՔcibkhNڮaYŤb^s]ŝu.#tx!Xym517-S Bs>u_F_w"8Mǣт !M}ݎؕBTzl.魐ǣ0`tg&. Oxm9}w{؉$h} h64ހ$rKD~;Q3HWVY?'m$cG"w"񐓰mPX:ޙLVIo`W$kHO2Tʞ{M/ߡP̛@ L 0::)S XJ:3:y]OKƛҷ<;JzpkR(sv_ $o40]tD2-t(N&:O5QhpN1eģT JRn+*"E<$>sU䤵2p+\e1(E5Rafc^T{WjqiR:d[v8>r:wJ78! v`  W pLB T J,`WwʞQ?ON:K8ėMgѪEb?n^N'߀M32TvQζሒi֢:YZxp-[STrAÛmu:5Ϻk{VwIqKK?֗+C9 юs%Q;a|kG+. 8hA< nƀ̗kH $ig2JO)e}W\hn)c6wȎn$AO-fBg|bXLLV_?ݷV.27 &#ڱ^w_!UkiFZ_ANϟ$!s=o wӢ=1ݰfXzG&ZrDm*t#.ijkĚWcHy ?z&æ\#DN՟aJdY+i g)3{) ،$44~^a^@^ <&L{a FհqwxHS{,|-6Gþײfbᙠn+&ITh|n+MD>&ۢyRŽ֮idX@P h:Aȉpp $+C!xNMԌ@H/@<ɌKèBqa:6a 6a 6a Ml2yL܆{ac`X6O)dJXb g?&wCPy#D3*XKSV:uS.S&)" 2]:#buZMeZbD lgmz1g_j8ug $q;IU"'.ZEhS SP4,4Sd7ѩ˨bPE0 8 ѐR !B)o R 3L1(s^*ɿOd(@ϡJds#jnܔg2e2}QBHQ$dd hNz/1z-kvzYN7<<3iƈ zm""80,6 )С Y^fYLtl#]H/)~,AD#8u &*$* aQQ;ʺQ#D2rA  Wޛ jd D S! B[Rҵ?O$k\|vtNQ/g**22@EF O<$ZQd7HE>C "$[7P 9}*]ѷC3P8.28]xFl&_kܢ>1E.1A`²"8P)eM[uXra8)) f dd˦]:Ԋrٞi#9$`S';A!{\#A8Kd2qiP`df@ 0aQQq jS5K+Z6ZT*KŌSizeKOۏݞQF9 tq* صvfD\J#- zPsO2!Sx-Iho; I@=4}CJJ>aRC6'R@PX["M 2( l(OksY0Er%C rV]fFx~# ߸V#83"8BFfKƍGz ]iY$S:oB:t9]XkbۮI{4\ .y LoH?|\bt@Zyc;T@JȖBs:scRJt0}n2o쯝k _Kv\OqZ$- 0T5PL "y[~peVǵv, HBC^!0HJ܉2rͺ#nBKnBK%K^I| \ɌD|'iQ&=!yCV)!"X1i|<ɈQ ҘBr嘏n<1&.Y󑾂0~w;_&&B: J˃|gq 0F}*р$D^SZ/K{"rh߅ BXK`y ef10dV|@3S*&9PbJv0 y^4 @޵$ 0LҧtIgy9$lM+vOh ;:s GG%:cd:GzcH9ъVd;!B'Úё P7Sibſߌ#4ZW8Є7:h 6e0JGZEPyK틓%;V/q^k2G*Gqz C{z-~k,c22Y1b"̓?#!4._{r8{lVj.vo im@7 gy:5TM:c將catn,sw'LẙY6# %ؚD$1@o9ȟu</G:aԁ.D̠}@BR9$E&"F# 3xNxD/v>2iAtDWhUGJaM [')60"GARZ̑+x?3 8KIt)i2"TCl*Nל7_]R=!LV)Tl^" '_D6f#8@3 "̹+(\\g63ӮMhI}+hR>b8Hk!:gJ"*O&m1XI5lP>]m(.73Q [J8m> Bs$1I&xG6Z6EP/u[_)70lytsc"lՁ•۹ {7IОpGH鎨HgFTfQRM`)EXB^z̘KEotOE,%JF;0+e`Ca0MCUZTIlwNQv;UA(%/|pg QУfb}>t sMũW{uKɀJ x{C' =ﳷO i`J:ܘwrop$;'u#O^,XG,^דH_[N ;j5 Jcwf:C b%L,CRښұ?A'@$ :F3r1NDUq)xWpX/qI|Zw |..Bf2gz\듼5fޮB OvNZ_֯5ya(,&š+_r[^Pt.,(>$^,L Öȹ}GG "Ch&9!1Z|L~?bGڷjZj4P"PdA\ |`иt`ٓ_!׼ok:b;۰ЅtBc) |)LIEHE m Յ9ds!d>{*u;)J_O/\#s%J|”R\$ `uQ᪑$W&̐ Tn tm7ɥ#ϲoP)̞Ln%ڙwԖl)nNmv)LqsjQ7)n|t&fY 5tuYK=HR^ } ]K|k;t@ekLD5MZf3WM0D1eY=Vh \Ouz=sߏ6S/ֻ-"?2 Riu^Woj6A~ oߗG~'`#ݕ"<.Q3sWۅNc80n|TXlk/?6N O(wnB('&~~~ fvܚL FuwI@Vqݡ Saਂ$*|m2 K KO%mΣ7v0i0k|H w"Oj' <l fCVmp\Wqk7._cEǫg{uYJs(c ?COXl[RzLR}pAo)a#xwewCd B-(FsSHt3–5Рpv )Qd;[JDwk&WZiރ A{dX130;^bnUఄ*?@%j_pZϥJ# Y^p #WaBoga =Xaֈ:b4- %E`ldhsR0Y,~X 4FW#ϲ3C~ۍʯ( #+ϥoaSbzrZl󷼴4XkZ{FU׼miIp6%\ m6SkdE,) EL4>̦ ~׀V1M*L%o"k-vmw>c[tҘ?f|mJEBLe8\HR",l,S.=2AB2'2y0s&bxږ.NK@f)-`Z^9KX@:K'@}% QEc`KG% jH,b S8}!$#n RmUx}[vUdpƧz כ'v6̉L'9W:@U뽒~-*/IpO''q^T(w==d,֧a>x]O3];9EV5ͻFF쐁Q`f %?ȓA}yyS1*yí~vIL aWXxPQ`״dk'ⵣ{kw gIj.kZ=eEcZ ƶg~Js3:h*c{3rKJtX=K|+Tȓ,%=PAXk$ČqD &{d%)~]b1x2ɘAR+ Da#" y~ sƉ@ @H3ǩ |;B62q E?"l ^4PBޖ|%nT92C9L F 9&ߌuѕLP) -r"T, P[\kޛH$\[DZoSxΞM 3XIUyh48b8蜿txSsAC*:ʊ/g +EB7[\g'tI.lY>!C'U 4 @נ>E9" Wщ{hddR /Ip w=X{ -#\ Cf" +Lȗx8J3߸LMQL\ \ ˄"YH83ID(h'7]4mK$X<:H#OR^zxuS>U $qYѩ+CbɟKloLUDŽXy`FKWf? WMc*c%tp,Ogr՝CArF:xD>/%Su e 5m i?1ydsGmZԎZU=!| тyPfdONuZ&/ooEDfp4uH#6~O=CI@ e IT+i3>#\gc h.a8"JMռMoDZ.c̹ r{pQpαPıH*\҃O* Eލ4d7ۏ\x:\\L27_r&IҾ+ޕ: %f* c f0A@5?`!4| vir=L[\]SvQhu+&..㉶#ZKDuO9K;1%L'Ki$m VkXx߼%|Vcܧ)y^Ю-[FCzm '?̡HЧ.#^Se'-H37)Ӻmk3zy}%Md䊽qOYX d\2$\{l:go3jjyݰmsD/j.R9U{Rţчbx0)|'-eO ɶ>П<ڞO~۳k?Ƚ>CԶ7ߍwc7_$߃GhtZ;ӍWn,J_6glZkB{9VЌxF_1lO<juC vcl-30Fh5f[<Ňֈmmň1wxoE!ۖm*+ZMOxc%XVbDFmeځܷY{=nٻmLB5jqLZ.m^[0[D4om"~۴<IϘdDP4KߋX8X ż<a[n'ci0XU_puCaW7ek9^aaw 8QiH+bh58p%\iMw\6g3Ϊ6Po; ?惐lN ƶ"i^PM?y8GrBë.d9ec>f}~g18ϋWyaD޿nKQu `q&iLZsT#a;FSI:$%s$-4PJJ’S$uĜ&b)ϴc'쳨'E}@w M>}nZG(۞C*|UxEsT{ w w)\<4xw]끾H#Csr(Nd"lgs91v_F1GpT:[m*/Ikͅ=%#&I'/vPa&J9 kB0"q:EK;zN|-օ;1U\-'A0b9E>3+j̇ P/(X'рkObrn!ѿ0 Ou8fݎ ,^GݥJ^4kNع ߔҢ"K3^(qXC&)̻g!u! 1h^*h1Sk^4zdݍfG'*,*w[1| fz?Ng|>^± .GQc.os=w>YB8,z!ƛ2BȼT͹@[4HhAZ#dJrt@MΦ'v3Cb> 0QF> &>z> q\.>\]1O4_Dn lŲ.C[W~g&ghVO_d;N?12e bݿAMC2Kjj25Q7Oր:P:BAN'CL}6y;XzތNt -§]N}{V>Tl:jGEg@ 3ޑfNnjfc8j<[:oElo'\Od3\=HD+9/Wm1^;zEPlmb1hW 4ϭWx<=5*8R-5^Jy_V;uo]Oiߘ4Ut<o! I.߯j6BO-:`GS+j23+[lm:#yAr˞DJʅN5Q,˄MB;3Lxq7ml@ j'l}A$)pUl1OmWȁ>4g^E岧ךM] hQ+U\,񯭆NYj۬C'Sm-M-Z}Ӫ4z';XwT.yKZ8Od3f;iG9<2dyZ6` O"sVgQ.F-7kzs}蕏|Q mQyP(M>iM+=(R*\89)Uc5:+/7³-F񵾥Q1S̔}-%r> "aj.B1e/wO_<5T;jkv\A%ZxX#cG=IX [W1l%^q2OX٦LCQ^R^wvyCI)wJu|8q h{X4TTPօI2&5BJ,w%%Lj5|5= C Gݾ{g) v+wKH"&=WxHgفwW ކfZES3-ގ.M~֫LnbS};wT 2⩊ݤz(B_Q6|p6v8Hu xvT>-V]a;}s-sH-WKNFFёY[\}w@JƏڻG'PF>çO= ;8ϟb4ÿDӨGs|ds_HyGkyTsuS 2UCvv3%=?*J1wJ%6`[8CeIyQ:l8ڇ(z';l3ѫ__ޜV8O1Sf{WOC:肀yjW)3_"-|/p>:sP*oB(FJL*aLx_`@ H% &oy#۹ NӞp[ E앓X|ep`LbphMoCڭ$ʆZ)V_Z YzaU'~'֧-~h^}u#:$uKXqsSj:~aKr;;}kv+%;Ќst"0E17"`HBv0-`D @r429Z |7ErV0f0AS-k-@XK*O0mvqp:ZIKDf&(mY=Eu+@;s F`@L=j/[G̪ߊ^KO|ѧ7f;OW5t(Vv0\LgtNt|&CCq\[rj$f~5 @UQ4ޅ b ; D `R*1;v˹-\08GGm.. Pv"ċNBO/%x1T,1OU>٢F2'`F@P- 7ŋx1P@Gr J  7H77%V>GO jI /טͽm) .dl5^ >=l0_*:/% _ԎszeN`!}MeB[%;* hQ2y )Ѳ:A&#䫚Lj@TɄ 7`o@c0Uϐb9Aޛ/L:=! =Uadj'nP@>;c is [Aت.oۓUВͻcy v+=8o~O'*-HNM9*O0 ࣌C\"б@(ao>–q VN<VY«@`mBXîtb#r0{Y\`] |#jG&Jubxf$^k -%KϑIic 8E IiF$ ӷ~&97d /3BAP ٜ ɨfr3ώ*쯐/g#E zm2ۦ+E=01(EODl5ce L/~ۧ/L(LcOfxA&04tڞ1!g:H jȸR5`xX@~ty1Bilh!,Wpt"&^K^Uvpj'd 1`dA;{IfOz;B%0|PL9-% (Z\#2K陒bMm>e5j3z%F()H8O訝CNšcBI=z]~{ -_nϜ1Ff 1# $sd5&GCapk ۠Ǿ< Yl̒dݪ=բ:=T@1Z\e> K(8.tkXLmanjݛQ@}\Cd "yx[&3ǒPLPI !f0lPYn4x!,P|< `q*V$'aN@q)X-0 diV┤]k ;fM`odCErJR@2 S(fF4ID2$7 ?7]B/XS`>gVޖ> 5&?"f:,UNw'*7p$ 6MX x6pe ifۺǎMEk"/C8w}Mm*e!?<gM o%ϴf [c‾7DS,xɳKL+9}(2ȇGwy`0BZÂ[U{*͓=2g֥sǩ@ϭ@axz +@LDF";d6B4VN-@=cIVL\ k_6 2E hZSnhEQJi#˶dI~Ϝ!!/P!$DO.XﶇP7)8[XH08QHK SkiWZE MO#3(Ӣ|%׭[:-Z얋\Ye)˷<:Ilj=]m[jXKx>} a=yQq3Ok1"V)|s|4.J2D^p 髩߬c޽M[ {റܧ[4lzwOZmX@mTa1\)6,4ڛ/pО b lj%v9b~a[C^/ ^|A~;ipb /N,?}]+RŦ#{H:\Z`U]=p G48x4;? ۠q01? Iv%^dSqs9?ΔChrhiԠog$eRH o1fxNG[a 7('\#<;1.$G#'{2Dy'/fYI kh$'WDZ4/+%(ZxdP Ik)x4:|s<}"OTiqk\.sPҘQFQHb ]xxusإ1B?8,ȴ1ƎsnܻzǢGAZC@s[׃2޶O EOUc{'#!ɫ5~:P7t'328#5ctz Ӊq5)Pȑ\wqvt8O/iSU|$t[#Tr+>E;?lX)cWv]m:eZzNYomui5JS_omVk^PWU8Gd{;eѧǨvNM.cNlNu:laJxt"zqEd#{ңhy4WBa7 H|FUױ6ot o ա]>4ٶUMK"/H]cX~lpVѮ-Գ%CB]Pzea,[` wvp۴v$(ٳIEqzYC՗O^jz*'5*KGjĹxd %F{ !4P)A/nԣho/:&l< IJ9 8rp=DZzz`MU8DtbaY:mOJ:_ߌGC 0AGO8C5nTyUc,`lN)}t-@bsh=N^V{ CF?MI@SL84UkgvŚh+kM'䔬zΓ[KNfZffJ͸ J=J=JY*EHIz \&h8JV?K\kOM 54xuYj%@fShi%n9lǼbs;k-GVeOS40A5g7MjHnHvV!rL4co7)o>۹kr[M}\Fw!ILox/m+‘L9*=ۭZJdd.1}f'$7%p  ZO=|( .u\^R xz.шr9,q[.{srĎC(=XaռmCy%4(K!0 0ZCxT:4V<[.K Gp: 2]gFR 5K6;q}Y@،f3-VυXL]ŷ|էiPyxt܀4B++H;lo$-ϬC 8RE HӤ4`HAHjytN9ڡQ(XP<r+u g\/xo:cU+9䬝9"Җ7 dXmɗlTN$AOvSMghT\;Аa: ¦ |s7`+((y9]$jK=LޗeIH %6VuB !gfYl?Kg+ Yd&*!`.e⟛J]ȜN5jh,ggh##\/ [;={Q=?5TM ~(i?ۡ9&XNj0}W-:Z CdM*$Qʖ]ջ=] ] i k5gPRM4 yU Tl7CL`xr $Zz.ήLw%wl+ 4Wu~eAW-S V|aWye'w[q#(c#܂N,ҞL떔^2ʷ.lKF!LJOr8J$alJgmg(Ȝ.=VkbkK"Vs[Ww&@z]WNB@rpgnxP[ewqݣ-r l^zfLNٍ]RTNonT@ZoyQ;bCHp=t_rLva"ȳK-F -eQ*%KĘsϬޞ fweB`m"[r~q'U,YI3nYD2c<'X<ۿ@;X_OO%L߮A5NowƂOx$,˄>@dtUu6NKVNO=tf4 |XkUyS\v.10̤Ws6de@+eڡfWy"_z_zKcz ڌq1َ=30kz&kz.k oYI,mрdI,s6QHGof3y,.P9 WvYvKy" .AWp6qQȋ>n"jzqGvʑ>C6$/A˟Q-$`ڒ(W˹Zjq9QFSXxLM9Kf{IνwL_['C lۣ .d8'b+K1I ۡxEUCJ; ~g$^^0+:GfEͭ<~{-/<) Fdu*ϝpwd(;g"=YlU3R0͂}盞4}.4B3Lb}Kr$ vʻ"|E@|G6v{YS_=S](os}s@Pr,ѐܠ*z{9Sy~:Ks6.Ρ6[U^/36ש Sx\){Aqe3K"(;4bR,gڵ}q̹_v^_?_!y/R埝;XkvCmdٗ_D #6rMػߋZ7`v and~)P9UMكz؃r؃_c|pʏnde-كÕ&Scr 6: ^55ceZA*|Otvpd_,G΢i`{K<OZpGBVէ z~;۱\uQ{b^`$RUk<@*b`QV~QWw6,˵1Edxv=̲B2WkG7l:W@7uz]> 4DMMB`XUUοc?'h8]<φr<\ZcygG/GO%}tx:b0c/_|䤤kO'Cw|n4.W&" E$LwN vU\?o+<%>[[LJh<Њ|y\@ _簨0ӫWc q4. dO&|ckLxt5MFVg~[Q{;Og) ەW,ʰ/1{,?Rb|q|1?`ˑ}d#%2P/W?X|u5tne!_5i}SxԱy+%mԚΔQ^2+HJJ[՗.} j$e)+:_CJC<~1:,weAŢ;彋o{o,WYRnCP>0=FG-@@`:[|]l}`]-Gk~;ADŨ\t?'s˘?ѓ}ŷx-c Wf^_b +K|{^UadPu!\!ʾ/Be'/e_N^e 7r.FUoY^^'3~Lh1SM3KL+)M^9}+BAg>mW @"lf<0^+b^WJvBrs@JF\*㼄VykU/\rWKkжzk=0l7 ["JeAzNU9e 7uU?AUWf]u :Z8%FlEV)X=?ovIJy{ -"2*lwHhDatDҾ|Ӊh(VҚfBA!Er_2g9邰C :T%I%||;-r ٩KЪ~qKv ف'gv<q=)$N85e-{; yxGh;:v%$ک~ҭ4z[D`_(w %Dʲ[SN :CmvO J_%";;KQoJ"1D/nKP_Чw˞4~|eBZ8ڕF!nP(PH#|;Jvmj%tnM\.}l7k J{׃q }XhGxY*-e9❣liC0býXZx*+(2 er`<͙ áxJR!I˟$e7IYORv-*e d1UuUMU8Q8aKKUKU㋸yURb$)In| n3a91'D _Ag۔aٵ|`t⒝; F 7rD+菉AU:?]l~ܩk1fbFb2qL \]mѷC:j1⻏>59{$K_:CN!ft28tKAnaL]Νo{@r<D)e|(9"艼QQO?u0;D@x#~Bbv}j|uZ% "GTe;Ga;p>0rJy]gQ=1v 8T_84.9ȟҿU=:*FNM@aGu6gM;GA .X3Lyy)Ln1\q!0k!|3%]׌ cᨛYUvm}-TZ.j 5^Ӎ>c|v#*rZ/V3z>ci*H8tSDrOR.99뉪U380a]yj9O$ltx )(_exlzy;aǓd n%`M> //>zr,ľƍ3q>yp%JIԼ"q~]m*o|K A/7o"*=x$ aț#jx>.x|jlvBAl<{-D\> 0;>S/{ D棏׃^&`qr} {= N%C)+\8;{Kc)6"pA9[8$.~0A!PLLlDs$'(ۋ=r[F4Ռ&)-T~֡sZw$#N;d1mc0_0+JV -V2pIN꧇!}`Gj\Z,@.uiUi_VD#G/\]yWm Bd2;M/vn4]>CC+!Z11&Y7NH ])eSs }!8esJiOɐedL1N GxLg$+rɇ?P70\DkaUTL5ڡjTf#A{-UU'^NdBGa2x.JqUsz{!z=.MlMhb[6f4q9'Zmt>{s{ڑߝ l+;7(I!.@LzvNwkp< I3çKHӸ*kMc5ѸF )yqǹ<.29-u<ㇶ9Un v97Pl~"cS  oWˮY=_mƧ4\ -t_SA[s5n]ߗ:4Sd= ^ڠH!A|_9AIJ?HC k5dVM̆*t-щrjmEOloGx!ރϼbs>cDnSq<ueS 8P\w9^W]<[_{?G3|SH Sft~-4^5NN/BNHUWq|8FڪxoQz `gd[*ІoԬuFW[HßW[䪛 ](Җ*mW_L\r!"AԅAI1>Y[?ʞBr4_]<U{p_WZAZAM=Z a#/NNṗBm:D^eH$K#3xZ<]j}$ lV 7N8@4+&Cp[3mvi !|4'g;Hxً.S5zg.{ϰo Ji Q5o j&^6Xagm xA\q`yWe+2x܆Sn%>pO/Y~3S6Tc;/@Z`2|.Y7 Y>Pٿ(.'2P*UJpwMsěK`)`|١R\Vjij55]R_[?@PE?ОavWw{I5 CK1}r|n~3q^/BW9׳R*'=H!*6L퍸vqv8wTU7PLHU8zk>tyU9ߒiK[!\tr%<HO[]BG"(P+Jljpb,-B ^`'rN<[-U*cѾ/w z%GM`c,w{mIщҕ6z/Bw3 frp6Ai^u&,*_z%Kd ^q4OT)QFȶ61}AmaJ1 g~K߽P&yBܪr%}qhhՔ#Me vэEEO*wY k|߫9Rn^VMP&ѫA~-NO)恫2k'D5>Ԫщ2&Na6sj>ZI1LnFTdڵ̧M|2>iL{]tzRcǬەZ"BKG-tSVPQzgJSZ[i }ZöP,{U zcNߋޮ*MgZz8kרѧn3xa[:{Zv[=t]]t?i6Qч]n!4_ t4w\)Րiz{i9&u&i,gd=5J,;Q&Qi\ m>SDUn_VQ9zOW9>|Ӑ\=ZB}L)L7ۡ6od|{n͵m8ʯuIS(♛4|=YC7i{ݤ<~8ul< K&z}Vsd88Ӻt7ot^nS9PO#}˛tRv7*sSwfk[ßШݷwPj"JGyWD#$eDԣڽ=qCy>W<|Dd1Q8-KIۃ,xcqGލTΚȹ{n9u$H.ot'~ sZOjոZjMFH&-qd1(r` nc7$̬\.ەsVr~~V7 rٮ#A/䱛-БP%T쨔Y )Ǚ#Uxp]r]OWKCtg-DxgkE";*zm]X@ .e9ZJykpLYEAKl/} Fc֧pi6n\s?:Q_?ϢDA᳃_Cv˗z='5& r9S4AOF"]±>*ųt6S9rQ64r u*F9iPVa\'1@h}f C<e `,p$+tYhhr5!rEmz,"-|8@x[1*(:a,U0[{ gzOp|gnĿP/MT@3fOZQM̻hO? Db n6ǭʫs꼭jV?@S'2]E4}.DK/ko+Ƈz5 |gGGE6C<=HD?e??PV__uMVK^Bx}Uw%! ;qr9]Va. a)|iEB͒wс:Z*ϨbmRm '{qi H1Z K?Ke"|&Wb?b)-œeѤ#@ZjO]?\@jv `+pz v@ TG9XFb9Y 6_k b,ڱJ ͘Μ/\73?ԒBo% Jh%<ZW>NZ}PӈkM1_^LF)yJ5P59*8<Ɛ}h\w[9b+߄<^~0=0ƌ W'ДAq|Aj L ^)@ٔ7B ڤy6. C C PURPOSE C C To compute the gain of a single-input single-output linear system, C given its state-space representation (A,b,c,d), and its poles and C zeros. The matrix A is assumed to be in an upper Hessenberg form. C The gain is computed using the formula C C -1 IP IZ C g = (c*( S0*E - A ) *b + d)*Prod( S0 - Pi )/Prod( S0 - Zi ) , C i=1 i=1 (1) C C where Pi, i = 1 : IP, and Zj, j = 1 : IZ, are the poles and zeros, C respectively, and S0 is a real scalar different from all poles and C zeros. C C ARGUMENTS C C Input/Output Parameters C C IP (input) INTEGER C The number of the system poles. IP >= 0. C C IZ (input) INTEGER C The number of the system zeros. IZ >= 0. C C A (input/output) DOUBLE PRECISION array, dimension (LDA,IP) C On entry, the leading IP-by-IP part of this array must C contain the state dynamics matrix A in an upper Hessenberg C form. The elements below the second diagonal are not C referenced. C On exit, the leading IP-by-IP upper Hessenberg part of C this array contains the LU factorization of the matrix C A - S0*I, as computed by SLICOT Library routine MB02SD. C C LDA INTEGER C The leading dimension of array A. LDA >= max(1,IP). C C B (input/output) DOUBLE PRECISION array, dimension (IP) C On entry, this array must contain the system input C vector b. C On exit, this array contains the solution of the linear C system ( A - S0*I )x = b . C C C (input) DOUBLE PRECISION array, dimension (IP) C This array must contain the system output vector c. C C D (input) DOUBLE PRECISION C The variable must contain the system feedthrough scalar d. C C PR (input) DOUBLE PRECISION array, dimension (IP) C This array must contain the real parts of the system C poles. Pairs of complex conjugate poles must be stored in C consecutive memory locations. C C PI (input) DOUBLE PRECISION array, dimension (IP) C This array must contain the imaginary parts of the system C poles. C C ZR (input) DOUBLE PRECISION array, dimension (IZ) C This array must contain the real parts of the system C zeros. Pairs of complex conjugate zeros must be stored in C consecutive memory locations. C C ZI (input) DOUBLE PRECISION array, dimension (IZ) C This array must contain the imaginary parts of the system C zeros. C C GAIN (output) DOUBLE PRECISION C The gain of the linear system (A,b,c,d), given by (1). C C Workspace C C IWORK INTEGER array, dimension (IP) C On exit, it contains the pivot indices; for 1 <= i <= IP, C row i of the matrix A - S0*I was interchanged with C row IWORK(i). C C METHOD C C The routine implements the method presented in [1]. A suitable C value of S0 is chosen based on the system poles and zeros. C Then, the LU factorization of the upper Hessenberg, nonsingular C matrix A - S0*I is computed and used to solve the linear system C in (1). C C REFERENCES C C [1] Varga, A. and Sima, V. C Numerically Stable Algorithm for Transfer Function Matrix C Evaluation. C Int. J. Control, vol. 33, nr. 6, pp. 1123-1133, 1981. C C NUMERICAL ASPECTS C C The algorithm is numerically stable in practice and requires C O(IP*IP) floating point operations. C C CONTRIBUTORS C C V. Sima, Research Institute for Informatics, Bucharest, May 2002. C Partly based on the BIMASC Library routine GAIN by A. Varga. C C REVISIONS C C 2011-02-08 (Lukas Reichlin) Modifications for Descriptor Systems. C C KEYWORDS C C Eigenvalue, state-space representation, transfer function, zeros. C C ****************************************************************** C C .. Parameters .. DOUBLE PRECISION ZERO, ONE, TWO, P1, ONEP1 PARAMETER ( ZERO = 0.0D0, ONE = 1.0D0, TWO = 2.0D0, $ P1 = 0.1D0, ONEP1 = 1.1D0 ) C .. Scalar Arguments .. DOUBLE PRECISION D, GAIN INTEGER IP, IZ, LDA C .. Array Arguments .. DOUBLE PRECISION A(LDA,*), E(LDA,*), B(*), C(*), PI(*), PR(*), $ ZI(*), ZR(*) INTEGER IWORK(*) C .. Local Scalars .. INTEGER I, J, INFO DOUBLE PRECISION S0, S C .. External Functions .. DOUBLE PRECISION DDOT EXTERNAL DDOT C .. External Subroutines .. EXTERNAL MB02RD, MB02SD C .. Intrinsic Functions .. INTRINSIC ABS, MAX C .. C .. Executable Statements .. C C For efficiency, the input scalar parameters are not checked. C C Quick return if possible. C C IF( IP.EQ.0 ) THEN C GAIN = ZERO C RETURN C END IF C C Compute a suitable value for S0 . C S0 = ZERO C DO 10 I = 1, IP S = ABS( PR(I) ) IF ( PI(I).NE.ZERO ) $ S = S + ABS( PI(I) ) S0 = MAX( S0, S ) 10 CONTINUE C DO 20 I = 1, IZ S = ABS( ZR(I) ) IF ( ZI(I).NE.ZERO ) $ S = S + ABS( ZI(I) ) S0 = MAX( S0, S ) 20 CONTINUE C S0 = TWO*S0 + P1 IF ( S0.LE.ONE ) $ S0 = ONEP1 C C Form A - S0*E . C DO 30 J = 1, LDA DO 25 I = 1, LDA A(I,J) = A(I,J) - S0*E(I,J) 25 CONTINUE 30 CONTINUE C C Compute the LU factorization of the matrix A - S0*E C (guaranteed to be nonsingular). C C CALL MB02SD( IP, A, LDA, IWORK, INFO ) CALL MB02SD( LDA, A, LDA, IWORK, INFO ) C C Solve the linear system (A - S0*E)*x = b . C C CALL MB02RD( 'No Transpose', IP, 1, A, LDA, IWORK, B, IP, INFO ) C CALL MB02RD( 'No Transpose', IP, 1, A, LDA, IWORK, B, LDA, INFO ) CALL MB02RD( 'No Transpose', LDA, 1, A, LDA, IWORK, B, LDA, INFO ) C -1 C Compute c*(S0*E - A) *b + d . C C GAIN = D - DDOT( IP, C, 1, B, 1 ) GAIN = D - DDOT( LDA, C, 1, B, 1 ) C C Multiply by the products in terms of poles and zeros in (1). C I = 1 C C WHILE ( I <= IP ) DO C 40 IF ( I.LE.IP ) THEN IF ( PI(I).EQ.ZERO ) THEN GAIN = GAIN*( S0 - PR(I) ) I = I + 1 ELSE GAIN = GAIN*( S0*( S0 - TWO*PR(I) ) + PR(I)**2 + PI(I)**2 ) I = I + 2 END IF GO TO 40 END IF C C END WHILE 40 C I = 1 C C WHILE ( I <= IZ ) DO C 50 IF ( I.LE.IZ ) THEN IF ( ZI(I).EQ.ZERO ) THEN GAIN = GAIN/( S0 - ZR(I) ) I = I + 1 ELSE GAIN = GAIN/( S0*( S0 - TWO*ZR(I) ) + ZR(I)**2 + ZI(I)**2 ) I = I + 2 END IF GO TO 50 END IF C C END WHILE 50 C RETURN C *** Last line of TG04BX *** END