pax_global_header00006660000000000000000000000064130260464550014517gustar00rootroot0000000000000052 comment=27cdff21c073cc83e2df56523b84028fe66dc42f pal-0.9.7/000077500000000000000000000000001302604645500123105ustar00rootroot00000000000000pal-0.9.7/.gitignore000066400000000000000000000010401302604645500142730ustar00rootroot00000000000000*~ *.trs .deps .libs Makefile Makefile.in configure configure.in *.o *.lo *.lof *.la *.dSYM palTest make.log make.log.err config.h config.h.in config.log config.status stamp-h1 libtool *.htx *.aux *.bbl *.blg *.dvi *.log *.htx_tar aclocal.m4 autom4te.cache/ componentinfo.dtd starconf.status sun267.ps sun267.pdf compile config.guess config.sub depcomp install-sh ltmain.sh missing stamp-h2 pal-*.tar.gz pubs/adass2012/P56.pdf test-driver *.os .sconf_temp/ .sconsign.dblite libpal.*.dylib libpal.a libpal.dylib sun267.fls sun267.out sun267.toc pal-0.9.7/COPYING000066400000000000000000001045131302604645500133470ustar00rootroot00000000000000 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 . pal-0.9.7/COPYING.LESSER000066400000000000000000000167431302604645500143520ustar00rootroot00000000000000 GNU LESSER 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. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser 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 Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. pal-0.9.7/Makefile.am000066400000000000000000000046631302604645500143550ustar00rootroot00000000000000## Process this file with automake to produce Makefile.in lib_LTLIBRARIES = libpal.la # Include palOne2One.c separately since it is a combo file libpal_la_SOURCES = $(PUBLIC_C_FILES) palOne2One.c $(PRIVATE_C_FILES) # If we are using a non-standard location libpal_la_CPPFLAGS = $(ERFA_CPPFLAGS) libpal_la_LDFLAGS = $(ERFA_LDFLAGS) # Force a link against ERFA and, optionally, starutil libpal_la_LIBADD = $(ERFA_LIBADD) $(STARUTIL_LIBADD) # Misc files dist_starnews_DATA = pal.news dist_pkgdata_DATA = COPYING COPYING.LESSER README.md # Make all library code position independent. This is handy for creating # shareable libraries from the static ones (Java JNI libraries). if !NOPIC libpal_la_CFLAGS = $(AM_CFLAGS) -prefer-pic endif # install pal as "star/pal.h" cincludedir = $(includedir)/star cinclude_HEADERS = pal.h palmac.h noinst_HEADERS = $(PRIVATE_INCLUDES) PRIVATE_INCLUDES = pal1.h pal1sofa.h PUBLIC_C_FILES = \ palAddet.c \ palAirmas.c \ palAltaz.c \ palAmp.c \ palAmpqk.c \ palAop.c \ palAoppa.c \ palAoppat.c \ palAopqk.c \ palAtmdsp.c \ palCaldj.c \ palDafin.c \ palDe2h.c \ palDeuler.c \ palDfltin.c \ palDh2e.c \ palDjcal.c \ palDmat.c \ palDs2tp.c \ palDat.c \ palDmoon.c \ palDrange.c \ palDt.c \ palDtp2s.c \ palDtps2c.c \ palDtt.c \ palEcleq.c \ palEcmat.c \ palEl2ue.c \ palEpco.c \ palEpv.c \ palEtrms.c \ palEqecl.c \ palEqgal.c \ palEvp.c \ palFk45z.c \ palFk524.c \ palFk54z.c \ palGaleq.c \ palGalsup.c \ palGe50.c \ palGeoc.c \ palIntin.c \ palMap.c \ palMappa.c \ palMapqk.c \ palMapqkz.c \ palNut.c \ palNutc.c \ palOap.c \ palOapqk.c \ palObs.c \ palPa.c \ palPcd.c \ palPertel.c \ palPertue.c \ palPlanel.c \ palPlanet.c \ palPlante.c \ palPlantu.c \ palPm.c \ palPolmo.c \ palPrebn.c \ palPrec.c \ palPreces.c \ palPrenut.c \ palPv2el.c \ palPv2ue.c \ palPvobs.c \ palRdplan.c \ palRefco.c \ palRefro.c \ palRefv.c \ palRefz.c \ palRverot.c \ palRvgalc.c \ palRvlg.c \ palRvlsrd.c \ palRvlsrk.c \ palSubet.c \ palSupgal.c \ palUe2el.c \ palUe2pv.c \ palUnpcd.c \ palVers.c PRIVATE_C_FILES = \ pal1Atms.c \ pal1Atmt.c stardocs_DATA = @STAR_LATEX_DOCUMENTATION@ TESTS = palTest check_PROGRAMS = palTest palTest_SOURCES = palTest.c palTest_LDADD = libpal.la # A target for making the SUN documentation. We do not do this automatically palsun.tex: $(PUBLIC_C_FILES) -rm -f palsun.tex all.c cat $(PUBLIC_C_FILES) > all.c ${STARCONF_DEFAULT_PREFIX}/bin/sst/prolat in=all.c out=palsun.tex single=no page=no atask=no document=no -rm all.c pal-0.9.7/README.md000066400000000000000000000062731302604645500135770ustar00rootroot00000000000000PAL - Positional Astronomy Library ================================== [![DOI](https://zenodo.org/badge/12517/Starlink/pal.svg)](http://dx.doi.org/10.5281/zenodo.17212) The PAL library is a partial re-implementation of Pat Wallace's popular SLALIB library written in C using a Gnu GPL license and layered on top of the IAU's SOFA library (or the BSD-licensed ERFA) where appropriate. PAL attempts to stick to the SLA C API where possible although `palObs()` has a more C-like API than the equivalent `slaObs()` function. In most cases it is enough to simply change the function prefix of a routine in order to link against PAL rather than SLALIB. Routines calling SOFA use modern nutation and precession models so will return slightly different answers than native SLALIB. PAL functions not available in SOFA were ported from the Fortran version of SLALIB that ships as part of the Starlink software and uses a GPL licence. See `pal.news` for release notes. Building -------- A simple `configure` script is provided: ./configure --prefix=/usr/local --without-starlink make make install The tests can be run using `make check`. Use `--prefix` to specify an install location. Given the history of the source code as a Starlink library the default will be `/star`. `--without-starlink` forces the configure script to forget about any Starlink configurations. This is the safe option if you run into problems when using a simple `--prefix` for building outside of Starlink. The configure script will assume Starlink is not being used by looking to see if `STARCONF_DEFAULT_PREFIX` environment variable is set. You may run into problems if `STARCONF_DEFAULT_PREFIX` is set but you use `--without-starlink`. Requirements ------------ Requires that either the SOFA C library or the ERFA library variant (which has a more permissive license than SOFA) be installed. The `configure` script will abort if neither SOFA nor ERFA can be found. SOFA can be obtained either from or from an unofficial github repository (with a configure script) at . ERFA can be downloaded from . Missing Functions ----------------- Not all SLALIB functions have been added. New routines are added to PAL as demand arises. Language Bindings ----------------- A Perl binding of PAL is available () named `Astro::PAL` and is available from CPAN at . This is a standalone distribution that comes with its own copies of PAL and SOFA and so can be installed directly from the `cpan` shell. A Python binding of PAL is available (). This is a standalone distribution that comes with its own copies of PAL and SOFA. The Starlink AST () library now uses PAL and can be built either with a private PAL or with an external PAL. Documentation ------------- The description paper for PAL is: ["_PAL: A Positional Astronomy Library_"](http://adsabs.harvard.edu/abs/2013ASPC..475..307J), Jenness, T. & Berry, D. S., in _Astronomical Data Anaysis Software and Systems XXII_, Friedel, D. N. (ed), ASP Conf. Ser. **475**, p307. pal-0.9.7/SConstruct000066400000000000000000000127051302604645500143470ustar00rootroot00000000000000# PAL SConstruct file import os version = "0.9.2" def CheckStarlink(context): context.Message( "Checking for Starlink environment...") if "STARLINK_DIR" in os.environ: star_root = os.environ["STARCONF_DEFAULT_PREFIX"] star_lib = os.path.join(star_root, "lib") star_inc = os.path.join(star_root, "include") star_share = os.path.join(star_root, "share") star_bin = os.path.join(star_root, "bin") context.env.PrependENVPath('PATH', star_bin) context.Result(star_root) context.env.Replace(PREFIX = star_root) context.env.Append(CPPPATH=star_inc, LIBPATH=star_lib) return { "root": star_root, "lib": star_lib, "include": star_inc, "bin": star_bin, "share": star_share, } context.Result("failed") return None # Allow --prefix to be specified. We don't use it in Starlink mode # though AddOption('--prefix', dest='prefix', type='string', nargs=1, action='store', metavar='DIR', help='installation prefix') env = Environment(PREFIX = "/usr/local" ) # Initialise the environment prefix = GetOption("prefix") if prefix: env.Replace(PREFIX = prefix) # Basic configure checks: but not if --help or --clean if not GetOption("help") and not GetOption("clean"): conf = Configure(env, custom_tests = {"CheckStarlink": CheckStarlink} ) if not conf.CheckCC(): print("!! Your compiler and/or environment is not correctly configured.") Exit(0) if conf.CheckFunc("copysign"): conf.env.Append(CPPDEFINES={"HAVE_COPYSIGN": 1}) if conf.CheckFunc("isblank"): conf.env.Append(CPPDEFINES={"HAVE_ISBLANK": 1}) if conf.CheckFunc("strlcpy"): conf.env.Append(CPPDEFINES={"HAVE_STRLCPY": 1}) # Force -lm if we need it conf.CheckLib("m","sin") # Try to look in current directory conf.env.Append(LIBPATH=["."]) conf.env.Append(CPPPATH=["."]) # If we are in a Starlink environment we know we have # ERFA so just set things up for that. This should be done # using a general SCons "are we starlink" plugin starlink = conf.CheckStarlink() if starlink is not None: conf.env.Append(LIBS=["erfa"]) conf.env.Append(CPPDEFINES={"HAVE_STAR_UTIL": 1}) conf.env.Append(LIBS=["starutil"]) else: # Allow PREFIX to work conf.env.Append(CPPPATH=[os.path.join("$PREFIX", "include")]) conf.env.Append(LIBPATH=[os.path.join("$PREFIX", "lib")]) # Maybe starutil will be available if conf.CheckLib("starutil"): conf.env.Append(CPPDEFINES={"HAVE_STAR_UTIL": 1}) # Need to look for ERFA vs SOFA if not conf.CheckLib("erfa","eraCal2jd"): if conf.CheckLib("sofa_c","iauCal2jd"): conf.env.Append(CPPDEFINES={"HAVE_SOFA_H": 1}) else: print("!! Neither ERFA not SOFA library located. Can not continue. !!") Exit(0) env = conf.Finish() # PAL source code libpal_sources = [ "pal1Atms.c", "pal1Atmt.c", "palAddet.c", "palAirmas.c", "palAltaz.c", "palAmp.c", "palAmpqk.c", "palAop.c", "palAoppa.c", "palAoppat.c", "palAopqk.c", "palAtmdsp.c", "palCaldj.c", "palDafin.c", "palDat.c", "palDe2h.c", "palDeuler.c", "palDfltin.c", "palDh2e.c", "palDjcal.c", "palDmat.c", "palDmoon.c", "palDrange.c", "palDs2tp.c", "palDt.c", "palDtp2s.c", "palDtps2c.c", "palDtt.c", "palEcmat.c", "palEl2ue.c", "palEpco.c", "palEpv.c", "palEqecl.c", "palEqgal.c", "palEtrms.c", "palEvp.c", "palFk45z.c", "palFk524.c", "palFk54z.c", "palGaleq.c", "palGalsup.c", "palGe50.c", "palGeoc.c", "palIntin.c", "palMap.c", "palMappa.c", "palMapqk.c", "palMapqkz.c", "palNut.c", "palNutc.c", "palOap.c", "palOapqk.c", "palObs.c", "palOne2One.c", "palPa.c", "palPertel.c", "palPertue.c", "palPlanel.c", "palPlanet.c", "palPlante.c", "palPlantu.c", "palPm.c", "palPolmo.c", "palPrebn.c", "palPrec.c", "palPreces.c", "palPrenut.c", "palPv2el.c", "palPv2ue.c", "palPvobs.c", "palRdplan.c", "palRefco.c", "palRefro.c", "palRefv.c", "palRefz.c", "palRverot.c", "palRvgalc.c", "palRvlg.c", "palRvlsrd.c", "palRvlsrk.c", "palSubet.c", "palSupgal.c", "palUe2el.c", "palUe2pv.c", ] sun267_sources = [ "sun267.tex" ] sun267_pdf = env.PDF( sun267_sources ) Default(sun267_pdf) # Compiler should look in current directory for header files staticpal = env.StaticLibrary(target="pal", source=libpal_sources) sharedpal = env.SharedLibrary( target="pal", source = libpal_sources, SHLIBVERSION=version ) palTest = env.Program("palTest", "palTest.c", LIBS=["pal"] ) test_alias = Alias("test", [palTest], palTest[0].abspath) AlwaysBuild(test_alias) installed_sharedlib = env.InstallVersionedLib(os.path.join("$PREFIX","lib"), [sharedpal], SHLIBVERSION=version ) installed_staticlib = env.Install("$PREFIX/lib", [staticpal] ) # Just build the library by default Default(sharedpal) Default(staticpal) # install on request if "install" in COMMAND_LINE_TARGETS: env.Alias( "install", "$PREFIX" ) Default(installed_sharedlib, installed_staticlib) pal-0.9.7/bootstrap000077500000000000000000000113531302604645500142560ustar00rootroot00000000000000#! /bin/sh - # original bootstrap file, installed by starconf 1.3, rnum=1003000 # If you _need_ to change this file, delete `original' in the line above, # or else starconf may overwrite it with an updated version. # # bootstrap.installed. Generated from bootstrap.installed.in by configure. # # Bootstrap a checked-out component of the Starlink software tree. # Run this script in a freshly checked-out directory to bring the # system to the point where you can just type ./configure;make # # Usage: # ./bootstrap # This script should be installed, by starconf, in all `component # directories'. A `component directory' is a directory which has a # component.xml.in file in it. All component directories will have a # manifest file created and installed in .../manifests; non-component # directories will not have manifest files. Everything that's # installed should be installed as part of some component # or other. # # The ./bootstrap scripts will stop recursing when they find a # component.xml.in file. They'll warn if they find a component.xml.in # file in any AC_CONFIG_SUBDIRS directory, but ignore it, and exit # with an error if they do not find a component.xml.in file and there # are no AC_CONFIG_SUBDIRS directories in which to search further. # That is, the tree of directories which the top-level bootstrap # traverses should have component.xml.in files at or above all its # leaves. # The starconf below might update bootstrap, if a newer version is # available. Unfortunately, this confuses sh, which appears _not_ to # keep open the script it's reading, but to reopen it afresh, or reseek # within the file, for each line (or something like that!?). # So rewrite this script to a temporary file and exec it. tempfile="${TMP-/tmp}/$0-$$.tmp" rm -f $tempfile echo "trap 'rm -f $tempfile' 0" >$tempfile # remove temporary at exit sed '1,/^--TRAMPOLINE--/d' $0 >>$tempfile # strip out the trampoline exec /bin/sh $tempfile # exec the temporary --TRAMPOLINE-- echo "Bootstrapping `pwd` ..." if test ! -f configure.ac; then echo "bootstrap: No configure.ac in directory `pwd`" >&2 exit 1 fi subdirs=`autoconf --trace=AC_CONFIG_SUBDIRS:$% configure.ac` if test -f component.xml.in; then if starconf --show buildsupport >/dev/null 2>&1; then # starconf is in the path echo "...using starconf in " `starconf --show buildsupport` starconf || exit 1 else # The temptation here is to use ./starconf.status to find the # starconf that it came from and invoke that explicitly. Don't do # this, however: we don't want to be too clever, and it's better # to be consistent with the way the autotools behave (the first # one in your path is the one that works, and they don't have this # sort of `phone home' cleverness in them). echo "bootstrap error: The starconf application is not in your path" # This doesn't stop us being helpful, however. if test -f ./starconf.status; then starconf_home=`./starconf.status --show buildsupport` echo "This directory was last bootstrapped with $starconf_home/bin/starconf" fi exit 1 fi # Check that there are no component.xml.in files in any subdirectories if test -n "$subdirs"; then for d in $subdirs do if test -d "$d" && test -f "$d/component.xml.in"; then echo "bootstrap: warning: ignoring child $d/component.xml.in" >&2 fi done fi # If STAR_SUPPRESS_AUTORECONF is true in the environment, then we # suppress the call of `autoreconf'. This is here _only_ so that # the top-level bootstrap file can suppress multiple calls of this # in bootstrap scripts in its children. This mechanism must not # be used by users, as it is likely to change without warning. if ${STAR_SUPPRESS_AUTORECONF-false}; then echo "Suppressing autoreconf in" `pwd` else echo autoreconf --install --symlink autoreconf --install --symlink || exit 1 fi else # This is not a component directory, so simply recurse into the children. # ...if there are any, that is. if test -z "$subdirs"; then echo "bootstrap: error: non-component directory `pwd` has no subdirs" >&2 exit 1 fi # Bootstrap the child directories mentioned in AC_CONFIG_SUBDIRS. # These bootstrap files must exist. for d in $subdirs do if test -d "$d"; then echo "Bootstrapping $d..." if test -f $d/bootstrap; then # good... (cd $d; /bin/sh ./bootstrap) else echo "bootstrap: no file $d/bootstrap" >&2 exit 1 fi fi done fi exit 0 pal-0.9.7/codemeta.json000066400000000000000000000030261302604645500147650ustar00rootroot00000000000000{ "@context": "https://raw.githubusercontent.com/mbjones/codemeta/master/codemeta.jsonld", "@type": "Code", "author": [ { "@id": "http://orcid.org/0000-0001-5982-167X", "@type": "Person", "email": "tim.jenness@gmail.com", "name": "Tim Jenness", }, { "@id": "http://orcid.org/0000-0001-6524-2447", "@type": "Person", "email": "d.berry@eaobservatory.org", "name": "David Berry", "affiliation": "East Asian Observatory" }, { "@id": "", "@type": "Person", "email": "patrick.wallace@stfc.ac.uk", "name": "Patrick Wallace", "affiliation": "STFC", } ], "identifier": "http://dx.doi.org/10.5281/zenodo.17212", "codeRepository": "https://github.com/Starlink/pal", "dateCreated": "2012-02-08", "description": "The PAL library is a partial re-implementation of Pat Wallace's popular SLALIB library written in C using a Gnu GPL license and layered on top of the IAU's SOFA library (or the BSD-licensed ERFA) where appropriate.", "keywords": "astronomy, Starlink, astrometry", "license": "http://opensource.org/licenses/GPL-3.0", "title": "PAL: Positional Astronomy Library", "version": "0.9.1", "uploadedBy": { "@id": "http://orcid.org/0000-0001-5982-167X", "@type": "Person", "email": "tim.jenness@gmail.com", "name": "Tim Jenness", } } pal-0.9.7/component.xml000066400000000000000000000016771302604645500150470ustar00rootroot00000000000000 0.9.7 libext/pal Positional Astronomy Library

This library is a collection of code designed to aid in replacing the SLA library with code from SOFA. Where possible the API is similar to the C SLA API except for the use of a "pal" prefix.

erfastarutilerfastarutilstar2html Tim Jenness t.jenness@jach.hawaii.edu sun267 starlink@jiscmail.ac.uk
pal-0.9.7/component.xml.in000066400000000000000000000015701302604645500154440ustar00rootroot00000000000000 @PACKAGE_VERSION@ libext/pal Positional Astronomy Library

This library is a collection of code designed to aid in replacing the SLA library with code from SOFA. Where possible the API is similar to the C SLA API except for the use of a "pal" prefix.

@STAR_DEPENDENCIES_CHILDREN@ Tim Jenness t.jenness@jach.hawaii.edu @STAR_DOCUMENTATION@ @PACKAGE_BUGREPORT@
pal-0.9.7/configure.ac000066400000000000000000000122471302604645500146040ustar00rootroot00000000000000dnl Process this file with autoconf to produce a configure script AC_REVISION($Revision: 27534 $) dnl Initialisation: package name and version number AC_INIT([pal],[0.9.7],[starlink@jiscmail.ac.uk]) AC_CONFIG_AUX_DIR([build-aux]) dnl Require autoconf-2.50 at least AC_PREREQ([2.69]) dnl Require Starlink automake AM_INIT_AUTOMAKE(1.8.2-starlink) dnl Sanity-check: name a file in the source directory -- if this dnl isn't found then configure will complain AC_CONFIG_SRCDIR([pal.h]) dnl Include defaults for Starlink configurations STAR_DEFAULTS dnl Would like the version number as an integer AC_DEFINE_UNQUOTED([PACKAGE_VERSION_INTEGER], $PACKAGE_VERSION_INTEGER, [Integer version number, in the form major*1e6+minor*1e3+release]) dnl Find required versions of the programs we need for configuration AC_PROG_CC LT_INIT # If --with-pic=no is set we should honour that. AM_CONDITIONAL(NOPIC, test x$pic_mode = xno) dnl copysign and isblank are a c99 feature AC_CHECK_FUNCS(copysign) AC_CHECK_FUNCS(isblank) dnl Use strlcpy if it is available AC_SEARCH_LIBS([strlcpy], [bsd]) AS_IF([test "x$ac_cv_search_strlcpy" = "x-lbsd"], [AC_CHECK_HEADERS([bsd/string.h])]) AC_CHECK_FUNCS([strlcpy]) # Need the math library AC_CHECK_LIB([m],[sin]) dnl We can not simply test for Starlink starutil because dnl when configure runs in a Starlink build starutil will not dnl have been built yet. If --without-starlink has been used dnl $STARLINK will be unset but to play safe we also check STARCONF_DEFAULT_PREFIX dnl If we do not have Starlink we can do the test anyhow just in case if test -n "$STARCONF_DEFAULT_PREFIX" -a -n "$STARLINK" then AC_MSG_NOTICE([Assuming a Starlink environment]) AC_SUBST( STARUTIL_LIBADD, "${libdir}/libstarutil.la" ) AC_SUBST( ERFA_LIBADD, "${libdir}/liberfa.la" ) AC_SUBST( ERFA_LDFLAGS, "" ) AC_DEFINE( [HAVE_STAR_UTIL_H], [1], [Define to 1 if you have the header file]) else AC_MSG_NOTICE([Building outside a Starlink environment]) # Allow ERFA/SOFA location to be specified using --with-erfa=$ERFA_DIR # Assumes that the value supplied here is the root and lib and include directories # are below it. --with-erfa=no or --without-erfa will result in ERFA being # located in $PREFIX tree. This option is only effective if Starlink is not # active. AC_ARG_WITH(erfa, AS_HELP_STRING([--with-erfa], [Location of ERFA/SOFA tree]), [if test -z "$withval" -o "$withval" = yes; then unset ERFA_DIR elif test "X$withval" = Xno; then unset ERFA_DIR elif test -d "$withval"; then ERFA_DIR="$withval" else unset ERFA_DIR AC_MSG_WARN([--with-erfa given nonexistent directory; ignored: using default instead]) fi]) if test -n "$ERFA_DIR"; then AC_MSG_NOTICE([ERFA/SOFA tree located at $ERFA_DIR]) erfa_includedir="${ERFA_DIR}/include" erfa_libdir="${ERFA_DIR}/lib" else ERFA_DIR=${prefix} erfa_includedir=${includedir} erfa_libdir=${libdir} AC_MSG_NOTICE([Looking for ERFA/SOFA in default location of $ERFA_DIR]) fi dnl AC_CHECK_HEADERS does not search $includedir save_CPPFLAGS="$CPPFLAGS" eval CPPFLAGS=\"$CPPFLAGS -I${includedir} -I${erfa_includedir}\" eval CPPFLAGS=\"$CPPFLAGS\" AC_CHECK_HEADERS( star/util.h ) CPPFLAGS="$save_CPPFLAGS" dnl for some reason AC_CHECK_LIB does not look in the --prefix hierarchy so dnl $libdir is not searched. dnl and we use eval twice to convert $libdir -> $exec_prefix/lib -> $prefix/lib save_LDFLAGS="$LDFLAGS" eval LDFLAGS=\"$LDFLAGS -L${libdir} -L${erfa_libdir}\" eval LDFLAGS=\"$LDFLAGS\" AC_CHECK_LIB([starutil],[star_strlcpy], [AC_SUBST(STARUTIL_LIBADD, "-lstarutil")], [AC_SUBST(STARUTIL_LIBADD, "")]) AC_CHECK_LIB([erfa],[eraCal2jd], [AC_SUBST(ERFA_LIBADD, "-lerfa")], [ AC_CHECK_LIB([sofa_c],[iauCal2jd], [AC_SUBST(ERFA_LIBADD, "-lsofa_c") AC_DEFINE([HAVE_SOFA_H],[1],"Build with SOFA library")], [AC_MSG_ERROR(Neither ERFA nor SOFA library located. Can not continue)]) ]) LDFLAGS="$save_LDFLAGS" dnl Ensure that we use the $prefix values and the ERFA values AC_SUBST( ERFA_LDFLAGS, "-L${libdir} -L${erfa_libdir}" ) AC_SUBST( ERFA_CPPFLAGS, "-I${includedir} -I${erfa_includedir}" ) dnl Disable document building regardless of --without-stardocs _star_build_docs=false fi dnl Declare the build and use dependencies for this package STAR_DECLARE_DEPENDENCIES(build, [erfa starutil]) STAR_DECLARE_DEPENDENCIES(link, [erfa starutil]) dnl List the sun/ssn/... numbers which document this package and dnl which are present as .tex files in this directory. STAR_LATEX_DOCUMENTATION(sun267) dnl If you wish to configure extra files, you can add them to this dnl declaration. AC_CONFIG_FILES(Makefile component.xml) AC_CONFIG_HEADERS( config.h ) dnl This is the bit that does the actual work AC_OUTPUT pal-0.9.7/pal.h000066400000000000000000000437201302604645500132430ustar00rootroot00000000000000#ifndef PALHDEF #define PALHDEF /* *+ * Name: * pal.h * Purpose: * Function prototypes for PAL routines. * Language: * Starlink ANSI C * Type of Module: * Include file * Description: * Function prototypes for PAL routines. * Authors: * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * * History: * 2012-02-08 (TIMJ): * Initial version. Define all SLA prototypes in PAL form even * though none are implemented. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #ifdef __cplusplus extern "C" { #endif #include #include void palAddet ( double rm, double dm, double eq, double *rc, double *dc ); void palAfin ( const char *string, int *iptr, float *a, int *j ); double palAirmas ( double zd ); void palAltaz ( double ha, double dec, double phi, double *az, double *azd, double *azdd, double *el, double *eld, double *eldd, double *pa, double *pad, double *padd ); void palAmp ( double ra, double da, double date, double eq, double *rm, double *dm ); void palAmpqk ( double ra, double da, double amprms[21], double *rm, double *dm ); void palAop ( double rap, double dap, double date, double dut, double elongm, double phim, double hm, double xp, double yp, double tdk, double pmb, double rh, double wl, double tlr, double *aob, double *zob, double *hob, double *dob, double *rob ); void palAoppa ( double date, double dut, double elongm, double phim, double hm, double xp, double yp, double tdk, double pmb, double rh, double wl, double tlr, double aoprms[14] ); void palAoppat ( double date, double aoprms[14] ); void palAopqk ( double rap, double dap, const double aoprms[14], double *aob, double *zob, double *hob, double *dob, double *rob ); void palAtmdsp ( double tdk, double pmb, double rh, double wl1, double a1, double b1, double wl2, double *a2, double *b2 ); void palAv2m ( float axvec[3], float rmat[3][3] ); float palBear ( float a1, float b1, float a2, float b2 ); void palCaf2r ( int ideg, int iamin, float asec, float *rad, int *j ); void palCaldj ( int iy, int im, int id, double *djm, int *j ); void palCalyd ( int iy, int im, int id, int *ny, int *nd, int *j ); void palCc2s ( float v[3], float *a, float *b ); void palCc62s ( float v[6], float *a, float *b, float *r, float *ad, float *bd, float *rd ); void palCd2tf ( int ndp, float days, char *sign, int ihmsf[4] ); void palCldj ( int iy, int im, int id, double *djm, int *j ); void palClyd ( int iy, int im, int id, int *ny, int *nd, int *jstat ); void palCombn ( int nsel, int ncand, int list[], int *j ); void palCr2af ( int ndp, float angle, char *sign, int idmsf[4] ); void palCr2tf ( int ndp, float angle, char *sign, int ihmsf[4] ); void palCs2c ( float a, float b, float v[3] ); void palCs2c6 ( float a, float b, float r, float ad, float bd, float rd, float v[6] ); void palCtf2d ( int ihour, int imin, float sec, float *days, int *j ); void palCtf2r ( int ihour, int imin, float sec, float *rad, int *j ); void palDaf2r ( int ideg, int iamin, double asec, double *rad, int *j ); void palDafin ( const char *string, int *iptr, double *a, int *j ); double palDat ( double dju ); void palDav2m ( double axvec[3], double rmat[3][3] ); double palDbear ( double a1, double b1, double a2, double b2 ); void palDbjin ( const char *string, int *nstrt, double *dreslt, int *jf1, int *jf2 ); void palDc62s ( double v[6], double *a, double *b, double *r, double *ad, double *bd, double *rd ); void palDcc2s ( double v[3], double *a, double *b ); void palDcmpf ( double coeffs[6], double *xz, double *yz, double *xs, double *ys, double *perp, double *orient ); void palDcs2c ( double a, double b, double v[3] ); void palDd2tf ( int ndp, double days, char *sign, int ihmsf[4] ); void palDe2h ( double ha, double dec, double phi, double *az, double *el ); void palDeuler ( const char *order, double phi, double theta, double psi, double rmat[3][3] ); void palDfltin ( const char *string, int *nstrt, double *dreslt, int *jflag ); void palDh2e ( double az, double el, double phi, double *ha, double *dec); void palDimxv ( double dm[3][3], double va[3], double vb[3] ); void palDjcal ( int ndp, double djm, int iymdf[4], int *j ); void palDjcl ( double djm, int *iy, int *im, int *id, double *fd, int *j ); void palDm2av ( double rmat[3][3], double axvec[3] ); void palDmat ( int n, double *a, double *y, double *d, int *jf, int *iw ); void palDmoon ( double date, double pv[6] ); void palDmxm ( double a[3][3], double b[3][3], double c[3][3] ); void palDmxv ( double dm[3][3], double va[3], double vb[3] ); double palDpav ( double v1[3], double v2[3] ); void palDr2af ( int ndp, double angle, char *sign, int idmsf[4] ); void palDr2tf ( int ndp, double angle, char *sign, int ihmsf[4] ); double palDrange ( double angle ); double palDranrm ( double angle ); void palDs2c6 ( double a, double b, double r, double ad, double bd, double rd, double v[6] ); void palDs2tp ( double ra, double dec, double raz, double decz, double *xi, double *eta, int *j ); double palDsep ( double a1, double b1, double a2, double b2 ); double palDsepv ( double v1[3], double v2[3] ); double palDt ( double epoch ); void palDtf2d ( int ihour, int imin, double sec, double *days, int *j ); void palDtf2r ( int ihour, int imin, double sec, double *rad, int *j ); void palDtp2s ( double xi, double eta, double raz, double decz, double *ra, double *dec ); void palDtp2v ( double xi, double eta, double v0[3], double v[3] ); void palDtps2c ( double xi, double eta, double ra, double dec, double *raz1, double *decz1, double *raz2, double *decz2, int *n ); void palDtpv2c ( double xi, double eta, double v[3], double v01[3], double v02[3], int *n ); double palDtt ( double dju ); void palDv2tp ( double v[3], double v0[3], double *xi, double *eta, int *j ); double palDvdv ( double va[3], double vb[3] ); void palDvn ( double v[3], double uv[3], double *vm ); void palDvxv ( double va[3], double vb[3], double vc[3] ); void palE2h ( float ha, float dec, float phi, float *az, float *el ); void palEarth ( int iy, int id, float fd, float posvel[6] ); void palEcleq ( double dl, double db, double date, double *dr, double *dd ); void palEcmat ( double date, double rmat[3][3] ); void palEcor ( float rm, float dm, int iy, int id, float fd, float *rv, float *tl ); void palEg50 ( double dr, double dd, double *dl, double *db ); void palEl2ue ( double date, int jform, double epoch, double orbinc, double anode, double perih, double aorq, double e, double aorl, double dm, double u[13], int *jstat ); double palEpb ( double date ); double palEpb2d ( double epb ); double palEpco ( char k0, char k, double e ); double palEpj ( double date ); double palEpj2d ( double epj ); void palEpv( double date, double ph[3], double vh[3], double pb[3], double vb[3] ); void palEqecl ( double dr, double dd, double date, double *dl, double *db ); double palEqeqx ( double date ); void palEqgal ( double dr, double dd, double *dl, double *db ); void palEtrms ( double ep, double ev[3] ); void palEuler ( const char *order, float phi, float theta, float psi, float rmat[3][3] ); void palEvp ( double date, double deqx, double dvb[3], double dpb[3], double dvh[3], double dph[3] ); void palFitxy ( int itype, int np, double xye[][2], double xym[][2], double coeffs[6], int *j ); void palFk425 ( double r1950, double d1950, double dr1950, double dd1950, double p1950, double v1950, double *r2000, double *d2000, double *dr2000, double *dd2000, double *p2000, double *v2000 ); void palFk45z ( double r1950, double d1950, double bepoch, double *r2000, double *d2000 ); void palFk524 ( double r2000, double d2000, double dr2000, double dd2000, double p2000, double v2000, double *r1950, double *d1950, double *dr1950, double *dd1950, double *p1950, double *v1950 ); void palFk52h ( double r5, double d5, double dr5, double dd5, double *dr, double *dh, double *drh, double *ddh ); void palFk54z ( double r2000, double d2000, double bepoch, double *r1950, double *d1950, double *dr1950, double *dd1950 ); void palFk5hz ( double r5, double d5, double epoch, double *rh, double *dh ); void palFlotin ( const char *string, int *nstrt, float *reslt, int *jflag ); void palGaleq ( double dl, double db, double *dr, double *dd ); void palGalsup ( double dl, double db, double *dsl, double *dsb ); void palGe50 ( double dl, double db, double *dr, double *dd ); void palGeoc ( double p, double h, double *r, double *z ); double palGmst ( double ut1 ); double palGmsta ( double date, double ut1 ); void palH2e ( float az, float el, float phi, float *ha, float *dec ); void palH2fk5 ( double dr, double dh, double drh, double ddh, double *r5, double *d5, double *dr5, double *dd5 ); void palHfk5z ( double rh, double dh, double epoch, double *r5, double *d5, double *dr5, double *dd5 ); void palImxv ( float rm[3][3], float va[3], float vb[3] ); void palInt2in ( const char *string, int *nstrt, int *ireslt, int *jflag ); void palIntin ( const char *string, int *nstrt, long *ireslt, int *jflag ); void palInvf ( double fwds[6], double bkwds[6], int *j ); void palKbj ( int jb, double e, char *k, int *j ); void palM2av ( float rmat[3][3], float axvec[3] ); void palMap ( double rm, double dm, double pr, double pd, double px, double rv, double eq, double date, double *ra, double *da ); void palMappa ( double eq, double date, double amprms[21] ); void palMapqk ( double rm, double dm, double pr, double pd, double px, double rv, double amprms[21], double *ra, double *da ); void palMapqkz ( double rm, double dm, double amprms[21], double *ra, double *da ); void palMoon ( int iy, int id, float fd, float posvel[6] ); void palMxm ( float a[3][3], float b[3][3], float c[3][3] ); void palMxv ( float rm[3][3], float va[3], float vb[3] ); void palNut ( double date, double rmatn[3][3] ); void palNutc ( double date, double *dpsi, double *deps, double *eps0 ); void palNutc80 ( double date, double *dpsi, double *deps, double *eps0 ); void palOap ( const char *type, double ob1, double ob2, double date, double dut, double elongm, double phim, double hm, double xp, double yp, double tdk, double pmb, double rh, double wl, double tlr, double *rap, double *dap ); void palOapqk ( const char *type, double ob1, double ob2, const double aoprms[14], double *rap, double *dap ); int palObs( size_t n, const char * c, char * ident, size_t identlen, char * name, size_t namelen, double * w, double * p, double * h ); double palPa ( double ha, double dec, double phi ); double palPav ( float v1[3], float v2[3] ); void palPcd ( double disco, double *x, double *y ); void palPda2h ( double p, double d, double a, double *h1, int *j1, double *h2, int *j2 ); void palPdq2h ( double p, double d, double q, double *h1, int *j1, double *h2, int *j2 ); void palPermut ( int n, int istate[], int iorder[], int *j ); void palPertel (int jform, double date0, double date1, double epoch0, double orbi0, double anode0, double perih0, double aorq0, double e0, double am0, double *epoch1, double *orbi1, double *anode1, double *perih1, double *aorq1, double *e1, double *am1, int *jstat ); void palPertue ( double date, double u[13], int *jstat ); void palPlanel ( double date, int jform, double epoch, double orbinc, double anode, double perih, double aorq, double e, double aorl, double dm, double pv[6], int *jstat ); void palPlanet ( double date, int np, double pv[6], int *j ); void palPlante ( double date, double elong, double phi, int jform, double epoch, double orbinc, double anode, double perih, double aorq, double e, double aorl, double dm, double *ra, double *dec, double *r, int *jstat ); void palPlantu ( double date, double elong, double phi, const double u[13], double *ra, double *dec, double *r, int *jstat ); void palPm ( double r0, double d0, double pr, double pd, double px, double rv, double ep0, double ep1, double *r1, double *d1 ); void palPolmo ( double elongm, double phim, double xp, double yp, double *elong, double *phi, double *daz ); void palPrebn ( double bep0, double bep1, double rmatp[3][3] ); void palPrec ( double ep0, double ep1, double rmatp[3][3] ); void palPrecl ( double ep0, double ep1, double rmatp[3][3] ); void palPreces ( const char sys[3], double ep0, double ep1, double *ra, double *dc ); void palPrenut ( double epoch, double date, double rmatpn[3][3] ); void palPv2el ( const double pv[6], double date, double pmass, int jformr, int *jform, double *epoch, double *orbinc, double *anode, double *perih, double *aorq, double *e, double *aorl, double *dm, int *jstat ); void palPv2ue ( const double pv[6], double date, double pmass, double u[13], int *jstat ); void palPvobs ( double p, double h, double stl, double pv[6] ); void palPxy ( int np, double xye[][2], double xym[][2], double coeffs[6], double xyp[][2], double *xrms, double *yrms, double *rrms ); float palRange ( float angle ); float palRanorm ( float angle ); double palRcc ( double tdb, double ut1, double wl, double u, double v ); void palRdplan ( double date, int np, double elong, double phi, double *ra, double *dec, double *diam ); void palRefco ( double hm, double tdk, double pmb, double rh, double wl, double phi, double tlr, double eps, double *refa, double *refb ); void palRefcoq ( double tdk, double pmb, double rh, double wl, double *refa, double *refb ); void palRefro ( double zobs, double hm, double tdk, double pmb, double rh, double wl, double phi, double tlr, double eps, double *ref ); void palRefv ( double vu[3], double refa, double refb, double vr[3] ); void palRefz ( double zu, double refa, double refb, double *zr ); double palRverot ( double phi, double ra, double da, double st ); double palRvgalc ( double r2000, double d2000 ); double palRvlg ( double r2000, double d2000 ); double palRvlsrd ( double r2000, double d2000 ); double palRvlsrk ( double r2000, double d2000 ); void palS2tp ( float ra, float dec, float raz, float decz, float *xi, float *eta, int *j ); float palSep ( float a1, float b1, float a2, float b2 ); float palSepv ( float v1[3], float v2[3] ); void palSmat ( int n, float *a, float *y, float *d, int *jf, int *iw ); void palSubet ( double rc, double dc, double eq, double *rm, double *dm ); void palSupgal ( double dsl, double dsb, double *dl, double *db ); void palSvd ( int m, int n, int mp, int np, double *a, double *w, double *v, double *work, int *jstat ); void palSvdcov ( int n, int np, int nc, double *w, double *v, double *work, double *cvm ); void palSvdsol ( int m, int n, int mp, int np, double *b, double *u, double *w, double *v, double *work, double *x ); void palTp2s ( float xi, float eta, float raz, float decz, float *ra, float *dec ); void palTp2v ( float xi, float eta, float v0[3], float v[3] ); void palTps2c ( float xi, float eta, float ra, float dec, float *raz1, float *decz1, float *raz2, float *decz2, int *n ); void palTpv2c ( float xi, float eta, float v[3], float v01[3], float v02[3], int *n ); void palUe2el ( const double u[13], int jformr, int *jform, double *epoch, double *orbinc, double *anode, double *perih, double *aorq, double *e, double *aorl, double *dm, int *jstat ); void palUe2pv ( double date, double u[13], double pv[], int *jstat ); void palUnpcd ( double disco, double *x, double *y ); void palV2tp ( float v[3], float v0[3], float *xi, float *eta, int *j ); float palVdv ( float va[3], float vb[3] ); int palVers ( char * verstring, size_t verlen ); void palVn ( float v[3], float uv[3], float *vm ); void palVxv ( float va[3], float vb[3], float vc[3] ); void palXy2xy ( double x1, double y1, double coeffs[6], double *x2, double *y2 ); double palZd ( double ha, double dec, double phi ); #ifdef __cplusplus } #endif #endif pal-0.9.7/pal.news000066400000000000000000000073611302604645500137710ustar00rootroot00000000000000PAL Library The Starlink Positional Astronomy Library (PAL) is a C implementation of the SLALIB API. It is distributed under the GPL and uses the SOFA library wherever possible. V0.9.7 - Enable light deflection in palAmpqk. V0.9.5 - Add light deflection to palAmpqk. SLALIB always had it but for some reason the relevant piece of code never got ported to PAL. V0.9.4 - Add light deflection to palMapqkz (thanks to Scott Daniel) - Add test for palMapqk (thanks to Scott Daniel) - Correctly disable documentation build when running outside of a Starlink environment. V0.9.3 - Fix value of small in palFk524. Typo in port from Fortran had removed the "e" in the number. Thanks to @danielsf. - Add test for palFk524 V0.9.2 Thanks to Github user @nega0 for some BSD build fixes. More STARCONF_DEFAULT_PREFIX fixes for Scons file and for document building. New configure option: --with-erfa to allow the ERFA root location to be specified. V0.9.1 Now checks for STARCONF_DEFAULT_PREFIX environment variable when deciding whether a Starlink environment is present. This was more reliable than checking for STARLINK_DIR. V0.9.0 Add palPcd and palUnpcd V0.8.0 Add palEcleq V0.7.0 Add palPolmo. V0.6.0 New function, palVers, provides API access to the PAL version number as a string or integer. V0.5.1 The configure script was getting confused if run outside of Starlink without using --without-starlink. This was because $STARLINK is set in the script if it is not set and the configure script was assuming $STARLINK would be unset outside of a Starlink environment. The configure script now keys off $STARLINK_DIR but that may interact badly if STARLINK_DIR is set and --without-starlink is used. An experimental SConstruct build script is now available for users of scons. SUN/267 has been synced up with the associated source files. palIntin now respects the isblank configure check (as it should have done all along). Minor clean ups of some source prologues. V0.5.0 Now works with ERFA . The configure script has been modified to first check for ERFA and then check for SOFA. V0.4.0 New routines ported from SLA: palRefv, palAtmdsp New routine inherited from SOFA: palRefcoq Minimum SOFA version now 2013-12-02 palObs: Now includes telescope positions for APEX and NANTEN2 The autotools build scripts now require autoconf version 2.69. Thanks to Github user @nega0 for some BSD build fixes. A subset of the routines have been relicensed using LGPL to allow them to be included in the AST library. Thanks to Patrick Wallace for giving this permission. A paper on PAL has been published at ADASS: http://adsabs.harvard.edu/abs/2013ASPC..475..307J V0.3.0 Add refraction code and support palOap and palAop. For closer compatibility with SLA for testing purposes the refraction routines internally use clones of slaNutc, slaEqeqx, slaGmst and slaGeoc. Once the code has been verified further the PAL/SOFA routines will be used instead. Switching routines seems to change the results in palTest by about 0.05 arcsec. V0.2.0 Improve configure script when not in a Starlink build environment. Use ./configure --prefix=/path/to/install when Starlink is not available and add --without-starlink if Starlink is present but should not be used. V0.1.5 Explcitly look for libm rather than relying on SOFA to pull it in. V0.1.4 Check for isblank() function and fall back if it is missing. V0.1.3 Improve copysign() detection. V0.1.2 Check for copysign() c99 function and fall back if it is missing. V0.1.1 The palDrange function has been modified so that it now returns +PI if the supplied angle is +PI (previously, it returned -PI in these cases). V0.1.0 Initial release with sufficient SLALIB API for AST and the Astro::Coords perl module. pal-0.9.7/pal1.h000066400000000000000000000035221302604645500133200ustar00rootroot00000000000000/* *+ * Name: * pal1.h * Purpose: * Definitions of private PAL functions * Language: * Starlink ANSI C * Type of Module: * Include file * Invocation: * #include "pal1.h" * Description: * Function prototypes for private PAL functions. Will not be * installed. * Authors: * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * History: * 2012-08-24 (TIMJ): * Initial version * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #ifndef PAL1HDEF #define PAL1HDEF void pal1Atms ( double rt, double tt, double dnt, double gamal, double r, double * dn, double * rdndr ); void pal1Atmt ( double r0, double t0, double alpha, double gamm2, double delm2, double c1, double c2, double c3, double c4, double c5, double c6, double r, double *t, double *dn, double *rdndr ); #endif pal-0.9.7/pal1Atms.c000066400000000000000000000050171302604645500141410ustar00rootroot00000000000000/* *+ * Name: * pal1Atms * Purpose: * Calculate stratosphere parameters * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void pal1Atms ( double rt, double tt, double dnt, double gamal, * double r, double * dn, double * rdndr ); * Arguments: * rt = double (Given) * Height of the tropopause from centre of the Earth (metre) * tt = double (Given) * Temperature at the tropopause (K) * dnt = double (Given) * Refractive index at the tropopause * gamal = double (Given) * Constant of the atmospheric model = G*MD/R * r = double (Given) * Current distance from the centre of the Earth (metre) * dn = double * (Returned) * Refractive index at r * rdndr = double * (Returned) * r * rate the refractive index is changing at r * Description: * Refractive index and derivative with respect to height for the * stratosphere. * Authors: * TIMJ: Tim Jenness (JAC, Hawaii) * PTW: Patrick T. Wallace * {enter_new_authors_here} * Notes: * - Internal routine used by palRefro. * History: * 2012-08-24 (TIMJ): * Initial version * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2004 Patrick T. Wallace * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include #include "pal1.h" void pal1Atms ( double rt, double tt, double dnt, double gamal, double r, double * dn, double * rdndr ) { double b; double w; b = gamal / tt; w = (dnt - 1.0) * exp( -b * (r-rt) ); *dn = 1.0 + w; *rdndr = -r * b * w; } pal-0.9.7/pal1Atmt.c000066400000000000000000000071031302604645500141400ustar00rootroot00000000000000/* *+ * Name: * pal1Atmt * Purpose: * Calculate troposphere parameters * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void pal1Atmt ( double r0, double t0, double alpha, double gamm2, * double delm2, double c1, double c2, double c3, * double c4, double c5, double c6, double r, * double *t, double *dn, double *rdndr ); * Arguments: * r0 = double (Given) * Height of observer from centre of the Earth (metre) * t0 = double (Given) * Temperature of the observer (K) * alpha = double (Given) * Alpha (see HMNAO paper) * gamm2 = double (Given) * Gamma minus 2 (see HMNAO paper) * delm2 = double (Given) * Delta minus 2 (see HMNAO paper) * c1 = double (Given) * Useful term (see palRefro source) * c2 = double (Given) * Useful term (see palRefro source) * c3 = double (Given) * Useful term (see palRefro source) * c4 = double (Given) * Useful term (see palRefro source) * c5 = double (Given) * Useful term (see palRefro source) * c6 = double (Given) * Useful term (see palRefro source) * r = double (Given) * Current distance from the centre of the Earth (metre) * t = double * (Returned) * Temperature at r (K) * dn = double * (Returned) * Refractive index at r. * rdndr = double * (Returned) * r * rate the refractive index is changing at r. * Description: * Refractive index and derivative with respect to height for * the troposphere. * Authors: * TIMJ: Tim Jenness (JAC, Hawaii) * PTW: Patrick T. Wallace * {enter_new_authors_here} * Notes: * - Internal routine used by palRefro * - Note that in the optical case c5 and c6 are zero. * History: * 2012-08-24 (TIMJ): * Initial version, copied from Fortran SLA source. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2004 Patrick T. Wallace * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include #include "palmac.h" #include "pal1.h" void pal1Atmt ( double r0, double t0, double alpha, double gamm2, double delm2, double c1, double c2, double c3, double c4, double c5, double c6, double r, double *t, double *dn, double *rdndr ) { double tt0; double tt0gm2; double tt0dm2; *t = DMAX( DMIN( t0 - alpha*(r-r0), 320.0), 100.0 ); tt0 = *t / t0; tt0gm2 = pow( tt0, gamm2 ); tt0dm2 = pow( tt0, delm2 ); *dn = 1.0 + ( c1 * tt0gm2 - ( c2 - c5 / *t ) * tt0dm2 ) * tt0; *rdndr = r * ( -c3 * tt0gm2 + ( c4 - c6 / tt0 ) * tt0dm2 ); } pal-0.9.7/pal1sofa.h000066400000000000000000000062421302604645500141730ustar00rootroot00000000000000/* *+ * Name: * pal1sofa.h * Purpose: * Mappings of ERFA names to SOFA names * Language: * Starlink ANSI C * Type of Module: * Include file * Invocation: * #include "pal1sofa.h" * Description: * PAL will work with both SOFA and ERFA libraries and the * difference is generally a change in prefix. This include * file maps the ERFA form of functions to the SOFA form * and includes the relevant sofa.h vs erfa.h file. * Authors: * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - PAL uses the ERFA form by default. * History: * 2014-07-29 (TIMJ): * Initial version * {enter_further_changes_here} * Copyright: * Copyright (C) 2014 Tim Jenness * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #ifndef PAL1SOFAHDEF #define PAL1SOFAHDEF #if HAVE_CONFIG_H # include #endif # if HAVE_SOFA_H # include "sofa.h" # include "sofam.h" /* Must replace ERFA with SOFA */ # define eraA2af iauA2af # define eraA2tf iauA2tf # define eraAf2a iauAf2a # define eraAnp iauAnp # define eraAnpm iauAnpm # define eraC2s iauC2s # define eraCal2jd iauCal2jd # define eraD2tf iauD2tf # define eraDat iauDat # define eraEe06a iauEe06a # define eraEpb iauEpb # define eraEpb2jd iauEpb2jd # define eraEpj iauEpj # define eraEpj2jd iauEpj2jd # define eraEpv00 iauEpv00 # define eraFk5hz iauFk5hz # define eraGd2gc iauGd2gc # define eraGmst06 iauGmst06 # define eraHfk5z iauHfk5z # define eraIr iauIr # define eraJd2cal iauJd2cal # define eraNut06a iauNut06a # define eraObl06 iauObl06 # define eraP06e iauP06e # define eraPap iauPap # define eraPas iauPas # define eraPdp iauPdp # define eraPlan94 iauPlan94 # define eraPmat06 iauPmat06 # define eraPn iauPn # define eraPnm06a iauPnm06a # define eraPxp iauPxp # define eraRefco iauRefco # define eraRm2v iauRm2v # define eraRv2m iauRv2m # define eraRx iauRx # define eraRxp iauRxp # define eraRxpv iauRxpv # define eraRxr iauRxr # define eraRy iauRy # define eraRz iauRz # define eraS2c iauS2c # define eraSepp iauSepp # define eraSeps iauSeps # define eraStarpm iauStarpm # define eraTf2a iauTf2a # define eraTf2d iauTf2d # define eraTr iauTr # define eraTrxp iauTrxp /* These are from sofam.h */ # define ERFA_WGS84 WGS84 # define ERFA_DJ00 DJ00 # define ERFA_DJY DJY # define ERFA_DAU DAU # else # include "erfa.h" # include "erfam.h" /* No further action required */ # endif #endif pal-0.9.7/palAddet.c000066400000000000000000000057561302604645500142070ustar00rootroot00000000000000/* *+ * Name: * palAddet * Purpose: * Add the E-terms to a pre IAU 1976 mean place * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palAddet ( double rm, double dm, double eq, * double *rc, double *dc ); * Arguments: * rm = double (Given) * RA without E-terms (radians) * dm = double (Given) * Dec without E-terms (radians) * eq = double (Given) * Besselian epoch of mean equator and equinox * rc = double * (Returned) * RA with E-terms included (radians) * dc = double * (Returned) * Dec with E-terms included (radians) * Description: * Add the E-terms (elliptic component of annual aberration) * to a pre IAU 1976 mean place to conform to the old * catalogue convention. * Authors: * PTW: Pat Wallace (STFC) * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * Most star positions from pre-1984 optical catalogues (or * derived from astrometry using such stars) embody the * E-terms. If it is necessary to convert a formal mean * place (for example a pulsar timing position) to one * consistent with such a star catalogue, then the RA,Dec * should be adjusted using this routine. * See Also: * Explanatory Supplement to the Astronomical Ephemeris, * section 2D, page 48. * History: * 2012-02-12(TIMJ): * Initial version with documentation taken from Fortran SLA * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1999 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "pal1sofa.h" void palAddet ( double rm, double dm, double eq, double *rc, double *dc ) { double a[3]; /* The E-terms */ double v[3]; int i; /* Note the preference for IAU routines */ /* Retrieve the E-terms */ palEtrms( eq, a ); /* Spherical to Cartesian */ eraS2c( rm, dm, v ); /* Include the E-terms */ for (i=0; i<3; i++) { v[i] += a[i]; } /* Cartesian to spherical */ eraC2s( v, rc, dc ); /* Bring RA into conventional range */ *rc = eraAnp( *rc ); } pal-0.9.7/palAirmas.c000066400000000000000000000060351302604645500143710ustar00rootroot00000000000000/* *+ * Name: * palAirmas * Purpose: * Air mass at given zenith distance * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * double palAirmas( double zd ); * Arguments: * zd = double (Given) * Observed zenith distance (radians) * Description: * Calculates the airmass at the observed zenith distance. * Authors: * PTW: Patrick Wallace (STFC) * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - The "observed" zenith distance referred to above means "as * affected by refraction". * - Uses Hardie's (1962) polynomial fit to Bemporad's data for * the relative air mass, X, in units of thickness at the zenith * as tabulated by Schoenberg (1929). This is adequate for all * normal needs as it is accurate to better than 0.1% up to X = * 6.8 and better than 1% up to X = 10. Bemporad's tabulated * values are unlikely to be trustworthy to such accuracy * because of variations in density, pressure and other * conditions in the atmosphere from those assumed in his work. * - The sign of the ZD is ignored. * - At zenith distances greater than about ZD = 87 degrees the * air mass is held constant to avoid arithmetic overflows. * See Also: * - Hardie, R.H., 1962, in "Astronomical Techniques" * ed. W.A. Hiltner, University of Chicago Press, p180. * - Schoenberg, E., 1929, Hdb. d. Ap., * Berlin, Julius Springer, 2, 268. * History: * 2012-03-02 (TIMJ): * Initial version from the SLA/F version including documentation. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1999 Rutherford Appleton Laboratory. * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "palmac.h" double palAirmas ( double zd ) { double seczm1; double airmass; /* Have maximum zenith distance of 87 deg */ const double MAXZD = 87.0 * PAL__DD2R; zd = fabs(zd); zd = ( zd > MAXZD ? MAXZD : zd ); seczm1 = (1.0 / cos(zd)) - 1.0; airmass = 1.0 + seczm1*(0.9981833 - seczm1*(0.002875 + 0.0008083*seczm1)); return airmass; } pal-0.9.7/palAltaz.c000066400000000000000000000132721302604645500142310ustar00rootroot00000000000000/* *+ * Name: * palAltaz * Purpose: * Positions, velocities and accelerations for an altazimuth telescope mount * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palAltaz ( double ha, double dec, double phi, * double *az, double *azd, double *azdd, * double *el, double *eld, double *eldd, * double *pa, double *pad, double *padd ); * Arguments: * ha = double (Given) * Hour angle (radians) * dec = double (Given) * Declination (radians) * phi = double (Given) * Observatory latitude (radians) * az = double * (Returned) * Azimuth (radians) * azd = double * (Returned) * Azimuth velocity (radians per radian of HA) * azdd = double * (Returned) * Azimuth acceleration (radians per radian of HA squared) * el = double * (Returned) * Elevation (radians) * eld = double * (Returned) * Elevation velocity (radians per radian of HA) * eldd = double * (Returned) * Elevation acceleration (radians per radian of HA squared) * pa = double * (Returned) * Parallactic angle (radians) * pad = double * (Returned) * Parallactic angle velocity (radians per radian of HA) * padd = double * (Returned) * Parallactic angle acceleration (radians per radian of HA squared) * Description: * Positions, velocities and accelerations for an altazimuth * telescope mount. * Authors: * PTW: P. T. Wallace * TIMJ: Tim Jenness (Cornell) * {enter_new_authors_here} * Notes: * - Natural units are used throughout. HA, DEC, PHI, AZ, EL * and ZD are in radians. The velocities and accelerations * assume constant declination and constant rate of change of * hour angle (as for tracking a star); the units of AZD, ELD * and PAD are radians per radian of HA, while the units of AZDD, * ELDD and PADD are radians per radian of HA squared. To * convert into practical degree- and second-based units: * * angles * 360/2pi -> degrees * velocities * (2pi/86400)*(360/2pi) -> degree/sec * accelerations * ((2pi/86400)**2)*(360/2pi) -> degree/sec/sec * * Note that the seconds here are sidereal rather than SI. One * sidereal second is about 0.99727 SI seconds. * * The velocity and acceleration factors assume the sidereal * tracking case. Their respective numerical values are (exactly) * 1/240 and (approximately) 1/3300236.9. * * - Azimuth is returned in the range 0-2pi; north is zero, * and east is +pi/2. Elevation and parallactic angle are * returned in the range +/-pi. Parallactic angle is +ve for * a star west of the meridian and is the angle NP-star-zenith. * * - The latitude is geodetic as opposed to geocentric. The * hour angle and declination are topocentric. Refraction and * deficiencies in the telescope mounting are ignored. The * purpose of the routine is to give the general form of the * quantities. The details of a real telescope could profoundly * change the results, especially close to the zenith. * * - No range checking of arguments is carried out. * * - In applications which involve many such calculations, rather * than calling the present routine it will be more efficient to * use inline code, having previously computed fixed terms such * as sine and cosine of latitude, and (for tracking a star) * sine and cosine of declination. * History: * 2014-09-30 (TIMJ): * Initial version. Ported from Fortran SLA * {enter_further_changes_here} * Copyright: * Copyright (C) 2004 P.T. Wallace * Copyright (C) 2014 Cornell University * All Rights Reserved. * Licence: * 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 . * Bugs: * {note_any_bugs_here} *- */ #include #include "pal.h" #include "palmac.h" void palAltaz ( double ha, double dec, double phi, double *az, double *azd, double *azdd, double *el, double *eld, double *eldd, double *pa, double *pad, double *padd ) { const double TINY = 1E-30; double sh,ch,sd,cd,sp,cp,chcd,sdcp,x,y,z,rsq,r,a,e,c,s, q,qd,ad,ed,edr,add,edd,qdd; /* Useful functions */ sh=sin(ha); ch=cos(ha); sd=sin(dec); cd=cos(dec); sp=sin(phi); cp=cos(phi); chcd=ch*cd; sdcp=sd*cp; x=-chcd*sp+sdcp; y=-sh*cd; z=chcd*cp+sd*sp; rsq=x*x+y*y; r=sqrt(rsq); /* Azimuth and elevation */ if (rsq == 0.0) { a=0.0; } else { a=atan2(y,x); } if (a < 0.0) a += PAL__D2PI; e=atan2(z,r); /* Parallactic angle */ c=cd*sp-ch*sdcp; s=sh*cp; if (c*c+s*s > 0) { q=atan2(s,c); } else { q= PAL__DPI - ha; } /* Velocities and accelerations (clamped at zenith/nadir) */ if (rsq < TINY) { rsq=TINY; r=sqrt(rsq); } qd=-x*cp/rsq; ad=sp+z*qd; ed=cp*y/r; edr=ed/r; add=edr*(z*sp+(2.0-rsq)*qd); edd=-r*qd*ad; qdd=edr*(sp+2.0*z*qd); /* Results */ *az=a; *azd=ad; *azdd=add; *el=e; *eld=ed; *eldd=edd; *pa=q; *pad=qd; *padd=qdd; } pal-0.9.7/palAmp.c000066400000000000000000000045321302604645500136720ustar00rootroot00000000000000/* *+ * Name: * palAmp * Purpose: * Convert star RA,Dec from geocentric apparaent to mean place. * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palAmp ( double ra, double da, double date, double eq, * double *rm, double *dm ); * Arguments: * ra = double (Given) * Apparent RA (radians) * dec = double (Given) * Apparent Dec (radians) * date = double (Given) * TDB for apparent place (JD-2400000.5) * eq = double (Given) * Equinox: Julian epoch of mean place. * rm = double * (Returned) * Mean RA (radians) * dm = double * (Returned) * Mean Dec (radians) * Description: * Convert star RA,Dec from geocentric apparent to mean place. The * mean coordinate system is close to ICRS. See palAmpqk for details. * Authors: * TIMJ: Tim Jenness (JAC, Hawaii) * PTW: Patrick T. Wallace * {enter_new_authors_here} * Notes: * - See palMappa and palAmpqk for details. * History: * 2012-03-02 (TIMJ): * Initial version * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2001 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" void palAmp ( double ra, double da, double date, double eq, double *rm, double *dm ) { double amprms[21]; palMappa( eq, date, amprms ); palAmpqk( ra, da, amprms, rm, dm ); } pal-0.9.7/palAmpqk.c000066400000000000000000000111401302604645500142170ustar00rootroot00000000000000/* *+ * Name: * palAmpqk * Purpose: * Convert star RA,Dec from geocentric apparent to mean place. * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palAmpqk ( double ra, double da, double amprms[21], * double *rm, double *dm ) * Arguments: * ra = double (Given) * Apparent RA (radians). * da = double (Given) * Apparent Dec (radians). * amprms = double[21] (Given) * Star-independent mean-to-apparent parameters (see palMappa): * (0) time interval for proper motion (Julian years) * (1-3) barycentric position of the Earth (AU) * (4-6) heliocentric direction of the Earth (unit vector) * (7) (grav rad Sun)*2/(Sun-Earth distance) * (8-10) abv: barycentric Earth velocity in units of c * (11) sqrt(1-v*v) where v=modulus(abv) * (12-20) precession/nutation (3,3) matrix * rm = double (Returned) * Mean RA (radians). * dm = double (Returned) * Mean Dec (radians). * Description: * Convert star RA,Dec from geocentric apparent to mean place. The "mean" * coordinate system is in fact close to ICRS. Use of this function * is appropriate when efficiency is important and where many star * positions are all to be transformed for one epoch and equinox. The * star-independent parameters can be obtained by calling the palMappa * function. * Note: * Iterative techniques are used for the aberration and * light deflection corrections so that the routines * palAmp (or palAmpqk) and palMap (or palMapqk) are * accurate inverses; even at the edge of the Sun's disc * the discrepancy is only about 1 nanoarcsecond. * Authors: * PTW: Pat Wallace (STFC) * TIMJ: Tim Jenness * {enter_new_authors_here} * History: * 2012-02-13 (PTW): * Initial version. * Adapted with permission from the Fortran SLALIB library. * 2016-12-19 (TIMJ): * Add in light deflection (was missed in the initial port). * {enter_further_changes_here} * Copyright: * Copyright (C) 2000 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * Copyright (C) 2016 Tim Jenness * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "pal1sofa.h" void palAmpqk ( double ra, double da, double amprms[21], double *rm, double *dm ){ /* Local Variables: */ double ab1; /* sqrt(1-v*v) where v=modulus of Earth vel */ double abv[3]; /* Earth velocity wrt SSB (c, FK5) */ double p1[3], p2[3], p3[3]; /* work vectors */ double ab1p1, p1dv, p1dvp1, w; double gr2e, pde, pdep1, ehn[3], p[3]; int i, j; /* Unpack some of the parameters */ gr2e = amprms[7]; ab1 = amprms[11]; for( i = 0; i < 3; i++ ) { ehn[i] = amprms[i + 4]; abv[i] = amprms[i + 8]; } /* Apparent RA,Dec to Cartesian */ eraS2c( ra, da, p3 ); /* Precession and nutation */ eraTrxp( (double(*)[3]) &rms[12], p3, p2 ); /* Aberration */ ab1p1 = ab1 + 1.0; for( i = 0; i < 3; i++ ) { p1[i] = p2[i]; } for( j = 0; j < 2; j++ ) { p1dv = eraPdp( p1, abv ); p1dvp1 = 1.0 + p1dv; w = 1.0 + p1dv / ab1p1; for( i = 0; i < 3; i++ ) { p1[i] = ( p1dvp1 * p2[i] - w * abv[i] ) / ab1; } eraPn( p1, &w, p3 ); for( i = 0; i < 3; i++ ) { p1[i] = p3[i]; } } /* Light deflection */ for( i = 0; i < 3; i++ ) { p[i] = p1[i]; } for( j = 0; j < 5; j++ ) { pde = eraPdp( p, ehn ); pdep1 = 1.0 + pde; w = pdep1 - gr2e*pde; for( i = 0; i < 3; i++ ) { p[i] = (pdep1*p1[i] - gr2e*ehn[i])/w; } eraPn( p, &w, p2 ); for( i = 0; i < 3; i++ ) { p[i] = p2[i]; } } /* Mean RA,Dec */ eraC2s( p, rm, dm ); *rm = eraAnp( *rm ); } pal-0.9.7/palAop.c000066400000000000000000000240251302604645500136730ustar00rootroot00000000000000/* *+ * Name: * palAop * Purpose: * Apparent to observed place * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palAop ( double rap, double dap, double date, double dut, * double elongm, double phim, double hm, double xp, * double yp, double tdk, double pmb, double rh, * double wl, double tlr, * double *aob, double *zob, double *hob, * double *dob, double *rob ); * Arguments: * rap = double (Given) * Geocentric apparent right ascension * dap = double (Given) * Geocentirc apparent declination * date = double (Given) * UTC date/time (Modified Julian Date, JD-2400000.5) * dut = double (Given) * delta UT: UT1-UTC (UTC seconds) * elongm = double (Given) * Mean longitude of the observer (radians, east +ve) * phim = double (Given) * Mean geodetic latitude of the observer (radians) * hm = double (Given) * Observer's height above sea level (metres) * xp = double (Given) * Polar motion x-coordinates (radians) * yp = double (Given) * Polar motion y-coordinates (radians) * tdk = double (Given) * Local ambient temperature (K; std=273.15) * pmb = double (Given) * Local atmospheric pressure (mb; std=1013.25) * rh = double (Given) * Local relative humidity (in the range 0.0-1.0) * wl = double (Given) * Effective wavelength (micron, e.g. 0.55) * tlr = double (Given) * Tropospheric laps rate (K/metre, e.g. 0.0065) * aob = double * (Returned) * Observed azimuth (radians: N=0; E=90) * zob = double * (Returned) * Observed zenith distance (radians) * hob = double * (Returned) * Observed Hour Angle (radians) * dob = double * (Returned) * Observed Declination (radians) * rob = double * (Returned) * Observed Right Ascension (radians) * Description: * Apparent to observed place for sources distant from the solar system. * Authors: * PTW: Patrick T. Wallace * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - This routine returns zenith distance rather than elevation * in order to reflect the fact that no allowance is made for * depression of the horizon. * * - The accuracy of the result is limited by the corrections for * refraction. Providing the meteorological parameters are * known accurately and there are no gross local effects, the * predicted apparent RA,Dec should be within about 0.1 arcsec * for a zenith distance of less than 70 degrees. Even at a * topocentric zenith distance of 90 degrees, the accuracy in * elevation should be better than 1 arcmin; useful results * are available for a further 3 degrees, beyond which the * palRefro routine returns a fixed value of the refraction. * The complementary routines palAop (or palAopqk) and palOap * (or palOapqk) are self-consistent to better than 1 micro- * arcsecond all over the celestial sphere. * * - It is advisable to take great care with units, as even * unlikely values of the input parameters are accepted and * processed in accordance with the models used. * * - "Apparent" place means the geocentric apparent right ascension * and declination, which is obtained from a catalogue mean place * by allowing for space motion, parallax, precession, nutation, * annual aberration, and the Sun's gravitational lens effect. For * star positions in the FK5 system (i.e. J2000), these effects can * be applied by means of the palMap etc routines. Starting from * other mean place systems, additional transformations will be * needed; for example, FK4 (i.e. B1950) mean places would first * have to be converted to FK5, which can be done with the * palFk425 etc routines. * * - "Observed" Az,El means the position that would be seen by a * perfect theodolite located at the observer. This is obtained * from the geocentric apparent RA,Dec by allowing for Earth * orientation and diurnal aberration, rotating from equator * to horizon coordinates, and then adjusting for refraction. * The HA,Dec is obtained by rotating back into equatorial * coordinates, using the geodetic latitude corrected for polar * motion, and is the position that would be seen by a perfect * equatorial located at the observer and with its polar axis * aligned to the Earth's axis of rotation (n.b. not to the * refracted pole). Finally, the RA is obtained by subtracting * the HA from the local apparent ST. * * - To predict the required setting of a real telescope, the * observed place produced by this routine would have to be * adjusted for the tilt of the azimuth or polar axis of the * mounting (with appropriate corrections for mount flexures), * for non-perpendicularity between the mounting axes, for the * position of the rotator axis and the pointing axis relative * to it, for tube flexure, for gear and encoder errors, and * finally for encoder zero points. Some telescopes would, of * course, exhibit other properties which would need to be * accounted for at the appropriate point in the sequence. * * - This routine takes time to execute, due mainly to the * rigorous integration used to evaluate the refraction. * For processing multiple stars for one location and time, * call palAoppa once followed by one call per star to palAopqk. * Where a range of times within a limited period of a few hours * is involved, and the highest precision is not required, call * palAoppa once, followed by a call to palAoppat each time the * time changes, followed by one call per star to palAopqk. * * - The DATE argument is UTC expressed as an MJD. This is, * strictly speaking, wrong, because of leap seconds. However, * as long as the delta UT and the UTC are consistent there * are no difficulties, except during a leap second. In this * case, the start of the 61st second of the final minute should * begin a new MJD day and the old pre-leap delta UT should * continue to be used. As the 61st second completes, the MJD * should revert to the start of the day as, simultaneously, * the delta UTC changes by one second to its post-leap new value. * * - The delta UT (UT1-UTC) is tabulated in IERS circulars and * elsewhere. It increases by exactly one second at the end of * each UTC leap second, introduced in order to keep delta UT * within +/- 0.9 seconds. * * - IMPORTANT -- TAKE CARE WITH THE LONGITUDE SIGN CONVENTION. * The longitude required by the present routine is east-positive, * in accordance with geographical convention (and right-handed). * In particular, note that the longitudes returned by the * palObs routine are west-positive, following astronomical * usage, and must be reversed in sign before use in the present * routine. * * - The polar coordinates XP,YP can be obtained from IERS * circulars and equivalent publications. The maximum amplitude * is about 0.3 arcseconds. If XP,YP values are unavailable, * use XP=YP=0.0. See page B60 of the 1988 Astronomical Almanac * for a definition of the two angles. * * - The height above sea level of the observing station, HM, * can be obtained from the Astronomical Almanac (Section J * in the 1988 edition), or via the routine palObs. If P, * the pressure in millibars, is available, an adequate * estimate of HM can be obtained from the expression * * HM ~ -29.3*TSL*LOG(P/1013.25). * * where TSL is the approximate sea-level air temperature in K * (see Astrophysical Quantities, C.W.Allen, 3rd edition, * section 52). Similarly, if the pressure P is not known, * it can be estimated from the height of the observing * station, HM, as follows: * * P ~ 1013.25*EXP(-HM/(29.3*TSL)). * * Note, however, that the refraction is nearly proportional to the * pressure and that an accurate P value is important for precise * work. * * - The azimuths etc produced by the present routine are with * respect to the celestial pole. Corrections to the terrestrial * pole can be computed using palPolmo. * History: * 2012-08-25 (TIMJ): * Initial version * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2005 Patrick T. Wallace * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" void palAop ( double rap, double dap, double date, double dut, double elongm, double phim, double hm, double xp, double yp, double tdk, double pmb, double rh, double wl, double tlr, double *aob, double *zob, double *hob, double *dob, double *rob ) { double aoprms[14]; palAoppa(date,dut,elongm,phim,hm,xp,yp,tdk,pmb,rh,wl,tlr, aoprms); palAopqk(rap,dap,aoprms,aob,zob,hob,dob,rob); } pal-0.9.7/palAoppa.c000066400000000000000000002553501302604645500142230ustar00rootroot00000000000000/* *+ * Name: * palAoppa * Purpose: * Precompute apparent to observed place parameters * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palAoppa ( double date, double dut, double elongm, double phim, * double hm, double xp, double yp, double tdk, double pmb, * double rh, double wl, double tlr, double aoprms[14] ); * Arguments: * date = double (Given) * UTC date/time (modified Julian Date, JD-2400000.5) * dut = double (Given) * delta UT: UT1-UTC (UTC seconds) * elongm = double (Given) * mean longitude of the observer (radians, east +ve) * phim = double (Given) * mean geodetic latitude of the observer (radians) * hm = double (Given) * observer's height above sea level (metres) * xp = double (Given) * polar motion x-coordinate (radians) * yp = double (Given) * polar motion y-coordinate (radians) * tdk = double (Given) * local ambient temperature (K; std=273.15) * pmb = double (Given) * local atmospheric pressure (mb; std=1013.25) * rh = double (Given) * local relative humidity (in the range 0.0-1.0) * wl = double (Given) * effective wavelength (micron, e.g. 0.55) * tlr = double (Given) * tropospheric lapse rate (K/metre, e.g. 0.0065) * aoprms = double [14] (Returned) * Star-independent apparent-to-observed parameters * * (0) geodetic latitude (radians) * (1,2) sine and cosine of geodetic latitude * (3) magnitude of diurnal aberration vector * (4) height (hm) * (5) ambient temperature (tdk) * (6) pressure (pmb) * (7) relative humidity (rh) * (8) wavelength (wl) * (9) lapse rate (tlr) * (10,11) refraction constants A and B (radians) * (12) longitude + eqn of equinoxes + sidereal DUT (radians) * (13) local apparent sidereal time (radians) * Description: * Precompute apparent to observed place parameters required by palAopqk * and palOapqk. * Authors: * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - It is advisable to take great care with units, as even * unlikely values of the input parameters are accepted and * processed in accordance with the models used. * * - The DATE argument is UTC expressed as an MJD. This is, * strictly speaking, improper, because of leap seconds. However, * as long as the delta UT and the UTC are consistent there * are no difficulties, except during a leap second. In this * case, the start of the 61st second of the final minute should * begin a new MJD day and the old pre-leap delta UT should * continue to be used. As the 61st second completes, the MJD * should revert to the start of the day as, simultaneously, * the delta UTC changes by one second to its post-leap new value. * * - The delta UT (UT1-UTC) is tabulated in IERS circulars and * elsewhere. It increases by exactly one second at the end of * each UTC leap second, introduced in order to keep delta UT * within +/- 0.9 seconds. * * - IMPORTANT -- TAKE CARE WITH THE LONGITUDE SIGN CONVENTION. * The longitude required by the present routine is east-positive, * in accordance with geographical convention (and right-handed). * In particular, note that the longitudes returned by the * palObs routine are west-positive, following astronomical * usage, and must be reversed in sign before use in the present * routine. * * - The polar coordinates XP,YP can be obtained from IERS * circulars and equivalent publications. The maximum amplitude * is about 0.3 arcseconds. If XP,YP values are unavailable, * use XP=YP=0.0. See page B60 of the 1988 Astronomical Almanac * for a definition of the two angles. * * - The height above sea level of the observing station, HM, * can be obtained from the Astronomical Almanac (Section J * in the 1988 edition), or via the routine palObs. If P, * the pressure in millibars, is available, an adequate * estimate of HM can be obtained from the expression * * HM ~ -29.3*TSL*log(P/1013.25). * * where TSL is the approximate sea-level air temperature in K * (see Astrophysical Quantities, C.W.Allen, 3rd edition, * section 52). Similarly, if the pressure P is not known, * it can be estimated from the height of the observing * station, HM, as follows: * * P ~ 1013.25*exp(-HM/(29.3*TSL)). * * Note, however, that the refraction is nearly proportional to the * pressure and that an accurate P value is important for precise * work. * * - Repeated, computationally-expensive, calls to palAoppa for * times that are very close together can be avoided by calling * palAoppa just once and then using palAoppat for the subsequent * times. Fresh calls to palAoppa will be needed only when * changes in the precession have grown to unacceptable levels or * when anything affecting the refraction has changed. * History: * 2012-08-24 (TIMJ): * Initial version, ported directly from Fortran SLA. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include "math.h" #include "pal.h" #include "palmac.h" /* These are local SLA implementations to aid in testing. Switch * to native PAL implementations when tests are complete. */ static void pal__Geoc( double p, double h, double *r, double * z ); static void pal__Nutc ( double date, double * dpsi, double *deps, double * eps0 ); static double pal__Eqeqx( double date ); void palAoppa ( double date, double dut, double elongm, double phim, double hm, double xp, double yp, double tdk, double pmb, double rh, double wl, double tlr, double aoprms[14] ) { /* Constants */ const double C = 173.14463331; /* Speed of light (AU per day) */ const double SOLSID = 1.0027379093; /* Ratio between solar and sidereal time */ /* Local variables */ double cphim,xt,yt,zt,xc,yc,zc,elong,phi,uau,vau; /* Observer's location corrected for polar motion */ cphim = cos(phim); xt = cos(elongm)*cphim; yt = sin(elongm)*cphim; zt = sin(phim); xc = xt-xp*zt; yc = yt+yp*zt; zc = xp*xt-yp*yt+zt; if (xc == 0.0 && yc == 0.0) { elong = 0.0; } else { elong = atan2(yc,xc); } phi = atan2(zc,sqrt(xc*xc+yc*yc)); aoprms[0] = phi; aoprms[1] = sin(phi); aoprms[2] = cos(phi); /* magnitude of the diurnal aberration vector */ pal__Geoc(phi,hm,&uau,&vau); aoprms[3] = PAL__D2PI*uau*SOLSID/C; /* copy the refraction parameters and compute the a & b constants */ aoprms[4] = hm; aoprms[5] = tdk; aoprms[6] = pmb; aoprms[7] = rh; aoprms[8] = wl; aoprms[9] = tlr; palRefco(hm,tdk,pmb,rh,wl,phi,tlr,1e-10, &aoprms[10],&aoprms[11]); /* longitude + equation of the equinoxes + sidereal equivalent of DUT * (ignoring change in equation of the equinoxes between UTC and TDB) */ aoprms[12] = elong+pal__Eqeqx(date)+dut*SOLSID*PAL__DS2R; /* sidereal time */ palAoppat(date,aoprms); } /* Private reimplementation of slaEqeqx for testing the algorithm */ #include static void pal__Geoc( double p, double h, double *r, double * z ) { /* earth equatorial radius (metres) */ const double A0=6378140.0; /* reference spheroid flattening factor and useful function */ const double f = 1.0/298.257; double b; /* astronomical unit in metres */ const double AU = 1.49597870e11; double sp,cp,c,s; b = pow( 1.0-f, 2.0 ); /* geodetic to geocentric conversion */ sp = sin(p); cp = cos(p); c = 1.0/sqrt(cp*cp+b*sp*sp); s = b*c; *r = (A0*c+h)*cp/AU; *z = (A0*s+h)*sp/AU; } static double pal__Eqeqx( double date ) { const double T2AS=1296000.0; double pal_eqeqx; double t, om, dpsi, deps, eps0; /* interval between basic epoch j2000.0 and current epoch (jc) */ t=(date-51544.5)/36525.0; /* longitude of the mean ascending node of the lunar orbit on the * ecliptic, measured from the mean equinox of date */ om=PAL__DAS2R*(450160.280+(-5.0*T2AS-482890.539 +(7.455+0.008*t)*t)*t); /* nutation */ pal__Nutc(date,&dpsi,&deps,&eps0); /* equation of the equinoxes */ pal_eqeqx=dpsi*cos(eps0)+PAL__DAS2R*(0.00264*sin(om)+ 0.000063*sin(om+om)); return pal_eqeqx; } #include "palmac.h" static void pal__Nutc ( double date, double * dpsi, double *deps, double * eps0 ) { const double DJC = 36525.0; const double DJM0 = 51544.5; const double TURNAS = 1296000.0; #define NTERMS 194 int j; double t,el,elp,f,d,om,ve,ma,ju,sa,theta,c,s,dp,de; int na[ 194 ][9] = { { 0 , 0 , 0 , 0 , -1 , 0 , 0 , 0 , 0 }, { 0 , 0 , 2 , -2 , 2 , 0 , 0 , 0 , 0 }, { 0 , 0 , 2 , 0 , 2 , 0 , 0 , 0 , 0 }, { 0 , 0 , 0 , 0 , -2 , 0 , 0 , 0 , 0 }, { 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }, { 0 , 1 , 2 , -2 , 2 , 0 , 0 , 0 , 0 }, { 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }, { 0 , 0 , 2 , 0 , 1 , 0 , 0 , 0 , 0 }, { 1 , 0 , 2 , 0 , 2 , 0 , 0 , 0 , 0 }, { 0 , -1 , 2 , -2 , 2 , 0 , 0 , 0 , 0 }, { 0 , 0 , 2 , -2 , 1 , 0 , 0 , 0 , 0 }, { -1 , 0 , 2 , 0 , 2 , 0 , 0 , 0 , 0 }, { -1 , 0 , 0 , 2 , 0 , 0 , 0 , 0 , 0 }, { 1 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 }, { 1 , 0 , 0 , 0 , -1 , 0 , 0 , 0 , 0 }, { -1 , 0 , 2 , 2 , 2 , 0 , 0 , 0 , 0 }, { 1 , 0 , 2 , 0 , 1 , 0 , 0 , 0 , 0 }, { -2 , 0 , 2 , 0 , 1 , 0 , 0 , 0 , 0 }, { 0 , 0 , 0 , 2 , 0 , 0 , 0 , 0 , 0 }, { 0 , 0 , 2 , 2 , 2 , 0 , 0 , 0 , 0 }, { 2 , 0 , 0 , -2 , 0 , 0 , 0 , 0 , 0 }, { 2 , 0 , 2 , 0 , 2 , 0 , 0 , 0 , 0 }, { 1 , 0 , 2 , -2 , 2 , 0 , 0 , 0 , 0 }, { -1 , 0 , 2 , 0 , 1 , 0 , 0 , 0 , 0 }, { 2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }, { 0 , 0 , 2 , 0 , 0 , 0 , 0 , 0 , 0 }, { 0 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 0 }, { -1 , 0 , 0 , 2 , 1 , 0 , 0 , 0 , 0 }, { 0 , 2 , 2 , -2 , 2 , 0 , 0 , 0 , 0 }, { 0 , 0 , 2 , -2 , 0 , 0 , 0 , 0 , 0 }, { -1 , 0 , 0 , 2 , -1 , 0 , 0 , 0 , 0 }, { 0 , 1 , 0 , 0 , -1 , 0 , 0 , 0 , 0 }, { 0 , 2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }, { -1 , 0 , 2 , 2 , 1 , 0 , 0 , 0 , 0 }, { 1 , 0 , 2 , 2 , 2 , 0 , 0 , 0 , 0 }, { 0 , 1 , 2 , 0 , 2 , 0 , 0 , 0 , 0 }, { -2 , 0 , 2 , 0 , 0 , 0 , 0 , 0 , 0 }, { 0 , 0 , 2 , 2 , 1 , 0 , 0 , 0 , 0 }, { 0 , -1 , 2 , 0 , 2 , 0 , 0 , 0 , 0 }, { 0 , 0 , 0 , 2 , 1 , 0 , 0 , 0 , 0 }, { 1 , 0 , 2 , -2 , 1 , 0 , 0 , 0 , 0 }, { 2 , 0 , 0 , -2 , -1 , 0 , 0 , 0 , 0 }, { 2 , 0 , 2 , -2 , 2 , 0 , 0 , 0 , 0 }, { 2 , 0 , 2 , 0 , 1 , 0 , 0 , 0 , 0 }, { 0 , 0 , 0 , 2 , -1 , 0 , 0 , 0 , 0 }, { 0 , -1 , 2 , -2 , 1 , 0 , 0 , 0 , 0 }, { -1 , -1 , 0 , 2 , 0 , 0 , 0 , 0 , 0 }, { 2 , 0 , 0 , -2 , 1 , 0 , 0 , 0 , 0 }, { 1 , 0 , 0 , 2 , 0 , 0 , 0 , 0 , 0 }, { 0 , 1 , 2 , -2 , 1 , 0 , 0 , 0 , 0 }, { 1 , -1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }, { -2 , 0 , 2 , 0 , 2 , 0 , 0 , 0 , 0 }, { 0 , -1 , 0 , 2 , 0 , 0 , 0 , 0 , 0 }, { 3 , 0 , 2 , 0 , 2 , 0 , 0 , 0 , 0 }, { 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 }, { 1 , -1 , 2 , 0 , 2 , 0 , 0 , 0 , 0 }, { 1 , 0 , 0 , -1 , 0 , 0 , 0 , 0 , 0 }, { -1 , -1 , 2 , 2 , 2 , 0 , 0 , 0 , 0 }, { -1 , 0 , 2 , 0 , 0 , 0 , 0 , 0 , 0 }, { 2 , 0 , 0 , 0 , -1 , 0 , 0 , 0 , 0 }, { 0 , -1 , 2 , 2 , 2 , 0 , 0 , 0 , 0 }, { 1 , 1 , 2 , 0 , 2 , 0 , 0 , 0 , 0 }, { 2 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 }, { 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }, { 1 , 0 , -2 , 2 , -1 , 0 , 0 , 0 , 0 }, { 1 , 0 , 2 , 0 , 0 , 0 , 0 , 0 , 0 }, { -1 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 }, { 1 , 0 , 0 , 0 , 2 , 0 , 0 , 0 , 0 }, { -1 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 0 }, { 0 , 0 , 2 , 1 , 2 , 0 , 0 , 0 , 0 }, { -1 , 1 , 0 , 1 , 1 , 0 , 0 , 0 , 0 }, { -1 , 0 , 2 , 4 , 2 , 0 , 0 , 0 , 0 }, { 0 , -2 , 2 , -2 , 1 , 0 , 0 , 0 , 0 }, { 1 , 0 , 2 , 2 , 1 , 0 , 0 , 0 , 0 }, { 1 , 0 , 0 , 0 , -2 , 0 , 0 , 0 , 0 }, { -2 , 0 , 2 , 2 , 2 , 0 , 0 , 0 , 0 }, { 1 , 1 , 2 , -2 , 2 , 0 , 0 , 0 , 0 }, { -2 , 0 , 2 , 4 , 2 , 0 , 0 , 0 , 0 }, { -1 , 0 , 4 , 0 , 2 , 0 , 0 , 0 , 0 }, { 2 , 0 , 2 , -2 , 1 , 0 , 0 , 0 , 0 }, { 1 , 0 , 0 , -1 , -1 , 0 , 0 , 0 , 0 }, { 2 , 0 , 2 , 2 , 2 , 0 , 0 , 0 , 0 }, { 1 , 0 , 0 , 2 , 1 , 0 , 0 , 0 , 0 }, { 3 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }, { 0 , 0 , 2 , -2 , -1 , 0 , 0 , 0 , 0 }, { 3 , 0 , 2 , -2 , 2 , 0 , 0 , 0 , 0 }, { 0 , 0 , 4 , -2 , 2 , 0 , 0 , 0 , 0 }, { -1 , 0 , 0 , 4 , 0 , 0 , 0 , 0 , 0 }, { 0 , 1 , 2 , 0 , 1 , 0 , 0 , 0 , 0 }, { 0 , 0 , 2 , -2 , 3 , 0 , 0 , 0 , 0 }, { -2 , 0 , 0 , 4 , 0 , 0 , 0 , 0 , 0 }, { -1 , -1 , 0 , 2 , 1 , 0 , 0 , 0 , 0 }, { -2 , 0 , 2 , 0 , -1 , 0 , 0 , 0 , 0 }, { 0 , 0 , 2 , 0 , -1 , 0 , 0 , 0 , 0 }, { 0 , -1 , 2 , 0 , 1 , 0 , 0 , 0 , 0 }, { 0 , 1 , 0 , 0 , 2 , 0 , 0 , 0 , 0 }, { 0 , 0 , 2 , -1 , 2 , 0 , 0 , 0 , 0 }, { 2 , 1 , 0 , -2 , 0 , 0 , 0 , 0 , 0 }, { 0 , 0 , 2 , 4 , 2 , 0 , 0 , 0 , 0 }, { -1 , -1 , 0 , 2 , -1 , 0 , 0 , 0 , 0 }, { -1 , 1 , 0 , 2 , 0 , 0 , 0 , 0 , 0 }, { 1 , -1 , 0 , 0 , 1 , 0 , 0 , 0 , 0 }, { 0 , -1 , 2 , -2 , 0 , 0 , 0 , 0 , 0 }, { 0 , 1 , 0 , 0 , -2 , 0 , 0 , 0 , 0 }, { 1 , -1 , 2 , 2 , 2 , 0 , 0 , 0 , 0 }, { 1 , 0 , 0 , 2 , -1 , 0 , 0 , 0 , 0 }, { -1 , 1 , 2 , 2 , 2 , 0 , 0 , 0 , 0 }, { 3 , 0 , 2 , 0 , 1 , 0 , 0 , 0 , 0 }, { 0 , 1 , 2 , 2 , 2 , 0 , 0 , 0 , 0 }, { 1 , 0 , 2 , -2 , 0 , 0 , 0 , 0 , 0 }, { -1 , 0 , -2 , 4 , -1 , 0 , 0 , 0 , 0 }, { -1 , -1 , 2 , 2 , 1 , 0 , 0 , 0 , 0 }, { 0 , -1 , 2 , 2 , 1 , 0 , 0 , 0 , 0 }, { 2 , -1 , 2 , 0 , 2 , 0 , 0 , 0 , 0 }, { 0 , 0 , 0 , 2 , 2 , 0 , 0 , 0 , 0 }, { 1 , -1 , 2 , 0 , 1 , 0 , 0 , 0 , 0 }, { -1 , 1 , 2 , 0 , 2 , 0 , 0 , 0 , 0 }, { 0 , 1 , 0 , 2 , 0 , 0 , 0 , 0 , 0 }, { 0 , 1 , 2 , -2 , 0 , 0 , 0 , 0 , 0 }, { 0 , 3 , 2 , -2 , 2 , 0 , 0 , 0 , 0 }, { 0 , 0 , 0 , 1 , 1 , 0 , 0 , 0 , 0 }, { -1 , 0 , 2 , 2 , 0 , 0 , 0 , 0 , 0 }, { 2 , 1 , 2 , 0 , 2 , 0 , 0 , 0 , 0 }, { 1 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 0 }, { 2 , 0 , 0 , 2 , 0 , 0 , 0 , 0 , 0 }, { 1 , 1 , 2 , 0 , 1 , 0 , 0 , 0 , 0 }, { -1 , 0 , 0 , 2 , 2 , 0 , 0 , 0 , 0 }, { 1 , 0 , -2 , 2 , 0 , 0 , 0 , 0 , 0 }, { 0 , -1 , 0 , 2 , -1 , 0 , 0 , 0 , 0 }, { -1 , 0 , 1 , 0 , 2 , 0 , 0 , 0 , 0 }, { 0 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 }, { 1 , 0 , -2 , 2 , -2 , 0 , 0 , 0 , 0 }, { 0 , 0 , 0 , 1 , -1 , 0 , 0 , 0 , 0 }, { 1 , -1 , 0 , 0 , -1 , 0 , 0 , 0 , 0 }, { 0 , 0 , 0 , 4 , 0 , 0 , 0 , 0 , 0 }, { 1 , -1 , 0 , 2 , 0 , 0 , 0 , 0 , 0 }, { 1 , 0 , 2 , 1 , 2 , 0 , 0 , 0 , 0 }, { 1 , 0 , 2 , -1 , 2 , 0 , 0 , 0 , 0 }, { -1 , 0 , 0 , 2 , -2 , 0 , 0 , 0 , 0 }, { 0 , 0 , 2 , 1 , 1 , 0 , 0 , 0 , 0 }, { -1 , 0 , 2 , 0 , -1 , 0 , 0 , 0 , 0 }, { -1 , 0 , 2 , 4 , 1 , 0 , 0 , 0 , 0 }, { 0 , 0 , 2 , 2 , 0 , 0 , 0 , 0 , 0 }, { 1 , 1 , 2 , -2 , 1 , 0 , 0 , 0 , 0 }, { 0 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 0 }, { -1 , 0 , 2 , -1 , 1 , 0 , 0 , 0 , 0 }, { -2 , 0 , 2 , 2 , 1 , 0 , 0 , 0 , 0 }, { 2 , -1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }, { 4 , 0 , 2 , 0 , 2 , 0 , 0 , 0 , 0 }, { 2 , 1 , 2 , -2 , 2 , 0 , 0 , 0 , 0 }, { 0 , 1 , 2 , 1 , 2 , 0 , 0 , 0 , 0 }, { 1 , 0 , 4 , -2 , 2 , 0 , 0 , 0 , 0 }, { 1 , 1 , 0 , 0 , -1 , 0 , 0 , 0 , 0 }, { -2 , 0 , 2 , 4 , 1 , 0 , 0 , 0 , 0 }, { 2 , 0 , 2 , 0 , 0 , 0 , 0 , 0 , 0 }, { -1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 }, { 1 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 }, { 0 , 1 , 0 , 2 , 1 , 0 , 0 , 0 , 0 }, { -1 , 0 , 4 , 0 , 1 , 0 , 0 , 0 , 0 }, { -1 , 0 , 0 , 4 , 1 , 0 , 0 , 0 , 0 }, { 2 , 0 , 2 , 2 , 1 , 0 , 0 , 0 , 0 }, { 2 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }, { 0 , 0 , 5 , -5 , 5 , -3 , 0 , 0 , 0 }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 2 , 0 }, { 0 , 0 , 1 , -1 , 1 , 0 , 0 , -1 , 0 }, { 0 , 0 , -1 , 1 , -1 , 1 , 0 , 0 , 0 }, { 0 , 0 , -1 , 1 , 0 , 0 , 2 , 0 , 0 }, { 0 , 0 , 3 , -3 , 3 , 0 , 0 , -1 , 0 }, { 0 , 0 , -8 , 8 , -7 , 5 , 0 , 0 , 0 }, { 0 , 0 , -1 , 1 , -1 , 0 , 2 , 0 , 0 }, { 0 , 0 , -2 , 2 , -2 , 2 , 0 , 0 , 0 }, { 0 , 0 , -6 , 6 , -6 , 4 , 0 , 0 , 0 }, { 0 , 0 , -2 , 2 , -2 , 0 , 8 , -3 , 0 }, { 0 , 0 , 6 , -6 , 6 , 0 , -8 , 3 , 0 }, { 0 , 0 , 4 , -4 , 4 , -2 , 0 , 0 , 0 }, { 0 , 0 , -3 , 3 , -3 , 2 , 0 , 0 , 0 }, { 0 , 0 , 4 , -4 , 3 , 0 , -8 , 3 , 0 }, { 0 , 0 , -4 , 4 , -5 , 0 , 8 , -3 , 0 }, { 0 , 0 , 0 , 0 , 0 , 2 , 0 , 0 , 0 }, { 0 , 0 , -4 , 4 , -4 , 3 , 0 , 0 , 0 }, { 0 , 1 , -1 , 1 , -1 , 0 , 0 , 1 , 0 }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 }, { 0 , 0 , 1 , -1 , 1 , 1 , 0 , 0 , 0 }, { 0 , 0 , 2 , -2 , 2 , 0 , -2 , 0 , 0 }, { 0 , -1 , -7 , 7 , -7 , 5 , 0 , 0 , 0 }, { -2 , 0 , 2 , 0 , 2 , 0 , 0 , -2 , 0 }, { -2 , 0 , 2 , 0 , 1 , 0 , 0 , -3 , 0 }, { 0 , 0 , 2 , -2 , 2 , 0 , 0 , -2 , 0 }, { 0 , 0 , 1 , -1 , 1 , 0 , 0 , 1 , 0 }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 2 }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 }, { 2 , 0 , -2 , 0 , -2 , 0 , 0 , 3 , 0 }, { 0 , 0 , 1 , -1 , 1 , 0 , 0 , -2 , 0 }, { 0 , 0 , -7 , 7 , -7 , 5 , 0 , 0 , 0 } }; double psi[ 194 ][4] = { { 3341.5000000000000 , 17206241.800000001 , 3.1000000000000001 , 17409.500000000000 }, { -1716.8000000000000 , -1317185.3000000000 , 1.3999999999999999 , -156.80000000000001 }, { 285.69999999999999 , -227667.00000000000 , 0.29999999999999999 , -23.500000000000000 }, { -68.599999999999994 , -207448.00000000000 , 0.0000000000000000 , -21.399999999999999 }, { 950.29999999999995 , 147607.89999999999 , -2.2999999999999998 , -355.00000000000000 }, { -66.700000000000003 , -51689.099999999999 , 0.20000000000000001 , 122.59999999999999 }, { -108.59999999999999 , 71117.600000000006 , 0.0000000000000000 , 7.0000000000000000 }, { 35.600000000000001 , -38740.199999999997 , 0.10000000000000001 , -36.200000000000003 }, { 85.400000000000006 , -30127.599999999999 , 0.0000000000000000 , -3.1000000000000001 }, { 9.0000000000000000 , 21583.000000000000 , 0.10000000000000001 , -50.299999999999997 }, { 22.100000000000001 , 12822.799999999999 , 0.0000000000000000 , 13.300000000000001 }, { 3.3999999999999999 , 12350.799999999999 , 0.0000000000000000 , 1.3000000000000000 }, { -21.100000000000001 , 15699.400000000000 , 0.0000000000000000 , 1.6000000000000001 }, { 4.2000000000000002 , 6313.8000000000002 , 0.0000000000000000 , 6.2000000000000002 }, { -22.800000000000001 , 5796.8999999999996 , 0.0000000000000000 , 6.0999999999999996 }, { 15.699999999999999 , -5961.1000000000004 , 0.0000000000000000 , -0.59999999999999998 }, { 13.100000000000000 , -5159.1000000000004 , 0.0000000000000000 , -4.5999999999999996 }, { 1.8000000000000000 , 4592.6999999999998 , 0.0000000000000000 , 4.5000000000000000 }, { -17.500000000000000 , 6336.0000000000000 , 0.0000000000000000 , 0.69999999999999996 }, { 16.300000000000001 , -3851.0999999999999 , 0.0000000000000000 , -0.40000000000000002 }, { -2.7999999999999998 , 4771.6999999999998 , 0.0000000000000000 , 0.50000000000000000 }, { 13.800000000000001 , -3099.3000000000002 , 0.0000000000000000 , -0.29999999999999999 }, { 0.20000000000000001 , 2860.3000000000002 , 0.0000000000000000 , 0.29999999999999999 }, { 1.3999999999999999 , 2045.3000000000000 , 0.0000000000000000 , 2.0000000000000000 }, { -8.5999999999999996 , 2922.5999999999999 , 0.0000000000000000 , 0.29999999999999999 }, { -7.7000000000000002 , 2587.9000000000001 , 0.0000000000000000 , 0.20000000000000001 }, { 8.8000000000000007 , -1408.0999999999999 , 0.0000000000000000 , 3.7000000000000002 }, { 1.3999999999999999 , 1517.5000000000000 , 0.0000000000000000 , 1.5000000000000000 }, { -1.8999999999999999 , -1579.7000000000000 , 0.0000000000000000 , 7.7000000000000002 }, { 1.3000000000000000 , -2178.5999999999999 , 0.0000000000000000 , -0.20000000000000001 }, { -4.7999999999999998 , 1286.8000000000000 , 0.0000000000000000 , 1.3000000000000000 }, { 6.2999999999999998 , 1267.2000000000000 , 0.0000000000000000 , -4.0000000000000000 }, { -1.0000000000000000 , 1669.3000000000000 , 0.0000000000000000 , -8.3000000000000007 }, { 2.3999999999999999 , -1020.0000000000000 , 0.0000000000000000 , -0.90000000000000002 }, { 4.5000000000000000 , -766.89999999999998 , 0.0000000000000000 , 0.0000000000000000 }, { -1.1000000000000001 , 756.50000000000000 , 0.0000000000000000 , -1.7000000000000000 }, { -1.3999999999999999 , -1097.3000000000000 , 0.0000000000000000 , -0.50000000000000000 }, { 2.6000000000000001 , -663.00000000000000 , 0.0000000000000000 , -0.59999999999999998 }, { 0.80000000000000004 , -714.10000000000002 , 0.0000000000000000 , 1.6000000000000001 }, { 0.40000000000000002 , -629.89999999999998 , 0.0000000000000000 , -0.59999999999999998 }, { 0.29999999999999999 , 580.39999999999998 , 0.0000000000000000 , 0.59999999999999998 }, { -1.6000000000000001 , 577.29999999999995 , 0.0000000000000000 , 0.50000000000000000 }, { -0.90000000000000002 , 644.39999999999998 , 0.0000000000000000 , 0.0000000000000000 }, { 2.2000000000000002 , -534.00000000000000 , 0.0000000000000000 , -0.50000000000000000 }, { -2.5000000000000000 , 493.30000000000001 , 0.0000000000000000 , 0.50000000000000000 }, { -0.10000000000000001 , -477.30000000000001 , 0.0000000000000000 , -2.3999999999999999 }, { -0.90000000000000002 , 735.00000000000000 , 0.0000000000000000 , -1.7000000000000000 }, { 0.69999999999999996 , 406.19999999999999 , 0.0000000000000000 , 0.40000000000000002 }, { -2.7999999999999998 , 656.89999999999998 , 0.0000000000000000 , 0.0000000000000000 }, { 0.59999999999999998 , 358.00000000000000 , 0.0000000000000000 , 2.0000000000000000 }, { -0.69999999999999996 , 472.50000000000000 , 0.0000000000000000 , -1.1000000000000001 }, { -0.10000000000000001 , -300.50000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -1.2000000000000000 , 435.10000000000002 , 0.0000000000000000 , -1.0000000000000000 }, { 1.8000000000000000 , -289.39999999999998 , 0.0000000000000000 , 0.0000000000000000 }, { 0.59999999999999998 , -422.60000000000002 , 0.0000000000000000 , 0.0000000000000000 }, { 0.80000000000000004 , -287.60000000000002 , 0.0000000000000000 , 0.59999999999999998 }, { -38.600000000000001 , -392.30000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 0.69999999999999996 , -281.80000000000001 , 0.0000000000000000 , 0.59999999999999998 }, { 0.59999999999999998 , -405.69999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { -1.2000000000000000 , 229.00000000000000 , 0.0000000000000000 , 0.20000000000000001 }, { 1.1000000000000001 , -264.30000000000001 , 0.0000000000000000 , 0.50000000000000000 }, { -0.69999999999999996 , 247.90000000000001 , 0.0000000000000000 , -0.50000000000000000 }, { -0.20000000000000001 , 218.00000000000000 , 0.0000000000000000 , 0.20000000000000001 }, { 0.59999999999999998 , -339.00000000000000 , 0.0000000000000000 , 0.80000000000000004 }, { -0.69999999999999996 , 198.69999999999999 , 0.0000000000000000 , 0.20000000000000001 }, { -1.5000000000000000 , 334.00000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 0.10000000000000001 , 334.00000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -0.10000000000000001 , -198.09999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { -106.59999999999999 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -0.50000000000000000 , 165.80000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 0.0000000000000000 , 134.80000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 0.90000000000000002 , -151.59999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { 0.0000000000000000 , -129.69999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { 0.80000000000000004 , -132.80000000000001 , 0.0000000000000000 , -0.10000000000000001 }, { 0.50000000000000000 , -140.69999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { -0.10000000000000001 , 138.40000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 0.0000000000000000 , 129.00000000000000 , 0.0000000000000000 , -0.29999999999999999 }, { 0.50000000000000000 , -121.20000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -0.29999999999999999 , 114.50000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -0.10000000000000001 , 101.80000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -3.6000000000000001 , -101.90000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 0.80000000000000004 , -109.40000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 0.20000000000000001 , -97.000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -0.69999999999999996 , 157.30000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 0.20000000000000001 , -83.299999999999997 , 0.0000000000000000 , 0.0000000000000000 }, { -0.29999999999999999 , 93.299999999999997 , 0.0000000000000000 , 0.0000000000000000 }, { -0.10000000000000001 , 92.099999999999994 , 0.0000000000000000 , 0.0000000000000000 }, { -0.50000000000000000 , 133.59999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { -0.10000000000000001 , 81.500000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 0.0000000000000000 , 123.90000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -0.29999999999999999 , 128.09999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { 0.10000000000000001 , 74.099999999999994 , 0.0000000000000000 , -0.29999999999999999 }, { -0.20000000000000001 , -70.299999999999997 , 0.0000000000000000 , 0.0000000000000000 }, { -0.40000000000000002 , 66.599999999999994 , 0.0000000000000000 , 0.0000000000000000 }, { 0.10000000000000001 , -66.700000000000003 , 0.0000000000000000 , 0.0000000000000000 }, { -0.69999999999999996 , 69.299999999999997 , 0.0000000000000000 , -0.29999999999999999 }, { 0.0000000000000000 , -70.400000000000006 , 0.0000000000000000 , 0.0000000000000000 }, { -0.10000000000000001 , 101.50000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 0.50000000000000000 , -69.099999999999994 , 0.0000000000000000 , 0.0000000000000000 }, { -0.20000000000000001 , 58.500000000000000 , 0.0000000000000000 , 0.20000000000000001 }, { 0.10000000000000001 , -94.900000000000006 , 0.0000000000000000 , 0.20000000000000001 }, { 0.0000000000000000 , 52.899999999999999 , 0.0000000000000000 , -0.20000000000000001 }, { 0.10000000000000001 , 86.700000000000003 , 0.0000000000000000 , -0.20000000000000001 }, { -0.10000000000000001 , -59.200000000000003 , 0.0000000000000000 , 0.20000000000000001 }, { 0.29999999999999999 , -58.799999999999997 , 0.0000000000000000 , 0.10000000000000001 }, { -0.29999999999999999 , 49.000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -0.20000000000000001 , 56.899999999999999 , 0.0000000000000000 , -0.10000000000000001 }, { 0.29999999999999999 , -50.200000000000003 , 0.0000000000000000 , 0.0000000000000000 }, { -0.20000000000000001 , 53.399999999999999 , 0.0000000000000000 , -0.10000000000000001 }, { 0.10000000000000001 , -76.500000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -0.20000000000000001 , 45.299999999999997 , 0.0000000000000000 , 0.0000000000000000 }, { 0.10000000000000001 , -46.799999999999997 , 0.0000000000000000 , 0.0000000000000000 }, { 0.20000000000000001 , -44.600000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 0.20000000000000001 , -48.700000000000003 , 0.0000000000000000 , 0.0000000000000000 }, { 0.10000000000000001 , -46.799999999999997 , 0.0000000000000000 , 0.0000000000000000 }, { 0.10000000000000001 , -42.000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 0.0000000000000000 , 46.399999999999999 , 0.0000000000000000 , -0.10000000000000001 }, { 0.20000000000000001 , -67.299999999999997 , 0.0000000000000000 , 0.10000000000000001 }, { 0.0000000000000000 , -65.799999999999997 , 0.0000000000000000 , 0.20000000000000001 }, { -0.10000000000000001 , -43.899999999999999 , 0.0000000000000000 , 0.29999999999999999 }, { 0.0000000000000000 , -38.899999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { -0.29999999999999999 , 63.899999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { -0.20000000000000001 , 41.200000000000003 , 0.0000000000000000 , 0.0000000000000000 }, { 0.0000000000000000 , -36.100000000000001 , 0.0000000000000000 , 0.20000000000000001 }, { -0.29999999999999999 , 58.500000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -0.10000000000000001 , 36.100000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 0.0000000000000000 , -39.700000000000003 , 0.0000000000000000 , 0.0000000000000000 }, { 0.10000000000000001 , -57.700000000000003 , 0.0000000000000000 , 0.0000000000000000 }, { -0.20000000000000001 , 33.399999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { 36.399999999999999 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -0.10000000000000001 , 55.700000000000003 , 0.0000000000000000 , -0.10000000000000001 }, { 0.10000000000000001 , -35.399999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { 0.10000000000000001 , -31.000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -0.10000000000000001 , 30.100000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -0.29999999999999999 , 49.200000000000003 , 0.0000000000000000 , 0.0000000000000000 }, { -0.20000000000000001 , 49.100000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -0.10000000000000001 , 33.600000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 0.10000000000000001 , -33.500000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 0.10000000000000001 , -31.000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -0.10000000000000001 , 28.000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 0.10000000000000001 , -25.199999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { 0.10000000000000001 , -26.199999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { -0.20000000000000001 , 41.500000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 0.0000000000000000 , 24.500000000000000 , 0.0000000000000000 , 0.10000000000000001 }, { -16.199999999999999 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 0.0000000000000000 , -22.300000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 0.0000000000000000 , 23.100000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -0.10000000000000001 , 37.500000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 0.20000000000000001 , -25.699999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { 0.0000000000000000 , 25.199999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { 0.10000000000000001 , -24.500000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -0.10000000000000001 , 24.300000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 0.10000000000000001 , -20.699999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { 0.10000000000000001 , -20.800000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -0.20000000000000001 , 33.399999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { 32.899999999999999 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 0.10000000000000001 , -32.600000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 0.0000000000000000 , 19.899999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { -0.10000000000000001 , 19.600000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 0.0000000000000000 , -18.699999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { 0.10000000000000001 , -19.000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 0.10000000000000001 , -28.600000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 4.0000000000000000 , 178.80000000000001 , -11.800000000000001 , 0.29999999999999999 }, { 39.799999999999997 , -107.30000000000000 , -5.5999999999999996 , -1.0000000000000000 }, { 9.9000000000000004 , 164.00000000000000 , -4.0999999999999996 , 0.10000000000000001 }, { -4.7999999999999998 , -135.30000000000001 , -3.3999999999999999 , -0.10000000000000001 }, { 50.500000000000000 , 75.000000000000000 , 1.3999999999999999 , -1.2000000000000000 }, { -1.1000000000000001 , -53.500000000000000 , 1.3000000000000000 , 0.0000000000000000 }, { -45.000000000000000 , -2.3999999999999999 , -0.40000000000000002 , 6.5999999999999996 }, { -11.500000000000000 , -61.000000000000000 , -0.90000000000000002 , 0.40000000000000002 }, { 4.4000000000000004 , -68.400000000000006 , -3.3999999999999999 , 0.0000000000000000 }, { 7.7000000000000002 , -47.100000000000001 , -4.7000000000000002 , -1.0000000000000000 }, { -42.899999999999999 , -12.600000000000000 , -1.2000000000000000 , 4.2000000000000002 }, { -42.799999999999997 , 12.699999999999999 , -1.2000000000000000 , -4.2000000000000002 }, { -7.5999999999999996 , -44.100000000000001 , 2.1000000000000001 , -0.50000000000000000 }, { -64.099999999999994 , 1.7000000000000000 , 0.20000000000000001 , 4.5000000000000000 }, { 36.399999999999999 , -10.400000000000000 , 1.0000000000000000 , 3.5000000000000000 }, { 35.600000000000001 , 10.199999999999999 , 1.0000000000000000 , -3.5000000000000000 }, { -1.7000000000000000 , 39.500000000000000 , 2.0000000000000000 , 0.0000000000000000 }, { 50.899999999999999 , -8.1999999999999993 , -0.80000000000000004 , -5.0000000000000000 }, { 0.0000000000000000 , 52.299999999999997 , 1.2000000000000000 , 0.0000000000000000 }, { -42.899999999999999 , -17.800000000000001 , 0.40000000000000002 , 0.0000000000000000 }, { 2.6000000000000001 , 34.299999999999997 , 0.80000000000000004 , 0.0000000000000000 }, { -0.80000000000000004 , -48.600000000000001 , 2.3999999999999999 , -0.10000000000000001 }, { -4.9000000000000004 , 30.500000000000000 , 3.7000000000000002 , 0.69999999999999996 }, { 0.0000000000000000 , -43.600000000000001 , 2.1000000000000001 , 0.0000000000000000 }, { 0.0000000000000000 , -25.399999999999999 , 1.2000000000000000 , 0.0000000000000000 }, { 2.0000000000000000 , 40.899999999999999 , -2.0000000000000000 , 0.0000000000000000 }, { -2.1000000000000001 , 26.100000000000001 , 0.59999999999999998 , 0.0000000000000000 }, { 22.600000000000001 , -3.2000000000000002 , -0.50000000000000000 , -0.50000000000000000 }, { -7.5999999999999996 , 24.899999999999999 , -0.40000000000000002 , -0.20000000000000001 }, { -6.2000000000000002 , 34.899999999999999 , 1.7000000000000000 , 0.29999999999999999 }, { 2.0000000000000000 , 17.399999999999999 , -0.40000000000000002 , 0.10000000000000001 }, { -3.8999999999999999 , 20.500000000000000 , 2.3999999999999999 , 0.59999999999999998 } }; double eps[ 194 ][4] = { { 9205365.8000000007 , -1506.2000000000000 , 885.70000000000005 , -0.20000000000000001 }, { 573095.90000000002 , -570.20000000000005 , -305.00000000000000 , -0.29999999999999999 }, { 97845.500000000000 , 147.80000000000001 , -48.799999999999997 , -0.20000000000000001 }, { -89753.600000000006 , 28.000000000000000 , 46.899999999999999 , 0.0000000000000000 }, { 7406.6999999999998 , -327.10000000000002 , -18.199999999999999 , 0.80000000000000004 }, { 22442.299999999999 , -22.300000000000001 , -67.599999999999994 , 0.0000000000000000 }, { -683.60000000000002 , 46.799999999999997 , 0.0000000000000000 , 0.0000000000000000 }, { 20070.700000000001 , 36.000000000000000 , 1.6000000000000001 , 0.0000000000000000 }, { 12893.799999999999 , 39.500000000000000 , -6.2000000000000002 , 0.0000000000000000 }, { -9593.2000000000007 , 14.400000000000000 , 30.199999999999999 , -0.10000000000000001 }, { -6899.5000000000000 , 4.7999999999999998 , -0.59999999999999998 , 0.0000000000000000 }, { -5332.5000000000000 , -0.10000000000000001 , 2.7000000000000002 , 0.0000000000000000 }, { -125.20000000000000 , 10.500000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -3323.4000000000001 , -0.90000000000000002 , -0.29999999999999999 , 0.0000000000000000 }, { 3142.3000000000002 , 8.9000000000000004 , 0.29999999999999999 , 0.0000000000000000 }, { 2552.5000000000000 , 7.2999999999999998 , -1.2000000000000000 , 0.0000000000000000 }, { 2634.4000000000001 , 8.8000000000000007 , 0.20000000000000001 , 0.0000000000000000 }, { -2424.4000000000001 , 1.6000000000000001 , -0.40000000000000002 , 0.0000000000000000 }, { -123.30000000000000 , 3.8999999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { 1642.4000000000001 , 7.2999999999999998 , -0.80000000000000004 , 0.0000000000000000 }, { 47.899999999999999 , 3.2000000000000002 , 0.0000000000000000 , 0.0000000000000000 }, { 1321.2000000000000 , 6.2000000000000002 , -0.59999999999999998 , 0.0000000000000000 }, { -1234.0999999999999 , -0.29999999999999999 , 0.59999999999999998 , 0.0000000000000000 }, { -1076.5000000000000 , -0.29999999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { -61.600000000000001 , 1.8000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -55.399999999999999 , 1.6000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 856.89999999999998 , -4.9000000000000004 , -2.1000000000000001 , 0.0000000000000000 }, { -800.70000000000005 , -0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 685.10000000000002 , -0.59999999999999998 , -3.7999999999999998 , 0.0000000000000000 }, { -16.899999999999999 , -1.5000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 695.70000000000005 , 1.8000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 642.20000000000005 , -2.6000000000000001 , -1.6000000000000001 , 0.0000000000000000 }, { 13.300000000000001 , 1.1000000000000001 , -0.10000000000000001 , 0.0000000000000000 }, { 521.89999999999998 , 1.6000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 325.80000000000001 , 2.0000000000000000 , -0.10000000000000001 , 0.0000000000000000 }, { -325.10000000000002 , -0.50000000000000000 , 0.90000000000000002 , 0.0000000000000000 }, { 10.100000000000000 , 0.29999999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { 334.50000000000000 , 1.6000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 307.10000000000002 , 0.40000000000000002 , -0.90000000000000002 , 0.0000000000000000 }, { 327.19999999999999 , 0.50000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -304.60000000000002 , -0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 304.00000000000000 , 0.59999999999999998 , 0.0000000000000000 , 0.0000000000000000 }, { -276.80000000000001 , -0.50000000000000000 , 0.10000000000000001 , 0.0000000000000000 }, { 268.89999999999998 , 1.3000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 271.80000000000001 , 1.1000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 271.50000000000000 , -0.40000000000000002 , -0.80000000000000004 , 0.0000000000000000 }, { -5.2000000000000002 , 0.50000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -220.50000000000000 , 0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -20.100000000000001 , 0.29999999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { -191.00000000000000 , 0.10000000000000001 , 0.50000000000000000 , 0.0000000000000000 }, { -4.0999999999999996 , 0.29999999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { 130.59999999999999 , -0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 3.0000000000000000 , 0.29999999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { 122.90000000000001 , 0.80000000000000004 , 0.0000000000000000 , 0.0000000000000000 }, { 3.7000000000000002 , -0.29999999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { 123.09999999999999 , 0.40000000000000002 , -0.29999999999999999 , 0.0000000000000000 }, { -52.700000000000003 , 15.300000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 120.70000000000000 , 0.29999999999999999 , -0.29999999999999999 , 0.0000000000000000 }, { 4.0000000000000000 , -0.29999999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { 126.50000000000000 , 0.50000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 112.70000000000000 , 0.50000000000000000 , -0.29999999999999999 , 0.0000000000000000 }, { -106.09999999999999 , -0.29999999999999999 , 0.29999999999999999 , 0.0000000000000000 }, { -112.90000000000001 , -0.20000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 3.6000000000000001 , -0.20000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 107.40000000000001 , 0.29999999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { -10.900000000000000 , 0.20000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -0.90000000000000002 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 85.400000000000006 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 0.0000000000000000 , -88.799999999999997 , 0.0000000000000000 , 0.0000000000000000 }, { -71.000000000000000 , -0.20000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -70.299999999999997 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 64.500000000000000 , 0.40000000000000002 , 0.0000000000000000 , 0.0000000000000000 }, { 69.799999999999997 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 66.099999999999994 , 0.40000000000000002 , 0.0000000000000000 , 0.0000000000000000 }, { -61.000000000000000 , -0.20000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -59.500000000000000 , -0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -55.600000000000001 , 0.0000000000000000 , 0.20000000000000001 , 0.0000000000000000 }, { 51.700000000000003 , 0.20000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -49.000000000000000 , -0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -52.700000000000003 , -0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -49.600000000000001 , 1.3999999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { 46.299999999999997 , 0.40000000000000002 , 0.0000000000000000 , 0.0000000000000000 }, { 49.600000000000001 , 0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -5.0999999999999996 , 0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -44.000000000000000 , -0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -39.899999999999999 , -0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -39.500000000000000 , -0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -3.8999999999999999 , 0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -42.100000000000001 , -0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -17.199999999999999 , 0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -2.2999999999999998 , 0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -39.200000000000003 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -38.399999999999999 , 0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 36.799999999999997 , 0.20000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 34.600000000000001 , 0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -32.700000000000003 , 0.29999999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { 30.399999999999999 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 0.40000000000000002 , 0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 29.300000000000001 , 0.20000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 31.600000000000001 , 0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 0.80000000000000004 , -0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -27.899999999999999 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 2.8999999999999999 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -25.300000000000001 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 25.000000000000000 , 0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 27.500000000000000 , 0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -24.399999999999999 , -0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 24.899999999999999 , 0.20000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -22.800000000000001 , -0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 0.90000000000000002 , -0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 24.399999999999999 , 0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 23.899999999999999 , 0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 22.500000000000000 , 0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 20.800000000000001 , 0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 20.100000000000001 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 21.500000000000000 , 0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -20.000000000000000 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 1.3999999999999999 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -0.20000000000000001 , -0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 19.000000000000000 , 0.0000000000000000 , -0.10000000000000001 , 0.0000000000000000 }, { 20.500000000000000 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -2.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -17.600000000000001 , -0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 19.000000000000000 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -2.3999999999999999 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -18.399999999999999 , -0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 17.100000000000001 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 0.40000000000000002 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 18.399999999999999 , 0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 0.0000000000000000 , 17.399999999999999 , 0.0000000000000000 , 0.0000000000000000 }, { -0.59999999999999998 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -15.400000000000000 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -16.800000000000001 , -0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 16.300000000000001 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -2.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -1.5000000000000000 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -14.300000000000001 , -0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 14.400000000000000 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -13.400000000000000 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -14.300000000000001 , -0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -13.699999999999999 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 13.100000000000000 , 0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -1.7000000000000000 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -12.800000000000001 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 0.0000000000000000 , -14.400000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 12.400000000000000 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -12.000000000000000 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -0.80000000000000004 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 10.900000000000000 , 0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -10.800000000000001 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 10.500000000000000 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -10.400000000000000 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -11.199999999999999 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 10.500000000000000 , 0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { -1.3999999999999999 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 0.0000000000000000 , 0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 0.69999999999999996 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -10.300000000000001 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -10.000000000000000 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 9.5999999999999996 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 9.4000000000000004 , 0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 }, { 0.59999999999999998 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -87.700000000000003 , 4.4000000000000004 , -0.40000000000000002 , -6.2999999999999998 }, { 46.299999999999997 , 22.399999999999999 , 0.50000000000000000 , -2.3999999999999999 }, { 15.600000000000000 , -3.3999999999999999 , 0.10000000000000001 , 0.40000000000000002 }, { 5.2000000000000002 , 5.7999999999999998 , 0.20000000000000001 , -0.10000000000000001 }, { -30.100000000000001 , 26.899999999999999 , 0.69999999999999996 , 0.0000000000000000 }, { 23.199999999999999 , -0.50000000000000000 , 0.0000000000000000 , 0.59999999999999998 }, { 1.0000000000000000 , 23.199999999999999 , 3.3999999999999999 , 0.0000000000000000 }, { -12.199999999999999 , -4.2999999999999998 , 0.0000000000000000 , 0.0000000000000000 }, { -2.1000000000000001 , -3.7000000000000002 , -0.20000000000000001 , 0.10000000000000001 }, { -18.600000000000001 , -3.7999999999999998 , -0.40000000000000002 , 1.8000000000000000 }, { 5.5000000000000000 , -18.699999999999999 , -1.8000000000000000 , -0.50000000000000000 }, { -5.5000000000000000 , -18.699999999999999 , 1.8000000000000000 , -0.50000000000000000 }, { 18.399999999999999 , -3.6000000000000001 , 0.29999999999999999 , 0.90000000000000002 }, { -0.59999999999999998 , 1.3000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -5.5999999999999996 , -19.500000000000000 , 1.8999999999999999 , 0.0000000000000000 }, { 5.5000000000000000 , -19.100000000000001 , -1.8999999999999999 , 0.0000000000000000 }, { -17.300000000000001 , -0.80000000000000004 , 0.0000000000000000 , 0.90000000000000002 }, { -3.2000000000000002 , -8.3000000000000007 , -0.80000000000000004 , 0.29999999999999999 }, { -0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -5.4000000000000004 , 7.7999999999999998 , -0.29999999999999999 , 0.0000000000000000 }, { -14.800000000000001 , 1.3999999999999999 , 0.0000000000000000 , 0.29999999999999999 }, { -3.7999999999999998 , 0.40000000000000002 , 0.0000000000000000 , -0.20000000000000001 }, { 12.600000000000000 , 3.2000000000000002 , 0.50000000000000000 , -1.5000000000000000 }, { 0.10000000000000001 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -13.600000000000000 , 2.3999999999999999 , -0.10000000000000001 , 0.0000000000000000 }, { 0.90000000000000002 , 1.2000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { -11.900000000000000 , -0.50000000000000000 , 0.0000000000000000 , 0.29999999999999999 }, { 0.40000000000000002 , 12.000000000000000 , 0.29999999999999999 , -0.20000000000000001 }, { 8.3000000000000007 , 6.0999999999999996 , -0.10000000000000001 , 0.10000000000000001 }, { 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 , 0.0000000000000000 }, { 0.40000000000000002 , -10.800000000000001 , 0.29999999999999999 , 0.0000000000000000 }, { 9.5999999999999996 , 2.2000000000000002 , 0.29999999999999999 , -1.2000000000000000 } }; /* interval between fundamental epoch j2000.0 and given epoch (jc). */ t = (date-DJM0)/DJC; /* mean anomaly of the moon. */ el = 134.96340251*PAL__DD2R+ fmod(t*(1717915923.2178+ t*( 31.8792+ t*( 0.051635+ t*( - 0.00024470)))),TURNAS)*PAL__DAS2R; /* mean anomaly of the sun. */ elp = 357.52910918*PAL__DD2R+ fmod(t*( 129596581.0481+ t*( - 0.5532+ t*( 0.000136+ t*( - 0.00001149)))),TURNAS)*PAL__DAS2R; /* mean argument of the latitude of the moon. */ f = 93.27209062*PAL__DD2R+ fmod(t*(1739527262.8478+ t*( - 12.7512+ t*( - 0.001037+ t*( 0.00000417)))),TURNAS)*PAL__DAS2R; /* mean elongation of the moon from the sun. */ d = 297.85019547*PAL__DD2R+ fmod(t*(1602961601.2090+ t*( - 6.3706+ t*( 0.006539+ t*( - 0.00003169)))),TURNAS)*PAL__DAS2R; /* mean longitude of the ascending node of the moon. */ om = 125.04455501*PAL__DD2R+ fmod(t*( - 6962890.5431+ t*( 7.4722+ t*( 0.007702+ t*( - 0.00005939)))),TURNAS)*PAL__DAS2R; /* mean longitude of venus. */ ve = 181.97980085*PAL__DD2R+fmod(210664136.433548*t,TURNAS)*PAL__DAS2R; /* mean longitude of mars.*/ ma = 355.43299958*PAL__DD2R+fmod( 68905077.493988*t,TURNAS)*PAL__DAS2R; /* mean longitude of jupiter. */ ju = 34.35151874*PAL__DD2R+fmod( 10925660.377991*t,TURNAS)*PAL__DAS2R; /* mean longitude of saturn. */ sa = 50.07744430*PAL__DD2R+fmod( 4399609.855732*t,TURNAS)*PAL__DAS2R; /* geodesic nutation (fukushima 1991) in microarcsec. */ dp = -153.1*sin(elp)-1.9*sin(2*elp); de = 0.0; /* shirai & fukushima (2001) nutation series. */ for (j=NTERMS-1; j >= 0; j--) { theta = ((double)na[j][0])*el+ ((double)na[j][1])*elp+ ((double)na[j][2])*f+ ((double)na[j][3])*d+ ((double)na[j][4])*om+ ((double)na[j][5])*ve+ ((double)na[j][6])*ma+ ((double)na[j][7])*ju+ ((double)na[j][8])*sa; c = cos(theta); s = sin(theta); dp += (psi[j][0] + psi[j][2]*t)*c + (psi[j][1] + psi[j][3]*t)*s; de += (eps[j][0] + eps[j][2]*t)*c + (eps[j][1] + eps[j][3]*t)*s; } /* change of units, and addition of the precession correction.*/ *dpsi = (dp*1e-6-0.042888-0.29856*t)*PAL__DAS2R; *deps = (de*1e-6-0.005171-0.02408*t)*PAL__DAS2R; /* mean obliquity of date (simon et al. 1994). */ *eps0 = (84381.412+ (-46.80927+ (-0.000152+ (0.0019989+ (-0.00000051+ (-0.000000025)*t)*t)*t)*t)*t)*PAL__DAS2R; } pal-0.9.7/palAoppat.c000066400000000000000000000060371302604645500144030ustar00rootroot00000000000000/* *+ * Name: * palAoppat * Purpose: * Recompute sidereal time to support apparent to observed place * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palAoppat( double date, double aoprms[14] ); * Arguments: * date = double (Given) * UTC date/time (modified Julian Date, JD-2400000.5) * (see palAoppa description for comments on leap seconds) * aoprms = double[14] (Given & Returned) * Star-independent apparent-to-observed parameters. Updated * by this routine. Requires element 12 to be the longitude + * eqn of equinoxes + sidereal DUT and fills in element 13 * with the local apparent sidereal time (in radians). * Description: * This routine recomputes the sidereal time in the apparent to * observed place star-independent parameter block. * Authors: * TIMJ: Tim Jenness (JAC, Hawaii) * PTW: Patrick T. Wallace * {enter_new_authors_here} * Notes: * - See palAoppa for more information. * - The star-independent parameters are not treated as an opaque * struct in order to retain compatibility with SLA. * History: * 2012-08-24 (TIMJ): * Initial version, ported from Fortran SLA source. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1995 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" static double pal__Gmst( double ut1 ); void palAoppat( double date, double aoprms[14] ) { aoprms[13] = pal__Gmst(date) + aoprms[12]; } /* Use a private implementation of palGmst for testing that matches the SLA rather than SOFA/ERFA implementation. This is used for comparing SLA with PAL refraction code. */ #include "math.h" #include "palmac.h" static double pal__Gmst( double ut1 ) { double tu; double gmst; /* Julian centuries from fundamental epoch J2000 to this UT */ tu=(ut1-51544.5)/36525; /* GMST at this UT */ gmst=palDranrm(fmod(ut1,1.0)*PAL__D2PI+ (24110.54841+ (8640184.812866+ (0.093104-6.2e-6*tu)*tu)*tu)*PAL__DS2R); return gmst; } pal-0.9.7/palAopqk.c000066400000000000000000000240361302604645500142310ustar00rootroot00000000000000/* *+ * Name: * palAopqk * Purpose: * Quick apparent to observed place * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palAopqk ( double rap, double dap, const double aoprms[14], * double *aob, double *zob, double *hob, * double *dob, double *rob ); * Arguments: * rap = double (Given) * Geocentric apparent right ascension * dap = double (Given) * Geocentric apparent declination * aoprms = const double [14] (Given) * Star-independent apparent-to-observed parameters. * * [0] geodetic latitude (radians) * [1,2] sine and cosine of geodetic latitude * [3] magnitude of diurnal aberration vector * [4] height (HM) * [5] ambient temperature (T) * [6] pressure (P) * [7] relative humidity (RH) * [8] wavelength (WL) * [9] lapse rate (TLR) * [10,11] refraction constants A and B (radians) * [12] longitude + eqn of equinoxes + sidereal DUT (radians) * [13] local apparent sidereal time (radians) * aob = double * (Returned) * Observed azimuth (radians: N=0,E=90) * zob = double * (Returned) * Observed zenith distance (radians) * hob = double * (Returned) * Observed Hour Angle (radians) * dob = double * (Returned) * Observed Declination (radians) * rob = double * (Returned) * Observed Right Ascension (radians) * Description: * Quick apparent to observed place. * Authors: * TIMJ: Tim Jenness (JAC, Hawaii) * PTW: Patrick T. Wallace * {enter_new_authors_here} * Notes: * - This routine returns zenith distance rather than elevation * in order to reflect the fact that no allowance is made for * depression of the horizon. * * - The accuracy of the result is limited by the corrections for * refraction. Providing the meteorological parameters are * known accurately and there are no gross local effects, the * observed RA,Dec predicted by this routine should be within * about 0.1 arcsec for a zenith distance of less than 70 degrees. * Even at a topocentric zenith distance of 90 degrees, the * accuracy in elevation should be better than 1 arcmin; useful * results are available for a further 3 degrees, beyond which * the palRefro routine returns a fixed value of the refraction. * The complementary routines palAop (or palAopqk) and palOap * (or palOapqk) are self-consistent to better than 1 micro- * arcsecond all over the celestial sphere. * * - It is advisable to take great care with units, as even * unlikely values of the input parameters are accepted and * processed in accordance with the models used. * * - "Apparent" place means the geocentric apparent right ascension * and declination, which is obtained from a catalogue mean place * by allowing for space motion, parallax, precession, nutation, * annual aberration, and the Sun's gravitational lens effect. For * star positions in the FK5 system (i.e. J2000), these effects can * be applied by means of the palMap etc routines. Starting from * other mean place systems, additional transformations will be * needed; for example, FK4 (i.e. B1950) mean places would first * have to be converted to FK5, which can be done with the * palFk425 etc routines. * * - "Observed" Az,El means the position that would be seen by a * perfect theodolite located at the observer. This is obtained * from the geocentric apparent RA,Dec by allowing for Earth * orientation and diurnal aberration, rotating from equator * to horizon coordinates, and then adjusting for refraction. * The HA,Dec is obtained by rotating back into equatorial * coordinates, using the geodetic latitude corrected for polar * motion, and is the position that would be seen by a perfect * equatorial located at the observer and with its polar axis * aligned to the Earth's axis of rotation (n.b. not to the * refracted pole). Finally, the RA is obtained by subtracting * the HA from the local apparent ST. * * - To predict the required setting of a real telescope, the * observed place produced by this routine would have to be * adjusted for the tilt of the azimuth or polar axis of the * mounting (with appropriate corrections for mount flexures), * for non-perpendicularity between the mounting axes, for the * position of the rotator axis and the pointing axis relative * to it, for tube flexure, for gear and encoder errors, and * finally for encoder zero points. Some telescopes would, of * course, exhibit other properties which would need to be * accounted for at the appropriate point in the sequence. * * - The star-independent apparent-to-observed-place parameters * in AOPRMS may be computed by means of the palAoppa routine. * If nothing has changed significantly except the time, the * palAoppat routine may be used to perform the requisite * partial recomputation of AOPRMS. * * - At zenith distances beyond about 76 degrees, the need for * special care with the corrections for refraction causes a * marked increase in execution time. Moreover, the effect * gets worse with increasing zenith distance. Adroit * programming in the calling application may allow the * problem to be reduced. Prepare an alternative AOPRMS array, * computed for zero air-pressure; this will disable the * refraction corrections and cause rapid execution. Using * this AOPRMS array, a preliminary call to the present routine * will, depending on the application, produce a rough position * which may be enough to establish whether the full, slow * calculation (using the real AOPRMS array) is worthwhile. * For example, there would be no need for the full calculation * if the preliminary call had already established that the * source was well below the elevation limits for a particular * telescope. * * - The azimuths etc produced by the present routine are with * respect to the celestial pole. Corrections to the terrestrial * pole can be computed using palPolmo. * History: * 2012-08-25 (TIMJ): * Initial version, copied from Fortran SLA * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2003 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include #include "pal.h" void palAopqk ( double rap, double dap, const double aoprms[14], double *aob, double *zob, double *hob, double *dob, double *rob ) { /* Breakpoint for fast/slow refraction algorithm: * ZD greater than arctan(4), (see palRefco routine) * or vector Z less than cosine(arctan(Z)) = 1/sqrt(17) */ const double zbreak = 0.242535625; int i; double sphi,cphi,st,v[3],xhd,yhd,zhd,diurab,f, xhdt,yhdt,zhdt,xaet,yaet,zaet,azobs, zdt,refa,refb,zdobs,dzd,dref,ce, xaeo,yaeo,zaeo,hmobs,dcobs,raobs; /* sin, cos of latitude */ sphi = aoprms[1]; cphi = aoprms[2]; /* local apparent sidereal time */ st = aoprms[13]; /* apparent ra,dec to cartesian -ha,dec */ palDcs2c( rap-st, dap, v ); xhd = v[0]; yhd = v[1]; zhd = v[2]; /* diurnal aberration */ diurab = aoprms[3]; f = (1.0-diurab*yhd); xhdt = f*xhd; yhdt = f*(yhd+diurab); zhdt = f*zhd; /* cartesian -ha,dec to cartesian az,el (s=0,e=90) */ xaet = sphi*xhdt-cphi*zhdt; yaet = yhdt; zaet = cphi*xhdt+sphi*zhdt; /* azimuth (n=0,e=90) */ if (xaet == 0.0 && yaet == 0.0) { azobs = 0.0; } else { azobs = atan2(yaet,-xaet); } /* topocentric zenith distance */ zdt = atan2(sqrt(xaet*xaet+yaet*yaet),zaet); /* * refraction * ---------- */ /* fast algorithm using two constant model */ refa = aoprms[10]; refb = aoprms[11]; palRefz(zdt,refa,refb,&zdobs); /* large zenith distance? */ if (cos(zdobs) < zbreak) { /* yes: use rigorous algorithm */ /* initialize loop (maximum of 10 iterations) */ i = 1; dzd = 1.0e1; while (fabs(dzd) > 1e-10 && i <= 10) { /* compute refraction using current estimate of observed zd */ palRefro(zdobs,aoprms[4],aoprms[5],aoprms[6], aoprms[7],aoprms[8],aoprms[0], aoprms[9],1e-8,&dref); /* remaining discrepancy */ dzd = zdobs+dref-zdt; /* update the estimate */ zdobs = zdobs-dzd; /* increment the iteration counter */ i++; } } /* to cartesian az/zd */ ce = sin(zdobs); xaeo = -cos(azobs)*ce; yaeo = sin(azobs)*ce; zaeo = cos(zdobs); /* cartesian az/zd to cartesian -ha,dec */ v[0] = sphi*xaeo+cphi*zaeo; v[1] = yaeo; v[2] = -cphi*xaeo+sphi*zaeo; /* to spherical -ha,dec */ palDcc2s(v,&hmobs,&dcobs); /* right ascension */ raobs = palDranrm(st+hmobs); /* return the results */ *aob = azobs; *zob = zdobs; *hob = -hmobs; *dob = dcobs; *rob = raobs; } pal-0.9.7/palAtmdsp.c000066400000000000000000000137421302604645500144100ustar00rootroot00000000000000/* *+ * Name: * palAtmdsp * Purpose: * Apply atmospheric-dispersion adjustments to refraction coefficients * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palAtmdsp( double tdk, double pmb, double rh, double wl1, * double a1, double b1, double wl2, double *a2, double *b2 ); * Arguments: * tdk = double (Given) * Ambient temperature, K * pmb = double (Given) * Ambient pressure, millibars * rh = double (Given) * Ambient relative humidity, 0-1 * wl1 = double (Given) * Reference wavelength, micrometre (0.4 recommended) * a1 = double (Given) * Refraction coefficient A for wavelength wl1 (radians) * b1 = double (Given) * Refraction coefficient B for wavelength wl1 (radians) * wl2 = double (Given) * Wavelength for which adjusted A,B required * a2 = double * (Returned) * Refraction coefficient A for wavelength WL2 (radians) * b2 = double * (Returned) * Refraction coefficient B for wavelength WL2 (radians) * Description: * Apply atmospheric-dispersion adjustments to refraction coefficients. * Authors: * TIMJ: Tim Jenness * PTW: Patrick Wallace * {enter_new_authors_here} * Notes: * - To use this routine, first call palRefco specifying WL1 as the * wavelength. This yields refraction coefficients A1,B1, correct * for that wavelength. Subsequently, calls to palAtmdsp specifying * different wavelengths will produce new, slightly adjusted * refraction coefficients which apply to the specified wavelength. * * - Most of the atmospheric dispersion happens between 0.7 micrometre * and the UV atmospheric cutoff, and the effect increases strongly * towards the UV end. For this reason a blue reference wavelength * is recommended, for example 0.4 micrometres. * * - The accuracy, for this set of conditions: * * height above sea level 2000 m * latitude 29 deg * pressure 793 mb * temperature 17 degC * humidity 50% * lapse rate 0.0065 degC/m * reference wavelength 0.4 micrometre * star elevation 15 deg * * is about 2.5 mas RMS between 0.3 and 1.0 micrometres, and stays * within 4 mas for the whole range longward of 0.3 micrometres * (compared with a total dispersion from 0.3 to 20.0 micrometres * of about 11 arcsec). These errors are typical for ordinary * conditions and the given elevation; in extreme conditions values * a few times this size may occur, while at higher elevations the * errors become much smaller. * * - If either wavelength exceeds 100 micrometres, the radio case * is assumed and the returned refraction coefficients are the * same as the given ones. Note that radio refraction coefficients * cannot be turned into optical values using this routine, nor * vice versa. * * - The algorithm consists of calculation of the refractivity of the * air at the observer for the two wavelengths, using the methods * of the palRefro routine, and then scaling of the two refraction * coefficients according to classical refraction theory. This * amounts to scaling the A coefficient in proportion to (n-1) and * the B coefficient almost in the same ratio (see R.M.Green, * "Spherical Astronomy", Cambridge University Press, 1985). * History: * 2014-07-15 (TIMJ): * Initial version. A direct copy of the Fortran SLA implementation. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2014 Tim Jenness * Copyright (C) 2005 Patrick Wallace * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "palmac.h" #include void palAtmdsp ( double tdk, double pmb, double rh, double wl1, double a1, double b1, double wl2, double *a2, double *b2 ) { double f,tdkok,pmbok,rhok; double psat,pwo,w1,wlok,wlsq,w2,dn1,dn2; /* Check for radio wavelengths */ if (wl1 > 100.0 || wl2 > 100.0) { /* Radio: no dispersion */ *a2 = a1; *b2 = b1; } else { /* Optical: keep arguments within safe bounds */ tdkok = DMIN(DMAX(tdk,100.0),500.0); pmbok = DMIN(DMAX(pmb,0.0),10000.0); rhok = DMIN(DMAX(rh,0.0),1.0); /* Atmosphere parameters at the observer */ psat = pow(10.0, -8.7115+0.03477*tdkok); pwo = rhok*psat; w1 = 11.2684e-6*pwo; /* Refractivity at the observer for first wavelength */ wlok = DMAX(wl1,0.1); wlsq = wlok*wlok; w2 = 77.5317e-6+(0.43909e-6+0.00367e-6/wlsq)/wlsq; dn1 = (w2*pmbok-w1)/tdkok; /* Refractivity at the observer for second wavelength */ wlok = DMAX(wl2,0.1); wlsq = wlok*wlok; w2 = 77.5317e-6+(0.43909e-6+0.00367e-6/wlsq)/wlsq; dn2 = (w2*pmbok-w1)/tdkok; /* Scale the refraction coefficients (see Green 4.31, p93) */ if (dn1 != 0.0) { f = dn2/dn1; *a2 = a1*f; *b2 = b1*f; if (dn1 != a1) { *b2 *= (1.0+dn1*(dn1-dn2)/(2.0*(dn1-a1))); } } else { *a2 = a1; *b2 = b1; } } } pal-0.9.7/palCaldj.c000066400000000000000000000054741302604645500142000ustar00rootroot00000000000000/* *+ * Name: * palCaldj * Purpose: * Gregorian Calendar to Modified Julian Date * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palCaldj ( int iy, int im, int id, double *djm, int *j ); * Arguments: * iy = int (Given) * Year in the Gregorian calendar * im = int (Given) * Month in the Gergorian calendar * id = int (Given) * Day in the Gregorian calendar * djm = double * (Returned) * Modified Julian Date (JD-2400000.5) for 0 hrs * j = status (Returned) * 0 = OK. See eraCal2jd for other values. * Description: * Modified Julian Date to Gregorian Calendar with special * behaviour for 2-digit years relating to 1950 to 2049. * Authors: * PTW: Pat Wallace (STFC) * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * History: * 2012-02-11 (TIMJ): * Initial version with documentation taken from Fortran SLA * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Notes: * - Uses eraCal2jd * - Unlike eraCal2jd this routine treats the years 0-100 as * referring to the end of the 20th Century and beginning of * the 21st Century. If this behaviour is not acceptable * use the SOFA/ERFA routine directly or palCldj. * Acceptable years are 00-49, interpreted as 2000-2049, * 50-99, " " 1950-1999, * all others, interpreted literally. * - Unlike SLA this routine will work with negative years. * Copyright: * Copyright (C) 1995 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "palmac.h" #include "pal1sofa.h" void palCaldj ( int iy, int im, int id, double *djm, int *j ) { int adj = 0; /* Year adjustment */ double djm0; if (iy >= 0 && iy <= 49) { adj = 2000; } else if (iy >= 50 && iy <= 99) { adj = 1900; } iy += adj; *j = eraCal2jd( iy, im, id, &djm0, djm ); } pal-0.9.7/palDafin.c000066400000000000000000000145361302604645500142030ustar00rootroot00000000000000/* *+ * Name: * palDafin * Purpose: * Sexagesimal character string to angle * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palDafin ( const char *string, int *ipos, double *a, int *j ); * Arguments: * string = const char * (Given) * String containing deg, arcmin, arcsec fields * ipos = int * (Given & Returned) * Position to start decoding "string". First character * is position 1 for compatibility with SLA. After * calling this routine "iptr" will be positioned after * the sexagesimal string. * a = double * (Returned) * Angle in radians. * j = int * (Returned) * status: 0 = OK * +1 = default, A unchanged * -1 = bad degrees ) * -2 = bad arcminutes ) (note 3) * -3 = bad arcseconds ) * Description: * Extracts an angle from a sexagesimal string with degrees, arcmin, * arcsec fields using space or comma delimiters. * Authors: * TIMJ: Tim Jenness (JAC, Hawaii) * PTW: Patrick T. Wallace * {enter_new_authors_here} * Example: * argument before after * * STRING '-57 17 44.806 12 34 56.7' unchanged * IPTR 1 16 (points to 12...) * A ? -1.00000D0 * J ? 0 * Notes: * - The first three "fields" in STRING are degrees, arcminutes, * arcseconds, separated by spaces or commas. The degrees field * may be signed, but not the others. The decoding is carried * out by the palDfltin routine and is free-format. * - Successive fields may be absent, defaulting to zero. For * zero status, the only combinations allowed are degrees alone, * degrees and arcminutes, and all three fields present. If all * three fields are omitted, a status of +1 is returned and A is * unchanged. In all other cases A is changed. * - Range checking: * * The degrees field is not range checked. However, it is * expected to be integral unless the other two fields are absent. * * The arcminutes field is expected to be 0-59, and integral if * the arcseconds field is present. If the arcseconds field * is absent, the arcminutes is expected to be 0-59.9999... * * The arcseconds field is expected to be 0-59.9999... * * - Decoding continues even when a check has failed. Under these * circumstances the field takes the supplied value, defaulting * to zero, and the result A is computed and returned. * - Further fields after the three expected ones are not treated * as an error. The pointer IPOS is left in the correct state * for further decoding with the present routine or with palDfltin * etc. See the example, above. * - If STRING contains hours, minutes, seconds instead of degrees * etc, or if the required units are turns (or days) instead of * radians, the result A should be multiplied as follows: * * for to obtain multiply * STRING A in A by * * d ' " radians 1 = 1.0 * d ' " turns 1/2pi = 0.1591549430918953358 * h m s radians 15 = 15.0 * h m s days 15/2pi = 2.3873241463784300365 * History: * 2012-03-08 (TIMJ): * Initial version from SLA/F using Fortran documentation * Adapted with permission from the Fortran SLALIB library. * 2012-10-17 (TIMJ): * Fix range check on arcminute value. * {enter_further_changes_here} * Copyright: * Copyright (C) 1996 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "palmac.h" #include "pal1sofa.h" #include void palDafin ( const char *string, int *ipos, double *a, int *j ) { int jd = 0; /* Status for degree parsing */ int jm = 0; /* Status for arcmin parsing */ int js = 0; /* Status for arcsec parsing */ int jf = 0; /* Internal copy of status */ double deg = 0.0; double arcmin = 0.0; double arcsec = 0.0; /* Decode degrees, arcminutes, arcseconds */ palDfltin( string, ipos, °, &jd ); if (jd > 1) { jf = -1; } else { palDfltin( string, ipos, &arcmin, &jm ); if ( jm < 0 || jm > 1 ) { jf = -2; } else { palDfltin( string, ipos, &arcsec, &js ); if (js < 0 || js > 1) { jf = -3; } else if (jd > 0) { /* See if combination of fields is credible */ /* No degrees: arcmin, arcsec ought also to be absent */ if (jm == 0) { /* Suspect arcmin */ jf = -2; } else if (js == 0) { /* Suspect arcsec */ jf = -3; } else { /* All three fields absent */ jf = 1; } } else if (jm != 0 && js == 0) { /* Deg present: if arcsec present should have arcmin */ jf = -3; /* Tests for range and integrality */ } else if (jm == 0 && DINT(deg) != deg) { /* Degrees */ jf = -1; } else if ( (js == 0 && DINT(arcmin) != arcmin) || arcmin >= 60.0 ) { /* Arcmin */ jf = -2; } else if (arcsec >= 60.0) { /* Arcsec */ jf = -3; } } } /* Unless all three fields absent, compute angle value */ if (jf <= 0) { *a = PAL__DAS2R * ( 60.0 * ( 60.0 * fabs(deg) + arcmin) + arcsec ); if ( jd < 0 ) *a *= -1.; } *j = jf; } pal-0.9.7/palDat.c000066400000000000000000000050031302604645500136570ustar00rootroot00000000000000/* *+ * Name: * palDat * Purpose: * Return offset between UTC and TAI * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * dat = palDat( double utc ); * Arguments: * utc = double (Given) * UTC date as a modified JD (JD-2400000.5) * Returned Value: * dat = double * TAI-UTC in seconds * Description: * Increment to be applied to Coordinated Universal Time UTC to give * International Atomic Time (TAI). * Authors: * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - This routine converts the MJD argument to calendar date before calling * the SOFA/ERFA eraDat function. * - This routine matches the slaDat interface which differs from the eraDat * interface. Consider coding directly to the SOFA/ERFA interface. * - See eraDat for a description of error conditions when calling this function * with a time outside of the UTC range. * - The status argument from eraDat is ignored. This is reasonable since the * error codes are mainly related to incorrect calendar dates when calculating * the JD internally. * History: * 2012-02-08 (TIMJ): * Initial version * Adapted with permission from the Fortran SLALIB library * although the core algorithm is now from SOFA. * {enter_further_changes_here} * Copyright: * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "palmac.h" #include "pal1sofa.h" double palDat ( double dju ) { int iy; int im; int id; int status; double fd; double deltat; eraJd2cal( PAL__MJD0, dju, &iy, &im, &id, &fd ); status = eraDat( iy, im, id, fd, &deltat ); return deltat; } pal-0.9.7/palDe2h.c000066400000000000000000000074461302604645500137460ustar00rootroot00000000000000/* *+ * Name: * palDe2h * Purpose: * Equatorial to horizon coordinates: HA,Dec to Az,E * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palDe2h( double ha, double dec, double phi, double * az, double * el ); * Arguments: * ha = double * (Given) * Hour angle (radians) * dec = double * (Given) * Declination (radians) * phi = double (Given) * Observatory latitude (radians) * az = double * (Returned) * Azimuth (radians) * el = double * (Returned) * Elevation (radians) * Description: * Convert equatorial to horizon coordinates. * Authors: * PTW: Pat Wallace (STFC) * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - All the arguments are angles in radians. * - Azimuth is returned in the range 0-2pi; north is zero, * and east is +pi/2. Elevation is returned in the range * +/-pi/2. * - The latitude must be geodetic. In critical applications, * corrections for polar motion should be applied. * - In some applications it will be important to specify the * correct type of hour angle and declination in order to * produce the required type of azimuth and elevation. In * particular, it may be important to distinguish between * elevation as affected by refraction, which would * require the "observed" HA,Dec, and the elevation * in vacuo, which would require the "topocentric" HA,Dec. * If the effects of diurnal aberration can be neglected, the * "apparent" HA,Dec may be used instead of the topocentric * HA,Dec. * - No range checking of arguments is carried out. * - In applications which involve many such calculations, rather * than calling the present routine it will be more efficient to * use inline code, having previously computed fixed terms such * as sine and cosine of latitude, and (for tracking a star) * sine and cosine of declination. * History: * 2012-02-08 (TIMJ): * Initial version with documentation taken from Fortran SLA * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1995 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "palmac.h" #include void palDe2h ( double ha, double dec, double phi, double *az, double *el) { double sh; double ch; double sd; double cd; double sp; double cp; double a; double x; double y; double z; double r; /* Useful trig functions */ sh = sin(ha); ch = cos(ha); sd = sin(dec); cd = cos(dec); sp = sin(phi); cp = cos(phi); /* Az,El as x,y,z */ x = -ch * cd * sp + sd * cp; y = -sh * cd; z = ch * cd * cp + sd * sp; /* To spherical */ r = sqrt(x * x + y * y); if (r == 0.) { a = 0.; } else { a = atan2(y, x); } if (a < 0.) { a += PAL__D2PI; } *az = a; *el = atan2(z, r); return; } pal-0.9.7/palDeuler.c000066400000000000000000000075621302604645500144030ustar00rootroot00000000000000/* *+ * Name: * palDeuler * Purpose: * Form a rotation matrix from the Euler angles * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palDeuler ( const char *order, double phi, double theta, double psi, * double rmat[3][3] ); * Arguments: * order = const char[] (Given) * Specifies about which axes the rotation occurs * phi = double (Given) * 1st rotation (radians) * theta = double (Given) * 2nd rotation (radians) * psi = double (Given) * 3rd rotation (radians) * rmat = double[3][3] (Given & Returned) * Rotation matrix * Description: * A rotation is positive when the reference frame rotates * anticlockwise as seen looking towards the origin from the * positive region of the specified axis. * * The characters of ORDER define which axes the three successive * rotations are about. A typical value is 'ZXZ', indicating that * RMAT is to become the direction cosine matrix corresponding to * rotations of the reference frame through PHI radians about the * old Z-axis, followed by THETA radians about the resulting X-axis, * then PSI radians about the resulting Z-axis. * * The axis names can be any of the following, in any order or * combination: X, Y, Z, uppercase or lowercase, 1, 2, 3. Normal * axis labelling/numbering conventions apply; the xyz (=123) * triad is right-handed. Thus, the 'ZXZ' example given above * could be written 'zxz' or '313' (or even 'ZxZ' or '3xZ'). ORDER * is terminated by length or by the first unrecognized character. * * Fewer than three rotations are acceptable, in which case the later * angle arguments are ignored. If all rotations are zero, the * identity matrix is produced. * Authors: * PTW: Pat Wallace (STFC) * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * History: * 2012-02-08 (TIMJ): * Initial version with documentation taken from Fortran SLA * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1997 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "pal1sofa.h" void palDeuler( const char *order, double phi, double theta, double psi, double rmat[3][3] ) { int i = 0; double rotations[3]; /* Initialise rmat */ eraIr( rmat ); /* copy the rotations into an array */ rotations[0] = phi; rotations[1] = theta; rotations[2] = psi; /* maximum three rotations */ while (i < 3 && order[i] != '\0') { switch (order[i]) { case 'X': case 'x': case '1': eraRx( rotations[i], rmat ); break; case 'Y': case 'y': case '2': eraRy( rotations[i], rmat ); break; case 'Z': case 'z': case '3': eraRz( rotations[i], rmat ); break; default: /* break out the loop if we do not recognize something */ i = 3; } /* Go to the next position */ i++; } return; } pal-0.9.7/palDfltin.c000066400000000000000000000164121302604645500143750ustar00rootroot00000000000000/* *+ * Name: * palDfltin * Purpose: * Convert free-format input into double precision floating point * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palDfltin( const char * string, int *nstrt, * double *dreslt, int *jflag ); * Arguments: * string = const char * (Given) * String containing number to be decoded. * nstrt = int * (Given and Returned) * Character number indicating where decoding should start. * On output its value is updated to be the location of the * possible next value. For compatibility with SLA the first * character is index 1. * dreslt = double * (Returned) * Result. Not updated when jflag=1. * jflag = int * (Returned) * status: -1 = -OK, 0 = +OK, 1 = null, 2 = error * Description: * Extracts a number from an input string starting at the specified * index. * Authors: * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - Uses the strtod() system call to do the parsing. This may lead to * subtle differences when compared to the SLA/F parsing. * - All "D" characters are converted to "E" to handle fortran exponents. * - Commas are recognized as a special case and are skipped if one happens * to be the next character when updating nstrt. Additionally the output * nstrt position will skip past any trailing space. * - If no number can be found flag will be set to 1. * - If the number overflows or underflows jflag will be set to 2. For overflow * the returned result will have the value HUGE_VAL, for underflow it * will have the value 0.0. * - For compatiblity with SLA/F -0 will be returned as "0" with jflag == -1. * - Unlike slaDfltin a standalone "E" will return status 1 (could not find * a number) rather than 2 (bad number). * Implementation Status: * - The code is more robust if the C99 copysign() function is available. * This can recognize the -0.0 values returned by strtod. If copysign() is * missing we try to scan the string looking for minus signs. * History: * 2012-03-08 (TIMJ): * Initial version based on strtod * Adapted with permission from the Fortran SLALIB library * although this is a completely distinct implementation of the SLA API. * 2012-06-21 (TIMJ): * Provide a backup for missing copysign. * 2012-06-22 (TIMJ): * Check __STDC_VERSION__ * {enter_further_changes_here} * Copyright: * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ /* Use the config file if we have one, else look at compiler defines to see if we have C99 */ #if HAVE_CONFIG_H #include #else #ifdef __STDC_VERSION__ # if (__STDC_VERSION__ >= 199901L) # define HAVE_COPYSIGN 1 # endif #endif #endif /* isblank() is a C99 feature so we just reimplement it if it is missing */ #if HAVE_ISBLANK #define _POSIX_C_SOURCE 200112L #define _ISOC99_SOURCE #include # define ISBLANK isblank #else static int ISBLANK( int c ) { return ( c == ' ' || c == '\t' ); } #endif #ifdef HAVE_BSD_STRING_H #include #endif /* System include files */ #include #include #include #include #include "pal.h" #if HAVE_COPYSIGN # define SCAN_FOR_MINUS 0 #else # define SCAN_FOR_MINUS 1 #endif /* We prefer to use the starutil package */ #if HAVE_STAR_UTIL_H # include "star/util.h" #else #endif void palDfltin( const char * string, int *nstrt, double *dreslt, int *jflag ) { char * ctemp = NULL; /* Pointer into string */ char * endptr = NULL;/* Pointer to string after number */ double retval; /* Return value from strtod */ /* We have to copy the string in order to modify the exponents from Fortran style. Rather than using malloc we have a static buffer. Technically we only have to do the copy if we have a D or d in the string. */ char tempbuf[256]; #if SCAN_FOR_MINUS int dreslt_sign = 1; int ipos = *nstrt; const char * cctemp = NULL; /* Scan the string looking for a minus sign. Then update the start position for the subsequent copy iff we find a '-'. Note that commas are a special delimiter so we stop looking for a minus if we find one or if we find a digit. */ cctemp = &(string[ipos-1]); while (!isdigit(*cctemp) && (*cctemp != ',') && (*cctemp != '\0')) { if (*cctemp == '-') { *nstrt = ipos; dreslt_sign = -1; break; } ipos++; cctemp++; } #endif /* Correct for SLA use of fortran convention */ #if HAVE_STAR_UTIL_H star_strlcpy( tempbuf, &(string[*nstrt-1]), sizeof(tempbuf) ); #else # if HAVE_STRLCPY strlcpy( tempbuf, &(string[*nstrt-1]), sizeof(tempbuf) ); # else /* Use standard C interface */ strncpy( tempbuf, &(string[*nstrt-1]), sizeof(tempbuf)); tempbuf[sizeof(tempbuf)-1] = '\0'; # endif #endif /* Convert d or D to E */ ctemp = tempbuf; while (*ctemp != '\0') { if (*ctemp == 'd' || *ctemp == 'D') *ctemp = 'E'; ctemp++; } /* strtod man page indicates that we should reset errno before calling strtod */ errno = 0; /* We know we are starting at the beginning of the string now */ retval = strtod( tempbuf, &endptr ); if (retval == 0.0 && endptr == tempbuf) { /* conversion did not find anything */ *jflag = 1; /* but SLA compatibility requires that we step through to remove leading spaces. We also step through alphabetic characters since they can never be numbers standalone (no number starts with an 'E') */ while (ISBLANK(*endptr) || isalpha(*endptr) ) { endptr++; } } else if ( errno == ERANGE ) { *jflag = 2; } else { #if SCAN_FOR_MINUS *jflag = (dreslt_sign < 0 ? -1 : 0); #else if ( retval < 0.0 ) { *jflag = -1; } else if ( retval == 0.0 ) { /* Need to distinguish -0 from +0 */ double test = copysign( 1.0, retval ); if ( test < 0.0 ) { *jflag = -1; } else { *jflag = 0; } } else { *jflag = 0; } #endif } /* Sort out the position for the next index */ *nstrt += endptr - tempbuf; /* Skip a comma */ if (*endptr == ',') { (*nstrt)++; } else { /* jump past any leading spaces for the next part of the string */ ctemp = endptr; while ( ISBLANK(*ctemp) ) { (*nstrt)++; ctemp++; } } /* And the result unless we found nothing */ if (*jflag != 1) *dreslt = retval; } pal-0.9.7/palDh2e.c000066400000000000000000000072111302604645500137340ustar00rootroot00000000000000/* *+ * Name: * palDh2e * Purpose: * Horizon to equatorial coordinates: Az,El to HA,Dec * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palDh2e( double az, double el, double phi, double * ha, double * dec ); * Arguments: * az = double (Given) * Azimuth (radians) * el = double (Given) * Elevation (radians) * phi = double (Given) * Observatory latitude (radians) * ha = double * (Returned) * Hour angle (radians) * dec = double * (Returned) * Declination (radians) * Description: * Convert horizon to equatorial coordinates. * Authors: * PTW: Pat Wallace (STFC) * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - All the arguments are angles in radians. * - The sign convention for azimuth is north zero, east +pi/2. * - HA is returned in the range +/-pi. Declination is returned * in the range +/-pi/2. * - The latitude is (in principle) geodetic. In critical * applications, corrections for polar motion should be applied. * - In some applications it will be important to specify the * correct type of elevation in order to produce the required * type of HA,Dec. In particular, it may be important to * distinguish between the elevation as affected by refraction, * which will yield the "observed" HA,Dec, and the elevation * in vacuo, which will yield the "topocentric" HA,Dec. If the * effects of diurnal aberration can be neglected, the * topocentric HA,Dec may be used as an approximation to the * "apparent" HA,Dec. * - No range checking of arguments is done. * - In applications which involve many such calculations, rather * than calling the present routine it will be more efficient to * use inline code, having previously computed fixed terms such * as sine and cosine of latitude. * History: * 2012-02-08 (TIMJ): * Initial version with documentation taken from Fortran SLA * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1996 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include void palDh2e ( double az, double el, double phi, double *ha, double *dec) { double sa; double ca; double se; double ce; double sp; double cp; double x; double y; double z; double r; /* Useful trig functions */ sa = sin(az); ca = cos(az); se = sin(el); ce = cos(el); sp = sin(phi); cp = cos(phi); /* HA,Dec as x,y,z */ x = -ca * ce * sp + se * cp; y = -sa * ce; z = ca * ce * cp + se * sp; /* To HA,Dec */ r = sqrt(x * x + y * y); if (r == 0.) { *ha = 0.; } else { *ha = atan2(y, x); } *dec = atan2(z, r); return; } pal-0.9.7/palDjcal.c000066400000000000000000000047701302604645500141760ustar00rootroot00000000000000/* *+ * Name: * palDjcal * Purpose: * Modified Julian Date to Gregorian Calendar * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palDjcal ( int ndp, double djm, int iymdf[4], int *j ); * Arguments: * ndp = int (Given) * Number of decimal places of days in fraction. * djm = double (Given) * Modified Julian Date (JD-2400000.5) * iymdf[4] = int[] (Returned) * Year, month, day, fraction in Gregorian calendar. * j = status (Returned) * 0 = OK. See eraJd2cal for other values. * Description: * Modified Julian Date to Gregorian Calendar, expressed * in a form convenient for formatting messages (namely * rounded to a specified precision, and with the fields * stored in a single array) * Authors: * PTW: Pat Wallace (STFC) * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * History: * 2012-02-10 (TIMJ): * Initial version with documentation taken from Fortran SLA * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Notes: * - Uses eraJd2cal * Copyright: * Copyright (C) 2004 Patrick T. Wallace * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include #include "pal.h" #include "palmac.h" #include "pal1sofa.h" void palDjcal ( int ndp, double djm, int iymdf[4], int *j ) { double frac = 0.0; double nfd; *j = eraJd2cal( PAL__MJD0, djm, &(iymdf[0]), &(iymdf[1]), &(iymdf[2]), &frac); /* Convert ndp to a power of 10 */ nfd = pow( 10., (double)ndp ); /* Multiply the fraction */ frac *= nfd; /* and now we want to round to the nearest integer */ iymdf[3] = (int)DNINT(frac); } pal-0.9.7/palDmat.c000066400000000000000000000103001302604645500140300ustar00rootroot00000000000000/* *+ * Name: * palDmat * Purpose: * Matrix inversion & solution of simultaneous equations * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palDmat( int n, double *a, double *y, double *d, int *jf, * int *iw ); * Arguments: * n = int (Given) * Number of simultaneous equations and number of unknowns. * a = double[] (Given & Returned) * A non-singular NxN matrix (implemented as a contiguous block * of memory). After calling this routine "a" contains the * inverse of the matrix. * y = double[] (Given & Returned) * On input the vector of N knowns. On exit this vector contains the * N solutions. * d = double * (Returned) * The determinant. * jf = int * (Returned) * The singularity flag. If the matrix is non-singular, jf=0 * is returned. If the matrix is singular, jf=-1 & d=0.0 are * returned. In the latter case, the contents of array "a" on * return are undefined. * iw = int[] (Given) * Integer workspace of size N. * Description: * Matrix inversion & solution of simultaneous equations * For the set of n simultaneous equations in n unknowns: * A.Y = X * this routine calculates the inverse of A, the determinant * of matrix A and the vector of N unknowns. * Authors: * PTW: Pat Wallace (STFC) * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * History: * 2012-02-11 (TIMJ): * Combination of a port of the Fortran and a comparison * with the obfuscated GPL C routine. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Notes: * - Implemented using Gaussian elimination with partial pivoting. * - Optimized for speed rather than accuracy with errors 1 to 4 * times those of routines optimized for accuracy. * Copyright: * Copyright (C) 2001 Rutherford Appleton Laboratory. * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" void palDmat ( int n, double *a, double *y, double *d, int *jf, int *iw ) { const double SFA = 1e-20; int k; double*aoff; *jf=0; *d=1.0; for(k=0,aoff=a; kamx){ amx=t; imx=i; aoff2=apos2; } } } if(amx0;){ int ki=iw[k]; if(k!=ki){ int i; double *apos = a; for(i=0;i=0; N--) { /* DO N=NL, 1, -1 */ COEFF=TL[N]; EMN=(double)(ITL[N][0]); EMPN=(double)(ITL[N][1]); DN=(double)(ITL[N][2]); FN=(double)(ITL[N][3]); I=ITL[N][4]; if (I == 0) { EN=1.; DEN=0.; } else if (I == 1) { EN=E; DEN=DE; } else { EN=ESQ; DEN=DESQ; } THETA=EMN*EM+EMPN*EMP+DN*D+FN*F; DTHETA=EMN*DEM+EMPN*DEMP+DN*DD+FN*DF; FTHETA=sin(THETA); V=V+COEFF*FTHETA*EN; DV=DV+COEFF*(cos(THETA)*DTHETA*EN+FTHETA*DEN); } EL=ELP+PAL__DD2R*V; DEL=(DELP+PAL__DD2R*DV)/CJ; /* Latitude */ V=0.; DV=0.; for (N=NB-1; N>=0; N--) { /* DO N=NB,1,-1 */ COEFF=TB[N]; EMN=(double)(ITB[N][0]); EMPN=(double)(ITB[N][1]); DN=(double)(ITB[N][2]); FN=(double)(ITB[N][3]); I=ITB[N][4]; if (I == 0 ) { EN=1.; DEN=0.; } else if (I == 1) { EN=E; DEN=DE; } else { EN=ESQ; DEN=DESQ; } THETA=EMN*EM+EMPN*EMP+DN*D+FN*F; DTHETA=EMN*DEM+EMPN*DEMP+DN*DD+FN*DF; FTHETA=sin(THETA); V=V+COEFF*FTHETA*EN; DV=DV+COEFF*(cos(THETA)*DTHETA*EN+FTHETA*DEN); } BF=1.-CW1*COSOM-CW2*COSWOM; DBF=CW1*DOM*SINOM+CW2*DWOM*SINWOM; B=PAL__DD2R*V*BF; DB=PAL__DD2R*(DV*BF+V*DBF)/CJ; /* Parallax */ V=0.; DV=0.; for (N=NP-1; N>=0; N--) { /* DO N=NP,1,-1 */ COEFF=TP[N]; EMN=(double)(ITP[N][0]); EMPN=(double)(ITP[N][1]); DN=(double)(ITP[N][2]); FN=(double)(ITP[N][3]); I=ITP[N][4]; if (I == 0) { EN=1.; DEN=0.; } else if (I == 1) { EN=E; DEN=DE; } else { EN=ESQ; DEN=DESQ; } THETA=EMN*EM+EMPN*EMP+DN*D+FN*F; DTHETA=EMN*DEM+EMPN*DEMP+DN*DD+FN*DF; FTHETA=cos(THETA); V=V+COEFF*FTHETA*EN; DV=DV+COEFF*(-sin(THETA)*DTHETA*EN+FTHETA*DEN); } P=PAL__DD2R*V; DP=PAL__DD2R*DV/CJ; /* * Transformation into final form */ /* Parallax to distance (AU, AU/sec) */ SP=sin(P); R=ERADAU/SP; DR=-R*DP*cos(P)/SP; /* Longitude, latitude to x,y,z (AU) */ SEL=sin(EL); CEL=cos(EL); SB=sin(B); CB=cos(B); RCB=R*CB; RBD=R*DB; W=RBD*SB-CB*DR; X=RCB*CEL; Y=RCB*SEL; Z=R*SB; XD=-Y*DEL-W*CEL; YD=X*DEL-W*SEL; ZD=RBD*CB+SB*DR; /* Julian centuries since J2000 */ T=(date-51544.5)/36525.; /* Fricke equinox correction */ EPJ=2000.+T*100.; EQCOR=PAL__DS2R*(0.035+0.00085*(EPJ-B1950)); /* Mean obliquity (IAU 1976) */ EPS=PAL__DAS2R*(84381.448+(-46.8150+(-0.00059+0.001813*T)*T)*T); /* To the equatorial system, mean of date, FK5 system */ SINEPS=sin(EPS); COSEPS=cos(EPS); ES=EQCOR*SINEPS; EC=EQCOR*COSEPS; pv[0]=X-EC*Y+ES*Z; pv[1]=EQCOR*X+Y*COSEPS-Z*SINEPS; pv[2]=Y*SINEPS+Z*COSEPS; pv[3]=XD-EC*YD+ES*ZD; pv[4]=EQCOR*XD+YD*COSEPS-ZD*SINEPS; pv[5]=YD*SINEPS+ZD*COSEPS; } pal-0.9.7/palDrange.c000066400000000000000000000036671302604645500143650ustar00rootroot00000000000000/* *+ * Name: * palDrange * Purpose: * Normalize angle into range +/- pi * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palDrange( double angle ) * Arguments: * angle = double (Given) * The angle in radians. * Description: * The result is "angle" expressed in the range +/- pi. If the * supplied value for "angle" is equal to +/- pi, it is returned * unchanged. * Authors: * DSB: David S Berry (JAC, Hawaii) * PTW: Patrick T. Wallace * {enter_new_authors_here} * History: * 2012-05-09 (DSB): * Initial version with documentation taken from Fortran SLA * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1995 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "palmac.h" #include double palDrange( double angle ){ double result = fmod( angle, PAL__D2PI ); if( result > PAL__DPI ) { result -= PAL__D2PI; } else if( result < -PAL__DPI ) { result += PAL__D2PI; } return result; } pal-0.9.7/palDs2tp.c000066400000000000000000000066001302604645500141470ustar00rootroot00000000000000/* *+ * Name: * palDs2tp * Purpose: * Spherical to tangent plane projection * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palDs2tp( double ra, double dec, double raz, double decz, * double *xi, double *eta, int *j ); * Arguments: * ra = double (Given) * RA spherical coordinate of point to be projected (radians) * dec = double (Given) * Dec spherical coordinate of point to be projected (radians) * raz = double (Given) * RA spherical coordinate of tangent point (radians) * decz = double (Given) * Dec spherical coordinate of tangent point (radians) * xi = double * (Returned) * First rectangular coordinate on tangent plane (radians) * eta = double * (Returned) * Second rectangular coordinate on tangent plane (radians) * j = int * (Returned) * status: 0 = OK, star on tangent plane * 1 = error, star too far from axis * 2 = error, antistar on tangent plane * 3 = error, antistar too far from axis * Description: * Projection of spherical coordinates onto tangent plane: * "gnomonic" projection - "standard coordinates" * Authors: * PTW: Pat Wallace (STFC) * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * History: * 2012-02-08 (TIMJ): * Initial version with documentation taken from Fortran SLA * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1996 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include void palDs2tp ( double ra, double dec, double raz, double decz, double *xi, double *eta, int *j ) { const double TINY = 1.0e-6; double cdec; double sdec; double radif; double cdecz; double denom; double sdecz; double cradif; double sradif; /* Trig functions */ sdecz = sin(decz); sdec = sin(dec); cdecz = cos(decz); cdec = cos(dec); radif = ra - raz; sradif = sin(radif); cradif = cos(radif); /* Reciprocal of star vector length to tangent plane */ denom = sdec * sdecz + cdec * cdecz * cradif; /* Handle vectors too far from axis */ if (denom > TINY) { *j = 0; } else if (denom >= 0.) { *j = 1; denom = TINY; } else if (denom > -TINY) { *j = 2; denom = -TINY; } else { *j = 3; } /* Compute tangent plane coordinates (even in dubious cases) */ *xi = cdec * sradif / denom; *eta = (sdec * cdecz - cdec * sdecz * cradif) / denom; return; } pal-0.9.7/palDt.c000066400000000000000000000070571302604645500135310ustar00rootroot00000000000000/* *+ * Name: * palDt * Purpose: * Estimate the offset between dynamical time and UT * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * double palDt( double epoch ); * Arguments: * epoch = double (Given) * Julian epoch (e.g. 1850.0) * Returned Value: * palDt = double * Rough estimate of ET-UT (after 1984, TT-UT) at the * given epoch, in seconds. * Description: * Estimate the offset between dynamical time and Universal Time * for a given historical epoch. * Authors: * TIMJ: Tim Jenness (JAC, Hawaii) * PTW: Patrick T. Wallace * {enter_new_authors_here} * Notes: * - Depending on the epoch, one of three parabolic approximations * is used: * * before 979 Stephenson & Morrison's 390 BC to AD 948 model * 979 to 1708 Stephenson & Morrison's 948 to 1600 model * after 1708 McCarthy & Babcock's post-1650 model * * The breakpoints are chosen to ensure continuity: they occur * at places where the adjacent models give the same answer as * each other. * - The accuracy is modest, with errors of up to 20 sec during * the interval since 1650, rising to perhaps 30 min by 1000 BC. * Comparatively accurate values from AD 1600 are tabulated in * the Astronomical Almanac (see section K8 of the 1995 AA). * - The use of double-precision for both argument and result is * purely for compatibility with other SLALIB time routines. * - The models used are based on a lunar tidal acceleration value * of -26.00 arcsec per century. * * See Also: * Explanatory Supplement to the Astronomical Almanac, * ed P.K.Seidelmann, University Science Books (1992), * section 2.553, p83. This contains references to * the Stephenson & Morrison and McCarthy & Babcock * papers. * History: * 2012-03-08 (TIMJ): * Initial version with documentation from SLA/F. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1995 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" double palDt ( double epoch ) { double t,w,s; /* Centuries since 1800 */ t = (epoch - 1800.0) / 100.0; /* Select model */ if ( epoch >= 1708.185161980887 ) { /* Post-1708: use McCarthy & Babcock */ w = t - 0.19; s = 5.156 + 13.3066 * w * w; } else if ( epoch >= 979.0258204760233 ) { /* 978-1708: use Stephenson & Morrison's 948-1600 model */ s = 25.5 * t * t; } else { /* Pre-979: use Stephenson & Morrison's 390 BC to AD 948 model */ s = 1360.0 + (320.0 + 44.3*t) * t; } return s; } pal-0.9.7/palDtp2s.c000066400000000000000000000050561302604645500141530ustar00rootroot00000000000000/* *+ * Name: * palDtp2s * Purpose: * Tangent plane to spherical coordinates * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palDtp2s( double xi, double eta, double raz, double decz, * double *ra, double *dec); * Arguments: * xi = double (Given) * First rectangular coordinate on tangent plane (radians) * eta = double (Given) * Second rectangular coordinate on tangent plane (radians) * raz = double (Given) * RA spherical coordinate of tangent point (radians) * decz = double (Given) * Dec spherical coordinate of tangent point (radians) * ra = double * (Returned) * RA spherical coordinate of point to be projected (radians) * dec = double * (Returned) * Dec spherical coordinate of point to be projected (radians) * Description: * Transform tangent plane coordinates into spherical. * Authors: * PTW: Pat Wallace (STFC) * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * History: * 2012-02-08 (TIMJ): * Initial version with documentation taken from Fortran SLA * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1995 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "pal1sofa.h" #include void palDtp2s ( double xi, double eta, double raz, double decz, double *ra, double *dec ) { double cdecz; double denom; double sdecz; double d; sdecz = sin(decz); cdecz = cos(decz); denom = cdecz - eta * sdecz; d = atan2(xi, denom) + raz; *ra = eraAnp(d); *dec = atan2(sdecz + eta * cdecz, sqrt(xi * xi + denom * denom)); return; } pal-0.9.7/palDtps2c.c000066400000000000000000000111531302604645500143110ustar00rootroot00000000000000/* *+ * Name: * palDtps2c * Purpose: * Determine RA,Dec of tangent point from coordinates * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palDtps2c( double xi, double eta, double ra, double dec, * double * raz1, double decz1, * double * raz2, double decz2, int *n); * Arguments: * xi = double (Given) * First rectangular coordinate on tangent plane (radians) * eta = double (Given) * Second rectangular coordinate on tangent plane (radians) * ra = double (Given) * RA spherical coordinate of star (radians) * dec = double (Given) * Dec spherical coordinate of star (radians) * raz1 = double * (Returned) * RA spherical coordinate of tangent point, solution 1 (radians) * decz1 = double * (Returned) * Dec spherical coordinate of tangent point, solution 1 (radians) * raz2 = double * (Returned) * RA spherical coordinate of tangent point, solution 2 (radians) * decz2 = double * (Returned) * Dec spherical coordinate of tangent point, solution 2 (radians) * n = int * (Returned) * number of solutions: 0 = no solutions returned (note 2) * 1 = only the first solution is useful (note 3) * 2 = both solutions are useful (note 3) * Description: * From the tangent plane coordinates of a star of known RA,Dec, * determine the RA,Dec of the tangent point. * Authors: * PTW: Pat Wallace (STFC) * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - The RAZ1 and RAZ2 values are returned in the range 0-2pi. * - Cases where there is no solution can only arise near the poles. * For example, it is clearly impossible for a star at the pole * itself to have a non-zero XI value, and hence it is * meaningless to ask where the tangent point would have to be * to bring about this combination of XI and DEC. * - Also near the poles, cases can arise where there are two useful * solutions. The argument N indicates whether the second of the * two solutions returned is useful. N=1 indicates only one useful * solution, the usual case; under these circumstances, the second * solution corresponds to the "over-the-pole" case, and this is * reflected in the values of RAZ2 and DECZ2 which are returned. * - The DECZ1 and DECZ2 values are returned in the range +/-pi, but * in the usual, non-pole-crossing, case, the range is +/-pi/2. * - This routine is the spherical equivalent of the routine sla_DTPV2C. * History: * 2012-02-08 (TIMJ): * Initial version with documentation taken from Fortran SLA * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1995 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "pal1sofa.h" #include void palDtps2c( double xi, double eta, double ra, double dec, double * raz1, double * decz1, double * raz2, double * decz2, int *n) { double x2; double y2; double sd; double cd; double sdf; double r2; x2 = xi * xi; y2 = eta * eta; sd = sin(dec); cd = cos(dec); sdf = sd * sqrt(x2 + 1. + y2); r2 = cd * cd * (y2 + 1.) - sd * sd * x2; if (r2 >= 0.) { double r; double s; double c; r = sqrt(r2); s = sdf - eta * r; c = sdf * eta + r; if (xi == 0. && r == 0.) { r = 1.; } *raz1 = eraAnp(ra - atan2(xi, r)); *decz1 = atan2(s, c); r = -r; s = sdf - eta * r; c = sdf * eta + r; *raz2 = eraAnp(ra - atan2(xi, r)); *decz2 = atan2(s, c); if (fabs(sdf) < 1.) { *n = 1; } else { *n = 2; } } else { *n = 0; } return; } pal-0.9.7/palDtt.c000066400000000000000000000041021302604645500137010ustar00rootroot00000000000000/* *+ * Name: * palDtt * Purpose: * Return offset between UTC and TT * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * dtt = palDtt( double utc ); * Arguments: * utc = double (Given) * UTC date as a modified JD (JD-2400000.5) * Returned Value: * dtt = double * TT-UTC in seconds * Description: * Increment to be applied to Coordinated Universal Time UTC to give * Terrestrial Time TT (formerly Ephemeris Time ET) * Authors: * TIMJ: Tim Jenness (JAC, Hawaii) * PTW: Patrick T. Wallace * {enter_new_authors_here} * Notes: * - Consider a comprehensive upgrade to use the time transformations in SOFA's time * cookbook: http://www.iausofa.org/sofa_ts_c.pdf. * - See eraDat for a description of error conditions when calling this function * with a time outside of the UTC range. This behaviour differs from slaDtt. * History: * 2012-02-08 (TIMJ): * Initial version * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1995 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" double palDtt( double utc ) { return 32.184 + palDat( utc ); } pal-0.9.7/palEcleq.c000066400000000000000000000052571302604645500142130ustar00rootroot00000000000000/* *+ * Name: * palEcleq * Purpose: * Transform from ecliptic coordinates to J2000.0 equatorial coordinates * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palEcleq ( double dl, double db, double date, * double *dr, double *dd ); * Arguments: * dl = double (Given) * Ecliptic longitude (mean of date, IAU 1980 theory, radians) * db = double (Given) * Ecliptic latitude (mean of date, IAU 1980 theory, radians) * date = double (Given) * TT as Modified Julian Date (JD-2400000.5). The difference * between TT and TDB is of the order of a millisecond or two * (i.e. about 0.02 arc-seconds). * dr = double * (Returned) * J2000.0 mean RA (radians) * dd = double * (Returned) * J2000.0 mean Dec (Radians) * Description: * Transform from ecliptic coordinate to J2000.0 equatorial coordinates. * Authors: * PTW: Patrick T. Wallace * TIMJ: Tim Jenness (Cornell University) * {enter_new_authors_here} * History: * 2014-11-18 (TIMJ): * Initial version * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1995 Rutherford Appleton Laboratory * Copyright (C) 2014 Cornell University * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "pal1sofa.h" void palEcleq ( double dl, double db, double date, double *dr, double *dd ) { double v1[3], v2[3]; double rmat[3][3]; /* Spherical to Cartesian */ eraS2c( dl, db, v1 ); /* Ecliptic to equatorial */ palEcmat( date, rmat ); eraTrxp( rmat, v1, v2 ); /* Mean of date to J2000 */ palPrec( 2000.0, palEpj(date), rmat ); eraTrxp( rmat, v2, v1 ); /* Cartesian to spherical */ eraC2s( v1, dr, dd ); /* Express in conventional range */ *dr = eraAnp( *dr ); *dd = palDrange( *dd ); } pal-0.9.7/palEcmat.c000066400000000000000000000043771302604645500142150ustar00rootroot00000000000000/* *+ * Name: * palEcmat * Purpose: * Form the equatorial to ecliptic rotation matrix - IAU 2006 * precession model. * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palEcmat( double date, double rmat[3][3] ) * Arguments: * date = double (Given) * TT as Modified Julian Date (JD-2400000.5). The difference * between TT and TDB is of the order of a millisecond or two * (i.e. about 0.02 arc-seconds). * rmat = double[3][3] (Returned) * Rotation matrix * Description: * The equatorial to ecliptic rotation matrix is found and returned. * The matrix is in the sense V(ecl) = RMAT * V(equ); the * equator, equinox and ecliptic are mean of date. * Authors: * PTW: Pat Wallace (STFC) * DSB: David Berry (JAC, Hawaii) * {enter_new_authors_here} * History: * 2012-02-10 (DSB): * Initial version with documentation taken from Fortran SLA * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1996 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "palmac.h" #include "pal1sofa.h" void palEcmat( double date, double rmat[3][3] ) { /* Mean obliquity (the angle between the ecliptic and mean equator of date). */ double eps0 = eraObl06( PAL__MJD0, date ); /* Matrix */ palDeuler( "X", eps0, 0.0, 0.0, rmat ); } pal-0.9.7/palEl2ue.c000066400000000000000000000253341302604645500141340ustar00rootroot00000000000000/* *+ * Name: * palEl2ue * Purpose: * Transform conventional elements into "universal" form * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palEl2ue ( double date, int jform, double epoch, double orbinc, * double anode, double perih, double aorq, double e, * double aorl, double dm, double u[13], int *jstat ); * Arguments: * date = double (Given) * Epoch (TT MJD) of osculation (Note 3) * jform = int (Given) * Element set actually returned (1-3; Note 6) * epoch = double (Given) * Epoch of elements (TT MJD) * orbinc = double (Given) * inclination (radians) * anode = double (Given) * longitude of the ascending node (radians) * perih = double (Given) * longitude or argument of perihelion (radians) * aorq = double (Given) * mean distance or perihelion distance (AU) * e = double (Given) * eccentricity * aorl = double (Given) * mean anomaly or longitude (radians, JFORM=1,2 only) * dm = double (Given) * daily motion (radians, JFORM=1 only) * u = double [13] (Returned) * Universal orbital elements (Note 1) * - (0) combined mass (M+m) * - (1) total energy of the orbit (alpha) * - (2) reference (osculating) epoch (t0) * - (3-5) position at reference epoch (r0) * - (6-8) velocity at reference epoch (v0) * - (9) heliocentric distance at reference epoch * - (10) r0.v0 * - (11) date (t) * - (12) universal eccentric anomaly (psi) of date, approx * jstat = int * (Returned) * status: 0 = OK * - -1 = illegal JFORM * - -2 = illegal E * - -3 = illegal AORQ * - -4 = illegal DM * - -5 = numerical error * Description: * Transform conventional osculating elements into "universal" form. * Authors: * PTW: Pat Wallace (STFC) * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - The "universal" elements are those which define the orbit for the * purposes of the method of universal variables (see reference). * They consist of the combined mass of the two bodies, an epoch, * and the position and velocity vectors (arbitrary reference frame) * at that epoch. The parameter set used here includes also various * quantities that can, in fact, be derived from the other * information. This approach is taken to avoiding unnecessary * computation and loss of accuracy. The supplementary quantities * are (i) alpha, which is proportional to the total energy of the * orbit, (ii) the heliocentric distance at epoch, (iii) the * outwards component of the velocity at the given epoch, (iv) an * estimate of psi, the "universal eccentric anomaly" at a given * date and (v) that date. * - The companion routine is palUe2pv. This takes the set of numbers * that the present routine outputs and uses them to derive the * object's position and velocity. A single prediction requires one * call to the present routine followed by one call to palUe2pv; * for convenience, the two calls are packaged as the routine * palPlanel. Multiple predictions may be made by again calling the * present routine once, but then calling palUe2pv multiple times, * which is faster than multiple calls to palPlanel. * - DATE is the epoch of osculation. It is in the TT timescale * (formerly Ephemeris Time, ET) and is a Modified Julian Date * (JD-2400000.5). * - The supplied orbital elements are with respect to the J2000 * ecliptic and equinox. The position and velocity parameters * returned in the array U are with respect to the mean equator and * equinox of epoch J2000, and are for the perihelion prior to the * specified epoch. * - The universal elements returned in the array U are in canonical * units (solar masses, AU and canonical days). * - Three different element-format options are available: * * Option JFORM=1, suitable for the major planets: * * EPOCH = epoch of elements (TT MJD) * ORBINC = inclination i (radians) * ANODE = longitude of the ascending node, big omega (radians) * PERIH = longitude of perihelion, curly pi (radians) * AORQ = mean distance, a (AU) * E = eccentricity, e (range 0 to <1) * AORL = mean longitude L (radians) * DM = daily motion (radians) * * Option JFORM=2, suitable for minor planets: * * EPOCH = epoch of elements (TT MJD) * ORBINC = inclination i (radians) * ANODE = longitude of the ascending node, big omega (radians) * PERIH = argument of perihelion, little omega (radians) * AORQ = mean distance, a (AU) * E = eccentricity, e (range 0 to <1) * AORL = mean anomaly M (radians) * * Option JFORM=3, suitable for comets: * * EPOCH = epoch of perihelion (TT MJD) * ORBINC = inclination i (radians) * ANODE = longitude of the ascending node, big omega (radians) * PERIH = argument of perihelion, little omega (radians) * AORQ = perihelion distance, q (AU) * E = eccentricity, e (range 0 to 10) * * - Unused elements (DM for JFORM=2, AORL and DM for JFORM=3) are * not accessed. * - The algorithm was originally adapted from the EPHSLA program of * D.H.P.Jones (private communication, 1996). The method is based * on Stumpff's Universal Variables. * * See Also: * Everhart & Pitkin, Am.J.Phys. 51, 712 (1983). * History: * 2012-03-12 (TIMJ): * Initial version taken directly from SLA/F. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2005 Patrick T. Wallace * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include #include "pal.h" #include "palmac.h" void palEl2ue ( double date, int jform, double epoch, double orbinc, double anode, double perih, double aorq, double e, double aorl, double dm, double u[13], int *jstat ) { /* Sin and cos of J2000 mean obliquity (IAU 1976) */ const double SE=0.3977771559319137; const double CE=0.9174820620691818; int J; double PHT,ARGPH,Q,W,CM,ALPHA,PHS,SW,CW,SI,CI,SO,CO, X,Y,Z,PX,PY,PZ,VX,VY,VZ,DT,FC,FP,PSI, UL[13],PV[6]; /* Validate arguments. */ if (jform < 1 || jform > 3) { *jstat = -1; return; } if (e < 0.0 || e > 10.0 || (e >= 1.0 && jform != 3)) { *jstat = -2; return; } if (aorq <= 0.0) { *jstat = -3; return; } if (jform == 1 && dm <= 0.0) { *jstat = -4; return; } /* * Transform elements into standard form: * * PHT = epoch of perihelion passage * ARGPH = argument of perihelion (little omega) * Q = perihelion distance (q) * CM = combined mass, M+m (mu) */ if (jform == 1) { /* Major planet. */ PHT = epoch-(aorl-perih)/dm; ARGPH = perih-anode; Q = aorq*(1.0-e); W = dm/PAL__GCON; CM = W*W*aorq*aorq*aorq; } else if (jform == 2) { /* Minor planet. */ PHT = epoch-aorl*sqrt(aorq*aorq*aorq)/PAL__GCON; ARGPH = perih; Q = aorq*(1.0-e); CM = 1.0; } else { /* Comet. */ PHT = epoch; ARGPH = perih; Q = aorq; CM = 1.0; } /* The universal variable alpha. This is proportional to the total * energy of the orbit: -ve for an ellipse, zero for a parabola, * +ve for a hyperbola. */ ALPHA = CM*(e-1.0)/Q; /* Speed at perihelion. */ PHS = sqrt(ALPHA+2.0*CM/Q); /* In a Cartesian coordinate system which has the x-axis pointing * to perihelion and the z-axis normal to the orbit (such that the * object orbits counter-clockwise as seen from +ve z), the * perihelion position and velocity vectors are: * * position [Q,0,0] * velocity [0,PHS,0] * * To express the results in J2000 equatorial coordinates we make a * series of four rotations of the Cartesian axes: * * axis Euler angle * * 1 z argument of perihelion (little omega) * 2 x inclination (i) * 3 z longitude of the ascending node (big omega) * 4 x J2000 obliquity (epsilon) * * In each case the rotation is clockwise as seen from the +ve end of * the axis concerned. */ /* Functions of the Euler angles. */ SW = sin(ARGPH); CW = cos(ARGPH); SI = sin(orbinc); CI = cos(orbinc); SO = sin(anode); CO = cos(anode); /* Position at perihelion (AU). */ X = Q*CW; Y = Q*SW; Z = Y*SI; Y = Y*CI; PX = X*CO-Y*SO; Y = X*SO+Y*CO; PY = Y*CE-Z*SE; PZ = Y*SE+Z*CE; /* Velocity at perihelion (AU per canonical day). */ X = -PHS*SW; Y = PHS*CW; Z = Y*SI; Y = Y*CI; VX = X*CO-Y*SO; Y = X*SO+Y*CO; VY = Y*CE-Z*SE; VZ = Y*SE+Z*CE; /* Time from perihelion to date (in Canonical Days: a canonical day * is 58.1324409... days, defined as 1/PAL__GCON). */ DT = (date-PHT)*PAL__GCON; /* First approximation to the Universal Eccentric Anomaly, PSI, * based on the circle (FC) and parabola (FP) values. */ FC = DT/Q; W = pow(3.0*DT+sqrt(9.0*DT*DT+8.0*Q*Q*Q), 1.0/3.0); FP = W-2.0*Q/W; PSI = (1.0-e)*FC+e*FP; /* Assemble local copy of element set. */ UL[0] = CM; UL[1] = ALPHA; UL[2] = PHT; UL[3] = PX; UL[4] = PY; UL[5] = PZ; UL[6] = VX; UL[7] = VY; UL[8] = VZ; UL[9] = Q; UL[10] = 0.0; UL[11] = date; UL[12] = PSI; /* Predict position+velocity at epoch of osculation. */ palUe2pv( date, UL, PV, &J ); if (J != 0) { *jstat = -5; return; } /* Convert back to universal elements. */ palPv2ue( PV, date, CM-1.0, u, &J ); if (J != 0) { *jstat = -5; return; } /* OK exit. */ *jstat = 0; } pal-0.9.7/palEpco.c000066400000000000000000000054361302604645500140470ustar00rootroot00000000000000/* *+ * Name: * palEpco * Purpose: * Convert an epoch into the appropriate form - 'B' or 'J' * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * double palEpco( char k0, char k, double e ); * Arguments: * k0 = char (Given) * Form of result: 'B'=Besselian, 'J'=Julian * k = char (Given) * Form of given epoch: 'B' or 'J'. * Description: * Converts a Besselian or Julian epoch to a Julian or Besselian * epoch. * Authors: * PTW: Patrick T. Wallace * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - The result is always either equal to or very close to * the given epoch E. The routine is required only in * applications where punctilious treatment of heterogeneous * mixtures of star positions is necessary. * - k and k0 are case insensitive. This differes slightly from the * Fortran SLA implementation. * - k and k0 are not validated. They are interpreted as follows: * o If k0 and k are the same the result is e * o If k0 is 'b' or 'B' and k isn't the conversion is J to B. * o In all other cases, the conversion is B to J. * History: * 2012-03-01 (TIMJ): * Initial version. Documentation from SLA/F. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1995 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA. * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "pal1sofa.h" #include double palEpco( char k0, char k, double e ) { double new_epoch = 0.0; double djm; double djm0; /* Use upper case */ k0 = toupper( k0 ); k = toupper( k ); if (k == k0) { new_epoch = e; } else if (k0 == 'B') { eraEpj2jd( e, &djm0, &djm ); new_epoch = eraEpb( djm0, djm ); } else { eraEpb2jd( e, &djm0, &djm ); new_epoch = eraEpj( djm0, djm ); } return new_epoch; } pal-0.9.7/palEpv.c000066400000000000000000000050371302604645500137100ustar00rootroot00000000000000/* *+ * Name: * palEpv * Purpose: * Earth position and velocity with respect to the BCRS * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palEpv( double date, double ph[3], double vh[3], * double pb[3], double vb[3] ); * Arguments: * date = double (Given) * Date, TDB Modified Julian Date (JD-2400000.5) * ph = double [3] (Returned) * Heliocentric Earth position (AU) * vh = double [3] (Returned) * Heliocentric Earth velocity (AU/day) * pb = double [3] (Returned) * Barycentric Earth position (AU) * vb = double [3] (Returned) * Barycentric Earth velocity (AU/day) * Description: * Earth position and velocity, heliocentric and barycentric, with * respect to the Barycentric Celestial Reference System. * Authors: * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - See eraEpv00 for details on accuracy * - Note that the status argument from eraEpv00 is ignored * History: * 2012-03-12 (TIMJ): * Initial version * Adapted with permission from the Fortran SLALIB library * but now mainly calls SOFA routines. * {enter_further_changes_here} * Copyright: * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include "palmac.h" #include "pal.h" #include "pal1sofa.h" void palEpv( double date, double ph[3], double vh[3], double pb[3], double vb[3] ) { int i; double pvh[2][3]; double pvb[2][3]; eraEpv00( PAL__MJD0, date, pvh, pvb ); /* Copy into output arrays */ for (i=0; i<3; i++) { ph[i] = pvh[0][i]; vh[i] = pvh[1][i]; pb[i] = pvb[0][i]; vb[i] = pvb[1][i]; } } pal-0.9.7/palEqecl.c000066400000000000000000000053011302604645500142010ustar00rootroot00000000000000/* *+ * Name: * palEqecl * Purpose: * Transform from J2000.0 equatorial coordinates to ecliptic coordinates * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palEqecl( double dr, double dd, double date, * double *dl, double *db); * Arguments: * dr = double (Given) * J2000.0 mean RA (radians) * dd = double (Given) * J2000.0 mean Dec (Radians) * date = double (Given) * TT as Modified Julian Date (JD-2400000.5). The difference * between TT and TDB is of the order of a millisecond or two * (i.e. about 0.02 arc-seconds). * dl = double * (Returned) * Ecliptic longitude (mean of date, IAU 1980 theory, radians) * db = double * (Returned) * Ecliptic latitude (mean of date, IAU 1980 theory, radians) * Description: * Transform from J2000.0 equatorial coordinates to ecliptic coordinates. * Authors: * PTW: Patrick T. Wallace * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * History: * 2012-03-02 (TIMJ): * Initial version * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1995 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "pal1sofa.h" void palEqecl ( double dr, double dd, double date, double *dl, double *db ) { double v1[3], v2[3]; double rmat[3][3]; /* Spherical to Cartesian */ eraS2c( dr, dd, v1 ); /* Mean J2000 to mean of date */ palPrec( 2000.0, palEpj(date), rmat ); eraRxp( rmat, v1, v2 ); /* Equatorial to ecliptic */ palEcmat( date, rmat ); eraRxp( rmat, v2, v1 ); /* Cartesian to spherical */ eraC2s( v1, dl, db ); /* Express in conventional range */ *dl = eraAnp( *dl ); *db = palDrange( *db ); } pal-0.9.7/palEqgal.c000066400000000000000000000061501302604645500142040ustar00rootroot00000000000000/* *+ * Name: * palEqgal * Purpose: * Convert from J2000.0 equatorial coordinates to Galactic * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palEqgal ( double dr, double dd, double *dl, double *db ); * Arguments: * dr = double (Given) * J2000.0 RA (radians) * dd = double (Given) * J2000.0 Dec (radians * dl = double * (Returned) * Galactic longitude (radians). * db = double * (Returned) * Galactic latitude (radians). * Description: * Transformation from J2000.0 equatorial coordinates * to IAU 1958 galactic coordinates. * Authors: * PTW: Pat Wallace (STFC) * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * The equatorial coordinates are J2000.0. Use the routine * palGe50 if conversion to B1950.0 'FK4' coordinates is * required. * See Also: * Blaauw et al, Mon.Not.R.Astron.Soc.,121,123 (1960) * History: * 2012-02-12(TIMJ): * Initial version with documentation taken from Fortran SLA * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1998 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "pal1sofa.h" void palEqgal ( double dr, double dd, double *dl, double *db ) { double v1[3]; double v2[3]; /* * L2,B2 system of galactic coordinates * * P = 192.25 RA of galactic north pole (mean B1950.0) * Q = 62.6 inclination of galactic to mean B1950.0 equator * R = 33 longitude of ascending node * * P,Q,R are degrees * * Equatorial to galactic rotation matrix (J2000.0), obtained by * applying the standard FK4 to FK5 transformation, for zero proper * motion in FK5, to the columns of the B1950 equatorial to * galactic rotation matrix: */ double rmat[3][3] = { { -0.054875539726,-0.873437108010,-0.483834985808 }, { +0.494109453312,-0.444829589425,+0.746982251810 }, { -0.867666135858,-0.198076386122,+0.455983795705 } }; /* Spherical to Cartesian */ eraS2c( dr, dd, v1 ); /* Equatorial to Galactic */ eraRxp( rmat, v1, v2 ); /* Cartesian to spherical */ eraC2s( v2, dl, db ); /* Express in conventional ranges */ *dl = eraAnp( *dl ); *db = eraAnpm( *db ); } pal-0.9.7/palEtrms.c000066400000000000000000000054271302604645500142530ustar00rootroot00000000000000/* *+ * Name: * palEtrms * Purpose: * Compute the E-terms vector * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palEtrms ( double ep, double ev[3] ); * Arguments: * ep = double (Given) * Besselian epoch * ev = double [3] (Returned) * E-terms as (dx,dy,dz) * Description: * Computes the E-terms (elliptic component of annual aberration) * vector. * * Note the use of the J2000 aberration constant (20.49552 arcsec). * This is a reflection of the fact that the E-terms embodied in * existing star catalogues were computed from a variety of * aberration constants. Rather than adopting one of the old * constants the latest value is used here. * * See also: * - Smith, C.A. et al., 1989. Astr.J. 97, 265. * - Yallop, B.D. et al., 1989. Astr.J. 97, 274. * Authors: * PTW: Pat Wallace (STFC) * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * History: * 2012-02-12 (TIMJ): * Initial version with documentation taken from Fortran SLA * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1996 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "palmac.h" void palEtrms ( double ep, double ev[3] ) { /* Use the J2000 aberration constant */ const double ABCONST = 20.49552; double t, e, e0, p, ek, cp; /* Julian centuries since B1950 */ t = (ep - 1950.) * .0100002135903; /* Eccentricity */ e = .01673011 - (t * 1.26e-7 + 4.193e-5) * t; /* Mean obliquity */ e0 = (84404.836 - ((t * .00181 + .00319) * t + 46.8495) * t) * PAL__DAS2R; /* Mean longitude of perihelion */ p = (((t * .012 + 1.65) * t + 6190.67) * t + 1015489.951) * PAL__DAS2R; /* E-terms */ ek = e * ABCONST * PAL__DAS2R; cp = cos(p); ev[0] = ek * sin(p); ev[1] = -ek * cp * cos(e0); ev[2] = -ek * cp * sin(e0); } pal-0.9.7/palEvp.c000066400000000000000000000061661302604645500137140ustar00rootroot00000000000000/* *+ * Name: * palEvp * Purpose: * Returns the barycentric and heliocentric velocity and position of the * Earth. * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palEvp( double date, double deqx, double dvb[3], double dpb[3], * double dvh[3], double dph[3] ) * Arguments: * date = double (Given) * TDB (loosely ET) as a Modified Julian Date (JD-2400000.5) * deqx = double (Given) * Julian epoch (e.g. 2000.0) of mean equator and equinox of the * vectors returned. If deqx <= 0.0, all vectors are referred to the * mean equator and equinox (FK5) of epoch date. * dvb = double[3] (Returned) * Barycentric velocity (AU/s, AU) * dpb = double[3] (Returned) * Barycentric position (AU/s, AU) * dvh = double[3] (Returned) * heliocentric velocity (AU/s, AU) * dph = double[3] (Returned) * Heliocentric position (AU/s, AU) * Description: * Returns the barycentric and heliocentric velocity and position of the * Earth at a given epoch, given with respect to a specified equinox. * For information about accuracy, see the function eraEpv00. * Authors: * PTW: Pat Wallace (STFC) * {enter_new_authors_here} * History: * 2012-02-13 (PTW): * Initial version. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2005 Patrick T. Wallace * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "palmac.h" #include "pal1sofa.h" void palEvp( double date, double deqx, double dvb[3], double dpb[3], double dvh[3], double dph[3] ){ /* Local Variables; */ int i; double pvh[2][3], pvb[2][3], d1, d2, r[3][3]; /* BCRS PV-vectors. */ eraEpv00 ( 2400000.5, date, pvh, pvb ); /* Was precession to another equinox requested? */ if ( deqx > 0.0 ) { /* Yes: compute precession matrix from J2000.0 to deqx. */ eraEpj2jd ( deqx, &d1, &d2 ); eraPmat06 ( d1, d2, r ); /* Rotate the PV-vectors. */ eraRxpv ( r, pvh, pvh ); eraRxpv ( r, pvb, pvb ); } /* Return the required vectors. */ for ( i = 0; i < 3; i++ ) { dvh[i] = pvh[1][i] / PAL__SPD; dvb[i] = pvb[1][i] / PAL__SPD; dph[i] = pvh[0][i]; dpb[i] = pvb[0][i]; } } pal-0.9.7/palFk45z.c000066400000000000000000000143521302604645500140610ustar00rootroot00000000000000/* *+ * Name: * palFk45z * Purpose: * Convert B1950.0 FK4 star data to J2000.0 FK5 assuming zero * proper motion in the FK5 frame * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palFk45z( double r1950, double d1950, double bepoch, double *r2000, * double *d2000 ) * Arguments: * r1950 = double (Given) * B1950.0 FK4 RA at epoch (radians). * d1950 = double (Given) * B1950.0 FK4 Dec at epoch (radians). * bepoch = double (Given) * Besselian epoch (e.g. 1979.3) * r2000 = double (Returned) * J2000.0 FK5 RA (Radians). * d2000 = double (Returned) * J2000.0 FK5 Dec(Radians). * Description: * Convert B1950.0 FK4 star data to J2000.0 FK5 assuming zero * proper motion in the FK5 frame (double precision) * * This function converts stars from the Bessel-Newcomb, FK4 * system to the IAU 1976, FK5, Fricke system, in such a * way that the FK5 proper motion is zero. Because such a star * has, in general, a non-zero proper motion in the FK4 system, * the routine requires the epoch at which the position in the * FK4 system was determined. * * The method is from Appendix 2 of Ref 1, but using the constants * of Ref 4. * Notes: * - The epoch BEPOCH is strictly speaking Besselian, but if a * Julian epoch is supplied the result will be affected only to * a negligible extent. * * - Conversion from Besselian epoch 1950.0 to Julian epoch 2000.0 * only is provided for. Conversions involving other epochs will * require use of the appropriate precession, proper motion, and * E-terms routines before and/or after palFk45z is called. * * - In the FK4 catalogue the proper motions of stars within 10 * degrees of the poles do not embody the differential E-term effect * and should, strictly speaking, be handled in a different manner * from stars outside these regions. However, given the general lack * of homogeneity of the star data available for routine astrometry, * the difficulties of handling positions that may have been * determined from astrometric fields spanning the polar and non-polar * regions, the likelihood that the differential E-terms effect was not * taken into account when allowing for proper motion in past * astrometry, and the undesirability of a discontinuity in the * algorithm, the decision has been made in this routine to include the * effect of differential E-terms on the proper motions for all stars, * whether polar or not. At epoch 2000, and measuring on the sky rather * than in terms of dRA, the errors resulting from this simplification * are less than 1 milliarcsecond in position and 1 milliarcsecond per * century in proper motion. * * References: * - Aoki,S., et al, 1983. Astron.Astrophys., 128, 263. * - Smith, C.A. et al, 1989. "The transformation of astrometric * catalog systems to the equinox J2000.0". Astron.J. 97, 265. * - Yallop, B.D. et al, 1989. "Transformation of mean star places * from FK4 B1950.0 to FK5 J2000.0 using matrices in 6-space". * Astron.J. 97, 274. * - Seidelmann, P.K. (ed), 1992. "Explanatory Supplement to * the Astronomical Almanac", ISBN 0-935702-68-7. * Authors: * PTW: Pat Wallace (STFC) * DSB: David Berry (JAC, Hawaii) * {enter_new_authors_here} * History: * 2012-02-10 (DSB): * Initial version with documentation taken from Fortran SLA * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1998 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "palmac.h" #include "pal1sofa.h" void palFk45z( double r1950, double d1950, double bepoch, double *r2000, double *d2000 ){ /* Local Variables: */ double w; int i; int j; double r0[3], a1[3], v1[3], v2[6]; /* Position and position+velocity vectors */ /* CANONICAL CONSTANTS (see references) */ /* Vector A. */ double a[3] = { -1.62557E-6, -0.31919E-6, -0.13843E-6 }; /* Vectors Adot. */ double ad[3] = { 1.245E-3, -1.580E-3, -0.659E-3 }; /* Matrix M (only half of which is needed here). */ double em[6][3] = { {0.9999256782, -0.0111820611, -0.0048579477}, {0.0111820610, 0.9999374784, -0.0000271765}, {0.0048579479, -0.0000271474, 0.9999881997}, {-0.000551, -0.238565, 0.435739}, {0.238514, -0.002667, -0.008541}, {-0.435623, 0.012254, 0.002117} }; /* Spherical to Cartesian. */ eraS2c( r1950, d1950, r0 ); /* Adjust vector A to give zero proper motion in FK5. */ w = ( bepoch - 1950.0 )/PAL__PMF; for( i = 0; i < 3; i++ ) { a1[ i ] = a[ i ] + w*ad[ i ]; } /* Remove e-terms. */ w = r0[ 0 ]*a1[ 0 ] + r0[ 1 ]*a1[ 1 ] + r0[ 2 ]*a1[ 2 ]; for( i = 0; i < 3; i++ ) { v1[ i ] = r0[ i ] - a1[ i ] + w*r0[ i ]; } /* Convert position vector to Fricke system. */ for( i = 0; i < 6; i++ ) { w = 0.0; for( j = 0; j < 3; j++ ) { w += em[ i ][ j ]*v1[ j ]; } v2[ i ] = w; } /* Allow for fictitious proper motion in FK4. */ w = ( palEpj( palEpb2d( bepoch ) ) - 2000.0 )/PAL__PMF; for( i = 0; i < 3; i++ ) { v2[ i ] += w*v2[ i + 3 ]; } /* Revert to spherical coordinates. */ eraC2s( v2, &w, d2000 ); *r2000 = eraAnp( w ); } pal-0.9.7/palFk524.c000066400000000000000000000210111302604645500137370ustar00rootroot00000000000000/* *+ * Name: * palFk524 * Purpose: * Convert J2000.0 FK5 star data to B1950.0 FK4. * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palFk524( double r2000, double d2000, double dr2000, double dd2000, * double p2000, double v2000, double *r1950, double *d1950, * double *dr1950, double *dd1950, double *p1950, double *v1950 ) * Arguments: * r2000 = double (Given) * J2000.0 FK5 RA (radians). * d2000 = double (Given) * J2000.0 FK5 Dec (radians). * dr2000 = double (Given) * J2000.0 FK5 RA proper motion (rad/Jul.yr) * dd2000 = double (Given) * J2000.0 FK5 Dec proper motion (rad/Jul.yr) * p2000 = double (Given) * J2000.0 FK5 parallax (arcsec) * v2000 = double (Given) * J2000.0 FK5 radial velocity (km/s, +ve = moving away) * r1950 = double * (Returned) * B1950.0 FK4 RA (radians). * d1950 = double * (Returned) * B1950.0 FK4 Dec (radians). * dr1950 = double * (Returned) * B1950.0 FK4 RA proper motion (rad/Jul.yr) * dd1950 = double * (Returned) * B1950.0 FK4 Dec proper motion (rad/Jul.yr) * p1950 = double * (Returned) * B1950.0 FK4 parallax (arcsec) * v1950 = double * (Returned) * B1950.0 FK4 radial velocity (km/s, +ve = moving away) * Description: * This function converts stars from the IAU 1976, FK5, Fricke * system, to the Bessel-Newcomb, FK4 system. The precepts * of Smith et al (Ref 1) are followed, using the implementation * by Yallop et al (Ref 2) of a matrix method due to Standish. * Kinoshita's development of Andoyer's post-Newcomb precession is * used. The numerical constants from Seidelmann et al (Ref 3) are * used canonically. * Notes: * - The proper motions in RA are dRA/dt rather than * cos(Dec)*dRA/dt, and are per year rather than per century. * - Note that conversion from Julian epoch 2000.0 to Besselian * epoch 1950.0 only is provided for. Conversions involving * other epochs will require use of the appropriate precession, * proper motion, and E-terms routines before and/or after * FK524 is called. * - In the FK4 catalogue the proper motions of stars within * 10 degrees of the poles do not embody the differential * E-term effect and should, strictly speaking, be handled * in a different manner from stars outside these regions. * However, given the general lack of homogeneity of the star * data available for routine astrometry, the difficulties of * handling positions that may have been determined from * astrometric fields spanning the polar and non-polar regions, * the likelihood that the differential E-terms effect was not * taken into account when allowing for proper motion in past * astrometry, and the undesirability of a discontinuity in * the algorithm, the decision has been made in this routine to * include the effect of differential E-terms on the proper * motions for all stars, whether polar or not. At epoch 2000, * and measuring on the sky rather than in terms of dRA, the * errors resulting from this simplification are less than * 1 milliarcsecond in position and 1 milliarcsecond per * century in proper motion. * * References: * - Smith, C.A. et al, 1989. "The transformation of astrometric * catalog systems to the equinox J2000.0". Astron.J. 97, 265. * - Yallop, B.D. et al, 1989. "Transformation of mean star places * from FK4 B1950.0 to FK5 J2000.0 using matrices in 6-space". * Astron.J. 97, 274. * - Seidelmann, P.K. (ed), 1992. "Explanatory Supplement to * the Astronomical Almanac", ISBN 0-935702-68-7. * Authors: * PTW: Pat Wallace (STFC) * DSB: David Berry (JAC, Hawaii) * {enter_new_authors_here} * History: * 2012-02-13 (DSB): * Initial version with documentation taken from Fortran SLA * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1995 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "palmac.h" #include "math.h" void palFk524( double r2000, double d2000, double dr2000, double dd2000, double p2000, double v2000, double *r1950, double *d1950, double *dr1950, double *dd1950, double *p1950, double *v1950 ){ /* Local Variables; */ double r, d, ur, ud, px, rv; double sr, cr, sd, cd, x, y, z, w; double v1[ 6 ], v2[ 6 ]; double xd, yd, zd; double rxyz, wd, rxysq, rxy; int i, j; /* Small number to avoid arithmetic problems. */ static const double tiny = 1.0E-30; /* Canonical constants (see references). Constant vector and matrix. */ double a[ 6 ] = { -1.62557E-6, -0.31919E-6, -0.13843E-6, +1.245E-3, -1.580E-3, -0.659E-3 }; double emi[ 6 ][ 6 ] = { { 0.9999256795, 0.0111814828, 0.0048590039, -0.00000242389840, -0.00000002710544, -0.00000001177742}, {-0.0111814828, 0.9999374849, -0.0000271771, 0.00000002710544, -0.00000242392702, 0.00000000006585 }, {-0.0048590040, -0.0000271557, 0.9999881946, 0.00000001177742, 0.00000000006585, -0.00000242404995 }, {-0.000551, 0.238509, -0.435614, 0.99990432, 0.01118145, 0.00485852 }, {-0.238560, -0.002667, 0.012254, -0.01118145, 0.99991613, -0.00002717}, { 0.435730, -0.008541, 0.002117, -0.00485852, -0.00002716, 0.99996684 } }; /* Pick up J2000 data (units radians and arcsec/JC). */ r = r2000; d = d2000; ur = dr2000*PAL__PMF; ud = dd2000*PAL__PMF; px = p2000; rv = v2000; /* Spherical to Cartesian. */ sr = sin( r ); cr = cos( r ); sd = sin( d ); cd = cos( d ); x = cr*cd; y = sr*cd; z = sd; w = PAL__VF*rv*px; v1[ 0 ] = x; v1[ 1 ] = y; v1[ 2 ] = z; v1[ 3 ] = -ur*y - cr*sd*ud + w*x; v1[ 4 ] = ur*x - sr*sd*ud + w*y; v1[ 5 ] = cd*ud + w*z; /* Convert position+velocity vector to BN system. */ for( i = 0; i < 6; i++ ) { w = 0.0; for( j = 0; j < 6; j++ ) { w += emi[ i ][ j ]*v1[ j ]; } v2[ i ] = w; } /* Position vector components and magnitude. */ x = v2[ 0 ]; y = v2[ 1 ]; z = v2[ 2 ]; rxyz = sqrt( x*x + y*y + z*z ); /* Apply E-terms to position. */ w = x*a[ 0 ] + y*a[ 1 ] + z*a[ 2 ]; x += a[ 0 ]*rxyz - w*x; y += a[ 1 ]*rxyz - w*y; z += a[ 2 ]*rxyz - w*z; /* Recompute magnitude. */ rxyz = sqrt( x*x + y*y + z*z ); /* Apply E-terms to both position and velocity. */ x = v2[ 0 ]; y = v2[ 1 ]; z = v2[ 2 ]; w = x*a[ 0 ] + y*a[ 1 ] + z*a[ 2 ]; wd = x*a[ 3 ] + y*a[ 4 ] + z*a[ 5 ]; x += a[ 0 ]*rxyz - w*x; y += a[ 1 ]*rxyz - w*y; z += a[ 2 ]*rxyz - w*z; xd = v2[ 3 ] + a[ 3 ]*rxyz - wd*x; yd = v2[ 4 ] + a[ 4 ]*rxyz - wd*y; zd = v2[ 5 ] + a[ 5 ]*rxyz - wd*z; /* Convert to spherical. */ rxysq = x*x + y*y; rxy = sqrt( rxysq ); if( x == 0.0 && y == 0.0 ) { r = 0.0; } else { r = atan2( y, x ); if( r < 0.0 ) r += PAL__D2PI; } d = atan2( z, rxy ); if( rxy > tiny ) { ur = ( x*yd - y*xd )/rxysq; ud = ( zd*rxysq - z*( x*xd + y*yd ) )/( ( rxysq + z*z )*rxy ); } /* Radial velocity and parallax. */ if( px > tiny ) { rv = ( x*xd + y*yd + z*zd )/( px*PAL__VF*rxyz ); px /= rxyz; } /* Return results. */ *r1950 = r; *d1950 = d; *dr1950 = ur/PAL__PMF; *dd1950 = ud/PAL__PMF; *p1950 = px; *v1950 = rv; } pal-0.9.7/palFk54z.c000066400000000000000000000072731302604645500140650ustar00rootroot00000000000000/* *+ * Name: * palFk54z * Purpose: * Convert a J2000.0 FK5 star position to B1950.0 FK4 assuming * zero proper motion and parallax. * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palFk54z( double r2000, double d2000, double bepoch, double *r1950, * double *d1950, double *dr1950, double *dd1950 ) * Arguments: * r2000 = double (Given) * J2000.0 FK5 RA (radians). * d2000 = double (Given) * J2000.0 FK5 Dec (radians). * bepoch = double (Given) * Besselian epoch (e.g. 1950.0). * r1950 = double * (Returned) * B1950 FK4 RA (radians) at epoch "bepoch". * d1950 = double * (Returned) * B1950 FK4 Dec (radians) at epoch "bepoch". * dr1950 = double * (Returned) * B1950 FK4 proper motion (RA) (radians/trop.yr)). * dr1950 = double * (Returned) * B1950 FK4 proper motion (Dec) (radians/trop.yr)). * Description: * This function converts star positions from the IAU 1976, * FK5, Fricke system to the Bessel-Newcomb, FK4 system. * Notes: * - The proper motion in RA is dRA/dt rather than cos(Dec)*dRA/dt. * - Conversion from Julian epoch 2000.0 to Besselian epoch 1950.0 * only is provided for. Conversions involving other epochs will * require use of the appropriate precession functions before and * after this function is called. * - The FK5 proper motions, the parallax and the radial velocity * are presumed zero. * - It is the intention that FK5 should be a close approximation * to an inertial frame, so that distant objects have zero proper * motion; such objects have (in general) non-zero proper motion * in FK4, and this function returns those fictitious proper * motions. * - The position returned by this function is in the B1950 * reference frame but at Besselian epoch BEPOCH. For comparison * with catalogues the "bepoch" argument will frequently be 1950.0. * Authors: * PTW: Pat Wallace (STFC) * DSB: David Berry (JAC, Hawaii) * {enter_new_authors_here} * History: * 2012-02-13 (DSB): * Initial version with documentation taken from Fortran SLA * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1995 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "pal1sofa.h" void palFk54z( double r2000, double d2000, double bepoch, double *r1950, double *d1950, double *dr1950, double *dd1950 ){ /* Local Variables: */ double r, d, px, rv, y; /* FK5 equinox J2000 (any epoch) to FK4 equinox B1950 epoch B1950. */ palFk524( r2000, d2000, 0.0, 0.0, 0.0, 0.0, &r, &d, dr1950, dd1950, &px, &rv ); /* Fictitious proper motion to epoch "bepoch". */ y = bepoch - 1950.0; *r1950 = r + *dr1950*y; *d1950 = d + *dd1950*y; } pal-0.9.7/palGaleq.c000066400000000000000000000061521302604645500142060ustar00rootroot00000000000000/* *+ * Name: * palGaleq * Purpose: * Convert from galactic to J2000.0 equatorial coordinates * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palGaleq ( double dl, double db, double *dr, double *dd ); * Arguments: * dl = double (Given) * Galactic longitude (radians). * db = double (Given) * Galactic latitude (radians). * dr = double * (Returned) * J2000.0 RA (radians) * dd = double * (Returned) * J2000.0 Dec (radians) * Description: * Transformation from IAU 1958 galactic coordinates to * J2000.0 equatorial coordinates. * Authors: * PTW: Pat Wallace (STFC) * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * The equatorial coordinates are J2000.0. Use the routine * palGe50 if conversion to B1950.0 'FK4' coordinates is * required. * See Also: * Blaauw et al, Mon.Not.R.Astron.Soc.,121,123 (1960) * History: * 2012-02-12(TIMJ): * Initial version with documentation taken from Fortran SLA * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1998 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "pal1sofa.h" void palGaleq ( double dl, double db, double *dr, double *dd ) { double v1[3]; double v2[3]; /* * L2,B2 system of galactic coordinates * * P = 192.25 RA of galactic north pole (mean B1950.0) * Q = 62.6 inclination of galactic to mean B1950.0 equator * R = 33 longitude of ascending node * * P,Q,R are degrees * * Equatorial to galactic rotation matrix (J2000.0), obtained by * applying the standard FK4 to FK5 transformation, for zero proper * motion in FK5, to the columns of the B1950 equatorial to * galactic rotation matrix: */ double rmat[3][3] = { { -0.054875539726,-0.873437108010,-0.483834985808 }, { +0.494109453312,-0.444829589425,+0.746982251810 }, { -0.867666135858,-0.198076386122,+0.455983795705 } }; /* Spherical to Cartesian */ eraS2c( dl, db, v1 ); /* Galactic to equatorial */ eraTrxp( rmat, v1, v2 ); /* Cartesian to spherical */ eraC2s( v2, dr, dd ); /* Express in conventional ranges */ *dr = eraAnp( *dr ); *dd = eraAnpm( *dd ); } pal-0.9.7/palGalsup.c000066400000000000000000000061231302604645500144060ustar00rootroot00000000000000/* *+ * Name: * palGalsup * Purpose: * Convert from galactic to supergalactic coordinates * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palGalsup ( double dl, double db, double *dsl, double *dsb ); * Arguments: * dl = double (Given) * Galactic longitude. * db = double (Given) * Galactic latitude. * dsl = double * (Returned) * Supergalactic longitude. * dsb = double * (Returned) * Supergalactic latitude. * Description: * Transformation from IAU 1958 galactic coordinates to * de Vaucouleurs supergalactic coordinates. * Authors: * PTW: Pat Wallace (STFC) * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * See Also: * - de Vaucouleurs, de Vaucouleurs, & Corwin, Second Reference * Catalogue of Bright Galaxies, U. Texas, page 8. * - Systems & Applied Sciences Corp., Documentation for the * machine-readable version of the above catalogue, * Contract NAS 5-26490. * * (These two references give different values for the galactic * longitude of the supergalactic origin. Both are wrong; the * correct value is L2=137.37.) * History: * 2012-02-12(TIMJ): * Initial version with documentation taken from Fortran SLA * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1999 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "pal1sofa.h" void palGalsup ( double dl, double db, double *dsl, double *dsb ) { double v1[3]; double v2[3]; /* * System of supergalactic coordinates: * * SGL SGB L2 B2 (deg) * - +90 47.37 +6.32 * 0 0 - 0 * * Galactic to supergalactic rotation matrix: */ double rmat[3][3] = { { -0.735742574804,+0.677261296414,+0.000000000000 }, { -0.074553778365,-0.080991471307,+0.993922590400 }, { +0.673145302109,+0.731271165817,+0.110081262225 } }; /* Spherical to Cartesian */ eraS2c( dl, db, v1 ); /* Galactic to Supergalactic */ eraRxp( rmat, v1, v2 ); /* Cartesian to spherical */ eraC2s( v2, dsl, dsb ); /* Express in conventional ranges */ *dsl = eraAnp( *dsl ); *dsb = eraAnpm( *dsb ); } pal-0.9.7/palGe50.c000066400000000000000000000064001302604645500136510ustar00rootroot00000000000000/* *+ * Name: * palGe50 * Purpose: * Transform Galactic Coordinate to B1950 FK4 * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palGe50( double dl, double db, double *dr, double *dd ); * Arguments: * dl = double (Given) * Galactic longitude (radians) * db = double (Given) * Galactic latitude (radians) * dr = double * (Returned) * B9150.0 FK4 RA. * dd = double * (Returned) * B1950.0 FK4 Dec. * Description: * Transformation from IAU 1958 galactic coordinates to * B1950.0 'FK4' equatorial coordinates. * Authors: * PTW: Patrick T. Wallace * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - The equatorial coordinates are B1950.0 'FK4'. Use the routine * palGaleq if conversion to J2000.0 coordinates is required. * See Also: * - Blaauw et al, Mon.Not.R.Astron.Soc.,121,123 (1960) * History: * 2012-03-23 (TIMJ): * Initial version * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1995 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "pal1sofa.h" void palGe50 ( double dl, double db, double * dr, double * dd ) { /* * L2,B2 system of galactic coordinates * * P = 192.25 RA of galactic north pole (mean B1950.0) * Q = 62.6 inclination of galactic to mean B1950.0 equator * R = 33 longitude of ascending node * * P,Q,R are degrees * * * Equatorial to galactic rotation matrix * * The Euler angles are P, Q, 90-R, about the z then y then * z axes. * * +CP.CQ.SR-SP.CR +SP.CQ.SR+CP.CR -SQ.SR * * -CP.CQ.CR-SP.SR -SP.CQ.CR+CP.SR +SQ.CR * * +CP.SQ +SP.SQ +CQ * */ double rmat[3][3] = { { -0.066988739415,-0.872755765852,-0.483538914632 }, { +0.492728466075,-0.450346958020,+0.744584633283 }, { -0.867600811151,-0.188374601723,+0.460199784784 } }; double v1[3], v2[3], r, d, re, de; /* Spherical to cartesian */ eraS2c( dl, db, v1 ); /* Rotate to mean B1950.0 */ eraTrxp( rmat, v1, v2 ); /* Cartesian to spherical */ eraC2s( v2, &r, &d ); /* Introduce E-terms */ palAddet( r, d, 1950.0, &re, &de ); /* Express in conventional ranges */ *dr = eraAnp( re ); *dd = eraAnpm( de ); } pal-0.9.7/palGeoc.c000066400000000000000000000044061302604645500140320ustar00rootroot00000000000000/* *+ * Name: * palGeoc * Purpose: * Convert geodetic position to geocentric * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palGeoc( double p, double h, double * r, double *z ); * Arguments: * p = double (Given) * latitude (radians) * h = double (Given) * height above reference spheroid (geodetic, metres) * r = double * (Returned) * distance from Earth axis (AU) * z = double * (Returned) * distance from plane of Earth equator (AU) * Description: * Convert geodetic position to geocentric. * Authors: * PTW: Patrick T. Wallace * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - Geocentric latitude can be obtained by evaluating atan2(z,r) * - Uses WGS84 reference ellipsoid and calls eraGd2gc * History: * 2012-03-01 (TIMJ): * Initial version moved from palOne2One * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2004 Patrick T. Wallace * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "pal1sofa.h" void palGeoc ( double p, double h, double *r, double *z ) { double xyz[3]; const double elong = 0.0; /* Use zero longitude */ const double AU = 1.49597870E11; /* WGS84 looks to be the closest match */ eraGd2gc( ERFA_WGS84, elong, p, h, xyz ); *r = xyz[0] / (AU * cos(elong) ); *z = xyz[2] / AU; } pal-0.9.7/palIntin.c000066400000000000000000000123701302604645500142350ustar00rootroot00000000000000/* *+ * Name: * palIntin * Purpose: * Convert free-format input into an integer * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palIntin( const char * string, int *nstrt, * long *ireslt, int *jflag ); * Arguments: * string = const char * (Given) * String containing number to be decoded. * nstrt = int * (Given and Returned) * Character number indicating where decoding should start. * On output its value is updated to be the location of the * possible next value. For compatibility with SLA the first * character is index 1. * ireslt = long * (Returned) * Result. Not updated when jflag=1. * jflag = int * (Returned) * status: -1 = -OK, 0 = +OK, 1 = null, 2 = error * Description: * Extracts a number from an input string starting at the specified * index. * Authors: * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - Uses the strtol() system call to do the parsing. This may lead to * subtle differences when compared to the SLA/F parsing. * - Commas are recognized as a special case and are skipped if one happens * to be the next character when updating nstrt. Additionally the output * nstrt position will skip past any trailing space. * - If no number can be found flag will be set to 1. * - If the number overflows or underflows jflag will be set to 2. For overflow * the returned result will have the value LONG_MAX, for underflow it * will have the value LONG_MIN. * History: * 2012-03-15 (TIMJ): * Initial version * Matches the SLALIB interface but brand new implementation using * C library calls and not a direct port of the Fortran. * 2014-08-07 (TIMJ): * Check for isblank availability. * {enter_further_changes_here} * Copyright: * Copyright (C) 2012,2014 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #if HAVE_CONFIG_H # include #endif #include #include /* isblank() is a C99 feature so we just reimplement it if it is missing */ #if HAVE_ISBLANK #ifndef _ISOC99_SOURCE #define _ISOC99_SOURCE #endif #include # define ISBLANK isblank #else static int ISBLANK( int c ) { return ( c == ' ' || c == '\t' ); } #endif /* Still need ctype for isalpha and isdigit */ #include #include "pal.h" void palIntin( const char * string, int *nstrt, long *ireslt, int *jflag ) { const char *strstart = NULL; /* Pointer to start of search */ const char * ctemp = NULL; /* Pointer into string */ char * endptr = NULL;/* Pointer to string after number */ int retval; /* Return value from strtol */ int hasminus; /* is this a -0 */ /* strtol man page indicates that we should reset errno before calling strtod */ errno = 0; /* Locate the start postion */ strstart = &(string[*nstrt-1]); /* We have to be able to deal with -0 so we have to search the string first and look for the negative */ hasminus = 0; ctemp = strstart; while ( ctemp != '\0' ) { if (isdigit(*ctemp)) break; /* Reset so that - 12345 is not a negative number */ hasminus = 0; /* Flag that we have found a minus */ if (*ctemp == '-') hasminus = 1; ctemp++; } /* Look for the number using the system call, offsetting using 1-based counter. */ retval = strtol( strstart, &endptr, 10 ); if (retval == 0.0 && endptr == strstart) { /* conversion did not find anything */ *jflag = 1; /* but SLA compatibility requires that we step through to remove leading spaces. We also step through alphabetic characters since they can never be numbers. Skip past a "+" since it doesn't gain us anything and matches slalib. */ while (ISBLANK(*endptr) || isalpha(*endptr) || *endptr == '+' ) { endptr++; } } else if ( errno == ERANGE ) { *jflag = 2; } else { if ( retval < 0 || hasminus ) { *jflag = -1; } else { *jflag = 0; } } /* Sort out the position for the next index */ *nstrt = endptr - string + 1; /* Skip a comma */ if (*endptr == ',') { (*nstrt)++; } else { /* jump past any leading spaces for the next part of the string */ ctemp = endptr; while ( ISBLANK(*ctemp) ) { (*nstrt)++; ctemp++; } } /* And the result unless we found nothing */ if (*jflag != 1) *ireslt = retval; } pal-0.9.7/palMap.c000066400000000000000000000102331302604645500136650ustar00rootroot00000000000000/* *+ * Name: * palMap * Purpose: * Convert star RA,Dec from mean place to geocentric apparent * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palMap( double rm, double dm, double pr, double pd, * double px, double rv, double eq, double date, * double *ra, double *da ); * Arguments: * rm = double (Given) * Mean RA (radians) * dm = double (Given) * Mean declination (radians) * pr = double (Given) * RA proper motion, changes per Julian year (radians) * pd = double (Given) * Dec proper motion, changes per Julian year (radians) * px = double (Given) * Parallax (arcsec) * rv = double (Given) * Radial velocity (km/s, +ve if receding) * eq = double (Given) * Epoch and equinox of star data (Julian) * date = double (Given) * TDB for apparent place (JD-2400000.5) * ra = double * (Returned) * Apparent RA (radians) * dec = double * (Returned) * Apparent dec (radians) * Description: * Convert star RA,Dec from mean place to geocentric apparent. * Authors: * PTW: Patrick T. Wallace * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - Calls palMappa and palMapqk * - The reference systems and timescales used are IAU 2006. * - EQ is the Julian epoch specifying both the reference frame and * the epoch of the position - usually 2000. For positions where * the epoch and equinox are different, use the routine palPm to * apply proper motion corrections before using this routine. * * - The distinction between the required TDB and TT is always * negligible. Moreover, for all but the most critical * applications UTC is adequate. * * - The proper motions in RA are dRA/dt rather than cos(Dec)*dRA/dt. * * - This routine may be wasteful for some applications because it * recomputes the Earth position/velocity and the precession- * nutation matrix each time, and because it allows for parallax * and proper motion. Where multiple transformations are to be * carried out for one epoch, a faster method is to call the * palMappa routine once and then either the palMapqk routine * (which includes parallax and proper motion) or palMapqkz (which * assumes zero parallax and proper motion). * * - The accuracy is sub-milliarcsecond, limited by the * precession-nutation model (see palPrenut for details). * * - The accuracy is further limited by the routine palEvp, called * by palMappa, which computes the Earth position and velocity. * See eraEpv00 for details on that calculation. * History: * 2012-03-01 (TIMJ): * Initial version * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2001 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA. * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" void palMap( double rm, double dm, double pr, double pd, double px, double rv, double eq, double date, double *ra, double *da ) { double amprms[21]; /* Star independent parameters */ palMappa( eq, date, amprms ); /* Mean to apparent */ palMapqk( rm, dm, pr, pd, px, rv, amprms, ra, da ); } pal-0.9.7/palMappa.c000066400000000000000000000076111302604645500142140ustar00rootroot00000000000000/* *+ * Name: * palMappa * Purpose: * Compute parameters needed by palAmpqk and palMapqk. * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palMappa( double eq, double date, double amprms[21] ) * Arguments: * eq = double (Given) * epoch of mean equinox to be used (Julian) * date = double (Given) * TDB (JD-2400000.5) * amprms = double[21] (Returned) * star-independent mean-to-apparent parameters: * - (0) time interval for proper motion (Julian years) * - (1-3) barycentric position of the Earth (AU) * - (4-6) heliocentric direction of the Earth (unit vector) * - (7) (Schwarzschild radius of Sun)/(Sun-Earth distance) * - (8-10) abv: barycentric Earth velocity in units of c * - (11) sqrt(1-v^2) where v=modulus(abv) * - (12-20) precession/nutation (3,3) matrix * Description: * Compute star-independent parameters in preparation for * transformations between mean place and geocentric apparent place. * * The parameters produced by this function are required in the * parallax, aberration, and nutation/bias/precession parts of the * mean/apparent transformations. * * The reference systems and timescales used are IAU 2006. * Notes: * - For date, the distinction between the required TDB and TT * is always negligible. Moreover, for all but the most * critical applications UTC is adequate. * - The vector amprms(1-3) is referred to the mean equinox and * equator of epoch eq. * - The parameters amprms produced by this function are used by * palAmpqk, palMapqk and palMapqkz. * Authors: * PTW: Pat Wallace (STFC) * {enter_new_authors_here} * History: * 2012-02-13 (PTW): * Initial version. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2003 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "palmac.h" #include "pal1sofa.h" #include void palMappa( double eq, double date, double amprms[21] ){ /* Local constants */ /* Gravitational radius of the Sun x 2 (2*mu/c**2, AU) */ const double GR2 = 2.0 * 9.87063e-9; /* Local Variables; */ int i; double ebd[ 3 ], ehd[ 3 ], eh[ 3 ], e, vn[ 3 ], vm; /* Initialise so that unsused values are returned holding zero */ memset( amprms, 0, 21*sizeof( *amprms ) ); /* Time interval for proper motion correction. */ amprms[ 0 ] = eraEpj( PAL__MJD0, date ) - eq; /* Get Earth barycentric and heliocentric position and velocity. */ palEvp( date, eq, ebd, &rms[ 1 ], ehd, eh ); /* Heliocentric direction of Earth (normalized) and modulus. */ eraPn( eh, &e, &rms[ 4 ] ); /* Light deflection parameter */ amprms[7] = GR2 / e; /* Aberration parameters. */ for( i = 0; i < 3; i++ ) { amprms[ i + 8 ] = ebd[ i ]*PAL__CR; } eraPn( &rms[8], &vm, vn ); amprms[ 11 ] = sqrt( 1.0 - vm*vm ); /* NPB matrix. */ palPrenut( eq, date, (double(*)[ 3 ]) &rms[ 12 ] ); } pal-0.9.7/palMapqk.c000066400000000000000000000126731302604645500142330ustar00rootroot00000000000000/* *+ * Name: * palMapqk * Purpose: * Quick mean to apparent place * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palMapqk ( double rm, double dm, double pr, double pd, * double px, double rv, double amprms[21], * double *ra, double *da ); * Arguments: * rm = double (Given) * Mean RA (radians) * dm = double (Given) * Mean declination (radians) * pr = double (Given) * RA proper motion, changes per Julian year (radians) * pd = double (Given) * Dec proper motion, changes per Julian year (radians) * px = double (Given) * Parallax (arcsec) * rv = double (Given) * Radial velocity (km/s, +ve if receding) * amprms = double [21] (Given) * Star-independent mean-to-apparent parameters (see palMappa). * ra = double * (Returned) * Apparent RA (radians) * dec = double * (Returned) * Apparent dec (radians) * Description: * Quick mean to apparent place: transform a star RA,Dec from * mean place to geocentric apparent place, given the * star-independent parameters. * * Use of this routine is appropriate when efficiency is important * and where many star positions, all referred to the same equator * and equinox, are to be transformed for one epoch. The * star-independent parameters can be obtained by calling the * palMappa routine. * * If the parallax and proper motions are zero the palMapqkz * routine can be used instead. * Notes: * - The reference frames and timescales used are post IAU 2006. * - The mean place rm, dm and the vectors amprms[1-3] and amprms[4-6] * are referred to the mean equinox and equator of the epoch * specified when generating the precession/nutation matrix * amprms[12-20]. In the call to palMappa (q.v.) normally used * to populate amprms, this epoch is the first argument (eq). * - Strictly speaking, the routine is not valid for solar-system * sources, though the error will usually be extremely small. * However, to prevent gross errors in the case where the * position of the Sun is specified, the gravitational * deflection term is restrained within about 920 arcsec of the * centre of the Sun's disc. The term has a maximum value of * about 1.85 arcsec at this radius, and decreases to zero as * the centre of the disc is approached. * Authors: * PTW: Patrick T. Wallace * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * History: * 2012-03-01 (TIMJ): * Initial version with documentation from SLA/F * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2000 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "palmac.h" #include "pal1sofa.h" void palMapqk ( double rm, double dm, double pr, double pd, double px, double rv, double amprms[21], double *ra, double *da ) { /* local constants */ const double VF = 0.210945028; /* Km/s to AU/year */ /* Local Variables: */ int i; double ab1, abv[3], p[3], w, p1dv, p2[3], p3[3]; double pmt, gr2e, eb[3], q[3], pxr, em[3]; double pde, pdep1, p1[3], ehn[3], pn[3]; /* Unpack scalar and vector parameters. */ pmt = amprms[0]; gr2e = amprms[7]; ab1 = amprms[11]; for( i = 0; i < 3; i++ ) { eb[i] = amprms[i+1]; ehn[i] = amprms[i+4]; abv[i] = amprms[i+8]; } /* Spherical to x,y,z. */ eraS2c( rm, dm, q); /* Space motion (radians per year) */ pxr = px * PAL__DAS2R; w = VF * rv * pxr; em[0] = -pr * q[1] - pd * cos(rm) * sin(dm) + w * q[0]; em[1] = pr * q[0] - pd * sin(rm) * sin(dm) + w * q[1]; em[2] = pd * cos(dm) + w * q[2]; /* Geocentric direction of star (normalised) */ for( i = 0; i < 3; i++ ) { p[i] = q[i] + pmt * em[i] - pxr * eb[i]; } eraPn( p, &w, pn ); /* Light deflection (restrained within the Sun's disc) */ pde = eraPdp( pn, ehn ); pdep1 = pde + 1.0; w = gr2e / ( pdep1 > 1.0e-5 ? pdep1 : 1.0e-5 ); for( i = 0; i < 3; i++) { p1[i] = pn[i] + w * ( ehn[i] - pde * pn[i] ); } /* Aberration (normalisation omitted). */ p1dv = eraPdp( p, abv ); w = 1.0 + p1dv / ( ab1 + 1.0 ); for( i = 0; i < 3; i++ ) { p2[i] = ( ab1 * p1[i] ) + ( w * abv[i] ); } /* Precession and nutation. */ eraRxp( (double(*)[3]) &rms[12], p2, p3 ); /* Geocentric apparent RA,dec. */ eraC2s( p3, ra, da ); *ra = eraAnp( *ra ); } pal-0.9.7/palMapqkz.c000066400000000000000000000114761302604645500144250ustar00rootroot00000000000000/* *+ * Name: * palMapqkz * Purpose: * Quick mean to apparent place (no proper motion or parallax). * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palMapqkz( double rm, double dm, double amprms[21], * double *ra, double *da ) * Arguments: * rm = double (Given) * Mean RA (radians). * dm = double (Given) * Mean Dec (radians). * amprms = double[21] (Given) * Star-independent mean-to-apparent parameters (see palMappa): * (0-3) not used * (4-6) heliocentric direction of the Earth (unit vector) * (7) not used * (8-10) abv: barycentric Earth velocity in units of c * (11) sqrt(1-v^2) where v=modulus(abv) * (12-20) precession/nutation (3,3) matrix * ra = double * (Returned) * Apparent RA (radians). * da = double * (Returned) * Apparent Dec (radians). * Description: * Quick mean to apparent place: transform a star RA,dec from * mean place to geocentric apparent place, given the * star-independent parameters, and assuming zero parallax * and proper motion. * * Use of this function is appropriate when efficiency is important * and where many star positions, all with parallax and proper * motion either zero or already allowed for, and all referred to * the same equator and equinox, are to be transformed for one * epoch. The star-independent parameters can be obtained by * calling the palMappa function. * * The corresponding function for the case of non-zero parallax * and proper motion is palMapqk. * Notes: * - The reference systems and timescales used are IAU 2006. * - The mean place rm, dm and the vectors amprms[1-3] and amprms[4-6] * are referred to the mean equinox and equator of the epoch * specified when generating the precession/nutation matrix * amprms[12-20]. In the call to palMappa (q.v.) normally used * to populate amprms, this epoch is the first argument (eq). * - The vector amprms(4-6) is referred to the mean equinox and * equator of epoch eq. * - Strictly speaking, the routine is not valid for solar-system * sources, though the error will usually be extremely small. * However, to prevent gross errors in the case where the * position of the Sun is specified, the gravitational * deflection term is restrained within about 920 arcsec of the * centre of the Sun's disc. The term has a maximum value of * about 1.85 arcsec at this radius, and decreases to zero as * the centre of the disc is approached. * Authors: * PTW: Pat Wallace (STFC) * {enter_new_authors_here} * History: * 2012-02-13 (PTW): * Initial version. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1999 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "pal1sofa.h" void palMapqkz ( double rm, double dm, double amprms[21], double *ra, double *da ){ /* Local Variables: */ int i; double ab1, abv[3], p[3], w, p1dv, p2[3], p3[3]; double gr2e, pde, pdep1, ehn[3], p1[3]; /* Unpack scalar and vector parameters. */ ab1 = amprms[11]; gr2e = amprms[7]; for( i = 0; i < 3; i++ ) { abv[i] = amprms[i+8]; ehn[i] = amprms[i+4]; } /* Spherical to x,y,z. */ eraS2c( rm, dm, p ); /* Light deflection (restrained within the Sun's disc) */ pde = eraPdp( p, ehn ); pdep1 = pde + 1.0; w = gr2e / ( pdep1 > 1.0e-5 ? pdep1 : 1.0e-5 ); for( i = 0; i < 3; i++) { p1[i] = p[i] + w * ( ehn[i] - pde * p[i] ); } /* Aberration. */ p1dv = eraPdp( p1, abv ); w = 1.0 + p1dv / ( ab1 + 1.0 ); for( i = 0; i < 3; i++ ) { p2[i] = ( ( ab1 * p1[i] ) + ( w * abv[i] ) ); } /* Precession and nutation. */ eraRxp( (double(*)[3]) &rms[12], p2, p3 ); /* Geocentric apparent RA,dec. */ eraC2s( p3, ra, da ); *ra = eraAnp( *ra ); } pal-0.9.7/palNut.c000066400000000000000000000045611302604645500137250ustar00rootroot00000000000000/* *+ * Name: * palNut * Purpose: * Form the matrix of nutation * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palNut( double date, double rmatn[3][3] ); * Arguments: * date = double (Given) * TT as modified Julian date (JD-2400000.5) * rmatn = double [3][3] (Returned) * Nutation matrix in the sense v(true)=rmatn * v(mean) * where v(true) is the star vector relative to the * true equator and equinox of date and v(mean) is the * star vector relative to the mean equator and equinox * of date. * Description: * Form the matrix of nutation for a given date using * the IAU 2006 nutation model and palDeuler. * Authors: * PTW: Patrick T. Wallace * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - Uses eraNut06a via palNutc * - The distinction between TDB and TT is negligible. For all but * the most critical applications UTC is adequate. * History: * 2012-03-07 (TIMJ): * Initial version * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2005 Patrick T. Wallace * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" void palNut( double date, double rmatn[3][3]) { double dpsi, deps, eps0; /* Nutation component and mean obliquity */ palNutc( date, &dpsi, &deps, &eps0 ); /* Rotation matrix */ palDeuler( "XZX", eps0, -dpsi, -(eps0+deps), rmatn ); } pal-0.9.7/palNutc.c000066400000000000000000000043331302604645500140650ustar00rootroot00000000000000/* *+ * Name: * palNutc * Purpose: * Calculate nutation longitude & obliquoty components * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palNutc( double date, double * dpsi, double *deps, double *eps0 ); * Arguments: * date = double (Given) * TT as modified Julian date (JD-2400000.5) * dpsi = double * (Returned) * Nutation in longitude * deps = double * (Returned) * Nutation in obliquity * eps0 = double * (Returned) * Mean obliquity. * Description: * Calculates the longitude * obliquity components and mean obliquity * using the SOFA/ERFA library. * Authors: * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - Calls eraObl06 and eraNut06a and therefore uses the IAU 206 * precession/nutation model. * - Note the change from SLA/F regarding the date. TT is used * rather than TDB. * History: * 2012-03-05 (TIMJ): * Initial version * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "palmac.h" #include "pal1sofa.h" void palNutc( double date, double * dpsi, double *deps, double *eps0 ) { eraNut06a( PAL__MJD0, date, dpsi, deps ); *eps0 = eraObl06( PAL__MJD0, date ); } pal-0.9.7/palOap.c000066400000000000000000000234631302604645500137000ustar00rootroot00000000000000/* *+ * Name: * palOap * Purpose: * Observed to apparent place * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palOap ( const char *type, double ob1, double ob2, double date, * double dut, double elongm, double phim, double hm, * double xp, double yp, double tdk, double pmb, * double rh, double wl, double tlr, * double *rap, double *dap ); * Arguments: * type = const char * (Given) * Type of coordinates - 'R', 'H' or 'A' (see below) * ob1 = double (Given) * Observed Az, HA or RA (radians; Az is N=0;E=90) * ob2 = double (Given) * Observed ZD or Dec (radians) * date = double (Given) * UTC date/time (Modified Julian Date, JD-2400000.5) * dut = double (Given) * delta UT: UT1-UTC (UTC seconds) * elongm = double (Given) * Mean longitude of the observer (radians, east +ve) * phim = double (Given) * Mean geodetic latitude of the observer (radians) * hm = double (Given) * Observer's height above sea level (metres) * xp = double (Given) * Polar motion x-coordinates (radians) * yp = double (Given) * Polar motion y-coordinates (radians) * tdk = double (Given) * Local ambient temperature (K; std=273.15) * pmb = double (Given) * Local atmospheric pressure (mb; std=1013.25) * rh = double (Given) * Local relative humidity (in the range 0.0-1.0) * wl = double (Given) * Effective wavelength (micron, e.g. 0.55) * tlr = double (Given) * Tropospheric laps rate (K/metre, e.g. 0.0065) * rap = double * (Given) * Geocentric apparent right ascension * dap = double * (Given) * Geocentric apparent declination * Description: * Observed to apparent place. * Authors: * PTW: Patrick T. Wallace * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - Only the first character of the TYPE argument is significant. * 'R' or 'r' indicates that OBS1 and OBS2 are the observed right * ascension and declination; 'H' or 'h' indicates that they are * hour angle (west +ve) and declination; anything else ('A' or * 'a' is recommended) indicates that OBS1 and OBS2 are azimuth * (north zero, east 90 deg) and zenith distance. (Zenith * distance is used rather than elevation in order to reflect the * fact that no allowance is made for depression of the horizon.) * * - The accuracy of the result is limited by the corrections for * refraction. Providing the meteorological parameters are * known accurately and there are no gross local effects, the * predicted apparent RA,Dec should be within about 0.1 arcsec * for a zenith distance of less than 70 degrees. Even at a * topocentric zenith distance of 90 degrees, the accuracy in * elevation should be better than 1 arcmin; useful results * are available for a further 3 degrees, beyond which the * palRefro routine returns a fixed value of the refraction. * The complementary routines palAop (or palAopqk) and palOap * (or palOapqk) are self-consistent to better than 1 micro- * arcsecond all over the celestial sphere. * * - It is advisable to take great care with units, as even * unlikely values of the input parameters are accepted and * processed in accordance with the models used. * * - "Observed" Az,El means the position that would be seen by a * perfect theodolite located at the observer. This is * related to the observed HA,Dec via the standard rotation, using * the geodetic latitude (corrected for polar motion), while the * observed HA and RA are related simply through the local * apparent ST. "Observed" RA,Dec or HA,Dec thus means the * position that would be seen by a perfect equatorial located * at the observer and with its polar axis aligned to the * Earth's axis of rotation (n.b. not to the refracted pole). * By removing from the observed place the effects of * atmospheric refraction and diurnal aberration, the * geocentric apparent RA,Dec is obtained. * * - Frequently, mean rather than apparent RA,Dec will be required, * in which case further transformations will be necessary. The * palAmp etc routines will convert the apparent RA,Dec produced * by the present routine into an "FK5" (J2000) mean place, by * allowing for the Sun's gravitational lens effect, annual * aberration, nutation and precession. Should "FK4" (1950) * coordinates be needed, the routines palFk524 etc will also * need to be applied. * * - To convert to apparent RA,Dec the coordinates read from a * real telescope, corrections would have to be applied for * encoder zero points, gear and encoder errors, tube flexure, * the position of the rotator axis and the pointing axis * relative to it, non-perpendicularity between the mounting * axes, and finally for the tilt of the azimuth or polar axis * of the mounting (with appropriate corrections for mount * flexures). Some telescopes would, of course, exhibit other * properties which would need to be accounted for at the * appropriate point in the sequence. * * - This routine takes time to execute, due mainly to the rigorous * integration used to evaluate the refraction. For processing * multiple stars for one location and time, call palAoppa once * followed by one call per star to palOapqk. Where a range of * times within a limited period of a few hours is involved, and the * highest precision is not required, call palAoppa once, followed * by a call to palAoppat each time the time changes, followed by * one call per star to palOapqk. * * - The DATE argument is UTC expressed as an MJD. This is, strictly * speaking, wrong, because of leap seconds. However, as long as * the delta UT and the UTC are consistent there are no * difficulties, except during a leap second. In this case, the * start of the 61st second of the final minute should begin a new * MJD day and the old pre-leap delta UT should continue to be used. * As the 61st second completes, the MJD should revert to the start * of the day as, simultaneously, the delta UTC changes by one * second to its post-leap new value. * * - The delta UT (UT1-UTC) is tabulated in IERS circulars and * elsewhere. It increases by exactly one second at the end of * each UTC leap second, introduced in order to keep delta UT * within +/- 0.9 seconds. * * - IMPORTANT -- TAKE CARE WITH THE LONGITUDE SIGN CONVENTION. * The longitude required by the present routine is east-positive, * in accordance with geographical convention (and right-handed). * In particular, note that the longitudes returned by the * palOBS routine are west-positive, following astronomical * usage, and must be reversed in sign before use in the present * routine. * * - The polar coordinates XP,YP can be obtained from IERS * circulars and equivalent publications. The maximum amplitude * is about 0.3 arcseconds. If XP,YP values are unavailable, * use XP=YP=0D0. See page B60 of the 1988 Astronomical Almanac * for a definition of the two angles. * * - The height above sea level of the observing station, HM, * can be obtained from the Astronomical Almanac (Section J * in the 1988 edition), or via the routine palOBS. If P, * the pressure in millibars, is available, an adequate * estimate of HM can be obtained from the expression * * HM ~ -29.3*TSL*LOG(P/1013.25). * * where TSL is the approximate sea-level air temperature in K * (see Astrophysical Quantities, C.W.Allen, 3rd edition, * section 52). Similarly, if the pressure P is not known, * it can be estimated from the height of the observing * station, HM, as follows: * * P ~ 1013.25*EXP(-HM/(29.3*TSL)). * * Note, however, that the refraction is nearly proportional to the * pressure and that an accurate P value is important for precise * work. * * - The azimuths etc. used by the present routine are with respect * to the celestial pole. Corrections from the terrestrial pole * can be computed using palPolmo. * History: * 2012-08-27 (TIMJ): * Initial version, copied from Fortran SLA * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2005 Patrick T. Wallace * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" void palOap ( const char *type, double ob1, double ob2, double date, double dut, double elongm, double phim, double hm, double xp, double yp, double tdk, double pmb, double rh, double wl, double tlr, double *rap, double *dap ) { double aoprms[14]; palAoppa(date,dut,elongm,phim,hm,xp,yp,tdk,pmb,rh,wl,tlr, aoprms); palOapqk(type,ob1,ob2,aoprms,rap,dap); } pal-0.9.7/palOapqk.c000066400000000000000000000205641302604645500142330ustar00rootroot00000000000000/* *+ * Name: * palOapqk * Purpose: * Quick observed to apparent place * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palOapqk ( const char *type, double ob1, double ob2, * const double aoprms[14], double *rap, double *dap ); * Arguments: * Quick observed to apparent place. * Description: * type = const char * (Given) * Type of coordinates - 'R', 'H' or 'A' (see below) * ob1 = double (Given) * Observed Az, HA or RA (radians; Az is N=0;E=90) * ob2 = double (Given) * Observed ZD or Dec (radians) * aoprms = const double [14] (Given) * Star-independent apparent-to-observed parameters. * See palAopqk for details. * rap = double * (Given) * Geocentric apparent right ascension * dap = double * (Given) * Geocentric apparent declination * Authors: * PTW: Patrick T. Wallace * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - Only the first character of the TYPE argument is significant. * 'R' or 'r' indicates that OBS1 and OBS2 are the observed right * ascension and declination; 'H' or 'h' indicates that they are * hour angle (west +ve) and declination; anything else ('A' or * 'a' is recommended) indicates that OBS1 and OBS2 are azimuth * (north zero, east 90 deg) and zenith distance. (Zenith distance * is used rather than elevation in order to reflect the fact that * no allowance is made for depression of the horizon.) * * - The accuracy of the result is limited by the corrections for * refraction. Providing the meteorological parameters are * known accurately and there are no gross local effects, the * predicted apparent RA,Dec should be within about 0.1 arcsec * for a zenith distance of less than 70 degrees. Even at a * topocentric zenith distance of 90 degrees, the accuracy in * elevation should be better than 1 arcmin; useful results * are available for a further 3 degrees, beyond which the * palREFRO routine returns a fixed value of the refraction. * The complementary routines palAop (or palAopqk) and palOap * (or palOapqk) are self-consistent to better than 1 micro- * arcsecond all over the celestial sphere. * * - It is advisable to take great care with units, as even * unlikely values of the input parameters are accepted and * processed in accordance with the models used. * * - "Observed" Az,El means the position that would be seen by a * perfect theodolite located at the observer. This is * related to the observed HA,Dec via the standard rotation, using * the geodetic latitude (corrected for polar motion), while the * observed HA and RA are related simply through the local * apparent ST. "Observed" RA,Dec or HA,Dec thus means the * position that would be seen by a perfect equatorial located * at the observer and with its polar axis aligned to the * Earth's axis of rotation (n.b. not to the refracted pole). * By removing from the observed place the effects of * atmospheric refraction and diurnal aberration, the * geocentric apparent RA,Dec is obtained. * * - Frequently, mean rather than apparent RA,Dec will be required, * in which case further transformations will be necessary. The * palAmp etc routines will convert the apparent RA,Dec produced * by the present routine into an "FK5" (J2000) mean place, by * allowing for the Sun's gravitational lens effect, annual * aberration, nutation and precession. Should "FK4" (1950) * coordinates be needed, the routines palFk524 etc will also * need to be applied. * * - To convert to apparent RA,Dec the coordinates read from a * real telescope, corrections would have to be applied for * encoder zero points, gear and encoder errors, tube flexure, * the position of the rotator axis and the pointing axis * relative to it, non-perpendicularity between the mounting * axes, and finally for the tilt of the azimuth or polar axis * of the mounting (with appropriate corrections for mount * flexures). Some telescopes would, of course, exhibit other * properties which would need to be accounted for at the * appropriate point in the sequence. * * - The star-independent apparent-to-observed-place parameters * in AOPRMS may be computed by means of the palAoppa routine. * If nothing has changed significantly except the time, the * palAoppat routine may be used to perform the requisite * partial recomputation of AOPRMS. * * - The azimuths etc used by the present routine are with respect * to the celestial pole. Corrections from the terrestrial pole * can be computed using palPolmo. * History: * 2012-08-27 (TIMJ): * Initial version, direct copy of Fortran SLA * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2004 Patrick T. Wallace * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include #include "pal.h" #include "palmac.h" void palOapqk ( const char *type, double ob1, double ob2, const double aoprms[14], double *rap, double *dap ) { /* breakpoint for fast/slow refraction algorithm: * zd greater than arctan(4), (see palRefco routine) * or vector z less than cosine(arctan(z)) = 1/sqrt(17) */ const double zbreak = 0.242535625; char c; double c1,c2,sphi,cphi,st,ce,xaeo,yaeo,zaeo,v[3], xmhdo,ymhdo,zmhdo,az,sz,zdo,tz,dref,zdt, xaet,yaet,zaet,xmhda,ymhda,zmhda,diurab,f,hma; /* coordinate type */ c = type[0]; /* coordinates */ c1 = ob1; c2 = ob2; /* sin, cos of latitude */ sphi = aoprms[1]; cphi = aoprms[2]; /* local apparent sidereal time */ st = aoprms[13]; /* standardise coordinate type */ if (c == 'r' || c == 'R') { c = 'r'; } else if (c == 'h' || c == 'H') { c = 'h'; } else { c = 'a'; } /* if az,zd convert to cartesian (s=0,e=90) */ if (c == 'a') { ce = sin(c2); xaeo = -cos(c1)*ce; yaeo = sin(c1)*ce; zaeo = cos(c2); } else { /* if ra,dec convert to ha,dec */ if (c == 'r') { c1 = st-c1; } /* to cartesian -ha,dec */ palDcs2c( -c1, c2, v ); xmhdo = v[0]; ymhdo = v[1]; zmhdo = v[2]; /* to cartesian az,el (s=0,e=90) */ xaeo = sphi*xmhdo-cphi*zmhdo; yaeo = ymhdo; zaeo = cphi*xmhdo+sphi*zmhdo; } /* azimuth (s=0,e=90) */ if (xaeo != 0.0 || yaeo != 0.0) { az = atan2(yaeo,xaeo); } else { az = 0.0; } /* sine of observed zd, and observed zd */ sz = sqrt(xaeo*xaeo+yaeo*yaeo); zdo = atan2(sz,zaeo); /* * refraction * ---------- */ /* large zenith distance? */ if (zaeo >= zbreak) { /* fast algorithm using two constant model */ tz = sz/zaeo; dref = (aoprms[10]+aoprms[11]*tz*tz)*tz; } else { /* rigorous algorithm for large zd */ palRefro(zdo,aoprms[4],aoprms[5],aoprms[6],aoprms[7], aoprms[8],aoprms[0],aoprms[9],1e-8,&dref); } zdt = zdo+dref; /* to cartesian az,zd */ ce = sin(zdt); xaet = cos(az)*ce; yaet = sin(az)*ce; zaet = cos(zdt); /* cartesian az,zd to cartesian -ha,dec */ xmhda = sphi*xaet+cphi*zaet; ymhda = yaet; zmhda = -cphi*xaet+sphi*zaet; /* diurnal aberration */ diurab = -aoprms[3]; f = (1.0-diurab*ymhda); v[0] = f*xmhda; v[1] = f*(ymhda+diurab); v[2] = f*zmhda; /* to spherical -ha,dec */ palDcc2s(v,&hma,dap); /* Right Ascension */ *rap = palDranrm(st+hma); } pal-0.9.7/palObs.c000066400000000000000000000617621302604645500137100ustar00rootroot00000000000000/* *+ * Name: * palObs * Purpose: * Parameters of selected ground-based observing stations * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * int palObs( size_t n, const char * c, * char * ident, size_t identlen, * char * name, size_t namelen, * double * w, double * p, double * h ); * Arguments: * n = size_t (Given) * Number specifying the observing station. If 0 * the identifier in "c" is used to determine the * observing station to use. * c = const char * (Given) * Identifier specifying the observing station for * which the parameters should be returned. Only used * if n is 0. Can be NULL for n>0. Case insensitive. * ident = char * (Returned) * Identifier of the observing station selected. Will be * identical to "c" if n==0. Unchanged if "n" or "c" * do not match an observing station. Should be at least * 11 characters (including the trailing nul). * identlen = size_t (Given) * Size of the buffer "ident" including trailing nul. * name = char * (Returned) * Full name of the specified observing station. Contains "?" * if "n" or "c" did not correspond to a valid station. Should * be at least 41 characters (including the trailing nul). * w = double * (Returned) * Longitude (radians, West +ve). Unchanged if observing * station could not be identified. * p = double * (Returned) * Geodetic latitude (radians, North +ve). Unchanged if observing * station could not be identified. * h = double * (Returned) * Height above sea level (metres). Unchanged if observing * station could not be identified. * Returned Value: * palObs = int * 0 if an observing station was returned. -1 if no match was * found. * Description: * Station numbers, identifiers, names and other details are * subject to change and should not be hardwired into * application programs. * * All characters in "c" up to the first space are * checked; thus an abbreviated ID will return the parameters * for the first station in the list which matches the * abbreviation supplied, and no station in the list will ever * contain embedded spaces. "c" must not have leading spaces. * * IMPORTANT -- BEWARE OF THE LONGITUDE SIGN CONVENTION. The * longitude returned by palOBS (and SLA_OBS) is west-positive in accordance * with astronomical usage. However, this sign convention is * left-handed and is the opposite of the one used by geographers; * elsewhere in PAL the preferable east-positive convention is * used. In particular, note that for use in palAop, palAoppa * and palOap the sign of the longitude must be reversed. * * Users are urged to inform the author of any improvements * they would like to see made. For example: * * typographical corrections * more accurate parameters * better station identifiers or names * additional stations * Authors: * PTW: Patrick T. Wallace * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - Differs from the SLA interface in that the output short name * is not the same variable as the input short name. This simplifies * consting. Additionally the size of the output buffers are now * specified in the API and a status integer is returned. * History: * 2012-03-06 (TIMJ): * Initial version containing entries from SLA/F as of 15 March 2002 * with a 2008 tweak to the JCMT GPS position. * Adapted with permission from the Fortran SLALIB library. * 2014-04-08 (TIMJ): * Add APEX and NANTEN2 * {enter_further_changes_here} * Copyright: * Copyright (C) 2002 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * Copyright (C) 2014 Cornell University. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #if HAVE_CONFIG_H # include #endif #ifdef HAVE_BSD_STRING_H #include #endif #include /* We prefer to use the starutil package. */ #if HAVE_STAR_UTIL_H #include "star/util.h" #else /* This version is just a straight copy without putting ellipsis on the end. */ static void star__strellcpy( char * dest, const char * src, size_t size ) { # if HAVE_STRLCPY strlcpy( dest, src, size ); # else strncpy( dest, src, size ); dest[size-1] = '\0'; # endif } #define star_strellcpy(dest, src, size) star__strellcpy(dest, src, size) #endif #include "pal.h" #include "palmac.h" /* Helper macros to convert degrees to radians in longitude and latitude */ #define WEST(ID,IAM,AS) PAL__DAS2R*((60.0*(60.0*(double)ID+(double)IAM))+(double)AS) #define NORTH(ID,IAM,AS) WEST(ID,IAM,AS) #define EAST(ID,IAM,AS) -1.0*WEST(ID,IAM,AS) #define SOUTH(ID,IAM,AS) -1.0*WEST(ID,IAM,AS) struct telData { double w; double p; double h; char shortname[11]; char longname[41]; }; int palObs( size_t n, const char * c, char * ident, size_t identlen, char * name, size_t namelen, double * w, double * p, double * h ) { const struct telData telData[] = { /* AAT (Observer's Guide) AAT */ { EAST(149,3,57.91), SOUTH(31,16,37.34), 1164E0, "AAT", "Anglo-Australian 3.9m Telescope" }, /* WHT (Gemini, April 1987) LPO4.2 */ { WEST(17,52,53.9), NORTH(28,45,38.1), 2332E0, "LPO4.2", "William Herschel 4.2m Telescope" }, /* INT (Gemini, April 1987) LPO2.5 */ { WEST(17,52,39.5), NORTH(28,45,43.2), 2336E0, "LPO2.5", "Isaac Newton 2.5m Telescope" }, /* JKT (Gemini, April 1987) LPO1 */ { WEST(17,52,41.2), NORTH(28,45,39.9), 2364E0, "LPO1", "Jacobus Kapteyn 1m Telescope" }, /* Lick 120" (S.L.Allen, private communication, 2002) LICK120 */ { WEST(121,38,13.689), NORTH(37,20,34.931), 1286E0, "LICK120", "Lick 120 inch" }, /* MMT 6.5m conversion (MMT Observatory website) MMT */ { WEST(110,53,4.4), NORTH(31,41,19.6), 2608E0, "MMT", "MMT 6.5m, Mt Hopkins" }, /* Victoria B.C. 1.85m (1984 Almanac) DAO72 */ { WEST(123,25,1.18), NORTH(48,31,11.9), 238E0, "DAO72", "DAO Victoria BC 1.85 metre" }, /* Las Campanas (1983 Almanac) DUPONT */ { WEST(70,42,9.), SOUTH(29,0,11.), 2280E0, "DUPONT", "Du Pont 2.5m Telescope, Las Campanas" }, /* Mt Hopkins 1.5m (1983 Almanac) MTHOP1.5 */ { WEST(110,52,39.00), NORTH(31,40,51.4), 2344E0, "MTHOP1.5", "Mt Hopkins 1.5 metre" }, /* Mt Stromlo 74" (1983 Almanac) STROMLO74 */ { EAST(149,0,27.59), SOUTH(35,19,14.3), 767E0, "STROMLO74", "Mount Stromlo 74 inch" }, /* ANU 2.3m, SSO (Gary Hovey) ANU2.3 */ { EAST(149,3,40.3), SOUTH(31,16,24.1), 1149E0, "ANU2.3", "Siding Spring 2.3 metre" }, /* Greenbank 140' (1983 Almanac) GBVA140 */ { WEST(79,50,9.61), NORTH(38,26,15.4), 881E0, "GBVA140", "Greenbank 140 foot" }, /* Cerro Tololo 4m (1982 Almanac) TOLOLO4M */ { WEST(70,48,53.6), SOUTH(30,9,57.8), 2235E0, "TOLOLO4M", "Cerro Tololo 4 metre" }, /* Cerro Tololo 1.5m (1982 Almanac) TOLOLO1.5M */ { WEST(70,48,54.5), SOUTH(30,9,56.3), 2225E0, "TOLOLO1.5M", "Cerro Tololo 1.5 metre" }, /* Tidbinbilla 64m (1982 Almanac) TIDBINBLA */ { EAST(148,58,48.20), SOUTH(35,24,14.3), 670E0, "TIDBINBLA", "Tidbinbilla 64 metre" }, /* Bloemfontein 1.52m (1981 Almanac) BLOEMF */ { EAST(26,24,18.), SOUTH(29,2,18.), 1387E0, "BLOEMF", "Bloemfontein 1.52 metre" }, /* Bosque Alegre 1.54m (1981 Almanac) BOSQALEGRE */ { WEST(64,32,48.0), SOUTH(31,35,53.), 1250E0, "BOSQALEGRE", "Bosque Alegre 1.54 metre" }, /* USNO 61" astrographic reflector, Flagstaff (1981 Almanac) FLAGSTF61 */ { WEST(111,44,23.6), NORTH(35,11,2.5), 2316E0, "FLAGSTF61", "USNO 61 inch astrograph, Flagstaff" }, /* Lowell 72" (1981 Almanac) LOWELL72 */ { WEST(111,32,9.3), NORTH(35,5,48.6), 2198E0, "LOWELL72", "Perkins 72 inch, Lowell" }, /* Harvard 1.55m (1981 Almanac) HARVARD */ { WEST(71,33,29.32), NORTH(42,30,19.0), 185E0, "HARVARD", "Harvard College Observatory 1.55m" }, /* Okayama 1.88m (1981 Almanac) OKAYAMA */ { EAST(133,35,47.29), NORTH(34,34,26.1), 372E0, "OKAYAMA", "Okayama 1.88 metre" }, /* Kitt Peak Mayall 4m (1981 Almanac) KPNO158 */ { WEST(111,35,57.61), NORTH(31,57,50.3), 2120E0, "KPNO158", "Kitt Peak 158 inch" }, /* Kitt Peak 90 inch (1981 Almanac) KPNO90 */ { WEST(111,35,58.24), NORTH(31,57,46.9), 2071E0, "KPNO90", "Kitt Peak 90 inch" }, /* Kitt Peak 84 inch (1981 Almanac) KPNO84 */ { WEST(111,35,51.56), NORTH(31,57,29.2), 2096E0, "KPNO84", "Kitt Peak 84 inch" }, /* Kitt Peak 36 foot (1981 Almanac) KPNO36FT */ { WEST(111,36,51.12), NORTH(31,57,12.1), 1939E0, "KPNO36FT", "Kitt Peak 36 foot" }, /* Kottamia 74" (1981 Almanac) KOTTAMIA */ { EAST(31,49,30.), NORTH(29,55,54.), 476E0, "KOTTAMIA", "Kottamia 74 inch" }, /* La Silla 3.6m (1981 Almanac) ESO3.6 */ { WEST(70,43,36.), SOUTH(29,15,36.), 2428E0, "ESO3.6", "ESO 3.6 metre" }, /* Mauna Kea 88 inch MAUNAK88 */ /* (IfA website, Richard Wainscoat) */ { WEST(155,28,9.96), NORTH(19,49,22.77), 4213.6E0, "MAUNAK88", "Mauna Kea 88 inch" }, /* UKIRT (IfA website, Richard Wainscoat) UKIRT */ { WEST(155,28,13.18), NORTH(19,49,20.75), 4198.5E0, "UKIRT", "UK Infra Red Telescope" }, /* Quebec 1.6m (1981 Almanac) QUEBEC1.6 */ { WEST(71,9,9.7), NORTH(45,27,20.6), 1114E0, "QUEBEC1.6", "Quebec 1.6 metre" }, /* Mt Ekar 1.82m (1981 Almanac) MTEKAR */ { EAST(11,34,15.), NORTH(45,50,48.), 1365E0, "MTEKAR", "Mt Ekar 1.82 metre" }, /* Mt Lemmon 60" (1981 Almanac) MTLEMMON60 */ { WEST(110,42,16.9), NORTH(32,26,33.9), 2790E0, "MTLEMMON60", "Mt Lemmon 60 inch" }, /* Mt Locke 2.7m (1981 Almanac) MCDONLD2.7 */ { WEST(104,1,17.60), NORTH(30,40,17.7), 2075E0, "MCDONLD2.7", "McDonald 2.7 metre" }, /* Mt Locke 2.1m (1981 Almanac) MCDONLD2.1 */ { WEST(104,1,20.10), NORTH(30,40,17.7), 2075E0, "MCDONLD2.1", "McDonald 2.1 metre" }, /* Palomar 200" (1981 Almanac) PALOMAR200 */ { WEST(116,51,50.), NORTH(33,21,22.), 1706E0, "PALOMAR200", "Palomar 200 inch" }, /* Palomar 60" (1981 Almanac) PALOMAR60 */ { WEST(116,51,31.), NORTH(33,20,56.), 1706E0, "PALOMAR60", "Palomar 60 inch" }, /* David Dunlap 74" (1981 Almanac) DUNLAP74 */ { WEST(79,25,20.), NORTH(43,51,46.), 244E0, "DUNLAP74", "David Dunlap 74 inch" }, /* Haute Provence 1.93m (1981 Almanac) HPROV1.93 */ { EAST(5,42,46.75), NORTH(43,55,53.3), 665E0, "HPROV1.93", "Haute Provence 1.93 metre" }, /* Haute Provence 1.52m (1981 Almanac) HPROV1.52 */ { EAST(5,42,43.82), NORTH(43,56,0.2), 667E0, "HPROV1.52", "Haute Provence 1.52 metre" }, /* San Pedro Martir 83" (1981 Almanac) SANPM83 */ { WEST(115,27,47.), NORTH(31,2,38.), 2830E0, "SANPM83", "San Pedro Martir 83 inch" }, /* Sutherland 74" (1981 Almanac) SAAO74 */ { EAST(20,48,44.3), SOUTH(32,22,43.4), 1771E0, "SAAO74", "Sutherland 74 inch" }, /* Tautenburg 2m (1981 Almanac) TAUTNBG */ { EAST(11,42,45.), NORTH(50,58,51.), 331E0, "TAUTNBG", "Tautenburg 2 metre" }, /* Catalina 61" (1981 Almanac) CATALINA61 */ { WEST(110,43,55.1), NORTH(32,25,0.7), 2510E0, "CATALINA61", "Catalina 61 inch" }, /* Steward 90" (1981 Almanac) STEWARD90 */ { WEST(111,35,58.24), NORTH(31,57,46.9), 2071E0, "STEWARD90", "Steward 90 inch" }, /* Russian 6m (1981 Almanac) USSR6 */ { EAST(41,26,30.0), NORTH(43,39,12.), 2100E0, "USSR6", "USSR 6 metre" }, /* Arecibo 1000' (1981 Almanac) ARECIBO */ { WEST(66,45,11.1), NORTH(18,20,36.6), 496E0, "ARECIBO", "Arecibo 1000 foot" }, /* Cambridge 5km (1981 Almanac) CAMB5KM */ { EAST(0,2,37.23), NORTH(52,10,12.2), 17E0, "CAMB5KM", "Cambridge 5km" }, /* Cambridge 1 mile (1981 Almanac) CAMB1MILE */ { EAST(0,2,21.64), NORTH(52,9,47.3), 17E0, "CAMB1MILE", "Cambridge 1 mile" }, /* Bonn 100m (1981 Almanac) EFFELSBERG */ { EAST(6,53,1.5), NORTH(50,31,28.6), 366E0, "EFFELSBERG", "Effelsberg 100 metre" }, /* Greenbank 300' (1981 Almanac) GBVA300 (R.I.P.) */ { WEST(79,50,56.36), NORTH(38,25,46.3), 894E0, "(R.I.P.)", "Greenbank 300 foot" }, /* Jodrell Bank Mk 1 (1981 Almanac) JODRELL1 */ { WEST(2,18,25.), NORTH(53,14,10.5), 78E0, "JODRELL1", "Jodrell Bank 250 foot" }, /* Australia Telescope Parkes Observatory PARKES */ /* (Peter te Lintel Hekkert) */ { EAST(148,15,44.3591), SOUTH(32,59,59.8657), 391.79E0, "PARKES", "Parkes 64 metre" }, /* VLA (1981 Almanac) VLA */ { WEST(107,37,3.82), NORTH(34,4,43.5), 2124E0, "VLA", "Very Large Array" }, /* Sugar Grove 150' (1981 Almanac) SUGARGROVE */ { WEST(79,16,23.), NORTH(38,31,14.), 705E0, "SUGARGROVE", "Sugar Grove 150 foot" }, /* Russian 600' (1981 Almanac) USSR600 */ { EAST(41,35,25.5), NORTH(43,49,32.), 973E0, "USSR600", "USSR 600 foot" }, /* Nobeyama 45 metre mm dish (based on 1981 Almanac entry) NOBEYAMA */ { EAST(138,29,12.), NORTH(35,56,19.), 1350E0, "NOBEYAMA", "Nobeyama 45 metre" }, /* James Clerk Maxwell 15 metre mm telescope, Mauna Kea JCMT */ /* From GPS measurements on 11Apr2007 for eSMA setup (R. Tilanus) */ { WEST(155,28,37.30), NORTH(19,49,22.22), 4124.75E0, "JCMT", "JCMT 15 metre" }, /* ESO 3.5 metre NTT, La Silla (K.Wirenstrand) ESONTT */ { WEST(70,43,7.), SOUTH(29,15,30.), 2377E0, "ESONTT", "ESO 3.5 metre NTT" }, /* St Andrews University Observatory (1982 Almanac) ST.ANDREWS */ { WEST(2,48,52.5), NORTH(56,20,12.), 30E0, "ST.ANDREWS", "St Andrews" }, /* Apache Point 3.5 metre (R.Owen) APO3.5 */ { WEST(105,49,11.56), NORTH(32,46,48.96), 2809E0, "APO3.5", "Apache Point 3.5m" }, /* W.M.Keck Observatory, Telescope 1 KECK1 */ /* (William Lupton) */ { WEST(155,28,28.99), NORTH(19,49,33.41), 4160E0, "KECK1", "Keck 10m Telescope #1" }, /* Tautenberg Schmidt (1983 Almanac) TAUTSCHM */ { EAST(11,42,45.0), NORTH(50,58,51.0), 331E0, "TAUTSCHM", "Tautenberg 1.34 metre Schmidt" }, /* Palomar Schmidt (1981 Almanac) PALOMAR48 */ { WEST(116,51,32.0), NORTH(33,21,26.0), 1706E0, "PALOMAR48", "Palomar 48-inch Schmidt" }, /* UK Schmidt, Siding Spring (1983 Almanac) UKST */ { EAST(149,4,12.8), SOUTH(31,16,27.8), 1145E0, "UKST", "UK 1.2 metre Schmidt, Siding Spring" }, /* Kiso Schmidt, Japan (1981 Almanac) KISO */ { EAST(137,37,42.2), NORTH(35,47,38.7), 1130E0, "KISO", "Kiso 1.05 metre Schmidt, Japan" }, /* ESO Schmidt, La Silla (1981 Almanac) ESOSCHM */ { WEST(70,43,46.5), SOUTH(29,15,25.8), 2347E0, "ESOSCHM", "ESO 1 metre Schmidt, La Silla" }, /* Australia Telescope Compact Array ATCA */ /* (WGS84 coordinates of Station 35, Mark Calabretta) */ { EAST(149,33,0.500), SOUTH(30,18,46.385), 236.9E0, "ATCA", "Australia Telescope Compact Array" }, /* Australia Telescope Mopra Observatory MOPRA */ /* (Peter te Lintel Hekkert) */ { EAST(149,5,58.732), SOUTH(31,16,4.451), 850E0, "MOPRA", "ATNF Mopra Observatory" }, /* Subaru telescope, Mauna Kea SUBARU */ /* (IfA website, Richard Wainscoat) */ { WEST(155,28,33.67), NORTH(19,49,31.81), 4163E0, "SUBARU", "Subaru 8m telescope" }, /* Canada-France-Hawaii Telescope, Mauna Kea CFHT */ /* (IfA website, Richard Wainscoat) */ { WEST(155,28,7.95), NORTH(19,49,30.91), 4204.1E0, "CFHT", "Canada-France-Hawaii 3.6m Telescope" }, /* W.M.Keck Observatory, Telescope 2 KECK2 */ /* (William Lupton) */ { WEST(155,28,27.24), NORTH(19,49,35.62), 4159.6E0, "KECK2", "Keck 10m Telescope #2" }, /* Gemini North, Mauna Kea GEMININ */ /* (IfA website, Richard Wainscoat) */ { WEST(155,28,8.57), NORTH(19,49,25.69), 4213.4E0, "GEMININ", "Gemini North 8-m telescope" }, /* Five College Radio Astronomy Observatory FCRAO */ /* (Tim Jenness) */ { WEST(72,20,42.0), NORTH(42,23,30.0), 314E0, "FCRAO", "Five College Radio Astronomy Obs" }, /* NASA Infra Red Telescope Facility IRTF */ /* (IfA website, Richard Wainscoat) */ { WEST(155,28,19.20), NORTH(19,49,34.39), 4168.1E0, "IRTF", "NASA IR Telescope Facility, Mauna Kea" }, /* Caltech Submillimeter Observatory CSO */ /* (IfA website, Richard Wainscoat; height estimated) */ { WEST(155,28,31.79), NORTH(19,49,20.78), 4080E0, "CSO", "Caltech Sub-mm Observatory, Mauna Kea" }, /* ESO VLT, UT1 VLT1 */ /* (ESO website, VLT Whitebook Chapter 2) */ { WEST(70,24,11.642), SOUTH(24,37,33.117), 2635.43, "VLT1", "ESO VLT, Paranal, Chile: UT1" }, /* ESO VLT, UT2 VLT2 */ /* (ESO website, VLT Whitebook Chapter 2) */ { WEST(70,24,10.855), SOUTH(24,37,31.465), 2635.43, "VLT2", "ESO VLT, Paranal, Chile: UT2" }, /* ESO VLT, UT3 VLT3 */ /* (ESO website, VLT Whitebook Chapter 2) */ { WEST(70,24,9.896), SOUTH(24,37,30.300), 2635.43, "VLT3", "ESO VLT, Paranal, Chile: UT3" }, /* ESO VLT, UT4 VLT4 */ /* (ESO website, VLT Whitebook Chapter 2) */ { WEST(70,24,8.000), SOUTH(24,37,31.000), 2635.43, "VLT4", "ESO VLT, Paranal, Chile: UT4" }, /* Gemini South, Cerro Pachon GEMINIS */ /* (GPS readings by Patrick Wallace) */ { WEST(70,44,11.5), SOUTH(30,14,26.7), 2738E0, "GEMINIS", "Gemini South 8-m telescope" }, /* Cologne Observatory for Submillimeter Astronomy (KOSMA) KOSMA3M */ /* (Holger Jakob) */ { EAST(7,47,3.48), NORTH(45,58,59.772), 3141E0, "KOSMA3M", "KOSMA 3m telescope, Gornergrat" }, /* Magellan 1, 6.5m telescope at Las Campanas, Chile MAGELLAN1 */ /* (Skip Schaller) */ { WEST(70,41,31.9), SOUTH(29,0,51.7), 2408E0, "MAGELLAN1", "Magellan 1, 6.5m, Las Campanas" }, /* Magellan 2, 6.5m telescope at Las Campanas, Chile MAGELLAN2 */ /* (Skip Schaller) */ { WEST(70,41,33.5), SOUTH(29,0,50.3), 2408E0, "MAGELLAN2", "Magellan 2, 6.5m, Las Campanas" }, /* APEX - Atacama Pathfinder EXperiment, Llano de Chajnantor APEX */ /* (APEX web site) */ { WEST(67,45,33.0), SOUTH(23,0,20.8), 5105E0, "APEX", "APEX 12m telescope, Llano de Chajnantor" }, /* NANTEN2 Submillimeter Observatory, 4m telescope Atacame desert NANTEN2 */ /* (NANTEN2 web site) */ { WEST(67,42,8.0), SOUTH(22,57,47.0), 4865E0, "NANTEN2", "NANTEN2 4m telescope, Pampa la Bola" } }; int retval = -1; /* Return status. 0 if found. -1 if no match */ /* Work out the number of telescopes */ const size_t NTEL = sizeof(telData) / sizeof(struct telData); /* Prefill the return buffer in a pessimistic manner */ star_strellcpy( name, "?", namelen ); if (n > 0) { if (n <= NTEL) { /* Index into telData with correction for zero-based indexing */ struct telData thistel; thistel = telData[n-1]; *w = thistel.w; *p = thistel.p; *h = thistel.h; star_strellcpy( ident, thistel.shortname, identlen ); star_strellcpy( name, thistel.longname, namelen ); retval = 0; } } else { /* Searching */ size_t i; for (i=0; i. * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "palmac.h" #include "pal1sofa.h" /* *+ * Name: * palCldj * Purpose: * Gregorian Calendar to Modified Julian Date * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palCldj( int iy, int im, int id, double *djm, int *j ); * Arguments: * iy = int (Given) * Year in Gregorian calendar * im = int (Given) * Month in Gregorian calendar * id = int (Given) * Day in Gregorian calendar * djm = double * (Returned) * Modified Julian Date (JD-2400000.5) for 0 hrs * j = int * (Returned) * status: 0 = OK, 1 = bad year (MJD not computed), * 2 = bad month (MJD not computed), 3 = bad day (MJD computed). * Description: * Gregorian calendar to Modified Julian Date. * Notes: * - Uses eraCal2jd(). See SOFA/ERFA documentation for details. *- */ void palCldj ( int iy, int im, int id, double *djm, int *j ) { double djm0; *j = eraCal2jd( iy, im, id, &djm0, djm ); } /* *+ * Name: * palDbear * Purpose: * Bearing (position angle) of one point on a sphere relative to another * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * pa = palDbear( double a1, double b1, double a2, double b2 ); * Arguments: * a1 = double (Given) * Longitude of point A (e.g. RA) in radians. * a2 = double (Given) * Latitude of point A (e.g. Dec) in radians. * b1 = double (Given) * Longitude of point B in radians. * b2 = double (Given) * Latitude of point B in radians. * Returned Value: * The result is the bearing (position angle), in radians, of point * A2,B2 as seen from point A1,B1. It is in the range +/- pi. If * A2,B2 is due east of A1,B1 the bearing is +pi/2. Zero is returned * if the two points are coincident. * Description: * Bearing (position angle) of one point in a sphere relative to another. * Notes: * - Uses eraPas(). See SOFA/ERFA documentation for details. *- */ double palDbear ( double a1, double b1, double a2, double b2 ) { return eraPas( a1, b1, a2, b2 ); } /* *+ * Name: * palDaf2r * Purpose: * Convert degrees, arcminutes, arcseconds to radians * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palDaf2r( int ideg, int iamin, double asec, double *rad, int *j ); * Arguments: * ideg = int (Given) * Degrees. * iamin = int (Given) * Arcminutes. * iasec = double (Given) * Arcseconds. * rad = double * (Returned) * Angle in radians. * j = int * (Returned) * Status: 0 = OK, 1 = "ideg" out of range 0-359, * 2 = "iamin" outside of range 0-59, * 2 = "asec" outside range 0-59.99999 * Description: * Convert degrees, arcminutes, arcseconds to radians. * Notes: * - Uses eraAf2a(). See SOFA/ERFA documentation for details. *- */ /* Arguments differ slightly. Assumes that the sign is always positive and dealt with externally. */ void palDaf2r ( int ideg, int iamin, double asec, double *rad, int *j ) { *j = eraAf2a( ' ', ideg, iamin, asec, rad ); } /* *+ * Name: * palDav2m * Purpose: * Form the rotation matrix corresponding to a given axial vector. * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palDav2m( double axvec[3], double rmat[3][3] ); * Arguments: * axvec = double [3] (Given) * Axial vector (radians) * rmat = double [3][3] (Returned) * Rotation matrix. * Description: * A rotation matrix describes a rotation about some arbitrary axis, * called the Euler axis. The "axial vector" supplied to this routine * has the same direction as the Euler axis, and its magnitude is the * amount of rotation in radians. * Notes: * - Uses eraRv2m(). See SOFA/ERFA documentation for details. *- */ void palDav2m ( double axvec[3], double rmat[3][3] ) { eraRv2m( axvec, rmat ); } /* *+ * Name: * palDcc2s * Purpose: * Cartesian to spherical coordinates * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palDcc2s( double v[3], double *a, double *b ); * Arguments: * v = double [3] (Given) * x, y, z vector. * a = double * (Returned) * Spherical coordinate (radians) * b = double * (Returned) * Spherical coordinate (radians) * Description: * The spherical coordinates are longitude (+ve anticlockwise looking * from the +ve latitude pole) and latitude. The Cartesian coordinates * are right handed, with the x axis at zero longitude and latitude, and * the z axis at the +ve latitude pole. * Notes: * - Uses eraC2s(). See SOFA/ERFA documentation for details. *- */ void palDcc2s ( double v[3], double *a, double *b ) { eraC2s( v, a, b ); } /* *+ * Name: * palDcs2c * Purpose: * Spherical coordinates to direction cosines * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palDcs2c( double a, double b, double v[3] ); * Arguments: * a = double (Given) * Spherical coordinate in radians (ra, long etc). * b = double (Given) * Spherical coordinate in radians (dec, lat etc). * v = double [3] (Returned) * x, y, z vector * Description: * The spherical coordinates are longitude (+ve anticlockwise looking * from the +ve latitude pole) and latitude. The Cartesian coordinates * are right handed, with the x axis at zero longitude and latitude, and * the z axis at the +ve latitude pole. * Notes: * - Uses eraS2c(). See SOFA/ERFA documentation for details. *- */ void palDcs2c ( double a, double b, double v[3] ) { eraS2c( a, b, v ); } /* *+ * Name: * palDd2tf * Purpose: * Convert an interval in days into hours, minutes, seconds * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palDd2tf( int ndp, double days, char *sign, int ihmsf[4] ); * Arguments: * ndp = int (Given) * Number of decimal places of seconds * days = double (Given) * Interval in days * sign = char * (Returned) * '+' or '-' (single character, not string) * ihmsf = int [4] (Returned) * Hours, minutes, seconds, fraction * Description: * Convert and interval in days into hours, minutes, seconds. * Notes: * - Uses eraD2tf(). See SOFA/ERFA documentation for details. *- */ void palDd2tf ( int ndp, double days, char *sign, int ihmsf[4] ) { eraD2tf( ndp, days, sign, ihmsf ); } /* *+ * Name: * palDimxv * Purpose: * Perform the 3-D backward unitary transformation * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palDimxv( double dm[3][3], double va[3], double vb[3] ); * Arguments: * dm = double [3][3] (Given) * Matrix * va = double [3] (Given) * vector * vb = double [3] (Returned) * Result vector * Description: * Perform the 3-D backward unitary transformation. * Notes: * - Uses eraTrxp(). See SOFA/ERFA documentation for details. *- */ void palDimxv ( double dm[3][3], double va[3], double vb[3] ) { eraTrxp( dm, va, vb ); } /* *+ * Name: * palDm2av * Purpose: * From a rotation matrix, determine the corresponding axial vector * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palDm2av( double rmat[3][3], double axvec[3] ); * Arguments: * rmat = double [3][3] (Given) * Rotation matrix * axvec = double [3] (Returned) * Axial vector (radians) * Description: * A rotation matrix describes a rotation about some arbitrary axis, * called the Euler axis. The "axial vector" returned by this routine * has the same direction as the Euler axis, and its magnitude is the * amount of rotation in radians. (The magnitude and direction can be * separated by means of the routine palDvn.) * Notes: * - Uses eraRm2v(). See SOFA/ERFA documentation for details. *- */ void palDm2av ( double rmat[3][3], double axvec[3] ) { eraRm2v( rmat, axvec ); } /* *+ * Name: * palDjcl * Purpose: * Modified Julian Date to Gregorian year, month, day and fraction of day * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palDjcl( double djm, int *iy, int *im, int *id, double *fd, int *j ); * Arguments: * djm = double (Given) * modified Julian Date (JD-2400000.5) * iy = int * (Returned) * year * im = int * (Returned) * month * id = int * (Returned) * day * fd = double * (Returned) * Fraction of day. * Description: * Modified Julian Date to Gregorian year, month, day and fraction of day. * Notes: * - Uses eraJd2cal(). See SOFA/ERFA documentation for details. *- */ /* Requires additional SLA MJD reference date */ void palDjcl ( double djm, int *iy, int *im, int *id, double *fd, int *j ) { *j = eraJd2cal( PAL__MJD0, djm, iy, im, id, fd ); } /* *+ * Name: * palDmxm * Purpose: * Product of two 3x3 matrices * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palDmxm( double a[3][3], double b[3][3], double c[3][3] ); * Arguments: * a = double [3][3] (Given) * Matrix * b = double [3][3] (Given) * Matrix * c = double [3][3] (Returned) * Matrix result * Description: * Product of two 3x3 matrices. * Notes: * - Uses eraRxr(). See SOFA/ERFA documentation for details. *- */ void palDmxm ( double a[3][3], double b[3][3], double c[3][3] ) { eraRxr( a, b, c ); } /* *+ * Name: * palDmxv * Purpose: * Performs the 3-D forward unitary transformation * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palDmxv( double dm[3][3], double va[3], double vb[3] ); * Arguments: * dm = double [3][3] (Given) * matrix * va = double [3] (Given) * vector * dp = double [3] (Returned) * result vector * Description: * Performs the 3-D forward unitary transformation. * Notes: * - Uses eraRxp(). See SOFA/ERFA documentation for details. *- */ void palDmxv ( double dm[3][3], double va[3], double vb[3] ) { eraRxp( dm, va, vb ); } /* *+ * Name: * palDpav * Purpose: * Position angle of one celestial direction with respect to another * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * pa = palDpav( double v1[3], double v2[3] ); * Arguments: * v1 = double [3] (Given) * direction cosines of one point. * v2 = double [3] (Given) * direction cosines of the other point. * Returned Value: * The result is the bearing (position angle), in radians, of point * V2 with respect to point V1. It is in the range +/- pi. The * sense is such that if V2 is a small distance east of V1, the * bearing is about +pi/2. Zero is returned if the two points * are coincident. * Description: * Position angle of one celestial direction with respect to another. * Notes: * - The coordinate frames correspond to RA,Dec, Long,Lat etc. * - Uses eraPap(). See SOFA/ERFA documentation for details. *- */ double palDpav ( double v1[3], double v2[3] ) { return eraPap( v1, v2 ); } /* *+ * Name: * palDr2af * Purpose: * Convert an angle in radians to degrees, arcminutes, arcseconds * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palDr2af( int ndp, double angle, char *sign, int idmsf[4] ); * Arguments: * ndp = int (Given) * number of decimal places of arcseconds * angle = double (Given) * angle in radians * sign = char * (Returned) * '+' or '-' (single character) * idmsf = int [4] (Returned) * Degrees, arcminutes, arcseconds, fraction * Description: * Convert an angle in radians to degrees, arcminutes, arcseconds. * Notes: * - Uses eraA2af(). See SOFA/ERFA documentation for details. *- */ void palDr2af ( int ndp, double angle, char *sign, int idmsf[4] ) { eraA2af( ndp, angle, sign, idmsf ); } /* *+ * Name: * palDr2tf * Purpose: * Convert an angle in radians to hours, minutes, seconds * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palDr2tf ( int ndp, double angle, char *sign, int ihmsf[4] ); * Arguments: * ndp = int (Given) * number of decimal places of arcseconds * angle = double (Given) * angle in radians * sign = char * (Returned) * '+' or '-' (single character) * idmsf = int [4] (Returned) * Hours, minutes, seconds, fraction * Description: * Convert an angle in radians to hours, minutes, seconds. * Notes: * - Uses eraA2tf(). See SOFA/ERFA documentation for details. *- */ void palDr2tf( int ndp, double angle, char *sign, int ihmsf[4] ) { eraA2tf( ndp, angle, sign, ihmsf ); } /* *+ * Name: * palDranrm * Purpose: * Normalize angle into range 0-2 pi * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * norm = palDranrm( double angle ); * Arguments: * angle = double (Given) * angle in radians * Returned Value: * Angle expressed in the range 0-2 pi * Description: * Normalize angle into range 0-2 pi. * Notes: * - Uses eraAnp(). See SOFA/ERFA documentation for details. *- */ double palDranrm ( double angle ) { return eraAnp( angle ); } /* *+ * Name: * palDsep * Purpose: * Angle between two points on a sphere * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * ang = palDsep( double a1, double b1, double a2, double b2 ); * Arguments: * a1 = double (Given) * Spherical coordinate of one point (radians) * b1 = double (Given) * Spherical coordinate of one point (radians) * a2 = double (Given) * Spherical coordinate of other point (radians) * b2 = double (Given) * Spherical coordinate of other point (radians) * Returned Value: * Angle, in radians, between the two points. Always positive. * Description: * Angle between two points on a sphere. * Notes: * - The spherical coordinates are [RA,Dec], [Long,Lat] etc, in radians. * - Uses eraSeps(). See SOFA/ERFA documentation for details. *- */ double palDsep ( double a1, double b1, double a2, double b2 ) { return eraSeps( a1, b1, a2, b2 ); } /* *+ * Name: * palDsepv * Purpose: * Angle between two vectors * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * ang = palDsepv( double v1[3], double v2[3] ); * Arguments: * v1 = double [3] (Given) * First vector * v2 = double [3] (Given) * Second vector * Returned Value: * Angle, in radians, between the two points. Always positive. * Description: * Angle between two vectors. * Notes: * - Uses eraSepp(). See SOFA/ERFA documentation for details. *- */ double palDsepv ( double v1[3], double v2[3] ) { return eraSepp( v1, v2 ); } /* *+ * Name: * palDtf2d * Purpose: * Convert hours, minutes, seconds to days * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palDtf2d( int ihour, int imin, double sec, double *days, int *j ); * Arguments: * ihour = int (Given) * Hours * imin = int (Given) * Minutes * sec = double (Given) * Seconds * days = double * (Returned) * Interval in days * j = int * (Returned) * status: 0 = ok, 1 = ihour outside range 0-23, * 2 = imin outside range 0-59, 3 = sec outside range 0-59.999... * Description: * Convert hours, minutes, seconds to days. * Notes: * - Uses eraTf2d(). See SOFA/ERFA documentation for details. *- */ /* Assumes that the sign is always positive and is dealt with externally */ void palDtf2d ( int ihour, int imin, double sec, double *days, int *j ) { *j = eraTf2d( ' ', ihour, imin, sec, days ); } /* *+ * Name: * palDtf2r * Purpose: * Convert hours, minutes, seconds to radians * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palDtf2r( int ihour, int imin, double sec, double *rad, int *j ); * Arguments: * ihour = int (Given) * Hours * imin = int (Given) * Minutes * sec = double (Given) * Seconds * days = double * (Returned) * Angle in radians * j = int * (Returned) * status: 0 = ok, 1 = ihour outside range 0-23, * 2 = imin outside range 0-59, 3 = sec outside range 0-59.999... * Description: * Convert hours, minutes, seconds to radians. * Notes: * - Uses eraTf2a(). See SOFA/ERFA documentation for details. *- */ /* Assumes that the sign is dealt with outside this routine */ void palDtf2r ( int ihour, int imin, double sec, double *rad, int *j ) { *j = eraTf2a( ' ', ihour, imin, sec, rad ); } /* *+ * Name: * palDvdv * Purpose: * Scalar product of two 3-vectors * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * prod = palDvdv ( double va[3], double vb[3] ); * Arguments: * va = double [3] (Given) * First vector * vb = double [3] (Given) * Second vector * Returned Value: * Scalar product va.vb * Description: * Scalar product of two 3-vectors. * Notes: * - Uses eraPdp(). See SOFA/ERFA documentation for details. *- */ double palDvdv ( double va[3], double vb[3] ) { return eraPdp( va, vb ); } /* *+ * Name: * palDvn * Purpose: * Normalizes a 3-vector also giving the modulus * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palDvn( double v[3], double uv[3], double *vm ); * Arguments: * v = double [3] (Given) * vector * uv = double [3] (Returned) * unit vector in direction of "v" * vm = double * (Returned) * modulus of "v" * Description: * Normalizes a 3-vector also giving the modulus. * Notes: * - Uses eraPn(). See SOFA/ERFA documentation for details. *- */ /* Note that the arguments are flipped */ void palDvn ( double v[3], double uv[3], double *vm ) { eraPn( v, vm, uv ); } /* *+ * Name: * palDvxv * Purpose: * Vector product of two 3-vectors * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palDvxv( double va[3], double vb[3], double vc[3] ); * Arguments: * va = double [3] (Given) * First vector * vb = double [3] (Given) * Second vector * vc = double [3] (Returned) * Result vector * Description: * Vector product of two 3-vectors. * Notes: * - Uses eraPxp(). See SOFA/ERFA documentation for details. *- */ void palDvxv ( double va[3], double vb[3], double vc[3] ) { eraPxp( va, vb, vc ); } /* *+ * Name: * palEpb * Purpose: * Conversion of modified Julian Data to Besselian Epoch * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * epb = palEpb ( double date ); * Arguments: * date = double (Given) * Modified Julian Date (JD - 2400000.5) * Returned Value: * Besselian epoch. * Description: * Conversion of modified Julian Data to Besselian Epoch. * Notes: * - Uses eraEpb(). See SOFA/ERFA documentation for details. *- */ /* Requires additional SLA MJD reference date */ double palEpb ( double date ) { return eraEpb( PAL__MJD0, date ); } /* *+ * Name: * palEpb2d * Purpose: * Conversion of Besselian Epoch to Modified Julian Date * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * mjd = palEpb2d ( double epb ); * Arguments: * epb = double (Given) * Besselian Epoch * Returned Value: * Modified Julian Date (JD - 2400000.5) * Description: * Conversion of Besselian Epoch to Modified Julian Date. * Notes: * - Uses eraEpb2jd(). See SOFA/ERFA documentation for details. *- */ double palEpb2d ( double epb ) { double djm0, djm; eraEpb2jd( epb, &djm0, &djm ); return djm; } /* *+ * Name: * palEpj * Purpose: * Conversion of Modified Julian Date to Julian Epoch * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * epj = palEpj ( double date ); * Arguments: * date = double (Given) * Modified Julian Date (JD - 2400000.5) * Returned Value: * The Julian Epoch. * Description: * Conversion of Modified Julian Date to Julian Epoch. * Notes: * - Uses eraEpj(). See SOFA/ERFA documentation for details. *- */ /* Requires additional SLA MJD reference date */ double palEpj ( double date ) { return eraEpj( PAL__MJD0, date ); } /* *+ * Name: * palEpj2d * Purpose: * Conversion of Julian Epoch to Modified Julian Date * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * mjd = palEpj2d ( double epj ); * Arguments: * epj = double (Given) * Julian Epoch. * Returned Value: * Modified Julian Date (JD - 2400000.5) * Description: * Conversion of Julian Epoch to Modified Julian Date. * Notes: * - Uses eraEpj2d(). See SOFA/ERFA documentation for details. *- */ double palEpj2d ( double epj ) { double djm0, djm; eraEpj2jd( epj, &djm0, &djm ); return djm; } /* *+ * Name: * palEqeqx * Purpose: * Equation of the equinoxes (IAU 2000/2006) * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palEqeqx( double date ); * Arguments: * date = double (Given) * TT as Modified Julian Date (JD-400000.5) * Description: * Equation of the equinoxes (IAU 2000/2006). * Notes: * - Uses eraEe06a(). See SOFA/ERFA documentation for details. *- */ /* Requires additional SLA MJD reference date */ double palEqeqx ( double date ) { return eraEe06a( PAL__MJD0, date ); } /* *+ * Name: * palFk5hz * Purpose: * Transform an FK5 (J2000) star position into the frame of the * Hipparcos catalogue. * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palFk5hz ( double r5, double d5, double epoch, * double *rh, double *dh ); * Arguments: * r5 = double (Given) * FK5 RA (radians), equinox J2000, epoch "epoch" * d5 = double (Given) * FK5 dec (radians), equinox J2000, epoch "epoch" * epoch = double (Given) * Julian epoch * rh = double * (Returned) * RA (radians) * dh = double * (Returned) * Dec (radians) * Description: * Transform an FK5 (J2000) star position into the frame of the * Hipparcos catalogue. * Notes: * - Assumes zero Hipparcos proper motion. * - Uses eraEpj2jd() and eraFk5hz. * See SOFA/ERFA documentation for details. *- */ void palFk5hz ( double r5, double d5, double epoch, double *rh, double *dh ) { /* Need to convert epoch to Julian date first */ double date1, date2; eraEpj2jd( epoch, &date1, &date2 ); eraFk5hz( r5, d5, date1, date2, rh, dh ); } /* *+ * Name: * palGmst * Purpose: * Greenwich mean sidereal time (consistent with IAU 2006 precession). * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * mst = palGmst ( double ut1 ); * Arguments: * ut1 = double (Given) * Universal time (UT1) expressed as modified Julian Date (JD-2400000.5) * Returned Value: * Greenwich mean sidereal time * Description: * Greenwich mean sidereal time (consistent with IAU 2006 precession). * Notes: * - Uses eraGmst06(). See SOFA/ERFA documentation for details. *- */ /* Note that SOFA/ERFA has more accurate time arguments and we use the 2006 precession model */ double palGmst ( double ut1 ) { return eraGmst06( PAL__MJD0, ut1, PAL__MJD0, ut1 ); } /* *+ * Name: * palGmsta * Purpose: * Greenwich mean sidereal time (consistent with IAU 2006 precession). * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * mst = palGmsta ( double date, double ut1 ); * Arguments: * date = double (Given) * UT1 date (MJD: integer part of JD-2400000.5) * ut1 = double (Given) * UT1 time (fraction of a day) * Returned Value: * Greenwich mean sidereal time (in range 0 to 2 pi) * Description: * Greenwich mean sidereal time (consistent with IAU 2006 precession). * Notes: * - For best accuracy use eraGmst06() directly. * - Uses eraGmst06(). See SOFA/ERFA documentation for details. *- */ /* Slightly better but still not as accurate as SOFA/ERFA */ double palGmsta( double date, double ut ) { date += PAL__MJD0; return eraGmst06( date, ut, date, ut ); } /* *+ * Name: * palHfk5z * Purpose: * Hipparcos star position to FK5 J2000 * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palHfk5z( double rh, double dh, double epoch, * double *r5, double *d5, double *dr5, double *dd5 ); * Arguments: * rh = double (Given) * Hipparcos RA (radians) * dh = double (Given) * Hipparcos Dec (radians) * epoch = double (Given) * Julian epoch (TDB) * r5 = double * (Returned) * RA (radians, FK5, equinox J2000, epoch "epoch") * d5 = double * (Returned) * Dec (radians, FK5, equinox J2000, epoch "epoch") * Description: * Transform a Hipparcos star position into FK5 J2000, assuming * zero Hipparcos proper motion. * Notes: * - Uses eraEpj2jd and eraHfk5z(). See SOFA/ERFA documentation for details. *- */ void palHfk5z ( double rh, double dh, double epoch, double *r5, double *d5, double *dr5, double *dd5 ) { /* Need to convert epoch to Julian date first */ double date1, date2; eraEpj2jd( epoch, &date1, &date2 ); eraHfk5z( rh, dh, date1, date2, r5, d5, dr5, dd5 ); } /* *+ * Name: * palRefcoq * Purpose: * Determine the constants A and B in the atmospheric refraction model * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palRefcoq( double tdk, double pmb, double rh, double wl, * double *refa, double *refb ); * Arguments: * tdk = double (Given) * Ambient temperature at the observer (K) * pmb = double (Given) * Pressure at the observer (millibar) * rh = double (Given) * Relative humidity at the observer (range 0-1) * wl = double (Given) * Effective wavelength of the source (micrometre). * Radio refraction is chosen by specifying wl > 100 micrometres. * refa = double * (Returned) * tan Z coefficient (radian) * refb = double * (Returned) * tan**3 Z coefficient (radian) * Description: * Determine the constants A and B in the atmospheric refraction * model dZ = A tan Z + B tan**3 Z. This is a fast alternative * to the palRefco routine. * * Z is the "observed" zenith distance (i.e. affected by refraction) * and dZ is what to add to Z to give the "topocentric" (i.e. in vacuo) * zenith distance. * Notes: * - Uses eraRefco(). See SOFA/ERFA documentation for details. * - Note that the SOFA/ERFA routine uses different order of * of arguments and uses deg C rather than K. *- */ void palRefcoq ( double tdk, double pmb, double rh, double wl, double *refa, double *refb ) { /* Note that SLA (and therefore PAL) uses units of kelvin but SOFA/ERFA uses deg C */ eraRefco( pmb, tdk - 273.15, rh, wl, refa, refb ); } pal-0.9.7/palPa.c000066400000000000000000000050621302604645500135140ustar00rootroot00000000000000/* *+ * Name: * palPa * Purpose: * HA, Dec to Parallactic Angle * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * double palPa( double ha, double dec, double phi ); * Arguments: * ha = double (Given) * Hour angle in radians (Geocentric apparent) * dec = double (Given) * Declination in radians (Geocentric apparent) * phi = double (Given) * Observatory latitude in radians (geodetic) * Returned Value: * palPa = double * Parallactic angle in the range -pi to +pi. * Description: * Converts HA, Dec to Parallactic Angle. * Authors: * PTW: Patrick T. Wallace * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - The parallactic angle at a point in the sky is the position * angle of the vertical, i.e. the angle between the direction to * the pole and to the zenith. In precise applications care must * be taken only to use geocentric apparent HA,Dec and to consider * separately the effects of atmospheric refraction and telescope * mount errors. * - At the pole a zero result is returned. * History: * 2012-03-02 (TIMJ): * Initial version * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1995 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include double palPa( double ha, double dec, double phi ) { double cp, sqsz, cqsz; cp = cos(phi); sqsz = cp * sin(ha); cqsz = sin(phi) * cos(dec) - cp * sin(dec) * cos(ha); if (sqsz == 0.0 && cqsz == 0.0) cqsz = 1.0; return atan2( sqsz, cqsz ); } pal-0.9.7/palPcd.c000066400000000000000000000056411302604645500136650ustar00rootroot00000000000000/* *+ * Name: * palPcd * Purpose: * Apply pincushion/barrel distortion to a tangent-plane [x,y] * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palPcd( double disco, double * x, double * y ); * Arguments: * disco = double (Given) * Pincushion/barrel distortion coefficient. * x = double * (Given & Returned) * On input the tangent-plane X coordinate, on output * the distorted X coordinate. * y = double * (Given & Returned) * On input the tangent-plane Y coordinate, on output * the distorted Y coordinate. * Description: * Applies pincushion and barrel distortion to a tangent * plane coordinate. * Authors: * PTW: Pat Wallace (RAL) * TIMJ: Tim Jenness * {enter_new_authors_here} * Notes: * - The distortion is of the form RP = R*(1 + C*R**2), where R is * the radial distance from the tangent point, C is the DISCO * argument, and RP is the radial distance in the presence of * the distortion. * * - For pincushion distortion, C is +ve; for barrel distortion, * C is -ve. * * - For X,Y in units of one projection radius (in the case of * a photographic plate, the focal length), the following * DISCO values apply: * * Geometry DISCO * * astrograph 0.0 * Schmidt -0.3333 * AAT PF doublet +147.069 * AAT PF triplet +178.585 * AAT f/8 +21.20 * JKT f/8 +13.32 * * See Also: * - There is a companion routine, palUnpcd, which performs the * inverse operation. * History: * 2000-09-03 (PTW): * SLALIB implementation. * 2015-01-01 (TIMJ): * Initial version. Ported from Fortran. * {enter_further_changes_here} * Copyright: * Copyright (C) 2000 Rutherford Appleton Laboratory. * Copyright (C) 2015 Tim Jenness * All Rights Reserved. * Licence: * 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 SLA_CONDITIONS); if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" void palPcd( double disco, double *x, double *y ) { double f; f = 1.0 + disco * ( (*x) * (*x) + (*y) * (*y) ); *x *= f; *y *= f; } pal-0.9.7/palPertel.c000066400000000000000000000170561302604645500144150ustar00rootroot00000000000000/* *+ * Name: * palPertel * Purpose: * Update elements by applying planetary perturbations * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palPertel (int jform, double date0, double date1, * double epoch0, double orbi0, double anode0, * double perih0, double aorq0, double e0, double am0, * double *epoch1, double *orbi1, double *anode1, * double *perih1, double *aorq1, double *e1, double *am1, * int *jstat ); * Arguments: * jform = int (Given) * Element set actually returned (1-3; Note 6) * date0 = double (Given) * Date of osculation (TT MJD) for the given elements. * date1 = double (Given) * Date of osculation (TT MJD) for the updated elements. * epoch0 = double (Given) * Epoch of elements (TT MJD) * orbi0 = double (Given) * inclination (radians) * anode0 = double (Given) * longitude of the ascending node (radians) * perih0 = double (Given) * longitude or argument of perihelion (radians) * aorq0 = double (Given) * mean distance or perihelion distance (AU) * e0 = double (Given) * eccentricity * am0 = double (Given) * mean anomaly (radians, JFORM=2 only) * epoch1 = double * (Returned) * Epoch of elements (TT MJD) * orbi1 = double * (Returned) * inclination (radians) * anode1 = double * (Returned) * longitude of the ascending node (radians) * perih1 = double * (Returned) * longitude or argument of perihelion (radians) * aorq1 = double * (Returned) * mean distance or perihelion distance (AU) * e1 = double * (Returned) * eccentricity * am1 = double * (Returned) * mean anomaly (radians, JFORM=2 only) * jstat = int * (Returned) * status: * - +102 = warning, distant epoch * - +101 = warning, large timespan ( > 100 years) * - +1 to +10 = coincident with planet (Note 6) * - 0 = OK * - -1 = illegal JFORM * - -2 = illegal E0 * - -3 = illegal AORQ0 * - -4 = internal error * - -5 = numerical error * Description: * Update the osculating orbital elements of an asteroid or comet by * applying planetary perturbations. * Authors: * PTW: Pat Wallace (STFC) * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - Two different element-format options are available: * * Option JFORM=2, suitable for minor planets: * * EPOCH = epoch of elements (TT MJD) * ORBI = inclination i (radians) * ANODE = longitude of the ascending node, big omega (radians) * PERIH = argument of perihelion, little omega (radians) * AORQ = mean distance, a (AU) * E = eccentricity, e * AM = mean anomaly M (radians) * * Option JFORM=3, suitable for comets: * * EPOCH = epoch of perihelion (TT MJD) * ORBI = inclination i (radians) * ANODE = longitude of the ascending node, big omega (radians) * PERIH = argument of perihelion, little omega (radians) * AORQ = perihelion distance, q (AU) * E = eccentricity, e * * - DATE0, DATE1, EPOCH0 and EPOCH1 are all instants of time in * the TT timescale (formerly Ephemeris Time, ET), expressed * as Modified Julian Dates (JD-2400000.5). * * DATE0 is the instant at which the given (i.e. unperturbed) * osculating elements are correct. * * DATE1 is the specified instant at which the updated osculating * elements are correct. * * EPOCH0 and EPOCH1 will be the same as DATE0 and DATE1 * (respectively) for the JFORM=2 case, normally used for minor * planets. For the JFORM=3 case, the two epochs will refer to * perihelion passage and so will not, in general, be the same as * DATE0 and/or DATE1 though they may be similar to one another. * - The elements are with respect to the J2000 ecliptic and equinox. * - Unused elements (AM0 and AM1 for JFORM=3) are not accessed. * - See the palPertue routine for details of the algorithm used. * - This routine is not intended to be used for major planets, which * is why JFORM=1 is not available and why there is no opportunity * to specify either the longitude of perihelion or the daily * motion. However, if JFORM=2 elements are somehow obtained for a * major planet and supplied to the routine, sensible results will, * in fact, be produced. This happens because the palPertue routine * that is called to perform the calculations checks the separation * between the body and each of the planets and interprets a * suspiciously small value (0.001 AU) as an attempt to apply it to * the planet concerned. If this condition is detected, the * contribution from that planet is ignored, and the status is set to * the planet number (1-10 = Mercury, Venus, EMB, Mars, Jupiter, * Saturn, Uranus, Neptune, Earth, Moon) as a warning. * * See Also: * - Sterne, Theodore E., "An Introduction to Celestial Mechanics", * Interscience Publishers Inc., 1960. Section 6.7, p199. * History: * 2012-03-12 (TIMJ): * Initial version direct conversion of SLA/F. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2004 Patrick T. Wallace * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" void palPertel (int jform, double date0, double date1, double epoch0, double orbi0, double anode0, double perih0, double aorq0, double e0, double am0, double *epoch1, double *orbi1, double *anode1, double *perih1, double *aorq1, double *e1, double *am1, int *jstat ) { double u[13], dm; int j, jf; /* Check that the elements are either minor-planet or comet format. */ if (jform < 2 || jform > 3) { *jstat = -1; return; } else { /* Provisionally set the status to OK. */ *jstat = 0; } /* Transform the elements from conventional to universal form. */ palEl2ue(date0,jform,epoch0,orbi0,anode0,perih0, aorq0,e0,am0,0.0,u,&j); if (j != 0) { *jstat = j; return; } /* Update the universal elements. */ palPertue(date1,u,&j); if (j > 0) { *jstat = j; } else if (j < 0) { *jstat = -5; return; } /* Transform from universal to conventional elements. */ palUe2el(u, jform, &jf, epoch1, orbi1, anode1, perih1, aorq1, e1, am1, &dm, &j); if (jf != jform || j != 0) *jstat = -5; } pal-0.9.7/palPertue.c000066400000000000000000000476711302604645500144340ustar00rootroot00000000000000/* *+ * Name: * palPertue * Purpose: * Update the universal elements by applying planetary perturbations * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palPertue( double date, double u[13], int *jstat ); * Arguments: * date = double (Given) * Final epoch (TT MJD) for the update elements. * u = const double [13] (Given & Returned) * Universal orbital elements (Note 1) * (0) combined mass (M+m) * (1) total energy of the orbit (alpha) * (2) reference (osculating) epoch (t0) * (3-5) position at reference epoch (r0) * (6-8) velocity at reference epoch (v0) * (9) heliocentric distance at reference epoch * (10) r0.v0 * (11) date (t) * (12) universal eccentric anomaly (psi) of date, approx * jstat = int * (Returned) * status: * +102 = warning, distant epoch * +101 = warning, large timespan ( > 100 years) * +1 to +10 = coincident with major planet (Note 5) * 0 = OK * -1 = numerical error * Description: * Update the universal elements of an asteroid or comet by applying * planetary perturbations. * Authors: * PTW: Pat Wallace (STFC) * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - The "universal" elements are those which define the orbit for the * purposes of the method of universal variables (see reference 2). * They consist of the combined mass of the two bodies, an epoch, * and the position and velocity vectors (arbitrary reference frame) * at that epoch. The parameter set used here includes also various * quantities that can, in fact, be derived from the other * information. This approach is taken to avoiding unnecessary * computation and loss of accuracy. The supplementary quantities * are (i) alpha, which is proportional to the total energy of the * orbit, (ii) the heliocentric distance at epoch, (iii) the * outwards component of the velocity at the given epoch, (iv) an * estimate of psi, the "universal eccentric anomaly" at a given * date and (v) that date. * - The universal elements are with respect to the J2000 equator and * equinox. * - The epochs DATE, U(3) and U(12) are all Modified Julian Dates * (JD-2400000.5). * - The algorithm is a simplified form of Encke's method. It takes as * a basis the unperturbed motion of the body, and numerically * integrates the perturbing accelerations from the major planets. * The expression used is essentially Sterne's 6.7-2 (reference 1). * Everhart and Pitkin (reference 2) suggest rectifying the orbit at * each integration step by propagating the new perturbed position * and velocity as the new universal variables. In the present * routine the orbit is rectified less frequently than this, in order * to gain a slight speed advantage. However, the rectification is * done directly in terms of position and velocity, as suggested by * Everhart and Pitkin, bypassing the use of conventional orbital * elements. * * The f(q) part of the full Encke method is not used. The purpose * of this part is to avoid subtracting two nearly equal quantities * when calculating the "indirect member", which takes account of the * small change in the Sun's attraction due to the slightly displaced * position of the perturbed body. A simpler, direct calculation in * double precision proves to be faster and not significantly less * accurate. * * Apart from employing a variable timestep, and occasionally * "rectifying the orbit" to keep the indirect member small, the * integration is done in a fairly straightforward way. The * acceleration estimated for the middle of the timestep is assumed * to apply throughout that timestep; it is also used in the * extrapolation of the perturbations to the middle of the next * timestep, to predict the new disturbed position. There is no * iteration within a timestep. * * Measures are taken to reach a compromise between execution time * and accuracy. The starting-point is the goal of achieving * arcsecond accuracy for ordinary minor planets over a ten-year * timespan. This goal dictates how large the timesteps can be, * which in turn dictates how frequently the unperturbed motion has * to be recalculated from the osculating elements. * * Within predetermined limits, the timestep for the numerical * integration is varied in length in inverse proportion to the * magnitude of the net acceleration on the body from the major * planets. * * The numerical integration requires estimates of the major-planet * motions. Approximate positions for the major planets (Pluto * alone is omitted) are obtained from the routine palPlanet. Two * levels of interpolation are used, to enhance speed without * significantly degrading accuracy. At a low frequency, the routine * palPlanet is called to generate updated position+velocity "state * vectors". The only task remaining to be carried out at the full * frequency (i.e. at each integration step) is to use the state * vectors to extrapolate the planetary positions. In place of a * strictly linear extrapolation, some allowance is made for the * curvature of the orbit by scaling back the radius vector as the * linear extrapolation goes off at a tangent. * * Various other approximations are made. For example, perturbations * by Pluto and the minor planets are neglected and relativistic * effects are not taken into account. * * In the interests of simplicity, the background calculations for * the major planets are carried out en masse. The mean elements and * state vectors for all the planets are refreshed at the same time, * without regard for orbit curvature, mass or proximity. * * The Earth-Moon system is treated as a single body when the body is * distant but as separate bodies when closer to the EMB than the * parameter RNE, which incurs a time penalty but improves accuracy * for near-Earth objects. * * - This routine is not intended to be used for major planets. * However, if major-planet elements are supplied, sensible results * will, in fact, be produced. This happens because the routine * checks the separation between the body and each of the planets and * interprets a suspiciously small value (0.001 AU) as an attempt to * apply the routine to the planet concerned. If this condition is * detected, the contribution from that planet is ignored, and the * status is set to the planet number (1-10 = Mercury, Venus, EMB, * Mars, Jupiter, Saturn, Uranus, Neptune, Earth, Moon) as a warning. * See Also: * - Sterne, Theodore E., "An Introduction to Celestial Mechanics", * Interscience Publishers Inc., 1960. Section 6.7, p199. * - Everhart, E. & Pitkin, E.T., Am.J.Phys. 51, 712, 1983. * History: * 2012-03-12 (TIMJ): * Initial version direct conversion of SLA/F. * Adapted with permission from the Fortran SLALIB library. * 2012-06-21 (TIMJ): * Support a lack of copysign() function. * 2012-06-22 (TIMJ): * Check __STDC_VERSION__ * {enter_further_changes_here} * Copyright: * Copyright (C) 2004 Patrick T. Wallace * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ /* Use the config file if we have one, else look at compiler defines to see if we have C99 */ #if HAVE_CONFIG_H #include #else #ifdef __STDC_VERSION__ # if (__STDC_VERSION__ >= 199901L) # define HAVE_COPYSIGN 1 # endif #endif #endif #include #include "pal.h" #include "palmac.h" #include "pal1sofa.h" /* copysign is C99 */ #if HAVE_COPYSIGN # define COPYSIGN copysign #else # define COPYSIGN(a,b) DSIGN(a,b) #endif void palPertue( double date, double u[13], int *jstat ) { /* Distance from EMB at which Earth and Moon are treated separately */ const double RNE=1.0; /* Coincidence with major planet distance */ const double COINC=0.0001; /* Coefficient relating timestep to perturbing force */ const double TSC=1e-4; /* Minimum and maximum timestep (days) */ const double TSMIN = 0.01; const double TSMAX = 10.0; /* Age limit for major-planet state vector (days) */ const double AGEPMO=5.0; /* Age limit for major-planet mean elements (days) */ const double AGEPEL=50.0; /* Margin for error when deciding whether to renew the planetary data */ const double TINY=1e-6; /* Age limit for the body's osculating elements (before rectification) */ const double AGEBEL=100.0; /* Gaussian gravitational constant squared */ const double GCON2 = PAL__GCON * PAL__GCON; /* The final epoch */ double TFINAL; /* The body's current universal elements */ double UL[13]; /* Current reference epoch */ double T0; /* Timespan from latest orbit rectification to final epoch (days) */ double TSPAN; /* Time left to go before integration is complete */ double TLEFT; /* Time direction flag: +1=forwards, -1=backwards */ double FB; /* First-time flag */ int FIRST = 0; /* * The current perturbations */ /* Epoch (days relative to current reference epoch) */ double RTN; /* Position (AU) */ double PERP[3]; /* Velocity (AU/d) */ double PERV[3]; /* Acceleration (AU/d/d) */ double PERA[3]; /* Length of current timestep (days), and half that */ double TS,HTS; /* Epoch of middle of timestep */ double T; /* Epoch of planetary mean elements */ double TPEL = 0.0; /* Planet number (1=Mercury, 2=Venus, 3=EMB...8=Neptune) */ int NP; /* Planetary universal orbital elements */ double UP[8][13]; /* Epoch of planetary state vectors */ double TPMO = 0.0; /* State vectors for the major planets (AU,AU/s) */ double PVIN[8][6]; /* Earth velocity and position vectors (AU,AU/s) */ double VB[3],PB[3],VH[3],PE[3]; /* Moon geocentric state vector (AU,AU/s) and position part */ double PVM[6],PM[3]; /* Date to J2000 de-precession matrix */ double PMAT[3][3]; /* * Correction terms for extrapolated major planet vectors */ /* Sun-to-planet distances squared multiplied by 3 */ double R2X3[8]; /* Sunward acceleration terms, G/2R^3 */ double GC[8]; /* Tangential-to-circular correction factor */ double FC; /* Radial correction factor due to Sunwards acceleration */ double FG; /* The body's unperturbed and perturbed state vectors (AU,AU/s) */ double PV0[6],PV[6]; /* The body's perturbed and unperturbed heliocentric distances (AU) cubed */ double R03,R3; /* The perturbating accelerations, indirect and direct */ double FI[3],FD[3]; /* Sun-to-planet vector, and distance cubed */ double RHO[3],RHO3; /* Body-to-planet vector, and distance cubed */ double DELTA[3],DELTA3; /* Miscellaneous */ int I,J; double R2,W,DT,DT2,R,FT; int NE; /* Planetary inverse masses, Mercury through Neptune then Earth and Moon */ const double AMAS[10] = { 6023600., 408523.5, 328900.5, 3098710., 1047.355, 3498.5, 22869., 19314., 332946.038, 27068709. }; /* Preset the status to OK. */ *jstat = 0; /* Copy the final epoch. */ TFINAL = date; /* Copy the elements (which will be periodically updated). */ for (I=0; I<13; I++) { UL[I] = u[I]; } /* Initialize the working reference epoch. */ T0=UL[2]; /* Total timespan (days) and hence time left. */ TSPAN = TFINAL-T0; TLEFT = TSPAN; /* Warn if excessive. */ if (fabs(TSPAN) > 36525.0) *jstat=101; /* Time direction: +1 for forwards, -1 for backwards. */ FB = COPYSIGN(1.0,TSPAN); /* Initialize relative epoch for start of current timestep. */ RTN = 0.0; /* Reset the perturbations (position, velocity, acceleration). */ for (I=0; I<3; I++) { PERP[I] = 0.0; PERV[I] = 0.0; PERA[I] = 0.0; } /* Set "first iteration" flag. */ FIRST = 1; /* Step through the time left. */ while (FB*TLEFT > 0.0) { /* Magnitude of current acceleration due to planetary attractions. */ if (FIRST) { TS = TSMIN; } else { R2 = 0.0; for (I=0; I<3; I++) { W = FD[I]; R2 = R2+W*W; } W = sqrt(R2); /* Use the acceleration to decide how big a timestep can be tolerated. */ if (W != 0.0) { TS = DMIN(TSMAX,DMAX(TSMIN,TSC/W)); } else { TS = TSMAX; } } TS = TS*FB; /* Override if final epoch is imminent. */ TLEFT = TSPAN-RTN; if (fabs(TS) > fabs(TLEFT)) TS=TLEFT; /* Epoch of middle of timestep. */ HTS = TS/2.0; T = T0+RTN+HTS; /* Is it time to recompute the major-planet elements? */ if (FIRST || fabs(T-TPEL)-AGEPEL >= TINY) { /* Yes: go forward in time by just under the maximum allowed. */ TPEL = T+FB*AGEPEL; /* Compute the state vector for the new epoch. */ for (NP=1; NP<=8; NP++) { palPlanet(TPEL,NP,PV,&J); /* Warning if remote epoch, abort if error. */ if (J == 1) { *jstat = 102; } else if (J != 0) { goto ABORT; } /* Transform the vector into universal elements. */ palPv2ue(PV,TPEL,0.0,&(UP[NP-1][0]),&J); if (J != 0) goto ABORT; } } /* Is it time to recompute the major-planet motions? */ if (FIRST || fabs(T-TPMO)-AGEPMO >= TINY) { /* Yes: look ahead. */ TPMO = T+FB*AGEPMO; /* Compute the motions of each planet (AU,AU/d). */ for (NP=1; NP<=8; NP++) { /* The planet's position and velocity (AU,AU/s). */ palUe2pv(TPMO,&(UP[NP-1][0]),&(PVIN[NP-1][0]),&J); if (J != 0) goto ABORT; /* Scale velocity to AU/d. */ for (J=3; J<6; J++) { PVIN[NP-1][J] = PVIN[NP-1][J]*PAL__SPD; } /* Precompute also the extrapolation correction terms. */ R2 = 0.0; for (I=0; I<3; I++) { W = PVIN[NP-1][I]; R2 = R2+W*W; } R2X3[NP-1] = R2*3.0; GC[NP-1] = GCON2/(2.0*R2*sqrt(R2)); } } /* Reset the first-time flag. */ FIRST = 0; /* Unperturbed motion of the body at middle of timestep (AU,AU/s). */ palUe2pv(T,UL,PV0,&J); if (J != 0) goto ABORT; /* Perturbed position of the body (AU) and heliocentric distance cubed. */ R2 = 0.0; for (I=0; I<3; I++) { W = PV0[I]+PERP[I]+(PERV[I]+PERA[I]*HTS/2.0)*HTS; PV[I] = W; R2 = R2+W*W; } R3 = R2*sqrt(R2); /* The body's unperturbed heliocentric distance cubed. */ R2 = 0.0; for (I=0; I<3; I++) { W = PV0[I]; R2 = R2+W*W; } R03 = R2*sqrt(R2); /* Compute indirect and initialize direct parts of the perturbation. */ for (I=0; I<3; I++) { FI[I] = PV0[I]/R03-PV[I]/R3; FD[I] = 0.0; } /* Ready to compute the direct planetary effects. */ /* Reset the "near-Earth" flag. */ NE = 0; /* Interval from state-vector epoch to middle of current timestep. */ DT = T-TPMO; DT2 = DT*DT; /* Planet by planet, including separate Earth and Moon. */ for (NP=1; NP<10; NP++) { /* Which perturbing body? */ if (NP <= 8) { /* Planet: compute the extrapolation in longitude (squared). */ R2 = 0.0; for (J=3; J<6; J++) { W = PVIN[NP-1][J]*DT; R2 = R2+W*W; } /* Hence the tangential-to-circular correction factor. */ FC = 1.0+R2/R2X3[NP-1]; /* The radial correction factor due to the inwards acceleration. */ FG = 1.0-GC[NP-1]*DT2; /* Planet's position. */ for (I=0; I<3; I++) { RHO[I] = FG*(PVIN[NP-1][I]+FC*PVIN[NP-1][I+3]*DT); } } else if (NE) { /* Near-Earth and either Earth or Moon. */ if (NP == 9) { /* Earth: position. */ palEpv(T,PE,VH,PB,VB); for (I=0; I<3; I++) { RHO[I] = PE[I]; } } else { /* Moon: position. */ palPrec(palEpj(T),2000.0,PMAT); palDmoon(T,PVM); eraRxp(PMAT,PVM,PM); for (I=0; I<3; I++) { RHO[I] = PM[I]+PE[I]; } } } /* Proceed unless Earth or Moon and not the near-Earth case. */ if (NP <= 8 || NE) { /* Heliocentric distance cubed. */ R2 = 0.0; for (I=0; I<3; I++) { W = RHO[I]; R2 = R2+W*W; } R = sqrt(R2); RHO3 = R2*R; /* Body-to-planet vector, and distance. */ R2 = 0.0; for (I=0; I<3; I++) { W = RHO[I]-PV[I]; DELTA[I] = W; R2 = R2+W*W; } R = sqrt(R2); /* If this is the EMB, set the near-Earth flag appropriately. */ if (NP == 3 && R < RNE) NE = 1; /* Proceed unless EMB and this is the near-Earth case. */ if ( ! (NE && NP == 3) ) { /* If too close, ignore this planet and set a warning. */ if (R < COINC) { *jstat = NP; } else { /* Accumulate "direct" part of perturbation acceleration. */ DELTA3 = R2*R; W = AMAS[NP-1]; for (I=0; I<3; I++) { FD[I] = FD[I]+(DELTA[I]/DELTA3-RHO[I]/RHO3)/W; } } } } } /* Update the perturbations to the end of the timestep. */ RTN += TS; for (I=0; I<3; I++) { W = (FI[I]+FD[I])*GCON2; FT = W*TS; PERP[I] = PERP[I]+(PERV[I]+FT/2.0)*TS; PERV[I] = PERV[I]+FT; PERA[I] = W; } /* Time still to go. */ TLEFT = TSPAN-RTN; /* Is it either time to rectify the orbit or the last time through? */ if (fabs(RTN) >= AGEBEL || FB*TLEFT <= 0.0) { /* Yes: update to the end of the current timestep. */ T0 += RTN; RTN = 0.0; /* The body's unperturbed motion (AU,AU/s). */ palUe2pv(T0,UL,PV0,&J); if (J != 0) goto ABORT; /* Add and re-initialize the perturbations. */ for (I=0; I<3; I++) { J = I+3; PV[I] = PV0[I]+PERP[I]; PV[J] = PV0[J]+PERV[I]/PAL__SPD; PERP[I] = 0.0; PERV[I] = 0.0; PERA[I] = FD[I]*GCON2; } /* Use the position and velocity to set up new universal elements. */ palPv2ue(PV,T0,0.0,UL,&J); if (J != 0) goto ABORT; /* Adjust the timespan and time left. */ TSPAN = TFINAL-T0; TLEFT = TSPAN; } /* Next timestep. */ } /* Return the updated universal-element set. */ for (I=0; I<13; I++) { u[I] = UL[I]; } /* Finished. */ return; /* Miscellaneous numerical error. */ ABORT: *jstat = -1; return; } pal-0.9.7/palPlanel.c000066400000000000000000000202051302604645500143630ustar00rootroot00000000000000/* *+ * Name: * palPlanel * Purpose: * Transform conventional elements into position and velocity * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palPlanel ( double date, int jform, double epoch, double orbinc, * double anode, double perih, double aorq, double e, * double aorl, double dm, double pv[6], int *jstat ); * Arguments: * date = double (Given) * Epoch (TT MJD) of osculation (Note 1) * jform = int (Given) * Element set actually returned (1-3; Note 3) * epoch = double (Given) * Epoch of elements (TT MJD) (Note 4) * orbinc = double (Given) * inclination (radians) * anode = double (Given) * longitude of the ascending node (radians) * perih = double (Given) * longitude or argument of perihelion (radians) * aorq = double (Given) * mean distance or perihelion distance (AU) * e = double (Given) * eccentricity * aorl = double (Given) * mean anomaly or longitude (radians, JFORM=1,2 only) * dm = double (Given) * daily motion (radians, JFORM=1 only) * u = double [13] (Returned) * Universal orbital elements (Note 1) * (0) combined mass (M+m) * (1) total energy of the orbit (alpha) * (2) reference (osculating) epoch (t0) * (3-5) position at reference epoch (r0) * (6-8) velocity at reference epoch (v0) * (9) heliocentric distance at reference epoch * (10) r0.v0 * (11) date (t) * (12) universal eccentric anomaly (psi) of date, approx * jstat = int * (Returned) * status: 0 = OK * - -1 = illegal JFORM * - -2 = illegal E * - -3 = illegal AORQ * - -4 = illegal DM * - -5 = numerical error * Description: * Heliocentric position and velocity of a planet, asteroid or comet, * starting from orbital elements. * Authors: * PTW: Pat Wallace (STFC) * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - DATE is the instant for which the prediction is required. It is * in the TT timescale (formerly Ephemeris Time, ET) and is a * Modified Julian Date (JD-2400000.5). * - The elements are with respect to the J2000 ecliptic and equinox. * - A choice of three different element-set options is available: * * Option JFORM = 1, suitable for the major planets: * * EPOCH = epoch of elements (TT MJD) * ORBINC = inclination i (radians) * ANODE = longitude of the ascending node, big omega (radians) * PERIH = longitude of perihelion, curly pi (radians) * AORQ = mean distance, a (AU) * E = eccentricity, e (range 0 to <1) * AORL = mean longitude L (radians) * DM = daily motion (radians) * * Option JFORM = 2, suitable for minor planets: * * EPOCH = epoch of elements (TT MJD) * ORBINC = inclination i (radians) * ANODE = longitude of the ascending node, big omega (radians) * PERIH = argument of perihelion, little omega (radians) * AORQ = mean distance, a (AU) * E = eccentricity, e (range 0 to <1) * AORL = mean anomaly M (radians) * * Option JFORM = 3, suitable for comets: * * EPOCH = epoch of elements and perihelion (TT MJD) * ORBINC = inclination i (radians) * ANODE = longitude of the ascending node, big omega (radians) * PERIH = argument of perihelion, little omega (radians) * AORQ = perihelion distance, q (AU) * E = eccentricity, e (range 0 to 10) * * Unused arguments (DM for JFORM=2, AORL and DM for JFORM=3) are not * accessed. * - Each of the three element sets defines an unperturbed heliocentric * orbit. For a given epoch of observation, the position of the body * in its orbit can be predicted from these elements, which are * called "osculating elements", using standard two-body analytical * solutions. However, due to planetary perturbations, a given set * of osculating elements remains usable for only as long as the * unperturbed orbit that it describes is an adequate approximation * to reality. Attached to such a set of elements is a date called * the "osculating epoch", at which the elements are, momentarily, * a perfect representation of the instantaneous position and * velocity of the body. * * Therefore, for any given problem there are up to three different * epochs in play, and it is vital to distinguish clearly between * them: * * . The epoch of observation: the moment in time for which the * position of the body is to be predicted. * * . The epoch defining the position of the body: the moment in time * at which, in the absence of purturbations, the specified * position (mean longitude, mean anomaly, or perihelion) is * reached. * * . The osculating epoch: the moment in time at which the given * elements are correct. * * For the major-planet and minor-planet cases it is usual to make * the epoch that defines the position of the body the same as the * epoch of osculation. Thus, only two different epochs are * involved: the epoch of the elements and the epoch of observation. * * For comets, the epoch of perihelion fixes the position in the * orbit and in general a different epoch of osculation will be * chosen. Thus, all three types of epoch are involved. * * For the present routine: * * . The epoch of observation is the argument DATE. * * . The epoch defining the position of the body is the argument * EPOCH. * * . The osculating epoch is not used and is assumed to be close * enough to the epoch of observation to deliver adequate accuracy. * If not, a preliminary call to palPertel may be used to update * the element-set (and its associated osculating epoch) by * applying planetary perturbations. * - The reference frame for the result is with respect to the mean * equator and equinox of epoch J2000. * - The algorithm was originally adapted from the EPHSLA program of * D.H.P.Jones (private communication, 1996). The method is based * on Stumpff's Universal Variables. * See Also: * Everhart, E. & Pitkin, E.T., Am.J.Phys. 51, 712, 1983. * History: * 2012-03-12 (TIMJ): * Initial version taken directly from SLA/F. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2002 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" void palPlanel ( double date, int jform, double epoch, double orbinc, double anode, double perih, double aorq, double e, double aorl, double dm, double pv[6], int *jstat ) { int j; double u[13]; /* Validate elements and convert to "universal variables" parameters. */ palEl2ue( date, jform, epoch, orbinc, anode, perih, aorq, e, aorl, dm, u, &j ); /* Determine the position and velocity */ if (j == 0) { palUe2pv( date, u, pv, &j); if (j != 0) j = -5; } /* Wrap up */ *jstat = j; } pal-0.9.7/palPlanet.c000066400000000000000000000054501302604645500144000ustar00rootroot00000000000000/* *+ * Name: * palPlanet * Purpose: * Approximate heliocentric position and velocity of major planet * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palPlanet ( double date, int np, double pv[6], int *j ); * Arguments: * date = double (Given) * TDB Modified Julian Date (JD-2400000.5). * np = int (Given) * planet (1=Mercury, 2=Venus, 3=EMB, 4=Mars, * 5=Jupiter, 6=Saturn, 7=Uranus, 8=Neptune) * pv = double [6] (Returned) * heliocentric x,y,z,xdot,ydot,zdot, J2000, equatorial triad * in units AU and AU/s. * j = int * (Returned) * - -2 = solution didn't converge. * - -1 = illegal np (1-8) * - 0 = OK * - +1 = warning: year outside 1000-3000 * Description: * Calculates the approximate heliocentric position and velocity of * the specified major planet. * Authors: * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - See SOFA/ERFA eraPlan94 for details * - Note that Pluto is supported in SLA/F but not in this routine * - Status -2 is equivalent to eraPlan94 status +2. * - Note that velocity units here match the SLA/F documentation. * History: * 2012-03-07 (TIMJ): * Initial version * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "palmac.h" #include "pal1sofa.h" void palPlanet ( double date, int np, double pv[6], int *j ) { double erapv[2][3]; *j = eraPlan94( PAL__MJD0, date, np, erapv ); /* Convert the outputs to the correct form and also correct AU/d to AU/s */ pv[0] = erapv[0][0]; pv[1] = erapv[0][1]; pv[2] = erapv[0][2]; pv[3] = erapv[1][0] / PAL__SPD; pv[4] = erapv[1][1] / PAL__SPD; pv[5] = erapv[1][2] / PAL__SPD; /* SLA compatibility for status */ if (*j == 2) *j = -2; } pal-0.9.7/palPlante.c000066400000000000000000000236271302604645500144060ustar00rootroot00000000000000/* *+ * Name: * palPlante * Purpose: * Topocentric RA,Dec of a Solar-System object from heliocentric orbital elements * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palPlante ( double date, double elong, double phi, int jform, * double epoch, double orbinc, double anode, double perih, * double aorq, double e, double aorl, double dm, * double *ra, double *dec, double *r, int *jstat ); * Description: * Topocentric apparent RA,Dec of a Solar-System object whose * heliocentric orbital elements are known. * Arguments: * date = double (Given) * TT MJD of observation (JD-2400000.5) * elong = double (Given) * Observer's east longitude (radians) * phi = double (Given) * Observer's geodetic latitude (radians) * jform = int (Given) * Element set actually returned (1-3; Note 6) * epoch = double (Given) * Epoch of elements (TT MJD) * orbinc = double (Given) * inclination (radians) * anode = double (Given) * longitude of the ascending node (radians) * perih = double (Given) * longitude or argument of perihelion (radians) * aorq = double (Given) * mean distance or perihelion distance (AU) * e = double (Given) * eccentricity * aorl = double (Given) * mean anomaly or longitude (radians, JFORM=1,2 only) * dm = double (Given) * daily motion (radians, JFORM=1 only) * ra = double * (Returned) * Topocentric apparent RA (radians) * dec = double * (Returned) * Topocentric apparent Dec (radians) * r = double * (Returned) * Distance from observer (AU) * jstat = int * (Returned) * status: 0 = OK * - -1 = illegal jform * - -2 = illegal e * - -3 = illegal aorq * - -4 = illegal dm * - -5 = numerical error * Authors: * PTW: Pat Wallace (STFC) * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - DATE is the instant for which the prediction is required. It is * in the TT timescale (formerly Ephemeris Time, ET) and is a * Modified Julian Date (JD-2400000.5). * - The longitude and latitude allow correction for geocentric * parallax. This is usually a small effect, but can become * important for near-Earth asteroids. Geocentric positions can be * generated by appropriate use of routines palEpv (or palEvp) and * palUe2pv. * - The elements are with respect to the J2000 ecliptic and equinox. * - A choice of three different element-set options is available: * * Option JFORM = 1, suitable for the major planets: * * EPOCH = epoch of elements (TT MJD) * ORBINC = inclination i (radians) * ANODE = longitude of the ascending node, big omega (radians) * PERIH = longitude of perihelion, curly pi (radians) * AORQ = mean distance, a (AU) * E = eccentricity, e (range 0 to <1) * AORL = mean longitude L (radians) * DM = daily motion (radians) * * Option JFORM = 2, suitable for minor planets: * * EPOCH = epoch of elements (TT MJD) * ORBINC = inclination i (radians) * ANODE = longitude of the ascending node, big omega (radians) * PERIH = argument of perihelion, little omega (radians) * AORQ = mean distance, a (AU) * E = eccentricity, e (range 0 to <1) * AORL = mean anomaly M (radians) * * Option JFORM = 3, suitable for comets: * * EPOCH = epoch of elements and perihelion (TT MJD) * ORBINC = inclination i (radians) * ANODE = longitude of the ascending node, big omega (radians) * PERIH = argument of perihelion, little omega (radians) * AORQ = perihelion distance, q (AU) * E = eccentricity, e (range 0 to 10) * * Unused arguments (DM for JFORM=2, AORL and DM for JFORM=3) are not * accessed. * - Each of the three element sets defines an unperturbed heliocentric * orbit. For a given epoch of observation, the position of the body * in its orbit can be predicted from these elements, which are * called "osculating elements", using standard two-body analytical * solutions. However, due to planetary perturbations, a given set * of osculating elements remains usable for only as long as the * unperturbed orbit that it describes is an adequate approximation * to reality. Attached to such a set of elements is a date called * the "osculating epoch", at which the elements are, momentarily, * a perfect representation of the instantaneous position and * velocity of the body. * * Therefore, for any given problem there are up to three different * epochs in play, and it is vital to distinguish clearly between * them: * * . The epoch of observation: the moment in time for which the * position of the body is to be predicted. * * . The epoch defining the position of the body: the moment in time * at which, in the absence of purturbations, the specified * position (mean longitude, mean anomaly, or perihelion) is * reached. * * . The osculating epoch: the moment in time at which the given * elements are correct. * * For the major-planet and minor-planet cases it is usual to make * the epoch that defines the position of the body the same as the * epoch of osculation. Thus, only two different epochs are * involved: the epoch of the elements and the epoch of observation. * * For comets, the epoch of perihelion fixes the position in the * orbit and in general a different epoch of osculation will be * chosen. Thus, all three types of epoch are involved. * * For the present routine: * * . The epoch of observation is the argument DATE. * * . The epoch defining the position of the body is the argument * EPOCH. * * . The osculating epoch is not used and is assumed to be close * enough to the epoch of observation to deliver adequate accuracy. * If not, a preliminary call to palPertel may be used to update * the element-set (and its associated osculating epoch) by * applying planetary perturbations. * - Two important sources for orbital elements are Horizons, operated * by the Jet Propulsion Laboratory, Pasadena, and the Minor Planet * Center, operated by the Center for Astrophysics, Harvard. * * The JPL Horizons elements (heliocentric, J2000 ecliptic and * equinox) correspond to PAL/SLALIB arguments as follows. * * Major planets: * * JFORM = 1 * EPOCH = JDCT-2400000.5 * ORBINC = IN (in radians) * ANODE = OM (in radians) * PERIH = OM+W (in radians) * AORQ = A * E = EC * AORL = MA+OM+W (in radians) * DM = N (in radians) * * Epoch of osculation = JDCT-2400000.5 * * Minor planets: * * JFORM = 2 * EPOCH = JDCT-2400000.5 * ORBINC = IN (in radians) * ANODE = OM (in radians) * PERIH = W (in radians) * AORQ = A * E = EC * AORL = MA (in radians) * * Epoch of osculation = JDCT-2400000.5 * * Comets: * * JFORM = 3 * EPOCH = Tp-2400000.5 * ORBINC = IN (in radians) * ANODE = OM (in radians) * PERIH = W (in radians) * AORQ = QR * E = EC * * Epoch of osculation = JDCT-2400000.5 * * The MPC elements correspond to SLALIB arguments as follows. * * Minor planets: * * JFORM = 2 * EPOCH = Epoch-2400000.5 * ORBINC = Incl. (in radians) * ANODE = Node (in radians) * PERIH = Perih. (in radians) * AORQ = a * E = e * AORL = M (in radians) * * Epoch of osculation = Epoch-2400000.5 * * Comets: * * JFORM = 3 * EPOCH = T-2400000.5 * ORBINC = Incl. (in radians) * ANODE = Node. (in radians) * PERIH = Perih. (in radians) * AORQ = q * E = e * * Epoch of osculation = Epoch-2400000.5 * History: * 2012-03-12 (TIMJ): * Initial version direct conversion of SLA/F. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2004 Patrick T. Wallace * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" void palPlante ( double date, double elong, double phi, int jform, double epoch, double orbinc, double anode, double perih, double aorq, double e, double aorl, double dm, double *ra, double *dec, double *r, int *jstat ) { double u[13]; /* Transform conventional elements to universal elements */ palEl2ue( date, jform, epoch, orbinc, anode, perih, aorq, e, aorl, dm, u, jstat ); /* If succcessful, make the prediction */ if (*jstat == 0) palPlantu( date, elong, phi, u, ra, dec, r, jstat ); } pal-0.9.7/palPlantu.c000066400000000000000000000137651302604645500144300ustar00rootroot00000000000000/* *+ * Name: * palPlantu * Purpose: * Topocentric RA,Dec of a Solar-System object from universal elements * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palPlantu ( double date, double elong, double phi, const double u[13], * double *ra, double *dec, double *r, int *jstat ) { * Description: * Topocentric apparent RA,Dec of a Solar-System object whose * heliocentric universal elements are known. * Arguments: * date = double (Given) * TT MJD of observation (JD-2400000.5) * elong = double (Given) * Observer's east longitude (radians) * phi = double (Given) * Observer's geodetic latitude (radians) * u = const double [13] (Given) * Universal orbital elements * - (0) combined mass (M+m) * - (1) total energy of the orbit (alpha) * - (2) reference (osculating) epoch (t0) * - (3-5) position at reference epoch (r0) * - (6-8) velocity at reference epoch (v0) * - (9) heliocentric distance at reference epoch * - (10) r0.v0 * - (11) date (t) * - (12) universal eccentric anomaly (psi) of date, approx * ra = double * (Returned) * Topocentric apparent RA (radians) * dec = double * (Returned) * Topocentric apparent Dec (radians) * r = double * (Returned) * Distance from observer (AU) * jstat = int * (Returned) * status: 0 = OK * - -1 = radius vector zero * - -2 = failed to converge * Authors: * PTW: Pat Wallace (STFC) * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - DATE is the instant for which the prediction is required. It is * in the TT timescale (formerly Ephemeris Time, ET) and is a * Modified Julian Date (JD-2400000.5). * - The longitude and latitude allow correction for geocentric * parallax. This is usually a small effect, but can become * important for near-Earth asteroids. Geocentric positions can be * generated by appropriate use of routines palEpv (or palEvp) and * palUe2pv. * - The "universal" elements are those which define the orbit for the * purposes of the method of universal variables (see reference 2). * They consist of the combined mass of the two bodies, an epoch, * and the position and velocity vectors (arbitrary reference frame) * at that epoch. The parameter set used here includes also various * quantities that can, in fact, be derived from the other * information. This approach is taken to avoiding unnecessary * computation and loss of accuracy. The supplementary quantities * are (i) alpha, which is proportional to the total energy of the * orbit, (ii) the heliocentric distance at epoch, (iii) the * outwards component of the velocity at the given epoch, (iv) an * estimate of psi, the "universal eccentric anomaly" at a given * date and (v) that date. * - The universal elements are with respect to the J2000 equator and * equinox. * See Also: * - Sterne, Theodore E., "An Introduction to Celestial Mechanics", * Interscience Publishers Inc., 1960. Section 6.7, p199. * - Everhart, E. & Pitkin, E.T., Am.J.Phys. 51, 712, 1983. * History: * 2012-03-12 (TIMJ): * Initial version direct conversion of SLA/F. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2005 Patrick T. Wallace * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include #include "pal.h" #include "palmac.h" #include "pal1sofa.h" void palPlantu ( double date, double elong, double phi, const double u[13], double *ra, double *dec, double *r, int *jstat ) { int i; double dvb[3], dpb[3], vsg[6], vsp[6], v[6], rmat[3][3], vgp[6], stl, vgo[6], dx, dy, dz, d, tl; double ucp[13]; /* To retain the stated const API and conform to the documentation we must copy the contents of the u array as palUe2pv updates the final two elements */ for (i=0;i<13;i++) { ucp[i] = u[i]; } /* Sun to geocentre (J2000, velocity in AU/s) */ palEpv( date, vsg, &(vsg[3]), dpb, dvb ); for (i=3; i < 6; i++) { vsg[i] /= PAL__SPD; } /* Sun to planet (J2000) */ palUe2pv( date, ucp, vsp, jstat ); /* Geocentre to planet (J2000) */ for (i=0; i<6; i++) { v[i] = vsp[i] - vsg[i]; } /* Precession and nutation to date */ palPrenut( 2000.0, date, rmat ); eraRxp(rmat, v, vgp); eraRxp( rmat, &(v[3]), &(vgp[3]) ); /* Geocentre to observer (date) */ stl = palGmst( date - palDt( palEpj(date) ) / PAL__SPD ) + elong; palPvobs( phi, 0.0, stl, vgo ); /* Observer to planet (date) */ for (i=0; i<6; i++) { v[i] = vgp[i] - vgo[i]; } /* Geometric distance (AU) */ dx = v[0]; dy = v[1]; dz = v[2]; d = sqrt( dx*dx + dy*dy + dz*dz ); /* Light time (sec) */ tl = PAL__CR * d; /* Correct position for planetary aberration */ for (i=0; i<3; i++) { v[i] -= tl * v[i+3]; } /* To RA,Dec */ eraC2s( v, ra, dec ); *ra = eraAnp( *ra ); *r = d; } pal-0.9.7/palPm.c000066400000000000000000000062771302604645500135410ustar00rootroot00000000000000/* *+ * Name: * palPm * Purpose: * Apply corrections for proper motion a star RA,Dec * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palPm ( double r0, double d0, double pr, double pd, * double px, double rv, double ep0, double ep1, * double *r1, double *d1 ); * Arguments: * r0 = double (Given) * RA at epoch ep0 (radians) * d0 = double (Given) * Dec at epoch ep0 (radians) * pr = double (Given) * RA proper motion in radians per year. * pd = double (Given) * Dec proper motion in radians per year. * px = double (Given) * Parallax (arcsec) * rv = double (Given) * Radial velocity (km/sec +ve if receding) * ep0 = double (Given) * Start epoch in years, assumed to be Julian. * ep1 = double (Given) * End epoch in years, assumed to be Julian. * r1 = double * (Returned) * RA at epoch ep1 (radians) * d1 = double * (Returned) * Dec at epoch ep1 (radians) * Description: * Apply corrections for proper motion to a star RA,Dec using the * SOFA/ERFA routine eraStarpm. * Authors: * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - Uses eraStarpm but ignores the status returns from that routine. * In particular note that parallax should not be zero when the * proper motions are non-zero. SLA/F allows parallax to be zero. * - Assumes all epochs are Julian epochs. * History: * 2012-03-02 (TIMJ): * Initial version * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "pal1sofa.h" void palPm ( double r0, double d0, double pr, double pd, double px, double rv, double ep0, double ep1, double *r1, double *d1 ) { int status; double ep1a, ep1b, ep2a, ep2b; double pmr2, pmd2, px2, rv2; /* SOFA/ERFA requires the epochs in TDB MJD so we have to assume that the supplied epochs are Julian years */ eraEpj2jd( ep0, &ep1a, &ep1b ); eraEpj2jd( ep1, &ep2a, &ep2b ); status = eraStarpm( r0, d0, pr, pd, px, rv, ep1a, ep1b, ep2a, ep2b, r1, d1, &pmr2, &pmd2, &px2, &rv2 ); } pal-0.9.7/palPolmo.c000066400000000000000000000142061302604645500142420ustar00rootroot00000000000000/* *+ * Name: * palPolmo * Purpose: * Correct for polar motion * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palPolmo ( double elongm, double phim, double xp, double yp, * double *elong, double *phi, double *daz ); * Arguments: * elongm = double (Given) * Mean logitude of the observer (radians, east +ve) * phim = double (Given) * Mean geodetic latitude of the observer (radians) * xp = double (Given) * Polar motion x-coordinate (radians) * yp = double (Given) * Polar motion y-coordinate (radians) * elong = double * (Returned) * True longitude of the observer (radians, east +ve) * phi = double * (Returned) * True geodetic latitude of the observer (radians) * daz = double * (Returned) * Azimuth correction (terrestrial-celestial, radians) * Description: * Polar motion: correct site longitude and latitude for polar * motion and calculate azimuth difference between celestial and * terrestrial poles. * Authors: * PTW: Patrick Wallace (STFC) * TIMJ: Tim Jenness (Cornell) * {enter_new_authors_here} * Notes: * - "Mean" longitude and latitude are the (fixed) values for the * site's location with respect to the IERS terrestrial reference * frame; the latitude is geodetic. TAKE CARE WITH THE LONGITUDE * SIGN CONVENTION. The longitudes used by the present routine * are east-positive, in accordance with geographical convention * (and right-handed). In particular, note that the longitudes * returned by the sla_OBS routine are west-positive, following * astronomical usage, and must be reversed in sign before use in * the present routine. * * - XP and YP are the (changing) coordinates of the Celestial * Ephemeris Pole with respect to the IERS Reference Pole. * XP is positive along the meridian at longitude 0 degrees, * and YP is positive along the meridian at longitude * 270 degrees (i.e. 90 degrees west). Values for XP,YP can * be obtained from IERS circulars and equivalent publications; * the maximum amplitude observed so far is about 0.3 arcseconds. * * - "True" longitude and latitude are the (moving) values for * the site's location with respect to the celestial ephemeris * pole and the meridian which corresponds to the Greenwich * apparent sidereal time. The true longitude and latitude * link the terrestrial coordinates with the standard celestial * models (for precession, nutation, sidereal time etc). * * - The azimuths produced by sla_AOP and sla_AOPQK are with * respect to due north as defined by the Celestial Ephemeris * Pole, and can therefore be called "celestial azimuths". * However, a telescope fixed to the Earth measures azimuth * essentially with respect to due north as defined by the * IERS Reference Pole, and can therefore be called "terrestrial * azimuth". Uncorrected, this would manifest itself as a * changing "azimuth zero-point error". The value DAZ is the * correction to be added to a celestial azimuth to produce * a terrestrial azimuth. * * - The present routine is rigorous. For most practical * purposes, the following simplified formulae provide an * adequate approximation: * * elong = elongm+xp*cos(elongm)-yp*sin(elongm) * phi = phim+(xp*sin(elongm)+yp*cos(elongm))*tan(phim) * daz = -sqrt(xp*xp+yp*yp)*cos(elongm-atan2(xp,yp))/cos(phim) * * An alternative formulation for DAZ is: * * x = cos(elongm)*cos(phim) * y = sin(elongm)*cos(phim) * daz = atan2(-x*yp-y*xp,x*x+y*y) * * - Reference: Seidelmann, P.K. (ed), 1992. "Explanatory Supplement * to the Astronomical Almanac", ISBN 0-935702-68-7, * sections 3.27, 4.25, 4.52. * History: * 2000-11-30 (PTW): * SLALIB implementation. * 2014-10-18 (TIMJ): * Initial version in C. * {enter_further_changes_here} * Copyright: * Copyright (C) 2000 Rutherford Appleton Laboratory. * Copyright (C) 2014 Cornell University * All Rights Reserved. * Licence: * 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 . * Bugs: * {note_any_bugs_here} *- */ #include #include "pal.h" void palPolmo ( double elongm, double phim, double xp, double yp, double *elong, double *phi, double *daz ) { double sel,cel,sph,cph,xm,ym,zm,xnm,ynm,znm, sxp,cxp,syp,cyp,zw,xt,yt,zt,xnt,ynt; /* Site mean longitude and mean geodetic latitude as a Cartesian vector */ sel=sin(elongm); cel=cos(elongm); sph=sin(phim); cph=cos(phim); xm=cel*cph; ym=sel*cph; zm=sph; /* Rotate site vector by polar motion, Y-component then X-component */ sxp=sin(xp); cxp=cos(xp); syp=sin(yp); cyp=cos(yp); zw=(-ym*syp+zm*cyp); xt=xm*cxp-zw*sxp; yt=ym*cyp+zm*syp; zt=xm*sxp+zw*cxp; /* Rotate also the geocentric direction of the terrestrial pole (0,0,1) */ xnm=-sxp*cyp; ynm=syp; znm=cxp*cyp; cph=sqrt(xt*xt+yt*yt); if (cph == 0.0) xt=1.0; sel=yt/cph; cel=xt/cph; /* Return true longitude and true geodetic latitude of site */ if (xt != 0.0 || yt != 0.0) { *elong=atan2(yt,xt); } else { *elong=0.0; } *phi=atan2(zt,cph); /* Return current azimuth of terrestrial pole seen from site position */ xnt=(xnm*cel+ynm*sel)*zt-znm*cph; ynt=-xnm*sel+ynm*cel; if (xnt != 0.0 || ynt != 0.0) { *daz=atan2(-ynt,-xnt); } else { *daz=0.0; } } pal-0.9.7/palPrebn.c000066400000000000000000000055331302604645500142250ustar00rootroot00000000000000/* *+ * Name: * palPrebn * Purpose: * Generate the matrix of precession between two objects (old) * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palPrebn ( double bep0, double bep1, double rmatp[3][3] ); * Arguments: * bep0 = double (Given) * Beginning Besselian epoch. * bep1 = double (Given) * Ending Besselian epoch * rmatp = double[3][3] (Returned) * precession matrix in the sense V(BEP1) = RMATP * V(BEP0) * Description: * Generate the matrix of precession between two epochs, * using the old, pre-IAU1976, Bessel-Newcomb model, using * Kinoshita's formulation * Authors: * PTW: Pat Wallace (STFC) * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * See Also: * Kinoshita, H. (1975) 'Formulas for precession', SAO Special * Report No. 364, Smithsonian Institution Astrophysical * Observatory, Cambridge, Massachusetts. * History: * 2012-02-12(TIMJ): * Initial version with documentation taken from Fortran SLA * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1996 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "palmac.h" void palPrebn ( double bep0, double bep1, double rmatp[3][3] ) { double t,bigt, zeta, theta, z, tas2r, w; /* Interval between basic epoch B1850.0 and beginning epoch in TC */ bigt = (bep0-1850)/100.; /* Interval over which precession required, in tropical centuries */ t = (bep1-bep0)/100.; /* Euler angles */ tas2r = t * PAL__DAS2R; w = 2303.5548 + ( 1.39720 + 0.000059 * bigt) * bigt; zeta = ( w + ( 0.30242 - 0.000269 * bigt + 0.017996 * t ) * t ) * tas2r; z = ( w + ( 1.09478 + 0.000387 * bigt + 0.018324 * t ) * t ) * tas2r; theta = ( 2005.1125 + ( -0.85294 - 0.000365 * bigt ) * bigt + (-0.42647 - 0.000365 * bigt - 0.041802 * t ) * t ) * tas2r; /* Rotation matrix */ palDeuler("ZYZ", -zeta, theta, -z, rmatp); } pal-0.9.7/palPrec.c000066400000000000000000000060511302604645500140440ustar00rootroot00000000000000/* *+ * Name: * palPrec * Purpose: * Form the matrix of precession between two epochs (IAU 2006) * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palPrec( double ep0, double ep1, double rmatp[3][3] ) * Arguments: * ep0 = double (Given) * Beginning epoch * ep1 = double (Given) * Ending epoch * rmatp = double[3][3] (Returned) * Precession matrix * Description: * The IAU 2006 precession matrix from ep0 to ep1 is found and * returned. The matrix is in the sense V(EP1) = RMATP * V(EP0). * The epochs are TDB (loosely TT) Julian epochs. * * Though the matrix method itself is rigorous, the precession * angles are expressed through canonical polynomials which are * valid only for a limited time span of a few hundred years around * the current epoch. * Authors: * PTW: Pat Wallace (STFC) * DSB: David Berry (JAC, Hawaii) * {enter_new_authors_here} * History: * 2012-02-10 (DSB): * Initial version with documentation taken from Fortran SLA * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1996 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "pal1sofa.h" void palPrec( double ep0, double ep1, double rmatp[3][3] ){ /* Local Variables: */ double rmatq[3][3]; double ep0_days; double ep1_days; /* Convert supplied dates to days since J2000 */ ep0_days = ( ep0 - 2000.0 )*ERFA_DJY; ep1_days = ( ep1 - 2000.0 )*ERFA_DJY; /* If beginning epoch is J2000, just return the rotation matrix from J2000 to EP1. */ if( ep0 == 2000.0 ) { eraPmat06( ERFA_DJ00, ep1_days, rmatp ); /* If end epoch is J2000, get the rotation matrix from J2000 to EP0 and then transpose it to get the rotation matrix from EP0 to J2000. */ } else if( ep1 == 2000.0 ) { eraPmat06( ERFA_DJ00, ep0_days, rmatp ); eraTr( rmatp, rmatp ); /* Otherwise. get the two matrices used above and multiply them together. */ } else { eraPmat06( ERFA_DJ00, ep0_days, rmatp ); eraTr( rmatp, rmatp ); eraPmat06( ERFA_DJ00, ep1_days, rmatq ); eraRxr( rmatp, rmatq, rmatp ); } } pal-0.9.7/palPreces.c000066400000000000000000000066411302604645500144010ustar00rootroot00000000000000/* *+ * Name: * palPreces * Purpose: * Precession - either FK4 or FK5 as required. * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palPreces ( const char sys[3], double ep0, double ep1, * double *ra, double *dc ); * Arguments: * sys = const char [3] (Given) * Precession to be applied: FK4 or FK5. Case insensitive. * ep0 = double (Given) * Starting epoch. * ep1 = double (Given) * Ending epoch * ra = double * (Given & Returned) * On input the RA mean equator & equinox at epoch ep0. On exit * the RA mean equator & equinox of epoch ep1. * dec = double * (Given & Returned) * On input the dec mean equator & equinox at epoch ep0. On exit * the dec mean equator & equinox of epoch ep1. * Description: * Precess coordinates using the appropriate system and epochs. * Authors: * PTW: Patrick T. Wallace * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - Uses palPrec for FK5 data and palPrebn for FK4 data. * - The epochs are Besselian if SYSTEM='FK4' and Julian if 'FK5'. * For example, to precess coordinates in the old system from * equinox 1900.0 to 1950.0 the call would be: * palPreces( "FK4", 1900.0, 1950.0, &ra, &dc ); * - This routine will NOT correctly convert between the old and * the new systems - for example conversion from B1950 to J2000. * For these purposes see palFk425, palFk524, palFk45z and * palFk54z. * - If an invalid SYSTEM is supplied, values of -99D0,-99D0 will * be returned for both RA and DC. * History: * 2012-03-02 (TIMJ): * Initial version * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1995 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "pal1sofa.h" #include void palPreces ( const char sys[3], double ep0, double ep1, double *ra, double *dc ) { double pm[3][3]; double v1[3]; double v2[3]; /* Generate appropriate precession matrix */ if ( strncasecmp( "FK4", sys, 3 ) == 0 ) { palPrebn( ep0, ep1, pm ); } else if (strncasecmp( "FK5", sys, 3 ) == 0 ) { palPrec( ep0, ep1, pm ); } else { *ra = -99.0; *dc = -99.0; return; } /* Convert RA,Dec to x,y,z */ eraS2c( *ra, *dc, v1 ); /* Precess */ eraRxp( pm, v1, v2 ); /* Back to RA,Dec */ eraC2s( v2, ra, dc ); *ra = eraAnp( *ra ); } pal-0.9.7/palPrenut.c000066400000000000000000000054441302604645500144350ustar00rootroot00000000000000/* *+ * Name: * palPrenut * Purpose: * Form the matrix of bias-precession-nutation (IAU 2006/2000A) * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palPrenut( double epoch, double date, double rmatpn[3][3] ) * Arguments: * epoch = double (Returned) * Julian epoch for mean coordinates. * date = double (Returned) * Modified Julian Date (JD-2400000.5) for true coordinates. * rmatpn = double[3][3] (Returned) * combined NPB matrix * Description: * Form the matrix of bias-precession-nutation (IAU 2006/2000A). * The epoch and date are TT (but TDB is usually close enough). * The matrix is in the sense v(true) = rmatpn * v(mean). * Authors: * PTW: Pat Wallace (STFC) * {enter_new_authors_here} * History: * 2012-02-10 (PTW): * Initial version. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "palmac.h" #include "pal1sofa.h" void palPrenut ( double epoch, double date, double rmatpn[3][3] ){ /* Local Variables: */ double bpa; double bpia; double bqa; double chia; double d1; double d2; double eps0; double epsa; double gam; double oma; double pa; double phi; double pia; double psi; double psia; double r1[3][3]; double r2[3][3]; double thetaa; double za; double zetaa; /* Specified Julian epoch as a 2-part JD. */ eraEpj2jd( epoch, &d1, &d2 ); /* P matrix, from specified epoch to J2000.0. */ eraP06e( d1, d2, &eps0, &psia, &oma, &bpa, &bqa, &pia, &bpia, &epsa, &chia, &za, &zetaa, &thetaa, &pa, &gam, &phi, &psi ); eraIr( r1 ); eraRz( -chia, r1 ); eraRx( oma, r1 ); eraRz( psia, r1 ); eraRx( -eps0, r1 ); /* NPB matrix, from J2000.0 to date. */ eraPnm06a( PAL__MJD0, date, r2 ); /* NPB matrix, from specified epoch to date. */ eraRxr( r2, r1, rmatpn ); } pal-0.9.7/palPv2el.c000066400000000000000000000274241302604645500141520ustar00rootroot00000000000000/* *+ * Name: * palPv2el * Purpose: * Position velocity to heliocentirc osculating elements * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palPv2el ( const double pv[6], double date, double pmass, int jformr, * int *jform, double *epoch, double *orbinc, * double *anode, double *perih, double *aorq, double *e, * double *aorl, double *dm, int *jstat ); * Arguments: * pv = const double [6] (Given) * Heliocentric x,y,z,xdot,ydot,zdot of date, * J2000 equatorial triad (AU,AU/s; Note 1) * date = double (Given) * Date (TT Modified Julian Date = JD-2400000.5) * pmass = double (Given) * Mass of the planet (Sun=1; Note 2) * jformr = int (Given) * Requested element set (1-3; Note 3) * jform = int * (Returned) * Element set actually returned (1-3; Note 4) * epoch = double * (Returned) * Epoch of elements (TT MJD) * orbinc = double * (Returned) * inclination (radians) * anode = double * (Returned) * longitude of the ascending node (radians) * perih = double * (Returned) * longitude or argument of perihelion (radians) * aorq = double * (Returned) * mean distance or perihelion distance (AU) * e = double * (Returned) * eccentricity * aorl = double * (Returned) * mean anomaly or longitude (radians, JFORM=1,2 only) * dm = double * (Returned) * daily motion (radians, JFORM=1 only) * jstat = int * (Returned) * status: 0 = OK * - -1 = illegal PMASS * - -2 = illegal JFORMR * - -3 = position/velocity out of range * Description: * Heliocentric osculating elements obtained from instantaneous position * and velocity. * Authors: * PTW: Pat Wallace (STFC) * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - The PV 6-vector is with respect to the mean equator and equinox of * epoch J2000. The orbital elements produced are with respect to * the J2000 ecliptic and mean equinox. * - The mass, PMASS, is important only for the larger planets. For * most purposes (e.g. asteroids) use 0D0. Values less than zero * are illegal. * - Three different element-format options are supported: * * Option JFORM=1, suitable for the major planets: * * EPOCH = epoch of elements (TT MJD) * ORBINC = inclination i (radians) * ANODE = longitude of the ascending node, big omega (radians) * PERIH = longitude of perihelion, curly pi (radians) * AORQ = mean distance, a (AU) * E = eccentricity, e * AORL = mean longitude L (radians) * DM = daily motion (radians) * * Option JFORM=2, suitable for minor planets: * * EPOCH = epoch of elements (TT MJD) * ORBINC = inclination i (radians) * ANODE = longitude of the ascending node, big omega (radians) * PERIH = argument of perihelion, little omega (radians) * AORQ = mean distance, a (AU) * E = eccentricity, e * AORL = mean anomaly M (radians) * * Option JFORM=3, suitable for comets: * * EPOCH = epoch of perihelion (TT MJD) * ORBINC = inclination i (radians) * ANODE = longitude of the ascending node, big omega (radians) * PERIH = argument of perihelion, little omega (radians) * AORQ = perihelion distance, q (AU) * E = eccentricity, e * * - It may not be possible to generate elements in the form * requested through JFORMR. The caller is notified of the form * of elements actually returned by means of the JFORM argument: * JFORMR JFORM meaning * * 1 1 OK - elements are in the requested format * 1 2 never happens * 1 3 orbit not elliptical * * 2 1 never happens * 2 2 OK - elements are in the requested format * 2 3 orbit not elliptical * * 3 1 never happens * 3 2 never happens * 3 3 OK - elements are in the requested format * * - The arguments returned for each value of JFORM (cf Note 5: JFORM * may not be the same as JFORMR) are as follows: * * JFORM 1 2 3 * EPOCH t0 t0 T * ORBINC i i i * ANODE Omega Omega Omega * PERIH curly pi omega omega * AORQ a a q * E e e e * AORL L M - * DM n - - * * where: * * t0 is the epoch of the elements (MJD, TT) * T " epoch of perihelion (MJD, TT) * i " inclination (radians) * Omega " longitude of the ascending node (radians) * curly pi " longitude of perihelion (radians) * omega " argument of perihelion (radians) * a " mean distance (AU) * q " perihelion distance (AU) * e " eccentricity * L " longitude (radians, 0-2pi) * M " mean anomaly (radians, 0-2pi) * n " daily motion (radians) * - means no value is set * * - At very small inclinations, the longitude of the ascending node * ANODE becomes indeterminate and under some circumstances may be * set arbitrarily to zero. Similarly, if the orbit is close to * circular, the true anomaly becomes indeterminate and under some * circumstances may be set arbitrarily to zero. In such cases, * the other elements are automatically adjusted to compensate, * and so the elements remain a valid description of the orbit. * - The osculating epoch for the returned elements is the argument * DATE. * * - Reference: Sterne, Theodore E., "An Introduction to Celestial * Mechanics", Interscience Publishers, 1960 * History: * 2012-03-09 (TIMJ): * Initial version converted from SLA/F. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2005 Patrick T. Wallace * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include #include "pal1sofa.h" #include "pal.h" #include "palmac.h" void palPv2el ( const double pv[6], double date, double pmass, int jformr, int *jform, double *epoch, double *orbinc, double *anode, double *perih, double *aorq, double *e, double *aorl, double *dm, int *jstat ) { /* Sin and cos of J2000 mean obliquity (IAU 1976) */ const double SE = 0.3977771559319137; const double CE = 0.9174820620691818; /* Minimum allowed distance (AU) and speed (AU/day) */ const double RMIN = 1e-3; const double VMIN = 1e-8; /* How close to unity the eccentricity has to be to call it a parabola */ const double PARAB = 1.0e-8; double X,Y,Z,XD,YD,ZD,R,V2,V,RDV,GMU,HX,HY,HZ, HX2PY2,H2,H,OI,BIGOM,AR,ECC,S,C,AT,U,OM, GAR3,EM1,EP1,HAT,SHAT,CHAT,AE,AM,DN,PL, EL,Q,TP,THAT,THHF,F; int JF; /* Validate arguments PMASS and JFORMR.*/ if (pmass < 0.0) { *jstat = -1; return; } if (jformr < 1 || jformr > 3) { *jstat = -2; return; } /* Provisionally assume the elements will be in the chosen form. */ JF = jformr; /* Rotate the position from equatorial to ecliptic coordinates. */ X = pv[0]; Y = pv[1]*CE+pv[2]*SE; Z = -pv[1]*SE+pv[2]*CE; /* Rotate the velocity similarly, scaling to AU/day. */ XD = PAL__SPD*pv[3]; YD = PAL__SPD*(pv[4]*CE+pv[5]*SE); ZD = PAL__SPD*(-pv[4]*SE+pv[5]*CE); /* Distance and speed. */ R = sqrt(X*X+Y*Y+Z*Z); V2 = XD*XD+YD*YD+ZD*ZD; V = sqrt(V2); /* Reject unreasonably small values. */ if (R < RMIN || V < VMIN) { *jstat = -3; return; } /* R dot V. */ RDV = X*XD+Y*YD+Z*ZD; /* Mu. */ GMU = (1.0+pmass)*PAL__GCON*PAL__GCON; /* Vector angular momentum per unit reduced mass. */ HX = Y*ZD-Z*YD; HY = Z*XD-X*ZD; HZ = X*YD-Y*XD; /* Areal constant. */ HX2PY2 = HX*HX+HY*HY; H2 = HX2PY2+HZ*HZ; H = sqrt(H2); /* Inclination. */ OI = atan2(sqrt(HX2PY2),HZ); /* Longitude of ascending node. */ if (HX != 0.0 || HY != 0.0) { BIGOM = atan2(HX,-HY); } else { BIGOM=0.0; } /* Reciprocal of mean distance etc. */ AR = 2.0/R-V2/GMU; /* Eccentricity. */ ECC = sqrt(DMAX(1.0-AR*H2/GMU,0.0)); /* True anomaly. */ S = H*RDV; C = H2-R*GMU; if (S != 0.0 || C != 0.0) { AT = atan2(S,C); } else { AT = 0.0; } /* Argument of the latitude. */ S = sin(BIGOM); C = cos(BIGOM); U = atan2((-X*S+Y*C)*cos(OI)+Z*sin(OI),X*C+Y*S); /* Argument of perihelion. */ OM = U-AT; /* Capture near-parabolic cases. */ if (fabs(ECC-1.0) < PARAB) ECC=1.0; /* Comply with JFORMR = 1 or 2 only if orbit is elliptical. */ if (ECC > 1.0) JF=3; /* Functions. */ GAR3 = GMU*AR*AR*AR; EM1 = ECC-1.0; EP1 = ECC+1.0; HAT = AT/2.0; SHAT = sin(HAT); CHAT = cos(HAT); /* Variable initializations to avoid compiler warnings. */ AM = 0.0; DN = 0.0; PL = 0.0; EL = 0.0; Q = 0.0; TP = 0.0; /* Ellipse? */ if (ECC < 1.0 ) { /* Eccentric anomaly. */ AE = 2.0*atan2(sqrt(-EM1)*SHAT,sqrt(EP1)*CHAT); /* Mean anomaly. */ AM = AE-ECC*sin(AE); /* Daily motion. */ DN = sqrt(GAR3); } /* "Major planet" element set? */ if (JF == 1) { /* Longitude of perihelion. */ PL = BIGOM+OM; /* Longitude at epoch. */ EL = PL+AM; } /* "Comet" element set? */ if (JF == 3) { /* Perihelion distance. */ Q = H2/(GMU*EP1); /* Ellipse, parabola, hyperbola? */ if (ECC < 1.0) { /* Ellipse: epoch of perihelion. */ TP = date-AM/DN; } else { /* Parabola or hyperbola: evaluate tan ( ( true anomaly ) / 2 ) */ THAT = SHAT/CHAT; if (ECC == 1.0) { /* Parabola: epoch of perihelion. */ TP = date-THAT*(1.0+THAT*THAT/3.0)*H*H2/(2.0*GMU*GMU); } else { /* Hyperbola: epoch of perihelion. */ THHF = sqrt(EM1/EP1)*THAT; F = log(1.0+THHF)-log(1.0-THHF); TP = date-(ECC*sinh(F)-F)/sqrt(-GAR3); } } } /* Return the appropriate set of elements. */ *jform = JF; *orbinc = OI; *anode = eraAnp(BIGOM); *e = ECC; if (JF == 1) { *perih = eraAnp(PL); *aorl = eraAnp(EL); *dm = DN; } else { *perih = eraAnp(OM); if (JF == 2) *aorl = eraAnp(AM); } if (JF != 3) { *epoch = date; *aorq = 1.0/AR; } else { *epoch = TP; *aorq = Q; } *jstat = 0; } pal-0.9.7/palPv2ue.c000066400000000000000000000125301302604645500141530ustar00rootroot00000000000000/* *+ * Name: * palPv2ue * Purpose: * Universal elements to position and velocity. * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palPv2ue( const double pv[6], double date, double pmass, * double u[13], int * jstat ); * Arguments: * pv = double [6] (Given) * Heliocentric x,y,z,xdot,ydot,zdot of date, (AU,AU/s; Note 1) * date = double (Given) * Date (TT modified Julian Date = JD-2400000.5) * pmass = double (Given) * Mass of the planet (Sun=1; note 2) * u = double [13] (Returned) * Universal orbital elements (Note 3) * * - (0) combined mass (M+m) * - (1) total energy of the orbit (alpha) * - (2) reference (osculating) epoch (t0) * - (3-5) position at reference epoch (r0) * - (6-8) velocity at reference epoch (v0) * - (9) heliocentric distance at reference epoch * - (10) r0.v0 * - (11) date (t) * - (12) universal eccentric anomaly (psi) of date, approx * jstat = int * (Returned) * status: 0 = OK * - -1 = illegal PMASS * - -2 = too close to Sun * - -3 = too slow * Description: * Construct a universal element set based on an instantaneous position * and velocity. * Authors: * PTW: Pat Wallace (STFC) * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - The PV 6-vector can be with respect to any chosen inertial frame, * and the resulting universal-element set will be with respect to * the same frame. A common choice will be mean equator and ecliptic * of epoch J2000. * - The mass, PMASS, is important only for the larger planets. For * most purposes (e.g. asteroids) use 0D0. Values less than zero * are illegal. * - The "universal" elements are those which define the orbit for the * purposes of the method of universal variables (see reference). * They consist of the combined mass of the two bodies, an epoch, * and the position and velocity vectors (arbitrary reference frame) * at that epoch. The parameter set used here includes also various * quantities that can, in fact, be derived from the other * information. This approach is taken to avoiding unnecessary * computation and loss of accuracy. The supplementary quantities * are (i) alpha, which is proportional to the total energy of the * orbit, (ii) the heliocentric distance at epoch, (iii) the * outwards component of the velocity at the given epoch, (iv) an * estimate of psi, the "universal eccentric anomaly" at a given * date and (v) that date. * - Reference: Everhart, E. & Pitkin, E.T., Am.J.Phys. 51, 712, 1983. * History: * 2012-03-09 (TIMJ): * Initial version from the SLA/F implementation. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1999 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include #include "pal.h" #include "palmac.h" void palPv2ue( const double pv[6], double date, double pmass, double u[13], int * jstat ) { /* Canonical days to seconds */ const double CD2S = PAL__GCON / PAL__SPD; /* Minimum allowed distance (AU) and speed (AU per canonical day) */ const double RMIN = 1e-3; const double VMIN = 1e-3; double T0,CM,X,Y,Z,XD,YD,ZD,R,V2,V,ALPHA,RDV; /* Reference epoch. */ T0 = date; /* Combined mass (mu=M+m). */ if (pmass < 0.0 ) { /* Negative planet mass */ *jstat = -1; return; } CM = 1.0+pmass; /* Unpack the state vector, expressing velocity in AU per canonical day. */ X = pv[0]; Y = pv[1]; Z = pv[2]; XD = pv[3]/CD2S; YD = pv[4]/CD2S; ZD = pv[5]/CD2S; /* Heliocentric distance, and speed. */ R = sqrt(X*X+Y*Y+Z*Z); V2 = XD*XD+YD*YD+ZD*ZD; V = sqrt(V2); /* Reject unreasonably small values. */ if (R < RMIN) { /* Too close */ *jstat = -2; return; } if (V < VMIN) { /* Too slow */ *jstat = -3; return; } /* Total energy of the orbit. */ ALPHA = V2-2.0*CM/R; /* Outward component of velocity. */ RDV = X*XD+Y*YD+Z*ZD; /* Construct the universal-element set. */ u[0] = CM; u[1] = ALPHA; u[2] = T0; u[3] = X; u[4] = Y; u[5] = Z; u[6] = XD; u[7] = YD; u[8] = ZD; u[9] = R; u[10] = RDV; u[11] = T0; u[12] = 0.0; *jstat = 0; return; } pal-0.9.7/palPvobs.c000066400000000000000000000050771302604645500142530ustar00rootroot00000000000000/* *+ * Name: * palPvobs * Purpose: * Position and velocity of an observing station. * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palPvobs( double p, double h, double stl, double pv[6] ) * Arguments: * p = double (Given) * Latitude (geodetic, radians). * h = double (Given) * Height above reference spheroid (geodetic, metres). * stl = double (Given) * Local apparent sidereal time (radians). * pv = double[ 6 ] (Returned) * position/velocity 6-vector (AU, AU/s, true equator * and equinox of date). * Description: * Returns the position and velocity of an observing station. * Notes: * - The WGS84 reference ellipsoid is used. * Authors: * PTW: Pat Wallace (STFC) * DSB: David Berry (JAC, Hawaii) * {enter_new_authors_here} * History: * 2012-02-16 (DSB): * Initial version. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1995 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "palmac.h" #include "palmac.h" #include "pal1sofa.h" void palPvobs( double p, double h, double stl, double pv[6] ){ /* Local Variables: */ double xyz[3], z, r, s, c, v; /* Geodetic to geocentric conversion (WGS84 reference ellipsoid). */ eraGd2gc( ERFA_WGS84, 0.0, p, h, xyz ); /* Convert from metres to AU */ r = xyz[ 0 ]/ERFA_DAU; z = xyz[ 2 ]/ERFA_DAU; /* Functions of ST. */ s = sin( stl ); c = cos( stl ); /* Speed. */ v = PAL__SR*r; /* Position. */ pv[ 0 ] = r*c; pv[ 1 ] = r*s; pv[ 2 ] = z; /* Velocity. */ pv[ 3 ] = -v*s; pv[ 4 ] = v*c; pv[ 5 ] = 0.0; } pal-0.9.7/palRdplan.c000066400000000000000000000127331302604645500143770ustar00rootroot00000000000000/* *+ * Name: * palRdplan * Purpose: * Approximate topocentric apparent RA,Dec of a planet * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palRdplan( double date, int np, double elong, double phi, * double * ra, double * dec, double * diam ); * Arguments: * date = double (Given) * MJD of observation (JD-2400000.5) in TDB. For all practical * purposes TT can be used instead of TDB, and for many applications * UT will do (except for the Moon). * np = int (Given) * Planet: 1 = Mercury * 2 = Venus * 3 = Moon * 4 = Mars * 5 = Jupiter * 6 = Saturn * 7 = Uranus * 8 = Neptune * else = Sun * elong = double (Given) * Observer's east longitude (radians) * phi = double (Given) * Observer's geodetic latitude (radians) * ra = double * (Returned) * RA (topocentric apparent, radians) * dec = double * (Returned) * Dec (topocentric apparent, radians) * diam = double * (Returned) * Angular diameter (equatorial, radians) * Description: * Approximate topocentric apparent RA,Dec of a planet, and its * angular diameter. * Authors: * PTW: Patrick T. Wallace * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - Unlike with slaRdplan, Pluto is not supported. * - The longitude and latitude allow correction for geocentric * parallax. This is a major effect for the Moon, but in the * context of the limited accuracy of the present routine its * effect on planetary positions is small (negligible for the * outer planets). Geocentric positions can be generated by * appropriate use of the routines palDmoon and eraPlan94. * History: * 2012-03-07 (TIMJ): * Initial version, with some documentation from SLA/F. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1997 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include #include "pal.h" #include "palmac.h" #include "pal1sofa.h" void palRdplan( double date, int np, double elong, double phi, double * ra, double * dec, double * diam ) { /* AU in km */ const double AUKM = 1.49597870e8; /* Equatorial radii (km) */ const double EQRAU[] = { 696000.0, /* Sun */ 2439.7, 6051.9, 1738, 3397, 71492, 60268, 25559, 24764 }; /* Local variables */ int i, j; double stl; double vgm[6]; double v[6]; double rmat[3][3]; double vse[6]; double vsg[6]; double vsp[6]; double vgo[6]; double dx,dy,dz,r,tl; /* Classify np */ if (np < 0 || np > 8 ) np=0; /* Sun */ /* Approximate local sidereal time */ stl = palGmst( date - palDt( palEpj(date)) / 86400.0) + elong; /* Geocentre to Moon (mean of date) */ palDmoon( date, v ); /* Nutation to true of date */ palNut( date, rmat ); eraRxp( rmat, v, vgm ); eraRxp( rmat, &(v[3]), &(vgm[3]) ); /* Moon? */ if (np == 3) { /* geocentre to Moon (true of date) */ for (i=0; i<6; i++) { v[i] = vgm[i]; } } else { /* Not moon: precession/nutation matrix J2000 to date */ palPrenut( 2000.0, date, rmat ); /* Sun to Earth-Moon Barycentre (J2000) */ palPlanet( date, 3, v, &j ); /* Precession and nutation to date */ eraRxp( rmat, v, vse ); eraRxp( rmat, &(v[3]), &(vse[3]) ); /* Sun to geocentre (true of date) */ for (i=0; i<6; i++) { vsg[i] = vse[i] - 0.012150581 * vgm[i]; } /* Sun ? */ if (np == 0) { /* Geocentre to Sun */ for (i=0; i<6; i++) { v[i] = -vsg[i]; } } else { /* Sun to Planet (J2000) */ palPlanet( date, np, v, &j ); /* Precession and nutation to date */ eraRxp( rmat, v, vsp ); eraRxp( rmat, &(v[3]), &(vsp[3]) ); /* Geocentre to planet */ for (i=0; i<6; i++) { v[i] = vsp[i] - vsg[i]; } } } /* Refer to origina at the observer */ palPvobs( phi, 0.0, stl, vgo ); for (i=0; i<6; i++) { v[i] -= vgo[i]; } /* Geometric distance (AU) */ dx = v[0]; dy = v[1]; dz = v[2]; r = sqrt( dx*dx + dy*dy + dz*dz ); /* Light time */ tl = PAL__CR * r; /* Correct position for planetary aberration */ for (i=0; i<3; i++) { v[i] -= tl * v[i+3]; } /* To RA,Dec */ eraC2s( v, ra, dec ); *ra = eraAnp( *ra ); /* Angular diameter (radians) */ *diam = 2.0 * asin( EQRAU[np] / (r * AUKM ) ); } pal-0.9.7/palRefco.c000066400000000000000000000076171302604645500142220ustar00rootroot00000000000000/* *+ * Name: * palRefco * Purpose: * Determine constants in atmospheric refraction model * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palRefco ( double hm, double tdk, double pmb, double rh, * double wl, double phi, double tlr, double eps, * double *refa, double *refb ); * Arguments: * hm = double (Given) * Height of the observer above sea level (metre) * tdk = double (Given) * Ambient temperature at the observer (K) * pmb = double (Given) * Pressure at the observer (millibar) * rh = double (Given) * Relative humidity at the observer (range 0-1) * wl = double (Given) * Effective wavelength of the source (micrometre) * phi = double (Given) * Latitude of the observer (radian, astronomical) * tlr = double (Given) * Temperature lapse rate in the troposphere (K/metre) * eps = double (Given) * Precision required to terminate iteration (radian) * refa = double * (Returned) * tan Z coefficient (radian) * refb = double * (Returned) * tan**3 Z coefficient (radian) * Description: * Determine the constants A and B in the atmospheric refraction * model dZ = A tan Z + B tan**3 Z. * * Z is the "observed" zenith distance (i.e. affected by refraction) * and dZ is what to add to Z to give the "topocentric" (i.e. in vacuo) * zenith distance. * Authors: * PTW: Patrick T. Wallace * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - Typical values for the TLR and EPS arguments might be 0.0065 and * 1E-10 respectively. * * - The radio refraction is chosen by specifying WL > 100 micrometres. * * - The routine is a slower but more accurate alternative to the * palRefcoq routine. The constants it produces give perfect * agreement with palRefro at zenith distances arctan(1) (45 deg) * and arctan(4) (about 76 deg). It achieves 0.5 arcsec accuracy * for ZD < 80 deg, 0.01 arcsec accuracy for ZD < 60 deg, and * 0.001 arcsec accuracy for ZD < 45 deg. * History: * 2012-08-24 (TIMJ): * Initial version. A direct copy of the Fortran SLA implementation. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2004 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" void palRefco ( double hm, double tdk, double pmb, double rh, double wl, double phi, double tlr, double eps, double *refa, double *refb ) { double r1, r2; /* Sample zenith distances: arctan(1) and arctan(4) */ const double ATN1 = 0.7853981633974483; const double ATN4 = 1.325817663668033; /* Determine refraction for the two sample zenith distances */ palRefro(ATN1,hm,tdk,pmb,rh,wl,phi,tlr,eps,&r1); palRefro(ATN4,hm,tdk,pmb,rh,wl,phi,tlr,eps,&r2); /* Solve for refraction constants */ *refa = (64.0*r1-r2)/60.0; *refb = (r2-4.0*r1)/60.0; } pal-0.9.7/palRefro.c000066400000000000000000000337131302604645500142350ustar00rootroot00000000000000/* *+ * Name: * palRefro * Purpose: * Atmospheric refraction for radio and optical/IR wavelengths * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palRefro( double zobs, double hm, double tdk, double pmb, * double rh, double wl, double phi, double tlr, * double eps, double * ref ) { * Arguments: * zobs = double (Given) * Observed zenith distance of the source (radian) * hm = double (Given) * Height of the observer above sea level (metre) * tdk = double (Given) * Ambient temperature at the observer (K) * pmb = double (Given) * Pressure at the observer (millibar) * rh = double (Given) * Relative humidity at the observer (range 0-1) * wl = double (Given) * Effective wavelength of the source (micrometre) * phi = double (Given) * Latitude of the observer (radian, astronomical) * tlr = double (Given) * Temperature lapse rate in the troposphere (K/metre) * eps = double (Given) * Precision required to terminate iteration (radian) * ref = double * (Returned) * Refraction: in vacuao ZD minus observed ZD (radian) * Description: * Calculates the atmospheric refraction for radio and optical/IR * wavelengths. * Authors: * PTW: Patrick T. Wallace * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - A suggested value for the TLR argument is 0.0065. The * refraction is significantly affected by TLR, and if studies * of the local atmosphere have been carried out a better TLR * value may be available. The sign of the supplied TLR value * is ignored. * * - A suggested value for the EPS argument is 1E-8. The result is * usually at least two orders of magnitude more computationally * precise than the supplied EPS value. * * - The routine computes the refraction for zenith distances up * to and a little beyond 90 deg using the method of Hohenkerk * and Sinclair (NAO Technical Notes 59 and 63, subsequently adopted * in the Explanatory Supplement, 1992 edition - see section 3.281). * * - The code is a development of the optical/IR refraction subroutine * AREF of C.Hohenkerk (HMNAO, September 1984), with extensions to * support the radio case. Apart from merely cosmetic changes, the * following modifications to the original HMNAO optical/IR refraction * code have been made: * * . The angle arguments have been changed to radians. * * . Any value of ZOBS is allowed (see note 6, below). * * . Other argument values have been limited to safe values. * * . Murray's values for the gas constants have been used * (Vectorial Astrometry, Adam Hilger, 1983). * * . The numerical integration phase has been rearranged for * extra clarity. * * . A better model for Ps(T) has been adopted (taken from * Gill, Atmosphere-Ocean Dynamics, Academic Press, 1982). * * . More accurate expressions for Pwo have been adopted * (again from Gill 1982). * * . The formula for the water vapour pressure, given the * saturation pressure and the relative humidity, is from * Crane (1976), expression 2.5.5. * . Provision for radio wavelengths has been added using * expressions devised by A.T.Sinclair, RGO (private * communication 1989). The refractivity model currently * used is from J.M.Rueger, "Refractive Index Formulae for * Electronic Distance Measurement with Radio and Millimetre * Waves", in Unisurv Report S-68 (2002), School of Surveying * and Spatial Information Systems, University of New South * Wales, Sydney, Australia. * * . The optical refractivity for dry air is from Resolution 3 of * the International Association of Geodesy adopted at the XXIIth * General Assembly in Birmingham, UK, 1999. * * . Various small changes have been made to gain speed. * * - The radio refraction is chosen by specifying WL > 100 micrometres. * Because the algorithm takes no account of the ionosphere, the * accuracy deteriorates at low frequencies, below about 30 MHz. * * - Before use, the value of ZOBS is expressed in the range +/- pi. * If this ranged ZOBS is -ve, the result REF is computed from its * absolute value before being made -ve to match. In addition, if * it has an absolute value greater than 93 deg, a fixed REF value * equal to the result for ZOBS = 93 deg is returned, appropriately * signed. * * - As in the original Hohenkerk and Sinclair algorithm, fixed values * of the water vapour polytrope exponent, the height of the * tropopause, and the height at which refraction is negligible are * used. * * - The radio refraction has been tested against work done by * Iain Coulson, JACH, (private communication 1995) for the * James Clerk Maxwell Telescope, Mauna Kea. For typical conditions, * agreement at the 0.1 arcsec level is achieved for moderate ZD, * worsening to perhaps 0.5-1.0 arcsec at ZD 80 deg. At hot and * humid sea-level sites the accuracy will not be as good. * * - It should be noted that the relative humidity RH is formally * defined in terms of "mixing ratio" rather than pressures or * densities as is often stated. It is the mass of water per unit * mass of dry air divided by that for saturated air at the same * temperature and pressure (see Gill 1982). * - The algorithm is designed for observers in the troposphere. The * supplied temperature, pressure and lapse rate are assumed to be * for a point in the troposphere and are used to define a model * atmosphere with the tropopause at 11km altitude and a constant * temperature above that. However, in practice, the refraction * values returned for stratospheric observers, at altitudes up to * 25km, are quite usable. * History: * 2012-08-24 (TIMJ): * Initial version, direct port of SLA Fortran source. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2005 Patrick T. Wallace * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include #include "pal.h" #include "pal1.h" #include "palmac.h" void palRefro( double zobs, double hm, double tdk, double pmb, double rh, double wl, double phi, double tlr, double eps, double * ref ) { /* * Fixed parameters */ /* 93 degrees in radians */ const double D93 = 1.623156204; /* Universal gas constant */ const double GCR = 8314.32; /* Molecular weight of dry air */ const double DMD = 28.9644; /* Molecular weight of water vapour */ const double DMW = 18.0152; /* Mean Earth radius (metre) */ const double S = 6378120.; /* Exponent of temperature dependence of water vapour pressure */ const double DELTA = 18.36; /* Height of tropopause (metre) */ const double HT = 11000.; /* Upper limit for refractive effects (metre) */ const double HS = 80000.; /* Numerical integration: maximum number of strips. */ const int ISMAX=16384l; /* Local variables */ int is, k, n, i, j; int optic, loop; /* booleans */ double zobs1,zobs2,hmok,tdkok,pmbok,rhok,wlok,alpha, tol,wlsq,gb,a,gamal,gamma,gamm2,delm2, tdc,psat,pwo,w, c1,c2,c3,c4,c5,c6,r0,tempo,dn0,rdndr0,sk0,f0, rt,tt,dnt,rdndrt,sine,zt,ft,dnts,rdndrp,zts,fts, rs,dns,rdndrs,zs,fs,refold,z0,zrange,fb,ff,fo,fe, h,r,sz,rg,dr,tg,dn,rdndr,t,f,refp,reft; /* The refraction integrand */ #define refi(DN,RDNDR) RDNDR/(DN+RDNDR) /* Transform ZOBS into the normal range. */ zobs1 = palDrange(zobs); zobs2 = DMIN(fabs(zobs1),D93); /* keep other arguments within safe bounds. */ hmok = DMIN(DMAX(hm,-1e3),HS); tdkok = DMIN(DMAX(tdk,100.0),500.0); pmbok = DMIN(DMAX(pmb,0.0),10000.0); rhok = DMIN(DMAX(rh,0.0),1.0); wlok = DMAX(wl,0.1); alpha = DMIN(DMAX(fabs(tlr),0.001),0.01); /* tolerance for iteration. */ tol = DMIN(DMAX(fabs(eps),1e-12),0.1)/2.0; /* decide whether optical/ir or radio case - switch at 100 microns. */ optic = wlok < 100.0; /* set up model atmosphere parameters defined at the observer. */ wlsq = wlok*wlok; gb = 9.784*(1.0-0.0026*cos(phi+phi)-0.00000028*hmok); if (optic) { a = (287.6155+(1.62887+0.01360/wlsq)/wlsq) * 273.15e-6/1013.25; } else { a = 77.6890e-6; } gamal = (gb*DMD)/GCR; gamma = gamal/alpha; gamm2 = gamma-2.0; delm2 = DELTA-2.0; tdc = tdkok-273.15; psat = pow(10.0,(0.7859+0.03477*tdc)/(1.0+0.00412*tdc)) * (1.0+pmbok*(4.5e-6+6.0e-10*tdc*tdc)); if (pmbok > 0.0) { pwo = rhok*psat/(1.0-(1.0-rhok)*psat/pmbok); } else { pwo = 0.0; } w = pwo*(1.0-DMW/DMD)*gamma/(DELTA-gamma); c1 = a*(pmbok+w)/tdkok; if (optic) { c2 = (a*w+11.2684e-6*pwo)/tdkok; } else { c2 = (a*w+6.3938e-6*pwo)/tdkok; } c3 = (gamma-1.0)*alpha*c1/tdkok; c4 = (DELTA-1.0)*alpha*c2/tdkok; if (optic) { c5 = 0.0; c6 = 0.0; } else { c5 = 375463e-6*pwo/tdkok; c6 = c5*delm2*alpha/(tdkok*tdkok); } /* conditions at the observer. */ r0 = S+hmok; pal1Atmt(r0,tdkok,alpha,gamm2,delm2,c1,c2,c3,c4,c5,c6, r0,&tempo,&dn0,&rdndr0); sk0 = dn0*r0*sin(zobs2); f0 = refi(dn0,rdndr0); /* conditions in the troposphere at the tropopause. */ rt = S+DMAX(HT,hmok); pal1Atmt(r0,tdkok,alpha,gamm2,delm2,c1,c2,c3,c4,c5,c6, rt,&tt,&dnt,&rdndrt); sine = sk0/(rt*dnt); zt = atan2(sine,sqrt(DMAX(1.0-sine*sine,0.0))); ft = refi(dnt,rdndrt); /* conditions in the stratosphere at the tropopause. */ pal1Atms(rt,tt,dnt,gamal,rt,&dnts,&rdndrp); sine = sk0/(rt*dnts); zts = atan2(sine,sqrt(DMAX(1.0-sine*sine,0.0))); fts = refi(dnts,rdndrp); /* conditions at the stratosphere limit. */ rs = S+HS; pal1Atms(rt,tt,dnt,gamal,rs,&dns,&rdndrs); sine = sk0/(rs*dns); zs = atan2(sine,sqrt(DMAX(1.0-sine*sine,0.0))); fs = refi(dns,rdndrs); /* variable initialization to avoid compiler warning. */ reft = 0.0; /* integrate the refraction integral in two parts; first in the * troposphere (k=1), then in the stratosphere (k=2). */ for (k=1; k<=2; k++) { /* initialize previous refraction to ensure at least two iterations. */ refold = 1.0; /* start off with 8 strips. */ is = 8; /* start z, z range, and start and end values. */ if (k==1) { z0 = zobs2; zrange = zt-z0; fb = f0; ff = ft; } else { z0 = zts; zrange = zs-z0; fb = fts; ff = fs; } /* sums of odd and even values. */ fo = 0.0; fe = 0.0; /* first time through the loop we have to do every point. */ n = 1; /* start of iteration loop (terminates at specified precision). */ loop = 1; while (loop) { /* strip width. */ h = zrange/((double)is); /* initialize distance from earth centre for quadrature pass. */ if (k == 1) { r = r0; } else { r = rt; } /* one pass (no need to compute evens after first time). */ for (i=1; i 1e-20) { w = sk0/sz; rg = r; dr = 1.0e6; j = 0; while ( fabs(dr) > 1.0 && j < 4 ) { j++; if (k==1) { pal1Atmt(r0,tdkok,alpha,gamm2,delm2, c1,c2,c3,c4,c5,c6,rg,&tg,&dn,&rdndr); } else { pal1Atms(rt,tt,dnt,gamal,rg,&dn,&rdndr); } dr = (rg*dn-w)/(dn+rdndr); rg = rg-dr; } r = rg; } /* find the refractive index and integrand at r. */ if (k==1) { pal1Atmt(r0,tdkok,alpha,gamm2,delm2, c1,c2,c3,c4,c5,c6,r,&t,&dn,&rdndr); } else { pal1Atms(rt,tt,dnt,gamal,r,&dn,&rdndr); } f = refi(dn,rdndr); /* accumulate odd and (first time only) even values. */ if (n==1 && i%2 == 0) { fe += f; } else { fo += f; } } /* evaluate the integrand using simpson's rule. */ refp = h*(fb+4.0*fo+2.0*fe+ff)/3.0; /* has the required precision been achieved (or can't be)? */ if (fabs(refp-refold) > tol && is < ISMAX) { /* no: prepare for next iteration.*/ /* save current value for convergence test. */ refold = refp; /* double the number of strips. */ is += is; /* sum of all current values = sum of next pass's even values. */ fe += fo; /* prepare for new odd values. */ fo = 0.0; /* skip even values next time. */ n = 2; } else { /* yes: save troposphere component and terminate the loop. */ if (k==1) reft = refp; loop = 0; } } } /* result. */ *ref = reft+refp; if (zobs1 < 0.0) *ref = -(*ref); } pal-0.9.7/palRefv.c000066400000000000000000000121071302604645500140540ustar00rootroot00000000000000/* *+ * Name: * palRefv * Purpose: * Adjust an unrefracted Cartesian vector to include the effect of atmospheric refraction * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palRefv ( double vu[3], double refa, double refb, double vr[3] ); * Arguments: * vu[3] = double (Given) * Unrefracted position of the source (Az/El 3-vector) * refa = double (Given) * tan Z coefficient (radian) * refb = double (Given) * tan**3 Z coefficient (radian) * vr[3] = double (Returned) * Refracted position of the source (Az/El 3-vector) * Description: * Adjust an unrefracted Cartesian vector to include the effect of * atmospheric refraction, using the simple A tan Z + B tan**3 Z * model. * Authors: * TIMJ: Tim Jenness * PTW: Patrick Wallace * {enter_new_authors_here} * Notes: * - This routine applies the adjustment for refraction in the * opposite sense to the usual one - it takes an unrefracted * (in vacuo) position and produces an observed (refracted) * position, whereas the A tan Z + B tan**3 Z model strictly * applies to the case where an observed position is to have the * refraction removed. The unrefracted to refracted case is * harder, and requires an inverted form of the text-book * refraction models; the algorithm used here is equivalent to * one iteration of the Newton-Raphson method applied to the above * formula. * * - Though optimized for speed rather than precision, the present * routine achieves consistency with the refracted-to-unrefracted * A tan Z + B tan**3 Z model at better than 1 microarcsecond within * 30 degrees of the zenith and remains within 1 milliarcsecond to * beyond ZD 70 degrees. The inherent accuracy of the model is, of * course, far worse than this - see the documentation for palRefco * for more information. * * - At low elevations (below about 3 degrees) the refraction * correction is held back to prevent arithmetic problems and * wildly wrong results. For optical/IR wavelengths, over a wide * range of observer heights and corresponding temperatures and * pressures, the following levels of accuracy (arcsec, worst case) * are achieved, relative to numerical integration through a model * atmosphere: * * ZD error * * 80 0.7 * 81 1.3 * 82 2.5 * 83 5 * 84 10 * 85 20 * 86 55 * 87 160 * 88 360 * 89 640 * 90 1100 * 91 1700 } relevant only to * 92 2600 } high-elevation sites * * The results for radio are slightly worse over most of the range, * becoming significantly worse below ZD=88 and unusable beyond * ZD=90. * * - See also the routine palRefz, which performs the adjustment to * the zenith distance rather than in Cartesian Az/El coordinates. * The present routine is faster than palRefz and, except very low down, * is equally accurate for all practical purposes. However, beyond * about ZD 84 degrees palRefz should be used, and for the utmost * accuracy iterative use of palRefro should be considered. * History: * 2014-07-15 (TIMJ): * Initial version. A direct copy of the Fortran SLA implementation. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2014 Tim Jenness * Copyright (C) 2004 Patrick Wallace * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "palmac.h" #include void palRefv ( double vu[3], double refa, double refb, double vr[3] ) { double x,y,z1,z,zsq,rsq,r,wb,wt,d,cd,f; /* Initial estimate = unrefracted vector */ x = vu[0]; y = vu[1]; z1 = vu[2]; /* Keep correction approximately constant below about 3 deg elevation */ z = DMAX(z1,0.05); /* One Newton-Raphson iteration */ zsq = z*z; rsq = x*x+y*y; r = sqrt(rsq); wb = refb*rsq/zsq; wt = (refa+wb)/(1.0+(refa+3.0*wb)*(zsq+rsq)/zsq); d = wt*r/z; cd = 1.0-d*d/2.0; f = cd*(1.0-wt); /* Post-refraction x,y,z */ vr[0] = x*f; vr[1] = y*f; vr[2] = cd*(z+d*r)+(z1-z); } pal-0.9.7/palRefz.c000066400000000000000000000137751302604645500140740ustar00rootroot00000000000000/* *+ * Name: * palRefz * Purpose: * Adjust unrefracted zenith distance * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palRefz ( double zu, double refa, double refb, double *zr ); * Arguments: * zu = double (Given) * Unrefracted zenith distance of the source (radians) * refa = double (Given) * tan Z coefficient (radians) * refb = double (Given) * tan**3 Z coefficient (radian) * zr = double * (Returned) * Refracted zenith distance (radians) * Description: * Adjust an unrefracted zenith distance to include the effect of * atmospheric refraction, using the simple A tan Z + B tan**3 Z * model (plus special handling for large ZDs). * Authors: * PTW: Patrick T. Wallace * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - This routine applies the adjustment for refraction in the * opposite sense to the usual one - it takes an unrefracted * (in vacuo) position and produces an observed (refracted) * position, whereas the A tan Z + B tan**3 Z model strictly * applies to the case where an observed position is to have the * refraction removed. The unrefracted to refracted case is * harder, and requires an inverted form of the text-book * refraction models; the formula used here is based on the * Newton-Raphson method. For the utmost numerical consistency * with the refracted to unrefracted model, two iterations are * carried out, achieving agreement at the 1D-11 arcseconds level * for a ZD of 80 degrees. The inherent accuracy of the model * is, of course, far worse than this - see the documentation for * palRefco for more information. * * - At ZD 83 degrees, the rapidly-worsening A tan Z + B tan^3 Z * model is abandoned and an empirical formula takes over. For * optical/IR wavelengths, over a wide range of observer heights and * corresponding temperatures and pressures, the following levels of * accuracy (arcsec, worst case) are achieved, relative to numerical * integration through a model atmosphere: * * ZR error * * 80 0.7 * 81 1.3 * 82 2.4 * 83 4.7 * 84 6.2 * 85 6.4 * 86 8 * 87 10 * 88 15 * 89 30 * 90 60 * 91 150 } relevant only to * 92 400 } high-elevation sites * * For radio wavelengths the errors are typically 50% larger than * the optical figures and by ZD 85 deg are twice as bad, worsening * rapidly below that. To maintain 1 arcsec accuracy down to ZD=85 * at the Green Bank site, Condon (2004) has suggested amplifying * the amount of refraction predicted by palRefz below 10.8 deg * elevation by the factor (1+0.00195*(10.8-E_t)), where E_t is the * unrefracted elevation in degrees. * * The high-ZD model is scaled to match the normal model at the * transition point; there is no glitch. * * - Beyond 93 deg zenith distance, the refraction is held at its * 93 deg value. * * - See also the routine palRefv, which performs the adjustment in * Cartesian Az/El coordinates, and with the emphasis on speed * rather than numerical accuracy. * References: * Condon,J.J., Refraction Corrections for the GBT, PTCS/PN/35.2, * NRAO Green Bank, 2004. * History: * 2012-08-24 (TIMJ): * Initial version, ported directly from Fortran SLA * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2004 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include #include "pal.h" #include "palmac.h" void palRefz ( double zu, double refa, double refb, double *zr ) { /* Constants */ /* Largest usable ZD (deg) */ const double D93 = 93.0; /* ZD at which one model hands over to the other (radians) */ const double Z83 = 83.0 * PAL__DD2R; /* coefficients for high ZD model (used beyond ZD 83 deg) */ const double C1 = +0.55445; const double C2 = -0.01133; const double C3 = +0.00202; const double C4 = +0.28385; const double C5 = +0.02390; /* High-ZD-model prefiction (deg) for that point */ const double REF83 = (C1+C2*7.0+C3*49.0)/(1.0+C4*7.0+C5*49.0); double zu1,zl,s,c,t,tsq,tcu,ref,e,e2; /* perform calculations for zu or 83 deg, whichever is smaller */ zu1 = DMIN(zu,Z83); /* functions of ZD */ zl = zu1; s = sin(zl); c = cos(zl); t = s/c; tsq = t*t; tcu = t*tsq; /* refracted zd (mathematically to better than 1 mas at 70 deg) */ zl = zl-(refa*t+refb*tcu)/(1.0+(refa+3.0*refb*tsq)/(c*c)); /* further iteration */ s = sin(zl); c = cos(zl); t = s/c; tsq = t*t; tcu = t*tsq; ref = zu1-zl+ (zl-zu1+refa*t+refb*tcu)/(1.0+(refa+3.0*refb*tsq)/(c*c)); /* special handling for large zu */ if (zu > zu1) { e = 90.0-DMIN(D93,zu*PAL__DR2D); e2 = e*e; ref = (ref/REF83)*(C1+C2*e+C3*e2)/(1.0+C4*e+C5*e2); } /* return refracted zd */ *zr = zu-ref; } pal-0.9.7/palRverot.c000066400000000000000000000052171302604645500144370ustar00rootroot00000000000000/* *+ * Name: * palRverot * Purpose: * Velocity component in a given direction due to Earth rotation * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * double palRverot ( double phi, double ra, double da, double st ); * Arguments: * phi = double (Given) * latitude of observing station (geodetic) (radians) * ra = double (Given) * apparent RA (radians) * da = double (Given) * apparent Dec (radians) * st = double (Given) * Local apparent sidereal time. * Returned Value: * palRverot = double * Component of Earth rotation in direction RA,DA (km/s). * The result is +ve when the observatory is receding from the * given point on the sky. * Description: * Calculate the velocity component in a given direction due to Earth * rotation. * * The simple algorithm used assumes a spherical Earth, of * a radius chosen to give results accurate to about 0.0005 km/s * for observing stations at typical latitudes and heights. For * applications requiring greater precision, use the routine * palPvobs. * Authors: * PTW: Patrick T. Wallace * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * History: * 2012-03-02 (TIMJ): * Initial version * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1995 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include double palRverot ( double phi, double ra, double da, double st ) { /* Nominal mean sidereal speed of Earth equator in km/s (the actual * value is about 0.4651) */ const double espeed = 0.4655; return espeed * cos(phi) * sin(st-ra) * cos(da); } pal-0.9.7/palRvgalc.c000066400000000000000000000060161302604645500143720ustar00rootroot00000000000000/* *+ * Name: * palRvgalc * Purpose: * Velocity component in a given direction due to the rotation * of the Galaxy. * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * double palRvgalc( double r2000, double d2000 ) * Arguments: * r2000 = double (Given) * J2000.0 mean RA (radians) * d2000 = double (Given) * J2000.0 mean Dec (radians) * Returned Value: * Component of dynamical LSR motion in direction R2000,D2000 (km/s). * Description: * This function returns the Component of dynamical LSR motion in * the direction of R2000,D2000. The result is +ve when the dynamical * LSR is receding from the given point on the sky. * * Notes: * - The Local Standard of Rest used here is a point in the * vicinity of the Sun which is in a circular orbit around * the Galactic centre. Sometimes called the "dynamical" LSR, * it is not to be confused with a "kinematical" LSR, which * is the mean standard of rest of star catalogues or stellar * populations. * * Reference: * - The orbital speed of 220 km/s used here comes from Kerr & * Lynden-Bell (1986), MNRAS, 221, p1023. * Authors: * PTW: Pat Wallace (STFC) * DSB: David Berry (JAC, Hawaii) * {enter_new_authors_here} * History: * 2012-02-16 (DSB): * Initial version. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1995 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "pal1sofa.h" double palRvgalc( double r2000, double d2000 ){ /* Local Variables: */ double vb[ 3 ]; /* * LSR velocity due to Galactic rotation * * Speed = 220 km/s * Apex = L2,B2 90deg, 0deg * = RA,Dec 21 12 01.1 +48 19 47 J2000.0 * * This is expressed in the form of a J2000.0 x,y,z vector: * * VA(1) = X = -SPEED*COS(RA)*COS(DEC) * VA(2) = Y = -SPEED*SIN(RA)*COS(DEC) * VA(3) = Z = -SPEED*SIN(DEC) */ double va[ 3 ] = { -108.70408, +97.86251, -164.33610 }; /* Convert given J2000 RA,Dec to x,y,z. */ eraS2c( r2000, d2000, vb ); /* Compute dot product with LSR motion vector. */ return eraPdp( va, vb ); } pal-0.9.7/palRvlg.c000066400000000000000000000053551302604645500140730ustar00rootroot00000000000000/* *+ * Name: * palRvlg * Purpose: * Velocity component in a given direction due to Galactic rotation * and motion of the local group. * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * double palRvlg( double r2000, double d2000 ) * Arguments: * r2000 = double (Given) * J2000.0 mean RA (radians) * d2000 = double (Given) * J2000.0 mean Dec (radians) * Returned Value: * Component of SOLAR motion in direction R2000,D2000 (km/s). * Description: * This function returns the velocity component in a given * direction due to the combination of the rotation of the * Galaxy and the motion of the Galaxy relative to the mean * motion of the local group. The result is +ve when the Sun * is receding from the given point on the sky. * * Reference: * - IAU Trans 1976, 168, p201. * Authors: * PTW: Pat Wallace (STFC) * DSB: David Berry (JAC, Hawaii) * {enter_new_authors_here} * History: * 2012-02-16 (DSB): * Initial version. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1995 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "pal1sofa.h" double palRvlg( double r2000, double d2000 ){ /* Local Variables: */ double vb[ 3 ]; /* * * Solar velocity due to Galactic rotation and translation * * Speed = 300 km/s * * Apex = L2,B2 90deg, 0deg * = RA,Dec 21 12 01.1 +48 19 47 J2000.0 * * This is expressed in the form of a J2000.0 x,y,z vector: * * VA(1) = X = -SPEED*COS(RA)*COS(DEC) * VA(2) = Y = -SPEED*SIN(RA)*COS(DEC) * VA(3) = Z = -SPEED*SIN(DEC) */ double va[ 3 ] = { -148.23284, +133.44888, -224.09467 }; /* Convert given J2000 RA,Dec to x,y,z. */ eraS2c( r2000, d2000, vb ); /* Compute dot product with Solar motion vector. */ return eraPdp( va, vb ); } pal-0.9.7/palRvlsrd.c000066400000000000000000000071211302604645500144260ustar00rootroot00000000000000/* *+ * Name: * palRvlsrd * Purpose: * Velocity component in a given direction due to the Sun's motion * with respect to the dynamical Local Standard of Rest. * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * double palRvlsrd( double r2000, double d2000 ) * Arguments: * r2000 = double (Given) * J2000.0 mean RA (radians) * d2000 = double (Given) * J2000.0 mean Dec (radians) * Returned Value: * Component of "peculiar" solar motion in direction R2000,D2000 (km/s). * Description: * This function returns the velocity component in a given direction * due to the Sun's motion with respect to the dynamical Local Standard * of Rest. The result is +ve when the Sun is receding from the given * point on the sky. * Notes: * - The Local Standard of Rest used here is the "dynamical" LSR, * a point in the vicinity of the Sun which is in a circular orbit * around the Galactic centre. The Sun's motion with respect to the * dynamical LSR is called the "peculiar" solar motion. * - There is another type of LSR, called a "kinematical" LSR. A * kinematical LSR is the mean standard of rest of specified star * catalogues or stellar populations, and several slightly different * kinematical LSRs are in use. The Sun's motion with respect to an * agreed kinematical LSR is known as the "standard" solar motion. * To obtain a radial velocity correction with respect to an adopted * kinematical LSR use the routine palRvlsrk. * Reference: * - Delhaye (1965), in "Stars and Stellar Systems", vol 5, p73. * Authors: * PTW: Pat Wallace (STFC) * DSB: David Berry (JAC, Hawaii) * {enter_new_authors_here} * History: * 2012-02-16 (DSB): * Initial version. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1995 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "pal1sofa.h" double palRvlsrd( double r2000, double d2000 ){ /* Local Variables: */ double vb[ 3 ]; /* * Peculiar solar motion from Delhaye 1965: in Galactic Cartesian * coordinates (+9,+12,+7) km/s. This corresponds to about 16.6 km/s * towards Galactic coordinates L2 = 53 deg, B2 = +25 deg, or RA,Dec * 17 49 58.7 +28 07 04 J2000. * * The solar motion is expressed here in the form of a J2000.0 * equatorial Cartesian vector: * * VA(1) = X = -SPEED*COS(RA)*COS(DEC) * VA(2) = Y = -SPEED*SIN(RA)*COS(DEC) * VA(3) = Z = -SPEED*SIN(DEC) */ double va[ 3 ] = { +0.63823, +14.58542, -7.80116 }; /* Convert given J2000 RA,Dec to x,y,z. */ eraS2c( r2000, d2000, vb ); /* Compute dot product with Solar motion vector. */ return eraPdp( va, vb ); } pal-0.9.7/palRvlsrk.c000066400000000000000000000067441302604645500144470ustar00rootroot00000000000000/* *+ * Name: * palRvlsrk * Purpose: * Velocity component in a given direction due to the Sun's motion * with respect to an adopted kinematic Local Standard of Rest. * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * double palRvlsrk( double r2000, double d2000 ) * Arguments: * r2000 = double (Given) * J2000.0 mean RA (radians) * d2000 = double (Given) * J2000.0 mean Dec (radians) * Returned Value: * Component of "standard" solar motion in direction R2000,D2000 (km/s). * Description: * This function returns the velocity component in a given direction * due to the Sun's motion with respect to an adopted kinematic * Local Standard of Rest. The result is +ve when the Sun is receding * from the given point on the sky. * Notes: * - The Local Standard of Rest used here is one of several * "kinematical" LSRs in common use. A kinematical LSR is the mean * standard of rest of specified star catalogues or stellar * populations. The Sun's motion with respect to a kinematical LSR * is known as the "standard" solar motion. * - There is another sort of LSR, the "dynamical" LSR, which is a * point in the vicinity of the Sun which is in a circular orbit * around the Galactic centre. The Sun's motion with respect to * the dynamical LSR is called the "peculiar" solar motion. To * obtain a radial velocity correction with respect to the * dynamical LSR use the routine palRvlsrd. * Reference: * - Delhaye (1965), in "Stars and Stellar Systems", vol 5, p73. * Authors: * PTW: Pat Wallace (STFC) * DSB: David Berry (JAC, Hawaii) * {enter_new_authors_here} * History: * 2012-02-16 (DSB): * Initial version. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1995 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "pal1sofa.h" double palRvlsrk( double r2000, double d2000 ){ /* Local Variables: */ double vb[ 3 ]; /* * Standard solar motion (from Methods of Experimental Physics, ed Meeks, * vol 12, part C, sec 6.1.5.2, p281): * * 20 km/s towards RA 18h Dec +30d (1900). * * The solar motion is expressed here in the form of a J2000.0 * equatorial Cartesian vector: * * VA(1) = X = -SPEED*COS(RA)*COS(DEC) * VA(2) = Y = -SPEED*SIN(RA)*COS(DEC) * VA(3) = Z = -SPEED*SIN(DEC) */ double va[ 3 ] = { -0.29000, +17.31726, -10.00141 }; /* Convert given J2000 RA,Dec to x,y,z. */ eraS2c( r2000, d2000, vb ); /* Compute dot product with Solar motion vector. */ return eraPdp( va, vb ); } pal-0.9.7/palSubet.c000066400000000000000000000057241302604645500142430ustar00rootroot00000000000000/* *+ * Name: * palSubet * Purpose: * Remove the E-terms from a pre IAU 1976 catalogue RA,Dec * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palSubet ( double rc, double dc, double eq, * double *rm, double *dm ); * Arguments: * rc = double (Given) * RA with E-terms included (radians) * dc = double (Given) * Dec with E-terms included (radians) * eq = double (Given) * Besselian epoch of mean equator and equinox * rm = double * (Returned) * RA without E-terms (radians) * dm = double * (Returned) * Dec without E-terms (radians) * Description: * Remove the E-terms (elliptic component of annual aberration) * from a pre IAU 1976 catalogue RA,Dec to give a mean place. * Authors: * PTW: Pat Wallace (STFC) * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * Most star positions from pre-1984 optical catalogues (or * derived from astrometry using such stars) embody the * E-terms. This routine converts such a position to a * formal mean place (allowing, for example, comparison with a * pulsar timing position). * See Also: * Explanatory Supplement to the Astronomical Ephemeris, * section 2D, page 48. * History: * 2012-02-12(TIMJ): * Initial version with documentation taken from Fortran SLA * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1995 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "pal1sofa.h" void palSubet ( double rc, double dc, double eq, double *rm, double *dm ) { double a[3]; /* The E-terms */ double v[3]; double f; int i; /* Note the preference for IAU routines */ /* Retrieve the E-terms */ palEtrms( eq, a ); /* Spherical to Cartesian */ eraS2c( rc, dc, v ); /* Include the E-terms */ f = 1.0 + eraPdp( v, a ); for (i=0; i<3; i++) { v[i] = f*v[i] - a[i]; } /* Cartesian to spherical */ eraC2s( v, rm, dm ); /* Bring RA into conventional range */ *rm = eraAnp( *rm ); } pal-0.9.7/palSupgal.c000066400000000000000000000061171302604645500144110ustar00rootroot00000000000000/* *+ * Name: * palSupgal * Purpose: * Convert from supergalactic to galactic coordinates * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palSupgal ( double dsl, double dsb, double *dl, double *db ); * Arguments: * dsl = double (Given) * Supergalactic longitude. * dsb = double (Given) * Supergalactic latitude. * dl = double * (Returned) * Galactic longitude. * db = double * (Returned) * Galactic latitude. * Description: * Transformation from de Vaucouleurs supergalactic coordinates * to IAU 1958 galactic coordinates * Authors: * PTW: Pat Wallace (STFC) * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * See Also: * - de Vaucouleurs, de Vaucouleurs, & Corwin, Second Reference * Catalogue of Bright Galaxies, U. Texas, page 8. * - Systems & Applied Sciences Corp., Documentation for the * machine-readable version of the above catalogue, * Contract NAS 5-26490. * * (These two references give different values for the galactic * longitude of the supergalactic origin. Both are wrong; the * correct value is L2=137.37.) * History: * 2012-02-12(TIMJ): * Initial version with documentation taken from Fortran SLA * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1995 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "pal1sofa.h" void palSupgal ( double dsl, double dsb, double *dl, double *db ) { double v1[3]; double v2[3]; /* * System of supergalactic coordinates: * * SGL SGB L2 B2 (deg) * - +90 47.37 +6.32 * 0 0 - 0 * * Galactic to supergalactic rotation matrix: */ double rmat[3][3] = { { -0.735742574804,+0.677261296414,+0.000000000000 }, { -0.074553778365,-0.080991471307,+0.993922590400 }, { +0.673145302109,+0.731271165817,+0.110081262225 } }; /* Spherical to Cartesian */ eraS2c( dsl, dsb, v1 ); /* Supergalactic to galactic */ eraTrxp( rmat, v1, v2 ); /* Cartesian to spherical */ eraC2s( v2, dl, db ); /* Express in conventional ranges */ *dl = eraAnp( *dl ); *db = eraAnpm( *db ); } pal-0.9.7/palTest.c000066400000000000000000001707041302604645500141010ustar00rootroot00000000000000/* *+ * Name: * palTest * Purpose: * Test the PAL library * Language: * Starlink ANSI C * Type of Module: * Application * Description: * Test the PAL library is functioning correctly. Uses some of the SLA test code. * Authors: * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * History: * 2012-02-08 (TIMJ): * Initial version * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA. * Bugs: * {note_any_bugs_here} *- */ #include #include #include #include "pal.h" #include "palmac.h" static int verbose = 1; /* Support functions to allow to test results. viv and vvd match the SOFA/ERFA implementations */ static void viv(int ival, int ivalok, const char *func, const char *test, int *status) /* ** - - - - ** v i v ** - - - - ** ** Validate an integer result. ** ** Internal function used by t_sofa_c program. ** ** Given: ** ival int value computed by function under test ** ivalok int correct value ** func char[] name of function under test ** test char[] name of individual test ** ** Given and returned: ** status int set to FALSE if test fails ** ** This revision: 2009 November 4 */ { if (ival != ivalok) { *status = 1; printf("%s failed: %s want %d got %d\n", func, test, ivalok, ival); } else if (verbose) { printf("%s passed: %s want %d got %d\n", func, test, ivalok, ival); } return; } static void vvd(double val, double valok, double dval, const char *func, const char *test, int *status) /* ** - - - - ** v v d ** - - - - ** ** Validate a double result. ** ** Internal function used by t_sofa_c program. ** ** Given: ** val double value computed by function under test ** valok double expected value ** dval double maximum allowable error ** func char[] name of function under test ** test char[] name of individual test ** ** Given and returned: ** status int set to FALSE if test fails ** ** This revision: 2008 June 8 */ { double a, f; /* absolute and fractional error */ a = val - valok; if (fabs(a) > dval) { f = fabs(valok / a); *status = 1; printf("%s failed: %s want %.20g got %.20g (1/%.3g)\n", func, test, valok, val, f); } else if (verbose) { printf("%s passed: %s want %.20g got %.20g\n", func, test, valok, val); } return; } /* Verify a string */ static void vcs( const char * val, const char * valok, const char * func, const char * test, int *status ) { if (strcmp(val, valok) != 0) { *status = 1; printf("%s failed: %s want %s got %s\n", func, test, valok, val ); } else if (verbose) { printf("%s passed: %s want %s got %s\n", func, test, valok, val ); } return; } /* Verify the 3x3 rmat matrix */ static void vrmat( double rmat[3][3], double expected[3][3], const char * func, double dval, int * status ) { int i; char buf[10]; for( i = 0; i < 3; i++ ) { int j; for( j = 0; j < 3; j++ ) { sprintf( buf, "%d,%d", i, j ); vvd( rmat[i][j], expected[i][j], dval, func, buf, status ); } } } /* Verify a vector */ static void vvec( int len, double *vec, double *expected, const char *func, int *status ) { int i; char buf[10]; for( i = 0; i < len; i++ ) { sprintf( buf, "%d", i ); vvd( vec[i], expected[i], 1e-12, func, buf, status ); } } /******************************************************************/ /* TEST FUNCTIONS */ /* Adding E-terms */ static void t_addet( int *status ) { double r1,d1,r2,d2; double rm = 2.; double dm = -1.; double eq = 1975.; palAddet ( rm, dm, eq, &r1, &d1 ); vvd ( r1 - rm, 2.983864874295250e-6, 1e-12, "palAddet", "R", status ); vvd ( d1 - dm, 2.379650804185118e-7, 1e-12, "palAddet", "D", status ); palSubet ( r1, d1, eq, &r2, &d2 ); vvd ( r2 - rm, 0, 1e-12, "palSubet", "R", status ); vvd ( d2 - dm, 0, 1e-12, "palSubet", "D", status ); } static void t_afin( int * status ) { int j; int i = 1; double d = 0.0; const char * s = "12 34 56.7 |"; const char * s2 = "45 00 00.000 "; palDafin (s, &i, &d, &j); viv ( i, 12, "palDafin", "I", status ); vvd ( d, 0.2196045986911432, 1e-12, "palDafin", "A", status ); viv ( j, 0, "palDafin", "J", status ); i = 1; palDafin (s2, &i, &d, &j); viv ( i, 14, "palDafin", "I", status ); vvd ( d, PAL__DPI/4.0, 1e-12, "palDafin", "A", status ); viv ( j, 0, "palDafin", "J", status ); } /* Altaz */ static void t_altaz( int *status ) { double az, azd, azdd, el, eld, eldd, pa, pad, padd; palAltaz( 0.7, -0.7, -0.65, &az, &azd, &azdd, &el, &eld, &eldd, &pa, &pad, &padd ); vvd ( az, 4.400560746660174, 1e-12, "palAltaz", "AZ", status ); vvd ( azd, -0.2015438937145421, 1e-13, "palAltaz", "AZD", status ); vvd ( azdd, -0.4381266949668748, 1e-13, "palAltaz", "AZDD", status ); vvd ( el, 1.026646506651396, 1e-12, "palAltaz", "EL", status ); vvd ( eld, -0.7576920683826450, 1e-13, "palAltaz", "ELD", status ); vvd ( eldd, 0.04922465406857453, 1e-14, "palAltaz", "ELDD", status ); vvd ( pa, 1.707639969653937, 1e-12, "palAltaz", "PA", status ); vvd ( pad, 0.4717832355365627, 1e-13, "palAltaz", "PAD", status ); vvd ( padd, -0.2957914128185515, 1e-13, "palAltaz", "PADD", status ); } /* Airmass */ static void t_airmas( int *status ) { vvd ( palAirmas ( 1.2354 ), 3.015698990074724, 1e-12, "palAirmas", " ", status ); } /* Apparent to mean place */ static void t_amp ( int *status ) { double rm, dm; /* Original SLA test is not accurate since palMapqk differs from slaMapqk */ palAmp ( 2.345, -1.234, 50100, 1990, &rm, &dm ); vvd ( rm, 2.344472180027961, 1e-6, "palAmp", "R", status ); vvd ( dm, -1.233573099847705, 1e-7, "palAmp", "D", status ); /* This is the palMapqk test */ palAmp( 1.234, -0.567, 55927.0, 2010.0, &rm, &dm ); vvd( rm, 1.233512033578303857, 1.0E-12, "palAmp", "rm", status ); vvd( dm, -0.56702909748530827549, 1.0E-12, "palAmp", "dm", status ); } /* Apparent to Observed place */ static void t_aop ( int *status ) { int i; double rap, dap, date, dut, elongm, phim, hm, xp, yp, tdk, pmb, rh, wl, tlr, aob, zob, hob, dob, rob, aoprms[14]; dap = -0.1234; date = 51000.1; dut = 25.0; elongm = 2.1; phim = 0.5; hm = 3000.0; xp = -0.5e-6; yp = 1.0e-6; tdk = 280.0; pmb = 550.0; rh = 0.6; tlr = 0.006; for (i=1; i<=3; i++) { if ( i == 1 ) { rap = 2.7; wl = 0.45; } else if ( i == 2 ) { rap = 2.345; } else { wl = 1.0e6; } palAop ( rap, dap, date, dut, elongm, phim, hm, xp, yp, tdk, pmb, rh, wl, tlr, &aob, &zob, &hob, &dob, &rob ); if ( i == 1 ) { vvd( aob, 1.812817787123283034, 1e-10, "palAop", "lo aob", status ); vvd( zob, 1.393860816635714034, 1e-8, "palAop", "lo zob", status ); vvd( hob, -1.297808009092456683, 1e-8, "palAop", "lo hob", status ); vvd( dob, -0.122967060534561, 1e-8, "palAop", "lo dob", status ); vvd( rob, 2.699270287872084, 1e-8, "palAop", "lo rob", status ); } else if ( i == 2 ) { vvd( aob, 2.019928026670621442, 1e-10, "palAop", "aob/o", status ); vvd( zob, 1.101316172427482466, 1e-10, "palAop", "zob/o", status ); vvd( hob, -0.9432923558497740862, 1e-10, "palAop", "hob/o", status ); vvd( dob, -0.1232144708194224, 1e-10, "palAop", "dob/o", status ); vvd( rob, 2.344754634629428, 1e-10, "palAop", "rob/o", status ); } else { vvd( aob, 2.019928026670621442, 1e-10, "palAop", "aob/r", status ); vvd( zob, 1.101267532198003760, 1e-10, "palAop", "zob/r", status ); vvd( hob, -0.9432533138143315937, 1e-10, "palAop", "hob/r", status ); vvd( dob, -0.1231850665614878, 1e-10, "palAop", "dob/r", status ); vvd( rob, 2.344715592593984, 1e-10, "palAop", "rob/r", status ); } } date = 48000.3; wl = 0.45; palAoppa ( date, dut, elongm, phim, hm, xp, yp, tdk, pmb, rh, wl, tlr, aoprms ); vvd( aoprms[0], 0.4999993892136306, 1e-13, "palAoppa", "0", status ); vvd( aoprms[1], 0.4794250025886467, 1e-13, "palAoppa", "1", status ); vvd( aoprms[2], 0.8775828547167932, 1e-13, "palAoppa", "2", status ); vvd( aoprms[3], 1.363180872136126e-6, 1e-13, "palAoppa", "3", status ); vvd( aoprms[4], 3000.0, 1e-10, "palAoppa", "4", status ); vvd( aoprms[5], 280.0, 1e-11, "palAoppa", "5", status ); vvd( aoprms[6], 550.0, 1e-11, "palAoppa", "6", status ); vvd( aoprms[7], 0.6, 1e-13, "palAoppa", "7", status ); vvd( aoprms[8], 0.45, 1e-13, "palAoppa", "8", status ); vvd( aoprms[9], 0.006, 1e-15, "palAoppa", "9", status ); vvd( aoprms[10], 0.0001562803328459898, 1e-13, "palAoppa", "10", status ); vvd( aoprms[11], -1.792293660141e-7, 1e-13, "palAoppa", "11", status ); vvd( aoprms[12], 2.101874231495843, 1e-13, "palAoppa", "12", status ); vvd( aoprms[13], 7.601916802079765, 1e-8, "palAoppa", "13", status ); palOap ( "r", 1.6, -1.01, date, dut, elongm, phim, hm, xp, yp, tdk, pmb, rh, wl, tlr, &rap, &dap ); vvd( rap, 1.601197569844787, 1e-10, "palOap", "rr", status ); vvd( dap, -1.012528566544262, 1e-10, "palOap", "rd", status ); palOap ( "h", -1.234, 2.34, date, dut, elongm, phim, hm, xp, yp, tdk, pmb, rh, wl, tlr, &rap, &dap ); vvd( rap, 5.693087688154886463, 1e-10, "palOap", "hr", status ); vvd( dap, 0.8010281167405444, 1e-10, "palOap", "hd", status ); palOap ( "a", 6.1, 1.1, date, dut, elongm, phim, hm, xp, yp, tdk, pmb, rh, wl, tlr, &rap, &dap ); vvd( rap, 5.894305175192448940, 1e-10, "palOap", "ar", status ); vvd( dap, 1.406150707974922, 1e-10, "palOap", "ad", status ); palOapqk ( "r", 2.1, -0.345, aoprms, &rap, &dap ); vvd( rap, 2.10023962776202, 1e-10, "palOapqk", "rr", status ); vvd( dap, -0.3452428692888919, 1e-10, "palOapqk", "rd", status ); palOapqk ( "h", -0.01, 1.03, aoprms, &rap, &dap ); vvd( rap, 1.328731933634564995, 1e-10, "palOapqk", "hr", status ); vvd( dap, 1.030091538647746, 1e-10, "palOapqk", "hd", status ); palOapqk ( "a", 4.321, 0.987, aoprms, &rap, &dap ); vvd( rap, 0.4375507112075065923, 1e-10, "palOapqk", "ar", status ); vvd( dap, -0.01520898480744436, 1e-10, "palOapqk", "ad", status ); palAoppat ( date + PAL__DS2R, aoprms ); vvd( aoprms[13], 7.602374979243502, 1e-8, "palAoppat", " ", status ); } /* Bearings */ static void t_bear( int *status ) { double a1 = 1.234; double b1 = -0.123; double a2 = 2.345; double b2 = 0.789; double d1[3]; double d2[3]; vvd ( palDbear ( a1, b1, a2, b2 ), 0.7045970341781791, 1e-12, "palDbear", " ", status ); palDcs2c ( a1, b1, d1 ); palDcs2c ( a2, b2, d2 ); vvd ( palDpav ( d1, d2 ), 0.7045970341781791, 1e-12, "palDpav", " ", status ); } /* Calendar to MJD */ static void t_caldj( int *status ) { int j; double djm; palCaldj ( 1999, 12, 31, &djm, &j ); vvd ( djm, 51543, 0, "palCaldj", " ", status ); viv ( j, 0, "palCaldj", "J", status ); } /* palDaf2r */ static void t_caf2r( int * status ) { int j; double dr; palDaf2r ( 76, 54, 32.1, &dr, &j ); vvd ( dr, 1.342313819975276, 1e-12, "palDaf2r", "r", status ); viv ( j, 0, "palDaf2r", "j", status ); } /* Test palDcc2s routines */ static void t_cc2s( int * status ) { double dv[3] = { 100., -50., 25. }; double da, db; palDcc2s ( dv, &da, &db ); vvd ( da, -0.4636476090008061, 1e-12, "palDcc2s", "A", status ); vvd ( db, 0.2199879773954594, 1e-12, "palDcc2s", "B", status ); } /* palDd2tf */ static void t_cd2tf( int *status ) { int ihmsf[4]; char s; palDd2tf ( 4, -0.987654321, &s, ihmsf ); viv ( s, '-', "palDd2tf", "S", status ); viv ( ihmsf[0], 23, "palDd2tf", "(1)", status ); viv ( ihmsf[1], 42, "palDd2tf", "(2)", status ); viv ( ihmsf[2], 13, "palDd2tf", "(3)", status ); viv ( ihmsf[3], 3333, "palDd2tf", "(4)", status ); } /* Calendar to MJD */ static void t_cldj( int *status ) { double d; int j; palCldj ( 1899, 12, 31, &d, &j ); vvd ( d, 15019, 0, "palCldj", "D", status ); viv ( j, 0, "palCldj", "J", status ); } /* palDr2af */ static void t_cr2af( int *status ) { char s; int idmsf[4]; palDr2af ( 4, 2.345, &s, idmsf ); viv ( s, '+', "palDr2af", "S", status ); viv ( idmsf[0], 134, "palDr2af", "(1)", status ); viv ( idmsf[1], 21, "palDr2af", "(2)", status ); viv ( idmsf[2], 30, "palDr2af", "(3)", status ); viv ( idmsf[3], 9706, "palDr2af", "(4)", status ); } /* palDr2tf */ static void t_cr2tf( int *status ) { char s; int ihmsf[4]; palDr2tf ( 4, -3.01234, &s, ihmsf ); viv ( s, '-', "palDr2tf", "S", status ); viv ( ihmsf[0], 11, "palDr2tf", "(1)", status ); viv ( ihmsf[1], 30, "palDr2tf", "(2)", status ); viv ( ihmsf[2], 22, "palDr2tf", "(3)", status ); viv ( ihmsf[3], 6484, "palDr2tf", "(4)", status ); } /* palDtf2d */ static void t_ctf2d( int *status ) { double dd; int j; palDtf2d (23, 56, 59.1, &dd, &j); vvd ( dd, 0.99790625, 1e-12, "palDtf2d", "D", status ); viv ( j, 0, "palDtf2d", "J", status ); } /* palDtf2r */ static void t_ctf2r( int *status ) { double dr; int j; palDtf2r (23, 56, 59.1, &dr, &j); vvd ( dr, 6.270029887942679, 1e-12, "palDtf2r", "R", status ); viv ( j, 0, "palDtf2r", "J", status ); } static void t_dat ( int *status ) { vvd ( palDat ( 43900 ), 18, 0, "palDat", " ", status ); vvd ( palDtt ( 40404 ), 39.709746, 1e-12, "palDtt", " ", status ); vvd ( palDt ( 500 ), 4686.7, 1e-10, "palDt", "500", status ); vvd ( palDt ( 1400 ), 408, 1e-11, "palDt", "1400", status ); vvd ( palDt ( 1950 ), 27.99145626, 1e-12, "palDt", "1950", status ); } /* Dates */ static void t_djcal( int *status ) { const double djm = 50123.9999; int iy, im, id; int iydmf[4]; int j; double f; palDjcal ( 4, djm, iydmf, &j ); viv ( iydmf[0], 1996, "palDjcal", "Y", status ); viv ( iydmf[1], 2, "palDjcal", "M", status ); viv ( iydmf[2], 10, "palDjcal", "D", status ); viv ( iydmf[3], 9999, "palDjcal", "F", status ); viv ( j, 0, "palDjcal", "J", status ); palDjcl ( djm, &iy, &im, &id, &f, &j ); viv ( iy, 1996, "palDjcl", "Y", status ); viv ( im, 2, "palDjcl", "M", status ); viv ( id, 10, "palDjcl", "D", status ); vvd ( f, 0.9999, 1e-7, "palDjcl", "F", status ); viv ( j, 0, "palDjcl", "J", status ); } /* Matrix inversion */ static void t_dmat( int *status ) { int j; int iw[3]; double dd; double da[9] = { 2.22, 1.6578, 1.380522, 1.6578, 1.380522, 1.22548578, 1.380522, 1.22548578, 1.1356276122 }; double dv[3] = { 2.28625, 1.7128825, 1.429432225 }; palDmat( 3, da, dv, &dd, &j, iw ); vvd ( da[0], 18.02550629769198, 1e-10, "palDmat", "a[0]", status ); vvd ( da[1], -52.16386644917280607, 1e-10, "palDmat", "a[1]", status ); vvd ( da[2], 34.37875949717850495, 1e-10, "palDmat", "a[2]", status ); vvd ( da[3], -52.16386644917280607, 1e-10, "palDmat", "a[3]", status ); vvd ( da[4], 168.1778099099805627, 1e-10, "palDmat", "a[4]", status ); vvd ( da[5], -118.0722869694232670, 1e-10, "palDmat", "a[5]", status ); vvd ( da[6], 34.37875949717850495, 1e-10, "palDmat", "a[6]", status ); vvd ( da[7], -118.0722869694232670, 1e-10, "palDmat", "a[7]", status ); vvd ( da[8], 86.50307003740151262, 1e-10, "palDmat", "a[8]", status ); vvd ( dv[0], 1.002346480763383, 1e-12, "palDmat", "v[0]", status ); vvd ( dv[1], 0.03285594016974583489, 1e-12, "palDmat", "v[1]", status ); vvd ( dv[2], 0.004760688414885247309, 1e-12, "palDmat", "v[2]", status ); vvd ( dd, 0.003658344147359863, 1e-12, "palDmat", "D", status ); viv ( j, 0, "palDmat", "J", status ); } /* Test palDe2h and palDh2e routines */ static void t_e2h( int *status ) { double dh, dd, dp, da, de; dh = -0.3; dd = -1.1; dp = -0.7; palDe2h( dh, dd, dp, &da, &de ); vvd( da, 2.820087515852369, 1e-12, "palDe2h", "AZ", status); vvd( de, 1.132711866443304, 1e-12, "palDe2h", "EL", status ); palDh2e( da, de, dp, &dh, &dd ); vvd( dh, -0.3, 1e-12, "palDh2e", "HA", status); vvd( dd, -1.1, 1e-12, "palDh2e", "DEC", status ); } /* Epochs */ static void t_epb( int *status ) { vvd ( palEpb( 45123 ), 1982.419793168669, 1e-8, "palEpb", " ", status ); } static void t_epb2d( int *status ) { vvd ( palEpb2d( 1975.5 ), 42595.5995279655, 1e-7, "palEpb2d", " ", status ); } static void t_epco( int *status ) { vvd ( palEpco ( 'B', 'J', 2000 ), 2000.001277513665, 1e-7, "palEpco", "BJ", status ); vvd ( palEpco ( 'J', 'B', 1950 ), 1949.999790442300, 1e-7, "palEpco", "JB", status ); vvd ( palEpco ( 'J', 'j', 2000 ), 2000, 1e-7, "palEpco", "JJ", status ); } static void t_epj( int *status ) { vvd ( palEpj( 42999 ), 1976.603696098563, 1e-7, "palEpj", " ", status ); } static void t_epj2d( int *status ) { vvd ( palEpj2d( 2010.077 ), 55225.124250, 1e-6, "palEpj2d", " ", status ); } /* Equation of the equinoxes */ /* Use SOFA/ERFA test because of change in precession model */ static void t_eqeqx (int *status ) { vvd ( palEqeqx( 53736. ), -0.8834195072043790156e-5, 1e-15, "palEqeqx", " ", status ); } /* E-terms */ static void t_etrms( int * status ) { double ev[3]; palEtrms ( 1976.9, ev ); vvd ( ev[0], -1.621617102537041e-6, 1e-18, "palEtrms", "X", status ); vvd ( ev[1], -3.310070088507914e-7, 1e-18, "palEtrms", "Y", status ); vvd ( ev[2], -1.435296627515719e-7, 1e-18, "palEtrms", "Z", status ); } /* J2000 to Galactic */ static void t_eqgal( int *status ) { double dl, db; palEqgal ( 5.67, -1.23, &dl, &db ); vvd ( dl, 5.612270780904526, 1e-12, "palEqgal", "DL", status ); vvd ( db, -0.6800521449061520, 1e-12, "palEqgal", "DB", status ); } /* Galactic to J2000 equatorial */ static void t_galeq( int *status ) { double dr, dd; palGaleq ( 5.67, -1.23, &dr, &dd ); vvd ( dr, 0.04729270418071426, 1e-12, "palGaleq", "DR", status ); vvd ( dd, -0.7834003666745548, 1e-12, "palGaleq", "DD", status ); } /* Galactic to supergalactic */ static void t_galsup(int *status ) { double dsl, dsb; palGalsup ( 6.1, -1.4, &dsl, &dsb ); vvd ( dsl, 4.567933268859171, 1e-12, "palGalsup", "DSL", status ); vvd ( dsb, -0.01862369899731829, 1e-12, "palGalsup", "DSB", status ); } /* Geocentric coordinates */ /* This is not from sla_test.f */ static void t_geoc( int *status ) { double r; double z; /* JCMT */ const double lat = 19.822838905884 * PAL__DD2R; const double alt = 4120.0; palGeoc( lat, alt, &r, &z ); /* Note the lower tolerance than normal since the models in SLA differ from the more up to date model in SOFA/ERFA */ vvd( r, 4.01502667039618e-05, 1e-10, "palGeoc", "R", status ); vvd( z, 1.43762411970295e-05, 1e-10, "palGeoc", "Z", status ); } /* Galactic to Fk4 */ static void t_ge50 ( int *status ) { double dr, dd; palGe50( 6.1, -1.55, &dr, &dd ); vvd ( dr, 0.1966825219934508, 1e-12, "palGe50", "DR", status ); vvd ( dd, -0.4924752701678960, 1e-12, "palGe50", "DD", status ); } /* GMST */ /* We use the SOFA/ERFA test values rather than the values from SLA because the precession models have changed */ static void t_gmst( int *status ) { vvd ( palGmst( 53736. ), 1.754174971870091203, 1e-12, "palGmst", " ", status ); vvd ( palGmsta( 53736., 0.0 ), 1.754174971870091203, 1e-12, "palGmsta", " ", status ); } /* FK5 */ static void t_fk52h ( int *status ) { double r5, d5, dr5, dd5, rh, dh; palFk5hz ( 1.234, -0.987, 1980, &rh, &dh ); vvd ( rh, 1.234000136713611301, 1e-13, "palFk5hz", "R", status ); vvd ( dh, -0.9869999702020807601, 1e-13, "palFk5hz", "D", status ); palHfk5z ( rh, dh, 1980, &r5, &d5, &dr5, &dd5 ); vvd ( r5, 1.234, 1e-13, "palHfk5z", "R", status ); vvd ( d5, -0.987, 1e-13, "palHfk5z", "D", status ); vvd ( dr5, 0.000000006822074, 1e-13, "palHfk5z", "DR", status ); vvd ( dd5, -0.000000002334012, 1e-13, "palHfk5z", "DD", status ); } static void t_intin( int *status ) { const char s[] = " -12345, , -0 2000 + "; /* 1234567890123456789012345678 */ int i = 1; long n = 0; int j; palIntin ( s, &i, &n, &j ); viv ( i, 10, "palIntin", "I1", status ); viv ( n, -12345, "palIntin", "V1", status ); viv ( j, -1, "palIntin", "J1", status ); palIntin ( s, &i, &n, &j ); viv ( i, 12, "palIntin", "I2", status ); viv ( n, -12345, "palIntin", "V2", status ); viv ( j, 1, "palIntin", "J2", status ); palIntin ( s, &i, &n, &j ); viv ( i, 17, "palIntin", "I3", status ); viv ( n, 0, "palIntin", "V3", status ); viv ( j, -1, "palIntin", "J3", status ); palIntin ( s, &i, &n, &j ); viv ( i, 23, "palIntin", "I4", status ); viv ( n, 2000, "palIntin", "V4", status ); viv ( j, 0, "palIntin", "J4", status ); palIntin ( s, &i, &n, &j ); viv ( i, 29, "palIntin", "I5", status ); viv ( n, 2000, "palIntin", "V5", status ); viv ( j, 1, "palIntin", "J5", status ); /* Note that strtol does not care about a + */ } /* Moon */ static void t_moon ( int *status ) { double pv[6]; double expected1[] = { 0.00229161514616454, 0.000973912029208393, 0.000669931538978146, -3.44709700068209e-09, 5.44477533462392e-09, 2.11785724844417e-09 }; /* SLA test only include slaMoon so we use the example from SUN/67 */ palDmoon( 48634.4687174074, pv ); vvec( 6, pv, expected1, "palDmoon", status ); } /* Nutation */ static void t_nut( int *status ) { double dpsi, deps, eps0; double expected[3][3] = { { 9.999999969492166e-1, 7.166577986249302e-5, 3.107382973077677e-5 }, { -7.166503970900504e-5, 9.999999971483732e-1, -2.381965032461830e-5 }, { -3.107553669598237e-5, 2.381742334472628e-5, 9.999999992335206818e-1 } }; double rmatn[3][3]; /* SLA tests with low precision */ palNut( 46012.32, rmatn ); vrmat( rmatn, expected, "palNut", 1.0e-3, status ); /* Use the SOFA/ERFA tests */ palNutc( 54388.0, &dpsi, &deps, &eps0 ); vvd( eps0, 0.4090749229387258204, 1e-14, "palNutc", "eps0", status); palNutc( 53736.0, &dpsi, &deps, &eps0 ); vvd(dpsi, -0.9630912025820308797e-5, 1e-13, "palNutc", "dpsi", status); vvd(deps, 0.4063238496887249798e-4, 1e-13, "palNutc", "deps", status); } /* palPrebn */ static void t_prebn( int *status ) { double rmatp[3][3]; double prebn_expected[3][3] = { { 9.999257613786738e-1, -1.117444640880939e-2, -4.858341150654265e-3 }, { 1.117444639746558e-2, 9.999375635561940e-1, -2.714797892626396e-5 }, { 4.858341176745641e-3, -2.714330927085065e-5, 9.999881978224798e-1 }, }; palPrebn ( 1925., 1975., rmatp ); vrmat( rmatp, prebn_expected, "palPrebn", 1.0e-12, status ); } /* Range */ static void t_range( int *status ) { vvd ( palDrange ( -4 ), 2.283185307179586, 1e-12, "palDrange", " ", status ); } static void t_ranorm( int *status ) { vvd ( palDranrm ( -0.1 ), 6.183185307179587, 1e-12, "palDranrm", "2", status ); } /* Separation routines */ static void t_sep( int *status ) { double d1[3] = { 1.0, 0.1, 0.2 }; double d2[3] = { -3.0, 1e-3, 0.2 }; double ad1, bd1, ad2, bd2; palDcc2s( d1, &ad1, &bd1 ); palDcc2s( d2, &ad2, &bd2 ); vvd ( palDsep ( ad1, bd1, ad2, bd2 ), 2.8603919190246608, 1e-7, "palDsep", " ", status ); vvd ( palDsepv ( d1, d2 ), 2.8603919190246608, 1e-7, "palDsepv", " ", status ); } /* Supergalactic */ static void t_supgal( int *status ) { double dl, db; palSupgal ( 6.1, -1.4, &dl, &db ); vvd ( dl, 3.798775860769474, 1e-12, "palSupgal", "DL", status ); vvd ( db, -0.1397070490669407, 1e-12, "palSupgal", "DB", status ); } /* Test spherical tangent-plane-projection routines */ static void t_tp( int *status ) { int j; double dr0, dd0, dr1, dd1, dx, dy, dr2, dd2, dr01, dd01, dr02, dd02; dr0 = 3.1; dd0 = -0.9; dr1 = dr0 + 0.2; dd1 = dd0 - 0.1; palDs2tp( dr1, dd1, dr0, dd0, &dx, &dy, &j ); vvd( dx, 0.1086112301590404, 1e-12, "palDs2tp", "x", status ); vvd( dy, -0.1095506200711452, 1e-12, "palDs2tp", "y", status ); viv( j, 0, "palDs2tp", "j", status ); palDtp2s( dx, dy, dr0, dd0, &dr2, &dd2 ); vvd( dr2 - dr1, 0., 1e-12, "palDtp2s", "r", status ); vvd( dd2 - dd1, 0., 1e-12, "palDtp2s", "d", status ); palDtps2c( dx, dy, dr2, dd2, &dr01, &dd01, &dr02, &dd02, &j ); vvd( dr01, 3.1, 1e-12, "palDtps2c", "r1", status); vvd( dd01, -0.9, 1e-12, "palDtps2c", "d1", status); vvd( dr02, 0.3584073464102072, 1e-12, "palDtps2c", "r2", status); vvd( dd02, -2.023361658234722, 1e-12, "palDtps2c", "d2", status ); viv( j, 1, "palDtps2c", "n", status ); } /* Test all the 3-vector and 3x3 matrix routines. */ static void t_vecmat( int * status ) { int i; /* palDav2m */ double drm1[3][3]; double dav[3] = { -0.123, 0.0987, 0.0654 }; double dav2m_expected[3][3] = { { 0.9930075842721269, 0.05902743090199868, -0.1022335560329612 }, { -0.07113807138648245, 0.9903204657727545, -0.1191836812279541 }, { 0.09420887631983825, 0.1256229973879967, 0.9875948309655174 }, }; /* palDeuler */ double drm2[3][3]; double deuler_expected[3][3] = { { -0.1681574770810878, 0.1981362273264315, 0.9656423242187410 }, { -0.2285369373983370, 0.9450659587140423, -0.2337117924378156 }, { -0.9589024617479674, -0.2599853247796050, -0.1136384607117296 } }; /* palDmxm */ double drm[3][3]; double dmxm_expected[3][3] = { { -0.09010460088585805, 0.3075993402463796, 0.9472400998581048 }, { -0.3161868071070688, 0.8930686362478707, -0.3200848543149236 }, { -0.9444083141897035, -0.3283459407855694, 0.01678926022795169 }, }; /* palDcs2c et al */ double dv1[3]; double dv2[3]; double dv3[3]; double dv4[3]; double dv5[3]; double dv6[3]; double dv7[3]; double dvm; /* palDav2m */ palDav2m( dav, drm1 ); vrmat( drm1, dav2m_expected, "palDav2m", 1.0e-12, status ); /* Test palDeuler */ palDeuler( "YZY", 2.345, -0.333, 2.222, drm2 ); vrmat( drm2, deuler_expected, "palDeuler", 1.0e-12, status ); /* palDmxm */ palDmxm( drm2, drm1, drm ); vrmat( drm, dmxm_expected, "palDmxm", 1.0e-12, status ); /* palDcs2c */ palDcs2c( 3.0123, -0.999, dv1 ); vvd ( dv1[0], -0.5366267667260525, 1e-12, "palDcs2c", "x", status ); vvd ( dv1[1], 0.06977111097651444, 1e-12, "palDcs2c", "y", status ); vvd ( dv1[2], -0.8409302618566215, 1e-12, "palDcs2c", "z", status ); /* palDmxv */ palDmxv( drm1, dv1, dv2 ); palDmxv( drm2, dv2, dv3 ); vvd ( dv3[0], -0.7267487768696160, 1e-12, "palDmxv", "x", status ); vvd ( dv3[1], 0.5011537352639822, 1e-12, "palDmxv", "y", status ); vvd ( dv3[2], 0.4697671220397141, 1e-12, "palDmxv", "z", status ); /* palDimxv */ palDimxv( drm, dv3, dv4 ); vvd ( dv4[0], -0.5366267667260526, 1e-12, "palDimxv", "X", status ); vvd ( dv4[1], 0.06977111097651445, 1e-12, "palDimxv", "Y", status ); vvd ( dv4[2], -0.8409302618566215, 1e-12, "palDimxv", "Z", status ); /* palDm2av */ palDm2av( drm, dv5 ); vvd ( dv5[0], 0.006889040510209034, 1e-12, "palDm2av", "X", status ); vvd ( dv5[1], -1.577473205461961, 1e-12, "palDm2av", "Y", status ); vvd ( dv5[2], 0.5201843672856759, 1e-12, "palDm2av", "Z", status ); for (i=0; i<3; i++) { dv5[i] *= 1000.0; } /* palDvn */ palDvn( dv5, dv6, &dvm ); vvd ( dv6[0], 0.004147420704640065, 1e-12, "palDvn", "X", status ); vvd ( dv6[1], -0.9496888606842218, 1e-12, "palDvn", "Y", status ); vvd ( dv6[2], 0.3131674740355448, 1e-12, "palDvn", "Z", status ); vvd ( dvm, 1661.042127339937, 1e-9, "palDvn", "M", status ); vvd ( palDvdv ( dv6, dv1 ), -0.3318384698006295, 1e-12, "palDvn", " ", status ); /* palDvxv */ palDvxv( dv6, dv1, dv7 ); vvd ( dv7[0], 0.7767720597123304, 1e-12, "palDvxv", "X", status ); vvd ( dv7[1], -0.1645663574562769, 1e-12, "palDvxv", "Y", status ); vvd ( dv7[2], -0.5093390925544726, 1e-12, "palDvxv", "Z", status ); } static void t_ecleq( int *status ) { double dr; double dd; palEcleq( 1.234, -0.123, 43210.0, &dr, &dd ); vvd( dr, 1.229910118208851, 1e-5, "palEcleq", "RA", status ); vvd( dd, 0.2638461400411088, 1e-5, "palEcleq", "Dec", status ); } static void t_ecmat( int *status ) { double rmat[3][3]; double expected[3][3] = { { 1.0, 0.0, 0.0 }, { 0.0, 0.91749307789883549624, 0.3977517467060596168 }, { 0.0, -0.3977517467060596168, 0.91749307789883549624 } }; palEcmat( 55966.46, rmat ); vrmat( rmat, expected, "palEcmat", 1.0e-12, status ); } static void t_eqecl ( int *status ) { double dl, db; palEqecl ( 0.789, -0.123, 46555, &dl, &db ); /* Slight changes from SLA for 2006 precession/nutation */ vvd ( dl, 0.7036566430349022, 1e-6, "palEqecl", "L", status ); vvd ( db, -0.4036047164116848, 1e-6, "palEqecl", "B", status ); } static void t_prec( int *status ) { double rmat[3][3]; double expected[3][3] = { { 0.9999856154510, -0.0049192906204, -0.0021376320580 }, { 0.0049192906805, 0.9999879002027, -5.2297405698747e-06 }, { 0.0021376319197, -5.2859681191735e-06, 0.9999977152483 } }; palPrec( 1990.0, 2012.0, rmat ); vrmat( rmat, expected, "palPrec", 1.0e-12, status ); } static void t_preces( int *status ) { double ra; double dc; ra = 6.28; dc = -1.123; palPreces ( "FK4", 1925, 1950, &ra, &dc ); vvd ( ra, 0.002403604864728447, 1e-12, "palPreces", "R", status ); vvd ( dc, -1.120570643322045, 1e-12, "palPreces", "D", status ); /* This is the SLA test but PAL now uses the IAU 2006 precession model so we need to loosen the comparison */ ra = 0.0123; dc = 1.0987; palPreces ( "FK5", 2050, 1990, &ra, &dc ); vvd ( ra, 6.282003602708382, 1e-6, "palPreces", "R", status ); vvd ( dc, 1.092870326188383, 1e-6, "palPreces", "D", status ); } static void t_evp( int *status ) { double dvb[3],dpb[3],dvh[3],dph[3]; double vbex[3] = { 1.6957348127008098514e-07, -9.1093446116039685966e-08, -3.9528532243991863036e-08 }; double pbex[3] = {-0.49771075259730546136, -0.80273812396332311359, -0.34851593942866060383 }; double vhex[3] = { 1.6964379181455713805e-07, -9.1147224045727438391e-08, -3.9553158272334222497e-08 }; double phex[3] = { -0.50169124421419830639, -0.80650980174901798492, -0.34997162028527262212 }; double vbex2[3] = { -0.0109187426811683, -0.0124652546173285, -0.0054047731809662 }; double pbex2[3] = { -0.7714104440491060, +0.5598412061824225, +0.2425996277722475 }; double vhex2[3] = { -0.0109189182414732, -0.0124718726844084, -0.0054075694180650 }; double phex2[3] = { -0.7757238809297653, +0.5598052241363390, +0.2426998466481708 }; palEvp( 2010.0, 2012.0, dvb, dpb, dvh, dph ); vvec( 3, dvb, vbex, "palEvp", status ); vvec( 3, dpb, pbex, "palEvp", status ); vvec( 3, dvh, vhex, "palEvp", status ); vvec( 3, dph, phex, "palEvp", status ); palEpv ( 53411.52501161, dph, dvh, dpb, dvb ); vvec( 3, dvb, vbex2, "palEpv", status ); vvec( 3, dpb, pbex2, "palEpv", status ); vvec( 3, dvh, vhex2, "palEpv", status ); vvec( 3, dph, phex2, "palEpv", status ); } static void t_map( int *status ) { double ra, da; palMap ( 6.123, -0.999, 1.23e-5, -0.987e-5, 0.123, 32.1, 1999, 43210.9, &ra, &da ); /* These are the SLA tests but and they agree to 0.1 arcsec with PAL/SOFA/ERFA. We expect a slight difference from the change to nutation models. */ vvd ( ra, 6.117130429775647, 1e-6, "palMap", "RA", status ); vvd ( da, -1.000880769038632, 1e-8, "palMap", "DA", status ); } static void t_mappa( int *status ) { double amprms[21]; double expected[21] = {1.9986310746064646082, -0.1728200754134739392, 0.88745394651412767839, 0.38472374350184274094, -0.17245634725219796679, 0.90374808622520386159, 0.3917884696321610738, 2.0075929387510784968e-08, -9.9464149073251757597e-05, -1.6125306981057062306e-05, -6.9897255793245634435e-06, 0.99999999489900059935, 0.99999983777998024959, -0.00052248206600935195865, -0.00022683144398381763045, 0.00052248547063364874764, 0.99999986339269864022, 1.4950491424992534218e-05, 0.00022682360163333854623, -1.5069005133483779417e-05, 0.99999997416198904698}; palMappa( 2010.0, 55927.0, amprms ); vvec( 21, amprms, expected, "palMappa", status ); } static void t_mapqk( int *status ) { /* Test mapqk by taking the geocentric apparent positions of Arcturus as downloaded from aa.usno.mil/data/docs/geocentric.php and trying to calculate it from Arcturus' mean position, proper motion, parallax, and radial velocity */ double amprms[21]; double ra_0, dec_0; /* mean position */ double ra_app, dec_app; /* geocentric apparent position */ double ra_test, dec_test; double px, pm_ra, pm_dec, v_rad; int j; int iposn; /* The data below represents the position of Arcturus on JD (UT) 2457000.375 as reported by http://aa.usno.navy.mil/data/docs/geocentric.php */ const char radec_0[] = "14 15 39.67207 19 10 56.673"; const char radec_app[] = "14 16 19.59 19 6 19.56"; iposn = 1; palDafin(radec_0, &iposn, &ra_0, &j); palDafin(radec_0, &iposn, &dec_0, &j); ra_0 *= 15.0; pm_ra = -1.0939*PAL__DAS2R; pm_ra /= cos(dec_0); pm_dec = -2.00006*PAL__DAS2R; v_rad = -5.19; px = 0.08883*PAL__DAS2R; palMappa(2000.0, 56999.87537249177, amprms); /* time is the TDB MJD calculated from a JD of 2457000.375 with astropy.time */ palMapqk(ra_0, dec_0, pm_ra, pm_dec, px, v_rad, amprms, &ra_test, &dec_test); iposn = 1; palDafin(radec_app, &iposn, &ra_app, &j); palDafin(radec_app, &iposn, &dec_app, &j); ra_app *= 15.0; /* find the angular distance from the known mean position to the calculated mean postion */ double dd; dd = palDsep(ra_test, dec_test, ra_app, dec_app); dd *= PAL__DR2AS; vvd( dd, 0.0, 0.1, "palMapqk", "distance", status); } static void t_mapqkz( int *status ) { double amprms[21], ra, da, ra_c, da_c; /* Run inputs through mapqk with zero proper motion, parallax and radial velocity. Then run the same inputs through mapqkz. Verify that the results are the same */ palMappa( 2010.0, 55927.0, amprms ); palMapqk(1.234, -0.567, 0.0, 0.0, 0.0, 0.0, amprms, &ra_c, &da_c); palMapqkz( 1.234, -0.567, amprms, &ra, &da ); vvd( ra, ra_c, 1.0E-12, "palMapqkz", "ra", status ); vvd( da, da_c, 1.0E-12, "palMapqkz", "da", status ); } static void t_ampqk( int *status ) { double amprms[21], rm, dm; palMappa( 2010.0, 55927.0, amprms ); palAmpqk( 1.234, -0.567, amprms, &rm, &dm ); vvd( rm, 1.233512033578303857, 1.0E-12, "palAmpqk", "rm", status ); vvd( dm, -0.56702909748530827549, 1.0E-12, "palAmpqk", "dm", status ); } static void t_fk45z( int *status ) { double r2000, d2000; palFk45z( 1.2, -0.3, 1960.0, &r2000, &d2000 ); vvd( r2000, 1.2097812228966762227, 1.0E-12, "palFk45z", "r2000", status ); vvd( d2000, -0.29826111711331398935, 1.0E-12, "palFk45z", "d2000", status ); } static void t_fk54z( int *status ) { double r1950, d1950, dr1950, dd1950; palFk54z( 1.2, -0.3, 1960.0, &r1950, &d1950, &dr1950, &dd1950 ); vvd( r1950, 1.1902221805755279771, 1.0E-12, "palFk54z", "r1950", status ); vvd( d1950, -0.30178317645793828472, 1.0E-12, "palFk54z", "d1950", status ); vvd( dr1950, -1.7830874775952945507e-08, 1.0E-12, "palFk54z", "dr1950", status ); vvd( dd1950, 7.196059425334821089e-09, 1.0E-12, "palFk54z", "dd1950", status ); } static void t_fk524( int *status ) { double r1950, d1950, dr1950, dd1950, p1950, v1950; palFk524(4.567, -1.23, -3e-5, 8e-6, 0.29, -35.0, &r1950, &d1950, &dr1950, &dd1950, &p1950, &v1950); vvd(r1950, 4.543778603272084, 1e-12, "palFk524", "r", status); vvd(d1950, -1.229642790187574, 1e-12, "palFk524", "d", status); vvd(dr1950, -2.957873121769244e-5, 1e-17, "palFk524", "dr", status); vvd(dd1950, 8.117725309659079e-6, 1e-17, "palFk524", "dd", status); vvd(p1950, 0.2898494999992917, 1e-12, "palFk524", "p", status); vvd(v1950, -35.026862824252680, 1e-11, "palFk524", "v", status); } static void t_flotin( int * status ) { int j; const char * s = " 12.345, , -0 1E3-4 2000 E "; /* 123456789012345678901234567890123 */ int i = 1; double dv = 0.0; palDfltin ( s, &i, &dv, &j ); viv ( i, 10, "palDfltin", "I1", status ); vvd ( dv, 12.345, 1e-12, "palDfltin", "V1", status ); viv ( j, 0, "palDfltin", "J1", status ); palDfltin ( s, &i, &dv, &j ); viv ( i, 12, "palDfltin", "I2", status ); vvd ( dv, 12.345, 1e-12, "palDfltin", "V2", status ); viv ( j, 1, "palDfltin", "J2", status ); palDfltin ( s, &i, &dv, &j ); viv ( i, 16, "palDfltin", "I3", status ); vvd ( dv, 0, 0, "palDfltin", "V3", status ); viv ( j, -1, "palDfltin", "J3", status ); palDfltin ( s, &i, &dv, &j ); viv ( i, 19, "palDfltin", "I4", status ); vvd ( dv, 1000, 0, "palDfltin", "V4", status ); viv ( j, 0, "palDfltin", "J4", status ); palDfltin ( s, &i, &dv, &j ); viv ( i, 22, "palDfltin", "I5", status ); vvd ( dv, -4, 0, "palDfltin", "V5", status ); viv ( j, -1, "palDfltin", "J5", status ); palDfltin ( s, &i, &dv, &j ); viv ( i, 28, "palDfltin", "I6", status ); vvd ( dv, 2000, 0, "palDfltin", "V6", status ); viv ( j, 0, "palDfltin", "J6", status ); palDfltin ( s, &i, &dv, &j ); viv ( i, 34, "palDfltin", "I7", status ); vvd ( dv, 2000, 0, "palDfltin", "V7", status ); viv ( j, 1, "palDfltin", "J7", status ); /* differs from slaDfltin */ /* Now test overflow and underflow */ i = 1; palDfltin( " 1D600 ", &i, &dv, &j ); viv ( i, 8, "palDfltin", "I8", status ); vvd ( dv, HUGE_VAL, 0, "palDfltin", "V8", status ); viv ( j, 2, "palDfltin", "J8", status ); } static void t_obs( int * status ) { char shortname[11]; char longname[41]; double w, p, h; int lstat; lstat = palObs( 0, "MMT", shortname, sizeof(shortname), longname, sizeof(longname), &w, &p, &h ); vcs ( shortname, "MMT", "palObs", "1/C", status ); vcs ( longname, "MMT 6.5m, Mt Hopkins", "palObs", "1/NAME", status ); vvd ( w, 1.935300584055477, 1e-8, "palObs", "1/W", status ); vvd ( p, 0.5530735081550342238, 1e-10, "palObs", "1/P", status ); vvd ( h, 2608, 1e-10, "palObs", "1/H", status ); viv( lstat, 0, "palObs", "retval", status ); lstat = palObs ( 61, NULL, shortname, sizeof(shortname), longname, sizeof(longname), &w, &p, &h ); vcs ( shortname, "KECK1", "palObs", "2/C", status ); vcs ( longname, "Keck 10m Telescope #1", "palObs", "2/NAME", status ); vvd ( w, 2.713545757918895, 1e-8, "palObs", "2/W", status ); vvd ( p, 0.3460280563536619, 1e-8, "palObs", "2/P", status ); vvd ( h, 4160, 1e-10, "palObs", "2/H", status ); viv( lstat, 0, "palObs", "retval", status ); lstat = palObs ( 83, NULL, shortname, sizeof(shortname), longname, sizeof(longname), &w, &p, &h ); vcs ( shortname, "MAGELLAN2", "palObs", "3/C", status ); vcs ( longname, "Magellan 2, 6.5m, Las Campanas", "palObs", "3/NAME", status ); vvd ( w, 1.233819305534497, 1e-8, "palObs", "3/W", status ); vvd ( p, -0.506389344359954, 1e-8, "palObs", "3/P", status ); vvd ( h, 2408, 1e-10, "palObs", "3/H", status ); viv( lstat, 0, "palObs", "retval", status ); /* the first argument here should be 1 greater than the number of items * in const struct telData defined in palObs.c */ lstat = palObs ( 86, NULL, shortname, sizeof(shortname), longname, sizeof(longname), &w, &p, &h ); vcs ( longname, "?", "palObs", "4/NAME", status ); viv( lstat, -1, "palObs", "retval", status ); lstat = palObs ( 0, "MISSING", shortname, sizeof(shortname), longname, sizeof(longname), &w, &p, &h ); vcs ( longname, "?", "palObs", "5/NAME", status ); viv( lstat, -1, "palObs", "retval", status ); lstat = palObs( 0, "mmt", shortname, sizeof(shortname), longname, sizeof(longname), &w, &p, &h ); vcs ( shortname, "MMT", "palObs", "6/C", status ); vcs ( longname, "MMT 6.5m, Mt Hopkins", "palObs", "6/NAME", status ); vvd ( w, 1.935300584055477, 1e-8, "palObs", "6/W", status ); vvd ( p, 0.5530735081550342238, 1e-10, "palObs", "6/P", status ); vvd ( h, 2608, 1e-10, "palObs", "6/H", status ); viv( lstat, 0, "palObs", "retval", status ); } static void t_pa( int *status ) { vvd ( palPa ( -1.567, 1.5123, 0.987 ), -1.486288540423851, 1e-12, "palPa", " ", status ); vvd ( palPa ( 0, 0.789, 0.789 ), 0, 0, "palPa", "zenith", status ); } static void t_pcd( int *status ) { double disco, x, y; disco = 178.585; x = 0.0123; y = -0.00987; palPcd ( disco, &x, &y ); vvd ( x, 0.01284630845735895, 1e-14, "palPcd", "x", status ); vvd ( y, -0.01030837922553926, 1e-14, "palPcd", "y", status ); palUnpcd ( disco, &x, &y ); vvd ( x, 0.0123, 1e-14, "palUnpcd", "x", status ); vvd ( y, -0.00987, 1e-14, "palUnpcd", "y,", status ); /* Now negative disco round trip */ disco = -0.3333333; x = 0.0123; y = -0.00987; palPcd ( disco, &x, &y ); palUnpcd ( disco, &x, &y ); vvd ( x, 0.0123, 1e-14, "palUnpcd", "x", status ); vvd ( y, -0.00987, 1e-14, "palUnpcd", "y,", status ); } static void t_planet( int * status ) { int j; double pv[6]; double u[13]; double expected1[6] = { 0., 0., 0., 0., 0., 0. }; double expectedue1[13] = { 1.000878908362435284, -0.3336263027874777288, 50000., 2.840425801310305210, 0.1264380368035014224, -0.2287711835229143197, -0.01301062595106185195, 0.5657102158104651697, 0.2189745287281794885, 2.852427310959998500, -0.01552349065435120900, 50000., 0.0 }; double expectedue2[13] = { 1.00006, -4.856142884511782, 50000., 0.3, -0.2, 0.1, -0.4520378601821727, 0.4018114312730424, -.3515850023639121, 0.3741657386773941, -0.2511321445456515, 50000., 0. }; double expectedue3[13] = { 1.000000000000000, -0.3329769417028020949, 50100., 2.638884303608524597, 1.070994304747824305, 0.1544112080167568589, -0.2188240619161439344, 0.5207557453451906385, 0.2217782439275216936, 2.852118859689216658, 0.01452010174371893229, 50100., 0. }; double expectedpv[6] = { 0.07944764084631667011, -0.04118141077419014775, 0.002915180702063625400, -0.6890132370721108608e-6, 0.4326690733487621457e-6, -0.1763249096254134306e-6, }; double expectedpv2[6] = { 1.947628959288897677, -1.013736058752235271, -0.3536409947732733647, 2.742247411571786194e-8, 1.170467244079075911e-7, 3.709878268217564005e-8 }; double ra,dec,diam, r; int jform; double epoch, orbinc, anode, perih, aorq, e, aorl, dm; /* palEl2ue */ palEl2ue ( 50000, 1, 49000, 0.1, 2, 0.2, 3, 0.05, 3, 0.003312, u, &j ); vvec( 13, u, expectedue1, "palEl2ue", status ); viv ( j, 0, "palEl2ue", "J", status ); /* palPertel */ palPertel ( 2, 43000., 43200., 43000., 0.2, 3, 4, 5, 0.02, 6, &epoch, &orbinc, &anode, &perih, &aorq, &e, &aorl, &j ); vvd ( epoch, 43200., 1e-10, "palPertel", "EPOCH", status ); vvd ( orbinc, 0.1995661466545422381, 1e-7, "palPertel", "ORBINC", status ); vvd ( anode, 2.998052737821591215, 1e-7, "palPertel", "ANODE", status ); vvd ( perih, 4.009516448441143636, 1e-6, "palPertel", "PERIH", status ); vvd ( aorq, 5.014216294790922323, 1e-7, "palPertel", "AORQ", status ); vvd ( e, 0.02281386258309823607, 1e-7, "palPertel", "E", status ); vvd ( aorl, 0.01735248648779583748, 1e-6, "palPertel", "AORL", status ); viv ( j, 0, "palPertel", "J", status ); /* palPertue */ palPertue ( 50100, u, &j ); vvec( 13, u, expectedue3, "palPertue", status ); viv ( j, 0, "palPertue", "J", status ); /* palPlanel */ palPlanel ( 50600, 2, 50500, 0.1, 3, 5, 2, 0.3, 4, 0, pv, &j ); vvec( 6, pv, expectedpv2, "palPlanel", status ); viv ( j, 0, "palPlanel", "J", status ); /* palPlanet */ palPlanet( 1e6, 0, pv, &j ); vvec( 6, pv, expected1, "palPlanet 1", status ); viv ( j, -1, "palPlanet", "J 1", status ); palPlanet( 1e6, 9, pv, &j); viv ( j, -1, "palPlanet", "J 2", status ); palPlanet ( -320000, 3, pv, &j ); vvd ( pv[0], 0.9308038666827242603, 1e-11, "palPlanet", "pv[0] 3", status ); vvd ( pv[1], 0.3258319040252137618, 1e-11, "palPlanet", "pv[1] 3", status ); vvd ( pv[2], 0.1422794544477122021, 1e-11, "palPlanet", "pv[2] 3", status ); vvd ( pv[3], -7.441503423889371696e-8, 1e-17, "palPlanet", "pv[3] 3", status ); vvd ( pv[4], 1.699734557528650689e-7, 1e-17, "palPlanet", "pv[4] 3", status ); vvd ( pv[5], 7.415505123001430864e-8, 1e-17, "palPlanet", "pv[5] 3", status ); viv ( j, 1, "palPlanet", "J 3", status ); palPlanet ( 43999.9, 1, pv, &j ); vvd ( pv[0], 0.2945293959257422246, 1e-11, "palPlanet", "pv[0] 4", status ); vvd ( pv[1], -0.2452204176601052181, 1e-11, "palPlanet", "pv[1] 4", status ); vvd ( pv[2], -0.1615427700571978643, 1e-11, "palPlanet", "pv[2] 4", status ); vvd ( pv[3], 1.636421147459047057e-7, 1e-18, "palPlanet", "pv[3] 4", status ); vvd ( pv[4], 2.252949422574889753e-7, 1e-18, "palPlanet", "pv[4] 4", status ); vvd ( pv[5], 1.033542799062371839e-7, 1e-18, "palPlanet", "pv[5] 4", status ); viv ( j, 0, "palPlanet", "J 4", status ); /* palPlante test would go here */ palPlante ( 50600., -1.23, 0.456, 2, 50500., 0.1, 3., 5., 2., 0.3, 4., 0., &ra, &dec, &r, &j ); vvd ( ra, 6.222958101333794007, 1e-6, "palPlante", "RA", status ); vvd ( dec, 0.01142220305739771601, 1e-6, "palPlante", "DEC", status ); vvd ( r, 2.288902494080167624, 1e-8, "palPlante", "R", status ); viv ( j, 0, "palPlante", "J", status ); u[0] = 1.0005; u[1] = -0.3; u[2] = 55000.; u[3] = 2.8; u[4] = 0.1; u[5] = -0.2; u[6] = -0.01; u[7] = 0.5; u[8] = 0.22; u[9] = 2.8; u[10] = -0.015; u[11] = 55001.; u[12] = 0; /* palPlantu */ palPlantu ( 55001., -1.23, 0.456, u, &ra, &dec, &r, &j ); vvd ( ra, 0.3531814831241686647, 1e-6, "palPlantu", "RA", status ); vvd ( dec, 0.06940344580567131328, 1e-6, "palPlantu", "DEC", status ); vvd ( r, 3.031687170873274464, 1e-8, "palPlantu", "R", status ); viv ( j, 0, "palPlantu", "J", status ); /* palPv2el */ pv[0] = 0.3; pv[1] = -0.2; pv[2] = 0.1; pv[3] = -0.9e-7; pv[4] = 0.8e-7; pv[5] = -0.7e-7; palPv2el ( pv, 50000, 0.00006, 1, &jform, &epoch, &orbinc, &anode, &perih, &aorq, &e, &aorl, &dm, &j ); viv ( jform, 1, "palPv2el", "JFORM", status ); vvd ( epoch, 50000, 1e-10, "palPv2el", "EPOCH", status ); vvd ( orbinc, 1.52099895268912, 1e-12, "palPv2el", "ORBINC", status ); vvd ( anode, 2.720503180538650, 1e-12, "palPv2el", "ANODE", status ); vvd ( perih, 2.194081512031836, 1e-12, "palPv2el", "PERIH", status ); vvd ( aorq, 0.2059371035373771, 1e-12, "palPv2el", "AORQ", status ); vvd ( e, 0.9866822985810528, 1e-12, "palPv2el", "E", status ); vvd ( aorl, 0.2012758344836794, 1e-12, "palPv2el", "AORL", status ); vvd ( dm, 0.1840740507951820, 1e-12, "palPv2el", "DM", status ); viv ( j, 0, "palPv2el", "J", status ); /* palPv2ue */ palPv2ue ( pv, 50000., 0.00006, u, &j ); vvec( 13, u, expectedue2, "palPv2ue", status ); viv ( j, 0, "palPv2ue", "J", status ); /* Planets */ palRdplan ( 40999.9, 0, 0.1, -0.9, &ra, &dec, &diam ); vvd ( ra, 5.772270359389275837, 1e-6, "palRdplan", "ra 0", status ); vvd ( dec, -0.2089207338795416192, 1e-7, "palRdplan", "dec 0", status ); vvd ( diam, 9.415338935229717875e-3, 1e-10, "palRdplan", "diam 0", status ); palRdplan ( 41999.9, 1, 1.1, -0.9, &ra, &dec, &diam ); vvd ( ra, 3.866363420052936653, 1e-6, "palRdplan", "ra 1", status ); vvd ( dec, -0.2594430577550113130, 1e-7, "palRdplan", "dec 1", status ); vvd ( diam, 4.638468996795023071e-5, 1e-14, "palRdplan", "diam 1", status ); palRdplan ( 42999.9, 2, 2.1, 0.9, &ra, &dec, &diam ); vvd ( ra, 2.695383203184077378, 1e-6, "palRdplan", "ra 2", status ); vvd ( dec, 0.2124044506294805126, 1e-7, "palRdplan", "dec 2", status ); vvd ( diam, 4.892222838681000389e-5, 1e-14, "palRdplan", "diam 2", status ); palRdplan ( 43999.9, 3, 3.1, 0.9, &ra, &dec, &diam ); vvd ( ra, 2.908326678461540165, 1e-7, "palRdplan", "ra 3", status ); vvd ( dec, 0.08729783126905579385, 1e-7, "palRdplan", "dec 3", status ); vvd ( diam, 8.581305866034962476e-3, 1e-7, "palRdplan", "diam 3", status ); palRdplan ( 44999.9, 4, -0.1, 1.1, &ra, &dec, &diam ); vvd ( ra, 3.429840787472851721, 1e-6, "palRdplan", "ra 4", status ); vvd ( dec, -0.06979851055261161013, 1e-7, "palRdplan", "dec 4", status ); vvd ( diam, 4.540536678439300199e-5, 1e-14, "palRdplan", "diam 4", status ); palRdplan ( 45999.9, 5, -1.1, 0.1, &ra, &dec, &diam ); vvd ( ra, 4.864669466449422548, 1e-6, "palRdplan", "ra 5", status ); vvd ( dec, -0.4077714497908953354, 1e-7, "palRdplan", "dec 5", status ); vvd ( diam, 1.727945579027815576e-4, 1e-14, "palRdplan", "diam 5", status ); palRdplan ( 46999.9, 6, -2.1, -0.1, &ra, &dec, &diam ); vvd ( ra, 4.432929829176388766, 1e-6, "palRdplan", "ra 6", status ); vvd ( dec, -0.3682820877854730530, 1e-7, "palRdplan", "dec 6", status ); vvd ( diam, 8.670829016099083311e-5, 1e-14, "palRdplan", "diam 6", status ); palRdplan ( 47999.9, 7, -3.1, -1.1, &ra, &dec, &diam ); vvd ( ra, 4.894972492286818487, 1e-6, "palRdplan", "ra 7", status ); vvd ( dec, -0.4084068901053653125, 1e-7, "palRdplan", "dec 7", status ); vvd ( diam, 1.793916783975974163e-5, 1e-14, "palRdplan", "diam 7", status ); palRdplan ( 48999.9, 8, 0, 0, &ra, &dec, &diam ); vvd ( ra, 5.066050284760144000, 1e-6, "palRdplan", "ra 8", status ); vvd ( dec, -0.3744690779683850609, 1e-7, "palRdplan", "dec 8", status ); vvd ( diam, 1.062210086082700563e-5, 1e-14, "palRdplan", "diam 8", status ); /* palUe2el */ palUe2el ( u, 1, &jform, &epoch, &orbinc, &anode, &perih, &aorq, &e, &aorl, &dm, &j ); viv ( jform, 1, "palUe2el", "JFORM", status ); vvd ( epoch, 50000.00000000000, 1e-10, "palUe2el", "EPOCH", status ); vvd ( orbinc, 1.520998952689120, 1e-12, "palUe2el", "ORBINC", status ); vvd ( anode, 2.720503180538650, 1e-12, "palUe2el", "ANODE", status ); vvd ( perih, 2.194081512031836, 1e-12, "palUe2el", "PERIH", status ); vvd ( aorq, 0.2059371035373771, 1e-12, "palUe2el", "AORQ", status ); vvd ( e, 0.9866822985810528, 1e-12, "palUe2el", "E", status ); vvd ( aorl, 0.2012758344836794, 1e-12, "palUe2el", "AORL", status ); viv ( j, 0, "palUe2el", "J", status ); /* palUe2pv */ palUe2pv( 50010., u, pv, &j ); /* Update the final two elements of the expecte UE array */ expectedue2[11] = 50010.; expectedue2[12] = 0.7194308220038886856; vvec( 13, u, expectedue2, "palUe2pv", status ); vvec( 6, pv, expectedpv, "palUe2pv", status ); viv ( j, 0, "palUe2pv", "J", status ); } static void t_pm( int * status ) { double ra2, dec2; double ra1, dec1, pmr1, pmd1, px1, rv1; ra1 = 5.43; dec1 = -0.87; pmr1 = -0.33e-5; pmd1 = 0.77e-5; px1 = 0.7; rv1 = 50.3*365.2422/365.25; palPm ( ra1, dec1, pmr1, pmd1, px1, rv1, 1899, 1943, &ra2, &dec2 ); vvd ( ra2, 5.429855087793875, 1e-10, "palPm", "R", status ); vvd ( dec2, -0.8696617307805072, 1e-10, "palPm", "D", status ); /* SOFA/ERFA test */ ra1 = 0.01686756; dec1 = -1.093989828; pmr1 = -1.78323516e-5; pmd1 = 2.336024047e-6; px1 = 0.74723; rv1 = -21.6; palPm(ra1, dec1, pmr1, pmd1, px1, rv1, palEpj(50083.0), palEpj(53736.0), &ra2, &dec2); vvd(ra2, 0.01668919069414242368, 1e-13, "palPm", "ra", status); vvd(dec2, -1.093966454217127879, 1e-13, "palPm", "dec", status); } static void t_polmo( int *status ) { double elong, phi, daz; palPolmo( 0.7, -0.5, 1.0e-6, -2.0e-6, &elong, &phi, &daz ); vvd(elong, 0.7000004837322044, 1.0e-12, "palPolmo", "elong", status ); vvd(phi, -0.4999979467222241, 1.0e-12, "palPolmo", "phi", status ); vvd(daz, 1.008982781275728e-6, 1.0e-12, "palPolmo", "daz", status ); } static void t_pvobs( int *status ) { double pv[6]; double expected[6] = { -4.7683600138836167813e-06, 1.0419056712717953176e-05, 4.099831053320363277e-05, -7.5976959740661272483e-10, -3.4771429582640930371e-10, 0.0}; palPvobs( 1.3, 10000.0, 2.0, pv ); vvec( 6, pv, expected, "palPvobs", status ); } static void t_rv( int *status ) { vvd ( palRverot ( -0.777, 5.67, -0.3, 3.19 ), -0.1948098355075913, 1e-6, "palRverot", " ", status ); vvd ( palRvgalc ( 1.11E0, -0.99E0 ), 158.9630759840254, 1e-3, "palRvgalc", " ", status ); vvd ( palRvlg ( 3.97E0, 1.09E0 ), -197.818762175363, 1e-3, "palRvlg", " ", status ); vvd ( palRvlsrd ( 6.01E0, 0.1E0 ), -4.082811335150567, 1e-4, "palRvlsrd", " ", status ); vvd ( palRvlsrk ( 6.01E0, 0.1E0 ), -5.925180579830265, 1e-4, "palRvlsrk", " ", status ); } static void t_rvgalc( int *status ) { double rv; rv = palRvgalc( 2.7, -1.0 ); vvd( rv, 213.98084425751144977, 1.0E-12, "palRvgalc", "rv", status ); } static void t_rvlg( int *status ) { double rv; rv = palRvlg( 2.7, -1.0 ); vvd( rv, 291.79205281252404802, 1.0E-12, "palRvlg", "rv", status ); } static void t_rvlsrd( int *status ) { double rv; rv = palRvlsrd( 2.7, -1.0 ); vvd( rv, 9.620674692097630043, 1.0E-12, "palRvlsrd", "rv", status ); } static void t_rvlsrk( int *status ) { double rv; rv = palRvlsrk( 2.7, -1.0 ); vvd( rv, 12.556356851411955233, 1.0E-12, "palRvlsrk", "rv", status ); } static void t_refco( int *status ) { double phpa, tc, rh, wl, refa, refb; phpa = 800.0; tc = 10.0 + 273.15; /* SLA uses kelvin */ rh = 0.9; wl = 0.4; palRefcoq(tc, phpa, rh, wl, &refa, &refb); vvd(refa, 0.2264949956241415009e-3, 1e-15, "palRefcoq", "refa", status); vvd(refb, -0.2598658261729343970e-6, 1e-18, "palRefcoq", "refb", status); } static void t_ref( int *status ) { double ref, refa, refb, refa2, refb2, vu[3], vr[3], zr; palRefro( 1.4, 3456.7, 280, 678.9, 0.9, 0.55, -0.3, 0.006, 1e-9, &ref ); vvd( ref, 0.00106715763018568, 1e-12, "palRefro", "o", status ); palRefro( 1.4, 3456.7, 280, 678.9, 0.9, 1000, -0.3, 0.006, 1e-9, &ref ); vvd( ref, 0.001296416185295403, 1e-12, "palRefro", "r", status ); palRefcoq( 275.9, 709.3, 0.9, 101, &refa, &refb ); vvd( refa, 2.324736903790639e-4, 1e-12, "palRefcoq", "a/r", status ); vvd( refb, -2.442884551059e-7, 1e-15, "palRefcoq", "b/r", status ); palRefco( 2111.1, 275.9, 709.3, 0.9, 101, -1.03, 0.0067, 1e-12, &refa, &refb ); vvd( refa, 2.324673985217244e-4, 1e-12, "palRefco", "a/r", status ); vvd( refb, -2.265040682496e-7, 1e-15, "palRefco", "b/r", status ); palRefcoq( 275.9, 709.3, 0.9, 0.77, &refa, &refb ); vvd( refa, 2.007406521596588e-4, 1e-12, "palRefcoq", "a", status ); vvd( refb, -2.264210092590e-7, 1e-15, "palRefcoq", "b", status ); palRefco( 2111.1, 275.9, 709.3, 0.9, 0.77, -1.03, 0.0067, 1e-12, &refa, &refb ); vvd( refa, 2.007202720084551e-4, 1e-12, "palRefco", "a", status ); vvd( refb, -2.223037748876e-7, 1e-15, "palRefco", "b", status ); palAtmdsp ( 275.9, 709.3, 0.9, 0.77, refa, refb, 0.5, &refa2, &refb2 ); vvd ( refa2, 2.034523658888048e-4, 1e-12, "palAtmdsp", "a", status ); vvd ( refb2, -2.250855362179e-7, 1e-15, "palAtmdsp", "b", status ); palDcs2c ( 0.345, 0.456, vu ); palRefv ( vu, refa, refb, vr ); vvd ( vr[0], 0.8447487047790478, 1e-12, "palRefv", "x1", status ); vvd ( vr[1], 0.3035794890562339, 1e-12, "palRefv", "y1", status ); vvd ( vr[2], 0.4407256738589851, 1e-12, "palRefv", "z1", status ); palDcs2c ( 3.7, 0.03, vu ); palRefv ( vu, refa, refb, vr ); vvd ( vr[0], -0.8476187691681673, 1e-12, "palRefv", "x2", status ); vvd ( vr[1], -0.5295354802804889, 1e-12, "palRefv", "y2", status ); vvd ( vr[2], 0.0322914582168426, 1e-12, "palRefv", "z2", status ); palRefz ( 0.567, refa, refb, &zr ); vvd ( zr, 0.566872285910534, 1e-12, "palRefz", "hi el", status ); palRefz ( 1.55, refa, refb, &zr ); vvd ( zr, 1.545697350690958, 1e-12, "palRefz", "lo el", status ); } static void t_vers( int *status ) { char verstring[32]; int ver = palVers( verstring, sizeof(verstring)); printf("PAL Version %s (%d)\n", verstring, ver); if ( ver < 6000 ) { *status = 1; /* palVers introduced at v0.6.0 */ } } /**********************************************************************/ int main (void) { /* Use the SLA and SOFA/ERFA conventions */ int status = 0; /* Unix and SAE convention */ t_addet(&status); t_afin(&status); t_altaz(&status); t_ampqk(&status); t_aop(&status); t_airmas(&status); t_amp(&status); t_bear(&status); t_caf2r(&status); t_caldj(&status); t_cc2s(&status); t_cd2tf(&status); t_cldj(&status); t_cr2af(&status); t_cr2tf(&status); t_ctf2d(&status); t_ctf2r(&status); t_dat(&status); t_djcal(&status); t_dmat(&status); t_epb(&status); t_epb2d(&status); t_epco(&status); t_epj(&status); t_epj2d(&status); t_eqecl(&status); t_eqeqx(&status); t_etrms(&status); t_eqgal(&status); t_evp(&status); t_fk45z(&status); t_fk54z(&status); t_fk524(&status); t_flotin(&status); t_galeq(&status); t_galsup(&status); t_ge50(&status); t_geoc(&status); t_gmst(&status); t_fk52h(&status); t_intin(&status); t_prec(&status); t_preces(&status); t_ecleq(&status); t_ecmat(&status); t_e2h(&status); t_map(&status); t_mappa(&status); t_mapqk(&status); t_mapqkz(&status); t_moon(&status); t_nut(&status); t_obs(&status); t_pa(&status); t_pcd(&status); t_planet(&status); t_pm(&status); t_polmo(&status); t_prebn(&status); t_pvobs(&status); t_range(&status); t_ranorm(&status); t_ref(&status); t_refco(&status); t_rv(&status); t_rvgalc(&status); t_rvlg(&status); t_rvlsrd(&status); t_rvlsrk(&status); t_sep(&status); t_supgal(&status); t_tp(&status); t_vecmat(&status); t_vers(&status); return status; } pal-0.9.7/palUe2el.c000066400000000000000000000217731302604645500141370ustar00rootroot00000000000000/* *+ * Name: * palUe2el * Purpose: * Universal elements to heliocentric osculating elements * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palUe2el ( const double u[13], int jformr, * int *jform, double *epoch, double *orbinc, * double *anode, double *perih, double *aorq, double *e, * double *aorl, double *dm, int *jstat ); * Arguments: * u = const double [13] (Given) * Universal orbital elements (Note 1) * (0) combined mass (M+m) * (1) total energy of the orbit (alpha) * (2) reference (osculating) epoch (t0) * (3-5) position at reference epoch (r0) * (6-8) velocity at reference epoch (v0) * (9) heliocentric distance at reference epoch * (10) r0.v0 * (11) date (t) * (12) universal eccentric anomaly (psi) of date, approx * jformr = int (Given) * Requested element set (1-3; Note 3) * jform = int * (Returned) * Element set actually returned (1-3; Note 4) * epoch = double * (Returned) * Epoch of elements (TT MJD) * orbinc = double * (Returned) * inclination (radians) * anode = double * (Returned) * longitude of the ascending node (radians) * perih = double * (Returned) * longitude or argument of perihelion (radians) * aorq = double * (Returned) * mean distance or perihelion distance (AU) * e = double * (Returned) * eccentricity * aorl = double * (Returned) * mean anomaly or longitude (radians, JFORM=1,2 only) * dm = double * (Returned) * daily motion (radians, JFORM=1 only) * jstat = int * (Returned) * status: 0 = OK * -1 = illegal combined mass * -2 = illegal JFORMR * -3 = position/velocity out of range * Description: * Transform universal elements into conventional heliocentric * osculating elements. * Authors: * PTW: Patrick T. Wallace * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - The "universal" elements are those which define the orbit for the * purposes of the method of universal variables (see reference 2). * They consist of the combined mass of the two bodies, an epoch, * and the position and velocity vectors (arbitrary reference frame) * at that epoch. The parameter set used here includes also various * quantities that can, in fact, be derived from the other * information. This approach is taken to avoiding unnecessary * computation and loss of accuracy. The supplementary quantities * are (i) alpha, which is proportional to the total energy of the * orbit, (ii) the heliocentric distance at epoch, (iii) the * outwards component of the velocity at the given epoch, (iv) an * estimate of psi, the "universal eccentric anomaly" at a given * date and (v) that date. * - The universal elements are with respect to the mean equator and * equinox of epoch J2000. The orbital elements produced are with * respect to the J2000 ecliptic and mean equinox. * - Three different element-format options are supported: * * Option JFORM=1, suitable for the major planets: * * EPOCH = epoch of elements (TT MJD) * ORBINC = inclination i (radians) * ANODE = longitude of the ascending node, big omega (radians) * PERIH = longitude of perihelion, curly pi (radians) * AORQ = mean distance, a (AU) * E = eccentricity, e * AORL = mean longitude L (radians) * DM = daily motion (radians) * * Option JFORM=2, suitable for minor planets: * * EPOCH = epoch of elements (TT MJD) * ORBINC = inclination i (radians) * ANODE = longitude of the ascending node, big omega (radians) * PERIH = argument of perihelion, little omega (radians) * AORQ = mean distance, a (AU) * E = eccentricity, e * AORL = mean anomaly M (radians) * * Option JFORM=3, suitable for comets: * * EPOCH = epoch of perihelion (TT MJD) * ORBINC = inclination i (radians) * ANODE = longitude of the ascending node, big omega (radians) * PERIH = argument of perihelion, little omega (radians) * AORQ = perihelion distance, q (AU) * E = eccentricity, e * * - It may not be possible to generate elements in the form * requested through JFORMR. The caller is notified of the form * of elements actually returned by means of the JFORM argument: * * JFORMR JFORM meaning * * 1 1 OK - elements are in the requested format * 1 2 never happens * 1 3 orbit not elliptical * * 2 1 never happens * 2 2 OK - elements are in the requested format * 2 3 orbit not elliptical * * 3 1 never happens * 3 2 never happens * 3 3 OK - elements are in the requested format * * - The arguments returned for each value of JFORM (cf Note 6: JFORM * may not be the same as JFORMR) are as follows: * * JFORM 1 2 3 * EPOCH t0 t0 T * ORBINC i i i * ANODE Omega Omega Omega * PERIH curly pi omega omega * AORQ a a q * E e e e * AORL L M - * DM n - - * * where: * * t0 is the epoch of the elements (MJD, TT) * T " epoch of perihelion (MJD, TT) * i " inclination (radians) * Omega " longitude of the ascending node (radians) * curly pi " longitude of perihelion (radians) * omega " argument of perihelion (radians) * a " mean distance (AU) * q " perihelion distance (AU) * e " eccentricity * L " longitude (radians, 0-2pi) * M " mean anomaly (radians, 0-2pi) * n " daily motion (radians) * - means no value is set * * - At very small inclinations, the longitude of the ascending node * ANODE becomes indeterminate and under some circumstances may be * set arbitrarily to zero. Similarly, if the orbit is close to * circular, the true anomaly becomes indeterminate and under some * circumstances may be set arbitrarily to zero. In such cases, * the other elements are automatically adjusted to compensate, * and so the elements remain a valid description of the orbit. * See Also: * - Sterne, Theodore E., "An Introduction to Celestial Mechanics", * Interscience Publishers Inc., 1960. Section 6.7, p199. * - Everhart, E. & Pitkin, E.T., Am.J.Phys. 51, 712, 1983. * History: * 2012-03-09 (TIMJ): * Initial version * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 1999 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include "pal.h" #include "palmac.h" void palUe2el ( const double u[], int jformr, int *jform, double *epoch, double *orbinc, double *anode, double *perih, double *aorq, double *e, double *aorl, double *dm, int *jstat ) { /* Canonical days to seconds */ const double CD2S = PAL__GCON / PAL__SPD; int i; double pmass, date, pv[6]; /* Unpack the universal elements */ pmass = u[0] - 1.0; date = u[2]; for (i=0; i<3; i++) { pv[i] = u[i+3]; pv[i+3] = u[i+6] * CD2S; } /* Convert the position and velocity etc into conventional elements */ palPv2el( pv, date, pmass, jformr, jform, epoch, orbinc, anode, perih, aorq, e, aorl, dm, jstat ); } pal-0.9.7/palUe2pv.c000066400000000000000000000205541302604645500141600ustar00rootroot00000000000000/* *+ * Name: * palUe2pv * Purpose: * Heliocentric position and velocity of a planet, asteroid or comet, from universal elements * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * void palUe2pv( double date, double u[13], double pv[6], int *jstat ); * Arguments: * date = double (Given) * TT Modified Julian date (JD-2400000.5). * u = double [13] (Given & Returned) * Universal orbital elements (updated, see note 1) * given (0) combined mass (M+m) * " (1) total energy of the orbit (alpha) * " (2) reference (osculating) epoch (t0) * " (3-5) position at reference epoch (r0) * " (6-8) velocity at reference epoch (v0) * " (9) heliocentric distance at reference epoch * " (10) r0.v0 * returned (11) date (t) * " (12) universal eccentric anomaly (psi) of date * pv = double [6] (Returned) * Position (AU) and velocity (AU/s) * jstat = int * (Returned) * status: 0 = OK * -1 = radius vector zero * -2 = failed to converge * Description: * Heliocentric position and velocity of a planet, asteroid or comet, * starting from orbital elements in the "universal variables" form. * Authors: * PTW: Pat Wallace (STFC) * TIMJ: Tim Jenness (JAC, Hawaii) * {enter_new_authors_here} * Notes: * - The "universal" elements are those which define the orbit for the * purposes of the method of universal variables (see reference). * They consist of the combined mass of the two bodies, an epoch, * and the position and velocity vectors (arbitrary reference frame) * at that epoch. The parameter set used here includes also various * quantities that can, in fact, be derived from the other * information. This approach is taken to avoiding unnecessary * computation and loss of accuracy. The supplementary quantities * are (i) alpha, which is proportional to the total energy of the * orbit, (ii) the heliocentric distance at epoch, (iii) the * outwards component of the velocity at the given epoch, (iv) an * estimate of psi, the "universal eccentric anomaly" at a given * date and (v) that date. * - The companion routine is palEl2ue. This takes the conventional * orbital elements and transforms them into the set of numbers * needed by the present routine. A single prediction requires one * one call to palEl2ue followed by one call to the present routine; * for convenience, the two calls are packaged as the routine * palPlanel. Multiple predictions may be made by again * calling palEl2ue once, but then calling the present routine * multiple times, which is faster than multiple calls to palPlanel. * - It is not obligatory to use palEl2ue to obtain the parameters. * However, it should be noted that because palEl2ue performs its * own validation, no checks on the contents of the array U are made * by the present routine. * - DATE is the instant for which the prediction is required. It is * in the TT timescale (formerly Ephemeris Time, ET) and is a * Modified Julian Date (JD-2400000.5). * - The universal elements supplied in the array U are in canonical * units (solar masses, AU and canonical days). The position and * velocity are not sensitive to the choice of reference frame. The * palEl2ue routine in fact produces coordinates with respect to the * J2000 equator and equinox. * - The algorithm was originally adapted from the EPHSLA program of * D.H.P.Jones (private communication, 1996). The method is based * on Stumpff's Universal Variables. * - Reference: Everhart, E. & Pitkin, E.T., Am.J.Phys. 51, 712, 1983. * History: * 2012-03-09 (TIMJ): * Initial version cloned from SLA/F. * Adapted with permission from the Fortran SLALIB library. * {enter_further_changes_here} * Copyright: * Copyright (C) 2005 Rutherford Appleton Laboratory * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * 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, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * Bugs: * {note_any_bugs_here} *- */ #include #include "pal.h" #include "palmac.h" void palUe2pv( double date, double u[13], double pv[6], int *jstat ) { /* Canonical days to seconds */ const double CD2S = PAL__GCON / PAL__SPD; /* Test value for solution and maximum number of iterations */ const double TEST = 1e-13; const int NITMAX = 25; int I, NIT, N; double CM,ALPHA,T0,P0[3],V0[3],R0,SIGMA0,T,PSI,DT,W, TOL,PSJ,PSJ2,BETA,S0,S1,S2,S3, FF,R,F,G,FD,GD; double PLAST = 0.0; double FLAST = 0.0; /* Unpack the parameters. */ CM = u[0]; ALPHA = u[1]; T0 = u[2]; for (I=0; I<3; I++) { P0[I] = u[I+3]; V0[I] = u[I+6]; } R0 = u[9]; SIGMA0 = u[10]; T = u[11]; PSI = u[12]; /* Approximately update the universal eccentric anomaly. */ PSI = PSI+(date-T)*PAL__GCON/R0; /* Time from reference epoch to date (in Canonical Days: a canonical * day is 58.1324409... days, defined as 1/PAL__GCON). */ DT = (date-T0)*PAL__GCON; /* Refine the universal eccentric anomaly, psi. */ NIT = 1; W = 1.0; TOL = 0.0; while (fabs(W) >= TOL) { /* Form half angles until BETA small enough. */ N = 0; PSJ = PSI; PSJ2 = PSJ*PSJ; BETA = ALPHA*PSJ2; while (fabs(BETA) > 0.7) { N = N+1; BETA = BETA/4.0; PSJ = PSJ/2.0; PSJ2 = PSJ2/4.0; } /* Calculate Universal Variables S0,S1,S2,S3 by nested series. */ S3 = PSJ*PSJ2*((((((BETA/210.0+1.0) *BETA/156.0+1.0) *BETA/110.0+1.0) *BETA/72.0+1.0) *BETA/42.0+1.0) *BETA/20.0+1.0)/6.0; S2 = PSJ2*((((((BETA/182.0+1.0) *BETA/132.0+1.0) *BETA/90.0+1.0) *BETA/56.0+1.0) *BETA/30.0+1.0) *BETA/12.0+1.0)/2.0; S1 = PSJ+ALPHA*S3; S0 = 1.0+ALPHA*S2; /* Undo the angle-halving. */ TOL = TEST; while (N > 0) { S3 = 2.0*(S0*S3+PSJ*S2); S2 = 2.0*S1*S1; S1 = 2.0*S0*S1; S0 = 2.0*S0*S0-1.0; PSJ = PSJ+PSJ; TOL += TOL; N--; } /* Values of F and F' corresponding to the current value of psi. */ FF = R0*S1+SIGMA0*S2+CM*S3-DT; R = R0*S0+SIGMA0*S1+CM*S2; /* If first iteration, create dummy "last F". */ if ( NIT == 1) FLAST = FF; /* Check for sign change. */ if ( FF*FLAST < 0.0 ) { /* Sign change: get psi adjustment using secant method. */ W = FF*(PLAST-PSI)/(FLAST-FF); } else { /* No sign change: use Newton-Raphson method instead. */ if (R == 0.0) { /* Null radius vector */ *jstat = -1; return; } W = FF/R; } /* Save the last psi and F values. */ PLAST = PSI; FLAST = FF; /* Apply the Newton-Raphson or secant adjustment to psi. */ PSI = PSI-W; /* Next iteration, unless too many already. */ if (NIT > NITMAX) { *jstat = -2; /* Failed to converge */ return; } NIT++; } /* Project the position and velocity vectors (scaling velocity to AU/s). */ W = CM*S2; F = 1.0-W/R0; G = DT-CM*S3; FD = -CM*S1/(R0*R); GD = 1.0-W/R; for (I=0; I<3; I++) { pv[I] = P0[I]*F+V0[I]*G; pv[I+3] = CD2S*(P0[I]*FD+V0[I]*GD); } /* Update the parameters to allow speedy prediction of PSI next time. */ u[11] = date; u[12] = PSI; /* OK exit. */ *jstat = 0; return; } pal-0.9.7/palUnpcd.c000066400000000000000000000112431302604645500142230ustar00rootroot00000000000000/* *+ * Name: * palUnpcd * Purpose: * Remove pincushion/barrel distortion * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * palUnpcd( double disco, double * x, double * y ); * Arguments: * disco = double (Given) * Pincushion/barrel distortion coefficient. * x = double * (Given & Returned) * On input the distorted X coordinate, on output * the tangent-plane X coordinate. * y = double * (Given & Returned) * On input the distorted Y coordinate, on output * the tangent-plane Y coordinate. * Description: * Remove pincushion/barrel distortion from a distorted [x,y] to give * tangent-plane [x,y]. * Authors: * PTW: Pat Wallace (RAL) * TIMJ: Tim Jenness * {enter_new_authors_here} * Notes: * - The distortion is of the form RP = R*(1+C*R^2), where R is * the radial distance from the tangent point, C is the DISCO * argument, and RP is the radial distance in the presence of * the distortion. * * - For pincushion distortion, C is +ve; for barrel distortion, * C is -ve. * * - For X,Y in "radians" - units of one projection radius, * which in the case of a photograph is the focal length of * the camera - the following DISCO values apply: * * Geometry DISCO * * astrograph 0.0 * Schmidt -0.3333 * AAT PF doublet +147.069 * AAT PF triplet +178.585 * AAT f/8 +21.20 * JKT f/8 +13.32 * * - The present routine is a rigorous inverse of the companion * routine palPcd. The expression for RP in Note 1 is rewritten * in the form x^3+a*x+b=0 and solved by standard techniques. * * - Cases where the cubic has multiple real roots can sometimes * occur, corresponding to extreme instances of barrel distortion * where up to three different undistorted [X,Y]s all produce the * same distorted [X,Y]. However, only one solution is returned, * the one that produces the smallest change in [X,Y]. * See Also: * palPcd * History: * 2000-09-03 (PTW): * SLALIB implementation. * 2015-01-01 (TIMJ): * Initial version * {enter_further_changes_here} * Copyright: * Copyright (C) 2000 Rutherford Appleton Laboratory. * Copyright (C) 2015 Tim Jenness * All Rights Reserved. * Licence: * 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 . * Bugs: * {note_any_bugs_here} *- */ #if HAVE_CONFIG_H #include #endif #include #include "pal.h" #include "palmac.h" /* copysign is C99 */ #if HAVE_COPYSIGN # define COPYSIGN copysign #else # define COPYSIGN(a,b) DSIGN(a,b) #endif void palUnpcd( double disco, double * x, double *y ) { const double THIRD = 1.0/3.0; double rp,q,r,d,w,s,t,f,c,t3,f1,f2,f3,w1,w2,w3; double c2; /* Distance of the point from the origin. */ rp = sqrt( (*x)*(*x)+(*y)*(*y)); /* If zero, or if no distortion, no action is necessary. */ if (rp != 0.0 && disco != 0.0) { /* Begin algebraic solution. */ q = 1.0/(3.0*disco); r = rp/(2.0*disco); w = q*q*q+r*r; /* Continue if one real root, or three of which only one is positive. */ if (w > 0.0) { d = sqrt(w); w = r+d; s = COPYSIGN(pow(fabs(w),THIRD),w); w = r-d; t = COPYSIGN(pow(fabs(w),THIRD),w); f = s+t; } else { /* Three different real roots: use geometrical method instead. */ w = 2.0/sqrt(-3.0*disco); c = 4.0*rp/(disco*w*w*w); c2 = c*c; s = sqrt(1.0-DMIN(c2,1.0)); t3 = atan2(s,c); /* The three solutions. */ f1 = w*cos((PAL__D2PI-t3)/3.0); f2 = w*cos((t3)/3.0); f3 = w*cos((PAL__D2PI+t3)/3.0); /* Pick the one that moves [X,Y] least. */ w1 = fabs(f1-rp); w2 = fabs(f2-rp); w3 = fabs(f3-rp); if (w1 < w2) { f = ( w1 < w3 ? f1 : f3 ); } else { f = ( w2 < w3 ? f2 : f3 ); } } /* Remove the distortion. */ f = f/rp; *x *= f; *y *= f; } } pal-0.9.7/palVers.c000066400000000000000000000044511302604645500140740ustar00rootroot00000000000000/* *+ * Name: * palVers * Purpose: * Obtain PAL version number * Language: * Starlink ANSI C * Type of Module: * Library routine * Invocation: * int palVers( char *verstring, size_t verlen ); * Arguments: * verstring = char * (Returned) * Buffer to receive version string of the form "A.B.C". Can be NULL. * verlen = size_t (Given) * Allocated size of "verstring" including nul. Version string * will be truncated if it does not fit in buffer. * Returned Value: * vernum = int (Returned) * Version number as an integer. * Description: * Retrieve the PAL version number as a string in the form "A.B.C" * and as an integer (major*1e6+minor*1e3+release). * Authors: * TIMJ: Tim Jenness (Cornell) * {enter_new_authors_here} * Notes: * - Note that this API does not match the slaVers API. * History: * 2014-08-27 (TIMJ): * Initial version * {enter_further_changes_here} * Copyright: * Copyright (C) 2014 Cornell University * All Rights Reserved. * Licence: * 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 . * Bugs: * {note_any_bugs_here} *- */ #if HAVE_CONFIG_H # include #endif #ifdef HAVE_BSD_STRING_H #include #endif #include /* This version is just a straight copy without putting ellipsis on the end. */ static void my__strlcpy( char * dest, const char * src, size_t size ) { # if HAVE_STRLCPY strlcpy( dest, src, size ); # else strncpy( dest, src, size ); dest[size-1] = '\0'; # endif } int palVers( char *verstring, size_t verlen ) { if (verstring) my__strlcpy( verstring, PACKAGE_VERSION, verlen ); return PACKAGE_VERSION_INTEGER; } pal-0.9.7/palmac.h000066400000000000000000000102211302604645500137120ustar00rootroot00000000000000#ifndef PALMACDEF #define PALMACDEF /* *+ * Name: * palmac.h * Purpose: * Macros used by the PAL library * Language: * Starlink ANSI C * Type of Module: * Include file * Description: * A collection of useful macros provided and used by the PAL library * Authors: * TIMJ: Tim Jenness (JAC, Hawaii) * DSB: David Berry (JAC, Hawaii) * {enter_new_authors_here} * Notes: * * History: * 2012-02-08 (TIMJ): * Initial version. * Adapted with permission from the Fortran SLALIB library. * 2012-04-13 (DSB): * Added PAL__DR2H and PAL__DR2S * {enter_further_changes_here} * Copyright: * Copyright (C) 2012 Science and Technology Facilities Council. * All Rights Reserved. * Licence: * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * License along with this program. If not, see * . * Bugs: * {note_any_bugs_here} *- */ /* Pi */ static const double PAL__DPI = 3.1415926535897932384626433832795028841971693993751; /* 2Pi */ static const double PAL__D2PI = 6.2831853071795864769252867665590057683943387987502; /* pi/2: 90 degrees in radians */ static const double PAL__DPIBY2 = 1.5707963267948966192313216916397514420985846996876; /* pi/180: degrees to radians */ static const double PAL__DD2R = 0.017453292519943295769236907684886127134428718885417; /* Radians to arcseconds */ static const double PAL__DR2AS = 2.0626480624709635515647335733077861319665970087963e5; /* Arcseconds to radians */ static const double PAL__DAS2R = 4.8481368110953599358991410235794797595635330237270e-6; /* Radians to degrees */ static const double PAL__DR2D = 57.295779513082320876798154814105170332405472466564; /* Hours to radians */ static const double PAL__DH2R = 0.26179938779914943653855361527329190701643078328126; /* Radians to hours */ static const double PAL__DR2H = 3.8197186342054880584532103209403446888270314977709; /* Radians to seconds of time */ static const double PAL__DR2S = 1.3750987083139757010431557155385240879777313391975e4; /* Seconds of time to radians */ static const double PAL__DS2R = 7.272205216643039903848712e-5; /* Start of SLA modified Julian date epoch */ static const double PAL__MJD0 = 2400000.5; /* Light time for 1 AU (sec) */ static const double PAL__CR = 499.004782; /* Seconds per day */ static const double PAL__SPD = 86400.0; /* Km per sec to AU per tropical century = 86400 * 36524.2198782 / 149597870 */ static const double PAL__VF = 21.095; /* Radians per year to arcsec per century. This needs to be a macro since it is an expression including other constants. */ #define PAL__PMF (100.0*60.0*60.0*360.0/PAL__D2PI); /* Mean sidereal rate - the rotational angular velocity of Earth in radians/sec from IERS Conventions (2003). */ static const double PAL__SR = 7.2921150e-5; /* Gaussian gravitational constant (exact) */ static const double PAL__GCON = 0.01720209895; /* DINT(A) - truncate to nearest whole number towards zero (double) */ #define DINT(A) ((A)<0.0?ceil(A):floor(A)) /* DNINT(A) - round to nearest whole number (double) */ #define DNINT(A) ((A)<0.0?ceil((A)-0.5):floor((A)+0.5)) /* DMAX(A,B) - return maximum value - evaluates arguments multiple times */ #define DMAX(A,B) ((A) > (B) ? (A) : (B) ) /* DMIN(A,B) - return minimum value - evaluates arguments multiple times */ #define DMIN(A,B) ((A) < (B) ? (A) : (B) ) /* We actually prefer to use C99 copysign() but we define this here as a backup but it will not detect -0.0 so is not useful for palDfltin. */ /* DSIGN(A,B) - magnitude of A with sign of B (double) */ #define DSIGN(A,B) ((B)<0.0?-fabs(A):fabs(A)) #endif pal-0.9.7/pubs/000077500000000000000000000000001302604645500132615ustar00rootroot00000000000000pal-0.9.7/pubs/adass2012/000077500000000000000000000000001302604645500146615ustar00rootroot00000000000000pal-0.9.7/pubs/adass2012/P56.bib000066400000000000000000000101571302604645500157150ustar00rootroot00000000000000 @INPROCEEDINGS{1996ASPC..101..207W, author = {{Wallace}, P.~T.}, title = "{The IAU SOFA Initiative}", booktitle = {Astronomical Data Analysis Software and Systems V}, year = 1996, series = {Astronomical Society of the Pacific Conference Series}, volume = 101, editor = {{Jacoby}, G.~H. and {Barnes}, J.}, pages = {207}, publisher = "ASP", address = "San Francisco", adsurl = {http://adsabs.harvard.edu/abs/1996ASPC..101..207W}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{1994ASPC...61..481W, author = {{Wallace}, P.~T.}, title = "{The SLALIB Library}", booktitle = {Astronomical Data Analysis Software and Systems III}, year = 1994, series = {Astronomical Society of the Pacific Conference Series}, volume = 61, editor = {{Crabtree}, D.~R. and {Hanisch}, R.~J. and {Barnes}, J.}, pages = {481}, publisher = "ASP", address = "San Francisco", adsurl = {http://adsabs.harvard.edu/abs/1994APC...61..481W}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @Article{Walt2011, author = {S. van der Walt and S. C. Colbert and G. Varoquaux}, title = {The NumPy Array: A structure for efficient numerical computation}, journal = {Computing in Science and Engineering}, year = {2011}, OPTkey = {}, volume = {13}, OPTnumber = {}, pages = {22}, OPTmonth = {}, note = {{arXiv:1102.1523}}, OPTannote = {} } @ARTICLE{Hohenkerk:2010, AUTHOR = {Hohenkerk, C. }, TITLE = {Standards of Fundamental Astronomy}, YEAR = 2010, JOURNAL = {Scholarpedia}, VOLUME = 5, NUMBER = 12, PAGES = 11404, NOTE = {{doi:10.4249/scholarpedia.11404}}, } @inproceedings{P005_adassxxii, author = "David Berry and Malcolm Currie and Tim Jenness and Peter Draper and Graham Bell and Remo Tilanus", booktitle = "ADASS XXII", year = 2012, editor = {D. Friedel and M. Freemon and R. Plante}, volume = "TBD", series = {ASP Conf. Ser.}, pages = "TBD", publisher = "ASP", address ="San Francisco", } @Book{JennessBook, author = {Tim Jenness and Simon Cozens}, ALTeditor = {}, title = {Extending and Embedding Perl}, publisher = {Manning Publications}, year = {2002}, ISBN = {1930110820}, OPTkey = {}, OPTvolume = {}, OPTnumber = {}, OPTseries = {}, OPTaddress = {}, OPTedition = {}, OPTmonth = {}, OPTnote = {}, OPTannote = {} } @Article{PDL, author = {K. Glazebrook and F. Economou}, title = {PDL: The Perl Data Language}, journal = {The Perl Journal}, year = {1997}, OPTkey = {}, volume = {5}, OPTnumber = {}, pages = {5}, OPTmonth = {}, note = {Reprinted in Dr. Dobb's Journal September 1997}, OPTannote = {} } @INPROCEEDINGS{2009ASPC..411..418J, author = {{Jenness}, T. and {Berry}, D.~S. and {Cavanagh}, B. and {Currie}, M.~J. and {Draper}, P.~W. and {Economou}, F.}, title = "{Developments in the Starlink Software Collection}", booktitle = {Astronomical Data Analysis Software and Systems XVIII}, year = 2009, series = {Astronomical Society of the Pacific Conference Series}, volume = 411, editor = {{Bohlender}, D.~A. and {Durand}, D. and {Dowler}, P.}, month = sep, pages = {418}, publisher = "ASP", address = "San Francisco", adsurl = {http://adsabs.harvard.edu/abs/2009ASPC..411..418J}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } @INPROCEEDINGS{2012ASPC..461..825B, author = {{Berry}, D.~S. and {Jenness}, T.}, title = "{New Features in AST: A WCS Management and Manipulation Library}", booktitle = {Astronomical Data Analysis Software and Systems XXI}, year = 2012, series = {Astronomical Society of the Pacific Conference Series}, volume = 461, archivePrefix = "arXiv", primaryClass = "astro-ph.IM", editor = {{Ballester}, P. and {Egret}, D. and {Lorente}, N.~P.~F.}, month = sep, pages = {825}, publisher = "ASP", address = "San Francisco", adsurl = {http://adsabs.harvard.edu/abs/2012ASPC..461..825B}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} } pal-0.9.7/pubs/adass2012/P56.tex000066400000000000000000000130601302604645500157550ustar00rootroot00000000000000\documentclass[11pt,twoside]{article} \usepackage{asp2010} \resetcounters \bibliographystyle{asp2010} \markboth{Tim~Jenness and David S. Berry}{PAL -- A Positional Astronomy Library} \begin{document} \title{PAL -- A Positional Astronomy Library} \author{Tim~Jenness and David S. Berry \affil{Joint~Astronomy~Centre, 660~N.~A`oh\={o}k\={u}~Place, Hilo, HI, 96720, U.S.A.}} \begin{abstract} PAL is a new positional astronomy library written in C that attempts to retain the SLALIB API but is distributed with an open source GPL license. The library depends on the IAU SOFA library wherever a SOFA routine exists and uses the most recent nutation and precession models. Currently about 100 of the 200 SLALIB routines are available. Interfaces are also available from Perl and Python. PAL is freely available via github. \end{abstract} \section{Introduction} The SLALIB library, written by Patrick Wallace \citep{1994ASPC...61..481W}, is a very popular positional astronomy library that is available in Fortran as part of the Starlink Software Collection \citep[e.g.][]{2009ASPC..411..418J} with a GPL license. An updated version is also available directly from the author as a proprietary and extended C library with a non-commercial non-redistribution license. The latter clause makes it hard to ship software relying on the C library and impossible to include the code in a public source code repository. To overcome the distribution issues and to make use of current precession and nutation models, we have written, with advice and input from Patrick Wallace, the PAL library. The PAL library is written in C and has a GPL license. In most cases the API is designed to be identical to SLALIB except for the use of a \texttt{pal} prefix instead of a \texttt{sla} prefix in function calls. Where appropriate, IAU SOFA routines \citep{Hohenkerk:2010,1996ASPC..101..207W}, of which Patrick Wallace was the primary author, are called. Where the SOFA library does not have equivalent functionality the Fortran has been ported to C from the GPL Fortran library included with the Starlink distribution. We have not ported the full SLALIB functionality to PAL but are adding routines as we need them for applications. Approximately 100 functions have been ported. \section{Implementation} PAL is written in very portable C with SOFA as the only dependency. Perl and Python wrappers have also been written and they are distributed with their own copies of PAL and SOFA to make installation as easy as possible. The example code below shows the deliberate similarities between the SLALIB and PAL API: \newpage \begin{description} \item[SLALIB Fortran:] \mbox{} \begin{verbatim} GMST = SLA_GMST( UT1 ) CALL SLA_DE2H( HIN, DIN, DP, DA, DE ) CALL SLA_DMOON( DATE, PV ) CALL SLA_OBS( N, C, NAME, W, P, H ) \end{verbatim} \item[SLALIB C:] \mbox{} \begin{verbatim} gmst = slaGmst( ut1 ); slaDe2h( hin, din, dp, &da, &de ); slaDmoon( date, pv ); slaObs( 0, "JCMT", telname, &w, &p, &h ); \end{verbatim} \item[PAL C:] \mbox{} \begin{verbatim} gmst = palGmst( ut1 ); palDe2h( hin, din, dp, &da, &de ); palDmoon( date, pv ); status = palObs( 0, "JCMT", short, slen, long, llen, &w, &p, &h ); \end{verbatim} \item[PAL Python:] \mbox{} \begin{verbatim} import palpy as pal gmst = pal.gmst( ut1 ) (da, de) = pal.de2h( hin, din, dp ) pv = pal.dmoon( date ) obsdata = pal.obs() mmt = obsdata["MMT"] \end{verbatim} \item[PAL Perl:] \mbox{} \begin{verbatim} use Astro::PAL qw/ :all /; $gmst = palGmst( $ut1 ); ($da,$de) = palDe2h( $hin, $din, $dp ); @pv = palDmoon( $date ); ($id, $name, $w, $p, $h) = palObs( 22 ); ($id, $name, $w, $p, $h) = palObs( "JCMT" ); \end{verbatim} \end{description} In general a simple renaming of the SLALIB function will be sufficient to switch to PAL with one exception. As can be seen above the \texttt{palObs} routine now expects to be given the lengths of supplied string buffers and does not reuse the short name buffer, allowing const strings to be supplied without triggering compiler warnings. The Python and Perl interfaces return results where appropriate rather than modifying arguments. The Python interface uses numpy arrays \citep[e.g.][]{Walt2011}\footnote{\url{http://numpy.scipy.org}} for all vectors and matrices, and the C library is wrapped using Cython\footnote{\url{http://cython.org}}. The Perl interface is wrapped with the standard perl/XS system \citep[e.g.][]{JennessBook} and uses simple lists for vectors and matrices rather than adding a dependency on the Perl Data Language \citep{PDL}. The Fortran test suite was ported to C to test the PAL library. There are minor changes due to differences in the more modern precession and nutation models implemented in SOFA. The PAL library is now used within the Starlink AST library \citep{2012ASPC..461..825B} and in all Starlink C applications that previously used SLALIB. It was shipped with the Starlink \textit{kapuahi} release \citep{P005_adassxxii}. The PAL library also has an advantage over Fortran SLALIB in that it is inherently thread-safe. \section{Obtaining the Software} PAL is available from github\footnote{\url{https://github.com/Starlink/pal/downloads}} and is also distributed with Starlink\footnote{\url{http://www.starlink.ac.uk}}. The Python and Perl wrappers are also on github\footnote{\url{https://github.com/Starlink/palpy} and \url{https://github.com/timj/perl-Astro-PAL}} and distributions can be obtained from PyPI\footnote{\url{http://pypi.python.org/pypi/palpy}} and CPAN\footnote{\url{http://search.cpan.org/~tjenness/Astro-PAL/}}. %\acknowledgements ... \bibliography{P56} \end{document} pal-0.9.7/pubs/adass2012/PAL-ADASS2012-poster.pdf000066400000000000000000011522031302604645500204440ustar00rootroot00000000000000%PDF-1.3 %Äåòåë§ó ÐÄÆ 4 0 obj << /Length 5 0 R /Filter /FlateDecode >> stream xÍ]ù“Gvþ½þŠÄî6ÛtQ÷!Y6ǰ#ÉHkvåƒ ³–Œ@€ìðï—Uù}/»3»ªrh!º©ÎÌwùò¨_Ógé¯i5dCÙ•]Úö™|È—®(³¢nê´îê¬7OÞ]¥?¦¿¤÷½/Ò—ïÓbüóþ%û&M]eÍ0 éuÚ5e–we›òÙk}fa´ékö\óì§ôoLJi äãòkšge'ÈtõôÐü«/ò6­Û¬Ë‡ºO›¢ÏÚ¾iÓ—×éÃËthdžòÑ4EÖ—y•î†6¹¼Nï]^™Áÿòoé¿¥›³;2vnnÙÏÏñÁíñK‘n~Çohc$ìüû±m•nþ€NÏ7ã·&Ý<¿ƒglõÇñ‰ÝÞZ%GÚe3¿;ŸÜ3MÊt“ßIöq'5ŠOàw‹/¹$¸ü5½ü&y|)ê‘gMÕ•M=¿ÍʦlÚ¬72êû¬¨ò>™DS5£hä£ì=Ý•}ê ¦ñž*ê óöDd$¢©,ݵŜŒåüBvò …¸e㬡4Úñ‰pvÛ{ضN6ýØZd>x}nº ÆÀ<Çg÷ÇÕž¬í†,oÅXF¥WÎVµÈ­íûtWµY%f9TÜ£)§É’Yåÿ˜§˜B¾(FÓI—]ÂèaZñ]µð¦.©v“G¨Ì‡p% qp[R¦ ù»Q~ÉæK«i$äïí˜rº±6-:3uR¡ÿƒi+êauбzj ìæƒûP!‚& AÓ„Œ¼Ê¸'ÛQÚ&AP{ÂqôuîTžÚdŸ$›‡ø‰ÓåìÉö¸ºS¤U—•e G²(Q)Ò ò“UÚÑÜ-‡ šX’“ •˜L€ËòøE^‘=áMnœlòzï§[µP‰(ÒSÒmµQØRmøò¦"H7«c$2Vxe“Õù ùÃu"z4Ä|úÛãùH£h5¹ í#çÅw¬\Ï¢ò!îT2T™Æ±#‰«g7e²Ç ÚëŽC’uNy^ƒý þOÆ7H|¹0Ÿ&àL´ªƒ$ZÖu:l!h~Âð@’„ØI€7ca½²Zm„ HOk‰J6[’÷•a€DÊ3ó)‚¥d R©#‚ÎÚ&@$Ž–Žø¡ž–}ˆˆ1»Ã€|Dü|Ÿ9™3qQ¼ƒÒXáŸÉŽÉ‘ —+\j^d]×ԫŹʓ$Á'²‡ S6À®ÑâÜÝ…Óñ<àãÑ9ˆ¡ /—K€P·€-m)b4rÌ #s ×µXsR½¥Ž ò~QÂ'‚“º‡Ð1V’JM¿>4Îe½Àêë‘Çb‹TvÚ…‘ñ¹E?Å D­U0ò€kô§#&ƒ˜üˆÄkN­Tfªò ª”Ÿ|3éN²ž± tŸ Ø¡ƒâ€¼oLæ¢$ÖuYß¶r÷ýd&®}bË'– 5àm¥â2ƒAT‰¡4hÞìÕIrÈô€\Á( BT ®ÚwÈœù1ÉÁ(>Äí?޲¬Ô¶!*¶*ÄRÞAf 6¶S²lº»HÓ(q·m–7y±ÚϪT4Y!C˜øf·£zÄ™ýup뜜¹[s ?…sØÒÄ|ykVÀÔˆ'vtB¸~r§y°—ãnLG¼h²n~%Ö¦Îʪ*W‹uÎï*žP?†ò„Òáôr&¤FF.´CûS$žÉXl¨oÿgDƒáHDƒ¬Ý%€ qWßN¶/z.’®#¼ %ÚºÌê¢]ŸQ"¤“nvT<ºñ»g4ÆÂdûåÊþ9@äs,Ÿ*™¸”u·n^g¦W—ÿ9s–³ÓJªºMÞ­¯á0v$Ë>I6~~>9O°BpšCA×ÕÑñ'ÊMyOqÌG\;‘õ"nªeB N(!P Í_Ø}Î ©¦Øæ3ÁPZDYTÞfí°>Ò|HH"j3ç$âä(Ð||b0ëö$ g_ÚÔa[ Š¾ÄŒ_D4F’nÙ‚~•ãÏ €­éÜvÛUJu%O¨‹À–Ó)bû­ ¾‚«`#Ér0ëBõzQ^82[&äS™WÊ4Y* ^ô…,Tùmò§}È»oÍ`]îìÁ]M€;Ÿ-9X:WðЛ“%º;6üæI½Tµ£ƒTŠ²Ý—“Ð^CÁ´ì+É:»*<ÉpkàÉþrØñxº\wfÿ^ ÜQ¸I0*³g¶šsË(ÏÚR3ð¹²F¼Ã%>F jc— ‡ —d]Yê.f¥nŽscÕÚæ¾¬ý—@)ë.φ¶Y_X´+ o´+Ú­âëÿæ§âb#6¼ÑÂ8yî–Wl ¯)ß~Yp%ÿ½5Q%‘ û³ÐûlLLa„´JV7¡Ä@•Ø8V®Í ‹ñ}·zŠ1cQÐÞ3«~÷I›ÊÓÅs2QÊÌ#EzÙ`‡Y¹†¶ìLP^†Á™‹*+^#”FG\ª2/€Ê*ügcA<Œçiìª[tuGòᬪŠõÕÅšHÁLI k鯆‹Ä_ Qªi]‡?=Ñ8ŒM¨è LüI-ºtÀ;§¢@Ôá’ËwSñ&Ýjޝr§ë ž,Gj¼f¿y”RHeà¸àeœ¨<¨j²¦hV›æNXI‘ˉÃÀE¹P˜4ŠIæ—7 ʆj¦SQû$åŠm€&£¿ÑȺ9/áÎv ÓVßår|!;»efÓ,•“’qwu\©¿-«u%Û…í^ÖÅõpÄ<¨…MñsÛ‰VÔi¯êã¼…M?gŒ>‚¢¡~ñ‹ÅÝÙBüÙPL:NÁßêC „iÍiјÁU”ž—² ¿¨úÕR„›uª°HGoÙ´”¬ „ ¸R²TÅw<ÅÒÙ¢k\ÖúiàO T)C˜çÚ T™j{k2E[å0^Ê«{ý< ¦øð >‰8‡õω¾›>ýK9¼¦Ïê² Ã{ÿúÅÅ>G—ª=¦Zû‰¯”¥°².KC£ç?Ä6û`üÕ±´Ê¤&/Qœ Á•c!¦ŠÏBϯʟ¶Ãß5´N0gh5%–²Ê› ­?ýü‹Ï”|ƒKÃo ïX\X2ÿ’¹]ˆÔ»é«Ÿ¹ëÒ¸¦­F„ø*+d®ª!óÕÛ‘8®$d“|ÜÝô÷¯^˜¿®¨BKÓbe¯Ý:#ÎQ…<5a7ŽÊýý¦!¦Îz£¯×oÞ¸Ú³B[—É+ºRNY÷EP[Å:^½øp«?ˤ–r²8¯eÎÒÙ·ÿujÎV2Eê›"¬?Ôš¥½ª5rx½l+8ž…q±Á°ª³ºn1)™’¤‚‰äÈþ~eEgvz&þ–Išmà—öåã26Ó­Ê2kì=úÈD·*d{W%ƒ›$ºqza!Íø•Y‹‹õËOëWÀ›‹õo_¼Žõ*>s[CÈ}šXŸ‹›ª+ì‘ Á=ë…ÐÅz s&8œ6Ö+¼ÿ»X¿ÌדÆúà>U¬ÇÖ×qž(ÖÒM=Ñ×èX 3ä}‚X¨3¤ž2Ö¯wâX_öm6Hªb \ˆÁ‘±¾ìš,ï#NI,Wرõ%P-3³Ê(„Å$÷‘yK¾r¹2–'ríOÑ 8¦çé¾~ûæÝ‡¸Ì¼\X,„Ñ·ÿ•™¬€8;©K_¼OÅG¸d.ÏJ¹ç©îk,ÓåëÇOuiÆ'œ6ñZð¤‰×x “d—'‘_ÙÉV¸ºWXeqÕf¹Pîm”<ª5^¥ÌLŸoÌÄüÕ•T¢¿4 ›½²—˜²´E`&¬UNÆàiolÁEÁËÁê\¼Ÿl×Î]oRoYfq#ËDy?VÏ·¾â I°­Dަ²z ôÎHµ’kY¹6¦âI56 vàMƒ Y(oëÈwÓÛã²c¤?Xæp#§óäòÙp†™ ƒÆ÷#Hvt/@üºQ!•²hQ7‰3‘û‘ÚºjÖ·F&Ã+(+ò<ëåV– +ö¬Ëœ,j™3•UžxÖø +ˆœ1Â¥\ø¶M† E,8Ç l-w½Lû£ná]7Ë¡ ޾ö˜k¤áè›/@9wÙ“]”‡ò”‡ `*âP'‹‡›foíä( Á Mâb ¥ÎIM*%{C |™On†2–%ŽBÑ P¢8ãV¨*æLáDa€Ò9S8Å&p•ãX‰ŒF)V{ËlÏØ&?ªb›õDQs¼Ô#h<|C>“ Ñ4 Üdܽ6Þ‰ÀŽ%Ù¤ΙǒœXNÑQ¿8¸ªÅx5œ´b/‰¥÷ƒEAÍqæ\˜nD#Å· Ê\åiMí°­†.ߎ('ú¨1ðÄ—È}M:a^bÌ7gìßoa $/øÌðqÕIˆÍq"x¤ ‰9Nžû[X—£*y8£ëNPuÇÇà% âo-äêͪ’%úr†Jƒð½I"\³)”;Eó/ûðwÓo¢rƒ–²kZm,d-Qžù¯ ¢íZ 4AU OØ÷/cT—¹MM¦OG1ÎìÉ/š»0µ&{cßž•¬x¯•ïÀÞëro#gn‡Ú”(dcãÄYµ±»ÎÌ^^TÓ#^¬å!àÖ·U¢fh‚âÙü8€Àñ¥B…uínl*dïª]W¤C®ÿR!T3*µ÷Ѩ½’±@ÃuÕé›ëQh m´Û>1úÍ›8‘½`"ŽºOÁþ|ÄÇ ;S¹çm¢ ç'bo¦[e$:M¡Ã íÉ? ÷ï¸Éê Ñ߀b„ϳÀh¶”WcØ<Å ÚŠœöž’Pû7ž·Ûòì2`™ÍÈPáÓFjÂÓ=¿¶À©n\Vüöý·¹t4Ò‚±uÓ.oþ3ÞtüØÕ}  ICeç_€¤2aìÐGr‘ëQ [vâ¡«fåu¹±i»L‚5v:ΰ{õ+…d›TùZËK5æIõDåŠjO=ƒvÒ«`ÆëÊc0§DªZÎ"èeîÝq$üÏ'G:¾* NƉò~¢©¥ÈÒVfmmß :›Û’€D„É£4ײïJ^„)»÷| ÐàÛš­Óqî®âŒ.“!WV7by›AÞ:Z·²Ä÷_à¨èÑ;· +1ôH¥žM“UyCÄ*<ÏyY%âlCã4q¶gâx1V*œë i'ä¬:iß` a<ýÉrƒÐøI¾Ç‘€ÙˆCFbøÖßX}·¶ã¼/ˆ#ql0@»k¸²œ[p kç>JíèÉZúÇÉÚîeöt2(ëc &æéìÛO ¶ùªF‰sd1Pv¥5œ:üäÜ™ÒãmZ®i”X.³6>¡Åz”“xé/‰nŠÚl”¸Š¯‘C…¼ô·d©N^ÕðÙk>“vrì_‹Ë ~¾|f^úk^-|ðÒßåD¬u}îÁܤd½¸mF&fÑsCG5”+oYˆã1{Å“;xgõ 4%×àmQÇ7xú{¤~4W×ÚLJ 3 Gíè¼øø†OݲýÝwRÑ’_FŽ6ò=¶Kæ-×]?éH ¼0N¡MuøzùëÕ8VÌhË /näN¸¦ie_/çíî y rFp;˜©9õyʘ¬æÛM··nÎò³U»LÔCîƒRÙ–r•L~4—!‡Tï­Þ9sÖ M“TÔq ZHH©ÍÀÜêÕš0±“¸A}™Ù;é±ÃS˜J¶¢ÃTè=M^e~ËÎNÔ@Ah1˜Ù(âaàƺ•;lyŸD8d]Z ð ß²‹ œ~; uJPm%ùwàFÙF‘·EZ\+½ÍèbUÞf=$4€Ã”Us£œÎ²…2qš|þ«AE*+ŒÚoˆ&ÖÐýf™ºMw:#»èòaý×*·§„š§„¼Ó¼ïÌù„`ÞDv¨*¹^á4šÓæ½¼‰:Kž‡i…(ÐéLñ€ *ç‡V6©v¥œÉ 3äò’Lxó×ïR_º°?ÞsEc† œ,– `  Ã]''ô¡švÀ/°;½µœãLîNßÁáÆ`ìJ õšb,ü@¬Ù—ˆ(²ºŸžWC„ÝHG¼q¬†˜|S‘ RÆKÚtK±TA®Šû³=3bîvp¢y/'ÂryQœ PòóÛ1¯‰ÃÁìJ­*Ü~¢8gvb° [×úœZßäïþb€¢$u8REUfׂ“j%ݦ¸¶Ä‘ìØÉÑÉ—#S‰ÚêÊú)ÁЮn~¤þËsi"WW‹g”ž!Q¨‰“ñþæÝeRf#”‘hž á‡> endobj 6 0 obj << /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /ColorSpace << /Cs1 7 0 R /Cs2 8 0 R >> /Font << /TT4.1 15 0 R /TT1.1 10 0 R /TT2.0 11 0 R /TT3.1 13 0 R >> /XObject << /Im1 16 0 R >> >> endobj 16 0 obj << /Length 17 0 R /Type /XObject /Subtype /Image /Width 2495 /Height 2495 /Interpolate true /ColorSpace 8 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xìÝ?Îì¶÷ñw Þ‚·à-x w ®ÓHÀ]ê[§s‘:€»ÔîS¹Hàv®ß÷÷‚!H3Š<‡<$¿Æ…¡™G?<¤$Qóÿ/ÿ!€ € €ì+ðíÏo¿ýç·Ó¿_þõËÏÿüùúïÇ¿ÿX÷ýð~ú?-ÿ´†ºMk©ëèãé¨õQû†GŽ € € € € € €À´ÇÜß5?øÓ?~ºf[Ò—Û.{e”íüXÓÆ;Ž € € € € € €@ßÿû{NÀÇ~~ùú%çï¾ûËwÛ&1g € € € € €ôЛ=Å3? € € € € €@‰@N˜ê÷æ¶íŠçÀ@fЙ+½ÝWç²’Só € € € € € p a:cŽ€}F¸ ‘z=Ýó  € € € € €À;?þ÷Ç×ýé?ñ¦7}ïü @`”HÕYOç¾w§E¾G@@@@ØM€„é)@ E@ éÁ!©»]q¼ € € € € €@øý¿¿ÿò¯_aÚÒÓβ €K Håb @@@@ØA %L¿|ýòÝ_¾[²»›ƒB@ÀV@gL7õ¸‘Ρ;\*pŒ € € € € €ÀÚz%¯º|I˜Úö¥³6@ r"•ßH]ûÚ‰£C@@@@žýùM¿ÚÆ+y7ìØç@ú¤Wûþúû¯:ç.vÁá € € € € €küöŸß~þçÏ?üí‡>ýÆl@$ 3¯Î¿: ¯q9ÁQ € € € € €ó äŸ1¥û@† ð©ó^S±ç € € € € 0©€~j·òïg@¸HïõÕùš÷úNz¹Ån#€ € € € €@pý°oå½é¦æO €ÄཾÁ/±Ø=@@@@˜E ½•÷Ç¿ÿ³7˜½B@G:§ÿò¯_t~ŸåR„ýD@@@@Æ ¤·òêGÓ¾ûËwúc™@fÐYþ§ü¤÷úê¼?öƒ­#€ € € € €Ò[yõi³ôú²Ÿ € `"À{}^˜±K € € € € Ð_àÛŸß4ä„A¦&=Ϭ@ÙòpT]!ô¿,a‹ € € € € €ÀôK¦f2{/û €NºNà×Q‡\§±Q@@@@è# óê×Íx1¯S'3«E@`I]9üüÏŸuÑçr…­ € € € € €~üïôbÞ%»s9(@è& —úêUÿº®ÐՅߥ kF@@@@Ìôb^ áżÝú“Ù €[ èCWºÞ0¿†a… € € € € €€‰À·?¿¥ój`ÈVý·, €ŒÐK}õ£¼Ô×äZŽ• € € € € €@»€^÷Ë¿~ÑkôFõš²]@@@ºÑ5 /õm¿ºc  € € € € ðTà·ÿüÆ‹yé©F@€¼Ô÷éuó#€ € € € €@/æ ØEÌ.!€ €ÀKý”/õ­»äc)@@@@¸ gú²K–/@@` ²¨7—yü @@@@J¾ýùíë¿¿êçÃÔß8E¿(;‰ €Ü ä,ª®sJ.‡˜@@@@6È9Óû¾GþŠ €L- 'ÄôœYÔÍ/}9|@@@@^ 3ºû—G@j²¨//ù@@@@ þøß¿üë—ÿþcu# "€ €kEÝðb˜CF@@@@@)gúÃß~X£«“£@@ t¤§Ët½Äu# € € € €,,@ÎÔ°[•U!€Àßÿõ{e@ò¿ßþó[û?ž<™¢èÙILÈ¢.|aÌ¡!€ € € €l+ðûÿùŸ?ÓÛoÒ‰ÊJpøî/ßå4_ËÄ×­NjY×cì¼r½–ܼñçUç ‘Í!A€,ªy[Ê @@@@è,r¦u¡Ë‘}@L_E˳RrЃt%Ÿ’°d8 èÊJϤñFߊ“ ‹ € € € € 0D€wó{8™F`.L_EC¤Q«s¹Ýì­)ÉÓpþ„À>ŒE­8¿° € € € €Ý¾ýùM/ÛäݼûôÙr¤K xdúêZ¡eòƒ¤Ëà,Y‰8(ú ¨MÐ5˜®ÄêÚ[–B@@@@C”3ýòõKÿ®B¶ˆæ™¾ºGcØÍnÈ =HIž)J6Š@|])‹Z×ê² € € € €4 üúû¯?ýã§ø‰ì!” xdúª›š5ZR’§å!Íœl(ðÝ_¾Sû©ë´êæ—@@@@@ \@¿E¨9õËmØÉ!#°¼€G¦¯¼y9͹ÆàSR’§Ë×D”Eýý¿¿ŸZW>"€ € € € €@»€zÞ~þçÏßÿõ{“Þìatý¦«8²¨-ç#–E@@@@ hä×/ÿú…œiØîPv [L_KsºÀàSR’§¶aÏÚØGà‡¿ý ë:5­--3Ë"€ € € € °¡À·?¿©oM=lût'r¤ L_c:ûàSR’§ÔVhÐ5Þ×Õõ^cÍâ € € € €¬- >4õ¤}ùú¥±GŽÅ@`RL_c³9ûàSR’§Oë—ÄôO‰x=¤úñný»I)êÒûÿL¡*i…ÍÛ5O!'8-ØiOæ|z:ö_¾~9Ü&çJ› :ŽˆºI ®}˜:kë§cx3 € € € €ÀdÇÏ®­Ý{9õÑ¥,A^HõK‘›¸IŸš“jÜå©Ô–ÿ8oÚôTújpx¢iùpÝáU%Õ ù­áS-ã# € € € €GÌR§:c[vè·œñSÎ4l_kÊ¢Îk»ÏÇ&%Úô¤ƒOÍwKžNô’Þ²V38é“¶­ k[@@göõjhaEf6@@@@àz…Ú¶/r\ ïqíCÐø½˜7lÎôTµ•žÛ<©q‰öqƼ¡¹áŒu­Üûa–¦£¢”uhŒB­ – ( «P=ƒTQX@@@@[u½*-¥äTÀn4v å&íJM)Ô=k–me¾6ývätåbްCòT¥¬Ã4§ ¸B=û4]HsvCà€‚y¢Ç¥6ì € € € €@µ€ÒêUÖœwW|ÀX¥Mƒü¤iu-Ó‚©¢•ì¿õ±>ËN—:4g™Nài«Ñ ænaW¨¦Fù¦§JÌ@d]£êÁÅvØzÇŽ!€ € € €,# q|¼ž7ro!û¦wÞ.öšM%q¶zµ¦yki>úX½ñsÔ3'];yª£3›b…»55œ.7ÐUÁSMц°“ € € € €ÀniÜ÷ý~“®6sFu.õ&«u"sÚäOçŠvöÖP@çMxaY@@@@ ˆ€•×Ϻö±*: 9-oLÖÈŸ–oᜧä©x·Á§…På³]I;7 Õ›£=)/åwsÎ[úÕaÂt]Í@Ôwíß#€ € € €Á”`¨é±³‹éÈt=äó_s=æƒOµ‘ÛÛDOg¸’ÎÒ¼èÝõO–ù¯¼ÿ–€g?ý4†Ýü9œk]ã@@@@?þ÷‡ÞЫ”“_kF ™Óº6aöüiÝQß,õ2ÓgÞé­ö©[¹Á©ûÓKÒŠ뼈NŽuÇËR'½¹T™£ÎÅÇæ(  5,¼Ë÷ÔDð@@@ˆ# Œ oè Ø±Æ.Õ 9mi[4¼®Ž=ÂR-þrÙ—™>˜ywwØÁ§z¨æ¥Lõ—/I#ÏÍ>üø÷«—¯³?¤q*ü ]«R\k ß € € € €ŒЈ'u Wtõ°1Èœ¶7&3¦·R4¶ûi ï(ôýiÎÆaŸšÿ<ß;Ò˜í‰öÊ#WÞ- ,>õCac•›Z@Wã¼|ÆC@@@@©4lJ=ØaÇ:MÝýÅÎ0¥êÔ5½zç'Š^}¼ï|—éóH¨ÅlIžš ¼ ¶Ý¾× KÇž,zn]-†Uý¿çFÙÖŒ:è¼cþrƒÝšŽ@@@x* w0Òƒ7cû\" Ø~Z#˜ÿ¥€zngü]žï˜UÿöKºê/c>5O¾ËG—TðþóÄiRT¢SÂQÃÓî릒/šGÿ4¿þiÁ˜‰íÕ>ÉÄHZ¨éþ‘ÌçPÕPe7?£UŸžX@@@XX@=¨_¾~™«ûˆ½E \@ …˜9‚I[uÛN—Úè™éŽy¼|jNª–Wê±szñ£Ö@?ƒ¨ì§É‰[¡¥õ¤\ê£}pyŸ—÷ž^Ǫ¦CK˜”ìØ:ÂÖ½$æ°k¥få € € € €ÀDê£ Ø'ïÝãÄú·Pšƒ1æÒt© óNf%›nê‘þjkpð©9éDÉS‡mù®-eÖüÎÚj-•‘ÑÑ™gÿ ð8Û Dù8Êú~(ñMÄŸ6P„ŒjŽŽáÊ4 € € € °†€rIzë—zí6é\â0w8ë ^…•?:ý‹Åx‰6WjÃ<ÓwŸö51ÃzÊ;´Ô“eUµ®o¸U7éÀ#u=4Ø’é3O´©  MW5„´qŸ÷Hˆ¿kgÔt|ÞÉ<¤ß~þ>TÌ7ÆÏiñö#¨j¤¡ÉÓ8§}ããºòW… õY®×L € € € €4HD]sôª-ÐÆ!T(ï0°öiÓÞ9Ó“IÖ¿›T[œ¢‘’铌y‰Äyfé)ì;ìö”‚†Æ)è²~|³ó{AÃRœdž~4dÔ0C²¨Oý7™_§!Ý 6>öŒ­#€ € € €Wu’ðæ›t‹q˜ï û¥¯Uìæ›TûFåµ]††½ ‰Q™>óâˆ3oéËòíð¥Rx7ßðO*âQ H9£Ò1æ¼3Œóå>çt 'YÍò6€DÌ`+ ûR¨ï¾G@@@åÔ›M¿™mwk›Q ýuˆmEœ‡Ô-ožØºÑ`´àqb¢–²²`æ9¦ Ú£HKØ=æQZ꾘üUm—ÇÎ{¬SqhÛï ãg“Ÿ ›?Vq¤S¹E}Z"›Ì¯ªyÓ}Œ=¦@@@@hê øûh›tFq˜¡<ÒU÷õ]=ÕÇz»vΟ@ 3‰ãﻏüÍ ¢|Ó®àI]ëåÊÆ žê‘BååÖÃ~©Æ¶Ïÿéd>YŸ1€:7‰.ÈãM˜¡›€îÌðSkÆG@@@@`¸€Æ¨_·[— B ¸@ça§ú±¹°£¢ÔAÚmhXð‡7Ì;ŠË3˜ÙüÚIû7A†jý«}‹ oµÞBjÇÂ6³†Êfz‹Ö¯\-YÔŠ’Z{Åa‡–íŠ|D@@@¼Ô—HÚtí~-Ž®N ÏˆUpÕÁ€NOhÊ8ô¦­œ6êãØLŸÒ¶g„òÔ­_)Œ%õ;®ëš; ;4sš­:äOã7¶Yãã„yƒPÞ¼¨¡ÖóE7mYÔGE¶ü̪º³0?OÝD B@@@ ÔáFÚtù.,°E O§´†i¨§±e?;/Û!µ¡†Nø«|sÃ3}æ ¸á·á¤å¥ß2§êŽkBA+Ÿ«1y‡©£ðn~gy^åQúþË×/†—…í«Ò¨á5`ïÙùk‰€j±î2¼+r{в@@@@ ¨+#ò¨®’>æAÀ[@cñr•ñ›˜ô›êÕP#?–´æ°ÍÔðLŸüÍspcŸ'õnOÒú½³-D[Cý„¢y›,=`»ÃCÖð©$O‡DBäªÝ#…zl|˜F@@@€ê Ö8…È},ì[õ·çêOÖ¿üQJÓôߥ[4Ïæ\„©{ï;äOÕÝ!®û`Záu+÷ß(x®ÕòMÅ>Üï᣿F }´Ãu3»>r0u{òÒÓuXeØæå%Å»/]óËuíÉ»]åûÍ”B5oçëB”¥@@@@£€º,”Û¼ë†ÃWÂKa >v WQH”÷»jf½ŽOo`Óh 5væX}<¦'sz,})•‡PaÌV˼X+<–L/6ø4i {Ë< æºZP²ÔJ?âyD6Œ#æì§3×äòêÑô±ø˜Fà$ fеR?ŠUfF@@@Í”£á-j§Þ›­>*É¢þVƒž”/S"UëÔšW•TšØµÝ¨H–ŤvÍ©bB™÷ýÖæJƒOƒºÖ25Â~­JÌÇ Ú=]ŸÐ˜ý ׈ªŽÕöBg Ë è¹…˜Ñ[ö,ˆ € € € (Ã¥® Ò¦Ë÷A½;@½2€V Ów‘¯[òEЮnZùJygïDsÀF,N¦Ïü‡äFåàâ¾kQ¿W•׊¶¿Þ {Ú~-ÌÔoîUDyü¯‹ÌcÙ1À€Nî¤PëjK!€ € € €@€úÓÔÙ¸Rvæ¦ï…?Ô¥Žtó”Ê}(jsˆzÚ“y?Êðþx[þªê0ØXX景£°:WwÏ|qóãÕ ëvRõîhÕ>]½'uûŸ—2ïBu ùˆN~@5)ËŸîýÎhó¶Ææu¿½õЦÎGŸê,û¨š·ÿ&ÁÌJ@@@@`%Ò¦}ºznE½Oêœw/ù±¦,“B5ê‘NÅ0~wIáwí nNªöíiô:Ío^4¹éÞjØ©JÇilût³ß[ shUO5'UÀ´“š¬Ái0ût)?Ló Wœ´?º`rhå+qz ôé¬]÷‘äiy92çSR¨uµ’¥@@@XX€´éÓ–IçWæNýáN#‡W)ò§N#z¶Jsø½R2cÌLŸùÇžƒOc’šœJœÚÞ¹Fô›Hj%q¢²Ú½ëñk`M•äi‡Ø|¤PMª*+A@@@`vÒ¦;ô)gªþF5Ñâ_G¼@•žó@‹3d²¿ÓP;µ‡}öÿãV<287Z2ƒy3Ò홇°¤%ì7ó8½iÖd¨òÍn‡ý“ÚR&z¢78=ác¥Jò4lÝYlÇH¡ZÕYÖƒ € € €Àt¤Mëç¹Î>9Ó\ûÕÁó§æ¹'{œ”ß5¾qJ 3H:l¦oÞÁ§aIëˆÇq©"(ƒÖ¸c“.®ŒI>¡NL4Œ×ã$%I«ÕN$9i`·¤P ›AV… € € €@|Ҧǎ‘õ¦5ÂEýÞ‘³ÌµŽ(¼ÕÙ³X^‡çe³=Ù­ºâOÑdX“GF̪tÌåû >LÚR4ú=ÍS ›|œh¤d‹ÞËe=ΞA–—Ç{üRO™ÄÏi%j4¬* ÉÓcy1ÝG€ê©Fó@@@õH›öéf²•Ís¦ÇÚªlÂ"ø¸Q§ñ’AK~<|Û̇@¦R'¿í~Ö­Í*Ñp¬u{r]Ê\¾ydÒ+rù7Ç"¶šÞö½‰Ý#TfyÄÅãØ–Z­ÕšIž–7Ìi+@ ÕêÃz@@@%@ÚÔ¶ %ÎÚÔ™£\†ÇH™PütgÔO§Œòž8ý–\^ÿnjÖžFÉüÆÜY%ŽÇk3> NZW:N?йí;{S)x¨†}¤çxæU;5AéGŽÍQõ4ÉÓS‘ñ±³)ÔêÊË‚ € € €D mÚ¹_¥ÏæRÎô×ßoqö'`«Gúf–>yz¡Á\ñ!sä*†E0ãàÓà¤u¥ãqPªSž¨1YÊãÕµ}†W7¾Ç+œÒ±[½_:à™½‘Åg …êqõÅ:@@@è) žUÝàÏØ/Á>¿ gZ^}Ôa-ø­zªã/Ce‡/=ˆÉVÏ$ ×óHŠÙ”ù5%dm÷ð´¶ø¤§.ùèѤlþÎÞÄ~lc­¦K tì<uDzé$e«c‰Ø:G=gâô—U³Ãz@@@@à* ÛùÍû7˜VžHeêôžÒkü¬ñMê³SúoWV`Ä9Àþ{bžÂK‘ßÿ@N[ôÈbœ6ÑøqºÁ§ñI+JÄ£¡ŽÖlV°´/âÑV·ï•÷œ.04 U{NòÔ»øXÿ(R¨g"Ö‰ € € €€‡€†M‘6Õ…b¾]r¦u$T]h<–—‹G]k^îWè‘“óð7Cz×½dÅ_Í3×®ƒO§ }T N/Yüœf¶ÊôíP'£«›Ó@þ<ÙŠôºç|ƒ@5ÈVA~l7˜F@@@ݶÓí¡ ¥}TŽŒ3µªíÅa²õœ›Ñq%(d²oó®Ä)4|ðÝ™¾¹ŸNAú¨&šû«m¡IIEà-Á/ÏœÞ>šBÚjXë£:ÂÌtP5'…z¼Le@@@á¤M;w8mN™ õÙšçŸcw H—µvÃÜAß)'Z­G}ë‘»ñ(Ssüœj1ßÛYHËÜãˆ"üào¹€ßœ¶AÎDïЬ’›§Ó\o{ú¾îãªÉýôŽ‘Í_Âÿ.2gü^•ÝãÕßuµ†¥@@@ØV@}×ô·ÌصrÜgr¦®õwx",•µGòTc…Ž´ç´Ç€©á]ô¹ð0ü(y§7QÏBZ^LjÙÌ[N¿äuùqE˜Sæ¶®o¥nDó~g¯vÏÄ3ÈÙ¼Qû´¸Z¼œ¹Ö„ÎhÁóì§ýçã;Uyóç‹Lê+A@@@`yÝ’Gî‹{×™À÷Y@#2ÔCK×J‡ª¡+Ò£wZù NÛNxÀ*&ó€©!°eúÌSxNQ=iaÈå„‹aª'y ·¾ölϺ8¶IAhıaåUsñùË–‰%“§/ñue¨€¡>š„÷Ø•Bm©ò,‹ € € €ÀSu™»¤Æv °õ§)gʽž†}Ëüz\=r7<>¡Ú§a;-±ñnÙ±¶Ñò´¥*œß<ͤœÇàÓ‰HKäuyº-ß—lz‡yÌ£Z…¢ŒIçÔ„êó#(VááTn[ˆº˜¿¯°)‹š%m·ÎÚú¨Š© =w¹þŠ € € €ÀV)mêѱܧaç­¤Îr¦£*ìðÁ§¹›á¤F¿¹Óic3ÑâWXS >ý˜¤¨?Òköp½^fê#ã»¶JžêA‘Šàÿ¸Èñ÷s­< Q ,-O¨éêQYÔwu6þ÷¤P?6Ì€ € € €@iÓø#7{èÔ9YK{.uìȽ))¿?y¤ÃHž¦òò°ÛKïqD~±m•ÉM“ÎwæÏ™ï¤öÖôãš="Dëü¸ÝMfðˆ–°¼Ÿ¨vï[y.ö3ßuOÓi)Ùš·›Tíᇩ‚óh½óÙ“ @@@vPO›ïñhÙ/Ø-hïØJäÑ]Æ¢¥ZiÕ3 Ú–*߸¬G´4îÒýâñŸzɽ‰ë_="D£Y]÷y¢•{D‹Š, €R9§vÏêã1»gåÓ°®XÛ«°²ÞdQëð‡/¥ËQÝÙYÕ5Öƒ € € €Àž¤M‡wqXí€~¸j‡Ö˜­zÕ§§þÒœ¯Ôtú§ï5ñý®æÙ%…“Up.°Ê507=Ý;f­’#¹ÍŸšïáØ èÑžäæz¡ñ<¢eì èˆÎȹÒNœ^õ`õ–阆ïlo¾· 0ióäÃvØ?©Éu÷mX—Y € € €Ô5:°ë>lWü;¦N¿€af²KÊ„*út„†¥h‘žYTmk`üx$;N´M{ð쎶íZOÕÜ»ÈÌ‹À6Q2#éM‘™·œÊVßln·?)©arr<®Ä6ž­J¤îͱÇãz9­“ûq­®b´dZ?æõW¥ *¬+±§­’cgž«€ÎMægÏ—µ’/@@@X@@}Yº•¾Þ_óÍÔ±c£]½êÉlOñ÷ì8X³<:Ǧ®¶;oÕ9¬S;ê¨Ç=1™¶¿®Í|ŸmŸšïž e`{bÇ•¨º–éÎßqL¦¶'ïÊÑé²äZs­Ú瀆ïlo¾÷l˜²¨í×f7‡ÀŸÌ”õöH©›´]¬@@@êñ8=®o~{Î  8 ñèºV9ÓSA( ¡ø÷>Ë8m·ÛG’§®Ô©±Ó›']÷ÿ´rÃ9mÂã£yæJ­kQ$µ¾¢{.¢€·ª;å±Áœ € € € Ð ©Q™©ž7þlë$à1bÈ6˜•ŠÐ¥æ—eVÕ;JŸ©½>{>ËV<º¦GõÕ{änº‹yg¯J¶=§&=¾Çã%§Mlþq¥hyW”Cõu5ò²±j^®ü݆úÞãWtM®ý‚\ò…*¬h;£kr§ÚjB¬@@@C£Q-Ú½9ûÓGÀéEyíñ­MPª)íÇõr C†z¤öúí,[ñÈw˜¤í*=Ž¥[ÞÁ|çÕ´×Yó½RÛÒôBV©¨ÜvfŠ»{vò^ÀcHËÓ@M9ÓøéÔå8$SàÑåEòôTמV„ó‘7{¦ÏcÿÛ+]UÍG±©u:U¥Í?z4×l["æ!”ÚÒw9¸-má ¶}Öæ÷X!ÚÇÙÞîãÃVž ¨%ÑEìÇbe@@@¦P÷û¨.Ö§·äÌßAÀc|\aEP™]†ê½×®Ú£Ù†tzôÆÓ°œâÇ|À#ÉÓ“pùGó²h|ºRòôQsW2óÁøå±ÔNóèU)ô?Šw[ô¨ :À›kI–ÌóîˆÂ~¯ë=«Q·%>uóðìDØø¹Ù1Õb=YWâ,… € € €@u%i˜áÍÍ/ÚS óCãŠCu޽¼œŸªK³ó{ôWÓ¼œ ѤK+,ߺ÷œNc!ß=Û`±jO¼elׯ»óó‘ù u¡h{Ô¬­³€T¤9Ujóxc… € € €¨¿ÿ¸¶Îwë“nî]ç^çÃQxøUu¡(ŰRg¸y FøýÓŽ¹›þGѹ¦<ÝœòÆÜã@ú· GQ݆{ìLRÕäOkwÏùÍOÐqN?Áy“¶ŠØ8†%¡èôÜ—ydrQRšñçQî4¢Ü<äX! € € €À¶zku×nü{ó©÷På’:†tw_éœÞÜ»d?˜Gg¯ü¯…âúGÆ|®ÎdWÞ´r«^úã)lH‹±Ì˜?ùP=øtRéP7'Ú„®Ž-€ÉtœS³S†åæ]+V;×ùÎ|ð²I^WÂ=ËDMÓÇ]UišŸs¯1Ã7 € € €<P?‰:ˆ>ÞØ2Cœ6Me¤ÿÍéͽýs‚} ÔüdCÂài«òqþ!Gѧī·òíé Cv«tÃñ`—9ºÞ~HÁpœæ½§ÖÆ#Tâ$OÍO¦)–nj¥•çDç;÷±Š…¾/|ª|œH@5ŽB [éØ1@@@`7õDÝgµÑYÕ£©9¶ä†ÓܼV®h«Rá:ÝeF «B@@X[@½¸K檢u<ÝŸwiÓAºàÌs éè–ì ³ê}=6GOƒª}~ÞqL¦Û÷j±5˜#“j’§§XòÈ0ö?ÝœJ=N£)ŠîÎ*b§HžzO®ª¶TükYò§t_`<¬ @@@wzª\ãà–¼Åžú  Ó¦©Xƒô9PXr4yçOÿćUò±i ò6È8M‡9òûe2})0Ô"ƒÖdúi+· ©y„Wd¢ãÔw=1?×(à=öóé:=^à CûøKëV;¤)~„¬¸&[Ÿ•p#ó¨pgŸ™·øö©Vl@@Ø\@½7÷ÏØÏ~=ãþ?J›æîŸ;»ÚšÈJGwÿ½ënLñ¹Uÿðk¿?¹stYuÔç†bȃËdúré›×ߊ”_.S«‰þmˆ<Í#œ6$Giš° ¼ž!mÈé ôÑiPäÇœUÄT]ˆz<g¥—£1Op/s­#k£7?çpb@@@`suñ†Ìh uiÓÉú3=²i:º%ßÜk>¦£âÃ##öqÔO´:ë½?æ]ÍC PéðDzV[m~ ¡u7ñqÚ|†šGxðœÔÇbµA—yæqR‘è·=(­MyóãJ+ü˜ƒSj²éàO…y Xù•O* ®Ì«Ø,+TgU%Mê5+A@@˜]àÿýÁ»1£u ´¤Ms@éú>Iz UÐ>M+œö*àGótÒÒϱg5±d¢¼%üÌã„äiKq—5óò´ÿߪÒåõ iCHžƒÊ|Úãݶ²~spV™š!Õ­0ÀÌk¥]*1í‘“ÕÊ?Ž._Ï}òCç¸ÑQƒO¯&ß !5O© 9Šc<Ä™6·U€ EªÇAé¸Êspµ,/'NÒžè±¥¼oV#œÓé²px@æ]ƒô]¢¡úèNY›·ê yÆáW›N)ò¨U¸|Óþ)à=âDg]ç Y¡Ú„°× 7Ç+q²=TN7)§(å# € € €À@u¿ä_êy×ɶNÑÒ¦)&Çö,yäÔt\£R?§oü¨€±m7÷§qqŠíáhm´l¹PlmGuÚÛ…Ö-yêÑâ©>‡Áub Ò›DCÝŽŠðkýÆc8ay’ÑãØ=ÆÒ*Æ])Y½i!H”:‘jµÇ0°$µ ÑNù?¶i ¹±7æ]Ý|B šjb݉†¥@@@" ([Á­w„»þ˜iÓºcƒÄ£óV‡vê—‹O÷Áª6ôðnXÛQ´é Æ†îÓu?Wg“‰QÑb²óÇ•ì97ÏÜÖQÃdz©ÉÎç•Ü£¹VÕ8+7>G¼ÃŸ\2¯_)f…½fΑÖ2!J$>]==¶"ü±©ü›Êþ1yš"G)ÔûÇcn6ÁŸ 4Õ)D[š–E@@¨P’:= ïYU…@ð´iŠ®GC**îqz)–âÿ~»ÁÿªÈQ¹TWÿë‚Ã_¥èQг—²a^K¼å›Qö-ûürÙk½¡yݪ:>}ÉÒòå(Ò–}¾.;<ÇW<¶KyŒ(Õtd§Ç£·¬”<õxêI×6§ÛPT­ó£±9>óÄ£CVµ ›ÎG´ü„‚Ö£:\OO|ƒ € € à*ÀƒÊná§H›æ88‚Ï#• ãš½oܪ÷5ñ©¯²Q×_Þ«‰ÙKÙªT¸V¤i=£2 ¶G¡µÊôÝ—¬ùปòZ†Ôöa±Ü—Ñ5Ãá5îQBª¼j<ÍÁY¾‡7_<‰ýšôEmhø3c7ÍHEHéQÿfëü©Z@ÍOFåms"€ € €4 Dî+¨¾WkÁ¹Ò¦)ÞÔ0™7÷žðÕ?f;|FOËŸ61ä£íA¥Ð½vÃ9´±-|`ùÉE´Cލ| çž}xÉh^Á¥¡´ÑËmB•Ï6ŠT âò,™“4Äz r\E^ìeÄŽªk©%ѹÕ#B^”džD¹ŽW‰þ,ÜËsÍ>_Êß鹂—í_"€ € €˜¨k1rGÁ·Õ3¦MSì©Ëq`oŒí{æÚ4*ÔêæÙä#‹o<{Ù{ÜèÓæÉÓQª¹òZMŒ:Q§³:Æ´žwÀØnEkEjž<Ýü—=i*ö1òýfÐ5LœU¬Žªk©ŒÌ¯CÔz¼Ãëtør[~á÷tÍ-§Å9Ê>7Ÿ_OXÕtóÓ4+D@@8 è>:HrÄüæt–N6žs—Þ1ž §f„«C×|ìŒÚ‡ Ïêï ­ƒG šw>ê´7¬ûiU£äcñ©Jš'z^^,CÚ’kx‰ð’ëcÁ-3ƒ¹§Ç>°dÞ ¦°©8ÅX¥T6_á¡ïåÕ¦ÇSU*»àéÅva=0³y#¡5V˜™ŸÊ_ž°ø@@@ N`ì˜Á·®c÷A}àê™ñÞY‘ó²#kˆ§SïÙt=Kæ™Sµ*;`O±¤õëZ¹û¥‚¤†OÛóc{7ìIxT·ói7Ú?Æ þk<˜—ÚËÁ§í†§5Œ"5çu ×Hò¢åT²íÇžpã\EÌž<5•A ­—á¡Ów{à½\CœëÛ—ܪAS°m>ˆþ%oÏ/ÃNÏËÀæK@@@B=Ï-sÏäÓ¶H›ž@Z>ªW­0ìͦ–½ê¼¬GæTiýP¹EÇ ^vÉv.»±›³ê†Í•kÔ™%ï€ÕDä™*¦yu¸Ö+ɼžQ¤æ %ÆVÛ[_ï9Õ¦¢¶'P«äévXÇë‘Xw1¶íµŸíY{T³<°‹¶iÕVŠcÛš±6@@@`õ¸ŽívuÈþ¨sI=æýÞ¢7ÔhÓcÙ…êù<îXŸi¾ž…ð€h]j âw½²}Ê.ÂVÌG= é´—¤yˆÿ§hÑîÙòuð©íúµ¶Q¤Gf~,§âØç£G;\ñz[CðP98«@Ò›ŸM¤¡«e]ä¼,nÍi‹×ÇH^n}à—¶ÿ΂ ,ÄÓ¦äº7·ªþ¬@@@ N@÷ÈÁßFuº\é£nÕãAÚÔ£L·íCS©SDÝôXz”`É:º¸ßuÌ–ìÒó˜gÞGbêΉ7KÊô•âּVƒà2ò@Rs«Qq^~³™K*<Æ>Ñgç)àOµ©°DreiœèŸÍ#M/ñ'EËÁM—fn–ä©ÓÀ·’,žÑ©YÓjÛƒªÛN;ßø±Ûn³!s§šØQ,Ž € €P?ä>]ýæ·œ+$mZÖ‘€ÃIŽêi÷èÀ¯k”ôàúÀîë#ËÓi§!Æsõ >E;ÎïÑ=6–6Ožªp=Ê´®ay·Ôðä©GWsÉ‹FUo®iUj§SêØ‘þN•¥ñ bu^s­hNyçB:§hÔAMT1ß5°ußOtàìêU€!¨uaÏR € € °¶N¯÷®ß6uåµ]yÌNQåLÕ/ªš§iRŸÿØlWK¹; 1VÍkòÈÓ¼ Z+|´æ3“ ?Ææt>UlŒEsª)98«FÌ51íñ²ÐÂç¸tumUÚ¿~ò*i»Žó´òq Ç53=©€ÇsAÇ a@@˜H@½+c;&½µ¬ÛmÒ¦un—rê¯ë^ ˜3Mm]á(åøqÓæé¿ed>Òy¤ž]»ë?‘f°Ê;ä‹á™¾’£>Íã—êÊ,-H=ÚÇuŠ“~éø±baspbi©_yY¿ó»S S˜t¶™›¡Ò„—I5<­Äü÷´~>N* ž«äTAøˆ € €Ì" Gåõp餷uÓí6iÓéŠ,ï°G÷¸Z‰Âþ=í†æTwœÓn4¶WÚ«’_˘a'œž´W3»üÓ)]Ðj0džŠy·áØüN¦_¶«±ÙI‹G uÊþ¬Ñ¨ž¢Îï óJ_ž¶Õó£G¨o¿>·jÄœ²OÝÈ­|oÆ ÏuÆ·-…mrϺ¿ü¶Ô 9U“kV‚ € €ø èw®üyoQI›Î[viϺÇ?vñEΙ¦¦iêWõžÂRí¡S{;|åéHm?:¹ ?=YårPMÚ«ìÔúe––‰¤NñáÐl §á™Š=Àc»«O׿”\ho­ÞˆûñZ婘æwz0£¼â8¤Ì+4.Bòt þ›VC¤jÕr¦fY@@@`.õó Ô3Å cûNNš6]f,a{ ¦5˜¿Ö,µïº|ÕS¡¾Jý5ròd8 R9.9Ž,Õ´ýÏæ½…å½úV —Ézœr&[R«ÕÉd¥ë4×(j¡ÙRS"çàNUýÑ#yê1 Yw7åg3—„ÇFcE$“<­@Ûp† V·Ÿ,ˆ € €s ¬4R,òÝë¤iÓÌê€RWgdÞþûæ”Ê<æÔÔé§Þ §~xÃfJá1]÷`aÀ8eÉ…!Xˆðh6­ahåUE0’§9t:ËEj"HòÔÉçQ&(VÌ LY Åá—+N‡fÒZÕVó·";U™òýôËæ—goƒTU’§A "þn(¶Í¯‹¬Ú(Öƒ € €´ ¨‹©¼c!þM\Ø=œ:mšÃÌc AØ"+Ù1õdfà }˜%gª£V¢ÀX;±î×5dÒ^«=çq¼¡ÿÙ<‚dúêÂÃé鑯¶4©šÄÆy·x¬‹™¼”S¦,¡½Vñ+z“6ð]\=ýþø”W.Öê š®%žîÃÇù•Å.ß%§˜œñ))ÛäéØúXÌY- KYúû±‚3 € € à*À€ÓêûÄò×H›¦8Ô­ñÚ9²òbMsª»Ïµ†_ùiÓTж‰Çb•¡IøÓÐõ›ß©R<ê÷;:’§G[§\ñ‚TLÇÉ-:=E “Ù“~Ãù…3üBÅ©^XvEz¹ˆmòÔãõzºãÑ%«ÓxaÅñٜbÚöšgööjŠ"¾“ºösªA/Û¾D@@\ԹĀSï;͕Ҧ9é9…G_Ö;¡£Vx?ê–<¹M÷ѯ µæé4nvØ *Hÿ3ÉÓSÑ|j•c:iÅGÛÄét`›ºª8ºêEÔÇ®KÐÓá~~•â”A0i cÒ0Ud†WõhýÆ Ïx¥d["ëducÅ‚OÔL¹6ï¹v3 € €ø ¨kqÆ{ù§wpç×ÍcÀ.e“ˆ>¦c`±¾Ü´Ó›{M Ë|%*}u‚-6Ròe±^¿T¥6÷Ì+\¦kѶÇ5ûh"È9‹äé©j¸Ö‹c”OÇIžÊÊ<`²ƒZcß<GüªÈNÏW$™á—(:À\F¶&m`Àä©Ó0ä§gU§¦,È;ž¶ ¶§ò%žà)é>óëÁïÄgÛ¨²6@@@à$ n%îa]o`Õ1µjÚ4ÇÒÓ.)Wðá+W/A–YuBí†Þ?ÉXuת=cäTûœúÀU­âô?›w †Êô ´ð£k½¨hTC‘檮3æOFef¥À ãÖi¶à98À4Iæj% HÅûÌÛö“ò.Îm“§ŠººÝ`©y¶z²4Ÿ€˜@@@©Ô™°ç±>÷žêpê{‰uÃGvô)Ðò­¸Ž£XúäLO1àÔ+žŠxöj¥>p¿Š§ëÕ¼‘•é;|áG×zQÑF#5™£ÉDùS5®bQ®0hýfsj­rp†ÉSC§ß~ú0’ßSp&)fêG+!yúˆ‹™_ ¨:µ‡Ç“ Ó € € €€‰N_ÞÙ™|¹OÚ4‡"ƒO‘³äóÕñ±ˆó´Ç™\­ÔË4iG«|œúÀ…!!’À<û-Ó—ôÑ„k½È¤p"©aºê¥ÀùSׇ+2‹U†ñQðgvÊÁ>Zcx¹r<ðºi½Î"—áDÅýŽ!Ëñ@â¼3ái‘<}*ÆüïlcéX¿˜F@@LÔ«ùôìww@|Ø0mšbÒ°+ïD:ãGu ›TÕP+QWô@ÎX|öÙ©³7}´¼O!Ž_æT2Ã"G’§G<jðiÀJd6¹ÅÈ‘›ë>™S=|’rÔ„SN ¬Õ&2wI‰f]fä¶š¨«þNããæý±Ã8QÉrÚXYf_\7Ë¡ž°²jmX € €,  ûßy‡2Å¿[tM?…Vü궇޿ã6*ÔÉ»¾OQä1ì'?í¹ÓG×f0Ô°SÚv)«^×uõ;eËjãt$õ|šNª‰¯÷”7é4ñsp†-XKs¡e=Î¤ÊÆV\±øn$¸¸aœ¨ux l:ˆ€ÎM®×Š£î’Ø. € €Ì+ >õ×¹iZu7œº\¦ˆ:XÀ~ÚQ‘jà•yü(?Æ•ºèÍ…O+œ(jÛÅzrÐÇPÃNæÇ0ÓwŒöòé8m`LRTѵ¾(y!‡˜ÃÆi$æõÀ#œ¤œ.u­•=Û'¬Z°ÆZæu#=vf¢óø5®lÛ«ëúùfOÕP5hלo@@@ÎGb«ÏéÎOÒFè®ìSÊ·¢êæQÇÕÉ žp§Á,v8ZŸüÇq¡C­ßïÚaA´a§ *«ÔC®}9×8ºò> 3ÝÍÄÓ=ï0¿Sfí%‚Zm®ÃAÝlBíƒmþå呦/x®x͇tt¶ç«“WKÃåôRõŒ:5\u™Ü›:ÕóO¶•·çž³­àj«W}WÏÍIŠ?!€ € €@e[¦¾a~Ówݽž=¢OÃL=B dÛrÜ[„Ëk¡ ùÆ©7 ¼sê•=–fÉ4éòZªõžWÂ:lý’@‡œ¾ ©Ë75¯‰-9ˆ›ýò§8ƒO‡þÇšÏ}£­Íj@´é-d>ü oY™"guAXÝp)&=ÎÕ t§L®âÿcƒy«8Q%"r1Í»oººëyŽÈ' &@@@`sÝín0ï­\õž[=Éo½)mšŽÈõ×ÖÔGZí¶Ø‚N‰ƒ<˜BåèÔ7û(ðÔí¤§zlüôɃH;`“®èÐëUÝîæå®"vÝáÎ+ÐF©Aë|Ôå›óHÝ4àª§ŠØžmˆÎƒc ÈEˆSN˜åÑU2§UR¬:yjÞ„¦ø¯¾,qÚŸ aY/籊•Nu¨¼Ü1¾\F@'&Ã0»9ò'@@@@ê" 8Hg™[¼ûÑ `œ TW[«xÜg¿ûSÞ¨±-ÇŒ0-§0Èšpêè{ºçÚ¼Wð‡ìCŸR¼ÅLou+ýžyõTϨ¦w ¼ºžùE/óúÕa·{nÂ)ñˆ½çñ>Ý–Gâ¨þê$¥3ˆáXT­ÍéÄWrPqÎANao~moõÌOÅ…ŸNagÑÓ:˜çw:‰+ò&& y:iÁ͸۪†VíRÉYƒy@@@`7œF¸U;øT5§üÚÕİ'äTÅÔfØ{Ýó‰¾Q7ò Çäã5‘¤NH}i²òÆ•¨uxRo`„ỗ¨¢}¬æN l§ÔÀËðÓ‘† *w*µQ«U”¾,Öž_Ž:öÂíFè(VÖIDOóª›ZDA9SUÕžÅzÚVœ«_œöÍä£GÎdÇ´@a´çÙ<.Z-ùeö¼'+™0l£®W°AŽ‘Ý%àT­Z<Öƒ € €3 ¨_¥¥Ó ÔMÓ;3dð…b 0ŸâÔ¹—*ŽŽ}49§Îä—¹$½Ó浇 §Ýï&ÔAVbØÇXÂ^^åÛ}uJOh‹%;f8Oa›Ö~€kðèß«Øà‹ô™Sø÷ÑãFšîšž°Ò?Íä/ÿé¯ÃK6ïs¨ŒŒÓåŸJÁ<’3`ãÄÓ}Ó©¤q‹/oL ;UÃnÍ^j×}ù4TÌcžÎ" [‰8§˜ºhg)@@ˆ# »Ñ—ù”Yn‘ÖÛÏ΃Ouƒù4Åà7øTõ‚Á§)¤:Qß•µØ]‹µ¼ÅSWöž-’ºIË•¬æLÕß\CM=F •¾â9òÙAgÞ’£x4Oäã­Û7µWÌg®ÛížK©ÝpJܘc\¡Yñký*ÂÀ©(=rpV¥ù(#æí' §W…èì\BÑ±Š­çQ¨Ds¸îgçǯ ¶ß¨awº2 iV… € €ÁÔKÛíÍšÕÚúÜñU¤MÓ*lüb[ÇnÅ8õzœºãî; 5øÂ©óöQÀhtøS_ÝÎ{$Ô å•âT¢Ê$ þm­JY-LáÖÍgS ã¬ë¢.øR£Ha'íÞð³yýí³BµYÅê˜q:é+A\½K7 Z•Ñ£!ŸïgP4žøœ®ØÉÜ”ÔØ?YʼnֳLòT'9’uMª-æ[W£ª n„¬ @@öØvx—ù­™Ç ugíŠÕiÓ|°ºß÷ÛÃàYŒà=átËÏ«nœÜ«ãWÄ%kÞ³r­Y…ìi@Dy‡ž"JT¨§WEæ´%{~œ'~òäiaû963X¸“Ãg«t¬zMGk%&ÊÁ>AWþ §G›©pm§³Þý¥Úð6§p µr…<›Žâ0ªûkw@y=1üºÚ°°*@@è#°ÆóÌïÑ wÉ©­=mšŽÑ°ëìó:vCÉyWå%Õß©—òZÖ÷ߨ‹iî²ò T?Oäu*íŒúôO!qü§<©¾¼öÞhŸ¿j?ËÁGÍéQÅF‹÷vÖïC3\¿Óù¢Oí¿•€g§æÔ#)cxX˜<5Üâ1ØÚ¯6•{=®ÐjZžaã0pUV ZOa¨ <ØûMëêÖUAã èûØù¯ºñ1 EV… € € è~¼|<ÑÎ÷YÃ]ý]¶qh•6Í2®òzt÷å=Ÿebl§œб/ÌÌñ¯HÛ*$ïÔ‹žIžhï ïÓ><-wvÊ›”Ô‚òŒ0ç}Ï|Éñn2OÉD TÉ\|§œa•,Ɉ)£äq5¢u¶çªô‘GÁ ѺaˆS*u;Ùa©Â+j]û-SôTm¢° #–U!€ € €ÀtêXkï(xt«ÂÌ-V¡æiÓtPæéÝc…š%ÒR¾%Ëztʹ0©æÂ#Ås,èÂéÝ:” »¦ …טM™‚YÎq5«¤I™t×gun‚:.«Ë†“Ùÿóêb®œáª$#æ„S²éû@§§êPx‘v¿{Ãÿj{›Ð^^£@”}'Nwm£?ÎvUa“GåËÌ € € P@©‡öŸõ‰sû³Éž´w;x߀»öÓ®ÑwÔ«5PžlW‡U[ AuˆðôdµKŠÒY2§j<ªvckyqµBVqòh=‘MÞí›Gh=B‹º9z·Å§ß{$ÈT”~ã…Ÿ`ûü†ÉÓ–KÖö)_ƒŠÏõòxìí^¹ÃDsê,ç¡Ð—9_"€ € €€¹€ÕcÕÝû¬½«7ýTî£KÒ»ÕA®c_»pKŽN¥\ x³`K—² Ý©çðf‡ßýi‡§ñow,ËOæ´¤õ`¶\3Eát&uÍÁYåtì/«§‰ñ¸ìQVËêa§ë^Ã=| ÛùKÃä©aÖÛ A¡Õí:MµƒWKÙ–£ÓC,Ë_‡s€ € €L' û©–„ˆík³xÙK£>–89#×¾•ä¤ëqzyVÛâ´c ï]I®µ¬Â|ì"WeÕ ÞX Xøª,» AUƒ¿\^^ݵ7­º>t=v«ä黌˜Ó¥…ž"°bqJµL´å††o6~*å;ã:§n½=Òý÷ML¸å7,Vå£ûâ}óW@@°ÐM7Ɇ·Q¡VuÌ›„J›&%§ÀTAëMªˆ+'^õTìÌiuÝ8 œ©hÕãºvxl*|–Y¤=ï c>"°ƒÀ&CPuä:îÒ0T&ÍÁ¹&O¥§*Û+I§ËÃô®a”V¯Ê0 9yêT‹ k›GL«Cô´à†O†³!€ € 0»ÀD=E§û> ¤ôYÀ´iÞ×´=N=uVO­v‘5¶ÆËAõþE­FïÅU¬‚6·]L °€:‡]OÖÞ-ÀÇõk€íD NgvïœÕø¬kFLñ© Ý¥ütí°áƒUé‚üé>|œ_¾XCdxeó‰)•ÕƒÃã~ÞâkXw” ÷h…îK¿"€ € €€Ÿ€ú^&ê)2¼»ÙmUº56ìü1×sêMJÇvÈ€ù±wX¡Ó“í†ýQ¡^x¥ãŠ\Y&Ôh_¿SÛuÍkkcT°8å:_¯—Bîɵä×V®ý›9¸öLk¸&ORQ¶©%‰¬ŽëYïB×J«*oßúÌ© ŠbÓ>Ì2оO¹˜leÛËìc‹Ä4 € €k¼4¹ma%3 ¸vÆnþ„€SnÚ¶—UùJ×xÔhëмGß ¬¤¡¨•KÝÌÓ¥EÆ›F P`¥êŒÆ©¥c»Ú!wÜ\Ëô©Ôâ?$–j–ÕÀÛÝzW,†~ •Â&Îo6ÃC;…Á£zØ`ó›#¿"ÖevR~ÌŒ € €Y`íÔ€ßÝköpJð¥˜ïÐè'c²æYÞï§@µN¹¥;¡W8.<Õ©«yl‘]·®º¿p!š4¬j¸ÕE§Ñ¾¶÷ßÌ›>pÊÁÙŽ²|W÷%Rþ×cFLC½<‚PN/¡úK§ñ †ê] » aîé*cW ¦ÓÕxyÅÑœª,ºK±ÃÖCÝÑ<ŠfF@@`suÑ™¼Ã]ÛtÇè:ðpóç«2eYiµNÊZi¥ÕÅ´Þ€ŽÜ2¬ýn1çæµ>4¸ ¨ÑÖ)&BR ðÄ¡†}êöaÞœB¥°Œ>Îv̈yÄž‚Äü b˜<ú)\kzÏ•Z¹Š ò£óª,j@zåÎÛ ’.?6L#€ € €À½Ïšî|üØuy½-õHó÷<îž“­z[1œÒË”BNÉ\óNTC«ÆU…¢n©ãyٵ˫±¸Y?µ“Á³¨£§=œýBüRn65Ñ!§‘­Ç-¶Lç½uÒð¸]r/¼d.Ìð!ºã©ïU58ºi‰v«es­¹ßaþj+ ÆÄªY € €ø (Í1üþÑöf„µ­'àÚ½°pþ«$ {¢ŽÍ”ß#ý*/ “?nkà´ÚO®Ô’‚ë0zöœúŸ;™†Ó\‡€aÜ ¨õV“â”*ªkUÔ8ø­î5ÌÿêÛ!gž<5\á1®t½d^jóŽ6§(Y¡áåߨ«•»S…=FìÇiœ–Dß< BÝG|,&f@@@Qº ýI{¿;ÖG@=®~udóÁ§`èaë­êm5¤ §àuhNvÀ;­S{>¶ƒ4N+Êž G@‰µá:M Ih£Ú´Î}+]+|jýL>ʪCØæ:µ*«G\)Çá0 E“’:­dÕ±„k$Oƒ\Á*H×ÕDG±ÄÌ € €,) {jú–Ûï§tã™ú÷ oäo;tñUã; ¬HÕ|çJ¡,§G[§>Ìê²~´ ž:¨è]÷8ä´N§^ÖG&Þ3«õs꣮(•¾>ñ.tÖÀX] éŸNXjÒôõÿ{¶©h9?.Ò-g˜<ýxP3èã”lrº¬]øÍB†÷\[³AÎ³Ó ýéætþR«[ÑF± € €X l>Âîé]Ìu~Ý×èþ×/Sã×Es=–é¾Q~Óª"\׳sÕP¯àÄä§þÆkèjC:¦2šz?vèÃW•T'­²¨ýŸ–—°J\)ƒn1v:¾A"Ìžƒ uúÎçñ<áw6w:u.ü4àŒÉSG„Œ˜.Õ¸^ŠÐ\ßïƒÊÈ©=Ï  € € ðR@wè}Þ¢yS0é_½s¦Ç"S'Ò¤JvÛõŽráî¦Eã4аs›£QHN]‘ÇZ>½U]V#éHU¯©HUÊã™@MÔÙ^~Vz4g·‹¢ÈÉS¿ó¸ÓK?”§[8òðÍÌÝ”TÊïKµzÒlá¨XïМ‡›ÁŸ@@Ø\@7‰~N¯wÏr<"Ý¿ô`˜ìÀ±ŽÓêÊó«Ë;>uºOWNöX|¦Õì”® <µVgnQêsÖ?e<Ÿ6¡š?åIµxz?'Ã%:Ô63 8¾ÕwÓuÖ>žë]œŽzáwö* ¥Ó2­k ïð2„PGÚí)oÒ­Ö¯ i¿÷\µÔ–E@@`=¥„èy~zÃ%1õGºmáå½7åÅàÓœ–?9=?¤ñQÆÍépêNJqh‰e•G¾ÿ‡’;ëD…ÈÁ)¿Swnu]JW~Y'ìœv~íÓ¨šwò4BæK¼v&}áV=šê²SónUX € € pßôôÞJ·*Êt ϼhžîù&ó3øÔ© ²ÒzÁi‡ïW«Šª?VODl8õ¾Œø+ €@‹€ÎtN·*ZsËŽ=Z6ÔÉ:{ºÞ@9Vªå‘üt3çÒiœpMž*rw¯}q šöKýO6Sïp„pjHÖ€ € €@@õÕóªÞ§·KêÍž6ͱDªå]ñ9¥ù’ü¶½ ­™cÏpµ‡ê]„äïÕç§FK•!¨¹h˜@hX#0yê…tP6êqµÆ0._ÜêêÔé Õ í9]y11§­€:BÝËXUCÖƒ € €À@uDô|hÜöaÈÚ”hŽÖ{ÃË{ßEƒOßÉ4~ïto>6­­ë ü­ñiÓ AmŒRGHN®sp:-žN”c?êZÈõJ+w:@×ÝŽPé¬Ü<Ò‹2\ºÜåÁéj¾ªÚN­½Ub= € €L$àú¦)óÛá+Ôýˆn¢c–¯ÇÝýpp“`ð© ãi%NªZ¤hu\£N–ïä™@@ †ÏÐz_óGX¿n3'úé ÷eÌ8u@¥½üÛÏ^’êK§Üb„7÷æCV§Y¨ñæêyëüs™‚ @œ.úçàtAäNJ»Ñá÷"Æ ïðÊ”PÉSÅ­ë3œ%•BµÕ* ¿’e@@"èÖiù75ÙÞ©oDhÊ®|¸;~®wŽ{š«v”‡eùœÍñ²G}¡×뤧Ç9Ô> „í"€L$°LÎ0#v:«>ýØçIÅeÆ ÷¯,†¡Òx…¯KåáÏàñÞ’þm‹>?mf™@@κïð˜t´›…–ýÑFç22Ù/ï}YèN#/R‘)™õr£ËéÔ#03í—ƒôPG¨!ºË‡:ˆÌ+ S˜!³}°ÿÓ˜†±–ëí>—|NW­Šyø|Ï C¥%yêôÜByôª¸û×ÓòbbΞêrz£< ™@@°ê3Ñø©ž—è³okø oK,õy$~º"fð©y‘9½¹7f« ÕÓû-Ó|Y† š‡4+DHYÔö“ÑœaF¬Z@Þçù.§ë+] /ÞùÐ C%¯óÑ„®u…Vf& j¸÷TjËÏðFÆ$ÔY  € € Pzz7äšek,ÍÂÅ[ž”~Ê5ËüNñ§é3!µÓ›{5 5Ú‘æý‰öæ+uäÒÂçÒa@ࣀºÐu.kyhHÎ0#Vx-}MnyMfpz³Ç&ï ÒCײ«û¦¢4¨º6«ÛœÉR\V”Ú>‹Lý|¸Ia% € €dÝ=‘D{z7´@æTÀË{_–»káîY×6ìßS~ø€‚Üȧ ÞÊþ²¾ó% €À@Ê¢VœÑ†äàœcžÎ§7•n¾Á4üÓ†O¦êiU†¡òtÇ 7}Š7Ruî38ú© óÇÐÓcóû7ÌŸ@@è& îtîžžÞ§¸&׺}Úîߟþòó3øÔ¼ˆº‰âGo¨'·Õ2dy8±B@þº:ÒI­ðñF½Âéz£ðâ\çÙn/Au:ÒøWVV‘o¨B/ß%U¢ÂTr³íSÄååœ/ô„Æðp­ˆpA@@ÀJ@OGw»ÇyM>ã—+eNS í9ò>ö\KyCp§|ô¨¾Ùûà9ýuxÏCÊ™êòÓŽñ@ ”E½§Ä¨UF¬îV«çÞ½Ýþk©!ã…+‚°}«P)ÿIŽá¿é DØ>åÛ!¬Aê)ªxí@uû € €Äà'ð*n´ã„öDÝ/äÐOÁà”ìKå^ÞÍrÚ«©?:=º«åçƒeT=Ý3>‡.;`+`UYª£—@@è) Hô¨WÜSèážÅÔs[ÜP_ãÁ§W“–oœ^`;Qèª'ùe³yMW+žˆh W–E(Ð NWMº¿Hg´9¸Q)*=!Öó´ët:Ñ5Uyp¾›Ó*ô1yÚíòïÝõ¤êcÏ1ÑïÀù~jáã¦ß…7ß#€ € `+À{êî\tç›;…lK$ÈÚ¸­>†Ÿú•øÇž–ÓÎ,ðÑi0¯Êh"õ¬ZuÖ]Û r¦E»Š,) ‡3•×ør]_]ϾÑmBÏuº@Õ¥ZÏ£»-«ë1]}݈ÕVªcX;Ð3­CÁŸfþ@u-`A@@ tÇ TÅ‹Ðú +,GÙt€ÄÆ)6\{<6ÌV;½¹wºqô*zÃnO©2ÎôTsùˆ °§Àä©.{j;½³W—=bø¶¬Fï¾+}ÝU ‰Æ|“È€Óá1¶Þ êÞL € € `.0ð9ðÙïÆÞüšG»¾»ýŸ½øª÷_wˆ†I®»‚ªzÇ&]ÐéͽêþšD¡ÕøjAurÊs«A"Ó•2;Œ ÐY ÿ{ÿË9«¬ßéºt·ûD«Pyy÷¤·ßÄ©à^~äyéÎ-ÏV›SÌ¿Œ:¾D@@`RݾM78+Î=È,7zÀ¸}xì†Ã!ï#͵ôwÓæÍ½§`«è[#gz2ä# €Y sÆJ›ëü“ßs}$Ù¨ ¿ä©ë½ÃǾîúGEÔVÛå'P?ÖDf@@˜E@íˆg¥{§tOuðèN_·äz8\y·ûÔ›zWÒ<º»Ñ"zY‘ðq»¼¼÷½~T*‹þ£NG×ÿcI~ŒÒë ó>¢+é¾SÅT-¦%ï±l@`"ë‚ë7ºÆîŒ£-zцW¤%W_%ÔÇ»ºNsºÐ-ÙÍÀÓÎõqçÍ)Ú;?¬RX ˜ @@rݪs~ç ûÆc·º³./²Óœº+Ñë¹”²Ê›h=Z›1ïîîõ§F´ÅÈ©P ?ÞgÀ“Ôá8uúÍøæÞcáªçíeÿ9Ó£Ó €Ü ^¡}\•U÷;ãñWmôãŽUÌÐ? ìóhV·xùJ^†/¯å*Š£bmú˜Æ}DÁÌÔ ¨—é]BE ³ € €È‚ÕÝä¥tÚ¹ÈòærÎ4ïŒÇ„ny^&Rs?€ÇF§[§”ü:CÔu3HË 3¹á„ ¨e¯",«Aî¹ÿ!U«ç%"û€ €@ÃK‹ûUéL­KšGtÜ„ÓE”Ž´ÿ±kÈ´aòTzNIíû ÌÕ±ìöÖå!1ÃF_ 8ý so&@@0Ðý†¿¼ž¯þR7¡b4/š+Ôý¯Ê®'†ŽWÉ┾áå½§°aðé ¤å£SÿÒ-žê༯ n‰ –E@ Q@—²/³­fòœ¡.u¬öÿ¸ž!Ch˺}q«ä©®Ütßtôì<­h×` ´85M«›C@ØD@wp Yj¹þOËöŠR7¤+æd¥®'å ¹?²(—í—IWïÍq[ËO;Ý_ïÙõ·|´p€ € è*ºÏ½Þ¨wûðøYa$”Ìæwaß'µ=òÊ-IY3O…âuª[åeC € €£”ˆé?h±ÃyçMô|v]¡¢´éãæ:SÏÍ1øÔJ[ ”SóHÓgUF¬@éú$O•±"ãwo²çå“Óµh·ÕŽÊà ~6:…€Z’ü$Ý*B@@ \€Û(«;‹nÃNõˆ¦JmÏ^ «Â곕‘ßó´» >eèDŸ e+ €ì#Ð'y:j¬ŸÞ S~KX>§nyö‰ã‘–E›“wLË‘éhÝzQ¢ULö@@ ²€Ò: ]´ºwð{´ûB¼mɪÈú¬‡Á§Vμ¹×J’õ € €@ІŸ®´Í?üU §!]ÛþÒºylôY!ÏÜÒÜÅpºÑëSÅØ  € €ÀzÊœŽz :þÕ{Åöy`RƒïpZQ:a𩾟$uʪŒX €s ¸>ä¦ûÇï qz°S·s±áÞN×! §[m(ÀªðP¬ú½²iºÊË#€ € ÐsȺ¡ö»ôÝmÍJ¾t(Í®ïV ¶ÇëÚ/·U—ˆÓ# À· xÖ† €À,®iJ ¼áâ½æAØávÏpºlæù@ó`…®z¶ßi¼¼aÍbU € €k 0zÑüšß©wâ‡äwÌK­Û ý†L*BŽhè˜7äôn½­ 3& € àš<ûz[§Ä؃±Ç[³ÈÓÊÚï\Lcƒ„­7 èÆÙ©íŠ\gÙ7@@ zµñ‚–ůz'’kù’9½šÏõk×ÜVƒOÞæ4p`È\‘ÌÞ"€ °˜€ÒLº?2¿ÀÐÓª¡4€ËãÞD·<jì¦HÍ‹‰Ç¤ÇÆ [7pzÝyuc… € €+ ƒ3¹˜?­D©+× ¡ÔNà3~dð©U©9ÝJóNl«b= €L*²¨&WõJ2Ž}cªÓc{Zí¤…Û¾ÛÞw|í§¸ml/hÖD Ã«½Ú+k@@XC@7S[ OëyÍï”ÍIÇ-pÏ¢tÝ–S/VŠ“}j·:6=Úd½ʵôY9 €L! ¤§.¿5|¯åzcø…™Ó[q4úrŠBôØÉàÉSýïQñ(wÖ9P@M±ù;Zv–E@XR@·Ï;ßêz_ð;õN(•–õÞyÖßM€Á§VÔN7Ñô8YëA@`”EUNêéíáðá™N/˜Õ-ÏÅZ}a“§º0æ *ÕÅÊ‚ÁÔš9Ýú=mØ™@@`I¨ûÚ¨àä»çÔ;¡PT×X:Ñgð©I‰8õ¦ßɤtX  €‹ èñ*]$è–ªäV1»,œ.8‡'…ÇÆUÌä©âg¤Ç[÷P—Haó[ÒD3 € €Y€¡‹ÞóêKÉÚ¶Ü{—]ÿõëÖÏïÑYŒèDC¶èôÄB„ÞÎ!žl@þ{çŽ#=¯¤éÙBm!·P[¨-äj ¿òÚN»½4ŽÝ@yc—¬2Æ>@­aÞ‚Z™©¤(F0H>?>üP)%^©¸ð’B`Š¢nï9A7Ò6#T-¥™Œž <<œmÔÐ$€Œèƒ[©—uÔ @€@XHå ùgìå•"ZØÂmW% £µ“PÉ«S¥Rþ™nû-SºØÃgع׿)É€ Ð…¥ÑÝk#Œ/N‡7§PÁSœµ2ÉF&`jG?´ ¹ @€ Ð%Í7þü¯ÏȪo7e³5_7|¨ÈŠ‹OW@òþ4²•l^yx €  LQÔi¥g=@8ÝÀH”Ï [R%‘AaTM’…@dòqet^ @€ÀL@öûà»*¹)üF3‰à¸µ`•ŒL}/ƒ,>Õ7x/´„¤ŠH) @MÐzÏ ûWL‘Ü‚ÚÑ”TÚUS>±½¤©¢êWlh²N@]Àh”Kì†<@€ Ð.íáƒmë¦ð[L}”-À\b·¬’‹O‹`¿ß+¯È¸ÍÌ“"­C"€ ø`Ï^;æFKzÓÕW#Ñ®}I¹!²×äõJï;< @€ ¸ýÜ0©<Õ~‹È,;õlÁZyYHÎ<2#݈!°V§ _@€0 ðE8Ëõ ™ƒ¯krò¬iû_hn­Ââ«Àë艀¼^ÄOýÇ"r„ @í±Ü“>ÜD]t¶Qq!üÝDÓ,¤ZÙn»¡ GnDôòuvî}‰ˆ @‡€ÔËâ†É” ûiвÛ—É2;zœ.LM÷0š.ò²Wò @€@[´ì^U“ç(ÿÒüÉã¥"…&-œœ®AŸ²so¢N!!@p `qžˆKï 9 éÕU<,8,”-­‹¯Ò=É€ @  ²ª ”ÑÏ—Å(.!lºÄÛ÷µéâSEû¦7Õ®¬±¬±T³—Ùmɡހ þ­ŽdŽ®Å^C/­HeÊ‚ßþ:)5²  1ªøœö—=” @€âPˆD{WZ¨ ¤™B ¸„OÁÞÍ3¦‹OGðt•:Š˜i7}ŠŠ@€Æ$`·g¯RéTkM«+nñm'¨0‡ÌŽ,rÔ=ƒ€|bÄO·~… @£Ð¯ƒ³zuÁW,Ž\,X<’ŠO€Å§ÇÛHÃ`öȯ 13ŠoR€ @ .©4ÙÑÆ‹ìÙktHÄ3æÒlYpZ·+‘{£dÓ1 ŸuIîC€ ´H@K¥Uk»)vñãoÙjµ(RŸʱs/1ÓƒÌy+[ý¼¸Áª F[ËŽ°“ÉFceè™G à²Ñü—?5Ú½üH¿æ]@€ gDN_jΞÊéáPl²E€Å§›#}ç^ME–Œu¦ó:ª؈cjsEyž7þé;ûìŸóÚ¢YoT¾ÏФûuÑOªï³x.Ûê‚J àI ]šŸ” mƒéY‹hy™jé+þRS9‹'šPžF ÈW¶ê_ü @€ 0Á'ÇÑá žÆi‹¦K"¸Ýð5Âp±½AÓ3%ŽÐt¡ðƒßx jàšƒ†s`Ñnœì>å™áLU„'Ôøêé\T³{F $Ÿ¯kª¢/?=ʨ{¥‚ð$`4$.»-×€ @ Œ ñÔ«äEðô=Þ ˜Nka/è‡Ö±*®ûÄLg1ã Lq:ý_½rŠßÉ!?Eô¶'?TÃ:.ÒcUëLͤöšÛ®¢ü5 ð’€ÑXªåí/³îõéZxk=æK_Õ0Û+CêŠä7³î¿¤@€ ‡€Ì7TT¿ï³–©[V<䷼υ;#0ÙÞýŒ EŸçž(”`2TŽÐk¨cuêzsd¨è< u¡Íf%ÆZ½RLس×B4ÄYçRYõ%µ(õi#r@—¦¤ST®r¼ÚƤ<˜B«ÓÚUETEÑírx¡R><µˆ¨cú”?`.úÚ ×Jœ/`£S¤^ ÈÁb´±¹Ý(AÊ€ @‰0¯"«ñ‰˜þA®ÈÍmZ6yQ,_“ìÉMmZx‡â˜‚¤ TMË¥]àJJÿ:ó¤iOàID ªÆU(a(ê2šPJ™YuTÔØtÄc®l¨ŽCaF ¥×tX#q@€ P…ÀÈÛ%5¡Æ—rPÌÒE‹7ÑîF…dñ©X’…Àhäø%H:X¹è€À2¨*ñyAÜh£õÍ 0EQv|)¥Y÷ñŠied°}ˆµh”€â§ò´y€ @ l«øšyñ=d­Ç¯5%4"ÀâS#°$ ^ LQ$i ú§ïQñORˆ’@à!Iì§.@Pµ×ŽzåV© mtèðþóòæ°çÈ ÚK8ÙhÚ­Ú%¯Ay 8N€øiöðÅ‹€ @ ¶o=®;¤í‘Ø6ÖS84\Ø,tjÕ†lü‰Q%l»S0l[Ÿ‚¤Ç@^‡€‚ªÒÐÔeôUUß6 ´=°ðë ¦(ê®Ù5ÃîÙ+Vª»ÝP©Ai©£šKÀÔܶ=H€ @`" )©Ä8Â*Û«‚É..·rn¬riåO9䢔=",šÕ9­ÑÿçÍç;úUÏhW1ü™÷kç´Öv™;K@£¨t ý,ÇÏâß„Àh¤¨OMAUõ2õµ°ãƒ€µ)-=eOZ}ƒ, ?MUÜn`D/”pÒìz:)C€ Øc‡pRCJ»ÂÂЊCoŠ–ÊÏpÄÃ/™—'Sιtjz»¢šZsJÜ®ä¤ ì% /þt8©†A»‰ß)Ò„@Ôï¦pªz"zÈÞŒç% Q—ö¾ñѳ/È®‘Ub7²¡„7Ú_(v—äo1íïv# )C€ a Ȇ%rÚ–r.+ÛB\‹ŒÌarõ§L\ß Giʱ ª‘«ïP¶ wÖ^¤«ç•²CùÉxH`šp¢¹"ÓÚüU÷äO@ é`ê¡ê§ò¬¢<ʸ٠ž÷QTiãÝTpWEL—KuWð0< h$~Aï¢ € @ …€L*\4žÚr©¼Ôp)í»÷™h‹O5]aM­ÎØ[‘¼çå·sÒû$–BÇ-å-æ½—êû¤—ä–Q;¸Ósçå€ @ "YR/:P°§*˜¹$¥FñÓ)fjù-ÞÅä~Êëh·ºM)wÓ©ŠÐÂR 暤¡q†=x‹Þ$Ìô Ö8£ÑFc΀k±I¥Ø)Ûêò£Íü,Õ(¤Z¬;³&À @€À3òÊâ*©¥[ä«pÞ³¶.u¿à¾µšÿ,£ ­˜écAÂP6MSóM‰—--©A -º§mxÅX2\Cp&0ÅRY—ÚÖG„Òv@Àt¡™Lþ¡æ|v T" o1³(µ ²ƒ @3"§]êäZ:7±Ý…f/goý¤x½^WäÑ®xn)Õ‰ìæÃ³ø´Ë±ˆJm˜fhÄîc0tuÉp# ÑiZ”š­òmƒü LÙ4 ‘0MIƒ@£ä91Ü4 2‚ @mP´‚5§ªÐÛÅÖE7Q”Û_«¥^ÎdÖ*•üoZdÚŸò¯ â‘`ñév×ãW¼$ ‘PKKº ݾ;dT! ÃAc—F0̇—C=@`/YIvýš9Š{›ƒç!ŠñS»á‘”!@€ÀCšIþ2àJc¤0»øoü¨åR“á¿ü§;ºß_´ôaŸ$~*÷ËÃ꿉cgWçáVèSË~¼ÇÇR€¢`wßV>C”3>­ì65—¤‡Ä‡@ ! ŠŸ²SM4Eˆò@€ Ð+"§zi?ÉFîUz#×k„ø)‹Oû"¨…)öãN’  @˜`=¦i³¯K•¾?ÂânŸŽ6˜P߉ûñVTÉ胀¤¯ÿþÒ,)¥|V вPÓÞM_CÌ Ð%Ó½¾M%‡ @1 9íRmÞ®”µ=SÔ#”JîÁí¦iýWŸ¶Þ‚”?ûñFT) Ðv÷Mÿ ñdÇLgºj®BÇè¨ZuZ)%YV¡$M ¨§?UÚšiúU.)=¬çëY¯W¯BÓ ~úPظ @€2\þyiZ3¤ðÙPª3úK‘Wº÷W°ø4»WòbpìÇ[d $@éäW—â$?<îôàŸHŠW€é\D…«èM‹¤D ¸†<Í¢™gÀÕ“®fð$ @xF@vY†&Æ+}#Ûù™lpß”€¦Ôö!EkaêðaÔzÈœ›v4TJêä‚0]b:à8 >Ì»ûú±ûê‘rv5t?3B RMk‘89hÈÊBsþÙkz—\‰XŸ~j@€ª ±Kùìòa4ê*]O™v?åÛÎ磔»ìŒT*÷ÿx÷qÕ…È€@Ó¦@ªÆêhŸÊƒ¤~ØõM郭Ãë" iÀµ6EÝ%¦Sší†)R† @u (pCät—ÚÙñÃÚ ­®4›»Èw,W¦–ÃWÇ’S·jó"SVå;2×­øÏÏÏ÷óÿ¾6ÿûxþßûûûÿúŸÿ=öÿý²™Ï×ó~«üu’û˜4bË/Ý€å¨u¿¡ä^„€ÄØT A‹.ÒLc&¢…ŸŠìÛM‘Ýõ »ýÜöSäP”våa@€ 08™cLÒNÑ3yÆÚB¼»mW_ægÇbfgY3g¾c±©R5·=Ƕ~mšÀRœ#ŸŸŸ÷1Ê···ÿÆè/ÕýÈår™‰Í ›– _—ËQ«|FÉ´ Óe§ê ‹JRãPNÂSwx˜»\[ê2ÌœÙE5Ÿé”Œ‡MÃM@€ Ð""§ÛŠå˜¿jã…¹2w|t‹é4W%>fo¥Ö¥¨ëIŠ4kgBc©]-æˆÞ㛣¢÷+: …ºTU„§x«˜Ïüç±ktRÆv–£–úb’Ž)'¦½O³ÅÜêBFPPR¡Éøª²JHu[Þ´z"~;šŽ~$@€^¾ÄšÓm­rØ_M'9¿”Ì‘è{ó^‹Å§"†çgØ‘êxÅYd:òx»¬ûßß߃›£rçóy ÕN'—Ø ™”!0ÇXÕ‚skÎí«¶^6=ט–£¢<ÿ†’‚5Ós$û6:¬›f´ô[ ›.¿hSµã™É…øéRZ¸† @+ò IT8û~=æV<+1îòO­üíU´Ê.>U(–§½ŠŠi½XdÚåȹQ©9j6ÇÑˆŠ– R6žŠbâSpüaŒuC¢ø©r­OÇäa™~vI<€âû¦} ±Ïk—ÑÞj1lºê8š>Z«%Ö—øéJTø€ Lã$ˆD•rØÇ$!ÄO«ŒŠ vÜ=‹,>%l:ì¸t¤â,2­2 yf:I§ék<¸Gñë˜i* ØÏOÄ#Þ<{YÇyI镃å¨G¾³¼[–€V†Úõ8­i-[ZRë’À埗>6w•ñÈðþPDñùØ ³¤ @€@£ˆœ>Ô¹yO€¹ˆµúxÇóc.>%lzßO¹³A€E¦µ1Ó|ÀRkŠgMkHëÇØ(ÁHÞÞÞT׫T5íïþ‰³uã«ÊOn´ðKÈYvêÖ”f¤Pcó¨µÕ@ÇS”³%ø©Ý`KÊ€ 4G1[«óÅÑâ§r&hš÷êŸÿ„[娱e—·ø”°é˜CP^­årÔ „z@OºMÁíØ­±wñ)aÓ”~Ê3ZC!gˆ&¹dTŠ€LZ»w½^µ˜ôóóSkúteca3Š ç¦ÃU%Û’pɹ¤ j©ÑÃ-iÂœŽŠ¦áF`¯ª¼«#ô=EÓ­zͨ›}z·;…<š"Þk#æÕKñS̨m±áW@€ú&@ä4Oä-èlýé0Ͷ˜Eu˜ŽÛ·g#q:=aSÆŸ—XdÚêBôyx_F$pTýûûk¨G[Ôi9ª¾>/¿P<  a˜N[Ud6£T¼Ò=ÍB”<ÎÀ®^Æ0~/Õ^ŽqdŒšB€ Ð"§÷š!wvh=~ª0œzAAI@¬W¡Ž¼ø”°é®î9ÚÃ,2¯~hÇÝÛí¦uv—ËE+IßßßGŒQgdPQ¯QßQR?RoŠßå‡-¡Öéh¡ÇGަ‡˜ÖWú¿]‡’‚mZxo”€ldÓ½HL¹cs;[‰Ÿ*^‡ @ 9DN³UG^\pï\rÈ&Ê^dº¬þÃkü±¤ÜTÓ³—€–švÂC{[¤ïç5ÓØTÞšK\@únñ½µ#~Úœ S`@€vè;ì²W÷ÓóZ5©àšþa9fÐ[½"ë^Ç<íH»‡kÅL—LìÌÏŽ÷RЙ°éRЏb¦vCebÊó¼ÓÂÒ2qRÜ Ì§*œšØýyÌ‚QTÔ›DZj!Sšx[aLj‹=ìkt“•ü#'å„›€ t@Åo¥ø)اÛܲ:Ú£ã˜Ôªîv* -ÐLÕùBÑ[·½ySL‚MÏ3­ fê<~.³ûùù™–*Ôr:Ü#¹©°58n´•\¹8š @€@ë´žk¥ó þ§Üò÷ÛÌê ŠÆ´~ЧרդÀ+Ç€±oÉ"”¬q‘f"$ Wž<ÉÇgDj1—yaéçç'{ðz„¬ÈQ (–ªq`ÚéW#C‹Z£eްeJ@•`ð"-gùlM/ÕŸÈ+‚Öý²i x@WCE&~úRfx€ †\)–šÇ{9Tº±ŒˆÕ+ü™A@œí6òU3)¿¥Œ&g4¯@ 2)fjê'œy.´cçõzöà}{{‹Æ¡\€@e¦¥©1Øé×çÛA5²®âY6Ùïv"'C˜Hgk†ÍkÛ+b'-¦¬Á™^³”dâ§-Š1e† @àž‘Ó¥Ž§ëDS”]|Wܲÿ”•!抢n¬ïåöþŽæÄN»òƘ®XYW$Sw• B EÄLïǺâw~§=xÏç3 K+Ç¢ÈТ‘„¥©Åêû‰¢¶¨Õ,³$»ØËN ¶T»I%zEîG§aï?]I»F’a…ŠC€ Ð"§GÅéqDy·:b¦Ö:†Ž/TtCÛorbiã¡*ŠÐ4ÂhœÑºTŽLµÕ‰¢VWZ*@SF‹O”U±Fd„a¯¼A›øéJ€ Áç oA€ ‘Ó•j—7}W«üü«¤ø»ß¾Xb¹«< ˆ™šêÚTSSí±ÉN¼¡£MÐÈ3/J5ë†M|Š¢²od}ƹ š‡©Ö/%ù¸œ›/`vy^‘RØz:êŒÍm„e*„ÄO[iÊ@“fÑRE”Ÿá`ôJ“3qV,‘r½‹€bFÅ¢]àaT$@Ì´x÷ŸœöãÕÑ¥lÆÛi0ŠjA ašÈ¡ÑI{†ÿýýÃ&+£F††IEŦJÖjt-=(öŠûT)<™Æ!@äô`'ÒëꉌÀK‘&~z\¨H€ ODN—ºœ4Û"“u¥$³‹ï,×»Âå0”×]üyØŸ€Æ^}ŒN\YÊ<×"À~¼ “(:F%Àî¾Fß/¢¨þºMÝ¥YiBï³sORĬõÃPêòï w"§)Ý$å™öÄO—=‚øiŠØð  @9]jq 0Ÿ£»lV¹)ØÅwI˜ëD:¼u)Hǯ å'’ç1gÄL÷îU ìÇ;jĉzC Cìî»á‹üIÕYÕ©›ÝBÍNý¨ÛpÕs'ršÑk6^ÏêmªÄO7¤…Ÿ @B€ÈéRTäôÈÔÜgmª45éw™×xI@ÒøL¢òî#„/™ó€'b¦yùá[ìÇÛaĈ*A°»ïï@öM¢¨žšOݼ4›WͽKT˜\·ÉêæNätWgI|˜øéJª‰Ÿ&JA€ P…‘Ó¥ò&‘Ó¹eµ •–À¹~I ì"hf¿Îˆ™Î…ƒìÇû(®Â=@` ìî{ð;²|(ªƒ ! Y£²–Mÿìš(O„öªU††"§ÚW"=ÿ{&Ïqîã‚[I5ñÓ8ÂII @˜ (JÈžKµÍMg“kB±ƒeÖ\Cà­ûìñ ‚§Ï8s߇€>:{—<ûÎR`?ÞÂBTØC€Ý}K}ï4ÁHôÑ‹*æ¢&Þž¢)_ËN+6PݬËZ ¥†&¥#±”)¡£m4`{Rúô€*¢çõVÁ2IŠ1v%án¾¸"ÍG"€ tO@ ¤v]i,#ÿél ˆ¿tþ‘S÷D²û Gš—›˜/A  9ß4Ænûè ÊygI±ïžà ÏBøÿØÝ÷à×P_m}» ŸT‡&%ƒôY\I­°ÀÉ@À0–ft¨TG†#ù¾$í‰k®ž)¯ãŽ»—䀂—Ò”<@€@PÕVªZ­MiÉÚž0¹*'H lðT£Ù€ ©rE,5ÍS!Ø—ð ‚ØÝ7ïc4½¥u[,’ª¨JYg­ ‘']…Põ'%Y“™~¨–•§¬(ƙҩ *e«S¢v•*”øùnò. @í rºÔߤ¯*‚Y·5ºEm^6 ×Kš%[V>—‰s #“_båˆ++Éý¥ö÷÷w½^???µódÁIA€À’€ÆX´o5êö÷)±« QT¦ ÉJs[N'V#HÁ(†'â³vóF$Y è[{HTÙê QYß}/ÞŽyBÈ[€ ŒI€ÈéR=‹9äPíÂ.¾Ë¦ázI ì`µL™k' o[uGDÙ.cÚ´Èôýý}éÛç€hìýúúÒ8l=Ô÷”þ´¬¸þ@‚(l!-Nò…¡ ÎÔúÕç=Jöä±›.ÁV¡²®ÙÓ5ëO{Ò¨  @ !DN—ŠYë`%<²UUªe!¹†€¬ääàŸ …€–šîê˜:ÆT‹žÎç3‹L‚#d@à%–£îúŠéaÙ•Z3¥¯¿…RAšu x†®êÖ”Ügjôº‘S…M+®wVUØ; y^Øéq³ÎÄO‹H‰@€ °‹³Úfe,`ätnJ‡=jf\4A ¬%ÛD•)d+dì³Ôt½_^|_.™¾Œbð ŠXŽúòs¶|@“?+†_÷$£AP1–ƒ›Ûµ–óGZe#~ê&d@€€`ÕÎZ_|5LÁ2Úkn/.ÊŽ`ð„@š‚¢³±ÊFöËŠzÔXdZ1BÖ€ŽÐrTm 4’ù¦„-†ôÅØB§ˆŠE"p&°<îÖyÑì‹P صµJ™#œÊ||Çs!;@€Œ‰›•1é¥F‹'Í”˜ráI@“`ËŠ–gáÉ«?ÓRÓ*^…²Á:5™ Xð. h´U[hl·þ|´ž¾4žÒúS¨º$PË=¢17FÓðåMPAä8¢Nü´u­€òC€â r:ë~þjðqñˆ°‰Í šþz\Š–)øWû ÀRÓe?zxÍ"ÓhÁÊ@ 8–£>ü®n* ³‹…¨}h€Ô¢c _®:¯ÏŸÚ¨6ø ÿ˜fÎw,iGªæß>½€\ @ˆ@€È餧U™@XJ~ÿýsZæ˜w ” žJ–óå1L4xjFº$§Ô€Ö_:,2-› A@M`9êËo: QÑ'!–€¦7hžÃË^\öå(Ë",“eÁÄÇÙ’á¿,×3â§e»!©A€ 0 r:©[rþw°É$»øÎÊóPewRbFëPÂs°²²ß[\­ï£h‘é××—ÎÂk½O!!@À”ËQ·?¾ÓBTâ3^‡@AU<$òÉ´µ Ý™¦ú†„?ÝþÎò+ @{ 9T/éçÇ#§þs2Ÿ5·vñÝP)ù©?ÚÔè™0dÜÇ"ëOBŠ×ˆ¥¦=ëv»éÌ»Óédê„'q@h—ËQ7>£ZÆ¥iÒ4Šk/$ì"PÖÆÜèõóO𓹫„AvŽŸâÄÛhwâ§so†ƒPº&¥«Ô^4Ú5WQ˃Rêu¹˜¹½¡T÷ô“ŒµRb3¥Cð½'ñ(^ tþŽ”²n‘‹LÛ aPr@ LËQµM¾#Ÿ§¦ÓTs¦¸"G‚H$Pvk£”±¨•­zôŒŸÊÕó° Üœ?Mén<@€À6"§“f¥@@©£Óz½"‹X·Û.ýWÅ8Nÿ8¡E÷M@2œ.)O6m·öÝÖk§‘DQuç3}Rĵî3,2­q k@ЖÚ¸@_–ºŸ¶h¹O Q±h**d= ù4<‡9d:pOyÆO™í¼Ý+ã,jðìGä@€@)¨¦ÛÊRâ¯Å‚yv´ÂO¥b²]Å@µN”‡F+~âä,Æ¡Øe °Ôt5ÿýý]¯WN2í,fAu „" ¯Œ¾5ú⬾A#ÿ©I¡ÒIÊ*9¤ÜPÐs¤ürËÜ£Ñ;Åmó‡Ã¾ ©™EäSlŸ†xØ:Ü„ @ iDNgmM gÙ§4´9qM޳¹¥Ì"bsÓtvQV†5¸uƇêä`©éêCOÌ4TXÂ@„QÔÕçXFæ…²5O»ã-¤ðtbüüŸŸþ‚€>a;v‹z)Ì> ±úHñ' @MXF÷^*#N@Þ’8“=²G¹"/3 D x€†%@uù¡Wð…]•Žk€¤‰€¶Ï-¾©Ñ²Ã.¯;ŽœN0&£²“yJÏ%~ºìw\C€ ðŒÀ}P/EÓá™âÚÔjñéÄPS£e I3}æiç> ôG€(ª´ i>Ò**`d øŒæå®Ôû1#§S뛺}˜%²«‹™¶ÅJæù€ ȈœîR¢Š¤ít-zÎPÌÝ{—Øø?lwr #†kú䨰©\"q–ºû7‰™ö F€ N€(ª´ ¦‰ú¨äÒ*ä œ«~:§ÝÎ?Xñ{;ÅùGˆ, @(H€³ ÷jPz¾lS©¥—Ág¶g¢€I±Ü´Io8ç'Õ.v!0¶nvnM‡ì$0#Ï­%fšîWçI@€¢¨—Ëåçç'Ñ(èì1iÑÒ‹0sTP²hˆ€]Po@Ôõ°4í ù]~§†$Ó®¨šZì³Oõܸ€ @ ‘wD9¢b`&.>Ê,ƒÂÁrIT¦g‘%‹wµHÙ.r*Ù³(3iÖ" ivJ­|Âò Ë?<‚œ:B€2œN§‘£¨ ¡JSª¥¤‘/â¸üó’îÈ{’ÈéÜÜÅÝMs‹›ž!'^?…‡ @€Àhˆœ&êK÷Iƒ*œÊ˜(û¥lŽÈ¿ÊÏ.¾÷rRåNñm¥W‚ACWiV‹L%*cΤb¦ògøy€ 0&‘£¨š:¸k¦«…ÚFš¨H ¸÷ce`NÒË–Mld¦),»Ì…ëÄOvXnB€ú&@ä4EMÚx¦ølÀŒYÍÒâB-SaØÞjCf~²Þy5#ÊïPk²ØE@ㆦ^¨)ûþÆÝ׎˜é˜Þ~j @e E•î¤àŽô¨]zC Å]÷Š:A½•œÈ;tOéø¹Wñg üqV.R€ @`›€¾û¹Rt¤gpòÞ_³wC•^'"ÑÂðÙ»Ÿ$FÓS—’̲S»tHY£–ºçhv1Ó²>sRƒ LÆŒ¢NÆ!TÅ•,‚(î÷XZ—Óµæ`©l¨bÍ‹Udž £G³£ï»*w @#П“Š(iŵٌŧSEd¿;LMï æf×¥HÓ •ˆìÙâ¢ø°­³ãûC5GÌÊjÌ÷’‡’Såæßßßõz}ÇÅ @€€)}mõÍÕ—·Ê¿V¦Ò¬¤„ÇTü(  hÚËØíYc­vÄQó øËûÄOM‡‡ D @äô¥F”þ€ÔβmzpÊ¥t9‡µ‡éUfßtYÊ{Ò9hΤ‹¼fªû–†)kGú˜àóä÷÷÷çççÛÛ›©£˜Ä!@XЗWß_møàó¹’‹´,"uu]r7%PÜã±ê¹¸§¶›O[…¯ˆÿS¸lgʯˆŸ—@R€ „%€jº¡åýT<*q|³”a5t!TIúPε]­bÁ¡Î9Ra<Z³ëóúoÕ" ‰³¡·Ãˆ¤/___ÚBpéÈå€ gZˆª/òP Q5UzW-•|!`GÀÚšàP˜—mW¼ 8eé%óí4Ú;ضd@€€?lºm-(ãWiûeÛ±HˆJXEúÊìHjò't0%{FZ7Šª¹Ž²wŠÛPÛí«ì8Ú)c|¨òÊ´ÙYB¶åÇú×i©©³g˜ì @Ø& …¨úF[«qÒ—ö¥Y£èÌU`2µ `}0Q¼”VÓ¨Rv”Óüÿ”|yfƒñÓ²2Ij€ ˆœn(?G~*¤8¾øtªŽ»ž+_ ¹âÂM;TøOEQeËølf«Ü•W­m™;ˆ}éã­¼«¡C.ˆ•”¾ì˜í>ðûûËRÓm¯5¿B€ªЦC-D•&&}¬”A׊J9û#poü–µdØöÍ¢F aQÎÑÒ$~Zv@ 5@€@]DNít¹âZSÁ˜Ò´•Z]Ù[æ.g‚"€vmaò³…ƪ—Q U‘Y›½.aº]Hë6}E·59ÁM$ªgt»ÝÎçsuo0€ @ Àh Q¥›ù̱V¦â¦LÝ2ŸééÍWÜÐcvG:ü'娩nS@€Žh:\µ¡«ù©øT@™J³`íX©µbñ¡ôj£˜vm¥”8¦*¨Çdo*غwͦ ½¥w‹§û°-^ÞdJpÁžh‘”,ˆ¨¼”¥ã°Ô4ÝAÍ“€ ˜¦…¨ú¦W šHAzÚ^sÀBc$Mì%P|­e‡ÅCµ«9ä"XÒ;~Í ´‹ÿÆÃÅãÚÇ— @ØE@_óo=?!P|Z¦,R°e"JSaÙ]Âcú°ÊS6F¼¬¬Ýu^¬\äå9YþSõõO1Ö馩qšÝŽ*6³Rídé`ÊC…MYjÓN© @Ù´‰„¾ïÙjj[/B=¨÷òº3â›k-;¬L`çêtÆ%Ã×O ŠñÓƒÒÈë€ ŠˆœTŠ6’R@­l+_|:^°²Z÷ÁZ«š-n(ýlóÞƒ4¢½®ÖiwðFoíà§q¦Z–r¹\ÞÞÞ²³¼@€@dC-D%„Ú>Hìfö2;7O„ʺ ”Z^1xë!â§Ñ|Y”€ B€ÈéCÅÆèfq}É.ª¨”e³¤ˆÏ3r#4¤Kټׇž].˜TFcÅ‘dÇ ›^¯×ÈÎ^Ê@€@AZˆª¯¿f'e™lírDæ]k¦ËNÙ°7»ù úp´Vv1xñ!PçdÅùÞQ@€@XœTøP¥±»Yü Íö´+­–Êöì míâ›·yïADž¯ÛÅîí¤ºï”5ÂDë³ÉRÓ‚^h’‚ 4G@ÛMhÓ‰ND%„Ú·êÞtíì–â¤:"ço<=Òß•ƒˆø©…€4!@ôÕÖ·ûá7›vŠïˆkÀÒ*6;Ë(C°U˜†V;–Ý9'—Ý+Ö‚g×»Ly„°éßßKM›óoS`@€€m@1ÂBTB¨]jïMWÊtÙisûM…jJ-Ú-âÐ V¼…-Kü´ˆ|’ @Àš‘S E(%MÅ"Ë6®éâÓ¹FšvX¶ØSS º•¬ Nþ<­àëDNç®Qýb„°éÏÏÏçç'§šÚ9ŸI€ Ð.i!ª´…‚ºnÀ¤¡V׺)ÀL ø„ð¹Ç±Úq†œw¡Ðó 3ûB‘SBØyüSÞ"~š-™¼@ð! p³ÈR´£gŠïÔ¡€¬QQ—ÉJ¶³’ò$¿‰]|Õ× ž<’ªì[DN—ý¢âu÷aÓi©éûû{»î\J@€€é Zˆ*ý¡¬ê*5B¨uo²žÈ1ê¬v,"cÇ íôU„˜"ò­o&£nH²€ Á èÍ,2íh™cñ]nÓ\¦oz­}`B©yš à;>Bµ›Í{=ŽˆAÁw»›²ÔÔÍÏLF€ Îh!ª6¬è{!j3H ª¾$Š€ÝžTr5„ªi£…Ñ‹#>OfJû´;ñÓ#RÊ»€ #Ä>|¡—¹(äW¶‰=ˆZJm+Z•GᤗØ+>X†øIh™wQQ„¦¬ÕûìüRQö-ùúú:Nyq© @þú^ˆ*»žjuÍ|ÌM¥–±9&Ïâµ>2W_×âå!ÁgˆŸ–u& @à "§Ï”ÿûšTy°5W¯+6ç\ …k‹‡€W•Úõçä@p†ž]ë›÷JÀT…ôúòdqSØÔÈY±«¯Y<<-5õw«’# @}˜¢þþž¹j¡e¤9Y@héÅo|FàH`n[ÂYðøŒùÞûrÔl£~ö«¿OioÕú{>»±ž5"÷!@È&ÀÉqt-‹PšÿÒË)š“-/*žë¹w—Dµ»y/(íjèâ÷6ýþþþøøèÛmKí @¨N@ú†´ ¤zš„P‹«ß$øŒ€ ²xÏsˆžU­›û23ÚèçÿüèÅn 4T» bÀ+€ a 0‘/šúT|ïÍZ[¬h³iÚ¡z–PÄÔü›Û¼W-ËV½‡Ž¾Ã¦×ë•z«{’) @`(Ó^¾¡,—R…!„ZQi$kÍÖ.%®«tÂÎn´eWx_þ©Ñ#¦ÿ¤Qþ{‹]|cº—-΀ , °pl¯öâð¼…éá¿øt%“ʽ”ºº×*L@±—IŠÒvqŽÒ,Þþ‡M9Øt(5•… $ é[:f]:ɶ2Üâ¯1 ]š-Ⱦ¶èœvZ¼±vùô0ó¥‹7ÁÞ5ÿߢs‘& @/ ÔZ¸W[ðùâ ’¢]1*tme¥NF›ÅÚÄæ½Ú7©b ¾¢ É:ÚT„—_™ÄtÜØçç§Ž èD¥H€ ŒF@:Éåréò8TE£Øx*ˆbßS1Œö›BV‹ ɮݕ9Þ«8ÿ¼‹»tƒ ŒL€Ã#òôŸ·4Á¯¬pjÒ`õíV¤{ïšèX–ÀÃÔ¤…VDz”¨h!æ%4yZ°ž–å|-ך`Ù"}\ëˆ1…MGsÉR_@€š -åç'Ö)$E4@B¨Îš|ßÙÉ ."–«Dä:è›[•Ú¥O‰\Wi ‡™ª‹ÍOXu:þ„ @`" /o¨˜ÑC að›éjm¢T×]|:µ¦¤®ø‰®‰Õö˜Œ²8vøD‹/‹›ŠÄ>½‡£^æ·Ûíã㣠Ç)…„ @`dÒX4Ýë™5Ñî}B¨5üž²–µbÑ "¸/zj¦©.‰Þ6©‹ÖôÄO-Ò„ <$ +‰Èi4]è¾<Å7qU,H»k¿ÜhçªrœGñv8$Þ$lzß1=ïô6½^¯:Pld,u‡ @ 9Ò^¤Ã$jÑ =FÕS½ï2/£Ý“‚ø.:k²”à©´³Z÷QŸp¦}C;Š @H! ¯m Q Œi-dɦ´iú3q–XŠ›ôöhºŸŠÁF32?ÓåDOJö‚Ð0íbaï2lú÷÷÷õõÅÁ¦ÍùŠ)0 @3…P¥ÏH«Ù¥ZÇXÊ?'t„5 ‚̨'~gÔè/ƒ§lRgD¾H²òåZt·ø_(J@ð!@ä´ˆÆâ–Hñ pd»>%#Í+¾;ñÁ®¤>RÝo nE•XæR¨ {Š õôŒÄ¯ø¬‰ƒâøë¿¿¿l:;]¹€ @ uš &ÝFÎq5)T 2Í´GPOª5u±&`´oRu“Üš[­ôµïƘ#/D„Éäµà4‘¯†èä'@€Ž &Ò„:´,dñ Z@P‘ŠWóH7Ñ»ò(°»lçk##t‹b¦—^êÖÚr´ìdE›K°!0‰?逰óùܺƒ”òC€ ‡Bíï8TB¨ÑÌ„Èåy¹’1ÑjX>&ç@ä*7]¶ {SØÙ¤®‰Æ•mÙ_¸† @ €Q³&4“º…,nŒD[|:áÕüÆí9EºÀÞDêî[[¼éV_1SeDÌ´n7ï2lªCÁ>>>º¹ @€z" çv»=T¶Û½© ‘”º6B¹oã²…_ž&êÞb!7Ú‹Õ¾ 5¨æ½g÷/^„ @àž€â# iu&`±ƒkؽ˜T°h–ª<µŒ5½ YLŠÁ,ü#\(lpÚÀý$ýÎt°©ŽëÉ#J] @€ÀKÒ4y¬³ãP¥©²çVIvÓÍ„ô'1T³›ãå‹Ï‚§,µx‰.Ú¹ÒÇž„ 'À̽hzήòWФ0ï*€óÃ>+.wõ2«²6Sfã®rÞ?¬…¥S¨tŠ–2{ÜY˜7²“JmÃê{J¿£c¿¾¾¾tØK×"@€ ^ H’FÔSUúª´Ö µ–Ÿ†% ë2ÝXH|’={MÅéað‡¡)s»Ä‹» ;)A€z"ˆÛ“jB€ #4ÙLºS¢™ÿ1é´øª `1)”è¼]Ë®ÜJò½Ð‘íh»¥ÜŠ-þ§B€ÀP¤¡vº©+7L¢l¡=šˆœNÈŠÊœX±ï&‹nŽ7Õ^:Æët:ñò. @€4¨nŽCÅêÆN9R‘â6ÉÕ‘òðî6y0æ&j†Û¸ú•øé,Ø\@€R 5¤ç$Õâ<‘8Ë'-j—ÒS>£]nØÅ7Q€‡}ì|=GÞ‰:½ èЮËåòöö6 «“*C€ R¤MuBåL“amU\ñštS"ñIÎß4•¨å6˲RMó"qgjÐÄ^Æc€ (åü¥&;ÅC0AŸ¶¾—)ûV9‹YÈŸP|Áx•¯›V›~~~–r’ @€@O!Ti¼q&å¶h54ZæÕ°EìE÷¥ÑD±gã‡aíµ·.I(2t @ ŠÐ^£•ç—»¬¤ËÃÆ“Z¡\ý‹Ö#§^‘dßVú‘C9»9ÞtÚ¤—Õ¦8x!@€€žB¨ {U7-ô|²˜ XOñeÍx-.&ßE)ôd#ââ>à w"?A€Z$ÀT= ,Hš²F¤++–FÕѶ·e«S75Uu=Hg©X õ©âýÔ_° ›Z8HI€ Üè&„ʄҊ6ˆÖaÎıkG-—QÙñÆÈÓ´|âï},Oðw€# Œ@ ã)dv:d[)+.SV’eáV™!Ü_ätnµQ¤mIr—¥•±_|oíY®Ü.›Þ»4¹@€¬ tBå Ô.-ûJwMÈ޹υ;¥(xªÉÞ]z*T©9b(Ú"wó @ R„J©U¤–À4]°¬Lúï7+m¶ƒ¥y­ Ú1ã1l'²(˜:æ|‚̆`ÿ‰°©µS”ô!@€À6nB¨òÞKC¶P¼I3âÁSÑAªÖk1zœ®64#~ª†^1 x€ k½N!ëUk=R¯yN])¡ÒÜà#åÙû®Vçõ9ÛEÑ4&=îæž—aRÜo0‹ÛaÓm7&¿B€ O§Óéz½º©‚v±'OsÖMz‹¯n“ùœž;OB@äoy%ÄA*7Å n7»ï)C€@7˜X5”Þh±øÔm™¤2ê¦ß%VAÇÝS«¶;0Iäš“ƒÎÓH^€ @/ ôB•¶ìflvlw¬ZñwžlåÈEÚÞÐŒøé6ŸDwA€:  ¥|‘UÊVœ@q;Ågñ©"Mt·Œ*ïùz..$X‘@Ç›6}é´ä@€ P—@!T2ðZT4^,².î” xjÑL½¦©)/§1kÓ¶^«ŸX¯/døëx€ú&À4ÎDµ¡§Çdx—jëè^ñ݆‹°NPÆ çþtÐ û8Þ”°i]/(¹C€ ]ú¡rjÖÐ\‚§3 .œ ¤Ç‰Ÿ»„ÁÚ¿Gú€ Ðíꬥ]ZÌXVDíæyê´çÈ©²óÏ4±9ØÅ7HÊ(FÇ›6Ýå¨äa@€ ‡@!T ¢ K$à+ѧx·¶rÀ"íu.)z°žEÚK,ѵÅc€ à4oÓóƒK^¡¤ÏµKc‹”oÒMée8þäÒæŠ¹·ªß¨CÉg…Q{¹/Ðqé5M°iÏ'% @ÙÞßß¿¿¿MõFëÄe±ƒVëSñà©ÝtîÖQSþ™@^ÑÆÙ)gý!}@€ÀKœ~>«OÃ^Ä_|ª N•´{­8ìjA6­j¥ç*Òí,Æ/Çÿ½Ƚ&'[¶ƒŽ!@€¢øøøh=„ª`sJ[±‰îËIðôž w윖ÿþïve‹ŸòAz{ý<@¨K@  8<1¾~b]B-±,.‡åJÚ©çJ=åµaz«0Å»ãðUæå:Yk!ý½Ôã>ÞÐSKM޵h¾>Ê@€ P„@!T-%+h„îUøy>›@qw+O³Û¢û5DœÏ,ßËàñSg]EYC€Ààøèw¯&VP“Ç$ e»ƒL×ÄÜ·;_ÏÅ˶QÓÄN¡Ó.l÷‚ãó~%¢ÛY”ýUSÓË,m9æZB•jpM>N¯” ²§÷¦ñ=œ”€ 'Ðz•ƒPãD)%)<•¤äË3C(;-_¾£Á½.Îκt'OB€ŠÐÒ¹¡4%*»M@AÃ"rµLäàâÓâ6Ô²l÷×yÚ¯fÜÉ4»O­îìèàÛoýkÌíÓÅ’°iq'$ B€ ¶(„úûÎÒÙ¡Ðþë{ðÝ5­MžRéËtMoÖÄ'l•jšnÒ±ˆôiÖz7|ò*âì²Kìû<@8Nà`T+ïÃÊ[Á _|ª^¶ÍR¼0Û½FÙeU/ÆTUªà"×eñÂÊÃv˜•‹L޲¶<{”€ @ÀˆÀççgÓ!Tl¢ø6—Å J3~Å)¡;w žÕ˜»±ÍÎ . @´ÂÎGE!—¶XØ,¶ªbOÎ X7ÚJà òm‰kÌÒÆ\‰œø™[LÎ1#·ÉB€ ´K éª „ÒbZOS©,vÁb#¦È-îY6ëiùƒ;^ä¾Ó›èpà1@€@|œlî©§5—×÷¿¾ËÊðÞŧþª—öo)ØL²Ñ"œqY¶RùtœTÓ N ›¶ëɤä€ @À@Ó!TÅ8¤±wl4]µ²^¥6xH«ia(Ux7çÒàîqŽà+>†   H@_4Ný(¥‰u™ŽÅIés>%œÎç‡Zh¹RWÎ.‡2õq‹Ju)í+u¾žµ›º9É€ ôA ÝªŒM– 4‚ &U|7û­l“r‹œNÞ˜Á¹òõ‡,i\C€ÿ ·¨òù—¹xøR ¦ÔÂYݲžH ¾VœäË̺R)í8Ú3ucå/Ebã¿¿¿¯¯¯>Wt¬‘5 @€@¯=UÓ†YŸècC½Ì¥ønÙJUlÿ—5å#ìtyœŒj×J²Š ïrSð0 @ .æ>µ¢cÄ)§LŒâBûP‡tž–Vwýµ¨*ÊYlÝJÅZŸ’hq‹¶Ç›öꥤ^€ @  ÑèA¨Òð9ÅÇžÚÈÅÂXfsæ àýäì\Úpì ã«EŸÉFƒò tL@“÷؈¦3Ч:š§¶â™ /…JáTÏ®§Yˆsî/A›—ªxJUäé–µ$6ÂDÖ ÉáxÓ8EJ@€º'ÐîA¨ØVn¶ÕÃŒ,6\Ý>?èa1¸ÙçÒK«|ðÁDsQ,’¿Ä΀ ]ôµbþdsŠ_+æ¾KØRžŸúOE 5ã´T.T¥‚È­Q1ʆ¼S:K‘gtø”Ž êÞAG!@€¢úóÓÞæŠµ-gü$û€Ìä"FÐ*¬æ‡´»¹éï\Z س?< ¤ÏÈp€ „Ààën´ÁZ±Xª˜¬ó$4M!xvÜj-°S¾âMX•¨÷i>Ùb«°­¿:ÞTÇNEó¡Q@€ ¡H#ÕùÖªoñôµjLV€¹A.KÙò† ÌS¸—qÝ9U îëµ!Ey?ÅôD¹5½<ÒyÜx € à@`ðm"ÜôŽ3²˜*&ËÅsûŽø‹¯/ÿ¼ì¿RÝt ;{[ÇalßÎb:ÞTN å—£²€ @1 L¡nk°•0x࣊M'ëØB˜x\¥5­3už–Ÿ!™¸nZœˆžÑм@Í`rµž6HúMŸó®ÂKŽßRšÕ|û¹%2ª§;´© [L{NlåìÇt¼©™Šé7£T€ @ÃŽz»¥š<ÙÊpñe¦±ÕÁøš³°8´²ªQñÓÁ8M;‹SH€"жhø}(„ÕkÑŠFzß嵐µÕ 4öå†3ÍUªºç c9ð½:ßáxÓa]‘T€ ´B ÅƒPûugVðV£)¬ìÌ–Ña_1Z¡ldÂîÆ‘_N£¨[’… ì%À¾a¼F ö2¢·WDžot†°´JÙtÏøhÓ¶ÂÁ- ü‘ƒhŸ5œõ}íÓËñ¦­8 )' @€@‹¡*¢7øò17ãN»%[P,tkAëŒZÜ VñSk,‘Ó—›Å¢S“& @ ƒ€– FþhR¶æl„ó2äÓáéÒÍA^øaü®õJ-+öº9QWoúúúâxS<€ @mhñ TEßX½ècÊÍßæp+Ÿæ³ËE“ÉÓ•²# ù-ŒãMu Rl@€ m—ËEºnq;Ñ.AÙX v–šÝW¹X;l×p)«½æ]¹ìz´[Ê#ÇOåµî©)Ýd†Œ @à Ô? 4—"ï°ü/[ŠëRÚ›;-…ãM·nü @€ Ð4B•™Ì$öûkï3¦A–ìmŽŠÏ+ÔØY¸mpÿUg¡ðƒÎ|^‡ l¼7 ŸA$°`5›³¿tÇ›6í ¤ð€ @‰š;U¡2µ9)»Å§ò9àF˜9G¾å¾×AÔÄóƒÇO{mÖ&dBBGÞGVöz*Û÷¿¾£õ/LžžÌ¡.Ú€: ot+ÿÄñ¦‰~6ƒ @è†Àù|në Tmk#[ÃÁ¢' ->5=cgBpYмûÙ† ŸøÓàâg:5"± x €F =¸ÂCñº! ù´¡ú”ténØRšgÒІ?:òI?uãþ¢"€ @ØK@çV4tªl f¶—5ëtª¬© bðVÙÆ*˜šâæ}GN'©\üÚšÖn:‘8 üS[P7#©D¦3?wu"§‰MÆc"ÐÜ‚SŽ7ÝëXãy@€ . è ÔëõºËT¬û°",A-h„ZÑðªl¬"I)rªF©Õ‹•µgî#ûµ¬—–×!ò… ß$¿ˆVF"{ 9›@ÅØ[rž–€¤¥¡§oÚ¥ÓJA€ !ðþþ.=9ˆ+æe1d}p j)óSkkNSÄßÿã½TIç5„gìrÕ—Ê”¼iòƒµÈ-ó9~ªæöD½ÄÎ5 tOmüˆJÆ»Ùêê6ÊÈivÛö¢ mlÞÊ·@;’éh§#>%Þ… @€@Ǥ-7´‹ïˆÍ³¨¯ÏùAl¹lÑv»Ò¬J[1K2²KuoÅcC9!@ !èu»t0.H âÁJ‰-X’ꘀÎlj³ËôË ûôvìå£j€ @¥´µ‹/KKÙ›>Ç#jæ­æß–*3éì" yʼnú÷áKŸýì(¸/À.zM?\ÑÇ8óç€z"°œÕô'’·H@ÖD•Þ„áÙ¢´Ô*sCê÷ïïïÇÇG)oé@€ @ {ÒŸ¥EW1K32•mRË,ê&_·Tq;T‘™ŠË767s.ÕÈ+|fGdŒÞ¼@ÍÐþÿÌ…«¢Î‘éL@á{玃ØÏð¹Ø& ³ºâ!){û…œvïÚ¢‚€ @(N@KP¥KïU¿k=¯Ð€ì”mC†_· x®d«·í¶(ûkÅ™Ï/77ó,ÛË”Å*5y¹Ú7¬Öw„|!@à%}LQ¹C}âÇ,Œ„ð¥¬|€ÍsƳŒZËÈÕ YPöì’úùùy/îD"A@€ ŒC@µôj;¥½`ʲSþ˰qxe&àÉ 1c7½ðŸ™?wjMºNYìéYB‡],ã|Îì,\@€@OtŠŸ©ÞBâH$ S§g±Iub‹ þ˜L 7™<(ù—Ëe5… @€€)†– Ê¼68RÄbõŒd)ÞÍ–ËEZía"ê÷ŒÚµ¹™ç¦²» öl»7=W—ôêð: $ÀÎ!íêý•\q|‡>‚©ÒŸäXÔHÒØÊ‚ÓïïïÓédê;"q@€ ŒF@:¶4mõxZ\Ƭøl«Ð?â¦öÒÙ—ÙæÅ‡êž¶³wƒ³ÔiZøCh#Ü”ßûøK € 0 Öß '´UGëÙwX(mÉC­ÒzîÝtäÓ£§ŸŸŸ£y±¨/ @€ÜhƒiÝG”v·w™'œm?*’å?uVÞ˜!oÑÈ&Yëź´æ9W¥.¯µ´l¾­l)æö± #@xI`ä}Ê~…I­ 7_ŠnÞS°™:NJ6WÅ}~vÉöív{{{só‘ @€Æ$ ­[º÷.]½Öòe´þ®c{Í®jµ¢o ëi2CkôÒm.ʦ­Yýcßs?²¡Ÿ³Ô)ª]×sHÙyï,\@€@£¤WQϾ’dÑí`S¼[I॔¶ÅÒú)QÑæJûßßß1=WÔ€ @UœÏç&– Ê¢aÃ¥<[Òn.÷K[O!Tå^eÉç3§7·¿kÅVS³ïk>ÇWÍx¼Ày«ú[Îqê8€ Ð"Í˪þå¢xH@¬â}JÙ‡yqY©­läòõõÅ‚Ó*î22… @œ€ôpiãÅÍU‹eÝT‰Äµn`ÖÄ)ð­UŸ>þ:Åì´Ïó3„P¶%6Ü)8EßYêbní0t8s¶ØI€p†ÃG™,² HW·Xý7ìüºì†çEÙ"W|0ÿùùaÁéàþ:ª@€ P€trmS\Û/ž ¦%9bÌFˆ°¨íä¸+Û|ZaªªÝLgÁ“QÜVäTæ¹ðÎj ²››yF †}t´*ïV”g%;@È# ó ª|¡Èé,ôFŸ¦óêI aËœ·ßÒ÷ên" @€ ˆ@CKPeï eß©¬‚Œq¦×j5¨Ö«KM?~K¡==?EKõºü!Ûöf[5yåÛÜ®‘ݯFës=ãzÍÊ‹ôk%"ÉY­¶¶“R† æ û},õ%²,:— Ÿò“KdN6¡6¿¿¿ã¤‚ @€B–®Ía,LײiÊêIº5aÊ92ì ‰rë)nxÿOÒéfžðøì\¤áêÆ¿L7ÄVâyÍ—ñ–Q¸H›&¢ÁP(ƒ¯@€@÷Ênúaú9#ñÁ XLº“r88Uª?°8Z·øäïïïr¹„rQ@€ @`I@»ôöâ¶@Ù,4[C\¤?-+J­¡yæuE~ªÉÉ~Æ9.¬h{vQ›~QSŠw"„ Ö  *7ýq­ðR‰-zóF¤ûúÖÝá']ªo·ÛétZºe¸† @€Þ®íbÒUýZOš.š»·¼:¸S7Tç#'ÖÁ‚b NÅ5ƒ>;`Ë_ñrå‚‚ÑPë$%ÕÊùMÛš¤ @`ƒ€”ä²Rƒ€5Í‚Û鼟†YgÝX­¤¯†­­D¡ÕÄõóùÐ)D‘ @€ g>??›X‚ÊŒâ]ÖkßñÓ†\…Z›hP[<æ¹8×Yä|‚»:ÏÃ.G Ù#M@°& iKš¼äóõ!”" ›Î¢k`*–j ¶ÒÑØÄÜÂëõúöööÌ!Ã}@€ @ ,iòÚ@ÆÂŒ-›æ°á’<V¶¤Î*ÛRkèÔËŠÇîhöµ¿Éh+¶gRçÎëƒo©_ÇŸZÿ¬É¸@ è³kñ¡!MX°Ø®¤¡©•ÖxÇI_c`|k÷÷÷÷ãã#¬#ˆ‚A€ @)´Œtû‚.‹¤dá)ÚekƒS‹†¨•¦ÂF­,²¨H^”juç•¶Ú¤kWwèãa£%µ:5ùB€@fiÚd-}¦…!l-ŒÔÅÓ?Na«LÁЍ8I5}ÄþúúbÁiŠ'Šg @€ Ÿ€t{iøéæ@•'’­TÜþê8A#…ëWŒ î…w5ûÝŸÏ”cõ•¹ž®ŒVDb—ü¤<ì ¹–$“/ <#0ÂÙßš5Uµ?E1hî©pÏÄ;ûþý¢¹†¶(°L­øÇXüüü¼¿¿Ç÷ÿPB@€ @`m,#m?ÛnõyQÁ©VV ZØŒ{ÓÔ¼} …O[Ϲ4±ÌPbYqÿ(y"ô ÏU·ì1T ÐÏ]’ @ð'P}–Ô^-4ãy}Ù—Š+jÃà¯S9¦N¼­ËOöàrpð_æø÷÷§éè»Ü/< @€ ´E ‰%¨þ§:–µþ%梧žzR.…øÇÄ,åMkwU°ÊÃu–éKtŽŸ6a/.œuoÙO¹† kÑ&Jÿ¨)Áù¨Óg0õ¹':fAÞ?Mm±û¬•Ü¡›ø7VÝŸM¨8"'eßÕ„ó···v>”€ @È& Ígâ/A½üóR׬k+wá²Ø,«¬ªÔï"ÌâOLPù(XçÕ¸cºËŒn$J A€€öXXuú ,Ó&Û2:6Jk¡ÃH7Žo;l0á§%5¥çQ ÏÆœíû,8Íö2ñ" @€º!ÿTæ¢/͗ײFƒÏãmÂûaáöÙ¶Ðç_ÅGÑÉ— ]÷çøiÌE¸¦M Ž,7ò,\@€@ôÅW`ÑôkR=ñ]Ÿ3ð‹_½Šàã??,z똳銷NõeDWq~~tÎQ7Þ*@€ ! ëà÷÷×ÂÈ-•&sÑ÷Ú¹òÅÅÜÅ7~dP^¾Š‘S‰z+~Tç­e#/ÅÝÛ=ŸwŽP—®I€ (Æ”øEh÷± Ši“í6÷\r 3DFÄœ>ù vL!«<¦‰ålÕ{ijĻ€ @è€l„ëõZÅBIÌTvրѓƒv±œr¿ÿŽÞˆ»ÖG$ŠnúcŠœªÝóuÏøiü°»yOÂé‚Ê“€ pœÀ'SdŘ6i¡Tx¦™ÝôÛ=KÉzÖ‚¼Êˆ¾9Òßßù|îÏÏC @€ "d/üýÅž úß_e¸R“Ÿ!H5¸Ç£î.RZgÑ¢4f¬(Ùv‹mü:fü4¸£i£½ø €žк¼?ú»Ê|pÿ}ôƒë»h ø°…õ¡4$ÙA•5;Ôb1ò³6ãþ÷÷7 N‹8”H€ @8N²2,·Wn?·¶Vç1xµ µ®Ñ<8xÐÅwPþå!lWª=ã§Í-Î-ÒýUëƒÆë€ ‡@ÓýÄïš´š"/éí*H‰¬z}L±o‹NGH½9©kd½BM¿\.»w¨ @€ P–€ûxihT|@³Že…5g9F(°¸y†ºf!QÈ;BõŸ•A~y2çÒV¹h7,XÊAšˆ½]PÏÄïå}ƒ[]>[‡Ç @à%”؂ڦ¾û#{© 4÷€ôC í…ŧmI‚Q ýå0›øÀÏÏÏûû{YG ©A€ @Ý!k"ÑîðLÆ8³mgÅbtÒV‘)M<ÚǨbÞ7çø©\²…éò'­Oék<@Á pÔiF¡ö7ªÛ=p¾ž2T±eœD‘1n¼|EÓÅ»wéPA@€ @Àˆ€þ¾U&ùPFhñÊ:DQåï’í\¼ä¥ŒfÔ·t^Ù.¨lÑ•¿ý¥ˆ @ 2Ž:=Ò:¨ýÙ*D­¥iñgïŽÐj5Y©|ÕônÓtŸÉÉÆ}mÕûññaäB!Y@€ @`çóYöņõQ÷§à«KY ÖéLQÔ⇢*ry§µh‘Ó©+µëT[«ÅÝ„מGvC¹µ;Ah”@ðédETMë(ô”ÊZ¤¨$âCÀHÙÖŽ>å'— jO‹`ïáv»iŠø8Îj @€ ˜}ñýý½×0q{>x„.Ãä¬ûŠB` KÉ×qSî8¬ëÉ–[^„ {š²•2¼7ýŒ›~vW“¦›Ï´ðšxß)Žß‘:dZlßE@#@乩___®²€ @€' -|e}7xRÕÆtô]¦îPËá¦X›‘ìOVEmw2€g€ï÷ß¿í‚Ê耪ld÷TñŽ@‚€š& ¯y÷ª©Û‡i„¼ŠAüWŒô–î{Vü–J¨Uça-¬ßßßÁ8T€ @ð$p>ŸuhHL_–l7&¥·bk{–Óg7¹²B¾¦vÂF޲{ÂMSÊëšÞÏ;€ €Ô¼¡¾¡·|fLi÷׆˜PÔ%#%œÅ§Kȵ®=7œÙ;Âßn7Müöt’ @€ %"{d¯ ãöëP†õ›é$âmÉáW@¨N`„”Q\lÕvMoÇS7v.•ö Yµi‘?Y|êÜŽËì¤êh{\64Íûóó§  @€ Š.—KØ%¨·Ÿ[»«ö––)× ø,ˆ8næ?K¡]׫GBCÜ3™á> T'0ÂÆnGêÜÌƒÚ ¯×%`4qpU°b›ºõýŒ‘üçççt:Uô5 @€ ‰Àûû»,” »ÆáMr–eWÑ®$ëº|?:Hr»®!;×Ê!nw‰·Ñ:‘& @Ýè^uÓ²ÚÕ‚¶¿ãCý*i±˜PÇ’ä*Rä³Þ<ïñõõ…—€ @€@(²Sò ë·dSd©bVWÏÔͧg-ÃSú튱V‹”ED§ž;Wq¶e[ŠÔ  K@›«Ïcu¯> ´{~A¯íž]/Ÿf£‹ó¢Ì«°[úüþþ~||„òP@€ @Y+a·ðeÊz£Û§$v +úÏ׳½â¹œ ®Èi÷kyvñçðÓŠ]’¬!<$ ¨â®‘¼Å‡}¾>¬+lQ6ž•Y§9<ì/o"$Ï€¿¯ÔnäÛËèõÛíööö†[€ @€@X²Yd¹ÙD“áä©â6r£ j9ž)&àëMÇ ‹,7P/&rzß+µ*' ¸R$@c!”£o±OãrÔéýG¿é;F‹GXè]½ÝÚWš¼ýùùÖ=BÁ @€ , \.—˜KP›Ž=U7™[)@ÁEŽŽAë3(%ÚõÝJ[¬ÊyÐcÆü‡ÏùO‰„#C\y€Šè>Þ§};­µ©QØ7fþÐws¡ÞQ¼Ç)A d7ˆbV¤ÈH‹¦ÿþþ>NKG×€ @€‚xÿù º«““cZåEJUÑ´ŸBóò(Z‡±šŽ!f¯‘TàUl‹I—‰hKg —iB€À.#(™uÚ¥"áV©lUp»'jò¤[†ÊHê·O—ßn߇¿~}}w‰P<@€ @ÏÈ¢yhéT¿I ¦K«ÿàÂÆ#b©ïóv²ºpˆŸ6Ú‚òÀ(ø»µZ¶Ñúz»â̽ Êó€º$ œç°_%/Ž:­‚½§L¦{±øÔBHdÔdèíÃûïﯦj?sAp€ @€@>>>dÝ8ØP{³%Øîö§ÖqÓi*$g4=E®$K«E‘F›’- ÓnÙ#?l¤$°ôÛMlÂîgòùù¹íyàW@€ @͸\.+ßH?qѸ™á)ZäãÊ{(®ÛË?ÜíÆ_®^ÑÜ=c!3}§é³¡âÃîÀM@ÃA™ô9÷P‰ôý™¦v£%Úû hšDÅý|6>"lÕÛœ ˆC€ @‰´…¯¬ž ›¨ÖOÏ´=yÝš@Ýuv)žR‡cXÛ]ê²±î@q"§ÙÝÇÇ¿]k¸&_@ÑÜïÞŸ=€‡}ÑgfŽjwó‹…‚e0šaHð=»E¦ëÚVcû÷÷7[õ&º\x € @h”€¬žŸŸŸ ˨ÖOkÚÚþ¯o„Þ¤(}ɧõäí¦Wh>tÆŽà…6í/n;+:t4²€ œ@Ó_áÄ‘â)>­À²ÁÄéà1é*FB…e‹‡¬£ÁÛúëë«Q×ņ @€ °—Àõz=hCY¼.k±ÝE|Ùfr£/> ºYHÅ}š’“]ny‡ ¼O§à¦=·«Å¹,/Ò%ÝÝؤ ´H@ I‘q;l"nrº'¶‰kl¥éþM«ÄµbÊ·¢mµÑôÚ´ŠCN÷zZx€ @h€ì ˜[ø¦¯(¬k᎜»…³eÃl_þ”ç“qp<6½ZsÞfV-;²`—­{L'ز7q @ uú~•º¦6£Mk’·n‘Nÿ8•ª<-½.„ ¹W´­6d@ÛUqÈië>Ê@€ ä5ôûû»a1Õú)å,Ë ¦îhÅPÒlj÷PöŽ(Ž:R¼º‚4-ÎeÉIñV°Þ2úa7á& AèÄ}¿ŠÝ¡ô™‡3ÉPͧ0µúvÕàºÍQ×¶ÚøXÜn79Íó±ð @€ ÐÙDßßßvS­Ÿ4ÿ¶{‡X]S=#÷)ÄVK$ŽûdvReåf†\uüŠºŒVaÔê2ä @ o»öðoñ[ã ·L¢ŒZäC™P'*2J×Ò×¥ÅêÚVMÏ!§}¸z¨ @€ pœ€ì£ ë©ÖO˜á¡œr¬iaB-a(”Ô¦ÐÖU(UÔP­Oa² ègk‘#}@è~—EU|ô.öÈþÄ÷ñ¢ ®ƒªož$ȶ 8ÅNÇú|||w/ @€ nœÏç€G Êœg2|ž=^ö­ºÖ}Y©ÃxœÛ[VüZO­àžxÝ›¼@ #̯óÙø£N[×1Ž—ÿàIJZúñê´’‚ÖüŒœêÓÓéÔƒŠ@€ @(E@G ÊbŠæU“]Iü´®@N•ŠÖ½E R3ä­åÜ¢Øuŀܳ ¸­²–jÒ‡ „@÷š¡R¨9ê4ûËÞÙ‹ÙkœQwó$AÜ:øÞ,®×+‡œ–ò« @€ ÐYL²›öšZÏc›çÙæÇߪhÝ+b«-OWáa Ö‹ ú?Ä>ìÍRgŠ9 ¶d@ 8î·™uûdtƒVëØ[ñŒ]Y¤èbíå<=ï35bï0þùùÙŸgƒA€ @(Nàr¹ì5¸žïÞW–g€›¾å°Bó™äXµðøOÏ ?Ý·®‚iÓ“xq1}eÛ2̯€¢з»øø*Aé'Ò°£W‡j÷º…Ù+u¨¸ÙíUѶz6ªèàm?UÜŸ@‚€ @€z%ðññðTÙ›Ù¶*/î" /JEë^®ÑÓ?N» œñ°ê˜½MÙ3ÿÃêþ‡²eóÉ›u¼~%~ü @ 3 Ù8¨u?RuZ—ÿ°¹§Oñ’òÌšå 9‰©~³Uo¯þê@€ Ø%ðTù”d{fX¬¼’N ®uïp”óÇz}‡guÒ›˜'«¼uÈ :€< t¿X2=€u;GVÑ‚gªi )B…Z›×ŽÒΠûúú²ó$2 @€ î <³=ÏlO|«®u¯å®ÎÁq‡ø©ÎWM„ÏcÝÈ8V,Å™É3€º' és}#8ê´ïö_»—{ÎH¡uÖÒãCK)¡ƒ­±wü×SrÚ½‡ B€ @d[EÛ—£vRLõŒgêZ÷µ¶eþü¯Ï½>‡½ÏתZ† ðŠ5€KöÊ3ÏCp& ůï¨jg½ÆÔdݯ޵þˆwœ¾¬€~*›×ô²2|ºöFÛ­~ÒÖRrêàB! @€ @`²°~W–WÝ?e‡ž¯ç<3–·ÏŠÖ½| KåsÓ!~Š»Ò§)ãç¢ñ*v´ºã6¹CÈ#нÊÇQ§ñ?ß#”ð™jCéª_¼Ž÷¹Ýnr:ˆ‡jB€ @ndg}ç¹¼ìÞªq+nbWLÐ!zøL HŠÐŽ/7+{VþôûªYQÆÈz&Й–.Æ< @À™@÷»ßsÔéü}ä¢.‡{G£¾æ5Šƒe±w(æS7Ï A€ @͵×L³~ž¹Ðyýò-¯ÝCIPäT»„- SñÚÁ˧²9“µ(ð°Gp€–~ÿýÛ÷†½ÃUK¥®Ñ@P?R¨ÇÍ"'-½ûEß)Lö>£!+šš§#x>>>ô]Pe@€ @žÎçs´#PóêÛ±¶×fßõ¼CÄpv¬.äŸ åÊ“YŸG*X¼KNx¸, ›„aÕ#ø€V[,;ü†JÍí[ÀâÁPí¹0•©¢²æ5“ƒ5±$_þ©CNO§“§»€¼ @€  K@G Ê {i©y> ˜—lÕ<#wØ·êZ÷1›ÌI÷‹h†íP{+®Õžƒ$yAhŽ@÷»‹<;b²lKišÜÞ/ÏL@aSi顿7¶Ò‚mjÜõzåÓa6T€ @¨B@V˜l±²¾ƒ©aæïr,œþq±ƒÌ³_×fVaƒÝ~˜ã]òÃÃET\÷Ýyy€€î¿•>‡&t±Èç˜D–´ø4¬–¾,g´k-“9ýüü¬â( S@€ @¸\.>´Ä\Ø`*ÑàÜh²ø+ ø(|œØX<Ö19'—‡‹mô~‚ 0}‹;ÿ9ê´ãÆ¥j˜·;2Pëm…³€ @€*øøøˆv*ç:½tYT4ð/ÿ¼¼,^„Å"GhˆîËàæ?âÍ£€R´¢-ä}¤4sÆm…Zä½>òèñ¢ðYEž2rNÏ|³UoE÷YC€ @˜ È:‹vjß>·"ƒ*f~[qm‡øi÷§¹‘Õî©ÒÓ]p< @À™€vší{äW=‘j‹ƒ¾—ñö--Ô.8hG0|}}ÍF:€ @€ @´#PYÖ÷ÒÕàiì7º£²CT«­€òK¡â<ÎŽtO§=yAØE@ ƒŽeÏK›xËAµxœ‰…Mˆ…lˆ€–‡Òß´‡œFðŠP@€ @÷d¯…ÚÂ÷û_ß²j²Áý‹*D=leo69šÃ!Ĭ[ý›žCК ²ŽÔ 4J ïßùz®Ø.láêÓOaš& Í-Zä”CNï½Ü @€ ‡€¬¶PñSYµÄO7\>S¦[ZûFš.oH?í" xAE:YCˆ@@ѽ]#g[kE­¾øu9³…o[2CicPä´z_^Ž$:@‡CNãøC(  @€ gN§S¨#P‰Lm»?•'mi€¿n=„íb–”åßÔ~õY ^¼ƒ“  "ºÿZÏÅJoŽ A© ŽFÔ}BENo·‘Óg~ îCxH@Nˇ÷¹ @€È‚‹?Õ>iFtÉ:LŸn=~ê°Z¤uDt„êUp³t×:OBp&зªVë¨Óg¨S ˜µUý»Oš#mŸëõê`Ú“ žÈ]ùõõÕS¨  @-5÷ÌcSå>Óì7G.ÊM·Q€ø?9„˜µð0>JhJ šS®ÊXM¦€À€úÞ°·îQ§ÏÄI³¶¤Û˜~ÔH=-ó¬7U¹¹\ZtPf@u œÏg­Ù¯[r‡ @"  ]UlÉg™jÚO&|Ùº(¸üŒ[©û­ÇOœŸ­#*+“c¦Ææ½¥ÒZ!Ð÷†½‘wy掩lPë]´L;”zö÷÷÷ùù‰·€2ÈK©Q4ãE^ @ŠȲ å»#8µá+pXõÖºÎ!ÄLˆCDGø)²›=Ô`Na nô½aoœ£NŸ Œtc¶ðAÁ ŽyÔ;Bõbùüßßß‹Ûì$@`ßßßÒˆHinª @ˆOàããCVÞ3ÿ}—ÜpÈfÝ"­ÇOŽ-kц€ñS ‡i ÖÝœô!$è{Ã^!‘óöclá›òuæ™ D‹œþüüàðïý „€@d“FÄúýÈmDÙ @£•÷ûû»í·ñü•øé†÷CnLÓ¶Ðq­Ÿ±åbî{ΆøñÓD Ôîp¦‰C#è{Ã^‡Ýþ [ø¢@`E `äôíím47õ… P€<““ît½^ &KR€ @à Ùzš+[ÐÉs0)â§+ÿÀü§ƒ£ ƒø©ul«D³D¼øøÏõÜv6fóÞƒ#<¯CMèx¦P£Ã8[øTZHªiÑ®Q?ÿA_¯CËå2½rN€ „" øéíf»ªq—Jüô™OCî‚ßÛ®VúÊåYâßwð¨(~*×k|>%ð忇­/^NÆæ½»Æs†š#Ð÷†½R2›k‘©À*ùÙ”1Ï K@]@zxœ.üõõʨ§0€% ‰(óØÎZþF‘bC€ú&°TWf½¥ÖñÓg^§AëðÎ3õ«à½œ…SK“VÑ|Á™íøÂzs­—|!èÚôªíOÏr¶O‹m­Öáøõí&æ×Ž 8A»†æëÛ7Bí OËÓÄ>>><³&/@€ H@6à.›Ñôa9ˆ˜`ÿÐâà:h}Õ‰¢Ö#Ë%*ã¦\ëÏáeó^Ó‘Ä!˜ÐâúŒB¯´uÔéF+³…oòF!˰Óí7úÚ³Ÿþþþðí'ºx €ÀKZjºoYÔÿ’@€ P‹€â§²—ªKÅkâ§ÏÜZw`Ý.rÍ=˽‰û:…³8"Ü•SÓ˵®¾ù ¯~a[c6ï}&܇Ú% eõM|â3 *òr\BØ#Cx¥]¡ú¯,å÷÷÷Z¦:ùBèÀù|^ªFßßßýÕ‘A€ Ð ÙƒÄOã»â§­/?)‹¨õhr‘VT4eÇÚŽÝïKŒò]/­<®!4M ã©/Ú-¡¿[ížË2×½9ýùùá0¾nœTB@KM—*´¼‘A F1 @€ÀC§ÓI¶áR©x-ï¬æ^Gê¥pžu»´î—+uºY뎈Ùüî.˜#Ó¸dÝI€€ÖgLÍ_«û }É­™V1³ë¾¹¹Óé“+™¯øçív#rúÐuÀM@Gh©éjlgÿž¼ @€€Ù†ÄOã;ü­G®#!¸-êÚyïšÍyÐJŸíd;ø•Í{Wv.BèxÇ€PÁ ñÐz„Ýò;ШÂ^¡:ïõzu0ÀÉ€À€îµ#&6 ª @€@sd'Þk2Uî°;ÙC‡ƒÃNt¬ü½ýÜò„¶ƒº?›ô›°] N—œ…==£vŸÜV^"â€@úØõ} µá§][«Ï×s»_RJ{¡"§—Ë¥9+žCh‚€™Þ+HÌWi¢í($ @"°:€à^±ñ¼ÃÀ{ß‚Cüô÷ß¿M¯"ÌC¤Z·¾êö^ZvÝ‘'VŽtp-YÝ•c‹³yï á]@ ^7ìÍûúg´ˆb—oE“ZüŒRf܈9ÕÑ{,€Â%@ÀŽ€f§ÜkDÚÏ.GR† @e Èf¼×gjÝ!~zïapXX¡åu­ÇOwÅ[¯ï½ìº£¶Î^®»Z»'BcóÞe£s ´E ã {ïÛŸÒ”“ÂP䣙’Ýö3*L¯‹ˆ¿È<ÖP‘SÎÝ+ëU 5@+:Nú¡nÃÓ+Pü @€@dšyûP«ñ¿IüôÞ1â?mÝ¿šŽH.Ц#Å÷â±ëŽBÑ ²Fþjÿ‘!$Ðñ†½>ñ—%À iT$¶ðÝ¥öðp(Ù§E ï_׺'"§‘½” èƒÀïïã­®ä죂Ô€ AÈ~|¦ØÜÛ›ÖwˆŸÞ;:ü„ZÄqŸoCwRvXm½ŽGšCËU"/Þy…ýH©šx7E´Šƒ%A@ ôºaoút©ƒWaJå»k›‹ƒ¹o¼>ÈÌ¥&4 ™NÀgµøFÇ™Rä”EOƒ¸8¨& P‘ÀétšÞÕ…Ž«X0²† @dEÊ–\i5µþÄ/tï‹pˆŸ¶Ž}Q¯nä{Q¹¿c7Õ_«2ï³ëïN5Gµdò…š#ÐëàìvÔéC¨Ô¾÷Çʼn-|ûÓ4ú®QœÈéõzÍ0“y€ö8ŸÏÏžïïゥñ< @¨N@ñÓg§!˜íÐó3Mãx«íJ-|›S$†-°O·Mé>¬uªîm €À84änŒÌãp ¦€ tF@3r7”ÏŸˆŸÞ»Yü ·ÝçÛÐ"y{õ!o7ŠÈ8DÛ5 ,O…Û.RÓ¿ª_xŽ~ä@ ›@¯;-lï/‘kõbÊG-|›þ SxO+µ|ÕÝ<ÿüüüìÌf§:€"ÐòÒAžƒ§#·eƒ @`›€¬Ë =Çó'â§÷þ ëpDo?·IJ;¨Ë½¤ÜÑImžG³é4Õ”RµþŒO0Ús€%/@ ?Û«&Û‡¯Ô7Ý¡½VG>#¦J'‰gTP-®cÍŸ•“û¨E NùûûûøøØ6~ù€ÊØVi.—KÙìH € xPüT–æ¶Âãó+ñÓ•ÓC¾‡ø©rYåÛП"QjºyÀUå9vìÓC§\FØYl=CÒžÍG^€@7ºÜlaú¬;´ÑÞèƒLªQX91æ›§Zðöpë³/‡Ù³¬oòô! Д•íñ™¨‘@€Z' K3HüTÁ Ùà{ÍöŽŸ×ëõ­G%0ÊŒ¶j´ŒgFò8›÷>îCôºa¯ÏΟÒ|2TG}j}yW"·7ò›QY^@ )„Öó#mÙC ôu²…¯Š1Ât¦àÚÂ8Ås[$þr˜%r:¦§‚ZCqhIé˱Z|Ç)3% @Ç Ä‰ŸÊBÇñ²¦Ú\7E;=òÌñíì^Ö‚Ò ¨9"ï;B÷”G:Èò¢#ýšw!>tù¾üóâÐ:Fqç ³›T;¶ðMW®x2›@œÈ)똎Ûû¤@à  ʼn*ÜÁŒx€ D#$~*wКt'†õ2€§·…铊Ùù¬ÄI´w>¦MÛL!IÜDZÿ07!ÌÊ.œ 2ÀJÇ›+hza[d ß ²D1¬ ĉœ~~~F3œ)  hIi¢òöþþ> ª @€@ßÒ'’%ªLyÎ[:CS³>fHÀOÿ8-3åÚ™€¢uj…¼þâü–Šê §JvÖ“œ[ì ætùi–Jã³»‚õ>óªHÏ„Š¡ÂTùP’i߈œömõS;@ÒÕéËå’‘>¯@€ à4³7]#²{’øéÒ!#·˜udMñYœoKæn× [qÀ&vç.ýù÷Íí¶6*;A£èr¦ŠÏ úªÞêwØÂׂ*iF   íMÄ!5§Á]‡ÀÇÇGâЭÇ8¥zÁ ¦€ Ñ?àµX•Áaú÷ ;²®ÀÖý3ˆß5ÝšžtóK×m6ïÝ+<”"ÐåÙgPUÄÇs2[øÖýR“»Ïÿ 1“VÃ)‘ÓѼÔˆL@‹IÓÝßßßÈu¡l€ @à8ñS»#«,¼ ¦i Eº²š÷äõ_M«@â3µ¦õnÌy2ø––$ÌuéõBîwŸí%™ó 0þ”·åüþèô±²ƒ„Šá8îõë?x½‚DNÿþþˆœ±åy€@q·Ûm—*~:Š—!@€@Aâ§RÏFÓ$:jÖÇ„%Ö´ãÇäØltÁéÒVr^ÚSKf,,©r @@úû»ÍE©ˆ.È—]_gÿðq­o4ù' ›+ ¬Èéûû{‹˜b@€ÀD@ƒó®oÄù| @àÿ²÷ö¸µûJÞî<OÁSðœwä)èü;;±ãΜ¸g¯àd݉ƒظ€ÑÉ:¼¿ ½Ð+¬‰"Yd±ø²Ň%’ªb!ÀœØO¥’ÃBuýÀ 6ÐÎÉD;(ÿÕ–V*Œ3ã$~ÊmNè;õJb@ 0[SÚ ¤ÝCÊkŠW÷yÎŽFdÿ+1jøˆ@ƒ#BRÞ,§u 4 —€ÜHSÆðmš?þŒÛ^j@€RhßïÙ fÛõR­kì§[E‡ŒVµÀ>Êûéx•kùÝ´Ñ?êS‹û3¸·¨ãœ(Ã-z¨ŽÛ›äEëAY]·³nsS÷µgK‰€À„ºûNÞ€Uîh¦°^·¸ÚÌÓ HHÊÛÁZ®ŠôÎ –Óy¾ëi) <r#MY{\¥É+‹§ @€ÀX°ŸzÓœHiíڀέJ§Ë ÅZc|õ…ÒøÏIbÆîÄÆ2Cq€À]šv5eT™z|fbgRt8ù á«ý?>åZ9!€åt¬¯rj @  ËårwùºóõõµKm)€ 4&€ýÔ‰Šc­†ì§Ö§gÊ>;ƒ_ኴú…¢xÿ#åð׺n°R»UGç-Cµñ* ”˜ÁÈ%ÿк€»u×õÂW§°œó¶®pR'–Sé䟞žÛR ¤È[â~||¤AJ@€ 04'öS,z«¾¥ÆÚ+íSÒ[»ç}¿È஺Õõ£TKOÁ41Á{óDާ “ ¤ÿeÅ«8ÉëÜ,èd•fÿv: ºÀèUm½;Öû0“F?,§C+¨< 09¦Œç·i¾¾¾&ÀC!@€Àÿ! ]Áyñ:n×Q%w°è­j–qŸÿñ¹ÇÅ!i¢œhJo_1ULÕ{ÿ·÷ÛŸ ï(ÏC2£'p¢c,ì)‡|pudgƒáºÖD97Bø6(Š8K@«Ûüð9EË@À?¼Oµäþùùñß:j@€*À~zV;aÞÂv¥[Æ~šØ‰RzØÃÕ}úSú±ÅåDº²ê!•ÿêëÄNÜI¦fÞ²å B²$îŒ%C@ ÿgK&Çýg5uf‡ðu{ÔéN“kùÛ '!|wúh†Ÿ°œn¿j¹† C¿¿¿Ùk···ÃüI@€‚À~êM»ba»Z!c?}Ôé2^ºÏ\¡®õ§tËòvY«má89›Ú_*GŸ}]KfÈhL@! ÖQz΋ “¢ÌGÄEß{-RXN???ƒ}Ó@Q Èu´dm¬¿QÉÐ.@€ °CÀ‰ýTŽ`‘t%m±ö‰“Íh ýZRÉ`ÏÊ4™í5Sò rø¬:ëÖØmq¸• ÇÁúô°9 ½û—€@ #ºO’ Άðz5Bß á‘Z<¬Z±œî|_ó oÞßßKVÝßßßÞZD} @€@²Ÿêû·d)UåÙ©¢†î(Ol&Ç~ºåŸá,SEà3‘ýÖ%ÇÂä'kìÈ<×t‡b@@À9M©Ûàó ¡w[šnRŒ±iÇÉ‚¾w¥1êÍajG],§m>Ò)€@-r=Û÷Ôª ù@€  `?õ£c‘ÉLz°ýµká¯ãÆÊ«ØMò‘±ðâ,ì=®ÞQÝn[*Á–¾<ÿ«†öý¹¥”~G ¿BÁŸ€ÎˆaL9SRš#ÅQ€‹©ù¬*=¢˜"œ£§Ár:âW6u† ÐÀårÉXZly}}íÞ *@€:À~êG£"³Žµ.NvÃ[ÇF?Lk¢†ªv·_ -¯U±GýbÒYÅ™¢vž¹…'oKi¡,@ /i=÷ÇöSAãmßÒšÍÉ^¬»1+;‹£ÀrÚñ3™¢! M |Á̱§C •‡ @  ì§~ô' ì§‘\?Ò;NNÖŽ½yß&R½ªÓ5DÕÎËvç)èjU#Ø}5ß§0ìô?A~ÜlœÌnΣ¾;3]vYÝÔlâÁ°¥WC“ZHÂÝ»¸{<ØÇÇG•ïM2 0.———á*/§ÑòÅó×××p _+¬£ÊžŸŸ×?¹€ @Ù<ØO'÷†[õ3ŠW¾ÊÝÏAª˜µ¸ðÒmZ8oîNùUFÌC™·°ñIÀÂwúa-¬Ò)N@`tSM ‡c飚ݶ;´¬“¾ZT0¿?ÈAï{°œ¾¿¿g]ò  0d†SܱbØ–xªµÜïïï ¨ùkhËï Ø©6 @ 0í+Þjºº\£öYÔ;â`Í?¶&sÕ’9QiÞöæ÷~Ë=g­çÝ‹+åóm&wTîݲ&¼éÓ¤žÑ§<4#€ç~úd±†ð!Þ…¼>„ð•¹mòàé"êÏ0HKM ÈFæd—!|M;úTæXN«|¨’  .öžò”lovÜ12f/¡;Î2R_.—ýš°7Ì;EC @ãøüÌ7Ûí/uo¶\A”g=”c]yÑsÊѼ˜({ûÉT±B˾t˜ûEäýŠÚÿ”ÄõB^ßñ Ð@v öS#‰g#àä”m™íF_-9Z7æ­ç+Œú²÷³”šCð@`?xï2bË”ÙÒ´§W+ÎkV2·.¼‡æiÕÐÕ‘¬í)Q" @~`?õ ¨9«o‘~¬Ð)²{«u䜓`wëçÃr!ÅW•ãð,|8·<·ú+ÁãO@Àš€&Â]1íG0J…€öê8YÕ°Tè"3gWòÖS?ß×ÔšÀ~ðÞu—ï¤R6h©Ñ‘[ªƒÊo‹PÐãZ¥éx¼ì¶Â\C€ À~ÚEÍrUhz¤/YN‡ŽÌ&ý’“wë‡ÏzQKåhqÚ&jÿ«W&ñOÉ[÷z«€qt$0ú¦£ÄAd½øYÞhq*ZŠ–S>¨!#⹬i•ÒÚÒg§¯³®ù* tœ~lk¯ƒe×Úr@€®Ø­ÇÕ¤ÒóHóÐRÑá°,™D­<£+ÄdUîCl›i6Z.“,;jš·.ÈbÙñŽh*$„奄¶8 !½ã°œºúF¦2€À„J‚÷®£½ü4Ó•%±p×/ΚtÕõÒ*ña· Ø;á{D“!@Át·ŸJSqJ³Aâ–ƒ®ï&üG rÛ¨,qŠ.Û²g+ËÉÙs¤—û€@!MLa†µí,£©MáñÃ4mæ†h–w²£|¢ö5yc9 ö}Ms  H3V¸@]×.ŸÍC²±V)î09ÕVfM Z•;á.U"ýJ• @€†&ÐÝ~É$QEã?™<:ûê‘v¾T±§KYÄ€Užþ`ô:9xnGŒù È&iÿÉ­³›†¯H }6É®¿*NBøªÍVMÙ¸ú>¨M ÙÃQùƒXN‡þަò€@$µì†šäÇ*=Ûų-ŸARréN5¶?©Ja3<^·•ဠø!Pk—]Êâín\-új®J—ÚÖ§íIÞF-UÊ*뮸–Ü”+ Ç]ɛş}WÒï< Ô"iÿ‰¦ƒGXdðj9ßYŒÃä)Nö¡ií8=HE2yô6¸åÔÏç05 U‚÷®Ó‡¬±¢øV4Ô®ÅݽÐDsسÏÏÏ ±{÷ñ¼›jÝa¡$€ @xï¹éZK2Eˆ}¤Öà~3òM°ðµÌ[r_=% d3KAdü¬›u¢—Ÿ+1æO@ @¤ý'‡®Djo³ñßUA²ZÂ×Ul+£¯¾½£ï¯¾©* ðª»È—S·Üª*š¸¨Þ÷UaX³JIFÀÞÛîæ @ôµŸJwýt«Ïi-ÿß¾¤GKqYÁÚk-¼E"Ó×^>Ï–¨ñä‘Dq”@¤ý'éò íÛ~<;ä’~‡!|wàtüIýÒwÝ‹å4Àç3M€â°ð •_§¼;·¬Z.ÅÁªÈºu=m—F°wÛÑ\C€ ‰@_û©LKœÊÔE‰$­¬O7=)µº¨ÊÄâs† yÅûö0A‹n%O@  Í‘ §¦]µ½åyßÇêIŠ³Ø”uöÕc×*lLDã,ÀŠé±œFú‚¦-€@0&Eyw®Ál«û·îOOŸŸŸW¤`Â6bUcmãU‰ü @€bÀ~ºêU&¹6¯ïÆûGK}…+ì¥'?¥Ó~Tÿ«û2äM"Q~š)#¸OÙ¾’ þ„RtÙKc4 ¥»nÉ,&T£*‘m}CøJ~pa^{Ùb¥·}[÷¯±œÆøj¦€@TvÆM™eå˜)WÐýi¢î¯Š£»í)…®§w­-{·œ¹† @ *¾öSlL«bÇúBqMûîº_—ÙW:lôíóͺùòWÑWõ)ÿSË^†àG͜侬-åÝG€@wš"Z%gjëY…ÙDcª¶h1ÐËl×qeå­‹û¦Àrõ švA‘9f.+êþóŸ—Ör5Uï(t°éY«ìô Ð@€v˜®Šò…ô¦f Véî<„»+ ªXG;£Š.Ñißm‘nFr˜ë]0êÐGÍ}@Àˆ@$»LŸå”4U ~¬ùh[Ûök0–Ö+ÿ¾»ªˆg¸óùÉO€\0µ3–/Oå oSM@F§KM˜à\I/• @Àš€NF8µ«›¯ŠUÉSýBêV û`¹È ¶»*ØBŸÉcÕeøT†UìåâM€@6yêzë'®8‹L÷yÓ9m·ÕSÇ5 ,Ï:dƒ¾K‚ÛS笿æÈ€² ÈOÓÔÚ˜½0Îxðþç2žJ„€½Ùbƃ€ ŒK ¯ý4’›Éª´é{!/<$š¾n™ÒƒO„â[4Ív_±Wé>ÃS[yB $ Î݇‘Z°Ø¢£¤œeY«ƒZæ£UYƒ¾°ö©Ñ2/qÔÅr:î15‡¦%ÐøpÒÄ Åa2öNûŽÐp@€Àä:ÚO¥í‰¤/]U7½.´Ù¾™Ã©õ¼4‡N´¾:LÎðí%ðÛre¿>%“$†üˆ4ŠÊXf7 ”òß}\AÀž¾}ÙÁµˆ¾)ìÞ¾-ð»×XN'ÿ ¦ù€À¸"ï½;C•ß$`ï¸âMÍ!@('Ð×~Š&°\õ'Ó¤…Y°|™--–ŸÃ@-"¹©p¹WÉÁç+Pþ‘bÐ(êdwM•ÈÚL&\*‚y§JgµÌD±VÔwï²ä¡eCÜ–¥—¢c Н¯¯òÏ1r€ ."ïµXi°·‹XR( @®tÜn']jÀe”ôfF¹Âµ·ûéYÕÄ‚’Óp‰ÅxVö—B‰åq@ =H£¨F!‹‰æ¶STJ$n1æ ÃVH<ª[÷´kè°ÜITg{ûÞ=ºs¹\žžž\}ÖQ@8E€à½æ8Ýyy9“Ä€ @ }õëÛgÉdúÊŸ<Õ–”uTíˆÄÏÿóãí@[ o ä6OnížRL˱ä'@Àýì±)šAšjQ¡¼ÚäÐ’@ÅÕH°×§¤¿zÛœxÅ´˜“@Go‚í´â횀½s¾´€ [}ÕHïQ¢6™íYi›+êßê.ÑU1oÊpY™ë¶qÉ{½½wFþÅÂCž€€D²ýõr~×*޼ô6í×§V_ú}áÜq=üûû‹?Îí%w ŒH ¯6ÌçwÜ+FìJê @€ŒH =@¯•1èöµmë¯R—ÉߤW7í”ëV…kq¦”ukpᇀ†‘å'@ÀMd~†Žòš(R}G¶šæ0¥•wb³ÊCø²Y:Ëâ8ûôùõõÕ苌l!@ =‚÷^Í€lj/„”@€€sïïïWK¦–FrB±PÁɱ®¯zvGÜêñ,¬iÄʳïZyúÜZ°óîðæ$ÉØ§¶xèDñU®ÖXJ>Ö²]&95`难リœÓQ=@8K€à½ë‚–€½g…‡ô€ LB ¯ý”P¨”u²,Ëf·®fý\H‰çV[kÇ+ÿ#)õp¿¯ŠŸ“š@À3`Ö5Çm™P½Ï÷05ø¬CF_¶o-]©ï…Ž«bTÊ“|ÓL@`6ï]´ìMòi/ @§|~~öRJ‚ýôJÅ'Ó¤+Åì*ê,çÁ–¥C^k[ë"˜ÎÿJØbüéó}©%äÜn¹Éûº¿ÝÍÎòjÄ„šÑ›íÑ» SîöãÝ›‘\¶³im» üö¦¾’N}U‘€"@ð^M|ìHb©* @]|}u;½KJ$4~«BIúÏŽ[ëoUFëvÞMF mŒû«pº½0êúUø¹€Jh[‹ÛÑ#£bnC…ûßà”A;ê#‰!|•,*ôviñyÊÜ\2XÝ>‹3N—ÏR … Ð’ÀäÁ{‰®ÐRØ( € A <==I?p«4hsû©”H2ÒuÔít´Å 4—®æê•Ò‚zË^½y¶\·§ï¼YüÈ¢ç|ãÍ©ÑÆœpMÙ„š?Õ§½†ð%ðÅÒ5çw}éûhÐ/;ª @‰4ÔÿþzuSÖÃ!ôÞŠ'|ª])‰ƒéü3dr G1¥OI4&à<ØûÙQέÛéU·jEA¸×³Û>ýN_V KwXÇpõ²<úSŠt…Çç! Ì@àíííÑtû>{goÚ@€@-Z;uÜt7¹—Ÿe§KˆöDüH×zð½¦éÍ)l‚hl­Éér^%%–Ó¨_¸´ €À>©‚÷`a_ø€ ìP*ú‡ŒL¤-™9Êœ‘)0¥#D~Dg ÝõXŽ·‰*J5jQEÆVÌZÈCÊëC@àŠÀ$qGסõªùÿÔ€ 5qÆì’LÖm:HäÅaY®ty‰>??w¾ø €¢Ð9×2žþ×ýW—Ù§q¡Qû‘vA€ 6¤=h¼„[‹“ùcfÿEØ[Q4»Ô!QjÆêˆâ‰ßêϲ² ìß­¦­ÍäèE ö&+ËÚbóêhî9Õ˪gÔpÊWýŸƒÓú)‘®˜XÞµùÈ¢@èN@qzud•¼¾¿¿uÔuÅÙÄVŠÙ«†+Òþ§Ýå @€ 0.­©z-ü¦Ò»^i·o¹—­pPSš‚ÐZ(«¥q%EËŸ‹Jÿö-Žg Þ6_¡§o›Ì@ %‘Ï·ãÌíµšÜeïS^·jÀ„zÛ‰ÜéNÀbS\â;¢¯)ÒÇýj£æ€ °O`µ–j«ÌÏÏOâì0C2™[ªÜo÷ò+ @€ÀJ@ËËŽöSéOºëpzU ™÷ÜÐâ,ldʳW§W/W13¥ô¹øýêûúmîC`*²!VÐFÉP&T‹¹ÉH~TÕI¢+"?“×S}#Q?ÌVZt,§ë €Âo©BÔ*¨ÖÒépI 'ÜÅ–ª ÆØRü4€ #Z/uŒaÉð¬BÌZûª¨hC«LìË1¼¥äpšâ5´ì¿PÖ¯Oâ·'É 0'éþ ³ÿ«F×F!Uuæ³æ÷»’_›Z„I„õ¥CÜB£I²… И€ÆóÅZÚÑ eê%¦H9êÊ/Ufhv5fŠƒ @`Zö²ŸJ‹2­V ·S"îu(ãàŽOeö—ÈèX §Ìʉ’#z3¥hã‚ôúd‹B%b ¤U†,ÆSUIïì<«-7Ó®¸ªt7™”0Z×íüö')„‡ø"£’€ pK@Ú*ݹ]ºÛ¹¶ ^l©·BÈ@€&' å¨ÅÒ+%OÙw¤Q)QÈŒûìÇ?>RJ#“ÚQ)çOµ:%±TÜ£Kšzö¬¯S`3GŠïmŠ`H' £¤Õ× ŠD: U“=X]ÈðÀ×å+}œ©›Rß8“åÑ|@cPl4E”ÅZZw6ÌËMî½ ‰,W_¶!õQ[@€ªèh?ùô4ÙŽóÖ±·OI§-kì¡þÊ#§ÂÑcD«sN¯d#€1ý®ÐÉÉ=þ„¶bÌ2w‡”’›2GÊ(™7Doñ¶¹V=1¡–t7Ïž% yk#Û·¥H÷^ý‹‰ !@ .­µ´WH´Û„;·[ª4‡ïû  @CЦ²ÛR›;ÓêcuTÂÚÒÆ—ä¬se @ñ9«ëó“^BRbdO?m©[œOS„Ÿ4¨E@F·0MݱhÉm1¡Ö¢mzS>³È[FGا¼ ú®âû‹JB˜€ÎÖ”'£ö·(B¬âĦ é¤qHàûû[ˆ-u¶÷—öB€f& åk¯U™,D[eË<×…ò-ptŸÊm_[(Ù¤"Ôû²–*>êæñQçö²(³ˆ:’lç òkM7íëÐjy§“Ã#zzMÓòŽ™ùƒŽ¶CðFkiø‡Å–ªËr%ö&~Ô€ T! M€Ò6tY×I»2§K‹Z}\Z°È{F¶0Qz¤Öó|ÿõï¯Ù‚qõ ~¹d͹j,B4Í9GçM²YDQ°èY婪jÆÉk)OAà%q3J¤]ß2ú¢©òeD&€ G@ÖR•© ½ôK%óÏPøåÕ–ÊŒœ÷ñ @> hmÓ+vŠt,40±ïKiyvu*VñT…N¸wJá?œðHßXÝqièÀÅ;=hdp¿+KÜ„ÀÌðO܈ý¤iz,ê Qñç~_ÕW2‰#°¶œÅæó“ZA± hìUWÅqÅZš8aÍ“L FŸ“lȤŽ-5ö8@ë @3кWš‡.k¹AËÕS§TL!)Õ:þõJn‡31+p±QŒ»Há·oΧW2ÏŸ¨N`Ä](ÛQ¢ïµÆÞZaª÷ìm†Z`Bí+01Jï55c9áC•6BN¬ÖRùÞ®(¸GdK•K²“eKu"ÌT€ œ" eÌ£¥Žõý9Ý[èäÃU«iáž3–»¥u˜Ç¨Q7ßë‹ü!˜Àœór]–mŒ±<íÑÒÐZ—¹ÍCÀh;\ЍËééÔ÷‰!@ €Î²Ô‰–ò”µ´×fû”¹€4c«2¶Ôô×”€ 8! ýC—E—´‹ÒºÌ£bZ[*ç”à¢mükâ`Ò*ï´=ï'ÈЬÎm W鳬wÁB~ò¤Ž§ À´õ«Ï³2Gjn0ÔWBÕju˜!ÃŽ;šäÃâäŠj@ˆA@Vµ©ki••™$XK•6’ ü1†Z@L@ëäÄNÝdQ]ä•fò”¼KR÷û€éÙF1j«€lwûÝâæpqŒßš%Á@Q1-º•)Ò[F=ªr…vê¼×Di·5·]TèQÈp>M|5HSPÝí:tÅ4Ý[Ì}§:7=ñ K‘¡ÅÉOåµo-]®*¦”’?ýÓ†”€ °% ßRyîK탵´âÄDV,[êöåå€ tÅÊç0ÏQ<ëꬾu%3CÄ<ù4­í­xáßUJ5”:ºb“Ó³Šúfõâ™Nž”Ž€ÿ±´îÜ87E°8ïÛHÌTU䡱„ŒU\¯]LúN‘«”‡/&ê@`ІºXK{éyŒ*d;ÙRµ{Jáò´€•Àƒ•„ „$ uH¯uux§Ë»j1é'å8‰ŠÒ"¼›Üyî‚urS§ÝŽ: 6½×öO ží[’öB œn§éãOIJM÷c™PCÎ %=ȳ" W±Sʇ ”¤8E_òó“FA ÈZª$—£KS†VÒ@`Dr^m©_²‚ @‡t¾€´íWPÒÃL¨£›§É[7ÛZÒ%™‘uÒ­&S¾.ÚÅ+¼Qm" ®z„?!à€¬!nÇÒx“×Þ@îóÚ4ÏZ%ž°Uo‘Ö]]¤Wß&²~Å€À̤ÉÑy‘‹å´‹JÇá—*E% § –c5˃™=Ú@èB@Ë.‹my&z¶…UW@Í“¡ºÕÂŒ(ƒ¬O†Ò3»2í¹UÒ}ràŠú%H» И€sþ’Âó³2¡ZÌŒFÂ3ÃឥÅOݾ._F2¶Ÿ­Ì]¾‰(€À¸dKÅ urá׬ÖREî÷­¤æ€ Ä  ev—u*\?ú±Š5±PµÉÔ^±†³’¥Ò›>\õ ¹-Á•…ºË€I¡¨B¿ÂŠSÀ©¬42Ë(émÊx$Tª'&ÔSý/±à‘x˜Þ—UŒÏ+Z@ #"úšNUd^À66/qû; @€À] ‚Q}ý“’aH/¹x ´ôy:<(Vq/-ÎuMyköÓ(žC\é"ô(¥‘híÃäW#Àž¥G#L³û‹ u¹Ò„"ŸÙfp(È^§ßýNá& ”ûžBžJç#‡¾Q!Ô36…¿[O2ÅZZòvó, @môZHsøš]YyM,ÎÆò¦í÷¬úŽí($Iˆý Ië `M·Óòi®Jêˆ4Íì2¥Ui8™ A@òÙÅEZ^'¨OÛ|ôQ  09Õ–ª×zñIþXÈZª-RŠ/¡àüŠ2=ù;Hó!@Ž€ô]?etýXÝJZDxó&ò´0—R©V!N·"*un9(r€À´õ°O<\kÐ( ¹ª~–ñ Ýë b½k(Èäp_OT€À褒-U&-¹bKö3Á¨áXKG¨? @[Z6­šö³u{¢ewÖ@0òSð£í—:Ñ­£ÌÖ‰JIUÝvÁþǯèNÀÛF”’q س²Hö²Ueˆ¥Ž5×t¬ hΖ@¯yöýý}ûIÂ5 t!°ÚReöê²µ>cqÂ#~,ÖRÍélˆêòþR( @ÖtF—¥×<ÖŸ­†*ÒµªÕ%ÇU] »„°;D*W ©_ã|z($€À]~6¢Dšø*¶EG‹ú kpWœd_ÄZ±÷ýd¥ân[ßÔ1|Ö8ä@^UAVå—Š-Õz*4þ¥I\ZD9bd@€ áhñÓeå&Í¡õ59E@¶E ™ñ!PúaŸaeÌÓbÚBzÉ~àvzjFë˜X£ºÏ:·Â¬zj4VL†Ž¸(º.íźíèw¤wî[‰ C˜“€l©r*\l© &ŠpH@±±–ÎùúÓj@€ Õ"=FûušqSùÐÕUyuÌMºS ÎÈnõØ3N”¼b\h?ŠR"î˜s£EÇi±¤h qšþFåjI{yÖ ^s«bBJÏ' ŒH@¡Y±¥Þ]{Gº)k©ÎÕÅ\¾¥RŽ(¨Ô€ Ô% ep—.dƒ“öƉ‰j$°ð”>¶¯$ÈŽïó:‘‘Ÿob×DM&KP¤RÚSšX£Û¥°×Ñ“Ò(#xÈèÒØkÍC”¿º_pä@ # é ß*·Ä.[ñ30¿;—¢!@€@lÒotÙ ( iuë‘(.€Å YíUýÒëú ‡(¸ŒíK#ΧéßΤœ“cÈþ2}nø¹}ÑTOÕ–åœOa“ƒðm—5¸# yìO'Z@%dKU8ÙÅ–Ú`V S„¼°––ÏB€ <Z»vYRÊgÁ§º‰ZÉÒB$äSÓ’­, >õÏZëÐÎæ/å§ÅgH›Ž^¼u,ê_ž'± ÏŠ¢Òã|Z.xän§ƒÉ¸È„Ú+þjÆ»£K¯—v€šk!Ôåä\9Èàø;‘¦AèB`±¥þóŸÿÌX“ ÷qï»È…B€ Òxpøi¥YaŒ|ýd7,¬XÊãRØvQ~—©V(“Szð6‘@v à™n§·cEø;šD,‚BɹªÊ¬×K&{y++îbÊçi @§È~j´\ñ–­ÔqlC:%$† @- ôZ—¶±¬õÒbU®Å!Y2ÊfÊAù[Ô¼Ê÷â]Øõ8ŸV‘C2 C·ÓÂ!eèÇÝîºû~ÉŠ'·Ù¡Wy p·/¬o긺–,”@“1Q‘ ¬g1?ùëÓIz–fB€  耉.KG‚ô  “VÖ¢÷­;WùËš`QóÂ<åzÓ&X±ᱫΧ…rÈãÁàvj7ÚŒ’³¢ëû ³p÷]“ ÕzÕ(g]O™ª»,‡t2݈Ÿ<Ô€üøóçÏÝÕEà›ÒÈùïj@€¦% Hûµ(®4Ö*µ”üuTYõ®—1¥è¼4nO‚“??›‚%s@€ l "MHÅå_bV_—/kµùï0²OÙ…ìS…}ê%Év­ÞéÁÀ?á|š8Š’,<veè2š¦±q,*œÑˉHÚ€(x³¿¶x€ö ̰w;‰ïÃáW@€ Ž^^^¤Ù®ßÚ\£UKT‘UOfdœ’*¯zU•¡bávq¯8| d̵ŽQlÁsˆ<58ò'bЃïÞãUãJj»ŽBãŽ"ü 8¬°Ã…/Në¢. Ÿ Ž_+ @ L°w;•¼7°lÓ4@€x{{Û.ÞÚ\K3Ì‘]T|zW)H-ôü]|+Rä_³hoypX¨‘}?¥gI'Ø_äphòS%™P}n+ºûú蘳î‡ÞÐ5ÑüØå \ôº>÷h Ÿæ Ø»]2ÛÁ§dR+@€ °è²ÙOú´¡UX#V^ ÌíB½ÖuuLÕ³‹zðˆj…¸äã|z(Š$L·ÓƒL€"4 dBUU™=Ë¥ÎbÿÛáXúõõµ~/p@¨H@{»„A;œû' xoE¡"+@€ `A@ ¶ÆKDgëµ\=5 ‹¤4¢qɫ³ÃiÅ–’ÕœOÛÆ”è‡n§;ƒ?]Ðæ%‹™ÝèuíƒÂ¯z0ýOõµQ¿ìd{¹\¤Ù¶øî O@€€öçìÌASýD^@€ à™€t#???í¨x"¤ëÍ S%+*B¥”ËU{!<,Qb¢LŠßÙÇq>=K„$€ÛéÙ±‚ô" £EÇ2¡j‡ wŠ@—=EòzyyñüñBÝ @`\]Nrûù@ðÞq%™šC€ 0 iHÚGMAQ|J{–X&N »d-ßaUïëâqß© á–-u%JQìöÛ–ŠAÀŽNɸ1ó³35#[LôÒ®zª¶˜PÓ%¶Kˆf©µ'ù¢™€ И{o×Wïm,„@€Îx¿]ÅYß‘Õ,]}DÊ<¦Iù¹äUæê) |ê{­¢_íU«ùó@—Ãݬ‡;ò‡À„˜“GìXL¨;2æê' <»vzsýI”ÚwÜŸ?Î~D€ H€€½wgv‚÷&ÊÉ @€@/ŸŸŸwr¦7Ñž­*2‹ ÅF¶è¾òËŠ…ÛÅ™â†4ºŠ!lÑä™N@–ëÞ""`*LH¹C@ƒç@›O´Ka‡wš3ùOZ)µåp~éõF¹€f @ÀÞG3;Á{gÚ@€Àè.—Ë£åœÑ}Ùª8SÒN=hqZ¹¿°Ñ¬å"J,A;Q<›ó@úÿrÁ#‡É àvzv| ý>™P}nOºû¦«ªå;²öŒø«\‰/µ^“ÿüü(šâèß2Ô€| `ïÝ…Ðz“ýK>å–ZA€ •@—­´C#êµü×ÙÂF)%I<[)H-ì¹ëGö…j…òÖ•Hã|š-Ì<8ÜN] >a*£Im,*[é¶²g±„;_^^Ö/. @u °÷p"&xo]‘#7@€ PÀë«I ×ý…¢tD[•×åŒlOÙ=åù8¶ìF•w9ìÀùtØä×p;Ýø©œ€Ñûܳt÷ýÕ°_²A«—“Ôkwù˜Þ|¯þMA†€ …{'q62ñÊ@€ ç´á-qiW1~uUvþ&RÀæURj@*JK­¬D W—¼>mð”Ñ€ZÂC>¨B·Óƒ EèhQŸ³ðÝ—hrû©6›µï¬ÏÏOçß&T€Æ%Ð%¾ÙÝ5FùÍÿýßÿ-Ïd'¤5nGSs@€ 0 ö1Ud˜“¾ gF> n©@uFêÎ×A¯Ÿ¤™ÄfQEØL3Áù´× B¹mh bâ3CÈ|%°Äho•;û*iSÓZç9/,6¿í÷GNòqG3!ô"Ð^¹´?ñ•üú/ÿò/þü)ÉáðYåß«§(€ @ …€6J—r¸®«›@V¶9eu[-©EŒ¾ŒÞ‘uÒ§žVm™Ü±¥®ÈÙå†óiÝ1–ܼ` ‡ÝèAÎw ,&To/¶>“Ïζ4Ú\!0åˈ4€ GÀ4`ïÿ÷·™+×RžŸŸÅAg]ÉEt½Yý‚©9OØx € 4#ÐåðSE–»«îãf:àY}õ.è)}¦bá¶wHiµ"·Üt˜¤ìNçÓÁ&Í N«Ý_Æ (.Áò@è;”üü$Áó9´ªV~(µ¯‰^ŸöCî-Í>¬(€À„ìöþþþÊ,ÛøÀ)ùl;Qs¨ªa1w¼wË™k@€ à“€u@’ÛuæY#]{Õ–ó4o2Ȧ7ÜÂz{+*wT1"d¦÷£“”Rògô5@À?0v"íz:¤­í4·ÿ4&ßþÓþ–Õ»^„±2;W—jxÛæÄ ðò—¡ËÝ—ôûûÛ終 4ÑÜ€ oJO%³¬5Þð{D¸QíÚCh @LÀ4ÉÝ5³tG®´‹cUÆÂß3½G¤è¶ˆ|WNNÝT­T·±º’Ú®|zH’@Cà–@ƒ`¯a_¶¶[ƒ¬¢²ßdugµÃn/ØN£aV@,V·xGÝ´û^¨ù‡ˆê&³Ì{0ðW Mƒ Ž,ÜB¥žº i[wrÜÏM-ºËS>°‡^]µônÑÜ„ @èH@ 6£P$;ëÒÉhÙ:Ã÷Ÿì~J1;z>F qÊ–('J '÷!0(0n§]Žh4ítíºµÉª¿4•\ýSÛ·¦ØåzÐÀÅZ?ô2‚/½)SøÌ¶ì.Óœ4½¿/(€bÐþœºz$åv×viäøywµ¹cÍ”'lõ¸mïýŽÐ:@€b°Ø1xw-º½)=’ÃÍ(ÕÖQºÇ-Ã*×)~EY´(º¼þR€ªÇ.‘º0îl[N£Êe’ °ˆ1ÇÍ;!…äÖ «;WÖØåÏŽ‹eBí5›«íÛ1ªë.ïÑmàÁß,´€œ¨kÓüúúz-¡ºÉrg!zÈVÖÕº¡ÛÔºÃBI@€ З€«;kH‹Ÿä1³B†ÚPŠÇêqè ";b$V/·A‡~Dæ˜ÅÈ(øÐ ¹­|¯œr9$Ü% ÷ôVÈG¼c1ïÜ%ÆÍ»´RºµÉž \|+uZz©[›PÕÛšÌs§ý:J¡—£âú~\P: D%Pqû½æ¬ýP úõî2©úM™ƒûKͯèu»ãîšX’A€ ˜Ž¥âò/q+mÒ<ª³Â–Ê¿2‘ê©dûöGýÚX¿šXyINHïË!¹Š¸Æ4³m²bi& É àœn§Î;hòêµlãmøÙN^û×ZJµ—7Ô°¦Md@`röÊïòp·Šk3“žrU­j9 ¼wòŠæC€ 0××Ç*xݾ҉_ªNåù¯lµ‹‡c›ï”ôRdÌJf¡»ÕŰÎl%PÚõtI %ÜØZ·ïÿZAÝÝB¦b˜ÙíT«©ö›ÐNé~‡øB¡’€ àŠ@•€½Ê$}«¼S¬|ö`ïvthUêÆÜ}/7!@€€+Z³5X”n‹Ni6 …¹‘ÛÂ#ë›Û8ªØ<¡žõ^Èr±£tM9¬6CØú>r×L¼1¸†€1œì4ùGM ‡ ðh±ÑwºiSºÅηýNO9èê„Ê@€À(Êö*â™29ÕÞZ>žûsè¡ìÝ:ë©*j´tSòÝjp€ @ Å Ù_RVÿ5dÒŠJ9™ w,hÙÝq×ô& §Oë•j5öU-M<-ÞÆœO³ßhtB Œ“]â(ä;ÕpK`æ5^û­hRG+Š`ƒŠ€ 9 ”ì•4ÃFYn±=\)É´¤Oeú,tÈU2Ȕԙg!@€ÎЪ¯ýá§Ò/U´6ËÊ"p¢¬±W.œKxØÃoŠ. æ™Oy©„$c±U ‹ÜRèœb¸j ÇœÝG««˜gãÓÕâ³ËKôþþ~vÙOz@€@:û Œƒ r›^Ö6¥”TÕ—(W~~~nKÌ»–‘·D™FðÞ<ì<@€Zh°¯ïj¥ª?u,Ô•Þ‰?EÀHù¦8À[¼:EÔ§ÅJ+3Æb¹Îðù½5‚o»uÐk£ Õ·cw P€^ÉAß»«jû<óºz‘¡5ù/_‰Ö$Å Ùï/ùò´üX ,@˜@‰š¨Ü,¸? –ÿªÖUéPyÊ›]Ÿlûr•Ê“  @€@ 6‡Jl—”²]ùBN¢aÛoæ)?Ä-Ïëm =Å}õ›Q6ˆ+ ï>¨A=<Øt§—ŸâQê¢s>äL¤ˆñ>mÚIHš`âÅ–O\l´_Yë/åë†4€ M ;`¯œU«„”/qzMY_Õ=rT6PMÍ)å^¥aBÏQ„ @Íh¿\I¼‘«`âŸwOáLÔS…L&=|"ºSÉV_NåïÖá4¼ÆUæ‰*ÊÕ0,n_a#É?õšg „ñÏð‚?ËŠô3˜vQ×åðnUš}"Q 9 \.—³«)”*Æ“—ïêÙ œJoÑ­yu.÷Òµh yB€ l ¼½½ZmVI¬ø±[ÊÌײZX6—S2e?õ•QM/g6=|³bœ±¸}Ù%ü‡­&¼ˆávÚÅîã­+©O9Íæá7Am§­õÚhñ¶ß#hY·ß/\C€@uF@…®Õ†üŠ51UOÉ­µbU·YÉë6Ãg–=Q[†\C€ Ÿ2ÉûêÃ_§Õ¶­j·õ¢Š[âpá]Ž×¼ºïäOy©ÄÝ,˵…K×6ó*?£_Hœˆ%Õ€@"¦"‹1* É"Xvj>eÔßâ´…}Á+Ïj@1(žíþLtõ«&& ÛŸL±WUüÓz’ML †Ûià¢i- x¶óuⵂ¥´„¬²ðC±þê!@“Ø÷ñ”½Ot» JñÖ<;)·7oÑÉOaßN-ÚÍ|{·ã€ @àýEÝÙ5jJúÉ%*ßä¹ —,ƒ¦QoÆsLìÜm2yÝõ`H—E€4ÂE¶(' ãþöíôº½é§œ<98$à ûì[Ü~Û[û£ÙN},€Ø Ø«·r¶W««¤dšìÕ–m¹2àî3ß&æ€ @À!mxÛYÑéñæñb°; Ó¨kÒ³•Qož~LÑ»ÚgyØ\ìMéï)ðÆipv–*H`‰¾}À^éxû:È8ü<¡J€ P—À#¥ŽÛV8²ºeÍ­z<4¹²ž­ƒ]zùój¢¿»ìNÞ®Õä @€ÂØßrw™WxSv“Üí¼ ù—?.£ð =˜b3]ÓØY+B:þà|Zþ’ƒ¾Þv{9,˜“§[ò_^ç¸y.Úo{ë&1̇  }>²¨z«:Ô] ©]û@ÿ*¯^ùöÞ¶‘à½;‚â @€@GoxµîH7^×Þy¡Vïì䣀–/{ ßwy ´ó¦ éû£Órw$Ÿ Ð…@·ÓŠG5¦iðÑ?å©YûêŸÂ¶ËJ{õ÷º‹Üª=`y³á¸OÙíƒzÔGÒ¦æ-Ýy € Hà6Ô˜|3]=죉2ãþëëk"™–ÉägzÛL–-»€² @€@6­Ÿ3Ö¥%Ì`ƒûøÇG "WÏJ%®æŒ«mPs;oÊ'Gz;\½ªT&›€F¹…uuwq(·Bƒ²ö-ØíÿÊóÊ«?åçxeŠÅ…6[˜Ë 9ïì¿}’Õº¯Ïa/àr’ýÙƒ€ HàjŸ¼¦‡>??'ÍôÜiïöŽ*vÕjÁ{ï²â& @pE@±DžL=•R>ŒûZ¬¿ÆÐýªz dH ×U<þ!]³O$öF Àþ£-‹ jÆhñÖØ/Žæ²x“Ρ4ʂ߀í¶Ÿ®1®>O¨  ”ÐD³wäçèÓ°({î¶ž%×r³-!ÖàYùün=ØIÕ€9E@€ rÚóV²LÍxVzªC]Öè ¤~Ì ãçiP°qô^hV;ÕkÈ—EžM~Dš@`tk‘µßœvÑÈ{´ÙpÚ¬ »ÖXYÒ5ê^ý«ÚòÅ 9ãìK”¡4îJo'²•G ¸" ;é'Vžwì<:•5cj–««^xTÙ‹Wç‚÷>¢Ä}@€ àŠ@Ýx)‡kÝI\¤„Á{ýt5 @;ª,\Óº“ˆk¯ÙNï‚5¥?_:Ô€\Ý0qÙ¹“lˆÓ]]a§2€ @´íMžuiõŸÞ>ß«éÔÆêܪd(“œ—ÂóoÙ@;C¹,³-Ò¦¬Æ!«¼5d†ÀèûF:º^ɀƽT›aRÚh|R°Þ—±"(f|>ð @ ›€B _­-Ïþ)÷ÕìÒy€ @ét$ÓÙÅjIúI‚÷ÊǶ„Rõg…}³u{•¬3‹\ÌÚ7ǺDY¯ªË6B …@€©§qÐÑCªª&Të1“ü«h¼$:–`úç)!@y>??×™û òÊå)@€ dh¼W§‚VцyÎD.B~œìd†“Û…g\C×Í®£ã¹ ûqÛÿç×xFß`$¼°¯e–Š7R =%Qù+ƒ(œ‹‚ºd,Åy€ 0 Åg(YÊquP4€ @À———’åkƳ3¸«xp²#¸â•ÕâOmÈxR ¹Í û¡)äIÀè>on§W¢÷zt³yv'Ðþz…sñ°°§€ · µOxê¶g© @ˆJ@KÐ+]¨éŸ2êuW©5¨@_u·Lo8œ6èeA6zY½åïÖΨÉÖyGÞŠâ@w»Îåu™Æ+&„j’ªÚínºûšà õ+‰vA€@] Ôpw&M¹ÉÁâuû‚Ü @€RH瓲X­•&¤WÝ•6òåo­]z—Þ¹üuQÑW•áO;vÞ”ò_¶«v¯œûn*¨5‚‘Ï@Fu qÀ.Në% vÞ”!mÍ^ £wl"é Ò? USüè>¿½&Ê-'ÐxëÚÏÏO€¯š@hC {ßþ××W›R  @€®<==IÿÓR+>C|¿ãäpªCñÊ•äMÀ®—Cî1Ћßrœ¡¬i hlÌ~©Ý>¨ÑÆn·FuQQU1¡º•¥¨kh‚”ÀW+jþ„ @àéòÖœÄyx„”û€ @ ¼½½å­cóž’f{gIS9")¢cTè@í²ó¦ŒgzÄêÝÏ4x éïÏѰ`7æ¤NL©yj†¹~  +vUï.@‘Ûàó„" @ Ë%'º>»•‚‰Í @ÃP,”Duh•dÒqÅVâ©uF¦"iÎã™ÕÆ»£<¿._ãbyTó¢VèȤ ð; ;c™PÙêóhHä~-#èð5¹Ï ·Ô§Â€ ¾>??3¾úÖ™Ò!@€ -tAKÙìG"I÷Hû§°ºÙ|î>(oV´Ðh÷ºoçMϤÝlnB è{ ËÕt`7øÔêŽ%Õ“É«±xLUœf–Æï‚¶ðá@€ÀYïïïg™rV=[ é!@€ P@ÆRöìÒw›^š®ì€òܶ:ûZ‡`ê<¯©Ô¡£4Ö.>sH3PãÈŠÙoJ`ªqRsèX&ÔÀ•G™°BÖ³ñ´¢P-ÕWàd@˜ÀËËËÙO âäÏ ´€  Aàûûûìj¶$}ÈÀ¤WšÉr‡Y™Q8_Quõ§ì%oÁγ!7(èôN“ù %f;úi–( ¶Ïwâ¶›¸cD zˆý!ˆ€½C|ÎPI@pKàl¸3íðwÛ*@€ 0çç糫Ù}-Óá¯3ßYr—lRŒ©ɶ;Ë…ÜÊjUÒO>×x8‚‘À™­rš)j:hÐ§Š¥0ÃìïgÔZm^j°÷ããcªï @¨Kàìv}i¨êV€Ü @€ M@z¡ŠÓµ™QfÞ›SNú@ùSDUxk—Ì«H׽РŒ•š# W]Jäù²œ}ýe‘̘nzÉªŠ õl“~KÀnçÒÝ—BúÞìÕ5B€  Ã{w’½{Sû@€ W.—Ëݵ«Ñ;u[åž®u ß)zÒÎ`S¾¢4ôŸv‹xÎtí}…N½}$”áÍ×!TÉü»5ß`aí;.Ò HÎ[VÒßâüâêk…Ê@€Àˆ^_OLßœ3>bSg@€ ›ÀËË9K_¹òjßÙˆS@Iã=tíè()í´¸Šo9 „ôz–IJNyH3§¿PwSjßÅ@&TM‘lºÛܼK@ÒÒX¼å){ñOë @m¤§-¿MP  @€À)§¢©¤¯~¥ iºU÷*úÐßBèÎaÿ>’ÿÃûñìévŽa’ $y/4V´¬ª¦•ƇBf ˜êÉ$ØR6†.K¢’-i*$Ë©U4‰!@xD =ЙÜTeÂ}@€ ô"ðôôôóó“¡_Ê~Dz°¡õx)•ßqN”ùX¡}S2![vGy~]¾Ü¶:»bϪËšxpÄ}Ýyå£7– 5^¬òÞá§ gB(Ä’¥×‚œr!@Á¤oÔÖpš@€ †À©Ó(ÊSÊaëá­¯„|m8ª/Cwêó;¯x¶¡½UÆ2™‡@ÈÝÕ‡8!íX#?&Ôê2&Cí7k9¾°7̧  ÞßßSæñïïoµ¥€ @¸K }O`Êê÷0Í÷~‡Ñì=jˆ<€¶ö559žQìQÛg¸k?ûÄ!£’6V€'¢&ÙpÞ>ßf^ª´Q3ŽæQºXU´¼J?Μ‰]‡»ï…°(ËÝE27!@È ðüü|wνºÉæ¥ ¶<@€ ÐŒ€ôE¿¿¿W‹XÓ?gð4‘ž_ eBEáOý+ã¸Ñ "QæÁˆ5Öu Ùö% Å`ïEƒæÈ"9– u†À ú=@W;Ð >œ¶Ö죃‚ @`)Z¦···y€ÐR@€  hÉÚ@7µ!5x< Ñ­ºRqzghæmÃg¸c3Þ¹ÀíÕàëPÃE„=ÏWµGsî(’ ¡•@ Ù}æA»ðw_„ÏÏÏ—îÔ€ àœÀ×××Ý™w{SªÎ[Aõ @€ ²²Ý®r ¯ãYˆÂ(-iH ©÷ _G‡ô°k¬ Ä–ûãÀ –2.í¤‘ø@&Tl=ÚéÍØ?ÙM¯w@9Ű— @€€Ãó¡6ߢ\ò„ @€@]ƒ÷*<)ÊðØúÏØ­S<Ìí±¶wU²Ù7ãŵn¬ Ï&σ> |]¾b'mZ's¤Œ’vW]áQ=1¡¶ o¥4Ž5M´Àº_ä@X (*þþúPø×Ä\@€ @À3ýÅmÝ_ϛʎú@à@®Ë_—Ãj — ±>¼î`En} h¯Âpï¶Â‹ µo‡¦—.j¼Í$neÃCÅô²§‹GyJt¶ž¿J¨  °?YK 4€ @`ßßßûëÛº¿¢÷ «¤);mÅ{5d©;zÛ$B²NsLÓÈÜîàæê’)À„j*~2o\Z{9gm’¯š @½\.—•¡\S{UŒr!@€ p–€ôH;‹Ûê?ÉÍÊŽš@à.ÅÊÐ8ÖeÈ8¥V¯È° |Ü}1¹YN@ƒÛ@.áªj¼]%å)½ì-¼]Î~#€ p–Àþ±§gs#= @€úØ_ßV×káNIó¬-RÔˈY]æ3”]#ÏÆŠñDÎ$sN@NßÁ^oÍÑ@7– 5ÞØèM$ºÔGozË 6 ´Òw±Mé€ ¼¿?Œ>Ä\<ƒÐF@€ À~p•ºšvéÊÐwQTRèÙôuðh]Q?›[¼Ceò8 ô“ˆ÷ì ;}zû|k1µP°%˜Pû LõÒÿüûŸB©8õøËËK¼Õ;-‚ x#°ÙL›ö½Õ–ú@€ @à€tJ§tP…‰¥1«®…#CdX6ubA¹¯ £'oá0Åã]¦5c+yDûFZzÿ •l¾*én?Ï6ÞZƒ¶öðC€€ ZtÈøÝ%ßÛÛ[­"È€ @- 4Þ‹ ‰æœ5‘Ê•É›Õ Þ¾y·Ýývæ&n Èû{Îá¨o«—=$ÞÃ[ñX˜Pû L•Ò[ŽVp•–ËiÊ‚ LNàëëþ98rJœ ͇ @”ÀÓÓÓÏÏÏ#ueõûòG«¢#œ%Ð÷`ÓýWI>°g›ã?½ÇÞ}òüê'bw|ª1H©ƒF¤¥£´ÝxSÍëëë +sª @‘ÀÝmùÒ5Øê @€ …€ôK)JËZiÏX¨~äñ³<lzøúij|üãã°Õ$€€< ‰ÈzvL«ž~qÉEeB•®:2´&ÐrG {ùÆ 4&pW­ôùùÙ¸@€ º´¦m¦5%B£µ~’ü‹GUKmmÉKï½ÿ <; …ÑfÈrBàåo/-£ªJ¸ªÊ^,'’“R E].ìñôÇå䢰*u×Éä@€À!ÛÉúãããð)@€ @À3i™~o׺Fwâ9Ù¥hIÓŒ€ÏƒMߦx†ÙÅ[M‚É È`×ld  ˆÆ2¡r–zJ·öM£½4-O×%`¯ç/ê@ èÀñ«O›———Àí¥i€ @“x{{»ZèÚýIœÆ¾jÌÀ¥Kí¯suíD×4çx'«;L‰‘ùèd¤ < Ý4íqÅm_oöi`Bõ,o-7Ò|}}M²n§™€ on=õVCê@€ <ßßßÍTñ àæYÑG݆#0ÄÁ¦‡ïW<ýÿ@ö—ÃÞ!AuD!p>ÒªƒZ:  ˜ÖœŸëP¢ä]^س§~~Î[ó @…®6äK¿T˜!C€ @À ÅT9¥¡*LÏNäPi¾JclzøÊÄ;ÿñ㇭&Áœd• ?@hà2ÆŽbBU=1¡z“º–Q åðâdEM5 @Цíw óò„2@“!@€@`ŸŸíÎ($`£7 çXõ‘ñ]¦ÆQTúÛ¯Èk5'˜ç”š³Ó^~š™ñrê(â*‡wœšH×ÛgÃ#!~Ÿžž/Ñi @À?ŸŸŸuÅ(GTÿ¦†€ @H$ ½ÓïïïºÜµ¾Ð‘ˆNô{Tc ClzøNų(µ<íî/ ü øÀ@£îRÕeËŠÚ¯‰L¨²Ü 9X…[FnO\ë’ € #:||]¡±©É2ÙB€ ô" à*ër×úBZµ`zBšcJ ÆÁ¦û¯U¼—¢ñwûxùÕ "˜•¦™ënˆµPbUU¶i™ÊÃNæÚ TØ}é_.—^ËfÊ… @`%ðññm‘ êz“ @€ „!°µ’®¹ÊK©#w4oüX"F¶t`ÉæZOÅ 8yùëR ùÄ €Kàèc»,’½×_—/<‹œ€·Œ«ÿúúfNC @ãÐŒ¼|­è@¨q[AÍ!@€ ðˆÀºâm ¥wÈccýdìâ–(‘-° dþ°ˆxΧ2¶šóˆ'á±ÇáÖéÕh[‹BˆcBÝéͺ?µ Ø®´Ü‡ @ 1å£F.¨Ë¥8@€ ´!ðýýÝL“ïǺÈ9s‹}°éáË,Τ|‡g³€vñÌ 8lTW‡Žò‚«žZrhD ÖÞš£)¬å÷üüÜfmL)€ XTI///‡)I@€  HÕTñõ¯ÏÞTÔ§6=|¹âÙÒ é/ úÀû¯×èjWî\},ª rny*îŸ?F\fSg@€@Tššõ­µu´ € @"°,zÛèØã™ŠÐž%0ÛÁ¦‡oV0“šsØdÌ@@§OžH?  ãm“PÀáxL{•–qÚ~~žžžX´C€ à‡ÀÛÛ›œOýÔ‡š@€ @ :é£~›)óƒÅ)õ À¥2«Iß>ŠËR³7BLFéÁÄz¶ôEjÖMt–ÀÛç[¢ÀlPË~V0z¥— •åGEI“½å1¸ïïïÕW¿d@€@ 1#.D @ž… @‚ÀÇÇG3}¦´mÕwd5©¬å†ÖLƆ+HZè!ú1±’-Ý‘†ëëI*Ì8Ÿø²H¦á} ýª*&Ô*R§#e›fxµ ñ)A%!@`BG>a§Ód@€ 0!…Dk¦“έŠîŽLüs°©ŒA—¿.FïH°7B¶`ü‹De”lƒ‰´ÿ‘¶{ e‘´!«‹½6ó‹—ÞXD¯å ÿúú:Ნ&C€ @€ x ÝTuýä£ ¥s æj×Xoé¿8õ¯¬'-cú=¶òûjÅr^žÔÅå¹ÝÍAo„ÿ>=UÃÎC¼Û#Ü,$€eêÔû&±†Ê†} Sjžìµá???=,’© @€ @€À´­Pažþx¼só4ñž’.ZfÓ–>)éRw6åm€G»è”‹}6Œ<¼üíå,mÒ‡! Ä0’LC2|üãc”)@õÔ„Ån®S½,/ãfƒÕïï/ñ§ý*¡á€ @€ @À i¨š)ÄTÌ+§ôu$vN@ Õ–Þ(¦²úÈ#ÉNi,w-çý{¶z9 ™ÊÒ„™Û pVòI/Kð±L¨t\"–ñ™ÿüùãd…L5 @€ @€f& =U3U¿œø5u$sN@¶;—Ìf©‚R¼ìl‚²Ì:ïèSÕ“÷Y˾£,'ôáÇwêM œXÚQ£±»ÿ¡4 Q³¡æçççééiæ59m‡ @€ @pB@z*Ik¦{û|;ÔÔ‘À-™Hd ³3&6“C”®6·SÛN »Iˤ,'ÉîvÄîU1 _—/'òyX ¹UÛÇR±ß5é·ô&~w²6¦€ @€ @¶êP»X+,VÕzdÕŒ@ìƒM1Úiö°ô d1©5¦‘†§ÞЖU•`  @UE’oÅCçÃ6⾿¿YC€ @€ @ÀËåÒL?&]Ü­‚Ž;n HŸ??YŠC€ @€ @À!¯¯v'”ó¶ËSKº}JJã 6=ì m¶iÿÁ`¾Øv^ºûùµ ÑãNk¸[Ìýú_¢;zsDZ¾ Dx”Í‹<ÌlB•Ëp³!å÷÷÷ééÉá˜*A€ @€ @àùù¹™¢Lq¸X_%öÝÒe8H¹½/®Õ°³ `(-ýÝîôæËß^ö»†_ÃcÚ RºV[‘WÝqù뢛3[ÍV8;Ð,£Á9€ou^?êE¸z5ìþüóç‹p@€ @€ ¸% ý•rì*gÙ¶òz#êíÀX~G‹»­)g{ùnú`CôN—µìˆ——ÖÞ€ @€ @‚Àëëë]Í¡ÅÍy´‘;ŠÊf?I;Ƥ¥†È Ü Ý¶  ƒKâ»Ó«EÛÖÕº~û|Kl5ÉF$ óJ-Qé•OáFÅ›•÷ª|ÔrÕ)--w§^½Iöz¾§~~~±*¦’€ @€ @XH£uJV’Xšº¨z`?íäQâ"îËRƒƒM{íÏ¿ÿÙ¯dö¯²–>P·FìâÁ•€¼/Å»U­2$JÈ5 DÚöp—UË› ú-¤v{TV>u![yKËj6nÿþþ>==±ê† @€ @€À@žŸŸ¥×:¥ZÌN,M]G=aì¢9ØÔ¢MôTæuî’§•9{´áÁZFT™;k¡Xò‘q@Ç ˜«dûxK·ÓVÅT€ @€ @ ?¬ÜënUÖèœ+ꜗ¬¤éuè¼sÛõ)wä æ-^¢]ôcõZuaè•auûTŠ´¦^xF†¹Å5~C[ƒE$íÛô7%XL€ŽkævúóóÃb€ @€ @#P85i·Òµ‹%)q>ÝQfžý‰ƒMÏËHog”ñ%£>n©µdláY Îú´Ž +ÉgSP­qIãmÇ‘D¢2‰5¼¥Ûéëëëˆ cê @€ @€ x·P¼ßÍ=s¹žY ;j˜ïvkÞÍÅ{Ëy\P;Ô‘Þ…–Úø«ÕBj€­[n®[îrùóçKk@€ @€  ðùùÙFÕÉá²Öý`›ÖR |£WC¦äZ¢Ò=;]#ød»C@ºKTaZzØ="©ÉNá&qi,ì¯G‹žõÞ¡yÖ$Í^Šßßß§§§ cš@€ @€ X“¾ë‘¸î}œO)Š×ûBÔåÜ·º­Üä„%…íè^lvÞO£“Y%Vv”ª‹%î0D»’FùeGr3ß¾õm®ê¾Ðfÿ@ÚSz¡¥ÛéÇÇ‹j@€ @€ „! 0kÙêÇSÎãè‘¢Òܦ‘zSŠ\WjÿS=»M¬V¨-jѶƒ^Û9ìȪ2(“ÛjËÉn+\K`ô×V±ÁÂ×`'Éí‹ß쎶šT>ÏjÄn»z×~~~¬Ši @€ @€Òz]éÁŒþ”¯™Æuˆ‚¤6õÙY¦>;£ªÖ.“  dÛ’@ƒþ×å«%±³e©zÃý¼¾æÝ/þ½bX†I<‚M§°+ùgE @€ @€ `¤õºÒƒý)+a›Q¡2YªàêÞ4F½v˜­2èÁ¦‡h×G‘687Z 0 D`t»Þ(F|QGÝ2z–›P#:½ÃJ?ávl­Ns @€ @€ÚÀùt_ YñW)ÊÕ¿Ì=16ÝïY;‹Œèí=Я ÔìA ©C6Ò8\øhÍ“»Y}(+ŒrÛiö@ñèAÜNÛ/Ú)€ @€ @  œO«+x¯2”Ëm¡Ê÷‘Þ²ýýH›^uÓíŸvn•aL'’íöBH‰ ˆÙ«A©"fYͰåvP­rGã§èí©¢žH¯™Ûé÷÷w›e*¥@€ @€ @  œOu’g“q°éYb®ÒËMé¬~>1½Ì=®ZZR»øÆ‰0IVB`ô°Ûv/i ÕSÏ^þºÈHXûS£p=4\Óñ©"M,2–åS»&~}}í²d¥P@€ @€ ´!€óiu5)›VGÚ%CÙ5VEq݋њ\»C ©K†Üš`Äc»—ÁKmÝ–½ m.jÊû2Ûi³7·Ó6ësJ @€ @èKçÓZÊ^6­EÒC>òKÑÌg¤Ñ¹‡X¥Í28óÈùîU€^™Èv¶ÓºAÂõ¬8É¥tßb¨J¢r6ÛÓÛÕ}û6ávÚwÑNé€ @€ @mà|Z¨)•nV†¶AO߻ҋª„‘\å¡zŸ..f‘bHî[.®¤‹?ýÝÏñã~`V¯‰^+%^".ö H˜µ#ån/Œ¾I`¿áÛ_› Ÿ¶Y™S  @€ @€€8Ÿn•g¯›)-ï*‡kÝ”ò9L8Ù³=ø(½ïµðÊ«Üâù@8w²V”<Éü@÷%{1ÆÞG’£AC6âxƒ†‘ŒI®L¨¸>­’û¸zX´S@€ @€ 6¤ +Q¦¥?R™9ºýHˆÑÝÐŒ´ñ2[HbÓÅûnÊ%§Q =d[Ý?÷.FnV$ “œÉ©R½¤jŽÝ űggõuùbgK¢´l£@D’óýæ7ÛE€Ûi›59¥@€ @€ ø! X¶j÷Ôƒ!Ãè]9¼œÒ+±Ì‚ê‹H!d÷ÕËy¿–(¥eòa=¯ÜžªèŸÛë]˜­Üo½v€èm-ßíàVïõ}W}¸“ 5†{u ‰D3¡ÅíÔÏ¢š@€ @€ ´!ÐÌùTZ¾xê_©j›i/Ë ’žƒMS”ÒJ“¡—–ùFFœxBþˆ˜ŒVå2IÍÄ6*Éu1œ5ãÙ¾ QEsÞ/ÙásJzq;m³§@€ @€ oš9ŸJ×OÉ9DðR6Í<™*5Ì‹kØ„g!ü‰>Ù$±LeÓ—Ot`GTBd æñÉØÞ“=ÄávêmÑN} @€ @€ÚÀù´D³*“D¶N²Áƒ2Xs°i^ÿ¦œiþ`Ó}tÎ…¿Áû5P³÷åˆ:bXõt‰RëÔÆý7”_£hævúõõÕf!J)€ @€ –Þßß[GY€À¸p>ÍV±Ê$áÐË ï¤ìÝ>(Ûè#[Æ$›niÜ^·ô~zÔÜO! q½í¾îHDåˆØEzêÙ!3ƒ0¯ml9ð>??»²¥æ€ @€ G~~~ýÄ}@[8Ÿ®jÉŒ )çSìmÒÈLÀÁ¦x÷‘¼ê5™*äò#ÝõÝôÞܱ/_¡ãÏŽpQ|û|KÄݱ§²‹^¼àgó/žpÈU“›¹T~~nŠ\C€ @€bXL!OOO1šC+ k8Ÿf«a[ºì¨Ö‰â˜Ýƒ;®>kº•ÛÄ+"÷î¼’~~Bn¹Á•PíWcT°?SâÉ×yp;µ^x“? @€ t!ðññÿÃ÷ööÖ¥t …†#€ói‰ŠµÙdw•¢*] Õ’úóì#2˜N~°é#2Ë}';î¾Ü\h|ØïÄ •#jßAÛZ8µÙC0šÇ“mÜN‡[]Sa@€ @ðFàëëKš™?þx«õÜÀù4[Ѫ#笕á·ùs°ivñ`E±£¡Þ¾wÃÝ‘¡°bwGÊJ¶EYWïòáz6¥Âl­‰$±¸º]?S1@€ @ˆ€<•RE¦êLU!¾^^ÚYãÙÌDc;^E‘ô᣷åödØ›iÚЋѬAýe“’‘Q¬ÚtJûR–)#Þ´Û@6\Ñl™Ái§}Wã”@€ @vtHͪ™±+…œ!x¤1[GÓ‹x‘$åÞeJlÉœƒM]©²©ŒÈ}¯äSDx#­ÝK'IÖN…éÎC=ÄSòÇÙN„LsÆí4Þ’›A€ @€@{:êtÕáÈ•¬}(”ÀvëÅ:Œ]Ä;¦Ó4ü#ÑMõÒd^B€È½Fƒdy¶ñ†ÙAM|VaØÃ;¢ê4gQåÁI2ÜN]WSm@€ @pE@G® ·Wu£2€€sÍœO¥ t¢“¬U ‹ø¥lZ«wÈÇŽ@·ëuaÃE"mç°ëôð9/ލÍ,V‰}Z7¡ FcÜN¯œ© @€ ŒBàrù¿1Ç8¶f”^£žpBçÓlmª”íOÍã`ÓìŽàÁö*J~]óÐ̹ɻ°½$Ä+Qš"XÂÙ¢ã_h›ñµÿÖÉZ”j@€ @€,lU…???E' ˜Î§ÙªT騷#pÞ5Þ@Ùüy°…9Í“vž²# ð³½ä!d¹Š-Ð̆e';9/Sv…ì¾qÕÌíô÷÷÷éé)ðâ–¦A€ @€Àä^__¯#|O.4g à|š­e•ÒÕ|êO6Í&σ} ¹÷Ô›Þ 11{ÞˆÅÕô„ëâ±S„Q5ay7’ŸŒl›™ìq;=»Z&= @€ ŒE`{àé¢y{{« ÔèNçÓ çòH† Q³ió ÍI;–&·?}üãÃl„¬‰6 |]¾Ü @yÅ.]äl‹#j_éÅí´ûz˜ @€ @€@__ך6‡é\fZ:ŸópQsÒµÖlÚW/Mé T‰YþîrŸ€$+v.Y=" βSÇÞ9@H„G½ßà~3=_‹ÍØ@€ @½èÀš+}Ú÷÷w¯ÊP. 0.fΧRÌ6Ð@¶,"%ÈÞrº\ËZQL œÚ6pµPáϺä3hÚ×d~K@‚aêö»inlõ¹ítë;…¤Ë§Ž»V§æ€ @€ Hà‘³Xâã$ƒ °Ðxr»#]w*e0'©ýóñâ±V8“/±ýïNi}³·×+  ·38¢jŽëExªr›™ãq;]—¾\@€ @€@Tïïïwõu///Q›L» ;·g(ßaÊo*àg0è­‰ƒMƒu1͹%@äÞòÁ°JÁ¶£ÜJšÿ;rÄ–åKÃ~•u˜‰æ8½ïHš(Êߦßq;µ[E“3 @€ ø!ðÈÒñññá§’Ô…ÀÓÓSçSi˜¥'´SB¶ÏùýßþïV¢¶çO‰]¹·±c¿bövþ»…j^Ó\ ÙﲡÕ¡œ8¢Þíý›Íö¢àv:ÊšœzB€ @€@ Ëå¾~Fg–d˳€À´mɨ®ì gR:sY„9Ø´P{Ìãøõ¹®>Vá>`cép¯ÀÝ k_laQÕ4Qïv}ÞÍe ±ÿ¦Wù·Ói—÷4€ @€Àl}Gÿüü̆‚öBU4s>•Í%OÇèö)âºí*fG ™·Ô£÷yìÄ» 4s>•¶°ŠÖ‘L ^ˆÜ»³kð1{{Iþ©reàžÁU£Á),$^ ´qá×ÞZ>}.¼© @€ Ô%°oàx{{«[¹A“hæ|ŠÚUœrq ´Qû70DŽX1{ÇzqtZ¨Î QÒë¬i]Û¢‚in-cÍÜNßßß'YÇÒL@€ @˜œÀ×מú…¸L“‹͇@ ý½‰JÔ”d¯µVK’? `J€È½)cQböšÊ¶Qæ‹#jà]:õó?>qDM”Ÿ69Ò¥dU̳€ @€ 0ßßß]Ü÷÷÷XÍ¡¶€€ÍœO¥3LÔ.’ ðI€È½;‹1ÓŸâíSÂíj5ƒ#ªœ£qDÝ!m!3%ÖÌq;õ³Æ¦&€ @€ `Jàååeý~taZ2‡bhæ|ŠçÔŽZ•Ÿ 0À>t–XîËçwñ ’ûd[”…1öK$GTMÜ‘i0˜àv{ÅNë @€ @`K@û‡¿µ___·p @ @3çSiïj¹ ŒB þÿpÙ3[¢Žò‚$ÖSæÅد’ Ä2³cj•¡h3jávš¾ú%% @€ ŒNàóóx£òÇÇÇèͤþ€@G8Ÿ®N. Š>ÚÆ@)+böîäÐ?ÉõýßÞ/]Ö¾ŽwñuùÒ 1t7U©|[¹Îy鸒¤h@€ @€@c—˱Råëë«q­(ˆD ™ó)Á'«¨aÉ üþ¿{ç°Ç³þtoÃfGioS´<‹e\ üfi€ÄxZGTYÉÛt®6ÂEZšÒ@€ @€ÀY4R´vp³ÃŸ mœO¥?”±:šR  m\¨R?“¤!f¯…;ÌsGT9Û:„oZ%ŽÛ VúlLYï‘€ @€ €€3MüÜ~~~Ð^šô" 1$q´)L6¡âÔT+KæhL€È½…cà©Ç‰ÙÛX¼='M™ÛÚø*ž’ÆZ‰Õ´©QÛt¥Îyéµ€¤\@€ @€@{é¾`oooí«G‰€@$)',—ëN±xPÎS”hc (mä SIOñìд×èû?¿ˆñ£&¨ujcìxjà£æ×½Ï6ÚH rÚ@€ @‡¾¿Su&ss“€À>———ºª¼G¹á|:´>ŸÊC€È½·ê÷‰ÙËë¶8¢jßQuér’áÇ?>÷r›ŽûúúÚ_àñ+ @€ @ ßßßD̬͆ÁÚNs öÒ7l$Mw“ÉÙ$°¦”¦A <"÷Þ٪ߔ‡oxY¢éôÞ}]¾ª‹Y÷ {ž¾þ=õø•Â^Ð9/íWŒ”@€ @èEà¬X¯zR. †€€jð—F1]cLJÄ /Â0’OäÞı®$™<|cH>­¨H ˜#jl!ou™ ´aá4€ @€ ¼¿Ÿ;%‡]lj`IìøùiPî3•Éd·äT¥8Õ2,ÖÆ0’Ò®ÄÐiñ¬< Ý 6ëN@;1гŸäV´[ÆbX¸ÍSŒ;‹:~‚ @€ Ä#ðùùyû¼sçãã#Z4&pvÛÆÎ ´ÿ“Ügn•Ü@ R›ë ¿Ë_—Û· Fe¾mw* foŒ7źÚž¡¡¦ÍÁšÅ{ÉJÕ¶æÓ1ÿ6¦mmxk¼J¤8@€ @€@w—Ë¥ëŽââëë«{© €@úiË;#ÒáO±ƒõuTØRt/²bÈUP‚½oȈáN¨Æ¾ã$(!ÀÙëE´ÜÅu¬xÚ2ûJû°ÚÚVòú§?‹Ûi€U7M€ @€ SžžN«%Ù{|Š0‰!Gþüù“®¸ËN)¯ì/‡H@À9ÅÉ4ýl»?ÿþÇy‹«GäÞìÑ/åÁFöDY"Y-šUå~×ç=Eê§ €Bã|˜Úê¦ÆGk9îC€ @€Bx{{Ëøè~~~IƒFA- Hׯù4Œ©–Þ›|"âdzw©’Ƚwû·ÊMbö4ø¬ª6uÈyÙ³#j˜ o@&ì6äµÕ­åâ² @€ @`Z²<ú1>æy~Éäê­û^^^¼U‰ú@‡Ξ¹œg/À@p«tåŽgò“RœÉrKÙ5<73±nDîÍ÷Rž"fo¢’ì€69¤ûŧg­4}«Û¸ª#ü|·®*I@€ @£б¡Zñýý¡pµYfSµã©q¢8K@¹Œ!(ãéuu¿$€@_RòK¾’é)ásÒ_¹ù·y¶+õ}—§-]?4ˆµq‡LyOÃ8àß•¨Š“ÅLmr;»´#= @€ @ ›€ì Vy¹\^__³3©òàÎÇòÎO2VV)½0Åü\ ²þ¥ÄUƒ#jÉÕwDX­X7+|}ií²m-k©- @€ ”PðÞá—¾¼P/9ET¡ƒWM )7/ô™ÕèªJÀÞò¡H¸–@^üð”™jš¦/¼¬¾÷lÂèdZ3¦e7{œœs§SÄÝ®å¹vÏ7‘V×' ‰¨þ+Üñöm¿©3_]øsïÚu)¥C€ @€Àµäp*Ùtüñ+ù rd¤’h™WÙªr§ÐØ{í¦t˜x{{gB× Ùë)ñæž{®ãdºúî<þú胿Îo]m 7³ ôá•ÜÇð¾I+4äô"WsDíx{€6ƒe¿øéÛÇd‰K&€ @€ G` Þ;ü’•,XS ÂÞ¦ÿˆž¦”ïg^“³Ÿ’‡©~ÅOëÀúl˜<hJ¦£é´°ÝtK{»Í”F »½Æ[M'ÓÕÁßÍi¿òÛ]m 7ótì”×î¼qŸšk#“¦Ç¼¡›øTÇGúV› µ±-ÚZ‘ú@€ @€À­L#Љ¢$Éï5Ñþ°šL:oµnRU¥)/«AÀÞj]@Að&PÍù´ãÐîcxÛÒkL—ß’ÃÕ*,±S«sÆßÆÎîËð|CÀœÀàˆêô^Ëßß¼ÂA2ôÖ‡¹N¿F½~ä@€ @Ø'0 Þ;ZçSWí?[òéÌéu,7ý¢NaÕsÕ%­¦‹n gž…RlÍ„é3RbÊŽ ªAìºw«†ìÿ:ÎOÖìj±(‡ú˜¬™ŒÈ½cŸ–_°än3Uäöjƒ‡¹Ÿ~¯#¼šÛ)¿³RÖ®¤ @€ o[:¦¼;ý"&­úrž2ÇùÕm.qVçÀ®V‰€½Þc’ü!PŸ@ù¤´:]Ìn*”ŸÔ®ÈfdêÖYû¥åÕ9xn6†Ïþ)Ç®&VRÌ϶ô«º‡c† ¢›8¢jfn¨á§ªª `«/µíMýuÝÁ[…I‰€ @€ Ð.eðÞñW°DÏ-]r,÷ðÂuO²2×/÷­:°·Ý¡NÍ!°E@–º­WÞö>Χ§Lµ$ Äw2ÝzSºÙ0Ö½w‹|ÌûÌãKÍE@Ú&¡!Zr`´ŽœØ®ò*i&/Á’>¹þÄÛZr€ @€ °Jà0d¥~ÆÚîNÿ½•ÒÉýSç½*ç­Buÿýý}•!7!Ö (\ùλoõ‘ô—r&9܇€Â$ÊÉôãëÃjÖϧ)¡Îaõ;¨r‰§îóþÒÒv hâÊðîï8¾„€Ô™+\¥9ÆžRCuŠÕ$pÛ|$-¥ & ‚Ðö•SSq7ÓÝ’ï#mcëlmIs @€ @ ;Á{G+ŸÒ”» Êys̰äÂJÌUßéÕ8½C%•€½ÐŒsšåÅSæ4œO—VYîˆ@N¦«ã¿'½lµÜL'б´Ä$Ö7íH‰Ð«cu5·SÎFÙY£ò @€ \Eà0xï`“†Xº6E¥M1Ä™œ‰#=4Q.)lõUÝJ¹€@:mÉH™|ÊÓ¼üñ¥o;3­K' Á Ϧ¯¿íEŒ/r×æÐ ¢ž\‹:xéøÝ§Ï «)uî¤fŒáßàŸ®°Þãé…6c¬æÀÍûލšÆK2ülF㌹ˆ?éëURB€ @€@e‡Á{ÇÂúy›½7X€Ç|J.$Âò9ŒÓ;VŸó…¨y­Ø?õxœ /$ÁD6“R7o²ÀKEÒ0WfáXjâq©ÃÞHëä/¡ª àa+)í¯NOµ^Šö Ú¨|u¥[•LRô”ƒf½†ú']µ|x¨wÔ5³­×½0³–:ýiS¨•5'õ„ @€ †œr •øx6Š¯á©‚òÍ«Ÿçé.{³9ó š#  ÞNVÁY¶˜¯ËÍ×Íå A¤{'ÓÙ8þìÆ!«šˆ°Š±õ›’ðš{g«UX“ƒ¤yIœuN–ÔXRwHþCN-ébmP¯]ÖëÞ ’ “~—5·b¤Â€ @€ p+CÓUEý”Vbù«¦#JwnMùžq©øxÌ÷Šï—EÀÞôþ%%: pjÜŸ=v>•5²Äf˳­9]îH)J|ÇvR+u#+ô`Ùu8Ifjåµ­SÏQ009H”t«>R­ê4¿§RäÏÛ«Û©º©ÎøÔÖµ4€ @€ú&qêŸüUuÌôH¹)¼³?´%ƒÊ4%ç1 {ûí´Kš(ÆÀïB–êžLÇ´eFà¶N¦[¯L7ÊB'¬-ŒMßÇÝ~˜%ÄA£htWŒÙ§òKU%¥ Îf6þ¼M݆hI4¡å*Ž;€ @€ ?§~ö¦xhJ‹4ü ®z&BÐ ­E°7/É Ðù§ŸÝe‘7­éд»™aûn/N¦;/‚œÚúè}Éâ;Íä£-lÑü ¿Î=—T´ï>f°³­Œ¾õRÞOÿA×Ój“¶@€ @€@‹Îï>}}Équ§ÉcJ“ ·SÖð‘Ú’¡ÕK‘ƒ+@@ 9Ù“Æ©™­9é¬1¶³ôCìÍ:æS,Tb~ì¦ßë± Õ}啹s rùoj¶/gxyR~qGífKiHSžµ]M?Öš[(Ra@€ @¸-Œà½£UGºÃê¯à’<ÇÌgû¤³/$`ï>[>…@LJ|6Õ8ý‰/OŠý6`9‘ÉqX'™½é4nó²í&¨ú=ÀŸê¦÷OMGju—Û*´@r0ÁN †K+¯0k=Ž×“4 € @€º$Pâ{¥]᝝3,' n9ºJ½ÕI¬Ù?ù Ø;ë;þ„ÀÝÈš—=¤?xgo¬-É»x³K5$}Ðf§ìf´K3ʆpÏ{ò;Nœ¸tRä& õ¬ö ¢&ŽŠæ’Õñ²×vµ»­0i/ @€ ´N@úc¶Ûæ`”óæôq‰š¹eo”»ä,•¶ðÈBö.©r·" ƒ’·¦ÃûœØ„1YÒ€„?œL G¾b~6Ñ݇•”ßq!Š»=~«åš.n8W *ê=ý‹gŒFh@…™ ·Ó[-­i, @€ ž”Ú•ˆ9ê›…RìêOx ²SàÒ;têjÊô›³<§ùs ܇€¶¤ÏÙ)±6Ç4,N¦}œT˜=8Íì&Nõœ {_*LÌ×ܶVRÕ™1$k«I7oºíi+·:ƒy+‚Ð}–š´€ @€Ú%P¼w´¼I6ý§ú§ñOà ‰³[ùÉšTU®ØÚnRs@ @ùî‘”¹N1Û2¨ö][iÙ8™¦ŒÛ¼4݈hŠÞœGàžOIUì{ÞPë4$êÄ8meIz#œo»Ã^òw…‘¦-jyË3ž‚ @€ D P¼×û×·"ë|U+·ÖåQ­z:@—°šXö§Á;( ‘mȲKÔ“©íc –*È‘GBzÝê( åÀ#äÐM¸æ­á¡Á€'òÖHÃukØ¿¯MD[}jxÿííí’¥…B€ @€¬Ôq¿Êþ1^§w,š€½Vc†| ÐYöÆùÁïB.KÁí¨]Vop2•²ã׳ä<# yº›±tÃs-g½™øgßó§‰Ã@'ˆQßÐìWa~Óæ´>Š´€ @€nNÀ$"n¢åªdì½ù §ùX% ™Á{R’•²!›jÓU•“¯œL*'ÓýQ­1éäL×M$Ï:žYûÝÔħϿ=7=iìT^3I]§’šUPwFT4KW3úi¹ºèâ& @€ @ -ñƒ÷–ÿÌ'`o[c’ÚB Ç£†y{²«ÑXò¤.œL¿(%mÈ“nP»$4¦ÏH Žpíëj™ëÍhþÝéugˆÞæ“ìÁ,tÝ\m©YÜ„³;7ýAºRgG)€ @€ oÁƒ÷¦ÿZ_MIÀ^ïñCþh”Àóóóê¤a{SL5M£w( 'ÓÄ!*'\ ?¹‰Øl`x8Ÿö¤¦á¿|8ƺÑʧ¯†vÐõ‡]˜@Sêt\¹®s óççg£kBª @€ @X%Ðkð^ö®v77!€áÁÊ;öä¥tÄ”ÚV5¤kÈw§°‘6|$D¶'Ó­.ÉÃ|2È8¿Ub[÷‰ÚzØûÝDiG¦ô>”ÓÃ~OO€„:­ ú^Hï¾ì”:Pž& @€ @ 3uD„ìãy°·³QJs `K@V¾¼¹åÔSøàd›Ž¥;K£‘’%;ü)æwK<8™j¤%*õ’V=I“ÍîëPФŸžò Õ_å•¡Ç'g¡–N«*|jϪí"Ü @€ @Ô‰`édœYÍ–€½Æu€@d:ôY¶¾Õ Äð¦<­ŒŸ7Égp2õ-kØ­²Jq2Ý3†t¨·U\[÷¥AGèß°u覣‡a‰rê=Ò´¦·ô¶¦²±¶uŽrV £ÈK>ê@€ @È&ÐSð^öf„À­<o»±òß¡:š7o~!'SÅôõ*tqµ"äd*éJrO¡á™¶›1L€è!­á×MG£œît´áGš¸4½'ºÆw3ºâ4ÄiŸ§§§[- i, @€ ÜŠ@7Á{ Ø{«qKc!M ŽÓ½ì–qŒ¨¡j"P±^¥Îl°ü9#08™Ê{Ȫû$UÏŠ0ù³›£0Ž…5|y&…½Õ.Ïå´òX’„ÚÍQ>üªåPÇ•þóó3{%ƃ€ @€ øêèÞ¶öÆiÔqTØ4"‹17SC1N¦‰ßƒ&N¦SòÓëÄ:œJ&ç²ií^; { fÌÄÝÄ!WkfŽ ¹ïZiZã ±æÜXg+ˆ‘³®£&€ @€ ­ïýþþÖ9†dÈè’€,~,Õ=ºÌ³úÊ[Md6G°Øo \, ²‚–‡Ã¯*Ÿ7<>Å@]¨}èã(§«[í¦^® S\ÀYå’*U†¯ÓRº\Ò(@€ @€ÀŒ@?,?ûÌËËˬ9ü @`‡€¶[øÍHcÎݸkµý*Ò¬ÔNGÂÖ…¤LùÕ ˆêäŽÔÍ ¿uN Üaïw yÉí±‚œ¶ãT Գߧéõ\¡Çu|üÎ*‹ @€ @Ýh7x¯Üf»éT# »_ëb7¢Ò¡ýVÚN¦)#ªš“éj—I¨M©äÙ4ÒdW‹kî&b®v}W=|®WYqó.¨ÞcM úåXmÁFA€ @€ k üË¿üË¡Å#Zö^;f(íÇz… M6Lo3éµùKÆÉ4e }þŸR#ˆéþwjݵãЪt'q9e„„MÓAç:9\‡í²&*Öý—£Õ¤t6mu¨0°¨Ýå5‡ @€ PàJÉòÜüøø Yá·¶yþóŸßßß Û{Ø×$€–*Ì{r±9kùŒŸ~p2•é[­3ŸÕ{ÊP2¥()äi(Ç=‰ÝCµ±ä%"Üôlx´îV¬ ³ñgz׺™7JæÛgë¸ÏëàøåšŠ;€ @€ ¦ Hg”ÚØ®ZºcðÑ.hÅáTë$Õô¥ò¨F@ÓÅΔbõ‘,™¶¦Ñks“hE¦ã|$PFp2]*s=Èwp,æ€ËI\ö`^'ϰ#yuxÏnJ›‹©†kç‰\z5j¼ ÿ$Rë¨Ê៾5ÆûºPJý‹ÙÂA¨&M°Ùx‹ðg…qòóó£ý·Õ–j@€ @p"0¨¥R¥-š8ÚzüóóSNµÚ–ê4´È­õ¯Â´ÖAÐË©A˜˜)c&¸bžÒ„³i$MÇI»×NâòYžAÒ·î;g³Çà‡®™AòhÉÛ!9X9 ꪾ\<¢pW{cÁ'Ì’þªül?ký¨l}ùGý!@€ @àž¤J1”n(õ°²$rqƒ–úúúúôôtÏA«!%Ù+L\:H±²Õ¯¸:¶Ù âZDp%ñãëüùqüF]åœÍá´›¡†Jeø†ÅId¼œ¼ôM)ƒ®_ƒœ*UuV»ZªêoØõ·ÍªÎnv¥.“Ü @€ ˜¤¢–ž²)ÞZjÌÁL­ P™€|óOÍy‰;3 ·kŸÏë¾ÙSò“’Z‚ÈìþôÏàþzû•Ÿ6äÔu7á7%xjxlj›v ¼p¦RÑrÒwÕL·ôAª^ÓuaóóÞˆà{N¶€Ç¹/]_=yðÓŸR £Êë4Šƒ @€ ¤Z*ÊÁ·T:`ú^R®øþþÖ!°â)…C|ÒÇ!)!ÐÍ«3ƒáÍàRÚYÛoßCþ&Yé 9‰àcÈÍCcʳx+¤—¼bÂd–I7›ˆM=öì%òŸÉ+pU'J²ŒóîBjMm3%è§%ƒßiW̬CuX|k?Z@€ @}¢']Oêž4>ÔÒÙ¯xó?§Zjã‡V@;4µšO#Ë ›vàš™sïs(¤EÂTßÍ$¤up%QZðr”ÞQž³¡ÒèŸÄ¦F‚tÀF{°Ž Þì}®Èó¼Fµ&%Æ¡ðOù}«ûx×V»Nç²Ëtg=ÉG€ @€ PÀT-­àUhèèûqŧҩˆÚh-ýºB×S P™€|ù+Lb2_kVµ-½± ‹2u2¡“‘âÆ\IT=w£z¤t±ÀPy¶ëè4¼wzGŽ®³‰"ìŸÚ ¢ÚÖÚvˆí|¤ºu3“Tu¶|èQåÅA€ @€D@Úœ:ý,•Z·cRà£k Zª™}~~fÜB}S…‰eæ½XͦêQü1+«\„%Ma¿›dÒOö³òè—ô<YÔodÏ»t8JÙå?Ûãò1?-Hb½wg[Z’^‚t« m?U ÒŒó„_ôÓS]©Ä‡‘äKùø,ûHûXôÒ @€ @ñ H}“‡Z:þ$oñâóóS1?ÑRã¿nÔ;tŠt…ùGÎPgÍ¡aÓËä^X…"'Ót‘è”:¸’èá\Ù®¯âì]K‰Ì\a|^[D£Þ5Õ@ÍêRšx©¨jˆ&ÃkÇÛ¬tôÓi^{Ìç³Q(¤uA€ @€J j©´6)n³¤üÙG;h©b´d¨ð, P™@…é2MÚ?[IPÙ·Ëü BòÊ¡“é²/ÎJÆò^\f率s¥ øqXR“ÖGxù+#éªàUÏÖ ^:à ¾;"£ ä~jHù0ÛÏ¡›Í}qê‘:›=©òÂŒâ @€ @ cRФ£¡–îÛFzýtª¥êÛŽÇ9Mƒ@4QW˜‹Ò=ON/IÍMé°ûTa™âÕyžb¢Lp%ÑÉÞÞhÓåKÔÜ?|N%ÐV%“øwªiý)§cçj†ŒãˆÚè8aÖ¹¨ãmÍo™Öº4€ @€À…ô»rTK¥²S‘¸oòkÓ¹Šht`ö‡ _RІÀ*íu©0wE P“€¦ñ SŠìœû†ÐV>•A»®¼"¤nÈM–ÿ<'Óed+Á•D…fÍ#¼óT£á^—y„ïð7ù(¸Óô²³†;uôîÂ[•{_2zöh5ïÆüÔ`¨3ìùµRs9JY€ @€: 'SmÄE35±Ü6“¯¯/"ŒL4¡uooo&¢àjÚ)›m\§Šl'¼æföÓ´üUO!­œ¸¤i;]ÓÇ)ï;mìû£F}ä¥ùz÷KÇÑz÷'Ÿk%TÍíV;aö›Ù⧆½~ê¶¾À£þ€ @€ püO½­U=å?¨¥øœ^õ¶R.vT·\M;e:–Ârùälîd:# É °‘•D Í…­[}¼ÉÃ3w•X´›-4©QçQþì³ùán^(¡Êûõn´SÚ[aØëµR„¥…A€ @€Ò ŒZêççgS¼·±ˆü z9í4ý "%®" ÷´ð}Oy¼›Üê˜mW‘N¦²ä§˜—³ÓÈשܩ'¸UÞÀe5ê·¸'ê»eëîp'²â¿ì¦áNÞ©Ä齩9g«è»Ý×W˜7íÕ~ >—^2 êlaÒ¡ðW­Ê(p%ðüüìš?™C€ @à€~r*À¯lòh©«ÆþnJ1W_£–¾$€@4š®+ÌHݸ/Ia©€k,B2Ÿ ÅRl«);&އÁ•DÆ‘°Õ…zêÁ¼Ðr¿c+¤5óiÑ;Þ»§4¤ ;}¿DCA¿=¶^ì uzaÚºV/ìà²úHÇÁG[ªQ@À„€6üË^a’™@€ @ÀŠ€Œó:YoÐR­~ؒϵFµT*9Û³­ÞòÀ%´ó¡Â|ÒÞD^Ü.)GVzo'Ó™QZžºÌ<Î'÷áúýå„´²<´ÿ.Ôù´ÅÝ{¦´ñy\}¿´¥ŽçãØÁ÷¢¬Rò»é4{´‡ ý´¹d1F¡€€7½ÝúÕã] ùC€ @ „€‚¥ ZªŽÂœý\åÏÈßRõjiÉøçYD# —ºÂÌ#›§ŸAµfΆ ã »Œä,ª9™Î ).å¬>%FÔì令1CÚ蟕µ¡’afõl‹³“kYö05÷DžN÷A™ªs`­Þú­|tòH´Eõ¬h3¿Þ}«ÜÈ€ @¼¼¼¼¿¿?´Ô­òWÝÕR©ð"P.$Pá¬ênÜgl£eN¦—ÛÆŸ{¶Õ‚+‰îÃÝèM7<ö´9¿x½°®+ÃnܨÍÅ»1Cír© ä ½¬¯‰æ†èÊðBÌ]‡ý9!=/\‹R4¼ Áv°lxs&@€ ?ƒ–ªãf´õ·ÂodŠ˜~-[Z¶zÁ¯‹ÉˆF`؉= <®»1ÿ–댲º_èd:³f«_ÌÅDYûg¥„úÓÉ}ø*¯a[¶u &/ÏUo§<l1ˆ±í+ž[µÁ·£¤+IY‡6Ñu¢-P© _s²uæIV€ @¸ŠÀ¯_¿¤âɪ–šg<|J 5jéUÛr!‡€¬…‡ÓEy‚cc®ZzóâšJO”*!'Óh"²Óቑ•D'ǽnF¸ÆjùûÞJ-ÊR®ùÍ]¯½)/Ýòí4)/ ýb¾Ég‰]¿7ã,̨  `K@§Ã[/ë‡mÎä@€ ¤¥¾¾¾JKUÄ• A&—¿©;¸#µT–1”*-žº•:@TœÞMä^idé_ƒ“©Ôºk-ü[¥ŸjKz«•R^B[…F¸ï¡wt3ÂôôSã§ZâæBÔ:IÿpÜN3f'õH]ïæ]SÇ#^GÀGXQ@Àƒ€N‡o:Ž6öÀKž€ @ÑÈUjÔR«Ùš+H*ópt)ji´L} Š€l†æ·hN—vr=¢Vì³’0'C·tÉàí•ÍßCCàWôÁ¼í)ùGïðž>ÿ°>®1{Ãnó8ÄrmMõŽ@½³ói…˜½úÅjUFe [r8W/ì!·eKn€ @ñ (‹Œÿƒ_ê¸0¾áŨ–JYæàžøã–B ™*xôw×tÕÏH7¥k´¢>ÈÚïüSß¿‘µc'}°97ÆUÉIw“哯U‘o®N>&ýÕ"P=å´%cìÜCL[uß°ÿ_¼¿ÿd=F5 r8ßwÙI<Š O@€ ´B`ÐRµÃ°B,Êq~ÕÅà[*íX­n¥ƒ¨' ÀtK¶ÓlÜ1ÝÌ;:µâdºlšú©—Çl%P.Ë rÇIìFÝðÖÇAríEðàÒË—Å5xiäv‰"æWýT_7‘w¤øõˆë°§ vœF[”RÐÑñe×…öÛfNV€ @h€‚Ö꜋n´T)ÂZó£–¶>,©?BÐî‹©aÁéºÛ¯ÜK%“µëfX!¢Æt?szyήLÝøî¹j@NsKF¶Í½ÂNÓB'¹¼ü"p}wºÙžqj¨TøÂÒ«Pë1*Ø«ét‘ ç¶ù“ @€z" -UâãüÇüÏÿüÏt!ÿúßþíßzêÚ„"PÁU¿›È½§l¿¡K0ªóe\ŽqÒ8BõuveôžÖ$×–ÒÜ^ŽÑçÝœÛ=U¹ìdÿA§¹E~OçS.³7HûQC-ƨ  `K@–ŸÙ[o›?¹A€ @ ?Ús8[E7ñ§”ßþú‚AÈCß{ì&rï¾ñ<ì§R‹d~÷îå1ÿÈ'À:éƒÍ93®ŽÕ:q2ÇqrÉ…™Õ¶G¾)×f'V‘_ÕÈ=²Z7M³~zßÝ6 Õ™‹Ò3ÂŒ:@N–fN;rBM¶€ @}¨ 8¸¾¿¿ùßÇ ¤ˆF@g~9M\Ól›óöZ57zÓO|™vñxùLI©Ec= /ºñàëþØÓ{Êp N³ î$Þâd+ÉÏi›ÊÝ6 UˆÙûññm1F} [Ó¯¼áZ¶ Û"È € @Ý@ðóSÏõf¹\/¼£È3Ýô B ro‹†úÄ:ûÅüÜúR ~¨‡º¡ˆ‰Ý<™_èÑ­ÑRù¾Î Þ³ê9ÉýÂÞ¢Ž<ƒðO¿j6Ö¯J~>¼ã„CÌÞP«P*s Û5¾ïã»&Ì9“! @€@7–‘[Æ…t+ïíf4Ò„"PÁ+¿Åh™~–áj9ûYò÷¿7#;{øá׋ÓÇ›SXãýÑRóÓÈ#sµ›ü\ðˆÙ» ¼ü¦Ó~•ætÿl’Äì µ>¤2h”ÀêOÅòj´9T€ @®ä¶YÓ:çTÁ{] ™Cà¶êDî•E4ۚʃübH~ÇE>¡ÏC<Œ øHÙâpü8%hq ‡“/°ü¯¿nªäá8Ù{ûa/ûm'¼Ïn»Ü¥á÷! ×||å§úÉs´€ @)žŸ]Î8›®Ã«]¼7¥ÇIœ%P!roä£0͹-&ð0à'~ÙE¶ó;‰§Ýì èøØÓÕ:½Åw;C³òþòÇ•p‘‰“çV²ûèÝNc~ –˜½g—ˆ¤‡@s´ç|úÖׯ¯¯Íµ… C€ @À•@Q`\W¸ x¯ëh!sÜ“Àjx+Û MÑÊì;çä°–8$"Ûù‚jJ.éc¼];rX^²Ÿæµôð©uä¶Þ/ÉÓ‡½p6A7“ÌNWÖq~ÿõë×=Wz´7!°Q‡è74€ @ ‘@{§‚÷&v=É t;v†éüSxÝwÞŽí7ÂGN® kçG<Ý¢Oá<³õxsžú Ia_ÏýÁÙЧê;í!ÙŠy÷ï y;ÍÏSàÄìM_’{éô­Ÿ^~~6Ú(ª @€ s=ì.ûÙ3i>TȨà¤OäÞ ÆÿçßžÍöÓ/ Äë°v~'ã|Øöžr?‰]ÜV²=ß%q:A>;*HŸAÀ|ªQÈñŒj´õH…°áÄìe¹ î ìožï¾ù4€ @‰*hNv­Ãl Þ›8H$ ro[FæÕÚÊ·®Âq‡ßPJ øj /¿é–¶ñTA|Oc§ÒD>‡wë¥PœáSmLLܢ޼…(ò}sÇáÈáÐM:¢ÎÎ bö&® Iv Ƚtç +J»=KÍ!@€ ìï9ÜYQ7ñÁ{ ‡ YA"@ä^óïµ™8)ƒy_‹²„_Kcµtyoå5gÿ©žÄSã÷éUøTáˆWÇC䛿®‹çuäÈÝ´S7óW©¹ÐÓ;p–9 øéôBÌ^–»¸é[¿¼ÖfÑ;@ € @Ø!ÐkÀÞéúÿñxìà#@g ìoÕžÎ?Ù×Dî]ZŒ­îˆmv¿x<S£A<=oÑ’ÉàlñÀe'-©'¡ÿp0_›À<ðr߇Õ³÷ìšô€À’€K÷— l¢XBã @€ÀÝt°wúsàõõõn=K{!?: l:Ãx\1Òɘ_'àá©!¡ “ý¤œbÒÊÅÌ©gëgp,xËÄaƒHïw®¹ßâ@¦oniýOmÁŽwÕ™vˆÙë·€$g!px ‰âw©*Õ€ @€À%‚ìýçþg-ڗƽŒ;???Ø.c . h>ɘˆÎ>Ò¢ X}“û©¥QÚšèÏöéVúh±RÍO!.‡ÖS]<±“Ä<âª|Ó úp 8yI#ž’7L`ë>ܱװ-¨Õw³.®4 3zÓWg€éMT2{Š?!@€ pV{ÿë¿þkºÆ6¼äN+…SÀM6Í„@)6‡Âù°cßC“û©¬œD–ÂŽÖãÑ$E¿€´ÑZzjü,;ù<–¨¼¢‰øKà«wœvD°}e•¶ÓMÛȽÍ3SæN£}:c(¶Fu¥@HÙ£Nð® ;ˆ¢!@€®%P°W÷¢VLq[]«z#mz49aõÿˆ” @ ‘{§æÜ&®½vi¹äPÁã`ôÓõmÜê?•¹d,e?Û¨\˜ÝÞý·:ûNö»ãì§N•¼6Û 1{‰ÕS¸8äq4A@Ö•”IU›Ø›h•„ @€€-rwNy]\ÊuØåêýñxÌš,©B¿è—)Óï`˜!åO@ ›‘{¯µ!Ÿ-ÝÖ­iù½#G§ÂP·¡TÅe­îtN³‚–aEþ0y´}­‚¤?lZ^‚ ­»O54‹æõÔêS]róÞ$’Ëß_ÙË$„ÂЖòÕ™svsº›=l[¨ @€l ìUŒ————i•Ê¥ØÙB]®ÆŒ’Z¡õËÄéwÞ;í8®!DîmÅ:­£N]ϦTæ*B4 Oƒøý)vkú·êÙ”‰§êtסuoIúPòý©¹¥¤Õ;Ïžª‰Ë Ø*ƒåõ ˜C…˜½Dé)Yò,Z!n½i¥EÔ€ @&¤?¦œp±eMÒJ{8ŠtZð•Rx§EL¯%Ý–4³À&×€@6©o6÷JŒ h¿m®J…šæ¬S–¾>^&…Æÿ ê•«}~dÕÜ(Úª°­»ÜrtU»Óè§ê'D[=Î}'¶ñœ*ya¶üÜ¢'{Eă€@CÒODší™o¨T€ @Ò÷ÎŒQZco š‰§fÌ2Üù3åÇ»’Å—à½ÆG %"÷^hFN/ºPÐÜùª>šºR–ÿ/w>õ>ÄSˆÒû®‰”ÞÄG U‚P§îžêz+³|NÕÄåÊçÏi–×'ZÞße¢GÌÞåJ;è’Àt¶Ü¿–É¥K4 € @KÚ:¸¿<^ýTjãûûû2·éWÐe¡j§™o]K´Mß69-…à½[H¹œ"P!rïT›‹fË_ù9N'óë¥kpaׯ ©zÇ7ÿËÕas¼¶ŠùMÌPãÖœLµ Ûx6YµúSÐHàlí¤ïoŸ†kL€$ÁyN­I F œ²a6i´—©6 @€ÀYy{µ y§wY´­‚pj‹£~ég¸ bXv"w ³*Dt4,sqŠ€<é ¥Ì˼>RæKg=©ŸûO~za`[Å >¬^I‚¦º±WÂ$ȳתö;lS>rb˜R4il vegâ)1{Ï.ÏHlЮøôÉVf–­|¸@€ žœ Ø+gÒôC.N-—ëéå$y÷lëÞÛÓØ¦-¸Š@ȽK…ÎÖ^Ýenr¢ô>êtõŒHÝ<üŽÛO ¹\•¯ß)å5ßo—>Õñ õÛU¡ÄŽ=Uðá  œŠpÚ#áT[²Ý!p8‡¤'èL<%fïUË<Ê…@ÎnzW°¯þ Ð"@€ L œ Ï"ÓÄ)ßOt6ÿ}ëÇ´æéתÃ×××~ÎÓO‰B“Ζ”€À³&ˆé,”xMäÞcûÖGÞN”[žz K›Ø­;ɶ2ßjlùý Ê©ÚÛëHîàØÓ¦wh8‰×M3)Ÿ.ÉÁ°+;O‰Ù»µã> p–ÀÙ˜] ³s¶ÒC€ @ !§öêѼí…;vàSI-a+Øô_ü(Aͳ€€¹÷û~¡ÞRà¾s¨‰ÇkMO@o\ãàˆÄû¦ðSÉ4c[¼h=œry¬ìÕ^ëL}+äuG<]åì}x·Æ?‘9YÐBà&dçYýÊÛ¹yvSýMHÒL@€ n$†´Õç1QªëΪ;ý£òõ¹~$ú‚©ÉyJq7cƒ†@…ˆÜ»jì½ð¦üÅœÂxŽ_dû.iV~ˆÒ4+`¬ räV¡9W1¶±Å )VWq3)×i ÷ê(mÂÜ)ÄÓU°Þ4k=µCûô{a?AO3ö|îl7oW’æí"C@€ K$ÔÕ¯æÂ…h¢D{hW,p§„___ulëaqÒ|§Oq @à,Ä݇ÓÑNÌø«&ååMêÞð°/L"÷ƒÁU?•lâ$»3n§ÕE¼~w EŸ)´:×5Ýœ=ºÀI<•båQ[òÜ!`8àwJiî#ïí@®MgW>¤‡Nx~~Öï…B{Ë©WçYlV³ªsØ!/’õ‹¦D@€ . h}~( j3¡Öòæëw·‰ÑÃÐTÍOù H¿åÍ'@à¶2vqŸ-%6g、ÂN<ÇþJôÑ3%µÚ<ÎNzÓjyá*çA0|ª>Ï%áì;­Ç§u ›¬·Øp„U ì1¼|0¥¸&Ò³÷¶kKÞÙ%öêZ˃,?Ë óðŽ‰±¨°C‡³™Ä°0‡ @€ÀH`_:ÔêÝpý)Ñópá}˜@U+ou¡Ý‰û?Þk…š| p[šFç·Âû¡b›0{WÒ*^îVOÉýGž­)­°=ETŠ­¼YSÊ=L£Q$™¯‚Ó’a"ºÃ&ÄL`ÛãKz®wZï'ñTÌ['óeÙ©•Õ8×·SJ[³÷¶ KÞ%Á(¡ÿ¯rŸÌ›f MFÝ:sÄ-ãq @€À*ý€½ Wkèã9TàÐËõp¹®h6«m)¿9lVܪÁ{Ë “îL@‘Ï·¦«ûNˆm™‘wjë' Œ=(  Ì>2(5²¥=(uÏÐvd’xÑ}TÃX͉H­’õá_iEc–OßîÒ³)ëò?5MÍøgÿ™"àò&§TÀü«dI•˜½w^¾ÒöʤŽï ÉÊQ|÷­CcÅ–~&š}þ³0bW)Îû•äS@€  ì앇”ÓÏäòƒÿ\·5ŠÉN ¯ ¡Óâ£Î€ÀHÀ*nùÒ^1Þ!rïŽYVwo óYñZéǾ3¼P\bi¸)*ªÒ(¥ªá8Î;øM{@ÃQ4ͪ]Û ~ßõį̂—|d¸¦ñ”˜½ã*‹ tC@æŽñ[X;ÏÌ2«¸¦EuH¹ð¶ZÃéM‘™îÌw5MËå€ @à¶Öƺï·ÅQúcÊò{'M…5TÄt>V†à½wx/h#ü¹÷{ûP¨·>˜áç튨*Iö’6ªƒH:\j©“–4~cžºèFÈØáÞçížbžžXÁ®÷ÛÕħNðõ5Ñü>*iûº-êV5$ý]ÎK©¸~ë"r†V ÌNò¶ZîÎ6òà Ă @8K`ÕªÂáÙ¡`Ƶñٖ楟E€KgYžÇ“§  rïU|É…ã4îq!%Ïq²‚ÝÛ£½æyJÛ½jlÔ,×ûÈ]ó~2ÌÛ5Á¦”åŸÈ½)üMÒÎäÊʤJ—gRaL…m«,!…Ÿm¹ÔŸ<+g…žZW¼½½ÍZáô§8Ìê©?kJ·Ní"[@€ ¤ .œÕbÒžZ„ÏKÞ­ÉP?[f{UŸj j¶”² Vw­Ìf¹Â?‰Ü»4eWˆj˜­žx;Ÿ§:ßÄíT#Ó0èh®JY¾S-ÞñƒŸ|y¿èßZ¼§…â©°:¢@`I`5`—Œ!~û¤?–L)¼ÔÕö™OîPaì3ËñÃ@€ l³x,ú³æV½¥™¾J¯°ßrIU»(§Z3;—ˆ¸$˜N&éSß©”Òã.7qÇ©€hx;æzˆóiŽ)c^‡Ìžz—#$îIôã)e6e¦€aöÑe†®¸[l/ù啸 "º'°e6Ñ‹éqÊ’Œ[SAÊ}×]îjïV"ƒuÿ"Ð@@€ P“ÀÔõIÛ‰õgÍÒU–Vû)ËïÕ4Õ¢Á̘̖ë,Ñg|øH$°õÃuÆË»Ù‡CM¡}|\ç~æaL|J®¾RÄÆâ2.nî|ÚÍɃ‰]ï= Çmz²žæC¿ÅÀž$æÄ‘\?™­—eýú{”Xa>QžÄå É sÚß¾µëR÷Í #%VšákÑCÒÕÙVöéW0ÛÚÍGB€ ;Ђv\;mY<Ä;Uo§Kߔ뚲ˆ(PŒä桞‡Yòá pH dL™$•¦ÐÒÃÀ{Užœ:M¼&+x%žÊÉä\(=_5´²Ë­0&m;±§ãh]_´><³v…ÝjlKs¬Paï"*x²³÷pQGxX Þ;N†ÚÑmhYˆ;–•raRX­Ûr¿êƒMÆ{’? @¸!`¯– n$–€›²ö^¦‘졳†=™ªÌ… #p €@qËr–³ºãm³m"CKûV¿H‹1A!¸ô8“ Í)í š/¹îÃá½Âd¢Ÿí)±„c'°æÙöçJ)qÓœÒ4Ã;ï p}I cöª¿\«Z'ó >ìÑö¬Þm¡H{!0#p¼wø2ÒOŒŽÔŒÓ‰¶]Ö‡ºííÀ.mb¶náO@àrgƒwÉ<1ŠoÞÎöÕE…6ˆž¥žœ§Ïžª‰!@€ p-ô½…òœàQ×ö¥C¶V †7û;¬ðÐ’/ï$ï3àt¦a…Ãò*„6iéY¡œcØÖ.ÿÙ”Þûßh§uøW˜(œøÌÖV(ôº^Z…1|Vþ°] ‘ °EଠE‡kÇæVnã}É‘g [éOíxWÝTí¬Vï+¼ðXm. @€ Ð+vöÚ³´ H!`u´Ðªaa¸YÙœ{yq¶öU°ÕÊúÓO¥æËàù Ro•uôž½Ù‡ƒÞjWx¿êl´Xm]g7;úìÐÝI¯~é€Oïu»Rr¤@}òÓ̈¯«ûqnmÏIqwU}2~ ©í)™×ïJ„ @€€-³Q+÷ü¶u#7@ÞΆÞÚ±o}ÔMº•[BÏ«û•y+è;VdóéX†K¢Ó”K‡Ð.OPm«À”Lk ]/ú©IoÚ<›XfRáÛyÂ{HþÈ&pÖŠ2|ßIvÔO­Bå.jøµøòò²UÐp_5É€UÃ/Úý¢ù€ @MЯòô%ºV×M4ŠJBH$  !és`^Êû(V¶®I«´å*Xßq²‚…|µ±†7¥ÝJÄ_Ê«wt$±!d§¬¤0®V¾›u^.ôÓÂÑb>·÷±%ÀÛuýTÔÍÄ5É C>›ÃRAo·Ž7Õä”Y&eɱsÜ’JÏjÕêYÍù€ @H?á‚¥rÇÀ¦Aà¶ÒçÀKÅ2M¯GάñÒ4¥P,›o{çª ëH<¶¬ÆÜÕ;«ãŸæ’ÐÈÜêBïÔXÛ./ê8ŸÝч`wÉ0°u;UwÔßcÎM_FV¯ùV>;ÂÇml4¡HîÌóÜÞz½ãSïr9ŠnÍy÷u0ë—J<{lÓ´tµwZçeþÜ @€@gÒר 2Óš܇@‰ ajOعîÛwl0JK#Þ!`òѵ>¼Mx)Î8KzSµÍUƒž2œ‹ö§D«žh¯¶¥æÎ„kçÕæÇ¿i¾Ç ˜½¾CnÞgFK!–@^ðÞq±!-r ëñ{dÆMe•¨½ªöXÛYÎü @€ ^ ¼½½ øý ~Å÷:hîL Ðî±?mŸvïñ$I"…CIš*’"ßVð®-¡4}VÒ{—·´dîR7í‚òë;hßuœÖǾPó^œz­Ì7Æôñ…è=uHà¸óÂŒ¶C !ÙÁ{ÿ÷‹éóSLjÈQt¼cu16ÉŸ(d Kª @€ `E@‹êÄõ¹U‰ä@ Ä90;YŽ6[övIŠÙd”dDï±·Í<‘ÉN2¹òÝÁÙyk@žº_A÷ßé©Ãäôwª9&®Ü šOn¶|}ˆ…C±äñ˜NÄšpô~•´«¹g5IN³yË’ËÑâ1½ë]ëÙÚÛQúëëëVk0 ˜ïÍûó~Š€½ŒOš@€ PBàåååpÕÍèÂ< '`Õjk. ..-ç‡w¤Ùm5Öê¾,íR'kryURBCM NrB£ø˜t½`ZXÛ|î&‹;¹:&vŠ^a^¨ñ…òPNÕ}l"Ò„Ÿ8¨²“í'øŠ‘êA`•@Øà½ÙsÑð ,E«íå& @€nB@[%÷Õ’n‚‚fB÷$‿?O~Ú“e^Öã Za[⑤UX*ùáHÈK _')*¢×­Q¦¹üB2t^x?ÕÄÎÛî»$xïØšÓ¤îñ~9)§âÜÛ 3RÅ=¢´ºýïe/GÃ’&@€ ”P„¨Ñ|´¼àœ‹rÂäD&Pa»x[RàŽ&"¸wÐB} Ép§‘?’J®¾–Q®/‚iOÊ{´¾»V°[®¸Æ;Ñ@Õ©ÏUÁ{G샄zÛ7ÎOÔ”Xgy—âª]2#/–¨ °C@;Ò½CÙŒßV.Ôµh§½|@€ ›x<;+ð÷÷÷›p ™€À= :àï̉µ«ÎlÑœJ4ìÃGIŒ´9éAú'“û–Õ]zÍð©ô¥|}¼ÞÐëp6̪ý©‘–ø ×LÖ_ ïôÝzMjòWYzïöº*×ÝèÑÞã «÷\…Òên¤‡ä=Xå|7Ã’†@€ x{Û;½Ž•s!^‡âøüü´²6¬æ#,]>›ÒÏ/i ínšEØî¾IÅ*xRO‡wÊu7nzCHr¶_øëøÓ4Rrï+[Ì]5ënƳv¶L‡‡Çµ~‘Å_/QC@`‡@…£@<&ŸYžìÝéb>‚ @¸çççÙ‚yúçÝhÐ^@à†äb?÷<®å„˜!%„zÄÕ5i`®"B5™ÊtO ‚3õÙùD»ºÇ¾Ó@mŸ(z}–ùNzU¦cGTÑöÞ?ÐÁwß0\+|>==ÝpF“!Ђ÷°·§I[ @€LèUѼ±Lò'@‘ ìï!YÏÞì@ôö»‘÷ÓŽ¤ÂGð PÇŸúÔtÑØ”Ý_RôN«“X"£¦ñž\ã5ø½uêžfuo•ùëë+ò2‰ºA‰ZÞKرĎ& @€À}l…¬$fË}Æ-…ÀÍ h£µ«¾s ýɆß͹xÙšÖ'à½% ã•©!`‰Š—›®Î#¨¨èë„Gîf'€¾ž¼G¿¹n¾ ¥ù=h7x/QOã¶@€ XØZ῾¾ZA>€"x<Þ¦ÑÄA¿§Ò°*8T©{4‘S‹„¹î™'6°B”ÔS]³L¬ÎRD_Í]:64±Q—'Ó€÷›Ægˆº9íT½VÁEo¯ÈKDêS ÞKÀÞS½Lb@€ ûØ /Ãá;÷´7' ½"3ïùŸò¥ºÜr^X'r1 Áòø…¼#—žšI$l]ˆ"ZÑ‘ýOgݪø´šÇ";ZªnR3gÕöûS¯UCšòáÈ÷Vœu~ÊÍ×`4ز®øÍºå9³…£³AHs @€¬h{är½­Í‡Vù“ àV§ÁåÄXr§YÄÃMOÑ#{²±áI€d¯’÷ÚöYíOˆÆçÚú4¤ŸŽ#!”ªÙU ëé 袃ÍBÓ‘?mšÇõÇÇGð5ÕƒNÐôÿ÷÷˜.œò$`ï©þ%1 @€ÀÝ|}}Í–âü¿Û ½¸9­ÓŸgscöŸòÄ™c½¶5‹ÉóoÏ¢ Ú}pò§Î›("».^ÕÝ-ê§cïk”GªšPy¢ÓFª;—8VK>¾j´x”[ádä···›/Àh>Z' M˜òÜ”)Š|ÉÇoV.þò—¿¨òš‹žŸŸ[ï ê@€ sËcOßßßÍK!C@a hÒó6qt ŒØDˆŸ‡©Ÿš?ƒtVyw÷—ƒöÕt°W²Â™Èræbõ!0¨¥Re éo–öh‘ö¢¥½T€ @À•€Ö½ãŠš]Ю¨ÉˆI@6ÌqtºPðÉC x‚òóû‹ë¼Ë¨Þ> H§÷ýT¶ ĺ_O>é¯S{‡Ä]n‰1Ù,´ßû1—CÔ 7! è[Zü£–îOSéŸ* ±v¢*¸1'@Ýä ¢™€ @à>ô«a\³ ú>ýNK!‘€ÂOÓ ÓÅã¯ÖÂ0†Ä&m}ôWÿòý&ÓE^{~C¥×#PMÒ%™t°/hu¸zÃÔÎÕq P€–ú£Z:»åý²ß3ÿAKUèc¹ôVè\Š€ @€€íWõ`áÇ™œ!ȼãt)°áª…¶­›:Ønü¾8uÑe\ǶúŽÚ. ÈcîÔ0öHÜÇ̰dëwGG fOD=xç<;Ø´:På îÝ­òÏŠ¼"¢n耀̲rh—¸ö*(Ƭ÷KMþ;ô#K–ÚÁkE @€À= k]ý¬¸gói5 Y2w~õ›|$›ÿª¶¡›Ùa3 LÚP/ߪª&¯vI&xdç7ÍEÒKÈól!އnö7]:R… eݘZªõIo³—´òŸ¼ åŽ jÍAÛ·rªÑXaNP°ÊÈk!êPÙµ´æ$ª¬AKÕi©¡†%• @¸ý*Ñ:ùVM¦±€f†m$®Fƒ¼ÌÔ„tD²B—+#ä?/|IÏ)ýšv·œÕ•Òõ<úˆSûë>…À LÝN3f*éžÎ§wžh; @€ \H@Q¼ÍHŠ)GÂ)„æ)±ƒÄ¸Š@…([³ q­ý:]3-êÖÀ;u_2ô}꩸ô§0މ¥ ]¸È¡h´E@»»9ðtœ=îy1{ªh:ö'Ó¶Þ_j @€ @=•ÆÛ4ñúxõÓ êäüüÛ%üéêt¥˜HÙ à4-°ÇÀ¤w2‘„J ß’Ñ«8rÆÜ!ÜÙGúò*Áuø¬T€ž–L´• h•.ßmE÷õsø.“À€B7+/jiå—‹â @€ @‡¼[êCX܉tÊ1Ž© Ý7G ¦Ÿ p?çîÙÆi $TMMûÝÁ§3}|[„)Aég”Ný)9àpB@ ‘€\ÑROMA1jéëë+¾ù‰ƒŸd€ @€ ú´¡ÝնЇ¶¨óïV))Àã­Ü”N™åI“€œW³÷Í>N@ŽÙ§[µ’P~a”fïe˜¿¶Ç(ÂÀÆ^ïW˜ $ Ô_ÕP"î@@]¥¥jÂÇLJ\¼ çC²ò 0ø–*&3jé^OÚ@€ @}Ðy+Á4Ï,Ï >–I´ñ ŒZªD:ï2æ“p—*Ò²¤mýÈRìåøã‡B€ @€ °$ {‹·Õ¢ƒƒW=tnã±-i€Ún¸$ «ô»­úp¿9WjÖÚ Bîý]- úw ÁàÚ#q–Kî@ȽQ~ßïÐR]g¹iæRKÌGq•å\¡‹)€ @€ ô{úóßüºÑd¦7ÉëžÎJuTJq% WÒü5?̰ƒM®R3s¹ÌK7¼ÄùpœÔI hÆw–M‡Á6ûR3'ϧÖoÒRå9h©æoúm3T´dÅLF-M¤ @€ 4J@æWÓ‡ÌÔ5u§²¦z“D‡ç–lëØ Cí: UÕïèÃ¥hßÍUŠ!:þ00\ßweΧ® ©v÷HvÐR½7OzO2•óÔRýh’o©âöt?Nh  @€ @ÞÇžJj<´áÇO ég´ÒôáKŸ95t" ñhÌÕ.œÚB¶&4¿iZóvE¬6Ø–ékHζlzG‹P,)ÙÞA\`y &H ”û¤B΢¥Îæ@«¸ÇRKµDÞ»Mô&•„ @€ @À€ 3sùŸ}8 göáH;šÐ¹¸'ów|?C©r÷äÜ\«\ŽÉrGíFHUCÞþõ­¹Žð®ð4–ÂþË›÷©TÃU YAÕ ZªÒÊÑ2ïõoú)ÔÒj#‚ @€ @Mð¶ôa»â[rÔ©·UŸü+vT³pÊé¯B£(œÀ×·E!U#\3vûvÌ»Ujëë//¶&?TØ! ÿqi©r½ìXKÔRáQ4ã|@€ @€À= È*âkGíB:‘ŽÀayf|ò¬O ²F¤ëú]l^¢f?õcd§Ô!6¯öê ™ö¾÷ö )÷\MÑjtL@ZªØJK•ਸ਼®?ü2—_¼vw(R1jiÇc•¦A€ @€¬Ȇàg¦PÎ_û:´å’¨FÀ;hçl>a×Aµž­VÍ”L9h©R-g=^íO-'JgÎ3Mïz‰ËÞÄù€VË3ò@XzÍ¥¥þå/ñžO ó×ï°<© @€ @ h÷µ¡ib5+¢Ý¦[¶I o’½VßS§›xzwh„üß|É©ƒ¢ª=3æÃIþ’ršVþÀ*ޝ•¼~÷~ýå’pC• sÒOÛrAUmÙÚa> È€ @€ Ð7s+÷,Ã×Çkž™—§ p9É4À’ltv§´9»éúòZ•T@-𽡮–T•g[' ŸÐAW^®¾ :¤ÕŠç%ùÈ|µ]†7‰Ô}IÏR(–ô2¾Ú«Y)ø?K)@ ?aöþçþçÏÏÏêttö&Á{û·´€ @€ `H ‚y¤u½ii‘îþΨ“êüJù“þüÃÆNuÖ®0}ën•ª¿7ÕîßVxo–„a¸!+@ °{å1ª=&asÞg¼Q@€ @€@LÞbŠÜ[15ß­žÒµ¥¦ÉÀ.RWá@LïÁægøº"ÒºÛKD{!–€&v×÷]úEÌU µ‚J”ìýþþ~}}ýü´?fýååehšòW)…SÁ{KÆ ÏB€ @€º'àaܘZ3d¿ k[¾OÅ¿Q:©Ž¼D'γ× f×3åª|ŸwŠ–B 8…Í?;ÅJ¯°ÿÝ/h îF <"É_¿~‰[¹»œ‘¦Ý¡RÊ‹ xï)×€ @€ L ”[–ÆéœÑ*ØŸ{uRÁ÷¶ŸOûºûkùçVîMóâ\ý‹¥Î›W˜ !  ,à=!.`Ó×€@ÓJöêÙ©)çPÛYH»=—lUba—yr€ @€ ˆ€ìŸ¶Æen†_I!0è¤r‡Ô?‰b®N…Ën½ávHßôë8©ö)ã–4€€7½Œ~oú3+(@ 3ÙÛ)uòÒ]‡“ÚÎBªÞp•®:ä·“íVq܇ @€ @àö*ÏÚþ’J¹\ uz¬DREFE'M{æ)Ë»òÚtl«9“1CE‡¾¶u” ôe1¾˜«.`wX2ÑFôJ {/¥Ž?âô.É”K:¾äʺ,b¼£:¨&Óôé×S‡Ù1C. @€ @€@IÀ«ÓÁ<Óíùе8ÓIþ‘¹—>¥kHs–@zWÆLéê³ÉÔ 7$à [Ó&¾Z,!Ð)B§Ùßýx<ή²vÒË•õ¹ê“Ñý:Ì™€ @€ Ü@vœ®Çô£NŠô°½:©<å"$DÞ¶îipM 7êì¶ï?ØALcל… @€ @à†ÞÞ#yÊè!ßÉK¬Çq U8S‰nòÀ'E'µ2¦ÕÏGÁ“㌫¼š8«€Òyõá)@À–€ŽÃöžE“.¥h2%p6`¯¢v'ƹU2«¹H!yOáUѪç©Ò÷½hO•Nb@€ @€ú  @X§Ì ‰ïs¢¬ÖSôëo_¸x$,Éß¶2GýÜœ´{¢s×ïJJ„À*½Œ®S(!.ûXûÑ ˆÀ©€½???ÚoyŠ›Õ\$'ÖSå‰U[Õ9±rne[Hd @€ ôM ã„ D[ÄLÁiWm¼MßtR©iƒ?©“Cß)Î$ö&Ð¥“°ÒA@㦧#*‘€âÀ»Î„:ǰï­ƒÀ}¤G¸Õ‹Ÿ¡-žuÿÜš»²ÝBUçô£WEã>]OK!@€ @H! pX[ö “ûHNÒ†$’ª!rÜC'5-fÒÁÉžÚÉàA^{ Fí† @àBÞßPg]ÏR!¤êH Ø« –ÙÚeº8»¿2)„£ú'nÍnia y€ @€ ˜kßjQø©¢×^hI6)Ú)Øi!X¯L ƒ|µ ÀšÉ[V?ùèéÕÖ¦m¬,8¿þð«~5(V$ßãŸæ©Pÿ1W2Ô H'°·Ðóõõu:{ä]Ë}5½];)S”\‚÷îä#@€ @€À ^#˜šóêàíÝsæaúe͆ŠŒ¡zY•9u6äž’M|d¢•7Ê¡¹ùìøl4½Æ¤f¡v&ÔŸ gïÕÁóööÖÁò†&@xy9qØ:ÞîöEC€ @€ °J@g ­ÚN­nÊÆ[ß°lU¢BMZq0ÏgÐI…wP2<¹ Íï¡zÙC) ÕÀ¼ámÒÝòwË+ýÚ§¼ÝôÌßî»e(ïx¹ÆkÛÑ}ß“½;ÃLªÇê‚›€ üúub ·{"U’A€ @€ PÀ©á;¶Ö­dãM´ÇL¶Õ®š÷¿þö5¸hÉïOÊ`†NºÊÖPd”ð±ZÄU7Í{§õa¬ŽÐà)ÇÒ¨“ ‰p\NRh2it˜Õœî O¬^í”j+ ‚:&ðõõµ:Ã,o²a£ãa@Ó @€ @8µ3|iî8¼#Éš&eó²$\¶Ñ0D:+)­gÐIuV£y‹Æ ÅÓhÚ¢¹² a0rkô¤»u Ô;eø’’UúâÐ4è:6ú"«ÚÞgøJïht=Cµ!PÒOÑ‘P5§2€ @€ @@¾¿¿]áíÚ¨UsÉ‚NpFT1E%l]"KY5Mbe¨^öèµP ̨Œ–Ë»;£ÜxŒ‡r˜äB@ލH¨³—Èd#Äü–F€Ê èôä©füˆ å¨É€ @€ ŸŸ^úà`‘¥wfûmèOÀŸRpt¨_(†š¡úT‚Ëh”³ºè@Á)D¡ª—Ó+c8Î òxuŸæáK¶—¤±š) ¿•V»ƒÃ=Zä x~NÚµ%Õ¡É€ @€ Ä' KéªÕê¦"ÐÖ4,Û–erRä@RoÛº•çfè‘JöB50¯ë µä¥VðÛ¼r/ª¤Õ<„€$Ô¦¿J ßÍ!Ó^æðÁøË6jVüüüL§—Õk9¨¶Òê @€ @€À­$†ÕZµx¤Ü (¦Û±%™¥´1%M@Ç=C#¼œjÓ©z§T$ä”9•FyzWÛ;ÿB­¼QéÊ$^ñ©¡Bb?ÃêPï7%xþÞ'q?==Ýj Dc!?)Ámä êWr† @€ @ÙÃjeÛÃІé¶qkÍnøìÁ€ =4CI䆒÷؉¡˜>€§) »»QùØc0Œ£‚‹Ktð2N_̳×Þ̳×<@`Fà0¸\Sgð' @€ @ˆCÀÝ«ˆ\Íþ3„ ‚ÜE­ZJÎÐñˆVíói7hí8ê cP7¸XûÔpOõ`¡ïí8¸¸œ€zóž§ z{RËM,ÎÊ„š@­Pðýï æœÖ»˜úC€ @€ú&ðõõµoÜ(üTúŨà4wa#1šµßÐ)/š_máˆ]>­ïQ¡VÞô[<Ã¥‘/RTõO=[xìr´p§ÍÌ7 áë“|ÚYrë{µCë š~ý:ØÌÆœS³;( € @€ ³ÇÔ|j~ݨÏÚ ¸z«ä`Õ×’ŸfúÔµöÚˆèÚ•—^¨•—W xR‡…7ÕqÀÇ¿øùÇÏÝôSÉý®ýòþþ~vý@z@;ö÷gÊ5uçY>‚ @€ @×8<“¨ÐZ+{opÝd§z†Æê€§FJ}(ìÜññ†õ?RTϱbVч3¨f£—_Fq}<"E7Õì‘ãýàÝôSm!Ó>Bȸv1FéèÀþþL¹¦ö×dZ@€ @€@7Ï$šW3®›>/ÒP< ("šâC¹€öÚ8à:ŸU'Ƕœ½Ð89[VßéqS=;„üÒßJ?õ1Ýͪ††@A¼½½mÍÿrJ RIª@€ @€V <==mY6Lî7í¶Vìt 0 ˆlè¡J[ô80 ãðY2[+üõq¶¬{¦Ÿ¹©ž˜;xÔGyƒñô,ê”ôšõO¢RTqSÍœãSÝûGë5ëq¡ÓÏ[\½Pg@ 8õcè唼æT€ @€ ÈjêaŒól:ä©á1sÑ|£ ]™¢ùÕŽcÏê"ZSä¹Yšlñ¥éÍ3ÁÿÄMµä…mú‹æpdJ.søìëë+k!@æVbÈÕ¼ 2„ @€ @æ;ëвZ’ ”[â¡z–@ªYIÛ§ÏF¡ =4£lkîǧP«³ÑÜŸ¯×éhL¿Ž6n›#_^auþᦺ?hõ’FÛ RÞõc†ßD«ñ3_Y‘! ///Ë9Gî¨À @€ @ñ ¬Z6–¶Žì;M{íI°ÈnøìA©W£%<ÈŬ†%iÑP ¡!T3*#õ-¯3Êâ‘ pS]ŽçŽƒ÷.k{'þB…BXNVÄ o´+©6 @€ @à†–– Ã;M{íЧ=p EFI9£Ä" {m|ZwÀTm9u‘ÈœdAÜÜMõù·ç aXì—7ñM×¹ç7\öÐd@ ¯¯¯Ù\¤M›uЦ@€ @€ PHàûû{fÙ°ý³ÝhŠÙþzK€½¢>¾>–õÌ»J[Ì>ßs§í‡Ïª3;­Ûú¨i·ñ³|:N¯Xo¨NÕ¾MDêVíiÙêô¦ïw9b³cn'våãñ(\Bð8 -ËcO·Rr€ @€ D# ã‡­¬yÉB)k§$ù1å5yùT@«¾¡‡¦ôÊS`]JÞc?t>Ë0C/ 8h϶šô;4¿éeÑØÖ?õµùaÁãëSó¢Ý¯›­ž2œ¨W;‚šÑ–dÔ=x{{›Î[ éoE`é¦zvêðHߙǴ¢1O‰®=(¸éá úÅq‡&ÓF@€ @€º!0šR.Úä6kÅäõñƒUÓ”O¨¦JÞ#¢P ̨L†xMîÏh5Ô' UÉîš9Í÷0Œ/ãþ…\5ë·Ú©DÃø«Ð>??»YÆÐ@ &ñpvkÄì j@€ @€ÀYPW-«V7eNw²-{g+'&+ý¡ ÕP¡2 {mìýÖ•Ä ¦Ý×Ö{Z ÿtR ç™ñ}Ü¿5¥³Z¦4<™z•çø0! ƒ•‡ùG.¨&’  @€ @¨Fàñ0ó¯\µÐtº\š©Wï¨æ«-ʸðìWCÍPÚ"âér0gˆ§ËL¸<â5!½?ws\¯ÇT6EÇùƒÕVY;¦vkÜy Ðv@€ @€@£Þßß§Uóë€N—‰@†ä´E/àÙ¯†–ùPçcöÚØ›íŽáa¨Ÿ=ⶃc^ßq’U# Ah8çŒïæòB¾®ÕåZáþ–%%Ý‘GX£‹ª 4Dàëë‹ §¡þ¢ª€ @€ ŒƘZ«öÕò›uÃt‹wyó‡žÄ—qæPÚ¢Üܶê™}?TÓGï4å©¶7ýÎN[Íu4z=+òÖê¼úxûêŽk. øŽ=õËŸœ!@€ @€€_¿~VÎ&¨¦›² Í×é…ÖIiè¡ùñõQ§Î‰¥œ¢‡é;õ6sLÐA{‡ Éê¨à‚ªÉ­~»lKÔÉ­ãûèq!_0§ÙB˜P„p&œ)®!@€ @hˆÀ÷÷ a%ÃkkU®™›T¤Œö®>"—«š5?,ËÐ8Mk;%®vÖìfÓ†‘pj$wsjäá[@‚«(Ö÷ì-3ü3T ñ<†›[VÁ~||4´D¡ª€@»žžž8ð´Ýî£æ€ @€ ›øü4“Wí´íú=þúXmQÆÍ€2Z±õHž@àôÔ)¡p«E³ûNU­–­¼ƒg-Úùñ´Z¿Ü¹ ?ý´ƒ8ÛÞçâeÜ|ÕGó!P“',פMY€ @€ $ÚS ?jW‹1´`´ç>¨Pœqd Ã^G~4Çá³´Oqûúx=›?é!AÀI?æ ŸAÆcg3] e® È € @€ @è’€$ššUͯꆉÖlCÛ~@†š¡üj=t‡P L½Ód§ÄÓÖ;m8×Á x¼­:«:x««g89¯~¡+f—‹@€ @€ @ÀŠÀóóóª}Õêf»~@R‘:†`([„:dÐ°×ÆÞ¨}ê/Ó§˜è<Üé³\CÀ•€ù!Åzm]+\!sðã$6½°Z< @€ @€ Ž Lͪæ×튧ŠFkECA“û©" ÅÓPÚ¢BìZõÚ˜O¨žêå!ñ)ñ4#@6Sƒs|%÷/²+äÁýÖ~ªSÎ;^ÌÐ4@€ @€ @V¾¾¾ í±û±HgTc¿]§>Í(ÝõCÍâãëõªg3?Õ/)‰ÛÝ0¢Ki¦ÒTùÇ&pÑ+ó(µMR,×ïÄ·5/™N9·Z9 @€ @€ Ž <<3lâSíÚü ­úÑ¢¡zhFÓuèaâÈLL¦(šíŽá¡æ‰-Ö•­c§þ)ÌåBí I)7fÃm-«o=âiÇk9š@€ @€ 5uÕÊju³]S¶|*;†`Õ4‰•¡dCÉ{Dª•Ií~ã¨ï ¿tV‘¾¼¼ôº’¡]€ @€ @€ Èšºjeµº)kp‹ö|ÕÙÐ ( „DA-e„R+<Ô‡P Ìx›eÄÓ ¶¢ L $êû³sõϦÅÓÕYÝD<íxGÓ @€ @€ s²©Z™gWó™ÉÛº6 ¢¨sýBµ]JÙjgeÜŒ¦-þüã'£;t>5–ÅÓSy’†‡èÎK:~Ô®xj{öëd¼øý÷ßÍd@€ @€ @ WÇc´¯z\ÚØ+ge(ž4é[õµÄÊÊý²_œa¯ˆöK þi¢(¼T¯c†â©Â­7 ÊÂ8qM/O{]ÂÑ.@€ @€ @Àƒ€lªS«ùu@Ý0ѺnxŸâR&Z-™áùzÕêœR›áv™Ø! †¶¤€Ã!š˜À©z²}û×·Ä6æ%{yyñX?' @€ @€ . ¼½9ÛlÿøRÁòìQ„áI|Òa=jX’§¡‡f(}ÜPòEŠP Ìèô±![Ñb/g´‘Gš&°52ÏÞo‚ÇÄ5¥‡xÚåúFA€ @€ @NdSšXͯꆉvÃ8Š_‰…VKfè¡J[ôpàRžÕúÅ£ C/cÄSìä™NÀä{§éal8!¯ÂtZ?- @€ @€ . <==­ÚZ­n¶+ž&™* UßÐÑ)TJÞcφj`º 5¦ÔðÛ²z!áfLÌêX–goœfÓI¾¤giÌÒw¹z¡Q€ @€ @€ü̬¬¶6mÐ6D‘nE¯“òõñjÕºPÚ¢Î'µjטO@ÇáSƒäP— x&ï©’¸iVïl¨‰èlº‡ÓQÆÅçç§ßúœ!@€ @€ tIàëë+ÛøÈ×߾Κ‘ã¤Wå›y˜LAœv©&†šÑôñþ8› ZÏ$‰JûMF<=‹”ô†¬æ¢¦Ãkï¿¡…Ÿ"žv¹r£Q€ @€ @€€+YV m³ûšÙ+guè²·ßðé§¡0N«Wr-Ÿ©Êý²_œa¯XöK þ©´Ñ±!«rCÞª×1+ñôù·çF)©æ«/¦ÕÍßÿÝu Aæ€ @€ @€ú# ˪•‘v5ŸhN—éöC—½Õö®Þ èõóŸÕªfÜLGZ!¥¢ìf4aÿ‘vǰ€Ч•ý ã„"‚0 !®Ù,Hs2ªa%oMbïïïý­[h @€ @€ WÞâi»ÒÌ¡ê´e¬^ÞxŸ¡‡f(Ÿ/CÉ{ìÇvǰ¤œCi¦éÖehU<Š€É ÛtlmÃ/šqÊš^¼¼¼¸.!È€ @€ @€@^__§†Vóëvƒ‚ªNé¬äJ°Pe}¤×?e(õMN¾ûµÍø4 ãpúp:ÆéY‘æLŽ–¸;%”‰|¼3­=??÷·n¡E€ @€ @€\ È-eÇîZþQ»fmãè:FZìCuñ¡V˜1¤C50]”Rã³’V;ã}\>Òî‘ôˆ4>Eäº~ s@€ @€ @]øõËÆ|=µÖN¯›ž¦ )¼¶’¬ò19jp`ª‹­ä˜iwËK× û%ùLÛ2»nú°ÈK`R¨!+?ñ§ÿódX«ÊYFPŸ½Ýúóçç§Ëu ‚ @€ @€ àM`iq5¼Ðé2Ý6þý÷o+é…ÖIiè¡­‹­ºlÌ'ZÏŽ±!ˋ֛véC0 ÞúÕùbZÝùüüô^?? @€ @€ . |}}Y™j—ùèH»PæúS•‘´´lQÞPƒò²|*Z›œ¢(EC½/qG~µMU_ï¨3ˆ§§&Û0ÙÒ±cør²={çãã£ËE ‚ @€ @€ àM@Î)gM²§ÒÛÚÛkæ&áìTKwàvj{ö£šrXÖYÉ{¦“”¹›¼Ÿ`ˆÎ[Ü–O!àDÀÊù]§ú:Õ°B¶‡GŸŠgéÿýwïõùC€ @€ @è’€ì«3‹«íŸ:†²‚Ú£Cñ4ÔÁ «MíìuæàN¯ÉÓM­Vý“vÓŸNºúìtôûŸÞWá&¼ ì ËôùGo´w=]ó·R·ˆ½¿¿w¹h¡Q€ @€ @€¼ x‹§íJT†–퀱%åu¸er?{?TKTý¼wª“6ížV(ßìœ,‰xZÈ–ÇóXM­7¥œ2LVgçÛôô///Þëò‡ @€ @€ Ð%×××tclFÊ€kíÛ†1%ä%Z-ÙŽ‡æÙ^Fƒ«Ökí4oÿú–‘!@ €‰Û©¦©P>ïL 'áÕIûùù¹ËE ‚ @€ @€ àM@Î)«vW«›M;YAÐÁš¦u×G$œYµ®é.v…!óñ4”ËpVÔ¡+·Sy—W¨­k†îÿ«“¹÷âü!@€ @€ ôJàׯ_«vW«›#Ö¦ÛÃu¦ž‡ôB뤴’0Ä' _m†M”"×ï­1ŒxÚDvVI+·Óü¦­P¬¾à???½.Zh @€ @€ VM¯V7›VÖ ÛÑ„ª_0Í;pëLŸš6gG%ט¦äÞ Þ;½V_²«ù|~~VXHs«‡Û"žšs&Ã%MþVß#ʧé}838†ß,KÂßßß}¯Xh @€ @€ –ÖWÃ;²ÏìÆ ýihüǯ³¡~頻«ñ™O{êâ˜m±L+·Óžâ‡~Ã.³úüü¬°l @€ ðÙ»ŸPW²3AðÚxãd.Ò /”P˜c°¹(’‚t@.jV9Ș¦VM#0L20È<›.húAØ< f(‘—y4ÍÈílšâAP‹y®ª¡ MÍ$eJ‹×YnHØéÜÏéRYu}ïU\)tNü9ñ{$¶®qâœß½¡øô}:' @€ @ ok½›€õLo÷y~­!bþ?§iSçÚ²s{‹§ƒ¾qç¤:ð @ø‹u9´“Ùûg\œ[­­×ë¼#£#@€ @€ @€@ I‹§!¯û`¦½·„;ÞÊK7þ1³äoe:vKàÞâ©yз”üQ zåtûb±{7ξÆ×‘sv,˲…°Á! @€ @€ ·@ȵž“’m¼ÍìѬó|u³DÌrzùâfzöꃀâi~ ãéC¸¹sã+Ž;†{3»atÄËʽbËå2ïˆÅè @€ @€ Ђ@êâép§¹…»ìÝ›nðdf“§ÆS úHï­Ô ÷”ú¯#ïþ‡*g¨u6x{¬Ù%¿ûóF\ þ^·¢(Z‚ @€ @€y „\ë½9ØXO:û!ÜøÕÌÓ¼ËF½ݽÅÓáNï­³Ž°`ïúù:¼×…w¼(ïœY¾m¦.žÎf³¼#£#@€ @€ @€@ ©‹§ƒ¾ÝgÈÞ_T3LÃ.aÈá¿P·ÊlÁI¢Á Ü[<Ü(txˆáÝ/üù…/Ï„7Ãð®xé{i˜Äše•³Ý\tM¹tãb‡ @€ @€ @€À.MÏ^´ý ‹§5‰îc4TB Ë<ÿK6ú|S °îž­77ð˜@›a-ôðn¹X/Âu¡~šê —,¨!½´ˆ|÷ü­yf·Û!b1F @€ @€´ °ßG¾QÝÍìnÈ×d’{þRÈð‡±„!„*jxÖ¥ ™ÿÿïy·uÀQàæÉxx||É=¸5MuÐ_¹©'MZ<­ªª…€Á! @€ @€ 0q½[a‰õÌ ‹§õip¯è¿À­9ܲÿ}ÖC¹ ĺ!ì­óúð£âé6c$@€ @€ @ ÅÓ\õÆEàV‘Å—üIèPàÖù÷Dz,Û‰… @€ @€Ù l6›¸)Ü›­í?Ûw˜©vh#'àÍóQñtä†ß­ÀÍ“1úcÅÓì£5$@€ @€ @ 5qžÅ½Ù`·ÉjG'0f[÷XT<óƒ±w+î—}óÊý±âikQ“ @€ @€ ½€âi·uG'NàVñtý|îXZ&@ F xRD/˜Þlp±Xd®  @€ @€ÚH]<=šÕ䓽D€@:[ÅÓÕû«tÇÒ25©‹§EQ´38  @€ @€²×›³W¢?ãš|²—H'°ÙþÎOÓQk™@½€âiöÑ” @€ @€ €âi}ÆÛ«†+ª¥7¿¡x:Ü_¥ž]àÖÉxóÄŒòx6›e– @€ @€ºP<zN^ÿ œ¸U¯Y>]žÚÒó$(Ÿ•QФ§é6pt @€ @€ä$0NO%c£<2ÆI3Ò'@à”À­â©5´OAyž@jÅÓœ'c!@€ @€ @ {(EÒS(ž¦ÎÉkŸÀ)0Õô扩xz ÊóR ¬Ÿ¯ožŒqï÷ûì$@€ @€ @€@›q³¸·ZSS¡Zzó|T<=åy©ª«›'cÜÇUUµ38 @€ @€²Øívq¹7[Ûl7©“ÒÚ'@à^[ÅÓé;Ó{7ó$©O³¥  @€ @€œ¤•›åθCÆ8uRZûÜ+p«xzï6ž$@ í‹mÜkëÍÖÌ<Í)$3 @€ @€ú  xÚBæÜ!´/0{4»Yai¿ŽH€ÀAàæ™ýqY–}ˆ%ô @€ @€Ùl6›è¹Ücƒ»Ov’çt%p<îúà¸Ü<£?V<Í&3 @€ @€z"ò®Ñs¹7”6'@ +ã™V íªŽK€ÀñLLñ@ñ´'Ñ”n @€ @€ €â©Ä>\Ž•wÎõWl\ý¸u÷áãYëÁb±È& 1 @€ @€ôA uñtúδÿÉm=$¥@X7ûP Q<Íò÷kPƒH]<-Š¢±„> @€ @€ @ w5ÿåÞvBÞxùm$Ÿ@¨™*žæ÷k5¢a (žf/ @€ @€#P<V^o œ/p,ž–ÏÊó÷²%Vï¯îýfQ¬'g³ÙHÂÃ$@€ @€ @€@;Ч“äš"Ð+cñ4”ozÕ1!0ðÕ…XuÒ{Ûi'Tp @€ @€ŒG`:Þ›õ¤)oã©ißÖÏׇYñ´o¿ý€âéx*#%@€ @€ @ XuÒ{ÛQ<OÀHû&p\/Tñ´o¿ýÀñ; ÷^"¯2›PÄ@ @€ @€ Ðë“·5-(žŽ§F`¤}P<íÛoDF(p\=»æBÙø¥ªªúKè  @€ @€²Øï÷3·î¸ÙnF˜-7d}P<íÃoAF. xšM°d  @€çüÁ|þvQþûÞjõ^YÞûß·—Ëãfá~Rç´l @€m „©+Ö@oòÆ#Ïœ>®ŽÅÓÅzÑU—ÀÈOÛŒg‹ @ ×f³Pú|÷k£TUøïãÝ®qâè°ã§ûý¡©PlýÓ² íÿþ|ÞÎp… @€À]ÅÓ‘çö ?Wcñ´xRä:Fã"Ðs+3Hõ»—ey÷šî @€qB©t¹X„šæ®ª¿ÛnëcÔè¯þ·Ý.7ý_.¿7›ÅšÖ @€œHZ<Ý}²ëyf[÷ä* xšëoÖ¸$=wt³AÅÓSç  @€®Kï†euC½2LýMÊ;=Ý nÏ|¨¥þ¯Ëå릦^ók¶/ @€@­@Ⱦž£6Ør@Yn]%“@X­÷pšyšÓ¯ÕX†%Ðà¢yþ.ЧµÑ  @€.Ë䪥aùÜó#Òη ½}¶Ùüïeù‡EqÁhmJ€ @à!ÅÓa¥âõ–À™¡fzø$«xz¦˜ÍĘ?ž'Í&-—ˇ®ð^'@€ p¿ÀËÓéa1ÞöWâM$ÿßU ©´XÜ?fÏ @€8[@ñ4n¶\kz" xÚ“_„nŒVàx&ʾ]v¨cC @€ƒÀa†iNÓSÁö_WÕ¿]­,íë/Ÿ @ ™ÀbñOk{ž 8¯|Þ¬·Ñ ¼[cá&Lë¶'ŽN`œÇsðÊËè©ÝO›…=ö"@€ŒM ÜÃôÝÕê/6›SeÞÏÿz¿ÿ?Öëÿe¹œÍfcûÕ/ @€@c}M'+žŽ³j`Ô  7÷DŒS`ùt™ôò:ŸÏ_úíH€ ½@X•÷§ëõÇ»]Ò tXÿ¿Ûm˜Ž*Îþß  @€× (žŽ3«oÔÙ (žfÿ+6Àž ”Ïʤ©¤ë- @€d&ðÚlöå²ë$ÓóÃïØíÂÝQ¿é†C€ˆ'Ö-9?¼l°åêýUÏóÛºG K°Zïá„ÍrtE ÿЧñB- @€Ô üþ|þ§e9†;™6ÈJÕïòé~ÿï×ë?RE­ûûò @`¤õ‘䕯†ìqÿSÜzH KÃÉ›åÐ Š@ÿOGT6 @ -p3Ó÷ÊÒ¼W¦­»«¢¶õgë8 @€ÁD‰3O5¢xÚÿ ¿æ*p8+sqè¹@õauêÊxýóUU &ÈÐQ @€¨j¦×‡Ó5-„*ê¿[¯­èõoVc @€A ì÷ûš¸ñÊ—ÖÏ×=Ïoë\'o®£3.=P<dH¤Ó @€¾ „µyÍ3½2CuÑî¿VEíë¹ _ @€v–‹È‹6Ùãžç·u@®áTÝ¾Øæ::ã"ÐsÅÓvbG!@€ä-ðÚlöîjå~¦e¢ânü«ýþ‡e9ŸÏóþK3: @€[Ч=ÏÀëfá£o/4£³ëâflnµV–å­K¹  @€rxy:ýÎr¹Mù]÷[¦øÛíöOV«Ùl–Ó_š± @€œHZ<5ñíú ¼4ýO›ÑÙ‹Àõæ^®Ù@ñôTHãy @€ÀЖ‹ÅÏÖëkbEû¦øóÍæ[Ëåt:ú›þ @€Ô„lÒÀòú´h ¾º xÚÀÍ.¢$½°*žÖD5^"@€ Qàþñ–¦Ÿî÷IÃHG7E}º^[Îwˆ§›> @€ÎP<’'×¾ „Ê©âiß~)ú3ùãyÄ´ÌݦV«Õ9×wÛ @€ô\à°<¯[šÞxôÌG»ÝwW+Q{~®é @àRÅÓ‘$ó slЧcûoŠ'EÒlOQ—^ëmO€ Ð+o…åy“ÆÌí7þïÖkz¯Î2!@€\#°X,’†”!‡ÜŸ„¶ž€âéx~×FÚ7ÅÓkÂû @€2xm6{¯,?Þí’æa4Þ¡@˜ˆúý²œÍfÿ @` á{qI£JÅÓ¾eõõg$¡xºz5’Á&^ (žŽ!|2F @€ÀEËÅ¢Úl’¦_4Þ+pGTQ/:GlL€è•€âi¯Rî:C –€âi,Ií¸T@ñ´WqŽÎ @€:0Õ´WÍö;&¢þñr鎨žƒM€h& xziVÜö!°ÙnÌ<ÄoJ'óH]<•{iðØ‹ ЦÀÛîjÚ~©²¯Güõ~ÿ“õz>Ÿ·ùèX @€×(žæ—·7"A TNOý%èD uñôš‹¾}  @€’ ¼<¾»Z¹«i_˘÷ëçUõ­å2é_ Æ  @€¢(žv’ZwP©OS kŸÀ)Åz‘4)åê¯ @€¸0Ÿÿt½Nj<_í÷ß/KëÉÄ=µF€ˆ+¢µ¤Ág˜€s*½ìyÒ (ž¦³Õ2zòY™ôÂ7 Ð @€À•ß^.?¨ª¤ Æ³°–ï•§žÝ  @€I’† Š§õ9v¯H$Š§Ë§ËDk–ÅÓ¤A‹Æ  @€=+ô¾W–¿Üí’&U4ž½@XËw±Xôä¯Z7 @€ŽIѰzaM†ÙK$ÅS_]Hd«YõЧÇà @€@–VèMšGgãívV+kùfùŽaP @€À@’Æ¥!‡\Ÿdö*)OS¨j“À9Ч ‡t› ð Àÿf…Þ¤)¤Ñ7n‡ú£õz6›=ø§h @€ÔIƒSÅÓs2í¶!]@ñ4:© œ) xš:nÑ> @ e°Bïw–˭Л4¤ñáv¨EQ´üwîp @€7nDgñ*žž™l·¸Чq=µFà|ÅÓ›1†Ç @€A ¼6›…›~ºßÇO—h‘ÀCáv¨J¨ƒ~Ñy @`ÐkW½®xz~¾Ý–" (žFÄÔ‹Oé< @à ðõùü§ëõU ;ˆ!n‡ú­åÒ‰I€ в@ŒPîdЧ¥ÜmL –@ñ¤ÿÅjM;œ/´xZUUËA‚à @€Æ&ðvQ|PU'Ó^ Ð…@(¡¾[–Óétlç£ñ @€ºHô)žžŸo·%ˆЧ15Eà"ÅÓ®âÇ%@€\)ðm76Mš!ÒøÕ¿Úï¿_–³ÙìÊ?u» @€<(puìV×€âéE)wˆ% xKR;.X?O¸¼›™§F56 @€\*ðòtú½ÕêãÝ®.»á5}øñz­„zé™n{ @€ÀEÛí6]¨xziÖÝö¢(žFaÔÕ‡ yS<½(±1 @ ^à‹Óé{eùé~Ÿ.+¢eé~¢„Z†{• p…@ÈĦ äO$ÞíBàzÅÓë µ@ ™€âé!‰]  @€- ¼6›ýt½þ²iº|–Ûx^UEQ´tæ8  @`4ЧÍÒãö"ÐgÅÓ>ÿvô-oÅÓÑPJ€ Rà«ÿX6m«®å8Zø¹ê ßtšè¯@ÒâiÈ!ç$7:ýP<íçïE¯Æ  xÚ߈GÏ @€q ¼]¤\z«¥"™Ã8-ð_¶Ûår9îÝè  @€qOÇÌ7Ʊ (žŽí7n¼ýP<h… O@ÙôtµÍ+ ¼Øí”Pã½h‰©€âiRîzB –€âi,Ií¸T@ñt¤á”a @€½øEñÿ˜mšayÐPBíå{’N @€ƒP<½41n{ýP<íÿïHsP<L¤£ @€@Öß^.?Þí®0Ù‚@Öívß²oÖïuG€$P<Í5o\cP<óoߨ»HZ<-Ë2Q0 Y @€@6ʦY ®‰€j6ïoB€´& xÚmšÝÑ ¤PÚí–Ëå?Ÿá @€²P<½47n{ p¯€âi‘‘A @€©^žNT–]•x—tÿe» ÆTïÚ%@€´. xzoÜ“ @àRÅÓÖ£$@€†!ʦï•å§û}ºÚ– è\àyU)¡ãMY/  @€‡O/ÍÛžÜ+ºx:ŸÏºª{ Ð;½\*›v^ÕÒ­ üd½žÍf½{'Ò! @€À%Ч÷&À=I€.H]<½äòn[ @€@÷ß^.?ÞíZ+Ù8ýøÑz=N»Ò @€@#ÅÓKsã¶'@€÷ (ž6ŠDìD€d(ð¢øÅvÛŸ:Žž оÀ¯öûwËR 5÷xC"@€#P<½7îI p©ÀêýUҌĢC$@€/ðvQ|PUIƒ" 0 PBýÖr9ø·6 @€Æ'4â Óp.M>Ûž Q |V&½¤Ž/B1b @`H¯Íf?[¯“†C'@` /v»0}cHïhúJ€Œ^ iÜ¥x:Äü¿> @€@ÅÓчT @€ÀH^žNT¦ýYÒÄ…Æ hGàyU)¡Žô:aØ @`€I¤°†aƒü³] @€ÀàOé2 p•@(›¾W–Ÿî÷I '@ 'Ÿ¬×³Ù쪷; @€Ò $ ÀB&ypÙo&@€ OÓÇ,Ž@€ôHàÛËå/w»¤) «À÷Ër:öèMW @€¿+4 3ó´AúÝ.®˜=š]Ù‚Ý h  xú»ñ…Ÿ @€l¾Q+›&M¦hœÀ~µß?Z­²}£40 @`àIÃ1÷ŸPUÿ\Æðˆ]ü¼ª|ƒ´/ý @€#P<í0ÍîÐ (ž&‚Õ,zÅÓ‘ÅP†K€2xm6ûézÝE‘Ä1  p¿ÀÚlÜÁ$Ãë! @€~ (žÖg½J`ˆЧCü­ésЧýyôލxy:}¯,ãö¦÷Woª@€†'ðvQlÝÞôŠ— è‘€¡ïJ£Ç @`€©‹§mf­‹ƒ€â©¿„ï %Í)„Kö ]&@€z*noú3·7M½iœd?Y¯Ýµ§WÝ"@€Y(žv’`wPIO“òjœ@@²ÜÀÿhXñ4‹ÈË  @€@÷noš4fÓ8íüz¿w#Ôî¯(z@€2X­VICšš ³—H$ xšV³HzIU<Í43, ЪÀw–ËO÷û¤A‹Æ  КÀG»Ý7‹VßFŒ@Y–Iã™óÌ6 @ º€âitR 8S é%5|ßi‰! @€©ÂíM±Ý& W4N€NžWÕ|>Oõî©] @`|ЧgæÃmF`@ЧúeéjfIá’=¾8ň  @€áö¦±Ù$ T4N€Î~¼^O§Óošš @€F/ xšYÞÞpÅSºHš.P<}Ô€\,p¸½iÒEãèÀ¯öûGVì¹øZa @à¶€âiW vÇ%N@ñ4­– Ô $M(žÞbüL€Ô |{¹üån—4>Ñ8z(ð_w»¢(jß ½H€¨P<­Oƒ{•ÀO‡ø[Óç<’æ Oë¯ @€7¾>Ÿo«*id¢qô\à?m6³ÙìÆ[£‡ @€sOóH×›Ч75<&Ц@Òìâé¹Áí @€Àˆ¾8þt½N“hœCøõ~ÿý²t#Ô_ 4HZ<Ý}²k3eíXVï¯Bý”í $Í!(ž6ŒuìF€Æ!ð¹Éä½²üt¿Ohœƒøh·ûæb1ŽKQ @€q’O««ö׎H€€â©¿] ì?K˜®T<úh…ä(ð¢øØíMWÑÑaZx^UVñÍñhL @ ‰€âiW vÇ%N@ñ4­– Ô „o ¥ûô¯xš$Ò(¸ÀWg³ÜÞ4]¦eò°ŠïÀ/zºO€Z¨R~È2ó´>ÇîU‰Bñtùt™¨qÍ P# xÚRøâ0 @€ÀdòòtÖéÍ«¬a4H.ð«ýþ[Ë¥Ë @ F@ñ´&î%ÅÓðß@;¯Û-´xºÙlj.è^"@€F%ðíåÒíM“—X€|~^Uóù|Tƒ%@€ÎP<t–^ç Ü+ xz/‹' ´ ´x.Ùç_ßmI€ä*ðõù|›r ©|K%FF€ÛOÊr:æz½0. @ ±€âi ¹t‡ в€âiËàGà( xÚ8 ±# ð @X§÷GÖé½]úð3®°ŠïƒW @€ (ž3ÞÈF@ñ4›_¥ N@ñt„¡”! @€vÞ]­¬Ó{UÄÎ8-ðWVñmçbæ( @` ЧƒËÌë0O$²DЧ t“ Iàí¢øÅv{:åïˆ#ð«øéò¨¯ @ ¡€âi¢ü¹f t(°ÙnBý´Ã84Ñ (ž& Y4M€Æ'ðÅéôgëuœ’€V @à «øŽïbkÄ @à¤ÅÓõóõhóçN CP¾ õÓ;àÐF+ xzO¨á) @ ‘À÷¬Ó{F™Ã&H!`ßF.; @€|’OËgåhóçN CP¾ ÿu؇&0Zð½…ŸÜm†Kv>ñ‡‘ @€§Â:½ïvé‚ - @€À9Vñ=}¥ò È\@ñt´~ÏX@ñ4ã_®¡õ\ |kèœÏàͶQ<Í<&3< 0™¼6›U›„ßÅj„Ø‹£°Š¯‹3§@ÒàÇÌÓž'ùu/WÅÓ\³ÆÕÅÓqFSFM€¢¼W–Ÿî÷I?¤kœü¼ªæóy”·z @€ƒh0œ¿‹âiÿóüz˜¥€âi–¿Vƒ„@Òâé~¿Dh¡“ @€À¥aÞ_l·çÖ¶%´/ð¤,§Óé¥ïð¶'@€†(4ÒP<Dª_'óؾغçi~¿V#„@Òâi¸d1ÒÐg @ Fà‹ÓéÏÖë¤Ì5N€±>Úí¾¹XÔ¼«{‰ÈC Vðpo;ЧƒHõëd~á| õÓüÆeDú/ xšGtd @ ï­VÖé½7™àIôY ¬â;›ÍÚ¹R8  Љ@ÒPDñ´ÿy~=ÌRàp^g94ƒ"ÐsÅÓN‚%@€ƒ°NoÒ\„Æ  ЂÀ÷ËrpW&@€ÎHK(žö<ɯ{¹ Îë\Gg\ú, xzføa3 0Zëô&ÍBhœm „U|ß*ŠÑ^Ñ œd,4¢P<ís†_ß28œ×ÐÐôV@ñ4ãÉÐ @€ÀõÖéMš‚Ð8:ø?7«ø^‰Ôè•@Ò b±^ô6¿­c28œ×ÐÐôV@ñ´WAŽÎ @€þ„uzÿn»Mú\ã ЕÀ¯÷ûï®Vý¹èè  p¥@Ò ¢xRô6¿­c28œ×ÐÐôV`ùt™ôÂzåEßî @€@û/O§?*ˤ‚Æ  @ »ÝVñmÿBëˆ @ ¶Àt:MZ(žö6½¯c ÌÏçuÆc44½¾¤ÖØ€ö @€´ßY.?Ý'@€^ ü ,CÆ5íÕEë @€@Jðm¨¤Ñ…âioÓû:–±À±vª¨ÓÐôSàx&º¼¦ ´M€ÄøêlöAU% 4K€}øÕ~ÿÍÅ"æEE[ @€@‹Чý̽ëk޵ß^¸†Ñ¾š OÀDä­Õb”äP @ ¡@X§÷=ëô& †4K€áüUUÍf³†×» @€Ý (ž6ËÛ‹@Ÿ޵ÅÓ>ÿšô-Wã ˜è½âiwA“# @€³–‹Å/w»D‘€f  @`pOÊò¬ë‡ @€Þ(žæš½7®1 k7Чcþ30ö®Ž'`¢OôЧ½‰¡t„Üxm6û‹Í&Q  Y®ÀG»Ý[Eqû²ág @ ¯Ч]e×—@:cíFñ4²– œ8ž€‰>×+žö5¤Ò/»@X§÷7û}¢@³ ÀÓõz:Žýziü @`‹Å"iì¡vs*»îyé޵'`:d-8%00ÈV@ñtÐùy'p¯€âé½,ž$К@ÒÏ÷Š§ÙÆdF€ÃøêlöAU%½âkœÆ ðÑn÷VQ 稧 @`,UÊO|»Ov­eªˆ£€âé‘Âl_lÓ}Ìî±Ä(ÆI€ú'ð¹Éä½Ä÷¾IEh™ú)ðt½žN§ý»èé¯@ÒâiõaÕIÖÚA Œ\@ñtä†ß¹@¸ü¥ûH®x:Þ ÍÈ  @ koÅÇ»]º«¼–  @`´¿Þïÿx¹ìúBçø @€À? (žvžc×ÑO£“jÀEЧÂ, ™À§ÓŸ­×£Mé8´#ðWU5›Í2»†¢À.å÷f7ÛÍEÙf E`ýüŸ;å³2Jƒ!@à"ã9˜èóõã }&@€Ãxwµút¿OtY×,¸%ð¤,‡{ÑÔs ‡À­«sÜn.J¶Û˜@,ã¬7KgÇ"Õ‹Âå/îõôVkyD FA€ú/ðóù¶J¸ÿ­K¼  @€ÀAào·Û·Š¢ÿJ=$@€¹ $IO/J¶Û˜@,ÅÓX’Ú!ÐL@ñ4רɸ @`</O§ï•i¿ •ôÃ¸Æ  @ ”åt:ÏÅ×H  @€@OÂõ7i ¡xÚ,ën/W (ž^ hwW ï;œè"ë&8=‰£tƒrx»(>Nyƒ›D‚f  @ ?_ï÷ß\,r½àè§@QIƒŠâIqeþÙî4Ø}²;œÚÛÛ»Û…+Âå/íåÕòMýŒ«ôІ/&œþl½Nz×8¸TàÏ7ß¡~”a 0ÅÓ+Óãv'ÐO›Ax?{¨WòP<L$¤£ @à†Àw–ËO÷û›±´Ç @ 'a ꟬V7®Z @€©OóÎÞÝhnö£E0p ¤.ž.¬Ú”*2Ò.ŒT૳ÙUu3Šö˜ôP௫j>ŸôjmØ @ -²,“†Ów¦æ®šÀhnž×£E0pÝ Ü< £?—ï¶"Ç!@€ù ¼W–¿1á4z¼¢AH&ð óOŒºH]<í6qíèÆ)0{4»žûÃ8ÿ Œºs›§aôÇŠ§]OŽM€ ¼]¿Øn£_©5H€R |´Û½U]“ …ôH@ñ´ó캈.pk½ÐðcôCh’~RV<íQ,¥+ 0L—§Ó%^ˆ)i0 q ~X–Óét˜—b½&@€ýØl6é"Ý'»sË6 @ º€âitR h °}‘pKUUý-ôŒô^`¹Xür·K÷YXË @ 5Øí¾¹XôþÚ«ƒ @`H!ûšîR^}X5È6Û…+O¯´;(á"˜ð «x:¤hK_  @ G¯Íf‘ò+Äé®þZ&@€5¾Ù˜‚Ú£€CW @`àЧQ2ä!Ð+åÓåÍpz±^ôª{:C`$Ч‘tŸ2xwµút¿¿*{L€²øõ~ÿÝÕ*Ãë·! @€Öv)—*Úl7#É&^ ¬Þ_ÝŒüýêžÎ‰Àúùúæ™÷ñ~¿o=dp@ 0`¯ÎfÛ”Ë.ŽÐk4øëªšÍf¾fë:è@ã ñ9;–ÏÊ‘dÈ “@¯O{õëÐ™Ñ „‹à9×ÊÆÛô ˆÐ 0 ÷Ê´åÆWs; @€a™…c ê0‚½$@€ž ¤¸@ÛT<mÉÀÀ»P<íÖßÑ O{úèŒIàëóù/¶ÛãGT @€Àxþv»}}>ÓeßX  @€@pñ¤ƒâ© Nn-~ì¤J`ä·¾Æý‚k!¦8ÁV @ S—§SN£‡$@€Á ü ,3½ÔH%PEÒ+þb½yæÜð t"P}XÝ<µÃtÃA Œ\ x’ö".â©âí @€ |£(~¹ÛÝ ‰=&@€£øh·{ËçÇÇ6ºO€m ¤.ž†¼ñÈ3ç†O ÅÓNØ”À-ÅÓ6CÇ"@€0á´ÚlF›7p pJà‡e!0 @€ (žÞJtû‘@Чyübè©‹§‹ÅâÁ ½  @€À¨þx±øt¿?•4ö<¹À?ìvh ê¨b#ƒ%@€FeY&ffCO}ë?! ì?û”Ñî“ÝG¡Ï†.0}'ñÅݹ¦Qðc'ÈRàµÙìƒêwn]‘ô£®Æ  @€Àpþ|³15ËpÈ  @ –@êâéÐóÞúO` wøD· ]àîÉñ™ph‡ ZàÝÕʄӈ1†¦ @ {_ï÷d-£AG?:O€)O‡ž–×÷ Ü òïÝÌ“¤¸{2F|Fñ4eˆ¤m†ÀWg³­ §à M @€À˜ž™‚:ŒxG/  @ mõz." ‡¦NJkŸ{îž×÷næIR „E³ïž±žÙl6mÇ ŽG€ú$ð^âÛÐĺdk‡ôV ,Ýð'«UŸ.ïúB€º¨R~G·ú°J”Ö>wæçwcr7 ¾ å-„KáÝó1Ö3á"Þ}$¡ @  ¯Ïç¿Ønc]RµC€F.ð×U5›Íº¸¤;&裀âi ™s‡ в@ñ¤¸ó‡'[î†Ã Oûýè YàåéԄӻѾg @€À•¦ 9>Òwˆ,°Mùe]3Ot" xÚ »ƒ¸W`³Ý\ù¶f÷Ýn9,Ðè·ÀÛEññ.á’ø5—]/ @€1„)¨¿g j¿Ã!½#@€’^ôËgå½™dO T@ñ4)¯Æ \$.…I/µ-„ A€ú &œþØN“F'@€ÿ(¦ þwAíCô£ Ð@Ò @ñô¢» ÄX½¿º{j/Ÿ.cµ¯ÎP<í.ÆqdÈGàEñKNï†øž!@€Éþv»}}>Ï'˜0 p‰@² ìÿhXñôüìº- D¸·xžŒxM p¦@êâét:½ä²o[ 000á´Ú$\?é'b @€¡ ü ,:è.¸Z (ФWðÅzqfnÙfDP<ˆ©)W Ü»ŒvÄ‹o¸”_h€ôT`¹X„•#^75E€\*ðÿ™‚ÚÓ@I· @ •@êâiÈ_™s¶; O Ù…@"ÅÓTAŒv  @ k/špzijÛö @ ¥ÀMAÍ:ô28¸) xš(U®YÝ l¶÷¬lžì¶WŽN`œЧ7  @€À9lÂiÊì·¶  @€@3SPÏ clC€¬V«f×Ê3÷š=š3UnÔº¨>¬îž¤áÉn{åèÆ)0}gz÷|ŒøLéÛ¿d†@€¿xm6û º'”xéÔ p€)¨¿ [ü?d+2®×\+Üwœyr£&й€âiç¿ pSàÁËå5(žf¥Æ'ðîjå§×Dö%@€í„)¨oÅøB#&@€±(žÞLn{L S¡r64Ã8uJFy^ñt,A›q @ kN£D!@€m „)¨Óé4ëÅà @`¤ëõ:Ý%uÿÙ~XÉm½%À©ó:›a ì>Ù:+¯~³ÙŒ4ˆ1lÈEà{«Õoöû믉Z @€Zøo»Ýš‚šKHf p¨RÞMÆ ‡•Û×ÛœN…ÊáÞ‹9 ÓX EàÞ•´O§—>.åÇ˺ @`X_Ͷ)?“^zUµ= Ð@àOMAV¦· ð€âéPïúIà|âIq*Ð /ߎ- ˆ%´xºÝnºÚ{ôQÀ„ÓSA»ç  @€ÀàLAíc°¥O ÐT`Ÿrq$3OceݵCà"ÅÓ‹¸lL ¤ÅÓð™ºi`? Ѐ §ƒK‰ë08GÀÔnB+G%@€Øç\õoS>+[ÈH;·ëÅ©Óvùtykc? Ђ@¸ ž:+£Ÿ7»ž¹—âi y‡ pW`õþêÔI^º»½gH-ºxZE[±ƒã @€æ0ŸÿÝv{*Rõ< €)¨Í&{ @€@×!ךôЬL“:¯}÷ (žÞËâI ÔÌr!^,]ÇŽO€0á4ÊE_# @`(¦ >y™ú*°Zœžå*n¼Øa¦Ú¡ ŒV`ý|}ê/–ÅÀ t(Ps'âSgëEÏ—eÙ×XC¿ @€ÀĄӋ.ë6&@€9 ˜‚*$@€Á „\kÒkñüñ¼ÃLµC­@õauêÔ/–ÅÀ t(0}gzꬌò¼âéàb0&@€ÀxL8r­×®€)¨ã üŒ”yl6›¤—ÝÓÔM`ÌЧcþí{o’^p«ªÊ#21 ÈIÀ„Ó¤W @€a ˜‚šS˜g,È[ äZÓ]d÷Ÿí{›ÁÖ1y „³ïÔ©íÄÌûWot}ؾ؞:1¯~»Ýæ± NÀ„Óë¯ïZ @€™ ˜‚:¸ˆN‡  0Nýþd…åúK³ÕAûœÃ×·¼êÏß¼Çntz+P3%¼þœ=óÕqF2FM€=0áôÌk·Í @€À8LAíaü¦K pS éz³Ýô6ƒ­cò¨?µó»Ñè­@ù,í}Æg³ÙÍK¼Ç @ NëCq¯ @€A LAýýù¼“XÅA  @€@½À|>Oz±YâÞf°uŒ@ÆóÇœÚÅ“"ãáÞ ¤.žEQÝ÷*H*`ÂiÒÏ×'@€ù „)¨Iƒ @€!Ëšôš»zÕÛ ¶ŽÈX ÔFëOmÅÓŒû†ÖgÏÍú3÷ÁW—Ëeƒ`À. @ Š€ §^©m@€Üøp»55J0¦ˆ%P–i×T és_ß2x°@³X/2¾¡è­ÀƒçæÝO‘=.ë±"í @€óL8½èzmc @஀)¨ç‡^¶$@€Ô©‹§aíÐÞf°uŒ@ÆaÒ÷Ý(ôæ3f…güÛ7´ž Ü<£?^¯×©#í @€[&œF¿ kŒSÀÔ[Q–  @ +ªª’^‹{žÁÖ=¹ (žæú›5® ’^vÃe½«ˆÂq  @`„_Íþn»MziÓ8èDà7ûýßTÕá¿¿ÜlþCYÞý¯\,¾[qÿ»{”Ã3ÇÎtbÒÚAMAaTiÈè›@Òâéî“]YnC 0DòÙ+r‡ †8.}&@õa¯-ív»¾EúC€¹ |oµ ‰åÖò¨D€¢«¢Ç2åÍêçÿ4™ ñ¿wæóã(BI÷8´Pö=[ÿ~h_v SP_ŸÏs ¢Œ‹ú/%ê8ÕHÈgå6Cx°:ãôâ¯UŸóxðô1<¸™¸= yþcÏþ%±¯ŒRìN€‡·Íðzx‡o¶7ß{=n&p¸f'±/Oí/:ñŸ«ê÷|ÈDŒ¨“ÈH (ŠA˱Më‚f“ê7Á l_]f“ë6Ã8çãÒ°F¤·²(ž¤ýæÒr¹Ì=~1>è@àÝÕ*¤.Ï 2ÏÜæX ·c;ÔCoÎ m3œÍ±³„ŽSY¥Õö§ù`3œ#&à.á«#J¥C¹`¾í.ëáú~¨«FYHÁÔâ?‡$@€ÀXʲ<'Pi¼MÈg“ë6Ã8ç´Öˆô–@6©‹§áâ>ָƸ  @ ‰@˜púÁåw8 ÓOÅ»Ca4üï!•þw(¹ßœúy¨«òØá÷’nrÐ9ClC€cµ4\/Ü¢4§+QËq¾ê!6eñpIºèK>¦ & õ4J€wROgfÙäº „À€©WóIäøÒüñ|@ƒÒU9 OÃÖëõ ¾' @€@Cï,—§&œ†üöÍòèa]wšP¢ûÄ>ÌTUQM•i“3Â[P¨¦™[: +Hô®¾au(ª>xI2µaTg78[ ºüûÃg†=‡ÍrJt  œ9¯ÍÜðýNu53‹.¦—n.îg6$@€'¾8þÇõúfyô¸¬nô”©û#Ê߇۪† A&¨^†Ùž3+·%èÏ žôM ,ÔŠª7o«zœ¦¾Ùõ/‹“AŒ @€ÀuI‹§»Ov™åº ‡ÀPO‡ò›ÒÏÑ TVgfl¶ß﯋ìM€&¯L&oM&}K¢êO'¡œzœÚ 2± ¡ì¾•¾‡c‚NÞÌs:hø EÕP|ÿŸçóωÚ @€@¤ñ[È 6+nàºX½¿:çì›uÛOG'0Z¤ÅÓpú'4I€cIȯ)›8-pœšf%góéÃ6ŒS Ìa7Ã4§Âe߯òædòÒXb4ã$@€ö’†mëçëÑfÅ œ@·ЧÝú;:ÊgeÒKð|>o/˜p$ÈHÀ„Ó¾å„ûߟã¼Tkü&î4N`Xá¦Ø¡`Ö÷Vîÿû˜f ðåÉÄÔŒRC!@€@ÇEQ$ ½BføÁì± H!pf]f³Ý¤8º6 xPàÌo84¾L‡K|ÇA†Ã @€ÀÐL8Í u܇!ÖQ +sš”Ú8³#á „ éVåíÃ[ñ8ûðÆdò…¡E_úK€ýX,Iã±åÓåƒÙc BàÌA­­_›Î8óÆÄ/Ó«ÕªŸ±‡^ @€@?L8gž9õ¨ÿÕln–úl½sÐG5v$@ çá›á4'»I¦©ßTµŽ@˜‚ê¸R ¬Ÿ‘4 ™ásȶ!@ ºÀöÅöœ³{÷É.ú¡5H€À9óÇósNÒÆÛ„Kü•A‚Ý  @`$aÂiH3ž“´ kŽ…T«û6ðìH WÇ…y¯yg°/¦ Ž$ˆ5L¤H]<=š“@¶ ÑÎÿHýÐ$@àLóÏÓ[n6›tñƒ–  @ —&“7UN ´.p,¤š‘Ú Ì³ n5Óp³ã5/mˆ(` j6ñª @ }ªª’F\gfmF€@tóOíé;ÓèG× çì?ÛŸª^ºe¸Ä·W8" HÀ„ÓˆéYM]#p(¤ºGê¥Áží ´,挻™é5ïuöíDàõÉäó Ît•z#°Ýžµ°g³x,¬zNêØ6D¸è^Š–×Žî¯Ag œyoâfWáý~ß›pCG @ w_˜LŠv¤1”@@˜Ëª3“økÞÍ‚+{§À¡f¾äPsæz‰@ŸÞšL^í] ¦C Ðw¤_È Ÿ™=¶q.*ž.Ö‹¸G×g l¶›¤â¾G!úG€ ¸ÃiŸs¼úv(‹ÿP–ÖõM.jœÀ)5Óã{‘y˜‚ÚQÔé°¤Àt:=#Ey¾|Vž™=¶qVï¯Î?‹ÃÆq®5ÎÊóOÕ[ÎçóA(:M€ÉL8Í#<¶QX×·AhÍ÷35Ïtlo³#o˜‚úJ²Kà “@QÍB©3÷R<=3yn3ÑO£“j@ ‹NÕ3/¾77 úœâc!@€+šu!m8’©aæ*ðÝ¢ÓQܸ›1Ç\)p¨™†u³s}ë0.G¯M&á¶ïþ @€ÅbqepU¿»µ@SdÚµIàõóuýéyóU+lŸCj).Zaûæi{æãÕjUx‰Æ#ðùÉ$¬VwLz@ ÓQÏ mF F@Í4ƒ7CCh ` êxb`#%@€@3²L»Z`È §H5k“B=´æóÑ­—Oô´DóÇó[çcÜÃ…¾Y„`/ÈIÀ„ÓiU» KÀtÔ¸1¤Ö²P3Ö[œÞ&·€75§ˆ×X Q uñtúÎ4Q¶Y³Ô ì>ÙÿqoÿÙ¾¾5¯ NàüSµÁ–›Í&bØ )œ@H †µé¥5K ‡a:꟭V¹Ù4œìB {ßì÷aÕkkóöð½K—ºxs2yipá @€@zªº`nZƒ2]ªYËÔ \zÂÖ·æUÒ „o/\zž¿}¸Ð§&z*ðŠ;œ*[ \,B(̰;?v²%,BÍôÙzΈ®êSŽK ça ª @à¦Àv»Mn_lÓ¥šµL€@@˜ô}é©={4«iÐK¤¸h‘íKOí°ýÍë¾Ç 00áô+㮚õfïÌç¡êô7UuQ”ec}5Ó?[­Â—šýñÛ‹»oM&¯ö8äÓ5H-°\¦ÍÖ.Ö‹DyfÍ P/РxêÛõ¤^%N ÁTñ‹²4eY¦Ž(´O€ ˜pz7óé ¾9Z×÷¢PÓÆ„éÒaÒt˜:­fÚà4· 3ÂÔpyÿ @`„!›š4Æs Åt™v-¨hp E7)®'õ*t³G³¤—cÅÓÆx†L€À¨ÂÊr!¹wfÐfœ/ ©¡8õl½wL­iœÀ™‡›™†úþùƶ$@à0õ•Q…•K€ÿ(°^¯Ï Ïšm–.ϬeêB%ôÒÓVñ´žÔ«’ \zÂ^´}UUÈU ¬)Òz×díK€À9‡¤*¤^…Ú8–@˜djaÞsÎSÛH$ð5SPs¤‹'B65V wo;IóÌ'@ F`ÿÙþÞ³²þÉš½D€@RÝ' §3ì÷û€§  @`Àa¹ÊK”$Ô,5‡Bj¸Gj¸×dý',¯h,îÀþƾ[5Š^"@ 57'“—6ê:\&Ð8„;gG³Ø’¦Ù5N ^àœ“ôî6õmz•t f‹ß=…kž™N§—…¶&@€~ „äL8m-_ê@jŽ÷H ¥®š`ÌKÎåøP0 «ò†¿«š¿:/ Е@¸Å¼ ½Àl–ökЧérìZ&P/Ðøþ‰óÇóú–½J€@"õó´ éE‘}`c€‰@˜púN è«À;óyX^Õê¾ç ms8Ì0U0íªæ¸.xc2ùÂH‚NÃ$@€ÀX‹EÒHµ|V&Ê0k–zâIÑìì;Ö·ìU „‹f³Óö̽ÂØÇï7²ëÅ…Uã.ÍòÙžNÂäÁ°æj˜HnXùßw ïÑpf@h³žüf¿–äíä¬tP±LAÍ*Â6ü®@È£&Wï¯e˜5K€@½ÀbÝð«NÛzX¯H'Ðø´=óR¾^¯7 ð O ¤ébeü´C€@ûj©g®Ynvœ^n˜Ûþßž# BàõÉäóà 'õ˜Øl6I#RSØÒ娵L ^ Ô@›ÝЧõ°^%N ñjÛgžìUU=Ø‚ú*V‡ kÄ¥Èûi“¼Ô.—ab¨¬™šzfX;”ÍÕÒðû +9wø7æÐ$7 ÿR_£Gý"@€Æ»Ä‹ÆLß™¦K2k™ÆÅÓp×Åšf½D€@RÔ‰ Æƒ  @ [W'“šKšúÓ8}8LM ·LUNMGo?”JÃn+ñš[Ú‡³I´)ðµÉ$Ü’Þ?ÈF z¬x³Áýgû¤f P#P}XÝ<Ïv¬iÖK$h|æžyŽÏçólb!@€ÀHÂZpaE¸6³ŽE€@ß¼ÅÃSUTÏ zSoîXªTÚ·ÓDt.¾çöÊHÂSÃ$@€@îEQ$'•`’&Ø5N ^ q fûb[ß²W H'P>K{/òÅb‘{tc|ÈJ ¤àL8í<ªú)p¨¨樆 VýM”àúûíö°úîaJ©xûy:èþ„ÛÓ›‚šU8n0ŒR`¹\&Š-͆ pºô²– ¨¸æì®oÙ«¤h¼àö™§|Y–£ y šÃi·°þ[2zB€ÀP ÿgªꪡü&Kž1Žp³àþ;,º{(’@Kïåo^? ôMàÍÉ$ܪÞ?®@È & ‰—O—éÒËZ&@ ^àš³ÛÝŠëm½J @ñ$ñ¢U5ܸEÏ  0—&“vë[&PÈCà0eõX] µÂ¿ÜlÕÃüj¬‡õuoÕF•GóøK6 =SPý#@€ TUÃ["žY”™?ž§K/k™+ë/a÷šÆ½D€@:ðÕ…3/²Í6Ûív Zt›ã©¶ž'u‘„©—¡Æzü/Ôïþw¬ºÞû Ùt×›Ï{›½Ûr±8ö3<ÓoGò;2Lú,ðÆdn^ï N`ŸxÍ–t¹e- P/peñÔ´ñz^¯H*°ûd׬0zæ^ƒ Wt˜ã+¼…$[Ÿs€úF€ p¾@¸yý«ã‰e”YÌf³3³¬Í6Û¾Ø&Í-kœ+o›v¯iÜK$¨>L».DQY2A€ÜBbíüDœ-  @€†"ndngï B äN›UEÏÜk³Ý$Í-kœòÙUw4vþÖØz‰@j+Ïß/Ó«ÕjŠN @`<!™öºÊ) @€@¾a j¸©½ в¼ª¶ò`n6ä~S§—µO€À)+g®…ÝOµìyR ,Ö‹/²×l€þG)zH€ñ¼2™„dÚPæMè' @€@cpk{SPÇç)X¯×פ^Ü7Ür1uzYûœ¸þž‰§Zö<©æç^d¯Ù ªª†.ºM€ÌBêì+ʦ @€c7¸·¹÷z+°Ýn¯I½>¸ïìÑ,uzYûœxð }pƒé;ÓS{žÔž¡WnÐÛàDÇ 04{sLyÂÆ4ìH€ÈO LAõú)peÞµ~÷ýgûÔ‰eí pJ Ê´5“ÇOñzž@ Û‰¿à4›õ38Ñ+ŒD ¤ËòË @€Àùá–÷ŸIìk˜ŽÀ|žxI@7L\NZÈ®;{Bݳþë 缺|º¼·qO ЂÀúyâ¥õ‹b81‹ž @ +" kµŸU³% @€@®áÆ÷_Ê*Ô5 ^`¹\žS=i¼Mù¬l!·ìÜ+°zÕøä=î¹·qO Ђ@¸ŒOÆʲ|(c @HŽ…Y®Ù?ã"@€h ðµÉäsŒlu™Y „¬iŠdì±Me—RëAà”@”²Ëf»9Õ¾ç H-eþøñ¢|÷Áf³É2¼1(ôV $ÄBZ¬A2Í. @€Ù ¼9™¼ÔÛ@VÇ 0&ªªî¦R#>ãn‰©óêÚ'P#P}áÔÂK$˜¾3xQ¾ÛÔv»SÔc¬èX ¤ÂL8Í>çi€ @€+¾ÜqÐêð 0ÙívwS©ŸIšRÖ8õ»O"œàûÏöõGñ*IÂ9ñº|·)Á´#’`W¦ÑìN€ 07&“/´¤: ܘNÓÎg …›¤ùd P/p·JÒì™ú£x•¤Q¦×œûEQÜ ÿ @ ŠÀÝÄiÄgöŸíS§‘µO€@@ôâi¸åbÍá¼D€@jêÃ*âeúnSóùa©Þ˜êó¼}#@€§À[“É+ùÄÝFB€–Ëeܤë­ÖLRk!‘îj¢ORÛ}²«9œ—H-}:ùí wYvŽ8$†&ðÒdRRãÌÅ5 @€À ¾áû~þ @€@²L;eùt™:¬}jn•E¢üXs8/ Z x’xɈªjNØ…£i¨A¤Ët’ @`äoL&_U¤n°ˆ$PU‰oöxž:¬}N Lß™F©–Þjdî¼^NN™{ž@jDçõñ4ßív‘B Í @ Cz ¨‘§à Ÿ @`X¯f˜Ò ì÷ûc¾4ŃÔ9dí P#h†Zh¶æ ^"@ µ@X=;Å%ûØfÚÈCë¬@H:YªwXyB½%@€8¼n ßÁ~ ÑqÚ˜ÍfÇLiŠÛÛÔ dí P#ÖÍNqj‡[.ÖÔK¤ˆ~/ã[oEQ´“8"ú,îõ5N  @€ Y |ð•>ÇÜúF€Þ„ìè­|iÜ7ÛMê²ö ¨Uθ'õ¡µõóuÍA½D€@jòYÚû•¯V«Þ„*:B€î^šLÞr–Ìl  @€G/›‚Úý' = @ ïe™6û²»©ÈÚ'@ F Ñô´ÐlÍA½D€@jÅz‘â{Ç6CxÐ÷Fÿ Ж@H.M @€È@àÉä m…ÓŽC€! ¬×ëc¦4Å7FL?×>zt7F¬?®W H*0¶¹Ýn‡Õè3â |~2 i¥ ’c†@€ @à®À«q£g­ @ #ÝnwÌ”¦x0{4Kš=Ö8õ)ÎëC›Îîzy¯H-îì>´œQ°c(h"ð¥É$ÜênŠÉ3 @€²xݾM>+؇̦ÓiÒÔëþ³}êÔ±ö ¨S¿Óãæ•×È{‰@ ÛÛt'xh9Ü=ó0Èð pBàs“ÉW”M  @€ŒC |c𥱧  0NÅ"íÓܱ…ä¹C¨X>]¦«­¬Þ_ÕÚK¤X?O»ð¾ÛžŽ384j½ŸÞG–,›éB€ p½À—} @€ß „¼hºÂJh¹|V¦NkŸPßLwއÂMÍ¡½D€@jp‘Mw‚‡–«ªúm¼àÿ  02º>ï¤ @€Cxc2 ß$ôB^4iÞÕÄ´Ô™sí¨³¿Ó㦖×ã{•@j¤ër‡·Žý~/R"@€ÀxÂR½á~OCÌqé3 @€Xa ßWÇóÀH  pB ]Uåв["¦ÎœkŸ@½Àî“]ÒÓ¼þè^%@ ©Àô´7.ïóùüDáid%ðÊdÒD±2NÚ!@€ 0h¯M&á»…þ @`œEQ$­ª„Æ“&5N€Àƒ©Ïñ٣ك}°éRAbµZ3F2jF%`©ÞAgötž @ …À›“ÉK£úT`°ø­@êžn_lÓ¥‹µL€Àƒ©—ô •Y³Ëü-Ø€@Rpëá¤ß‘X¯×¿ü?2wt ÷uJ‘kÒ& @€ Â÷ ý#@€ÀØ6›MÒŒkù¬Lš1Ö8õ˧ˤçxhÜ}ë^%Z õi¾ÛíÆ/ãø’¥zŽ  @€<$¾møùñ|H0RL&ûý>iae±^¤NkŸPÙLzއÆÃ¬·šx‰ÔóÇóÔ§ùl64 @ 3pÿ¦p§ & @€ÞšL^Éì#á @à„À|ž>ÝêfˆËIê´¹ö ÔTV©«*á5ð-ì?KüU¨ÅâD(ái R ,ÕîßÔBŠÉ! @€ä$ð•É$| Ñ?ä-°\¦]Ïs÷É®…Œ±C P#NÃÔÅÓÐ~M¼D€@ ›mâEøË2ïˆÈè•@¸gSNù+c!@€ Ц@øbø.¢ÈX`½^'­ªX̳…„¹C¨HzŽŸ™cnŽ9NÂÆçcŠÛí6ãpÈÐ@ø’üë*§ @€\-ðêx>E)ãØíÒNI 7[¬/ëx•¤Å“"Eån›á@I¢qêZ8ÙÇ%1¹ „;4…û4µù|Ç"@€ ±@ø^¢%|sûÔd<L&Óéôn$î3óÇóúd¯W H*°|šviîã;†oJ$ý=jœÀ9Çó1у¢(DO®€¥z3ÎÚ @€@WáÛ‰/ ÷C‚ž @à>Åb‘(¿zhvÿÙþœd¯mH'jšIOócãÖèN÷KÔ23ª«ã)™âAé¶§÷ESž#@ ÿá~Lo˜pJ€ @€@2ðMEÿ @È‚¦H®Û YÜ3ó½6#@ ‘@êbŠó=Ñ/N³¤¾íiUUÙ„@B€Àx¾d©Þd)²®f78. @€@Â÷??žFJ€@Ö! z,|¤x²¸ r¿v!@ ¢ÀöÅ6ÅÙ}o›»­),Ö‰”Øï³‹ ŽÜÂÝ—¾¢nH€ @€@[a ßðÝEÿ 0t{ËŸ,ž r¿v!@ ¢@Ä3úÁ¦ff{®).˜¾“þVæóùЃý'@`$a©Þ7ÛÊõðkÿºD€ @ +ð Æð=Fÿ 0P¢(,…\¹Á¥Y_Û W`þx~åY|Ñî¾/÷×§5 vŸì.:m/ÝxµZ 4ìÑmF%ðª²) @€Ý „ï1†o3úG€! ¤¾áiX,´AÖ×.DH½†ç­²ËêýUÄÎkŠëçë['fÜ×ëõc}&@`<á+î_ë.GÔÕwû— @€@Âwý#@€Àà6›MÜ„ê­ÖÜð´AÒÛ.â „jæ­3é¡j·ÿZ#@àRåÓeÒÓ|·Û .àÑaÆ#ðÒdî²Ôì‘. @€§Àë–ðÏç1#%‹À~¿Oš_ SÞ.MùÚž¸›mÚïHÜz©>¬âö_k\*ÐÂbݳÙ,—PÈ8ÈJàËʦ @€ôO |¿1|ËÑ? B`>O~'Ä٣٥)_Û W ¬ž}«¾™úǸý× öŸ%þrÔb1ˆPG' Àç'“7ú—#çÌ£&@€ p¯@ø®£è¿Àr™xY¿Ov ò½v!@ ®@êRéÝö§ïLãAk\*zÊy¸gzÿã=$@`<¯XªWᘠ@€ÀÂ7Ã÷ý#@€@ŸÖëõݪGÄgÜúðÒ\·í DhaõλoÅ“"ú@4H€ÀEážãwÏ͈Ïl·Û>G8úF€Àx>7™Xª÷Þoõ{’ @€@?¾áÛþ @ ·»Ý.bõnS«÷WezmL€@tpßá»çfêgœûÑ$p©@øCê3½·áŽ 0/Xªw“ ú™²Ó+ @€nÂw Ã7!ý#@€@ߦÓiê´j˜òvi²×öÄuÌÔgúÝöÍ:ûKÔfwÏ͸ÏEÑ·ØF•À—,Õ«rJ€ @`Èa ßð}Hÿ Ð+Å"í|´ýgûfÉ^{ Q ú°Š[.9§µí‹mÄ!hŠf©O·=íU\§3F%¾ þ•!爺ý†¿£ @€è@XÂ÷ÕQ}˜1Xz/ržçAor¶Í’½ö"@ ¢Àî“´«sŸz‹ˆ8M ÐL õmO«ªê}°£ƒd(`©Þþdºô„ @€@¯YÂ7Ãn†D`¨!çyªêåù³m–ìµ±¦ï$_ûÔÛE¸ßb¬Qh‡f©oy¼ßï‡é7ƒ_J’œÑ @€½xÓ¾ƒý˜¦ã28Uòˆõ¼ÒI³\·½D§a¬3úÒv–O—¢)´ðõ‰ù|žYtd8ôV ,Õ¾ŽÞ«ôŽÎ @€ Wà˽ý@¢cŒC (’—T¤yíB€@\Õû«K‹ž±¶7÷<î¯Rkš ¤^¸{µZ#n2J:Kõ†/¢ÇMËh @€ ¼n ߎ?~9›ÍÎŒ=lF€‹ÂWÍÃÎ{›ÉÑ1 @€R ¼1™|þ¢O6&@€ÀóyúTê£Yƒ¯]ˆ(P" ìv»kÒ¤îkºY³ü¶½ÄؾØ>x¶&Ý ,wDZ#@ @ +xwÒ849 Xªw(i+ý$@€ Љ@XÂ÷K9}2ú$0N“–KBãóÇóÙ]» W õ™~Nû3·?^NâþZµF À9gë5ÛEѧHG_žÀç'“ð5òNÒ/J€ @€À°¾2™„›}øG€¸‹ÅâšéƒûškÖ ­mÑÂw<[[Ø`±^Dš ¸T ¬¡ô|wÛÓ¸¡šÖŒMà•É$||Xé½%@€ @ CKøŽíc£ñhA d8“fPÝåðÒœ¶í ¤X>]&=ÓÏlÜ"Þ)~¹Ú$p©@êÛžVUÕBãd)`©Þ3NM€ @`ЯfùÉ èH d8Ϭz4Û,dh/MêÚžè©k%g¾?l¶›èCÓ — „9àgž³Í6Ûï÷5K€À€,Õ;è<•Î @€èƒÀ×,á;à…ºN G-Üðôÿgï~}9¢†Q›„„D–BBpcYzÿëæˆŒ‡YZ…®d¶$¤Y¤eV<’Ù*Ð lI –EZÉ(Ëï¹ï|ßh²»™ñîÓÝU‘g¦ÝÕõ¬»¶êTשŋŹA]Ç к@×Y:Oœa9¼=´^5'$@à\éMçÛÛöt@½=—B` Rõ!Ðä @€ ðÃdòÙA®‘! t½ái̧œÑu<]œ8¹™pXÌÚtQAç$@à,x’¡Óûݶ§Cîþ¹6Cª·€•* @€”€¾C÷¹ãhš¦ÓØéþÍþ¬X®ƒ èB`þ|Þé~ÖÉ­FïâŸØ9 œ+м기߫Gäj èE@ªÞAÅ—\  @€’¤ðíe”§Pe/<±áéjrn@ÛñZèzó&O׿¯[¯  p®Àêåê¬;÷‚ƒg³Y%µ @ #©zK L©  @€ üÏdòyGã§%@ \ˆj^ =ë#1esn8×ñ´.ó•gݹ¼Ýo[¯  p®@‚ôÕ*žò"@€ÀG>™L¤ê`dÉ% @€(R F^8]`½î|>eölvn8×ñ´.°{½ët>ô¬“ËæÝú¿¯¸LàøîxÖÍ{îÁÛíöô>‰# ¨Gà³ÉäûɤȘŒJ @€ 0Lï&“x†Ó‹§DTóÜ@èYÇÞ. çúí t=ErVË·[;g#@à2X~îÍ{ÖñÇãñ”Þˆc¨JàËÉ$g 3œâª @€(X@ ߪƞ*Kà³B ܼj. çú- Äð îßN?²x±h±‚NE€Àe ½‹Å5Ÿ%@ $xÌûÓ¦ @€èU@ ß’†™êB  årÙéäHœ|õruY8×§hQ f*»¾ÙÏ=LÙ´XA§"@à2„mO7›M}ç$@`tRõü¿ª @€—€¾£Qº`™Ï HªWp‰ @€"¤ðMQ*‚ÀpÖëõ5“§|6b°×„p}–¶âI†SîÙ¾Ž‰ýXÛª©ó p@äÐîºhšf8}!WB€@[Rõ#R) @€î¤ðmküè<.°Ýn»^¿õYZؽÞu}¿_sþã»c‹•u*®Ø¿Ù_s;?ùÙãñ8ð’Ë#@à,©zïc)Þ @€ P¶€¾gL`¤O†7¯<ÀR²kb×>K ]+oç„Ç®¬íVÙÙ¸L a¡ú|>ißÉe ðž€T½e‡†ÔŽ @€÷¤ð}oTèG… ,—o€hÃË¢Ö>E uùóyÂìç•E¬^®Z¯¸ p@B‹±Ùl ëV©:¤ê}/ŠâG @€*·ÎQ°Z× qË+g:žü¸ud„¬}„@ñ$Ó7lïÄb·.êîœ\ ™´;möû} }-u$P°À'“I¤«ª$*¢š @€øP@ ߂ǼªV³@Ä-;‹Þ.ˆÖú]4¯šNï÷VN»²vQwç$@à„Fc:ÖÜ Sw£ø|2‰DU†ü† @€U Há;ê±­‹'ð¡Àl6ke²ã‘“XDvA°ÚGt$3B`«ì::{6;7Hëx:8¾ëv¥y»íIì´Ø‘ƒÓ p®@×­Çn·B¿È5 ð_ŸM&‘xJôƒ @€ÎÂ÷¿†™~O`Èû}·»˜Y;vntÚñºHX;ÖîäiìÐÚ†3 p–@óªi÷ÿðlÓétÈ]&×F f¯L› @€ @€ÀRøÖ<¦V÷Ñ Ìf³C—íþ&vI;+6ë`ºX½\µ{ƒw}6I¿»û283sår9º®” &P¼@¤êýöŠøÀYÏc;˜ @€ D ßay 0|Õªó™ ÇÎN;ž@w ÇÚNZ»ÓpfΈ4ÚíÞàž­išá÷\!ª"UïfN  @€ @ %HáûyU£J•%0Nívûaè²Ýߨ²ð¬Ð´ƒ t*°Ómšîv[»³u âäœ%Ður8ÆÙŸrÕÊøÒ&§-…G ~r^Õ @€¸@@ ß2GÑjUÀñxìb²ãþœV”v0®îïͽ‰}Z»fq~NˆTü]·óù¼ ~–ª«@$’úƼ! @€t&ð¾c1»îò‹E×!PûžŽvÅ‹Îoù.š”Øf1Gœ"3tq›?<çz½.¿¦††-©zc#ž žö @€8]@ ßaŽ]]½›M÷ëG,[MN G;†@‚@<Ìðp†b,ïcŸÖE p¢Àñ]Ç9+v»z{fjN`Rõžèp$ @€®ÂwCa—@à_û}·»ÞNŒÄ:Œí¾ó=Ž»˜=pA€À‰ñÝq­ |*U¯‰c @€ô' …o«c\'#p¹ÀjÕ}ð³Y>ƒu9³g?/ÑÝ|JìÖš£¤žHhL𦹼㓜/ðÅdãô³ž‹v0 @€´.ðÕù:Ÿ @ ]í¶óž‹=‚v4e³ìnr³ë3Çn­iP "@àIH¦Ýé]8Úíó8HÕÛz¸Ã  @€ p±À·“É' áü‰ŽŽÇc§‘ÏÝëÝ“ÑW &°¹ÝtzËwzòØ­5 JA<)ОÌçóŽûANO€Àÿ?u.Ñû  @€t!ðÃdò™1+},‹Ng:âäVŠ=|vLxž¡ë»¾»óÇn­™VÊ"@àqȤÝÝý~wæõzÝGÿH™*ø\ª^Ç @€°€¾ ÑUu0›MçkÐæÏç‡^ý•L®g:º>¿&%óÛ¢,O Ä# Þõûý~0&B @ƒwñt´s @€ @€@‹Rø8 W¥a ÄnbÆ<oOÆ]@€@š@Â2±N›”8¹Åìiß8E ’iw}×Ïf³aw¦\Q DªÞ}·8–w* @€èNà{)|G9øvÑ£ˆ}ĺx6¯šSB¯Ž!@ G f»¾ë»>¿mOs¾*J!p¢Àêåªë»>²dŒ²›å¢ X 6͉­sºÔ;3 @€´.ð?“É—iº4Å$äì]6Ë£¯#@ A`ÔžÞMÐXÏžð=QÓfÏf]OžF–Œbº^*B`1ÖŽwë£x'$@€ @€o&“H%äE€@w]çìhêôfzzÖ‘t-ÐõGÎùc²¦k(ç'@àtý›}×÷~äÊè®;äÌêˆñuŒ²ÆòŠ @€ @€î¤ð­g ¯¦ù 9{cÛé¡WG е@žÞMÐDšÐ®­œŸÓ6·›®'OeîÍï(*±@à)x*8ž .ïg5"@€ @€¾¤ð}j,îïå ÈÙ;œ²+!)?³¯ OïÊݽÞez*‹SZ™{ËJá/&“x*¸¯Ñ´r  @€ @ Tï&“HsäE Z9{O ö:†@yeoxz7ZÞ¿š»€Ì½Õv8U¼ x¸ÔAºz @€ @€@ï?L&Ÿu1šuNƒ˜N§ KÃæÏçcöº~… ¿áé]˶x±(ìNu sï໇.pñôo<Üû8Ú @€ @€@ñ_`”ì ´,°Z­ºž<ÕmDzU@aÅoxzײ­_ö§: ¹·åΜÓÕ'ÏýÆÓ¿ÅÏU @€"ð¾õ*¯ñv»ízòts») Ò«  ˆ³ë{ç·íiaß[Õ)C –„wÝ>ÇÊ;xª_°À—¦M  @€ @€@ºÀ÷RøkPµ ÈÙ[FZ-\ °³ïzòb ç¿ÇGèZ aÏåårùï^ŸŒ^ RõƳ¾yêØe @€ @€@mÿ3™Ä½^г·ëà°ó¦Àô&c³ãLžÚöt˜_BWU¹@Ââ÷¦iŠïÈ©`UŸN&ñ”omsõ%@€ @€¡ |]Õh\e«³·òصêW+°l–™ÙL¸ ÛžVû=Wñ! ÌŸÏ»¾ýeî­²o[l¥¿˜LâùÞ¡—] @€Ô)÷Fr$/E ÈÙ;䨲k#Щ@óªézÚb8çÅb:9— ÈÜ[d÷R¥ºˆgz댫5 @€ V ñý¼‹1°sè[@ÎÞË‚½>E „9‹áLžÆ•DšâþÕT@a2÷öÝTþâ9ÞïÌœ @€ @€¡ Há;‚à‚K›L~êèx°O>»0 @€HøV ßê"%W8'goÌѤÅ`D€À‰«—«„ùÊAiŠOÄq™ «à—ËeÉý9u+WàK›œš8&@€ @€‘Ä£¿ñ°röÚg03þ¬,§ l÷ÛAÍl&\LLМîãHÒ2÷FžºmªP›À7#'?̬8 @€¬@l{»@BÎÞõïë´è«‚8]àøî˜0_9´",„?ýâHi ™{£-Šlcï¶¹þz>L¾7sJ€ @€Æ){¯€œ½iaaš@ÎTÅÐfNãz<Î1´¯¢ë!p'¹7²mŒ·ÏæÊ«ø\ªÞqûà· #@€ @€@¾@<{£€œ½BÖªˆ9ÄÎl&\R$+®ö]Å Y@æÞ1ö$]s_›7$@€ @€ED ßx<Ø‹ÀèäìrÙµèT`÷z—0S9À""Yq§°NN€Àe9Ëáeî]gµª þd2ù¶ˆÑqþóÌJ$@€ @€Á ÄCÂ^F$ gïeÑ]Ÿ"P€Àôf:ÀiÍ´KZ¼Xð¨ ʹwDÝH—ÚºÀg695qL€ @€… |7™ÄÃ^F! goyag5"p¢À²Y¦ÍT° Ûžžø=qd™{GÑt‘]|a“ÓBãƒ}ðÛ… @€ @ Yà‡É$ö"0|ý~ßõ¤†Šä°³âœ(0CÑuórÍù#eñ‰P#@ S 'sïl6~'ÍV%`“Óä»â @€ @ //«ð«ì"rxÍÔÉŸ=›e]•E€À‰ ¹1Ol%ú:,Ÿhå02Z§õz=ÂŽ›K.S rE梾F¬Ê%@€ @€ùßHá[f£Zm6›®ç,öoö™áVe p¢@<ÕÐõí?üóGââ¹F€@¦@ä¬èº9…tæTcä‘­(råR•H€ @€úø~2ùtäƒz—_ªÀñxì:8)gof´YYNX½\u}ûÿü‘¸øt1G &ótÇb±(µƒ§^cˆWÏñ$ädî]¯×{GÞHø|2‰¬D½K] @€”À“Ég ÃrExT`³Ù$ÌzXÒ•^V r–t%42×±Ýo/ô2÷‡G»KþH e¯L› @€ @€ÿ!Ùò@Üéœ'ÑÂë'?Ãîõ.!²ª.ˆÛóñû·ž¿Fúâ }„œÇ<‹Åy](G¸Hà“ÉäÛÿêA_C€ @€úøæ¢q·¸^`¹\&ÌŒH†™XVËZ€IŒ/cô):ÈÉÜÛ4Íõ=+g ð¸@ä²Éi¿Co¥ @€ @€Àˆbýéã#m%ÐÀv»M˜×˜ÞL;©:9— ,›ŒÇ'™¶Š°;óe_$Ÿ" ¹7Z’étÚAoË) ü/lrjÉ- @€8S Rø~.´@ Q`6›µ5ãðÈyl#˜RVË6·[?Ò> íOrŒ_öEò) ‘Å"¡ÅX­V‰1EÕ%ðõ™cÃ=ìR  @€ @€@×1¬ö"#°^¯3â/W 1UE p@ÎJ®„v¦Å".`ô"‹ElLÜâÍþÑSí÷ûœ>˜Rª°Éi×#hç'@€ @€¾LbˆíE kÃáðÑÈa‹¿Œ8gB@U\ 3-ÞìÅœ*R_€é#$4¯š„¦f>ŸwÝsþªb“Ó¬9%@€ @€Úˆ!v ´½t'°X,"‘4!šª.ÈÉ™Ðδ[„Vë‚ï’Ș?Ÿ·{¿ôlMÓt×ûræÚ¾´ÉiCãŸVG @€8Q ¶@á¶Ž"6øÑ˜a»¿œ=›åT•B€À¹9k¸ÚmRΩŒÏ•t<i ÉÆÇãt:í¨÷å´U ØäôÄa¯Ã @€ @€À¹¶@­*Æ’VÙˆ &ÌAì^ïÒ¢© "@à\ÃÛÎw'´3]á©s¿KŽ'&°þ=e»öÕ*­K¦ "b–טּ$@€ @€ºøÞ¨EFUz­Ôz{|¹J‹¦*ˆ³r²_v1³™pÎHh|¦ƒ HÈÙ¬y¿ß÷ÚMSø¸lrzîÓÂŽ'@€ @€— D _[ Ž;Œ2°«?:_qv|wŒgZ4UAœ%³z+a¢³‹"¶ûíY˜&@ S 'åø|>XßÍåŒC v]¹l¸çS @€ @€Àe_#fà*‡.°X,º˜nxïœÛÌ ¥*‹³"«ö{÷¬ïâÙ³0L€@¦ÀâEF7f³Ù ½?çú†'ð™S @€ @ ’Ç:^®hšæ~Ž »7‘43”ª,NÈÉ{Ù]ó’pæe³<ÝÓ‘$ $lÙ|<¯ékùlm1@‹V.{>Ö§ @€ @€ëb`.…om™ë;NæöoöÉqTÅ pº@ìé™ÐŒºˆÍíætOG ,“x|µZµØsª‚bh{¬\?Ês @€ @àžQpBÕºˆH`ÂŒFLÍ$ÇQG€Àé9;&45ÝëÚN÷t$É9Ëçw»]—=2ç.DÀ&§×Œj}– @€´.ðu!!ÕHØï÷ÝM7Ü9¶ Œ¨frUqœ.7i×í@ç—{üôo”# ä ä<2›ÍR{i ›€MN[á:! @€¸^à;[ Ž-ÆÒïõÎçó„ˆgæQ•H€À‰‹‹„v €""/艤#@ _ 6&Nhg6›M¿=7¥VàS›œÊTL€ @€,ðƒ-PUÞ…5M“i´\+?†¬D§ Änž í@Eì^ïNWu$ù‘^»ë¦æx<¯7çŠúøÜ&§_ÿ|²3 @€ @€@±jì¶ãEàqét1À®ÃŒû7ûüð© 8] nÒ®ÛbÎ/ùéß+GÈÈy$6‹¼寵 |eÞ @€@ì¹ãEàˆþ%ÌhHt™=V"ÓfÏf í@1E¬^®N·u$É9 Úv»}¤såOU |2™Øä´ŒgÕ‚ @€ªøÞ¨UEpάì~Ÿ±ÜÌB­äбâœ%73³™P;8Ÿõír0|í~›ÐÌf³3û\/PÀ&§U «U– @€ ˆ¾Ÿ®P¥kæóyBtÑDC~ÜX‰ÎÈ™hHhmrŠ8¾;žÅë`’–Í2¡5Øl6×öÃ|~ä69-lȬ: @€ P§@ìÅãEà¡@Äý¢‹‹‹ä¨©â8] †'´…¡Y;ý æH½Þºnv‡ÃÃ>•÷µ Øä´ÎµZ @€ @€@‘±#OìËãEàNàxMhŽ‹Å`úz.ärÏ&“ U; Tq @€ @àq[ ^vð'—ËŒé³ ýF‰•Nàد3a6¡ø"öoö§h;†b…xB[ʸèÒNˆÇGù+ @€ @À¨'ÅYFuÐn·KˆΞÍzŒ‘*šSo;_„žÐÚ ¡-Þ)ß7ÇèW žsHh.b[ùQõ ]쿾1sJ€ @€8M òVEö*¯2"¡\Bäp»ßö U:O ä¬ÃJhp†PÄêåêIp Я@ܧ ÍEÓ4eôk«Å'“É÷§Œ<[K€ @€¸°jA¤ˆé%DÍ#ôV:SÖ¿¯ZƒJŠðÄÈ)_9ÇèW`z3=¾;&4JÓé´ŒNc=µ°ÉéýˆÏ @€ @à\Èdå5jH%—3ŒÈd¿ÑQ¥ pŠ@NË„6g EļÌ)ìŽ!@ Gœž7›Í¨»‹µ]¼MNÏ:ž @€xO òYEV+¯‘ D4/a–as»é1.ªhNˆ™¾„Ö ª"–ÍòyÇ У@NºòãñhñéXºÊ69}o¬çG @€ @à2[ Ž%ôÞuF/¢y s³g³㢊&@àœ½ÿœá+ÚN‘w ý ä,º_­VïuÃü84›œ^6ô) @€ @à[ -ôäõä,;ݽÞõU:§ÄÙv,ãJd,?å‹ç½ ä<:r8žì˜9 G›œ>2Êó' @€ @à[ öó¹ èˆã%ÌPDL²÷¸¨ @àq9{;j eî}ü‹ç¯† Ö.—Ë zk>’ `“Ók€>K€ @€<)` Ô„O+EDú¸Ž& žÖ«!„…]'r^=l*y/sï“ß=‚@ܪ Òn·k¥ ç$í |=™<9Àq @€ @àJØõóvƒÎÖ@βÓÍífAQ×@€Àãröv4oâ’Ç¿xþJ` ‹‹Ž÷N»X,:èÓ9å…±ÉéwfN  @€ @€‰_]Æð± ˆÝ½ÍëèÇùóù@â¢.ƒÿHKYÙQ;3ðÓÊÜû__<¿'0(ÃÛŒ½ š¦Éèç)ãØäô‡Ä‘ѕϦú8 @€ PŒ@lOt{ P Ç%L7ì^ïu1|T@ÎÞNÛC™{?ú­óKCHk g³Ù{†µ]Rlr©rŠs© @€ 0.ØõÓÚÂ1ƒ¯ï|>ït¦àþä‡ZhÔõ 𡀜½÷­Vodîýð+ç7†)wkÀ{ç´ø´÷ž²MNÇ5œtµ @€ @ H[ ö#zï"j÷^¯‹#ýÝ0C£®Š÷ºhœó¡@l§øž¹  @lÔþðÎíèýñxœN§ïõÍü˜#)q¾µà” @€ 0[ æ…ž,%’Åu |ï´ëß׌‹º$Þˆ9ß»yýغ@ÌȼÇîG(¶ôf³y²Ãæ€Öb“ÓH‰S䣪*E€ @€ŒWÀ¨­G.8aÄëZŸøð„‘ø."Œ‹º$Þˆ9?¼…ý¦]+ñßûÖù‘À`ršÄX|zAÎG®øÂ&§&Ž  @€ @€¡ Øõš°ÏõŸ4q¯kwRà£g³Ìj°aaFà=œ=þ>ÚPTõËùóù{ò~$@`€³gI :V«Õõý:g8Q àŒ÷éSWN€ @€Ô ` Ôã<]¶^¯sf+"ö8Àˆ¨K"@à=9{sšÄ(Å#%ï}÷üH`°Ûý6¡e8]ôôœó=Øä4RßÔ0ÂRG @€ @ [ ¾ÛÉù1"u ñÀHy7؈¨ #@à¡@N‚Ê„fgøEÈÜûð‹ç=! ,^,rš”Åb‘Óý«¶”Omrj☠@€›€-P“cY‘ .'(;åc®ÀC9{sZÅ»R´¿{Þ²Àîõ.¡qØívÉ]ÁªŠûÜ&§cðx°* @€ @€VlšÅÚï÷‘À×»!‡C]÷rö&4‰‹¹÷þ»ç ¬^f=o6Ÿgvë)ëKó† @€ @€1 Ø5'©áÆð»{ÉîuyÜ ÈÙÛ]KøÑ3ËÜëÖ#0"¸a?z#·û˦irúU•b“ÓVžqu @€ @ w[ vÔÚn·í†û>z6S# »Trö~´ëô—2÷ºïŒE`ýûºÓÖàþä³Ù¬ëN`=çÿÄ&§c~¤¶÷© @€ @€°jw¡­ˆËÝÇè:}iîÆu*ˆEâ¶NþQ˜Ž©ü‹§úÆ"0½™æUµ@ZÂó™Å§ëëÆ§ŒC€ @€¨S ž9·êÇ¢Jÿú]DÞ®íŸr†Hd7êX¨‹'P›@Îâ©SZÇÈÜ[Ûݧ¾£˜ÞLïŽ ×f³ùW—ΓÉ×fN  @€ @€Nˆ(Š×#9ËN#Š8ê@¨‹'P›€œ½ §!som7 úŽ] gñéñxœN§ôñªúSlrúÝ ã‚:(Uk @€ @€À‡K‰ˆŠ×‡s‹ÈÛéü‹Œ(âØ¡®Ÿ@U9‘ÿ‹›”Ú>(soUwŸÊ «Åsš©Õjõaï®ÂßÄ&§ß›9%@€ @€8SÀ¨¤E·œà^¤°+ ª ê³7§m<½”X \Ï×OM  мJÙPþpøh¯ª_~>™ÄV><é7 @€ @€O ØõÃHZβӈUõ,^,NŸÔsdŽ€õûõÜ€jZ†@ZòóÊŸ~eÚ” @€ @àj[ ÞO¡F´-'æÉëÊ„ªJrLå´?Å”k+ùú©&bv¯w MÐn·»ïÚÕö曫ÇO>{é @€ @€@%ßÚõƒk‡Ã!!¦·Ýo‹‰‚ªJŽï2¶BNh +BæÞJn@Õ,F`Ù,sZ¡årYÛ´é'695qL€ @€h[àûÉä³ÚÂLÿ®oÚ²ÓÈÿYLTEÔ íÏ™S(©)Ðk¸Õ±0œý£ãq¸÷ò ÿ)úð69­ä‘WÕ$@€ @€’"êòEᱥǪ—³ì4ÖUÅ ÈÙ;ØùÖX\ü×O &°z™´EB=;Ÿ~iæ´ígJ“‡`Š#@€ @€†/ðÕcŒÅþ-mÙiÄ ‹‚ª²¦7ÓÁNº°ˆuÁeÕŽ@y9‰Ð+Y|úµyC @€ @€oêÛ5gÙi¤ª+/ªFÊH[$e&ô2™{˾Õ®HÍíæ²ûýÜO•½ø469ý6e\0ü'?]! @€ @ G ¶@ý´Øe¦ïW̲Ó"c³*E í~{n¸Þñ™±„-V·òoí$äÄ=kñéûÑ3Ž^zôÕsJ!@€ @€¸ˆ-P??3’3ÒÃs–Šðç„d•B E9{3§A/.K:ô¿óNE G m/é"ŸFÿ˜&«ƒÛúwrfÏf9MDy;ŸFÏ1Ö3ìÃ2—FbºÊ££ªO`tóçóœ¾RÚˆ•£ûš¹`om5Ÿ'™vÏôãW÷•iS @€ @€‘ĦKcß5mÙi,^%@`t›ÛÍãqxš€Ævtw™ &Ÿ~|ÒôûÍHÆ÷XzC€ @€¨\àû1oš¹ì4¢‚¢£ŒN m1ÔЦ G}=2÷ŽîFsÁB ­½ÑâÓxF1zÚ•5TŸ @€ 0FØ€)¶aã˲SÑZ³w¤S¨±^ø‘V"@`˜Ÿ¾×—þÌ&§&Ž  @€ @€#ˆÍ˜ÆõÊ\vj·ÓaÆi]ÇšWÍHg+¿ìX¿öø¿¬¿ 0L‹OïûÒ_š9ùÈhŒĺf @€ @  Ø’iD[ ¦-;Ý½Þ 3Déªx\àøîXù,äx««†ÿÇõW(`ñéÝäé׿  @€ @€ ˆ™F1:›ÍÒ&,;`xÖ%xR`Ù,ÓZ µ. sï“ßp¦@å‹O£Ï"vñˆ£s @€ @€ô([ Æ&M5MR6NËN‡›uUž³·õ ÍÌƪá'ÿ‰@€À⑳œ¶âx<Æƒê¯ÆÌi<…Øc^Ñ @€ @€ ÄVMƒ}Yv:À`©K"0(éÍTÎÞœù‹îJ‰µÃƒúR¹NˆϺkž9vpNg5ž<Œç;íœ;9 @€ @€@ï‘vl˜/ËNOŒ^:Œ@µiûî= ã{ß®@¬®ö ¬âF-¶ø4Úœx nÕxæ°÷~» @€ @€Èønx[ Zv:ꀪ‹'#°ÝoÛÈs¶|X;+ˆs¾0J!@ ]´Å§ñ@]ï“§_›9%@€ @€¨Là‡mjÙi»áMg#PžÀìÙ,¦O‰]Ä âò¾ŸjD JŸÆ&§ßV6.ÈyzS) @€ @€á ÄN_ôþXÿÿ^€e§5D\Õ‘À•ëß×]Lä9g¾ÀþÍþÊ/ƒ З@ñ‹O?L¾7sJ€ @€ P·@$%ëýeÙi_!På‘Àáí!šO‰ Ä:â}÷\*÷e/>ýl2‰g ‡ÿ¤+$@€ @€èZà›^·@Í\v*\üô†À¸æÏçÍâ9m/›Û͸¾®–{RŸ~iÚ” @€ @€ÀHPiÊzym·ÛœÐ}óª¹ûyC€À¸âþÍi(”’#ëˆÇõ tµÜ ¹ø42±tý°¢ó @€ @€ŒN Ò”E²²ä×b±È ÔG)–Þ‡=½!0.éÍôøî˜ÖV((G`Ù,Çõ=tµÜ ”´øô“Éä[3§ @€ @€þ[ R–e¾v»]N”Þ²Óû€§7F'°z¹Êi(”’) YÝè‚ Ü d¦RýºëšFޕȾ2º']0 @€ @€@²@lšó²ìô>é ¤-qÊœ:TVÄšâGþÝý‰! ¤eSoš¦£~id\‰¼+ÉÝlÅ @€ @€ŒTà»É$’˜uý²ìtÈAQ×F` ‘pÛÌ*ß^Ô+îëiFå @€ @€ Pà«3žm½µì´£0¦Ó(L`ñbQ𼡪…ÀævSØ—VuT%0®Å§ŸN&‘Ye€m—D€ @€ 0:oÚÞÕ²Óª"«*Kàb´°¼y̾ŽïŽ=|ÞF´ø4v£ˆœ*£ë„»` @€ @€Á ăú‘謕WÚ²ÓˆÉOo¦½Ç]— ÄýÛ׌žr3V/W—}C|Š!¤=årÍΧ_š6%@€ @€ Ð@<®í_ÿJ[v*äbª®ÀÅ1§–9…§¬¾¶ûíÅ_$@ wá/>ýºƒ^ñ`wta @€ @€É1î_óZ­’fC,;í=šê\)°³ïk:O¹É1ùrå·ÅÇ èQ`°‹O#kÊ·fN  @€ @€t/ð_ü:91yËN{ ¢*šÀõ™K™r%¥<"°þ}}ýwÆèK Zìxhí‘{¼Å?-—Ë{¡ŸN&±ëDòs†Š#@€ @€¨V ã¿` TËNûŠj*—Àèâù‡ƒíN5pÃÛÃè¾¢.˜‡iv<†wÊäiì4ùRªí¨«8 @€ @€@/ñ0<Òúk:I«,;}ÏôžÀÒ1 |V±žË[¼XŒñ‹êš ¸˜ÞLÓÚíÍfóxÿ3ö˜0sÚËè@¡ @€ @€˜úüñèÕƒ¿F¤+gÀn§¹Æ.°l–9Í…R†#{&Žý{ëú T.¶ø4Æ›Ífú˜ÿz»Kè¢ @€ @€èW ïò1®´½e§•oU¿í~›Öb(h ž{)àÎU…Ê2Ÿ6Móaç3v”øÆÌ) @€ @€aD¨êñ×v›4"ü^yäVõ ˆðû@¦ó\F²Àê媀/°*¨Y mñi´N‹Åâaç3fNcG‰~Ÿ'T: @€ @€‡ßM&¶úè+¢[ixËNkŽÙª{ëß×i-†‚%°{½+ã;¬ªÈ\|ºÛíÙäÔÄ1 @€ @€À âÿ^}øÚï÷9ñùÃÛCDíªXª82öo’ZŒœvI)g ÌžÍÊø«j2Ÿ®V«èvÆþÿ3ÈŽñÇ ½'@€ @€¨V ‚W_ü{öt½Î[D&åcµ¡Z/F`þ|~Ö\›ƒ ˆuÇÅ|™U„@™‹O‡Ãÿ3VÛëVq @€ @€ |õçO§Óéñx̉íDzÓ:£”jM $æU“Ób(e˜Zò’ngu©V sñéo›ÍˆzÈ.• @€ @ foþwþt³Ù¤Åç-;­6H«â% ß%=n‘Ö4)è\e³,é+­.*È\|úÏñøÓlVs—[Ý  @€ @€F$ðÿÎfçÆÌ/>Þb¥ c³ª\ž@<qq#àƒÅÄêãò¾ÛjD 6Ìöü¶iFÔ=v© @€ @€5 ü¹Û¥ó-;­-*«¾E ì^ç5i­“‚.˜=›ù W)U ămÜþ—}äçÅ¢æ.·º @€ @€ŒB ¢X—…¿.ø”e§UcU¶T˜/»àö÷‘"Ö¿¯Kýž«z2Ÿþµß¢{ì"  @€ @€jøû·ÜÀ²Óz"±jZ°Àæ6o‹ä"'Kª”Gb ¾ÓU­*Ìŧ¿¬V5w¼Õ @€ @`à¿®×ia|1öªÂ°*[°ÀñÝ1­ÝPÐð–Ͳào»ª¨D sñé?ÇãÓéÀ{È. @€ @ Nˆ\Eü*-2¿x±¨$©š È °§µN ºF`»ßü…W5õdnfýÛfSgß[­  @€ @€.‘«kæg}6"rõ„Õ”@Áû7û³î}× ÛàüW5•ÌŸÏ3Û«Ÿf³÷“] @€ @€@m7óÔ™Ðz%¡WÕ,[ 9´žÆWÖ5± nÙß|µ#P‰@󪹦)8ë³l·µõ½Õ— @€ @`àîvgŸ®9X\½’ «j/W¿¦ÍñÙdØ·ø/¿ ¨A`z3ÍÜÕúçÅbà½e—G€ @€ PÀf¹L ­G.bq5„Õ‘@ÙÉAõ´6JA­Äf¸eÿÕŽ@%ñÀ[+mÂ)'ùk¿¯§ï­¦ @€ @€øûp8%¨ÕÊ1ëßוÄU“@Ù1;ÖJ›à$E ØØºìÛ_íª8¼Íë%þ²Z ¼Ïìò @€ @€jøm“·¦`ÿf_U¼Qe ,N/rz±øJÙÛºàÛ_ÕªX6yùIþ9œNkè~«# @€ @€À`"Bqª´þâÅ¢ªx£Ê(U îå´vCA#°½u©·¿zU(kÉÓ¢x¨o°ÝfF€ @€ PƒÀmÓ¤Eöûm…ñFU&P¤@ó*¯éHk£Ô®€®‹¼÷UªNùóy»íÃãgûi6«¡®Ž @€ @€¸™§†Â¤p¬3âªÖå Lo¦Ç½ý•À@lŒ[Þ÷_Ô)ùÌÌŸ»Ý»Í.‰ @€ @ ˆM¥Eøåo¬3ÖªÖE ¬_§5 µ€}®‹lTªNxl&–“§µH?/5tÅÕ‘ @€ @`P›å2-&ycVµ.UàðöÖz(hì‘í³ÔA½Ô&ùäÌ߇àºÍ.† @€ @ x§ÓˆJ¥Åäen¬-¾ª¾ ,^,Òš ©> ¾T@m™Ïüº^ß!WA @€ @€áü¶Ù¤Åä¥m¬-²ª¾e l÷Û´ÖCAÈ?óÏñû §óìJ @€ @€ øi6‹xTZL>âlµ…Õ—@©³g³´¦CAÅDªÏRïõ"P¡Àîõ.­uЇý î« @€ @€Àpn›&-ê‹Ô*Œ+ª2R27¼Kk¦Ôµ@äù,õŽP/ $?Eü § íJ @€ @€Šøy‘·_adkŒ[…qEU&Pª@ænw]Ïè9¦€¥¶ êU§Àæ6o÷‡?w»";ä*E€ @€ 0ˆA¥Ì#¶VgPQ­ )°l–i­‡‚ h^5EÞ*E NéÍ4Kk¦6Ëåp:Ò®„ @€ @ 0_V«´HW¬P‹ØZAEµ&P¤@æ>wi-•‚ÒüPd³ RÕ dfqÿûp(¬C®: @€ @€øq:èSZœ|õrUmDQÅ ”'¼É]ZK¥ 4˜j)ï¾P#5 d&rÿm³HwÚe @€ @€”$q§´ y¬P«9œ¨îÊÈÜá.­¥RP¦@̳”w_¨šb/ã´6äŸã1,©[®. @€ @€½ ü4›EÜ)-Æñ´šÃ‰êN <ÌííÒZ*% ͹åÝjD fí~›ÖŒÜ6MïÝi@€ @€ P’ÀÛ¼èVóª©9¨îʈ,Üiáq,ó,åÝjD fäŒî7óyIsu!@€ @€èQàçE^^µXž‘´š‰êN FÚiwÙ @€ @€ ‘°7"H™ñùó¹ !… D2Õ˜ÕÊlI”U­@dø,ìöQB 65ÎlÖ$ïMe(‚ @€ 0Rˆe†ªbmš!å D2ÕÌ–DY5 ìßìË»ƒÔˆÈýžüÎÍ|>ÒÞ»Ë&@€ @€èN ¶|ÊŒÀGL,–§  PžÀámêö̆KYˆ ŸåÝDjD€@rú÷¿öûîúØÎL€ @€ 0RˆeFÅcmšÀ å ,›Ô}“3[-e S`»ß–w©ñˆ]ò£8¿®×#íûl @€ @€.’öF4LT"v¯wÜbsU D†Ï"ï&•"P¹@¬+Ïl¸þ9šÍºèf;' @€ @€Àèb›§ÌØT”%ËbåáPÕ/U`þ<»1In»7L;h—Ú¤¨XZžÙìü¹Û®ï‚  @€ @€ºˆHQf`J”[,”@©Í«&³1Q;›h—Ú¤¨HÞ7xf[÷ËjÕEgÛ9  @€ @€F$Õ'P°@¤H¹ªäVEqX½\|Ó©Éíü¹Û]Öëö) @€ @€QÄæMÇœÛý«„½"œÊˆ©í6ÎFàzÈêYö}§v*Ènç×õzý|I€ @€ p®@rÂÞ_Gt«òøžê([ yï¹ë§Õœ¡‹OËnyÔŽÀ²Yf¶fÿ?Ífçv¼O€ @€ 0pˆùdF™¢¬Ø”Jp‚b~*¹UQv¯wßzªF€@l÷Û„Vûc»xWßå @€ @€œ+6µ;:ñ$Í«Fd²,;=±=tX/à)»ýQ;ùÉ{7Ëå¹ÝoÇ @€ @€ V ¶jÊŒ]ß%ìÕ$P¶€e§™ª².°ø´ì&Hí„@ò¾Û‘¼÷Çét°½}F€ @€ pº@Äy"ÚsAäùâÄFTbz”-3S7>H G`þ|^öm¨v$ÿgtÛ4§÷ÀI€ @€ 0Xؤ)'L}WJlA%”G€@Ù‘5³UQË$/»!R;!0{6‹„'—5—}êçÅb°}~F€ @€ pŠ@lÏtYhè²OEü*¢X¢y”-¼Òç²æÈ§„€ÿ’Ên‹ÔŽ@ln7™ÍÝ߇ƒä½§ŒAC€ @€¦@~ÂÞØ|J²"jf˜ZY®°ø´ìæHíÜ ìßì¯i(Îý¬ä½Ãø¸* @€ @€À)É {c1š Å ÄlÔ¹qfÇèQ`z3-þ®TA• ä?Õ©]NéŠ;† @€ @`P¿¬VÉÁjÙ+]ª~ q›'7,Š#p¥€”54MêH 9yï?ǣ佃ø¸ @€ @€À“?ÍfÕ¹2à|ÖÇ#f%pG€@ñ–žÕ0:x±·Å§Å7M*H nóÃÛCf›óçn÷d‡Ü @€ @€ÃøkŸº÷Sl5%jG€@ñšÎŒK+‹@[Ÿß:© X¼X´Õhœxž_×ëátþ]  @€ @€À#¿m6'Æ|Ú:,¢U¢v/3Pm5ÎC S Ö£{ª !Ÿáf>¤OîO @€ @€Cøy‘ýÔ½„½Â•jˆe§‘þ4sÂKYZX½\ÕpŸª#Êòÿ«Šd/6?ÂÈ5 @€ @€þK ¢7R÷{Šå<§ªˆ¸M»qæ'ϱ):jˆY§'¸Àîõ®†»U ˜=›%ç™ÿçx”¼÷ñ‰ß @€ @€úøi6‹¸Mfà:¢RöŠO¨DÀ²ÓÌÖUYÝ È–PI“¥šòSÍÿ¹Ûõ;P: @€ @€À{±é.ÚüÑ3Ç–RBsÔ `ÙéGÛ@¿£€Å§54YêHàN î÷äfê×õú½þ¹  @€ @€úøm³Iމ?‹L¨G ?þœÜ )®*ùóy=7¯š¨Y nöüÆíf>ïk8 \ @€ @€{ˆÒ$‡†"aol&Us8NÝ Ô#iN“[ÅèT yÕÔsÿª)Ê6·Ùþµßßwѽ!@€ @€èEàÇéôïáÓ8ó‡'m¤*Å©>z,;ý° ô›± xþ§žLM ìßì“›¬HÓË @¡ @€ @€w·M“Š”@•ô’ó0¹MS\…ŸVÒ‚©&è%ÂÏ‹…¡  @€ @€@/›å2?èm·8¡HõÄS~#£D Ó›i=7²š¨\ ?yï?Çc$‡éet P @€ @€@Í?Íf™Iˆ0?,"¢O•ÇßTŸ@=‘Úôáíï=’䟯§)SSñ°Äámö&l·5SÔ @€ ЋÀŸ»]r[Â^áGU XvšÜÆ*.SàøîhñiU šÊV.ÐKú_×ë^Æ %@€ @€Ô)ðÛf“d¾+KÂÞʪ_•€e§ùm¬“,>­ªMSY½$ï½™Ï모5 @€ @ Y â0Éæ(NYÔ‘@UqËç·3J$)`ñiUmšÊH¢’ÙÈDYí÷ÉÃÅ @€ @€*øq:8Lräg÷z'æF€@=‘Î4æ•’ÛÅÈð\P=ÍššHªÿ¿[¤‹©pÀ¢Ê @€ @€Lü„½Öæˆ7¨MÀ²ÓüY<%ö"à?¸Ú7õ%°z¹Êom~^,2 Ê"@€ @€T%°Y.ó>Ëf)ÔF€@=–æ7³JìQÀâÓz75%p'°Ýo“ÛœŽÇHSÕ˜Ee  @€ @€9u‰ØKr´gs»j#@ *ËN“›YÅõ+`ñiUí›ÊxFèðöÜòü±Ý挔B€ @€¨JàÏÝ.9γ³ø’8õXvšÜÌ*nŸÖÓÄ©);Å‹E~ãóËjUÕÈEe  @€ @€] üº^çyæÏç‚lT%`Ùi~K«ÄÞ,>­ª•SYw‘\%¹ñ‰2?Íf]œŸ @€ P‰ÀÍ|žÞ‰â$ì]$P›€e§ù-­"`ñimÍúH±’ÜýµßW2xQM @€ @€@§±ÕiDZ’c;»×;Q5j°ì4¹¥UÜp,>­­¹S_!0{6‹{?¹!úm³étààä @€ @€"Æ’Õ‰8RD“DÕ¨JÀ²Óä–VqC°ø´ªOe Ü ¬^®òÛ¢Ÿ‹†0êH€ @€èH`³\æ‡t–ÍRHÚ,;Íol•8(‹OkkôÔ—ÀÀv¿Mn‹þ>"±LGc§%@€ @€”-q•ŽÙÉÄšW`µ Xvš9WÜ0,>­­éS_!ÐËÿ€l·ebÔŽ @€ Б@ÄU’Ãˇ·‡ˆ ‰¤ P›€e§É­â†)`ñimMŸú¸X¼Xä7J¿¬V œ– @€ PªÀ¯ëu~gþ|.ŒF€@m½,ºÉoß”Hà‹OkkÕ—ÀÀævsJÑâ1‘^æ§Ù¬ÔŒz @€ @€Z¸™ÏóöFÔH ,;m1îTc°ø´Â6P• Ü ìßì“[°¿öûÖNH€ @€(U b)ÉÑ›ÝëÐ XvšÜØ*nøŸVت2ˆ,ñøDrõÛfSêpF½ @€ @€- D%9n‘¢Ù³™¸ XvšÜÞ*nø±ýw…M* ½üŸøóbÑâ8© @€ @€å l–ËüÀò²YŠ˜ P¡€e§ùí­G!°z¹ª°APeB`»ß&7S6?-o@§F @€ @€@‹½lu1"±2êèe‰MrPZq.°ø´Î&Q­ „@/ņ?N§-Ž)œŠ @€ P†@ÄLò·:øpĈÄʨP —øðÓX>B ‹O+lU™ÀÀâÅ"¿Ù¹mš2F4jA€ @€hQàmv–°ˆ EtH Œ:,;Í+qDŸÖÙ0ª5;Íí&¿½úeµjqdáT @€ @€± üº^ç‡h".$DF€@–æ7¹J€Å§u6jMàN`ÿfŸßjÅcÔ¸~ @€ @€@+?/zH!Á1ª°ì4?$®ÄÑ X|Zm ©âB`þ|žßjýs<Úü´•á•“ @€ @€£øi6‹8Irpæøî8{6#@ NËN“›\ÅWÀâÓ:Iµ&p'Ð˃Fîv£Ú¸x @€ @€Àõí{È &,*H f^¢Áã>så5 X|ZsS©îB`÷z—ßþ¶Ù\?Äp @€ @€ÀHn›&? ³ÝoEèVÀ²ÓüVW‰£ð¸Qµ­¥Š¾þÓüeµéèÆe @€ @€®ˆ¨H~<9ÑDH4Œj,;Íox•8jÿoVÛZª8;e³ÌoÄbS›ùüš†Ï @€ @€F'ñü8L”¸x± #@ Z¾VÐôÒÜ)”@[ñÈAµ†Š ›ÛM[íÉé牭=~œNG7ÆqÁ @€ @€Ë"ò÷ápzð¤­##ò#F€@Í–¶Õœ:OUÇwGIjn9Õ@´û7ûüvïíö²±†O @€ @€F'ðçn—~‰˜Ø5 ÌžÍb(¿ñQ",>­¹ñTw!0ÞOÒ˜ß6›Ñt\0 @€ @à\ˆä‡‘cÆ$b>b_Ô,мjò%(CÀâÓšOu'p'ÐWö†Ÿ‹s‡Ž'@€ @€ŒH`³\öF¶dFÜ@å±ì´—ÆG¡ŠˆÇ*oFTŸÝë²Çüs<þ4›h¼ãR  @€ @€§ ÜÌçýÈ#o÷[Á.*°ì4¿íUbyñBå-‰ê¨\ 6?í%þ_ûýÓééƒG @€ @€F!ˆ{äG’e¬<ʧúBÀ²Óü¶W‰E X|ªE%@`Ùô“Fæ¶iF1äq‘ @€ @€ÓþØn{‰$/^,„¹¨\ —4ƒ½´x %е€Å§•7§ªO úJæðËjuúÐÑ @€ @€ üº^wÎýèù7·1.*ˆ'(>Ú>ø%È„_y‹ªúîöozÈ'MVl2ðQË#@€ @€œ"ð󢟙‹Xk&ÀE€ËN/˜ óHé ]%@ ¡÷²ùé?Ç£ÍOO9† @€²ÀO³YD9‰Ávô'[ ë –vÔÆ:mÍžMÒº Ðãÿ°îvCû¸6 @€ @€À“íûIê5>×"@€@_ykžYS÷,>Õº ëßûÙ˜ã·ÍæÉ1ˆ @€ @€Ã¸mš^bÈ«—+-DSÐK¤PÅ X|ª%@àN öAî¥ÅûeµæðÇU @€ @€ˆ˜F/±”æU#œE€8¼=ôÒ )”@ žSÒÌ Ó›i/Ib[›ùü‘‘ˆ? @€ @€†&ÑŒ^Bǽ‰ŽX,;í¥Vh=ñp‚v†!›eßó[¿ØäÇéthƒ ×C€ @€ø¨@Ä1þ>ô°à+â6³g3Q,„€e§ùql%Ö&`ñ©Æ–;e³ì¥üc»ýè`Ä/  @€ @€Cøs·ë%~²x±Â"@€@¬_÷Ò )”@UŸjo ¸ØÜnziÛl†6r= @€ @€÷"‚ÑKä$"6÷Ño¨Y rw÷’?°—¦O¡úˆjnmÔ‡»×ý­°½Ue4¯š^ZÅ_V«û±‰7 @€ @€~~]¯{‰Ä³Gâ6þD€@m}Ek{iJ`8±ø4]¨­ÁQ_ˆm5zi£b‘~‡EJ'@€ @€„ÀÏ‹E/±‘ÝëÝ#"@ 6ËN{iŠJàN ]¨­ÍQ_ˆÿ”㱊üòŸãÑæ§†¨ @€ @€@¿?Íf£ÈŒØaí‘h•?¨SÀ²Óü¦X‰ X|ZgÛ«ÖþK`ñ¢Ÿ,ÿÚïÍŸö;BT: @€¨Y âx8M{?>ÿ¯@ß P¡@_Ú´FOA†/`ñi…m¯*x\ 6Dî¥íúc»­yŒ¦î @€ @€@}Íœ®^®Ôø+µ Dï^³ %@à¡@<ÆP[㣾<.°Ýo¶iïo›¦ÇQ’¢  @€ @€:""‘ýxX…-G¨ü•@…–>l$½'У€íÈ+lU™ÀãÓ›éþM?™j~]¯ë¦©5 @€ ЋÀo›M/±Ùˆ½Dæñ¿ P›Àáí¡—I¡|( ;Dm-°úxR ¶Û8þìÝÍŠ,É7è¹…s y ‡¹&×Co´é]s6ÚÌâˆB[5¹«…´É] íQë‚Ôb½ÑÓtÃ4G0•ÐB‰.8 !½ˆ½ÃüÀç ‚ˆLÿ07s  âDú‡ùãæfö73ÿËçóâ¢À7?ùða•¶’“ @€ @€{H/D¾ŽóS¤×åæË›‹ý36 @`W‰Ôœ¾!@`- fØUäb "p÷p·J¡ôçÏŸ¿xÿ~o5×K€ @€øáíí*]9©7© 雲 ] d*úZ“YÖ* —@ý¿þ¸«‚ÈÅ 0Dàþ›u®?-ÜZt: @€ °7ŒÜNÿÃ*ݶéoÒ-cv%Í*%’“ Ð#! ÖØßUQìb Èk‘{ŠŽåþôíóó÷Þ½Û[ÃÍõ @€ @€Òçð‡—u^,øøü8°OÆfìG ëx/×ÑêÈL0äi?E±+%0\ Ã*ÖzMyâ§šKNA€ @€ìJ ‘Óô9LéG½ïóožM`Þ+eKûxøåÃè‚ÅŽ,-à5åû)])áïô~éÂç­ãóð°«æ›‹%@€ @€–ø—ÇÇ·:"ý>Kÿ¥ex‡Œ- ؉@^‚¼háãàLÈúœ;)Ž\&W |øÙ‡‰ÅËèÝ~¿t£Éñ  @€ @€dœöè>Љ;¦wåªÞ °µÞ›6±L³;] dÃNJ$—I€ÀU+®ñ“vÒ‚s™ @€ @€ÀréaX«§×Ӯꆲ1ýÜ=Ü­U.9/òðþ~Ê%WJ€ÀU)†&ónùÃÛÛåšNŽL€ @€l^`ÅÈ©åþ®ê€²1] ¼|÷2o?ª£ °€$vU8»XÃòZ伞c¡’§ÿ°þüù‹÷ï7ߎs @€ @€ÀéUHßBçÃBM_Ê»/Þ ï~±%ûøøõÇ…J‡%@`v uðƒ¾ŸòÙ•¸J`Å×—§ó½wï–h@9& @€ °a¼¹Y+ršžÛ÷?zUß‹ ؉@¢0kMT™=¨ä€v";) \&× ¬8 êÛçgñÓ 7f] @€˜] = éOX«S××ö;ÙžÀ~ò*䵊&ç%@`œ€Õ$öSD»R#ŸÇ•-Ó÷ú—ÇÇÙ›QH€ @€lU`ÅÈéÃ/FôºØ…=äýhÓ{Jò~Ü÷PD»F㲦ÄóoV´ùÍÃÃVt®‹ @€˜Q }å»U»3¦çÄ›ÑÆõ;Ù‹ÀVœœ²V©è¼6#`Aþ=”Ò®‘À8”+®Éÿ“flI9 @€ °=Ÿß¯¶$fúL2­l\—‹½ؼÀíW·›‰"¹;xúô´ùbÊ 0ZàîánÅ‚Qüt{­ZWD€ @€æH¿Áн‰ŒŒîo±#›HäeÅÊ© ˜.à‡~óµ $0Eàã×§—3ãŽðçÏŸ¿xÿ~®&•ã @€ @€›øáíš³º>üìÔÎû °mãºCíE€@=/ß½l»¤ruLÈû‘×*²?ýÇ››Í´ì\ @€ 0] c­Óc°VgÅý7÷{ZìN€À¶sY«€r^f0VjÛeµ«#0]`Å÷›ûüü½wï¦7¬ @€Ø€@z þð²Z`"#̧w³8Xq¿cFE€@ò~ów_¼ÛpyåÒ˜("âù7Ïk˜‰Ÿn qç @€ @€‰‰œ¦—`­ŠôèDØÅdwÛH‘hËZe”ó 0»@†Cl»ÔruLX÷§ÿ›‡‡‰Í+» @€ @€­ üËããìý¢(r:±gÉîö °âëÏe6#@à* ‡¸ùòfÅ—k$@`´Àû½_qèÔÏïï[oâI? @€ 0Z #«¯êðœqãô‡¤WdtŠ ؃@",3;E€@%VìßCî L¸ýêvÅ"ë'>ŒnaÙ‘ @€hW }+öHˆœNìP²;=<}zZ±˜rj–HXd…˜k$@`ŠÀ‡Ÿ­ÙZùáím» =)'@€ @€F¬9MOÈ”Žû °u§œ,3rd"¡{(Ç\#_«ÌüóçÏ_¼?¢e @€ @ Eô¤7`­Žˆ_œØ‹bwö ðòÝËZÅ”ó P@ÀHª=”䮑Àtß~þ‡——ï½{×bsOš  @€ @€«þñæfÅȩלMïAr{È(‹±§ @`E¼ýüÝïöP ¹F& <ÿæy­ÂêÛçgñÓ«›6&@€ @€Í ¤íŸ€µ:¬Ñ7±ãÈîv"xJ¢*k•TÎK€@1,ȹ“bÍe 0E ƒã§ÿòøØ\£O‚  @€ @€áÿöôT¬GôäDéñ0ÁdJ¯‘} ìG`ÅúN .ÿ$@`i÷?z¿ŸÂÍ• 0Z eÅŠ«¾yxÞà²% @€ Ð@ZýKw¾u|Kóî)²#½ Ü~uûVIâ{¶'`Uнò®—ÀhÄOW,~ßP»OR  @€ @€!ëFNÍ+ÝMdG{Xq]¾»dšÀžîîöVй^Æ |øÙ‡KËŸ|ø0¤Ùe @€ @  Œ”^±ŸA§è¸Þ!{Ø¡Àǯ?®XX95«¼|÷baÿø.™À8u« â§M4~%’ @€\H•¾Ðî¤>®cÄ^ìM Ñ“_g¶b9éÔ$²·Ïõ 0Z`Ýw£‹Ÿ^l~Ú€ @€T.°näôþ›ûѽ"v$@`o)1„Ø­ÀÍ—7{+ô\/£òºäKKñÓÊ›À’G€ @€zÖœfLøèþ; °7¼yÅ^P§&@`u„BöVî¹^F dµŠu_’.~ÚÓõ' @€ P­Àº‘ÓôfxÙèî ;Ø¡ÀºSHVI¸ýêv‡¥ŸK&@`œÀº«ýÿùóç/Þ¿¯¶%(a @€ @€À¹€Èé¸N{ °Š@^Ž,rD€—ï^V)‚œ”F²lÅŠoK?=o„ú† @€T+QÐi˯Õ›Œôc4Ú#Ù”XwæÈZE¥ó ðªÀǯ?–/…œ‘vîî^-LÊ|)~Zm‹X @€ @€À±Àº‘ÓtSˆœ¶Ûû$åVH¬¤L§³ P¿@†`Ý|y³JYä¤4*°îúâ§ÇMQŸ  @€ @€@…«GNÓwÑh¯‹d °Š@¢$õGs¤’Ï«GNJ€@»÷ßÜ—,¦NÎ%~Za»X’ @€ @€@'°zäÔR{íö8I9µž>=ô@ú'n¿º]«Pr^xøåÊ…ç^^¾÷îf) @€ P•Àê‘ÓôW4ÚÓ"Ù¬%°î{ÊVìbujúžó¼V¹ä¼4*W¨§èè/[ýë·ÏÏâ§U5%† @€v.vzV‹Z´7 ÿà™;Öh7‹d °–@:9_¾{é/[ü•Ý XÎb­ÂÙy ´+ ~ºóF±Ë'@€ @€DN3ÎyÅÎÕŒñNOE»Ý,RN€À*‰Œ¬Xp95• |þËgµ‹U g'%дÀû½Oé±bùfþé¡•ê @€XK`õÈ©¾Í¦û—$žÀZ7_Þ¬Û·¹b·ªS 0PÀÖ*¢—@Ó‰Ÿ,dÚLüt­¦±ó @€ @€Ô9MïDÓ½+O€À*Ï õX:,[¸ýêv•2ÊI hZàÃÏ>¬[þÛÓ“æ* @€ P^`õÈiz$îîšîW‘xVH4dÝ.Mg'@ /U_¥”vRXýíß<<”o!:# @€عÀºï9M§kFto _Å% P^àå»—V7ÒI€ÀêêåKig$° ,ý½n &~ºó»Ë'@€ @€Âi‰¯Ûà5dÛèSrÊ ¬>dÝÂÓÙ ¸VÀÛÕËÔÎH`3™½~m™3ïöâ§…›ÉNG€ @€»9ÝLŽ !°7w_¼KdÞnIG#@`ó÷ßÜï­´t½Ì"ŠÇóož×-$ÅOwÛlwá @€ PL`õÈiúÒ 1Ko†ƒ °7ÕÐ[·ûÔÙ -ðþGï÷V`º^f?-ÖPu" @€ °Š€Èé,](B€À*·_ÝŽŽ›Ø‘ dìÖ*—“ °›/oV_øâ'>¬Ò~tR @€ °m‘Ó tݸ{xùîeçÑ—O€À¼1yÏE¨k'@`Š@f¯‹Ÿn»±ìê @€ @`‡ÿüñã”þÆéû¦·Áj½SzlìK`ç‰zL/ˆ= ¤*’éc;/K]>£ÄOw؈vÉ @€ °a¬ò´ngiº+½kltG H¼cÝBÌÙ ؆Àã󣕣ÄO7Üdvi @€ °+‘ÓÑÝ#v$@ §OOÛܸ V¸{¸«¤d“ Z?ÝUSÚÅ @€ @€À&DN[ì“‘fŽ>ülå¹ó«Çz$€òödï8.c}&@àZÛ¯ng,”Æê‹÷ï7ÙzuQ @€ @`i‘Ók{BlO€@m‰qdÝïqýŠö"@€À«÷ßÜ×VÖIm ¬>²ëÏŸ?‹Ÿ.Ýšv| @€ØžÀo×í=§mõI- ~ùðjìט" ŠRa/IÚ?Ý^ Ú @€ @€À¶29£‘§t*Nß7ý mu€H-µ Ô°,ÞôÂШPàù7ϵ•xÒC€@sâ§ÛnS»: @€Ø’€Èis/L€À«y5a…1I"@`¿þøjÉãK ?ÝR;Úµ @€ @€ÀVDN‡÷uØ’šרF€ÆU P§@Þ§|óåMÍÅ ´ Є€øéV[Ö®‹ @€¶! rÚD‹D pQ :£-RE€À–Ÿ/G6 @€ÀEÕ_Ñž7¶¤%¸&­« @€ @€3 ˆœ^ìÖ°­<}zÚR€Æµ P­ÀÝÃ]+£t P³€øéŒ [‡"@€ @€³üðö6ã×홼ÿæ¾æ i#@ Õ—¿[·,uvJ äÝÊï¾x×Jñ(Ô, ~:KÃÖA @€ @€À,?ùð¡d7ã«çJ_AÍ]ÒF€@+‰bäE„¯–3¾$@€ÀFµò!êX=~šB2mÃYÚ˜B€ @€Ú9­¿E .PC¯ãÑÇ$@ f÷?z?¼˜²%zj¨ÉˆŸ¶Ûº—r @€˜. rÚÓqáO4'pûÕmÍái#@`«Ï¿yn®À”`ªH‘²zi)~:½­í @€ Т€Èiµ&F€À8¼|põÎF @`Ÿ¿þ8®à²NòñÓÛ×ÒL€ @€­ Ô9}úôtÒQàŸ-ÈÅ>C6®šò¶å›/oF—`v$@€À±€øiëÍmé'@€ @€æ¾yxX½›1£©Ó'pÜEà3F $f±z±&ì\àñùqt!fGœT?M˱¹Ö® @€ @€kDNOú%ü“ d&ûΣ6.Ÿîî6P¢º*?½¶©k{ @€ 0B@ä´’žÉ @`F?ûPCÐD 7/[XcÆâÝ¡H‘RÃ+ÝÍ?Ñô¶  @€4! rªû…í ¤S1¯²!@€@%÷ßÜo¯¤uE¬(ðþGïk¨êˆŸ6Ñä—H @€¸J@ätŧ&@`9‡_®ÿçJB6’A€@%‰t,Wè92;?½ªåkc @€ pQà{ïÞ}ûü¼zwbÆKëKÜaWK&°¨ÀíW·«n@€çßüìC e¬ù§ýq%@€ @€ DN—ë¯pdjHT¢†žCi @€@€Å{kø½Û?­°.I @€ P¹Àïßÿá奧+¯ØŸîî¶×YáŠX] ñˆbå˜ @`´Àç¿|¾ùòfõ2SØž@%ñÓ´:Óö¬¼u,y @€ @ ­×?þ<º—oÆÓ¢ß^7…+"@`u öÎXP;K <}zZ½Ø”6)PIü4mOñS½ @€ P³€Èé&;F\Çì]:ÖãøÌ+`ñÞã2Ügf?­¹m.m @€ Pƒ€ÈéŒE€@ì7¦ãh°xo?(RE`â§5´Ä¥ @€ê9ÝF @ GÀ‚½¢?^,úl@€)õÄOÓnÝs³Ýµ @€ @€@1o†tÍ-½Èé” û 0PÀ‚½KæŽO€@yoŠø`3F Ô?MëµXKÙ‰ @€ @`Ÿ•DN_¾{1çttW† (`ÁÞò1g$@ €€Å{þ ØŒ)UÅO¿÷îÝ>Ûﮚ @€H{óßžž tè]<Åóož½®kJ?†} "`ÁÞ‹¥± hWÀâ½C~lC€ÀD´ÚÒv«¡¨üöùYütÑî'@€ @€ÀÒÒL{³†f¯ÈéÄ » 0PÀ‚½5”ùÒ@€Àrïøs`3¦Ô?ýÃËËïßï°-ï’  @€ @` ´1ÿüùór}wÃ,r:¥ã¾ °`ïð’Ù–4*`ñÞá? ¶$@`Š@=ñÓ´jx{»D“Ù1  @€ @`W÷ww"§Sú ìK€@sìm4$Ù\+`ñÞæ~¡$˜@£õÄOSNþäÇ]µè], @€Ì+våµ½p mŸõ3Óân´¯@² hKÀ‚½ •äK€@…ïmëJj ´+PUüôç÷÷ó6œ @€v"ðÍÃC%]|¿|h·—@Ê hK q„JŠ>É @€@‹÷¶õ#%µZHË®@É6äiíî¤]ï2  @€ @`ï½{'rÚz¿„ô 0B s"GÒáflFàþ›û¦] 0N žøé·ÏÏiùÎÒ‚v @€ض@ÚiEVÒhÎé¸ { 0N ¯ÿ«¤ô“ ”°xï¸_ { 0N ªøé?ÞÜl»ïê @€ @`¢Àïßÿáå¥dg]ϹDNÇõEØ‹qìí)ý‰m X¼w܇½-POüôÏŸ?§<±mw @€ت@ÚŒi9VÒ7(r:º#ÂŽŒ¸ùòÆ‚½•”ÿ’A€À*™z?¢ð´ F T?ýɇ[mæ». @€-Öâ*=u¯žôÃÏ>ŒnƒÛ‘#ž>=½Zù’ûPñóa¦|üúc=e¬øéèÎ; @€ @`“?¿¿¯§ÑªãnJÿƒ} !PUÇ]=¥±” °7LÀÏ4ü¥¨] 0Z ­¿z Ûo6ÙÞwQ @€ p­@Zˆõ4WENGw;Ø‘qïôÞ‚½õü H ë dþ¸²Ô^-PUüô_¿÷îݵmjÛ @€ @€ÀfÒ*ü·§ŠVª9Ýá`GF <ÿæyÝP…³ @ *LÆ]¢Ú‘㪊Ÿ~ûü,~º™NB€ @€«þñæ&­Âz:ëDNÇõ3Ø‹)ì­çW@J¨G Sò§­ö%@€Àªâ§xyùâýû«Ú×6&@€ @€ÖÒüóçÏ•ôÑeÁL}t#ºìB€ÀD”<•ƒ’A€ª2%bkwŒ¸ýê¶ž—)¤½üÃÛÛÖþÒO€ @€îïîDNG´åíB€À–Þ}ñîå»—ª¢C€z,Þ»¥Ÿ<×B !Ú^Fÿ“¶²mF€ @€í ¤õWO¿œ9§ õcH* Üs_Oa(%¨P SÀ6Vò»š¨-~úóûûv›ÿRN€ @€¾yx¨§kNä´‰¾ ‰$°I»‡»z C)!@€@™žŸIú›üpQT.P[ü4íè‹mm @€ @€@sß{÷Nä´ò.É#@ Œ@bõ¼N«Îˆ‰T @ È$ý2%³³ @àD ¶øé·ÏÏiS7× Á @€ ð–@ZyiëÕÓ øü›ç›/oNZÇþI€2Ïõ”‡RB€Ê2U¿Láì,8Hü4-Çz É´©ÿñææ­F·ï  @€ @ !/Þ¿ÿÃËK=Mδ-wÒ-àŸøð³ŠÞû\OÉ,%xK SõÕÜŠýH9')ªŠŸþùóç´¯ê T @€8HË.í»·zÃÊ/rzÒàŸ”Èœw ö–/ù‘Ö2a¿dYí\8HüôéÓS=iÚ×?ùðá¼éí(&ðÃÛÛ“ÿ²æÞÉ7ÅãD @€@siÓÕÓÆLJÒófæÂq?€Ï¨ªç­ªòYb Ð/iû…Kl§#@€À±ÀÃ/ú‹©Â?m®{D‚ hK ‘Ðû»»ŸßßóððoOO_F–ùr*Lžƒ{u[ùAj  @€ÀŒ©n?öŸ.­ÝãÆ¯Ï(,ðñëýÅ”¿ @€À[™¶ï…õ…¶œŽûoêjᦾk¿ŸÌuúçÓ?ü—¿>w=ö‡í½AuƇºV Ùïó¡‹RòjþyÈÉùp¼¥•«¯¥¶ýEnÒh²_'-¹€^b²ÿòø˜S'Ï §^¼S6¸(pR´æwÿP®¦,=.ióù¸hU%¸hkƒå޳b>çÛdà|s¨œTeU –»)Ž|Q़=.`»Ÿõ.c2íq1›úÆ[}_«|o¶ÂIÃß? (,ðþGïW)ýœ”›ÈäýÂE·Ó @àD`«/¯Ï|¨®÷¾‹R鉺Ø[bƒá]ÇQ×{Ÿœ–ÿ檙$ꔣuGîÎ2Ìôg¦÷râ”Ò¹òswœLPMiÜÅî.âßŘ’gRÎôÏAr(U‚y-ÐEšºLÛTI‰7Wš|{\%P•}›ìx.0{Uö¿ýéOsåüéÇÉ<‘Ó“&¿ P^ /\ž^ 9v.)üå pg$@€À±@FÄíäö‡ùPé10ê¼#Å7¯ ¤k´x?WOþµ5Ÿ®ç¿ð<ÂÿÕÔúroéNO\2¡YÂL×fÎÛ§î2óÞî”ë=HîíÂý)]G䥉»taýäFU‚ó[ã›W3úSä®5FE¾}õÖø²_à¸*;c|b!¼ÐîiÕ¦m{ÜÔõ™å,Ø»P!ï°ìP@Õ®ü¯˜3 p"‚h‡ãâÒñ•i‰;Ìßßå²·¿w1UJ’º)T:ü÷–3¯7ý_Mwv99±3CŽïì¶?'ö´îX”ž–¦˜Ô¶óÞ¸«;Ž–ÖYÞvùÖÔþq÷wÃ{Õ\Øö”ÃÓÿ”ö¬wc4óý“ò·_ÝN/Ð:TðÊ—äÎH€w_¼Ûaüôø—(©ô>éÆßpWRÏ¥¥—©›UgïèqF=ùÜÍãK µçêüi].mh’éI^íùg—cÙFF=¿ŠP™à¹ÖL½žŒ×ó§.O&Ô›çîüŠ|³m.ÄßVŽí2s&q¸íÌÙsu‡€isUÙž¢øª?å­XiÏž´pý“…R½|7ÛþWƒ6&@€ÀV/\˜;ÎRÍ{øåÃVKÚáו>‡LéÒeÚÓ?³™?µÛAzžŸÍãÛL¶<¹t‡¦3¼Ånüó\zñ›¿‰²‰¢žäÿ™‘H‘²X÷ÞIcTŻÃÓœb'…Ï*+H_,GlÐUeó ŠþÏnÙâè”Yúâ.iÞ·m}C€òéá¿XdÙ€®ȤþòEº3 @à\@eï¸ïÆð›ŽÚh‡Ò«É>téßè}îæL‰@½šú2ÁýÄž6–9^Nzþ-ÐP^=$µ‹@m5Ö£" u¸ãMÈ}ìÈX4µ¸YžGÅiÓõ<ñ]ÖÝÆè”Yž)“Î[ô¾!@`»‡»YŠ5!@€Lê·ÆÈ*?mNJ€À¹À‡Ÿ}8)£ü3]OðŸ÷Þ4ôMb¦û™¾wx`»y|¢ÿ eÔ$5á§L~ßvgþ!‹^üÐuû‹UUž‡»6Îź™ ¶ª<[¾•¼Cài3¹qà…ˆ¢¾•%Zù~·Y·?‡§ÝzÞ˜õ Ê ¤Wÿó_¶<«¿4öW,-`¥‘ò?mÎH€À[2§â÷j±ŸþRQÔVz™’Î}ÆLϳ®.Óú3m:E‹ÙUøé<£ö|“€²uSkËÆ ØäX¥kmÙò­ô< X™ö­LRç÷]I»Û•(ùöüCÚªïôþ­Æ¬ï  PXàñy§K—Ͼ!@€ÀBFÍþis:zÒ?í)íÓ‰‘E5ëìf‘ª®4݃=wpŸÊJÔ¢ÿµ= ÝTÓ}fÈk¯:Áe¸† œ» 'ÿ$÷ HÕ3_MCjk}qr¿ü3]•àU4_®. Üßÿfé6‘Óž†¼? PXàã×ûK-%@€éÆÎþus:ú²ðÈóo„ŸúJwË¢®Þ¹t’}¤}ùõü-K¦'ÙKQO2Où&%Äÿ?råÿ—ËçÕõóû{kJ÷gV+T¬•?OÎÛeWÓùû³kþªD=É9«ÿ3Ë,X½¿?ߦ}ê¥Wý­x%@ ¤@Ærô—ZþJ€s ¤X²„w.ô ¤eúôéi®"nÃÇ1¡oݾ¦ÄÓ¥¯ôÚG,‘;óøÊg]¨k3ê[Û›6U&÷šËÿVìÿ>á+T”É¢Çg‘]û³eÏ_»ÙÓ<öô¹˜€pOæ<þS^w%rzÞ~Oìæþ›ûóï}C€ÀÒ)‘2þ¸˜ò™PçYú§Íñ ¸V ­ÔE˽ͼ½ŸÞb=-;?‘>ÒYžù¶Øsd…ÞYrìÉA2j"¯‹Õá¿D6ÎÏ™ P'ùíÚZ¡b‰œùê1»ÖÌèk³èùöÖ¦x5ƒ-÷e†±e,Ðùð͹@Ú¤×6c÷°ýám;ú÷p»]cmúÊÎËjß @`i»‡»Ú~¤‡ x‰ÃU%¿ùPËu1uGÖ¥U†¸qò­yR eÝÀê˜Çm–ˆI¦Ÿ»2W–cÇåÞ½ºŠ(ÿ\Yôø8–@ïÉx£ÿÔ­Mqììó¼ùÁ²úUùóÃÏ>ì¼=þêå‡%ïÿ:HRzUÉ—Èwxú| @€b©üXŠd¡Ÿ6‡%@`´€šáµ¿æ›ÌÛËÔÍøükóáµÛ'ßZËwƬÌ^{l?Z s¦„PGgà„ö,>:ï Ù±›éï•Ó£³èñŽbOC²ÜÄmŒK9Îrs}V•½6[¦Ìü‚W›ð¯6ÏÅO_µò%Ùn¾¼9ºpmÉf{˜"— Î^°; & šR¾íp_  MïnÒGZøÁÑ_:1ÓvA¨0¾qN× d–ßoo'ÞÄ]ínMéÂÏŽWNOy¾òtÿËãcá[¶óÓ\¡:%Ófß®*k<ÕµRbiNlÃnr÷,Òû*&±MÞnU¡Àóož_}}I€e²Hf…¿’D€ÀÎÒzUK÷+Ð-Ù7±ãe‡»gõH}¤ã²Ü,{ ý_ûÐ ›Î’ñf9ˆRwHî5j–Ì6î &¢É¢‡mRºšË?.§Íµ—µ)¹ñª‰;§65×]ØÕqÒêÌÜ®·¾_½üþ×,ŠŸ¾ŠæK3 ¼5zaWE´‹%@€Àê†ØÍøÓæPÌ%uÅÅOGÿ@¤ß)‹"¦ðª^—n¢þøÑøüÑ9mÞÍãò fR‰ÞÑy3Þ,Gëzû‡ÜÁ]m£Œ%wÍuQûŸ>«OÌ•Óf9޵)ú³ëá¯Âýó[Vcó6«óö{LŸ/O½Oü”Þ¹žoÌ"pûÕíÄòÍî 0‹ÀËw/*<³ü´9ó ¤hêï:K¸íƒ˜Ðwè\:ù`õÈjs¾ ÔI^=üSØ´ÚL{HXroÆc¸’LÛeWkJòF=LD=ª‡¦ìÕ“?ÏS’ª¬µ|yõøƒbö<·\ûMZšó¶^·q´´Á‡aΖº·qß]EUy¬28áÚ2Íö °@•Uõ3!18X«dzÉoUÉ㾦,Ç—Ù7ÓUaQ¡Ìž>äÛôzÑü6ïÁ» S» ¡fôüèÌKêhK˜ˆš2V•`‰¬µÄ1»ìzøYÜù ¡Ï’ÇÒÆ<´7}8dãá‘ÓîFdûÃî> 0‹@&ÅÏRÐ9Ì%àå§³üÀ9K|øÙ‡¹Êº=gçÑ(Ëñµ˜ù­Ú—°©8T‹Y7iîæ÷¥äÙI'¿z›Î¨{›Ù—ìšñ9©5z×v›ì× ºª¬|;KþOër‰FkëÇÌ+½ÆMv3‡·õ[/ýU ¤~–‚ÎA @`Fo{¯ê·Rb8¸{¸×”›±œÜÌ¡ö¶šñùȺɴû Bu±6ó¡6o»KØüòéVAßF^MD&‹No¾¤•]·‘]³î"þ™Ñoй²®Ž¯“VöáŸyÁâ”æ¶øéAÒS2†a®âÎq @`^o+˜òg_–=vÞ¢r3GÛüz}ÝøüLRØÌ-s!™ƒ¹ùÎÒ̇JØÔ¼’íåöíåÞ.¯Z}{y51šDj¶7cÚHªíåÕ.⟲h{Ùµ»"SMgÏ´/ß½¤E¹t£µÅãϲГåìZ¼õÒ\•@^ušbjö¢Ï  @`.ï}¨êwSb8HeòÚ—°ÌUÜÇ|è&÷µXØ ?í$‹.3y5ÿóêacê†Qnè¼²¨lZ‘eš«m%2óRgùß¶¤–@%3c˜÷¡v48Èkn¾¼©ä·C2 ðªÀì­¼ãbp矛[¯¯ëhÒŸ¿Û|Ûô‹Ï,#¹Û|Û]xæÈ׿>j7ßëövžWsùÝ «ú#SIaÂOj{α)¯ÚZ¡"™ÖДEs¬×q¾Ú Î—K´©½Uö-mßèðŽªEœó dVWO‘îO¨A /U™·ès´cLŒÊ,Κ{õÅLï—ÏÝܨV¦NëÛ—cº‰¨)Ó“jø fz||>¨3ŠÚåX‹öß)Ÿ+¢v1SoŽ^:£ZHöÕ–û¢«9‰Ÿ¾jîK=ÞNµôoã @`^¯zïùQó'*H[8M³yK?G;袨õ àÏÚ¼f”œÜ#ÿ<¨<èŸGÉ ¾ãûåó±@ 1©®3_.=¾/>¿%Э’šßåÃý¢üoÝß tQÔ”o+æÕ黪¬˜éñ ZèsÚ‰^Jõj³=‘Ó¥#5Þ0ûª¼/ ¼*pÿÍýBÅ Ã @€Àr^Uðêš/ ¨J Ë›,Ýô[®˜mîÈéçIà²|7i&de53ùÍe˜Üýë™Ê—”x!ïŠù¡¹Sw…m± Ü…Ÿ’E­tÚ\V©'Á™ò™_êb™¶‹ò›gZOh%%]éZ~e•ø”ÔOZ±j=i!¦XU»µ’Ä„åå»—÷Wü´’;.• dŒGçÑ) @`vT¨2 ­ò_É#@€@JªÇçÇÙË@ìHÏOz,HMïÓÃøÓ“Ÿ#çø9‹^¦žáOÖe¢ôÅdƒ~dàÄ43ayö’6™3¡®Üì§þ[à¯× ,WCHd6Ï‚(ÿµwÄöo tUÙdª%‚þ©Êvu€Œý3.å­[°Ü÷y•§¾¬W{ ¿W1ôW“áK:”TÖR[î·À‘  °´€ªŽtZ°ÔÉÒ¿=Ç?ô”vóR¯šší»þ¥.Zª‹©‡ÚŸF $—vA¨ôg–Î[âCúϹÄýGß,;¾*•Nø”“éêO™9<'welB¥Ù7G-}•×— Œ®!dÀ@²n—o¤Zèî8ìAà8£füÞUelê]1›2VUö@ºâ¯ z«ýž n…Ã4&Ÿ¾u/|O xúô´biéÔ 0]@ÍÓo:­d±ñÂíÁéeìæÏ·þÛüµ»ÀjºÙ|3®0™NþijÒe*,UíMßjºÿW‹Ù­^²ëÚŒÀ«ù6_næ]È6òË.¯¶r+Óôò©·Zî~ö¡ð}Ì\ óߺ¾'ô·~*Ž–ðª?ë´"póåW .ñCà˜6,NÑ«&ôe‚I·¬t¦—fßD¯6ŒãÒ @€õ ˜äØÓ`/¿FSVNîI? ‘õ—«RH€C¼üÔÏ: d€kkC 7Û @ࢀØèE" @€Vªëi­—o'VÛ“"@À«NWü½pj,!àå§~Ü hK üÂDK”½ŽI€ @€¯ d©Þ´ûÚj¨Kí*ƒŠÝŽb÷׉ÚðªÓWËs_ @ i/?m÷wYÊ ìS KŽ{jÓ¿;O€ @€W²Hš—L½ÕÒOä´ðël²ßº¾'p,P~íWËO_ @€ÀìY’ý¸À÷™• ¤ÍhPßì¿H€ @€ÒÊK[¯òÖèZÉ»ùò¦|äT {­Ûí¼ Ü=Ü­Xl:5,*dj§ ý(K*€¡}‹þ488 @€Š x«fOK¿üúKé*9í¹#þD Ȩk£û™p"¬"Ñ}~õ М@Þ½¢šºÊ¯†“ @€ @`´é2u«¹Öh±—œfŠ«IÅ+Ǥð|ðYŠ\!@€kŒñk÷ÇZÊ ìY I•Õk |Û @€ @ ´æÌpìiÑgÀpáÛ$rÚs;ü‰À±ÀÃ/ ?žNG€k éwü è3­d°ßãóãZ%§ó @€ @€À„Ìpìiw—œæŽô¤ÇŸ8”Ÿïúûì’§ŸÝ @€¦ÒjKÛm`+oŸ›•_T,{Ÿ9ÍUè:ëš.„%žÆ i6âwÓ.–8,E+~:œ7ÓçqWúÙ‹Î^~÷×=»Hh£7ÿïÿÓÿü¿OüïÝßýkõáŸþ3‡MVDõœÝ7 @`«í÷7o—yúôTøîgÒþTù+Cg]áçÔé @ µ¦Ã¢Ö8h*~:üF¤±y¢WC¹* ^øü§¿%,õø‹Ï‡9z‡Y{݇÷ÿð]˜éøûÃÆ‰:e÷Ķ^=¸/ Œ袥w?ø6ÙobœtøîÉäÉÛyò\ŒN¹ DàbÑšŒaÇåj—ýºÒ5™0I…ºý™¤ßåà /9ɢɴ=U‚.ß*? ß5§!`¸~öüŒ6³€û8ÈíEŸ] @`3Â4'¿ŒþI °À[±?†ßˆXm¦Lv!›Ho|×)šîÐDE‡•†l™vÿÝ⨛As!ź ~rÑü¶ô6‰$páÅ2@»'Ê’Cî=ç€]ÑjŠt»9¤Â”ŸdÚÙ‡©ªòm…wÏIJG“öl{6ïë)¼Œ’Þ¿þ;â¯Nòî¹wí Ð XGåä÷Ñ? ¸ÿæ¾§ ÒÞ~#R­Mc°ÓŸ,-ÐEKš=T:$tÕuø'¦`jêÒ7ºÝã'4™®õdÑÙ»î‡dÑÛäñÉKû¶›ÍfOy7±4³ó OŽîr¬Xêì7t<Ž––/o»ùªÝÔ~U‚=ä·:¯ñå»—´Î†7åv¸eùÖkúýÜ”æ4—Y71éYý¼Ý<ÓªbO¯fÑ‹_v=ÿ梮ž£ $ ™6Óç3ö#7ýbÆXwƒ.¸ŸÔ&Ídœ¢N.Ç&4YŽíž—Dÿ3–Fô¿Îì´™T¥-vUÛm‡ï˜+Wgï0›¹ä‰^u:Wùã8Ø’€E<&þ¼ÚÀ@Œ5½ªè?Ûm–i᡼WÝM7*ÎÆt9&¹ný賋@5šñF$» ?Î*Õî˜<¬ÛD~hb—LÙ«m ÿð!CäÌ&²Ù\‰ì†¦´›c“·»*(ê\YÂq:´¿ÒȽªÕ¶ÃËGdô$ì0›¹ä‰·_Ý*Ø  @€À¹@ª»ÖW™ø#kwƽß$­çEÛÃAÎÚD祜o\+ÐzÌô¼ÿ_—éµy •í“Wšuž3‡“˜EÄ­Üéìèýå_ 9<³]µe7Ó_@ªçŽ7ý§ ÄLÏó³LÛtž¬*ñÞ§yh‡ö|H‹¾ð]3¸çvøWn¾¼1¿pIåthH z¼úóáKf9íÊo*¹ê$Öœ·97TüJjUÛ‹™¾ÕejÍɪ2Þ¸Ä$Õô¨óÌ9äÃÆå–öêý›‰™žgW™³†l6W63=Ï´]U•`®l³·ãå{±•š–iùÈi–cº˜0 p"`þÞ~Â\/®ðòÓ“ŸNÿ$0—À”Èi÷ ‹Ÿ^{/¼õÚŸÛ7½zäywèoò†Á§_ýÑ­oN ½ÜY,4aš!wyÃÛ$p,7‘{» Tb4Î'—& ÕDÎ|+‘yÕr~7å?É®Ý?U ÞʾK@÷ÑÅöi"§åÃ1"§ï‹ œ è>z«¨÷= d÷óß 0E`®FSZ^YHdJJö¶o 4ë®—ð>¿*àËûH;NƒK$ά“W³Gm_fâ^²ëñíó9QªŒ|¨íNIO'°Ï ÔñS™ò§¶‰'¢[zbçãRÌžn"¯®žÈ´°t]lYÏÕ 0üvç¾dÌöńـ 9þ Ù’ö,ê–èÌÉϨ˜"0o£IƒèÚ{‘­üpß=ÿˆ4tíæîwïwŸÍ:©9'Ê¿ÃzÏsé[ßtþBTõäáD o¿ÿë·î×Þ¾ÏÆ° %×sƒ¤äX@{þHšÚœC|>° Òéô…§ŽÍ‡|ÖQ0侨†À¹@ù§uÈm¨V •áó_ß 0B`ÞÈiWhh]{#rÊ¿h¦Ú^Â"ÐM5=ï'ôM'`_m‰ Ôðg³ QeúXm7q?éIüúã»ó¹{=962fú×ó8FÕ“W»?ɱõd×JR’•-¯m‹ípûò±íf3—<‹À]v•×’A€Ë $Ð0ËσعÀB1»ÄO-”tmÖº{¸‹ÛrŦ#×/ ôbéñæñ­ž¥“c6„:ΖÃ?›F]>w+ô¿G;ß2Óú¡ZR>Ÿþÿg”]¯zM^-§Ötâ´¤Òžº¶ ¶Ãí³þgáV§Èé³™KžK`¡.»š oi!@€E¼e~®ßbÇÙ­ÀÒÕ0éµY+Kø>}zZ¤Ätк¼tïª>Ò“„2¯pïæî¥³úä^øçµY663Í ß¾ž.A@+ô^›9»í»a*ÊØ’O¹üãòj·Wžô–¼_ÎU‰@ÚP™Ÿumãk‡Û—sbúÜšæ4—<‹Àǯ?VRÆJ´(à]ó³ü;È>–ŽœvEŠøéˆÜ•ŦZ,¥yœ€>Ò)}¤Çûz÷Ù¸xí^‰¡dÉSaÓã¼7ý³•¨¯Í‡·79zzæ<ÁDÔ¹nôfÝ sùYnʇ0Z}ztVlqÇÄF´¹v¸Kùffúvèì’ Ì"©ô-ÈÒL€õd±cØfùQv½ ”À–'Ô‡qY+n/ß½ÔSØJÉì"PS:E{ö5ådö¼z8`2m&ùöàûÓDôö›0uÈo?(c'æÆ·v7ubÎ|u÷®t5(å­\7úûn-ßð¾ÊîËmd=XíÍíÍ2c§óÕãóãÀ´ÙŒ”l…—×>~x}&@€Í¤¶|òãŸô ”Y«Gä´ÿ.\ükF†”oánæ§¡æ É™¿3º'ÐŽCº TfñÔœJ›Wï Éusm“ÞþÌí•{G? )cEùçÊ=Ç1ut=Þ1ÙÕ‚Ò=Ùl®?Ù |3Þf>g¥±ô•Ù J‰c®rß­C5äÙ†À‰@žÙôu¯òÌ:)lOÀJ '¿³þI G Lä4åÌíW·=Éð§YªÅ€Ãmül%’äÔ›«'Ðq. BMvtì_Ìf m ÷ŽÈ½™·›º#ûª€‰¨#2jvI• ÙU•àÕLµÜ—·–ï¸[á^iillN®…15xಃÀZ£*,í%‰fð’‹Ã¬zÒÆœå‰»xCL{îµJƒ÷éÓÓEsT+ÐÍÚK(d¹þ@Gîˆ|¦¡YµïÚDØ´'S•ü“Ü{1ë&•¹ºâP%³åù¹LD½˜Q» ,(}žy £V00¯Ö¼Y i]Û¤Úçö \®>Í‚TûÌ{®z´@™wlÕ\ÈK,!`äáèŸf;îD ØKDN—ÈQªÐKüp,zÌn^‰iP…;E{N— T‚‹ÞômÜ|¨ž\´ÖŸ™’{ÏŸ¯˜X¡w­<ùêyMD=Ï¥‡o’]-Úÿj¶YëK/I?dΆ>$ gØüð–f±æÿÅ,”wóåÍð”Û’Àn²òØÅÊ @`„€úØnk.|ˆ@±¦S^=3$=¶!PÃÈá…ów1Õt­ŽÐ!çÕYúÖ#iúÞü³î6ro—{ MY79{—Ws§Þ*pöó}—]ÍŒ’mVÙ¦[#ÝòM<’™A™ÖЈ6Ô>wÉä‚t‘ÕsgsûÌÞgVtÕÊõÚÕS2H ”Pþ£lË] dœg™¦“/¯ÒäLxºd¹ê\ÃÒAšwi™jºJççµ'õâ³ãŒmÉkóϺÛw“ûö–24eݼwíÙ»õQQQïýqÑ·ôgEëµfÝí-=½ô1ñøè^ÕÌÌJPÁ—Ø]ÝU7ÑÆ{HWOž‘%=Ç$@€±›½U0\ïEbu0OßÅ{1×YË¥L4üP´úÐ/žakñ­Ûç9îì^|fÉq9§’½²bm‚‰ý¥Ó6þjhJ%Ynt2ºˆÿN²kº,~ž¹·£¹ì¸¢@7u?yµ‰ßˆ´z¼¡éªVdÍo{Éûj¯ºØ@žŽ&Êd‰$@€Ö¼c?µ WzQ XäT;è⽘wƒÜÙ§OO­×­§?}küÛô³­ØËçÔ³ìm5TËHÎ’m*9ȶ×G54¥’l6W2²8C–hØê©¦šÎ•Oj8Nòj‚àûœã_UýϬuÆ Ô R•ýßþ?ýñÏÝÍRlÇ´nôç\Õ„,6jz®t=KݬRÝ¡©mp­Àñl¾b+L&o§GÔ|¨ko–í{9¹›šz\ö—±Ù2»teìò¼' þD`„@~Ù»ˆj2áI ád²jªÇ»C•‚T¾Án—kŽ«²É{ÇY1ŸOŠÙnüÉa›UÙdìbu’“Ä_ûÏ´Yn¾¼Y¥ÅÔôI‹5ü¯½¡#¶O?m:7Jüµ­Ïñ˜Û…jP»ö§Üö- ¤Væ1LK­EŸ¦¹¡u`Ò)ôê˜ùk;¦lO`un²É!ü4K±Üu¢âS«_£ @€u ¤Fzõ,ÕIke‡m´é—ÜP+o`.J—ÝtG Є@† 4úžâ³Í @ E¼A£‰ŸQ‰$0N ØÐ5‘Óq7h­½n¿ºme5§ ÏÄÒ:»¡¤ŠÀnB_7oº €B«‡I%݇nÔa›L†2Wzм}  @€À®R…heÂibi§¬ÕDjú¼¿|(Ü#—δgÌu5}_$žÀ@ (ð@9¸V ïø[f3m ‹œÜVÆèR›‘e¼×–ɯnŸR–5ÛU7—‹%@€ 0E õçÔ¢_­]WøeÂd–iÑ®\¥Y×.±?‘+ìÒ–@™G©Âb_’ @  »‡»¶~X¥–ÀE´¡ÊL-Ô–¹x/jÞ ÍÞ2ùdúoAÌgØü”î#û @€؉@^ƒ>½^æiè“×fL«¿ð„µ“›U&èc«qÙÃ^M${—)i…ŒHõ/sôšøU•HCе¡DN‡ÜŽÊ·¹ùò¦p‹{\AÝí•— @€š2÷Jü´Î…T]%Pf¡ç媛ÒÄÆi¦E\s)}œ6«ønµÓÏu @€ŒÈðÂÔ+Ì5~+×D»iõD–œö7ÿÓ“V t>ïuõ!F uPó´ @€@[Ö ý»oÇJʼs¤¿éT …dŒH¾­)¨/¿ûëí÷=¢sÉ. @€¶!p÷ƒoS+n¨ï%-×G4Öº]Ê¿!1KN]¼_e⹉ŸZäytαcUy¬*´%•tÖ©ª:!1W ”‰œfðŦÓUɶqmmMAMÑýô«?Þüý¿o£ïËU @€(:pj uæd®ÅW§´þÊGN‡O1Hü´@V4{Jþ±o%eúî Ù ­)¨ù¡ñ"Ô“n7ÿ$@€hK Å×›¦ÕÕ)wÕVZôb‹ÅOsãæz‰U™Á·z*Íx>—@±G¸‰Îv‰$@€ÍX d®ª‚ãÌ. r:;©^H?ÈÛ*á½µ­îA©%@€8|ø§ÿlëõ¦i)¤%­†‹- \%9¼KdÍüÖg ‹‰Ÿ^•‘l¼Š@™¹ØmuÔH-lC@Ml•ª…“ö ‹œ?Ð#öù× #onÁ™§_ýÑ‹P½p> @€T.ºëó§¿´Õ©’6Âô_÷ÙÂrÕ‹v,ñâª2ñÓg˹ ¶!p­@ÞûÜVI.µ @à* Î\[7°ý¢iƒ” ]‰œ.z›>x2a^1sUAZÃÆ_ÿ—¡VÞO(y @€ ¤¾úø‹Ï5Tž¯JCZi#4ÝÆ©?ñ‰Ÿ^uSnœÅ…ºw‹|W'~ZÖÝm 3çQ} @€›PÛm=§Â O£&ƒB ëžyêÎ;$]> @ N_ošŠzZ‰‘ÕÖTÙjzfÅ,Ýð/?](þ»ÕŒäº ,4ÚaÆî‡"@€³d¢ŸšXª…Sô ‹œ¦ýÛŸ%phq êËïþšHÕÙi&U @€;hñõ¦gž¶À¡]àCã§en_ÆÜÎÒ/×tbèµ+“eˆ@÷÷?þJ€J ¨‰ ©ØfQ§OOò¼¬¾èMÜäÁ3¢²Læœ7ÿ{ê»%]2 @ 6_ošjyêÿ‰l²uSÿEeºèô–Q‚°Å®tÆ€oÏ…^ì†:Q¿@±‰=ƒ? @€ÂK¯gÒÿãë¯;˜¥}tñ‘9Ýy6›rù¿þ˜ÁçóXmäE¨Y!­¶>4é!@€ؼ@^ošºhmÕã‹éI?5ÿ) ûN˜Ò?;X2rÚ]lòÌŬ5}½vÓ³–#Lhqlùô§Ï @€€6ÂôZ„#Œ˜Ò2þئ e¡›wÇ. >o±™Ð½uó½s. @ îõ¦©…o¬U²åãó£6ã¡ù³î‡q-¯´ú×zGm™n ñÓu³¥³—Éç•ü"H8(?BOÝcçeÞ)¹bjç÷w{—÷p—ìtRrÖÿϼõîßVÒŸ& @€[ÈëMSó¬¿z|’—ï^RÏß^ã¥Ý+±4èê­þ2q%³ÚÍÕ­§¼Ì Õ'…³ @€ªÖ§×z-BúG”©z­Þ†!c—šÒ/Ó.žý§!/B}ÿÿ±Õž:×E€ °¢@^ošÚæì5ØÌ€^N+lå¦$¨=0TòŽž$c`‚§lfÖC…ÙuóIÊð’)™Ö¾ @`‰4euÊÍÿî»ÀÕÊDNóT°ú½Þdn¿ºÞ–¯ê×Á‹PWìTtj @€Àö}½iªè©Ï§V¿ÉÖÊ6.*mù!ËþT9ùˆ ³ãšŠòí6rx+W1ðI—™íE€Ú¨§æÙJEB:¯(95&óÚ[cûái—Ywzö_/BÝ^§¥+"@€¬"pÿÓß·øzÓT°S“^ó·åZ£6µ½4Ä!߉M<ëk­•!wxÞ«æ€OÌØv'@€M<}zÚa•À%—¸Øü™ë9-sCw~–äç2«3Íõ\Ž“×QeuµU:Ùœ” @ u»|ÛâëMSNí=uø·bºüžõBk‹œvªez<ÄOÊÃí&µØdêC7… @  :k¡íV9¦¤<Õ•)»Wµo™vD±_¬êÂçML³PO¢Ã/}þ_þdŸyÁ/­Ñ)¨yRòj*!ÔÖ».¥Ÿ PR Ý×›&Þ´ívâÅfK£¼ºtUÍ·²L¿‡UãÍÏ %;=ÃMô`K$(/Ps]´¡ÊÆÄ¤¦Ö*ñăT²{™Dž”…þ Mlîñù1S¯-²KvÌ¥(|%Yú8y[ôˆtí ]h{!Ô’ýÎE€hT Ý°ijÑ©«§Æ~\÷¹!tO7…ê_fêÕ€ïñ%ÌòYü´¡<Ü\RENgyH„6,P´¹êÇU >D7ö*¶ÜÇ"§±J¬3ÏÙƒqi[ ¤^õ ^»qõÞq³ÐNB¨7ÿïvåI6 @€ÀrM‡MS?OóêÚŠ½íkèB9¹›­¬³T&~šÁÒµÝ)éÙ€@™Ü»Pφà @€bZkU{A;DaZ¿ "§sQ*¨iû”yºHM¤/·f`Úl6P ¤ÅnâYåáëÿB]®ãÑ‘  @€m ¼ÿ‡ÿÈ»%ªeŽ™š¹&ÏÀ†Lý›e$pF˜×ŸÎC “àù|Èb>Ô rZà±u ؆@âwmÕNk¨iLOÃI´1UîéÇ\ë'ײÜsÑî’5 ާ½sˆ•/Gôê‘ÓŸÐzt~­¼ÝsÞ¾|÷ò*x_ ¡¶Õ«)µ @€Ù2 .uÂ&ꮯ&2µñV¦(ö4+ü©unÂì«YtÆ/›î2jýo,ýéž1g:ؼ€øiáºÐy´1Ë·NÃŒ§+3 ¯ÅÈintÚ8•„Ø’Œ$Æk€fÌùÝýmúBuöNH$@€Ô/ÐzØ4=iÚ¤6>cÝÞ¡Œ(Ó%’Ù‚£ShGÀáÝaM÷cH<(,ÐbdªÝÊO´Ïïo£—Sf˜esù³ «­5Õô‡y ¬V¦½<ïÃu|´„PßýÝ¿ÎÒ)ç  @€µ l lšõš¬Ó;o+ÆÑæ(?m±ãh.dÇ™"P,‹w2øL€¶$ùSS~‹í{Q 'Úøñëw¯jƒ,”T ó' ÙJë uÑ2&3² ¡ÎûLe$pýqóžüóùO»ÿéï…Pkëê” @€ÀÔîš~·iª¯y‰9wó¶\^=ZFÇ9­Ú´ª>MÆ‹æûü—mîîäüêõÎûe™Qê!™—×Ñ& ´>Ø»§ß @€@1T’'þ"Ûý-žÈiîo[‘ë4© äɆÚi9ž7- ÍrŠ´|ù}+ßúþ*cè'¹HuJç¤}  @€õ$lš¡q©ÝÔ÷Úú§ÖÊUí‘k7Nû%­ûtVŒkÏf¯ì›æðµçÝäöÅâ§Úï›Ì?Ë]Tod[¿RK€Öhn ärŒ<$ÚØJxȵ̒‡›X”)í£Œ¼åzW @àUm„MS6Vs¡æO…#63v‡íÊbÝ)»Þ»ÐÔîa‹e¹½õ»^ ð–@åók«ÕL¬«T5ùtâµ¼•£Î¿¯ü\ËmY¦ÞUsä4ú$oO÷Àk¬'¬¿\¶_åÈéå˜Xh ¼ƒKoöô«? ¡êÝ%@€Ì+úUª-]‘+püÔx È\¨¹‘A¿™Ì[à&N?Eb|;\c¶Lü´æÞ•…r¾ÃZ)¦—!Ž@€ê:9TKú?L¯´¬N]&rZóØÈ2­›:ŸôžT%côg~-r#OD~+B·¿ÔÑ @€Ý ÜýàÛÔ¬Z©ö¤3µ\ƒ±G7.îXáN{2C÷§Õ{<.ªÎ¾A.ù"Ëô ÄOg¿qM°Lîšž?l[ÀHÑ!§ÌXœ˜ ÒºÌØÑ!çZb›4l'¦Èî"§C”*ÜFüt‰‡®;fžú2ã ä+ïBÝm7¯ '@€& ¼û»ÝÌ"½©v¦~»bÛv¹ª{%Gž>r»@Óàü5÷,wgËD¸²2ör—àÈ ”ÉWçO±o @€}VqGÔŽ¦/÷ºV·L½«æŒdÎéÉSþOñÓeÂð]2F%ÿ9{‹ß|þÓßîúûtNìB´; @`©5¥î”T‹¿ó4§N›¶Õðj°-¯ˆíôn‡ó»V웚û®ºWm\&Ø­Á~ÕMizcýWÅŠ,'"@€CöY޶65K²|w–dÉEÕ¾åDÍsÈíË6å3çµÏ`ëÛçaÜÆ‹P“[ÒøðõÝüý¿ï¡ÏÓ5 @€F¤¦”úÒÀªxý›¥[m‹¯õfB—þ2«E-ÓÒ¹´ÃYÉiJ/ ›ã'J»¬î*zô_x”œ‚\+°Ï*nOåüOi\«úêö%_ “æí«i˜ýËD…ÎÅjøFÍóª{-~ºt¦M1²™¡vY+]‚·ßÿõˆîD» @€¶*ÚÑã/¶ðâû®¾—¾Q›E› yIÐf–©IžÙç;:Ÿ¯jzÛ¸ÚŽ—Eý\ÿÕ¸çÂ^ @ €À>«¸WUÃæOX¦Æ›³È69E™Ë¹êNu«yŽÈâ§#rÚµ»¤{d®ÂdÄ-^b—§_ýñîßnµÿÓu @€ äŦ©-QÝZ똩µîp"áµÕû)ÛgpuÂÓkÝ߅λÃFe“2K.WÛý2å)°o’…¶W,TÂ8,XE@ü´¿Î–Îr_R#ZzÉ£b‘Ój!‹œŽÎ«%'G÷?qÛþë–^„Úe¶—ßý5†^‡:°sÕf @€ÀfRÿùøãߦ.4º^áŽ^oºtc$±’2ÓWÉ];Œñ‹Ÿ¦¯céÌéø…ŠežUJ'%@€›?í¯#Í8_l¹°c±ÈiµJSóÜÌË%W)[–î÷?e»úkžÖåÕ¼õþ§¿BÝLo° !@€zòbÓÔ|RÿY¥Ò¾ÐIS;Ýaä«p$ ®mÏ2ËÕí0Æ—%† ÜÖ}Ú~BKžNät¡ß2‡%@€KT+Y{yë\© Ïhž¦©&½u®qßÏÞí¿ÒjóIm5όَU¦sf¦a÷_R˜Œtøgº&IÏfõÑ4ÇÆ=}£÷J(ÐÊî¢gÿk^‡šîÄžÎF"@€´+zNj;³× Ö= °éèúüðÓ,Öf_7;edþp–ÍlYf ¬4Ó¥°´=_HmýWëÎN€š¨6.VCjÞ–N ¢Ír]©¥çhe2X"}³¤y‰ƒ$mezÎ’‘h鈡¶i%–š¨úê¡´ôœ¤¿Ä rÌW¢½Éêã/>ß~ÿ×íö‹J9 @àD u›½Ø4íš´>–[éÕÚï>¿LÛ¿ž³=íÙ¹þ´ÏL•»<`ÏqÒç Á¾bdÞÆž ãO @€ÀŒâ§oUÃæ|ÚݲhO7Ø…]f¼ûý‡ª¹–¾nͳ‹™N¹•ǹ.K9­ûœ\Îqz|. °Õêó§¿äu¨'þI€hK õ™½Ø4í¾.l* ³tU¿p›½¿E_ò¯sµŽ—¾Aó?#¢ ×Ü33¯çV¶nÿU,ê @`Ãû%8¤V¶P 'à×6Z³}ªå%¯Ö\?àZÏc¢œsÍ >ÉilæºÖšˆš¬~’ÿ, Ðu­¬uÓ—{ˆÒÙøñÇ¿õ:Ô¶z‰¥–Hí%/66-P Þê)J.µ\e~Ü‘k^´jÑüV&~ªÁ¾èM\ôà õ+Ž{NíE€ŒH}oÑÚB£OIƒHÇK™v÷ˆˆ‰»<ýê·ßÿõ>{e]5 P¡ÀݾMýdb §ÎÝa1*²X5>C Óˆ®3'”OÕž£{t]\¯]±G{â‰DN <NA€ Ô8›Xu½{L ß…µNWyä´pP©’v_’Q2?X¼wtA1㎡æ%bþé?+ì>•$ @`?©lïŦ]“!-¦ÂkæÌXnîP¡./+Ùœx®=O>͈…2ƒ½µÙë/+DN'–$v'@€u T>[«Ž”ѤuÞ¯ySUó Æ’•Ïu'œžgò’SP÷ÜÚ=—_÷›m‡PóZ±w÷¯ûé¤u¥ @€Àê©{lòŦ]“PØ´pÕ=¬4æmO9ZÂvÉi5woêFÅ'œ×½(*×Ë%T2¹p~èNð¯^Òk·ÊÍ~ÒýÌ¿˜RdÙ—4* &öj¥hócJkŽœ¦òY¬eš¥k+\ä*IJƒ·L‘²çÖî«Ïþº_n8„úùOK¦×¡®Þ“, @`ó©oäŦ©{”©N>‹°iáêzšfi3¾Ëo.ÝiÈlÀ&Z åi¹LOáWæteú.ôÚ•¹›#ÎR&¼U øž(  &v^GJ£Xü®À->9EÍ‘ÓÜ‹b£d+w(¶„o*üç€oVHùS £ã¤X(öÏtfzêæ{­] XE uŒÇ_T4=pÞú•°iùúyâ5t $ ¹ûãZmgî|8n™ðY¦¸î9H]þÙrÆ2·~ÞßG#@€F$\¥&vR;ÊÊ<#$ëߥò¦M™ˆašŸiŸÜñ ÿYfy¨ `®ðÚ%)YtÃSàŸ?ý%/ ³–ï*ËNJ€6&ÅÇÿv«/6M3ÃêS=.)î‘2-Ó‹IÆô¾šEÛ•i\—¼5ž«Lß‘^»ªn½ÈéŲË @`Kjbç5±bK§ËH¹¢óˬç›D‹ P$«µ» T’š/ÍÒD(yÿÕOºíjÖÓ3ucÝ×.‡”ÈTÓÔ%–®*¯xü ¥SQ/_!ywY^ÌW¹û3¶[mWV¾¦S,‹7tú†=¸•CN‘ñ zi¦gG @€f?=¯&m)~Zyä4õÏMÔ3yd–^ÄU+ìüÙ¯ê›m‡Pó+–©"™0b"jÉÞfç"@€í l~ªijG¦kÕÆk˜pš¹œK„#Ó®\¨Cs2ÙµLΩ¼Wg­Ç¶äyENgì…v( Ж€Jïy¥k¡öE጑èÛù¥UõM¶FÓ ¥ó¡1íU=¯&fó!Ô”Š&¢¶Û-å @ €ÀݾÝöTÓT‡„M_­ ørѹ™Ã›ÿi¹':³Ðõ.÷±²tnÙÒmö.5Ý­±PÆ.vØåž áE„-  @€ÔÄNê]¨Õ?ݲÀ[B6±m‹8qòàWûÏ=„P»‰¨7ÿïú`‚¨_ µ‚ûŸþ~Ão5íšÿ¦+ÖÀ?~ýqÅN˜îÔ™pšd,þœhö‹ÍXè¥SÞÄñm³îÚ“›à]=‘)¥wÁ @`Ÿ3Í[§j:~Zät¡æÛñû™,½h[lÆWêÌû:Ú¹@ÚË–¹>~ˆVùüø‹Ï™`R® @€ ¤&úÀ*õ’'6=¯îû&S&kˆ$ Å&o¦Ý7{ü4é/vËj>Q±¾#ñÓòÙ`ÑÞ˜’¿8ÎE€LØL°i® U±:ðÄw²{ý‘ÓÜ ¥« ËÌËqm j®g¿æãì$„ši&™lb"êBÒK€*ØÉTÓ´Ý2NdÅúvfzÎF/±6òyŽÊ,¶ÚórV•y¡¾—ó»é @ 9àóŠ\ýu§u[açbo}“t.÷D¤SbÃó(siKÄsÌ·n–ï›ØO5EG¦¥drJ ý½Ò@€ŒØÏTÓÔ^„MW¯Q§UCs>9!K0­®‘U‹gl{íéÉ MütFÞ·µáã'ž«ü³†ââ­[ï{ @ ñÓóJZ"5Üšó4däa+“]Ê&›_Áf¡±¬›w;œ·÷M %bëçN ßdŠŠ7¢Žî¯¶#XKàý?üÇÃ×ÿµ“©¦©2%®ÔJ3m{uãÃ%^™¨åê5Ø !®g”ï¼ j:2Gâ§ å7‘ÓÕKK @€MhèWÆ*iyçŸÔ™Š|¥á8ñó~nÈá{W@CQø‹9Í@:î2Ø~Ý’êäQ]úŸ™Ò’‰-&¢–ìw. p.°Ã©¦©qUµ.ëÎëÕL8­¹/%i›«fíç··.¿L0Žÿ[þW}_C¡1×#é8 @€@IšëüWU‡æÝ8‰µ¦ V;~µG8 Ã.”iFì9ïVÿ”¡ÔóÅj[Kj«7®üu%,ž2|¹¡ =×Sk"êy'¶o @€@Ûïÿ:ËALùonßÔ²´—ËWqß:cé³2‘'³°OåÓF˜«9)x÷VnÌ÷eÞ¨¢ê¹CþÀ¹] @€€ÊØ[5®¬QS²u–¶y‹«âÌØ4;y$Ó⫼YúVΙþý¼c#µy§ß‘Êb¼Lãýä!]ñŸ™ˆúñÇ¿5µLo¹³ @€Àžòk›ßÜ—ßýuÅßýò§NÍÊøÃª*À¯;W@ptvJ’ŒªXÞJÌ\ó"5$ßÎ÷é )Ó_¤Ë®ç.ôÿIättqgG @à  2ÖSã ÎÒ»šÒËŠ²ÍE—ÈY ~ÚÖÄç‹bKo r:°|³ p•€øéÀZ\–ÁI#îÚöH×0ßÌj´‰Ç]•»nœpH_—çZm)òøhoo³”ê3Fá>Å5l&Š:cwºC @€À†v3Mu%u$íßúk¿‰k¯U›m:ª>ËÂY‚§[îç-©ô;Ý1ðFd3‘Óó,ä @`.íÇáµ²nË„¥>~ý1ÍŠ¼m0-”“ÿò}þšm¶WÝ]h p¸®½Þ~–6o ÍÞ g’!—–æü\yi®ßšbÇEÝp‡¿K#@€Ñ{Ž™¦’z‘±…Cê•l“›U¬êØ(z[Ï!iNGÓŠþ,³K/Óöº’†«^»åBwaú£ä @€ÀfZo&\[¿²ý…¦¦cDb6¼Ë\BÒÎ$Ã/-Ùi¡1Müü½üî¯÷?ýýûøÑýÌv$@€­ 윤é:._õïevä‰s÷ωÍ^Ïò«ª¾ÌSœ¬5=4ßÿPWþWQÔkûÞmO€m ˆ™¦*’ÚNZÖ½Ü@í7‹Ö-³Ò–òÉÄVdGm¼Áˆg–øiB#N½Û]DN-œ8sÙmÍóâ…ÏÒ;ÉrH|ñ¼ûÜ`b/ô>³Íð«NKsç!Ô”E¢¨mŤ–úÄL»†FÚÃë„Ml¹D;ôÐ,ÝX»)±àÃ¥þÐD®¨-‘ ÁOœ%­àºêžNì0ýtØ‘ع€øéUu¶lœ¶@2Æì†zòÏèØVÞ×ÓsØ%þ”ì‘“º›KØ.zÌܲY:Xf/ Pµ¿7Þ_  @ f1ÓCµ!µÕÑE«Ž+|bXêIÎ?¤‘»¥‰–ÓÛìyŽV¼ÑMŸztüTܵ÷=‘ÓéYý¼4ð  @`ˆ€ÊÛµ•·Ío¿Äp߬l³y·)˜QÐCžÖ“mrM«mÊyGì{Èú¬Fè­¾KÚž³,3u’[ügE½ùû¯¹“\Ú @€@ÄLk©Él)þµzå°Âäþ.+ÙL¸p–¹xiÙU˜ZIÒˆ1ç:ß®½¹"§Ç?> @€«¨Â][…Ûöö£gA¾•{“ÁÊÇøÚºGé"xK¯çûòãíÏ[ˆB¨må´.µÉoé*Y®Wª'ÓVø§çOùøãߊ¢ O @€@mùmºÿéï3Ú§Â_ÏòIJ½%µmŠkž#Òþô:|º€–N䎟¼Ô“Ó9½63ˆœ2 @€@ â§×Vç6¹ýìKz¦Y·I¨Ù/*/^¬²ÞTú¬RJô$Ruö\Qæ€ww³?ø=ù¤þ?‰¢î3Z᪠ °®€˜éy !õ3ãÊÔ+<ËŦÇy†þM"Y^òð$e8Áð‹}kË<_ÃÏhË‹·#Ô†ôžÿé"é[¹Ú÷ @€åÄOÏ«m»ú&UúÙsWê½»2}±oMê<¿#yNWyÓÓÀ ¡ŽÎëî˜ÇßDÔ“ÇMuÝ8‚³ @`b¦'?¾ùgÆ^¦N"Ö°nͰ†³g€ßyö˜ë›U–ñ™Kuú´Ó0†w®ô8NO°OúÚìу9×ãï8 @€q‰Ëß{mín3ÛÏþrÓN‡çá«´sÓÕ?íô¤ÀB~ëkÛ2?iãŸÜÐÿ3ï›Ë[çî~ðíºñ]#ÈoŠ÷™žÔ.RÕL DS´¶šáºé¹jqž“uñŸf¶#Zû/_;}öŒýê}i:F?;ÑŠœö?¹þJ€Ô `¶àzÝö¶™eëq–‘†g’L&=¦{ëóZ#W_m ¾•ÈÃ÷B¨Ã3@m[šˆzÈÆ'ñ9¯¢ËD¡]ëNA€[è&™æwää—Å?³†jZ ¦šÖV¬!=×à¼êiJã·¹\—€ïU×øÖÆ5]ÃýÝXN ê ¹öþFì­ë{ @€@Ujz×ÖôZßþýÞÏ› g½6K\œÚ™ž¥Uø{-„P¯Í UmŸ’!ý3ç¼¥GG3uK ×B€åL2}ëg½›jššFU5‰©M`®pá«ù°­‰i”Í2Ú9Þ*ÊÚ²ÖéIË79-«¬µÄ;¦Èé«e”/  @€jÄO‹Uk8Ѹ©…=¹Wþ¹ö¶vM­Òµ:—fÉB¨×懪¶OKžè„ï{òçžÿd:êrAG&@€@‹ïÿá?²LI¦oÕ L5­ªš×Ÿ˜TÓXw…ÛY#o密‚\sUÅãÙÓýu´@ž—¬5½V³}t²WßQäô­Ê÷ @€@Íâ_«W#‹%`–Q¬‡ÌœÁ–ÅR¾™õO×Z[) ÀÜÍÃøAµõìj"jÿ#`:j‹1i&@€À,ïþî_3ÉôáëÿÊoAÿÅnÿš*e¢6yWEëÕ¡ý¤?÷«k¬»¦PÚ#ó¶UŸÁ\`Ž_ÿ==Yöø®úÜÊõÖG¤p.‘Ó«a @€U ˆŸÎU'¬ù8 ˆÌ›ë gq»{‚§¿:″ì’[9oÞÈÑ„Pg¹5+$]Lùièɱ³ç™ØMGÍä£Yúä„êè&™>ýê-þTKsê •+ÖÜFœ:÷ë$^¹îœ½¹zœùWlj ¼5sENsÕÚéÍmVF ËñÃè3 @ 9uJeêl;?Kf5Λ- )‘£Þj¯8íÇæêx sçÆõÜå4 Ö½¨y­ÇWšÐp…Qþ dí¿#Ç—0ä³wq®›ýX@ätÈ3k @ íßãšÞ–>§8o&¼{¸Û’O±ky5R¹bÅ¢ÓNO²œj±l¶è‰R˜$Ǧ÷éäþú繀騕„B$ƒý&™žÿ„õ|“ym© T„Z´þ³ƒ§ÚÿjKää^¯>ùtÑÅ{Ó©êVæ¦Ì,^±]Y¬ÄÔ 0ûÒg'…• @€Ê ˆŸÖPÏœ= óùK›zöîä€ç]i/¯xíçéYºÌB]ñvÏ{ꌠ˜wœüÒyoÝ㛎Ú¹ðW”È$ÓûŸþÞ›L‡ÿ>æwßøÉykSeŽÖ…M‡|[}‰¡Ec.9xö‹gI˜xøMòœ®Û®¼x½6Ø•ÀŒ+QÉü¶!@€?Ý^µvÞÇê êvoÐI°2íåÇí—œvzR| ¡¶›‡ORÞMDÍ$”“[ìŸo ˜ŽZ>>âŒ8d’é‡úϼ¥úóŸþöVAíûSMO*?mý3Mûõ´[(o 'ùp®¦ýUöóŽmκíʶ ©]Z@ät®òÊq @€:DÇ–®O>þˆ&sOά¡½Yp®ÓOרp’˜ž;¾ÐŸ„PçÊW5ÇDÔI¦;eÒS¦>zõ} @€%ºI¦ÏŸþ2¢¬Þó.iÞ~u[C5CFäÞ^6µôgœq—Doç•yü ¯;C3ãW—-yTgÌ~5E`‰ì}üüúL€¨A@ütJ±ª}Óöœ1G%[ÕÕµ•˜ãAÔë>b+N;=ÉB¨måáþÔ¦´ÉbhóŽÖ8É0›üg&@=þâóÇÿV u‰ ‰c °OÛïÿ:åjJW“L¯ýéÌïx~ÍSWìÿÑ÷×jR;nt\›ºíWÆÍ>7óØ!ƒHW¹}„<:¢}œþ“ÏëŽÈ]EÒIë9=y6ý“ذÀºÁ:kƒ-¦*3ÂfÌ¥rÅ”uwÑþ‡q™mÑ^‹)·Ì¾Ë ˆ¢Ž{XÞÚËê¾¹Ž¬ÇûV?ú{1Óåj55y¡á‘54^riɽ£s~ÿŽËͮ͜م&œæŠV_Q¹†¥ô†’(ŠüreJO„¤ˆx#"uÓVV€Ý7Fk4®²²Ž¹±¬¬W‡þº(êÊËçñëv÷½¿xM€ÀìÇûxK_ÿŽ˜é¡›Io%¾Ñ ÉfÏÖviï.«,}ËùçkÓ¨,’òdÍ;ý°|`ÔóìKvw5ù“ pe´Ž„96hˆž"¢ÖØ„9 ÓæPÛ ´ëÈ/®fÓÛÞÁ;E]|MÑI*« Øwú¾æ_ÅL;lêl¤”ûšjóê»»Ïÿ ]Ó^LV‰V•N"›J!¥“јÊ¢ÊÊqŽ+ rúêné} @àââ§ÇjâÖv3•w©½H§ÝæQ‹oŒ»ÿì’?wÈ S6Šï°®.®äý|Ñî¾W‹LÉ/ìÇÛô¡ fº{3fßd› ¬|mæ2¥vËÜÒì,™"^Ûõ¾+Ê|™›o¨H¿ÝÅxWíýI€8œ@ZJV Ö¶?Û-1ˆª –ro—NGÞ@ iw~q53°AÑôY ŠºøÊúð‹v÷í0¨$IÎ*`?ÞïÉ+?ÐOž˜6ów2åøì&²Ïe§¹™ è°¶ô–$QÔ Ãî¾?þÛÿþô_ÿçYÃ7òE€Àf¹“ä~òËÿýÿæÞ²Áì²§b¦šR½µ[öMO¢œ-®ˆ•±Å*“¦sAó{7ËÒÙ4U郗¬Š]–5ß"p+ rÚâîê˜ @€À)ÄOo›‘ݾ.œk…`·¥<'aM;õknq¦aÌ)>ŸDQ×\ko}7ü~ùËÿ—ÀGÖ‹eÍÍ.ND€Àr—Ƚ"wŒ¯ÿþ{îoÝm|x€˜©vÑ´@Âm êÕ‡_ÉžÀÓçÝæ_ çße9WÖ»¿(šÏ7M©ÛT*g™# rzwÇð' @`Z@ütN#sßÏL—à[ÿ*xºoQ®9{£e§¹¼U…ž~xM¾|÷²¢¨O¯¦voþþÿ9.MMˆäˆÁi&@ P`؆wXXšûC»›#ß ˆ™^°Ù³l³ÜDônkNÕëü¢nEÜ•ôAž²¼µÀ6+U›¦äÝHn¥# ghô{ÊO/Co @€Î$ÐÉÔ³6SWæ«°¦ ž®,‹¿ÞbÙiÆ Öö­Šº[!ŠZx£s¨™ÃO¦&tòù¿ý/KS cRE COÿõæJ–æÚŸy—ð±*1Ón!M–.vvZ¯ÌoàVÕÀÛãtÒLÔò6Uµ¯çä1S-ïò’.’­z›^_þ–€ÈiíMÆÑ @€« ˆŸ¾ÕøÜòÃ…UqÙÌç-3ë\O-;ÍÀÂúAƒ ìœ&MÚØãzÆÅMåFíÿ$,GîA»Ýf¹¹ê§U$3÷Æjz‹Hô<Ù× k—àéëF£…\ì9òúÚ¥R±R"Í©Ÿo´uýEZx„oÿW²%@“EmvúÝ%Fæ¤"«/×à°o®ÊÂkÜ¡V ˆ™¢Ñ"‘YÉøjeÚ3‹Ï˜ï®Ÿèø´Vw²2nO“WòæãÈFº-<ç'8 HÂDQ_¾ø–À.Sæ_>I€8œÀâ…ÞjÅùð|Â*$Î5Ÿ½ŸO¦]X†C ËNSÖy͈P?ÈRÒ³€(êúë´Ñ~ÿÿ—¦&”#ªE€@#a^ KÝÊÖVÌ´çVDÓ´¥‰’U]ñ¸Wëç§*ÉÖWÑÇ#ôÓåo:Mnìü¦¤Zt©aç¿“j“RHøx~eðIo ˆœÎ¿}’ 0_ ŸÎÔ[ó~x~Á}øÉ±ÿxV«óå+=ý¿È3ÌÄ^?†^ÿùÌå¨g 1¥ÞNŒR~xô¦Ùé÷ë¿ÿžOvµ:µQÍaÏ-0¬*öàÍÕ”kªé5ëà‹ò$ÊóHà£ç6CÓ´eåfºÌ¶Ò‡&÷Ê”$»¸¢N|±“Ža:;íÚu9rŽŸež 'xçÿSjÑEMRWV_'0¤.‰œÎ¿}’ ð®@ÚZZï´½ß-»‰ÏwÒGîöÉXß|¬òÓd}—*”‚Q"Ï'AˬõhºZáñÚñÎ2ñ·STýüßþW‚ªßý—ÿqîø—ÜøP WA®…!HšÝ°³ˆ[œtÙfão幓§O'[žžïá~ˆ¥?5¿ùQ^Ï[Ôó~šñ28 ½ÚN¹éúc¦jù¹äCÜzNdÆñzž-°þ2q @€@iq‰ŸöÐ*.¬ %“Ÿ{0¹Hr~8¡}Aõ«Áú^Õx¨‹”ˆlö)`9ê‚û@_Éo5»þ ª~hóã AÒLH=Ï©ó~¥´‡ûÏ[i°È´Ï§ÿö©JTëÝ5’U‰l,‰í–ä±Å|Ñ·.óÞ>œ7O£¤j]í "§½]ËÒC€œX@ü´‡Æö»ô‰ )ÔÕCÎOC‹a„qÙi’1QUfþS?C.óU}òÄ–£Î¼r;ÿØmP5KóòßqgR~)¡º ’v~‡™™¼´—,2=qƒá­¬¥u‘6ù‚ …K;“†™U÷­¥›ùE»‹ø¼*¸ È$Šš‡Ûá;òi\G¯®#ï @€ ˆŸîÞ–.œi\Ø…ßåô h½ì´dƒ,ùÓ×ÃãfÐrÔF­‚›%{ãJUAÕK%{Ëì]4ÕrÇë©kÒñI˜,m¤ã>þ¤¼P 5aÍ\ÔN[]“’‰Ë$Ëi ÅÖ*ÝŠ‰tú§a ¼Îך:vîï¦nκwÅ @€ÌÈ<[­ô[Ú…=åŒí˜§~K õ²ÓÌažy˜øØ[9òa»ŒËQ¬™¨üþ©„®¾þûïYî÷Óÿ?‰j}ú¯ÿ³·X›ôT u)5*õjØnW´Ÿ«¾6%Ã"Ó„ò¼Øå9å¤ ¤>¬Ÿ¿ZÛƒNýlÑ’É13c³“"hÑý©½]ôp´È2>`ÿŸN*m'ÉÈݦÅý¡‡ /  @€þÒ«íýuÒÈq©­ÉZ£‘»¢__©2¾´&›¾K ËQ×ß N„!Àzcýñßþ÷°hÑ.Á[†GǨhüÇx÷X:§¯‡2¸XÀ"ÓN¸ý'£ð×Rµ“Ó_|!L|±«)‘…!ìÇ,çn8ããû§y'¹ `?Ñðþ¯úC§°Ñ á4—ƒŒ @€¶hÔæ.~¨ÂÙª­ãSŸö67²é¶º¯nC5w7œ3ý9L8i]K/~?i”ý œ{¡ô™.4y!@€¤å–þE£–¡ÃŽA®­lJm´íêEÆk :GKïøq’Ãúíc@¶+I‰!ÐZ ã–Y¡a½õWSùUï€8¥@¹ëæÞû*êÑúÎïøç( I<¶½Ëé C½··‹LÙ-Oêâ6šV:ä7÷“éb¦Ì;ŠŠÜT-Û_\E7þbêäé+äííÈk @€À 2nlcƒfsm;Yäkƒ"{÷Æ˺$š¹ÊƒÍÒ•®¶){·æøü2î”aÌÂq×4dër_MK&÷XÿvØ;i‡¯¯®ÃRi7°*iÏ?fùÃâY»=E£5¶CÆ{I·§__'Ššn‘;íXî½½H=4cóñ–å @€@ÿiÅ =´n]×Î.N‘MOµmÇHÿ½übZÐ%£ç˜2‘ÁØÑ\õ±Nzg@n­™ZËÙî¾ãÅåÞöãMsEcuÁcÈW– äÙýV-øðÌܲtÞ~«Eß!ùÚ,ý·y™xÝ(›C ¾5ˆ‘îOºä§`%ú/Š:Q!wù§tZO_ñ&nªþ‰ p´èviI^䤅=ú¡²õÖ/¾H9¾Êf†[tˆž–rÉÄ«ŒèýÛÈéxB=P "©”Ë”Ý}ÇKÌ < d±›ýxñP;q"KšÇCÝ~+·†´Q÷áéÜË5é\ùÝd³v ¦Û[в̦c~‘(j®‹s̘]Y ÷ýúÓNëm5öš @à"Þ·ayî³—wmËÓO…)±ï¯F2>9~fÙ‹Dû¡[–’ŒLä]u™ªoM 䖛ѻûN\zþ‰ëØwú‘á_7H…¬ºú¶LyzßUɾ=NÚ*[æâÃs%}›¼Ú×é}˜€W¸H5£é«n6+à•ö5ßo1JP{9 @€À|ÞºZgjc—·œ×tÏ»{^ÍO…yšµõQø£_扜ÎYç+„ú´þx³D W}Ür‘¦šÍÂú$-;^î{Ï=°ä^ê JR!«®¬Tò’$Í?Èú†ýÓ¼÷6ɶ¼#|›ë4Éæƒ?ýdfÇ­Ÿžz›¤>_§•nàz®§†Þ|ˆvŸ5Aª @€ ¤ã`Hä±é»þôaÊ«/šAº¾\Ö¡ÅhÀ«e§%£C‡^c>3r:^2B¨ëk¸#|([±Ý}NjΠN#°Nú¹¿ÙøñÃì(§pÕE·}#9‘¬ªÄßgû(ð‡ puðmNóúU¿éÃ$Ý} ý¬ëDQsoOf ûÜÕª?Û®ÂßÕ @€l,–ž†tUËùö8å3Z«ºŠ·‰ôú-\))…ò+4Ù§É(:nÌ}±¶êÓêäÍv÷-¿: [ ¤FHÕ{[¹ÖâŽí˜ç(œÇ¸Ë<4S[\ã½5øcÛ"›Ã1kƒÅéq\$н!Šê†_x3Lý9mw±;2 @ ´÷vé<¶Z;r:ÞH…P·,8çºÈèhF¥2ÿÅ}c¬á^ @àCûñÞÞœ½>ºÀ‡~æÒÌÞ‹¢|{¢!Ë™¸»WŽ^·*ÒýX¦i\µ ü]$Šjþü«z;ó}‘ÓÇ Ó; @€ ¤’U33ÛŠ>6G #ç-*L‡]ã9GÿÌÆËNõ~æs†,ŽÈ^>Ò"„zÄjp¦4gn\”š(F‹ç‚c @`¢¥i·äÎÓ.¾p¦»´¼E pÙæŽý©\•ãÕZø¢Ã9“Éi»)dé(µ®·In¤§l¹™½²ò´Ød¬ðnàP @€vìH®lÁöùõF½-Å´qqo¿ì4\±_¼~½í+7!Ô¯§›Ö¥æ -Ÿ*ðªþ{Ÿ³ $6‘;Iî'™³—{ËÄÇ?8º@êyÕ…¼ï¼‚Œ܂䰽q£¹ÄC®7ËoÖæ\úõ·%¸Áëä“båe"rºAEu  @€@·éã¬lOúú(P8Aú®ÂèõŒÈ¼h1Ä‘ÑΉŸK'ý®Äüy¸µäí"§£žê׋S¼+!ÜÜÒsŸÉV~ë—œµÝ N)»Dî¹cä¾±oèÝ{ÏX)PµámâG+S²òë¦eNw.V¦yñ׫Jíéý|ã:z5މîçâ"¾Ô7è®>­êÞ$@€èG`Ç_9_ۻѢôŽ7î-ž¯hfæ¨ÑøFz¯ (™Ñz¬ÍîB¨uÏ?õ ˜Hn¹(RWs·ßìÒp"zÈ ÷Ü rO8Öc½‡{©4œL ê8Ýß­Q»·‡¬Ý6êI ÷êL&Ù%˜vZLª*äÏ$õp³jï*RŠœnPW‚ p ÔìÒé¡U\›†Œtµ+ñŒ¤Õ¦ÖÑZ n¤;}}•œô1/ݾS,~÷BBí¶>HØ@nÃÒÔ Ú¤Þ¾[Õ}ž äÏ•>ìÁ;ÝT¸»Qø“À¹ »TD‘mÛá‚ô€·» ï/NÖú¢fñ¯§ÉÊÛcmÓî*vd @€ÀÒ>ì°óµ²Ý»Ë×›ÎQÌÁwÉÔENšŽR‹IÅvó×ÇGr„£”Ñ.‘Óñž¨„¥Žb%Œ!g¼.w’TàF£¯ã5âírý{ðæŠ¶°ÔžÀ„@á¯gvHjÔÎ-e‚q¯jÚî¡%ßgÕ‚Ó’ Ÿ§³Æv»†# @€Ž+ö¶‘œõMîF¸±^íµaÑz™þP²t,©áŇËNÃr÷•%ªž¡†¹+ÿŠjÿ£N dä0ËC8µüq@JÒÈã&×é°°tú¢ö¯öHÿ¥«i´U?™~Ó¾°·go´–­‡`âm6ó:Õ©]ø)Gî$ žd$&^UWW>wò¸é꾫Gù3WSžÝ+ËÂ×  @€N,.ÀQ·Ý¦3­î¦5$Mú¡ºÍþA–þo‹¾RFM§AÒÏ]_[20;}–þ5s3Z/ÖBí¡VHC‰@n#yîän“¼Fc³‹/4_$p\}¹s%æz4ˆ]rss RWSiÓBKLjƒÓÍçßÖŸô=aW¾3³SŸâ[y¢nLá\­‡Væë3 ë¶ÎxMà¹BÊ]zˆ åŽÔÿ»þ’w©ùc4WD® ÍàsÜåäbH•έ>íÆÇú?¾ÓÃ\²ª%`Ä‚GÿáEUîÆ"^ô¹sTºwé,ü³Ïò½+îFQÔ<°zîþß!ôüg H»·ðªt( @€À¥Ò¹Ö,_ÓÚÏÈÛf&ƒ!]ò%1ôöÔ¢®öX IÞ^ËN“˜õ§Î`ïc¦:y'¶‡èæòéDL2t"‹÷.¨:=Þ¾ÙÃΉ¬$íä&#[ ¤C73f×C‹¨êqÓg<±Q¿£Ûy€©Q+oÚ_ﳈŸ^Ú Ò…¢¤n÷p‘>ÍãáÞÌq}O|¢~ú' @€Ó ¤=Ùÿ²ÁžêM;ŒwÕ/…•Óí>c|èŽ=‘ ¿÷\@I[‹2Jö36òaÆó™»B\ðg·=èäî‘Ó™…õaiú+䟻zæÆäΓ¡øLÞ( \pëóÓ©™©Ÿ©¥©«©±©·»7®p‹ÇÞÒË…0}±Üþëî¢\§·éYóºÛ9À-ºê¶GЮ;êz¸{ªeJjYÛ)ßê¿gÝÛ=ðUzÒ0HýYs‡ñ] @€ƒÀfu¾jïøþ̙ޅ•-gܾ#™HYú wã3ÝöâÇúd·è7ÍÌxú¿ë˽Ûé Û×üe˜3 k¬3^ ð(‡ÎTÍNzy´¸µ.»Æ}ëÜ‚¤×£w¤}›î۲;ý¾ô&JnYÉ{·Õ ¥³¬h>”Ù¾89©j×$H{cN:üÌ»QÔt¬Rs:ÌÈ“”»Ü‡W“ @€˜/æúƤy—(Rú’ÌMMw8£*¬K‡èÌ&pö˜ò•ïd|`fß¶äì}ΫߥÎ/(¸ù…ÕÉÍD2K 7¨<‰2H•ÛÝTÍ£¡Ñ ñ‚;€¯E u&5'ÿåá’º”•zÕçãïXW¨ÔžO -ó\&kbUû†KÚÆ¹³¡ç­ŠßÝûÍuÓXUêLÏeýaÚ2vúšÍåÜí\Ùs×á¢}wáø“ @€ÀzŒYÍ uØHÞ=I{µÒ3’S§ÃU[v™I/xb¦ôòò™ÝÙ§“5ƒK¯®©ù]ø§AçW‡}õþtwù×½jû+¢‰÷çÖ.’NJàܹ '6ü7XsIæ2„É&1µ:–@Jù6*š 0F‡ZQÛt9÷Õ$wrÕ”4,sÙ1RSuçOt²ó*ÑhQªAŸÏ­¾ÝãésižFQsQ{VUéHVÝaÚUfG&@€8®@Z›çè›TµÀß:Îî¥tZ3,¹¬ M‡._ÏAæwu™_(ÉNùÅœù=ÜõÝ·ÇüünóɦsËkËë­Âz¥7Ì"ÈÿûŸ-ð* Þ'пÀJËÿs­åÖÿÄXkï‡åGËãiø/%5YÊn,Çþ«œ8@Zݵ‘¸½š—iBWÝ‹úo•å~X•ÙÛãìUv^/)Ü9]ÈÛ¼Ì.Õ‡ 8ÐrE'f®þçH5c µ÷ÉùõÓ'  @€®#fü²èÛšÖí’º{üt¬¨éc¦s~Ù0¤™>Ú8¤9Mÿ”ßšù"ÙlgXuäF]ø ÍOáLωõFÝh²õQ槆oÖ«b½M[^‹¢¾‚ò> Ò>že¹ °ü?O±á¿§÷o¾+0zŽÂÑص7¨äNAàQ ã»ò‡Ÿß%ø˜þȇ ›ó´Ç•:|gA'kNösCî0³IRUù>EÈUÐg®¥ª\íb÷O+¤7  @€®,`äâ^@?ñÓF8ãó—^.f\ÿÅMé”ÍÏ{:që‹ ¡ºõUGh9M6×[Ýá­ÂzE”¡Å»Ãfbs*˜8Â+7ïØW`Œ±!¿ çæ‚øo >¾èyCÒö˜àñ‰üæŸn§TEÉÝlßëì¦^µFž6Qf¾¹Ëô¼Ü|f&oúc9δX'ÿš[ëtF–ýknþdð1U;K?•ÉÓêñŒÞ!Ш‹ú´z“ @€À p”ni‡ý…ª‘>«â!†X{XvZìg” ÑøÏâlž(¹ƒ}XˆIyNtˆ‹¢Ã[¥$8º@"C|öéÿsÉýaú¿|æéw‡7wYvôB‘~§h19sþ„À*ÒÌî(éÝdúGU’Z§EÁŰÛyκ`CµI«{ûJÛº†8þJF—XÉÊA @€Î-¶¨ʲö|º´§Ü:&üË@6þV«Ë¯ÍwW2–tå:¹lQŸs̹Åláw ëUý¼Ý³wºFe<'%~ Ñ¼WYö> Л@&TL·CükZËgsA"Ÿ~¥“æñ½ÌiÔ„î¡E]«Áö•vN)ûÌ.¹š®tk @€^ eÖ]ZìÓ'MT¨ÅzºW%µÁûéžLg¹“MOªÅ0Å»½õõ³ëSz m9M[\&ïÖSçT¤—Uêž(êSOo @€‹æOèšÙzÙ¸YSK{±á._L£tf‰¼õ±’¶n#FY|ÌTlTjÇ:l¦%”ßߺ}˜ @€À X@¢'ÇjNw’Ú_ÖGÐ:©‡©ÉN'°ÓÉhÑa_ýõ×ÃèP£Htp†¡ž—®LÛEÍAŽráL_Vþ•ØQ`e³äi»4ÇÜ,GUí󞃆O1µ¥ÓÎìvk÷d¹ÅÜÈ¡/è”=-oW ÑÌÞ§7Io @€øP “<÷/J¶oý°ŒZ ÓÅ lùÅFïÔ¤O·¾DÞ=i¹s0ÍéëZ ­T¹î•C‰¢–×O$@€—(o5¥™·`Õ„Ò£tInaó»'ëûGHóö,]½.é =fyxç(»!uU"§IL‹i$¯jš÷  @€Ì8Êï]vØ5H#?èùÔ½}²*µAÑ$©åz f8—tëö±°Aä´D鮸ÖÓj™ìß¹äOQÔ§ÚÞ$@€>hÑÊÝ,YÒŽJ3ïC¥>?Pø<{ÞªEukQ:}´T5hZ©ÆÚå @€eùOL¡i“ø¬ÏÆJU3®—•Ýâom9)}eé§r¶R§›önÂJzvûއ4ª®·˜-Æ‘nÿn©Ý~¾E`÷öÌe•é(Ýî·vKá5 Ѓ@‹™]Û¬^¬úÁÓã.9Ì”ÈÛv`Õë~ãcâÒh´ƒMôÒãÓŠž?ß?åîרsZu1: @€¤´oLçÐ}„KZD÷ÚÕÌcõLKB–w˜X0a ¤s·cUo´×ôí]‹èä²ÂzêœÑ¹»šÐèOQÔ§þÞ$@€Z´Ð6BUí[{è}JzÍÑÍÖ?ÖÆßÉ A»žoçãq|`¾@*R‹9·W“w @€¬H'hß Eç·´;üdÿífá®/Ü»#hO¤~–¦Ö­(Øq@ Å¸\êÕmä4D-ºÀUËN[¬ì¸»²ÿÌm!é75¥Ã›¶$ @€NÒNxlB¬|§ªù4AT5'mƒ8ïD.VþSÕòÛ»âNreš~½*n~—ëáÏCÓ›²ŸéàŽXß³~Z¼I€ @ €ÞÊš^É!zwÑ®5ùÝà»ý,;ÍÀÎúën/üŒÑÈÀÎíÞΗ6ÚZmf­HXYuƒ;†S @€# ”/`L`â¶‘Ö¤$ö‘R‹´myÌF;ŸìZ^cÇuê•i‡[VàíÏÕ¨g:V!/ @€´ð¨kz¦è¹;ŠÖ)kôî¾›¤– ËÜ],) »Íù³$ô¶Ëä„1ÍÞENcØó²Ó$¯ÑÐÖ]íúðÏ!Šj™ÿœ‹Îg @€ÀÆYH˜†b9·ÙJÚ™w¦Ñ·ªÕ²{M,,¬W%,ïÊ.vÞkK®[tÓ‡ÎÞVž«*½ûva÷Ç‹È; @€Z¤Ãrè ”vï†D¯j'«Úò=Ö<Þaètó—…K³ý5Šœ>Žç´8ÑâÂzzh7³ì"Mz2`(Šú´°¼I€6H»=¡Ò4Ýo› ùs³ '*Ÿ„–¶ËBÄ–µî¾Õ4ÂÛ.ûwG.é&ÜÉäÏöîD]ýÙ¢ñ?"tž÷® â(‰É@DF™Æ"ö‚ @€Àq2z°} ç(-ÿ™é `WS+7žB?SéÕǺZvšD–D×Åm_}ø~‹U ¹§åæð…/ñˉ ‡MQ”ÜáÇ(êÆÕãÃúã @à¬yæ¦m–ÆDfã¼W…#o'ízsUzœ£ñ“\ÜFÞo‹`Íë³sŸ’þÑ+¢ÇîÆÆ—¤Ó ä~ÛâyUy¼O€ @`c…Û ›÷…‡Êlöªá…5%ž0na¦68T†³Öä÷éw× ALŒ­==×ã›Mçÿ?–HZtQsÌÇ¡Œ3Ï×Ö£F×àc•x|'cPÁì| ì‘×; @àiäw3srcFû·ÌT‹\»õ³ëÆiiwÖ=—¥»e%|÷\-*íØ“cÎoÒL|r{á·²ùî‡[´‡£×¢ßÍÚÄç›îîr²2ÁxÖÊí·éòä‰Û‹"@€ °€Ÿ@­êÎ £7Û÷ ÚíÙU%swœô”Ëëöšr×§g³î»ÈiÆïJ*ö¿ì´é¨ÎúŠ1}„Ü~3[»óq³ÇZá °¯@oiz­ù‰½í×EV%o›-–.Vµý6^ÛÛºBV±Ü_^o9ýrQ‹ŽÛˆp¸nì2ÃS~+}Ò5wà±xA€ @ sžô\ ;5I@d›ÞÄf1»*Ÿ„˜ß]0çòYãP2&°ÍQôÕ«§‘Óz‹iök ë±–ßœ:Öô3)VQÔÇÂõÒ Ê³2Ó«Z’ÛO^*Ÿc¹föà{÷¢j…ìÝaOðçÌ¡ßm1vÞ Ïu×¢;0(µ¨À'¨iýg!=ߪûð»×‹Ï @€ØE Ãý7Ô•Â!ŠZ8ÈsW1p9HRÛ"Ôµ²ß]2FôtÃÛÚÒi9}Íl1Ç~ea=’¶Ϲ»Ü¶ù3uŠcƒêô(é й@í³øÕ̱v “Õf!G+ïÁ•´¬ú_P¹ ”[_J°«F®…ô””…¯ì({Nù}Ì  @€ô/(R4;6ÅO|êDCÒшpɈDêRŽs¸KjW‹Iª¯b3«SÉZΙçZü±v‘ÓÔÉW©ªª«··¾•…u—Ô\·?Óëà‹¢Þ·?  @àâµ+7w‰Ú”7®rÀÂZ‘gIkª<¤[˜Ç5‡ª­#õöqüwÒ(S[þb› |ÞͲÏ? äþP2븼 9  @€mHJ«ø±©ìZÌàÍ釿¿Ì7ί¢Šy?ÿš~J>™žu¾µý&cUyoÑï^¿’qý•µÁŒñFÕ‰Èé!–¶¨QëëCí†(ªa¥ª»ã @€ÀqjW<¥ ¹=E‹öUaè-í’fÌáfxά é…•øÜ¤6>3/ï~¬dºé]Ƈ?×÷æÞÍ‹Ï/HåoWžV o @€èP ý—³vxt|¥J AùT­ò ŸðÙš–ìC5‚\“¶ñ»"§Ó1ßò•)ú•…5‚Œ/Z$²¼ŠV0—Oj‚(êXú^ @€ÀÕÊCWÛwyZ´‡§[toU’’iii±¼uÒc}¸Q³¼¼‘\®Út¿—Â:\žqŒ@ºÌ-:òU½$Ç!@€ °±@áf=(¹» Ò‰[¹Pºd CÓ­É ÑL¯1o±,b}a=^GIgöO»Z_>ù¢¨++ÿ£§w @€@çµó¦v‰XµhWEKV–í²òfõ¶Eø;œíär“UwìÜ5íO•S\ê€%ýå± ½ @€ pŒÏ_ª_ ³í3¬ò*È\ÜFtúªÓ‘Óä¥vdr¸®/¬ ä¬ÇÌýêjQÔÀf|2dQÔ‰ºáŸ @àLµ“ÊÒ"Ú§|ýlÚ%½¶4'Jú°§Ÿ‚[Ò}x¤nÚT®ªçY"ú˜ò’wҌϥQ•NÇ)È=¡ö–[RU„ @€@'RЋ)éz\ü -Jfh—Œ4*ÜË?scùph¢Ñy·¹“ˆ¢6ªK€z¨úQα«µË¤ñˆõ©²Ý¦É·cm u‹y†©“ýÓ%…í&+î2™aÇŠÔù©SÖ)‘ñVé @€éµ[X×y—AòJ2ÂТ—]2=û±Â¿ûNOJ”îÒ(‚™‚øpc·ÃA% "ÿL6SCZäåݲñç3 –û|›.>ÿJ€ž ¤UYû`MÄð鉚¾™¾Um.r´õ ã’¹ŽÆM‹cÁÁ5Ô·o0/È{£q†+b}5^#_yȱEÿ½ü¾ç€ @€zH/é±QísJ†bôæÖO°O|íî° þlñ»N% {ÌËœÈi£± cy—¢f®¸(êœ”Ï @€À±J¶ ›I{…«js‘줙·²K’´—çʼ/øz£Ey‡˜´œîÏx•¿HÓ}AqøJ¡@‹Î{y=q@ @€] ¤C½>\Uتw¨Cô¼ì´dw²ò Ò1h4Ñ7ÑëL‹¥š £6ÁÄF#]]Ý«ï“,§–‰ú°òûB v`¯•’-¦«ÍiéMñ]ûaÙŸ»¬äÈT»j±|8æéq·KsÕ‘õï†*—†«1‡ª’z÷8‘¿`_iٽη @€Ü ÌY¹önÝçÏ-P;À5TÈÔÃ’>uIÚjLjöœ¶ÇK‘í¸ìôéÅ•ô\3ŠšñaQÔ§U› p 4–îz(+ÿÜk~QùŒµD=—cU(°¤‰¾8±d­îcí­í\42)™ƒú˜÷á´W%Ûa'rh4ƒ÷UA{Ÿ @€Àùlá;ÑéðO·?iÑ«êP—ŒxFqå4s%Bù ^NÝɲÓÛj9¾¢¨Mwëóþ?DQ±/ÜXX^ @€Q ¶y¹Wצdß]Kcñý$1k¢·cáèEZ’wþ%¦v„¦MèÅ5ùt&2·Á’Úë  @€¤¯t©yÅvp‘¤’q˜»Ë­jÙiKFÞª "T£]’f†//²ìôiy?Ùo:tW;ù3—@ªÇ!8<-8o @€À5òð*|’¦° cš…¹5³Õ÷˜ß’)…Uó“×í;µUq¬{ôßrNn1ñr@È‘sü·ÒãÃËâ|ÁNÐx­yA€ @ …@={mrµ¬_à[ ¤#V¼«½UÃ2%sÅ«~–(VûFNS7ZŒ~,ÁÛ¸®Ž§KA QÔU÷®&wõ§(êX¼ @€þÊg|í•å¡·e›¢”´|.¸Z0Ú%twÍÂ3Ò½ªåüó¦ÄïR^øgU§o~v.øÉŒç´èV‡"@€ pPtë2vqÁ^†,Ïè|ÙiIg¿ªS_2Ûÿñ62%Eù ä˜eÃwsjןÉzÌ i¶{,©®ÞIµ±uƒ æ °X d ÜíÃw¯_yF’©­ÓªŸ‘]\ ‡þb‹.ϲrÜ…±QöÑ»`,~ã´UïíSÀk @€-_8ÄÌØ;#?]ªD‹¨Ó‚á WQÒÓ/ÙS«Å¢ƒ\éYÊ:ÿÂl1å8ùz…¬÷/E=MÙ«¦I-̨ݲ£°…9? Ã'ËgÐ-X´XC™?gï]¢Î?ߨדÆü!f!&ûµc2žëq~/¦óêÑgòÂÛ¨Úb¸É1  @€Z =¦Ctîú켜2U%¡É»‹bÁXЄmÉo»¬ŸݨßúVäÔ²Ó‰zrûOY—‘ŠÝ"Ð|WÕwÿs¯8·Ú^ @€ Ú¦fîçjúOyæ–?÷ßݨ¤U\2¥°)u»ƒ7jKe2[ÕÊå\éî­ï^µ+ès9åUï.¿‰9  @€3 ¤§c¼ýý©õ¹h4;£dëÓ6¡$6mÙ‹Úq¿ñ~’¬½5[»„b<ûðâ(£=Ë .c¢ÞwŒ»ü™›ù2ß"@€› ”üþÂísvlj å-±ð­‚È£ÿ–bÙë´ŽÞ:éÉ>\^ˆC)Eµ¤S“ þ[]˜“U¡m²“@Éõ¾ì.á[ @€®,PÞÚ¦á,å%Ýç»ë(½¼ÂÞtuwü¾;0uçÜhŽz Þfi”ŒG ïœýÙÈmA=,ÿʹßêƒÃ @ O4 ²0Þ²‰^ûÌ“}¯B,Ù5÷Ncþ¤ÖT’»ï.ø3íϽô:9oy4(…\¼dðÃd¬Y̘ú3¿Æ~˜x%Т“¾àvá+ @€.+.^aëUËßûÝ ¤ôÓÿ-¯ÿµƒ~%ãk~Ú©QèíÝÈijQ‹yòWˆ¾•lpW~™”ÐàU·wW #@€À´ÄÒÌȳøöŸ¸Æœïë3µÏâ5íº•n-Ïóƒn%Ò+´ý>,嘗´Äîr”ml3srY0n§Ÿuùaåiý¯‰nßÕI @€ °X ý¦£ôòZ÷S.xü3ZS£j#ò%3üÇsœZ|qMñÝë®d¸ì1I§Im|Ìõ9ÞɵvÁ»–, @ài¤e21<^Û”êA¬¤97>¾÷}¶h?Ïl%î9",~‘&eUbß4ä\ 8ñÅ•{Ýliòî%™‹._Ù2…×õvq˜òU” -[ —½Ñõ^ [Ý®I©º?\aéA£ sU¬9ΊïÕmÁû8œ@¢cy$eÉ䜦łvBç ÉþšGÞãwß„VèSž—änæ3½¤583P[(Öç¡Jº5ó@ïüå·™é¡ÚlPßh?V?ï @€ ÐB ƒ9ç›å¾A縧h1m>ãåµhb]Æü aA¿«Èi£à–ÃUøÚ}çW¹ >y Ñ¹ÃU &@€@•@¦o¥ÅõnÌkf(­*‘Ûç]„é'iùl½·Ê[sšÐi¶M›Ìù×”Â[9=ñ‡K<Íçe'ª˜3—cßk­«ÖÉHz~,û±Öy‡ @€ÖéM'`Ôºkàø=eÙi¬Jªý»æí"§ËÆjÇÒSÌ>tIýéó åõ¼C€ ÒŠÈ¢5ñµD4œ·ó¯¤ Tø<ÍäºóÛbÓ×›ˆ%Sé><ËŽªÛŸº¶NŽÕû@ÈÓ?P’«ÌàÀÕ²]Çs¬“^ @€ P"` ß ºH»Ÿ¢ÅXA‹‰Ö%cS™ÇûxbR%Ë]¯ÇeñÊ’±²ÇÄ\aÙéôˆÐ£ÉÞɘü[µÚ‡  @ µ@:yÐWÍw:_Ì¢ü¡¼ï$¢ª‚Û9àt-i½§¦Ïr©m4›4}¢5³_MóH}Û÷»HU´Uïxô‚ @€À!Ò‡ÒW:q­Ñ@A‹YÖ%q÷œ®"§©‡å£s¹ - ãî¢H6ko¹…£â+fÏÞÃÕF &@àôµÏëóÍfLkå³ïîëû> KÚ¨o娤ª‹ww#jº:PKû±c˜[ÙŽ¿)|W@'þ3ò¶ê½»ú“ @€À!tšNÜS+™¸~W[,;M”$uþðcú°%Sw8ù3‡]V£Z Í%=š¿ÌmøVªåcY,~g\ì™Õ@©™µƒäï¦Êà皊á»h!P;cçÝ}3Zä¨ü˜µ‘‚ÝãSµÍŒ´& =Ïýw› Ÿ_Ü-¯ ]°Q‹î@íÛ­~L¢Þ¦rƼüòxÉ{‡ @€vó£NÛô2œe½@Æ^ZôÔÞZÝ9?%ƒlóçN×{Žf†ª‡ºZŒçì>Ø8¿¬ùdùö€+\öŠ¢ŽaÜ5>¾K€µåó7jóUx´ÚU~i#¦mÁ¡JæøÍÅáÅ«íšKZ5šë èºúJ‰í]9æÏ‰PxWÙ“º‘¢]·)š·ŽÇè @€Z ¤ßw y³Ûôw}–µôµï•Tï™åÕaä´|vð¼È]^ nù§ 7Z¶üx<†qgVr#@€vi =Þ±×¼s¾@F"ƒk@¿û*ÔØ®”oœ§ÿc’V¾ój†[I~þ|ÂÛl^áuÉtÍÇ¢?xn_zsW¨?óó˜›Æfý…Ç é @€ÊLCß!êü“éhÙiÉÔÌU å¶á2Œöša=ËN×\PµU}æNwÛDQs–52¾K€jGÅ_ÅÑ%~›ÃÖ>wß$§EòéS~}ÕŠü6E|ij$ÊYÞƒÎg¶(&Í 2û±öØ¢Ò:& @€ 2áÙ|Ô½¤®¾R2ký®ò¤بb”l¢5gƒÓÚMäFŸÈ¬‰œZvºæÚ)©‚7^h9òtqLÿk£„o öcíEÉbÏ!Ššiç¹jÆz²àÅu ñUázŸ= ¬¼Éß=Î×êÎÓð.+ÿœnémPUZ´Ùîš‘%mx3`?¬ %Îõ9‡ýðÔ>pVÜë„w @€8±@ö5j2;k×iß|¥¼jGó†êÝt4 $Á‘¦ "5ºH}mìoÈfÂv Rrį”—lùØuFz—EQK¸G,Si&@€ÀQj7ÿ<åV«y–6Àš¶EgÖºòf[x{êõó ïx{p¯GFÝ¥ôhtœGäë¼H¡×> o›E€ @€@SôÁM`>Pï¯ÅTê¦Céo–TàWe”Ú[œ}Läú@[‹% IçDù•ÒAß/¯ííè†(êüA×õµë e*Ù8Š@ùCü(ŸŸÎÚÇtaÁÚ mËlÕ;’>¶6ß}'Þ$r< ¯Ze þ+𳾟ë·QOóÝkßç  @€ØKÀHþ!z|æQ7(ùu§LÔZ@í"§%«;ç‡Òæ_ø% {ŠÙᛵ€ÛŒÊ¦Næ‚ú0åí¸–£$ @àˆ¹QÏ:Ïùämíˆ i.iãÝÒíþplÑÒr¥™±~w”Ç=Ù;6ÆnëÞü×»×Ò“SÏÙÉÉüŠá“ @€œX ñ©ŒôÜ‘¶“¨›.;M‘•¤ùix·Å×p—(ËW¬ i»ÎˆM¢µ÷Û§µ¨Ý]e"ŠºM·]Ö™¨ ¾lüÚ¦Œj×dõ0™3ÀÚæGŽ64ÞJšÄ·iKý<_D¾°Þ6jŠÑð¤:To¹fk·%¿½r½&@€ @àˆÉ擽u^¤gh+l=”Wò1ƒiÑhÔ¥­©qî'%QÝ£\PåcŒ‰fî’÷ ¿¤ßV×ÖÝ.ÙtRœO öI”ÁùˆJšyc§©ª ¶Æ9Oí1=U/†ç~­Õ˜¶LB}Uâ·­¯Qlý à¯ÀÏñ~ÆCj§…¬¯rŽ@€ @€@'öûì÷ÕŽà •­õ²ÓH–ÄïÆ(ÚEN3Æ’ƒ¯¯æº+Ö'ïG¨ïJ=Ü=×cu¯0îî@€c d½¶q~¾çxí¶–i—öPCެ-÷¡½Ý4“Èìùj×úÊDmQG{õ{"ëìû ¤Øbíy‹Jè˜ @€ì%°…áý}ûnwgOW®ÅËò’:|§Q>¨5$²*ršÔ–„Œïè.µì4€wÙ_ùçUý®–ú“N °òés÷õóýNeùóún¾Ü.U¨ @€Û $îÐÃZ‡î”­L|í¨ÔP… ZNä®d°bšháPFN¶]êw¬Ê×\-ôÙ·i€mÌ;уXðOÄûÍÙ[²ò+YÌkl£Ò<åå¼ñÝc¯Ó¥‹Ý¨V¬¼`} @€# ¤ë}¾Ùò{õ׿Ÿ·E·n³™Ò%õ<ëÛENkè¥óRËNsiÔîÙ›Ú>ÿróI p'P²ÆØ"ʼ²»ãŸàÏ’Ér#Q'ûE”ïƒ1fp—)£+‡P)«1âÕZé'¸_% ÓhTÆŠá @€ð:[ö½ì´j§»òíàÆË¶6ršŠÑ¢ÞÉâfÕ>u~, ’Wܬ¤œˆ(o‡äIw2ºÚ-#ú™õt¾_BL£è²Á¾FSµ3w7«½_•ôV„ @€ÓdêòeûÝw½ì´ÑEÕuT¾ÑV£ü^íZ+g¬Ý–yã;€Ó @€Àîå³zÎ÷`ªš/7¶ñ:Ùë&K5Ç$éEâ}ç‹àϹQ´˜å˜Šqå%½sØûùLn,µûÛœé¶ / @€T dNxbýt…Κ’ÌŒ uU© Ç)¾Âoù­¢h1K¼Å€L‹t¾*¯NÞ¯]åÑÏê•Nx%ƒÔŽ·Ÿòá^Û êg£›Ú¢¯jÇ®?NHi¨_-„Ú(~ʽ¸Ü';ÿJ‹nõú+Ñ @€8«@ÂWëtoß+Œp7ªB¨9ÎfEVûX…Q‹AËòõ’C~¯¶ì4•³° s¨e½ýMÀ  @`_Úù`‰3î›gÏ·ð ÞO4ªQ¯ÐjÍ¡Ò/è'NÝ¢Z>³Q÷ä|ËÉéŽûNúÊ}ÍÕç» @€œ^ n½Å ú’U!ÔŒþmÚáUßÚ‹(+Z„k\ Y¾`à¯|ˆÒùÍ®w'"@€À‰κ-ma‘•?Á[´Ö–å·¼A›ÖÆšW6•Óˆ½N{©üZðO9#bÙõÒÛ·2RQ~ ¯¼â| @€K \pß§]:†+C¨é9n6•%“^"§å†ÝՖ暪ݳ7Œ›Uø]nNJ€› Ô¿Ÿo¹_¸µ ¿~&gÖ®;”ÂË]­†K#ù"¿ÝÙ(r}¾‹z³»k£å¦TÞ³¨½Ë9 @€Ȅۋô¸õïæ6=Á ã,ÄÛrÙi†¼z«ù"§)8ËNç×Þ‰O–»fÀdâtþ‰Ì¨„?å* ­Â¶ß–­ÖéjÐbB฻HÌ-š‘‹ "ñÜÓwèR  ºQ’n9IuºÆúפwue}X|€ @€Ó ˜s»YwõÝêÆ=ú³ô×\>É~fø·(ËN«TËî×Ùƒ®ª‡^ ”?î_è¸ï×¶ýøè‡¢ÅZÅ´äÇ †®E8oqË9ù=÷þ'µuutÎaÇ2õb/¡<Š @€èG ÓÎE©öê‚õ|Þù!Ô»ó]mDÖ.ršºÑbVó¸¡çºWž¶ò‘ÉÛaÉòÔ: \J |ùa?ÛÒV•c–zÕöGú‰ß¥kS›µí®ežFKyCheš“ž³6¥’¯òhuhqÕÍdñqr©Ö._yù: @€twú|1#™È?m<úÑ"¤øXÍf¾Ó.š_¾eÈQ?£… jãâ¯LTà™}û±SØÖ  @`½@í˜ü]ìl}òz8Bí£¼«ÞDù´ÀX=YZ€å'ºm½û:‰LEݸñÈÒâÔ®w5&>Ÿ@ó5[ï-Šfñ1kËt¢¸ý @€V ¤ï¯¹¸÷·à‹!Ôè’’••§ðëM÷nm#ÎðË‚Ò?úWìÙ{ô”~œ^ ­©ÂöIB±ç;ñ/ö˜/÷ªÚÛÏ5&„ÚU »êÂ)iƧÃÛn–fUNOœŒ9ÔNn)¼Õ; @€ž ¤¯ýjXàô¸½2øBM)lÏç|OüÚ¦QZ°›îœ•ÄÚn›¯ÓôÄ+#pûù}_'ûMÛÕsŠ ö3+¯è€¤ËS›$G[ ÐÛ•²ïuêì @€K ³Ð2ô×|å6„ºñ²Ó$»viÆâÚÞ:ãåchÉé5—¦ÎÔNF®¹²|—®,°¸Mòô‹' E¥b$ü4§‹ßì*8Õ¢};Á¡=¿X¯ÅÓÄšNó±îË6IN«õ|ï± nHm.e%ØâÒpL @€,H3“{Ø);tš‡!—üã\”¯"\PëZG!k×VŒ<ß"”9uoåÌÿQo|qÊÍåæHú 48ñ¶´UnµSËZO„{+×iQ×ÎõJ»eN{5ÃÞ"DIÏ9B¨ÉÅØzœó" urû¾Õ[õ"N÷¡üzœS|† @€-t6/Ò™ÝýGgæŒD­,‹Ú±ÁárÛ Ù+sÝèëåK9®ƒnT:K€£@&ç¶3ò?ù4/jŸé½m%‘¦Za5³Ñ’0_‹ÆçšìDcfâ{®ÞóËôùí¹,f¦-ÁëÚy,k®ß%@€ @€@•@†‰,AÙ1<îǪj˲ãd2|k:ËNk…k{h­µr4ØQàÓÏŸ–5N^}+Ü1;-N]¾›DWá¹$æUQ.~?áæùÑáÏ;&¤x蕘sÊ4‹ó]ªók]WŸ´àtñ­Æ  @€8„€_AíªZ›˜w÷¿ª­± œm0€Sì2ôT[G9Zù@´={RôÒI€# Ô¶Þ œ…«¶i×ÛK–ï ›™¥oµ]óáÚå½ëË+YH’ÞÊEW•yÂ3=‹slPÜø²Ä¤‚Ypºþju @€ú°uY·±ÿoÕîh÷VMÞ&rjÙim%œ°z«ôÇwµD¥ÖÊÑ @`wù›|ަ‰§Ü-¡6ÀÑÛì²ò¥µ© Äi픇q'*êœJçî Ø•Kâïò˜i Êe÷ÔY`Áé]ýô' @€§°õ|=ÜòXØÌ« ƒÛDÍj—œ ¹ëm`pËjYëyÊQè-‹Ã¹ @`Z F€ @€ÝÒ?Í0Ôîý2 ¨Øe|jÑ6?EdÙiU=ŽS¾go»jSèh @àV !•ÚÆóùšÁå÷mÚx·¥<ýºEkpÍÞ°‰V§%\[-W툻Ý1ñLh6®ÿ[þk‡u{å¥áë @€xWÀÔ-û¡MÏõnѯÿüf‘Ó¸•¯5Hö¯¼ìôvžÿúš#ô6¾ÚôZspØE vžØ)›µí¥ÞfF%¸V¬L¥ZS™“¤ò6Õú†Y2µ&(¼dÁw“Ôm6±Y¶ ~¥Ã©×_Ž@€ @€e…8â.OìÌNd¹|­Áœº´Ù’ ’Á+ÔÔ®æh•Ó? @€Ú(Õ)^‰ÏiÂÍüÌÊÀbI¡ß¤¶ ë„}Æ›RÖgíÎߟç°àtæ½ÑÇ @€¸”@†Gô¯Ûn^œ¸¶ ¸×Fú†Lr½ÉÌ œ+}¢düSo+Sf:øK |ªØù¶M8ý/Ö·aÒì©jvøC¨Cîl‡{¬Ý.©Í••Ñ€½_!@€ @€À²5ÓMwé¯9éJóð'êü–‘ÓFqá+OÈe>Q¸ þé|ƒÏ+¯G_'@€Fµ»¶ž¯Ý›0Ù‚çøÄW6Ûfd~…©]]›¼§R†Óp­­¥¥3óŸ’žô ó8¿°|ò¹öVigÖm#@€ @€À–– ¢“{—È-§ WÍϿ˫?-;}%³øýoÿøVxK9嶇‹m}‘š ÔÎÒ|jšÚ]^û”߸Õ7G, < ›1áj÷ÐH˜rãis@;ßl9Æg&,8síø  @€Fë‰>fŸÿ´ÙláÇÐ,;-¯oåûÝÕŽ7–ç×  @àLå ƒ3á y© Ûõ9Eª6@œP‹l¦ÅõõÛ×±{ÕÉ‹ä4Ñùª½-H0½“j) @€8–€%¨ :¡»|¥<öª¢n9 fFx^%fñûÛçb—Zñê¤åã$nè÷*ïÞ'@€£ ”·yÎ÷+ÿeؘ÷VmÊcèiU6 )fly¨wqxüb’”„õV¬Ò³™@îV˱~zA€ @€þ,Aݬ»æD-¶/{¬œéboücI-FÆ’¯Ç×”þ»ß­*É-âÝø<X#Pû ;åþ µ’ô¹×kmÓ>lº‡sÚ´å ~l«¿ûN²,„ºæ^tÐï–O¤|·âù< @€N#AªLO=h÷ð ɮݟíi½Ý>rš‚³ì´¼ö–/عø2Þòr@øP ¶ÙÓb¿Ö³Ðúµ»Åæh­¼àøµÕ`hý6íïôùC¨ÉxÚrŸX¸ úô+œ>íçz“ @€+úœv~Юkm²k‡ÈëIÆ7^sËNk+Ép´rÕóívØ‚Ý1  @ P |ÃóEŽÊ÷…ÅWu¨4M›¬+ßÙ`JX*[ëvû2„ä}ûÖ~Uepœ9œ.»4|‹ @€s,AÓ3Ýþ3-VhŽõ!›Œ5‡ÿŠ«E¦6{•NÞ¯¯KÝè$_’A€—[)%/j<™^ùF}nîšv]I¸=È6‘ôxÖî>}›…ůӮËz^!Ô“Ý ’>ëÛâŠê‹ @€èV@·º·>uJ¤Ñï(í9-_11\MÛ ˆõV=Æô”¯ÑŒm½ @€-jçåh[&~›sÕÆæÒÔÜ&Ùo%³ûÊ»K[æ4ÍÝF ø5,I’í†Þª‡=8ÿTé5õÁw  @€ @à-¬ ´]gW=å¡k\>³×BËN[Ô®ò´›@‹brLøP vÿÉ4Ÿ><ãá>P1I(¶O_ÿþë[]˜?¼qeè6¶•¦øùVd÷Y‡Û¥* õò¾á‡W @€ @€@2QÿâKùÚõv—¹6„º×˜IyŒo¸ZÕÕÚu:QM}[VQ}‹¬È3½¶)¾×l±5ÓßMܤ–¨ÏvT‹Fãö àØ–7ÒJJ?Aóó]ÓÎ9þ55ª|^AIr @€\G ÓYíìÔ[/»$„ºýÀÑÈhÙéHQø"µ¢ö¾tÊM ÁŠš Ô¶¶Ü¬µ)ËíÁkŸû;¶ o3õøº¶&m¯e¶Ýþ0eÂpB¨¯ÛwÒ7·à´öîçh @€X,A†üêP·]Èk&lMuÇ!Ä+R±û\.±eÍ,‡ívuKUç"@€½.²-íÞÚÅŒÝNšªÝÃyè í+LûªÏÈW~é^szÍõ¸Áw»¿/dðE @€œC £X¶ñÜ _üÖ)„P36òÖ)j?\¾| ×¾9ªõY|´ ÔÞg\ì‹Ë  @`½@ù¶´ç{®ÕFÑ[_j-Ž‚+6î)ZïµÍ¶ª£iT·¨ÃëÙs©ª{ŽC€ @€C $ò•±¬õ@G¨:ÔsF–ö)_9\MæÉ§:Í)ýù7Ÿ}k¯G#@€# ¤m3ÿ±5ç“çÛQ!ÛÂÌÉøüÏt»ÏLù ±˜ìÞzLj×Ï/è§ŸLK2λ³ñfÕ:Íé}×¶óŸVo @€ @€Àzôôõ¬[w“ÿÃê^¿ñ4æÅ²Ó‘¢öEùòœó0ׂ;l Ÿb\ßj°ïü±F\µ-«ÖaÚ'ýޱ«^t’ÙlÄZ[Ïø¤esúÓ¥à_·HÍß½z,¨Q¾B€ @€+ dúkzÙÛw!ñCW!ÔDN÷±ìôò[üòûV•žH€g¨Ý–6¢3á y©mì>Ën¢€ÊCHéËôÓÚI#¹6>³—U{ MÔº}ÿ)7@ NgÖd#@€ @€@océvƒ¯}{»»Ÿý.„º{ä4 -…N¹ŠdAå©ZÉHÚ‚4ø ¨¸Î¶´‹ÝÊ·žè'žxg’šåý ®&‚Þ5ÝË3{wÀ4¡uâîêX?¦¶§ïvWdþ$@€ @€Ã dÛ«nGZúéï’’a&QËÝ·Y¶ì´](8íj,±›# @€@ÿµ³ƒÎ÷€KK¯¶ãÐó:Äòix9`o—@Z쵫‰ïªG²¬ãÖ[¡ß¦gè»Ý•š?  @€ @à¸é‰÷<ØrÛ'õzòñ®\,–EY>ȶ{¨}—*ê¤ С@í3î”[+ÔîgÛsãªÅL¼>û/-~5+Øá5.I£@jcít‘ãŽ-H9 @€N&ðõÛWa—±ÿëÅ(Ðb°+׎Ê6צ3¶6œ @`_ò&Äù6KÉBÂÂEû–øÄÙSvå¡¥žãé©ü%m¼Ä€õO» ¤SS; ¢ðžàP @€ P"1óm‰¶{‡úè (ù¹«Ÿ=¯ŒØ²¼ÊÎõ»eñ9L \j[ÚiŠWÿZÞèù§0k#ÅCÛ²çÉxÃ&®ËBÆùV¸zÎÝ«*}µ÷Óö^VÄw# @€ @€@ÿY¼ÖóÀËÕºäûæ·|ÍÈPÿ ÅZ>ŠvßëÅÙ  @àN ­Ê¦ož›wÇ?ÁŸµ‘—ž§Q¥•RX†Cõ?/¹N"çg<³Óü>ß"ë\ªwYÈŠàÚûÛüJâ“ @€ °£@†§tÛïúÈüÓ²Ó¦…^ËkÏÞ¦…åà °@ všPž› ÒÐùWÞŠ¬}Ø5ÈÏpôœßÚ̇è°Ìù!Ôlýj‡ÞžkT¹5ùëÛ @€ @ Ì„ÏÌ籟èÅÕ,;mZâå;õr=NÓ"pph-`Pm³ö|{,”7·Z—éšã—ׇԮµRÖçÒáJ$î|{M=éù»öé­½¥; @€Ž+`tÏý÷¦i{ÞY_3:Ô4Í:xíbœݶTú’J€ë\g[ÚeeZ¾™íç/Ÿ—¥d›o•ïtz¬õÈY´˜àpQ$å‰Äbåì6u£ó³$ô_^{×÷­ @€öHÌK×¾ó}mòÊ×A ؼú±˜jcÓÇ9¼ @€Ó d#ÙÂFlçÛÒ.+ÍÚˆLç+1[´0sÌeò{}+íáÃ¥y/«Λò²OoámÜ¡ @€ p2Ì‘Îìè:°Ò°@mho¸,; ®|™Iç#¥cƽ @€« ¤õXØ$Nsô|€µ›QôÿèåÌì“s¾Z!GäV»|¾ð~èP @€ Ð@d²gQ'YÉh$ÐbQ@ê°e§cyÕŽ$ÇÖž½£­ Е@ù|¡ó5DË ´óWm°xè%¯Vtu_31©Tåþ~:õRB€ @€-²gZçÃ2×ìãWåºÅ@e§·¥S»A_Êëöà^ @€®jÛ§Ül¡¶¹ÞùÏžæ§@jó›£igvuÉ=1éçÖî7^^á @€º°‹ïч^¥ß²ÓW2Uï—¯Á9å0r•¶ã @€Àîµ+ ûß–vxm¤¦ÿ†A‹_4±sAÅó•;DöË÷‡é¶;/a @€ ÐN K l“u×é>úŸµËC†ºg9Àm­(“q ÞòzM€½ d!dm[4ŽÞò¸2=µmƒþãËù¹Ú*‘£õ2^YI|½µ@îT-úAåUÝ  @€ @à(¿þýW“½[wç·9¾e§8×îÙ›5à¤Ù) @€ÀÚ6mš+kÓáw˃‰ýÇ—Ó}¨­iõŸëëž$E =Ùò Y[½ @€Ž+9ó†,Ž>þÐbºµe§·µ¢|Ï^¼·¼^ @€@Ÿµ‰S>ûû+ìtþ³§©¥åë‘£w¾¨zŸ—ó™R•Þkí¾â…W±C @€ @€Àizë¬æLýýÚ¼XvZëùôhµûòåÖáŠ{êìMèJ öñwÊ]jãˇØÃ¶|Î^ØUµ—˜ÎÒ÷©´pšN½Œ @€ @€@ þdó±Î;Ë’÷(P>„•Úuʵ!tóßùúíkáEwÊÑãù˜>I€G(ß–ö|MÍÚåoioô_7jCêCûÊÁ÷_î=¤07Úé …Í{‡"@€ @€s dÈ.¾= ÌLCÆZL½öc¸·þ¹"j¯z±é[^¯  @ gÚ9Z‰»õœÙiKÔ¯°‘ÀЂ4lü•´‹ÊŸ‡ˆoììt·öé-¼Ï8 @€,Èxˆßºí­wþzL(ÅÚ»+ñò‘íÙ{'ìOèV ­‚eíɧß:Dpð­²(ŸaõÖÙ÷úpm­ªŠ™{{•fÿçͤ‹ÂžÎÓ[“7  @€ @€ÀLŒnÙA«ÿÁ„1……!TƒW£êð¢vÏÞ\€wÇ÷'èV |QZ,ÝfvYÂjÃ:‡h†%‘3;ó?fòÞ²êwîo¥7úíßæ×"Ÿ$@€ @€Ûdãc8ç7˜Ÿ»õ!T#WwÚå+JlLw'ìOèY ü9x¾íj„ñ(s˧–%}¾ÀzÏ—vçiK´¼ŽmÓ}v @€¸ˆ@†2²W’ÑŒÎGn“—ÂÊo×.[!V~+™×å+nì‰}'ìOè\ vå×ù¦i%G…‚£—kìu<ßOâv~i÷™¼tdR ¯)‡"@€ @€í‰ôés„áUª„PÏ7žù gþûå“ÞÍC˜ï“ Ѓ@fd¶0ûço=dª0 µ>9ZaÚš*EYX1r¨óÕ¦þ§L€ @€V ä§>ýü鈽ò˦yNÕ²ÓÇê‘aœ•ËÝ×-ß~Döô/P;•èd»³Ö—§4 ;ÃÏ‚÷J‘ò§ù)ÛÔíÂzâP @€ @àp^³ÝÖÓqoE #<µ×={RôÒI€OÊw³?Ít»Ú„=â/¤W ?¢ñô<î›)Ðòí\j[éŽF€ @€60iü¸CRÚõ5¹îN3D¬z @€Àej›‘§™VTÛfÈÑŽXÁVîÅš5‰‰Î1ãÒVŽÞ]ngÚœ°Ïò’*Ø@ ‹"ïpkþ<â˧ȵ›‘4xº,‚œ°ZÖ$š`ö´^ýͬG®mN¯¹Ûø. @€èP cJù5¨£HÿuìÙ{²–S˜/EdµíÌslÐZ!JÈi~‰ôóÉå[u#h‰·ž£ôS ¤$ý¾ÚŸÁ}«jù0 @€8–€‰å hHƇËVOL\‰Æ~xR @€ ”O.:h ð¶˜ÊMŽ;ápæïZfRå Êý¶x= dqíBì‰Öµ"@€ @€gB‡¼èV v IŽÖmN%Œ¼%PûˆLœå­³wøáòÕ¸ÇÝÃöÃ8rz¦“uX‡K’”z;3z~¦Ž­¼ @€ @€Bü¼QšìÓU2Rá åý½{-ôÇËÊaN P9n¬p(ÍòíI]Iž®:LË?m¡£ô¡Ë¥iâÓ§+¿-¼ÛØöy @€ p!Ô¦ã¾X | ‰E‹Ë  @ 7Ï_>×¶E=Å([ìÖj})î]õHdÙ½½]Â…éIØ4Íæôéj¯G#@€ @€†ja/Þ¡¬¨]BbÏÞ•Åáë Е@Â%µÍ×C?(¿~ûZ«qèPòPQ‡#sÜoíêŠë31¦µ¾£ @€ @€§f1/½Ï±‘«¥*{Ê=­¢‹ß<Á(èÕê€ü @€À´@í,£7s´Î÷­m9í?ïc¹{qnaÓòÛš @€ @€Ö¦ËƪB¨ç´Ù+wÙ-°¶Û³w¯¢t^Ø@ Ñ´¬iÝ ñ N‘-LíÖ;4?ì²² P|¥P =¬ò°¨mZ; @€ 0! „Z8NâP£@~`w¢Ö½ûOöìa½ @€S $˜øîÃqÎçóípš\ù «; »Uœò9J¦†°i.½»jéO @€ @àp™üŸ¬£ JHgç5ª½Ší<Ë’G€V 4úõ϶ŸøiRR;½êi{òӕUÑ×— ›>½½I€ @€Ž. „ºl¨Ä·îÊW”ˆìß û“Î'PþôÛ¥¿þý׸ò¬,dz촇²¾Z„MÇ» @€ @à¬B¨Wð)Ïoù¢’~–Ì”[9 ò°k[Üwýi~zµé/œÞ¶É»ý™Wõü”¦·WŸ× @€ @àôB¨§áÙ&SµW‡={·)5g!@€Ý²j²öz{´ÄO7ÞÏ6q¥,§Ý,lšÌfqëî…(6½½½xM€ @€.% „z‘ñŸÂl~þò¹ö±goaé8ô,àfí3ôîhYÙúÓ_~Ú@ Ùf“ÞÛ &w‰gm;§¸¸€°éíuç5 @€¸¬À0Ôf<êâ#E3³_¾jFÅ›)ïc pòÇècó5?Úh j›àl–¸>žtƒw2}ë@z6ÝàBv  @€ p,!ÔžsúI[êIaŶgo?%+% °@ëŧã3:OتŸýôó§c¦CŽ46¨œW>…°éxëð‚ @€xB½òÀчy·gï‡D>@€¦6X|:6ð²J4ûë¾EM )_ɳˆu<ÔŽ/Ò:µOÅt¥ò¯‹„Mw¼´š @€K@uñ̹¿X>ÞÛh_Ás—‚Ü @€À¡6[|zÛøLÓ.‘ÐÄCó_¦B%6zû_~<ïç)ŸÏüöÏßn¿ØÃë,}=t‰K|Ÿ¦=\ÝÒ@€ @€' „ÚçPÏŽ©ªPÍr˜óâÔ @`/D*×,Ü+Á ìîULÎ{VaÓ½.gç%@€ @€§B=ëÀѲ|e¹JV¦”DQójËÒà[ @àè%OÒÓ´6_e$Q棴ôw% lúêZó> @€ °@@µ«‘Ÿ“=ô2¤¹fìמ½=”£4 @€À.Ù5wA{ìR_Éd­]ŠÆIO) lz©»‡Ì @€ @€-„PO9š´2SË¢¨öì]Éîë ptò_ß²MØú\"§G¯Þý¤_Ø´õÕêø @€ @€@„Pûê*%‰¢f'ÞDEç\&öìíªì$†¶HL'mª9Í«}FätûÚxÊ3 ›^íÖ!¿ @€ @`w!ÔSŽ2•d*ûñ~Eµgo µƒ @€À¡2ïh÷]o 9=t•î$ñC[Ôä„Þ®né!@€ @€×È—@X'#E½%c¹úõï¿Þ]ù¥ÔÞ’*= @`L7º{J^ùÏüœú.¥à¤§Hã3}“+_DòN€ @€ô#aЬž8ÍÀ‹ŒÔ dÛ´ÿüã×o_‡kh´–×Ñ @àÐãó±ŸvÝö)É"ÁÏ_>º%~_þôƒ°éöW®3 @€ @€ da.ö9qöž†(ª¥Ê=—‘´ @€ÀÆy8ÎüÅð[bý@²¯m°q­;ÓéÒûxÜçä ×‚d @€ @€gÈðE–žiLF^ @€í®?ÍjÁd¿­#ŸX =Ž‹O<8kwR¾ @€ @€ÀYò»–B¨'­’5 @ Pà‚ñÓ´íXRX….u¨ô2RÎÚ’/ @€ @àÜÖøé/?YPp©á,™%@€¤½”Ÿþ©¼~ê% @€ @€D ƒ?üé‡|œŽ pR³84SÎÒdJès~¸*Îùbâ°ikù ÓCwÿ‰L]JUÔ‹!@€ @€h-ßùÊÀ`ÿãERH€Ø] Õİÿ³§ÇîEs⤭n‡ÞÖ}"Ç'@€ @€Ü d1…ŸC=ñ˜›¬ @€K ù´Ïç/y¾kÞû“ @€ @ D ?¢”%ÇY’Z @€§Hkù|š(!@€ п@vèM;¼¤=ï  @€ @€åùq%{ùö?È&… @€‡øîߥÕí‡MË»3H€ @€h!Zú寿äG—=$%ñ @€zH;;ôúaÓ½Ç$@€ @€´øúí«½|{p“ @€# ¤]m‡ÞÖýÇ'@€ @€l `/ß#ŽÎI3 @€@Yjj‡Þ ú,NA€ @€Ø^ ;Œýð§zƒ’ @€ ¤åœ\¶o´;# @€ @€À–¢v>L'y @€; |÷‡ï,5ݲ{â\ @€ @€~ÿ×ïYˆúéçO;L95 @€~²Ô4-äÚêÒ@€ @€ °—À·|ûñÏ?f‚}?ÃVRB€ @`3´„ÓN«x¯¹ó @€ @€ô&…¨¿üõ—ïÿøýfƒTND€ @`_lÃ’¥¦i ÷Ö8— @€ @€N~ýû¯™x¿ï(–³ @€h*oÚ½´À%ƒ @€ @ s Q›Ö98 @€À.Ùh%Û­XjÚygDò @€ @€Ý |ýöõó—Ï» m9) @€*KM»íqH @€ @àp¿ýó·Ÿþò“_D­»s @€mÒ‚M;6­ÙõÀ%˜ @€ @ /ûb!ê6}ÎB€ °F ­Öl¢Ò[  @€ @€Ž.`!êšq<ß%@€h'0üª©¥¦GïqH? @€ @àˆ¿þý×üzÔwø®Ýð—# @€øP -Ò´K¿ýãÛÕÒL€ @€ p&ßÿõ{¶óýáO?|8¨å @€jÒ M[4-Ò35°å… @€ @à¶ó­ t4 @€WÙž÷§¿üd{Þt"d @€ pz¯ß¾fÛ´W#]Þ'@€ °X íÌ´6Oߢ–A @€ @€“ dó´_þú˧Ÿ?-óE @€ƒ@Z•¶ç=YAv @€ @€×øöoÙTí»?|gè @€À[iCÚž÷š¹&@€ @€œ^ ‹>ùüÖp™ @€\S íFÛ󞾃 ƒ @€ @€¿ýó·lçûý¿¿æ0 \ @€L¤•˜¶b~B³™ @€ @€À¥²ïþÑv¾ƒ‡þ‰ p´ Ó2LûðRía™%@€ @€ p'e¶ó½È ¨l @€²=oZƒwMD @€ @€¸¸@¢¨Ù¢íÓÏŸ‡Ô¼C€ p2´ú3µ=ïÅ»²O€ @€ ð¡€E=ÙШì @€FÄL3_.í½Û„>@€ @€ @€À­@~ôê§¿üôý¿GÛ¼ @€8¢@Zti×ùIÓÛ¶®× @€ @€– üú÷_üóßýá»#J3 @à²i¿‰™.kû @€ @€¾~û*ŠzÙÑW'@€Ž"˜iÚli¹}غó @€ @€V üþ¯ß¿üíËç/Ÿ2~( @€‹¤…–vÚÊÆž¯ @€ @€ °@`ˆ¢~úùÓEF#e“ ЧÀú!1Ó´Í´è|… @€ @€ZßþùÛ/ýEµÏÑT©"@€Î*ÖWÚ`i‰Õ6í @€ @€oÿøöÓ_~úþߟuˆR¾ @€» ¤­•—˜iIóÕA @€ @€l Šºû°ª @€'b¦iemЖs  @€ @€Zˆ¢žlØVv @€ÄL[´Q“ @€ @€À¾¢¨´: ph1Ó}Û®ÎN€ @€ @`!ŠúéçO‡Ï”x @€@ ´‘~ùë/~Ït›v©³ @€ @€èG £‚Em1îê˜ @€À±ÄLûi£J  @€ @€}DQ5º+µ @€@•€˜é¾­Pg'@€ @€ гÀEýáO?T H: @ CÏ_>ùÛ—ßÿõ{Ï 3i#@€ @€ @ Œ%fD1㊎vJ @`™€˜i'MMÉ @€ @€ pPQÔec³¾E€ô# fzІ¨d @€ @€èV`Œ¢~÷‡ïú • @€ÀS´X~üó_¿}µ7o·ÍK #@€ @€ pŒCþô—Ÿ¾ÿã÷OÇ*½I€ØK í“´RÒV9G£K. @€ @€8À·|û寿|úùÓ^¤ÎK€ˆÀú!m’´LÔŽ’T @€ @€Î*`S_× @€ÀÆÃƼ_þöÅÆ¼gmaÊ @€ @€ØÔwã¡c§#@€—6æýõ￞ Õ$  @€ @€\Gà·þ– ô²Þ¥Fte–h!0lÌ›ÖÅušRrJ€ @€ @€À)†M}üóÙ^¯Åhªc @€§6æÍ¦6æ=eQ¦ @€ @€È&{?ýå§O?:å¯L @€ëÒNHkáÛ?¾i8 @€ @€ @à"澟¿|^?Äê @€À Ò*Ȇÿ6æ½HSP6  @€ @€x*ø²_6õýþߟ`àW @€ùyú§ –ÀÓF‚7  @€ @€ pelЗ%'–£ÎsöI p8ü’©E¦WnïÉ; @€ @€ ü:êáÃ%˜L ¿dšçû‚V¯ @€ @€ @€À `_߉hÿD€zwåÍÓ\Æ @€ @€j~ûçoþ¾Ùñ¯ç±bi#@€—våýò·/yj×6 @€ @€^ ûúþð§.;:-ã @ <‘úËOùùòWnï @€ @€ @€Àþ¾°ÍÞ€ýŒ!K 8½Àð3¦_¿}µ+ï § @€ @€ @€À»Ù!0û~þòÙ¾¾§±—AØE OØÿü£]yßm¢ø< @€ @€öÈÎùTûúî2´î¤ p2ZaÚaëE’ @€ @€ °€@êáö%˜jL7ho8 @€ @€'0R¿ÿã÷µãÒŽF€ºÈ“îÇ?ÿøåo_ü†éáš+L€ @€ @€í~ûçoRÎÀ²@jW£ýC€‹Æ€ižqÛ?X‘ @€ @€Î! ºx Þ  @`_O?V˜ ˜ž£M" @€ @€èJ ƒÏ_¿}ýé/?e8zßñpg'@€Oò„Ês*O«ßÿõ{WÏP‰!@€ @€ @€ dPz¤þð§¾ûÃwOG°½I€Z ä”'Q¦¿þýWÓ7Ï”ayé5¬rM€ @€ @€ç)5Û*®?w¸ˆÀ°o¶ˆÏsäD¹ @€ @€ @€wY”úË_ùñÏ?fÑEÆÿe“æä¹§Cž6ã½{tú“ @€üÿíÝ1NAà3ä ¾‚¯À|…Ôéè‘Ü¥Þ:]ŠÔÔÔ¾‚ j$wôù¥',“B»xg÷“,dˆ³Ì~Þy+ùgÞ @€Ö pz9eIQÚ0fy‘¿I¼†KHå¯å¥ù»šÜÖpãsŽ @€ @€ @àƒYj4<Yv´½ß.)p. ÐRáSçSí-/ýàÍÑË @€ @€ @€@*K­u©íSwO @ /Z[*-ug'@€ @€ @€# $KÕã·¯ÄÄh X¡@ëÄ›Š}|>Žxp( @€ @€ @àùL¾²ÔݰÛÜmV˜P8eÌA 8u8]²o©´ô÷,?'@€ @€ @€_)pz9åsû|zoËÔ9„)Æ@€À‚jÓÒýÃ>U7µ÷+K½ßE€ @€ @€|N Ÿêç³ýd©ÙnoÁ)†S#@€ÀÔµii¥¥Ÿ+Èþ @€ @€ 0+l™:<Yšš@›ß©£Ç'@ _TÈJKS3S9gUÉ † @€ @€˜H KSÅ©ýæ;FN€À(çQiªâDõÖa  @€ @€ @€îÄ©£d1B€ÀlD¥Ýݘ ˜ @€ @€ÌG@œ:Û ÈÀxW@T:Ÿ»‰‘ @€ @€ @€E ˆSßÍk¼€«ˆJyÓqR @€ @€ @ /ó8u{¿½Jhâ— °6T››Ÿ7·n³wsªP_eÓh  @€ @€ @€õŸÉ2öûä»a—€cm±Žó%@`DÔT’–“¦Â¬§œ:S @€ @€ @`‘§—S[£*Q1Wr(K¸ÈIS7Y @€ @€ @àµ@%ª¿¿³¦ìû¯ïÉM¾ýø¶¤$ȹ ðOÌôÌ÷ÌúÌýT}w_—G?!@€ @€ @€”@’‰ê?#'?$ÐÀæn#'UÛ  @€ @€ @€ã ž­ñoV«%ŽÙÞo» ’ ˜ÀR2%óÈÜÌcx2[3gÇ-ŽF€ @€ @€ ð®@bš<öû¤6Õþ7‹Ý–Q9/WÈ_,´e¤™q5õÞ¡^@€ @€ @€ puÚS5ùN­†Û »ä>¶U½bôæWw!P’f¾ÔÄ©„4³éê3Ú @€ @€ @€¦8> ÕΪIˆªã¨>À]D{9Š@­!mv32#2/¦˜nŽI€ @€ @€ Я@E«É’ªpÒÕZµš¤i”ÜÊAL-PÐVÖ&¤âÑ~‹’‘ @€ @€ @€f+Ð'“ªÖ¦µ×j+m§Ž¿ÚêæbËUW—_­M6ª¹îl‹† @€ @€ @€Ö,$+Ö8!W X{mî6B@¹*jÅèy0š+§®¥|]ó„rî @€ @€ @€kh]‚“޵¥¬‰ÌZ¯àDi´^äŒ]|Û–ˆ^„¡­‰nÞqÛŒ®aŽ;G @€ @€ @€‰O‡¶±íÊZí[óµ-]lO¶÷Û.¢Æy2zM²ž´D›yÞ…öŽäÝ™è}wX @€ @€ @€¦8O`+ø;ï0ÜbÁóVÃâßN×”øu”ùÆ0Ú?µ½AÛyåI‹;Û¹çWšc @€ @ ¿/:`t endstream endobj 17 0 obj 261794 endobj 18 0 obj << /Length 19 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream x…UßoÛT>‰oR¤? XG‡ŠÅ¯US[¹­ÆI“¥íJ¥éØ*$ä:7‰©Û鶪O{7ü@ÙH§kk?ì<Ê»øÎí¾kktüqóÝ‹mÇ6°nÆ¶ÂøØ¯±-ümR;`zŠ–¡Êðv x#=\Ó% ëoàYÐÚRÚ±£¥êùÐ#&Á?È>ÌÒ¹áЪþ¢þ©n¨_¨Ôß;j„;¦$}*}+ý(}'}/ýLŠtYº"ý$]•¾‘.9»ï½Ÿ%Ø{¯_aÝŠ]hÕkŸ5'SNÊ{äå”ü¼ü²<°¹_“§ä½ðì öÍ ý½t ³jMµ{-ñ4%ׯTÅ„«tYÛŸ“¦R6ÈÆØô#§v\œå–Šx:žŠ'H‰ï‹OÄÇâ3·ž¼ø^ø&°¦õþ“0::àm,L%È3â:qVEô t›ÐÍ]~ߢI«vÖ6ÊWÙ¯ª¯) |ʸ2]ÕG‡Í4Ïå(6w¸½Â‹£$¾ƒ"ŽèAÞû¾EvÝ mî[D‡ÿÂ;ëVh[¨}íõ¿Ú†ðN|æ3¢‹õº½âç£Hä‘S:°ßûéKâÝt·Ñx€÷UÏ'D;7ÿ®7;_"ÿÑeó?Yqx endstream endobj 19 0 obj 1047 endobj 7 0 obj [ /ICCBased 18 0 R ] endobj 20 0 obj << /Length 21 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream x–wTSهϽ7½Ð" %ôz Ò;HQ‰I€P†„&vDF)VdTÀG‡"cE ƒ‚b× òPÆÁQDEåÝŒk ï­5óÞšýÇYßÙç·×Ùgï}׺Pü‚ÂtX€4¡XîëÁ\ËÄ÷XÀáffGøDÔü½=™™¨HƳöî.€d»Û,¿P&sÖÿ‘"7C$ EÕ6<~&å”S³Å2ÿÊô•)2†12¡ ¢¬"ãįlö§æ+»É˜—&ä¡Yμ4žŒ»PÞš%ᣌ¡\˜%àg£|e½TIšå÷(ÓÓøœL0™_Ìç&¡l‰2Eî‰ò”Ä9¼r‹ù9hžx¦g䊉Ib¦טiåèÈfúñ³Sùb1+”ÃMáˆxLÏô´ Ž0€¯o–E%Ym™h‘í­ííYÖæhù¿Ùß~Sý=ÈzûUñ&ìÏžAŒžYßlì¬/½ö$Z›³¾•U´m@åá¬Oï ò´Þœó†l^’Äâ ' ‹ììlsŸk.+è7ûŸ‚oÊ¿†9÷™ËîûV;¦?#I3eE妧¦KDÌÌ —Ïdý÷ÿãÀ9iÍÉÃ,œŸÀñ…èUQè” „‰h»…Ø A1ØvƒjpÔzÐN‚6p\WÀ p €G@ †ÁK0Þi‚ð¢Aª¤™BÖZyCAP8ÅC‰’@ùÐ&¨*ƒª¡CP=ô#tº]ƒú Ð 4ý}„˜Óa ض€Ù°;GÂËàDxœÀÛáJ¸>·Âáð,…_“@ÈÑFXñDBX$!k‘"¤©Eš¤¹H‘q䇡a˜Æã‡YŒábVaÖbJ0Õ˜c˜VLæ6f3ù‚¥bÕ±¦X'¬?v 6›-ÄV``[°—±Øaì;ÇÀâp~¸\2n5®·׌»€ëà á&ñx¼*Þï‚Ásðb|!¾ ߯¿' Zk‚!– $l$Tçý„Â4Q¨Ot"†yÄ\b)±ŽØA¼I&N“I†$R$)™´TIj"]&=&½!“É:dGrY@^O®$Ÿ _%’?P”(&OJEBÙN9J¹@y@yC¥R ¨nÔXª˜ºZO½D}J}/G“3—ó—ãÉ­“«‘k•ë—{%O”×—w—_.Ÿ'_!Jþ¦ü¸QÁ@ÁS£°V¡Fá´Â=…IEš¢•bˆbšb‰bƒâ5ÅQ%¼’’·O©@é°Ò%¥!BÓ¥yÒ¸´M´:ÚeÚ0G7¤ûÓ“éÅôè½ô e%e[å(ååå³ÊRÂ0`ø3R¥Œ“Œ»Œó4æ¹ÏãÏÛ6¯i^ÿ¼)•ù*n*|•"•f••ªLUoÕÕªmªOÔ0j&jajÙjûÕ.«Ï§ÏwžÏ_4ÿäü‡ê°º‰z¸újõÃê=ꓚ¾U—4Æ5šnšÉšåšç4Ç´hZ µZåZçµ^0•™îÌTf%³‹9¡­®í§-Ñ>¤Ý«=­c¨³Xg£N³Î]’.[7A·\·SwBOK/X/_¯Qï¡>QŸ­Ÿ¤¿G¿[ÊÀÐ Ú`‹A›Á¨¡Š¡¿aža£ác#ª‘«Ñ*£Z£;Æ8c¶qŠñ>ã[&°‰I’IÉMSØÔÞT`ºÏ´Ï kæh&4«5»Ç¢°ÜYY¬FÖ 9Ã<È|£y›ù+ =‹X‹Ý_,í,S-ë,Y)YXm´ê°úÃÚÄšk]c}džjãc³Î¦Ýæµ­©-ßv¿í};š]°Ý»N»Ïöö"û&û1=‡x‡½÷Øtv(»„}Õëèá¸ÎñŒã'{'±ÓI§ßYÎ)ΠΣ ðÔ-rÑqá¸r‘.d.Œ_xp¡ÔUÛ•ãZëúÌM×çvÄmÄÝØ=Ùý¸û+K‘G‹Ç”§“çÏ ^ˆ—¯W‘W¯·’÷bïjï§>:>‰>>¾v¾«}/øaýývúÝó×ðçú×ûO8¬ è ¤FV> 2 uÃÁÁ»‚/Ò_$\ÔBüCv…< 5 ]ús.,4¬&ìy¸Ux~xw-bEDCÄ»HÈÒÈG‹KwFÉGÅEÕGME{E—EK—X,Y³äFŒZŒ ¦={$vr©÷ÒÝK‡ãìâ ãî.3\–³ìÚrµå©ËÏ®_ÁYq*ßÿ‰©åL®ô_¹wåד»‡û’çÆ+çñ]øeü‘—„²„ÑD—Ä]‰cI®IIãOAµàu²_òä©””£)3©Ñ©Íi„´ø´ÓB%aа+]3='½/Ã4£0CºÊiÕîU¢@Ñ‘L(sYf»˜ŽþLõHŒ$›%ƒY ³j²ÞgGeŸÊQÌæôäšänËÉóÉû~5f5wug¾vþ†üÁ5îk­…Ö®\Û¹Nw]Áºáõ¾ëm mHÙðËFËeßnŠÞÔQ Q°¾`h³ïæÆB¹BQá½-Î[lÅllíÝf³­jÛ—"^ÑõbËâŠâO%Ü’ëßY}WùÝÌö„í½¥ö¥ûwàvwÜÝéºóX™bY^ÙЮà]­åÌò¢ò·»Wì¾Va[q`id´2¨²½J¯jGÕ§ê¤êšæ½ê{·íÚÇÛ׿ßmÓÅ>¼È÷Pk­AmÅaÜá¬ÃÏë¢êº¿g_DíHñ‘ÏG…G¥ÇÂuÕ;Ô×7¨7”6’ƱãqÇoýàõC{«éP3£¹ø8!9ñâÇøïž <ÙyŠ}ªé'ýŸö¶ÐZŠZ¡ÖÜÖ‰¶¤6i{L{ßé€ÓÎ-?›ÿ|ôŒö™š³ÊgKϑΜ›9Ÿw~òBÆ…ñ‹‰‡:Wt>º´äÒ®°®ÞË—¯^ñ¹r©Û½ûüU—«g®9];}}½í†ýÖ»ž–_ì~iéµïm½ép³ý–ã­Ž¾}çú]û/Þöº}åŽÿ‹úî.¾{ÿ^Ü=é}ÞýÑ©^?Ìz8ýhýcìã¢' O*žª?­ýÕø×f©½ôì ×`ϳˆg†¸C/ÿ•ù¯OÃÏ©Ï+F´FêG­GÏŒùŒÝz±ôÅðËŒ—Óã…¿)þ¶÷•Ñ«Ÿ~wû½gbÉÄðkÑë™?JÞ¨¾9úÖömçdèäÓwi獵ŠÞ«¾?öý¡ûcôÇ‘éìOøO•Ÿ?w| üòx&mfæß÷„óû endstream endobj 21 0 obj 2612 endobj 8 0 obj [ /ICCBased 20 0 R ] endobj 3 0 obj << /Type /Pages /MediaBox [0 0 792 612] /Count 1 /Kids [ 2 0 R ] >> endobj 22 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 10 0 obj << /Type /Font /Subtype /TrueType /BaseFont /PYULBY+Calibri /FontDescriptor 23 0 R /ToUnicode 24 0 R /FirstChar 33 /LastChar 90 /Widths [ 517 579 420 226 498 527 391 229 557 525 479 229 335 349 799 453 525 487 319 498 525 615 452 459 252 544 533 423 455 890 250 252 525 525 525 459 305 616 715 631 433 306 634 471 250 529 642 662 525 507 507 268 583 303 303 623 386 646 ] >> endobj 24 0 obj << /Length 25 0 R /Filter /FlateDecode >> stream x]”ËŽÚ0†÷y /§‹&v`"¤jª‘Xô¢Ò>@.©„(„oßï?Ði;‹ñç\|~;Îây÷i7ô³[|›NÍ>Í®ë‡vJçÓej’«Ó¡²eîÚ¾™ïÊž5ÇjÌï¯ç9wCwre™9·øNÉyž®îác{ªÓ=û:µiꇃ{øù¼·'ûË8þJÇ4ÌÎgÛ­kSG»ÏÕø¥:&·°ÒÇ]K¼Ÿ¯TýÍøq“c"*–·‘šS›ÎcÕ¤©)+½ß–//Û, í»Ð½ îš×jÊÊ> endobj 26 0 obj << /Length 27 0 R /Length1 29220 /Filter /FlateDecode >> stream xÕ|y|TÕýö9÷ξdö%™$3É$“e²‘„,’ì $@ !ìʲ/âŽRµ¢ëÚÖ«“%ˆUli­mq«K[—êï×VkÕÖVE“¼Ï¹gN¨¿÷}?ï?}‡<ó<çÜeîùÞs¾çœï=—Í·,#F²È¤¨Mßz¢|J®ë¿ds€§3W¢N^¾~Şνœ}ÒŠ‹·/ç鉷Rµ|å²¾¥1€ô®5}Ûâ¿OÞD:°¶oÍ20>Uø ¬ß¸,¾vátVe¾6‘ ¶ý‚O!YSh€XÉψ–HàB‚3Ún û‰ [Ùvõƒ?ûµm±¥ê_$Q§œãäßvý†‰g¯zàÚ/Ï_«ÿPû8’zœpœöÎá?b¸û˳gïÖ¨œ)¾Q¡)1½”.?¦÷҈˄Ø/Ä¥Bìb¯{„Ø-Ä.!v ±CˆíBlb«—±EˆÍBlbƒë…X'ÄZ!Öq± ±ZˆUB¬b…Ë…X&ÄR!ú…X"DŸ½B,b‘=B,bó…è¢KˆyBÌ¢Sˆ9BÌ¢Cˆv!f 1SˆB´ 1]ˆV!Z„h¢IˆF!„¨¢NˆZ!¦ 1Uˆˆ5BT 1Eˆ*!& 1IˆJ!*„(¢Lˆ‰B” Q"D±„(¢Pˆ!ò…È",D®9Bd ‘%DHˆL!2„ ‘.Dš!üB¤ ‘"D²>!’„HÂ+„G·.!œB8„° aÂ*„Eˆ!ÌB˜„0 aB/„N­!ÔB¨„…„ B¸ £BŒ1,ÄWB|)ÄY!¾âs!>âßBüKˆO…ø§ÿâ!>âïB|$Ä ñ7!>â¯B¼/Ä{BüEˆ? ñ'!þ[ˆÿâ]!ÞâB¼-Ä[B¼)ÄBüAˆß ñ;!^â5!^â!~+ÄËB¼$Ä‹B¼ ÄóBœâ7BüZˆ_ ñœ¿âY!~!ÄÏ…8-ÄÏ„ø©ÏqJˆ§…xJˆŸñ¤'…xBˆB q\ˆÇ…xLˆcB"&Ä€Q!â!~,ÄÃBâ!!â!îâ>!îâGBüPˆqw q—w q‡· ñ}!nâ°ßâV!nâf! q“ßâF!nâz!¾#ÄA!®âZ!qW q•W q…— q™û…¸Tˆ}Bìb»…Ø%ÄN!v±]ˆmBlâ!¶±YˆMBlbƒë…X'ÄZ!Öq± ±ZˆUB¬b…Ë…X&ÄR!ú…X"DŸ½B,b‘=B,bó…è¢KˆyBÌ¢Sˆ9BÌ¢CˆYBÌb†Ó…h¢Eˆf!š„h¢Aˆz!ꄨ=ÊFË5ÇR«ý3ÇR] ýN½œsZÄ Ýïl!§¼Ðóù©»ùuqšÇ/w.ÿ¡N~–9œfsêàÔsFP°Y1'3ë̘“5Ø1çe ¶˜34ïÒÊ©%æÄ@‚6óT§FžÙsîÁ¶ú˜ó*P]̹TsîM‹Ù@S9E8ÕpªŽÙ1. Sxª*fëFj2§I1kG•œ*b¶F¤Êc¶.PYÌ64‘o+åT³å!³˜ï9!fc+ŠÙ˜C*äTÀÏç¿Ç)ÌO–Ë)‡Ÿ,›S§§Ì˜Y)ƒSŸ3Ÿ3Ÿ,ÀÏâç”ÊKá”ÌÉÇ)‰SbÌÚƒszcÖE O̺äæäâäääàdçØøVžiá”ÀÉÌÉÄ÷4ò= ÎuÎuçúònnn7ßÅq7â|7fø¯7ÌôǰÂÐp¯ÿ:Ãýþ+äLÿår…ÿ2Záßß¹¯óÒ#û:÷vîîÜsdw§q75îöínݽs÷‘ÝoìŽØ5†];:wÙѹ½skç¶#[;Ÿ®$Ë¥+"U—ÙÒ©Úâܲy‹üézd ­ÛB‹¶P‰l±n l‘M›;7vn:²±“lœµq߯èFÕäèÆw6Jd#5 Žž:ºÑ—ÚŽìÚh¶6lè\×¹þȺεË×t®Æ®ªXѹòÈŠÎåK;—YÚÙ_±¤³¯¢·sqEOç¢#= +æw.82¿³»¢«söŸ[1§³óÈœÎÙíGÚ;gVÌèœü¶ŠÖÎéGZ;[*š:›4u6V4tÖ£ð$ÙšH–­ìf$ãJˆN+òE|ïø>ö©ˆ/ê;å“í–$’”cI¤µ3éºÄ½‰×'Êï ^)âÍÉk°x^ðüÑówÊñä4·ÕpË.V6wÛV¶£îš:Î&*emsC µ¸ü.©Þï¢ÄöŽíc›ìzÚú‚U²X¨Å2j‘"ìnIð'Hìk4AŽ$L(o°˜ýf‰}šewÄŒvñY¦Ys,F¿Qê¬1Î4JcMmCĘ_Ô@d xòcÉ:v5Ôåo¤ä¨›ªé ½a`Îìp¸uPG:Z£ºY ¢ôêhælöiŸÕ\%ót Púî*ÕΉ:[Ûçóô’i)­Ñ”Ù]Ñ»Sº[£û "LŒB”7™Ö^´i˦pxó"|-Ú´9¬ü!E·°>Ø€¿M›‘fÿ@H¶åÛ?|7ì·x>ÊiøÙ¿ýÿ¶Ðÿ®ñ?üªh×ÔQér²Tº Ø\ ìö{€ÝÀ.`'°Øl¶—[€ÍÀ&`°X¬Ö«UÀJ`°X,ú%@Ð ,=ÀB`0躀yÀ\ ˜Ì:€v`0˜´ÓV hš€F ¨ê€Z`0ˆ5@50¨&“€J (Ê€‰@)P€" (ò< ä9@6„€L é@ü@*$> H¼€p.À 8;`¬€HÌ€ 0@è- Ô€jê(¾e@(@ÈRŠ<: __g/€ÏÏ€ÿ>þ üøøø;ð0|ü øø+ð>ððàÏÀŸ€ÿþ xxø#ð6ðð&ððà÷Àï€××€WW€ß////Ïg€ß¿~<üxøðsà4ð3à§À3À)àià)à'À“ÀIà à0ŽG0DGG€G€‡€€ûû€{?~ÜÜ ÜÜ ÜÜ|¸ 8 |¸¸¸8Ü|¸¸¸øp¸¸8\\ \\ \A–NÝG/‡º Ø\ ìö{€ÝÀ.`'°Øl¶—[€ÍÀ&`#°X¬Ök€‹‹€ÕÀ*`%°X,–ýÀ è‹€`!°˜t]À<`.Ð ÌfÀ,`&0˜´-@3Ð4 @=PÔ’¥ÿánú?ýòºÿÓ/ð?üú¼‹±C„ŒÜ4~‘™EVcñÒ>ü»’$7‘§Éd ¹ ê0¹›ÜG$Qò y޼~ÞQÿ‰‘íê5Ä$'â dôìèÐÈ}À :a\ÎMH9Ts9£ÖÑ.Èûhä¦QëÈ ÆN ʱféeœíŸtxô,úW 1–±´t´Eù¥O´wŽ<:rÿy˜EÚÉ|²€,$=¤—ô¡üKÉJ² –¹ˆ\LÖµJj-¶­€^ŽÔbì_¢ès{­#ëÉ:²‘l&[È%ø·zS<ŶmPÒ[ÈVüÛF¶“d'ÙEvÇ¿·*9»°e‡’» [ö½¸3—’ýŠÌs.#—“+p×®"W“kpǾ=uÍØ^ȵä:ÜçïëÉ·éƒçm¹Ü@n$ßE}8Dn&·ï¡^|ŸÜ~Aî­JþmäNrê ;âfäÜ¥¨[È­äIò òy„°³ìŽçKÜ€’q}®œÌF¬ ןWNqÄÿ.—•˜ÙévØKX†ÙìäÝöµÜñ{Œ×·;ÐïÁ7³*S?€æê.EÏ¿slß»•m?$?"÷â^ÜO˜ÌsîCÞýä´í‡Èò0þÓãßúù±rç¢d€ÄÈQr wòqrœ *ùÿÓ¶Gá;.<æhü\±±³œ O“¨!O‘Sð4?Å?‘óä=Ï=­ìÅÓ?ÅZÊÓÊ^lëOQ·ž…‡úù5ù yü©ç•ï_"õ"y™ü–¼NÍP/‘¿â{˜¼¨þI S±ðò ÜÛÉ"²(Ò¸tñ¢ž… æwwuΙÝÑ>k挶é­-ÍM õuµÓ¦Fjª§TMžTYQ^6±° ?/;”™L÷{6«Ål4èuZZ%cd›Wlè DC½QU(ØÔ”ÏÒÁ>dôËèÕpþ>Ñ;®›ÎÛ3‚=—_°g„ïÛ“ZU¤*?/P DÏÔƒt~{ôÁº`w :¤è6E«BJÂŒDZŽÔ{WÖ¢´7Pm¸dåúÞºü<:`4Ôk—òóÈ€Ái„Šf×Ðìjª)»~Ò€Dtfö³Q9³¾oitV{W}/-­[É#µÊ¹¢šÚ¨V9W`U×L® ä:pÝ •,é ›–—ö-ìŠÊ}8è€\àÀUQ[8š¬‹æìø“\Í ÖÕGÃA\XkÇØШ:Ó øÁŇ>ÄUËé‹çh2­ÿ"l#+☙¢´Oh‚kâ|iiìZ®Œ%HD÷µwñt€,ñÅH¤0Ü•zÙ–Sb‹«“mÙ'¶ŒÞ„eëƒõ½ñ¿KVz£û–òópg•¿Ì¨*ÛQ9Ô»¤%ã¾e‚u(!lIæ hS鋳~ ¨û÷õ¢«˜Ú»¢…ÁõQgp·62p’ÌúU³»”Cxn}ÔY%½ýñ£¢…õ8U¤þ»1ìÙ¹‚í]'HÉè;¥ßÑRJºÙuDݵ¸)¡ú]K—Gý½¾¥¨ŸË]¾´h¤æëv-ëfw)h漃ŸÃ7P9 e»`o±3ŠÕfê]’Oîfw |§Uaƒ5ªáIvG§Uº¨ˆÝð+ñ=˜:ï¡WÏžßu‹ñWÏéŠIŠöNëÈÀ¶®B"J®ÄrY&Û%ÀìLHè”ý}'"„ìS¶ª” %ݸ¬’ÇwB%ýƒϳŠý$ä©x^DÉëÆ-Ì»·~¸>°”Ýž]Ý+ôv³ÆEܸ•ø£Q¬&Q)XP®Æ5—M‹ƒÓX~ ˯áù–¯ N‹R7…qá“ôá§Påº"ïFí°²Ú/eGGçt¥ñ u§¡I,æwEõaôêÌì×ÈЋìÆè¾þ>v¤MµÌæþn´qBìÒÕã úø°Gƒr «Ž8¨÷7P9~Ñ}ÝÑî0ûÑ®UìŠk”4'á¶ósªCì‡ »؃Ŭbcר!ó*Fz\AZÉñ!‰ƒÃe%ÒšpåýAlêï à¨HÿlTuîK ì¾!g\¢*´LÁßHX±äL£ÙÕà„øcÚX€âOÛ £°Â+©«â;à·­Q#®(4Δñ`ljfׂ¿«pñl×gØiÚIGp\#»hå§´Ø5g6÷ÁùóãÈ Vˆƒq.]&Ëbç8Ísµ¬ä&Ø]Μ38zp;óⓟd«˜Äw›t¸0#º œŸ§»0׬d8 3óÜ^:ó³³êÑ×¢b¯±¼¾‡UóÉê:Ò§ú<,ÿ˜<¬6‘ª¯ÈÃ’ 8H´ròré¤_•®ìÓ(ÿ…XÔéä!m*™"¿JªJÉay ™î•¿$=Ò’©:TC$S>M&²}{»Bþ¡Â‡5KÉa–§ªPŽcºWúΓFÚ¥GHšj ‡Ú.%‡ä;HºzL”·’ù.’ŽsÄs¥ rÉ[™–=„"¢\/5úoD‘¯v ¬MÀ#007‡æŽ{N#“0j”ð¦%$H²H*É!é˜ÁH6 a{qâýñ7Q“|Ì8KñN“ЏˆŸØÉD¼½“AòH Îç%>R€÷ I9 “dRL’ˆ˜I&©"“I I$•ø5)ï³Ï=äZHÿ,-‘^+ä?ªöª~¥.TïÖx57hõÚ7tÓtgô‹ fÃ}Æbãs¦Õ¦!óÍ Ù ¯Y~fm´ž²Í·Ýaßã°8îp–:ϸÜ&÷ÕîCƒçIïôD9ñ¤‹’^LúÔ—é[ã»O×ÞO6&%oO~.eWj ÊAF6É/«P-®ªÌ ž$f„ÁÜd}ì1W]._ûB\ H¦#”ÖF,*É|<)©&x|¢æ lk¤ùÇj´þ­~{øùÂ᷇악C´ð­wß~×úÉó¶ÊÂ’w_ywBµ¥Ù8$­Ö© ¦H³Be%%ÅÕÒÄÒP0=ARòJËÊ«å’âTIÆž<§Zbi*¿üÕ|yæ°FÚ¬™[¢NM²8͵”ìµçWeZg/Ȭ*HÑÊZ¬Öi³Ë§¥·^\Ÿþ­-ÅåN±ëtö·+Ŧ~Cpöê„/kUyHÖL^X“!Ï “TÍ`ª71wrZó\‹Ãª2:¬6·Nk·™²ë_éJfçHv¹ø¹†Û`–àèYÕµu%Dî8A2Fß?f²ÒéÁÁ¸ Ž~|̈£xûq$‰eeZÙ·Yù6)ß‘lšÉ6çi[F0”ù©Éhò¦§ fêV™ˆÉj’ >|!(MA“=¥ÃÞ©î$555öÊÊž›§Òi+±ÛJ`ñp]á _¦Û­QLž%§É r0=*+§ÜÎmPF;ÓQk¦ßŸéÐ«Ö ÿeµlp“S2-TGc*sbVj 7)Aµ“þ‘þtŠÛ— ’µ&=<òœÞ¬W©|nU̘ “eÅxpx'Az~…¢v¥¢T_F’ü^+mó[-ìËŒ/¯ _”« "ÙI®¶»"ØîróØÎylç<¶sÛ9íœ÷„TŒxϩǠI¨–>Š=ÁÅÎ cð¿âe;ö,”¬óÝÆSFɘ”õé„ ÚŒAŠÕí¥ƒÔ8 Cj†j”z[I {ÞU¬VüJ˜ Tçp¸’kÕ™  ¦¥‡&ÚJËJÒP+]¬>§Ê´´@ m¬2;ÎIõWÌìßÐ<òˆ''ÇCC›õ»ÃSs'.¬ÏNª˜ß;]ÛQ–8#³ñ¢öçÏNîª ÑMSVtTçºüYªýYþ¼9;Ú æ4VØ ;ÖJ´púÄ䑞àä™ÃoMêªòT$—wÀkõ~¬2©SÑŠ—M&“Ãq«€«€?< «€?bVQ¶Ã*᧤x>/-„ Ѽ˜c¶ê$Í…C+¢ú¹hÒ¯ 1ÐB^|ëk§'e:xã-U𥆀5SÖ€]ÎT4UÞ\U&I­sFïlÞóëëÛfßòÒÞŠÕó|:µ¬Òu Å37Ìœ{piùÄþ´mj/µh ù¸ÕkOpædùæüè“;îùêÑ…®@®/Á‘dw&;ôY…YõW>³kçOöN †4¶T´@VË®G-³Ão¤Ô¤Q«9VsN”ÙaG^”Öq’Õ’ÄkLRÜ6 c?°RcÀïÅÞI'ñVXJK½ƒÔp,=½²°ú$5 ¯3МXålç Í(D½Vj5œ%ë¨âíý•žžÓc >n—ójuY¹µ{VëkÁPªqÝ“JµM¥3iM‹.›ÑC—ÔÔïxpYÕΉ#¯Øl*=|å÷n»Á>iá’¥nùð‡s{º¡eÿ²ú$ƒj‘#Å¡ „fxjÝ®S—×¥¤Ðíé0£NgM¶8’B)é^SÏúíl´/)˜“”Îë‡júžB2x¬f šâ&+&Rf+[Ù™˜q“=Ff}#³¾‘YßȬodíÄÈ|¥‡D\p°û²ÚètÁvâa‹Z°ñãØæÉí€#Í‹XN™è‹&j:¿W*ìÙ0TCá=_a•·Øç E=ð$¼ƒÇÐ`Lr¯"¹'¤j–ΙæM 8uÃG¡YÍÓ9Ó½‰iNÔ¦ÔE¨$XUΤ“ª‡*´êB Ÿ•4BÇÛí‚ý\dÖñÏLÏ£™ÄMVL¨0lVL¨l‡…Èð †ÑSÇa ƒµCé„QÌ1‡p®\¢´K\·Þ•æa×=vµç®]•vô#ú'\U6Aè†pWõt9)¸mKIvèOÒb ^½ðá긧…ç.OqWé¥&£SÆ_c¶¦J®[ב\^nÔª%žZ—,𧬼=mhÛ7‚Þb3™l‰v7ÆT»ÅVÐ>U¾ÖW±VÀê'­(Ii:A\¼$X©¥Va¬¬8]êæ1¢·t¸ix@£8\ZxFV±+ï{yƒJÂÆ‰­*ŒB†O{rD¥ /²aI«ÓçÐû>"nû—÷èmÉñ{q›L!WͲXœñû®0„¸<ðǬ¿TÒ¸ïNÖtRS Ŭñ{±o±;[±W1k<Ål+I­è0X²T‰Ìó²r`æ©D[ˆ÷Ÿ‰vPˆ‘šR0æK²h(”t»]ãÚ!§Jš*{JBlÜ/»jÙ•d.OÊ ]#+S“%IÒ9ü^¯ß®ËKêHÉò§Øè¤”²â ^*QlItìºF'ƱƔâ,éÊÝ“›niùêŸc®ú¡ìtƒ'Ç?üËÒþޞ™GfJOa”§‚ûÒôµý£Cª÷Õi¨ZYdW$ÉÉlàdÄÉ:Z'ëhÌ0SIDÀ¬iÆ©qã‚•{V\7XqÝÊv•zƒI„£¶Ì²ûÏ*/†ecnÜQŸóÍ¢+ýí¸Ñ‡êý–›Þ>ôÝW¯­k9ôö¡ë_9XÿXÖ‚ï­_ÿ½Å9¡ù·nÜpÛ¢lé–;¾X<ï¾ß}øì£‹çÞûÏ×þäÚs®;¹bã©kÛæ\ÿ$[ ~=p2fƒÛ24ñ‚€•‚(Œ‚ƒ•J¬lGA4¬ xl)Ì<)Ì<)V“™NOa£×ôO1bËDïtT£1¡˜Æ£®vӸΙWQ9âe žWPçUã†ò³‘­?Þv“Þ‘–ÈKnuå¶­Z3=ç±ÉózòîúþŒ òM}·¯­)-A…[­õÔ,Ü>oæêÒ„á/²ûY»h’ûq‡›É{'ÈTLb,˜¢LeåE9F™ƽ+vê ” GN:½8”QœQlòyÙ±>Öµø¬8ÊÇšˆUßXé„üQŸâYOMŒ³“óãÖݘ NÒ,L¢ 41Úå´uÎl÷ ͉×̆llJ÷X‡¬¨@ãúe®$:£±ª¤U‰OFǜㅃ[Ü_»õžž©ëæMöáèt %³6´TôÔfw¬Z»²£dòªç„çµU94*IÖµÆÂºžIe³J“Šg¯^»zv ½hÁw0¤{3ý˜•jÓ³ƒ©å³JÊgLžPR=gÃÌö½só-‰~‡ÑæuØ1æM¦¤MË,›QU\2eöÜ# jå먕édÙqoæõÚÐAœ:E”*c+U5OalŸ_EYfÃ$ Ûl;"¦Äka1:²O” ÐÏÃÖÓḅÆõÏilÞÎ|âz_‡ëÕ½”Y§VãK¾\¬RÆ…_Þ9Vï–èlÉŸB³÷|Êvôar8’Ò›O¬ÕX« °ª`£’«5øN¬ÛøQ jqÇÛ$Xi“ ã8°R`e;Žv?•mè±ÙØ…-…Žè1x1„:¬Ú‹z£ Ux_Ã*Œèuøøž•zÌõÚâÓœs9ªíõû·\ÝSLJÆ]Þì-Í­[ÚÊiÒÐk¾}ɉ}Óª·?¾U s|õùW"šÜµžìyÌ*SFÏjÞUªÈŠ£¡*Z<8úy¤–UúLÜÙ…–“IÓ½Lä¤So€‰ü 4¿ˆægÐü -ïÈíåñÁôC5|áÃñ™,&ÀúŸ à=QYïyJD €r…X‚V}™Êšœ“ê''¨F>‘ÎÊ I9´¼d‹<ò†ÚB†C+Ñ ¥NYïÌLMNsêeš#ÑY㦤­TJ°±ÞÅ– ¿ôU¡Ðª#d]‚ñËÓªIF PXŒ_þB5Ù­NHò°¾h!œ•8KmXßYÚ\hÒ5²$kes7DÖÝ¿qRÕ†»ûWßÜ›Ÿ¼}ë”…Õé˜Ôd¥µn›[àJriíf‡ÅdLô:ªw îØ|âÒúºMßïrì?T0}Y9ë93±>ðJõ6ôœKcn+k€JÃó±:+2V¼„2@+n À/bE¹ˆ¿¿±³xG¦a¨¬1)4TÔ˜nmb¸¡b6 Ÿ.Q†G§Ã%ˆ…ÆçÒ<öéR<6ì0n¸7/¼»2mSIWªÔ:Ö•šãË, $<§3êÕvËs:¸&oÀ¡Ûkµ2W³7Ø´¦%8-ä“Õ‡'A­7ê½%í“–hmIŽŒÀWü>ɨ“] G’M۳誹9f‹Éá‹[AuJ½ô‘Žcé³á=¾ˆ˜0Fþ"⟓nO·“Ê’ÝÐüÆÙM3‡j‚î¡ʦœéÉÓMJQQVE¦…§KN³¡tÉ»Üãa+ó˜ù¦*^Px·'Uv;8ºY¶ê”Á¬sù³“Z¦<Çz2›uÌ"#_h›Œ¦‹ó¦¹ 0;*€£ªè¡Lä†k]z³VV[ɰëòõý_7××M×ÙsÅÜ‹^Û9)0ôòõóúÎå±v‰Z%?{:H'©¨Ç“Ƶ˜ªúaÔÎv¬Èú"â*+Êkojªj ä •YÔeM¡é‰ÌÕ¼rOc`K„1`÷>yåÝçÏUn€qOºÆÂ.°^*¼ö9ç»]òãzwVjJ–Ç`ðd¥¤f¹õvaªo0Zãª:w^†Ï€‰ ,gKÊL®Ÿ$i“U¿I±3„’“3õúÄÌ/'œ«\_·–b•No0Z½¶@²V§…™}^^ëþ®zmo鈴°á€iY0HJ—-35t•Øé¨Ûjšq-n‹4•4MšäÎJnl!¦!w“FqÙ¬âÁ§°öÆMöÊi$KÔ?XîÜLøBû¨ÄÐ@ñÛ®xíÂj|-U†¼Æ£·6ºZXm¬ñ5®Á()Õ¤•eÏ0X[-ÿ½Eg$z1€ø ›åØ-ï•5¹3“]Zì¤Ò[Ss ÝK#)rÁ×­¦4O‹™U±ñ­ù5^yWÔCÏb½A¯NðÚSÒ­ zMfë¦xG&Gn’¯‘Iªñ”v1y1â²ç7²~³Q‡î 1`uÐé%5˜'°1-Xé1Áï<Î6ÕhgBFÌ;>Ó§²É%Z-ëÐýÂžŠ˜!òK´>Ÿ¶$_żf¤]éb?ѰⰮÜ̈œi)ÒÊ-0Í~ßåê­ÿZÕ”˜öûŠ–¿ÌŒ?F«QÆÀC¯ñÁ\¸äL8|:ìaSrFxÖ3aü…Å÷),ì¥DCYÔu·Gqñ1&œå0ãÙ0ûf®ÔíA ü¹1öfC>Gi(++>†¯qX. &÷ì›QÞï³{¦–ý­v}GAéE÷mXsxIž5mB`Baq¦?£tá¥ÓsýÔj³Œ,ë)j,ô,[0¡©Ð3{qû_9^ýå—´.«öÉ›ƒþŒy…3¶ÍÎKqÛ Rƒ’AJ›Ò=¹z}ç„ÌHwiZuEIbâô¼)½¡Ìžim;æäëui#Ÿ,\¨hÎî^î/o^4©FÒ%æçd»¦Ö¦U³Vs¾ånŒµ‹Éöc5¥4÷Ü£œxW5îÒ‡9XËò¤ò€=Jñ¨½20²m«OÍM´bŒx<¿%£!qº2 B£²cxóáõy£!›2Ñhϵ2m´ñÉ K¾@E{ š‹ªwÕñ6áЊÁuã ÍówNOKND²´-ªËèê¾VäŒQ·6OY~Mó±WŒž¥íêBÄãÓÈuÇk‚3ƒë‚²›uÏ("øÜ|Sw¤•Ê ó~¥wŸÄš“d„›K}=¼7)ÂËŸ?nð³gÍøª%Z›û¼6Žã3Ä?Î ÇÆ†æˆYeD-¤ÕÀ‘7yR˜aÌòå".N‹&åæTâÎïÂ/%7GL5e4g±Ó6 ñ_T)Êüük×JírÂI¼˜NLñÒ|û“T†$w~>aå•ÂnTg7'7ØD…@< <pZ•qMñ;Jð‡ÄcŒ¬qNw¬:ÄCè“´”ºÝò.#=ÉôZ4#—_h:GgOÄãštôΖ‘'èZ³?tXC`ÖÓŒ˜¿^1¾z™^b0ëe õ&¯u䉑L›+n3Z ›¹HDyj³Nyj£Üm¸-¥Ž°Ù{‚ æc=ô<Ÿ3X”[¿¿ßx_¿~/Çná¹:¿ õ‹§Ï"D|vöÈRyÂR"2YJ8f}m×r•+BúcærÆ-+Ó=¥E§¦ºQÑSS‹ lfd` ÛÀ†ù¥aÐ{ŸÅ¢«³ª1KT :nÖ¨œi1«T ’u/[+ÕÄZ[0ÔDÌS[ªò+šó18‰;Ü6Os¤ÊøªŒôâ0æ”WÄEuÀÌ›*Îs_ËP»èzã!$>Ew©_äÎásæÕTnªg=¯'Í¡uçÕTnó%{²ÇbÕN¿¾¹¢»®ÈšßÞÚ˜1ï’fÿØý‚•x•¯ç iDÒu[;g&NÍžP—뀻™.¼.î`19±ð;ÈncÜ_x—â~—›w-~7Ѽ|©F+î(„ÊzËñÏQéçÇ㮘9âˆ!¿%71£Y˜ÞÃùâp<â·öÿdëóMûíÿ·¶ýoòy†‚z™?f·a!ö´çHrMͶÓ ™iÈDC:ÒÒ\%¢§<ÁÀJý+n |þ6áL-4PøGGln;îÑÑxÓÏŽ[HÛzܦÄAJc–<'‘â!"˜¬'^3Å“{æ«â1kùíI›~¼qݽkË*7=¼ \þˆ¯zõÌæUui¾šÕ3›V×èŸ×ž¸²uÚžcÁ-à]Íû—T–.ÞßÖ²¿¯²tÑ~ØæðÈ!ùU؆ÅÇö±øXZ[ØÅz*°Ò8YZqâJuA F·íâ¡1%H¦Ü²¸Í.6¿RܽÒáóFÄü0›7}ÃÈW"t¿¤Ñëtž” WbÑÄIÁq5GñÕ™S'U¦˜Ó2RL*™ÊKÜ©6½^¯sL/ŽŠþœ£¹¬¬.Ë"ë }‚±h’žG‰›ÉóSakMëÌÖ½­¶ªÇ=|Tš•’†›Ÿ:Š ’†ïQ|ê }3âçO Yó±*‰Í>æ¢}Oà?€“‰ ¦ò1„: á|5¦GM’©à­rÃßl³l½¶õ6™?h|ƒ=elq¿ÏÕ0#ÄÀˆ…–ç– b¢Ã#lô7îÿñFéù’EûgÍ«/rTìb¸fnEn]±/+2«³=’•Ó±³#£iRŽ “SKæôéeÍ…¹‘Wv¤£sv$‹&Ô_ŒûíItføIV­/à³Ë2C¥Ùþôpõܪ‰}Íy&»Ëj²¸­¶D«Öèv‹’³&fÒs«æ°ÑMÚèߥ5ªcòÂc9ÄÌ7D…aS°r/ÀJƒTFÌg•Ðä1ç›RÌCž¦ h‹Z%²?t†uv%ñì™Ó<<Í×OÙ.œÉË”]Z£³r < ˜dï±ØÙSÆÝbÖñ‹aF^ÞèÉHvêÔzµjÁø)4’}û|›ŒŽ²rËWâÿÖÈEZK&Hx«šÛC~ö˜J¦Ä §¢+ÿüX855Œ6÷EÄ$O Om²†‡&OlÂê2ÕÑÌ6==ŸA؇¿õ.]°Àb6ç|4âdߌøSȤº1Nò$"<8R8®€ßn ù¸/é«[ÇZk|\!Í6W¸Ð(¼¬ª—T¿C §eM@Ycá]¬¤~ó4s2þ‘‰á9dFÓԦɓMEMRSWBxhb"«b™m ÇÝrE-Â?QêPÂ{ecQ)iÖC< 3Ί6§Íl6‹øÌ…v¤T<̽0°bÏDä'1öü.žˆ”RcóTYÌSeéÐŽ²”Î0‹G³`ùÇ öÜÕƒ•Öþ\`0Áæ;l‘ñ1ÏÀmÓ;ò›³ŒêÄfLÔ猰~@ŒùÇ\×y¡ñ`dlÖËzc¤˜⑈=ÅåI±iÚnQ†˜Z'b{ ›ŠªwÖãÑ‹–éÇí[;gT­¸f‰”.ÆåßÎ\\›ÙÕ)m9¬½¥#"²öÉ#ÿ}Kì1jbµýÊsïL?Må"•*“\YMË´ÄÝï-m0L¤;”côj£YVš­¦éÙȘ’N3Òi“X9œ‘FJn€fh–…^’FÓØ½ÍÕ”@ï€Ôû=º›4D•›–#÷㈠çHËnN3&5yG û*SiîQF¨áHV› ô8½?ÁaVɃvd€ÎÉ*£Ó2²ˆyÌ6vÁ>¤ãñ¡¬QÌrÍñQ/‹§„¼4”P– eéiúMJ¢‰àɉÔßœhp4ZU3I+{vƒÑ2[)ƒR²šÄošÌWl”;°N“†JÇVÈ8”´Û©•J¶i&'l’f—Þ*<­³f¤¦¦;õjJåÏ5¶ô@r†M3ò˜Õ¦69h¥Ênº¼ j¼:c.^sÕ,þy‘+Q#Þsb5°´á˜F/³'toŸïæQó±8$mqÇ‘GUgâaÆ‘X$wämº‰¼ƒ7Ó 1£'™X_9£ô¾x ‹7‡r‡ht“&Ác»Fmv$:lU]aôf$%fxŒ×ûK òŸ×0ßCµ¤Ž}¾€U£±Ø ïäègô |³+ð ,ÝyÜD¤Ã‚«=SƒËÅÃ/vÁçÂù¬ Å»zPŸ˜íd£Î{³þlö<êü´äùŒF_^ =ŸqþpvÏÀ[§pmIx­‘’[q=kQb#ñ °Eq§G½†íà˜q)ágXñÇ…p×VW0¬i,,¨Ø9rå-tžfùˆVkÄ‘üúÿoŒ¦ùK ó½ÏkÙ£$ö”coRÀ®ÑØa5JèÈ{²Aýb™º«šbLä‰ßxtUû€ÊìLq%¦ÙU©Gev¤º°Ö@¥þÄŒ¥PZ³Ã¬Ùi¶èqf§竧Ǥi ÞNL8F´Æ!,JÂ34^O”WøKRÝ6²ÈŽýé©éY©þP(UcK«”ÿ¦C* ÿwŸ…Øb8Ë šŒ¿ùD*ÉáøªÆa·;ägô½ZÂ#~¼·ÔÛ”9Ý#÷Óª¯Å•é—Ìœ“̦_²²VvùWšBÔ ø\£Ã9»gì5µ™ÕÉø›€ôï‹{/PÓ„”D{’Ã$—uT$û+;J¨Þšìö$[%õ’çFº_{}dþ¯M6£ ýÕË_úÝ[6¼ùû—Wà½>8 ¼CNÉ\Ñ{¸¢4Rr‚Ø1uÆ5a” D­?ÆêÚ8>Åœ%æÏü ÃÅüYOÍn{w®Ì>±TÊ ñ`œÇm§ï%W´—É&¼«””b¦ê…‹-RIÖd /ÆH+¶H‰ÞúÝKËñì_Rm¦_Ñû_ÞÿœÞŠ·ž4Õ™‘™hGM>«¬°#²œxAÀ-SÜ0á:É´HmX09.”ÆâÇN6Št²¥ÆNöÊœó¤„A|¢ˆ¬DTÀÊPü>k!õ`™e~Do`‹·#DfA¬ˆ÷¬Ð0Ó e,„BÒ ¯³4„àÁ n³•Íbá6ë10ä‡íà;­ï²¾üÎMáPùçB·€¨fco“©äg ×D/ÝqÿòpÑÅÑ};ÁÑ_¸ª­¨sõwêÔeMSà3¤7ÿ{ oÞƒŸÝ}è3…î»í’ÎòÄY×=yñ¿Þ7)£vÑÆ+P ð°|—Úƒ÷tÿÉÈH¥)4#™}4#‰f$RÖAxhŽì´³^±ˆ•ÔÌÌ]D 3-ɉÏ|ÁJÝQÖ++Ýn[ žŠu™X¦kdßF Fßao*‚_9Šs‚O±gãòO±A%Ò0=ޏoÍ:0»ª9ìÈÁäSËß‹(®†+ã6 ŸÁóU¾,%üst>ÌäæU‚Éç–íÚ´ ˆZžË+³)ù. Þó^¨55¬ê¥ gÙ³j¬bÖÓ\•Éîµc0¯ù@— WױȂ֚ä°'Ùôòïn6¨Ì©›×jÒ<-«°Š‹z¾¼^w¢|(ÞΣŠÒ¼q>«»s:þ¯ÚÚ¾‹W-Ù¸êe]¯ endstream endobj 27 0 obj 16238 endobj 11 0 obj << /Type /Font /Subtype /TrueType /BaseFont /MWZTDU+AndaleMono /FontDescriptor 28 0 R /Encoding /MacRomanEncoding /FirstChar 32 /LastChar 121 /Widths [ 600 0 0 0 600 0 600 0 600 600 0 0 600 0 600 600 0 600 600 0 0 0 0 0 0 0 600 600 0 600 0 0 600 600 0 600 600 600 0 600 600 600 0 0 600 600 600 600 600 0 0 600 600 600 600 0 0 0 0 0 0 0 0 600 0 600 0 0 600 600 0 600 600 600 0 0 600 600 600 600 600 600 600 600 600 600 600 600 0 600 ] >> endobj 28 0 obj << /Type /FontDescriptor /FontName /MWZTDU+AndaleMono /Flags 33 /FontBBox [0 -218 600 995] /ItalicAngle 0 /Ascent 907 /Descent -218 /CapHeight 702 /StemV 0 /XHeight 521 /AvgWidth 600 /MaxWidth 600 /FontFile2 29 0 R >> endobj 29 0 obj << /Length 30 0 R /Length1 14172 /Filter /FlateDecode >> stream x½{{|”Ž÷\žë^Ÿ½e7YB6Ù„„,1%› ‘¬A€†H$¢\"w{Ò€iNb•#X)Å–´VPA?jék©µ‚Ø·ÇãµÆR[‘"Ù¼ßy6 öxÎç|Þ?ÞÝ™gfžç™™ßý÷›Ùw®l"6²Žp_°xÞ2b~¢øí‚U+B©ºô!lÝ­Ë.NÕUƒeßÂ;ÖÞšª;2ì£æ¦y©:¹€2ÖŒ†TŽF™Û¼xÅšTÝŽûÉoïXº`°ßÙ€zóâykÇ'ÿzhɼÅM(ñ)+G–»léòf•Ä(»–ÝÙ4x?­%„—¥ú.æB(®£4‡\Cn 2aÄ A2+q*û°^fö3B2b®©wV|I¬šùðSWØ6Š‹_÷Õÿ…äÕÒõ,ªšy¿èÀ{ÕñÉñ„HGD¹éòO4þÅ{ï§ù‡=†ì{ÿ’üÞ¿¤GWýÁÑ£GO•UñUÓV-]%½ùô¯Zlñ2dw,Evû’´ Nn§ÚõKê—¼·ä/K–Èäöí·'nçÎ%ôö%mwfœýÊëò÷/‘}ñ7d+V"[¸Ù­·!kjöÉÙgYeóõÍõÍœ4­k:ÐÄßkþKó@35Å›–5=Ð$餉jMÍ-éËÓîšž½ÉyªþK|F·=àʪLÐÏ{üY|©$ëá9ò`ù·ÙÔc‰ôôÒÈæ-RdK/<„úKþ¨1W[èHZL¦‘,:š^AŠQÑ+âC‹³8¾ý8»ocIÖÆ %Y÷ mè(ÉšÝE}@Šì8?pÀðŒI|zàSÖvâþìŽ+³Ö·i‘V¤¶5òTGzVg‰ü CŠ´#­ë Á2_ æó•úÜ£}ΨÏVâÓGù”‘>^ì#Wø†å; ò…Ljˆ3'ìÈ ;‡f9BYÎq.›Íî°é«MQ5—d¡Ìæäopæ$o&ÑYAši¨vŸá·»%¯=䲉L™"2.2‚lÿÀû{ÁÒ>XZKu°”Rå3å´(M¸'“É3Æ'<åôñ‰hdò~º1Q™œÐ¦Ý\»›Òûf£5ÁºöS2#!uíg(ÜæÜ\»Ÿ¦‹îŽàs„R’˜Üбqv$3Ñ8yzmb]æìD‰¸x s6‰üógùòoµì.V(¬ž—QÝPuy]q±&žX)*æ“—½qydùr‰$‰0æ‰Ì]>wÅr|.>ˆ šÌZªq·.Ö6íÆñXàæ"aT£›vsÂOäv’NóCI Ñ2xíN]œõoòäE¹C’Þúÿ\’ÿ‹Wì [ÿÛ»Ž‘Mä¡ÈÀÒEäM²žÜ2P<Ð6°cðþúGIÙÀkƒµÞÛÉ“¸½ ä§(Å›7‘ŽKí? BzE"ä¤N¤mH›RÑwæbå;Ëóä¼Ù~ì;zÛ‰øþ ßnr7m%SÉb|ÛÌ;ý—û>0‚°í[È ²–,¢›q½q`9ÙNvÓÍô‡Ê&ú¯d-"°Y˶’•XÉ8ò9BVl %¿#¿˜>ðÿéCn%KÉj%ÃÉL22ªó>öÊ1åe±ÒÑÑ’Q#‹¯()^?,/7œ“Êš9$˜‘ð§ù¼·Ëp:ì6«E×TE–8£dM&ÔV/J¤OhHÔ„«ÂF(Q3õÌ”âq³Ã®èì¢Ô- 9’ žÉ ï´ÚÝ$^>;¡D¾Õ?5ÁóŒ/²ñØ”`¨:!åá¾v^c¢àÆÚì°ñvðRÿl¼2‘1¡6;;˜`yø]ƒ.ü®jLÓÐŽ³åš™V+ÒþËÑh”gÏ&ȵ‰¡¨î8ƒ:>ÿu†ÏÓ|kŽSi·±»&}BU‚xw“šÄ'n:SN¤"Q‘•gà ¯ $Hq‚z¿HPO‚ú¦`Aßz¿xêýò^}uã¢puãm€bcÃ7p<“‚bv¨;Ô}c­+ÌÆ|ñ¶ÝVË„ð„&KѲÛbÅ¥W€þ²Ý´f5/XMõ•»Ñ쀕[Ì®Z¤E‰ø†\„«$ôx¾éNº÷ò.‚ÇR7Üf^Ñ„2!¡šã†nKÄç%ȆÐîºïÝoù [c¸qÞ-µ >sÜMx^uóŒÄÉÓæ  Ã#54‡V«ÌLà(TÝêF]ÜÛ€<\%pû­öÆæ¦A ´!\…>}Bmgö tBmguÂILÄãï:äÝÕÛB¢ÚÝÝJl¿¡öòÞlqP(ê®c4¼¬zÑx¯â‹ø1iîšFñ óB‰uóXøÍ»÷"}gw‰š³ÙÀpqñÁAè66,+Y„'%¡î MæJï5Wª U/ªI<'3Á;sj«›ÃÕçà€€žçyÿülvv"="ìî®Sœ×ˆÉ Àà—4¡v°ÊF(&=!Ÿad†‰ŒŸW5{°iðôH@C"ÞP5{¶XF˜|cítW‡çU Š»¼¥a°·T_ì³ _ƒ7$B B‚»Âx¸\dMå¤{A¹ «ìÙ´hÄäiß<•óŒp¨ûK"0Û÷¹¬eÞ`‹’g|IDgM¸¦¡»»&ªénèž·`ÝüpÈwïž<¹{YuFŸS´?¿!˜¨¹wvÂhh¦WׂìjÀï,¯&Ô<ü*ÃÙ˜“ ëJuãÑïî& v<˜«ÛÀ6Èœ`¨F,QÈ!O;bô™µ`xwu£™5`° `>;¯ú¶éƒ fc,“…d»a°/ÉÎì³aœÌG%±î†ÚT=Dæ÷xqxk=.öøfŠžu{.=Þ…1ô?’3Dõ%Rîv…Ý¡1Ř&‡ß5‰3°Äså M`Otx&Ôò ¼bA.®,HûŠ„?b>(@AØ ¬þ>œ0" yBí`Åìá‚ ØŸž|ÜÚÁ7 5~~ 9I¼F‚V$hš ¹ (BªûËÑyéÁPu÷EòÃl‹„òŽðFN M“ŽÐýH¤Ï‘N¡í8J/Ê#(O§ÚÉFÔç#AjCzí⯳ëO í…T»Ù/ÆÏá~RŠ$žÁûÉ&¤Ç‘ö¤ê4åߑ֧êfÿà}´mŸ A:†Ô‰´i%ì:èQÙˆB^B=Dæ\ò±à±Á{ÃðéÄGARM“M'³å›Ì ß–»Ùà N”q7JñŸÙžFü$»2ìÉ’I†š×—gY¨„̆l’ƒ2LrIžYFòIìŠB!#HžÏH2 }%fÿP¼íúW6‚-f?a/s™OæÏñ¿Jã¤&¹Vþ¥FéU~£ŽT¨›Ô=Z­¶CëׯÑÿnɰ̷¼l9n]j=a›dŸkÒ~¡:ît<ïŒ9Qc©k´ë_]oºG¹?ñ,‡7ûÀò¥ÜبĻO¥€—Hñ‘â#f6jdÔ•íÊËve¿Ã3û°ÌþrÃùíë$ñĉå< @faU…ÔŸ*§Q^ë¦ÇC”—)Õä€\ smæ³26‹-dR¡ËíNB¹4w¸{øzšë¥Ã hî¥Ka,×"®B:\3²³†ôd oA`HlaæêLF2Óýé™<«'CÒò E·õØ5»Ñ£{º¼[¼»¼¼6¿9Ÿ­ætuxg˜±t¥ôé~W(”¦Ãsአ‰;=±!ùm y'gü0gÜnS½”x‹ëëú¾[‡,âöq¹ÇWTTô#Õ×áC*û¢Ñâ>WÔ-®ìóG‹q{UÜZ_ש]é”ZªªÆÁƒ£FR<0·®_üèPêó*ª/\ÎÉ/KK]WÐÒѱ²Ò¨¯Ä¯ s—âóR˜ÃòÙã/n~æÇ+µgïÉytíø÷öl_yOGÞ]KWî¡ùOϬçÃox¥uÛ»ùëñ6ñ–½÷È\4?ro$9•î(Þ±öÂëW¿8c&œL8%½.ouEI½%~ÒçÉó0îwå»XDÙ®ÑôP˜V‡›ÂaÎ÷åÐýv:|xa àOOÏÃdÍʲ2ztEiiÌ[Õ!E%‡Ô™õææFôRL8æ·ÛÇG m…1¬ËVèµÙ ÷¥ìÐPÊ;‡îÊÊý“üŒiê.•i¶X©=0¼ÐïˆZÜjFNzx´¬ŒÍê:T-îuKÃz™{l¯êYXNyA.eZ.åù¾2ßDßjŸ´ÆBY©Íâ°—D ýšsDÇfÕ|µ>F|Yã Æ•t8ËÛ-Å}GûŒ·?: ¸÷3î1@މ†zÀÊþW+û€WÑåB2{;ÀŸøÓ*´ U3£)©fÔ̯Ùa^™ƳuÄ|AžÎ–/2V‘EK`å+*ÇÆR_8GQ‡ÒhI¼CÕçÕ©D‘-‘^quió[ßÝý座~þÜÆöÇWü˜æWM¸«AÓ®ZvËä£ýy«êê'L½îN&VÍ{äöš{òâ×>Øyû¯Ö¾¼éÞ'{PÿäŠäƒOv-¸çîþ9Sö§¿?qê´úwô¡ÛnÚT»ä!xúû“ä/É[!Ï*âáI*çŸjª¤Jô+‰RAkk-è¢L¢ "¾›¾£%%u-¤2z> mi‘Õa¬t´»Ì¯0Ÿáæ/]õÞ§pÕ¾Gw¾yÓcôÀ?¾¦/>vÓŽäÃÉä?’cTFõš£ÖÄ g)t¡ªb'’Æœ)Dµ«–ÖŸÄS7sÚÅ)Ñ8Õx±‰šƒߨpE£—OÓÜ>/SócîRƒåÓëÞÿø“÷Æí{ôç{ä­%'|ýdü±›~BP•Îß]@?0Øçä]¬»ì9b8wB–ØN[÷*Єè6!_,š'fÓŸâÜéŒß÷j9(æï}‘Q#e“]M”b\Ö<ºj|IùÿgØ]AåÚâhÍÍñƒK&U`¤S§Ø»ä±’´¸…$J×í6ó…xר‘y&U¤È„5”NºfttÒÄS“JcS¦Äb¡£Žœâo€g9iŒ§M¤”Sȧ_êJ9ã ^HŒ5¤ ¾3?L¨Ÿ,„oº™ì„FÛÉö±Cì8“&Á¡¤œpVìÖ×µ×Õµ”—“ÊŠÊŠN¤Þ*DT}NÔ¿ÑÿH›/o;?Q†GEÅXü¼¼Úpn¼T•üS$YÚ¨*^UUIUe¿Ì *˪¤ó‡©[åD—ªP}Cœ[m|C O cŠ—ÅÆ÷RÙ_Q-®Ÿ[~ìžÔ §¥Ù.¹4š…ŸïÏ ‘äGtÔFê¿_š´qǾ–°dØüà‘F6Æçt”«N¿“iÍ*õ0÷y}^¯×·ÚÑé`*ƒÀ`VÀjórÝg{ت?ì˜sìR¶(Œ{¹Âˆræ*w1—ÍgsqªˆR’¸‚IJÆTö½Û—ªÕ·Ô™òAP#u‚21uxÿ&/ƒ"LÊpPšÍ]8GóKî_¿`§óÏ^<½úùäߨ«é5kU×UãÇö´ÿ(yadzzà ;.eƒZü$'î5¶„Ûãä>A6é“l*Œ !·@;ô2Úñ\vÍæFkj¢%ÕÕ%ƒ¥”]]"ª%Õ^¨Š–TU•D«Äx&˜ã¥“šçHtd€ĸÓþ½î„ͬà¬`súÆó€Ó)¦ÌœÊ«ÆIטâˆÉ•‚1¾5§o3É­ælªªF_b1¯h•˜××/çF6ÒפJþ®i{ ‹{ä—úRœ©À–ÎßVßc‘5(Lºz[@#´ƒ$U^˜Ê÷ˆÄç´÷ÖKfþÀ\i­ü쨱tTüW;õ}:c›UÊ=!»+¶9Jw¢cGŽ•`LÐ2tèa#è5Œ Ztºˆò©†ße«5êÓèFy´5tˆáÎ~ÝQþº£Ì=ÑÍÜî¢ÀÈŒ’!Á’×Ë4(Ê'¯Ú¶cù‡4I-œX8«°³p_á¡ÂÓ…*; ]¶ÆŽæO­ R ¹ý1ÕºÏÊ8± ᆑ[zø°ï¡Î s_í²Rf½ªðUÙkuÄäâôš‡"ƒlòG HÇ~¦N óR$ :>ZáX««è3„Í¢êªÔ›¢f¹Õ€¶ƒ¢;è4W"Ðeõu2´q$ZB\^{u(4w´Ä_e¦ÆŠAð†s˜Ë@cfª3(²XmóS_$ߤ‘/Þ§Ïõ4 sÛu·þr]I©ÔZáwOXúÎ3ÿþù__~ô¾cCGß8¿dؘkÙÔtJ7Ñß%{’¯ŸNþaõêíëCyéý§òƒ¹yŽj4š\”Ü–<™|¢šWäøñÍ —øå10á· Þ«BN½_Ç4]§.Iº¢«å:Õ-t=Q!ÊT]Ò5i½¬xaÌhJ@)PøÇÊ9X™šB=w—éŠf鉳2>‘/ä«aõr®î„@ã2Ô [•©ÆvÊ”cG'£ªD$nLÔu‚Øÿjf•W ¸Ó‹…̓Ð4ýæÖ‘@%ÌÇʺŠ10Sú–5{[:¯L‰hÀrÀ¼ˆ¨²QĨ¨52;̳y˜F=V*mybkrÔ¶Çé‘Wnzn?ý<é–Û/œg“ú÷CB¶ÁÊ+†„ô‘öx¾ê¦ú!ƒvyi—².F;5jí±¾d‹kö˜ÍÑ£I¤‡¼ä\žŸ§‡yTµøˆÍêj•ã²ì“gÊM²då~ë–&ß!†ùfŒ)}éÆ+·Ó_1—ÕÿŸ‘>˜S"¯«3uIŒ0„`º$»$M¶‚H²KʤâŸÿ)ùyòõÒà­‡¯ŠmÜõòKtýOQ»œ®¡´–vŒŽ¬Ÿ–<•ü]ÿÓÀí›ÀíµÀ­okFýóár{²3¹/™HÞ?-!*GC?Â-ã`vVre P³€É¨[§mD“ÚäÌäËaÖõ£Å„bàÙ.ÄÁ‘Gù…ÉÌ;è‰ì…þ*¹Ð+nàgóíæ(£âšÜ£p+H!Û- Ýni‹s›·]4P€ñ~'ýà8èô¨X Cðíýmû[ÿé§÷KM÷ßÿõ#)¼Ã)n‡••w3.á½ð¬¶Ê7xî86ñ‹yJ¤Ÿì`·Èí_#@É ë"¼ÁFÏXj,–G4=îÐ-1É‹šµ@sÄôýï쵘åg{uݬÇд˜ ¡Æ$ /çV‹õn3 sÐ-úݲÑ&¡§Ì2ÒëͲÐ+-×Z³È¼Y¢eÒD‰ ¦ão Ã|2e²Uç*u[9Ó%y¦¥É¸jñ[˜F-•µ‘rÒLX-ŒK&·©q¿Z¦2U=®žV¹…8°X»j"\Õb2X]‹…”.Ì»zaàá'ä^eH R4̓y$"„ÝaBü‰Bx;âC"À1‡? iT*Úvì‘cÛŽ}öçcÒóý/² _×Ó­¬°|°4KܯPF×§ Ô•2„/45 ¨œ¾õ­2?Ëg\£ í çÔûÕ6ÂÚ¤¸ ²H—(N(KL_Ì^‚¦Zó’Ñœ¦brÔ•Œg“ÊŽ}ô£Ҝ¯'¤i]B_ žµB"ÏyF1ìÎ&û•¸(0Ê.c—ñ±qÎPòme¶NÛNÛiÛW6X§Ø£Ìè!’­Gñ8Z¹Ÿ/ežV=M‡6úð3e‡Ðဢ°¼„ÜJiaORÖÔǬ±ïç>ÿìçúhyòð–o“·%ïIþ0¹5ÙEWÓ&|ל?ήcS’o@¡~|KØ…gR iAdkV¼,`¬Öh6ÖÊ£Y[£aóCÓÝB?Ð)q9Z%«Þf‰{¥%Ìc¹@°”·¤Òô³!SLÝÐB¡àCI†=Ñìæˆp>o}ýï{åµ;öÐìýËórûo÷>}¼¿“k_,ë†OÀJ’¹ä“ø£BŸN§ÃÊNWte}0Ý ¦kAº0Hy ªÚ õ{ó½l—ŽºNéLªz¾Îê«uaÂÐKõj½C—¸ÔÓ%gNnz‘ðžÉÕãöö8=Y†á‰5û×ø™–±Á%ï„ *麔•wºc¹þ¶…À«µQ› ,’5+‹‘,ùeÁ#P¾ :ØÊýo§ô¤ˆ7†hAº˜× ga‡AŠHQÊšòå>¯d‹`W‰¸ÐÜ *øyÏ÷[Ö=úÖÖ¦æÊäŸ_0£D÷>¶äÁ-³kG^øõÆ ÒéÈÊ;ÖÍ›T>¿cúïN F´©mn{UMtβñOŒ4Ø^ l«–6• !¹›0…A4jú7¢ñ ñ*p(Ä"2WXÚ‹“S~šœ,Y¥ä×LJvà]oCB¦;ɬçˆeàã½é™1‹ öb;7†f#3Ü1Ó¡ðs\-É=v|È{¸ÏøFÞƒû•Wv-B`p/ ŠtuBìz=¹pÇ—ß[¾ƒ¾ðå‡ô-þú…ªä“ÛŸæÏc>¥X[æ£Íñ›™LËel­*ëSî³,ÉŠ´ž3/t(úʈ"q(Ÿ]l?ì æ†# qqˆ…­X ”Ë2WÙE<‚P‰£OcŒ=•›Æ¦èŠˆÿ ÑW±{xQaó ºoÛw£F ‡;ªìÉѯ$£OÐvÚ!·Ÿo…ô+½‚±Hr¼t$ù ÿºé;*o{ùgwOYuC±î(¡¶hxÙb˜mñ®×_ôdÏ™RsÓÈ8² ”zÖ¤Ô!ˆ$U °¹pÈê!›‡ æäÄ€©l¥]2µ PUÚ˜l sWo§Ú?ðôZ ƒ}˜nBgaÚδ}i\Ó¨ÝálÒ U£il(if™)`¡)ëñc¬YÈÃ~£¿®¯21±z˜Í¸+;\ê ã) îºäP£üìÖ‘{ìýý÷¾²fëÖeÛÖ?´ñ{c×,zhJ#­üò-ÚNÏ}ýÝýô©§žþs|Öù8è"t!NºÜŸ(4_'ãVÚá§›©èI¾“ÛEŒ§÷Rª§õ: µwÐ/r'zuêÁ1Ún‹Ém,Ãv Åý¯} ýocÚI@±÷ Ê9`v5Ôx¶ˆh"4Ò\Û—oÆ;U)½¿ôHï}›ƒÝû?NžøÍÓ_<¾eîÚâÙýQ´u-ìGà$ùùÉ©wíܾFÙ“l”®ÅJ†ad<]¿}ßÕ´seaöçR*gÐgJéÏÒŸIg|VéÂRƹ¹Œú2ò2?d?n?mçlœ× ,t[l¦Ö¤1”ò]yûó;µqÈuÜÅ|ù½[ò£EÍ£ÉË *® ðij޴XÅf¹\°G&®Ë7+Š-˜Y”µyèø¢Þ íµ]^§+Ú?p0ÞŽ x]®Xg|sœuælÎaÍ®5®.×—ä4¼Ø,Ú$‹fe† ;6çP-§<§9§+G²äb:ñìÄ;œ.'ëˆÆ{š=TÓËõIz­.9I•~›àitÅêàŠÌè;x¤Ä€¼4ó£ °¾1c^…<´%˜KÄŒÎE&×EŽõEÌ+ jj 2|[€5Š›î2=Ñ˜Š†£¤Q§EÍx%ô"ª]6âñçùÂB‡sÊL픊xÄu8GE³Ú¦çþm•´¾uCòà[¿üÇ7>;cÎá‡î˜EK½º%ºiñ¢ÙÓ[Zfÿð?Œ¶^_”V7ª‹Þ31–Y`¹kÙî?lZÞzÓø†%õÑŸÌéy±¨xËõ·ßwpíꆦ;W7Ì]{áÝ{ššiÒ5ùWÍ: á4D,Û±;wk¹òoŸÐ‘Û;û‹`ž|šØûÌà©rÅb®²2îÚç8ä`¤—ª?³=c{ÅÆAãÇ=V[ÌFyŠõÜDLW YŒØ¦wäÝHÝ£OLM„¡gìÁi%’¥ráäê,}ä‘ÖC«øÙ‡Š®ïÑûçJî·>òìØŸaÜ<Œ¿d R ¼ÄÍþ~Vf¥ôP–Mé>ýUÝ)ÄAFfF§EõZ2Ò-jµe¥¥ÃÂùæLa&¥³2fîËä¬+“òòÌI™Œeª– Éçõjð A™DjEQØÞ]Øb nìkû=ùž2ÏDÏ,ÏBJ<¾^ó?DÒd–L{(C È[òvå1’è@D“r·ÜŠoÆ -Ó$ßÞ̆….Zƒ1Ð:´ý¡»zÃCkïœýìåïÿ·FfN,šɼaùu½¿¼²sܼi±™WäåMj×¹-Lœ8-Ir1ÎÏÌÇDL“ñ‘{ÁG¤ˆ^å¦Ì!ër¯Us’^¯»—yl §ª;;°O­!•æj dÛWqêâ¨i‘Âiì;bà †0j ¢#¤E„¢Ói1=âf5-SIúÑ–ä'‡o¡ó“ÛfLZ×Z< GRZ;ifòDgÿõ·a[’c§ù9É ùtË>‹œ!3›lxÌ<§êt` ²¬ ö¡d@SØz%xMÂOÒ;””!¡\,}fÑÔ˜õ‘JáS›Au˜þƒÞ­97Øþç`?$ÿ´uF#L‰î¥ Øáþ¦Žö=ì¯bVàᘕBŒ×j¬€•³I [°—]bŸØttq¸årG×)61(ââ„Ú8eåY2Ã.<\Är8õÀÉý¶kû_‹9ïýŸÝZ»èÚO®¼/¹úqšã[î¯?—Ü^æW‰ù/ÇüWbþvZ¿¡ÖNgaKNüÀnn†Py¹ÕfëqM›grp6Ú>¸ ô•ɺTnÑõ.‰{%]•8”—EíTd¯¢Èè+ƒÊ8°×ëªcW|Œ;DI-2±«ŠÓ¦ƒÃ$„™á×ÛÊmx· [騽±‚§q0QÕT¶_üTÀay®íRèDeŸÂT¥L_)²òy%‚+ñs?­¥ÅÅOD¢Ñ1H&…"&Àa3G`1mEÆy*j†4DAÅNÜw7 Zž+ö›[Z C¬4ÌqÚȃȨ´ò¡Õ_ž]ÝóÈtþ«í/ÍpfSû÷Hîþa¹ô•ä8ö5à½ZVЋAŽz6ܸûAɸðk^‰8'ló3%·âðø@ªvYÅ5‡ÜÖa“Ù€kqÚOœôgúBDœÚK×KÖKÔ+Áùª)Æñ¤ŠL„ô¿ÿ¸Ž\ Ü@n$Óñ‡™ä&2 Za6Î"Þ‚Q°³ˆ$> F!SfÍ™Q53rõ’Æyw4MYºd)ù¿~‘‡ endstream endobj 30 0 obj 10248 endobj 15 0 obj << /Type /Font /Subtype /TrueType /BaseFont /MZGHYJ+Calibri-Bold /FontDescriptor 31 0 R /ToUnicode 32 0 R /FirstChar 33 /LastChar 35 /Widths [ 532 507 507 ] >> endobj 32 0 obj << /Length 33 0 R /Filter /FlateDecode >> stream x]ÏjÃ0 Æï~ »C±“Л1Œ–Bûò=€c+Á°ØÆqyûÉn×Áßá“ôŸÄÏý¥÷.OÁ ˜arÞ&\Ö ˆ³ó¬iÁ:“ï®ÖÌ¢#ãûšqéý@JÀ?YsÚáðlÈO¥ö–,&çg8|‡Z¶¿qAŸA0¥ÀâDë^t|Õ ¯è±·Ôwy?õ7ñ¹GJDDs‹d‚Å5jƒIû™BÉëU1ôö_«»ãtŸl%‹„8 ÅdÛ’% ÑUÛ‘%‘=Õm¿\Y\ðl¶”(kýR=£ÄsŒ!–8U?™øv$ endstream endobj 33 0 obj 240 endobj 31 0 obj << /Type /FontDescriptor /FontName /MZGHYJ+Calibri-Bold /Flags 4 /FontBBox [-519 -306 1240 971] /ItalicAngle 0 /Ascent 952 /Descent -269 /CapHeight 632 /StemV 0 /XHeight 469 /AvgWidth 536 /MaxWidth 1328 /FontFile2 34 0 R >> endobj 34 0 obj << /Length 35 0 R /Length1 11136 /Filter /FlateDecode >> stream xåšytÕ¶Æ÷©îL9d"¡CÑ!Ø „0EÒf"!Ic7cB W01‰znQqÀǨT ÐFPQqDq gP"¨à’¼}êKÂp¯o­wïZïýñšþêWgŸ}ö9µ÷©¢»W6·ÔS µ’‰†Ôίi"ã•bc$Ö^¼P’_ÑGˆ|ýç4?íø?‰ú?oñ´SÎ%ò j¨¯©C›¸ŸrØ€¶Èfl˜¿ð´S˜aók{úSœÜ¶Ì¯¹¤g~ú„Û¶ kæ×3ùåpó!µ©¹¾§_p;êN"5ˆu/‡žMd‡(å[ÃÝ8„ >1 …ÑÓäG 3“ª‰‚jÅ9dæ^Ùï³Î›uäˬÐÜ£Ôߟ DÛ~¸ìuÉ—W>>>†Ë^´>>>ÞÞöïïoooo`»×]Àk˜öUx¾¼ ¼¼ì^žžvÏ"æ3ÀÓ0n¶O[/ð$ð°Ø lt CÏâ jÀF=~·ÚGôø¡ìò0ðÆ=<ÜlîîÅð{€»õÀ:à.àN„¾¸Ãonnnn¸µÀ ÀõÀuÀàZ„^á«€k€6àÀJ X\ ,þ\\©[³9/W­À2àr`)pp)°X \,.Z€…À ¸hõ¸á¼ˆ ùÀ<ààoÀ\ 8˜Ôu@-0¨ªYÀL`0˜L€0 2 º.àð'p8üüüfL+~5®H…ñð ð3ðp8üt€ïÀ~à;Ì÷­­&yÅ7À×z4ß9â+àK=z$·¾öéÑÜú\.d|| |¢G±ñc=º˜±øø¡?ÞG°÷lð.ð‚½qooo»×]÷B¿ ¼‚Å¿ ¼„ù^Ô£óye;1àLôâ²|Èú€õ ëiÖvÖ6ÖS¬»¸w²¼¢™^¢‡Ë›c1’s °¸h €|äáÀ äc³qÉQ@$ÐOb«ÉdRtgÒ†gL mfíd™L„µ\ T¢ê“±² `0˜”çeÀx (ÆÅ@P ’±x$ @<`â€þ@,.3ˆvÞÁ—{‚õ'ë8ëëÞ¿³~cýÊ:Ê:Âú…«ú3ë'Öw¬oYß°¾f}Åú’õWw7ëuÖ.Ök¬WY¯°^f½Äz‘µ“õËËz’+þk k3këY}år¼¸ ˜«‡óG!Ñœ´Ìê: ˜ ÔÕÀ,`&0˜L¦À œL\@ d Õé@àΩÀ °£6ðÌ€ P;’œ÷r‘ºY]¬ýœØ÷Yï±ö°Þe½Ãz›õëM֜譬å&{ÒßMIW‰Œ¤+KZ]W´·º–•,u]Þ¾Ô¸tÌÒ²¥¦À¥VÆ¥KÛ—~¼Ô÷²’%®KÛ—¸ÌK"—(–Å%‹\—´/r.A—´¸ªZ¾n9ÒbŠl©j©kYØrcË6ømhÙܲ³ÅäíÞáŒh9¦¸µåº%’ûj¡ÒœÜR¼°¤Ùµ ½ÙenÎnVÆiûš…2¤YLj®nVØkSóÀÔbé=¼9:®8¬yH³³ÙtQI£«©½Ñ5±±±qYãúÆg}–5®iT6ò™âl .¾°d¾ëóù‚¶+ÝÆÚ¡të&Kã6¥‹õ8¤t9»Åœ€¿q"æfœïjh?ß5'£ÎUß^çªÍ˜íªÉ¨vÍʘášÙ>Ã5=cªkZûT—'Ãí:ý§dT¹\íU®ÊŒ ×äö ×ÄŒ ® l/Ï(sÛ^æŸQâ*m/qM*ã2Š]E¦œ$þ„ùݔؚx8ÑXД 4%ìK8œ`jŠ?¯,³ŠÐ¸eqkâL¡|PpèŸÔMÿõý7ö÷ 5NLAM­JSxk¸2$ÜþVø¾p3…ß®„® ]º1Ô41tVè¡ÐîPóÆP±1äÙ7CLCf…4†˜BCdÛæ ÉZœì—lÊÍ Î žlZ,œÁYÅÎàƒŠó‚&Í 2­Π”ÁŇ,ÝÅiáŽCÝJw€ “° þ*Œaò—5QIÅ^A›¢…ðŠë:ª*Ž2¯_÷ä2ÍÒ4M¬Ôì•ò謘ªù®ÔÈ5uš»Cˆk=B)¨Ò"Ë*¦¢½|õjÊO(Ó*ÝÚÝ ž2­•Oœò¤›O(¡#šò=Ž™ Z,XèXààkæ¶,lá·ÁG>oáƒ<#vqüÅKzp'{N Zfµp vf³ŒÞÂ'²!]þ"Äÿ®Y®íÿì%þÏfþ?q쬙ò×[¢®µ§ü`{]AwR;m¡§è9zÞ¥_„…+^NÏÒWô=ýLÇù6õQ"^ >eÜxÚu•Ï| 6í _Š!ê>Ö} ëáîü£tÈ)–µÜŠ1§œ´tGtwžiëZÛåízÃ7ÂŒ±aÊ.ŽvXtvSòxdXwŽl++ä¹1Óa¿u]»ÖŸvMÔL-t -¦%t)-¥Ëi]EWÓ ZIÿà\,ãókh­¦ki ]G×Ó ´–n¤›èfº…n¥Ûèvºƒóx­£õ=}²½ŽÿÝlôÊž{éz˜eÞGè~zâö#œýGéq¶Á‚öcl¹›îaëì'½¥Çh#ÿÓ¨ƒtÚD›¹fh÷¶¼´ƒž 'ÉK[¹šÛh;ÿúÿ ×qWöyÃ&-½í¿ö„ÿ ´“^¤—èez…^屋^§Ýô½IÿNÏ‹}Qd„·èmz‡÷ÚzÞ§è#ú˜>£Ïi}É»îà?õÈ{ÙçÓ¯/Øë:Àž qàó Çø‚ööpì}ôµð§£B¡ãÔÍg²z7ºÍ¨£¬Þí\· Fže=6r[VY—µyŒsþ×WVFžßÞSÇÙ·ƒóÚ›i™åÎÍ=µB¾·³Ì…Ì'²ùg5“qžéËø.#OºQÑçûjq² 2‡2Pov>9%‡ßзFfdv?4r÷É)Ù“Yþš3(« cœžÛ/y,ª#Çʜ˜öŽ‘}{¹}€Ÿ9Ó’?•ø¾ë;ÿ®§¿“~¤CtÔ8¦Ÿøyò áö¯l9Ì­C|<Ýz¦å7ú~§?èWðO:qJëÔsÙs‚º¸Æ$„P„‰ºNž´Êaæ¾üLóÂ"‚D°¡üQÄÀ¾žðê99êd_€'Bô‘ü¼Œ±"NXù¹™ E’HÄɾþ}=6îQÅ@aïmŒìß76‰?"ÅôD‘¾ƒÅ±ˆ‘!2ù|¨ÈÃÅ1Š-éÜÎâöhîb0Ÿ&ÑlšGÇ|ö+¯óº"ù©Òá,ž5sÆôiS=nWUåäŠI'”Ÿ[6¾´d\qQaAþ9μ±gçŽ=j䈜á™éi©)öꀤØÈð°Ðà@K€¿Ÿ¯Ù¤J+R‹«mZJµfNQKJÒe[­aCÍ)†jÍÆ¦âÓ}4›WÃ]§y:ÙsΞNx:û'ׄyþrið– l+ª/·q·¿¦ðu&YÅX›F“lnµ^õ¨¼‡œ“ܲ82×F}Ë*Uù ШvÏ.©:­…þ‘èÓ(¹¬ÊÝÛàïn­ØaÔU–Õh3Ú}Í’3ºK{»mmþjYe›œ\í H6¾ƒ¸8¾)¥5׌ŒÈ曵˜”jqj ³·Õx»[g·u8mMEÕ £ù6hSKëÚÔJw.×Ò¸ï—Z—È©#¨L”Uå§§ñ³'¿C++:œbeåT÷Vþ,k[YåÖþö[ïéÈ}î­6"§aU¤U¥‹M6d¤ÉÜð7ü­[D­F¯Ù0íZþnØàÄ6Aµ^¶°^?…mfØœ†ÍÃ/¾Ãb¸ü.²ÕÉò\æih«öÈ›‹¢¹”üšPÇ’¦¨cù;»ofQëóµ@5_Úó¤=v_i÷Só5-89^~&µU«üœâ-ç&«ððî“»_±Û¼ÝÝUîäÝÖNO2ßÓYSÝZ€ƒÿð±g¿qRÕl§µÖÖÈu‹ouyg–Özø^è È.¥ZGè‰ÀÅÆ¹yP-׆ hŒoå†ÖêÑ<9©{®\‘ͦQ‰:šËŽ˜>)r¢LO[„š%76»jû ‰^ñ¯†ÅÊMžŒ¸òŠü‚xåµ*wÕVÛ¸fª­ä­Žg©EÖ-õüH4§Ô²X{:I^–ÉlÑ28 ¿åy`ä·Ÿ‡“"/Þh­èqà¹Ã´@^QÊ)©ìÀÙá®R¹~¯àÅK×çd˜ /MV/áG£\´1•wkÁöÒ~øc| [Ô‘½ƒ9–¿]šdŒ°úÉ+â¼›ìUÞîÕÅò ÐûJOSårc’u+olò´iЦ9ÒÓüÏ´æ¶6ÿà=ùòî#G!3ÿÙ”9ŸV3G±ªyVþÉGþ³)|w¤dþ[1Aü«¾a%ZÇŸážV®æ–«^`ú˜¿šøï­FQ9M ªí,î⯷£Å®Í……þé~ÏpS!›ØEþü!õ.g?³lµæ©Ã}W™*ÂKóüV)U”wâ³O_âÃîˆQ™»Eæ§ïw†x)|TfçžÎ¡CDxr¸¡ÈÅÏÏ×W¡ ”’3lXÖXexvŠ: D1lÙ9#Æš†e%*&ö„e¬"ÛÂôñŸME'*‹“ÇTõ{LR?SRb°}˜-´¬\ÍIó1ûûš|üýåä«®Eã¼a‰Ÿ0(ÖÂLˆgžxÞ'äØÏ>!ÇÏ3ß®ìå;Ðwqp âàWjbÔÀ¡ñg—‡û„XcââýüÃC,g•Ôœ¸-Îc±ÄØãâí2–ýÄÎÈêîcfç.žS«ü9Ïåîè»MYKá” <ç  p{l`¨8×îŽM¾¾Aª·{ÿfiPÙ°ÙU䢨¼¼¸òNg­Ó!2÷t†uf b}â6pèùRÃ{³ž3,9+Ñì“!Í2ÍfSá•O·Î NÌ”2,1hhªšQ¹pQUZWçâòÁMç¹râMËç?´ ·«ÖfñõåƒyUf¦_ÌØYËfºÏ ì*p¶‹¯|T÷Óû>vêGzW¾•Ò»w<ª”Sºˆ|J¹‰³Øã´È6‰PÙ¶±ÉBÖîý›E¹µ7V¯¨r†„VòåŠò¾kvéNŸ)œ™GKð.âþÞI3VgÏ`¡Dò7dŽ/þ[9*¿8,(·e66gÎ,·eTd"oÀ±fÓûYm¹jùãs»hË•Ë7ÎIíúÍ•”6rÀ˜òôˆèÌñÙƒrÓûù)«î8¦ÍœÖþÛ·7øðôÕ %\àæG.jÛr£Ö¹u—óýXÍ9Ôx÷Œ¥ýÈà“>9Âg¸tòÏÊF"b„W Ú’š•š’𔲓SºÏh¤”¿ø™BF{…}Ó€>9½ÙÌñŠ:=­"À+f?Ù/ÖØz±^1¥/›'{:9r¯‰L¾ò=ŽÎˆQ£23´gÂêìwVŽ8k„èY 9yžÿd¾óyZÌèK±ooŠqóóÀ„”á={–3î«&‡çä­tù¶æÜySF„ûû(æ€ Ëà‚ê‚ѳò&:甎žuÿ ä¥> ,Ð'*²+[-J™{_ãh±aîý冯ĄFôO‰“7~L|LìðI#‡”eÇ% R²RÕ 8GbnN×feè¬ÕòÑ((¢çÉéË;›Ê§Ž+ñŒwÔÌ›;»ynz~ã<ùDzÿb²Ž< endstream endobj 35 0 obj 5703 endobj 13 0 obj << /Type /Font /Subtype /TrueType /BaseFont /KBOACF+Calibri-Italic /FontDescriptor 36 0 R /ToUnicode 37 0 R /FirstChar 33 /LastChar 38 /Widths [ 455 514 514 514 514 229 ] >> endobj 37 0 obj << /Length 38 0 R /Filter /FlateDecode >> stream x]»nÃ0 Ew}Çt,»uÚA¤à¡ÔíÈm¨%A–ÿ})%Mw8$/_Õ©{îœMP½G¯{L0Zg".~aÀÉ:V7`¬NW*1=«À*2÷Û’pîÜèAP}eIqƒÝÑøïrì-ŒÖM°û:õ%Ò¯!|ãŒ.gR‚Á‘Ú½¨ðªf„ªX÷¡¼MÛž\Ÿ[@ ÈQ_VÒÞà”ƨ܄Lp.Åù,:ó/Õ^ Ãx­lj)²8? ’‰¦!$Öï Iœ?òŒ„$Â6cKx(ÅOeÖo×<6¿çvŽ^c¤KÊË‘yyëðöæàC^¶èŸ¬| endstream endobj 38 0 obj 256 endobj 36 0 obj << /Type /FontDescriptor /FontName /KBOACF+Calibri-Italic /Flags 68 /FontBBox [-725 -276 1259 1014] /ItalicAngle -5 /Ascent 952 /Descent -269 /CapHeight 633 /StemV 0 /XHeight 467 /AvgWidth 521 /MaxWidth 1328 /FontFile2 39 0 R >> endobj 39 0 obj << /Length 40 0 R /Length1 10556 /Filter /FlateDecode >> stream xÕš XTçՀϽw6fff`.^˜ˆ" Š03Ѝ€2qÆ•UѸ£&$Ô$ÕbvMš¥Ù›•&¹\³`’6&±MÛÄfiš´YM›.YHÒ´ù›˜ÿùîüÛ¿yžÿyþçé8ç¾ß9ß9ß=÷|ßý†;cOwo˜ ˜Ñ¶¥¥ Ô—x"»mG¨ª`_  u®ïÚ°…ôTôKrlؼk=é⫆PgGK;é𠲤 ¤sEÈìÎ-=;I/A¦oÞÖ–è¢nÝÒ²3q~x uqkË–òÏu"§vuw$ú¹€’QîÀ¡[r^ü‰üÙ1€Cè9¬ðèG@3f>Â- ö²~í-ÃC;>\g)ÿ¼4<ñÑ/0>·÷Þý'ŠN>otÒ1: …^§¿åäÆÛN0a?p7&úú¡$a˜ß­dVø‡ù]„J¦ µó;”Ì9¨õzÈe»’9ÝJf9â\Ba›’9[ [(`3á%c>öm"lT2ªPëT2ªë „vB´R@ ¡™úÖÖ*éae a5aa%!NˆVÎ&D M„e„FB¡ž°TI¯Á-!m1¡Ž°ˆPKXHX@ˆ„ÅW‹£T+¾Eˆ*Â|BHñÕ¡±’P¡ø£6PN˜K˜CXN(£1K ³i°B1¡ˆÆœE˜Iq…„„ÂtB> –GáAŠ›F}¹„©„³È3@È¡€l‚DqSÈ3‹ ü„LB†’¶¯6àSÒêQK#x êK%¸Éè"8 ê³ld´’f!¤ÑLH&˜FB’âmÀ³o#BOд ¹¤ñŽ*¸1Â(á¤À}CÚׄ„¯_þAø/ųÜ?Ì}Aø»âiBío„Ï %|F.Ÿ>!ãácÂG„ÉåÂ_¦¾?þHxŸðrù=á=2'¼Kx‡ð¶’z6&øáM%ujo~GÆß^'ãk„ß^%üš\^!íeÒ^"¼HÆ_Ž^ Gøá§„£Šw>îYÅ]‰x†ð´â^…ÚÂS„Ÿ~Lx’ðáqŠ;L&ãc„G &"(„!Š“)—‡H{ð¹üˆ0H¸Ÿpá^Š»‡î&ã]„î$ÜA¸páVÂ-Š«/úfÂWj7)®vÄŠ«qƒâZ¸žð}Âu„k  ×(® ¸šÆ¼ŠÆ¼’Ƽ‚p9 }ì' ç÷ÈeŸâŠâ({i°ïÒ`—.!Ï‹i”=þB?á"Â…„>„ó »~vp»è ;ièó;è ½”Ka;¯›ÂÏ%t¶¶¶6ΡKÙDçÛHèT\%xö „õŠsjŠ“ÝGíŠó"D›âd%h%c‹â ¡ÖLÆud\«8/DãÅy1bµâ¼±Jqàg1·Rqd"℘â0¢¶‚p¶âÀO{.ª8ðcžk",',Sø1Ï5*ü˜çõŠk©b –“±Ž°ˆŒµ„…„Š?7¹¹„ÉXC¨Vl °¯J±±íb¾b‹!BŠ-ލTl+„yŠÝ›å„¹„9„2ÅľRÅ–‡˜­ØÊ%„bÅÆÒ-¢Í"ÌTl¬¬…„Š•¼€0rÉ'äQJAJi!—RšJ8‹’rÙ‰¦g¥$R~:_&!ƒ<Ó > O#x òL%¸)AÁIy:èDv‚⬠!…`&—dÒLŠu –À¨X×"’ë:„ 'èZòÔ§@FžÀ 4†ñc8â(ò$Ê7(_£œ@ÛWxŠ/±ý”ÿBùåï–VÿßP>·´ùÿji÷†ò)Ê'(#hÿå#ìûõPþ‚òg”?¡ý(ïcûÈߣ¼‡~ÇQå”·QÞByå” þߥtú‹ò:Êk(¿AÛ«È_£¼‚ò2ê/!_DùÊ1”PžGù%Ê/P~n>Çÿœy³ÿgæiþŸ"šóüÏ¢íl?mÞâ1oò?eÞèÿ‰¹ÓÿcìyÒ\èåq”ÃÉçú‡“»ý%o÷?šÜãåa”C¨+È!ô‘QBy唡 ¢ÜrŸéBÿ½¦Ýþ{L»üw#ï2]àÿ¡©Ï'Úï@¹å6”[QnA¹å(7¡ÜhÊ÷߀r½ñÿ÷wù¯C^‹råÊ5ÆNÿÕÆ=þ«Œ7ù¯4Þì¿Âx«ÿr´_†r©ã¿D(õ_Ì•ú÷Dû£ßì^í‹^8Ø5õq¦>__]ßù}ƒ}oö…ì:ãÑÝÑówGwEÏ‹îÙwÄ'Ø-iþ4>×âåªë½Ü6ïEÞ+½‚Åó¢‡yró"–ÔSßMý4Uã¥æN€ÛêÝ‚‹]›{I»¶CîÊba±z­KÜR bqq—ßŇý.lÇmŸÙ×SÖ­¼ÅÂY,c>dAwKŠ?…g‡±!”R8;b1ûÍ<;Œ™wÈŒ–üYÉ M‹Éo⣕¦z2UVGB¦ü8‘ÇO+B0°l8—?2ÌÁ!7§å†¹«†š–ƒuÃú±eu²¡a•Ìí“s–³c¨q¥¬Û'CtåªØÇ]âøê&ÙY׸’ôK/¿ª2êäŒå1ù¶ŒxÜkŒa2†ÜP®ÝÞ»=ìY‹‡µÛ{‚ê5®—iøÂ|oïAýC ¬ç_¿È ýÖmÇ—: þ¯Cþ“{¸ÿääÿr÷¬[˾Ñß0z`Ò7# ° ¶ã÷Mýð]¸ÀSð&´ÂÅØºnƒ»á>áiø¼>)êÿ¨ŒîÒndá1Ð`ìÄØÈèÝ(ÃÚ” –¨94âi˘uì“3lŸŒ³Žëì`TcÍü+8Ú߸“c'øJŒ4•0ß‹m‹z¦¿êo}hôžI°CDálXq¨‡¥( ÐK` ¬ƒhƒvè€õ°:a#ÖëØ [`+ÊzØ]p.tc { v`»'a!}'ì‚ÝÐÄóálïÂãnµu!\„•ÿŒsOBß3Ár1\Šóq ¿ {a|ÉŽ“m“µØ—á|^WÂxûtk¢•µ¯‚kQ®†kpÖbûzœûá&øj=×Á÷UíV¸û¯›äËúNûß ·À­¸nnGÏ;qõÜs†/󼞄ãšúüWÛSØzcûxŽÃûðgø |À¹n|‡±úë±ê¬æ]êq#7œªøyXÛÝ@•½k9±R8#ÔGÞ£Vª8çaM÷âlì™3 Î›%6«êxÕOW”jÅ*uÚF•;pÊrºžãópÚrí¤šM®àXõë&Tt¼ö+;±};LÔ&¶ï„»p~ˆG6gjãö{ñgr? °EÇÓúxëx½`Á#ð(<çô‡Q;ݯ Çç|þ¹ýqxB]OÁuþŸ…£ÀlOÁ³¸¨—VƳ¨=‰ögà9Ü…ž‡àü×Îsª<¿Âõñ2¼‚»Ö[ðNb½¦® ‰ ÂKð²&¿Õ¦pZá<Ã/…¨¿Î߀k´ïCJ(²níšÕ«VÆcѦåËê—.Y\·¨vá‚H¸¦ºj~¨²b^ùÜ9e¥³KŠ ¦ççM ädKSü§Íj1›ŒI½N«xòÂR¤Y”Ͳ& -\˜Ït© - Ͳˆ¦ÈdYdq-Ø5É3„žëÏð ‘gè”'gˡƬ'XZ]Žõ `ìO•IæZÆÛ€¹a†x}YY,—ýÃ!hEEîoŒ‘.B«OPA0.óͬçÈx+ÊzúÇ{N…7KXÙ°nN¼wtzäþV1?gV}çÈšìe!ÐÜÚÖÉØÒ1 Õàb-¡ ÿ8¬ÁF¨%QÌðÐŒôoiÆ‹ØÈÊГ ¤.Ù)UQµÑ€ƒä„7.©!d ËÎjšÛQrAcq‰„ØÄ°ÙXRcì0Ì;>T$úÍ‚"ˆ³×‹1_–ŠcùâR¬#ÎfI²Ê¹ÇñtøÂ T£ðÚÎðwÆË–õ91Æû„8›-4ˆŠÇquXÙêçsÄá±±¦XÖ1ßH< o‰Õ(+crR?´9‹Ðo“f4/ûÛZXÅ[Ý™µmq¼ÆD—Z9 GHJŒ€5†-G jùÁ TãûQ‘ûãr<ÈNÛÈ2E« ¥98í4¦6ÀNT°K3ÙÂFWÙ˜³—! s|V->Tñd¸á²+Ò'cæmvµ5‹8h[ŽKöR#›7´tà–¨ t¨bô%:]–c2å¤é8 ¾YÛ4Ä·>ŽEa¯j{xn«lÂŒJ™Àê`W-Ëß{1yæú4¦q–I;qkdI«§Òc·lΩmÁÍŸâMh‘Jǃq,C3±1Ž’UÏ®<ë.ä4 Ý#íb;Àø+?Obla‚ï0.lˆœiWóó gZͪy`À`þçT/ƒùqÐàOõš hD©ä^ƒJáN¨ÐdŒ}‰:û½Ÿ~§HÆg*7êYHöë½Éãÿ[`¯{¹jî8å?®Ä'8->unÞÀ'4÷Ÿ«>iÕ?’ïÎwÊ繨ÅÿÐŽÁ"wào÷\{È®ásfë„FŸÙÖÕÈ5Öèù&¨|û·×¼óö1ä1®àí‘×F¬'_±—•ÎàlY6Uœ)¼^¯ÓIS¦ó³g—”Ìš5³‚/.šÎKSRPÅEüì aÖÌLžc®ä©ZÑ™Y…7¾Y%ÔŸÔñçûÃ[—fó~_Š3YˉZªa^ýt‡%«xêÔP_oÔñZƒÎ;§fJÍÚ9i£z“Þ(ºÝi)Z>Ù$zÞÍhD›râsmÊ×ÕšÍ_ ‹6,+Ñ^o4ðîI_jÎÜH–7(:,krŠÖá¶ëô»)0oÑÉý†Ô´T½Ñ¨O¶“<·!ɨK¶ž,ÅB5Žï ¿„VóòÇù‹ø~ˆÙ·OÑØ¡¤ Cæ0÷Ðós Ã܃%À9„@á0ŸJu@Òܳ2:!«vÚWi‹J¾ ¥,O z*+Ó–ŒTŽTÚS˸‚‘WñÏâ·GfÙfYGlee…øŸû[Έ猗>E`S€…ÕÌšéNe3ÅÕëœ˙ɳ‰™-äi²§9Ó¬˜¹fM÷܆©®‚ºM—ÅãÍthS>«†ûuÁ–š’Õ…~ü¯$8{[ó"»×–¢Ñ›’•®î™WzÅÁ˶U/¬\eM ÉúÃáYMçtoÍ“ÂeÒ¼Í×àPá rì„ kÏ…ùÐ7¹f!iº7{¾ Œ’Écš_¤Ñ:¾ •-’¼FÈž®ËÌd.ÖR‰XuXÔ"i›ulÖLV´oÇjDµ™í()_™z!aãhm2]OM—S§ y£Kôzü6-·M«OöýÅÛÖÕÙx£3ËãE3Ïù$WsÑp Ú‹Eg­Y½mnheYšAï5˜  ø¼´ùžŒ’³bËÁèè¹ãfm©!™9$F7¦•ϰKu•Óræ¯,Ê®‘×VŽûT[€ßÖä¦ɵ{8×ïÌ„a¾5d2ú33þ\M¶×2Ì-xTÊ®õ&–Ö;KFljÑ^{uÄ†Ë köØ¿ñÅBq‰¢$î×ñ²%JÄ} µ¥OËÌØy­ÎîÃVŽƒýÇé’â°:T4Í éT£15žžãMJòæ|]8~íÂ%x¯²k׳5Rk䮑"Ø;ù:CÓ4­œæpæâ?ÈÌœæ0ϨufÚµA®Þ›ñ.6OX*¸9qG¦á*±öíM9zÔÆÍÂE“¨@Èõo£Ypþ9ÎívávÅn©³¸ÿ±V‹F8dóŽîâÌFƒÁ%¥¥‹N£fôx®œ,. Ï™N/‘;¹Û Î4ÉãÉr„Û’ÓRG‡FçÚ½ú$³A‹7P÷ù¨Y­çôêøænW’Y/àNüØ—£…—pš•pÍÕ2g—$›‹ÍÅsª—Gf(=˜š\Rœ¥ÑÏø*°(Õì5v_­½¾ìË~ ÛØö£Þ_tw½:RÀÊtªlê]öíP —¢Q 6^/¼ßhJ, Ä§‚^ïvãf¤^rϨ۴?–¿¨¢Èå“pí¤úíZî$Ÿ=Í•†ÛД”jÜ¢o¥?€g•t5×Ù² 6×ãÖ”eá/™sõÁý›çÛÅ`ÚhÃøý¤ù7$¬á`VÝüiE+Ϋ.,J/ß|`Å]‘ð̦MÝ]¸æºp7ÿ½ð$”CïUœbò@aùÌB)Ûë“'»Ð+•ÏLÒήͬÍû2d]’Ø–ÆKÇàB;ʶ%›ºg§~‹˜ ûÑlºÁŠ‹Jf;%tºS{õ)[g´g¸œ>‹–ϲ†×l+«YSæMÒo_iZn«NgR÷¨æ:{=g¢¨å¼x“iØGã}SêBSsæÇ‹³Â_„mÚ'_I+ÍÈ,ÌvÎÛ|mŒ»bÜŒOp`Ga/¸êªêçWG‚Õ-›7¶vo̯íÁFü7IŠ endstream endobj 40 0 obj 5807 endobj 41 0 obj (ADASS2012-poster.pptx) endobj 42 0 obj (Mac OS X 10.8.2 Quartz PDFContext) endobj 43 0 obj (Tim Jenness) endobj 44 0 obj () endobj 45 0 obj (PowerPoint) endobj 46 0 obj (D:20121025184817Z00'00') endobj 47 0 obj () endobj 48 0 obj [ () ] endobj 1 0 obj << /Title 41 0 R /Author 43 0 R /Subject 44 0 R /Producer 42 0 R /Creator 45 0 R /CreationDate 46 0 R /ModDate 46 0 R /Keywords 47 0 R /AAPL:Keywords 48 0 R >> endobj xref 0 49 0000000000 65535 f 0000315233 00000 n 0000006575 00000 n 0000272867 00000 n 0000000022 00000 n 0000006555 00000 n 0000006679 00000 n 0000270059 00000 n 0000272831 00000 n 0000000000 00000 n 0000273000 00000 n 0000290658 00000 n 0000000000 00000 n 0000308273 00000 n 0000000000 00000 n 0000301706 00000 n 0000006883 00000 n 0000268865 00000 n 0000268888 00000 n 0000270038 00000 n 0000270095 00000 n 0000272810 00000 n 0000272950 00000 n 0000274072 00000 n 0000273391 00000 n 0000274052 00000 n 0000274307 00000 n 0000290636 00000 n 0000291111 00000 n 0000291345 00000 n 0000301684 00000 n 0000302218 00000 n 0000301882 00000 n 0000302198 00000 n 0000302458 00000 n 0000308252 00000 n 0000308815 00000 n 0000308463 00000 n 0000308795 00000 n 0000309060 00000 n 0000314958 00000 n 0000314979 00000 n 0000315019 00000 n 0000315071 00000 n 0000315101 00000 n 0000315120 00000 n 0000315149 00000 n 0000315191 00000 n 0000315210 00000 n trailer << /Size 49 /Root 22 0 R /Info 1 0 R /ID [ ] >> startxref 315408 %%EOF pal-0.9.7/pubs/adass2012/asp2010.bst000066400000000000000000001156651302604645500164770ustar00rootroot00000000000000% Astronomical Society of the Pacific Conference Series % asp2010.bst -- Modified from aj.bst January 2010 % Minor formatting changes introduced in this version. %%% ==================================================================== %%% @BibTeX-style-file{ %%% filename = "aj.bst", %%% version = "1.1", %%% date = "2004/10/24", %%% ISO-date = "2004.10.24", %%% time = "00:00:00 CET", %%% author = "Richard J. Mathar", %%% address = "Sterrewacht, Universiteit Leiden, %%% Postbus 9513, %%% 2300 RA Leiden, %%% The Netherlands", %%% telephone = "(+31)71-527-5874", %%% FAX = "(+31)71-527-5819", %%% email = "mathar %! at !% strw.leidenuniv.nl (Internet)", %%% copyright = " This generated file can be redistributed and/or %%% modified under the terms of the LaTeX Project Public %%% License Distributed from CTAN archives in directory %%% macros/latex/base/lppl.txt; either version 1 of the %%% License, or any later version.", %%% codetable = "ISO/ASCII", %%% keywords = "bibtex, bibliography, OSA", %%% abstract = "BibTeX bibliography style `aj' for BibTeX %%% versions 0.99a or later and LaTeX version 2e. %%% Produces items in a form close to the style %%% of the AAS Astronomical Journal, %%% see http://www.journals.uchicago.edu/AAS/AASTeX/ %%% and http://www.journals.uchicago.edu/AJ/." %%% docstring = "Generated with the help of latex makebst.tex. %%% To be replaced by any official AAS file whence %%% available." %%% } %%% ==================================================================== %% %% This is file `aj.bst', %% generated with the docstrip utility. %% %% The original source files were: %% %% merlin.mbs (with options: `head,ay,nat,nm-rev,jnrlst,nmdash,keyxyr,blkyear,dt-beg,yr-blk,jtit-x,jttl-rm,thtit-x,trtit-b,vnum-x,volp-com,jpg-1,pp-last,num-xser,btit-rm,bt-rm,bkpg-x,add-pub,pub-par,pre-pub,edparxc,edby,blk-com,blknt,fin-bare,ppx,ed,abr,ednx,ord,jabr,jaa,amper,and-com,and-com-ed,revdata,eprint,url,url-blk,em-x,nfss,{}') %% physjour.mbs (with options: `ay,nat,nm-rev,jnrlst,nmdash,keyxyr,blkyear,dt-beg,yr-blk,jtit-x,jttl-rm,thtit-x,trtit-b,vnum-x,volp-com,jpg-1,pp-last,num-xser,btit-rm,bt-rm,bkpg-x,add-pub,pub-par,pre-pub,edparxc,edby,blk-com,blknt,fin-bare,ppx,ed,abr,ednx,ord,jabr,jaa,amper,and-com,and-com-ed,revdata,eprint,url,url-blk,em-x,nfss,{}') %% merlin.mbs (with options: `tail,ay,nat,nm-rev,jnrlst,nmdash,keyxyr,blkyear,dt-beg,yr-blk,jtit-x,jttl-rm,thtit-x,trtit-b,vnum-x,volp-com,jpg-1,pp-last,num-xser,btit-rm,bt-rm,bkpg-x,add-pub,pub-par,pre-pub,edparxc,edby,blk-com,blknt,fin-bare,ppx,ed,abr,ednx,ord,jabr,jaa,amper,and-com,and-com-ed,revdata,eprint,url,url-blk,em-x,nfss,{}') %% ---------------------------------------- %% *** Astronomical Journal by the AAS *** %% %% Copyright 1994-2002 Patrick W Daly % =============================================================== % IMPORTANT NOTICE: % This bibliographic style (bst) file has been generated from one or % more master bibliographic style (mbs) files, listed above. % % This generated file can be redistributed and/or modified under the terms % of the LaTeX Project Public License Distributed from CTAN % archives in directory macros/latex/base/lppl.txt; either % version 1 of the License, or any later version. % =============================================================== % Name and version information of the main mbs file: % \ProvidesFile{merlin.mbs}[2002/10/21 4.05 (PWD, AO, DPC)] % For use with BibTeX version 0.99a or later %------------------------------------------------------------------- % This bibliography style file is intended for texts in ENGLISH % This is an author-year citation style bibliography. As such, it is % non-standard LaTeX, and requires a special package file to function properly. % Such a package is natbib.sty by Patrick W. Daly % The form of the \bibitem entries is % \bibitem[Jones et al.(1990)]{key}... % \bibitem[Jones et al.(1990)Jones, Baker, and Smith]{key}... % The essential feature is that the label (the part in brackets) consists % of the author names, as they should appear in the citation, with the year % in parentheses following. There must be no space before the opening % parenthesis! % With natbib v5.3, a full list of authors may also follow the year. % In natbib.sty, it is possible to define the type of enclosures that is % really wanted (brackets or parentheses), but in either case, there must % be parentheses in the label. % The \cite command functions as follows: % \citet{key} ==>> Jones et al. (1990) % \citet*{key} ==>> Jones, Baker, and Smith (1990) % \citep{key} ==>> (Jones et al., 1990) % \citep*{key} ==>> (Jones, Baker, and Smith, 1990) % \citep[chap. 2]{key} ==>> (Jones et al., 1990, chap. 2) % \citep[e.g.][]{key} ==>> (e.g. Jones et al., 1990) % \citep[e.g.][p. 32]{key} ==>> (e.g. Jones et al., p. 32) % \citeauthor{key} ==>> Jones et al. % \citeauthor*{key} ==>> Jones, Baker, and Smith % \citeyear{key} ==>> 1990 %--------------------------------------------------------------------- ENTRY { address archive author booktitle chapter collaboration edition editor eid eprint howpublished institution journal key month note number numpages organization pages publisher school series title type url volume year } {} { label extra.label sort.label short.list } INTEGERS { output.state before.all mid.sentence after.sentence after.block } FUNCTION {init.state.consts} { #0 'before.all := #1 'mid.sentence := #2 'after.sentence := #3 'after.block := } STRINGS { s t} FUNCTION {output.nonnull} { 's := output.state mid.sentence = { ", " * write$ } { output.state after.block = { add.period$ write$ newline$ "\newblock " write$ } { output.state before.all = 'write$ { add.period$ " " * write$ } if$ } if$ mid.sentence 'output.state := } if$ s } FUNCTION {output} { duplicate$ empty$ 'pop$ 'output.nonnull if$ } FUNCTION {output.check} { 't := duplicate$ empty$ { pop$ "empty " t * " in " * cite$ * warning$ } 'output.nonnull if$ } FUNCTION {fin.entry} { duplicate$ empty$ 'pop$ 'write$ if$ newline$ } FUNCTION {new.block} { output.state before.all = 'skip$ { after.block 'output.state := } if$ } FUNCTION {new.sentence} { output.state after.block = 'skip$ { output.state before.all = 'skip$ { after.sentence 'output.state := } if$ } if$ } FUNCTION {add.blank} { " " * before.all 'output.state := } FUNCTION {date.block} { skip$ } FUNCTION {not} { { #0 } { #1 } if$ } FUNCTION {and} { 'skip$ { pop$ #0 } if$ } FUNCTION {or} { { pop$ #1 } 'skip$ if$ } FUNCTION {new.block.checkb} { empty$ swap$ empty$ and 'skip$ 'new.block if$ } FUNCTION {field.or.null} { duplicate$ empty$ { pop$ "" } 'skip$ if$ } FUNCTION {emphasize} { skip$ } FUNCTION {tie.or.space.prefix} { duplicate$ text.length$ #3 < { "~" } { " " } if$ swap$ } FUNCTION {capitalize} { "u" change.case$ "t" change.case$ } FUNCTION {space.word} { " " swap$ * " " * } % Here are the language-specific definitions for explicit words. % Each function has a name bbl.xxx where xxx is the English word. % The language selected here is ENGLISH FUNCTION {bbl.and} { "and"} FUNCTION {bbl.etal} { "et~al." } FUNCTION {bbl.editors} { "eds." } FUNCTION {bbl.editor} { "ed." } FUNCTION {bbl.edby} { "edited by" } FUNCTION {bbl.edition} { "ed." } FUNCTION {bbl.volume} { "vol." } FUNCTION {bbl.of} { "of" } FUNCTION {bbl.number} { "no." } FUNCTION {bbl.nr} { "no." } FUNCTION {bbl.in} { "in" } FUNCTION {bbl.pages} { "" } FUNCTION {bbl.page} { "" } FUNCTION {bbl.eidpp} { "pages" } FUNCTION {bbl.chapter} { "chap." } FUNCTION {bbl.techrep} { "Tech. Rep." } FUNCTION {bbl.mthesis} { "Master's thesis" } FUNCTION {bbl.phdthesis} { "Ph.D. thesis" } FUNCTION {bbl.first} { "1st" } FUNCTION {bbl.second} { "2nd" } FUNCTION {bbl.third} { "3rd" } FUNCTION {bbl.fourth} { "4th" } FUNCTION {bbl.fifth} { "5th" } FUNCTION {bbl.st} { "st" } FUNCTION {bbl.nd} { "nd" } FUNCTION {bbl.rd} { "rd" } FUNCTION {bbl.th} { "th" } MACRO {jan} {"Jan."} MACRO {feb} {"Feb."} MACRO {mar} {"Mar."} MACRO {apr} {"Apr."} MACRO {may} {"May"} MACRO {jun} {"Jun."} MACRO {jul} {"Jul."} MACRO {aug} {"Aug."} MACRO {sep} {"Sep."} MACRO {oct} {"Oct."} MACRO {nov} {"Nov."} MACRO {dec} {"Dec."} FUNCTION {eng.ord} { duplicate$ "1" swap$ * #-2 #1 substring$ "1" = { bbl.th * } { duplicate$ #-1 #1 substring$ duplicate$ "1" = { pop$ bbl.st * } { duplicate$ "2" = { pop$ bbl.nd * } { "3" = { bbl.rd * } { bbl.th * } if$ } if$ } if$ } if$ } %------------------------------------------------------------------- % Begin module: % \ProvidesFile{physjour.mbs}[2002/01/14 2.2 (PWD)] MACRO {aa}{"A\&A"} MACRO {aasup}{"A\&AS"} MACRO {aj} {"AJ"} MACRO {aph} {"Acta Phys."} MACRO {advp} {"Adv. Phys."} MACRO {ajp} {"Amer. J. Phys."} MACRO {ajm} {"Amer. J. Math."} MACRO {amsci} {"Amer. Sci."} MACRO {anofd} {"Ann. Fluid Dyn."} MACRO {am} {"Ann. Math."} MACRO {ap} {"Ann. Phys. (NY)"} MACRO {adp} {"Ann. Phys. (Leipzig)"} MACRO {ao} {"Appl. Opt."} MACRO {apl} {"Appl. Phys. Lett."} MACRO {app} {"Astroparticle Phys."} MACRO {apj} {"ApJ"} MACRO {apjsup} {"ApJS"} MACRO {apss} {"Ap\&SS"} MACRO {araa} {"ARA\&A"} MACRO {baas} {"BAAS"} MACRO {baps} {"Bull. Amer. Phys. Soc."} MACRO {cmp} {"Comm. Math. Phys."} MACRO {cpam} {"Commun. Pure Appl. Math."} MACRO {cppcf} {"Comm. Plasma Phys. \& Controlled Fusion"} MACRO {cpc} {"Comp. Phys. Comm."} MACRO {cqg} {"Class. Quant. Grav."} MACRO {cra} {"C. R. Acad. Sci. A"} MACRO {fed} {"Fusion Eng. \& Design"} MACRO {ft} {"Fusion Tech."} MACRO {grg} {"Gen. Relativ. Gravit."} MACRO {ieeens} {"IEEE Trans. Nucl. Sci."} MACRO {ieeeps} {"IEEE Trans. Plasma Sci."} MACRO {ijimw} {"Interntl. J. Infrared \& Millimeter Waves"} MACRO {ip} {"Infrared Phys."} MACRO {irp} {"Infrared Phys."} MACRO {jap} {"J. Appl. Phys."} MACRO {jasa} {"J. Acoust. Soc. America"} MACRO {jcp} {"J. Comp. Phys."} MACRO {jetp} {"Sov. Phys.--JETP"} MACRO {jfe} {"J. Fusion Energy"} MACRO {jfm} {"J. Fluid Mech."} MACRO {jmp} {"J. Math. Phys."} MACRO {jne} {"J. Nucl. Energy"} MACRO {jnec} {"J. Nucl. Energy, C: Plasma Phys., Accelerators, Thermonucl. Res."} MACRO {jnm} {"J. Nucl. Mat."} MACRO {jpc} {"J. Phys. Chem."} MACRO {jpp} {"J. Plasma Phys."} MACRO {jpsj} {"J. Phys. Soc. Japan"} MACRO {jsi} {"J. Sci. Instrum."} MACRO {jvst} {"J. Vac. Sci. \& Tech."} MACRO {nat} {"Nat"} MACRO {nature} {"Nat"} MACRO {nedf} {"Nucl. Eng. \& Design/Fusion"} MACRO {nf} {"Nucl. Fusion"} MACRO {nim} {"Nucl. Inst. \& Meth."} MACRO {nimpr} {"Nucl. Inst. \& Meth. in Phys. Res."} MACRO {np} {"Nucl. Phys."} MACRO {npb} {"Nucl. Phys. B"} MACRO {nt/f} {"Nucl. Tech./Fusion"} MACRO {npbpc} {"Nucl. Phys. B (Proc. Suppl.)"} MACRO {inc} {"Nuovo Cimento"} MACRO {nc} {"Nuovo Cimento"} MACRO {pf} {"Phys. Fluids"} MACRO {pfa} {"Phys. Fluids A: Fluid Dyn."} MACRO {pfb} {"Phys. Fluids B: Plasma Phys."} MACRO {pl} {"Phys. Lett."} MACRO {pla} {"Phys. Lett. A"} MACRO {plb} {"Phys. Lett. B"} MACRO {prep} {"Phys. Rep."} MACRO {pnas} {"Proc. Nat. Acad. Sci. USA"} MACRO {pp} {"Phys. Plasmas"} MACRO {ppcf} {"Plasma Phys. \& Controlled Fusion"} MACRO {phitrsl} {"Philos. Trans. Roy. Soc. London"} MACRO {prl} {"Phys. Rev. Lett."} MACRO {pr} {"Phys. Rev."} MACRO {physrev} {"Phys. Rev."} MACRO {pra} {"Phys. Rev. A"} MACRO {prb} {"Phys. Rev. B"} MACRO {prc} {"Phys. Rev. C"} MACRO {prd} {"Phys. Rev. D"} MACRO {pre} {"Phys. Rev. E"} MACRO {ps} {"Phys. Scripta"} MACRO {procrsl} {"Proc. Roy. Soc. London"} MACRO {rmp} {"Rev. Mod. Phys."} MACRO {rsi} {"Rev. Sci. Inst."} MACRO {science} {"Sci"} MACRO {sciam} {"Sci. Am."} MACRO {sam} {"Stud. Appl. Math."} MACRO {sjpp} {"Sov. J. Plasma Phys."} MACRO {spd} {"Sov. Phys.--Doklady"} MACRO {sptp} {"Sov. Phys.--Tech. Phys."} MACRO {spu} {"Sov. Phys.--Uspeki"} MACRO {st} {"S\&T"} % End module: physjour.mbs %% Copyright 1994-2002 Patrick W Daly MACRO {acmcs} {"ACM Comput. Surv."} MACRO {acta} {"Acta Inf."} MACRO {cacm} {"Commun. ACM"} MACRO {ibmjrd} {"IBM J. Res. Dev."} MACRO {ibmsj} {"IBM Syst.~J."} MACRO {ieeese} {"IEEE Trans. Software Eng."} MACRO {ieeetc} {"IEEE Trans. Comput."} MACRO {ieeetcad} {"IEEE Trans. Comput. Aid. Des."} MACRO {ipl} {"Inf. Process. Lett."} MACRO {jacm} {"J.~ACM"} MACRO {jcss} {"J.~Comput. Syst. Sci."} MACRO {scp} {"Sci. Comput. Program."} MACRO {sicomp} {"SIAM J. Comput."} MACRO {tocs} {"ACM Trans. Comput. Syst."} MACRO {tods} {"ACM Trans. Database Syst."} MACRO {tog} {"ACM Trans. Graphic."} MACRO {toms} {"ACM Trans. Math. Software"} MACRO {toois} {"ACM Trans. Office Inf. Syst."} MACRO {toplas} {"ACM Trans. Progr. Lang. Syst."} MACRO {tcs} {"Theor. Comput. Sci."} FUNCTION {bibinfo.check} { swap$ duplicate$ missing$ { pop$ pop$ "" } { duplicate$ empty$ { swap$ pop$ } { swap$ pop$ } if$ } if$ } FUNCTION {bibinfo.warn} { swap$ duplicate$ missing$ { swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ "" } { duplicate$ empty$ { swap$ "empty " swap$ * " in " * cite$ * warning$ } { swap$ pop$ } if$ } if$ } FUNCTION {format.eprint} { eprint duplicate$ empty$ 'skip$ { "\eprint" archive empty$ 'skip$ { "[" * archive * "]" * } if$ "{" * swap$ * "}" * } if$ } FUNCTION {format.url} { url empty$ { "" } { "\urlprefix\url{" url * "}" * } if$ } STRINGS { bibinfo} INTEGERS { nameptr namesleft numnames } FUNCTION {format.names} { 'bibinfo := duplicate$ empty$ 'skip$ { 's := "" 't := #1 'nameptr := s num.names$ 'numnames := numnames 'namesleft := { namesleft #0 > } { s nameptr "{vv~}{ll}{, f.}{, jj}" format.name$ bibinfo bibinfo.check 't := nameptr #1 > { namesleft #1 > { ", " * t * } { "," * s nameptr "{ll}" format.name$ duplicate$ "others" = { 't := } { pop$ } if$ t "others" = { " " * bbl.etal * } { "\&" space.word * t * } if$ } if$ } 't if$ nameptr #1 + 'nameptr := namesleft #1 - 'namesleft := } while$ } if$ } FUNCTION {format.names.ed} { 'bibinfo := duplicate$ empty$ 'skip$ { 's := "" 't := #1 'nameptr := s num.names$ 'numnames := numnames 'namesleft := { namesleft #0 > } { s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ bibinfo bibinfo.check 't := nameptr #1 > { namesleft #1 > { ", " * t * } { "," * s nameptr "{ll}" format.name$ duplicate$ "others" = { 't := } { pop$ } if$ t "others" = { " " * bbl.etal * } { "\&" space.word * t * } if$ } if$ } 't if$ nameptr #1 + 'nameptr := namesleft #1 - 'namesleft := } while$ } if$ } FUNCTION {format.key} { empty$ { key field.or.null } { "" } if$ } FUNCTION {format.authors} { author "author" format.names duplicate$ empty$ 'skip$ { collaboration "collaboration" bibinfo.check duplicate$ empty$ 'skip$ { " (" swap$ * ")" * } if$ * } if$ } FUNCTION {get.bbl.editor} { editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } FUNCTION {format.editors} { editor "editor" format.names duplicate$ empty$ 'skip$ { " " * get.bbl.editor "(" swap$ * ")" * * } if$ } FUNCTION {format.note} { note empty$ { "" } { note #1 #1 substring$ duplicate$ "{" = 'skip$ { output.state mid.sentence = { "l" } { "u" } if$ change.case$ } if$ note #2 global.max$ substring$ * "note" bibinfo.check } if$ } FUNCTION {format.title} { title duplicate$ empty$ 'skip$ { "t" change.case$ } if$ "title" bibinfo.check } FUNCTION {format.full.names} {'s := "" 't := #1 'nameptr := s num.names$ 'numnames := numnames 'namesleft := { namesleft #0 > } { s nameptr "{vv~}{ll}" format.name$ 't := nameptr #1 > { namesleft #1 > { ", " * t * } { s nameptr "{ll}" format.name$ duplicate$ "others" = { 't := } { pop$ } if$ t "others" = { " " * bbl.etal * } { numnames #2 > { "," * } 'skip$ if$ "\&" space.word * t * } if$ } if$ } 't if$ nameptr #1 + 'nameptr := namesleft #1 - 'namesleft := } while$ } FUNCTION {author.editor.key.full} { author empty$ { editor empty$ { key empty$ { cite$ #1 #3 substring$ } 'key if$ } { editor format.full.names } if$ } { author format.full.names } if$ } FUNCTION {author.key.full} { author empty$ { key empty$ { cite$ #1 #3 substring$ } 'key if$ } { author format.full.names } if$ } FUNCTION {editor.key.full} { editor empty$ { key empty$ { cite$ #1 #3 substring$ } 'key if$ } { editor format.full.names } if$ } FUNCTION {make.full.names} { type$ "book" = type$ "inbook" = or 'author.editor.key.full { type$ "proceedings" = 'editor.key.full 'author.key.full if$ } if$ } FUNCTION {output.bibitem} { newline$ "\bibitem[{" write$ label write$ ")" make.full.names duplicate$ short.list = { pop$ } { * } if$ "}]{" * write$ cite$ write$ "}" write$ newline$ "" before.all 'output.state := } FUNCTION {n.dashify} { 't := "" { t empty$ not } { t #1 #1 substring$ "-" = { t #1 #2 substring$ "--" = not { "--" * t #2 global.max$ substring$ 't := } { { t #1 #1 substring$ "-" = } { "-" * t #2 global.max$ substring$ 't := } while$ } if$ } { t #1 #1 substring$ * t #2 global.max$ substring$ 't := } if$ } while$ } FUNCTION {word.in} { bbl.in " " * } FUNCTION {format.date} { year "year" bibinfo.check duplicate$ empty$ { } 'skip$ if$ extra.label * before.all 'output.state := " " swap$ * } FUNCTION {format.btitle} { title "title" bibinfo.check duplicate$ empty$ 'skip$ { } if$ } FUNCTION {either.or.check} { empty$ 'pop$ { "can't use both " swap$ * " fields in " * cite$ * warning$ } if$ } FUNCTION {format.bvolume} { volume empty$ { "" } { bbl.volume volume tie.or.space.prefix "volume" bibinfo.check * * series "series" bibinfo.check duplicate$ empty$ 'pop$ { swap$ bbl.of space.word * swap$ emphasize * } if$ "volume and number" number either.or.check } if$ } FUNCTION {format.number.series} { volume empty$ { number empty$ { series field.or.null } { series empty$ { number "number" bibinfo.check } { output.state mid.sentence = { bbl.number } { bbl.number capitalize } if$ number tie.or.space.prefix "number" bibinfo.check * * bbl.in space.word * series "series" bibinfo.check * } if$ } if$ } { "" } if$ } FUNCTION {is.num} { chr.to.int$ duplicate$ "0" chr.to.int$ < not swap$ "9" chr.to.int$ > not and } FUNCTION {extract.num} { duplicate$ 't := "" 's := { t empty$ not } { t #1 #1 substring$ t #2 global.max$ substring$ 't := duplicate$ is.num { s swap$ * 's := } { pop$ "" 't := } if$ } while$ s empty$ 'skip$ { pop$ s } if$ } FUNCTION {convert.edition} { extract.num "l" change.case$ 's := s "first" = s "1" = or { bbl.first 't := } { s "second" = s "2" = or { bbl.second 't := } { s "third" = s "3" = or { bbl.third 't := } { s "fourth" = s "4" = or { bbl.fourth 't := } { s "fifth" = s "5" = or { bbl.fifth 't := } { s #1 #1 substring$ is.num { s eng.ord 't := } { edition 't := } if$ } if$ } if$ } if$ } if$ } if$ t } FUNCTION {format.edition} { edition duplicate$ empty$ 'skip$ { convert.edition output.state mid.sentence = { "l" } { "t" } if$ change.case$ "edition" bibinfo.check " " * bbl.edition * } if$ } INTEGERS { multiresult } FUNCTION {multi.page.check} { 't := #0 'multiresult := { multiresult not t empty$ not and } { t #1 #1 substring$ duplicate$ "-" = swap$ duplicate$ "," = swap$ "+" = or or { #1 'multiresult := } { t #2 global.max$ substring$ 't := } if$ } while$ multiresult } FUNCTION {format.pages} { pages duplicate$ empty$ 'skip$ { duplicate$ multi.page.check { n.dashify } { } if$ "pages" bibinfo.check } if$ } FUNCTION {first.page} { 't := "" { t empty$ not t #1 #1 substring$ "-" = not and } { t #1 #1 substring$ * t #2 global.max$ substring$ 't := } while$ } FUNCTION {format.journal.pages} { pages duplicate$ empty$ 'pop$ { swap$ duplicate$ empty$ { pop$ pop$ format.pages } { ", " * swap$ first.page "pages" bibinfo.check * } if$ } if$ } FUNCTION {format.journal.eid} { eid "eid" bibinfo.check duplicate$ empty$ 'skip$ { swap$ duplicate$ empty$ 'skip$ { ", " * } if$ swap$ numpages empty$ 'skip$ { bbl.eidpp numpages tie.or.space.prefix "numpages" bibinfo.check * * " (" swap$ * ")" * * } if$ } if$ * } FUNCTION {format.vol.num.pages} { volume field.or.null duplicate$ empty$ 'skip$ { "volume" bibinfo.check } if$ } FUNCTION {format.chapter.pages} { chapter empty$ { "" } { type empty$ { bbl.chapter } { type "l" change.case$ "type" bibinfo.check } if$ chapter tie.or.space.prefix "chapter" bibinfo.check * * } if$ } FUNCTION {format.booktitle} { booktitle "booktitle" bibinfo.check } FUNCTION {format.in.ed.booktitle} { format.booktitle duplicate$ empty$ 'skip$ { editor "editor" format.names.ed duplicate$ empty$ 'pop$ { bbl.edby " " * swap$ * swap$ "," * " " * swap$ * } if$ word.in swap$ * } if$ } FUNCTION {format.thesis.type} { type duplicate$ empty$ 'pop$ { swap$ pop$ "t" change.case$ "type" bibinfo.check } if$ } FUNCTION {format.tr.number} { number "number" bibinfo.check type duplicate$ empty$ { pop$ bbl.techrep } 'skip$ if$ "type" bibinfo.check swap$ duplicate$ empty$ { pop$ "t" change.case$ } { tie.or.space.prefix * * } if$ } FUNCTION {format.article.crossref} { word.in " \cite{" * crossref * "}" * } FUNCTION {format.book.crossref} { volume duplicate$ empty$ { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ pop$ word.in } { bbl.volume swap$ tie.or.space.prefix "volume" bibinfo.check * * bbl.of space.word * } if$ " \cite{" * crossref * "}" * } FUNCTION {format.incoll.inproc.crossref} { word.in " \cite{" * crossref * "}" * } FUNCTION {format.org.or.pub} { 't := "" address empty$ t empty$ and 'skip$ { add.blank "(" * address "address" bibinfo.check * t empty$ 'skip$ { address empty$ 'skip$ { ": " * } if$ t * } if$ ")" * } if$ } FUNCTION {format.publisher.address} { publisher "publisher" bibinfo.warn format.org.or.pub } FUNCTION {format.organization.address} { organization "organization" bibinfo.check format.org.or.pub } STRINGS {oldname} FUNCTION {name.or.dash} { 's := oldname empty$ { s 'oldname := s } { s oldname = { "---" } { s 'oldname := s } if$ } if$ } FUNCTION {article} { output.bibitem format.authors "author" output.check author format.key output name.or.dash format.date "year" output.check date.block crossref missing$ { journal "journal" bibinfo.check "journal" output.check format.vol.num.pages output } { format.article.crossref output.nonnull } if$ eid empty$ { format.journal.pages } { format.journal.eid } if$ new.sentence format.note output format.eprint output format.url output fin.entry } FUNCTION {book} { output.bibitem author empty$ { format.editors "author and editor" output.check editor format.key output add.blank name.or.dash } { format.authors output.nonnull name.or.dash crossref missing$ { "author and editor" editor either.or.check } 'skip$ if$ } if$ format.date "year" output.check date.block format.btitle "title" output.check crossref missing$ { format.bvolume output format.number.series output format.publisher.address output } { format.book.crossref output.nonnull } if$ format.edition output new.sentence format.note output format.eprint output format.url output fin.entry } FUNCTION {booklet} { output.bibitem format.authors output author format.key output name.or.dash format.date "year" output.check date.block format.title "title" output.check howpublished "howpublished" bibinfo.check output address "address" bibinfo.check output new.sentence format.note output format.eprint output format.url output fin.entry } FUNCTION {inbook} { output.bibitem author empty$ { format.editors "author and editor" output.check editor format.key output name.or.dash } { format.authors output.nonnull name.or.dash crossref missing$ { "author and editor" editor either.or.check } 'skip$ if$ } if$ format.date "year" output.check date.block format.btitle "title" output.check crossref missing$ { format.publisher.address output format.bvolume output format.chapter.pages "chapter and pages" output.check format.number.series output } { format.chapter.pages "chapter and pages" output.check format.book.crossref output.nonnull } if$ format.edition output % format.pages "pages" output.check format.journal.pages new.sentence format.note output format.eprint output format.url output fin.entry } FUNCTION {incollection} { output.bibitem format.authors "author" output.check author format.key output name.or.dash format.date "year" output.check date.block crossref missing$ { format.in.ed.booktitle "booktitle" output.check format.publisher.address output format.bvolume output format.number.series output format.chapter.pages output format.edition output } { format.incoll.inproc.crossref output.nonnull format.chapter.pages output } if$ format.pages "pages" output.check new.sentence format.note output format.eprint output format.url output fin.entry } FUNCTION {inproceedings} { output.bibitem format.authors "author" output.check author format.key output name.or.dash format.date "year" output.check date.block crossref missing$ { format.in.ed.booktitle "booktitle" output.check publisher empty$ { format.organization.address output } { organization "organization" bibinfo.check output format.publisher.address output } if$ format.bvolume output format.number.series output } { format.incoll.inproc.crossref output.nonnull } if$ % format.pages "pages" output.check format.journal.pages new.sentence format.note output format.eprint output format.url output fin.entry } FUNCTION {conference} { inproceedings } FUNCTION {manual} { output.bibitem format.authors output author format.key output name.or.dash format.date "year" output.check date.block format.btitle "title" output.check organization "organization" bibinfo.check output address "address" bibinfo.check output format.edition output new.sentence format.note output format.eprint output format.url output fin.entry } FUNCTION {mastersthesis} { output.bibitem format.authors "author" output.check author format.key output name.or.dash format.date "year" output.check date.block bbl.mthesis format.thesis.type output.nonnull school "school" bibinfo.warn output address "address" bibinfo.check output new.sentence format.note output format.eprint output format.url output fin.entry } FUNCTION {misc} { output.bibitem format.authors output author format.key output name.or.dash format.date "year" output.check date.block format.title output howpublished "howpublished" bibinfo.check output new.sentence format.note output format.eprint output format.url output fin.entry } FUNCTION {phdthesis} { output.bibitem format.authors "author" output.check author format.key output name.or.dash format.date "year" output.check date.block bbl.phdthesis format.thesis.type output.nonnull school "school" bibinfo.warn output address "address" bibinfo.check output new.sentence format.note output format.eprint output format.url output fin.entry } FUNCTION {proceedings} { output.bibitem format.editors output editor format.key output name.or.dash format.date "year" output.check date.block format.btitle "title" output.check format.bvolume output format.number.series output publisher empty$ { format.organization.address output } { organization "organization" bibinfo.check output format.publisher.address output } if$ new.sentence format.note output format.eprint output format.url output fin.entry } FUNCTION {techreport} { output.bibitem format.authors "author" output.check author format.key output name.or.dash format.date "year" output.check date.block format.btitle "title" output.check format.tr.number output.nonnull institution "institution" bibinfo.warn output address "address" bibinfo.check output new.sentence format.note output format.eprint output format.url output fin.entry } FUNCTION {unpublished} { output.bibitem format.authors "author" output.check author format.key output name.or.dash format.date "year" output.check date.block format.title "title" output.check new.sentence format.note "note" output.check format.eprint output format.url output fin.entry } FUNCTION {default.type} { misc } READ FUNCTION {sortify} { purify$ "l" change.case$ } INTEGERS { len } FUNCTION {chop.word} { 's := 'len := s #1 len substring$ = { s len #1 + global.max$ substring$ } 's if$ } FUNCTION {format.lab.names} { 's := "" 't := s #1 "{vv~}{ll}" format.name$ s num.names$ duplicate$ #2 > { pop$ " " * bbl.etal * } { #2 < 'skip$ { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = { " " * bbl.etal * } { " \& " * s #2 "{vv~}{ll}" format.name$ * } if$ } if$ } if$ } FUNCTION {author.key.label} { author empty$ { key empty$ { cite$ #1 #3 substring$ } 'key if$ } { author format.lab.names } if$ } FUNCTION {author.editor.key.label} { author empty$ { editor empty$ { key empty$ { cite$ #1 #3 substring$ } 'key if$ } { editor format.lab.names } if$ } { author format.lab.names } if$ } FUNCTION {editor.key.label} { editor empty$ { key empty$ { cite$ #1 #3 substring$ } 'key if$ } { editor format.lab.names } if$ } FUNCTION {calc.short.authors} { type$ "book" = type$ "inbook" = or 'author.editor.key.label { type$ "proceedings" = 'editor.key.label 'author.key.label if$ } if$ 'short.list := } FUNCTION {calc.label} { calc.short.authors short.list "(" * year duplicate$ empty$ short.list key field.or.null = or { pop$ "" } { purify$ #-1 #4 substring$ } if$ * 'label := } FUNCTION {sort.format.names} { 's := #1 'nameptr := "" s num.names$ 'numnames := numnames 'namesleft := { namesleft #0 > } { s nameptr "{vv{ } }{ll{ }}{ f{ }}{ jj{ }}" format.name$ 't := nameptr #1 > { " " * namesleft #1 = t "others" = and { "zzzzz" * } { t sortify * } if$ } { t sortify * } if$ nameptr #1 + 'nameptr := namesleft #1 - 'namesleft := } while$ } FUNCTION {sort.format.title} { 't := "A " #2 "An " #3 "The " #4 t chop.word chop.word chop.word sortify #1 global.max$ substring$ } FUNCTION {author.sort} { author empty$ { key empty$ { "to sort, need author or key in " cite$ * warning$ "" } { key sortify } if$ } { author sort.format.names } if$ } FUNCTION {author.editor.sort} { author empty$ { editor empty$ { key empty$ { "to sort, need author, editor, or key in " cite$ * warning$ "" } { key sortify } if$ } { editor sort.format.names } if$ } { author sort.format.names } if$ } FUNCTION {editor.sort} { editor empty$ { key empty$ { "to sort, need editor or key in " cite$ * warning$ "" } { key sortify } if$ } { editor sort.format.names } if$ } FUNCTION {presort} { calc.label label sortify " " * type$ "book" = type$ "inbook" = or 'author.editor.sort { type$ "proceedings" = 'editor.sort 'author.sort if$ } if$ #1 entry.max$ substring$ 'sort.label := sort.label * " " * title field.or.null sort.format.title * #1 entry.max$ substring$ 'sort.key$ := } ITERATE {presort} SORT STRINGS { last.label next.extra } INTEGERS { last.extra.num number.label } FUNCTION {initialize.extra.label.stuff} { #0 int.to.chr$ 'last.label := "" 'next.extra := #0 'last.extra.num := #0 'number.label := } FUNCTION {forward.pass} { last.label label = { last.extra.num #1 + 'last.extra.num := last.extra.num int.to.chr$ 'extra.label := } { "a" chr.to.int$ 'last.extra.num := "" 'extra.label := label 'last.label := } if$ number.label #1 + 'number.label := } FUNCTION {reverse.pass} { next.extra "b" = { "a" 'extra.label := } 'skip$ if$ extra.label 'next.extra := extra.label duplicate$ empty$ 'skip$ { "{\natexlab{" swap$ * "}}" * } if$ 'extra.label := label extra.label * 'label := } EXECUTE {initialize.extra.label.stuff} ITERATE {forward.pass} REVERSE {reverse.pass} FUNCTION {bib.sort.order} { sort.label " " * year field.or.null sortify * " " * title field.or.null sort.format.title * #1 entry.max$ substring$ 'sort.key$ := } ITERATE {bib.sort.order} SORT FUNCTION {begin.bib} { preamble$ empty$ 'skip$ { preamble$ write$ newline$ } if$ "\begin{thebibliography}{}" write$ newline$ "\expandafter\ifx\csname natexlab\endcsname\relax\def\natexlab#1{#1}\fi" write$ newline$ "\expandafter\ifx\csname url\endcsname\relax" write$ newline$ " \def\url#1{\texttt{#1}}\fi" write$ newline$ "\expandafter\ifx\csname urlprefix\endcsname\relax\def\urlprefix{URL }\fi" write$ newline$ "\providecommand{\eprint}[2][]{\url{#2}}" write$ newline$ } EXECUTE {begin.bib} EXECUTE {init.state.consts} ITERATE {call.type$} FUNCTION {end.bib} { newline$ "\end{thebibliography}" write$ newline$ } EXECUTE {end.bib} %% End of customized bst file %% %% End of file `aj.bst'. pal-0.9.7/pubs/adass2012/asp2010.sty000066400000000000000000001127321302604645500165160ustar00rootroot00000000000000% This is the asp2010.sty LaTeX style file -- DO NOT CHANGE THIS FILE % Copyright 2010, Astronomical Society of the Pacific Conference Series % Revision: 10 February 2010 % This style file is a revised version of newpasp.sty and contains % new features added by Terry Mahoney, Lisa Roper, Jared Bellows, % and Jonathan Barnes. % If you have any queries concerning this style file, please contact % Terry Mahoney at tjm@ll.iac.esf %%% COMMENTS -- Comment style: % File Header information includes file name and ASPCS Copyright. % '%%%' HEADING -- Represents a major heading in a file (all caps) % followed by information about the section. % '%' SUBHEADING -- Represents a minor heading in a file (all caps) % followed by information about the section. % '%' Comment -- Represents instructions for commands or general % information about the subsequent commands. \usepackage{array} \usepackage{txfonts} \usepackage{ifthen} \usepackage{lscape} \usepackage{index} \usepackage{graphicx,amssymb} \usepackage{wrapfig} \usepackage{chapterbib} \usepackage{url} \usepackage{ncccropmark} % For Proofing: Use this line to show margin guides \usepackage{watermark} % For Proofing: Use this line to show margin guides \ProvidesPackage{asp2010}[2010/05/11 \space v 1.1] %%% VOLUME AND SLUG INFORMATION -- Do not change this file. % Volume Number \def\@aspvolume{**Volume Number**} \newcommand{\aspvolume}[1]{\gdef\@aspvolume{#1}} \newcommand{\volume}{\@aspvolume} % Usage in main file: \aspvolume{0} % Insert volume number from ASPCS % Volume Copyright Year \def\@aspcpryear{**Copyright Year**} \newcommand{\aspcpryear}[1]{\gdef\@aspcpryear{#1}} \newcommand{\cpryear}{\@aspcpryear} % Usage in main file: \aspcpryear{2009} % Insert year received from ASPCS % Volume Title for Slug \def\@aspvoltitle{**Volume Title**} \newcommand{\aspvoltitle}[1]{\gdef\@aspvoltitle{#1}} \newcommand{\voltitle}{\@aspvoltitle} % Usage in main file: \aspvoltitle{ASPCS Instructions for Authors and Editors} % Insert Full Title in Initial Caps % Volume Author for Slug \def\@aspvolauthor{**Author**} \newcommand{\aspvolauthor}[1]{\gdef\@aspvolauthor{#1}} \newcommand{\volauthor}{\@aspvolauthor} % Usage in main file: \aspvolauthor{T. J. Mahoney and Lisa B. Roper, eds.} % Insert Editors % Use a serial comma with 3 or more editors with "and" not "&" between last two names. % Follow editors' names with comma and "ed." or "eds." %%% COPYRIGHT INFORMATION -- Do not change this file. % Volume LCCN \def\@aspLCCN{**LCCN**} \newcommand{\aspLCCN}[1]{\gdef\@aspLCCN{#1}} \newcommand{\LCCN}{\@aspLCCN} % Usage in main file: \aspLCCN{Not Applicable} % Volume ISBN \def\@aspISBN{**ISBN**} % As of 2007, should be 978-1-58381-XXX-X \newcommand{\aspISBN}[1]{\gdef\@aspISBN{#1}} \newcommand{\ISBN}{\@aspISBN} % Usage in main file: \aspISBN{Not Applicable} % Volume eISBN \def\@aspeISBN{**eISBN**} \newcommand{\aspeISBN}[1]{\gdef\@aspeISBN{#1}} \newcommand{\eISBN}{\@aspeISBN} % Usage in main file: \aspeISBN}{978-1-58381-681-3} % Volume Contract Number \def\@aspContract{**CN**} \newcommand{\aspContract}[1]{\gdef\@aspContract{#1}} \newcommand{\Contract}{\@aspContract} % Usage in main file: \aspContract}{91} %%% HALFTITLE PAGE % Volume Title for Halftitle Page \def\@asphalftitle{**BOOK TITLE**} \newcommand{\asphalftitle}[1]{\gdef\@asphalftitle{#1}} \newcommand{\halftitle}{\@asphalftitle} % Usage in main file: \asphalftitle{ASP CONFERENCE SERIES\\ INSTRUCTIONS FOR AUTHORS AND EDITORS} % IN ALL CAPS % Book Cover Illustration Information \def\@aspcoverinfo{\relax} \global\let\@aspcoverinfo\@empty \newcommand{\aspcoverinfo}[1]{\gdef\@aspcoverinfo{#1}} \newcommand{\blurb}{\@aspcoverinfo} % Usage in main file: %\aspcoverinfo{\emph{Celestial Tryst:} The moon, Venus, and Jupiter % in the evening sky from the coastline south of Pacifica, California % on November 30, 2008.\\\mbox{}\\Photographed by James Manning, the % Executive Director of the Astronomical Society of the Pacific.} % In % Mixed Case (Initial Caps) % Editors: Please be sure to obtain permission from the author and from the publisher if previously published. % Suggested acknowledgement wording might include the following, depending upon the circumstance: % Image/drawing/photo courtesy of individual or organization who created the image. % Referenced in this volume, author name, p. xxx. % By the kind permission of publisher, volume number, author and page number. % Copyright held by name and place. %%% TITLE PAGE % Volume Title for Title Page \def\@aspmaintitle{**MAIN TITLE**} \newcommand{\aspmaintitle}[1]{\gdef\@aspmaintitle{#1}} \newcommand{\maintitle}{\@aspmaintitle} % Usage in main file: \aspmaintitle{ASP CONFERENCE SERIES\\ INSTRUCTIONS FOR AUTHORS AND EDITORS} % IN ALL CAPS % Volume Meeting Type \def\@aspmtgtype{\relax} \global\let\@aspmtgtype\@empty \newcommand{\aspmtgtype}[1]{\gdef\@aspmtgtype{#1}} \newcommand{\mtgtype}{\@aspmtgtype} % Usage in main file: \aspmtgtype{Proceedings of a conference held in} % Meeting Venue \def\@aspmtgvenue{\relax} \newcommand{\aspmtgvenue}[1]{\gdef\@aspmtgvenue{#1}} \newcommand{\venue}{\@aspmtgvenue} % Usage in main file: \aspmtgvenue{St. Louis, Missouri, USA} % Spell out fully (Institute, City, State, Country). % Meeting Time \def\@aspmtgwhen{\relax} \newcommand{\aspmtgwhen}[1]{\gdef\@aspmtgwhen{#1}} \newcommand{\when}{\@aspmtgwhen} % Usage in main file: \aspmtgwhen{1--5 June 2008} % In 7--11 May 2001 format with no commas %%% EDITOR INFORMATION -- Please include Department, Institute, City, State, Country in the affiliation % First Editor Name \def\@aspeditorone{\relax} \global\let\@aspeditorone\@empty \newcommand{\aspfirsteditor}[1]{\gdef\@aspeditorone{#1}} \newcommand{\firsteditor}{\@aspeditorone} % Usage in main file: \aspfirsteditor{T. J. Mahoney} % First Editor Affiliation \def\@aspaffilone{\relax} \newcommand{\aspfirstaffil}[1]{\gdef\@aspaffilone{#1}} \newcommand{\firstaffil}{\@aspaffilone} % Usage in main file: \aspfirstaffil{Instituto de Astrof\'\i sica de Canarias, La Laguna, Tenerife, Spain} % Second Editor \def\@aspeditortwo{\relax} \global\let\@aspeditortwo\@empty \newcommand{\aspsecondeditor}[1]{\gdef\@aspeditortwo{#1}} \newcommand{\secondeditor}{\@aspeditortwo} % Usage in main file: \aspsecondeditor{**Name**} % Second Editor Affiliation \def\@aspaffiltwo{\relax} \newcommand{\aspsecondaffil}[1]{\gdef\@aspaffiltwo{#1}} \newcommand{\secondaffil}{\@aspaffiltwo} % Usage in main file: \aspfirstaffil{**Affiliation**} % Third Editor \def\@aspeditorthree{\relax} \global\let\@aspeditorthree\@empty \newcommand{\aspthirdeditor}[1]{\gdef\@aspeditorthree{#1}} \newcommand{\thirdeditor}{\@aspeditorthree} % Third Editor Affiliation \def\@aspaffilthree{\relax} \newcommand{\aspthirdaffil}[1]{\gdef\@aspaffilthree{#1}} \newcommand{\thirdaffil}{\@aspaffilthree} % Fourth Editor \def\@aspeditorfour{\relax} \global\let\@aspeditorfour\@empty \newcommand{\aspfourtheditor}[1]{\gdef\@aspeditorfour{#1}} \newcommand{\fourtheditor}{\@aspeditorfour} % Fourth Editor Affiliation \def\@aspaffilfour{\relax} \newcommand{\aspfourthaffil}[1]{\gdef\@aspaffilfour{#1}} \newcommand{\fourthaffil}{\@aspaffilfour} % Fifth Editor \def\@aspeditorfive{\relax} \global\let\@aspeditorfive\@empty \newcommand{\aspfiftheditor}[1]{\gdef\@aspeditorfive{#1}} \newcommand{\fiftheditor}{\@aspeditorfive} % Fifth Editor Affiliation \def\@aspaffilfive{\relax} \newcommand{\aspfifthaffil}[1]{\gdef\@aspaffilfive{#1}} \newcommand{\fifthaffil}{\@aspaffilfive} % Part Name (Usually either Part of Session) \def\@asppartname{Part} \newcommand{\asppartname}[1]{\gdef\@asppartname{#1}} \renewcommand{\partname}{\@asppartname} % Usage in main file: \asppartname{Part} % Name of the Major Sections: Part % Define the organization (ASP), genre (conference proceedings), % version number (version 1.0) and date of version (1 January 2004) - all of % which will appear in the .log file: \def\revtex@ver{2.0} \def\revtex@date{1 March 2009} \def\revtex@org{ASP} \def\revtex@jnl{} \def\revtex@genre{conference proceedings} % The following command types all the above information into the .log file: \typeout{\revtex@org\space \ifx\revtex@jnl\@empty\else\revtex@jnl\space\fi \revtex@genre\space substyle, version \revtex@ver\space <\revtex@date>.} \def\revtex@pageid{\xdef\@thefnmark{\null} \@footnotetext{This \revtex@genre\space was prepared with the \revtex@org\space \revtex@jnl\space Rev\TeX\ macros v\revtex@ver.}} % The following routine issues a warning for documentclass font sizes smaller % than 11 pt ("\@ptsize takes values 0, 1 or 2 (representing 10, 11 and 12 pt): \ifnum\@ptsize<1 \typeout{Warning: Undersize manuscript font (1\@ptsize\space pts). Use 11pt documentclass option.} \fi % The value of 1\@ptsize might need to be 0 for some IAU publications. Check with the IAU. % This routine defines where the slug and page number go on the % first page of any article, regardless of whether page is even or odd: \def\ps@paspcstitle{\let\@mkboth\@gobbletwo \def\@oddhead{\null{\footnotesize\it\@slug}\hfil} \def\@oddfoot{\rm\hfil\thepage\hfil} \let\@evenhead\@oddhead\let\@evenfoot\@oddfoot } % Now set odd page head to contain running title & page number: \def\ps@myheadings{\let\@mkboth\@gobbletwo \def\@oddhead{\hbox{}\hfil\sl\rightmark\hskip 1in\rm\thepage}% % The odd foot is empty: \def\@oddfoot{}% % ... and the even page head and foot to contain the author names & page no.: \def\@evenhead{\rm\thepage\hskip 1in\sl\leftmark\hfil\hbox{}}% % The even foot is also empty: \def\@evenfoot{} % \def\sectionmark##1{} \def\subsectionmark##1{}} \def\@leftmark#1#2{\sec@upcase{#1}} \def\@rightmark#1#2{\sec@upcase{#2}} \providecommand{\mainmatter}{% \cleardoublepage \@mainmattertrue %\label{aspendfrontmatter} \typeout{(ASP) Front Matter End: \arabic{page}} \pagenumbering{arabic} \parindent=2em \typeout{(ASP) Main Matter Begin: \arabic{page}} }% \providecommand\backmatter{% \pagestyle{myheadings} % Required for formatting \if@openright \cleardoublepage \else \clearpage \fi \@mainmatterfalse }% % Define page and text layout: \textwidth=5.25in \textheight=8.3in \headheight=18pt \headsep=18pt \topmargin=0in \footskip=.25in \oddsidemargin=0.49in \evensidemargin=0.49in \parindent=2em \parskip=.1ex \def\@singleleading{0.9} \def\@doubleleading{1.6} \def\baselinestretch{\@singleleading} \def\tightenlines{\def\baselinestretch{\@singleleading}} \def\loosenlines{\def\baselinestretch{\@doubleleading}} \clubpenalty\@M \widowpenalty\@M % Input for slug: \def\@journalname{ASP Conference Series} \def\cpr@holder{Astronomical Society of the Pacific} \let\journalid=\@gobbletwo \let\articleid=\@gobbletwo \let\received=\@gobble \let\accepted=\@gobble % Order of information in slug: \def\@slug{{\tabcolsep\z@\begin{tabular}[t]{l}\voltitle\\ %\@journalname, Vol.\ \@jourvol, \cpr@year\\ %LR: 4/13/07 changed to insert copyright symbol %\@journalname, Vol.\ \@jourvol\\ \vol@author , eds.\\ {\raisebox{1.5pt}{\tiny\copyright}}\hspace{-1pt}\ \cpr@year\ Astronomical Society of the Pacific \@journalname, Vol.\ \volume\\ \volauthor\\ {\raisebox{1.5pt}{\tiny\copyright}}\hspace{-1pt}\ \cpryear\ Astronomical Society of the Pacific \end{tabular}} } % Title, author names & affiliations to be indented by 0.45 inches: \def\paspconf@frontindent{.45in} % Title format, font, etc.: \def\title#1{% \vspace*{2.5\baselineskip} \@tempdima\textwidth \advance\@tempdima by-\paspconf@frontindent \hfill \parbox{\@tempdima} {\pretolerance=10000\raggedright\large\bf\sec@upcase{#1}}\par \vspace*{1\baselineskip} \thispagestyle{title} }% %Author format, font, etc.: \def\author#1{\vspace*{1\baselineskip} \@tempdima\textwidth \advance\@tempdima by-\paspconf@frontindent \hfill \parbox{\@tempdima} {\pretolerance=10000\raggedright{#1}}\par} \def\affil#1{\vspace*{.5\baselineskip} \@tempdima\textwidth \advance\@tempdima by-\paspconf@frontindent \hfill \parbox{\@tempdima} {\pretolerance=10000\raggedright{\it #1}}\par} % Affiliation format, font, etc.: \def\altaffilmark#1{$^{#1}$} \def\altaffiltext#1#2{\footnotetext[#1]{#2}} % Abstract format \def\abstract{\vspace*{1.3\baselineskip}\bgroup\leftskip\paspconf@frontindent \noindent{\bf\sec@upcase{\small Abstract.}}\hskip 1em\small} \def\endabstract{\par\egroup\vspace*{1.4\baselineskip}} % Distance of first footnote from bottom of text. \skip\footins 4ex plus 1ex minus .5ex % Separation between footnotes: \footnotesep 3ex % Format the footnotes: \long\def\@makefntext#1{\noindent\hbox {\hss$^{\@thefnmark}$}\hspace{0ex}#1} % No space between footnote mark and following text. \def\tablenotemark#1{\rlap{$^{#1}$}} \def\tablenotetext#1#2{ \@temptokena={\vspace{.5ex}{\noindent\llap{$^{#1}$}#2}\par} \@temptokenb=\expandafter{\tblnote@list} \xdef\tblnote@list{\the\@temptokenb\the\@temptokena}} \def\spewtablenotes{ \ifx\tblnote@list\@empty \else \let\@temptokena=\tblnote@list \xdef\tblnote@list{\@empty} \vspace{4.5ex} \footnoterule \vspace{.5ex} {\footnotesize\@temptokena} \fi} \newtoks\@temptokenb \def\tblnote@list{} \def\endtable{\spewtablenotes\end@float} \@namedef{endtable*}{\spewtablenotes\end@dblfloat} \let\tableline=\hline \def\thefigure{\@arabic\c@figure} \def\fnum@figure{\small Figure \thefigure.} \def\thetable{\@arabic\c@table} \def\fnum@table{\small Table \thetable.} \long\def\@makecaption#1#2{ \vskip 10pt \setbox\@tempboxa\hbox{#1\hskip 1.5em #2} \let\@tempdima=\hsize \advance\@tempdima by -2em \ifdim \wd\@tempboxa >\@tempdima {\leftskip 2em #1\hskip 1.5em #2\par} \else \hbox to\hsize{\hskip 2em\box\@tempboxa\hfil} \fi} \def\fps@figure{tbp} \def\fps@table{htbp} \let\keywords=\@gobble \let\subjectheadings=\@gobble \setcounter{secnumdepth}{3} \def\upper{\def\sec@upcase##1{\uppercase{##1}}} \def\sec@upcase#1{\relax#1} \def\section{\@startsection {section}{1}{\z@}{-4.2ex plus -1ex minus -.2ex}{2.2ex plus .2ex}{\normalsize\bf}} \def\subsection{\@startsection{subsection}{2}{\z@}{-2.2ex plus -1ex minus -.2ex}{1.1ex plus .2ex}{\normalsize\bf}} \def\subsubsection{\@startsection{subsubsection}{3}{\z@}{-2.2ex plus -1ex minus -.2ex}{1.1ex plus .2ex}{\normalsize\bf}} \def\altsubsubsection{\@startsection{subsubsection}{3}{\z@}{-2.2ex plus -1ex minus -.2ex}{-1.2em}{\normalsize\it}} \def\inlinesubsubsection#1{ \def\thesubsubsection{\hskip -1em} \altsubsubsection{#1} \def\thesubsubsection{\thesubsection.\@arabic\c@subsubsection} } \def\thesection{\@arabic\c@section} \def\thesubsection{\thesection.\@arabic\c@subsection} \def\thesubsubsection{\thesubsection.\@arabic\c@subsubsection} \def\@sect#1#2#3#4#5#6[#7]#8{% \ifnum #2>\c@secnumdepth \def\@svsec{} \else \refstepcounter{#1}\edef\@svsec{\csname the#1\endcsname.\hskip 1em } \fi \@tempskipa #5\relax \ifdim \@tempskipa>\z@ \begingroup #6\relax \@hangfrom{\hskip #3\relax\@svsec}{\interlinepenalty \@M \sec@upcase{#8}\par}% \endgroup \csname #1mark\endcsname{#7} \else \def\@svsechd{#6\hskip #3\@svsec #8\csname #1mark\endcsname {#7}. } \fi \@xsect{#5} }% \def\@ssect#1#2#3#4#5{% \@tempskipa #3\relax \ifdim \@tempskipa>\z@ \begingroup #4\@hangfrom{\hskip #1}{\interlinepenalty \@M \sec@upcase{#5}\par}\endgroup \else \def\@svsechd{#4\hskip #1\relax #5.} \fi \@xsect{#3} }% \def\acknowledgments{% \@startsection{paragraph}{4}{1em}{1ex plus .5ex minus .5ex}{-1em}{\bf}{\sec@upcase{Acknowledgments}} }% \usepackage{natbib} \bibpunct[, ]{(}{)}{;}{u}{}{,} \let\acknowledgements=\acknowledgments \def\qanda@heading{Discussion} \newif\if@firstquestion \@firstquestiontrue \newenvironment{question}[1]{\if@firstquestion \section*{\qanda@heading}\global\@firstquestionfalse\fi \par\vskip 1ex \noindent{\it#1\/}:}{\par} \newenvironment{answer}[1]{\par\vskip 1ex \noindent{\it#1\/}:}{\par} \def\last{\newif\if@firstquestion \@firstquestiontrue} \def\mathwithsecnums{ \@newctr{equation}[section] \def\theequation{\hbox{\normalsize\arabic{section}-\arabic{equation}}}} \def\references{\small\section*{References} \small\bgroup\parindent=0pt\parskip=.5ex \def\refpar{\par\hangindent=3em\hangafter=1}} \def\endreferences{\refpar\egroup} \def\thebibliography{\small\section*{\small References} \list{\null}{\leftmargin 3em\labelwidth 0pt\labelsep 0pt\itemindent -3em \itemsep 0pt \parsep 0pt\usecounter{enumi}} \def\refpar{\relax} \def\newblock{\hskip .11em plus .33em minus .07em} \sloppy\clubpenalty4000\widowpenalty4000 \sfcode`\.=1000\relax} \def\endthebibliography{\endlist} \def\@biblabel#1{\relax} \def\@cite#1#2{#1\if@tempswa , #2\fi} \def\reference{\relax\refpar} \def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi \def\@citea{}\@cite{\@for\@citeb:=#2\do {\@citea\def\@citea{,\penalty\@m\ }\@ifundefined {b@\@citeb}{\@warning {Citation `\@citeb' on page \thepage \space undefined}}% {\csname b@\@citeb\endcsname}}}{#1}} \let\jnl@style=\rm \def\ref@jnl#1{{\jnl@style#1\/}} \def\aj{\ref@jnl{AJ}} \def\araa{\ref@jnl{ARA\&A}} \def\apj{\ref@jnl{ApJ}} \def\apjl{\ref@jnl{ApJ}} \def\apjs{\ref@jnl{ApJS}} \def\ao{\ref@jnl{Appl.Optics}} \def\apss{\ref@jnl{Ap\&SS}} \def\aap{\ref@jnl{A\&A}} \def\aapr{\ref@jnl{A\&A~Rev.}} \def\aaps{\ref@jnl{A\&AS}} %LR: 4/13/07 added defintion for ASP Conf. Ser. citation \def\aspcs{\ref@jnl{ASP Conf.~Ser.)}} \def\azh{\ref@jnl{AZh}} \def\baas{\ref@jnl{BAAS}} \def\ion#1#2{{\rm #1}~{\sc #2}} \def\jrasc{\ref@jnl{JRASC}} \def\memras{\ref@jnl{MmRAS}} \def\mnras{\ref@jnl{MNRAS}} \def\nat{\ref@jnl{Nat}} \def\pra{\ref@jnl{Phys.Rev.A}} \def\prb{\ref@jnl{Phys.Rev.B}} \def\prc{\ref@jnl{Phys.Rev.C}} \def\prd{\ref@jnl{Phys.Rev.D}} \def\prl{\ref@jnl{Phys.Rev.Lett}} \def\pasp{\ref@jnl{PASP}} \def\pasj{\ref@jnl{PASJ}} \def\qjras{\ref@jnl{QJRAS}} \def\science{\ref@jnl{Sci}} \def\skytel{\ref@jnl{S\&T}} \def\solphys{\ref@jnl{Solar~Phys.}} \def\sovast{\ref@jnl{Soviet~Ast.}} \def\ssr{\ref@jnl{Space~Sci.Rev.}} \def\zap{\ref@jnl{ZAp}} \let\astap=\aap \let\apjlett=\apjl \let\apjsupp=\apjs \def\deg{\hbox{$^\circ$}} \def\sun{\hbox{$\odot$}} \def\earth{\hbox{$\oplus$}} \def\la{\mathrel{\hbox{\rlap{\hbox{\lower4pt\hbox{$\sim$}}}\hbox{$<$}}}} \def\ga{\mathrel{\hbox{\rlap{\hbox{\lower4pt\hbox{$\sim$}}}\hbox{$>$}}}} \def\sq{\hbox{\rlap{$\sqcap$}$\sqcup$}} \def\arcmin{\hbox{$^\prime$}} \def\arcsec{\hbox{$^{\prime\prime}$}} \def\fd{\hbox{$.\!\!^{\rm d}$}} \def\fh{\hbox{$.\!\!^{\rm h}$}} \def\fm{\hbox{$.\!\!^{\rm m}$}} \def\fs{\hbox{$.\!\!^{\rm s}$}} \def\fdg{\hbox{$.\!\!^\circ$}} \def\farcm{\hbox{$.\mkern-4mu^\prime$}} \def\farcs{\hbox{$.\!\!^{\prime\prime}$}} \def\fp{\hbox{$.\!\!^{\scriptscriptstyle\rm p}$}} \def\micron{\hbox{$\mu$m}} \def\onehalf{\hbox{$\,^1\!/_2$}} \def\onethird{\hbox{$\,^1\!/_3$}} \def\twothirds{\hbox{$\,^2\!/_3$}} \def\onequarter{\hbox{$\,^1\!/_4$}} \def\threequarters{\hbox{$\,^3\!/_4$}} \def\ubv{\hbox{$U\!BV$}} \def\ubvr{\hbox{$U\!BV\!R$}} \def\ubvri{\hbox{$U\!BV\!RI$}} \def\ubvrij{\hbox{$U\!BV\!RI\!J$}} \def\ubvrijh{\hbox{$U\!BV\!RI\!J\!H$}} \def\ubvrijhk{\hbox{$U\!BV\!RI\!J\!H\!K$}} \def\ub{\hbox{$U\!-\!B$}} \def\bv{\hbox{$B\!-\!V$}} \def\vr{\hbox{$V\!-\!R$}} \def\ur{\hbox{$U\!-\!R$}} \newcount\lecurrentfam \def\LaTeX{\lecurrentfam=\the\fam \leavevmode L\raise.42ex \hbox{$\fam\lecurrentfam\scriptstyle\kern-.3em A$}\kern-.15em\TeX} %\def\plotone#1{\centering \leavevmode %\epsfxsize=.95\textwidth \epsfbox{#1}} %%NEXT 6 LINES ADDED BY LISA ROPER 1/1/08, TAKEN FROM ADASS V ADAPTATION BY J. BARNES, 7/30/95 %%found at iraf.noao.edu/iraf/ftp/iraf/conf/adass-95/proc/aspconf.doc, %%modified in adassconf2006.sty in ASPCS Vol. 376 \@ifundefined{epsfbox}{\@input{epsf.sty}}{\relax} \def\eps@scaling{.95} \newcommand{\epsscale}[1]{% \def\eps@scaling{#1} }% \newcommand{\plotone}[2][width=.95\textwidth]{% \centering \leavevmode \includegraphics[#1]{#2} }% \newcommand{\plottwo}[2]{% \centering \leavevmode \includegraphics[width=.45\textwidth]{#1}% \hfil \includegraphics[width=.45\textwidth]{#2}% }% \newcommand{\plotthree}[3]{%3 \centering \leavevmode \includegraphics[width=0.3\textwidth]{#1}% \hfil \includegraphics[width=0.3\textwidth]{#2}% \hfil \includegraphics[width=0.3\textwidth]{#3}% }% \newcommand{\plotfour}[4]{% \centering \leavevmode \includegraphics[width=.45\textwidth]{#1}% \hfil \includegraphics[width=.45\textwidth]{#2}% \vspace{1ex} \includegraphics[width=.45\textwidth]{#3}% \hfil \includegraphics[width=.45\textwidth]{#4}% }% \newcommand{\plotfiddle}[7]{% \centering \leavevmode \vbox to#2{\rule{0pt}{#2}} \special{psfile=#1 voffset=#7 hoffset=#6 vscale=#5 hscale=#4 angle=#3} }% \newif\if@finalstyle \@finalstyletrue \if@finalstyle \ps@myheadings \let\ps@title=\ps@paspcstitle \else \ps@plain \let\ps@title=\ps@plain \fi% \ds@twoside %\renewcommand{\cleardoublepage}{% % \clearpage % \if@twoside % \ifodd \c@page % \else% % \hbox{}% % \thispagestyle{empty} % \newpage% % \if@twocolumn % \hbox{} % \newpage % \fi % \fi %\fi} % Added 7/11/06 by Jared % Modified 2/18/09 by Jonathan \renewcommand\part{% \typeout{(ASP) Part Begin: \arabic{page}}% \thispagestyle{empty} \markboth{}{} \if@openright \cleardoublepage \else \clearpage \fi \thispagestyle{empty} \if@twocolumn \onecolumn \@tempswatrue \else \@tempswafalse \fi \null\vfil \typeout{(ASP) Part End: \arabic{page}}% \secdef\@asppart\@spart}% \def\@asppart[#1]#2{% \ifnum \c@secnumdepth >-2\relax \refstepcounter{part}% \addtocontents{toc}{\protect\partline{#2}}% \else \addtocontents{toc}{\protect\unpartline{#2}}% \fi \markboth{}{}% {\centering \interlinepenalty \@M \normalfont \ifnum \c@secnumdepth >-2\relax \huge\bfseries \partname\nobreakspace\thepart \par \vskip 20\p@ \fi \Huge \bfseries #2\par }% \@endpart}% \newcommand\tocentry[2]{% \addtocontents{toc}{\protect\tocline{#1}{#2}{\thepage}} } % For adjusting the number width in the table of contents \newcommand\tocnumwidth[1]{% \ifx&% \relax \else \renewcommand\@pnumwidth{#1} \fi% }% \renewcommand\tableofcontents{% \pagestyle{myheadings}% %\title{} \thispagestyle{plain}% \parindent 0pt% \markboth{Contents}{Contents}% \Large{\bf Contents}\normalsize\vspace{0.5in}\linebreak% \@starttoc{toc}% } \def\tocline#1#2#3{\medskip\vbox{ \@dottedtocline{1}{\z@}{.4in}{#1}{#3} \smallskip \protect\@authortocline{1}{.4in}{#2} } } \def\@authortocline#1#2#3{\vskip \z@ plus .2pt {\leftskip #2\relax \rightskip \@tocrmarg \parindent\z@\relax\@afterindenttrue \interlinepenalty\@M \leavevmode \@tempdimb\textwidth \advance\@tempdimb by-#2 \advance\@tempdimb by-\@tocrmarg \parbox{\@tempdimb}{\pretolerance=10000\raggedright\small\sl#3}\par}} \newcounter{tocpart} \newcounter{tocsect}[tocpart] \def\sectline#1{\stepcounter{tocsect}\vskip 3.5ex {{\bf Section \Alph{tocsect}. #1}}\par\smallskip} %\def\unpartline#1{\stepcounter{tocpart}\vskip 5.5ex \def\unpartline#1{\vskip 5.5ex {\bf #1}\par\bigskip} \def\sectline#1{\stepcounter{tocsect}\vskip 3.5ex {{\bf Section \Alph{tocsect}. #1}}\par\smallskip} \def\partline#1{\stepcounter{tocpart}\vskip 5.5ex {\bf \partname\ \Roman{tocpart}. #1}\par\bigskip} %\def\@sect#1#2#3#4#5#6[#7]#8{% % \ifnum #3>\c@secnumdepth % \let\@svsec\@empty % \else % \refstepcounter{#1}% % \protected@edef\@svsec{\@seccntformat{#1}\relax}% % \fi % \@tempskipa #5\relax % \ifdim \@tempskipa>\z@ % \begingroup % #6{% % \@hangfrom{\hskip #3\relax\@svsec}% % \interlinepenalty \@M #8\@@par}% % \endgroup % \csname #1mark\endcsname{#7}% % \else % \def\@svsechd{% % #6{\hskip #3\relax % \@svsec #8}% % \csname #1mark\endcsname{#7}% % }% % \fi % \@xsect{#5}} \newcommand{\marginguide}{% \watermark{\cropmark{0mm}{0mm}{9mm}{0mm}{115mm}} % For Proofing: Use this line to show margin guides }% \newcommand{\aspeditorialstaff}[0]{% \begin{center} {EDITORIAL STAFF\\} \end{center} \begin{center} {\small {\itshape Managing Editor:} Joseph Jensen\\ {\itshape Associate Managing Editor:} Jonathan Barnes\\ {\itshape Publication Manager:} Pepita Ridgeway\\ {\itshape Editorial Assistant:} Cindy Moody\\ {\itshape e-Book Specialist:} Bret Little\\ {\itshape Web Developer/Technical Consultant:} Jared M.\ Bellows\\ {\itshape \LaTeX\ Consultant:} T.\ J.\ Mahoney\\ }% \end{center} }% \newcommand{\aspaddress}[0]{% \begin{center} {\small MS 179, Utah Valley University, 800 W. University Parkway, Orem, Utah 84058-5999\\ Phone: 801-863-8804 \hspace{2em} E-mail: \url{aspcs@aspbooks.org}\\ E-book site: \url{http://www.aspbooks.org}\\ }% \end{center} }% \newcolumntype{x}[1]{>{\centering\hspace{0pt}}p{#1}}% \newcommand{\asppubcommittee}[0]{% \begin{center} {PUBLICATION COMMITTEE\\} \medskip \end{center} \begin{center} {\small \begin{tabular*}{1\textwidth}{x{6cm} p{0.1cm} x{6cm}} %x{5cm} x{5cm}} {\centering Lynne Hillenbrand, Chair} & & Marsha J. Bishop\tabularnewline {\scriptsize California Institute of Technology} & & {\scriptsize National Radio Astronomy Observatory}\tabularnewline \tabularnewline Daniela Calzetti & & Gary J.\ Ferland\tabularnewline {\scriptsize University of Massachusetts} & & {\scriptsize University of Kentucky}\tabularnewline \tabularnewline Ed Guinan & & Luis Ho\tabularnewline {\scriptsize Villanova University} & & {\scriptsize The Observatories of the Carnegie}\tabularnewline {\scriptsize \ } & & {\scriptsize Institution of Washington}\tabularnewline \tabularnewline Scott J.\ Kenyon & & Doug Leonard\tabularnewline {\scriptsize Smithsonian Astrophysical Observatory} & & {\scriptsize San Diego State University}\tabularnewline \tabularnewline Don McCarthy & & Ren\'e Racine\tabularnewline {\scriptsize The University of Arizona} & & {\scriptsize Universit\'e de Montr\'eal} \end{tabular*} }% Ata Sarajedini\\{\scriptsize University of Florida} \end{center} }% % Keyword LaTeX Marks \newcommand{\keyword}[1]{% \@empty% }% % Title Footnote Macros \newcommand{\allowtitlefootnote}{% \renewcommand{\thefootnote}{\fnsymbol{footnote}} }% \newcommand{\titlefootnote}[1]{% \footnotetext{#1} \renewcommand{\thefootnote}{\arabic{footnote}} \setcounter{footnote}{0} }% % Format and deliver cover illustration info if it exists \newcommand{\providecoverinfo}{% \ifx \@aspcoverinfo \@empty \relax \else {\small \noindent {\itshape COVER ILLUSTRATION\/:}\\\hfill\\\blurb{}} \fi% }% % Format and deliver meeting info if it exists \newcommand{\providemeetinginfo}{% \ifx \@aspmtgtype \@empty \relax \else \medskip \begin{center} {Proceedings of a \mtgtype{} held at\\ \venue{}\\ \when{} } \end{center} \fi% }% % Format and deliver first editor info if it exists \newcommand{\provideeditorone}{% \ifx \@aspeditorone \@empty \relax \else \begin{center} {\bfseries \firsteditor{}}\\ {\itshape \firstaffil{}}\\ \end{center} \fi% }% % Format and deliver second editor info if it exists \newcommand{\provideeditortwo}{% \ifx \@aspeditortwo \@empty \relax \else \begin{center} {\bfseries \secondeditor{}}\\ {\itshape \secondaffil{}}\\ \end{center} \fi% }% % Format and deliver third editor info if it exists \newcommand{\provideeditorthree}{% \ifx \@aspeditorthree \@empty \relax \else \begin{center} {\bfseries \thirdeditor{}}\\ {\itshape \thirdaffil{}}\\ \end{center} \fi% }% % Format and deliver fourth editor info if it exists \newcommand{\provideeditorfour}{% \ifx \@aspeditorfour \@empty \relax \else \begin{center} {\bfseries \fourtheditor{}}\\ {\itshape \fourthaffil{}}\\ \end{center} \fi% }% % Format and deliver fifth editor info if it exists \newcommand{\provideeditorfive}{% \ifx \@aspeditorfive \@empty \relax \else \begin{center} {\bfseries \fiftheditor{}}\\ {\itshape \fifthaffil{}}\\ \end{center} \fi% }% % Convenient macros for preparing indexes \newcommand{\prepareindexes}{% \makeindex \newindex{not}{ndx}{nnd}{\Large List of Notation} \newindex{aut}{adx}{and}{\Large Author Index} \newindex{sub}{sdx}{snd}{\Large Subject Index} \newindex{obj}{odx}{ond}{\Large Object Index} \newindex{mol}{mdx}{mnd}{\Large Spectral Feature Index} }% \newcommand{\nindex}[1]{\index*[not]{#1}} \newcommand{\aindex}[1]{\index[aut]{#1}} \newcommand{\sindex}[1]{\index*[sub]{#1}} \newcommand{\ssindex}[1]{\index[sub]{#1}} \newcommand{\oindex}[1]{\index*[obj]{#1}} \newcommand{\ooindex}[1]{\index[obj]{#1}} \newcommand{\mindex}[1]{\index*[mol]{#1}} \newcommand{\nn}[1]{#1n} \newcommand{\printnotationlist}{% \markboth{List of Notation}{List of Notation} \tocentry{\itshape List of Notation}{} \printindex[not] }% \newcommand{\printauthorindex}{% \markboth{Author Index}{Author Index} \tocentry{\itshape Author Index}{} \printindex[aut] }% \newcommand{\printsubjectindex}{% \markboth{Subject Index}{Subject Index} \tocentry{\itshape Subject Index}{} \printindex[sub] }% \newcommand{\printobjectindex}{% \markboth{Object Index}{Object Index} \tocentry{\itshape Object Index}{} \printindex[obj] }% \newcommand{\printspectralindex}{% \markboth{Spectral Feature Index}{Spectral Feature Index} \tocentry{\itshape Spectral Feature Index}{} \printindex[mol] }% % Convenient macro for preparing main matter \newcommand{\preparemainmatter}{% \textwidth=5.25in \textheight=8.3in \headheight=18pt \headsep=18pt \topmargin=0in \footskip=.25in }% \renewcommand{\contentsname}{\Large Contents} % Convenient macro for resetting counters \newcommand{\resetcounters}{% \setcounter{section}{0} \setcounter{footnote}{0} \setcounter{figure}{0} \setcounter{table}{0} \setcounter{equation}{0} \pagestyle{myheadings} }% % Convenient macro for making a blank page \newcommand{\bookblankpage}{% \newpage \thispagestyle{empty} \mbox{} \vfill \clearpage }% \newcommand{\removerunninghead}{% \clearpage \thispagestyle{empty} \mbox{} \pagebreak }% % Convenient file for participant list \def\attendee#1#2#3#4{\par{\samepage\hangindent 1.5em\def\@tempa{#2} #1, #3, #4\ifx\@tempa\@empty\relax\else\space$\langle\,$#2$\,\rangle$\fi\par}} % Convenient image inclusion macros for adding images easier % For including a figure in an article % \articlefigure{filename}{labelname}{caption} \newcommand{\articlefigure}[4][width=.95\textwidth]{% \begin{figure}[!ht] \plotone[#1]{#2}% \ifx&% \typeout{(ASP) Missing Caption: \jobname, #2} \relax \else \caption{#4}% \fi% \ifx&% \typeout{(ASP) Missing Label: \jobname, #2} \relax \else \label{#3}% \fi% \end{figure} }% % For including a two figures side by side in an article % \articlefiguretwo{filename1}{filename2}{labelname}{caption} \newcommand{\articlefiguretwo}[4]{% \begin{figure}[!ht] \plottwo{#1}{#2}% \ifx&% \typeout{(ASP) Missing Caption: \jobname, #1} \relax \else \caption{#4}% \fi% \ifx&% \typeout{(ASP) Missing Label: \jobname, #1} \relax \else \label{#3}% \fi% \end{figure} } % For including a three figures in an article % \articlefigurethree{filename1}{filename2}{filename3}{labelname}{caption} \newcommand{\articlefigurethree}[5]{% \begin{figure}[!ht] \plotthree{#1}{#2}{#3}% \ifx&% \typeout{(ASP) Missing Caption: \jobname, #1} \relax \else \caption{#5}% \fi% \ifx&% \typeout{(ASP) Missing Label: \jobname, #1} \relax \else \label{#4}% \fi% \end{figure} }% % For including a four figures in a four by four square in an article % \articlefigurefour{filename1}{filename2}{filename3}{filename4}{labelname}{caption} \newcommand{\articlefigurefour}[6]{% \begin{figure}[!ht] \plotfour{#1}{#2}{#3}{#4}% \ifx&% \typeout{(ASP) Missing Caption: \jobname, #1} \relax \else \caption{#6}% \fi% \ifx&% \typeout{(ASP) Missing Label: \jobname, #1} \relax \else \label{#5}% \fi% \end{figure} }% % For including a landscape figure in an article % Syntax: \articlelandscapefigure{filename}{labelname}{caption} \newcommand{\articlelandscapefigure}[3]{% \pagestyle{empty} \mbox{} \vfill \begin{center} \begin{landscape} \begin{figure}[ht] \includegraphics[height=0.92\textheight]{#1}% \ifx&% \typeout{(ASP) Missing Caption: \jobname, #1} \relax \else \caption{#3}% \fi% \ifx&% \typeout{(ASP) Missing Label: \jobname, #1} \relax \else \label{#2}% \fi% \end{figure} \end{landscape} \end{center} \vfill \pagebreak }% % For including two figures in a landscape figure side by side in an article % Syntax: \articlelandscapefiguretwo{filename1}{filename2}{labelname}{caption} \newcommand{\articlelandscapefiguretwo}[4]{% \pagestyle{empty} \mbox{} \vfill \leavevmode \begin{center} \begin{landscape} \begin{figure} \begin{minipage}[b]{0.5\linewidth} \centering \includegraphics[width=0.9\linewidth]{#1}% \end{minipage} \hspace{0.5cm} \begin{minipage}[b]{0.5\linewidth} \centering \includegraphics[width=0.9\linewidth]{#2}% \end{minipage} \ifx&% \typeout{(ASP) Missing Caption: \jobname, #1} \relax \else \caption{#4}% \fi% \ifx&% \typeout{(ASP) Missing Label: \jobname, #1} \relax \else \label{#3}% \fi% \end{figure} \end{landscape} \end{center} \vfill \pagebreak }% % For including a figure % Syntax: \bookfigure{filename}{caption} \newcommand{\bookfigure}[2]{% \begin{figure}[!ht] \plotone{#1}% \end{figure} \begin{center} \small{#2}% \end{center} }% % For including a full page image % This command removes slug and page number % Syntax: \bookfullphoto{filename}{caption} \newcommand{\bookfullphoto}[3][width=.95\linewidth]{% \clearpage \pagestyle{empty} \mbox{} \vfill \begin{figure}[!ht] \plotone[#1]{#2}% \end{figure} \begin{center} \small{#3}% \end{center} \vfill \pagebreak }% % For including a full page landscape image % This command removes slug and page number % Syntax: \booklandscapephoto[options]{filename}{caption} \newcommand{\booklandscapephoto}[3][height=0.85\textheight]{% \pagestyle{empty} \mbox{} \vfill \begin{center} \begin{landscape} \includegraphics[#1]{#2}\\ %~\\ \noindent \small{#3}% \end{landscape} \end{center} \vfill \pagebreak }% % For including an image for part of a page % This command fills empty space with an editor's image % Syntax: \bookpartphoto{filename}{caption} \newcommand{\bookpartphoto}[3][width=.95\linewidth]{% \mbox{} \vfill \begin{figure}[!ht] \plotone[#1]{#2} \begin{center} \small{#3}% \end{center} \end{figure} \vfill }% % For simplifying table of contents and file include % Syntax: \tocinsertentry[n or r]{Title}{Author}{Latex File} \newcommand{\tocinsertentry}[4][n]{% \ifthenelse{\equal{#1}{r}}{% Option for right side of the page specified \clearpage \ifodd\c@page \relax \else \null \thispagestyle{empty}% \newpage \fi% }{}% \typeout{(ASP) Entry Begin: #1|#2|\arabic{page}|\jobname} \tocentry{#2}{#3} \ifx&% \typeout{(ASP) Missing file: #1} \else \include{#4}\last \typeout{(ASP) Entry End: #1|#2|\arabic{page}|\jobname} \fi% }% % For simplifying table of contents and directly including files % Syntax: \tocinclude{Latex File} \newcommand{\tocinclude}[2][n]{% \ifthenelse{\equal{#1}{r}}{% Option for right side of the page specified \clearpage \ifodd\c@page \relax \else \null \thispagestyle{empty}% \newpage \fi% }{}% \include{#2}\last }% % For simplifying table of contents and including unnumbered labels % Syntax: \tocinsertlabel{vspace}{Label} \newcommand{\tocinsertlabel}[2][0in]{% \addtocontents{toc}{\vspace{#1}} \addtocontents{toc}{\protect\unpartline{#2}} }% \newcommand{\tocinsertvspace}[1]{% \addtocontents{toc}{\vspace{#1}} }% % For simplifying table of contents and including page breaks % Syntax: \tocinsertnewpage \newcommand{\tocinsertnewpage}{% \addtocontents{toc}{\newpage} }% % For making the bullet and dash marks into boxes % This command MUST be run between the \begin{itemize} and \end{itemize} commands. \newcommand{\checklistitemize}{% \renewcommand{\labelitemi}{$\Box$} \renewcommand{\labelitemii}{\scriptsize $\Box$} }% % For changing the line spacing value \newcommand{\changelinespacing}[1]{% \renewcommand{\baselinestretch}{#1} }% pal-0.9.7/sofa-porting-guide.txt000066400000000000000000000016261302604645500165610ustar00rootroot00000000000000Some SLA routines migrate directly to SOFA. Simple PAL wrappers are made available using the SLA name but new code should use the SOFA variant directly. The PAL routines should not be called internally by other PAL routines. Daf2r => Af2a Dav2m => Rv2m Dcc2s => C2s Dcs2c => S2c Dd2tf => D2tf Dimxv => Trxp Djcl => Jd2cal Dmxm => Rxr Dmxv => Rxp Dm2av => Rm2v Dranrm => Anp Drange => Anpm Dsep => Seps Dsepv => Sepp Dtf2d => Tf2d Dtf2r => Tf2a Dvdv => Pdp Dvn => Pn Dvxv => Pxp Epb => Epb Epb2d => Epb2jd Epj => Epj Epj2d => Epj2jd Eqeqx => Ee06a Fk5hz => Fk5hz Gmst => Gmst06 Hfk5z => Hfk5z Some SLA routines are close to the same but have different arguments so a PAL routine is provided although it is probably best to port software to the SOFA variant: slaDat =>palDat => iauDat slaGeoc has different arguments and uses the WGS84 model. The code is not quite one-to-one. pal-0.9.7/sun267.tex000066400000000000000000010130441302604645500141010ustar00rootroot00000000000000\documentclass[twoside,11pt,nolof]{starlink} % ? Specify used packages % ? End of specify used packages % ----------------------------------------------------------------------------- % ? Document identification % Fixed part \stardoccategory {Starlink User Note} \stardocinitials {SUN} \stardocsource {sun\stardocnumber} \stardoccopyright{% Copyright \copyright\ 2012 Science and Technology Facilities Council.\\ Copyright \copyright\ 2014 Cornell University.\\ Copyright \copyright\ 2015 Tim Jenness} % Variable part - replace [xxx] as appropriate. \stardocnumber {267.3} \stardocauthors {Tim Jenness} \stardocdate {2015 January 1} \stardoctitle {PAL --- Positional Astronomy Library} \stardocversion {0.9.0} \stardocmanual {Programmer's Manual} \stardocabstract {% PAL provides a subset of the Fortran SLALIB library but written in C using the SLALIB C API. Where possible the PAL routines are implemented using the C SOFA/ERFA library. It is provided with a GPLv3 license. } % ? End of document identification % ----------------------------------------------------------------------------- \begin{document} \scfrontmatter % ? Main text \section{Introduction} This library provides a C library designed as a API-compatible replacement for the C SLALIB library (SUN/67) and uses a GPL licence so is freely redistributable. Where possible the functions call equivalent SOFA routines (Hohenkerk, C., 2011, Scholarpedia, \textbf{6}, \emph{11404})\footnote{or equivalent ERFA routines.} and use current IAU 2006 standards. This means that any functions that rely on nutation or precession will return slightly different answers to the SLA functions. \section{Citing PAL} If you use PAL in your work please consider citing it. The description paper for PAL is: \emph{PAL: A Positional Astronomy Library}, Jenness, T. \& Berry, D. S., in \emph{Astronomical Data Anaysis Software and Systems XXII}, Friedel, D. N. (ed), ASP Conf.\ Ser. \textbf{475}, p307. \clearpage \appendix \section{\label{APP:SPEC}Function Descriptions} By default PAL is set up to use the ERFA variant of SOFA. ERFA is an approved redistribution of the SOFA code using a BSD-license and renamed function calls. Whereas SOFA routines have a \texttt{iau} prefix the ERFA equivalents have a \texttt{era} prefix. The PAL build script will try to detect which of ERFA and SOFA is available. Wherever SOFA is mentioned in this document the ERFA equivalent can be substituted. ERFA can be obtained from \htmladdnormallink{https://github.com/liberfa/erfa}. \subsection{SOFA Mappings} The following table lists PAL/SLA functions that have direct replacements in SOFA. Whilst these routines are implemented in the PAL library using SOFA new code should probably call SOFA directly. \begin{tabbing} \hspace*{2cm}\=\hspace*{3cm}\= \kill SLA/PAL \> SOFA \\ \texttt{palCldj} \> \texttt{iauCal2jd} \\ \texttt{palDbear} \> \texttt{iauPas} \\ \texttt{palDaf2r} \> \texttt{iauAf2a} \\ \texttt{palDav2m} \> \texttt{iauRv2m} \\ \texttt{palDcc2s} \> \texttt{iauC2s} \\ \texttt{palDcs2c} \> \texttt{iauS2c} \\ \texttt{palDd2tf} \> \texttt{iauD2tf}\\ \texttt{palDimxv} \> \texttt{iauTrxp}\\ \texttt{palDm2av} \> \texttt{iauRm2v}\\ \texttt{palDjcl} \> \texttt{iauJd2cal}\\ \texttt{palDmxm} \> \texttt{iauRxr}\\ \texttt{palDmxv} \> \texttt{iauRxp}\\ \texttt{palDpav} \> \texttt{iauPap}\\ \texttt{palDr2af} \> \texttt{iauA2af}\\ \texttt{palDr2tf} \> \texttt{iauA2tf}\\ \texttt{palDranrm} \> \texttt{iauAnp}\\ \texttt{palDsep} \> \texttt{iauSeps}\\ \texttt{palDsepv} \> \texttt{iauSepp}\\ \texttt{palDtf2d} \> \texttt{iauTf2d}\\ \texttt{palDtf2r} \> \texttt{iauTf2a}\\ \texttt{palDvdv} \> \texttt{iauPdp}\\ \texttt{palDvn} \> \texttt{iauPn}\\ \texttt{palDvxv} \> \texttt{iauPxp}\\ \texttt{palEpb} \> \texttt{iauEpb}\\ \texttt{palEpb2d} \> \texttt{iauEpb2d}\\ \texttt{palEpj} \> \texttt{iauEpj}\\ \texttt{palEpj2d} \> \texttt{iauEpj2jd}\\ \texttt{palEqeqx} \> \texttt{iauEe06a}\\ \texttt{palFk5hz} \> \texttt{iauFk5hz} \textit{also calls iauEpj2jd}\\ \texttt{palGmst} \> \texttt{iauGmst06}\\ \texttt{palGmsta} \> \texttt{iauGmst06}\\ \texttt{palHfk5z} \> \texttt{iauHfk5z} \textit{also calls iauEpj2jd}\\ \texttt{palRefcoq} \> \texttt{iauRefco}\\ \end{tabbing} \sstroutine{ palCldj }{ Gregorian Calendar to Modified Julian Date }{ \sstdescription{ Gregorian calendar to Modified Julian Date. } \sstinvocation{ palCldj( int iy, int im, int id, double $*$djm, int $*$j ); } \sstarguments{ \sstsubsection{ iy = int (Given) }{ Year in Gregorian calendar } \sstsubsection{ im = int (Given) }{ Month in Gregorian calendar } \sstsubsection{ id = int (Given) }{ Day in Gregorian calendar } \sstsubsection{ djm = double $*$ (Returned) }{ Modified Julian Date (JD-2400000.5) for 0 hrs } \sstsubsection{ j = int $*$ (Returned) }{ status: 0 = OK, 1 = bad year (MJD not computed), 2 = bad month (MJD not computed), 3 = bad day (MJD computed). } } \sstnotes{ \sstitemlist{ \sstitem Uses eraCal2jd(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palDbear }{ Bearing (position angle) of one point on a sphere relative to another }{ \sstdescription{ Bearing (position angle) of one point in a sphere relative to another. } \sstinvocation{ pa = palDbear( double a1, double b1, double a2, double b2 ); } \sstarguments{ \sstsubsection{ a1 = double (Given) }{ Longitude of point A (e.g. RA) in radians. } \sstsubsection{ a2 = double (Given) }{ Latitude of point A (e.g. Dec) in radians. } \sstsubsection{ b1 = double (Given) }{ Longitude of point B in radians. } \sstsubsection{ b2 = double (Given) }{ Latitude of point B in radians. } } \sstreturnedvalue{ \sstsubsection{ The result is the bearing (position angle), in radians, of point }{ } \sstsubsection{ A2,B2 as seen from point A1,B1. It is in the range $+$/- pi. If }{ } \sstsubsection{ A2,B2 is due east of A1,B1 the bearing is $+$pi/2. Zero is returned }{ } \sstsubsection{ if the two points are coincident. }{ } } \sstnotes{ \sstitemlist{ \sstitem Uses eraPas(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palDaf2r }{ Convert degrees, arcminutes, arcseconds to radians }{ \sstdescription{ Convert degrees, arcminutes, arcseconds to radians. } \sstinvocation{ palDaf2r( int ideg, int iamin, double asec, double $*$rad, int $*$j ); } \sstarguments{ \sstsubsection{ ideg = int (Given) }{ Degrees. } \sstsubsection{ iamin = int (Given) }{ Arcminutes. } \sstsubsection{ iasec = double (Given) }{ Arcseconds. } \sstsubsection{ rad = double $*$ (Returned) }{ Angle in radians. } \sstsubsection{ j = int $*$ (Returned) }{ Status: 0 = OK, 1 = {\tt "}ideg{\tt "} out of range 0-359, 2 = {\tt "}iamin{\tt "} outside of range 0-59, 2 = {\tt "}asec{\tt "} outside range 0-59.99999 } } \sstnotes{ \sstitemlist{ \sstitem Uses eraAf2a(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palDav2m }{ Form the rotation matrix corresponding to a given axial vector }{ \sstdescription{ A rotation matrix describes a rotation about some arbitrary axis, called the Euler axis. The {\tt "}axial vector{\tt "} supplied to this routine has the same direction as the Euler axis, and its magnitude is the amount of rotation in radians. } \sstinvocation{ palDav2m( double axvec[3], double rmat[3][3] ); } \sstarguments{ \sstsubsection{ axvec = double [3] (Given) }{ Axial vector (radians) } \sstsubsection{ rmat = double [3][3] (Returned) }{ Rotation matrix. } } \sstnotes{ \sstitemlist{ \sstitem Uses eraRv2m(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palDcc2s }{ Cartesian to spherical coordinates }{ \sstdescription{ The spherical coordinates are longitude ($+$ve anticlockwise looking from the $+$ve latitude pole) and latitude. The Cartesian coordinates are right handed, with the x axis at zero longitude and latitude, and the z axis at the $+$ve latitude pole. } \sstinvocation{ palDcc2s( double v[3], double $*$a, double $*$b ); } \sstarguments{ \sstsubsection{ v = double [3] (Given) }{ x, y, z vector. } \sstsubsection{ a = double $*$ (Returned) }{ Spherical coordinate (radians) } \sstsubsection{ b = double $*$ (Returned) }{ Spherical coordinate (radians) } } \sstnotes{ \sstitemlist{ \sstitem Uses eraC2s(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palDcs2c }{ Spherical coordinates to direction cosines }{ \sstdescription{ The spherical coordinates are longitude ($+$ve anticlockwise looking from the $+$ve latitude pole) and latitude. The Cartesian coordinates are right handed, with the x axis at zero longitude and latitude, and the z axis at the $+$ve latitude pole. } \sstinvocation{ palDcs2c( double a, double b, double v[3] ); } \sstarguments{ \sstsubsection{ a = double (Given) }{ Spherical coordinate in radians (ra, long etc). } \sstsubsection{ b = double (Given) }{ Spherical coordinate in radians (dec, lat etc). } \sstsubsection{ v = double [3] (Returned) }{ x, y, z vector } } \sstnotes{ \sstitemlist{ \sstitem Uses eraS2c(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palDd2tf }{ Convert an interval in days into hours, minutes, seconds }{ \sstdescription{ Convert and interval in days into hours, minutes, seconds. } \sstinvocation{ palDd2tf( int ndp, double days, char $*$sign, int ihmsf[4] ); } \sstarguments{ \sstsubsection{ ndp = int (Given) }{ Number of decimal places of seconds } \sstsubsection{ days = double (Given) }{ Interval in days } \sstsubsection{ sign = char $*$ (Returned) }{ {\tt '}$+${\tt '} or {\tt '}-{\tt '} (single character, not string) } \sstsubsection{ ihmsf = int [4] (Returned) }{ Hours, minutes, seconds, fraction } } \sstnotes{ \sstitemlist{ \sstitem Uses eraD2tf(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palDimxv }{ Perform the 3-D backward unitary transformation }{ \sstdescription{ Perform the 3-D backward unitary transformation. } \sstinvocation{ palDimxv( double dm[3][3], double va[3], double vb[3] ); } \sstarguments{ \sstsubsection{ dm = double [3][3] (Given) }{ Matrix } \sstsubsection{ va = double [3] (Given) }{ vector } \sstsubsection{ vb = double [3] (Returned) }{ Result vector } } \sstnotes{ \sstitemlist{ \sstitem Uses eraTrxp(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palDm2av }{ From a rotation matrix, determine the corresponding axial vector }{ \sstdescription{ A rotation matrix describes a rotation about some arbitrary axis, called the Euler axis. The {\tt "}axial vector{\tt "} returned by this routine has the same direction as the Euler axis, and its magnitude is the amount of rotation in radians. (The magnitude and direction can be separated by means of the routine palDvn.) } \sstinvocation{ palDm2av( double rmat[3][3], double axvec[3] ); } \sstarguments{ \sstsubsection{ rmat = double [3][3] (Given) }{ Rotation matrix } \sstsubsection{ axvec = double [3] (Returned) }{ Axial vector (radians) } } \sstnotes{ \sstitemlist{ \sstitem Uses eraRm2v(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palDjcl }{ Modified Julian Date to Gregorian year, month, day and fraction of day }{ \sstdescription{ Modified Julian Date to Gregorian year, month, day and fraction of day. } \sstinvocation{ palDjcl( double djm, int $*$iy, int $*$im, int $*$id, double $*$fd, int $*$j ); } \sstarguments{ \sstsubsection{ djm = double (Given) }{ modified Julian Date (JD-2400000.5) } \sstsubsection{ iy = int $*$ (Returned) }{ year } \sstsubsection{ im = int $*$ (Returned) }{ month } \sstsubsection{ id = int $*$ (Returned) }{ day } \sstsubsection{ fd = double $*$ (Returned) }{ Fraction of day. } } \sstnotes{ \sstitemlist{ \sstitem Uses eraJd2cal(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palDmxm }{ Product of two 3x3 matrices }{ \sstdescription{ Product of two 3x3 matrices. } \sstinvocation{ palDmxm( double a[3][3], double b[3][3], double c[3][3] ); } \sstarguments{ \sstsubsection{ a = double [3][3] (Given) }{ Matrix } \sstsubsection{ b = double [3][3] (Given) }{ Matrix } \sstsubsection{ c = double [3][3] (Returned) }{ Matrix result } } \sstnotes{ \sstitemlist{ \sstitem Uses eraRxr(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palDmxv }{ Performs the 3-D forward unitary transformation }{ \sstdescription{ Performs the 3-D forward unitary transformation. } \sstinvocation{ palDmxv( double dm[3][3], double va[3], double vb[3] ); } \sstarguments{ \sstsubsection{ dm = double [3][3] (Given) }{ matrix } \sstsubsection{ va = double [3] (Given) }{ vector } \sstsubsection{ dp = double [3] (Returned) }{ result vector } } \sstnotes{ \sstitemlist{ \sstitem Uses eraRxp(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palDpav }{ Position angle of one celestial direction with respect to another }{ \sstdescription{ Position angle of one celestial direction with respect to another. } \sstinvocation{ pa = palDpav( double v1[3], double v2[3] ); } \sstarguments{ \sstsubsection{ v1 = double [3] (Given) }{ direction cosines of one point. } \sstsubsection{ v2 = double [3] (Given) }{ direction cosines of the other point. } } \sstreturnedvalue{ \sstsubsection{ The result is the bearing (position angle), in radians, of point }{ } \sstsubsection{ V2 with respect to point V1. It is in the range $+$/- pi. The }{ } \sstsubsection{ sense is such that if V2 is a small distance east of V1, the }{ } \sstsubsection{ bearing is about $+$pi/2. Zero is returned if the two points }{ } \sstsubsection{ are coincident. }{ } } \sstnotes{ \sstitemlist{ \sstitem The coordinate frames correspond to RA,Dec, Long,Lat etc. \sstitem Uses eraPap(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palDr2af }{ Convert an angle in radians to degrees, arcminutes, arcseconds }{ \sstdescription{ Convert an angle in radians to degrees, arcminutes, arcseconds. } \sstinvocation{ palDr2af( int ndp, double angle, char $*$sign, int idmsf[4] ); } \sstarguments{ \sstsubsection{ ndp = int (Given) }{ number of decimal places of arcseconds } \sstsubsection{ angle = double (Given) }{ angle in radians } \sstsubsection{ sign = char $*$ (Returned) }{ {\tt '}$+${\tt '} or {\tt '}-{\tt '} (single character) } \sstsubsection{ idmsf = int [4] (Returned) }{ Degrees, arcminutes, arcseconds, fraction } } \sstnotes{ \sstitemlist{ \sstitem Uses eraA2af(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palDr2tf }{ Convert an angle in radians to hours, minutes, seconds }{ \sstdescription{ Convert an angle in radians to hours, minutes, seconds. } \sstinvocation{ palDr2tf ( int ndp, double angle, char $*$sign, int ihmsf[4] ); } \sstarguments{ \sstsubsection{ ndp = int (Given) }{ number of decimal places of arcseconds } \sstsubsection{ angle = double (Given) }{ angle in radians } \sstsubsection{ sign = char $*$ (Returned) }{ {\tt '}$+${\tt '} or {\tt '}-{\tt '} (single character) } \sstsubsection{ idmsf = int [4] (Returned) }{ Hours, minutes, seconds, fraction } } \sstnotes{ \sstitemlist{ \sstitem Uses eraA2tf(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palDranrm }{ Normalize angle into range 0-2 pi }{ \sstdescription{ Normalize angle into range 0-2 pi. } \sstinvocation{ norm = palDranrm( double angle ); } \sstarguments{ \sstsubsection{ angle = double (Given) }{ angle in radians } } \sstreturnedvalue{ \sstsubsection{ Angle expressed in the range 0-2 pi }{ } } \sstnotes{ \sstitemlist{ \sstitem Uses eraAnp(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palDsep }{ Angle between two points on a sphere }{ \sstdescription{ Angle between two points on a sphere. } \sstinvocation{ ang = palDsep( double a1, double b1, double a2, double b2 ); } \sstarguments{ \sstsubsection{ a1 = double (Given) }{ Spherical coordinate of one point (radians) } \sstsubsection{ b1 = double (Given) }{ Spherical coordinate of one point (radians) } \sstsubsection{ a2 = double (Given) }{ Spherical coordinate of other point (radians) } \sstsubsection{ b2 = double (Given) }{ Spherical coordinate of other point (radians) } } \sstreturnedvalue{ \sstsubsection{ Angle, in radians, between the two points. Always positive. }{ } } \sstnotes{ \sstitemlist{ \sstitem The spherical coordinates are [RA,Dec], [Long,Lat] etc, in radians. \sstitem Uses eraSeps(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palDsepv }{ Angle between two vectors }{ \sstdescription{ Angle between two vectors. } \sstinvocation{ ang = palDsepv( double v1[3], double v2[3] ); } \sstarguments{ \sstsubsection{ v1 = double [3] (Given) }{ First vector } \sstsubsection{ v2 = double [3] (Given) }{ Second vector } } \sstreturnedvalue{ \sstsubsection{ Angle, in radians, between the two points. Always positive. }{ } } \sstnotes{ \sstitemlist{ \sstitem Uses eraSepp(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palDtf2d }{ Convert hours, minutes, seconds to days }{ \sstdescription{ Convert hours, minutes, seconds to days. } \sstinvocation{ palDtf2d( int ihour, int imin, double sec, double $*$days, int $*$j ); } \sstarguments{ \sstsubsection{ ihour = int (Given) }{ Hours } \sstsubsection{ imin = int (Given) }{ Minutes } \sstsubsection{ sec = double (Given) }{ Seconds } \sstsubsection{ days = double $*$ (Returned) }{ Interval in days } \sstsubsection{ j = int $*$ (Returned) }{ status: 0 = ok, 1 = ihour outside range 0-23, 2 = imin outside range 0-59, 3 = sec outside range 0-59.999... } } \sstnotes{ \sstitemlist{ \sstitem Uses eraTf2d(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palDtf2r }{ Convert hours, minutes, seconds to radians }{ \sstdescription{ Convert hours, minutes, seconds to radians. } \sstinvocation{ palDtf2r( int ihour, int imin, double sec, double $*$rad, int $*$j ); } \sstarguments{ \sstsubsection{ ihour = int (Given) }{ Hours } \sstsubsection{ imin = int (Given) }{ Minutes } \sstsubsection{ sec = double (Given) }{ Seconds } \sstsubsection{ days = double $*$ (Returned) }{ Angle in radians } \sstsubsection{ j = int $*$ (Returned) }{ status: 0 = ok, 1 = ihour outside range 0-23, 2 = imin outside range 0-59, 3 = sec outside range 0-59.999... } } \sstnotes{ \sstitemlist{ \sstitem Uses eraTf2a(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palDvdv }{ Scalar product of two 3-vectors }{ \sstdescription{ Scalar product of two 3-vectors. } \sstinvocation{ prod = palDvdv ( double va[3], double vb[3] ); } \sstarguments{ \sstsubsection{ va = double [3] (Given) }{ First vector } \sstsubsection{ vb = double [3] (Given) }{ Second vector } } \sstreturnedvalue{ \sstsubsection{ Scalar product va.vb }{ } } \sstnotes{ \sstitemlist{ \sstitem Uses eraPdp(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palDvn }{ Normalizes a 3-vector also giving the modulus }{ \sstdescription{ Normalizes a 3-vector also giving the modulus. } \sstinvocation{ palDvn( double v[3], double uv[3], double $*$vm ); } \sstarguments{ \sstsubsection{ v = double [3] (Given) }{ vector } \sstsubsection{ uv = double [3] (Returned) }{ unit vector in direction of {\tt "}v{\tt "} } \sstsubsection{ vm = double $*$ (Returned) }{ modulus of {\tt "}v{\tt "} } } \sstnotes{ \sstitemlist{ \sstitem Uses eraPn(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palDvxv }{ Vector product of two 3-vectors }{ \sstdescription{ Vector product of two 3-vectors. } \sstinvocation{ palDvxv( double va[3], double vb[3], double vc[3] ); } \sstarguments{ \sstsubsection{ va = double [3] (Given) }{ First vector } \sstsubsection{ vb = double [3] (Given) }{ Second vector } \sstsubsection{ vc = double [3] (Returned) }{ Result vector } } \sstnotes{ \sstitemlist{ \sstitem Uses eraPxp(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palEpb }{ Conversion of modified Julian Data to Besselian Epoch }{ \sstdescription{ Conversion of modified Julian Data to Besselian Epoch. } \sstinvocation{ epb = palEpb ( double date ); } \sstarguments{ \sstsubsection{ date = double (Given) }{ Modified Julian Date (JD - 2400000.5) } } \sstreturnedvalue{ \sstsubsection{ Besselian epoch. }{ } } \sstnotes{ \sstitemlist{ \sstitem Uses eraEpb(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palEpb2d }{ Conversion of Besselian Epoch to Modified Julian Date }{ \sstdescription{ Conversion of Besselian Epoch to Modified Julian Date. } \sstinvocation{ mjd = palEpb2d ( double epb ); } \sstarguments{ \sstsubsection{ epb = double (Given) }{ Besselian Epoch } } \sstreturnedvalue{ \sstsubsection{ Modified Julian Date (JD - 2400000.5) }{ } } \sstnotes{ \sstitemlist{ \sstitem Uses eraEpb2jd(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palEpj }{ Conversion of Modified Julian Date to Julian Epoch }{ \sstdescription{ Conversion of Modified Julian Date to Julian Epoch. } \sstinvocation{ epj = palEpj ( double date ); } \sstarguments{ \sstsubsection{ date = double (Given) }{ Modified Julian Date (JD - 2400000.5) } } \sstreturnedvalue{ \sstsubsection{ The Julian Epoch. }{ } } \sstnotes{ \sstitemlist{ \sstitem Uses eraEpj(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palEpj2d }{ Conversion of Julian Epoch to Modified Julian Date }{ \sstdescription{ Conversion of Julian Epoch to Modified Julian Date. } \sstinvocation{ mjd = palEpj2d ( double epj ); } \sstarguments{ \sstsubsection{ epj = double (Given) }{ Julian Epoch. } } \sstreturnedvalue{ \sstsubsection{ Modified Julian Date (JD - 2400000.5) }{ } } \sstnotes{ \sstitemlist{ \sstitem Uses eraEpj2d(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palEqeqx }{ Equation of the equinoxes (IAU 2000/2006) }{ \sstdescription{ Equation of the equinoxes (IAU 2000/2006). } \sstinvocation{ palEqeqx( double date ); } \sstarguments{ \sstsubsection{ date = double (Given) }{ TT as Modified Julian Date (JD-400000.5) } } \sstnotes{ \sstitemlist{ \sstitem Uses eraEe06a(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palFk5hz }{ Transform an FK5 (J2000) star position into the frame of the Hipparcos catalogue }{ \sstdescription{ Transform an FK5 (J2000) star position into the frame of the Hipparcos catalogue. } \sstinvocation{ palFk5hz ( double r5, double d5, double epoch, double $*$rh, double $*$dh ); } \sstarguments{ \sstsubsection{ r5 = double (Given) }{ FK5 RA (radians), equinox J2000, epoch {\tt "}epoch{\tt "} } \sstsubsection{ d5 = double (Given) }{ FK5 dec (radians), equinox J2000, epoch {\tt "}epoch{\tt "} } \sstsubsection{ epoch = double (Given) }{ Julian epoch } \sstsubsection{ rh = double $*$ (Returned) }{ RA (radians) } \sstsubsection{ dh = double $*$ (Returned) }{ Dec (radians) } } \sstnotes{ \sstitemlist{ \sstitem Assumes zero Hipparcos proper motion. \sstitem Uses eraEpj2jd() and eraFk5hz. See SOFA/ERFA documentation for details. } } } \sstroutine{ palGmst }{ Greenwich mean sidereal time (consistent with IAU 2006 precession) }{ \sstdescription{ Greenwich mean sidereal time (consistent with IAU 2006 precession). } \sstinvocation{ mst = palGmst ( double ut1 ); } \sstarguments{ \sstsubsection{ ut1 = double (Given) }{ Universal time (UT1) expressed as modified Julian Date (JD-2400000.5) } } \sstreturnedvalue{ \sstsubsection{ Greenwich mean sidereal time }{ } } \sstnotes{ \sstitemlist{ \sstitem Uses eraGmst06(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palGmsta }{ Greenwich mean sidereal time (consistent with IAU 2006 precession) }{ \sstdescription{ Greenwich mean sidereal time (consistent with IAU 2006 precession). } \sstinvocation{ mst = palGmsta ( double date, double ut1 ); } \sstarguments{ \sstsubsection{ date = double (Given) }{ UT1 date (MJD: integer part of JD-2400000.5) } \sstsubsection{ ut1 = double (Given) }{ UT1 time (fraction of a day) } } \sstreturnedvalue{ \sstsubsection{ Greenwich mean sidereal time (in range 0 to 2 pi) }{ } } \sstnotes{ \sstitemlist{ \sstitem For best accuracy use eraGmst06() directly. \sstitem Uses eraGmst06(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palHfk5z }{ Hipparcos star position to FK5 J2000 }{ \sstdescription{ Transform a Hipparcos star position into FK5 J2000, assuming zero Hipparcos proper motion. } \sstinvocation{ palHfk5z( double rh, double dh, double epoch, double $*$r5, double $*$d5, double $*$dr5, double $*$dd5 ); } \sstarguments{ \sstsubsection{ rh = double (Given) }{ Hipparcos RA (radians) } \sstsubsection{ dh = double (Given) }{ Hipparcos Dec (radians) } \sstsubsection{ epoch = double (Given) }{ Julian epoch (TDB) } \sstsubsection{ r5 = double $*$ (Returned) }{ RA (radians, FK5, equinox J2000, epoch {\tt "}epoch{\tt "}) } \sstsubsection{ d5 = double $*$ (Returned) }{ Dec (radians, FK5, equinox J2000, epoch {\tt "}epoch{\tt "}) } } \sstnotes{ \sstitemlist{ \sstitem Uses eraEpj2jd and eraHfk5z(). See SOFA/ERFA documentation for details. } } } \sstroutine{ palRefcoq }{ Determine the constants A and B in the atmospheric refraction model }{ \sstdescription{ Determine the constants A and B in the atmospheric refraction model dZ = A tan Z $+$ B tan$*$$*$3 Z. This is a fast alternative to the palRefco routine. Z is the {\tt "}observed{\tt "} zenith distance (i.e. affected by refraction) and dZ is what to add to Z to give the {\tt "}topocentric{\tt "} (i.e. in vacuo) zenith distance. } \sstinvocation{ palRefcoq( double tdk, double pmb, double rh, double wl, double $*$refa, double $*$refb ); } \sstarguments{ \sstsubsection{ tdk = double (Given) }{ Ambient temperature at the observer (K) } \sstsubsection{ pmb = double (Given) }{ Pressure at the observer (millibar) } \sstsubsection{ rh = double (Given) }{ Relative humidity at the observer (range 0-1) } \sstsubsection{ wl = double (Given) }{ Effective wavelength of the source (micrometre). Radio refraction is chosen by specifying wl $>$ 100 micrometres. } \sstsubsection{ refa = double $*$ (Returned) }{ tan Z coefficient (radian) } \sstsubsection{ refb = double $*$ (Returned) }{ tan$*$$*$3 Z coefficient (radian) } } \sstnotes{ \sstitemlist{ \sstitem Uses eraRefco(). See SOFA/ERFA documentation for details. \sstitem Note that the SOFA/ERFA routine uses different order of of arguments and uses deg C rather than K. } } } \subsection{More complex functions} These functions do not have a simple equivalent in SOFA so are reimplemented either completely standalone or using multiple SOFA functions. %% Regenerate everything after this from the prologues using SST by %% running "make palsun.tex". We do not build this automatically as %% there is no particular need for an SST dependency. %% Some manual tweaking is required after creating the SST tex. \sstroutine{ palAddet }{ Add the E-terms to a pre IAU 1976 mean place }{ \sstdescription{ Add the E-terms (elliptic component of annual aberration) to a pre IAU 1976 mean place to conform to the old catalogue convention. } \sstinvocation{ void palAddet ( double rm, double dm, double eq, double $*$rc, double $*$dc ); } \sstarguments{ \sstsubsection{ rm = double (Given) }{ RA without E-terms (radians) } \sstsubsection{ dm = double (Given) }{ Dec without E-terms (radians) } \sstsubsection{ eq = double (Given) }{ Besselian epoch of mean equator and equinox } \sstsubsection{ rc = double $*$ (Returned) }{ RA with E-terms included (radians) } \sstsubsection{ dc = double $*$ (Returned) }{ Dec with E-terms included (radians) } } \sstnotes{ Most star positions from pre-1984 optical catalogues (or derived from astrometry using such stars) embody the E-terms. If it is necessary to convert a formal mean place (for example a pulsar timing position) to one consistent with such a star catalogue, then the RA,Dec should be adjusted using this routine. } \sstdiytopic{ See Also }{ Explanatory Supplement to the Astronomical Ephemeris, section 2D, page 48. } } \sstroutine{ palAirmas }{ Air mass at given zenith distance }{ \sstdescription{ Calculates the airmass at the observed zenith distance. } \sstinvocation{ double palAirmas( double zd ); } \sstarguments{ \sstsubsection{ zd = double (Given) }{ Observed zenith distance (radians) } } \sstnotes{ \sstitemlist{ \sstitem The {\tt "}observed{\tt "} zenith distance referred to above means {\tt "}as affected by refraction{\tt "}. \sstitem Uses Hardie{\tt '}s (1962) polynomial fit to Bemporad{\tt '}s data for the relative air mass, X, in units of thickness at the zenith as tabulated by Schoenberg (1929). This is adequate for all normal needs as it is accurate to better than 0.1\% up to X = 6.8 and better than 1\% up to X = 10. Bemporad{\tt '}s tabulated values are unlikely to be trustworthy to such accuracy because of variations in density, pressure and other conditions in the atmosphere from those assumed in his work. \sstitem The sign of the ZD is ignored. \sstitem At zenith distances greater than about ZD = 87 degrees the air mass is held constant to avoid arithmetic overflows. } } \sstdiytopic{ See Also }{ \sstitemlist{ \sstitem Hardie, R.H., 1962, in {\tt "}Astronomical Techniques{\tt "} ed. W.A. Hiltner, University of Chicago Press, p180. \sstitem Schoenberg, E., 1929, Hdb. d. Ap., Berlin, Julius Springer, 2, 268. } } } \sstroutine{ palAmp }{ Convert star RA,Dec from geocentric apparaent to mean place }{ \sstdescription{ Convert star RA,Dec from geocentric apparent to mean place. The mean coordinate system is close to ICRS. See palAmpqk for details. } \sstinvocation{ void palAmp ( double ra, double da, double date, double eq, double $*$rm, double $*$dm ); } \sstarguments{ \sstsubsection{ ra = double (Given) }{ Apparent RA (radians) } \sstsubsection{ dec = double (Given) }{ Apparent Dec (radians) } \sstsubsection{ date = double (Given) }{ TDB for apparent place (JD-2400000.5) } \sstsubsection{ eq = double (Given) }{ Equinox: Julian epoch of mean place. } \sstsubsection{ rm = double $*$ (Returned) }{ Mean RA (radians) } \sstsubsection{ dm = double $*$ (Returned) }{ Mean Dec (radians) } } \sstnotes{ \sstitemlist{ \sstitem See palMappa and palAmpqk for details. } } } \sstroutine{ palAmpqk }{ Convert star RA,Dec from geocentric apparent to mean place }{ \sstdescription{ Convert star RA,Dec from geocentric apparent to mean place. The {\tt "}mean{\tt "} coordinate system is in fact close to ICRS. Use of this function is appropriate when efficiency is important and where many star positions are all to be transformed for one epoch and equinox. The star-independent parameters can be obtained by calling the palMappa function. } \sstinvocation{ void palAmpqk ( double ra, double da, double amprms[21], double $*$rm, double $*$dm ) } \sstarguments{ \sstsubsection{ ra = double (Given) }{ Apparent RA (radians). } \sstsubsection{ da = double (Given) }{ Apparent Dec (radians). } \sstsubsection{ amprms = double[21] (Given) }{ Star-independent mean-to-apparent parameters (see palMappa): (0) time interval for proper motion (Julian years) (1-3) barycentric position of the Earth (AU) (4-6) not used (7) not used (8-10) abv: barycentric Earth velocity in units of c (11) sqrt(1-v$*$v) where v=modulus(abv) (12-20) precession/nutation (3,3) matrix } \sstsubsection{ rm = double (Returned) }{ Mean RA (radians). } \sstsubsection{ dm = double (Returned) }{ Mean Dec (radians). } } } \sstroutine{ palAop }{ Apparent to observed place }{ \sstdescription{ Apparent to observed place for sources distant from the solar system. } \sstinvocation{ void palAop ( double rap, double dap, double date, double dut, double elongm, double phim, double hm, double xp, double yp, double tdk, double pmb, double rh, double wl, double tlr, double $*$aob, double $*$zob, double $*$hob, double $*$dob, double $*$rob ); } \sstarguments{ \sstsubsection{ rap = double (Given) }{ Geocentric apparent right ascension } \sstsubsection{ dap = double (Given) }{ Geocentirc apparent declination } \sstsubsection{ date = double (Given) }{ UTC date/time (Modified Julian Date, JD-2400000.5) } \sstsubsection{ dut = double (Given) }{ delta UT: UT1-UTC (UTC seconds) } \sstsubsection{ elongm = double (Given) }{ Mean longitude of the observer (radians, east $+$ve) } \sstsubsection{ phim = double (Given) }{ Mean geodetic latitude of the observer (radians) } \sstsubsection{ hm = double (Given) }{ Observer{\tt '}s height above sea level (metres) } \sstsubsection{ xp = double (Given) }{ Polar motion x-coordinates (radians) } \sstsubsection{ yp = double (Given) }{ Polar motion y-coordinates (radians) } \sstsubsection{ tdk = double (Given) }{ Local ambient temperature (K; std=273.15) } \sstsubsection{ pmb = double (Given) }{ Local atmospheric pressure (mb; std=1013.25) } \sstsubsection{ rh = double (Given) }{ Local relative humidity (in the range 0.0-1.0) } \sstsubsection{ wl = double (Given) }{ Effective wavelength (micron, e.g. 0.55) } \sstsubsection{ tlr = double (Given) }{ Tropospheric laps rate (K/metre, e.g. 0.0065) } \sstsubsection{ aob = double $*$ (Returned) }{ Observed azimuth (radians: N=0; E=90) } \sstsubsection{ zob = double $*$ (Returned) }{ Observed zenith distance (radians) } \sstsubsection{ hob = double $*$ (Returned) }{ Observed Hour Angle (radians) } \sstsubsection{ dob = double $*$ (Returned) }{ Observed Declination (radians) } \sstsubsection{ rob = double $*$ (Returned) }{ Observed Right Ascension (radians) } } \sstnotes{ \sstitemlist{ \sstitem This routine returns zenith distance rather than elevation in order to reflect the fact that no allowance is made for depression of the horizon. \sstitem The accuracy of the result is limited by the corrections for refraction. Providing the meteorological parameters are known accurately and there are no gross local effects, the predicted apparent RA,Dec should be within about 0.1 arcsec for a zenith distance of less than 70 degrees. Even at a topocentric zenith distance of 90 degrees, the accuracy in elevation should be better than 1 arcmin; useful results are available for a further 3 degrees, beyond which the palRefro routine returns a fixed value of the refraction. The complementary routines palAop (or palAopqk) and palOap (or palOapqk) are self-consistent to better than 1 micro- arcsecond all over the celestial sphere. \sstitem It is advisable to take great care with units, as even unlikely values of the input parameters are accepted and processed in accordance with the models used. \sstitem {\tt "}Apparent{\tt "} place means the geocentric apparent right ascension and declination, which is obtained from a catalogue mean place by allowing for space motion, parallax, precession, nutation, annual aberration, and the Sun{\tt '}s gravitational lens effect. For star positions in the FK5 system (i.e. J2000), these effects can be applied by means of the palMap etc routines. Starting from other mean place systems, additional transformations will be needed; for example, FK4 (i.e. B1950) mean places would first have to be converted to FK5, which can be done with the palFk425 etc routines. \sstitem {\tt "}Observed{\tt "} Az,El means the position that would be seen by a perfect theodolite located at the observer. This is obtained from the geocentric apparent RA,Dec by allowing for Earth orientation and diurnal aberration, rotating from equator to horizon coordinates, and then adjusting for refraction. The HA,Dec is obtained by rotating back into equatorial coordinates, using the geodetic latitude corrected for polar motion, and is the position that would be seen by a perfect equatorial located at the observer and with its polar axis aligned to the Earth{\tt '}s axis of rotation (n.b. not to the refracted pole). Finally, the RA is obtained by subtracting the HA from the local apparent ST. \sstitem To predict the required setting of a real telescope, the observed place produced by this routine would have to be adjusted for the tilt of the azimuth or polar axis of the mounting (with appropriate corrections for mount flexures), for non-perpendicularity between the mounting axes, for the position of the rotator axis and the pointing axis relative to it, for tube flexure, for gear and encoder errors, and finally for encoder zero points. Some telescopes would, of course, exhibit other properties which would need to be accounted for at the appropriate point in the sequence. \sstitem This routine takes time to execute, due mainly to the rigorous integration used to evaluate the refraction. For processing multiple stars for one location and time, call palAoppa once followed by one call per star to palAopqk. Where a range of times within a limited period of a few hours is involved, and the highest precision is not required, call palAoppa once, followed by a call to palAoppat each time the time changes, followed by one call per star to palAopqk. \sstitem The DATE argument is UTC expressed as an MJD. This is, strictly speaking, wrong, because of leap seconds. However, as long as the delta UT and the UTC are consistent there are no difficulties, except during a leap second. In this case, the start of the 61st second of the final minute should begin a new MJD day and the old pre-leap delta UT should continue to be used. As the 61st second completes, the MJD should revert to the start of the day as, simultaneously, the delta UTC changes by one second to its post-leap new value. \sstitem The delta UT (UT1-UTC) is tabulated in IERS circulars and elsewhere. It increases by exactly one second at the end of each UTC leap second, introduced in order to keep delta UT within $+$/- 0.9 seconds. \sstitem IMPORTANT -- TAKE CARE WITH THE LONGITUDE SIGN CONVENTION. The longitude required by the present routine is east-positive, in accordance with geographical convention (and right-handed). In particular, note that the longitudes returned by the palObs routine are west-positive, following astronomical usage, and must be reversed in sign before use in the present routine. \sstitem The polar coordinates XP,YP can be obtained from IERS circulars and equivalent publications. The maximum amplitude is about 0.3 arcseconds. If XP,YP values are unavailable, use XP=YP=0.0. See page B60 of the 1988 Astronomical Almanac for a definition of the two angles. \sstitem The height above sea level of the observing station, HM, can be obtained from the Astronomical Almanac (Section J in the 1988 edition), or via the routine palObs. If P, the pressure in millibars, is available, an adequate estimate of HM can be obtained from the expression } HM $\sim$ -29.3$*$TSL$*$LOG(P/1013.25). where TSL is the approximate sea-level air temperature in K (see Astrophysical Quantities, C.W.Allen, 3rd edition, section 52). Similarly, if the pressure P is not known, it can be estimated from the height of the observing station, HM, as follows: P $\sim$ 1013.25$*$EXP(-HM/(29.3$*$TSL)). Note, however, that the refraction is nearly proportional to the pressure and that an accurate P value is important for precise work. \sstitemlist{ \sstitem The azimuths etc produced by the present routine are with respect to the celestial pole. Corrections to the terrestrial pole can be computed using palPolmo. } } } \sstroutine{ palAoppa }{ Precompute apparent to observed place parameters }{ \sstdescription{ Precompute apparent to observed place parameters required by palAopqk and palOapqk. } \sstinvocation{ void palAoppa ( double date, double dut, double elongm, double phim, double hm, double xp, double yp, double tdk, double pmb, double rh, double wl, double tlr, double aoprms[14] ); } \sstarguments{ \sstsubsection{ date = double (Given) }{ UTC date/time (modified Julian Date, JD-2400000.5) } \sstsubsection{ dut = double (Given) }{ delta UT: UT1-UTC (UTC seconds) } \sstsubsection{ elongm = double (Given) }{ mean longitude of the observer (radians, east $+$ve) } \sstsubsection{ phim = double (Given) }{ mean geodetic latitude of the observer (radians) } \sstsubsection{ hm = double (Given) }{ observer{\tt '}s height above sea level (metres) } \sstsubsection{ xp = double (Given) }{ polar motion x-coordinate (radians) } \sstsubsection{ yp = double (Given) }{ polar motion y-coordinate (radians) } \sstsubsection{ tdk = double (Given) }{ local ambient temperature (K; std=273.15) } \sstsubsection{ pmb = double (Given) }{ local atmospheric pressure (mb; std=1013.25) } \sstsubsection{ rh = double (Given) }{ local relative humidity (in the range 0.0-1.0) } \sstsubsection{ wl = double (Given) }{ effective wavelength (micron, e.g. 0.55) } \sstsubsection{ tlr = double (Given) }{ tropospheric lapse rate (K/metre, e.g. 0.0065) } \sstsubsection{ aoprms = double [14] (Returned) }{ Star-independent apparent-to-observed parameters (0) geodetic latitude (radians) (1,2) sine and cosine of geodetic latitude (3) magnitude of diurnal aberration vector (4) height (hm) (5) ambient temperature (tdk) (6) pressure (pmb) (7) relative humidity (rh) (8) wavelength (wl) (9) lapse rate (tlr) (10,11) refraction constants A and B (radians) (12) longitude $+$ eqn of equinoxes $+$ sidereal DUT (radians) (13) local apparent sidereal time (radians) } } \sstnotes{ \sstitemlist{ \sstitem It is advisable to take great care with units, as even unlikely values of the input parameters are accepted and processed in accordance with the models used. \sstitem The DATE argument is UTC expressed as an MJD. This is, strictly speaking, improper, because of leap seconds. However, as long as the delta UT and the UTC are consistent there are no difficulties, except during a leap second. In this case, the start of the 61st second of the final minute should begin a new MJD day and the old pre-leap delta UT should continue to be used. As the 61st second completes, the MJD should revert to the start of the day as, simultaneously, the delta UTC changes by one second to its post-leap new value. \sstitem The delta UT (UT1-UTC) is tabulated in IERS circulars and elsewhere. It increases by exactly one second at the end of each UTC leap second, introduced in order to keep delta UT within $+$/- 0.9 seconds. \sstitem IMPORTANT -- TAKE CARE WITH THE LONGITUDE SIGN CONVENTION. The longitude required by the present routine is east-positive, in accordance with geographical convention (and right-handed). In particular, note that the longitudes returned by the palObs routine are west-positive, following astronomical usage, and must be reversed in sign before use in the present routine. \sstitem The polar coordinates XP,YP can be obtained from IERS circulars and equivalent publications. The maximum amplitude is about 0.3 arcseconds. If XP,YP values are unavailable, use XP=YP=0.0. See page B60 of the 1988 Astronomical Almanac for a definition of the two angles. \sstitem The height above sea level of the observing station, HM, can be obtained from the Astronomical Almanac (Section J in the 1988 edition), or via the routine palObs. If P, the pressure in millibars, is available, an adequate estimate of HM can be obtained from the expression } HM $\sim$ -29.3$*$TSL$*$log(P/1013.25). where TSL is the approximate sea-level air temperature in K (see Astrophysical Quantities, C.W.Allen, 3rd edition, section 52). Similarly, if the pressure P is not known, it can be estimated from the height of the observing station, HM, as follows: P $\sim$ 1013.25$*$exp(-HM/(29.3$*$TSL)). Note, however, that the refraction is nearly proportional to the pressure and that an accurate P value is important for precise work. \sstitemlist{ \sstitem Repeated, computationally-expensive, calls to palAoppa for times that are very close together can be avoided by calling palAoppa just once and then using palAoppat for the subsequent times. Fresh calls to palAoppa will be needed only when changes in the precession have grown to unacceptable levels or when anything affecting the refraction has changed. } } } \sstroutine{ palAoppat }{ Recompute sidereal time to support apparent to observed place }{ \sstdescription{ This routine recomputes the sidereal time in the apparent to observed place star-independent parameter block. } \sstinvocation{ void palAoppat( double date, double aoprms[14] ); } \sstarguments{ \sstsubsection{ date = double (Given) }{ UTC date/time (modified Julian Date, JD-2400000.5) (see palAoppa description for comments on leap seconds) } \sstsubsection{ aoprms = double[14] (Given \& Returned) }{ Star-independent apparent-to-observed parameters. Updated by this routine. Requires element 12 to be the longitude $+$ eqn of equinoxes $+$ sidereal DUT and fills in element 13 with the local apparent sidereal time (in radians). } } \sstnotes{ \sstitemlist{ \sstitem See palAoppa for more information. \sstitem The star-independent parameters are not treated as an opaque struct in order to retain compatibility with SLA. } } } \sstroutine{ palAopqk }{ Quick apparent to observed place }{ \sstdescription{ Quick apparent to observed place. } \sstinvocation{ void palAopqk ( double rap, double dap, const double aoprms[14], double $*$aob, double $*$zob, double $*$hob, double $*$dob, double $*$rob ); } \sstarguments{ \sstsubsection{ rap = double (Given) }{ Geocentric apparent right ascension } \sstsubsection{ dap = double (Given) }{ Geocentric apparent declination } \sstsubsection{ aoprms = const double [14] (Given) }{ Star-independent apparent-to-observed parameters. [0] geodetic latitude (radians) [1,2] sine and cosine of geodetic latitude [3] magnitude of diurnal aberration vector [4] height (HM) [5] ambient temperature (T) [6] pressure (P) [7] relative humidity (RH) [8] wavelength (WL) [9] lapse rate (TLR) [10,11] refraction constants A and B (radians) [12] longitude $+$ eqn of equinoxes $+$ sidereal DUT (radians) [13] local apparent sidereal time (radians) } \sstsubsection{ aob = double $*$ (Returned) }{ Observed azimuth (radians: N=0,E=90) } \sstsubsection{ zob = double $*$ (Returned) }{ Observed zenith distance (radians) } \sstsubsection{ hob = double $*$ (Returned) }{ Observed Hour Angle (radians) } \sstsubsection{ dob = double $*$ (Returned) }{ Observed Declination (radians) } \sstsubsection{ rob = double $*$ (Returned) }{ Observed Right Ascension (radians) } } \sstnotes{ \sstitemlist{ \sstitem This routine returns zenith distance rather than elevation in order to reflect the fact that no allowance is made for depression of the horizon. \sstitem The accuracy of the result is limited by the corrections for refraction. Providing the meteorological parameters are known accurately and there are no gross local effects, the observed RA,Dec predicted by this routine should be within about 0.1 arcsec for a zenith distance of less than 70 degrees. Even at a topocentric zenith distance of 90 degrees, the accuracy in elevation should be better than 1 arcmin; useful results are available for a further 3 degrees, beyond which the palRefro routine returns a fixed value of the refraction. The complementary routines palAop (or palAopqk) and palOap (or palOapqk) are self-consistent to better than 1 micro- arcsecond all over the celestial sphere. \sstitem It is advisable to take great care with units, as even unlikely values of the input parameters are accepted and processed in accordance with the models used. \sstitem {\tt "}Apparent{\tt "} place means the geocentric apparent right ascension and declination, which is obtained from a catalogue mean place by allowing for space motion, parallax, precession, nutation, annual aberration, and the Sun{\tt '}s gravitational lens effect. For star positions in the FK5 system (i.e. J2000), these effects can be applied by means of the palMap etc routines. Starting from other mean place systems, additional transformations will be needed; for example, FK4 (i.e. B1950) mean places would first have to be converted to FK5, which can be done with the palFk425 etc routines. \sstitem {\tt "}Observed{\tt "} Az,El means the position that would be seen by a perfect theodolite located at the observer. This is obtained from the geocentric apparent RA,Dec by allowing for Earth orientation and diurnal aberration, rotating from equator to horizon coordinates, and then adjusting for refraction. The HA,Dec is obtained by rotating back into equatorial coordinates, using the geodetic latitude corrected for polar motion, and is the position that would be seen by a perfect equatorial located at the observer and with its polar axis aligned to the Earth{\tt '}s axis of rotation (n.b. not to the refracted pole). Finally, the RA is obtained by subtracting the HA from the local apparent ST. \sstitem To predict the required setting of a real telescope, the observed place produced by this routine would have to be adjusted for the tilt of the azimuth or polar axis of the mounting (with appropriate corrections for mount flexures), for non-perpendicularity between the mounting axes, for the position of the rotator axis and the pointing axis relative to it, for tube flexure, for gear and encoder errors, and finally for encoder zero points. Some telescopes would, of course, exhibit other properties which would need to be accounted for at the appropriate point in the sequence. \sstitem The star-independent apparent-to-observed-place parameters in AOPRMS may be computed by means of the palAoppa routine. If nothing has changed significantly except the time, the palAoppat routine may be used to perform the requisite partial recomputation of AOPRMS. \sstitem At zenith distances beyond about 76 degrees, the need for special care with the corrections for refraction causes a marked increase in execution time. Moreover, the effect gets worse with increasing zenith distance. Adroit programming in the calling application may allow the problem to be reduced. Prepare an alternative AOPRMS array, computed for zero air-pressure; this will disable the refraction corrections and cause rapid execution. Using this AOPRMS array, a preliminary call to the present routine will, depending on the application, produce a rough position which may be enough to establish whether the full, slow calculation (using the real AOPRMS array) is worthwhile. For example, there would be no need for the full calculation if the preliminary call had already established that the source was well below the elevation limits for a particular telescope. \sstitem The azimuths etc produced by the present routine are with respect to the celestial pole. Corrections to the terrestrial pole can be computed using palPolmo. } } } \sstroutine{ palAtmdsp }{ Apply atmospheric-dispersion adjustments to refraction coefficients }{ \sstdescription{ Apply atmospheric-dispersion adjustments to refraction coefficients. } \sstinvocation{ void palAtmdsp( double tdk, double pmb, double rh, double wl1, double a1, double b1, double wl2, double $*$a2, double $*$b2 ); } \sstarguments{ \sstsubsection{ tdk = double (Given) }{ Ambient temperature, K } \sstsubsection{ pmb = double (Given) }{ Ambient pressure, millibars } \sstsubsection{ rh = double (Given) }{ Ambient relative humidity, 0-1 } \sstsubsection{ wl1 = double (Given) }{ Reference wavelength, micrometre (0.4 recommended) } \sstsubsection{ a1 = double (Given) }{ Refraction coefficient A for wavelength wl1 (radians) } \sstsubsection{ b1 = double (Given) }{ Refraction coefficient B for wavelength wl1 (radians) } \sstsubsection{ wl2 = double (Given) }{ Wavelength for which adjusted A,B required } \sstsubsection{ a2 = double $*$ (Returned) }{ Refraction coefficient A for wavelength WL2 (radians) } \sstsubsection{ b2 = double $*$ (Returned) }{ Refraction coefficient B for wavelength WL2 (radians) } } \sstnotes{ \sstitemlist{ \sstitem To use this routine, first call palRefco specifying WL1 as the wavelength. This yields refraction coefficients A1,B1, correct for that wavelength. Subsequently, calls to palAtmdsp specifying different wavelengths will produce new, slightly adjusted refraction coefficients which apply to the specified wavelength. \sstitem Most of the atmospheric dispersion happens between 0.7 micrometre and the UV atmospheric cutoff, and the effect increases strongly towards the UV end. For this reason a blue reference wavelength is recommended, for example 0.4 micrometres. \sstitem The accuracy, for this set of conditions: } height above sea level 2000 m latitude 29 deg pressure 793 mb temperature 17 degC humidity 50\% lapse rate 0.0065 degC/m reference wavelength 0.4 micrometre star elevation 15 deg is about 2.5 mas RMS between 0.3 and 1.0 micrometres, and stays within 4 mas for the whole range longward of 0.3 micrometres (compared with a total dispersion from 0.3 to 20.0 micrometres of about 11 arcsec). These errors are typical for ordinary conditions and the given elevation; in extreme conditions values a few times this size may occur, while at higher elevations the errors become much smaller. \sstitemlist{ \sstitem If either wavelength exceeds 100 micrometres, the radio case is assumed and the returned refraction coefficients are the same as the given ones. Note that radio refraction coefficients cannot be turned into optical values using this routine, nor vice versa. \sstitem The algorithm consists of calculation of the refractivity of the air at the observer for the two wavelengths, using the methods of the palRefro routine, and then scaling of the two refraction coefficients according to classical refraction theory. This amounts to scaling the A coefficient in proportion to (n-1) and the B coefficient almost in the same ratio (see R.M.Green, {\tt "}Spherical Astronomy{\tt "}, Cambridge University Press, 1985). } } } \sstroutine{ palCaldj }{ Gregorian Calendar to Modified Julian Date }{ \sstdescription{ Modified Julian Date to Gregorian Calendar with special behaviour for 2-digit years relating to 1950 to 2049. } \sstinvocation{ void palCaldj ( int iy, int im, int id, double $*$djm, int $*$j ); } \sstarguments{ \sstsubsection{ iy = int (Given) }{ Year in the Gregorian calendar } \sstsubsection{ im = int (Given) }{ Month in the Gergorian calendar } \sstsubsection{ id = int (Given) }{ Day in the Gregorian calendar } \sstsubsection{ djm = double $*$ (Returned) }{ Modified Julian Date (JD-2400000.5) for 0 hrs } \sstsubsection{ j = status (Returned) }{ 0 = OK. See eraCal2jd for other values. } } \sstnotes{ \sstitemlist{ \sstitem Uses eraCal2jd \sstitem Unlike eraCal2jd this routine treats the years 0-100 as referring to the end of the 20th Century and beginning of the 21st Century. If this behaviour is not acceptable use the SOFA/ERFA routine directly or palCldj. Acceptable years are 00-49, interpreted as 2000-2049, 50-99, {\tt "} {\tt "} 1950-1999, all others, interpreted literally. \sstitem Unlike SLA this routine will work with negative years. } } } \sstroutine{ palDafin }{ Sexagesimal character string to angle }{ \sstdescription{ Extracts an angle from a sexagesimal string with degrees, arcmin, arcsec fields using space or comma delimiters. } \sstinvocation{ void palDafin ( const char $*$string, int $*$ipos, double $*$a, int $*$j ); } \sstarguments{ \sstsubsection{ string = const char $*$ (Given) }{ String containing deg, arcmin, arcsec fields } \sstsubsection{ ipos = int $*$ (Given \& Returned) }{ Position to start decoding {\tt "}string{\tt "}. First character is position 1 for compatibility with SLA. After calling this routine {\tt "}iptr{\tt "} will be positioned after the sexagesimal string. } \sstsubsection{ a = double $*$ (Returned) }{ Angle in radians. } \sstsubsection{ j = int $*$ (Returned) }{ status: 0 = OK $+$1 = default, A unchanged \sstitemlist{ \sstitem 1 = bad degrees ) \sstitem 2 = bad arcminutes ) (note 3) \sstitem 3 = bad arcseconds ) } } } \sstnotes{ \sstitemlist{ \sstitem The first three {\tt "}fields{\tt "} in STRING are degrees, arcminutes, arcseconds, separated by spaces or commas. The degrees field may be signed, but not the others. The decoding is carried out by the palDfltin routine and is free-format. \sstitem Successive fields may be absent, defaulting to zero. For zero status, the only combinations allowed are degrees alone, degrees and arcminutes, and all three fields present. If all three fields are omitted, a status of $+$1 is returned and A is unchanged. In all other cases A is changed. \sstitem Range checking: } The degrees field is not range checked. However, it is expected to be integral unless the other two fields are absent. The arcminutes field is expected to be 0-59, and integral if the arcseconds field is present. If the arcseconds field is absent, the arcminutes is expected to be 0-59.9999... The arcseconds field is expected to be 0-59.9999... \sstitemlist{ \sstitem Decoding continues even when a check has failed. Under these circumstances the field takes the supplied value, defaulting to zero, and the result A is computed and returned. \sstitem Further fields after the three expected ones are not treated as an error. The pointer IPOS is left in the correct state for further decoding with the present routine or with palDfltin etc. See the example, above. \sstitem If STRING contains hours, minutes, seconds instead of degrees etc, or if the required units are turns (or days) instead of radians, the result A should be multiplied as follows: } for to obtain multiply STRING A in A by d {\tt '} {\tt "} radians 1 = 1.0 d {\tt '} {\tt "} turns 1/2pi = 0.1591549430918953358 h m s radians 15 = 15.0 h m s days 15/2pi = 2.3873241463784300365 } \sstdiytopic{ Example }{ argument before after STRING {\tt '}-57 17 44.806 12 34 56.7{\tt '} unchanged IPTR 1 16 (points to 12...) A ? -1.00000D0 J ? 0 } } \sstroutine{ palDe2h }{ Equatorial to horizon coordinates: HA,Dec to Az,E }{ \sstdescription{ Convert equatorial to horizon coordinates. } \sstinvocation{ palDe2h( double ha, double dec, double phi, double $*$ az, double $*$ el ); } \sstarguments{ \sstsubsection{ ha = double $*$ (Given) }{ Hour angle (radians) } \sstsubsection{ dec = double $*$ (Given) }{ Declination (radians) } \sstsubsection{ phi = double (Given) }{ Observatory latitude (radians) } \sstsubsection{ az = double $*$ (Returned) }{ Azimuth (radians) } \sstsubsection{ el = double $*$ (Returned) }{ Elevation (radians) } } \sstnotes{ \sstitemlist{ \sstitem All the arguments are angles in radians. \sstitem Azimuth is returned in the range 0-2pi; north is zero, and east is $+$pi/2. Elevation is returned in the range $+$/-pi/2. \sstitem The latitude must be geodetic. In critical applications, corrections for polar motion should be applied. \sstitem In some applications it will be important to specify the correct type of hour angle and declination in order to produce the required type of azimuth and elevation. In particular, it may be important to distinguish between elevation as affected by refraction, which would require the {\tt "}observed{\tt "} HA,Dec, and the elevation in vacuo, which would require the {\tt "}topocentric{\tt "} HA,Dec. If the effects of diurnal aberration can be neglected, the {\tt "}apparent{\tt "} HA,Dec may be used instead of the topocentric HA,Dec. \sstitem No range checking of arguments is carried out. \sstitem In applications which involve many such calculations, rather than calling the present routine it will be more efficient to use inline code, having previously computed fixed terms such as sine and cosine of latitude, and (for tracking a star) sine and cosine of declination. } } } \sstroutine{ palDeuler }{ Form a rotation matrix from the Euler angles }{ \sstdescription{ A rotation is positive when the reference frame rotates anticlockwise as seen looking towards the origin from the positive region of the specified axis. The characters of ORDER define which axes the three successive rotations are about. A typical value is {\tt '}ZXZ{\tt '}, indicating that RMAT is to become the direction cosine matrix corresponding to rotations of the reference frame through PHI radians about the old Z-axis, followed by THETA radians about the resulting X-axis, then PSI radians about the resulting Z-axis. The axis names can be any of the following, in any order or combination: X, Y, Z, uppercase or lowercase, 1, 2, 3. Normal axis labelling/numbering conventions apply; the xyz (=123) triad is right-handed. Thus, the {\tt '}ZXZ{\tt '} example given above could be written {\tt '}zxz{\tt '} or {\tt '}313{\tt '} (or even {\tt '}ZxZ{\tt '} or {\tt '}3xZ{\tt '}). ORDER is terminated by length or by the first unrecognized character. Fewer than three rotations are acceptable, in which case the later angle arguments are ignored. If all rotations are zero, the identity matrix is produced. } \sstinvocation{ void palDeuler ( const char $*$order, double phi, double theta, double psi, double rmat[3][3] ); } \sstarguments{ \sstsubsection{ order = const char[] (Given) }{ Specifies about which axes the rotation occurs } \sstsubsection{ phi = double (Given) }{ 1st rotation (radians) } \sstsubsection{ theta = double (Given) }{ 2nd rotation (radians) } \sstsubsection{ psi = double (Given) }{ 3rd rotation (radians) } \sstsubsection{ rmat = double[3][3] (Given \& Returned) }{ Rotation matrix } } } \sstroutine{ palDfltin }{ Convert free-format input into double precision floating point }{ \sstdescription{ Extracts a number from an input string starting at the specified index. } \sstinvocation{ void palDfltin( const char $*$ string, int $*$nstrt, double $*$dreslt, int $*$jflag ); } \sstarguments{ \sstsubsection{ string = const char $*$ (Given) }{ String containing number to be decoded. } \sstsubsection{ nstrt = int $*$ (Given and Returned) }{ Character number indicating where decoding should start. On output its value is updated to be the location of the possible next value. For compatibility with SLA the first character is index 1. } \sstsubsection{ dreslt = double $*$ (Returned) }{ Result. Not updated when jflag=1. } \sstsubsection{ jflag = int $*$ (Returned) }{ status: -1 = -OK, 0 = $+$OK, 1 = null, 2 = error } } \sstnotes{ \sstitemlist{ \sstitem Uses the strtod() system call to do the parsing. This may lead to subtle differences when compared to the SLA/F parsing. \sstitem All {\tt "}D{\tt "} characters are converted to {\tt "}E{\tt "} to handle fortran exponents. \sstitem Commas are recognized as a special case and are skipped if one happens to be the next character when updating nstrt. Additionally the output nstrt position will skip past any trailing space. \sstitem If no number can be found flag will be set to 1. \sstitem If the number overflows or underflows jflag will be set to 2. For overflow the returned result will have the value HUGE\_VAL, for underflow it will have the value 0.0. \sstitem For compatiblity with SLA/F -0 will be returned as {\tt "}0{\tt "} with jflag == -1. \sstitem Unlike slaDfltin a standalone {\tt "}E{\tt "} will return status 1 (could not find a number) rather than 2 (bad number). } } \sstimplementationstatus{ \sstitemlist{ \sstitem The code is more robust if the C99 copysign() function is available. This can recognize the -0.0 values returned by strtod. If copysign() is missing we try to scan the string looking for minus signs. } } } \sstroutine{ palDh2e }{ Horizon to equatorial coordinates: Az,El to HA,Dec }{ \sstdescription{ Convert horizon to equatorial coordinates. } \sstinvocation{ palDh2e( double az, double el, double phi, double $*$ ha, double $*$ dec ); } \sstarguments{ \sstsubsection{ az = double (Given) }{ Azimuth (radians) } \sstsubsection{ el = double (Given) }{ Elevation (radians) } \sstsubsection{ phi = double (Given) }{ Observatory latitude (radians) } \sstsubsection{ ha = double $*$ (Returned) }{ Hour angle (radians) } \sstsubsection{ dec = double $*$ (Returned) }{ Declination (radians) } } \sstnotes{ \sstitemlist{ \sstitem All the arguments are angles in radians. \sstitem The sign convention for azimuth is north zero, east $+$pi/2. \sstitem HA is returned in the range $+$/-pi. Declination is returned in the range $+$/-pi/2. \sstitem The latitude is (in principle) geodetic. In critical applications, corrections for polar motion should be applied. \sstitem In some applications it will be important to specify the correct type of elevation in order to produce the required type of HA,Dec. In particular, it may be important to distinguish between the elevation as affected by refraction, which will yield the {\tt "}observed{\tt "} HA,Dec, and the elevation in vacuo, which will yield the {\tt "}topocentric{\tt "} HA,Dec. If the effects of diurnal aberration can be neglected, the topocentric HA,Dec may be used as an approximation to the {\tt "}apparent{\tt "} HA,Dec. \sstitem No range checking of arguments is done. \sstitem In applications which involve many such calculations, rather than calling the present routine it will be more efficient to use inline code, having previously computed fixed terms such as sine and cosine of latitude. } } } \sstroutine{ palDjcal }{ Modified Julian Date to Gregorian Calendar }{ \sstdescription{ Modified Julian Date to Gregorian Calendar, expressed in a form convenient for formatting messages (namely rounded to a specified precision, and with the fields stored in a single array) } \sstinvocation{ void palDjcal ( int ndp, double djm, int iymdf[4], int $*$j ); } \sstarguments{ \sstsubsection{ ndp = int (Given) }{ Number of decimal places of days in fraction. } \sstsubsection{ djm = double (Given) }{ Modified Julian Date (JD-2400000.5) } \sstsubsection{ iymdf[4] = int[] (Returned) }{ Year, month, day, fraction in Gregorian calendar. } \sstsubsection{ j = status (Returned) }{ 0 = OK. See eraJd2cal for other values. } } \sstnotes{ \sstitemlist{ \sstitem Uses eraJd2cal } } } \sstroutine{ palDmat }{ Matrix inversion \& solution of simultaneous equations }{ \sstdescription{ Matrix inversion \& solution of simultaneous equations For the set of n simultaneous equations in n unknowns: A.Y = X this routine calculates the inverse of A, the determinant of matrix A and the vector of N unknowns. } \sstinvocation{ void palDmat( int n, double $*$a, double $*$y, double $*$d, int $*$jf, int $*$iw ); } \sstarguments{ \sstsubsection{ n = int (Given) }{ Number of simultaneous equations and number of unknowns. } \sstsubsection{ a = double[] (Given \& Returned) }{ A non-singular NxN matrix (implemented as a contiguous block of memory). After calling this routine {\tt "}a{\tt "} contains the inverse of the matrix. } \sstsubsection{ y = double[] (Given \& Returned) }{ On input the vector of N knowns. On exit this vector contains the N solutions. } \sstsubsection{ d = double $*$ (Returned) }{ The determinant. } \sstsubsection{ jf = int $*$ (Returned) }{ The singularity flag. If the matrix is non-singular, jf=0 is returned. If the matrix is singular, jf=-1 \& d=0.0 are returned. In the latter case, the contents of array {\tt "}a{\tt "} on return are undefined. } \sstsubsection{ iw = int[] (Given) }{ Integer workspace of size N. } } \sstnotes{ \sstitemlist{ \sstitem Implemented using Gaussian elimination with partial pivoting. \sstitem Optimized for speed rather than accuracy with errors 1 to 4 times those of routines optimized for accuracy. } } } \sstroutine{ palDs2tp }{ Spherical to tangent plane projection }{ \sstdescription{ Projection of spherical coordinates onto tangent plane: {\tt "}gnomonic{\tt "} projection - {\tt "}standard coordinates{\tt "} } \sstinvocation{ palDs2tp( double ra, double dec, double raz, double decz, double $*$xi, double $*$eta, int $*$j ); } \sstarguments{ \sstsubsection{ ra = double (Given) }{ RA spherical coordinate of point to be projected (radians) } \sstsubsection{ dec = double (Given) }{ Dec spherical coordinate of point to be projected (radians) } \sstsubsection{ raz = double (Given) }{ RA spherical coordinate of tangent point (radians) } \sstsubsection{ decz = double (Given) }{ Dec spherical coordinate of tangent point (radians) } \sstsubsection{ xi = double $*$ (Returned) }{ First rectangular coordinate on tangent plane (radians) } \sstsubsection{ eta = double $*$ (Returned) }{ Second rectangular coordinate on tangent plane (radians) } \sstsubsection{ j = int $*$ (Returned) }{ status: 0 = OK, star on tangent plane 1 = error, star too far from axis 2 = error, antistar on tangent plane 3 = error, antistar too far from axis } } } \sstroutine{ palDat }{ Return offset between UTC and TAI }{ \sstdescription{ Increment to be applied to Coordinated Universal Time UTC to give International Atomic Time (TAI). } \sstinvocation{ dat = palDat( double utc ); } \sstarguments{ \sstsubsection{ utc = double (Given) }{ UTC date as a modified JD (JD-2400000.5) } } \sstreturnedvalue{ \sstsubsection{ dat = double }{ TAI-UTC in seconds } } \sstnotes{ \sstitemlist{ \sstitem This routine converts the MJD argument to calendar date before calling the SOFA/ERFA eraDat function. \sstitem This routine matches the slaDat interface which differs from the eraDat interface. Consider coding directly to the SOFA/ERFA interface. \sstitem See eraDat for a description of error conditions when calling this function with a time outside of the UTC range. \sstitem The status argument from eraDat is ignored. This is reasonable since the error codes are mainly related to incorrect calendar dates when calculating the JD internally. } } } \sstroutine{ palDmoon }{ Approximate geocentric position and velocity of the Moon }{ \sstdescription{ Calculate the approximate geocentric position of the Moon using a full implementation of the algorithm published by Meeus (l{\tt '}Astronomie, June 1984, p348). } \sstinvocation{ void palDmoon( double date, double pv[6] ); } \sstarguments{ \sstsubsection{ date = double (Given) }{ TDB as a Modified Julian Date (JD-2400000.5) } \sstsubsection{ pv = double [6] (Returned) }{ Moon x,y,z,xdot,ydot,zdot, mean equator and equinox of date (AU, AU/s) } } \sstnotes{ \sstitemlist{ \sstitem Meeus quotes accuracies of 10 arcsec in longitude, 3 arcsec in latitude and 0.2 arcsec in HP (equivalent to about 20 km in distance). Comparison with JPL DE200 over the interval 1960-2025 gives RMS errors of 3.7 arcsec and 83 mas/hour in longitude, 2.3 arcsec and 48 mas/hour in latitude, 11 km and 81 mm/s in distance. The maximum errors over the same interval are 18 arcsec and 0.50 arcsec/hour in longitude, 11 arcsec and 0.24 arcsec/hour in latitude, 40 km and 0.29 m/s in distance. \sstitem The original algorithm is expressed in terms of the obsolete timescale Ephemeris Time. Either TDB or TT can be used, but not UT without incurring significant errors (30 arcsec at the present time) due to the Moon{\tt '}s 0.5 arcsec/sec movement. \sstitem The algorithm is based on pre IAU 1976 standards. However, the result has been moved onto the new (FK5) equinox, an adjustment which is in any case much smaller than the intrinsic accuracy of the procedure. \sstitem Velocity is obtained by a complete analytical differentiation of the Meeus model. } } } \sstroutine{ palDrange }{ Normalize angle into range $+$/- pi }{ \sstdescription{ The result is {\tt "}angle{\tt "} expressed in the range $+$/- pi. If the supplied value for {\tt "}angle{\tt "} is equal to $+$/- pi, it is returned unchanged. } \sstinvocation{ palDrange( double angle ) } \sstarguments{ \sstsubsection{ angle = double (Given) }{ The angle in radians. } } } \sstroutine{ palDt }{ Estimate the offset between dynamical time and UT }{ \sstdescription{ Estimate the offset between dynamical time and Universal Time for a given historical epoch. } \sstinvocation{ double palDt( double epoch ); } \sstarguments{ \sstsubsection{ epoch = double (Given) }{ Julian epoch (e.g. 1850.0) } } \sstreturnedvalue{ \sstsubsection{ palDt = double }{ Rough estimate of ET-UT (after 1984, TT-UT) at the given epoch, in seconds. } } \sstnotes{ \sstitemlist{ \sstitem Depending on the epoch, one of three parabolic approximations is used: } before 979 Stephenson \& Morrison{\tt '}s 390 BC to AD 948 model 979 to 1708 Stephenson \& Morrison{\tt '}s 948 to 1600 model after 1708 McCarthy \& Babcock{\tt '}s post-1650 model The breakpoints are chosen to ensure continuity: they occur at places where the adjacent models give the same answer as each other. \sstitemlist{ \sstitem The accuracy is modest, with errors of up to 20 sec during the interval since 1650, rising to perhaps 30 min by 1000 BC. Comparatively accurate values from AD 1600 are tabulated in the Astronomical Almanac (see section K8 of the 1995 AA). \sstitem The use of double-precision for both argument and result is purely for compatibility with other SLALIB time routines. \sstitem The models used are based on a lunar tidal acceleration value of -26.00 arcsec per century. } } \sstdiytopic{ See Also }{ Explanatory Supplement to the Astronomical Almanac, ed P.K.Seidelmann, University Science Books (1992), section 2.553, p83. This contains references to the Stephenson \& Morrison and McCarthy \& Babcock papers. } } \sstroutine{ palDtp2s }{ Tangent plane to spherical coordinates }{ \sstdescription{ Transform tangent plane coordinates into spherical. } \sstinvocation{ palDtp2s( double xi, double eta, double raz, double decz, double $*$ra, double $*$dec); } \sstarguments{ \sstsubsection{ xi = double (Given) }{ First rectangular coordinate on tangent plane (radians) } \sstsubsection{ eta = double (Given) }{ Second rectangular coordinate on tangent plane (radians) } \sstsubsection{ raz = double (Given) }{ RA spherical coordinate of tangent point (radians) } \sstsubsection{ decz = double (Given) }{ Dec spherical coordinate of tangent point (radians) } \sstsubsection{ ra = double $*$ (Returned) }{ RA spherical coordinate of point to be projected (radians) } \sstsubsection{ dec = double $*$ (Returned) }{ Dec spherical coordinate of point to be projected (radians) } } } \sstroutine{ palDtps2c }{ Determine RA,Dec of tangent point from coordinates }{ \sstdescription{ From the tangent plane coordinates of a star of known RA,Dec, determine the RA,Dec of the tangent point. } \sstinvocation{ palDtps2c( double xi, double eta, double ra, double dec, double $*$ raz1, double decz1, double $*$ raz2, double decz2, int $*$n); } \sstarguments{ \sstsubsection{ xi = double (Given) }{ First rectangular coordinate on tangent plane (radians) } \sstsubsection{ eta = double (Given) }{ Second rectangular coordinate on tangent plane (radians) } \sstsubsection{ ra = double (Given) }{ RA spherical coordinate of star (radians) } \sstsubsection{ dec = double (Given) }{ Dec spherical coordinate of star (radians) } \sstsubsection{ raz1 = double $*$ (Returned) }{ RA spherical coordinate of tangent point, solution 1 (radians) } \sstsubsection{ decz1 = double $*$ (Returned) }{ Dec spherical coordinate of tangent point, solution 1 (radians) } \sstsubsection{ raz2 = double $*$ (Returned) }{ RA spherical coordinate of tangent point, solution 2 (radians) } \sstsubsection{ decz2 = double $*$ (Returned) }{ Dec spherical coordinate of tangent point, solution 2 (radians) } \sstsubsection{ n = int $*$ (Returned) }{ number of solutions: 0 = no solutions returned (note 2) 1 = only the first solution is useful (note 3) 2 = both solutions are useful (note 3) } } \sstnotes{ \sstitemlist{ \sstitem The RAZ1 and RAZ2 values are returned in the range 0-2pi. \sstitem Cases where there is no solution can only arise near the poles. For example, it is clearly impossible for a star at the pole itself to have a non-zero XI value, and hence it is meaningless to ask where the tangent point would have to be to bring about this combination of XI and DEC. \sstitem Also near the poles, cases can arise where there are two useful solutions. The argument N indicates whether the second of the two solutions returned is useful. N=1 indicates only one useful solution, the usual case; under these circumstances, the second solution corresponds to the {\tt "}over-the-pole{\tt "} case, and this is reflected in the values of RAZ2 and DECZ2 which are returned. \sstitem The DECZ1 and DECZ2 values are returned in the range $+$/-pi, but in the usual, non-pole-crossing, case, the range is $+$/-pi/2. \sstitem This routine is the spherical equivalent of the routine sla\_DTPV2C. } } } \sstroutine{ palDtt }{ Return offset between UTC and TT }{ \sstdescription{ Increment to be applied to Coordinated Universal Time UTC to give Terrestrial Time TT (formerly Ephemeris Time ET) } \sstinvocation{ dtt = palDtt( double utc ); } \sstarguments{ \sstsubsection{ utc = double (Given) }{ UTC date as a modified JD (JD-2400000.5) } } \sstreturnedvalue{ \sstsubsection{ dtt = double }{ TT-UTC in seconds } } \sstnotes{ \sstitemlist{ \sstitem Consider a comprehensive upgrade to use the time transformations in SOFA{\tt '}s time cookbook: http://www.iausofa.org/sofa\_ts\_c.pdf. \sstitem See eraDat for a description of error conditions when calling this function with a time outside of the UTC range. This behaviour differs from slaDtt. } } } \sstroutine{ palEcleq }{ Transform from ecliptic coordinates to J2000.0 equatorial coordinates }{ \sstdescription{ Transform from ecliptic coordinate to J2000.0 equatorial coordinates. } \sstinvocation{ void palEcleq ( double dl, double db, double date, double $*$dr, double $*$dd ); } \sstarguments{ \sstsubsection{ dl = double (Given) }{ Ecliptic longitude (mean of date, IAU 1980 theory, radians) } \sstsubsection{ db = double (Given) }{ Ecliptic latitude (mean of date, IAU 1980 theory, radians) } \sstsubsection{ date = double (Given) }{ TT as Modified Julian Date (JD-2400000.5). The difference between TT and TDB is of the order of a millisecond or two (i.e. about 0.02 arc-seconds). } \sstsubsection{ dr = double $*$ (Returned) }{ J2000.0 mean RA (radians) } \sstsubsection{ dd = double $*$ (Returned) }{ J2000.0 mean Dec (Radians) } } } \sstroutine{ palEcmat }{ Form the equatorial to ecliptic rotation matrix - IAU 2006 precession model }{ \sstdescription{ The equatorial to ecliptic rotation matrix is found and returned. The matrix is in the sense V(ecl) = RMAT $*$ V(equ); the equator, equinox and ecliptic are mean of date. } \sstinvocation{ palEcmat( double date, double rmat[3][3] ) } \sstarguments{ \sstsubsection{ date = double (Given) }{ TT as Modified Julian Date (JD-2400000.5). The difference between TT and TDB is of the order of a millisecond or two (i.e. about 0.02 arc-seconds). } \sstsubsection{ rmat = double[3][3] (Returned) }{ Rotation matrix } } } \sstroutine{ palEl2ue }{ Transform conventional elements into {\tt "}universal{\tt "} form }{ \sstdescription{ Transform conventional osculating elements into {\tt "}universal{\tt "} form. } \sstinvocation{ void palEl2ue ( double date, int jform, double epoch, double orbinc, double anode, double perih, double aorq, double e, double aorl, double dm, double u[13], int $*$jstat ); } \sstarguments{ \sstsubsection{ date = double (Given) }{ Epoch (TT MJD) of osculation (Note 3) } \sstsubsection{ jform = int (Given) }{ Element set actually returned (1-3; Note 6) } \sstsubsection{ epoch = double (Given) }{ Epoch of elements (TT MJD) } \sstsubsection{ orbinc = double (Given) }{ inclination (radians) } \sstsubsection{ anode = double (Given) }{ longitude of the ascending node (radians) } \sstsubsection{ perih = double (Given) }{ longitude or argument of perihelion (radians) } \sstsubsection{ aorq = double (Given) }{ mean distance or perihelion distance (AU) } \sstsubsection{ e = double (Given) }{ eccentricity } \sstsubsection{ aorl = double (Given) }{ mean anomaly or longitude (radians, JFORM=1,2 only) } \sstsubsection{ dm = double (Given) }{ daily motion (radians, JFORM=1 only) } \sstsubsection{ u = double [13] (Returned) }{ Universal orbital elements (Note 1) \sstitemlist{ \sstitem (0) combined mass (M$+$m) \sstitem (1) total energy of the orbit (alpha) \sstitem (2) reference (osculating) epoch (t0) \sstitem (3-5) position at reference epoch (r0) \sstitem (6-8) velocity at reference epoch (v0) \sstitem (9) heliocentric distance at reference epoch \sstitem (10) r0.v0 \sstitem (11) date (t) \sstitem (12) universal eccentric anomaly (psi) of date, approx } } \sstsubsection{ jstat = int $*$ (Returned) }{ status: 0 = OK \sstitemlist{ \sstitem -1 = illegal JFORM \sstitem -2 = illegal E \sstitem -3 = illegal AORQ \sstitem -4 = illegal DM \sstitem -5 = numerical error } } } \sstnotes{ \sstitemlist{ \sstitem The {\tt "}universal{\tt "} elements are those which define the orbit for the purposes of the method of universal variables (see reference). They consist of the combined mass of the two bodies, an epoch, and the position and velocity vectors (arbitrary reference frame) at that epoch. The parameter set used here includes also various quantities that can, in fact, be derived from the other information. This approach is taken to avoiding unnecessary computation and loss of accuracy. The supplementary quantities are (i) alpha, which is proportional to the total energy of the orbit, (ii) the heliocentric distance at epoch, (iii) the outwards component of the velocity at the given epoch, (iv) an estimate of psi, the {\tt "}universal eccentric anomaly{\tt "} at a given date and (v) that date. \sstitem The companion routine is palUe2pv. This takes the set of numbers that the present routine outputs and uses them to derive the object{\tt '}s position and velocity. A single prediction requires one call to the present routine followed by one call to palUe2pv; for convenience, the two calls are packaged as the routine palPlanel. Multiple predictions may be made by again calling the present routine once, but then calling palUe2pv multiple times, which is faster than multiple calls to palPlanel. \sstitem DATE is the epoch of osculation. It is in the TT timescale (formerly Ephemeris Time, ET) and is a Modified Julian Date (JD-2400000.5). \sstitem The supplied orbital elements are with respect to the J2000 ecliptic and equinox. The position and velocity parameters returned in the array U are with respect to the mean equator and equinox of epoch J2000, and are for the perihelion prior to the specified epoch. \sstitem The universal elements returned in the array U are in canonical units (solar masses, AU and canonical days). \sstitem Three different element-format options are available: } Option JFORM=1, suitable for the major planets: EPOCH = epoch of elements (TT MJD) ORBINC = inclination i (radians) ANODE = longitude of the ascending node, big omega (radians) PERIH = longitude of perihelion, curly pi (radians) AORQ = mean distance, a (AU) E = eccentricity, e (range 0 to $<$1) AORL = mean longitude L (radians) DM = daily motion (radians) Option JFORM=2, suitable for minor planets: EPOCH = epoch of elements (TT MJD) ORBINC = inclination i (radians) ANODE = longitude of the ascending node, big omega (radians) PERIH = argument of perihelion, little omega (radians) AORQ = mean distance, a (AU) E = eccentricity, e (range 0 to $<$1) AORL = mean anomaly M (radians) Option JFORM=3, suitable for comets: EPOCH = epoch of perihelion (TT MJD) ORBINC = inclination i (radians) ANODE = longitude of the ascending node, big omega (radians) PERIH = argument of perihelion, little omega (radians) AORQ = perihelion distance, q (AU) E = eccentricity, e (range 0 to 10) \sstitemlist{ \sstitem Unused elements (DM for JFORM=2, AORL and DM for JFORM=3) are not accessed. \sstitem The algorithm was originally adapted from the EPHSLA program of D.H.P.Jones (private communication, 1996). The method is based on Stumpff{\tt '}s Universal Variables. } } \sstdiytopic{ See Also }{ Everhart \& Pitkin, Am.J.Phys. 51, 712 (1983). } } \sstroutine{ palEpco }{ Convert an epoch into the appropriate form - {\tt '}B{\tt '} or {\tt '}J{\tt '} }{ \sstdescription{ Converts a Besselian or Julian epoch to a Julian or Besselian epoch. } \sstinvocation{ double palEpco( char k0, char k, double e ); } \sstarguments{ \sstsubsection{ k0 = char (Given) }{ Form of result: {\tt '}B{\tt '}=Besselian, {\tt '}J{\tt '}=Julian } \sstsubsection{ k = char (Given) }{ Form of given epoch: {\tt '}B{\tt '} or {\tt '}J{\tt '}. } } \sstnotes{ \sstitemlist{ \sstitem The result is always either equal to or very close to the given epoch E. The routine is required only in applications where punctilious treatment of heterogeneous mixtures of star positions is necessary. \sstitem k and k0 are case insensitive. This differes slightly from the Fortran SLA implementation. \sstitem k and k0 are not validated. They are interpreted as follows: o If k0 and k are the same the result is e o If k0 is {\tt '}b{\tt '} or {\tt '}B{\tt '} and k isn{\tt '}t the conversion is J to B. o In all other cases, the conversion is B to J. } } } \sstroutine{ palEpv }{ Earth position and velocity with respect to the BCRS }{ \sstdescription{ Earth position and velocity, heliocentric and barycentric, with respect to the Barycentric Celestial Reference System. } \sstinvocation{ void palEpv( double date, double ph[3], double vh[3], double pb[3], double vb[3] ); } \sstarguments{ \sstsubsection{ date = double (Given) }{ Date, TDB Modified Julian Date (JD-2400000.5) } \sstsubsection{ ph = double [3] (Returned) }{ Heliocentric Earth position (AU) } \sstsubsection{ vh = double [3] (Returned) }{ Heliocentric Earth velocity (AU/day) } \sstsubsection{ pb = double [3] (Returned) }{ Barycentric Earth position (AU) } \sstsubsection{ vb = double [3] (Returned) }{ Barycentric Earth velocity (AU/day) } } \sstnotes{ \sstitemlist{ \sstitem See eraEpv00 for details on accuracy \sstitem Note that the status argument from eraEpv00 is ignored } } } \sstroutine{ palEtrms }{ Compute the E-terms vector }{ \sstdescription{ Computes the E-terms (elliptic component of annual aberration) vector. Note the use of the J2000 aberration constant (20.49552 arcsec). This is a reflection of the fact that the E-terms embodied in existing star catalogues were computed from a variety of aberration constants. Rather than adopting one of the old constants the latest value is used here. } \sstinvocation{ void palEtrms ( double ep, double ev[3] ); } \sstarguments{ \sstsubsection{ ep = double (Given) }{ Besselian epoch } \sstsubsection{ ev = double [3] (Returned) }{ E-terms as (dx,dy,dz) } } \sstdiytopic{ See also }{ \sstitemlist{ \sstitem Smith, C.A. et al., 1989. Astr.J. 97, 265. \sstitem Yallop, B.D. et al., 1989. Astr.J. 97, 274. } } } \sstroutine{ palEqecl }{ Transform from J2000.0 equatorial coordinates to ecliptic coordinates }{ \sstdescription{ Transform from J2000.0 equatorial coordinates to ecliptic coordinates. } \sstinvocation{ void palEqecl( double dr, double dd, double date, double $*$dl, double $*$db); } \sstarguments{ \sstsubsection{ dr = double (Given) }{ J2000.0 mean RA (radians) } \sstsubsection{ dd = double (Given) }{ J2000.0 mean Dec (Radians) } \sstsubsection{ date = double (Given) }{ TT as Modified Julian Date (JD-2400000.5). The difference between TT and TDB is of the order of a millisecond or two (i.e. about 0.02 arc-seconds). } \sstsubsection{ dl = double $*$ (Returned) }{ Ecliptic longitude (mean of date, IAU 1980 theory, radians) } \sstsubsection{ db = double $*$ (Returned) }{ Ecliptic latitude (mean of date, IAU 1980 theory, radians) } } } \sstroutine{ palEqgal }{ Convert from J2000.0 equatorial coordinates to Galactic }{ \sstdescription{ Transformation from J2000.0 equatorial coordinates to IAU 1958 galactic coordinates. } \sstinvocation{ void palEqgal ( double dr, double dd, double $*$dl, double $*$db ); } \sstarguments{ \sstsubsection{ dr = double (Given) }{ J2000.0 RA (radians) } \sstsubsection{ dd = double (Given) }{ J2000.0 Dec (radians } \sstsubsection{ dl = double $*$ (Returned) }{ Galactic longitude (radians). } \sstsubsection{ db = double $*$ (Returned) }{ Galactic latitude (radians). } } \sstnotes{ The equatorial coordinates are J2000.0. Use the routine palGe50 if conversion to B1950.0 {\tt '}FK4{\tt '} coordinates is required. } \sstdiytopic{ See Also }{ Blaauw et al, Mon.Not.R.Astron.Soc.,121,123 (1960) } } \sstroutine{ palEvp }{ Returns the barycentric and heliocentric velocity and position of the Earth }{ \sstdescription{ Returns the barycentric and heliocentric velocity and position of the Earth at a given epoch, given with respect to a specified equinox. For information about accuracy, see the function eraEpv00. } \sstinvocation{ void palEvp( double date, double deqx, double dvb[3], double dpb[3], double dvh[3], double dph[3] ) } \sstarguments{ \sstsubsection{ date = double (Given) }{ TDB (loosely ET) as a Modified Julian Date (JD-2400000.5) } \sstsubsection{ deqx = double (Given) }{ Julian epoch (e.g. 2000.0) of mean equator and equinox of the vectors returned. If deqx $<$= 0.0, all vectors are referred to the mean equator and equinox (FK5) of epoch date. } \sstsubsection{ dvb = double[3] (Returned) }{ Barycentric velocity (AU/s, AU) } \sstsubsection{ dpb = double[3] (Returned) }{ Barycentric position (AU/s, AU) } \sstsubsection{ dvh = double[3] (Returned) }{ heliocentric velocity (AU/s, AU) } \sstsubsection{ dph = double[3] (Returned) }{ Heliocentric position (AU/s, AU) } } } \sstroutine{ palFk45z }{ Convert B1950.0 FK4 star data to J2000.0 FK5 assuming zero proper motion in the FK5 frame }{ \sstdescription{ Convert B1950.0 FK4 star data to J2000.0 FK5 assuming zero proper motion in the FK5 frame (double precision) This function converts stars from the Bessel-Newcomb, FK4 system to the IAU 1976, FK5, Fricke system, in such a way that the FK5 proper motion is zero. Because such a star has, in general, a non-zero proper motion in the FK4 system, the routine requires the epoch at which the position in the FK4 system was determined. The method is from Appendix 2 of Ref 1, but using the constants of Ref 4. } \sstinvocation{ palFk45z( double r1950, double d1950, double bepoch, double $*$r2000, double $*$d2000 ) } \sstarguments{ \sstsubsection{ r1950 = double (Given) }{ B1950.0 FK4 RA at epoch (radians). } \sstsubsection{ d1950 = double (Given) }{ B1950.0 FK4 Dec at epoch (radians). } \sstsubsection{ bepoch = double (Given) }{ Besselian epoch (e.g. 1979.3) } \sstsubsection{ r2000 = double (Returned) }{ J2000.0 FK5 RA (Radians). } \sstsubsection{ d2000 = double (Returned) }{ J2000.0 FK5 Dec(Radians). } } \sstnotes{ \sstitemlist{ \sstitem The epoch BEPOCH is strictly speaking Besselian, but if a Julian epoch is supplied the result will be affected only to a negligible extent. \sstitem Conversion from Besselian epoch 1950.0 to Julian epoch 2000.0 only is provided for. Conversions involving other epochs will require use of the appropriate precession, proper motion, and E-terms routines before and/or after palFk45z is called. \sstitem In the FK4 catalogue the proper motions of stars within 10 degrees of the poles do not embody the differential E-term effect and should, strictly speaking, be handled in a different manner from stars outside these regions. However, given the general lack of homogeneity of the star data available for routine astrometry, the difficulties of handling positions that may have been determined from astrometric fields spanning the polar and non-polar regions, the likelihood that the differential E-terms effect was not taken into account when allowing for proper motion in past astrometry, and the undesirability of a discontinuity in the algorithm, the decision has been made in this routine to include the effect of differential E-terms on the proper motions for all stars, whether polar or not. At epoch 2000, and measuring on the sky rather than in terms of dRA, the errors resulting from this simplification are less than 1 milliarcsecond in position and 1 milliarcsecond per century in proper motion. } } \sstdiytopic{ References }{ \sstitemlist{ \sstitem Aoki,S., et al, 1983. Astron.Astrophys., 128, 263. \sstitem Smith, C.A. et al, 1989. {\tt "}The transformation of astrometric catalog systems to the equinox J2000.0{\tt "}. Astron.J. 97, 265. \sstitem Yallop, B.D. et al, 1989. {\tt "}Transformation of mean star places from FK4 B1950.0 to FK5 J2000.0 using matrices in 6-space{\tt "}. Astron.J. 97, 274. \sstitem Seidelmann, P.K. (ed), 1992. {\tt "}Explanatory Supplement to the Astronomical Almanac{\tt "}, ISBN 0-935702-68-7. } } } \sstroutine{ palFk524 }{ Convert J2000.0 FK5 star data to B1950.0 FK4 }{ \sstdescription{ This function converts stars from the IAU 1976, FK5, Fricke system, to the Bessel-Newcomb, FK4 system. The precepts of Smith et al (Ref 1) are followed, using the implementation by Yallop et al (Ref 2) of a matrix method due to Standish. Kinoshita{\tt '}s development of Andoyer{\tt '}s post-Newcomb precession is used. The numerical constants from Seidelmann et al (Ref 3) are used canonically. } \sstinvocation{ palFk524( double r2000, double d2000, double dr2000, double dd2000, double p2000, double v2000, double $*$r1950, double $*$d1950, double $*$dr1950, double $*$dd1950, double $*$p1950, double $*$v1950 ) } \sstarguments{ \sstsubsection{ r2000 = double (Given) }{ J2000.0 FK5 RA (radians). } \sstsubsection{ d2000 = double (Given) }{ J2000.0 FK5 Dec (radians). } \sstsubsection{ dr2000 = double (Given) }{ J2000.0 FK5 RA proper motion (rad/Jul.yr) } \sstsubsection{ dd2000 = double (Given) }{ J2000.0 FK5 Dec proper motion (rad/Jul.yr) } \sstsubsection{ p2000 = double (Given) }{ J2000.0 FK5 parallax (arcsec) } \sstsubsection{ v2000 = double (Given) }{ J2000.0 FK5 radial velocity (km/s, $+$ve = moving away) } \sstsubsection{ r1950 = double $*$ (Returned) }{ B1950.0 FK4 RA (radians). } \sstsubsection{ d1950 = double $*$ (Returned) }{ B1950.0 FK4 Dec (radians). } \sstsubsection{ dr1950 = double $*$ (Returned) }{ B1950.0 FK4 RA proper motion (rad/Jul.yr) } \sstsubsection{ dd1950 = double $*$ (Returned) }{ B1950.0 FK4 Dec proper motion (rad/Jul.yr) } \sstsubsection{ p1950 = double $*$ (Returned) }{ B1950.0 FK4 parallax (arcsec) } \sstsubsection{ v1950 = double $*$ (Returned) }{ B1950.0 FK4 radial velocity (km/s, $+$ve = moving away) } } \sstnotes{ \sstitemlist{ \sstitem The proper motions in RA are dRA/dt rather than cos(Dec)$*$dRA/dt, and are per year rather than per century. \sstitem Note that conversion from Julian epoch 2000.0 to Besselian epoch 1950.0 only is provided for. Conversions involving other epochs will require use of the appropriate precession, proper motion, and E-terms routines before and/or after FK524 is called. \sstitem In the FK4 catalogue the proper motions of stars within 10 degrees of the poles do not embody the differential E-term effect and should, strictly speaking, be handled in a different manner from stars outside these regions. However, given the general lack of homogeneity of the star data available for routine astrometry, the difficulties of handling positions that may have been determined from astrometric fields spanning the polar and non-polar regions, the likelihood that the differential E-terms effect was not taken into account when allowing for proper motion in past astrometry, and the undesirability of a discontinuity in the algorithm, the decision has been made in this routine to include the effect of differential E-terms on the proper motions for all stars, whether polar or not. At epoch 2000, and measuring on the sky rather than in terms of dRA, the errors resulting from this simplification are less than 1 milliarcsecond in position and 1 milliarcsecond per century in proper motion. } } \sstdiytopic{ References }{ \sstitemlist{ \sstitem Smith, C.A. et al, 1989. {\tt "}The transformation of astrometric catalog systems to the equinox J2000.0{\tt "}. Astron.J. 97, 265. \sstitem Yallop, B.D. et al, 1989. {\tt "}Transformation of mean star places from FK4 B1950.0 to FK5 J2000.0 using matrices in 6-space{\tt "}. Astron.J. 97, 274. \sstitem Seidelmann, P.K. (ed), 1992. {\tt "}Explanatory Supplement to the Astronomical Almanac{\tt "}, ISBN 0-935702-68-7. } } } \sstroutine{ palFk54z }{ Convert a J2000.0 FK5 star position to B1950.0 FK4 assuming zero proper motion and parallax }{ \sstdescription{ This function converts star positions from the IAU 1976, FK5, Fricke system to the Bessel-Newcomb, FK4 system. } \sstinvocation{ palFk54z( double r2000, double d2000, double bepoch, double $*$r1950, double $*$d1950, double $*$dr1950, double $*$dd1950 ) } \sstarguments{ \sstsubsection{ r2000 = double (Given) }{ J2000.0 FK5 RA (radians). } \sstsubsection{ d2000 = double (Given) }{ J2000.0 FK5 Dec (radians). } \sstsubsection{ bepoch = double (Given) }{ Besselian epoch (e.g. 1950.0). } \sstsubsection{ r1950 = double $*$ (Returned) }{ B1950 FK4 RA (radians) at epoch {\tt "}bepoch{\tt "}. } \sstsubsection{ d1950 = double $*$ (Returned) }{ B1950 FK4 Dec (radians) at epoch {\tt "}bepoch{\tt "}. } \sstsubsection{ dr1950 = double $*$ (Returned) }{ B1950 FK4 proper motion (RA) (radians/trop.yr)). } \sstsubsection{ dr1950 = double $*$ (Returned) }{ B1950 FK4 proper motion (Dec) (radians/trop.yr)). } } \sstnotes{ \sstitemlist{ \sstitem The proper motion in RA is dRA/dt rather than cos(Dec)$*$dRA/dt. \sstitem Conversion from Julian epoch 2000.0 to Besselian epoch 1950.0 only is provided for. Conversions involving other epochs will require use of the appropriate precession functions before and after this function is called. \sstitem The FK5 proper motions, the parallax and the radial velocity are presumed zero. \sstitem It is the intention that FK5 should be a close approximation to an inertial frame, so that distant objects have zero proper motion; such objects have (in general) non-zero proper motion in FK4, and this function returns those fictitious proper motions. \sstitem The position returned by this function is in the B1950 reference frame but at Besselian epoch BEPOCH. For comparison with catalogues the {\tt "}bepoch{\tt "} argument will frequently be 1950.0. } } } \sstroutine{ palGaleq }{ Convert from galactic to J2000.0 equatorial coordinates }{ \sstdescription{ Transformation from IAU 1958 galactic coordinates to J2000.0 equatorial coordinates. } \sstinvocation{ void palGaleq ( double dl, double db, double $*$dr, double $*$dd ); } \sstarguments{ \sstsubsection{ dl = double (Given) }{ Galactic longitude (radians). } \sstsubsection{ db = double (Given) }{ Galactic latitude (radians). } \sstsubsection{ dr = double $*$ (Returned) }{ J2000.0 RA (radians) } \sstsubsection{ dd = double $*$ (Returned) }{ J2000.0 Dec (radians) } } \sstnotes{ The equatorial coordinates are J2000.0. Use the routine palGe50 if conversion to B1950.0 {\tt '}FK4{\tt '} coordinates is required. } \sstdiytopic{ See Also }{ Blaauw et al, Mon.Not.R.Astron.Soc.,121,123 (1960) } } \sstroutine{ palGalsup }{ Convert from galactic to supergalactic coordinates }{ \sstdescription{ Transformation from IAU 1958 galactic coordinates to de Vaucouleurs supergalactic coordinates. } \sstinvocation{ void palGalsup ( double dl, double db, double $*$dsl, double $*$dsb ); } \sstarguments{ \sstsubsection{ dl = double (Given) }{ Galactic longitude. } \sstsubsection{ db = double (Given) }{ Galactic latitude. } \sstsubsection{ dsl = double $*$ (Returned) }{ Supergalactic longitude. } \sstsubsection{ dsb = double $*$ (Returned) }{ Supergalactic latitude. } } \sstdiytopic{ See Also }{ \sstitemlist{ \sstitem de Vaucouleurs, de Vaucouleurs, \& Corwin, Second Reference Catalogue of Bright Galaxies, U. Texas, page 8. \sstitem Systems \& Applied Sciences Corp., Documentation for the machine-readable version of the above catalogue, Contract NAS 5-26490. } (These two references give different values for the galactic longitude of the supergalactic origin. Both are wrong; the correct value is L2=137.37.) } } \sstroutine{ palGe50 }{ Transform Galactic Coordinate to B1950 FK4 }{ \sstdescription{ Transformation from IAU 1958 galactic coordinates to B1950.0 {\tt '}FK4{\tt '} equatorial coordinates. } \sstinvocation{ palGe50( double dl, double db, double $*$dr, double $*$dd ); } \sstarguments{ \sstsubsection{ dl = double (Given) }{ Galactic longitude (radians) } \sstsubsection{ db = double (Given) }{ Galactic latitude (radians) } \sstsubsection{ dr = double $*$ (Returned) }{ B9150.0 FK4 RA. } \sstsubsection{ dd = double $*$ (Returned) }{ B1950.0 FK4 Dec. } } \sstnotes{ \sstitemlist{ \sstitem The equatorial coordinates are B1950.0 {\tt '}FK4{\tt '}. Use the routine palGaleq if conversion to J2000.0 coordinates is required. } } \sstdiytopic{ See Also }{ \sstitemlist{ \sstitem Blaauw et al, Mon.Not.R.Astron.Soc.,121,123 (1960) } } } \sstroutine{ palGeoc }{ Convert geodetic position to geocentric }{ \sstdescription{ Convert geodetic position to geocentric. } \sstinvocation{ void palGeoc( double p, double h, double $*$ r, double $*$z ); } \sstarguments{ \sstsubsection{ p = double (Given) }{ latitude (radians) } \sstsubsection{ h = double (Given) }{ height above reference spheroid (geodetic, metres) } \sstsubsection{ r = double $*$ (Returned) }{ distance from Earth axis (AU) } \sstsubsection{ z = double $*$ (Returned) }{ distance from plane of Earth equator (AU) } } \sstnotes{ \sstitemlist{ \sstitem Geocentric latitude can be obtained by evaluating atan2(z,r) \sstitem Uses WGS84 reference ellipsoid and calls eraGd2gc } } } \sstroutine{ palIntin }{ Convert free-format input into an integer }{ \sstdescription{ Extracts a number from an input string starting at the specified index. } \sstinvocation{ void palIntin( const char $*$ string, int $*$nstrt, long $*$ireslt, int $*$jflag ); } \sstarguments{ \sstsubsection{ string = const char $*$ (Given) }{ String containing number to be decoded. } \sstsubsection{ nstrt = int $*$ (Given and Returned) }{ Character number indicating where decoding should start. On output its value is updated to be the location of the possible next value. For compatibility with SLA the first character is index 1. } \sstsubsection{ ireslt = long $*$ (Returned) }{ Result. Not updated when jflag=1. } \sstsubsection{ jflag = int $*$ (Returned) }{ status: -1 = -OK, 0 = $+$OK, 1 = null, 2 = error } } \sstnotes{ \sstitemlist{ \sstitem Uses the strtol() system call to do the parsing. This may lead to subtle differences when compared to the SLA/F parsing. \sstitem Commas are recognized as a special case and are skipped if one happens to be the next character when updating nstrt. Additionally the output nstrt position will skip past any trailing space. \sstitem If no number can be found flag will be set to 1. \sstitem If the number overflows or underflows jflag will be set to 2. For overflow the returned result will have the value LONG\_MAX, for underflow it will have the value LONG\_MIN. } } } \sstroutine{ palMap }{ Convert star RA,Dec from mean place to geocentric apparent }{ \sstdescription{ Convert star RA,Dec from mean place to geocentric apparent. } \sstinvocation{ void palMap( double rm, double dm, double pr, double pd, double px, double rv, double eq, double date, double $*$ra, double $*$da ); } \sstarguments{ \sstsubsection{ rm = double (Given) }{ Mean RA (radians) } \sstsubsection{ dm = double (Given) }{ Mean declination (radians) } \sstsubsection{ pr = double (Given) }{ RA proper motion, changes per Julian year (radians) } \sstsubsection{ pd = double (Given) }{ Dec proper motion, changes per Julian year (radians) } \sstsubsection{ px = double (Given) }{ Parallax (arcsec) } \sstsubsection{ rv = double (Given) }{ Radial velocity (km/s, $+$ve if receding) } \sstsubsection{ eq = double (Given) }{ Epoch and equinox of star data (Julian) } \sstsubsection{ date = double (Given) }{ TDB for apparent place (JD-2400000.5) } \sstsubsection{ ra = double $*$ (Returned) }{ Apparent RA (radians) } \sstsubsection{ dec = double $*$ (Returned) }{ Apparent dec (radians) } } \sstnotes{ \sstitemlist{ \sstitem Calls palMappa and palMapqk \sstitem The reference systems and timescales used are IAU 2006. \sstitem EQ is the Julian epoch specifying both the reference frame and the epoch of the position - usually 2000. For positions where the epoch and equinox are different, use the routine palPm to apply proper motion corrections before using this routine. \sstitem The distinction between the required TDB and TT is always negligible. Moreover, for all but the most critical applications UTC is adequate. \sstitem The proper motions in RA are dRA/dt rather than cos(Dec)$*$dRA/dt. \sstitem This routine may be wasteful for some applications because it recomputes the Earth position/velocity and the precession- nutation matrix each time, and because it allows for parallax and proper motion. Where multiple transformations are to be carried out for one epoch, a faster method is to call the palMappa routine once and then either the palMapqk routine (which includes parallax and proper motion) or palMapqkz (which assumes zero parallax and proper motion). \sstitem The accuracy is sub-milliarcsecond, limited by the precession-nutation model (see palPrenut for details). \sstitem The accuracy is further limited by the routine palEvp, called by palMappa, which computes the Earth position and velocity. See eraEpv00 for details on that calculation. } } } \sstroutine{ palMappa }{ Compute parameters needed by palAmpqk and palMapqk }{ \sstdescription{ Compute star-independent parameters in preparation for transformations between mean place and geocentric apparent place. The parameters produced by this function are required in the parallax, aberration, and nutation/bias/precession parts of the mean/apparent transformations. The reference systems and timescales used are IAU 2006. } \sstinvocation{ void palMappa( double eq, double date, double amprms[21] ) } \sstarguments{ \sstsubsection{ eq = double (Given) }{ epoch of mean equinox to be used (Julian) } \sstsubsection{ date = double (Given) }{ TDB (JD-2400000.5) } \sstsubsection{ amprms = double[21] (Returned) }{ star-independent mean-to-apparent parameters: \sstitemlist{ \sstitem (0) time interval for proper motion (Julian years) \sstitem (1-3) barycentric position of the Earth (AU) \sstitem (4-6) heliocentric direction of the Earth (unit vector) \sstitem (7) (grav rad Sun)$*$2/(Sun-Earth distance) \sstitem (8-10) abv: barycentric Earth velocity in units of c \sstitem (11) sqrt(1-v$*$$*$2) where v=modulus(abv) \sstitem (12-20) precession/nutation (3,3) matrix } } } \sstnotes{ \sstitemlist{ \sstitem For date, the distinction between the required TDB and TT is always negligible. Moreover, for all but the most critical applications UTC is adequate. \sstitem The vector amprms(1-3) is referred to the mean equinox and equator of epoch eq. \sstitem The parameters amprms produced by this function are used by palAmpqk, palMapqk and palMapqkz. } } } \sstroutine{ palMapqk }{ Quick mean to apparent place }{ \sstdescription{ Quick mean to apparent place: transform a star RA,Dec from mean place to geocentric apparent place, given the star-independent parameters. Use of this routine is appropriate when efficiency is important and where many star positions, all referred to the same equator and equinox, are to be transformed for one epoch. The star-independent parameters can be obtained by calling the palMappa routine. If the parallax and proper motions are zero the palMapqkz routine can be used instead. } \sstinvocation{ void palMapqk ( double rm, double dm, double pr, double pd, double px, double rv, double amprms[21], double $*$ra, double $*$da ); } \sstarguments{ \sstsubsection{ rm = double (Given) }{ Mean RA (radians) } \sstsubsection{ dm = double (Given) }{ Mean declination (radians) } \sstsubsection{ pr = double (Given) }{ RA proper motion, changes per Julian year (radians) } \sstsubsection{ pd = double (Given) }{ Dec proper motion, changes per Julian year (radians) } \sstsubsection{ px = double (Given) }{ Parallax (arcsec) } \sstsubsection{ rv = double (Given) }{ Radial velocity (km/s, $+$ve if receding) } \sstsubsection{ amprms = double [21] (Given) }{ Star-independent mean-to-apparent parameters (see palMappa). } \sstsubsection{ ra = double $*$ (Returned) }{ Apparent RA (radians) } \sstsubsection{ dec = double $*$ (Returned) }{ Apparent dec (radians) } } \sstnotes{ \sstitemlist{ \sstitem The reference frames and timescales used are post IAU 2006. } } } \sstroutine{ palMapqkz }{ Quick mean to apparent place }{ \sstdescription{ Quick mean to apparent place: transform a star RA,dec from mean place to geocentric apparent place, given the star-independent parameters, and assuming zero parallax and proper motion. Use of this function is appropriate when efficiency is important and where many star positions, all with parallax and proper motion either zero or already allowed for, and all referred to the same equator and equinox, are to be transformed for one epoch. The star-independent parameters can be obtained by calling the palMappa function. The corresponding function for the case of non-zero parallax and proper motion is palMapqk. The reference systems and timescales used are IAU 2006. Strictly speaking, the function is not valid for solar-system sources, though the error will usually be extremely small. } \sstinvocation{ void palMapqkz( double rm, double dm, double amprms[21], double $*$ra, double $*$da ) } \sstarguments{ \sstsubsection{ rm = double (Given) }{ Mean RA (radians). } \sstsubsection{ dm = double (Given) }{ Mean Dec (radians). } \sstsubsection{ amprms = double[21] (Given) }{ Star-independent mean-to-apparent parameters (see palMappa): (0-3) not used (4-6) not used (7) not used (8-10) abv: barycentric Earth velocity in units of c (11) sqrt(1-v$*$$*$2) where v=modulus(abv) (12-20) precession/nutation (3,3) matrix } \sstsubsection{ ra = double $*$ (Returned) }{ Apparent RA (radians). } \sstsubsection{ da = double $*$ (Returned) }{ Apparent Dec (radians). } } } \sstroutine{ palNut }{ Form the matrix of nutation }{ \sstdescription{ Form the matrix of nutation for a given date using the IAU 2006 nutation model and palDeuler. } \sstinvocation{ void palNut( double date, double rmatn[3][3] ); } \sstarguments{ \sstsubsection{ date = double (Given) }{ TT as modified Julian date (JD-2400000.5) } \sstsubsection{ rmatn = double [3][3] (Returned) }{ Nutation matrix in the sense v(true)=rmatn $*$ v(mean) where v(true) is the star vector relative to the true equator and equinox of date and v(mean) is the star vector relative to the mean equator and equinox of date. } } \sstnotes{ \sstitemlist{ \sstitem Uses eraNut06a via palNutc \sstitem The distinction between TDB and TT is negligible. For all but the most critical applications UTC is adequate. } } } \sstroutine{ palNutc }{ Calculate nutation longitude \& obliquoty components }{ \sstdescription{ Calculates the longitude $*$ obliquity components and mean obliquity using the SOFA/ERFA library. } \sstinvocation{ void palNutc( double date, double $*$ dpsi, double $*$deps, double $*$eps0 ); } \sstarguments{ \sstsubsection{ date = double (Given) }{ TT as modified Julian date (JD-2400000.5) } \sstsubsection{ dpsi = double $*$ (Returned) }{ Nutation in longitude } \sstsubsection{ deps = double $*$ (Returned) }{ Nutation in obliquity } \sstsubsection{ eps0 = double $*$ (Returned) }{ Mean obliquity. } } \sstnotes{ \sstitemlist{ \sstitem Calls eraObl06 and eraNut06a and therefore uses the IAU 206 precession/nutation model. \sstitem Note the change from SLA/F regarding the date. TT is used rather than TDB. } } } \sstroutine{ palOap }{ Observed to apparent place }{ \sstdescription{ Observed to apparent place. } \sstinvocation{ void palOap ( const char $*$type, double ob1, double ob2, double date, double dut, double elongm, double phim, double hm, double xp, double yp, double tdk, double pmb, double rh, double wl, double tlr, double $*$rap, double $*$dap ); } \sstarguments{ \sstsubsection{ type = const char $*$ (Given) }{ Type of coordinates - {\tt '}R{\tt '}, {\tt '}H{\tt '} or {\tt '}A{\tt '} (see below) } \sstsubsection{ ob1 = double (Given) }{ Observed Az, HA or RA (radians; Az is N=0;E=90) } \sstsubsection{ ob2 = double (Given) }{ Observed ZD or Dec (radians) } \sstsubsection{ date = double (Given) }{ UTC date/time (Modified Julian Date, JD-2400000.5) } \sstsubsection{ dut = double (Given) }{ delta UT: UT1-UTC (UTC seconds) } \sstsubsection{ elongm = double (Given) }{ Mean longitude of the observer (radians, east $+$ve) } \sstsubsection{ phim = double (Given) }{ Mean geodetic latitude of the observer (radians) } \sstsubsection{ hm = double (Given) }{ Observer{\tt '}s height above sea level (metres) } \sstsubsection{ xp = double (Given) }{ Polar motion x-coordinates (radians) } \sstsubsection{ yp = double (Given) }{ Polar motion y-coordinates (radians) } \sstsubsection{ tdk = double (Given) }{ Local ambient temperature (K; std=273.15) } \sstsubsection{ pmb = double (Given) }{ Local atmospheric pressure (mb; std=1013.25) } \sstsubsection{ rh = double (Given) }{ Local relative humidity (in the range 0.0-1.0) } \sstsubsection{ wl = double (Given) }{ Effective wavelength (micron, e.g. 0.55) } \sstsubsection{ tlr = double (Given) }{ Tropospheric laps rate (K/metre, e.g. 0.0065) } \sstsubsection{ rap = double $*$ (Given) }{ Geocentric apparent right ascension } \sstsubsection{ dap = double $*$ (Given) }{ Geocentric apparent declination } } \sstnotes{ \sstitemlist{ \sstitem Only the first character of the TYPE argument is significant. {\tt '}R{\tt '} or {\tt '}r{\tt '} indicates that OBS1 and OBS2 are the observed right ascension and declination; {\tt '}H{\tt '} or {\tt '}h{\tt '} indicates that they are hour angle (west $+$ve) and declination; anything else ({\tt '}A{\tt '} or {\tt '}a{\tt '} is recommended) indicates that OBS1 and OBS2 are azimuth (north zero, east 90 deg) and zenith distance. (Zenith distance is used rather than elevation in order to reflect the fact that no allowance is made for depression of the horizon.) \sstitem The accuracy of the result is limited by the corrections for refraction. Providing the meteorological parameters are known accurately and there are no gross local effects, the predicted apparent RA,Dec should be within about 0.1 arcsec for a zenith distance of less than 70 degrees. Even at a topocentric zenith distance of 90 degrees, the accuracy in elevation should be better than 1 arcmin; useful results are available for a further 3 degrees, beyond which the palRefro routine returns a fixed value of the refraction. The complementary routines palAop (or palAopqk) and palOap (or palOapqk) are self-consistent to better than 1 micro- arcsecond all over the celestial sphere. \sstitem It is advisable to take great care with units, as even unlikely values of the input parameters are accepted and processed in accordance with the models used. \sstitem {\tt "}Observed{\tt "} Az,El means the position that would be seen by a perfect theodolite located at the observer. This is related to the observed HA,Dec via the standard rotation, using the geodetic latitude (corrected for polar motion), while the observed HA and RA are related simply through the local apparent ST. {\tt "}Observed{\tt "} RA,Dec or HA,Dec thus means the position that would be seen by a perfect equatorial located at the observer and with its polar axis aligned to the Earth{\tt '}s axis of rotation (n.b. not to the refracted pole). By removing from the observed place the effects of atmospheric refraction and diurnal aberration, the geocentric apparent RA,Dec is obtained. \sstitem Frequently, mean rather than apparent RA,Dec will be required, in which case further transformations will be necessary. The palAmp etc routines will convert the apparent RA,Dec produced by the present routine into an {\tt "}FK5{\tt "} (J2000) mean place, by allowing for the Sun{\tt '}s gravitational lens effect, annual aberration, nutation and precession. Should {\tt "}FK4{\tt "} (1950) coordinates be needed, the routines palFk524 etc will also need to be applied. \sstitem To convert to apparent RA,Dec the coordinates read from a real telescope, corrections would have to be applied for encoder zero points, gear and encoder errors, tube flexure, the position of the rotator axis and the pointing axis relative to it, non-perpendicularity between the mounting axes, and finally for the tilt of the azimuth or polar axis of the mounting (with appropriate corrections for mount flexures). Some telescopes would, of course, exhibit other properties which would need to be accounted for at the appropriate point in the sequence. \sstitem This routine takes time to execute, due mainly to the rigorous integration used to evaluate the refraction. For processing multiple stars for one location and time, call palAoppa once followed by one call per star to palOapqk. Where a range of times within a limited period of a few hours is involved, and the highest precision is not required, call palAoppa once, followed by a call to palAoppat each time the time changes, followed by one call per star to palOapqk. \sstitem The DATE argument is UTC expressed as an MJD. This is, strictly speaking, wrong, because of leap seconds. However, as long as the delta UT and the UTC are consistent there are no difficulties, except during a leap second. In this case, the start of the 61st second of the final minute should begin a new MJD day and the old pre-leap delta UT should continue to be used. As the 61st second completes, the MJD should revert to the start of the day as, simultaneously, the delta UTC changes by one second to its post-leap new value. \sstitem The delta UT (UT1-UTC) is tabulated in IERS circulars and elsewhere. It increases by exactly one second at the end of each UTC leap second, introduced in order to keep delta UT within $+$/- 0.9 seconds. \sstitem IMPORTANT -- TAKE CARE WITH THE LONGITUDE SIGN CONVENTION. The longitude required by the present routine is east-positive, in accordance with geographical convention (and right-handed). In particular, note that the longitudes returned by the palOBS routine are west-positive, following astronomical usage, and must be reversed in sign before use in the present routine. \sstitem The polar coordinates XP,YP can be obtained from IERS circulars and equivalent publications. The maximum amplitude is about 0.3 arcseconds. If XP,YP values are unavailable, use XP=YP=0D0. See page B60 of the 1988 Astronomical Almanac for a definition of the two angles. \sstitem The height above sea level of the observing station, HM, can be obtained from the Astronomical Almanac (Section J in the 1988 edition), or via the routine palOBS. If P, the pressure in millibars, is available, an adequate estimate of HM can be obtained from the expression } HM $\sim$ -29.3$*$TSL$*$LOG(P/1013.25). where TSL is the approximate sea-level air temperature in K (see Astrophysical Quantities, C.W.Allen, 3rd edition, section 52). Similarly, if the pressure P is not known, it can be estimated from the height of the observing station, HM, as follows: P $\sim$ 1013.25$*$EXP(-HM/(29.3$*$TSL)). Note, however, that the refraction is nearly proportional to the pressure and that an accurate P value is important for precise work. \sstitemlist{ \sstitem The azimuths etc. used by the present routine are with respect to the celestial pole. Corrections from the terrestrial pole can be computed using palPolmo. } } } \sstroutine{ palOapqk }{ Quick observed to apparent place }{ \sstdescription{ type = const char $*$ (Given) Type of coordinates - {\tt '}R{\tt '}, {\tt '}H{\tt '} or {\tt '}A{\tt '} (see below) ob1 = double (Given) Observed Az, HA or RA (radians; Az is N=0;E=90) ob2 = double (Given) Observed ZD or Dec (radians) aoprms = const double [14] (Given) Star-independent apparent-to-observed parameters. See palAopqk for details. rap = double $*$ (Given) Geocentric apparent right ascension dap = double $*$ (Given) Geocentric apparent declination } \sstinvocation{ void palOapqk ( const char $*$type, double ob1, double ob2, const double aoprms[14], double $*$rap, double $*$dap ); } \sstarguments{ \sstsubsection{ Quick observed to apparent place. }{ } } \sstnotes{ \sstitemlist{ \sstitem Only the first character of the TYPE argument is significant. {\tt '}R{\tt '} or {\tt '}r{\tt '} indicates that OBS1 and OBS2 are the observed right ascension and declination; {\tt '}H{\tt '} or {\tt '}h{\tt '} indicates that they are hour angle (west $+$ve) and declination; anything else ({\tt '}A{\tt '} or {\tt '}a{\tt '} is recommended) indicates that OBS1 and OBS2 are azimuth (north zero, east 90 deg) and zenith distance. (Zenith distance is used rather than elevation in order to reflect the fact that no allowance is made for depression of the horizon.) \sstitem The accuracy of the result is limited by the corrections for refraction. Providing the meteorological parameters are known accurately and there are no gross local effects, the predicted apparent RA,Dec should be within about 0.1 arcsec for a zenith distance of less than 70 degrees. Even at a topocentric zenith distance of 90 degrees, the accuracy in elevation should be better than 1 arcmin; useful results are available for a further 3 degrees, beyond which the palREFRO routine returns a fixed value of the refraction. The complementary routines palAop (or palAopqk) and palOap (or palOapqk) are self-consistent to better than 1 micro- arcsecond all over the celestial sphere. \sstitem It is advisable to take great care with units, as even unlikely values of the input parameters are accepted and processed in accordance with the models used. \sstitem {\tt "}Observed{\tt "} Az,El means the position that would be seen by a perfect theodolite located at the observer. This is related to the observed HA,Dec via the standard rotation, using the geodetic latitude (corrected for polar motion), while the observed HA and RA are related simply through the local apparent ST. {\tt "}Observed{\tt "} RA,Dec or HA,Dec thus means the position that would be seen by a perfect equatorial located at the observer and with its polar axis aligned to the Earth{\tt '}s axis of rotation (n.b. not to the refracted pole). By removing from the observed place the effects of atmospheric refraction and diurnal aberration, the geocentric apparent RA,Dec is obtained. \sstitem Frequently, mean rather than apparent RA,Dec will be required, in which case further transformations will be necessary. The palAmp etc routines will convert the apparent RA,Dec produced by the present routine into an {\tt "}FK5{\tt "} (J2000) mean place, by allowing for the Sun{\tt '}s gravitational lens effect, annual aberration, nutation and precession. Should {\tt "}FK4{\tt "} (1950) coordinates be needed, the routines palFk524 etc will also need to be applied. \sstitem To convert to apparent RA,Dec the coordinates read from a real telescope, corrections would have to be applied for encoder zero points, gear and encoder errors, tube flexure, the position of the rotator axis and the pointing axis relative to it, non-perpendicularity between the mounting axes, and finally for the tilt of the azimuth or polar axis of the mounting (with appropriate corrections for mount flexures). Some telescopes would, of course, exhibit other properties which would need to be accounted for at the appropriate point in the sequence. \sstitem The star-independent apparent-to-observed-place parameters in AOPRMS may be computed by means of the palAoppa routine. If nothing has changed significantly except the time, the palAoppat routine may be used to perform the requisite partial recomputation of AOPRMS. \sstitem The azimuths etc used by the present routine are with respect to the celestial pole. Corrections from the terrestrial pole can be computed using palPolmo. } } } \sstroutine{ palObs }{ Parameters of selected ground-based observing stations }{ \sstdescription{ Station numbers, identifiers, names and other details are subject to change and should not be hardwired into application programs. All characters in {\tt "}c{\tt "} up to the first space are checked; thus an abbreviated ID will return the parameters for the first station in the list which matches the abbreviation supplied, and no station in the list will ever contain embedded spaces. {\tt "}c{\tt "} must not have leading spaces. IMPORTANT -- BEWARE OF THE LONGITUDE SIGN CONVENTION. The longitude returned by sla\_OBS is west-positive in accordance with astronomical usage. However, this sign convention is left-handed and is the opposite of the one used by geographers; elsewhere in PAL the preferable east-positive convention is used. In particular, note that for use in palAop, palAoppa and palOap the sign of the longitude must be reversed. Users are urged to inform the author of any improvements they would like to see made. For example: typographical corrections more accurate parameters better station identifiers or names additional stations } \sstinvocation{ int palObs( size\_t n, const char $*$ c, char $*$ ident, size\_t identlen, char $*$ name, size\_t namelen, double $*$ w, double $*$ p, double $*$ h ); } \sstarguments{ \sstsubsection{ n = size\_t (Given) }{ Number specifying the observing station. If 0 the identifier in {\tt "}c{\tt "} is used to determine the observing station to use. } \sstsubsection{ c = const char $*$ (Given) }{ Identifier specifying the observing station for which the parameters should be returned. Only used if n is 0. Can be NULL for n$>$0. Case insensitive. } \sstsubsection{ ident = char $*$ (Returned) }{ Identifier of the observing station selected. Will be identical to {\tt "}c{\tt "} if n==0. Unchanged if {\tt "}n{\tt "} or {\tt "}c{\tt "} do not match an observing station. Should be at least 11 characters (including the trailing nul). } \sstsubsection{ identlen = size\_t (Given) }{ Size of the buffer {\tt "}ident{\tt "} including trailing nul. } \sstsubsection{ name = char $*$ (Returned) }{ Full name of the specified observing station. Contains {\tt "}?{\tt "} if {\tt "}n{\tt "} or {\tt "}c{\tt "} did not correspond to a valid station. Should be at least 41 characters (including the trailing nul). } \sstsubsection{ w = double $*$ (Returned) }{ Longitude (radians, West $+$ve). Unchanged if observing station could not be identified. } \sstsubsection{ p = double $*$ (Returned) }{ Geodetic latitude (radians, North $+$ve). Unchanged if observing station could not be identified. } \sstsubsection{ h = double $*$ (Returned) }{ Height above sea level (metres). Unchanged if observing station could not be identified. } } \sstreturnedvalue{ \sstsubsection{ palObs = int }{ 0 if an observing station was returned. -1 if no match was found. } } \sstnotes{ \sstitemlist{ \sstitem Differs from the SLA interface in that the output short name is not the same variable as the input short name. This simplifies consting. Additionally the size of the output buffers are now specified in the API and a status integer is returned. } } } \sstroutine{ palPa }{ HA, Dec to Parallactic Angle }{ \sstdescription{ Converts HA, Dec to Parallactic Angle. } \sstinvocation{ double palPa( double ha, double dec, double phi ); } \sstarguments{ \sstsubsection{ ha = double (Given) }{ Hour angle in radians (Geocentric apparent) } \sstsubsection{ dec = double (Given) }{ Declination in radians (Geocentric apparent) } \sstsubsection{ phi = double (Given) }{ Observatory latitude in radians (geodetic) } } \sstreturnedvalue{ \sstsubsection{ palPa = double }{ Parallactic angle in the range -pi to $+$pi. } } \sstnotes{ \sstitemlist{ \sstitem The parallactic angle at a point in the sky is the position angle of the vertical, i.e. the angle between the direction to the pole and to the zenith. In precise applications care must be taken only to use geocentric apparent HA,Dec and to consider separately the effects of atmospheric refraction and telescope mount errors. \sstitem At the pole a zero result is returned. } } } \sstroutine{ palPcd }{ Apply pincushion/barrel distortion to a tangent-plane [x,y] }{ \sstdescription{ Applies pincushion and barrel distortion to a tangent plane coordinate. } \sstinvocation{ palPcd( double disco, double $*$ x, double $*$ y ); } \sstarguments{ \sstsubsection{ disco = double (Given) }{ Pincushion/barrel distortion coefficient. } \sstsubsection{ x = double $*$ (Given \& Returned) }{ On input the tangent-plane X coordinate, on output the distorted X coordinate. } \sstsubsection{ y = double $*$ (Given \& Returned) }{ On input the tangent-plane Y coordinate, on output the distorted Y coordinate. } } \sstnotes{ \sstitemlist{ \sstitem The distortion is of the form RP = R$*$(1 $+$ C$*$R$*$$*$2), where R is the radial distance from the tangent point, C is the DISCO argument, and RP is the radial distance in the presence of the distortion. \sstitem For pincushion distortion, C is $+$ve; for barrel distortion, C is -ve. \sstitem For X,Y in units of one projection radius (in the case of a photographic plate, the focal length), the following DISCO values apply: \begin{center} \begin{tabular}{ll} Geometry &DISCO \\ \hline astrograph & 0.0 \\ Schmidt &-0.3333 \\ AAT PF doublet &$+$147.069 \\ AAT PF triplet &$+$178.585 \\ AAT f/8 &$+$21.20 \\ JKT f/8 &$+$13.32 \\ \end{tabular} \end{center} } } \sstdiytopic{ See Also }{ \sstitemlist{ \sstitem There is a companion routine, palUnpcd, which performs the inverse operation. } } } \sstroutine{ palPertel }{ Update elements by applying planetary perturbations }{ \sstdescription{ Update the osculating orbital elements of an asteroid or comet by applying planetary perturbations. } \sstinvocation{ void palPertel (int jform, double date0, double date1, double epoch0, double orbi0, double anode0, double perih0, double aorq0, double e0, double am0, double $*$epoch1, double $*$orbi1, double $*$anode1, double $*$perih1, double $*$aorq1, double $*$e1, double $*$am1, int $*$jstat ); } \sstarguments{ \sstsubsection{ jform = int (Given) }{ Element set actually returned (1-3; Note 6) } \sstsubsection{ date0 = double (Given) }{ Date of osculation (TT MJD) for the given elements. } \sstsubsection{ date1 = double (Given) }{ Date of osculation (TT MJD) for the updated elements. } \sstsubsection{ epoch0 = double (Given) }{ Epoch of elements (TT MJD) } \sstsubsection{ orbi0 = double (Given) }{ inclination (radians) } \sstsubsection{ anode0 = double (Given) }{ longitude of the ascending node (radians) } \sstsubsection{ perih0 = double (Given) }{ longitude or argument of perihelion (radians) } \sstsubsection{ aorq0 = double (Given) }{ mean distance or perihelion distance (AU) } \sstsubsection{ e0 = double (Given) }{ eccentricity } \sstsubsection{ am0 = double (Given) }{ mean anomaly (radians, JFORM=2 only) } \sstsubsection{ epoch1 = double $*$ (Returned) }{ Epoch of elements (TT MJD) } \sstsubsection{ orbi1 = double $*$ (Returned) }{ inclination (radians) } \sstsubsection{ anode1 = double $*$ (Returned) }{ longitude of the ascending node (radians) } \sstsubsection{ perih1 = double $*$ (Returned) }{ longitude or argument of perihelion (radians) } \sstsubsection{ aorq1 = double $*$ (Returned) }{ mean distance or perihelion distance (AU) } \sstsubsection{ e1 = double $*$ (Returned) }{ eccentricity } \sstsubsection{ am1 = double $*$ (Returned) }{ mean anomaly (radians, JFORM=2 only) } \sstsubsection{ jstat = int $*$ (Returned) }{ status: \sstitemlist{ \sstitem $+$102 = warning, distant epoch \sstitem $+$101 = warning, large timespan ( $>$ 100 years) \sstitem $+$1 to $+$10 = coincident with planet (Note 6) \sstitem 0 = OK \sstitem -1 = illegal JFORM \sstitem -2 = illegal E0 \sstitem -3 = illegal AORQ0 \sstitem -4 = internal error \sstitem -5 = numerical error } } } \sstnotes{ \sstitemlist{ \sstitem Two different element-format options are available: } Option JFORM=2, suitable for minor planets: EPOCH = epoch of elements (TT MJD) ORBI = inclination i (radians) ANODE = longitude of the ascending node, big omega (radians) PERIH = argument of perihelion, little omega (radians) AORQ = mean distance, a (AU) E = eccentricity, e AM = mean anomaly M (radians) Option JFORM=3, suitable for comets: EPOCH = epoch of perihelion (TT MJD) ORBI = inclination i (radians) ANODE = longitude of the ascending node, big omega (radians) PERIH = argument of perihelion, little omega (radians) AORQ = perihelion distance, q (AU) E = eccentricity, e \sstitemlist{ \sstitem DATE0, DATE1, EPOCH0 and EPOCH1 are all instants of time in the TT timescale (formerly Ephemeris Time, ET), expressed as Modified Julian Dates (JD-2400000.5). } DATE0 is the instant at which the given (i.e. unperturbed) osculating elements are correct. DATE1 is the specified instant at which the updated osculating elements are correct. EPOCH0 and EPOCH1 will be the same as DATE0 and DATE1 (respectively) for the JFORM=2 case, normally used for minor planets. For the JFORM=3 case, the two epochs will refer to perihelion passage and so will not, in general, be the same as DATE0 and/or DATE1 though they may be similar to one another. \sstitemlist{ \sstitem The elements are with respect to the J2000 ecliptic and equinox. \sstitem Unused elements (AM0 and AM1 for JFORM=3) are not accessed. \sstitem See the palPertue routine for details of the algorithm used. \sstitem This routine is not intended to be used for major planets, which is why JFORM=1 is not available and why there is no opportunity to specify either the longitude of perihelion or the daily motion. However, if JFORM=2 elements are somehow obtained for a major planet and supplied to the routine, sensible results will, in fact, be produced. This happens because the sla\_PERTUE routine that is called to perform the calculations checks the separation between the body and each of the planets and interprets a suspiciously small value (0.001 AU) as an attempt to apply it to the planet concerned. If this condition is detected, the contribution from that planet is ignored, and the status is set to the planet number (1-10 = Mercury, Venus, EMB, Mars, Jupiter, Saturn, Uranus, Neptune, Earth, Moon) as a warning. } } \sstdiytopic{ See Also }{ \sstitemlist{ \sstitem Sterne, Theodore E., {\tt "}An Introduction to Celestial Mechanics{\tt "}, Interscience Publishers Inc., 1960. Section 6.7, p199. } } } \sstroutine{ palPertue }{ Update the universal elements by applying planetary perturbations }{ \sstdescription{ Update the universal elements of an asteroid or comet by applying planetary perturbations. } \sstinvocation{ void palPertue( double date, double u[13], int $*$jstat ); } \sstarguments{ \sstsubsection{ date = double (Given) }{ Final epoch (TT MJD) for the update elements. } \sstsubsection{ u = const double [13] (Given \& Returned) }{ Universal orbital elements (Note 1) (0) combined mass (M$+$m) (1) total energy of the orbit (alpha) (2) reference (osculating) epoch (t0) (3-5) position at reference epoch (r0) (6-8) velocity at reference epoch (v0) (9) heliocentric distance at reference epoch (10) r0.v0 (11) date (t) (12) universal eccentric anomaly (psi) of date, approx } \sstsubsection{ jstat = int $*$ (Returned) }{ status: $+$102 = warning, distant epoch $+$101 = warning, large timespan ( $>$ 100 years) $+$1 to $+$10 = coincident with major planet (Note 5) 0 = OK \sstitemlist{ \sstitem 1 = numerical error } } } \sstnotes{ \sstitemlist{ \sstitem The {\tt "}universal{\tt "} elements are those which define the orbit for the purposes of the method of universal variables (see reference 2). They consist of the combined mass of the two bodies, an epoch, and the position and velocity vectors (arbitrary reference frame) at that epoch. The parameter set used here includes also various quantities that can, in fact, be derived from the other information. This approach is taken to avoiding unnecessary computation and loss of accuracy. The supplementary quantities are (i) alpha, which is proportional to the total energy of the orbit, (ii) the heliocentric distance at epoch, (iii) the outwards component of the velocity at the given epoch, (iv) an estimate of psi, the {\tt "}universal eccentric anomaly{\tt "} at a given date and (v) that date. \sstitem The universal elements are with respect to the J2000 equator and equinox. \sstitem The epochs DATE, U(3) and U(12) are all Modified Julian Dates (JD-2400000.5). \sstitem The algorithm is a simplified form of Encke{\tt '}s method. It takes as a basis the unperturbed motion of the body, and numerically integrates the perturbing accelerations from the major planets. The expression used is essentially Sterne{\tt '}s 6.7-2 (reference 1). Everhart and Pitkin (reference 2) suggest rectifying the orbit at each integration step by propagating the new perturbed position and velocity as the new universal variables. In the present routine the orbit is rectified less frequently than this, in order to gain a slight speed advantage. However, the rectification is done directly in terms of position and velocity, as suggested by Everhart and Pitkin, bypassing the use of conventional orbital elements. } The f(q) part of the full Encke method is not used. The purpose of this part is to avoid subtracting two nearly equal quantities when calculating the {\tt "}indirect member{\tt "}, which takes account of the small change in the Sun{\tt '}s attraction due to the slightly displaced position of the perturbed body. A simpler, direct calculation in double precision proves to be faster and not significantly less accurate. Apart from employing a variable timestep, and occasionally {\tt "}rectifying the orbit{\tt "} to keep the indirect member small, the integration is done in a fairly straightforward way. The acceleration estimated for the middle of the timestep is assumed to apply throughout that timestep; it is also used in the extrapolation of the perturbations to the middle of the next timestep, to predict the new disturbed position. There is no iteration within a timestep. Measures are taken to reach a compromise between execution time and accuracy. The starting-point is the goal of achieving arcsecond accuracy for ordinary minor planets over a ten-year timespan. This goal dictates how large the timesteps can be, which in turn dictates how frequently the unperturbed motion has to be recalculated from the osculating elements. Within predetermined limits, the timestep for the numerical integration is varied in length in inverse proportion to the magnitude of the net acceleration on the body from the major planets. The numerical integration requires estimates of the major-planet motions. Approximate positions for the major planets (Pluto alone is omitted) are obtained from the routine palPlanet. Two levels of interpolation are used, to enhance speed without significantly degrading accuracy. At a low frequency, the routine palPlanet is called to generate updated position$+$velocity {\tt "}state vectors{\tt "}. The only task remaining to be carried out at the full frequency (i.e. at each integration step) is to use the state vectors to extrapolate the planetary positions. In place of a strictly linear extrapolation, some allowance is made for the curvature of the orbit by scaling back the radius vector as the linear extrapolation goes off at a tangent. Various other approximations are made. For example, perturbations by Pluto and the minor planets are neglected and relativistic effects are not taken into account. In the interests of simplicity, the background calculations for the major planets are carried out en masse. The mean elements and state vectors for all the planets are refreshed at the same time, without regard for orbit curvature, mass or proximity. The Earth-Moon system is treated as a single body when the body is distant but as separate bodies when closer to the EMB than the parameter RNE, which incurs a time penalty but improves accuracy for near-Earth objects. \sstitemlist{ \sstitem This routine is not intended to be used for major planets. However, if major-planet elements are supplied, sensible results will, in fact, be produced. This happens because the routine checks the separation between the body and each of the planets and interprets a suspiciously small value (0.001 AU) as an attempt to apply the routine to the planet concerned. If this condition is detected, the contribution from that planet is ignored, and the status is set to the planet number (1-10 = Mercury, Venus, EMB, Mars, Jupiter, Saturn, Uranus, Neptune, Earth, Moon) as a warning. } } \sstdiytopic{ See Also }{ \sstitemlist{ \sstitem Sterne, Theodore E., {\tt "}An Introduction to Celestial Mechanics{\tt "}, Interscience Publishers Inc., 1960. Section 6.7, p199. \sstitem Everhart, E. \& Pitkin, E.T., Am.J.Phys. 51, 712, 1983. } } } \sstroutine{ palPlanel }{ Transform conventional elements into position and velocity }{ \sstdescription{ Heliocentric position and velocity of a planet, asteroid or comet, starting from orbital elements. } \sstinvocation{ void palPlanel ( double date, int jform, double epoch, double orbinc, double anode, double perih, double aorq, double e, double aorl, double dm, double pv[6], int $*$jstat ); } \sstarguments{ \sstsubsection{ date = double (Given) }{ Epoch (TT MJD) of osculation (Note 1) } \sstsubsection{ jform = int (Given) }{ Element set actually returned (1-3; Note 3) } \sstsubsection{ epoch = double (Given) }{ Epoch of elements (TT MJD) (Note 4) } \sstsubsection{ orbinc = double (Given) }{ inclination (radians) } \sstsubsection{ anode = double (Given) }{ longitude of the ascending node (radians) } \sstsubsection{ perih = double (Given) }{ longitude or argument of perihelion (radians) } \sstsubsection{ aorq = double (Given) }{ mean distance or perihelion distance (AU) } \sstsubsection{ e = double (Given) }{ eccentricity } \sstsubsection{ aorl = double (Given) }{ mean anomaly or longitude (radians, JFORM=1,2 only) } \sstsubsection{ dm = double (Given) }{ daily motion (radians, JFORM=1 only) } \sstsubsection{ u = double [13] (Returned) }{ Universal orbital elements (Note 1) (0) combined mass (M$+$m) (1) total energy of the orbit (alpha) (2) reference (osculating) epoch (t0) (3-5) position at reference epoch (r0) (6-8) velocity at reference epoch (v0) (9) heliocentric distance at reference epoch (10) r0.v0 (11) date (t) (12) universal eccentric anomaly (psi) of date, approx } \sstsubsection{ jstat = int $*$ (Returned) }{ status: 0 = OK \sstitemlist{ \sstitem -1 = illegal JFORM \sstitem -2 = illegal E \sstitem -3 = illegal AORQ \sstitem -4 = illegal DM \sstitem -5 = numerical error } } } \sstnotes{ \sstitemlist{ \sstitem DATE is the instant for which the prediction is required. It is in the TT timescale (formerly Ephemeris Time, ET) and is a Modified Julian Date (JD-2400000.5). \sstitem The elements are with respect to the J2000 ecliptic and equinox. \sstitem A choice of three different element-set options is available: } Option JFORM = 1, suitable for the major planets: EPOCH = epoch of elements (TT MJD) ORBINC = inclination i (radians) ANODE = longitude of the ascending node, big omega (radians) PERIH = longitude of perihelion, curly pi (radians) AORQ = mean distance, a (AU) E = eccentricity, e (range 0 to $<$1) AORL = mean longitude L (radians) DM = daily motion (radians) Option JFORM = 2, suitable for minor planets: EPOCH = epoch of elements (TT MJD) ORBINC = inclination i (radians) ANODE = longitude of the ascending node, big omega (radians) PERIH = argument of perihelion, little omega (radians) AORQ = mean distance, a (AU) E = eccentricity, e (range 0 to $<$1) AORL = mean anomaly M (radians) Option JFORM = 3, suitable for comets: EPOCH = epoch of elements and perihelion (TT MJD) ORBINC = inclination i (radians) ANODE = longitude of the ascending node, big omega (radians) PERIH = argument of perihelion, little omega (radians) AORQ = perihelion distance, q (AU) E = eccentricity, e (range 0 to 10) Unused arguments (DM for JFORM=2, AORL and DM for JFORM=3) are not accessed. \sstitemlist{ \sstitem Each of the three element sets defines an unperturbed heliocentric orbit. For a given epoch of observation, the position of the body in its orbit can be predicted from these elements, which are called {\tt "}osculating elements{\tt "}, using standard two-body analytical solutions. However, due to planetary perturbations, a given set of osculating elements remains usable for only as long as the unperturbed orbit that it describes is an adequate approximation to reality. Attached to such a set of elements is a date called the {\tt "}osculating epoch{\tt "}, at which the elements are, momentarily, a perfect representation of the instantaneous position and velocity of the body. } Therefore, for any given problem there are up to three different epochs in play, and it is vital to distinguish clearly between them: . The epoch of observation: the moment in time for which the position of the body is to be predicted. . The epoch defining the position of the body: the moment in time at which, in the absence of purturbations, the specified position (mean longitude, mean anomaly, or perihelion) is reached. . The osculating epoch: the moment in time at which the given elements are correct. For the major-planet and minor-planet cases it is usual to make the epoch that defines the position of the body the same as the epoch of osculation. Thus, only two different epochs are involved: the epoch of the elements and the epoch of observation. For comets, the epoch of perihelion fixes the position in the orbit and in general a different epoch of osculation will be chosen. Thus, all three types of epoch are involved. For the present routine: . The epoch of observation is the argument DATE. . The epoch defining the position of the body is the argument EPOCH. . The osculating epoch is not used and is assumed to be close enough to the epoch of observation to deliver adequate accuracy. If not, a preliminary call to sla\_PERTEL may be used to update the element-set (and its associated osculating epoch) by applying planetary perturbations. \sstitemlist{ \sstitem The reference frame for the result is with respect to the mean equator and equinox of epoch J2000. \sstitem The algorithm was originally adapted from the EPHSLA program of D.H.P.Jones (private communication, 1996). The method is based on Stumpff{\tt '}s Universal Variables. } } \sstdiytopic{ See Also }{ Everhart, E. \& Pitkin, E.T., Am.J.Phys. 51, 712, 1983. } } \sstroutine{ palPlanet }{ Approximate heliocentric position and velocity of major planet }{ \sstdescription{ Calculates the approximate heliocentric position and velocity of the specified major planet. } \sstinvocation{ void palPlanet ( double date, int np, double pv[6], int $*$j ); } \sstarguments{ \sstsubsection{ date = double (Given) }{ TDB Modified Julian Date (JD-2400000.5). } \sstsubsection{ np = int (Given) }{ planet (1=Mercury, 2=Venus, 3=EMB, 4=Mars, 5=Jupiter, 6=Saturn, 7=Uranus, 8=Neptune) } \sstsubsection{ pv = double [6] (Returned) }{ heliocentric x,y,z,xdot,ydot,zdot, J2000, equatorial triad in units AU and AU/s. } \sstsubsection{ j = int $*$ (Returned) }{ \sstitemlist{ \sstitem -2 = solution didn{\tt '}t converge. \sstitem -1 = illegal np (1-8) \sstitem 0 = OK \sstitem $+$1 = warning: year outside 1000-3000 } } } \sstnotes{ \sstitemlist{ \sstitem See SOFA/ERFA eraPlan94 for details \sstitem Note that Pluto is supported in SLA/F but not in this routine \sstitem Status -2 is equivalent to eraPlan94 status $+$2. \sstitem Note that velocity units here match the SLA/F documentation. } } } \sstroutine{ palPlante }{ Topocentric RA,Dec of a Solar-System object from heliocentric orbital elements }{ \sstdescription{ Topocentric apparent RA,Dec of a Solar-System object whose heliocentric orbital elements are known. } \sstinvocation{ void palPlante ( double date, double elong, double phi, int jform, double epoch, double orbinc, double anode, double perih, double aorq, double e, double aorl, double dm, double $*$ra, double $*$dec, double $*$r, int $*$jstat ); } \sstarguments{ \sstsubsection{ date = double (Given) }{ TT MJD of observation (JD-2400000.5) } \sstsubsection{ elong = double (Given) }{ Observer{\tt '}s east longitude (radians) } \sstsubsection{ phi = double (Given) }{ Observer{\tt '}s geodetic latitude (radians) } \sstsubsection{ jform = int (Given) }{ Element set actually returned (1-3; Note 6) } \sstsubsection{ epoch = double (Given) }{ Epoch of elements (TT MJD) } \sstsubsection{ orbinc = double (Given) }{ inclination (radians) } \sstsubsection{ anode = double (Given) }{ longitude of the ascending node (radians) } \sstsubsection{ perih = double (Given) }{ longitude or argument of perihelion (radians) } \sstsubsection{ aorq = double (Given) }{ mean distance or perihelion distance (AU) } \sstsubsection{ e = double (Given) }{ eccentricity } \sstsubsection{ aorl = double (Given) }{ mean anomaly or longitude (radians, JFORM=1,2 only) } \sstsubsection{ dm = double (Given) }{ daily motion (radians, JFORM=1 only) } \sstsubsection{ ra = double $*$ (Returned) }{ Topocentric apparent RA (radians) } \sstsubsection{ dec = double $*$ (Returned) }{ Topocentric apparent Dec (radians) } \sstsubsection{ r = double $*$ (Returned) }{ Distance from observer (AU) } \sstsubsection{ jstat = int $*$ (Returned) }{ status: 0 = OK \sstitemlist{ \sstitem -1 = illegal jform \sstitem -2 = illegal e \sstitem -3 = illegal aorq \sstitem -4 = illegal dm \sstitem -5 = numerical error } } } \sstnotes{ \sstitemlist{ \sstitem DATE is the instant for which the prediction is required. It is in the TT timescale (formerly Ephemeris Time, ET) and is a Modified Julian Date (JD-2400000.5). \sstitem The longitude and latitude allow correction for geocentric parallax. This is usually a small effect, but can become important for near-Earth asteroids. Geocentric positions can be generated by appropriate use of routines palEpv (or palEvp) and palUe2pv. \sstitem The elements are with respect to the J2000 ecliptic and equinox. \sstitem A choice of three different element-set options is available: } Option JFORM = 1, suitable for the major planets: EPOCH = epoch of elements (TT MJD) ORBINC = inclination i (radians) ANODE = longitude of the ascending node, big omega (radians) PERIH = longitude of perihelion, curly pi (radians) AORQ = mean distance, a (AU) E = eccentricity, e (range 0 to $<$1) AORL = mean longitude L (radians) DM = daily motion (radians) Option JFORM = 2, suitable for minor planets: EPOCH = epoch of elements (TT MJD) ORBINC = inclination i (radians) ANODE = longitude of the ascending node, big omega (radians) PERIH = argument of perihelion, little omega (radians) AORQ = mean distance, a (AU) E = eccentricity, e (range 0 to $<$1) AORL = mean anomaly M (radians) Option JFORM = 3, suitable for comets: EPOCH = epoch of elements and perihelion (TT MJD) ORBINC = inclination i (radians) ANODE = longitude of the ascending node, big omega (radians) PERIH = argument of perihelion, little omega (radians) AORQ = perihelion distance, q (AU) E = eccentricity, e (range 0 to 10) Unused arguments (DM for JFORM=2, AORL and DM for JFORM=3) are not accessed. \sstitemlist{ \sstitem Each of the three element sets defines an unperturbed heliocentric orbit. For a given epoch of observation, the position of the body in its orbit can be predicted from these elements, which are called {\tt "}osculating elements{\tt "}, using standard two-body analytical solutions. However, due to planetary perturbations, a given set of osculating elements remains usable for only as long as the unperturbed orbit that it describes is an adequate approximation to reality. Attached to such a set of elements is a date called the {\tt "}osculating epoch{\tt "}, at which the elements are, momentarily, a perfect representation of the instantaneous position and velocity of the body. } Therefore, for any given problem there are up to three different epochs in play, and it is vital to distinguish clearly between them: . The epoch of observation: the moment in time for which the position of the body is to be predicted. . The epoch defining the position of the body: the moment in time at which, in the absence of purturbations, the specified position (mean longitude, mean anomaly, or perihelion) is reached. . The osculating epoch: the moment in time at which the given elements are correct. For the major-planet and minor-planet cases it is usual to make the epoch that defines the position of the body the same as the epoch of osculation. Thus, only two different epochs are involved: the epoch of the elements and the epoch of observation. For comets, the epoch of perihelion fixes the position in the orbit and in general a different epoch of osculation will be chosen. Thus, all three types of epoch are involved. For the present routine: . The epoch of observation is the argument DATE. . The epoch defining the position of the body is the argument EPOCH. . The osculating epoch is not used and is assumed to be close enough to the epoch of observation to deliver adequate accuracy. If not, a preliminary call to sla\_PERTEL may be used to update the element-set (and its associated osculating epoch) by applying planetary perturbations. \sstitemlist{ \sstitem Two important sources for orbital elements are Horizons, operated by the Jet Propulsion Laboratory, Pasadena, and the Minor Planet Center, operated by the Center for Astrophysics, Harvard. } The JPL Horizons elements (heliocentric, J2000 ecliptic and equinox) correspond to SLALIB arguments as follows. Major planets: JFORM = 1 EPOCH = JDCT-2400000.5 ORBINC = IN (in radians) ANODE = OM (in radians) PERIH = OM$+$W (in radians) AORQ = A E = EC AORL = MA$+$OM$+$W (in radians) DM = N (in radians) Epoch of osculation = JDCT-2400000.5 Minor planets: JFORM = 2 EPOCH = JDCT-2400000.5 ORBINC = IN (in radians) ANODE = OM (in radians) PERIH = W (in radians) AORQ = A E = EC AORL = MA (in radians) Epoch of osculation = JDCT-2400000.5 Comets: JFORM = 3 EPOCH = Tp-2400000.5 ORBINC = IN (in radians) ANODE = OM (in radians) PERIH = W (in radians) AORQ = QR E = EC Epoch of osculation = JDCT-2400000.5 The MPC elements correspond to SLALIB arguments as follows. Minor planets: JFORM = 2 EPOCH = Epoch-2400000.5 ORBINC = Incl. (in radians) ANODE = Node (in radians) PERIH = Perih. (in radians) AORQ = a E = e AORL = M (in radians) Epoch of osculation = Epoch-2400000.5 Comets: JFORM = 3 EPOCH = T-2400000.5 ORBINC = Incl. (in radians) ANODE = Node. (in radians) PERIH = Perih. (in radians) AORQ = q E = e Epoch of osculation = Epoch-2400000.5 } } \sstroutine{ palPlantu }{ Topocentric RA,Dec of a Solar-System object from universal elements }{ \sstdescription{ Topocentric apparent RA,Dec of a Solar-System object whose heliocentric universal elements are known. } \sstinvocation{ void palPlantu ( double date, double elong, double phi, const double u[13], double $*$ra, double $*$dec, double $*$r, int $*$jstat ) \{ } \sstarguments{ \sstsubsection{ date = double (Given) }{ TT MJD of observation (JD-2400000.5) } \sstsubsection{ elong = double (Given) }{ Observer{\tt '}s east longitude (radians) } \sstsubsection{ phi = double (Given) }{ Observer{\tt '}s geodetic latitude (radians) } \sstsubsection{ u = const double [13] (Given) }{ Universal orbital elements \sstitemlist{ \sstitem (0) combined mass (M$+$m) \sstitem (1) total energy of the orbit (alpha) \sstitem (2) reference (osculating) epoch (t0) \sstitem (3-5) position at reference epoch (r0) \sstitem (6-8) velocity at reference epoch (v0) \sstitem (9) heliocentric distance at reference epoch \sstitem (10) r0.v0 \sstitem (11) date (t) \sstitem (12) universal eccentric anomaly (psi) of date, approx } } \sstsubsection{ ra = double $*$ (Returned) }{ Topocentric apparent RA (radians) } \sstsubsection{ dec = double $*$ (Returned) }{ Topocentric apparent Dec (radians) } \sstsubsection{ r = double $*$ (Returned) }{ Distance from observer (AU) } \sstsubsection{ jstat = int $*$ (Returned) }{ status: 0 = OK \sstitemlist{ \sstitem -1 = radius vector zero \sstitem -2 = failed to converge } } } \sstnotes{ \sstitemlist{ \sstitem DATE is the instant for which the prediction is required. It is in the TT timescale (formerly Ephemeris Time, ET) and is a Modified Julian Date (JD-2400000.5). \sstitem The longitude and latitude allow correction for geocentric parallax. This is usually a small effect, but can become important for near-Earth asteroids. Geocentric positions can be generated by appropriate use of routines palEpv (or palEvp) and palUe2pv. \sstitem The {\tt "}universal{\tt "} elements are those which define the orbit for the purposes of the method of universal variables (see reference 2). They consist of the combined mass of the two bodies, an epoch, and the position and velocity vectors (arbitrary reference frame) at that epoch. The parameter set used here includes also various quantities that can, in fact, be derived from the other information. This approach is taken to avoiding unnecessary computation and loss of accuracy. The supplementary quantities are (i) alpha, which is proportional to the total energy of the orbit, (ii) the heliocentric distance at epoch, (iii) the outwards component of the velocity at the given epoch, (iv) an estimate of psi, the {\tt "}universal eccentric anomaly{\tt "} at a given date and (v) that date. \sstitem The universal elements are with respect to the J2000 equator and equinox. } } \sstdiytopic{ See Also }{ \sstitemlist{ \sstitem Sterne, Theodore E., {\tt "}An Introduction to Celestial Mechanics{\tt "}, Interscience Publishers Inc., 1960. Section 6.7, p199. \sstitem Everhart, E. \& Pitkin, E.T., Am.J.Phys. 51, 712, 1983. } } } \sstroutine{ palPm }{ Apply corrections for proper motion a star RA,Dec }{ \sstdescription{ Apply corrections for proper motion to a star RA,Dec using the SOFA/ERFA routine eraStarpm. } \sstinvocation{ void palPm ( double r0, double d0, double pr, double pd, double px, double rv, double ep0, double ep1, double $*$r1, double $*$d1 ); } \sstarguments{ \sstsubsection{ r0 = double (Given) }{ RA at epoch ep0 (radians) } \sstsubsection{ d0 = double (Given) }{ Dec at epoch ep0 (radians) } \sstsubsection{ pr = double (Given) }{ RA proper motion in radians per year. } \sstsubsection{ pd = double (Given) }{ Dec proper motion in radians per year. } \sstsubsection{ px = double (Given) }{ Parallax (arcsec) } \sstsubsection{ rv = double (Given) }{ Radial velocity (km/sec $+$ve if receding) } \sstsubsection{ ep0 = double (Given) }{ Start epoch in years, assumed to be Julian. } \sstsubsection{ ep1 = double (Given) }{ End epoch in years, assumed to be Julian. } \sstsubsection{ r1 = double $*$ (Returned) }{ RA at epoch ep1 (radians) } \sstsubsection{ d1 = double $*$ (Returned) }{ Dec at epoch ep1 (radians) } } \sstnotes{ \sstitemlist{ \sstitem Uses eraStarpm but ignores the status returns from that routine. In particular note that parallax should not be zero when the proper motions are non-zero. SLA/F allows parallax to be zero. \sstitem Assumes all epochs are Julian epochs. } } } \sstroutine{ palPolmo }{ Correct for polar motion }{ \sstdescription{ Polar motion: correct site longitude and latitude for polar motion and calculate azimuth difference between celestial and terrestrial poles. } \sstinvocation{ palPolmo ( double elongm, double phim, double xp, double yp, double $*$elong, double $*$phi, double $*$daz ); } \sstarguments{ \sstsubsection{ elongm = double (Given) }{ Mean logitude of the observer (radians, east $+$ve) } \sstsubsection{ phim = double (Given) }{ Mean geodetic latitude of the observer (radians) } \sstsubsection{ xp = double (Given) }{ Polar motion x-coordinate (radians) } \sstsubsection{ yp = double (Given) }{ Polar motion y-coordinate (radians) } \sstsubsection{ elong = double $*$ (Returned) }{ True longitude of the observer (radians, east $+$ve) } \sstsubsection{ phi = double $*$ (Returned) }{ True geodetic latitude of the observer (radians) } \sstsubsection{ daz = double $*$ (Returned) }{ Azimuth correction (terrestrial-celestial, radians) } } \sstnotes{ \sstitemlist{ \sstitem {\tt "}Mean{\tt "} longitude and latitude are the (fixed) values for the site{\tt '}s location with respect to the IERS terrestrial reference frame; the latitude is geodetic. TAKE CARE WITH THE LONGITUDE SIGN CONVENTION. The longitudes used by the present routine are east-positive, in accordance with geographical convention (and right-handed). In particular, note that the longitudes returned by the sla\_OBS routine are west-positive, following astronomical usage, and must be reversed in sign before use in the present routine. \sstitem XP and YP are the (changing) coordinates of the Celestial Ephemeris Pole with respect to the IERS Reference Pole. XP is positive along the meridian at longitude 0 degrees, and YP is positive along the meridian at longitude 270 degrees (i.e. 90 degrees west). Values for XP,YP can be obtained from IERS circulars and equivalent publications; the maximum amplitude observed so far is about 0.3 arcseconds. \sstitem {\tt "}True{\tt "} longitude and latitude are the (moving) values for the site{\tt '}s location with respect to the celestial ephemeris pole and the meridian which corresponds to the Greenwich apparent sidereal time. The true longitude and latitude link the terrestrial coordinates with the standard celestial models (for precession, nutation, sidereal time etc). \sstitem The azimuths produced by sla\_AOP and sla\_AOPQK are with respect to due north as defined by the Celestial Ephemeris Pole, and can therefore be called {\tt "}celestial azimuths{\tt "}. However, a telescope fixed to the Earth measures azimuth essentially with respect to due north as defined by the IERS Reference Pole, and can therefore be called {\tt "}terrestrial azimuth{\tt "}. Uncorrected, this would manifest itself as a changing {\tt "}azimuth zero-point error{\tt "}. The value DAZ is the correction to be added to a celestial azimuth to produce a terrestrial azimuth. \sstitem The present routine is rigorous. For most practical purposes, the following simplified formulae provide an adequate approximation: } elong = elongm$+$xp$*$cos(elongm)-yp$*$sin(elongm) phi = phim$+$(xp$*$sin(elongm)$+$yp$*$cos(elongm))$*$tan(phim) daz = -sqrt(xp$*$xp$+$yp$*$yp)$*$cos(elongm-atan2(xp,yp))/cos(phim) An alternative formulation for DAZ is: x = cos(elongm)$*$cos(phim) y = sin(elongm)$*$cos(phim) daz = atan2(-x$*$yp-y$*$xp,x$*$x$+$y$*$y) \sstitemlist{ \sstitem Reference: Seidelmann, P.K. (ed), 1992. {\tt "}Explanatory Supplement to the Astronomical Almanac{\tt "}, ISBN 0-935702-68-7, sections 3.27, 4.25, 4.52. } } } \sstroutine{ palPrebn }{ Generate the matrix of precession between two objects (old) }{ \sstdescription{ Generate the matrix of precession between two epochs, using the old, pre-IAU1976, Bessel-Newcomb model, using Kinoshita{\tt '}s formulation } \sstinvocation{ void palPrebn ( double bep0, double bep1, double rmatp[3][3] ); } \sstarguments{ \sstsubsection{ bep0 = double (Given) }{ Beginning Besselian epoch. } \sstsubsection{ bep1 = double (Given) }{ Ending Besselian epoch } \sstsubsection{ rmatp = double[3][3] (Returned) }{ precession matrix in the sense V(BEP1) = RMATP $*$ V(BEP0) } } \sstdiytopic{ See Also }{ Kinoshita, H. (1975) {\tt '}Formulas for precession{\tt '}, SAO Special Report No. 364, Smithsonian Institution Astrophysical Observatory, Cambridge, Massachusetts. } } \sstroutine{ palPrec }{ Form the matrix of precession between two epochs (IAU 2006) }{ \sstdescription{ The IAU 2006 precession matrix from ep0 to ep1 is found and returned. The matrix is in the sense V(EP1) = RMATP $*$ V(EP0). The epochs are TDB (loosely TT) Julian epochs. Though the matrix method itself is rigorous, the precession angles are expressed through canonical polynomials which are valid only for a limited time span of a few hundred years around the current epoch. } \sstinvocation{ palPrec( double ep0, double ep1, double rmatp[3][3] ) } \sstarguments{ \sstsubsection{ ep0 = double (Given) }{ Beginning epoch } \sstsubsection{ ep1 = double (Given) }{ Ending epoch } \sstsubsection{ rmatp = double[3][3] (Returned) }{ Precession matrix } } } \sstroutine{ palPreces }{ Precession - either FK4 or FK5 as required }{ \sstdescription{ Precess coordinates using the appropriate system and epochs. } \sstinvocation{ void palPreces ( const char sys[3], double ep0, double ep1, double $*$ra, double $*$dc ); } \sstarguments{ \sstsubsection{ sys = const char [3] (Given) }{ Precession to be applied: FK4 or FK5. Case insensitive. } \sstsubsection{ ep0 = double (Given) }{ Starting epoch. } \sstsubsection{ ep1 = double (Given) }{ Ending epoch } \sstsubsection{ ra = double $*$ (Given \& Returned) }{ On input the RA mean equator \& equinox at epoch ep0. On exit the RA mean equator \& equinox of epoch ep1. } \sstsubsection{ dec = double $*$ (Given \& Returned) }{ On input the dec mean equator \& equinox at epoch ep0. On exit the dec mean equator \& equinox of epoch ep1. } } \sstnotes{ \sstitemlist{ \sstitem Uses palPrec for FK5 data and palPrebn for FK4 data. \sstitem The epochs are Besselian if SYSTEM={\tt '}FK4{\tt '} and Julian if {\tt '}FK5{\tt '}. For example, to precess coordinates in the old system from equinox 1900.0 to 1950.0 the call would be: palPreces( {\tt "}FK4{\tt "}, 1900.0, 1950.0, \&ra, \&dc ); \sstitem This routine will NOT correctly convert between the old and the new systems - for example conversion from B1950 to J2000. For these purposes see palFk425, palFk524, palFk45z and palFk54z. \sstitem If an invalid SYSTEM is supplied, values of -99D0,-99D0 will be returned for both RA and DC. } } } \sstroutine{ palPrenut }{ Form the matrix of bias-precession-nutation (IAU 2006/2000A) }{ \sstdescription{ Form the matrix of bias-precession-nutation (IAU 2006/2000A). The epoch and date are TT (but TDB is usually close enough). The matrix is in the sense v(true) = rmatpn $*$ v(mean). } \sstinvocation{ void palPrenut( double epoch, double date, double rmatpn[3][3] ) } \sstarguments{ \sstsubsection{ epoch = double (Returned) }{ Julian epoch for mean coordinates. } \sstsubsection{ date = double (Returned) }{ Modified Julian Date (JD-2400000.5) for true coordinates. } \sstsubsection{ rmatpn = double[3][3] (Returned) }{ combined NPB matrix } } } \sstroutine{ palPv2el }{ Position velocity to heliocentirc osculating elements }{ \sstdescription{ Heliocentric osculating elements obtained from instantaneous position and velocity. } \sstinvocation{ void palPv2el ( const double pv[6], double date, double pmass, int jformr, int $*$jform, double $*$epoch, double $*$orbinc, double $*$anode, double $*$perih, double $*$aorq, double $*$e, double $*$aorl, double $*$dm, int $*$jstat ); } \sstarguments{ \sstsubsection{ pv = const double [6] (Given) }{ Heliocentric x,y,z,xdot,ydot,zdot of date, J2000 equatorial triad (AU,AU/s; Note 1) } \sstsubsection{ date = double (Given) }{ Date (TT Modified Julian Date = JD-2400000.5) } \sstsubsection{ pmass = double (Given) }{ Mass of the planet (Sun=1; Note 2) } \sstsubsection{ jformr = int (Given) }{ Requested element set (1-3; Note 3) } \sstsubsection{ jform = int $*$ (Returned) }{ Element set actually returned (1-3; Note 4) } \sstsubsection{ epoch = double $*$ (Returned) }{ Epoch of elements (TT MJD) } \sstsubsection{ orbinc = double $*$ (Returned) }{ inclination (radians) } \sstsubsection{ anode = double $*$ (Returned) }{ longitude of the ascending node (radians) } \sstsubsection{ perih = double $*$ (Returned) }{ longitude or argument of perihelion (radians) } \sstsubsection{ aorq = double $*$ (Returned) }{ mean distance or perihelion distance (AU) } \sstsubsection{ e = double $*$ (Returned) }{ eccentricity } \sstsubsection{ aorl = double $*$ (Returned) }{ mean anomaly or longitude (radians, JFORM=1,2 only) } \sstsubsection{ dm = double $*$ (Returned) }{ daily motion (radians, JFORM=1 only) } \sstsubsection{ jstat = int $*$ (Returned) }{ status: 0 = OK \sstitemlist{ \sstitem -1 = illegal PMASS \sstitem -2 = illegal JFORMR \sstitem -3 = position/velocity out of range } } } \sstnotes{ \sstitemlist{ \sstitem The PV 6-vector is with respect to the mean equator and equinox of epoch J2000. The orbital elements produced are with respect to the J2000 ecliptic and mean equinox. \sstitem The mass, PMASS, is important only for the larger planets. For most purposes (e.g. asteroids) use 0D0. Values less than zero are illegal. \sstitem Three different element-format options are supported: } Option JFORM=1, suitable for the major planets: EPOCH = epoch of elements (TT MJD) ORBINC = inclination i (radians) ANODE = longitude of the ascending node, big omega (radians) PERIH = longitude of perihelion, curly pi (radians) AORQ = mean distance, a (AU) E = eccentricity, e AORL = mean longitude L (radians) DM = daily motion (radians) Option JFORM=2, suitable for minor planets: EPOCH = epoch of elements (TT MJD) ORBINC = inclination i (radians) ANODE = longitude of the ascending node, big omega (radians) PERIH = argument of perihelion, little omega (radians) AORQ = mean distance, a (AU) E = eccentricity, e AORL = mean anomaly M (radians) Option JFORM=3, suitable for comets: EPOCH = epoch of perihelion (TT MJD) ORBINC = inclination i (radians) ANODE = longitude of the ascending node, big omega (radians) PERIH = argument of perihelion, little omega (radians) AORQ = perihelion distance, q (AU) E = eccentricity, e \sstitemlist{ \sstitem It may not be possible to generate elements in the form requested through JFORMR. The caller is notified of the form of elements actually returned by means of the JFORM argument: } JFORMR JFORM meaning 1 1 OK - elements are in the requested format 1 2 never happens 1 3 orbit not elliptical 2 1 never happens 2 2 OK - elements are in the requested format 2 3 orbit not elliptical 3 1 never happens 3 2 never happens 3 3 OK - elements are in the requested format \sstitemlist{ \sstitem The arguments returned for each value of JFORM (cf Note 5: JFORM may not be the same as JFORMR) are as follows: } JFORM 1 2 3 EPOCH t0 t0 T ORBINC i i i ANODE Omega Omega Omega PERIH curly pi omega omega AORQ a a q E e e e AORL L M - DM n - - where: t0 is the epoch of the elements (MJD, TT) T {\tt "} epoch of perihelion (MJD, TT) i {\tt "} inclination (radians) Omega {\tt "} longitude of the ascending node (radians) curly pi {\tt "} longitude of perihelion (radians) omega {\tt "} argument of perihelion (radians) a {\tt "} mean distance (AU) q {\tt "} perihelion distance (AU) e {\tt "} eccentricity L {\tt "} longitude (radians, 0-2pi) M {\tt "} mean anomaly (radians, 0-2pi) n {\tt "} daily motion (radians) \sstitemlist{ \sstitem means no value is set \sstitem At very small inclinations, the longitude of the ascending node ANODE becomes indeterminate and under some circumstances may be set arbitrarily to zero. Similarly, if the orbit is close to circular, the true anomaly becomes indeterminate and under some circumstances may be set arbitrarily to zero. In such cases, the other elements are automatically adjusted to compensate, and so the elements remain a valid description of the orbit. \sstitem The osculating epoch for the returned elements is the argument DATE. \sstitem Reference: Sterne, Theodore E., {\tt "}An Introduction to Celestial Mechanics{\tt "}, Interscience Publishers, 1960 } } } \sstroutine{ palPv2ue }{ Universal elements to position and velocity }{ \sstdescription{ Construct a universal element set based on an instantaneous position and velocity. } \sstinvocation{ void palPv2ue( const double pv[6], double date, double pmass, double u[13], int $*$ jstat ); } \sstarguments{ \sstsubsection{ pv = double [6] (Given) }{ Heliocentric x,y,z,xdot,ydot,zdot of date, (AU,AU/s; Note 1) } \sstsubsection{ date = double (Given) }{ Date (TT modified Julian Date = JD-2400000.5) } \sstsubsection{ pmass = double (Given) }{ Mass of the planet (Sun=1; note 2) } \sstsubsection{ u = double [13] (Returned) }{ Universal orbital elements (Note 3) \sstitemlist{ \sstitem (0) combined mass (M$+$m) \sstitem (1) total energy of the orbit (alpha) \sstitem (2) reference (osculating) epoch (t0) \sstitem (3-5) position at reference epoch (r0) \sstitem (6-8) velocity at reference epoch (v0) \sstitem (9) heliocentric distance at reference epoch \sstitem (10) r0.v0 \sstitem (11) date (t) \sstitem (12) universal eccentric anomaly (psi) of date, approx } } \sstsubsection{ jstat = int $*$ (Returned) }{ status: 0 = OK \sstitemlist{ \sstitem -1 = illegal PMASS \sstitem -2 = too close to Sun \sstitem -3 = too slow } } } \sstnotes{ \sstitemlist{ \sstitem The PV 6-vector can be with respect to any chosen inertial frame, and the resulting universal-element set will be with respect to the same frame. A common choice will be mean equator and ecliptic of epoch J2000. \sstitem The mass, PMASS, is important only for the larger planets. For most purposes (e.g. asteroids) use 0D0. Values less than zero are illegal. \sstitem The {\tt "}universal{\tt "} elements are those which define the orbit for the purposes of the method of universal variables (see reference). They consist of the combined mass of the two bodies, an epoch, and the position and velocity vectors (arbitrary reference frame) at that epoch. The parameter set used here includes also various quantities that can, in fact, be derived from the other information. This approach is taken to avoiding unnecessary computation and loss of accuracy. The supplementary quantities are (i) alpha, which is proportional to the total energy of the orbit, (ii) the heliocentric distance at epoch, (iii) the outwards component of the velocity at the given epoch, (iv) an estimate of psi, the {\tt "}universal eccentric anomaly{\tt "} at a given date and (v) that date. \sstitem Reference: Everhart, E. \& Pitkin, E.T., Am.J.Phys. 51, 712, 1983. } } } \sstroutine{ palPvobs }{ Position and velocity of an observing station }{ \sstdescription{ Returns the position and velocity of an observing station. } \sstinvocation{ palPvobs( double p, double h, double stl, double pv[6] ) } \sstarguments{ \sstsubsection{ p = double (Given) }{ Latitude (geodetic, radians). } \sstsubsection{ h = double (Given) }{ Height above reference spheroid (geodetic, metres). } \sstsubsection{ stl = double (Given) }{ Local apparent sidereal time (radians). } \sstsubsection{ pv = double[ 6 ] (Returned) }{ position/velocity 6-vector (AU, AU/s, true equator and equinox of date). } } \sstnotes{ \sstitemlist{ \sstitem The WGS84 reference ellipsoid is used. } } } \sstroutine{ palRdplan }{ Approximate topocentric apparent RA,Dec of a planet }{ \sstdescription{ Approximate topocentric apparent RA,Dec of a planet, and its angular diameter. } \sstinvocation{ void palRdplan( double date, int np, double elong, double phi, double $*$ ra, double $*$ dec, double $*$ diam ); } \sstarguments{ \sstsubsection{ date = double (Given) }{ MJD of observation (JD-2400000.5) in TDB. For all practical purposes TT can be used instead of TDB, and for many applications UT will do (except for the Moon). } \sstsubsection{ np = int (Given) }{ Planet: 1 = Mercury 2 = Venus 3 = Moon 4 = Mars 5 = Jupiter 6 = Saturn 7 = Uranus 8 = Neptune else = Sun } \sstsubsection{ elong = double (Given) }{ Observer{\tt '}s east longitude (radians) } \sstsubsection{ phi = double (Given) }{ Observer{\tt '}s geodetic latitude (radians) } \sstsubsection{ ra = double $*$ (Returned) }{ RA (topocentric apparent, radians) } \sstsubsection{ dec = double $*$ (Returned) }{ Dec (topocentric apparent, radians) } \sstsubsection{ diam = double $*$ (Returned) }{ Angular diameter (equatorial, radians) } } \sstnotes{ \sstitemlist{ \sstitem Unlike with slaRdplan, Pluto is not supported. \sstitem The longitude and latitude allow correction for geocentric parallax. This is a major effect for the Moon, but in the context of the limited accuracy of the present routine its effect on planetary positions is small (negligible for the outer planets). Geocentric positions can be generated by appropriate use of the routines palDmoon and eraPlan94. } } } \sstroutine{ palRefco }{ Determine constants in atmospheric refraction model }{ \sstdescription{ Determine the constants A and B in the atmospheric refraction model dZ = A tan Z $+$ B tan$*$$*$3 Z. Z is the {\tt "}observed{\tt "} zenith distance (i.e. affected by refraction) and dZ is what to add to Z to give the {\tt "}topocentric{\tt "} (i.e. in vacuo) zenith distance. } \sstinvocation{ void palRefco ( double hm, double tdk, double pmb, double rh, double wl, double phi, double tlr, double eps, double $*$refa, double $*$refb ); } \sstarguments{ \sstsubsection{ hm = double (Given) }{ Height of the observer above sea level (metre) } \sstsubsection{ tdk = double (Given) }{ Ambient temperature at the observer (K) } \sstsubsection{ pmb = double (Given) }{ Pressure at the observer (millibar) } \sstsubsection{ rh = double (Given) }{ Relative humidity at the observer (range 0-1) } \sstsubsection{ wl = double (Given) }{ Effective wavelength of the source (micrometre) } \sstsubsection{ phi = double (Given) }{ Latitude of the observer (radian, astronomical) } \sstsubsection{ tlr = double (Given) }{ Temperature lapse rate in the troposphere (K/metre) } \sstsubsection{ eps = double (Given) }{ Precision required to terminate iteration (radian) } \sstsubsection{ refa = double $*$ (Returned) }{ tan Z coefficient (radian) } \sstsubsection{ refb = double $*$ (Returned) }{ tan$*$$*$3 Z coefficient (radian) } } \sstnotes{ \sstitemlist{ \sstitem Typical values for the TLR and EPS arguments might be 0.0065 and 1E-10 respectively. \sstitem The radio refraction is chosen by specifying WL $>$ 100 micrometres. \sstitem The routine is a slower but more accurate alternative to the palRefcoq routine. The constants it produces give perfect agreement with palRefro at zenith distances arctan(1) (45 deg) and arctan(4) (about 76 deg). It achieves 0.5 arcsec accuracy for ZD $<$ 80 deg, 0.01 arcsec accuracy for ZD $<$ 60 deg, and 0.001 arcsec accuracy for ZD $<$ 45 deg. } } } \sstroutine{ palRefro }{ Atmospheric refraction for radio and optical/IR wavelengths }{ \sstdescription{ Calculates the atmospheric refraction for radio and optical/IR wavelengths. } \sstinvocation{ void palRefro( double zobs, double hm, double tdk, double pmb, } \sstarguments{ \sstsubsection{ zobs = double (Given) }{ Observed zenith distance of the source (radian) } \sstsubsection{ hm = double (Given) }{ Height of the observer above sea level (metre) } \sstsubsection{ tdk = double (Given) }{ Ambient temperature at the observer (K) } \sstsubsection{ pmb = double (Given) }{ Pressure at the observer (millibar) } \sstsubsection{ rh = double (Given) }{ Relative humidity at the observer (range 0-1) } \sstsubsection{ wl = double (Given) }{ Effective wavelength of the source (micrometre) } \sstsubsection{ phi = double (Given) }{ Latitude of the observer (radian, astronomical) } \sstsubsection{ tlr = double (Given) }{ Temperature lapse rate in the troposphere (K/metre) } \sstsubsection{ eps = double (Given) }{ Precision required to terminate iteration (radian) } \sstsubsection{ ref = double $*$ (Returned) }{ Refraction: in vacuao ZD minus observed ZD (radian) } } \sstnotes{ \sstitemlist{ \sstitem A suggested value for the TLR argument is 0.0065. The refraction is significantly affected by TLR, and if studies of the local atmosphere have been carried out a better TLR value may be available. The sign of the supplied TLR value is ignored. \sstitem A suggested value for the EPS argument is 1E-8. The result is usually at least two orders of magnitude more computationally precise than the supplied EPS value. \sstitem The routine computes the refraction for zenith distances up to and a little beyond 90 deg using the method of Hohenkerk and Sinclair (NAO Technical Notes 59 and 63, subsequently adopted in the Explanatory Supplement, 1992 edition - see section 3.281). \sstitem The code is a development of the optical/IR refraction subroutine AREF of C.Hohenkerk (HMNAO, September 1984), with extensions to support the radio case. Apart from merely cosmetic changes, the following modifications to the original HMNAO optical/IR refraction code have been made: } . The angle arguments have been changed to radians. . Any value of ZOBS is allowed (see note 6, below). . Other argument values have been limited to safe values. . Murray{\tt '}s values for the gas constants have been used (Vectorial Astrometry, Adam Hilger, 1983). . The numerical integration phase has been rearranged for extra clarity. . A better model for Ps(T) has been adopted (taken from Gill, Atmosphere-Ocean Dynamics, Academic Press, 1982). . More accurate expressions for Pwo have been adopted (again from Gill 1982). . The formula for the water vapour pressure, given the saturation pressure and the relative humidity, is from Crane (1976), expression 2.5.5. . Provision for radio wavelengths has been added using expressions devised by A.T.Sinclair, RGO (private communication 1989). The refractivity model currently used is from J.M.Rueger, {\tt "}Refractive Index Formulae for Electronic Distance Measurement with Radio and Millimetre Waves{\tt "}, in Unisurv Report S-68 (2002), School of Surveying and Spatial Information Systems, University of New South Wales, Sydney, Australia. . The optical refractivity for dry air is from Resolution 3 of the International Association of Geodesy adopted at the XXIIth General Assembly in Birmingham, UK, 1999. . Various small changes have been made to gain speed. \sstitemlist{ \sstitem The radio refraction is chosen by specifying WL $>$ 100 micrometres. Because the algorithm takes no account of the ionosphere, the accuracy deteriorates at low frequencies, below about 30 MHz. \sstitem Before use, the value of ZOBS is expressed in the range $+$/- pi. If this ranged ZOBS is -ve, the result REF is computed from its absolute value before being made -ve to match. In addition, if it has an absolute value greater than 93 deg, a fixed REF value equal to the result for ZOBS = 93 deg is returned, appropriately signed. \sstitem As in the original Hohenkerk and Sinclair algorithm, fixed values of the water vapour polytrope exponent, the height of the tropopause, and the height at which refraction is negligible are used. \sstitem The radio refraction has been tested against work done by Iain Coulson, JACH, (private communication 1995) for the James Clerk Maxwell Telescope, Mauna Kea. For typical conditions, agreement at the 0.1 arcsec level is achieved for moderate ZD, worsening to perhaps 0.5-1.0 arcsec at ZD 80 deg. At hot and humid sea-level sites the accuracy will not be as good. \sstitem It should be noted that the relative humidity RH is formally defined in terms of {\tt "}mixing ratio{\tt "} rather than pressures or densities as is often stated. It is the mass of water per unit mass of dry air divided by that for saturated air at the same temperature and pressure (see Gill 1982). \sstitem The algorithm is designed for observers in the troposphere. The supplied temperature, pressure and lapse rate are assumed to be for a point in the troposphere and are used to define a model atmosphere with the tropopause at 11km altitude and a constant temperature above that. However, in practice, the refraction values returned for stratospheric observers, at altitudes up to 25km, are quite usable. } } } \sstroutine{ palRefv }{ Adjust an unrefracted Cartesian vector to include the effect of atmospheric refraction }{ \sstdescription{ Adjust an unrefracted Cartesian vector to include the effect of atmospheric refraction, using the simple A tan Z $+$ B tan$*$$*$3 Z model. } \sstinvocation{ void palRefv ( double vu[3], double refa, double refb, double vr[3] ); } \sstarguments{ \sstsubsection{ vu[3] = double (Given) }{ Unrefracted position of the source (Az/El 3-vector) } \sstsubsection{ refa = double (Given) }{ tan Z coefficient (radian) } \sstsubsection{ refb = double (Given) }{ tan$*$$*$3 Z coefficient (radian) } \sstsubsection{ vr[3] = double (Returned) }{ Refracted position of the source (Az/El 3-vector) } } \sstnotes{ \sstitemlist{ \sstitem This routine applies the adjustment for refraction in the opposite sense to the usual one - it takes an unrefracted (in vacuo) position and produces an observed (refracted) position, whereas the A tan Z $+$ B tan$*$$*$3 Z model strictly applies to the case where an observed position is to have the refraction removed. The unrefracted to refracted case is harder, and requires an inverted form of the text-book refraction models; the algorithm used here is equivalent to one iteration of the Newton-Raphson method applied to the above formula. \sstitem Though optimized for speed rather than precision, the present routine achieves consistency with the refracted-to-unrefracted A tan Z $+$ B tan$*$$*$3 Z model at better than 1 microarcsecond within 30 degrees of the zenith and remains within 1 milliarcsecond to beyond ZD 70 degrees. The inherent accuracy of the model is, of course, far worse than this - see the documentation for sla\_REFCO for more information. \sstitem At low elevations (below about 3 degrees) the refraction correction is held back to prevent arithmetic problems and wildly wrong results. For optical/IR wavelengths, over a wide range of observer heights and corresponding temperatures and pressures, the following levels of accuracy (arcsec, worst case) are achieved, relative to numerical integration through a model atmosphere: } ZD error 80 0.7 81 1.3 82 2.5 83 5 84 10 85 20 86 55 87 160 88 360 89 640 90 1100 91 1700 \} relevant only to 92 2600 \} high-elevation sites The results for radio are slightly worse over most of the range, becoming significantly worse below ZD=88 and unusable beyond ZD=90. \sstitemlist{ \sstitem See also the routine palRefz, which performs the adjustment to the zenith distance rather than in Cartesian Az/El coordinates. The present routine is faster than palRefz and, except very low down, is equally accurate for all practical purposes. However, beyond about ZD 84 degrees palRefz should be used, and for the utmost accuracy iterative use of palRefro should be considered. } } } \sstroutine{ palRefz }{ Adjust unrefracted zenith distance }{ \sstdescription{ Adjust an unrefracted zenith distance to include the effect of atmospheric refraction, using the simple A tan Z $+$ B tan$*$$*$3 Z model (plus special handling for large ZDs). } \sstinvocation{ void palRefz ( double zu, double refa, double refb, double $*$zr ); } \sstarguments{ \sstsubsection{ zu = double (Given) }{ Unrefracted zenith distance of the source (radians) } \sstsubsection{ refa = double (Given) }{ tan Z coefficient (radians) } \sstsubsection{ refb = double (Given) }{ tan$*$$*$3 Z coefficient (radian) } \sstsubsection{ zr = double $*$ (Returned) }{ Refracted zenith distance (radians) } } \sstnotes{ \sstitemlist{ \sstitem This routine applies the adjustment for refraction in the opposite sense to the usual one - it takes an unrefracted (in vacuo) position and produces an observed (refracted) position, whereas the A tan Z $+$ B tan$*$$*$3 Z model strictly applies to the case where an observed position is to have the refraction removed. The unrefracted to refracted case is harder, and requires an inverted form of the text-book refraction models; the formula used here is based on the Newton-Raphson method. For the utmost numerical consistency with the refracted to unrefracted model, two iterations are carried out, achieving agreement at the 1D-11 arcseconds level for a ZD of 80 degrees. The inherent accuracy of the model is, of course, far worse than this - see the documentation for palRefco for more information. \sstitem At ZD 83 degrees, the rapidly-worsening A tan Z $+$ B tan$\wedge$3 Z model is abandoned and an empirical formula takes over. For optical/IR wavelengths, over a wide range of observer heights and corresponding temperatures and pressures, the following levels of accuracy (arcsec, worst case) are achieved, relative to numerical integration through a model atmosphere: } ZR error 80 0.7 81 1.3 82 2.4 83 4.7 84 6.2 85 6.4 86 8 87 10 88 15 89 30 90 60 91 150 \} relevant only to 92 400 \} high-elevation sites For radio wavelengths the errors are typically 50\% larger than the optical figures and by ZD 85 deg are twice as bad, worsening rapidly below that. To maintain 1 arcsec accuracy down to ZD=85 at the Green Bank site, Condon (2004) has suggested amplifying the amount of refraction predicted by palRefz below 10.8 deg elevation by the factor (1$+$0.00195$*$(10.8-E\_t)), where E\_t is the unrefracted elevation in degrees. The high-ZD model is scaled to match the normal model at the transition point; there is no glitch. \sstitemlist{ \sstitem Beyond 93 deg zenith distance, the refraction is held at its 93 deg value. \sstitem See also the routine palRefv, which performs the adjustment in Cartesian Az/El coordinates, and with the emphasis on speed rather than numerical accuracy. } } \sstdiytopic{ References }{ Condon,J.J., Refraction Corrections for the GBT, PTCS/PN/35.2, NRAO Green Bank, 2004. } } \sstroutine{ palRverot }{ Velocity component in a given direction due to Earth rotation }{ \sstdescription{ Calculate the velocity component in a given direction due to Earth rotation. The simple algorithm used assumes a spherical Earth, of a radius chosen to give results accurate to about 0.0005 km/s for observing stations at typical latitudes and heights. For applications requiring greater precision, use the routine palPvobs. } \sstinvocation{ double palRverot ( double phi, double ra, double da, double st ); } \sstarguments{ \sstsubsection{ phi = double (Given) }{ latitude of observing station (geodetic) (radians) } \sstsubsection{ ra = double (Given) }{ apparent RA (radians) } \sstsubsection{ da = double (Given) }{ apparent Dec (radians) } \sstsubsection{ st = double (Given) }{ } } \sstreturnedvalue{ \sstsubsection{ palRverot = double }{ Component of Earth rotation in direction RA,DA (km/s). The result is $+$ve when the observatory is receding from the given point on the sky. } } } \sstroutine{ palRvgalc }{ Velocity component in a given direction due to the rotation of the Galaxy }{ \sstdescription{ This function returns the Component of dynamical LSR motion in the direction of R2000,D2000. The result is $+$ve when the dynamical LSR is receding from the given point on the sky. } \sstinvocation{ double palRvgalc( double r2000, double d2000 ) } \sstarguments{ \sstsubsection{ r2000 = double (Given) }{ J2000.0 mean RA (radians) } \sstsubsection{ d2000 = double (Given) }{ J2000.0 mean Dec (radians) } } \sstreturnedvalue{ \sstsubsection{ Component of dynamical LSR motion in direction R2000,D2000 (km/s). }{ } } \sstnotes{ \sstitemlist{ \sstitem The Local Standard of Rest used here is a point in the vicinity of the Sun which is in a circular orbit around the Galactic centre. Sometimes called the {\tt "}dynamical{\tt "} LSR, it is not to be confused with a {\tt "}kinematical{\tt "} LSR, which is the mean standard of rest of star catalogues or stellar populations. } } \sstdiytopic{ Reference }{ \sstitemlist{ \sstitem The orbital speed of 220 km/s used here comes from Kerr \& Lynden-Bell (1986), MNRAS, 221, p1023. } } } \sstroutine{ palRvlg }{ Velocity component in a given direction due to Galactic rotation and motion of the local group }{ \sstdescription{ This function returns the velocity component in a given direction due to the combination of the rotation of the Galaxy and the motion of the Galaxy relative to the mean motion of the local group. The result is $+$ve when the Sun is receding from the given point on the sky. } \sstinvocation{ double palRvlg( double r2000, double d2000 ) } \sstarguments{ \sstsubsection{ r2000 = double (Given) }{ J2000.0 mean RA (radians) } \sstsubsection{ d2000 = double (Given) }{ J2000.0 mean Dec (radians) } } \sstreturnedvalue{ \sstsubsection{ Component of SOLAR motion in direction R2000,D2000 (km/s). }{ } } \sstdiytopic{ Reference }{ \sstitemlist{ \sstitem IAU Trans 1976, 168, p201. } } } \sstroutine{ palRvlsrd }{ Velocity component in a given direction due to the Sun{\tt '}s motion with respect to the dynamical Local Standard of Rest }{ \sstdescription{ This function returns the velocity component in a given direction due to the Sun{\tt '}s motion with respect to the dynamical Local Standard of Rest. The result is $+$ve when the Sun is receding from the given point on the sky. } \sstinvocation{ double palRvlsrd( double r2000, double d2000 ) } \sstarguments{ \sstsubsection{ r2000 = double (Given) }{ J2000.0 mean RA (radians) } \sstsubsection{ d2000 = double (Given) }{ J2000.0 mean Dec (radians) } } \sstreturnedvalue{ \sstsubsection{ Component of {\tt "}peculiar{\tt "} solar motion in direction R2000,D2000 (km/s). }{ } } \sstnotes{ \sstitemlist{ \sstitem The Local Standard of Rest used here is the {\tt "}dynamical{\tt "} LSR, a point in the vicinity of the Sun which is in a circular orbit around the Galactic centre. The Sun{\tt '}s motion with respect to the dynamical LSR is called the {\tt "}peculiar{\tt "} solar motion. \sstitem There is another type of LSR, called a {\tt "}kinematical{\tt "} LSR. A kinematical LSR is the mean standard of rest of specified star catalogues or stellar populations, and several slightly different kinematical LSRs are in use. The Sun{\tt '}s motion with respect to an agreed kinematical LSR is known as the {\tt "}standard{\tt "} solar motion. To obtain a radial velocity correction with respect to an adopted kinematical LSR use the routine sla\_RVLSRK. } } \sstdiytopic{ Reference }{ \sstitemlist{ \sstitem Delhaye (1965), in {\tt "}Stars and Stellar Systems{\tt "}, vol 5, p73. } } } \sstroutine{ palRvlsrk }{ Velocity component in a given direction due to the Sun{\tt '}s motion with respect to an adopted kinematic Local Standard of Rest }{ \sstdescription{ This function returns the velocity component in a given direction due to the Sun{\tt '}s motion with respect to an adopted kinematic Local Standard of Rest. The result is $+$ve when the Sun is receding from the given point on the sky. } \sstinvocation{ double palRvlsrk( double r2000, double d2000 ) } \sstarguments{ \sstsubsection{ r2000 = double (Given) }{ J2000.0 mean RA (radians) } \sstsubsection{ d2000 = double (Given) }{ J2000.0 mean Dec (radians) } } \sstreturnedvalue{ \sstsubsection{ Component of {\tt "}standard{\tt "} solar motion in direction R2000,D2000 (km/s). }{ } } \sstnotes{ \sstitemlist{ \sstitem The Local Standard of Rest used here is one of several {\tt "}kinematical{\tt "} LSRs in common use. A kinematical LSR is the mean standard of rest of specified star catalogues or stellar populations. The Sun{\tt '}s motion with respect to a kinematical LSR is known as the {\tt "}standard{\tt "} solar motion. \sstitem There is another sort of LSR, the {\tt "}dynamical{\tt "} LSR, which is a point in the vicinity of the Sun which is in a circular orbit around the Galactic centre. The Sun{\tt '}s motion with respect to the dynamical LSR is called the {\tt "}peculiar{\tt "} solar motion. To obtain a radial velocity correction with respect to the dynamical LSR use the routine sla\_RVLSRD. } } \sstdiytopic{ Reference }{ \sstitemlist{ \sstitem Delhaye (1965), in {\tt "}Stars and Stellar Systems{\tt "}, vol 5, p73. } } } \sstroutine{ palSubet }{ Remove the E-terms from a pre IAU 1976 catalogue RA,Dec }{ \sstdescription{ Remove the E-terms (elliptic component of annual aberration) from a pre IAU 1976 catalogue RA,Dec to give a mean place. } \sstinvocation{ void palSubet ( double rc, double dc, double eq, double $*$rm, double $*$dm ); } \sstarguments{ \sstsubsection{ rc = double (Given) }{ RA with E-terms included (radians) } \sstsubsection{ dc = double (Given) }{ Dec with E-terms included (radians) } \sstsubsection{ eq = double (Given) }{ Besselian epoch of mean equator and equinox } \sstsubsection{ rm = double $*$ (Returned) }{ RA without E-terms (radians) } \sstsubsection{ dm = double $*$ (Returned) }{ Dec without E-terms (radians) } } \sstnotes{ Most star positions from pre-1984 optical catalogues (or derived from astrometry using such stars) embody the E-terms. This routine converts such a position to a formal mean place (allowing, for example, comparison with a pulsar timing position). } \sstdiytopic{ See Also }{ Explanatory Supplement to the Astronomical Ephemeris, section 2D, page 48. } } \sstroutine{ palSupgal }{ Convert from supergalactic to galactic coordinates }{ \sstdescription{ Transformation from de Vaucouleurs supergalactic coordinates to IAU 1958 galactic coordinates } \sstinvocation{ void palSupgal ( double dsl, double dsb, double $*$dl, double $*$db ); } \sstarguments{ \sstsubsection{ dsl = double (Given) }{ Supergalactic longitude. } \sstsubsection{ dsb = double (Given) }{ Supergalactic latitude. } \sstsubsection{ dl = double $*$ (Returned) }{ Galactic longitude. } \sstsubsection{ db = double $*$ (Returned) }{ Galactic latitude. } } \sstdiytopic{ See Also }{ \sstitemlist{ \sstitem de Vaucouleurs, de Vaucouleurs, \& Corwin, Second Reference Catalogue of Bright Galaxies, U. Texas, page 8. \sstitem Systems \& Applied Sciences Corp., Documentation for the machine-readable version of the above catalogue, Contract NAS 5-26490. } (These two references give different values for the galactic longitude of the supergalactic origin. Both are wrong; the correct value is L2=137.37.) } } \sstroutine{ palUe2el }{ Universal elements to heliocentric osculating elements }{ \sstdescription{ Transform universal elements into conventional heliocentric osculating elements. } \sstinvocation{ void palUe2el ( const double u[13], int jformr, int $*$jform, double $*$epoch, double $*$orbinc, double $*$anode, double $*$perih, double $*$aorq, double $*$e, double $*$aorl, double $*$dm, int $*$jstat ); } \sstarguments{ \sstsubsection{ u = const double [13] (Given) }{ Universal orbital elements (Note 1) (0) combined mass (M$+$m) (1) total energy of the orbit (alpha) (2) reference (osculating) epoch (t0) (3-5) position at reference epoch (r0) (6-8) velocity at reference epoch (v0) (9) heliocentric distance at reference epoch (10) r0.v0 (11) date (t) (12) universal eccentric anomaly (psi) of date, approx } \sstsubsection{ jformr = int (Given) }{ Requested element set (1-3; Note 3) } \sstsubsection{ jform = int $*$ (Returned) }{ Element set actually returned (1-3; Note 4) } \sstsubsection{ epoch = double $*$ (Returned) }{ Epoch of elements (TT MJD) } \sstsubsection{ orbinc = double $*$ (Returned) }{ inclination (radians) } \sstsubsection{ anode = double $*$ (Returned) }{ longitude of the ascending node (radians) } \sstsubsection{ perih = double $*$ (Returned) }{ longitude or argument of perihelion (radians) } \sstsubsection{ aorq = double $*$ (Returned) }{ mean distance or perihelion distance (AU) } \sstsubsection{ e = double $*$ (Returned) }{ eccentricity } \sstsubsection{ aorl = double $*$ (Returned) }{ mean anomaly or longitude (radians, JFORM=1,2 only) } \sstsubsection{ dm = double $*$ (Returned) }{ daily motion (radians, JFORM=1 only) } \sstsubsection{ jstat = int $*$ (Returned) }{ status: 0 = OK \sstitemlist{ \sstitem 1 = illegal combined mass \sstitem 2 = illegal JFORMR \sstitem 3 = position/velocity out of range } } } \sstnotes{ \sstitemlist{ \sstitem The {\tt "}universal{\tt "} elements are those which define the orbit for the purposes of the method of universal variables (see reference 2). They consist of the combined mass of the two bodies, an epoch, and the position and velocity vectors (arbitrary reference frame) at that epoch. The parameter set used here includes also various quantities that can, in fact, be derived from the other information. This approach is taken to avoiding unnecessary computation and loss of accuracy. The supplementary quantities are (i) alpha, which is proportional to the total energy of the orbit, (ii) the heliocentric distance at epoch, (iii) the outwards component of the velocity at the given epoch, (iv) an estimate of psi, the {\tt "}universal eccentric anomaly{\tt "} at a given date and (v) that date. \sstitem The universal elements are with respect to the mean equator and equinox of epoch J2000. The orbital elements produced are with respect to the J2000 ecliptic and mean equinox. \sstitem Three different element-format options are supported: } Option JFORM=1, suitable for the major planets: EPOCH = epoch of elements (TT MJD) ORBINC = inclination i (radians) ANODE = longitude of the ascending node, big omega (radians) PERIH = longitude of perihelion, curly pi (radians) AORQ = mean distance, a (AU) E = eccentricity, e AORL = mean longitude L (radians) DM = daily motion (radians) Option JFORM=2, suitable for minor planets: EPOCH = epoch of elements (TT MJD) ORBINC = inclination i (radians) ANODE = longitude of the ascending node, big omega (radians) PERIH = argument of perihelion, little omega (radians) AORQ = mean distance, a (AU) E = eccentricity, e AORL = mean anomaly M (radians) Option JFORM=3, suitable for comets: EPOCH = epoch of perihelion (TT MJD) ORBINC = inclination i (radians) ANODE = longitude of the ascending node, big omega (radians) PERIH = argument of perihelion, little omega (radians) AORQ = perihelion distance, q (AU) E = eccentricity, e \sstitemlist{ \sstitem It may not be possible to generate elements in the form requested through JFORMR. The caller is notified of the form of elements actually returned by means of the JFORM argument: } JFORMR JFORM meaning 1 1 OK - elements are in the requested format 1 2 never happens 1 3 orbit not elliptical 2 1 never happens 2 2 OK - elements are in the requested format 2 3 orbit not elliptical 3 1 never happens 3 2 never happens 3 3 OK - elements are in the requested format \sstitemlist{ \sstitem The arguments returned for each value of JFORM (cf Note 6: JFORM may not be the same as JFORMR) are as follows: } JFORM 1 2 3 EPOCH t0 t0 T ORBINC i i i ANODE Omega Omega Omega PERIH curly pi omega omega AORQ a a q E e e e AORL L M - DM n - - where: t0 is the epoch of the elements (MJD, TT) T {\tt "} epoch of perihelion (MJD, TT) i {\tt "} inclination (radians) Omega {\tt "} longitude of the ascending node (radians) curly pi {\tt "} longitude of perihelion (radians) omega {\tt "} argument of perihelion (radians) a {\tt "} mean distance (AU) q {\tt "} perihelion distance (AU) e {\tt "} eccentricity L {\tt "} longitude (radians, 0-2pi) M {\tt "} mean anomaly (radians, 0-2pi) n {\tt "} daily motion (radians) \sstitemlist{ \sstitem means no value is set \sstitem At very small inclinations, the longitude of the ascending node ANODE becomes indeterminate and under some circumstances may be set arbitrarily to zero. Similarly, if the orbit is close to circular, the true anomaly becomes indeterminate and under some circumstances may be set arbitrarily to zero. In such cases, the other elements are automatically adjusted to compensate, and so the elements remain a valid description of the orbit. } See Also: \sstitemlist{ \sstitem Sterne, Theodore E., {\tt "}An Introduction to Celestial Mechanics{\tt "}, Interscience Publishers Inc., 1960. Section 6.7, p199. \sstitem Everhart, E. \& Pitkin, E.T., Am.J.Phys. 51, 712, 1983. } } } \sstroutine{ palUe2pv }{ Heliocentric position and velocity of a planet, asteroid or comet, from universal elements }{ \sstdescription{ Heliocentric position and velocity of a planet, asteroid or comet, starting from orbital elements in the {\tt "}universal variables{\tt "} form. } \sstinvocation{ void palUe2pv( double date, double u[13], double pv[6], int $*$jstat ); } \sstarguments{ \sstsubsection{ date = double (Given) }{ TT Modified Julian date (JD-2400000.5). } \sstsubsection{ u = double [13] (Given \& Returned) }{ Universal orbital elements (updated, see note 1) given (0) combined mass (M$+$m) {\tt "} (1) total energy of the orbit (alpha) {\tt "} (2) reference (osculating) epoch (t0) {\tt "} (3-5) position at reference epoch (r0) {\tt "} (6-8) velocity at reference epoch (v0) {\tt "} (9) heliocentric distance at reference epoch {\tt "} (10) r0.v0 returned (11) date (t) {\tt "} (12) universal eccentric anomaly (psi) of date } \sstsubsection{ pv = double [6] (Returned) }{ Position (AU) and velocity (AU/s) } \sstsubsection{ jstat = int $*$ (Returned) }{ status: 0 = OK \sstitemlist{ \sstitem 1 = radius vector zero \sstitem 2 = failed to converge } } } \sstnotes{ \sstitemlist{ \sstitem The {\tt "}universal{\tt "} elements are those which define the orbit for the purposes of the method of universal variables (see reference). They consist of the combined mass of the two bodies, an epoch, and the position and velocity vectors (arbitrary reference frame) at that epoch. The parameter set used here includes also various quantities that can, in fact, be derived from the other information. This approach is taken to avoiding unnecessary computation and loss of accuracy. The supplementary quantities are (i) alpha, which is proportional to the total energy of the orbit, (ii) the heliocentric distance at epoch, (iii) the outwards component of the velocity at the given epoch, (iv) an estimate of psi, the {\tt "}universal eccentric anomaly{\tt "} at a given date and (v) that date. \sstitem The companion routine is palEl2ue. This takes the conventional orbital elements and transforms them into the set of numbers needed by the present routine. A single prediction requires one one call to palEl2ue followed by one call to the present routine; for convenience, the two calls are packaged as the routine sla\_PLANEL. Multiple predictions may be made by again calling palEl2ue once, but then calling the present routine multiple times, which is faster than multiple calls to palPlanel. \sstitem It is not obligatory to use palEl2ue to obtain the parameters. However, it should be noted that because palEl2ue performs its own validation, no checks on the contents of the array U are made by the present routine. in the TT timescale (formerly Ephemeris Time, ET) and is a Modified Julian Date (JD-2400000.5). units (solar masses, AU and canonical days). The position and velocity are not sensitive to the choice of reference frame. The palEl2ue routine in fact produces coordinates with respect to the J2000 equator and equinox. \sstitem The algorithm was originally adapted from the EPHSLA program of D.H.P.Jones (private communication, 1996). The method is based on Stumpff{\tt '}s Universal Variables. \sstitem Reference: Everhart, E. \& Pitkin, E.T., Am.J.Phys. 51, 712, 1983. } } } \sstroutine{ palUnpcd }{ Remove pincushion/barrel distortion }{ \sstdescription{ Remove pincushion/barrel distortion from a distorted [x,y] to give tangent-plane [x,y]. } \sstinvocation{ palUnpcd( double disco, double $*$ x, double $*$ y ); } \sstarguments{ \sstsubsection{ disco = double (Given) }{ Pincushion/barrel distortion coefficient. } \sstsubsection{ x = double $*$ (Given \& Returned) }{ On input the distorted X coordinate, on output the tangent-plane X coordinate. } \sstsubsection{ y = double $*$ (Given \& Returned) }{ On input the distorted Y coordinate, on output the tangent-plane Y coordinate. } } \sstnotes{ \sstitemlist{ \sstitem The distortion is of the form RP = R$*$(1$+$C$*$R$\wedge$2), where R is the radial distance from the tangent point, C is the DISCO argument, and RP is the radial distance in the presence of the distortion. \sstitem For pincushion distortion, C is $+$ve; for barrel distortion, C is -ve. \sstitem For X,Y in \texttt{"} radians\texttt{"} - units of one projection radius, which in the case of a photograph is the focal length of the camera - the following DISCO values apply: \begin{center} \begin{tabular}{ll} Geometry &DISCO \\ \hline astrograph & 0.0 \\ Schmidt &-0.3333 \\ AAT PF doublet &$+$147.069 \\ AAT PF triplet &$+$178.585 \\ AAT f/8 &$+$21.20 \\ JKT f/8 &$+$13.32 \\ \end{tabular} \end{center} } \sstitemlist{ \sstitem The present routine is a rigorous inverse of the companion routine palPcd. The expression for RP in Note 1 is rewritten in the form x$\wedge$3$+$a$*$x$+$b=0 and solved by standard techniques. \sstitem Cases where the cubic has multiple real roots can sometimes occur, corresponding to extreme instances of barrel distortion where up to three different undistorted [X,Y]s all produce the same distorted [X,Y]. However, only one solution is returned, the one that produces the smallest change in [X,Y]. } } \sstdiytopic{ See Also }{ palPcd } } % ? End of main text \end{document}