pax_global_header00006660000000000000000000000064114750021710014510gustar00rootroot0000000000000052 comment=2cfd168cd07cd9485b32ea4c5d7653303cdd7b35 visolate-2.1.6~svn8+dfsg1.orig/000077500000000000000000000000001147500217100163205ustar00rootroot00000000000000visolate-2.1.6~svn8+dfsg1.orig/visolate/000077500000000000000000000000001147500217100201465ustar00rootroot00000000000000visolate-2.1.6~svn8+dfsg1.orig/visolate/.classpath000066400000000000000000000006551147500217100221370ustar00rootroot00000000000000 visolate-2.1.6~svn8+dfsg1.orig/visolate/.project000066400000000000000000000005571147500217100216240ustar00rootroot00000000000000 visolate org.eclipse.jdt.core.javabuilder org.eclipse.jdt.core.javanature visolate-2.1.6~svn8+dfsg1.orig/visolate/LICENSE.txt000066400000000000000000000431311147500217100217730ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) 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 this service 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 make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. 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. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the 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 a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE 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. 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 convey 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 2 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision 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, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This 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 Library General Public License instead of this License. visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/000077500000000000000000000000001147500217100207135ustar00rootroot00000000000000visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/org.eclipse.jdt.core.prefs000066400000000000000000000011511147500217100256730ustar00rootroot00000000000000#Sat Jan 30 20:29:28 CET 2010 eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve org.eclipse.jdt.core.compiler.compliance=1.6 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.source=1.6 visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/000077500000000000000000000000001147500217100223555ustar00rootroot00000000000000visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/Visolate-autodownload.html000066400000000000000000000033351147500217100275330ustar00rootroot00000000000000 Visolate Applet

info | applet without library auto-download | webstart | download | browse source | javadoc

visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/Visolate-autodownload.m4000066400000000000000000000037551147500217100271150ustar00rootroot00000000000000m4_define(`APPLET_WIDTH', `595') m4_define(`APPLET_HEIGHT', `853') m4_define(`APPNAME', `Visolate') m4_define(`PKGNAME', `visolate') m4_define(`CLASSNAME', `Main') m4_define(`TITLE', `APPNAME Applet') m4_define(`INFO_PAGE', `APPNAME-info.html') m4_define(`MAIN_CLASS', `PKGNAME.CLASSNAME') TITLE

info | applet without library auto-download | webstart | download | browse source | javadoc

visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/Visolate-info.html000066400000000000000000000224471147500217100257730ustar00rootroot00000000000000 Marsette Vona: Visolate Info
Marsette Vona: Visolate Info

 

Visolate example image
webstart |  download |  browse source |  javadoc

Introduction

Printed circuit boards are in virtually every piece of modern electronics. They typically start out as a sheet of fiberglass coated on one or both sides with copper. A photochemical process is normally used to remove much of that copper, leaving a pattern of traces to which electronic components are soldered forming the desired circuit.

For some applications, particularly very low-volume production in home or office environments or rapid-design cycle R&D, the setup costs, environmental hazards, and sensitivity of the chemical process suggest exploring other methods of PCB production. Mechanical etch is one alternative. This process also starts with a copper-clad PCB. However, the unwanted copper is removed mechanically rather than chemically. Most often, a fine-point rotary tool bit is used to create a separation in the copper around the boundary of each trace. The extra copper remaining between the traces is usually left in-place, as it is no longer electrically connected to any trace.

Here we explore an alternate method: compute the Voronoi region associated with each trace and cut along the boundaries between such regions. The image above shows the same printed circuit board (PCB) manufactured three different ways: by traditional photochemical process (right, this one has also been drilled and plated); by mechanical etch with standard outline toolpaths (middle); by mechanical etch with Voronoi toolpaths (left).

We developed a Java application, Visolate, which computes PCB isolation routing toolpaths, optionally following the boundaries of the entity Voronoi diagram induced by the traces. Given a board design, the program computes a toolpath for a CNC mill to cut out the traces.

Cutting the Voronoi boundaries has both advantages and disadvantages. Compared with boundary tracing, the Voronoi method produces only one cut instead of two to separate traces. This can produce cleaner and more consistent results for closely spaced traces. While there is no guarantee that the overall length of the Voronoi toolpath will be shorter than boundary tracing, in practice on real board designs we found that the Voronoi toolpath was on average nearly 40% shorter (see paper below). The Voronoi method usually produces "fat" traces, thus maximizing current carrying capacity, though in its basic form there is no way to specify particular traces that should be fattened more than others. On the downside, the Voronoi traces will have different second-order properties, such as parasitic capacitance, than the originally designed traces.

More information is available in a paper we wrote about the algorithms in our system: "Voronoi toolpaths for PCB mechanical etch: Simple and intuitive algorithms with the 3D GPU" by Marsette A. Vona and Daniela Rus, which is published in the proceedings of the International Conference on Robotics and Automation, 2005.

Download

Visolate is released in precompiled source form under the GNU GPL.

Status

This is highly experimental code. In particular, the gerber parser is incomplete (polygons and inverted images are not implemented, for example). We do not recommend driving any a CNC machine with g-code generated by Visolate unless you first carefully verify its safety.

Requirements and Installation

Visolate has been tested under 1.5+ JREs from Sun with Java3D 1.5+ on GNU/Linux (Mozilla) and Windows (Firefox). Other JREs may work, but working installations of Java3D (not typically included with a JRE) and Swing (typically only included in full with Sun JREs, at the time of this writing) are required to run as a stand-alone application. Note that Java3D 1.5+ on Mac OS X itself apparrently requires JOGL.

Acknowledgements

Disclaimer

THIS INFORMATION AND/OR SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS INFORMATION AND/OR SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

 

vona@mit.edu © 2008 Marsette Vona Sun Sep 14 20:29:08 EDT 2008
visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/Visolate-info.m4000066400000000000000000000144121147500217100253400ustar00rootroot00000000000000m4_define(`PAGE_TITLE', `Visolate Info') m4_define(`STRICT_XHTML') m4_include(`html-header.m4')

 

Visolate example image
webstart |  download |  browse source |  javadoc

SEPARATOR(Introduction, 2)

Printed circuit boards are in virtually every piece of modern electronics. They typically start out as a sheet of fiberglass coated on one or both sides with copper. A photochemical process is normally used to remove much of that copper, leaving a pattern of traces to which electronic components are soldered forming the desired circuit.

For some applications, particularly very low-volume production in home or office environments or rapid-design cycle R&D, the setup costs, environmental hazards, and sensitivity of the chemical process suggest exploring other methods of PCB production. Mechanical etch is one alternative. This process also starts with a copper-clad PCB. However, the unwanted copper is removed mechanically rather than chemically. Most often, a fine-point rotary tool bit is used to create a separation in the copper around the boundary of each trace. The extra copper remaining between the traces is usually left in-place, as it is no longer electrically connected to any trace.

Here we explore an alternate method: compute the Voronoi region associated with each trace and cut along the boundaries between such regions. The image above shows the same printed circuit board (PCB) manufactured three different ways: by traditional photochemical process (right, this one has also been drilled and plated); by mechanical etch with standard outline toolpaths (middle); by mechanical etch with Voronoi toolpaths (left).

We developed a Java application, Visolate, which computes PCB isolation routing toolpaths, optionally following the boundaries of the entity Voronoi diagram induced by the traces. Given a board design, the program computes a toolpath for a CNC mill to cut out the traces.

Cutting the Voronoi boundaries has both advantages and disadvantages. Compared with boundary tracing, the Voronoi method produces only one cut instead of two to separate traces. This can produce cleaner and more consistent results for closely spaced traces. While there is no guarantee that the overall length of the Voronoi toolpath will be shorter than boundary tracing, in practice on real board designs we found that the Voronoi toolpath was on average nearly 40% shorter (see paper below). The Voronoi method usually produces "fat" traces, thus maximizing current carrying capacity, though in its basic form there is no way to specify particular traces that should be fattened more than others. On the downside, the Voronoi traces will have different second-order properties, such as parasitic capacitance, than the originally designed traces.

More information is available in a paper we wrote about the algorithms in our system: "Voronoi toolpaths for PCB mechanical etch: Simple and intuitive algorithms with the 3D GPU" by Marsette A. Vona and Daniela Rus, which is published in the proceedings of the International Conference on Robotics and Automation, 2005.

SEPARATOR(Download, 2)

Visolate is released in precompiled source form under the GNU GPL.

SEPARATOR(Status, 2)

This is highly experimental code. In particular, the gerber parser is incomplete (polygons and inverted images are not implemented, for example). We do not recommend driving any a CNC machine with g-code generated by Visolate unless you first carefully verify its safety.

SEPARATOR(Requirements and Installation, 2)

Visolate has been tested under 1.5+ JREs from Sun with Java3D 1.5+ on GNU/Linux (Mozilla) and Windows (Firefox). Other JREs may work, but working installations of Java3D (not typically included with a JRE) and Swing (typically only included in full with Sun JREs, at the time of this writing) are required to run as a stand-alone application. Note that Java3D 1.5+ on Mac OS X itself apparrently requires JOGL.

SEPARATOR(Acknowledgements, 2)

SEPARATOR(Disclaimer, 2)

DISCLAIMER

m4_include(`html-footer.m4') visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/Visolate.gif000066400000000000000000011352621147500217100246440ustar00rootroot00000000000000GIF89aIÒ÷ÿÿÿA¾{ÿÿÿZ²s¬ Åꃽ¬J‘¤¬ejRÖR‹âƒÞ¾¤Õ™¬® æYAÞYJ9öJs]¬Zy¤Í¡)}ÕÅ<{ÿs{bjê)îUAJHæÞ${ö])ÅeRÅ8ƒ iöœyjZ¥ƒA¶ƒb ÿ½1ÿR‹æ½(””‰b •ÅæœÅ¤1]î9ƒ½H{j¶Zb(öÿjƒòÅ®îy)Yÿ”ÞZYͤÞöƒb…”æ(j”ê´¥ JÞRî{b¶bÅ)¬ ¬bUÅ‹ î9²”¬(¬smœΤö¬<””ÒƒêRî9)]ÿJòAœHœ‹¡JÍ@js,æÍDj´1¤ybÞi9½•)1¬9úJ´öj‹q{AöAÍHjÊœ½¤jÿ)®¤Í…) ¡½9ÿA‹0ÅÞ ”Z®s{D½ ²¬9‘´s‹”•RœÍA¡” ®¬‘Í´¬Æ´jÿ´ ½ÿ(Z”¥JZÆZœ4´ÿ,R{Æ9Å@{æHR{eœƒö¬Pƒ1Ê{öDJö)Åöjji¬¶½½¡ îs æ{jö …Õ”…b”æÅ• )ª¬Aª”Å@sîÍy9jâ)‹4½sö´¾s{JæJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ!ù!þ"Created with The GIMP",IÒþþ€þ@þ þþ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€  @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€@€ @€ @€  @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @@ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @þ€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€   @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€P€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€(@€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€@ @€ @€€ 0`À€ @€ @€ @€ @€ @€ @€ @€ þ@€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€  @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @ ( @€ @€ @@ @€ @€ @€ @€À€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @@ @€ @€ @€ @€ @€ @€ @€ @€ @€P @ $H A‚ (P @€ @€ € @€0€ @€0@€ @þ€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€   @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€P€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @ $H A‚ $H A‚ @€ @€ ` @€ @€ @€ @€ @€ @€(@€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ þ@€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ $H A‚ $H A‚ $HP @€  @€þ@€ @€ @€ @€ @€À @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€€ @€ @€ @€ @€ @€ @€H A‚ $H A‚ $H A‚  @€€ @€ @€ @€ @€  @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @@ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @þ€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€   @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€(P A‚ $H A‚ $H A‚ $H @‚ @@ @€0€ @€ @€ @€À @€ @€ @€ @€ @€ @€P€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€(@€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @ $H A‚ $H A‚ $H A‚  @€ € @À$@€ @€ @€ þ@€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ  @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ H A‚ $H A‚ $H A‚ $H A‚  @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @@ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€  A‚ $H A‚ $H A‚ $H A‚ $( @þ€@€@€ @€ @€ @€0@€ @€ @€ @€ @€ @€ @€ @€ @€   @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€P€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€( @€ $H A‚ $H A‚ $H A‚ $H A‚€ @À @€ @€ @€H€  @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ þ@€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þP @€J A‚ $H A‚ $H A‚ $H A‚ $( @€€ @€ @€ @€ @€ @€ @À @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€  @ (P @ (P @ (P @ (P @ (P @ (P @ (P @ (P @ (P @ (P @ (P @ (P @ (P @ þ(P @ (P @ (P @ (P @ (P @ (P @ (P @ (P @ (P @€ (P @ (P @ (P @ (P @ @€ @€ @€ @€ @€ A‚ $H A‚ $H A‚ $H A‚ $H A‚@0€ @€ @€ @€ þ@€  @€ @€ @€ @€ @@ (P @ (P @ (P @ (P @ (P @ (P @ (P À (P @ (P @ (P @ (P @ (P @ (P @ (P @ (P @ (P @ (P @ (P @ (P @ (P @ (P @ (P @ (P þ@ (P @ (P @ (P @ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€   @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€(P@€ @€ @€ @€ @€ @€ $H A‚ $H A‚ $H A‚ $H A‚   @À @€ @€ @€ @€ @À€ @€P€ @€ @€  @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€(@€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€  @€ @€ @€ @€P @€$H A‚ $H A‚ $H A‚ $” A‚ $H þA € @€ @€ @€ @€ @€€0@€ @€ @€ @€  @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€  @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€€  @€ @€ @€ @€ @‚ $H A‚ $H A‚ $H A‚ $H A‚ 0€ @€ @€ @€ @€ @€ @€ @€ @€  @€þ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0þ`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À@ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€  € @€ @€ @þ€  @€$H A‚ $H A‚ $H A‚ $H A‚ $HP @€€ @€€ @€ @€ @€ @€ @@€ `€ @€ @€  @€   0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0Ѐ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€  @€ @€ @€( @€H A‚ $H A‚ $H A‚ $H A‚ $H A‚@ H€ @€ @€ @€þ @€ @€  @€ @€ ( @€ @€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 4`þÀ€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€  @€ @@  @€ @€ @ @€ $H A‚ $H A‚ $H A‚ $H A‚ $( @@ @À @€ @€ @€ @€ @€ @À @€ ( @€ @€`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ þ0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€P@€ @€ @€ @€$H A‚ $H A‚ $H A‚ $H A‚ $Hþ A € @€ @€ @€ @€ @€ @€  @€ ( @€ @€ @€ 0`À€ 0`À€ 0`À@ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`Àþ€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`  0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0 @€ @€  @€ @€ @€ A‚ $H A‚ $H A‚ $H A‚ $H A‚ 0€ @€ @€  @€ @€ @€€(P@€ @€ @€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ hÀ€ 0`À€ 0`À€ þ0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€  € @€P þ@€ @€$H A‚ $H A‚ $H A‚ $H A‚ $H @€@€ @€ @€ @€ @€ @€€ @€ (P@€ @€ @€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`@€ @€ @€ @ @€ A‚ $H A‚ $H A‚ $H A‚ $H A‚€@€ @€ @€ @€þ @€ @€ `€ @€ @€`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0þ`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À@ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`Àþ€ 0`À€ 0`À€ @€ @@ @€ @€ @€ $H A‚ $H A‚ $H A‚ $H A‚ $( @@ @€€ @€ @€ @€ @€ @€   @€ @€ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0Ѐ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€  @€ @€ @€( @€ @€H A‚ $H A‚ $H(A‚ $H A‚ $Hþ A‚@@€ @€ @€ @€ @€ @€  @€ @€ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`þÀ€ 0`À€ 4`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€0`À€ 0`À€ 0`À€ @€ @€€ @ @€ @€ $H A‚ $H A‚ $H A‚ $H A‚   @À @€ @€ @€ @€ @€ `€ @€ @€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ þ0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€  @€ @€( @€þ @€ @€$H A‚ $H A‚ $H A‚ $H A‚ $HP @€@€ @€ @€ @€ @€ @€ @€€ @€ @€0`À@ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`Àþ€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`  0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€€ @€ @€ @‚ $H A‚ $H A‚ $H A‚ $H A‚ @À @€ @€ @€þ @€ @€  @€ @€ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ hÀ€ þ0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`þÀ€ 0`À€ 0`À€ @€ @€ @ @€ @€$H A‚ $H A‚ $H A‚ $H A‚  @€€ @€ @€ @€ @€ @€ @€ `€ @€ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`@€ @€ @€ @€ @€ @‚ $H A‚ $H A‚ $H A‚ $þH @€@ ` @€ @€ @€ @€ @€€ @€ @€ 0`À€ 0`À€ 0`À€ 0`À€€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0þ`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À@ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`Àþ€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€ @ @€ @€$H A‚ $H A‚ $H A‚ $H A‚  @€ @€ @  @€ @€ @€  @€ @€0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0Ѐ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€  @€ @€ @€þ(@€ @€ @‚ $H A‚ $H A‚ $H A‚  @€ € @À @€ @€ @€ @€0@€ @€ À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`þÀ€ 0`À€ 0`À€ 0`À€ 4`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€ @€ @€ @€$H A‚ $H A‚ $H A‚ $H @€ @€ @€ @€ @€þ @€ @À @€ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ þ0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0þ`À€ 0`À€ 0`À€  @€ @€ @€P @€ @€ @‚ $H A‚ $H A‚ $H A‚ @€€ @€ `€ @€ @€ @€€ @@ @€ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`Àþ€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`  0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`@€ @€ @€ @€ @€ @€HP‚ $H A‚ $H A‚ þ @€€ @€  € @€ @€ @€ @€ @€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ þ0`À€ hÀ€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`þÀ€ 0`À€ 0`À€ 0`À€ 0`À€ 4`À€ 0`À€ 0`À€ 0`À€ @€ @€ @€ @€ @€ @€ $H A‚ $H A‚ $H @€ @@ @€ @À @€ @€ @€ `€ @€`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0 @€ @€ @€þ @€  @€ @€ A‚ $H A‚ $H @€ @€ € @€  @ @€ @€ @€€ @€ @€ 0`À€€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0þ`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À@ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`Àþ€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€ @€ @€ @€ @€$H A‚ $H A€     @€ @€€ @€ @€þ @€  @€ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`ÀÀ8pàÀ @€ àÀ8pà€ @€ @€ @€ @€0`À€  @€ @€ (P @ @€ @€ @€ @€ @€ @€P€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ À€ 0`À€ 0`À€ 0 @€0`À€ 0`À€ 0`À€  @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ`À€ 0`À€ hÀ€  @€ @€ @€ @€ @€ @€ @€ @€ @€ @€@€ @€ @€ @€ @€0@€ @€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€8p@€ àÀ þ@€ @€ @€ @€ @€ À€ 4`À€ @€ ( @€ @ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ 0`À€ 0`À€ 0`À€ @€ 0`À€ 0`À€ 0`@€ @€ @€  @€ @€ @€ @€ @€ @€ @€ @€ 0`À€ 0`À€ 0`À€ @€ @€ @€ @ @€ @€ @€ @€þ @€€ @€ @€€ @€ @€ `€ @€`À€ 0`À€ 0`À€ 0`À€ 0`À€ 8 @€ @€8 @À @€ @€€ @€ @€ @€ @€ 0`À€ @€( @€ @€(P @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€€`À€ 0`À€ 0`À€  @€0`À€ 0`À€ 0`À€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€0`À€ 0`À€ 0`À€ @€ @€ @€ @€ @€ @€ @€ @€  @€ @@ @€ @@ @€ @€ @€ @€ @€ 0`À€ 0`À€ 0`Àþ€ 0`À€ 0`à€ @€ @€€ @€ @€ àÀ @€ @€ @€`À€ 0 @€ @€ @€ @€ ( @€ @€ @€ @€ @€ @€ @€ @€   @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ 0`À€ 0`À€ 0`À€ À€ 0`À€ 0`À€ 0 @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ 0`À€ 0`À€ 0 @€ @€P€þ @€ @€ @€ @€ @€P @€ @€@ @€ @€€ @€ @€  @€ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€€ @€ @€8 @€ @€ @€ @€ @€ @€ @€ þ0`À€ @€ @€(@€ @€ @€ @€(P @ (P @ (P @ (P @ (P @ (P @ (P @ (P @ (P @ (P @ (P @ @€ @€(P @ (P @ @€0`À€ 0`À€ 0`À€ @€ 0`À€ 0`þÀ€ 0`À€ @€ @€ @€(P @ (P @ T @ (P @ (P @ (P @€ @€0`À€ 0`À€ 0`À€ @€ @€ @€ @€( @€ @€ @€ @ @€  @€ @€ @€ @€þ0@€ @€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€ @€€  @€ @€ @€€ @€ @€ @€0`À€  @€P @€ @€ @€P @€ @€ (P @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€P @ @€ (P @€ @€(P @€ À€ 0`À€ 0`À€ 0`@€`À€ 0`À€ 0`À€  @€ @€ @€(P @€ @€ @€ @€ @€ @€ ( @€þ À€ 0`À€ 0`À€  @€ @€ @€ @€ @€ @€ @€ @€ @€ @€@€ @€ @€€ @€ `€€ @€`À€ 0`À€ 0`À€ 0`À€ 0`À€ p@€ @€ @€8 @€þ @€ @€p@€ @€ @€ @€ 0`À€ @€ @€ @€ @€ @€( @€ @€ @€ @€ @€ @€ @€ @€ @€ @@ @€ @€(P @€(P @€ @€ @€  @þ€ 0`À€ 0`À€ 0`À€ @€ 0`À€ 0`À€ 0`À€ @€ @€(P @€ @€ @€ @€ @€ @€ @€ @€ 0`À€ 0`À€ 0`À€ @€ @€ @€ @€(   @€ @€( @€þ @€ @€ @€ @€ @€ @€ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0 @À @€ @€ @À @€ @€ @€ @€ @€ @€ 0`À€ @€  @€ @€ @€P @€þ(PP€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ (P @€ @€ @€ @`À€ 0`À€ 0`À€  @€0`À€ 0`À€ 0`À€ @€ @€P @€ @€þ @€ @€ @€ @€(@€ @€`À€ 0`À€ 0`À€  @€ @€ @€ @€ @€ @€ @€ @ @€ @€€ @€ @€ @€€ @€  @€ @€ 0`À€ 0`À€ 0`À€ 0`þÀ€ 0`À€ @€ @€ @€ @@‚ $H A‚  @€p@€ @€ @€ 0`À€ 0`À€ @€ `Á‚  @€ @€  @ @€4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAþƒ  @€ à @€@€ @€ @€ 0`À€ 0`À€ 0`À€ À€ 0`À€0`À€ 0`@€ @€ @€ @€ˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B @€  @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ  @€ @€P @€ @€ @€ @€ @€@ @€ @€ @€  @€ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€p@€  @ @€ à€$H A‚ $H  @€€ @€ @€ 0`À€ þ0`À€  @€ @€€ ,X°` @€ @ @€4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРA @€€ @€ @€‚ @0`À€ 0`À€ 0`À€  @€ 0`À€ 0þ`À€ 0`À€ @€ @€  @€!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ @€P @€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€ @€ @€ @@ @€ @@ @€ @€ @€0@þ€ @€`À€ 0`À€ 0`À€ 0`À€ 0`À€  @À @€ @€ @€H A‚ $H A‚  @€ @€ @€0`À€ 0`À€ 0`À€ @€,X°`Á‚  @€ @€ @€РAƒ 4hРAƒ 4hÐ`ƒ 4hРAƒ 4hРAƒþ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hÐ@€ð@€  @€ @ @€ @€ 0`À€ 0`À€ 0`@€`À€ 0`À€ 0`À€  @€ @€  @€ B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„ @€þ À€ 0Ѐ 0`À€ 0`À€ 0`À€ 0`À€ 0`@€ @€ @€ @€ @€ @€ @€ € @€ @€0`€ @€ À€ 0`À€ 0`À€ 0`À€ 0`À€ 0 @€ @€@€  @€p@@‚ $þH A‚ $H @€p@€ @€ À€ hÀ€ 0`À€  @€ `Á‚ ,X°@€ @€à@€ @@ƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ  @€€ @€ @€ @€ þ@€ 0`À€ 0`À€ 0`À€ @€ 0`À€ 0`À€ 0`À€ @€T @€ @€"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!‚P @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€  @€ @€  @€ @€ @€þ @€ @€ @€ @À @€ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`@€ p@€ @€ @€ @€$H A‚ $H A‚ @€ @€ @€ 0`À€ 0`À€ 0`@€ @€ ,X°`Á‚ @€ @€þ @€4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hÐ@€< @€ @€ @€!@€ @€ À€ 0`À€ 0`À€ 0 @€0`À€ 0`À€ 0`À€  @€ @ @€Dˆ!B„"þDˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„" @€`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`@€ @€ @€ @€  @€ @€ @€€ @€€ @€ @€  @€ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0þ`À€ @À @€ @€ @€p A‚ $H A‚ $ @€8 @€ @€0`À€ 0`À€ 0`À€ @€°`Á‚ , @€ @€8 @€hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРÀ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРþAƒ 4hРAƒ  @À @€ @€ @€ 0`À€ 0`À€ 0`À€ @€ 0`À€ 0`À€ 0`@€ @€ @€ B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"DˆA€( @€ 0`À€ 0`À€ 0`À€ 0`  0`À€þ 0`À€  @€ @€ @€P @€ @€ @€€ @€ @€0@€ @€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€ @ @€@€ @€$H A‚ $H@€ à€ @€`À€ 0`À€þ 0`À€ P @€P€€ ,X°` @€ @€ @@ƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hÐ@€ @€ @€ @€ @ @€0`À€ 0`À€ 0`À€  @€ 0`À€ þ0`À€ 0`À€ @€( @€ @€€"Dˆ!B„"D!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„" @€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @ @ @€ @€ @@ @€ @€ @€€ þ@€ À€ 0`À€ 0`À€ 0`À€ 0`À€  @€p@€ @€ @€@ @€p@€ @€ @€ @€ @€ 0`À€  @€ @€ @€,X `Á‚ @€ @€ @€4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAþƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒð@€ @€ @€ @€‚( @€ 0`À€0`À€ 0`À€ À€ 0`À€ 0`À€ 0 @€ @€ @€ˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"DˆA€þ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€ @€ @€ @€ @€ € @€ @€  @€ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€€ @€ @€@€ @€þ @€ @€p@€ @€ 0`À€ 0 @€ @€  @€X°` @€ @€p @€РAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРA€ 4hРAƒ 4hРAƒ 4hРAƒ 4hÐ@€  @€ @€ þ @€0`À€ 0`À€ 0`À€ @€ 0`À€ 0`À€ 0`À€ @€( @€ B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„ @ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0 @@ @€ @€( @€ @þ€ @€  @€ @€ `€ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€ @€ @€ @€8p@€ @€ @€€ @€`À€ 0`À€ @€( @€ `Á‚ @€ @€  þ @€€ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒx @€ @€ @€ @€‚ À€ 0`À€ 0`À€ 0 @€0`À€ 0`À€ 0`À€  @€ @ @€"Dˆ!B„þ"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ0B„"Dˆ!B„"DˆA€ À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€( @€ @€ @€ @€@€ @€ @€ @€0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ @€ à€ @€ @€@€ @€ @€(@€8 @€ @€ 0`À€ @€ @ @€ , @€ @€ @€8 @€4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hÐþ Aƒ 4hРAƒ 4 @À€ @€ @€ @€ 0`À€ 0`À€ 0`À€ @€ 4`À€ 0`À€ 0`À€ @€ @€!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0 @€ @€ @ @€ @€ @€€ @€ @€ @€ À€ 0`À€ 0`À€0`À€ 0`À€  @€ @€ @€ @€ @€  @€ @€€8pàÀ8p€ @€0`À€  @€þP @ @€,X°@€ @€ @€à@€РAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ4hРA< @€ @€ @€ @€A€  À€ 0`À€ 0`À€  @€0`À€ þ0`À€ 0`À€ @€ @€ @€€"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"D @€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€  @€€ @€ @€ @€€ @€ @€ @Àþ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`@€ @€8 @€ @€ @€€ @€ @€ @€ @€ À€ 0`@€P @ @€°`Á @€ @€ @€ @€€ 4hРAƒ 4hРÀ 4hРAƒ 4hРAƒ 4hРþAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ  à @€ @€ @€P @€ 0`À€ 0`À€ 0`À€ @€ 0`À€ 0`À€  @€ @€ @€Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!Bþ(   0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€  @€ @€ @€ @€ @€ @€@ @€ @€ @€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ à€ @€ @€ @€  @€þ @€ @€À@€ @€ 0Ѐ @€ @€ @€€  @€ @€ @€8 @€hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hÐ@€ @€ @€ @þ @€0`À€ 0`À€ 0`À€ @€ 0`À€ 0`À€ 0`À€(@€P @€ @@„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"D @€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`@€ @€ @€ @€ þ@€ @€  @€ @€0@€ À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€ @€ @€ @€  @€ @€ @€  @€`À€ 0 @€  @€ @€,X @€ @€ @€ Àþ  Aƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒx @€ @€B€ @€( @€ 0`À€ 0`À€ 0 @€ À€ 0`À€ 0`À€  @€ @€ @€Dˆ!B„þ"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!‚ À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€( @€ @€ @€ @€ € @€ @€ @€ 0`À€ 0`À€ 0`À€ 0`À€  @€þ @€€8 À‚ @€ @€ @€ @ @€ @€  @€` @€ @€ 0`À€(°`Á‚ ,X°`ÁX°` @€ @€ @€ @€ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРA€ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hþРAƒ 4hРAƒ 4 @€€€ @€ @€  @0`À€ 0`À€ 0`À€ @€ 0`À€ 0`À€ 0`@€ @€ @€ B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„ @€ 0`À€ 0`À€ 0`À@ 0`À€ 0`Àþ€ 0`À€ 0 @€ @€ @€ @€ @€ @€ @€ @€ @€0`À€ 0`À€ 0`À€ 0`À€ 0 @€pàÀ @€, @€ @€ @€  @€ @€ @ @€0`À€  @€‚þ ,X°`Á‚ , à‚  @€ @€ @€p @€hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hР< @ @€ @€ @€ @€  @€ 0`À€ 0`À€ @€`À€þ 0`À€ 0`À€ @€ @€ @€"Dˆ0B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!‚  À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€ @€ @€ @€ @€€ @€ @€ @Àþ @€ 0`À€ 0`À€ 0`À€ 0`À€pàÀ @€ À‚ @€(@€ @€ @€ @€  @€0 @€ @€ 0`À€(X°`Á‚ ,X°`Á‚ , @€ @€ @€ À @@ƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hÐþ Aƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ à @€ @€ @€P @€4`À€ 0`À€ 0`@€ @€ 0`À€ 0`À€  @€ @€  @€ B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!Bþ„ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€ @€ @€ @€ @€@ @€ @€ @€0`À€ 0`À€ 0`À€ 0`À€ àÀ @€ @€X @€ @€ @€ @þ @€ @€ € @€ 0`À€ @Á‚ ,X°`Á‚ ,X°@€ @€ @€ @€ @€4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4 @€  @€ @€ þ@ @€  @€ 0`À€ 0`À€ @€`À€ 0`À€ 0`@€ @€P @€ @€"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ @€ `À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€€ 0 @€ @€ @€  @€þ @€ @€ @@ @€ @€ `€ À€ 0`À€ 0`À€ 0`À€  àÀ @€ @€ @€ @€ @€ @€ @€ @€ @€  @€`À€ 0 @€ ,X°`Á‚ ,X°`Á @€ @€ @@p @þ€РAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hÐ@€x @€ @€ @€ @€‚P @€0`À€ 0`À€ @€ @€ 0`À€ 0`À€ @€ @€ @€ B„þ"Dˆ!B„"Dˆ!B„"Dˆ`„"Dˆ!B„"Dˆ!B„"Dˆ!B„ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€P @€ @€ @€ @€ € @€ @€ @€ 0`À€ 0`À€ 0`À€ 0 @À @€þ @€ @€X @€ @€ @€ @€ @ @€@€À@€ @€ 0`À€ `Á‚ ,X°`Á‚  @€ @€ @€ À @€€ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4þhРAƒ 4hРA @À€ @€ @€ @€ @€ 0`À€  @€(@€ @€ 0`À€ @€ @€( @€ @€Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"D @€  @€ 0`À€ 0`À€ 0`À€ 0`þÀ€ 0`À€ @€ @€ @€ @€ @€ @€ @€ @€ @€0`À€ 0`À€ 4`À€ 0`À€ @€ @€ @€ @€  @€ @€ @€@€ @€ @€ @€0`À€  @€þ ,X°`Á‚ ,X @€ @€ @€ @€ @€4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 6hРAƒ  @€ @ @€ @€ @€A€P @€`À€ 0`@€ @€ @€þ0`À€  @€ @€ @ @€ @€€"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!BP @€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€ @€( @€ @€ @€ @€@€ @€ @€€þ @€ 0`À€ 0`À€ 0`À€ @€ @€ @€ @€° @€ @€ @€ @€ @€ @€0 @€ @€ 0`À€( @€ @€ @€ @€ @€8 @€РAƒ 4hРA€ 4hРAƒ 4hÐ@€ @€þ @€ @@ƒ 4hРAƒ @€ @€ @€ @€€  @€ð@€ @€ @€ @€ @€ @€0`@€ @€ @€ @€  @€ @€ @€  @€ @€ B @€ @€ˆ!B„"Dˆ!B„"Dˆ!þÀ"D @€  @€ 0 @€ @€ @€ @€  @€ @€ @€ @ @€ @€ @€€ @€ @€  @€0`À€ 0`À€ 0`À€ 8p@€ @€ @€ @€ @€  @€ @€ @€þ @€ @€ €  0`À€  @€ @€ @€ @€ @€ À @€ 4hРAƒ 4hРAƒ 4hРAƒ @€ @€ @€4hРAƒ 4 @€ @€ @€ @€ @€ @À @€ @€þ @ @€ @€ @€ @€ @€ @€ @€P€ @€ @€ @€ @€ @€ @€ @€€"Dˆ!B„"Dˆ!B„"Dˆ!‚P @€ @€ @€ @€ @€ @€ @€ @€ @€  @€þ @€ @€ @@ @€ @€ `€ À€ 0`À€ 0`À€ pà€ @€(@€ @€ @€`A€ @€ @€ @€ @€ @€ @€ À€ 0`@€ @€ @€ @€ @€ @€ þ@€4hРAƒ 4hРAƒ 4hРAƒ  @€ @€ @€РAƒ 4hР @€ @€ @€ @€ @€ @€ „ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€Dˆ!B„"Dˆ!B„"Dˆ!B„ @€ @€ @€ @€ @€ @€ @€ @€ @€P @€ @€ @€  @€@ @€ @€ @€ 0`À€ 0`À€ 0`À€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€` @€ @€ 0`À€ @€ @€ @€ @€ @€8 @€  Aƒ 4hРAƒ 4hРAƒ 4hÐ@€ @€ @€ @€ 4hРAƒ  @€ @€ @€þ @€ @€ð@€€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€( @€ @€ @€ @€ @€ @@„"Dˆ!B„"Dˆ!B„"DˆA€( @€ @€€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€  @€ @€0@€`À€ 0`À€ 0`À€ 8 @€ @€ @€ @€ @€°`A€ @€ @€`Á‚ ,X°`Á‚ ,X°`Á‚ @€0`À€  @þ€ (P @@ (P @€ @€ @€ À @€ 4hРAƒ 4hРAƒ 4hРAƒ @€ @€ @€hРAƒ 4hÐ@€ @€ @€ @€ @€ @À @ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @   @€ @€ @€ @€Dˆ!B„"Dˆ!B„"Dˆ!B„ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€@€ @€ @€€þ @€ 0`À€ 0`À€ 0`@À @€ @€ @€ @€P€,X @€ @€ @€  @€ @€` @€ @€ 0`À€P @€ @€  @€ @€ @€ @€hРAƒ 4hРAƒ 4hРAƒ 4 @€ @€þ @€ @@ƒ 4hРAƒ @€ @€ @€ @€ @€ @€ @€ @€ @€(@€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ B„"Dˆ!B„"Dˆþ!B„"Dˆ @€P @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€€ @€ @€ @€0`À€ 0`À€ 0`À€ @€ @€ @€ @€ @€ @€  @€ @€þ  @€ @€ @ @€0`À€  @€ @€ @ @€ @€8 @€ @@ƒ 4hРAƒ 4hРAƒ 4hР @€ @€ @€4hРAƒ 6h @€ @€ @€ @€ @€ð@€  @€ @€þ @ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€"Dˆ!B„"Dˆ!B„"Dˆ!B @€ @€ @€ @€ @€ @€ @€ @€ @€  @€þ @€ @€ @€€ @€ @€ @À @€ 0`À€ 0`À€ 0 à€&L˜0a„ &L˜0a‚ @€ @€ @€°`Á‚ @€, @€ @€ @€ @€ À€ 0`@€ @€ @€( @€ @€€ Àþ @€4hРAƒ 4hРAƒ 4hРAƒ  @€ @€ @€  Aƒ 4hРA @€ @€ @€ @€ @À @€ @€ @€ @€‚ @€  @€ @€ @€ @€ @€ @€ @€ @€ @€ @þ€ @€ @@ @€ B„"Dˆ!B„"Dˆ!B„"D @€ @€ @€ @€ @€ @€ @€ @€ @€( @€ @€ @€ @€@ @€ @€ @€ 0`À€ 0`À€ 0`À€˜0a„ &L˜0a„þ & @€ @€ @€ @€,X @€X°  \¸páÂ… .\¸pA€ € @€ 0`À€ @Á† 6lذaÆ  @€ @€ @€ @€РAƒ 4hРAƒ 4hРAƒ 4h @€ @€ @€ @€ 4hРAƒ  @€ @€ @€þ @€ @€ @€@€ @€ @€ @€P @€ @€P€ @€ @€ @€ @€ @€P @€ @€ @€ @€ @€ @€"Dˆ!B„"Dˆ!B„"Dˆ!B @€ @€ @€ @€þ @€ @€ @€ @€ @ @€ @€ @€  @€ @€0@€`À€ hÀ€ 0`À€ p@À„ &L˜0a„ &L˜0a @€ @€ @€ @€ `Á‚páÂ… .\¸páÂ…  @€  @€`À€ 0 þ@€ 6lذaÆ 6lذaƒP @€ @€8 @€ @@ƒ 4hРAƒ 4hРAƒ 4hР @€ @€ @€hРAƒ 4hÐ@€ @€ @€ @€ @€x @€ @ @€ @€ @€A€ @€  @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ˆ!B„"Dˆ!B„"Dˆ!B„" @€P @€ @€ @€ @€ @€ @€ @€  @€ @€ @€ @€ @€ € @€ @€þ @€ 0`À€ 0`À€ 0`À€€&L˜0a„ &L˜0a„ & @€ @€ @€ @€`Á‚ @À… .\¸páÂ… .\¸ @€` @€ @€ 0`À€P°aÆ 6lذaÆ  @€  @€à@€ @€4hРAƒ4hРAƒ 4hРAƒ  @€ @€þ @€ @€€ 4hРAƒ  @€ @€ @€ @€ à @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @@„"Dˆ!B€"Dˆþ!B„"Dˆ!‚ @€ @€ @€ @€ @€ @€ @€ @€P @€ @€ @€ @€ @€ @€ @€0`À€ 0`À€ 0`À€0a„ &L˜0a„ &L˜0a‚ @€ @€ @€ @€0 @þ€.\¸páÂ… .\¸pá @@ @€0`À€  @€6lذaÆ 6lذA€ @€  @€ @€  Aƒ 4hРAƒ 4hРAƒ 4hÐ@€ @€ @€ @€4hРAƒ 4h @€ @€ @€ @Àƒ @€ @€ @€ @€ @€€ @€ @€ @À @€ 0`À€ 0`À€ 0p@€ (P @ (P @… @€˜0a‚ @€ @€ @€ `„ &L˜0a„ & @€0 @€ @€þ0`À€ 0`À€ 0`À€ @€p @€ @€4hРAƒ 4hРAƒ 4hРAƒ  @€ @€ @€ @€  Aƒ 4hРA @€€ @€ @€ @€ @€ @ @€ @€ @€ @€ @€ @€ @€ @€þ @€P @ @€ @€€ @€  @€ @€ @€ @€ @€ @€"Dˆ!B„"Dˆ!B„"Dˆ!B @€ @€ @€ @€ @€ @€ @€ àƒ @€ @€ @€ @€@ @€ @þ€ @€ 0`À€ 0`À€ 0`À€P @ (P @ (P8 @@ @€&L˜0a„ &L˜0a„ &L˜0a„ &L˜0a„ &L˜0a„ &L˜0a‚ @ @€ @€ 0`À€ 0`À€  @€ €ƒ @€  Aƒ 4hРAƒ 4hРAƒ 4hÐ@€ @€ @€þ @€ @€ 4hРAƒ  @€ @€ @€ @€ @€ @€ @€ @€  @€ @€ @€ @€ @€ @€ @€(P @€ @€ @€P @€ @€ @€ @€ @€ @€!B„þ"Dˆ!B„"Dˆ!B„" @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€P@ @€ @€ `€ À€ 0`À€ 0`À€ 8 @ (P @ (P @… @€0a„ &L˜0a„ &L˜0a„ &Lþ˜0a„ &L˜0a„ &L˜0a„  @€ @€ @€0`À€ 0`À€ 0`À€ @€ @€ @€ 4hРAƒ 4hРAƒ 4hРAƒ @€ @€ @€(@€РAƒ 4hР à @€ @€ @€ @€ @€ @€þ @ @€ @€ @€ @€ @€ @€ @€ ( @€ @€ @€ @€ @€ @€ @€ @€ @€€"Dˆ!B„"Dˆ!B„"Dˆ!‚ @€ @€ @€ @€ @€ @€ @€ àƒ @€þ @€ @€ @€ € @€ @€ @€ 0`À€ 0`À€ 0`ÀÀ(P @ (P @ (8 @€ @€ @€ @€ @€ @À„ &L˜0a„ &L˜ @€ € @€ @€ 0`À€ 0`À€  @€à @€ @€þhРAƒ 4hРAƒ 4hРAƒ 4 @€ @€ @€ @€ @€€ 4hРAƒ  @€ @€ @€ @€ @€ @€ @€ @€ @€‚ @€ @€ @€ @€ @€ @€ @€ ( @€ @€ @€þ @€ @€ @€ @€ @€ˆ!B„"Dˆ!B„"Dˆ!B„" @€ @€ @€ @€ @€ @€ @€ @€> @€ @€ @€ @€ @€ @€ @€0`À€ 0`À€ 0`À€@ (P þ@ (P @AÀ @€ @€ @€€ @€ @€˜0a„ &L˜0a„  @€ @€ @€0`À€ 0`À€ 0 @€ €ƒ @€ @@ƒ 4hРAƒ 4hРAƒ 4hР @€ @€ @€ @€4hРAƒ 4h @€<  @€þ @€A€ @€ @€@€ @€ @€ @€ @@ @€ @€ @€ @€ @€ @€ ( @€ @ @€ @€ @€ @€ @€ @@„"Dˆ!B„"Dˆ!B„"DˆA€ @€ @€ @€þ @€ @€ @€ @€ðA€ @€ @€ @€ @€€ @€ @€  € @€ 0`À€ 0`À€ 0`à€(P @ (P @ 8 @€ @€ @€ @€ @€ @€€ &L˜0a„ & @€À@€ @€þ @€ 0`À€ 0`À€ @€ @€ @€ 4hРAƒ 4hРAƒ 4hРAƒ @€ @€ @€ @€  Aƒ 4hРAPÀ @€ @€ @€ @€ @€ @€ @€ @€A€ @€ @€ @€ @€þ @€ @€ @€ @€  @€  @€ @€ @€ @€ @€ @€"Dˆ!B„"Dˆ!B„"Dˆ!B„ @€ @€ @€ @€ @€(@€ @€ @€> @€ @€ @€ @€€ @€ þ@€  @€0`À€ 0`À€ 0`À€ € (P @ ( @À @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ 0`À€ @€ @€p @€ @€РAƒ 4hРAƒ 4hРAƒ 4h @€ @€ @€þ @€ @€4hРAƒ 4 @€@€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @P @€ @€ @€ @€ @€  @€ @@„þ"Dˆ!B„"Dˆ!B„"DˆA€ @€ @€ @€ @€ @€ @€ @€ðA€ @€ @€ @€ @@ @€ @€ `€ À€ 0`À€ 0`À€  @À @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€À@€ @€ À€ 0 @€ @€ €ƒ @€ @€€ 4hРAƒ 4hРAƒ 4hРA @€ @€ @€ @€РAƒ 4hРð @€ @€ @€ @€ @€ @€ @€þ  @€ @€ @€ @€ @€€ @€ @€ @€ @€(P @€ @€ @€ @€ @€ @€ @€"Dˆ!B„"Dˆ!B„"Dˆ!B„ @€ @€ @€ @€ @€ @€ @€ @€ @þ€ @€ @€ @€ € @€ @€ @€ 0`À€ 0`À@ 0`À€pà€ @€pà€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ 0`À€ @€ @€ @€ @€þ4hРAƒ 4hРAƒ 4hРAƒ  @€ @€ @€ @€ @€€ 4hРAƒ  @€€ @€ @€ @€  @€ @€ @€ @€ @€‚ @€ @€ @€ @€ @€ @€ @€ @€ @€ < @€þ @€ @€ @€ @€ @€!B„"Dˆ!B„"Dˆ!B„"D @€ @€ @€ @€ @€ @€ @€ @€øP€ @€ @€ @€  @€ @€0@€`À€ 0`À€ 0`À€  @€þ8pàÀ8pàÀ  @€ @€ @€ 0`À@€ @€ @€ @€ @€0 @€ @€0`À€  @€ @€8 @€ @€РAƒ 4hРAƒ 4hРAƒ 4Ø@€ @€ @€ @€ @€hРAƒ 4hÐ@€x @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @À @€ @€ @€ @€ @€ @€€"Dˆ!B„"Œ!B„"Dˆ!B @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€@€ @€ @€€ @€ 0`À€ 0`À€ 0`@€ @€ @€` @€ @€ @€ 0 @€ 0 @€ @€ @€ @€ €  @€þ @€ 0`À€ @€ÀA€ @€ @€€ 4hРAƒ 4hРAƒ 4hРA @€ @€ @€ @€ @@ƒ 4hРAƒ @À @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€x @€ @€ @€ @€ @€ @€!B„"Dˆ!B„"Dˆ!B„" @€ @€ @€ @€ @€ @€ @€ @€ø @€ @€ @€ @€€ @€þ @€  @€0`À€ 0`À€ 0`À€ @€ @€€ @€  @€ @€0 @€ @€  @€ @€ @€ @€ @€ @€0`À€ @€ @€ @€ @€4hРAƒ 4hРAƒ 4hРAƒ  @€ @€ @þ€ @€ @€4hРAƒ 4 @€@€ @€ @€ @€ @€ @€@ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€€ @€ @€ @€ @€ @€ @€€þ"Dˆ!B„"Dˆ!B„"Dˆ!‚ @€ @€ @€ @€ @€ @€ @€ @À @€ @€   @€€ @€ @€ @À @€ 0`À€ 0`À€ 0 @€ @€ @€À@€ @€À@€ @€þ € @€ @€ @€À@€ @€ À€ 0 @€ @€8 @€ @€  Aƒ 4hРAƒ 4hРAƒ 4hÐ@€ @€ @€P€ @€  Aƒ 4hРA à @€ @€ @€ @€ @€ @€ @þ€ @ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€<ðàÁƒ @€ @€ @€ @€ @€Dˆ!B„"Dˆ!B„"Dˆ!B„ @€(@€ @€ @€ @€ @€ @€ @€ø þ@€ @€ @€ @€@ @€ @€ @€ 0`À€ 0`À€ 0`À€`À€ 0`À€ @€  @€ € @@†  @€ @€ @€ @€ @€ @€ @€ 0`À€ @€ €ƒ @€4h @€þ 4hРAƒ 4hРAƒ 4hРAƒ @€ @€ @€ @€ @€ 4hРAƒ  @€@€ @€ @€ @€ @€ @€ @€ @€‚ @€ @€ @€ @€ @€ @€ @€ @€ @€ àþ àÁƒ @€ @€ @€ @€ @@„"Dˆ!B„"Dˆ!B„"DˆA€ @€ @€ @€ @€ @€ @€ @€ @À @€ @€ @€  @€ @€0@€`À€ 0`À€ 0`À€ 0`À€ þ0`À€ 0`@€À@€ @€ @€2dÈ!C @ @€ @€ @€` @€ @€`À€  @€ @€ @€4hРAƒhРAƒ 4hРAƒ 4hРAƒ 4 @€ @€ @€ @€ @€hРAƒ 4hÐ@€ àÁ @€þ @€ @€ @€ @€ @€ @€ @€€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€< @€ @€ @€ @€ @€"Dˆ!B„"Dˆ!B„"Dˆ!B„ @€ @€ @þ€ @€ @€ @€ @€ @€> @€ @€ @€ @€@€ @@ @€ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€  @€  @€0 @€È!C† 2 @€` @€ @€ @€ € @€þ @€ 0`À€ @€p @€  Aƒ 4h  Aƒ 4hРAƒ 4hРAƒ 4hÐ@€ @€ @€ @€ @€ @@ƒ 4hÐ`ƒ  @€xð @€ @€ @€ @ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€< @€ Àƒ @€ @€ @€ @€ B„"Dˆ!B„"Dˆ!B„"Dˆ @€ @€ @€ @€P€ @€ @€ @€ @À @€ @€ @€ @€þ @€ @€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`@€` AƒÀ@€ @@† 2dÈ!ƒ @€ @€ @€ @€  @€ @€0`À€ @€ÀA€ @€€ 4Ø Aƒ4hРAƒ 4hРAƒ 4hРAƒ  @€ @€ þ@€ @€ @€4hРAƒ 4h @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ð@€ @€< @€ @€ @€ @€ @€þ"Dˆ!B„"Dˆ!B„"Dˆ!B„ @€ @€ @€ @€ @€ @€ @€ @€> @€ @€ @€ @€€ @€ @€ @À @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ €4h € @€2dÈ!C† þ @€ À€ @€ @€À@€ @€ @€ 0`@€ @€ @€hРAƒ 4РAƒ 4hРAƒ 4hРAƒ 4h @€ @€ @€ @€ @€  Aƒ 4hРA @€ àÁƒ @€ @€ @€ @@ @€ @€ `€ À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€0 @€À@€ @€2dÈ!C @€ € @€ @€ @€ @€`À€  @€ @ @€4hРAƒ 4hРAƒ 4hРAƒ 4h°Aƒ  @€ @€ @€ @€ @€РAƒ 4hР @€€ 4þhРAƒ 4hРÁƒ @€ @€€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€x @€ @€ Àƒ @€ @€ @€ @€!B„"Dˆ!B„"Dˆ!B„" @€ @€ þ@€ @€!B„"Dˆ!B @€ @€ðA€ @€ @€ @€ € @€ @€ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€À@€ @€  @€!C†  @€ @€0 @€ @€À@€ @€þ @€ 0`À€ @€p @€ @€€ 4hРAƒ 4hРAƒ 4hРAƒ 4h @€ @€ @€ @€ @€ @€€ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hð@€ @€  @€ @€ @€ @€ @€ @€ @€ @€þ @€A€ @€  @€ @€ @€€ @€ @€x @€ @€ @€ @€ @€€"Dˆ!B„"Dˆ!B„"Dˆ!‚ @€ @€ @€ @@„"Dˆ!B„"D @€ @€ @€€ @€ @€ @€ @€þ @€ @€0`À€ 0`À€ 0`À€ @€ 0`À€  @€ @€À@€ @€È!ƒ @€ @€ @€ @ @€ @€0`À€  @€ €ƒ @€РAƒ 4hРAƒ 4hРAƒ 4hРA @€ @€þ @€ @€ @€4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ @€ @€€ @€ @€ @€ @€ @€ @€ @€ @€  @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @þ€Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!‚ @€ @€| @€ @@ @€ @€@€ @€ @€€ @€ 0`À€ 0`À€ 0`@€ @€ @€ @€ @€  @€ @@†þ  @€ @€`À@€ @€ @€ @€ @€ 0`@€ @€ @€ @€ 4hРAƒ 4hРAƒ 4hРAƒ  @€ @€   @€ @€ @@ƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4h à @€ @€þ @€ @€ @€ @€ @€ @€ @€A€ @€ @€ @€x @€ @€ @€x @€ @€ @€ @€ B„"Dˆ!B„"Dˆ!B„"Dˆ0B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"D @€ @€þ @À @€ @€ @€€ @€ @€  @€0`À€ 0`À€ 0`À€ @€ @€0` @€ @€À@€ @€dÈ @€ @€ @€  @€` @€ @€ @€ hÀ€ @€ÀA€ @€Ðþ Aƒ 4hРAƒ 4hРAƒ 4hÐ@€ @€ @€ @€ @€ @€4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ à @€þ @€ @€ @€ @€ @€ @€"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!‚ @€ @€| @€ @€ @€ @@ @€ @€ `€ À€ 0`À€ 0`À€  @€þÀ€ 0` @€ @€  @€ @€ @@†  @€ @€ @ @ @€ @€ À€ 0 @€ @€ @€ @€€ 4hРAƒ 4hРAƒ 4hРAƒ @€ @€ @€ @€ @€РAƒ 4hРAƒ 4hРAƒ þ4hРAƒ 4hРAƒ 4x @€ @€@€ @€ @€!@€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€x @€ @€ @€ @€ B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆþ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„ @€ @€ àƒ @€ @€ @€ €€ @€ @€ @€ 0`À€ 0`À€ 0`À€ @ @€ @€ @€À@€ @€2dÈ @€ @€ @€0` @€  @€ @þ€ @€ 0`À€ @€à @€ @€4hРAƒ 4hРAƒ 4hРAƒ  @€ @€ @€ @€ @€ @@ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ @€ @ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€< @€ @€ @€ @€ @€ @€ @€ @€"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ`„"Dˆ!B„"Dˆ!B„"DˆA€ @€ @€> @€ @€ @€  @€þ @€0@€`À€ 0`À€ 0`À€  @€  @€ @€ @€ @€  @€ C @€ @€ @€ ` @€ @€ @€0`À€  @€ @P€ @@ƒ 4hРAƒ 4hРAƒ 4hР @€ @€þ @€ @€ @€hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ  @€ @€ @€ @€ @€ @€ @€ @€ @€ @€  @€ @€ @€ à @€ @€ @€x(@€ @€ @€ þ@€!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„ @€ @€ðA€ @€ @€ @€@€ @€ @€€ @€ 0`À€ 0`À€ 0`@€  @€ @€ @€ @€À@€ @€þ2Ì @€ @€ @€ € @€ @€ @€ 0`À€ @€p @€ @€4hРAƒ 4hРAƒ 4hРAƒ  @€ @€ @€ @€ @€ @€€ 4hРAƒ 4hРAƒ 4hРAƒ 4hРAƒ 4x @€ @€ @€þ @€ @€ @€ @€B€ @€ @€‚ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€€"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"D @€ @€þ @€€ @€ @€ @€€ @€ @€  @€0`À€ 0`À€ 0`À€0` @@… *T¨P¡B… *T¨P¡B… *T @€ @€ @€!C @€ @€ @€: @€ @€ @€0`À€ @€ €ƒ @€hþРAƒ 4hРAƒ 4hРAƒ 4 @€ @€ @€ @€ @€ @€hРAƒ 4hРAƒ 4hРA€ 4hРAƒ 4hРÁ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€< @€ @þ€ @€ @€ð @€ @€ @€ @€ˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!@ @€ @€ø @€ @€ @€ @€€ @€ @€ @À @€ 0`À€ 0`À€ 0 €þ*T¨P¡B… *T¨P¡B… *T¨P¡B…  @€À@€ @€2 @€ @€ @€  ƒ @€ @€ À€ 0 @€ @€ @€ @@ƒ 4hРAƒ 4hÐ`ƒ 4hРA @€ @€ @€ @€ @€ @€4hРAƒ 4hРAƒ þ4hРAƒ 4hРAƒ @€ @€@€ @€ @€ @€ @€ @€ @€ @€ @€A€ @€ @€ð@€ @€ @€ @€ @€ @€ @€P€ @€€"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dþˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„" @€ @€ @À @€ @€ @€@ @€ @€ @€ 0`À€ 0`À€ 0`À€ T¨P¡B… *T¨P¡B… *T¨P¡B… *T¨PA€ @€  @€È!ƒ @€ @€(@€: @€ þ@€ @€ 0`À€ @€ÀA€ @€4hРAƒ 4hРAƒ 4hРAƒ  @€ @€ @€ @€ @€ @€ @€ @€  Aƒ 4hРAƒ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€€ @€ @€ @€ @€ð @€ @€ @€ @€Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"DˆA€ @€ @€> @€ @€ @€  @€þ @€0@€`À€ 0`À€ 0`À€À@@… *T¨P¡B… *T¨P¡B… *T¨P¡B… *T @€ € @€€ 2 @€ @€ @€ÐA€ @€ @€`À€  @€ @€ @€РAƒ 4hРAƒ 4hРAƒ 4h @€ @€ @€8þpà @€ @€ @€ @€ @€ @€ àÁƒ @€ @€@€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„ @€ @€ðA€€ @€ @€ @€ € @€ @€ @€ 0`À€ 0`À€ 0`À€*T¨P¡B… *T¨P¡B… *T¨P¡B… *T¨P¡B @€ @þ€ÈA€ @€ @€ @€€ @€ @€ @€ 0`À€ @€à @€ @€€ 4hРAƒ 4hРAƒ 4hРA @€ @@àÀA€ @€ @€ @€ @€ @€ àÁƒ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€x @€ @€ @€ @€ @€x @€ @€ @€ @€"Dˆ!B„"Dˆ`„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"DˆA€ @€þ @€ @€ @€ @€ @€ @€ @€0`À€ 0`À€ 0`À€0P¡B… *T¨P¡B… *T¨P¡B… *T¨P¡B… *T @€À@€ @@†  @€ @€ @€t @€ @€P€0`À€  @€ @€ @€4þhРAƒ 4hРAƒ 4hРAƒ  @€ @€ €ƒÀA€ @€ @€ @€ @€ àÁƒ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€  @€ @€ à(@€ þ@€ @€ @€ @€ @€ @€ @€ B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B @€ @€ø @€ @€ @€ @€€ @€ @€ @À @€ 0`À€ 0`À€ 0 €þ€ *T¨P¡B… *T¨P¡B… *¬P¡B… *T¨P¡B…  @€ @€dÈA€ @€ @€ @@ @€ @€ @€ 0`@€ @€p @€  Aƒ 4hРAƒ 4hРAƒ 4hÐ@€ @€ @ @€8 @€ @€ @€ @€ @Àƒþ @€ @€ @€ @€ @€ @€B€ @€ @€ @€ @€ @€ @€‚ @€ @€ @€ @€ @€ @€ @€x @€ @€ @€ @€"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"þDˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„" @€ @€ @À @€ @€ @€€ @€ @€  @€0`À€ 0`À€ 0`À€P¡B… *T¨P¡B… *T¨P¡B… *T¨P¡B… *T¨ @€ € @@† 2 @€ @€ @€: @€þ @€ @€ 0`À€ @€ €ƒ @€€ 4hРAƒ 4hРAƒ 4hРA @€ @€ @€ €ƒ @€€ @€ @€ @€@€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€< @€ @€ @€ @€ @€ @€ @€ @€ @€ˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!À"Dˆ!B„"Dˆ!B„"Dˆ!B„"Dˆ!‚ @€ @€| @€ @€ @€ @@ @€þ @€ `€ À€ 0`À€ 0`À€ À@€*T¨P¡B… *T¨ @€  B… *T¨P¡B…  @€ @€2dÈ!ƒ @€ @€ÐA€ @€ @€`À€  @€  8 @€hРAƒ 4hРAƒ 4hРAƒ 4 @€ @€pà @€þ @€p @€ @€ @€ @€ @€ @€ @€  @€ @€0@€`À€ 0`À€ 0`À€ ` @€€!B„"Dˆ!B„B€  @€P¡B… *T¨P¡B…  €2dÈ @€ @€ @€è @€   @€`À€  @€ @€8p @€þ4hРAƒ 4hРAƒ 4hРA @€ @€ @€ @€ @€ @€àÀ8pàÀá @€ @€ @€ @€ @€ @€ @€A€ @€ @€ @€  @€ @€ @€P€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ B„"Dˆ!B„" @€ @€ @€ @€Dˆ!B„"Dˆ!B @€ @€ø @€ @€ @€ @€@€ @€ @€€ @€ 0`À€ 0`À€ 0`þ@B„"Dˆ!B„"Dˆ!B „ @€*T¨P¡B… *T¨PA€0 @€ @€ @€ @€  @€ @€ @€ 0`À€ @€ @ @@ƒ 4hРAƒ 4hРAƒ  @€8 @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€  @€ @€ @€  @€ @€ @€ @€ @€ @€ @€A€ @€ @€ @€ @€€ þ@€ @€ @À @€ hÀ€ 0`À€ 0`@"Dˆ!B„B€ @€ @€ @€*T¨P¡B… *T¨PA€ @€ @€ @€0 @€ @€ @€ 0`@€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€àA€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€  @€ðA€ @€ @€ @€€ @€ @€  @€0`À€ 0`À€ 0`À€  @€ @€ @€€ @€ @€þ  B… *T¨P¡B…  @€ @€ @€ € @€ @€ 0`À€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @þ€ @€€ @€ @€ @€ @@ @€ @€ `€ À€ 0`À€ 0`À€ À@€ @€ @€ „ @€ @€*T¨P¡B… *T¨PA€ @€ @€ @@0 @€ @€ À€ 0 @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€   @€ @€þ @€ @€ @€ @€ @€ Àƒ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€| @€ @€ @€ @€ € @€ @€ @€ 0`À€ 0`À€ þ0`À€P€ @€ @€@ @€ @€ @@… *T¨P¡B… * @€ @€ @€ € @€ @€ 0`À€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ þ@€ @€ @€ @€ @€(@€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€< @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ðA€ @€ @€ @€  @€ @€0@€`À€ 0`À€ 0`À€ À@€ @€ @€ „ @€ @€¨P¡B… *T¨P¡‚ @€ @€ @€þ @€ @€0`À€  @€ @€ @€ @€ @€ @€ @€ @€ @€  @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ Àƒ @€ @€ @€ @€@ƒ 4hРAƒ† @€ @€hРAƒ 4hРAƒ  @€ @€ @€ @€ @€ @€þ@€ @€ @€€ @€ 0`À€ 0`À€ 0`@€ @€ @€ @€  @€ @€ @€€ *T¨P¡B… *T @€ @€ @€À@€ @€ @€€ 0`À€ @€ @€ @€ @€ @€ @€ @€ @þ€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @@ @€ @€ @€ @€ @€þ< @€ @€ @€ @€4hРAƒ  @€hРAƒ† € 4hР!@€ @€ Aƒ 4hРAƒ | @€ @€ @€ @€€ @€ @€  @€0`À€ 0`À€ 0`À€` @€ @€ @€!  @€þ @€P¡B… *T¨P¡B…  @€ @€ @€  @€ @€0`À€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€P€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ Àƒ @€ @€ @€4hÐ @€ @€ @€hÐ @  @€ @€ @€ þ@€Р!àƒ @€ @€ @€ @@(@€ @€ @À @€ 0`À€ 0`À€ 0 @€ @€ @€ @€ @€ @€ @€*T¨P¡B… *T¨ @€ @€ @€À@€ @€ À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 4`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ @€ @€ @€ @€ @€< @€ @€ @€4hÐ @€ @€ @€ @ 4  @€ @€ @€ @€ @€ @€ @€ @€ @€@ @€ @€ @€ 0`À€ 0`À€ þ0`À€` @€ @€ @€€ @€ @€ @€P¡B… *T¨P¡B…  @€ @€ @€ @€ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0þ`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0 @€ @€ @€€ @€ @€ @€ @€ @€hР!@€ @€ @þ€ @€¨!@€ @€ @€ @€ @€ðA€ @€ @€ @€  @€ @€0@€`À€ 0`À€ 0`À€  @ @€ @€€  @€ @€ @@T¨P¡B… *T¨PA€ @€ @€þ` @€ @€`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0` þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€ @€ @€ @€< @€ @€hР!@€ @€ @€ @€ @@  @€ @€ @€ @€ @€€ @€ @€ @€ @€þ@€ @€ @€€P€ 0`À€ 0`À€ 0`À€` @€ @€@€„@B€ @€ @€ @@… *T¨P¡B… * @€ @€ @€ @€ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`þÀ€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ hÀ€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`@€ @€ @€ @€ @€þ Àƒ @€hР!@€ @€ @€ @€ @€j @€ @€ @€ @€ @€ðA€ @€ @€ @€ @€ @€ @€0`À€ 0`À€ 0`À€ @€ @€@€!@€ @€$ @€þ @€ @€T¨P¡B… *T¨P¡‚ @€ @€0 @€ @€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ þ0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€ @€ @€ @€x @€РAC€ @€ @€ @€ @€  † @€ @€ @€þ @€ @€€ @€ @€ @€ @€€ @€ @€ @À @€ 0`À€ 0`À€ 0 @€` @€@€!@€ @€@B€ @€ @€ @@… *T¨P¡B… * @€€ @€ @ @€ @€ 0`À€ 0`À€ 0`Àþ€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À@ 0`À€ 0`À€ 0`À€þ 0`À€ 0`@€ @€ @€ @€ @€ @€РAC€ @€ @€ @€ @€ @€5 @€ @€ @€ @€ @€| @€ @€ @€ @€@ @€ @€ @€ 0`À€ 0`À€þ 0`  @€€B€ @€ @€H A‚„ @€ @€¨P¡B… *T¨P¡B @€ @€ @€ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ þ0`À€ 0`À€ 0`À€ 0`À€ 0Ѐ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€ @€ @€ @€<РAC€ @€ @€ @€ þ@€ @€¨!@€ @€ @€ @€ @€ @À(@€ @€ @€ @@ @€ @€ `€ À€ 0`À€ 0`À€  @€0B€ @€ @€PB€H A‚ $H @€ @€*T¨P¡B… *T @€ @€þÀ@€ @€`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 4`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`@€ @€ @€ @€ @€ Àƒ @€ @€  @€ @€ @€ @€€ @€ @€ @€ @€ @€| @€ @€ @€ @€þ € @€ @€ @€ 0`À€ 0`À€ 0`À€ € @€ @€ @€€ @€ €  @€P¡B… *T¨P¡B…  @€ @€ @€ @€ 0`À€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€€ @€ 0`À€ @€ @€ @€ @þ€ @€< @€ @€ @€ @€ @€ @€Ô @€ @€ @€ @€ @€ àƒ @€ @€ @€ @€ @€ @€0`À€ 0`À€ 0`À€ @€  @€ @@ @€(!@€þ @€@‚„ @€*T¨P¡B… *T¨PA€ @€` @€ @€0`À€  @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€   @€ @€ @€ @€ @€ @€ @€ @€ @€ @€`À€ 0`@€ @€ @€ @€ @€àA€ @€ @€ @€ @€ @€  † @€ @€ @€þ @€ @€> @€ @€ @€P€@€ @€ @€€ @€ 0`À€ 0`À€ 0`@€` @€ @€ @€ @@  @€ @€H @€  B… *T¨P¡B…  @€ @ @€ @€ 0`@€ @€ þ@€ @€ @€ @€ @€ @€ @€ @€ @€(@€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ 0`À€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€j @€ @€ @€ @€ @€ àƒ @€ @€ @€€ @€ @€  @€0`À€ 0`À€þ 0`À€ @ @€ @€ @€J @€ @€ €„ @€*T¨P¡B… *T @€ @€ @€ @€ 0`À€ @€  @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€0`À€ 0 @€ @€ @€ @€ @€ð @€ @€ @€ @€þ @€ @€PC€ @€ @€ @€ @€ @€ @€ @€ @€ @@ @€ @€ `€ À€ 0`À€ 0`À€  @€ @€ @€ @€PB€ @€€ @€ @€ @€€ *T¨P¡B @þ€ € @€ À€ 0 @€ @€ @€ @€ @€ @€P @ ( @€ @€  (P  @€ @€ @€ @€ @€ @€ @€ @€ @€ @€Z´hÑ¢E  @€ @€ @0`À€!@€þ @€ @€ @€ @€ @€ @€ @€ 0`À€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€€ @€ @€ @€ @€ @€ø @€ @€ @€ @€þ € @€   @€ 0`À€ 0`À€ 0`À€À@€ @€ @€ @€% @€ @€ @  @€¨P¡B… * @€ @€  @€ @€ 0`À€ @€ @€ @€ @€ @€ @!@€€…þ @€   @ (P @!@€ @€ @€P€ @€ @€ @€ @€ @€Z´hÑB€hÑ¢E‹ @€ @ 0 @€0`À€!@€ @€ @€ @€ @€ @€ @€`À€ 0`@€ @€ @€ þ@€ @€< @€ @€ @€ @€ @€ @€Ô @€ @€(@€ @€ @€ @€€ @€ @€ @€  @€ @€0@€`À€ 0`À€ 0`À€  @€ @€ˆ!B„" @€(!@€þ @€&L˜0aB€ @€ @@… *T¨PA€ @€` @€ @€0`À€  @€ @€ @€ @€ @€@…T¨P¡B…  @!@€ @€( `ÅŠ+V¬X!@€( @€ @€ @€ @€ @€ @€ @€ @€þ´h!@€\¸páÂ… h!@€ @€0 FŒ1bĈ!@€0 @€ @€ @€ @€ @€ @€ @€ 0`À€ @€ @€ @€  @€ Àƒ @€ @€ @€ À† 6lذ!@€ @@  @€pàÀ @€þ @€ @€| @€ @€ @€ @€@€ @€ @€€ @€ 0`À€ 0`À€ 0`@€ @€ B„"Dˆ!B„ @@  @€&L˜0a„ &L @  @€ @€ @€ @€ @€ @€ 0`À€ @€þ @€ @€ @€€…P¡B… *T¨P!@€( @€P  @€€+V¬X±bÅŠ€B€ @€ @€ @€ @€ @€ @€ @€ÐB€¸páÂ… .\¸p!@€€- @€`À @€€1bĈ#FŒC€ @€€ @€ @€ @€ @þ€ @€`À€ 0`@€ @€ @€ @€ @€ @€ @€ @€ @€6lذaÆ  @€j @€À8pàÀC€ @€ @€ àƒ @€ @€ @€€ @€ @€  @€0`À€ 0`À@þ 0`À€ € @€"Dˆ!B„"Dˆ @€” @€0a„ &L˜0a„  !@€ @€ @€ @€0 @€ @€0`À€ @€ @€ @€ @€   @… *T¨P¡B… €…@!@€V¬X±bÅŠ+V¬X!@€(P @€ @€þ @€ @€ @€   @€ @@‹ À… .\¸páÂ… .  …C€Ĉ#FŒ1bĈC€`À @€ @€ @€ @€ @€ @€ @€ 0`À€ @€ @€ @€ @€ð @€ @€ @€ @€lØþ°aÆ 6lذ!@€PC€ 8pàÀ8 @€ @€P€> @€ @€ @€ @€€ @€ @€ @À @€ 0`À€ 0`À€ 0 @€  @€Dˆ!B„"Dˆ!B„  „ @€ &L˜0a„ &L˜ @  @€ @€ þ@€ € @€ À€ 0 @€ @€ @€ @€ @€( @€*T¨P¡B… *T¨¨B€  @ °bÅŠ+V¬X±bÅŠ+ @  @€ @€ @€ @€ @€ @€ @€- @€.\¸páÂ… .\¸p!@€Z´h!@ #FŒ1bĈ#FþŒ1 @  @€ @€ @€ @€ @€ @€0`À€ 0 @€ @€ @€ @€ @€ @€ @€ @€`Æ 6lذaÆ 6 @€5 @€8pàÀ8pàÀC€ @€ @€ðA€ @€ @€ @€þ@ @€ @€ @€ 0`À€ 0`À€ 0`À€` @€ B„"Dˆ!B„"D @€% @€&L˜0a„ &L˜0a„ @€ @€ @€ @€  @€ @€ 0`À€ @€ @€ @€ @€@!@€¨P¡B… *T¨P¡B… þ @ ( @€€+V¬X±bÅŠ+V¬X±B€ @!@€ @€ @€ @€ @€ @€ @€´ @€¸páÂ… .\¸páÂ…  @@ 0 @@Œ1bĈ#FŒ1bĈ!@€À @€ @€ @€ @€ @€ @€ @€ 0`À€ @€ @€þ @€ @€ð @€ @€ @€ @€6lذaÆ 6lذ!@€¨!@€À8pàÀ8 @€ @€ @€€ @€ @€ @€  @€ @€0@€`À€ 0`À€ 0`À€  @ @€€"Dˆ!B„"Dˆ!B„PBþ€`„ &L˜0a„ &L @€ @€ @€ @€À@€ @€`À€  @€ @€ @€ @€ … @… *T¨P¡B… *T¨P!@€° @€¬X±bÅŠ+V¬X±bÅŠ @€ @€ @€ @€ @€ @€ @€ÐB€þ À@.\¸páÂ… .\¸p!@€´ @€Ĉ#FŒ1bĈ#FŒ1 @€ @€ @€ @€ @€ @€ @€`À€ 0`@€ @€ @€ @€ @€ @€ @€ @€lذaÆ 6lذaÆ  @@  @8pàÀ8pàÀ!@€þ @€ @€| @€ @€   @€ € @€ @€ @€ 0`À€ 0`À€ 0`À€0 @€ˆ!B„"Dˆ!B„" @€€ @€&L˜0a„ &L˜0a„ @€ @€ @€ @€ @€ @€ 0`À€ @€þ @€ @€ @€ @€*T¨P¡B… *T¨P¡B…  €…°bÅŠ+V¬XpÅŠ+V¬X!@€€B€ @€ @€ @€ @€ @€ @€€ @€\¸páÂ… .\¸páÂ…   … FŒ1bĈ#FŒ1bĈ!@€€!@€ @€ @€ @€ þ@€ @€ @€ 0`À€ @€ @€ @€ @€< @€ @€ @€`Æ 6lØhÆ 6lذ!@€Ô @€pàÀ8pàÀ @€ @€ @À @€ @€ @€ @€ @€ @€0`À€ 0`À€þ 0`À€ € @„"Dˆ!B„"Dˆ!@€” @€˜0a„ &L˜0a„ & @  @€ @€ @€ @€ @€0`À€ @€ @€ @€ @€  @€ B… *T¨P¡B… *T¨ @€X @€+V¬X±bÅŠ+V¬X±bÅ  @€( @€þ @€ @€ @€ @€ @€Z @€àÂ… .\¸páÂ… .\¸ @€- @€1bĈ#FŒ1bĈ#F  @€ @€ @€ @€ @€ @€ @€ `À€ 0`@€ @€ @€ @€ Àƒ @€ @€ @€6lþذaÆ 6lذaÆ   †€8pàÀ8pà @€ @€ @€> @€ @€ @€ @€€ @€ @€ @À @€ 0`À€ 0`À€ 0 @€  @€Dˆ!B„"Dˆ!B„  „ @€ &L˜0a„ &L˜0!@€ @€ @€þ @€ € @€0`À€ 0`À€ @€ @€ @€ … @€*T¨P¡B… *T¨P¡B…ÀB€X±bÅŠ+V¬X±bÅŠ+V @€€B€ @€ @€ @€ @€ @€ÐB€ @€.\¸páÂ… .\¸páB€h!@€€#FŒ1bĈ#þFŒ1bÄ @€C€ @€ @€ @€ @€ @€ @€ 0`À€ 0`@€ @€ @€ @€ @€ @€ @€°aÆ 6lذaÆ 6l @€5 @€8pàÀ8pàÀ‡ @€ @€ðA€ @€ @€ @€þ@ @@ @€  @€0`À€ 0`À€ 0`À€À@€ @„"Dˆ!B„"Dˆ @€J @€L˜0a„ &L˜0a„  @  @€ @€ @€  @€ À€ 0`À€ 0 @€ @€ @€ @€ @€¨P¡B… *T¨P¡B… þ @€ @€€+V¬X±bÅŠ+V¬X±B€ @€(   @€ @€ @€ @€ @€€ @€páÂ… .\¸páÂ… . @€€ @€€1bĈ#FŒ1bĈC€ @€0 @€ @€ @€ @€ @€ @€0`À€ 0`À€  @€þ @€ @€ð @€ @€ @€ @€ 6lذaÆ 6lذ!@€¨!@€À8pàÀ8p @€ @€ @€ @€ @€ @€ @@ @€ @€ `€ À€ 0`À€ 0`À€  @€ @€"Dˆ!B„"Dˆ!B€PþB€ À„ &L˜0a„ &L @€H @€ @€ @€0 @€ @€ 0`À€ 0`À€ @€ @€(@€  @€ @€*T¨P¡B… *T¨P!@€`!@€X±bÅŠ+V¬X±bÅŠ @€ … @€ @€ @€ @€ @€´ @€þ @€.\¸páÂ… .\¸p!@€´ @€ˆ#FŒ1bĈ#FŒ @€C€ @€ @€ @€ @€ @€`À€ 0`À€ 0`@€ @€ @€ @€ @€ @€ @€°aÆ 6lذaÆ  @€€ @€8pàÀ8pàÀ!@€þ @€ @€ø @€ @€ @€ @€ € @€ @€ @€ 0`À€ 0`À€ 0`À€0 @€ B„"Dˆ!B„ @€€ @€&L˜0a„ &L˜0!@€  @  @€ @€ @ @€0`À€ 0`À€ 0 @€þ @€ @€€B€ @€¨P¡B… *T¨P¡B… @  @€€+V¬X±bÅŠ+V¬ @€ @€P @€ @€ @€ @€ @€ÐB€ @€¸páÂ… .\¸páÂ…  … @@Œ1bĈ#FŒ1b @€ @€` @€ @€ @€þ @€ @€ @€ 0`À€ 0`À€ @€ @€ @€x @€ @€ @€ @€6lذaÆ 6l @€Ô @€À8pàÀ @€ @€ @À @€ @€ @€ @€ @€ @€0`À€€ 0`Àþ€ 0`À€  @ @€Dˆ!B„"Dˆ @€(!@€ À„ &L˜0a„  @€H @€ @€ @€ @€ @€ 0`À€ 0`À€ @€ @€ @  @€ @€ *T¨P¡B… * @€X @€¬X±bÅŠ+V¬X±B€ @€ …þ @€ @€ @@ @€ @€€ @€ @€.\¸páÂ… . @€Z @€ˆ#FŒ1bĈ#† @€ † @€ @€ @€ @€ @€0`À€ 0`À€ 0`@€ @€ @€ Àƒ @€ @€ @€þذaÆ 6lذaC€  † @€8pàÀ8 @€   @€| @€ @€ @€ @€@€ @€ @€€ @€ 0`À€ 0`À€ 0`@€ @€ @„"Dˆ!B€ @@  @€L˜0a„ & @€ €„ @€þ @€` @€ @€ 0`À€ 0`À€  @€ @€ @€( @€ @€PP… *T¨ @€ €… @€+V¬X±bÅ  @€ @€  @€ @€ @€ @€ @€Z @€ @€páÂ… .\¸ @€ÐB€ @€1bĈþ#F  @€ @€` @€ @€ @€̘1cÆ  @€ @€ 0`À€ 0`À€ @€ @€ @€<(@€ @€ @€ @€6lذaÆ  @€j @€€8pà @€ @€ @€ðA€ @€ @€ @€þ€ @€ @€  @€0`À€ 0`À€ 0`À€ € @€!@€ @€J @€ @€& @€ @€$ @€ @€ @€ @€ À€ 0`À€ 0`À€ @€ @€@!@€ @€ @€¨ @€þ @€, @€ @À  @€ @€ @  @€ @€ @€ @€h!@€ @€ @€\¸ @€ @€€ @€ @@  @€ @€ † @€  @€˜1c†˜1cÆŒ3f @€0`À€ 0`À€  @€þ @€ @€ Àƒ @€ @€ @€ @€  @€PC€ @€à @€ @€ @€ @€€ @€ @€ @€ @@ @€ @€ `€ À€ 0`À€ 0`À€  @€ @€ @€ @€þ  „ @€ @€ @€ €„ @€ @€ H‘B€ @€ 0`À€ 0`À€ @€ @€ … @€ @€ @€ @€`!@€ @€ @€ @€ @€P @€ @€ @€ @€  … @þ€€ @€ @€ @€h!@€ @€ @€ @€ @€À @€ @€0c† @€ `ÆŒ3 @€ 0`À€ 0`@€ @€ @€ @€ @€ @€ @€ @€ @€ @€€ @€ @€ @€þ @€ @€ø @€ @@ @€ @€@ @€ @€ @€ 0`À€ 0`À€ 0`À€ € @€ @€ @€% @€ @€ @€ @€$ @€ @€0 @€)R¤ @€ À€ 0`À€  @€þ @€ @€ @€ @€ @€ @€ @    @€ @€ @€€BÀ  @€ @€ @€ @€- @€ @€ @€ @€ @@  @€ @€ @€ @€ @  @€ `Æ þ @€ @€0cÆ 0`À€ 0`À€ @€ @€ @€ð @€ @€ @€P€ @€ @€¨!@€ @€ @€ @€ @€ @€€ @€ @€ @€  @€ @€0@€`À€ 0`þÀ€ 0`À€  @€  @€ @€ @€(!@€ @€ @€ @€@B€ @€0` @€ @@Š) @€(@€ @€ @€ @€  @€ @€ @€ @€ @€° @€ @€ @€ @€ @þ ¼xñâÅ  @€ @€ @€´ @€ @€ @€ @€ @€Z @€ @€ @€ @€ @€0`È!@€ @ÀŒ @€ @€ @€˜1c† @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @@  @€ @€ @€ @€ @€| @€ @€ @€ @€@€ @€ @€€ @€ 0`À€ 0`À€ 0`@€` @€ @€ @€  @€€ @€ @€ @€ @€$ @€þ € @€ E  @€ @€ @€ @€ … @€ @€ @€ @€ €… @€ @€ @€ @ ( @€¼xñB€ @€ @€ÐB€ @€ @€ @€ @€  … @€þ @€ @€ @€`À€!@€2d @€3f @€ @€ @€ @€f̘1cÆŒ3f̘1cÆŒ3f̘1C€ @€ @€x @€ @€ @€ @€ @€ @€j @€ @€ @€ @€ @€ àƒ @€ @€ @þ€€ @€ @€ @€0`À€ 0`À€ 0`À€ @€ @€ @€ @€” @€ @€ @€ @€0`À@€ € @€ @€¤H‘"EŠ)R¤H‘"EŠ)R¤H‘"EŠ)R¤H‘"EŠ) @€(P  @€ @€ @€ @€þ @€, @€ @€ @€ @@(P @€ @€^¼ @€ @€ @€€` @€ @€ @€ @€ @€- @€ @€ @€ @ 0`À€!@€ @† fÌ @€ @€ @€ @€ @€ @€ @€3þf̘1cÆŒ3f̘1cÆŒ3f̘!Àƒ @€ @€ @€ @€ @€P  @€ @€ @€ @€ @€> @€ @€ @€ @€€ @€ @€ @À @€ 0`À€ 0`À€ 0 @€0`À€ 0`À€ 0`À€ 0þ`À „0`À@€ @€ 0`À€ 0`À@€ 0 € @€ @€ @€ @€ @€ @€0EŠ)R¤HB€(P @ (P @ (P @ (P @ (P @ (P @ (P @ (P @ (P @€ @€ @À‹ @€ @€Z  0`À€þ 0`À€ 0`À€ 0`À€ 0`Àh 0`À€ 0`À€ 0`À€ 0 @€ @€1C€ @€ @€ @€ @€ @€(@€ @€ @€ @€< @€ܸqãÆ7nÜ @€7nܸ!@€€7n àÆ¸qãÆ5pãÆ¸qC€7nÜ @€þ @€€7nܸqãÆ7nÜðA€ @€ @€ @€@ @€ @€ @€ 0`À€ 0`À€ 0`À€ `„ @€ @€ @€ 0` @€ 0`À€ d @€ @€ @€  @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€xñâ… @€h!@€ @€ @€ @€ @€ @@  @€ @€  @€ @€ @€ @€f @€þ @€ @€ @€ @€ @€ @€ @€ @€àáÆ7nܸqC€ @À7nÜ @€€7n àÆ¸qㆨqãÆ ¸qã†7nÜ @À7nܸqãÆ7n @€ @€€ @€ @€ @€  @€ @€0@€ À€ 0þ`À€ 0`À€  @€F @€ @€ @€PB€ @€ @€ @€ @€8!@€ @€ @€ @€ @€ @€ @€ @€  @€ @€ @€ @€ @€° @€ @€ @€ @€ @þ€ @€ @€€¼x!@€ @@  @€ @€ @€ @€ @€´ @€ @€ @€ @€ @€ @€0C€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @@  @€ @€ @@ @€ @€ø @€ @€ @€ @€ € @€ @€ @€ 0`À€ 0`À€ 0`À€0B€ @€ @€ @€€ @€ @€ @€ @€ @€€þ @€ @€ @€àÇ>|øðáÇ> @€ @€ … @€   @€ @€ @  @€ @€ @€ @€ @€ @€ @€€ @€- @€ @€ @€ @€ @€  … @€þ @€ @€ @€ @€ @€€ @€ @€ @€ @€œ8qâĉ'Nœ8qâĉ @€ @€P€ð @€ @€ @€ @€ @€ @€Ô @€ @€ @€ @€ @€ @À @€ @€ þ@€ @€ @€ @€0`À€ 0`À€ 0`À€ @À @€ @€ @€” @€ @€ @€ @€ @€œ(@€ @€ @€ @€>|øðáÇ>|øðáÇ @€ @€P @€ @€ @€ @€þ @€X @€ @€ @€ @€ @€ @€ @€xñB€´ @€ @€ @€ @€ @€ @€- @€ @€ @€ @€ @€ @€˜!@€ @€ @€ @€àĉ'Nœ8qâĉ'Nœ8q"@€þ @€ @€ @€ @€ @€ @€ @€ @€  † @€ @€ @€ @€ @€> @€ @€ @€ @€€ @€ @€ @À @€ 0`À€ 0`À€0`@€Œ @€ @€ @€þ @@  @€ @€ @€ @€ @À  @€ @€ @€|øðáÇ>|øðáÇ>| @€ @€€B€ @€ @€ @€ @€ÀB€ @€ @€ @€ @€ @€ @€ @€/hÑB€ @€þ @€ @€ @€ @€ÐB€ @€ @€ @€ @€ @€ @À  @€ @€ @€ @€'Nœ8qâĉ'Nœ8qâĉ @€ @€ @€< @€ @€ @€ @€ @€ @€5 @€ @€ @þ€ @€ @€ðA€€ @€ @€ @€€ @€ @€  @€0`À€ 0`À€ 0`À€ `„ @€ @€ @€J @€ @€ @€ @€ @€N @€ @€ @€àÇ>|øðáÇ>|øðáC€þ @€ @€ @€ @€ @€ @€ @@, @€ @€ @€ @€ @€ @€ @€ àE  @€ @€ @€ @€ @€ @€- @€ @€ @€ @€ @€ @€f @€þ @€ @€ @€œ8qâĉ'Nœ8qâĉ'Nœ @€ @€ @€ð @€ @€   @€ @€ @€PC€ @€ @€ @€ @€ @€ @€ @€ @€ @@ @€ @€ `€ À€ þ0`À€ 0`À€  @€# @€ GŽ @€PB€ @€ìرC€ @€ @€pB€ @€ @€P€>|øðáÇ>|øðáÇ> @€ @€@!@€ @€ @€@„ @€`!@€ @€:tè @€ @€ þ@€ @€ @€ @€Z @€ @€ @€ @€€  @€h!@€ @€K–, @€ @€ @€ @€ `† @€(@€ @€àĉ'Nœ8qâĉ'Nœ8qâĉ @€ @€ @€ @€ @€ @€þ @€UªT @€ @€€ @€`ÅŠ @€ @€ @€ø @€ @€ @€ @€ € @€ @€ @€ 0`À€ 0`À€ 0`À€!@€ @@Ž9rÌ‘#G @€% @€رcÇŽ;vì @€ @€ @€þ' @€ @€ @€ðáÇ>|øðáÇ>|øð!@€ @€ @  @€ @€@„"Dˆ!"@€ @  @€tèСC‡: @€ @€ @€ @€ @€ÐB€ @€ @€ @€€ $H"A‚D€ @€€ @€–þ,Y²dÉ’%K @€ @€ @€ @€f @€ @€ @€ @€'Nœ8qâĉ'Nœ8qâĉ'N @€ @€ @€< @€ @€ @€ @€ªT©R¥J•* @€Ô @€ ÀŠ+V¬X±bE€ @€ @€ @À @€ @€þ @€  @€ @€0@€`À€ 0`À€ 0`À€  @€€ @€9räÈ‘#GŽ9rä @€PB€ `ÇŽ;vìØ±cÇŽ @€ @€8!@€ @€ @€ @€>|øðáÇ>|øðáÇ @€ @€P @€ @€ @"Dˆ!B„þ"D @€X @€èСC‡:tèСC€€ @€ @€ @€ @€ @€- @€ @€ @€ @€$H A‚ $H @€´ @€X²dÉ’%K–,Y²d‰ @€ @€ @€ `† @€ @€ @€Nœ8qâĉ'Nœ8qâĉ'Nœ8q"@€þ @€ @€àA€ @€ @€ @€T©R¥J•*UªT©RE@ @@  @€+V¬X±bÅŠ+V¬ @€ @€ @€| @€ @€ @€ @€@€ @€ @€€ @€ 0`À€ 0`À€ 0`@€F @€È‘#GŽ9räÈ‘#Gþ @€€ @€€;vìØ±cÇŽ;vì @€ @€ @À  @€ @€ @€øðáÇ>|øðáÇ>   @€€B€ @€ @€ˆ!B„"Dˆ!BD€ @  @€:tèСC‡:t @€ @€ @€ @€ @€h!@€ @€þ @€ @€ A‚ $H A‚D€ @@  `É’%K–,Y²dÉ’%K @€ @€ @€ @€3 @€ @€ @€8qâD€'Nœ8qЉ'Nœ8qâĉ @€ @€ @€ @€ @€ @€  J•*UªT©R¥J•*U @€j @€X±bÅŠ+V¬X±bþÅŠ @€ @€ àƒ @€ @€ @€€ @€ @€  @€0`À€ 0`À€ 0`À€0B€ GŽ9räÈ‘#GŽ9rä @€” @€vì¸cÇŽ;vìØ±cÇŽ @€ @€œ @€ @€ @€ À‡>|øðáÇ>|ø @€þ @€ @€ @€ @€@„"Dˆ!B„"D @€X @€:tèСC‡:tèСC€ @€ @€ @€ @€ @@  @€ @€ @€@‚ $H A‚ $H @€Z @€K–\²dÉ’%K–,Y²d‰ @€ @€ @€0C€þ @€ @€ À‰' À‰'Nœ8qâĉ' @€ @€ @€x @€ @€ @€ @€UªT©R¥J•*UªT©RE€PC€`ÅŠ+V¬X±bÅŠ+V @€ @€ @€ @€ @€ @€ @@ @€ @€  @À @€ þ0`À€ 0`À€ 0 @€# @€räÈ‘#GŽ9räÈ‘#G @€€ `ÇŽ;vìØ±cÇŽ;vì @€ @€ à„ @€ @€ @€>| @€ @€ @€ @€  @€ @€ @"Dˆ!B„"Dˆ!"@€ €…СC‡:tèСC‡: @€þ @€ @€ @€ @€´ @€ @€ @€ @€$H A‚ $H A‚D€  …X²dÉ’%K–,Y²dÉ’%K @€ @€ @€ @€3 @€ @€ @€'Nœ @€ @€ @€ @€ @€àA€ @€ @€ @þ€T©R¥J•*UªT©R¥J•*U @€€ @€+V¬X±bÅŠ€V¬X±bÅŠ @€ @€ðA€ @€ @€ @€@ @€ @€ @€ 0`À€ 0`À€ 0`À€!@€#GŽ9räÈ‘#GŽ9r @€” @€;vìØ±cÇŽ;vìØ±c‡ @€ @€þ' @€ @€ @€>|øð!@€ @€ @€ @€ … @@ @€!B„"Dˆ!B„"D @€X @€:tèСC‡:tèСC€ @€ @€ @€ @€  … @€ @€ @€ A‚ $H A‚ $ @€- @À’%Kþ–,Y²dÉ’%K–,Y²D€ @€ @€ @€˜!@€ @€ @€œ8q"@€ @€ @€ @€   @€ @€ @€ @€ @@•*UªT©R¥J•*UªT©RE€¨!@€°bÅŠ+V¬X±bÅŠ+V @€ @€ @€€ @€ @€þ @€  @€ @€0@€`À€ 0`À€ 0`À€  @À @@Ž9räÈ‘#GŽ9räÈ‘C€  „رcÇŽ;vìØ±cÇŽ;v @€P€pB€ @€ @€ðáÇ @€?~üøñãÇ?~üøñãÇ?~üøñãÇP @€ @€ €"Dˆ!Bþ„"Dˆ!"@€ €…tèСC‡:tèСC‡: @€ @€ @€ @€ @€Z @€ @€ @€ $H A‚ $H A"@€ÐB€–,Y²dÉ’%K–,Y²dÉ’% @€(@€ @€ @€€ @€ @€ À‰ @€xðàÁƒ @€~ü @€ @þ€ @€ @  @€ @€ B„"Dˆ!B„€Dˆ @€ €…tèСC‡:tèСC‡:tèÐ!@€ @€ @€ @€ @€- @€ @€ @€€ $H A‚ $H @€ÐB€K–,Y²dÉ’%K–,Y²dÉ’%K– @€ @€ @€ @À þ @€ @€pâD€ @€ @€ @€ @€  @€ @@ @€ @€UªT©R¥J•*UªT©R¥JPC€ ÀŠ+V¬X±bÅŠ+V¬X @€ @€ @€> @€ @€ @€ @€€ @€ @€ @À @€þ 0`À€ 0`À€ 0 @€# @€räÈ‘#GŽ9räÈ‘#G @€J `ÇŽ;vìØ±cÇŽ;vìØ±cÇŽ @€ @À  @€  >|øð!@€ðC€ @€ @€ @€@!@€ @€ @€"Dˆ!B„"Dˆ!B„ˆ @€, C‡:tèСC‡:tèСC‡:þ @€ @€ @€ @€h!@€ @€ @€ @€$H A‚ $H A‚D€ @€-X²dÉ’%K–,Y²dÉ’%K–,Y²d‰ @€ @€ @€fP€ @€ @€'N @€< @€ @€ @€ @€(PàA€ @€ @€ þ@€P¥J•*UªT©R¥J•*U @@  @€V¬X±bÅŠ+V¬X±bÅŠ @€ @€ðA€ @€ @€ @€@ @€ @€ @€ 0`À€ 0`À€ 0`À€!@€( GŽ9räÈ‘#GŽ9räÈ!@€  „ìØ±cÇŽ;vìØ±cÇŽ;vìØ±C€ @€þ8!@€ @€øðáC€ àÇ @€ @€ @€ @€ @  @€ @€ B„"Dˆ!B„"Dˆ @€ÀB€:tèСC‡:tèСC‡:tèСC‡ @€ @€ @€ @@  @€ @€ @€€ $H A‚ $H @€  …þK–,Y²dÉ’%K–,Y²dÉ’%K–,Y"@€ @€ @€ @À  @€ @€8q"@€xxòäÉ“'Ož|ø @€~ü @ @€ @€þ @€ @€P @€ @€ @€Dˆ!B„"Dˆ!B„ @€, @‡:tè @‡:tèСC‡:tè @€ @€ @€ @€Z @€ @€ @€ @€H A‚ $H A‚‰(@€- `É’%K–, `É’%K–,Y²dÉ’%K– @€ @€ @€þf @€ @€àĉxxòäÉ“'Ož @€ @€ @€ @€€ @€ @€ @€€ @€þ 0`À€ 0`À€ 0`@€Œ @€ @€È‘#GŽ9räÈ‘C€  „ @€رcÇŽ;vìØ±cÇŽ @€N @€øð!@€ø!@€€ @€ @€ @€ @€€B€ @€ @€ @€Dˆ!B„"Dˆ @€ÀB€ @€èСC‡:tþèСC‡  @€ @€ @€  … @€ @€ @€ @€ A‚ $H  @€ÐB€ @€–,Y²dÉ’%K–,Y²dÉ @€ @€0C€ @€ @€'N ÀÓ'OžðC€ € @€þ @€ @€ @€P @€ @€ @€ @€!B„"Dˆ!BD€ €… @€ @‡:tèÐ!@€ @€ @€ @€h!@€ @€ @€ @€ @€ A‚ $H A"@€  … @€°dÉ’%K–,Y²dÉ’%K– @€ @þ€f @€ @€àĉ Àƒ€'Ož|ðC€ @€ @€€B€þ @€ @€ @€  @€ @€ @€€B€ @€"Dˆ!B„ˆ @ ÀB€ @‡:tèÐ!@€ @€ @€ @€´ @€ @€ @€ @€ ‰P€H A‚  @@   … @€ `É’%K–,Y"@€ þ@€Ì @€ @€ À‰ @€ @€ @€ @€ @€àA€ @€ @€ªT©R¥J•*UªT©"@€PC€°bÅŠ+V¬X @€ @€ @€ @€ @€> @€ @€ @€ @€ € @€ @€ @€þ 0`À€ 0`À€ 0`À€ÐB€ @€´h!@€#GŽ9räÈ!@€” @€(QB€ @€vìØ±cÇŽ;pB€ðáC€€D€   @€ @€ @€ … @€ @€ @€(P @€!B„"D @€, @€, @€þ:tÔ¡C‡ @€ @€ @€ @@  @€ @€ @€ @€$I"@€@‚ $H @€- @€Z´ @€ @€K–,Y²dÉ @€ `† @€ @€Nœ @€ @€ @€ @€ @€ @€ @€ @€þ¨R¥J•*UªT©R¥Š @@ @€+VZ±bÅŠ @€>|øðáÇ>|øðáÇøðáÇ àƒ @€ @€ @€ @€ @€ @€0`À€ 0`À€ 0`À€ @@  @€ @€€ @€€9räÈ‘#G  „ @€% @€þ°cÇŽ;vìØ!@€€ @€ü   @ A‚ $H A‚ "@€ @€ @€P @€ @€ @€ @  @"Dˆ!BD€ÀB€ €… C‡:tè @€ @€ @€ @€Z @€ @€ @€ @€ @€€$ @$H A‚Dþ€´ @€ @@  @€X²dÉ’%K– @€ @€3 @€ @€pâD€x%J”(Q¢D‰%J€Q¢D @€ @€ @€àA€ @€ @@•*UªT©R¥J•*U @€5j¨!@€X±bÅŠ+V @€|ø @€ @€øðáƒøðáÇ> @€ @€þ @€ @€€ @€ @€ @À @€ 0`À€ 0`À€ 0 @€Z @€ @€h!@€äÈ‘#GŽ9r @€€ @@  „ @€;vìØ±cÇŽ8!@€øð!@À€"@€P $H A‚ $H A @€ @€€B€ @€ @€þ @€  @€ˆ!B„" @  @€, @€:tèСC‡ @€ @€ @€ÐB€ @€ @€ @€ @€$ @€ A‚ $ÐB€  h!@€ @€€%K–,Y²d‰ @€0C€ @€ @€'N Àƒ€(Q¢D‰%J”(Q¢Dþ‰%J @€ @€ @€ @€ @€UªT©R¥J•*UªT @€jÔ @@  ÀŠ+V¬X±"@€øðA€ @€ @€ @€ðA€ @€ @€ @€@ @€ @€P€0`À€ 0`À€ 0`À€  … @€tèСþC‡- @@Ž9räÈ‘#‡(!€|ðC€ @€ @Š A‚ $H A‚þ $H  @€ @€  @€ @€  @€Š)R¤H‘"EŠ@!@€Dˆ!B„`!Àˆ#FŒ1bĈ, @€:tèСC€ @€ @€ @€h!@€ @€ @€ @€”(Q¢D‰%J”$ @€H A‚ h!€ &L˜0a„‰h!@€ `É’%K–,Y"@€þ @€Ì @€ @€ À‰ð%J”(Q¢D‰%J”(Q¢D‰%Š @€ @€ @€ @€ @@•*UªT©R¥J•*¨Q£ 4hРAƒ†€`ÅŠ+V¬X @€°`Á‚ ,X° @€ @€ @€ø @€ @€ @€ @€ € @€ @€ @þ€ 0`À€ 0`À€ 0`À€´ @€ C‡:tèСC‡Ž#GŽ9räÈ!@€%xðàÁƒø!@ @ E A‚ $H A‚ $H @€ @€P @€ @€  H‘"EŠ)R¤H‘"EŠ  @"Dˆ!BD€X1bĈ#FŒ1bĈ C‡:tè @€ @€ @€ @€Z @€P€ @€ @€%J”(Q¢D‰%J”$ @€$H A‚þ‰Z0a„ &L˜0a„ h!@€°dÉ’%K–, @€ @€f @€ @€àĉxˆ%J”(Q¢D‰%J”(Q¢D‰%Š @€ @€ Àƒ @€P¥J•*UªT©"@€5hРAƒ 4hРAƒF X±bÅŠ+V à,X°`Á‚ ,X° @€ @€ @€>(@€ @€þ @€ @€@€ @€ @€€ @€ 0`À€ 0`À€ 0`@€Z @€èСC‡:tèСC‡ŽÈ‘#GŽ9rä @@ `Á‚ ,X°`Á‚ ,X @€ @€ @€€ @€ @€ @€  @€ @€0@€`À€ 0`À€ 0`À€  @@  @€:tèСC‡:tèÐÑB€9räÈ‘#GŽ(Áƒø!@ @ @€( @€ @€  @€ @€  @€ @€  H‘"EŠ)R¤H‘"EŠA!@€"Dˆ!B„ˆX1bĈ#FŒ1bĈ#, @‡:tèÐ!@€ @€ @€ @€´ @€ @€ @€ @‰%J”(Q¢D‰%J”(I"@€$H Aþ‚‰Z0a„ &L˜0a„ &h!@€°dÉ’%K–, @€ @€f @€ @€àĉ Àƒ @€ @€¢D‰"@€ @€ @€ @€  J•*UªT©RE€5hРAƒ 4hРAƒ°bÅŠ+V¬ à,X°`Á‚ ,X°`Á"@€ @€ @€| @€ @þ€ @€ @€@€ @€ @€€ @€ 0`À€ 0`À€ 0`@€Z @€èСC‡:tèСC‡ŽÈ‘#GŽ9rä @@ € @€ @€ @€ @€€ @€ @€ @À @€ 0`À€ 0`À€ 0 @€- @€èСC‡:tèСCG äÈ‘#GŽ9r @@ |ðC€ @€ @€(† 2dÈ!C† 2dÈ @€ @€P @€ @€ @€EŠ)R¤H‘"P @€"Dˆ!B„ˆ`!Àˆ#FŒ1bD€ @‡:tèÐ!@€ @€ @€ @€h!  @€ @€ @€”(Q¢D‰%JH"@€H þA‚ h!@&L˜0aÂD€ÐB€ `É’%K–,Y"@€ @€Ì @€ @€ À‰àAÀ”)S¦L™2eÊ”)S¦L‘"@€ @@”(Q @€ @€< @€  J•*UªT©RE€Ô € 4hР!@@ °bÅŠ+V¬ @€€°`Á‚ ,X @€ @€P€ø @€ þ@€ @€ @€ € @€ @€ @€ 0`À€ 0`À€ 0`À€h!@€ @€tè @€€#GŽ9räÈ!@€J € @€% @€vìØ±cÇŽ;pB€ðáC€€D€ 2dÈ!C† 2dÈ!C†  @€ @€ … @€ @€þ @@‘"EˆB€ B„"Dˆ @€0bĈ° @€tèСC‡ @€ @€ @€ @€€ @€ @€ @€ @€%J ‰@‚ $H @€€`„‰ @€€ @€K–,Y²dÉ @€ `† @€ @€Nœ @€S¦L™2eÊ”)þS¦L™2eÊ) @€D‰E€ @€àA€ @€ªT©R¥J•*U @@  Aƒ†Ô @€+V¬X±bÅŠø @€,X° @€ @€ @€ @À @€ @€ @€ @€ @€ @€0`À€ 0`À€ 0`À€ @@  @€þ @€Z @€€9räÈ‘#G  „ @€(!@€°cÇŽ;vìØ!@€€ @€ ø!@ @ Å!C† 2dÈ!C† 2dÈ @€ @€P @€ @€ @€ @€ @"Dˆ!BD€`!@€ €… C‡:tè @€ @€ @€ @€´þ @€ @€ @€ @€ @€I @$H A‚D€h!@€ @€Z @€X²dÉ’%K– @€ @€g @€ @€àĉx˜2eÊ”)S¦L™2eÊ”)S¦L‘"@€ @€€(Q¢ @€ @€ @€P¥J•*UªT©"@€Ô @€PC€X±bÅŠ+V @þ€€ @€ @€ @€ @€> @€ @€ @€ @€€ @€ @€ @À @€ 0`À€ 0`À€ 0 @€´ @€€ @€  …È‘#GŽ9rä @€J @€ @@  @€;vìØ±cÇŽ8!@€øð!@À€"@€P 2dÈþ!C† 2dÈ!C† @€ @€€B€ @€ @€ @€P @€ˆ!B„" @€ @€ @€:tèСC‡ @€ @€ @€  … @€ @€ @@ @€H"@€ A‚ $H @€- @€  … @€€%K–,Y²d‰þ @€0C€ @€ @€'N ÀÔ)S¦L™2eÊ”)S¦L™2eÊ) @€ˆ%Š @€ð @€ @€€*UªT©R¥J  † @@  ÀŠ+V¬X±"@€ø @€ @€ @€ @€ðA€ @€   @€€ @€ @€ þ @€0`À€ 0`À€ 0`À€ @@  @€ @€€ @@Ž9räÈ‘#‡  „ @€% @€رcÇŽ;vì @À  À‡~€bÈ!C† 2dÈ!C† 2D€ @€ @€ @€ @€ @€€B€@„"Dˆ @€`P€° þ@€СC‡:t @€ @€ @€ @€Z @€ @€ @€ @€ ‰ $H A"@€h!@€ @€€ @€,Y²dÉ’%K @€ @€€ @€ @€8q"@€¦L™2eÊ”)S¦L™2eÊ”)S¦H @€ @€€(Q @€ @€ @€þT©R¥J•*Uª @€j(@€j @€¬X±bÅŠ+ @€ @€ @€ @€ @€ @€ @€ @€ @@ @€ @€ `€ À€ 0`À€ 0`À€  @€Z @€ @€Z @€räÈ‘#GŽ9 @€% @€” @€þ @ÀŽ;vìØ±c‡N @€>|ðC€ @€ @€C† 2dÈ!C†2dÈ!C @€ @€@  @€ @€ @€ @€Dˆ!B„ @€ÀB€ @€:tèСC€ @€ @€ @€ÐB€ @€ @€ @€ @€€$ @€Hþ A‚  @€€ @€´ @€ `É’%K–,Y"@€ @€Ì @€ @€ À‰ àaÊ”)S¦L™2eÊ”)S¦L™2eŠ) @€ˆE€ @€x @€ @@•*UªT©R¥Š  †¨!@€`ÅŠ+V¬X @€ðA€ @€ @€ @€| @€þ @€ @€ @€ € @€ @€ @€ 0`À€ 0`À€ 0`À€  … @€h!@€#GŽsäÈ‘C€  „  „ @€ìرcÇŽ;v à„àÇ?ˆ@1dÈ!C† 2dÈ!C†  @€ @€ @€  @€ @þ€ @€P @€ B„"Dˆ @€`!@€ @€tèСC‡ @€ @€ @€ @€- @€ @€ @€ @€’ @€@‚ €H  @€ÐB€  … @€–,Y²dÉ’% @€ @À  @€ @€œ8 @€¦L™2eÊ”þ)S¦L™2eÊ”)SH @€ @@”( @€ Àƒ @€ªT©R¥J•*U @€j  † @€+V¬X±bÅŠ @€ @€ @€ @€ àƒ @€ @€ @€ @@ @€0@€`À€ 0`À€ 0`À€  @€Z @€þ  E  @€9räÈ‘#GŽ @€J @€€ @€ `ÇŽ;vìØ±C€' @€>ø!@ @ @Š!C† 2dÈ!C† 2D€ @€ @€ @  @€ @€@!@€ @"Dˆ!BD€ @€X @€ C‡:tè   @€ @€ @€þÐB€ @€ @€ @€D€ @€$H A‚‰ @€- @€- @€°dÉ’%K–, @€ @€f @€ @€àĉð `Ê”)S¦L™2eÊ”)S¦L @€ @€¢D @€ @€ @€P¥J•*UªT©"@€  †€ @€X±bÅŠ+VþP€ àƒ @€ @€ @€> @€ @€ @€ @€@€ @€ @€€ @€ 0`À€ 0`À€ 0`@€  … @€€ @€È‘#GŽ9rä @€  „%J @€ @€;vìØ±cÇŽ8!@€øð!@À€"@€P @€þC† @€ @€ @€(@€@!@€ @€ @  @€!B„"D @€`!€… @€:tèСC‡ @€ @€ @€ @€€ @€ @€ @€ @@ @€ A‚ $H @€ÐB€´ @€ @€€%K–,Y²d‰þ @€0C€ @€ @€'N @€ @À”) @€¤ @€ J @€àA€ @€UªT©R¥J•* @€jÔ @€ @€+V¬X±bE€ @€> @€ @€ @€ðA€ @€ @€ @€€ @€ @€þ  @€0`À€ 0`À€ 0`À€ @€- @€Z @€ @@Ž9räÈ‘#‡ @€J” @€  @€°cÇŽ;vìØ!@€€ @€ü   …0dˆ @€ @€ @€ @€ @€ @€( @€ €"Dˆ!"@€ @€þ @€СC‡:t @€ @€ @€ @€´ @€ @€ @€ @€€$I @€ $H A"@€ @€€-  … @€X²dÉ’%K– @€ @€3 @€ @€pâD€x @€L™"@€ @Š @€Q¢ @€ @€ @þ€¨R¥J•*UªT @€ àŠ @€¬X±bÅŠ+ @€ àƒ @€ @€ @€€ @€ @€ @€ @@ @€ @€ `€ À€€ 0`À€ 0`À€ 0 @€ÐB€ÐB€ @€äÈ‘#GŽ9r @€  ‡ @€þ @€€;vìØ±cÇœ @€|ø à‡@€ @€( @€€!C @€ @€ @€ @€@B€ @€  @€ @€Dˆ!B„ @€ @€ @€:tèСC€ @€ @€ @@ @@  @€ @€ @€$ @€ @€þ A‚ $ @€  …- @€ @À’%K–,Y²D€ @€˜!@€ @€ @€' Àƒ `Ê @€R @€ˆE€ @€x @€ @@•*UªT©R¥Š @€W @€`ÅŠ+V¬X @€ @€> @€   @€| @€þ @€ @€ @€@ @€ @€ @€ 0`À€ 0`À€ 0`À€ @€- @@  @€ GŽ9räÈ‘C€ @€= @€ @€vìØ±cÇŽ;v à„àÇ?ˆ@!@€ "@€ @€ @€ @€ @€(P þ@€… @€@„"Dˆ @€ @À @€èСC‡: @€ @€ @€ @€´ @€ @€ @€D€ @€€ $H  @€ @€Z´ @€ @€–,Y²dÉ’% @€ @À  @€ @€œ8 @€ @€þS¦ @€"@€ @@”( @€(@€ @€T©R¥J•*Uª @€pE€ @€V¬X±bÅŠ @€ àƒ @€ @€ àƒ @€ @€ @€  @€ @€0@€`À€ 0`À€ 0`À€  @€ÐB€þ- @€ @€9räÈ‘#GŽ @€è!@€ @€رcÇŽ;vìØ±C€' @€>|ðC€ @€ @€ @À! @€ @€ @€ @€ @  @€ @€ @€"Dˆ!B„ˆ @€Ž @€ @‡:tèÐ!@€ @€ @€ @€þ  … @€ @€ I @€ @€$H A‚‰ @€ÐD€ @€°dÉ’%K–, @€  @€Ì @€ @€ À‰àA€0eŠ @€) @€D‰"@€ @€< @€  J•*UªT©RE€ @€€+ @€°bÅŠ+V¬þ @€ @€> @€ @€ @€ @€ @€ @€ @€@€ @€ @€€ @€ 0`À€ 0`À€ 0`@€ @€-h!@€ @€#GŽ9räÈ!@€ @@ @€ @ÀŽ;vìØ±cÇŽpB€ðáC€€D€  @þ€†  @€ @€ @€ @€ @€@B€(P @€ @€!B„"D @€pD€ @€:tèСC‡ @€ @€ @€ @€- @€ @€€ @@’$I @€ @€@‚ $H @€ @€M @€ @€K–,Y²dÉþ @€ `† @€ @€Nœ @€ @€€)S @€H @€ J @€àA€ @€UªT©R¥J•* @€\ @€ @€+V¬X±bE€ @€ àƒ @€ @€| @€ @@ @€ @€ @€ @€þ @€0`À€ 0`À€ 0`À€ @€hÑ¢… @€ @€€9räÈ‘#G @€z @€ @€;vìØ±cÇŽ;v @€€ @€ü   …0dˆ @€ @€ @€ @€ @€(P @€ @€ €"Dˆ!"  @€Gþ @€ C‡:tè @€ @€ @€ @€ÐB€ @€€$I’$I’$I’$I @€ @€ @$H A‚D€ @€h"@€ @€X²dÉ’%K– @€ @€€ @€ @€pâD€x @€L™"@€ @Š @€Q¢ @€ @€ þ@€¨R¥J•*UªTP€ @À @€X±bÅŠ+V @€ @€| @€ @€ @À @€ @€ @€ @€€ @€ @€ @À @€ 0`À€ 0`À€ 0 @€ @@  @€ @€äÈ‘#GŽ9r @€ÐC€ @€þìØ±cÇŽ;vìØ!@€œ @€|ø à‡@€ @€((@€C† @€ @€ @€ @€ @€€B€ @€ @€ˆ!B„" @€8"@€ @€:tèСC‡ @€ @€ @€ @€€I’$I’$I’$I’ @€ @€ @€ @€þ A‚ $ @€ @@ @€ @À’%K–,Y²D€ @€Ì @€ @€ @€'N @€ @À”) @€¤ @€%Š @€ð @€ @€€*UªT©R¥J @€® @€ ÀŠ+V¬X±"@€ @€ @À‡ @€ @€> @€þ @€ @€ @€@ @€ @€ @€ 0`À€ 0`À€ 0`À€ @€Z @€ @€  @@Ž9räÈ‘#‡ @€€ @€ `ÇŽ;vìØ±cÇ @À  À‡~€B€2D€ @€ @€ @€ @€þ @€ @€ @€@„"Dˆ @€ @À @€èСC‡: @€ @€ @€ @€´ @€ @€ @€ @€ @€ $H A"@€ @€4 @€ @€,Y²dÉ’%K @€ @À T @€ @€8q"@€< @þ€¦L @€ E€ @€€(Q @€ @€ @€T©R¥J•*Uª @€pE€ @€V¬X±bÅŠ @€ @€øðA€ @€ðA€ @€ @€ @€ € @€ @€ `€ À€ 0`À€ 0`À€  @€  …þ @€ @€räÈ‘#GŽ9 @€ô @€ @€€;vìØ±cÇŽ; @€' @€>|ðC€ @€ @€ @À! @€ @€ @€ @€ @€@!@€ @€ @€"Dˆ!B„ˆ @€Ž @€ @@:tèСC€ @€ @€ @€þ @@  @€ @€ @€ @€ @€H A‚  @€  ‰ @€ `É’%K–,Y"@€ @€3 "@€ @€ À‰àA€0eŠ @€) @€D‰"@€ @€< @€  J•*UªT©RE€ @€€+ @€°b +V¬Xþ @€ @€ @€>| @€ @€€ @€ @€ @€ @€ € @€ @€ @€ 0`À€ 0`À€ 0`À€ @€- @€ @€#GŽ9räÈ!@€ÐC€ @€vìØ±cÇŽ;vì @€8!@€ðáC€€D€  þ@€†  @€ @€P€ @€ @€ @€ @€ @€ B„"Dˆ @€ àˆ @€tèСC‡ @€ @€ @€ @€- @€ @€ @€ @€ @€ A‚ $H @€ @€M @€ @€K–,Y²dÉþ @€fÌ @€* @€ @€Nœ @€ @€€)S(@€"@€ @@”( @€ Àƒ @€ªT©R¥J•*U @€¸"@€ @€+V¬X±bÅŠ @€ @€ @À‡ @€| @€ @€ @€ @€ @€ @€þ @€0`À€ 0`À€ 0`À€ @€h!@€ @€ @@Ž9räÈ‘#G @€€ @€°cÇŽ;vìØ±c‡ @€€ @€>ø!@ @ @  `È @€ @€ @€ @€ @€  @€ @€ €"Dˆ!BD€ @€Gþ @€ C‡:tè @€ @€ @€ @€h!@€ @€ @€ @€ @€€ $H A‚D€ @€ ÐD€ @€°dÉ’%K–, @€ `†@E€ @€àĉð @€˜2E€ @€ @€¢D @€ @€þ @€P¥J•*UªT©"@€ @À @€X±bÅŠ+V @€ @€ @€øðA€ àƒ @€ @€ @€ @€€ @€ @€ @À @€ 0`À€ 0`À€ 0`@€ @€€ @€ @€äÈ‘#GŽ9r @€ô @€ @þÀŽ;vìØ±cÇŽ @€N @€øð!@À€"@€P @€C† @€ @€ @€ @€ @€ … @€ @€Dˆ!B„" @€8"@€ @€:tèСC‡ @€ @€€ @€ @€€ @€ @€ @€ @€ @€þ$H A‚ $H @€ @€€& @€ @€€%K–,Y²d‰ @€3 @€T @€ @€'N @€ @À”) @€¤ @€%Š @€ð @€ @€€*UªT©R¥J @€® @€ ÀŠ+V¬X±"@€ @€ @@ @€>|øðáÇ @€þ @€ @€ @€€ @€ @€  @€0`À€ 0`À€ 0`À€ @€Z @€ @€#GŽ9räÈ‘C€  ‡ @€;vìØ±cÇŽ;v @€pB€ À‡~€B€2D€ @€ @€ @€ @€þ  P @€ @€ B„"Dˆ @€ @€€# @€СC‡:t @€ @€ @€ @€Z @€ @€ @€ @€ @€ A‚ $H  @€ @€4 @€ @€,Y²dÉ’%K @€Ì @€ "@€ @€8q"@€< þ@€¦L @€ E€ @€€(QP€ @€ @€¨R¥J•*UªT @€ àŠ @€¬X±bÅŠ+ @€ @€ @€ @€Ø @€ @€ @€ @€ @@ @€ @€ `€ À€ 0`À€ 0`À€  @€ÐB€þ @€ @€€9räÈ‘#G @€€ @€ìرcÇŽ;vìØ!@€(@€€ @€|ø à‡@€ @€( @€€!C @€ @€ @€ @€ @€€B€ @€ @"Dˆ!B„ˆ @€ @€ @€:tèСC€ @€ @€ @€þÐB€ @€ @€ @€ @€€ $H A‚D€ @€  ‰ @€ `É’%K–\²D€ `† @€T @€ @€' Àƒ `Ê @€R @€ˆE€ @€x @€ @@•*UªT©R¥Š @€W @€`ÅŠ+V¬þX @€ @€ @€ @€ @€ @€ @€ @€ @€ € @€ @€ @€ 0`À€ 0`À€0`À€ @€- @€ @€äÈ‘#GŽ9rä @€è!@€ `ÇŽ;vìØ±cÇ @€Nh @€àÇ?ˆ@þ!@€ "@€ @€ @€ @€ @€ @€ @€ @€Dˆ!B„" @€ àˆ @€tèСC‡ @€ @€ @€ @€€ @€ @€ @€ @€ @€$H A‚ $ @€ @€M @€ @€–,Y²dþÉ’% @€€ @€@E€ @€œ8 @€ @€S¦ @€"@€ @@”( @€ Àƒ @€ªT©R¥J•*U @€¸"@€ @€+V¬X±bÅŠ @€ @€ @€ @€ì @€€ @€ @€ @€  @€ @€þ0@€`À€ 0`À€ 0`À€  @€h!@€ @€ GŽ9räÈ‘C€  ‡ @€€;vìØ±cÇŽ; @€8!@€ @€>ø!@ @ @  `È @€ @€ @€ @€ @€  @€ @€ B„@"Dˆ!"@€ @€þŽ @€ @‡:tèÐ!@€ @€ @€ @€h!@€ @€ @€ @€ @€ A‚ $H  @€ @€h"@€ @€°dÉ’%K–, @€Ì @€ @€* @€àĉð @€˜2E€ @€ @€¢D @€ @€þ @€P`•*UªT©RE€ @€€+ @€°bÅŠ+V¬ @€ @€ @€ @€ @€ @€ @€ @€ @€@€ @€ @€€ @€ 0`À€ 0`À€ 0`@€  … @€ @€€9räÈ‘#GŽ @€€ @€vìØ±þcÇŽ;vì @€ à„h @€øð!@À€P€  @€†  @€ @€ @€ @€ @€ @  @€ @"Dˆ!B„ˆ @€8"@€ @€:tèСC‡ @€ @€ @€  … @€ @€ @€ @€€ þ$H A‚D€ @€  ‰ @€ @€€%K–,Y²d‰0C€ @€HE€ @€Nœ @€ @€€)S @€H @€ J @€àA€ @€UªT©R¥J•* @€\ @€ @€+V¬X±bE€ @€ @€ @€ @€ì @€þ @€ @€ @€€ @€ @€  @€0`À€ 0`À€ 0`À€ @€- @€ @€È‘#GŽ9rä @€è!@€°cÇŽ;vìØ±c‡ @€' @€- @€ü   …0dÈ!C† @€ @€ @€ @€þ @€P @€ @€ˆ!B„"D @€ @À @€СC‡:t @€ @€ @€ @€- @€ @€ @€ @€  @€$H A‚ $ @€ @€M @€ @€X²dÉ’%K– @€3 @€ @€* @€pâD€xþ @€L™"@€ @Š @€Q¢ @€ @€ @€¨R¥J•*UªT @€ àŠ @€¬X±bÅŠ+ @€ @€ @€ @€`G€ @€ @€ @€ @€€ @€ @€ @À @€ 0`À€ 0`À€ 0 @€ÐBþ€ @€ GŽ9räÈ‘#‡  ‡ @ÀŽ;vìØ±cÇŽ @€œ @€Ð"@€|ø à‡@€ @€( @€† 2dÈ!C @€ @€ @€ @€€B€ @€ B„"Dˆ @€ @€Ž @€€ @€:tèСC‡ @€ @€ @€þÐB€ @€ @€ @€ @€ A‚ $H @€ @€4 @€ @€ @À’%K–,Y²D€Ì @€ @€P @€ @€' Àƒ `Ê @€R @€ˆE€ @€x @€ @@•*UªT©R¥Š @€W @@ ÀŠ+Vþ¬X±"@€ @€ @€ @€ @€ì @€ @€ @€ @€@ @€ @€ @€ 0`À€ 0`À€ 0`À€ @€€ @€ @€9räÈ‘#GŽ @€€ @€;vìØ±cÇŽ;v @€pB€ @€-àÇ?ˆþ@!@€ @€C† 2à!C @€ @€ @€ @€( @€ @€"Dˆ!B„ @€pD€ @€èСC‡: @€ @€ @€ @@  @€ @€ @€ @€@‚ $H A‚D€ @€ÐD€ @€ @€–,Y²þdÉ’% `† @€ €Š @€œ8 @€P€¦L @€ E€ @€€(Q @€ @€ @€T©R¥J•*Uª @€pE€ @€V¬X±bÅŠ @€ @€ @€ @€`G€ @€ @€ @€  @€ @€þ0@€`À€ 0`À€ 0`À€  @€Z @€ @€äÈ‘#GŽ9rä @€z(@€رcÇŽ;vìØ±C€ @€€ @€Ð"@€>|ðC€ @€ @€( @€ @€C† 2dÈ! @€ @€ @€@!@€ @€ˆ!B„"D @€ @€€#þ @€ @‡:tèÐ!@€ @€ @€ @€Z @€ @€ @€ @€ @$H A‚  @€ @€€& @€ @€ `É’%K–,Y"@€3 @€ @€P @€ À‰àA€0eŠ @€R @€D‰"@€ @€<þ @€  J•*UªT©RE€ @€€+ @€°bÅŠ+V¬ @€ @€ @€ @€ @€v @€ @€ @€ @€@€ @€  @€ @€ 0`À€ 0`À€ 0`À€  … @€ @@Ž9räÈ‘#‡  ‡ `ÇŽ;vìØþ±cÇ @€'N @€lÙ²eË-ðáC€€D€@!@€ @€ @€€!C† 2dÈ @À!C†  @€ @  @€@„"Dˆ!"@€ @€Ž @€ @€:tèСC‡ @€ @€ @€  … @€ @€ @€ @€ A‚þ $H @€ @€š @€ @€ @€K–,Y²dɘ!@€oÞ¼yóF€ €Š @€Nœ @€ @€€)S @€ E€%J”( @€àA€ @€UªT©R¥J•* @€¸"@€ @€+V¬X±bE€ @€€ @€ @€ @€`G€þ @€ @€ @€ @€ @€ @€0`À€ 0`À€ 0`À€ @€- @€ @€9räÈ‘#GŽ9 @€= @€€;vìØ±cÇŽ; @€NœpB€°eË–-[¶h @€ü   @€ @€ @€ @À!C† 2dˆC† 2dÀ!þ @€  @€ @€"Dˆ!B„ @€pD€ @€ C‡:tè @€ @€ @€ @€€ @€ @€ @€ @€@‚ $H A"@€ @€h"@€ @€ @€X²dÉ’%K– `†¼yóæÍ›7o @€T @€pâD€xþ @€L™"@€ @€)  €(Q¢D‰E€ @€ @€P¥J•*UªT©"@€ @€W @€X±bÅŠ+V @€ @€ @€ @€ @€; @€ @€ @€ @€€ @€ @€ @À @€ 0`À€ 0`À€ 0 @€h!þ@€ @€È‘#GŽ9rä @€è!@€vìØ±cÇŽ;vì @€8P€N @€[¶lÙ²eË-øð!@À€"@€@!@€ @€ @€ @À!C† 2dÈ!C†  @€ … @€!B„"Dˆ @€ @€€# @€ @€:tèСC‡ @€ @€ @€þ´ @€ @€ @€ @€ $H A‚  @€ @@ @€ @€(@À’%K–,Y²d‰f @À›7oÞ¼yóF€@E€ @€'N @€ @À”) @€ E€¢D‰%J”(Q @€ð @€ @€€*UªT©R¥J @€¸"@€ ÀŠ+þV¬X±bE€ @€ @€ @€ @€°#@€ @€ @€ @€@ @€ @€ @€ 0`À€ 4`À€ 0`À€ @@  @€ @@Ž9räÈ‘#G @@ `ÇŽ;vìØ±c‡ àÄ  à„زeË–-[¶h À‡~þ @€ @€ @€ @€ `È!C† 2dˆ @€( @€@„"Dˆ!"@€ @€Ž @€ @€:tèСC‡: @€ @€ @€  …  @€ @€ @€ @€ A‚ $H @€ @€š @€ @€ @€€%K–,Yþ²dÉ’%K0C€oÞ¼yóæÍ›7 @€* @€8q"@€< @€¦L @€ @€R%J”(Q¢D‰"@€ @€ @€T©R¥J•*UªT @€ @€€+ @€V¬X±bÅŠ+V @€ @€ @€ @€ @€; @€ @€ @€ @@ @€ @þ€ `€ À€ 0`À€ 0`À€  @€Z @€ @€räÈ‘#GŽ9 @€z @€;vìØ±cÇŽ @À‰ @€' @À–-[¶lÙ²E‹>|ðC€ @€ @€@!@€ @€ @€ @€† 2dÈ!C @€@!@€ @€€Dˆ!B„" @€pD€þ @€СC‡:tèСC€ @€ @€ @€Z @€ @€ @€ @€@‚ $H A"@€ @€h"@€ @€ @€–,Y²dÉ’%K–,Y"@€€xóæÍ›7oÞ¼ @€P @€ À‰àA€0eÊ”) @€"@€€(Q¢D‰%J @€þ< @@ @@•*UªT©R¥J•* @€¸"@€`ÅŠ+V¬X±bÅŠ @€ @€ @€ @€Ø @€ @€ @€ @€ € @€ @€ @€ 0`À€ 0`À€ 0`À€ÐB€ @€È‘#GŽ9räÈ!@€ÐC€رcÇŽ;vìþ @€' @€pB€¶lÙ²eË–-Zðá ?ˆ @€ @€ @€ @€ @À!C† 2D€ @  @€!B„"Dˆ @€ @À @€ @‡:tèСC‡ @€ @€ @€h!@€ @€ @€ @€ $H A‚þ‰ @€  ‰ @€ @€,Y²dÉ’%K–,Y²dÉÌ @€€7oÞ¼yðÍ @ @€œ8 @€< @€¦L™2E€ @€Rˆ%J”(Q¢D @€ Àƒ @€T©R¥J•*UªT©"@€ @€€+ @€+V¬X±bÅŠ+V¬ @€ @€ @€ @€ ÀŽþ @€ @€ @€ @€ @€ @€0`À€ 0`À€ 0`À€ @@ (@€ @€€9räÈ‘#G @€€ @€€;vìØ±cÇœ8!@€ @€' @À–-[¶lÙ¢E€>ø!@ @ @€@!@€ @€ @€ @€† 2dÈþ @€P @€ €"Dˆ!BD€ @€Ž @€ @€:tèСC‡:t @€ @€ @€ @@  @€ @€ @€ @€H A‚ $H @€ @€M @€ @€ `É’%K–,Y²dÉ’%K– @À xóæÍ›7o @€¨ @€àĉþàA€ @À”)S¦ @€ E€€(Q¢D‰E€ @€ @€  J•*UªT©R¥J•* @€\ @€°bÅŠ+V¬X±bÅŠ @€ @€ @€ @€ì @€ @€  @€ @€@€ @€ @€€ @€ 0`À€ 0`À€ 0`@€´þ @€ @€räÈ‘#GŽ9r @€ô @€ìرcÇŽ;v à„ @€pB€lÙ²E€øð!@À€"@€ @€ @€ @€ @€ @À!C @€@!@€ @€"Dˆ!B„ @€8"@€ @€èСC‡:tèСC€ @€ @€ @þ€´ @€ @€ @€ @€@‚ $H A"@€ @€4 @€ @€ @À’%K–,Y²dÉ’%K–,Y"@€f @€oÞ¼ @€ "@€ @€'N @€ @€L™2eŠ @€)Rˆ%J @€ð @€ @€ªT©R¥J•*UªT©"@€€ @€€+ @€þV¬X±bÅŠ+V¬X @€ @€ @€ @€ ÀŽ @€ @€ @€€ @€ @€  @€0`À€ 0`À€ 0`À€  … @€#GŽ9räÈ!@€  ‡ `ÇŽ;vìØ±C€'À… .\¸p @€€ @€´ À‡~þ @€  @@ @€ @€ @€ @€ @€ @€ B„"Dˆ @€ @À @€ C‡:tèСC‡ @€ @€ @€ÐB€ @€ @€ @€ $H A‚‰ @€ÐD€ @€ @€K–,Y²dÉ’%K–,þY²D€0C€ @€ @ @€8q" àA€ @€S¦L™"@€ @Š @€ @€ @€ @@•*UªT©R¥J•*U @€¸"@€`ÅŠ+V¬X±bÅŠ @€ @€ @€ @€v @€ @€ @€ @@ @€ þ@€ `€ À€ 0`À€ 0`À€  @€- @€ @@Ž9räÈ‘#GP€= @€vìØ±cÇŽ;pB€\¸páÂ… pB€hÑ¢E€|ø à‡@€ @€ @€ @€ @€ @€ @€ @€P @€ €"Dˆ!BD€ @€Ž @€þ @€:tèСC‡: @€ @€ @€ @€€ @€ @€ @€ @€$H A‚ $ @€(@€€& @€ @€,Y²dÉ’%K–,Y²dÉ’% @€3 @€ @€P @€ @€' @€ @€0eÊ”) @€¤H @€ @€þx @€ @€T©R¥J•*UªT©RE€ @€€+ @€V¬X±bÅŠ+V¬X @€ @€ @€ @€°#@€ @€ @€ @€ € @€ @€ @€ 0`À€ 0`À€ 0`À€h!@€ @€9räÈ‘#GŽ9r @€è!@€°cÇŽ;vþìØ!@€€àÂ… .\¸ @€€hÑ¢E€àÇ?ˆ @€  @€ @€ @€ @€ @€@!@€ €"Dˆ!B„" @€8"@€СC‡:tèСC‡:tè @€  @€ @€ @€h!@€ @€ @€ @€$H A‚ $H Aþ"@€ @€4 @€°dÉ’%K°dÉ’%K–,Y²dÉ’%K @€˜!@€ @€@E€ @€œ8 @€ð @€ @€¦L™2E€ @€)R¤ @€ Àƒ @€ @@•*UªT©R¥J•*UªT©R¥Š¸"@€`ÅŠ+­X±bÅŠ+V¬X±bE€ @€ @€ @þ€; @€ @€ @€  @€ @€0@€`À€ 0`À€ 0`À€  @@  @€äÈ‘#GŽ9räÈ‘C€ @@ @€€;vìØ±cÇN @.\¸páÂE€œÐ¢E€ @€>ø!@ @ @€ @  @€ @€ FŒ€bĈ#FŒþ1bĈ#FŒ @€Dˆ!B„"Dˆ @€ @À @€:tèСC‡:tèСC‡ @€ @€ @€ @@  @€ @€ @€H A‚ $H A‚‰ @€ÐD€ @À’%K–,Y²dÉ’%K–,Y²dÉ’%K–, @€ @À *T¨P¡B… *T¨P¡B… l @€àĉþ @€ @€ ` À)S¦ @€ @€)R¤H‘"EŠ)R< @€ @€¨R¥J•*UªT©R¥J•*UªT @€W @€¬X±bÅŠ+V¬X±bÅŠ+V @€ @€ @€Ø @€ @€ @€ @€@€ @€ @€€ @€ 0`À€ 0`À€ 0`@€Zþ @€#GŽ9räÈ‘#G @€z @€ìرcÇŽ;vp páÂ… .\ @À  @€|øð!@€€D€ @€@!@€ @€ @Œ1 @€ @€  @€!B„"Dˆ!B„ˆ @€G @€:tèСC‡:tèСC‡ @€ @€ @€ þ@€- @€ @€ @€@‚ $H A‚ $ @€ @€€& @€K–,Y²dÉ’%K–,YpÉ’%K–,Y²D€ @€f @€ @€ÀF€ @€Nœ @€x @€ @€˜2eÊ @€ @€àA€ @€ @€€*UªT©R¥J•*UªT©R¥JpE€þ ÀŠ+V¬X±bÅŠ+V¬X±bE€ @€ @€ ÀŽ @€ @€ @€€ @€ @€  @€hÀ€ 0`À€ 0`À€  … @€9räÈ‘#GŽ9rä @€  ‡ @ÀŽ;vìØ±c‡' € .\¸pá"@€N @€ðáÇü  þ @€ @  @€ @€1 @€ @€ @  €"Dˆ!B„" @€8"@€СC‡:tèСC‡:t @€ @€ @€ @€ÐB€ @€ @€ @€$H A‚ $H  @€ @€4 @€°dÉ’%K–,Y²dÉ’%K–,Y²dÉþ @€˜!@€ @€ @€6 @€pâD€ @€ @€ @€€)S¦L @€ @€ @€ @€ @€¨R¥J•*UªT©R¥J•*Uª @€€+ @€¬X±bÅŠ+V¬X±bÅŠ+ @€  @€ @€ì @€ @€ @€ @€€ @€þ @€ @À @€ 0`À€ 0`À€ 0 @€- @€È‘#GŽ9räÈ‘C€ @€€ @€;vìØ±cÇŽ;8!@€\¸páÂ… 8!@€ À‡ à‡@€ @€ @€  @€ @€b @€ @€ @€P @€‰!B„"Dˆ!"@€ @€€# @þ€:tèСC‡:tèСC€ @€ @€ @€ @€€ @€ @€ @€ A‚ $H A‚‰ @€ÐD€ @€€%K–,Y²dÉ’%K–,Y²dÉ’% @€ @À  @€ @€° @€ @€' @€x @€ @€0eÊ”) @€ @€þ€ Àƒ @€ @€UªT©R¥J•*UªT©R¥ŠpE€ @€+V¬X±bÅŠ+V¬X±"@€ @€ @€`G€ @€ @€ @€@ @€ @€ @€ 0`À€ 0`À€ 0`À€h!@€ @@Ž9räÈ‘#GŽ @€ô @€رcÇŽ;þvìØ!@À àÂ… .\¸ @À ðáÃ@>|ø @€~ @€ @  @€#@€ @€cÆŒ3F€ …@„"Dˆ!B„ˆ @€Ž @€èСC‡:tèСC‡ @€ @€ @€ @€´ @€ @€ @€€ $H A‚ $þ @€ @€€& @€,Y²dÉ’%K–,Y²dÉ’%K– @€ @€3  À @ @€8q"@€ @€ @€ @€¦L™2eÊ”)S¦L @€ @€ @€ @€P¥J•*UªT©R¥J•*U @€€+ @€X±bÅŠ+V¬X±bÅŠ @€ @€ þ@€;v @€ @€ @€  @€ @€0@€`À€ 0`À€ 0`À€ P€€ @€äÈ‘#GŽ9rä @€ @@ @€€;vìØ±cÇŽœ @€.\¸páÂ…‹œ @€>|øðáC€ø!@€ @€ @€ @€  @€ @Œ @€Œ3fÌþ˜1c @€ @€"Dˆ!B„"D @€pD€ @‡:tèСC‡: @€ @€ @€ @€ÐB€ @€ @€(@€H A‚ $H  @€ @€4 @€ @À’%K–,Y²dÉ’%K–,Y"@€ @€0C€8pàÀ @€Ø @€ À‰þ @€x @€ @€ @À”)S¦L™2eŠ @€àA€ @€ @€UªT©R¥J•*UªT©"@€¸"@€ @€+V¬X±bÅŠ+V¬ @€ @€ @€v`G€ @€ @€ @€ € @€ @€ @€ 0`À€ 0`À€ 0`À€þ´ @€ GŽ9räÈ‘#‡ @€z @€ìرcÇŽ;vì à„páÂ… .\ à„|øðáÇ> @ÀD€ @€ @  @€1 @€0f̘1cÆŒ#@€@!@€!B„"Dˆ @€ @À  @€tèСC‡:tèÐ!@€ @€ @€ @€þ @€- @€ @€ @€@‚ $H A‚D€ @€ÐD€ @€–,Y²dÉ’%K–,Y²d‰ @€ @À  @€8pàÀŽÀF€ @€Nœ @€ Àƒ @€ @€L™2eÊ”)S¦ @€ @€ @€ @€  J•*UªT©R¥J•* @þ€€+ @€°bÅŠ+V¬X±bÅŠ @€ @€°#@€ì @€ @€ @€ @€ @€ @€0`À€ 0`À€ 0`À€  … @€9räÈ‘#GŽ9 @€è!@€ `ÇŽ;vìØ±c‡' € .\¸pá"@€€àÇ>|øð!@€~ þ  @€€ @€@!@€ˆ @€ @€cÆŒ3f̘1 @€ @"Dˆ!B„ @€ @€ C‡:tèСC‡ @€ @€ @€ @€h!@€ @€ @€ @$H A‚ $ @€ @€€& @€°dÉ’%K–,Y²dÉ @€þ @€3 @€àÀ8p @€6 @@pâĉ @€x @€ @€ @À”)S¦L™2eŠ @€àA€ @€ @€ªT©R¥J•*UªT @€¸"@€ @€+V¬X±bÅŠ+V @€ @€ ÀŽ ÀŽ @€ @€ @€€ @€þ @€ @À @€ 0`À€ 0`À€ 0 @€- @€È‘#GŽ9räÈ!  @€€ @€vìØ±cÇŽ;vpB€¸páÂ… .pB€>|øðáÇðC€€"@€ @€ @€ F€ @€3f̘1cÆŒ @€  @€ˆ!B„"Dˆ @€pD€ þ@€:tèСC‡ @€ @€ @€ @€  … @€ @€ @€ A‚ $H @€P€h"@€ @€K–,Y²dÉ’%K– @€ @€0C€ 8pàÀG€° @€ À‰' @€ Àƒ @€ @€¦L™2eÊ”)S @€þ @€W® @€ @€  J•*UªT©R¥Š @À @€°bÅŠ+V¬X±"@€ @€ @€; @€ì @€ @€ @€€ @€ @€  @€0`À€ 0`À€ 0`À€ÐB€ @€€9räÈ‘#GŽ @€ô @€°cÇŽþ;vìØ±C€€À… .\¸p @€€ðáÇ>| @€€ @€ @€@!@€ @€ @€€1cÆŒ3fŒ€B€@„"Dˆ!BD€ @€€# @€èСC‡:tè @€ @€ @€ @€ @€Z @€ @€ @€ $H A‚‰þ @€ @@ @€X²dÉ’%K–,Y"@€ @€ @À  @€àÀ8 € @€'Nœ @€ @€< @€ @€0eÊ”)S¦L™"@€ @€|øðáC€~ @€ @€ @€ @€ @ 1b @€ @€3fþ̘1c @€P @€Dˆ!B„"D @€8"@€ @€:tèСC‡ @€ @€ @€ @€ÐB€ @€ @€ @€H A‚ $H @€ @€M @€ @À’%K–,Y²dÉ @€ @€3 @€8pà @€6 @€œ8q"@€þ @€àA€€ @€ @€¦L™2eÊ @€ð @€påÊ @€P¥J•*UªT©RE€¸"@€tè @€X±bÅŠ+V¬X @€ @€`G€ @€Ø @€ @€ @€ € @€ @€ @€ 0`À€ 0`À€ 0`À€þ´ @€ GŽ9räÈ‘#‡ @€€ @€ìرcÀ;vìØ!@À àÂ… .\¸ @€€àÇ à‡ˆ @€ @€@!@€ @€ @€cÆ @€€B€ B„"Dˆ!"@€ @À @€tèСC‡:t @€ @€ @€ @€þ @€€ @€ @€ @€@‚ $H A"@€ @€h"@€ @€–,Y²à’%K–, @€ @€0C€ @€ÀG€° @€àĉ @€ @€< @€ @€ @À”) @€ Àƒ @€\¹"@€ @€€*UªT©R¥J•* þàŠ € ÀŠ+V¬X±bÅŠ @€ @€ @€ ÀŽ @€ @€ @€ @€P€`À€ 0`À€ 0`À€  @@  @€räÈ‘#GŽ9 @€è!@€ @ÀŽ;vìØ±cÇN @.\¸páÂE€œ @€ @€€ @þ @ @€ @€ @  @€ @€ @€ @€ @"Dˆ!B„ @€Ž @€ C‡:tèСC€ @€ @€ @€(@€h!@€ @€ @€ @€H A‚ $ @€ @€€& @€ `É’%K–,Y²d‰ @€þ @€€ @€ @€ÀF€ @€'N @€ @€àA€ @€ @€ @€ @€ @€ @€€+W® @€T©R¥J•*UªT @€€+ @€Ð @€V¬X±bÅŠ+V @€ @€ì @€ @€Ø @€ @€ @€@€þ @€ @€€ @€ 0`À€ 0`À€ 0`@€Z @€#GŽ9räÈ!@€ @@ @€ìرcÇŽ;v8!@€¸páÂ… . @À  @€ü @€€"@€ @€ @€P @€ @€ @€ @€ @!@€!B„"Dˆ @€ àˆþ @€:tèСC‡: @€ @€ @€ @€ @@  @€ @€ @€@‚ $H  @€ @€4 @€ @€K–,Y²dÉ’% @€ @€Ì @€ @€ @ @€Nœ8 @€ @€ @€ @€ @€ @€ @þ€x @€ @€ @À•+W @€€*UªT©R¥J®\ @€ @€:`ÅŠ+V¬X±bE€ @€°#@€ @€ @€ @€ @€€ @€ @€  @€0`À€ 0`À€ 0`À€  … @€€9räÈ‘#G @€z @€ `ÇŽþ;vìØ±CÀ À… .\¸p @€€œ @€ à‡   @€ @€ … @€ @€ @€ @  @"Dˆ!BD€ @€G @€ C‡:tè @€ @€ @€ @€ @€- @€ @€ @€ @$H A‚‰þ @€ÐD€ @€°dÉ’%K–, @€ @€0C@ @€ @€lØ @€pâĉ @€ @€àA€ @€ @€ @€àA€ @€ @€påÊT©R¥J•*U\¹"@€ @€ #@€V¬X±bÅŠ @€ ÀŽþ @€ @€ì @€ @€ @@ @€ @€ `€ À€ 0`À€ 0`  0 @€Z @€#GŽ9r @€  ‡ @€ìرcÇŽN @€\¸páÂ…  à„ @€? @€@€ @€ @€ @€( @€ @€ þ@€ @€( @€!B„ @€8"@€ @€:tèСC€ @€ @€ @€ @€h!@€ @€P€ @€@‚ $H @€ @€M @€ @€K–,Y²d‰ @€ @€3 @€ @€ذ @€ À‰' @€þ @€ @€ @€ @€ @€ Àƒ @€ @€ @€\¹råJ•*UªT¹rE€ @€ @€:`ÅŠ+V @€ @€; @€(@€ @€ @€ @€@ @€ @€ @€ 0`À€ 0`À€ 0`À€þÐB€ @€ @€ @€= @€ @€pB€àÂ… .\¸ @€N @€ü @€ˆ @€ @€@!@€ @€ @€ @€€B€ @€" @€ @€€# @€ @€ @€ @€ @€ @€þ @€€ @€ @€ @€ @€ @€ @€h"@€ @€ @À @€ @€˜!@€ @€°a#@€ @€'Nœ @€ @€ @€x @€ @€ @€ @€ @€ @€  @€ @€\¹råÊþ @€ @€@G€X @€ @€Ø @€ @€ @€ì @€ @€  @€ @€0@€`À€ 0`À€ 0`À€  @€€ @€ @€ @€è!@€ @€ @À  @.\¸páÂE€pB€ à‡ @þ  @€ @€ @€ @€ @€ @€ @€( @€ @€ @€ @€ @€ @€ @€ @€ @€ @€´ @€ @€ @€ @€ @€ @€ @@ @€ @€ @€ @€þ @À  @€`ÃF€ @€€8qâD€ @€ @€ @€ @€ @€ @€< @€ @€ @€ @€ @€ @€ @€ @€tè @€ @€`G€ @€ @€ ÀŽ @€ @€@€þ @€ @€€ @€ 0`À€ 0`À€ 0`@€h!@€ @@ @€ @€€ @€ @€N @€páÂ… .\ @€'~üøñãÇ? @€D€ @€ @€ @ (P @ (P @ (P @ (P @€ @€ @€ àˆþ @€ @€ @€ @€ @€ @€  … @€ @€ @€ @€   @€4 @€ @€ @€ @€ @€f°aÆ 6lذaÆ  @€àĉ @€ @€ @€< @€ Àƒ|øðáÇ>|øðáÇ>|øðáÇ>|øðáÇ>|øðáÃÇ>|øðáÇ>|øðáÇ>|øðáÇ>|øðáÇ>|ø @€h @€ @€ @€ @€ @€ @ $@€ @€ @€ @€ @€  @€ @€ 0`À€þ ‘€C‡:tè  @"Dˆ!B„H€ @€P$@€ @€0`À€  @€€4jÔ¨Q£F @€êÔ©S§N: @€ @€ @€ @@:uêÔ©SG€ @€  @€q @€ @€ GŽ9räÈ @€ @€ @€€G @€ @€ 0`À€ àþ‘“&Mš4i’ @€9räÈ‘#GŽ @€@I€ @€ @@ @€ @€ `€ À€ 0`À€ 0`À€  @€€ @€ @€ @€yòäÉ“'O ÀŒ @€ @€ @€ @€ @€ü @€ @€ @€ @€þ @>|øðáÃG€€ @€ @€ @€ @€ @€Dˆ @€ @€ @€ @€ @!@ @€ @€0`À€  @€‰8tèСCH€ B„‘ @€ @€" @€ @€ 0`@€€H€€F5j$@   N:uþêÔ©#@€ @€ @€ @€Ô©S§N:u @€ @€ˆ#@€ @€ @€9räÈ‘#GŽ @€ @€  @€ @€0`À€  @€ 0iÒ¤I< @€äÈ‘#GŽ9r @€ @€J @€ @€ € @€ @€ @€ þ0`À@ 0`À€ 0`À€h!@€ @€ @€ @€È“G€Ì @€ @€ @€ @€ @€àG€ @€ @€ @€ @€ @€|Z @€ @€ @€ @€ @€ @  @€ @€ @€ þ@€ @€ @€ @€   0`À€ ‘ @€‰ @€ @€ @€  @€ @€0`À€ @€€ @€€ @€uêÔ©S§N @€ @€ @€  N:uêÔ©#@€ @€ @@ @€ @€È‘#GŽ9r @€þ @€ðH€ @€ @€ 0`À€ à‘ à‘PŽ9räÈ‘#G€ @€ $@€ @€  @€ @€0@€`À€ 0`À€ 0`À€  @@  @€ @€ @€ @€yò0#@€ @€ @€ @€þ @€ @€? @€ @€ @€ @€ @€ÐB€ @€ @€ @€(@€ @€ @€ @€ @€ @€ @€ @  @€ @€0`À€ @€‰ @€H$@€ @€ @€ H€þ @€ À€ 0 @€$@€ @€¨S§N:uê @€ @€ @€ @€uêÔ©S§N @€ @€â @€ @€ @€9räÈ‘#G€ @€ @€€G @€ @€0`À€  @€  @€ @€räÈ‘#GŽ9 @€ @%þ @€ @€@€ @€ @€€ @€ 0`À€ 0`À€ 0`@€Z @€ôèÑ£G=zôèÑ£G @€  @€ @@Ÿ>}úôéÓ§OŸ>}úôé#@€ @€ ð#@€ @€(P @ (P @ @€ @€- @€ @€… *T¨P¡B… *T¨þ @€  @€ À!C† 2dÈ!C†  @€ @€  @€ @€ À€ 0 @€H€ @@" @€ @€ @€E @€ @€ 0`À€ @€@  @@:ëÔ©S§Ž @€ @€ @€êÔ©S§N:uêÔ©S§Nþ @€ Ž @€ @Ž9räÈ‘#GŽ9räÈ @€ @€< @€ @€ À€ 0`@€ à‘< @€#GŽ9räÈ @€ @€(  @€ @€€ @€ @€  @€0`À€ 0`À€ 0`À€ÐB€€ G=zôèÑ£G=zþôèÑ#@€ @€˜ @€ @€úôéÓ§OŸ>}úôéÓ§OŸ>} @€ @€ @€ P @ (P @ H€ @€h!@€ @€*T¨P¡B… *T¨P¡B…  @€ @€€ @€ @€C† 2dÈ!C† 2dÈ! @€H€ @€ @€ 0`À€þ @€‰ @@$ @€ @€ @€P$@€ @€`À€  @€H€€ @€Ô©S§N:u @€ @€ @€¨S§N:uêÔ©S§N:uêÔ @€ @€q @€ @€9räÈ‘#GŽ9räÈ‘#GŽ @€ à‘ @€ @€ 0`À€ þ@€ðH€ @€9räÈ‘#GŽ @€@   @€ @€€ @€ @€ @À @€ 0`À€ 0`À€ 0 @€- @€=zôèÑ£G=zôèÑ£G= @€ ÀŒ @€èÓ§OŸ>}úôéÓ§OŸ>}úôé#@€ @€ü @€ @€ (P @ (Pþ @ @€ @@  @€  P¡B… *T¨P¡B… *T¨ @€$@€P€2dÈ!C† 2dÈ!C†  @€ @€€ @€ @€`À€  @€ ‘ ‘ @€ @€ @‘ @€ @€ 0`À€ @€€ @€  N:þuêÔ©#@€ @€ @€  N:uêÔ©S§N:uêÔ©S§Ž @€ˆ#@€ @€È‘#GŽ9räÈ‘#GŽ9räÈ @€(@€  @€ @€`À€ 0 @€ à‘€G @€È‘#GŽ9rä @€ @€” @€ @€@ @€ @€ @€ þ0`À€ 0`À€ 0`À€h!@€ôèÑ£G=zôèÑ£G=zôè @€ @€f @€ @@Ÿ>}úôéÓ§OŸ>}úôéÓ§OŸ> @€àG€ @€(P @ (P @ H€ @€´ @€ @€… *T¨P¡B… *T¨P¡B…  @€ @€@ @€ À!C† 2dÈ!C† 2þdÈ! @€$@€ @€ @€ 0`À€ @€  @€‰ @€ @€ @€Š @€ @€0`À€ @€H€ @€uêÔ©S§N @€ @€  @€êÔ©S§N:uêÔ©S§N:uêÔ @€ @€€8 @€ @€9räÈ‘#GŽ9räÈ‘#GþŽ @€ðH€ @€ @€ 0`À€ @€  @€ @Ž9räÈ‘#G€ @€ $@€ @€  @€ @€0@€`À€ 0`À€ 0`À€  @@  G=zôèÑ£G=zôèÑ£G @€`F€ @€ôéÓ§OŸ>}úôéÓ§OŸþ>}úôé#@€ @€~ @€ @€€@ (P @ (P @ @€  … @€(T¨P¡B… *T¨P¡B… *TH€ @€ @€ @€† 2dÈ!C† 2dÈ!C†  @€ @  @€ @€0`À€ @€ ‘H$@€ @€ @€€ H€þ @€ @€ 0`@€ @€Ž @€P§N:uêÔ @€ @€ @€P§N:uêÔ©S§N:uêÔ©S§Ž @€Ä @€ @€äÈ‘#GŽ9räÈ‘#GŽ9rä @€ @€€G @€ @€0`À€  @€PI€ @€räÈ‘#GŽ9 @€ @%þ @€ @€@@ @€ @€ @€ 0`À€ 0`À€ 0`À€Z @€zôèÑ£G=zôèÑ£G=zô @€ @€3 @€  OŸ>}úôéÓ§OŸ>}úôéÓ§ @€ð#@€ @€ (P @ (P @ @€ @€- @€ @€€B… *T¨P¡B… *Tþ¨P¡B @€  @€0dÈ!C† 2dÈ!C† 2$  @€ @€ @€ @€ 0`@€ @€$ @€€D @€ @€ @€" @€ @€ 0`À€ @€p$@€ @€€:uêÔ©S§Ž @€ @€ @€€:uêÔ©S§N:uêÔ©S§Nþ: @€ Ž @€ GŽ9räÈ‘#GŽ9räÈ‘#G€ @€< @€ @€P€ 0`À€ @€• @€ GŽ9räÈ‘#@€ @€P @€ @€ @€ @€ @€0`À€ 0`À€ 0`À€  … G=zôèÑ£G=þzôèÑ#@€ @€˜ @€ @€úôéÓ§OŸ>}úôéÓ§OŸ>} @€ @€ @€ P @ (P @ ( @€ØB€ @€(T¨P¡B… *T¨P¡B…  @€ @€  @€ @€† 2dÈ!C† 2dÈ!C @€  @€ @€ 0`À€þ @€ @@"$ @€ @€ @€  @€ @€`À€  @€ @€# @€Ô©S§N:u @€ @€ @€¨S§N:uêÔ©S§N:uê¬#@€ @€â @€ @€räÈ‘#GŽ9räÈ‘#GŽ9 @€ @À# @€ @€ 0`À€þ @€¨$@€ @€9räÈ‘#GŽ @€ €’ @€ @€€ @€ @€ @À @€ 0`À€ 0`À€ 0 @€- @€zôèÑ£G=zôèÑ£G @€ ÀŒ @€  @@Ÿ>}úôéÓ§OŸ>}úôé#@€ @€ø @€ @€ (P @ (þP @ @€ @€€ @€ @€€B… *T¨P¡B… *TH€ @€H€ @€`È!C† 2dÈ!C†  @€ @€€ @€ @€`À€  @€ @€$ ‘ @€ @€P$@€ @€ @€ 0`À€ @€8 @€ @@þ:uêÔ©SG€ @€ @€ @€uêÔ©S§N:uêÔ©S§Ž @€G€ @€ GŽ9räÈ‘#GŽ9räÈ @€ @€  @€ @€`À€ 0 @€ @@% @€È‘#GŽ9rä @€ @€” @€ @€@ @€ @€ @€€þ0`À€ 0`À€ 0`À€ÐB€ @€ @€ @€ @€Ì @€ @€ @€ @€ @€ À @€ @€ @€ @€ @€´ @€ @€ @€ @€ @€ @€@ @€ @€ @€þ @€ @€$@€ @@ @€ 0`À€ @€ @€€D‰  @€ @€ @€" @€ @€0`À€  @€ À‘ @€êÔ©S§N: @€ @€ @€ @€ @€ @€ @€€8 @€ @€ @€ þ@€ @€ðH€ @€ @€ 0`À€ @€*    @€9räÈ‘#GŽ @€@I€ @€ @@ @€ @€ `€ À€ 0`À€ 0`À€  @€€ @€ @€ @€ @€`F€ @€ @€ @€þ @€ @€~ @€ @€ @€ @€ @€  … @€ @€P€ @€ @€$@€ @€ @€ @€ @€ @€@ @€ @€0`À€  @€ @€H€ @€ @€  @€þ @€ @€ 0`@€ @€Ž @€P§N:uêÔ @€ @€ @€ @€ @€ @€ @€Ä @€(@€ @€ @€ @€ @€ @€ @€0`À€  @€  ’ @€äÈ‘#GŽ9r @€ @€Jþ @€ @€ € @€ @€ @€ 0`À€ 0`À€ 0`À€´ @€ @€ @€ @€ @€3 @€ @€ @€ @€ @€àG€ @€ @€ @€ @€ @€Z @€ @€ @€þ @€ @€ @  @€ @€ @€ @€ @€ @€ @€ @€ 0`@€ @€ @€E @€ @€P$@€ @€ @€ 0`À€ @€p$@€  @€uêÔ©S§N @€ @€ @€ @€ @þ€ @€ @@ @€ @€ @€ @€ @€x$@€ @€ @€ 0`À€ @€• @€ GŽ9räÈ‘#@€ @€P @€ @€ @€ @€ @€0`À€ 0`À€ 0`À€  @@‹-Z´hÑ¢E‹-Z´hÑ¢E‹þ-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑ¢E‹-Z´hÑB A‚ $H A‚ $H A‚ $H A‚ $H A‚ $H A‚ $H A‚ $H A‚ $H A‚ $H A‚ $H A‚ $ @€ @€ 0`À€þ @€€ @€ hÑ¢E‹-Z´hÑ¢E‹-Z´h‘" @€ @€ À€ 0 @€ @€G @€¨S§N:uê @€ @€âĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâ @€(P @ @€ @€( @€ @€0`À€  @€q Aƒ Ä @€êÔ©S§N: @€ @@ @€ @€ þ0`@€ @€ @€ @€ @€0`À€  @€ @€ @@ @€ @€ 0`À€ @À4iÒ¤I€€ @€9räÈ‘#GŽ @€@I€ @€ @@ @€ @€ `€ À€ 0`À€ 0`À€ 0`À€  @€0`þÀ€  @€ @€ @€ @€ @€ 0`À€ @€ @€ @€ @€`À€    @€ @€ @€ @€ 0`À€ @€ @€ @€ @€ @€ @€ @€ @ @€ @€0`À€þ  @€ŠdÊ”)S¦L™ðA€ @ ( @€ @€" @€ @€ 0`@€ˆ#€ 4hР! ŽP§N:uêÔ @€ @€â @€P€0`À€ @€ @€ @€ @€ @€ 0`À€ @€ @€ @€ @€0`À€þ  @€ФI“&Mš @€äÈ‘#GŽ9r @€ @€J @€ @€ € @€ @€ @€ 0`À€ 0`À€ 0`À€ 0`À€ À€ 0`@€ @€(@€ @€ @€0`À€  @€ @€ @€ @€ @€ þ0`À€ @€ @€ @€ @€`À€ 0 @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ 0`À€()S¦L™2eÊ$@€€€ (P @ @€ @€ @€ @€0`À€  @@4hРAƒ 4Äþ @€€:uêÔ©S§N @€ Ž @€ À€ 0 @€ @€ @€ @€ @€0`À€ @€ @€ @€ @€ @€ 0`À€ @“&Mš4iÒ¤IÀ GŽ9räÈ‘#@€ @€P @€ @€ @€  @€0@þ€`À€ 0`À€ 0`À€ 0`À€  @€ 0`À€ @€ @€ @€ @€ @€ 0`@€ @€ @€ @€ @€0`À€  @€ @€ @€ @€ @€ 0`À€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ 0`À€  @€"™2eÊ”)S¦L™ø @€(P @ ( @€ @‘ @€`À€ 0`@€â Aƒ 4hР! ŽÔ©S§N:uêÔ @€ @€q @€ @€ 0`À€ @€ @€ @€ @€ À€þ 0 @€ @€ @€ @€ @€ 0`À€€  @À4iÒ¤I“&Mš @€räÈ‘#GŽ9 @€ @% @€ @€@€ @€ @€€ @€ 0`À€ 0`À€ 0`À€ 0`À€`À€ 0 @€ @€ @€ @€ @€ þ0`À€ @€ @€ @€ @€`À€ 0`À€ @€ @€ @@ @€0`À€ 0 @€ @€ @€ @€ @€ 0`À€ @€ @€ @€ @€`À€ 0`@€ŠÈ”)S¦L™2eÊ$@À@ (P @ @€ þ@€Š @€ @€ 0`À€ˆ#@ 4hРAƒ â  N:uêÔ©S§Ž @€ˆ#@€ @€0`À€ 0 @€   @€ @€ @€ 0`À€ @€ @€ @€ @€ À€ 0`À€ФI“&Mš4iÒ$@ÀÈ‘#GŽ9räÈ @€ @€þ(  @€ @€€ @€ @€  @€0`À€ 0`À€ 0`À€ 0`À€ 0 @€ 0`À€ @€ @€ @€ @€Ѐ 0 @€ @€ @€ @€ @€ 0`À€ 0`@€ @€ @€ @€0`À€þ 0`À€  @€ @€ @€ @€ 0`À€ 0`À€ @€ @€ @€ @€ 0`À€( @@¦L™2eÊ”)S&> (P @Š @€P$@€ @€0`À€ (@@РAƒ 4hÐ ŽêÔ©S§N:uê @€ @€€8 @€0`À€ þ0`À€  @€ @€ @€ @€ 0`À€ 0`À€ @€ @€ @€ @€ 0`À€ @€&Mš4iÒ¤I“& @Ž9räÈ‘#GŽ @€@I€ @€ @@ @€ @€ `€ @€ 4`À€ 0`À€ 0`À€ 0`À€0þ`À€  @€ @€ @€ @€ @€ 0`À€ @€ @€ @€ @€ 0`À€ 0`À€ @€ @€ @€ À€ 0`À€ 0`@€ @€ @€ @€0`À€ 0`À€  @€ @€ @€ @€ 0`Àþ€ 0 @€"dÊ”)S¦L™2e àƒ @ (P  @€ @€E @€ @€ 0`À€â € 4hРAƒ†qP§N:uêÔ©SG€ @€Ä @€ À€ 0`À€ 0`À€ @€ @€ @€0`À€ 0`À€  @€ @€ @€ @€0`À€þ 0 @À4iÒ¤I“&Mš4  `€åÈ‘#GŽ9rä @€ @€” @€ @€@ @€ @€ @€0`À€ 0`À€ 0`À€ 0`À€ 0`@€ 0`À€ @€ @€ @€ @€0`À€  @€ @€ @€ @€0`À€þ 0`À€ 0 @€ @€ @€ @€ 0`À€ 0`À€€  @€ @€ @€ À€ 0`À€ 0`À€ @€ @€ @€ @€ 0`À€  S¦L™2eÊ”)“ (P @E€ @€( @€ @€ 0`À€ G€4hРAƒ 4þˆ#@€€:uêÔ©S§N: @€ Ž @€ 0`À€ 0`À€ @€ @€ @€ À@ 0`À€ 0`À€ @€ @€ @€ @€ 0`À€  @“&Mš4iÒ¤I“ GŽ9räÈ‘#G€ @€ $@€ @€  @€ @€ þ`€ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€ @€ @€ @€ 0`@€ @€   @€ @€ 0`À€ 0`À€ @€ @€ @€0`À€ 0`À€ 0`@€ @€ @€ @€ 0`À€þ 0`À€  @€ @€ @€ @€ 0`À€  H€™2eÊ”)S¦L™ø @€(P @ ( @€ @‘ @€`À€ 0`@€€8 Aƒ 4hР!@@Ô©°N:uêÔ©#@€ @€â @€`À€ 0`À€ 0`À€ @€ @€ @€ 0`À€þ 0`À€  @€ @€ @€ @€0`À€  `€š4iÒ¤I“&Mš0@€9räÈ‘#GŽ9 @€ @% @€ @€@€ @€ @€ @€0`À€ 0`À€ 0`À€ hÀ€ 0`À€ 0`@€ @€ @€ @€ @€þ0`À€ @€ @€ @€ @€0`À€ 0`À€  @€ @€ @€ @€ 0`À€ 0`À€ @€ @€ @€0`À€ 0`À€ 0`@€ @€ @€ @€`À€ 0`@€EÈ”)S¦L™2Ì”I€€€ (P @"@€þ @€  @€ @€ 0`À€ˆ#@€4hРAƒ Ä @@:uêÔ©S§N @€G€ @€ 0`À€ 0`À€ @€ @€ @€`À€ 0`À€ 0`@€ @€ @€ @€ À€ 0`À€ФI“&Mš4iÒ$@€€È‘#GŽ9räÈ @€ @þ€R @€ @€ @€ @€0@€ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€ @€ @€ À€ 0 @€ @€ @€ @€ À€ 0`À€ 0`À€ @€ @€ @€0`À€þ 0`À€  @€ @€ @€ @€ 0`À€ 0`À€ @€ @€ @€ @€ 0`À€P$@€€L™2eÊ”)S¦L| @(P @  @€ H€ @€0`À€ 0 @@РAƒ 4hÐ ŽêÔ©S§N:uê @€ @€€8 @€0`À€þ 0`À€  @€ @€ @€ @€ 0`À€ 0`À€ @€€ @€ @€ @€ 0`À€ 0@€Mš4iÒ¤I“&M  @€9räÈ‘#GŽ @€ €’ @€ @€€ @€ @€ @€ @€`À€ 0`À€ 0`À€ 0`À€ þ0`À€  @€ @€ @€ @€ @€ 0`À€ @€ @€ @€ @€ 0`À@ 0`À€ @€ @€ @€ @€ 0`À€ 0`À€ @€ @€ @€0`À€ 0`À€  @€ @€ @€ @€0`þÀ€ 0 @€"dÊ”)S¦L™2e àƒ @ (P  @€ @€E @€ @€ 0`À€Ä € 4hРAƒ†qP§N:uêÔ©SG€ @€Ä   @€ 0`À€ 0`À€ @€ @€ @€0`À€ 0`À€  @€ @€ @€ @€`À€þ 0`@€€hÒ¤I“&Mš4i `€äÈ‘#GŽ9rä @€ @€” @€ @€@ @€ @€ @€ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€P€ @€ @€ @€`À€  @€ @€ @€ @€ @€þ 0`À€  @€ @€ @€ @€0`À€ 0`À€ @€ @€ @€ @€ 0`À€ 0`@€ @€ @€ @€ @€ 0`À€( S¦L™2eÊ”)“ (P @E€(@€P$@€ @€0`À€  @@hРAƒ 4hþG€uêÔ©S§N:u @€ @@ @€0`À€ 0`À€ @€ @€ @€ @€ 0`À€ 0`@€ @€ @€ @€ @€ 0`À€  @“&Mš4iÒ¤I“ GŽ9räÈ‘#G€ @€ $@€ @€  @€ @€þ @€€ @€ À€ 0`À€ 0`À€ 0`À€ 0`À€  @€ @€ @€ @€ @€ 0`À€ @€ @€ @€ @€`À€  @€ @€ @€ @€ @€ 0`À€ @€ @€ @€ @€ Àþ€ 0`@€  @€ @€ @€ @€0`À€  @€"2eÊ”)S¦L™2 ðA€P @ (P @€ @€" @€ À€ 0`À€Ä@ƒ 4hРAC€€8¨S§N:uêÔ©#@€ @€â @€ @€ 0`À€ @€ @€ @€ @€ @€þ 0`@€ @€ @€ @€ @€0`À€ 0 @€€hÒ¤I“&Mš4  `€räÈ‘#GŽ9r @€ @€J @€ @€ € @€ @€ @€ @€0`À€ 0`À€ 0`À€ 0`À€ 0`@€ @€ @€ @€ @€þ0`À€ @€ @€ @€ @€ @€ 0`À€ @€ @€€ @€ @€`À€ 0 @€ @€ @€ @€ @€ 0`À€ @€ @€ @€ @€ À€ 0`À€()S¦L™2eÊ”I€€€ (P @"@€þ @€  @€ @€ 0`À€ Ž4hРAƒ Ä @@:uêÔ©S§N @€G€ @€`À€  @@ @€ @€ @€ @€0`À€ @€ @€ @€ @€ @€ 0`À€  @“&Mš4iÒ¤I€€ GŽ9räÈ‘#@€ þ@€P @€ @€ @€ @€ @À @€ @€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€ @€   @€ 0`@€ @€ @€ @€ @€0`À€  @€ @€ @€ @€ @€þ 0`À€ @€ @€ @€ @€`À€ 0 @€ @€ @€ @€ @€ 0`À€ @‘™2eÊ”)S&| @€(P @Š @€ H€ @€Ѐ 0 @€â@ƒ 4hÐ @@¨S§N:uê @€ @€q @€ @€þ 0`À€ @€ @€ @€ @€ À€ 0 @€ @€ @€ @€ @€ 0`À€ @Àš4iÒ¤I“&M @€9räÈ‘#GŽ @€ €’ @€ @€€ @€ @€ @€(@€ @€0`À€ 0`À€ 0`À€ þ0`À€ 0`À€ @€ @€ @€ @€ 0`À€ @€ @€ @€ @€ @€ 0`@€ @€ @€ @€ @€0`À€  @€ @€ @€ @€ @€ 0`À€ @€ @€ @€ @€þ À€ 0 @€()S¦L™2e @À€ (P @€ @€E @€ @€ 0`À€ Ž4hРAƒ†â @@:uêÔ©SG€ @€Ä @€ @€0`À€  @€ @€ @€ @€ @€ 0`À€ @€ @€ @€ @€`Àþ€ 0 @€ I“&Mšj @€€ GŽ9rä @€ @€(  @€ @€€ @€ @€ `€%K–,  @€ @€ 0`À€ 0`À€ 0`À€ 0`À€  @€ @€ @€ @€`À€  @€ @€ @€ @€ @€þ 0`À€ @€ @€ @€ @€ À€ 0`À€ @€ @€ @€ @€0`À€  @€ @€ @€ @€ @€ 0`À€ @‘2eÊ$@€> @€P @ @€ @€( @€ @€0`À€  @€â@ƒ þG€¨S§Ž @€ Ž @€ @€ 0`@€ @€ @€ @€€ @€`À€  @€ @€ @€ @€ @€ 0`À€ @ÀhÒ$@€  @€räÈ @€ @€ $@€ @€ @@ @€ @€þ @€ À’% @€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€ @€ @€ 0`À€ @@ @€ @€ @€ À€ 0 @€ @€ @€ @€ @€ 0`À€ @€ @€ @€ @€ þ@€ 0`À€ @€ @€ @€ @€0`À€  @€  @€ðA€ @€ @€ H€ @€ @€ 0`@€G€  q @€ @€ @€q @€ @€0`À€ @€ @€ @€ @€ @€þ 0`À€ @€ @€ @€ @€0`À€  @€ @€ `€ @€ @€ @% @€ @€ € @€ @€  @€X²$@€ @€ 0Ѐ 0`À€ 0`À€ 0`À€  @€ @€ @€ @€þ0`À€  @€ @€ @€ @€ @€ 0`À€ @€ @€ @€ @€`À€ 0 @€ @€ @€ @€ @€ 0`À€ @€ @€ @€ @€ @€ 0`@€(@€" @€ @€ @€þ @€E @€ @€0`À€ @€â @€ˆ#@€ @€ @€âÄ @€ @€ À€ 0 @€ @€ @€ @€ @€0`À€ @€ @€ @€ @€ @€ 0`À€ `€ @€€ @€ @€þ @€J”(m @€ @€  @€ @€ `€ @€–,  @€ À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€ @€ @€ 0`@€ @€ @€ @€ @€0`À€  @€ @€ @€ @€ @þ€ 0`À€ @€ @€  @€ @€ À€ 0`@€ @€ @€ @€ @€0`À€ @€( @€ø @€ @€ @€Š  @€ @€ À€ 0 @€ Ž @@ @€ @€ˆ#@€ @€ @€þ 0`À€ @€ @€ @€ @€ À€ 0 @€ @€ @€ @€ @€0`À€  @€  @€0@€ @€ @€”(  @À& @€ @€@€ @€ @€€ @€ À’% @€ 0`À€ 0`À€þ 0`À€ 0`À€ 0 @€ @€ @€ @€ 0`À€ @€ @€ @€ @€€ @€ 0`À€ @€ @€ @€ @€0`À€  @€ @€ @€ @€ @€ 0`À€ @€ @€ @€ @€þ À€ 0 @€ @€" @À @€ @€Š) @€ @€ @€ 0`À€ @€q @€â @€ @€ˆ'@ @€ @€`À€  @€ @€ @€ @€ @€ 0`À€ @€ @€ @€ @€ þÀ€ 0`@€ `€ @€€ @€ @€(Q @€l @€ @€€ @€ @€ @€ @€X @€ À€ 0`À€ 0`À€ 0`  0`À€ @€ @€ @€ À€ 0 @€ @€ @€ @€ @€þ0`À€ @€ @€ @€ @€ @€ 0`À€ @€ @€ @€ @€0`À€  @€ @€ @€ @€ @€ 0`À€ @€)R¤H€)R¤H‘"EP€)R$@€ @€ @€`À€  @€ Žþ Nœ8qâĉ#@€'N @€ @€ @€ 0`À€ @€ @€ @€ @€`À€  @€ @€ @€ @€ @€ 0`À€ @€ @€  @€ @€P¢$@€ @À& @€(@€€ @€ @€þ0@€ @€ @€K @€0`À€ 0`À€ 0`À€ 0`À€ 0`@€ @€ @€ @€ 0`À€ @€ @€ @€ @€ À€ 0 @€ @€ @€ @€ @€ 0`À€ @€ @€ @€ @€þ @€ 4`À€ @€ @€ @€ @€`À€  @€ @€)R¤H€ H‘"EŠ)R$@€ @€ @€ @€ 0`À€ @€qâĉ'Nœ8 @€€8qâĉ'N @€ @€ @€0`À€ @€ @€ @€ @€ @þ€ 0`À€ @€ @€ @€  @€`À€ 0 @€ `À @À @€@‰’ @€l @€ @€@ @€ @À @€ @€°$@€ @€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€ @€þ0`À€  @€ @€ @€ @€ @€ 0`À€ @€ @€ @€ @€ À€ 0`@€ @€ @€ @€ @€0`À€  @€ @€ @€ @€ @€ 0`À€ @€ @€ @€ @€þ @€ @€ @€0`À€ @€ @€ @€ @€ @€ @€ @€ À€€ 0`@€ @€ @€ @€ @€0`À€  @€ @€ @€ @€ @€ 0`À€ @€  @€ @€@‰%þ @€ @À& @€  @€ @€ @€ @€ @€K @€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @@ @€ @€ 0`À€ @€ @€ @€ @€`À€  @€ @€ @€ @€ þ@€ 0`À€ @€ @€ @€ @€ À€ 0`@€ @€ @€ @€ @€0`À€ @€ @€ @€ @€ @€ @€   @€ 0`@€ @€ @€ @€ @€ @€ @€ @€þ 0`À€ @€ @€ @€ @€ @€ 0`@€ @€ @€ @€ @€0`À€  @€ @À0@€@‰% @€ @€l @€ @€@€ @€P€ @€ @€`I€ @€ 0`À€þ 0`À€ 0`À€ 0`À€  @€ @€ @€0`À€ @€ @€ @€ @€ @€ 0`À€ @€ @€ @€ @€0`À€  @€ @€ @€ @€ @€ 0`À€ @€ @€(@€ @€þ @€ 0`@€ @€ @€ @€ @€ @€ @€ @€ 0`À€ @€ @€ @€ @€ @€ @€ @€`À€  @€ @€ @€ @€ @€ 0`À€ @€ @€ @€ @€þ À€ 0`@€ @€ @€ @%J @€ @€ @À& @€ @€ @€€ @€€K @€ @€– @€`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`Àþ€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€€ @%J” @€ @€ @€l @€ @€€ @€ @€þpéÒ¥K—.]ºtéÒ¥K @€`I€ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ þ0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À@ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`þÀ€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`@€ @€0`ÀJ” @€ @€Nœ8qâĉ'Nœ8q `“ @€@ @€ àÒ¥K—.]ºtéÒ¥K—.]ºté’  ,  @€ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0Ѐ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€ @€(@€œ8þqâĉ'Nœ8qâĉ'Nœl @€ @@ @€ @€€—.]ºtéÒ¥K—.]ºtéÒ¥K—.]º$@€ À’ @€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0þ`À€ 0`À€ 0`À€ 4`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`Àþ€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€0@€ @€pâĉ'Nœ8qâĉ'Nœ8qâÄi“ @€ € @€\ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K @€,  @€ @€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ þ0`À€ 0`À€  @€ @À @€À‰'Nœ8qâĉ'Nœ8qâĉ'Nœ6  @€ @€péÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]º$@€ À’ @€0`À@ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`þÀ€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`  0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€ €'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâÓ& @€@€ @À€Kþ—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K— @€X @€ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ þhÀ€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0þ`À€ 0`À€ 0`À€ 0`À€ 4`À€ 0`À€ 0`À€ 0`À€  @€0@€ @€œ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8m @€€ @€.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtI€ @€% @€`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`Àþ€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€€ @€pâĉ'Nœþ8qâĉ'Nœ8qâĉ'Nœ8qâĉÓ& @@ @€ ¸téÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K @€,  @€ @€ 0`À€ 0`À€ 0`À€€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ þ0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À@ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`þÀ€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€  @€  @€ €'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8m @€ €0à¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtI€ @€% @€þ À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0Ѐ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ þ0`À€ hÀ€ 0`À€ @À @€œ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ§M  @€.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K— @€X @€ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0þ`À€ 0`À€ 0`À€ 0`À€ 0`À€ 4`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`Àþ€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€pâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qÚ$@€@€ ¸téÒ¥þK—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]º$@€ À’ @€ À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ þ0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0 @€0@€ €'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ§M€ `À¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÀK—.]ºtéÒ¥K— @€X @€ @€0`À€ 0`À€ 0`À€ 0`À€ 0`þÀ€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`  0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @ÀP€œ8qâĉ'Nþœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qÚ$@€€ @€.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]º$@€ @€% @€ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ þ0`À€ 0`À€ hÀ€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0þ`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 4`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€  @€  @€àĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉÓ&@péÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ% @€,  @þ€ @€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ `€ @'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ6   `À¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.] @€ À’€ @€ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ þ0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À@ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`þÀ€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€8qâĉ'Nœ8qâĉ'Nœ8qâÄ 'Nœ8qâĉ'Nœ8qâÄi“ €\ºtéÒþ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ% @€X @€ @€`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0Ѐþ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ þ0`À€ 0`À€ 0`À€ hÀ€ 0`À€ 0`À€ 0`À€ 0`À€ 0 @€0@€À‰'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'N›0àÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.  @€ À’ @€ @€ 0`À€ 0`À€ 0`À€ 0þ`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 4`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`Àþ€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€€ @€Nœ8qâĉ'þNœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qÚ$@€€ @€€—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtI€ @€  @€ @€ À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ þ0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€pâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉÓ&ÀpéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K— @€ þ@€  @€ @€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`  0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0Ѐ 0`À€ 0 @€ `€ @'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8m @@ @À€K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]º$@€ `€ @À€ @€ @€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ þ0`À€ 0`À€ 0`À€ 0`À€ hÀ€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0þ`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 4`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâÄi“ €\ºtéþÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ% @€€ @€0`€ @€0`À€ 0`À€ 0`À€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ Ø$@€À‰'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'N›0àÒ¥K—.]ºtéÒ¥K—.]ºtéÒ%€—.]ºtéÒ¥K—.]ºtéÒ¥K—.] @€  @€ @€ 0@€ @€0`À€ 0`À€ þ0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À@ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`þÀ€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€0 €M› @€8qâĉþ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâ´I€@€\ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtI€0@€ @€ @€  @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€P€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€(@€ @€ @€ @€ @€ @€ @€ @€ @€ `À°I€À‰'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ§M€0àÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K @Àþ @€ @€ @À€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @þ€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€  @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @À€ @€› @€Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8m @@ @€€—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.] @€ @€ @€ @€ `À€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€0`À€ @€°I€pâĉ'Nœ8qâĉ@Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉÓ&@pþéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºté’ @€ @€ @€ @€0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0à€ 0`Àþ€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€þ 0`À€ 0`À€ pÀ€ 0`À€ 0`À€ 0`À€ 0`À€ 0`À€ @€ @€6m @€Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ6   @€€—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—0`€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€(@€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @À&pâĉþ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qÚ$@€@€péÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.] @À @€ @€ @€  @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€l @'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉÓ&€ @€.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ% @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @@ @€ @€ @€ þ@€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€  þ @€ @€ @€ @€ @€€M›pâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ6  @€€ @€0àÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—  @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€P€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€(@€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€°iÓ&Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qÚ$@€@þ @€.]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K—.]0@€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @þ€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€  @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€6qâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ8qâ´i“  @€0àÒ¥K/]ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @@ @€ @€ þ`Ó&Nœ8qâĉ'Nœ8qâĉ'Nœ8qâĉ§Mœ @€ € @€\ºtéÒ¥K—.]ºtéÒ¥K—.]ºtéÒ¥K @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ   @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€P€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€lâĉ'Nœ8qâĉ'Nœ8qâĉ'Nœ6  @€ @€ `À€K—.]ºtéÒ¥K—.]ºtéÒ¥K—  @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€(@€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @þ€ @€ @€ @€ @€ @€ @À&Nœ8qâĉ'Nœ8qâĉ'Nœ8qÚ$@€ @€€ @€ @€ péÒ¥K—.]ºtéÒ¥K—.  @€  @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€€Ø´‰'Nœ8qâĉ'Nœ8qâĉÓ& @€€þ @€ @€.]ºtéÒ¥K—.]º4`€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @@ @€ þ@€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€   @€ @€ @€ @€ @€ @€ @€ @€ @€ @€›6mâĉ'Nœ8qâĉӦM› @€ @@ @€ @€0`À€ 0`À @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€P€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€(@€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @À¦M›6mÚ´iÓ¦M› @€ @€ € @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @þ€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€  @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€  @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @@ þ@€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€@€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€   @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€P€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€  @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ þ@€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€ @€þþ€0;visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/Visolate.html000066400000000000000000000032341147500217100250330ustar00rootroot00000000000000 Visolate Applet

webstart |  download |  browse source |  javadoc

No Java 2 SDK, Standard Edition v 1.4 support for applet!!

visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/Visolate.m4000066400000000000000000000044311147500217100244070ustar00rootroot00000000000000m4_define(`APPLET_WIDTH', `595') m4_define(`APPLET_HEIGHT', `853') m4_define(`APPNAME', `Visolate') m4_define(`PKGNAME', `visolate') m4_define(`CLASSNAME', `Main') m4_define(`TITLE', `APPNAME Applet') m4_define(`INFO_PAGE', `APPNAME-info.html') m4_define(`MAIN_CLASS', `PKGNAME/CLASSNAME.class') TITLE

webstart |  download |  browse source |  javadoc

m4_dnl m4_dnl No Java 2 SDK, Standard Edition v 1.5 support for applet!! No Java 2 SDK, Standard Edition v 1.4 support for applet!!

visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/dne-bot.png000066400000000000000000001543011147500217100244170ustar00rootroot00000000000000‰PNG  IHDRÚÚÆSd®€IDATxÚìÝÁ­äÈDQ:&ù¡,s³¯R B«»’ÓÿƒL’ç ,HÔC-.Pµ ¨Ù<=rErErErErErErÔþùç?~š7€¯úãïÿúiÞdrÔ5~íOûóbð«_ûÓþ¼Ø%䨓|µ?©Sð«¯ö'ujrT˱ýIàŽíOêÔ%ä¨ÃœÙŸÔ)žêÌþ¤NCŽú¾uú“:À}­ÓŸÔ©9ê îÒŸÔ)Vv—þ¤NEŽÚóŒþ¤Np­gô'uêÛä¨ÿó†þ¤NÐö†þ¤Ný¾·ç(ýI §?©S;^£Ô&E €œÚ¤Hí{iŽ™D)r"“(õ;Þ˜£´%E €œ¶¤Hý¦wå(II” ')‰R_ò¢¥$)Rä”$Eê«^‘£$Q €œ€$J}Ïós”n¤HÓ©o{rŽ’‹D)rr‘(zlŽR‰)r*‘"•{`އD)râ(u”§å(MH‘ § )RzNŽ’‚D)rR(u¸‡ä(H‘ §)R ·ÏQÂ(@Nø¥zî£ôE €œÞ£HUÝ5GÉ<¢9™G”:Á-s”º£HSw©sÜ,G‰:¢9QG”:Ór”–£HÓr©“Ý#GI8¢9 G”ºÄ r”r£HSn©«,£Q €œ`#J]kÝ¥Ó(RätEêr+æ(yF” 'ψR‹X.G©2Š9UF‘ZÇB9JŒ1Q 'ÆØjQj•¥Á˜"Ó`lÁ"µDŽR_L‘È©/¶f‘º>Gé.¦Hät[¶HÉQ&G<èbrÔgŠ‹)R9ÅÅV.RWæ(­Å)€œÖb‹)9Êä(€{ZLŽúLe1E §²ØúEꚥ¯˜"ÓWìEJŽ29 à®Ä“£>SVL‘È)+v—"uvŽÒTL‘Èi*v£"%G™p?‚ŠÉQŸ©)¦HäÔ»W‘:/Gé(¦Hät»]‘’£LޏÅä¨ÏS¤r ŠÝ±H‘£´S¤rډݴHÉQ&G܃pbrÔgª‰)R9ÕÄî[¤º9J/1E §—Ø­‹”erÀêÄ“£>SJL‘È)%v÷"ÕÊQ‰)R9ÄP¤ä(“£Ö%˜õ™:bŠ@N±g©ãs”.bŠ@N±Ç)9Êä(€‰"&G}¦ˆ˜"SDìIEêÈ¥…˜"ÓBìaEJŽ29 `-BˆÉQŸ© ¦HäT{^‘:&Gé¦Häô{d‘’£LŽX…øarÔgʇ)R9åÞZ¤Ò¥y˜"Ó<ìÁEJŽ29 àz‚‡ÉQŸ©¦HäÔ{v‘ú~ŽÒ9L‘Èéöø"%G™p%‘Ãä¨ÏS¤r ‡½¡H}'Gi¦Hä´ {I‘’£Lޏ†°arÔ”°ar@NØ09jJØ09 'l˜5%l˜6LŽúLÕ0E §jØ{Š”erÀ$ “£¦$ “£r’†ÉQS’†ÉQ9IÃä¨)IÃä(€œ¤arÔgz†)R9=Ã^U¤ä(“£Î&f˜5%f˜3LŽš3LŽȉ&GM‰&GäÄ “£>S2L‘È)ö¶"%G™p*Ãä¨)Ãä(€œŒarÔ”Œar@NÆ09jJÆ09 'c˜õ™†aŠ@Nð)9Êä(€ó&GM &Gä “£¦ “£r†ÉQS†ÉQ9Ãä¨ÏÔ S¤rê…½³HÉQ&GœDº09jJº09 ']˜5%]˜“.LŽš’.LŽÈI&G}¦[˜"Ó-ìµEJŽ29 à ¢…ÉQS¢…ÉQ9ÑÂä¨)ÑÂä(€œharÔ”har@N´09ê3ÅÂ)€œbao.Rr”ÉQur…ÉQSr…ÉQ9¹Âä¨)¹Âä(€œ\arÔ”\ar@N®09ê3­Â)€œVa//Rr”ÉQ]B…ÉQSB…ÉQ9¡Âä¨)¡Âä(€œParÔ”Par@N¨09ê3•Â)€œJaŠ”e&GE…ÉQr”™I&GÉQfrP$Q˜%G™ÉQ@‘Dar”e&GE…ÉQÛÎ…¨¦EäT {s‹r”™/B M¨09jJ¨09 'T˜5%T˜*LŽš*LŽÈ &GíÑ*L‹ÈiöÚ5ä(“£N W˜5%W˜“+LŽš’+LŽÈÉ&GMÉ&Gää “£ö(¦Eä {g‹r”ÉQç-LŽš-LŽȉ&GM‰&GäD “£¦D “£r¢…ÉQ{t Ó¢rº…½°E 9Êä(€ÓH&GMI&Gä¤ “£¦¤ “£rÒ…ÉQSÒ…ÉQ9éÂä¨=ê…iQ9õÂÞÖ¢†erÀ™ “£¦ “£r†ÉQS†ÉQ9Ãä¨)Ãä(€œ€arÔ ô(€œ†a¯jQCŽ29 àd2†ÉQS2†ÉQ9Ãä¨)Ãä(€œŒarÔ”Œar@NÆ09j’aZ@Nɰ÷´¨!G™p>1Ãä¨)1Ãä(€œ˜arÔ”˜ar@NÌ09jJÌ09 'f˜µGÏ0- §gØKZÔ£Lޏ„¤arÔ”¤ar@NÒ09jJÒ09 'i˜5%i˜“4LŽÚ£j˜S5ì -jÈQ&G\EØ09jJØ09 'l˜5%l˜6LŽš6LŽÈ &GíÑ6L‹Èiöø5¾£†"eZÀ{v‹r”ÉQ×9LŽÚ£s˜Ó9ìÁ-j„9j(R¦EAí°§¶¨!G™°ÁÃä¨=š‡iQ9ÍÃÙ¢Æ!9j(R¦EAù°çµ¨!G™°ñÃä¨=ú‡iQ9ýÃÖ¢Æ9j(R¦EA±'µ¨!G™°!Ää¨=ZˆiQ9-ÄÓ¢Æá9j(R¦EA±g´¨!G™°&QÄä¨=ºˆiQ9]ÄТF)G EÊ´(€#¨#v÷5ä(“£V&˜µG#1- §‘Ø­[Ԩ模H™p¥ÄîÛ¢†erÀúÄ“£öè%¦Eäô»i‹'䨡H™pÕÄîØ¢†erÀ]'&GíÑNL‹Èi'v»5NËQC‘2- à ŠÝ«E 9Êä(€{QLŽÚ££˜ÓQìF-jœœ£†"eZÀÔ»K‹r”ÉQw$¨˜µGS1- §©Ø-ZÔ¸$G EÊ´(€#(+¶~‹r”ÉQ÷%®˜µG_1- §¯Øâ-j\˜£†"eZÀT[¹E 9Êä(€»ZLŽÚ£µ˜ÓZlÙ5.ÏQC‘2- àŠ‹­Ù¢†erÀ3ˆ.&GíÑ]L‹Èé.¶`‹‹ä¨¡H™põÅVkQc5)ӢޠÁØR-j,•£þKŒ¢È‰1BÔ:¶/D•Ѣȩ2ZÔ"¶eDž¢ÈÉ3BÔå¶•/D§Ñ¢Èé4ZÔµ¶õD°¢È 6BÔU¶[\ˆr£ESn´¨Kl7: Gˆ 'áQ'Ûîu!ZŽ@NËѢδÝñHD! €œ¨#Dc»é…¨;Z9uG‹:Ávë#‘y„(r2UµÝýBô- €œÞ£EõlÏ8áGˆ 'üQ Ûc.DÒ¢È)@ZÔᶇ‰$D“‚„¨mÏ»MH‹ § iQGÙžz$â@N¢rÛƒ/D%ҢȩDZTh{ü‘ÈEB9¹Hˆú¶í ¢iQät#-ê{¶÷‰€$D„¨¯Ú^u!J’@NIÒ¢¾d{á‘HJB9IIˆúMÛ;/D[Ò¢ÈiKZÔïØÞ|$"“@Nd¢öm/¿µI‹ §6iQ;6ò#ýÉg€œþä3ð#9jþ9ýéåä¨/П §?½õ}úäô§Ç“££?@Nz9ªE€œþôrÔIô'ÈéOw$G]C€œþt rÔô'ÈéOk’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£(’£ø²?þöïŸæM€9 €¿ökÚŸþGŽà/|µE)RÀä(¦¾¢D)àGrŸå-J‘†ÜÂQ]ääypQ r°¸›†¨[‡}8–¬ë‘-jýZ#GÇ’£€E½­E-Rqü€!p89 X‘uIÚñ[…@ƒ,Ggºª÷ÈQ@ƒ¬ELºª½ð_²à?ìÝ¿Ïmï›ÐõE[[(ˆÁB‰‘ z‚ŠZ`Àø«bñF{cLH+0&dЊL¤°™@å Ú[LL&rë|ŸáÌó]Ïyö^?î×uݯWVûÙ{í{­sκöû³Ö`9 D1Z•©jÿ °–D! ¹U (IŽBgä( *9 X¯jÆÐœä( ÉQÀr6 -JŽ€­ÈQÀJÆíÕP¤€,ä(`ébÄBÉQ@4r°†n1y å(`9 X@´ˆ³¼rÔOýž¿þ6çÜ&G³iQ)V~·õµ?½ÞœNpžL¥Ee?(%sÔÕ¥HÀ%r0UãÐTjQ÷B”(—ÈQÀ$ZT™£S&G=oQŠœ!G3hQ•PÕ+D‰Rp† §E;FÙsÔˆ¥HÀ r0–Uï0ÉQr\"GiQU–¥HÀyr0ŠUûiQŠœ$GChQåš%GÀIrПµÉ±Ó¢)8CŽúÓ¢69|Z”"gÈQ@gZÔ>GPŽ’£à 9 èL‹Úç &z*£ ÉQ@gZÔV‡2Ëá–£`!9 èL‹Úêhf9Ür,$GiQ»ÓøÇz~‹R¤à39 èLŽÚð°?Ðr¬%GÉQ{åÈ{+GÀZrЙE4r¬%GÉQD#GÀZrЙE4r¬%GÉQ¤EÀBrЙE@r,$GÉQ$GÀBrЙE@r,$GÉQ$GÀBrЙELZ¬"GÉQ„¥EÀrЙEXr,!GÉQD¦EÀ|rЙEXZ,!GÉQÄä1}°Št&G ÉQôôoü¥¿{جɆä(¢`!9 €G¾ö§×›ÛE4Z¬%GpÓÕ%JíCŽ"! –“£¸ìIˆ¥v GÇù°¤EÀ8r×ôjQŠTarA< Kút$GpVß%J&G›œ 9 €SƵ(Eª9Šä(ˆCŽàÑ!J”ªGŽb9- B‘£xCŽâ*9е´(ˆFŽà•™-J‘*CŽb!- ’£øÖü¥HÕ G•q2í¤ÛY˜LŽà[r÷ÈQT QZ,!Gðs«Z”"U€U€t$Gðk[”"••ô%GðK"„(9*;9*5- èNŽàwÅiQŠTjrT^ZgüÕ?ü¿6kÀkr¿-Zˆ’£R“£òÒ¢ø©¯ýéõfÅ8£v3D)R©ÉQIiQüÔÕ¥Hð•°µà-JŽJJŽÊÈcúøê^ˆ¥øJŽØTü%Gå%G¥#DñÕó¥Hðƒ°,!JŽÊKŽÊEÚá Wˆ¥øAŽØH®%Gå%Gå¢EñÙˆ¥H Gì"c‹R¤’’£qkr#ÈQõå QrTRrTZãZ”"°99  ¸ì-JŽÊHŽJA‹â`t‹R¤v&G”U DÉQIÉQ)hQÈQŒ#GT&DÉQIÉQñiQÌiQŠÀ¶ä(€jе(9*#9*8éã`f‹R¤ö$GÔQ/DiQ½nQrÔrZ_ÉQŒ&GQ²EÉQé¼mQrÔrZ_ÉQŒ&G¤W5DÉQéœiQrÔZ}[Ôü†a+³ùð9 ·Ú-JŽJäd‹’£êø˜>5Å&Gp‰Uù%G%¢EÅ×÷'£Ô›"À%r@>›„(-*‹ó-JŽZE‹²ÉQ¬%G$³O‹’£RТRТlrkÉQil¢´¨´¨üd”MŽ`99 ‡ÝZ”Ÿ•‚ÇôÙä("£¢Û0DiQñiQ)hQ69 € ä(€Ð´(Ò¢²Ð¢lZAÈQAí¢ä¨ø´¨,´(›@r@8;‡(-*8-*‹ŽéSv G0š‹EXZTó2Êšg'G0šÅæ!JŽ N‹Jdþcú¬yvr£ÉQ!QÎÈ´¨D´(îÑ¢JŽX,Q.Ò¢ö¤E%â'£xB‹`9 `¥Œ·. Q[Ñ¢ñ“Q<$G0ްLÞgèiQ›Ð¢Ñ¢èB‹`9 `?æ$DÕ¦Eåâ'£èE‹`9 `¶-êöÇq¤ Eåâ'£èHŽ`9 `žb!êägtÜÓÑ¢rñ˜>ºÓ¢èNŽ˜d‡EZT.ZãQt$GÌ D‘‚•ŽŸŒb(- €^ä(€±„(²Ð¢ÒÑ¢˜Cˆà99 ` -Š,´¨t:>¦O] ×Iâlà;rÀ(BYhQéøÉ(Ör†p•0„ÕÅ¥Lb›°ù£„Çô¹ÈQ Q]?ZßÑ¢€tä(€ž´¨.„-ŠïøÉ( #9  !ª áG‹â;~2 HJŽèCˆêBøÑ¢øŽä%G<妨^„-Šüd—ðˆÕ‹ð£Eñ‚ŸŒR“£îÓ¢z~´(^ð˜> ;9 à&!ªáG‹â- (@ޏÌMQ ?B¯ùÉ( 9 à!ª#™^Ó¢€ä(€ „¨Ž´(x­ãcú´(`-9 à,-ª#- ^ó“Q@%rÀ)BTGZ¼å1}@%rÀnŠêK‹‚·´( 9 à-ª/- Þò“Q@=rÀ·„¨¾´(xËOF%ÉQ?§Eõ¥EÁ[ZP•ðBT_Zœá'£€ªä(€#-ª/- Îð“Q@arÀ/Ñ¢ú*Ù¢Nf›­ûvòÕ¢€hä(€ß!DuW¯EÉ!6- à9 à·iQÝiQ6[Ì%GóÉQZTZ”ͦEü G»Ó¢ºÓ¢l¶ù9J‹"“£€­ QÝiQ6›ŸŒ8£€M¹)j-Êfó˜>ÊûOÿÐÿ5g»±oç_üoçlN€«ä(`GZÔZ”ͦE±9JޏA޶£E EÙl~2ŠMÈQrÀ r°!j-Êf[r_Tó“Q¬ GÉQ7ÈQÀFе¨ü§ÿèa[²ª›·(¬XH‹b 9JޏA޶Pã}_ûÓëmÂÂjQ°ŠÇô±Š%GÜ GõíÙ¢&)- VÑ¢XHŽ’£n£€â¶ Q££” iQ,$GÉQ7ÈQ@eZÔ "¥EÁBZkÉQrÀ rPVöÕ+DuRZ,ö1}Ó…mŸíÆy(G„%G5iQƒŠ” ÅlQª‰MŽà-9 (È3úå¨z-ª]ÉQþd±V÷¥vØä(9 `9 (¥@ˆj#[Ô“"¥EÁZÝï‹R;lr”0Ô¡E+R%[T;£üáb¹éS;lr”0Q£Eµ9ªj‹jçr”?\»9~nW?©Úa“£ä(€iä( -j\‘*Ü¢Ú‰å×Vò†¨-ªÉQ69JŽ˜HŽÒÓ¢†©Â-ª½ËQþpme·Õä(›%GL$G¹•iQ-dŽªÝ¢šÅ'»µ¨&GÙä(9 `"9 H¬R‹j™sTÞSHŽâÆ·F59Ê&GÉQÉQ@V•BÔ‡¤9*õY$G]õ[üO¶jÏÕÆä(Fv GÉQ7ÈQ@JõZTË™£²ŸHrÔ[_ûÓë-ÝܶE59ŠHgŽPžä£EM+Rµ[T“£^º¢2F©[T“£ˆtæÈQåÉQ@2%[T“£‘£~êIˆJ¥R·(9Š…ä(9 à9 È$H‹rw”UX¯¼Hm¢>ÈQÄ9sä(€òä( P-ª{‘’£–£>ë¢"G©ùá'šPýç°9 È!`‹ê¥*娿ðÿ˜Û×]½š£Æ›å½'þö²y‹ ØpÉQ;£€"·¨^EJŽ’£VÅž\Ùì¡[TØ~€s)cŽR¤®’£€èâ·¨¼Eêí.ÉQrTêµm‹šä¨MÈQŠÀ rZ–Õ¥HÉQrÔüÌ“ñ¹‚÷ìÙ¢f†(9Šb)€¾ä( ®yif”’£ä¨É'ï/]]µa‹š¢ä(Šq@_rT¨[æ)9JŽ’£FТä(¸G‘èHŽ" øØ½ EJŽ’£fž¼?vuÉn-jaˆ’£(I‘èEŽ ûPܪE59ê‹29*õï]·U‹Z¢ä(ªR¤º£€X¶¨Û»wuâ´¨&G}!G•ÌQÙÿÚ ¢ä( S¤ž“£€@‚·¨Ûûyiä(9jŸmèß'ó[Ôü6*DÉQÔ¦H<$GQdiQ÷ööÒ‹iQMŽúB@Ê’£æ´¨…©¦K4’£àE à 9 ˆ"Q‹º½Ãç_“£†’£€Å²·¨ÛŸâä+¯ Qä¨õ(rŽÚ¢F”›“QjÜëËQrŸÉQCÉQÀJ5ZÔíÏrò•Wµ¨&G}¡…ÍQI[Ôë„ÈQêQÌ"5®EQß…œ9”£ä(>“£†’£€5J¶¨{íü+OnQMŽúB: ˜£Rßõ5ä$ú=*9Šbä(€¡ä(`Â-êö¼ñ.#úÓu EËQeZÔœŸ¡šð_¿£EdrÀPr0[ùuû“l´ƒ%GHGqrÔÐÕòä¨'Àå(9ŠÏä(€¡ä(`ª­ZÔíçxÉQÒQ¥E= Q«ÈQD&G %GólØ¢nð ‡LŽ:Ž´(!ê 9ŠÈä(€¡ä(`’m[Ô툰ÏrÔz´9ŠÈä(€¡ä(`ˆÚ-êú·ÿ“Ã6z¡VG9ê Æ/0ù 'wuÛ%GÉQL&G %GCkQ_ûÓëmÄr-9ŽrÔ5yŸwnQr”ÅdrÀPrÐßæ-jP‘Zr(娃29jùg9³‡›·¨’EJŽ"29 `(9 è¬R‹º¢nG)9JŽš™£~œ3û¦EÉQr“ÉQCÉQ@OZÔ“"%GÉQrÔ-JŽ’£˜OŽJŽº)Ó¢z…¨«Q*àóú䨃b9jÉ'z»KZ”%GMS)ÀØä( 89 èC‹z^¤ä(9j~Žšü¡ÞîŒ%GÉQs6rÀdrÐÁªU,GµxÏë“£䨡û©EÉQrÔj0Ÿ<¥EM»AjþÁ•£Jæ¨9ííhQó[Ô¯þ£ßß}{ýŽrTR°„<¥Eu,RÑž×'GÎQC?ÝÛ·Ö¢ä(9jFŽXEŽ)Ó¢šõ3rÔAí5â3žyG-JŽ’£æiä(€…ä(à>-j~‘š|ˆå¨ƒrTÇyòí´(9JŽš@¡‘£Ö’£€›´¨AEJŽ’£–ç¨çöü»hQr”5<#G,'GwTjQ-UŽš\¤ä¨ƒ­rÔ½|éŵ¨…-ªÉQÛä(mFŽˆ@Ž.+Ö¢šõ=9ê`Ãõvn¿Ô„•4DÉQrTGÂŒ„\V¬Eµ`9ªEz^Ÿu Gõr²E=ÉQZÔ[rTù%`Œ[.9 à*9 ¸¦^‹jrÔ÷ä¨9ª -JŽ’£&P/†®˜p•\°ê1}CËÖü•èy}rÔõœ¤E59ªtŽ’.F/šp•œU EÉQ—¼nQr”uƒ§E59ªnŽÒ-&¬›p•œR£EeÉQ-ÀóúÞ¶(9JŽºJ‹’£ä¨ D‹9K'G\%G§ÈQ[å¨3-JŽ’£.Ñ¢¢µ¨&GUÌQŠÅ´Õ“£®’£€÷Vu#ë[’£N¶(9JŽ:O‹rwÔ9j(¹bæÊQWÉQÀ ïa’£æç¨ç-ªÉQrÔ/ËÛ¢ÚŠÊ5óÐÈQ•r”V1y å(€«ä(à•µÏÓ›“£ÚŠ"õdÙÇîó-JŽ’£NJÝ¢F¿Åò"%G•ÉQBÅüe”£®’£€WÖþ¶“53GõjQMŽ’£þ‰-jèÉQrÔs*Å’•”£®’£€o­mQm×µäI};´(9j²J-jô;®*RrT%Q¬ZL9 à*9 ø¹å-ªÉQ³rÔ&-JŽš©d‹ú¾r”u>±d1å(€ä(àç䨘9ªûÞ§EÉQ3UmQ£w`r‘’£²ç(qbÕzÊQ7ÈQÀODhQmbŽjs‹Ô“Åï{ ·jQrÔ4å[Ôè=™V¤ä¨Mr”«š¾ë)GÜ#GGAZT››£Ú¬"õpñ;èÝZ”5Ç>-j¾>XrÔ9ÊUMßõ”£n“£€_§E59jdŽZÕ¢¢ðWsÔO•yÂÞs;·¨A{;ôxÉQåsTÉË’…ë)GOŽ:£ú*$úþ³Þq=å(€‡ä(àw…jQmEŽj#‹ÔóCÐå(kQŸ=ÏQZÔ-jÜnÛ=9JŽ*s2a=å(€‡ä(àw„zL߸]zû¦aoêòu›õÙëu&GyL߇¡-jPˆšÐ¢zíÿ¸}“£ä¨bW C×SŽxHŽ~[ÀÕå¨6¦Huù¼²õÙÛ5.GûÛ#c‹š¹>‘wXŽ’£ê]Œ[O9 à!9 Ú¢Úºõafˆ:óye-ê³3-êmŽÒ¢š5ëƒ Ú19JŽªzù1b=å(€‡ä( ÅlQmuŽj=ŠTÇñäkQŸlQ¯s”Çô5-jîg±cr”UøÚ£ûzÊQÉQ°»°-ªÈQ&„¨6òI}[T»’£bžð]ZTsk”5ýØ+9JŽ*áÑq=å(€‡ä(ØZØÇôÛ½{ 5ºEµa9J‹úì|‹qkT¥¿:´¨%ªû^ÈQo‹ÉQ£s€Žä(ØWðÕ"娃.ýéÒ‡½÷š}[T;£bžðk[T¥¥EݳOŽR¤¦É˜£â_{0ˆ›Jñ}ÐV_Kußíî-ªËQ1—7i‹:~n7>oáÕBÞ %Ge—.GÍ¿öP¤â£`S)¾ Úç;©î»=¢Eµ9*àÚ^ Qq~2*uˆÒ¢Æ}ƾû3.G)RsÈQr@"rì(Ë7ArÔ½ÝÔ¢Ú»jI¯V(-J‹š Ú‡š£© rå¨U-J‘BŽ€í$úHŽ Õ¢Z†u¯BkQWsTö¥EMø°A>ˆA¢µ¶E)RÈQ°DßþÈQW÷yh‹jsÔ“ u¦Eµ)·FiQå[T ù R·)RËÉQr@"rì%×·?›|ÕkŸG·¨/G=¯PAZT¥EÍüÔq>‹"µV–¡E)RËÉQ°‘tßûÈQç÷yB‹j‘rT¯5®EÏQZÔV-ªíwƒ”"5Ž%G$"GÀFÒ}é#G¸5êÉ®ÉQ3[TykTu/GmÛ¢z}ü8ŸEŽZ(EŽŠÓ¢)€µä(ØEÆo|ä¨î·F=ÜÕ9J‹Ò¢²·¨V멦H­#G©S‰ÈQ°‹Œ_ôìðÅÓÌ'õ=ßÛå9jfˆjÃÓ·sˆjZT¿uˆóY<²o9J¦Jz jM`OrlúE@Šït䨎9ªËÞ®ÍQÓ*Ô‡P-ªÌßEZTߥˆóqä¨%ä([öÍŸbØŠõåýÆAŽ:ó ÓZT[š£¦U¨º·¨ÍCTÓ¢Æ,Hœ£HÍ'GÙD) 9 êó]CÞ£s榵¨–-G=y» ÷E•9Ï…¨Ô-ª•ËQM‘š.~ŽZl®€ä((Îw ©Î™™Ö¢Úº5­B}ñ˜>7E Qã'ÎÇñ#R“ÉQ6Q HDŽ€Ê|Ñýy9ªcˆú°üÖ¨J'¹5a‰B}9j&9Ê&G‰ÈQP™/R 3¯0óI}-vŽêõ^#ZT;£ŠáZÔ´U õ‰©iä(›"$"G@Y¾hÈ~ŒÎ¼ÂÌÕç¨^o4â1}M‹Ò¢Æ¯U¨ã‘}ÓÈQ6E HDŽ€š|ÑPày9ªc‹jënªwzkQó—+Ô'’£æ£lŠˆ5ù–¡À1zû “ŸÔתç¨A-ª½ËQõÎm-jÉ¢EûDŠÔñsTS¤l.€BŽ€‚|ÑPà0y…É-ª•ÎQƒÓ×ö»5J‹Z¸nÑ>”"5šeS¤€Dä((È· Ó™W£zå¨q-ªmvk”µvõ¢}"?"5šeS¤€Dä(¨Æ· 5ŽÔ™W£Ö樓/¾OŽÒ¢",`´%G %GÙä( 9 Jñ-C™ƒõö?ŸÿÃQ­hŽZØ¢*å(-*È2üPŠÔ8r”M‘‘£ _1”9Xoÿóù-ªUÌQCÓ×¶¹5J‹ µ’Ñ>”Gö“"G5EÊæZø9 êðC¥ãõö?—£æ¨ó¯¿CŽÒ¢¢­gÀ%G "GÙ) 9 ŠðýB±Cöö?—£žç¨µ-ªFŽÒ¢b.iÀÏ¥H%G5EÊæŠ£  ß/;doÿs9êaŽý˜¾¶Á­QZTØ…ù¹©îä(›$"G@¾_¨wÔÞþçrÔ’ué-jç(-*øÚü\rTw‰rTS¤l®`{r¤çË…µ~ßÿò7ßn·ÜwoúºE½.RÿÌoý•·ÛOÿÃ×-êu‘ºý¦í]‹z]¤nßõ$M½}Fß‹u{¡&÷ -j47HqF®µðŠ¥Þå“"d$G@z…¿Yø#¿þW»oÝ×_Ž’£n·¨–$GiQ^REª#9jDÆP}ä(`9 r«ýÍ‚õÝ›ÊQrÔÁ´8¡EM³sŽR¤NJ—£–\·8O*VK ©ÉQ`þ—£‘£ä¨ƒª9jPˆº·cÿÔ?úk1·.«Œ[ê }KŽê%cŽš|éâ$qL€8ä(0üÇ}èŠõÝ›ÊQrÔÁè–-oÈQ©sTS¤:‘£¤‹ «¥€¼ä(0öËQÈQrÔA½°mÈQ;ä(Eê­¤9jÎeŒÓ£ðu©Õ€¤ä(0öËQÈQrÔA±3lÈQÙsTsƒT©sÔÐ+çFíKSK IÉQ`à—£‘£ä¨ƒJ9*lÕ£ 䨦H=–=G¸¤qVlrj© #9 ŒúrÔ#r”uP&GENrTÕ©gj䨎6N‰­®Q­6¤#G€Q?h‹jr”õ rÔ’¼gÈQ[å(Eê;erÔóË'Æ—©–Ò‘£À/G="GÉQrTü˜!G•ÉQÍ RËQ÷®sœ;_©ZmÈEŽC~ÐÕä(9êä¨É9*EÉ£*娦HÝU2G½ý·Òqw±ê|€¤ä(0ÞËQÈQrÔAê•%cÈQæ(Eê«r.Yå((C޳}ÐÕä(9êä¨i9*QãŠå¨æ©[ä(\²*Rˆû¿ö+9ê»7•£ä¨ƒç-!WÀ£ê娦H]'GáÂUŽ€Dä(0ÒËQÈQrÔAÆ•®^ÈQIsÔɇòÅß‚\ÈQ}ý+ì—Ùv»|uö@ rä°a‹jr”õ rÔè•ñN9JŽ’£šÕ›•÷òÕÙ )ÈQÀž-ªÉQrÔ/ÈQCsTœnq)íÈQr”Õä¨Þä¨Ô±N`ˆOŽ€ä(9ê@Ž’£µÑâIé‘£ä(9ªÉQ½ÉQÙ¯cÜÑí¢>ÈQß½©%GÜh ‹ÅóÞ#GÉQrT“£z“£²_Ê:‡ 89 BÛ¹E59JŽú9jDŽZ•+Âf$9JŽ’££ \Ð: 29 B›<½GûF@ŽúîMå(9êàRKТä(9JŽâ+9ªÌ-“q-ÝC} G}÷¦r”up²%¬ ;„(9ê 9ª/9ª/9ªÞe-Šq-Úƒ| G}÷¦r”u9QìӢ䨷䨾䨾ä¨W¶Š„%G@P&öåÿõÝ›ÊQrÔAÌ>±Uˆ’£Î£ú’£ú’£v¸¸’£ ¨€ãúüi_ŽúîMå(9êÀ}Qr”%GÉQÉQe®o)ˆI޳z\rÔwo*GÉQZ”%GÉQrÔCrT¥«\ç3$G€A=.9ê»7•£ä¨-JŽ’£ä¨’9êÏÿóÿÏa÷^rT¥«\E ’£`Ó)=ÅRÈQß½©%GDkrÔr”uRÉõµ?½Þ:¾µåZJŽ#z\rÔwo*GÉQZ”%GÉQÙsÔÕÕ=JÉQÅ®u)ˆFŽ€çó,«!G}÷¦r”u EÉQr”•7G= Q£”åŠJŽ€í&s9ª/9JŽ:¨š£Nþ‰£ž“£ä¨“jä¨^-êy‘’£J^÷š/ 9 ŒåqÉQß½©%GhQr”%G¥ËQ}CÔó(%G¹î†’£`¯™\Žê¾“r”uP/Gÿã Guù[EŽ’£NJ£Æµ¨ÛEJŽªzõkÊ€ ä(0Ç%G}÷¦rTÇÕ÷?lårÔù? Z”õ–ÕWÒ5:DÝŽRrTÕ«_E ‚£`£i<ݲÈQß½©%GDÈZ”õ–Õ—%GeÏQ®`+rŘ\˜.‘£ä¨ƒ29êêŸ-JŽzKŽê+cŽšÙ¢®)9ªð5°"ÈQ°Ëžz‰ä¨9JŽ:ˆ´(9ê-9ª¯t9j~‹ºT¤ä(WÂÀPr£ä(9ê BuТ䨷䨾ä(9ªFŽr1 ›£Àø€u GÉQË{ƒ%G!Gõ•+G­jQç‹”åzJŽãwrÔ%Gœl ãbƒ%G!Gõ•(G­mQ'‹”å’JŽƒwrÔ%G\j #2ƒ%G!Gõ%GÉQr”‰ÈQ`ðN@Ž:£ä¨ƒ9-á!JŽ:CŽê+lŽŠŸn)9Ê…10”Fîä¨9JŽ:£ä(9JŽŠ£Â†(9ʵ±ËÉQ`äN@Ž:£ä¨9JŽ’£ä¨µ9*xˆ:S¤ä(—ÇÀPr¶£ä(9ê`yŽjŠ”u‚ÕWœ•¥EÉQ®å(XHŽÃvrÔ%GÈQr”%G-ÉQ‰B”å"Y‘€µä(0f' GÈQrÔ%GÉQrÔü•®EÉQ'ýÃ?ñ6×ÉÀsr,`̾JŽ:£ä¨9JŽ’£ä¨É9*c‹’£^ûZ¡Vu)—ÊP’³°o£ä(9ê@Ž’£ä(9jZŽJ¢Þ©sÔ™53J¹Z€’ä(˜m΀íî¨iä(9ê`ÛÕ)9ê9ª¯%9*{‹’£¾ºÚ¢)à9 ¦šÖ¢ŠÍØrÔ%GÈQr”%GÎQB”up/D͉R.• 9 ¦’£î‘£ä(9ê HŽjÛ©.k(GÉQ'ÍÌQeZ”õYäÕ)(GŽ€y&·¨J3¶u GÉQr”%GÉQãrT¥%Gýð¼E¹A ¸DŽ€y–ä¨c¶u GÉQqrTÛ»HuY@9JŽ:iBŽ*¢ä¨zµ(E 8OŽ€IVµ¨c¶u GÉQ¡rTÛ¸HuY=9JŽ:itŽÚªE59JŽ“£`’µ9*û¤-GÈQrÔ%GÉQrTßU²EÉQú¶(E 8IŽ€–·¨ì“¶u GÉQÑrTÛµHuY:9JŽ:i\ŽªÚ¢ä¨r”KÈQ0C•wØ–£ä(9ê `Žj[©.ë&GÉQ' ÊQ…[”õ!WŽšs!mZ€ ä(.N‹’£F£ä¨9ê9ê9JŽ:iDŽªÝ¢ä¨6¦E¹A 8CŽ€áB娤öu GÉQ1sÔ9ê*9JŽ:IŽêØ¢šå)`09 ÆŠÖ¢ä¨îä(9ê@ŽúJŽºDŽ’£Nꞣv¾5ªÉQÛç(E F“£`,9ª 9ê@Ž’£‚ç¨ÃOmkËÓOÉQ}eÉQ-Fèzûñå¨È9ª¹A ò“£ ÷Ø,G-ÏQÝËBßÔщF‹šIŽ’£®ä(9*Ëuµ;`9 ÒÍ;ÌØrT_r”£³–5‡%G]5´oQMŽ Ÿ£š¤ 99 Ìû ØrT_r”£5š%G]5:ÿÈQrTS¤Ê\]û·Æ‘£ ñÀ¼Ït-Gõ%G9:éOÝÉQrÔU£Û‡õÉQ).°ýóƒÈQxZÞg®–£ú’£v GÉQWMH>r”ÿÛ?0ˆYGå­†j9ª/9ÊÑar”uÕ„âµÀEjŸÕz©z—Ùþ€ä(È:'o5KËQ}ÉQŽ;˜£J‘—® •£æ¼Ëœ‘Ú%GÀ|r¤’w¤å¨¾ä(G‡ÈQŸÉQgÌÌ“£ÎØ0G)R娫-*f‘rz@/rô‘4G½mQ·‹”‡c“£ö$G}&G‘.êÈQ½tÏQ÷BÔ½(å)ÈBŽ€>ÒÁ'CÔí"%GšĨn)9ª9ê39ꌌQGŽê¢oŽzÞ¢¢)gt!G@éþ¯Ì«-êF‘’£âal7Š”U€õ™u†µ­^9ªWˆº¥Ü )ÈQÐÁ-êj‘’£âÐ`lrÔžä¨Ïä¨3’F9ê¡È-êd‘’£ 9 žÊ5?iQrTRŒíF‘’£ £>›–£^¿ÑÃÝxÝŸž×©¡Qç×ÿ⟼½ Ýóå;ÿÿûå÷ÝÞÞ¾øëÚôv;ò/ÌQÍóú 9 žÊ2ý> QW‹”Šc»Z¤ä¨ä¨Ïä¨3;/G-ÙùV"GkQn€2ä(x*ÅèÛ«E/RrT(ŒMŽÚõ™ufçå¨%;ßòç¨Ñ-*H‘òÏ <$GÀ#)þO̾-êd‘’£¢Ñ`l—Š”U€õ™ufçå¨%;ßä(7HÀä(xdÏu¦HÉQi069j+rÔgrÔ™—£–ì|Kž£æ´(7H@rÜÿÿÁ×¢Þ)9*&Æv²HÉQÈQŸÉQgv^ŽZ²ó-pŽzûâ3[Ô™"%G@drÜ·y‹:ÿ;R„"ÃØÎÿ‚©ÉQŸÉQgv^ŽZ²óMŽÊ“£)xBŽ€›Ü%G¥&ÆØü)(OŽúLŽ:³órÔ’or”çõÀä(¸IŽR¤§de‘£˜O‘úAŽ:³órÔ’orTª¥HÀmrÜЖ£)º“£ä¨€þÁ¿öïÍÙnìÛ“ì´I£’£Îì¼µdç›Õ5G57H@TrÜ‘åÿ»T¤Hª^eñ¼¾ä(9êùÉQrÔO%ÍQó[”¤ 59 îÈ2âÎÌQŠÉQrT@rTáÕ±HÉQß‘£^£ä(Øw$q)2’£ä¨€ä¨Ú9ªW‘’£¾#G½ Gy^ì@Ž€ËÒÍ·KŠÔä7ÕŠ‘£–ç¨ÿñÏýż۠ƒ(G•ÏQ]Š”õ9ê9*]ŽR¤à9 .Ë8ÜÊQrT.r”%G]"G½Õ± õz#9ªoÑ‘£¾³gŽjn€xä(¸,ép›ºÉQ»‘£ä(9ê9êŒ9EJŽúŽõ‚•1G)Rp•פku&9*‹’¿‡”뇣䨯ä¨}rÔ“"%G}GŽz!iŽj+ŠÔ>×íP×dk¥&9*9JŽ’£.‘£NšP¤ä¨ïÈQ/ÈQrì@Ž€k²Ï´R“•‚%GÉQ—ÈQç.RrÔwä¨䨤9J‘€Kä(4ÓÎùj“Ÿ%GÉQ—ÈQ— -RrÔwä¨ä¨A9ª¹A "‘£`ÇVp’£‚“£ä(9ê9êªqEJŽúŽõ‚•7G)RpžQÚÉŸEs’£"+™£Z¤"õvW娯ä¨J9ª +RrÔwä¨òæ¨6·H¼€—£à<9 öee'9*,9JŽ’£.‘£îQ¤ä¨ïÈQ/¤ÎQmV‘ { ¯HÀIrDe—|(åIŽŠ©jŽj1ŠÔ™ýÜ9GMËNrTÝ»‘õ9ê9JŽ€ÈQb”]ø¹Ä'9* 9JŽZ’£–‡(9j‰'©ïövW娪;Ÿ=GµñE*òe¼'ÉQ°û+ÛPáÕV)g×w‚´(9j 9ꃵjç ä¨6²HÅ¿’W¤à 9 B ±k?E4ås‹Mœ%G­"G59jÝÎËQ£sTsƒ G€ñõ·iQ„"GÉQ3…jQrÔBr”µjçkä¨6¦H¹ž€2ä(0¾þ!Š8v(.ZTÑZ”µ–%G-Ùù29êC´µÛ%=„%G€ÙõwiQ±ItÑ¢– Ø¢ä¨åä(9jþÎËQ­G‘rIõÈQ`pý%ZÈQrÔ1[”%GMÞùz9êCœµçU=D#G€ÁõH‹b¹­º‹µDØ%G!GÉQ3w¾jŽj׋Tê {ÿ¶Àkr,Y#®BkíV_ä¨É"·(9*9JŽš³ó…sÔÁüþ4ùÚÞ¿°ð‚FÖ!þÞßøònÎüåö¬/¡ŠTð`ó$çÜ~)9*EŽúïWÛˆw‘£ä(9Êå½WÉQ°l^•£4*¾³íÍ@rTä¬%GEÎQ_+Ôœ.õ•õ9ê9ªÌå½K8xAŽ€5Ãjùyµ^Ž¥fÚüÙtrTÌ[¬ä¨˜9êLˆš¥ä¨ïÈQ/ÈQ®ð`rV‡£xÂO%µ®QêÆ»kQ ×äÆñÚ6G]mQŠ”õ9ê9ªÒE¾«8øŽk&U9J‘â9ªïšÜX-ª†Â?u/DMˆRrÔwä¨ä¨Jù®âà;r,Sw˜T ç(Ej9ªïšÈQ{¶¨&GÉQr”%G¹Î€0ä(0¦Q;G)R£ÉQË—E‹ª¡jŽzÞ¢Æ)9ê;rÔ rT±K}rðSr˜Q‡(Ÿ£©¡ä¨îËrue´¨Jæ¨^-jP‘’£¾#G½ G¹Ô€ÈQ0{@•£)Þ’£º/‹µa‹jr”%GÉQr”«}CŽê›ä(Ej9ªû²ÈQ¶¨V1GõmQ#Š”õ9ê9ÊÕ>ì@Ž€Ùê&k¸OŽR¤F£F¬Ì¥Å¢j£ä(9JŽ’£\ð@rLMå¨\yI‘ZEޱ2ûä(‚~£ä(9JŽ’£\ó@rMyEŽZBޱ2凯Šå¨-ª{‘’£¾#G½ G¹æ€ÈQ0u4µ¼)Ró).‡.ä(9JŽ’£ä(—ý„æRÞS¤&S\-Ž"µ9JŽ’£–ïü™ý—£J^ö»ò€9 ¥œ¢HÍ$· Z9j7r”%GEÈQo?‚åÊv GÀ¼¡Ôòf§HM#·XŸ€þàŸÿÍ9Û}{’5*9JŽÊ¸ór”‹àƒ&R.P¤æ[Æ­"u›%G!G}góõúSÈQ.þ`rLGM¤5œÌQŠÔmCË&ÅÅâ,!GEx‚_ðÕä¨ïÉQ/^_Žrý;£`Ò8jyËP¤ÆéÕ¢ÊG+³„%G!G}GŽzñúr”v G€Y4ßb.ÿÿX©îú†¨°éåïüÞ_?l«VìíëOK/ArÎr”u†õ9êÅëËQFØfÑèK0G5?"ÕÕ¸¤H}­PÏ»”5?ÿÈQrTë]¤ºïžõq-'þÎËQ›_ǺÒ€r̘E-Z½Õ©F‡¨åQêLˆº¥ä¨ùHŽ’£Î£¾#G½x}9ªö­ë=ø G€)4è¢ÅÏQM‘z¬vŽºÚ¢f©·/¾aŽzÛä¨ 9ªõ+R#öMŽúÎæ9êõëËQئЈ+–%G5Eê™-jr‘º¢®F©¡«±gŽz‚ä¨89ªõ(RƒvLŽúŽõ‚e€ÈQ` ·\¹rTS¤n™ß¢f)9ªd‘’£ä¨3ä¨ïäÍQ£[T“£ª_ܺê€rA­Uí¥H}V8G=oQsŠÔëWÞ9G}„ä¨hEªÝRCwIŽúŽõ‚UþúÖ…49 ÌŸ¡Ö*iŽjŠÔE«ZÔ„"Õ«E,Rã–bóõÓ&$GÌQíz‘½?rÔw’æ¨ -ªÉQÆ؃æÏ( •:G5Eê´µ-jt‘’£ )9*l‘j碔«…žGói'Úžß{߇ ã$G€ù3Ä*ÈQM‘:§pŽêÛ¢Î)9jf’£"ç¨rTL½ZÔü"³EÉQ¯u­-49 ÚøÊb•öÉQít‘Úö[„5®HÍÏQmØÏG QÑ~¹ê59êƒMß5?J-ÙÏ.è#àå®å9 Lž—hª/ˆŠÔ r”$çÈQr£kQsŠTØ%G )9 Lž=×ÇéôA‘ú©8-jD‘Ñ¢F?¯oó?§r”Å £CÔœ(5ß´(CÔ&G`ìô¤¾nëãtúL‘úJŽÊuƒÔä(9вç¨U;&G™  69 c§™³Ïâ8—¾R¤䨀9J‘’£ä(úšÙ¢º©…{¥E  <9 3§™³ÃÊ8‘~êdŽÚ§HÉQƒrTS¤ž‘£Öæ¨× )ìöä#ÿWÿÝŸ9leþ4ÍoQ½ŠÔÚýI×¢þåÿã?ȸ `-9 €­y"G—•q"½ H}&GËQM‘zFŽ’£&䨯ª^—ʘ£–ïOÆû¢ä(9 n£Øšõ|eœEo)R¢µ¨î fyŽjŠÔ3r”5.G Q¢Ôªu»HEØ“¤Ïè+œ£š"ÃÈQlÍ´ùpYœB'ÉQmƒÕÆ©Éë¼ùU9JŽ‘£®¶¨¤Ejm‹ºÚ‚ìFÞß‹’£ä(¸AŽ`k¦Í'Ëò拞ßó?çÝF¬ª"%GÍÉQÏW;òñšsXå(9ªWŽº¢’F©,9*ÔMZr”[‘£Ø—'õ=Y™÷_÷ÈQ_l^¤ä¨™9*Ëú§8¬?ÈQr”õí?úZTíü¢oQIƒSü¥H°39 €}™3o¯Ì©o¦ä¨ŸÙ¹HmÒ-b¶¨È‡@Ž’£ªæ¨ç-*Q‘R¡*µ¨’!êRŽ2&À rû2gÞ[™³ßLÉQߨ¶HÉQËsTÛ¦H :‡å(9ê|ŽêÕ¢R)êjŽÒ¢ä(Ø“À¦<…ãöâœýrJŽúž"U;Z„mQ1‚%GÉQr”¡EÕQ¡r”"À¶ä(6e¼½8g¿œ’£¾w2GÕ+R›D‹¦HÕ=²û£žä¨¾-*~‘¢Îç(-*KŽ2,Àr›2aÞ^œ³_NÉQ/íY¤ä(EJŽÊBŽŠ–£"'.!*õ­Q›„(9 "£Ø” óöâœýrJŽzgÃ"µ[´ˆœ£Zé"å߸çä¨rT¯(¥E\(-JŽ’£ØœÀ¦Œ—·çì—SrÔ rTùh¡HÉQIÉQ·sT®õ¼HiQ'*Z‹Ú-DEËQŠ{’£Ø‘ÙòÉúœý~JŽ:G‘Ú¡X(RrT:rÔV9êI‘Ò¢ÎТ2æ(#t'G°#³å“õ9ûý”ušµO±øigZ^¤Z¹(培çä¨ÝrÔí"%D½ªEm¢ä(ˆ@Ž`GfË'ësöû)9ê Ejó\±\"§Ð8r”_R¤˜IŽ’£º)!ê«Ú-ªÉQ¸EŽ`;¦Ê‡KäúªcóØ'GµE*þšxd_j¿ñ/ýç‡-øÉQõDøI§.ûvò5…¨ƒå-jZª1;à9 ó¤‘òÚ*9‹>ë?¶ºAªÍ-RYÖD‘Jçk…ÊÒ¥ä¨qb¶¨ûv慨ϴ(ãƒ"ß‘£0Oš'¯­’³è‡ DŽ’£šGöåq&DEŽRrÔ8‘sTë]¤„¨'CÔ¸%D 89 ó¤yòÚ*9‹>Œ« rÔÎ!êE*¾«-*`‘’£† Û¢nìÞÛW¢´(ãƒoÉQ˜'Í“×Véä‹ÌÿY ™õbhÙç)-ê…åìûþ˜w}tî…¨€QJŽ-l‹º±{¯_JˆZØ¢„¨Ô„µ`+r†ÉpÃä_þ?vØB­ÒÉI£ÖF9jóõƒ%G&G9ê@Ž’£Ö標;Ü+Gµ‘EªãÚ Q7ÈQrÜ G° 9ª×Z|‘ÂÑÈóúžÐ¢šV¤ä¨9JŽ’£nä¨1CÔó 5"Dµ -ªm™£šçõÀcr[Xþÿ3ÎiQ½Š”ù59jÉÒÉQ?Lþ)>ÈQrÔÂ5yŸ»ç¨Ö¯H=\É. jóõAŽ’£à9 €-¬ÍQ3[T—"e`~mrM©T¤ä¨^©ùä(9jUŽš¿Û#rÔ‡%!ªc‚¢ZªÕä(E n‘£ØÂ>·FÉQÈQó×M‹:˜ù#R´¢-ªÉQrÔ7Æå¨BT÷%D}HZ¡ä(BŽ` rTÇår:Í*r”õ•5͸%G}£&/ÎÛ7£zÝ5(A Q-C‹Êž ä(ˆCŽ` rTÇår:EËQYŠT™õ¯ÿý_9l«öD‘mhˆ’£~Hš£ònoÈäõÐÐ µsˆªT¡ä(BŽ` rTÇår:ÍÏ*rT[£¾V¨å]Ê#ûÆ™¢–·¨&GÉQßÈ’£ò†¨»E• Q]rÔò™²“£ØÂÂÑq~‹z^¤LËoy^ßÌ[ޢ΄¨UQJ‘aN‹’£~Ї¢©9Jˆ¤p‹ ž£\c°9 €úÖÎér”Qù Ïë›¶\ËsÔÕ³Hù3{Ò´¡E59JŽúFü•4D57EÉQ®±Ø›@}rTßµ:ùRÿÛ?ý·óno?uIÒu/D-‰R#ŠÔÌ0¡ôÄßÃä(9ê§‚ç(!ª»B”ÈQÔ·ÛGÝÎQ}Ge9ª{YÙ6G­Úíb9êj‘J£J³ä(9ê§Âæ¨8êj7Ò¢Ê䍿ç£à9 €ú䨾«tòå¨É9*l‘ÚöÖ¨ì7H)FµCÔ9JŽú©˜9*ÂP7’%G)Rðƒ@}rTÇ%:ÿšr”õ|­²·¨ÔEJ7:“”R·¨&GÉQߘ£–?‹ï^OÒ¢ä(9 >“£¨oùÄX¦EÉQ?¬J,éŠÔæ·F¥~dŸæt¾'e Qä(-ê§¢å¨å?u¯*U Q]^DŽ’£Ø“@q&ÆÈ9jÜ„\;G57H“1GõmQy‹”òt#)e©P?ÈQrÔOÅÉQ Ô‡i!jN‹êXqä(9 n£(NŽêµ8WW^Ž”X¶ÊQKö9uŽjýÙ'>E®JøWÿ÷Ãvïu䨡Q§‹’9êdCZ¢>¸)껄³sŽj½IÉQa\Œ™£FÆrÔ’ªHyRß’Õ:) *`ˆúZ¡zu)"›_Ñå¨KII‹êhy¼1_ÈQðAŽÀ¸¸cŽš0ËQr”ù©·EJˆ բ΄(Qªª9êö?ÕnQsÎ!*×|¡HP›€qqƬ¸[‹jrÔÈÐ’"G¹5*û RBTW[”"UÏä öÍQéBÔ7E±d¾£¨MŽÀ¸8iVܪE59j]Ž R¤ä¨µ9ª=.RBT÷B”(UÒ̻ꕣ2ÞõAˆ"ш‰ÈQ˜7ÊQ3'a9jaŽŠÐ¥2¶¨¶_ŽzQ¤$¥ä(~£¦µ¨62GM8U´¨ÝF HDŽÀ 8oVܧEí`mn9_¤–t©¤·FµZ9ªuú)VyÞ¢©zF‡¨]rTÞÕÆä¨ §‡Ucʰ¶&G`Pœ:+jQ•$ÊQ“£TÒÕÊå¨ÖãG¤X¢W‹R¤êÝ¢Z•7Dµ´·F Qe¦ k @arÅ©ƒâ’e$]ŽšS¤òÞõ¡R‹ú He$GñÚ õ!lŽš³¶ér”›¢L…€Aqö ¨E•±ª¸ÜnQs¢”•1G)R¡ômQŠTm+ÔsTêÕRå(!ªä” Âä( Šk¦DÏè+@Žê»&ZT«˜£š¤²‘£X+`Žšùñ³ä(-ªê”á²€Âä( ŠË¦D-*»%Ñåy‹Z¤ ä¨6 HEøPŠT"rkÉQÁs”eЀ¤ä(Œˆ‹§Ä!ªiQSÌ.½ZÔ¸"U EµoR¤"Ñ¢).y’£=©ÏÃú~¢v˜5¬-UÉQ×O‰ZTRóÓKðUã֍Ыl˜£þÒó—3n…OÂÍsTS¤žïU¨›¢þ?ô[·,³† ¨JŽ ¬¼#âþtïƒý¿öÿ[y·ósfzéÛ¢F©2-êÃæ?"u²]ÅÜRÿã%GÉQËÉQÑrTÀ§óÉQMŽ€ëä(ÊÚsDìû)R'%9jrŽªtkÔ‡9*Ñ=R¶UeKŽ’£–“£Bå¨i-*ia’£ 9 €²6;~„mC”u[½õ¡^‘R˜‚G)9JŽZNŽj½‹Ô½}¢ä((FŽ ¬ÝFD-ªvŽÑ¢ú©’-êƒ"e›Y¤ä(9j99ªÈQӞηO‹’£`99 €²¶µ(9jmŽªzkÔgŠ”mÚÑW¤bF)9*š'9ª)RKÖA‹’£ÌЗ@MãæÃ€#¢%GeÏQ¹þzy–²)m)r‘š£>G© ¹KŽŠFŽú!K‹ºñ.»…¨\9J‘ *9 €šö™µ(9jyŽÚáÖ¨K)Eê¡ 9*ÔÝWrT4rÔós”•(G57HÀEr5í0öÝm j~Žº”aä¨\)Eê!9JŽZèaŽj½‹Ôò {_Ô½³m‹’£`99 €š†Þ•n{»\úÓíÕfÝ U8GUý[H‘R¤ž£ä¨…䨯¢ÝuïSì¢ä(ˆ@Ž & J‹*–£Ú˜"õüÏš[£^HQ¤„%EJŽ’£žç¨Ö¯H…Z7EÉQÓ&Ó%ÉQÔ¤BiQr”[£"p”"õ„%G-ñ:GÍ,Ra—¨K…ú0!D5-JŽ€ä( R¡F´¨«GAŽÚ!G¹5êŒ,Eê`çJ§HÉQrÔosÔ´Gö•ÿ"æMQƒ^VŽ’£@Ž  !jy‹ÚÊÌãI}I%-R;+pÔ“ÿVŽ’£z©v7Jíð÷LÞÕä¨ñC‡ˆ(IŽ  -êíiQÉQZÔŠT:©‹ÔÃÿ\ŽÚQ.…¨{-jB§‘£& þ 9 €‚´¨´¨&'™-ª¹5êE*hEêÃí$GÉQç(Rö¬Pj´¨&GM:ü @=riQßÑ¢Ù0G¹5ê6E*˜Eê 9jyŽú3ö7[ÌSe\‘ÚSöô=y£ª9ªy^\!GPõSZÔ8KªÌÂû¢šõŒ"•N½"Õ†E©{²OŽúZ¡âw)Eª—7E=y;9JŽ9 €j<4ã§´¨¡VU-*/E*EJŽz’£Î„¨°QJ‘z®Ò}Q÷ÞNŽ’£ ÉQÔ#G}µ¤Eý•?ùky·«vm˜™¢ž^9ê‡àEêÒîEÛ­‰§ö ÊQå]mQŠT1ÑZ”#’eô°¶Ô#G`&Ô¢†Ü%GÍ3£+T—Ï«E}­H¥NPsÖªX‘’£F»¢F©“9J‘:¸¢´(£‡@yrfÂÊ3aß•º0í£æpkT_e Ð>)«R‘’£F+“£š¤~Ù™’¤E=)8£0–;¶¨}BÔü•.ÏhQÝ)@é¢T™"5"G)R? #9 aP‹’£zéÕŸ´¨äEjšÉ9jŸ(U>Gµ=nJÝ¢ä(Ó$G`,2jQrT#B”u•ü£Hͱ$G•R#Z”"5_ÌÕ´¨Ík @1r¦A-ê'䨫 ¤šq!JŽºAþQ¤&X˜£ ©}rT+]¤b¶¨æ1}ÈLŽÀ4˜~Ô¢"䨖ü)-*¦…ÅE|Ú¡H­ÍQ?¢T„Ýè˜Ó¶ÊQ­h‘Ò¢Þú÷ÿῚq3€ÀZr¥l8 ®jQN¶¯’ÖšÑ!JŽ"¾m‹TÒ$GES¯HyLß[rÔœD‘ 9 €Rvµ¨P26- >ìY¤$%9ª—bE*oŽš¶DrÔæ3Ü#GPÊV£ M®3'DÉQ$²a‘òð=9ª—J9jD‹z^¤¢ýd”µó ·ÉQ”²Ï(¨E”«îÈQðÕnEjh¤Ù6Gµ1E*þŸ2E*`Ž õ˜¾rÔ¶3Õå›ÈQr|!GG¦M`÷Õ|4jbŽjŠ”µ?9ê Eª/9ªBŽjÛ©v5Jý)¡~M_¯ï#GÉQð™@ÕrÔ©o¨EMÎQM‘R¤6'G½§Hu$GÉQ­R‘:ûý7ú5}§¾•%GÀgry¤Ùú5}9rTS¤ä¨ÉQ?R¤z‘£ê䨶s‘jÇ¢Ô…o»]‹jrTêŒ#GGŽM •)G=(OrÔŽä¨#)Î’£ÚæEê¡K…ú°ÑŸŒ"ýN†’£° \° |•—ömQ¦ßqB”E&ŠÔ‡?õ‡ÿ÷—ÃôøNŽj‡sTð"Õ‹e'"GP‡€Mà¼MàÁÚªE59j 9 öU¼H}¯PºÔrÔƒõ°ã¯écß,'G`8cØ%DjQÍG£6'GÁFj©#!J”úBŽú HiQv"rÕÈQØßöjQ~MZ„U­HmQŠÔƒõYå"¥EÙ‰ÈQ$G`8pØ1DøhÔßDŽŠOŽ‚8Š©k!J”z£¾¨Y¤¶¨99Ê¥;ñN¢‘£° Ü#GýÑZTer¬R¡HÉQwÈQß•*RÇC”FÙ‰ÈQä#G`8j¸°EµŸrÔ_®E%#GÁ4¹‹ÔýU¼HÉQO)RZ”ˆ@qr6C6 M߃ÅgrÌ”µHõjQ•‹”õT…¥EÙ‰ÈQ G`(G}Õ¥EýŸýïû)ß Z§ü×ßÿWö=" `Ê"%GÝ'G½’»HjQþd”ˆ@Vr6ý7}[Ôˆ¿õþk»|.JŽŠFŽâ9ê¾dEªo‹*[¤ä¨7R©É!ªiQv"˜€M õ••õ=¢EqÜÖ9*NÊÊT¤ä¨.ä¨÷v)R3RÌu?Gýîÿü·Ov"r<ÈQØÊQ_uù“QrT@rÇ•ÍQÝ£Tš"5.GøÎŽkÃ(Gý(r‘:•”R¶¨³!*ÚQd'aÉQäd8¢E](Rr”õ”ÅArTGKŠTߦÅHŽÚTÀ"u¶-ÍoQmð¯éÛ=DÉQ@rÔgr”õŠÅÅs”"õ…ø$GÍ-GÅQM‹’£`ryÈQŸÉQrÔ+rGÈQ ŠTÇ/>ÉQ“)R[|(ªü5}iB”ÈQä!G}&GÉQohQüH‹êž£Úô"Õñ•‹OrÔ|Š”%Gm·€Èä(ò£>“£ä¨÷´(ÞÓ¢©Ž/[|’£–X[¤*·¨|!JŽ€ä(ò£>“£ä¨÷ä(Þ¢å¨v¦Hýø­ä(9*½UE*~ˆzТä(؈@q6Ë[T“£ä¨c„(^¢¶(RÓrTS¤ä¨u–©4-êTŽJ¢ä(ˆ@Ž 9ê39JŽ:H‹â)*H‘zÿMä(9ª‚ƒ9ªc‘Ң䨭w"–@rÔgËsgÍüíyiÓ†.–ä¨v¬H½ÿr”UD‚Õw@ú¶¨ !JŽ€ä(òµ \Û¢šµUI”b­…Ÿ¬Ú(G5EJŽZjf‘*õ'£ê´(9 –“£ÈCŽúLŽÚ…˜¤HÁÂ_ôW6G ú¶rTbsŠÔ ßÔ×±HiQrlJŽ h›À…-ªÉQ›‘)‚£Ñrä(9ê¸ E*xŽêøkúªµ(9 –“£È#à&pU‹jrÔ$EŠP䨃º‡9JŽ:et‘Šœ£´(9 ¶&G‡õ™œt¤Hu„µoŽú3¿ô«_Žß§sÔå"6GiQrìNŽ °›ÀÉ!êAŽ N7’£HŽ:®c‘£Fç¨ïj÷.%GiQrìHŽ È›ÀÉ-ªÈQäWþ;Çè¹*)Rñý½ý û—ÿÕrÔ)½ú5.G Q›F©qE*fŽêõѨÊ-JŽ€åä(òˆ¿ œ¢ä(9JŽâ9JŽ:è~¹‘£娳-J‘úµE59ªöN–“£Èc£MภõAŽ’£ä(î£ä¨³.9ª{Žº¢vŒRƒŠT¨¥EÉQÖ$¤!G‡Màgr”%Gq‡%GM#GÉQwŒ(RÛå¨#ßG‹’£`99 €r6rÔWrÔ„$)RÁÉQr# ÍQ}[”"Õz©Ëÿœ°-Ê»ØN.“£° ”£¾’£æœ#¹È9ÔÉQr#ÈQCu/R‘?uäûhQv"Š€M õ•5ç‰"ŽÈQJŽ’£AŽ-Îg¤.ÿbþš>o^;¸OŽÀ&PŽúJŽšsŽäGä"%GÉQŒ0.GhQŠÔ- ;¸OŽÀ&PŽúJŽšsŽ´Gä"%GÉQŒ GM0"G= QM‹²‘£ÈNŽÀ&0á&ð}‹š“£ø‘âØèOI!G1š5Ǹ"õзB}ТìDä(r“£° ̶ ü±EÉQA(½ÆÊ¡Hõ"GuôOþÓoùr˜`MŽšht‘ºìUaòÑ(;9 €ôä(lSm´(9*y ãXéIŠTrÔ}ß+”.õ™5S¨"u°6iQv"r‰ÉQØ–ËQ?~9jm ïXéIŠÔ}rÔGBÔÓ(uö ƒ×FIŽš,B‘ꢢµ¨¿õk¿oÇÃNÖ’£ÈÃ&°ËG£š5‹0Ð}¬ô$Eê&9ê²;EGŽê’£Ú˜"•à}½¶H¥lQM޲€Kä(ò(¾ ìÕ¢š5‹*0h¬$%Eê29ê‚Mc’%G.R½BÔÁÕä(9 “£È£ò&°c‹jrÔ,’€±Š3††ôAŽº@Ž:EŽZ¢BŽšü'£ä(;¸@Ž ²›À¾-ªÉQ³èÆ*Ô0Õ&GW¶EÅÌQ­w‘Êôîž\¤öýhÔÁ'GÙ‰ÀryÈQ]ZT“£fŒU´‘4°rÔ)•[”µ£iEªc‹šüѨãÿF9ÊN.£È£æ&°ûG£š5‹`¬fñ±M–£F)9ê‚Ñ9ª)RoÍ)Rr”%GÀSryÜŽhQMŽšE0V1dzòðæËQãŠTñ9G5Eê­ÑEªo‹:X¤&·¨&GÙ‰À%ryTÛjQMŽšE0Va‡´ì§ÌQƒŠ”umÜvÌQ5ÿˆÔå"µiŽ:ûÏ”£ìDà9 €<Æmíö¤›Ç…&GÍ!«È£Zs³æ¨EJŽº6nsrÔƒõŠu³E59jîNÄŠ€4ä(ò£ä¨½xúo¬‚lÁqÞ.GµEEJ‹Ú"G5EêµAEjD‹:R¤ä(9 ¶ G‡%GíÅ£cl« uîÕ±HiQ»ä¨Eê©EjÇumô䨙;kÒ£ÈCŽ’£ö"±«-†·Ôhڊ"¥Eí•£>¼)LŠT—"%GÉQr¼!G‡%G-ñ_~ñ<ž~áGÿãÿåÇwÊÓ/ü¥ÿû{~<^ýÐßþþÁÇ«¯½3P—ÿ±wÞøw¾öwýÚ¯üx<ýÂÿùËàÇãÍ4>U¤æKÞΛæ¨6½HiQ›æ¨÷©ûEJŽ’£ä(xCŽ 9JŽZBŽ’£:~íªÕB©"}ë’£ÚÜ"¥E¥ÌQM‘º]¤ä(9JŽ€7ä(R‘£ä¨ùä(9ªã×.ÌQM‘Z¤WŽj‹”U /™ÈQØÊQ_ÉQ§ÈQrTǯ•£.Ï.EêÔêõzV娦H­#G5Eju‘’£Šì>Œ-ÉÈQØÊQ_ÉQ§ÈQrTǯ•£îLƒûEªZŽj1ŠÔ©×ç¸öM“£š"µ´H-ÏQñüþív–Ù$#G•;G,=k_’õ%GÝ7¡HÌQ-@‘’£6ÍQ­d‘:˜£F)9JŽ€ÉQd#G¥ÌQ—“Oä×&G힣^}9jœÑEªfŽj«‹”µoŽjŠ”%GÉQp˜@6rT²u$ö¬Rr”õåûÈQC -ResT[Z¤ä¨­sTS¤V)9JŽ€ÉQd#GeÊQg[Ô’"%GÉQ_¾•5Ú¸"U9GµuEJŽ*’£©¾¶¨&GÍÚ}ØÙŒ@6³Óv"ä¨k!jI”’£ä¨/ßMŽš`P‘*ž£Ú¶eHŽZ®`Žj«‹”%GÀvä(²'¼ã}‹’£®½Ô§_(G¥ÌQ7/&Ûå¨ÿõ×~Û—cÚ[oD‘’£š"%G]¥Hu9Žÿh9JŽ€íÈQ$dOxG„u¿EM+Rw^‰$G…ú Ÿ»ä¨ïjI—ê^¤ä¨©IŽºF‘š¥Vµ¨&GÍZiØÖŒ@Bö„—ejQ7‹Ô„—!GÉQßÅÏQGBÔÌ(Õ· ÉQÔ&9êDjf‘’£ä(Ø‹@Bö„—UÈQ}¿¿%G•ÊQg[ÔvEJŽúLp’£®Q¤v,RgÿÉr”}\ Gmá5ùZTœãé?VŽ’£¾ ›£®…¨iQªW’£¾Ðœä¨k©½ŠÔ…¯eßÈQ$ä—f\#GÉQr”õJðÕÆ”$9ª)RrÔ%s”"Õ¥HÉQrìBŽ !9ê‚-ªÉQrTï’£ºä¨û-ªr‘úñeÏQM‘’£.)˜£Ú†Ÿ‘ºü/•£&¬4ìéÈGŽ ';ó|4JŽ’£ä¨§zµ¨²EêÇ×?G5EJŽºD‘ ^¤îü3å(›¸@Ž ';ÃS|4JŽ’£ä¨WöÊQ-^‘úño‘£$(9ê,¿²or‘jÇ¢Ôý¦5a™aC@>r9Ùž"GÉQr”õTßU³Hýøj7ÊQƒÈQ‰sTó©EêaD…ú GMXfØÐ@Nv†ÇiQMŽ’£^£ä¨ ä¨ÈQ¹sT«Z¤ŽW¤Æ‘£ì8à9 €œÂ>ƒîµÛü±!u<¦59JŽê>P—ÿ±rÔþ9ª…)R?¾N9JŽJŸ£š"õ“튔5zµ`7@Jr9ÉQÛµ¨/Gu|ÙO¿PŽ’£¾ •£F´¨‚EêÇ)GÉQr”"Õv+RrÔèÕ‚Ý)ÉQä$G혣ڬ"5ÿ5?ýB9JŽúNŽêNŽŠOŽª£šH°Q‘’£F¯ìæHIŽ '9jÇկ䍝ùéÊQrÔwrÔ rATÎQM‘:`Ç¿#e»!GÀArö‡r”5ü5?ýB9JŽúNŽZKŽb´â9ª)R(R¶rYÉQØ"ÊQrTë]¤‚¼à§_(GÉQßÉQkÉQŒ&G5EêEªø^ÃØ•€-¢%G ÁO¿PŽ’£¾“£Ö’£MŽzP¤~¤HUÞk[²’£°E”£bå¨Ö¯HÅyµO¿PŽ’£¾ •£Ú˜"ùÆ!G1šõA‘ú‘"Uv¯alÈJŽÀQŽ —£Z"ê¥>ýB9JŽúNŽZ+`ŽR¤’‘£>ÌQŠ”"Up¯alÈJŽÀQŽ’£†¿Ô§_(GÉQßÉQkÅÌQŠT&rÔgrÔŠTÁ½†± +9 [D9*bŽz¢Ž¿È§_(GÉQßEËQm@‘Š|㛣ö'ÃX|IDAT©4ä¨/©#©j à @Vrv‰rTÜÕΩ˜¯ðéÊQrÔwrTä"µ$G5Eª9ê;EêEªÔFÃð•€]¢:G=Ä Q7_›%G}0GµJE*xŽR¤v÷¾E•ÍQM‘:F‘*²Ñ0¶$&G`—(Gm£>Ä©Po^’õµuŽjeŠÔªÕ©~lQ•sTS¤ŽQ¤*l4Œ-‰ÉQØ%ÊQ;娀ä(9JŽJS¤æ¨V¸Hé4ÿÆâ÷ÓƒEj÷ãæ()Ró_üÉ-6–Ö$&G™%GM GÉQrÔCú"µ6GµªD*}Ž”¸ò)’£îG©EJŽ’£à9 €Ìä(9j9JŽª“£Zö"µËQAr”"¥H=ÈQr»‹V¤~79ʆ.£(ahŽr8‚÷ÎŽ?NŽŠ“£Æ©…éK‘º Ó‘‚šB)§cÕžÂØP€­£Ã‘9JõýArÔœçJKŠT„dÏQŠ”5'GµEʹXµ§0¶T G`ëèpä,R#~„-GuID§~ܸ(¥E)RPY"åD¬ÚP^*£°t8©Aß_Žšö\iZ:Û¢Æ)!J‘‚âä¨Ê» à @r6Gª"5ô!ˆ5ó¹Òè>t-D ŠR”"´cEêæ£î&Œ-EÈQØ@:×QrÔäGKCãPœ5.ÏD3ºHÌQŠD&GÜM[Š£°t8„¨£ä¨ù–õ¡û-ªc‘ª“£š" GUÛJ^Š£°t8´¨£Æå¨˜E*È£¥î}¨W‹êR¤Jµ¨ãÿdE *“£ªí# /EÈQØF:BÔQwrTÛðRq-õíCqrTÁuüîHmêx¼pFþúûÕËÇ‘ÿoå]>~üæôýãËÇú+öŸþƒ×ŽüɨËuê}R§"ì# /EÈQØF:ZÔQrÔÂGK½Qßu³H•ÍQM‘ÊKŽzEŽzCŽ*¾0¼!G`épQGÉQk-(I sTåu|î ‚"µ„õŠõ†Uyal¨CŽÀ6ÒáÐ¢Ž’£–?]J“£´¨9ã HÍ'G½"G½!GUÞD^꣰“t8„¨£†æ¨€E*æÓ¥EJŽ:>7¿¿"5™õŠõ†Uyax¨CŽÀNÒáÐ¢Žº™£Ún ûti÷¥Eûß_‘šIŽzEŽzCŽª¼‰0¼Ô!G`3épQGÉQqž.훣´¨³crÿûwÌ!tm9JŽú G•ÝA[J‘£°™t8ªG¦ãä¨PgJŽJcÂhÜi$ŽS­NŽzEŽzCŽ*»}0¼”"G`?éphQGÉQÑNÖv9jD‹ú‡ÿîwÎ9.œ #ÿÞ.Ç‘£'͉RrÔ+rÔrTÙíƒá 9 ûI‡C‹:jtŽŠV¤¶8_å¨AŸ‹’£Ž›˜4¡HÉQ¯ÈQoÈQe·†€Rä(ì'-ê¨û9ªmõ©]NYåF59ê三I£‹”õŠõ†Uvû`x(EŽÀ–Òᢎ’£"Ÿ¸šjrÔù¡“†F)9ê9ê 9ªæÆÁðP€]¥]%%G%¸,ÉQãZT“£.ž’4®HÉQ¯ÈQoÈQ6P€]¥]%%Gå¸dúhT“£®Žž’4(JÉQ¯ÈQoÈQ6P€]¥]%5!G…*RrTüF59êÆÊH#Š”õŠõ†eãÈQØUÚUÂQ]rTÛçR‰¯iZT“£ä¨`EJŽzEŽzCŽ*¸q0¶$G`cio GÉQ™. ~M߃us e¤È‰ê 9jÙ[޲e°e€Ûä(ì-í-á(9jè¥`òõ$ÇG£šÕiyEŽ’£~eË`Ë·ÉQØ[Ú[ÂQrÔˆKÁÚ ËÖŸ‹z£ä¨Ñä(9J޲e°e€ûä(ì-m/á¨99*N‘}rmÑ¢šuxä¨]ÈQr”eË`³wÈQØ^ÚaÂ!ï[Ô©Õ6ù€ÔÐë@´ËKÇÕ&¶¨&GÉQÉQr”e³`³—ÉQØaÚaÂÏ~lQrÔñë@ð‹Ì õ09ŸÈQrÔdr”%GÙ,Ø,Àrv˜v˜ðƒ#-JŽJ“£î“£N …µ#9JŽ’£llà,9 ;L›Lxç`‹’£^Ò_dæ·9JŽZBŽ’£ä(;;8EŽ .›LøÑ Õ~ÊQAŠT÷‹@úëÌ’p"GÉQ ÉQr”e›`›ÉQÔeŸ ïoQrTÛáRrÔYrÔ…‘£v'GÉQr”m‚m!GP—ßÂoŒnQ­^ŽJYUMä(9*9êÇo.G½!GÙ#@r¥ÙjÂSZTËž£æqæÌÂd"GÝÛþ—þ|âcæ»@ŽzOŽzC޲A€ ä(J³Û„ïæ´¨&GÉQÈQ—Ç6wˆZ¥ä¨7ä¨7ä(¨@Ž 4»MøbZ‹j?å¨E*~Ž r©YûÛää¨kÃ[§EmT¤~üærÔ +öÏß]޲;°A€Ûä(ª³á„3[Ôƒ•à:³ü/ÉQF¸Z‹šY¤ä¨Wä¨7ä¨"[»Š“£¨Î†æ·¨&GÉQ=ÈQgG¸f‹šV¤ä¨Wä¨7ä([¨@Ž :{NŠxŸ”–´¨þ÷õÉQ?ZÞ¢šur+·¨9EJŽzEŽzC޲5€ ä(ªó9ÈíTgšÜ¢Úµ¶KÉQïEhQMŽ:3ÎZÔ„"%G½"G½!GÙ@rø_äÔ=DuoQíLŽZ¥ä¨÷ä¨.C4'GIPÓŠ”õŠõ†eSÈQ`çIB)[Ôü"¥E½¤E59êÀP‹O3‹”õŠõ†eSÈQ`çI*#BÔÂßÑ·6JÉQ¯ÄiQÇuOM»&)9ê9ê 9*ýŽÀ¦š£÷ŸÆ–É.j¯5ç:³jšÉQ»ˆó•êü«å¨Wä¨7ä¨ÜÛ;x£Àþ“<Š´¨iEªû_‹Z¨`ŽªÙ¢–ÿÛå¨Wä¨7ä(Û¨@ŽûO’(Õ¢æ)9ê»M[T«—£*·¨µ# G½"G½!GÙ@rØ’DüÕÊ税W›UÓLŽŠ/ÂßOÚq(zýP9ê9ê 9*÷vÀä(°%ƒ‚šP¤½ñµ¨%Šä(-ê΀tù‰rÔ+rÔrT‽|£À.” ä¨h—…¡W›%slëÕjä(!*°ÈQ¯ÈQoÈQ6Pv¡d GE», úæ 瘜dpä¨Wä¨7ä(¨@Ž»P¶7¢Eu/R#ZÔè"5ú]¯EÍ”;GiQ‡èæ’£^‘£Þ£o,SàƒÃw¡ö¢Œ&G¼,ôý)k'X‚ÕRç(-ªû@Ýù)rÔ+rÔrTâ]€e*|£À^”íÉQ¯ ]~\ &G…u*DoQ§FìΣ^‘£Þ£l 9 &íEެSWŽ xMH3»Æµ¨ÉM(_ŽÒ¢ÆÛï/G½"G½!G%Þ¸êÀ9 &íE¢Ô8rTÀkBŽ©5¢E½ÏBâБoØå¸0€g‹Ñ Ãýýìy¹óÍå¨Wä¨7ä¨Äë—\ø GÀÔ©C‘AŽ xAÈ1µúæ¨AùGŽÒ¢ºŸš;ßYŽzEŽzCŽÊºøw±€Ïä(˜·#uˆRãoQ{µ¨V>G­mQÇ ¥Eu?5w¾³õŠõ†•uñïb ŸÉQ0oGêP¤Æ‘£¢]Lª^-jt’£´¨î§æÎw–£^š£†/ä(+9 n“£`ê¦Ô¡H "GE» $˜TrÔÖ9êÚIÿ÷Ÿ~9²Þî娧䨗ä(+- n“£`ê¾Ô¡H¼E=lÔ¢š£Eý˜‚ä¨û5å{…Jߥ䨧䨗ä(Ë~9 n“£`ê¾Ô¡H#G…º$˜Q÷sÔœ$GQ)£”õ”õ’eÍ/GÀmrÌÞš:©q‚·¨‡ -JŽz£’µ¨LEJŽzJŽzIŽ²æ—£à69 ìNŠÔ8Á[ÔCú%Gµ1•hÚÚ1Gza×BT¦(%G=%G½$GYðkQp›³w§Ej(9*ÈÛ?Á•0`ŽZ{\ÃdŸ‹’£Ž£^‘£Þ£ò­öí§à;9 lPŠÔhaCÔg?Õä¨O䨬9ê~‹JP¤ä¨§ä¨—ä(«}9 n“£`ÍÕ¡H¼E=dmQrT¾•&GõjQ»)9ê)9ê%9ÊR_‹€Ûä(X°Gu(RÓ„ QŸEQM‹úFŽ’£ä¨hF稚˶»?ûv‹"ß:ßÀSr¬Ù¦:©ÉV¨ï–T¨oùsFŽÊ—£ú¶¨­‹”eÙ&GYç[@Àdr,Û©:)R¾ÙÓ ‹%GÉQÑÈQ#.ãw¶e…oéÇÈQ°l³êP¤HùNO32r”%GE#G¸’ßýÙr”¾u##GÀ²ÍªC‘"ßÛ<ÓàÈQÉrÔˆµo‘’£\Ìå(·~‹F˜LŽ€•ûU‡"E¦÷x²Á¹“£ZÆ"ua 娰ä(s9Ê}ßr&“£`å–Õ¡H‘æ žo|ä(9JŽŠFŽq=¿û³å(k{kE8FŽ[VçÎ)3CLŒ'æ¨i?HŽ’£b’£F\Òïþì÷9J‘ª´°·P€÷ä(X¹q5¼;ž;kn™7sTëŠæü9JŽ’£ª]Ò;¼9ʪÞ£ÀÆÕésÖÌ “á 9JŽ’£¢‘£F\Ò;¼9ʪÞú£ÀÆÕtâÌ3á‰û9ªõkE~DúÕÆ©M§·å’.GYXÀdrØ»:‰Î™`<Ñ%Gµ¹hô÷—£ä(9ªò%½ÃK‘£,é- à9 l_DçÎ4pöŸ£ä(9*9jÄõ¼Ã«‘£¬ç­ à9 l_G§ÏpÞŸè•£Æ 9êT>Ñ¢Žœš°/[Ž z=—£,æ€ä(X¿ƒµ‰ÝýTØj§¾È õÍQí|7ômå(9ªÉQ®çr”e€…L'G€M¬Sé :éÎõÝsÔC÷ð#GÍ'ZT“£\Ïû^Òå¨Ú+yà ÉQ°~k+›ãlØ §»ÔÐ ÊQºôžæ§‘â-ªÉQ®çݯêŠTáe¼€ƒä(±µ•ÍqB lú]jôFç(>ÈQƼ‹Ê9*ú][Ž*¼Œ7Âp¶²N¨óè;¹OÈQÓ¬J#5CÔÚ1¿©lŽÚà~-GU]Ã^8NŽ€[YÚLçÔÀ¦<¿PŽšfa©Ù¢šåf-GY XÀtrØÐ:§N¥3ë„>!GM³<” QAÆüš‚9j›Û´eõüDŽ€@Z{ÚL§ÕÀ¦9§e‡QŽš&B)Õ¢šåÝUrõnxà9 íimk³žVǾGå÷…5UsÌ/(•£6»ªËQÖíÀOä(°­eÆ™uhQÛ‘£¦‘£ŒùP4çp‹{UŸ£t)ëv@Ž€hÛZ;ÛÜ'×áÁåFä¨iä¨c.GiQ'R¬ëŒ0œ%G€Í-óN®ÃƒËÈQÓÈQ Æ\ŽÒ¢)+và=9 ÂmníoÓŸ_‡µ9j9*Á˜ËQ/é×B”(•eEg„à,9 ìo™}~ZÔä¨iä¨c.Gù\”e­¼'G@Ä-®]n…SìТ‚Û%Gý¹¿ó÷ç^ÛûæÑñ¸?Œr”•òž8pÝoQŠÔÎ 9# ÈQq‹k—[ä,;´¨Èä(9JŽ:NŽÒ¢) uà=9 ‚ntp…³ìТ"“£ä(9ê89ªÖ%]޲JΓ£ èF×^·Î‰vÈQ1ÉQr”uœ¥E)R–èÀ{rÄÝîá"'Ú¡EÅ$GÉQrÔqrT¡ë¹U~Ùfà9 lw q®ZT4r”%G'GºžËQµ×lF.“£ÀŽ—çÚ¡EE#GÉQrÔq‰[ÔFwÀSgD‹R¤¶Z­d¸LŽ€Ð›^#\êt;´¨Pä(9JŽ:NŽªr=—£¬Ì€«ä(½éµï-xÆZTr”%G—¸Emqï›7uä(Ërà*9 ¢o}pµ3îТ‚£ä(9ê¸Ä-*þoêÔ‘£¬É€«ä(ˆ¾õµû­yÒÞSËÉQr”uœUåz.G^ža¸IŽ»_‚žw‡7ÔZr”%G'GU¹žËQ…Wen’£À˜Ð§Þá­´Š%GÉQÇÉQ….éZTÉ%™€ûä(Ø`ll8¼‰æ“£ä(9ê89JŽ’£,Å€÷ä(Øcl„Éä(9JŽ:NŽ’£ä(ëpà=9 öØÛ “ÉQrTÖ5bHå¨Z{Õ¢,€óä(Øf3l„™ä(9*_Ž7°r”%Ge][„@/rØ ZÔ8r”(…2ðž6ÛOÈQÉQCÉQŠ–ÇÀ{rØr-ªãô:mä¨ÑK ]–dÞ†3—»Æ¢‘£Àà 9*8-ª×ÄH¥*¯6Z’y?Zë@YrÝ¢Û¥ïÉQ‘iQ½fEš"U|ý³×ªÌB×*j’£ÀFà 9*,-ªË|H¥,~F/i¬Á¶[âZå@LrØ«Q¡ä¨i䨘9JƒqÌQ­^‘Ò¢€÷ä(Ø• ?[ ä¨™ä¨h9jòÓ±g÷uay3zJ\­YšZ\À¦ä(Ø•ÿ‚J|ú“5™*GÍô/ö$ÈQ§V8¦DÌ›u)°#9 6fÛOdâ“5Ÿ'GÍèßä(9jÀ”»`³(¶#GÀÆüGTÂRžä¨%ä¨9jÕÿË?Ý!GM˜œ¹×f–£ÀrìM‘" ÙIŽZEŽZž£Ö¶¨Ë¯Á±éŸš0‚¯Ù¬E€ÈQ°=¥Kž‘£"£šÕuü'„¨k/Ãó3RA¦Dü5›…(° 9 ¶ç?¥G¯6#GE G59ªÓÈÏz"Õk>l±l³ ¶ G@žAÇ0#GE G59ªÇ°¯JzÕe2ì²l³þâ“£ X«o•‘£"È—£.\–£nŽö¾1èÇ‚˜´Q‘Šù w_¡YygÉQ‡‡,1¢ÇÈQdÍQ§ž/ËQ7‡za‹ºóRϾ~U)r‘Šüòö]¤iQÀr¤âÑ“ Š1rT‰sÔñGÌrÔÍq^¢.¿à;ÿy)ÎôØ¢–mºH³à.£ ÿY•ɲ–Úž9ª (R\Þ€ã<¿FHM 'ÉF¿Np»EšÕ&pÙx@À4ZTVïCTš¥H Û˜#¼ðõkN›õ¾‹7KM 9 ²ñ_V™F‹ÊçHˆ ž£š"`TwØU/[|7g¶ûÓVC×o[¯3]u 9 R¤˜C‹Jæx‹ ž£š"µn0 ©é!’…Z¿YaqÈQ“çL E¥q*Dm‘£š"µb ¦I"G\¿í¸¼ô¶€”ä(ÈIŽb-*‡”-êAD™9€ÆÐT‘£Â.á¬-€ä(HËSF“£vw!Dí•£š"5eÜŒ-i‘Ê´„³ª–“£ 3ÏJŽÚZúõAS:bÆËÓFŽš¼„³žÖ’£ 3JŽÚT…E}‘ûoÛ”}^7Z̹ý~Ç_ürÄYÅ_LZO@nr$ç ãÈQÛ)¢>èFZÞhƒæö÷þôþX»Š³’V‘£ ?ÏDŽÚKåõ iQx£õÛgCÔ…(µvµf t$G@~~Ë ƒÈQ»¢>hHBÞe]¦÷u6J­Z­Y@}ÉQP‚§ Œ GmAˆúBLÒ¢ð. Ò¢")- èNŽ€ÈQun» æö̵¶H™±ÀPr”ãA½ÈQAQlw}£æÜsƒÜ”µ¨]Š”%"0”åxÜ@/rTB;^ä¨j=`ßü…ÍQ æ¡ë$T#G@Ež8Ð…µ–E±ïõAŽ*X´(EÊÊŠ“£ (ϸOŽZHˆbëëƒU3ìõWÐÖ¶¨ÜEÊj’£ .¸IŽZ‡¢Hp}£|L*rˆzØ%Gí8!]! &9 êòôaÜH™BrÔdBi®r”T\„•µH™]P–¥y1gܲÎ9j&-ŠL×9J0n»µË´4µ 29 ªó$bÚpå›åpÈQŠÔr1[Ô¾9ÊÒøLŽþ?žV4¿·ð09ªK:ò¡(‡CŽ’£Ö [¡næ¨åsÕºøL޾*þ´Â#›ãä¨Èƒjòév8ä(Ej;ñ+ÔýeaÄ!GOT~fá©Íqr”åpÈQrÔv6ªP]rTó±o 9 x¢ìs.OúN‘£*„¨¦E9ä¨`7‹€÷©?ú—íà1ùòµcyJðé( ià)9 x®`ñÏÏ’£´(‡CŽ’£šå£Qrp€¼T­ÇÈQgÉQ¹CTÓ¢rTàû…u„e%Ä!GïÔI2þ8Çr”åpÈQrT“£¢æ(k 9 øA‘$#G] Ge QM‹rÈQ›Ü2ä¨7Šÿá(k 9 øA…*³Ëó¾h䨔!ªiQ9j·»Æò;TÀ•¦E]ËQV/@@rð39ʧÆ=öÕ¢"ŸV‡CŽ’£¾£´(«eàGrpHîGrÔ5ãžü Q‘Ï©Ã!GÉQ_DËQ•?eÝ„%GG%~À!G]3îá¯àù„:r”õ…U¹EÉQÀArpBÖgrÔ5ãžÿÊQ‘ϦÃ!GÉQ_ÈQr”E œœòIÇFÏûôXŽ {9ªÉQßÈQZÀä(àœ|Ï;ä¨;=–£ÂžD‡CŽj…sÔ«‘£üÉ(€ÉQÀir”G<Ÿx,GÅ<}‡ùÆ!G}ðÑ(  9 ¸"Óƒ9ê¾îς娀'nòãþÜC”¦Êì8t‰orÔgZ”… \”æÙ‡ÕEßÇÁrT´SV³E59*ãÐ%¾qÈQŸiQV)@4rp]Ž' rT/•£Eî“å´gŽÉQrÔqãPÌe‰ìEŽ®ËñD‹êHºÈwšœPBM39*æ½)fŽj72RßïæsQMŽnÚýiˆFu'`d:AN%Ñfš%GÒ=iQ—ÉQÀ]û>Ùñ‘ßdŒ§ÆI$àd“£bÞ˜ä¨Aß¶ûnZ°-9 è`ÇÇ"û>õÛ‚˜±ûIqúˆ9ßä(9ê”qM¨Z‹’£€ûä( ½žŒlýÔo’ƾ§Ã‰#씓£Ü•B™¢šlNŽºÙåùˆ§~Ó›ž §Œ˜SNŽrWŠiBˆZ;ñœb  9 è)þSþ&“7¶; Nagå®´…Žý)¬sB€^ä( ³ÈÏJ<õ["ìSi‡EÁ7þ¾w:w%‹+Øštö‰‰ é7ZÕÈQZéWV§ÈQ@Ÿ›x𷜊£EQŠ%G‘uMp ê鉧~Ah9ZuÈQBÉVS7ÉQÀ(Až¡xöŠ¢£EáÍ.G¹|š|`9 hùcÏþÒu´(¼Óå(7#ÂÎ1ƒ "Gc-|˜âñ_Xꎅ·¹åfDÀ fð€qä(`¬"ïÝ£Ÿ³4- ïq9ÊmˆP³ËàCÉQÀp‚“ç>O)=ZÞàr”ÛA¦–ÁF“£€”'Ï}^‘|´(¼µå¨Aw·‹%k 9 ˜DòЇùä(vœ{r”û‹e’iä#GóQú0™ÅŽsOŽr‹±@2g€|ä(`*! f’£ØqîÉQn4–F& L%DÁLr;Î=9ÊíÆºÈlò‘£€Ùô'˜FŽ‚Ýo|FÏİVr£€”'˜CŽ‚ÝïzFϬ°zr£€5´(˜@Ž‚ÝoyFÏ”°zr£€e´(MŽ‚ÝïwFÏ|°zr£€•´(’MŒhÓFŽ2]ÄvŸHFÏdðÆr£€Å<Æ%Ǭ£LE³‘Éè™ Þõ@r°žg¸Îu‘cþ€ËQæ¤KÙîÓÌè™Þò@r°ž¸Î²0ˆeNºší>ÙŒž9àýä G!xzëü #ÈQæ¤ ÚîóÍè¹àx³9ÈQ@Ý:­@wr”9éš¶û¬3z®9Þì@rˆç¶N¨Ð—eNº¬í>ñŒžkŽùä G±xhëT ÉQæ¤+ÛîsÏè¹æ˜<@rŽ'¶N¢Ð‹eNº¸í>ýŒžkŽ™ä Gy\ëô ]ÈQæ¤ëÛî3Ðè¹æ˜6@r”ǵNœpŸeNº¾í> žkŽ9ä Gqybë” 7ÉQf‹ÛîóÐè¹æ˜0@rš‡¶N–pGñeʹ²%˜ŠFÏÇlr£€è<ßqš€Ë*ç(óÍe-Çl4z.8¦ ƒlÀS'H¸¦lŽ2Ù\ÓÒLH£ç‚cž9ÈQÀ<ëqj€ jæ(3Í-Óœ4z.8& ƒlÃ'E8«`Ž2Í\Í’MK£ç‚c†9ÈQÀN<÷q:€Sªå(s,Îlü¿ôÇc¹gšSµ«lDŽ6ã!W*G™`r”åÞd)–ìÇc §@8¨NŽ2»ä(9JŸ°ˆL޶äaÁŽ(’£L-9JŽ’(,?‚“£€]y$TyØ€ƒ*ä(óJŽ’£T €øä(`c åð°gVŽ2'å¨Ëä(÷#·?§à39 Ø›ÇC»uäÓ*G™“rÔer”›‘ÛŸó ð™lÏC¢}Ùì-qŽ2'ƒ“£Ü‰Üþœ\€Ïä( Šv^óv‚¬9ÊœŒOŽrrûsf>“£€$<0Úk`ÍØ9Ræ(sr r”{ÛŸÓ ð™¤âÉÑãi¢N“/G™“»£Ü}ÜþœS€Ïä( Ï‚¤):S²eNnDŽrëqûsB>“£€„“£€ü“£~Cî§Š±Õ$G±Š%{¸¡;)ŸÉQ¿)ëƒEØÊ’£XEŽR>ÜÇ€Ïä(€ÿO¾g‹ž²U&G±Š¥¿ƒ»|!G|•é £§lÅÉQ¬"GI •ïÝ®ßÉQOäxÈè)r«ÈQ*HÙ[¶·?ÀSrÀs»?gÜú)Ûˆù˜?娛Â6• UfÇ¡Ëzƒ(Bœ€]ÈQïlúœk÷§lrT„‘Lð¼ÿÓå¨|C—òÖP³…€½ÈQ?ØîW‚§lYsÔü $GÝ”8G•=²Þªåƒ°9 àg=öÊñ”Mˆê•…䨛Ä9j—›B©"bØv$G²Å“Ç4Ú$¨^eHŽºI¼‘£6º#Tè"Æ`_rÀQñŸ?¦yЦ?õêCrÔMâµéíÀ]Ø€D#Gœöd¦mÊS¯D$GÝ$ÞÈQÝ×£ €pZØ‘i´ÉN½*‘u“x#GíupÃ5ÔaÉQWhQCiN½B‘u“x#Gíu p«5ÈaÉQiQãN½Z‘u“x#Gíuýw‡5ÂaÉQ·hQ#¨M½r‘u“x#Gíuåwc5¼aÉQwiQÝIM½Š‘u“x#GíuÙw?5¶aÉQhQ}éL½¢‘u“x#GíuÍw'5ªaÉQÝhQ½ˆL½º‘u“x#Gíuµw÷4¤aÉQ=iQ](L½Ò‘u“x#Gíu©wÓԢ’£úÓ¢n’—zÕ#9ê&ñFŽÚë"ï^©E„%G ¡EÝ¡-õ HrÔMâµ×Þ-RˆKŽE‹ºLXêÕ䨛Ä9j¯Ë»›£–0–çn¨J½2’u“x#GíuawCԢ’£†óî,I©W‘’£no䨽®ên…Z@XrÀ â'õ*RrÔMâµ×%ÝPˆKŽ˜$þó¸8äĤ^EJŽºI¼‘£öºž»ñiQaÉQSy0wD…¿êÿŸœà-sÿ§«2ù†.÷•ÜýN‹KŽ˜ÍºÌQÿÕ Þ/÷º•oèr_ÆÝæ„(€°ä(€¶xTçiÝ|rTß7KBähó_-Gm=çÝÝxJŽXC‘â)Ÿ‘êøN rNå(9ªÈÛM €7ä(€•D)¾S¤z½G‚œÐš9ŠdÓØ½ €›ä(€ÅvyŠçAÞLÛý᫘o gSŽ"÷…×- €#ä(€D)¾P¤î¿5‚œJ9Ь—\·-Ž“£¢P¤ø"`‘š¥ä(Š_Þݰܰr£bñŒÏ*ç¨4UŽ"Ó•ÖM €kä(€ˆ<ïãCÍ"•i–ÊQ¤¹Æº7p™ÔFOý<ø­T‘Ê7Kå(\]ݸIŽM”â¡HŽJ9Eå(¶¾®ºÐ…Ý^EÊÁqr©ÄSTŽbÓ+ª[ÉQ{¥h©‹TÊÉy'D‰R.à ¯¥n7t'Glc»"å)á)sTʙ٫E)RůÞn4î29ÈQ›¥HV¤òM˾!J”*~ÝvsqgÈAŽØ’(UœvBŽkQŠTÍ+¶Š @rÀ®v|€èb™þ‚T¦Ù8:D‰R5/×î#n"9ÈQ{¥ J“£’ME9ŠSݽà 9 `{›)Ï/“£N™-J‘*u•vËp¿ÈAŽHB”ª#GŽÊ4ç·(EªÎõÙmÂüÈAŽÈcß"åã)r”%GÕ¹8¿;˜<iÈQÙˆR¹EkQ׊T¦‰·ªE)RE.Ëeï¦ @2r@N¢TVrT¨)·¶E)R.Èîä G¤µõ³H#_‘£ä(9ªÔÕ¸ÚÅßlÈJŽHN”JFŽŠ3Í"´(E*ýu¸Îß<ÈMŽÈo÷"å1ågr”%G•º¹Î›$éÉQUˆR9$ÈQ9fWœ¥Hå¾ü¦¿¶›EÈQµˆR øh”%Gչ𺞃P‘‡˜[“£ä(9ªÎ%7å\ˆ(HŽ(ÊÍ}ÉQr”Uçzëº @r@inîHŽ’£ä¨:WÚ4j! àÿ±k7¶rSQFé¥ê¤ê0Š‚’çëÌÌñ¾¾?ki0#Gð?ÐYÈQr”åÓê; ÀDä(~å:…y[Ô!GÉQ>ªZ›‘£8ç0:89JŽ’£|N}o˜…ÀGÒ‘MÚ¢9JŽò!¢ØŒÀï¹™kÆ5ÚCõÙï×¢Øù*Dð.9 €—¸ŸŽIŽ’£ä(ßORÆ'GðçÔÍØ¢Æyœ>þñr¾œþÍð:9 €·ùßüG3c‹:ä(9ʧÒ×€mÈQ|È¥u“æ¨ÇŸ¢Ê/—£ðy€×ÉQ”¬}uëð:Wˆzüªÿr-ŠÝ>‰þýð19 €,¥f¹ÃN×¢9JŽò ô`r·¥1Kˆzðɹë—kQøèÀ+ä(n¶C”ÿD;Q‹êÿØÜø³å(:_9x…@„(5‚)BTÿæÞ_®Eù²ù²ÀoÉQmrºüz;xˆêùÀ„~¶å;æS×ä(âs‡2Têù´ä~³åÃåÛ×ä(:qÛå©§¥ÃÖ¢<{>VpAŽ +§^:?*Ý~°åyóu€9 €¸üÒáQéüSå(ß"Ÿ#h‘£x̶‡`·à>É#?Xˆòññ倯ä(¶s”r#Ž>Oýf-ʧÆG~!G0EÊÉøöãÙ_.DùªøªÀrq8vD¾ñ‘xüÇkQ>#> ð9 €9%;+ן„Aþ„(_ _ £—³²+ó2.!Ê'Â'€ÉQŒÎ‰yç£óª%ýÉÁ€­ÈQLÃÑyÃK´¿ ^9 £˜ŒôVçi /»y¶X€À”Ü£7¹Y;Ù{µÍS Àä(ææ<½öÛáÞ[lžg G°§êUOÛÎ÷^U¯*,@Ž`)Ž×‹Ý»Ýñ½^LX€À‚²—9…»æ{û¼z°9 €e¹k/p%wÖ÷¢yÅ`rësæž÷€î¸ïòÀä(6âê=Ýa݉ß[ãe€ÈQìÈ|–³»[¿7 £Øš³øàçxº  £à;‡ò1õNÿf!  GÀOÜͪyà^rœpC—<{¦BÀ]ä(¸âªnf*ÉQð{Žìf&AÀÇä(xƒË»™©Pð.9 >áo¦B/’£ ÄuÞL…®ÉQp÷z3 8%GÀýñÍT(à9 ‚œõÍ$(@Ž€~\üÍT(ØÏÌô'Ø„“Ì$(X›£Ð ÌT(X’ÃQÌ$(X‰CSÌT(˜sÐÌT(˜”SÒ!L‚f!GÀôô “ €‘ÉQ°ÝÂô'`4r¬LÕ0ý xœ»-ê£LŽèOÌ09ªIÌ09  NÌ09ªIÌ09  NÌ09ªIÌ09  NÌ09ꊞaZ@ža›´¨CŽ29 à’†ÉQM’†ÉQu’†ÉQM’†ÉQu’†ÉQM’†ÉQu’†ÉQWT Ó¢êT Û¡Er”ÉQO6LŽj6Lލ6LŽj6Lލ6LŽj6Lލ6LŽº¢m˜P§mØò-êø8GŠ”iQwP8líuÈQ&G9j(R¦EÌ ÁX«5Zå¨_bŒ@NŒ¢ú¨†¢ÊhQäT-ª‰jû$òŒ@Nž¢W?D§Ñ¢Èé4ZÔ³ªÿ“6B9ÁFˆzJmñ!Ê@N¹Ñ¢Q=‰„#D“p„¨›Õ^¢åhQä´-êNµã“ˆ:B9QGˆºGmú!êŽ@NÝÑ¢nP[?‰Ì#D“y„¨¥j÷Ñ{´(rzµNñ$Â@Nø¢V¨c>DÒ¢È)@ZÔtuØ“HAB9)Hˆš¨ÎûMH‹ § iQ³Ô©O" QäÄ!!*WˆJ¤ES‰´¨Pÿ$r‘@N.¢¾VoøÝH‹ §iQß©÷<‰€$D„¨OÕ«>DIÒ¢È)IZÔGê…O") Qä$%!êŸê¢-iQä´%-ê?êÍO"2 QäD&!êZ½üCÔ&- €œÚ¤E](ò—þäÈéOnà/9êŠþ9ýéåä¨èOÓŸÞFŽúžþ9ýéxrÔ4úäô§óÈQ«èOÓŸ GÝD€œþ´#9êúäô§-ÈQ-èOÓŸz’£XHŽ`!9 €…ä(’£XHŽ`!9 €…ä(ú&¬’Ù¶¥IEND®B`‚visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/dne-top.png000066400000000000000000001524751147500217100244470ustar00rootroot00000000000000‰PNG  IHDRÚÚÆSd®€IDATxÚìÙ=íH…Q‚Œ€i1f€Ä|1ã)‚FÐôs™wïñ¶ëg-í”|äà;Äž€9 € 9 € 9 € 9 € 9 € 9 € 9j¿ÿëß3oŸúÛÿô›y“ÈQïø±?]Ï‹À~ìO×ób¯£òiR§àGŸö'ujrTʽýI`O÷ö'uêrÔmžìOê«z²?©SÏ£¾7NR§˜×8ýI ‘£>0KR§Ù,ýIº‹ueþ¤Nð®5ú“:õ59êìПÔ)ÒvèOêÔÏÛ=GéOêuú“:uaë¥6)RÔ©MŠÔµMs”È$JP'2‰R?cÇ¥-)RÔiKŠÔOÚ+GIJ¢u’’(õ‘r”’¤HP§$)RŸÚ"G H¢u’(õõs”n¤HP§)R_[9GÉE¢ur‘(U´lŽR‰)êT"EªnÁ%‰RÔ‰C¢Ô]VËQš"@&¤HÝh%‰RÔIA¢ÔíÉQ "@¤H%LŸ£„Q €:áG”Ê™;Gé=Šuz"5kŽ’yD)êdQêSæ(uG‘ NÝQ¤ž1YŽuD)êDQêI3å(-G‘ NËQ¤6GŽ’pD)ê$Qêä(åF‘ N¹Q¤Þ2tŽlD)êQê]ãæ(F‘ N§Q¤^7bŽ’gD)êäQjÃå(UF‘ N•Q¤Æ1PŽcL”¨cl´(5JŽÒ`L‘¨Ó`lÀ"5DŽR_L‘¨S_lÌ"õ~ŽÒ]L‘¨Ó]lØ"%G™°ÑÅä¨sŠ‹)RuŠ‹\¤ÞÌQZ‹)RuZ‹ ^¤ä(“£æ&´˜uNe1E  Ne±ñ‹Ô;9J_1E  N_±)Š”erÀ¬Ä“£Î)+¦HÔ)+6K‘z:Gi*¦HÔi*6Q‘’£LŽ˜ brÔ95Å)€:5Åæ*RÏå(Å)€:Ŧ+Rr”ÉQ3QLŽ:§ ˜"P§ ØŒEꉥ˜"P§Ø¤EJŽ29 `‰ÉQçTS¤êT›·Hes”^bŠ@^bS)9Êä(€Ñ‰%&GSJL‘¨SJlö"•ÊQ‰)Ru‰-P¤ä(“£Æ%˜uN1E  N±5ŠÔý9J1E  N±eŠ”erÀˆD“£Î)"¦HÔ)"¶R‘º3Gi!¦HÔi!¶X‘’£LŽ‹brÔ9Ä)€:ÄÖ+R÷ä(ýÃ)€:ýÖ,Rr”ÉQ£?LŽ:§|˜"P§|تEªš£4S¤ê4[¸HÉQ&G¼Oð09êœÚaŠ@Úak©ïs”ÎaŠ@ÎaË)9Êä(€7‰&GS8L‘¨S8l‡"õMŽÒ6L‘¨Ó6l“"%G™ðaÃä¨.aÃä(€:aÃä¨.aÃä(€:aÃä¨.aÃä(€:aÃä¨sª†)Ruª†íS¤ä(“£^ i˜Õ%i˜P'i˜Õ%i˜P'i˜Õ%i˜P'i˜uNÏ0E  Nϰ­Š”erÀÓÄ “£ºÄ “£êÄ “£ºÄ “£êÄ “£ºÄ “£êÄ “£Î)¦HÔ)¶[‘’£LŽx”ŒarT—Œar@ŒarT—Œar@ŒarT—Œar@ŒarÔ9 Ã)€: Ã6,Rr”ÉQÏ0LŽê0Lލ0LŽê0Lލ0LŽê0Lލ0LŽ:§^˜"P§^ØžEJŽ29 à!Ò…ÉQ]Ò…ÉQuÒ…ÉQ]Ò…ÉQuÒ…ÉQ]Ò…ÉQuÒ…ÉQçt S¤êt Û¶HÉQ&G™Gˆ N梢ŽÙ/DïÑ¢¨Ó{´¨œc#~„(ê„!*áXæB - €:H‹ºÝ±Ø‘HABuRu£c½ Ñ„´(ê4!-ê.ǪG" QÔ‰CBTݱð…¨DZu*‘Ut,$r‘@\$D}íØáBt#- €:ÝH‹úαϑHBu’õ©c« Q’´(ê”$-ê#džG") QÔIJBÔO:ö¼mI‹ N[Ò¢~Ʊó‘ˆLBu"“uíØüBÔ&- €:µI‹ºp¸_ÓŸ|ÔéO¾_“£®èOP§?mNŽú€þuúÓnä¨ïéOP§?-OŽºþuúÓzä¨ý êô§ÈQÑŸ Nš‘õý êô§)ÈQCП N“@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ÀRþñ»¿üg^F G°Ž_·(Q !G°ˆÓ¥HÀëä(VpÑ¢)x—Àôþo‹R¤àErsûÉ¥HÀ[ä(æöQŽ¥àyrû¢E)Rð09 €Y}Ý¢)x’À”Š-J‘€ÇÈQÌç–¥HÀ3ä(&sc‹¥àr“Iä(E rä(fjQŠäÈQL#Ú¢)‘£˜Ã-J‘€9 € <Ö¢D)¸týóÏøÍ¼ ¯x¾E)Rp#9 ø¯ûÓõ¼Ïx+G)Rp 9 ø·O[”"Å3^lQŠÜB޾ Q¢x½E)RP'GÀîê-J‘"d%J@‘ûº+D‰R$ŒÖ¢)øš›J´(EŠ™£)ø‚›’£Ù°-J‘€/ÈQ°£\‹R¤¨¼E)Rð)9 ¶“nQŠS´(E >"GÀvä(†5Q‹¥€±w·¾Útac—-‚àÀ‘à 5M ‚G@H›– 8B@Ô ŠyAA‚©zÿ€¦²® *ž¬#(’Ú’Ež÷ºÙ÷~ö¾öuÍÇú8ÏsGÆÞ{ÏÇšyfÏïY3ÀqrìeN‹R¤¸ c‹R¤à9 62³E)Rœ•7G)Rðš‘£+u‹R¤à59 6"GS¥HÀ rlDŽ" 2-J‘€ŸÈQ°9Šhе(9 ž’£`ó[”"ÅkõZ”OÉQ° 9Šhä(Ø„»£E‹€}ÈQpÝý/ÿ³/K䵕£ˆ£d‹’£à'rœð½?½^B­¼EZìFŽ€£Î¶¨hEJŽ"- 6$GÀ{×BTÀ(¥E±–{’£àû-*N‘’£XK‹€=ÉQð£^!*N”’£XÈÔ(Ø–ÏhQË‹”Å*ZìLŽ€çä(9Š^´(ØœOŒkQ[)‰¦Er|7ºEmR¤ $šü9 ¾’£ä(zÑ¢€&GÀsZTù"e ÑLþrü6³E.RM‹>‘£à79JŽ¢ - øLހ߶ÊQmL‘2ŠÐ¢€/ä(øm·õ DÑ—|!GÀo{æ¨Ö£H<- v&GÀorÔSr]hQ°-9 þD‹úNŽ¢- ö$GÀWZÔrÉQ°!9 ¾’£¾£èK‹€ÝÈQð„õÙë¥Hqû£à9Eê39Š´(Ø„ÏÉQŸÉQ ¢EÀä(ø‘"õAŽb9 Ê“£à EªÉQ ¦E-÷·þŸûËbŸÐ‘ï)RrhQ3}ïO¯{ €;ä(8jç"%G1‡5ÁÙ%JpŸ'\‹LŠ”Å4ZÔ8wB”(Àr\w0)˜#%G1“5B¯¥Hp3d/Rr“ÉQõ Q¢ÈQ0‰giQ÷kQŠÇÉQ0OÞ"%G±ŠuÙè%JpœS%-Rr ©MZÔwrqÈQ0[Æ"%G±–yQgÍlQŠoÉQ°@º"%G±œuÜü¥Hðškä*RrAÈQGÈQD#GÀsT"%G‡õÚª¥Hð‚Ë$*Rr¡hQ?YÛ¢)~"GÀJr\£E=%G“Àíüý/‹}ÒWŠ"%GPœ!…Z N¾£øê{z½Øc÷Å/Rra­mQÊ“Àrr¶E)R½/Rr|';)R$Gð˵%Ju¹HÉQð™Ú$GpŠÀî·(Eª‹°EJŽ‚R“ÀYrÀîz…(Qª‹ƒ9j~‘’£àAg’£¸@ŽØÚˆ¥HݳHÉQð 3ÉQ\ GlMŽŠIŽ‚˜D&E €kä(€}kQ5ŠÔÚm‰V¤ä(—ä(.“£65ºEe/R6GŽ‚8´%9 €;ä(€MÉQ×vÎä5‘£ aIŽà&9 `GsZTÒ"m‹ä(XKU’£¸OŽØÎÌ•®HÜ"9 ’”ä(º£¶#GõÚ3sÖJŽ‚Uô$- €^ä(€íÈQ÷Ì„µ’£` =IŽ #9 `;ósTíeôñ’£`>1IŽ /9 `;R®"%GÁdJ’@wrÀ^¤£tQJŽ‚™d$9 €ä(€½ˆF銔ÓhHZƒÈQ{QŒÒ)9 æÐä(Æ‘£ö"¥+RrLP&ÉhQÄ$GìE+JW¤ä(­R’‘£ˆIŽØ‹P”®HÉQ0T½£E°¡HŽº@Ž¢¤ª=F‹ 9 `;B‘uE=…{Œ@4rÀvRH)Ñæ÷Za9 F(c´(B‘£¶³sŽÊ¸ÉrŒ°CŒÑ¢ˆCŽØÎ¶9*é&ËQÐÝ&1FŽ 9 `GZT¢M–£ ¯ÝJŒ@rÀ¦´¨,›,GAG{Æ- €åä(€MÉQY¶WŽ‚^61B ÉQûÒ¢Rl¯]˜Ôq'Nœ%Gl­|‹jrT'r©iQ½ö†±À5rÀÖ䍸Û+GÁMZT—Ýb p‡°»Ú-ªMÉQÖê`RzÝ¢ä(x«{‹ªfô'†’£øCÉÕ}ëF´¨aém‹’£à5- ‚£ø¥j‹êµuC[Ô÷¶t¤EÉQð‚qÈQüI½usÓ¦µ¨Ïyé`‹’£à'Z„"GðUÉumÓúnøñÈ­E59ŠT´(ˆFŽàÔýéÈæ$mQr<¥E@@r;ҢΒ£HA‹€˜ä(6¥E"GŸaÉQìK‹:NŽ"8- "“£ØÚÐU¦E59ŠØ´(NŽ€¦E½%G–ñÉQð¯é{áu‹’£XH‹€ä(ø%x‹ZU¤Þ¶(9Š…´(HAŽ ¥ÿã_úË¥ã Þ¢æ©#-JŽb- ²£Èçs‹¥ÎþÛÑ-jf‘:Ø¢ä(–Т 9 €dž¶¨îEêš9-jNŽÒ¢ˆL‹€\ä(2yÑ¢–©i-jBŽ:Þ¢ä(æÓ¢ 9 €4Þ¶¨…Ejf‹£´("Ó¢ #9 €¶¨%QJ‹‚9´(HJŽ ‡³9jZ‘šÜ¢†æ(-ŠÈ´(ÈKŽ -jN‘Ò¢`Žî-JŽ€™ä(¢»Ü¢&)- &Т ;9 €Ðn¶¨¡QJ‹‚ ´((@Ž ®^-jP‘zÑ´(èB‹€ä(âꛣº)ó¢`(- Ê£ª{‹ê^¤b¶¨ãI‹"2- *‘£ˆhP‹ÊX¤Îí·Ã%I‹"2- Š‘£gh‹ÊU¤Îí·Ã=I‹"2- ê‘£ˆeB‹Êò©sûípUÒ¢ˆL‹€’ä(™Ó¢ºç¨6 HÛo‡Û’EdZT%GHÞÕº©s;íLaÒ¢K‹€Âä(¢Hݢ淨6&GL¦E@mr!LkQCsT»]¤Nï7-Š´(¨MŽ`½2-êCÞ×ô̧E@yr‹ÕkQZ¡EÀä(+Ù¢´(xM‹€MÈQ¬T¸E=dùd”¡È|ZoýÿÛþe±O’’£X©|ŽjŠÔéfjùiQ<õ½?½^ì1€,ä(V*ߢ‚·(EŠÉ´(ž:Û¢)€Dä(VŠÙ¢þáùŸ},½¶4x‹R¤˜F‹â»k!J”HDŽ`±È-jh”:½£·(EŠ º·(9ª€û-J‘ˆOŽ`½à-ªo‘º¸‹¦´(9Š¡´(¾è¢D)€øä(BÞ¢–)9Šì´(¾Ñ¢)€°ä(¢X›£Þ¶¨…EjZ‹’£D‹â;9 `+roQK¢”EvZßkQŠ@LrQD~Mߪ"5³EÉQŒ EñÝè¥H$GB®5§HiQd§Eñ”°!9 €õ2¶¨ EJ‹"5-Чæ´(E 9 €Åzµ¨ ŸŒš¥´(RÓ¢xjf‹R¤B‘£X©@‹T¤´(òÒ¢ø‰°-9 €•ò¾¦ot‘Ò¢HJ‹â9 `[r£¼ÍE§RSðÕ½HiQDs¤iQ¼&GlKŽ`ˆ·Ýè´§à-*]‘2JyíB7Ò¢xMŽØ–@w¦:šSua݆¶¨DEÊ(å…“œ´(æ·(E 9 €Î~ê­ -*ÅG¤ŒR~$DiQ%ÉQ;“£è©W‹‘£æ´¨î9ªõ.RF)?Ñ¢JŽØ™@7‘[TËœ£Z¿"e”òTœ¥E&GìLŽ -j\‹ú½“µ(Т˜CŽØ™@ZÔ„Õn)C”ïB…(-ª<9 `grhQsZÔ¯½-GщÅdZÀ¶ä(îÒ¢f¶¨_û\‹â6S£˜OŽØ–À-?5¢H•lQ¿w¾ÅUZKÈQÛ’£¸®o‹ê^¤j·¨_‡@‹â-Š%ä(€mÉQ\4¢Eõ-Rå[Ô¯¡Eq’Å*rÀ¶ä(®×¢:©ZԯáEq˜ÅZZÀžä(®£º©˜9êÿþþ¥óAÑ¢8@‹b9- `Cr§MhQ)&H]XŸÏ-jP”âŽòÉD‹"9 `CrçÌiQñ¿ uaMž¶(Ej­Ý"ŠEZÀnä(N˜Ö¢:æ¨6 H]X‡-J‘ZbÔê«QŠZÀVä(ŽJÚ¢‚·(Ej¦mkŠE(rÀVä(™Ù¢"ç¨ ¿ú`‹R¤æØ6¨DkQrmL‘²Wb’£xO‹šÓ¢©¡vË*û“ÅSBÀä(ÞÓ¢®å¨ -J”¤|Y‰Ÿä(^Тʓ£xC‹šß¢©Žªö•ŒýI‘â!  69 €7´¨%-J‘ê¥L\©ÑŸä(žÒ¢Ê“£x#i‹jë>Õ«E)R÷åí+%ã“ÅOô'€òä(ÞˆÙ¢Þæ¢U-ªõÎQŠÔe¹Ë&ýIŽâ)  <9 €÷¢å¨·ÝèTj Þ¢©Ë‚'–=û“ÅwfDì@Žàà-ê`^:•¯.ì¥A-J‘º ZeQžä(~¢Eì@Žà¨à-êþ+ø"·(Eê™G‹"9 `r'nQ7MhQrÔqJEÞÔ° 9 €s²·¨9jN‹’£’yä(‘£6!GpšõÙ´%G$óÈQ$¢ElBŽà -êA‹ŠFã‘£ÈEŽØ„ÀE>5³EÉQiä(®Ó¢´¨hd9ŠD´(€}ÈQܲg‹j^Ó•Ì£E‘H–õÏÿæ_û²8vgÉQÜÿ“QÝ‹”–Ò#G‘Eä7õ}ïO¯Gà-9 €‚·¨îEJ‹ŠIæÑ¢H¤L‹R¤Ž£è#x‹ê[¤ä¨˜”-ŠDæ¨k!J”8BŽØÔßù§ÿÆÇÒëgoQ‹”“Øs¼ÉQ¬ðM}÷[”"ð‚°£Ï-jh”ºðÏGç¨,EÊ(½@m:•´( •£z…(Q à9 `;O[Tß"uÙ„•â•}Fé5âSä=f|òYí¥H|'GìåE‹Z^¤æ´¨Ž9ª)RFéeúSä=f|ò™°9 `#o[ÔÂ"5­EõÍQ­w‘2JoÒŸî4Ã’/⼩o\‹R¤¾£vq°E-‰Ry[Ôƒ‡øm¿“|·I‹R¤>“£vq6GM+R3[Ôˆ¥E…¢?ÅÙ{FãOþã¿ñ¿^6ÜrÀ†ä(€-\hQsŠ”¥Eõ¥?Ù†â_Ô÷eŸ]äM}sZ”"ðAލïr‹šP¤¼¦O‹êK|Z¾ ÂoÔžEj·¥H<ÈQÅÝlQC£”¥E ?­Ú“ÆÞÙþ´g‘’£ö$GTÖ«E *RZ”5‚5mÇl­G‚Ú*Jmø¦>9 àAލ¬oŽê^¤´(-j-Š¡F$¨MŠ”°-9  ¬î-ª{‘ŠÙ¢Þ¶¢ãI‹ZEŽ¢¯ ýi“"¡E59 `9  ¦A-*]‘:»>o£ÑÙ9OZÔ*Z7-IPå£ÔžS£)€&G”4´E%*Rg×äf^:U°ŒÒ ´(Î ’ ª©mßÔ'G49  ž -*ÅG¤Î®C——ï|ÅŸQ:‡Å[1ûSÕ"µí›úä(€&G3§EuÏQ­w‘:ûÛv¦Ë-ŠU´(¾ ’—6ŒRrÀÎä(€Ròæ¨Ö¯Hý½ZTmZ-L‚º¿VyA7õ59 `9  ŽÔ-êÃäÕúå(#0&9jO‰^²·I‘’£œ•Àæä(€"¦µ¨Ñ9ªÝ(R~—µ !jy?ò´Ã4© -êA‹˜Oލ R‹zðš>ºÓ¢JÊ› îoH¢ÃgjÔƒ0Ÿ^½õ E1‚•]¢·ðMغ,GMŽræÈQéÍÌQ“‹T;¥ÎþØŽ-JŽJG‹J§pê²±ñ`¨Õä(€ä(€Ü&·¨˜EêÂÏ웣©Œ„¨à¶JP÷·=øÑ”£œÑr@nKrT¨"uá§uoQŠT^BTµßÂ7a‡„=²ÑÞÔ÷ EL&Gä¶*G½ŽR#ÂUð¥HÕ ?M¦?uß?·"`‹zТf’£²Z¢^Ô¦¡³©"·(E Ž Fï®h› GÐä(€D‚ô§×©)Îûý¾›Ð¢ä(øÎ[øæïÃ8kóM}´(€iä(€†¨/©)Ú§>›Ó¢ä(xП"ìÒ«·¨ Q*ΡIý¦¾Ïä(€^ä(ØÑ¶-*lŽŠÓ*)-ê>Å"AÝñ´EE+RƒVCŽà 9 ¶³s‹Š™£¢½(O‘Ò¢Ô‹uÇ‹íÅ}#V F‹jr@?rlGŽŠ&àw›)-JV±èOw¼mQ¡ŠT÷_]fjT“£¾ùGÿâÿôeq¾ÉQ°—Í[TÀ¡EýT€|DJ‹²X$¨ ¶¨8Eªûï•£*ùÞŸ^/®ÀOä(؈%G-@£ãœÕz©Ú ­Å"AÝt*G‰R}c™ÕöÎQgC”(¼&GÀF´¨h9*N‹ZU¤¦å¨Ö¯HÕ¾Jˆ.ýé¦ -*B‘êûëä¨ìî„(Q ø‰»¢ä¨Ë¨@‹ú E½¦ÁHPÜq¹E-/RQ¥7õµ-sT¯¥H_ÈQ°JŽJ4;jôn×¢~"ÆHPÜq³E.RArTºÃºUŽê¢D)à 9 ê“ ä¨Ë¨^‹zТ¾“.àŽ.-jh‘švvËQIkQŠð G@}”•%GÍÜùrÔgZÜѱE‹RsNðboêk{ä¨Ñ!J”ä((N [¤¢µ¨ïA(Ô÷«Ñ¢š·ÈQó‹T—_!Ge$GsÈQP™ò¹HÉQYŠTí«„7 jQ#ŠÔò•ñø–ÏQ3[”"›“£ 2Ù)r‘’£R©Ú—ˆƒ-JŽ‚Ÿ mQÝ‹Ôè3½ÞÔ¨V=GÍoQŠìLŽ€²§àEJŽºV¤U« [T35 î™Ð¢ú)9ê9JŽz‘£ &©)~”ŠŸ£Z¼"5z*•¥EÁAÓZÔÌ"uó‡×kQ­tŽZÕ¢)Ø–5‰Lñ‹TŠa=¬‰Sþ,- î˜Ü¢:)9ꬪ9jm‹R¤`Or$/)RãÞ·jÅ¢}n*5- nªš£îœø%ßÔ×ä(9 èGŽ€‚bVQê»,9ªEË¥H] EÁMKZTö•÷p—ÌQZ”"’£ šJñ¦|‘Ê•sR)Q굃-JŽ‚Ÿ¬jQñ?%G%"GKÈQPJ±lS~ŽTº£He§EÁZT“£ª¾©¯UÌQqZ”"»‘£ 9*W‘ÊXqº|çI‘ZB‹‚;¶¨™9êÚE@ŽJDŽV‘£ Žzµf‡OI%WdŽT:ZÜT£Eµ9*õq—£ä( 9 Š(ù.»å9jÂÆæ­8^Ü—ˆ7•iQm@Ž*<5ªÉQrÐEÈQŠ”"¥H=¥EÁM[µ(9ê 9JŽz‘£ ‚’-ª…ÉQ£7?GÍ9 f«45ê{…êÛ¥ä(9ª-г|>ªüù¾á'£ä¨¡´( 9 ¦*35êHˆº¥|;*Z‘’£.£8+fŽR¤zìZT.r@/rLUcjÔÙu¹HÉQrTvZׄ-R¢ÔÍ“}óu6GýŸÿÝ¿ö±¬:²ñs”d!GÀ<¦F] Q—£”%G¥¦EqYä¥H]>Ù7ÿdÔµ0JÉQ½ÈQ0O©QrTºñ G­¢Eq“"Uï|×¢Ž{Ú¢–©à9J‹‘£`-êl‘’£ä¨¤´(î ž£D©³ç»uÜ‹5¿HÉQ½ÈQ0Éò–°ü5}Š”%Ge¤EÑ‹"Ué”×¢zÛ¢&G©È9J‹r‘£`S£ä¨%£¢ãjrÔ1r)ReNù…-ª-ÍQ§Öóx‹šV¤Âæ(- HGŽ€Lºù)CŽÊB‹¢¯9jó(¥E-ÌQŠ”Ћ3˜%G­rÔLZ#(ReÎ}¯é{íB‹šP¤bæ(- ÈHŽ€á²OjrTò±!GÍ¡E1Ž"Uæ  Eýär‹¥ä(€^ä(ÎÔ(EjáØ£æÐ¢*QŽÚ9JiQ [Ô¸"0GiQ@Rr |jÔÛõ—£²^-ªÉQ?Т˜C‘*s5Т>ëÕ¢)9  9 ÆÊþš¾&Gå!rÔPƒ%ÃS¦IUº&hQ­w‹Q¤¢å(- ÈKŽ€±²OjrT‰AÒ¥E59ê-Šù©—…’9ê쾑£úF©P9J‹R“£` S£šUbœÈQƒhQ¬¢H•¹>˜¹H½nQrÀ)r T`jT“£ª •û-ªÉQ¦E±\¯D$J­½JhQa‹T¨¥EÙÉQ0J©QZTs³E59ê-Š8ºd!EjíµB‹ŠY¤LèHŽ€QjLz£j 9ª-ŠÈ.G EjíC‹ŠV¤LèKŽ€!–W„Ž-ªÉQ…†ÍÕ䨿2èQ2!J­½nhQrÔSrP€CËQ­w‘2BŽœË-ªÉQE‹¢uDðզ稳«×«E+RZTŽÛžK9J‘€ŸÈQpÚ¶S£êå(Eêôs™ä9J‹‚å䨷ⷨ‡MZÔ "%G%¸çyY›)¸@Ž€Óä¨ãD©jf2ç(- "£^ËÒ¢Ú¬uv­F´¨îQJ‹JpÃsu^”"/ÈQpšœ"5NÞ¥EArÔ ZTðÕ¥HiQ îvz´(E ¾“£à´-ªÉQïˆR#$ÍQZÄ!GýD‹Šß¢º)9*ú­N¿%JÀrœdjT“££º“£€›ä¨§´¨,-êf‘Ò¢¢ßç hQŠ|£àœ -êA‹:B‘ê(cŽÒ¢ -ê -*W‹ºS¤ä¨è÷9Ãr”"MŽ€³ä¨Œä¨^ªæ(Gf’£>Ë¢šu;GiQÑorF¶(E š§ÄyS߃uŠ"u_Éå°ÂdrÔ-*i‹’£ ÞáŒoQŠÈQpB¨Õä¨ó䨛êå(Çæ“£´¨¼-êBŽÒ¢BßÞÌjQ¢›“£à9ªÆq”£.“£€û䨦Em65J‹ }o3½E)RlKŽ€£¢½©ïA‹ºF‘ºFŽºÐ¢´¨}¦FuiQrÔ¨›E-J‘`Or°E=hQÈQ×ÈQ@;ç(-J‹Ò¢¢ÜÕ,mQŠ’£à˜S£ä¨k© ä( -*x‹j>¦EÉQ£îjä(E €­ÈQpHäÕÆ©’ÇTŽº@ŽzÙ0GiQZ”è–&F‹¥ØŠ‡ÏQmp‘ªzX©³ä( #-jŸõÓÏ<»b¶(9jÈýL°¥H° 9 ދߢš R—ÈQgÉQ@_;´¨ã!ªp‹zúÃ/¬[Š¥EE¿™ Ù¢)v GÀ{)rTS¤.‘£N‘£€¾Êç(-ªãºyMîd·(E €òä(xct‹ê˜£©SL:EŽºÓ¢´¨#¼¦·1á[”"@mr¼‘«E=(RÇÉQ§ÈQÀZT„£ EiQõoc’ä(E €ªä(x%ÝÔ¨Ï䨃©ãä(`„z9J‹ê¸n{¶(9ªÿ=Lž%JP•¯¤ÎQM‘:FŽ:NŽÆ1/j-J‹ª“°E)RÔ#GÀ+©[ÔwGÂ’"%G½ GCiQóuoQsÔÂu*GuoQrTç»—´-J‘ 9 ~”}jÔeC?=sb– RGèÈQ#ýãÿñßü²rì)iˆjZ”©QŠTÀ[—ä-J‘ 9 ~´g‹zˆ\¤FD)9êè39j€ïJ—-j-*r‹R¤úÜ·”hQŠeÈQð£sTS¤©§u䍮ބ(QŠe QM‹Ò¢©€7-…Z”"@ r<·y‹jásT÷"%Gz²#Gõs¶E)Rl+xˆjgZT]ªEeiQŠÔ­›9 ‚‘£à99ª)RŠÔ÷';rT×B”(úÓgZ”¥HE¼c)×¢ä( £à99êa«"%G½¸#Gõ GAéZT£:®ÛÂu*GMnQŠÔéÛ•$mIŽ`7r<¡E}¦HÉQ¿ŸïÈQ·ÝoQŠ¡EõmQÍÔ(9ªË½JÅyQZ5ÈQð„õÅ>EÊ©7xä¨{zµ(E –Ó¢´(9*âJÑ%GPƒOhQ_ÄÏQ½Š”õæ)u5hQÝ[T[—£N­äª%GºKÑ¢ 69 ¾25ê'Š”"%GÝÑ·E)R°Š5¢EµE9êÔjQÑïR´(ˆMŽ€¯ä¨h&)9ê9ê9 Тµ¨¶"GZ½…-JŽ:t‹¢E@xr|¥EªHí| ä¨;ä(HíxˆÒ¢.“£´¨‹÷'Zd GÀWrTL&HE G]6¢E)R05¡E=hQZÔé›- ’£àO¼©/²iEJŽú‰u™yiQÓZÔƒ¥E¸3)Ú¢ä(J’£àO´¨àLZKŽºLŽ‚¤´¨ù9ª .R§ÖD‹ }[¢E@*rü‰Ÿµu™lQG*Qöõ°y‹’£Þß“hQ¿yS_rTS¤ž‘£.“£ -jD[Šß¢Öæ(-*ú=‰ÙÈQ𛕈µ„u™¹DhQBÔ¶-ªyM_ð- ’£à79*‘ 9ª½+Rîv9ê- ²XÞ¢‚„(-J‹ z7¢E@Nrü&G%!GmX¤ä¨;ä(HA‹Ò¢´¨Ð·"Z¤%GÀoZT"rÔrÔr,÷¶'­mQqB”¥E½)Ú¢ä(6!GÀ/¦Få2'G5EêÏ䨛´(Xâ`[2)J‹ZØ¢ä¨÷7!Z$'GÀ/rT.rÔrÔMrLvj¶“IQõZÔ©•«Eý[ÿï¿÷±ìr¢E@rrü"Gå2-GµwEj«Ý.GݧEÁ4)ZT3/ꯜ-L›¿¦ïs‹Ú$JiQP€¿hQ¹ÄÉQû©;-JŽúL‹‚ÑF„(-jœk³´¨­Š”ÈQðS£Ò‘£Þê„n¶(9ê39 FӢʷ¨·ÿöÔ:ÔhQµ‹”ÈQð‡¡9*fßú;ÿþÿs9¸þ3sTKR¤õ¡û!JŽzJˆ‚A²´¨)G­:X÷¿¥EmR¤ä((@Ž€?ÈQrÔkÁsÔ JÔ+DÉQ?Ñ¢ ;-j«õôGZ‡…-êlŽ:Ø¢†©µÑK‹€ìä(H֢䨇É9ªE-RƒZQß%G½&DAGZÔ†-ꎒ-ªo. 5K‹€Ôä(£ä¨Cæ¨A¹hD‹’£^Ó¢  S£´¨S꽦¯c+Z>ëÇ›- Ò’£@Ž’£ŽŠ“££¡Ëª\Ž‚}dÉQ›O Ò¢Úºuv=¯µ¨k­h~÷ºr¤E@NrÈQrÔQA&HelQrÔkrt!GÅÏQqZT[”£Î®äu<Møï…´(HHŽ`wéZ”õ°gŽJ¢ä¨·ä(¸oD‹Q¤â´¨ùE*T‹j+rÔÙ5ìÒ¢^䢎?~‘j©¢”K449 ä(9ꔵEJ‹º@Ž‚MÈQÁsT´õ9GõmEŸsQ÷Ÿ¬HÉQp„Àîä(9ê”…9ÊÔ¨kä(Ø„9GÅlQ›´¨iËüs_‹€,ä(¶–±EÉQ«rT{W¤F=jÑ¢®’£`rTعE=hQŠ”ÈQlMŽ’£.X2AJ‹ºæu‹ŠS¤ä(¸OŽŠ™£â·¨‡ªŸŒR¤´(ˆCŽ`kr”uÁü¥E]p$DʼnRrÜ—"GEkQ£‹T–õ EeRZ'G°59JŽºff‘Ò¢.8Û¢–)9 º05*TŽÊÕ¢¼¦ïHX2MJ‹€kä(ö•´EÉQr”õÔµµ\nQmƒÕ¶)R.ªpŠÀŽä¨&Gu5¢HÉQÇÉQ@:ZÔ¶µ¨¿ø/þÞÇ2zK— - &“£ØNö%G=ÈQrÔ9 H'uŽÒ¢.KÚ¢.G©ÂEÊ`€ ä(¶#Gýúó[Žêª{‘’£Ž“£€Œ´¨ÝdoQŠ”7ÉQlGŽúõ··ÕÕ¤"Ÿ×©[T“£`WZÔ>j´¨ªEªŒRÆ3\#G°9ê×_ÝrTorÔBrQ®¥E]V©E)RÆ3\&G°—-JŽzH—£ ¼¯/ò©-Gűð©k—'›qŒ² -ª¼DÀƒ-jç"e<Àr{‘£~ÿ½-Gõ&G­•·Eµ*9*`ˆ:þp3òãQÊÓ¢j+Ù¢öü””Á 7ÉQìEŽúýǶ5@ß"%G"G­¼E½x¸9úÍWðVð¥E%½6ž]Õk9jŸ"e0À}r{‘£~ÿ¥-G Px‚Tмd‹J‘£²´¨ïÏ7ç<ä…#Ì‹ªg‡µÉ‹û fèBŽ`#5Z”õ3GµwEêôa’£Nª×¢âç¨t-jÕÓ^xK‹ªdŸU¸H}ÉQlDŽúLޤä©D§y®u¤EÏQÛ¶(G'BˆjZTÚkãÙUíÒ¢")WiˆOŽ`#rÔgrÔ rTeæEÏQ;·(Ï:J‹J-Ñu©c‹º¥îlš+6¤#G°9ê39jœbE*éù®E¦Ey¾ÉhKBTÓ¢2_O­çˆ5­H¹b@Fr‘£>“£Æéž£Úº"•ý¬¢Ú™6G©Pn2ÍÌÕ´¨Ì—ÇSë9®E.R®Û—À.Ê´(9ê!rŽj…&H•¹D¨PZ”"wtïOŸiQy¯g×stŽR¤€ïä(v!G}!G Uc‚ÔòÝø?üåßþ²d¿íÖ¢r­­Çšlnf‹’±Ë·¨ Eª‰RPÀ.ä¨/ä¨Ñºç¨6·H-Üuß+T.¥E¥Xm4ÙÍ© u¿EIGû´(E øBŽ`rÔrÔhÙ'H-ÙiGBTÒ(¥EåZ4©íB‚Ò¢jä¨É-*~‘r5€™ä(v!G}!G6"Gý:vEçEmQ‰Š”•q+<Ф˜; ê~‹¶mQrTS¤ (9 €-TjQrÔCüÕr©%;êZˆÊ¥´¨¤âi&tIPZ”u°9uÌQM‘€Šä(¶ G}'GM0.Gý:ˆ;},*iŽÒ¢òn‹G™äÕ·BÝiQŠÑ¶ŸŒºŸ£fŽ ˜CŽ` rÔwrÔCsTëW¤î¢û-*l‘Ò¢RoŽG™ä2"AiQZÔÂÕL€rä(¶ G}'GÍ1z‚Ô¯£™3Dµ~-*`‘Ò¢²o‘ç˜Ä74AÝiQr‘OF%šåJÓÈQlAŽúNŽšcNŽúuLS…¨‡ª9J‹ ËL²›“ ´(-j«©Q.æ0‡Àä¨ïä¨if©?âýé³¾-*N‘Ò¢"ó“¤&W(!jÄ%B‹ >œ\g`49 €-ÈQßÉQÓ¬ÊQñ•ÌQZTpž`rY¯/*Ýù1+Ô“k·Q¤E­½\°–@}ÅZ”õ(G5Eêõr”•‚'˜œ24á\ûuqÔsjÛ¥E­ºV“°œ@}rÔSrÔLrÔw#ZÔÚ"¥Eeá!&M‹:ÔÍjó¡5aiQF&$GPŸõ”5™õE±¥Eåâ!&oMh<©+T¢_uMr%€˜ä(ê“£ž’£&3Aê‹J9J‹ÊÈsL~24ùdOP7Ï £ëÚn<õ3 ´¨&G@QrõÉQOÉQ§ü÷ýù²œý rÔer”•”G™ü¤{þ)“ îœ;ÆÕåýyê§ÕhQMŽ€¢ä(ê“£ž’£Žø^¡ît)Eê³9J‹ÊÎÓL¾X’Žâ'¨›§Œquy¯žú9eZT“£ (9 €âêµ(9êatŽ:¢ÎF)9ê³9J‹ªÁM>¨PÝσêÎî=õ*µ¨&G@QrÅÉQ?‘£^8Û¢z©ÝNO-j-Oè.ï {¬* ªï bDÝÙϧþa±5è²lÄÀrrÅÉQ?‘£žº¢ŽG)¤>Ë›£´¨Â^o¾ýV˜uÿZað¯R¯E59 *’£(.xJdBa:EŽ:ëýwÿ›/ËòA•4GiQKü‡ÿÕ?ù²Ø{ô%AÝí†ý*%§F59 *’£(NŽêe‡u¿E,Rß+T¨.•«E QZTß+T„.åùfI*Ô…ám´/WµE59 *’£(NŽê¥|ŽêÕ¢Þ©i9êHˆZ¥²ä¨³!J‹ºïHˆZ¥<â,ÆD(ò3*Ü¢šÉQ'Gõ"Gåš u¶E-)Rñ[Ô… ¥Euq¶E)RÜ$AyˆŸNíÕwˆÆ„@eãZ”U,GõmQk'H] Qó£Tðu9DiQ7] Q«¢”geì“ ZïGüÏ;´¨ÃÕ0€µä(*“£:’£fNº³gR䨾-ªcŽºS¡´¨.r娦HUa"Tœ'ø¾ß&-ªÉQP‹@eZTGrTŠ÷õÝoQsŠTÉ¥EÝw¿E)R\£B-|ðÔkŸ5z»,Àdr•ÉQÎQ#ZÔ’÷õõjQ£‹T¨Õ¥BiQ]ôjQŠTÊQéžÝ?»Ú-GµTaxAŽ 29ª#9*þ©9ªdˆÒ¢ºH£š"•_ö•ôfYNðPvkQMŽ€*ä(*“£:’£‚稾-jP‘:›šâW¨°!ªíÝ¢).Ș£æ$¨P!J”j‹rT®ÿ¨¹@LrekQr”Õ%GµwEêÔVÄÏQ“¿õÝ>!ª%ì"5rTS¤2K”£RW¨ŽgýÎÃu·Õ}ð»âÀreåÊQwbOíå§=¶CŽ:U¤‚稅-j« õñ‘\™Õ©Ìâ·¨ì ªû)¿ópݰEõ: \ë`9 €²rM’ä¨;9jD‹êX¤f~ê³ CTÓ¢)nž£ T¨§üÎ#vÃuótp•€µä(Ê’£ä¨ã–´¨‡.EªFŽêu6íY¡’>•«—£š"•VÌU A;å7±Ûæ¨ ç…ë,'GP–%G'GËQ3[ÔÎ!ªeî%sTS¤Ò Õ¢*U¨qçûæ#vÏuädq5€hä(Ê’£ä¨ãæ¨Ö£H…ÍQsZÔæê!uù¨š£Ú¬/ýXB È89*×Nw"ËQoiQ@ reÉQrÔ)rT÷5¡E QÙgáÔ~H-5m¥›¼ç¯u–'GPÓ¸%GÉQó‹ÔÛ0G mQ*ÔgÞWþ!µÎ´I‘Š3`RŸ¶ŠÔZ™@Mr”uAê/HmÒ¢„¨/Ê|¨üj)ï@M¢òžªrTGZ–@M¹ZT“£b䨶®H½ÍQo‹Tœu°EÊQ*ÔSeZTüŒ;ãñR¤W¡î g¨ÕÄ$GP“%G]3"GÍ)RérÔÁŸ&Dý¤R‹jãvg|JŽêNŽ’£¨IŽ’£îXR¤Žä¨™EêÚ®ëØ¢T¨J>ÖßäµÎ¤HuÙOF9j- EŽ &9JŽº)ì©EjyŽŠ9/ªÞõ­êý}žYëLŠÔ‘ý”£&Ó¢€8ä( ×¢ä¨}rÔö¤.ì«h-ªêõ­ö£ü}ž\ëL›©P{#u…Ò¢ŽÐ¢€ ä( ’£ä¨îèu[ªW¤Î-ªÝËQ…/n;<Äßê¶Ô´a‘г T(9ê8- ˆ@Ž  t-ªÉQásÔ[qŠÔü RAZTù+Û&ï=ÅÞdžE*B‹Z~B9‘WIÑ¢†þ/eÑc€ ÉQ$GÉQK^œHµ‰s¤¶¨¡9j‡ËÚnîE©Mì3°—‡¨Pgów¡€-j«¥K°99 €‚ä(9jÕØ+V¤Ž¬çµÏ5mÏך]~$퉶ázûnlÌŽ+GÑT(Q €-ÉQøûVŽ’£z U¤Úí(õú‡woQíXŽÚê‚¶í'v®=Œö\Û Ï¸i73þlB-ʺE‘`CrþÊ•£ä¨Î‚|Dê‹§©iBŽ:µë„¨/6oQŸ]x í·¡že‹zm]®wZjQîÏ-¢»‘£ð·®%Gõj‚Ô £sÔÙõ—£Î>ó½ü(yÕââÿ”Ç܉Tð“Oä¤_V“£Ü™[ä(v#Gà^9JŽ¢F‘zýoã·¨ ÏÓ…(-ê-»³(0ìË„¨à§§“eórE ’’£ð×oˆ¿ e§=sT„"U5G]{¬Eæ©w ©ÿäS8u…º³!N“=ïÃ)(@ŽÀŸÁr”5JŠ"$G­mQy×üSL“J!ã)}RT–ÓÓÙ±ç¸eÈQøcXŽ’£ê•£Ú°"5ôóQÇW£WŽÚ'DiQ—‰Rñ%:R‡¨,g¨3bÏo‹Ñ@=rþ*–£ä¨÷þâ_ù¿¾,Çÿ­ RGôš¥Eqĸ/îXz…çï¸që @äûm‹@arþ<–£ä¨}¯PºTüWö•ÉQZ§hBÁ£”“·ïXuÊù6Û"G°9 'ËQrÔGBÔñ(¼HÕÈQZ×hBŠTð3W…¢ðݵE‘`+rþ`–£ä¨¯Î¶¨^Eêàêu/Rr”µ9MH‘ª7)ÊyMðûj‹À†ä(üÙ,GÉQ¿] Q£TØ"U G QÜ' )RB”™à·Ó9 €ÉQøãYŽ’£~[ž£–)9JâAR¤´¨Ëw\. n¤-r¼&Gà¯è ÊNrÔý5³HÉQŸ Qt¤ )RBÔý[,W÷Ï9 ¾£ðç´%Gý¡W‹ÊøÊ¾;9ªu*Rwr”©QŒ )R“¯eB”‡én›-r<%Gàïj9JŽúôÕâ)9JŽâ)qH‘Ú|R”Gên˜-rt$Gà¯k9JŽêÜ¢Ò}DêuŽšó¾>9аô¡hEª…ŒR“GWº{*W’Ú÷É9 Ž£ðg¶%GÍÎQ-[‘zýÛå(àˆh¹%×É8)ʳõò·Ç9 N‘£ð÷¶%G-ÈQ­ë+ûÚí"%GÉQ0"ua?¤žåñzÉ»b‹×ÈQøÃ[ŽÚ=GhQó‹”%GA ŠÔ¶!ÊCöì7ÃE n’£ð¸%G…ÎQsŠTêÕÆ)WTdÛ"yRT“£Ü[ä(LŽÀßár”µ,GµEêé?”£ä(˜i·"Y,9 >ÈQ”"GÉQ…sT¯Wö=ý'r”K.R)BTÓ¢,9 f‘£¨#õŸ‚²ÓÂÕÆ©³ëбHuÏQ>õ:GM.R.§0S½"•eRTÓ¢,9 &’£¨CŽ’£Rç¨Öï•}ó?5!GM+R®¥0_™"•(DM¸w²X,r|&GPGê¿e'9ê!ì©×¿nNŽ:R¤ä(HêrÈ)°Ô»q²XvË0ö!GP‡%G]ÎQm@‘º6z½²¯jŽ¥\EùÿØ»{]i¶®!ÏBrB@â„ É™åS !"À"d @@J‚d ""„C†KävH‚`¦7k¯Ý«Ÿêêªù3Æ˜×¥Š¾ï}ÖOU­®9êÞÕÍZBT™…“Ͷ[}±Cà 9 €:ä(9*TŽZ[¤Ò娶ºHy …„¨«&›mÃîb·ÀruÈQrÔÕj½eßäÕ¦? Õñ£¤¼xB(ZTöU“Ͷan±à 9 €:ä(9êfŽj…ŠTÆõнH=¨Pˆ•zÕd³mXYì(8CŽÀ(GÉQ‘£®©›oÙ—7Gµ1I±Ê_þ‡ÿßüÍn/@‹Ê»j²Ù6Œ+vœ!G`”£ä¨gŠTêÕ©–„(Qª!*éªÉfÛ3¨Ø{ð–€!PŽ’£^HT¤^þÃì9ª)R™-QŠTBTº%“ͶmJ±à-9 C %GýRÞ"uœ£^©ãõ¶HuÏQM‘Ê)N‹¥jТr-™l¶m Š oÉQå(9ê½ã°4´Hey@jDŽzP¤²¢©2„¨,K&› e±WàWä( r”ÕÁÚ"õò_•ÉQÍcRs]h9‘C”(3—L6ªÌ¥m«Iæ£poEŽ’£úXX¤^þ“õ"5Ú圓¥E)R0aÉdS¡j\Úv›D`9 ÷Vä(9ª›qEª@Žšü®}ŠÔy—‹N®%JÁ„%“MˆÊ~iÛs€9ä(Ü[‘£ä¨ž©29êf—R¤ºË›”)ˆ¹j²©PI/m;O"0‡€+r”ÕÙˆ"U/GM‹R^eÛ%JA“£lEsÈÂë‚ýoÉQ¸±"GÉQýu/RUsÔå.å1©ûê…E "¬šl*TêKÛž“Ì!GàÆŠ!0¥à9ªõ.RåsÔ…(¥HÝQø $Q Ö®šl*TöK›I‘£pcŘRüÕV©ãõ²Hç¨9Eê£.¥H]Sþ­ð)X¸j² Q.m&AŽÀC`J)rTëZ¤6y@jt”ò·Óf娤¿¦Ó '› åÒf€ä(ÜU1¦”%Gµ~E*EŽzè¥Ît)Eê¼BÔÍ_Ö ,N6Ê¥Í$ÝÉQ¸«bLirŽú_þã_Ú>úç]ŠT¢õ09Jy㾓6 Q÷e/³X;ÙT¨/m&èNŽÀ-C`JsrÔÏ u¹KÝ/RérÔ—iQJ‘:c·uç·öJ‹µ“M…ÚöÒf€îä(ÜR1¦4:G QŸF©msÔƒ"Áž-êæ¯ïõË'›åÒf€ûä(ÜO1¦44G}Ú¢æ©ì9êK´7îÛêgóÕ)˜»‚²©Pû\ÚJxKŽÀÍC`JƒrÔµõQ”’£|”ÔrÔýà…+(›åÒf€Ëä(ÜI1¦”7GµsEêç¿*–£¾(R3EËQÿá¯ý­.Û´]áµë(‹+\Ú&ÿ9Ä”!GP„ p7#rÔýÕ±Hýü'ÝsÔË"5?G=ø(©9âä¨^!J”‚øK)‹+v¸´ù{€·ä(Š0î¦{ŽêÕ¢z©Ÿÿû 9ª}þ€ÔqŽZ¤©¡jç(E b.¥,®ØáÒæïÞ’£(¸9jPŽjëúní÷ÕþÛ)Ü¢.©&JÁø•eµ/mþjà-9 €"L€»é›£ú¶¨“EJŽ:ÃGIu·üžÝÐ¥H5’£ 9 €"L€»‘£6ÉQM‘êmí=» -J”‚€++û“—6Ü$GP„ p7æ¨v©HÈQíó÷î;øRŠTë}Ûîü÷Ù¢)ˆ³¸²'Éu]»ö’î].à-9 €"Œ»é˜£F´¨3EJŽúˆ"ÕÑ’{vó[Ô"ÕD)è±Ä²÷HwQ»óbn€crEÿv#Gí–£Z×"Õ>ŒRõþ‚6iQЬZhÙc亜uy7À19 €"Œ»‘£6ÌQ>Jª—ÚoÓ'JÁäu—}BÆ YßWoó“£(Âø·›ãõQ‘Ú9G½,RCsÔ¿û ÿ÷Óvá‹(R]D{4ꯠHlkD‹’£`(9 €"Œ»‘£Næ¨öùRÇ9êZ‘úY¡nv)%ÕKç¢.ÿüÓŠT¥’_¼F¿\›Gà˜@Æ¿ õ*RrÔOsÔ™u-Jù(©^ò¶¨¾‹"°çekÚ µyŽÉQ1nü3†ü©·ßt‡õi‹R¤ê~·nN‹úôÛ‰Rå¯V«^œ #pLŽ à†"? õö›ÖÎQ×BÔ„(uü¥6㾇.·ê&·¨¾©"Pæ uò%wÎ ²aŽÉQÔaÜ%G=(R¡Ì B7¿u—@”˜&þ+­aŽÉQÔaÜSÌ"uæ;ÎQ÷[Ôè"u¥©›Vµ¨¾»"HŠ×XÓ£¨Ã¸'9*ZŽêÕ¢Ö©¶ýGI]¶¶E}úcˆRñeyi5ŒÀ19 €:L€ÛŠV¤N~;9ª{ŽjK‹”(Õ´¨~E ²D/ª†8&GP‡ p[½rTëQ¤Î¯ 9êe‘ºœ£ú¶¨kEªù(©EBµ¨~¤Ž?›(Бe 9 €:L€;‹ó€ÔùŸùBŽj³Êž£š"5]ÀõѶ¼HÙl6›íÎf€øä(ê0î¬ãRíj”úôgΛ£ŠTœÕº¾qŸ"ulDéù›ÿäÿüÚ¦ý„¢”Íf³iQ&DŽ Càæ–©OàÈ9ª]z@jD‹ŠS¤Ú‡QjŸ?½ç{‹ê¥)›ÍfÓ¢L"°@†ÀÍõÍQrTöÕ–©M¢Ôœ•´H5QÊf³Ù6hQ&8CŽ C #ŠÔƒ•7G=(RƒÌlQŠ”Íf³Ùb¶(“œ!GP‡!·9êfê[¤ä¨™9ª)R¿v¹ÁÌoQy?Jª‰R6›ÍV·E™Dà 9 €: ´Ï‹Ô§]JŽZ’£–<#u¥ ©›fU‹R¤l6›Íf€Œä(ê0Ò®æ¨óQJŽZ˜£²”Tœ?“û%fDÂù(Gå}ã¾&JÙl6[¹e€3ä(ê0ò0´H•ÌQ/‹Ô…Õ&©;Qja‘Š¥>m0?KL¥HÙl6›e€Dä(ê0òp'G½R?>jfŽjŸ? ?GÝìR©k!ê)ÆŒ(7—[Tê7îk¢”Íf³•Q&8IŽ C CsTë÷€TêµüýúºD©ÝŠÔÌuþ§ºÙ¢²)L"&6!G`4–r¿EÝ|@êüJjŸ·éS¤0‰@Xr†@C`#ZÔè¤B娗Eê~ŽjŸ—¤¾_-]‘ꥶmQ¢&EŽÀh¬@Žz›£ÚçHuÉQ}»‘"uÞæ-J‘À$AÈQÍDËQgŠÔV9êK—VtðÕ|”Ô-J‘ õ$bßP†€9ÐXÁüÕn? •=G].R})RÇ‚´¨¶:G-)R6›Í&NCŒ!ðEŽÀh¬@Ž‘£Ú˜¤º+üÆ}÷wŽÕ·H5QÊf³‰RCà9 s 9°9jçÕJ©›QÊÛôyLÊf³)RC 9 s 9°ˆÉ-ªÝþø¨9J‘Ú¶HÿîÑZ”"e³Ù)Œ!°„€9ÐXÄüÕî= U#GmU¤ZÎ’ZxG5f‹R¤l6›"…1æ“£0šûÛÿêý.ÑŠTß(uíöh”"e³Ù)2Î Æ*‘£0 šg;¢®E©PFÌQmäRƒŠÔåo䣤¾óh”7î³ÙlŠfXKŽÀ(hœêÓµªHù^wZT»‘£ZÈ÷ëQ¤n~#Eê;-J‘²ÙlŠfXHŽÀ(hœäZˆº¥æ´¨¶MŽj‹ŠT—o䣤¾Ó¢¼qŸÍfS¤0ƒÀ*rFA£à$rÔ“D9ªM/R¿Q®"ÕF~”Ô„Û¦y[TÇ" H™AÌ ð“€QÐ(8Ãý5ç]û>ú¥¶ÊQmb‘êþ¢©¾I}ú£z.J‘&P¤Ì fx"G`4 ׫E.RŸþ^wrÔq‹Š™£Ú”"õÑ·P¤æ<&uòËÖÈQ¢Ћ"e1€Àwr¦AÓàp«rÔÈÕÞµ¨›9êíw_•£Úø"u!Gü^ŠÔ“¾·G+µ(E èE‘2€@à‹€iÐ48Vßu­H=t©P_¾S_[š£ÚÈ"u¹EÅ)R­ëGI.R÷o‰ÖkQŠЋ"e1€Àƒ€iÐ48VœÕWɵ¶HÝlQy߸ïíW›P¤î¨Ú¢) EÊb€&G`4 Ž&G½´*GµNHµÞEªK‹òQRó£Tí¥H½(RÈQ˜MƒhQAŠÔ¸ŽÊ’£Z¿"Õ±E)R3‹Ô-J‘zQ¤ 6'G`4 T5G·¨›9êíw?nQ3sTëQ¤º·(EjZ‘Ú'G‰R@Š”ÄÀÎä(Lƒ¦ÁöÌQoÿùÂG£ZïÕn©A9êd”šP¤Z×’ŠS¤vkQŠÐ…"eú0€°-9 ¡ip 9ê¥b9ªÝ(RC[TÕ"Õ>ŒRƒþ öÌQŠpßå"¥W™> 59 ¡p 9ê¥z9ª]*RZTÞ"ÿ1©ms”"Ü÷Q‘ò•éj£0’£~:nQysT›˜—©‡µEjç¥H÷u/R¢”é‚“£0ǪעÚÈu滇ÍQ-y‘jS¢”"¥H<(R¦Ó[‘£0ÇÚíѨÍsTS¤ÎQ¤ä(€6¦H‰R¦ˆIŽÀ@h&Ë;õ=)Ÿ£Zì"•ôûÞ~5EJŽa‡r”éÃèÀ&ä(Ì„fÂá¼SßwC?8*HŽjŠÔ9eÞ¸OŽ*f~Ô„Í)RF£;£0𠇓£¾·¨û9êÌÏ?'G5EêEJ‹ eí{?ÂÎ)£‡Ñ€òä(Ì„fÂÊ´¨62Gùî‰rTS¤Î)S¤ÚNQªä õ§'"}ÉQ棵ÉQ Í„“ìТ䨟©“|””µÐµ%JA_2w=¨MŽÀXb&ìûvvU·g×ÚŽj sTS¤N[X¤¼qŸç¢ä(XNŽ2whQÔ&G`,”£´¨ÈQÏQÞ¸O‘Ò¢ºl–p“eMŽÀX(GÉQ÷N}Þ¬¯R‘º³Ç<#¥EÍÔ«E)RpÓˆ¥H™; 9 c¡%G} òGÉQŠÔK £‚ŸAÈQæ9 €òä(Œ…!&CµIŽ:óÝï·¨&GÍ*R÷w]¯õà1)9êþY¡HÁ8r”¹CŽ <9 c¡%Guܢ䨗Òå¨^EªËÞ똣š"¥EÝ>%ä(GŽ2tÈQ”'G`8”£ä¨³î´¨¶kŽj»©^{¯cŽjŠ”uï|£`9ÊÄ!GPž€áPŽ’£Î÷hTíÕ¶,R÷^ÇÕ|””uãLP¤`9ÊÄ¡EPž€áPŽ’£ÎZûN}-sŽjû}ˆTÇ]×7G=(R›·¨&GA- À|ÑÈQCLŒ²“u`DŽj™‹T»¥!rÔ—ÈEj« Ÿt¾°o¨MŽÀ¸(GÉQG 稶S‘w†ÈQßÅ,R[]õ´(ÃÄ$G`h”£ä¨_:nQÇ9ê¸EÉQmz‘ZòÆ}CO’ãÕ¥H%ÊQ-^‘Úêz§Eä,ä(Ê“£04ÊQrÔ/Å4ê~ŽjÕ‹Ô„óDŽúi~”Ò¢´(“D&G`h”£ä¨_ªýN}ßU-RsÎ9ê¥åImu¥Ó¢Lœ€¡QŽ’£~iŸÕ*©iç‰õ+KŠÔ†ìd“Ä'G`h”£ä¨_’£©öç(5ó<‘£|Z¤ô’¡{ØîØa²€˜ä( !æFÙ©XŽ:nQÞ¬o\‘ZBŽzK‘аcí.€Æ KŽÀÜ(GÉQ¯·¨;9꣣|Ž*¥ä¨3©µ»ÔîØd¬€°ä(ŒŽr”õZ„wêkSrÔò•½HÉQ')R«v¦Ý°ÉL‘ÉQå(9êµMrT•ºHÉQçù(©ù»qá‚#˜)ä(ø"G`t 1=ÊNrÔKÇ-ê~Ž Õ¢ò)9êSŠÔ´½·üü×¥3…rFG9JŽzmÐGuÌQ7Á€-*i‘’£.P¤&ì·µg¾(˜)ä(øNŽÀè(GÉQ/·¨;9ê£c\Ž Û¢2©ÑwáK樦H ÞcËO{E 0SÈQð€ÑQŽ’£^(ÿÁQÁsTº(%G]&JØQ ÏvQ 0PÈQð’€RŽ’£^¨£R´¨\EJŽºC‘껋֞ír`š£à%9 dˆRv’£^’£²)9ê&Eª×ÎY{ª+R€iB‹€_‘£0@ÊQrÔ ƒ>8JŽªZ¤ä¨û>-R›D©’-J‘Lr’£0@ÊQrÔ ƒrÔG?Ãq‹Ú*GÅ/RrT/ŠÔå½±ü<—££„ä(Œ‘r”õì¸EÉQ7GEª/9ª#EêÂ~X~’+R€9BŽ€crÆÈc¤ì”(GÿÛ,9ª)R]ÉQ}]xã¾·™'³˜#ä(¸FŽÀ)GÉQÏ6ÉQ͇Hõ#Gu'2ÍoQ3C”˜#´(v#G`Œ”£ä¨gƒÞ©/`ŽjÙŠTØ—9jµ©p‹R¤C„ÀVä(L’r”õ,ÂGµY9ª¥*Ra_^ä¨q4§Â-JŽ v/û£0L†&e§89ê¸E•ÌQ-I‘ŠüÚ2ôžûæ9ª)Ru[”˜ ì^ö!G`˜”£ä¨? òÁQmnŽz£î£F“ êµ(9 0AؽìCŽÀ0)GÉQ$G·¨A9ª.Rñ_^ä¨ „¨b-JŽ6Ÿ ì[¶"G`˜”£ä¨?ôN}}sÔÐ= E]#GÍ¡EM8]å(€øã¤#G`¤”£ä¨?Ùðƒ£~Ò¢.X•£)-ªï¹ªEÌ™ä(v#G`¤4Rò')rÔ>E*Ñ™3îÎûÛµa‘j›E©™'ª`v€ä(Œ”FJþpÜ¢¶ÊQ-@‘ÊuòŒ»ù~&GíY¤q–þêt•£ƒƒÁî£0Uš*ùÃåÕ¦ç¨9Eª-R¹Nžq÷ßOæ(EŠ.§èÁ‰ªEƒ\&G`°4Uò‡AF]ÈQíó"5®TiQ')Rd?9OQ9 05à29 ƒ¥Á’?y§¾‡rÔèǧ´¨3"ä(EŠËgæ™óS‹L ¦¸FŽÀ`i°ä¡I·—ÁTøIDATrT;]¤æ¼¡Ÿu†"EÆò£3S‹L F¸@ŽÀ`i¶äwÇ-jIŽjçŠÔ´˜Ò¢ÎP¤Èu*~zBÏQÿìïþ£§Í™ 9 ³¥Ù’ß]nQ-vŽJT¤ÊœKŠYNÂ˧b´õ³BéR€‘B‘£0^/ùÝ G£n樯HµaQªÒé¤Hÿô»™ˆ‚´¨3!J”Ì °œ€ñÒxÉï¾SßC—¿HÕ;£)"Ÿx½Qü‡¢) Ú¼`ß°'9 㥠“ß…ÍQ­_‘ ûÆ}%Ϩ¡=@‘âÎY7¢-ÿŒ(Q 0,@dr&L&¿‹œ£Zé"Uø¤R¤ˆv²ÍiEÈQ€ar‘£0dš0ùÍq‹*–£B©ò§–"EœÓL‹R¤€å“‚a€mÉQ2 ™üfP‹ê˜£ZÅ"µÉÙ¥Há«¢Z¿¥HKƓے£0g2ùMðG£ú樾Eª]ŠRûœ`ŠkO­2-ªÉQ€1r’£0gš3ùMüÕ½E-/R»cŠ«N*-J‘Œ °œ€QÓœÉo¶ÍQ«Þ¸oÃslt3P¤œQ¹ZÔˆ°$GÁgc;“£0j5yÓ¢"䨡-j~‘ÚöLS¤˜y"…mQqB”`9 Ó¦i“QFõÊQZÔÌ"µùɦH1çŠÙ¢¢…(E 0 À4r¦MÓ&¡ß©oZ‹šS¤œlM‘büÉã¡(9 0 @4r¦M'qsÔäÕ½Hµ?G)gÚEŠq§‡¢ä(ÀtÉQ˜9 œ}³¾%-jD‘â%EŠ'L´?DËQé?ÿý§-àù/ÿ¯¿ò´ùÇh;£0sš9‘£D©&tEj·³E‹Ú6Gý¬P»ÔÏ ¥Ka4€­ÈQ˜9½#ÇîŽ[ÔqŽjÃÞ¯oy‹R¤&P¤èxž„jQ‰BTöu&D-RgB”(Å£Ý Àæä(0vîîN‹jc Ò¢© )ZTºµU‹ZR¤>mQІ¨JŽ“çî¢å¨P-J‘š@‘âΉᡨ=sÔµ59J] Q¢†¨JŽï×·»›oÖ׺©€-J‘š@‘âÚ)Q㡨ißHŽ’£`áP`÷€rÔîâ䨰-J‘š@‘âÓ“!H‹šß´¨û-jB‘ºß¢)LPŒÃçO»7¾ÑEê䂚BS£©8)‡ÛCQCª¼g‹ÈKŽ€S¨A4…ÑEêí?W¤ø¢H9ÐqZTð'´¨PEjD‹R¤È>ؽð G€A”ßù)E*Ži}B‘Š”“¶¨€?göFŽS¤&G€A”?Ü,R÷sTó!RüwŠ”ã»¶E-|(ê¯þÛñµÝÿ±Ëœ3rdœì[ø"GÀŒAÔ,šE„¤Z¶"å´G‘Úù°ö:¾òÌÚwçûÞ¢.G©’ä(0@jrLGíÛ‚䨖ªH9m†R¤ö< ÷ìåt´öÝù^¶(EêAŽ‚të#|'G€q”?]¤Îÿ$ZŠÔn‡rBˆz™‘Ö>Õ[”"Õä(°þ€ää(0Žò'qz£hŠÔNqr‹º¿õÚ?o[”"ÕÆ©î?¤…Å¿õ?¼$GÀ¼‰ÔîÍâf‘ꛣZà"åT™fZŽjŠÔÒ#xç8æ Qít‹R¤ä(°ø€¼ä(˜7”Ú·YD{@ª…,R½ööÛ}µÏv¼£R)½êαËõ\Tß]ôQŽÚ9JÉQhåoñOä(0”òB´¤Z°"Õe'ëOŸža‹”ç¨îµD-ªû.ºÐ¢©°-êA‹Â²ßÊ~’£`ê\j÷fð©¦HuÙòS±g¤D©Ë+Q‹±—.·¨m‹”–ý”SçR£irTÒ"Õe÷jNŠTysBÔö-J‘ŠÙ¢´(,ûí^x"GÀÔ¹ÔhšÈè÷ë»\¤ÚÒ(uǪMŠTù(U¬E ÚK]Z”"³E=hQXóßÉQ0{:µ{³˜ó€T®"u¯êLé>DªyFêC3[Tœ£Æí¥Ž-jÏ(%GAð¿5?ü$G€é”_šó€T–"u*LŠTù"5¹Eµ‘9jÜ^Ñ¢ö|L*lˆúNˆbÏ¿Ý ?ÉQ0{:5 &2í©øEêþÎÔ–R¿e_S¤NТN—£©h-êA‹Âjhr˜Q96í©ËQJ‹R¤ò©2/…¨ŽGÄ£QŠÔCØõ…¥>lNŽ3*Gî? Õ>Œ1~H-J‘šÓ?< uçtoQ-aŽšÐ¢©˜-êA‹Â:v&GÀš1Õ¤šE—ÕÆ©6,JÝÜ~ñÔr)9êòÎï¢rå¨i-jÏ(%GAœu¾= /ÉQ°fL5©&²s‘º¹ë´¨Ž{éà+ÈQ«¬mQ-UŽšß¢v+RrÄYçÛÃð’&UÞè•£Z¶"us¿iQ}÷ÕñW˜PDF´¨ÔEjy‹jyrÔªµU‘’£À ‚“£`Ù°j^MdÃ"usiQ#v×ñÝEä¨ {{h‹zðh”"õ GA¾= ¿"G€y•÷:樖¡HÝÜ]ZÔ¸vüE†Ö9ê£<§Eµ 9jy‹Ú¤HÉQamoyä(X9²ÚÉ,,Rך•Nð"%Gµx-ª…ÏQAZÔQJŽk{NŽS+§ôÍQ1“º³—´¨›")9*Zˆú¢E)RMŽ‚«z {8&GÀâÁÕÎâmŽªQ¤îì"-ª 9*¦°-ªEÍQ1[Tá"%GÁòU½…=“£`ñàj'R¾HÝÙ9ZT/»= •â DnQZ”"%GU='GÀâÙÕîMäLŽÊ[¤îì-ª¯°EjÏ¿E=x›¾Í‹” ×óVõp†ëÇW{8‘“EêB”Z[¤î쓾?ùù=\`»¿Wwf÷‚²aŽÊÒ¢Z¤•¢EÕ‹RrXÏ@pr¬Ÿ`íÞDzņ—V©;;¤ãϼUˆ:sžìP¤"ÿ±¢–·¨/ž‹Ú¶HÉQ°p1o=gÈQ°~‚µ{s‰S¤ºD©;»B‹ŠðŒÔÛÃÔ·¦l’£2†¨/ZÔžEJŽ‚U+y‹y8IŽC,Ÿé~%ÅG1iQÒ¢¶¨/“CTËÜ¢j)9 ¬ä 89 Ḇvo:££Tð"¥E)RZTäõÝè õ½E(Rr¬ZÆ[ÉÀIr„˜cíÞŒ¶-RZ”"U5GÕkQÓÔÈQ©£”–ñœ!æX£lR)-*ì‡HeyF*쟳uY¥•·HÉQ` ÁÉQešµ{“ÚªHiQÁ‹ÔÛ#¸¼HÅü+þ(DiQO굨¤EJŽ xNŽ€(Ó¬6µ¡Q*H‘Ò¢ ¼e_P¤Ú¹(öW‹º£j‹ÊX¤ä(X²€·{à<9 ¢L³Úìâ©QJ‹ò–}g$ªPí !ê¥Ú-*]‘’£Àê‚“£À@ËoþÆ¿ø§OÛ…/RõûVµ¨’gZù"•ˆuÇ-*W‘’£`þêÝî€ÈQh¦5ÖÎ÷³BÝìR5ŠÔ§ciQÝÏûGçøÇÐ`´¨›öÉQY¢”ó—îv/|DŽ€@3­±v¦3!*f”Q¤.÷'-ê‚9Eêí±s‰Ñ¢nêØx©^ä(°n€àä(ˆ5Öšlçø´EÕ+R]ú“uY„¤Ú–E꣥EýÊnF¥(RrL^·Û½ð)9 bM¶†ÛÑ®…¨kQ*T‘êÞŸ´¨›©ù´¨^¶ÍQ‘‹”Vìœá†[óíP3sT‹T¤´¨h|ˆÔdBTG;稰EJŽ‚É+v{>%G@¸áÖ|;Îýu¡Hµ‘QJ‹JíþnQ¤NÒ¢ºS¤¢‘£`òŠÝ€OÉQ`¾ÝE¯­HµuQªã¯¼íi9§H½ý1jw-j9*9 ¬Õ 89 "ޏ¦ÜÖæ¨V®Huüew>-ƒ¼e_«[¤´¨¡ä¨8ä(˜¹V·‡à9 L¹[èÛ¢6/R}M'§"5Ž5„ÓVéêpÝ-ÉQ?JjÐo·äÀu<”½ù©V¨H}¢´¨›´¨ä(˜¶J·‡à9 ̺[ˆÖ0â© ¿×üC9J)R5ⵄµ–sÖç–èp™qÇ]{¸—˜#Z‘º¿ŸS·¨åQªË~ó€TÓ¢–Ò¢’£`ÎúÜ.“£À¸[_Øt±¶HõÝÉ5ZTü"uÿ¸×.RZÔrZÔ*rXœ@pr„zíá.‚w‹iQjܮԢÖF)Eê-*-j 9 š±ÉQ`è­/~±W¤&(Ù¢VE©ioÙ×±Heܼ*ަEÍ'Ge9'G@ôÑ×¾/E«ÈU¤>ýi“¶¨%QJ‘Ò¢jТ&“£@Ž€àä(0úÖ—¥R/R×T³H½ý"r”5…¹9'G€éw ‰úD¨(u3A•iQ󣔤„¨2´¨9ä(,È-È 89  Àöð}¹âÄÚ"Õ+AÕkQ3£”·ìÓ¢*Ñ¢&£°· €àä(È1ÛÉ7¥+“‹T÷5¢EE;1®}ý¾åíQ¤´¨ ´¨Ñä(,Å-Å 89 rŒÁöð}ŠÔͯ_¯EÝ?1î|Í^ÇèíÙ¼Hyé‹C‹JŽÂ"ÜR‚“£ Í$l'ß”ô Üú  *W‹êrzÜù:]Ž×Ûß®KŽj ‹”×½€´¨Aä(,Â- 89 Ò Ãöð}{©™ *i‹êr†\þç]ŽþñÙó)¯xaÉQ#ÈQX[„@pr¤†íá.F©AùdIR¢Zà5ó$ùè7 õ€TË¥¼ÐŧEu'GaùmÁÉQ`ÞËò´pYö uaÿ—?Oú>#õö—ê•£  -ª/9 ËoËoNŽ€L#±=ÜKÒ"Õ‚E©¡»}“ó¤ãR÷‹”W&Ó¢:’£°ð¶ü€àä(H6ÛɽÌùd ?y®um‡§>Uò¾eŸ—…“»ÎÞèK‹êBŽÂÂÛ‚“£ Ù`l÷õi!سHÍÙÏ1[ÔCð-ûä¨kì®Ñ´¨ûä(,¹-¼ 89 òÍÆvòçÃÀ&Ejè¾M×¢.úhHÉQØcsÈQ7ÉQXr[r@pr˜¹¢d”Z¾£úþéÅ9ô3:þçrÔ§Ž÷˜Ö—u‡…%·%7'G€ñ˜‹j©8»hôÚò£ßk?ÈQÓ¼mQö[wZÔerÛÛœ&dn‰¥B%¨k{fÚŸØÚC?á©ã+«œw²EÙu#hQÈQXl[l@pr’¹+E‘мOæÿe­:îrTµ({o-êSr–Ù–Ùœæd:ˆùÆ})öƪ?«%]ŽÊâB޲»Ó¢>"Ga™m™ ÁÉQ`T¦› Q*ÑNXþ×4ùpËQ)\nQvcwrÔyrØØœ¦ezÚ¶HûÅÃþÉQ%ÝlQödwZÔIrØØœ‰§esLû©qÅeæÑå?%9ªž.-ÊÎA‹zKŽÂêÚÒ‚“£ÀÌÌU£Ô„Ü2ó/èæŸÒüÕä¨a:¶(ûs-ꘅ¥µ¥5'G@î™ÙØY¥"53·Ìüó ø€ÔÛo*GнEÙ¥#hQä(¬«-ª 89 LÎŒ•7J-i-Óþpºü5ÉQe ÊQvlwZÔ¯ÈQXT[T@pr¤Ÿœ Ïñ%*Rã>é£_*KŽê¾ÇÎ|G9ª»¡-J‘êN‹zIŽÂŠÚr‚“£ÀüÌ Á‹ÔÐ •¥EEx@êÌw”£úšÐ¢©ä¨'r–Ó–Óœæg#t¡¢Ô„•®E­-R'¿Ý¸µa2™Ö¢©´¨ïä(¬¥­¥ 89 ŒÐLµ¶HÍLP×~øŒ9ªËŽ=ÿ½†æ¨­’Éä¥H E}‘£°–¶€àä((2E¤™_¤âW¨™)1:ÿ½Fç¨M’É’¥H E=ÈQXE[E@pr¤YctãÉ’ æÿ¥Œûkš³ß&䨒ÉÂ%Ju§E59 «hKhOŽ€:³´q:îéb~‚êø^‚qZÔÌ"uá[ÜÉQM‘úp'(R‰ìÜ¢š…õ³õ3„'G€qšÅî ¼ jþßÈœ¿¦¡ûpZŽªÚK‚´(Eоä(¬Ÿ-ž 89 JMԆꤖ<Õ!AÍÿ™ü§4b7ÞÌQmï"ªE)Rt$Gaålå ÁÉQ`¨&„m+Ôä?J÷sT YevÞ¼rŸ…•³•3'G€¹š@vKPóÿ:ä¨/""E%rÖÌÖÌœFkbÙ*AMþÓ¨ñ§Ô+G5EJ”¢9 kfkfNŽÓ5áìS¡&ÿ]ÈQ?)@Š5ÈQX-[-@pr° ª|‚šüG!GýФHQ€…Õ²Õ2'G€›¸ '¨ÉrÔ1H‘";9 ëdëdNŽc6Ñ•¬P-vˆÚ-G5EJ‘"¡ãÕq»ð³—§Ž›ÓÀ:Ù:²£À¤MeÔä?9ê# "E.r”e…l… ‰ÈQ`Ø&‡ jæÉ_øÏg\ŽjŠ”"E*r”eyl… ‰ÈQP|ä¶Ÿ‹É[¡fžörÔM"E r”emlm ‰ÈQ`ä†:'¼åL{KŽ¢ 9J޲N°6€Dä(¨?xÛÏlrªËQrÔIr5ÈQr”¥‚U1$"G€ÁÒŸär”õ)-Šä(9ÊjÁ’‘£Àø ¹OïÝþd䨎ä(R“£ä( ëaHDŽ€-Æo8…Ïm9JŽºC‹"©i-JŽ¢Æ‚Á~€åä(0„CÊSzÛ?9ª;-Š\f†(9Š2k»–“£À)Ïg9JŽêH‹"…ù!JŽ¢Æ²Á~€ä(0ŠC¦ÓØŸ‰5ˆEp«Z”E•ƒ] ÈQ°×@n?“úöÒ䨑´(ÂZØ¢ä(¬~€.ä(0C‚S×È9j49ŠhÖ¶(9Šì뻂£`»±Ü~&ÝI›÷OãøÿùÓvÿkÊQ_þŸø?}m}¿²EË[”Eêõƒ] qÈQ`2‡Ð§k®?ŠŸýéx»ð-䨇ï-jD”Ò¢ˆ B‹’£°èº£`ÇáÜ~&ʼnš.G}Ú¢®)9ªý¢Eå-R^Rx)H‹’£È»Š°« 9 ÌçñÝ!D]‹RrÔA‹ÊX¤¼ªðRœ%G‘t-a?@4rÑ!Öɹa‹ú¨Hç¨òEêm‹ÊU¤¼ªðR¨%G‘t-aW@4r˜Ò!Ði¹gˆú(J½ÍQ…‹ÔÉÕ½HµaQÊk ?EkQrWö3$GÀ¾ƒºYh'¤u¦Hm›£>jQ)Š”×~ Ø¢ä(,q€.ä(0«Cˆ³1Ý9¿*Gµ]‹Ô…ùû¼¶ðÓ§‰HŽ’£,*¬o 9 ¶×MìD8 3žêãZT¯¤Š©Ë-*f‘òòÂOú%GYWXÙ@"rì>´›ÛY{úõ:igžØ£[”"õäf‹ŠV¤¼¼ðÓµ8$GÉQ––µˆ»íævVxyO×9ªmó–}]ZTœ"冟.—!9J޲º°¦€Dä(0º›ÞYpÊiQŠÔ[T÷"Õ.E)/2<¹“…ä(9Êê‚‘£ÀônzgêÉ–úÙ¢¼e_÷µ¼HyáÉÍ&$GÉQÖV³ˆx39J޲.µ.€¼ä(0ù›ü#—°g‚“'W‹jß²/WŽŠY¤ä¨€†~^”%GY”Zg@^rþ ÿAH¨Àió]¢õ³H¥ËQ‹”иÕä(9ÊrÈLŽó¿[¡G£ï„ù.]ŽjQß²O‘ºIŽ h\‹jr”e- d&G€»îD?kºSå¥\-êA‘ªW¤ä¨€Æµ¨&GÉQ{/D-5 ;9 Üp# ÁQXr¸$Çrµ¨æC¤ä(9jŠq-ªÉQrÔÆKP«P(@Ž÷Ü Èqš‡¢‚I—£š"%GÉQãÉQrÔ>9Êøˆî¸fç QÑäjQ1sTKU¤âœrT@r”µI޲Æ>%G@n ÔÞíZTXYBÔEªF‹jrTHrT¨úõ9*ìúÇjj£ ÷jïs!*²D-ª~˾9ê<9* 9JŽÚ!GYiÈQPŠ[%÷¶•B–õ HhQMŽ IŽ’£Êç(+ à9 Jqƒ êÞ¢âË•£Zà·ì{ТΣ’£ä(9ÊzxIŽ€jÜ#¨·Ÿµ¨Ò娦H%oQMŽ IŽ’£jç(ë à29 r§ Ò¢²¨š£©°-ªÉQ!ÉQrTáeÉÜ!G@AE¥Ý«Ee‘1G5E*s‹jrTHr”U5GYu7ÉQP“ûv¬•KÒÕ¿e߃õ’%GÉQÀKr”å®Aê]ªE¥“7Gµ®Ej\ÄÒ¢~’£’£ä¨’9ÊÚ¸OŽ€²Ü8ȾKµ¨\Êç¨3yiô“UZÔ9* 9JŽª—£¬=€.ä(¨Ìíƒ;ûjí΢ÒI£Z"5ç½þ´¨ï䨀ä¨ã>$G¥ËQ–@/rç&B=£E•—=Gµ{oÙ7óÓ§ä¨/rT@r”%GY/ÉQPœ›Ë÷‰µ‰9ª]-R½Þëï<9êAŽ HŽ’£*å(‹ #9 ês+aծТ¶²OŽz K'ÿI÷"ÕG©g%G•ÉQ!@_rÔ§j¬ÚBÔVjä¨öa‘ú¨Eå*R)Î:9* 9JŽ’£,E€—ä(ØÂæyCmrh‚29ª}ò–}rT–7îKqÖÉQÉQrTe)t'GÀ.¶½­ 6¹û3G¥Õnt¦¯Ú”½H¥8ë䨀ä(9ª@޲F£`¦µÉÝŸ™ä¨bÏH¥8ë䨀ä(9*{޲‘£`#»ÁÉ­Ÿ™Šå¨¶}‘JqÖÉQÉQr”eM¼$GÀ^ö¹Å 9¹õ3Y½Õ©Ö/J¥8ë䨀䨎}h‰ûd¡Ä$GÀ^6)‚S–@ÿæÿ_Ÿ¶¼\%sTÛ¸H¥8ë䨀ä(9Ê*Q‹^’£`;;”µ)ìm ŸýéxKô—%G{ã¾g%GYÊQÀKrì¨ö)æm OCTº(U5Gµ]‹TгNŽ HŽ’£¬ µ(à%9 6Uõ¦ƒÈð Ü Q‰¢TáÕ*©ö®W¥x%—£’£ä(ËB- xIŽ€}•¼õ 2E;"½ZTü"%G%*Rÿ/9JŽºIŽ’£,µ(à%9 öU¯(L¡nõ Qñ£”7ë [¤ÚŸËÓËÿ£%Gõ"GÉQVƒrð’[+vBdŠs3h\‹ [¤ªæ¨%-jD‘úIŽ’£F£’æ¨ã UµKiQÀLrì®Ì…)ÈÍ Ñ!*l”’£ÒE)9JŽAŽJ—£> Qe¢”L&GMŽÒ¢:’£*å¨å-jh‘’£ä¨ä¨D9êNˆ*¥´(`29 øM[:Ón-*Z‘ª—£‚´¨qEJŽ’£F£²ä¨^-*i‘òh0Ÿü¦À] ©iêHËQ¡ZÔ "%GÉQ#ÈQñsTß•1JiQÀrð»ì÷&Ô¦åw‚ä¨29*`‹Q¤ä(9j9*xŽ×¢²)- XEŽþ÷…Ú´í£QqŠT™¶Eu/Rr”5‚6GQ)¢TÕÿ HAŽþDŽÒ¢.XÛ¢‚)9*]”’£ä¨ä(9JŽÒ¢€—ä(àO’Þ§œö|›>9ª»-ªW‘’£ä¨䨘9jf‹ [¤´(`-9 x–ñn…æ´y‹ŠP¤ä¨tEJŽ’£F£æ¨ù-*`‘Ò¢€åä(à…t÷,d§…w‚ä¨9*]‘’£ä¨ä(9*`Žò‘Q@rðBºÛÊ“µ¼HÉQ銔%G GEËQ«ZTœ"¥EAÈQÀkr”u†õ¥FŽj;)9JŽAŽ •£Ö¶¨EJ‹⣀_ÊrÿByZx'HŽúR&GµmŠ”%G GÉQ›ç(ëgàWä(àHü»ÊÓÚ;ArÔ—J9ªíñ!Rr”5‚'GEhQk‹”„"GG‚×åiù 9êK±Õ²© ¿`ßu!®mo¿©%GÉQÞ¦ˆFŽÞ{;CyÒ¢B©z9ª¥*R~;9JŽAŽ ’£â´¨%EJ‹’£€÷ÞÔPž"Ü’£¾+™£Z’"uíW“£ä¨ä(9jyŽÒ¢€˜ä(à”P÷5”'9JŽšLŽzKŽ’£Îœ 7¿¸uÞ¶9J‹Â’£€³‚ÜÝâÜ ’£¾«£Zà"uù7*£È1 bÏ¥E‘ÉQÀYîqÈN¡îÉQß•ÏQ-d‘ºóëÈQŒà˜±aŽÚm¤#GX{›CvŠvHŽún‡Õ‚©›¿‹ÅŽiÑZÔœ"¥EÁÉQÀgVÝìbÞÒ¢¾l’£Z˜"uÿ‘£Á1`Ã¥EñÉQÀÇD -ê‹õeŸÕ©.¿…ÅŽi»å(- HAŽ®‚ä¨9êËV9êAŽúNŽâÌ™`ÿ̱UŽÒ¢€,ä(à )H‹z£¾l˜£Ú¢"Õ뇗£Á1`Ÿµù"ÈEŽ.„´¨&G}³gŽjÓ‹TÇŸ\ŽbÇ4‚Mr”E‹\' ¹ Ô"©µûaÛÕ&©¾?¶ÅŽiÒ¢€hä(àqÈm 9êaçÕ¦©î?³ÅŽiÒ¢€hä(à.‰Èm -ªmŸ£Úà"5â–£Á1 ¢v޲2’£€»T"w‚ä¨&Gýwr”µ9Ç4ˆÂ9Ê HJŽ:Ø*iQ/mÞ¢šõMŠÕä(ÆpLƒ¨š£,B€¼ä( ­žLrè¥[T“£þ,~‹jrc8¦qhQZŠt³Û;ã¹ ôDŽ’£¾ Þ¢šÅŽir”„"G=íö™Ln=Ù¶E59ê•È-ªÉQŒá˜†¢EiQ@rÐÙ>-jÂï›ñسE59궨&G1†cJ™¥EÈQ@g[µ¨Ñ¿rÆ@Ž’£~’£ä¨}8¦ÑhQZ„ô·U‹÷+'=ú†¨9êX´Õä(ÆpLÒ¢´( 9 b«5â·NzÜ·mQMŽ:!T‹jr”€‘‘£PÞ¥E•ÈQÀ(»µ¨Ž¿uÒ#¾mˆz£ÎˆÓ¢Zž¥aäâPƤEÉQÀrr0Ðn-ªËoôXoÞ¢šuZÕRå(#Ç1,-J‹Ö’£€±vkQ7ë¤Gyóõ G¡Eµl9JÌÈ +QŽÒ¢€’ä(`¸ÝZÔåß:ï!Ö¢šõ¹µ-ªåÌQzF|_pž‹Ò¢€Uä(`†ÝZÔµ_<éÁõ6}rT:Is”ªœŸ¥EKÈQÀ {¶¨~÷¤GvB‹ÊR¤ä¨tRç(a#,G-‹h!ªiQ@ur0ɶ9êÌïžô˜NkQ)¢”•Nö¥mÄä%¢EÉQÀLr0"¥E.RrT:r”ƒ•ÎòÕ´(`r0ÕÎ7\´¨ÚEJŽJ§LŽ9Bq¤’Ú0DiQÀdr0Ûæ·]jÜZ›£b)9*J9JçˆÃaªa\ ²"Ò¢€ùä(`7_R[Þ¢b)9*b9JíÂ"þZÈrXBŽÖp &© -*`”’£Ò難Q¤Òqt¾ ²V‘£€e܈I'Z‹ U¤ä¨tRä¨E*‡†Èë« `!9 Xɽ˜Db¶¨8EJŽJ'QŽj“ÊÃA!ìÊÇúXKŽsG&…È-*H‘’£ÒÉ•£š"•„#BÌ5•°œ,æ¾L ñsÔò"%G¥“.G=(RÁ9Ä\ðXóËÉQÀzîΗ¢E-RrT:IsTó˜Tl—:V;@r‚{4aåjQ ‹”•NÞÕ<#•öÐØ?9Ö9À¶ä( wjÊØ¢V)9*Ô9êA‘JwPìË+`[rˆû5¡ämQKŠ”•ÎVOG…ÝêWCßÿ?ÿ¼›…µ °99 ˆÅ]› ²·¨ùEJŽJGŽ’£æš›_\޲¤±°ò’£€pܸ‰ FŽšY¤ä¨tä(9jþ¡¹ùÅå(‹K /9 ˆÈœµÊ´¨™QJŽJGŽ’£æš›_\޲Œ±’ò’£€ ÜÇY¥^‹šS¤ä¨tä(9jþq¹ùõå( k /9 ˆËÝœùª¶¨ EJŽJGŽ’£æ”›ßB޲t±zò’£€ÐÜÓ™©v‹]¤ä¨tä(9jþ¹ù]ä(‹‹ /9 ˆÎÍ9vhQC‹”•Ž%GÍ?7¿‘e­b¹ä%G ¸Ë3Á>9jP‘’£Ò‘£ä¨ÉÇâþ÷’£¬R´( /9 ÈÁ½ž¡¶jQr}sÔñW»¶|;9*ˆÉ¿¬e}¢EyÉQ@îø ²[‹’£x£ä¨›æÿ¦r”•‰ä%G™¸ïÓ݆-JŽâAŽ’£îXòkÊQÖ$Z—$ãîOGZTGrT:r”uÙªßQ޲Ñ¢€¼ä( Ÿ÷€ ÜÚ³EÉQ|‘£ä¨kþ‚r”uˆä%G))R÷iQ}ÉQéÜ©A¾šU#G­ýíä(+- ÈKŽR ’£òÞÒ¢º“£Ò¹„.|59*{ŽZþ«ÉQ–Z—d¥H]¦E G¥s¿ ]øjrTÞá÷’£¬:¼tyÉQ@bŠÔZÔ rT:]²Ð…¯&GeÌQA~)9jóõ†×m 59 ÈM‘úˆ5Ž•QÇ"%GÎQq~#9j畆Wl ;9 HO‘:iÏ%Gq WjrTÝêב£¶]cx¹ £€"D©·F'Ÿ[T“£ÒêՇ䨒9*Úï"Gí¹´ðB Ô Gu(R<5š•W—D$Gm¾Í9Wå(+ €¼ä( ÷~E‹MŽJmDL’£´¨îä(k €¼ä( w‘^Ò¢F“£²“£lñßoP޲ŠÈKŽ r/é'-j49ª9Êü³¯ä¨MÖ^€’ä( ¦8E*Î}%9j(9ª9ʶE59jeƒ×a *9 (K‘úI‹GŽ*C޲ÅlQMŽÚ`Áà(LŽŠsé‰5ˆU‰e Ø¢še™ÔçNÓ-j9ª9Ê­E59Ê  39 Ø‚7î{¢Eu'GÕ#GÙBµ¨&GYd&G»pãé'-ª#9ª$9Ê$D=ÈQ–yÉQÀFÜ~úIŽêEŽ*LŽªÝx‘£,ò’£€í¸ õD‹êBŽÚœ%GM GUZhQÀnä(`GîF=Ѣ6'GÉQÈQ.ýyÉQÀ¦Ü–z¢EÝ$GmNŽ’£&£\ôò’£€}¹9õD‹ºCŽÚœ%GM G¹Üä%G[s‹ê'-ê9jsr”5•ú*¯E›“£D©grÔwr”"U€%GM G彸kQrÀoܱz¢E}êfŽR¤²“£ä¨ 䨌×t- àAŽøûVO´¨ÜÏQŠTjr”5•îj®E|‘£þàÖ-ê¼.9J‘ÊKŽ’£&£\Çò’£þĬŸ´¨3zå(E*)9JŽš@ŽJtùÖ¢žÈQÏÜÒúI‹z«cŽR¤2’£ä¨ ä(n€¼ä(€ÜØúIŽ:Ö7G)RéÈQrÔr”K6@^rÀ/¹½õD‹:¦HñÒåæt@ŽÚ“ÿJ­EüŠpÄ}®'ZÔî9J‘ªAŽ’£z‘£\ ò’£ÞpÃë'-êW)~’£ä¨^ä(—f€¼ä(€÷ÜöúI‹úEŠ'r”Õ‹å¢ —pJÀ›_µß¸/ï©2"G)R©ÉQrT/rTÓ¢Ò’£>à.Ø9ê%EŠïä(9ª—Ís”K0@jrÀg<&õD‹zI‘â‹%Gõ²sŽråÈNŽø˜"õ“õ“"Ń%Gõ²gŽrͨAޏÂݱŸ´¨Ÿ)š%Gõ³[ŽŠy©Õ¢®‘£®s›ì‰õ“"…%Gõ²UŽr…(FޏÅý²'ZÔOŠÔæä(9ª—Mr”‡¢J’£îrãì‰õ“"µ³9 \Rµ(€\ä(€ÂÞ>Ë¥v8I©mÉQàJ €ÐûhO´¨'ŠÔžä(p@ŽèÉÜýD‹z¢HmHŽ×Mä(€ÎÜY{¢E=Q¤v#GAºË¥ÐП[lO´¨'ŠÔVä(Èu¡ttF£Fq¯í‰õ"µ9 ²\µ(€qä(€Ütã€"µ 9 R\€¡ä(€±‚)7àÖR¤v GAóßglOŽ˜Ám8~E‘*OŽAä(€I<&ů(Rµç(E ×>>€ÈQS¹1ÇKŠTarÔõ÷þ·ý´91\ï\ò¶"GÌæ/)RU½ÍQ%‹ÔÏþt¼9O\é\éj“£ˆŸÎ­º%©ª¶*RŸ†(QÊÎ`rÀ2îÙñ“"UÒ&9êNˆ¥\×\Ôj“£VJQ¤Ü¿›L‘*©|‘êÕ¢)—3×2€’ä(€Å²)7òfR¤Jº\¤‚‡«¾!J”rs (IŽÁí<ž(RõœÏQgþ—AêÔ¸¥H¹x¹xT"GDá1)ž(Rõ|Ú™"G©Ñ!J”rÍrÁ¨DŽˆE”â;Eªž¡Ejf”’£\§\§8OŽÇ>¾S¤Š£æ©™-J‘ryry(@Žˆ(Ñ-?wý&P¤úî½å?Ò„"54JÍoQŠ” “«@vr@\¢_©qûjÉ™ºHÉQ.F®D|JŽ-W‘r+p(Ejè.šü£ÎÉQ#¢Ôª¥H¹¹ú¤&G$ Hñ HÞ3Ó~à¤9jm‹R¤\w\wò’£rð˜ŠÔè}2ážÙ¢ú)9Ê寵€kä(€LD)š"5~W Ýó[T¯"¡E)R.1.1IÉQù¸cˆ"ÕF¶¨¡{CŽ’£\V\V6$G¤”îÖ¡»‡Ýí\¤F‡¨q;dU‹º_¤â´(EÊÕÄQÈHŽHÌmÄÍm[¤’樵-êf‘’£\A\A¸CŽÈ-ãýD·;Ú°HÍlQ}÷†%G¹p¸jlKލ@”ÚÙVEj~‹êµ7"´¨;EJŽr±p±à9  ˆ¤7ÝgìbŸ"%GÉQrÔV×  9  Qj[;©U-êþ®ˆÓ¢®©h-J‘r] 9   7÷T»H­mQ7w…%G¹¸lNލ)ï]H7"ï(\¤ä(9JŽr /9  2w$7!ÛÞ®9JŽò²ïe`sr@q©oMº;yh$GÉQ^í½Ôа…ìQÊÍÊOéFqŠT´u¡HÉQ^á½¼p“°Qj+º‘Uø)à5^ÕAþ {÷z#;Ea”Càd@0„c„].3.Óíãm×c-í†v!O`rÀrD©uHGr”å%÷’Ð9 `Qœ2]3ß¡ÉQr”§ÛÓ Àãä(€¥¹l®@@’£ä(ϵç€gÉQ«›ãÄéÊyLCz°HÉQr”'Ú €Àß\<§§!ù¤N·¨-ʳìeà49 €9}ÎMF’£ä(O±×€GÈQ|å :1%IŽ:£¶>Š”·× Àˆä(v8‰NLL’£Nÿxä(O®‡€sä(šÜFg¥'ÉQ§iQÞX-'ÈQü§Ò)IJ·µ¨—9ZÔ‹å]õºð)9 €ÿçl:%aIŽ:GŽòœzQø”À»\Qç£-Ý–£¶>ŠÔU¿-Êûé à#rŸqTŒ¼$G£Ey3à}rgÌz`]öÌ*2Ý£¶§‹Ôµ¿9Ê# ï“£8oî{ëj'W)Ý¢^æhQ?Q^Ex‡@Õôç×¥.°‚“õ)-j…7Pˆ HŽà®±¤ÍÑ¢^fjQ?,¢y÷<}\BŽà2.³äÌ”£¶{‹ÔmÿŒiQëT(Ï’£¸˜C-!Ó´¨mÒõ"Dyßà;9 €G[æhQ?L¢~&DyÓàgrAn¸\k²µ%‹TWÿàüß¡7ßôCŽ`f®Ûîæø¦|Pð89 €%8v»§ã«ñáÀSä(–ãüíÔŽï§w’£X—ƒ¸+¼_¾ùýÀ ä(pw£÷«6?o’£àŽæNù~¨æ§ r|åŒîúï‡g*\HŽ€}®ê¢‚‰ Qp 9 ޏ°›™ Er¼ÅÍÝÌ„(8GŽ€Ï8Á›™—>"GÀI.òfð9 ªœéÍT(à€Wr»7ÓŸ€/ä(ˆpÓ7“ €9 îàÜo¦BÀ²ä(¸›`¦BÀRä(xŒ*`¦BÀ ä(è‚T`&AÀ¬ä(è‹~`¦BÀdä(è—¨`¦?Àä(€Ø`&AÀ¸ä(a09 ƦO˜þtNŽ€yH&A’£`N’†IP@'ä(X‚Úaúð9 V¤…˜ÜFŽþ!–˜ø$ÈQ@“ bÊP'GŸ‘^ÌW|DŽªäå à€D9âÀ‹ÜDìQž€5ÉQÀ“d!Á ˜žôKRÒ™€ ÈQÀðt&€žÉQ_ H’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£’£ºðÛï|™¿ |êÏ_ÿ2“ÈQÏøÞŸŽç/ß}ïOÇó{„u“Oû“:ß}ÚŸÔ©ÈQ)×ö'u €5]ÛŸÔ©GÈQ—¹³?©SÌêÎþ¤NÝCŽ:¯Ÿþ¤N0®~ú“:"G}`”þ¤NгQú“:u9êÈýIàYsô'uê49ê?VèOêi+ô'uê}«ç(ýI NR§,£Ô&E €:µI‘:¶hŽ™D)êD&Qê+æ(mI‘ N[R¤Þ´VŽ’”D)ê$%Qê# å(%I‘ NIR¤>µDŽD)ê$Qêœùs”n¤HP§)R§Íœ£ä"Q €:¹H”*š6G©DŠu*‘"U7aއD)êÄ!Qê*³å(MH‘ NR¤.4OŽ’‚D)ê¤ Qêr“ä(H‘ NR¤†ÏQÂ(@ð#J匣ôE €:½G‘Š5GÉ<¢u2(uƒ!s”º£HP§î(R÷,G‰:¢u¢Ž(u§‘r”–£HP§å(R7#GI8¢uŽ(õˆr”r£HP§Ü(ROé:G 6¢u‚(õ¬~s”N£HP§Ó(Rë1GÉ3¢uòŒ(Õ‰îr”*£HP§Ê(Rýè(G‰1&JÔ‰1Ö[”ê%Gi0¦HÔi0Öa‘ê"G©/¦HÔ©/Ög‘z>Gé.¦HÔé.Öm‘’£LŽ˜èbrÔ>ÅÅ)€:ÅÅz.ROæ(­Å)€:­Å:/Rr”ÉQcZLŽÚ§²˜"P§²XÿEꙥ¯˜"P§¯ØEJŽ29 `TâŠÉQû”S¤ê”¥HÝ£4S¤ê4¨HÉQ&GŒGP19jŸšbŠ@šbc©ûr”ŽbŠ@ŽbÃ)9Êä(€‘ˆ(&GíSPL‘¨SPlÄ"uGŽÒNL‘¨ÓNlÐ"%G™0áÄä¨}ª‰)Ruª‰[¤²9J/1E  N/±¡‹”er@ïÄ“£ö)%¦HÔ)%6z‘Jå(Ä)€:Ä&(Rr”ÉQýHLŽÚ§Ž˜"P§ŽØEêú¥‹˜"P§‹Ø4EJŽ29  G¢ˆÉQûS¤ê›©H]™£´S¤ê´›¬HÉQ&GôE19jŸ bŠ@ bó©kr”þaŠ@þaS)9Êä(€^ˆ&GíS>L‘¨S>lÖ"UÍQš‡)Ruš‡M\¤ä(“£ž'x˜µOí0E  Ní°¹‹Ôù¥s˜"P§sØôEJŽ29 àI"‡ÉQûS¤ê[¡HÉQÚ†)RuÚ†-R¤ä(“£ž!l˜Õ$l˜P'l˜Õ$l˜P'l˜Õ$l˜P'l˜µOÕ0E  NÕ°uŠ”erÀ$ “£š$ “£ê$ “£š$ “£ê$ “£š$ “£ê$ “£öé¦HÔé¶T‘’£Lޏ›˜arT“˜ar@˜arT“˜ar@˜arT“˜ar@˜arÔ>%Ã)€:%ÃV+Rr”ÉQ·’1LŽj’1Lލ“1LŽj’1Lލ“1LŽj’1Lލ“1LŽÚ§a˜"P§aØ‚EJŽ29 à>†ÉQM†ÉQu†ÉQM†ÉQu†ÉQM†ÉQu†ÉQûÔ S¤êÔ [³HÉQ&GÜDº09ªIº09  Nº09ªIº09  Nº09ªIº09  Nº09jŸnaŠ@naË)9Êä(€;ˆ&G5‰&GÔ‰&G5‰&GÔ‰&G5‰&GÔ‰&GíS,L‘¨S,lå"%G™'W˜Õ$W˜P'W˜Õ$W˜P'W˜Õ$W˜P'W˜µO«0E  N«°Å‹”er@–ParT“Par@ParT“Par@ParT“Par@ParÔ>•Â)€:•Â)9ÊLŽ‚$ “£ä(39 ’(LŽ’£Ìä( H¢09JŽ2“£€ ‰Âä(9ÊLŽ‚$ “£~9øBT Ó¢êT [¹Emr”™iB…ÉQMB…ÉQuB…ÉQMB…ÉQuB…ÉQMB…ÉQuB…ÉQG´ Ó¢ê´ [¶Emr”ÉQ7+LŽj’+Lލ“+LŽj’+Lލ“+LŽj’+Lލ“+LŽ:¢X˜P§XØš-j“£Lޏ‡harT“har@harT“har@harT“har@harÔÝ´(€:ÝÂlQ›erÀm¤ “£š¤ “£ê¤ “£š¤ “£ê¤ “£š¤ “£ê¤ “£Ž¨¦EÔ©¶Z‹Úä(“£î$`˜Õ$`˜P'`˜Õ$`˜P'`˜Õ$`˜P'`˜uDÃ0-  Nð¥ZÔ&G™p3Ãä¨&Ãä(€:Ãä¨&Ãä(€:Ãä¨&Ãä(€:Ãä¨#J†iQuJ†­Ó¢69Êä(€û‰&G5‰&GÔ‰&G5‰&GÔ‰&G5‰&GÔ‰&GÑ3L‹¨Ó3l‘µÉQ&GDËÑ¢Èi9ZÔjÇ'u„(r¢ŽuÚôCÔ- €œº£EÝ ¶~™Gˆ 'óQSÕî¢÷hQäô-jž:ãI„! €œð#DÍPÇ|ˆ¤ES€´¨áê°'‘‚„(rR5P÷!š@NÒ¢F©SŸD¢È‰CBT®þ•H‹ §iQ¡:þIä"! €œ\$D}­Þð!º‘@N7Ò¢¾SïyIˆ ' QŸªW}ˆ’¤ES’´¨Ô ŸDR¢ÈIJBÔ?Õ;?D[Ò¢ÈiKZÔÔ›ŸDd¢È‰LBÔµzù‡¨MZ9µI‹ºP>ä/ýÉ ÓŸÜÀ_rÔý rúÓËÉQП §?½õ=ý rúÓñä¨aô'ÈéOç‘£fÑŸ §?@Žº‰þ9ýiGrÔ3ô'ÈéO[£– ?@NZ“ÀDrÉQL$G0‘ÀDrÉQL$G0ÑËß«ˆðà·IEND®B`‚visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/example-300dpi.png000066400000000000000000001135311147500217100255170ustar00rootroot00000000000000‰PNG  IHDR•¥[‹Aª€IDATxÚìÝ ¬E]{ô$A£„Dkdª8ă¨1VP&A>-h?(H«´U¥ÈXi¤Ñ¶2ÖÊQC(m †¬ ňÅ„`˜â@ÆŠ ¦ÑD=ÞpíõöÞ{öÙ{ϳÖïŸ'_Þ¾½÷œµ×Þgßõ{Ÿ}öþ”Ûíö™ÿËRJ)¥”RJ)¶n%Ÿòì·›ˆˆˆˆˆˆDÍ³ÚøMDDDDD„ßDDDDDD„ßDDDDDDøMDDDDDDøMDDDDDDøMDDDDD„ß:æ{ü©/¾Wöˆˆˆˆˆ Î'þìg×.~ûiŸúÛ~ǽÂ9o¶Ÿú›~ÒAÍâÜ8¿=¤Ú™9éa¶c°ä\z¿i²CÎ'"""""Åx«1ÛäRú­ÛÞ+Îa'"""""WåÖo¯—Ìo½å¦'"""""exë'·Þ¸.~†7Š‘órƒ·~¸ö~7—SŠˆˆˆˆÈC¼”[§F\K¿ øÂ›FœˆˆˆˆˆdÁÛkÅ=ýo ¿M—›Fœˆˆˆˆˆ¼—Ût¼5lĵñ[(¼iĉˆˆˆˆÈ-@Û­ù7âø- Þ4âDDDDDà-Þê Wë·ÈxC8x[‰pU~‹7„ÙMnÁñVC¸r¿=»(…ß|NDDDDd¼Å—[Í)Ëý–oÏõÔÞÈM)¥”RJñ›.\W¼5ð[ØF\“ý oJ)¥”RŠß.Þšù-áZíìN~s6QJ)¥”R›ûmOÂÕou3¿!\ÃÝ oJ)¥”RŠß®•ÜšloK¿½˜Gç Þ”RJ)¥¿…"Ü\ŵÚÒ.~O¸¶ûµÞœA”RJ)¥¿íF¸æÛØØooðoð¦”RJ)¥ø-á†)®Ç¶÷Û{e‘[¼9q(¥”RJ)~ H¸®Šë·i]üvBaÙvûÖÙÁ›RJ)¥”â·}×r6ª—ßÎô²"°Í5“J)¥”RŠßBn–âŠ97¥3ýv`¹‘»GÛ­¬þµ¿åOŸ¯ Ãè:õRßð|§óeº”RJ)~‹Óˆ{h¹éÒÑo·nwᇷr»4-/|j5ÏÅ/Ø|$Ñ2÷´þL²‚_)øE‰’ ²*µ’Ÿ„[iúú-8áÚŽmŸ¶[w¿N+}­ª¸)§õVc9«R~ŸGÝJ„ã7xKÖv;i¹æ?Üi üvO\=6„âD¬JùM|Ru© ×iäÝýpÍo5©íÖQc|UßÜÊoúd'bUÊoâ“â¨ËH¸~cá·P„#·hx»‡¨‰šJ­¸§õñ ¢8«R~Ÿ”ͺ\„ë:Úü¦íášÉ“ù¼¿ð}¦0I ·¤ß(NĪ”ßÄ'ÅQ—…p½Ç9ÈoÓ Gn‘Ûn1ývËÙˆë}ZŸ.(б*å·çá¤å“‚pü–€pÚnéðÇo·¼ß&*.õ’EeYó5<ä¬J­¤;u‹áÓ'áÒ oq¿y¼[F¼EóÛ‹âø-Žß† Æ# dðšïÖç ÇÌoK®¤w>Ñù¤ \º õÛHÂi»Õ|Ôùíáâ+®ëi=àŸöæ Ž•þ3³$Zï&’!¿­´’v®óIIM¸hŠ6žÑ~C8m·šy¢Äô[œùá·³ˆ‘ñK½Y«çš7å·ì+iÿ‰jÌ'ÔQ·™Bd‚ߺNÛm¼÷Û-öS¿ûÖƒÿ¥¯Y‹XÇÈøƒ0ÂQW¶Žç·¤+if<{ŽºÝÇo!ävÛ¬íÆoeã·hbÉM‚¯óbuç‡ÄoéVÒNt>)·Øæø­-ázÈ ÞŽßÒáíÒJÅ‚FÆŠ‘:~[u%íDç“‚pë½õ4¿5!¹ÅÁÛ¯ÿÿÝ›ZÞo[]?Y³øÂŸòUojîŸXr“×ù«þàoþ°Ú*®íQ÷=ÿò|Xc¦ü–e%Ýö¨ûšÏü…VäOw§1/üIi»ðØ„pSÞt¦ßŠ ÷̶N_¢ÛPnõy·zÅ=ôÛgýÇ?³¦’úmÊù½-Þ†)nL÷ãÞê_­Q­Ž“àGýŸ]åÖDqü¶’ßÈ-{mòIÙê°O©YM¿É~»J¸~l»íÚv«¤ÈÜ* wà·J¹µ"Ü`¿M<Ö­ä6¸×¶û4 7ÞogØÖrg>&ü|!Ûêt·*Ûš@.Ñ'e7ÈÕÄ+6Óø­«Üvn»õë¼UîžßZá­žp#ý6ñð(^œñÛÂý™ïñ¯ê¶©¹„«ñ[ÞÊÇo©×¯ ÿCÕ>x+#¿!ÜÜ;¦Ì÷ÛCÂõ–ÛæxëÝ| î·b­‡·{I¿æÛ¿µÂ½¨Å•ù­FnÅŠ{ø‘ç·˜‹Wr¬¸,Ÿ”=×WÓowÂo÷Gnkà­!ášã-¾ßæ'½ñ6€pMü-ª’p~k…·«„ã·tËVm·)„ã·È„ëê«›‹â·Û«»’t½=‰¶[+„,ã·2ÂñÛô†ßXE5QÜ%¿µ•[âŽ?øüjÍJn—⓲­â:)+ȳÂcùmØ{ùl¤ðÛ{Âmå·éÇLïo¾Å÷¢¨V„;ï·~x;O8~˲Z…·¹„ã·Ýo›úÍG¢‰@Æøí á‚øma¼ñ¼©„;é·Þx;I8~‹¿TuÍdÂñÛV„‹ƒ·ýæÃÐJ ü¶êQZÿŸuùM!\d¿=$¿_§¶}Ž%§Žß⮺Bám/¿ù$õÛkÂípñdƒg ¿Á›Jä·axã·Ô‹Txã7~L¯hx»¿ÿ$¼õû4¿­w ¶Z¤ö¨æ„{è·‘x«$¿M\¤Â["ÂQÙ„ ˆ·-üæÐïÇa~ëG8xkÞ|‹ƒ7~SqÐoÇ„ã7~SgÇok.&Þn)žß oÍø†IM¸²atò¼Á›ÚÖoSðÆo›ûÊøÍCá’âmq¿9ÜÇðcüU”MW<Œ~ƒ· ~ƒÕ‰p~›…·cÂñÛÚ~C²V„ã·U oËúÍ>¾}4žp³Ò|ã*=ðvðïùMñ¿ñ¿ñ›æ·“0 Ž·5ýæŸâ·K®ËK¸hxk8’Nx›~SüÆoüÆoüÆo—xo!üÖoŽïhx[pm'0Ôi®ùàM!\|¿Žßø á}Rî’ÐRàm)¿9¬Ãúm%Â5œ@xã7ÅoüÆoüÆo*H . ÞÖñ›c:2ÞznŠßâ4ßà­¹ßÀCMñÛt¼ñÛ†~#1~ã·÷ZK„·Eüæ€Ná·¤ùošoŠßøßø-áø-©ß^›-Þæû­oå\~ëA¸‘Š‹à·¶r[oü¦øßøßøßN.ÞrûÍqœo=÷¢¸5Ýo<;¨šñGÆÛÍÅ“*á"ûíáøß¿í@¸V_+å7xkøÆñ[ÂíÐÖXÛ oü¦fù-Þøß¿ñ¿i¾EÞöñ[׿ÑýÎ!ÇÜo­ÉcZpoü–ùí,„맸«ÃXÞo)Í7•oëù­ÓŸéÞg’tcîºÜD²~C¸8xã7~;:C5ÜŽßvÆ¿©1rËÒ|{è·‚õMƵ]¢1Xn‚Y¥ßnñîÝJnüÆoŽÈàlC¸¼Ý–~þ[–c@óM¥ÆÛÚ~kò÷züY%˘Ç,7Ùl€ß¶%\¨å¿íî·\ 7„+Æ[4¿5$Üòxã75FnüVóW{îé%þ˜G.7 má¶R\À¿mí·æ‹{~@¸â·Žæ·&„ƒ7¥š°í ÞnI¾üÖj‰“qavÌS–›œÖÕoËC.ò¢‚ßöõÛxËH¸)iµ‹ÛúmŸð›Š7~»zÆ‹y¶‰9æYg~T»ê7„ƒ7~ zLwZÙ#¿ñ[s¼ô[ÌI^o‹¦„ßÄŠsLÚY>Mü–ÌooÖôkà áùm·¿ ‹áßvÆ¿ ¿!œø4ñ›¶Âñ¿eò[Øyæ7~s¶±âä·V~³Ë|šø Þn¼µòÛ>4ßøm%¼ñ›ð¿‰O¿¹[ Âmê·þ6Tâí¦ùÆoÁü–èá–¡VœüVé7{ͧ‰ßùmy¼!¿ñ¿ñ[s¼ñ›ðÛn~³ã|”øßîñ€ÛVp¿=Ÿ†N¼ñ¿ÍÅ[^¿YƒZt"œœ¿%öÛ>xKA¸{Üjþú‘ývþ„•Èrõx»i¾ñ¿5›5¨E'¿iÁù(ñ[V¿í†·˜„ë ¶{YìúÉø–Ó|ã·õðÆoÂo{úÍîóQâ7~›F¦‡±ð÷ß*Nóß–Ä[j¿Y€Ztò[ßìA%~ã·™|š"¨é€\þùq×oüÆoñÆoÂogßùñ¿Í„ÜÈ·›¾É›<ÿ-‚â–l¾ñ¿-à7«OëN~«ô›ýèsÄo£ ÞÆ+.Èu›ýÖõ4Qqšoü¶0ÞøMøßìJŸ#~‹å·¯ü…ÿleåU\seÅ‘[sÂÅ÷Û,Å­Š7~ƒ·Px«ñ›¥§u'¿ÕûÍÞô!â·~«—Û2[Rn{úm¼â4ßøma¼ñ›Xzò›êCÄo!üÖ\n© w«nÇüÅïý¥¼¦óÛ×|¿¯«© §¼Vxã7~‹‰·eüfÝié‰pçCÄo‰ýÖo© W¹“?\)·Âô[¥Ü®®ß‰oa¼ñ¿Eó›e¥'¿ñ›ÝêÄo ú-;áNÂì<óZá­ŒpÑüÖ oç ×Oqšoü¶<ÞøMÌ9¿Ù³>Aü6Ùoð¶†ß^#íÃ:ÿ"mýv•pqüÖ¶ùv•pͧùÆo;àm1¿YtZ}ò[+¿Ù¹>>ü¶šßV"ÜK~÷ÿÿÕo©ýÖo—üÖPq ñvÓ|ã·Àx[Ïo ‡p>>ü–ÉoÃðÆo]ýv‰pËû­€põŠã7~‹/·&xã71Ûüfûøð¿íE8~‹é·Å­7~ë§©‘ÕpðëùÍŠÓ”ßúÍ^öÙá7~[püÙo¯wòDÙo7Í· üÖVSƒ³ÌÃ,7­Aù­ŸßìhŸ~[ÄoÇoYüör#ý¦ù¶¼ßRãma¿YnZ€ò[[¿ÙÝ>>ü¶ÂýK®Ÿß. ÕýKž15ßøm+¼­í7ËM P„C8Ÿ~ã7„ã·üv»ÓˆkŽ7~ã7~›ˆ7kMkP~kî7;Ý4òÛ"~C8Ïï~}2Š·7Š{9‡.ß|ã7xÛÍoÖšÖ üf¿ûìð[¿ ܇ï²0áÎ(nÞBù­9áFžF5ßømC¼íà7kMsËov½¿%ð[oÂÝ{—…?ig7o1ýÖ„pÙϤšo ûm¼ñ›˜[„³÷}pø-Šß:îỬýy+{ÀwïÄô›3)¼­ê·•ð¶‰ß,4M,¿9|jø-‡ßÚ*îü[,O¸hŠ å·Œ'¦Næ7~ã·8~³Ð4«üæð©á·4~“­w Öˆ‹æ·tç&Oò¼ñ›˜U~søÔðÛ^~Û“pAÐo¹NO.žä·=ñ¶›ß¬2M)¿u= ›døí˯®¤n®âæBŽßàßløzxÛÐo¼a>Îñà#Ãoü†pßrü–î$¥ùÆoü¶Þ¬/Í'¿9$|^øßîÅ„\Ã]_pà9UE>[¹s ¿íŒ·=ýf}i2ùÍQáÃÂoQüÖ¤®9äz×D¿$Ü‹âÆ¼ñ¼ñ›õ¥™ä·Á~s`ð¿ í¿5„ÂÉ\¿'ܬse±î–ñÛ9¿ñ›µ”%)Â!œO ¿ñÛÈ!Ü~ N¸Á+rÍ·õü¶0Þ6÷›õ¥9ä·‡‡#dŸ ¿úþÂñÛz„ë·"‡7~ã·D~³¾´6å7Gˆà·5ï_RÙˆC¸,~Û‡püÆoðvÛòáÖ—fß$¶ß6ºÿ$Âí@¸úCÞøm¿­7~ë±Æÿ…[ËS~Ká·m“­¶šß®Õ°‡ Üò~[žp]WäðÆoü–×oÅ+­“H[rü†p›Ìoíýöo|ÑÏ«,„ÛÇokNóßà-šß¢-¶Ú>§¤Ø{V¨ü¶žßni¿qZó£¿ùKþ,¿ñÛ5¿ÕËí=äny¿­J8Í7~ƒ7~‹¹(ä7~ÛÄo•Šù8Ùãð¿]ð[s¹½”;Ržßº«µáB!°÷ŠœßøßømOÈñ¿ ¿ñ[¿õÃÂu’[åltúd„{ó¤ð›‹'WòÛ&xã7ã7„~ã·ü†pðV<ýîa³á4ßøßø-)äâëˆßøMŽßjý6oõ~[ŒpmýV0]ïAšp»áßj¦b¼ñ[FË!¿ñÂñ¿ÍôÛ2„kŽ·h-¸é‡:¿íŒ7~[oü¶äøß„ßø­ÜocðÖp*f ./á,Çùßøß6‡¿ñ› ¿mä7„Ëâ·¹<¼ñÛ€Ùpñ$¿å…Ü\Añ ¿ñ[¿54­Å¿„rî1ÏoÛâßÖö›%]Ëñ¿ñÂñ¿u÷ÂeñÛ¬ÃÞø­÷„l…7~9~ã7A8~Ûîþ%Íý–7Að6rwÀ[L¿­úã7~“JÈõæ¿ñ›ð¿%ðÛx3ð[¿ >øùßæúmI«ðÎñ Âñ¿!ÜL¼ Þðæâɵý¶<]øMBŽßøMøßªü6€pSÀ° á*‡±˜ßÂâí¦ù¶–ß^6qn̸CùÛ±äøßáø­Öo½ 7Ë Ë®~ +ù­l`šoüVã7 â7+À¿ñ›ð¿]^æ#Ü\3HR¿ Û|Í7~«ñMñ›”AŽßøMŽßJÚO ÷®Š‹`‰C8~ã·eüoü&•ã7„„ã·òË̦PŠßø-‚ß¶Å¿Õû£àMj Çoü&üÆoU_º×ˆã7~[Øo#Þoü¦ø äøßáø­ñmž7LVÇo›øMóß¿ÉmàÃÁùßøßvñÛÈñ¿-ì7Í7~ã7~kP„C8Ÿ~[Äo¯×oeÏo».ŽßFâßøMñ›ð¿‰¿ }LÖ äÚVXÆd*¿¥ð›‹'ùMñ›Ü[ƒR¿ ¿ñ[¸›³äÕ ¶âŸá·,~Ó|ã7~ã7±å7~ó©á7~Ëç·bŒ-©¸Mü¶9ÞøßøM,Fùß|jøßò® ÀkÇñÛ~Ûç¿ñ›¤[ŒR ¿ñ[¿'\q­¡¸ü6oüÆo ÞdÃ%)¿‰ ¿ñ[eeWÜò~ƒ7~ã7~“«RŠã7Ù„pü–Õoç¡äA†ÍoðÆoŠßä _ôs~éSÝ4âøMøß ǃ‰ØpãA•±·¼ßàßšûíéŠß¤-ÞÞ¬M áNøß:ŽpáÊõ‡¿â»½©,nä·Þx»´Ð‡·µýö|\éÂñ›tÂÛ+W~~ã·Ð5žpe y·ÅeiÄ ä¿õÃÛñrŸß–÷ÛˆUü&ãý¶'áøMûðÛ „kå·&m·}qüV/àxã·®s¥Ço2o{Žß„ßømA·¼Îø­†pa7r`ãýÖ¤ùV°è‡·­ü6RqS&“ß$&Þ6$¿ ¿ñÛjWQSä$ÞŠý6^Jü6o¯ýšo{ú­«âæN&¿IX¼!ÂIêãŸßv'ܼ-I8~kh€˜~ÛóïÙÜ{VÜ2“ oo»Žß„ßø-®ß>ç¿øÜ§€‘~»»–rðHøß6ñÛkÅ-`9~“ø~Û‡pü&üÆoÑ¿÷¬¸—êÁ¡Á~›'~æ7OòÛCË}XüÆoðÆoü&»üü¶ˆßޝœ|£¸&ü˜â·[€FÜøwç7xÛÖoWÇokû M›ã ánØ„ó¿ñÛ·‘Ûɯ½½´ãRûm¢ømŒøßê9Ço+!G±7Þö!¿™d~ã·ÝýVvÏÉü6‘pü¶¼ßngy ¢8~<ð†pü–hzŽßà-á:Qj°¦¦ qíçð¿õ8r¦+ÎæL ¿!¿%š[~ã·íüVÿÀî‘~[ÆTüÆoüÖ|ÞºîÍY_ã·‰SoÇo‰f•ßøm ¼ÿÂ[Â-êYWlfôÛÉEùÍKò[ð¬8~›;uð†p—hJùß÷[¹$ܰÃiÀµ”üÖ7 à·ŠÛÊo{âm%¿ÇÛÚ„ã·˜ó9w+2íü–¬ó$ÓýÖ›Xïx™×oÇ$¸i¾ñÛº„ã·é“oÙo n™Ùà·õý6fÊ­9Þ:±d®ßnÝqüÖÜüÆo³öò€k)ã\?¹sÁÂEö› B8~ÛÝoÒIn ®ùFÍ}bø2~‹Ï~ÛÁo/;ºë¡ÎNüÆo§´àømG¿õk»-ï·[ÓFÜV~» lÁÁ¿­J8vâ·ìx[•p˜ÄoüÆo¹åÖÉ'AüÖJqsñÆoüÆo]ww§£n¼-I8LB8~ã·ôrÛp•[Ço;ܶõ[žšøm¼­G8Fâ7~ã·䶃ßn¥¸éxã7~ã7~S›ø-&Þ##ñ¿ñÛ5›Wê&U|¿•)Žßøß\?Éoü¶9ÞNñ¿íâ·P6C¸‚ÍŒ€·õüvóØ~[ýþ%ÔÄoëáß¿ñÛš~‹ÖOã·ã-}¸±ü¶‰°mCÂÝÜ|’ßømWÂa¿ñ¿ýÿx[cõÖ -ÁýöPqAð6Åo·nA l{úÍÃßø Þ¶%&ñ¿ñÛ-o· á¶—ßøßøßø ÞNñ¿­æ·ÅäÖV/Yüv{׈‹ƒ·ÅüæâI~ã7Åo©ñ¶áH‰ßømS¿­×vÛÙo¯WÿÈo~ËbZÛ“p½ïÐCMü¶6Þ )ñ[êã™ß ývOnßÿ+ce!ÜÎošo·áKàß6Á¿)~ã·L~»×v«—[@ÈÕK†ßøMó á4ß¿­ç·Ô„#%~ã·ü6FnqàÇoÛú­áø á–Ç¿ñÛ>xC8Åoü–ÕoÑðÖ\qÇo«J϶RÜÓñ<oü†p[á-5á` áøßŽßøMóMÂÏl#7~ã· ñÆoŠßø-™ß"ã­!áøß4ß$—寳 ÞømO¼å%)ñ¿ñÛâŠÛpü¶¶ßæîÐñ¨Ø'ƒÙ†Füoyý†püÆo;ú- Þ"Žßøß^Ï*Âedñ¼-F8Xâ7~ã·Å Ço»ù­3\<ùÚ÷þO¹Jµ×Ek*2ávÀ¿©ì„ã7~C¸ô„ã·…ý6±íÖi†QÖTX¿m‚·¤„#%~ã7~C8~ã7Í·m7„;϶~oÁ3ðoÁüoü¶£ßò®Rqe¶á7~ÛoMŒ‡m´¦ÒùmC¼iÁ)~ã7~ J¸ZpüÆo½ÛnqÎl¨5ü¶'Þ´à¿ñ¿­F8~Kç·JTl{ñdñ¤mH¸§M µ˜ßvÆ¿)~ã·è~C¸UýŠpü–oõWîs-åó–Ò…ZÉoOrÛo§øßøm[Â5iÁE†¿UúmÃæ[Cw­M8rS«âÜøMeÄ¿íè·W¦¸ú\dÈñÛb~ ÞvÛ§÷¼Q\¡ó¼å] S¿ñÛ¦~k«¸«3™…pÇx‹F8~ã·½²ÅojI¿Á¿)~ã·¬~››)„;œ3x E8~ã·8¸Z€p/sEj1¿ÁÂ)~ã7~[“pçý„püV‰‡ð6Å?yÛnÏ! µ’ßàm™1;ñ¿-ë·§‘ \u.áßðÛÚÍ·‰”ʨ8xS«ú Þ´à¿ñ¿"Ü%Å5÷[ÂñÛ2~KÝvË®¸7ãÄ µ†ß<'@ Nñ¿ñÛÊ„+À¿ñ[L¿…RS|½!N¨üFn§<üßòùí·ü¢^_YW~ã·ü³å¹÷áÀpBe÷¼ñ›â7~Û·ÿ6Ft# ÇoüÐo;tº*îÞxöôD-ã7xC8ÅoüæúÉE·áø-»ß ³Œßr}Ó,Èhư­8*»ß|á á¿ñ¿=†\4ÂT\+Âñ¿EÀ[ÆuÒ\Å¿õÎ6@©¼~#· ×Ç(ÅoüÆo…Š[†pžÀo¹ü–úakoÚq#7äá{‘PåÚkÚn;/‘)ŽßøßÖiÄà‡ßvó[ÂmÕv‹`¹3¯ï¹aL•b'’›%2Âyx¿-â·)ÈH¸š\Ï¿e÷[±sÖ^Bõ³ÜÉÜð)Ï—k·’›U2Åñ¿íå·ÿ‡>³²î®¡â‚ŽßømŠß–—[WË]z… µFqYv4¹Y%S¿ñÛF~«—ÛCÈE#ÜCÅ]%\¨Ï¿Uò&Þvh»]²\A]]õ¿EÛÑÚnÊü¶'ÞømS¿5—ÛÚ„ûPqÑ>OÃæ·MüFn­rií oͧb£hül<³Ü,”n½ oü–Õoýð6€p·!×RÆÐI¶=øÏ|û›ßÞSç’v‚ãMÛm.áÆ+nm´,s › l³\žˆ–eö&¿ñ¿"\Æ|Ç'Üû†¿°'8ášo…d'ÜòbYéê=nü6],+íÍfƒß¶óÛ¼ hÁíL¸× ·7á·cüœôO@¼i»E#\?Ëm‚–õ¡N³m-ëíÍì³Áoü¶;áŽçKel H¸€~»¡hx³rŠL¸ÍCn=fCÃß‚¸eí}št6’ŠüVî·axã·ÛÀ;šÌRÜI¶ñÛUÅÅ!\½6¥!ᬘ»¢ÅlÜ›°9.Zvاgƒßøm¨ß:î6ïépqØpÁýv†FsñFn·]ާZ9Þø-]öܹ‰fƒßøm¿$\'Ž€­þ-øí’â&ŽÜ(n‡9„A8!¿ñÛL½·V“j;Ó —Åo½4oäS &ÏDN~ü¶éýK²î¤â"‡ß*nÞÈ-¾Rð ÏDøM~ü¶×óÆø á‚.ß^;êCJ‘Å­$ßÈA8qìñ¿õÛÂÝ^KÉo+ùí˜UmñFn©Ù“gv¥¿‰ßÒømáÎÌ¿!Ü\Âe÷Ûkb½¹É ᙈ•´ˆ£Žßúú­7á‚ø áø­«åγíõï’ÛÚ–s¯y+i‡¿uñ['Ÿœ\„Ë«¸Y„[Ïo÷,w¦üÕ±žá7~«õ[[Å]Éa~Ûœpü&""bI-6~[Ço3’p·¯¥œB8~KjG¿ñÂñ›ˆˆˆ…µ8Ìøß6ðÂñ›ˆˆˆµµ8Àø-´ßžF‚pÍ —Kqü&""b…-Ž.~ã·”~C8~±ÂG¿ñ[¿5T¿ñ›ˆˆ‰ãŠßZú-,áæúm+Âñ›ˆˆˆ¥¶8¨øßrû áøMDDÄj[NüÆoiüvÛæëpü&""bÍÝuÛ*ÑPÏ”c‰ß6õÂñ¿‰ˆ¿¥ÃXiúAhоXŽßv÷ÛM n”âŽßDDá²³m Ë~7£uzr±F.¿}yñâ8 áBùmyÂñ›ˆˆÂE`[Í0b^“Ù\€üÆoü†pü&""‚p ”è«tòùô‡ò¿%\@¿Ý–þ:ÜÂñ›ˆˆð¶µÊ'~ô7ívüð¿Å%\L¿-L¸€~SJ)µ|!\­åí_ñ¿ñ¿ U¿)¥”R{*n–»Úßømw¿!Ü΄ã7¥”R·0á–ü†Ø†~[ŒpüÖæDpOcx)„[‰p(J)¥n°ß¾·¿ñ¿M#Ük°½y÷Dqü¦”RŠß–!Üweä7~ã·qd:Û½F8~SJ)…p·sÃß#¿µ‚7~KD¸Þ~kH8~ã7~+ÄÛD¿Õ0qÇoÁa0oý–wO퉷V~+xßY~Ë»§øÍ%”ñýVð¾³ümþùmw¿M$ÜÈ5ÙD¼ñÛJk`<ÞÊüVO¸5ö×n~«'\Ù›ø­žp ì,~ã·°„+{Ó¿Õ.àäó¿Õêb$Þ*dSðÇo‰û¶³ßjWüve~«QÜz»l¼U*®øíÊüV£¸õv¿ñ[Å¿]™ßjsÚùßèbŒÜš¬ÆË-ášûí¶ÙwÍK`ŒÜêýv•pkïµMðV@¸Ê÷ªñÛU­½×Næ‡Ý>ýu­G8~›E¸Ê÷ªñÛUÂEžs~ã·f´€·V«±Áxã7x몸úw©ôÛyÅmµï6aÀ¼Õûí¼â¶Úwr;æ\?×mŽ·¤~;¯¸úw©ôÛyÅŸm~ã·^´h¶K±` H8~[­ÀÖÃor.ȼ-O¸8h¶~ûsöà±ÜÎüJC×ñ[^¿}ȹæ/ÛÄor.×ôò¿… Åë°¹“ü4o/•‹p¹éá7§Ž ñÖ/=üf?¾1X×,xåñ¶’ß:¥‡ß2†ßøß÷Û{³5WÜÂk7¹ôn¿-¼7ùÍ®¬QÖH"ž|G~~[oüÆoW;]m§óÆoÎðÆoYvèà»’ÜãÜnSøßøßŸ¶²ŽßÎOÔ™¹j{Q¥§ð[ð³ÇWü–b­Ïo;ïÓ¹r»:˜­äÆoüÆoüÆo[®`–z|5.ûZŸÝäûoÏûô‰p¯ËBŸß6Ù³¡äö~`1džpüÆoüÚoYÇo]Fqâmy¿Õy!Ço û­ÇÝDâo8Åñ¿ñ¿ñÛv~k59ýnVÉoü6 lWá\Û o;øíi‡¾ÔkÌÔx&i_K;ŽßømU¼ñ¿!Ü ÖÞKa~ã·r«|‘ã·%ÍÖÊ3køg[Åñ¿ñ¿]ûòn|­á·ê¿ý܆2lNö±¿å[§Ã2,ävÃÛ2~{ ¶‚xÆ3ë™g·vÜÓ–ò¿ñ¿ñ[8¼=Oòá*7×QoÖÍÁ«ì0Û§ë˜Ño#÷N(ȯþù-Ø®zfmä¼yˆÜ€š²i7ý7~ã7~ã·¹N{_o~ìYq— ·ù7ÓFjóêïòÛÈ}7e0s!÷†olp¦ø­+ÏOøDol’YPä7~ã7~»üð“{ðh^kø­ÕÖQ¶ÿϹz’¯·ñßR÷NW…\ on½÷[ÌáEÈçüåïëÔ½Føßîå7ý¤™ßøíãü#ßüɹò9®§õÜ0aöSèIÅ-ÓÞÙÄo7s±Fâ,Èõ–Û†_x»§5‡¿íà·§eºú°žü¶óæßôßøm.Þ,¬*¤fc²Ãó»{+®`Lïm³ç¿ñ¿™„{qý$¿ñ[>¼í¶°æ73Ïo‰×\qðÆoüÆoÂoüÆoüFbæù-ºâ\+ÈoÇoÂoüÆoüF#òuß鿪,3Ïo›+ŽÜøß^òÄ?_YüÆoüÆoËú-Þømm¹Å¿IÅÁ¿!ÜD¹%…¿ñ¿ñ¿ñ[>¹M'¿I+ÂWœk&ùß:É-áøß&¿µô[¼ñÛVx›H8~“ÁŠ#7~ã·ÞxËB8~ã7~ã7~ã·Ü~O¸ oÃo§íÆo7Òoñ ÇoüÆoüÆoü–oüÆo‹)î ÞÌ ¿ñÛH¼÷¼ñ¿ñÛ)¿%¿íé·Á„ã7éM¸ç‚7~ã·)~‹L8~ã7~ã7~ã·ðÆoü¶døßn ÞÂú Þøßøßøß`üÆoüÆoüÆoüÆoüÆo—ƒßïϼTðåõ¯úÙ?í¥øß"Ïùý’ox©à~û}?ôg½”¿µûøí·~×ßþRÁýö_ó/ÅoüomóUŸþµ/Üoà7ÿÕ/…pü–Æo­ðölayýlÅoü lÁo¯ÁvP̶˜ß^ƒí "øí5Ø ávÀ¿uÛAEðÛk°¿ñÛú~;‰·„;‰· „sÿ’Á~ˈ·&„«ôÛI¼!Üb~;‰·„;‰·•—ËoƒñÐo;à­ á*ývoñ ÇoüVå·Krk¥¸²Eö%¹Q¿íÙ|»$·&Š+öÛ%¹QÜ2~»$·VŠ+óÛ%¹­¤¸D~ƒ·¼~»$·&Š+öÛ%¹ÅW¿ñ[¹ßŠñVI¸‚Ev1ÞæŽß6ô[1ÞÆ®o—ÚoÅx«$\ߊñ†p ãߦ㭆pe~+Æ[XÂñ¿ú­o5„»ºÈ®ÄÛDÂ¥¸¢'ÄÁ[ á®ú­o—Ôo•x«!ÜU¿UâmÂÅ÷Û‡²‚·ðVL¸¿Uâ-&áømk¿Ml¾$\¿M!\–{Ùó[(¿•nŠß6'ܶ~C¸&~KM¸à~;¿mâ·ÂÍò[4Âñ¿ÍÄÛ¿µÂ¿÷ÛnÞ oZp­ðÆo{âm€ßZáM n<Þú.æT쌷~k…7-8~Kï·†x+&ÜÉuvC¼M!ܶ×OÎÚ–‰Þo½[p ñ¶9árù­!ÞŠ wÒo ñ¦7oÍy¥ó[C¼î’ßâM Žßømášûm0á’>ÿ-ïZg%¿õ#\s¿mK¸ÍýÖpÍý–—pý– Wð6Ào—7×o¡Çoü6oüÖoüvŒ·ìJgMx¼uò[¼ñÛžxëä·xÓ‚ƒ7~뇷N~ë7~ã7~ëþ-¸ü“pëµÝøß.‹ßŽßÂú Þ²ãßøßøßRúmU¹ñÛIÂñ¿ñ¿Á¿ñ¿ñ¿ñ[¿-Üvã7~ã7~sJxƒ·à~›þå7~ã7~ëN¸N~Û“pËËí)ßû[þ…ÅüÖƒpü¶­â6÷[Âuò›\L¼=)¨Uµ}#~ëA¸~‹C8~ã7~ã·kr«ÇÛ–¢Õm¹þ[:¿m¨8~ã·ÝüÖ–mÃ(Ø–I%~Ó‚ã7~«ÅÛ1oúùm°â&ú­¹Ü^c)`\?ùpü¶•â\?Yœ{„ëç7¨÷[+_åýÈÚ·üħú‘?öñ[W¼Ý6¸~’ßøßî”ÜÊðö¦Ç9üÇo›(ŽßÒù-)á²û-µÙ^ãíùøíªß®â߸ߢûíÞ²{€ß†)n°+¶Ýâ›ß.n°ß–W¿5'Ü¿eT\j¿-†7~ã7~ã7~›ï·„æŠæm·\§~‹é·…Çoyý†pcü¶Þž¯™|ýoøí’ß ðÆoüÆo#×iÙ=’p]7Æ;Ëm®ß:®~TÑ·žâ²ø­ázøm0á).£ßÖÀÛû™×o×oýÇoüÆoKµàR®IÛíåKn?û?ý‘5ÅoZpû(ns¿-ЂKD¸t~{ÆÛÏú–O­¬‰rûoü6 ùÖÉoÑö¿ñ[zÂiÁõS\?Z´’[%Û"@nî£nOÈ!\s¿M!\ ÅM!\™ßžðV/·‰»'7„Ö|ëA8~ã7~D¸)~ëA¸´hÕvk.·Y„[Òo=nDÇo ŽßznŠßâ.‹ßzàmáÚnü6omýpGð¿!\ŵÕE“o»uÅÛxÂÍõÂí©¸D~C¸ìŠKá·~x@¸3r[Ào­wüMüÖŠp1÷¿ñÂ% \+]4ü¶ÛÓ?ôöÂ!ÜÚ„Ëå7„KM¸ø~ë·~„;Ùv[ÆoM7o­ÇoüÈo—KqMhѪíöüð¶›ßán ÂÅTÜxÂ-ï·«r[Æo5„;~Ù¶x«$\äùç7~«J4Â,Áw&\Û¶ÛH¿$\¿uU\sÂÝÜÎd?¿uU\sÂÝ4âø­áÊäÆo_6Žß‚Ï?¿ñÂ}Ì­hŠ+ÖEÛ¶Û`¼íé·€„»ç·ó„ë­>~C¸JÂuò¿ñÛ0¼Õû­FnËø­‡Üzàm½Ë&ùßšù­äú-ÄOújÂ5o»-ì·h„비;PÙÕŸßpyýÖr=w`³bï!Ün~«—Û~KÑy[øÎ%üÆoŸ0ca waAFqõ~»úëïåÆo  ®á Âo·–pç³¤âø­Ìo­ä¶€ß:}ííìž“üÆoqý†péWé·«r»‡7~C¸q %Â5!\+¿-I8~»ä·g¶5”[v¿ÇÛÚìæ7~í·5DqW·¨ÌorO8~Û‡p•Šã7„kN¸ÅÇo'ýÖƒmÙýÖïioõ~k+7~ã7~C¸É„»ê·ã¶Ûx¿ þ€çòÛª„+V¿!Â…"\@¿Í•[^¿…}Zw¹ñ¿E÷Û„ë±"Ÿ«¸~~;)7~C¸„+P¿!\?Â-£8~›(·¤~늷b¿õ“[|¼ñ¿ õÂ'ÜI¿o»$Üø“KF¿!¿!Âe÷ÛÂãmØ´äò[@¼u•[ ¼ñ¿!\Jŵõ[ÜnCúoü†pü†pÑ—]qaý6€p÷ä6o¹üÖoWýÖ[nYðÆoü6ÁoWO¸¹~[RnÙý6‹püÆo—‹p‘ýÖpAä–Ëo¡ðFnüÆoóý¶áÆ+®¡ß¢}çmîÉ%µß–$Ü~C¸¤„Kª¸ø~{þ‡%å–ÈoðvÒoäÆoü¶;ẮÎG®•ßÎã-¬¸ømmÂñÂ!ÜV~{M¸N™(·,~ ‚7rã7~‹è·õ×\qõRï·Mä¶Œß#¿!\+Âuò[Åñ[?¹MÇ[|ÂÁÛC¿‘Ûbxã·.~C¸t„à·­ä¶’ßV"¿!Âíæ·„‹#·à~ ‚·ÛÆvã7~Ëá·JÂ…]¦§öÛ†r[Ìo•„+ÿ,·&¿!\Š«(›+Žß²-”Ü"ûmÞn“šoËœ<ù߾߾ðÿùëÞT|ÂE^¦gôÛ¶r{™ÕŸp5~{.~+öÛÿñ‰ïÿºN¾Â›ßª¬ø„ ë·V„ÛÜo•„ ˶È~‹ƒ·~[l­Âoüömüöþ_¾]?×'Ügþ7>WpÅ óÛÎr{™ÕŸñ?|ß§š¢Äe÷9~;ï·{vš"®‘´L¸'Y<]ñÖÊoM×o«úí§÷¿XY;û­žp7¡•ßžþw Þøm1Âã­•ßš®0øí’ßþû_ú7VV½ß&.šßîo ýöô¿‹áßø­Êo5Š{þÝa~{þ‡Nxã·ç‘ÔË-ä‚t‹ñ6Æo¯ÑU‰7~Kç·Å=ÿî0¿=ÿC'¼ñ[W¿=Ím½Ü^WRÂEö[â>|©~{MeðÆoü6p¯qŒßŠ w~6÷[¼!\ܦøí*áŽ_ŠßV%Üë_ã·bÂ]2¿õð[s¼!\C¿UîÞ‹ ðÛUÂE>ýò¿5ðÛyÅÇ['¿W\o¼-ã·'eõóÛÂ…ú"_[¼uòÛyÅàßPÜy¼uòÛyÅõÆ¿=Ì´:ù-)áâûí¼âÎã­“ßÎ+.ø‰—ßø­™ß>äÜÁŒôÛñºö*ØøíÍúám á"߈å=Ø®¾•ßÒëØøm1¿}ȹƒé·ce]¿ñ[?¼%%\¿}ȹšWhå·‡ÚI6~ã·q„«ÁÛH¿Õ¤okømÞø­íÈúí¤¾êß–ÉC¼ô[eø­‡ßzã­‰ß. ßN¬òwú-5xøß¶ö[§u9¿ ðÛ`ÂñÛ¿ÿ]~ã·b¿u"\ÍkòÛ\¿¥#¿ñÛJÛÂo-ý6˜pgðÆoñý6 oZp ÇÜÖo5„ã·Ýwoü¶³ßÆà­•߆.¦ßŠ wþ·Úúm%Âñ¿íå·æëò¼ñ¿­á·2Â]ú~ã·¿5'\å«ñÛt¿å"\X¿•n¢ß–!¿ñÛ¿Ä['¿µ]šó¿åÂ[¿]ýy~ÛoüÖ–püÆo÷Ço žßøß¾üÌPî<Þâû­oüÆoSFÛÃoWIÆo»ùí<ÞøßÆÔÓÛõhÁíæ·K$»Š½~[ƒpüÆoCýv oýüÖdu^·›û—„ \ Å]d'¿WYÁÅ–ü¶Þúù­áê_„ß"ŽßZùí$Ì ®´ìä·Çoü6ÎoWñÖÕo•„k‚7~‹Œ·†Ô6¼~~;c³²›ðÛ>xëê·&úâ·üöü^ü6Ìoew:éç·ÔÊŽO~kï·~„+À[o¿/Í[ám ¿=áj½çwg!\ÙÀ&ú­øN•ü¶Þzû­`M:xüv'\ ÜËÛ5Àž~;Zñ“ºú-/„øßù­ o1ýÖokøíÖ¿DJÑW<ž®~;@ZÍ“âøm¼Eö[«oÐñÛÃyƒ7~kè·§…õ[R ñ¿ \1Þøíê"¸-Þø-‘ß*Éj$½ývjü¶•ߊñ6ÀoÅã·õüÖ„püvà´šÇ|ð[Fñ¿u÷[ ÞÆøíäRøInÍñ¶Œßú.ày'á*Ç0ÀoïµVƒ7~Û ocüV€±†·¯ä·Y„ûð½ø­•ßÞk­oÃü–NDüÆo} W‰·a~{¸ î!·õüöü Ë-áêß}¼ß*ñ¶ßÖ \%Þ†ùí*Éøm°ßžÿ¡«ÜZŽß>[%ÞFú-ŠøßzùíInõxé·{ËâNm·…ývœ,B;³½ã×êMÇøí™mÏU?f~Ë"·z¼ôÛy•5Ä¿5œðóBã·1~{fÛsÕy¤ß²¸h‡×ñ[G¿Õ®‰ÜÆûí=BºÊßnù3’p ßk˜ßžóþú _~K·V/5Òog¨ÐoüÐo•„ã·ÆüÇÓù-…Žøßºø­!ÞÆûíy•üÜs€7~C¸)ï2ÒoMð¶•ß’®!ÞÆûíY `à7~ã·MüHüÆoíýÖoSüvØT¹„7~Û–pÍ_Ÿßø-2Þ¦øíÀ ÍñÆoüÆo‘ýÙH àߺûí*ášãmm¿]Å¿'\§Ã¦ÇËò¿EÆÛD¿½gC¼ñ¿ñ[p¿…•¿ñ[c¿õÀÛmÒõ“1ñÆo)oü†p åÖosýöZðÆoüÆoñýKüÆoÍ×êV“ûø­ oü–…pM¡®÷·ä7~k‚·~/>×o·G_‡ã7~ã·üÍKkàßBø­ŸÜVõ[[¼ñÛ’Šë}ò¿EÆ[¿Ýz6ßøßø-‹ßB©‰ßø­ ázãí6ûùqðÆoû(n@˜ß®Fn½ñÆoüÆoüÇoqàÄoüÖÀoð¶˜ßjðÆo© oüÆo‘åÆoüÆoüÍoÏvšË§eðÆoãüöžpcð6ØoñÆoY÷p~º~áßø­Lk¯kä»ó¿ñ¿…òÛtDñ¿Uù­ëÝJVõÛt¼ñ[pÅ “¿!ÜI°ÍÝp~ã7~ã·€~›è(~ã·r”Û2~ë‡7~Ë«¸75x üÆoÑÀÆoüÆoü–ÂoS(µÞøm‚߯ïãa~ˈ7~˹YoÍo‰üÖJVs¯‡ä7~ã7~[ÆoãAÅoüÆoãÓqðÆoüÆoIýö!½ *׆óÛ¿=áßøßjL5†U‹áßø­™ß2âßøß\?¹jø­·ßžåÆoüÆoñÇoüÆoƒVÒðÆoüÆoüÆoüVŒ7~ã7~K¡8~ã·dxKê·€xã7~ã7xã7~{o¶1„ã7~[Ûoý·ÞøßÚø-#Þøßøßøß*ñ6ŒpüÆo;ø­‡âøßø­û2zÞø áøßàßêñ6†püÆoûø­­»øßòùíÞÊü¶ ÞøßÊðÆoðoüV·„ã7~ÛÍo·¸%ñÆoãü–¢ù6×o#ñÆoüÆoüÆoüÖo½ Çoü¶¡ßêÇoü–ÏoðÖvØüÆoãñÆoü–o+ùí¼Êøßø-”âøßø­×êy0Þøßømy¿Á¿µòÛU’u"¿ñÛæ~+Pܪxã·•ývo~Û oü†pxã7~ Ž7~kŽ1~ã7~£¸3ÅoüVî7Í·8xã7~é·&oÊoüÖÏo]‡”ÝoÅëA8~ã7~»šoüœÏç7~Ëä·Í·\xã7~›Ò|ã7xë‡7~ã7~ã7~ã7~Ëê·ñ‹æ)xã7~é·VïËoü–oÙýVi°æ„ã7~ã7~ã·•ý¿ù–oü¶¹ßf5ßø Þ’â-µßêõÅoüÆoÇo‰ý¶^ó-)Þø áFú­á[ó¿5÷Û˜±%õ[+zµ%¿ñ¿!¿-ë·àÍ·éxû_ýcøßzãßø-2Þh¾ñ¿ñ¿ñ¿íë·­ðöì·çâ7~ëç·¶ïÎoðoÃüÖ]üÆoü†püÆoíñvÕoÙñö:„ã·=ý6·ùÆoü–oyýÖüKk _ßøßøßùMó-&ÞÊÇoü6oüÆo ý¶ Þzø­ÇMÿùßø áøßZâmXó-ò K.Žß6ôÛ2Í·üo›\9™Èo _–ßøßøßø Þ.. ßX.šßš€ßø Þø­ÞøßøßøßšámŒß&âíÒ˜O.¸ßv¶\'¿Mo¾ñ¿ÁÛ¿õÿñ¿!¿%óÛæÍ·,xKç·“„ÛÊrAüoËûMóm+¼%ò[«×ç7~ã7~ã·¥üÖµù¶<ÞÎ.Žß ·¶åzøm±æ¿m‹·~·†~ë7~ã7~ã7~ã·~ë½2N‡·“„‹æ7– å·ÛÅoüo]ý6o­ÞˆßøßøßÖñ[´æ[R¼!\o¿µrȆ–kî·õšokû Þvÿñ¿ñÛ΄ã·^~Û³ù–o —ÅoZnºßâãß6ôÛÂxã7~ã7~ã7~Ëê·PÍ·ð¶žß6±\Ûy[²ùÆo»á­·ßæâ-ßêß‹ß6ô[Âñ¿ñ[z¿õ[gÄÛ¯ýq¿øM.»ßfYn çú-Þø ÞVÂÛ0¿ýÏ?ð³Þ¿õ Ük¼u"¿ñÛJ„ã·Ä~‹Ó|[o/5Ño# 7Ærš{‹5ß:áßàm%¼ñÛ{¼Õ(n¿î=Þz(.©ßê ÇoüÆogý¶Uóm Þž†÷R·Óp{(·c­ê·N–v}æJÍ·~xã·}ü¶ÞšøíTr+&¿]’[sÂåõ[%áøßø-ß‚4߯ãíÅl¯Ão-7ì+v gláæÛÂ~ƒ·a~‹ƒ·~»J¸}üvžpgüÖŠpüÆoüÆoùüÖiA<oÊíªßÎàíávó[¥åvð["¼ñ¼m‹·«~;‰7~«ôÛI¼ñ[%áømIÂñ[J¿-Ð|k%·K„;·‰~ K¸~–KŠ·¶~ …7~ƒ·•ðvÉoçñv•p[ùí!áÎã­áøßøß’ù­Ó‚xÞÎÈ­“ßÞŽß:Y.©ßÚÎdœ+'ù-©ßvÀ[Üøßfù-á.ùÍ%”ü¶¯ßR7ßø­¹ÜÎ.‹ßr®Þrü¶pó­o‰üo½ý¶Þøí¼ß†n¿EøÜU¿!¿ñ[¿õ[wÅ[Á̬䷤„+ƒ\F¿­7~ƒ·Px«‘¿]õÛÂíã·é„+ð›yó¿MÆ[¨gvX‘ŽßóÛÍ7xã7x›‚7~;&\ïg l巹ς+óÛò„ã7~ í·® âæx+¸fòárù-/á–÷[ù ò´nÍ·¼~[oõrã·ó¯?˜p»ùm"áŠý¶6áøßââ-—ßZ­Å¶àøm áæÎÏ’Í·¼ñ["¼-ì·Vx»ê·«„[Æo÷W¯¸&-¸ ~‹@¸‘-8„ã7~›à·Þ â†~k •&-¸‰ÏX€p‰¾üo.ž„·Pxk(·¼Ý<ÿíŠâz.ãóß*ý6‹p5~[˜püÆo#ü­ùÖÐo͉Rß‚ûðE¦ømmÂ¥Ã[|¿íƒ·eüoSðv ªæx›â·¶„«T\1áZZ­üpƒ[p«Žßø-¢ß,ˆ“úí!áµ%\„i7xKê·õðÖVnñöTmñ–ËoŠL¸†XC¿!¿ñÛR~KÝ|›å·N8)~œ÷ÁïÎò[jÂÝS\F¼µò¼ñ[%Þ:ùm+¼U+¼eôÛ­C#î‰pç×ökë·é„ö,¸… ÇoüÎocÖÄýüö…ßôwž¬JÂ]úʼn~ËN¸æÉÛ|ƒ7x‹‰·Y~›"·& ÚÁoŠ«yÁƒçz÷Ks¿!¿ñ¿µÄÛ˜æ[¿Ý{Ó‰~;ø-~Ûo‘ý¶ÞÖð¼ÍÅÛ`¿Õ¿W™ßº®²·€ßáøßšùmØš8¸ß®îé‡~®ßn®ßà Þ"øm¼Í•¿5T\ÂuòÛ\•ù áøßÂáßÊüvæ'§û án™›oðÆo•x[ækoð¶ß®XqÏ_‡¹~~C8~ã7~+g[ ÞvöÛö[(¿!\Íæ°mzóí€[{â-ßÞëk±+'/9*ˆÜû­ÉñÛâj^p€âºú­9á.é.á2êŽßø­™ßŠå6¸ù–Âo÷÷l¶ór å· W¼áÅr›Ø|;¦×¶xKä·b§eÁÛUV…ÂÛV~F¸&Šë¹Þ~kE¸²6Ý\ÂåmÓñ¿5ð[¥Ü7ß‚øíL î}•Í¿]dó/·)x«´ÙÚxKá·¶r ˆ·«¸Š&·V}Ç?ðÕjI¿(®þe_ ×°ø­žpÅWZû­žp©¯´ä·Ýýoüv/ßõ'ÿ_õ‡ëk¼M÷[@Â5±ÖÃ|Íßóãm¼ßà-»ßšã-Ú×Þ®*+,Þ† ûíÖ§×#cü†pÇoü6okû­Þ"ø-áúi-‚ßã­·ßnKd7¿uç¿Å”Û-Û“ßšøíÖùF5ñ 7Ìo—‹püÆo3ñ¼ù6Ëo³ð6Æos ×µÏÖÄošoðoðÆocüv ߈é·Þ„ëá·Þ„ã7~ã·|Í·{„‹ï·3xÛÍoãÙ6ËoƒñÖÕo·U²•ߢám–ßj*£ßnCžp—‹püÆoÓð6ÞoxËè·“x›è·‘„›Òp+ö›æÛ’x î7Í7xã·[àFÜ`¿u%Üáf%¿ñ¿5ÃÛÂ~›ˆ·‘~@¸él›â·Áxëç·ÛZÙÇoÑð6Þo1•Úo·kG¸®„{´™ ÇoüËo.ž\ÏoçñÁo] êF—ü¶9Þöñ[¿AfñÛ2xÛÖo·¸ñ~ëD¸®~ëD¸°§îŒ„ã·ô~›²:_Ão÷v oAüÖZ­Únÿô÷ý–7ßoãñÖÃo·³ƒßbâm˜ßB!ê/ý¨ð¦²ûm0ánçq#·áNlf8Â…Å¿ñ¿Eñ[ÞîUÞð[«W{·Åñ¼E¿-·2Åmî·Û£Fܽÿo?Å-@¸s›‹p1ñvÓã·ñ~›µLOí·ór{ˆ·P~k…®~m·zÂñÛ¼µõÛmÑìà·°xëí·~^À§¹Žß:m0á¦ø­-áÆø­-ábâßø-ŸßЗ雸­o³üVO¸†M¼3~»J8~Ûo;ø­ëð"û­ë†wòÛyÂEóÂ-@¸Ó›ˆp1ñ–”pü–Øo×úyýÖo1ýV¼[ÛÞdò$ÞúmÞZù Þòú­÷ðbú­÷V÷ÿ SÜJ~kE¸‘~kE¸°xËH8~ã·üvéÊɤý·²ÝÚö»sçñv•pü¶-Þø-ÂzÞ ×ê¾—mý†pÙ we3£.2ÞÒŽß²úmÖBŸßÎàm®ß.íÙÏvËë·&›?Ëo·Õ³¶ßz-šßÆì~ã·˜~«'Üx¿Õ.8ÞrŽßöõ[ͪ߂ûíäþíôl7~ï7xKí·c å·°xÛÊos Áo© wq3C.>ÞŽßøßJüvŒ·~;ÞÅ=ÚnüVƒ·¿Ý6ÈÂ~Ë‚·&~¶/ŠÕÓo¯ñÆoËø­†p³üVC¸xËB8~ã7~ÛÎoýäÆoãýoü–Åo#÷E¿õÀ[C¿Ýò܈²ßH’îúfÎ'\¼¥ ¿ñ¿-ë·g¸7Þøßøm½o¾UúmðލQS4¿uÅ¿=ûíÉ6ÏÅoKú­Xb‘ Çoü¶‘ßnÞýoqüöf’à­€püÆoü¶°ßÆïˆJ5µò[|¼%"\?¼½AÎxÈ óÛwÿ†¯m5æ,~{X¥ÁÂŽßøßÚ7ßbúmÞniŸÿÆoðÆoü¤ù6o)ü6oï!·˜ßžþ÷‰pϵƒßZÑ+&áømS¿U.囸í` ýüv’p•x å·[绕Ôîêk÷[ Þøßâ/Í—¿xòáÖÀ[|ÂÇÛÅõ†Ü”û—TB.¾ßÚ¢+ áøß¶óÛCÂo{F¿ÍZ·Å¿ñ¿ñÛ¿=$ÜJx»¾e'¹]½gIWÈÍ}þ[™â‚û­9·øßømßîžân;¿5Q\ÙKñ¿ñ¿ñÛ⺎a<Þn³Ÿå}OqðV÷ëí!×Ïoç‡zUq‘ýÖÉZÑÇoü6ÇoÇã·‚œÄ¿u ¿ñ¿ñÛ0¼Ã¼!\ï´ÝÆ@®“ß ÆvžpaýÖOYüÆoü6Èo=ÇoüÆoÝ,~k¾"ç·Uñ¶¼ßú=ä­^qÍýV3¤“¸˜~ëM¬P„ã7~ã·öxã7~ã· [~›ë·¹x{z÷¼x[˜pmÛnÇd*SS[¿5i >$\@¿ÁUÂñ[¿M!Ü\¿•îü»ó¿Uú­ŒpsýVF8~ËN¸\Ëq~ëñÖð¶¤ßÈ­ äšø­íóznVñ¿Uù­~òÇûíÒ»·ò[[ÂñÛÚ~«Þx¿ÝVÏò~K·wñäªx[pãñV ¹&xk¾ Ç„Ûo¡ÇomüVI¸­üvæ­úíÞøßøßÖk¾Eö¼ñÛk¹ÍÅÛ{Èõó[×'Ô.ˆßÆkŠßø­pM&¿ÉÓœ;5ßÚú­áø-ß.®Éðêýv‰p· ’ñ¸]¸ùv•p‰UöŽ‹ám ¿Å‘Û{e@ë*ÞÆ<[üvxG“ ñ‡püÅoç Çoç —ÝoWñÆoAüvžpqüvžpð–pyâüVÿvñ–Ýo¡Ún;é·1l{¯¸Â-†(~[Êo×pò[ùí!áÊÞ·­ß* W€7~‹ã·‡„k8¼V~{H¸ÛI}ÐN”Û˜…øÂÏì~ø^«â-/áRÈíä^‹î!ÛÆË­’p« júø-–ßî)®ùä7ôÛ=ÅÕ¼is¿ÕŽß²ûížâš¯¡ßî)î¶S8h§Èmä*|ºÜû­ÉEÆ[:¿e”ÛyѽÑÝô\ú:ÜÂvâ7~›–æ~kû¦qüV†7~‹I¸Þiî·Í³ÌAkžÝoÏ=·ð–èÈYIn‰ræéÞkÃ)ÈHø­¥ßn¼ß.½c¿®oývÓ‚ã7~ã7~›Ä¶,xKqäÛtÂÍR\¼ñ¿má·«oÇoVÃü&üÆoç•ÕÜlÍM˜oÁr ¥¸Íý6w<üÆoß«“ß.®oüÆoâpµ æ·†lë4È,x‹sðå/¼)~“7ùw¾çï7 üÐ÷o½iÄi{n¿Ù ~ã·ˆ„«÷[ÞÎ(î<áøíÞš(.f»†ßøßV’Æ{¤Ý+³ÚÉKœ¶áøßæø-Þ¦Œóáºúí@n ÇoMäVI¸°×Úñ¿ñÛÒ8/7xë-(NÛŠpüÆoünœç Wé·ã7:ã·{„ã·¶~+#¿ñ›ð[¿™Ï²â´}·†ßl¿ñÛj~k‚·úÜæ~;‰·¿E¾Ñ¿ñ¿-à}ðv ß|ûPœ¶0áøß&ø­!Š~ï¯þn/•Åo?ÿ{ý±—ª$\'¿Ç[} ng¿ÇÛUÂUnÈŸúÔ_ðRYüö™¿ú—½ÔÚxûÊßõ·-¹uáӾॖôÛÿ•¿ö¥ðÆ¥+'ݶdÞötÚ'þ³/z©,„k2«üÆoYýöZno*¬ß^ËíM ö[«æ¿-æ·×r{SaýöZnoŠßÒÉíM­á·×r{SüÆoÑü–e§<›íÿþö_üRS wiöN;¿ñ[>¿È­9áZùí@n5„ã7~kµrkN¸V~;Ûz„{}åä2„;Û0ÂuõÛÜzŽßømÕ럩öZno* ázì„ã·¡~€·†„kâ·3x+#\™ßjžÀoÁýÖo ×Äogð¶ áÞ|ím ¿ÁÛÂõóÛ¼å%Ü>~Kqç’}¾Ÿöo¯{qA×igñ¿­é·&„ì·7„kè·ó¯ÉoyýÖã²É„ì·ì„ûðž% î¼ßº.‚ß:Žß6ôÛm鼿fò¡â"®Óä7~Kã·Kx â·Kx»Ú‚ã7~Œ· ~»„·Ô~;¸ádjÂ]Â[F¿]¿ñ¿ÁÛy¹=×óoÍ%\¿=¸Œßºn ¿µñÛÈæ[Â÷Û¥ÜU¿2¿$\¿Õn¼ß’îáÓòîªßú.ˆßz.ÔWààm áÛ›ÛK^õÛ á†)îýîèwÉ+¿ñ[¿àmºß ðv©wÉo#ñÆoÍýoÓýV€·Œ~;ù¨·Œ„+À[.¿àmm¿å]VæòÛ2TûP\x{öÛë·ˆæm~ã7~ã·6~k‚7~kK¸~Ãæ·ÔxKJ8~[ãÊ“„K½¬Œà·[Ÿ»†ÒڙߪôÛHÅñ¿ñ¿µñ[L¼ñÛÂu3¿-à·t„ã·eüöpð6†‰¨V̧&~{UdÂmè·~›Ãoü6Ío·+—>¾ÔÛ­¢óv€º¹Ç¿=T\ïóÛxKG8~[ÉoŠË¾  å·¬GµÞ~» iÄ¥óÛßôËÿȇÅoüÆo…~»D¸7¿U|ÃÉ‚·»$7~«j“ÑòÛxã7~Ë"~[#]©6Ào/[pSÀsoÃÇoüÆo×~¥ Þ®¶Ýø-È8ùm ¼å"¿ñ¼¥¦ÚÈ›ò—±í¤ßnq½¹ÞÊ<ÇHC8~‹ë·ñØÓoÏ=·Áx+ž¢P~‹O¸Vm·¼ñ[L¼%"¿ñ¿%ÒÚÈw¯ÔZß^¶z[¿áÙÂñ¿íë·ól»‡·¹ÕàߦŒ­˜müoYÇoÃü†pæíÕ²k­Øo—ÅoMŒ“püÆo“ýv{ÕX»W—Æ6·íÓoÿáwþ­·oíq½T¶5I=Ûø->ÞRŽßø-Þf©fIªÑ¿ñ¿ñ[8¿=å'|Ÿ¿Ôä  ‚·˜~»Ç§ñ–‹Æ6~K·ø„ã7~Ká·{þɨµñc˜¢µÝüÖÄ<üÆoüÖ×oAðVÍä‡x ë·{–PÑØÆoYðœpü6ÒoÏyXÌv^¼ö²BÕ¶Z‹ã·Ïã7~ã·]üV·’NrËâ·øéÊ6~K„·È„ã·Á~ûìÏÿ=MŒ7²ÂâM"k-ˆßjðÆoüÆoKùm¼}(·~K·1lã·\x K8~é·3x ˜)¨ƒ·ìZ‹pÿÉJ¼<½’=üÆoü×o•xkrÍdX¹åõÛ`¶ñ[:¼½.”âøß*Qo´Óoõxß‚ã7~ã·^~kŽ·K¿¾¼ÜÒùmÛø-#Þ^+Žßø äàma­•ù-Þøßøß&ã-…ܲàm:Ûø-/ÞBŽßø-äöÁÛòZ+ð[@¼ ~Š¿ñ¿uñ[R¼e‘[|¿Åa¿UÊm.ÞâŽßø­ä®bla¼m¨µ)~k.·Á-¸g›¿ñ¿}à·Yx«ùÂ[.¹…Å[@¶ñ[ ÞâZÓ ÇoÃü¶ ÞîYn+¼¡ZßÂâmʃ¼§‡ßøm¿ã­þn%Ç[Fn¡ülü¶ Þ"ŽßÖóÛø½?÷MŇ\F¼ñXC¿Ç¿ñ¿¥ô[X¼}H²¤rƒ7~Ûo/„›¥8~[ÌoïñJq÷ —Îo0Êo½ñv‰püÆoü–Ûo ñv@²×6Ë+· ~Ë%7~[o¯ÇoüÖCnÑ÷r¹ð†aÅ“o][pO?µøßøíßZáíÒ¯Ÿï¼q¼ñÛæ~‹·Y„ã·1~Ð|;ã·h„ë·ßù­kÓ¬áKeÁÛÕ\oŒõV¿­é·2ÂÍõ[á¦àív½ù–ZnAüaéüVF8xËN¸\ëøüvoýo±]6mñ6Xn—üö¹?üViý/þsÖ0Åñ[P¿Ý†·àê'¼ßòâí–-Ûâ­rõ>Þoƒå– oSoqüÖc ]ývo —Èo;k­~6ÀÛ0ÂÝÃÛ‡„ë¤8~ã·¬~‹€·¿Ýrf7¿µ¿ãí–6# ÇoüÆo;ømîl¼‘[R¼ ðÛÓþ_ÍÇoËúíášL~ý€Ï®o•w+ÙÙoûà­í`šl{½ß.Þ.n˜â"à­ëR~í'wó¿õÖZ儼Á[Í›ÎÅÛy•ùíXhg~ •»ø-®ßF.ŽßNîªß:áßÖÀ[§!ÅñÛyÂÁ[âB.ïR~ó;OòÛÚx >-+ám€ß*¦I#Žß÷ÛCÂ5œüV~;&Ü“Üâàm¿-Œ·~k8­üöpÃä¶ÞBn¥ü”οñÛ2Z+˜™×?o­^ªŸßš¯`î‰Âo±üvOqÍ'ÿi´Ï¸z]¯óþEj^°‰Üøm%¿u^óhè·{ж7דÛkÂMTܰm³”)7~ƒ·Å´v~ŠÞüÀô/¼µ}Ùø~»U4âø-ºßÚ®kîócM„6o÷üv•pð6 oIaÐÜoS²dÛm®â¦l×Ój>×Ýäƒøí*áø-2ÞÖ;þ#Ü­¤Ç»<ôÛùÏ¿à¹fùíµâ.‘Œßø­/Þæ¦-Þšø ÞÆã-û_Öì~ÛDn +îý¶,¦¸çÍé½Eð–ÔokŸ¬*å6 oüöòÏç×Ãoo Ço‹ø->á6ÇÛyÂ¥;³Oô¶-à· åv̞Šº€âÞlBÂE›ŸÝð¶Ï ª^n#ñÖƒpﯟå·d~‹§˜m·xÛÇoîY2ÅlgävÏNãù„m=ø´0 g)¨ ÷$Ü’~ÛMnKâ­!á.AèÒ3âøßù-ì=Tàm¿¹gÉx¶å¶- ©Y}¿aí¸o´[#ÞÈ-2Þ¦ø-áø-Ÿß&"*KÛ­Þvð¼ 3[¿çt‚œ†ÛȽ©&/árÍ_½©&/Òû.ø–ºrr¤Üâ­áøßÆùm ¥àmy¿Á[W­u5Û±¸šSEv]L¤5tÝ`¤$¼¥ó¹­$·Y~+#ÜóP¿ñÛ©÷‚·µýö$7xkNµ¤OÜ‘5„³ðÖi¾‘[p¼5!\„®r«ùVó[V¿ #Üæ_xÛÁosåvËyÏT‘Uqšoä–oüö?ýëßë©¢íw~㷣ׇ·åý6o·ðÍ75y¨¸• ·^óÜVÅ[=áøßFû­á"Ëm"ÞÖó¼Ñšå©ˆœ‡¿EÃÛz~ë-·\x»unÁñ¿åð[d¹ÍÅÛb~ƒ75餸¼Ó|Û\néðVO8~ã·Ñ~kË­tm·Áx[Éo›ã ÕDd äøm.Þ–ñ¹ñ¿-å·&„ .· x[Æo©ñVï7r‘ÁŠkø„“¿XöÍ·må–o•„ã7~Ëç·ør‹ƒ·ü6ý9õ~«”¼‰HÝp«áÃñ"|—bÅMŸÆ“Š7~kï7x[oñý6o·<_iB3°¹ßàíä•).Âd>|ö7¿ñ¼ñ[b¼ñ›ˆðÛž~ƒ7x;ó^Wp>ß@n ÞømY¿yNÀ†~›Ž7~~ÛoƒçÞÂâíäÛ]R\Øçžtäø-™ßàmy¼…%ÊÄ{–ð›ÄÌ¿õ¥?㹌Ùò[W¿ át¿e‘Ûx¼]zÇ“·© ;·ÏùÂÿè“üÆoðÆo£ý¶ÃäÈžr{9o7à B¾ìó«ý¯ßñç=×zŠK´Svö¼ÁÛ½µwÛ7ýÿ÷O{©‡‹<ÏüÆo]ðáïÁJx‹I” xã7 â„ÏÞMVöÏ/òs¿ìË^ªÞ oäöº–QÜ€òu_ñ¿TåNÙÖon[²Þ*ýV¼~ø¦¯åö¦î.øœO!¿­ã7xÛÓoqðÆo2 ÷œð ­äö¦ÊÀpOnË(îäN)ÛÀ÷r{Se¯Ìoð¶3Þ*Ãï{ ·Ô„ã·Ü~ƒ·ð(¡ð6lr~æ¯û)ÇE2äÖpåV¬¸3xË«¸K;åªâÊ­Fq{úMó Þ.-¶¯¾õ¼.òüó¿Á¿À[.¿ðŒè¶bÛËÒ¼9^~ì$Þžëõ/>öy¿=ÕÃWN½SžÿÂ>ÜÀ—8‰·çº4uüo{â­àÛÃoéÇoüÖ@nðÆo³ðÖ|rÒ‹â–”[Í߈Ûý{!¾ù÷—ðöì·{ƒ|óo.áíÙo÷^y™r|e*‹F¸DÍ·Ôxã7~ã·™x›å·˜xKä·x›è·‡—JŽÇÛÁMð)Þø­7áæî~ã7Í7~k¸[ùß"úm<á‚ܳdáòúmüóßÊnð8ÆonJ¹ Þø­+á¦ï~Û™p‰ü–ô¶%üÆoüo)ü6 o)ü6 o#ýV¬ ax»ç7¸txã·~a§ð¿¥À¿uò[sÂñ¿ñ[ôæ¿Mñ[ ~‚ø ááß:MoÂoÛú-Wó-Ý»ùßøßøßþ¿É©dO¿Å$Üó=ëk%¼ñ[I޳Søßøßøßøßø­oÿm¿Å!\swÅ\“1ð[Û©µSøßø­7Þ‚ûíÖô.”üÆo× ³žßÊð6˜pñýv[÷þ%Á wr< 7@Ys×ê­ù­á„GÛ)ü¶§ßZ=9à¶èýKøßøÍó–õ[X¢Lñ[ ¼Ý¦>? á¦\å8¥×ðíø­Õ´Ü)ü¦ù–Âo©ñÆoüÆoüÆoü¶šß.ÈÆÑö-ø­ÉäÇÜ)üÆoüÆoüÆoÓü6€pYð6†pÁ•2˜p‰†3 o] ð†"½GÕü•ù­~„Ý)ïÇÖÄon/’­‡·1„ËŽ7~ã7~›I¸\~ëM¸\~ëM¸\~ëM¸âQµ%\L¹õnÇõØd~«Ü‘w ¿ñ[|Âñ¿ñÛâ~ëD¸ñ »&~ëD¸DJ@¸a‡Dó™ %·¶„‹/·Nî´ÕüÇçüFn1ýÖ‰pƒOÅðÖöûfüÆo‹ø­­âf­çZù­­â2*¥Ÿâf&ŽÜZ.—Ü޼߆ó[M¾âÛýo»ùíÞ¡Ö3•I$·~xk®¸)»’ßøß&û-u6Üä‘~3-ÁSì·tm·†›ÐuÞÏß@‹ß"ì”7Ç¿äÜøáõö[æî¸~x î7Ïïæ7~ã7P1-·€Üj6§÷¶ó[4¼ñ¿¥À¿ñ¿íë· =ÃobZNn1¹lÚ˜Íox>¯'Ü¿•.‘ßÚî”zÂ< ùßbú­+Þš`ë wÆoe„ã7~ÛÔ3;ãßÌÉyÂ-,·ó<6 Pé·3¯Yæ·óÊoç´Í·2¿eüÌò¿õþÀVúíÍ«5ô[§©ã·¬~ÛJ5ülæä!ávÛC©Žœ„¶TxÍ-~ ²S^QüÆo[ùmÞš`_¹Sóßøß®ùíO|ægl[üö¡ß^nD¾a½'ÜVx»§¸ñ“Ж e„;óje„ë4i]ýÖ|§”µà®~6ùßöô[Ûlq îÍëû-Èä·Ä~ûÑ¿ë ž`­zàU6©Ks²ó!ñfE¸'ÞÞ(nÊ$ôóÛyÂ]õÛyÂñÛ­ôAW?›üÆo›<3 ÷¶Œp—ðÆoüVu°>á-æiº-çàí)ŸþU_»›Táíßò%ß¡²VòÛÏù“{e­ä·¯ýä/¨¬•üö?ûûU¿ñ[v¿WYA³nI¿]}®Ý¬-ã·« ›¹eüvi[.áßøm¨ßêå6rÏùsŸø'‚Ëm$äzû­^n#!×Ûoõr ¹Þ~«—Û0È-æ·z€ñ[rÆfüV/·‘›ÜÛoõr ¹•üv~søß"ú­¹Ü®ŸßšËmáúù­¹Ü½ ÃÈIDAT®ŸßšËmáúù­¹Üzn=¿U,šßÆàmÀN9æYÙó<–ñ[s¹ Øê~~k.·„[Ìog¶è*ÞøßFø­Þº®“ßúá­+á:ù­Þº®“ßúá­+á:ù­ÞúnI¿Õ0Œßúí”{H+~ã~뇷®ÞÉoýðÖUëùíx£ ðÆoü¶‚ß:.©ß:.©ß:.©ß:.©ßznU¿KŒßøm1¿uÚö¤~냭üV†7~ã·î~€·D~€·D~€·D~€·D~€7~ã·ì;å=ÕŠñ¶†ßà-‘ßàßê·‹ßømk¿õ \^¿õ \^¿õ \^¿õ \^¿5'ÜÂ~+ÃX(¿ ÃÛÈòl5xã·¹›Ÿ×o=l°ªßÞoZ1ÞøßúúmÞRømÞRømÞRømÞRømÞø­·ÇømÀNyaÛæ~†·~†7~+Þº¼ñ¿ñ¿ñ¿ñ¿u!¿Ù)Or«Ä¿ñ¿ ûÀ>m`%Þøßøßøßøßº.ŽßFâmüNù;¾ú·ö¿ñ¿ÍÝ@~ã7~ã7~ã7~ã·k„;c3~ã7~ã7~ã7~sÿ÷/qÿ÷/qÿ~›ì·“<ã7~[’pñývsÿ~ã7~‹ï·{ÊóÖð[Ùðü€5üÖ|Ø»ùí¡Ð‚øm0Þømm¿õ¹çð¿ñ¿ñ¿ñ¿ñÛ¿#-‚߯ãßøßøßø-·ß®Óžêá·„ë4=ü6€pf£‡ß®ÓlôðÛÂõóž~;p¿ñÛb„ë4ì~@¸5ðÆoü¶—ßâ.—ßz.—ßz.—ßz.—ßzŽßnºß¦àß&\.¿õ&¿ñ¿-î·N„뺧úù­áºÎF?¿u"\×Ùèç·N„ë:ýüÖ‰pýF»³ßnÝ”’ßømÂup?¿u"\¿Ñò¿ñ[,¿µUÜ€=ÕÕom7`6ºú­­âÌFW¿µUÜ€Ùèê·¶Šë=ÎÍýöÞlsý6 oü¶˜â µ«ßÚ*®÷8ùßø-¢ße€ße€ße€ßeíó¿ÕŽßøM‚ø-Køßøßøßøßøm´ßnßz-åD¿MÄ¿ ¿ñ¿ñ¿ñ¿ñ¿ñ[&¿ÍÍ\¼ñ›ð¿ñ¿ñ¿ñ¿ñ¿åóÛ,Gñ¿ñ¿ñ¿ñÛ^K·§z)'SSáØ8ž óÀoŽO©éxã7á7~ã7~‹î·õjù ,› SáØøp6žÐò³¾ñêÿmïîqœYÊ(ƒÄ X„7„‰Œˆ°¢ !,„ °)9K@ä_2X²dÏt»º~ߪzŽŽB—ïç´]ös{f|+¿êGÿúk·òÛì~»af·ÞÞÐë£üÆoüÖÜo"⦓N1…ßþíøÍ(™=üÆoü&"Ðb ~¦)~ã7~ã7~ã7á7~›ƒRüÆo"üÆoüÆo"Âoü6‡£øßDøßøßD„ßøí‚ îˆúé~·'áøß„ßøßøMD ÅøíÙN£ü6œpüÆoÂoüÆoKù'­a•Ö胖?~÷ÏÂò[‡‡Ä‹šøßÆúÍkŠ5øßømüÙ±ÒQb k¬±Fk´”Ë­ä6÷Ûg2 ôÛXÂñÛp¿yM±¿ñ¿…;;¦>D¬a•Öh‡–êrkM¸ýö%–øßúûÍkŠ5øßø­ÂƒÕ·çYà ¯Ñ-íðÖŽpÛúíHJcý6pü6Êo^S¬ÁoüÆosøm®CÄÖXlIýÖ‚p{úíÄHüÆo‹ùÍkÊ’„ã7~ã·1‡©5¬±’ß:àß:i¸ßFŽß†øÍkŠ5øßøm&¿ÍrˆXÃë­1¯ßªn+¿=>ä-¸ß†Žßö›×”õÇoüÆoÃþüSkXc ¿uÿµ¿ñ[7¿yM±¿ñ¿ñ›óÔÖà7~+âP¿õ'¿ñ›×~ã7~ã7ç©5¬Áoü6þÇ%ñ[‡‹r¿yM±Æ,OØÞþôÃoüÆoüæ<µ†5øßz\ý« â·Öå®*ŸyÍo^Sø­õß÷qç­œpüÆo~~É‚Gª5¬áç—ð[Ý«ŸA 8~ëL¸Î~»ÿ—BÅùù%^Sø­éß÷ùË&ùßøÍÏóµ†5|~€ÏhûÈÿ5½(Ÿ©S‚~óšâóÚý•?Ï[!áøßøÍyj kð¿ñÛô~+ñ¿yMá·ž~+$¿ñÛô„[ø˜°†5â¯Ñ-Óáma¿eË'”ßz®ÃE9qNð›×kÄ|žüÀÉlÂñ¿MO¸µO kXcO¿µ&¿u0¿5º(o‘“¡ 5üæ5ÅÑž°çŸÀoü¶#á69,¬aÈk4EË,r[Õo…àá·%Q8W!´Œß¼¦X#Î6å£ÞòÇoüÖõIëì°†5[£ZâËmI¿•k'šßº®ÝEIçÍÎ~óšbOØôÏéÎ ¿ñÛÈ'°SÃÖ˜}!h‰~ã·8~»ú¯ç7¯)Ö˜Åo„ã7~I8'ˆ5¬Áoüð±QÅ9üV÷¢dØ&ýÿÂo^S¬QqKxË ¿ñÛHÂ9A¬a ~ã·hZÈ è·>„kqQò`Ão^S¬ÁoüÆo#¿Î b kð¿µ~lñæ?ùË£uýö³ß|{”ß.Áæß¿þí£…"â7¯)Ö¨µÆÞ~ÿË¿?ZH8~ã·i~(¥ÄÖˆ¹ÆÍ-7j„~{–ÛK ýö,·—òÛ¹jžåöR~óšbh~{–ÛKóÇoü6RqNkXc™5î€Ù¶k<6^ls"·ÂøíDn ®îEy!͉ÜJÇo^S¬Qe¼ÈíKÂñ¿M@8'ˆ5¬a òØÈÀÛ9áŽü–‚·¦„›×o)xûL8~sŠZcˆßRð–G8~ã·‘„s‚XÃÖÙývD¸r¿5"ÜD~˸ù–G8~óšbò52n¾}&¿ñ[tÂ9A¬a kHŸÆùc£o—üv o3ú­î‹fÞÍ·«~»„7~óšâMñÛ%¼]ºw oüÆoõŸêNkXÃÒíÇÑÃãÒÏ,I'\¿µ \(¿Îƒᜧְ†5ö|çñ¢~ rQžaÃoÎ kÂ>Žßø á¶8JŒ` kXcàÙ·àŽ~Á/ýv‰pFkê·êѼ[pW™4oüæ]cì[pG¿à—~»D¸F£íî7„C8ç©5¬a käîªßÒ Ço¹$Á$~snX£|<Â]õ[:á–Á[D¿ÝKq>Íyj kXcì—wþKøí-áÚ-Öo-.Ê%•0iˆÜ:à͹ažk\"Üù/uâ··„k·¿ýßÍ·ÖŠC8ç©5¬a kdðæªÜRüv¤¸Ö‹-à·#ÅÕ’RO¹ñ›Sty¿).å—:÷Û‘âZ/¶»ß¾ÔZSÅ!œóÔÖ°†5ú'Åoý3£ß* §ƒ”øÍ)j/ —‘¿õÏÖ~;GZ;Åùv8ç©5¬a klè·Ûßë^~Û oÎ kð[­|ûůöõ[¢Í)ᜧְ†5¬Ñšp¡üÖm­/Jç„òÛíÓíÏãܰFç5ª.”ßnr»õcÛûoWIFq›1ÎSkXÃqÖ(O¿õ¹çÖ碔k'ˆßzÊ͹aQk”.ˆßr»‡ß+ᜧְ†5¬ÑˆpüÖYn.J!{†û­¿ÜœÖ¸F!á†ûíEnc 7Òo…«®8„sžZÃÖ°Æb~ëö­nC¢%þë·¿»sãÖ(!Ü@¿Ém á†ù­½nÉãÆyj kX#Ú%â·lëù͆Ð(AºíæÜ°F„5² 7Äooå6ŠpcüV]uoÄ!œóÔÖ°†5ê®§ßÆÞpã·ÈrsnX#Ây„ëì·t¹íâ·F@q+:ÎSkXÃ1×ÈsQ¿…b[ç‹’‡¢n”º³-λtnXcø„ëæ·«rB¸Þ~k÷yÜÕ}„sžZÃÖ°FÂ5õ[@¶õ¿(:jª‡Ö¢±Í¹aPk\%\k¿ÝÙ–'·þ„[ÍoUoÄ!œóÔÖ°†5òüö¸!vÔ*l +·þÑ)}6ÕQËÁæ™âܰF µó[9Ûú®«ß:à­úïåÛᜧְ†5¬qÕf)¬JùEÚñoɇh¹ÊÒ¥7؜ֻF:áZø­®Üz®Ÿßzâíñ;VùMÎyj kXÃ⢸(Ö°Fõ5 W×oäÖpüÖoÕk„sžZÃÖ°†¸(.Š5¬QwÂUñ[•orÛÅoñ†p“žDÎSkXÃÖpQÄE±Æ&k¼%\‰ßº±­á¶ðÛ‡¯¥œí0ržZÃÖ°†‹".Š5öYãœpy~ë϶>„kî·x«û‡ñípÎSkXÃÖÅE±†5ºî’߆Üp[Ço¡ð†pJÎSkXÃÖpQÄE±Ænk”.Û:n;¿}øv¸&ç©5¬a k¸(â¢XcÃ5Žwä·€lkM¸†~‹‰7„›âlržZÃÖ°†‹".Š5ö\ãKÂ=ûía¶°lkJ¸V~KÒŸþ··½ÿc§ªªªªºÃ¿ñ¿îEq7¿u6Ûþûã·½ÿc+øí„F)`K]­?§o‡SUUUU øE[ÂÕýüî°¥ˆ®5á:ù­ ÛÚ)áTUUUU®5Þª°í­â*®¾ß^8ÔBnÕçk)UUUUU£)îíG{G“Û‘ââúíB­åVWq§ªªªª‡píðÖZn_*®ájúmÞNUUUUu1Å5ò[O¼µ \}¿õ—[EÅ!œªªªªjÂU÷[¹}V\9áªù-Þª(áTUUUU‡®®ßÆâíÑ(~»™'ˆÜBŽâTUUUáÆâ-ˆÜjnY¿!œªªªªêæ~‹†·rÂUð[L¼!œªªªªê¤„«â·˜x+$\©ß"ã áTUUUUg$\¹ß"ã­„pE~‹7„SUUUUËo;àm€ßn.šÅoqGqªªªªŠpMý6Þ² —ï·‰ð†pªªªªªü¶á2ý6ÞNUUUU5¾ß¶Â[árü6)ÞBù áTUUUáêúmF¼ñ©ªªªªòÛš„»ì·©ñVè·„£8UUUUå·r¿Í‹·K„»æ·Ùñ𩪪ª*¿mŽ7~C8UUUUU~[pü¶ Þb~%©ªªªêæ„ËóÛxK$ܦ~‹y áTUUU•ßø­‚ßÃ[Ø[p§ªªªª¾~rO¼¥ŽßNUUUU•ßòÛzx‹ áTUUUÕOò¿Ms áTUUU•ß¶Â[¿­Š·)ü†pªªªªÊoüÆouüÖ‡p§ªªªª¾ùm¿Žßæð©ªªª*¿ñÛÖ~C8UUUUU~ã7~C8UUUU…7xã·x~C8UUUUU~ë@8~›Ïo§ªªªª+áßø­·ßNUUUU5oüÆocî¿Ýv÷"œªªªªò¿ñÛŸâÝSqÎUUUUoüÆoýüvòe“ÝnÇ9)TUUUu+¼ñ›¯Ÿlø=o} çÈPUUUÕéðÆoüÖÃo·Y2~`IkÈ98TUUUu.¼ñ¿5÷[ùš¤8UUUU%·l¼ñ¿ øœ€v·ã%ªªªªo÷·ÄGVá7~+õ[£yk9gŠªªªªF–Ûã páøßÆB·Ûqªªªªº6ÛŽÞô"Ü[¼íî·hxócNTUUUuI°%Þ®¸J8~ã·j?jr ȉˆˆˆˆô|sûöŸ¹D8~ã·‘·Ý@NDDDDV•[ú[ÙtÂñ¿EÄ[öC_DDDDdÆ·¯‰„ã7~ ·—§ȉˆˆˆHØwª…ïWS·Þ’ü¶*áæÅÛÉÓƒèDDDDdì›ÒŠ¿ìž„ã·Ë~›oMÿ…‡ˆˆˆˆÈð÷œo Ço»nI¼½}j©ªªªª–·çÚ›gÎIÃoëûíèï¸ÞDDDDDÖȉjöÁÛ5¿Ýþsa¿‘›ˆˆˆˆHpÂñf¼]ðÛÇB·ààMDDDDd^Åñ[ªßî…7H¸êl‚·k~{Ï~ó o"""""ó*îåYoÛùÜDDDDDV"ܳ|–Ç[¦ß&%¹‰ˆˆˆˆ¬­8~[‡pä&""""²°âf$Ü%¼mä7rYžp·.Œ·"¿MD8xÙGq³àíöŸ]ý6áàMDDDDd7ÂW\Þ*ø-2á|ÛˆˆˆˆÈΊ[é+'«ù-&áî$Z„[oÕüpn»‰ˆˆˆˆH@•୦ßâÞDDDDDä™pAWˆ·Ê~N8ßð&"""""Ÿóø‘!åVŽ·ú~»nˆâ|Ûˆˆˆˆˆœ¤?áîl«"·V~¢8·ÝDDDDD$…pÝW‘mÍýÖMq¾fRDDDDDB)®î=·~~k­8r‘lÅM$·~~{VÜ£å÷ÜàMDDDDD WKq­åÖÛo'œ;GÚçzœ‰ˆˆˆˆH]Å=7ý“Tÿ %Aývd9H‘h¢¢µ ~~á7á7á7~‘>~SUUUUUÕ°½+î +"""""2EøMDDDDDdŽühQwy“U{¾IEND®B`‚visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/example-90dpi.png000066400000000000000000000234001147500217100254400ustar00rootroot00000000000000‰PNG  IHDRb¤OÊ&ÇIDATxÚíÝ Ì7GYpT£„¨¹*Á`4Ä Ê%•O RŽ"­ÒV-(E(A,XNËaD åh8Ú WD«B1"D1A W<(ÀÈi”¨ëÊÈd¾9žy®™Ù}&Oš·ï»ÿÝÿ5¿ï™s¯·,Ë™ÿv ‹4–¯•ë9&+V¬XIŠÃÁ˜°bÅŠŒ‰[â©Ù°·ÏŠ•¹Ê‰OŸ‘ )+7}óÛ²aXX±2—~Ý#²c1á(aXX±²#ªX™ÀaaŸ„+Ã64ªF„X´b¤°beÒ$‚ÉÃk€X±2uH‘a‚m„ wû¬XÙÖ÷‰HŠ&L¨Hñûç=ÛÂ☱¹‘1B#<Ë×JØ:Ø?V[$U ÌÆe"”ŸVTuøáw>ÏÂb¯¡‚E:œ9 °¦ƒ…ì‹txBhDo&R)- ûÒX˜¾ÊŒ˜’ wf|¿ƒ}W,L ¤¥IÖ³2lbٷĘ@J¯Úš`¤ÃŒ°°Ðe"ꪨ®ìÜ!öå°°ÀHá±ØŒ ­éUf„…E;&:dõY˜l)FØ‚ÇD;)êk:Ø …aaÑ™‰FR ˜`HÁè’°¯‚……œ u)ûM¤ a_ E&¥ í^…—ÂŒ°°Øœ )Jg@m™ë†i¨¡òö=í;?ò0àHõ¸ún†}ã-ú0‘"%óp˜ÒÎWÛ£Óz¢ß¤O =’ZàOÑ»€ü½^i]Ó|ɤÀ?{Ÿ$M€¯ŽW€ð)b0,&b"J ñ±9<)à‡`ïúU•¢uCóRÏûâðï C !Õ#Ù_ÍþÁ{òÃ2A­íøSmÂU …ÛùT™hšD¸÷«Œ´B…‰lZ1]¢>aü“މÖï¼ÊKfKÄB‰¬­(ñªSþÁÀÄCþäqQ°sŠê™~Ï.zÔå.ÿìd¸þû_?TàëØm¾r¡ÀÓm™(=ù+Î|¶0T^²ÊkÄ09†v«a‡Bõ¢Š¯0"•Â3‘‘•¢jòIFß6oDUŠ)t€±¸Ëýÿ³D ÿvmÅD; JX0^²°Ètƒ|Gò>ó¯š 0á¥PaùRÈ·Ìå5õÇaBn„:©³Šw÷œ‚‰Eã~…Zo×LüÖ“/ÉF#)0ƒ)ò ø›2!|&e¢Z[$u ]¶¢+Å"»ï´?Éw\ü陘(ÑH ä°«Êí|ÆL%ªL¨±h s¨ü³¹?&´ŠŠã2± f[PÏÄÂÝImTâ LP½0&&fbQZl®˜M _ã°©Ì„–ã0o’LÑ=1šÛ÷M´`Ù7!L(¨Mý¡˜À÷)¨Ä²E!Rw“b“·B(E§miª ¨3,$&àS)2¡òÒŒ‰v=ÿGK(z0á+$Ôê­"‹£¥ÆDÉ ­Îc¢ pyîågáuðu›}ï]&0MýÎF­{õæbBøªGa¢*Ì‹>LôO%Œ‰jqaL ÁÉ‘’Qeþॷt!ïà3‘5"ª™2ÑYŠ¡Œxò“^yaíŽÑ™€¥HÓo„\ ê€(Õ_9û±àfa–°@^bv#Ô›!{M(Æbb5bsþò\Ùj 3Aj€ôab“Tb¡,$ÇlQµ&²F(JaL4g"mqð˜@€¡¤3ºß öùñX´fB—À-)º1Á;áôL {%ྠj¯g#&ØR´f‚,š2¡ž˜T™è)…ú%š&Ût¸†£2W™Î€l•ô\è5 ¡ƒô†bŒèœP´»Sé˜p.ø`÷ `ŠRZ1 ê Q­Û 7Ô ¤*R"&ð.𤓏óàGCØ¢»abÙɹƓ ¶˜„‚qª™hÑ­ÝÔˆY˜`!”˜à0á¸ëe¯EF»„‚Ôâ2±m*!—¢Ú…9>l#&•bz&ðF¤0&ÔAΞØÊ<B#öšP슉,¥„bv&ªOƒ7÷ Yoÿ7r#$•ʘèÊF FBÑ ÅT":¿¢%†BÁ„–ÆÄÐ}$)S­Ú1‘­º*F”ª±<­è¿ô«ŠFL'ź0‘…*fâöŒLT!`K1/U&Ô`W-c‚ÌÄŸsz)|=ÖwHæe*2!lqà“FZáŽß%Œ˜(¡Øa6{Qm€¸ª>;*9¾wÓ£XWG`b¢I±çF @Šé-z€ vÝ®^zC&Z1Ñàè˜xØÎ̆ÇB(Þu&x E£ñ‹ì0çQuRŸï¨¾ >¡Ë úÑH ö3Ù-%#´¤ ñ©ý®:QUÇ3Ñh6²õ®¸¼J}7šÒ ;ë gbánÑâ„»e#E)G(m𔂺(>¬ó˜•—Ý€èÓŒ÷ÿÂ7e»"_<ªû|¨'w[< )Òä½?1a!Ùñe@,F®ÀS01ïóß¾oÉ&­ Œì› d{ÚM¸îóÿber)&`SªL(JÑš +&Ånžöp³0‡’˜°bL,ݶ¥ÑeBK cÂʶRø›áïB–>óØ î!Ú‚‰ש)”˜°¢Xñ0;ú+Õ"C0A’Ï„JZAbÂbÑY IE]râAת<Õó?|ï0AÚn[K c°hÄ„ÊÝIÅ E–†nRÆ„®º÷:×bB(E×ûtøÊIúHaL˜ºÝº= Gdâ^ŸýR›b=r}Hºš€V—L LyÎÃÿ QGéA™ =¹(°T)ðLX÷þìåÈLH¤˜’‰ê +ÈôИ‹ ªÈî‰RZ1ÔÛ©òÒ¡üó ^F£‡ +…1Ñœ‰oüÀ+× 1q³÷¼|jZ1,Q%¿ìU÷ yÈ=ÞöÌêCzá~þ®w¾t€êCÞõsç®Q}ÈàM!ï:ïl*>ôê£0ဣʄ" I¶ÒŸ‰¨V¯@„Qªùáÿ®@D±)a¤Çd#û) 6+a`˜XˆbÏL¤F¤RD_ýÔˆPŠñ™ˆ^NdD(Åròà1`„O+ú²ÐÿsjD(…?8|HjD(EtðøR𘈌ÈJ1‘±+&0©„ žÝÖt`ŒH¥¨‘JÑ‹¨W™HRe¢¿™È‘J2‘5‚$Å¡™$}˜H«.†‰µ\pñKHLtH+ÒÚ‹aâ¥oº3†‰žR(&ÆÄLÙC êÜ*#Z3ÑNŠl½UdyÅvR°?eªÆÄ4Lðæ_NÁD )J5¶)M¥Pü”‰Qº0KRDÇà¥(1¡8ɨ«U#"&ª]˜M¥ê*ƒ‰’Œ«·0‚!…V»ãÐ]˜‹Ò€h*EzÀ8LTk)lDÊD*…ð È(I2‘J!|a¹Ïrš‹‘™X4DI—;î,ÌlÁ\ è`¦¤Lt{uÿ1Ï2ÑâiD:x/²plØè@›…¹%é’vÝ.L­ÆåL¸'séﵡZLÀO¦š>d­º0‰~K¿R”PÐ]%1Ñ+Z¥pÑß&ülî”$Œ†‰1± ¤ý#¨•-:íþî\|+#­]ºÑ äñ^D«³$Ó¨IL`®[jG0JÚ0aÄøLL³ßÄö˜êí£´- ž›UŠ5ú/yH/×H‰D0ð­¦ ç|åŽËeeâuøUõX™Ð:ÕL”ŒèºóÎsÕMþ:û&¨X´X|¥Õ7¡.Åûïû‹iX£Ã˜à—b"&",Íe“‰¬<)Œ‰Ã1‘B±Ó ÝË)˜Œ`HaL4dâ‚;}ʲ¾½ô ñ±&î}ñÕ.ðL¼çÞ÷1oºÅ[| ™8ãŠK}ô—B‘ ‰—Ÿv¥ <ï{ý }슉ªH)B#ðRtnt /çf"¢…l&B#R„F¥`0áØ6•ð@„3Áb>&R#²R„U.5)…"Š*i1¡(‰Ôˆ¬!©)¨L„ lØÜÐb/…1¡ÆiDƒ}¹¬°%#Œ ’¼Œ>©D*EÈDɈÝ2Q2–¢ÄDU <Y#nwÝ/‘¢?ZR0˜(KQb¢uB‘5b­ç’PL%"&©D‡vÇèÙ’ ¹Ûf^ ˜ -,¥º'&xR°™ô>žzÝ÷;ë#ÆÄLRÀLÀXÀU75Âñ„?»_2”Bˆ…nBQ’f‚‡FŠˆ‰ÕˆÇ_wÓ40@¬±þÐŽ‰êÇ!˜ IL()JU·”D¤@à¥taÊ !ºÝ¼vO *%#ªR8 \a3wa–¦K˜’‰vRd±Hk/>‰ Iï ‘çêÊc¢*Rà±Ðe"•Âe¡êL”šÔ‹ÍÄR›…Iõ8ék‡“"zxÖ÷C7&`2)Ò²9°À¨GX$R´c"ÕAÎÕyscL4’"Â"|xÈDÚUÙ¡ÑÁ¢:w{&IÁ¢*µÑ!aB«çòˆL¥À¤Y&ð@(va6’b&„R°Ó Õ.L6x#t˜ƒ -)àJK3A² B)TÆ;æ•‚ÁDicC ü|*u –Yv¯Z™¸è¾) Œi=<ûükÖÀcQe¢ÿ^2˜NŠv«ÂV&þãÄ]‘": :C©)î xH:0˜Ï¹Â= éi³X ³ % šf%/0ÙD*ŶÙD € ŒEçl¢Ôº@LÃÜ∤(1‘­)¨L¸ª{ßÏÿdíÑ£JLD4köjtDR”˜H«(€E;&>pˤ¡.&z.ÓÚÎŽ¹™ˆ¤ 1Q’‚ÍD¼쾉ðY&² ð—ƒta†Rà™~ß‚‰’ )`&ª}–ˆR6¡’LœM<ìQê#”"Ë„«E_9ãǤhÄDU <÷yña`˜øÛóÎ c&^tƒÏú¥È2á,ø¡_ùX€ý™ IAe"4âon~™*k=Ì_cçL„@ø¨2J1‘‘H&ÖØœ‰U&"#B)¦c–iD$EÊDjUŠùö›È2á¥H™(ÑŸ •FGÖ˜‰¬‘ã0á¥H™(1ëZ Þx)Œ‰ŒÂ.LžÆ„œ‰TŠ­º0ñR£3QJ(„L°;Š$Lx)ŽÉD)¡Øp@T.EvhÖˆP cb‚lÂü‡o¿9#,›˜¢Ñá¯õþdl)T˜8t6ì˜èÙ…Ù!›`ta–˜XÊkÌÇdb.ÌR6Á–Ï„n£cç¢*#-DÝ‘½Õ—ÒØ‰aG:²R0F::ˆº ýã ¿- ž­™(I±s&B,ÜÏ0ËÉS'¢óèŽtd@JAÊD< ez•Ï#–‘¦WùIKmÞÄròÔ‰´!Ðg¤#k„ºðJPÄ‚˜^åë9cÒIJ›5 `B]Šì£æ¬½ÈfaŽÌDU <K²¯r²öÎgaÂR ×t,”es1q´5%)zNÖ˜ @  ÆD… Ò Ñ´F©/ý6:Rìc…hjÌÄRX6@_f &Òíà¥_=XYHžþ¹%?~׉ž]˜T)²‡m»ß„–U&"ú¯-QõÐebÉ­ ­2Á«óÓ0‘J‘5ÉDµj ˆRu =OÌÎ4é_âUùê´!Y#0Lx[Nè2áuèÉÄ×õQ*Œj?+%#ðÙÒˆ ™ž-,ȆL0¤(db©Mˆ4&ä5&&¼€r&x›Üµc"E¡ÊÜLÛÛ˜X¾¾EMS#6c6BÈogíÖL„XPï¸ Ùú_ÝüÒ˜èÌR)™¨>-Å=øKÜ„‰…uëÀ ³ † [1±qX&ªi…1Á1˜hÑ‹¹!XŠ3p 4bJ&xFŒÃµcb–‘Œ˜ˆh¤Ø=K°¡îΙ`¤T#Œ‰¡R ) g"õâšsΟŒ‰©„ðvä£1Q5b&ð©„.€‡b—2AM%F<ëÕ^ؘÑ€‰Æ„®31Á6ÂÿJAb‚1S›Çƈñ™ Áfh\{f¢©‘ÔÝ«$‹;΄Ð¥¿0¡˜JðŒ0¡Hûðr&ú§È»x¦LT§HŠR Ä„¢n¦cÔñЇ>×…û½Ö^˜Y2`A$LFŒÀD #`&þõîñ¡ÎD$Eõf?<&²R"&ªs¨üÁ!Þ$ kkäÚóêÊqy*± Œ˜ |B¡~Gò=0àÖk=}˜À4I¥‘#0¡ÛÖèÀDU &RDLl;,:Ê^˜ì\÷² ’ )S ’ &º¥#Ú1cá¤Ðb"+E•‰ ¥‚ Ò\‰*]û}€þ7&„RàOÈžv©e„ ]#` ua"¥€ fþ ¥0&ÎòFøH™'YµfBш7ºÕPh#š2`Qº-X• ¤Õ ¡³2ÙZ`"4"Ì)œ¤Y˜<)üv¥€@¦YúÏÑNu`tI„ ð Üø}¯ÃC E6&JRDd ¥à‘1:H#³³«LÜâ‘ÿ•^Úa#r³™+~ðµ0˜Tb#LÀwß Q}zr&ª]›¤lb)v¦~Ê™H¨2H"eB=•´†Z§Õmõ‘@ À3¡+E• XаŠ1át3Qâgïx ’TBØi¢Â©¹3¯ÿ_¾ÿÝ|4b"Ä"ݤ_Q  “‚dÄôL +'‰ÐÑ“’oD*•‰´ç²…*LÀÇã™ æY&K¿$RH˜Àôh⥠Ábh&0»KH˜ðF ™ð‚[™èoÄ¢4áRn‰‰ÕˆL8)²•¼*E•‰…5í*u*ÅQ˜¥HS <È­FÇ¡˜àu7 ™ŒÀKAÊ&Özî‚ÍÄ­®¾r !%HRì‰ì¤‰lfÉÈJ•aL´`sXÕˆ…²Æ„Ú…YÂè ° 1X`LÔD;0ÁéØ%È[þñZZFÈ¥øZCã#àqr‘e¢”}x)ðLT!ÀK1Ðô*|z2MÓÎN¯ÊJ±9Km—ý¥0ùrs#R)ØuO‘‰ì}:ðFH˜@v[¦^x ª-”’¦aBÞ Àc"2b+&ªÞ]B¥(î£Ý.™_j[ÚQû,µžj5‰ÀxéЪÿÈ#ÇÚ½ŠÊDt@‰ 'Åžq?©T&ÖÚÎc‚gÙ‡PÈ>U§K÷’í×dw: Ÿ˜‰ô¯0@*Ñ-›XË=¯z±1A-—œv éx†þÙn« ‹¬;a¢º> é3¿ÑáÏ@ŠÖL|üîç´‹µâQc[#Ʊàãßðb¼k°'YVÕ• Òò8›ÈöJNÄ)› ²‚§µAÿ÷]¿û9Œê ¨ÑÈÅn@èæs0¡ØèH+ÿø¢Ô‡«7:zæ)®<ýåçuk³ n¼ÆJ ˜‰kû[]t`â×û¢‹Ñ˜èœJôaÂé 1Ïæ_x­ì€*…d·Kø±ý˜`l…yH(EÊDjDI E&¼©ÔšÙ”‰ß»Í{Çg¢Zûák» 'þüÉk¨H±[&Þý²[º 1ñÌÛ~ÄE$ÅàL¤üÄMŸåÏÄ™/{‘¡—½ã»Ùgøâ©ú`3qúK^áB…‰Ö-­ì 4â¿oôÔ50Xøk•®¾O&¼%)²Lx#¼¥„"üýæLd2‘•¢ÊOŠ0`K2H0ဥhMà{%Ttp"¸pFø@JQrJx@àᘀS‰LŒhÝ7‘í/ŒŒ@2±‘2!칤v^2Qø¿FF¬iƒéŒ11I±þœ¤ç€héø­˜H»$R ÅDÓ¾^šP­í©Ž *E&¾ýw>ýp\&|„§F¬@gaþñÍÞ„œ¡PtLèÆD©Û’*EO&–“gR¨‘ý7ŸT&)àΑFÝ;aâáwørzdÖˆ,.F°“ˆ’ݘ€‡6HRtfâìóß•%ƒ=³³iž‚D‘MTûP #H@P™ÀëЉÌðç*‹žL„FH²†È -#Ø(P™ÀŒ¼f«úÚÖˆâˆLTp $&ð4t`‚:?#ÅPLÜíÝOYƒê EJLŒ¨Jázø8h6Qê°ô.°hmD#&xs¨ªRŒÃ„3‚$ÅÂô¥˜/#T#R&R¾ù¹ŸYc÷àßž ŒH&B)F„éÛ-&JGfO%œ^%™gI’‚]!u™ÀKÁ`BˆBõœY#ª@¤Rœ{ú‡K—sR”D— ¸¬Y!¢j„"B#xu•=YÙ¡ÕUœa­ÂùÚðûer€’+9˜xð_\ˆé°Œ2‹)™ Áî°”!ùê¬F0˜PB‹ðQ<)<1):¡õö–S1óuÙÄ*EŠ…Ï&R/Fa_ó©ÛR”ŒX # ˜P4"_íÕàaáŽLvuYEÓ#åKÈ™h Ä‚^<0ኗÂ÷M0ú/Gd‚štF¨0±ÁK%.ø(ÇÒ¾x€@‡b¿£ü<êFÀÓ±¨»QD‡E}iNá(€ÞL,ôí-%FÈ™ÀÏ’ ¡ÐaÃËÝ”Ö=­›’%<&R²ç™ƒ ņ†l#JC›†‚.ìþŽMR È5fÑCà _*c1±äîë­žDÈ™P4Âhèà>úÜK‚½“PüËoÞ6Š™˜àé@5‚Í„®V™ç-B&ð;S w»‘'Ã1!iŒà]‹´jÃŒ0#$@,J;b|#¨×Âj˜G3ψEu×<¡;a‚aÄRÞ]B˜DT›fÄS  }Pã@Lt0ÂÑQ­´ºFDWlº¦Ð¢ÅÌHž FüÂ^K’ÅÜLhuFƒ‘M0&ŽÀDk#V\ÀR”&eúàÑ›‰¦F Û‘òmf²—0&æeb(#¼Èœ>s‰ƒ‰™h=ðÉ›ÎÀØ!ÂjïDLPÏÙÚ˜½á©$&|rA2¢+CÁëhäm$c¥[_ãÈ©„¢á«˜K„ÍY™ècµJ#€î€‰ç?ý×\”þÊxéÒ¤?)2ÑÓIWezLˆéB«½õó1ÑÍR•Æ/Îù¸W>*Š1ðŸ]T-Ý_ŸòŒg¤"¬?îÆ—¸àa^:=ùW]úSk¤'œ Þ FÊDZ¡ü1¿ü狀(I_q>&z!a‚zÎ ã`á«_ôñya„„7Ât0.½þÉá#<¹V÷ÄF„uÊæ¥ ]w &Ò*ݰO>ðùÄÏß< ¼íê¢s†œúöפ1a­Ë~|}ûCÖÿ¦Lø?¥LÀ-ˆô€ì7'kÄþOò^Lvo(iG‰ &H ŸLd¬ûÌQ•`‚´ÿuöœQåÏá¥pÇo˜D´`¢Ú—xLô4éi‰ ×O±&#x»HFÀR”˜`씞3Í#6—ó”0‘•"ýÍhLÀRÈ·Éo;/sŸLR‰M˜H‰d/EØe j[£)ѵ0×= ÀèÆ™6:²=—6:ðR¤ýš¼¡JÒ‘¥?5bÂ_yÝ‘Ôm,…©•‰R»ãX]˜¥Ž>]˜’ÑŒ%)ØS²NÕŽ Òuý¥ýPhÏ.LɇºÇÍ&ØEë<ÔÑþ'ôR¨ÏY‚ÏÖ”‰Koð&üKP™¯­>ª¾ôó(L,'¯ïÆD‰‰y†V¤;\ó"d¢Úk@ ÝQÏê K_*EøûH Ñ¥£§M%ÒJÎ{g6g¢:ç²ô¡¤RÌÍăÞq!õÃKÉÐM%ÖrÚåWj%vÍf¼oÔ‰‰´”~¯ÅDú´ÕgaÎÎÄI_˜`}ǘ¸à‘oN£Jðô®»ø”4$L<éãß“|ÂÛ¿:á•|V&¾töÒŽÿÐc~„ÍDI<°! ©tº-ŽMú&ØL,ÉʆVã2‘5–b-Ÿ9ñÓ$#ªRLd¨J0‘5¢*ÀDÖ¹ð®B) S31ÈH‡„‰ðá»b0–¢Ä`,E‰ ÀXŠ€°%&#)„ÙDÖ…>L, Vˆ²ÇDyS0Š*d±÷„1aL´b"¢ÉDÕˆ*kùÞW¿Å˜(1Áî"±F‡5:š0ê0/»itì– jf• ëÂìÐ…™•ÃƈM˜¡ ³ÍQ˜X4Æö`&Ek@É£èˆê2¡›JlÅ£ö¿¬c"f‚kÅ~ü5'´B GÀ ÿþµ@ hÍ„»×ŽJøíðµÂ˜xÞb¥ñ¿ÿfÆabÞ¯Áq™P7e—'„+öÓîòÞ4º1áêÿ÷î‚)%&ÆÿÚ— õìc¯'*vÖX E&|ÍÇ0± 0Ò‘ebü¯Íq™Po§ìø„¥Š H¡ÅDXççebü¯1aLÌÊDTá‘L,âY˜¥û}Öè°FÇXŽ´ª÷d"[Û­Ñጸäú_˜ RNa]˜#wafëy&ÂJUøƒwa†yD$Å|L`¤XÄe'g@´TÉñL,Üý&¢®ËÄÔ_›´­J1%éûeL ë¶b™xÏíŸï"eâÎøª ]&\õþ§gùˆê¼1ñÄ{¾ÛÅN˜ˆÞ2cb¯dŸadD(…cÂKgÂ_:ebŒeó~m"#R)&f"|×ÿxØ{²!¥²VïȈ0¡¯þž÷C™ƒ ‰ÌÄÇbd"›J(21õ‡RbÂK±&Z¬þh4L}„™dböeP&ZKaLÆÄ>™P”ÂÖè°FÇn™Ð’º0­ Óº0÷Ì„ ³ Dð„;fbÙÝ€èöL .…Õêv'L¥™ˆ¤`0±P¦W…Õ^hIJ£éU‘½³‰õ¿Jaµº5i!­éP™¬©ù‡b"-é20 ´°ØJ «ÕMO(Yú%Üo"­çH&JËÏwó¡d¥@2ñÕ»¾Fóyí:5­VyBêBr—AÈ7¹c0b ¼ ŸP`™Zã¤V«;œÐ×|L°/]ªöø8Ô‡IQbÂé¡ÉÜm9NZaµzÀj1Ñçºó~(ÀÆiú@í¡¨31N+ºIaµÚ˜8ò‡â¥ðL”Òª&¢jé]ßꂚVè®þ°°8rµÏoxWÕá7¾ð-.0R ˜ð:dä°°MŠªÙà0±Övª†……Ek)JLÀ@ÀR™ÀaRXX "…Ј’jL˜›K‘e‚dDVŠ< #L ‹™`b‚mDVŠv«?,,,1IÑœ‰¥ñ¢R cB݈HŠ˜ ¡¥)&………1!J(L c¤°°èÝ1!4b³lb}ð1ûà-,ÊD”G8,/ìã·°O¬š‰  ­{a_ ämWÒÙ“ŒtÀ[f’ò +V¬u§´Äst&ð»Td½°°°À¼mD+&T¦WñŒ°bÅŠJY«·«á*F™`KohX±b¥­Öt° Š•±hÅC 3Š•}HAØoßú°††+»i€Ðv¯Bba@X±²ƒ´Â9ÂÜ27Â" {ë­X™.­H~ùŽäV¬X9Z9‰ ‹lü?V¬X±cŠ+•ò¿—Z»:#¼“ZIEND®B`‚visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/example-voronoi-toolpaths.png000066400000000000000000000323151147500217100302260ustar00rootroot00000000000000‰PNG  IHDR3ôx V±©IDATxÚ퉮3)…Ïû¿4#Íhºs“ªÂ˱1”QÔRë¿I-ðaãc ô§?ý)òÿøÿ¿>=zôX3þ'>øüû¯4«=zs’9þŠ×–¨=z¸˜ü?oŠ«‚ÌÜMi:&åRô_2ñ—1‰Ìýø›¦´G»úйøM¦üHyµ´ÒÛ£Ç\T>ÃyA¦ÁÒ󸕦´G3©æˆC¦ø[sqÚŽ¬þñ%†ª¯Óï~‘9†ïG•÷ôÇ%ƒvÌô¨$ñ"ET.™ª;ûyøVz{l¯”RD >xd’ù|²Ý¨mH=ö¡,/ÌËÍÆ¡¬6¥=ª å5™`¯~ð-N{”ƒlj.d&΋NSÚc1œX†’™ohmJ{dÃI_ä¶YÊQs¹ÿ£•Þ p"šy.™Ý’Miu¤ÊÞ‘i†ÓEÔâ´Ç~‚“í,‰ 3JónqÚã pJÉÔÇÙýÃëšÒkÒ4 ̶Ô×`[éíKæ ²OÉŠÍÐƒå„ zŠÀÝ+C‡Ý÷9¨yZOdŽyâeèÁò:!û:9wöêF´ÇÍ*Uã0¯tIæý7±|öÙj7øÈÄL¢‰H/˜s—£ÈÕY*d]FÀ9 ÄÕ’hï‘8p…p’åö".Åöv|¹Ëžo²Ÿˆ‰âŽ&“"?Èüç—^w¨“À@Ù“ˆdŽŸ‚…îCuìGUò´Â>R–ö‡"ÏKæçê‰eLeÕ|«†œ8¸h)*ˆ–À}Qöï«O^r‰*"3ë}ÑÈt L”ZO«Öeæså¨ÐidGÖX2µ2*Ôd Vn2‹‹Ê|…öòrêî ù6Øhås.5™M&‡ÌaÊk2ß%0›Ì…dNø‹É4§ºÝ{®0”eæÿ~w4™“™|ÔÔü’Ì‚Sò LgÑñl2›Ìp1us·æ¦IMf“ '™ÌÁJÜ~ˆ“"½&ËÏúóÅ·‹žm2›Ì?LúÿFûØúFƒ£Él2ßBf|Ä †;Ò¢±¬ð˜( u™þFeÎ×MæŽY`MfØ9’ý{š†Þ<&XS¢ßƒeÚónNæ˜ÐîO¦àë’¬Q¼8¬)Ñ/ÑcÏ&3MlV!“k˽ԮõÖ¨¬DÏ—x›ÀÌyêUo•Útçd^!Šáh|)H“(p–“9Âüvádj·HΫ¸Kç|_(NfZ¡”|£}á|öœKæ`û`>^Ùü8ŠªÅ;7wÚò‚à|™CãŒ1Å}Qj¬Óq$–¥¶Ýª÷€GcÇj2sÎ$î,0u— Ìj§•å[2‡Vl&”|c>óè<™ò)!BZ¡M¿O¡Io/8ë‘ùЋÁºªä³òj272Ù¢>÷³™N´à=o ²6Wªc/ìÙ·œ{Q*v32é¥1÷õd:=äÕ ~'™c("‚q°™Ð!¯o;Oþ®§/%s¸ûRjàŒòMs%ñû‡Œ;Àùµ8kIQ6ÄKÐë;Š#“Þlû8Ó%N M¦T›]QOí«¶úz2Á‹4|&Y|ŠŽ++”«Vm]U¹ÉŒz)ÉË.·KN€¸ªÕÑÎ rÉŽÓáü—Ìœšóç?’L½Â–*?±q¨wœF³Vóß–ÌH8÷­Rá´7àmXÚ–èKÉ, 6_HfA±†Lœ*µ_sRÀÍóõd¾β|†w"—_úBÃAý®]‘9’}'MæÎ|"þ˜jRzá5þVØ(CæÝ÷•VhßÁçÊf6žÖ)&´6!óF•lMf5>3¯þ …‘-ltØ.± A:˜èÃv¾5™¥øD±Ë™ó{°™¶£æ¼×­Ñ&³ŸÙ“xK¦³]ÉÔ•‡5ñÙdÖáÉ[¨ÅÜLÅVßA¦é8šM¦Ù¼¾*¸OØÑ”q·eÉõðTÞÄ2dªžgk2ïŠÄË»€¦Ä_ËOa±"%¢ÙXš–Š9£ÅÉT‰ÁœPÛ$2åzx…„yQBÞ^‰d,­óε€îG¦·V•j«^½Ð-È…¤¥Ÿ?g?»@`Òá4UŠÛŒLB3é:dªøò2\q7PƒLVË)8—Ü{ÉTÝORë–;áÞyôÕWgH‚úáœë¾ŒÌé#ÑÊv ɬƒå/}DþÒW6%sÌúGJnæ•d U,Hd’9Öµd|k%–¤}ÍóþFà+õ,ãqÀ ™Ãl,ÖZ€¾‚Ë„ø%Önåeÿ:OÜ %óî*ÎÜÙL爫+aØ…9Ê‘™SÔ4'´ âú‘#«j«<ÐoQÙðÌø©Ê~Rã_Ž‚dæ!‹ÄúÌ´úÃÎTɰÉR/ƒì ›åg6™“™K誰68áÎ,ðì¶ÆÄWaÛ“iÜ,O!«î0¿aÄ:}a9™ÃT3aO2Ç:+“É»á †Mn¼ l‘Ÿ¹˜ÌQ"xK·µd"Ň!Åd>ßR“Y…̵£C:,I&“»UÕÍÏYõ’Z•¹¼8™¿oÊKŒš ¡˜©d2…6™â)ç ¥3;,q»Óút(h1f5­&†³ÈL€Ó\cŠÒÕ|»‚ô&ãgë4ŸáÿFk»øt¶#3ô‹…̱aAzb?o«[Wñô*ÂÙ7Áp.J¦×&A—·¬¢ïÎ×g™V:áJûÝk˜H9z 4™ùb±ñ7Ìœýç{p ±Í$3ÕE@9¢ˆwqJ&Î0÷šjÏ÷wŽEª5å6³W¢ûˆóõÓèdÕôÖ‘ùϤ¦YƒâÈœ%xíCOg™Y5¢ *ß/ß/o%ñúío/ŽÌÏÖØQÔ¨ Í+Öf=ìÖ§[VCv·pN‡g1òK –Uʤ@fZOæø*þ­©ÿ •ýFH¦¹…Ñô+ŸŽ¹C{\ù1‚ó) Ì”¯*ð-‹KAY2/ôíË5Ôó/õšà­ÿfy³PÌ4ʱ³8™ÿlRî>„ ±dNÚ…â_ñ¾%ű¹c„T.f qW`žµÉXyÈí~#8Øɼ5PÆÐ뎎M&ét4½1%-,!Sxެ£ Èœ(`ωª»©ÝÕd´œH*mß|sÏ6±œLîÄ"“ñ,Þ Zìµè$s¢Â„?ö%3f÷ÜžÌë¿yn_C"ÓS!î$2á¹1­çšßc×Ï=Óá¨iº™—>•2$ìO¦Ô½n3¸Ÿñ_3itú€iڀ̡© ‰Bë&“bTt­ÂçLøoxørµ¸wÈ%3¦ce!¯É¤Å…~‘Áí5!¦tƒH¦»¥œjѨ½F€€Q§‹\ø†Hæ0•88€Ìgƒ„“Lnú‹ëuQc€`^1òP._lD¦v:N&Sølк¾'ÓëZÀcH“á]ñâf‘B‹6n dvé°¯ß$y\Ë“yyOšéÁÏ+³‘IPS›Gp9"™œ\'½œ·)í@:™†¹Pm‚i«`î]­ñÊØ¦ÐþJNéV‡ÝÅìÔX™LsÐù®dú5Iß/ª˜?E3 ?Ÿ«:¡Úo;Ťɭö¸™+L/Àl³ñ•B͵¹É *‰dNÑDa2¹’ãnR*’I/$J %Óÿkt2?áqW3 ¯`Ò—µ›LPV© £™ß…Ëw’V5“bEÔÎ"“\ddf}8ˆL­@xö+F¦Ó„,i³)±š¤²0.“¤ßNæåó'ÉxÀ²dÒ,ÛÇE§Ý}ø²”Á)dÚêGI~¤Éô,똂†öäxý#d6ùÊ’Y0æk—ÞMf–ÃÛ8h9™ M>›Ì?ÜôÕ'Ó'LDc9|¡TV2ê²_Y÷œÜ«ïB•G®ˆ´û!iS9íÀ¸“ÐÄîéuu¥ÕÉô¥ÿ6™!¢rÄô€2Ÿf•dæw7-OfháÇÒéHôg’«±ŒV×™d_2j<œ—Þ»ÓÉ|Œ·‘É…3(¤+‹L°«„¨äžë0‰.–M¦s:&X¤ÍrጠƒŽ'3öôµ”L»Ñ›t\W§—&Óz;‘Éê]}©#pEå‹—éX;ÛãªY뜙 0¯hg,aëI#3¹è«…L­Åáùt“g“y1=º˜á±VÓõÉy4Š&3ÓPéJy1U‡ %ÖXÔ¶%ÓL‘¹ Êp÷–q6ÏÈ%éþvàå<®¬&ÓHæUIsÎYL¦£NôYkd‘eM°ÚÕ`Ûè›Ì§_0•ib-²28À‹[ðogébó6³âåd›/Áv2)OæBãäH!âmâáC'“°ïŸLfÅòæÒ¬µ™Xe™{¹{ð3æä~ç}âV¿_súD6™–c2yA D™™°\­„äÆá/°µï A«B¦Ó½Aê’à|Fä’‰›]i%–üRšÄFlB“ ìUE%<›Ì·‘I¬£Ë˜$KŒNÖÉí B/(æEÆ0HŽôQ!:d߸«Ê¿UIeä^sùa¹‹ï ÆFüxî—Eqm@æ¬kØ÷aÝ1=êFÔkÉüX¯‹Sg¢Ù´ ¹ã¾9SÅfN;?c72÷‘žãyeKs9âg…ŒZ?¾&n2ýçõ€îŽ ì™9 N:eŽ!S¥rk—}´6‹P2Y… Bs ‰ÎÕPeN(‹ƒg ,7%s8ƒ- ÿz0™¡ëÕ|ŸMæ6dr{9j¶«ÓÖJ&¨VÓ}"¥qC–¼Ä1fáÏL¦7*‚x:u~EÒÉÕfãNwžøÞJç^;Éu½ëiWöBÉ øûvÔ¤¢{ží™ÑÛCIìÉ6áy™veOÇèé3 rˆ ¸dFDÉzf-šL§Òîôëä4¯F¦Y¤L^±O¹_±Î.“Ì$¥H§4ߊåýuhçûWM0sHY7«[¸Smau“Ù§gt’9Ýæ"Kj í)2!(º¿ŒD³Ð;ÉT,Ü©Ù#:«0Líwƒ¤ØÓ-Ê„guRš£Í–%sècóƒeˆAEþ€Œ/‚Z‡ƒš-¤ä6ç‹äÇ™êó{‘9_RÓœW륙x‰SnhHñCéÚx:GC44¿ ÍLXÛ€Lg–3»8Úz2}½¨íuñaκÛ@Ù«¢”hÎV —¨¸+ÉÄXÖ .Ú=h8o<ö0¾[ž¾þ‹Ä éÐqAiŒ*î²Û­ìlëžHŒ¨NU @Èø{ZòÙï§Í÷Lkzð:ߺûµ±N—‘9ÛËÚÉdõ‰OFú9·ê p˹]ü¢ ”jBp±ìœyy¯Ô¥Œèˆ›G`‹áúŠ+˜ä˜Ž~W—p÷_If¤l‰ †Äj&w„³z"¥)¾f×®$Ôq-™Uô=™,D…iÁALÚ¥3…¶€?3eÂ61(€%åíáÍdè8"ÌÍšÁùdª ¡“Ʋ¥ÕdVaRA霊B»’)ozɪú·´Í.p¢–qÂ@HéUqÖQ…Lø‹ä>RV/€ÕE¢° 68K4ÆOÝáh32U­ ‰} 3¼Kå…þ¤¹U!“ˆ¥òÌÀª€Úd¾ÌgõU¼,sÊ ÓVãƒ4C¨QïTü0‹€åDêÜå-WÈ«Š4ĉ0p±™«kÏÐSBX!éwIFŸp* Ìñ¿…”NÇrÈl„Æâ8 ™Ó™dYSvà°©žà;«Ãƒ\µµþ^(£j{™¶º»ª\ß½ÉôDíDi^ÁAdBóm•Åj2÷ s–t2 Œ£á”íjc½©±Úz2±Èpÿ]Bõ­ÉDtŒ«¯r‡È”bÈÕg¥[T (“-?.´=™ÊvÌ0«Š»’éi°±jªTg3qd»qëÎKß–“¹¤>Ø=™„";[“™tÞãVÐp¤­Á´tÌJæÉÔ@²×‘Ú’LVrs‘Y·U¾ú_p€­Æp­×‘y³wèoNi®¨khqáü ÷‡‚·¯€´»ž‡Ì™ ñCË.R úwñÊg!5|ÒÆcÕÒù›‚BFéaìû’ùw…تî@¦léŒdÎ{éTZ:ßÑ?’'µ~-™äÂ7{‘‰üÙö´*Næø='y·f2÷Ë3“Il4´™Èê´Áá° ™ã)9¼·7ÞJæx!™¡Þ)„çyc± †O½“Ì1^I&±É—MEæ—Å"b6™9ͼñš|÷lùl†óû#wÿû›¨zÙTçòG>.—í¡‰öß>®åã` ò¢½‚̇÷>5î}òù•FxéüœþïeVáŸTUNfBVŽ1“ÌÂ5SO'Slz)õºÇydJÈåWývkQezO$ó÷ýž†å(d›U”º(L&êUÐ$»ôÖ’é n2mßElhD4™(¸BŽ!÷Lž‰å¨N&\a÷û1i¾·jd><À±L.'óʲB&¬1·”Ô¢Õ“4›I&ÆÀŽï}w2aMíu^‹·L«kRû’9}³çc9|þ:· aI÷Éì\¦Ø¢!çÇx‰P¡dJÞì+°,%¨#Ètözš¶²Û…Ì¡.“M¦ðÍ6–Mæ×_îd¼ ÿ¬Kfv••V‡²G#d&üm>žÈ4%ò4–=^M&5YAfcÙ£ÉÌ Ó†%Î/&´–7dz¤eÃÙãµpÆ’éWbÎM¦N?™ÄNR=z¼šÌ_ 1,•BCÛcôè±åQs9™IýÏ{ôx™_$jÉ”ÒÛpöh2 dò°ü7PðèPÉ=ªÈLaõñÐͶ'°Ç‰PÒÖ¶LIù¼ù ³ùìq$“Xd›•–Z’Á÷§?|îÐ"“9n³º&LŽ6Æöèáá‰Ì!*“wHù³=âT\O•³çˆv)“eNù)Šhÿß?_’°G"pʳÀ¾Îœ×L6–=zÈ•[Õ?]’ùÝGåSin·dÎç¤XÙ/™hݵG":ð?d~×íOú³ÐMúy˜l©Ø£G•ñs¯S²‹ô×zIEND®B`‚ß”/û>ñ¹òР/ø®­ü@ħµA¤|?àÞ@|î žJü¹œ§¿]i~I|›òÓOWþÑ÷)‰Ê‹ø~8 âõ|¯UÄ·g»jÅ<–óLâ y¿8ñæ;ø=ˆgúçÏñÄ×_«üïÓ/u¸µJù‰o¶¿ÉUñ1›ôTe¨‘"¾ì;]yoJ|jÚ0‰¿TÞŒx=åãâA¼jñ^ZÃ$^vÂ᱈ßß"øÑwï”ø=ˆ§œúdvÐuâÃi³JÄ *?Ê©O ~Bâ/ÇÌ<&50.ñažÚ ⫊w⥇\Áăx#â£ãåËÄ_žeyvkl7}Å}»µAy&ñßÅ•g¶ãËÊ7ÌQâ-z5ÄóZ«”7#^Ûwqâ§!³Ÿf’C| Ý°a5¨4d³ïmÃl@<ÇwoD|Õ”ñy9ÿH¼ÁL“!ûoâÖ‘š/Þf²xâ‰Å{›ïÄBž>A ]yññB$^Py%âã7ÛfñŠ'@µ- BQ>þvUâÃkîA¼OâùúqËÍ«¹”¯€Œ¨üšÄŸ•oö½YyO*ä9K>¥r~»™—&òzćSÇFø¨|Ã:ÝR¾w\»•C<½xçû^n×4Ì1IQ¾™øðrÃ*⥔!þ ¼Èz~ ^˜xŽï‡r~»tzñáê «*ñëÛ–êY¡;¦Ëª­UćšbŸï{Aùæ9„•ñ"¾ï‰.ƒxÉ^ m¿"©A|(N6i |ôºJyßcöÞÌ÷fâ»ø~Ù®aÎ_>ÛF|xs«ZâE”—">-üÄ÷½Ayÿ@¼”ï9ôwëµÑqñáiŽâ/Ëù;âãÕ¤| ]«ø²òUÍqß“òyøÓÝ)¿8ñA”ø*å ÄG„W!þRyqßÓ¡×K¯‰»”âÏåüYùøSYß=*Äjøž:61Ró_*ß@|Èn24ññ*Yâé}y»ÎŸ’ï┿$>¼|Óñ‡rþ@¼xñî™øÚâ3>’ñ•üÎʯI|È–Ñ þQùÇ.ͺÄwñ]„øðæ;‰OåüöfYæLâ ¿(W¾wUß•Vj=+_K|x}ý‰?Ì D|YùÇ~Eâ7ÚŠNˆ/øî–ø}*äõ|ãjB§Añâk‡Ejã}Oyqâ`W#þ<¿ñQùKèAüuG¾—ïµÊˆ¯ÿë™øÔ·QõÝñ¡reUÙSñžtÕ >/竈§+EüåüeªÄß•ó ÞÔwYâ˾ƒxWÄk“ÝV¼Û•_„øp¿®·ñçrÄ{$ž¨|N|¸:è âA|¹x·!þÝå'?ç{¼lò}âË“Û(çïˆÏùñÖ¾×nÆM‚øH|Ùßuˆ÷wCøXTî¾ÇP””øÇÉå-‰Oå<ˆwJü£ò¾ƒx'Ä{ðý®x×&>Ç}nâ)‹‡S8´"ñ~|'_ðăøÇâ]•ø³ïåÃÍO=O\ªñ—èç´‚xwÄS|ñ žè»ñw¾OF|áà*ˆ_‹ø¶?.•›zôÄ'ß;ßÑ÷ÇæL/â ʇ{ý_»²+ˆŸ–øæÎÄï›úóü;Ò‰ žH¼ò®ˆ•kv[ú>ñ +w{ >þwQ⽕ð—ÊÇCäQùýrC/Ä3Š÷.¾ßŠ Wć¦ó¡üPÄwóý@|ò=_V~q⋨ï¤*]ßøªæ;ˆŸŸx¦ï¹ò¹ï ~â-}¯-Þ£ïû¥âÃÓ`JÄöRÝ Ä_ð='¾ <ˆ§Ÿ44ñ¡éY”ìB<_ùœø ±Nw_âܯ5[ß#ñ߉ʯLüå’­óßP¼ŸëD!>·êK|[ÞÄOB¼ˆïñ$´Ÿþõè‘øKåËÄ{P^‰ø»%¹-‰·ñ½y1¿¾¾›ÏT>}€ñÝñIyßø„{ŒF?+ñ‘×é‰÷æ{3ñ67Y3ñ僨ï]”O¬‡«ß â;À=f»êÕð‰ï«¼q ¯ª¼%ñÍÍí%U‰·/äÓÙ' ~xâý4âϸk©†øíIpâU}o¾­ö¤ð ćšIä- ùðrýé‰Êƒx ß/‹wºòÍÄw,äʼn/´h& žS¼øîœø*åÛkjo¬|”=ÜÿFoG|Á÷»Ž|ùW"ñ]”ïRÂK|àmÐÀ÷âCåj®…||•Zžăx/ÄÛ·kĉßÈvk(¯G<³xñå ЇӔˆ·Tþ‘øøÓ™‰wr •BüYùòddtâí yYâ·µµ‰—õ¿ßk‰oðO|úpE¿ñfʃøñˆÏ×má, "®üv¿¾Ì9½Jx â5Jx‘âÝÒ÷´†1‰Ï¡OwæîNêo£|Ü‘¯â½®ÙƒPÏQ>¾¾üÿz‚œò[%Ùþ‰BŸ,}~Ë·|‚˜­‰xYåcBqƒªÄ(âA<‹øÜe‰ßš¼–U^–ø}ÄÓ}ç/¨|äï±ØW%^[y/L<çŒ'ÄÓ•oÆ=&~ žxŽïRÍ™.%|•¯ª| lįEü£òLÜA¼jñnOüîµ1ñ|åCÍ͇VžBüvZêÄ@|³ïeåù¸'âw ™Êo­R»"^¶x¢„çÏQ>4M=?+ñûïýïùo{¤”ñ£/R¼ƒxíâÝ~ ¤} ßL<¥ù¾ñÉwï—øK噾Ÿ•Ä='ž£üÆcZPù´©*ß5Šwûsz•ð ÊÞ™±#*_>Öšû.¨<ˆo÷ݘø¨¼lñâU‹÷uJøZâû´Ø  âé¾K)âÕ‰—ò=&(øž߬ü Ä«ïþKø8vÞ˜x¾ïðo}CžMmîšUâï|Q~fâµ»4 ~tâƒþRPë”ðDåÅ}?@/b}ÜÎyã]š²ï|åA|»ïâe}·!¾Mùm´ˆò®|÷_ÂËú^&¾ùàjÞ¿ó]Êúòoá(I<ÅwïŽø\ùA‰oP~ â š3þ‰×ð½@¼^ñþh½îürþ@|ÜÅw¦ò žE|¹÷Äó‰7ÃÝ’øP9’ïwÊwñ^ÔÓ?ÄD 9LVáÎTij|Ÿ˜øZåýoY¼¯îD'^÷Kâc‰×Z|‰ÖÒ¼µ6âÛ|Ÿ‡xAåk‰oð½p”†ïs/¢|ÜÂ¥ïÆ¸›Oô]»x?Ï9³IPv½Ð›6‰øfß›•ñÄGåÏ[+¿éänºòn‰ïR¼[®ÁMÜ% pÏ•o›–`Ük›6‰xŽïó/¥|ñtßïÎ’ø;ây”ˆß7û³ïùFñ„I‰ïˆ»ñqã–vÓVˆ $û] ¨à{|Ûcß <ˆ¿õýËþàûpÄfš$*ïø¾Å»ñ}Uü¸^‹[Ÿú3 þñ–!R~×¢9û>ñ±/¬¦fù·H_·oŸ{¾û·>/ÞAü+â÷{ô·ß~7'ûF¾ù×ý %Ì.ü%ñJÊëkùïü½óœpóý<ûmÿÈWŠŸmçѸ;âÿÿû%N²ß™¯}ïOñCq/H|­ò~‰ßf*o@|Áw%å—"þ1gëƒ'ß5ˆ1÷/|ßA|ñLåéÄ7+¿ñå»¶~nâC¶5¿,ñUÊ;4™Kݬ|ñ Ê?ú>ñ[q3⛕OÖOI|*Þ=9ƒé ¾Žø¨|ôªÄS|ˆøÐŠ)+ïøÍY#^Šøpµ‡Ää»å0Mÿà{s9_K|•ò3OñÝ?ñŸ{Åþß/ž¬Qs.ÞÝ*?P w•=6wXƒxºò#_«|ñD剾A<Ñ÷Gåï­Ï!><ÝÖñÃùn¦<ˆ¯ ¾Jù6â•?ƒø*ß=Ÿ¿nç >nâ[š3™ï6ʃø:âéÊëOôÝ9ñqSUÄ”$¾aèäáEëGùâËÍŸÊ;ìÒ\LpÂ=W^¯;⫉'*ßL|Aù¾¾ ßæ»Câï^ºN”¯%>T^ß ñÝ}¯½lý(Ä••xŠò²ÄoWsp×›À€¯|m†¢|â˯dÊÓ‰¯*ÞW&þz ³&Ðo•ß¿ñ݉TžC|T>OUñ¾_jø'Žž¦ÔâÎôÝññ7–_®Ý•'Z[öˆ?Ìòä³<ï[Ë NC¶ñeå™Ä‡Öµ‹÷ñ[éaâ^P^–øGå)¾GâûŽ”$¾­xωï;»YÈt9©ÿ΀n <ˆo'¾ <³QSK¼jñžº4AŽiYå-‰'úîAù2ñ7j~ßøÏ ßu7ëuÌ~…ÚЭ$øó¥}'©Aü ÄßþÊQÕýÆ¿ßOœlbâ«|Ï•ï}øÀ>ñu#Îyx„ž^e¿êä,æ;ˆ þ²œo>õ)Á:ÂZðÝñ‡{bC|ó'÷Ø”·Wþ’xfs¦Šøæ7€Ç¢žó·pÎ=ˆwJüAù¶ |‡s•‰÷YÈ‹VžÓ™ Ù9ë}‰rsOò‰o.ÿ¥ºä¹W7Y»R ˆVÞ†x{ß}òÚÄóMé¢|N¼TñnCücGÜVÖ«ŽþÜÚoþÌï!†ý¢Ä'åfš¼D<Ø®ëôèû‚Ä ÖŒùÙŒ–Ä…åŸz¯=Ð¥Kio0÷d|Dtå#ô þVùÚ%AîwH¼C啈9—Ô°iͧA„ËûÍJ¼=÷6§nEß”¿ƒ~H╯~[îÆ\*ßÑ÷ˆOíK 5µ›ñJ¸/â»÷–Ç'Ük•¿,çG£FŠø­þÄ%‡ÄsVÚ3V^–øäˆ6ñJÝùC!Ž{š)âe÷–¸ÎÔmVþÖnm.Þ}¿TÞÆ÷ý’³ØÞˆÄ:3JÏ/•þ²³$eý哳&ñÌҾ˼iû/ý©úÂ=[}Sþ½ŠŸdyî¾Å{wâ9Ë0Ù$G'¯/ø¸«·åq’å°A3ôwONüþ²¾7po_¼Ÿ‰ç+Ö¬âõ|·'^d±=%Ð)Sˆ¹§lÊXùóýŸMEjãù!ÿÈ}GÜÏÄÇ´)&hÔÔ*¯Ôœ)(¯J<}¾0=âç„b²¨:”‚¾ñ¼`׸'yÍÞ|ܾ?4î{Oj >*_û~ŸÎ>[…xÜ-‰—ZLU©<ïòútãöÏ̦ٺ”ø¼r×›ô¸™øý›?ù×¾˜žxç÷/†'ž¢¼Mñ~©¼ÞŠRË054ÓG ÊM‹û^îÌØs&¾Ù÷Iˆ¿S¾a™ÿÄ7ÏçÞL¼ÜÍTù@;º+•až™´wåy§Ü”¯">÷}Zâ{É~V^–øÇñ‘²ÄöŠ…ò3v™œà^àÞñßç!>*ß±l7 žã{ƒò,ñÀ½SißÜ« §«MB|p#ûAy)âEÛ#ÿù¥‡aÙb‚x%Üõ¸o#>\]gâ½ù.H¼êbªÓøni”îhªýPw&÷µÊ‡›Ÿ‚xuåýøN!~Ü(â=œ¡ÊoÜGӉʇ{ýA¼ßB¾yðL3ñÛøÛ lñ´w½ÒžHüùk­ïŒ‹wE|~à÷‹þÍG÷lõÐojç£Þ)¿M¡ˆ_œx·¸·qÿ¨|Á÷yˆ÷æ{dý:ô›æ”2 ~A:!ÞîUÇ Ü§íœ•—òÝ5ñÄ¥±ÍŠ÷;ßéÐoÊS†]¿MD”_“xo¾çm‘Æ}Þxô}âti(¸?B¯Ñ|'*âçt~â_ôS¼_žµ#Õɉ³’…§a” Þ´x/@Ÿb¿Xö|¾ƒø‰÷ä{+ÁÆ}xSÎó}w=_|ÇFM4º ÷C‚-ñåAüô†ÎM¼ß#GÄ“ðÓn7Ѓx_¾Ç­u!~›ñÅå×!~ ßãØßògÿ:úp5ï1Çw§ÄÇ&Iß9Í™KßAü¢Aù[4—Í÷2ñ1Í zJi?ñ½JxAÜC¶©Í|…Õ¨<ˆ/O®[{µòZ¯ª'è—·?%ñ|¯áˆOЋ¸W ¾¿ïçC¯þ‰erpg‡=öîaîßü¦ïýHJºÎáWÇ›ÿÀ¿/Fö;×wÛß²¾í4oêÃù~I|U9OœÄ»óÝ9ñ‰†Ÿ÷ŸþÜ!nɨUþó'$?MU“ûž”Okf¦¯î²ÊWÝÕ=ÿú£¿ ¼\ÆlSpß}í¶ó4ÏÄËyú73Ÿ¦Žøp³{â£òÛÓªo—²Ÿ¡šøª^ê÷KîϸçÊ7óZÛùM¬ç_çUù®]xúñÕËAÞ ÄWMa6ñÓøîxŠìžËy"ñUbJß\Ñ7t~g%~ľL|AùÚéˆA¼;ß{•¿T¯Êw‡å| 5 Ú^¢RÄGå÷K ßA¼7ßAüÌć§-x žƒ»·rž²&uóKTx¢òÍß9‰ïÚ¥Ñ#þRù†E@¼;ßûOï¹U·âa†æoüQù*âSw^¤•´ñƒúÞ@|óŠQ ÞÈ÷Ãàw‡ÄËÊ.¥üå°ÚñšáMÎŽ/+_Kü]k^”ÙˆïWÂó5Û^|'*ß¼,ˆ7">ÔÜv>âk•Ïùþà¿úšÇ=ñgåÅq¿,ç#ñ²;¡ññà|j×¾R@¼+â …|x€ó¿±ó8cpUDî’jξÃÔPå—óRZ刯g+“}¥\á’ö¾?ò þóÏÑ/úçå§ýþXÿÅw¼‡žÚë²ßù’¿§3úûéwéåRymÜÏÖ«©|-ñáõõeïó%ñ8©Õ!ñAbM( }n}üÐqgúnFü!AŽøË²ý|µ9ˆ,䫈§+‹9Ù$ˆïâûÝ”“R¾ƒx’õU¾3q‘xŠæ—™†øèøòDâóæ»%ñãÎ!<+ñ‚¾ƒxªõ–¾{&žXž¯FüAùâÃÍu4îpxS¸ íûLÄçʧ]A¼/â}÷C¼ æÓ_Pþ‘øp%âSSÄû!>®‘}\ ^€xYß;¯ úôÄçÊÓ‰O †è•ž\Ÿþ(â÷ijˆ÷Ý€ø»ŒÚ¦OOü¥òâÃS¯G|aqWß‹xGâYÄkø.Nü™rí5+Vþ’ø»ƒ«Ú¾ƒxâ©Ä+ùÎ!þ²6·4¹8ñ‡CÎÄÂXmM@¼+╺4 ¾‘x‘Áï|â›5ñ–ʈïëû±fñ ĈWÅýŽxNyâ{_·Þ|ñ ~<âó¨oà{ú” §ùådþ'Õá'Œ ˆŸxñˆ/‹Ïa ™ÅDvÜTeŸŸÛËožtwÛÃf÷ßûåŸý}–±¯âãK÷s•Á7¼Ÿ˜Ñ‰·¹ÿ¡ÇŸRûAxë—ååA*DðÍxzâ·JßAü‚¸çĺKßA|Ûüöð¡ZâÍ”Žøé_† ^]öË}¾ƒøfßÛˆ7P~,âç.ÞA|Ͼ|ñßAðß¿*k â¹ã á;ˆ·ñI¼†ò¹ïÊWÝaà¾gÇÄ«ØÏ@ü ÄGÐÄË*¿‘?1ãE——ð‘øx‰µ[…÷ìj½öìÑçzôÝñ—¾Ü/}ωu=ˆ—Á{²ñw¾Ë*¿a8²ñRÊÏ@|3ÓØÛÿÄ *ß—x”SeßÏÄ‹(?6ñœ{bà»â˾«ÜA¼îPøŽ€øG⥔Ïï-p§ûžã.Ø«Œx‘=ûⵉî+ÏQ^jÁn‡€xmâñ*“"ž¯üÄ –Øó¯J<ŠwßíÌ7ìyˆ×#þùULÖnñ~‰ÌwøŽ€x%âîfËsOO¼`;ÞñâwÄ+À¾ƒøÛ^ $|G@¼%ñáêÊ žC¼Æ šþÄëuQà;‚³[5ˆ?ï Ä_(¯Ú"‡ïÈÄ›ÍQC!¾€;|÷94¾ñÚÇ?á;âGù!fš|$¾Œ;ˆ—à ÿzÈFÍû>ýMzS¼ÂwÄ•ò®V}j ž‚;ˆ—R^–ø¬õ¸øÝ÷C6 ~G@ü wƒUýÊÄWáß½ŸÖ2£æì{Rž¿p;|G*_K¼—”…A€{åùħщ¿é{?±ÇŽø‚ïür¸#n•§oÆe™xbñÜ5”çŸÊöˆ{JC-^M|äû‘ø6åá;âä%z™ÐoÝÁÚ{¼ÞÛuv¡p:úúH|ÈþpÜÛ”o!žè{ƒòðAiREü£ìmÊW_å{R~¿„F|üT þÐm§‡.vñôM­òðAùˆß/c þL|UÙnD|›ïÃlà;‚ ³Ÿ”Ù1’Ð*{­òÄs|/´æá;‚ sŸçË^¥<•øæMAy ~Gdâ7iß)ÊS‰—ò=)ÜYGy%ßeˆ—õ}OÀP\A@¼¾òÏÄkø.>› ‚ ȲÄ” ^Ïw( ˆïI¼¶ïPAˆ×ö½ ü-ñ6¾ƒxA@¼žòFćâÖ <‚ ~Hâãàw½™‡A@üò×Ä ú®4'%‚ ÈÄ[ú~V^‘øÐ4'%ö A@¼wâCë„”Ø'ñRÊ_ßËw( ˆ÷N|`¿C@yA@¼Gâûí!`=IA@¼Câï½!>‡á>°Aß™xâà÷òmË“¥ÁzA@¼ÀˆšZâù¸—}?[ýAÿIµéÀƒ&Û|?TýDßQÔ#2ìÉ«ýrH⻥“[`=‚ Þp¿“j0âC}?ç*ÌôýwfsAdtèõp'Í4YP>Ûôwk<ÁwA ¼xE_·êÓ¹]Cü~w5ï‚ J}ÜN5ñIyî(ÞATô-Ës§<ú^.ð;‚ H!© —õD|xùþå¡×({wøŽ ¢×´)û@|x=ø&AOéËwA¥¦ }0þ-ñáý4ß/ŠwAãr¾ Ø[âÕøáf²ßªS¼Aâ¨J&°×ć÷p#‚ øVñŠøƒæÀAdâóEõkì!‚ Ã%¼üÛ²Ëðf($þáþáþÍðïÿpÝ­—:gûIEND®B`‚visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/example-voronoi.png000066400000000000000000000170161147500217100262140ustar00rootroot00000000000000‰PNG  IHDRö!¤eâÕIDATxÚíÝ_ÈuY]Àq/ ­ º˜Á ¢®ÊE¤.*hˆiH‹™Á’LÊ’ÔÉdeÙUBI95Ð@dLV¨LÑE3¨Õ`vQYÃPaDÕQDD˜8r<œ³÷>k¯õû¿¾‡ïÀÌó¼ï~÷œ³÷ç]ìgﵞõi^¼xñâUôõ¬Ã?ÏþðGˆˆ¨RODñDD4ñ?ýì=Å[ID$Û3_ó]çYÎúZ|0DDR²/&O| î@OD¤Šû.è[‰ßë;ЩúÞýmâ»qGy""UÜo*oA<Êéù¾¡ü âE|Gy""mâ•ß"^Ðw '"ÒÃ}7ñ¾£<‘îkÊ;ôDî6Ê/¯í»¥òwüÊSDD7«á{ âõ ç`%¢hÖÛøŽxAå94‰(¦õf¾G$~DyŽB"Š ½%î×Ê/oï{‡òvDz߃ߢ<ÇeQÞË÷¸Ä¯)ϱED¹ wô=4ñçÊs0QFå}}Nü!Ž!"Jª¼»ï7ˆwWž£‡ˆ’*Á÷ÐÄsÜQ^èCùñDDbÊGÂ{NC†ïDTIù ¾Ç%ž£„ˆòÐw‡%A žˆ€~:â92ˆåMö3Sžc‚ˆPÞaynå9ˆå5|o"^UyŽ"By%ß[‰WRž#€ˆP^ÏwOâùì‰å£/«<Ÿ:¡¼¶ïûˆ—R>È›þâ÷~à¢öß{×¾í¼à‡×û>÷éó8߈Ê@Žø˜¸·pÁúZM߈³Ž(¯ò-hï#~Pù,¾Ÿ×({ëÛ}z¢¼Ê7н›ø>åÃ^œÑ#ÞEùߥ ÿèW½'uУÔ¾øÃ‚¡|8âã¼­¾oýñíÐg×\Öý'ôÞÆÐ\© •o纇øvå³û.B¼¥òãÄo(?ì7­og}ë½dÏn½ïýĕ߰>Ô[Ùí{.åE|_T~fÜ/ ĽñqpŸGù½P÷¿æ{´7qÐ÷9‰?)ë‰_@ù€¸Ï@|‡ÒCÄŸ+öMŒ@|:ß:Ä'Â=éuyU߈?ùí÷âIƒø¤Ê÷½°òÝ>ü½!~\ùŒ¾C<Ägô½ä 6ݾ'^Ê÷9‰GsˆÏè{Þ{ç5|‡ø ¹2„‡xˆ¯ñx”¸ï£ÄOr•fPyˆ‡xˆGùåÇ}¯L¼¸ïÝÊã;ÄC<Äï%^Äwˆ·P>ïñ﫼”ï¯^|Í!â!>T‚¾ï6ÊãŽïfÄçRâ!â!â!â!âñß!â!¾±ûïùÇ‹ â!~fâS+ñˬ‡UžŸ²B<ÄC<ÄËÈPù,Ä#8ÄC<Ä;¿‹õ€ÊC<¾C<ÊC¼0îq”OA<‚C<ÄC¼ñ"¸Q>>ñðíâ{.å3ŸTùâÄËâAyˆ‡xˆ‡xßï仯òÁ‰‡oˆ/L|:å+¯ê»£ò‘ŸnÅn_ß)Ÿ—ø\ÊC¼¿ò|û+Ú[ž~Õ·-ñ5|‡xˆŸ‚xߡ߅»ˆòk¾‹XßAˆO¡|jâ)ñÐ÷ÉnF|ôØÇwˆGy%ßg'¾ÅúAßÍˆß =|Çñ=…òˆ¯<Ä›B?Ž»=ñÐÃw4ß!å!Þ.)ܽˆß†¾c\ù2ćU^Ãwˆ·PÞÅ÷ èÁ:l?³òŸUy¯Qü"ôøŽòPy%ß!ÞBùÄ•çz ÊC|Lå!>±òAˆ?„ïñ1¡‡øÄÐC<¾P¾0ñîÊëùñÐ+M`€ïU}©|mâ}•Ÿ‚ø,Êïµ^êÍø©|¨|yâ½”Wõ=ñýÞ‹n–è¯Sî''—àQâÃB? ñ-¾'Uâñ½€òóo©¼¶ï)‰O§<¾ã»†òÆLE¼žò ÄWPâ!¾Àð6âm‚xòøŽï!¬‡ã¤Êg%ž<¾C¼%÷X ññ_Öz,Nª|bâ)ïø^€{,†xˆ¡<Ó‘÷XœQyˆ‡xˆ§&ë8£òžnåÖI|‡ø°ÖC0Äó¤«?ñ¬ÃGJApRå#¿‹{ˆ‡xüzˆÏJ¼Òü”/~üÖÊ«®<Äcý$ó4Ä«ô·?ô‚‹d}TâAžiË0âÕ}?&N|ôü ë§š–£!ÞÂ÷8ÊC<ÐÏ6Å7ñÛ¾«*ß=µ¢ä5I‰Gy"”wñâ!žå!â!ž(¿òÏÿ—7m´kS?ÿÈ}-A<Ê‘ñÛ¦·‹ßzwJ¾C<ÄT~Dö‹´q?5ñÑf2€x¢,Ê ²ñáˆÿä=Cy¢©”W’Ýžx%åÃߨüÉôë žhåµq‡ø§Œ•ß`=ôœ±DƒÊÛ°ñêÄŸ+¿KöÈÊsºudϺñÊÇ%¾[öSßø_÷¬ñDñnÄû¾M¼ ÷œ«DñÖÄ›AϹJñïC¼ôœ«Dñ2¾÷¯ª<ç*Ä+ñvÊç:¯^ùÄÛ»Çßy÷bÙÝùÉ÷<¸ØÞí|÷ƒ/†ìñZÄ+)ŸZö½Ö¯ÉžÝú5Ù÷Z¿&;ÖC<Ä[¯¡|ÜoBßî{"èÛq¿ }»ï@ï®<Ä—%^\ùz¾_+ß{ èû|¿V¾w ‡øRÄKù.B¼¬òõp¿P~Ð÷˜Êà~¡ü ï3+ññn¾ñ=šò"¾ñ}Zå!ⵈ—R¾¶ï²ÄQ^ÐwYâ'Tâ!â=}'Þ]yYßʼnŸMyˆ‡xEâE”¯í»ñŽÊ‹û®AüTÊC<ÄC¼§ïJÄ»(¯á»ñó(ñÜ4©Kü òå‡ðzÄÛ+Ÿ‹øI”‡xˆ‡xOß˯ä;ÄC<ÄG'~Dùò¾«o¦¼žïªÄÏ <ÄC|\âgð]›xåU}×&~Pùç½ñ®ƒxˆ‡øÛýÄ—ýݱھ¯ª¼¶ïÄw(¿(ûFs*ñ¥–Tþ„ûySùÄ·+¿÷ÖC<Ä"~Ñw/ë |×&þ+~é‰ëùnFüƒoþuUÜ­gÕ'ˆ· þ¦ò7q·ç>)ñ‹¬‹Coã»ñÓ×RÅÝzˆ/E¼ˆò‚¬葯¼Hw›ÞùÐ\™øFÙE¸Ã7ýéb‘‰ß0}-=Ü-ƒøRÄÿÑKß0޵˅•}ƒxFh–mÐw¥:h¬ñÿÁó]ú‘¯ý3Ë â!^zcß!â!â!Þz{Ü!â!^Þwˆ‡økå½|‡xˆ‡xˆ‡xÅq@|vå½|·'^\ùÊÄÛ(ïññññÉ|‡øÐ¾C¼%ñ(òñ‰®<ÄC<ÄC<ÄC<Ä×'>£ò¾¾C|tâ¹Vñññ__ywâ¹V“ÎwˆO@¼òJ:?ñ…ñ¯­üŸ¼êå½ïK?2¡ï?Å@^wâ#+øzy=ß!â äq‡xˆ×&^÷Ä»ø.®<ÄG!^w/âQ~åµ}÷%ÞÑwˆ/¨¼’ï^ćU>ñ5f%SÅâ™À œòÑp‡xˆ×#^w_â}}‡ø ÊGÃÝ—ø˜ÊÇ!ÞWù8ÄoøîE¼»ï_AyßQ>2ñ©•W•â!>¨òÑpw'>šòшw„Þk ߈»ñ|¯O|^åúîN|(å!Þñ'®»pŸ™xÖnM¬üœÄ£|@å-‰ïÀÝ…øzCxˆ‡øé”I¼½ò6O?uãî¢<ÄÛèÞ½ãT"å£ù~豯~tWJÄ?çwž<äNüOýý]çl½øÊÍ”ˆÝ|y âÇYw!>ˆï³îûuR¾?÷ÏœŠFüGßtŸT{‰×àþèû©8Ä&èû©\ÄË‚ñ/ý¹ï‚Ð/ˆû8ñRÖ_屮,ñRÖŸoc} ß!~jâG _ô]DùâÅq$~úkßë?ý¢ïÚÊg!Þ@ùGßý­‡]þÅÏÿÄÍýŒÄ·ûÞ­üñƒÐw¯ä»,ñÊ/úªï}Êoø® }ßõˆ?Ê~JOö½Aü¨ò7}Q¾x=ß#o¯<ÄCü¢ïÊkàñ¦Ä÷)_žø]Êoû^’ø]Ê·ø®¤|ßÅ•_Ä}/ñz¾Cü¨òí¾C<ÄÇ!^\ù9‰ßðâˆïóâÍ|ߥüMâ•·!¾]yˆ·$~Û÷]ÊC<ÄGùq«#ñ-¾ÏLü.ߣŸQy)âU}‡ø!åwùnL¼’òñÙoš!¾ÅwˆŸŽøå!â!>/ñ-ÊC<£xˆ‡ø)ˆO¤<£x®ÅûèEïôÔèóÿ\üÊéëÇ®¿ñ¯Jüÿ|÷¡ƒ¿§I=‡xˆW$~‘ïÁ¸£†;j ˆ_¬*ñÜQÃ}ñʼnç¾x黆òÚÄs_;ñ–¾C<ÄG þ³¾+ñ‚ÐC<ÄC<ÄKû>¦<Ä BñÑ}‡ø,ħð]ƒøeß!>@z¾C¼ï)ˆ7Pâ]ˆ_õ}@yˆO¡|hâ+ á!â!â!Þ‚xYÜîÇÞz âñ=¥ï½ÊC<Ä×'þä{‹òñA}‡øºÊOG¼žï7•‡xˆôSVˆ‡x_â3ú¾­üäÄã{Ü!|—ò{‰Q^øI®Õ@¼°ïÊC<ÄÂC|]å'"ÞfßM|í[ãyâ)гN~Ä+ñ¯HüÇ¿áÝ$~QùøÄ3õXñé ~¾k5A‰æû wˆÇ÷”3Ž…!~PùÚÄk(ñûpoW¾ƒxwå!¾ÒŒÁû|Ÿ•øòyˆïñâsù“xõᕉwQâ!^Œø ß[”ï#ÞQy|¯ä{pâ»•× ¾ö”d‰Oáû6ñ}wÔø*ñ•|‡xò?Jü†òÇ÷i‰×þqë ñ}Ð+_x ñÂÄwO`à«|aߣoæ{ â÷*¯G|å!>ñ'åÇ'öUž!<¾ÛL)šïÓ¿Ëw”¥<ÄOD|»ò}²C<¾C|4å!~.â[”ô½0ñáû|!åeûΗüÄç#¾Û÷måÇq$ž!ü„Cxå ðýÄûLMãEü¢òR¾C‚ò3¯~-[[sˆŸ“øÖµ§>‘£ì¾Ä·œ«µ‰wW^XIÍõ•‡øpÄ'ò=H1}wW^Û÷ÏùôÛÅ#>uU.ÇC¼ñª¸C|·ï¾Êg$¾û²¾C|mâcúñ}¸û*Ÿø ëñâS?{!^Äz|‡ø”ćõâE|·W¾ñÇ ¾£oyú{Ú+K¼ï5ø–xÙÓ¸ñ^¾W&^óîÏ]Ä·@Ï4d ዯq2C<¾[NSÓGü¶ò³‚Xö¶H®Â[¯}bC<ÄÛøÞMüôS/"8¾;oy†kà~¾} ß›…ø,¸ûã÷?ç ôó.ìgà;Äëïrª+ᮡüÅ–ñ=>îçÄC´~Þµ[m|çY§Sç§MFÜ¡¿¹}YÜ]”wâÇ•ÏM|·òf¾ŸHöÅÉ>È}ßöÇe·W܉„~Fâ-}Ÿp:šÁ³+¾éíâkl¯é.Ѓ»8ñ7•ÿدÞyèú‹é‰ß¥¼1îÚăøh¸oD|o³ï‚»ÁŒð€NÑ w åû|/Bü¶òޏëëÖzd'¾Û÷âÄ»ã®D<¸UÅâo(„u=âñ¨0î\¨Y- î²Äƒ;QyÜ7~â ñ•‰Çw¢pÈ!>¬ï"ÄóÃU¢yp—ÈC|tâñh*Üe•¯@|dßïø›‡¥¸óÜ‹]®i‡âw³~]ð'›Ðð½˜òˆOû^ëñ(»ïçLÉZñqqož™ ˆRû¾(•ì¸^ÖwˆÆ}Ízf#Jíû6V²ÖÄgÇý<|'ÊK|#Yâ.Äçðâ‰Êû~èe?ókÇ´¡ß uDâ+ùñDå}?'^úsë!>–ïO”‘ø½j]¯ý^¥!^ÝwˆÕåõÓ•_öÚw=tÞÚ/{ïýï>Ïkoÿúá/8…ï.¾¯/=ćó=ñŸ÷O?»Xmß×è¼ð}Qù ÜÅ•oÜÕsÜKAŸÍ÷mâ}•G|±!|pâ×p¯}ã·(ûuk¸KY߸·k¸W€>¡ï?ï>&ñ-²×€¾ýÀ“%¾Cù]§ Äç"^Pyˆå{@â;|ϨüÞOœø]ÐïÝ[ˆå;ÄC¼?ñݲg„¾ãÀS"¾Eù޽-K|Î!| ñRÊC|,ß#/…{åû<=â7”ï>M >”ïñ>‰ã.«üýõòó}×&~Qù‘Ó¤&ñi}o$^Dyˆå{Uâû”¿0};Kß ˆ¿P~ð4xˆ‡øÙ‰Wõ}ñ»dï¶~ðÀ3 þ¤üøiñ¡|‡xˆ/H|‹òƒ¸·C/rìHdW!>ñf7Õ@|,ßk¿¡¼ î7¡—:ö ž«4_dˆ×S^ ÷5å¼DÄßTž!¼±ïñe‰?W^Û÷ èÅ=ˆ‡x%åyôé³}ÑŸ?,ÒšïñÖ—XöÁçþ®Mç¾?òñ»Œ3Ãý”Ʊ§M¼ìÞrG|(ß!ÞÔ÷ ë«Ä+)ñï;q<Äß°ÞØwˆ‡x=â•gjG߉÷]d.âA<Ä(Ê÷kå™#ÞxíEþ â!^Qù€ÄŸ”g Äë­Ö ññºÊÇ$þ¨<ÄÇ!þ¨¼ÆnC<ÄC¼¢òa‰g1¿hÄ+í6ÄC<Ä+*Ówˆ‡xˆ‡xˆ€>¦ïññ/ <ÄC<ÄC<Ä$þ¨|Lß!â!â!^ ˆ‡xˆ—Gü/Œëo^üÖâ¿oü²–Ížü]ÜÚõ×[¾rsË'‚¿µö¿vþ­µß{±Ù>ó}ƹÿÿñ«ïmÏl¯¢­…KO¥š„ø]¾[*ïññC½ù÷€x‚x‚ø‚Ä|ï#ÞFyˆ‡xˆ'ˆïÇâ â â«î{7ñÊC<ÄCß•‡x¢úÄoû.¨c‚x³…ýÂÏCü7¿ë1Sâ}zª­|´…¹ïPX„@Oùß¿í;ÊSUåCá.N<Ÿ»¶òݲŸ§N|‹ï@O%•#ûMå‘= òƒ¸w(¯N<ÊÊ·¿û^åw¿×w '"”¿I|£ìºÄwûŽòD„òã²ïUÞ”x”'¢™•‘}—ò;ˆ÷å‰hfè¥d—'^Êw”'¢9÷½EyâQžˆ > ñâ¾£<á»ò·‰Wòå‰ⵡ¿A¼ªï(ODïF¼ï(OD¯§<ÄUð}QùUâÍ|Gy"‚øâÄ£<A¼¸òËÄÛûñDñ•‰Gy"‚xYåcòDñºÄ;úñD„Gy"‚ø²ÄŸvƒ#ƒˆ ¾ñ×_q|ÄW ~{JL"‚ø¬wÔ4.5‹õD”¥#Y¿Ãw¬'¢,¸Ÿ7é£O}¸c=¥ÝEù(Ä‹øŽõDYv{åCLC&î;QŠŠÏLD(ï<™°’ò|´DDJÐ{®ÝÊÇID¤ ýn⥔çS$"R%~÷òÜRÊó©*¿¶å&âG”çÃ#"R…~c›­Äw(ÏFD¤ªüÍ î ¾z>'""Uè7µ›ø5ñùTˆˆTÅïø½£ÄQØ žˆ≈(/ñ¼xñâÅ«äëÿœha×wViSIEND®B`‚visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/example-xlucent-fixed.png000066400000000000000000000335371147500217100273060ustar00rootroot00000000000000‰PNG  IHDRö!¤eâ7&IDATxÚíÝ{¬'Åu'ðû_¬ýÃîþ/ÒÊ‘ÿˆå¡$޲RdcÆÆ»k{%[‘ Á’¥5²„ÇbÀL0Áƒ_ˆ…õa0cÅžð02ZxÊ8][ Á¼D‚÷a“ÞÂe*5UÕÕÕUçTªþ]]†{»·ÕŸ[÷tõé @ ƒÆ@€x@€x@tMü½Ÿþñ%ÿúù=¯}nßq/â "m¼ôå^8õ¼çÞqÚ³oú úXƒx¥¹2ýÂ_˜M…>ÞÈÅú3¿õ¾g~ó½áü­÷­å>‰xe÷…¯‰ánçgÿÕsxŸbU¨Ùú¬ìôϼñD2âÓq·ó²×¿€÷ @ R"÷có¥/ßPDü½Ÿþqî&÷¼ÓyˆÅsï8-ÏwjîŸO|‰ïP@ X}OQ~‡Ïw\ƒE òúŒŸ‘k°;¬¾ëĉ@ L¾ë\Aüe¯–x(@ ÇøþÆi‰Ÿ[c >o Ê5‘J|dñ{n¾pêyËÄï;îErß±X@ L¬X_<‘ß©0…G­@ X§ðú–¨â‹xÔjb¢¾Ð¿èZxõ÷A«ú™¿þ•»n{\¥þ¼¯Ô¯¼ß×lûŽcü8‡ÂügŽ^úò |Ä?ó»'Lj/¼Uñ‘ÞÅXw^pw¯Iû¦cü0ýž¤ŸBü+íÆ† ^¿£‹#¾_ß¡ü¦pÏxÇ1~Öžøõª4¿{r3â9VÄ׿â:W“éh”§œŸP~k¾§¿ã?ygýÄ{W\!žiÅdMâ#‘õ2ÊÓÏO(¿5ßSÞqŒ?f-~ñ².†øÚóÄoøÈ›ŽñS8«¼Pú¢†õî§”_Ú]ŒòŒS´áëç~ [ˆöïkü¼pÝû¢Iÿ×z·>1­‹Oÿ»¬_âß°ÿ1“r^?÷Ë€D ¾ÉÚ¤Á×Åó-ªiå»ySåñEßç”ïâO`QÛïøà¡ ܈ç%ž¼YúÝ­LµŽgƒŒ7ÄA<ˆñ[ žäI ‰]ã+uš¼÷Ó?fÅ}`â_·ïˆ“ ~¤ô…'&ë¦Æ>°q z-LJ¦ðSG‚Ю¥ÉþÕyk%O=ß…Ìâ+ÜgâãHˆï…xråçï&ž¶"_÷âE]®L|ýê5Û¾K&—[A|ïÄ÷z›ëÌ~Š<»uÏkûó=…x9D¦/°?×ש»íKxÇA|å+„x²ë®ó¾Çˆ'QžªORÆ{ƒ…_&Z ¸uhkÄÇ/·’ü¶ñÝ(õ}øBåëãžH¼ýË_   rŒ…­ˆ~EÍ*â›4ž,ªØ,ù¾L|ÞÕWªYYWöÒ† Äo¤{Á*”ã‹&A|ühÄ/È5i"Ÿ³ŒÒëUOüÏ/À¾&iý;Iq¦Ât¸ßipuùv"î‰ëâÓ·¶µ¿šÕòiPj:ŸòÌ¿4Ü×oBÍÐ_±þ5ÿ² Rç¾ã^¬|eµämßǾC'±¶½©\ÎI¼תMM’õ:_­É¨ô[ÐÐ_¡0wN]Eï¯Á4àY7…;Lì ð–ŒýæxâA|÷ÄÃwâA<ˆxàâA<ˆñcßA<ˆñ ~Lâá;ˆG€x? ñpÿâƒGTOüÃô´JH:ÿgßUIµµ'î¼Z%ɹñºìV?öÈž¿SÙpk‹‹)Iކüß ;Ìjå»Éů¿ðÿÝOÚƒcw?6&Eñ‰¸ÛI.£Î‡NÞoÒþ÷’´·É´ýCo¹B§½ñ¼£ñàÏô3ïtH¿"åÌJÜ­ìßuXç­¿qNõ¹6zm:Ñ™h}¤÷dùÓ‚«ìeZ¿³5Ü}ßS”¯C¼:ö²ûÅû÷mµ">Î1Ÿï„Û7¾ÛÄg(¯§íAâU¦ÌèWuÎZE||kÄÛ¾Û: ³}·‰OT>r(œ0¬½×7ò8eÊïlÍwCü)qPe ñ‹¾“(?w/n!ñþÍßÞù¦'¨”O™wªíÛ¾;Ä›-—û®‰_T>½½Ìb+•UýÈhoÙ.‰_¥|äÛmåãÐGކÿ˜ÄÖ„)í¤•nv¶æ»MüÛ¯¿Õ(ß–ø”ó|m¿$ºÂ]¯’jÏ]TI'¾dû)Ä/*¯ùŽŸ¢üZ”#ˆ¬jFÆA¼£ðœÑ)¾S<AâSº?¥/GùMáîjôD^eÛZ|p ™gøe¯|×É:…'$~•ï%Û¯O|Dùµ(ÓOR[NáëQ>r(æˆ7€Jlj¶-âÅ.‹t”/¼âJ{ˆüg&þîWiêøî+™¡pðÛÕ–ïûíËTÎí"oû‰ÄG”7p—ŸÝ2½Ö·¸5ßÓ‰(ŸøíÎ*ŸÞ·RÚúËVÜY»ÙQ½Ôôu5Giîø”l–c ÏŸ/&-ñw;»&~NyÏD|äPDˆŸkC âg.ÓƒFi_påý~§b}WQ¹\E¼ï{Pù&ÄÛj·">èrGÄÏ)Ÿñíês_•øø3²I”ç8õ•ŸûCGšïAâm#\¦+œG|ÞöÓ‰*ïð-‡øìG‚!>ñÛ×PJ ^‚ò;lñ)Ïz,*+Gˆ×©kå´Äßó«{ƒ)Šx÷_p’ŸéħÍjKüÜåVgæâŸøøÄ âë”:ÊSý¤|,j´×5út–¯¶éøNõWˆßñ‘ºqÆ“ÊAü”rh2ˆou\åƒmmV52[K¼ßa&Øp†Õ÷i¾ÝXDL;³o}šÛ`ÉÝOm‰ßýÔøòAÒ–øÈÒIBâ3n}ñ«{¥¶R>1+ÏÔB’ø’»[Sˆorw«¿V2…øÅ\ Q–O|bë±râçŽÆbkÜÝšê{¶òBŽŽÝÊÆ¤ÝÙ¦ñºÛŒéI`þ³šï‹åš’*Í¢Â%U~Ú6dþŠøÄ)|J§šøÉ’~j¤ŸwTC…ª ™ý)ħÜãJEü¦Û-ާĦ¦2.;Ä;-*«ï'÷³>oCƒ˜Pa’-ÏmU›Iÿ¾§Ä)üÚ–“A”©NIŽs-…øUm&#Ä[¤ØÅFÍ«”—ì»8â'©!¶_Ù÷Å”T GˆoÛ/Þ!>¢|Ê¢øôS)ã순•|Ãf®Xz³ø¹u“öÖæ¾7ñh$öC¿øÄGäöòÈDZßSVÔ4ô=N|pFLûàŽ¹¹6ÕSŸt:[N9,>ñ>ôîOû#TÃ97ëœ,Îm¨kŸâü)`ÿÞÄ£‘{ð1R’ùT•øÈ3ƦM†ðç—ÐÉ·÷æ‡eŽøÅœ+Ëú‰£Ç{¹u­ò5§ ¾šï Ä·R‡Ž—øUå™—&@<ˆñ Äço”勵Aâ›ûâA<”JçSžõ>¬ ï)nN|ý¿-@<ˆñƒŸ¢ü)'>q»l¼k‚“Êß_·ïˆó„[û9Y„Ęƒxj5 >¦|`ÉÄëchXWÄ›ŒLêA¼|ßA<ˆñÄÄׯÒP•† åf±»åÊ'únïăø1‰ŸÃ}z¼ žøEy«¯wQ â‡">Å÷¶7ëƒxù¾§·¸ñö^@¼4åqè(‰O÷½m×-â1‹ñ ăøfËQ‹G V#‹øµ¾uTá~}/ ON<«ïsûñ ~|âí{5Í­›vÚEyÿùZ0~ñèvŽJ|ÇÁˆŸæ×MV[1i+ïl:ƒøa‰÷oÇü^¦F»Žï£ô± ß§¬»[ùn4Å­­]+â[oºk¿‘•øSݨR”òÄ?tò~•[ ž/à;&ò ¾?âß~ð*•Ãè-W¨$!¾æ¡è‚øÅúO…â<ø®ÃvV ^ø¯‰…š:ÄÛù 5zo&òcÏôúWèùüÝøß kq·•¯ÿª6A¼üË­c¬ÕtG¼zåê¯ø/*óí4ßUþƒ¬½Ë/*Bqåç|×Ùä·Î&ˆ§]4I¾‚P”ïÛ¢ÉrÜëWHl¸u­I“â»ýõ$ÊÏõ8»ç?ÿG{E¼úO%--#E¡àŠM)'þÖ߸Gå_ú¶þÄNS±!LýË#²ñшïôÖ§±M:sùŽˆ’m.*¬%¾Pù µÆô¿<çßé4ÄúiqÞ= â î†x“ö¿“ûnÿþpJÿ¢”ñão&ŽøžN|Äw*â#wTÙ¾;Ê g÷©O¹Mw›Ä›©txzòÉ{xúÑˆï± ÙFˆ/,Ç×?sŽ·">Ø«ÀñÝV>x§kö-Wqâ·£ü\ý=N¼Vž¤VÜãÜ5Þ1‰ï±™ð¨‹&ƒ“bOE¼?…·•/'>½ŸÚ6'ò¶§uˆŸÛc“•<-‰ïî‘ Ã_¸®¦É¡H$¾B->¨­S…÷Ó·¸¤eÂ"ñÛéj\?³H¼VÄÛd[Ÿ¸HæùÛÿ,ž ~#ÄOÇ®›\µb’vEMP[CüÁ³ßöó<ë­¯ä«ÿYØ'ƒx• >B¼J*߉ç[¬)‹øÄuåO~ád•?8ï8•ús“þ—•ë/Dynâý¹í"úÍIâ…â¹uñå?”C­=w}·ˆ·—N‚xâ'nCüœòöêO@|| $>ý´áÐÚ:u²ë3âKj5éÙ ñ*|ISVÔj@|Kâñþ,x‘x’ ï §L¨cÄ¿ª<ˆoH¼ëS+â%”ã$¾_å9,^‡Œ(¿AÐSˆ7‹ßÃÖƒøÄññ}ÔâãÄÛÿ·äÂìÄÏ]Šœ#ÞQ~µ©/.ÿ3ÜͺIÏG|ÊZ—æÄ£Ps a¾ò‹—[í/(\~#¡«p5âS&ò]ãî<†‰|ýâ"ñXQÉËA¼,â§¥E“Á]S-²t2ñÁÕ&÷ýöe:/½öî;Õ³[Sˆ·¡×Ÿ/öñ ~‹ÄgG!ôBžÅú`?3…·‰*ß5ñé2–Üh$ÞnPÃñ§n}*!w·öM|¡ò†ø¶Ïâ~v«™Èßó«{ãÄ0…'$~®]ŒÝZÒi3Yø@p40X¥ü"ñÁ6¬=j@— ¾{âÛ*ï¯Ö Ûo[1A|÷Ä7T³x¤4âÍ5!3&ˆïžøVÊ£•ÁËþ@Ä@|åíSË™:!‘M&òÁyÜñ#„þçgòÉ/œÌDô¾ïyÊû¾ ‡¾wå}ßó”wp}ÄG|_E|Äw!ÊK8æ|_«|Ä÷®‰Ÿó}­òß»›ËwíûZå#¾ËT¾{âÓ•ñ…¾§+÷½_åã¾§+÷ùʾ¯RÄ¿è;!ñÍ•ñ EyÉÄ/ú.PùˆOQ>Åw_“ø•¯I<Ê5 ăxâ1‘ñ(Ôˆ'ÞéÐݪƒ+ 5(Ô$†ßMÞïšâA-³ÉÙÂ×À`Œ| äWá#O†’\Ž@Ÿ±^|ŸzlCVÒÆ±^à #„x=Õ¦†éNã@Oµ)ù²'ÎK:ZcC²ÉÝiz%~¼˜S ‹ñÞ98>ˆG,-ˆÇh@ @ @ @  Ä#ˆñåñ­Ï½’8P9qÑ­//&Žˆñ©¾CyD_¾CyâAè{†òAßÛ*ïûÞ¶Jããž }Ð÷Þ•÷qφ>è»dåW•h¤ïãž }Ðw±Êw@|Ä÷UÊG|o«üâä½Gâ#¾w­<ñße*ï¨ÝÝžŠøˆï2•—N¼Mùƒïßm²ø»÷½Ùd[åEÕÙ åW_ÿ¹½_ýäž/œ®>ªÏ×*oS~Ò­‡t¾éºƒêc×ÄÊ/ùøÑÝï=rÆxX}TŸ¯UÞ¦üâKï:çoúø'ö«*eß{a=î{ºò‹¾ƒø|âmß¿û •«ˆŸóý[Wþ¦úøW7ÿA}â^Gµ}7Ä«¶ò«ˆ7¾kâµòú~‰×¾âÕG[ùUÄkß ñú£úGQÄpá´&ñÒ”ïxí»ÊGϺ$]yã»ÒÜ!^¥úG­ü6'ïâuªÏ ‰×¾âu@¼Nõy9ñ:5ñr”××W{_ãh~àá÷©,'þ²S¿¯ÄSo|×ÄåófñÚwC|å%/‚tˆ¿àÒâÍDžøî*6ñ§½õ¯ ñf"ŸGüúøuñB”×ëg¦ÎÃÑüê~O% ñüŽG}åA|ñJsÛwŽ&^eâ‹t&òÆw]¨1ij*/|…»™ªë)¼C¼V~ñZyã»M|W_ÍT]Oáâµò«ˆW9G¼¢ükÛ™fñsyŸ¹Õ÷]OäW¯•ŸóéÒëâäýèùGç²>ñJsC¼ñ]çZâUF¦ð}Ao_n5Äßu®%^¥’]ïLá%,°‰ÿ¿n¸.˜£ŸR«‘ö³w¶hÒ–Ý.Ô¬­Õèíä[F™{}èmåýÌ[Tã\w󽋽­¼Ÿy‹jLÑfÎ÷†Ê‰Ÿ“]2ô¶ï~¡&};~¡Æ©Õ€øÒ[Ÿæˆ/Tži½|É佉òöúÈ ïÙÊÛŽG|¾ÞÆ^ôDy9ëåKˆ¨¼’ÝoOäWmÇÆÝ¯•8b»l`àãž½€21󋹕)ò5AÊpHNÅÆ÷½Dù¹÷'ø}Íåónƒ .ê®(ŸøtߥopÿÊw~M¯ríFÌl]ã~ö¿}x÷›ëûÔo§Iª–«Ü_ëûÅ¿óÃÅ+«>î*þòÁ¶ÄÏÍëI×ø¿‚Kn¦N‚ªŸAœþVÐC¼)Á;Uš¼©ÂÛUOÜL˜\ù‰´ÉAâÊwͯ»VS^CïÜÕݪyå…LçÇ Þ¹Ðj.·æáno_nñôýâ›(Ÿ}úâÈÜú^GyIåÔU´RžújñþZ“y¸ûÊKn)Üý#A‚¾§¯¤Ìƒþ¯nþâ‹ïB|¯V±éºO“òm§ós‹&{ô}Õ*ÉÄ^’çïƒ?E×Û+ï,²Ì&^ßyʯ]/?6ñ¾òk×˯UÞ^gY™ø.¢Äw¿Óîão”÷×S–o9â{ñâî+Ÿ·^~lâ§™…ó$sùÉkQé,²ñ´ó÷8ñ½‡qžÝê_^”÷•Þ'µŠxS“™z޹õ” ÞVÞ_OI²ñÈ"z_î{ ñ}Š¡ÏmºQÒNä ô¦YJ­&Hü¾åu«2’ZÍxÏÿÓ}l2z¤C¯›ÛØ=@|¹ï*ì^üÞ)î¯ûØ×jLèþe‰åø¹YüÄ«ðÛ€x;üö´Û×]*¹ËñÝ_þh'{þnˆïwŽF¼]®¡*Ô8›Ärü*âÿþ›×ÄSx¹…šx¹†°PãTlÖâ¾øï"Ù©ï¦PÓÅ‚ÈOµ@~ŽøÄ5òéÄ/ú.SyÂ¥“O¸t2H<÷ÒÉ ñqÜ[AoßÓDûôm_‰ø«¿ÿ-“…Äö[/™lK|¢ïõ•ô ™,!þÓû„É‘ˆ¿ç… M–óÿ½Ô$ˆ/™¿;w®ÎùþÐwö™,!þðyÏšñ¥ÄÛ¸G O!ÞÆ}­ò!ÞÆ=ý"ñ6îqèû"ÞÆ=ý"ñ6îз">Hùï>|à÷ªNV.ÑøÊÏá>…xÛwáÐw@üœï¾ò‹Ä}O‡~ ÄÏùî+'~Î÷ ò?绯|œø9ßÓ•N¼úO•u&ò6îºË˜n4–⻯ü"ñAßÅ*ß=ñ¶òqâ㾃øEß ‰w”ï…ø¸ï„ħ(/Šø9÷ë”kœù»n©ÏÄ•ñ]¦òÒ‰_ôøE凿ܺH¼­|„øEßG%ÞV>Bü¢ï’‰_¥|¢übÉE߉_ôijo”Ÿâ{+â'1‹&A<ˆO!>Eyÿ+¹‰¬¢©I¼4åA¼â%DŠï„ÄÛÊwA|Šï„Ä/*ß–øUÁ­< ñFyâÇ$³xÌ♈çV³xÔâE×âA<ˆžxVåEZ±ïÕÝ­ù>õÛ£&ئ&±GM^÷>â}¯¯üÄÓ£f®M zÔd´©iHü¢ï‹ÐÓ*¿ªµ$GÉmjÐirEpŸè{åãN“ñµÓdºïÕæò…݃óˆï%@¼Dâ?ðí;@<ˆïˆøÝÏLå*âµòºÉˆñÛ"þm·|ăøŽˆÿÐ3¿ŸA¼ ’†” ÄcâA< ñAåófñ¦\âAü°Ä•/mè€x'>eû Ä‹#žãÙ­ôñ2‡ˆß,ñ>ô>ñ‰Ûñ ^ñwï{³!^+OE¼Ã½ü¡â7N¼Ï}ÆöA<ˆD¼ò]§­<ˆñ ăøî‰·K4¦JƒY<ˆñ ÄwO¼=±JâA<ˆñ ¾âíõ36ñ‘* ˆñ ăx.â=ë*⃠%ã%âA<ˆñ,Ä+Üí,$>Û÷õõŸ3 â}â/ùøQ“ ăøÒxðý» ‰/ñ} Äïýê'mâU‚x;v¿÷ˆJ[yâA|)ñ:m囸¾âu‚øà^o+âA<ˆQ¥)÷}xâ* 5Žï~•…âK‰÷•oåûˆ÷•ñ6ñŽò˜Åƒx_껣|Æ,žÊ÷±‰·WÑ”Oá#ÞYEÃt­ăøíŸ½\’Ð÷í_¾br$âý…’%â·E|Ð÷µÄÓú>0ñä¾C|MßA<ˆß:ñm}/$^7ñ ăø­_>…çð„x-ã9|ƒøÊ¾ƒx¿iâ›û^H¼]±õø'/Äwâ7A|ážÏw*âEqÏä{ïÄ7ñăøíŸø½NÛ÷ß¿ûßn3ÉG|÷´¿ ¸‰?éÖC:A|:ñ_z—Ê8ñ=ø“¢ˆW¸ßùîÃ* •צxø}:Iˆ¿ìÔï«ñ-‰/™Â;=©|·•g%>…{Ú)?Ÿïšø7]wЯ•‡ïñP²Ÿó‡7iâu.úž¡<ñzþnˆ/QÞöÝ(_B¼ö]ç¿ãQ/ˆøôú̪G8I&~Žû|ûò‰W¦+âåá{| ¯|ñAâ¯~à÷TfoÍñ]e×ù^‰'™Â›g±úÞ–x;´ïo»åëåÊsOáù{…šæ%x#{¤ïûÎGüîç?¶JyŸølåí|ùDÞ”à ô]—k†">ñ{íù»!>ûgK^‹¯C¼™È§+oX/ôÝVÞ©Õä)ïønˆïTù.‰/_Hã(_ò³O|…46ñò«4VÁ;ùY£ko+Ÿ=9ñ¾ïÙÊÛ¾ÛÄ÷¨ü8ħ»]‹'Y"YEM†òÒ¦ðÁ…’]\hâ»­üÓü+jò¦óT¾ÛÊS- ôqïTùþˆç¸5øeO^qÛÑî5©þsÕë”@|yÔôõ™U¸³.‡/!~ítž0‚¾VlzW~âWm!‘xÛw ž¯#M/káÛö’¬‰{ ñk§óPÄO~/øâuñÄ_ü;?¼â=OuJ¼óÄß# wá»ÓüÜ÷ ÚÍ'ï$Ä·šÎG”Ï@?¢|â÷A¼ÿ¸[ùµ¯Öñ]Wäý/;òî?rrí¾SâÇ}8Ê—ï,‹ìbþî?‰vþž¢yÜIˆo5‚î_‰-Q¾—+±=ï?šU&ñÚw¿JÓñþ£YI|*ß‘ïŽò´¾ûKÝÛúNE|“éüñyëm‚¾w¡|ÇÄg?º/‘ø£ÝkûžX¨‰øÞñÁ)|9ñΚÈ^êï5‰÷×¹·Å–ø&Óù9âmåÓ·6G¼ð…óݯ@ðý»u’onm#þÉ+nsr‘õ+ÞóTÄ÷úÄ_öÓ?7¹v ¿÷«ŸÔYòtV¸nN`÷'èkýÌî÷Ñé_¾}m·nE`w# õýæ›5Ù–xg:_ajï¯Û¨Ì¸ë¯;è& ¾ˆxã»­|ÆKÕÄß#w·&oû®3²÷šÄÛ¾§+¯‰7¾峉7ýglå;Z?£@7Ä婖Иɻ£<áäÝö=Cyrâ ô»Ÿÿ˜îyPMyÛw•yM ñwz.âifñFù<âßKˆ7¾ëõ3zß;ñzÚîŸ÷L‰ÆQ¾£F’ÚtGyªíûÄkåù|Ï þ—ü”ãØjâU~è™ßç®ÞhâßuflÍ'Þ”k@|ñ: ñUšiM-~ñ w¥|¼JÓœøå*<ñ¶ò]t‘tˆ·•ç Þ™ÈSUÞˉW¾sÌâMÅFùnÏåY•÷}Ï#~úÙ½¯Žï žŒx½âmåãZ»›Å;×Zˉ7Ê÷õ¸çB«"žðF'ç*«!žðG(!ž©Jc_s¥.Ô´•Wš;¾ƒxbâó–KN¡fñ Þ!>¸œ&›ø»HÚÄ;ÊÓÞËꬥQ¾“/žÉ&žÕ÷&Ä>9dné$ˆ/½õ©ä¦V›ø”+j÷^Ñäªå4ÓLÇ‚Bâñ\Ö8ñÜë#¥Íß}èë¼›„xíè׎‰Ï~µäħG_w·‚ø1ˆ_Õ|¯ ăøÄw„wÇ1øÞ)ñsʃøÒ6dLÄ¿ Ä“´–ìšø ò´ÛEüÀ¾•/ÙT/Èzj&\Ž{ú¹/Ø,ñôå›ê×w_yŽíÃ÷&Ê—o &ŸÝZ!6N…xJvÃÌâ}ⳕ÷}ï‹xßwZâ}ßÉçò]âëéø^¨|ýzˆ'&Þ\k5W\ƒ³xÇw¿H|Gʉ'T>H<ÓDÄ—oÿñâÙ‰ÏS>è{¤"YKãWáXQôÄ÷K¼£¼¨Ã[GâõËž»x±µý_úß:A|âç"Ñô¶Äg„Òüò î:ÿŒ›ÔG ¾wâZóÏ¿üïÏ}ùWTªOtæ¯Bï_EÈð=ø9ˆoL|îò‰×”kßuÚʃxßè~¯4?ë–SU:ÊgûΧ<ˆ_M|‰ï‡N8$x§ âAü û©}·‰W™=‹W¸+âOÿÆÔ':A|÷ÄçgÌä]/Svâ=B¼­|ÆüݬõT©ˆ7Ê«ñ_R|—SŸ™“Ý&ÞWăøî@j ñÙ‹&•æºPcÊ5 ¾oâ3|…û¢ìñFy\nñ‚$Þ.ǯ]Qãߎk+Ÿ]Ž&ˆ¯Jü¢ïŽærpW4›ùøZâ±hrâÏî2)Ítc.·ïz_Ù‹&ƒÝäM>ûŠk…À­O įòýÐ ‡ôU 3w=7Ä'*?áÖ§±ˆ·}¥¼©†›â ¹é)%dønˆwÖMf/ñ͈O¼[UåÁ_>¨}—sAÕTZRˆ_¬êd¿ ô¨Y«<«ïrˆ7*âó A¾Û7¸ú¾¯"þ¿>}cðóÍï+_ø‚I|ŸŽ]*£”uYÕž¿;…õE¸ùÚuW fõÝ'ž¯D#Šxg}‹S'=Eù<ÜçfôkosýÄç/þˆˆ7ÐW«.®Ú…QWìŸúÈ *íYü„ØLÈ'þ¬—Qe|O¾÷ìÉ{äùk‰÷§íy<¤ÈwÄW¸+âÕÂ;/xg £&ޞ·…+{Öç)â;ðÝQ^ÈüÝ_!ƒ™;”—3÷2J`=Ûwª‰üÖkñb}´}"nâ…LÛK|/TþOœ¯pgòÄÃw¢±ïrˆ/y  Øöñ þ_|ïúäïLáëOÞå+âá;ß âÅ?@qfŠöŸ+”hêø.Vùí?†ï˜Â#0…â;ˆD<|G 6>…'÷]¦ò[$¾#ŸÂsàâE߈-ûÎ4y«ü¶ˆ÷ —X(ÑHõÄ7#~ß1…G` /ÖwiÊo‚øaŠ3ð)¼|ßA|Uâá»â™ÞOÈd“V_›õ]”òƒßà~”R îöotø^ \ÏNüF|O'Þy=ˆß ñuœR¢i2y—¦ü°Äæ;m‰&ïQjÈÓ~¯und ßÜwÏHü`¸OD—X1‹ñˆ—0…—à»å$¾£œ#¾µðÄs?^qfâY"‰úÌÖjñvQ¾oJùqˆß”ïXÈ6wà4ÜA<ñCú>á.'DÿÄovò.Dùˆ‡ïˆµCtîËnº÷~;ç¾ìÁk¿cg«WûìŸ1)ÊÙÉgnÃ)|ßß‘¯Ý÷°s¯ðó÷œ¯²ŽõÝßyãsÑ÷9åßÉ•O|µ¶ïåâùVÔlÇ÷¹wÄñ}Nyí{5åû&~HÜá;ˆ_|µ¾ïAåí[ŸX'òûâÙ‰7ót'ïûÊ9|¾æ¹‚YõË/¸ËI>âÏû§ïs Äûc/…ø ï„Ä'¾T!Ä;7ÐVh–à—;+9ÐL|SâÄëo¿fû•o”øî:9fñs¸óYïLÕÏ?ã&ôdz=ÒvÝö¸Î.ˆw^m ñz]üY/ÿ"Õ-ÍèjËzã¬+8‚Ÿ{ûé:}1[ŸUě׿]â}§U>ÑwBâç|w”§Å'?ŒòöùqSñþ«Í&ÞÜúdCLH¼Þ¬ýûƒc"ï_®4D:Ê7?‹Ä«p|7ʃøŸç{>èûÞ„x*åmß èŽò´…štß&>è¦âS^j6ñ* ‰w¦ðΟίÖúŒO<ÓŒ8ñMI$Þñé/^‰W¸+åý¯ï;+ñ¶òä—[7H¼:!ß°ÿ1'ÅŸòRåo6k’ãŠk°DsÖ-§êä¾t™8~RˆW/ϼlÌâ¯IÏa 5ŽòöăxÉÄ›½T#Þ(ï\n•O< 5«•ï—øÈDžÃ÷mÖâýSTx¡†x»–ÂQ‹··ìoœ©Pã(Ï}ËhâøI$µøuÊÓ×ÝêúœËWX¿©5~!u;µx¦E“s“z¾g×JÖY]ž8~Ò‰¯° ¨â¦SÔÿ2!·>uA¼o}µ;žê7{I?)ÄO¯.ªñˆŸ%~Nùâ‰Áñ Ä#ÚF°úüÊ”6d¬¾A ~™5[ >}ü,ú$žõŃxÄ&ˆ_¼_ÔW>¾Mî6“ñ)¼¯|„`Þ›N·A|úø‰ûn^)<ˆGlˆø^íKå&x;ÄS½)•_¿tâ/zêxr”Ýö¥HrìñÈg'ÇN?ya$9öxí3×EÄ÷E|«dõ;yx.â}'W>Ž;ô‹¾“+Ç ú¸ï¬ÐƒxZâ5òæî*¾uñÓ±‹&ý¬\‚xâ}§U¾>ñ‰¾Ó*_ŸøDß™”ñ|ÄÛ¾ë¬|ë“iÖÈ'&ˆ„øtß •¯O|ºï Ä/n°>ñŽï ăx⹈ÜÝÊÝirîy ÄoºPâA<ˆñ퉟p¹—[A¼øZ¼¿îžûrkü‘~òLj_§<ÇA©é{¢òä{¬‰{ºòÕÐñ´Ê×Y7Ÿ• ·>!Dˆ¯ykƈñâA<ˆG @<ˆñ ñ ăxNQñbˆ¯ÿ¢É¯¥-ìQÅe/ˆ'ˆï…ø&ã§Õ|ÄAð9)¦Õr⑊l“é}MÜ#ßN#‡«ëswVåA<-ñõÇO“Ä'½‹Êgo“{$Õßcœxª69°éÄs(â ‰~bVû“w£ÄÇq7ù†ý $~Õ9vºøăx⥯|×™N¼ý]ηó¤ø9Àõ÷Èñc:?E âG%~ÔÄÁ*ßUÆŸK'¾Âd¡þØøÇñ£Öâ%œ& ¾ñk}_¥¼óíÎ_gLïeðëN¥ý˜´C —[‡$¾Úø‰œ&¸Ü*‚ø`bñqæ‘s¿£5÷ÿ1Y)©ùc6Y1 â™ÖÅ×?MNLOCüªÕ“uNQ {òÇ”€&ˆé4éküŒI|Ð÷ôʈñ„³¿øùÍ'®ÕÙàn¼Ú$÷ßs‘—úµí7!ÞéçâYÇÏ5ÿç«:#Ä;ýî; ~ŠÞxV¾Lăxò)H÷¸ò¶ïʧ¼TÇ÷ˆòþS™@<Óø1¸Ç•÷ŸZÕ7ñ«|Ÿ{Ï@<ˆ§E3‘ø ò>ñ´Ê§\ñ}*|ðˆg?>ñAåƒ&ì•øÅ}b» â…ôø¹Ë‰„ÄÓÖj@ü*âçž=Û%ñ)Ë(› oßâÝ­|?]äM©ð ¬ÎN\ªâ»?Õö¸vü Nü´²SM ñæ ŽM|b¦MZ+ONü¹/ÿŠIâ·Ð<Š•øso?ÝÎ.‰'ñݼg¿‘5m{Œl™xÛw…ÄcüïøÞñÓšN«zʯíB â©NÑ:ÝÖ@ü¨Äojül‚ø¹ÃQâ»ySAü³øúm¤P‹'¬Åc¿ÝZ|¢òO†ªVtÛñj©Wø ñäÍ&Q‹_K¼¯|Ä+6%ÿ«yõ¼2ñ“àË­¬?fÍ6R[&ÞVž£Ÿ°¨5½o+ÏÝÃ`§&‘$ÄWè:T™øøHâþk6>k²GÏÚ‰ ã'øjmjvêCYN|û&Üú´½ßCÞÝÊJ<ÆÏZâç”ï˜xå+wÙñ ~ñܯ6øe‰=jÐiR>ñ¬/¾ñåÊWîâÇÛcâü ¥ ™¯<÷«ûÊ”N“Žò?¬ã'¥ ™¯üÄ*_í:$ˆGóŸæÑW× Œá±Óv4_íi^ Äcü€xzèã5­Ö6 ÄãÀ‚xŒO¯¼³ÌÜB{Œ$œ¢ ăøÆÄ¯U>øh@ §(ˆÇøñ5”/yœFNQñâûSžûá §(ˆÇøñ• Ïî5‘„SÄcü€ø”ŸkϤ<ˆÇ) â1~¶EüUÿpÓ®G>|ü#Rù–GNQ©?Qßyä´jE›Å™~ÊÚ›Œ ¼…ý2Óßcäª2UóŸÊ?æFl_Çã'}üTè‘uæ5w¿ýOÿÙ¯«Üõ³ú•ïúÓ›¹ˆ?á{1¬GR}Ù﩯¼SÆ)<Ÿç6RÞyí›ì´Õ9vÚäÀvt|0~Öî‘µŠ’Ý˜Iõe”Ä«™û¢ìNª_5•÷¯Äfÿž_ÜÇ`Šì‘iøÖÿ17r`û:>?yUŽ*jz~|îv¾õ¢ ˆW³òµ¾›T¿*@\O™}2§$ªÁß#ÇðMùuØðí÷Àöu|0~òöÈÑ@e×JÜ·ª7EÄ—ø®óÄÇή¹Ì&þ–,¾ý«Æ.ÉHZÜc“°ÇµÄ·u³ÉñÁø!$¾DùlßM^}ï£9Ä—û®“õ,!ñ‰ÕÚÁTŸøú?æFl_Çã'{üÐ_îûâ\>Lü;œFâ;«ò‘'€GÞû¹·n#¯ÛwDgµ±kï±ÎNëï‘õÀ΢¬?f_Çã'{ü¶A|ëE7OA|\ù0ñ„¾^}(¿HüÜÿMÜšC&kj[í÷Jý=ú?æÚlGÇã‡ä×X9ñT¾Ç¯¾ˆßõȇi‰/¼ô:}œøÈÿ%$žv$ù{¤ý½|ýõ“Õ?°> ä?fGÇã§œøà:솾ëL%žÜw½^žü³âñ$,ù‘$Ö:cÊê#!µÔî~ÌŽŽÆOÉÙ~:e']~ñj³ËÄÓVá©*òAå#‚W#žû„!?·qŠ‚xŒŸæÄVá+ò.ñ)·°æey‡Gynâã+s†!^æÉ-‘d4+ŒŸìñÙ~Û*ÍÜÊ U»ù0yW ¹·v­ïÙeŽFÚ9NÑñ~Ì-¼TŒªÇTðï×jv {T[W„~îèç½C žI“ü˜[xµ?å¾›cé·¯9†ø;›xªrüœò‰ez‘Tÿœir–ö¸Ç&¶¯ãƒñ“·ÓòÆÂ¬Äûåø¾‰e‰gè¸g¿÷õO³&çööØj§Ã¿ÔŸ¾‰ç[NÃQ¨Y»džp059aêï´÷=¶Úéð/uËãGÔM­)7@u\‹O_OI;˜êŸ3Ãìq;?æ^í6ÇOy_š–µxÖ5ÜÄûzÚw·þ™Óä\uMl_Çã'e§$ âÇ$žj]<@t|Ä·¼õ ï+@LD=„3ïne*ÇÞ÷„@ ]GÆcüŽÏ}¦k  ÇDU`Èÿ žcu<ÞQ0A¾®fE¿ø‰ºe<ÞN`ÈÏíeöÙ­(Ñ k°–hˆ'QžäI 1d<$ø$$â§²K¯ð@ X•û¾L|¶òåkE ˆy}fñÓÏË'^€U¿°@ 2¦ó»’oqzןޜ¸ÙôWpÆã{NøÞG"¸ŸøØÙxŸ";μæîÈzÊ] •™|âP «DA@ øÄW¦§dè‰G „ðñââ!$þ?Ÿ3ç ÑöIEND®B`‚visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/example-xlucent.png000066400000000000000000000342401147500217100262010ustar00rootroot00000000000000‰PNG  IHDRö!¤eâ8gIDATxÚíÝoÐgEu'ðy+/|¹ïS•²j_X›2©Jü“­J!ÿ‚µÑ¼ÐÍ"Š«¢¸µR –PŠ ‚È£  Ì2 ‚0ÿ ˆüd%€C(Ç€»Z Aþ-7Åß6vl{ºûöíÛ}N÷é¾ßS§¦ž™yž{Ïýõý<ýœÛ÷Ü-@ [pÄ#Ä#¢kâïþìÏÎù7/l}íó;~ @ hãå ¯yñØSŸûqÏôAõg â•æÊô3~k2úxc";ëÏþÑ»ŸýÃ#ÃùGï^Ê}ñÊî3^ÃÝÎÏÿöóxŸbQ¨Ùú¤ìôϾé(2âÓq·óü×½ˆ÷ @ R"÷óå ¯)"þîÏþ,w“[_‹é<@Äâù·—ç»N5÷Ï'¾Äw(@ ¬¾§(¿…Ïw\ƒE òúŒŸ‘k°[X}׉7@ ˜|×¹€øó_÷"-ñP@ ðýMGÑ?µÆ&@|Þ”k"•øÈâ÷Ü|ñØSç‰ßqðKä¾c±<@˜X°¾x"¿¥Âµ`Âë[¢ˆÿ-.âQ«A ˆ õ…ÖøE×zÄ«ßZÐóÿ*ßÏ.•úã¾R¿ò~_?²í;Žñã ó×&½|á5|Ä?ûÇGLj/¼Uñ‘ÞÅXw^pw¯Iû¦cü0ýœ¤ŸBü«íƆ ^¿£³#¾_ß¡üªpÏxÇ1~–žøõª4|t3â9VÄ׿â:U“éh”§œŸP~m¾§¿ã?ygýÄ{W\ žiÅdMâ#¿‘õ2ÊÓÏO(¿6ßSÞqŒ?f-~ö—².†øÒóįøÈ›ŽñS8«¼Pú¢†õî§”Ú]ŒòŒS´áëÿÌEwšäØþþÛõ&á;ñ£*Ÿ÷ýö¾hÒ¿ÁµÞ­OLëâÓ/ë—øÃ÷ì4)çõÛ¾s(oû>°ò ^ÚÚ¤Á×Åó-ªiå»ySåñYß§”—à;­ò¾ï£*Ÿ‡rðM'܈ç%ž¼YúÝ­LµŽgƒŒ7ÄA<ˆñk žäI ‰]ã+uš¼û³?cÅ}`âßrãeN‚ø‘Òÿž˜¬›ûÀÆ5赚Âoê<„v-MöîÈ[+yêáø.d?¥w;ÉeÔùðÑW›´ÿ½$ím2mï!ë´7žw4v½ÏϼÓ!ýNˆ”3+qk´²_{Òn—½ÿJêcmôÒt6¢3ÑúHïÉò§/WÙË´~ËÚp÷}OQ¾ñzèØÈîïß·ÕŠø8Ç|¾nßønŸ¡¼ž¶‰W™2£_Ô9kññ­qoûnël€ÎöÝ&>QùÈ¡pÀ°ô^ßÈã”*¿em¾â¹é•)ÄÏúN¢üÔ½¸…Ä_÷»ßßsГTʧ‹Ì;ÕömßâÍ–Ë}×ÄÏ*ŸÞ^f¶•Ê¢~d´·l—ƒÄ/R>òå¶òqè#GÃÌNbk”vÒJ7[Öæ»MüÛ®Úm”oK|Êy¾´_’]ᮈWI5‹ç.ª¤_²ýâg•×|ljOQ~)ÊD5#ã ÞQxÊèß©ˆ ñ)ÝŸÒ‰—£ü–UáîjôD^eÛZ|p ™gøe¯|×É:…'$~‘ï%Û¯O|Dù¥(ÓOR[NáëQ>r(¦ˆ7€Jlj¶.âÅ.‹t”/¼âJ{ˆüg&þžîWiêøî+™¡pðËÕ–ïyãù*§v‘·ýDâ#ʸˉÏî ™^ë›Ý‰ïéÄG”Oürg ˆOï[)mýåVÜY»ÙQ½Ôôu5Giêø”l–c ÏŸ/&-ñw;»&~JyÏD|äPDˆŸjC â'.ÓƒFi_påý~§b}WQ¹\D¼ï{Pù&ÄÛj·">èrGÄO)Ÿñåêc_•øø3²I”ç8õ•ŸúEGšïAâm#\¦+œG|ÞöÓ‰*ïð-‡øìG‚!>ñË×PJ ^‚ò[8ØâSžõXTVÞ12}¯S×Êi‰¿ë Û‚)Šx_9ä»~¦ŸòØáD;bL;Ù¬Cü…ÿq{¼ì³èÀf< Ä/¬yÊW85•÷Xßg‰Ÿº(š]¨I$¾I¡&…xßú©û] ‰ÏÞšÀBfÝΉ­P³h±HùšG¤šò~•F ïSÄÛPÚÄû-òˆWñ}—S‹oN|ù4«-ñS—[™;ˆD|âã3ˆ¯Pê(OõVð=²¨Ñ^×èÓYB¼Ú¦ã;Õo ~ ÄGêÆO*ñ›”C“A|«ãâ(lk³¨‘ÙRâý3Á†3¬¾o¦ÛEÄ´3ûÖ§© –ÜýÔ–øøÝO ‰/$m‰,$$>ãÖ'¿¸Wj+å³2ñL-$ ‰/¹»5…ø&w·úk%SˆŸ½Á•eùÄ'¶+'~êh̶ÁÝ­©¾g+/äèØ­lLÚmª¯»Í˜žæ¯Õ|Ÿ-×”Tif.©òÓ¶!óWÄ'NáS:ÕÄO–ôS#ý¼£*TmÈì/L!>åW*âW݆lv<%65•ÙpÙ!ÞiQYx?¹Ÿõ‘xêÄ„ “lyjû‹ÚLú÷=%Ná—¶œ ¢LuJrœk)Ä/j3!>øÓ"ýÀÎ6j^¤¼dßÅ¿‘bkñ•}Ÿ]@I¥p„ø¶ýââ#ʧ,ŠO?•2ÎŽÈYÉ7l¦úˆ¥7‹ŸZ7iomêkFbß1ô‹_@|¤An/L¤õ=eEMCßãÄgÄ´kS=õI§³å”ÃâïCïàžñ´?B5œs³ÎÉâ܆ºôI ί6ññ¯M<Ù¸#%ù‘OU‰ñŸ>á¹cŽzFýi§ú• ăxâœÅkè+OäA|eßAçSžõ>¬ ï)nN|ýß-@<ˆñƒŸ¢ü1G=“q»l¼k‚“ÊßßrãeÎníçd/s â¨Õ€ø˜òA‚%¯¡a]o22©ñò}ñ Ä_¿JCU2”›Åò¬y±¾ƒxˆ_/ñMSâe”qâžÂgÿØ£Ûü¼éúƒ¾}Û{ü ~r<¯ûËo¤äŽÎñr”Ç¡Ût·¢fì7ƒ{ñ !ñ܇"}¿A‘5åŠxåʧà®Sÿ¾c"?8ñx<·pâ%Oá ‰7ŽâË•OôÝo”Ǩñ£?…ûôx@Ý÷¶]·@<ˆÇ,ăxâ›-[D-Z,â—ú|ÔQ…ûõA¼ü)<9ñ¬¾WÔ€x¿ âí{5Í­›vÚEyÿ ùZ0~eÿvŽJ|ÇÁˆßL¯›¬¶bÒVÞ^1 âAüÈÄû·ãGˆ~-S£]Ç÷Q‰ú؅»[S°Î{1¸µµkåA|KâMw­à²ÌÞkUŠRžƒø‡¾Zåˆç øŽ‰<ˆïø·Ýq™Êá‰ß{ÈÅ*Iˆ¯y(º þÛÿå›vÖ!þÉ=ÛíñN~aû5vV ~ßÖ°ÄÏjêoOä.ÔèY¼™ÈM<ÓëOñ==+îkS~)î¶òÕ|ýª/·ŽM|°VÓñê•«ßBâ?¨ÌÿÚi¾ªüI÷ÝQ¾‚ïP>î»Îʾ‹R¾§E“ä+Eù¾a[4YŽ{ý ‰ ·®5i²S|·?ŸDù ï;ޏí‚7ߥþ4©þªsçÑût–\§ur÷ñ7^ògßR©>X­òqâ¿xâå*ÏûÏ—êì4¼õ½w«¼æð›ÕŸ« ¾Ó[ŸÆ^4éÌå;">H¶¹¨°”øBåmjÜŽé_üý{uâU~åïª$Á]íQãnˆ7 âU^{Òn[sE¼Iûßi}W;U¸ëÔÖë¨<ˆŸx3)îÅ÷tâ#¾SoS«Ó&Þøî(¯‰/ŸËë-LoC¿Nâµâmè q·}wˆw øÛ­„øÂr|ýC1åx+â}ßU:¾ÛÊÛÄg+o¾q‘Ì ·|)ž ~%Äo\7¹hÅ$íŠG[‡ø³þÝ}:·¾þ~•æ¯>ñ‹”Ï ^%ˆ¯’Ê÷DâU®‚øÄuåO}ùh•?:õ`•úc“þ§•ë/Dynâý¹í,úÍIâ…â©uñåß”M­‚Ûž¿;¾ÛÄŸûÆï€xâÃÄÍ5ñSÊÛÕ€øø>H|úÍŠCk««ê&íúL„ø³Þ°7»Vãÿlñv8Ú&®¨),Ô€ø–Ä;ÿâýYð,ñ$Þ@Ÿ×^HãÿåA|;âý[ŸZ/¡Ú€Ä÷«ÕSAf‰_áC\}å#Ä;q%o¿ºfÂ͉'T~%ÄûÿÕ5ñSÊGˆ_º;›xS±± 8†xªG>á‘ ñ˜"ÞN7 Ò’ø¯ÿ¯oÎ&+ôm}ß°=»u úašÌ.ªñe/ÙÝ?_õÕxr|ñg·®œx§ýËíñ$ßcüÁ­c>د„øß+(ß6ê/¼ï•òu*åë¿Y}Tö}Vy9G¦?âVž¯ ÙØ¾7‰j¸ÏB÷"=ë…û>>ñ})âûµ¾æ!{ ô5÷(÷µß‘ò¬ýâá;±Â¹ßô¬+Ž€;⛟®|Éë®|E¥ñ ˆCOõ KV¾ñÄ7#¾BˆUÄ#?¬ò @€øa¡ñÄ«<ˆG  ~XåA<ñÃ*¯ÈûïÙuøž*Õ*KŽ-Y˜zJß7ñB”×g”!^+e }·G ¸ñ/z}Fx¤ßÍT€Kß=ñm•÷‰W km‰·­‡˜ ¾{â*Yx… ¾ˆxß÷<èܳ¡{¢äûž§¼ïûÐû¾ç)ïû.úÞ•÷}ÏSÞÁ]8ôñ}ñß…(/áü™ò}©òß»&~Ê÷¥ÊG|ïn.ßµïK•ø.Sùî‰OWÄúž®|Ü÷~•ûž®|ÜwLä+û¾HyOLü¬ï„Ä7Wăxå%?ë»@åG >EùßA|Mâ{T¾&ñ(×€xâA<ˆÇDÄ£P#žx§Cw«®(Ô P“~7y¿kˆñ¨Åpôœ‡8Mþ@<ˆ5‹Oy‚Í ‰—öfaEßM{î)â%(Ÿ¾!‰ßÔZ4ÙE•Æ÷½Éˆ%Q>}; ·>QïL‹:"~3è­OTÄo:¼õɱÎãk‚O8Œø n}ªÖÀ ¯‡´«¬³OËlr¶ð50£‡_ùUøÈ“¡$—ã#Ðgl§ß7=¶!+éNãX/ð„B¼žjSÃt§q §Ú”|Ùç%­±!ÙŽäî4½?^L)…ÀˆE€øaÏD#ƒÄc4 ˆG ˆG ˆG âăøò¸ýìS !'ÎÜýÊlâ(xŸê;”Gôå;”ñ Ä#Föăøâ|9Í]õ?xp›Lâ/~×Ó*#~Ûw÷ãd‹Ä®í奾ãœ_¼î?WÚùŸyõ_V¨ü­> âiˆW²û™'»ŸBˆ×¸K þÎûv9™-»ŸœØ»/}ÊÉlÙý>…צw:‹àžëd¶ì~‚ø|⃾g(ô½­ò¾ïm«4>îÙÐ}ï]y÷l胾KV~Q‰Fñ>îÙÐ}«|ÄG|_¤|Ä÷¶ÊÏNÞ{$>â{×ÊSñ]¦òŽÚÝMᩈø.SyéÄÛ”?ô¾“M玷šl«¼¨:»¡|ûUgo»èÓ[¿|¼úS}¼Ty›ò÷ìÞ«ó +ïPvM¼¡üœï?ùÈ}'üÙ#êOõñRåmÊÏ:÷¶OýÕõÿäÕêO•2‰ï½°÷=]ùYßA|>ñ¶ï¾ó•‹ˆŸòýöKþPýùÞ[Ÿx×Qmß ñêO[ùEÄß5ñZy }¿Äkß ñêO[ùEÄkß ñúOõ¢ˆàÂiMâ¥)ßñÚw•xNºòÆw¥¹C¼JõZùuNÞ#ÄëT¯}7Äë€xêãrâujâå(¯¯¯ö¾0ÆÑüºGÞ­²œøóýJOI¼ñ]o”Ï›Åkß ñu”—¼Ò!þsç~Ôo&ò„ÄwW±qˆ?îð¿3Ä›‰|ñÿõãW:Ä Q^¯ŸÙtŽæÛø•$ÄÿÍÛó•ñ9Ä+Ímß÷šx•‰/Ò™Èßu¡ÆϪ¼ðîfª®§ðñZùEÄkåï6ñ=^}5Su=…wˆ×Ê/"^åñBŠòc¬mgšÅOMäA|þåVßw=‘_D¼V~Êw¦K¯³“÷ý§ïŸÊúÄ+Í ñÆwK‰W™Â÷½}¹Õo|×¹”x•JvM¼3…—°À&Nüÿ¾æÊ`ŽJ|J­FÚ÷ÞÙ¢I[v»P³´Vc ·“oe6îõ¡·•÷3oQsÝuÊ÷.jô¶ò~æ-ª1E›)ß*$~JvÉÐÛ¾û…šôíø…§VâKo}š"¾Py¦õò%“÷&ÊÛë#ƒ¾g+o;ñ]øz{}dÐwå嬗/!^ òJvC¼=‘_´wC¼V^àˆí²{öÊÄÌ;,æV¦Èç)ß{Ä^9ß÷å§þÝŸà÷5—Ï» *(¸¨»¢|âÓ}—F¼Áýk÷þ¾&^åÒ˜ÙºÆý¤ÿÈÉo}T¬ï›~;MRµ4XäþRßÏzóg¯¬ú¸«¼ãõw´%~j^OÒ¸Æÿ\r³é$¨úÄéoý0Ä›¼S¥É+ј*¼]¥ñÄ̈́ɕß69H\9ãளùu×jÊk裺[5Ï¡¼éüÄ;ZÍåÖ<ÜmâíË­ ž¾_|å¡O_™‚{Cßë(ï/©Üt­”ç†~€Z¼¿–Ædî¾ò’[ wÿH ïé+)ó ÿÎ ï%!~¶ø.Ä÷j›®û”1)ßv:?µh²Gß­’LìU yþ>ñ›èzråE–ÙÄKã;Où¥ëåÇ&ÞW~ézù¥ÊÛë,+ßE”øî×aºÃ}âòþzÊò-G|Ï#¾SÜ}åóÖËMüfbá<É\~㵨tY‚xÚù{œø^ŽÃ8Ïnuˆ//ÊûÊï“ZD¼©ÉlzŽ©õ” ÞVÞ_OI²ñÈ"z_î{ ñ}Š¡ÏmºQÒNä ô¦YJ­&Hü¾åu«2’ZÍxÏÿÓ}l2z¤C¯›ÛØ=@|¹ï¯jf•hôâ÷NqxÝdž¼VcB÷/K,ÇOÍâÇ ^…ßÞÄÛá·7 Ý¾îRÉ]ŽïŽøòG;ÙówC|¿ãp4âír U¡Æ©Ø$–ãÿðr 5ñr a¡Æ©Ø4¬Å?rÖ?D²SßM¡¦‹‘+%žjüñ‰käÓ‰Ÿõ]¦ò„K'&žpédxAâ㸷‚Þ¾§‰öéÛ ¾ñÛp»ÉBâ?ûË&ÛŸè{}åûòÃ&Kˆÿì÷Ÿ49ñw½x†Éâoøçšñ%ówçÎÕ)ß¾w‡Éâ<õ9“ ¾”x÷ô)ÄÛ¸/U~%ÄÛ¸G Ÿ%ÞÆ=}_ÄÛ¸G Ÿ%ÞÆ=úVÄ)ßóί{ÓÝêO'+—h|å§p@ŸB¼í»pè; ~Êw_ùY⃾§C¿â§|÷•?å{PùŽˆŸòÝW>Nü”ïéÊ '^ýUe‰¼»î2¦¥øî+?K|Ðw±ÊwO¼­|œø¸ï ~ÖwBâå{!>î;!ñ)Ê‹"~Êý:ågþ®Gê3qåãÄG|—©¼tâg}'$~Vùá/·Îo+!~Ö÷Q‰·•?ë»dâ)_§(?ÛErÖ÷Dâg}ñ,Äå#ħøÞŠø˜E“ ħŸ¢¼ÿ™ÜÄGVÑÔ$^šò ^ñ"ÅwBâmå» >ÅwBâg•oKü¢àVž„x£<ˆñcYâ/øÞÃñ” ¼ói¸»uw·êØùO—ij¦ò‰}ǨîníÈ÷M¿=j‚mj{Ôäu/à#~Ö÷úÊoxzÔLµ©AšŒ65 ‰Ÿõ}zZåµ–äèQ#¹M :M.â}o¢|<Ði2£všL÷½Ú\¾°{pñ½ˆ—Hü¾u+ˆñò S¹ˆx­¼nrâAüºˆÿÓ]ßñ ¾#â?ôì_d¯‚¤!%ˆñ˜ÅƒxOC|Pù¼Y¼)×€x?,ñAåƒÄK: ÄljOÙ>ˆñâˆçxv«½C¼Ì¡âWK¼½O|âöA<ˆ—Eü;Þjˆ×ÊSïp/è€ø•ïsŸ±}â¯|×i+âA<ˆñ ¾{âí©Ò`âA<ˆñÝo@O¬Ò€xâA<ˆïƒx{ýŒM|¤JâA<ˆñ ž‹øÇN<‡ŠøàBÉx‰ăxâA< ñ w; ‰Ïö}%Äo¿êl“ Þ'þœï7 âA<ˆ/‡Þw2!ñ%¾¯øm}Ú&^%ˆ·ãä#÷©´•ñ Ä—¯ÓV¾‰ï+!^'ˆNá5ñ¶ò ăxUšr߇'Þ©Ò PãøîWiP¨ñ ¾”x_ùV¾¯x_yoï(Y<ˆñ¥¾;ÊgÌâ©|›x{Mù~0âU4L×ZA<ˆ_/ñÙË% }_ñå+&G"Þ_(ÉQ¢ñ ~]Ä}_J<­ïOîû0Ä×ôăøµßÖ÷Bâu3aâA<ˆ_;ñåSxßIˆØ2žÃ÷1ˆ¯ì;ˆñ«&¾¹ï…ÄÛQñB|ñ ~ÄNáù|§"^÷L¾÷N|ßA<ˆ_/ñ‰_ë´}/ñýþ¿½Ù$ñÜÓþ0à&þ=»÷êñéÄŸuîm*ãÄŸùÐLŠ"^á¾çª,T^›~Ý#ïÖIBüùÇþ@%ˆoI|ÉÞé Lå»­<+ñ)ÜÓNùù|×Ätå†x­<|‡’ýSu½&^ç¬ïÊó¯çï†øåmßò%ÄkßuþÍÛñ‚ˆO¯Ï,z„“d⧸ÿÀ·nÕ)Ÿxeº"ÞQ¾Ç§ðÊw$~û¢2_³}WÙõD¾WâI¦ðæY¬„¾·%ÞíûŸîúF¹òÜSxgþÞE¡¦y ÞÈ©Åû¾óò [¤¼O|¶òv ¾|"oJðú®Ë5CŸøµöüÝŸý½‹%ž°PSáB«¯<ˆøn¯Å×!ÞLäÓ•7¬ún+ïÔjò”w|7Äwª|—Ä—/¤q”/ùÞ‡'¾ÎB›xùU «à‰ü¤Ñµˆ·•Ožœxß÷låmßmâ{T~âӿܮœ,‘¬¿¢&CyiSøàBÉ..´ ñÝV~†iþ5yÓy*ßmå©Pú¸wª|ÄsÜÎü´§.¾yÿG·™T]ô:%_5}G}fî¬ËáKˆ_:'Œ ï…›Þ•„øE[H$Þö]'ˆçëHÓËZø¶½$kâ^BüÒé<”ñ¿| ñκxâÏzó/~×Óï<ñ£Ä÷è]øî4'÷=¨vóÉ; ñ­¦óå3Ð(ß…ø}ï?îÃV~é«u|×yÿÓö½ó¯\:…ï”xçqŽò%Ä;Ë"»˜¿ûp¢¿§hÞwâ[M烠ûWbK”ïåJlOÄûf•I¼öݯÒôE¼ÿhV߃Êw代<­ïþR÷¶¾Sßd:?E|Þz› ï](ß1ñÙîK$~ÿG·Ù¾'j"¾wA|p _N¼³&²—ú{Mâýuîmq§%¾Ét~Šx[ùô­M/|á|7Ä+ÐzßÉ:Iˆ7·¶NÿÔÅ7;9ËúÅïz:â{}âÏÿÅ×M.Âo»èÓ:KžÎª×Í ìþ}­Ÿ9ùÈ}:âË·¯íÖ­ìn´¾ßpÃc&ÛïLç+Lí}âu{•×`}âu‡ÝäÄo|·•Ïx©šxã{äîÖDâmßuFö^“xÛ÷tå5ñÆw£|6ñ¦ÿŒ­|Gëgè†x£<Õ3yw”'œ¼Û¾g(ON¼þä>¦{TSÞö]e^“C¼Á]§žËƒxšY¼Q>xÇ÷âïzýŒžÅ÷N¼ž¶;Äç½S¢q”﨑¤6ÝQžjû>ñZy>ß3ˆÇ9¿à8¶šx•zö/¸«7šxÇw[ó‰7å_D¼NC|F•f³¤¿ˆx…»R>^¥iN|ŠòNžŠx[ù.ºH:ÄÛÊsïLä©*ïåÄ+ß9fñ¦b£|·çò¬Êû¾ç¿ùÕ½¯Žï žŒx½âmåãZ»›Å;×Zˉ7Ê÷õ¸çB«"žðF'ç*«!žð[(!ž©Jc_s¥.Ô´•Wš;¾ƒxbâó–KnBÍâA¼C|p9M6ñ=v‘´‰w”§½—ÕYK£|'_<“M<«ïMˆ'|rÈÔÒI_zëSÉM­6ñ)= 2VÔÌî½þ¢ÉEËi6 ‰ÇsYãÄs¯”6÷¡¯ón>âµ£{\;&>ûÕ’Ÿ}ÝÝ âÇ ~iTó½r€xâkß ÜÇà{§ÄO)âKÛ1ü4OÒZ²kâƒÊÓn_ñûT¾dS½t"ë©™p9îAè§>aµÄ;Зoª_ß}å9¶ß›(_¾)tšd|vk…X9ñˆUÅJ|_a€x€ïðăx€ïâA<¾#@<ˆG à»Ä¸éï¯Õ âA<ˆGÀ÷î)÷ó¼»NW9€ò Ä#àûz)wr¼¹<ˆñø¾jÊǮ؀øâ÷t›Ê8ñßv…IQÄ¿ôÕošm+7ÝN"·¥|`åAü4Ç>ž[å¬ï³Ê×$ÞöÊÃwýü&¦G8‘̸ÛR>ªò=ÿ÷ûÏÔIòšo¸ø9SŸàø¾6âo½îQå¯ä–ËŸÔÙ©’×ÿò :™¶Õ%/éd%^û.s o®mÖ˜•ÿò $ÊË׿âïåÐÜãÊëS¾ßóµOíÙúAõ§pâ•7¸“(o|ïzã;ôÆwèmßÿà3?X¥Q²ŸrËñšx[y®þÚ÷rå+ÿ&18ñ¾ï´Ä•O!^…’]ç0³xŸølå}ßû"Þ÷–xßwò¹|…ø:D:¾*_¿^≉7×ZÍ×à,ÞñÄÏß‘òAâ •Ï4‘ñåÄÛ¿|€xvâó”ú©ÈGÖÒøUøVÔ}ñýï(/êðVÆ‘„xý²§.dlíê¯þ_ ¾ ñS‘hz[â3Bi~Áçn;ý„ëÕŸ:A|ïÄ#´æç½òNyå÷Tªtæ¯Bï_EÈð=ø1ˆoL|îò‰×”kßuÚʃxßè~¯4?q×±*å³}çSÄ/&¾Ä÷½Gì•F¼Sñ ~ ÐýÔ¾Ûī̞Å+ÜñÇóê ¾{âóŠ3fò®‰—);ˆñƒ!ÞV>cþnÖzªTÄåÕ?‚øŽ‰/)¾Ë©ÏLÉnï+âA|w G 5†øìE“Js]¨1åß7ñ¾‹Â}Vv‡x£<.·‚øNAo—ã—®¨ñoǵ•Ï.ÇÄW%~ÖwGs9¸+šÍ||)ñX49 ñ§ln3)Ítc.·ïz_Ù‹&ƒÝäM>ûŠk…À­O3Ä/ò}ï{õU 3w=7Ä'*¿Á­Ocoû.JyS 7ÅrÓS~KÈðÝ﬛Ì^: ⛟x·ªÊ;^‡ö]ÎUSiI!~¶ª“ý2Уf©ò¬¾Ë!ÞL¨ˆÏ+eønßàêû¾ˆøÿþ̵ÁWG¼¯|á &ñ}sàR¥¼¨ËªöüÝ)¬ÏÂÍ׆¬»1«ï>ñ|%QÄ;ë[œú8 è)Êçá>5£_z›ë'Ÿ<}ö_VD¼¾Âø[tqÕ.Ôˆº¸jdÿÌG®QiÏâ7ˆÕ„|âO|åwTÆgñä{Ïž¼Gžÿ·”xÚÎ1‘Ç#AŠ|H|p…»"^ýÞx Ä;K5ñö¾ý+\س>OyßïŽòBæïþ ÌÜ¡¼œù»¿QëÙ¾SMä×^‹뻨 í‰@p/dÚ^â{¡òŸ|òt…;“ï ¾#}—C|ÉŶñ¿ñ½ë“¾#0…¯?y—¯<ˆ‡ï|'x 8ˆGüÅ™M´ÿ XA DSÇw±Ê¯—ø1|Ç)¼ßA¼ âá;±ò)<¹ï2•_#ñðXùžw/‚xøŽ@¬Ùw¦É»Xå×Eü¸op‰TßA|3â‡ñSx¦ðb}—¦ü*ˆ¦8ߘÂË÷ÄW%¾û'žéý„\I6iõµZßE)?8ñðÝ îG©!ânÿD‡ïÕÀñìįÄ÷tâ‡Ðƒø_ÇY!%š&“wiÊKü`¾Ó–hò¥†ì1í÷ZçJ¦ðÍ}ñŒÄ†û†è+fñ ¾ñ¦ð|¢ü€ÄÃwÔâ‘SÄW ¾ƒx.âÇ+Îlx–H¢>³¶Z¼]”ƒï«R~âWå;VÁ#²Í¸D# wOFü¾op—¢âW;y¢üÄÃwÄÒ!:õi×ß}ŸSŸöÐÎ{ílõjŸ{à4“‘¢œ|æ6œÂWð=ñ¹üžGìœz…çÝuºÊ:ÖwO<|GäÏYß§”w|'W>ñÕÚ¾G”wˆç[Q³ß§ÞÇ÷)åµïÕ”ï›ø!q‡ï ~öÕú¾•·o}bÈì;ˆg'ÞÌÓ¼çkŸâóý´çfÖ/øÜmNòê?ÝÌ5ï½⃾ŸøR…ïÜ@[¡Y‚_îp¬ä@3ñM‰¯_¼ýšíW¾Râ#¸ëä˜ÅOáÎg½3U?ý„ëu:ÐW}TèõH{ÿ=»tvA¼ójKˆ×ëâO|åw¨niv@W[Ögý]Áü”[Ž×é‹Ùjü,"Þ¼þõŸè;­ò‰¾?廣<í,>‘øa”·Ïψ›rˆ÷_m6ñæÖ'bBâõfíŸyÿr¥!ÒQ¾áø™%^…ã»QÄÿkîÙúAß÷&ÄS)oûn@w”§-Ô¤û>0ñA7…ŸòR³‰WYH¼3…w~Ep~„°Ög|â™fĉoJ"ñŽïL¿yôJ¼Â])ïÿ{}ßY‰·•'¿ÜºBâÕ yøžNŠ%>å¥Ê!ÞlÖ$Ç×`‰æÄ]Çêä¾t™8~RˆW/ϼlÌâ¯HÏa 5ŽòöăxÉÄ›½T#Þ(ï\n•O< 5‹•ï—øÈDžÃ÷uÖâýSTx¡†x»–ÂQ‹··ìoœ©Pã(Ï}ËhâøI$µøeÊ“‘ʾçòVįjE_H]O-žiÑäÔ¤žïÙ#Áµ’uV—'ŽŸtâ+¬ê†x‚éõ?MÈ­O]ï[_펧úÍ^ÇO ñ›_/ªñˆŸ$~Jùâ‰Áñ Ä#ÚF°úüÌ”6d¬¾A ~š5k >}üÌú$žõŃxÄ*ˆŸ½_ÔW>¾Mî6“ñ)¼¯|„`Þ›N×A|úø‰ûn^)<ˆG¬ˆø^íKå&x=ÄS½)•_¿tâÏ|úxr”ŸÜüÕHrìqß矈'ÇN|êŒHrìqç³WFÄ÷E|«dõ;yx.âg}'W>Ž;ô³¾“+Ç ú¸ï¬ÐƒxZâ5òæî*¾uñ›Mú X¹ñ,Ä'úN«|}â}§U¾>ñ‰¾3)âùˆ·}×YùÖ'Ó¬‘OL?ñé¾*_ŸøtßA<ˆŸÝ`}âßA<ˆñ Äs¹»•»ÓäÔó@@<ˆ_u¡ăxâÛ¿ÁåV\nñâkñþº{îË­ñGúÉ? ~™ò¥¦ï‰Ê“ï±&îéÊWCÄÓ*_gu|üaÜ|V‚xÜú„ ¾æ­I? Ä#@<ˆñ ñ ăxăxâ8EA<Ä‹!þ´¿ûÇxÖy;¹uXÃ_ÝéË×ÅÄ÷B|›ñÓh¾â‡ øœÓj9ñH9švó&™”||ƒ)rÜ*ì±Î·9‹;«ò ž–øã§Å‰ â“Þ€Yå3|çS>þ]T»LÃwöÍjK<‡ò žø6ã'yÕ~å])ñqÜM¾g§@â]pg"‚xâA¼tâ•ï:Ó‰W ÿÛ«w’{o^§ó‚ùÀõ÷èì”c¼VØ#ˆ˜øJã§ú‰ â‡`‘ï*ãÏ¥Œ_¡PSì:ÇÇ¢†' ˆñòO_ƒø¥¾/R^Wflßmâ™ÞËà$Ö‹ŸÎQr~ ­ÿmŸ'¸Ü:"ñõÆÏôi‚Ë­"ˆV!fg®¡÷ ñ†x¾wtªäÇwbOÕâY)©ùm6Y1 â™ÖÅ7?-NLOCü¢Õ“|¸óib%ZÃÍh žïÖ§5ŒX?O|Ð÷ôʈñ³¿Ç/Óÿ6o|r§ÎÈrív“¯öœK¯1y©—ÿäj“â~î >oï½é>ñ^ñÏéŒïô»ï€øMôƳòeò Ä—NA~í»Éîqåmß9”·}×9ë{Dyÿ©L >cÆw“ÜãÊûO­ê›øE¾O½g Ä—„ï{"ñAå}âi•÷‰ÿ?gß>ë{Pùàƒ÷@üÒð}O$>¨|ðÁ„½?[ Ol7âA¼⃾¯4ç&ž¶Vâ?õìÙ.‰OYF™ØThxâOòq•GÞ«Ÿú¿È÷xÉU?ÕùákïsÒüW…`uŽpøó¹ÄgÇM?ܡ󸽗:iþ‹öMüþ¥wê<íë×:iþ«&ñgÿíKë"~³°SM ñ望xxœxZå âqâ •OoÅâɉ?å•ß3IB¼AQùŒ'CiâåA|§µøx)ÔâY‰'¹Áµøâ}åû#>X±)yøŸ!ÞV~ â7‚/·2Ïúm¤ÖL¼­-$~Jùމ'Q>H<÷[ âA|"ñ´¯–¶G :MÊ'žõÅ× ¾\ù)â+7‰ñýîÑ­ÒLì4¥ ™¯<ù«M!~“ÖiÒQã'oŽïS;MiCæ+?ñ…ÊGˆç~bˆÇ­}u Âø[ÚŽâ«=Í ÄãÀ‚xŒO½6ý-»oÓéÏú¬H â1~@<£ò¶ïFyîãâqŠ‚xŒ_CyŸx•Ü iA’¨S|Ã7åÇaÃS´ßÛ×ñÁøÉÛcp/…¾¶÷C­êMñ%¾ë<êñ“X•Ÿzv`ÞÛ¿hì’Œ¤Ù=6Ùé{\J|[7›ŒBâK”ÏöÝäö»Ë!¾Üw¬` ‰O¬öЦúÄ×ÿ6Wr`û:>?Ù㇖ørßgçòaâß±ï8ßY•<<òÞO½ýSyË—é¬6ví=ÖÙiý=²Ø©S”õÛìëø`üdŸÈõ䥸~浇RW>L<¡ï…W_#ÊÏ?õ¿‰[3cÈdMm«ý\©¿GÿÛL›ÄØŽŽÆɱrâ©|_} Ø£¦%¾ðÒëôqâ#ÿKH<íHò÷Hûs%øúëÿ$«`}ȿ͎ŽÆO9ñÁuØ }×™J<¹ïz½<ù=fÄãIXò#I¬uÆ”ÕGBj©Ý}›ŒŸ’o3²ýtÊÞsÁÍÄ«ÍÎO[…§ªÈ•^xî†üÜÆ) â1~šOX…Ÿ­È»Ä§Üš—å幉¯Ì†x™ß&·D’Ѭp|0~²ÇOdûm«4S (·T¨Òè<ìÑ“wšzk—úž]öá8a¤í‘ãïÛ\ÃKÅø‰oYñ~­fKa¯‚jëj‚ÐOý¼wÄ3i²’os ¯ã§ÜwÓbŒ#ýö5Ôã'ñOUŽŸR>±LO8’êŸ3MÎÒ÷ØäÀöu|0~òvZÞX˜•x¿ß7ñ*‚Ç=û½¯š59·×°ÇV;þ¥®|üôM<ßrŽBÍÒ%ó„ƒ©É S§½ï±ÕN‡©k?¢njM¹ªãZ|úzJÚÁTÿœfëù6×ðj×9~ÊûÒ´¬Å³®¨á&Þ/ÐÓ¾»õÏœ&çê¨{lr`û:>?);%i?&ñTëâ¢ëà#¾å­Ox_bCÔC8óîV¦r<á}OÑud<ÆïÐÜgºÚqLäQ¥A Ö‰|ðñOâ9VÇãE äëjô‹ßP·ŒÇÛ‰@ ¬ù©½L>»%` ÖÍ ñ$Ê“< @ † ’gƒŸ’Dü¦ìÒ+|G Våã¾ÏŸ­|ùÃZb%A^ŸY@üæW‹å/ÀªŸX@ ÓùÃ’oqúó/Þ¸Ù-é¯à„'¶ñ½Dp?êñ“ð>!Dv|âŠ;#ë)K¨Ìäï„]% 2Á'¾2=¥ CO<@ „ˆG @ @ !ñÿò¸¢ºö˜IEND®B`‚visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/htaccess000066400000000000000000000000541147500217100240740ustar00rootroot00000000000000AddType application/x-java-jnlp-file .jnlp visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/html-footer.html000066400000000000000000000010521147500217100255010ustar00rootroot00000000000000 TABLE_START  
TABLE_START_FULL EMAIL © 2008 Marsette Vona Sun Sep 14 19:55:57 EDT 2008 visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/html-footer.m4000066400000000000000000000011141147500217100250540ustar00rootroot00000000000000 TABLE_START  
TABLE_START_FULL EMAIL © YEAR m4_ifdef(`COPYRIGHT_HOLDER', `COPYRIGHT_HOLDER', `Marsette Vona') BUILD_DATE visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/html-header.html000066400000000000000000000031241147500217100254350ustar00rootroot00000000000000 Marsette Vona: PAGE_TITLE
Marsette Vona: PAGE_TITLE
visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/html-header.m4000066400000000000000000000016751147500217100250220ustar00rootroot00000000000000 m4_include(`html-macros.m4') m4_ifdef(`STRICT_XHTML', `', `') m4_dnl m4_ifdef(`EXTRA_HEAD', EXTRA_HEAD) Marsette Vona: m4_ifdef(`PAGE_PATH', PAGE_PATH:) PAGE_TITLE TABLE_START Marsette Vona: m4_ifdef(`PAGE_PATH', `PAGE_PATH:') PAGE_TITLE visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/html-macros.html000066400000000000000000000000471147500217100254720ustar00rootroot00000000000000 visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/html-macros.m4000066400000000000000000000060661147500217100250550ustar00rootroot00000000000000m4_changecom(`') m4_define(`PORK_URL', `http://www.bluesock.org/pork') m4_define(`HOME_URL', `http://www.mit.edu/~vona') m4_define(`EMAIL', `vona@mit.edu') m4_dnl define(`HOME_PHONE', `') m4_define(`WORK_PHONE', `(617) 253 6532, fax (617) 253 6849') m4_define(`LAB_PHONES') m4_define(`LAB_SMAIL', `Computer Science and Artificial Intelligence Laboratory
Massachusetts Institute of Technology
Bldg. 32, Rm. 376
32 Vassar St.
Cambridge M.A., 02139') m4_define(`WORK_SMAIL', `LAB_SMAIL') m4_define(`DISCLAIMER', `

THIS INFORMATION AND/OR SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS INFORMATION AND/OR SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

') m4_ifdef(`B_WIDTH', `', `m4_define(`B_WIDTH', `0')') m4_define(`SYM_SEC', `§$1') m4_define(`SYM_TAB', `    ') m4_define(`TABLE_START', `') m4_define(`ITEMLIST_START', `
') m4_define(`TABLE_START_FULL', `
') m4_define(`SEPARATOR', `$1') m4_dnl PUB(link, title, authors, pub, year) m4_define(`PUB', `') m4_define(`mICRA', `ICRA') m4_define(`mIEEEAC', `IEEEAC') m4_define(`mIROS', `IROS') m4_define(`mWAFR', `WAFR') m4_dnl m4_define(`IMG_SM',
$2   $3   ($4 $5)
med reshigh res
$3
) m4_define(`IMG_SM',
medium|high resolution
$3
) m4_define(`PDF_THUMB',
$2
) visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/index.html000066400000000000000000000162501147500217100243560ustar00rootroot00000000000000 Index of /~vona/Visolate/visolate

Index of /~vona/Visolate/visolate

      Name                    Last modified       Size  Description

[DIR] Parent Directory 14-Sep-2008 20:29 - [IMG] ATM0PCB0-three-ways-..> 14-Sep-2008 20:29 62k [   ] ATM0PCB0.bot.out 14-Sep-2008 20:29 22k [   ] ATM0PCB0.top.out 14-Sep-2008 20:29 24k [TXT] Display.java 14-Sep-2008 20:29 34k [TXT] LICENSE.txt 14-Sep-2008 20:29 18k [TXT] Main.java 14-Sep-2008 20:29 3k [TXT] Visolate-autodownloa..> 14-Sep-2008 20:29 2k [   ] Visolate-autodownloa..> 14-Sep-2008 20:29 2k [TXT] Visolate-info.html 14-Sep-2008 20:29 9k [   ] Visolate-info.m4 14-Sep-2008 20:29 6k [IMG] Visolate.gif 14-Sep-2008 20:29 303k [TXT] Visolate.html 14-Sep-2008 20:29 2k [TXT] Visolate.java 14-Sep-2008 20:29 21k [   ] Visolate.jnlp 14-Sep-2008 20:29 1k [   ] Visolate.m4 14-Sep-2008 20:29 2k [   ] Visolate.mf 14-Sep-2008 20:29 1k [IMG] dne-bot.png 14-Sep-2008 20:29 54k [IMG] dne-top.png 14-Sep-2008 20:29 53k [IMG] example-300dpi.png 14-Sep-2008 20:29 38k [IMG] example-90dpi.png 14-Sep-2008 20:29 10k [IMG] example-voronoi-tool..> 14-Sep-2008 20:29 13k [IMG] example-voronoi.png 14-Sep-2008 20:29 8k [IMG] example-xlucent-fixe..> 14-Sep-2008 20:29 14k [IMG] example-xlucent.png 14-Sep-2008 20:29 14k [   ] example.grb 14-Sep-2008 20:29 13k [   ] htaccess 14-Sep-2008 20:29 1k [TXT] html-footer.html 14-Sep-2008 20:29 1k [   ] html-footer.m4 14-Sep-2008 20:29 1k [TXT] html-header.html 14-Sep-2008 20:29 2k [   ] html-header.m4 14-Sep-2008 20:29 1k [TXT] html-macros.html 14-Sep-2008 20:29 1k [   ] html-macros.m4 14-Sep-2008 20:29 3k [   ] makefile 14-Sep-2008 20:29 27k [   ] makefile.project 14-Sep-2008 20:29 4k [DIR] misc/ 14-Sep-2008 20:29 - [DIR] model/ 14-Sep-2008 20:29 - [   ] numpres.pcb.output_g..> 14-Sep-2008 20:29 20k [DIR] parser/ 14-Sep-2008 20:29 - [DIR] processor/ 14-Sep-2008 20:29 - [   ] rs232_cm.bot.out 14-Sep-2008 20:29 6k [   ] rs232_cm.top.out 14-Sep-2008 20:29 8k [DIR] simulator/ 14-Sep-2008 20:29 - [TXT] style.css 14-Sep-2008 20:29 1k [   ] test.ngc 14-Sep-2008 20:29 24k [IMG] test.png 14-Sep-2008 20:29 11k [   ] top-cop.gbx.out 14-Sep-2008 20:29 27k [   ] top.gbx.out 14-Sep-2008 20:29 43k

"Visolate" -- compute (Voronoi) PCB isolation routing toolpaths

Copyright (C) 2004 Marsette A. Vona, III

License: GPL.  See LICENSE.txt

Requires: 
  java version "1.4.2_04"
  Java3D 1.3.1


Building (*nix):

  make jar


Running (*nix):

  java -jar Visolate.jar [gerber-file]


Features:

  TBD


Disclaimer:

THIS INFORMATION/SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
OF SUCH DAMAGE.
visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/numpres.pcb.output_group1.grb.out000066400000000000000000000507651147500217100307640ustar00rootroot00000000000000package: visolate class: visolate.Main args: ../gerber/examples/numpres.pcb.output_group1.grb graphics device: :0.0 pixel format 8:8:8 24-bit depth Comment at line 1: Title: test, layergroup #1 Comment at line 2: Creator: pcb 1.7.1.ALPHA Comment at line 3: CreationDate: Tue Jul 17 09:58:54 2001 UTC Comment at line 4: For: spe Comment at line 5: Format: Gerber/RS-274X Comment at line 6: PCB-Dimensions: 6000 5000 Comment at line 7: PCB-Coordinate-Origin: lower left layer name: GROUP_0 Comment at line 11: contains layers solder (0) GND-sldr (1) Vcc-sldr (2) computing inch coords... making nets... 77 nets making half edge loops... 55 loops Thu Aug 05 17:05:42 EDT 2004: TopologyProcessor started border: true line: false voronoi: false flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 Thu Aug 05 17:05:50 EDT 2004: TopologyProcessor finished (7679ms) 0 nets Thu Aug 05 17:05:56 EDT 2004: FatnessProcessor started border: true line: false voronoi: false flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 0 misses avg fatness = 0.02637162862026759 Thu Aug 05 17:05:58 EDT 2004: FatnessProcessor finished (2208ms) 0 nets Thu Aug 05 17:06:05 EDT 2004: FatnessProcessor started border: true line: false voronoi: true flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 0 misses avg fatness = 0.30932718030570394 Thu Aug 05 17:06:09 EDT 2004: FatnessProcessor finished (3813ms) model bounds: LLC: (1.619999976158142, 1.0274999618530274); width = 2.885000023841858; height = 1.407500123977661 board bounds: LLC: (1.619999976158142, 1.0274999618530274); width = 2.885000023841858; height = 1.407500123977661 77 nets (130, 84, 169): 14 siblings; 17 strokes; 2 pads bounds: LLC: (1.9475000381469727, 1.0274999618530274); width = 1.7550000190734865; height = 0.865000033378601 length: 5.046739760786295; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (97, 233, 53): 1 siblings; 3 strokes; 1 pads bounds: LLC: (3.074999923706055, 2.120000095367432); width = 0.20000005722045877; height = 0.29499999046325653 length: 0.47810252010822296; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (58, 165, 160): 1 siblings; 4 strokes; 3 pads bounds: LLC: (2.915000057220459, 1.9849999900907278); width = 0.32499998092651383; height = 0.30000000037252894 length: 0.9755784273147583; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (12, 196, 175): 0 siblings; 3 strokes; 3 pads bounds: LLC: (3.479999990463257, 1.5550000429153443); width = 0.20500009536743136; height = 0.6250000524520876 length: 0.6326388418674469; area: 0.08054000000000001; fatness: 0.1273080226346189; areaDPI: 500; areaPixels: 20135 (100, 87, 196): 4 siblings; 3 strokes; 0 pads bounds: LLC: (2.445000047683716, 2.3349999141693116); width = 0.7799999809265135; height = 0.019999990463256838 length: 0.774142112582922; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (58, 165, 160): 1 siblings; 1 strokes; 1 pads bounds: LLC: (2.534999942779541, 2.234999990463257); width = 0.40000012397766116; height = 0.04999999999999982 length: 0.9755784273147583; area: 0.169808; fatness: 0.17405878937625743; areaDPI: 500; areaPixels: 42452 (82, 104, 197): 0 siblings; 2 strokes; 3 pads bounds: LLC: (2.3149999141693116, 1.8549999952316285); width = 0.16000013388693324; height = 0.12000005282461634 length: 0.1800001859664917; area: 0.07636; fatness: 0.4242217839386841; areaDPI: 500; areaPixels: 19090 (31, 162, 189): 0 siblings; 6 strokes; 2 pads bounds: LLC: (2.410000057220459, 1.22); width = 1.129999933242798; height = 0.7600000476837159 length: 1.6074003987014294; area: 0.078648; fatness: 0.048928692604243075; areaDPI: 500; areaPixels: 19662 (168, 147, 67): 0 siblings; 2 strokes; 2 pads bounds: LLC: (2.9999999713897707, 1.5900000047683716); width = 0.2400000667572022; height = 0.08999997138977056 length: 0.18248293548822403; area: 0.034800000000000005; fatness: 0.19070276301120614; areaDPI: 500; areaPixels: 8700 (4, 177, 202): 2 siblings; 6 strokes; 0 pads bounds: LLC: (2.385000104904175, 1.154999966621399); width = 1.1299998855590818; height = 0.9099999761581419 length: 1.8689511492848396; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (3, 222, 157): 0 siblings; 6 strokes; 2 pads bounds: LLC: (2.4600000095367434, 1.119999976158142); width = 1.0799999809265137; height = 0.7600000476837159 length: 1.5856820791959763; area: 0.08416; fatness: 0.05307495184827561; areaDPI: 500; areaPixels: 21040 (79, 75, 229): 0 siblings; 6 strokes; 2 pads bounds: LLC: (2.5099999618530275, 1.22); width = 1.0300000286102295; height = 0.56 length: 1.3645584732294083; area: 0.07236400000000001; fatness: 0.05303107299516526; areaDPI: 500; areaPixels: 18091 (251, 126, 6): 0 siblings; 6 strokes; 2 pads bounds: LLC: (2.610000104904175, 1.22); width = 0.9299998855590821; height = 0.45999997615814214 length: 1.1879898123443127; area: 0.1108; fatness: 0.09326679307236943; areaDPI: 500; areaPixels: 27700 (169, 11, 203): 0 siblings; 1 strokes; 2 pads bounds: LLC: (2.9999999720603228, 1.72); width = 0.24000006608665014; height = 0.13000005178153518 length: 0.1931321620941162; area: 0.038472; fatness: 0.19920037958904024; areaDPI: 500; areaPixels: 9618 (101, 180, 102): 3 siblings; 1 strokes; 0 pads bounds: LLC: (2.927500057220459, 1.8674999952316285); width = 0.025000000000000355; height = 0.09500005245208731 length: 0.6414212733507156; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (101, 180, 102): 3 siblings; 3 strokes; 2 pads bounds: LLC: (2.655000066384673, 1.9250000473111868); width = 0.5849999717622998; height = 0.15499990500509764 length: 0.6414212733507156; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (214, 158, 11): 2 siblings; 1 strokes; 1 pads bounds: LLC: (3.6350000854581594, 1.9550000187009573); width = 0.05000000074505806; height = 0.08999994315207015 length: 0.35727928578853607; area: 0.045372; fatness: 0.12699308861374756; areaDPI: 500; areaPixels: 11343 (28, 150, 205): 3 siblings; 3 strokes; 0 pads bounds: LLC: (2.2150000286102296, 1.8250000429153443); width = 0.3399999237060545; height = 0.03999997138977052 length: 0.35071058198809624; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (139, 175, 69): 2 siblings; 2 strokes; 1 pads bounds: LLC: (2.3049999233335257, 1.5049999710172415); width = 0.20000007666647446; height = 0.059999971762299646 length: 0.18242647126317024; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (168, 40, 175): 0 siblings; 1 strokes; 0 pads bounds: LLC: (4.3449999046325685, 2.0349999618530275); width = 0.16000009536743143; height = 0.01 length: 0.15000009536743164; area: 0.41556; fatness: 2.7703982386282355; areaDPI: 500; areaPixels: 103890 (214, 158, 11): 2 siblings; 3 strokes; 1 pads bounds: LLC: (3.479999990463257, 2.0449999523162843); width = 0.18500009536743134; height = 0.23500004768371596 length: 0.35727928578853607; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (77, 209, 97): 2 siblings; 1 strokes; 1 pads bounds: LLC: (1.677500057220459, 2.234999990090728); width = 0.5674999717622995; height = 0.05000000074505806 length: 0.5299999713897705; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (109, 78, 195): 2 siblings; 1 strokes; 1 pads bounds: LLC: (1.8175000429153443, 2.3249999042600393); width = 0.5474998716264963; height = 0.05000000074505806 length: 0.5099998712539673; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (197, 73, 113): 1 siblings; 2 strokes; 1 pads bounds: LLC: (1.619999976158142, 1.7299999904632568); width = 0.08250008106231696; height = 0.23250005722045905 length: 0.2065686695277691; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (27, 152, 203): 1 siblings; 3 strokes; 1 pads bounds: LLC: (1.6199999768286943, 1.6299999672919512); width = 0.22250006608664993; height = 0.43249998502433284 length: 0.5465685464441776; area: 0.155372; fatness: 0.28426809594296426; areaDPI: 500; areaPixels: 38843 (130, 84, 169): 14 siblings; 1 strokes; 1 pads bounds: LLC: (2.8099999141693117, 1.1374999761581421); width = 0.06000000000000005; height = 0.1425000238418579 length: 5.046739760786295; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (130, 84, 169): 14 siblings; 1 strokes; 0 pads bounds: LLC: (1.9974999904632569, 1.8575000047683716); width = 0.10499992370605446; height = 0.11500003337860099 length: 5.046739760786295; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (130, 84, 169): 14 siblings; 4 strokes; 2 pads bounds: LLC: (3.180000038146973, 1.5199999523162842); width = 0.102499942779541; height = 0.45250008583068846 length: 5.046739760786295; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (130, 84, 169): 14 siblings; 1 strokes; 0 pads bounds: LLC: (2.797499942779541, 1.5374999523162842); width = 0.405000114440918; height = 0.025 length: 5.046739760786295; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (130, 84, 169): 14 siblings; 1 strokes; 1 pads bounds: LLC: (2.910000057220459, 1.147499966621399); width = 0.06000000000000005; height = 0.13250003337860106 length: 5.046739760786295; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (130, 84, 169): 14 siblings; 2 strokes; 1 pads bounds: LLC: (3.0099999618530275, 1.147499966621399); width = 0.15250013351440384; height = 0.13250003337860106 length: 5.046739760786295; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (74, 182, 126): 1 siblings; 5 strokes; 2 pads bounds: LLC: (3.479999990463257, 1.330000014975667); width = 0.25250003814697264; height = 1.0499998896569016 length: 1.1824263520538807; area: 0.63082; fatness: 0.5334962290922073; areaDPI: 500; areaPixels: 157705 (130, 84, 169): 14 siblings; 0 strokes; 1 pads bounds: LLC: (3.660000057220459, 1.2299999904632568); width = 0.06; height = 0.06 length: 5.046739760786295; area: 0.8932000000000001; fatness: 0.17698554756880058; areaDPI: 500; areaPixels: 223300 (100, 87, 196): 4 siblings; 0 strokes; 1 pads bounds: LLC: (3.180000038817525, 2.3199999053031206); width = 0.05999999865889549; height = 0.05999999865889549 length: 0.774142112582922; area: 0.11320000000000001; fatness: 0.14622638164239465; areaDPI: 500; areaPixels: 28300 (130, 84, 169): 14 siblings; 0 strokes; 1 pads bounds: LLC: (3.180000038146973, 1.9200000476837158); width = 0.06; height = 0.06 length: 5.046739760786295; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (76, 58, 248): 0 siblings; 0 strokes; 1 pads bounds: LLC: (3.479999990463257, 1.5199999523162842); width = 0.06; height = 0.06 length: 0.0; area: 0.011052; fatness: 0.1842; areaDPI: 500; areaPixels: 2763 (4, 177, 202): 2 siblings; 0 strokes; 1 pads bounds: LLC: (3.479999990463257, 2.0199999523162844); width = 0.06; height = 0.06 length: 1.8689511492848396; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (97, 233, 53): 1 siblings; 0 strokes; 1 pads bounds: LLC: (3.044999933242798, 2.3850000858306886); width = 0.05; height = 0.05 length: 0.47810252010822296; area: 0.071544; fatness: 0.1496415454656155; areaDPI: 500; areaPixels: 17886 (101, 180, 102): 3 siblings; 0 strokes; 1 pads bounds: LLC: (2.91500005684793, 1.8350000139325857); width = 0.05000000074505806; height = 0.05000000074505806 length: 0.6414212733507156; area: 0.15782; fatness: 0.246047342919522; areaDPI: 500; areaPixels: 39455 (100, 87, 196): 4 siblings; 0 strokes; 1 pads bounds: LLC: (2.6550000667572022, 2.3249999046325684); width = 0.05; height = 0.05 length: 0.774142112582922; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (28, 150, 205): 3 siblings; 0 strokes; 1 pads bounds: LLC: (2.534999942407012, 1.8350000139325857); width = 0.05000000074505806; height = 0.05000000074505806 length: 0.35071058198809624; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (28, 150, 205): 3 siblings; 0 strokes; 1 pads bounds: LLC: (2.3049999237060548, 1.8050000429153443); width = 0.05; height = 0.05 length: 0.35071058198809624; area: 0.06308; fatness: 0.17986340657990482; areaDPI: 500; areaPixels: 15770 (100, 87, 196): 4 siblings; 0 strokes; 1 pads bounds: LLC: (2.425000047683716, 2.3249999046325684); width = 0.05; height = 0.05 length: 0.774142112582922; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (139, 175, 69): 2 siblings; 0 strokes; 1 pads bounds: LLC: (2.425000047311187, 1.5550000425428152); width = 0.05000000074505806; height = 0.05000000074505806 length: 0.18242647126317024; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (101, 180, 102): 3 siblings; 0 strokes; 1 pads bounds: LLC: (2.774999951943755, 1.9250000473111868); width = 0.05000000074505806; height = 0.05000000074505806 length: 0.6414212733507156; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (100, 87, 196): 4 siblings; 0 strokes; 1 pads bounds: LLC: (2.7749999523162843, 2.3249999046325684); width = 0.05; height = 0.05 length: 0.774142112582922; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (197, 73, 113): 1 siblings; 0 strokes; 1 pads bounds: LLC: (1.66500005684793, 1.9300000425428152); width = 0.05000000074505806; height = 0.05000000074505806 length: 0.2065686695277691; area: 0.050292; fatness: 0.2434638327049845; areaDPI: 500; areaPixels: 12573 (77, 209, 97): 2 siblings; 0 strokes; 1 pads bounds: LLC: (1.665000057220459, 2.230000114440918); width = 0.05; height = 0.05 length: 0.5299999713897705; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (27, 152, 203): 1 siblings; 0 strokes; 1 pads bounds: LLC: (1.8050000425428152, 2.030000066384673); width = 0.05000000074505806; height = 0.05000000074505806 length: 0.5465685464441776; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (109, 78, 195): 2 siblings; 0 strokes; 1 pads bounds: LLC: (1.8050000429153443, 2.3300000190734864); width = 0.05; height = 0.05 length: 0.5099998712539673; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (28, 150, 205): 3 siblings; 0 strokes; 1 pads bounds: LLC: (2.1950000286102296, 1.8350000143051148); width = 0.05; height = 0.05 length: 0.35071058198809624; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (130, 84, 169): 14 siblings; 0 strokes; 1 pads bounds: LLC: (2.0749999042600393, 1.8350000139325857); width = 0.05000000074505806; height = 0.05000000074505806 length: 5.046739760786295; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (77, 209, 97): 2 siblings; 0 strokes; 1 pads bounds: LLC: (2.0749999046325684, 2.234999990463257); width = 0.05; height = 0.05 length: 0.5299999713897705; area: 0.151272; fatness: 0.2854188833318863; areaDPI: 500; areaPixels: 37818 (158, 71, 154): 0 siblings; 0 strokes; 1 pads bounds: LLC: (1.7099999809265136, 1.1400000476837158); width = 0.12; height = 0.12 length: 0.0; area: 0.08321200000000001; fatness: 0.6934333333333335; areaDPI: 500; areaPixels: 20803 (82, 241, 60): 0 siblings; 0 strokes; 1 pads bounds: LLC: (3.449999990463257, 1.1400000476837158); width = 0.12; height = 0.12 length: 0.0; area: 0.028732; fatness: 0.23943333333333336; areaDPI: 500; areaPixels: 7183 (5, 226, 151): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.0099999618530275, 1.22); width = 0.06; height = 0.06 length: 0.0; area: 0.011584; fatness: 0.1930666666666667; areaDPI: 500; areaPixels: 2896 (149, 135, 98): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.0599999141693117, 1.119999976158142); width = 0.06; height = 0.06 length: 0.0; area: 0.010928; fatness: 0.18213333333333334; areaDPI: 500; areaPixels: 2732 (92, 105, 185): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.110000104904175, 1.22); width = 0.06; height = 0.06 length: 0.0; area: 0.021624; fatness: 0.36040000000000005; areaDPI: 500; areaPixels: 5406 (22, 247, 113): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.160000057220459, 1.119999976158142); width = 0.06; height = 0.06 length: 0.0; area: 0.01008; fatness: 0.168; areaDPI: 500; areaPixels: 2520 (130, 139, 113): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.2100000095367434, 1.22); width = 0.06; height = 0.06 length: 0.0; area: 0.019080000000000003; fatness: 0.31800000000000006; areaDPI: 500; areaPixels: 4770 (210, 100, 72): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.2599999618530275, 1.119999976158142); width = 0.06; height = 0.06 length: 0.0; area: 0.009968; fatness: 0.16613333333333333; areaDPI: 500; areaPixels: 2492 (92, 236, 54): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.3099999141693117, 1.22); width = 0.06; height = 0.06 length: 0.0; area: 0.007696; fatness: 0.12826666666666667; areaDPI: 500; areaPixels: 1924 (4, 177, 202): 2 siblings; 0 strokes; 1 pads bounds: LLC: (2.360000104904175, 1.119999976158142); width = 0.06; height = 0.06 length: 1.8689511492848396; area: 0.16076; fatness: 0.08601615941728351; areaDPI: 500; areaPixels: 40190 (240, 136, 7): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.5599999141693117, 1.119999976158142); width = 0.06; height = 0.06 length: 0.0; area: 0.009936; fatness: 0.16560000000000002; areaDPI: 500; areaPixels: 2484 (179, 99, 105): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.660000057220459, 1.119999976158142); width = 0.06; height = 0.06 length: 0.0; area: 0.0099; fatness: 0.165; areaDPI: 500; areaPixels: 2475 (146, 74, 163): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.7100000095367434, 1.22); width = 0.06; height = 0.06 length: 0.0; area: 0.008263999999999999; fatness: 0.13773333333333332; areaDPI: 500; areaPixels: 2066 (130, 84, 169): 14 siblings; 0 strokes; 1 pads bounds: LLC: (2.860000104904175, 1.119999976158142); width = 0.06; height = 0.06 length: 5.046739760786295; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (130, 84, 169): 14 siblings; 0 strokes; 1 pads bounds: LLC: (2.9600000095367434, 1.119999976158142); width = 0.06; height = 0.06 length: 5.046739760786295; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (130, 84, 169): 14 siblings; 0 strokes; 1 pads bounds: LLC: (3.110000104904175, 1.22); width = 0.06; height = 0.06 length: 5.046739760786295; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (65, 161, 156): 0 siblings; 0 strokes; 1 pads bounds: LLC: (3.160000057220459, 1.119999976158142); width = 0.06; height = 0.06 length: 0.0; area: 0.012508000000000002; fatness: 0.20846666666666672; areaDPI: 500; areaPixels: 3127 (49, 152, 181): 0 siblings; 0 strokes; 1 pads bounds: LLC: (3.2100000102072954, 1.2200000006705523); width = 0.05999999865889549; height = 0.05999999865889549 length: 0.0; area: 0.014728; fatness: 0.24546667215327433; areaDPI: 500; areaPixels: 3682 (139, 175, 69): 2 siblings; 0 strokes; 1 pads bounds: LLC: (2.484999990090728, 1.534999942407012); width = 0.05000000074505806; height = 0.05000000074505806 length: 0.18242647126317024; area: 0.06072; fatness: 0.3328464316585104; areaDPI: 500; areaPixels: 15180 (130, 84, 169): 14 siblings; 0 strokes; 1 pads bounds: LLC: (2.784999942779541, 1.534999942779541); width = 0.05; height = 0.05 length: 5.046739760786295; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (214, 158, 11): 2 siblings; 0 strokes; 1 pads bounds: LLC: (3.6350000854581594, 2.0200000759214163); width = 0.05000000074505806; height = 0.05000000074505806 length: 0.35727928578853607; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (74, 182, 126): 1 siblings; 0 strokes; 1 pads bounds: LLC: (3.6350000858306886, 2.3200000286102296); width = 0.05; height = 0.05 length: 1.1824263520538807; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (130, 84, 169): 14 siblings; 0 strokes; 1 pads bounds: LLC: (1.9650000091642141, 1.9250000473111868); width = 0.05000000074505806; height = 0.05000000074505806 length: 5.046739760786295; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (109, 78, 195): 2 siblings; 0 strokes; 1 pads bounds: LLC: (1.9650000095367433, 2.3249999046325684); width = 0.05; height = 0.05 length: 0.5099998712539673; area: 0.09642400000000001; fatness: 0.18906671439527334; areaDPI: 500; areaPixels: 24106 38 collected nets (14 supernets) Thu Aug 05 17:06:23 EDT 2004: ToolpathsProcessor started border: true line: false voronoi: true flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 mosaic: 1445 x 706 tile: 502 x 487 generating voronoi toolpaths extracting nodes... 21577 nodes making paths... 38 paths total length: 43.227996945381165 total segments: 21652 optimizing paths... total length: 37.738997063133866 total segments: 1149 Thu Aug 05 17:06:35 EDT 2004: ToolpathsProcessor finished (11661ms) Thu Aug 05 17:06:39 EDT 2004: ToolpathsProcessor started border: true line: false voronoi: true flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 mosaic: 1445 x 706 tile: 502 x 487 generating outline toolpaths extracting nodes... 28540 nodes making paths... 38 paths total length: 57.079997539520264 total segments: 28578 optimizing paths... total length: 51.14494948484935 total segments: 1648 Thu Aug 05 17:06:46 EDT 2004: ToolpathsProcessor finished (7564ms) visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/rs232_cm.bot.out000066400000000000000000000134661147500217100252350ustar00rootroot00000000000000package: visolate class: visolate.Main args: ../gerber/examples/rs232_cm.bot graphics device: :0.0 pixel format 8:8:8 24-bit depth Comment at line 2: Mass Parameters Comment at line 4: Image image name: \\NCC1701LEONARDO\DINO\PANNE~DQ\RS232~CM.BOT Comment at line 13: Aperture Definitions Comment at line 40: Plot Data computing inch coords... making nets... 13 nets making half edge loops... 25 loops Thu Aug 05 17:07:48 EDT 2004: TopologyProcessor started border: true line: false voronoi: false flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 Thu Aug 05 17:07:49 EDT 2004: TopologyProcessor finished (1871ms) 0 nets Thu Aug 05 17:08:00 EDT 2004: FatnessProcessor started border: true line: false voronoi: false flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 0 misses avg fatness = 0.03872809766777838 Thu Aug 05 17:08:01 EDT 2004: FatnessProcessor finished (1422ms) 0 nets Thu Aug 05 17:08:05 EDT 2004: FatnessProcessor started border: true line: false voronoi: true flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 0 misses avg fatness = 0.14290588109829777 Thu Aug 05 17:08:07 EDT 2004: FatnessProcessor finished (1484ms) 0 nets model bounds: LLC: (0.04349999502301216, 0.08700000122189522); width = 1.056350038355589; height = 0.5380000226199627 board bounds: LLC: (0.04349999502301216, 0.08700000122189522); width = 1.056350038355589; height = 0.5380000226199627 13 nets (83, 124, 176): 0 siblings; 13 strokes; 3 pads bounds: LLC: (0.21499999463558198, 0.13015000059604645); width = 0.8848500387430193; height = 0.2798499898672103 length: 1.2721929494291544; area: 0.12972; fatness: 0.1019656649238676; areaDPI: 500; areaPixels: 32430 (214, 115, 54): 0 siblings; 16 strokes; 4 pads bounds: LLC: (0.28500000238418577, 0.1806499988079071); width = 0.7756499976158143; height = 0.4443500250339508 length: 1.2892031650990248; area: 0.08485600000000001; fatness: 0.06582050238255671; areaDPI: 500; areaPixels: 21214 (145, 73, 165): 0 siblings; 5 strokes; 2 pads bounds: LLC: (0.43000001311302183, 0.3501500143051147); width = 0.6306499868869783; height = 0.10919997258186342 length: 0.5843502506613731; area: 0.04823600000000001; fatness: 0.08254638368924468; areaDPI: 500; areaPixels: 12059 (156, 61, 165): 0 siblings; 4 strokes; 2 pads bounds: LLC: (0.48999998569488523, 0.08700000122189522); width = 0.07100001499056818; height = 0.19799998924136164 length: 0.16114214435219765; area: 0.029928; fatness: 0.18572422577788442; areaDPI: 500; areaPixels: 7482 (255, 56, 71): 0 siblings; 4 strokes; 2 pads bounds: LLC: (0.1801499976158142, 0.2750000115483999); width = 0.10684999913573265; height = 0.27499998919665813 length: 0.3059999942779541; area: 0.048432; fatness: 0.15827451276357526; areaDPI: 500; areaPixels: 12108 (4, 224, 155): 0 siblings; 5 strokes; 2 pads bounds: LLC: (0.3949999868869781, 0.08700000122189522); width = 0.07200000211596491; height = 0.19799998924136164 length: 0.16214213147759438; area: 0.018088; fatness: 0.11155644640393476; areaDPI: 500; areaPixels: 4522 (252, 96, 35): 0 siblings; 2 strokes; 2 pads bounds: LLC: (0.19999999403953553, 0.08700000122189522); width = 0.0769999973475933; height = 0.16800000295042994 length: 0.12753665074706078; area: 0.023552; fatness: 0.18466848440853212; areaDPI: 500; areaPixels: 5888 (30, 203, 149): 0 siblings; 7 strokes; 2 pads bounds: LLC: (0.6099999904632568, 0.38515001072883603); width = 0.4506500080227852; height = 0.17224996999502185 length: 0.4538477510213852; area: 0.113672; fatness: 0.25046284738479135; areaDPI: 500; areaPixels: 28418 (7, 189, 186): 0 siblings; 3 strokes; 2 pads bounds: LLC: (0.31500000357627866, 0.08700000122189522); width = 0.05599999949336054; height = 0.17299999818205836 length: 0.12699999660253525; area: 0.018432000000000004; fatness: 0.1451338621502928; areaDPI: 500; areaPixels: 4608 (159, 55, 169): 0 siblings; 0 strokes; 1 pads bounds: LLC: (0.04349999502301216, 0.14799999818205833); width = 0.12300000339746475; height = 0.06300000101327896 length: 0.0; area: 0.01756; fatness: 0.1427642236988909; areaDPI: 500; areaPixels: 4390 (204, 176, 3): 0 siblings; 0 strokes; 1 pads bounds: LLC: (0.04349999502301216, 0.25700001046061516); width = 0.12300000339746475; height = 0.06300000101327896 length: 0.0; area: 0.012920000000000001; fatness: 0.10504064750510653; areaDPI: 500; areaPixels: 3230 (114, 151, 118): 0 siblings; 0 strokes; 1 pads bounds: LLC: (0.04349999502301216, 0.3660000078380108); width = 0.12300000339746475; height = 0.06300000101327896 length: 0.0; area: 0.012176000000000001; fatness: 0.09899186718437904; areaDPI: 500; areaPixels: 3044 (134, 8, 241): 0 siblings; 0 strokes; 1 pads bounds: LLC: (0.04349999502301216, 0.4750000052154064); width = 0.12300000339746475; height = 0.06300000101327896 length: 0.0; area: 0.020156; fatness: 0.16386991417282717; areaDPI: 500; areaPixels: 5039 13 collected nets (0 supernets) Thu Aug 05 17:08:20 EDT 2004: ToolpathsProcessor started border: true line: false voronoi: true flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 mosaic: 531 x 272 tile: 502 x 487 generating voronoi toolpaths extracting nodes... 4937 nodes making paths... 14 paths total length: 9.899999801069498 total segments: 4964 optimizing paths... total length: 8.916831150650978 total segments: 304 Thu Aug 05 17:08:23 EDT 2004: ToolpathsProcessor finished (2721ms) Thu Aug 05 17:08:25 EDT 2004: ToolpathsProcessor started border: true line: false voronoi: true flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 mosaic: 531 x 272 tile: 502 x 487 generating outline toolpaths extracting nodes... 6828 nodes making paths... 13 paths total length: 13.655999392271042 total segments: 6841 optimizing paths... total length: 12.350086105754599 total segments: 485 Thu Aug 05 17:08:26 EDT 2004: ToolpathsProcessor finished (1925ms) visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/rs232_cm.top.out000066400000000000000000000174461147500217100252550ustar00rootroot00000000000000package: visolate class: visolate.Main args: ../gerber/examples/rs232_cm.top graphics device: :0.0 pixel format 8:8:8 24-bit depth Comment at line 2: Mass Parameters Comment at line 4: Image image name: \\NCC1701LEONARDO\DINO\PANNE~DQ\RS232~CM.TOP Comment at line 13: Aperture Definitions Comment at line 40: Plot Data computing inch coords... making nets... 21 nets making half edge loops... 39 loops Thu Aug 05 17:09:13 EDT 2004: TopologyProcessor started border: true line: false voronoi: false flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 Thu Aug 05 17:09:15 EDT 2004: TopologyProcessor finished (2050ms) 0 nets Thu Aug 05 17:09:18 EDT 2004: FatnessProcessor started border: true line: false voronoi: false flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 0 misses avg fatness = 0.035958615804262 Thu Aug 05 17:09:19 EDT 2004: FatnessProcessor finished (921ms) 0 nets 0 nets Thu Aug 05 17:09:24 EDT 2004: FatnessProcessor started border: true line: false voronoi: true flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 0 misses avg fatness = 0.09164561076719369 Thu Aug 05 17:09:26 EDT 2004: FatnessProcessor finished (1443ms) 0 nets model bounds: LLC: (0.04349999502301216, 0.09199999645352364); width = 1.056350038355589; height = 0.537850008314848 board bounds: LLC: (0.04349999502301216, 0.09199999645352364); width = 1.056350038355589; height = 0.537850008314848 21 nets (146, 160, 77): 0 siblings; 2 strokes; 2 pads bounds: LLC: (0.21499999463558198, 0.3599999904632568); width = 0.05000000000000002; height = 0.19300000000000006 length: 0.12914212327450514; area: 0.009764; fatness: 0.07560662433314336; areaDPI: 500; areaPixels: 2441 (82, 167, 134): 0 siblings; 6 strokes; 2 pads bounds: LLC: (0.93935, 0.09199999645352364); width = 0.1605000333786012; height = 0.267349996393919 length: 0.38007103465497494; area: 0.03596; fatness: 0.09461389245998228; areaDPI: 500; areaPixels: 8990 (125, 248, 10): 0 siblings; 21 strokes; 5 pads bounds: LLC: (0.5679999833106995, 0.09199999645352364); width = 0.49265001668930064; height = 0.1899999901652336 length: 0.8358373739756644; area: 0.088812; fatness: 0.1062551194349749; areaDPI: 500; areaPixels: 22203 (225, 43, 115): 0 siblings; 9 strokes; 3 pads bounds: LLC: (0.04349999502301216, 0.46699999046325685); width = 0.49849997636675836; height = 0.16285001430511475 length: 0.5596529478207231; area: 0.043840000000000004; fatness: 0.07833426084989287; areaDPI: 500; areaPixels: 10960 (91, 101, 190): 0 siblings; 3 strokes; 2 pads bounds: LLC: (0.2680000011920929, 0.3849999964237213); width = 0.06700000119209287; height = 0.16799999403953558 length: 0.11535533145070076; area: 0.009488; fatness: 0.08225020795033537; areaDPI: 500; areaPixels: 2372 (81, 227, 74): 0 siblings; 3 strokes; 2 pads bounds: LLC: (0.41800000715255736, 0.37000001072883604); width = 0.062000005960464455; height = 0.18299997973442084 length: 0.13414212688803673; area: 0.013244; fatness: 0.09873110190845757; areaDPI: 500; areaPixels: 3311 (76, 128, 178): 0 siblings; 6 strokes; 2 pads bounds: LLC: (0.04349999502301216, 0.3114999942481518); width = 0.34850000020861627; height = 0.2833499842941761 length: 0.5607017185539007; area: 0.041712000000000006; fatness: 0.07439249536737455; areaDPI: 500; areaPixels: 10428 (149, 62, 172): 0 siblings; 5 strokes; 2 pads bounds: LLC: (0.41800000715255736, 0.09200000536441803); width = 0.12199997854232791; height = 0.1929999850988388 length: 0.17778171971440315; area: 0.012744; fatness: 0.0716834105355295; areaDPI: 500; areaPixels: 3186 (166, 161, 55): 0 siblings; 8 strokes; 2 pads bounds: LLC: (0.04349999502301216, 0.20249999687075615); width = 0.3263500192821026; height = 0.3504999935925007 length: 0.4552769586443901; area: 0.04144; fatness: 0.09102151824987952; areaDPI: 500; areaPixels: 10360 (66, 202, 115): 0 siblings; 3 strokes; 2 pads bounds: LLC: (0.3679999952316284, 0.09200000536441803); width = 0.07699999165534971; height = 0.1929999850988388 length: 0.14156852662563324; area: 0.010932; fatness: 0.07722055361152984; areaDPI: 500; areaPixels: 2733 (208, 143, 31): 0 siblings; 10 strokes; 2 pads bounds: LLC: (0.2680000011920929, 0.09200000536441803); width = 0.5799999925196171; height = 0.3178500005960465 length: 0.7592741521075368; area: 0.087352; fatness: 0.11504671897171108; areaDPI: 500; areaPixels: 21838 (36, 193, 153): 0 siblings; 3 strokes; 2 pads bounds: LLC: (0.19999999403953553, 0.09200000390410423); width = 0.05000000000000002; height = 0.16300000026822092 length: 0.09707107534632087; area: 0.013596; fatness: 0.14006231981559383; areaDPI: 500; areaPixels: 3399 (208, 93, 82): 0 siblings; 6 strokes; 2 pads bounds: LLC: (0.46799998927116393, 0.09200000536441803); width = 0.2800000402033329; height = 0.28399999293684963 length: 0.3837767285294831; area: 0.026416000000000002; fatness: 0.06883168789628846; areaDPI: 500; areaPixels: 6604 (38, 106, 238): 0 siblings; 3 strokes; 2 pads bounds: LLC: (0.46799998927116393, 0.41000000238418577); width = 0.19200000119209293; height = 0.1429999880790711 length: 0.21535532549023628; area: 0.025016000000000004; fatness: 0.11616151094965224; areaDPI: 500; areaPixels: 6254 (248, 40, 95): 0 siblings; 2 strokes; 2 pads bounds: LLC: (0.31500000357627866, 0.09200000536441803); width = 0.04999999999999999; height = 0.16799999403953553 length: 0.10999998450279236; area: 0.009292; fatness: 0.08447273917355981; areaDPI: 500; areaPixels: 2323 (154, 158, 71): 0 siblings; 0 strokes; 1 pads bounds: LLC: (0.93935, 0.38064998688697815); width = 0.1213; height = 0.0787 length: 0.0; area: 0.017332; fatness: 0.14288540807914263; areaDPI: 500; areaPixels: 4333 (43, 229, 111): 0 siblings; 0 strokes; 1 pads bounds: LLC: (0.939350001513958, 0.48259998112916946); width = 0.12129999697208405; height = 0.07479999959468842 length: 0.0; area: 0.0434; fatness: 0.35779061074492907; areaDPI: 500; areaPixels: 10850 (154, 13, 215): 0 siblings; 0 strokes; 1 pads bounds: LLC: (0.04349999502301216, 0.09349999949336052); width = 0.12300000339746475; height = 0.06300000101327896 length: 0.0; area: 0.011204; fatness: 0.0910894283782673; areaDPI: 500; areaPixels: 2801 (142, 237, 4): 0 siblings; 0 strokes; 1 pads bounds: LLC: (0.04349999502301216, 0.4204999916255474); width = 0.12300000339746475; height = 0.06300000101327896 length: 0.0; area: 0.012216000000000001; fatness: 0.0993170704274289; areaDPI: 500; areaPixels: 3054 (123, 147, 113): 0 siblings; 0 strokes; 1 pads bounds: LLC: (0.5179999713897705, 0.09200000536441803); width = 0.024; height = 0.086 length: 0.0; area: 0.003892; fatness: 0.16216666666666665; areaDPI: 500; areaPixels: 973 (45, 245, 92): 0 siblings; 0 strokes; 1 pads bounds: LLC: (0.5679999833106995, 0.46699999046325685); width = 0.024; height = 0.086 length: 0.0; area: 0.017952000000000003; fatness: 0.7480000000000001; areaDPI: 500; areaPixels: 4488 21 collected nets (0 supernets) Thu Aug 05 17:09:30 EDT 2004: ToolpathsProcessor started border: true line: false voronoi: true flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 mosaic: 531 x 271 tile: 502 x 487 generating voronoi toolpaths extracting nodes... 5871 nodes making paths... 22 paths total length: 11.78600000590086 total segments: 5915 optimizing paths... total length: 10.403299977770075 total segments: 414 Thu Aug 05 17:09:32 EDT 2004: ToolpathsProcessor finished (2777ms) Thu Aug 05 17:09:35 EDT 2004: ToolpathsProcessor started border: true line: false voronoi: true flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 mosaic: 531 x 271 tile: 502 x 487 generating outline toolpaths extracting nodes... 8370 nodes making paths... 21 paths total length: 16.73999985307455 total segments: 8391 optimizing paths... total length: 15.00066932151094 total segments: 656 Thu Aug 05 17:09:37 EDT 2004: ToolpathsProcessor finished (2096ms) visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/style.css000066400000000000000000000016441147500217100242340ustar00rootroot00000000000000body { background: #ffffff; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; color: #000000; /* margin-left: 0; margin-right: 0; */ } h1 { color: #333399; } h2.separator { margin-bottom: 0px; border-bottom: 2px solid #9999cc; } h3.separator { margin-bottom: 0px; border-bottom: 2px solid #9999cc; } h4.separator { margin-bottom: 0px; border-bottom: 2px solid #9999cc; } h5.separator { margin-bottom: 0px; border-bottom: 2px solid #9999cc; } h6.separator { margin-bottom: 0px; border-bottom: 2px solid #9999cc; } img { border: 0px; } code { font-family: Courier New, Courier, mono, monospace; font-size: 12px; color: #000066; background-color: #ffeedd; } table.itemlist { /* border-top: 1px solid #000000; */ padding-top: 0px; margin-top: 4px; } p { text-indent: 1.5em; margin-top: 0.6em; margin-bottom: 0.6em; } pre { font-family: monospace; } visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/test.ngc000066400000000000000000000605371147500217100240400ustar00rootroot00000000000000G20 G17 G40 G49 G80 G91 G1 Z0.1 G0 X0.38807 Y0.19049 G1 Z-0.1 G1 X0 Y0.00781 G1 X-0.0625 Y0.07812 G1 X-0.07031 Y0.0625 G1 X-0.03906 Y0.03125 G1 X-0.03125 Y0.00781 G1 X-0.00781 Y0 G1 Z0.1 G0 X0.45312 Y0.21094 G1 Z-0.1 G1 X0 Y0.00781 G1 X0 Y0.0625 G1 X0.03125 Y0.07812 G1 X0.03906 Y0.05469 G1 X0.03906 Y0.03125 G1 X0.04688 Y0.03125 G1 X0.03125 Y0.00781 G1 X0.00781 Y0.10156 G1 X0.01562 Y0.03125 G1 X0.02344 Y0.03125 G1 X0.05469 Y0.03906 G1 X0.00781 Y0.04688 G1 X-0.02344 Y0.03906 G1 X0 Y0.00781 G1 X0.04688 Y0.09375 G1 X0 Y0.42969 G1 X0.01562 Y0.03125 G1 X0.07812 Y0.05469 G1 X0.03125 Y0.01562 G1 X0.17188 Y0 G1 X0.00781 Y0 G1 Z0.1 G0 X0.00781 Y-0.09375 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.10938 Y0 G1 X0.07031 Y-0.02344 G1 X0.01562 Y-0.02344 G1 X0.01562 Y-0.02344 G1 X0 Y-0.03906 G1 X-0.03125 Y-0.05469 G1 X-0.0625 Y-0.05469 G1 X-0.03125 Y0 G1 X-0.07031 Y0.04688 G1 X-0.02344 Y0.00781 G1 X-0.00781 Y0.04688 G1 X0.00781 Y0.14844 G1 X-0.00781 Y0.10938 G1 X0.00781 Y0.0625 G1 X0.02344 Y0.03125 G1 X0.07812 Y0.07812 G1 X0.04688 Y0.02344 G1 X0.07031 Y-0.00781 G1 X0.03125 Y-0.02344 G1 X0.00781 Y-0.00781 G1 X0.00781 Y0 G1 X0.03906 Y0.03125 G1 X0.03125 Y0.00781 G1 X0.07031 Y-0.00781 G1 X0.04688 Y-0.03125 G1 X0.07031 Y-0.07812 G1 X0.00781 Y0 G1 X0 Y-0.00781 G1 Z0.1 G0 X0.21094 Y-0.01562 G1 Z-0.1 G1 X0 Y0.00781 G1 X0.08594 Y0.09375 G1 X0.03906 Y0.03125 G1 X0.03125 Y0.00781 G1 X0.07031 Y-0.00781 G1 X0.03125 Y-0.02344 G1 X0.00781 Y-0.00781 G1 X0.00781 Y0 G1 X0.03906 Y0.03125 G1 X0.03125 Y0.00781 G1 X0.07031 Y-0.00781 G1 X0.04688 Y-0.03125 G1 X0.07031 Y-0.07812 G1 X0.00781 Y-0.00781 G1 X-0.03125 Y-0.00781 G1 X-0.02344 Y-0.00781 G1 X-0.02344 Y-0.00781 G1 X-0.03125 Y0 G1 X-0.36719 Y0 G1 X-0.02344 Y0.00781 G1 X-0.03906 Y0 G1 X-0.04688 Y-0.03906 G1 X-0.03125 Y0.00781 G1 X-0.05469 Y0.03125 G1 X-0.05469 Y0.01562 G1 X-0.03906 Y0 G1 X-0.0625 Y-0.02344 G1 X-0.03125 Y0 G1 X-0.36719 Y0 G1 X-0.02344 Y0.00781 G1 X-0.27344 Y0 G1 X-0.08594 Y0.03125 G1 X-0.04688 Y-0.02344 G1 X-0.03906 Y-0.01562 G1 X-0.02344 Y0 G1 X-0.02344 Y0.00781 G1 X-0.02344 Y0 G1 X-0.02344 Y-0.00781 G1 X-0.35156 Y0 G1 X-0.00781 Y0 G1 X-0.01562 Y-0.0625 G1 X0.00781 Y-0.09375 G1 X0.01562 Y-0.03125 G1 X-0.02344 Y-0.07031 G1 X0.00781 Y-0.07031 G1 X0.01562 Y-0.03906 G1 X0.02344 Y-0.03906 G1 X0 Y-0.01562 G1 X-0.04688 Y-0.1875 G1 X0.00781 Y-0.09375 G1 X0.01562 Y-0.03906 G1 X-0.02344 Y-0.0625 G1 X0 Y-0.07031 G1 X0.02344 Y-0.0625 G1 X0.02344 Y-0.03906 G1 X0 Y-0.01562 G1 X-0.03906 Y-0.10938 G1 X-0.00781 Y-0.07031 G1 X0.00781 Y-0.02344 G1 X-0.00781 Y-0.08594 G1 X0 Y-0.00781 G1 X0.03906 Y0 G1 X0.00781 Y-0.00781 G1 X0.14844 Y0.00781 G1 X0.02344 Y-0.00781 G1 X0.04688 Y0.00781 G1 X0.02344 Y-0.00781 G1 X0.04688 Y0.00781 G1 X0.00781 Y-0.00781 G1 X0.02344 Y0.00781 G1 X0.00781 Y-0.00781 G1 X0.0625 Y0.00781 G1 X0.00781 Y-0.00781 G1 X0.04688 Y0.00781 G1 X0.02344 Y-0.00781 G1 X0.04688 Y0.00781 G1 X0.02344 Y-0.00781 G1 X0.05469 Y0.00781 G1 X0.00781 Y-0.00781 G1 X0.03906 Y0.00781 G1 X0.00781 Y-0.00781 G1 X0.03906 Y0.00781 G1 X0.00781 Y-0.00781 G1 X0.05469 Y0.00781 G1 X0.02344 Y-0.00781 G1 X0.02344 Y0.00781 G1 X0.00781 Y0 G1 X0 Y0.08594 G1 X0 Y0.00781 G1 X0.30469 Y0 G1 X0.0625 Y0.03906 G1 X0.03125 Y0.00781 G1 X0.0625 Y0.00781 G1 X0.0625 Y-0.01562 G1 X0.0625 Y-0.03906 G1 X0.00781 Y0 G1 X0.07812 Y0.07812 G1 X0.02344 Y0.01562 G1 X0.02344 Y0.00781 G1 X0.00781 Y0.00781 G1 X0.03125 Y0 G1 X0.03125 Y-0.01562 G1 X0.02344 Y0 G1 X0.01562 Y0.01562 G1 X0.03125 Y0 G1 X0.01562 Y-0.01562 G1 X0.03125 Y0 G1 X0.03125 Y0.01562 G1 X0.02344 Y0 G1 X0.01562 Y-0.01562 G1 X0.02344 Y-0.00781 G1 X0.0625 Y-0.05469 G1 X0.00781 Y0 G1 X0.0625 Y0.05469 G1 X0.04688 Y0.02344 G1 X0.03125 Y0 G1 X0.01562 Y-0.01562 G1 X0.01562 Y0 G1 X0.00781 Y0 G1 X0 Y-0.07031 G1 X0.03125 Y-0.04688 G1 X0.01562 Y-0.01562 G1 X0 Y-0.10938 G1 X-0.03125 Y-0.04688 G1 X-0.01562 Y-0.02344 G1 X0 Y-0.05469 G1 X0.03906 Y-0.0625 G1 X0.15625 Y-0.00781 G1 X0.0625 Y0.03125 G1 X0.01562 Y0.04688 G1 X0 Y0.15625 G1 X0.00781 Y0.01562 G1 X0.55469 Y0 G1 X0.00781 Y0 G1 X0 Y0.07031 G1 X0.03906 Y0.07812 G1 X0.03125 Y0.04688 G1 X0.04688 Y0.03906 G1 X0.03125 Y0.02344 G1 X0.02344 Y0 G1 X0.03125 Y-0.02344 G1 X0 Y-0.10156 G1 X0.03125 Y-0.0625 G1 X0.01562 Y-0.01562 G1 X0 Y-0.10938 G1 X-0.03125 Y-0.05469 G1 X-0.01562 Y-0.03125 G1 X0.00781 Y-0.05469 G1 X0.03906 Y-0.04688 G1 X0.04688 Y-0.03906 G1 X0 Y-0.01562 G1 X-0.02344 Y-0.09375 G1 X0 Y-0.03125 G1 X-0.05469 Y-0.02344 G1 X-0.03125 Y-0.00781 G1 X-2.96875 Y0 G1 X-0.15625 Y0.05469 G1 X-0.03906 Y-0.03906 G1 X-0.08594 Y-0.0625 G1 X-0.03906 Y-0.02344 G1 X-0.03125 Y-0.00781 G1 X-0.03125 Y0.00781 G1 X-0.02344 Y0 G1 X-0.03125 Y0.02344 G1 X-0.03906 Y0.04687 G1 X-0.01562 Y0.04688 G1 X0.02344 Y0.07031 G1 X0.03125 Y0.03125 G1 X0.04687 Y0.07031 G1 X0.02344 Y0.02344 G1 X0 Y0.01562 G1 X-0.01562 Y0.05469 G1 X-0.00781 Y2.27344 G1 X0.02344 Y0.0625 G1 X0 Y0.00781 G1 Z0.1 G0 X0.21875 Y0.17969 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.15625 Y0.05469 G1 X0.04688 Y0.00781 G1 X2.75781 Y0 G1 X0.07812 Y-0.03125 G1 X0.01562 Y-0.00781 G1 X0.07031 Y-0.0625 G1 X0.00781 Y0 G1 Z0.1 G0 X0.16406 Y-0.82031 G1 Z-0.1 G1 X-0.00781 Y0 G1 X-0.02344 Y0.00781 G1 X-0.07031 Y0 G1 X-0.02344 Y0.00781 G1 X-0.07812 Y0 G1 X-0.02344 Y-0.00781 G1 X-0.0625 Y0 G1 X-0.03125 Y0 G1 X-0.02344 Y0.00781 G1 X-0.05469 Y0 G1 X-0.02344 Y-0.00781 G1 X-0.04688 Y-0.01562 G1 X-0.10156 Y-0.03125 G1 X-0.03125 Y0 G1 X-0.07031 Y0.07812 G1 X-0.08594 Y0.14844 G1 X-0.07812 Y0.10156 G1 X-0.02344 Y0.01562 G1 X-0.02344 Y0 G1 X-0.00781 Y0 G1 Z0.1 G0 X-0.26562 Y-0.51562 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.03125 Y-0.01562 G1 X0.03906 Y0.00781 G1 X0.0625 Y0.03125 G1 X0.04688 Y0 G1 X0.07031 Y-0.01562 G1 X0.04688 Y-0.02344 G1 X0.25781 Y0 G1 X0.00781 Y0 G1 Z0.1 G0 X-0.03125 Y-0.10156 G1 Z-0.1 G1 X-0.00781 Y0 G1 X-0.21875 Y0 G1 X-0.03125 Y-0.03906 G1 X-0.00781 Y-0.01562 G1 X0.02344 Y-0.03125 G1 X0 Y-0.01562 G1 X-0.02344 Y-0.03906 G1 X0 Y-0.01562 G1 X0.02344 Y-0.03125 G1 X0 Y-0.01562 G1 X-0.02344 Y-0.03125 G1 X0 Y-0.01562 G1 X0.00781 Y-0.19531 G1 X0.01562 Y-0.05469 G1 X0.03125 Y-0.04688 G1 X0.02344 Y-0.07031 G1 X0 Y-0.01562 G1 X0.03125 Y0 G1 X0.10938 Y0.00781 G1 X0.0625 Y0.02344 G1 X0.04688 Y0.03906 G1 X0.00781 Y0.01562 G1 X-0.02344 Y0.03906 G1 X0 Y0.28125 G1 X-0.03906 Y0.14062 G1 X-0.00781 Y0.08594 G1 X0.03125 Y0.0625 G1 X0 Y0.0625 G1 X-0.01562 Y0.14844 G1 X0 Y0.00781 G1 X0 Y0.00781 G1 Z0.1 G0 X-0.25781 Y-0.39062 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.0625 Y0.00781 G1 X0.07031 Y0.03906 G1 X0.02344 Y0.00781 G1 X0.0625 Y0.03906 G1 X0.00781 Y0 G1 X0 Y0.00781 G1 Z0.1 G0 X0.28906 Y-0.11719 G1 Z-0.1 G1 X-0.00781 Y0 G1 X-0.04688 Y-0.02344 G1 X-0.02344 Y-0.03125 G1 X-0.00781 Y-0.01562 G1 X0.02344 Y-0.0625 G1 X0.02344 Y-0.03125 G1 X0.03906 Y0.04688 G1 X0.02344 Y0.04688 G1 X-0.02344 Y0.0625 G1 X0.00781 Y0.03906 G1 X0.05469 Y0.08594 G1 X0 Y0.32031 G1 X0 Y0.00781 G1 Z0.1 G0 X0.28906 Y-0.23438 G1 Z-0.1 G1 X-0.00781 Y0 G1 X-0.58594 Y0 G1 X-0.00781 Y0 G1 Z0.1 G0 X0.01562 Y-0.59375 G1 Z-0.1 G1 X-0.00781 Y0 G1 X-0.07812 Y0 G1 X-0.04688 Y0.02344 G1 X-0.01562 Y0.02344 G1 X-0.03125 Y0.04688 G1 X0 Y0.13281 G1 X-0.02344 Y0.04688 G1 X-0.02344 Y0.02344 G1 X-0.03906 Y0 G1 X-0.01562 Y0.00781 G1 X-0.00781 Y0 G1 Z0.1 G0 X-0.14844 Y-0.30469 G1 Z-0.1 G1 X-0.00781 Y0 G1 X-0.10156 Y0 G1 X-0.00781 Y0 G1 Z0.1 G0 X-0.0625 Y-0.125 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.09375 Y0.00781 G1 X0.04688 Y0.03125 G1 X0.02344 Y0.03125 G1 X0.01562 Y0.03125 G1 X-0.00781 Y0.02344 G1 X0.00781 Y0.08594 G1 X-0.02344 Y0.05469 G1 X-0.01562 Y0.02344 G1 X-0.00781 Y0 G1 Z0.1 G0 X-0.28906 Y0.24219 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.03906 Y-0.02344 G1 X0.03125 Y-0.03125 G1 X0.00781 Y-0.0625 G1 X-0.01562 Y-0.03906 G1 X-0.02344 Y-0.03906 G1 X-0.02344 Y0 G1 X-0.04688 Y0.0625 G1 X-0.01562 Y0.03125 G1 X0.00781 Y0.04688 G1 X0.03125 Y0.04688 G1 X0 Y0.01562 G1 X-0.05469 Y0.0625 G1 X-0.02344 Y0.0625 G1 X-0.00781 Y0.15625 G1 X0 Y0.00781 G1 Z0.1 G0 X-0.46875 Y0.22656 G1 Z-0.1 G1 X0 Y-0.00781 G1 X0.03125 Y-0.01562 G1 X0.03125 Y-0.02344 G1 X0.04688 Y-0.00781 G1 X0.28906 Y0.02344 G1 X0.29688 Y0 G1 X0.08594 Y0.02344 G1 X0.05469 Y0.03906 G1 X0.10156 Y0.10156 G1 X0.05469 Y0.05469 G1 X0.00781 Y0.01562 G1 X-0.03125 Y0.02344 G1 X0 Y0.00781 G1 Z0.1 G0 X0.94531 Y-0.78906 G1 Z-0.1 G1 X-0.00781 Y0 G1 X-0.07031 Y0 G1 X-0.02344 Y0.00781 G1 X-0.03125 Y0 G1 X-0.05469 Y0 G1 X-0.04688 Y-0.02344 G1 X-0.01562 Y-0.03125 G1 X0.00781 Y-0.04688 G1 X0.02344 Y-0.03125 G1 X0.0625 Y-0.0625 G1 X0.07031 Y-0.04688 G1 X0.04688 Y0 G1 X0.00781 Y0 G1 X0.02344 Y0.07812 G1 X0.00781 Y0.20312 G1 X0.00781 Y0.05469 G1 X-0.01562 Y0.125 G1 X0.00781 Y0.14062 G1 X-0.01562 Y0.0625 G1 X-0.00781 Y0.02344 G1 X0.03125 Y0.09375 G1 X0.00781 Y0.10938 G1 X-0.02344 Y0.10156 G1 X-0.02344 Y0.04688 G1 X-0.02344 Y0.03906 G1 X0 Y0.01562 G1 X0.04688 Y0.10156 G1 X0.00781 Y0.05469 G1 X0 Y0.0625 G1 X-0.02344 Y0.03125 G1 X-0.14844 Y0.14844 G1 X-0.01562 Y0.00781 G1 X0 Y0.00781 G1 X0.03906 Y0.04688 G1 X0.0625 Y0.0625 G1 X0.03125 Y0.01562 G1 X0.04688 Y0.03125 G1 X0.04688 Y0.02344 G1 X0.07031 Y-0.01562 G1 X0.03125 Y-0.02344 G1 X0.03125 Y-0.03125 G1 X0.00781 Y-0.04688 G1 X-0.00781 Y-0.05469 G1 X-0.02344 Y-0.03125 G1 X-0.02344 Y-0.03906 G1 X-0.04688 Y-0.05469 G1 X-0.07031 Y-0.07812 G1 X-0.00781 Y0 G1 Z0.1 G0 X0 Y-1.47656 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.05469 Y-0.07031 G1 X0.03125 Y-0.07031 G1 X0.01562 Y-0.05469 G1 X0.00781 Y-0.0625 G1 X-0.01562 Y-0.03906 G1 X-0.02344 Y0 G1 X-0.0625 Y0.03906 G1 X-0.02344 Y0 G1 X-0.09375 Y0 G1 X-0.00781 Y0 G1 X-0.01562 Y0.08594 G1 X0 Y0.04688 G1 X0.125 Y0.11719 G1 X0 Y0.05469 G1 X-0.03906 Y0.10938 G1 X0 Y0.00781 G1 Z0.1 G0 X-0.08594 Y-0.28906 G1 Z-0.1 G1 X-0.00781 Y0 G1 X-0.02344 Y0.00781 G1 X-0.04688 Y0.01562 G1 X-0.0625 Y0.04688 G1 X-0.03906 Y0.01562 G1 X-0.00781 Y0 G1 Z0.1 G0 X-0.25781 Y0.00781 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.125 Y-0.04688 G1 X0.04688 Y-0.00781 G1 X0.04688 Y0.02344 G1 X0.03125 Y0.01562 G1 X0 Y0.02344 G1 X-0.00781 Y0.02344 G1 X-0.04688 Y0.04688 G1 X-0.03125 Y0.07031 G1 X0 Y0.11719 G1 X0 Y0.00781 G1 Z0.1 G0 X-0.42969 Y-0.35156 G1 Z-0.1 G1 X0 Y-0.00781 G1 X-0.03906 Y-0.09375 G1 X-0.03906 Y-0.04688 G1 X-0.03125 Y0.00781 G1 X-0.0625 Y0.02344 G1 X-0.03125 Y0 G1 X-0.17969 Y0 G1 X-0.00781 Y0 G1 X-0.00781 Y-0.05469 G1 X-0.02344 Y-0.01562 G1 X-0.04688 Y-0.02344 G1 X-0.0625 Y0 G1 X-0.03125 Y0 G1 X-0.08594 Y0.03125 G1 X-0.0625 Y-0.03125 G1 X-0.03125 Y0 G1 X-0.03906 Y0 G1 X-0.03125 Y0 G1 X-0.03906 Y0.01562 G1 X-0.0625 Y0.03906 G1 X-0.0625 Y0.05469 G1 X-0.03906 Y0.03906 G1 X0 Y0.02344 G1 X0.00781 Y0.01562 G1 X0 Y0.00781 G1 X0.60156 Y0 G1 X0.02344 Y0.03125 G1 X0.02344 Y0.05469 G1 X0.00781 Y0.01562 G1 X0.03125 Y0.03906 G1 X0.00781 Y0.02344 G1 X-0.00781 Y0.03125 G1 X0.01562 Y0.05469 G1 X0.03906 Y0.04688 G1 X0.02344 Y0.01562 G1 X0 Y0.27344 G1 X-0.05469 Y0.15625 G1 X0 Y0.00781 G1 Z0.1 G0 X-0.61719 Y-0.42969 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.11719 Y0.00781 G1 X0.03906 Y0.01562 G1 X0.0625 Y0.0625 G1 X0.02344 Y0.03125 G1 X0 Y0.04688 G1 X-0.02344 Y0.03906 G1 X-0.07031 Y0.03125 G1 X-0.03125 Y0 G1 X-0.11719 Y0 G1 X-0.01562 Y0 G1 X-0.00781 Y0 G1 Z0.1 G0 X-0.35156 Y0 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.02344 Y-0.01562 G1 X0.02344 Y-0.02344 G1 X0.00781 Y-0.03125 G1 X-0.00781 Y-0.0625 G1 X-0.03906 Y-0.04688 G1 X-0.00781 Y0 G1 X-0.03906 Y0.04688 G1 X-0.00781 Y0.03125 G1 X0.00781 Y0.04688 G1 X0.03125 Y0.04688 G1 X0 Y0.01562 G1 X-0.05469 Y0.0625 G1 X-0.02344 Y0.0625 G1 X-0.00781 Y0.15625 G1 X0 Y0.00781 G1 Z0.1 G0 X-0.27344 Y-0.39844 G1 Z-0.1 G1 X-0.00781 Y0 G1 X-0.07031 Y0 G1 X-0.07812 Y0 G1 X-0.04688 Y0 G1 X-0.00781 Y0 G1 X-0.00781 Y0 G1 X-0.00781 Y0.02344 G1 X-0.00781 Y0.00781 G1 X0 Y0.02344 G1 X0.03125 Y0.02344 G1 X0.02344 Y0.01562 G1 X0.17969 Y0 G1 X0.00781 Y0 G1 Z0.1 G0 X0.10938 Y-0.21875 G1 Z-0.1 G1 X0 Y-0.00781 G1 X0.00781 Y-0.09375 G1 X-0.02344 Y-0.07031 G1 X-0.03125 Y-0.00781 G1 X-0.08594 Y0 G1 X-0.0625 Y-0.03125 G1 X-0.04688 Y-0.03125 G1 X-0.03906 Y0.04688 G1 X-0.04688 Y0.07031 G1 X-0.01562 Y0.03125 G1 X0 Y0.14062 G1 X-0.00781 Y0.03125 G1 X0.01562 Y0.01562 G1 X0.00781 Y0.02344 G1 X0 Y0.00781 G1 Z0.1 G0 X-0.23438 Y-0.23438 G1 Z-0.1 G1 X-0.00781 Y0 G1 X-0.04688 Y-0.02344 G1 X-0.02344 Y-0.01562 G1 X0 Y-0.08594 G1 X-0.01562 Y-0.04688 G1 X-0.03125 Y-0.03906 G1 X0 Y-0.01562 G1 X0.03906 Y-0.04688 G1 X0.01562 Y-0.03125 G1 X0.02344 Y-0.00781 G1 X0.03125 Y0.01562 G1 X0.02344 Y0.03125 G1 X0.03125 Y0.05469 G1 X0.00781 Y0.00781 G1 X0 Y0.01562 G1 X-0.02344 Y0.03125 G1 X0 Y0.07031 G1 X0.00781 Y0.01562 G1 X-0.03125 Y0.05469 G1 X0 Y0.02344 G1 X0.04688 Y0.05469 G1 X0.02344 Y0.05469 G1 X0 Y0.22656 G1 X-0.03125 Y0.11719 G1 X-0.00781 Y0.05469 G1 X0 Y0.00781 G1 Z0.1 G0 X-0.03906 Y0.00781 G1 Z-0.1 G1 X0 Y0.00781 G1 X-0.05469 Y0.10156 G1 X-0.03906 Y0.04688 G1 X-0.04688 Y0.01562 G1 X-0.02344 Y0.00781 G1 X-0.05469 Y0 G1 X-0.00781 Y0 G1 Z0.1 G0 X-0.17188 Y0 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.07812 Y0.02344 G1 X0.03906 Y0.00781 G1 X0.00781 Y0 G1 X0 Y0.01562 G1 X-0.01562 Y0.0625 G1 X-0.02344 Y0.03125 G1 X-0.02344 Y0.02344 G1 X-0.03125 Y0.00781 G1 X-0.07031 Y0 G1 X-0.00781 Y0 G1 Z0.1 G0 X0.21094 Y0.14062 G1 Z-0.1 G1 X-0.00781 Y0 G1 X-0.02344 Y0.00781 G1 X-0.00781 Y0 G1 Z0.1 G0 X-0.17188 Y0.14844 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.07812 Y0 G1 X0.03125 Y-0.03906 G1 X0.01562 Y-0.02344 G1 X0 Y-0.02344 G1 X0.00781 Y-0.00781 G1 X-0.03125 Y-0.00781 G1 X-0.04688 Y0 G1 X-0.0625 Y0.02344 G1 X-0.00781 Y0 G1 X0 Y0.0625 G1 X0.00781 Y0.01562 G1 X-0.00781 Y0.08594 G1 X0.02344 Y0.03125 G1 X0.04688 Y0.03125 G1 X0.09375 Y0.02344 G1 X0.03125 Y0 G1 X0.00781 Y0 G1 Z0.1 G0 X0.09375 Y0.15625 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.08594 Y-0.01562 G1 X0.00781 Y0 G1 X0.01562 Y-0.07031 G1 X0.03125 Y-0.03906 G1 X0.10938 Y0 G1 X0.01562 Y-0.00781 G1 X0 Y-0.08594 G1 X-0.03125 Y-0.00781 G1 X-0.08594 Y0 G1 X-0.0625 Y-0.03125 G1 X-0.02344 Y-0.00781 G1 X-0.07031 Y0.02344 G1 X-0.03125 Y0.02344 G1 X-0.0625 Y0.05469 G1 X0 Y0.02344 G1 X0.03125 Y0.07812 G1 X0.0625 Y0.05469 G1 X0 Y0.00781 G1 Z0.1 G0 X0.10156 Y-0.01562 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.0625 Y0.01562 G1 X0.07031 Y-0.01562 G1 X0.03906 Y-0.03125 G1 X0.00781 Y-0.00781 G1 X-0.01562 Y-0.07031 G1 X-0.00781 Y0 G1 Z0.1 G0 X-0.19531 Y-0.14062 G1 Z-0.1 G1 X0 Y-0.00781 G1 X0.04688 Y-0.03125 G1 X0.04688 Y-0.02344 G1 X0.09375 Y0 G1 X0.01562 Y0.00781 G1 X0 Y0.07812 G1 X-0.00781 Y0.00781 G1 X0 Y0.00781 G1 Z0.1 G0 X0.34375 Y-0.10156 G1 Z-0.1 G1 X0 Y-0.00781 G1 X-0.08594 Y-0.125 G1 X0 Y-0.03125 G1 X0.02344 Y-0.13281 G1 X0.00781 Y-0.02344 G1 X0.04688 Y-0.03906 G1 X0.04688 Y-0.01562 G1 X0.04688 Y0 G1 X0.0625 Y0.02344 G1 X0.15625 Y0.10938 G1 X0.00781 Y0 G1 X0.0625 Y-0.04688 G1 X0.05469 Y-0.02344 G1 X0.04688 Y-0.00781 G1 X0.07031 Y0 G1 X0.05469 Y0.04688 G1 X0.03125 Y0.02344 G1 X0.0625 Y0.00781 G1 X0.03125 Y0.01562 G1 X0.03125 Y0.03125 G1 X-0.01562 Y0.01562 G1 X-0.03125 Y0.02344 G1 X-0.03125 Y0.00781 G1 X-0.03125 Y0 G1 X-0.04688 Y0.02344 G1 X-0.01562 Y0.02344 G1 X0.01562 Y0.0625 G1 X0.03906 Y0.05469 G1 X0.02344 Y0.03906 G1 X0.13281 Y0 G1 X0.02344 Y0.03125 G1 X0.02344 Y0.02344 G1 X0.02344 Y0.07031 G1 X0 Y0.08594 G1 X0 Y0.00781 G1 Z0.1 G0 X-0.71875 Y-0.00781 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.05469 Y0.03125 G1 X0.07812 Y0.00781 G1 X0.46875 Y0 G1 X0.07812 Y-0.01562 G1 X0.02344 Y-0.01562 G1 X0.05469 Y0.02344 G1 X0.10156 Y0 G1 X0.02344 Y-0.00781 G1 X0.00781 Y-0.01562 G1 X0.01562 Y-0.02344 G1 X0.00781 Y-0.10938 G1 X0.04688 Y-0.09375 G1 X0.05469 Y-0.07031 G1 X0.04688 Y0 G1 X0.05469 Y0.00781 G1 X0.21094 Y-0.0625 G1 X0.02344 Y-0.00781 G1 X0.01562 Y0.00781 G1 X0 Y0.01562 G1 X-0.00781 Y0.29688 G1 X0.03906 Y0.03125 G1 X0.05469 Y0.03125 G1 X0.07812 Y0.00781 G1 X0.17188 Y0 G1 X0.07812 Y-0.01562 G1 X0.01562 Y-0.00781 G1 X0.01562 Y-0.0625 G1 X0.00781 Y-0.0625 G1 X0.03906 Y-0.0625 G1 X0.09375 Y-0.08594 G1 X0.03125 Y-0.03125 G1 X0.21875 Y0 G1 X0.03906 Y0.00781 G1 X0.00781 Y0 G1 Z0.1 G0 X-0.04688 Y-1.54687 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.04688 Y-0.03125 G1 X0.00781 Y-0.00781 G1 X-0.01562 Y-0.01562 G1 X0 Y-0.00781 G1 X0.03906 Y-0.05469 G1 X0 Y-0.01562 G1 X-0.02344 Y0.00781 G1 X-0.02344 Y0.00781 G1 X-0.02344 Y0.03125 G1 X-0.01562 Y0.05469 G1 X0 Y0.05469 G1 X0 Y0.00781 G1 Z0.1 G0 X0.0625 Y-0.07031 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.0625 Y0 G1 X0.01562 Y0.00781 G1 X0.03906 Y-0.00781 G1 X0.00781 Y0.00781 G1 X0.00781 Y0 G1 Z0.1 G0 X-0.10938 Y-0.10938 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.05469 Y-0.03125 G1 X0.01562 Y0 G1 X0.00781 Y0.01562 G1 X0.02344 Y0.05469 G1 X0 Y0.07812 G1 X0 Y0.00781 G1 Z0.1 G0 X-0.25 Y-0.32031 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.03125 Y0.03906 G1 X0.01562 Y0.04688 G1 X-0.03125 Y0.0625 G1 X-0.05469 Y0.03125 G1 X-0.00781 Y0 G1 X-0.00781 Y0 G1 Z0.1 G0 X0.10156 Y-0.50781 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.10938 Y0.03906 G1 X0.03125 Y0.01562 G1 X0.00781 Y0.00781 G1 X0.00781 Y0 G1 Z0.1 G0 X-0.17188 Y-0.07031 G1 Z-0.1 G1 X0.00781 Y0 G1 X0 Y0.14844 G1 X-0.00781 Y0.03125 G1 X-0.02344 Y0.02344 G1 X-0.01562 Y0.03125 G1 X-0.00781 Y0 G1 Z0.1 G0 X0.02344 Y-0.36719 G1 Z-0.1 G1 X0 Y-0.00781 G1 X0.05469 Y-0.03906 G1 X0.02344 Y-0.00781 G1 X0.03906 Y-0.03125 G1 X0.02344 Y-0.01562 G1 X0.04688 Y-0.00781 G1 X0.0625 Y0.02344 G1 X0.03125 Y0.03906 G1 X0.01562 Y0.00781 G1 X0.00781 Y0.04688 G1 X0 Y0.03906 G1 X-0.03125 Y0.04688 G1 X-0.02344 Y0.03906 G1 X-0.04688 Y0.05469 G1 X-0.00781 Y0.00781 G1 X0 Y0.01562 G1 X0.00781 Y0.39844 G1 X-0.00781 Y0.01562 G1 X0 Y0.00781 G1 Z0.1 G0 X-0.9375 Y0.25 G1 Z-0.1 G1 X0 Y-0.00781 G1 X0.07812 Y-0.00781 G1 X0.15625 Y0.00781 G1 X0.19531 Y0.03125 G1 X0.01562 Y0.00781 G1 X0.01562 Y0.01562 G1 X0.01562 Y0 G1 X0.02344 Y-0.02344 G1 X0.02344 Y-0.00781 G1 X0.02344 Y-0.02344 G1 X0.00781 Y-0.00781 G1 X-0.03125 Y-0.03906 G1 X-0.13281 Y-0.07812 G1 X-0.13281 Y-0.0625 G1 X-0.04688 Y-0.0625 G1 X-0.03125 Y-0.08594 G1 X-0.00781 Y-0.10938 G1 X0 Y-0.00781 G1 Z0.1 G0 X-0.45312 Y-0.25 G1 Z-0.1 G1 X0 Y0.00781 G1 X0 Y0.02344 G1 X0.00781 Y0.00781 G1 X-0.00781 Y0.08594 G1 X-0.01562 Y0.03906 G1 X-0.02344 Y0.03125 G1 X-0.00781 Y0 G1 Z0.1 G0 X-0.04688 Y0.24219 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.03125 Y0.01562 G1 X0.04688 Y-0.01562 G1 X0.00781 Y0 G1 X0 Y-0.07031 G1 X-0.03125 Y-0.04688 G1 X-0.00781 Y-0.02344 G1 X-0.00781 Y0 G1 Z0.1 G0 X-0.03125 Y0.33594 G1 Z-0.1 G1 X0 Y-0.00781 G1 X0.03125 Y-0.02344 G1 X0.07031 Y-0.03125 G1 X0.17969 Y0 G1 X0.00781 Y0.01562 G1 X0.03125 Y0.07031 G1 X0 Y0.00781 G1 Z0.1 G0 X-0.30469 Y0.03125 G1 Z-0.1 G1 X0 Y0.00781 G1 X-0.02344 Y0.08594 G1 X0 Y0.00781 G1 Z0.1 G0 X-0.23438 Y-0.16406 G1 Z-0.1 G1 X0 Y0.00781 G1 X0 Y0.21094 G1 X0.03125 Y0.08594 G1 X0.04688 Y0.05469 G1 X0.0625 Y0.07031 G1 X0.00781 Y0.07812 G1 X0 Y0.00781 G1 Z0.1 G0 X-0.50781 Y-0.35156 G1 Z-0.1 G1 X0 Y0.00781 G1 X0.04688 Y0.1875 G1 X0.03906 Y0.125 G1 X-0.01562 Y0.04688 G1 X-0.00781 Y0.14844 G1 X0.00781 Y0.04688 G1 X-0.02344 Y0.14062 G1 X0 Y0.00781 G1 Z0.1 G0 X-0.0625 Y-0.73438 G1 Z-0.1 G1 X-0.00781 Y0 G1 X-0.03906 Y0.01562 G1 X-0.03125 Y0 G1 X-0.03125 Y0 G1 X-0.02344 Y0.00781 G1 X-0.36719 Y0 G1 X-0.00781 Y0 G1 Z0.1 G0 X-0.01562 Y0.02344 G1 Z-0.1 G1 X-0.00781 Y0 G1 X-0.20312 Y0 G1 X-0.00781 Y0 G1 Z0.1 G0 X-0.00781 Y0.0625 G1 Z-0.1 G1 X0 Y-0.00781 G1 X0.00781 Y-0.07031 G1 X-0.00781 Y-0.08594 G1 X0.01562 Y-0.00781 G1 X0.05469 Y-0.01562 G1 X0.07812 Y0 G1 X0.03125 Y0.01562 G1 X0.03906 Y0.03906 G1 X0.02344 Y0.02344 G1 X0 Y0.02344 G1 X-0.01562 Y0.01562 G1 X0 Y0.125 G1 X0 Y0.00781 G1 Z0.1 G0 X0.17188 Y-0.32812 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.09375 Y-0.02344 G1 X0.07031 Y0.01562 G1 X0.07031 Y0.03906 G1 X0.03125 Y0.03125 G1 X0.0625 Y0.0625 G1 X0.00781 Y0.01562 G1 X0.00781 Y0 G1 Z0.1 G0 X0.25 Y-0.32031 G1 Z-0.1 G1 X0 Y-0.00781 G1 X0 Y-0.16406 G1 X-0.01562 Y0.00781 G1 X-0.0625 Y0.0625 G1 X-0.02344 Y0.04688 G1 X0 Y0.04688 G1 X0 Y0.00781 G1 Z0.1 G0 X0.10156 Y-0.17969 G1 Z-0.1 G1 X0 Y-0.00781 G1 X0.125 Y0 G1 X0.00781 Y0.01562 G1 X0.02344 Y0.02344 G1 X0.01562 Y0.0625 G1 X0 Y0.01562 G1 X0 Y0.00781 G1 Z0.1 G0 X-0.17188 Y-0.14062 G1 Z-0.1 G1 X-0.00781 Y0 G1 X-0.07031 Y-0.0625 G1 X-0.02344 Y-0.05469 G1 X0 Y-0.03906 G1 X0.01562 Y-0.03125 G1 X0.03125 Y-0.04688 G1 X0.04688 Y0 G1 X0.00781 Y0 G1 X0 Y0.23438 G1 X0.00781 Y0.00781 G1 X0 Y0.00781 G1 Z0.1 G0 X-0.00781 Y-0.25 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.08594 Y0 G1 X0.0625 Y0.03125 G1 X0.01562 Y0.02344 G1 X0 Y0.08594 G1 X-0.01562 Y0.0625 G1 X-0.03125 Y0.03906 G1 X0 Y0.00781 G1 Z0.1 G0 X-0.42969 Y0 G1 Z-0.1 G1 X-0.00781 Y0 G1 X-0.34375 Y0 G1 X-0.0625 Y0 G1 X-0.02344 Y0 G1 X-0.08594 Y0 G1 X-0.04688 Y0 G1 X-0.01562 Y0 G1 X-0.00781 Y0 G1 Z0.1 G0 X0 Y0.08594 G1 Z-0.1 G1 X-0.00781 Y0 G1 X-0.01562 Y0 G1 X-0.01562 Y0.00781 G1 X-0.53906 Y0 G1 X-0.00781 Y0 G1 Z0.1 G0 X-0.01562 Y-0.02344 G1 Z-0.1 G1 X-0.00781 Y0 G1 X-0.05469 Y0.02344 G1 X-0.17188 Y0 G1 X-0.00781 Y0 G1 Z0.1 G0 X0.03906 Y0.21094 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.0625 Y0.02344 G1 X0.04688 Y0.03125 G1 X0.03125 Y0.02344 G1 X0 Y0.19531 G1 X0.01562 Y0.10156 G1 X0.02344 Y0.08594 G1 X0.04688 Y0.07031 G1 X0.02344 Y0.05469 G1 X0 Y0.01562 G1 X-0.03125 Y0.03906 G1 X-0.03125 Y0.05469 G1 X0 Y0.01562 G1 X0.03125 Y0.0625 G1 X0.01562 Y0.01562 G1 X-0.01562 Y0.02344 G1 X-0.04688 Y0.0625 G1 X-0.02344 Y0.03125 G1 X-0.00781 Y0.05469 G1 X0 Y0.21094 G1 X-0.03125 Y0.02344 G1 X0 Y0.00781 G1 X-0.00781 Y0 G1 Z0.1 G0 X-0.13281 Y-0.21875 G1 Z-0.1 G1 X0 Y0.00781 G1 X-0.01562 Y0.0625 G1 X-0.00781 Y0.03906 G1 X0.01562 Y0.0625 G1 X0.00781 Y0.01562 G1 X-0.03125 Y0.05469 G1 X-0.01562 Y0.03125 G1 X0 Y0.07031 G1 X0.00781 Y0.01562 G1 X-0.00781 Y0.0625 G1 X0.03125 Y0.02344 G1 X0.08594 Y0.02344 G1 X0.03125 Y0.02344 G1 X0.03125 Y0.01562 G1 X-0.03125 Y0.03906 G1 X0 Y0.00781 G1 Z0.1 G0 X0.39844 Y-0.22656 G1 Z-0.1 G1 X-0.00781 Y0 G1 X-0.05469 Y-0.02344 G1 X-0.03125 Y0 G1 X-0.02344 Y-0.00781 G1 X-0.02344 Y0 G1 X-0.03906 Y0.01562 G1 X-0.05469 Y0.05469 G1 X-0.09375 Y0.125 G1 X0 Y0.00781 G1 X0.03906 Y0.03125 G1 X0.03125 Y0.02344 G1 X0.0625 Y0 G1 X0.0625 Y-0.03906 G1 X0.08594 Y-0.0625 G1 X0.03125 Y-0.01562 G1 X0.00781 Y0 G1 Z0.1 G0 X0.03125 Y-0.39844 G1 Z-0.1 G1 X0 Y0.00781 G1 X0.02344 Y0.0625 G1 X0 Y0.10156 G1 X-0.03125 Y0.07812 G1 X-0.01562 Y0.03125 G1 X0 Y0.08594 G1 X-0.00781 Y0.03125 G1 X0.03906 Y0.0625 G1 X0.01562 Y0.04688 G1 X-0.02344 Y0.09375 G1 X0 Y0.01562 G1 X-0.00781 Y0 G1 Z0.1 G0 X0.36719 Y0.03125 G1 Z-0.1 G1 X-0.00781 Y0 G1 X-0.10156 Y0.0625 G1 X-0.03125 Y0.00781 G1 X-0.04688 Y0 G1 X-0.00781 Y0 G1 Z0.1 G0 X0.17188 Y0.22656 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.07031 Y-0.01562 G1 X0.04688 Y-0.03125 G1 X0.02344 Y-0.01562 G1 X0 Y-0.01562 G1 X-0.03125 Y-0.07812 G1 X-0.09375 Y-0.13281 G1 X-0.00781 Y-0.03125 G1 X-0.03125 Y-0.00781 G1 X-0.13281 Y0 G1 X-0.02344 Y0.01562 G1 X-0.01562 Y0.03125 G1 X0.01562 Y0.05469 G1 X-0.00781 Y0.07031 G1 X0.00781 Y0.01562 G1 X0.01562 Y0.00781 G1 X0.04688 Y0.00781 G1 X0.02344 Y0.03125 G1 X0.03906 Y0.07031 G1 X0.00781 Y0.01562 G1 X0.03125 Y0 G1 X0.00781 Y0 G1 X0 Y0.00781 G1 Z0.1 G0 X-1.10156 Y0.25 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.0625 Y-0.01562 G1 X0.03125 Y-0.02344 G1 X0.09375 Y-0.07031 G1 X0.03906 Y-0.03125 G1 X-0.04688 Y-0.0625 G1 X-0.07812 Y-0.07031 G1 X-0.05469 Y-0.03906 G1 X-0.03125 Y-0.00781 G1 X-0.01562 Y0.00781 G1 X-0.01562 Y0.00781 G1 X-0.0625 Y0.08594 G1 X-0.02344 Y0.04688 G1 X-0.01562 Y0.03125 G1 X0.01562 Y0.07031 G1 X0.02344 Y0.02344 G1 X0.02344 Y0.02344 G1 X0.01562 Y0.01562 G1 X0.02344 Y0 G1 X0.00781 Y0 G1 X0 Y0.00781 G1 Z0.1 G0 X-0.13281 Y0.02344 G1 Z-0.1 G1 X0.00781 Y0 G1 X3.88281 Y0 G1 X0.00781 Y0 G1 X0 Y-3.09375 G1 X-0.03125 Y-0.00781 G1 X-3.85938 Y0 G1 X-0.00781 Y0 G1 X0 Y3.09375 G1 X0 Y0.00781 G1 Z0.1 G0 X0.39844 Y-1.67188 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.07812 Y0.08594 G1 X0.02344 Y0.04688 G1 X-0.01562 Y0.04688 G1 X-0.03125 Y0.02344 G1 X-0.03125 Y0.01562 G1 X-0.02344 Y0.00781 G1 X-0.02344 Y0 G1 X-0.00781 Y0 G1 Z0.1 G0 X0.28125 Y-0.19531 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.02344 Y0.02344 G1 X0.01562 Y0.01562 G1 X0.01562 Y0.02344 G1 X0 Y0.03125 G1 X0.00781 Y0.00781 G1 X-0.00781 Y0.03906 G1 X-0.03906 Y0.03125 G1 X-0.03125 Y0.01562 G1 X-0.00781 Y0 G1 Z0.1 G0 X0.17188 Y-0.39844 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.03906 Y0.01562 G1 X0.00781 Y0.01562 G1 X0.00781 Y0.03125 G1 X0 Y0.00781 G1 X-0.03906 Y0.04688 G1 X-0.00781 Y0 G1 Z0.1 G0 X0.04688 Y-0.24219 G1 Z-0.1 G1 X-0.00781 Y0 G1 X-0.03125 Y0 G1 X-0.00781 Y0 G1 Z0.1 G0 X-0.17188 Y-0.02344 G1 Z-0.1 G1 X-0.00781 Y0 G1 X-0.26562 Y0 G1 X-0.00781 Y0 G1 Z0.1 G0 X0.17188 Y-0.15625 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.0625 Y-0.00781 G1 X0.04688 Y0.00781 G1 X0.03125 Y0.03906 G1 X0.01562 Y0.01562 G1 X0 Y0.00781 G1 Z0.1 G0 X0.08594 Y-0.17969 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.07812 Y-0.03906 G1 X0.01562 Y0 G1 X0.03125 Y0.02344 G1 X0.10156 Y0.08594 G1 X0.03906 Y0.04688 G1 X0.03125 Y0.05469 G1 X0 Y0.00781 G1 X0 Y0.00781 G1 Z0.1 G0 X0.11719 Y-0.3125 G1 Z-0.1 G1 X0.00781 Y0 G1 X0.04688 Y0.02344 G1 X0.00781 Y0.00781 G1 X0.04688 Y0.01562 G1 X0.04688 Y0 G1 X0.0625 Y-0.03906 G1 X0.05469 Y-0.05469 G1 X0 Y-0.00781 G1 Z0.1 G0 X-0.28125 Y0 G1 Z-0.1 G1 X0 Y0.00781 G1 X0.00781 Y0.125 G1 X0.02344 Y0.04688 G1 X0.03906 Y0.03906 G1 X0.04688 Y0.02344 G1 X0.14844 Y0.02344 G1 X0.01562 Y0.00781 G1 X0.00781 Y0 G1 X0 Y0.25781 G1 X0.02344 Y0.0625 G1 X0.0625 Y0.08594 G1 X0.01562 Y0.04688 G1 X0 Y0.08594 G1 X0 Y0.00781 G1 Z0.1 G0 X0.19531 Y-0.82031 G1 Z-0.1 G1 X0 Y-0.00781 G1 X0 Y-0.17969 G1 X-0.03125 Y-0.00781 G1 X-0.25 Y0 G1 X-0.00781 Y0 G1 X-0.00781 Y0.02344 G1 X0 Y0.16406 G1 X0 Y0.00781 G1 Z0.1 G0 X-0.60156 Y-0.09375 G1 Z-0.1 G1 X0 Y0.00781 G1 X0 Y0.21875 G1 X0 Y0.00781 G1 Z0.1 G0 X-0.92714 Y-0.8233 M5 M2 visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/test.png000066400000000000000000000254041147500217100240470ustar00rootroot00000000000000‰PNG  IHDRâáü×*ËIDATxœíOÈ%U–à#‡Z(Ì"…^´2¥Ì¢f@¡º„Q\t&Ý ]™Ò­Õ£iA™:‹®²UV/FÓ‚2­éÒ†iÔ•.zÈœE¡ YÝ` Tբт´æb@ __ëjddü¹qâÆýsÎßÌ÷âÅ‹ˆï{ñÎ/Î=÷Þ8urrÒÀ±ùgµêƒ 2€@‡  CÐ!ètÈ_I¸­ï|vkÿø…[>M¸e¸ë§oŸ~ðй„?µsn¢¡–@ ÑŒ0Ë~1ÄË@¢!(` Ù£„Hl5AJ°Õ=qJØ,ƒh ôà€Ñè‰ðA…ÞDûuÐ*ûM·‘m2HÇñ@V¶ú`ƒ ˆàYI’Ä!•Ar €!ÉM°iƒ5G 〬È} ’Q +ˆ<ÌMµe@Π”ÕÙâì÷¯Ô>PÇåçÏ”ßiÖ6"·qÉ´u4vñŽ €U”P—eh„P G) cØÊ¡âÆ!dp¨O ‚Æeà4€ šãuØqú8Ÿ"˜&í ,ãh33 !€TX&BÓT–AŽ´Ãú'P‘ µa€Úg€À.á§§AÂM5ÚG £€¨žµ”Aif€J¢13À…Q'LPEÍD4p×7¯»?øÑéÜGR—WõyWà§¾ªhrU|ã÷?vÿþäïnO²µ{þ×E÷ïÏÿàB’­™æú¿}Äý{úoßV¸µ„øPfî¢SK×R=&èYUÂýÝÙð W»Ë’[EþÇYý½†$T‚¡ígï€B%4ÖµÔGíÜH¬Pe¸’+Ôo&*p¿b÷al5Áì’*lúãTš×ª ºí¿šÓÀ¬ Â/µJ”ÜÑV¬ ˜­, A«ip0þ>Ó\a+.V6lüw”ÄúƒøÀEçºü…¸äÝOMØ5AÊœ=Tä¬ú@åâ¢Üu È&4®\í.g­(?ozšÏ òá|ÐpU¹âºÛµÂª²~*d:M0 ý«5ƒp¬¯b‚ð/ž¼z|@~e.ö{ª·ÕT?€%4_äÍ tj gèo÷ïj~½»%¥=¿]oÚ…ôÐvr¶(—(7ÁˆÞ…û2ÁÓ‚¤`B2°eO-Ì¢ÍG š€–¢­”†aq(ñ&€Üd—AdÝ~uè4Á‘¯ŽSMSQÓ½«›Dí'Rr4ù‚Õ}9ÁÑPeÀye/-(|Þ›óAV9-ÓàËŠf-•Såu>õ7]CòÙOW§Žð¡ŸœÀ:î ¯[fÜù;ý·ok¨ß2úlÆš‰Š5 Í2Ì$)Bù4Âide¶` ¡_ià{Áåðº ÍŸEF$¿´Ñðw´r«ƒ|&8rQÉÒñ¦³}uå´[“À%ù ,€Ì nB0Âù@¹È rP¾‘𜯲šµ>¨LôD°% È@çQâƒòÎpÈj‚æ™L°:ÅêePÂKþ—\Îu•°Tº(|}©3ˆÐ^@ÖüGìKÊK¯&ߣ ô2 A4Œ*ðß‚Q»kÜW#á¦äxh()˜ýk䨅 ôÊÀıʵá=¦bT]ÊK4Äë$üFTùríI²ŠÄD¨)€Òf">…¶ª£¶üÐJe%A bgZp–PˆÂZ…NÀ.4Œ8Ø2€ìèGoo"Ï­ý‹Õu>ý“» É,¯þý³ËŸú½òíôüÿ¿kvù¥þA¦=R:†ê(™ï¨aTgÈWKÎ’ üKW£qX2A·, Ð w?.‘ ZrÊû@ësø LP:8ÈöÐŽ j5AÒHCϲҎ º²>”ˆ³–‘gI^C¦t pTË@ØMÈ­Ö¯YØKá>ðÒ\¬_ ÷—€ò*Ú»–Ê»º5½ Ü¿%;›6pù¿¥ãUqÍ :3ØJ•ü š’A×¢êÞ=š#¤PjÈùhM>H¥ã¬0â¬<” Â4(ƒlD{Ùsÿ+ó¡ðêÓ‹÷À©UOÞÉåçÏ,Å}·¼Ø=( í2XÒÀèÕY+ðA óˆÞcØá7ÆíÀÌX— ÕÍDaHÈÚ^Þæž=Æ…u§ ­I¤ÑžqÚXj2æejWFÈrCéZÅ¥ôGZBuf C5ƒ!4û(‡gÐd«$÷A™»î”Ï(“FdèV”‰¾õI$C®<ü¼;xî¶¼Û‡¨!ç@µ \ˆ—ÔË›ÀS±õIgÐדd×À>qVÊK¨–AW/ÐJLJådƒ à š)+o#‚$ÐÔ“dÈR '-pœyç…Ú‡ª¡'Ò,Ú ÈòÒñVž¥_)´…RÈGZù5“(áü3¯ Ÿ^zù‰ýÛTÈ0¢OˆK¨lB© ¶²zç‘ Ze”¸§ÎÍ”Ž‡øÆ"‰âš•že.ŠÚ0ô,-È N­&ÇAaý€g`èÙd»Ð™TäÞoÊP¯=Wbj©7Ÿ½ó¿½[ëHä ƒE’4_:ÿ‚ie62A¿$ŸFè⃊ŒLÐ/Q®„Fd°¿€ìBÿÊû+ ÙóõïÝo…© †/åðÁ¬ ú—Žà…eƒ© †/iöR ƒûjÏ¢T½K}*à•ÐpZà£^%´ÔFäkéÑo˜`DÊ» üÉýÃïüõ‡£âƒh2Yä¶î´ðÉW¯çØ~>”Ê`Há‘>E z|@vú L¦ä ç…/Å0µTá¶_ÍXAsrÀ䃲?êµ”lEó=Μ^d Pg…^ šA{‘·Ãû PT€Âè÷2˜aX<Í. ÜÈà 49ê†ÐX›0P@>æZx…KWî-s$P—ÜýbÛ3œóÁ¹ÚÇC4'ªe°ªÕÕ¢=AŸ¢ƒfÂ~±³[8,ªe°ç ò†)ÖÇU Üšû…CÏ,Ò¸ º/ó”ú!9jçÈk_žˆ¡Õ–"JÇKúáÈEMF‡„øÚЙtÊ»–&ÝŠôø] 8øCiÓ&8j#¬!´gÎá>+ŒÀ[âòƒff¯³^:‚¶¢]]T~àß²¤aIyš´W?€¶ù|Òº?¨}0à“¯^W;Ð@u3ÑNÂá>®ÉèÈXi#"-ðmúRZŠvÒ² :|p$”û@ù 4í$\u ‹‘+iA÷Û;ÎçH–ndïöuí¹+ª&.ís‚ÞÜFí4å&èŽ ƒ.Ö¹&̲úg×TÕ0u´Ö¡)>?Уýðh—Áõ3gW×9}åòê:q%周7yä)qZ.€éë~^çwî㶿·+à”ð΋‹·#ö<ü\⛎n€ìQ{›³NyÍ@bùj]T Á  ÿî¥= µõlìÑ&ðü6Öëâ€mD›Hn‚n-Ök6ãÔÉÉI¦M¯ÞÈ>€¿ï±<Êw²üÀ1p¡"³Æ÷…Þ”X4A-{x&?Èí‰ÙüôÌæ9LÐ3›(7A§¿™(””!}Ü÷V(“.ø¸ï•€¦ø¸ï•Õ=>î÷JЯÏ3•ü GfЉ“Ò€ƒÐHf°Õ]¢QÊvY½K 8ª È!~+•æ"¾ÿ ,€# =3ð>Xj/Jb JyÀáÑ.OîÀÁQÝLT’ƒ·ÀÁA7p>(Áù%@« ƒ1¤p@Á øŽ†ry”—”÷ èHÂþ‘  2ƒEȸ+.JZ„ ¤ ¬CаÉA3 ø` |ÐÈ@ >€†AÀ³4]K·¡dâkzõAEfC¿[Èii2ƒ˜·Ž A¿IA$á.§%@ 4™ÄC~‡e)9ÀvA»˜õ’€#@cQcØ. Ÿ}rÜ sùÇ‘øìonº™Úåß‘ÞN'<‹QK<{ëxÉKŸÆlçÍŽï[wî[ÙïoZ€‹Œ/Š/¼.üõ#£%ïþîÛ‘ÇTs•ä;þáâhÉGÿêBä¦þüúMÛù‹Ó‘ÇTƒS'''™6½'a”œLSÜxû%Œ4pÓvÄJÈÇ쟱ü—mjÏVLMÐcZ Sx¶ú`j‚JXúš[ñÁÔž­>ià¦MQ‚Õf¢€ ¶mgÙ«¯‡%„_š0i–L~iJÀj±ôgY2Aø¥™•—M°úª¬Ê L*U@'÷B¬šÀ¨*VýЫ&°¥ ý•äÕp¿É `R%c=É@˜ƒ÷,’\ø›HLÊ@‚DzmMŠ¡690ÝXžfeÕ9Hrж»–ˆîcª‡ÀÉ¿ÔÞå˜éEÐÙ¡ÈãÎÆ¥9‹F«•:"ØÆ¡3 =G—\RqÙzžÇšh£z<öâk£%o<÷DÄv†è¿ûgç¢,7[ƒ»¶²ÁÅ_Þ5ZrákDlgè€þñå§õ~p# ÏMÈ6ù Ôò¼P¦€<ÕÀMJdv}0ÕÀMJd:}q™¯GS Ù¤„@6`ÅV›‰ÂíBòV£p»P­V£Vû…Û…h5 · )l5êMàâ»0Äë1ABÂíBVZL6¥ªHp>(Ÿô™+„Ó¿‚$9h5Ö‡Ó¿‚$9Pëà M0z`‚pZàW$Vbý*&e …åâa‘Ì25pÂÐßXdµ™h•’ÙC*† Á1MÐjö %Ù&h’fe „Ó€ª¦¡Š8 „J|Ða‚æhV’Eòb@VLA ôøZ¢ÙšÁýg>‹pÀû m1yµBpýñû–Þ{úõ÷‰N¼ìv9͇÷ÎΦן™/Ìž~9¦ó¾~.?}nµ†¬¿`ÐÍ „Q>GÙ aŠNœ&¬ IO¡ÕGÝŽ˜®tv2€9|ÐÉšŒÊ+AÏžչ(È5`(-èÚ“A—Í9R„YäÝ„ª÷.ÍêƒÈç…)‚д0A8-Ø” Ø2A×XÍ`HòúggÁ× –š‰†¨èådªÌ,f 9êžÕˆŸ©„0­b „»0§Oƒ™'툳ž¸®G« ³§C&èÈÖÈ”t‚ˆÜ&p0j‚®atË>Ø?-샭íEv5г³QóìÌÂ臬hH0­OË2è²å]†Á¨zðA˜Ü>@ aò™  x—An¸Oò|&«:R„e2™  xš¨®Þü?+ îçþ5ÁtñàøEàÕwÿëÝÅŽ¤'Ÿ ¢ß«d ”Uøuð(!¬á:%•µNÐæeðƒÛ?îûãÛ÷lêµù³þñÿ÷ë{6µ‰ ú5Kúà¶_ݘsû“¯Æ£~í_í?ñ7Oí:&MÜíFß«÷Æ7!¾ú?nt2~êm“*"7Á‡gëßyåè=>øößýÊ»ÑÛ©‚a 50\¡„¡ú%u} ¡†K¶*a¨áëJj`¸d«†.Q®IZ ‡¡ †.‰PÂÐýSCJ°Z@žš@òÒ,SôË—^:SH^š25ä%ýLM yiÊÔ’—ÌQÆ’©‡¦&¼4ËÈ«ËbUaä> ܯ²)ÜïÁ¨6…û=àƒýlªÈ}ŽøV|`R[¯ý÷PÅò2€†²ÐFcý~„¶0ë#jÂÕ[–¶^û/a%Ö¯bR$ÂМH¢¼x$>pëøÿ´ºŠaB† ÈÍ£!Ök#ò¸ìÁV%¹X‘Çeš+ÉòüÀ­éMàþ­2ø@ˆËöt.²E³™$aOÿÑl™ Û×4Í&ØŠ‰üà8&è–¤ƒ)G*bÂI0ÑÁÔ¤ v.ÛÂH…¹«þ´tÕ/§˜ôLÊ`¹-ˆõ«¬¶¥jJ2j‹Õ–¢TMI­Ú¢–V›€RµY±…Õ² ÷Ký…¶æ ÎKÝŠêªbõ»Q¬òæÂýR%y“ \¸_ê`jÔî—*É›LàÂýRS&¸þÌáN¿<s´Zõdî—:˜n2 ÷Ký…¬˜ 3¸ ?ûq-HÓ ï–(7pT¸ ?ŠûÓ%\ПÆ}Ó&ð¸ ?ŠûÓ%\ПÆý6Là×YZ­b~0ŠûÓ%\ПÆ}C&èìf=©êªÚ‹ä߇ÂWRoZå°-B¬R±¿éÑZ„f1œ@c4PO¶ 2EhƒÖ6Èö²TC lÖŸõHÒ‚6Ôb¾€Ü*>ÊZNѨÂGùp%h¨fñ•OéÐÝî½€h&d°G~Ztc€L ƒx–LðöCE§5Ø2ˆ„œZÄ0iXl@{ ƒm`hd°L{xìÅ×jÀ"Ëàþ3ŸM^½rKĦ0Á*×_9Uûô‚ @9Ë ˜Ú¦e̦` ³iÁé§OʉB–Ò‚7ž{¢ð‘,Ѳ fÙÚF„ `'˜LЬ ’¤˜@iÁ˜¬Ð¬ fÙ”(4÷€L´9…õþ´@¡ Š”4Õµ4Õã!&¥Õqb覯F"kZpí­[“l§0µLà4 7Á(-ÈÍõgîØóö´W0yW­9$ÜZuš’Á,qÓÒyâr‚-B Q˜†5A-¶&ÅZ„N¿ü‘°ÇÑçç…¯}0»,ÑŽ ’§[‡Š‘/-˜àÞG?Ý¿ý|”O V‚wÿ¬r;ÆÐ;S„„Dø Ð"ԌڑÁ,{Ò‚=Œ’=¹Âè:K[Z€ ä¬&Œ’ƒ¬¹‚󘣑rŽjÁüŽþû«£%Wÿè©Ù5õ`Ä~dJ 0I»ÐjNP¸ûó7ÿ·×Ô´(ÎKqß-Øb烥¸ß@=¹åÌ VZØ5Aa$ AõÖ¡Y6¥ !?b;3(–@¼‘ÙÖ´@^"ÖiÉmËö¤£ˆïƒ{’„ :ò!!áü`ºrxkáü`´¦øëc83›`ZyÇÅo^L»Á’T¹¥¥NHHÛ@$é9ª6!˜R%E·IÒa”·•+–-z\øÑ…ºG’œLiZ¬¦;M1vÌŠ†”ïh´µB¦=´)ƒ„·3K‚u”O Ôš@†‚)åS„*>°‚íšf¦BJLðêßßÈ‚Ÿú½½ß3™6AÉ ˆöhàìz¯|ù??âp"UF/%ß] ~A ~`Ž3 ˆL˜`úT˜@Â΄`h‚éÓò S„!™ÒòƒY”AuLŠ7‘<-Àv¶ UýK”éYäÁSÁÑÑ“˜6ALWâÈWKÀ#Az”´ Ù_6€2¤ÒÀÎ ÁùÏ>Ηn)tŸ5]Hëë RØPzeÁ%:»“ú<À7 ‘—ô•y¢PÀ>(98zZ“A\W¢·z)ùPU±U§Ÿ>©2ò±µ±¨dN€ª@3¨Àzõ8wW¢ºucZ‡$X¯!–AîñÜÜ&Lt¿Râ~mý…Ú6Á´†|Ø^F†eÐÝì÷xç.‡ÑŒp¡ýwŽ0ùÀœF>H®‡‘*ê¡mx†Ñ§ F¡ß §NNÒO'à9ûý+Ñï½üü™„G’ùÍmä\ü>÷ïé×ßß¹€´ÁÐc;3€L`‚£ ` &8 Èn“ÖÆÀ0Áç¿ûE½ðÒ÷ö– u‚ à 0A7úšô2€Ï9š Vƒ~Ï0ôûw5éd-› .èÖiÕÈ ¾uc2Ÿ;Í5˜#‚{ºÇúÇ?ïÞ¨x$Pý‡(1Á0voжiƒ~øíMúdahÿT‰†&ðOñÁ1a‚n!Ú úá-·çó2¸øä—3Eÿ8Á,¡×Μ÷î½riÿÖÚãþ<ë\ýÊå›:ûÖÜåGõNïàû¾¸ úÃïg™ràâïùÞ)t7MHBÿþpüá}_LZ|çûÒyh>0ÚïÈöt½ z¢•Ðk gÖ’é(Fi'”œŽb”x$ÉA¯ž=>èMÐcK ½ zÒ*¡7AOB%LÓ‚Nkf0"SlíMà‘û ›ÄýéñòáAgS¤eª!JZ„„D7Mõ dj[LM–© Ò¢$î qÁ´ÿɱý‘ f—èjIcòF­ê–Zf3ƒ!Âä6D³ê+´&ƒ¸tAž\ý£§úv¡áãž­mD…å´ : Œ’=¹ÂèòßJKòã|ð×øŸ´› c¾€\…¥i«{è‰þSè>&Œ(&€MÍA«ôõäý8¼û»oOç$Û@³" '€6Húó1Šþîq1 ƒ4D›Àw%ÒÓX ýª@{‰nj@ÉmÎpX¤zè·^:ö ƒ]Ä™@›p¢zèц :d°‡¨Òýh ý#$&Ø4e…/Œú%¹+È ’UŒâ¾ àpœÿþNØ—žW4ü[yô’)'(Ö}hDkã ⦣Ø:Ñ& Ÿ: X4Áþ™ˆ@CLŸV¤€ î|ÿ¥áOôv6™ÀDS™ÁfV;ÍvªÞ(A&\~ô‚鹉~ÿ\Ö¹‰.¼óDÞ¹‰Ô„þì ÷²÷w~ÿµ‡ÿî‰éãÜ–KFã÷L\ê’ƒÑ8äÙtÁô`aZ0ë·pôö„ª0d‚Y2M\Ús‰K÷§¡ß½eÓDuÑVFÑß=.æÃ2辌þN Iæ¯7ÉËÅ£ VM°܉þ=¦£ÿ¥ç/´‘¤ºê÷ÛqJXÝ |RUíB#lËÀ“ÄaLÌ3 `ê Õ´ Sƒ|û›¦×žBùpZAn"L0LªW 0Œ&º-™ ·ä»Ñ¨]¨dÍÀöÍm `='è–e€ @ ³2hÀ³oVüƒb&èÈ Â`€Ü(X0A¾6Ÿ’èimœABúŽC˜ 0Ò§&˜]GmmÌcº ©€~Ô6U¹s]Á§†M µ D M`(9@7Ñ@‘ i(§zZpÀœÀƒ nÐŒ h ýèL r˜ÀJr@o¢/ÀÕ©›Té8¤2ƒÏÁ%ÑV7Þßq(Œ‰ä€Ì …ŽCŠÆ`m D‡-Œ8zfÐŒ €~j¥ÅL ?98nfÐLÓ‡"0ª´€œ`ÈAe€ F¨úŠBIªwå¬u åM |*Ó#ÊŒÀGF2Â}Mj3’Ð\žÃÕ b9˜ÊœJδ܇Âh®K™ ¥0Aá´€"A€É YHGP4+hH ”˜@mrp´×…4• 4Ôᘔ<÷”˜@3íË YHG¤Í Üw%@>ª×µ™@grÐxo¢&‹™FãƒãP²Ñ¦z‡„´œ4i‚” À e®<êv £09h63hÕröûW†O/?fvµ{>{løôç·¼1»Ú7øpøô'ïݹïèÆöʧ|æo^H{ [©˜h~"?pÓùsû{óç§?ìò®j33À°Êè›<»¤›˜`vI71Áì’=vh‚éS%H Ê›`vI71ÁpIø0Êg Ê ½.¤LafCÿtáìÕzŽKøZucmåb+Xm&ê¯ýgɤ‹§>›]~áä–»ë*ÍJýÈ™ÿ.½ýÛÿ¹‹»¥d?@Ú$`Êì%§ZÊ7 É/¢s›`ëù3;[Q-ìÉ ¬~´>XÒÀèÕ„Vj aZ°ä€Ñ GPÂ1©Þí'=hcÍDl]s•° r Oʧ«ÎP9m˜@ϱ“rÊk#„xh=M1šA+ØïrÁ ›Êù*ÉY1&ƒÆz‹.!/ §* S††ÑÓ.¯{½‰œV‹Ãiá®÷%EiÓåW‹ÃiG8H*h£Uö‡Ž3öËÄBìÉ «‘Tiÿ)?šŒ@1È ûíÌY‡¸£21Ô ôS+dkÖú©ª8 îüQ2ÚÀX3,±g&"æ¬db:-ÝÒDu#’OT7Bx:5q¿$ÓiéÂÕõ0Q€:†ÑÉ.ô£n,1 ýÕg-…îæè/4ALÖ £$€¢Ù=&eðÙ™ûÃ+Üråjò¾÷oBžþwúœîüOg¦Jré¡ôgØ©·B…ГGÓ»ëçBŸæé7Ó”¥E~yŽª¥Ò«_NW"9öd°j¿NB„50\'¡VMà×I胰†ë$TBØý (A?’~¥É•°Ú %È1V3˜`ëš ‘˜`ëš Y5AÄšpäÝ15tÜÔ1”G’Ä­¬ IZ°„Åé¯a2d°Æ¦2@Ž22@ŒÉ@^ÎÑ¡¨ò²pªrŽnB«ÈË•Se ›¼,LY‚1t²(ŸÖîz_rÉŸ6-Dù´]K%>pë¤Õ†$ÊcH|àÖI« I”ÇBìu-í*]õ—oÊ1Œ Œòü”£ý Éw 9¨rþTÙi“ØË VM \GŽðŽƒioL(ÙZ•=&Ü©ÓÀª :-@åÏáÖLÜ1TÆd òi}Pùé›êDWþ…ÁÊQ~þ(?<%“Ay6Fœs`d° ŽpAJìšÃ8@© –Ú[äÝ„’w(*‰ü«UþK˜pònBt(j†„çæ¯‰Eôv-u>˜ý}”ׇӚÀF¸ül[Ýiù=æØ©‹òáâ0°B­¯Iá=6Œ^tË>è~îg}/!X:׳žmKçz¾–ÿ5 ÷-Qþü©òÅlÕ2è‚>(Æ«‘¾<õú¢º^{åÆÕÉOWk¥üÁ/ïêûkÔ: rí»÷ù÷~ïýºG cÍ U§¿&TÄi 7A7°Âˆ¡ ¦O‹14Áô)”Çi 7A7°‚B”G¤¸°‡%ŒÈíƒûŸùÅhÉlèŸ.äæõuúàüw_Í}$#lÈÀƒ@'åã~r0DEÊÇýY´× Fª„ðñm?øü¿gî]zéöO¾vßø«ø·ÿ‹éK×üƒŸüiÊV™0À•ÿyÛ™÷I±ÝµÆã_f!w^Z|éõ”eŒ+_ÿ2Œþáø&}ýKg~VîVh׿çôë?/¶»´äÍ ªLRØ_˜`÷:rz$YMB•!ËêÂÕÜ0AŠÕÀR3QOóÑAåSù aˆÏAóŸ¸yÒ…øà Ùe)ÇwÑáϸv”›´£Û‡¥Df¯ÍT!mÙGÒ²¤¢P3>PŽòø~œ^VÑßKÖíR®f€äÈ» %ïP´JBmâH:mâÓR´kéê¬RÑ8Xªc‹M”îMä¾Þ™¾áÎí¥UpAÿãÿwïè'k;Òì)QÅqƒ rÏDtõ廳n?1³A?g;ÒlЯb‚¸A—¾§"pÕéZšï{NDPByCÌNK7]xçû/MW›])oˆjã ð˜`:MéìÄ¥§)2 ýK³–ŽB?&ÈÇtšÒÙ‰K5$5§£ÈWB8Ô¬›À´ÕCtú` P á´ÕÕ}Py2ù€êOG‘¯¤ÌÄ×BêËÀCŠP-2èð@=ɠÕÐ%ƒÔ@ :JÊÅÑ()@1NœœìÝÆ“w„^ýñG{¶Mà+仄=õÃëWO¾u:Á.vÉ ¬±VÀ`ˆ´Jk`ÈN%ÄÊ`“zð€$>k`H´¢dg‚”­³Óq&ðÄù`» všÀƒ u¢}°Ç=[•°±7Q쀹H m’˜ ‚-2Hh‚›Â`‚ˆ–Œ„&غ©zã ð@N6ù@,ƒ Dû|€ %j5yôŽ@–€  2™@¾Y™ j×à€ýÔÎ Rh,!LjË ø`‚Ag¹ÛˆöÍd7‚Qi ùEjîÒ±dZ#™A)hÀ\,jMÁÏ : Ê ÃP‹!è+µ þà„%±¨lÖÒ¬5ä¤ä%°ä£â„Õ$ä£È@3ù| œËºvÍ( ¶ @2pý“·³ßOÕÌÇäDî± ’nL0 yr°iƒ[2Â7@N*6ml&J弓­^Ù^3ØÇ1ÀI’ƒˆÈM‰†† DC‹ÓI¬ ºí>@[Øêƒ=YÅx$J@±H”°¿qi· Fôn@èݶëQj€A˜› ètÈ:d2€@‡  Càø'.%qŸ5áÇUIEND®B`‚visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/top-cop.gbx.out000066400000000000000000000661001147500217100252510ustar00rootroot00000000000000package: visolate class: visolate.Main args: ../gerber/examples/top-cop.gbx graphics device: :0.0 pixel format 8:8:8 24-bit depth macro "OC8" polygon 1.0, 8.0, 0.0, 0.0, 1.08239*$1, 22.5 Aperture 14: macro name = OC8; modifiers: 0.06 Aperture 15: macro name = OC8; modifiers: 0.055 Aperture 16: macro name = OC8; modifiers: 0.063 Aperture 17: macro name = OC8; modifiers: 0.1005 computing inch coords... making nets... 102 nets making half edge loops... 70 loops Thu Aug 05 17:16:17 EDT 2004: TopologyProcessor started border: true line: false voronoi: false flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 Thu Aug 05 17:16:26 EDT 2004: TopologyProcessor finished (8679ms) 0 nets Thu Aug 05 17:16:31 EDT 2004: FatnessProcessor started border: true line: false voronoi: false flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 0 misses avg fatness = 0.06555855309847823 Thu Aug 05 17:16:36 EDT 2004: FatnessProcessor finished (5228ms) 0 nets Thu Aug 05 17:16:41 EDT 2004: FatnessProcessor started border: true line: false voronoi: true flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 0 misses avg fatness = 0.24495953125513292 Thu Aug 05 17:16:48 EDT 2004: FatnessProcessor finished (6822ms) model bounds: LLC: (0.028700000688433647, 0.03480000150203705); width = 3.900999933317304; height = 3.10099991953373 board bounds: LLC: (0.028700000688433647, 0.03480000150203705); width = 3.900999933317304; height = 3.10099991953373 102 nets (18, 125, 239): 1 siblings; 1 strokes; 0 pads bounds: LLC: (3.6591999740600585, 0.906600019454956); width = 0.07000012969970704; height = 0.0060 length: 0.1067001223564148; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (18, 125, 239): 1 siblings; 1 strokes; 0 pads bounds: LLC: (3.6591999740600585, 0.8853000016212463); width = 0.006000000000000227; height = 0.04869999265670777 length: 0.1067001223564148; area: 0.021512; fatness: 0.20161176505630035; areaDPI: 500; areaPixels: 5378 (129, 217, 36): 0 siblings; 8 strokes; 0 pads bounds: LLC: (3.680500051498413, 0.9497000188827515); width = 0.048700052261352766; height = 0.04869999265670777 length: 0.14584586303681135; area: 0.010008000000000001; fatness: 0.06862038998990319; areaDPI: 500; areaPixels: 2502 (35, 255, 93): 0 siblings; 6 strokes; 0 pads bounds: LLC: (3.680500051498413, 1.014199993133545); width = 0.07010002708435081; height = 0.048700052261352544 length: 0.17969379387795925; area: 0.04592; fatness: 0.25554583165619515; areaDPI: 500; areaPixels: 11480 (5, 182, 195): 10 siblings; 41 strokes; 18 pads bounds: LLC: (0.2041999876499176, 0.16030000448226928); width = 3.400000089406967; height = 2.850000107288361 length: 15.992328062653542; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (114, 138, 131): 3 siblings; 4 strokes; 2 pads bounds: LLC: (1.8512000532150268, 2.196300064086914); width = 0.7029998331069944; height = 0.6170000000000004 length: 1.3569070398807526; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (215, 85, 83): 0 siblings; 69 strokes; 0 pads bounds: LLC: (3.6541998863220213, 2.8603001117706297); width = 0.24990000724792516; height = 0.24999990463256827 length: 0.314080448821187; area: 0.08025600000000001; fatness: 0.2555268890541211; areaDPI: 500; areaPixels: 20064 (151, 225, 6): 2 siblings; 3 strokes; 2 pads bounds: LLC: (2.854199934005737, 2.210300016403198); width = 0.7500001430511474; height = 0.6030000476837163 length: 0.9609774947166443; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (7, 125, 251): 0 siblings; 6 strokes; 6 pads bounds: LLC: (1.2517000138759613, 2.160300064086914); width = 0.8525000631809235; height = 0.6530000000000005 length: 1.746630534529686; area: 0.437712; fatness: 0.2506036573543943; areaDPI: 500; areaPixels: 109428 (21, 255, 106): 0 siblings; 69 strokes; 0 pads bounds: LLC: (0.05419999659061432, 2.8603001117706297); width = 0.24990000724792483; height = 0.24999990463256827 length: 0.31408048002049327; area: 0.069832; fatness: 0.22233791796116578; areaDPI: 500; areaPixels: 17458 (74, 111, 197): 0 siblings; 69 strokes; 0 pads bounds: LLC: (0.05419999659061432, 0.060299995541572574); width = 0.24990000724792483; height = 0.2500000089406967 length: 0.31408048141747713; area: 0.068432; fatness: 0.21788046073783202; areaDPI: 500; areaPixels: 17108 (190, 50, 143): 0 siblings; 69 strokes; 0 pads bounds: LLC: (3.6541998863220213, 0.060299995541572574); width = 0.24990000724792516; height = 0.2500000089406967 length: 0.31408045068383217; area: 0.065944; fatness: 0.2099589447748923; areaDPI: 500; areaPixels: 16486 (127, 202, 53): 0 siblings; 2 strokes; 2 pads bounds: LLC: (0.3691999936103821, 2.0103000164031983); width = 0.4850000357627869; height = 0.30500000000000016 length: 0.49051252007484436; area: 0.124288; fatness: 0.25338395028333965; areaDPI: 500; areaPixels: 31072 (32, 234, 116): 0 siblings; 5 strokes; 2 pads bounds: LLC: (0.6239501014351845, 1.1752999448776245); width = 0.2302499279379845; height = 0.660249968469143 length: 0.6974097043275833; area: 0.13406800000000002; fatness: 0.19223707265338877; areaDPI: 500; areaPixels: 33517 (196, 56, 131): 0 siblings; 1 strokes; 2 pads bounds: LLC: (0.75420001745224, 1.0602999687194825); width = 0.05; height = 0.2500000476837158 length: 0.20000004768371582; area: 0.03318; fatness: 0.16589996044636715; areaDPI: 500; areaPixels: 8295 (51, 172, 160): 0 siblings; 4 strokes; 2 pads bounds: LLC: (0.43395010381937027, 1.1752999448776245); width = 0.1702499255537987; height = 0.660249968469143 length: 0.6200282424688339; area: 0.143524; fatness: 0.2314797781283557; areaDPI: 500; areaPixels: 35881 (60, 82, 240): 0 siblings; 4 strokes; 2 pads bounds: LLC: (1.383950151503086, 1.1752999448776245); width = 0.17024980634450926; height = 0.660249968469143 length: 0.620028093457222; area: 0.157928; fatness: 0.25471103917147914; areaDPI: 500; areaPixels: 39482 (5, 158, 219): 0 siblings; 3 strokes; 2 pads bounds: LLC: (1.5739500895142555, 1.1752999448776245); width = 0.18024991601705564; height = 0.660249968469143 length: 0.6577184498310089; area: 0.265672; fatness: 0.40392967548388; areaDPI: 500; areaPixels: 66418 (124, 239, 19): 0 siblings; 4 strokes; 2 pads bounds: LLC: (2.0991999816894533, 1.1752999448776245); width = 0.20500009536743136; height = 0.660249968469143 length: 0.6464216709136963; area: 0.22623200000000002; fatness: 0.3499758906291436; areaDPI: 500; areaPixels: 56558 (210, 47, 126): 0 siblings; 4 strokes; 2 pads bounds: LLC: (2.323950208723545, 1.1752999448776245); width = 0.2302498683333396; height = 0.660249968469143 length: 0.7155552208423615; area: 0.195612; fatness: 0.27337093532728735; areaDPI: 500; areaPixels: 48903 (184, 86, 112): 0 siblings; 4 strokes; 2 pads bounds: LLC: (3.2041998863220216, 1.1752999448776245); width = 0.18024991601705542; height = 0.660249968469143 length: 0.6330923698842525; area: 0.16410400000000003; fatness: 0.25921020029036673; areaDPI: 500; areaPixels: 41026 (74, 206, 102): 0 siblings; 4 strokes; 2 pads bounds: LLC: (3.4041999340057374, 1.1752999448776245); width = 0.1702499255537986; height = 0.660249968469143 length: 0.6534744538366795; area: 0.19157200000000002; fatness: 0.29315912638243535; areaDPI: 500; areaPixels: 47893 (84, 142, 157): 0 siblings; 6 strokes; 6 pads bounds: LLC: (3.001700133085251, 0.37529999256134033); width = 0.7074998009204867; height = 0.767000047683716 length: 1.7409217357635498; area: 0.345608; fatness: 0.1985201246559312; areaDPI: 500; areaPixels: 86402 (49, 204, 129): 0 siblings; 7 strokes; 7 pads bounds: LLC: (1.304200029373169, 0.37529999256134033); width = 2.055; height = 0.720000023841858 length: 2.645685762166977; area: 0.5555800000000001; fatness: 0.2099947045657253; areaDPI: 500; areaPixels: 138895 (141, 189, 52): 0 siblings; 2 strokes; 3 pads bounds: LLC: (1.019200029373169, 0.7053000044822693); width = 0.440000023841858; height = 0.39000001192092904 length: 0.47827015817165375; area: 0.13794; fatness: 0.28841439852179235; areaDPI: 500; areaPixels: 34485 (5, 182, 195): 10 siblings; 1 strokes; 1 pads bounds: LLC: (0.41920000553131104, 0.3102999985218048); width = 0.12000000000000005; height = 0.2550000178813935 length: 15.992328062653542; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (251, 95, 36): 0 siblings; 1 strokes; 2 pads bounds: LLC: (0.41920000553131104, 0.7053000044822693); width = 0.487499920129776; height = 0.4074999082088471 length: 0.5315072536468506; area: 0.113388; fatness: 0.21333293049531626; areaDPI: 500; areaPixels: 28347 (96, 222, 64): 0 siblings; 3 strokes; 2 pads bounds: LLC: (0.8517000377178192, 0.9578000605106354); width = 0.2874999916553498; height = 0.8074998843669892 length: 0.87360680103302; area: 0.15161600000000003; fatness: 0.17355176244131523; areaDPI: 500; areaPixels: 37904 (96, 132, 155): 0 siblings; 3 strokes; 2 pads bounds: LLC: (0.8517000377178192, 1.2078000009059906); width = 0.2874999916553498; height = 0.6574999678134918 length: 0.7009882628917694; area: 0.098776; fatness: 0.14090963462429718; areaDPI: 500; areaPixels: 24694 (216, 12, 155): 0 siblings; 2 strokes; 2 pads bounds: LLC: (1.019200029373169, 1.3078000247478485); width = 0.28749987244606023; height = 0.25749999165534976 length: 0.3561552166938782; area: 0.096464; fatness: 0.27084820179094143; areaDPI: 500; areaPixels: 24116 (223, 54, 105): 0 siblings; 4 strokes; 2 pads bounds: LLC: (2.601700037717819, 1.0578000247478485); width = 0.33749994397163396; height = 0.8074999439716339 length: 0.8828427344560623; area: 0.21058400000000002; fatness: 0.23852945919042443; areaDPI: 500; areaPixels: 52646 (149, 187, 47): 0 siblings; 3 strokes; 2 pads bounds: LLC: (2.819199981689453, 1.3078000247478485); width = 0.2375000393390656; height = 0.35750001549720767 length: 0.39142146706581116; area: 0.08707200000000001; fatness: 0.2224507527722292; areaDPI: 500; areaPixels: 21768 (120, 201, 61): 0 siblings; 2 strokes; 2 pads bounds: LLC: (2.819199981689453, 1.2078000009059906); width = 0.2375000393390656; height = 0.35750001549720767 length: 0.38027770817279816; area: 0.07079600000000001; fatness: 0.18616920865587608; areaDPI: 500; areaPixels: 17699 (158, 42, 183): 0 siblings; 3 strokes; 2 pads bounds: LLC: (0.3691999936103821, 2.460800064086914); width = 0.5090000357627869; height = 0.1544999046325688 length: 0.441421315073967; area: 0.113416; fatness: 0.25693367340223566; areaDPI: 500; areaPixels: 28354 (122, 223, 38): 0 siblings; 2 strokes; 2 pads bounds: LLC: (0.6517000496387482, 2.6608001117706297); width = 0.2264999797344207; height = 0.15199984860420246 length: 0.19142131507396698; area: 0.059120000000000006; fatness: 0.3088475281718522; areaDPI: 500; areaPixels: 14780 (132, 167, 84): 0 siblings; 2 strokes; 2 pads bounds: LLC: (1.0801999816894532, 2.6608001117706297); width = 0.22649992012977593; height = 0.15199984860420246 length: 0.1914213001728058; area: 0.05794; fatness: 0.3026831389594293; areaDPI: 500; areaPixels: 14485 (188, 185, 10): 0 siblings; 1 strokes; 2 pads bounds: LLC: (0.6517000496387482, 2.205300124362111); width = 0.10749989561736584; height = 0.20749974064528942 length: 0.1581137478351593; area: 0.054388; fatness: 0.3439802088348569; areaDPI: 500; areaPixels: 13597 (114, 138, 131): 3 siblings; 1 strokes; 1 pads bounds: LLC: (1.8512000532150268, 2.3963001117706297); width = 0.4109998331069946; height = 0.07799999999999985 length: 1.3569070398807526; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (233, 26, 123): 0 siblings; 4 strokes; 0 pads bounds: LLC: (0.028700000688433647, 0.03480000150203705); width = 3.900999933317304; height = 3.10099991953373 length: 13.999999523162842; area: 1.597156; fatness: 0.11408257531420078; areaDPI: 500; areaPixels: 399289 (246, 81, 56): 0 siblings; 0 strokes; 1 pads bounds: LLC: (1.0801999816894532, 2.5607999687194822); width = 0.098; height = 0.049 length: 0.0; area: 0.01548; fatness: 0.1579591836734694; areaDPI: 500; areaPixels: 3870 (157, 212, 13): 0 siblings; 0 strokes; 1 pads bounds: LLC: (0.7802000293731689, 2.5607999687194822); width = 0.098; height = 0.049 length: 0.0; area: 0.016472; fatness: 0.16808163265306122; areaDPI: 500; areaPixels: 4118 (171, 25, 187): 0 siblings; 0 strokes; 1 pads bounds: LLC: (0.7802000293731689, 2.760800016403198); width = 0.098; height = 0.049 length: 0.0; area: 0.018672; fatness: 0.19053061224489795; areaDPI: 500; areaPixels: 4668 (93, 137, 153): 0 siblings; 0 strokes; 1 pads bounds: LLC: (0.8517000377178192, 1.3078000247478485); width = 0.05499988794326782; height = 0.05499988794326782 length: 0.0; area: 0.007724; fatness: 0.14043664976131; areaDPI: 500; areaPixels: 1931 (145, 0, 237): 0 siblings; 0 strokes; 1 pads bounds: LLC: (1.2517000138759613, 1.0578000247478485); width = 0.05499988794326782; height = 0.05499988794326782 length: 0.0; area: 0.0265; fatness: 0.48181916347419923; areaDPI: 500; areaPixels: 6625 (92, 212, 79): 0 siblings; 0 strokes; 1 pads bounds: LLC: (1.2517000138759613, 1.2078000009059906); width = 0.05499988794326782; height = 0.05499988794326782 length: 0.0; area: 0.02454; fatness: 0.44618272723233393; areaDPI: 500; areaPixels: 6135 (60, 113, 210): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.601700037717819, 1.3078000247478485); width = 0.05499988794326782; height = 0.05499988794326782 length: 0.0; area: 0.016068000000000002; fatness: 0.2921460497623938; areaDPI: 500; areaPixels: 4017 (117, 137, 129): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.601700037717819, 1.2078000009059906); width = 0.05499988794326782; height = 0.05499988794326782 length: 0.0; area: 0.01682; fatness: 0.30581880489192576; areaDPI: 500; areaPixels: 4205 (3, 225, 155): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.601700037717819, 0.9578000605106354); width = 0.05499988794326782; height = 0.05499988794326782 length: 0.0; area: 0.033771999999999996; fatness: 0.6140376146736096; areaDPI: 500; areaPixels: 8443 (5, 182, 195): 10 siblings; 0 strokes; 1 pads bounds: LLC: (1.7477000206708908, 2.9038001745939255); width = 0.06299987435340881; height = 0.06299987435340881 length: 15.992328062653542; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (5, 182, 195): 10 siblings; 0 strokes; 1 pads bounds: LLC: (1.4977000206708908, 2.9038001745939255); width = 0.06299987435340881; height = 0.06299987435340881 length: 15.992328062653542; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (253, 18, 112): 0 siblings; 0 strokes; 1 pads bounds: LLC: (1.383950151503086, 1.92005006223917); width = 0.10049979388713837; height = 0.10049979388713837 length: 0.0; area: 0.030608; fatness: 0.3045578385401755; areaDPI: 500; areaPixels: 7652 (213, 28, 142): 0 siblings; 0 strokes; 1 pads bounds: LLC: (1.5739500895142555, 1.92005006223917); width = 0.10049979388713837; height = 0.10049979388713837 length: 0.0; area: 0.029824000000000003; fatness: 0.2967568275164073; areaDPI: 500; areaPixels: 7456 (15, 126, 242): 0 siblings; 0 strokes; 1 pads bounds: LLC: (1.383950151503086, 1.5500500574707985); width = 0.10049979388713837; height = 0.10049979388713837 length: 0.0; area: 0.040384; fatness: 0.4018316698773669; areaDPI: 500; areaPixels: 10096 (41, 199, 143): 0 siblings; 0 strokes; 1 pads bounds: LLC: (1.5739500895142555, 1.5500500574707985); width = 0.10049979388713837; height = 0.10049979388713837 length: 0.0; area: 0.013088; fatness: 0.13022912280494697; areaDPI: 500; areaPixels: 3272 (190, 183, 9): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.133950151503086, 1.5500500574707985); width = 0.10049979388713837; height = 0.10049979388713837 length: 0.0; area: 0.054292; fatness: 0.5402200133959489; areaDPI: 500; areaPixels: 13573 (233, 144, 5): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.323950208723545, 1.5500500574707985); width = 0.10049979388713837; height = 0.10049979388713837 length: 0.0; area: 0.017948000000000002; fatness: 0.17858743093697954; areaDPI: 500; areaPixels: 4487 (125, 113, 145): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.133950151503086, 1.92005006223917); width = 0.10049979388713837; height = 0.10049979388713837 length: 0.0; area: 0.030704000000000002; fatness: 0.30551306437982056; areaDPI: 500; areaPixels: 7676 (217, 7, 158): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.323950208723545, 1.92005006223917); width = 0.10049979388713837; height = 0.10049979388713837 length: 0.0; area: 0.03012; fatness: 0.29970210718864626; areaDPI: 500; areaPixels: 7530 (250, 97, 36): 0 siblings; 0 strokes; 1 pads bounds: LLC: (3.2839500084519386, 1.92005006223917); width = 0.10049979388713837; height = 0.10049979388713837 length: 0.0; area: 0.074636; fatness: 0.7426482892474038; areaDPI: 500; areaPixels: 18659 (219, 7, 157): 0 siblings; 0 strokes; 1 pads bounds: LLC: (3.4739500656723976, 1.92005006223917); width = 0.10049979388713837; height = 0.10049979388713837 length: 0.0; area: 0.070652; fatness: 0.7030064169021327; areaDPI: 500; areaPixels: 17663 (158, 44, 181): 0 siblings; 0 strokes; 1 pads bounds: LLC: (3.2839500084519386, 1.5500500574707985); width = 0.10049979388713837; height = 0.10049979388713837 length: 0.0; area: 0.01142; fatness: 0.11363207384111355; areaDPI: 500; areaPixels: 2855 (94, 144, 144): 0 siblings; 0 strokes; 1 pads bounds: LLC: (3.4739500656723976, 1.5500500574707985); width = 0.10049979388713837; height = 0.10049979388713837 length: 0.0; area: 0.04676400000000001; fatness: 0.4653143871371134; areaDPI: 500; areaPixels: 11691 (174, 32, 177): 0 siblings; 0 strokes; 1 pads bounds: LLC: (0.6239501014351845, 1.5500500574707985); width = 0.10049979388713837; height = 0.10049979388713837 length: 0.0; area: 0.01738; fatness: 0.17293567805241275; areaDPI: 500; areaPixels: 4345 (54, 103, 225): 0 siblings; 0 strokes; 1 pads bounds: LLC: (0.43395010381937027, 1.5500500574707985); width = 0.10049979388713837; height = 0.10049979388713837 length: 0.0; area: 0.024604; fatness: 0.24481642248570562; areaDPI: 500; areaPixels: 6151 (207, 130, 45): 0 siblings; 0 strokes; 1 pads bounds: LLC: (0.6239501014351845, 1.92005006223917); width = 0.10049979388713837; height = 0.10049979388713837 length: 0.0; area: 0.03232; fatness: 0.32159269934717954; areaDPI: 500; areaPixels: 8080 (80, 249, 53): 0 siblings; 0 strokes; 1 pads bounds: LLC: (0.43395010381937027, 1.92005006223917); width = 0.10049979388713837; height = 0.10049979388713837 length: 0.0; area: 0.038183999999999996; fatness: 0.3799410777188336; areaDPI: 500; areaPixels: 9546 (196, 23, 164): 0 siblings; 0 strokes; 1 pads bounds: LLC: (0.649199993610382, 0.9753000164031982); width = 0.06; height = 0.12 length: 0.0; area: 0.021708; fatness: 0.36180000000000007; areaDPI: 500; areaPixels: 5427 (98, 225, 59): 0 siblings; 0 strokes; 1 pads bounds: LLC: (0.449200005531311, 0.9753000164031982); width = 0.06; height = 0.12 length: 0.0; area: 0.04034; fatness: 0.6723333333333333; areaDPI: 500; areaPixels: 10085 (9, 125, 249): 0 siblings; 0 strokes; 1 pads bounds: LLC: (1.599199981689453, 0.9753000164031982); width = 0.06; height = 0.12 length: 0.0; area: 0.054228000000000005; fatness: 0.9038000000000002; areaDPI: 500; areaPixels: 13557 (203, 152, 27): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.049200029373169, 0.6753000044822692); width = 0.06; height = 0.12 length: 0.0; area: 0.014088000000000002; fatness: 0.23480000000000004; areaDPI: 500; areaPixels: 3522 (210, 163, 9): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.1491999340057375, 0.6753000044822692); width = 0.06; height = 0.12 length: 0.0; area: 0.029404; fatness: 0.49006666666666665; areaDPI: 500; areaPixels: 7351 (71, 233, 79): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.499200077056885, 0.6753000044822692); width = 0.06; height = 0.12 length: 0.0; area: 0.011352000000000001; fatness: 0.18920000000000003; areaDPI: 500; areaPixels: 2838 (77, 65, 240): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.3491999816894533, 0.9753000164031982); width = 0.06; height = 0.12 length: 0.0; area: 0.045744; fatness: 0.7624000000000001; areaDPI: 500; areaPixels: 11436 (101, 141, 141): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.0991999816894533, 0.9753000164031982); width = 0.06; height = 0.12 length: 0.0; area: 0.059508000000000005; fatness: 0.9918000000000001; areaDPI: 500; areaPixels: 14877 (127, 96, 160): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.049200029373169, 0.37529999256134033); width = 0.06; height = 0.12 length: 0.0; area: 0.01728; fatness: 0.28800000000000003; areaDPI: 500; areaPixels: 4320 (76, 120, 186): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.1491999340057375, 0.37529999256134033); width = 0.06; height = 0.12 length: 0.0; area: 0.03941600000000001; fatness: 0.6569333333333335; areaDPI: 500; areaPixels: 9854 (5, 182, 195): 10 siblings; 0 strokes; 1 pads bounds: LLC: (1.949200005531311, 0.37529999256134033); width = 0.06; height = 0.12 length: 15.992328062653542; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (5, 182, 195): 10 siblings; 0 strokes; 1 pads bounds: LLC: (2.3991999340057375, 0.37529999256134033); width = 0.06; height = 0.12 length: 15.992328062653542; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (126, 73, 184): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.499200077056885, 0.37529999256134033); width = 0.06; height = 0.12 length: 0.0; area: 0.014648; fatness: 0.24413333333333334; areaDPI: 500; areaPixels: 3662 (121, 249, 12): 0 siblings; 0 strokes; 1 pads bounds: LLC: (3.549200029373169, 0.6753000044822692); width = 0.06; height = 0.12 length: 0.0; area: 0.012144; fatness: 0.20240000000000002; areaDPI: 500; areaPixels: 3036 (127, 230, 26): 0 siblings; 0 strokes; 1 pads bounds: LLC: (3.549200029373169, 0.37529999256134033); width = 0.06; height = 0.12 length: 0.0; area: 0.015792; fatness: 0.26320000000000005; areaDPI: 500; areaPixels: 3948 (5, 182, 195): 10 siblings; 0 strokes; 1 pads bounds: LLC: (3.4491998863220217, 0.37529999256134033); width = 0.06; height = 0.12 length: 15.992328062653542; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (151, 225, 6): 2 siblings; 0 strokes; 1 pads bounds: LLC: (3.4989500579833983, 2.1848000164031984); width = 0.1005; height = 0.201 length: 0.9609774947166443; area: 0.475216; fatness: 0.4945131416840549; areaDPI: 500; areaPixels: 118804 (151, 225, 6): 2 siblings; 0 strokes; 1 pads bounds: LLC: (3.198950105667114, 2.1848000164031984); width = 0.1005; height = 0.201 length: 0.9609774947166443; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (114, 138, 131): 3 siblings; 0 strokes; 1 pads bounds: LLC: (2.448950105667114, 2.1848000164031984); width = 0.1005; height = 0.201 length: 1.3569070398807526; area: 0.35967200000000005; fatness: 0.26506753184183396; areaDPI: 500; areaPixels: 89918 (114, 138, 131): 3 siblings; 0 strokes; 1 pads bounds: LLC: (2.148949914932251, 2.1848000164031984); width = 0.1005; height = 0.201 length: 1.3569070398807526; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (176, 70, 136): 0 siblings; 0 strokes; 1 pads bounds: LLC: (1.019200029373169, 1.6053000402450561); width = 0.12; height = 0.06 length: 0.0; area: 0.022180000000000002; fatness: 0.18483333333333335; areaDPI: 500; areaPixels: 5545 (173, 165, 44): 0 siblings; 0 strokes; 1 pads bounds: LLC: (0.3691999936103821, 2.15530011177063); width = 0.12; height = 0.06 length: 0.0; area: 0.023719999999999998; fatness: 0.19766666666666666; areaDPI: 500; areaPixels: 5930 (136, 68, 179): 0 siblings; 0 strokes; 1 pads bounds: LLC: (0.3691999936103821, 2.4553000640869143); width = 0.12; height = 0.06 length: 0.0; area: 0.012292; fatness: 0.10243333333333335; areaDPI: 500; areaPixels: 3073 (3, 200, 180): 0 siblings; 0 strokes; 1 pads bounds: LLC: (0.41920000553131104, 0.6052999806404114); width = 0.12; height = 0.06 length: 0.0; area: 0.023624; fatness: 0.19686666666666666; areaDPI: 500; areaPixels: 5906 (71, 104, 208): 0 siblings; 0 strokes; 1 pads bounds: LLC: (0.7192000174522399, 0.6052999806404114); width = 0.12; height = 0.06 length: 0.0; area: 0.029812; fatness: 0.24843333333333337; areaDPI: 500; areaPixels: 7453 (5, 222, 155): 0 siblings; 0 strokes; 1 pads bounds: LLC: (0.7192000174522399, 0.7053000044822693); width = 0.12; height = 0.06 length: 0.0; area: 0.038560000000000004; fatness: 0.32133333333333336; areaDPI: 500; areaPixels: 9640 (209, 94, 79): 0 siblings; 0 strokes; 1 pads bounds: LLC: (1.019200029373169, 0.6052999806404114); width = 0.12; height = 0.06 length: 0.0; area: 0.029416; fatness: 0.24513333333333334; areaDPI: 500; areaPixels: 7354 (5, 182, 195): 10 siblings; 0 strokes; 1 pads bounds: LLC: (1.019200029373169, 0.4052999925613403); width = 0.12; height = 0.06 length: 15.992328062653542; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (5, 182, 195): 10 siblings; 0 strokes; 1 pads bounds: LLC: (1.319199981689453, 0.4052999925613403); width = 0.12; height = 0.06 length: 15.992328062653542; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (179, 79, 125): 0 siblings; 0 strokes; 1 pads bounds: LLC: (1.319199981689453, 0.6052999806404114); width = 0.12; height = 0.06 length: 0.0; area: 0.029912; fatness: 0.2492666666666667; areaDPI: 500; areaPixels: 7478 (81, 49, 252): 0 siblings; 0 strokes; 1 pads bounds: LLC: (1.319199981689453, 0.7053000044822693); width = 0.12; height = 0.06 length: 0.0; area: 0.019676000000000003; fatness: 0.1639666666666667; areaDPI: 500; areaPixels: 4919 (191, 67, 124): 0 siblings; 0 strokes; 1 pads bounds: LLC: (1.6192000532150268, 0.6052999806404114); width = 0.12; height = 0.06 length: 0.0; area: 0.038796; fatness: 0.3233; areaDPI: 500; areaPixels: 9699 (96, 156, 130): 0 siblings; 0 strokes; 1 pads bounds: LLC: (1.6192000532150268, 0.5053000164031982); width = 0.12; height = 0.06 length: 0.0; area: 0.029648; fatness: 0.24706666666666668; areaDPI: 500; areaPixels: 7412 (5, 182, 195): 10 siblings; 0 strokes; 1 pads bounds: LLC: (2.819199981689453, 0.4052999925613403); width = 0.12; height = 0.06 length: 15.992328062653542; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (5, 182, 195): 10 siblings; 0 strokes; 1 pads bounds: LLC: (3.1191999340057373, 0.4052999925613403); width = 0.12; height = 0.06 length: 15.992328062653542; area: 3.6825639999999997; fatness: 0.23027066388162667; areaDPI: 500; areaPixels: 920641 (102, 209, 71): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.819199981689453, 1.7052999448776245); width = 0.12; height = 0.06 length: 0.0; area: 0.01668; fatness: 0.139; areaDPI: 500; areaPixels: 4170 86 collected nets (4 supernets) Thu Aug 05 17:16:56 EDT 2004: ToolpathsProcessor started border: true line: false voronoi: true flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 mosaic: 1953 x 1553 tile: 502 x 487 generating voronoi toolpaths extracting nodes... 49007 nodes making paths... 81 paths total length: 98.18198845535517 total segments: 49172 optimizing paths... total length: 85.42748977732845 total segments: 2804 Thu Aug 05 17:17:26 EDT 2004: ToolpathsProcessor finished (30591ms) Thu Aug 05 17:17:47 EDT 2004: ToolpathsProcessor started border: true line: false voronoi: true flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 mosaic: 1953 x 1553 tile: 502 x 487 generating outline toolpaths extracting nodes... 63503 nodes making paths... 90 paths total length: 127.00800094380975 total segments: 63594 optimizing paths... total length: 112.75158352963626 total segments: 3486 Thu Aug 05 17:18:19 EDT 2004: ToolpathsProcessor finished (31459ms) visolate-2.1.6~svn8+dfsg1.orig/visolate/doc/website/top.gbx.out000066400000000000000000001267001147500217100244750ustar00rootroot00000000000000package: visolate class: visolate.Main args: ../gerber/examples/top.gbx graphics device: :0.0 pixel format 8:8:8 24-bit depth Comment at line 1: Title: (unknown), layergroup #2 Comment at line 2: Creator: pcb 1.6.3 Comment at line 3: CreationDate: Sat Jun 1 04:16:29 2002 UTC Comment at line 4: For: dan Comment at line 5: Format: Gerber/RS-274X Comment at line 6: PCB-Dimensions: 3359 2107 Comment at line 7: PCB-Coordinate-Origin: lower left Comment at line 8: Color: R0 G0 B0 macro "THERM1" thermal 0.0, 0.0, 0.09, 0.06, 0.015, 45.0 Aperture 19: macro name = THERM1; modifiers: macro "THERM2" thermal 0.0, 0.0, 0.13, 0.1, 0.015, 45.0 Aperture 26: macro name = THERM2; modifiers: macro "THERM3" thermal 0.0, 0.0, 0.09, 0.06, 0.015, 45.0 Aperture 36: macro name = THERM3; modifiers: layer name: component Comment at line 45: LayerGroup: 2 Comment at line 46: Layer: "component" (4) Comment at line 198: Text: TERM Comment at line 216: Text: OUT Comment at line 232: Text: IN Comment at line 240: Text: +9V Comment at line 255: Text: 2002-05-31 Comment at line 317: Text: DRM011 REV 001 computing inch coords... making nets... 164 nets making half edge loops... 191 loops Thu Aug 05 17:18:56 EDT 2004: TopologyProcessor started border: true line: false voronoi: false flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 Thu Aug 05 17:19:10 EDT 2004: TopologyProcessor finished (14752ms) 0 nets Thu Aug 05 17:19:19 EDT 2004: FatnessProcessor started border: true line: false voronoi: false flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 0 misses avg fatness = 0.032596090729393325 Thu Aug 05 17:19:22 EDT 2004: FatnessProcessor finished (2983ms) 0 nets Thu Aug 05 17:19:27 EDT 2004: FatnessProcessor started border: true line: false voronoi: true flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 0 misses avg fatness = 0.29906585011955095 Thu Aug 05 17:19:33 EDT 2004: FatnessProcessor finished (5431ms) 0 nets model bounds: LLC: (-0.0175, 0.4070000064373016); width = 3.1674999046325687; height = 1.5874999868869781 board bounds: LLC: (-0.0175, 0.4070000064373016); width = 3.1674999046325687; height = 1.5874999868869781 164 nets (227, 78, 78): 0 siblings; 1 strokes; 0 pads bounds: LLC: (-0.0175, 1.1144999694824218); width = 0.035; height = 0.11000004768371574 length: 0.07500004768371582; area: 0.040508; fatness: 0.5401063232763142; areaDPI: 500; areaPixels: 10127 (9, 177, 196): 4 siblings; 11 strokes; 1 pads bounds: LLC: (1.3500000190734864, 1.2870000414550304); width = 0.8000000949203967; height = 0.12499990418553364 length: 1.380563572049141; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (35, 215, 133): 2 siblings; 5 strokes; 2 pads bounds: LLC: (0.962500023841858, 1.2119999937713146); width = 0.2824999995529651; height = 0.11500004678964615 length: 0.3553553596138954; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (119, 28, 235): 5 siblings; 30 strokes; 1 pads bounds: LLC: (0.4624999940395355, 1.1695000410079956); width = 2.050000005960465; height = 0.8249999523162841 length: 4.166015572845936; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (9, 177, 196): 4 siblings; 5 strokes; 2 pads bounds: LLC: (1.212500023841858, 1.369499969482422); width = 0.15749999955296512; height = 0.32500007152557364 length: 1.380563572049141; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (128, 44, 210): 0 siblings; 2 strokes; 3 pads bounds: LLC: (1.119999976158142, 1.3619999699294567); width = 0.06000000000000005; height = 0.18999997526407242 length: 0.1499999761581421; area: 0.028128; fatness: 0.18752002980550603; areaDPI: 500; areaPixels: 7032 (127, 100, 156): 0 siblings; 1 strokes; 2 pads bounds: LLC: (0.4449999940395355, 0.8520000290870666); width = 0.06000000000000005; height = 0.12499998763203624 length: 0.07499998807907104; area: 0.023404; fatness: 0.3120533829328828; areaDPI: 500; areaPixels: 5851 (127, 60, 196): 0 siblings; 1 strokes; 2 pads bounds: LLC: (1.6249999813735485, 1.1770000171661377); width = 0.10500006631016734; height = 0.06000000000000005 length: 0.05500006675720215; area: 0.014944; fatness: 0.27170876111787834; areaDPI: 500; areaPixels: 3736 (228, 82, 72): 4 siblings; 2 strokes; 1 pads bounds: LLC: (2.225000114440918, 0.4070000064373016); width = 0.06000000000000005; height = 0.1374999988079072 length: 0.4501422205939889; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (228, 82, 72): 4 siblings; 2 strokes; 1 pads bounds: LLC: (2.1349999618530275, 0.4070000064373016); width = 0.06000000000000005; height = 0.13250000357627878 length: 0.4501422205939889; area: 0.226076; fatness: 0.5022323826938063; areaDPI: 500; areaPixels: 56519 (228, 82, 72): 4 siblings; 1 strokes; 1 pads bounds: LLC: (2.055000038146973, 0.5020000052452087); width = 0.13750002861022903; height = 0.06000000000000005 length: 0.4501422205939889; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (35, 94, 253): 0 siblings; 1 strokes; 2 pads bounds: LLC: (1.97, 0.8120000076293945); width = 0.05999999999999983; height = 0.1149999971687794 length: 0.06499999761581421; area: 0.04504400000000001; fatness: 0.6929846408031406; areaDPI: 500; areaPixels: 11261 (228, 82, 72): 4 siblings; 1 strokes; 1 pads bounds: LLC: (2.242500114440918, 0.5020000052452087); width = 0.13249991416931195; height = 0.06000000000000005 length: 0.4501422205939889; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (190, 100, 92): 1 siblings; 2 strokes; 1 pads bounds: LLC: (2.045000047683716, 0.8520000290870666); width = 0.0969999010860918; height = 0.11799998834729197 length: 0.20399993658065796; area: 0.023039999999999998; fatness: 0.11294121158165356; areaDPI: 500; areaPixels: 5760 (190, 100, 92): 1 siblings; 1 strokes; 1 pads bounds: LLC: (2.087499904632568, 0.9270000171661377); width = 0.11750004768371625; height = 0.06000000000000005 length: 0.20399993658065796; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (143, 38, 202): 1 siblings; 1 strokes; 1 pads bounds: LLC: (2.4875, 1.0270000410079956); width = 0.0924999523162846; height = 0.06000000000000005 length: 0.04999995231628418; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (57, 221, 104): 1 siblings; 1 strokes; 1 pads bounds: LLC: (2.4875, 1.1019999694824218); width = 0.0924999523162846; height = 0.06000000000000005 length: 0.04999995231628418; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (141, 192, 49): 2 siblings; 2 strokes; 2 pads bounds: LLC: (1.6449999523162842, 1.4020000410079956); width = 0.16000002384185796; height = 0.13499992847442632 length: 0.35099995136260986; area: 0.07715999999999999; fatness: 0.21982909029035105; areaDPI: 500; areaPixels: 19290 (141, 192, 49): 2 siblings; 1 strokes; 1 pads bounds: LLC: (1.6449999523162842, 1.5769999933242798); width = 0.1425000238418579; height = 0.06000000000000005 length: 0.35099995136260986; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (36, 249, 98): 0 siblings; 1 strokes; 2 pads bounds: LLC: (1.6700000476837158, 1.8519999694824218); width = 0.12499992802739146; height = 0.06000000000000005 length: 0.07499992847442627; area: 0.019719999999999998; fatness: 0.2629335840863394; areaDPI: 500; areaPixels: 4930 (60, 199, 123): 2 siblings; 2 strokes; 2 pads bounds: LLC: (1.4450000238418579, 1.5270000410079956); width = 0.16000002384185796; height = 0.1599999046325684 length: 0.47599995136260986; area: 0.073592; fatness: 0.1546050578142574; areaDPI: 500; areaPixels: 18398 (60, 199, 123): 2 siblings; 2 strokes; 2 pads bounds: LLC: (1.4450000238418579, 1.7019999933242798); width = 0.16000002384185796; height = 0.16000002384185796 length: 0.47599995136260986; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (94, 176, 113): 1 siblings; 1 strokes; 1 pads bounds: LLC: (1.6374999761581421, 1.1019999694824218); width = 0.09250007152557371; height = 0.06000000000000005 length: 0.05000007152557373; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (166, 190, 26): 1 siblings; 3 strokes; 3 pads bounds: LLC: (1.1449999523162842, 0.9519999933242798); width = 0.23500007152557378; height = 0.10999995231628423 length: 0.27900004386901855; area: 0.086984; fatness: 0.31177056029724554; areaDPI: 500; areaPixels: 21746 (190, 159, 33): 2 siblings; 2 strokes; 2 pads bounds: LLC: (0.8200000238418579, 1.4519999933242798); width = 0.1599999642372132; height = 0.16000002384185796 length: 0.37599998712539673; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (190, 159, 33): 2 siblings; 1 strokes; 1 pads bounds: LLC: (0.9949999761581421, 1.4694999933242798); width = 0.06000000000000005; height = 0.1425000238418579 length: 0.37599998712539673; area: 0.087148; fatness: 0.2317766036809357; areaDPI: 500; areaPixels: 21787 (182, 190, 11): 4 siblings; 8 strokes; 1 pads bounds: LLC: (2.1000000190734864, 0.791999990940094); width = 0.135; height = 0.5350000496208668 length: 0.818852570373565; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (81, 94, 207): 0 siblings; 1 strokes; 2 pads bounds: LLC: (0.23000000044703484, 0.7019999933242798); width = 0.17499999955296514; height = 0.06000000000000005 length: 0.125; area: 0.0882; fatness: 0.7056; areaDPI: 500; areaPixels: 22050 (130, 25, 228): 4 siblings; 3 strokes; 0 pads bounds: LLC: (1.2375, 1.1244999647140503); width = 0.0950000524520874; height = 0.1450000047683715 length: 0.3426396790891886; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (69, 103, 211): 4 siblings; 5 strokes; 1 pads bounds: LLC: (1.245, 1.0820000123977662); width = 0.12500002339482297; height = 0.27499999955296506 length: 1.1928478963673115; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (57, 235, 90): 4 siblings; 2 strokes; 1 pads bounds: LLC: (2.6375000953674315, 0.9319999933242797); width = 0.4124999046325688; height = 0.13750004768371582 length: 0.6509999632835388; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (60, 191, 132): 0 siblings; 3 strokes; 2 pads bounds: LLC: (2.4249999970197678, 0.736999973654747); width = 0.17000005021691322; height = 0.26500001922249794 length: 0.24500006437301636; area: 0.082916; fatness: 0.3384325641390817; areaDPI: 500; areaPixels: 20729 (57, 235, 90): 4 siblings; 1 strokes; 0 pads bounds: LLC: (2.7375, 0.8195000171661377); width = 0.025000000000000355; height = 0.1749999761581421 length: 0.6509999632835388; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (108, 125, 150): 2 siblings; 6 strokes; 1 pads bounds: LLC: (2.230000000447035, 0.9694999933242798); width = 0.20749995186924908; height = 0.23250004723668094 length: 0.3997105360031128; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (182, 190, 11): 4 siblings; 2 strokes; 0 pads bounds: LLC: (1.9875, 0.9694999933242798); width = 0.12499990463256805; height = 0.04999997615814209 length: 0.818852570373565; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (248, 2, 133): 1 siblings; 3 strokes; 3 pads bounds: LLC: (2.3125000476837156, 1.0370000414550304); width = 0.1324999041855337; height = 0.18999997526407242 length: 0.30399978160858154; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (92, 67, 223): 2 siblings; 4 strokes; 1 pads bounds: LLC: (1.9800000004470348, 1.0370000414550304); width = 0.20749995186924908; height = 0.15749999955296512 length: 0.4247104302048683; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (231, 139, 12): 4 siblings; 1 strokes; 0 pads bounds: LLC: (1.6374999761581421, 1.0445000410079956); width = 0.299999976158142; height = 0.025 length: 0.4449999928474426; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (231, 139, 12): 4 siblings; 1 strokes; 0 pads bounds: LLC: (1.8125000476837159, 0.8945000052452088); width = 0.025; height = 0.17500003576278678 length: 0.4449999928474426; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (108, 93, 182): 1 siblings; 3 strokes; 3 pads bounds: LLC: (1.462500023841858, 1.1119999699294567); width = 0.13250002339482303; height = 0.18999997526407242 length: 0.3039999008178711; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (17, 154, 211): 3 siblings; 7 strokes; 1 pads bounds: LLC: (1.3874999761581421, 0.8945000052452088); width = 0.20750007107853885; height = 0.37499996423721305 length: 0.6257106810808182; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (130, 25, 228): 4 siblings; 2 strokes; 0 pads bounds: LLC: (1.1374999761581421, 1.119499969482422); width = 0.12500002384185782; height = 0.049999976158142 length: 0.3426396790891886; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (69, 103, 211): 4 siblings; 5 strokes; 0 pads bounds: LLC: (0.8874999761581421, 0.9445000171661377); width = 0.3750000238418578; height = 0.15 length: 1.1928478963673115; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (69, 103, 211): 4 siblings; 6 strokes; 0 pads bounds: LLC: (0.712500023841858, 0.8569999784231186); width = 0.2624999552965164; height = 0.26250001490116126 length: 1.1928478963673115; area: 0.325224; fatness: 0.2726449876723045; areaDPI: 500; areaPixels: 81306 (35, 134, 213): 3 siblings; 9 strokes; 3 pads bounds: LLC: (0.2, 0.7944999814033509); width = 0.46999997571110724; height = 0.3325000114738941 length: 1.0217106714844704; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (124, 162, 96): 1 siblings; 1 strokes; 0 pads bounds: LLC: (0.3459999940395355, 0.6029999933242798); width = 0.028000010728836067; height = 0.0080 length: 0.06000003218650818; area: 0.06405200000000001; fatness: 1.0675327606641347; areaDPI: 500; areaPixels: 16013 (124, 162, 96): 1 siblings; 1 strokes; 0 pads bounds: LLC: (0.35600001430511474, 0.5629999718666077); width = 0.0080; height = 0.04800002145767212 length: 0.06000003218650818; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (171, 130, 81): 1 siblings; 1 strokes; 0 pads bounds: LLC: (0.378999986410141, 0.5830000123977661); width = 0.02300001549720765; height = 0.0080 length: 0.09500005841255188; area: 0.010256000000000001; fatness: 0.1079578283569237; areaDPI: 500; areaPixels: 2564 (171, 130, 81): 1 siblings; 3 strokes; 0 pads bounds: LLC: (0.378999986410141, 0.5629999718666077); width = 0.028000010728836067; height = 0.048000021457672126 length: 0.09500005841255188; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (162, 178, 43): 1 siblings; 6 strokes; 0 pads bounds: LLC: (0.41200000858306884, 0.5629999718666077); width = 0.033000005960464485; height = 0.04800002145767212 length: 0.12742645014077425; area: 0.009368000000000001; fatness: 0.07351691889439525; areaDPI: 500; areaPixels: 2342 (162, 178, 43): 1 siblings; 1 strokes; 0 pads bounds: LLC: (0.41700000381469726, 0.5629999718666077); width = 0.0080; height = 0.04800002145767212 length: 0.12742645014077425; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (118, 13, 251): 0 siblings; 4 strokes; 0 pads bounds: LLC: (0.44999999618530273, 0.5629999718666077); width = 0.0380000011920929; height = 0.04800002145767212 length: 0.12242643162608147; area: 0.1199; fatness: 0.9793636750452895; areaDPI: 500; areaPixels: 29975 (248, 70, 64): 0 siblings; 8 strokes; 0 pads bounds: LLC: (2.8960000953674316, 1.2130000076293945); width = 0.02799998092651368; height = 0.04799996185302735 length: 0.10828416794538498; area: 0.08233200000000002; fatness: 0.7603327574306671; areaDPI: 500; areaPixels: 20583 (133, 215, 34): 0 siblings; 5 strokes; 0 pads bounds: LLC: (2.929000087738037, 1.2130000076293945); width = 0.02799998092651368; height = 0.047999961853027344 length: 0.09414204582571983; area: 0.015548000000000001; fatness: 0.16515468581151493; areaDPI: 500; areaPixels: 3887 (51, 110, 222): 1 siblings; 1 strokes; 0 pads bounds: LLC: (2.9620000801086426, 1.2529999694824219); width = 0.02799998092651368; height = 0.0080 length: 0.059999942779541016; area: 0.14948; fatness: 2.4913357092562127; areaDPI: 500; areaPixels: 37370 (51, 110, 222): 1 siblings; 1 strokes; 0 pads bounds: LLC: (2.9720000705718994, 1.2130000076293945); width = 0.0080; height = 0.047999961853027344 length: 0.059999942779541016; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (62, 92, 229): 2 siblings; 1 strokes; 0 pads bounds: LLC: (0.19600000298023224, 1.3030000410079956); width = 0.017999990463256843; height = 0.0080 length: 0.060000061988830566; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (62, 92, 229): 2 siblings; 1 strokes; 0 pads bounds: LLC: (0.20099999821186065, 1.2629999599456787); width = 0.0080; height = 0.048000081062316895 length: 0.060000061988830566; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (62, 92, 229): 2 siblings; 1 strokes; 0 pads bounds: LLC: (0.19600000298023224, 1.2629999599456787); width = 0.017999990463256843; height = 0.0080 length: 0.060000061988830566; area: 0.063424; fatness: 1.0570655745623532; areaDPI: 500; areaPixels: 15856 (148, 77, 157): 1 siblings; 3 strokes; 0 pads bounds: LLC: (0.21900000488758087, 1.2629999599456787); width = 0.03299999105930329; height = 0.048000081062316895 length: 0.12035555765032768; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (148, 77, 157): 1 siblings; 1 strokes; 0 pads bounds: LLC: (0.24399999594688415, 1.2629999599456787); width = 0.0080; height = 0.048000081062316895 length: 0.12035555765032768; area: 0.057304; fatness: 0.4761225914177299; areaDPI: 500; areaPixels: 14326 (145, 165, 73): 1 siblings; 1 strokes; 0 pads bounds: LLC: (1.996, 1.833000012397766); width = 0.02799998092651368; height = 0.0080 length: 0.039999961853027344; area: 0.011084; fatness: 0.2771002642634051; areaDPI: 500; areaPixels: 2771 (145, 165, 73): 1 siblings; 1 strokes; 0 pads bounds: LLC: (2.005999990463257, 1.8230000219345093); width = 0.0080; height = 0.027999980926513672 length: 0.039999961853027344; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (36, 164, 182): 0 siblings; 8 strokes; 0 pads bounds: LLC: (2.0289999923706055, 1.8130000314712524); width = 0.02799998092651368; height = 0.04799996185302735 length: 0.09949734481051564; area: 0.011336; fatness: 0.11393268857162432; areaDPI: 500; areaPixels: 2834 (91, 198, 94): 0 siblings; 4 strokes; 0 pads bounds: LLC: (2.061999984741211, 1.8130000314712524); width = 0.02799998092651368; height = 0.047999961853027344 length: 0.08828418701887131; area: 0.08666800000000001; fatness: 0.9816933578543819; areaDPI: 500; areaPixels: 21667 (137, 61, 184): 0 siblings; 6 strokes; 0 pads bounds: LLC: (0.09600000149011612, 1.8130000314712524); width = 0.03299999850988389; height = 0.04799996185302735 length: 0.09949743933975697; area: 0.051980000000000005; fatness: 0.5224255050675455; areaDPI: 500; areaPixels: 12995 (85, 152, 146): 1 siblings; 8 strokes; 0 pads bounds: LLC: (0.1339999965429306, 1.8130000314712524); width = 0.028000010728836067; height = 0.04799996185302735 length: 0.1365684773772955; area: 0.010524; fatness: 0.07706024261312892; areaDPI: 500; areaPixels: 2631 (85, 152, 146): 1 siblings; 1 strokes; 0 pads bounds: LLC: (0.1339999965429306, 1.8230000219345093); width = 0.028000010728836067; height = 0.02799998092651368 length: 0.1365684773772955; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (62, 243, 77): 1 siblings; 8 strokes; 0 pads bounds: LLC: (0.16700000381469726, 1.8130000314712524); width = 0.027999995827674873; height = 0.04799996185302735 length: 0.13656845316290855; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (62, 243, 77): 1 siblings; 1 strokes; 0 pads bounds: LLC: (0.16700000381469726, 1.8230000219345093); width = 0.027999995827674873; height = 0.02799998092651368 length: 0.13656845316290855; area: 0.010604; fatness: 0.07764604309716239; areaDPI: 500; areaPixels: 2651 (94, 185, 103): 0 siblings; 6 strokes; 0 pads bounds: LLC: (0.19999999618530273, 1.8130000314712524); width = 0.033000005960464485; height = 0.04799996185302735 length: 0.09949745563790202; area: 0.017328; fatness: 0.1741552071749578; areaDPI: 500; areaPixels: 4332 (214, 73, 95): 0 siblings; 1 strokes; 0 pads bounds: LLC: (0.2379999986886978, 1.833000012397766); width = 0.027999995827674873; height = 0.0080 length: 0.019999995827674866; area: 0.0010; fatness: 0.05000001043081501; areaDPI: 500; areaPixels: 250 (198, 170, 15): 1 siblings; 8 strokes; 0 pads bounds: LLC: (0.2710000059604645, 1.8130000314712524); width = 0.02799998092651368; height = 0.04799996185302735 length: 0.13656841218471527; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (198, 170, 15): 1 siblings; 1 strokes; 0 pads bounds: LLC: (0.2710000059604645, 1.8230000219345093); width = 0.02799998092651368; height = 0.02799998092651368 length: 0.13656841218471527; area: 0.01582; fatness: 0.11583937857169123; areaDPI: 500; areaPixels: 3955 (161, 115, 107): 0 siblings; 9 strokes; 0 pads bounds: LLC: (0.30399999833106994, 1.8130000314712524); width = 0.028000010728836067; height = 0.047999961853027344 length: 0.10328426212072372; area: 0.015748; fatness: 0.15247240650848592; areaDPI: 500; areaPixels: 3937 (213, 49, 121): 0 siblings; 1 strokes; 0 pads bounds: LLC: (0.3369999907016754, 1.833000012397766); width = 0.028000010728836067; height = 0.0080 length: 0.02000001072883606; area: 0.001052; fatness: 0.0525999717831763; areaDPI: 500; areaPixels: 263 (91, 83, 208): 1 siblings; 7 strokes; 0 pads bounds: LLC: (0.37000001287460327, 1.8130000314712524); width = 0.02799998092651368; height = 0.04799996185302735 length: 0.09328418225049973; area: 0.016864; fatness: 0.18078091690523085; areaDPI: 500; areaPixels: 4216 (91, 83, 208): 1 siblings; 1 strokes; 0 pads bounds: LLC: (0.3750000081062317, 1.833000012397766); width = 0.02299998569488526; height = 0.0080 length: 0.09328418225049973; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (11, 238, 134): 1 siblings; 1 strokes; 0 pads bounds: LLC: (0.40800000047683715, 1.8130000314712524); width = 0.017999990463256843; height = 0.0080 length: 0.06414207443594933; area: 0.042548; fatness: 0.66333994299619; areaDPI: 500; areaPixels: 10637 (11, 238, 134): 1 siblings; 2 strokes; 0 pads bounds: LLC: (0.40300000524520874, 1.8130000314712524); width = 0.017999990463256836; height = 0.047999961853027344 length: 0.06414207443594933; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (137, 129, 116): 1 siblings; 1 strokes; 0 pads bounds: LLC: (0.10099999672174453, 1.9130000553131103); width = 0.0080; height = 0.047999961853027344 length: 0.12414205819368362; area: 0.016828; fatness: 0.13555438217195767; areaDPI: 500; areaPixels: 4207 (137, 129, 116): 1 siblings; 5 strokes; 0 pads bounds: LLC: (0.09600000149011612, 1.9130000553131103); width = 0.03299999850988389; height = 0.047999961853027344 length: 0.12414205819368362; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (71, 154, 158): 1 siblings; 6 strokes; 0 pads bounds: LLC: (0.1339999965429306, 1.9130000553131103); width = 0.033000005960464485; height = 0.047999961853027344 length: 0.12742634117603302; area: 0.00402; fatness: 0.03154763734796853; areaDPI: 500; areaPixels: 1005 (71, 154, 158): 1 siblings; 1 strokes; 0 pads bounds: LLC: (0.1390000066757202, 1.9130000553131103); width = 0.0080; height = 0.047999961853027344 length: 0.12742634117603302; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (88, 56, 239): 0 siblings; 4 strokes; 0 pads bounds: LLC: (0.17199999904632568, 1.9130000553131103); width = 0.0380000011920929; height = 0.047999961853027344 length: 0.12242631241679192; area: 0.004956; fatness: 0.04048149374235533; areaDPI: 500; areaPixels: 1239 (33, 179, 171): 1 siblings; 8 strokes; 0 pads bounds: LLC: (0.21499999678134918, 1.9130000553131103); width = 0.027999995827674873; height = 0.04799996185302735 length: 0.13656844478100538; area: 0.0037600000000000003; fatness: 0.027531982267421703; areaDPI: 500; areaPixels: 940 (33, 179, 171): 1 siblings; 1 strokes; 0 pads bounds: LLC: (0.21499999678134918, 1.9230000457763672); width = 0.027999995827674873; height = 0.02799998092651368 length: 0.13656844478100538; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (217, 78, 87): 1 siblings; 1 strokes; 0 pads bounds: LLC: (0.25299999928474426, 1.9130000553131103); width = 0.017999990463256843; height = 0.0080 length: 0.06414207443594933; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (217, 78, 87): 1 siblings; 2 strokes; 0 pads bounds: LLC: (0.24800000405311584, 1.9130000553131103); width = 0.017999990463256836; height = 0.047999961853027344 length: 0.06414207443594933; area: 0.0031200000000000004; fatness: 0.04864201894679216; areaDPI: 500; areaPixels: 780 (95, 42, 245): 1 siblings; 1 strokes; 0 pads bounds: LLC: (0.2809999964237213, 1.9130000553131103); width = 0.017999990463256843; height = 0.0080 length: 0.06414207443594933; area: 0.0038160000000000004; fatness: 0.059492930865691955; areaDPI: 500; areaPixels: 954 (95, 42, 245): 1 siblings; 2 strokes; 0 pads bounds: LLC: (0.2760000011920929, 1.9130000553131103); width = 0.017999990463256836; height = 0.047999961853027344 length: 0.06414207443594933; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (127, 117, 139): 1 siblings; 6 strokes; 0 pads bounds: LLC: (0.32200000500679016, 1.9130000553131103); width = 0.033000005960464485; height = 0.047999961853027344 length: 0.1274263495579362; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (127, 117, 139): 1 siblings; 1 strokes; 0 pads bounds: LLC: (0.3270000002384186, 1.9130000553131103); width = 0.0080; height = 0.047999961853027344 length: 0.1274263495579362; area: 0.0051; fatness: 0.040023119375959315; areaDPI: 500; areaPixels: 1275 (232, 115, 35): 1 siblings; 1 strokes; 0 pads bounds: LLC: (0.35999999260902404, 1.933000036239624); width = 0.02300001549720765; height = 0.0080 length: 0.0949999988079071; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (232, 115, 35): 1 siblings; 3 strokes; 0 pads bounds: LLC: (0.35999999260902404, 1.9130000553131103); width = 0.028000010728836067; height = 0.04799996185302735 length: 0.0949999988079071; area: 0.0038040000000000005; fatness: 0.04004210576562011; areaDPI: 500; areaPixels: 951 (128, 16, 239): 0 siblings; 4 strokes; 0 pads bounds: LLC: (0.3930000147819519, 1.9130000553131103); width = 0.02799998092651368; height = 0.047999961853027344 length: 0.08828418701887131; area: 0.004524; fatness: 0.05124360491684617; areaDPI: 500; areaPixels: 1131 (229, 25, 129): 1 siblings; 8 strokes; 0 pads bounds: LLC: (0.4440000138282776, 1.9130000553131103); width = 0.02799998092651368; height = 0.04799996185302735 length: 0.13656841218471527; area: 0.005076000000000001; fatness: 0.03716818493235807; areaDPI: 500; areaPixels: 1269 (229, 25, 129): 1 siblings; 1 strokes; 0 pads bounds: LLC: (0.4440000138282776, 1.9230000457763672); width = 0.02799998092651368; height = 0.02799998092651368 length: 0.13656841218471527; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (81, 118, 183): 1 siblings; 8 strokes; 0 pads bounds: LLC: (0.47700000619888305, 1.9130000553131103); width = 0.02799998092651368; height = 0.04799996185302735 length: 0.13656841218471527; area: 0.005328; fatness: 0.03901341397155315; areaDPI: 500; areaPixels: 1332 (81, 118, 183): 1 siblings; 1 strokes; 0 pads bounds: LLC: (0.47700000619888305, 1.9230000457763672); width = 0.02799998092651368; height = 0.02799998092651368 length: 0.13656841218471527; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (162, 17, 204): 1 siblings; 1 strokes; 0 pads bounds: LLC: (0.5149999938011169, 1.9130000553131103); width = 0.017999990463256843; height = 0.0080 length: 0.06414207443594933; area: 0.045256000000000005; fatness: 0.7055587209794956; areaDPI: 500; areaPixels: 11314 (162, 17, 204): 1 siblings; 2 strokes; 0 pads bounds: LLC: (0.5099999985694885, 1.9130000553131103); width = 0.017999990463256836; height = 0.047999961853027344 length: 0.06414207443594933; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (231, 139, 12): 4 siblings; 1 strokes; 0 pads bounds: LLC: (1.7500000447034836, 0.8070000261068344); width = 0.15000000596046448; height = 0.16999998688697815 length: 0.4449999928474426; area: 0.122856; fatness: 0.2760809033138978; areaDPI: 500; areaPixels: 30714 (17, 154, 211): 3 siblings; 1 strokes; 0 pads bounds: LLC: (1.5265000015497208, 0.8064999729394913); width = 0.0949999988079071; height = 0.17100003361701965 length: 0.6257106810808182; area: 0.24412; fatness: 0.39014836629977384; areaDPI: 500; areaPixels: 61030 (35, 134, 213): 3 siblings; 1 strokes; 0 pads bounds: LLC: (0.6014999896287918, 0.8564999848604202); width = 0.0949999988079071; height = 0.17100003361701965 length: 1.0217106714844704; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (141, 192, 49): 2 siblings; 1 strokes; 0 pads bounds: LLC: (1.7265000492334366, 1.481500044465065); width = 0.0949999988079071; height = 0.17099997401237488 length: 0.35099995136260986; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (57, 235, 90): 4 siblings; 1 strokes; 0 pads bounds: LLC: (2.7034999281167984, 0.7364999800920486); width = 0.0949999988079071; height = 0.17100003361701965 length: 0.6509999632835388; area: 0.229444; fatness: 0.35244856058473717; areaDPI: 500; areaPixels: 57361 (182, 190, 11): 4 siblings; 1 strokes; 0 pads bounds: LLC: (2.1299999207258224, 0.7070000022649765); width = 0.16999998688697815; height = 0.15000000596046448 length: 0.818852570373565; area: 0.125288; fatness: 0.15300434355703732; areaDPI: 500; areaPixels: 31322 (228, 82, 72): 4 siblings; 1 strokes; 0 pads bounds: LLC: (2.1295000463724136, 0.48350001871585846); width = 0.17099997401237488; height = 0.0949999988079071 length: 0.4501422205939889; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (9, 177, 196): 4 siblings; 1 strokes; 0 pads bounds: LLC: (1.1500000208616257, 1.6120000332593918); width = 0.15000000596046448; height = 0.16999998688697815 length: 1.380563572049141; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (60, 199, 123): 2 siblings; 1 strokes; 0 pads bounds: LLC: (1.4284999519586563, 1.6115000396966934); width = 0.0949999988079071; height = 0.17099997401237488 length: 0.47599995136260986; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (212, 109, 61): 0 siblings; 1 strokes; 0 pads bounds: LLC: (2.062000047683716, 1.0939999933242799); width = 0.0799999008178709; height = 0.026 length: 0.053999900817871094; area: 0.007544; fatness: 0.1397039602988185; areaDPI: 500; areaPixels: 1886 (92, 67, 223): 2 siblings; 1 strokes; 0 pads bounds: LLC: (2.062000047415495, 1.0440000407397747); width = 0.0799999013543129; height = 0.026000000536441803 length: 0.4247104302048683; area: 0.0426; fatness: 0.10030363506601654; areaDPI: 500; areaPixels: 10650 (182, 190, 11): 4 siblings; 1 strokes; 0 pads bounds: LLC: (2.062000047415495, 0.993999969214201); width = 0.0799999013543129; height = 0.026000000536441803 length: 0.818852570373565; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (204, 133, 45): 0 siblings; 1 strokes; 0 pads bounds: LLC: (2.2820000760257244, 0.9440000168979168); width = 0.0799999013543129; height = 0.026000000536441803 length: 0.053999900817871094; area: 0.014660000000000001; fatness: 0.2714819801140879; areaDPI: 500; areaPixels: 3665 (108, 125, 150): 2 siblings; 1 strokes; 0 pads bounds: LLC: (2.2820000760257244, 0.993999969214201); width = 0.0799999013543129; height = 0.026000000536441803 length: 0.3997105360031128; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (248, 2, 133): 1 siblings; 1 strokes; 0 pads bounds: LLC: (2.2820000760257244, 1.0440000407397747); width = 0.0799999013543129; height = 0.026000000536441803 length: 0.30399978160858154; area: 0.033664; fatness: 0.11073692165787301; areaDPI: 500; areaPixels: 8416 (57, 231, 95): 0 siblings; 1 strokes; 0 pads bounds: LLC: (2.2820000760257244, 1.0939999930560589); width = 0.0799999013543129; height = 0.026000000536441803 length: 0.053999900817871094; area: 0.008908; fatness: 0.16496326595199828; areaDPI: 500; areaPixels: 2227 (165, 54, 164): 0 siblings; 1 strokes; 0 pads bounds: LLC: (1.212000023841858, 1.1690000410079957); width = 0.08000002002716067; height = 0.026 length: 0.054000020027160645; area: 0.008084; fatness: 0.1497036481826109; areaDPI: 500; areaPixels: 2021 (130, 25, 228): 4 siblings; 1 strokes; 0 pads bounds: LLC: (1.212000023573637, 1.118999969214201); width = 0.08000002056360245; height = 0.026000000536441803 length: 0.3426396790891886; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (69, 103, 211): 4 siblings; 1 strokes; 0 pads bounds: LLC: (1.212000023573637, 1.0690000168979168); width = 0.08000002056360245; height = 0.026000000536441803 length: 1.1928478963673115; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (166, 190, 26): 1 siblings; 1 strokes; 0 pads bounds: LLC: (1.212000023573637, 1.018999945372343); width = 0.08000002056360245; height = 0.026000000536441803 length: 0.27900004386901855; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (129, 217, 36): 0 siblings; 1 strokes; 0 pads bounds: LLC: (1.4320000521838665, 1.018999945372343); width = 0.0799999013543129; height = 0.026000000536441803 length: 0.053999900817871094; area: 0.016756; fatness: 0.31029686622044045; areaDPI: 500; areaPixels: 4189 (17, 154, 211): 3 siblings; 1 strokes; 0 pads bounds: LLC: (1.4320000521838665, 1.0690000168979168); width = 0.0799999013543129; height = 0.026000000536441803 length: 0.6257106810808182; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (108, 93, 182): 1 siblings; 1 strokes; 0 pads bounds: LLC: (1.4320000521838665, 1.118999969214201); width = 0.0799999013543129; height = 0.026000000536441803 length: 0.3039999008178711; area: 0.022348; fatness: 0.07351318187892725; areaDPI: 500; areaPixels: 5587 (247, 94, 42): 0 siblings; 1 strokes; 0 pads bounds: LLC: (1.4320000521838665, 1.1690000407397747); width = 0.0799999013543129; height = 0.026000000536441803 length: 0.053999900817871094; area: 0.008552; fatness: 0.15837066125072852; areaDPI: 500; areaPixels: 2138 (35, 215, 133): 2 siblings; 1 strokes; 0 pads bounds: LLC: (0.9000000208616257, 1.1569999903440475); width = 0.16999998688697815; height = 0.15000000596046448 length: 0.3553553596138954; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (190, 159, 33): 2 siblings; 1 strokes; 0 pads bounds: LLC: (0.8995000272989273, 1.4355000406503677); width = 0.17099997401237488; height = 0.0949999988079071 length: 0.37599998712539673; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (35, 134, 213): 3 siblings; 0 strokes; 1 pads bounds: LLC: (0.23000000044703484, 0.7819999866187572); width = 0.03999999910593033; height = 0.03999999910593033 length: 1.0217106714844704; area: 0.186896; fatness: 0.1829245844407731; areaDPI: 500; areaPixels: 46724 (119, 28, 235): 5 siblings; 0 strokes; 1 pads bounds: LLC: (1.8250000290572643, 1.8619999699294567); width = 0.03999999910593033; height = 0.03999999910593033 length: 4.166015572845936; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (69, 103, 211): 4 siblings; 0 strokes; 1 pads bounds: LLC: (0.7000000290572643, 1.0869999937713146); width = 0.03999999910593033; height = 0.03999999910593033 length: 1.1928478963673115; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (57, 235, 90): 4 siblings; 0 strokes; 1 pads bounds: LLC: (2.6249999813735485, 0.9619999937713146); width = 0.03999999910593033; height = 0.03999999910593033 length: 0.6509999632835388; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (231, 139, 12): 4 siblings; 0 strokes; 1 pads bounds: LLC: (1.6249999813735485, 1.0370000414550304); width = 0.03999999910593033; height = 0.03999999910593033 length: 0.4449999928474426; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (119, 28, 235): 5 siblings; 0 strokes; 1 pads bounds: LLC: (0.45499999448657036, 1.157000046223402); width = 0.03999999910593033; height = 0.03999999910593033 length: 4.166015572845936; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (104, 209, 70): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.6300000958144665, 1.1119999699294567); width = 0.03999999910593033; height = 0.03999999910593033 length: 0.0; area: 0.012740000000000001; fatness: 0.3185000071190299; areaDPI: 500; areaPixels: 3185 (57, 235, 90): 4 siblings; 0 strokes; 1 pads bounds: LLC: (2.6300000958144665, 1.0420000366866589); width = 0.03999999910593033; height = 0.03999999910593033 length: 0.6509999632835388; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (108, 125, 150): 2 siblings; 0 strokes; 1 pads bounds: LLC: (2.410000067204237, 0.9619999937713146); width = 0.03999999910593033; height = 0.03999999910593033 length: 0.3997105360031128; area: 0.02894; fatness: 0.07240239471639703; areaDPI: 500; areaPixels: 7235 (182, 190, 11): 4 siblings; 0 strokes; 1 pads bounds: LLC: (1.9800000004470348, 0.9569999985396862); width = 0.03999999910593033; height = 0.03999999910593033 length: 0.818852570373565; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (92, 67, 223): 2 siblings; 0 strokes; 1 pads bounds: LLC: (2.160000067204237, 1.1620000414550304); width = 0.03999999910593033; height = 0.03999999910593033 length: 0.4247104302048683; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (231, 139, 12): 4 siblings; 0 strokes; 1 pads bounds: LLC: (1.9099999479949474, 1.0370000414550304); width = 0.03999999910593033; height = 0.03999999910593033 length: 0.4449999928474426; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (57, 221, 104): 1 siblings; 0 strokes; 1 pads bounds: LLC: (2.474999886006117, 1.1119999699294567); width = 0.03999999910593033; height = 0.03999999910593033 length: 0.04999995231628418; area: 0.011636; fatness: 0.2327202219392986; areaDPI: 500; areaPixels: 2909 (143, 38, 202): 1 siblings; 0 strokes; 1 pads bounds: LLC: (2.474999886006117, 1.0370000414550304); width = 0.03999999910593033; height = 0.03999999910593033 length: 0.04999995231628418; area: 0.01002; fatness: 0.20040019111651525; areaDPI: 500; areaPixels: 2505 (119, 28, 235): 5 siblings; 0 strokes; 1 pads bounds: LLC: (2.474999886006117, 1.1870000176131725); width = 0.03999999910593033; height = 0.03999999910593033 length: 4.166015572845936; area: 1.0744; fatness: 0.2578962995248824; areaDPI: 500; areaPixels: 268600 (35, 215, 133): 2 siblings; 0 strokes; 1 pads bounds: LLC: (1.129999976605177, 1.2920000366866589); width = 0.03999999910593033; height = 0.03999999910593033 length: 0.3553553596138954; area: 0.077116; fatness: 0.21701093824443488; areaDPI: 500; areaPixels: 19279 (9, 177, 196): 4 siblings; 0 strokes; 1 pads bounds: LLC: (1.2050000242888927, 1.3569999746978283); width = 0.03999999910593033; height = 0.03999999910593033 length: 1.380563572049141; area: 0.17292400000000002; fatness: 0.12525609359903117; areaDPI: 500; areaPixels: 43231 (35, 134, 213): 3 siblings; 0 strokes; 1 pads bounds: LLC: (0.45499999448657036, 1.0069999508559704); width = 0.03999999910593033; height = 0.03999999910593033 length: 1.0217106714844704; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (94, 176, 113): 1 siblings; 0 strokes; 1 pads bounds: LLC: (1.6249999813735485, 1.1119999699294567); width = 0.03999999910593033; height = 0.03999999910593033 length: 0.05000007152557373; area: 0.011772000000000001; fatness: 0.23543966320086024; areaDPI: 500; areaPixels: 2943 (119, 28, 235): 5 siblings; 0 strokes; 1 pads bounds: LLC: (1.3500000052154064, 1.5119999460875988); width = 0.03999999910593033; height = 0.03999999910593033 length: 4.166015572845936; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (9, 177, 196): 4 siblings; 0 strokes; 1 pads bounds: LLC: (1.2000000290572643, 1.5119999460875988); width = 0.03999999910593033; height = 0.03999999910593033 length: 1.380563572049141; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (119, 28, 235): 5 siblings; 0 strokes; 1 pads bounds: LLC: (1.5550000481307507, 1.3319999985396862); width = 0.03999999910593033; height = 0.03999999910593033 length: 4.166015572845936; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (130, 25, 228): 4 siblings; 0 strokes; 1 pads bounds: LLC: (1.3050000481307507, 1.2369999699294567); width = 0.03999999910593033; height = 0.03999999910593033 length: 0.3426396790891886; area: 0.0233; fatness: 0.06800146457624671; areaDPI: 500; areaPixels: 5825 (17, 154, 211): 3 siblings; 0 strokes; 1 pads bounds: LLC: (1.3749999813735485, 1.2369999699294567); width = 0.03999999910593033; height = 0.03999999910593033 length: 0.6257106810808182; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (130, 25, 228): 4 siblings; 0 strokes; 1 pads bounds: LLC: (1.129999976605177, 1.1419999413192272); width = 0.03999999910593033; height = 0.03999999910593033 length: 0.3426396790891886; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (168, 134, 80): 0 siblings; 0 strokes; 1 pads bounds: LLC: (1.7449999768286943, 1.7269999701529741); width = 0.05999999865889549; height = 0.05999999865889549 length: 0.0; area: 0.016592; fatness: 0.2765333395143351; areaDPI: 500; areaPixels: 4148 (100, 30, 253): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.850000095367432, 1.0320000171661377); width = 0.1; height = 0.1 length: 0.0; area: 0.020100000000000003; fatness: 0.201; areaDPI: 500; areaPixels: 5025 (234, 15, 134): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.850000095367432, 0.8320000290870666); width = 0.1; height = 0.1 length: 0.0; area: 0.037348; fatness: 0.37348; areaDPI: 500; areaPixels: 9337 (148, 159, 75): 0 siblings; 0 strokes; 1 pads bounds: LLC: (3.0499999046325685, 1.0320000171661377); width = 0.1; height = 0.1 length: 0.0; area: 0.025416; fatness: 0.25416; areaDPI: 500; areaPixels: 6354 (186, 126, 70): 0 siblings; 0 strokes; 1 pads bounds: LLC: (3.0499999046325685, 0.8320000290870666); width = 0.1; height = 0.1 length: 0.0; area: 0.078724; fatness: 0.7872399999999999; areaDPI: 500; areaPixels: 19681 (155, 117, 111): 0 siblings; 0 strokes; 1 pads bounds: LLC: (0.10000000596046447, 1.0819999694824218); width = 0.1; height = 0.1 length: 0.0; area: 0.023788; fatness: 0.23787999999999998; areaDPI: 500; areaPixels: 5947 (94, 105, 183): 0 siblings; 0 strokes; 1 pads bounds: LLC: (0.10000000596046447, 0.8819999814033508); width = 0.1; height = 0.1 length: 0.0; area: 0.047544; fatness: 0.47544000000000003; areaDPI: 500; areaPixels: 11886 (209, 116, 58): 0 siblings; 0 strokes; 1 pads bounds: LLC: (0.29999999403953553, 1.0819999694824218); width = 0.1; height = 0.1 length: 0.0; area: 0.017896000000000002; fatness: 0.17896; areaDPI: 500; areaPixels: 4474 (71, 75, 237): 0 siblings; 0 strokes; 1 pads bounds: LLC: (0.29999999403953553, 0.8819999814033508); width = 0.1; height = 0.1 length: 0.0; area: 0.01308; fatness: 0.1308; areaDPI: 500; areaPixels: 3270 (238, 72, 73): 0 siblings; 0 strokes; 1 pads bounds: LLC: (0.4449999947100878, 0.701999993994832); width = 0.05999999865889549; height = 0.05999999865889549 length: 0.0; area: 0.027492000000000003; fatness: 0.45820001024156837; areaDPI: 500; areaPixels: 6873 (81, 54, 247): 0 siblings; 0 strokes; 1 pads bounds: LLC: (2.620000095367432, 1.1770000171661377); width = 0.06; height = 0.06 length: 0.0; area: 0.03538; fatness: 0.5896666666666667; areaDPI: 500; areaPixels: 8845 83 collected nets (45 supernets) Thu Aug 05 17:19:48 EDT 2004: ToolpathsProcessor started border: true line: false voronoi: true flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 mosaic: 1586 x 796 tile: 502 x 487 generating voronoi toolpaths extracting nodes... 27833 nodes making paths... 84 paths total length: 55.83200051635504 total segments: 28000 optimizing paths... total length: 48.308479773579165 total segments: 1731 Thu Aug 05 17:20:02 EDT 2004: ToolpathsProcessor finished (14467ms) Thu Aug 05 17:20:06 EDT 2004: ToolpathsProcessor started border: true line: false voronoi: true flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 mosaic: 1586 x 796 tile: 502 x 487 generating outline toolpaths extracting nodes... 28048 nodes making paths... 101 paths total length: 56.095992758870125 total segments: 28149 optimizing paths... total length: 51.087739487877116 total segments: 2912 Thu Aug 05 17:20:12 EDT 2004: ToolpathsProcessor finished (5423ms) visolate-2.1.6~svn8+dfsg1.orig/visolate/makefile.old000066400000000000000000000650251147500217100224330ustar00rootroot00000000000000# Vona's super-ninja makefile # # *** DO NOT EDIT THIS FILE EXCEPT IN THE PROJECT HOME DIRECTORY *** # # This makefile is auto-generated by "make makefiles" in the parent package # # You can (and should) edit makefile.project, which is included below, to # specify project-specific settings # # You can edit makefile.package, which is included below, to specify # package-specific targets and variables # # Copyright (C) 2004 Marsette A. Vona, III # # 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 2 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., 59 # Temple Place - Suite 330, Boston, MA 02111-1307, USA. # $Id: makefile 15 2008-01-23 21:56:45Z vona $ # Relative path to the directory containing the root package for the project. # For makefile in every directory other than $(PROJECT_HOME) this is # automatically set by "make makefiles" PROJECT_HOME = . -include $(PROJECT_HOME)/makefile.project ifndef BASE_PACKAGE BASE_PACKAGE := $(notdir $(shell $(CD) $(PROJECT_HOME) && pwd)) endif ifndef APPNAME APPNAME := $(BASE_PACKAGE) endif # The (full) name of this package. For makefile in every directory other than # $(PROJECT_HOME) this is automatically set by "make makefiles" PACKAGE = $(BASE_PACKAGE) # the default target default: package #figure out arch SYSTEM = $(shell uname -s | tr " " "_") MACHINE = $(shell uname -m | tr " " "_") ARCH := $(SYSTEM)_$(MACHINE) #linux: Linux_i686 #OS X: Darwin_Power_Macintosh #cygwin: CYGWIN-5.1_NT # misc macros # these let $(COMMA) and $(SPACE) be lone arguments to make function calls COMMA := , EMPTY := SPACE := $(EMPTY) $(EMPTY) # whitespace regex WS = [ \t]* ifneq ($(findstring CYGWIN,$(SYSTEM)),CYGWIN) # make cd .. follow the Physical directory structure on Unix CD = cd -P else CD = cd # always use bash on cygwin, sh doesn't have pushd, but bash slows things down SHELL = `which bash` endif # tool finding functions #locate the target of a symlink # #works even if the starting point is not a symlink locate-target = $(shell f="$(1)"; while [ -L "$$f" ]; do f=`ls -l "$$f" | awk '{print $$NF}'`; done; echo "$$f") #try hard to find a command # #first arg is command name # #second arg is expected directory # #if cmd executable in directory, that is returned # #else if which knows where the command is, that is returned # #else empty string is returned locate-cmd = $(shell if [ -x "$(2)/$(1)" ]; then echo "$(2)/$(1)"; else cmd="$(shell which "$(1)" 2>/dev/null || true)" && if [ -x "$$cmd" ] ; then echo "$$cmd"; else echo ""; fi; fi) #get the parent directory name # #better than the make builtin function because this also works on a directory dirname = $(shell if [ "$(1)"x != x -a -e "$(1)" ] ; then dirname "$(1)"; else echo ""; fi) #default a dir # #first arg is the desired dir # #second is the default dir # #returns first arg iff it's a directory, else second arg default-dir = $(shell if [ ! -d "$(1)" ]; then echo "$(2)"; else echo "$(1)"; fi) # find tool directories ifndef TOOLS_HOME TOOLS_HOME := $(call default-dir,$(PROJECT_TOOLS_HOME),/usr) endif BIN := $(call default-dir,$(TOOLS_HOME)/bin/$(ARCH),/usr/bin) SCRIPTS := $(call default-dir,$(TOOLS_HOME)/scripts,$(BIN)) JDK_BASE := $(TOOLS_HOME)/java/$(ARCH) JDK_VERSION := newest JDK_HOME := $(call dirname,$(call dirname,$(call locate-target,$(call locate-cmd,javac,$(JDK_BASE)/$(JDK_VERSION)/bin)))) JDK_EXT := $(JDK_HOME)/jre/lib/ext ifeq ($(SYSTEM),Darwin) JDK_EXT := /Library/Java/Extensions endif TOOLS_EXT := $(TOOLS_HOME)/java/indep/lib # find pure java extension jars in the tools java/indep/lib dir if present, else in jre/lib/ext # NOTE the classes will come in on different classloaders in the two cases, which can lead to subtle CNFEs EXT_DIR := $(call default-dir,$(TOOLS_EXT),$(JDK_EXT)) # JDK executables JAVAC := $(call locate-cmd,javac,$(JDK_HOME)/bin) JAVA := $(call locate-cmd,java,$(JDK_HOME)/bin) JAVADOC := $(call locate-cmd,javadoc,$(JDK_HOME)/bin) JAR := $(call locate-cmd,jar,$(JDK_HOME)/bin) KEYTOOL := $(call locate-cmd,keytool,$(JDK_HOME)/bin) JARSIGNER := $(call locate-cmd,jarsigner,$(JDK_HOME)/bin) RMIC := $(call locate-cmd,rmic,$(JDK_HOME)/bin) #other executables JAVACC := $(call locate-cmd,javacc,$(BIN)) RSYNC := $(call locate-cmd,rsync,$(BIN)) WWWIMAGESIZE := $(call locate-cmd,wwwimagesize,$(SCRIPTS)) # CompileServer stuff # the CompileServer binary directory CS_BIN := $(call dirname,$(call locate-target,$(call locate-cmd,javac_submit,$(BIN)))) # the CompileServer scripts directory CS_SCRIPTS := $(call dirname,$(call locate-target,$(call locate-cmd,CompileServer-submit,$(SCRIPTS)))) # define NO_COMPILE_SERVER to disable compile server ifndef NO_COMPILE_SERVER CS_ENSURE := $(call locate-cmd,CompileServer-ensure-running,$(CS_SCRIPTS)) CS_SUBMIT := $(call locate-cmd,CompileServer-submit,$(CS_SCRIPTS)) ifdef CS_ENSURE ifeq ($(findstring OK,$(shell $(CS_ENSURE) nostart)),OK) ifdef CS_SUBMIT #ok CompileServer is all good! JAVAC := $(CS_SUBMIT) USING_COMPILE_SERVER := 1 endif endif #OK endif #CS_ENSURE endif #NO_COMPILE_SERVER # rmi stuff # generate commands to run RMIWrap # # first arg is the (simple) name of the API interface # # second arg is the (simple) name of the implementation class run-rmiwrap = if [ ! -f $(1)Remote.java -o ! -f $(2)Server.java -o ! -f $(2)Client.java -o \( $(1).java -nt $(1)Remote.java \) -o \( $(2).java -nt $(2)Client.java \) -o \( $(2).java -nt $(2)Server.java \) ]; then $(JAVA) $(RUN_JAVA_FLAGS) vona.rmi.rmiwrap.RMIWrap $(PACKAGE).$(1) $(PACKAGE).$(2) && $(JAVAC) $(JAVAC_FLAGS) *.java; fi # generate commands to run rmic # # first arg is the (simple) name of the remote class for which to generate a # stub RMIC_JRMP_VERSION = 1.1 run-rmic = if [ ! -f $(1)_Stub.class -o $(1).class -nt $(1)_Stub.class ]; then $(RMIC) -v$(RMIC_JRMP_VERSION) -d $(PROJECT_HOME)/.. $(CLASSPATH_FLAG) $(PACKAGE).$(1); fi # rsync stuff # flags for rsync # # excludes the usual suspects RSYNC_FLAGS := -rv --progress $(DBG) --copy-links --exclude "**~" --exclude ".\#**" --exclude CVS --exclude .svn --exclude "*.tmp" # rsync first arg to second arg, with cvs exclude rsync = $(RSYNC) $(RSYNC_FLAGS) --cvs-exclude $(1) $(2) # rsync a subproject # # first arg is filename extension to include (starting with ".", or empty for # all) # # second arg is the name of a subproject (i.e. the name of the base package of # the subproject). If it ends in "." then it is copied non-recursively, else # it is copied recursively. # # third arg is rsync dest, if not absolute then relative to $(PROJECT_HOME)/.. rsync-subproject = pushd $(PROJECT_HOME)/.. && $(RSYNC) $(RSYNC_FLAGS) --include "*/" --exclude "/$(BASE_PACKAGE)/$(JAVADOC_DIR_NAME)/**" --include $(if $(filter ".","$(suffix $(2))"),"/$(call package-to-path,$(basename $(2)))/*$(1)","/$(call package-to-path,$(2))/**$(1)") --exclude "*" $(BASE_PACKAGE) $(3) && popd # this should have dynamic binding so that makefile.package can override # JARFILE JAR_DIR = .$(JARFILE).tmp # make a jar # # does not include hidden files (any file with name beginning ".") # # arg 1: "true" to include javadoc tree, "false" otherwise # arg 2: the list of external jars (none if empty) # arg 3: the name of the jarfile # arg 4: the list of filename extensions to include (each beginning with ".", empty to include all) # arg 5: list of extra files to include (pathnames relative to parent of base package) # arg 6: includes only files in these subproject packages make-jar = \ $(RM) $(3) && \ $(RM) -r $(JAR_DIR) && \ mkdir $(JAR_DIR) && \ if [ $(1) ] && [ -d "$(JAVADOC_DIR)" ]; then $(call rsync,$(JAVADOC_DIR),$(JAR_DIR)); fi && \ if [ "$(4)foo" == "foo" ]; then \ $(foreach P,$(6),$(call rsync-subproject,,$(P),$(call package-to-path,$(PACKAGE))/$(JAR_DIR)) && ) true; \ else $(foreach E,$(4),$(foreach P,$(6),$(call rsync-subproject,$(E),$(P),$(call package-to-path,$(PACKAGE))/$(JAR_DIR)) && )) true; fi && \ $(foreach F,$(addprefix $(EXT_DIR)/,$(2)),cp $(F) $(JAR_DIR) &&) true && \ $(foreach F,$(5),cp $(addprefix $(PROJECT_HOME)/../,$(F)) $(JAR_DIR)/$(dir $(F)) &&) true && \ $(CD) $(JAR_DIR) && \ $(foreach F,$(2),$(JAR) xvf $(F) && rm $(F) &&) true && \ rm -rf META-INF && \ if [ "$(4)foo" == "foo" ]; then \ $(JAR) cvf $(3) `find . -not -type d -a -not -name ".*"` $(5); \ else $(JAR) cvf $(3) `find . -not -type d -a -not -name ".*" -a "(" -false $(foreach E,$(4),-o -name "*$(E)" ) ")"` $(5); fi && \ if [ -f ../$(JAR_MF) ]; then $(JAR) ufm $(3) ../$(JAR_MF); fi && \ if [ -f ../$(JAR_CRT) ]; then $(JARSIGNER) $(3) $(JARKEY); fi && \ mv $(3) .. && \ $(CD) .. && \ rm -rf $(JAR_DIR) # template file locations TEMPLATE_DIR = $(PROJECT_HOME)/templates JAVA_TEMPLATE = $(TEMPLATE_DIR)/Template.java EXCEPTION_TEMPLATE = $(TEMPLATE_DIR)/Exception.java PACKAGE_TEMPLATE = $(TEMPLATE_DIR)/package.html MAKEFILE_PACKAGE_TEMPLATE = $(TEMPLATE_DIR)/makefile.package template-m4-common = m4 -P "-DYEAR=`date +%Y`" "-DPACKAGE=$(PACKAGE)" template-m4-java = m4 -P "-DYEAR=`date +%Y`" "-DPACKAGE=$(PACKAGE)" "-DCLASS=$(notdir $(basename $(1)))" $(JAVA_TEMPLATE) > $(basename $(1)).java # compute short package name from fullname PACKAGE_NAME = $(subst .,,$(suffix .$(PACKAGE))) # compute project name (root package name) from package fullname PROJECT = $(firstword $(subst ., ,$(PACKAGE))) # heap size flag MEMORY_FLAG = -Xmx$(TOTAL_HEAP_SIZE) # compute the package path from the package full name # $(PROJECT_HOME)/../$(PACKAGE_PATH) is a path to this package PACKAGE_PATH = $(call package-to-path,$(PACKAGE)) # command to run make without generating any extraneous output MAKE_SILENT = $(MAKE) --silent --no-print-directory # is this the project root package? ifeq ($(PROJECT_HOME),.) ROOT_PACKAGE = yes endif # flag useful for various tools # put the parent of project home first on the classpath # that way if there are built checkouts of the source trees for any EXT_JARS # then we'll pick up those classes directly from there NINJA_CLASSPATH := $(PROJECT_HOME)/.. ifdef USING_COMPILE_SERVER NINJA_CLASSPATH := $(shell pwd)/$(NINJA_CLASSPATH) endif # now put each EXT_JAR on the classpath, in order, but only if we're finding # them in an EXT_DIR which is not the JDK installed extensions dir ifneq ($(EXT_DIR),$(JDK_EXT)) NINJA_CLASSPATH := $(subst $(SPACE),,$(NINJA_CLASSPATH)$(foreach JAR,$(EXT_JARS),:$(EXT_DIR)/$(JAR))) endif # next add the JDK tools jar to the classpath # in particular, for use by CompileServer NINJA_CLASSPATH := $(NINJA_CLASSPATH):$(JDK_HOME)/lib/tools.jar # finally append the user's externally defined CLASSPATH, if any ifdef CLASSPATH MAKE_CLASSPATH := $(NINJA_CLASSPATH):$(CLASSPATH) else #trailing colon breaks java under Windows MAKE_CLASSPATH := $(NINJA_CLASSPATH) endif ifeq ($(findstring CYGWIN,$(SYSTEM)),CYGWIN) MAKE_CLASSPATH := `cygpath -w -p "$(MAKE_CLASSPATH)"` endif CLASSPATH_FLAG = -classpath "$(MAKE_CLASSPATH)" DEPRECATION_FLAG = -deprecation # source the package-specific makefile -include makefile.package # always exclude these subdirs EXCLUDE_SUBDIRS += . .. CVS .svn # figure out our subdirs PACKAGE_SUBDIRS = $(filter-out $(EXCLUDE_SUBDIRS),$(notdir $(shell find . -maxdepth 1 -type d -not -name ".*.tmp" -a -not -name "javadoc-*"))) # always exclude these source files EXCLUDE_SOURCE += # figure out source files PACKAGE_SOURCE = $(filter-out $(wildcard $(EXCLUDE_SOURCE)),$(wildcard *.java)) PACKAGE_HTML_SOURCE = $(filter-out $(wildcard $(EXCLUDE_SOURCE)),$(wildcard *.phtml *.m4)) # ALL source SOURCE = \ $(wildcard *.java) \ $(wildcard *.scm) \ $(wildcard *.c *.cc *.h *.hh) \ $(wildcard *.mf) \ $(wildcard *.jj) \ $(wildcard *.xsd *.xml *.spp) \ $(wildcard *.txt *.tex *.html *.htm *.css README) \ $(wildcard *.properties *.conf *.xcf *.gif *.jpg *.png *.bmp *.ico) \ $(wildcard *.lws *.lwo *.wrl) \ $(wildcard *.sh *.csh *.bat *.iss) \ $(wildcard *.phtml *.m4) \ $(wildcard *.policy) \ package.html makefile.package ifdef ROOT_PACKAGE SOURCE += makefile makefile.project endif # compile-time flags JAVAC_FLAGS += $(DEPRECATION_FLAG) $(CLASSPATH_FLAG) -source $(SOURCE_VERSION) -target $(TARGET_VERSION) $(JAVAC_OPTIONS) # runtime flags RUN_JAVA_FLAGS += $(CLASSPATH_FLAG) $(MEMORY_FLAG) $(WORKAROUND_FLAGS) $(JAVA_OPTIONS) -ea # javadoc flags JAVADOC_FLAGS += $(CLASSPATH_FLAG) -source $(JAVADOC_SOURCE_VERSION) -private -use -author -doctitle $(APPNAME) `if [ -e overview.html ]; then echo -overview overview.html; else echo ""; fi` # subpackage makefiles SUBPACKAGE_MAKEFILES = $(addsuffix /makefile,$(PACKAGE_SUBDIRS)) # HTML stuff .SUFFIXES: .m4 .phtml .html WWWROOT = $(HOME)/www html-m4 = m4 -P "-DBUILD_DATE=`date`" "-DYEAR=`date +%Y`" "-I$(WWWROOT)/include" $(1) > $(2) html-cpp = gcc -E -P -traditional "-DBUILD_DATE=`date`" "-DYEAR=`date +%Y`" "-I$(WWWROOT)/include" - < $(1) > $(2) # function to generate a javadoc command line # # javadoc will be deposited in $(JAVADOC_DIR) # # first arg is list of base packages. Javadoc will be built for all # subpackages of the base packages. javadoc = $(JAVADOC) $(JAVADOC_FLAGS) -d $(JAVADOC_DIR) $(foreach P,$(1), -subpackages $(P)) # function to make a target recursively # first argument is target to make # second argument is "true" to continue on fail, "false" to stop on fail recursively-make = $(foreach DIR,$(PACKAGE_SUBDIRS),[ ! -d $(DIR) ] || pushd $(DIR) > /dev/null && ( $(MAKE) $(1) || $(2) ) && popd > /dev/null && ) true # function to make something from $(PROJECT_HOME) make-from-project-home = \ @echo making $(1) from $(PROJECT_HOME); \ $(CD) $(PROJECT_HOME) && $(MAKE) $(1) # function to convert a package name to a path package-to-path = $(subst .,/,$(1)) # function to extract the package part of a full class name (not including # the trailing .class) package-part = \ $(basename $(1)) # function to extract the class part of a full class name (not including the # trailing .class) class-part = \ $(subst .,,$(suffix $(1))) # use this target as a prereq to force another target .PHONY: FORCE FORCE: # pattern rules # initialize a new class file %.java-template: $(JAVA_TEMPLATE) if [ ! -f ./$(basename $@).java ] || [ ! -s ./$(basename $@).java ]; then $(call template-m4-java,$@); else echo ./$(basename $@).java exists and is non-empty, not overwriting; fi .PHONY: java-templates java-templates: $(foreach F,$(shell find . -maxdepth 1 -size 0 -name "*.java"),$(call template-m4-java,$F); ) # initialize a new Exception class file %.java-exception-template: $(EXCEPTION_TEMPLATE) if [ ! -f ./$(basename $@).java ]; then cp $(EXCEPTION_TEMPLATE) ./$(basename $@).java; else echo ./$(basename $@).java exists, not overwriting; fi # initialize a new package.html file .PHONY: package.html-template package.html-template: $(PACKAGE_TEMPLATE) if [ ! -f package.html ]; then cp $(PACKAGE_TEMPLATE) ./package.html; else echo ./package.html exists, not overwriting; fi # initialize a new makefile.package file .PHONY: makefile.package-template makefile.package-template: $(MAKEFILE_PACKAGE_TEMPLATE) if [ ! -f makefile.package ]; then cp $(MAKEFILE_PACKAGE_TEMPLATE) ./makefile.package; else echo ./makefile.package exists, not overwriting; fi # make html from m4 %.html: %.m4 $(call html-m4,$<,$@) if [ -x "$(WWWIMAGESIZE)" ]; then $(WWWIMAGESIZE) -MakeBackup no $@; fi # make html from phtml by sending it through the C pre-processor %.html: %.phtml $(call html-cpp,$<,$@) if [ -x "$(WWWIMAGESIZE)" ]; then $(WWWIMAGESIZE) -MakeBackup no $@; fi # build a .class file from a .java file ifeq ($(findstring CYGWIN,$(SYSTEM)),CYGWIN) #fix paths on cygwin. ARGH... ifdef USING_COMPILE_SERVER %.class: %.java $(JAVAC) $(JAVAC_FLAGS) "`cygpath -w "$(addprefix $(shell pwd)/,$<)"`" else %.class: %.java $(JAVAC) $(JAVAC_FLAGS) $< endif else # not on cygwin. Phew. %.class: %.java $(JAVAC) $(JAVAC_FLAGS) $< endif # build Java source files from a .jj grammar file %.java: %.jj $(JAVACC) $< # run a class in a specific package $(PROJECT).%.run: $(if BUILD_BEFORE_RUN,$(PROJECT).%.class,) $(JAVA) $(RUN_JAVA_FLAGS) $(basename $@) # run a class in the current package with a main() function directly %.run: $(if BUILD_BEFORE_RUN,%.class,) $(JAVA) $(RUN_JAVA_FLAGS) $(PACKAGE).$(basename $@) # run a class in appletviewer (specify html filename without path or extension) %.appletviewer: $(JDK_HOME)/bin/appletviewer $(basename $@).html # build a class in a specific package $(PROJECT).%.class: $(CD) $(PROJECT_HOME)/../$(call package-to-path,$(call package-part,$(basename $@))) && $(MAKE) $(call class-part,$(basename $@)).class # build a specific package $(PROJECT).%.package-make: @echo making package $@ $(CD) $(PROJECT_HOME)/../$(call package-to-path,$(basename $@)) && $(MAKE) package # recursive build of the base package is a project build # note the semicolon which makes this an "empty command"!! # without it the %.recursive pattern would get called after this runs # resulting in an infinite loop!! $(PROJECT).package-make.recursive: project ; # build a specific package and all descendant packages $(PROJECT).%.package-make.recursive: @echo making package $@ and all descendant packages $(CD) $(PROJECT_HOME)/../$(call package-to-path,$(basename $(basename $@))) && $(MAKE) package.recursive # trick make into building the base package when asked # if we don't do this then a spurious implicit rule gets invoked because the # base package has no .suffix $(PROJECT).package-make: @echo making base package $(CD) $(PROJECT_HOME) && $(MAKE) package # recursively make something %.recursive: # @echo recursively making $(basename $@) $(MAKE) $(basename $@) $(call recursively-make,$@,true) # fun targets .PHONY: love love: @echo not war .PHONY: pull-plug pull-plug: @echo My mind is going. I can FEEL it. .PHONY: open-the-pod-bay-doors-hal open-the-pod-bay-doors-hal: @echo I\'m sorry `finger \`whoami\` | sed -e '2,$$d' -e '1s/.*:.*:[ ]*\([^ ]*\).*/\1/'`, I\'m afraid I can\'t do that. # global targets # utility targets .PHONY: show-exclude-source show-exclude-source: @echo $(EXCLUDE_SOURCE) .PHONY: show-exclude-subdirs show-exclude-subdirs: @echo $(EXCLUDE_SUBDIRS) .PHONY: show-package show-package: @echo $(PACKAGE) .PHONY: show-project-home show-project-home: @echo $(PROJECT_HOME) .PHONY: show-classpath show-classpath: @echo $(MAKE_CLASSPATH) .PHONY: show-jdk-home show-jdk-home: @echo $(JDK_HOME) .PHONY: show-jdk-ext show-jdk-ext: @echo $(JDK_EXT) .PHONY: show-tools-ext show-tools-ext: @echo $(TOOLS_EXT) .PHONY: show-ext-dir show-ext-dir: @echo $(EXT_DIR) .PHONY: show-java show-java: @echo $(JAVA) .PHONY: show-run-java-flags show-run-java-flags: @echo $(RUN_JAVA_FLAGS) .PHONY: show-run-java-with-flags show-run-java-with-flags: @echo $(JAVA) $(RUN_JAVA_FLAGS) .PHONY: show-run-java-with-flags-and-package show-run-java-with-flags-and-package: @echo $(JAVA) $(RUN_JAVA_FLAGS) $(PACKAGE) .PHONY: show-bin show-bin: @echo $(BIN) .PHONY: show-cs-bin show-cs-bin: @echo $(CS_BIN) .PHONY: show-scripts show-scripts: @echo $(SCRIPTS) .PHONY: show-cs-scripts show-cs-scripts: @echo $(CS_SCRIPTS) .PHONY: show-settings show-settings: @echo Make settings: @echo APPNAME: $(APPNAME) @echo BASE_PACKAGE: $(BASE_PACKAGE) @echo ARCH: $(ARCH) @echo TOOLS_HOME: $(TOOLS_HOME) @echo SCRIPTS: $(SCRIPTS) @echo CS_SCRIPTS: $(CS_SCRIPTS) @echo CS_BIN: $(CS_BIN) @echo CS_ENSURE: $(CS_ENSURE) @echo CS_SUBMIT: $(CS_SUBMIT) @echo JDK_BASE: $(JDK_BASE) @echo JDK_HOME: $(JDK_HOME) @echo JDK_EXT: $(JDK_EXT) @echo TOOLS_EXT: $(TOOLS_EXT) @echo EXT_DIR: $(EXT_DIR) @echo JDK_VERSION: $(JDK_VERSION) @echo SOURCE_VERSION: $(SOURCE_VERSION) @echo TARGET_VERSION: $(TARGET_VERSION) @echo JAVAC: $(JAVAC) @echo JAVA: $(JAVA) @echo JAVADOC: $(JAVADOC) @echo JAVACC: $(JAVACC) @echo JAR: $(JAR) @echo NO_COMPILE_SERVER: "$(NO_COMPILE_SERVER)" @echo USING_COMPILE_SERVER: "$(USING_COMPILE_SERVER)" @echo SHELL: $(SHELL) @echo CD: $(CD) @echo PROJECT: $(PROJECT) @echo PROJECT_HOME: $(PROJECT_HOME) ifdef ROOT_PACKAGE @echo this is the root package else @echo this is not the root package endif @echo PACKAGE: $(PACKAGE) @echo PACKAGE_PATH: '$(PACKAGE_PATH)' @echo PACKAGE_NAME: $(PACKAGE_NAME) @echo EXCLUDE_SUBDIRS: $(EXCLUDE_SUBDIRS) @echo PACKAGE_SUBDIRS: $(PACKAGE_SUBDIRS) @echo EXCLUDE_SOURCE: $(EXCLUDE_SOURCE) @echo PACKAGE_SOURCE: $(PACKAGE_SOURCE) @echo PACKAGE_HTML_SOURCE: $(PACKAGE_HTML_SOURCE) @echo SOURCE: $(SOURCE) @echo SUBPROJECT_PACKAGES: $(SUBPROJECT_PACKAGES) @echo JAVAC_FLAGS: '$(JAVAC_FLAGS)' @echo JAVADOC_FLAGS: '$(JAVADOC_FLAGS)' @echo JAVADOC_DIR: $(JAVADOC_DIR) @echo JAR_DIR: $(JAR_DIR) @echo JAR_MF: $(JAR_MF) @echo JARKEY: $(JARKEY) @echo JAR_CRT: $(JAR_CRT) @echo EXT_JARS: $(EXT_JARS) @echo MAKE_CLASSPATH: '$(MAKE_CLASSPATH)' @echo SUBPACKAGE_MAKEFILES: $(SUBPACKAGE_MAKEFILES) @echo PUBLISH_DEST: $(PUBLISH_DEST) # package targets # make the current package .PHONY: package package: $(EXTRA_PACKAGE_DEPS) $(if $(NO_SOURCE_GEN),,package-source-gen) package-javacc-make $(addsuffix .class,$(basename $(PACKAGE_SOURCE))) $(addsuffix .html,$(basename $(PACKAGE_HTML_SOURCE))) $(EXTRA_PACKAGE_CMDS) # make javacc in the current package .PHONY: packge-javacc-make package-javacc-make: $(addsuffix .class,$(basename $(wildcard *.jj))) # make the makefile in the current package ifndef ROOT_PACKAGE makefile: $(PROJECT_HOME)/makefile @$(CD) .. && $(MAKE) $(PACKAGE_NAME)/makefile else makefile: FORCE endif .PHONY: clean clean: $(EXTRA_CLEAN_DEPS) @echo removing all .class files in this package $(RM) *.class .PHONY: c-clean c-clean: @echo removing all .o files in this package $(RM) *.o .PHONY: javacc-clean javacc-clean: @echo removing javacc-generated files $(RM) `ls *.java | xargs grep -l "Generated By:JavaCC"` .PHONY: rmiwrap-clean rmiwrap-clean: @echo removing RMIWrap-generated files $(RM) `ls *.java | xargs grep -l "generated by RMIWrap"` .PHONY: html-clean html-clean: @echo removing all generated html $(RM) $(addsuffix .html,$(basename $(PACKAGE_HTML_SOURCE))) .PHONY: jar-clean jar-clean: $(RM) $(JARFILE) $(JARFILE_LITE) $(JARFILE_XLITE) .PHONY: javadoc-clean javadoc-clean: $(RM) -r $(JAVADOC_DIR) .PHONY: realclean realclean: $(EXTRA_REALCLEAN_DEPS) clean rmiwrap-clean javacc-clean html-clean jar-clean javadoc-clean if [ -f core ]; then $(RM) core; fi .PHONY: package-javacc-gen package-javacc-gen: $(addsuffix .java,$(basename $(wildcard *.jj))) .PHONY: package-source-gen package-source-gen: package-javacc-gen # project targets .PHONY: project-announce project-announce: @echo making project .PHONY: project project: project-announce $(if $(NO_SOURCE_GEN),,project-source-gen) $(call make-from-project-home,package.recursive) .PHONY: project-javacc-gen project-javacc-gen: makefiles $(call make-from-project-home,package-javacc-gen.recursive) .PHONY: project-source-gen project-source-gen: makefiles $(call make-from-project-home,package-source-gen.recursive) .PHONY: project-javadoc project-javadoc: $(call make-from-project-home,subproject-javadoc) .PHONY: subproject-javadoc subproject-javadoc: if [ "$(SUBPROJECT_PACKAGES)" ]; then $(call javadoc,$(SUBPROJECT_PACKAGES)); fi .PHONY: project-clean project-clean: $(call make-from-project-home,clean.recursive) .PHONY: project-realclean project-realclean: $(call make-from-project-home,realclean.recursive) $(SUBPACKAGE_MAKEFILES): makefile @if [ -e $@ ] && [ `grep -c super-ninja $@ 2> /dev/null ` -eq 0 ]; \ then echo "$@ exists but is not super-ninja, skipping"; \ else echo "(re)making $@" && \ $(RM) $@ && \ sed \ -e 's|^$(WS)PROJECT_HOME$(WS)=$(WS)\(.*\)$(WS)|PROJECT_HOME = ../\1|' \ -e 's/^$(WS)PACKAGE$(WS)=$(WS)\(.*\)$(WS)/PACKAGE = \1.$(subst /,,$(dir $@))/' \ -e 's/^$(WS)if-root-package$(WS)=.*/if-root-package = $$(2)/' \ makefile > $@; fi .PHONY: makefiles makefiles: $(SUBPACKAGE_MAKEFILES) @echo making makefiles @$(call recursively-make,makefiles,true) # make the jar key .PHONY: keygen keygen: $(JDK_HOME)/bin/keytool -genkey -keyalg rsa -alias $(JARKEY) $(JDK_HOME)/bin/keytool -export -alias $(JARKEY) -file $(JAR_CRT) # make the jar # # the jar is built containing all rsync-able files in all # $(SUBPROJECT_PACKAGES), the subproject javadoc, and the makefile from the # base package. Subproject packages ending in "." are copied non-recursively, # else they are copied recursively. # # empty dirs will not be included in the jar # # all $(EXT_JARS), if any, are folded into the jarfile # # if $(JAR_MF) exists it is used as the jar manifest # # if $(JAR_CRT) exist the jar is signed with $(JARKEY) .PHONY: jar jar: $(call make-jar,true,$(EXT_JARS),$(JARFILE),$(JARFILE_EXTS),$(JAR_EXTRA),$(SUBPROJECT_PACKAGES)) # make the lite jar # # same as the "jar" target except uses LITE_SUBPROJECT_PACKAGES, EXT_JARS_LITE, # JARFILE_LITE_EXTS, JAR_LITE_EXTRA, and never includes the javadoc tree jar-lite: $(call make-jar,false,$(EXT_JARS_LITE),$(JARFILE_LITE),$(JARFILE_LITE_EXTS),$(JAR_LITE_EXTRA),$(LITE_SUBPROJECT_PACKAGES)) # make the xlite jar # # same as the "jar-lite" target except uses XLITE_SUBPROJECT_PACKAGES, # EXT_JARS_XLITE, JARFILE_XLITE_EXTS, and JAR_XLITE_EXTRA .PHONY: jar-xlite jar-xlite: $(call make-jar,false,$(EXT_JARS_XLITE),$(JARFILE_XLITE),$(JARFILE_XLITE_EXTS),$(JAR_XLITE_EXTRA),$(XLITE_SUBPROJECT_PACKAGES)) # publish to PUBLISH_DEST # # rsyncs $(JARFILE) (and $(JARFILE_LITE), and $(JARFILE_XLITE), if any) # there AND rsync's $(JARFILE_PUBLISH_UNPACK)'s contents there .PHONY: publish ifdef PUBLISH_DEST publish: @echo publishing to $(PUBLISH_DEST) if [ $(JARFILE_PUBLISH_UNPACK) ]; then \ mkdir .$(JARFILE_PUBLISH_UNPACK)-unpack.tmp; \ cd .$(JARFILE_PUBLISH_UNPACK)-unpack.tmp && $(JAR) xvf ../$(JARFILE_PUBLISH_UNPACK) && $(call rsync,*,$(PUBLISH_DEST)); \ cd .. && rm -rf .$(JARFILE_PUBLISH_UNPACK)-unpack.tmp; \ fi if [ $(JARFILE) -a -f $(JARFILE) ]; then $(call rsync,$(JARFILE),$(PUBLISH_DEST)); fi if [ $(JARFILE_LITE) -a -f $(JARFILE_LITE) ]; then $(call rsync,$(JARFILE_LITE),$(PUBLISH_DEST)); fi if [ $(JARFILE_XLITE) -a -f $(JARFILE_XLITE) ]; then $(call rsync,$(JARFILE_XLITE),$(PUBLISH_DEST)); fi $(EXTRA_PUBLISH_CMDS) else publish: $(JARFILE) @echo PUBLISH_DEST not set $(EXTRA_PUBLISH_CMDS) endif # publish to PUBLISH_DEST # # rsyncs $(JARFILE_LITE), there .PHONY: publish-lite ifdef PUBLISH_DEST publish-lite: $(JARFILE_LITE) @echo publishing to $(PUBLISH_DEST) $(call rsync,$(JARFILE_LITE),$(PUBLISH_DEST)) $(EXTRA_PUBLISH_CMDS) else publish-lite: $(JARFILE_LITE) @echo PUBLISH_DEST not set $(EXTRA_PUBLISH_CMDS) endif visolate-2.1.6~svn8+dfsg1.orig/visolate/makefile.project.old000066400000000000000000000106151147500217100240730ustar00rootroot00000000000000#-*-makefile-*- # these will be automatically set iff they are not manually set here # # makefile.package can override APPNAME to give subprojects different names BASE_PACKAGE = visolate APPNAME = Visolate # uncomment this to make some things debug-only #DBG = -n # this is optional # # if you set it then the makefile will try to find the various # tools (javac etc) here first # # if you don't set it then it defaults to /usr # you can also set the environment variable TOOLS_HOME, which if set overrides # all this # # tools that aren't found in tools home are searched for with "which" PROJECT_TOOLS_HOME = # default source and target versions # # makefile.package can override these on a per-package basis SOURCE_VERSION = 1.4 TARGET_VERSION = 1.4 JAVADOC_SOURCE_VERSION = 1.4 # total heap size to use for JVMs that run classes TOTAL_HEAP_SIZE = 768m #TOTAL_HEAP_SIZE = 512m #TOTAL_HEAP_SIZE = 64m # java options # Report information about use of native methods and other Java Native Interface activity. #JAVA_OPTIONS += -verbose:jni # Display information about each class loaded. #JAVA_OPTIONS += -verbose:class # Report on each garbage collection event. #JAVA_OPTIONS += -verbose:gc # enable OGL 2D pipeline #JAVA_OPTIONS += -Dsun.java2d.opengl # enable OGL 2D pipeline with debug output #JAVA_OPTIONS += -Dsun.java2d.opengl=True # Use parallel garbage collection (available beginning in J2SE 1.4.1) #JAVA_OPTIONS += -XX:+UseParallelGC #JAVA_OPTIONS += -XX:+UseSerialGC # (available beginning with J2SE 1.4.1) #JAVA_OPTIONS += -XX:+UseConcMarkSweepGC # Use Train GC #JAVA_OPTIONS += -Xincgc # Do not use Train Garbage Collection (default) #JAVA_OPTIONS += -Xnoincgc # disable class garbage collection #JAVA_OPTIONS += -Xnoclassgc # (J2SE 5.0 ?) #JAVA_OPTIONS += -XX:+UseAdaptiveSizePolicy # (J2SE 5.0) A hint to the virtual machine that pause times of nnn milliseconds or less are desired. #JAVA_OPTIONS += -XX:MaxGCPauseMillis=100 # (J2SE 5.0) A hint to the virtual machine that it's desirable that not more than 1 / (1 + nnn) of the application execution time be spent in the collector. # 99->1% # 19->5% #JAVA_OPTIONS += -XX:GCTimeRatio=19 # workaround flags for runtime JVMs #WORKAROUND_FLAGS += -Dsun.java2d.pmoffscreen=false #WORKAROUND_FLAGS += -Dj3d.sharedctx=false #WORKAROUND_FLAGS += -Dsun.java2d.noddraw=true #WORKAROUND_FLAGS += -Dsun.java2d.d3d=false # jarfile names JARFILE = $(APPNAME).jar JARFILE_LITE = $(APPNAME)-lite.jar JARFILE_XLITE = $(APPNAME)-xlite.jar # filename extensions to put in the jars, empty to include all files JARFILE_EXTS = JARFILE_LITE_EXTS = .class .txt JARFILE_XLITE_EXTS = .class # extra files to put in the jars (relative to parent of base package) JAR_EXTRA = JAR_LITE_EXTRA = $(JAR_EXTRA) JAR_XLITE_EXTRA = visolate/LICENSE.txt visolate/README.txt # the jar manifest file JAR_MF_NAME = $(addsuffix .mf,$(basename $(JARFILE))) JAR_MF = $(PROJECT_HOME)/$(JAR_MF_NAME) # list of packages to include in jarfile # # all descendant subpackages of these will also be included # # makefile.package can override this for making sub-project jars SUBPROJECT_PACKAGES = $(BASE_PACKAGE) LITE_SUBPROJECT_PACKAGES = $(SUBPROJECT_PACKAGES) XLITE_SUBPROJECT_PACKAGES = $(LITE_SUBPROJECT_PACKAGES) # 3rd party jars, found in EXT_DIR, on which the whole project depends # # these will be folded into built jarfiles # # makefile.package can append to this (or override it) for making sub-project # jars EXT_JARS = EXT_JARS_LITE = $(EXT_JARS) EXT_JARS_XLITE = $(EXT_JARS_LITE) # name of key used to sign jars # # makefile.package can override this for making sub-project jars # # presence of $(JAR_CRT) triggers signing of built jarfile # # make target keygen to generate the key initially, then check in the .crt file # *in the base package* JARKEY = mykey JAR_CRT_NAME = $(JARKEY).crt JAR_CRT = $(PROJECT_HOME)/$(JAR_CRT_NAME) # publish rsync destination # # empty disables publish # # makefile.package can override this sub-project publish PUBLISH_DEST = /afs/athena.mit.edu/user/v/o/vona/www/Visolate # jarfile to unpack at $(PUBLISH_DEST), if any JARFILE_PUBLISH_UNPACK = $(JARFILE) # name of subdir in which javadoc is built JAVADOC_DIR_NAME = javadoc-$(APPNAME) JAVADOC_DIR = $(PROJECT_HOME)/$(JAVADOC_DIR_NAME) # uncomment this to disable the source-gen phase of package and project builds #NO_SOURCE_GEN=1 # uncomment this to ensure code is built before it's run via the run targets #BUILD_BEFORE_RUN=1 visolate-2.1.6~svn8+dfsg1.orig/visolate/src/000077500000000000000000000000001147500217100207355ustar00rootroot00000000000000visolate-2.1.6~svn8+dfsg1.orig/visolate/src/ATM0PCB0-three-ways-med.jpg000066400000000000000000001736031147500217100254100ustar00rootroot00000000000000ÿØÿàJFIFHHÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀ¦€"ÿÄÿÄR!1"AQaq2‘¡#B±ÁÑ$3Rbráð%4C’¢&5DS‚²Òñ6csƒÂâTUdt“eÿÄÿÄ7!1AQ2"3aq#‘BR¡±4ÁÑáðñ$SbÿÚ ?9Ø¡ øã¡k‰¹·`ƒÇ8þ5\©iž9Àõ¤ý¥so¡ÜºpÙ õ× Hr„†ºžT¯xà°ã :sY˜{,’ÚÃ+_ÜeÐ1ôÈùÔÛ²QX_ÜŽsÿ½:û†Æ£b±°è—Ò ö̧+×ʳc²œ/ÚÔ¿‘ðƒ‡¼¸ÛêøÑHfP°ð|¸¨me'¦î|{â½'dìcMï~èŸÖfÆŠ^B‘¥Úز‘UHŒ˜bg¡¬å·f4Û°LZ„Ž­ÔUç±¶‹á7S×#§_pØÐ.$@ *ÃÔðk¸`@½³Y§ì}¨l%ä߀©ÿ#­ISéÅ÷Æ™ˆ*à•õÔ¼QÁÂù“YqØÛoÕº›#¨âºŽ´ æâSê —“YËp@#Øcò¨°Á £"³?ÈË6“˜!Ø›@|W3gÈŒsE/&Œþ¨¼v7 GåY±Ø›ùÔùö”Üh±h}§Ò~yXÉ';¸öÇi^A›®ÉPqÔt®‚ȽóÈ®¦H$ ãŒÓØ×Šdðzž•#<£p>¾µüŸ<ùšê >}8ò©œŒëê( !$‘@…¦‘#ã.ÁG×5Bê6# ÝÀ3é2ÿGÚ™7ÞXÂÁš2®Ì£ŒàqÍ(±Ðou 8îb0ˆäåw¹Ç¥%lµVÙ´…€Á7–Ûˆà‰—óæ¤º…™ÿ·[þêÿÊÉêKŒ=¾¤ü+§²šŽ~õ¿·éøS¦cäÖüu™9¶àŸ1*óù×–þÈ å¹G½Sûë&;+¨žò þk`~U%ì– þ!%¾|ÿJß—S 1òkWQ±|u°n§ôËÏçR7öGƒynéúaük${#¨ ÐcÞFÁüªMÙ=C9ï Ëô­ü(¦=1òjQ´FÇÆÛþêãö×Mõñ ÛopeƲòš‹d+[“ï+ çòCQÁæ|Á•ý”©†˜ù5ƒPÓÛ“yl¯|¼þuã¨YFAøÛvÿš¿Æ²¿ÉHÈ€þ«þUÖ잤<@ÁÏOÓ7ð£æŒ<šÄ¿²#"î×ɦR*ÅÕ,AέI]òôöçöÖ ëDžÄ4ö±¶rW¾bqòÅNÏG–ø´¸±”â ;nÜc4[Ç&ðj/ å¯FeÈüëÇS´zöÜNõAüsXÿä¶«ú† c‘Þ¶?eOù1©±û“ÐÌÙÿËFâÑ&³í !‘í¾= ÃøÔ¾Ñ³`3yoNùrãY!ÙMUTa#ÔJô×’šQý o3ßý4· 1òkþ>Ý[‹Ø±•y©|užóËqê(þ5Ž^Êꛇ0Žsý1ÿÓS~ÉjÈÃ-Sé)ÿÓFþL|šõÔì·ñVãŽs"þ|ך{ ‘Ý@¯|¹.y¬`쎬ïÖ1ŽGéIÏåR=’Õö†ÌxŒÊxü¨ßÀhõ8®a¸!âfêJ0j°/\+#ƒÆ¾c¤$‘ö“L-´N·­ 2Ÿ¼»zs_Q’6#b¶ç?ö§D5NŽ)G%•½@ãð¨¼_k† :6852žm£ 6?my¤î‡C)Ç_/•RD6x±-÷¶ú•ðŸ¨=E%»íPL¢.¤õÝÁç¯Jv̦&ý'‡ça­cŽKÛ$Ø¡ä×?Q9A%æýbzã>ušÞ¤ZÃã2ù6ølfk7/ø\~£ZG|lڽݚ‚걉HTÂ-Í&®Kã2ùÃ@p5p&à`/FÏ?çÚ¤ÚÊ3`Ä»‡G•!cŒÔCÔþ/+îŒv×éÞa~éë^7‹¼mlúšR§š¹qRú¼«¹K§€ÅæF*ÂLŸ?*Ú9YFOQC…ݧv*>3/’—O­Ùžÿ-ýÚçu”É› :œ×ó&»´úÒ}^O%,DáMªwL yµ8ä’2JJô"« œÔ„yÏZ•ÕN÷ezk±~ù&]¥—ëJõM:(4þúà \íÀÁ¿ö¦QB<óø×;@§ù36w½~µÙÓuYûœV?ÒvdLºkpа)Àà$¼ hÛ¡nè7##Ž~t”âPv‚<†iˆbúD¨>ï@zµô1“>T|R01Ó‘IûZÛ»90NYNGPsLƒ•oQéJ»XU»=&ë'¿eÜôVjc²· ¹CóœãŠ´©S¸r¾þUM£iaŒg>T“_Öç^óNÓ3$ûKHéú‹Ž~F‡È ou+ !ú{ˆÑ¼€ñ7áÖ•¿l4äb+—ÇFUö°47g4M>÷MŽþeiæbC‰!XOãZD·†½Ô*õPÙCI=ÇhGü´³ý[k¶ö!?õQvËL#ô4L?Qâ9?†GçO£îXxã<Ee»Ikl{E¤ªÅɉцäulöÁ2vÏM BZܸõ £ò-]¶íf“,€4²[7—Ñÿ$~tí`HT¤qBþª ÃʆºÒ,oAÙ¦qÉÆâ(ØAi?y¼s†U¨ëQ9V¸ˆ¬œÚU÷gwÝéwcáAÜðÈ|8ùtúŽjÉ»C«ÞX°´Ò$]ËÄ£sî<"Šð 0íK^x§û;N„Oz焪aìÕÍÁê·¯#~´IÐ{sû€ª{"Ú{Dá$?i1Ì¢Nü½EjÕäU±×Ž´?”vg.;!6Ÿs-¤ê8eoÞ0GçUØö‚÷Iº VþŽëù¿ãZfÆ_>B—kk§> Ô]?TžN}½éjòUÔ*ÊyVy?d4}WW±³î­¬žþÍIHU”ý\€r*ï·5mrá¬l-ÖÊT\Ì]ù^~Cöf‡Ø(Ò\ê––£t×QÄãÉ'è9 WµZA>)›pó¿îE—em#ý%ÛIu;rÌÌv“ò¾™.§¡ÇÙö¤ûƦ•/#Ø…§i4‹¹{¥¼U“8 &SðÜi¸>©|ˆ4šç³ºMê’Õ½ÚGÓ§åJtˆî4.ÒýŽgy¬§Œ¼*Ç;^=:tŸfÇN«ÓÌùÖS´@ÿ*´5þÙÀ?:Ó©îó»‘ëëY­y‡òÃA'iPÄŠK4d炨â§ß2Ò:|ªÒ™åq“Ôf«1•ÁSž) éÃa€çȃ^G v~D׀¼`ò¦¼„°*Ýzæ‹ 3=«Ô´öäÇ/ì¦}—»7dýCûM*íS¨ÙOËøi¯eÀþNXœóÝôõäÓ\.à§<àŽ¸ýµÀA'úÔ”á¹ÈÇ·tŒêÝ<‡Pi@‘Ÿ |ø«c8ëŽùæ–ßëZnžÁ.n•ó´!oØ8¥OÚñ3}—s-ˆ?í z{ŒŒÆŽJÒÙ©Ëd†ã©ò®n#€x¡­¯­î,þ íÙwo9{ûÒ9»^±î’ .æ{4>)Ðç¸ãñ£½ 'Viƒ2á•øƒV©/93Ö†±»¶Ô-#º´4rè~žGÚ¯ÀÞI8Ç•*<@®ìõ‚Õ/¾ÌÒîo1¹£BBŸ3þ|èðQ‘sçëBêºjê:]ͪðÒ)\{Ò•‰t ­ÒûSAswp;•@z+š×gâ‚Ô´¥øKÛ`\wg€ëÅO³úÜPÛG§ê [ÛaݲÌp²À ž3*¿\×íÊKkR·7—Ç1Üž3Çó§uÀ÷opÍRmGH·½*Ê€•MÐãëLAÏ }8§}™¤ZX·-xlt$œœ}M¹WíDžêÜg¨>ufõ+Á#Ô*©“wOôÍI^AéäzÐÎAñu?uëRG’<†¥úæ—Çq%ô1»uYýzL¶©PCÇBpŽOmW•¸>õÀýì0<_VÆò_ûйˆe'ï&9Ê€Hù}ŽW´¶­ÿýWê=½«ê„Gp¸-²AÑúãë_,´ðv’Ôƒõ£ãÛŠún3Œ®|ñÃP¸+'¸ã¡W).á'®3¸~ú—l›I·¶Gø<4{vLI\ñ‘È>Æ©š&A¸0dþ¶ß/ãTŒ˜)t$ÈZ6óDzz~ZûMðà_l{¤;Þ'*Jò ñõ¬4ªÉonKƒá8Ç—&¸ºÙiQ—ÜìèÖ§$RÀ‰h×GJ†êæð+Æ“·g¨•æ¼_ªL˜Îj£!bØ¡E²­÷¼ÕŠùü*ØÜÍt‹;ó°d|uÀê~•Fò‡ŸJ©b”U´%8½“)éSSmÓ*2¨Ãä g¹þÈ''éV ðÁEg(J;´5(·I¨±©gÍA°TqƒûjQ@Ò¾ÐkKs¦]iÚeŒZkÅ íÄ"yîd@Ì7tDÏ:Ì̤ƒÅklµ;=cJ¶·¹º[[ëdøá%QÀ9ò5ét-§Ïc«ÕIöî#°—Rš÷ìýd‰ÚlˆgØYEIAV*zŽ 2–âÚÞ^øÏ·Ýwm»$ñœôâ–©$äòO&—ñ%ÈtZº¤\½jCÊ ¿º¤ ȯ(ï'ÅH ¯~溎OZTÆ^«W*ñU!Í^¢¤e‘¥G[Qü™½ø¼$gæ(˜–‡í Ïfî$§O>zWOI*ÊŽ~¥~›>pø”‡¡üi„D>2îƒuúÐ,@cÁlóGD†=*bx•¹ ~‡÷×ÖÀøáØEl 2i'jGúŠ@?ï8ùÓ¸Üîl޼I;R?ÔÇÔʹÎô©_;B3dîÕP÷‰éüj®Ïi‹ieÞJ7ÜO╈Éçʃí1‘4ë ¼Ê®às‘ýëA‡Eš3áe =Á§åŒÏvvàéz•æ2ïË öü9­B‘‚x9ó¬½ÕÄZ—k,¾-ðª{ç^ƒÛ5 »¸v3\ºåbBÇtŸ¸@Œ=G5×NîÒè„qãò⨴²ÕuxEãj3Û 9HÕÛîû`Š SÓ.mµe¿–i&|$»)Ó‘ÎhKt:Fè2s“óÇJ·”Ú 1ǘ"²c³7¤õÝÏ 9ýUãÙ»ý¡W\ºÀ88/ÇüÔWÜ(·´ u=V×G·rU¿Ip}òÏùò­$(±"Åð¨.|‡ï¬—dcø}_TŽcÞÏ ß9$‘“ŸÙZæ ž™È*)5J„Ø^Ð-g…ïàÅÄ@È^> ǟΖiצ¾³K¨.cxÛ* "pqéZmNbt›Ð@æÎGµ/ìˆÇfíÏËùgõ ~G{ Ý»WrIñ£seSøUz–uÕûOU™§Ф}ê+Qx?˜Ü/vÝ>TŸ±¡‡gc<d~£Þš|ÐvÇB6!M˜ÀQåY]†Ú[MW‘ 㻟ëÆaúV°1-«y__‘¥ÚõˆÔtK˜;¼Éè=T§¸†7`©„öòkãØÒÎËÝ‹íAiaý  œœ?¨Å5!‡8Èô45N€Rý$™¬Î¬vv×HuêTçËšÓ„ ©?QY¥'PíӺ䥄;Ÿ69þ'ð¦¹ljAY?â+-®¦ÞÖèCÔŸ¯ZÓ…yúÖo\`{_¡©ç³‘Ï F˜x9ñ Á;ö¯%FÓÇʽ‚Ã`¹©D~µD çz‘nrÆyÇ•Lmë¸|ñ@Õ.ÍJÇÅ“ÝÊFyýZª×Sž×AÒ¬¬I{r‡hÇ 94GkÍRÇ,!›ÿv–ØÉö}Öƒ};o5©‡y#dùÿž´/ßʘÔönæáU§Ö®…À2’ŸÇ8¡_ZÕôRÚ]Þ.ndÂÚÏýlœx½Îkbª’ ojÈvžâí‘ HX¦]àƒpÇ>½iíÁ ß! e Ù«ß¢_jw'!]rY½­=®ÓƒCqo,7[v|8LóÓÆÿ8ªu«¥°íT7ND†Ñœ!8ç$Q\¹l\ŽÎI# ÉÉ?ŽÎ”“±µµÓ4‹¨û%Œ™Ži•Ü.zä ô¶~‡ìn—ÇÝ4F"C‘è@Æ <Ñõ¥Õ4Ýw «¡mÀm<œÒ™ûUlfk¸ôy. Œótª8ù?}>âVÙ Yl´Sñ1˜ûÙZTO4 4ü©`x¿´?ZÎößRµŠîÙ‹Ã(Èlr=A:%AYIÈŠLD“ŸJ´Ê¹Ç?ãXë{K½k^Õ“í+‹qm( ±³`ä|Æ:T¡´»Ò{_¦@Ú­ÕÄs¤›•Üíàzf„[K³5zM†¤¿Î­ÒCýa•üÇ5]އ¦é®ÒYÚ¬rãòY¿“J¯n/µv}3O­#µUi¤î$ôýµ^Ÿw©hÝ ƒI¿¹7¶×*L¸‘€$‚zãñ¡Xš?ïqÏÞ Œ½[ùúÖS¹¾Õ5ÆÑ¬g6Ë BI§ÈÏ@Åú¯gõÛM6öí¯lïIH¤¼õý†’VcV )'Ÿ—¿µS¨Ÿs%¸Ý8Œ”ÆsœQ€OÔT°0w=|ų§[örç³9¿hþ,¡ø†•¿H²yðyÇ¥5ìs\/f-~%[°ÛÍ7¿•sÙý*æàOsd&sžp~€àÓÄj#Ù„¢*}‡'döø|Gvxù}kʬ§ÂX{yÕj˜;ÃãÓ¨ôÅ^»\®9oN˜úÒ&Ï—Ú½§µcÏúÙ¿e}KfW8P§¨ë_,·=ßhàfRØÕ߃ò¯ª!W@ÈÊF:‘ûE ‚²{ŠˆÀç‘鞿ƣߘIi‰ºîFò…\cËËçU:¦íÊd_ãTŒ™ aàËŸB?ˆ÷¬ ÉAm“âμk›HA#Ó°ìjmñÉå×>UÅׯ‘ ùØ+%ÍÌvðÒHÛT{×§¹Ó­'hY/®„m‰'@ŒlŽ*7³3[ÁÚ[_Š E&è·1ÀRÊ@9ùœ}kiq§ÃîÔÎ …éþŸI‚†¦¬×¨Ï(ÏMч»Ó†ÎêÊ_‰´¼~îÆ|ãk#_E³Ó´®Àh{¨mžþQ‚:–?Õ\ùzšÍÞZC¢i¶–YîµXî!ˆõDãÜÓô²à.˜Ùãø×d1C –H­Ñ‡«,Î0“Ù™ÝB]ZÕ×[{™mnTÂC»H;W`ãÛ¥÷òòâuAÈìáG–Nq^FÔd2Ûq:†ˆP\z€O4<é%¤ïèRDá”ùóú‰æÈ–´vàÇŽ év2ø]S†Òk«™mn­£DÀ Ù z®8úsD]]-Ýì· »VG,Ò”ÛÁ4ûdŽ<©à@Ü}zŸ•X²”‘‚:ƒåXgžIÁ)-qb„dÜ^áÛúW uhpp|èÝ7ᥰÔîîRâ_„DeŽff g ÖðÊrÒrMcަDàççU2®OίI-®t5½Šà˜Lb’9\0ÁÀõ ¡ÄÏpNò°ÆdeO¼ÝêEhúiÆz;“Ñ”uö @¡Ž1Ò‰V•l Λ%òE,=ÜËÇ#dƒŒ‚•_fDòI¿~È¡iœ'Þ!GAïÒ¢}<Ôôw)e‹‹—dœ|ªÀsŠOœjRÜ­¼¶æé#nÎAÁÒ¯VÇ6b•H¼sSVŽH|56Y.¢Ó¾R‹näÏô‡vsý®8Ås‚úf¦°€:yÓÁà–¤¬Yp,ª› µdgb¿ws\Óz¤Ù²T¨*>j½|/òn첆ÀR3둊º>¦£®îœ»Ú@ðŒçÓ#5¯Oõ†c>m(AâŠ>£î“š2>Ê”…Ë`’HéÀü("; X±Á4}¦—rÙ8Á<ž¼ úøù"†ÜÀ1Èô¤ý«ãEe\SÈÂÊ GØå?…"í[ÒS;åýõ=Ñ܆°BúLÉ8+w–õg5œÓ4ý[RÓãOhtþU´ß´ÎÑvrB§‡*¹¦Ö‘¤6Æ ˆ«á>‚šul|iúu¶•ŠÚ<÷Ÿ9fùÕ¥v^ÍÜpvôóÔ nò4¯^ŒË¡\E‘ ¨ÏR•Kw¸ Í0)Ò,·&àŸjS®óÚ-sÞ}zŠÏ´Ö¶ºU´*$šéP'vªG#Œí\–ÇYÕ¤ŽùöZÉÌJxeú`þuUóX$jÈ ¤“èO-ãžzŠÍ÷ýªGÜÛHÃýá “ÿ7î®}—®j\j‚à ûÉÉü¸üÍ*a^J-oí4ÞÔj2Ï.Èfk(, ϶}éâö£HEÚ.Û†'?º“êýž[KXî,´βÂAïåLt‘¤jö‚hì­’AĈcVôéG({Ô5ý.êÎâ(®I’HÙPÜd‘Ç$~Ú³ÚæŸa¢Ãmq1Y¶áݹêO˜¦Í®›k¥Ü9´·ŠB„FÂ0 8òâ„ì¬:eööó]Gžó|`²óÆr:P»j›´:[ÛÌ‘\’] €bqÔ|¨Íkz~›£­­Ü¥dWbTFçŒO†á÷zŸŽÚŒÝ¯Ñâ…Ý'.ûNÄã'Ó‘ŠbÚ6´§ÚçÚ1ü)jl,m´ ä†ÒåÊ€V0çÖŠ@«±F“Ù•Ô송tí “’ÝÜ` /‘æ=‹³?ö»Œ})ÆšÓlüÂÆåðõ÷¦Þô…©™cØËM¸ø«œ{ÅQÙx~Î×uM1÷1tsË=ZÖ8 †¬½ì‚Ó·¶2ãg{BsÔàÿ… ÞÁmš¥Ü7ìÞu™×1ü¯Ð‹ NykP ¿Qס³Zº宄7ç?#R¹@.Óú¤–óº$ÝÃŒæ?}K»ÂðI^x®ÎHó¤—Þ=㺣÷IÀóµåb¾[—öU¹Wq»4íQÛªØWúºÿv˜è–0j’±‚åãh¹c“Ò—ö²=š­ŽÐè'<ÿv›ö\ã³zyÈ8„qŽ”#I?•P¾ãC¾Ó­Û»×æ‚Ö5ÈÞ (=4»DÒÖöí/¤b–òw¦i~ôÌ<ý…2ž7íh.¬®®ŸbT¼j¤$qŸj‚¬ý©¸0[!ƒD„ì,£\yj‘Ý!~®ÇY:ާióH­»…v}·g"œAÚm-:8¤ºÚË©Û`c®)üv°Cl¶ÿ€.Á<5SivYÁ±µÇ¼Kü(¡9'Éžìõ»ßvêÞ27HÒìo|×4îÒiú~‹Ú¼WGÝ<csZØáXc¬aP}ÕQŒ áµå´—¤…?Zdß‘7d­&µÐÊÏte™åD=QXð)ôkŽ˜*|³žuw»áO#¦ev<TqëŸßG"lÌ}›­Xjº…Å”0J·RÌŒ:åÈ9¨ÛXë7¡³½Ôá·Š+eqú6ÎìLšº{‹ýk[»°²»øK{@’©%™—f½¥]êZvºº.©8»Žd/opFŽ úþß$hÙf¡£_éSH™DÒ(Ybx\yT´ý3QºÕSTÖ%^ö+o'*„õ'Þ«¼º¾ÔµÙ´» ‘o²šeÎrzƒUi÷:–“¯Ã¥jFê+•& Êᕇ8>¢…¸; ÍOJ½]Uum*eŽëfÉþä«èjzN«}«C©ë†/æÙ0C ð‚|Ï­sRº¾Ô5³£ØËðýÌbI¦^£>@yÕ·º–¯Zéú…çÆÚ^’±Hà ïê?;£VÄwã×ÌðRëgdñV¯– óãöŠ¢æe³µ–y3²4.GP@ô¤A`m )J‹“‰yOÖSåYX›´z–Ÿöµ¥ì0£!xíÙCn_,ñéN4 Sí}" ÖA¹Y<ƒAǵj†HyÊ89ê5fv6ãΪ(9)ýœp…IJºíaûˆ >kk‘Úkf#ë–äùxké¤á·.žœðkæ½£€°ÈÓztÛ_Nð"6ÑǘÂ…ÁY=ÇNóÁ8ÛäyŒÆr0cüêlA áÈòçñóªZIb|¨R™þ·_àj‘Œd3À7î5„ºRm¡Á7É´ƒý³[å1LK(ñ%ëßûk tŠ!M­þòAO®.¿é£³¡÷±CÇ2<餬׬íE¼Zƒ˜×„ï\¨ö$(":|éÇdû<½¡ÕÚÞY C÷’`rF@Àùæ¼þ™äsQÆ÷g~eS\v[³7ý©Õ~Ô¿žSošgl³‘ΰ«?Ò~¹k©ÞAefÝà´ÜÇBÇœvõiÖ èª`X¿G$‰ÆÑýQûÍ|ÒUÎúôsfŽ(úPÝ÷g6O$½Y*]ökQ]6éõ”†âxQƒ–ÌE@ÎëK{Cq Þ¿{=¼‚H]Ë+ŒŠ\ˇ?Ý©(ݬ2uqÓFøºeŽZ¬8C¤ê6¿3ÛÝÁÀpÇ¡'pÇ9©_Ý¥î¡%Äkµ]‰Ð9O‘«¢Öy2ÊqQf˜ðÆrGs½:ÑšV±q£5Á†(%[€D™KãÌzÐ!WûÕe¬+9Ÿ¼îà^ñÄc,yÀêj1jÕòò^U¯Î·q}d¶ ¼QFûÔD„r~´¶‰¬îšx+Ž9zæ*äŽ9t潉&ˆ,ÝËÇ6 VÀ#œ ð}*«h…Ôó«3wqDe}ƒ,TyëW%“ÔùžäCÒXÝ-ƒ&Ô®/I6$cŲ5Âç×çS´y-åY¡}ŽªyÇåC‘Oc5Ô1ÏrÂ9"˜‚y¥[§qqÝ–!R6‘öòv¨ÉÀõâ³Ë ž¢¾JƒÇéº[ >.YÑP¬hJÆA>µd`ah „½†y#¶šÜÛ•²¸l†Î@(¨å\æêa‘Kõ7f˜\~EH!|êÁ/ZÍ…:õÍÜZ~Ÿmu2M)¹••V/Õ ÔŸÇ¥e‹ò½1/&XãW ÖéÇ­ëBJ¦6dnj*3×§JÆqqzY¢jJÐtG“ò¯k »³— ãú/?˜®E×éVj½ßò~ó½MÈ"éïåùÕ`úˆÃ7µŸ.¹.ÃiãÛÊËÅcp‡•?Ÿ(ob$_xòÂÇ+is€‚=Ç­}„ñ­o¸Ê<£rõö¤ý¬;´ÈN=úŒþ4æ Ø9ô?*GÚ€éc‚ ¸öëR¹Gj'ÚÏgˆÚ]9¦ê›!£FyöéIû\AÐr§ƒ*gœ~Tö ½ÄxÉB£9ùSì3‘98\jÍY[7inæ½¹‘þ7+Jq¸:sªÈ`Ò¯$FÇè_iã?gÔE¢Úú<üɤ¼°¶Kh´NÔÚ˶¸]ƒÐ7ùÇãZ†ÆÎñŽu$ô¬÷k +~‚áfØÇ?ç¥YÚ gYZ$†?‰,„@ãøÓ{¤ oN…ˆ7°äFeLkÚPä_DŸŸÊ³÷)%®—¥Çr`âY%,yú]†ÿEøY>"ÉmîDÛŽO±ô¢¶²©Æ»¥þÙ¨/O”Ù^)à£Søtý”«~¥Ù‰‘ÞóMcƒœîåŸÙÒ´-¬X »7)Ý8Ê‘É?N¹¡¶€[ö^k‹s¬Þ5ÌŠxx_¯º¬Ô»1m<âæÍÚÒìr¯ÂçéÒ‡=´µ‰ò–·R =@_ãL4ÞÐiºÄ†(^H§=ÌË´üÆ8?CFàí}‘ÚFð¶²€0H?’Š¦ã±³ÞC+ÞjÜ]ð8Ϲ'øV¡H)ŒõUz’¤9MEŠÙ쾨g´û:ä½´ë(àãOÈÇÝãÛʳݤҤŽt×4ѲîdO'GòÒ9¢X¬ì§ší‡ôdpÓ­ðhu N :Á< Xú ÌÛè3vŠÚ]GSvŽIÎ`@1±|Ž(‹-óS¼KÝzAáæ;eÁ ó­N!xVéô¥Àî¶FcCÔîìo[DÕ»åþ‚Vÿx¾™ó?¶»¬ݲÐñýW#Zïm!Q¦G~ž ‹iB©ªuOk4 å£-ø‚håØ×®9œgŸQVä0çU|ã ‡ýEIY2øR2[>Ý*%s€j``r+Ÿtç_ÌPKµE†«bO$[Î9þí:ìÆftï=Êãž”£µØmZÀà‘ðÓÿå§]—ù1§¸ßçIw4—µ ô¨ÙûEÚE Iðàg“á4GbHþL[c®÷Ï¿ˆÕZRÿÒNÒ.Â~çŸ?tùÑ‹쥨 úÎAÞ4!K½Æ¥afÆ;»ˆár3†=EºÖòÇßÀZBFüdú U}m ïnaŠâ!š;:s#ó­¯ú1ÈÖo};ÿ!X¶éõ­·ú1_õÅëò1ÿ0®?áÿê"vuŸE™~Ô.;C©þC~ÚC)•h;Z6ö“Rÿ|inˆ‰?h-!’$•ˆ1¸Èo À?Z¬ÕžKîT'£ —ØVÇ“ýÚ¾ÂÎ}Böß,ƒÈr|€õ§ÐÙê ¬ºˆ‰mã1@ªblŒ@ÏLõô«;-MÙ­dDÂ9¥{x¸åUØ‚3éÓ"ºaÒüê-˜Ë«ù’˜¨:Ö“•9?ºº;5…η¥úñ+ÿg¨_¯f^k+·†ÖÅ»™î®-ÖY'”óÀÇ.€RÙû[«À̲Y¼2©1ºÚF:mê+yâÁó#8çÍ7³8;9 þ»Ó0Ny‘¿ôÕ–ºBYÜà×t¥ÜJräæÛWÏÚ[»5°7Z­¬op‚@«`´ëqD[ÝÉ«ëg³ú©Šhå”,wD±´mƒ‚09ÌkµKüû’òä’i»]Áïmþ1šö•(ù ÈãÔŸO·F‚ÂèÜÛö‹O¼r²AêÙÈ¥wpü5ÕÄ(år<ðhWpY‚*å–d¦î;þYÝœ*2Ûð5ä0\£BuÝ5"\6È£”?Uæ…‡N‚ÖàOi¯Z‰b\«“Åå»Í#2yë¶‹ˆ… î+9õ »Ó¿åšÇ„t)møC{t8äî–)p`RªãÈóV£ =ê]›h§º¸†æ#41[I8ŒeÆ|³QÓî佂àͧÅlñ2•1»Aòäœô¬òá–húÉÿ±œs¬rôZý¾å†,€=ë°Ë=º•IX(}ÁO ^zUˆAZƒànÇL×Êâèé”c%RV\îű$’ 4TR`úRù·Ê½¥çŽ0q¼ÀéS¥ÍýÙM¨¯± ²GÊŠ¾çЯ#EÜZãk1i©_(%µkEKE,ˆyÝ€~ñòæµ2‰GºIÝÉܶÖôâ·x%ƒ$TŽYdY èùÁÓ.œ(¤ž˜aEZYˬÑ0ŠãƒKÚòvR‰s.GöÈ£ìe–K{…yYˆ\†'¥}L4³äeÈH;NFiGiÎm-°ÍÊdSxÏc޹ô¥¥·´#Îå5=Ñܹ9Úœ GOÒ¯ ‰¿F§ŒàdzÒÖm}-ó™}=Œ‚€dtÈ4r€®ù`“Nž;—DÑÌÃYm55étØ~ ¢[|aÀÎ2iެÒêz¤:JåÁÏ—ªô‡“IÖ$ÑÝYí¥Ì“ÕhÜ|"Û.σ:Ýê-qt¤2œáséR¸vÕ{SoœÅd7È@ýoóŠæ³5ËêVúmœ½É™74€qÏOÂ¨Ò “Jí+éë/|—‡.ßxëùþT]ò2îÌ3oÔŽäæ¹®A kúIî‡ã¯Nµ.ˤCö–Wu“»^ÑWwãsøSî…ÝŽ.¦k{9æÎJF̧ä:²ÐíС`NùœžžxýÔf¨HÒ®Õ¿î_Ÿ¡¬ì—RZö6É#`¯pÝÖï 9©]èu°ïQÕôËTh®¥Y0ѧˆü©f,tíBîöWŒ²G&cÏ §¡#δ:~ƒ§Ùm"–aŒ»ø‰?#Ò†Ôt›¨¯¾ÔÒVr1$l<2—þÔÖÁöCèÂGÅ]±ÿUFùVµlÙ5¤[{˜X”q¸ú|ê±®ë¶É47gÆABØÿÊmz O´7QͨÅð¶qâÉsî(¦rX½ Õ$‰hS6@ñ&ì|l©ÒêØ1ý;ï7þŠÓ'èØÆÑÆ?uuÑ^&x¸8ç"• µàÅê:ö©}zYÓÎKÃÝ«ÈÇ‘çÁQøÖ«NÓ`Ó,b·‰rpÌF 3YëöÇk^ï­¬PƇcó­j·^”ûlðGàü,pj«‹ÈlàindØ‹æe^p0[•>~b²×éöïj—O•ØÙÙ¨yèÄô4 kZì:ÜÖ–)‘Y´à<ÒÏ·ÇT]½´Ñ £œŸm"Š>Î*"…Û*ˆ€w¯J…ùßÛ 0ÚÂ#œùœ¥]†iÏR~™®‘»!‡8ê+ d‘À>•à<ÆqééRI(‰NdyDÊ( õ†Ü ÇQSBAãËó¤3)Úð«d»NÑkqÿ–ö`nì¶œ¸+úÆ<é7k:½–IÛðw>]<4ó³JGftƹ·C´ü¨sIûP³IÊö—´ îjtÙ4ObGý´õËäcûF†ÒBŽÓöIn‘ò:ýÓK{1ªê‰¥­†m ÝÀwŒpù<’„èr¦hõ= =Jý.þ.{icM¡¢88ùŒV?R·In^Þ-Jî[hHyî%²©ƒÕ©‡hõÍvÞÁ¡»µ‚¸VPñ’[ŽOF5ë]=KW}(³CgirÔÎÌ'?:\ðTm+l(¯ôµXV4Ç,ØS—>æµ}‰b½•µÈðÿO¤WZRhݤÓ`†i¤ã™’9;<|éÿbÆ;'hýxp|³â4Цí{¯‘È3[ úWÑ$Œü+…ãÀröê |ï]¼×ö’ÊfµÎOá_EgÙÁð=8¤½¢Ÿ(ùu¦å°2Ê2½Ì¶¶¨‹–™œù{_HÑ-e±Ð¬!“HáUp<ˆ+çÖv‚öÎÚ£ˆžy.¥ô³Ç¿ïRӲ뫦ÝJ«ˆ—HÙ©l~ÿñ¢?qäW±¬ÖX}‰zã„,GϘÐ;3¦ßh77Q1{ˆƒ³‡ g÷V®êÜ]ÙK $ÈW tÚZö{X´³[K]sd1®Ô^èp¥:܈½ªÊûj–òk1@Ê©ë"¦|°<ÍS©ÛÞhú­î£o¨ÚÛ-Ù–E,Ü cM>Ðt94k{“=ÚÜÉq)šG)°g¤úzÛk§Õnî.-­ÂEnÌr ãÅÓ>ô?&­°m*ÞóXÕ­595[¨¬Ù‰X”‡‚0F+f9]É×ÌVE­í­;weöbÇ–…ÅÚD8 Ž ÇqZЄ.å!—ÛÊ>O)# }¤ú®µ&žEœ}þ¡(ÂDqý¢}>uígZ6¬–– Bn#Œ~¨õoo©fíšYGÆk7_VfôŠ*JH“µ¯e¬^òrnõké“è=U:j}¿{ê¼â-œ`Ž|‹t',P—Z\‘vƒLŸ[q"ÝogþŒ6<)òý´Ã´vö–rX\Ù"C¨Çm Zë7ÚúÊHeÔK)Æ@ð/•dÒ‘‘o{±ùcÏ'ó&žÞvŽó@¹íXZ­Ìï¨¡Û ¹ŒdŸÂ²¬×.µÝG»»`›t¨Ê½2? êÎààÕnsôúõ¯¾Ç²6Ïfô[‰QËKm¿ç”üÚv¾ûY¹m–|êY‡&GÀÂ/¿ìÏåÎ¥ vsD¶°Ó"¸-RIdrsÏήí¦} VnɨÂÄWtCöS’ƒŠ¥º75-ø{‹ßçW—.U]‹ó4#FÉ»Ÿ*o ´²k§üH°ánÉ9U'$tãöP“&Kv¼\Ñœerî{øs'1ì1ŽîßO‚îî[—ä”¶"PG'4>¡µÖÎHí–ÙždEÎ7yõ £»¹1LËä¨éš›Ï$åG,ØÆMk“4%‹J[™ãÁ–}I=·òvÞâ{IwÃ1Bêcb<ÔõêÖæg‹kÈH'¡¿F·iõýØ) 3—aáC olâ‹Ó`¾.[Q½kä·É¼†Ï8ô¬–9¼-ê¤^l˜ýU)°ÌáIµnç^cà=:×64­±Yޝ5+6ºÕýÇÖrw²«´0è)ÄŠ¤],ŽQ . .+!ôý¤mAoÙ­¼1†À ä¡|±[¨ÒîK£H¢&ʯR1å\Ùàã•7+³HɸÿØÔ¤‘o»ap7-¬g¼aÈçŒýk½¤°ï¬â0DÐ èêyÇ_Ùˆ­áÒbš ³L3+ž¤ùƒMU_€²®Ó¤k ÊýÝÜ.;²?[ÚªìÊ‹Én5‡ vï±”Œlº§«l=¨Óþ,âÛg€Ÿ»¿ž¿•FÅùcsð¼B#=÷š–¡p>Ž“`#¿õ¹c]Ö@nÐè  eÛëPì®>÷#­Ó·V$v—DÉÄÇ8£ºv1Õ[Mî9Ãã>\Rˆìc¼ìTHåF"ܥ޷4çX#ì‹ÿë[ëÅfnħ²Zj¨~à•ï¶uÛR»ÑKt0ÑûIföA{?spŠ´ƒ øó ÓñÅ:¶˜F~еÌwËüi4—ý›–Ž@0¸R"p@ùšÿ%@Äiª0Ò<Ÿ´T¡ïäpÑ«8üT¬ö£GU,·L¬="~*X·”µ„˜­–^y 1ñÔ·Ùç:V}ûˆÿÓö nÔÜ^ÈbÒl^gèeq…úÿ‰¥ÚêvŽÓL–îçP"8S xÏ?%ýôÂØiq*Æ-n! ÛíE?º¨í6¯e©é0ÛY]$òÍ*…D<˜ê(¯ÿcA¥é°ØipGj¼• XõbG9£bu`Cùõ:š!X”Š>ÕÇ ·ëzŠO’N]]Åak,ó‘Ü¢î'Ö²6Zf«ªË6¯oqð+tzn$²Ž”WjgY_OÒÞQsKºVc€{ÿž”òGM·E‰/­6*€ L½?KÉ{ÅQÕìu 6{½Nõ¯muܤŸ¿ùô¦Ú—=ºÒsÐÄäçÃT{[}m{§Ackì᳚vAÍÓ|©G¹¤ý¨L 'iûJÁŽ@Œ‚öMg»'«ÛhÆYnÄ…f† ØÏLõæ´Cí/iHn ÆrtÕýˆšäµ”o*+®ì†#ü)"›TìÍö¯Z³Öb…mLàIJ›z޾ueÃì×î.~9ìfŠ„rª”\•j;`vWPýVU>b“i²ØÇÛN Ñóm·i±·;FGÙÅi{Ft¶WGñ6µeÜÔ¸F¦Òèµ´H°vŽæ8TaC[@úÕ‡Ví ¾ÄZY›<ç¸ÕÀþúŸÝWZÄ.$0[ØÎò7ý£Pa¶5ô_¾’¶V˜¯üEóê’ܧsuÚ9¾ñ K\¿§ Huµ Pc´ þ¾tÏè«èŒwØñù©óÿùáÜ;A•'þ¼xy÷^u¾÷d`†§ØY9:\Csî8¡îIò-Ž¾Æ­‘ƒtð³p|Áª›16àħB8¦Œ¤Ïv“Ž|ˆ÷ô¬ÔùkFm›sq!?iÎ2Å3‘Î=k1.“rüqÿúgWCïb×çñ­_ú7$vŽà äÚ¶1ý嬣ô?:Õÿ£cÿJd¶ÏûV¸º¯·ª_£ -b[knßj-~Ì–î­•‘”Ê“¹Ðììu°•„—ª±„`¸9çÎížµzþØý‚³R¨ Ç¥tåÏ(NP^YŽ< QŒ¯Á¡ÖãìßfåÊHɵ‡Qã5ŸmNîæxYr›ÃU Ï£º>…Ù•¸eHŠN77Ý{m϶qIå±’ÒÚíµ Á;a ¾qÙçØ®‰EÝ߃É(Õo¹õ2ÞÖ÷_í$SǸ|J¤ú‚²¿é:Ú[=%!ŒF£xÚʧ¬ÅªMªv’ 6yagž"í]»yÇŸ¥fõøu~Íi‰¨Ï$³,²`ËÉÛž9ùWVY|QÉ‚¨¥gл3e çe4fš}¨Ve“vާ&²Ééd‹“–ÿ±Py!%¿îËøÄàG…ŠÞÅ”®nãx?tz*ÓÄþŒáÇCéW²•ëžFNyæ³éôáÄóÕ»¤,ú²äXx\²–=éŒU-„“ÛmËû(y",F:ãŽ+…äs–©=ÙÕ¨F¢ƒ-.í ¼ŠÊIã[œbÏ#<óü+MºYÌÑ.é6*¾§+•ou©A£+3¶öÁýlbµé³îrÛtÞ,tâ¶ÉJqôݘꛋ֗Iôä:Qºcß1èÉÐõ ˜ø–#º<‘F鯺Y9ð÷gpkèñv£år/™ØhC¸÷zÒnѰc¥§­Òü©ðÆÖçšCÚéc<üZ‘•5Ê:ÑÎÔ†tOÃ,S«ÝOÁ"5#yÅ#íS²àu¹Nžtø0U\© ŸÖŽÀûuY#*Ä28Å"ì™îí®àÎR;‚ÚšêbÂÆk£µ„k¸ õ {5jðé+$ŸÒ\1”Lô¡wÅ=¨"áml+K<ƒoªZq§i–zU£Åø~ó¹<’)®eÓõ«]P¯{n»| •՚ƻΚ!Óî[‹†SâõÈê(Þ© ¿² »Mº|x^ናæ8éQÕwÓhý2 šu¦[%†Ÿ  À¸Èó>t«Z̪ÑT’‘Où„¹c]B‹Ón!C‡’" {㥠Òõ«KNÏGÐâ&&‡nIÇÏŠÒò¼XVgMŠÞ>×j+tˆd8’p8ùgæ)$ ƒ–z®‚e0Ýé‘Únä4ñ¿ñy}x§±iÚ\‘¬‘ÚZIrcRÖ¬»±·¾Œ‰ IûC‘ò=E#nÍ=«´ú%ü¶²u1–ðŸãõ¦‚=2Î'/¤à}äˆû*Õbƒ,1øÖi{CªiŒ#Õ¬2Ç„–€çÓÓ𩾷­L»áÐ[iäo-Èü(¦:f•¢†ê"²*HÕXdVS´ºM¦•¶£gŠx®žI>§ü戇µ¶ñ·V·6Ó/T#p#×ñ…Öu«~Ñ›M2Ådfy•¤fB6Ö…w°W“d³n˜«Tî\ާ\UEvãØà1ãñ®§„‘ÓÛÒ“™Ôí£Ô;i…Âî…mŒ…GäÓ䮼†¶~|ûÆþ4·R¼Jíª_Ý+´-kÝŽë–_|Gÿ+t‚9y½qܶGåJqh˜>}E+pÒë·vŸ/ä– F\¨L É'o:y­Ø­‡`e´/¹à·[ÝŒsK,ueÑ{Gw4ñ™ –Ös ‚ÈB8ÏN´Ÿ¸p½  f·“E•n®ìÖÚNîHím#måË -“Çùâµ=ˆÜ;#bT‚Ø~¿Þ4°Ï7huDÕb·’+% $£ #2ãçŠgØ”o䆟‘•ÚØ#ËÄj‘3v‘–íÝ©käñú{NÇô‚¸ˆåC#<ù¿h—ýc¯tÏ}iŒúBä©sèF*W´©û‘òÛ5–ßMÔÇqìÒ/Á°$ïVÆW ⯺´k†+Lv¡y ÇÈØÍ_¦Áy›¥ë¶í8³¸¸Fv– šc­ëÖ¤²]>Í$[Íë,k2íT‚PžHò¡#G'{.yÆ{;ÇOç8ÏüÕ#ÙëÒr;7ÁÿøŽŸóV³HÕ­õ‹C,ŽD8–ݸh›ÌûéŒm“´ƒó"ú²0kÙû·vQÙÈsŒç_þÕÍ+Iyõ ›x`“IÔ-‚™);Åto"3׎œ×Ðö†Îß?/ZÏ_iº…¦¯.¯¥m™®-Å´­ØèAãƒÔob­*ûQҵȴB‹ŠáK[L)È*GʈÐAïhºñ(A#§€b¡a£ê7¢êÚ«F•†¹ ž¤ŸZö7s®ö„ĵÊsÿÛßÜT»ì|aô9I'Æ\gœ¼4ñ¤u`²äúÁ¤½v†ÅK7WrJÝ)þàÀ ùúÒ÷1.µwp.íl,6¥ÍÑcÞáE^¦—Ksªh7É{yñ¶O"Æç`F˜àqž Óm_I¸šk{ë •.­‹mÞ7+)ê§Î‚{m[Yš(uŠÞÎ'éå¥ ä ù €h*ÓB†í ÎuÁŸÿÓ[¶Lá}a‡_,Œúñzÿô«x䲃œzät£°IîT_`ÁÉa¸ýÕKL#$†Ê_ÙV8mÊCa‡9ò5DΧ‚H'ƒÐÓFRà£pRv¶ÑÉ#žµ›uT³˜n9/Á­r´$ëLR+†V†çbŒ|Kr:tÇ×ý3«¢÷Šäè~tV‡®MÙýY/¢E“«¡ýe8ÈÏ‘â†q~tϲ–0j©±·ºŒI 9,‡¡Â’3í+Íéµz±Ò÷³ÐÍZ®ûg¬[_j¶w1è³<3B$Áö1Vè1ÎHœÖ-Ò×TžÞ Á°¡ºÖ×·šÄkKm½°X”Û2O±ùb°—×^\½ÄÅLË0+Ñë% Z˜äé#:·Çäq©FÒö;³ê ³3N¡G$žñºR7DK›‡k»ˆ¡´¶R×,’£0õ@ï”îiͯf;9rFàpp]ÇãH÷év6÷_„½Ì]ÙH È99óâ­èµ'Í"#­§åÿ“qÙNÑÚÝßöƒQ¸+o ´lLŒ0riwúB¾³Ô4M6{9Òd°Œ<{R>ÊhÿmXê¶ÄøGt䇱Vö‹Dû³¶¶ã;Zå¤Î02GøWN¹¼7ØåŽðý•Èÿš”ê:´:äö¶pE4k$êXÈåɦ“½…LÛ‚CcޤR=GŽÖèüä“öz:.8¤zÿiIÉ SUŠŽ Õi FJˆ£BzìP3øRI{KÞLaÒ­$º”~¶ßËü*Ú—_ú¶ÛÛ?üèÜtÍ;)ñ`¯L×.®­í!i®%XUGÞcŒ{Vq§í^N,­FzœýuØ»9u¨N'Öîûݽ ŒøÏü(¡Ñ.ÍÄÚ¦£}¬NœH{¸ÕõÅhþÂLŸ¶/ç˜WŸÊ»n‰Kv5]ƒ€(Œ ž¹ÏZ/À›2}®´·±µ´¿´†(.¡¸\Ð.Aù|¨‹ì¯úAÓsüÙ_G´-ö¶±c£Å’»ùý€ÿ?Nèÿ˜ZnAÿeqûhCìi˜•oP|ÅHã#,˜©éÅCnÓ÷OCH’HpÛ[§¿Kî)ÆsÓÒ¼[Âà­Hx9á—Ú˜îÖuhzcìûƒùV³‹»³Ú~03l˜cò¬ßk‚b £ìëƒÉö­àìö›Á¶ŒtþÍ(÷4Ÿµ ´ GmõÀ0¿£„m<ùW;³.ÏøÙˆ>_z¥¤¨~ÚkŒzwpò:Ž C²Ã•t³Í}67°P|^ô —ýBÆ=JÆ[iîæ]¤ƒXí?H¹¼Ô®ìžé Ôtà¡nâÉr9ë[¤\©P=zVoX´¸Óõ3­X\ÛÅ$ˆXîXœ“ÁúŠb‹| hçÕt@éšÏÅÁuo!·™‡Œ2Aÿ&švŠöOOã­õñ_iey¨™5½Rêháu¶ŽÙÃÆ™1$dgëGv0ä–žï$ õñ? êŒÏh—:¦»ÓhšÌä{þúúKU±Óõ¯šöˆïÔõô«lóŸ}$Èá‡ÍjW´¼žä`tMNúßA±Ó¬ ‹Û‹€¬ß¨¹5ÞÐh×ÖPA%î¢÷¶²J#”ÃÄÄà2ž½|ªZ.“-çfìµ[ˆíîì®'hÌÇArjŽ¥©^ê-¦¦-–ÖWUŽæÉûÎæP|;°OÓC|ì÷6º„W%±}k~–2©À¹FèXzãξŽîOzØUýrzzùyø¥PkÂ>&-R“ÃX)9Ǿ+GzÇi­í~1¡¶Ò¦Q)0@y Ô‘Eاákª_ëw.‡ÝCk Ûñ3/=£Ì}*ÃoÚtnÔ,³ÔŽïü(in¤¿tm÷VÖÞ®PxPU}Mü›@ }[RØ$Ü Ùî{KË BÈ/Ÿèÿ­Ðt»«yo®/n!–{©UÏt¤Âçò¬ù—II8õV\G$~5¨ý¬ßª‘‡[˜»Ì{ƒü1Hz_oð<ìį7ú{ýëkÙ°èwàø«FÌ çv©=~u‘Ò5½L·hCÝLò¹yfhŽçsÆh™;K^çN‚yîd8Ž6Œó'ÈS%Å·aZÎ¥qÅ®Ÿg2ÇståKu1('Þ„›ãô;»I›P{ë9åXdYFYŽùùWC Äךƒ½Rã…+ËýEB§™{yqæ¯>{²$ŽÖ5ðÆÝA'ÌÂöû $Bu§(7Ûj0qÿt+d²¾Yƒý–èÆoß­‘Ác­#``ºë[9rø/É ëB =Î3‚r!èAåOðªååIR§GP+„Þ"ƒ>G÷Wx\:‘ÔŽ¦©Ë‚9Á”aŽN)$ªV ¤t\·?ANÄ¢B»Õþ°ã1IçS²ï,0.Hyð+¯úgOEï¸àÓŽÅñÛ?ûíÿ‘©KîƒîiŸdok´ÒN3)òšó:_­ÉèuJ_€žÞ3KÚ”Œ œð ¬”«Åj»jÙÖÛ%XaFñÊÊF+£¬ÿQ#>—èÄc¤Þ¤èº=â—¶žé¼àn¥‡·¨¤ë7mp–3È{ضn@@$r}EI]¢™f°èr _6§+C"$qÇÞ®×eÎHëÈV¸òFP©òˆ–9FwDZºÄ:,µÔë+ Hð± ±98YÚnÐEÚÏ[]E±¸1²ËÔ¹ý„W;h—rêqÈQ‡ÔÑ}±ÓbÓô+d„ø^bä{ã­wAKáíppIãøª|œÓ{QoÙþÉiæx'¥i6¬C  rI4inã¹Ô#¹ŒÐ$‹¸`àŒÛN;7¥[j]–µYÓv@=~õ*í\ ¤‘(ÀXUqéŒùb§¨Røtßô®Òçqróyyš7±¨›$P«^yéI/Û¯Ò±Õc“ÏçPÚ¬³ÙñÓ§óÒË–ÖηdÒ¤±·t xJùçÅEn F]Çpa»Ë‘i‰Ý¥Öä‘w…uŒoñŽE@¿j@æ1ôÿö¥úy×¥©ü,víreý9oºÐsüi%¸Ò¨°ë›K}7µú{XVºÊÍŒ=Ï¥U¥løNÐwŒB´Òo¥C³óí%Ëj¬WQ#†¾{jS{;©Üãï´Ë×,Ì; õ§]‚Ê´‰õôÒm᱂ÜÛà÷S¹>~/ÝGÇÙy/fïu›Ù.$ê#C…çÛ=µ¦«¦ÆWI–ÞâÆS¾>ðƒ·>‡"ˆøŽÓ¨Ãc´yÿ—¡ý€ÐÚA ¬ 1,q¯ÝØ8úÑhê¾ fVnÕ–âÞË/ÿzU½í%®œívÅŒðÏþ#I¦-#[þÒCæÞÒ¼¸8€9 ¤×µØÊúh-†`@ö8ýÕ -;\ÑQ…‚Û]Ã'ˆîOãÁýµëÞÓêvvîÓh²BTaÝ™¶ƒÿ _qÐSöºÇábx#šiäàA· §Ðÿ†k;S{tž+nB2¿wf´ß†Óc»‘Uî®JìGˆÐ Ð!qCÙ…ø2ý”I í&°—²‰®‘c61sþ]ú†ÿHZpU?ìlmG³9º×u»ôû­" ôm£š•ÎØÿÒÉ#àŸéÉ¢÷CòiŽHÏ>‡Î¦û¸ÊŸQÒ½µœeO\yê© ·9ÏçJÈ;Œ¯9>JqÖ¸¬Á°Þ|nò?:è!3ŽPõÊ¥€Ã'éé@ÞÖÿÖÈ0sömÁäôâ´}Ÿ\v{NsÜ'NGAY¾Ö º²®1þ­¹ýÕ¦Ð<:Ÿ…ãáãÏ?Ù£ÜÖ~Ô,ÑÔžÛk¥xÂÞ¼RNÎèz~±uªåÞbºp° 'ïqþx§º0ÿ¦Úöw¶‘ò4«EÐ-u» n.^t™.¦‰eðv† |¶šÆÝµ­ÄNŸ©I|…^½ã ½yÀó¤ZmïØ7XÚ×Úèçúߣ*Fi®‰©kÐö~Þ;]2+ˆ Œ$lI &Þ3Ž´žúéd»ŸVüV•~.P(Ý£ΙYßjúf“ ¦ŸW¶[I¶ºEf!sЀzŽ˜â’T7ºIh·:¦•¤ÁjúËH»‹ºœnbI>TL±ê½¡[Oi.™§/ôÅ›//öG ÷¥ßÊÓã¶BsÀøfÉüê›s´- Ç|M•¤Çd—"Ù¼ñœ“Nì—ÎÃϵ’ÞçìÍÄ\wlŠŒÐg¦jGUÖ­Ñ¥“F bn×~”ÊÇLµ±±†-¢3Îìçyþ³2ij®-žçYîÿGF¥‹¸Àö¡Ù*›ªÿ,e2¦Ý9s#„Wïü%Nv⎼×uM6ß¾¹ÒU¹ørIÀàÙJ/u[›äÓì&ÓÍšÇy´…‰DÁœg(ÍcRR—»ïUtÛI•æ¹Ûý#©ÈEõ9ëGbé_)-õ†§ö¶µg¹%¬¡øu=<ž§­jYŠ.f3Óâ³÷¯®Û­ŸÀ;IqÞM+‚vzŒ‚}éôhÑÄi(07yãÞ‚_“à]ðzë(Cþ•l–Fìp|=1Á“jë2ªÃíxÎûU¯cÉ]¾ƒÜ{;·gdŒÎ ’<ÅIÜÞå”ÑFfC¸/N3çþ4<ª’‚ãîóŒÓDH.K"†>‡ƒôõ¥.­Ï=ùÆ<© ’>ªÇÒ•³Šä ¹Ï—É×ý3£¢÷€=0ì©?ÊÍ7{áû /o»FöhííNšþákË龬(ôsý)~¨DŸ´…t€,·xËI Ÿ,ÖeÕåÓšâ{Ag2ËÝ÷jÅ•Æ3‘ž}©ßkÔý®Î8=ã@#u!™ä“,ŒçX潫$IE­ÎN—Ü#$öV{Øa‘ö£°R}]½ÄÓ\¥Í¬0Ãlñ:A'œÐ²,~U{=ËDëÊÈG³ƒYcœchß$¤ša]ž¿¸Ó“S’ÕQ®ZîÕúgw_¦jËíJûSìÑ:£§ÅGsµ6®Ýë·9üñJT´r£F̲y85) ï‰.[?¯ž+U¬zLŸN½]ck]kTÓû/k”±w½ôã:î#œ€¾kšýËÜIi4ªw¶F‘ê±"•Û¼ñ9¯*’|B2yùâºYݤ%˜žIëK&vñ¨N£‘̹Vèê¶¶ñ[Äörøñq¹³åÝN­»T Á£YÈ z &§:ÆÒ÷~`¶Œ·½—p¶Tmê?­ÅËÕ* c’VØóÃ^ ˜¢{l‚æLøH'ÛÎh°“]¥»Ã`D#n6ûdæ¢ñÅp$̶ి‘æ1ŒQŨ*"Cn©§…úæ­Fem}µÉOTi?»(7 TÚBXQ[ã³¶ET¹#’AééŠäqßåN  £âÎsçPòcéÕãNþå¨dêdj¼#­{,ŒITÉlž<ê亸˜¹ H„éííB2ñõ£­Íôå"G#8šÏUšr§'_di—¥ÃÜb¯òp™rã½e'‚ÇÒ®… · <óF+wQîà±ô ”òÝ]4xü[€¾çÚŠ–ÆÛ¿XÑDÉ nGuýoP*yJýi=?ärÃ×¥¨eh9úS» wŒxéI­³¼|©Õ¦:×—¶¿—ƒ¦w§~O˜])ÈÌ`[*<¾Uv”;ëÐØ#+Ðô5¨›â'œ¸À™RpÙϧ¥Y¥07¡Ã`xóë_U‡„|Ž{à¨$ ¯˜ô¤ú¿ýy¢m=ds¥9nÜ0÷ëIõ%SÚm •.ùËŠµÊ:Q>Õ`±ã?Ï"ê:õ§’.]¶Ž=3šAÚÆhí,æeýW(î}­h!!‘î(\ìAH8ŽEðžyÈ-`´,¶ð$C9 P߇y”þud2¬’ ŒóühÆ`2H%OåH;S&Û}8HàvŒI=zçX¼ÔnÞÇDÚáx’éøQò÷©ÁÙ‹`¥ï¤{¹[†fbù î> r¡”å[œŽ†’_ø»c¦‚süÞCÓÞ¨NÊZ†ÛÝÔ1ç…GÀÆ€£´vÖæw HeÏ‹ƒåš}ÇÜÐêzÕ¾’„9ï%n%9$ù})­Ö£¡ÜO{yfÏoxÂFhúÆ~_ºiýÓtÉ;èÐË/“Êò㻩ëqÙH¶ÑD׎2"AŸÆ/-Ní;G,k¥[J÷1ÂãBüé…žº%‘´ÝnÝ-ç#¹ýŸ"z~?Zå§iL7QÚê:yÓÚSà`2„Ÿ^)½þ™k©ÂRx$8ûËî(afJòÌÚÎé¶ñØ0…TòÈV™£vwWWøIg;0[ Ãé·¥JÄjšohÚ@¼qÙ4y G¾ µ ›«]B V="k這—;]sÐŒ*h¦Ø|¶W=“›â¬L—‰­ØçÚççZ¯hô6H s&ùƒþÊŠGK«ue!âeIóš»´¸ìÅëj*dÓä9¸·óOí _’iÚýÕ°ÒÞÎ[›è œ¨èM ¬j:óYiº‡Ãw—H{ÀÇk/M¼ùóëG_‰%žÛ´zB‹l¨£—_<ûÝT%ÿò§Z´Kdx­l˜O&ðnÏŠ+nMˆXÀqÀÆ)Oio[MÒeuÏ!îãÀ剧[²‡6|œíf h㪛äȨäÇ@ÓÆ“¦Ajãcs·\±ëšäçý#YìMÓœòkIµ7`c˜¬Äܤ[\cÜ}M>à¸f¨&Ñ•žb¦­Þ( Ôq‘ÓJ¸V!‰ôÏåVÜ ö¤I ÁNÞxýµÆ@|C#ž‚º6²á±¸q‘Ö½Åã¦7µÙ:²ç¼ïb¤Iº@rVú|€ysŠ£W¶»Ñµ7×,UäGP.í³ê?X|ª†Ó¥½Æ±Ù{µ€ÞqÔi:Lïò—˜¹çÓ>T‡ o»C©¢[5É^í$8)yõ¯)±ì´PØÚÂך¥ÁÜAi©>B’ê2k}¤Õ͗è $;¿F3ýr:çÐQe(Úû Ͷ¯Û+k4w‹m‰sp¼+\(Ï®j=–Õl4)ì/¦K[¸ds0”K’H ùñ]³Õ¯t ÖWšyWÓãð8÷¿Zªçímq~2ÛH³Xøþ»ý=)‡+ìðÒßè}¡¸°€Çks2< Óx_½Š{qÚÏÜvp£Ì›L;~nc|±øTí{OnÚÝÍí¨µšÅ„RÛ¯@ÞXã¡¥‘vr÷\»ŽçR†ÒÎÔþ‘’$Ĭ= ò÷æ“ð5¾òØjÖ‘Ï|Y2¥Œl—P¤ýÖ¸§=ªÕ´«›;T´ž)g3£¤‰Ò0“åÆj:†µo=ý®Ÿ¢évw%[¹^úÃ#¨0­U©ÇªèýÈŸHÑPK @ …cÓ<ÿ…+²©]Œç±[‰¤ÔôosÃmݨq²_~:0¬ê%¼›Ú=UŠå&vƒÈÈÒÊYâKÍ.Ý-oâÀ¿Ó‡ à~º·³Ú´ÖVÛ¦•w?éäKõÜÄàûóCä#´lUo Wog7Ü"o1µÃ#õäT”Éb}¥FÏj?G}¦Îs³ØOF§ZEìš—mîç’Ú[gK%Œ¬£ ÜSgFi\jz~Õ¾A† ÷f_4qLNvé‹4mn-&4xÍ¢ÊÀaó¾Í¿ªÞ«û)·iNè-u¨ .–fef>5+·‚=Žk# {7›PÓàÊgeöŸ'8ç¡£;ø×E’+[†:EÈ( {6=U¿±û)]†švU¬_jWomc¨Z˜’{¸Ú'Tžž„àõ§:fŸo>«y½GÃ鲈m¡QáS´6ò<Ï=h=BI-4ÁvÐGg ÕºC¾H#pÃn>ÞY¦ú9#T×_ŒãŒ÷k@äöØjÄé<-äÞGç\ˆÆpFc(q€ LÕd78\ ã9Á™Šýµ(nÖ#åzÑV¨[À ñÐqY9ÿëys¹‡Úñ{gôbµ{FIL‘ýSû¨*\”3”˜ÎÞ„zU÷7,e—©¨ùQ']K,ÿž(7(00Ç‘=)¢$T–Fϯ¥.“qø¼ðÃëÅ0'Ç’9ǽ.“åÈ'ýâ‘ÿ ruÿHèè¾ túÑ: ´šq9ÇÄ àã©¡ØqõªÒZÏÄM¶HÜ:ž¼ƒ‘^>éš“=L‘Õ—qÇjÛýdãÅáv_Ïg¤o ùV¦Ñcí%´°¼‘¤á‹à&IóÏšÐV:tXÝß¼Ð\K ÙÕãCæXƒ×ÐW¯›¥–lªp+<Ü=LpâÑ5óG°£JÓfÔoÕ‘Gs #1ÀÇ¥Zö'NÔ.仼i{Äe17eÝ ybŒ¹íDîeH×t²à+… 8QHÚ6’åã2Ç%Ê‚d[,)½á§Ìû²¢òdž¬Ÿ*ìŽÚìv™Néž"LãiÈéïŒÕ‹oog¦›nüÍ+O½X¶v&ÞGÔóT%¼¤Ñ²ª‚ÌÌ0z“PŒ¤°‰a•%Œ6ÒÈOÓšÁJklti‹Ù.æ;Í?á»ó‚RÄîÛ¼cŽ}¹â¯»xû›h£nòX¡T–Aúî:šc Í,±A ¾Ó$¤Ÿ@$Ÿ­4rYhú8•9Úár­Œï£Ú¶Ç’-’îc’k®;·ØB-VâòÖí/LB¹Œ¾6ÔcÏ<þ5|έpïÚ¤åG¥XÚ’;Ç&Ÿ“F½Ö ~G\Up’;EsFqŒ¢ƒQš*I-UãbñIÆÝŽã¾|DžR½|YüX£çMP£ ç¼À?ZªÈMcªFDJYPžys\Ñ#·µ²¾ÅåY\"E`‡ßóïIFj ÉÓü n:’ŠÙýÿîZÞ]ªaHO“+1üsš½pê#œ ÷¾Æ…ÙÂüèˆäÝ·•¼*Þ#îÿ…rÇ.½¤uËâQ*X»ªø.'R$ˆ$X©ñcåQqŒÅ1ÃácÓ(æšÔNˆvcœzg­$½9]ìSýHÕ[Á+5¤£!w¸,娘WåÒ…µæÝËdž1G@:jäê¤Û_ƒLQI?Èeºò¿*ke‚è -‡ªÓ;?é#ù×<ᓃæWŸõ„Á9¼|gÐ]ÓÛùêm+È gÖ¥©au;¨Â½ë}95Í9B^/\x¹œûWÖa{#äsûØÉ˜œqJ¯ò{M¢`àƒ!ùqM¤M¬X zŠS{ƒÚmÏÃ)ëíZ.QÒ†Ú•œwÚ\Ö²¾¤tùÆ—vjîK-#˜=±0È·OÊdž„†>~óò¬Íïg»A$îÚ^¦\(ÉY·ùëMx§\IÈÎ|Å'í<Ío Ü¼oµÛ æ æ„N×é¨Kˆãÿ—þ5]€nÕ_½ÜÜið6Ôƒ?|ú‘F– f1ÒïôK­£¾µEP =àäã¯Z½õ­$‚F£jÿUp:óh:gla÷®¦¥c›?”=Ãb+¯i`Ö6¤zw¢•ͪXÖZ\›Ø>m™ »ÆÐÙéŸ*rÚ˜?ì0ãÈ…Í'ŸK²þUÛÚµ¤K´f(³Ö…V5TÍ5½ÄHd†XåSÆä`Ê~¢’êzUõ¾¥ö¶•"÷»B¼RrzœP×ÝžLGÔt«ƒe4c,7Ž==kÐêÚîµ ;5¶V{–>êTÏçGàI–Ç[í&"¿Š +HÎæUÃ3üºâ´’Í«Ë#k–n¸³.­Ù»˜e½º[Í>WîW ?•j¥Ž;ˆ%*ñ:àç¡ÈÑ.6æu5gPa6™cÃáy-òñ ¦í{O{m-»ÙÙ˜¤]§‘ÿ®¹ j]–w‡ážóLÉ(cûÑO—Ï|}­Ò$F=ù“ÝÊ¥ tçƒô4Q]ö@³o¦éÆÇU”ÁsjåØÌzŽ€ü©Å¿h´[¡Ý›èn”Ïü@Kû9§Gu¥ý¡}mÒÜÈÒ‘`gsåM¦Ðt«˜ŠË§Â¹˜Ô)…÷¡-Õ­ÇfnÛQÓ“Nr ð)û™ýaíQ–önÐiúÕ³©³¿Äûzdô$zç®­½ÏfuX!Ÿ¿Ó.åî{™3”'ÓüóJgmÚêÖ õh¶&~ï\ÿŸj/r”[GÑŠ€Ç„ô*k;Ú’Æ]1Îo“Ë­hÔÜ.G§g»T@›E íé튞äÄÐoÛ•#*zb³ó ?é×¶töïã.µ}N1åÎGÿtƒÈZ¦å5 ´wz•µ›ÞZÝ¢÷±§ôˆËÀ µ¥a t5“»Žã_íæ-ܶÖv*™îÎËt?*]Æ·Ý„­Çiu†i¬c].%lwCÆÞøÁýÕZkö™º CI’úL’³Y©Úß0?Ê¥—Ú-5Ì:f¥űåá,Ëò8®¯foµ’ãVÕæKß !TÓßöS¯° vvÿSÒ59n™!¼¿u—¹îö}Ði…ŸiY^ rÂkœ…Ïû·nœ,ÒõÖõ3EÕ¡»‘n/¬&HRn…ƒŽû×uÇÊÚt’˨I5ë)fÄçÌcÈûÒ+Ÿp=Æ…¬h:­¤ö0µÝµ»³D s‡ûʯ]ëšÕµµšèsD«2ÈÁ‰9ÚsÄ t¤Öi}¨ýg©p©dTBÅÚt ´Øk¶GœpTþõ4†uh.'³³¸ŽÒïy’[K…ܹ=^>Ξä®Z¹›µÚ¡ÕÒ4Ô¼j¢,lhòy}kKݼd²ôé¸äý)n‘¢\Awqyp.ofP¤ªá#Ps´ m¼îÚÀ¯–åÐC{ˆ5m,Ü\‹ý?j1ÏÜ™|Õ«,©%¬²êv0Øv_X¿êçËpkY«^Ü&£cMu2;Æèˆ8ÉQÒ³ºÒjºLçQ¹X;Ô\,ñp$ÿFèO#Þ¤Ö7ÁT—e4ëSo#K¥üdN¨ÇÇjÁÁ*³Z+êšóFT)»\#zwkçYJÖ;e-Ô$O ´ØÏÝbç8óÅh4YvêšÐ#ï].Xt?£ZhR[ÝIÀaìNøŠƒ7bἋu®|C ‚T “I À‚Í>xÈ'Þ™:nuY”œ«E’GÑŠÔH¥ˆ¶ß,k1p®5[ÃíXpÀòÇiûýˆî9éRhù3€pùqî*©„r RÍ“Ó=~”a à;†:Ž´ÄD†ØûˆòÇJ¤dÁ°Ñ°oëc­Ì ×ÔlWvv÷‹}m[’Œ€XsÎyëU<[äUËp*6ñÇqª}S÷£r¤Î@G*2xǃÎk«§y^ƒÚ-k “´WQ˜.¢ŠHd]UH8üh.öÚY`´•f‘YËqÈó4Lúå¤M<Ê»#RÌ䟕l¿iq:@ð|;¨t‘ƒgvpAÀô5¬ýmQœ_!’·6÷Hͺ”Á ‘ƒû)½Õ´7º5œv’çá£î£ Á#9Á÷æ’©m$ï’€áV8Î >ç ÷ÖÖ°ÝÛ»¤W(YU±A ƒõš¬SÓÔWdƒ”¿MÓþÅ¿¸¤—vä@ Áx`:|¨‹˜®%g¹–0»üDdd}:ÐSÞ›v·??|¡™’\Ôôàƒ“øS$¶7“ÛLÝìÓœqÍ%&׎’6â“ýÿ±E•ÅïÅóåŽ@Vé?©è†¶¼[Þ}»ºsŒd:ÕßñK ñxÝÀ©Î NÙ{ÛS½>=£«“x¢ñäoìk,OGcíéÃW€ÎîŸz¦£ Ÿíb»·½3^Už‰Q‘J´RŸnͦ³˜daÓ '_ÏÒ¥%žàW½ãÊ€øš¼G ç0èk¶ T”×';qæ#a¶T©Ü1Ï¥oú¿*1µ°Ã;8éÒ‰·?så\}\tÉ$m…ÚlaT¦6‡ ŸÞ¥ÐŸ¹Lm>òz¹aÈdàùæ¬D:Ýä-׿|é¸â¨±Qâ¡'in=Å®„Mrô.8™öþ<ж ­È,rsÆ=+êð¿•)~¤‡dœŠM~6vŸIèq¤ {S˜Ï%M(¾»S¥‚D2ôúVË“XŽ#å]OB9úR=;ýiÚ ÛÙ|qÚþ‚ò3æiÔJRAáÎ}úÒ~Ì`Ù] €Âê_¡ÏCMr>ÃÁgŠ3íÒ³WñËÙíHjvJ‚#–q¹¼ˆ­8$ŒôaÖ’v âÎÀɽä:ÑlQß“ßÊ[òÀÿ'nÿâ?ú*´:|çcqÿÓZœn#8=j«œ1ì(Ø-x3ëÚ]HGäõÑ_/ÿÑJfÕnß´1Ýáfæ?‡î<ýï»ÀúVÐ+FäœïMÔrÊMS6Ú·h6&¢¢ÊÅ[&rïìkA%Íž™f;É(ùcÒˆž'Ã"ƒ‘øŠÍ[Ãü ×îã dÝÚÄzõ4¾Ä­÷(×;A«£ÝÚÛX]ÌdKÝøAçƒZ-"é.ô‹kˆÎøÚ0=r8 ýsWǹ?Bû6ŸàŠIØÖQ¢È¹,òåyý”&¸V¬ÒËWÄ:ŒRL°ŸH»žKXÚX¢/»X~tÙ©Î2Ö¥,Q]DÑ8]v•>b—àIÓ2šn—ªÍ¤YͬÐÀÑ)Hã톊][û˯J8È8Ïð¥še¦£ñ÷zE¶¥5œvÌHï„ðGŸþôØh¡;[´7A}#ÿʨ·ù_Yjvºž‘.¥~.ÒK €§×¥~7j7„(ë0ùÑ:†•w§êKM©Ëx­v¡RLáO\òM x3©])Pí¨óùÔÞèÑ-ù+…=k?Ú†Ýs¢•Ï7«ZLHÎå@¬ßiÔ Ý oWœtâŽæ14ŠãŽG˜àÒÔô…l1ÏÙ§<lÓÎAñc$ðioôŠƒ9+§žG÷©÷áš,0`9Áéšðs÷FséRGÎC Ê}Oî©÷_ NqH“Šû¸nO¦:Õêø½TÕ §ï/ç]-“Þ õä¿!™Õå5IG8û&~§ÜV³Fe:-œmÿpœ7÷GCYNÖ6u)‰9?dÏÿ˜V¯KŒ6e† ½Âd/éBàÒ~ÔcU> ùK¥Ö´È¦hæÔmÒU8 ÈƘ«T\¨p ‚2:|©rÍq œ¿5Ù`¸È ÎqïÒ…Œ‰°áûàtŒ±rébù¡cj=C\YbÇÆ|¨È8?:»­Tüƒó¯0í&¶“|;–@*d~9¡íÃÅ5ÔDó°‚AëŒÔšÕÔ¡”’*>íB$e¸ºVffyÏ&½M¾]«ÿG"º–÷ÿ±œ(¸•³ƒÝ©éïEÛã ò¡•†Â2QxÏJºÂ|«ƒ­_:::hÆ<:cjNåÇõ©D,|:mj}­\k’ò-Œ¼±¿h/J‚˜ð}AÁüè]7t·¨]pòüèîÐÛJý¡¼mŒ¿¤$`yP6 Ïrµ— ÎW_WƒÙå:©!©O#çJ®I=ªÓ¹ä[Kϯ"œ?…É=8¤× /j¬xÈøY>¢·î"³ÈóØ3õðÕÏj o­2O>ÿ¦ž1Øûöœg“V>]Cñ¸t¤Ø¬Bm{T õ§'9Ú?ôÒ·µÖ‡iUÜóá·wFÝ™é½~•µ‰‹©R6œô÷¤`Û’‚¶#éã¢÷{2“§ö¢á{™õhQœiâùŒ(ýµì棧ošÃXeyé;Ô9õç5¥(ÇiÆIæºN`©ŽžôX¬Í>Ò”ÈÕ-d˜×¯ü5Wf™ôë™´‹¸•nâc,l¿®'ªhû³”Ó¥e5‡“SÖíãÒЛûL–—9E†’cM³R&Iݦ7ÏB:Ÿj½fã‚yÿÚ²Ñv’æÂqo¯Y‹RÜ%ÌY)õ‘ù֚ܬñ‰#u`ã!Î}ø¢š3®µîníu’HC0†y"b)<1D7d¤aŸ¶ïÝOB$?·4ëP³†úÆ[+ŽEÁÇ‘ò?:EmªÞvuËW‚I-“ ÜCpÛ帓BðUºØK+í7_ÒþòKÛ^øˆKŸ¶<ó×ó¡n@}Jà€ru´úÓ‹9_´šäË]:͉ˆ¸þ•úf“ÏÿZÊrsö⎹ÿÞ—uedž}YIÃýÓçH;N£í c­ïP=©ûx‰Ã ž¾õí>ÔÐCœ‹ëô£º3‰¥Ú;³ƒæ9ÅfˆÙþÆ #ìü‚_jS€QëœÖoi_ôŒÀ0ãOàø©÷Ã4cl§ïúŠñ âÆìõÍq€Ü2 ʼ$eâAÆzÐ"x0à:ûê%#^•`6üÅK†î‡žqH Oj¸Ô'Áã왿ó Õin›d `÷)ÏOÕ—íaQ¹ÁõLÙé×p­6Ÿû>Ð ܦá…J5Ÿb&†õ §Î°ÏÙÑÚ]Rþm>8maŠf‹|„¹‘Ç^<…k(ÀïÈ4éúžŸwq>uqܾ÷Ša• ê•:ÜQn7D»éíhÖiÝ´. lH~2§’p0~UîÔ˦ÞÜEntùnõ ÚÊ¿<ÙM{=¦ý›o4“Èg½¹~òy3à =€ò¤òσÚËë‹Èž;KÅVŠqeR£•8éMîÁU¶S¤ßvN¶–ÞêÎkYÛ‰EÚ£xü>T¢{=1ƒ¾›§êw–èNé"*ÛOå×~Ò¸éÚ*êVè64¬p3í¹jÛ.ÕéÖvò[_Y>›,yP²Ÿ‘øRä«h£Cû×Iº½¶2Ilü\‰Û.¤ m?'Eхמ‰¨&ž_;Ãn‹æW#ê~´AÓo5mZ¼¶µ1¥ÔË<00ñ2®2GÏËù_§ü€®÷%v|+FCéЊ]ì¥ö.ÔuÞÏ_éËhÈowG#Ÿn)vˆ4›=Z(î¬/,îßÃn÷M¹O²ÓóZ)u‰leŠâï³BÞÃ\F2duÀþ¨êÚµ¯hcƒLÓ\NÓG!“iQV“‘è1LšÚD–ÁÁn„ðÈFAùúŠÎÝi-¤ÜGCFGÏd +*ú¯¡­HÉHˆ¨>ää[£‚lÌÉꊺæ‡(KåÊÉp&ª8ò?ûÓ}7Q‡T¶3[nâ;f…Æô#Óß΀ÔtÛ‹ †Õt€ Ÿö‹n‹2úF÷ª K¨wzßgçÙzœ?X\›… ÈýùИ¥íÊFÎåÁ¡ÙñË öýõdÌéÓ;ñåT(I2AO'ž(d£9x§íŒc?h@sÓN$‘“;Ô =|ˆ¤w,SSŸ’Ä_ÀGü#δÇÄðt©äÒ[0ò66zx>´4±¼º`©ô?5¢Ë¥cŒyÐ'¼Çu»O ŸºhD·±rÒR˜äûÃÚ¼²n.‰Uû¾œÔ<6òqÔuÏÊ»«M1sÇ'“XuŸIštŸQž‡çTÏ÷Z®=§Z¦a¼{˜,ÛWï69ó®BñÜ,ÆÚíg²¸`ùG#޵6 §zœ2àƒRYcuŠ¢ï@2ÅŠíÅ,z“ÜÆjnIÇ‚—ÁÆ}*± âm’÷$ðpvÔä:‡qÛ ©|AeÏ([¸ÆÜzUôøÔÓ·Dæ›R²¥&7VFelà84Q7*¥eipOG'÷ÑMªX²álDLA@«”8ëÀ¥š}¤ztW‹Þ‰~#n9ÚÀ“Ÿ®q[®;¯X²Ê/ÓÉÏŸ%rZ†ž5%Èå²:úÖ¡g”žPêAîˆ#8¨Ì.}«¶-üç¦s¾UP𔢒ª5q”c+c8•›kóÍD¡ÇB É0¢mÇ Zçë}È®ŸÚÂ!8µMí_*‰xÞ¦¶Ügç\K“IðeûQy=¿hgHÊl%IÈÎ<#­*†þw¸EB‡/Èéš7µ«ÝöŽäªä1Rß2¢“Â…§Cß¼3_UÓÉè‰ò}JýF?P$Œ¨^zÒI‰^ÖÙ‘ƒ‹Y:ÿzœ) îE*7ö þÆÄy~°®ŠÜµÜn€¨Ü‡ÏEg´K5 )5 ¨£¸šYßvñœp1øSô<œäg¦)GeÜ.—qns¾ —R1ïEn;Ø(hÚoU²ƒå°RŽÐi6Q%ŠCmîV6*9Áô­(‘¥"íD‰ÓYØŽé]½€ó¢÷C=‘ÒÙ7ø‘Á‡ð®ŽÆi‡³ã×xþGò‹I »ãŸì7?>+«Ú- 1õGv>e†à§±úh$fAžuš´~Ñ6›™ÔJpFI-ÂÒhì ühÇ—¹ü©tzæš;T÷DÑclo¼œc¢”›¦ü‹Ó€%¤¹+å‡^?*ïò3L=çw–]p壛µ:+oOR#áQ¦Ñ“Žzwoü(Ü›"ö/J(Yžéqýµ<ÿÃ\ì…²G¡¤ÊZYôžd‚F3ô£?•Z.X5à*F?£~*§²¬œ…ä™û³ô4·ãqÄÉäMmuJ¬>éÍdt» @ÜßæêÒÙÇkpcXäñ¨"? Ø4M–'œ†’hÎjúõ¼ÒG·âC°g y^¼Ð¹í#·¨i÷‰i¯,{$8Šö!„'ѽ>||«M¶9‘£‘GˆƒÐŠUw>“{g%­Õݤ?ï—rúAžK=QôI.¾*ß»ï­nî(¿Õ8òöò£‘~ ;4í§^ßhRžas,¼ã?ãûimÚ‰$ý¸8#qZN7‡¶,Á€yD‘1<†P3Yõ$êyãwÛ¼N)]´h–ÌúVê1‘êk?Ú-­¬h ·ÄnŽF8>Ñò¼ Ôf³½ ç[ìör¿ÎØçÿ >æq4\¨g¦zV|`¤6Îû8tmc»Y‡Ôo €Bé’ñ Ôiò1Òí|Çt˜=|«+Ú ¢úô… þ¨“>þ![ =ÃN¶ÈɧÝù •Á¬øEëµÎùük2÷ÚÆ£ur4‘oîc->Nö@£î± œùqÁùyVtA«h×—gZÇwmu)”G#ds׊ܘÐf‹ª\ݬðÜ[ü5ݳž#Ê䌂=ˆ¡o¯õ SQ—LÓû˜…¸if@Ê è ùQº.wn.o/$½»`Òªœ„`(>x垣¥ê×:޹Šè/{ 6ÖVáGqª·Díµ=oMo…¸Ò~0¨ðKh6=Ô ʪxuíd›¥K[\ˆàž%f?ÞÈãò©»E©î•¥û)c(®Xúôâ£ñ}¢Óó ök¨²äÇslcóåM}‚-»KÜè×—7Æ+»'Ëœ‚ç¡ƨ–.Ѥ‹©H¶R±å­{ ƒä çêjQönâïG¿kÙ”_^È&b‡Ã.6ëÐUïÚ cM.±†» ƒÕ¶‘üi݈¶§­\•·´Ñå¶yx2LÙD÷äUB}_³÷üzÚÜXÍ"Æòâf8à Œ‘åDIeÚ{B³A©ÇxW¬2BªzdUwY×Þ+{»Aad®¯3oÞÎT‚zr€ÿ]OQ:=‹Ý$ÆŒrXœòÍ)—S×´Èõô²ÙºháÈ’%õàãÒœêúgÚÚ\ÖÝçv_ Œ9È?Ž(+¹ï®.´}bÒþ8C3£ådFÈùŽžôÁUUhÖDcµ”2œ`×5š¹h—P–ÿB¹·’ñy¹´VL=p:5ÞÏb5â±m4ÐÄO-±\€? ¾ÿMÓÅ•´š_ÃG{#ÆÂe]à œ¶|Æ,j5É)5D]gF•a¿_ ˆÃñÕz×5-R-O²zƒ¤ÉYacâ½ñ¡ðÅ úõª-¼ð9KË`ùIqÔƒë‚0kÝ®¶Ž;Cwèå™ I´ãzàœ0úR“Øq[Õü7 b2l`û¹#ïi§2®¡«–ˆN£÷kJµN&ÕBà©°„’£ x2ÓÛíW 'Aáç»Z”7í÷’$¤PÀTò*—Œ‚1€ß>ãp7Ðr§º=+@Y•o>‡Ò³wlZþwbJüd·QÐV…\©äs‘J%Ï’²»NTñ×=3ïUÜF%ð7ôÜ_¥ZJ…+Ý–õ‡}»xR9㎟>j’3e(eÚè6Ž < (Õ.ç<Äùæ­pªLŒXq–¡ w)QÖ»ä9ò®~·è³n“ê"p~uTÝ­>:ªaÕóË“Úä OW„|$±HÑq"Ç b‡ßÁ¹$Yï) +‘¥µ¹™­­»¹'r[U[G s¥³]CñgžànÜ8Î3ŒgÛ5'¢ß %ÂÝ<-ñ!·nÁ>¹­:u‰ß¨ÉÌò/aå¶žF°>sæ¤cÜúTax'ïM´é?vFý†?2=êÁ¨\¦yR­•eÇPj,V¢o‡B¦eùÇLçŽ+iG§Òô¶gf¿™vEYd‘Äq& ;@ü9«¡‰®mÖâÕZx\®ŠpqÔtëC:#‚cldQ–w’éö«mdvD¥Ÿ dž§§°¨ŒpèùžåIåRùQTÓCaݵìÆþ:6O¾éGÌn¡±œdx"ƒº ªÈd+Ñ“ ǧJ1ÜÊÀãj…  y0g™aQZ昞[©")2$M,²,qGË;gð¢cuxÒDuxßĬ½¥òF 2: #sâFó¢müìcG>´G<˜\¢þd)eœ2$øeÒtëT @r„…Œ¶3Š˜ %xéš®å–d‘Œœ0ëì)`ŒñÇÕìVM~œ‰N¸i È8ÍvÄn»@åOO• 2ÈFT ¹Ë)„±êQw|ŒŸQ[O.9aÃg$¥Š| ØY¡'?ÐcZ*€¿: Ð6è2§\qåŠ6!÷~uÃÕòðpÂâoüÔÖ×<ãÖ“ÅÆ½Míy5Æ‹ŸWµòí †\f4Î^4ŠØwSÆÀ—¼ÓîÙ½»úð¡ûbÛg¾V,q¿Ž3_OÓ?’'ËuKõó£ÎGµ(˜çµÐørͱÇö©ÁB§ŸßJÔÿÒäÉãàH9?Û®¾à¸cb79óµŸ,tŽÒg‘k¨ùž‹(þ4üqÆHô4±g æšëq7u°†IAÆÖ "òî +FžvÚª>§ØR}:ÆMJvÔõ(ó¸b wž¤zšFu ËëûEº·7‰%#C³½#õºsOÛZÔÜ`hîóÓþt:hb4ûLm6–øòý ×›dXn´‡iêDk‘òâ—cT AÐnr:åÿýj?lêJI: Æ= ?å¤Ó±¼zeš¶Ógnª{±ÏåKVÎílñ|4&5³Œì0O zÔ>ÝÔZ<}…9á»ÃÇü´Z­òö’k“¤LÒ›dV…_•Ÿðùü¨îRN™¦K Ø{+oŸt¼~]*çÒìU‡ó8 zˆWøR·5Gäh3ƒ×‰?ýjè»Cª¢mV_!Þœùh¢w¶›d¼|%¶={•Áü©^Ûêšå¼IˆRáJ ^™^qé^:öªžÎLÊÃ#ô¿þµWe¥–Sª\Ì S5ÑFÇ” ÑL;EPSÄX«r<ýk(t»MGµ:°¾‹tÑ…ÃmÆTuùÖ¬0aÁþ¶:ÖFM2ÓSí}õ¾§ï%E’Ü£c*§¹Qt˜å;/¢xÏÝ•HQn ½™5;…Èn§Üzži•–‹¦ý‡, 2ÜÁ8ß,ä‚\ŸÖÏ•!íç™4™;HM¨ð,m êï Î'| ~ÍÕï?Cu¬#Û“™bB3L㊦ïONÎ<:Ž—<‘F&D¸¶‘Ë,ŠÌñÍY}Ù­*ÁVê) ‹Ær³«œçÓßéCi‚×Z¿ŒÞkBõà;ã·h»¾}H= {_cgÝà–C´žž”Šm¯·þÃNŸ}©Àm£Ž 8ôúR8®ÜÏß°¦²EŒŒC1#ð42cÜZe’Èjó#ÆöpNz'Z寕ð×±Áo GshÛCO½¾éêÙÎ*«Û‰4k OO¹„$“JóÛÌd•Y²Wæ3Ò¨¼ÐO¹’Þ-RÍS„šà« #¡ ŠFËò^ȶý•×ííüV‘ÎëNp0¿Æ­íˆgР$rz#á9¨™â—°º‚ÇmB"ñ±‰IÁÜ3Ö¬íŠÐàe<žƒ 4KGÝûƒêÏüãS$.M„8=|ϧ6ÒýS“2†Ïv´›RÂ6¨óðä|Íg{µüÁîoY%‚eåIÚSïÇJ"’ùGr@„±,ÝFO"ƒ’)v«y òïSW –œƒþM.ÄXø—шÎ~t:!Yœ¸âþ|‚ »ƒÃž½:SÇBŽV5 Ô?çŠI:‰.®]xþyÛåÎ<éú‘€˜qç‚jb¶4È÷)ÚW †Çö¿WÚ«p9-Âj“¢„àŸ^ŸÂ¨’Nç9Ó#5hÍî@°$£a²88ЦÈ2ÞÊ‹ž #Åé‘Vwª2ûFy Zí·v÷ä®B#‘Xu‹ô™¯HÿQ>u Þ«SPsÉùWΣÛ( 0~UQùUËçÅAÇH@N@úUrÏo¥‡s332©¸Þ6‚}|Õ®¹8ª÷¸*x%z69ÝÓ˽hçʦëK/]9ݶ™ce˜‚z¥cr·ïp‰nðwIÞ$€îÐsÏí®ÃăŸ#W£’¬UϨë[9àÒê&q†m[»!$«sJÈϰ "œ$ã~Ÿj"é#þ‘¢hÝó‚=}9QMŽX*è%†ÓÂŽ@QQ áP©FÙRŽW+‹¢Z”ÇG‚6x>"G$mY0Gžpy¦ £ŠDÎÉ#¡º€Fp}è†<'O8`üèå$€Iæ£<ð¸Ô3LPÊÍÙÀ_­I0m$%°W Ûî*‰›Ž*ÈÕZ×*T» N}*º5jkÊ#ªÙÁ¿%P¨šá”®ã‚@õ5p„rw°ð¹ðIúÐÑÄ$œ£ŒsíV,JAĨxéÏ?ˆ¢7~ßði=ç³ñä •WËcó¦ÑäÜÛ0<¸*=©k®À PÞÄâ˜A´ 6ÎFÔüiÅþ„$KëKðløx'—p>tt|cçKcqÆìÔ•ò}3L£ àõ®«zgFÈLg’=鵯SJ¢_>ôÖ׆®CIðe;gý¼ KD…G§–áY茆uàpà}sÅi;nMf!† °)lž^•›BÒO œõ澟¥úq>[ªú¬Ñ«îàõùÒc»ù`ÜØÆ=Æêq¹Bàà·PsÍ*F?ÊùÿÙ.xëâ5×Ü nT2äGO•!½o¶uˆô­ä[@Cܰ=}´6ÈÙ¸àHû3ý>KÇÁ–îF”“éœøP¹Å„ëZA¹µ‹áÉŽæÛ›v^ß#PÑuQ¨ÀË"÷w0’Æzƒëò§(êèQÎTtoJÍk¶m¯c%œÍmwríºà‚Ï õ§}+4C,¾#Î:Ї Aü)ÓûE»[8Ç0¯?ò×¾´,§~³ŒâãþZM !ÊNFNzRÛC»¶Ê_'ábŸ>´8Óõôåu´ ñÌ+ÙK¢³Ö>Û»Ž=@-ÊDìÚá”ç R­ËKch«Ž1âó©:MÞãÐpk4¶¥·ý,Z¤!F{¹bpù€ç\±ºíµ º¶žÒÖ<‘€›‰#ƒÔ{F¢)ÈýF<ÇJE;¶’EÀ‡P„¸Ïõ×ü3U;´O†mf!ä6À¸òÒ­E5k-KO–[忹ŠMÐÁÝ…,::QÜilm|lYHŽž´©¥ý¬b¸·—áï`9ŽP?#UZv£M»‡¾´û‘ÁŽåvŒû7OÇÐÆr]°#Tw*>õEìÄZ‹ °DØñ|:øàSM4 tçû<ÄÑ{Îøx÷³Ïî tÍOIÒ k[‹tÙCeÑ•¤Ï¡Ü#ç@Þ¥ž¯+ÞYvyîâ_½:Ìb/òæ±Udd`º¶4ñ ÓÖí;­™ÀB¼Ûíœô­$Ðè‡Fá€XíÊËôÏçUéÚ¾›ö H±ˆlá„uR=i}š“BNËÍŽíâ^ð°Qýc§ã@]îd;&/ ÄŽ$Ýà†îÉòÎ@Ú›{8šÆX"uˆ¹ŽHÜ7–3Ej÷Ñʶ¶XE~.£2*™6‚ y‡­)„¾"^ÿ&„!"iMÞò›˜/×Ê€ûšÂ£'»fQä¯È>ÀЦŸ©mÝÊ)PîŠEomê­û3”«1J0ó¯ñª”l( <ÔŽ LÏ£MFÖ¡Ûx£*Ã…”]}ý@ª4x­¬õ)´ýböâfÝ Ìãx”c…硞tïRÒ­µH€Þð\!݃ï#zŠ]n§X†k J.í{Æ^‡<«©ê3Æ‚ï`¾ÒE}•½HãGÀŒ`~¯¶HŸaÛ´M“òäxN,Ð] ]¬öOs5ÍÜM³¿}Í/?{ÌJ/¶’Р àúdƒS'±p4 «³|EóF,íÉäãqóô«µD¶G–8ËØÍ†–ØOëÇÌ •Äw㽫Žú;(˜Æç+2œåOáÇ¥Wmv,¥€?Ù¥¶Í ƒ/hþ`ú­âŽÛÞÉiÝ[\È%ŠAüÞéNB}m2iŽtïÇÌý|étö±Å}¶ÙÞdìêªØÎä>Yªï­¥Ó 7P\\0B7¬²nV\óò?*P-Ò„»¹d8"êܪ§­>v_ÂÃŒõ÷˜¿ÅLp üM¾@9ÏJпé1“î—µ(Ž|cŒ©äùŽŸZrW£™òù{|ªÖvRŽß˜ª¥,£!Õ×ÐùU°gR(ù–ãöT¬Ø.¡Ëý .•ÀqáóLtùW¬£hµ Ê ½ü«¯é3N—ê"g©¨8æ¦ÃÄj·¯œ=Âõ¨9¨3íÏ5/w¹‘‚žŒGj6K`’’ S,—búˆD,NÐû‘æIÆjùj•‚WMÈ’ǘÛÓdP½¬Ã<5Vô^‹§÷ÊW#<Œàn•] ºïî…鋸ØZ=¨ÆÈÀtÆhfPG4A‚â8Çz’ªùnWCÍ”+ðd±8Ëy_äâÌñ‰Ìq«ÏÝþ‹xÈ=pzñš»IkBu‰ Rï;T ÃŽ  »/ U›Ëš›G"d ÈàŸ:ˆeQÇN6\±ê©Qf¤², tiYÎHÁrÃÓ¨éFeÄ™@@½yБ@ÌèS°nÎ~tT‘IQ"²’23Q›&¨Vš/4ËÝ`òryªUž9‹Éôõ«Øxª¢:Væàî<Š’Ó. {æw2ä)Á7”ãò£îÔ0é°ƃ»Ì[†sŒŸ:-ämlû‚«Èò沊kOúŠ“O5¯é „å “œ; Wc“á2Nã|‡Üÿ HÚ9»è¾ö|Kýaüjq]¤èY<ŽOP}®)?æ[®èèŠÛKÁ*¸ ¤yyÓ[VË ÄË&Ÿo,EÞ`€#Î'ÏåZNÎê ¨Ù¤ïvùÁ\ô¨ŸNãk€×+äYÛ„-ª[€¸Êäã¯&³HÞ4E啯?Óvß½:•¸\l0ŒûšËò\²#'ë^÷Kôâ|çV¿UšâFo^€yR´ÀítØè,ÓÏûFš†‘ý“ŠSÒû¬€?šÇáúšë\‰pÇxâ‘’j[ÙqÞvrÈâ Fz`‚A¦#¶çrùñI´Gû?V¾Òý·lõOQM °ñw! õëšS«ÚÞ„Ïéßÿ:uÊóŒg*Ïë!×ôbì,®rq•âŠÝ{ŽØ`ãʹ¸ä÷¿#V²–C ç¨5…”•:­ïÞŒ`R;lŽÕêLwCôò=iÖBðþ¬ÁÕíl;G©Ë;™7ˆÕ;±À ]Ë Ð³ìà¨=y•(ìÌñ[h1Ê×ÄË,„ï`?XÔcŸSÕT¬Q=…›}ç“ï°öTd}šÒmÝd6ë8nw;’sî3ƒEW!j¨ô½£ï‰ƒI¶kˆ8\"ŸRM[§èÍm#Þ_Kñn0ìG=ÚEnZÆ!€cP0? ½L{Crco3åE“ø»´·¾QÜ+2ãÂXÇ·˜¥iÙ›« É¢jÛsðÒø£o—§ùæžÉ_¸¸Ÿ¼W¢o&fr çüæ„èb/¶5ËV}¤qúöÎvŸ¦í«û-1¿ÔuMJáZ²ëqÑ¢P<ÿдi2䯎ƒÏÞ³úz¢v×QØÍýlÝNž¿J/påëÏð¡ÐïŸúÏ ?fVµ¢E¬Ú®Å<-˜eƒzT{T¶³vjäÜ9Q€Ñ°ê<`PZwi·¶Õìæ²•ÕUf|˜å>þ™ÿ&„¼µ—èºÔÒËöF¬ zŒuŽ•}G¾<ªíSGš{Õ¿Óî ®¡Æó÷e‡ÔTõn×pvŠî#˜¥2ÓŸJFÖžYŽ‘«þ‹P…)ýÇ¿·Ÿ•ð h¥Ô/»W§[ê±GnÖÊÒ¨FÈ•€ÆGðÍ3…„½¼Ôw–cñ4&¶vêú&2&êsDZ°^Ý_Ë8ºç“Jø*¶!%FyýZoXtÍN9\+§ÉÇùéPp»¶Q¼ôð~TH|IÏ‘Àý¢£¼ôò=ó®x‘²˜8ä©©®&Cƒè84ÀÇöœ¿Åj{ÎOÙX_ï+gjÚD£ »åÔV+µün¨ý–>Ÿ¤­Œ„HTäm ÞÕ14šÙ®¼Ÿýlô5“±¾^Ì½í¦¡m6É'y¡š%ÈpÜã>DV•¤hÛw¯ŸP~u|nBp8òÈúUžÂ.ÍÇ<Ÿhj3[w+{0’8€ÁU â=OZ].ƒ¯êR_BæÖð¬‰:¡ 0Tã‘Zfï•2OÐÿŸzô‡ÇsÁýlphù3£\¼½wm'L76ë€f ä Yjí­cuÕlåÓî?£P][û¤ ~TMØ‘êõÛò=ETé¼nˆoþÃõü|é¯YôëÝODÕoÔB÷—ÜÃêB#ȶÜãÞ‹—µ6-h+iä¼q·àÚ3œùƒíî)ìnG„–‡—#zÛ6·™QÆ>TWbµ÷fF24+îÏBVT¶³’92pÇqÍO´}¡Óu =m-.L²¼ðí^é—8‘O U Õo­tËa<í¿œGg>@V~K}ÑG]¿¸²2$îW»YÀäúñH¨ï¹²ÃÞxÿ?º¨(J“Øò+'ÐW·56CÁIJ?å«Mdý¿©Ž1,£ÿÆ™:©vÀÛ0ó뎔—U·KK•Ô­õ´™“cw¼¬ƒÈ\~4“@=i–»oñ0épw¤¬òlû½3yRÎÕŤÎ,Â+O|BE¥GF#ÈçŠq«F‰q¢”²üHð“÷| SÉ¢mS$÷¶—Ù þ°Š1•ºˆy©ò"ŒŸ¹¾‹í=0…¸ÆÉ×à QÇ­KWºÓî\[MyW¶èå9ÌmäCy}i|Os ËÊŒ#Ô@ËÅ»Þ'ªž›©“Îå;×¹F‰¦[Hä'`{9_šŸO˜B‹ µ IÕpÍKØèO&ªšê oìo­È‰&c ÎS88G3œTõ¸á†Ú+˜V8î•Çtc#’OLz:_‘þ/"þyuáésHé×Òœ» ’3Ž¥yøË¬àfêÜ‘N$P«áðgÏð¢!.Å(“Â]Cë.1õ¡9;Ï@G‘$ƒùQ  g¡cƒøÐÒ,ÉžðãÌm?Æ™-l ,d9bPŸ!1WéŠçVŒåFcpzg¥Q ;ŽWy?Õ<ýE[¦¢N.váX3dž°ê¾“4é¾¢ aâúÕoÈ56ûßZ‹y×ΞØÃg¥@#|l×&òGYF;–ÎÓØcÚŠe5 €Åtáê^$Ò\˜ä¦Ó}dRV…žÙf¼†ï½ex¶íQåO4ÛÒ«1 Ž*°uÒ ˜–DUÎËŽõ F\ä £ úô¡l­…­íÅÑœÉß«+«g,IÎ~”pˆq\Ø­¾:m4Ò3],´Ø:¢·}±Q,e7Õ®Z[¥†˜öbA.fï:'ÀùÑ «ÍDí¬×PÔ4Q£ÂœµYDö)¨i«ܬL’ÚÙÁÈ£¶,V° „¦(ö³sÍQÁl1SÝ ®Í’9ÇA[ÅäÍB[.æmCõ7¿‚ |U×YíÀtŸ.¿º ÒBÂd>žõ+¤Ÿ•û£OЇ‡û3¸ Nµb;FÛí>èß–j”–#Ô8÷ÍwPø´ŽÜéJ$FÏxÆ0ä·¡Èà~pé²Eí%û™Ë>9l×îY3î dñg¯½¹šÆRÁ…#œ`šù3*c È¡Ç"®µ XG¢‘ÿ1¬åkò™Jžeø ·¹.Â)p³/ëQQš&Y»øN&õ bK•R$^QÇU5خۺ”m™zú7¸®UΨóÝÿüË€‹A߈díe#}­Fš‚%UQéX©„Á'ko Ã( GR3ÏÖ´½˜k±fô±•[aƒz¬~–¤öðB’ÕMnCµö°ï @2Ÿ!“ŠÏ&•*žð9Î=³ëO{rÐÇuhpD†1ž? Éå£nó¼;[’|ü«ÚèÚô‘ójýfh”øwÇFZUj7ö¶û‘Å´xüM3,CW ŒéïJ¬™OjuǤ>µÐ¹-pÇ©ÁÁqÎ+?Úq¸¶¼ŠeKØdÌJNKú®‘¦z®©™gß-+± ýséCiZ<É Õµ!ß]Ê7sÈ„z kmÉHßQÖ;Aó(ÒÆÛ;^V;›pêel ŒÞLz¼¬yù`Ôt–kÐjk¯èæ? ö<Ð:nÁ ?:€n¸3‡±úP`Ьð±<4R`ŠËFkë«ø¦Ô/dKY»¥ññ g'9­z(bùi.‚ÖZÞNžuÝÑnƸºì‚Ú¼±´åÂâ|ó•Ùˆ­>ŵnæ0ò.ZM¾-Ùëšg©†³¸›wmgs¦v®Ò;ûÖ½¢qm$§}9Ï8£­œÿ,õ„Ÿæ±tòäÕš» ®Òh¶± Ì’4² ýU­vÌ,´ÕðAµˆøÒ»+°ñÆÒ|Dž£¡þˆŽD’6W€z7¯î4¬;Û1 ŸÖ<z% ryŒùûÿ+¹)8Ú|%¸üü¾Uì°,d¹Áÿèc&VM«( y Q2˜ÂãŽyÝåüG½1Q‘íA?©ç«i‹Î?¤­T ߀äaA;µe{M¶KÝUÊø¾ÎLr:™+SîíÕÛ „p<|Ô¢çÂ.V]£ í=èk¢2PìÜŠ]¯¦I6ÅÔ-»â@îÄ«–>Üòi€˜`/$÷ªŒË•ü[Loæ ]ЀT䎞´ŸVÔSMÓ¤¹uïJ¨<Ë€)wyÚ{Kï-ná_Ù ÃmóÃc¨úÓ“HdŒm«ž*Îìà9<×NŸZXÚíªècW]æ“cýîirIÚÍ‚ö3l£ï 'NJúnõúÐèÓ¹0øuü TÔ ÒmLÏ!ç‘y»zUÑØý‡¢ÈÊeá ÇŒ¾q·|Òþ鬗í½|«]8Ž®xˆzzLigìö}s\âìðžï=þ×½rÆîÂâìjZÍý±¹Çè ï ãÍ¿e ig?i/[TÔØÇ§ÄÀ¬e±¸OAïçGÈîÝ›MÐ"žÛvÕ•Š(cí‘Í"ß›jú.2º…Ÿ^»×?@k8Qþ°³ö%Ç4-î0ý•€cVXÆåæªO‰q„ì½³ãi™3û3LI †«£žF£iŸwÿW©Þi7 $Búç¬Þ%÷Ï•L<ÌÇofmÆ<ŒÑÚ*ÈutùÊ_éMïePèÜô%GŽ7O§¯gõ(b·š í¥KŒ÷…s×$ò>TÛZˆ¬Ú)‰ÔqÇ=ÛcŠAÚK¨5{û{]1{Ùd,ƒ®xÇÈu§ºÆøïtU;U…È oôFÏŸ<•M4U¢¤  1’gÅÎþNðpÙÈ¡4Í)/t8·øö{wÅä•£´WI¿c³›‰òÏ“ÐÕÚ qžÏXm [¸\©ãËÖŠ%º³>öò½ÔX ¥¸5â1¿ºÆ_ùÍ¿‹y✺B }¸úRKÍÿr2Ú-ó‘ïNå‘¡\q‘B ®Þ'\°É÷•TÅ …e'pç‘W2¨ý fÙ×qÅ r¢Dá9êNI¦AQŽ8œ2¡Ç™Ee'úÊÀ‘âç×Â:^“NÝ’O±çŠ:ÅÏÚ6ÅP©ËpÞgi¬º•úL¾Ÿê"MÇçP'¯Î½3…,Ç€MPnaÁý"ü³_9MžáyÆ DùüªŸ‰‹Ÿªå»‰3—)¨°Ï?JŽñÅ ³™dP„`®rN*±(x»È¥IQNÖhÎp}ëXá›W[ª)Ð[H¹õ¡Ú^>´:JÒHˆ¼±5ÕÛ$R<3G0°ýÙÎߟñéZG ªèzÒtXÒp~uð»j¢K³(ó5'"4eSÉê}kl85ï-’3Ë—OÊ·l$ʱ#*ÌG'Nì8ÆÚœŠL“)+·V‹˜ _æ«Àük£,5$›Ò»#sÒÝ''݃Õ®¨È_\ÓÆÊ‚8O–qU)˜œƒñd‚±ôa^õýÍ}iÿCþÄö€Nµ(’VaŒà”Î* Òó’„tP×ñ}¡ qïÉÈÁÁ>¼yÓ†7ï&Y§ÞnÜì«‹kSÑOí5L®6d•QÉó u«¡ÃÚÂÀ’vœ’}Í&´à‘§«2ü±YMóÉÞ±„¯‘÷É£n-Ò}™á‡*ꚯN`{Õçûè¦+Yu’ýDÖÛÓ/•§äí¡SŽû—ï`zÓi쎑Rx#ksh÷1ϲ²{k ¤»] Þfµ 1nP§/—ÈVo[‘tý[OÕ]€‰‚l øO ‘ i“^ÎwØûCV¼v“€Ë! ¦9À¡uý6º­ÎÃ"ÅÜÌw¨Üq‘žŸJz5;·iÍå¼c'ôƒŸ—½#¹’ïµGe´Ÿa ÊJÃ&F? [oÈÒ׳vI(šùÞòà€wÎÙü½*ýORM"öb¹èˆ:¿¶<éjÞöŽR)4ûkÆrd”!aî= ³LÒ'¸¹:–¯°ÜsÝѶòõ¡‹îÏi¶3Ü_GªêÌÿÜB:B=ý hÊ™*²#žU¼±¡z³)ˆÏÞóúÐWz½¶˜˜™»ÂÜ$kËMŽ›í3M!w\Ì Œrª9$Q0vOO¸R¿}¼gÍÇì¥1jl;Dšž«i-­±‹¹ßÄçõ°2 ­b„+º B§¨ýô÷HìgþÌ‹³=¤²h]ÞÄh‰‘²ÈÞ¥c¶ã¶z®XsmC÷ºÕxuŽÕX€4v¥•ÀF÷©Zñ–§Ü¯xÏt¬uÈúdI#Úê2:3ŠÛÈ7CsŒõ¢‹ÇxtÁó¨àJî.ÌžjXã÷"¸•N w}FÓ†_p|è¨æ „ï'îȾçÒ—M¶òïˆæ<ýå?tÕÑJ]ÈÆíÃ.˜ûßÝô4& x3½¢_õŽª;l¡òßE\ÈúƪºaÅgoµÄˆq½ˆà^‘~+S1»0k(ù#˼èhÿŠGí$ÏvÆ+èÓŸº®£Ÿ,:"T¸CI»9£\ZZÎ$ÈÇx_ŸZK[Í#Tûîvž&ˆÍm);ŽÀpU¾\Sƒp-¢ËHNî…~F’Ø][´gQ‰ÁZBÖë.1½˜‚p>•Hλ±Ž¯b5]9­–Q»Õãf¨e9J_yªë°ØH§¥¼û0×B_ÑΌׯ¥²Ó–X ,¯*D²íÏSŽŸçåC.©ÞNŸiÝÅsl‡wÃÀÞ}XzPT{6nVã²é¤Á§_<]ÈDœD<‡¢ûÓÿ„6ñl·AÜ À@ݬö“-Ý¥óh×½Ó2Âdµž z‚t‘éCéQ뮚·‡Yšg`aFÛ†#Žž”ÌÚlÑ©žïIÈÉÜô=+?s{6­¬Éeg±Ù5ÄK¸³uÀôùÑŸ¼¹’ãS´¾¹oop©¥DnÙE>\yùÐÒ-ά^\5¼³ÙÞ•š4ÄÀ`å}0"•xÛnçgŽ€ÑÜMrú–˜Î±»±ý$Y87ÌŽjÛËË©¯ßMÓ&ØæyÀ(™è1ëAjš„ZÒ%µ²I ¨e{™äR«´àg©5AÕ„zÌú…´Ï Äj²…Ss†SÏÔPþå$ü‹k]Õî.Í©Îv€ˆ0ÇÉU|…‘_Üj¨ýî WôÓŽVÕê/–ê®I5ÑjÖÉiGo¸îa»† òÉÇ@)“9ÓBiZB±»n\·ê6zþJçXí`ML‹¼¹l–,x@z³ûÑÖöÒiöP[*™’% ŽxéåR±±ŽÂ3FÏ3ÒMÎçoSü(•Ô*þ¡ºŠlM¨\\ë[kIÄo.ýÅ`gzÐw¿iXXÏp·Q‹¸¯p£4^±ßiXÜ­´Ò¬Eêuä`sBj3Þ^XÏl,o• ‚ê8úæ‘qìz^]qñÝO‘4é² ÉŒ`šGtIº¹R žþÛ#ôù˜ò¡°=ŠçØ¡»²Aó¡úPŽË‚À²“Ô-v–!X£UL«’¬Øaæ5H†/“ô»{Í̫Шä}*ë0§h™Æ\áøäàÔ%ã|ÆPƒ×'ð«lÈ¡nK×ÐÖ}GÓetÿQºRLóÍv³ XíöÇÀ.ûr~”}ádþõNhã˜+ïñÆ3^/KÊtÏc,œchD&¼¶`Æ^ý?YyúQWyc*<,›…#±/»‡œ*I®Úèê±Â 8™tù%;Ô XG?é#ï#d*Ëž ÔD¶ÐBñÚFÁf#vàJ FóL5ËãPŽ%Œý¥Ic†ûâ«§Y'+"Ë(BZŸ>á2Å2IÝ‚1ÔƒWB¶öqÌ,ã””# çÖ¹#K+¢«7/áU®w•¼jáÄÃcçŠÝzj-):üIärMÅ_ä›Fá]|!x9ÎIö® Nñ•È^:W‹Ç…Kp|½Í[¾”I<ñÄd;W åÐt§{'_…ÿ,K–¯òÿáOφº±•XäÄHn Tæv–Æ_Òã¦Óç^{Yrɾçj”1Å%Áà›BŸ1Q–âHK‚þ2J¬j ǯ$b®qW$P^[$s7u$yPØ$0ÎqFJ¦<’iZ,;Ú;ˆŸ|2r­ŒpG­!Š(Œ³Ì±F͵Kr~@µ„Vö)k%‹Æ2OµVÑÇs†æ7+,Œ‡žzŽjã ~£¾ Õ=¹.°äã»# ÖcÌQF 7Us\$Q…û  T_aWiöáIæS¿5¬ÜdµÏh.“(§–;ÉòüYC%»1b<}qéEƒ¦»³î×#\ Ç­y¹s<²ÔμxÔ#¥ø˜àVw;V?js¡êpj!¹b£±úRY,ÞPÁqµü,B3ŸÝN4]=, ›8VÆyó«¬^•¿q-Ï]ví°Y.¬ã‰Dy$žÏüë*û˜”$ƒŒ1"µ}´rnlã@¥„[=y5•cá8Û¼àO•{ÒGÎußYš•ˆhøÞ:ZU¦´š¢’Ø"0Iþí4…{èOvB̧q'ΔéìÍÚaÛp£ tð×Zä¾Ì3[Óžú$¸µ|^Úò&ë¸Õ45§i,^ÔI4ñÛÈ8’Ö íê)²>Pä°Ç8ý_#ûª™4:æGí"’FYzNü“Bê-c´÷Ú‚Ê„D‚(—Ì:–ǧ½j §8lgƒÔV~ó³ÖwÔ‘/Â\¯)$i†*GÚ›$ÛÕ¥üYÊ™WkÀÚiÚ|LÓ2`Tá[“žqþ‹²ñ ‰õk§eiÚé±ç¼cåC›ŽÖ8ÿg°·V9ÝœòäÕzhô­ég=•À‘ÚFGRc×ÛM-ÅØÔ4b9 7 ùcöP:«¼5Û£ˆöÅ×}­“ìë@þ·?ùè+¨{O{k-¼ÐYÊUØx<„Ôµ°ãÈ÷D„CÙý>5^á[+ÔÏ5ÝBÍ5M:[œÿrL}Ò:Kg®ê:1A©iÛíãP¢â×Är§øý)å¶«¥êIºÎöÀÉÛc/Ì~µM>P…!ûSl>míedDûñ¸zã=jË]I_j3­ìÄÑã ÈyÓ‘sm Oaå¸W–îÛ’x¹ê7Œ7çKqØ­»5¥n­Œdõ 1À?,Ó4MªˆÕUzŠ©® ‡Åñíýa¼xiV¿©Áo£ÜwQ¬Ì„,jÀ“šNÆ­‘¹íÝH¶–77;¡PTŸÆÓõ»-` ˜®”x­åð¿áçó m>ßJ-§·dT¼c%¼É4¯´Ï¢1GZï9F·?¤FôÈëCIl>xjº„Z]“Lñî'‘“É!î)^‘¦IoîP5ä„¶sÄ`ô•5–¹,×óÉñ2[°xí¥PI_|u4ê×´i°Hmæýxeð²ŸoQJ¼4;.¤Ð†ÝátnVOñ÷¤…½î‰ .;=•ˈHrб=ô¦R^ÛAw¹E`‘ÏÊ•›É5Ûët¶‰šÒ –i%aÅ|‡­uܦXÛéÖbiRLîyï=Oðªt×ÏkuPáw!È^ãÊt`Ë;z®r@ô÷ôšÆAiµ?•î`Éܧ`Òî tÍbÏú6eqåž~ubʳªŸ»(èGEåÛ´È'ÌPe2Êѱ98u6RˆÁÈ.Ç/1Ž¿çÖªh<´dí#‘Œìj”ºÞvëŽjõ›yVR=ÎŽPS‹2šÛ‡¸ÔÙŽÁÇ‘ëúJÔ?qqjÐMÉ•#$e»@ÆêGaLYÄJç8ý!ü«Fw²¤…PÈÁõùúи +h{1£îÇt@„ïSü)”al”G"B¼QÀâªYá‚‘ÔÏÔTÓÆU³À8ãåNȧÜ´H÷:ZwÒ”ž7dQ’@`x©·i6±#JÔ_H¹ÏãE²˜vº:pg𫣕$låwôÇLÓ=¶›=Ïcc±‘R9<ò¸d9Ï5d:æ«%±Ò¦{»A¦}Cz{lFX¼x æ3QߨåƒÓ¥1X¸é7ú‹*ê7È!4D›K{Çï«åÓ.moóGh’Vc{y—) 8¢—¼BÚæÓåò4B‘°GOüh ÷‘kØŠD{-bÌåF~áöÏ%M+°Öµ=×ìöê!v K„œ’s•8Ç4óXÒ¤º1\ÄýÍì<ÃqäG£zŠª=KYVÑaŒ•¹P¸âÞÀš.³ko%ýΡ*‰ï%âP.0Gµ3NÕØB|3Êñù£ÂøýœTޝªŽBû\¯ðÅxjš£®[Aè3¹n@#ò¦'¿$!oåMОñš2#˜án §úÌ}=ª¹ûJ~?à´›_‹ ÆrFqéÐTe‹VÖœA5©³¶2²J­#AÛUº XK»{wk3n!~é|Qàç$g§4­QÄÖµk«©la³ŠÞñy=ä„õ€ géL¬l£Ò 124“HÛ¤™—,íïçôò a¼ûc´p_ˆ$[kx>ñ†ÆrØéÇ–?:v:nŠ]Ür¬9OáCØ‹ÉÆe,vu,I8ýâ‘I®âMѲ'ý¤@¸ô¦…°º°¸¶ÜRI¨>äR¨õ†·°ŽÚ[)¾-cîû œ1Æ>D{ÒIŽ#¹Gd…ã®W _—ʺ%Pz”çÈä… ¦Aðz=¥­Â‡hã¶‘‘þ{ªŸ.6ž 2LΣ»í ÂJœÜ[r<ù§¯Gp,@÷ý•ŸÔA·½T÷¶ØúÞ”ùÙãËH‰ƒæ?—15Ÿ`yT¢ïÍsšõ|帞î̾-‰=ö9ª%¶yI Úr☑ÉùTYA#åG«&í‚IpWrJœ{ÕVVqZ,ÝÙ?¥c”ÄF ZòÆ6¯Î·‡U(ÃBFRÂ¥-V’Ep2AªílÒÕ¤xr ¤:d"éó©wxÝÇ,}Tñªˆç†3vÀØ&óæy&¢ñdhÑÀ]Ã¥2hþ÷‹$ñåIu3×­½ÇèÃN”¶B× p¼ŸJìkúe‘¢¥ãG#sBÁN>†§•vƒð®Øæ„Ö¥--òs–/ÿEûzÙ? b{©I ž:š•¼.IÞÀu’?<,[íFÇ9ÆsƒçTÜX›¸Ý™o¸yñÐÖ°Ï¿O¥çÉœ±JK\Õ¿ÐX±—2’H1Æ›F»Büª«hŠÄŠÌXª¸õ4J¯O•yýFYN{»£¯#²¢%€Ûší¿!A뚢hÙ”Ö©Ó¬òÝ‚àÈpPô©ÇJ-ÉÐå)&’C¸cŸëS8Ý@GÐüè蛫™HWÛ.ì5›þ·txùXö!lc­Okólîrª ¨ÇÈÖS9ØŒ~êúNé#åúÿ¬Çй@’îõ s@éóÁ¿¬™çŽÒ'‚Fw‡Þ¯·cˆHÂ8ð·õZ¢úVŸyqñ–ñÉ#,Ã8ãÖº“ÜÒ¶]FÄ3{k•û¤È¼Õ«ªZ)ÂêÛÌ«‘ùõ;öcE1ø,Þ7_©¡³úJ¹ŽK8Áþó§BC)u+ U…ý¡ ÷€•G>ÜÔ—U°¸øÛAâ8&UÁ÷àÐ#³š;@à£Ü‡Å‡nGãUIÙý&9p,®á›øÐ¨M£Õtÿ¸o­9<ŽùW>©b“·Öœtý2Ÿß@'fôyS f‹ 监øÔ׳z<ŠÊ4äVÇHÇ÷ÓØš fÁ£ ÛPÃï2þ#š‹jzxÉ[ëP¬<@N¹ãšSö˜ Œ:à•,ÜQÏJ);;£Läzz £½ãd~tö GŽ¡dwz…¨*xý*ãðÏJ¢KNË_Ê$¹6@Ÿ½¶p¼úðh‰;7£!Ü,WiÀ囃øÐçCÒÂÚr]°ÞÝjvKè]“Î[\ŽnGñª×Fì«¶Wòþr0:c…¢°Úx!¸Yn¾‡žµ);9¤œ˜ìÂ9]ÍùsOPÀ‰Ù-ƒÇl¯ÐƒsŸß^Oìå£ï‰ìY²xyÖ Åš6IÝ`£Ñ²Ùñ«~ÁÒ e,“‘æ[øÒ°àY6›Ù›’\5¢1ê> ßEií il;†´ßй˜bMUu¡ØBÀü*˜ýáœjÒôÆ l¹†çŸ4µ•‡Ï§ÆÁ—Q†LôÌ£óæ…¹ŸD¾âöKY½üA¯G¦iH‹ßÙ&ðþ,gÓ¯Jäú.Ÿn7xÙòÏÕ;"’KÍ!ð½¢s“p¡lQ‹©Y[áÝ©ˆ .Éù`БiV3Û«DǨÃS›GÓÓ ¼ezŒçZv˜è9u+a,:º¾sŽý@?ÃåøUZ9KÎÑjÓE:¶b‹ àÜz tÝ=[ô–©ùѺlÐ61¤2“— >äQ°8´†fIVD H >àöóy—¼-&಑@Àqòõ¨ …ºNêUPØQž§Ô{ÐÝÐIwŒzr¾ø(,p­"3îL§Éô5dW ¡£‚7¸àŠöçt‚ŒCŒ0ÿ"¢ÊVi£|lÄí<=jorêùjë$÷ºœj¢YÎ  rp$$âûj-¡VÆð×l<—5 ¬-ïnÞ#·1¾ÖǦ|ÅE4{3Ök¼>üÕ¢]:Ô,ÜY^üû¯ñ®®µloK1Ýù~5Ñ-$Muž¹iˆýÕ[höÙÄ’]€:ôŸ­=‰¤ºŠÇùàùÀ~|פ×bv –7ËÇ#¹Éö=¨ÿtûýjÈ´›6,>"øÿÎ<Ð*EÇ´(@cex®Q þ}k¿ÊÁÏÀßz‘çó¨͆Ԟ𿚙¿Â t[}Àw·¹‚ew‹ ‰röŽ2ØkKÜõ¡ÿ휀ﳽ :~‹§×5Sh0î*——¼~«Ü0ÏÈô5¢Û![‹Ô|yÜŸ­¨ž}j<[_ÎA0“ŸÎªme\Ö×`¯ÿ$ŸßÅX4h2vÞÝ€O ÜG×øâ§öE¼n¢K«íßýr)åG´hwÚݸ<Aû<êM¬Û7ý’ýÿ@ô®|ÅuvIòø‚ ýÆ©\Q¶Þþð~阩Ïùô£€ùY)5XÁÁµºÈýanA[êh_Þë?ÖkÍcãùÍÞ?ÿ!°?…q¬ ln¸ºÁõ¸cŸ­+»‰Œ¯u)…•Zk`;Ä*IÏéO]C1ØÁ3É^´#èHË(žiÁ^BFGO:›íçË'¯Ê„ ߤWMÄFHõ\qB»Ì§ ’=Àý•`ºcǾž~¾UƸ+“݆“ž¿4ÄÓ¢™&ܘ™ºtšó´}å²íL«‚8óôÅzK‹rFähóž0óÿÞ…½º·¶Ž)÷F²+ž3Íwƒ¡bÛ",‘±-À?×þ5Ì5ËžWŽáÔ1ÈýF>F¥ü¡³Þw]1DCþá˪»ýeM®Á£œü«¾cå@sM-ãØcšðÖ´Åa™Ÿn?îÍ`ðNöE© µÕ_o-ØëK›\ÓÒ&ŒÿÝšè×4¿Y%cžFiú<R cë]þ·Îƒ:Þ–…ç'9æ?*óëzaÎÙ%Éò1š^„üPsµÂ'û´ ×tÒ Æqçß·4Ò|ãÑÑèäð·‘Ó¥x(sB wLŒͿ§Ü«SY°dT1ÜoêwÖF~ w`ÁùÐ髨ì;’ã ù%J-^цŠäç¡ KÒŸ‚¬¼ Ã š Ë|ªªØ—pa¹ Ž0•ÔÖ,Ãmî™qŒ…|ézRá¨Ý« ­f\0¶¹(TdT†±j¬§ánН_©x¤=‚‚çS@ÿâ [\³ ¤[\àG&ÖmØe,îqŸAIâ÷ð2FÀlzÑ‘1ºþ˜jPËžîÎë9èqFÃp%p©§ÜØ,ôÖ$¹Sìû\GÂÙ±^IoÈ+&Çs +G¬ÞÙ]È,åg_†fVŽ7géíJöé§ÂL›[çùàWÐô˜ÚÄ“>g®’y]šEð2ÿDøçú¦­iYa𯌬ƒ9?:L®Ñ ¬Å­ä<7ï¦p6Ãmƒ¸cp=FkFΕ†+sâ/Ã!'÷ÿƒaÜÖaºŠ\ë$%ÕFJò@µvíÀìý êOˆBð$y•ò²ªM²F¥w Åp]’Õð1Üèppdž^k¬„ú…ò#§øP"âS ²²ýÖ^=<ªÁ3‚B©D>cŠ- K:dx ;nyðÿ…L¾ô8ËŽ|ñ^¶³¡9ƒ´gñ(I ’R¢'G‘Oý™¦˜š [‰’M’ð9©üSr®O#ËøÕ(“©T~ž‡¯Ó51Þù+@õ¡‚-Y™xfOBÝ*ÔŸÁËÈÕ+JŒSqÁÁVoÛšñV@«ýìùSůq3c»ãÈó]ŽöP1(_vàPÝÇŒ²§ŒrjÒFc$J ý`wgçE‰¤ÊíÚÈ®§Îqõ®¬€ý’~œÐky‡VösW3:0ÞÆŽãÚ‚!ºÎàù®GøQËrZ=¬€ tÈ ý•¹rId>!à ç÷Ô”ź<Ç%¿…'wq0Êí±åü:¦j§2*1’%d¬g§ÏÒ–w².ß ¸#ï+!%˜ítpIóã#ðæ–¡è¢M4r ¨ùÏÞSŒŸÃ÷W„º) ü³ÈùT]¡œâh±êÜ>¿ÄTVÙøh™eP0¢OØ…&‹Œˆ_b)VþÖX~5T¥â´C£¡È¨ÉªëÞBéÇCÓñëûj&B¤ˆ¤pAåIÀÿ?J-$ÈKs"ò˜9þ§?•WñÒ9Ä«îêvóD¹Ü[r°Ï9 ŸÝ\îQ¹gM¼þ8&ÙMEvï3Õ@òOßU$…ðè€ãÏŠ"Oo˜eÿ8ª»åL«[¬8$’?*-‚ŠeM:9ÄÑ)÷ûWJ¤ˆU!fªúÔ•ãRDQ¨÷Ã’È ('ØóùÔ¶ÊQˆÂÚ†ÃÛ>›‡ð«–ÆÉ” †òÊçøQëŸ Øç>Ÿ¨øÈœ:çÔT3d;é°•$ ™KT}—)!Ó?Zf²,~ûÏ¡Áü3ÍI†äb¬c¨ þ,¨¯¸ô”?¨àù2?.•ÒÌm’ LuúÓ£ €e„އ©ÆsU ¨}žÊ•2Áᴉȅëê>µæ°Ž Áþ®1S@ße?Ú=~˜®´›‘µI=7ý•›5œŠÉrˆv•Ϩý½*è¬av¤Çâ!}ç5»e` ¨ùò?þÚ¼KºG0Æ+7fˆô¨šmª¨Ã'ô6aGU#Ê‹2‡mÌ£qêÀõ®´Ñ€ ?0j7-$z+5*¬–Î=\,£g'» ƒ’3Ò¢“«FÑ…IÎ èjØ™KÎO^p85›5Eéa(S03ô¯}Ÿ!ÑXœà_­N 6gÅÔg8¢ƒ :ŒÖl¤4ؓƜc¨Í^l!V]½5s¸+±ðsäjjXxr^™ô¤Û) saŒ€HéåÒ¥‚ÅÆãôéE,€€õâ¬FÈ+çSc)±+–\g€qFBgA >~uQÚÃŽjÛQÞÌ«Á#œ.äÍü§Îõ§-¬ß®J‘;ç<~±¡b£’=êJàç<û  ;^ÿ®ï‚žýÇNœÒä@ê„9ãïbö#ãú«/ÉäÕtd†ðÄ9'áÎWßbkšB.—¯³”nàŽ)§‚~OݲˆEQ!'þëÒ»=‹â$<=§Òe ½æâ§a<ÕiÚ-"2¶¾(ù1~ÊU ®mŽÓ÷O¥J5-¿¾xühôb/^Cx»Y¦Fk•aÜõòõëC·ht—ʵµîÁÉÌ\Š PÙ€ÓþúµÔ¼ÏªþÁG£¬ì%;K¥ÆÄˆ/C… žç<¯µü¦ÑY<Ç+’ ³š U^öç Ãåõ«xÏ#ô8ägÒŸ¥^y0˜ûS£ª*¬ä»úñ«ltŽþíØD9üét*¡­1ƒà=GµycÌpø2;æòãõ©úqªÆ2ö»Dišqi~¯œÜ gþ/:’vÇC‹ ;íãï„`ý3JÛ»J6éÇ—¸¯H‹‹¼Œ/j=8‡ªÇG¶Ú/vèÖ€ln \`õýjvÃE(±Ôv:å•¢SÿåA¸ôÙUþ‡¦>uÔ(e·ô'¢j~œCÖa«Û]$ª©´ÔO*L+Gþ*„²ÑHYj!Úp¼û}ê£Å§C×ËØÔ^îPí^n—¹¥éD=f;e¥&æmþ Á…pOü]j×í¾”Ñ•û3QbœÑ¨úðx>ô¾H£\xWúEÀÇʹ,I›¿'hè=¨ô¢³ nÚéøeû*ÿ$gú5þ*›vëKxãŒiìq /.x Œ1‰Û¯ô=x÷®C }å¾PsòùSô¢³/²Ó–@ðé7ê Ø¸'þ*èíÅ–6¶xÉœcjŽ+hŒV¾å›Ë¯¢-¡î†cíCÞ—¥úò-~ØÚÿê›À8 PAükÍÛ[q•ûë Ù#§ãÖ©’Úîä÷k÷×úTæ‚ñ8Ž0{¯ãG¥üDŽ?k­‹í‹H¼Æ3¸•ÜGË8¯×!@£J¹*ã€ÛX°B&QÝ/ô>žõÈ ¦è×î1ì(ôb ¨‘Åí‚uVÒ.˜îÂ±Ûøg9®¿là F•NÐ[nG·ZôvÑl·;ý)çoκÖÑwo”ïÇ—¸£Ñˆþ"EKÛëx]*é â¬^غ—ÿU\g?sŸJKx‚Ýâ0G°Tä·ˆË8îÐècçG£ø‰=²v+"pJçÂÊ?çòÅ™“:EÃn5ªØíbïáÚÿEéò®Ãm KOÆxö¥è@O©‘GòÉÊŒhóy Ë¯í¨7kæÁÿTLí¸ïÑ)o" G|rF™©=¼'.{áÄ{Sôb/ˆ‘HíÂÆTés°AÈg\ΫþVL$ì™<:ôühÉ`ˆ|gè—î/j“C ¸*˜|‡¹£Òˆþ"@KÚÉ™ƒ&“2¹R%^jcµ·’ª‘¥ÎYºxÔ &;Uï-· þˆñÀô¨Á h-NÅ$r=”CבBöºð)fÒ&>- ÷Ê0}+ǵ—Û_ýS"ààâUëøQÝ )îÓú~zzÔžÏá<Ȥp=©zQ õä{Q|Œßꃅ#½^*mÚ]A±ÑùÛŸéTQÓ@„ÝEÆÁ‚~F¤a‹¾ÈqÜúyæN!ëÌN½£Ô‘†Í4ãv ‹Rµ:–ä+¥çw‡àæ™Å5%ÙÏà*1@›-ð£ïŸ/”Gñ=ªÔ²HÒü;¶á¦SƒQ~ÔjûýV€¯R&Î3L{”(|+ý?'Ö¼ðä\…U>%à(ÏAG§ñÿ*5p¬²ihåFNe|¸©GÚ]M(Ò€b7gâ1ÇáLeŽ3-Æ'ºÀù×’(Útô\ñò£ÓzòþUkM·lx~@ir?f*—í«&ÙKYŽ8—Ïð¦èVÕB àýï•Cn€?JxÇÎð?^]…kÚMuFï‚\ÛžóϦ:WŸ´Z˳¦B>ðY1MZ0"“+þøǸ¯M rv€ô^u(ŠZ8f )ÎãŠ_Àþ72ïý‘œîµ}Ñ¿ÁÛ0-·o~y#>ÞÕ⺨äXÚ.רJçw—ó¿8ñ ì¹×¯™ª[ifË‘åÒ¶QIRG,¢¥-Oˆe²s»b½˜–ðF\dûžu$ 7cÓštÇMH\‰Éä–Vò:f»QÅcEÞ…|!AÅW=ÌPK tîœ÷7+"º´r¸9ã~´1/¸ÑâÇÞ €*««˜03¢Jãv\r~‚­_½ÀúŠŒö¯<È®v ç# }ÉÃuo}‚>0Å”©u«%¹·µ Þ²£6#SæO¥ §ÙÏf’ ^)ÎL€OÏ$þêºîÔÜD§r¶zô9 6³ÖW0ÊDÅž1ÝÙテ€ÌÅ%Ë3ØurORzæ›B l¸É9&€uØí($ý&Ùb`•dÁ!¸Þ‰‚H¯¢Y#f_$‚ê 4i´ñ5Á‘¥på$àúj/Oµø nä°ooÚ|€ò ØíÖDGžw/8÷kF$WB`*9xò8úÕ£`>ø VW0Dîí±Bœ±éЦÆXî-"–&ÊíÀ$.*wV‘^Û˜¤fU$¡Áâ½§X ;nç¾iâÛ˜sÉùÓÄÑVyÎÔÉÉFu È‘cÝÛðËŽh©`Dñò»\ƒÈ ´í/ì÷“2+a`ãÌ€y>ôà0Ʊ÷ŽOî>~T¸j¶éºà,íðHîàIÏþôÙsëòâ–ˤ¹uT‘¤Û݆“žAô j»Œ6ðJ3¸úRùõ‹X˜ÈÛó ÷d·$"ÄqÅ5ÇNGáKçÓRy^Q)IYÕÔíiއ¯Z•w ‰Öê(¦]à}õb†›R‰¤h¤Icƒ ‘Ó‡ yÇ9ü¨«Khí-RK*¦…û%^{‰ZâG©R„/Ðd~41ª.‚æ=@IÇ$d•uàô<ÅFúùmä´2ß dÂî8O?J•‹Z4’<Í4®.ÀA€+—:Å]Erg•Z!áQ´¯àAçÞmd­¯¡žòKHòZp¾åÅròïìËe+ÊŠ $6î|ýª6šEµ¥Ù¹„:±]»wäuÏJõŠßwbIdºm˳}Á€ÚÊS‚Úñ- 9i`NÞ7r8Î~ S$*…±Æã“Å/m*'»wÈu©Uå”`ã?AÅ1%O ?±\d ‰ðXýß/jµPwàÎHÅT’y±V‡ç–?Á'¼†=NÞÜ—2¾Tm^FyçÚ‹îÁe,Äí9 §Ó-&¾Žë2,ªáÉY @ÀȦ÷N}qHm õmB+äHÉßá*>ïÌŒŸaGøe@§Ó÷Ð7új_º³K"¥œ©ê91FF * Î2sHUõÔp˜ dsñ`d\…àõ櫲¿rÉnðòFx>£ÏÒš²/rb8 WoœPhÖ)lmX²J¬Ž[iõ”P&ƒá’+˜âA—rds‚<é|š£«Ü íÂü2wØIAWÐb†ÚŸ†u— ¤ŒŸÍ&2GÁÁfQÁçøÒÍOV[k˜#–²î;±°ŒŸáLäSá\|ÇJ]wgmzÁ®-ã•×f#Öª ±9*g9¿R¼6ðb³céôŸÊ‹“…Ê( 󼿉ø¨#”DÒ/xÝjÁq•âïôˆóÅtœvŰi×±FÈ@eøvU |ªä³ZÌ¢ÖHâm˜Œ'#«c¡ùyѱê·€@•8çIaDK+ ƒž¢«–ˆxX°ýïǯ¦O}É&£Ü”¡©%ŒI•v•ü1D¿yÛøVv8.W¶vyp^iav*†>>覷º'Äjý/® ”&Ði{dÊÏsí-³6¶î¨¥MÁEðN˜ü¨³H­¶7’aO+ᨳ¡P>y¯Âó¹qs𭀬iˆ³Œuú€j¢Ù?{#ÜÔØŽyS‘ä}(epFVäŒg•A}ßÊ®}ë÷yÍå¼ø4Š+| Oµ u:[F]÷mÎ<¿y£ ïBÝ#KÀÛ®Ðh©-Ëv‘¸Sœ€Û†úÕÈê>YªÚƲ†`¡UˆäzU„yƒû(EmØC-‹DL¬ V''#XéVÚX½µù™f,¬ Žzú׫ղ9ì¶[–Œ¸æï3Ó?¶¸tÖ14q”#½.¡Ëq‘ê9Íz½I Ø}¤o¬qI!vQËg­¤y®}kÕê¢$Äc=ê`í%qù׫ÔžÐpk¡6ŒŠõzR@'¼Ì1Êò¯W©°:½8®žW«Ô†{ ÉçÓšƒ1Æpν^¦!~¡¥Ù\‘=Ä;Û…ûÄyã×Þ‰´³†Ê.æÚ¹Î2Oí¯W©!ÞÁ;yò*Ž@ò¯W©Òøs^ Ø&½^¦Ibœ®kÀb8é^¯P†{Ž™?…I~øSÎkÕêCDŠmo*‘B<ÿ õzw

Õêõ"Îw ϽuT“€y÷¯W¨1ºICC\à Òlž$‘sA¯W©‰ƒG¤éÆIØÛøqÏv<Å1[Æ#Š5H×¢¨àW«Ô†ÉäóÆ3^#ŸjõzŒ‡m¼ç«ŒŒν^ d»²3ÏîëhÏJõz»SŠŽõïvŒîÇ¥z½H¤‰î#$ùW´äøŽ+Õê`‰„mÝyùמA–láO8¯W©ž\‚p|³B­ìMq$8}ñŒ“Ž?mz½@Ñ8.’â•7= åÔÏlÍ,JT;Ä ûkÕêCîJ x-בƒÔ"š¹H/Áaõ¯W¨n¾%7.í¹#ÅV3*)8è¯W© êQÿ6ÊÉú¹ÀãçG§‹€9÷5êõ0‘BÞ‰!i0T$@ÏJ±`§ÌôÍz½RùE¨,÷w*°x>ù#¯U=?P]Fö껊ø¸<|z½M ­‹&»H§Š–•¶©ó‚yçÚ¡i©Gtó¬aÁ…¶¶à:ûs^¯PÂ(¶æím­{÷]Ê1|þuIÕj-cµÄª›‰Ç‡z½I‚D¯nÒÃN’òdÝ ¹Ü1KOim);«·gŽ9Ç<׫ÔÁ-†Ê8%²G¦j†HMÈS•Ûœ9ùW«ÔÈÃn}¸â–jZ¤zsÄ’‰¾m«´ϾkÕêE™6ôÉùÐ“ÝÆ—QBÑÒç^¯R-Ùê0ßM2FަÚÛ€ü¹¨ê„zz*;nm£mz½IòZHé¸Nýa!·:–˜ª.î"·„ÊêåW¨_:õz“€Í¨Å¼Sí“l§ 8È«w’2@?:õz‚ÙÿÙvisolate-2.1.6~svn8+dfsg1.orig/visolate/src/ATM0PCB0.bot.out000066400000000000000000000544451147500217100233730ustar00rootroot00000000000000package: visolate class: visolate.Main args: ../gerber/examples/ATM0PCB0.bot graphics device: :0.0 pixel format 8:8:8 24-bit depth Comment at line 2: Mass Parameters Comment at line 4: Image image name: C:\USR\KOTAY\DART\RESEARCH\ROBOT\MOLECULE\HARDWARE\PCB\LAYOUT\ATOM0PCB0.BOT Comment at line 13: Aperture Definitions Comment at line 51: Plot Data computing inch coords... making nets... 86 nets making half edge loops... 50 loops Thu Aug 05 17:01:33 EDT 2004: TopologyProcessor started border: true line: false voronoi: false flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 Thu Aug 05 17:01:38 EDT 2004: TopologyProcessor finished (4370ms) 0 nets Thu Aug 05 17:01:43 EDT 2004: FatnessProcessor started border: true line: false voronoi: false flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 0 misses avg fatness = 0.0319619177337633 Thu Aug 05 17:01:46 EDT 2004: FatnessProcessor finished (2402ms) 0 nets Thu Aug 05 17:01:54 EDT 2004: FatnessProcessor started border: true line: false voronoi: true flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 0 misses avg fatness = 0.10809711481018451 Thu Aug 05 17:01:58 EDT 2004: FatnessProcessor finished (3506ms) model bounds: LLC: (-2.053999952316284, -0.0040); width = 1.2579999403953552; height = 2.4229999618530274 board bounds: LLC: (-2.053999952316284, -0.0040); width = 1.2579999403953552; height = 2.4229999618530274 86 nets (35, 101, 247): 1 siblings; 1 strokes; 0 pads bounds: LLC: (-0.8948999819755554, 0.664199990272522); width = 0.038699960231781017; height = 0.025300001621246338 length: 0.17070215661078691; area: 0.00976; fatness: 0.05717561039520722; areaDPI: 500; areaPixels: 2440 (35, 101, 247): 1 siblings; 6 strokes; 0 pads bounds: LLC: (-0.9216000018119812, 0.664199990272522); width = 0.0653999800682068; height = 0.04760000658035278 length: 0.17070215661078691; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (88, 218, 76): 1 siblings; 1 strokes; 0 pads bounds: LLC: (-0.8948999819755554, 0.7370999875068664); width = 0.012; height = 0.03870001983642579 length: 0.15130001306533813; area: 0.006504; fatness: 0.0429874384557474; areaDPI: 500; areaPixels: 1626 (88, 218, 76): 1 siblings; 3 strokes; 0 pads bounds: LLC: (-0.9216000018119812, 0.7282000007629394); width = 0.06539998006820678; height = 0.047600006580352794 length: 0.15130001306533813; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (52, 224, 107): 1 siblings; 1 strokes; 0 pads bounds: LLC: (-0.9216000018119812, 0.8232999863624573); width = 0.06539998006820678; height = 0.012 length: 0.16440200433135033; area: 0.006692; fatness: 0.0407050998387608; areaDPI: 500; areaPixels: 1673 (52, 224, 107): 1 siblings; 5 strokes; 0 pads bounds: LLC: (-0.9216000018119812, 0.7922000112533569); width = 0.06539998006820678; height = 0.04760000658035278 length: 0.16440200433135033; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (51, 225, 106): 0 siblings; 2 strokes; 0 pads bounds: LLC: (-0.9216000018119812, 0.8562000217437744); width = 0.06539998006820678; height = 0.04309997510910035 length: 0.08449995517730713; area: 0.0053159999999999995; fatness: 0.06291127597458936; areaDPI: 500; areaPixels: 1329 (196, 117, 70): 0 siblings; 8 strokes; 0 pads bounds: LLC: (-0.9216000018119812, 0.9158000173568726); width = 0.06539998006820678; height = 0.04749998998641969 length: 0.1643129475414753; area: 0.006328; fatness: 0.0385118768464835; areaDPI: 500; areaPixels: 1582 (198, 101, 83): 0 siblings; 11 strokes; 0 pads bounds: LLC: (-0.9216000018119812, 0.97980002784729); width = 0.0653999800682068; height = 0.04749993038177491 length: 0.1574692502617836; area: 0.00956; fatness: 0.060710265554113255; areaDPI: 500; areaPixels: 2390 (125, 45, 212): 0 siblings; 6 strokes; 3 pads bounds: LLC: (-1.901, 0.471000000834465); width = 0.4799999514818192; height = 0.47500000298023226 length: 0.772776648402214; area: 0.080664; fatness: 0.10438203608608018; areaDPI: 500; areaPixels: 20166 (21, 115, 247): 0 siblings; 3 strokes; 2 pads bounds: LLC: (-1.203999952316284, 1.35); width = 0.30399994039535516; height = 0.2940000095367432 length: 0.37870052456855774; area: 0.03728; fatness: 0.0984419021929584; areaDPI: 500; areaPixels: 9320 (123, 56, 204): 0 siblings; 8 strokes; 2 pads bounds: LLC: (-1.2039999514818192, 0.19599999487400055); width = 0.3579999506473541; height = 1.7479999661445618 length: 1.9115431755781174; area: 0.18588; fatness: 0.097240806472385; areaDPI: 500; areaPixels: 46470 (129, 20, 234): 0 siblings; 3 strokes; 2 pads bounds: LLC: (-1.4790000476837157, 1.2300000004470348); width = 0.2090000946968793; height = 0.09899995186924948 length: 0.1707107573747635; area: 0.024556; fatness: 0.14384565084022152; areaDPI: 500; areaPixels: 6139 (126, 9, 247): 0 siblings; 3 strokes; 2 pads bounds: LLC: (-1.203999952316284, 0.07400000149011612); width = 0.1159999284744262; height = 0.27999998658895486 length: 0.2871319204568863; area: 0.040588; fatness: 0.14135662776683308; areaDPI: 500; areaPixels: 10147 (185, 198, 0): 0 siblings; 5 strokes; 3 pads bounds: LLC: (-1.2579999723434447, 1.786000057220459); width = 0.41199997234344476; height = 0.46499984741210953 length: 0.710097461938858; area: 0.112596; fatness: 0.1585641493388339; areaDPI: 500; areaPixels: 28149 (52, 213, 117): 0 siblings; 3 strokes; 3 pads bounds: LLC: (-1.2579999723434447, 1.6860000333786012); width = 0.41199997234344476; height = 0.3680000619888304 length: 0.5761320888996124; area: 0.069384; fatness: 0.12043071604034496; areaDPI: 500; areaPixels: 17346 (32, 168, 183): 0 siblings; 2 strokes; 2 pads bounds: LLC: (-1.203999952316284, 0.07400000149011612); width = 0.2549999284744262; height = 0.38000001043081283 length: 0.4078426882624626; area: 0.050704; fatness: 0.12432244455825577; areaDPI: 500; areaPixels: 12676 (85, 57, 241): 0 siblings; 25 strokes; 12 pads bounds: LLC: (-1.837999997138977, 0.22299999237060547); width = 0.863000044822693; height = 1.9799998950958253 length: 3.596388354897499; area: 0.511876; fatness: 0.14233056875043434; areaDPI: 500; areaPixels: 127969 (238, 22, 123): 0 siblings; 6 strokes; 7 pads bounds: LLC: (-1.6799999761581421, 1.2699999523162842); width = 0.06; height = 0.660000023841858 length: 0.6000000238418579; area: 0.078008; fatness: 0.13001332816706782; areaDPI: 500; areaPixels: 19502 (204, 120, 59): 0 siblings; 28 strokes; 10 pads bounds: LLC: (-1.9575000476837159, 0.474); width = 0.7475000238418581; height = 1.866000047683716 length: 3.9464839044958353; area: 0.42732800000000004; fatness: 0.10828068993596753; areaDPI: 500; areaPixels: 106832 (177, 47, 159): 0 siblings; 1 strokes; 2 pads bounds: LLC: (-1.203999952316284, 0.35); width = 0.20399997615814214; height = 0.20399997615814214 length: 0.21213200688362122; area: 0.039384; fatness: 0.18565798051213767; areaDPI: 500; areaPixels: 9846 (165, 178, 39): 0 siblings; 4 strokes; 2 pads bounds: LLC: (-1.3510000476837158, 0.974); width = 0.1910000953674318; height = 0.4834999436736107 length: 0.5639088600873947; area: 0.071896; fatness: 0.12749578006073098; areaDPI: 500; areaPixels: 17974 (161, 81, 141): 0 siblings; 3 strokes; 2 pads bounds: LLC: (-1.779, 1.171000047683716); width = 0.25800004768371587; height = 0.1579999046325684 length: 0.24142133444547653; area: 0.023828; fatness: 0.09869881655128288; areaDPI: 500; areaPixels: 5957 (196, 160, 26): 0 siblings; 3 strokes; 2 pads bounds: LLC: (-1.4459999576210976, 0.11); width = 0.3000000053048135; height = 0.14399999403953556 length: 0.3071320354938507; area: 0.046252; fatness: 0.15059321286895205; areaDPI: 500; areaPixels: 11563 (103, 153, 127): 0 siblings; 1 strokes; 2 pads bounds: LLC: (-0.904, 1.4789999952316284); width = 0.05800000000000005; height = 0.1650000143051149 length: 0.11000001430511475; area: 0.01796; fatness: 0.1632727060396837; areaDPI: 500; areaPixels: 4490 (86, 122, 175): 0 siblings; 1 strokes; 2 pads bounds: LLC: (-1.901, 0.974999999627471); width = 0.052000000000000046; height = 0.2510000480562449 length: 0.20000004768371582; area: 0.024648; fatness: 0.12323997061730131; areaDPI: 500; areaPixels: 6162 (196, 186, 1): 0 siblings; 4 strokes; 0 pads bounds: LLC: (-2.053999952316284, -0.0040); width = 1.2579999403953552; height = 2.4229999618530274 length: 7.329999923706055; area: 0.5362760000000001; fatness: 0.07316180158005492; areaDPI: 500; areaPixels: 134069 (37, 244, 101): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.1010000476837158, 1.4789999952316284); width = 0.052; height = 0.052 length: 0.0; area: 0.006332; fatness: 0.12176923076923077; areaDPI: 500; areaPixels: 1583 (249, 18, 116): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.5459999809265137, 0.14899999701976777); width = 0.052; height = 0.052 length: 0.0; area: 0.018216000000000003; fatness: 0.3503076923076924; areaDPI: 500; areaPixels: 4554 (46, 249, 87): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-0.904, 0.295999988079071); width = 0.058; height = 0.058 length: 0.0; area: 0.005692; fatness: 0.09813793103448275; areaDPI: 500; areaPixels: 1423 (221, 147, 14): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-0.904, 0.39600001192092893); width = 0.058; height = 0.058 length: 0.0; area: 0.006328; fatness: 0.10910344827586207; areaDPI: 500; areaPixels: 1582 (173, 190, 19): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-0.904, 0.49599997615814206); width = 0.058; height = 0.058 length: 0.0; area: 0.006848; fatness: 0.11806896551724137; areaDPI: 500; areaPixels: 1712 (17, 213, 152): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.203999952316284, 1.786000057220459); width = 0.058; height = 0.058 length: 0.0; area: 0.010328; fatness: 0.17806896551724138; areaDPI: 500; areaPixels: 2582 (153, 77, 152): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.203999952316284, 1.6860000333786012); width = 0.058; height = 0.058 length: 0.0; area: 0.010336; fatness: 0.17820689655172411; areaDPI: 500; areaPixels: 2584 (46, 175, 161): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-0.904, 1.8859999618530274); width = 0.058; height = 0.058 length: 0.0; area: 0.006212; fatness: 0.10710344827586206; areaDPI: 500; areaPixels: 1553 (8, 120, 255): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.4790000476837157, 0.5710000238418579); width = 0.058; height = 0.058 length: 0.0; area: 0.0102; fatness: 0.17586206896551723; areaDPI: 500; areaPixels: 2550 (188, 69, 126): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.4790000476837157, 0.670999988079071); width = 0.058; height = 0.058 length: 0.0; area: 0.013616; fatness: 0.23475862068965517; areaDPI: 500; areaPixels: 3404 (144, 181, 57): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.4790000476837157, 0.7710000119209289); width = 0.058; height = 0.058 length: 0.0; area: 0.00968; fatness: 0.16689655172413792; areaDPI: 500; areaPixels: 2420 (54, 83, 245): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.4790000476837157, 0.8709999761581421); width = 0.058; height = 0.058 length: 0.0; area: 0.00732; fatness: 0.12620689655172412; areaDPI: 500; areaPixels: 1830 (158, 184, 41): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.4790000476837157, 0.971); width = 0.058; height = 0.058 length: 0.0; area: 0.007292; fatness: 0.12572413793103449; areaDPI: 500; areaPixels: 1823 (109, 164, 110): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.4790000476837157, 1.071000023841858); width = 0.058; height = 0.058 length: 0.0; area: 0.005560000000000001; fatness: 0.09586206896551724; areaDPI: 500; areaPixels: 1390 (130, 100, 152): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.4790000476837157, 1.3709999761581422); width = 0.058; height = 0.058 length: 0.0; area: 0.010692; fatness: 0.18434482758620688; areaDPI: 500; areaPixels: 2673 (45, 176, 162): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.4790000476837157, 1.471); width = 0.058; height = 0.058 length: 0.0; area: 0.0119; fatness: 0.20517241379310344; areaDPI: 500; areaPixels: 2975 (153, 203, 27): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.4790000476837157, 1.571000023841858); width = 0.058; height = 0.058 length: 0.0; area: 0.011132; fatness: 0.1919310344827586; areaDPI: 500; areaPixels: 2783 (58, 235, 90): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.4790000476837157, 1.671000047683716); width = 0.058; height = 0.058 length: 0.0; area: 0.011032; fatness: 0.19020689655172413; areaDPI: 500; areaPixels: 2758 (66, 74, 243): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.4790000476837157, 1.7709999523162843); width = 0.058; height = 0.058 length: 0.0; area: 0.011588000000000001; fatness: 0.19979310344827586; areaDPI: 500; areaPixels: 2897 (60, 77, 246): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.779, 1.7709999523162843); width = 0.058; height = 0.058 length: 0.0; area: 0.010588000000000002; fatness: 0.18255172413793105; areaDPI: 500; areaPixels: 2647 (108, 85, 189): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.779, 1.671000047683716); width = 0.058; height = 0.058 length: 0.0; area: 0.007716000000000001; fatness: 0.1330344827586207; areaDPI: 500; areaPixels: 1929 (74, 123, 185): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.779, 1.571000023841858); width = 0.058; height = 0.058 length: 0.0; area: 0.007712; fatness: 0.1329655172413793; areaDPI: 500; areaPixels: 1928 (89, 45, 248): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.779, 1.471); width = 0.058; height = 0.058 length: 0.0; area: 0.007612; fatness: 0.13124137931034482; areaDPI: 500; areaPixels: 1903 (42, 202, 139): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.779, 1.171000047683716); width = 0.058; height = 0.058 length: 0.0; area: 0.00396; fatness: 0.0682758620689655; areaDPI: 500; areaPixels: 990 (122, 155, 105): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.779, 1.071000023841858); width = 0.058; height = 0.058 length: 0.0; area: 0.007232000000000001; fatness: 0.1246896551724138; areaDPI: 500; areaPixels: 1808 (208, 97, 78): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.779, 0.971); width = 0.058; height = 0.058 length: 0.0; area: 0.010996; fatness: 0.18958620689655173; areaDPI: 500; areaPixels: 2749 (129, 236, 17): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.779, 0.8709999761581421); width = 0.058; height = 0.058 length: 0.0; area: 0.010888; fatness: 0.18772413793103448; areaDPI: 500; areaPixels: 2722 (127, 244, 11): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.779, 0.7710000119209289); width = 0.058; height = 0.058 length: 0.0; area: 0.009596; fatness: 0.16544827586206895; areaDPI: 500; areaPixels: 2399 (42, 220, 121): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.779, 0.670999988079071); width = 0.058; height = 0.058 length: 0.0; area: 0.008147999999999999; fatness: 0.14048275862068962; areaDPI: 500; areaPixels: 2037 (214, 87, 81): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.779, 0.5710000238418579); width = 0.058; height = 0.058 length: 0.0; area: 0.0056760000000000005; fatness: 0.09786206896551725; areaDPI: 500; areaPixels: 1419 (162, 194, 27): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.779, 0.471); width = 0.058; height = 0.058 length: 0.0; area: 0.013496000000000001; fatness: 0.2326896551724138; areaDPI: 500; areaPixels: 3374 (83, 71, 228): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.6889999666213988, 0.13600000655651093); width = 0.058; height = 0.058 length: 0.0; area: 0.017248000000000003; fatness: 0.2973793103448276; areaDPI: 500; areaPixels: 4312 (103, 128, 152): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.494000033378601, 1.9960000953674317); width = 0.058; height = 0.058 length: 0.0; area: 0.015292; fatness: 0.2636551724137931; areaDPI: 500; areaPixels: 3823 (110, 199, 73): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.6889999666213988, 2.090999885559082); width = 0.058; height = 0.058 length: 0.0; area: 0.025232; fatness: 0.43503448275862067; areaDPI: 500; areaPixels: 6308 (59, 131, 193): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.806999997138977, 2.2089999160766602); width = 0.058; height = 0.058 length: 0.0; area: 0.007976; fatness: 0.13751724137931035; areaDPI: 500; areaPixels: 1994 (253, 48, 81): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.678999976158142, 1.171000047683716); width = 0.058; height = 0.058 length: 0.0; area: 0.003416; fatness: 0.05889655172413793; areaDPI: 500; areaPixels: 854 (101, 57, 225): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.678999976158142, 1.071000023841858); width = 0.058; height = 0.058 length: 0.0; area: 0.006648000000000001; fatness: 0.11462068965517243; areaDPI: 500; areaPixels: 1662 (182, 76, 125): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.578999952316284, 0.971); width = 0.058; height = 0.058 length: 0.0; area: 0.010024000000000002; fatness: 0.17282758620689656; areaDPI: 500; areaPixels: 2506 (249, 73, 60): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.578999952316284, 0.8709999761581421); width = 0.058; height = 0.058 length: 0.0; area: 0.01; fatness: 0.17241379310344826; areaDPI: 500; areaPixels: 2500 (115, 124, 144): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.678999976158142, 0.8709999761581421); width = 0.058; height = 0.058 length: 0.0; area: 0.01; fatness: 0.17241379310344826; areaDPI: 500; areaPixels: 2500 (148, 96, 138): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.578999952316284, 0.7710000119209289); width = 0.058; height = 0.058 length: 0.0; area: 0.01; fatness: 0.17241379310344826; areaDPI: 500; areaPixels: 2500 (232, 29, 122): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.678999976158142, 0.7710000119209289); width = 0.058; height = 0.058 length: 0.0; area: 0.009996000000000001; fatness: 0.17234482758620692; areaDPI: 500; areaPixels: 2499 (11, 159, 213): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.578999952316284, 0.670999988079071); width = 0.058; height = 0.058 length: 0.0; area: 0.01; fatness: 0.17241379310344826; areaDPI: 500; areaPixels: 2500 (176, 156, 50): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.678999976158142, 0.670999988079071); width = 0.058; height = 0.058 length: 0.0; area: 0.01; fatness: 0.17241379310344826; areaDPI: 500; areaPixels: 2500 (143, 216, 24): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.578999952316284, 0.5710000238418579); width = 0.058; height = 0.058 length: 0.0; area: 0.006664; fatness: 0.11489655172413792; areaDPI: 500; areaPixels: 1666 (190, 55, 138): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.678999976158142, 0.5710000238418579); width = 0.058; height = 0.058 length: 0.0; area: 0.006652; fatness: 0.11468965517241378; areaDPI: 500; areaPixels: 1663 (249, 112, 21): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.578999952316284, 0.471); width = 0.058; height = 0.058 length: 0.0; area: 0.010012; fatness: 0.1726206896551724; areaDPI: 500; areaPixels: 2503 (37, 197, 148): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.678999976158142, 0.471); width = 0.058; height = 0.058 length: 0.0; area: 0.01076; fatness: 0.18551724137931033; areaDPI: 500; areaPixels: 2690 (142, 111, 130): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.928999975323677, 1.596000000834465); width = 0.057999998331069946; height = 0.057999998331069946 length: 0.0; area: 0.015220000000000001; fatness: 0.2624138006543152; areaDPI: 500; areaPixels: 3805 (218, 35, 129): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.8289999514818192, 1.8959999531507492); width = 0.057999998331069946; height = 0.057999998331069946 length: 0.0; area: 0.013644; fatness: 0.2352413860793348; areaDPI: 500; areaPixels: 3411 (99, 217, 67): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.806999996304512, 0.13600000739097595); width = 0.057999998331069946; height = 0.057999998331069946 length: 0.0; area: 0.020224; fatness: 0.348689665205839; areaDPI: 500; areaPixels: 5056 (33, 200, 149): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.494000032544136, 2.1139998883008957); width = 0.057999998331069946; height = 0.057999998331069946 length: 0.0; area: 0.02638; fatness: 0.4548275992944043; areaDPI: 500; areaPixels: 6595 (122, 213, 48): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.806999996304512, 2.090999886393547); width = 0.057999998331069946; height = 0.057999998331069946 length: 0.0; area: 0.013632; fatness: 0.23503448952165729; areaDPI: 500; areaPixels: 3408 (86, 182, 114): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.678999975323677, 0.971000000834465); width = 0.057999998331069946; height = 0.057999998331069946 length: 0.0; area: 0.010003999999999999; fatness: 0.17248276358382184; areaDPI: 500; areaPixels: 2501 (99, 82, 201): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.317499966621399, 0.19249999403953552); width = 0.065; height = 0.065 length: 0.0; area: 0.013172000000000001; fatness: 0.20264615384615386; areaDPI: 500; areaPixels: 3293 (214, 125, 44): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.3299999523162842, 1.1800000476837158); width = 0.06; height = 0.04 length: 0.0; area: 0.0033040000000000005; fatness: 0.05506666666666668; areaDPI: 500; areaPixels: 826 (218, 118, 47): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-2.0034999542236327, 0.1685000069141388); width = 0.111; height = 0.111 length: 0.0; area: 0.024224; fatness: 0.21823423423423421; areaDPI: 500; areaPixels: 6056 (110, 35, 238): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.402500002861023, 2.257499963760376); width = 0.111; height = 0.111 length: 0.0; area: 0.024548000000000004; fatness: 0.22115315315315318; areaDPI: 500; areaPixels: 6137 (252, 24, 107): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-2.0034999542236327, 2.123499900817871); width = 0.111; height = 0.111 length: 0.0; area: 0.012672000000000001; fatness: 0.11416216216216217; areaDPI: 500; areaPixels: 3168 83 collected nets (3 supernets) Thu Aug 05 17:02:12 EDT 2004: ToolpathsProcessor started border: true line: false voronoi: true flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 mosaic: 631 x 1214 tile: 502 x 487 generating voronoi toolpaths extracting nodes... 24126 nodes making paths... 66 paths total length: 48.4140020404011 total segments: 24273 optimizing paths... total length: 41.973337987205014 total segments: 1554 Thu Aug 05 17:02:22 EDT 2004: ToolpathsProcessor finished (10346ms) Thu Aug 05 17:02:26 EDT 2004: ToolpathsProcessor started border: true line: false voronoi: true flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 mosaic: 631 x 1214 tile: 502 x 487 generating outline toolpaths extracting nodes... 34524 nodes making paths... 87 paths total length: 69.04800410941243 total segments: 34611 optimizing paths... total length: 60.87925191503018 total segments: 2343 Thu Aug 05 17:02:42 EDT 2004: ToolpathsProcessor finished (15253ms) visolate-2.1.6~svn8+dfsg1.orig/visolate/src/ATM0PCB0.top.out000066400000000000000000000575651147500217100234170ustar00rootroot00000000000000package: visolate class: visolate.Main args: ../gerber/examples/ATM0PCB0.top graphics device: :0.0 pixel format 8:8:8 24-bit depth Comment at line 2: Mass Parameters Comment at line 4: Image image name: C:\USR\KOTAY\DART\RESEARCH\ROBOT\MOLECULE\HARDWARE\PCB\LAYOUT\ATOM0PCB0.TOP Comment at line 13: Aperture Definitions Comment at line 51: Plot Data computing inch coords... making nets... 89 nets making half edge loops... 71 loops Thu Aug 05 17:03:29 EDT 2004: TopologyProcessor started border: true line: false voronoi: false flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 Thu Aug 05 17:03:32 EDT 2004: TopologyProcessor finished (3900ms) 0 nets Thu Aug 05 17:03:37 EDT 2004: FatnessProcessor started border: true line: false voronoi: false flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 0 misses avg fatness = 0.03572215970267543 Thu Aug 05 17:03:39 EDT 2004: FatnessProcessor finished (2056ms) 0 nets Thu Aug 05 17:03:46 EDT 2004: FatnessProcessor started border: true line: false voronoi: true flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 0 misses avg fatness = 0.13572265861872415 Thu Aug 05 17:03:50 EDT 2004: FatnessProcessor finished (4105ms) model bounds: LLC: (-2.053999952316284, -0.0040); width = 1.2579999403953552; height = 2.4229999618530274 board bounds: LLC: (-2.053999952316284, -0.0040); width = 1.2579999403953552; height = 2.4229999618530274 89 nets (241, 75, 67): 0 siblings; 8 strokes; 0 pads bounds: LLC: (-1.0593000230789185, 1.3475000085830688); width = 0.038600003242492686; height = 0.03870001983642579 length: 0.09974082419648767; area: 0.005908; fatness: 0.05923351894868388; areaDPI: 500; areaPixels: 1477 (42, 120, 220): 0 siblings; 6 strokes; 0 pads bounds: LLC: (-1.0726999816894531, 1.2934999885559082); width = 0.05199996185302734; height = 0.03870001983642578 length: 0.10607087006792426; area: 0.0070880000000000006; fatness: 0.06682324747087566; areaDPI: 500; areaPixels: 1772 (112, 99, 172): 0 siblings; 2 strokes; 0 pads bounds: LLC: (-1.0593000230789185, 1.2394999685287476); width = 0.038600003242492686; height = 0.03870001983642578 length: 0.059524279087781906; area: 0.003964; fatness: 0.06659467465627247; areaDPI: 500; areaPixels: 991 (133, 151, 99): 0 siblings; 12 strokes; 0 pads bounds: LLC: (-1.1377000389099121, 1.0760000171661377); width = 0.05200008106231689; height = 0.03870001983642579 length: 0.10758260171860456; area: 0.01118; fatness: 0.10392014899623506; areaDPI: 500; areaPixels: 2795 (88, 207, 88): 1 siblings; 1 strokes; 0 pads bounds: LLC: (-1.1377000389099121, 1.0252999486923218); width = 0.05200008106231689; height = 0.012 length: 0.14721786230802536; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (88, 207, 88): 1 siblings; 9 strokes; 0 pads bounds: LLC: (-1.1377000389099121, 1.021999997138977); width = 0.05200008106231689; height = 0.03870001983642579 length: 0.14721786230802536; area: 0.00858; fatness: 0.05828097124551356; areaDPI: 500; areaPixels: 2145 (29, 251, 102): 0 siblings; 7 strokes; 0 pads bounds: LLC: (-1.1377000389099121, 0.9679999771118164); width = 0.052000081062316905; height = 0.03870001983642578 length: 0.09648542292416096; area: 0.007448000000000001; fatness: 0.07719300775469726; areaDPI: 500; areaPixels: 1862 (206, 95, 81): 0 siblings; 6 strokes; 0 pads bounds: LLC: (-1.1377000389099121, 0.9140000166893005); width = 0.052000081062316905; height = 0.038699960231781017 length: 0.10558002907782793; area: 0.008196; fatness: 0.07762831732086709; areaDPI: 500; areaPixels: 2049 (112, 26, 244): 0 siblings; 6 strokes; 0 pads bounds: LLC: (-1.231600004196167, 0.7485999884605408); width = 0.06540003967285157; height = 0.047600006580352794 length: 0.14087305404245853; area: 0.009704; fatness: 0.0688847137301024; areaDPI: 500; areaPixels: 2426 (59, 203, 121): 0 siblings; 8 strokes; 0 pads bounds: LLC: (-1.231600004196167, 0.6845999779701233); width = 0.06540003967285156; height = 0.047600006580352794 length: 0.16440250165760517; area: 0.008412000000000001; fatness: 0.05116710460719967; areaDPI: 500; areaPixels: 2103 (115, 185, 83): 1 siblings; 1 strokes; 0 pads bounds: LLC: (-1.231600004196167, 0.6384000005722046); width = 0.06540003967285156; height = 0.012 length: 0.08899998664855957; area: 0.008024000000000002; fatness: 0.09015731689584323; areaDPI: 500; areaPixels: 2006 (115, 185, 83): 1 siblings; 1 strokes; 0 pads bounds: LLC: (-1.231600004196167, 0.6206000270843506); width = 0.012; height = 0.047599946975708005 length: 0.08899998664855957; area: 0.0; fatness: 0.0; areaDPI: 500; areaPixels: 0 (25, 117, 240): 0 siblings; 11 strokes; 2 pads bounds: LLC: (-1.779, 1.571000023841858); width = 0.6330000476837159; height = 0.38500002384185783 length: 1.2016295418143272; area: 0.082416; fatness: 0.06858686236655016; areaDPI: 500; areaPixels: 20604 (219, 61, 103): 0 siblings; 3 strokes; 2 pads bounds: LLC: (-1.006, 0.49599997615814206); width = 0.16000000000000003; height = 0.9040000238418581 length: 0.9328427165746689; area: 0.105864; fatness: 0.11348536909708098; areaDPI: 500; areaPixels: 26466 (54, 102, 226): 0 siblings; 7 strokes; 2 pads bounds: LLC: (-1.8059999523162842, 1.471); width = 0.659999999165535; height = 0.5100000238418578 length: 1.0869849398732185; area: 0.12052; fatness: 0.11087550119512876; areaDPI: 500; areaPixels: 30130 (189, 69, 125): 0 siblings; 3 strokes; 2 pads bounds: LLC: (-1.4790000476837157, 1.744); width = 0.3330000953674317; height = 0.10000005722045913 length: 0.32263462245464325; area: 0.038108; fatness: 0.11811503585718645; areaDPI: 500; areaPixels: 9527 (144, 169, 69): 0 siblings; 7 strokes; 2 pads bounds: LLC: (-1.4790000476837157, 0.39600001192092893); width = 0.6330000476837158; height = 1.2330000119209292 length: 1.4863961413502693; area: 0.076864; fatness: 0.05171165200292793; areaDPI: 500; areaPixels: 19216 (240, 21, 122): 0 siblings; 7 strokes; 2 pads bounds: LLC: (-1.4790000476837157, 0.295999988079071); width = 0.6330000476837158; height = 1.2330000119209292 length: 1.486396163702011; area: 0.091452; fatness: 0.061525993024786944; areaDPI: 500; areaPixels: 22863 (118, 229, 36): 0 siblings; 3 strokes; 2 pads bounds: LLC: (-1.4790000476837157, 1.671000047683716); width = 0.3330000953674317; height = 0.0729999856948853 length: 0.28121325746178627; area: 0.021012; fatness: 0.07471909464601005; areaDPI: 500; areaPixels: 5253 (254, 56, 73): 0 siblings; 5 strokes; 2 pads bounds: LLC: (-1.806999996304512, 0.13600000739097595); width = 0.661000043988228; height = 0.318000004529953 length: 0.7147960662841797; area: 0.09288400000000001; fatness: 0.12994475540814232; areaDPI: 500; areaPixels: 23221 (54, 132, 196): 0 siblings; 1 strokes; 2 pads bounds: LLC: (-1.779, 0.5710000238418579); width = 0.15800002384185796; height = 0.05800000000000005 length: 0.10000002384185791; area: 0.025736000000000002; fatness: 0.25735993864060913; areaDPI: 500; areaPixels: 6434 (168, 74, 141): 0 siblings; 1 strokes; 2 pads bounds: LLC: (-1.779, 0.471); width = 0.15800002384185796; height = 0.05800000000000005 length: 0.10000002384185791; area: 0.033616; fatness: 0.33615991985322957; areaDPI: 500; areaPixels: 8404 (40, 190, 152): 0 siblings; 1 strokes; 2 pads bounds: LLC: (-1.779, 0.8709999761581421); width = 0.15800002384185796; height = 0.05800000000000005 length: 0.10000002384185791; area: 0.021356000000000003; fatness: 0.21355994908334042; areaDPI: 500; areaPixels: 5339 (243, 5, 135): 0 siblings; 1 strokes; 2 pads bounds: LLC: (-1.578999952316284, 0.971); width = 0.1579999046325684; height = 0.15800002384185807 length: 0.14142130315303802; area: 0.01964; fatness: 0.1388758239538121; areaDPI: 500; areaPixels: 4910 (69, 231, 82): 0 siblings; 1 strokes; 2 pads bounds: LLC: (-1.578999952316284, 0.8709999761581421); width = 0.1579999046325684; height = 0.05800000000000005 length: 0.09999990463256836; area: 0.023732; fatness: 0.23732022632620461; areaDPI: 500; areaPixels: 5933 (63, 239, 81): 0 siblings; 1 strokes; 2 pads bounds: LLC: (-1.779, 0.7710000119209289); width = 0.15800002384185796; height = 0.05800000000000005 length: 0.10000002384185791; area: 0.021636; fatness: 0.21635994841576853; areaDPI: 500; areaPixels: 5409 (43, 255, 84): 0 siblings; 1 strokes; 2 pads bounds: LLC: (-1.578999952316284, 0.670999988079071); width = 0.1579999046325684; height = 0.05800000000000005 length: 0.09999990463256836; area: 0.02216; fatness: 0.22160021133443006; areaDPI: 500; areaPixels: 5540 (29, 186, 167): 0 siblings; 1 strokes; 2 pads bounds: LLC: (-1.779, 0.971); width = 0.1580000230073928; height = 0.05799999999999994 length: 0.10000002384185791; area: 0.020776; fatness: 0.2077599504661678; areaDPI: 500; areaPixels: 5194 (111, 201, 70): 0 siblings; 3 strokes; 2 pads bounds: LLC: (-1.6889999666213988, 0.13600000655651093); width = 0.5430000143051148; height = 0.2179999815225601 length: 0.5512741804122925; area: 0.063096; fatness: 0.11445484341895194; areaDPI: 500; areaPixels: 15774 (209, 11, 163): 0 siblings; 1 strokes; 2 pads bounds: LLC: (-1.779, 1.071000023841858); width = 0.15800002384185796; height = 0.05800000000000005 length: 0.10000002384185791; area: 0.023228000000000002; fatness: 0.23227994462014567; areaDPI: 500; areaPixels: 5807 (59, 79, 244): 0 siblings; 1 strokes; 2 pads bounds: LLC: (-1.779, 1.171000047683716); width = 0.15800002384185796; height = 0.05800000000000005 length: 0.10000002384185791; area: 0.019608; fatness: 0.19607995325089617; areaDPI: 500; areaPixels: 4902 (16, 119, 247): 0 siblings; 1 strokes; 2 pads bounds: LLC: (-1.578999952316284, 0.5710000238418579); width = 0.1579999046325684; height = 0.05800000000000005 length: 0.09999990463256836; area: 0.024012000000000002; fatness: 0.24012022899649527; areaDPI: 500; areaPixels: 6003 (84, 55, 243): 0 siblings; 1 strokes; 2 pads bounds: LLC: (-1.779, 0.670999988079071); width = 0.15800002384185796; height = 0.05800000000000005 length: 0.10000002384185791; area: 0.024748000000000003; fatness: 0.24747994099618414; areaDPI: 500; areaPixels: 6187 (80, 81, 221): 0 siblings; 1 strokes; 2 pads bounds: LLC: (-1.578999952316284, 0.7710000119209289); width = 0.1579999046325684; height = 0.05800000000000005 length: 0.09999990463256836; area: 0.020808; fatness: 0.208080198440741; areaDPI: 500; areaPixels: 5202 (203, 65, 115): 0 siblings; 5 strokes; 6 pads bounds: LLC: (-1.5799999523162842, 1.369999976158142); width = 0.06; height = 0.56 length: 0.5; area: 0.052608; fatness: 0.105216; areaDPI: 500; areaPixels: 13152 (161, 161, 61): 0 siblings; 5 strokes; 6 pads bounds: LLC: (-1.6799999761581421, 1.369999976158142); width = 0.06; height = 0.56 length: 0.5; area: 0.051476; fatness: 0.102952; areaDPI: 500; areaPixels: 12869 (102, 193, 88): 0 siblings; 5 strokes; 2 pads bounds: LLC: (-1.337500057220459, 1.3535000467300415); width = 0.48850005722045897; height = 0.1774999485015869 length: 0.49426203523762524; area: 0.05139200000000001; fatness: 0.10397723542592623; areaDPI: 500; areaPixels: 12848 (78, 66, 238): 0 siblings; 6 strokes; 2 pads bounds: LLC: (-1.5459999809265137, 0.08500000149011612); width = 0.5460000047683717; height = 0.31499999850988386 length: 0.6985534131526947; area: 0.082028; fatness: 0.1174255231676461; areaDPI: 500; areaPixels: 20507 (22, 206, 155): 0 siblings; 12 strokes; 4 pads bounds: LLC: (-1.9550000572204589, 1.1740000476837158); width = 0.23400005722045902; height = 1.0929998683929443 length: 1.3549747467041016; area: 0.18386000000000002; fatness: 0.1356925658188309; areaDPI: 500; areaPixels: 45965 (58, 245, 79): 0 siblings; 11 strokes; 4 pads bounds: LLC: (-1.578999952316284, 0.19599999403953552); width = 0.4939999284744263; height = 1.0690000059604647 length: 1.5395331010222435; area: 0.142324; fatness: 0.09244620976677764; areaDPI: 500; areaPixels: 35581 (112, 153, 118): 0 siblings; 4 strokes; 3 pads bounds: LLC: (-1.3375000581145287, 1.4124999418854713); width = 0.4915000581145287; height = 0.5315000199675561 length: 0.7618377134203911; area: 0.112212; fatness: 0.1472912117939219; areaDPI: 500; areaPixels: 28053 (47, 117, 218): 0 siblings; 3 strokes; 2 pads bounds: LLC: (-1.3510000476837158, 0.49599997615814206); width = 0.2050000953674318; height = 0.3300000357627869 length: 0.33713212236762047; area: 0.054236000000000006; fatness: 0.16087461384311283; areaDPI: 500; areaPixels: 13559 (203, 122, 57): 0 siblings; 4 strokes; 0 pads bounds: LLC: (-2.053999952316284, -0.0040); width = 1.2579999403953552; height = 2.4229999618530274 length: 7.329999923706055; area: 0.6041040000000001; fatness: 0.08241528053039386; areaDPI: 500; areaPixels: 151026 (178, 130, 74): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.001000023841858, 0.07400000149011612); width = 0.052; height = 0.052 length: 0.0; area: 0.017736000000000002; fatness: 0.3410769230769231; areaDPI: 500; areaPixels: 4434 (170, 122, 91): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.2009999523162842, 0.07400000149011612); width = 0.052; height = 0.052 length: 0.0; area: 0.0073880000000000005; fatness: 0.1420769230769231; areaDPI: 500; areaPixels: 1847 (91, 174, 117): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.0509999761581421, 1.9990000953674316); width = 0.052; height = 0.052 length: 0.0; area: 0.035676; fatness: 0.6860769230769231; areaDPI: 500; areaPixels: 8919 (107, 158, 118): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.0509999761581421, 2.1989999046325686); width = 0.052; height = 0.052 length: 0.0; area: 0.0396; fatness: 0.7615384615384616; areaDPI: 500; areaPixels: 9900 (255, 128, 0): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.901, 0.7740000119209289); width = 0.052; height = 0.052 length: 0.0; area: 0.024016000000000003; fatness: 0.4618461538461539; areaDPI: 500; areaPixels: 6004 (105, 203, 75): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.901, 0.474); width = 0.052; height = 0.052 length: 0.0; area: 0.031812; fatness: 0.6117692307692308; areaDPI: 500; areaPixels: 7953 (154, 97, 132): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.901, 1.373999976158142); width = 0.052; height = 0.052 length: 0.0; area: 0.010788; fatness: 0.20746153846153847; areaDPI: 500; areaPixels: 2697 (246, 115, 22): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.4459999576210976, 0.14899999648332596); width = 0.052000001072883606; height = 0.052000001072883606 length: 0.0; area: 0.010263999999999999; fatness: 0.19738461131210164; areaDPI: 500; areaPixels: 2566 (215, 110, 57): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-0.904, 1.5860000095367432); width = 0.058; height = 0.058 length: 0.0; area: 0.013316000000000001; fatness: 0.22958620689655174; areaDPI: 500; areaPixels: 3329 (172, 70, 141): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-0.904, 1.6860000333786012); width = 0.058; height = 0.058 length: 0.0; area: 0.01106; fatness: 0.1906896551724138; areaDPI: 500; areaPixels: 2765 (54, 235, 94): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-0.904, 1.786000057220459); width = 0.058; height = 0.058 length: 0.0; area: 0.006464; fatness: 0.11144827586206896; areaDPI: 500; areaPixels: 1616 (27, 102, 254): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.4790000476837157, 0.971); width = 0.058; height = 0.058 length: 0.0; area: 0.009048; fatness: 0.156; areaDPI: 500; areaPixels: 2262 (125, 117, 141): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.4790000476837157, 1.171000047683716); width = 0.058; height = 0.058 length: 0.0; area: 0.0033040000000000005; fatness: 0.05696551724137932; areaDPI: 500; areaPixels: 826 (95, 33, 254): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.4790000476837157, 1.2709999523162843); width = 0.058; height = 0.058 length: 0.0; area: 0.005344000000000001; fatness: 0.09213793103448277; areaDPI: 500; areaPixels: 1336 (102, 102, 179): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.4790000476837157, 1.3709999761581422); width = 0.058; height = 0.058 length: 0.0; area: 0.00636; fatness: 0.1096551724137931; areaDPI: 500; areaPixels: 1590 (121, 218, 44): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.779, 1.7709999523162843); width = 0.058; height = 0.058 length: 0.0; area: 0.0031360000000000003; fatness: 0.054068965517241385; areaDPI: 500; areaPixels: 784 (53, 132, 197): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.779, 1.671000047683716); width = 0.058; height = 0.058 length: 0.0; area: 0.003392; fatness: 0.058482758620689655; areaDPI: 500; areaPixels: 848 (91, 234, 57): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.779, 1.3709999761581422); width = 0.058; height = 0.058 length: 0.0; area: 0.010884000000000001; fatness: 0.18765517241379312; areaDPI: 500; areaPixels: 2721 (103, 38, 241): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.806999997138977, 0.25399999237060544); width = 0.058; height = 0.058 length: 0.0; area: 0.023488; fatness: 0.40496551724137925; areaDPI: 500; areaPixels: 5872 (120, 118, 144): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.6889999666213988, 0.25399999237060544); width = 0.058; height = 0.058 length: 0.0; area: 0.012704000000000002; fatness: 0.2190344827586207; areaDPI: 500; areaPixels: 3176 (42, 146, 195): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.494000033378601, 1.9960000953674317); width = 0.058; height = 0.058 length: 0.0; area: 0.009244; fatness: 0.15937931034482758; areaDPI: 500; areaPixels: 2311 (41, 92, 249): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.3760000028610229, 2.1139998874664307); width = 0.058; height = 0.058 length: 0.0; area: 0.016764; fatness: 0.2890344827586207; areaDPI: 500; areaPixels: 4191 (27, 254, 101): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.3760000028610229, 1.9960000953674317); width = 0.058; height = 0.058 length: 0.0; area: 0.008704000000000002; fatness: 0.1500689655172414; areaDPI: 500; areaPixels: 2176 (65, 133, 185): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.2579999723434447, 2.1139998874664307); width = 0.058; height = 0.058 length: 0.0; area: 0.028828; fatness: 0.49703448275862067; areaDPI: 500; areaPixels: 7207 (237, 31, 114): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.2579999723434447, 1.9960000953674317); width = 0.058; height = 0.058 length: 0.0; area: 0.012592; fatness: 0.21710344827586206; areaDPI: 500; areaPixels: 3148 (173, 116, 93): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.6889999666213988, 2.090999885559082); width = 0.058; height = 0.058 length: 0.0; area: 0.019128; fatness: 0.32979310344827584; areaDPI: 500; areaPixels: 4782 (197, 19, 167): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.6889999666213988, 2.2089999160766602); width = 0.058; height = 0.058 length: 0.0; area: 0.02402; fatness: 0.4141379310344827; areaDPI: 500; areaPixels: 6005 (72, 144, 167): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.578999952316284, 1.2709999523162843); width = 0.058; height = 0.058 length: 0.0; area: 0.008496; fatness: 0.14648275862068966; areaDPI: 500; areaPixels: 2124 (175, 103, 105): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.678999976158142, 1.2709999523162843); width = 0.058; height = 0.058 length: 0.0; area: 0.009732; fatness: 0.16779310344827583; areaDPI: 500; areaPixels: 2433 (116, 164, 102): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.578999952316284, 1.071000023841858); width = 0.058; height = 0.058 length: 0.0; area: 0.006908; fatness: 0.11910344827586207; areaDPI: 500; areaPixels: 1727 (189, 20, 173): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.578999952316284, 0.471); width = 0.058; height = 0.058 length: 0.0; area: 0.012660000000000001; fatness: 0.21827586206896551; areaDPI: 500; areaPixels: 3165 (132, 8, 242): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-0.903999999165535, 0.19599999487400055); width = 0.057999998331069946; height = 0.057999998331069946 length: 0.0; area: 0.012816000000000001; fatness: 0.22096552359958627; areaDPI: 500; areaPixels: 3204 (134, 215, 33): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.4790000468492508, 0.471000000834465); width = 0.057999998331069946; height = 0.057999998331069946 length: 0.0; area: 0.011084; fatness: 0.19110345377479823; areaDPI: 500; areaPixels: 2771 (199, 108, 76): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.8940000087022781, 1.7459999769926071); width = 0.057999998331069946; height = 0.057999998331069946 length: 0.0; area: 0.006452; fatness: 0.11124138251127735; areaDPI: 500; areaPixels: 1613 (161, 23, 198): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.338999941945076, 1.8310000151395798); width = 0.057999998331069946; height = 0.057999998331069946 length: 0.0; area: 0.013704000000000001; fatness: 0.2362758688677224; areaDPI: 500; areaPixels: 3426 (245, 92, 45): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.8289999514818192, 1.8959999531507492); width = 0.057999998331069946; height = 0.057999998331069946 length: 0.0; area: 0.012104000000000002; fatness: 0.20868966117738705; areaDPI: 500; areaPixels: 3026 (241, 115, 27): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.494000032544136, 2.1139998883008957); width = 0.057999998331069946; height = 0.057999998331069946 length: 0.0; area: 0.026724; fatness: 0.46075863394782646; areaDPI: 500; areaPixels: 6681 (198, 127, 57): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.806999996304512, 2.090999886393547); width = 0.057999998331069946; height = 0.057999998331069946 length: 0.0; area: 0.013584; fatness: 0.23420690329094723; areaDPI: 500; areaPixels: 3396 (60, 104, 218): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.9, 0.8960000038146972); width = 0.05; height = 0.05 length: 0.0; area: 0.014636000000000001; fatness: 0.29272000000000004; areaDPI: 500; areaPixels: 3659 (166, 8, 209): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.322499966621399, 0.18749999403953552); width = 0.075; height = 0.075 length: 0.0; area: 0.011312; fatness: 0.15082666666666666; areaDPI: 500; areaPixels: 2828 (164, 40, 179): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.3299999523162842, 1.129999976158142); width = 0.06; height = 0.04 length: 0.0; area: 0.008764; fatness: 0.14606666666666665; areaDPI: 500; areaPixels: 2191 (171, 103, 108): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.329999951645732, 1.2300000004470348); width = 0.05999999865889549; height = 0.03999999910593033 length: 0.0; area: 0.0038320000000000003; fatness: 0.06386666809419794; areaDPI: 500; areaPixels: 958 (20, 235, 128): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-2.0034999542236327, 0.1685000069141388); width = 0.111; height = 0.111 length: 0.0; area: 0.02414; fatness: 0.21747747747747748; areaDPI: 500; areaPixels: 6035 (109, 88, 186): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.402500002861023, 2.257499963760376); width = 0.111; height = 0.111 length: 0.0; area: 0.024716000000000002; fatness: 0.22266666666666668; areaDPI: 500; areaPixels: 6179 (238, 88, 57): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-2.0034999542236327, 2.123499900817871); width = 0.111; height = 0.111 length: 0.0; area: 0.012668; fatness: 0.11412612612612613; areaDPI: 500; areaPixels: 3167 (213, 100, 70): 0 siblings; 0 strokes; 1 pads bounds: LLC: (-1.900000000372529, 0.974999999627471); width = 0.05000000074505806; height = 0.05000000074505806 length: 0.0; area: 0.018728; fatness: 0.3745599944186212; areaDPI: 500; areaPixels: 4682 87 collected nets (2 supernets) Thu Aug 05 17:04:02 EDT 2004: ToolpathsProcessor started border: true line: false voronoi: true flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 mosaic: 631 x 1214 tile: 502 x 487 generating voronoi toolpaths extracting nodes... 25717 nodes making paths... 82 paths total length: 51.60200183279812 total segments: 25883 optimizing paths... total length: 44.9211049170699 total segments: 1785 Thu Aug 05 17:04:13 EDT 2004: ToolpathsProcessor finished (10976ms) Thu Aug 05 17:04:22 EDT 2004: ToolpathsProcessor started border: true line: false voronoi: true flat: true translucent: false gcode: false tool diameter: 0.0 DPI: 500 mosaic: 631 x 1214 tile: 502 x 487 generating outline toolpaths extracting nodes... 36058 nodes making paths... 95 paths total length: 72.11600096896291 total segments: 36153 optimizing paths... total length: 63.61589453276247 total segments: 2528 Thu Aug 05 17:04:36 EDT 2004: ToolpathsProcessor finished (14611ms) visolate-2.1.6~svn8+dfsg1.orig/visolate/src/Visolate.jnlp000066400000000000000000000011071147500217100234070ustar00rootroot00000000000000 Visolate Marsette Vona visolate-2.1.6~svn8+dfsg1.orig/visolate/src/Visolate.mf000066400000000000000000000000331147500217100230430ustar00rootroot00000000000000Main-Class: visolate.Main visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/000077500000000000000000000000001147500217100225635ustar00rootroot00000000000000visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/Display.java000066400000000000000000001035711147500217100250420ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate; import visolate.misc.*; import java.util.*; import javax.swing.*; import javax.swing.event.*; import java.awt.*; import java.awt.image.*; import java.awt.event.*; import java.text.*; import javax.media.j3d.*; import javax.vecmath.*; public class Display extends JPanel { private static final String cvsid = "$Id: Display.java,v 1.10 2006/08/29 04:02:32 vona Exp $"; public static final int MAX_UPDATE_FRAME_TIME = 100; public static final int NUM_UPDATE_FRAMES = 3; public static final int ACCEL_FACTOR = 10; public static final boolean DEF_PAN = true; public static final boolean DEF_TILT = false; public static final boolean DEF_ZOOM = true; public static final int DEF_WIDTH = 512; public static final int DEF_3D_HEIGHT = 512; public static final double VIEW_Z = 1.5; public static final double FRONT_CLIP = 0.1; public static final double DEF_BACK_CLIP = 10.0; public static final Point3d EYE = new Point3d(0.0, 0.0, 1.5); public static final int DEF_NATIVE_DPI = 90; public static final int MIN_NATIVE_DPI = 1; public static final int MAX_NATIVE_DPI = 1000; public static final int MIN_DPI = 10; public static final int MAX_DPI = 10000; public static final int ZOOM_FIELD_WIDTH = 6; public static final int LOC_FRACTION_DIGITS = 4; public static final int MIN_FRAME_TIME = 1000/50; public static final BoundingSphere BOUNDS = new BoundingSphere(new Point3d(0.0,0.0,0.0), Double.MAX_VALUE); public static final boolean IMMEDIATE_MODE = false; public Display(Visolate visolate) { Dimension d; this.visolate = visolate; setBackground(Color.WHITE); JPopupMenu.setDefaultLightWeightPopupEnabled(false); panel3D = new JPanel(); panel3D.setMinimumSize(new Dimension(0, 0)); panel3D.setPreferredSize(new Dimension(DEF_WIDTH, DEF_3D_HEIGHT)); panel3D.setMaximumSize(new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE)); panel3D.setBackground(Color.WHITE); panel3D.setBorder(BorderFactory.createTitledBorder("Model")); panel3D.setLayout(new BorderLayout()); nativeDPI = DEF_NATIVE_DPI; dpi = nativeDPI; VirtualUniverse universe = new VirtualUniverse(); javax.media.j3d.Locale locale = new javax.media.j3d.Locale(universe); rootBG = new BranchGroup(); final WakeupCriterion frameCriterion = new WakeupOnElapsedFrames(0, true); Behavior frameBehavior = new Behavior() { public void initialize() { wakeupOn(frameCriterion); } public void processStimulus(java.util.Enumeration criteria) { synchronized (frameTasks) { for (Iterator it = frameTasks.iterator(); it.hasNext(); ) it.next().run(); frameTasks.clear(); } wakeupOn(frameCriterion); } }; frameBehavior.setSchedulingBounds(BOUNDS); rootBG.addChild(frameBehavior); centerTG = new TransformGroup(); centerTG.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); centerTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); centerT3D = new Transform3D(); tiltTG = new TransformGroup(); tiltTG.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); tiltTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); tiltT3D = new Transform3D(); uncenterTG = new TransformGroup(); uncenterTG.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); uncenterTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); uncenterTG.setCapability(Group.ALLOW_CHILDREN_READ); uncenterTG.setCapability(Group.ALLOW_CHILDREN_WRITE); uncenterTG.setCapability(Group.ALLOW_CHILDREN_EXTEND); uncenterT3D = new Transform3D(); rootBG.addChild(centerTG); centerTG.addChild(tiltTG); tiltTG.addChild(uncenterTG); BranchGroup viewBG = new BranchGroup(); viewT3D = new Transform3D(); viewT3D.setTranslation(new Vector3d(viewCenter.x, viewCenter.y, VIEW_Z)); viewTG = new TransformGroup(viewT3D); viewTG.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); viewTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); ViewPlatform viewPlatform = new ViewPlatform(); viewPlatform.setViewAttachPolicy(View.NOMINAL_SCREEN); viewTG.addChild(viewPlatform); viewBG.addChild(viewTG); view = new View(); view.setTrackingEnable(false); view.setViewPolicy(View.SCREEN_VIEW); view.setProjectionPolicy(View.PARALLEL_PROJECTION); view.setScreenScalePolicy(View.SCALE_EXPLICIT); view.setWindowResizePolicy(View.VIRTUAL_WORLD); view.setWindowMovementPolicy(View.PHYSICAL_WORLD); view.setWindowEyepointPolicy(View.RELATIVE_TO_SCREEN); view.setVisibilityPolicy(View.VISIBILITY_DRAW_VISIBLE); view.setFrontClipPolicy(View.VIRTUAL_SCREEN); view.setBackClipPolicy(View.VIRTUAL_SCREEN); view.setPhysicalBody(new PhysicalBody()); view.setPhysicalEnvironment(new PhysicalEnvironment()); view.attachViewPlatform(viewPlatform); view.setFrontClipDistance(FRONT_CLIP); view.setBackClipDistance(DEF_BACK_CLIP); // Background background = new Background(new Color3f(0.0f, 0.0f, 0.0f)); Background background = new Background(new Color3f(1.0f, 1.0f, 1.0f)); background.setApplicationBounds(BOUNDS); if (IMMEDIATE_MODE) graphicsContext.setBackground(background); else rootBG.addChild(background); //lights // Color3f lColor1 = new Color3f(0.7f, 0.7f, 0.7f); // Vector3f lDir1 = new Vector3f(-1.0f, -1.0f, -1.0f); // Color3f alColor = new Color3f(0.2f, 0.2f, 0.2f); // // AmbientLight aLgt = new AmbientLight(alColor); // aLgt.setInfluencingBounds(BOUNDS); // DirectionalLight lgt1 = new DirectionalLight(lColor1, lDir1); // lgt1.setInfluencingBounds(BOUNDS); // rootBG.addChild(aLgt); // rootBG.addChild(lgt1); if (!IMMEDIATE_MODE) locale.addBranchGraph(rootBG); locale.addBranchGraph(viewBG); //nav controls Box navBox = Box.createVerticalBox(); navBox.setBorder(BorderFactory.createTitledBorder("Navigation")); Box navControlsBox = Box.createHorizontalBox(); enablePanButton = new JCheckBox("pan"); enablePanButton.setBackground(Color.WHITE); enablePanButton.setSelected(panEnabled); enablePanButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { enablePan(enablePanButton.isSelected()); } }); navControlsBox.add(enablePanButton); enableZoomButton = new JCheckBox("zoom [alt]"); enableZoomButton.setBackground(Color.WHITE); enableZoomButton.setSelected(zoomEnabled); enableZoomButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { enableZoom(enableZoomButton.isSelected()); } }); navControlsBox.add(enableZoomButton); enableTiltButton = new JCheckBox("tilt [ctl]"); enableTiltButton.setBackground(Color.WHITE); enableTiltButton.setSelected(panEnabled); enableTiltButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { enableTilt(enableTiltButton.isSelected()); } }); navControlsBox.add(enableTiltButton); navControlsBox.add(Box.createHorizontalGlue()); nativeDPILabel = new JLabel("native DPI: "); navControlsBox.add(nativeDPILabel); nativeDPIField = new JTextField() { { columnWidth = getColumnWidth(); } }; nativeDPIField.setHorizontalAlignment(JTextField.RIGHT); d = nativeDPIField.getPreferredSize(); nativeDPIField.setMaximumSize(new Dimension(columnWidth*3, d.height)); nativeDPIField.setPreferredSize(new Dimension(columnWidth*3, d.height)); nativeDPIField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { updateNativeDPI(); } }); // nativeDPIField.addFocusListener(new FocusAdapter() { // public void focusLost(FocusEvent e) { updateNativeDPI(); } }); navControlsBox.add(nativeDPIField); navControlsBox.add(Box.createHorizontalGlue()); fitButton = new JButton("fit"); fitButton.setBackground(Color.WHITE); fitButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { fit(); } }); navControlsBox.add(fitButton); Box zoomBox = Box.createHorizontalBox(); dpiLabel = new JLabel("DPI: "); zoomBox.add(dpiLabel); dpiField = new JTextField(); dpiField.setHorizontalAlignment(JTextField.RIGHT); d = dpiField.getPreferredSize(); dpiField.setMaximumSize(new Dimension(columnWidth*ZOOM_FIELD_WIDTH, d.height)); dpiField.setPreferredSize(new Dimension(columnWidth*ZOOM_FIELD_WIDTH, d.height)); dpiField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { updateDPI(); } }); // dpiField.addFocusListener(new FocusAdapter() { // public void focusLost(FocusEvent e) { updateDPI(); } }); zoomBox.add(dpiField); dpiSlider = new JSlider(MIN_DPI, MAX_DPI); dpiSlider.setBackground(Color.WHITE); dpiSlider.addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { setDPI(dpiSlider.getValue()); } }); zoomBox.add(dpiSlider); oneToOneButton = new JButton("1:1"); oneToOneButton.setBackground(Color.WHITE); oneToOneButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setOneToOne(); } }); zoomBox.add(oneToOneButton); Box locationBox = Box.createHorizontalBox(); locationBox.add(Box.createHorizontalGlue()); StringBuffer tmpBuf = new StringBuffer(); tmpBuf.append("000."); for (int i = 0; i < LOC_FRACTION_DIGITS; i++) tmpBuf.append("0"); String tmp = tmpBuf.toString(); locationLabelX = new JLabel(tmp); locationLabelY = new JLabel(tmp); locationBox.add(locationLabelX); locationBox.add(new JLabel(", ")); locationBox.add(locationLabelY); locationBox.add(new JLabel(" mm (in)")); locationBox.add(Box.createHorizontalGlue()); fpsLabel = new JLabel("0000.00 FPS", JLabel.RIGHT); d = fpsLabel.getPreferredSize(); fpsLabel.setMinimumSize(d); fpsLabel.setMaximumSize(d); locationBox.add(fpsLabel); navBox.add(navControlsBox); navBox.add(zoomBox); navBox.add(locationBox); Box box = Box.createVerticalBox(); box.add(panel3D); box.add(navBox); setLayout(new BorderLayout()); add(box, "Center"); Dimension orig = getPreferredSize(); d = navBox.getPreferredSize(); navBox.setMaximumSize(new Dimension(Integer.MAX_VALUE, d.height)); panel3D.setMaximumSize(new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE)); setPreferredSize(orig); setResizable(true); updateView(); enablePan(DEF_PAN); enableTilt(DEF_TILT); enableZoom(DEF_ZOOM); if (IMMEDIATE_MODE) { renderThread = new RenderThread(); renderThread.start(); } } public void addFrameTask(final Runnable task) { frameTasks.add(task); view.repaint(); } public void addNotify() { super.addNotify(); canvas3D = new MyCanvas3D(getGC(getParent())); view.addCanvas3D(canvas3D); panel3D.add(canvas3D, "Center"); } private class RenderThread extends Thread { RenderThread() { super("visolate render thread"); setDaemon(true); } public void run() { for (;;) { // System.out.println("Starting delay: " + System.currentTimeMillis()); if (lastTime >= 0) { long diffTime; for (diffTime = System.currentTimeMillis() - lastTime; diffTime < MIN_FRAME_TIME; diffTime = System.currentTimeMillis() - lastTime) Thread.yield(); } lastTime = System.currentTimeMillis(); // System.out.println("Starting render: " + System.currentTimeMillis()); graphicsContext.clear(); cmt.setIdentity(); render(rootBG); canvas3D.swap(); canvas3D.postSwap(); // System.out.println("Finishing render: " + System.currentTimeMillis()); } } @SuppressWarnings("unchecked") private void render(Node node) { // System.out.println("render: " + System.currentTimeMillis()); if (node instanceof Group) { Group group = (Group) node; if (group instanceof TransformGroup) { cmtWas.set(cmt); ((TransformGroup) group).getTransform(temp); cmt.mul(temp); graphicsContext.setModelTransform(cmt); } for (Enumeration e = (Enumeration) group.getAllChildren(); e.hasMoreElements(); ) { render(e.nextElement()); } if (group instanceof TransformGroup) { cmt.set(cmtWas); graphicsContext.setModelTransform(cmt); } } else if (node instanceof Shape3D) { Shape3D shape = (Shape3D) node; // graphicsContext.draw((Shape3D) node); Appearance appearance = shape.getAppearance(); // assert appearance != null; if (appearance != null) graphicsContext.setAppearance(appearance); for (Enumeration e = shape.getAllGeometries(); e.hasMoreElements(); ) { Geometry geometry = (Geometry) e.nextElement(); // assert geometry != null; if (geometry != null) graphicsContext.draw(geometry); } } } private Transform3D cmt = new Transform3D(); private Transform3D temp = new Transform3D(); private Transform3D cmtWas = new Transform3D(); private long lastTime = -1; } private void updateNativeDPI() { try { int tmp = Integer.parseInt(nativeDPIField.getText()); if ((tmp >= MIN_NATIVE_DPI) && (tmp <= MAX_NATIVE_DPI)) nativeDPI = tmp; updateView(); } catch (NumberFormatException e) { } } private void updateDPI() { try { int tmp = Integer.parseInt(dpiField.getText()); if ((tmp >= MIN_DPI) && (tmp <= MAX_DPI)) dpi = tmp; updateView(); } catch (NumberFormatException e) { } } public double getVirtualCanvasWidth() { return ((double) canvas3D.getWidth())/dpi; } public double getVirtualCanvasHeight() { return ((double) canvas3D.getHeight())/dpi; } public int getCanvasWidth() { return canvas3D.getWidth(); } public int getCanvasHeight() { return canvas3D.getHeight(); } private void updateView() { synchronized (view) { viewUpdatePending = NUM_UPDATE_FRAMES; centerTG.setTransform(centerT3D); uncenterTG.setTransform(uncenterT3D); tiltT3D.setEuler(new Vector3d(tiltX, tiltY, 0.0)); tiltTG.setTransform(tiltT3D); screenScale = 0.0254*dpi/nativeDPI; viewT3D.setTranslation(new Vector3d(viewCenter.x, viewCenter.y, VIEW_Z)); viewTG.setTransform(viewT3D); view.setScreenScale(screenScale); } // view.repaint(); // System.out.println("view center: " + viewCenter + "\n"); nativeDPIField.setText(Integer.toString(nativeDPI)); dpiField.setText(Integer.toString(dpi)); dpiSlider.setValue(dpi); } private void setResizable(boolean resizable) { (JOptionPane.getFrameForComponent(canvas3D)).setResizable(resizable); } public void setOneToOne() { setDPI(nativeDPI); } public void fit() { Rect bounds = visolate.getModel().getBoardBounds(); double horizontalDPI = canvas3D.getWidth()/bounds.width; double verticalDPI = canvas3D.getHeight()/bounds.height; dpi = (int) Math.floor(Math.min(horizontalDPI, verticalDPI)); viewCenter.x = bounds.x + bounds.width/2; viewCenter.y = bounds.y + bounds.height/2; centerT3D.setTranslation(new Vector3d(viewCenter.x, viewCenter.y, 0.0)); uncenterT3D.setTranslation(new Vector3d(-viewCenter.x, -viewCenter.y, 0.0)); updateView(); } public int getDPI() { return dpi; } public void setDPI(int dpi) { this.dpi = dpi; updateView(); } public void setCenter(double x, double y) { viewCenter.x = x; viewCenter.y = y; updateView(); } public void waitForViewUpdate() throws InterruptedException { long t = System.currentTimeMillis(); while (viewUpdatePending > 0) { Thread.yield(); if ((System.currentTimeMillis() - t) > MAX_UPDATE_FRAME_TIME) { view.repaint(); t = System.currentTimeMillis(); } } } public void setCenter(Point2d center) { viewCenter.set(center); updateView(); } public Point2d getCenter(Point2d center) { center.set(viewCenter); return center; } public void destroy() { //universe.cleanup(); } public void reset() { boolean doFit = false; if (modelBG == null) doFit = true; else modelBG.detach(); modelBG = visolate.getModel().getSceneGraph(); if (doFit) fit(); Rect bounds = visolate.getModel().getBoardBounds(); view.setBackClipDistance(10.0 + Math.max(bounds.width, bounds.height)); uncenterTG.addChild(modelBG); enablePanButton.setEnabled(true); enableTiltButton.setEnabled(true); enableZoomButton.setEnabled(true); nativeDPIField.setEnabled(true); nativeDPILabel.setEnabled(true); } public void processFinished() { enableControls(true); setCenter(viewCenterWas); // setResizable(true); } public void processStarted() { enableControls(false); viewCenterWas.set(viewCenter); // setResizable(false); } public void enableControls(boolean enable) { if (!enable) { panWasEnabled = panEnabled; tiltWasEnabled = tiltEnabled; zoomWasEnabled = zoomEnabled; enablePan(false); enableTilt(false); enableZoom(false); } else { enablePan(panWasEnabled); enableTilt(tiltWasEnabled); enableZoom(zoomWasEnabled); } enablePanButton.setEnabled(enable); enableTiltButton.setEnabled(enable); enableZoomButton.setEnabled(enable); nativeDPIField.setEnabled(enable); nativeDPILabel.setEnabled(enable); } private void enableZoom(boolean enable) { if (enableZoomButton.isSelected() != enable) enableZoomButton.setSelected(enable); if (enable == zoomEnabled) return; zoomEnabled = enable; fitButton.setEnabled(enable); oneToOneButton.setEnabled(enable); dpiLabel.setEnabled(enable); dpiField.setEnabled(enable); dpiSlider.setEnabled(enable); } private void enablePan(boolean enable) { if (enablePanButton.isSelected() != enable) enablePanButton.setSelected(enable); if (enable == panEnabled) return; panEnabled = enable; } private void enableTilt(boolean enable) { if (enableTiltButton.isSelected() != enable) enableTiltButton.setSelected(enable); if (enable == tiltEnabled) return; tiltEnabled = enable; if (!enable) { tiltX = 0.0; tiltY = 0.0; updateView(); } } private void updateZoom(int delta, boolean accel) { if (!zoomEnabled) return; delta *= ACCEL_FACTOR; if (accel) delta *= ACCEL_FACTOR; // System.out.println("updateZoom: " + delta); int newDPI = dpi+delta; if (newDPI < MIN_DPI) newDPI = MIN_DPI; if (newDPI > MAX_DPI) newDPI = MAX_DPI; dpi = newDPI; updateView(); } private void updatePan(int deltaX, int deltaY, boolean accel) { if (!panEnabled) return; if (accel) { deltaX *= ACCEL_FACTOR; deltaY *= ACCEL_FACTOR; } // System.out.println("updatePan: " + deltaX + ", " + deltaY); viewCenter.x -= deltaX/((double) dpi); viewCenter.y -= deltaY/((double) dpi); updateView(); } private void updateTilt(int deltaX, int deltaY, boolean accel) { if (!tiltEnabled) return; if (accel) { deltaX *= ACCEL_FACTOR; deltaY *= ACCEL_FACTOR; } // System.out.println("updateTilt: " + deltaX + ", " + deltaY); tiltY += deltaX/((double) dpi); tiltX += deltaY/((double) dpi); updateView(); } public BufferedImage makeBufferedImage() { return makeBufferedImage(canvas3D.getWidth(), canvas3D.getHeight()); } public BufferedImage makeBufferedImage(int width, int height) { return new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); } public BufferedImage getStill() throws InterruptedException { // return getStill(makeBufferedImage()); //work around j3d bug int width = canvas3D.getWidth(); int height = canvas3D.getHeight(); ImageComponent2D imageComponent = new ImageComponent2D(ImageComponent.FORMAT_RGB, width, height, false, //byRef false); //yUp raster = new javax.media.j3d.Raster(new Point3f(0.0f, 0.0f, 0.0f), javax.media.j3d.Raster.RASTER_COLOR, 0, 0, width, height, imageComponent, null); waitForViewUpdate(); readRasterPending = true; view.repaint(); while (readRasterPending) Thread.yield(); (canvas3D.getGraphicsContext3D()).readRaster(raster); return raster.getImage().getImage(); } //work around j3d bug // public BufferedImage getStill(BufferedImage bufferedImage) // throws InterruptedException { // // int width = bufferedImage.getWidth(); // int height = bufferedImage.getHeight(); // // ImageComponent2D imageComponent = // new ImageComponent2D(ImageComponent.FORMAT_RGB, // bufferedImage, // true, //byRef // false); //yUp // // raster = // new javax.media.j3d.Raster(new Point3f(0.0f, 0.0f, 0.0f), // javax.media.j3d.Raster.RASTER_COLOR, // 0, 0, // width, height, // imageComponent, // null); // // waitForViewUpdate(); // // readRasterPending = true; // // view.repaint(); // // while (readRasterPending) // Thread.yield(); // // (canvas3D.getGraphicsContext3D()).readRaster(raster); // // return bufferedImage; // } /** * @return coordinate under the mouse in Inch. */ private double mouseX(final MouseEvent e) { return e.getX() / ((double) dpi) + viewCenter.x - getVirtualCanvasWidth()/2; } /** * @return coordinate under the mouse in Inch. */ private double mouseY(final MouseEvent e) { return (canvas3D.getHeight() - e.getY()) / ((double) dpi) + viewCenter.y - getVirtualCanvasHeight()/2; } private class MyCanvas3D extends Canvas3D { MyCanvas3D(GraphicsConfiguration gc) { super(gc); graphicsContext = getGraphicsContext3D(); setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR)); setBackground(Color.BLACK); // setSize(DEF_WIDTH, DEF_3D_HEIGHT); setMonoscopicViewPolicy(View.CYCLOPEAN_EYE_VIEW); setStereoEnable(false); setLeftManualEyeInImagePlate(EYE); setRightManualEyeInImagePlate(EYE); if (IMMEDIATE_MODE) stopRenderer(); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { lastX = e.getX(); lastY = e.getY(); } public void mouseClicked(MouseEvent e) { visolate.mouseClicked(mouseX(e), mouseY(e), e.getModifiersEx()); } }); addMouseMotionListener(new MouseMotionAdapter() { private DecimalFormat locFormat = new DecimalFormat(); { locFormat.setMaximumFractionDigits(LOC_FRACTION_DIGITS); locFormat.setMinimumFractionDigits(LOC_FRACTION_DIGITS); } public void mouseDragged(MouseEvent e) { int x = e.getX(); int y = e.getY(); // System.out.println("mouse dragged (" + x + ", " + y + // ") modifiers: " + // e.getMouseModifiersText(e.getModifiers()) + // "; modifiersEx: " + // e.getModifiersExText(e.getModifiersEx())); if ((e.getModifiersEx() & (MouseEvent.ALT_DOWN_MASK | MouseEvent.BUTTON2_DOWN_MASK)) != 0) updateZoom(y-lastY, e.isShiftDown()); else if ((e.getModifiersEx() & (MouseEvent.CTRL_DOWN_MASK | MouseEvent.BUTTON3_DOWN_MASK)) != 0) updateTilt(x-lastX, y-lastY, e.isShiftDown()); else updatePan(x-lastX, lastY-y, e.isShiftDown()); lastX = x; lastY = y; } public void mouseMoved(MouseEvent e) { locationLabelX.setText(locFormat.format(25.4 * mouseX(e)) + "(" + locFormat.format(mouseX(e)) + ")"); locationLabelY.setText(locFormat.format(25.4 * mouseY(e)) + "(" + locFormat.format(mouseY(e)) + ")"); } }); addMouseWheelListener(new MouseWheelListener() { public void mouseWheelMoved(MouseWheelEvent e) { updateZoom(e.getWheelRotation(), e.isShiftDown()); } }); addKeyListener(new KeyAdapter() { public void keyReleased(KeyEvent e) { if (!e.isAltDown()) { switch (e.getKeyCode()) { case KeyEvent.VK_LEFT: updatePan(-1, 0, e.isShiftDown()); return; case KeyEvent.VK_RIGHT: updatePan(+1, 0, e.isShiftDown()); return; case KeyEvent.VK_UP: updatePan(0, +1, e.isShiftDown()); return; case KeyEvent.VK_DOWN: updatePan(0, -1, e.isShiftDown()); return; } } else { switch (e.getKeyCode()) { case KeyEvent.VK_LEFT: updateTilt(-1, 0, e.isShiftDown()); return; case KeyEvent.VK_RIGHT: updateTilt(+1, 0, e.isShiftDown()); return; case KeyEvent.VK_UP: updateTilt(0, +1, e.isShiftDown()); return; case KeyEvent.VK_DOWN: updateTilt(0, -1, e.isShiftDown()); return; } } visolate.keyReleased(e); } public void keyTyped(KeyEvent e) { } }); addComponentListener(new ComponentAdapter() { public void componentResized(ComponentEvent e) { updateView(); } }); } public void postSwap() { super.postSwap(); synchronized (view) { if (viewUpdatePending > 0) viewUpdatePending--; } if (readRasterPending) { graphicsContext.readRaster(raster); readRasterPending = false; } long newTime = System.currentTimeMillis(); if (lastTime >= 0) { double fps = 1000.0/(newTime-lastTime); // System.out.println("FPS: " + fps); fpsLabel.setText(fpsFormat.format(fps) + " FPS"); } lastTime = newTime; } private long lastTime = -1; } private GraphicsConfiguration getGC(Container container) { GraphicsDevice graphicsDevice = (container != null) ? container.getGraphicsConfiguration().getDevice() : GraphicsEnvironment. getLocalGraphicsEnvironment(). getDefaultScreenDevice(); try { return getGC(graphicsDevice); } catch (RuntimeException e) { GraphicsDevice[] gs = GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices(); RuntimeException ex = null; for (int j = 0; j < gs.length; j++) { try { return getGC(gs[j]); } catch (RuntimeException e2) { ex = e2; } } throw ex; } } private GraphicsConfiguration getGC(GraphicsDevice graphicsDevice) { System.out.println("graphics device: " + graphicsDevice.getIDstring()); int[][] format = new int[][] {{8, 8, 8}, {5, 6, 5}}; int[] depth = new int[] {24, 16, 8}; GraphicsConfigTemplate3D gct = new GraphicsConfigTemplate3D(); gct.setDoubleBuffer(GraphicsConfigTemplate3D.PREFERRED); gct.setStereo(GraphicsConfigTemplate3D.UNNECESSARY); gct.setSceneAntialiasing(GraphicsConfigTemplate3D.UNNECESSARY); GraphicsConfiguration fallback = graphicsDevice.getBestConfiguration(gct); GraphicsConfiguration gc = null; for (int f = 0; f < format.length; f++) { for (int d = 0; d < depth.length; d++) { gct.setRedSize(format[f][0]); gct.setGreenSize(format[f][1]); gct.setBlueSize(format[f][2]); gct.setDepthSize(depth[d]); gc = graphicsDevice.getBestConfiguration(gct); if (gc != null) break; } } if (gc == null) gc = fallback; if (gc == null) throw new RuntimeException("FATAL ERROR: failed to initialize 3D graphics"); rBits = gc.getColorModel().getComponentSize(0); gBits = gc.getColorModel().getComponentSize(1); bBits = gc.getColorModel().getComponentSize(2); dBits = gct.getDepthSize(); rCeil = 1 << rBits; gCeil = 1 << gBits; bCeil = 1 << bBits; // System.out.println("ceilings: " + // rCeil + ", " + gCeil + ", " + bCeil); rSpread = 256/rCeil; gSpread = 256/gCeil; bSpread = 256/bCeil; // System.out.println("spreads: " + // rSpread + ", " + gSpread + ", " + bSpread); System.out.println("pixel format " + rBits + ":" + gBits + ":" + bBits + " " + dBits + "-bit depth"); return gc; } public int getRBits() { return rBits; } public int getGBits() { return gBits; } public int getBBits() { return bBits; } public int getDepthBits() { return dBits; } public static double intensity(double r, double g, double b) { return (r+g+b)/3.0; } public static double intensity(Color3b c) { return ((c.x & 0xff)/255.0 + (c.y & 0xff)/255.0 + (c.z & 0xff)/255.0)/3.0; } private static double rnd(double min, double max) { min = Math.max(0.0, min); max = Math.min(1.0, max); return min + Math.random()*(max-min); } private static void randomSwap(double[] c) { int i = (int) Math.floor(Math.random()*c.length); int j = (int) Math.floor(Math.random()*c.length); double t = c[i]; c[i] = c[j]; c[j] = t; } public Color3b getRandomColor() { double y = 0.5; double sum = 3.0*y; double[] c = new double[3]; c[0] = rnd(sum-2.0, sum); c[1] = rnd(sum-c[0]-1.0, sum-c[0]); c[2] = sum-(c[0]+c[1]); randomSwap(c); randomSwap(c); randomSwap(c); randomSwap(c); double r = c[0]; double g = c[1]; double b = c[2]; return new Color3b((byte) (((int) Math.floor(r*rCeil))*rSpread), (byte) (((int) Math.floor(g*gCeil))*gSpread), (byte) (((int) Math.floor(b*bCeil))*bSpread)); } private Visolate visolate; private JPanel panel3D; private Canvas3D canvas3D; private int nativeDPI; private int dpi; private double screenScale; private BranchGroup rootBG; private TransformGroup centerTG; private TransformGroup uncenterTG; private TransformGroup tiltTG; private BranchGroup modelBG = null; private Transform3D centerT3D; private Transform3D uncenterT3D; private Transform3D tiltT3D; private Point2d viewCenter = new Point2d(); private Point2d viewCenterWas = new Point2d(); private Transform3D viewT3D; private TransformGroup viewTG; private View view; private JButton fitButton; private JButton oneToOneButton; private JTextField nativeDPIField; private JTextField dpiField; private JLabel nativeDPILabel; private JSlider dpiSlider; private int columnWidth; private JCheckBox enableZoomButton; private JCheckBox enableTiltButton; private JCheckBox enablePanButton; private boolean zoomEnabled = true; private boolean panEnabled = true; private boolean tiltEnabled = true; private boolean zoomWasEnabled = true; private boolean tiltWasEnabled = true; private boolean panWasEnabled = true; private double tiltX = 0.0; private double tiltY = 0.0; private int lastX; private int lastY; private JLabel locationLabelX; private JLabel locationLabelY; private JLabel dpiLabel; private int viewUpdatePending = NUM_UPDATE_FRAMES; private javax.media.j3d.Raster raster = null; private boolean readRasterPending = false; private int rBits, gBits, bBits, dBits; private int rCeil, gCeil, bCeil; private int rSpread, gSpread, bSpread; private NumberFormat fpsFormat = new DecimalFormat() { { setMaximumFractionDigits(2); setMinimumFractionDigits(2); } }; private JLabel fpsLabel; private GraphicsContext3D graphicsContext; private Thread renderThread; private Collection frameTasks = Collections.synchronizedList(new LinkedList()); } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/Main.java000066400000000000000000000125711147500217100243200ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate; import javax.swing.*; import java.awt.*; import java.io.*; import org.apache.commons.cli.*; public class Main extends JApplet { private static final String cvsid = "$Id: Main.java,v 1.5 2006/08/29 00:13:02 vona Exp $"; public static final String APPNAME = "Visolate 2.1.6"; public static final int DEF_LOC_X = 100; public static final int DEF_LOC_Y = 100; public void init() { visolate = new Visolate(); Container contentPane = getContentPane(); contentPane.setLayout(new BorderLayout()); contentPane.add(visolate, "Center"); contentPane.setBackground(Color.WHITE); SwingUtilities.invokeLater( new Runnable() { public void run() { visolate.loadDemo(); } }); } public void destroy() { visolate.destroy(); } public static void main(final String[] argv) { CommandLineParser parser = new PosixParser(); Options options = new Options(); options.addOption( "x", "flip-x", false, "flip around x axis" ); options.addOption( "y", "flip-y", false, "flip around y axis" ); options.addOption( "absolute", false, "use absolute cooridnates" ); options.addOption( "d", "dpi", true, "dpi to use for rastering"); options.addOption( "a", "auto", false, "auto-mode (run, save and exit)"); options.addOption( "o", "outfile", true, "name of output file"); options.addOption( "h", "help", false, "display this help and exit" ); options.addOption( "version", false, "output version information and exit" ); CommandLine commandline; try { commandline = parser.parse(options, argv); } catch (ParseException e) { System.err.println(e.getLocalizedMessage()); System.exit(1); return; // make it clear to the compiler that the following code is not run } if (commandline.hasOption("version")) { System.out.println(APPNAME); return; } if (commandline.hasOption("help")) { HelpFormatter formatter = new HelpFormatter(); formatter.printHelp("visolate [options] [filename]", options ); return; } if (commandline.getArgs().length >= 2) { System.err.println("Error: Too many arguments."); System.exit(1); } final JFrame frame = new JFrame(APPNAME); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLocation(DEF_LOC_X, DEF_LOC_Y); final Visolate visolate = new Visolate(); visolate.commandline = commandline; Container contentPane = frame.getContentPane(); contentPane.setLayout(new BorderLayout()); contentPane.add(visolate, "Center"); contentPane.setBackground(Color.WHITE); SwingUtilities.invokeLater( new Runnable() { public void run() { frame.pack(); frame.setVisible(true); if (visolate.commandline.getArgs().length == 1) { visolate.loadFile(new File(visolate.commandline.getArgs()[0])); } else { visolate.loadDemo(); } visolate.model.rebuild(); if (visolate.commandline.hasOption("auto")) { System.out.println("Automatic processing enabled! Files will be overwritten without asking!"); visolate.auto_mode=true; } if (visolate.commandline.hasOption("dpi")) { visolate.getDisplay().setDPI(Integer.parseInt(visolate.commandline.getOptionValue("dpi"))); } if (visolate.commandline.hasOption("flip-x")) { visolate.model.setFlipX(true); } if (visolate.commandline.hasOption("flip-y")) { visolate.model.setFlipY(true); } if (visolate.commandline.hasOption("absolute")) { visolate.setAbsoluteCoordinates(true); } if (visolate.commandline.hasOption("outfile")) { visolate.setGcodeFile(visolate.commandline.getOptionValue("outfile")); } if (visolate.commandline.hasOption("auto")) { System.out.println("now starting fixing topology due to automatic mode"); visolate.processstatus=1; visolate.fixTopology(); // fix.Topology() calls visolate.processFinished after its done. Also, the Toolpathprocessor does so. processstatus discriminates this. } } }); } private Visolate visolate; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/Visolate.java000066400000000000000000001014111147500217100252120ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate; import visolate.parser.*; import visolate.simulator.*; import visolate.model.*; import visolate.processor.*; import java.io.*; import java.text.NumberFormat; import java.text.ParseException; import java.util.*; import java.util.List; import java.net.*; import javax.swing.*; import javax.swing.event.UndoableEditEvent; import javax.swing.event.UndoableEditListener; import java.awt.*; import java.awt.event.*; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyVetoException; import java.beans.VetoableChangeListener; import java.security.*; import org.apache.commons.cli.CommandLine; public class Visolate extends JPanel implements SimulatorUI { public static final String DEMO_FILE = "example.grb"; /** * kept here so it is available in the invokeLater Runnable in Main */ public CommandLine commandline; public int processstatus; public boolean auto_mode; private static final String cvsid = "$Id: Visolate.java,v 1.11 2006/09/15 19:48:24 vona Exp $"; private double selectedZClearance = ToolpathsProcessor.CLEARANCE_Z; private double selectedZCuttingHeight = 0; private double selectedInitialXCoordinate = 0; private double selectedInitialYCoordinate = 0; public Visolate() { this(null); } public Visolate(File file) { processstatus=0; display = new Display(this); simulator = new Simulator(this); model = new Model(this); setBackground(Color.WHITE); setOpaque(true); Dimension d; Box processingBox = getProcessingBox(); Box box = Box.createVerticalBox(); box.add(getLoadFileBox()); box.add(display); box.add(model); box.add(getGCodeOptionsBox()); box.add(processingBox); setLayout(new BorderLayout()); add(box, "Center"); //make display take up max available space Dimension orig = getPreferredSize(); d = getLoadFileBox().getPreferredSize(); getLoadFileBox().setMaximumSize(new Dimension(Integer.MAX_VALUE, d.height)); d = model.getPreferredSize(); model.setMaximumSize(new Dimension(Integer.MAX_VALUE, d.height)); d = processingBox.getPreferredSize(); processingBox.setMaximumSize(new Dimension(Integer.MAX_VALUE, d.height)); display.setMaximumSize(new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE)); setPreferredSize(orig); if (file != null) loadFile(file); } private Box getLoadFileBox() { if (myLoadFileBox == null) { myLoadFileBox = Box.createHorizontalBox(); loadField = new JTextField(); Dimension d = loadField.getPreferredSize(); loadField.setMaximumSize(new Dimension(Integer.MAX_VALUE, d.height)); loadField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { loadFile(); } }); // loadField.addFocusListener(new FocusAdapter() { // public void focusLost(FocusEvent e) { // loadFile(); // } }); myLoadFileBox.add(loadField); loadButton = new JButton("Browse..."); loadButton.setBackground(Color.WHITE); loadButton.setVerticalAlignment(AbstractButton.CENTER); loadButton.setHorizontalAlignment(AbstractButton.CENTER); d = loadButton.getPreferredSize(); loadButton.setMaximumSize(new Dimension(d.width, d.height)); loadButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { File file = browse(); if (file != null) loadFile(file); }}); myLoadFileBox.add(loadButton); myLoadFileBox.setBorder(BorderFactory.createTitledBorder("Input File")); } return myLoadFileBox; } private Box getGcodeBox() { if (myGcodeBox == null) { Dimension d; myGcodeBox = Box.createHorizontalBox(); gcodeButton = new JButton("Save G-Code"); gcodeButton.setEnabled(false); gcodeButton.setBackground(Color.WHITE); gcodeButton.setVerticalAlignment(AbstractButton.CENTER); gcodeButton.setHorizontalAlignment(AbstractButton.CENTER); d = gcodeButton.getPreferredSize(); gcodeButton.setMaximumSize(new Dimension(d.width, d.height)); gcodeButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { saveGCode(); }}); myGcodeBox.add(gcodeButton); gcodeField = new JTextField(); gcodeField.setEnabled(false); d = gcodeField.getPreferredSize(); gcodeField.setMaximumSize(new Dimension(Integer.MAX_VALUE, d.height)); gcodeField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { saveGCode(); } }); // gcodeField.addFocusListener(new FocusAdapter() { // public void focusLost(FocusEvent e) { saveGCode(); } }); myGcodeBox.add(gcodeField); gcodeBrowseButton = new JButton("Browse..."); gcodeBrowseButton.setEnabled(false); gcodeBrowseButton.setBackground(Color.WHITE); gcodeBrowseButton.setVerticalAlignment(AbstractButton.CENTER); gcodeBrowseButton.setHorizontalAlignment(AbstractButton.CENTER); d = gcodeBrowseButton.getPreferredSize(); gcodeBrowseButton.setMaximumSize(new Dimension(d.width, d.height)); gcodeBrowseButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { File file = browse(); if (file != null) saveGCode(file); }}); myGcodeBox.add(gcodeBrowseButton); stopButton = new JButton("Stop"); stopButton.setBackground(Color.WHITE); // stopButton.setVerticalAlignment(AbstractButton.CENTER); // stopButton.setHorizontalAlignment(AbstractButton.CENTER); stopButton.setAlignmentX(0.5f); d = stopButton.getPreferredSize(); stopButton.setMaximumSize(new Dimension(Integer.MAX_VALUE, d.height)); stopButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { stopProcess(); } }); stopButton.setEnabled(false); innerProgressBar = new JProgressBar(); innerProgressBar.setBackground(Color.WHITE); outerProgressBar = new JProgressBar(); outerProgressBar.setBackground(Color.WHITE); } return myGcodeBox; } private Box getTopologyAndToolpathsBox() { Box topologyAndToolpathsBox = Box.createHorizontalBox(); topologyAndToolpathsBox.add(getTopologyBox()); topologyAndToolpathsBox.add(Box.createHorizontalGlue()); topologyAndToolpathsBox.add(getToolpathBox()); return topologyAndToolpathsBox; } private Box getToolpathBox() { Dimension d; Box toolpathsBox = Box.createHorizontalBox(); toolpathsButton = new JButton("Make Toolpaths"); toolpathsButton.setBackground(Color.WHITE); toolpathsButton.setVerticalAlignment(AbstractButton.CENTER); toolpathsButton.setHorizontalAlignment(AbstractButton.CENTER); d = toolpathsButton.getPreferredSize(); toolpathsButton.setMaximumSize(new Dimension(d.width, d.height)); toolpathsButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { computeToolpaths(); }}); toolpathsBox.add(toolpathsButton); // toolpathsBox.add(Box.createHorizontalStrut(16)); ButtonGroup modeGroup = new ButtonGroup(); voronoiButton = new JRadioButton("voronoi"); modeGroup.add(voronoiButton); voronoiButton.setBackground(Color.WHITE); if (ToolpathsProcessor.DEF_MODE == ToolpathsProcessor.VORONOI_MODE) voronoiButton.setSelected(true); toolpathsBox.add(voronoiButton); outlineButton = new JRadioButton("outline"); modeGroup.add(outlineButton); outlineButton.setBackground(Color.WHITE); if (ToolpathsProcessor.DEF_MODE == ToolpathsProcessor.OUTLINE_MODE) { outlineButton.setSelected(true); } toolpathsBox.add(outlineButton); return toolpathsBox; } private Box getTopologyBox() { Dimension d; Box topologyBox = Box.createHorizontalBox(); topologyButton = new JButton("Fix Topology"); topologyButton.setBackground(Color.WHITE); topologyButton.setVerticalAlignment(AbstractButton.CENTER); topologyButton.setHorizontalAlignment(AbstractButton.CENTER); d = topologyButton.getPreferredSize(); topologyButton.setMaximumSize(new Dimension(d.width, d.height)); topologyButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { fixTopology(); }}); topologyBox.add(topologyButton); // topologyBox.add(Box.createHorizontalStrut(16)); manualTopology = new JCheckBox("manual"); manualTopology.setBackground(Color.WHITE); manualTopology.setSelected(false); topologyBox.add(manualTopology); return topologyBox; } private Box getMosaicBox() { Dimension d; if (myMosaicBox == null) { myMosaicBox = Box.createHorizontalBox(); mosaicButton = new JButton("Save High-Res"); mosaicButton.setBackground(Color.WHITE); mosaicButton.setVerticalAlignment(AbstractButton.CENTER); mosaicButton.setHorizontalAlignment(AbstractButton.CENTER); d = mosaicButton.getPreferredSize(); mosaicButton.setMaximumSize(new Dimension(d.width, d.height)); mosaicButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { saveMosaic(); }}); myMosaicBox.add(mosaicButton); mosaicField = new JTextField(); d = mosaicField.getPreferredSize(); mosaicField.setMaximumSize(new Dimension(Integer.MAX_VALUE, d.height)); mosaicField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { saveMosaic(); } }); // mosaicField.addFocusListener(new FocusAdapter() { // public void focusLost(FocusEvent e) { saveMosaic(); } }); myMosaicBox.add(mosaicField); mosaicBrowseButton = new JButton("Browse..."); mosaicBrowseButton.setBackground(Color.WHITE); mosaicBrowseButton.setVerticalAlignment(AbstractButton.CENTER); mosaicBrowseButton.setHorizontalAlignment(AbstractButton.CENTER); d = mosaicBrowseButton.getPreferredSize(); mosaicBrowseButton.setMaximumSize(new Dimension(d.width, d.height)); mosaicBrowseButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { File file = browse(); if (file != null) saveMosaic(file); }}); myMosaicBox.add(mosaicBrowseButton); mosaicTilesButton = new JCheckBox("individual tiles"); mosaicTilesButton.setBackground(Color.WHITE); mosaicTilesButton.setSelected(false); myMosaicBox.add(mosaicTilesButton); } return myMosaicBox; } private Box getProcessingBox() { if (myProcessingBox == null) { myProcessingBox = Box.createVerticalBox(); myProcessingBox.setBorder(BorderFactory.createTitledBorder("Processing")); myProcessingBox.add(getMosaicBox()); myProcessingBox.add(getTopologyAndToolpathsBox()); myProcessingBox.add(getGcodeBox()); // processingBox.add(Box.createVerticalStrut(8)); myProcessingBox.add(stopButton); // processingBox.add(Box.createVerticalStrut(8)); myProcessingBox.add(innerProgressBar); myProcessingBox.add(outerProgressBar); } return myProcessingBox; } private Box getGCodeOptionsBox() { if (myGCodeOptionsBox == null) { myGCodeOptionsBox = Box.createVerticalBox(); myGCodeOptionsBox.setBorder(BorderFactory.createTitledBorder("G-Code")); JPanel panel = new JPanel(); panel.setLayout(new GridLayout(3, 4)); panel.add(new JLabel("Coordinates")); panel.add(new JLabel("Z-coordinates")); panel.add(new JLabel("left upper coordinates")); panel.add(new JLabel("Metric")); panel.add(new JLabel("Speed")); panel.add(getRelativeCoordinatesButton()); panel.add(getZCuttingHeightPanel()); panel.add(getInitialXPanel()); panel.add(getMetricButton()); panel.add(getMillingSpeedPanel()); panel.add(getAbsoluteCoordinatesButton()); panel.add(getZDownMovementPanel()); panel.add(getInitialYPanel()); panel.add(getImperialButton()); panel.add(getMovementSpeedPanel()); myGCodeOptionsBox.add(panel); } return myGCodeOptionsBox; } private JPanel getInitialXPanel() { if (myInitialXPanel == null) { myInitialXPanel = new JPanel(); myInitialXPanel.setLayout(new BorderLayout()); myInitialXPanel.add(new JLabel("X"), BorderLayout.WEST); final JTextField field = new JTextField(NumberFormat.getInstance().format(0.0)); myInitialXPanel.add(field, BorderLayout.CENTER); myInitialXPanel.setToolTipText("Left side is at this coordinate (mm or inch)"); myInitialXPanel.addPropertyChangeListener("enabled", new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { field.setEnabled(myInitialXPanel.isEnabled()); } }); myInitialXPanel.setEnabled(false); field.getDocument().addUndoableEditListener(new UndoableEditListener() { @Override public void undoableEditHappened(UndoableEditEvent evt) { try { selectedInitialXCoordinate = NumberFormat.getInstance().parse(field.getText()).doubleValue(); if (myAoolpathsProcessor != null) { myAoolpathsProcessor.setAbsoluteXStart(selectedInitialXCoordinate); } } catch (ParseException e) { evt.getEdit().undo(); } } }); } return myInitialXPanel; } private JPanel getInitialYPanel() { if (myInitialYPanel == null) { myInitialYPanel = new JPanel(); myInitialYPanel.setLayout(new BorderLayout()); myInitialYPanel.add(new JLabel("Y"), BorderLayout.WEST); final JTextField field = new JTextField(NumberFormat.getInstance().format(0.0)); myInitialYPanel.add(field, BorderLayout.CENTER); myInitialYPanel.setToolTipText("Upper side is at this coordinates (mm or inch)"); myInitialYPanel.addPropertyChangeListener("enabled", new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { field.setEnabled(myInitialYPanel.isEnabled()); } }); myInitialYPanel.setEnabled(false); field.getDocument().addUndoableEditListener(new UndoableEditListener() { @Override public void undoableEditHappened(UndoableEditEvent evt) { try { selectedInitialYCoordinate = NumberFormat.getInstance().parse(field.getText()).doubleValue(); if (myAoolpathsProcessor != null) { myAoolpathsProcessor.setAbsoluteYStart(selectedInitialYCoordinate); } } catch (ParseException e) { evt.getEdit().undo(); } } }); } return myInitialYPanel; } private Component getZDownMovementPanel() { if (myZDownMovementPanel == null) { myZDownMovementPanel = new JPanel(); myZDownMovementPanel.setLayout(new BorderLayout()); myZDownMovementPanel.add(new JLabel("travel clearance"), BorderLayout.WEST); myZDownMovementPanel.setToolTipText("When not cutting, lift the head this much (mm or inch)"); final JTextField field = new JTextField(NumberFormat.getInstance().format(ToolpathsProcessor.CLEARANCE_Z)); myZDownMovementPanel.add(field, BorderLayout.CENTER); field.getDocument().addUndoableEditListener(new UndoableEditListener() { @Override public void undoableEditHappened(UndoableEditEvent evt) { try { selectedZClearance = NumberFormat.getInstance().parse(field.getText()).doubleValue(); if (myAoolpathsProcessor != null) { myAoolpathsProcessor.setZClearance(selectedZClearance); } } catch (ParseException e) { evt.getEdit().undo(); } } }); } return myZDownMovementPanel; } private JPanel getMillingSpeedPanel() { if (myMillingSpeedPanel == null) { myMillingSpeedPanel = new JPanel(); myMillingSpeedPanel.setLayout(new BorderLayout()); myMillingSpeedPanel.add(new JLabel("milling speed"), BorderLayout.WEST); myMillingSpeedPanel.setToolTipText("speed of head-movement during milling (mm or inch per second)"); final JTextField field = new JTextField(NumberFormat.getInstance().format(0.0)); myMillingSpeedPanel.add(field, BorderLayout.CENTER); field.getDocument().addUndoableEditListener(new UndoableEditListener() { @Override public void undoableEditHappened(UndoableEditEvent evt) { try { myMillingSpeed = NumberFormat.getInstance().parse(field.getText()).doubleValue(); if (myAoolpathsProcessor != null) { myAoolpathsProcessor.setMillingSpeed(myMillingSpeed); } } catch (ParseException e) { evt.getEdit().undo(); } } }); } return myMillingSpeedPanel; } private JPanel getMovementSpeedPanel() { if (myMovementSpeedPanel == null) { myMovementSpeedPanel = new JPanel(); myMovementSpeedPanel.setLayout(new BorderLayout()); myMovementSpeedPanel.add(new JLabel("Movement speed"), BorderLayout.WEST); myMovementSpeedPanel.setToolTipText("speed of head-movement during Movement (mm or inch per second)"); final JTextField field = new JTextField(NumberFormat.getInstance().format(0.0)); myMovementSpeedPanel.add(field, BorderLayout.CENTER); field.getDocument().addUndoableEditListener(new UndoableEditListener() { @Override public void undoableEditHappened(UndoableEditEvent evt) { try { myMovementSpeed = NumberFormat.getInstance().parse(field.getText()).doubleValue(); if (myAoolpathsProcessor != null) { myAoolpathsProcessor.setMovementSpeed(myMovementSpeed); } } catch (ParseException e) { evt.getEdit().undo(); } } }); } return myMovementSpeedPanel; } private JPanel getZCuttingHeightPanel() { if (myZCuttingHeightPanel == null) { myZCuttingHeightPanel = new JPanel(); myZCuttingHeightPanel.setLayout(new BorderLayout()); myZCuttingHeightPanel.add(new JLabel("cutting height"), BorderLayout.WEST); myZCuttingHeightPanel.setToolTipText("When cutting the head should have this z-coordinate (mm or inch)"); final JTextField field = new JTextField(NumberFormat.getInstance().format(0.0)); myZCuttingHeightPanel.add(field, BorderLayout.CENTER); myZCuttingHeightPanel.addPropertyChangeListener("enabled", new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { field.setEnabled(myZCuttingHeightPanel.isEnabled()); } }); myZCuttingHeightPanel.setEnabled(false); field.getDocument().addUndoableEditListener(new UndoableEditListener() { @Override public void undoableEditHappened(UndoableEditEvent evt) { try { selectedZCuttingHeight = NumberFormat.getInstance().parse(field.getText()).doubleValue(); if (myAoolpathsProcessor != null) { myAoolpathsProcessor.setZCuttingHeight(selectedZCuttingHeight); } } catch (ParseException e) { evt.getEdit().undo(); } } }); } return myZCuttingHeightPanel; } private JRadioButton getAbsoluteCoordinatesButton() { if (myAbsoluteCoordinatesButton == null) { myAbsoluteCoordinatesButton = new JRadioButton("absolute"); myAbsoluteCoordinatesButton.setSelected(false); myAbsoluteCoordinatesButton.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { setAbsoluteCoordinates(myAbsoluteCoordinatesButton.isSelected()); } }); } return myAbsoluteCoordinatesButton; } private JRadioButton getRelativeCoordinatesButton() { if (myRelativeCoordinatesButton == null) { myRelativeCoordinatesButton = new JRadioButton("relative"); myRelativeCoordinatesButton.setSelected(true); myRelativeCoordinatesButton.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { setAbsoluteCoordinates(!myRelativeCoordinatesButton.isSelected()); } }); } return myRelativeCoordinatesButton; } public void setAbsoluteCoordinates(final boolean newValue) { getAbsoluteCoordinatesButton().setSelected(newValue); getRelativeCoordinatesButton().setSelected(!newValue); getZCuttingHeightPanel().setEnabled(newValue); getInitialXPanel().setEnabled(newValue); getInitialYPanel().setEnabled(newValue); if (myAoolpathsProcessor != null) { myAoolpathsProcessor.setOutputAbsoluteCoordinates(newValue); } } private JRadioButton getMetricButton() { if (myMetricButton == null) { myMetricButton = new JRadioButton("metric"); myMetricButton.setSelected(false); myMetricButton.setToolTipText("output gcode in mm. coordinates entered here must be in mm too"); myMetricButton.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { if (myMetricButton.isSelected()) { getImperialButton().setSelected(false); if (myAoolpathsProcessor != null) { myAoolpathsProcessor.setOutputMetricCoordinates(true); } } } }); } return myMetricButton; } private JRadioButton getImperialButton() { if (myImperialButton == null) { myImperialButton = new JRadioButton("imperial"); myImperialButton.setSelected(true); myImperialButton.setToolTipText("output gcode in inch. coordinates entered here must be in inch too"); myImperialButton.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { if (myImperialButton.isSelected()) { getMetricButton().setSelected(false); if (myAoolpathsProcessor != null) { myAoolpathsProcessor.setOutputMetricCoordinates(false); } } } }); } return myImperialButton; } public void saveMosaic() { saveMosaic(new File(mosaicField.getText().trim())); } public void saveMosaic(File file) { saveMosaic(file, mosaicTilesButton.isSelected()); } public void saveMosaic(File file, boolean tiles) { try { mosaicField.setText(file.toString()); if (file.exists() && !(JOptionPane. showConfirmDialog(this, "Overwrite existing mosaic file " + file + "?", "Overwrite?", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)) return; startProcess(new SaveMosaic(this, file, tiles)); } catch (AccessControlException e1) { accessControlError(); } } public void fixTopology() { startProcess(new TopologyProcessor(this)); } private void computeToolpaths() { int mode = -1; if (voronoiButton.isSelected()) mode = ToolpathsProcessor.VORONOI_MODE; else mode = ToolpathsProcessor.OUTLINE_MODE; myAoolpathsProcessor = new ToolpathsProcessor(this, mode, getAbsoluteCoordinatesButton().isSelected(), selectedZClearance, getMetricButton().isSelected()); myAoolpathsProcessor.setZCuttingHeight(selectedZCuttingHeight); myAoolpathsProcessor.setAbsoluteXStart(selectedInitialXCoordinate); myAoolpathsProcessor.setAbsoluteYStart(selectedInitialYCoordinate); myAoolpathsProcessor.setMillingSpeed(myMillingSpeed); myAoolpathsProcessor.setMovementSpeed(myMovementSpeed); startProcess(myAoolpathsProcessor); } private File browse() { try { String dir = System.getProperty("user.dir"); if (currentFile != null) dir = (currentFile.getParent()).toString(); JFileChooser chooser = new JFileChooser(dir); //chooser.setFileFilter(fileFilter); if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) return chooser.getSelectedFile(); else return null; } catch (AccessControlException e1) { accessControlError(); return null; } } private void accessControlError() { JOptionPane. showMessageDialog(this, "Cannot load or save from an applet. You must " + "either change your browser's security policy or " + "download the application and run it directly.", "Access Denied", JOptionPane.ERROR_MESSAGE); } public void destroy() { display.destroy(); } public void loadFile() { loadFile(new File(loadField.getText().trim())); } public void loadDemo() { loadURL(getClass().getResource(DEMO_FILE)); loadField.setText("[built-in demo]"); } public void loadURL(URL url) { try { load(url.openStream()); } catch (IOException e) { JOptionPane. showMessageDialog(this, "I/O Error: " + e.getMessage(), "I/O Error", JOptionPane.ERROR_MESSAGE); } } public void loadFile(File file) { currentFile = file; loadField.setText(file.toString()); setGcodeFile(file.toString()+".ngc"); try { load(new FileInputStream(file)); } catch (FileNotFoundException e) { JOptionPane. showMessageDialog(this, "File Not Found: " + e.getMessage(), "File Not Found", JOptionPane.ERROR_MESSAGE); } } private void load(InputStream inputStream) { stopProcess(); simulator.reset(); try { Parser parser = new Parser(inputStream); parser.setSimulator(simulator); parser.Input(); } catch (visolate.parser.ParseException e) { JOptionPane. showMessageDialog(this, "Parse Error: " + e.getMessage(), "Parse Error", JOptionPane.ERROR_MESSAGE); } model.rebuild(); } public void setGcodeFile(String filename) { gcodeField.setText(filename); } public void saveGCode() { saveGCode(new File(gcodeField.getText().trim())); } public void saveGCode(final File file) { gcodeField.setText(file.toString()); if (myAoolpathsProcessor == null) { return; } try { if (file.exists()&& (!auto_mode)) { int yesno = JOptionPane. showConfirmDialog(this, "Overwrite existing G-Code file " + file + "?", "Overwrite?", JOptionPane.YES_NO_OPTION); if (yesno != JOptionPane.YES_OPTION) { return; } } try { FileWriter w = new FileWriter(file); myAoolpathsProcessor.writeGCode(w); w.close(); } catch (IOException e) { JOptionPane. showMessageDialog(this, "I/O Error writing G-Code: " + e.getMessage(), "I/O Error", JOptionPane.ERROR_MESSAGE); } } catch (AccessControlException e1) { accessControlError(); try { myAoolpathsProcessor.writeGCode(null); } catch (IOException e2) { //nope } } } public void mouseClicked(double x, double y, int modifiers) { SortedSet clickedNets = new TreeSet(); model.getNetsAtPoint(x, y, 1.0/display.getDPI(), clickedNets); if (manualTopology.isSelected()) { clearSelection(); TopologyProcessor.mergeNets(clickedNets); return; } if ((selectedNet != null) && clickedNets.contains(selectedNet)) { Iterator it = (clickedNets.tailSet(selectedNet)).iterator(); it.next(); if (it.hasNext()) { selectedNet = it.next(); } else { selectedNet = clickedNets.iterator().next(); } } else { selectedNet = null; if (!clickedNets.isEmpty()) { selectedNet = clickedNets.iterator().next(); } } Net selectedNetSave = selectedNet; if (!((modifiers & MouseEvent.CTRL_DOWN_MASK) != 0)) clearSelection(); selectedNet = selectedNetSave; if (selectedNet != null) { selectedNets.add(selectedNet); selectedNet.setHighlighted(true); } } public void clearSelection() { for (Iterator it = selectedNets.iterator(); it.hasNext(); ) { it.next().setHighlighted(false); } selectedNets.clear(); selectedNet = null; } public void keyReleased(KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_F: startProcess(new FatnessProcessor(this)); break; case KeyEvent.VK_D: model.dump(); break; case KeyEvent.VK_I: { System.out.println(selectedNets.size() + " selected nets:"); for (Net net : selectedNets) { net.dump(); } break; } case KeyEvent.VK_DELETE: { for (Net net : selectedNets) { Set superNet = net.getSuperNet(); if (superNet == null) { model.deleteNet(net); } else { for (Iterator jt = superNet.iterator(); jt.hasNext(); ) { model.deleteNet(jt.next()); } } } undoHistory.add(0, new UndoDelete(selectedNets)); clearSelection(); break; } case KeyEvent.VK_U: { if (!undoHistory.isEmpty()) { Iterator it = undoHistory.iterator(); UndoTask undoTask = it.next(); it.remove(); undoTask.undo(); } break; } } } public boolean askContinue(int line, int seq) { return JOptionPane. showConfirmDialog(this, "Continue after line " + line + ((seq >= 0) ? ("(sequence number " + seq + ")") : "") + "?", "Continue?", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION; } public Simulator getSimulator() { return simulator; } public Model getModel() { return model; } public Display getDisplay() { return display; } public void enableControls(boolean enable) { loadField.setEnabled(enable); loadButton.setEnabled(enable); mosaicButton.setEnabled(enable); mosaicField.setEnabled(enable); mosaicBrowseButton.setEnabled(enable); mosaicTilesButton.setEnabled(enable); topologyButton.setEnabled(enable); manualTopology.setEnabled(enable); toolpathsButton.setEnabled(enable); voronoiButton.setEnabled(enable); outlineButton.setEnabled(enable); if (myAoolpathsProcessor != null) { gcodeButton.setEnabled(enable); gcodeField.setEnabled(enable); gcodeBrowseButton.setEnabled(enable); } } public void resetOuterProgressBar(int numSteps) { outerProgressBar.setMaximum(numSteps); outerProgressBar.setValue(0); } public void tickOuterProgressBar() { outerProgressBar.setValue(outerProgressBar.getValue()+1); } public void resetInnerProgressBar(int numSteps) { innerProgressBar.setMaximum(numSteps); innerProgressBar.setValue(0); } public void tickInnerProgressBar() { innerProgressBar.setValue(innerProgressBar.getValue()+1); } public void startProcess(Processor processor) { stopProcess(); this.processor = processor; stopButton.setEnabled(true); processor.start(); } public void stopProcess() { if (processor == null) return; try { processor.stop(); } catch (InterruptedException e) { System.err.println("WARNING: interrupted while stopping process"); } processFinished(); } public void processFinished() { outerProgressBar.setValue(0); innerProgressBar.setValue(0); stopButton.setEnabled(false); processor = null; if (processstatus == 1) { //returning from automated topology fixing processstatus=2; computeToolpaths(); } else if (processstatus==2) { //returning from automated toolpath creation System.out.println("Writing to gcode file: "+gcodeField.getText().trim()); saveGCode(new File(gcodeField.getText().trim())); System.out.println("Exiting, all work done"); System.exit(0); } } public void addFrameTask(Runnable task) { if (display != null) display.addFrameTask(task); else task.run(); } private interface UndoTask { public void undo(); } private class UndoDelete implements UndoTask { private UndoDelete(Collection nets) { for (Net net : nets) { Set superNet = net.getSuperNet(); if (superNet == null) { this.nets.add(net); } else { this.nets.addAll(superNet); } } } public void undo() { // System.out.println("undeleting " + nets.size() + " nets"); for (Net net : nets) { model.undeleteNet(net); } } private Collection nets = new LinkedHashSet(); } private Simulator simulator; public Model model; private Display display; private JTextField loadField; private JButton loadButton; private File currentFile = null; private JButton mosaicButton; private JTextField mosaicField; private JButton mosaicBrowseButton; private JCheckBox mosaicTilesButton; private JProgressBar innerProgressBar; private JProgressBar outerProgressBar; private Processor processor = null; private JButton stopButton; private JButton topologyButton; private JCheckBox manualTopology; private JButton toolpathsButton; private JRadioButton voronoiButton; private JRadioButton outlineButton; private JButton gcodeButton; private JTextField gcodeField; private JButton gcodeBrowseButton; /** * The ToolpathsProcessor generates the g-code that we write to a file. */ private ToolpathsProcessor myAoolpathsProcessor = null; private Set selectedNets = new LinkedHashSet(); private Net selectedNet = null; private List undoHistory = new LinkedList(); private Box myProcessingBox; private Box myGCodeOptionsBox; private Box myMosaicBox; private Box myLoadFileBox; private Box myGcodeBox; private JRadioButton myRelativeCoordinatesButton; private JRadioButton myAbsoluteCoordinatesButton; private JRadioButton myImperialButton; private JRadioButton myMetricButton; private JPanel myZCuttingHeightPanel; private JPanel myZDownMovementPanel; private JPanel myMillingSpeedPanel; private JPanel myMovementSpeedPanel; private JPanel myInitialXPanel; private JPanel myInitialYPanel; private double myMillingSpeed = 2; private double myMovementSpeed = 2; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/example.grb000066400000000000000000000311041147500217100247110ustar00rootroot00000000000000G75* G70* %OFA0B0*% %FSAX24Y24*% %IPPOS*% %LPD*% %ADD10C,0.0060*% %ADD11C,0.1500*% %ADD12O,0.0780X0.1560*% %ADD13O,0.0980X0.0490*% %ADD14C,0.0600*% %ADD15C,0.0550*% %ADD16C,0.0630*% %ADD17C,0.1005*% %ADD18O,0.0600X0.1200*% %ADD19O,0.1005X0.2010*% %ADD20O,0.1560X0.0780*% %ADD21O,0.1200X0.0600*% %ADD22C,0.0500*% %ADD23C,0.0140*% %ADD24C,0.0160*% %ADD25C,0.0660*% %ADD26R,0.0450X0.0450*% %ADD27C,0.0010*% D10* X037262Y009096D02* X036622Y009096D01* X036622Y008883D02* X036622Y009310D01* X036942Y009527D02* X036835Y009634D01* X036835Y009848D01* X036942Y009954D01* X037156Y009954D01* X037262Y009848D01* X037262Y009634D01* X037156Y009527D01* X036942Y009527D01* X036835Y010172D02* X036835Y010492D01* X036942Y010599D01* X037156Y010599D01* X037262Y010492D01* X037262Y010172D01* X037476Y010172D02* X036835Y010172D01* D11* X034792Y002353D02* X031792Y002353D01* X028792Y002353D01* X024292Y002353D01* X019792Y002353D01* X016792Y002353D01* X013792Y002353D01* X010792Y002353D01* X007792Y002353D01* X005792Y002353D01* X002792Y004853D01* X002792Y023853D01* X002792Y026853D01* X006292Y029353D01* X011292Y029353D01* X024292Y029353D01* X024292Y027353D01* X022292Y027353D02* X021792Y022853D01* X022292Y022853D01* X024792Y022853D01* X026292Y027353D02* X026292Y029353D01* X024292Y029353D01* X026292Y029353D02* X033292Y029353D01* X033292Y027353D01* X035292Y027353D01* X037292Y029853D02* X037294Y029898D01* X037300Y029944D01* X037311Y029988D01* X037325Y030031D01* X037343Y030073D01* X037365Y030113D01* X037390Y030151D01* X037419Y030186D01* X037451Y030218D01* X037485Y030248D01* X037523Y030274D01* X037562Y030297D01* X037603Y030316D01* X037646Y030331D01* X037690Y030343D01* X037735Y030350D01* X037781Y030353D01* X037826Y030352D01* X037871Y030347D01* X037916Y030337D01* X037959Y030324D01* X038002Y030307D01* X038042Y030286D01* X038080Y030261D01* X038116Y030234D01* X038150Y030203D01* X038180Y030169D01* X038207Y030132D01* X038231Y030093D01* X038251Y030052D01* X038267Y030010D01* X038279Y029966D01* X038287Y029921D01* X038291Y029876D01* X038291Y029830D01* X038287Y029785D01* X038279Y029740D01* X038267Y029696D01* X038251Y029654D01* X038231Y029613D01* X038207Y029574D01* X038180Y029537D01* X038150Y029503D01* X038116Y029472D01* X038080Y029445D01* X038042Y029420D01* X038002Y029399D01* X037959Y029382D01* X037916Y029369D01* X037871Y029359D01* X037826Y029354D01* X037781Y029353D01* X037735Y029356D01* X037690Y029363D01* X037646Y029375D01* X037603Y029390D01* X037562Y029409D01* X037523Y029432D01* X037485Y029458D01* X037451Y029488D01* X037419Y029520D01* X037390Y029555D01* X037365Y029593D01* X037343Y029633D01* X037325Y029675D01* X037311Y029718D01* X037300Y029762D01* X037294Y029808D01* X037292Y029853D01* X031292Y027353D02* X032292Y022853D01* X035292Y022853D01* X031292Y027353D02* X029292Y027353D01* X020292Y027353D02* X017792Y027353D01* X015292Y027353D01* X013292Y022353D01* X001292Y029853D02* X001294Y029898D01* X001300Y029944D01* X001311Y029988D01* X001325Y030031D01* X001343Y030073D01* X001365Y030113D01* X001390Y030151D01* X001419Y030186D01* X001451Y030218D01* X001485Y030248D01* X001523Y030274D01* X001562Y030297D01* X001603Y030316D01* X001646Y030331D01* X001690Y030343D01* X001735Y030350D01* X001781Y030353D01* X001826Y030352D01* X001871Y030347D01* X001916Y030337D01* X001959Y030324D01* X002002Y030307D01* X002042Y030286D01* X002080Y030261D01* X002116Y030234D01* X002150Y030203D01* X002180Y030169D01* X002207Y030132D01* X002231Y030093D01* X002251Y030052D01* X002267Y030010D01* X002279Y029966D01* X002287Y029921D01* X002291Y029876D01* X002291Y029830D01* X002287Y029785D01* X002279Y029740D01* X002267Y029696D01* X002251Y029654D01* X002231Y029613D01* X002207Y029574D01* X002180Y029537D01* X002150Y029503D01* X002116Y029472D01* X002080Y029445D01* X002042Y029420D01* X002002Y029399D01* X001959Y029382D01* X001916Y029369D01* X001871Y029359D01* X001826Y029354D01* X001781Y029353D01* X001735Y029356D01* X001690Y029363D01* X001646Y029375D01* X001603Y029390D01* X001562Y029409D01* X001523Y029432D01* X001485Y029458D01* X001451Y029488D01* X001419Y029520D01* X001390Y029555D01* X001365Y029593D01* X001343Y029633D01* X001325Y029675D01* X001311Y029718D01* X001300Y029762D01* X001294Y029808D01* X001292Y029853D01* X001292Y001853D02* X001294Y001898D01* X001300Y001944D01* X001311Y001988D01* X001325Y002031D01* X001343Y002073D01* X001365Y002113D01* X001390Y002151D01* X001419Y002186D01* X001451Y002218D01* X001485Y002248D01* X001523Y002274D01* X001562Y002297D01* X001603Y002316D01* X001646Y002331D01* X001690Y002343D01* X001735Y002350D01* X001781Y002353D01* X001826Y002352D01* X001871Y002347D01* X001916Y002337D01* X001959Y002324D01* X002002Y002307D01* X002042Y002286D01* X002080Y002261D01* X002116Y002234D01* X002150Y002203D01* X002180Y002169D01* X002207Y002132D01* X002231Y002093D01* X002251Y002052D01* X002267Y002010D01* X002279Y001966D01* X002287Y001921D01* X002291Y001876D01* X002291Y001830D01* X002287Y001785D01* X002279Y001740D01* X002267Y001696D01* X002251Y001654D01* X002231Y001613D01* X002207Y001574D01* X002180Y001537D01* X002150Y001503D01* X002116Y001472D01* X002080Y001445D01* X002042Y001420D01* X002002Y001399D01* X001959Y001382D01* X001916Y001369D01* X001871Y001359D01* X001826Y001354D01* X001781Y001353D01* X001735Y001356D01* X001690Y001363D01* X001646Y001375D01* X001603Y001390D01* X001562Y001409D01* X001523Y001432D01* X001485Y001458D01* X001451Y001488D01* X001419Y001520D01* X001390Y001555D01* X001365Y001593D01* X001343Y001633D01* X001325Y001675D01* X001311Y001718D01* X001300Y001762D01* X001294Y001808D01* X001292Y001853D01* X037292Y001853D02* X037294Y001898D01* X037300Y001944D01* X037311Y001988D01* X037325Y002031D01* X037343Y002073D01* X037365Y002113D01* X037390Y002151D01* X037419Y002186D01* X037451Y002218D01* X037485Y002248D01* X037523Y002274D01* X037562Y002297D01* X037603Y002316D01* X037646Y002331D01* X037690Y002343D01* X037735Y002350D01* X037781Y002353D01* X037826Y002352D01* X037871Y002347D01* X037916Y002337D01* X037959Y002324D01* X038002Y002307D01* X038042Y002286D01* X038080Y002261D01* X038116Y002234D01* X038150Y002203D01* X038180Y002169D01* X038207Y002132D01* X038231Y002093D01* X038251Y002052D01* X038267Y002010D01* X038279Y001966D01* X038287Y001921D01* X038291Y001876D01* X038291Y001830D01* X038287Y001785D01* X038279Y001740D01* X038267Y001696D01* X038251Y001654D01* X038231Y001613D01* X038207Y001574D01* X038180Y001537D01* X038150Y001503D01* X038116Y001472D01* X038080Y001445D01* X038042Y001420D01* X038002Y001399D01* X037959Y001382D01* X037916Y001369D01* X037871Y001359D01* X037826Y001354D01* X037781Y001353D01* X037735Y001356D01* X037690Y001363D01* X037646Y001375D01* X037603Y001390D01* X037562Y001409D01* X037523Y001432D01* X037485Y001458D01* X037451Y001488D01* X037419Y001520D01* X037390Y001555D01* X037365Y001593D01* X037343Y001633D01* X037325Y001675D01* X037311Y001718D01* X037300Y001762D01* X037294Y001808D01* X037292Y001853D01* D12* X035292Y027353D03* X033292Y027353D03* X031292Y027353D03* X029292Y027353D03* X026292Y027353D03* X024292Y027353D03* X022292Y027353D03* X020292Y027353D03* D13* X011292Y027853D03* X011292Y026853D03* X011292Y025853D03* X011292Y024853D03* X008292Y024853D03* X008292Y025853D03* X008292Y026853D03* X008292Y027853D03* D14* X007292Y022353D03* X013292Y022353D03* D15* X012792Y023853D03* X012792Y027853D03* X006792Y027853D03* X006792Y023853D03* X008792Y013353D03* X008792Y012353D03* X008792Y010853D03* X008792Y009853D03* X012792Y009853D03* X012792Y010853D03* X012792Y012353D03* X012792Y013353D03* X026292Y013353D03* X026292Y012353D03* X026292Y010853D03* X026292Y009853D03* X030292Y009853D03* X030292Y010853D03* X030292Y012353D03* X030292Y013353D03* D16* X017792Y027353D03* X017792Y029353D03* X015292Y029353D03* X015292Y027353D03* D17* X014342Y019703D03* X016242Y019703D03* X016242Y017853D03* X014342Y017853D03* X014342Y016003D03* X016242Y016003D03* X021842Y016003D03* X023742Y016003D03* X023742Y017853D03* X021842Y017853D03* X021842Y019703D03* X023742Y019703D03* X033342Y019703D03* X035242Y019703D03* X035242Y017853D03* X033342Y017853D03* X033342Y016003D03* X035242Y016003D03* X006742Y016003D03* X004842Y016003D03* X004842Y017853D03* X006742Y017853D03* X006742Y019703D03* X004842Y019703D03* D18* X004792Y012353D03* X006792Y012353D03* X006792Y010353D03* X004792Y010353D03* X014292Y010353D03* X016292Y010353D03* X016292Y012353D03* X014292Y012353D03* X019792Y007353D03* X020792Y007353D03* X021792Y007353D03* X024292Y007353D03* X025292Y007353D03* X026292Y007353D03* X023792Y010353D03* X023792Y012353D03* X021292Y012353D03* X021292Y010353D03* X020792Y004353D03* X021792Y004353D03* X019792Y004353D03* X024292Y004353D03* X025292Y004353D03* X026292Y004353D03* X033292Y010353D03* X035292Y010353D03* X035292Y012353D03* X033292Y012353D03* X034792Y007353D03* X035792Y007353D03* X036792Y007353D03* X036792Y004353D03* X035792Y004353D03* X034792Y004353D03* D19* X035492Y022853D03* X032492Y022853D03* X024992Y022853D03* X021992Y022853D03* D20* X019292Y023353D03* X019292Y024353D03* X019292Y022353D03* D21* X010792Y019353D03* X010792Y018353D03* X010792Y017353D03* X010792Y016353D03* X010792Y015353D03* X004292Y021853D03* X004292Y022853D03* X004292Y023853D03* X004292Y024853D03* X004292Y025853D03* X004792Y007353D03* X004792Y006353D03* X004792Y005353D03* X007792Y005353D03* X007792Y006353D03* X007792Y007353D03* X010792Y007353D03* X010792Y006353D03* X010792Y005353D03* X010792Y004353D03* X013792Y004353D03* X013792Y005353D03* X013792Y006353D03* X013792Y007353D03* X016792Y006353D03* X016792Y005353D03* X016792Y004353D03* X028792Y004353D03* X028792Y005353D03* X028792Y006353D03* X028792Y007353D03* X031792Y007353D03* X031792Y006353D03* X031792Y005353D03* X031792Y004353D03* X028792Y015353D03* X028792Y016353D03* X028792Y017353D03* X028792Y018353D03* X028792Y019353D03* D22* X027792Y020853D01* X010792Y020853D01* X010792Y019353D01* X010792Y020853D02* X010792Y024853D01* X010292Y025353D01* X010292Y027353D01* X010792Y027853D01* X011292Y027853D01* X011292Y029353D01* X004292Y023853D02* X002792Y023853D01* X004292Y022853D02* X005292Y022853D01* X008292Y020353D01* X006792Y017853D02* X008292Y016853D01* X008292Y014853D01* X006792Y013353D01* X006792Y012353D01* X007792Y012853D02* X007792Y010853D01* X004792Y012353D02* X005792Y014353D01* X005792Y016853D01* X004792Y017853D01* X004842Y017853D01* X006742Y017853D02* X006792Y017853D01* X014292Y017853D02* X014342Y017853D01* X014292Y017853D02* X015292Y016853D01* X015292Y014353D01* X014292Y012353D01* X016292Y012353D02* X017292Y013353D01* X017292Y017353D01* X016242Y017853D01* X021792Y017853D02* X021842Y017853D01* X021792Y017853D02* X022792Y016853D01* X022792Y014353D01* X021292Y012353D01* X023792Y012353D02* X025292Y013353D01* X025292Y016853D01* X023792Y017853D01* X023742Y017853D01* X032292Y016353D02* X032292Y013353D01* X033292Y012353D01* X034292Y013353D02* X034292Y016853D01* X035292Y017353D01* X033292Y017353D02* X032292Y016353D01* X034292Y013353D02* X035292Y012353D01* X035292Y010353D02* X036792Y007353D01* X036792Y004353D01* X034792Y002353D02* X034792Y007353D01* X031792Y007353D02* X031792Y006353D01* X031792Y007353D02* X035292Y010353D01* X033292Y010353D02* X030292Y009853D01* X028792Y007353D01* X026292Y007353D01* X026292Y004353D01* X028792Y005353D02* X028792Y002353D01* X031792Y002353D02* X031792Y005353D01* X028792Y006353D02* X028792Y007353D01* X026292Y007353D02* X026292Y008353D01* X013292Y008353D01* X012792Y009853D02* X010792Y007353D01* X010792Y005353D02* X010792Y002353D01* X013792Y002353D02* X013792Y005353D01* X016792Y004353D02* X016792Y002353D01* X019792Y002353D02* X019792Y007353D01* X024292Y007353D02* X024292Y002353D01* X014292Y010353D02* X012792Y009853D01* X007792Y005353D02* X007792Y002353D01* X004792Y003353D02* X004792Y005353D01* D23* X004792Y007353D02* X008792Y010853D01* X008792Y009853D02* X009792Y010353D01* X009792Y016853D01* X010792Y017353D01* X010792Y018353D02* X009292Y017353D01* X009292Y012853D01* X008792Y012353D01* X010792Y013853D02* X010792Y015353D01* X010792Y013853D02* X012792Y013353D01* X026292Y010853D02* X027792Y012353D01* X027792Y017853D01* X028292Y018353D01* X028792Y018353D01* X028792Y016353D02* X029292Y016353D01* X030292Y015353D01* X030292Y013353D01* X030292Y012353D02* X028792Y013353D01* X028792Y015353D01* X030292Y010853D02* X034292Y011353D01* X035292Y010353D01* X011292Y024853D02* X010792Y024853D01* X008292Y024853D02* X005792Y024853D01* X004792Y025853D01* X004292Y025853D01* D24* X006792Y027853D02* X007792Y026853D01* X008292Y026853D01* X011292Y026853D02* X011792Y026853D01* X012792Y027853D01* X012792Y023853D02* X013292Y022353D01* X007292Y022353D02* X006792Y023853D01* X033342Y017853D02* X033292Y017353D01* X035292Y017353D02* X035242Y017853D01* D25* X022292Y022853D02* X019292Y022353D01* X019292Y023353D02* X017792Y023353D01* X017792Y027353D01* X019292Y024353D02* X022292Y024353D01* D26* X008292Y020353D03* X007792Y012853D03* X007792Y010853D03* X013292Y008353D03* D27* X000292Y000353D02* X039292Y000353D01* X039292Y031353D01* X000292Y031353D01* X000292Y000353D01* M02* visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/misc/000077500000000000000000000000001147500217100235165ustar00rootroot00000000000000visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/misc/Rect.java000066400000000000000000000065701147500217100252660ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.misc; public class Rect { private static final String cvsid = "$Id: Rect.java,v 1.2 2004/08/05 20:06:51 vona Exp $"; public Rect() { this(Double.NaN, Double.NaN, Double.NaN, Double.NaN); uninitialized = true; } public Rect(double x, double y, double width, double height) { this.x = x; this.y = y; this.width = width; this.height = height; } public Rect(Rect other) { this.x = other.x; this.y = other.y; this.width = other.width; this.height = other.height; } public Rect(float[] x, float[] y) { float minX = Float.POSITIVE_INFINITY; float minY = Float.POSITIVE_INFINITY; float maxX = Float.NEGATIVE_INFINITY; float maxY = Float.NEGATIVE_INFINITY; for (int i = 0; i < x.length; i++) { if (x[i] < minX) minX = x[i]; if (y[i] < minY) minY = y[i]; if (x[i] > maxX) maxX = x[i]; if (y[i] > maxY) maxY = y[i]; } this.x = minX; this.y = minY; this.width = maxX-minX; this.height = maxY-minY; } public Rect add(Rect other) { if (uninitialized) { this.x = other.x; this.y = other.y; this.width = other.width; this.height = other.height; uninitialized = false; return this; } add(other.x, other.y); add(other.x + other.width, other.y); add(other.x + other.width, other.y + other.height); add(other.x, other.y + other.height); return this; } public Rect add(double x, double y) { // System.out.println("adding (" + x + ", " + y + ") to " + toString()); if (uninitialized) { this.x = x; this.y = y; this.width = 0.0; this.height = 0.0; uninitialized = false; return this; } if (x < this.x) { width += this.x - x; this.x = x; } else if (x > (this.x + width)) { width = x - this.x; } if (y < this.y) { height += this.y - y; this.y = y; } else if (y > (this.y + height)) { height = y - this.y; } // System.out.println(" result " + toString()); return this; } public String toString() { return "LLC: (" + x + ", " + y + "); width = " + width + "; height = " + height; } public void translate(double x, double y) { this.x += x; this.y += y; } public double x; public double y; public double width; public double height; public boolean uninitialized = false; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/misc/Util.java000066400000000000000000000100641147500217100252770ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.misc; import javax.vecmath.*; import java.util.*; public class Util { private static final String cvsid = "$Id: Util.java,v 1.4 2005/04/11 15:16:21 vona Exp $"; public static final double MIN_DY = 1e-6; public static float distance(float x0, float y0, float x1, float y1) { return (float) Math.sqrt(distanceSquared(x0, y0, x1, y1)); } public static float distanceSquared(float x0, float y0, float x1, float y1) { double dx = x1-x0; double dy = y1-y0; return (float) (dx*dx + dy*dy); } public static double canonicalAngle(double x, double y) { double angle = Math.atan2(y, x); if (angle < 0.0) angle += Math.PI*2.0; return angle; } public static double canonicalizeAngle(double theta) { while (theta > Math.PI*2) theta -= Math.PI*2; while (theta < 0) theta += Math.PI*2; return theta; } public static int findClosest(double theta, double[] angle) { // System.out.println("find " + theta + " in:"); // for (int i = 0; i < angle.length; i++) // System.out.println(" " + angle[i]); int closest = Arrays.binarySearch(angle, theta); if (closest < 0) { int next = -closest - 1; int prev = next - 1; if (next == angle.length) next = 0; if (prev < 0) prev = angle.length-1; if ((theta - angle[prev]) < (angle[next] - theta)) closest = prev; else closest = next; } return closest; } public static double getPolyWidth(float[] x, float[] y, double[] angle, double theta) { theta = canonicalizeAngle(theta); double dx = Math.cos(theta); double dy = Math.sin(theta); int i = findClosest(theta, angle); double d1 = dx*x[i] + dy*y[i]; theta = canonicalizeAngle(theta + Math.PI); dx = -dx; dy = -dy; i = findClosest(theta, angle); double d2 = dx*x[i] + dy*y[i]; return Math.abs(d1)+Math.abs(d2); } /** * is this just asin? **/ public static double getOffsetAngle(double rad, double y) { return Math.atan2(y, Math.sqrt(rad*rad-y*y)); } public static double angleCCW(Vector3d from, Vector3d to) { double angleF = canonicalizeAngle(Math.atan2(from.y, from.x)); double angleT = canonicalizeAngle(Math.atan2(to.y, to.x)); return canonicalizeAngle(angleT-angleF); } public static double vertexOffset(double offset, double angle) { Vector2d p0 = new Vector2d(Math.cos(angle-Math.PI/2), Math.sin(angle-Math.PI/2)); p0.scale(-offset); Vector2d p1 = new Vector2d(p0.x + Math.cos(angle), p0.y + Math.sin(angle)); double dy = p1.y-p0.y; if (dy < MIN_DY) return offset; double dx = p1.x-p0.x; double xIntercept = p0.x - (dx/dy)*p0.y; double y = -offset; double x = xIntercept + (dx/dy)*y; return Math.sqrt(x*x + y*y)*sign(offset); } public static double sign(double d) { if (d < 0) return -1; else if (d == 0) return 0; else return 1; } } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/misc/makefile.old000066400000000000000000000650351147500217100260040ustar00rootroot00000000000000# Vona's super-ninja makefile # # *** DO NOT EDIT THIS FILE EXCEPT IN THE PROJECT HOME DIRECTORY *** # # This makefile is auto-generated by "make makefiles" in the parent package # # You can (and should) edit makefile.project, which is included below, to # specify project-specific settings # # You can edit makefile.package, which is included below, to specify # package-specific targets and variables # # Copyright (C) 2004 Marsette A. Vona, III # # 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 2 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., 59 # Temple Place - Suite 330, Boston, MA 02111-1307, USA. # $Id: makefile 15 2008-01-23 21:56:45Z vona $ # Relative path to the directory containing the root package for the project. # For makefile in every directory other than $(PROJECT_HOME) this is # automatically set by "make makefiles" PROJECT_HOME = ../. -include $(PROJECT_HOME)/makefile.project ifndef BASE_PACKAGE BASE_PACKAGE := $(notdir $(shell $(CD) $(PROJECT_HOME) && pwd)) endif ifndef APPNAME APPNAME := $(BASE_PACKAGE) endif # The (full) name of this package. For makefile in every directory other than # $(PROJECT_HOME) this is automatically set by "make makefiles" PACKAGE = $(BASE_PACKAGE).misc # the default target default: package #figure out arch SYSTEM = $(shell uname -s | tr " " "_") MACHINE = $(shell uname -m | tr " " "_") ARCH := $(SYSTEM)_$(MACHINE) #linux: Linux_i686 #OS X: Darwin_Power_Macintosh #cygwin: CYGWIN-5.1_NT # misc macros # these let $(COMMA) and $(SPACE) be lone arguments to make function calls COMMA := , EMPTY := SPACE := $(EMPTY) $(EMPTY) # whitespace regex WS = [ \t]* ifneq ($(findstring CYGWIN,$(SYSTEM)),CYGWIN) # make cd .. follow the Physical directory structure on Unix CD = cd -P else CD = cd # always use bash on cygwin, sh doesn't have pushd, but bash slows things down SHELL = `which bash` endif # tool finding functions #locate the target of a symlink # #works even if the starting point is not a symlink locate-target = $(shell f="$(1)"; while [ -L "$$f" ]; do f=`ls -l "$$f" | awk '{print $$NF}'`; done; echo "$$f") #try hard to find a command # #first arg is command name # #second arg is expected directory # #if cmd executable in directory, that is returned # #else if which knows where the command is, that is returned # #else empty string is returned locate-cmd = $(shell if [ -x "$(2)/$(1)" ]; then echo "$(2)/$(1)"; else cmd="$(shell which "$(1)" 2>/dev/null || true)" && if [ -x "$$cmd" ] ; then echo "$$cmd"; else echo ""; fi; fi) #get the parent directory name # #better than the make builtin function because this also works on a directory dirname = $(shell if [ "$(1)"x != x -a -e "$(1)" ] ; then dirname "$(1)"; else echo ""; fi) #default a dir # #first arg is the desired dir # #second is the default dir # #returns first arg iff it's a directory, else second arg default-dir = $(shell if [ ! -d "$(1)" ]; then echo "$(2)"; else echo "$(1)"; fi) # find tool directories ifndef TOOLS_HOME TOOLS_HOME := $(call default-dir,$(PROJECT_TOOLS_HOME),/usr) endif BIN := $(call default-dir,$(TOOLS_HOME)/bin/$(ARCH),/usr/bin) SCRIPTS := $(call default-dir,$(TOOLS_HOME)/scripts,$(BIN)) JDK_BASE := $(TOOLS_HOME)/java/$(ARCH) JDK_VERSION := newest JDK_HOME := $(call dirname,$(call dirname,$(call locate-target,$(call locate-cmd,javac,$(JDK_BASE)/$(JDK_VERSION)/bin)))) JDK_EXT := $(JDK_HOME)/jre/lib/ext ifeq ($(SYSTEM),Darwin) JDK_EXT := /Library/Java/Extensions endif TOOLS_EXT := $(TOOLS_HOME)/java/indep/lib # find pure java extension jars in the tools java/indep/lib dir if present, else in jre/lib/ext # NOTE the classes will come in on different classloaders in the two cases, which can lead to subtle CNFEs EXT_DIR := $(call default-dir,$(TOOLS_EXT),$(JDK_EXT)) # JDK executables JAVAC := $(call locate-cmd,javac,$(JDK_HOME)/bin) JAVA := $(call locate-cmd,java,$(JDK_HOME)/bin) JAVADOC := $(call locate-cmd,javadoc,$(JDK_HOME)/bin) JAR := $(call locate-cmd,jar,$(JDK_HOME)/bin) KEYTOOL := $(call locate-cmd,keytool,$(JDK_HOME)/bin) JARSIGNER := $(call locate-cmd,jarsigner,$(JDK_HOME)/bin) RMIC := $(call locate-cmd,rmic,$(JDK_HOME)/bin) #other executables JAVACC := $(call locate-cmd,javacc,$(BIN)) RSYNC := $(call locate-cmd,rsync,$(BIN)) WWWIMAGESIZE := $(call locate-cmd,wwwimagesize,$(SCRIPTS)) # CompileServer stuff # the CompileServer binary directory CS_BIN := $(call dirname,$(call locate-target,$(call locate-cmd,javac_submit,$(BIN)))) # the CompileServer scripts directory CS_SCRIPTS := $(call dirname,$(call locate-target,$(call locate-cmd,CompileServer-submit,$(SCRIPTS)))) # define NO_COMPILE_SERVER to disable compile server ifndef NO_COMPILE_SERVER CS_ENSURE := $(call locate-cmd,CompileServer-ensure-running,$(CS_SCRIPTS)) CS_SUBMIT := $(call locate-cmd,CompileServer-submit,$(CS_SCRIPTS)) ifdef CS_ENSURE ifeq ($(findstring OK,$(shell $(CS_ENSURE) nostart)),OK) ifdef CS_SUBMIT #ok CompileServer is all good! JAVAC := $(CS_SUBMIT) USING_COMPILE_SERVER := 1 endif endif #OK endif #CS_ENSURE endif #NO_COMPILE_SERVER # rmi stuff # generate commands to run RMIWrap # # first arg is the (simple) name of the API interface # # second arg is the (simple) name of the implementation class run-rmiwrap = if [ ! -f $(1)Remote.java -o ! -f $(2)Server.java -o ! -f $(2)Client.java -o \( $(1).java -nt $(1)Remote.java \) -o \( $(2).java -nt $(2)Client.java \) -o \( $(2).java -nt $(2)Server.java \) ]; then $(JAVA) $(RUN_JAVA_FLAGS) vona.rmi.rmiwrap.RMIWrap $(PACKAGE).$(1) $(PACKAGE).$(2) && $(JAVAC) $(JAVAC_FLAGS) *.java; fi # generate commands to run rmic # # first arg is the (simple) name of the remote class for which to generate a # stub RMIC_JRMP_VERSION = 1.1 run-rmic = if [ ! -f $(1)_Stub.class -o $(1).class -nt $(1)_Stub.class ]; then $(RMIC) -v$(RMIC_JRMP_VERSION) -d $(PROJECT_HOME)/.. $(CLASSPATH_FLAG) $(PACKAGE).$(1); fi # rsync stuff # flags for rsync # # excludes the usual suspects RSYNC_FLAGS := -rv --progress $(DBG) --copy-links --exclude "**~" --exclude ".\#**" --exclude CVS --exclude .svn --exclude "*.tmp" # rsync first arg to second arg, with cvs exclude rsync = $(RSYNC) $(RSYNC_FLAGS) --cvs-exclude $(1) $(2) # rsync a subproject # # first arg is filename extension to include (starting with ".", or empty for # all) # # second arg is the name of a subproject (i.e. the name of the base package of # the subproject). If it ends in "." then it is copied non-recursively, else # it is copied recursively. # # third arg is rsync dest, if not absolute then relative to $(PROJECT_HOME)/.. rsync-subproject = pushd $(PROJECT_HOME)/.. && $(RSYNC) $(RSYNC_FLAGS) --include "*/" --exclude "/$(BASE_PACKAGE)/$(JAVADOC_DIR_NAME)/**" --include $(if $(filter ".","$(suffix $(2))"),"/$(call package-to-path,$(basename $(2)))/*$(1)","/$(call package-to-path,$(2))/**$(1)") --exclude "*" $(BASE_PACKAGE) $(3) && popd # this should have dynamic binding so that makefile.package can override # JARFILE JAR_DIR = .$(JARFILE).tmp # make a jar # # does not include hidden files (any file with name beginning ".") # # arg 1: "true" to include javadoc tree, "false" otherwise # arg 2: the list of external jars (none if empty) # arg 3: the name of the jarfile # arg 4: the list of filename extensions to include (each beginning with ".", empty to include all) # arg 5: list of extra files to include (pathnames relative to parent of base package) # arg 6: includes only files in these subproject packages make-jar = \ $(RM) $(3) && \ $(RM) -r $(JAR_DIR) && \ mkdir $(JAR_DIR) && \ if [ $(1) ] && [ -d "$(JAVADOC_DIR)" ]; then $(call rsync,$(JAVADOC_DIR),$(JAR_DIR)); fi && \ if [ "$(4)foo" == "foo" ]; then \ $(foreach P,$(6),$(call rsync-subproject,,$(P),$(call package-to-path,$(PACKAGE))/$(JAR_DIR)) && ) true; \ else $(foreach E,$(4),$(foreach P,$(6),$(call rsync-subproject,$(E),$(P),$(call package-to-path,$(PACKAGE))/$(JAR_DIR)) && )) true; fi && \ $(foreach F,$(addprefix $(EXT_DIR)/,$(2)),cp $(F) $(JAR_DIR) &&) true && \ $(foreach F,$(5),cp $(addprefix $(PROJECT_HOME)/../,$(F)) $(JAR_DIR)/$(dir $(F)) &&) true && \ $(CD) $(JAR_DIR) && \ $(foreach F,$(2),$(JAR) xvf $(F) && rm $(F) &&) true && \ rm -rf META-INF && \ if [ "$(4)foo" == "foo" ]; then \ $(JAR) cvf $(3) `find . -not -type d -a -not -name ".*"` $(5); \ else $(JAR) cvf $(3) `find . -not -type d -a -not -name ".*" -a "(" -false $(foreach E,$(4),-o -name "*$(E)" ) ")"` $(5); fi && \ if [ -f ../$(JAR_MF) ]; then $(JAR) ufm $(3) ../$(JAR_MF); fi && \ if [ -f ../$(JAR_CRT) ]; then $(JARSIGNER) $(3) $(JARKEY); fi && \ mv $(3) .. && \ $(CD) .. && \ rm -rf $(JAR_DIR) # template file locations TEMPLATE_DIR = $(PROJECT_HOME)/templates JAVA_TEMPLATE = $(TEMPLATE_DIR)/Template.java EXCEPTION_TEMPLATE = $(TEMPLATE_DIR)/Exception.java PACKAGE_TEMPLATE = $(TEMPLATE_DIR)/package.html MAKEFILE_PACKAGE_TEMPLATE = $(TEMPLATE_DIR)/makefile.package template-m4-common = m4 -P "-DYEAR=`date +%Y`" "-DPACKAGE=$(PACKAGE)" template-m4-java = m4 -P "-DYEAR=`date +%Y`" "-DPACKAGE=$(PACKAGE)" "-DCLASS=$(notdir $(basename $(1)))" $(JAVA_TEMPLATE) > $(basename $(1)).java # compute short package name from fullname PACKAGE_NAME = $(subst .,,$(suffix .$(PACKAGE))) # compute project name (root package name) from package fullname PROJECT = $(firstword $(subst ., ,$(PACKAGE))) # heap size flag MEMORY_FLAG = -Xmx$(TOTAL_HEAP_SIZE) # compute the package path from the package full name # $(PROJECT_HOME)/../$(PACKAGE_PATH) is a path to this package PACKAGE_PATH = $(call package-to-path,$(PACKAGE)) # command to run make without generating any extraneous output MAKE_SILENT = $(MAKE) --silent --no-print-directory # is this the project root package? ifeq ($(PROJECT_HOME),.) ROOT_PACKAGE = yes endif # flag useful for various tools # put the parent of project home first on the classpath # that way if there are built checkouts of the source trees for any EXT_JARS # then we'll pick up those classes directly from there NINJA_CLASSPATH := $(PROJECT_HOME)/.. ifdef USING_COMPILE_SERVER NINJA_CLASSPATH := $(shell pwd)/$(NINJA_CLASSPATH) endif # now put each EXT_JAR on the classpath, in order, but only if we're finding # them in an EXT_DIR which is not the JDK installed extensions dir ifneq ($(EXT_DIR),$(JDK_EXT)) NINJA_CLASSPATH := $(subst $(SPACE),,$(NINJA_CLASSPATH)$(foreach JAR,$(EXT_JARS),:$(EXT_DIR)/$(JAR))) endif # next add the JDK tools jar to the classpath # in particular, for use by CompileServer NINJA_CLASSPATH := $(NINJA_CLASSPATH):$(JDK_HOME)/lib/tools.jar # finally append the user's externally defined CLASSPATH, if any ifdef CLASSPATH MAKE_CLASSPATH := $(NINJA_CLASSPATH):$(CLASSPATH) else #trailing colon breaks java under Windows MAKE_CLASSPATH := $(NINJA_CLASSPATH) endif ifeq ($(findstring CYGWIN,$(SYSTEM)),CYGWIN) MAKE_CLASSPATH := `cygpath -w -p "$(MAKE_CLASSPATH)"` endif CLASSPATH_FLAG = -classpath "$(MAKE_CLASSPATH)" DEPRECATION_FLAG = -deprecation # source the package-specific makefile -include makefile.package # always exclude these subdirs EXCLUDE_SUBDIRS += . .. CVS .svn # figure out our subdirs PACKAGE_SUBDIRS = $(filter-out $(EXCLUDE_SUBDIRS),$(notdir $(shell find . -maxdepth 1 -type d -not -name ".*.tmp" -a -not -name "javadoc-*"))) # always exclude these source files EXCLUDE_SOURCE += # figure out source files PACKAGE_SOURCE = $(filter-out $(wildcard $(EXCLUDE_SOURCE)),$(wildcard *.java)) PACKAGE_HTML_SOURCE = $(filter-out $(wildcard $(EXCLUDE_SOURCE)),$(wildcard *.phtml *.m4)) # ALL source SOURCE = \ $(wildcard *.java) \ $(wildcard *.scm) \ $(wildcard *.c *.cc *.h *.hh) \ $(wildcard *.mf) \ $(wildcard *.jj) \ $(wildcard *.xsd *.xml *.spp) \ $(wildcard *.txt *.tex *.html *.htm *.css README) \ $(wildcard *.properties *.conf *.xcf *.gif *.jpg *.png *.bmp *.ico) \ $(wildcard *.lws *.lwo *.wrl) \ $(wildcard *.sh *.csh *.bat *.iss) \ $(wildcard *.phtml *.m4) \ $(wildcard *.policy) \ package.html makefile.package ifdef ROOT_PACKAGE SOURCE += makefile makefile.project endif # compile-time flags JAVAC_FLAGS += $(DEPRECATION_FLAG) $(CLASSPATH_FLAG) -source $(SOURCE_VERSION) -target $(TARGET_VERSION) $(JAVAC_OPTIONS) # runtime flags RUN_JAVA_FLAGS += $(CLASSPATH_FLAG) $(MEMORY_FLAG) $(WORKAROUND_FLAGS) $(JAVA_OPTIONS) -ea # javadoc flags JAVADOC_FLAGS += $(CLASSPATH_FLAG) -source $(JAVADOC_SOURCE_VERSION) -private -use -author -doctitle $(APPNAME) `if [ -e overview.html ]; then echo -overview overview.html; else echo ""; fi` # subpackage makefiles SUBPACKAGE_MAKEFILES = $(addsuffix /makefile,$(PACKAGE_SUBDIRS)) # HTML stuff .SUFFIXES: .m4 .phtml .html WWWROOT = $(HOME)/www html-m4 = m4 -P "-DBUILD_DATE=`date`" "-DYEAR=`date +%Y`" "-I$(WWWROOT)/include" $(1) > $(2) html-cpp = gcc -E -P -traditional "-DBUILD_DATE=`date`" "-DYEAR=`date +%Y`" "-I$(WWWROOT)/include" - < $(1) > $(2) # function to generate a javadoc command line # # javadoc will be deposited in $(JAVADOC_DIR) # # first arg is list of base packages. Javadoc will be built for all # subpackages of the base packages. javadoc = $(JAVADOC) $(JAVADOC_FLAGS) -d $(JAVADOC_DIR) $(foreach P,$(1), -subpackages $(P)) # function to make a target recursively # first argument is target to make # second argument is "true" to continue on fail, "false" to stop on fail recursively-make = $(foreach DIR,$(PACKAGE_SUBDIRS),[ ! -d $(DIR) ] || pushd $(DIR) > /dev/null && ( $(MAKE) $(1) || $(2) ) && popd > /dev/null && ) true # function to make something from $(PROJECT_HOME) make-from-project-home = \ @echo making $(1) from $(PROJECT_HOME); \ $(CD) $(PROJECT_HOME) && $(MAKE) $(1) # function to convert a package name to a path package-to-path = $(subst .,/,$(1)) # function to extract the package part of a full class name (not including # the trailing .class) package-part = \ $(basename $(1)) # function to extract the class part of a full class name (not including the # trailing .class) class-part = \ $(subst .,,$(suffix $(1))) # use this target as a prereq to force another target .PHONY: FORCE FORCE: # pattern rules # initialize a new class file %.java-template: $(JAVA_TEMPLATE) if [ ! -f ./$(basename $@).java ] || [ ! -s ./$(basename $@).java ]; then $(call template-m4-java,$@); else echo ./$(basename $@).java exists and is non-empty, not overwriting; fi .PHONY: java-templates java-templates: $(foreach F,$(shell find . -maxdepth 1 -size 0 -name "*.java"),$(call template-m4-java,$F); ) # initialize a new Exception class file %.java-exception-template: $(EXCEPTION_TEMPLATE) if [ ! -f ./$(basename $@).java ]; then cp $(EXCEPTION_TEMPLATE) ./$(basename $@).java; else echo ./$(basename $@).java exists, not overwriting; fi # initialize a new package.html file .PHONY: package.html-template package.html-template: $(PACKAGE_TEMPLATE) if [ ! -f package.html ]; then cp $(PACKAGE_TEMPLATE) ./package.html; else echo ./package.html exists, not overwriting; fi # initialize a new makefile.package file .PHONY: makefile.package-template makefile.package-template: $(MAKEFILE_PACKAGE_TEMPLATE) if [ ! -f makefile.package ]; then cp $(MAKEFILE_PACKAGE_TEMPLATE) ./makefile.package; else echo ./makefile.package exists, not overwriting; fi # make html from m4 %.html: %.m4 $(call html-m4,$<,$@) if [ -x "$(WWWIMAGESIZE)" ]; then $(WWWIMAGESIZE) -MakeBackup no $@; fi # make html from phtml by sending it through the C pre-processor %.html: %.phtml $(call html-cpp,$<,$@) if [ -x "$(WWWIMAGESIZE)" ]; then $(WWWIMAGESIZE) -MakeBackup no $@; fi # build a .class file from a .java file ifeq ($(findstring CYGWIN,$(SYSTEM)),CYGWIN) #fix paths on cygwin. ARGH... ifdef USING_COMPILE_SERVER %.class: %.java $(JAVAC) $(JAVAC_FLAGS) "`cygpath -w "$(addprefix $(shell pwd)/,$<)"`" else %.class: %.java $(JAVAC) $(JAVAC_FLAGS) $< endif else # not on cygwin. Phew. %.class: %.java $(JAVAC) $(JAVAC_FLAGS) $< endif # build Java source files from a .jj grammar file %.java: %.jj $(JAVACC) $< # run a class in a specific package $(PROJECT).%.run: $(if BUILD_BEFORE_RUN,$(PROJECT).%.class,) $(JAVA) $(RUN_JAVA_FLAGS) $(basename $@) # run a class in the current package with a main() function directly %.run: $(if BUILD_BEFORE_RUN,%.class,) $(JAVA) $(RUN_JAVA_FLAGS) $(PACKAGE).$(basename $@) # run a class in appletviewer (specify html filename without path or extension) %.appletviewer: $(JDK_HOME)/bin/appletviewer $(basename $@).html # build a class in a specific package $(PROJECT).%.class: $(CD) $(PROJECT_HOME)/../$(call package-to-path,$(call package-part,$(basename $@))) && $(MAKE) $(call class-part,$(basename $@)).class # build a specific package $(PROJECT).%.package-make: @echo making package $@ $(CD) $(PROJECT_HOME)/../$(call package-to-path,$(basename $@)) && $(MAKE) package # recursive build of the base package is a project build # note the semicolon which makes this an "empty command"!! # without it the %.recursive pattern would get called after this runs # resulting in an infinite loop!! $(PROJECT).package-make.recursive: project ; # build a specific package and all descendant packages $(PROJECT).%.package-make.recursive: @echo making package $@ and all descendant packages $(CD) $(PROJECT_HOME)/../$(call package-to-path,$(basename $(basename $@))) && $(MAKE) package.recursive # trick make into building the base package when asked # if we don't do this then a spurious implicit rule gets invoked because the # base package has no .suffix $(PROJECT).package-make: @echo making base package $(CD) $(PROJECT_HOME) && $(MAKE) package # recursively make something %.recursive: # @echo recursively making $(basename $@) $(MAKE) $(basename $@) $(call recursively-make,$@,true) # fun targets .PHONY: love love: @echo not war .PHONY: pull-plug pull-plug: @echo My mind is going. I can FEEL it. .PHONY: open-the-pod-bay-doors-hal open-the-pod-bay-doors-hal: @echo I\'m sorry `finger \`whoami\` | sed -e '2,$$d' -e '1s/.*:.*:[ ]*\([^ ]*\).*/\1/'`, I\'m afraid I can\'t do that. # global targets # utility targets .PHONY: show-exclude-source show-exclude-source: @echo $(EXCLUDE_SOURCE) .PHONY: show-exclude-subdirs show-exclude-subdirs: @echo $(EXCLUDE_SUBDIRS) .PHONY: show-package show-package: @echo $(PACKAGE) .PHONY: show-project-home show-project-home: @echo $(PROJECT_HOME) .PHONY: show-classpath show-classpath: @echo $(MAKE_CLASSPATH) .PHONY: show-jdk-home show-jdk-home: @echo $(JDK_HOME) .PHONY: show-jdk-ext show-jdk-ext: @echo $(JDK_EXT) .PHONY: show-tools-ext show-tools-ext: @echo $(TOOLS_EXT) .PHONY: show-ext-dir show-ext-dir: @echo $(EXT_DIR) .PHONY: show-java show-java: @echo $(JAVA) .PHONY: show-run-java-flags show-run-java-flags: @echo $(RUN_JAVA_FLAGS) .PHONY: show-run-java-with-flags show-run-java-with-flags: @echo $(JAVA) $(RUN_JAVA_FLAGS) .PHONY: show-run-java-with-flags-and-package show-run-java-with-flags-and-package: @echo $(JAVA) $(RUN_JAVA_FLAGS) $(PACKAGE) .PHONY: show-bin show-bin: @echo $(BIN) .PHONY: show-cs-bin show-cs-bin: @echo $(CS_BIN) .PHONY: show-scripts show-scripts: @echo $(SCRIPTS) .PHONY: show-cs-scripts show-cs-scripts: @echo $(CS_SCRIPTS) .PHONY: show-settings show-settings: @echo Make settings: @echo APPNAME: $(APPNAME) @echo BASE_PACKAGE: $(BASE_PACKAGE) @echo ARCH: $(ARCH) @echo TOOLS_HOME: $(TOOLS_HOME) @echo SCRIPTS: $(SCRIPTS) @echo CS_SCRIPTS: $(CS_SCRIPTS) @echo CS_BIN: $(CS_BIN) @echo CS_ENSURE: $(CS_ENSURE) @echo CS_SUBMIT: $(CS_SUBMIT) @echo JDK_BASE: $(JDK_BASE) @echo JDK_HOME: $(JDK_HOME) @echo JDK_EXT: $(JDK_EXT) @echo TOOLS_EXT: $(TOOLS_EXT) @echo EXT_DIR: $(EXT_DIR) @echo JDK_VERSION: $(JDK_VERSION) @echo SOURCE_VERSION: $(SOURCE_VERSION) @echo TARGET_VERSION: $(TARGET_VERSION) @echo JAVAC: $(JAVAC) @echo JAVA: $(JAVA) @echo JAVADOC: $(JAVADOC) @echo JAVACC: $(JAVACC) @echo JAR: $(JAR) @echo NO_COMPILE_SERVER: "$(NO_COMPILE_SERVER)" @echo USING_COMPILE_SERVER: "$(USING_COMPILE_SERVER)" @echo SHELL: $(SHELL) @echo CD: $(CD) @echo PROJECT: $(PROJECT) @echo PROJECT_HOME: $(PROJECT_HOME) ifdef ROOT_PACKAGE @echo this is the root package else @echo this is not the root package endif @echo PACKAGE: $(PACKAGE) @echo PACKAGE_PATH: '$(PACKAGE_PATH)' @echo PACKAGE_NAME: $(PACKAGE_NAME) @echo EXCLUDE_SUBDIRS: $(EXCLUDE_SUBDIRS) @echo PACKAGE_SUBDIRS: $(PACKAGE_SUBDIRS) @echo EXCLUDE_SOURCE: $(EXCLUDE_SOURCE) @echo PACKAGE_SOURCE: $(PACKAGE_SOURCE) @echo PACKAGE_HTML_SOURCE: $(PACKAGE_HTML_SOURCE) @echo SOURCE: $(SOURCE) @echo SUBPROJECT_PACKAGES: $(SUBPROJECT_PACKAGES) @echo JAVAC_FLAGS: '$(JAVAC_FLAGS)' @echo JAVADOC_FLAGS: '$(JAVADOC_FLAGS)' @echo JAVADOC_DIR: $(JAVADOC_DIR) @echo JAR_DIR: $(JAR_DIR) @echo JAR_MF: $(JAR_MF) @echo JARKEY: $(JARKEY) @echo JAR_CRT: $(JAR_CRT) @echo EXT_JARS: $(EXT_JARS) @echo MAKE_CLASSPATH: '$(MAKE_CLASSPATH)' @echo SUBPACKAGE_MAKEFILES: $(SUBPACKAGE_MAKEFILES) @echo PUBLISH_DEST: $(PUBLISH_DEST) # package targets # make the current package .PHONY: package package: $(EXTRA_PACKAGE_DEPS) $(if $(NO_SOURCE_GEN),,package-source-gen) package-javacc-make $(addsuffix .class,$(basename $(PACKAGE_SOURCE))) $(addsuffix .html,$(basename $(PACKAGE_HTML_SOURCE))) $(EXTRA_PACKAGE_CMDS) # make javacc in the current package .PHONY: packge-javacc-make package-javacc-make: $(addsuffix .class,$(basename $(wildcard *.jj))) # make the makefile in the current package ifndef ROOT_PACKAGE makefile: $(PROJECT_HOME)/makefile @$(CD) .. && $(MAKE) $(PACKAGE_NAME)/makefile else makefile: FORCE endif .PHONY: clean clean: $(EXTRA_CLEAN_DEPS) @echo removing all .class files in this package $(RM) *.class .PHONY: c-clean c-clean: @echo removing all .o files in this package $(RM) *.o .PHONY: javacc-clean javacc-clean: @echo removing javacc-generated files $(RM) `ls *.java | xargs grep -l "Generated By:JavaCC"` .PHONY: rmiwrap-clean rmiwrap-clean: @echo removing RMIWrap-generated files $(RM) `ls *.java | xargs grep -l "generated by RMIWrap"` .PHONY: html-clean html-clean: @echo removing all generated html $(RM) $(addsuffix .html,$(basename $(PACKAGE_HTML_SOURCE))) .PHONY: jar-clean jar-clean: $(RM) $(JARFILE) $(JARFILE_LITE) $(JARFILE_XLITE) .PHONY: javadoc-clean javadoc-clean: $(RM) -r $(JAVADOC_DIR) .PHONY: realclean realclean: $(EXTRA_REALCLEAN_DEPS) clean rmiwrap-clean javacc-clean html-clean jar-clean javadoc-clean if [ -f core ]; then $(RM) core; fi .PHONY: package-javacc-gen package-javacc-gen: $(addsuffix .java,$(basename $(wildcard *.jj))) .PHONY: package-source-gen package-source-gen: package-javacc-gen # project targets .PHONY: project-announce project-announce: @echo making project .PHONY: project project: project-announce $(if $(NO_SOURCE_GEN),,project-source-gen) $(call make-from-project-home,package.recursive) .PHONY: project-javacc-gen project-javacc-gen: makefiles $(call make-from-project-home,package-javacc-gen.recursive) .PHONY: project-source-gen project-source-gen: makefiles $(call make-from-project-home,package-source-gen.recursive) .PHONY: project-javadoc project-javadoc: $(call make-from-project-home,subproject-javadoc) .PHONY: subproject-javadoc subproject-javadoc: if [ "$(SUBPROJECT_PACKAGES)" ]; then $(call javadoc,$(SUBPROJECT_PACKAGES)); fi .PHONY: project-clean project-clean: $(call make-from-project-home,clean.recursive) .PHONY: project-realclean project-realclean: $(call make-from-project-home,realclean.recursive) $(SUBPACKAGE_MAKEFILES): makefile @if [ -e $@ ] && [ `grep -c super-ninja $@ 2> /dev/null ` -eq 0 ]; \ then echo "$@ exists but is not super-ninja, skipping"; \ else echo "(re)making $@" && \ $(RM) $@ && \ sed \ -e 's|^$(WS)PROJECT_HOME$(WS)=$(WS)\(.*\)$(WS)|PROJECT_HOME = ../\1|' \ -e 's/^$(WS)PACKAGE$(WS)=$(WS)\(.*\)$(WS)/PACKAGE = \1.$(subst /,,$(dir $@))/' \ -e 's/^$(WS)if-root-package$(WS)=.*/if-root-package = $$(2)/' \ makefile > $@; fi .PHONY: makefiles makefiles: $(SUBPACKAGE_MAKEFILES) @echo making makefiles @$(call recursively-make,makefiles,true) # make the jar key .PHONY: keygen keygen: $(JDK_HOME)/bin/keytool -genkey -keyalg rsa -alias $(JARKEY) $(JDK_HOME)/bin/keytool -export -alias $(JARKEY) -file $(JAR_CRT) # make the jar # # the jar is built containing all rsync-able files in all # $(SUBPROJECT_PACKAGES), the subproject javadoc, and the makefile from the # base package. Subproject packages ending in "." are copied non-recursively, # else they are copied recursively. # # empty dirs will not be included in the jar # # all $(EXT_JARS), if any, are folded into the jarfile # # if $(JAR_MF) exists it is used as the jar manifest # # if $(JAR_CRT) exist the jar is signed with $(JARKEY) .PHONY: jar jar: $(call make-jar,true,$(EXT_JARS),$(JARFILE),$(JARFILE_EXTS),$(JAR_EXTRA),$(SUBPROJECT_PACKAGES)) # make the lite jar # # same as the "jar" target except uses LITE_SUBPROJECT_PACKAGES, EXT_JARS_LITE, # JARFILE_LITE_EXTS, JAR_LITE_EXTRA, and never includes the javadoc tree jar-lite: $(call make-jar,false,$(EXT_JARS_LITE),$(JARFILE_LITE),$(JARFILE_LITE_EXTS),$(JAR_LITE_EXTRA),$(LITE_SUBPROJECT_PACKAGES)) # make the xlite jar # # same as the "jar-lite" target except uses XLITE_SUBPROJECT_PACKAGES, # EXT_JARS_XLITE, JARFILE_XLITE_EXTS, and JAR_XLITE_EXTRA .PHONY: jar-xlite jar-xlite: $(call make-jar,false,$(EXT_JARS_XLITE),$(JARFILE_XLITE),$(JARFILE_XLITE_EXTS),$(JAR_XLITE_EXTRA),$(XLITE_SUBPROJECT_PACKAGES)) # publish to PUBLISH_DEST # # rsyncs $(JARFILE) (and $(JARFILE_LITE), and $(JARFILE_XLITE), if any) # there AND rsync's $(JARFILE_PUBLISH_UNPACK)'s contents there .PHONY: publish ifdef PUBLISH_DEST publish: @echo publishing to $(PUBLISH_DEST) if [ $(JARFILE_PUBLISH_UNPACK) ]; then \ mkdir .$(JARFILE_PUBLISH_UNPACK)-unpack.tmp; \ cd .$(JARFILE_PUBLISH_UNPACK)-unpack.tmp && $(JAR) xvf ../$(JARFILE_PUBLISH_UNPACK) && $(call rsync,*,$(PUBLISH_DEST)); \ cd .. && rm -rf .$(JARFILE_PUBLISH_UNPACK)-unpack.tmp; \ fi if [ $(JARFILE) -a -f $(JARFILE) ]; then $(call rsync,$(JARFILE),$(PUBLISH_DEST)); fi if [ $(JARFILE_LITE) -a -f $(JARFILE_LITE) ]; then $(call rsync,$(JARFILE_LITE),$(PUBLISH_DEST)); fi if [ $(JARFILE_XLITE) -a -f $(JARFILE_XLITE) ]; then $(call rsync,$(JARFILE_XLITE),$(PUBLISH_DEST)); fi $(EXTRA_PUBLISH_CMDS) else publish: $(JARFILE) @echo PUBLISH_DEST not set $(EXTRA_PUBLISH_CMDS) endif # publish to PUBLISH_DEST # # rsyncs $(JARFILE_LITE), there .PHONY: publish-lite ifdef PUBLISH_DEST publish-lite: $(JARFILE_LITE) @echo publishing to $(PUBLISH_DEST) $(call rsync,$(JARFILE_LITE),$(PUBLISH_DEST)) $(EXTRA_PUBLISH_CMDS) else publish-lite: $(JARFILE_LITE) @echo PUBLISH_DEST not set $(EXTRA_PUBLISH_CMDS) endif visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/model/000077500000000000000000000000001147500217100236635ustar00rootroot00000000000000visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/model/HalfEdge.java000066400000000000000000000047751147500217100262020ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.model; import visolate.simulator.*; public class HalfEdge { private static final String cvsid = "$Id: HalfEdge.java,v 1.1.1.1 2004/06/24 05:46:01 vona Exp $"; public HalfEdge(Stroke stroke, boolean reverse) { this.stroke = stroke; this.reverse = reverse; if (!reverse) (stroke.getStart()).addOutgoingHalfEdge(this); else (stroke.getEnd()).addOutgoingHalfEdge(this); } public void setNext(HalfEdge next) { this.next = next; } public HalfEdge getNext() { return next; } public Stroke getStroke() { return stroke; } public Vertex getStart() { if (!reverse) return stroke.getStart(); else return stroke.getEnd(); } public Vertex getEnd() { if (!reverse) return stroke.getEnd(); else return stroke.getStart(); } public double getStartDirection() { if (!reverse) return stroke.getStartForwardDirection(); else return stroke.getEndReverseDirection(); } public double getEndDirection() { if (!reverse) return stroke.getEndForwardDirection(); else return stroke.getStartReverseDirection(); } public double angleTo(HalfEdge he) { double myDir = getEndDirection(); double hisDir = he.getStartDirection(); double himToMe; if (myDir >= hisDir) himToMe = myDir - hisDir; else himToMe = 2*Math.PI - (hisDir - myDir); if (himToMe <= Math.PI) return Math.PI - himToMe; else return 2*Math.PI - (himToMe - Math.PI); } private Stroke stroke; private boolean reverse; private HalfEdge next; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/model/Model.java000066400000000000000000000674501147500217100256020ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.model; import visolate.simulator.*; import visolate.simulator.Action; import visolate.simulator.Stroke; import visolate.misc.*; import visolate.*; import javax.media.j3d.*; import javax.vecmath.*; import com.sun.j3d.utils.picking.*; import com.sun.j3d.utils.geometry.GeometryInfo; import java.util.*; import java.util.List; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.text.*; public class Model extends JPanel { /** * */ private static final long serialVersionUID = 214293510166172826L; private static final String cvsid = "$Id: Model.java,v 1.12 2006/08/29 04:02:32 vona Exp $"; public static final int NUM_CIRCLE_SEGMENTS = 256; public static final Vector3d PICK_Z = new Vector3d(0.0, 0.0, -1.0); public static final boolean DEF_OUTLINE = true; public static final boolean DEF_OUTLINE_CIRCULAR = false; public static final boolean DEF_OUTLINE_WHITE = true; public static final boolean DEF_LINE = false; public static final boolean DEF_VORONOI = false; public static final boolean DEF_FLAT = true; public static final boolean DEF_TRANSLUCENT = false; public static final boolean DEF_PATHS = true; public static final boolean DEF_GCODE = false; public static final float OUTLINE_PAD = 100.0f; public static final double MIN_TOOL_DIAMETER = 0.0; public static final double MAX_TOOL_DIAMETER = 1.0; public static final double MIN_VORONOI_LIMIT = 0.0; public static final double MAX_VORONOI_LIMIT = 100.0; public static final double DEF_VORONOI_LIMIT = 1.0; public Model(Visolate visolate) { this.visolate = visolate; setBackground(Color.WHITE); Box geometryBox = Box.createHorizontalBox(); // geometryBox.add(Box.createHorizontalGlue()); Box borderBox = Box.createHorizontalBox(); borderBox.setAlignmentY(0.0f); borderButton = new JCheckBox("border"); borderButton.setBackground(Color.WHITE); borderButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { boolean borderOn = borderButton.isSelected(); circularButton.setEnabled(borderOn); whiteButton.setEnabled(borderOn); enableBorderGeometry(borderOn); } }); borderButton.setSelected(DEF_OUTLINE); borderBox.add(borderButton); circularButton = new JCheckBox("c"); circularButton.setBackground(Color.WHITE); circularButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { rebuildGeometry(); } }); circularButton.setSelected(DEF_OUTLINE_CIRCULAR); borderBox.add(circularButton); whiteButton = new JCheckBox("w"); whiteButton.setBackground(Color.WHITE); whiteButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { rebuildGeometry(); } }); whiteButton.setSelected(DEF_OUTLINE_WHITE); borderBox.add(whiteButton); geometryBox.add(borderBox); geometryBox.add(Box.createHorizontalGlue()); enableBorderGeometry(DEF_OUTLINE); lineButton = new JCheckBox("line"); lineButton.setBackground(Color.WHITE); lineButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { enableLineGeometry(lineButton.isSelected()); } }); lineButton.setSelected(DEF_LINE); enableLineGeometry(DEF_LINE); lineButton.setAlignmentY(0.0f); geometryBox.add(lineButton); voronoiButton = new JCheckBox("voronoi"); voronoiButton.setBackground(Color.WHITE); voronoiButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { enableVoronoiGeometry(voronoiButton.isSelected()); } }); voronoiButton.setSelected(DEF_VORONOI); enableVoronoiGeometry(DEF_VORONOI); voronoiButton.setAlignmentY(0.0f); geometryBox.add(voronoiButton); // geometryBox.add(Box.createHorizontalStrut(16)); geometryBox.add(Box.createHorizontalGlue()); translucentButton = new JCheckBox("xlucent"); flatButton = new JCheckBox("flt"); flatButton.setBackground(Color.WHITE); flatButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { enableFlatGeometry(flatButton.isSelected()); } }); flatButton.setSelected(DEF_FLAT); enableFlatGeometry(DEF_FLAT); flatButton.setAlignmentY(0.0f); geometryBox.add(flatButton); translucentButton.setBackground(Color.WHITE); translucentButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setTranslucent2D(translucentButton.isSelected()); } }); translucentButton.setSelected(DEF_TRANSLUCENT); setTranslucent2D(DEF_TRANSLUCENT); translucentButton.setAlignmentY(0.0f); geometryBox.add(translucentButton); // geometryBox.add(Box.createHorizontalStrut(16)); geometryBox.add(Box.createHorizontalGlue()); pathsButton = new JCheckBox("path"); pathsButton.setBackground(Color.WHITE); pathsButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { enablePathsGeometry(pathsButton.isSelected()); } }); pathsButton.setSelected(DEF_PATHS); enablePathsGeometry(DEF_PATHS); pathsButton.setAlignmentY(0.0f); geometryBox.add(pathsButton); gCodeButton = new JCheckBox("ngc"); gCodeButton.setBackground(Color.WHITE); gCodeButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { enableGCodeGeometry(gCodeButton.isSelected()); } }); gCodeButton.setSelected(DEF_GCODE); enableGCodeGeometry(DEF_GCODE); gCodeButton.setAlignmentY(0.0f); geometryBox.add(gCodeButton); // geometryBox.add(Box.createHorizontalGlue()); Box settingsBox = Box.createHorizontalBox(); settingsBox.add(new JLabel("flip")); flipXButton = new JCheckBox("X"); flipXButton.setBackground(Color.WHITE); flipXButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setFlipX(flipXButton.isSelected()); } }); flipXButton.setSelected(false); settingsBox.add(flipXButton); flipYButton = new JCheckBox("Y"); flipYButton.setBackground(Color.WHITE); flipYButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setFlipY(flipYButton.isSelected()); } }); flipYButton.setSelected(false); settingsBox.add(flipYButton); settingsBox.add(Box.createHorizontalGlue()); offsetLabel = new JLabel("tool dia [in]: "); settingsBox.add(offsetLabel); offsetField = new JTextField() { private static final long serialVersionUID = 1223546354547661586L; { columnWidth = getColumnWidth(); } }; offsetField.setHorizontalAlignment(JTextField.RIGHT); Dimension d = offsetField.getPreferredSize(); offsetField.setMaximumSize(new Dimension(columnWidth*6, d.height)); offsetField.setPreferredSize(new Dimension(columnWidth*6, d.height)); offsetField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { updateOffset(); } }); // offsetField.addFocusListener(new FocusAdapter() { // public void focusLost(FocusEvent e) { updateOffset(); } }); settingsBox.add(offsetField); settingsBox.add(Box.createHorizontalGlue()); limitLabel = new JLabel("voronoi lim [in]: "); settingsBox.add(limitLabel); limitField = new JTextField(); limitField.setHorizontalAlignment(JTextField.RIGHT); d = limitField.getPreferredSize(); limitField.setMaximumSize(new Dimension(columnWidth*6, d.height)); limitField.setPreferredSize(new Dimension(columnWidth*6, d.height)); limitField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { updateLimit(); } }); // limitField.addFocusListener(new FocusAdapter() { // public void focusLost(FocusEvent e) { updateLimit(); } }); settingsBox.add(limitField); autoLimitButton = new JCheckBox("auto"); autoLimitButton.setBackground(Color.WHITE); autoLimitButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { updateLimit(); } }); autoLimitButton.setSelected(false); settingsBox.add(autoLimitButton); Box box = Box.createVerticalBox(); box.setBorder(BorderFactory.createTitledBorder("Geometry")); box.add(geometryBox); box.add(settingsBox); setLayout(new BorderLayout()); add(box, "Center"); } public void rebuild() { sceneBG = null; bounds = null; nets.clear(); colorToNet.clear(); clearPaths(); Simulator simulator = visolate.getSimulator(); System.out.println("computing inch coords..."); simulator.computeInchCoordinates(); System.out.println("making nets..."); makeNets(simulator.getActions()); System.out.println(nets.size() + " nets"); System.out.println("making half edge loops..."); int num = 0; for (Net net : nets) { num += net.makeHalfEdgeLoops(); } System.out.println(num + " loops"); for (Net net : nets) { int c = color3bToInt(net.getColor()); // System.out.println(net.getColor() + " -> " + colorToString(c)); colorToNet.put(new Integer(c), net); } rebuildGeometry(); } private void rebuildGeometry() { for (Net net : nets) { net.enableLineGeometry(lineGeometry); net.enableVoronoiGeometry(voronoiGeometry); net.enableFlatGeometry(flatGeometry); net.setTranslucent2D(translucent2D); net.setZCeiling(voronoiLimit); net.setOffset(toolDiameter/2.0); } bounds = null; if (borderBG != null) { boolean borderGeometryWas = borderGeometry; enableBorderGeometry(false); borderBG.removeAllChildren(); borderBG.addChild(makeBorder()); enableBorderGeometry(borderGeometryWas); } enablePathsGeometry(pathsGeometry); enableGCodeGeometry(gCodeGeometry); limitField.setText(numberFormat.format(voronoiLimit)); offsetField.setText(numberFormat.format(toolDiameter)); Display display = visolate.getDisplay(); if (display != null) display.reset(); } public double getToolDiameter() { return toolDiameter; } public void setToolDiameter(double toolDiameter) { if (toolDiameter == this.toolDiameter) return; this.toolDiameter = toolDiameter; rebuildGeometry(); } public void deleteNet(final Net net) { if (nets.remove(net)) { visolate.addFrameTask(new Runnable() { public void run() { net.detach(); } }); rebuildGeometry(); } } public void undeleteNet(final Net net) { if (nets.add(net)) { visolate.addFrameTask(new Runnable() { public void run() { if (sceneBG != null) sceneBG.addChild(net.getSceneGraph()); } }); rebuildGeometry(); } } private int makeNets(Collection actions) { Set strokes = new LinkedHashSet(); Set flashes = new LinkedHashSet(); Set vertices = new LinkedHashSet(); for (Iterator it = actions.iterator(); it.hasNext(); ) { visolate.simulator.Action action = (visolate.simulator.Action) it.next(); if (action instanceof visolate.simulator.Stroke) { strokes.add((Stroke) action); vertices.add(((visolate.simulator.Stroke) action).getStart()); vertices.add(((visolate.simulator.Stroke) action).getEnd()); } else if (action instanceof Flash) { flashes.add(action); vertices.add(((Flash) action).getLocation()); } } while (!strokes.isEmpty()) { Net net = new Net(visolate); List neighbors = new LinkedList(); neighbors.add((Stroke) (strokes.iterator()).next()); while (!neighbors.isEmpty()) { visolate.simulator.Stroke stroke = neighbors.remove(0); strokes.remove(stroke); net.addStroke(stroke); Vertex start = stroke.getStart(); Vertex end = stroke.getEnd(); if (vertices.contains(start)) { addFlashesAtVertex(net, start, flashes); collectNeighborStrokes(neighbors, start, strokes); vertices.remove(start); } if (vertices.contains(end)) { addFlashesAtVertex(net, end, flashes); collectNeighborStrokes(neighbors, end, strokes); vertices.remove(end); } } nets.add(net); } //some nets may consist entirely of one or more flashes at a single loc while (!flashes.isEmpty()) { Net net = new Net(visolate); Flash flash = (Flash) (flashes.iterator()).next(); addFlashesAtVertex(net, flash.getLocation(), flashes); nets.add(net); } // int i = 0; int n = nets.size(); for (Net net : nets) { net.setColor(visolate.getDisplay().getRandomColor()); } return n; } private void collectNeighborStrokes(final Collection neighbors, final Vertex vertex, final Set strokes) { Collection actions = vertex.getIncidentActions(); for (Action action : actions) { if ((action instanceof visolate.simulator.Stroke) && strokes.remove(action)) { neighbors.add((Stroke) action); } } } private void addFlashesAtVertex(Net net, Vertex vertex, Set flashes) { Collection actions = vertex.getIncidentActions(); for (Iterator it = actions.iterator(); it.hasNext(); ) { Action action = it.next(); if ((action instanceof Flash) && flashes.remove(action)) net.addPad((Flash) action); } } public int color3bToInt(Color3b c) { int r = ((int) c.x) & 0xff; int g = ((int) c.y) & 0xff; int b = ((int) c.z) & 0xff; int i = b; i |= g << 8; i |= r << 16; // System.out.println(c + " -> (" + r + ", " + g + ", " + b + ") -> " + // colorToString(i)); return i; } public Set getNetColors() { return colorToNet.keySet(); } public Net getNet(int color) { return (Net) colorToNet.get(new Integer(color)); } public Collection getNets() { return nets; } public Collection getNetsAtPoint(double x, double y, double radius, Collection nets) { PickTool pickTool = new PickTool(getSceneGraph()); pickTool.setMode(PickTool.BOUNDS); pickTool.setShapeCylinderRay(new Point3d(x, y, Display.EYE.z), PICK_Z, radius); PickResult[] result = pickTool.pickAll(); if (result == null) { return nets; } for (int i = 0; i < result.length; i++) { result[i].setFirstIntersectOnly(true); if (result[i].numIntersections() > 0) { Net net = (Net) (result[i]. getSceneGraphPath(). getObject(). getUserData()); if (net != null) { nets.add(net); } } } return nets; } public BranchGroup getSceneGraph() { if (sceneBG == null) { modelBG = new BranchGroup(); modelBG.setCapability(BranchGroup.ALLOW_DETACH); modelBG.setCapability(BranchGroup.ALLOW_CHILDREN_READ); modelBG.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE); modelBG.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND); flipTG = new TransformGroup(); flipTG.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); flipTG.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); flipT3D = new Transform3D(); sceneBG = new BranchGroup(); sceneBG.setCapability(BranchGroup.ALLOW_DETACH); sceneBG.setCapability(BranchGroup.ALLOW_CHILDREN_READ); sceneBG.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE); sceneBG.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND); pathsBG = new BranchGroup(); pathsBG.setCapability(BranchGroup.ALLOW_DETACH); pathsBG.setCapability(BranchGroup.ALLOW_CHILDREN_READ); pathsBG.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE); pathsBG.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND); gCodeBG = new BranchGroup(); gCodeBG.setCapability(BranchGroup.ALLOW_DETACH); gCodeBG.setCapability(BranchGroup.ALLOW_CHILDREN_READ); gCodeBG.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE); gCodeBG.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND); borderBG = new BranchGroup(); borderBG.setCapability(BranchGroup.ALLOW_DETACH); borderBG.setCapability(BranchGroup.ALLOW_CHILDREN_READ); borderBG.setCapability(BranchGroup.ALLOW_CHILDREN_WRITE); borderBG.setCapability(BranchGroup.ALLOW_CHILDREN_EXTEND); borderBG.addChild(makeBorder()); if (pathsGeometry) modelBG.addChild(pathsBG); if (gCodeGeometry) modelBG.addChild(gCodeBG); if (borderGeometry) sceneBG.addChild(borderBG); for (Net net : nets) { sceneBG.addChild(net.getSceneGraph()); } flipTG.addChild(sceneBG); modelBG.addChild(flipTG); } return modelBG; } private BranchGroup makeBorder() { Rect bounds = getBoardBounds(); boolean circular = circularButton.isSelected(); int numInnerVertices = (circular) ? NUM_CIRCLE_SEGMENTS : 4; float[] coords = new float[4*3 + numInnerVertices*3]; int i = 0; float z = Net.OUTLINE_Z; //outer rect, ccw coords[i++] = (float) (bounds.x + bounds.width + OUTLINE_PAD); coords[i++] = (float) (bounds.y + bounds.height + OUTLINE_PAD); coords[i++] = z; coords[i++] = (float) (bounds.x - OUTLINE_PAD); coords[i++] = (float) (bounds.y + bounds.height + OUTLINE_PAD); coords[i++] = z; coords[i++] = (float) (bounds.x - OUTLINE_PAD); coords[i++] = (float) (bounds.y - OUTLINE_PAD); coords[i++] = z; coords[i++] = (float) (bounds.x + bounds.width + OUTLINE_PAD); coords[i++] = (float) (bounds.y - OUTLINE_PAD); coords[i++] = z; //inner rect, cw if (circular) { float cx = (float) (bounds.x + bounds.width/2.0); float cy = (float) (bounds.y + bounds.height/2.0); float r = (float) (Math.max(bounds.width, bounds.height)/2.0); double t = 0.0; double segment = (Math.PI*2.0)/((double) NUM_CIRCLE_SEGMENTS); for (int j = 0; j < NUM_CIRCLE_SEGMENTS; j++) { coords[i++] = cx + (float) (r*Math.cos(t)); coords[i++] = cy + (float) (r*Math.sin(t)); coords[i++] = z; t += segment; } } else { coords[i++] = (float) (bounds.x + bounds.width); coords[i++] = (float) (bounds.y + bounds.height); coords[i++] = z; coords[i++] = (float) (bounds.x + bounds.width); coords[i++] = (float) (bounds.y); coords[i++] = z; coords[i++] = (float) (bounds.x); coords[i++] = (float) (bounds.y); coords[i++] = z; coords[i++] = (float) (bounds.x); coords[i++] = (float) (bounds.y + bounds.height); coords[i++] = z; } GeometryInfo gi = new GeometryInfo(GeometryInfo.POLYGON_ARRAY); gi.setCoordinates(coords); gi.setStripCounts(new int[] {4, numInnerVertices}); gi.setContourCounts(new int[] {2}); Appearance appearance = new Appearance(); ColoringAttributes coloringAttributes = new ColoringAttributes(); if (whiteButton.isSelected()) coloringAttributes.setColor(new Color3f(1.0f, 1.0f, 1.0f)); else coloringAttributes.setColor(Net.toColor3f(visolate.getDisplay(). getRandomColor())); appearance.setColoringAttributes(coloringAttributes); PolygonAttributes polygonAttributes = new PolygonAttributes(); polygonAttributes.setCullFace(PolygonAttributes.CULL_NONE); appearance.setPolygonAttributes(polygonAttributes); Shape3D border = new Shape3D(); border.setPickable(false); border.setGeometry(gi.getGeometryArray()); border.setAppearance(appearance); BranchGroup bg = new BranchGroup(); bg.setCapability(BranchGroup.ALLOW_DETACH); bg.addChild(border); return bg; } public void setPaths(BranchGroup pathBG) { pathsBG.removeAllChildren(); pathsBG.addChild(pathBG); } public void clearPaths() { if (pathsBG != null) pathsBG.removeAllChildren(); } public void setGCode(BranchGroup gCodeBG) { (this.gCodeBG).removeAllChildren(); (this.gCodeBG).addChild(gCodeBG); } public void clearGCode() { if (gCodeBG != null) gCodeBG.removeAllChildren(); } public Rect getModelBounds() { if (bounds == null) { bounds = new Rect(); for (Net net : nets) { bounds.add(net.getBounds()); } } return bounds; } public Rect getBoardBounds() { //TBD check for specified board bounds //TBD offset model bounds return getModelBounds(); } public double getMaxDimension() { Rect bounds = getModelBounds(); if (bounds.width > bounds.height) return bounds.width; else return bounds.height; } public double getDiagonal() { Rect bounds = getModelBounds(); return Math.sqrt(bounds.width*bounds.width + bounds.height*bounds.height); } public void enableBorderGeometry(boolean enable) { if (borderGeometry == enable) return; borderGeometry = enable; if ((borderBG == null) || (sceneBG == null)) return; if (enable) sceneBG.addChild(borderBG); else borderBG.detach(); } public boolean isBorderGeometryEnabled() { return borderGeometry; } public void enableLineGeometry(boolean enable) { if (lineGeometry == enable) return; lineGeometry = enable; for (Net net : nets) { net.enableLineGeometry(enable); } } public void enablePathsGeometry(boolean enable) { if (pathsGeometry == enable) return; pathsGeometry = enable; if ((pathsBG == null) || (sceneBG == null)) return; if (enable) modelBG.addChild(pathsBG); else pathsBG.detach(); } public void enableGCodeGeometry(boolean enable) { if (gCodeGeometry == enable) return; gCodeGeometry = enable; if ((gCodeBG == null) || (sceneBG == null)) return; if (enable) modelBG.addChild(gCodeBG); else gCodeBG.detach(); } public boolean isGCodeGeometryEnabled() { return gCodeGeometry; } public boolean isLineGeometryEnabled() { return lineGeometry; } public void enableVoronoiGeometry(boolean enable) { if (voronoiGeometry == enable) return; voronoiGeometry = enable; for (Net net : nets) { net.enableVoronoiGeometry(enable); } } public boolean isVoronoiGeometryEnabled() { return voronoiGeometry; } public void enableFlatGeometry(boolean enable) { if (flatGeometry == enable) return; flatGeometry = enable; for (Net net : nets) { net.enableFlatGeometry(enable); } translucentButton.setEnabled(enable); } public boolean isFlatGeometryEnabled() { return flatGeometry; } public void setTranslucent2D(boolean enable) { if (translucent2D == enable) return; translucent2D = enable; for (Net net : nets) { net.setTranslucent2D(enable); } if (translucentButton.isSelected() != enable) { translucentButton.setSelected(enable); } } public boolean isTranslucent2D() { return translucent2D; } public void enableControls(boolean enable) { borderButton.setEnabled(enable); circularButton.setEnabled(borderButton.isSelected() && enable); whiteButton.setEnabled(borderButton.isSelected() && enable); lineButton.setEnabled(enable); voronoiButton.setEnabled(enable); flatButton.setEnabled(enable); translucentButton.setEnabled(enable); pathsButton.setEnabled(enable); gCodeButton.setEnabled(enable); offsetLabel.setEnabled(enable); offsetField.setEnabled(enable); limitLabel.setEnabled(!autoLimitButton.isSelected() && enable); limitField.setEnabled(!autoLimitButton.isSelected() && enable); autoLimitButton.setEnabled(enable); } public void dump() { System.out.println("model bounds: " + getModelBounds()); System.out.println("board bounds: " + getBoardBounds()); System.out.println(nets.size() + " nets"); Set> seen = new LinkedHashSet>(); int n = 0; int numSup = 0; for (Net net : nets) { Set superNet = net.getSuperNet(); if (superNet != null) { if (!seen.contains(superNet)) { seen.add(superNet); numSup++; n++; } } else { n++; } net.dump(); } System.out.println(n + " collected nets (" + numSup + " supernets)"); } public void setFlipX(boolean flipX) { if (flipX) { if (flipXScale > 0.0) { flipXScale = -1.0; Rect b = getBoardBounds(); flipXOffset = 2.0*b.x+b.width; updateFlipT3D(); } } else { if (flipXScale < 0.0) { flipXScale = 1.0; flipXOffset = 0.0; updateFlipT3D(); } } flipXButton.setSelected(flipX); } public void setFlipY(boolean flipY) { if (flipY) { if (flipYScale > 0.0) { flipYScale = -1.0; Rect b = getBoardBounds(); flipYOffset = 2.0*b.y+b.height; updateFlipT3D(); } } else { if (flipYScale < 0.0) { flipYScale = 1.0; flipYOffset = 0.0; updateFlipT3D(); } } flipYButton.setSelected(flipY); } private void updateFlipT3D() { flipT3D.set(new double[] {flipXScale, 0.0, 0.0, flipXOffset, 0.0, flipYScale, 0.0, flipYOffset, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0}); flipTG.setTransform(flipT3D); } private void updateOffset() { double diameterWas = toolDiameter; try { double tmp = Double.parseDouble(offsetField.getText()); if ((tmp >= MIN_TOOL_DIAMETER) && (tmp <= MAX_TOOL_DIAMETER)) toolDiameter = tmp; } catch (NumberFormatException e) { } offsetField.setText(numberFormat.format(toolDiameter)); if (diameterWas != toolDiameter) rebuildGeometry(); } private void updateLimit() { double limitWas = voronoiLimit; if (autoLimitButton.isSelected()) { setAutoLimit(); } else { limitLabel.setEnabled(true); limitField.setEnabled(true); } try { double tmp = Double.parseDouble(limitField.getText()); if ((tmp >= MIN_VORONOI_LIMIT) && (tmp <= MAX_VORONOI_LIMIT)) voronoiLimit = tmp; } catch (NumberFormatException e) { } limitField.setText(numberFormat.format(voronoiLimit)); if (limitWas != voronoiLimit) rebuildGeometry(); } private void setAutoLimit() { String tmp = numberFormat.format(getDiagonal()); try { voronoiLimit = Double.parseDouble(tmp); } catch (NumberFormatException e) { } limitField.setText(tmp); autoLimitButton.setSelected(true); limitLabel.setEnabled(false); limitField.setEnabled(false); } public static String colorToString(int c) { int b = c & 0xff; int g = (c & 0xff00) >> 8; int r = (c & 0xff0000) >> 16; return "(" + r + ", " + g + ", " + b + ")"; } private Visolate visolate; private Collection nets = new LinkedHashSet(); private BranchGroup modelBG = null; private TransformGroup flipTG = null; private Transform3D flipT3D = null; private BranchGroup sceneBG = null; private BranchGroup pathsBG = null; private BranchGroup gCodeBG = null; private BranchGroup borderBG = null; private Rect bounds = null; private boolean borderGeometry = false; private boolean lineGeometry = false; private boolean voronoiGeometry = false; private boolean flatGeometry = false; private boolean pathsGeometry = false; private boolean gCodeGeometry = false; private JCheckBox borderButton; private JCheckBox circularButton; private JCheckBox whiteButton; private JCheckBox lineButton; private JCheckBox voronoiButton; private JCheckBox flatButton; private JCheckBox translucentButton; private JCheckBox pathsButton; private JCheckBox gCodeButton; private boolean translucent2D = DEF_TRANSLUCENT; private LinkedHashMap colorToNet = new LinkedHashMap(); // private Rect boardBounds = null; private int columnWidth; private JCheckBox flipXButton; private JCheckBox flipYButton; private JLabel offsetLabel; private JTextField offsetField; private JLabel limitLabel; private JTextField limitField; private JCheckBox autoLimitButton; private double toolDiameter = 0.0; private double voronoiLimit = DEF_VORONOI_LIMIT; private NumberFormat numberFormat = new DecimalFormat() { private static final long serialVersionUID = -2414650013441669791L; { setMaximumFractionDigits(4); } }; private double flipXScale = 1.0; private double flipXOffset = 0.0; private double flipYScale = 1.0; private double flipYOffset = 0.0; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/model/Net.java000066400000000000000000000770451147500217100252710ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.model; import javax.vecmath.*; import javax.media.j3d.*; import visolate.*; import visolate.simulator.*; import visolate.misc.*; import java.util.*; public class Net implements Comparable { private static final String cvsid = "$Id: Net.java,v 1.10 2006/08/29 04:02:32 vona Exp $"; public static final int CIRCLE_SEGMENTS = 16; public static final double CIRCLE_SECTOR = 2.0*Math.PI/CIRCLE_SEGMENTS; public static final Vector3f Z = new Vector3f(0.0f, 0.0f, 1.0f); public static final float TAIL_SIZE = 0.001f; public static final double MIN_TAIL_ANGLE = 5*Math.PI/180; public static final double MAX_TAIL_ANGLE = 30*Math.PI/180; public static final double LINE_TWIDDLE = 0.0005; public static final float GCODE_Z_MIN = 0.2f; public static final float PATH_Z = 0.1f; public static final float OUTLINE_Z = 0.05f; public static final float LINE_Z = 0.0f; public static final float POINT_Z = 0.0f; public static final float FLAT_Z_MAX = -0.1f; public static final float FLAT_Z_MIN = -0.9f; public static final float LOOP_Z_MAX = -1.0f; public static final float CONE_Z_MAX = -1.0f; public static final float HIGHLIGHT = 0.9f; public Net(Visolate visolate) { this.visolate = visolate; } public void resetArea(int dpi) { areaPixels = 0; areaDPI = dpi; } public void incrementAreaPixels() { areaPixels++; } public double getArea() { double ipd = 1.0/((double) areaDPI); return ((double) areaPixels)*ipd*ipd; } public double getFatness() { double length = getLength(); if (length > 0.0) return getArea()/length; else return getArea()/getWidth(); } public double getLength() { double length = 0.0; if (mySuperNet == null) { length = getLocalLength(); } else { for (Net snet : mySuperNet) { length += snet.getLocalLength(); } } return length; } protected double getLocalLength() { double length = 0.0; for (Iterator it = strokes.iterator(); it.hasNext(); ) length += it.next().getLength(); return length; } public double getWidth() { if (mySuperNet == null) { return getBounds().width; } else { Rect r = new Rect(); for (Iterator it = mySuperNet.iterator(); it.hasNext(); ) r.add(it.next().getBounds()); return r.width; } } public void dump() { System.out.println("(R, G, B): " + color + ": " + + ((mySuperNet != null) ? (mySuperNet.size()-1) : 0) + " siblings; " + + strokes.size() + " strokes; " + + pads.size() + " pads" + "\n bounds: " + getBounds() + "\n length: " + getLength() + "; area: " + getArea() + "; fatness: " + getFatness() + "; areaDPI: " + areaDPI + "; areaPixels: " + areaPixels); } public void setSuperNet(final Set aSuperNet) { if (this.mySuperNet == aSuperNet) { return; } if (this.mySuperNet != null) { aSuperNet.addAll(this.mySuperNet); } aSuperNet.add(this); for (Iterator it = aSuperNet.iterator(); it.hasNext(); ) { Net net = it.next(); net.mySuperNet = aSuperNet; if (!(net.color).equals(color)) net.setColor(color); } } public Set getSuperNet() { return mySuperNet; } public void setOffset(final double offset) { if (this.offset == offset) { return; } // System.out.println("setting offset on net"); this.offset = offset; bounds = null; for (Stroke stroke : strokes) { stroke.setOffset(offset); } for (Flash flash : pads) { flash.setOffset(offset); } rebuildFlatGeometry(); } public void addStroke(Stroke stroke) { stroke.setOffset(offset); strokes.add(stroke); halfEdges.add(new HalfEdge(stroke, false)); halfEdges.add(new HalfEdge(stroke, true)); } public void addPad(Flash f) { f.setOffset(offset); pads.add(f); } public int getNumEdges() { return halfEdges.size()/2; } public int getNumPads() { return pads.size(); } public int makeHalfEdgeLoops() { Set halfEdges = new HashSet(); halfEdges.addAll(this.halfEdges); // System.out.println(" making half edge loops for a net with " + // halfEdges.size() + " half edges"); while (!halfEdges.isEmpty()) { // System.out.println(" starting loop with " + // halfEdges.size() + " half edges remaining"); HalfEdge he = halfEdges.iterator().next(); loopStarts.add(he); HalfEdge startHalfEdge = he; Vertex start = he.getStart(); // System.out.println(" start vertex: " + start); start.removeOutgoingHalfEdge(he); for (;;) { boolean ok = halfEdges.remove(he); Vertex end = he.getEnd(); // System.out.println(" vertex: " + end); assert ok; if (start.equals(end)) break; HalfEdge next = end.getNextOutgoingHalfEdge(he); assert next != he; assert (he != null); he.setNext(next); he = next; } he.setNext(startHalfEdge); // System.out.println(" end vertex: " + he.getEnd()); } return loopStarts.size(); } public void printHalfEdgeLoops() { int i = 0; for (Iterator it = loopStarts.iterator(); it.hasNext(); i++) { System.out.println("half edge loop " + i); HalfEdge start = (HalfEdge) it.next(); HalfEdge next = start; do { System.out.println(((Vertex) next.getStart()).toStringInches()); next = next.getNext(); } while (next != start); System.out.println(); } } public void setColor(Color3b color) { this.color = color; if (coloringAttributes != null) coloringAttributes.setColor(applyHighlight(toColor3f(color))); } public void setHighlighted(boolean highlighted) { if (mySuperNet == null) { this.highlighted = highlighted; setColor(color); } else { for (Net net : mySuperNet) { net.highlighted = highlighted; net.setColor(net.color); } } } private Color3f applyHighlight(Color3f color) { if (highlighted) { color.x += HIGHLIGHT*(1.0f-color.x); color.y += HIGHLIGHT*(1.0f-color.y); color.z += HIGHLIGHT*(1.0f-color.z); } return color; } public static Color3f toColor3f(Color3b color) { return new Color3f(unsignedByteToInt(color.x)/255.0f, unsignedByteToInt(color.y)/255.0f, unsignedByteToInt(color.z)/255.0f); } public static int unsignedByteToInt(byte b) { return b & 0xff; } public Color3b getColor() { return color; } public void enableLineGeometry(boolean enable) { if (enable && (lineGeometry == null)) makeLineGeometry(); if (enable && (pointGeometry == null)) makePointGeometry(); showLineGeometry = enable; enableGeometry(lineS3D, lineGeometry, enable); enableGeometry(pointS3D, pointGeometry, enable); } public void enableVoronoiGeometry(boolean enable) { if (enable && (loopGeometry == null)) makeVoronoiGeometry(); showVoronoiGeometry = enable; enableGeometry(loopS3D, loopGeometry, enable); // enableGeometry(loopEdgesS3D, loopGeometry, enable); enableGeometry(coneS3D, coneGeometry, enable); // enableGeometry(coneEdgesS3D, coneGeometry, enable); } private void rebuildVoronoiGeometry() { boolean voronoiGeometryWas = showVoronoiGeometry; enableVoronoiGeometry(false); coneGeometry = null; loopGeometry = null; enableVoronoiGeometry(voronoiGeometryWas); } private void rebuildFlatGeometry() { boolean flatGeometryWas = showFlatGeometry; enableFlatGeometry(false); flatFanGeometry = null; flatNonFanGeometry = null; enableFlatGeometry(flatGeometryWas); } public void enableFlatGeometry(boolean enable) { if (enable && (flatFanGeometry == null)) makeFlatGeometry(); showFlatGeometry = enable; enableGeometry(flatFanS3D, flatFanGeometry, enable); enableGeometry(flatNonFanS3D, flatNonFanGeometry, enable); } public void setTranslucent2D(boolean enable) { if (enable == translucent2D) return; translucent2D = enable; if (appearance2D == null) return; if (enable) appearance2D.setTransparencyAttributes(transparencyAttributes); else appearance2D.setTransparencyAttributes(null); } public boolean isTranslucent2D() { return (appearance2D.getTransparencyAttributes() != null); } private void enableGeometry(final Shape3D shape3D, final Geometry geometry, final boolean enable) { if ((geometry == null) || (shape3D == null)) return; Runnable task = new Runnable() { public void run() { if (enable) { if (shape3D.indexOfGeometry(geometry) < 0) { if (!geometry.isLive()) { geometry.setCapability(Geometry.ALLOW_INTERSECT); geometry.setCapability(GeometryArray.ALLOW_COORDINATE_READ); geometry.setCapability(GeometryArray.ALLOW_COUNT_READ); geometry.setCapability(GeometryArray.ALLOW_FORMAT_READ); } shape3D.addGeometry(geometry); } } else { shape3D.removeAllGeometries(); } } }; if (shape3D.isLive()) visolate.addFrameTask(task); else task.run(); } public BranchGroup getSceneGraph() { if (sceneBG == null) { Appearance appearance = new Appearance(); coloringAttributes = new ColoringAttributes(); coloringAttributes.setCapability(ColoringAttributes.ALLOW_COLOR_READ); coloringAttributes.setCapability(ColoringAttributes.ALLOW_COLOR_WRITE); if (color != null) coloringAttributes.setColor(applyHighlight(toColor3f(color))); appearance.setColoringAttributes(coloringAttributes); PolygonAttributes polygonAttributes = new PolygonAttributes(PolygonAttributes.POLYGON_FILL, PolygonAttributes.CULL_NONE, 0.0f); appearance.setPolygonAttributes(polygonAttributes); /* Appearance appearanceEdges = new Appearance(); appearanceEdges. setColoringAttributes(new ColoringAttributes(0.0f, 1.0f, 0.0f, ColoringAttributes. SHADE_FLAT)); appearanceEdges. setPolygonAttributes(new PolygonAttributes( PolygonAttributes.POLYGON_LINE, PolygonAttributes.CULL_NONE, 1.0f, true, -1.0f)); appearanceEdges.setLineAttributes(new LineAttributes(1.0f, LineAttributes. PATTERN_SOLID, true)); // appearanceEdges. // setTransparencyAttributes(new TransparencyAttributes( // TransparencyAttributes.SCREEN_DOOR, // 0.8f)); */ Appearance appearance1D = new Appearance(); LineAttributes lineAttributes1D = new LineAttributes(1.0f, // 4.0f, LineAttributes. PATTERN_SOLID, false); appearance1D.setLineAttributes(lineAttributes1D); PointAttributes pointAttributes1D = new PointAttributes(1.0f, //4.0f, false); appearance1D.setPointAttributes(pointAttributes1D); ColoringAttributes coloringAttributes1D = new ColoringAttributes(); coloringAttributes1D.setColor(new Color3f(0.0f, 0.0f, 0.0f)); // coloringAttributes1D.setColor(new Color3f(1.0f, 1.0f, 1.0f)); appearance1D.setColoringAttributes(coloringAttributes1D); PolygonAttributes polygonAttributes1D = new PolygonAttributes(); polygonAttributes1D.setPolygonOffset(0.1f); appearance1D.setPolygonAttributes(polygonAttributes1D); appearance2D = new Appearance(); appearance2D.setColoringAttributes(coloringAttributes); appearance2D.setPolygonAttributes(polygonAttributes); appearance2D. setCapability(Appearance.ALLOW_TRANSPARENCY_ATTRIBUTES_READ); appearance2D. setCapability(Appearance.ALLOW_TRANSPARENCY_ATTRIBUTES_WRITE); transparencyAttributes = new TransparencyAttributes(TransparencyAttributes.BLENDED, 0.5f); if (translucent2D) appearance2D.setTransparencyAttributes(transparencyAttributes); lineS3D = new Shape3D(); pointS3D = new Shape3D(); coneS3D = new Shape3D(); // coneEdgesS3D = new Shape3D(); loopS3D = new Shape3D(); // loopEdgesS3D = new Shape3D(); flatFanS3D = new Shape3D(); flatNonFanS3D = new Shape3D(); lineS3D.setPickable(false); pointS3D.setPickable(false); coneS3D.setPickable(false); // coneEdgesS3D.setPickable(false); loopS3D.setPickable(false); // loopEdgesS3D.setPickable(false); flatFanS3D.setPickable(true); flatNonFanS3D.setPickable(true); lineS3D.setUserData(this); pointS3D.setUserData(this); coneS3D.setUserData(this); // coneEdgesS3D.setUserData(this); loopS3D.setUserData(this); // loopEdgesS3D.setUserData(this); flatFanS3D.setUserData(this); flatNonFanS3D.setUserData(this); lineS3D.setAppearance(appearance1D); pointS3D.setAppearance(appearance1D); coneS3D.setAppearance(appearance); // coneEdgesS3D.setAppearance(appearanceEdges); loopS3D.setAppearance(appearance); // loopEdgesS3D.setAppearance(appearanceEdges); flatFanS3D.setAppearance(appearance2D); flatNonFanS3D.setAppearance(appearance2D); lineS3D.setCapability(Shape3D.ALLOW_GEOMETRY_READ); lineS3D.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE); pointS3D.setCapability(Shape3D.ALLOW_GEOMETRY_READ); pointS3D.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE); coneS3D.setCapability(Shape3D.ALLOW_GEOMETRY_READ); coneS3D.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE); // coneEdgesS3D.setCapability(Shape3D.ALLOW_GEOMETRY_READ); // coneEdgesS3D.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE); loopS3D.setCapability(Shape3D.ALLOW_GEOMETRY_READ); loopS3D.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE); // loopEdgesS3D.setCapability(Shape3D.ALLOW_GEOMETRY_READ); // loopEdgesS3D.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE); flatFanS3D.setCapability(Shape3D.ALLOW_GEOMETRY_READ); flatFanS3D.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE); flatNonFanS3D.setCapability(Shape3D.ALLOW_GEOMETRY_READ); flatNonFanS3D.setCapability(Shape3D.ALLOW_GEOMETRY_WRITE); sceneBG = new BranchGroup(); sceneBG.setCapability(BranchGroup.ALLOW_DETACH); sceneBG.addChild(lineS3D); sceneBG.addChild(pointS3D); sceneBG.addChild(coneS3D); // sceneBG.addChild(coneEdgesS3D); sceneBG.addChild(loopS3D); // sceneBG.addChild(loopEdgesS3D); sceneBG.addChild(flatFanS3D); sceneBG.addChild(flatNonFanS3D); enableLineGeometry(showLineGeometry); enableVoronoiGeometry(showVoronoiGeometry); enableFlatGeometry(showFlatGeometry); } return sceneBG; } public void detach() { if (sceneBG != null) sceneBG.detach(); sceneBG = null; } private void makeLineGeometry() { if (strokes.isEmpty()) return; // int vertexCount = 4*strokes.size();// + 4*2; int vertexCount = 2*strokes.size();// + 4*2; float[] coords = new float[3*vertexCount]; int i = 0; for (Stroke stroke : strokes) { Point2f s = (stroke.getStart()).getInchCoordinates(); Point2f e = (stroke.getEnd()).getInchCoordinates(); Vector3f d = new Vector3f(); Vector3f n = new Vector3f(); if (stroke instanceof Segment) { d.set(e.x-s.x, e.y-s.y, 0.0f); d.normalize(); n.cross(d, Z); // float t = (float) (-LINE_TWIDDLE/2 + LINE_TWIDDLE*Math.random()); float t = 0.0f; coords[i++] = s.x + t*n.x; coords[i++] = s.y + t*n.y; coords[i++] = LINE_Z; coords[i++] = e.x + t*n.x; coords[i++] = e.y + t*n.y; coords[i++] = LINE_Z; /* (tail) coords[i++] = e.x + t*n.x; coords[i++] = e.y + t*n.y; coords[i++] = LINE_Z; double a = MIN_TAIL_ANGLE + (MAX_TAIL_ANGLE-MIN_TAIL_ANGLE)*Math.random(); float sa = (float) Math.sin(a); float ca = (float) Math.cos(a); coords[i++] = e.x+t*n.x+(n.x*sa-d.x*ca)*TAIL_SIZE; coords[i++] = e.y+t*n.y+(n.y*sa-d.y*ca)*TAIL_SIZE; coords[i++] = LINE_Z; */ } else { System.out.println("WARNING: unsupported stroke: " + stroke); } } /* Rect bounds = getBounds(); coords[i++] = (float) bounds.x; coords[i++] = (float) bounds.y; coords[i++] = LINE_Z; coords[i++] = (float) (bounds.x + bounds.width); coords[i++] = (float) bounds.y; coords[i++] = LINE_Z; coords[i++] = (float) (bounds.x + bounds.width); coords[i++] = (float) bounds.y; coords[i++] = LINE_Z; coords[i++] = (float) (bounds.x + bounds.width); coords[i++] = (float) (bounds.y + bounds.height); coords[i++] = LINE_Z; coords[i++] = (float) (bounds.x + bounds.width); coords[i++] = (float) (bounds.y + bounds.height); coords[i++] = LINE_Z; coords[i++] = (float) bounds.x; coords[i++] = (float) (bounds.y + bounds.height); coords[i++] = LINE_Z; coords[i++] = (float) bounds.x; coords[i++] = (float) (bounds.y + bounds.height); coords[i++] = LINE_Z; coords[i++] = (float) bounds.x; coords[i++] = (float) bounds.y; coords[i++] = LINE_Z; */ // System.out.println(coords.length/6 + " segments"); // // for (i = 0; i < coords.length/6; i++) // System.out.println("(" + coords[6*i] + ", " + coords[6*i+1] + ") -> (" + // coords[6*i+3] + ", " + coords[6*i+4] + ")"); lineGeometry = new LineArray(vertexCount, GeometryArray.COORDINATES); lineGeometry.setCoordinates(0, coords); } private void makePointGeometry() { if (pads.isEmpty()) return; int vertexCount = pads.size(); float[] coords = new float[3*vertexCount]; int i = 0; for (Iterator it = pads.iterator(); it.hasNext(); ) { Point2f p = (it.next().getLocation()).getInchCoordinates(); coords[i++] = p.x; coords[i++] = p.y; coords[i++] = POINT_Z; } pointGeometry = new PointArray(vertexCount, GeometryArray.COORDINATES); pointGeometry.setCoordinates(0, coords); } private void makeConeGeometry() { if (pads.isEmpty()) return; List vertices = new LinkedList(); Set strokeEnds = new LinkedHashSet(); for (Iterator it = strokes.iterator(); it.hasNext(); ) { Stroke stroke = it.next(); strokeEnds.add(stroke.getStart()); strokeEnds.add(stroke.getEnd()); } for (Iterator it = pads.iterator(); it.hasNext(); ) { Vertex v = it.next().getLocation(); if (!strokeEnds.contains(v)) { vertices.add(v); } } if (vertices.isEmpty()) { return; } int vertexCount = (CIRCLE_SEGMENTS + 2)*vertices.size(); int[] vertexCounts = new int[vertices.size()]; for (int i = 0; i < vertexCounts.length; i++) vertexCounts[i] = CIRCLE_SEGMENTS + 2; float[] coords = new float[3*vertexCount]; Transform3D t3d = new Transform3D(); t3d.rotZ(CIRCLE_SECTOR); int i = 0; for (Iterator it = vertices.iterator(); it.hasNext(); ) { Point2f v = it.next().getInchCoordinates(); coords[i++] = v.x; coords[i++] = v.y; coords[i++] = CONE_Z_MAX; Point3f p = new Point3f(zCeiling(), 0.0f, CONE_Z_MAX-zCeiling()); for (int j = 0; j < (CIRCLE_SEGMENTS + 1); j++) { t3d.transform(p); coords[i++] = v.x + p.x; coords[i++] = v.y + p.y; coords[i++] = p.z; } } coneGeometry = new TriangleFanArray(vertexCount, GeometryArray.COORDINATES, vertexCounts); coneGeometry.setCoordinates(0, coords); } private void makeLoopGeometry() { List parts = new LinkedList(); //half edge loops for (HalfEdge start : loopStarts) { HalfEdge he = start; Point2f s, e; Vector3f d = new Vector3f(); Vector3f n = new Vector3f(); do { Stroke stroke = he.getStroke(); s = (he.getStart()).getInchCoordinates(); e = (he.getEnd()).getInchCoordinates(); if (stroke instanceof Segment) { float[] part = new float[4*3]; d.x = e.x - s.x; d.y = e.y - s.y; d.z = 0.0f; d.normalize(); n.cross(d, Z); n.scale(zCeiling()); int i = 0; part[i++] = s.x; part[i++] = s.y; part[i++] = LOOP_Z_MAX; part[i++] = e.x; part[i++] = e.y; part[i++] = LOOP_Z_MAX; part[i++] = e.x + n.x; part[i++] = e.y + n.y; part[i++] = LOOP_Z_MAX-zCeiling(); part[i++] = s.x + n.x; part[i++] = s.y + n.y; part[i++] = LOOP_Z_MAX-zCeiling(); parts.add(part); } else { System.out.println("WARNING: unsupported stroke: " + stroke); } HalfEdge next = he.getNext(); if (next.getStroke() == stroke) { parts.add(makeFan(e.x, e.y, e.x + n.x, e.y + n.y, (float) Math.PI)); } else { double angle = he.angleTo(next); if (angle > Math.PI) { parts.add(makeFan(e.x, e.y, e.x + n.x, e.y + n.y, (float) (angle - Math.PI))); } } he = next; } while (he != start); } if (parts.isEmpty()) return; //collect parts int vertexCount = 0; int numFans = parts.size(); int[] vertexCounts = new int[numFans]; int i = 0; for (float[] part : parts) { vertexCount += part.length/3; vertexCounts[i++] = part.length/3; } // System.out.println(vertexCount + " vertices"); float[] coords = new float[vertexCount*3]; i = 0; for (float[] part : parts) { int len = part.length; System.arraycopy(part, 0, coords, i, len); i += len; } loopGeometry = new TriangleFanArray(vertexCount, GeometryArray.COORDINATES, vertexCounts); loopGeometry.setCoordinates(0, coords); } private void makeVoronoiGeometry() { makeConeGeometry(); makeLoopGeometry(); } private float[] makeFan(float bx, float by, float sx, float sy, float angle) { int n = (int) Math.ceil(angle/CIRCLE_SECTOR); double sector = angle/n; float[] coord = new float[3*(2 + n)]; int i = 0; coord[i++] = bx; coord[i++] = by; coord[i++] = LOOP_Z_MAX; coord[i++] = sx; coord[i++] = sy; coord[i++] = LOOP_Z_MAX-zCeiling(); Transform3D t3d = new Transform3D(); t3d.rotZ(sector); Point3f p = new Point3f(sx - bx, sy - by, LOOP_Z_MAX-zCeiling()); for (int j = 0; j < n; j++) { t3d.transform(p); coord[i++] = p.x + bx; coord[i++] = p.y + by; coord[i++] = p.z; } return coord; } private void makeFlatGeometry() { if (Float.isNaN(flatZ)) flatZ = (float) (FLAT_Z_MAX + Math.random()*(FLAT_Z_MIN-FLAT_Z_MAX)); // System.out.println("flatZ = " + flatZ); Collection fanParts = new LinkedHashSet(); Collection nonFanParts = new LinkedHashSet(); // System.out.println(strokes.size() + " strokes"); for (Stroke stroke : strokes) { // System.out.println(stroke.toString()); Collection geometries = stroke.getGeometries(); if (geometries == null) { continue; } for (GeometryArray geometry : geometries) { if (geometry == null) { continue; } if (geometry instanceof TriangleFanArray) { fanParts.add((TriangleFanArray) geometry); } else { nonFanParts.add(geometry); } } } // System.out.println(fanParts.size() + " fan; " + // nonFanParts.size() + " nonfan"); // System.out.println(pads.size() + " pads"); for (Flash flash : pads) { // System.out.println(flash.toString()); Collection geometries = flash.getGeometries(); if (geometries == null) { continue; } for (GeometryArray geometry : geometries) { if (geometry == null) { continue; } if (geometry instanceof TriangleFanArray) { fanParts.add((TriangleFanArray) geometry); } else { nonFanParts.add(geometry); } } } // System.out.println(fanParts.size() + " fan; " + // nonFanParts.size() + " nonfan"); if (fanParts.size() != 0) { int numFans = fanParts.size(); int[] vertexCounts = new int[numFans]; int vertexCount = computeVertexCounts(fanParts, vertexCounts); float[] coords = new float[vertexCount*3]; populateCoords(fanParts, coords); flatFanGeometry = new TriangleFanArray(vertexCount, GeometryArray.COORDINATES, vertexCounts); flatFanGeometry.setCoordinates(0, coords); } if (nonFanParts.size() != 0) { int vertexCount = 0; for (Iterator it = nonFanParts.iterator(); it.hasNext(); ) { vertexCount += ((GeometryArray) it.next()).getVertexCount(); } float[] coords = new float[vertexCount*3]; populateCoords(nonFanParts, coords); // System.out.println(vertexCount + " non-fan verts:"); // for (int i = 0; i < vertexCount; i++) // System.out.println(" (" + coords[3*i] + // ", " + coords[3*i+1] + // ", " + coords[3*i+2] + ")"); flatNonFanGeometry = new TriangleArray(vertexCount, GeometryArray.COORDINATES); flatNonFanGeometry.setCoordinates(0, coords); } } private int computeVertexCounts(Collection parts, int[] vertexCounts) { int total = 0; int i = 0; for (GeometryArray part : parts) { int vertexCount = part.getVertexCount(); total += vertexCount; vertexCounts[i++] = vertexCount; } return total; } private void populateCoords(Collection parts, float[] coords) { int i = 0; for (GeometryArray gpart : parts) { float[] part = gpart.getCoordRefFloat(); int len = part.length; System.arraycopy(part, 0, coords, i, len); i += len; } for (i = 0; i < coords.length/3; i++) { coords[3*i+2] = flatZ; } } public Rect getBounds() { if (bounds == null) { bounds = new Rect(); for (Iterator it = strokes.iterator(); it.hasNext(); ) { Rect strokeBounds = (it.next()).getBounds(); // System.out.println("adding stroke bounds: " + strokeBounds); // System.out.println("to net bounds: " + bounds); bounds.add(strokeBounds); // System.out.println("result: " + bounds); } for (Iterator it = pads.iterator(); it.hasNext(); ) bounds.add(it.next().getBounds()); // System.out.println("net bounds: " + bounds); } return bounds; } private float zCeiling() { if (Float.isNaN(zCeiling)) zCeiling = (float) (visolate.getModel()).getMaxDimension(); return zCeiling; } public void setZCeiling(double zCeiling) { if (this.zCeiling == zCeiling) return; this.zCeiling = (float) zCeiling; rebuildVoronoiGeometry(); } public int compareTo(final Net o) { // if (!(o instanceof Net)) // return 0; float otherFlatZ = ((Net) o).flatZ; if (flatZ > otherFlatZ) { return -1; } if (flatZ < otherFlatZ) { return 1; } return 0; } private Visolate visolate; private Collection strokes = new LinkedList(); private Collection loopStarts = new LinkedList(); private LinkedHashSet halfEdges = new LinkedHashSet(); private LinkedHashSet pads = new LinkedHashSet(); private ColoringAttributes coloringAttributes = null; private Color3b color; private GeometryArray lineGeometry = null; private GeometryArray pointGeometry = null; private GeometryArray coneGeometry = null; private GeometryArray loopGeometry = null; private GeometryArray flatFanGeometry = null; private GeometryArray flatNonFanGeometry = null; private boolean showLineGeometry = false; private boolean showVoronoiGeometry = false; private boolean showFlatGeometry = false; private Shape3D lineS3D = null; private Shape3D pointS3D = null; private Shape3D coneS3D = null; // private Shape3D coneEdgesS3D = null; private Shape3D loopS3D = null; // private Shape3D loopEdgesS3D = null; private Shape3D flatFanS3D = null; private Shape3D flatNonFanS3D = null; private BranchGroup sceneBG = null; private Rect bounds = null; private float zCeiling = Float.NaN; private float flatZ = Float.NaN; private Appearance appearance2D; private TransparencyAttributes transparencyAttributes; private Set mySuperNet = null; private double offset = 0.0; private boolean translucent2D = false; private int areaDPI; private int areaPixels; private boolean highlighted = false; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/model/makefile.old000066400000000000000000000650361147500217100261520ustar00rootroot00000000000000# Vona's super-ninja makefile # # *** DO NOT EDIT THIS FILE EXCEPT IN THE PROJECT HOME DIRECTORY *** # # This makefile is auto-generated by "make makefiles" in the parent package # # You can (and should) edit makefile.project, which is included below, to # specify project-specific settings # # You can edit makefile.package, which is included below, to specify # package-specific targets and variables # # Copyright (C) 2004 Marsette A. Vona, III # # 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 2 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., 59 # Temple Place - Suite 330, Boston, MA 02111-1307, USA. # $Id: makefile 15 2008-01-23 21:56:45Z vona $ # Relative path to the directory containing the root package for the project. # For makefile in every directory other than $(PROJECT_HOME) this is # automatically set by "make makefiles" PROJECT_HOME = ../. -include $(PROJECT_HOME)/makefile.project ifndef BASE_PACKAGE BASE_PACKAGE := $(notdir $(shell $(CD) $(PROJECT_HOME) && pwd)) endif ifndef APPNAME APPNAME := $(BASE_PACKAGE) endif # The (full) name of this package. For makefile in every directory other than # $(PROJECT_HOME) this is automatically set by "make makefiles" PACKAGE = $(BASE_PACKAGE).model # the default target default: package #figure out arch SYSTEM = $(shell uname -s | tr " " "_") MACHINE = $(shell uname -m | tr " " "_") ARCH := $(SYSTEM)_$(MACHINE) #linux: Linux_i686 #OS X: Darwin_Power_Macintosh #cygwin: CYGWIN-5.1_NT # misc macros # these let $(COMMA) and $(SPACE) be lone arguments to make function calls COMMA := , EMPTY := SPACE := $(EMPTY) $(EMPTY) # whitespace regex WS = [ \t]* ifneq ($(findstring CYGWIN,$(SYSTEM)),CYGWIN) # make cd .. follow the Physical directory structure on Unix CD = cd -P else CD = cd # always use bash on cygwin, sh doesn't have pushd, but bash slows things down SHELL = `which bash` endif # tool finding functions #locate the target of a symlink # #works even if the starting point is not a symlink locate-target = $(shell f="$(1)"; while [ -L "$$f" ]; do f=`ls -l "$$f" | awk '{print $$NF}'`; done; echo "$$f") #try hard to find a command # #first arg is command name # #second arg is expected directory # #if cmd executable in directory, that is returned # #else if which knows where the command is, that is returned # #else empty string is returned locate-cmd = $(shell if [ -x "$(2)/$(1)" ]; then echo "$(2)/$(1)"; else cmd="$(shell which "$(1)" 2>/dev/null || true)" && if [ -x "$$cmd" ] ; then echo "$$cmd"; else echo ""; fi; fi) #get the parent directory name # #better than the make builtin function because this also works on a directory dirname = $(shell if [ "$(1)"x != x -a -e "$(1)" ] ; then dirname "$(1)"; else echo ""; fi) #default a dir # #first arg is the desired dir # #second is the default dir # #returns first arg iff it's a directory, else second arg default-dir = $(shell if [ ! -d "$(1)" ]; then echo "$(2)"; else echo "$(1)"; fi) # find tool directories ifndef TOOLS_HOME TOOLS_HOME := $(call default-dir,$(PROJECT_TOOLS_HOME),/usr) endif BIN := $(call default-dir,$(TOOLS_HOME)/bin/$(ARCH),/usr/bin) SCRIPTS := $(call default-dir,$(TOOLS_HOME)/scripts,$(BIN)) JDK_BASE := $(TOOLS_HOME)/java/$(ARCH) JDK_VERSION := newest JDK_HOME := $(call dirname,$(call dirname,$(call locate-target,$(call locate-cmd,javac,$(JDK_BASE)/$(JDK_VERSION)/bin)))) JDK_EXT := $(JDK_HOME)/jre/lib/ext ifeq ($(SYSTEM),Darwin) JDK_EXT := /Library/Java/Extensions endif TOOLS_EXT := $(TOOLS_HOME)/java/indep/lib # find pure java extension jars in the tools java/indep/lib dir if present, else in jre/lib/ext # NOTE the classes will come in on different classloaders in the two cases, which can lead to subtle CNFEs EXT_DIR := $(call default-dir,$(TOOLS_EXT),$(JDK_EXT)) # JDK executables JAVAC := $(call locate-cmd,javac,$(JDK_HOME)/bin) JAVA := $(call locate-cmd,java,$(JDK_HOME)/bin) JAVADOC := $(call locate-cmd,javadoc,$(JDK_HOME)/bin) JAR := $(call locate-cmd,jar,$(JDK_HOME)/bin) KEYTOOL := $(call locate-cmd,keytool,$(JDK_HOME)/bin) JARSIGNER := $(call locate-cmd,jarsigner,$(JDK_HOME)/bin) RMIC := $(call locate-cmd,rmic,$(JDK_HOME)/bin) #other executables JAVACC := $(call locate-cmd,javacc,$(BIN)) RSYNC := $(call locate-cmd,rsync,$(BIN)) WWWIMAGESIZE := $(call locate-cmd,wwwimagesize,$(SCRIPTS)) # CompileServer stuff # the CompileServer binary directory CS_BIN := $(call dirname,$(call locate-target,$(call locate-cmd,javac_submit,$(BIN)))) # the CompileServer scripts directory CS_SCRIPTS := $(call dirname,$(call locate-target,$(call locate-cmd,CompileServer-submit,$(SCRIPTS)))) # define NO_COMPILE_SERVER to disable compile server ifndef NO_COMPILE_SERVER CS_ENSURE := $(call locate-cmd,CompileServer-ensure-running,$(CS_SCRIPTS)) CS_SUBMIT := $(call locate-cmd,CompileServer-submit,$(CS_SCRIPTS)) ifdef CS_ENSURE ifeq ($(findstring OK,$(shell $(CS_ENSURE) nostart)),OK) ifdef CS_SUBMIT #ok CompileServer is all good! JAVAC := $(CS_SUBMIT) USING_COMPILE_SERVER := 1 endif endif #OK endif #CS_ENSURE endif #NO_COMPILE_SERVER # rmi stuff # generate commands to run RMIWrap # # first arg is the (simple) name of the API interface # # second arg is the (simple) name of the implementation class run-rmiwrap = if [ ! -f $(1)Remote.java -o ! -f $(2)Server.java -o ! -f $(2)Client.java -o \( $(1).java -nt $(1)Remote.java \) -o \( $(2).java -nt $(2)Client.java \) -o \( $(2).java -nt $(2)Server.java \) ]; then $(JAVA) $(RUN_JAVA_FLAGS) vona.rmi.rmiwrap.RMIWrap $(PACKAGE).$(1) $(PACKAGE).$(2) && $(JAVAC) $(JAVAC_FLAGS) *.java; fi # generate commands to run rmic # # first arg is the (simple) name of the remote class for which to generate a # stub RMIC_JRMP_VERSION = 1.1 run-rmic = if [ ! -f $(1)_Stub.class -o $(1).class -nt $(1)_Stub.class ]; then $(RMIC) -v$(RMIC_JRMP_VERSION) -d $(PROJECT_HOME)/.. $(CLASSPATH_FLAG) $(PACKAGE).$(1); fi # rsync stuff # flags for rsync # # excludes the usual suspects RSYNC_FLAGS := -rv --progress $(DBG) --copy-links --exclude "**~" --exclude ".\#**" --exclude CVS --exclude .svn --exclude "*.tmp" # rsync first arg to second arg, with cvs exclude rsync = $(RSYNC) $(RSYNC_FLAGS) --cvs-exclude $(1) $(2) # rsync a subproject # # first arg is filename extension to include (starting with ".", or empty for # all) # # second arg is the name of a subproject (i.e. the name of the base package of # the subproject). If it ends in "." then it is copied non-recursively, else # it is copied recursively. # # third arg is rsync dest, if not absolute then relative to $(PROJECT_HOME)/.. rsync-subproject = pushd $(PROJECT_HOME)/.. && $(RSYNC) $(RSYNC_FLAGS) --include "*/" --exclude "/$(BASE_PACKAGE)/$(JAVADOC_DIR_NAME)/**" --include $(if $(filter ".","$(suffix $(2))"),"/$(call package-to-path,$(basename $(2)))/*$(1)","/$(call package-to-path,$(2))/**$(1)") --exclude "*" $(BASE_PACKAGE) $(3) && popd # this should have dynamic binding so that makefile.package can override # JARFILE JAR_DIR = .$(JARFILE).tmp # make a jar # # does not include hidden files (any file with name beginning ".") # # arg 1: "true" to include javadoc tree, "false" otherwise # arg 2: the list of external jars (none if empty) # arg 3: the name of the jarfile # arg 4: the list of filename extensions to include (each beginning with ".", empty to include all) # arg 5: list of extra files to include (pathnames relative to parent of base package) # arg 6: includes only files in these subproject packages make-jar = \ $(RM) $(3) && \ $(RM) -r $(JAR_DIR) && \ mkdir $(JAR_DIR) && \ if [ $(1) ] && [ -d "$(JAVADOC_DIR)" ]; then $(call rsync,$(JAVADOC_DIR),$(JAR_DIR)); fi && \ if [ "$(4)foo" == "foo" ]; then \ $(foreach P,$(6),$(call rsync-subproject,,$(P),$(call package-to-path,$(PACKAGE))/$(JAR_DIR)) && ) true; \ else $(foreach E,$(4),$(foreach P,$(6),$(call rsync-subproject,$(E),$(P),$(call package-to-path,$(PACKAGE))/$(JAR_DIR)) && )) true; fi && \ $(foreach F,$(addprefix $(EXT_DIR)/,$(2)),cp $(F) $(JAR_DIR) &&) true && \ $(foreach F,$(5),cp $(addprefix $(PROJECT_HOME)/../,$(F)) $(JAR_DIR)/$(dir $(F)) &&) true && \ $(CD) $(JAR_DIR) && \ $(foreach F,$(2),$(JAR) xvf $(F) && rm $(F) &&) true && \ rm -rf META-INF && \ if [ "$(4)foo" == "foo" ]; then \ $(JAR) cvf $(3) `find . -not -type d -a -not -name ".*"` $(5); \ else $(JAR) cvf $(3) `find . -not -type d -a -not -name ".*" -a "(" -false $(foreach E,$(4),-o -name "*$(E)" ) ")"` $(5); fi && \ if [ -f ../$(JAR_MF) ]; then $(JAR) ufm $(3) ../$(JAR_MF); fi && \ if [ -f ../$(JAR_CRT) ]; then $(JARSIGNER) $(3) $(JARKEY); fi && \ mv $(3) .. && \ $(CD) .. && \ rm -rf $(JAR_DIR) # template file locations TEMPLATE_DIR = $(PROJECT_HOME)/templates JAVA_TEMPLATE = $(TEMPLATE_DIR)/Template.java EXCEPTION_TEMPLATE = $(TEMPLATE_DIR)/Exception.java PACKAGE_TEMPLATE = $(TEMPLATE_DIR)/package.html MAKEFILE_PACKAGE_TEMPLATE = $(TEMPLATE_DIR)/makefile.package template-m4-common = m4 -P "-DYEAR=`date +%Y`" "-DPACKAGE=$(PACKAGE)" template-m4-java = m4 -P "-DYEAR=`date +%Y`" "-DPACKAGE=$(PACKAGE)" "-DCLASS=$(notdir $(basename $(1)))" $(JAVA_TEMPLATE) > $(basename $(1)).java # compute short package name from fullname PACKAGE_NAME = $(subst .,,$(suffix .$(PACKAGE))) # compute project name (root package name) from package fullname PROJECT = $(firstword $(subst ., ,$(PACKAGE))) # heap size flag MEMORY_FLAG = -Xmx$(TOTAL_HEAP_SIZE) # compute the package path from the package full name # $(PROJECT_HOME)/../$(PACKAGE_PATH) is a path to this package PACKAGE_PATH = $(call package-to-path,$(PACKAGE)) # command to run make without generating any extraneous output MAKE_SILENT = $(MAKE) --silent --no-print-directory # is this the project root package? ifeq ($(PROJECT_HOME),.) ROOT_PACKAGE = yes endif # flag useful for various tools # put the parent of project home first on the classpath # that way if there are built checkouts of the source trees for any EXT_JARS # then we'll pick up those classes directly from there NINJA_CLASSPATH := $(PROJECT_HOME)/.. ifdef USING_COMPILE_SERVER NINJA_CLASSPATH := $(shell pwd)/$(NINJA_CLASSPATH) endif # now put each EXT_JAR on the classpath, in order, but only if we're finding # them in an EXT_DIR which is not the JDK installed extensions dir ifneq ($(EXT_DIR),$(JDK_EXT)) NINJA_CLASSPATH := $(subst $(SPACE),,$(NINJA_CLASSPATH)$(foreach JAR,$(EXT_JARS),:$(EXT_DIR)/$(JAR))) endif # next add the JDK tools jar to the classpath # in particular, for use by CompileServer NINJA_CLASSPATH := $(NINJA_CLASSPATH):$(JDK_HOME)/lib/tools.jar # finally append the user's externally defined CLASSPATH, if any ifdef CLASSPATH MAKE_CLASSPATH := $(NINJA_CLASSPATH):$(CLASSPATH) else #trailing colon breaks java under Windows MAKE_CLASSPATH := $(NINJA_CLASSPATH) endif ifeq ($(findstring CYGWIN,$(SYSTEM)),CYGWIN) MAKE_CLASSPATH := `cygpath -w -p "$(MAKE_CLASSPATH)"` endif CLASSPATH_FLAG = -classpath "$(MAKE_CLASSPATH)" DEPRECATION_FLAG = -deprecation # source the package-specific makefile -include makefile.package # always exclude these subdirs EXCLUDE_SUBDIRS += . .. CVS .svn # figure out our subdirs PACKAGE_SUBDIRS = $(filter-out $(EXCLUDE_SUBDIRS),$(notdir $(shell find . -maxdepth 1 -type d -not -name ".*.tmp" -a -not -name "javadoc-*"))) # always exclude these source files EXCLUDE_SOURCE += # figure out source files PACKAGE_SOURCE = $(filter-out $(wildcard $(EXCLUDE_SOURCE)),$(wildcard *.java)) PACKAGE_HTML_SOURCE = $(filter-out $(wildcard $(EXCLUDE_SOURCE)),$(wildcard *.phtml *.m4)) # ALL source SOURCE = \ $(wildcard *.java) \ $(wildcard *.scm) \ $(wildcard *.c *.cc *.h *.hh) \ $(wildcard *.mf) \ $(wildcard *.jj) \ $(wildcard *.xsd *.xml *.spp) \ $(wildcard *.txt *.tex *.html *.htm *.css README) \ $(wildcard *.properties *.conf *.xcf *.gif *.jpg *.png *.bmp *.ico) \ $(wildcard *.lws *.lwo *.wrl) \ $(wildcard *.sh *.csh *.bat *.iss) \ $(wildcard *.phtml *.m4) \ $(wildcard *.policy) \ package.html makefile.package ifdef ROOT_PACKAGE SOURCE += makefile makefile.project endif # compile-time flags JAVAC_FLAGS += $(DEPRECATION_FLAG) $(CLASSPATH_FLAG) -source $(SOURCE_VERSION) -target $(TARGET_VERSION) $(JAVAC_OPTIONS) # runtime flags RUN_JAVA_FLAGS += $(CLASSPATH_FLAG) $(MEMORY_FLAG) $(WORKAROUND_FLAGS) $(JAVA_OPTIONS) -ea # javadoc flags JAVADOC_FLAGS += $(CLASSPATH_FLAG) -source $(JAVADOC_SOURCE_VERSION) -private -use -author -doctitle $(APPNAME) `if [ -e overview.html ]; then echo -overview overview.html; else echo ""; fi` # subpackage makefiles SUBPACKAGE_MAKEFILES = $(addsuffix /makefile,$(PACKAGE_SUBDIRS)) # HTML stuff .SUFFIXES: .m4 .phtml .html WWWROOT = $(HOME)/www html-m4 = m4 -P "-DBUILD_DATE=`date`" "-DYEAR=`date +%Y`" "-I$(WWWROOT)/include" $(1) > $(2) html-cpp = gcc -E -P -traditional "-DBUILD_DATE=`date`" "-DYEAR=`date +%Y`" "-I$(WWWROOT)/include" - < $(1) > $(2) # function to generate a javadoc command line # # javadoc will be deposited in $(JAVADOC_DIR) # # first arg is list of base packages. Javadoc will be built for all # subpackages of the base packages. javadoc = $(JAVADOC) $(JAVADOC_FLAGS) -d $(JAVADOC_DIR) $(foreach P,$(1), -subpackages $(P)) # function to make a target recursively # first argument is target to make # second argument is "true" to continue on fail, "false" to stop on fail recursively-make = $(foreach DIR,$(PACKAGE_SUBDIRS),[ ! -d $(DIR) ] || pushd $(DIR) > /dev/null && ( $(MAKE) $(1) || $(2) ) && popd > /dev/null && ) true # function to make something from $(PROJECT_HOME) make-from-project-home = \ @echo making $(1) from $(PROJECT_HOME); \ $(CD) $(PROJECT_HOME) && $(MAKE) $(1) # function to convert a package name to a path package-to-path = $(subst .,/,$(1)) # function to extract the package part of a full class name (not including # the trailing .class) package-part = \ $(basename $(1)) # function to extract the class part of a full class name (not including the # trailing .class) class-part = \ $(subst .,,$(suffix $(1))) # use this target as a prereq to force another target .PHONY: FORCE FORCE: # pattern rules # initialize a new class file %.java-template: $(JAVA_TEMPLATE) if [ ! -f ./$(basename $@).java ] || [ ! -s ./$(basename $@).java ]; then $(call template-m4-java,$@); else echo ./$(basename $@).java exists and is non-empty, not overwriting; fi .PHONY: java-templates java-templates: $(foreach F,$(shell find . -maxdepth 1 -size 0 -name "*.java"),$(call template-m4-java,$F); ) # initialize a new Exception class file %.java-exception-template: $(EXCEPTION_TEMPLATE) if [ ! -f ./$(basename $@).java ]; then cp $(EXCEPTION_TEMPLATE) ./$(basename $@).java; else echo ./$(basename $@).java exists, not overwriting; fi # initialize a new package.html file .PHONY: package.html-template package.html-template: $(PACKAGE_TEMPLATE) if [ ! -f package.html ]; then cp $(PACKAGE_TEMPLATE) ./package.html; else echo ./package.html exists, not overwriting; fi # initialize a new makefile.package file .PHONY: makefile.package-template makefile.package-template: $(MAKEFILE_PACKAGE_TEMPLATE) if [ ! -f makefile.package ]; then cp $(MAKEFILE_PACKAGE_TEMPLATE) ./makefile.package; else echo ./makefile.package exists, not overwriting; fi # make html from m4 %.html: %.m4 $(call html-m4,$<,$@) if [ -x "$(WWWIMAGESIZE)" ]; then $(WWWIMAGESIZE) -MakeBackup no $@; fi # make html from phtml by sending it through the C pre-processor %.html: %.phtml $(call html-cpp,$<,$@) if [ -x "$(WWWIMAGESIZE)" ]; then $(WWWIMAGESIZE) -MakeBackup no $@; fi # build a .class file from a .java file ifeq ($(findstring CYGWIN,$(SYSTEM)),CYGWIN) #fix paths on cygwin. ARGH... ifdef USING_COMPILE_SERVER %.class: %.java $(JAVAC) $(JAVAC_FLAGS) "`cygpath -w "$(addprefix $(shell pwd)/,$<)"`" else %.class: %.java $(JAVAC) $(JAVAC_FLAGS) $< endif else # not on cygwin. Phew. %.class: %.java $(JAVAC) $(JAVAC_FLAGS) $< endif # build Java source files from a .jj grammar file %.java: %.jj $(JAVACC) $< # run a class in a specific package $(PROJECT).%.run: $(if BUILD_BEFORE_RUN,$(PROJECT).%.class,) $(JAVA) $(RUN_JAVA_FLAGS) $(basename $@) # run a class in the current package with a main() function directly %.run: $(if BUILD_BEFORE_RUN,%.class,) $(JAVA) $(RUN_JAVA_FLAGS) $(PACKAGE).$(basename $@) # run a class in appletviewer (specify html filename without path or extension) %.appletviewer: $(JDK_HOME)/bin/appletviewer $(basename $@).html # build a class in a specific package $(PROJECT).%.class: $(CD) $(PROJECT_HOME)/../$(call package-to-path,$(call package-part,$(basename $@))) && $(MAKE) $(call class-part,$(basename $@)).class # build a specific package $(PROJECT).%.package-make: @echo making package $@ $(CD) $(PROJECT_HOME)/../$(call package-to-path,$(basename $@)) && $(MAKE) package # recursive build of the base package is a project build # note the semicolon which makes this an "empty command"!! # without it the %.recursive pattern would get called after this runs # resulting in an infinite loop!! $(PROJECT).package-make.recursive: project ; # build a specific package and all descendant packages $(PROJECT).%.package-make.recursive: @echo making package $@ and all descendant packages $(CD) $(PROJECT_HOME)/../$(call package-to-path,$(basename $(basename $@))) && $(MAKE) package.recursive # trick make into building the base package when asked # if we don't do this then a spurious implicit rule gets invoked because the # base package has no .suffix $(PROJECT).package-make: @echo making base package $(CD) $(PROJECT_HOME) && $(MAKE) package # recursively make something %.recursive: # @echo recursively making $(basename $@) $(MAKE) $(basename $@) $(call recursively-make,$@,true) # fun targets .PHONY: love love: @echo not war .PHONY: pull-plug pull-plug: @echo My mind is going. I can FEEL it. .PHONY: open-the-pod-bay-doors-hal open-the-pod-bay-doors-hal: @echo I\'m sorry `finger \`whoami\` | sed -e '2,$$d' -e '1s/.*:.*:[ ]*\([^ ]*\).*/\1/'`, I\'m afraid I can\'t do that. # global targets # utility targets .PHONY: show-exclude-source show-exclude-source: @echo $(EXCLUDE_SOURCE) .PHONY: show-exclude-subdirs show-exclude-subdirs: @echo $(EXCLUDE_SUBDIRS) .PHONY: show-package show-package: @echo $(PACKAGE) .PHONY: show-project-home show-project-home: @echo $(PROJECT_HOME) .PHONY: show-classpath show-classpath: @echo $(MAKE_CLASSPATH) .PHONY: show-jdk-home show-jdk-home: @echo $(JDK_HOME) .PHONY: show-jdk-ext show-jdk-ext: @echo $(JDK_EXT) .PHONY: show-tools-ext show-tools-ext: @echo $(TOOLS_EXT) .PHONY: show-ext-dir show-ext-dir: @echo $(EXT_DIR) .PHONY: show-java show-java: @echo $(JAVA) .PHONY: show-run-java-flags show-run-java-flags: @echo $(RUN_JAVA_FLAGS) .PHONY: show-run-java-with-flags show-run-java-with-flags: @echo $(JAVA) $(RUN_JAVA_FLAGS) .PHONY: show-run-java-with-flags-and-package show-run-java-with-flags-and-package: @echo $(JAVA) $(RUN_JAVA_FLAGS) $(PACKAGE) .PHONY: show-bin show-bin: @echo $(BIN) .PHONY: show-cs-bin show-cs-bin: @echo $(CS_BIN) .PHONY: show-scripts show-scripts: @echo $(SCRIPTS) .PHONY: show-cs-scripts show-cs-scripts: @echo $(CS_SCRIPTS) .PHONY: show-settings show-settings: @echo Make settings: @echo APPNAME: $(APPNAME) @echo BASE_PACKAGE: $(BASE_PACKAGE) @echo ARCH: $(ARCH) @echo TOOLS_HOME: $(TOOLS_HOME) @echo SCRIPTS: $(SCRIPTS) @echo CS_SCRIPTS: $(CS_SCRIPTS) @echo CS_BIN: $(CS_BIN) @echo CS_ENSURE: $(CS_ENSURE) @echo CS_SUBMIT: $(CS_SUBMIT) @echo JDK_BASE: $(JDK_BASE) @echo JDK_HOME: $(JDK_HOME) @echo JDK_EXT: $(JDK_EXT) @echo TOOLS_EXT: $(TOOLS_EXT) @echo EXT_DIR: $(EXT_DIR) @echo JDK_VERSION: $(JDK_VERSION) @echo SOURCE_VERSION: $(SOURCE_VERSION) @echo TARGET_VERSION: $(TARGET_VERSION) @echo JAVAC: $(JAVAC) @echo JAVA: $(JAVA) @echo JAVADOC: $(JAVADOC) @echo JAVACC: $(JAVACC) @echo JAR: $(JAR) @echo NO_COMPILE_SERVER: "$(NO_COMPILE_SERVER)" @echo USING_COMPILE_SERVER: "$(USING_COMPILE_SERVER)" @echo SHELL: $(SHELL) @echo CD: $(CD) @echo PROJECT: $(PROJECT) @echo PROJECT_HOME: $(PROJECT_HOME) ifdef ROOT_PACKAGE @echo this is the root package else @echo this is not the root package endif @echo PACKAGE: $(PACKAGE) @echo PACKAGE_PATH: '$(PACKAGE_PATH)' @echo PACKAGE_NAME: $(PACKAGE_NAME) @echo EXCLUDE_SUBDIRS: $(EXCLUDE_SUBDIRS) @echo PACKAGE_SUBDIRS: $(PACKAGE_SUBDIRS) @echo EXCLUDE_SOURCE: $(EXCLUDE_SOURCE) @echo PACKAGE_SOURCE: $(PACKAGE_SOURCE) @echo PACKAGE_HTML_SOURCE: $(PACKAGE_HTML_SOURCE) @echo SOURCE: $(SOURCE) @echo SUBPROJECT_PACKAGES: $(SUBPROJECT_PACKAGES) @echo JAVAC_FLAGS: '$(JAVAC_FLAGS)' @echo JAVADOC_FLAGS: '$(JAVADOC_FLAGS)' @echo JAVADOC_DIR: $(JAVADOC_DIR) @echo JAR_DIR: $(JAR_DIR) @echo JAR_MF: $(JAR_MF) @echo JARKEY: $(JARKEY) @echo JAR_CRT: $(JAR_CRT) @echo EXT_JARS: $(EXT_JARS) @echo MAKE_CLASSPATH: '$(MAKE_CLASSPATH)' @echo SUBPACKAGE_MAKEFILES: $(SUBPACKAGE_MAKEFILES) @echo PUBLISH_DEST: $(PUBLISH_DEST) # package targets # make the current package .PHONY: package package: $(EXTRA_PACKAGE_DEPS) $(if $(NO_SOURCE_GEN),,package-source-gen) package-javacc-make $(addsuffix .class,$(basename $(PACKAGE_SOURCE))) $(addsuffix .html,$(basename $(PACKAGE_HTML_SOURCE))) $(EXTRA_PACKAGE_CMDS) # make javacc in the current package .PHONY: packge-javacc-make package-javacc-make: $(addsuffix .class,$(basename $(wildcard *.jj))) # make the makefile in the current package ifndef ROOT_PACKAGE makefile: $(PROJECT_HOME)/makefile @$(CD) .. && $(MAKE) $(PACKAGE_NAME)/makefile else makefile: FORCE endif .PHONY: clean clean: $(EXTRA_CLEAN_DEPS) @echo removing all .class files in this package $(RM) *.class .PHONY: c-clean c-clean: @echo removing all .o files in this package $(RM) *.o .PHONY: javacc-clean javacc-clean: @echo removing javacc-generated files $(RM) `ls *.java | xargs grep -l "Generated By:JavaCC"` .PHONY: rmiwrap-clean rmiwrap-clean: @echo removing RMIWrap-generated files $(RM) `ls *.java | xargs grep -l "generated by RMIWrap"` .PHONY: html-clean html-clean: @echo removing all generated html $(RM) $(addsuffix .html,$(basename $(PACKAGE_HTML_SOURCE))) .PHONY: jar-clean jar-clean: $(RM) $(JARFILE) $(JARFILE_LITE) $(JARFILE_XLITE) .PHONY: javadoc-clean javadoc-clean: $(RM) -r $(JAVADOC_DIR) .PHONY: realclean realclean: $(EXTRA_REALCLEAN_DEPS) clean rmiwrap-clean javacc-clean html-clean jar-clean javadoc-clean if [ -f core ]; then $(RM) core; fi .PHONY: package-javacc-gen package-javacc-gen: $(addsuffix .java,$(basename $(wildcard *.jj))) .PHONY: package-source-gen package-source-gen: package-javacc-gen # project targets .PHONY: project-announce project-announce: @echo making project .PHONY: project project: project-announce $(if $(NO_SOURCE_GEN),,project-source-gen) $(call make-from-project-home,package.recursive) .PHONY: project-javacc-gen project-javacc-gen: makefiles $(call make-from-project-home,package-javacc-gen.recursive) .PHONY: project-source-gen project-source-gen: makefiles $(call make-from-project-home,package-source-gen.recursive) .PHONY: project-javadoc project-javadoc: $(call make-from-project-home,subproject-javadoc) .PHONY: subproject-javadoc subproject-javadoc: if [ "$(SUBPROJECT_PACKAGES)" ]; then $(call javadoc,$(SUBPROJECT_PACKAGES)); fi .PHONY: project-clean project-clean: $(call make-from-project-home,clean.recursive) .PHONY: project-realclean project-realclean: $(call make-from-project-home,realclean.recursive) $(SUBPACKAGE_MAKEFILES): makefile @if [ -e $@ ] && [ `grep -c super-ninja $@ 2> /dev/null ` -eq 0 ]; \ then echo "$@ exists but is not super-ninja, skipping"; \ else echo "(re)making $@" && \ $(RM) $@ && \ sed \ -e 's|^$(WS)PROJECT_HOME$(WS)=$(WS)\(.*\)$(WS)|PROJECT_HOME = ../\1|' \ -e 's/^$(WS)PACKAGE$(WS)=$(WS)\(.*\)$(WS)/PACKAGE = \1.$(subst /,,$(dir $@))/' \ -e 's/^$(WS)if-root-package$(WS)=.*/if-root-package = $$(2)/' \ makefile > $@; fi .PHONY: makefiles makefiles: $(SUBPACKAGE_MAKEFILES) @echo making makefiles @$(call recursively-make,makefiles,true) # make the jar key .PHONY: keygen keygen: $(JDK_HOME)/bin/keytool -genkey -keyalg rsa -alias $(JARKEY) $(JDK_HOME)/bin/keytool -export -alias $(JARKEY) -file $(JAR_CRT) # make the jar # # the jar is built containing all rsync-able files in all # $(SUBPROJECT_PACKAGES), the subproject javadoc, and the makefile from the # base package. Subproject packages ending in "." are copied non-recursively, # else they are copied recursively. # # empty dirs will not be included in the jar # # all $(EXT_JARS), if any, are folded into the jarfile # # if $(JAR_MF) exists it is used as the jar manifest # # if $(JAR_CRT) exist the jar is signed with $(JARKEY) .PHONY: jar jar: $(call make-jar,true,$(EXT_JARS),$(JARFILE),$(JARFILE_EXTS),$(JAR_EXTRA),$(SUBPROJECT_PACKAGES)) # make the lite jar # # same as the "jar" target except uses LITE_SUBPROJECT_PACKAGES, EXT_JARS_LITE, # JARFILE_LITE_EXTS, JAR_LITE_EXTRA, and never includes the javadoc tree jar-lite: $(call make-jar,false,$(EXT_JARS_LITE),$(JARFILE_LITE),$(JARFILE_LITE_EXTS),$(JAR_LITE_EXTRA),$(LITE_SUBPROJECT_PACKAGES)) # make the xlite jar # # same as the "jar-lite" target except uses XLITE_SUBPROJECT_PACKAGES, # EXT_JARS_XLITE, JARFILE_XLITE_EXTS, and JAR_XLITE_EXTRA .PHONY: jar-xlite jar-xlite: $(call make-jar,false,$(EXT_JARS_XLITE),$(JARFILE_XLITE),$(JARFILE_XLITE_EXTS),$(JAR_XLITE_EXTRA),$(XLITE_SUBPROJECT_PACKAGES)) # publish to PUBLISH_DEST # # rsyncs $(JARFILE) (and $(JARFILE_LITE), and $(JARFILE_XLITE), if any) # there AND rsync's $(JARFILE_PUBLISH_UNPACK)'s contents there .PHONY: publish ifdef PUBLISH_DEST publish: @echo publishing to $(PUBLISH_DEST) if [ $(JARFILE_PUBLISH_UNPACK) ]; then \ mkdir .$(JARFILE_PUBLISH_UNPACK)-unpack.tmp; \ cd .$(JARFILE_PUBLISH_UNPACK)-unpack.tmp && $(JAR) xvf ../$(JARFILE_PUBLISH_UNPACK) && $(call rsync,*,$(PUBLISH_DEST)); \ cd .. && rm -rf .$(JARFILE_PUBLISH_UNPACK)-unpack.tmp; \ fi if [ $(JARFILE) -a -f $(JARFILE) ]; then $(call rsync,$(JARFILE),$(PUBLISH_DEST)); fi if [ $(JARFILE_LITE) -a -f $(JARFILE_LITE) ]; then $(call rsync,$(JARFILE_LITE),$(PUBLISH_DEST)); fi if [ $(JARFILE_XLITE) -a -f $(JARFILE_XLITE) ]; then $(call rsync,$(JARFILE_XLITE),$(PUBLISH_DEST)); fi $(EXTRA_PUBLISH_CMDS) else publish: $(JARFILE) @echo PUBLISH_DEST not set $(EXTRA_PUBLISH_CMDS) endif # publish to PUBLISH_DEST # # rsyncs $(JARFILE_LITE), there .PHONY: publish-lite ifdef PUBLISH_DEST publish-lite: $(JARFILE_LITE) @echo publishing to $(PUBLISH_DEST) $(call rsync,$(JARFILE_LITE),$(PUBLISH_DEST)) $(EXTRA_PUBLISH_CMDS) else publish-lite: $(JARFILE_LITE) @echo PUBLISH_DEST not set $(EXTRA_PUBLISH_CMDS) endif visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/parser/000077500000000000000000000000001147500217100240575ustar00rootroot00000000000000visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/parser/ParseException.java000066400000000000000000000144241147500217100276600ustar00rootroot00000000000000/* Generated By:JavaCC: Do not edit this line. ParseException.java Version 3.0 */ package visolate.parser; /** * This exception is thrown when parse errors are encountered. * You can explicitly create objects of this exception type by * calling the method generateParseException in the generated * parser. * * You can modify this class to customize your error reporting * mechanisms so long as you retain the public fields. */ public class ParseException extends Exception { /** * This constructor is used by the method "generateParseException" * in the generated parser. Calling this constructor generates * a new object of this type with the fields "currentToken", * "expectedTokenSequences", and "tokenImage" set. The boolean * flag "specialConstructor" is also set to true to indicate that * this constructor was used to create this object. * This constructor calls its super class with the empty string * to force the "toString" method of parent class "Throwable" to * print the error message in the form: * ParseException: */ public ParseException(Token currentTokenVal, int[][] expectedTokenSequencesVal, String[] tokenImageVal ) { super(""); specialConstructor = true; currentToken = currentTokenVal; expectedTokenSequences = expectedTokenSequencesVal; tokenImage = tokenImageVal; } /** * The following constructors are for use by you for whatever * purpose you can think of. Constructing the exception in this * manner makes the exception behave in the normal way - i.e., as * documented in the class "Throwable". The fields "errorToken", * "expectedTokenSequences", and "tokenImage" do not contain * relevant information. The JavaCC generated code does not use * these constructors. */ public ParseException() { super(); specialConstructor = false; } public ParseException(String message) { super(message); specialConstructor = false; } /** * This variable determines which constructor was used to create * this object and thereby affects the semantics of the * "getMessage" method (see below). */ protected boolean specialConstructor; /** * This is the last token that has been consumed successfully. If * this object has been created due to a parse error, the token * followng this token will (therefore) be the first error token. */ public Token currentToken; /** * Each entry in this array is an array of integers. Each array * of integers represents a sequence of tokens (by their ordinal * values) that is expected at this point of the parse. */ public int[][] expectedTokenSequences; /** * This is a reference to the "tokenImage" array of the generated * parser within which the parse error occurred. This array is * defined in the generated ...Constants interface. */ public String[] tokenImage; /** * This method has the standard behavior when this object has been * created using the standard constructors. Otherwise, it uses * "currentToken" and "expectedTokenSequences" to generate a parse * error message and returns it. If this object has been created * due to a parse error, and you do not catch it (it gets thrown * from the parser), then this method is called during the printing * of the final stack trace, and hence the correct error message * gets displayed. */ public String getMessage() { if (!specialConstructor) { return super.getMessage(); } StringBuffer expected = new StringBuffer(); int maxSize = 0; for (int i = 0; i < expectedTokenSequences.length; i++) { if (maxSize < expectedTokenSequences[i].length) { maxSize = expectedTokenSequences[i].length; } for (int j = 0; j < expectedTokenSequences[i].length; j++) { expected.append(tokenImage[expectedTokenSequences[i][j]]).append(' '); } if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) { expected.append("..."); } expected.append(eol).append(" "); } String retval = "Encountered \""; Token tok = currentToken.next; for (int i = 0; i < maxSize; i++) { if (i != 0) retval += " "; if (tok.kind == 0) { retval += tokenImage[0]; break; } retval += add_escapes(tok.image); tok = tok.next; } retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn; retval += "." + eol; if (expectedTokenSequences.length == 1) { retval += "Was expecting:" + eol + " "; } else { retval += "Was expecting one of:" + eol + " "; } retval += expected.toString(); return retval; } /** * The end of line string for this machine. */ protected String eol = System.getProperty("line.separator", "\n"); /** * Used to convert raw characters to their escaped version * when these raw version cannot be used as part of an ASCII * string literal. */ protected String add_escapes(String str) { StringBuffer retval = new StringBuffer(); char ch; for (int i = 0; i < str.length(); i++) { switch (str.charAt(i)) { case 0 : continue; case '\b': retval.append("\\b"); continue; case '\t': retval.append("\\t"); continue; case '\n': retval.append("\\n"); continue; case '\f': retval.append("\\f"); continue; case '\r': retval.append("\\r"); continue; case '\"': retval.append("\\\""); continue; case '\'': retval.append("\\\'"); continue; case '\\': retval.append("\\\\"); continue; default: if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { String s = "0000" + Integer.toString(ch, 16); retval.append("\\u" + s.substring(s.length() - 4, s.length())); } else { retval.append(ch); } continue; } } return retval.toString(); } } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/parser/Parser.java000066400000000000000000001036431147500217100261650ustar00rootroot00000000000000/* Generated By:JavaCC: Do not edit this line. Parser.java */ package visolate.parser; import visolate.simulator.*; import java.util.*; public class Parser implements ParserConstants { private static final String cvsid = "$Id: Parser.jj,v 1.3 2006/08/26 20:17:30 vona Exp $"; public static final int HALT = 0; public static final int OPTSTOP = 1; public void setSimulator(Simulator simulator) { this.simulator = simulator; } public static void main(String args[]) throws ParseException { Parser parser = new Parser(System.in); parser.setSimulator(new Simulator()); parser.Input(); } private static double getModifier(List modifiers, int index) { return ((Double) modifiers.get(index)).doubleValue(); } private Simulator simulator; final public void Input() throws ParseException { boolean stop = false; label_1: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case PARAM_DELIM: case CODE_DELIM: case COMMENT: case 20: case 21: case 22: case 23: case 24: case 25: case 26: case 27: case 28: case 29: case 30: case 31: case 32: case 33: case 34: case 35: case 36: case 37: case 38: case 39: case 40: case 41: case 43: case 44: case 45: ; break; default: jj_la1[0] = jj_gen; break label_1; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case PARAM_DELIM: Parameter(); break; case CODE_DELIM: case COMMENT: case 20: case 21: case 22: case 23: case 24: case 25: case 26: case 27: case 28: case 29: case 30: case 31: case 32: case 33: case 34: case 35: case 36: case 37: case 38: case 39: case 40: case 41: case 43: case 44: case 45: stop = Code(); if (stop) {if (true) return;} break; default: jj_la1[1] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } jj_consume_token(0); } final public void Parameter() throws ParseException { jj_consume_token(PARAM_DELIM); label_2: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case IN: case LN: case ADD: case AM: case 46: case 47: case 54: case 60: case 63: case 65: case 66: case 67: case 68: case 69: ; break; default: jj_la1[2] = jj_gen; break label_2; } ParameterCode(); } jj_consume_token(PARAM_DELIM); } final public boolean Code() throws ParseException { int stop = -1; Token seq = null; Token t; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 20: jj_consume_token(20); seq = jj_consume_token(DIGITS); break; default: jj_la1[3] = jj_gen; ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case COMMENT: case 21: case 22: case 23: case 24: case 25: case 26: case 27: case 28: case 29: case 30: case 31: case 32: case 33: case 34: case 35: case 36: case 37: case 38: case 39: case 40: case 41: case 43: case 44: case 45: switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case COMMENT: case 21: case 22: case 23: case 24: case 25: case 26: case 27: case 28: case 29: case 30: case 31: case 32: case 33: GCode(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 34: case 35: case 36: case 37: case 38: case 39: case 40: case 41: DCode(); break; default: jj_la1[4] = jj_gen; ; } break; case 34: case 35: case 36: case 37: case 38: case 39: case 40: case 41: DCode(); break; case 43: case 44: case 45: stop = MCode(); break; default: jj_la1[5] = jj_gen; jj_consume_token(-1); throw new ParseException(); } break; default: jj_la1[6] = jj_gen; ; } t = jj_consume_token(CODE_DELIM); {if (true) return (stop == HALT) || ((stop == OPTSTOP) && !simulator.askContinue(t.beginLine, ((seq != null) ? Integer.parseInt(seq.image) : -1)));} throw new Error("Missing return statement in function"); } final public void GCode() throws ParseException { Token txt; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 21: jj_consume_token(21); simulator.setMode(Simulator.RAPID); break; case 22: jj_consume_token(22); simulator.setMode(Simulator.LINEAR); break; case 23: jj_consume_token(23); simulator.setMode(Simulator.CW); break; case 24: jj_consume_token(24); simulator.setMode(Simulator.CCW); break; case COMMENT: jj_consume_token(COMMENT); txt = jj_consume_token(TEXT); simulator.comment(txt.beginLine, txt.image); break; case 25: jj_consume_token(25); simulator.setMode(Simulator.POLYGON); break; case 26: jj_consume_token(26); simulator.setMode(Simulator.LINEAR); break; case 27: jj_consume_token(27); break; case 28: jj_consume_token(28); break; case 29: jj_consume_token(29); simulator.setMetric(); break; case 30: jj_consume_token(30); simulator.set360(false); break; case 31: jj_consume_token(31); simulator.set360(true); break; case 32: jj_consume_token(32); simulator.setIncremental(false); break; case 33: jj_consume_token(33); simulator.setIncremental(true); break; default: jj_la1[7] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } final public void DCode() throws ParseException { boolean flash = false; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 38: case 39: case 40: case 41: CoordinateDCode(); break; case 34: case 35: case 36: case 37: flash = NonCoordinateDCode(); if (flash) simulator.addFlash(); break; default: jj_la1[8] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } final public void CoordinateDCode() throws ParseException { String[] c = new String[4]; Coordinates(c); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 34: case 35: case 36: case 37: NonCoordinateDCode(); break; default: jj_la1[9] = jj_gen; ; } if ((c[2] != null) || (c[3] != null)) simulator.setCenter(c[2], c[3]); if ((c[0] != null) || (c[1] != null)) simulator.setPosition(c[0], c[1]); } final public boolean NonCoordinateDCode() throws ParseException { Token aperture = null; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 34: jj_consume_token(34); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case DIGITS: aperture = jj_consume_token(DIGITS); break; default: jj_la1[10] = jj_gen; ; } if (aperture == null) simulator.setExposure(Simulator.OPEN); else simulator.setAperture(Integer.parseInt("1" + aperture.image)); {if (true) return false;} break; case 35: jj_consume_token(35); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case DIGITS: aperture = jj_consume_token(DIGITS); break; default: jj_la1[11] = jj_gen; ; } if (aperture == null) simulator.setExposure(Simulator.CLOSED); else simulator.setAperture(Integer.parseInt("2" + aperture.image)); {if (true) return false;} break; case 36: jj_consume_token(36); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case DIGITS: aperture = jj_consume_token(DIGITS); break; default: jj_la1[12] = jj_gen; ; } if (aperture == null) simulator.setExposure(Simulator.FLASH); else simulator.setAperture(Integer.parseInt("3" + aperture.image)); {if (true) return true;} break; case 37: jj_consume_token(37); aperture = jj_consume_token(DIGITS); simulator.setAperture(Integer.parseInt(aperture.image)); {if (true) return false;} break; default: jj_la1[13] = jj_gen; jj_consume_token(-1); throw new ParseException(); } throw new Error("Missing return statement in function"); } final public void Coordinates(String[] c) throws ParseException { label_3: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 38: XCoord(c); break; case 39: YCoord(c); break; case 40: ICoord(c); break; case 41: JCoord(c); break; default: jj_la1[14] = jj_gen; jj_consume_token(-1); throw new ParseException(); } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 38: case 39: case 40: case 41: ; break; default: jj_la1[15] = jj_gen; break label_3; } } } final public void XCoord(String[] c) throws ParseException { jj_consume_token(38); c[0] = Coord(); } final public void YCoord(String[] c) throws ParseException { jj_consume_token(39); c[1] = Coord(); } final public void ICoord(String[] c) throws ParseException { jj_consume_token(40); c[2] = Coord(); } final public void JCoord(String[] c) throws ParseException { jj_consume_token(41); c[3] = Coord(); } final public String Coord() throws ParseException { Token sign = null, digits; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case SIGN: sign = jj_consume_token(SIGN); break; default: jj_la1[16] = jj_gen; ; } digits = jj_consume_token(DIGITS); {if (true) return ((sign != null) ? sign.image : "") + digits.image;} throw new Error("Missing return statement in function"); } final public double Double() throws ParseException { Token sign = null, digitsBefore = null, digitsAfter = null; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case SIGN: sign = jj_consume_token(SIGN); break; default: jj_la1[17] = jj_gen; ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case DIGITS: digitsBefore = jj_consume_token(DIGITS); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 42: jj_consume_token(42); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case DIGITS: digitsAfter = jj_consume_token(DIGITS); break; default: jj_la1[18] = jj_gen; ; } break; default: jj_la1[19] = jj_gen; ; } break; case 42: jj_consume_token(42); digitsAfter = jj_consume_token(DIGITS); break; default: jj_la1[20] = jj_gen; jj_consume_token(-1); throw new ParseException(); } double value = Double.parseDouble( ((digitsBefore != null) ? digitsBefore.image : "") + ((digitsAfter != null) ? "." + digitsAfter.image : "")); if ((sign != null) && ("-".equals(sign.image))) value = -value; {if (true) return value;} throw new Error("Missing return statement in function"); } final public int MCode() throws ParseException { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 43: jj_consume_token(43); {if (true) return HALT;} break; case 44: jj_consume_token(44); {if (true) return OPTSTOP;} break; case 45: jj_consume_token(45); {if (true) return HALT;} break; default: jj_la1[21] = jj_gen; jj_consume_token(-1); throw new ParseException(); } throw new Error("Missing return statement in function"); } final public void ParameterCode() throws ParseException { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 46: InputEncoding(); break; case 67: Offset(); break; case 54: FormatStatement(); break; case 60: ImagePolarity(); break; case 63: LayerPolarity(); break; case ADD: ApertureDescription(); break; case AM: ApertureMacro(); break; case 47: AxisSelect(); break; case IN: ImageName(); break; case 65: case 66: Mode(); break; case 68: ScaleFactor(); break; case LN: LayerName(); break; case 69: StepAndRepeat(); break; default: jj_la1[22] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } final public void InputEncoding() throws ParseException { Token e; jj_consume_token(46); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 47: e = jj_consume_token(47); break; case 48: e = jj_consume_token(48); break; case 49: e = jj_consume_token(49); break; case 50: e = jj_consume_token(50); break; case 51: e = jj_consume_token(51); break; default: jj_la1[23] = jj_gen; jj_consume_token(-1); throw new ParseException(); } jj_consume_token(CODE_DELIM); if (!"AS".equals(e.image) && !"IS".equals(e.image)) System.err.println( "WARNING: unsupported image encoding \"" + e.image + "\""); } final public void AxisSelect() throws ParseException { Token a, b; jj_consume_token(47); jj_consume_token(52); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 38: a = jj_consume_token(38); break; case 39: a = jj_consume_token(39); break; default: jj_la1[24] = jj_gen; jj_consume_token(-1); throw new ParseException(); } jj_consume_token(53); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 38: b = jj_consume_token(38); break; case 39: b = jj_consume_token(39); break; default: jj_la1[25] = jj_gen; jj_consume_token(-1); throw new ParseException(); } jj_consume_token(CODE_DELIM); System.err.println( "WARNING: ignoring axis select ASA" + a.image + "B" + b.image); } final public void FormatStatement() throws ParseException { Token ignore, mode, fmt; jj_consume_token(54); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 55: case 56: switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 55: ignore = jj_consume_token(55); break; case 56: ignore = jj_consume_token(56); break; default: jj_la1[26] = jj_gen; jj_consume_token(-1); throw new ParseException(); } if ("T".equals(ignore.image)) simulator.ignoreTrailingZeros(); break; default: jj_la1[27] = jj_gen; ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 40: case 52: switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 52: mode = jj_consume_token(52); break; case 40: mode = jj_consume_token(40); break; default: jj_la1[28] = jj_gen; jj_consume_token(-1); throw new ParseException(); } if ("I".equals(mode.image)) simulator.setIncremental(true); else simulator.setIncremental(false); break; default: jj_la1[29] = jj_gen; ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 20: jj_consume_token(20); jj_consume_token(DIGITS); break; default: jj_la1[30] = jj_gen; ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 57: jj_consume_token(57); jj_consume_token(DIGITS); break; default: jj_la1[31] = jj_gen; ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 38: jj_consume_token(38); fmt = jj_consume_token(DIGITS); if (fmt.image.length() != 2) { System.err.println("WARNING: ignoring bad X format, not 2 digits: " + fmt); } else { simulator.setFormatX(Integer.parseInt(fmt.image.substring(0, 1)), Integer.parseInt(fmt.image.substring(1, 2))); } break; default: jj_la1[32] = jj_gen; ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 39: jj_consume_token(39); fmt = jj_consume_token(DIGITS); if (fmt.image.length() != 2) { System.err.println("WARNING: ignoring bad Y format, not 2 digits: " + fmt); } else { simulator.setFormatY(Integer.parseInt(fmt.image.substring(0, 1)), Integer.parseInt(fmt.image.substring(1, 2))); } break; default: jj_la1[33] = jj_gen; ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 58: jj_consume_token(58); jj_consume_token(DIGITS); break; default: jj_la1[34] = jj_gen; ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 37: jj_consume_token(37); jj_consume_token(DIGITS); break; default: jj_la1[35] = jj_gen; ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 59: jj_consume_token(59); jj_consume_token(DIGITS); break; default: jj_la1[36] = jj_gen; ; } jj_consume_token(CODE_DELIM); } final public void ImageName() throws ParseException { Token name; jj_consume_token(IN); name = jj_consume_token(TEXT); jj_consume_token(CODE_DELIM); System.out.println("image name: " + name.image); } final public void ImagePolarity() throws ParseException { Token polarity; jj_consume_token(60); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 61: polarity = jj_consume_token(61); break; case 62: polarity = jj_consume_token(62); break; default: jj_la1[37] = jj_gen; jj_consume_token(-1); throw new ParseException(); } jj_consume_token(CODE_DELIM); System.err.println("WARNING: ignoring image polarity IP" + polarity.image); } final public void LayerName() throws ParseException { Token name; jj_consume_token(LN); name = jj_consume_token(TEXT); jj_consume_token(CODE_DELIM); System.out.println("layer name: " + name.image); } final public void LayerPolarity() throws ParseException { Token polarity; jj_consume_token(63); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 64: polarity = jj_consume_token(64); break; case 37: polarity = jj_consume_token(37); break; default: jj_la1[38] = jj_gen; jj_consume_token(-1); throw new ParseException(); } jj_consume_token(CODE_DELIM); System.err.println("WARNING: ignoring layer polarity LP" + polarity.image); } final public void Mode() throws ParseException { Token mode; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 65: mode = jj_consume_token(65); break; case 66: mode = jj_consume_token(66); break; default: jj_la1[39] = jj_gen; jj_consume_token(-1); throw new ParseException(); } jj_consume_token(CODE_DELIM); if ("MOMM".equals(mode.image)) simulator.setMetric(); } final public void Offset() throws ParseException { double a = Double.NaN, b = Double.NaN; jj_consume_token(67); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 52: jj_consume_token(52); a = Double(); break; default: jj_la1[40] = jj_gen; ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 53: jj_consume_token(53); b = Double(); break; default: jj_la1[41] = jj_gen; ; } jj_consume_token(CODE_DELIM); System.err.println("WARNING: ignoring offset OF" + ((!Double.isNaN(a)) ? ("A" + a) : "") + ((!Double.isNaN(b)) ? ("B" + b) : "")); } final public void ScaleFactor() throws ParseException { double a = Double.NaN, b = Double.NaN; jj_consume_token(68); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 52: jj_consume_token(52); a = Double(); break; default: jj_la1[42] = jj_gen; ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 53: jj_consume_token(53); b = Double(); break; default: jj_la1[43] = jj_gen; ; } jj_consume_token(CODE_DELIM); System.err.println("WARNING: ignoring scale factor SF" + ((!Double.isNaN(a)) ? ("A" + a) : "") + ((!Double.isNaN(b)) ? ("B" + b) : "")); } final public void StepAndRepeat() throws ParseException { Token x = null; Token y = null; double i = Double.NaN; double j = Double.NaN; jj_consume_token(69); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 38: jj_consume_token(38); x = jj_consume_token(DIGITS); break; default: jj_la1[44] = jj_gen; ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 39: jj_consume_token(39); y = jj_consume_token(DIGITS); break; default: jj_la1[45] = jj_gen; ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 40: jj_consume_token(40); i = Double(); break; default: jj_la1[46] = jj_gen; ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 41: jj_consume_token(41); j = Double(); break; default: jj_la1[47] = jj_gen; ; } jj_consume_token(CODE_DELIM); System.err.println("WARNING: ignoring step and repeat SR" + ((x != null) ? ("X" + x.image) : "") + ((y != null) ? ("Y" + y.image) : "") + ((!Double.isNaN(i)) ? ("I" + i) : "") + ((!Double.isNaN(j)) ? ("J" + j) : "")); } final public void ApertureDescription() throws ParseException { Token number; Token typeToken; List modifiers = new LinkedList(); jj_consume_token(ADD); number = jj_consume_token(DIGITS2); typeToken = jj_consume_token(ALNUMS); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 70: jj_consume_token(70); ModifierList(modifiers); break; default: jj_la1[48] = jj_gen; ; } jj_consume_token(CODE_DELIM); int num = Integer.parseInt(number.image); String type = typeToken.image; if ("C".equals(type)) { switch (modifiers.size()) { case 0: System.err.println( "WARNING: ignoring circle aperture with no modifiers on line " + number.beginLine); break; case 1: simulator. addAperture(new CircleAperture(num, getModifier(modifiers, 0))); break; case 2: simulator. addAperture(new CircleAperture(num, getModifier(modifiers, 0), getModifier(modifiers, 1))); break; case 3: simulator. addAperture(new CircleAperture(num, getModifier(modifiers, 0), getModifier(modifiers, 1), getModifier(modifiers, 2))); break; default: System.err.println( "WARNING: ignoring circle aperture with extra modifiers on line " + number.beginLine); break; } } else if ("R".equals(type)) { switch (modifiers.size()) { case 0: case 1: System.err.println( "WARNING: ignoring rectangle aperture with < 2 modifiers on line " + number.beginLine); break; case 2: simulator. addAperture(new RectangleAperture(num, getModifier(modifiers, 0), getModifier(modifiers, 1))); break; case 3: simulator. addAperture(new RectangleAperture(num, getModifier(modifiers, 0), getModifier(modifiers, 1), getModifier(modifiers, 2))); break; case 4: simulator. addAperture(new RectangleAperture(num, getModifier(modifiers, 0), getModifier(modifiers, 1), getModifier(modifiers, 2), getModifier(modifiers, 3))); break; default: System.err.println( "WARNING: ignoring rectangle aperture with extra modifiers on line "+ number.beginLine); break; } } else if ("O".equals(type)) { switch (modifiers.size()) { case 0: case 1: System.err.println( "WARNING: ignoring obround aperture with < 2 modifiers on line " + number.beginLine); break; case 2: simulator. addAperture(new ObroundAperture(num, getModifier(modifiers, 0), getModifier(modifiers, 1))); break; case 3: simulator. addAperture(new ObroundAperture(num, getModifier(modifiers, 0), getModifier(modifiers, 1), getModifier(modifiers, 2))); break; case 4: simulator. addAperture(new ObroundAperture(num, getModifier(modifiers, 0), getModifier(modifiers, 1), getModifier(modifiers, 2), getModifier(modifiers, 3))); break; default: System.err.println( "WARNING: ignoring obround aperture with extra modifiers on line "+ number.beginLine); break; } } else if ("P".equals(type)) { switch (modifiers.size()) { case 0: case 1: System.err.println( "WARNING: ignoring polygon aperture with < 2 modifiers on line " + number.beginLine); break; case 2: simulator. addAperture(new PolygonAperture(num, getModifier(modifiers, 0), (int) getModifier(modifiers, 1))); break; case 3: simulator. addAperture(new PolygonAperture(num, getModifier(modifiers, 0), (int) getModifier(modifiers, 1), getModifier(modifiers, 2))); break; case 4: simulator. addAperture(new PolygonAperture(num, getModifier(modifiers, 0), (int) getModifier(modifiers, 1), getModifier(modifiers, 2), getModifier(modifiers, 3))); case 5: simulator. addAperture(new PolygonAperture(num, getModifier(modifiers, 0), (int) getModifier(modifiers, 1), getModifier(modifiers, 2), getModifier(modifiers, 3), getModifier(modifiers, 4))); break; default: System.err.println( "WARNING: ignoring polygon aperture with extra modifiers on line "+ number.beginLine); break; } } else { try { simulator.addAperture(new MacroAperture(Integer.parseInt(number.image), simulator.getMacro(type), modifiers)); } catch (NoSuchElementException e) { System.err.println( "WARNING: ignoring aperture definition on line " + number.beginLine + " which references unknown aperture macro \"" + type + "\""); } } } final public void ModifierList(List list) throws ParseException { double modifier; modifier = Double(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 38: jj_consume_token(38); ModifierList(list); break; default: jj_la1[49] = jj_gen; ; } list.add(0, new Double(modifier)); } final public void ApertureMacro() throws ParseException { Token name; List primitives = new LinkedList(); jj_consume_token(AM); name = jj_consume_token(TEXT); jj_consume_token(CODE_DELIM); PrimitiveList(primitives); simulator.addMacro(new Macro(name.image, primitives)); } final public void PrimitiveList(final List primitives) throws ParseException { MacroPrimitive primitive; primitive = Primitive(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case CODE_DELIM: case DIGITS: PrimitiveList(primitives); break; default: jj_la1[50] = jj_gen; ; } if (primitive != null) { primitives.add(0, primitive); } } final public MacroPrimitive Primitive() throws ParseException { List exprs = new LinkedList(); Token numberToken; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case CODE_DELIM: jj_consume_token(CODE_DELIM); {if (true) return null;} break; case DIGITS: numberToken = jj_consume_token(DIGITS); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 70: jj_consume_token(70); ExprList(exprs); break; default: jj_la1[51] = jj_gen; ; } jj_consume_token(CODE_DELIM); int primitiveNumber = Integer.parseInt(numberToken.image); switch (primitiveNumber) { case 1: {if (true) return new CirclePrimitive(exprs);} case 2: {if (true) return new LineVectorPrimitive(exprs);} case 20: {if (true) return new LineVectorPrimitive(exprs);} case 21: {if (true) return new LineCenterPrimitive(exprs);} case 22: {if (true) return new LineLLPrimitive(exprs);} case 3: {if (true) return null;} case 4: {if (true) return new OutlinePrimitive(exprs);} case 5: {if (true) return new PolygonPrimitive(exprs);} case 6: {if (true) return new MoirePrimitive(exprs);} case 7: {if (true) return new ThermalPrimitive(exprs);} default: System.err.println("WARNING: ignoring unknown macro primitive type " + primitiveNumber); {if (true) return null;} } break; default: jj_la1[52] = jj_gen; jj_consume_token(-1); throw new ParseException(); } throw new Error("Missing return statement in function"); } final public void ExprList(final List exprs) throws ParseException { MacroExpression expr; expr = Expr(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 70: jj_consume_token(70); ExprList(exprs); break; default: jj_la1[53] = jj_gen; ; } exprs.add(0, expr); } final public MacroExpression Expr() throws ParseException { MacroExpression lhs = null; MacroExpression rhs = null; Token op = null; lhs = MulExpr(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case SIGN: op = jj_consume_token(SIGN); rhs = MulExpr(); break; default: jj_la1[54] = jj_gen; ; } if (rhs == null) {if (true) return lhs;} {if (true) return new MacroBinOp((("+".equals(op.image)) ? MacroBinOp.ADD : MacroBinOp.SUBTRACT), lhs, rhs);} throw new Error("Missing return statement in function"); } final public MacroExpression MulExpr() throws ParseException { MacroExpression lhs = null; MacroExpression rhs = null; Token op = null; lhs = UnaryExpr(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 38: case 71: case 72: switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case 38: op = jj_consume_token(38); break; case 71: op = jj_consume_token(71); break; case 72: op = jj_consume_token(72); break; default: jj_la1[55] = jj_gen; jj_consume_token(-1); throw new ParseException(); } rhs = UnaryExpr(); break; default: jj_la1[56] = jj_gen; ; } if (op == null) {if (true) return lhs;} int operator = MacroBinOp.MULTIPLY; if ("-".equals(op.image)) operator = MacroBinOp.DIVIDE; {if (true) return new MacroBinOp(operator, lhs, rhs);} throw new Error("Missing return statement in function"); } final public MacroExpression UnaryExpr() throws ParseException { double value; Token index; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case SIGN: case DIGITS: case 42: value = Double(); {if (true) return new MacroConstant(value);} break; case 73: jj_consume_token(73); index = jj_consume_token(DIGITS); {if (true) return new MacroVariable(Integer.parseInt(index.image));} break; default: jj_la1[57] = jj_gen; jj_consume_token(-1); throw new ParseException(); } throw new Error("Missing return statement in function"); } public ParserTokenManager token_source; SimpleCharStream jj_input_stream; public Token token, jj_nt; private int jj_ntk; private int jj_gen; final private int[] jj_la1 = new int[58]; static private int[] jj_la1_0; static private int[] jj_la1_1; static private int[] jj_la1_2; static { jj_la1_0(); jj_la1_1(); jj_la1_2(); } private static void jj_la1_0() { jj_la1_0 = new int[] {0xfff04060,0xfff04060,0x3c00,0x100000,0x0,0xffe04000,0xffe04000,0xffe04000,0x0,0x0,0x100,0x100,0x100,0x0,0x0,0x0,0x80,0x80,0x100,0x0,0x100,0x0,0x3c00,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x100000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x140,0x0,0x140,0x0,0x80,0x0,0x0,0x180,}; } private static void jj_la1_1() { jj_la1_1 = new int[] {0x3bff,0x3bff,0x9040c000,0x0,0x3fc,0x3bff,0x3bff,0x3,0x3fc,0x3c,0x0,0x0,0x0,0x3c,0x3c0,0x3c0,0x0,0x0,0x0,0x400,0x400,0x3800,0x9040c000,0xf8000,0xc0,0xc0,0x1800000,0x1800000,0x100100,0x100100,0x0,0x2000000,0x40,0x80,0x4000000,0x20,0x8000000,0x60000000,0x20,0x0,0x100000,0x200000,0x100000,0x200000,0x40,0x80,0x100,0x200,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x40,0x40,0x400,}; } private static void jj_la1_2() { jj_la1_2 = new int[] {0x0,0x0,0x3e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x6,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x40,0x0,0x40,0x0,0x180,0x180,0x200,}; } public Parser(java.io.InputStream stream) { this(stream, null); } public Parser(java.io.InputStream stream, String encoding) { try { jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); } token_source = new ParserTokenManager(jj_input_stream); token = new Token(); jj_ntk = -1; jj_gen = 0; for (int i = 0; i < 58; i++) jj_la1[i] = -1; } public void ReInit(java.io.InputStream stream) { ReInit(stream, null); } public void ReInit(java.io.InputStream stream, String encoding) { try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); } token_source.ReInit(jj_input_stream); token = new Token(); jj_ntk = -1; jj_gen = 0; for (int i = 0; i < 58; i++) jj_la1[i] = -1; } public Parser(java.io.Reader stream) { jj_input_stream = new SimpleCharStream(stream, 1, 1); token_source = new ParserTokenManager(jj_input_stream); token = new Token(); jj_ntk = -1; jj_gen = 0; for (int i = 0; i < 58; i++) jj_la1[i] = -1; } public void ReInit(java.io.Reader stream) { jj_input_stream.ReInit(stream, 1, 1); token_source.ReInit(jj_input_stream); token = new Token(); jj_ntk = -1; jj_gen = 0; for (int i = 0; i < 58; i++) jj_la1[i] = -1; } public Parser(ParserTokenManager tm) { token_source = tm; token = new Token(); jj_ntk = -1; jj_gen = 0; for (int i = 0; i < 58; i++) jj_la1[i] = -1; } public void ReInit(ParserTokenManager tm) { token_source = tm; token = new Token(); jj_ntk = -1; jj_gen = 0; for (int i = 0; i < 58; i++) jj_la1[i] = -1; } final private Token jj_consume_token(int kind) throws ParseException { Token oldToken; if ((oldToken = token).next != null) token = token.next; else token = token.next = token_source.getNextToken(); jj_ntk = -1; if (token.kind == kind) { jj_gen++; return token; } token = oldToken; jj_kind = kind; throw generateParseException(); } final public Token getNextToken() { if (token.next != null) token = token.next; else token = token.next = token_source.getNextToken(); jj_ntk = -1; jj_gen++; return token; } final public Token getToken(int index) { Token t = token; for (int i = 0; i < index; i++) { if (t.next != null) t = t.next; else t = t.next = token_source.getNextToken(); } return t; } final private int jj_ntk() { if ((jj_nt=token.next) == null) return (jj_ntk = (token.next=token_source.getNextToken()).kind); else return (jj_ntk = jj_nt.kind); } private java.util.Vector jj_expentries = new java.util.Vector(); private int[] jj_expentry; private int jj_kind = -1; public ParseException generateParseException() { jj_expentries.removeAllElements(); boolean[] la1tokens = new boolean[74]; for (int i = 0; i < 74; i++) { la1tokens[i] = false; } if (jj_kind >= 0) { la1tokens[jj_kind] = true; jj_kind = -1; } for (int i = 0; i < 58; i++) { if (jj_la1[i] == jj_gen) { for (int j = 0; j < 32; j++) { if ((jj_la1_0[i] & (1< //} SKIP : { " " | "\t" | "\n" | "\r" } TOKEN : { < PARAM_DELIM: "%" > | < CODE_DELIM: "*" > | < SIGN: ["+","-"] > | < DIGITS: ()+ > | < DIGIT: ["0"-"9"] > | < IN: "IN" > : TEXT_EXPECTED | < LN: "LN" > : TEXT_EXPECTED | < ADD: "ADD" > : ALNUMS_EXPECTED | < AM: "AM" > : TEXT_EXPECTED | < COMMENT: "G04" > : TEXT_EXPECTED } < TEXT_EXPECTED > TOKEN : { < TEXT: (~["*","\n","\r"])* > : DEFAULT } < ALNUMS_EXPECTED > TOKEN : { < DIGITS2: ()+ > | < DIGIT2: ["0"-"9"] > | < ALNUMS: (|)* > : DEFAULT | < AL: ["a"-"z","A"-"Z"] > } void Input() : { boolean stop = false; } { ( Parameter() | stop = Code() { if (stop) return; } )* } void Parameter() : {} { ( ParameterCode() )* } boolean Code() : { int stop = -1; Token seq = null; Token t; } { [ "N" seq = ] [ GCode() [ DCode() ] | DCode() | stop = MCode() ] t = { return (stop == HALT) || ((stop == OPTSTOP) && !simulator.askContinue(t.beginLine, ((seq != null) ? Integer.parseInt(seq.image) : -1))); } } void GCode() : { Token txt; } { "G00" //move { simulator.setMode(Simulator.RAPID); } | "G01" //linear interp 1x { simulator.setMode(Simulator.LINEAR); } | "G02" //CW circular interp { simulator.setMode(Simulator.CW); } | "G03" //CCW circular interp { simulator.setMode(Simulator.CCW); } | txt = //comment { simulator.comment(txt.beginLine, txt.image); } | "G36" //polygon area fill on { simulator.setMode(Simulator.POLYGON); } | "G37" //polygon area fill off { simulator.setMode(Simulator.LINEAR); } | "G54" //tool prepare //ignore | "G70" //specify inches //ignore | "G71" //specify millimeters { simulator.setMetric(); } | "G74" //360deg circular interp off { simulator.set360(false); } | "G75" //360deg circular interp on { simulator.set360(true); } | "G90" //specify absolute { simulator.setIncremental(false); } | "G91" //specify incremental { simulator.setIncremental(true); } } void DCode() : { boolean flash = false; } { CoordinateDCode() | flash = NonCoordinateDCode() { if (flash) simulator.addFlash(); } } void CoordinateDCode() : { String[] c = new String[4]; } { Coordinates(c) [ NonCoordinateDCode() ] { if ((c[2] != null) || (c[3] != null)) simulator.setCenter(c[2], c[3]); if ((c[0] != null) || (c[1] != null)) simulator.setPosition(c[0], c[1]); } } boolean NonCoordinateDCode() : { Token aperture = null; } { ( "D01" [ aperture = ] ) //exposure on { if (aperture == null) simulator.setExposure(Simulator.OPEN); else simulator.setAperture(Integer.parseInt("1" + aperture.image)); return false; } | ( "D02" [ aperture = ] ) //exposure off { if (aperture == null) simulator.setExposure(Simulator.CLOSED); else simulator.setAperture(Integer.parseInt("2" + aperture.image)); return false; } | ( "D03" [ aperture = ] ) //flash { if (aperture == null) simulator.setExposure(Simulator.FLASH); else simulator.setAperture(Integer.parseInt("3" + aperture.image)); return true; } | "D" aperture = //select aperture { simulator.setAperture(Integer.parseInt(aperture.image)); return false; } } void Coordinates(String[] c) : {} { ( XCoord(c) | YCoord(c) | ICoord(c) | JCoord(c) )+ } void XCoord(String[] c) : {} { "X" c[0] = Coord() } void YCoord(String[] c) : {} { "Y" c[1] = Coord() } void ICoord(String[] c) : {} { "I" c[2] = Coord() } void JCoord(String[] c) : {} { "J" c[3] = Coord() } String Coord() : { Token sign = null, digits; } { [ sign = ] digits = { return ((sign != null) ? sign.image : "") + digits.image; } } double Double() : { Token sign = null, digitsBefore = null, digitsAfter = null; } { [ sign = ] ( digitsBefore = [ "." [ digitsAfter = ] ] | "." digitsAfter = ) { double value = Double.parseDouble( ((digitsBefore != null) ? digitsBefore.image : "") + ((digitsAfter != null) ? "." + digitsAfter.image : "")); if ((sign != null) && ("-".equals(sign.image))) value = -value; return value; } } int MCode() : {} { "M00" //program stop { return HALT; } | "M01" //optional stop { return OPTSTOP; } | "M02" //end of program { return HALT; } } void ParameterCode() : {} { InputEncoding() | Offset() | FormatStatement() | ImagePolarity() | LayerPolarity() | ApertureDescription() | ApertureMacro() | AxisSelect() | ImageName() | Mode() | ScaleFactor() | LayerName() | StepAndRepeat() } void InputEncoding() : { Token e; } { "IC" ( e = "AS" | e = "EB" | e = "BC" | e = "IS" | e = "EI" ) { if (!"AS".equals(e.image) && !"IS".equals(e.image)) System.err.println( "WARNING: unsupported image encoding \"" + e.image + "\""); } } void AxisSelect() : { Token a, b; } { "AS" "A" ( a = "X" | a = "Y" ) "B" ( b = "X" | b = "Y" ) {System.err.println( "WARNING: ignoring axis select ASA" + a.image + "B" + b.image);} } void FormatStatement() : { Token ignore, mode, fmt; } { "FS" [ ( ignore = "L" | ignore = "T" ) { if ("T".equals(ignore.image)) simulator.ignoreTrailingZeros(); } ] [ ( mode = "A" | mode = "I" ) { if ("I".equals(mode.image)) simulator.setIncremental(true); else simulator.setIncremental(false); } ] [ "N" ] [ "G" ] [ "X" fmt = { if (fmt.image.length() != 2) { System.err.println("WARNING: ignoring bad X format, not 2 digits: " + fmt); } else { simulator.setFormatX(Integer.parseInt(fmt.image.substring(0, 1)), Integer.parseInt(fmt.image.substring(1, 2))); } } ] [ "Y" fmt = { if (fmt.image.length() != 2) { System.err.println("WARNING: ignoring bad Y format, not 2 digits: " + fmt); } else { simulator.setFormatY(Integer.parseInt(fmt.image.substring(0, 1)), Integer.parseInt(fmt.image.substring(1, 2))); } } ] [ "Z" ] [ "D" ] [ "M" ] } void ImageName() : { Token name; } { name = {System.out.println("image name: " + name.image);} } void ImagePolarity() : { Token polarity; } { "IP" ( polarity = "POS" | polarity = "NEG" ) {System.err.println("WARNING: ignoring image polarity IP" + polarity.image);} } void LayerName() : { Token name; } { name = {System.out.println("layer name: " + name.image);} } void LayerPolarity() : { Token polarity; } { "LP" ( polarity = "C" | polarity = "D" ) {System.err.println("WARNING: ignoring layer polarity LP" + polarity.image);} } void Mode() : { Token mode; } { ( mode = "MOIN" | mode = "MOMM" ) {if ("MOMM".equals(mode.image)) simulator.setMetric();} } void Offset() : { double a = Double.NaN, b = Double.NaN; } { "OF" [ "A" a = Double() ] [ "B" b = Double() ] {System.err.println("WARNING: ignoring offset OF" + ((!Double.isNaN(a)) ? ("A" + a) : "") + ((!Double.isNaN(b)) ? ("B" + b) : ""));} } void ScaleFactor() : { double a = Double.NaN, b = Double.NaN; } { "SF" [ "A" a = Double() ] [ "B" b = Double() ] {System.err.println("WARNING: ignoring scale factor SF" + ((!Double.isNaN(a)) ? ("A" + a) : "") + ((!Double.isNaN(b)) ? ("B" + b) : ""));} } void StepAndRepeat() : { Token x = null; Token y = null; double i = Double.NaN; double j = Double.NaN; } { "SR" [ "X" x = ] [ "Y" y = ] [ "I" i = Double() ] [ "J" j = Double() ] {System.err.println("WARNING: ignoring step and repeat SR" + ((x != null) ? ("X" + x.image) : "") + ((y != null) ? ("Y" + y.image) : "") + ((!Double.isNaN(i)) ? ("I" + i) : "") + ((!Double.isNaN(j)) ? ("J" + j) : ""));} } void ApertureDescription() : { Token number; Token typeToken; List modifiers = new LinkedList(); } { number = typeToken = [ "," ModifierList(modifiers) ] { int num = Integer.parseInt(number.image); String type = typeToken.image; if ("C".equals(type)) { switch (modifiers.size()) { case 0: System.err.println( "WARNING: ignoring circle aperture with no modifiers on line " + number.beginLine); break; case 1: simulator. addAperture(new CircleAperture(num, getModifier(modifiers, 0))); break; case 2: simulator. addAperture(new CircleAperture(num, getModifier(modifiers, 0), getModifier(modifiers, 1))); break; case 3: simulator. addAperture(new CircleAperture(num, getModifier(modifiers, 0), getModifier(modifiers, 1), getModifier(modifiers, 2))); break; default: System.err.println( "WARNING: ignoring circle aperture with extra modifiers on line " + number.beginLine); break; } } else if ("R".equals(type)) { switch (modifiers.size()) { case 0: case 1: System.err.println( "WARNING: ignoring rectangle aperture with < 2 modifiers on line " + number.beginLine); break; case 2: simulator. addAperture(new RectangleAperture(num, getModifier(modifiers, 0), getModifier(modifiers, 1))); break; case 3: simulator. addAperture(new RectangleAperture(num, getModifier(modifiers, 0), getModifier(modifiers, 1), getModifier(modifiers, 2))); break; case 4: simulator. addAperture(new RectangleAperture(num, getModifier(modifiers, 0), getModifier(modifiers, 1), getModifier(modifiers, 2), getModifier(modifiers, 3))); break; default: System.err.println( "WARNING: ignoring rectangle aperture with extra modifiers on line "+ number.beginLine); break; } } else if ("O".equals(type)) { switch (modifiers.size()) { case 0: case 1: System.err.println( "WARNING: ignoring obround aperture with < 2 modifiers on line " + number.beginLine); break; case 2: simulator. addAperture(new ObroundAperture(num, getModifier(modifiers, 0), getModifier(modifiers, 1))); break; case 3: simulator. addAperture(new ObroundAperture(num, getModifier(modifiers, 0), getModifier(modifiers, 1), getModifier(modifiers, 2))); break; case 4: simulator. addAperture(new ObroundAperture(num, getModifier(modifiers, 0), getModifier(modifiers, 1), getModifier(modifiers, 2), getModifier(modifiers, 3))); break; default: System.err.println( "WARNING: ignoring obround aperture with extra modifiers on line "+ number.beginLine); break; } } else if ("P".equals(type)) { switch (modifiers.size()) { case 0: case 1: System.err.println( "WARNING: ignoring polygon aperture with < 2 modifiers on line " + number.beginLine); break; case 2: simulator. addAperture(new PolygonAperture(num, getModifier(modifiers, 0), (int) getModifier(modifiers, 1))); break; case 3: simulator. addAperture(new PolygonAperture(num, getModifier(modifiers, 0), (int) getModifier(modifiers, 1), getModifier(modifiers, 2))); break; case 4: simulator. addAperture(new PolygonAperture(num, getModifier(modifiers, 0), (int) getModifier(modifiers, 1), getModifier(modifiers, 2), getModifier(modifiers, 3))); case 5: simulator. addAperture(new PolygonAperture(num, getModifier(modifiers, 0), (int) getModifier(modifiers, 1), getModifier(modifiers, 2), getModifier(modifiers, 3), getModifier(modifiers, 4))); break; default: System.err.println( "WARNING: ignoring polygon aperture with extra modifiers on line "+ number.beginLine); break; } } else { try { simulator.addAperture(new MacroAperture(Integer.parseInt(number.image), simulator.getMacro(type), modifiers)); } catch (NoSuchElementException e) { System.err.println( "WARNING: ignoring aperture definition on line " + number.beginLine + " which references unknown aperture macro \"" + type + "\""); } } } } void ModifierList(List list) : { double modifier; } { modifier = Double() [ "X" ModifierList(list) ] {list.add(0, new Double(modifier));} } void ApertureMacro() : { Token name; List primitives = new LinkedList(); } { name = PrimitiveList(primitives) { simulator.addMacro(new Macro(name.image, primitives)); } } void PrimitiveList(List primitives) : { MacroPrimitive primitive; } { primitive = Primitive() [ PrimitiveList(primitives) ] { if (primitive != null) primitives.add(0, primitive); } } MacroPrimitive Primitive() : { List exprs = new LinkedList(); Token numberToken; } { { return null; } | numberToken = [ "," ExprList(exprs) ] { int primitiveNumber = Integer.parseInt(numberToken.image); switch (primitiveNumber) { case 1: return new CirclePrimitive(exprs); case 2: return new LineVectorPrimitive(exprs); case 20: return new LineVectorPrimitive(exprs); case 21: return new LineCenterPrimitive(exprs); case 22: return new LineLLPrimitive(exprs); case 3: return null; case 4: return new OutlinePrimitive(exprs); case 5: return new PolygonPrimitive(exprs); case 6: return new MoirePrimitive(exprs); case 7: return new ThermalPrimitive(exprs); default: System.err.println("WARNING: ignoring unknown macro primitive type " + primitiveNumber); return null; } } } void ExprList(List exprs) : { MacroExpression expr; } { expr = Expr() [ "," ExprList(exprs) ] {exprs.add(0, expr);} } MacroExpression Expr() : { MacroExpression lhs = null; MacroExpression rhs = null; Token op = null; } { lhs = MulExpr() [ op = rhs = MulExpr() ] { if (rhs == null) return lhs; return new MacroBinOp((("+".equals(op.image)) ? MacroBinOp.ADD : MacroBinOp.SUBTRACT), lhs, rhs); } } MacroExpression MulExpr() : { MacroExpression lhs = null; MacroExpression rhs = null; Token op = null; } { lhs = UnaryExpr() [ ( op = "X" | op = "x" | op = "/" ) rhs = UnaryExpr() ] { if (op == null) return lhs; int operator = MacroBinOp.MULTIPLY; if ("-".equals(op.image)) operator = MacroBinOp.DIVIDE; return new MacroBinOp(operator, lhs, rhs); } } MacroExpression UnaryExpr() : { double value; Token index; } { value = Double() { return new MacroConstant(value); } | "$" index = { return new MacroVariable(Integer.parseInt(index.image)); } } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/parser/ParserConstants.java000066400000000000000000000030451147500217100300550ustar00rootroot00000000000000/* Generated By:JavaCC: Do not edit this line. ParserConstants.java */ package visolate.parser; public interface ParserConstants { int EOF = 0; int PARAM_DELIM = 5; int CODE_DELIM = 6; int SIGN = 7; int DIGITS = 8; int DIGIT = 9; int IN = 10; int LN = 11; int ADD = 12; int AM = 13; int COMMENT = 14; int TEXT = 15; int DIGITS2 = 16; int DIGIT2 = 17; int ALNUMS = 18; int AL = 19; int DEFAULT = 0; int TEXT_EXPECTED = 1; int ALNUMS_EXPECTED = 2; String[] tokenImage = { "", "\" \"", "\"\\t\"", "\"\\n\"", "\"\\r\"", "\"%\"", "\"*\"", "", "", "", "\"IN\"", "\"LN\"", "\"ADD\"", "\"AM\"", "\"G04\"", "", "", "", "", "", "\"N\"", "\"G00\"", "\"G01\"", "\"G02\"", "\"G03\"", "\"G36\"", "\"G37\"", "\"G54\"", "\"G70\"", "\"G71\"", "\"G74\"", "\"G75\"", "\"G90\"", "\"G91\"", "\"D01\"", "\"D02\"", "\"D03\"", "\"D\"", "\"X\"", "\"Y\"", "\"I\"", "\"J\"", "\".\"", "\"M00\"", "\"M01\"", "\"M02\"", "\"IC\"", "\"AS\"", "\"EB\"", "\"BC\"", "\"IS\"", "\"EI\"", "\"A\"", "\"B\"", "\"FS\"", "\"L\"", "\"T\"", "\"G\"", "\"Z\"", "\"M\"", "\"IP\"", "\"POS\"", "\"NEG\"", "\"LP\"", "\"C\"", "\"MOIN\"", "\"MOMM\"", "\"OF\"", "\"SF\"", "\"SR\"", "\",\"", "\"x\"", "\"/\"", "\"$\"", }; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/parser/ParserTokenManager.java000066400000000000000000000540641147500217100304630ustar00rootroot00000000000000/* Generated By:JavaCC: Do not edit this line. ParserTokenManager.java */ package visolate.parser; public class ParserTokenManager implements ParserConstants { public java.io.PrintStream debugStream = System.out; public void setDebugStream(java.io.PrintStream ds) { debugStream = ds; } private final int jjStopStringLiteralDfa_0(int pos, long active0, long active1) { switch (pos) { default : return -1; } } private final int jjStartNfa_0(int pos, long active0, long active1) { return jjMoveNfa_0(jjStopStringLiteralDfa_0(pos, active0, active1), pos + 1); } private final int jjStopAtPos(int pos, int kind) { jjmatchedKind = kind; jjmatchedPos = pos; return pos + 1; } //private final int jjStartNfaWithStates_0(int pos, int kind, int state) //{ // jjmatchedKind = kind; // jjmatchedPos = pos; // try { curChar = input_stream.readChar(); } // catch(java.io.IOException e) { return pos + 1; } // return jjMoveNfa_0(state, pos + 1); //} private final int jjMoveStringLiteralDfa0_0() { switch(curChar) { case 36: return jjStopAtPos(0, 73); case 37: return jjStopAtPos(0, 5); case 42: return jjStopAtPos(0, 6); case 44: return jjStopAtPos(0, 70); case 46: return jjStopAtPos(0, 42); case 47: return jjStopAtPos(0, 72); case 65: jjmatchedKind = 52; return jjMoveStringLiteralDfa1_0(0x800000003000L, 0x0L); case 66: jjmatchedKind = 53; return jjMoveStringLiteralDfa1_0(0x2000000000000L, 0x0L); case 67: return jjStopAtPos(0, 64); case 68: jjmatchedKind = 37; return jjMoveStringLiteralDfa1_0(0x1c00000000L, 0x0L); case 69: return jjMoveStringLiteralDfa1_0(0x9000000000000L, 0x0L); case 70: return jjMoveStringLiteralDfa1_0(0x40000000000000L, 0x0L); case 71: jjmatchedKind = 57; return jjMoveStringLiteralDfa1_0(0x3ffe04000L, 0x0L); case 73: jjmatchedKind = 40; return jjMoveStringLiteralDfa1_0(0x1004400000000400L, 0x0L); case 74: return jjStopAtPos(0, 41); case 76: jjmatchedKind = 55; return jjMoveStringLiteralDfa1_0(0x8000000000000800L, 0x0L); case 77: jjmatchedKind = 59; return jjMoveStringLiteralDfa1_0(0x380000000000L, 0x6L); case 78: jjmatchedKind = 20; return jjMoveStringLiteralDfa1_0(0x4000000000000000L, 0x0L); case 79: return jjMoveStringLiteralDfa1_0(0x0L, 0x8L); case 80: return jjMoveStringLiteralDfa1_0(0x2000000000000000L, 0x0L); case 83: return jjMoveStringLiteralDfa1_0(0x0L, 0x30L); case 84: return jjStopAtPos(0, 56); case 88: return jjStopAtPos(0, 38); case 89: return jjStopAtPos(0, 39); case 90: return jjStopAtPos(0, 58); case 120: return jjStopAtPos(0, 71); default : return jjMoveNfa_0(0, 0); } } private final int jjMoveStringLiteralDfa1_0(long active0, long active1) { try { curChar = input_stream.readChar(); } catch(java.io.IOException e) { jjStopStringLiteralDfa_0(0, active0, active1); return 1; } switch(curChar) { case 48: return jjMoveStringLiteralDfa2_0(active0, 0x381c01e04000L, active1, 0L); case 51: return jjMoveStringLiteralDfa2_0(active0, 0x6000000L, active1, 0L); case 53: return jjMoveStringLiteralDfa2_0(active0, 0x8000000L, active1, 0L); case 55: return jjMoveStringLiteralDfa2_0(active0, 0xf0000000L, active1, 0L); case 57: return jjMoveStringLiteralDfa2_0(active0, 0x300000000L, active1, 0L); case 66: if ((active0 & 0x1000000000000L) != 0L) return jjStopAtPos(1, 48); break; case 67: if ((active0 & 0x400000000000L) != 0L) return jjStopAtPos(1, 46); else if ((active0 & 0x2000000000000L) != 0L) return jjStopAtPos(1, 49); break; case 68: return jjMoveStringLiteralDfa2_0(active0, 0x1000L, active1, 0L); case 69: return jjMoveStringLiteralDfa2_0(active0, 0x4000000000000000L, active1, 0L); case 70: if ((active1 & 0x8L) != 0L) return jjStopAtPos(1, 67); else if ((active1 & 0x10L) != 0L) return jjStopAtPos(1, 68); break; case 73: if ((active0 & 0x8000000000000L) != 0L) return jjStopAtPos(1, 51); break; case 77: if ((active0 & 0x2000L) != 0L) return jjStopAtPos(1, 13); break; case 78: if ((active0 & 0x400L) != 0L) return jjStopAtPos(1, 10); else if ((active0 & 0x800L) != 0L) return jjStopAtPos(1, 11); break; case 79: return jjMoveStringLiteralDfa2_0(active0, 0x2000000000000000L, active1, 0x6L); case 80: if ((active0 & 0x1000000000000000L) != 0L) return jjStopAtPos(1, 60); else if ((active0 & 0x8000000000000000L) != 0L) return jjStopAtPos(1, 63); break; case 82: if ((active1 & 0x20L) != 0L) return jjStopAtPos(1, 69); break; case 83: if ((active0 & 0x800000000000L) != 0L) return jjStopAtPos(1, 47); else if ((active0 & 0x4000000000000L) != 0L) return jjStopAtPos(1, 50); else if ((active0 & 0x40000000000000L) != 0L) return jjStopAtPos(1, 54); break; default : break; } return jjStartNfa_0(0, active0, active1); } private final int jjMoveStringLiteralDfa2_0(long old0, long active0, long old1, long active1) { if (((active0 &= old0) | (active1 &= old1)) == 0L) return jjStartNfa_0(0, old0, old1); try { curChar = input_stream.readChar(); } catch(java.io.IOException e) { jjStopStringLiteralDfa_0(1, active0, active1); return 2; } switch(curChar) { case 48: if ((active0 & 0x200000L) != 0L) return jjStopAtPos(2, 21); else if ((active0 & 0x10000000L) != 0L) return jjStopAtPos(2, 28); else if ((active0 & 0x100000000L) != 0L) return jjStopAtPos(2, 32); else if ((active0 & 0x80000000000L) != 0L) return jjStopAtPos(2, 43); break; case 49: if ((active0 & 0x400000L) != 0L) return jjStopAtPos(2, 22); else if ((active0 & 0x20000000L) != 0L) return jjStopAtPos(2, 29); else if ((active0 & 0x200000000L) != 0L) return jjStopAtPos(2, 33); else if ((active0 & 0x400000000L) != 0L) return jjStopAtPos(2, 34); else if ((active0 & 0x100000000000L) != 0L) return jjStopAtPos(2, 44); break; case 50: if ((active0 & 0x800000L) != 0L) return jjStopAtPos(2, 23); else if ((active0 & 0x800000000L) != 0L) return jjStopAtPos(2, 35); else if ((active0 & 0x200000000000L) != 0L) return jjStopAtPos(2, 45); break; case 51: if ((active0 & 0x1000000L) != 0L) return jjStopAtPos(2, 24); else if ((active0 & 0x1000000000L) != 0L) return jjStopAtPos(2, 36); break; case 52: if ((active0 & 0x4000L) != 0L) return jjStopAtPos(2, 14); else if ((active0 & 0x8000000L) != 0L) return jjStopAtPos(2, 27); else if ((active0 & 0x40000000L) != 0L) return jjStopAtPos(2, 30); break; case 53: if ((active0 & 0x80000000L) != 0L) return jjStopAtPos(2, 31); break; case 54: if ((active0 & 0x2000000L) != 0L) return jjStopAtPos(2, 25); break; case 55: if ((active0 & 0x4000000L) != 0L) return jjStopAtPos(2, 26); break; case 68: if ((active0 & 0x1000L) != 0L) return jjStopAtPos(2, 12); break; case 71: if ((active0 & 0x4000000000000000L) != 0L) return jjStopAtPos(2, 62); break; case 73: return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x2L); case 77: return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x4L); case 83: if ((active0 & 0x2000000000000000L) != 0L) return jjStopAtPos(2, 61); break; default : break; } return jjStartNfa_0(1, active0, active1); } private final int jjMoveStringLiteralDfa3_0(long old0, long active0, long old1, long active1) { if (((active0 &= old0) | (active1 &= old1)) == 0L) return jjStartNfa_0(1, old0, old1); try { curChar = input_stream.readChar(); } catch(java.io.IOException e) { jjStopStringLiteralDfa_0(2, 0L, active1); return 3; } switch(curChar) { case 77: if ((active1 & 0x4L) != 0L) return jjStopAtPos(3, 66); break; case 78: if ((active1 & 0x2L) != 0L) return jjStopAtPos(3, 65); break; default : break; } return jjStartNfa_0(2, 0L, active1); } private final void jjCheckNAdd(int state) { if (jjrounds[state] != jjround) { jjstateSet[jjnewStateCnt++] = state; jjrounds[state] = jjround; } } //private final void jjAddStates(int start, int end) //{ // do { // jjstateSet[jjnewStateCnt++] = jjnextStates[start]; // } while (start++ != end); //} //private final void jjCheckNAddTwoStates(int state1, int state2) //{ // jjCheckNAdd(state1); // jjCheckNAdd(state2); //} //private final void jjCheckNAddStates(int start, int end) //{ // do { // jjCheckNAdd(jjnextStates[start]); // } while (start++ != end); //} //private final void jjCheckNAddStates(int start) //{ // jjCheckNAdd(jjnextStates[start]); // jjCheckNAdd(jjnextStates[start + 1]); //} private final int jjMoveNfa_0(int startState, int curPos) { // int[] nextStates; int startsAt = 0; jjnewStateCnt = 2; int i = 1; jjstateSet[0] = startState; int j, kind = 0x7fffffff; for (;;) { if (++jjround == 0x7fffffff) ReInitRounds(); if (curChar < 64) { long l = 1L << curChar; //MatchLoop: do { switch(jjstateSet[--i]) { case 0: if ((0x3ff000000000000L & l) != 0L) { if (kind > 8) kind = 8; jjCheckNAdd(1); } else if ((0x280000000000L & l) != 0L) { if (kind > 7) kind = 7; } break; case 1: if ((0x3ff000000000000L & l) == 0L) break; kind = 8; jjCheckNAdd(1); break; default : break; } } while(i != startsAt); } else if (curChar < 128) { long l = 1L << (curChar & 077); MatchLoop: do { switch(jjstateSet[--i]) { default : break; } } while(i != startsAt); } else { int i2 = (curChar & 0xff) >> 6; long l2 = 1L << (curChar & 077); MatchLoop: do { switch(jjstateSet[--i]) { default : break; } } while(i != startsAt); } if (kind != 0x7fffffff) { jjmatchedKind = kind; jjmatchedPos = curPos; kind = 0x7fffffff; } ++curPos; if ((i = jjnewStateCnt) == (startsAt = 2 - (jjnewStateCnt = startsAt))) return curPos; try { curChar = input_stream.readChar(); } catch(java.io.IOException e) { return curPos; } } } private final int jjMoveStringLiteralDfa0_1() { return jjMoveNfa_1(0, 0); } static final long[] jjbitVec0 = { 0x0L, 0x0L, 0xffffffffffffffffL, 0xffffffffffffffffL }; private final int jjMoveNfa_1(int startState, int curPos) { // int[] nextStates; int startsAt = 0; jjnewStateCnt = 1; int i = 1; jjstateSet[0] = startState; int j, kind = 0x7fffffff; for (;;) { if (++jjround == 0x7fffffff) ReInitRounds(); if (curChar < 64) { long l = 1L << curChar; MatchLoop: do { switch(jjstateSet[--i]) { case 0: if ((0xfffffbffffffdbffL & l) == 0L) break; kind = 15; jjstateSet[jjnewStateCnt++] = 0; break; default : break; } } while(i != startsAt); } else if (curChar < 128) { long l = 1L << (curChar & 077); //MatchLoop: do { switch(jjstateSet[--i]) { case 0: kind = 15; jjstateSet[jjnewStateCnt++] = 0; break; default : break; } } while(i != startsAt); } else { int i2 = (curChar & 0xff) >> 6; long l2 = 1L << (curChar & 077); MatchLoop: do { switch(jjstateSet[--i]) { case 0: if ((jjbitVec0[i2] & l2) == 0L) break; if (kind > 15) kind = 15; jjstateSet[jjnewStateCnt++] = 0; break; default : break; } } while(i != startsAt); } if (kind != 0x7fffffff) { jjmatchedKind = kind; jjmatchedPos = curPos; kind = 0x7fffffff; } ++curPos; if ((i = jjnewStateCnt) == (startsAt = 1 - (jjnewStateCnt = startsAt))) return curPos; try { curChar = input_stream.readChar(); } catch(java.io.IOException e) { return curPos; } } } private final int jjMoveStringLiteralDfa0_2() { return jjMoveNfa_2(1, 0); } private final int jjMoveNfa_2(int startState, int curPos) { int[] nextStates; int startsAt = 0; jjnewStateCnt = 3; int i = 1; jjstateSet[0] = startState; int j, kind = 0x7fffffff; for (;;) { if (++jjround == 0x7fffffff) ReInitRounds(); if (curChar < 64) { long l = 1L << curChar; MatchLoop: do { switch(jjstateSet[--i]) { case 1: case 0: if ((0x3ff000000000000L & l) == 0L) break; if (kind > 16) kind = 16; jjCheckNAdd(0); break; case 2: if ((0x3ff000000000000L & l) == 0L) break; if (kind > 18) kind = 18; jjstateSet[jjnewStateCnt++] = 2; break; default : break; } } while(i != startsAt); } else if (curChar < 128) { long l = 1L << (curChar & 077); MatchLoop: do { switch(jjstateSet[--i]) { case 1: case 2: if ((0x7fffffe07fffffeL & l) == 0L) break; if (kind > 18) kind = 18; jjCheckNAdd(2); break; default : break; } } while(i != startsAt); } else { int i2 = (curChar & 0xff) >> 6; long l2 = 1L << (curChar & 077); MatchLoop: do { switch(jjstateSet[--i]) { default : break; } } while(i != startsAt); } if (kind != 0x7fffffff) { jjmatchedKind = kind; jjmatchedPos = curPos; kind = 0x7fffffff; } ++curPos; if ((i = jjnewStateCnt) == (startsAt = 3 - (jjnewStateCnt = startsAt))) return curPos; try { curChar = input_stream.readChar(); } catch(java.io.IOException e) { return curPos; } } } static final int[] jjnextStates = { }; public static final String[] jjstrLiteralImages = { "", null, null, null, null, "\45", "\52", null, null, null, "\111\116", "\114\116", "\101\104\104", "\101\115", "\107\60\64", null, null, null, null, null, "\116", "\107\60\60", "\107\60\61", "\107\60\62", "\107\60\63", "\107\63\66", "\107\63\67", "\107\65\64", "\107\67\60", "\107\67\61", "\107\67\64", "\107\67\65", "\107\71\60", "\107\71\61", "\104\60\61", "\104\60\62", "\104\60\63", "\104", "\130", "\131", "\111", "\112", "\56", "\115\60\60", "\115\60\61", "\115\60\62", "\111\103", "\101\123", "\105\102", "\102\103", "\111\123", "\105\111", "\101", "\102", "\106\123", "\114", "\124", "\107", "\132", "\115", "\111\120", "\120\117\123", "\116\105\107", "\114\120", "\103", "\115\117\111\116", "\115\117\115\115", "\117\106", "\123\106", "\123\122", "\54", "\170", "\57", "\44", }; public static final String[] lexStateNames = { "DEFAULT", "TEXT_EXPECTED", "ALNUMS_EXPECTED", }; public static final int[] jjnewLexState = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 2, 1, 1, 0, -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }; static final long[] jjtoToken = { 0xffffffffffffffe1L, 0x3ffL, }; static final long[] jjtoSkip = { 0x1eL, 0x0L, }; protected SimpleCharStream input_stream; private final int[] jjrounds = new int[3]; private final int[] jjstateSet = new int[6]; StringBuffer image; int jjimageLen; int lengthOfMatch; protected char curChar; public ParserTokenManager(SimpleCharStream stream){ if (SimpleCharStream.staticFlag) throw new Error("ERROR: Cannot use a static CharStream class with a non-static lexical analyzer."); input_stream = stream; } public ParserTokenManager(SimpleCharStream stream, int lexState){ this(stream); SwitchTo(lexState); } public void ReInit(SimpleCharStream stream) { jjmatchedPos = jjnewStateCnt = 0; curLexState = defaultLexState; input_stream = stream; ReInitRounds(); } private final void ReInitRounds() { int i; jjround = 0x80000001; for (i = 3; i-- > 0;) jjrounds[i] = 0x80000000; } public void ReInit(SimpleCharStream stream, int lexState) { ReInit(stream); SwitchTo(lexState); } public void SwitchTo(int lexState) { if (lexState >= 3 || lexState < 0) throw new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE); else curLexState = lexState; } protected Token jjFillToken() { Token t = Token.newToken(jjmatchedKind); t.kind = jjmatchedKind; if (jjmatchedPos < 0) { if (image == null) t.image = ""; else t.image = image.toString(); t.beginLine = t.endLine = input_stream.getBeginLine(); t.beginColumn = t.endColumn = input_stream.getBeginColumn(); } else { String im = jjstrLiteralImages[jjmatchedKind]; t.image = (im == null) ? input_stream.GetImage() : im; t.beginLine = input_stream.getBeginLine(); t.beginColumn = input_stream.getBeginColumn(); t.endLine = input_stream.getEndLine(); t.endColumn = input_stream.getEndColumn(); } return t; } int curLexState = 0; int defaultLexState = 0; int jjnewStateCnt; int jjround; int jjmatchedPos; int jjmatchedKind; public Token getNextToken() { int kind; Token specialToken = null; Token matchedToken; int curPos = 0; EOFLoop : for (;;) { try { curChar = input_stream.BeginToken(); } catch(java.io.IOException e) { jjmatchedKind = 0; matchedToken = jjFillToken(); return matchedToken; } image = null; jjimageLen = 0; switch(curLexState) { case 0: try { input_stream.backup(0); while (curChar <= 32 && (0x100002600L & (1L << curChar)) != 0L) curChar = input_stream.BeginToken(); } catch (java.io.IOException e1) { continue EOFLoop; } jjmatchedKind = 0x7fffffff; jjmatchedPos = 0; curPos = jjMoveStringLiteralDfa0_0(); break; case 1: jjmatchedKind = 15; jjmatchedPos = -1; curPos = 0; curPos = jjMoveStringLiteralDfa0_1(); break; case 2: jjmatchedKind = 0x7fffffff; jjmatchedPos = 0; curPos = jjMoveStringLiteralDfa0_2(); break; } if (jjmatchedKind != 0x7fffffff) { if (jjmatchedPos + 1 < curPos) input_stream.backup(curPos - jjmatchedPos - 1); if ((jjtoToken[jjmatchedKind >> 6] & (1L << (jjmatchedKind & 077))) != 0L) { matchedToken = jjFillToken(); TokenLexicalActions(matchedToken); if (jjnewLexState[jjmatchedKind] != -1) curLexState = jjnewLexState[jjmatchedKind]; return matchedToken; } else { if (jjnewLexState[jjmatchedKind] != -1) curLexState = jjnewLexState[jjmatchedKind]; continue EOFLoop; } } int error_line = input_stream.getEndLine(); int error_column = input_stream.getEndColumn(); String error_after = null; boolean EOFSeen = false; try { input_stream.readChar(); input_stream.backup(1); } catch (java.io.IOException e1) { EOFSeen = true; error_after = curPos <= 1 ? "" : input_stream.GetImage(); if (curChar == '\n' || curChar == '\r') { error_line++; error_column = 0; } else error_column++; } if (!EOFSeen) { input_stream.backup(1); error_after = curPos <= 1 ? "" : input_stream.GetImage(); } throw new TokenMgrError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, TokenMgrError.LEXICAL_ERROR); } } void TokenLexicalActions(Token matchedToken) { switch(jjmatchedKind) { default : break; } } } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/parser/SimpleCharStream.java000066400000000000000000000256321147500217100301350ustar00rootroot00000000000000/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 4.0 */ package visolate.parser; /** * An implementation of interface CharStream, where the stream is assumed to * contain only ASCII characters (without unicode processing). */ public class SimpleCharStream { public static final boolean staticFlag = false; int bufsize; int available; int tokenBegin; public int bufpos = -1; protected int bufline[]; protected int bufcolumn[]; protected int column = 0; protected int line = 1; protected boolean prevCharIsCR = false; protected boolean prevCharIsLF = false; protected java.io.Reader inputStream; protected char[] buffer; protected int maxNextCharInd = 0; protected int inBuf = 0; protected int tabSize = 8; protected void setTabSize(int i) { tabSize = i; } protected int getTabSize(int i) { return tabSize; } protected void ExpandBuff(boolean wrapAround) { char[] newbuffer = new char[bufsize + 2048]; int newbufline[] = new int[bufsize + 2048]; int newbufcolumn[] = new int[bufsize + 2048]; try { if (wrapAround) { System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin); System.arraycopy(buffer, 0, newbuffer, bufsize - tokenBegin, bufpos); buffer = newbuffer; System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin); System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos); bufline = newbufline; System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin); System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos); bufcolumn = newbufcolumn; maxNextCharInd = (bufpos += (bufsize - tokenBegin)); } else { System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin); buffer = newbuffer; System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin); bufline = newbufline; System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin); bufcolumn = newbufcolumn; maxNextCharInd = (bufpos -= tokenBegin); } } catch (Throwable t) { throw new Error(t.getMessage()); } bufsize += 2048; available = bufsize; tokenBegin = 0; } protected void FillBuff() throws java.io.IOException { if (maxNextCharInd == available) { if (available == bufsize) { if (tokenBegin > 2048) { bufpos = maxNextCharInd = 0; available = tokenBegin; } else if (tokenBegin < 0) bufpos = maxNextCharInd = 0; else ExpandBuff(false); } else if (available > tokenBegin) available = bufsize; else if ((tokenBegin - available) < 2048) ExpandBuff(true); else available = tokenBegin; } int i; try { if ((i = inputStream.read(buffer, maxNextCharInd, available - maxNextCharInd)) == -1) { inputStream.close(); throw new java.io.IOException(); } else maxNextCharInd += i; return; } catch(java.io.IOException e) { --bufpos; backup(0); if (tokenBegin == -1) tokenBegin = bufpos; throw e; } } public char BeginToken() throws java.io.IOException { tokenBegin = -1; char c = readChar(); tokenBegin = bufpos; return c; } protected void UpdateLineColumn(char c) { column++; if (prevCharIsLF) { prevCharIsLF = false; line += (column = 1); } else if (prevCharIsCR) { prevCharIsCR = false; if (c == '\n') { prevCharIsLF = true; } else line += (column = 1); } switch (c) { case '\r' : prevCharIsCR = true; break; case '\n' : prevCharIsLF = true; break; case '\t' : column--; column += (tabSize - (column % tabSize)); break; default : break; } bufline[bufpos] = line; bufcolumn[bufpos] = column; } public char readChar() throws java.io.IOException { if (inBuf > 0) { --inBuf; if (++bufpos == bufsize) bufpos = 0; return buffer[bufpos]; } if (++bufpos >= maxNextCharInd) FillBuff(); char c = buffer[bufpos]; UpdateLineColumn(c); return c; } /** * @deprecated * @see #getEndColumn */ public int getColumn() { return bufcolumn[bufpos]; } /** * @deprecated * @see #getEndLine */ public int getLine() { return bufline[bufpos]; } public int getEndColumn() { return bufcolumn[bufpos]; } public int getEndLine() { return bufline[bufpos]; } public int getBeginColumn() { return bufcolumn[tokenBegin]; } public int getBeginLine() { return bufline[tokenBegin]; } public void backup(int amount) { inBuf += amount; if ((bufpos -= amount) < 0) bufpos += bufsize; } public SimpleCharStream(java.io.Reader dstream, int startline, int startcolumn, int buffersize) { inputStream = dstream; line = startline; column = startcolumn - 1; available = bufsize = buffersize; buffer = new char[buffersize]; bufline = new int[buffersize]; bufcolumn = new int[buffersize]; } public SimpleCharStream(java.io.Reader dstream, int startline, int startcolumn) { this(dstream, startline, startcolumn, 4096); } public SimpleCharStream(java.io.Reader dstream) { this(dstream, 1, 1, 4096); } public void ReInit(java.io.Reader dstream, int startline, int startcolumn, int buffersize) { inputStream = dstream; line = startline; column = startcolumn - 1; if (buffer == null || buffersize != buffer.length) { available = bufsize = buffersize; buffer = new char[buffersize]; bufline = new int[buffersize]; bufcolumn = new int[buffersize]; } prevCharIsLF = prevCharIsCR = false; tokenBegin = inBuf = maxNextCharInd = 0; bufpos = -1; } public void ReInit(java.io.Reader dstream, int startline, int startcolumn) { ReInit(dstream, startline, startcolumn, 4096); } public void ReInit(java.io.Reader dstream) { ReInit(dstream, 1, 1, 4096); } public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline, int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException { this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize); } public SimpleCharStream(java.io.InputStream dstream, int startline, int startcolumn, int buffersize) { this(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize); } public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline, int startcolumn) throws java.io.UnsupportedEncodingException { this(dstream, encoding, startline, startcolumn, 4096); } public SimpleCharStream(java.io.InputStream dstream, int startline, int startcolumn) { this(dstream, startline, startcolumn, 4096); } public SimpleCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException { this(dstream, encoding, 1, 1, 4096); } public SimpleCharStream(java.io.InputStream dstream) { this(dstream, 1, 1, 4096); } public void ReInit(java.io.InputStream dstream, String encoding, int startline, int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException { ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize); } public void ReInit(java.io.InputStream dstream, int startline, int startcolumn, int buffersize) { ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize); } public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException { ReInit(dstream, encoding, 1, 1, 4096); } public void ReInit(java.io.InputStream dstream) { ReInit(dstream, 1, 1, 4096); } public void ReInit(java.io.InputStream dstream, String encoding, int startline, int startcolumn) throws java.io.UnsupportedEncodingException { ReInit(dstream, encoding, startline, startcolumn, 4096); } public void ReInit(java.io.InputStream dstream, int startline, int startcolumn) { ReInit(dstream, startline, startcolumn, 4096); } public String GetImage() { if (bufpos >= tokenBegin) return new String(buffer, tokenBegin, bufpos - tokenBegin + 1); else return new String(buffer, tokenBegin, bufsize - tokenBegin) + new String(buffer, 0, bufpos + 1); } public char[] GetSuffix(int len) { char[] ret = new char[len]; if ((bufpos + 1) >= len) System.arraycopy(buffer, bufpos - len + 1, ret, 0, len); else { System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0, len - bufpos - 1); System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1); } return ret; } public void Done() { buffer = null; bufline = null; bufcolumn = null; } /** * Method to adjust line and column numbers for the start of a token. */ public void adjustBeginLineColumn(int newLine, int newCol) { int start = tokenBegin; int len; if (bufpos >= tokenBegin) { len = bufpos - tokenBegin + inBuf + 1; } else { len = bufsize - tokenBegin + bufpos + 1 + inBuf; } int i = 0, j = 0, k = 0; int nextColDiff = 0, columnDiff = 0; while (i < len && bufline[j = start % bufsize] == bufline[k = ++start % bufsize]) { bufline[j] = newLine; nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j]; bufcolumn[j] = newCol + columnDiff; columnDiff = nextColDiff; i++; } if (i < len) { bufline[j] = newLine++; bufcolumn[j] = newCol + columnDiff; while (i++ < len) { if (bufline[j = start % bufsize] != bufline[++start % bufsize]) bufline[j] = newLine++; else bufline[j] = newLine; } } line = bufline[j]; column = bufcolumn[j]; } } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/parser/Token.java000066400000000000000000000051461147500217100260100ustar00rootroot00000000000000/* Generated By:JavaCC: Do not edit this line. Token.java Version 3.0 */ package visolate.parser; /** * Describes the input token stream. */ public class Token { /** * An integer that describes the kind of this token. This numbering * system is determined by JavaCCParser, and a table of these numbers is * stored in the file ...Constants.java. */ public int kind; /** * beginLine and beginColumn describe the position of the first character * of this token; endLine and endColumn describe the position of the * last character of this token. */ public int beginLine, beginColumn, endLine, endColumn; /** * The string image of the token. */ public String image; /** * A reference to the next regular (non-special) token from the input * stream. If this is the last token from the input stream, or if the * token manager has not read tokens beyond this one, this field is * set to null. This is true only if this token is also a regular * token. Otherwise, see below for a description of the contents of * this field. */ public Token next; /** * This field is used to access special tokens that occur prior to this * token, but after the immediately preceding regular (non-special) token. * If there are no such special tokens, this field is set to null. * When there are more than one such special token, this field refers * to the last of these special tokens, which in turn refers to the next * previous special token through its specialToken field, and so on * until the first special token (whose specialToken field is null). * The next fields of special tokens refer to other special tokens that * immediately follow it (without an intervening regular token). If there * is no such token, this field is null. */ public Token specialToken; /** * Returns the image. */ public String toString() { return image; } /** * Returns a new Token object, by default. However, if you want, you * can create and return subclass objects based on the value of ofKind. * Simply add the cases to the switch for all those special cases. * For example, if you have a subclass of Token called IDToken that * you want to create if ofKind is ID, simlpy add something like : * * case MyParserConstants.ID : return new IDToken(); * * to the following switch statement. Then you can cast matchedToken * variable to the appropriate type and use it in your lexical actions. */ public static final Token newToken(int ofKind) { switch(ofKind) { default : return new Token(); } } } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/parser/TokenMgrError.java000066400000000000000000000101631147500217100274630ustar00rootroot00000000000000/* Generated By:JavaCC: Do not edit this line. TokenMgrError.java Version 3.0 */ package visolate.parser; public class TokenMgrError extends Error { /* * Ordinals for various reasons why an Error of this type can be thrown. */ /** * Lexical error occurred. */ static final int LEXICAL_ERROR = 0; /** * An attempt was made to create a second instance of a static token manager. */ static final int STATIC_LEXER_ERROR = 1; /** * Tried to change to an invalid lexical state. */ static final int INVALID_LEXICAL_STATE = 2; /** * Detected (and bailed out of) an infinite loop in the token manager. */ static final int LOOP_DETECTED = 3; /** * Indicates the reason why the exception is thrown. It will have * one of the above 4 values. */ int errorCode; /** * Replaces unprintable characters by their escaped (or unicode escaped) * equivalents in the given string */ protected static final String addEscapes(String str) { StringBuffer retval = new StringBuffer(); char ch; for (int i = 0; i < str.length(); i++) { switch (str.charAt(i)) { case 0 : continue; case '\b': retval.append("\\b"); continue; case '\t': retval.append("\\t"); continue; case '\n': retval.append("\\n"); continue; case '\f': retval.append("\\f"); continue; case '\r': retval.append("\\r"); continue; case '\"': retval.append("\\\""); continue; case '\'': retval.append("\\\'"); continue; case '\\': retval.append("\\\\"); continue; default: if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { String s = "0000" + Integer.toString(ch, 16); retval.append("\\u" + s.substring(s.length() - 4, s.length())); } else { retval.append(ch); } continue; } } return retval.toString(); } /** * Returns a detailed message for the Error when it is thrown by the * token manager to indicate a lexical error. * Parameters : * EOFSeen : indicates if EOF caused the lexical error * curLexState : lexical state in which this error occurred * errorLine : line number when the error occurred * errorColumn : column number when the error occurred * errorAfter : prefix that was seen before this error occurred * curchar : the offending character * Note: You can customize the lexical error message by modifying this method. */ protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) { return("Lexical error at line " + errorLine + ", column " + errorColumn + ". Encountered: " + (EOFSeen ? " " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") + "after : \"" + addEscapes(errorAfter) + "\""); } /** * You can also modify the body of this method to customize your error messages. * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not * of end-users concern, so you can return something like : * * "Internal Error : Please file a bug report .... " * * from this method for such cases in the release version of your parser. */ public String getMessage() { return super.getMessage(); } /* * Constructors of various flavors follow. */ public TokenMgrError() { } public TokenMgrError(String message, int reason) { super(message); errorCode = reason; } public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) { this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason); } } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/parser/makefile.old000066400000000000000000000650371147500217100263470ustar00rootroot00000000000000# Vona's super-ninja makefile # # *** DO NOT EDIT THIS FILE EXCEPT IN THE PROJECT HOME DIRECTORY *** # # This makefile is auto-generated by "make makefiles" in the parent package # # You can (and should) edit makefile.project, which is included below, to # specify project-specific settings # # You can edit makefile.package, which is included below, to specify # package-specific targets and variables # # Copyright (C) 2004 Marsette A. Vona, III # # 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 2 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., 59 # Temple Place - Suite 330, Boston, MA 02111-1307, USA. # $Id: makefile 15 2008-01-23 21:56:45Z vona $ # Relative path to the directory containing the root package for the project. # For makefile in every directory other than $(PROJECT_HOME) this is # automatically set by "make makefiles" PROJECT_HOME = ../. -include $(PROJECT_HOME)/makefile.project ifndef BASE_PACKAGE BASE_PACKAGE := $(notdir $(shell $(CD) $(PROJECT_HOME) && pwd)) endif ifndef APPNAME APPNAME := $(BASE_PACKAGE) endif # The (full) name of this package. For makefile in every directory other than # $(PROJECT_HOME) this is automatically set by "make makefiles" PACKAGE = $(BASE_PACKAGE).parser # the default target default: package #figure out arch SYSTEM = $(shell uname -s | tr " " "_") MACHINE = $(shell uname -m | tr " " "_") ARCH := $(SYSTEM)_$(MACHINE) #linux: Linux_i686 #OS X: Darwin_Power_Macintosh #cygwin: CYGWIN-5.1_NT # misc macros # these let $(COMMA) and $(SPACE) be lone arguments to make function calls COMMA := , EMPTY := SPACE := $(EMPTY) $(EMPTY) # whitespace regex WS = [ \t]* ifneq ($(findstring CYGWIN,$(SYSTEM)),CYGWIN) # make cd .. follow the Physical directory structure on Unix CD = cd -P else CD = cd # always use bash on cygwin, sh doesn't have pushd, but bash slows things down SHELL = `which bash` endif # tool finding functions #locate the target of a symlink # #works even if the starting point is not a symlink locate-target = $(shell f="$(1)"; while [ -L "$$f" ]; do f=`ls -l "$$f" | awk '{print $$NF}'`; done; echo "$$f") #try hard to find a command # #first arg is command name # #second arg is expected directory # #if cmd executable in directory, that is returned # #else if which knows where the command is, that is returned # #else empty string is returned locate-cmd = $(shell if [ -x "$(2)/$(1)" ]; then echo "$(2)/$(1)"; else cmd="$(shell which "$(1)" 2>/dev/null || true)" && if [ -x "$$cmd" ] ; then echo "$$cmd"; else echo ""; fi; fi) #get the parent directory name # #better than the make builtin function because this also works on a directory dirname = $(shell if [ "$(1)"x != x -a -e "$(1)" ] ; then dirname "$(1)"; else echo ""; fi) #default a dir # #first arg is the desired dir # #second is the default dir # #returns first arg iff it's a directory, else second arg default-dir = $(shell if [ ! -d "$(1)" ]; then echo "$(2)"; else echo "$(1)"; fi) # find tool directories ifndef TOOLS_HOME TOOLS_HOME := $(call default-dir,$(PROJECT_TOOLS_HOME),/usr) endif BIN := $(call default-dir,$(TOOLS_HOME)/bin/$(ARCH),/usr/bin) SCRIPTS := $(call default-dir,$(TOOLS_HOME)/scripts,$(BIN)) JDK_BASE := $(TOOLS_HOME)/java/$(ARCH) JDK_VERSION := newest JDK_HOME := $(call dirname,$(call dirname,$(call locate-target,$(call locate-cmd,javac,$(JDK_BASE)/$(JDK_VERSION)/bin)))) JDK_EXT := $(JDK_HOME)/jre/lib/ext ifeq ($(SYSTEM),Darwin) JDK_EXT := /Library/Java/Extensions endif TOOLS_EXT := $(TOOLS_HOME)/java/indep/lib # find pure java extension jars in the tools java/indep/lib dir if present, else in jre/lib/ext # NOTE the classes will come in on different classloaders in the two cases, which can lead to subtle CNFEs EXT_DIR := $(call default-dir,$(TOOLS_EXT),$(JDK_EXT)) # JDK executables JAVAC := $(call locate-cmd,javac,$(JDK_HOME)/bin) JAVA := $(call locate-cmd,java,$(JDK_HOME)/bin) JAVADOC := $(call locate-cmd,javadoc,$(JDK_HOME)/bin) JAR := $(call locate-cmd,jar,$(JDK_HOME)/bin) KEYTOOL := $(call locate-cmd,keytool,$(JDK_HOME)/bin) JARSIGNER := $(call locate-cmd,jarsigner,$(JDK_HOME)/bin) RMIC := $(call locate-cmd,rmic,$(JDK_HOME)/bin) #other executables JAVACC := $(call locate-cmd,javacc,$(BIN)) RSYNC := $(call locate-cmd,rsync,$(BIN)) WWWIMAGESIZE := $(call locate-cmd,wwwimagesize,$(SCRIPTS)) # CompileServer stuff # the CompileServer binary directory CS_BIN := $(call dirname,$(call locate-target,$(call locate-cmd,javac_submit,$(BIN)))) # the CompileServer scripts directory CS_SCRIPTS := $(call dirname,$(call locate-target,$(call locate-cmd,CompileServer-submit,$(SCRIPTS)))) # define NO_COMPILE_SERVER to disable compile server ifndef NO_COMPILE_SERVER CS_ENSURE := $(call locate-cmd,CompileServer-ensure-running,$(CS_SCRIPTS)) CS_SUBMIT := $(call locate-cmd,CompileServer-submit,$(CS_SCRIPTS)) ifdef CS_ENSURE ifeq ($(findstring OK,$(shell $(CS_ENSURE) nostart)),OK) ifdef CS_SUBMIT #ok CompileServer is all good! JAVAC := $(CS_SUBMIT) USING_COMPILE_SERVER := 1 endif endif #OK endif #CS_ENSURE endif #NO_COMPILE_SERVER # rmi stuff # generate commands to run RMIWrap # # first arg is the (simple) name of the API interface # # second arg is the (simple) name of the implementation class run-rmiwrap = if [ ! -f $(1)Remote.java -o ! -f $(2)Server.java -o ! -f $(2)Client.java -o \( $(1).java -nt $(1)Remote.java \) -o \( $(2).java -nt $(2)Client.java \) -o \( $(2).java -nt $(2)Server.java \) ]; then $(JAVA) $(RUN_JAVA_FLAGS) vona.rmi.rmiwrap.RMIWrap $(PACKAGE).$(1) $(PACKAGE).$(2) && $(JAVAC) $(JAVAC_FLAGS) *.java; fi # generate commands to run rmic # # first arg is the (simple) name of the remote class for which to generate a # stub RMIC_JRMP_VERSION = 1.1 run-rmic = if [ ! -f $(1)_Stub.class -o $(1).class -nt $(1)_Stub.class ]; then $(RMIC) -v$(RMIC_JRMP_VERSION) -d $(PROJECT_HOME)/.. $(CLASSPATH_FLAG) $(PACKAGE).$(1); fi # rsync stuff # flags for rsync # # excludes the usual suspects RSYNC_FLAGS := -rv --progress $(DBG) --copy-links --exclude "**~" --exclude ".\#**" --exclude CVS --exclude .svn --exclude "*.tmp" # rsync first arg to second arg, with cvs exclude rsync = $(RSYNC) $(RSYNC_FLAGS) --cvs-exclude $(1) $(2) # rsync a subproject # # first arg is filename extension to include (starting with ".", or empty for # all) # # second arg is the name of a subproject (i.e. the name of the base package of # the subproject). If it ends in "." then it is copied non-recursively, else # it is copied recursively. # # third arg is rsync dest, if not absolute then relative to $(PROJECT_HOME)/.. rsync-subproject = pushd $(PROJECT_HOME)/.. && $(RSYNC) $(RSYNC_FLAGS) --include "*/" --exclude "/$(BASE_PACKAGE)/$(JAVADOC_DIR_NAME)/**" --include $(if $(filter ".","$(suffix $(2))"),"/$(call package-to-path,$(basename $(2)))/*$(1)","/$(call package-to-path,$(2))/**$(1)") --exclude "*" $(BASE_PACKAGE) $(3) && popd # this should have dynamic binding so that makefile.package can override # JARFILE JAR_DIR = .$(JARFILE).tmp # make a jar # # does not include hidden files (any file with name beginning ".") # # arg 1: "true" to include javadoc tree, "false" otherwise # arg 2: the list of external jars (none if empty) # arg 3: the name of the jarfile # arg 4: the list of filename extensions to include (each beginning with ".", empty to include all) # arg 5: list of extra files to include (pathnames relative to parent of base package) # arg 6: includes only files in these subproject packages make-jar = \ $(RM) $(3) && \ $(RM) -r $(JAR_DIR) && \ mkdir $(JAR_DIR) && \ if [ $(1) ] && [ -d "$(JAVADOC_DIR)" ]; then $(call rsync,$(JAVADOC_DIR),$(JAR_DIR)); fi && \ if [ "$(4)foo" == "foo" ]; then \ $(foreach P,$(6),$(call rsync-subproject,,$(P),$(call package-to-path,$(PACKAGE))/$(JAR_DIR)) && ) true; \ else $(foreach E,$(4),$(foreach P,$(6),$(call rsync-subproject,$(E),$(P),$(call package-to-path,$(PACKAGE))/$(JAR_DIR)) && )) true; fi && \ $(foreach F,$(addprefix $(EXT_DIR)/,$(2)),cp $(F) $(JAR_DIR) &&) true && \ $(foreach F,$(5),cp $(addprefix $(PROJECT_HOME)/../,$(F)) $(JAR_DIR)/$(dir $(F)) &&) true && \ $(CD) $(JAR_DIR) && \ $(foreach F,$(2),$(JAR) xvf $(F) && rm $(F) &&) true && \ rm -rf META-INF && \ if [ "$(4)foo" == "foo" ]; then \ $(JAR) cvf $(3) `find . -not -type d -a -not -name ".*"` $(5); \ else $(JAR) cvf $(3) `find . -not -type d -a -not -name ".*" -a "(" -false $(foreach E,$(4),-o -name "*$(E)" ) ")"` $(5); fi && \ if [ -f ../$(JAR_MF) ]; then $(JAR) ufm $(3) ../$(JAR_MF); fi && \ if [ -f ../$(JAR_CRT) ]; then $(JARSIGNER) $(3) $(JARKEY); fi && \ mv $(3) .. && \ $(CD) .. && \ rm -rf $(JAR_DIR) # template file locations TEMPLATE_DIR = $(PROJECT_HOME)/templates JAVA_TEMPLATE = $(TEMPLATE_DIR)/Template.java EXCEPTION_TEMPLATE = $(TEMPLATE_DIR)/Exception.java PACKAGE_TEMPLATE = $(TEMPLATE_DIR)/package.html MAKEFILE_PACKAGE_TEMPLATE = $(TEMPLATE_DIR)/makefile.package template-m4-common = m4 -P "-DYEAR=`date +%Y`" "-DPACKAGE=$(PACKAGE)" template-m4-java = m4 -P "-DYEAR=`date +%Y`" "-DPACKAGE=$(PACKAGE)" "-DCLASS=$(notdir $(basename $(1)))" $(JAVA_TEMPLATE) > $(basename $(1)).java # compute short package name from fullname PACKAGE_NAME = $(subst .,,$(suffix .$(PACKAGE))) # compute project name (root package name) from package fullname PROJECT = $(firstword $(subst ., ,$(PACKAGE))) # heap size flag MEMORY_FLAG = -Xmx$(TOTAL_HEAP_SIZE) # compute the package path from the package full name # $(PROJECT_HOME)/../$(PACKAGE_PATH) is a path to this package PACKAGE_PATH = $(call package-to-path,$(PACKAGE)) # command to run make without generating any extraneous output MAKE_SILENT = $(MAKE) --silent --no-print-directory # is this the project root package? ifeq ($(PROJECT_HOME),.) ROOT_PACKAGE = yes endif # flag useful for various tools # put the parent of project home first on the classpath # that way if there are built checkouts of the source trees for any EXT_JARS # then we'll pick up those classes directly from there NINJA_CLASSPATH := $(PROJECT_HOME)/.. ifdef USING_COMPILE_SERVER NINJA_CLASSPATH := $(shell pwd)/$(NINJA_CLASSPATH) endif # now put each EXT_JAR on the classpath, in order, but only if we're finding # them in an EXT_DIR which is not the JDK installed extensions dir ifneq ($(EXT_DIR),$(JDK_EXT)) NINJA_CLASSPATH := $(subst $(SPACE),,$(NINJA_CLASSPATH)$(foreach JAR,$(EXT_JARS),:$(EXT_DIR)/$(JAR))) endif # next add the JDK tools jar to the classpath # in particular, for use by CompileServer NINJA_CLASSPATH := $(NINJA_CLASSPATH):$(JDK_HOME)/lib/tools.jar # finally append the user's externally defined CLASSPATH, if any ifdef CLASSPATH MAKE_CLASSPATH := $(NINJA_CLASSPATH):$(CLASSPATH) else #trailing colon breaks java under Windows MAKE_CLASSPATH := $(NINJA_CLASSPATH) endif ifeq ($(findstring CYGWIN,$(SYSTEM)),CYGWIN) MAKE_CLASSPATH := `cygpath -w -p "$(MAKE_CLASSPATH)"` endif CLASSPATH_FLAG = -classpath "$(MAKE_CLASSPATH)" DEPRECATION_FLAG = -deprecation # source the package-specific makefile -include makefile.package # always exclude these subdirs EXCLUDE_SUBDIRS += . .. CVS .svn # figure out our subdirs PACKAGE_SUBDIRS = $(filter-out $(EXCLUDE_SUBDIRS),$(notdir $(shell find . -maxdepth 1 -type d -not -name ".*.tmp" -a -not -name "javadoc-*"))) # always exclude these source files EXCLUDE_SOURCE += # figure out source files PACKAGE_SOURCE = $(filter-out $(wildcard $(EXCLUDE_SOURCE)),$(wildcard *.java)) PACKAGE_HTML_SOURCE = $(filter-out $(wildcard $(EXCLUDE_SOURCE)),$(wildcard *.phtml *.m4)) # ALL source SOURCE = \ $(wildcard *.java) \ $(wildcard *.scm) \ $(wildcard *.c *.cc *.h *.hh) \ $(wildcard *.mf) \ $(wildcard *.jj) \ $(wildcard *.xsd *.xml *.spp) \ $(wildcard *.txt *.tex *.html *.htm *.css README) \ $(wildcard *.properties *.conf *.xcf *.gif *.jpg *.png *.bmp *.ico) \ $(wildcard *.lws *.lwo *.wrl) \ $(wildcard *.sh *.csh *.bat *.iss) \ $(wildcard *.phtml *.m4) \ $(wildcard *.policy) \ package.html makefile.package ifdef ROOT_PACKAGE SOURCE += makefile makefile.project endif # compile-time flags JAVAC_FLAGS += $(DEPRECATION_FLAG) $(CLASSPATH_FLAG) -source $(SOURCE_VERSION) -target $(TARGET_VERSION) $(JAVAC_OPTIONS) # runtime flags RUN_JAVA_FLAGS += $(CLASSPATH_FLAG) $(MEMORY_FLAG) $(WORKAROUND_FLAGS) $(JAVA_OPTIONS) -ea # javadoc flags JAVADOC_FLAGS += $(CLASSPATH_FLAG) -source $(JAVADOC_SOURCE_VERSION) -private -use -author -doctitle $(APPNAME) `if [ -e overview.html ]; then echo -overview overview.html; else echo ""; fi` # subpackage makefiles SUBPACKAGE_MAKEFILES = $(addsuffix /makefile,$(PACKAGE_SUBDIRS)) # HTML stuff .SUFFIXES: .m4 .phtml .html WWWROOT = $(HOME)/www html-m4 = m4 -P "-DBUILD_DATE=`date`" "-DYEAR=`date +%Y`" "-I$(WWWROOT)/include" $(1) > $(2) html-cpp = gcc -E -P -traditional "-DBUILD_DATE=`date`" "-DYEAR=`date +%Y`" "-I$(WWWROOT)/include" - < $(1) > $(2) # function to generate a javadoc command line # # javadoc will be deposited in $(JAVADOC_DIR) # # first arg is list of base packages. Javadoc will be built for all # subpackages of the base packages. javadoc = $(JAVADOC) $(JAVADOC_FLAGS) -d $(JAVADOC_DIR) $(foreach P,$(1), -subpackages $(P)) # function to make a target recursively # first argument is target to make # second argument is "true" to continue on fail, "false" to stop on fail recursively-make = $(foreach DIR,$(PACKAGE_SUBDIRS),[ ! -d $(DIR) ] || pushd $(DIR) > /dev/null && ( $(MAKE) $(1) || $(2) ) && popd > /dev/null && ) true # function to make something from $(PROJECT_HOME) make-from-project-home = \ @echo making $(1) from $(PROJECT_HOME); \ $(CD) $(PROJECT_HOME) && $(MAKE) $(1) # function to convert a package name to a path package-to-path = $(subst .,/,$(1)) # function to extract the package part of a full class name (not including # the trailing .class) package-part = \ $(basename $(1)) # function to extract the class part of a full class name (not including the # trailing .class) class-part = \ $(subst .,,$(suffix $(1))) # use this target as a prereq to force another target .PHONY: FORCE FORCE: # pattern rules # initialize a new class file %.java-template: $(JAVA_TEMPLATE) if [ ! -f ./$(basename $@).java ] || [ ! -s ./$(basename $@).java ]; then $(call template-m4-java,$@); else echo ./$(basename $@).java exists and is non-empty, not overwriting; fi .PHONY: java-templates java-templates: $(foreach F,$(shell find . -maxdepth 1 -size 0 -name "*.java"),$(call template-m4-java,$F); ) # initialize a new Exception class file %.java-exception-template: $(EXCEPTION_TEMPLATE) if [ ! -f ./$(basename $@).java ]; then cp $(EXCEPTION_TEMPLATE) ./$(basename $@).java; else echo ./$(basename $@).java exists, not overwriting; fi # initialize a new package.html file .PHONY: package.html-template package.html-template: $(PACKAGE_TEMPLATE) if [ ! -f package.html ]; then cp $(PACKAGE_TEMPLATE) ./package.html; else echo ./package.html exists, not overwriting; fi # initialize a new makefile.package file .PHONY: makefile.package-template makefile.package-template: $(MAKEFILE_PACKAGE_TEMPLATE) if [ ! -f makefile.package ]; then cp $(MAKEFILE_PACKAGE_TEMPLATE) ./makefile.package; else echo ./makefile.package exists, not overwriting; fi # make html from m4 %.html: %.m4 $(call html-m4,$<,$@) if [ -x "$(WWWIMAGESIZE)" ]; then $(WWWIMAGESIZE) -MakeBackup no $@; fi # make html from phtml by sending it through the C pre-processor %.html: %.phtml $(call html-cpp,$<,$@) if [ -x "$(WWWIMAGESIZE)" ]; then $(WWWIMAGESIZE) -MakeBackup no $@; fi # build a .class file from a .java file ifeq ($(findstring CYGWIN,$(SYSTEM)),CYGWIN) #fix paths on cygwin. ARGH... ifdef USING_COMPILE_SERVER %.class: %.java $(JAVAC) $(JAVAC_FLAGS) "`cygpath -w "$(addprefix $(shell pwd)/,$<)"`" else %.class: %.java $(JAVAC) $(JAVAC_FLAGS) $< endif else # not on cygwin. Phew. %.class: %.java $(JAVAC) $(JAVAC_FLAGS) $< endif # build Java source files from a .jj grammar file %.java: %.jj $(JAVACC) $< # run a class in a specific package $(PROJECT).%.run: $(if BUILD_BEFORE_RUN,$(PROJECT).%.class,) $(JAVA) $(RUN_JAVA_FLAGS) $(basename $@) # run a class in the current package with a main() function directly %.run: $(if BUILD_BEFORE_RUN,%.class,) $(JAVA) $(RUN_JAVA_FLAGS) $(PACKAGE).$(basename $@) # run a class in appletviewer (specify html filename without path or extension) %.appletviewer: $(JDK_HOME)/bin/appletviewer $(basename $@).html # build a class in a specific package $(PROJECT).%.class: $(CD) $(PROJECT_HOME)/../$(call package-to-path,$(call package-part,$(basename $@))) && $(MAKE) $(call class-part,$(basename $@)).class # build a specific package $(PROJECT).%.package-make: @echo making package $@ $(CD) $(PROJECT_HOME)/../$(call package-to-path,$(basename $@)) && $(MAKE) package # recursive build of the base package is a project build # note the semicolon which makes this an "empty command"!! # without it the %.recursive pattern would get called after this runs # resulting in an infinite loop!! $(PROJECT).package-make.recursive: project ; # build a specific package and all descendant packages $(PROJECT).%.package-make.recursive: @echo making package $@ and all descendant packages $(CD) $(PROJECT_HOME)/../$(call package-to-path,$(basename $(basename $@))) && $(MAKE) package.recursive # trick make into building the base package when asked # if we don't do this then a spurious implicit rule gets invoked because the # base package has no .suffix $(PROJECT).package-make: @echo making base package $(CD) $(PROJECT_HOME) && $(MAKE) package # recursively make something %.recursive: # @echo recursively making $(basename $@) $(MAKE) $(basename $@) $(call recursively-make,$@,true) # fun targets .PHONY: love love: @echo not war .PHONY: pull-plug pull-plug: @echo My mind is going. I can FEEL it. .PHONY: open-the-pod-bay-doors-hal open-the-pod-bay-doors-hal: @echo I\'m sorry `finger \`whoami\` | sed -e '2,$$d' -e '1s/.*:.*:[ ]*\([^ ]*\).*/\1/'`, I\'m afraid I can\'t do that. # global targets # utility targets .PHONY: show-exclude-source show-exclude-source: @echo $(EXCLUDE_SOURCE) .PHONY: show-exclude-subdirs show-exclude-subdirs: @echo $(EXCLUDE_SUBDIRS) .PHONY: show-package show-package: @echo $(PACKAGE) .PHONY: show-project-home show-project-home: @echo $(PROJECT_HOME) .PHONY: show-classpath show-classpath: @echo $(MAKE_CLASSPATH) .PHONY: show-jdk-home show-jdk-home: @echo $(JDK_HOME) .PHONY: show-jdk-ext show-jdk-ext: @echo $(JDK_EXT) .PHONY: show-tools-ext show-tools-ext: @echo $(TOOLS_EXT) .PHONY: show-ext-dir show-ext-dir: @echo $(EXT_DIR) .PHONY: show-java show-java: @echo $(JAVA) .PHONY: show-run-java-flags show-run-java-flags: @echo $(RUN_JAVA_FLAGS) .PHONY: show-run-java-with-flags show-run-java-with-flags: @echo $(JAVA) $(RUN_JAVA_FLAGS) .PHONY: show-run-java-with-flags-and-package show-run-java-with-flags-and-package: @echo $(JAVA) $(RUN_JAVA_FLAGS) $(PACKAGE) .PHONY: show-bin show-bin: @echo $(BIN) .PHONY: show-cs-bin show-cs-bin: @echo $(CS_BIN) .PHONY: show-scripts show-scripts: @echo $(SCRIPTS) .PHONY: show-cs-scripts show-cs-scripts: @echo $(CS_SCRIPTS) .PHONY: show-settings show-settings: @echo Make settings: @echo APPNAME: $(APPNAME) @echo BASE_PACKAGE: $(BASE_PACKAGE) @echo ARCH: $(ARCH) @echo TOOLS_HOME: $(TOOLS_HOME) @echo SCRIPTS: $(SCRIPTS) @echo CS_SCRIPTS: $(CS_SCRIPTS) @echo CS_BIN: $(CS_BIN) @echo CS_ENSURE: $(CS_ENSURE) @echo CS_SUBMIT: $(CS_SUBMIT) @echo JDK_BASE: $(JDK_BASE) @echo JDK_HOME: $(JDK_HOME) @echo JDK_EXT: $(JDK_EXT) @echo TOOLS_EXT: $(TOOLS_EXT) @echo EXT_DIR: $(EXT_DIR) @echo JDK_VERSION: $(JDK_VERSION) @echo SOURCE_VERSION: $(SOURCE_VERSION) @echo TARGET_VERSION: $(TARGET_VERSION) @echo JAVAC: $(JAVAC) @echo JAVA: $(JAVA) @echo JAVADOC: $(JAVADOC) @echo JAVACC: $(JAVACC) @echo JAR: $(JAR) @echo NO_COMPILE_SERVER: "$(NO_COMPILE_SERVER)" @echo USING_COMPILE_SERVER: "$(USING_COMPILE_SERVER)" @echo SHELL: $(SHELL) @echo CD: $(CD) @echo PROJECT: $(PROJECT) @echo PROJECT_HOME: $(PROJECT_HOME) ifdef ROOT_PACKAGE @echo this is the root package else @echo this is not the root package endif @echo PACKAGE: $(PACKAGE) @echo PACKAGE_PATH: '$(PACKAGE_PATH)' @echo PACKAGE_NAME: $(PACKAGE_NAME) @echo EXCLUDE_SUBDIRS: $(EXCLUDE_SUBDIRS) @echo PACKAGE_SUBDIRS: $(PACKAGE_SUBDIRS) @echo EXCLUDE_SOURCE: $(EXCLUDE_SOURCE) @echo PACKAGE_SOURCE: $(PACKAGE_SOURCE) @echo PACKAGE_HTML_SOURCE: $(PACKAGE_HTML_SOURCE) @echo SOURCE: $(SOURCE) @echo SUBPROJECT_PACKAGES: $(SUBPROJECT_PACKAGES) @echo JAVAC_FLAGS: '$(JAVAC_FLAGS)' @echo JAVADOC_FLAGS: '$(JAVADOC_FLAGS)' @echo JAVADOC_DIR: $(JAVADOC_DIR) @echo JAR_DIR: $(JAR_DIR) @echo JAR_MF: $(JAR_MF) @echo JARKEY: $(JARKEY) @echo JAR_CRT: $(JAR_CRT) @echo EXT_JARS: $(EXT_JARS) @echo MAKE_CLASSPATH: '$(MAKE_CLASSPATH)' @echo SUBPACKAGE_MAKEFILES: $(SUBPACKAGE_MAKEFILES) @echo PUBLISH_DEST: $(PUBLISH_DEST) # package targets # make the current package .PHONY: package package: $(EXTRA_PACKAGE_DEPS) $(if $(NO_SOURCE_GEN),,package-source-gen) package-javacc-make $(addsuffix .class,$(basename $(PACKAGE_SOURCE))) $(addsuffix .html,$(basename $(PACKAGE_HTML_SOURCE))) $(EXTRA_PACKAGE_CMDS) # make javacc in the current package .PHONY: packge-javacc-make package-javacc-make: $(addsuffix .class,$(basename $(wildcard *.jj))) # make the makefile in the current package ifndef ROOT_PACKAGE makefile: $(PROJECT_HOME)/makefile @$(CD) .. && $(MAKE) $(PACKAGE_NAME)/makefile else makefile: FORCE endif .PHONY: clean clean: $(EXTRA_CLEAN_DEPS) @echo removing all .class files in this package $(RM) *.class .PHONY: c-clean c-clean: @echo removing all .o files in this package $(RM) *.o .PHONY: javacc-clean javacc-clean: @echo removing javacc-generated files $(RM) `ls *.java | xargs grep -l "Generated By:JavaCC"` .PHONY: rmiwrap-clean rmiwrap-clean: @echo removing RMIWrap-generated files $(RM) `ls *.java | xargs grep -l "generated by RMIWrap"` .PHONY: html-clean html-clean: @echo removing all generated html $(RM) $(addsuffix .html,$(basename $(PACKAGE_HTML_SOURCE))) .PHONY: jar-clean jar-clean: $(RM) $(JARFILE) $(JARFILE_LITE) $(JARFILE_XLITE) .PHONY: javadoc-clean javadoc-clean: $(RM) -r $(JAVADOC_DIR) .PHONY: realclean realclean: $(EXTRA_REALCLEAN_DEPS) clean rmiwrap-clean javacc-clean html-clean jar-clean javadoc-clean if [ -f core ]; then $(RM) core; fi .PHONY: package-javacc-gen package-javacc-gen: $(addsuffix .java,$(basename $(wildcard *.jj))) .PHONY: package-source-gen package-source-gen: package-javacc-gen # project targets .PHONY: project-announce project-announce: @echo making project .PHONY: project project: project-announce $(if $(NO_SOURCE_GEN),,project-source-gen) $(call make-from-project-home,package.recursive) .PHONY: project-javacc-gen project-javacc-gen: makefiles $(call make-from-project-home,package-javacc-gen.recursive) .PHONY: project-source-gen project-source-gen: makefiles $(call make-from-project-home,package-source-gen.recursive) .PHONY: project-javadoc project-javadoc: $(call make-from-project-home,subproject-javadoc) .PHONY: subproject-javadoc subproject-javadoc: if [ "$(SUBPROJECT_PACKAGES)" ]; then $(call javadoc,$(SUBPROJECT_PACKAGES)); fi .PHONY: project-clean project-clean: $(call make-from-project-home,clean.recursive) .PHONY: project-realclean project-realclean: $(call make-from-project-home,realclean.recursive) $(SUBPACKAGE_MAKEFILES): makefile @if [ -e $@ ] && [ `grep -c super-ninja $@ 2> /dev/null ` -eq 0 ]; \ then echo "$@ exists but is not super-ninja, skipping"; \ else echo "(re)making $@" && \ $(RM) $@ && \ sed \ -e 's|^$(WS)PROJECT_HOME$(WS)=$(WS)\(.*\)$(WS)|PROJECT_HOME = ../\1|' \ -e 's/^$(WS)PACKAGE$(WS)=$(WS)\(.*\)$(WS)/PACKAGE = \1.$(subst /,,$(dir $@))/' \ -e 's/^$(WS)if-root-package$(WS)=.*/if-root-package = $$(2)/' \ makefile > $@; fi .PHONY: makefiles makefiles: $(SUBPACKAGE_MAKEFILES) @echo making makefiles @$(call recursively-make,makefiles,true) # make the jar key .PHONY: keygen keygen: $(JDK_HOME)/bin/keytool -genkey -keyalg rsa -alias $(JARKEY) $(JDK_HOME)/bin/keytool -export -alias $(JARKEY) -file $(JAR_CRT) # make the jar # # the jar is built containing all rsync-able files in all # $(SUBPROJECT_PACKAGES), the subproject javadoc, and the makefile from the # base package. Subproject packages ending in "." are copied non-recursively, # else they are copied recursively. # # empty dirs will not be included in the jar # # all $(EXT_JARS), if any, are folded into the jarfile # # if $(JAR_MF) exists it is used as the jar manifest # # if $(JAR_CRT) exist the jar is signed with $(JARKEY) .PHONY: jar jar: $(call make-jar,true,$(EXT_JARS),$(JARFILE),$(JARFILE_EXTS),$(JAR_EXTRA),$(SUBPROJECT_PACKAGES)) # make the lite jar # # same as the "jar" target except uses LITE_SUBPROJECT_PACKAGES, EXT_JARS_LITE, # JARFILE_LITE_EXTS, JAR_LITE_EXTRA, and never includes the javadoc tree jar-lite: $(call make-jar,false,$(EXT_JARS_LITE),$(JARFILE_LITE),$(JARFILE_LITE_EXTS),$(JAR_LITE_EXTRA),$(LITE_SUBPROJECT_PACKAGES)) # make the xlite jar # # same as the "jar-lite" target except uses XLITE_SUBPROJECT_PACKAGES, # EXT_JARS_XLITE, JARFILE_XLITE_EXTS, and JAR_XLITE_EXTRA .PHONY: jar-xlite jar-xlite: $(call make-jar,false,$(EXT_JARS_XLITE),$(JARFILE_XLITE),$(JARFILE_XLITE_EXTS),$(JAR_XLITE_EXTRA),$(XLITE_SUBPROJECT_PACKAGES)) # publish to PUBLISH_DEST # # rsyncs $(JARFILE) (and $(JARFILE_LITE), and $(JARFILE_XLITE), if any) # there AND rsync's $(JARFILE_PUBLISH_UNPACK)'s contents there .PHONY: publish ifdef PUBLISH_DEST publish: @echo publishing to $(PUBLISH_DEST) if [ $(JARFILE_PUBLISH_UNPACK) ]; then \ mkdir .$(JARFILE_PUBLISH_UNPACK)-unpack.tmp; \ cd .$(JARFILE_PUBLISH_UNPACK)-unpack.tmp && $(JAR) xvf ../$(JARFILE_PUBLISH_UNPACK) && $(call rsync,*,$(PUBLISH_DEST)); \ cd .. && rm -rf .$(JARFILE_PUBLISH_UNPACK)-unpack.tmp; \ fi if [ $(JARFILE) -a -f $(JARFILE) ]; then $(call rsync,$(JARFILE),$(PUBLISH_DEST)); fi if [ $(JARFILE_LITE) -a -f $(JARFILE_LITE) ]; then $(call rsync,$(JARFILE_LITE),$(PUBLISH_DEST)); fi if [ $(JARFILE_XLITE) -a -f $(JARFILE_XLITE) ]; then $(call rsync,$(JARFILE_XLITE),$(PUBLISH_DEST)); fi $(EXTRA_PUBLISH_CMDS) else publish: $(JARFILE) @echo PUBLISH_DEST not set $(EXTRA_PUBLISH_CMDS) endif # publish to PUBLISH_DEST # # rsyncs $(JARFILE_LITE), there .PHONY: publish-lite ifdef PUBLISH_DEST publish-lite: $(JARFILE_LITE) @echo publishing to $(PUBLISH_DEST) $(call rsync,$(JARFILE_LITE),$(PUBLISH_DEST)) $(EXTRA_PUBLISH_CMDS) else publish-lite: $(JARFILE_LITE) @echo PUBLISH_DEST not set $(EXTRA_PUBLISH_CMDS) endif visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/processor/000077500000000000000000000000001147500217100246025ustar00rootroot00000000000000visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/processor/FatnessProcessor.java000066400000000000000000000102531147500217100307510ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.processor; import java.util.*; import java.awt.image.*; import visolate.*; import visolate.model.*; public class FatnessProcessor extends Processor { private static final String cvsid = "$Id: FatnessProcessor.java,v 1.1 2004/08/05 20:06:52 vona Exp $"; public FatnessProcessor(Visolate visolate) { super(visolate); } public void processTile(int r, int c, int ulx, int uly, int width, int height, double left, double bottom, double right, double top) { // System.out.println("processTile: " + // "(row, col) = (" + r + ", " + c + "); " + // "ul = (" + ulx + ", " + uly + "); " + // "dimensions = (" + width + ", " + height + "); " + // "lbrt = " + // left + ", " + bottom + ", " + right + ", " + top + ")"); if (width < 2) return; visolate.resetInnerProgressBar(height); try { // display.getStill(tile); tile = display.getStill(); //work around j3d bug buffer = tile.getRaster().getDataBuffer(); //work around j3d bug for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { int color = getPixel(x, y) & 0xffffff; if (color == 0) continue; Net net = model.getNet(color); if (net != null) net.incrementAreaPixels(); else misses++; if (thread.isInterrupted()) return; } visolate.tickInnerProgressBar(); } } catch (InterruptedException e) { thread.interrupt(); //reset interrupt status } } private int getPixel(int x, int y) { return buffer.getElem(y*canvasWidthPels + x); } protected void processStarted() { tile = display.makeBufferedImage(canvasWidthPels, canvasHeightPels); Raster raster = tile.getRaster(); buffer = raster.getDataBuffer(); model.enableBorderGeometry(false); model.enableLineGeometry(false); model.enableGCodeGeometry(false); model.setTranslucent2D(false); Collection nets = model.getNets(); for (Net net :nets) { net.resetArea(dpi); } } private void restoreModel() { model.setToolDiameter(toolDiameterWas); model.enableBorderGeometry(borderGeometryWas); model.enableLineGeometry(lineGeometryWas); model.enableGCodeGeometry(gcodeGeometryWas); model.setTranslucent2D(wasTranslucent); } protected void processInterrupted() { restoreModel(); } protected void processCompleted() { tile = null; restoreModel(); System.out.println(misses + " misses"); Collection nets = model.getNets(); if (nets.size() == 0) return; double avg = 0.0; int n = 0; for (Iterator it = nets.iterator(); it.hasNext(); ) { Net net = (Net) it.next(); if (net.getLength() <= 0.0) continue; if (net.getArea() <= 0.0) continue; avg += net.getFatness(); n++; // net.dump(); } avg /= (double) n; System.out.println("avg fatness = " + avg); } protected BufferedImage tile = null; private DataBuffer buffer; private int misses = 0; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/processor/MosaicProcessor.java000066400000000000000000000056641147500217100305730ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.processor; import java.awt.*; import java.awt.image.*; import java.awt.geom.*; import visolate.*; public class MosaicProcessor extends Processor { private static final String cvsid = "$Id: MosaicProcessor.java,v 1.1.1.1 2004/06/24 05:46:01 vona Exp $"; public MosaicProcessor(Visolate visolate) { super(visolate); } public void processTile(int r, int c, int ulx, int uly, int width, int height, double left, double bottom, double right, double top) { // System.out.println("processTile: " + // "(row, col) = (" + r + ", " + c + "); " + // "ul = (" + ulx + ", " + uly + "); " + // "dimensions = (" + width + ", " + height + "); " + // "lbrt = " + // left + ", " + bottom + ", " + right + ", " + top + ")"); AffineTransform transform = new AffineTransform(); transform.translate(ulx, uly); try { // mosaicG2D.drawRenderedImage(display.getStill(tile), transform); //work around j3d bug mosaicG2D.drawRenderedImage(display.getStill(), transform); } catch (InterruptedException e) { thread.interrupt(); //reset interrupt status } } protected void processStarted() { mosaicWidth = modelWidthPels; mosaicHeight = modelHeightPels; System.out.println("mosaic: " + mosaicWidth + " x " + mosaicHeight); System.out.println("tile: " + canvasWidthPels + " x " + canvasHeightPels); mosaic = display.makeBufferedImage(mosaicWidth, mosaicHeight); tile = display.makeBufferedImage(canvasWidthPels, canvasHeightPels); mosaicG2D = (Graphics2D) mosaic.getGraphics(); } protected void processCompleted() { mosaicG2D.dispose(); mosaicG2D = null; tile = null; } protected int mosaicWidth; protected int mosaicHeight; protected BufferedImage mosaic = null; protected BufferedImage tile = null; protected Graphics2D mosaicG2D = null; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/processor/Processor.java000066400000000000000000000167721147500217100274410ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.processor; import java.util.*; import javax.media.j3d.*; import visolate.*; import visolate.misc.*; import visolate.model.*; public abstract class Processor { private static final String cvsid = "$Id: Processor.java,v 1.3 2006/08/29 04:02:32 vona Exp $"; public static final double MOSAIC_BORDER_PELS = 8.0; public Processor(Visolate visolate) { this.visolate = visolate; model = visolate.getModel(); display = visolate.getDisplay(); } public void start() { thread.start(); } public void stop() throws InterruptedException { while (thread.isAlive()) { thread.interrupt(); // System.out.println("interrupt!"); Thread.sleep(100); } } public abstract void processTile(int r, int c, int ulx, int uly, int width, int height, double left, double bottom, double right, double top); private void process() { long startTime = System.currentTimeMillis(); String processName = getClass().toString(); processName = processName.substring(processName.lastIndexOf(".") + 1, processName.length()); System.out.println((new Date(startTime)).toString() + ": " + processName + " started"); visolate.enableControls(false); model.enableControls(false); display.processStarted(); borderGeometryWas = model.isBorderGeometryEnabled(); lineGeometryWas = model.isLineGeometryEnabled(); voronoiGeometryWas = model.isVoronoiGeometryEnabled(); flatGeometryWas = model.isFlatGeometryEnabled(); wasTranslucent = model.isTranslucent2D(); gcodeGeometryWas = model.isGCodeGeometryEnabled(); System.out.println("border: " + borderGeometryWas); System.out.println("line: " + lineGeometryWas); System.out.println("voronoi: " + voronoiGeometryWas); System.out.println("flat: " + flatGeometryWas); System.out.println("translucent: " + wasTranslucent); System.out.println("gcode: " + gcodeGeometryWas); toolDiameterWas = model.getToolDiameter(); System.out.println("tool diameter: " + toolDiameterWas); dpi = display.getDPI(); System.out.println("DPI: " + dpi); Rect b = model.getModelBounds(); mosaicBounds = new Rect(b.x - MOSAIC_BORDER_PELS/((double) dpi), b.y - MOSAIC_BORDER_PELS/((double) dpi), b.width + 2.0*MOSAIC_BORDER_PELS/((double) dpi), b.height + 2.0*MOSAIC_BORDER_PELS/((double) dpi)); canvasWidth = display.getVirtualCanvasWidth(); canvasHeight = display.getVirtualCanvasHeight(); canvasWidthPels = display.getCanvasWidth(); canvasHeightPels = display.getCanvasHeight(); modelWidth = mosaicBounds.width; modelHeight = mosaicBounds.height; modelWidthPels = (int) Math.ceil(dpi*modelWidth); modelHeightPels = (int) Math.ceil(dpi*modelHeight); rows = modelHeight/canvasHeight; cols = modelWidth/canvasWidth; numRows = (int) Math.ceil(rows); numCols = (int) Math.ceil(cols); visolate.resetOuterProgressBar(numRows*numCols); processStarted(); for (int r = 0; r < numRows; r++) { for (int c = 0; c < numCols; c++) { double left = c*canvasWidth; double top = modelHeight - r*canvasHeight; double right = left + canvasWidth; if (right > mosaicBounds.width) right = mosaicBounds.width; double bottom = top - canvasHeight; if (bottom < 0.0) bottom = 0.0; // int ulx = (int) Math.ceil(left*((double) dpi)); // int uly = (int) Math.ceil((modelHeight-top)*((double) dpi)); int ulx = c*canvasWidthPels; int uly = r*canvasHeightPels; int lrx = ulx+canvasWidthPels; if (lrx > modelWidthPels) lrx = modelWidthPels; int lry = uly+canvasHeightPels; if (lry > modelHeightPels) lry = modelHeightPels; int width = lrx-ulx; int height = lry-uly; left += mosaicBounds.x; bottom += mosaicBounds.y; right += mosaicBounds.x; top += mosaicBounds.y; double cx = left + canvasWidth/2; double cy = top - canvasHeight/2; display.setCenter(cx, cy); try { display.waitForViewUpdate(); } catch (InterruptedException e) { thread.interrupt(); //re-set interrupt status } processTile(r, c, ulx, uly, width, height, left, bottom, right, top); if (thread.isInterrupted()) { processInterrupted(); visolate.enableControls(true); model.enableControls(true); display.processFinished(); visolate.processFinished(); long endTime = System.currentTimeMillis(); System.out.println((new Date(endTime)).toString() + ": " + processName + " interrupted " + "(" + (endTime-startTime) + "ms)"); return; } visolate.tickOuterProgressBar(); } } processCompleted(); visolate.enableControls(true); model.enableControls(true); display.processFinished(); visolate.processFinished(); long endTime = System.currentTimeMillis(); System.out.println((new Date(endTime)).toString() + ": " + processName + " finished (" + (endTime-startTime) + "ms)"); } protected void processStarted() {} protected void processInterrupted() {} protected void processCompleted() {} protected Thread thread = new Thread() { { setPriority(VirtualUniverse.getJ3DThreadPriority()-1); setDaemon(true); } public void run() { process(); } }; protected Visolate visolate; protected Model model; protected Display display; protected Rect mosaicBounds; protected int dpi; protected double modelWidth; protected double modelHeight; protected int modelWidthPels; protected int modelHeightPels; protected double canvasWidth; protected double canvasHeight; protected int canvasWidthPels; protected int canvasHeightPels; protected double rows; protected double cols; protected int numRows; protected int numCols; protected boolean borderGeometryWas; protected boolean lineGeometryWas; protected boolean voronoiGeometryWas; protected boolean flatGeometryWas; protected boolean gcodeGeometryWas; protected boolean wasTranslucent; protected double toolDiameterWas; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/processor/SaveMosaic.java000066400000000000000000000104611147500217100275010ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.processor; import java.util.*; import java.io.*; import java.awt.*; import java.awt.image.*; import java.awt.geom.*; import javax.imageio.*; import javax.imageio.stream.*; import visolate.*; public class SaveMosaic extends MosaicProcessor { private static final String cvsid = "$Id: SaveMosaic.java,v 1.1.1.1 2004/06/24 05:46:01 vona Exp $"; public SaveMosaic(Visolate visolate, File mosaicFile, boolean individualTiles) { super(visolate); this.mosaicFile = mosaicFile; this.individualTiles = individualTiles; fileName = mosaicFile.toString(); int dot = fileName.lastIndexOf("."); if ((dot < 0) || (dot == fileName.length()-1)) { System.err.println("unspecified format (give a suffix like \".png\")"); return; } fileNameBase = fileName.substring(0, dot); fileNameSuffix = fileName.substring(dot+1, fileName.length()); Iterator it = ImageIO.getImageWritersBySuffix(fileNameSuffix); if (!it.hasNext()) { System.err.println("cannot write format \"" + fileNameSuffix + "\""); return; } imageWriter = (ImageWriter) it.next(); } public void processTile(int r, int c, int ulx, int uly, int width, int height, double left, double bottom, double right, double top) { if (individualTiles) visolate.resetInnerProgressBar(2); else visolate.resetInnerProgressBar(1); super.processTile(r, c, ulx, uly, width, height, left, bottom, right, top); visolate.tickInnerProgressBar(); if (!individualTiles) return; if (imageWriter == null) return; String rText = Integer.toString(r); for (int i = 0; i < 3; i++) if (rText.length() < 3) rText = "0" + rText; String cText = Integer.toString(c); for (int i = 0; i < 3; i++) if (cText.length() < 3) cText = "0" + cText; File file = new File(fileNameBase + "-" + rText + "-" + cText + "." + fileNameSuffix); if ((width == tile.getWidth()) && (height == tile.getHeight())) { saveFile(file, tile); } else { BufferedImage cropTile = display.makeBufferedImage(width, height); Graphics2D cropG2D = (Graphics2D) (cropTile.getGraphics()); cropG2D.drawRenderedImage(tile, new AffineTransform()); cropG2D.dispose(); saveFile(file, cropTile); } visolate.tickInnerProgressBar(); } protected void processCompleted() { super.processCompleted(); if (individualTiles) return; saveFile(mosaicFile, mosaic); } private void saveFile(File file, BufferedImage bufferedImage) { if (imageWriter == null) return; try { ImageOutputStream outputStream = new FileImageOutputStream(file); imageWriter.setOutput(outputStream); imageWriter.write(bufferedImage); outputStream.close(); } catch (IOException e) { System.err.println("I/O Exception writing \"" + file + "\": " + e.getMessage()); } } private File mosaicFile; private boolean individualTiles; private String fileName; private String fileNameSuffix; private String fileNameBase; private ImageWriter imageWriter; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/processor/ToolpathsProcessor.java000066400000000000000000001020771147500217100313310ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.processor; import java.awt.image.*; import javax.media.j3d.*; import javax.vecmath.*; import java.util.*; import java.util.Locale; import java.text.*; import java.io.*; import visolate.*; import visolate.model.*; import visolate.misc.*; /** * The ToolpathsProcessor generates the content for a g-code file. */ public class ToolpathsProcessor extends MosaicProcessor { private static final String cvsid = "$Id: ToolpathsProcessor.java,v 1.8 2004/09/08 19:40:30 vona Exp $"; public static final int N = 0; public static final int S = 1; public static final int W = 2; public static final int E = 3; public static final Color3f ORIGIN_COLOR = new Color3f(1.0f, 0.0f, 1.0f); public static final float ORIGIN_TICK = 0.1f; public static final double[] HORIZ_DIR_BIAS = {-1, 1, 1, -1}; public static final double[] VERT_DIR_BIAS = {1, 1, -1, -1}; public static final int VORONOI_MODE = 0; public static final int OUTLINE_MODE = 1; public static final int DEF_MODE = VORONOI_MODE; public static final double MMPERINCH = 25.4; /** * This is the number format used for all numbers in the gcode. */ private static NumberFormat gCodeFormat = new DecimalFormat("###.#####", new DecimalFormatSymbols(Locale.ENGLISH)); /** * How much to move the toolhead in z-direction between cutting and moving. */ public static final double CLEARANCE_Z = 0.1; public static final Color3f G_CODE_COLOR_NORMAL = new Color3f(0.0f, 1.0f, 0.0f); public static final Color3f G_CODE_COLOR_RAPID = new Color3f(1.0f, 1.0f, 0.0f); /** * If set to true, output absolute coordinates instead of relative. */ private boolean outputAbsoluteCoordinates; /** * If set to true, output metric coordinates instead of relative. */ private boolean outputMetricCoordinates; /** * @return If set to true, output metric coordinates instead of relative. */ public boolean isOutputMetricCoordinates() { return outputMetricCoordinates; } /** * @param outputMetricCoordinates If set to true, output metric coordinates instead of relative. */ public void setOutputMetricCoordinates(final boolean outputMetricCoordinates) { this.outputMetricCoordinates = outputMetricCoordinates; } /** * We move this much upward from cutting to traveling. */ private double myzClearance; /** * If we use absolute coordinates, * then this is the height-value for cutting. * @see #isOutputAbsoluteCoordinates() */ private double myZCuttingHeight = 0.0; /** * If we use absolute coordinates, * then this is the X-value for the left upper corner. * @see #isOutputAbsoluteCoordinates() */ private double myAbsoluteXStart = 0.0; /** * @return If we use absolute coordinates, then this is the X-value for the left upper corner. * @see #isOutputAbsoluteCoordinates() */ public double getAbsoluteXStart() { return myAbsoluteXStart; } /** * @param myZCuttingHeight If we use absolute coordinates, then this is the X-value for the left upper corner. * @see #isOutputAbsoluteCoordinates() */ public void setAbsoluteXStart(final double setAbsoluteXStart) { this.myAbsoluteXStart = setAbsoluteXStart; } /** * @return If we use absolute coordinates, then this is the Y-value for the left upper corner. * @see #isOutputAbsoluteCoordinates() */ public double getAbsoluteYStart() { return myAbsoluteYStart; } /** * @param myZCuttingHeight If we use absolute coordinates, then this is the Y-value for the left upper corner. * @see #isOutputAbsoluteCoordinates() */ public void setAbsoluteYStart(final double setAbsoluteYStart) { this.myAbsoluteYStart = setAbsoluteYStart; } private double myMovementSpeed = 2; private double myMillingSpeed = 2; public double getMovementSpeed() { return myMovementSpeed; } public void setMovementSpeed(double myMovementSpeed) { this.myMovementSpeed = myMovementSpeed; } public double getMillingSpeed() { return myMillingSpeed; } public void setMillingSpeed(double myMillingSpeed) { this.myMillingSpeed = myMillingSpeed; } /** * If we use absolute coordinates, * then this is the X-value for the left upper corner. * @see #isOutputAbsoluteCoordinates() */ private double myAbsoluteYStart = 0.0; /** * @return If we use absolute coordinates, then this is the height-value for cutting. * @see #isOutputAbsoluteCoordinates() */ public double getZCuttingHeight() { return myZCuttingHeight; } /** * @param myZCuttingHeight If we use absolute coordinates, then this is the height-value for cutting. * @see #isOutputAbsoluteCoordinates() */ public void setZCuttingHeight(final double myZCuttingHeight) { this.myZCuttingHeight = myZCuttingHeight; } /** * @return We move this much upward from cutting to traveling. */ public double getZClearance() { return myzClearance; } /** * @param myzClearance We move this much upward from cutting to traveling. */ public void setZClearance(final double myzClearance) { this.myzClearance = myzClearance; } /** * @return If true, output absolute coordinates instead of relative. */ public boolean isOutputAbsoluteCoordinates() { return outputAbsoluteCoordinates; } /** * @param outputAbsoluteCoordinates If true, output absolute coordinates instead of relative. */ public void setOutputAbsoluteCoordinates(final boolean outputAbsoluteCoordinates) { this.outputAbsoluteCoordinates = outputAbsoluteCoordinates; } public ToolpathsProcessor(final Visolate visolate, final int mode, final boolean useAbsoluteCoordinates, final double zClearance, final boolean metric) { super(visolate); this.mode = mode; this.outputMetricCoordinates = metric; this.outputAbsoluteCoordinates = useAbsoluteCoordinates; this.myzClearance = zClearance; } public void processTile(int r, int c, int ulx, int uly, int width, int height, double left, double bottom, double right, double top) { visolate.resetInnerProgressBar(1); super.processTile(r, c, ulx, uly, width, height, left, bottom, right, top); visolate.tickInnerProgressBar(); } protected void processStarted() { super.processStarted(); java.awt.image.Raster raster = mosaic.getRaster(); buffer = raster.getDataBuffer(); switch (mode) { case VORONOI_MODE: System.out.println("generating voronoi toolpaths"); model.enableBorderGeometry(true); model.enableLineGeometry(false); model.enableVoronoiGeometry(true); model.enableFlatGeometry(true); model.enableGCodeGeometry(false); break; case OUTLINE_MODE: System.out.println("generating outline toolpaths"); model.enableBorderGeometry(false); model.enableLineGeometry(false); model.enableVoronoiGeometry(false); model.enableFlatGeometry(true); model.enableGCodeGeometry(false); break; default: System.out.println("no mode!"); return; } model.setTranslucent2D(false); model.clearPaths(); model.clearGCode(); straightTol = 0.5/((double) dpi); } private void restoreModel() { model.enableBorderGeometry(borderGeometryWas); model.enableLineGeometry(lineGeometryWas); model.enableVoronoiGeometry(voronoiGeometryWas); model.enableFlatGeometry(flatGeometryWas); model.enableGCodeGeometry(gcodeGeometryWas); model.setTranslucent2D(wasTranslucent); } protected void processInterrupted() { restoreModel(); } protected void processCompleted() { super.processCompleted(); restoreModel(); tile = null; extractNodes(); if (thread.isInterrupted()) return; makePaths(); if (thread.isInterrupted()) return; optimizePaths(); if (thread.isInterrupted()) return; model.setPaths(getSceneGraph()); } private void extractNodes() { System.out.println("extracting nodes..."); visolate.resetInnerProgressBar(mosaicHeight); for (int y = 0; y < mosaicHeight; y++) { for (int x = 0; x < mosaicWidth; x++) { int color = getColor(x, y); int lColor = getColor(x-1, y); int uColor = getColor(x, y-1); Node n = null; if ((x > 0) && (lColor != color)) { if (n == null) n = getNode(x, y); Node o = getNode(x, y+1); n.south = o; if (o != null) o.north = n; } if ((y > 0) && (uColor != color)) { if (n == null) n = getNode(x, y); Node o = getNode(x+1, y); n.east = o; if (o != null) o.west = n; } } if (thread.isInterrupted()) return; visolate.tickInnerProgressBar(); } System.out.println(nodes.size() + " nodes"); mosaic = null; } private void makePaths() { System.out.println("making paths..."); Set nodes = this.nodes.keySet(); currentTick = 0; visolate.resetInnerProgressBar(100); while (!nodes.isEmpty()) { paths.add(new Path(nodes.iterator().next())); if (thread.isInterrupted()) { return; } } System.out.println(paths.size() + " paths"); reportPathStats(); } private void reportPathStats() { double length = 0; int segments = 0; for (Path path : paths) { length += path.length(); segments += path.numPathNodes(); } System.out.println("total length: " + length); System.out.println("total segments: " + segments); } private void optimizePaths() { System.out.println("optimizing paths..."); visolate.resetInnerProgressBar(paths.size()); for (Path path : paths) { path.optimize(); visolate.tickInnerProgressBar(); if (thread.isInterrupted()) return; } reportPathStats(); } private class Node { Node(int x, int y) { this.x = x; this.y = y; hashCode = x^(y*31); } public int hashCode() { return hashCode; } public boolean equals(Object object) { if (!(object instanceof Node)) return false; Node other = (Node) object; return (x == other.x) && (y == other.y); } public String toString() { return "(" + x + ", " + y + ")"; } public int numNeighbors() { int n = 0; if (north != null) n++; if (south != null) n++; if (west != null) n++; if (east != null) n++; return n; } public Node getNeighbor(int d) { switch(d) { case N: return north; case S: return south; case W: return west; case E: return east; default: return null; } } public void setNeighbor(int d, Node n) { switch(d) { case N: north = n; break; case S: south = n; break; case W: west = n; break; case E: east = n; break; } } // public Color3f getColor() { // return getColor(((north != null) ? 1 : 0) | // ((south != null) ? 1 : 0) << 1 | // ((west != null) ? 1 : 0) << 2 | // ((east != null) ? 1 : 0) << 3); // } // public Color3f getColor(int i) { // // if (nodeColor[i] == null) { // Color3f color = Net.toColor3f(display.getRandomColor()); // nodeColor[i] = color; // System.out.println("nodeColor[" + i + "] = " + color); // } // // return nodeColor[i]; // } int hashCode; int x; int y; Node north = null; Node south = null; Node west = null; Node east = null; } // private Color3f[] nodeColor = new Color3f[16]; private int getColor(int x, int y) { if (x < 0) return 0; if (y < 0) return 0; if (x >= mosaicWidth) return 0; if (y >= mosaicHeight) return 0; return buffer.getElem(y*mosaicWidth + x) & 0xffffff; } private Node getNode(int x, int y) { if (x < 0) return null; if (y < 0) return null; if (x >= mosaicWidth) return null; if (y >= mosaicHeight) return null; Node key = new Node(x, y); Node node = (Node) nodes.get(key); if (node == null) { node = key; nodes.put(key, node); } return node; } private int oppositeDir(int d) { switch(d) { case N: return S; case S: return N; case W: return E; case E: return W; default: return -1; } } private class Path { Path(final Node seed) { // this.seed = seed; path.add(seed); dir[HEAD] = -1; dir[TAIL] = -1; switch (seed.numNeighbors()) { case 0: { return; } case 1: { for (int i = 0; i < 4; i++) { if (seed.getNeighbor(i) != null) { dir[TAIL] = i; break; } } break; } case 2: { boolean tailSet = false; for (int i = 0; i < 4; i++) { if (seed.getNeighbor(i) != null) { if (!tailSet) { dir[TAIL] = i; tailSet = true; } else { dir[HEAD] = i; break; } } } break; } case 3: { for (int i = 0; i < 4; i++) { if ((seed.getNeighbor(i) != null) && (seed.getNeighbor(oppositeDir(i)) != null)) { dir[TAIL] = i; dir[HEAD] = oppositeDir(i); break; } } break; } case 4: { dir[HEAD] = N; dir[TAIL] = S; break; } } while ((dir[TAIL] >= 0) && extendTail()) ; while ((dir[HEAD] >= 0) && extendHead()) ; } private boolean extendTail() { Node next = getNext((Node) path.getLast(), TAIL); if (next == null) return false; path.addLast(next); return true; } private boolean extendHead() { Node next = getNext((Node) path.getFirst(), HEAD); if (next == null) return false; path.addFirst(next); return true; } private Node getNext(Node n, int whichDir) { int d = dir[whichDir]; Node next = n.getNeighbor(d); if (next == null) { for (int i = 0; i < 4; i++) { if (i == d) continue; if (i == oppositeDir(d)) continue; Node neighbor = n.getNeighbor(i); if (neighbor != null) { if (next != null) return null; next = neighbor; d = dir[whichDir] = i; } } } if (next == null) return null; n.setNeighbor(d, null); next.setNeighbor(oppositeDir(d), null); if (n.numNeighbors() == 0) nodes.remove(n); if (next.numNeighbors() == 0) nodes.remove(next); if (Math.floor(((double) nodes.size())/((double) 100)) > currentTick) { currentTick++; visolate.tickInnerProgressBar(); } return next; } public int numPathNodes() { if (optimalPathEnd == null) return path.size(); int n = 0; for (PathNode node = optimalPathEnd; node != null; node = node.getBestPrev()) n++; return n; } public double length() { double length = 0; if (optimalPathEnd == null) { Node prev = null; for (Node node : path) { if (prev != null) { length += Util.distance(toModelX(prev.x), toModelY(prev.y), toModelX(node.x), toModelY(node.y)); } prev = node; } } else { PathNode prev = null; for (PathNode node = optimalPathEnd; node != null; node = node.getBestPrev()) { if (prev != null) length += Util.distance(prev.x, prev.y, node.x, node.y); prev = node; } } return length; } public Geometry getGeometry() { if (geometry == null) { Color3f color = Net.toColor3f(display.getRandomColor()); int vertexCount = path.size()*2; float[] coords = new float[vertexCount*6]; int i = 0; if (optimalPathEnd == null) { Node prev = null; for (Node node : path) { if (prev != null) { coords[i++] = color.x; coords[i++] = color.y; coords[i++] = color.z; coords[i++] = toModelX(prev.x); coords[i++] = toModelY(prev.y); coords[i++] = Net.PATH_Z; coords[i++] = color.x; coords[i++] = color.y; coords[i++] = color.z; coords[i++] = toModelX(node.x); coords[i++] = toModelY(node.y); coords[i++] = Net.PATH_Z; } prev = node; } } else { PathNode prev = null; for (PathNode node = optimalPathEnd; node != null; node = node.getBestPrev()) { if (prev != null) { coords[i++] = color.x; coords[i++] = color.y; coords[i++] = color.z; coords[i++] = prev.x; coords[i++] = prev.y; coords[i++] = Net.PATH_Z; coords[i++] = color.x; coords[i++] = color.y; coords[i++] = color.z; coords[i++] = node.x; coords[i++] = node.y; coords[i++] = Net.PATH_Z; } prev = node; } } geometry = new LineArray(vertexCount, GeometryArray.COORDINATES | GeometryArray.COLOR_3 | GeometryArray.INTERLEAVED | GeometryArray.BY_REFERENCE); geometry.setInterleavedVertices(coords); } return geometry; } public Point2d getStartPoint() { if (optimalPathEnd == null) { Node start = (Node) path.getFirst(); return new Point2d(start.x, start.y); } else { return new Point2d(optimalPathEnd.x, optimalPathEnd.y); } } public void writeGCode(Writer w, Point3d p) throws IOException { gCodeCutterUp(w, p); boolean first = true; if (optimalPathEnd == null) { for (Node node : path) { if (first) { gCodeRapidMovement(w, p, node.x, node.y); //rapid to start gCodeCutterDown(w, p); first = false; } else { gCodeLinear(w, p, node.x, node.y); } } } else { for (PathNode node = optimalPathEnd; node != null; node = node.getBestPrev()) { if (first) { gCodeRapidMovement(w, p, node.x, node.y); //rapid to start gCodeCutterDown(w, p); first = false; } else { gCodeLinear(w, p, node.x, node.y); } } } } public void optimize() { // System.out.println("init optimal"); initOptimalPath(); // System.out.println("add potential segs"); addPotentialSegments(); // System.out.println("compute topo"); computeTopologicallyOptimalPaths(); // System.out.println("compute weights"); computeSegmentWeights(); // System.out.println("find optimal"); findOptimalPath(); } private void initOptimalPath() { PathNode prev = null; int i = 0; for (Iterator it = path.iterator(); it.hasNext(); ) { PathNode node = new PathNode((Node) it.next(), prev, i++); if (optimalPathStart == null) { optimalPathStart = node; } prev = node; } optimalPathEnd = prev; } private void addPotentialSegments() { // boolean[] usedDir = new boolean[4]; PathNode next = null; PathNode nextStart = null; for (PathNode start = optimalPathStart; start != null; start = nextStart) { nextStart = next = start.getFirstNext(); if (next == null) break; PathNode prev = null; for (Sector sector = new Sector(start, next); (next != null); next = next.getFirstNext()) { sector.intersectWithSectorTo(next); if (sector.isEmpty()) break; if (prev != null) nextStart.addNext(prev); prev = next; } } } //CLR 25.4: single-source shortest paths in directed acyclic graphs private void computeTopologicallyOptimalPaths() { for (PathNode node = optimalPathStart; node != null; node = node.getFirstNext()) node.d = Double.POSITIVE_INFINITY; if (optimalPathStart != null) optimalPathStart.d = 0; for (PathNode node = optimalPathStart; node != null; node = node.getFirstNext()) { for (PathNode next : node.nexts) { double newD = node.d + 1.0; if (newD < next.d) { next.clearPrevs(); next.addPrev(node); next.d = newD; } else if (newD == next.d) { next.addPrev(node); } } } } private void computeSegmentWeights() { int n = path.size(); Sx = new double[n]; Sy = new double[n]; Sxx = new double[n]; Syy = new double[n]; Sxy = new double[n]; double x = 0; double y = 0; double xx = 0; double yy = 0; double xy = 0; int i = 0; for (PathNode node = optimalPathStart; node != null; node = node.getFirstNext()) { x += node.x; y += node.y; xx += node.x*node.x; yy += node.y*node.y; xy += node.x*node.y; i = node.index; Sx[i] = x; Sy[i] = y; Sxx[i] = xx; Syy[i] = yy; Sxy[i] = xy; } } private double Ex(int i, int j) { return (Sx[j] - Sx[i])/((double) (j-i)); } private double Ey(int i, int j) { return (Sy[j] - Sy[i])/((double) (j-i)); } private double Exx(int i, int j) { return (Sxx[j] - Sxx[i])/((double) (j-i)); } private double Eyy(int i, int j) { return (Syy[j] - Syy[i])/((double) (j-i)); } private double Exy(int i, int j) { return (Sxy[j] - Sxy[i])/((double) (j-i)); } private double segmentWeight(PathNode from, PathNode to) { double x = to.x - from.x; double y = to.y - from.y; double xAvg = (to.x + from.x)/2.0; double yAvg = (to.y + from.y)/2.0; int i = from.index; int j = to.index; double a = Exx(i, j) - 2*xAvg*Ex(i, j) + xAvg*xAvg; double b = Exy(i, j) - xAvg*Ex(i, j) - yAvg*Ey(i, j) + xAvg*yAvg; double c = Eyy(i, j) - 2*yAvg*Ey(i, j) + yAvg*yAvg; return Math.sqrt(c*x*x + 2*b*x*y + a*y*y); } private void findOptimalPath() { for (PathNode node = optimalPathStart; node != null; node = node.getFirstNext()) { node.d = Double.POSITIVE_INFINITY; } if (optimalPathStart != null) { optimalPathStart.d = 0; } for (PathNode node = optimalPathStart; node != null; node = node.getFirstNext()) { for (PathNode next : node.nexts) { if (!next.hasPrev(node)) { continue; } double newD = node.d + segmentWeight(node, next); if (newD < next.d) { next.optimalPrev = node; next.d = newD; } } } } int[] dir = new int[2]; final int HEAD = 0; final int TAIL = 1; private LinkedList path = new LinkedList(); GeometryArray geometry; // Node seed; PathNode optimalPathStart = null; PathNode optimalPathEnd = null; double[] Sx; double[] Sy; double[] Sxx; double[] Syy; double[] Sxy; } private class Sector { Sector(PathNode apex, PathNode first) { apexX = apex.x; apexY = apex.y; computeAnglesTo(first); startAngle = startAngleTo; endAngle = endAngleTo; } void intersectWithSectorTo(PathNode node) { computeAnglesTo(node); startAngle = Math.max(startAngle, startAngleTo); endAngle = Math.min(endAngle, endAngleTo); } boolean isEmpty() { return startAngle > endAngle; } private void computeAnglesTo(PathNode node) { for (int i = 0; i < 4; i++) angle[i] = Util.canonicalAngle( (node.x + HORIZ_DIR_BIAS[i]*straightTol) - apexX, (node.y + VERT_DIR_BIAS[i]*straightTol) - apexY); startAngleTo = Double.POSITIVE_INFINITY; endAngleTo = Double.NEGATIVE_INFINITY; for (int i = 0; i < 4; i++) { startAngleTo = Math.min(startAngleTo, angle[i]); endAngleTo = Math.max(endAngleTo, angle[i]); } } double[] angle = new double[4]; double startAngleTo; double endAngleTo; double startAngle; double endAngle; double apexX; double apexY; } private class PathNode { PathNode(Node node, PathNode prev, int index) { x = toModelX(node.x); y = toModelY(node.y); this.index = index; if (prev != null) prev.addNext(this); d = Double.POSITIVE_INFINITY; } void addNext(PathNode node) { nexts.add(node); } PathNode getFirstNext() { if (nexts.isEmpty()) { return null; } // return (PathNode) nexts.getFirst(); return (PathNode) nexts.get(0); } void addPrev(PathNode node) { prevs.add(node); // if (prevs.size() > 1) // System.out.println("more than one prev from (" + x + ", " + y + ")"); } boolean hasPrev(PathNode node) { return prevs.contains(node); } PathNode getBestPrev() { if (optimalPrev != null) { return optimalPrev; } if (prevs.isEmpty()) { return null; } return (PathNode) prevs.iterator().next(); } void clearPrevs() { prevs.clear(); } float x; float y; double d; ArrayList nexts = new ArrayList(); Set prevs = new LinkedHashSet(); PathNode optimalPrev = null; int index; } public BranchGroup getSceneGraph() { if (sceneBG == null) { Shape3D shape = new Shape3D(); shape.setPickable(false); for (Iterator it = paths.iterator(); it.hasNext(); ) shape.addGeometry(it.next().getGeometry()); /* int vertexCount = nodes.size(); float[] coords = new float[vertexCount*6]; int i = 0; for (Iterator it = nodes.keySet().iterator(); it.hasNext(); ) { Node node = (Node) it.next(); Color3f color = node.getColor(); coords[i++] = color.x; coords[i++] = color.y; coords[i++] = color.z; float x = (float) (mosaicBounds.x + node.x/((float) dpi)); float y = (float) (mosaicBounds.y + modelHeight-node.y/((float) dpi)); coords[i++] = x; coords[i++] = y; coords[i++] = Net.PATH_Z; } System.out.println("vertexCount = " + vertexCount); GeometryArray geometry = new PointArray(vertexCount, GeometryArray.COORDINATES | GeometryArray.COLOR_3 | GeometryArray.INTERLEAVED | GeometryArray.BY_REFERENCE); geometry.setInterleavedVertices(coords); shape.addGeometry(geometry); */ sceneBG = new BranchGroup(); sceneBG.setPickable(false); sceneBG.setCapability(BranchGroup.ALLOW_DETACH); sceneBG.addChild(shape); } return sceneBG; } private float toModelX(int x) { return (float) (mosaicBounds.x + x/((float) dpi)); } private float toModelY(int y) { return (float) (mosaicBounds.y + modelHeight-y/((float) dpi)); } private Path getClosestPath(Collection paths, Point3d p) { double minDist = Double.POSITIVE_INFINITY; Path closest = null; for (Path path : paths) { double dist = new Point2d(p.x, p.y).distance(path.getStartPoint()); if (dist < minDist) { minDist = dist; closest = path; } } paths.remove(closest); return closest; } public void writeGCode(Writer w) throws IOException { model.clearGCode(); gCodeStrokes.clear(); gCodePreAmble(w); Point3d p = new Point3d(0.0, 0.0, 0.0); // for (Iterator it = paths.iterator(); it.hasNext(); ) // ((Path) it.next()).writeGCode(w, p); Collection paths = new LinkedList(); paths.addAll(this.paths); while (!paths.isEmpty()) { getClosestPath(paths, p).writeGCode(w, p); } gCodePostAmble(w, p); int vertexCount = 2*gCodeStrokes.size() + 4; float[] coords = new float[6*vertexCount]; Point3f p3f = new Point3f(0.0f, 0.0f, Net.GCODE_Z_MIN); int i = 0; for (GCodeStroke stroke : gCodeStrokes) { coords[i++] = stroke.color.x; coords[i++] = stroke.color.y; coords[i++] = stroke.color.z; coords[i++] = p3f.x; coords[i++] = p3f.y; coords[i++] = p3f.z; p3f.add(stroke.d); coords[i++] = stroke.color.x; coords[i++] = stroke.color.y; coords[i++] = stroke.color.z; coords[i++] = p3f.x; coords[i++] = p3f.y; coords[i++] = p3f.z; } gCodeStrokes.clear(); float[] h = new float[] {-1, 1, 0, 0}; float[] v = new float[] {0, 0, -1, 1}; for (int j = 0; j < 4; j++) { coords[i++] = ORIGIN_COLOR.x; coords[i++] = ORIGIN_COLOR.y; coords[i++] = ORIGIN_COLOR.z; coords[i++] = h[j]*ORIGIN_TICK; coords[i++] = v[j]*ORIGIN_TICK; coords[i++] = Net.GCODE_Z_MIN; } GeometryArray gCodeGeometry = new LineArray(vertexCount, GeometryArray.COORDINATES | GeometryArray.COLOR_3 | GeometryArray.INTERLEAVED | GeometryArray.BY_REFERENCE); gCodeGeometry.setInterleavedVertices(coords); Shape3D gCodeS3D = new Shape3D(); gCodeS3D.setGeometry(gCodeGeometry); BranchGroup gCodeBG = new BranchGroup(); gCodeBG.setPickable(false); gCodeBG.setCapability(BranchGroup.ALLOW_DETACH); gCodeBG.addChild(gCodeS3D); model.setGCode(gCodeBG); } private class GCodeStroke { GCodeStroke(Vector3f d, Color3f color) { this.color = color; this.d = d; } Color3f color; Vector3f d; } private void gCodePreAmble(Writer w) throws IOException { if (w == null) { return; } if (isOutputMetricCoordinates()) { w.write("G21\n"); // millimeters } else { w.write("G20\n"); // inches } w.write("G17\n"); // X-Y plane w.write("G40\nG49\n"); // Cancel tool lengh & cutter dia compensation // w.write("G53\n"); // Motion in machine co-ordinate system w.write("G80\n"); // Cancel any existing motion cycle if (isOutputAbsoluteCoordinates()) { w.write("G90\n"); // Absolute distance mode } else { w.write("G91\n"); // Relative distance mode } } private void gCodePostAmble(Writer w, Point3d p) throws IOException { gCodeCutterUp(w, p); gCodeRapidMovement(w, p, 0.0, 0.0); //rapid to origin if (w == null) { return; } w.write("M5\n"); // Spindle Stop w.write("M2\n"); // End of program } private void gCodeCutterUp(Writer w, final Point3d p) throws IOException { if (w != null) { if (isOutputAbsoluteCoordinates()) { w.write("G1 X" + gCodeFormat.format(convertUnits(p.x) + getAbsoluteXStart()) + " Y" + gCodeFormat.format(convertUnits(p.y) + getAbsoluteYStart()) + " Z" + gCodeFormat.format(getZCuttingHeight() + getZClearance()) + " F"+ gCodeFormat.format(60 * getMovementSpeed()) + "\n"); p.z = getZClearance(); } else { w.write("G1 Z" + gCodeFormat.format(getZClearance()) + "\n"); } } gCodeStrokes.add(new GCodeStroke(new Vector3f(0.0f, 0.0f, (float) getZClearance()), G_CODE_COLOR_NORMAL)); } private void gCodeCutterDown(final Writer w, final Point3d p) throws IOException { if (w != null) { if (isOutputAbsoluteCoordinates()) { w.write("G1 X" + gCodeFormat.format(convertUnits(p.x) + getAbsoluteXStart()) + " Y" + gCodeFormat.format(convertUnits(p.y) + getAbsoluteYStart()) + " Z" + gCodeFormat.format(getZCuttingHeight()) + " F"+ gCodeFormat.format(60 * getMovementSpeed()) + "\n"); p.z = 0.0; } else { w.write("G1 Z" + gCodeFormat.format(-1 * getZClearance()) + "\n"); } } gCodeStrokes.add(new GCodeStroke(new Vector3f(0.0f, 0.0f, (float) (-1 * getZClearance())), G_CODE_COLOR_NORMAL)); } /** * Add a g-code for a rapid, linear movement. * * @param w where to write the gcode to * @param p the current location. SIDEE FFECT: Will be updated to be x,y * @param x the absolute location to move to * @param y the absolute location to move to * @throws IOException */ private void gCodeRapidMovement(final Writer w, final Point3d p, final double x, final double y) throws IOException { double dx = x - p.x; double dy = y - p.y; if (w != null) { if (isOutputAbsoluteCoordinates()) { w.write("G0 X" + gCodeFormat.format(convertUnits(x) + getAbsoluteXStart()) + " Y" + gCodeFormat.format(convertUnits(y) + getAbsoluteYStart()) + " Z"+ gCodeFormat.format(p.z + getZCuttingHeight()) + " F"+ gCodeFormat.format(60 * getMovementSpeed()) + "\n"); } else { w.write("G0 X" + gCodeFormat.format(convertUnits(dx)) + " Y" + gCodeFormat.format(convertUnits(dy)) + " F"+ gCodeFormat.format(60 * getMovementSpeed()) + "\n"); } } p.x += dx; p.y += dy; gCodeStrokes.add(new GCodeStroke(new Vector3f((float) dx, (float) dy, 0.0f), G_CODE_COLOR_RAPID)); } private void gCodeLinear(Writer w, Point3d p, double x, double y) throws IOException { double dx = x - p.x; double dy = y - p.y; if (w != null) { if (isOutputAbsoluteCoordinates()) { w.write("G1 X" + gCodeFormat.format(convertUnits(x) + getAbsoluteXStart()) + " Y" + gCodeFormat.format(convertUnits(y) + getAbsoluteYStart()) + " Z" + gCodeFormat.format(p.z + getZCuttingHeight()) + " F"+ gCodeFormat.format(60 * getMillingSpeed()) + "\n"); } else { w.write("G1 X" + gCodeFormat.format(convertUnits(dx)) + " Y" + gCodeFormat.format(convertUnits(dy)) + " F"+ gCodeFormat.format(60 * getMillingSpeed()) + "\n"); } } p.x += dx; p.y += dy; gCodeStrokes.add(new GCodeStroke(new Vector3f((float) dx, (float) dy, 0.0f), G_CODE_COLOR_NORMAL)); } private double convertUnits(final double x) { if (isOutputMetricCoordinates()) { return x * MMPERINCH; } return x; } private Map nodes = new LinkedHashMap(); private List paths = new LinkedList(); private DataBuffer buffer; private BranchGroup sceneBG = null; private int mode; private int currentTick = 0; private double straightTol; private List gCodeStrokes = new LinkedList(); } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/processor/TopologyProcessor.java000066400000000000000000000136321147500217100311660ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.processor; import java.util.*; import java.awt.image.*; import visolate.*; import visolate.model.*; public class TopologyProcessor extends Processor { private static final String cvsid = "$Id: TopologyProcessor.java,v 1.8 2006/08/29 04:02:32 vona Exp $"; public static final double EPS = 1.0/256.0; public TopologyProcessor(Visolate visolate) { super(visolate); } public void processTile(int r, int c, int ulx, int uly, int width, int height, double left, double bottom, double right, double top) { // System.out.println("processTile: " + // "(row, col) = (" + r + ", " + c + "); " + // "ul = (" + ulx + ", " + uly + "); " + // "dimensions = (" + width + ", " + height + "); " + // "lbrt = " + // left + ", " + bottom + ", " + right + ", " + top + ")"); if (width < 2) return; visolate.resetInnerProgressBar(height); try { // display.getStill(tile); tile = display.getStill(); //work around j3d bug buffer = tile.getRaster().getDataBuffer(); //work around j3d bug for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { int color = getPixel(x, y) & 0xffffff; if (!ignoreColors.contains(new Integer(color))) mergeNets(x, y, left, top, color); if (thread.isInterrupted()) return; } visolate.tickInnerProgressBar(); } } catch (InterruptedException e) { thread.interrupt(); //reset interrupt status } } private void mergeNets(final int x, final int y, final double left, final double top, final int color) throws InterruptedException { double px = left+x/((double) dpi); double py = top-y/((double) dpi); // System.out.println("merge " + Model.colorToString(color) + " at (" + x + ", " + y + // ") -> (" + px + ", " + py + ")"); // System.out.println("ignoring " + Model.colorToString(color)); ignoreColors.add(new Integer(color)); Set nets = new LinkedHashSet(); model.getNetsAtPoint(px, py, 1.0/dpi, nets); // System.out.println(nets.size() + " nets at point"); if (nets.isEmpty()) { return; } if (nets.size() <= 1) { return; } mergeNets(nets); frames++; } public static void mergeNets(Collection nets) { Set superNet = null; for (Net net : nets) { if (superNet == null) { superNet = net.getSuperNet(); } } if (superNet == null) { superNet = new LinkedHashSet(); } for (Net net : nets) { net.setSuperNet(superNet); } } private int getPixel(int x, int y) { return buffer.getElem(y*canvasWidthPels + x); } protected void processStarted() { frames = 1; visolate.clearSelection(); tile = display.makeBufferedImage(canvasWidthPels, canvasHeightPels); Raster raster = tile.getRaster(); buffer = raster.getDataBuffer(); model.setToolDiameter(0.0); model.enableBorderGeometry(true); model.enableLineGeometry(false); model.enableVoronoiGeometry(false); model.enableFlatGeometry(true); model.enableGCodeGeometry(false); model.setTranslucent2D(true); model.clearPaths(); model.clearGCode(); Set netColors = model.getNetColors(); ignoreColors = new LinkedHashSet(); for (Iterator it = netColors.iterator(); it.hasNext(); ) { int c = it.next().intValue(); // System.out.println("base color: " + Model.colorToString(c)); int cr = (c & 0xff0000) >> 16; int cg = (c & 0xff00) >> 8; int cb = c & 0xff; int r = 0; int g = 0; int b = 0; for (int i = 1; i < 8; i++) { r += (cr >> i) + ((cr >> (i-1)) & 1); g += (cg >> i) + ((cg >> (i-1)) & 1); b += (cb >> i) + ((cb >> (i-1)) & 1); int j = ((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff); // System.out.println("ignoring " + Model.colorToString(j)); ignoreColors.add(new Integer(j)); } } // System.out.println("ignoring " + Model.colorToString(0)); ignoreColors.add(new Integer(0)); } private void restoreModel() { model.setToolDiameter(toolDiameterWas); model.enableBorderGeometry(borderGeometryWas); model.enableLineGeometry(lineGeometryWas); model.enableVoronoiGeometry(voronoiGeometryWas); model.enableFlatGeometry(flatGeometryWas); model.enableGCodeGeometry(gcodeGeometryWas); model.setTranslucent2D(wasTranslucent); } protected void processInterrupted() { restoreModel(); } protected void processCompleted() { tile = null; restoreModel(); // System.out.println(frames + " frames"); } protected BufferedImage tile = null; private DataBuffer buffer; private Set ignoreColors; private int frames; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/processor/makefile.old000066400000000000000000000650421147500217100270660ustar00rootroot00000000000000# Vona's super-ninja makefile # # *** DO NOT EDIT THIS FILE EXCEPT IN THE PROJECT HOME DIRECTORY *** # # This makefile is auto-generated by "make makefiles" in the parent package # # You can (and should) edit makefile.project, which is included below, to # specify project-specific settings # # You can edit makefile.package, which is included below, to specify # package-specific targets and variables # # Copyright (C) 2004 Marsette A. Vona, III # # 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 2 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., 59 # Temple Place - Suite 330, Boston, MA 02111-1307, USA. # $Id: makefile 15 2008-01-23 21:56:45Z vona $ # Relative path to the directory containing the root package for the project. # For makefile in every directory other than $(PROJECT_HOME) this is # automatically set by "make makefiles" PROJECT_HOME = ../. -include $(PROJECT_HOME)/makefile.project ifndef BASE_PACKAGE BASE_PACKAGE := $(notdir $(shell $(CD) $(PROJECT_HOME) && pwd)) endif ifndef APPNAME APPNAME := $(BASE_PACKAGE) endif # The (full) name of this package. For makefile in every directory other than # $(PROJECT_HOME) this is automatically set by "make makefiles" PACKAGE = $(BASE_PACKAGE).processor # the default target default: package #figure out arch SYSTEM = $(shell uname -s | tr " " "_") MACHINE = $(shell uname -m | tr " " "_") ARCH := $(SYSTEM)_$(MACHINE) #linux: Linux_i686 #OS X: Darwin_Power_Macintosh #cygwin: CYGWIN-5.1_NT # misc macros # these let $(COMMA) and $(SPACE) be lone arguments to make function calls COMMA := , EMPTY := SPACE := $(EMPTY) $(EMPTY) # whitespace regex WS = [ \t]* ifneq ($(findstring CYGWIN,$(SYSTEM)),CYGWIN) # make cd .. follow the Physical directory structure on Unix CD = cd -P else CD = cd # always use bash on cygwin, sh doesn't have pushd, but bash slows things down SHELL = `which bash` endif # tool finding functions #locate the target of a symlink # #works even if the starting point is not a symlink locate-target = $(shell f="$(1)"; while [ -L "$$f" ]; do f=`ls -l "$$f" | awk '{print $$NF}'`; done; echo "$$f") #try hard to find a command # #first arg is command name # #second arg is expected directory # #if cmd executable in directory, that is returned # #else if which knows where the command is, that is returned # #else empty string is returned locate-cmd = $(shell if [ -x "$(2)/$(1)" ]; then echo "$(2)/$(1)"; else cmd="$(shell which "$(1)" 2>/dev/null || true)" && if [ -x "$$cmd" ] ; then echo "$$cmd"; else echo ""; fi; fi) #get the parent directory name # #better than the make builtin function because this also works on a directory dirname = $(shell if [ "$(1)"x != x -a -e "$(1)" ] ; then dirname "$(1)"; else echo ""; fi) #default a dir # #first arg is the desired dir # #second is the default dir # #returns first arg iff it's a directory, else second arg default-dir = $(shell if [ ! -d "$(1)" ]; then echo "$(2)"; else echo "$(1)"; fi) # find tool directories ifndef TOOLS_HOME TOOLS_HOME := $(call default-dir,$(PROJECT_TOOLS_HOME),/usr) endif BIN := $(call default-dir,$(TOOLS_HOME)/bin/$(ARCH),/usr/bin) SCRIPTS := $(call default-dir,$(TOOLS_HOME)/scripts,$(BIN)) JDK_BASE := $(TOOLS_HOME)/java/$(ARCH) JDK_VERSION := newest JDK_HOME := $(call dirname,$(call dirname,$(call locate-target,$(call locate-cmd,javac,$(JDK_BASE)/$(JDK_VERSION)/bin)))) JDK_EXT := $(JDK_HOME)/jre/lib/ext ifeq ($(SYSTEM),Darwin) JDK_EXT := /Library/Java/Extensions endif TOOLS_EXT := $(TOOLS_HOME)/java/indep/lib # find pure java extension jars in the tools java/indep/lib dir if present, else in jre/lib/ext # NOTE the classes will come in on different classloaders in the two cases, which can lead to subtle CNFEs EXT_DIR := $(call default-dir,$(TOOLS_EXT),$(JDK_EXT)) # JDK executables JAVAC := $(call locate-cmd,javac,$(JDK_HOME)/bin) JAVA := $(call locate-cmd,java,$(JDK_HOME)/bin) JAVADOC := $(call locate-cmd,javadoc,$(JDK_HOME)/bin) JAR := $(call locate-cmd,jar,$(JDK_HOME)/bin) KEYTOOL := $(call locate-cmd,keytool,$(JDK_HOME)/bin) JARSIGNER := $(call locate-cmd,jarsigner,$(JDK_HOME)/bin) RMIC := $(call locate-cmd,rmic,$(JDK_HOME)/bin) #other executables JAVACC := $(call locate-cmd,javacc,$(BIN)) RSYNC := $(call locate-cmd,rsync,$(BIN)) WWWIMAGESIZE := $(call locate-cmd,wwwimagesize,$(SCRIPTS)) # CompileServer stuff # the CompileServer binary directory CS_BIN := $(call dirname,$(call locate-target,$(call locate-cmd,javac_submit,$(BIN)))) # the CompileServer scripts directory CS_SCRIPTS := $(call dirname,$(call locate-target,$(call locate-cmd,CompileServer-submit,$(SCRIPTS)))) # define NO_COMPILE_SERVER to disable compile server ifndef NO_COMPILE_SERVER CS_ENSURE := $(call locate-cmd,CompileServer-ensure-running,$(CS_SCRIPTS)) CS_SUBMIT := $(call locate-cmd,CompileServer-submit,$(CS_SCRIPTS)) ifdef CS_ENSURE ifeq ($(findstring OK,$(shell $(CS_ENSURE) nostart)),OK) ifdef CS_SUBMIT #ok CompileServer is all good! JAVAC := $(CS_SUBMIT) USING_COMPILE_SERVER := 1 endif endif #OK endif #CS_ENSURE endif #NO_COMPILE_SERVER # rmi stuff # generate commands to run RMIWrap # # first arg is the (simple) name of the API interface # # second arg is the (simple) name of the implementation class run-rmiwrap = if [ ! -f $(1)Remote.java -o ! -f $(2)Server.java -o ! -f $(2)Client.java -o \( $(1).java -nt $(1)Remote.java \) -o \( $(2).java -nt $(2)Client.java \) -o \( $(2).java -nt $(2)Server.java \) ]; then $(JAVA) $(RUN_JAVA_FLAGS) vona.rmi.rmiwrap.RMIWrap $(PACKAGE).$(1) $(PACKAGE).$(2) && $(JAVAC) $(JAVAC_FLAGS) *.java; fi # generate commands to run rmic # # first arg is the (simple) name of the remote class for which to generate a # stub RMIC_JRMP_VERSION = 1.1 run-rmic = if [ ! -f $(1)_Stub.class -o $(1).class -nt $(1)_Stub.class ]; then $(RMIC) -v$(RMIC_JRMP_VERSION) -d $(PROJECT_HOME)/.. $(CLASSPATH_FLAG) $(PACKAGE).$(1); fi # rsync stuff # flags for rsync # # excludes the usual suspects RSYNC_FLAGS := -rv --progress $(DBG) --copy-links --exclude "**~" --exclude ".\#**" --exclude CVS --exclude .svn --exclude "*.tmp" # rsync first arg to second arg, with cvs exclude rsync = $(RSYNC) $(RSYNC_FLAGS) --cvs-exclude $(1) $(2) # rsync a subproject # # first arg is filename extension to include (starting with ".", or empty for # all) # # second arg is the name of a subproject (i.e. the name of the base package of # the subproject). If it ends in "." then it is copied non-recursively, else # it is copied recursively. # # third arg is rsync dest, if not absolute then relative to $(PROJECT_HOME)/.. rsync-subproject = pushd $(PROJECT_HOME)/.. && $(RSYNC) $(RSYNC_FLAGS) --include "*/" --exclude "/$(BASE_PACKAGE)/$(JAVADOC_DIR_NAME)/**" --include $(if $(filter ".","$(suffix $(2))"),"/$(call package-to-path,$(basename $(2)))/*$(1)","/$(call package-to-path,$(2))/**$(1)") --exclude "*" $(BASE_PACKAGE) $(3) && popd # this should have dynamic binding so that makefile.package can override # JARFILE JAR_DIR = .$(JARFILE).tmp # make a jar # # does not include hidden files (any file with name beginning ".") # # arg 1: "true" to include javadoc tree, "false" otherwise # arg 2: the list of external jars (none if empty) # arg 3: the name of the jarfile # arg 4: the list of filename extensions to include (each beginning with ".", empty to include all) # arg 5: list of extra files to include (pathnames relative to parent of base package) # arg 6: includes only files in these subproject packages make-jar = \ $(RM) $(3) && \ $(RM) -r $(JAR_DIR) && \ mkdir $(JAR_DIR) && \ if [ $(1) ] && [ -d "$(JAVADOC_DIR)" ]; then $(call rsync,$(JAVADOC_DIR),$(JAR_DIR)); fi && \ if [ "$(4)foo" == "foo" ]; then \ $(foreach P,$(6),$(call rsync-subproject,,$(P),$(call package-to-path,$(PACKAGE))/$(JAR_DIR)) && ) true; \ else $(foreach E,$(4),$(foreach P,$(6),$(call rsync-subproject,$(E),$(P),$(call package-to-path,$(PACKAGE))/$(JAR_DIR)) && )) true; fi && \ $(foreach F,$(addprefix $(EXT_DIR)/,$(2)),cp $(F) $(JAR_DIR) &&) true && \ $(foreach F,$(5),cp $(addprefix $(PROJECT_HOME)/../,$(F)) $(JAR_DIR)/$(dir $(F)) &&) true && \ $(CD) $(JAR_DIR) && \ $(foreach F,$(2),$(JAR) xvf $(F) && rm $(F) &&) true && \ rm -rf META-INF && \ if [ "$(4)foo" == "foo" ]; then \ $(JAR) cvf $(3) `find . -not -type d -a -not -name ".*"` $(5); \ else $(JAR) cvf $(3) `find . -not -type d -a -not -name ".*" -a "(" -false $(foreach E,$(4),-o -name "*$(E)" ) ")"` $(5); fi && \ if [ -f ../$(JAR_MF) ]; then $(JAR) ufm $(3) ../$(JAR_MF); fi && \ if [ -f ../$(JAR_CRT) ]; then $(JARSIGNER) $(3) $(JARKEY); fi && \ mv $(3) .. && \ $(CD) .. && \ rm -rf $(JAR_DIR) # template file locations TEMPLATE_DIR = $(PROJECT_HOME)/templates JAVA_TEMPLATE = $(TEMPLATE_DIR)/Template.java EXCEPTION_TEMPLATE = $(TEMPLATE_DIR)/Exception.java PACKAGE_TEMPLATE = $(TEMPLATE_DIR)/package.html MAKEFILE_PACKAGE_TEMPLATE = $(TEMPLATE_DIR)/makefile.package template-m4-common = m4 -P "-DYEAR=`date +%Y`" "-DPACKAGE=$(PACKAGE)" template-m4-java = m4 -P "-DYEAR=`date +%Y`" "-DPACKAGE=$(PACKAGE)" "-DCLASS=$(notdir $(basename $(1)))" $(JAVA_TEMPLATE) > $(basename $(1)).java # compute short package name from fullname PACKAGE_NAME = $(subst .,,$(suffix .$(PACKAGE))) # compute project name (root package name) from package fullname PROJECT = $(firstword $(subst ., ,$(PACKAGE))) # heap size flag MEMORY_FLAG = -Xmx$(TOTAL_HEAP_SIZE) # compute the package path from the package full name # $(PROJECT_HOME)/../$(PACKAGE_PATH) is a path to this package PACKAGE_PATH = $(call package-to-path,$(PACKAGE)) # command to run make without generating any extraneous output MAKE_SILENT = $(MAKE) --silent --no-print-directory # is this the project root package? ifeq ($(PROJECT_HOME),.) ROOT_PACKAGE = yes endif # flag useful for various tools # put the parent of project home first on the classpath # that way if there are built checkouts of the source trees for any EXT_JARS # then we'll pick up those classes directly from there NINJA_CLASSPATH := $(PROJECT_HOME)/.. ifdef USING_COMPILE_SERVER NINJA_CLASSPATH := $(shell pwd)/$(NINJA_CLASSPATH) endif # now put each EXT_JAR on the classpath, in order, but only if we're finding # them in an EXT_DIR which is not the JDK installed extensions dir ifneq ($(EXT_DIR),$(JDK_EXT)) NINJA_CLASSPATH := $(subst $(SPACE),,$(NINJA_CLASSPATH)$(foreach JAR,$(EXT_JARS),:$(EXT_DIR)/$(JAR))) endif # next add the JDK tools jar to the classpath # in particular, for use by CompileServer NINJA_CLASSPATH := $(NINJA_CLASSPATH):$(JDK_HOME)/lib/tools.jar # finally append the user's externally defined CLASSPATH, if any ifdef CLASSPATH MAKE_CLASSPATH := $(NINJA_CLASSPATH):$(CLASSPATH) else #trailing colon breaks java under Windows MAKE_CLASSPATH := $(NINJA_CLASSPATH) endif ifeq ($(findstring CYGWIN,$(SYSTEM)),CYGWIN) MAKE_CLASSPATH := `cygpath -w -p "$(MAKE_CLASSPATH)"` endif CLASSPATH_FLAG = -classpath "$(MAKE_CLASSPATH)" DEPRECATION_FLAG = -deprecation # source the package-specific makefile -include makefile.package # always exclude these subdirs EXCLUDE_SUBDIRS += . .. CVS .svn # figure out our subdirs PACKAGE_SUBDIRS = $(filter-out $(EXCLUDE_SUBDIRS),$(notdir $(shell find . -maxdepth 1 -type d -not -name ".*.tmp" -a -not -name "javadoc-*"))) # always exclude these source files EXCLUDE_SOURCE += # figure out source files PACKAGE_SOURCE = $(filter-out $(wildcard $(EXCLUDE_SOURCE)),$(wildcard *.java)) PACKAGE_HTML_SOURCE = $(filter-out $(wildcard $(EXCLUDE_SOURCE)),$(wildcard *.phtml *.m4)) # ALL source SOURCE = \ $(wildcard *.java) \ $(wildcard *.scm) \ $(wildcard *.c *.cc *.h *.hh) \ $(wildcard *.mf) \ $(wildcard *.jj) \ $(wildcard *.xsd *.xml *.spp) \ $(wildcard *.txt *.tex *.html *.htm *.css README) \ $(wildcard *.properties *.conf *.xcf *.gif *.jpg *.png *.bmp *.ico) \ $(wildcard *.lws *.lwo *.wrl) \ $(wildcard *.sh *.csh *.bat *.iss) \ $(wildcard *.phtml *.m4) \ $(wildcard *.policy) \ package.html makefile.package ifdef ROOT_PACKAGE SOURCE += makefile makefile.project endif # compile-time flags JAVAC_FLAGS += $(DEPRECATION_FLAG) $(CLASSPATH_FLAG) -source $(SOURCE_VERSION) -target $(TARGET_VERSION) $(JAVAC_OPTIONS) # runtime flags RUN_JAVA_FLAGS += $(CLASSPATH_FLAG) $(MEMORY_FLAG) $(WORKAROUND_FLAGS) $(JAVA_OPTIONS) -ea # javadoc flags JAVADOC_FLAGS += $(CLASSPATH_FLAG) -source $(JAVADOC_SOURCE_VERSION) -private -use -author -doctitle $(APPNAME) `if [ -e overview.html ]; then echo -overview overview.html; else echo ""; fi` # subpackage makefiles SUBPACKAGE_MAKEFILES = $(addsuffix /makefile,$(PACKAGE_SUBDIRS)) # HTML stuff .SUFFIXES: .m4 .phtml .html WWWROOT = $(HOME)/www html-m4 = m4 -P "-DBUILD_DATE=`date`" "-DYEAR=`date +%Y`" "-I$(WWWROOT)/include" $(1) > $(2) html-cpp = gcc -E -P -traditional "-DBUILD_DATE=`date`" "-DYEAR=`date +%Y`" "-I$(WWWROOT)/include" - < $(1) > $(2) # function to generate a javadoc command line # # javadoc will be deposited in $(JAVADOC_DIR) # # first arg is list of base packages. Javadoc will be built for all # subpackages of the base packages. javadoc = $(JAVADOC) $(JAVADOC_FLAGS) -d $(JAVADOC_DIR) $(foreach P,$(1), -subpackages $(P)) # function to make a target recursively # first argument is target to make # second argument is "true" to continue on fail, "false" to stop on fail recursively-make = $(foreach DIR,$(PACKAGE_SUBDIRS),[ ! -d $(DIR) ] || pushd $(DIR) > /dev/null && ( $(MAKE) $(1) || $(2) ) && popd > /dev/null && ) true # function to make something from $(PROJECT_HOME) make-from-project-home = \ @echo making $(1) from $(PROJECT_HOME); \ $(CD) $(PROJECT_HOME) && $(MAKE) $(1) # function to convert a package name to a path package-to-path = $(subst .,/,$(1)) # function to extract the package part of a full class name (not including # the trailing .class) package-part = \ $(basename $(1)) # function to extract the class part of a full class name (not including the # trailing .class) class-part = \ $(subst .,,$(suffix $(1))) # use this target as a prereq to force another target .PHONY: FORCE FORCE: # pattern rules # initialize a new class file %.java-template: $(JAVA_TEMPLATE) if [ ! -f ./$(basename $@).java ] || [ ! -s ./$(basename $@).java ]; then $(call template-m4-java,$@); else echo ./$(basename $@).java exists and is non-empty, not overwriting; fi .PHONY: java-templates java-templates: $(foreach F,$(shell find . -maxdepth 1 -size 0 -name "*.java"),$(call template-m4-java,$F); ) # initialize a new Exception class file %.java-exception-template: $(EXCEPTION_TEMPLATE) if [ ! -f ./$(basename $@).java ]; then cp $(EXCEPTION_TEMPLATE) ./$(basename $@).java; else echo ./$(basename $@).java exists, not overwriting; fi # initialize a new package.html file .PHONY: package.html-template package.html-template: $(PACKAGE_TEMPLATE) if [ ! -f package.html ]; then cp $(PACKAGE_TEMPLATE) ./package.html; else echo ./package.html exists, not overwriting; fi # initialize a new makefile.package file .PHONY: makefile.package-template makefile.package-template: $(MAKEFILE_PACKAGE_TEMPLATE) if [ ! -f makefile.package ]; then cp $(MAKEFILE_PACKAGE_TEMPLATE) ./makefile.package; else echo ./makefile.package exists, not overwriting; fi # make html from m4 %.html: %.m4 $(call html-m4,$<,$@) if [ -x "$(WWWIMAGESIZE)" ]; then $(WWWIMAGESIZE) -MakeBackup no $@; fi # make html from phtml by sending it through the C pre-processor %.html: %.phtml $(call html-cpp,$<,$@) if [ -x "$(WWWIMAGESIZE)" ]; then $(WWWIMAGESIZE) -MakeBackup no $@; fi # build a .class file from a .java file ifeq ($(findstring CYGWIN,$(SYSTEM)),CYGWIN) #fix paths on cygwin. ARGH... ifdef USING_COMPILE_SERVER %.class: %.java $(JAVAC) $(JAVAC_FLAGS) "`cygpath -w "$(addprefix $(shell pwd)/,$<)"`" else %.class: %.java $(JAVAC) $(JAVAC_FLAGS) $< endif else # not on cygwin. Phew. %.class: %.java $(JAVAC) $(JAVAC_FLAGS) $< endif # build Java source files from a .jj grammar file %.java: %.jj $(JAVACC) $< # run a class in a specific package $(PROJECT).%.run: $(if BUILD_BEFORE_RUN,$(PROJECT).%.class,) $(JAVA) $(RUN_JAVA_FLAGS) $(basename $@) # run a class in the current package with a main() function directly %.run: $(if BUILD_BEFORE_RUN,%.class,) $(JAVA) $(RUN_JAVA_FLAGS) $(PACKAGE).$(basename $@) # run a class in appletviewer (specify html filename without path or extension) %.appletviewer: $(JDK_HOME)/bin/appletviewer $(basename $@).html # build a class in a specific package $(PROJECT).%.class: $(CD) $(PROJECT_HOME)/../$(call package-to-path,$(call package-part,$(basename $@))) && $(MAKE) $(call class-part,$(basename $@)).class # build a specific package $(PROJECT).%.package-make: @echo making package $@ $(CD) $(PROJECT_HOME)/../$(call package-to-path,$(basename $@)) && $(MAKE) package # recursive build of the base package is a project build # note the semicolon which makes this an "empty command"!! # without it the %.recursive pattern would get called after this runs # resulting in an infinite loop!! $(PROJECT).package-make.recursive: project ; # build a specific package and all descendant packages $(PROJECT).%.package-make.recursive: @echo making package $@ and all descendant packages $(CD) $(PROJECT_HOME)/../$(call package-to-path,$(basename $(basename $@))) && $(MAKE) package.recursive # trick make into building the base package when asked # if we don't do this then a spurious implicit rule gets invoked because the # base package has no .suffix $(PROJECT).package-make: @echo making base package $(CD) $(PROJECT_HOME) && $(MAKE) package # recursively make something %.recursive: # @echo recursively making $(basename $@) $(MAKE) $(basename $@) $(call recursively-make,$@,true) # fun targets .PHONY: love love: @echo not war .PHONY: pull-plug pull-plug: @echo My mind is going. I can FEEL it. .PHONY: open-the-pod-bay-doors-hal open-the-pod-bay-doors-hal: @echo I\'m sorry `finger \`whoami\` | sed -e '2,$$d' -e '1s/.*:.*:[ ]*\([^ ]*\).*/\1/'`, I\'m afraid I can\'t do that. # global targets # utility targets .PHONY: show-exclude-source show-exclude-source: @echo $(EXCLUDE_SOURCE) .PHONY: show-exclude-subdirs show-exclude-subdirs: @echo $(EXCLUDE_SUBDIRS) .PHONY: show-package show-package: @echo $(PACKAGE) .PHONY: show-project-home show-project-home: @echo $(PROJECT_HOME) .PHONY: show-classpath show-classpath: @echo $(MAKE_CLASSPATH) .PHONY: show-jdk-home show-jdk-home: @echo $(JDK_HOME) .PHONY: show-jdk-ext show-jdk-ext: @echo $(JDK_EXT) .PHONY: show-tools-ext show-tools-ext: @echo $(TOOLS_EXT) .PHONY: show-ext-dir show-ext-dir: @echo $(EXT_DIR) .PHONY: show-java show-java: @echo $(JAVA) .PHONY: show-run-java-flags show-run-java-flags: @echo $(RUN_JAVA_FLAGS) .PHONY: show-run-java-with-flags show-run-java-with-flags: @echo $(JAVA) $(RUN_JAVA_FLAGS) .PHONY: show-run-java-with-flags-and-package show-run-java-with-flags-and-package: @echo $(JAVA) $(RUN_JAVA_FLAGS) $(PACKAGE) .PHONY: show-bin show-bin: @echo $(BIN) .PHONY: show-cs-bin show-cs-bin: @echo $(CS_BIN) .PHONY: show-scripts show-scripts: @echo $(SCRIPTS) .PHONY: show-cs-scripts show-cs-scripts: @echo $(CS_SCRIPTS) .PHONY: show-settings show-settings: @echo Make settings: @echo APPNAME: $(APPNAME) @echo BASE_PACKAGE: $(BASE_PACKAGE) @echo ARCH: $(ARCH) @echo TOOLS_HOME: $(TOOLS_HOME) @echo SCRIPTS: $(SCRIPTS) @echo CS_SCRIPTS: $(CS_SCRIPTS) @echo CS_BIN: $(CS_BIN) @echo CS_ENSURE: $(CS_ENSURE) @echo CS_SUBMIT: $(CS_SUBMIT) @echo JDK_BASE: $(JDK_BASE) @echo JDK_HOME: $(JDK_HOME) @echo JDK_EXT: $(JDK_EXT) @echo TOOLS_EXT: $(TOOLS_EXT) @echo EXT_DIR: $(EXT_DIR) @echo JDK_VERSION: $(JDK_VERSION) @echo SOURCE_VERSION: $(SOURCE_VERSION) @echo TARGET_VERSION: $(TARGET_VERSION) @echo JAVAC: $(JAVAC) @echo JAVA: $(JAVA) @echo JAVADOC: $(JAVADOC) @echo JAVACC: $(JAVACC) @echo JAR: $(JAR) @echo NO_COMPILE_SERVER: "$(NO_COMPILE_SERVER)" @echo USING_COMPILE_SERVER: "$(USING_COMPILE_SERVER)" @echo SHELL: $(SHELL) @echo CD: $(CD) @echo PROJECT: $(PROJECT) @echo PROJECT_HOME: $(PROJECT_HOME) ifdef ROOT_PACKAGE @echo this is the root package else @echo this is not the root package endif @echo PACKAGE: $(PACKAGE) @echo PACKAGE_PATH: '$(PACKAGE_PATH)' @echo PACKAGE_NAME: $(PACKAGE_NAME) @echo EXCLUDE_SUBDIRS: $(EXCLUDE_SUBDIRS) @echo PACKAGE_SUBDIRS: $(PACKAGE_SUBDIRS) @echo EXCLUDE_SOURCE: $(EXCLUDE_SOURCE) @echo PACKAGE_SOURCE: $(PACKAGE_SOURCE) @echo PACKAGE_HTML_SOURCE: $(PACKAGE_HTML_SOURCE) @echo SOURCE: $(SOURCE) @echo SUBPROJECT_PACKAGES: $(SUBPROJECT_PACKAGES) @echo JAVAC_FLAGS: '$(JAVAC_FLAGS)' @echo JAVADOC_FLAGS: '$(JAVADOC_FLAGS)' @echo JAVADOC_DIR: $(JAVADOC_DIR) @echo JAR_DIR: $(JAR_DIR) @echo JAR_MF: $(JAR_MF) @echo JARKEY: $(JARKEY) @echo JAR_CRT: $(JAR_CRT) @echo EXT_JARS: $(EXT_JARS) @echo MAKE_CLASSPATH: '$(MAKE_CLASSPATH)' @echo SUBPACKAGE_MAKEFILES: $(SUBPACKAGE_MAKEFILES) @echo PUBLISH_DEST: $(PUBLISH_DEST) # package targets # make the current package .PHONY: package package: $(EXTRA_PACKAGE_DEPS) $(if $(NO_SOURCE_GEN),,package-source-gen) package-javacc-make $(addsuffix .class,$(basename $(PACKAGE_SOURCE))) $(addsuffix .html,$(basename $(PACKAGE_HTML_SOURCE))) $(EXTRA_PACKAGE_CMDS) # make javacc in the current package .PHONY: packge-javacc-make package-javacc-make: $(addsuffix .class,$(basename $(wildcard *.jj))) # make the makefile in the current package ifndef ROOT_PACKAGE makefile: $(PROJECT_HOME)/makefile @$(CD) .. && $(MAKE) $(PACKAGE_NAME)/makefile else makefile: FORCE endif .PHONY: clean clean: $(EXTRA_CLEAN_DEPS) @echo removing all .class files in this package $(RM) *.class .PHONY: c-clean c-clean: @echo removing all .o files in this package $(RM) *.o .PHONY: javacc-clean javacc-clean: @echo removing javacc-generated files $(RM) `ls *.java | xargs grep -l "Generated By:JavaCC"` .PHONY: rmiwrap-clean rmiwrap-clean: @echo removing RMIWrap-generated files $(RM) `ls *.java | xargs grep -l "generated by RMIWrap"` .PHONY: html-clean html-clean: @echo removing all generated html $(RM) $(addsuffix .html,$(basename $(PACKAGE_HTML_SOURCE))) .PHONY: jar-clean jar-clean: $(RM) $(JARFILE) $(JARFILE_LITE) $(JARFILE_XLITE) .PHONY: javadoc-clean javadoc-clean: $(RM) -r $(JAVADOC_DIR) .PHONY: realclean realclean: $(EXTRA_REALCLEAN_DEPS) clean rmiwrap-clean javacc-clean html-clean jar-clean javadoc-clean if [ -f core ]; then $(RM) core; fi .PHONY: package-javacc-gen package-javacc-gen: $(addsuffix .java,$(basename $(wildcard *.jj))) .PHONY: package-source-gen package-source-gen: package-javacc-gen # project targets .PHONY: project-announce project-announce: @echo making project .PHONY: project project: project-announce $(if $(NO_SOURCE_GEN),,project-source-gen) $(call make-from-project-home,package.recursive) .PHONY: project-javacc-gen project-javacc-gen: makefiles $(call make-from-project-home,package-javacc-gen.recursive) .PHONY: project-source-gen project-source-gen: makefiles $(call make-from-project-home,package-source-gen.recursive) .PHONY: project-javadoc project-javadoc: $(call make-from-project-home,subproject-javadoc) .PHONY: subproject-javadoc subproject-javadoc: if [ "$(SUBPROJECT_PACKAGES)" ]; then $(call javadoc,$(SUBPROJECT_PACKAGES)); fi .PHONY: project-clean project-clean: $(call make-from-project-home,clean.recursive) .PHONY: project-realclean project-realclean: $(call make-from-project-home,realclean.recursive) $(SUBPACKAGE_MAKEFILES): makefile @if [ -e $@ ] && [ `grep -c super-ninja $@ 2> /dev/null ` -eq 0 ]; \ then echo "$@ exists but is not super-ninja, skipping"; \ else echo "(re)making $@" && \ $(RM) $@ && \ sed \ -e 's|^$(WS)PROJECT_HOME$(WS)=$(WS)\(.*\)$(WS)|PROJECT_HOME = ../\1|' \ -e 's/^$(WS)PACKAGE$(WS)=$(WS)\(.*\)$(WS)/PACKAGE = \1.$(subst /,,$(dir $@))/' \ -e 's/^$(WS)if-root-package$(WS)=.*/if-root-package = $$(2)/' \ makefile > $@; fi .PHONY: makefiles makefiles: $(SUBPACKAGE_MAKEFILES) @echo making makefiles @$(call recursively-make,makefiles,true) # make the jar key .PHONY: keygen keygen: $(JDK_HOME)/bin/keytool -genkey -keyalg rsa -alias $(JARKEY) $(JDK_HOME)/bin/keytool -export -alias $(JARKEY) -file $(JAR_CRT) # make the jar # # the jar is built containing all rsync-able files in all # $(SUBPROJECT_PACKAGES), the subproject javadoc, and the makefile from the # base package. Subproject packages ending in "." are copied non-recursively, # else they are copied recursively. # # empty dirs will not be included in the jar # # all $(EXT_JARS), if any, are folded into the jarfile # # if $(JAR_MF) exists it is used as the jar manifest # # if $(JAR_CRT) exist the jar is signed with $(JARKEY) .PHONY: jar jar: $(call make-jar,true,$(EXT_JARS),$(JARFILE),$(JARFILE_EXTS),$(JAR_EXTRA),$(SUBPROJECT_PACKAGES)) # make the lite jar # # same as the "jar" target except uses LITE_SUBPROJECT_PACKAGES, EXT_JARS_LITE, # JARFILE_LITE_EXTS, JAR_LITE_EXTRA, and never includes the javadoc tree jar-lite: $(call make-jar,false,$(EXT_JARS_LITE),$(JARFILE_LITE),$(JARFILE_LITE_EXTS),$(JAR_LITE_EXTRA),$(LITE_SUBPROJECT_PACKAGES)) # make the xlite jar # # same as the "jar-lite" target except uses XLITE_SUBPROJECT_PACKAGES, # EXT_JARS_XLITE, JARFILE_XLITE_EXTS, and JAR_XLITE_EXTRA .PHONY: jar-xlite jar-xlite: $(call make-jar,false,$(EXT_JARS_XLITE),$(JARFILE_XLITE),$(JARFILE_XLITE_EXTS),$(JAR_XLITE_EXTRA),$(XLITE_SUBPROJECT_PACKAGES)) # publish to PUBLISH_DEST # # rsyncs $(JARFILE) (and $(JARFILE_LITE), and $(JARFILE_XLITE), if any) # there AND rsync's $(JARFILE_PUBLISH_UNPACK)'s contents there .PHONY: publish ifdef PUBLISH_DEST publish: @echo publishing to $(PUBLISH_DEST) if [ $(JARFILE_PUBLISH_UNPACK) ]; then \ mkdir .$(JARFILE_PUBLISH_UNPACK)-unpack.tmp; \ cd .$(JARFILE_PUBLISH_UNPACK)-unpack.tmp && $(JAR) xvf ../$(JARFILE_PUBLISH_UNPACK) && $(call rsync,*,$(PUBLISH_DEST)); \ cd .. && rm -rf .$(JARFILE_PUBLISH_UNPACK)-unpack.tmp; \ fi if [ $(JARFILE) -a -f $(JARFILE) ]; then $(call rsync,$(JARFILE),$(PUBLISH_DEST)); fi if [ $(JARFILE_LITE) -a -f $(JARFILE_LITE) ]; then $(call rsync,$(JARFILE_LITE),$(PUBLISH_DEST)); fi if [ $(JARFILE_XLITE) -a -f $(JARFILE_XLITE) ]; then $(call rsync,$(JARFILE_XLITE),$(PUBLISH_DEST)); fi $(EXTRA_PUBLISH_CMDS) else publish: $(JARFILE) @echo PUBLISH_DEST not set $(EXTRA_PUBLISH_CMDS) endif # publish to PUBLISH_DEST # # rsyncs $(JARFILE_LITE), there .PHONY: publish-lite ifdef PUBLISH_DEST publish-lite: $(JARFILE_LITE) @echo publishing to $(PUBLISH_DEST) $(call rsync,$(JARFILE_LITE),$(PUBLISH_DEST)) $(EXTRA_PUBLISH_CMDS) else publish-lite: $(JARFILE_LITE) @echo PUBLISH_DEST not set $(EXTRA_PUBLISH_CMDS) endif visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/000077500000000000000000000000001147500217100246025ustar00rootroot00000000000000visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/Action.java000066400000000000000000000030771147500217100266710ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import java.util.*; import javax.media.j3d.*; import javax.vecmath.*; public abstract class Action extends SimObject { private static final String cvsid = "$Id: Action.java,v 1.2 2004/06/30 17:26:29 vona Exp $"; protected static void addXlatedAperture(Collection geometries, Aperture aperture, Vertex v) { Collection apGeoms = aperture.getGeometries(); if (apGeoms == null) { return; } Point2f p = v.getInchCoordinates(); for (Iterator it = apGeoms.iterator(); it.hasNext(); ) { geometries.add(xlateGeometry((GeometryArray) it.next(), p)); } } } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/Aperture.java000066400000000000000000000023041147500217100272330ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; public abstract class Aperture extends SimObject { private static final String cvsid = "$Id: Aperture.java,v 1.2 2004/06/30 17:26:29 vona Exp $"; public Aperture(int number) { this.number = number; } public int getNumber() { return number; } public abstract double getWidth(double direction); protected int number; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/Arc.java000066400000000000000000000042441147500217100261560ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; public class Arc extends Stroke { private static final String cvsid = "$Id: Arc.java,v 1.2 2004/06/30 17:26:29 vona Exp $"; public Arc(Aperture aperture, Vertex start, Vertex end, Vertex center) { super(aperture, start, end); this.center = center; // System.out.println(toString()); } public double getLength() { throw new UnsupportedOperationException("TBD Arc.getLength() unimplemented"); } public double getStartForwardDirection() { throw new UnsupportedOperationException("TBD Arc direction unimplemented"); } public double getStartReverseDirection() { throw new UnsupportedOperationException("TBD Arc direction unimplemented"); } public double getEndForwardDirection() { throw new UnsupportedOperationException("TBD Arc direction unimplemented"); } public double getEndReverseDirection() { throw new UnsupportedOperationException("TBD Arc direction unimplemented"); } protected void makeBounds() { throw new UnsupportedOperationException("TBD Arc bounds unimplimented"); } protected void makeGeometries() { throw new UnsupportedOperationException("TBD Arc geometry not implemented"); } public String toString() { return "arc from " + start + " to " + end + "; center " + center + "; " + aperture; } private Vertex center; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/BasicSimulatorUI.java000066400000000000000000000027321147500217100306300ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; public class BasicSimulatorUI implements SimulatorUI { private static final String cvsid = "$Id: BasicSimulatorUI.java,v 1.1.1.1 2004/06/24 05:46:01 vona Exp $"; public boolean askContinue(int line, int seq) { StringBuffer msgBuf = new StringBuffer(); msgBuf.append("Continue after line "); msgBuf.append(Integer.toString(line)); msgBuf.append(" "); if (seq >= 0) { msgBuf.append("(sequence number "); msgBuf.append(Integer.toString(seq)); msgBuf.append(")"); } msgBuf.append("[y/n]?"); System.out.println(msgBuf.toString()); //TBD return false; } } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/CircleAperture.java000066400000000000000000000060131147500217100303560ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import java.util.*; import javax.media.j3d.GeometryArray; import visolate.misc.*; public class CircleAperture extends StandardAperture { private static final String cvsid = "$Id: CircleAperture.java,v 1.2 2004/06/30 17:26:29 vona Exp $"; public static final int SEGMENTS = 16; public static final double SECTOR = 2.0*Math.PI/SEGMENTS; public CircleAperture(int number, double diameter, double holeX, double holeY) { super(number, holeX, holeY); this.diameter = diameter; } public CircleAperture(int number, double diameter, double hole) { super(number, hole); this.diameter = diameter; } public CircleAperture(int number, double diameter) { super(number); this.diameter = diameter; } public String toString() { return "Aperture " + number + ": circle" + " diameter = " + diameter + " holeX = " + holeX + " holeY = " + holeY; } public double getWidth(double direction) { return 2*getRadius(); } protected void makeBounds() { double r = getRadius(); bounds = new Rect(-r, -r, 2*r, 2*r); } protected void makeGeometries() { geometries = makeCircleGeometries(0.0, 0.0, getRadius()); } protected double getRadius() { return Math.max(0.0, diameter/2 + signedOffset); } public static Collection makeCircleGeometries(double xCenter, double yCenter, double radius) { Collection geometries = new LinkedList(); float[] coords = new float[3*(SEGMENTS + 2)]; int i = 0; coords[i++] = (float) xCenter; coords[i++] = (float) yCenter; coords[i++] = 0.0f; double x, y; double angle = 0.0; for (int j = 0; j <= SEGMENTS; j++) { x = radius*Math.cos(angle); y = radius*Math.sin(angle); coords[i++] = (float) (x+xCenter); coords[i++] = (float) (y+yCenter); coords[i++] = 0.0f; angle += SECTOR; } geometries.add(makeTFA(coords)); return geometries; } private double diameter; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/CircleInstance.java000066400000000000000000000030271147500217100303350ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import visolate.misc.*; public class CircleInstance extends PrimitiveInstance { private static final String cvsid = "$Id: CircleInstance.java,v 1.2 2004/06/30 17:26:29 vona Exp $"; public CircleInstance(double diameter, double x, double y) { this.diameter = diameter; this.x = x; this.y = y; } protected void makeBounds() { double r = getRadius(); bounds = new Rect(x-r, y-r, 2*r, 2*r); } protected double getRadius() { return Math.max(0.0, diameter/2 + signedOffset); } protected void makeGeometries() { geometries = CircleAperture.makeCircleGeometries(x, y, getRadius()); } private double diameter; private double x, y; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/CirclePrimitive.java000066400000000000000000000030751147500217100305440ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import java.util.*; public class CirclePrimitive extends MacroPrimitive { private static final String cvsid = "$Id: CirclePrimitive.java,v 1.1.1.1 2004/06/24 05:46:01 vona Exp $"; public CirclePrimitive(final List exprs) { super(exprs); } public PrimitiveInstance getInstanceInternal(List actuals) { int i = 0; int exposure = (int) getParam(i++, actuals); if (exposure != EXPOSURE_ON) return null; double diameter = (Double) getParam(i++, actuals); double x = (Double) getParam(i++, actuals); double y = (Double) getParam(i++, actuals); return new CircleInstance(diameter, x, y); } public String getName() { return "circle"; } } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/Flash.java000066400000000000000000000037711147500217100265120ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import java.util.*; import javax.media.j3d.GeometryArray; import javax.vecmath.*; import visolate.misc.*; public class Flash extends Action { private static final String cvsid = "$Id: Flash.java,v 1.2 2004/06/30 17:26:29 vona Exp $"; public Flash(Aperture aperture, Vertex location) { this.aperture = aperture; this.location = location; location.addIncidentAction(this); // System.out.println(toString()); } public Vertex getLocation() { return location; } protected void makeBounds() { Rect b = aperture.getBounds(); Point2f p = location.getInchCoordinates(); bounds = new Rect(b.x + p.x, b.y + p.y, b.width, b.height); } protected void makeGeometries() { geometries = new LinkedList(); addXlatedAperture(geometries, aperture, location); } public String toString() { return "flash at " + location + "; " + aperture; } protected void offsetChanged() { aperture.setOffset(offset); } protected void inverseChanged() { aperture.setInverse(inverse); } private Aperture aperture; private Vertex location; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/LineCenterInstance.java000066400000000000000000000024641147500217100311700ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; public class LineCenterInstance extends LineVectorInstance { private static final String cvsid = "$Id: LineCenterInstance.java,v 1.1.1.1 2004/06/24 05:46:01 vona Exp $"; public LineCenterInstance(double width, double height, double xCenter, double yCenter, double rotation) { super(height, xCenter-width/2, yCenter, xCenter+width/2, yCenter, rotation); } } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/LineCenterPrimitive.java000066400000000000000000000032751147500217100313750ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import java.util.*; public class LineCenterPrimitive extends MacroPrimitive { private static final String cvsid = "$Id: LineCenterPrimitive.java,v 1.1.1.1 2004/06/24 05:46:01 vona Exp $"; public LineCenterPrimitive(final List exprs) { super(exprs); } public PrimitiveInstance getInstanceInternal(final List actuals) { int i = 0; int exposure = (int) getParam(i++, actuals); if (exposure != EXPOSURE_ON) return null; double width = getParam(i++, actuals); double height = getParam(i++, actuals); double xCenter = getParam(i++, actuals); double yCenter = getParam(i++, actuals); double rotation = getParam(i++, actuals); return new LineCenterInstance(width, height, xCenter, yCenter, rotation); } public String getName() { return "line (center)"; } } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/LineLLInstance.java000066400000000000000000000024201147500217100302470ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; public class LineLLInstance extends LineVectorInstance { private static final String cvsid = "$Id: LineLLInstance.java,v 1.1.1.1 2004/06/24 05:46:01 vona Exp $"; public LineLLInstance(double width, double height, double xLL, double yLL, double rotation) { super(height, xLL, yLL+height/2, xLL+width, yLL+height/2, rotation); } } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/LineLLPrimitive.java000066400000000000000000000032371147500217100304620ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import java.util.*; public class LineLLPrimitive extends MacroPrimitive { private static final String cvsid = "$Id: LineLLPrimitive.java,v 1.1.1.1 2004/06/24 05:46:01 vona Exp $"; public LineLLPrimitive(final List exprs) { super(exprs); } protected PrimitiveInstance getInstanceInternal(final List actuals) { int i = 0; int exposure = (int) getParam(i++, actuals); if (exposure != EXPOSURE_ON) return null; double width = getParam(i++, actuals); double height = getParam(i++, actuals); double xLL = getParam(i++, actuals); double yLL = getParam(i++, actuals); double rotation = getParam(i++, actuals); return new LineLLInstance(width, height, xLL, yLL, rotation); } protected String getName() { return "line (LL)"; } } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/LineVectorInstance.java000066400000000000000000000045101147500217100312040ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import java.util.*; import javax.vecmath.*; public class LineVectorInstance extends OutlineInstance { private static final String cvsid = "$Id: LineVectorInstance.java,v 1.2 2004/06/30 17:26:29 vona Exp $"; public LineVectorInstance(final double width, final double xStart, final double yStart, final double xEnd, final double yEnd, final double rotation) { super(4, computePoints(width, xStart, yStart, xEnd, yEnd), rotation); // this.width = width; // // this.xStart = xStart; // this.yStart = yStart; // // this.xEnd = xEnd; // this.yEnd = yEnd; // // this.rotation = rotation; } private static List computePoints(final double width, final double xStart, final double yStart, final double xEnd, final double yEnd) { List points = new LinkedList(); Vector3d d = new Vector3d((xEnd-xStart), (yEnd-yStart), 0.0f); d.normalize(); Vector3d n = new Vector3d(); n.cross(d, Z); //no offset here, it will be takencare of in OutlineInstance.getPerimeter() points.add(new Point2d((xStart + (width/2)*n.x), (yStart + (width/2)*n.y))); points.add(new Point2d((xStart - (width/2)*n.x), (yStart - (width/2)*n.y))); points.add(new Point2d((xEnd - (width/2)*n.x), (yEnd - (width/2)*n.y))); points.add(new Point2d((xEnd + (width/2)*n.x), (yEnd + (width/2)*n.y))); return points; } // private double width; // // private double xStart, yStart; // // private double xEnd, yEnd; // // private double rotation; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/LineVectorPrimitive.java000066400000000000000000000033541147500217100314150ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import java.util.*; public class LineVectorPrimitive extends MacroPrimitive { private static final String cvsid = "$Id: LineVectorPrimitive.java,v 1.1.1.1 2004/06/24 05:46:01 vona Exp $"; public LineVectorPrimitive(final List exprs) { super(exprs); } protected PrimitiveInstance getInstanceInternal(final List actuals) { int i = 0; int exposure = (int) getParam(i++, actuals); if (exposure != EXPOSURE_ON) return null; double width = getParam(i++, actuals); double xStart = getParam(i++, actuals); double yStart = getParam(i++, actuals); double xEnd = getParam(i++, actuals); double yEnd = getParam(i++, actuals); double rotation = getParam(i++, actuals); return new LineVectorInstance(width, xStart, yStart, xEnd, yEnd, rotation); } protected String getName() { return "line (vector)"; } } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/Macro.java000066400000000000000000000033411147500217100265070ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import java.util.*; public class Macro { private static final String cvsid = "$Id: Macro.java,v 1.1.1.1 2004/06/24 05:46:01 vona Exp $"; public Macro(final String name, final List primitives) { this.name = name; this.primitives = primitives; System.out.println(toString()); } public String getName() { return name; } public String toString() { StringBuilder buf = new StringBuilder(); buf.append("macro \""); buf.append(name); buf.append("\""); for (MacroPrimitive prim : primitives) { buf.append("\n "); buf.append(prim.toString()); } return buf.toString(); } public MacroInstance getInstance(final List modifiers) { return new MacroInstance(primitives, modifiers); } private String name; private List primitives = new LinkedList(); } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/MacroAperture.java000066400000000000000000000046131147500217100302220ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import java.util.*; import javax.media.j3d.GeometryArray; import visolate.misc.*; public class MacroAperture extends Aperture { private static final String cvsid = "$Id: MacroAperture.java,v 1.2 2004/06/30 17:26:29 vona Exp $"; public MacroAperture(final int number, final Macro macro, final List modifiers) { super(number); this.macro = macro; this.modifiers = modifiers; System.out.println(toString()); instance = macro.getInstance(modifiers); } public String toString() { StringBuffer buf = new StringBuffer(); buf.append("Aperture "); buf.append(Integer.toString(number)); buf.append(": macro"); buf.append(" name = "); buf.append(macro.getName()); buf.append("; modifiers: "); for (Iterator it = modifiers.iterator(); it.hasNext(); ) { buf.append(it.next().toString()); if (it.hasNext()) buf.append(", "); } return buf.toString(); } public Rect getBounds() { return instance.getBounds(); } protected void makeBounds() { assert false; } public double getWidth(double direction) { return instance.getWidth(direction); } public Collection getGeometries() { return instance.getGeometries(); } protected void makeGeometries() { assert false; } protected void offsetChanged() { instance.setOffset(offset); } protected void inverseChanged() { instance.setInverse(inverse); } private Macro macro; private List modifiers; private MacroInstance instance; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/MacroBinOp.java000066400000000000000000000036031147500217100274400ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import java.util.*; public class MacroBinOp extends MacroExpression { private static final String cvsid = "$Id: MacroBinOp.java,v 1.1.1.1 2004/06/24 05:46:01 vona Exp $"; public static final int ADD = 0; public static final int SUBTRACT = 1; public static final int MULTIPLY = 2; public static final int DIVIDE = 3; public static final String[] OP_TEXT = new String[] {"+", "-", "*", "/"}; public MacroBinOp(int op, MacroExpression lhs, MacroExpression rhs) { this.op = op; this.lhs = lhs; this.rhs = rhs; } @Override public double getValue(final List actuals) { double lVal = lhs.getValue(actuals); double rVal = rhs.getValue(actuals); switch (op) { case ADD: return lVal + rVal; case SUBTRACT: return lVal - rVal; case MULTIPLY: return lVal*rVal; case DIVIDE: return lVal/rVal; default: return Double.NaN; } } public String toString() { return lhs.toString() + OP_TEXT[op] + rhs.toString(); } private MacroExpression lhs, rhs; private int op; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/MacroConstant.java000066400000000000000000000024221147500217100302200ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import java.util.*; public class MacroConstant extends MacroExpression { private static final String cvsid = "$Id: MacroConstant.java,v 1.1.1.1 2004/06/24 05:46:01 vona Exp $"; public MacroConstant(double value) { this.value = value; } public double getValue(final List actuals) { return value; } public String toString() { return Double.toString(value); } private double value; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/MacroExpression.java000066400000000000000000000021751147500217100305730ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import java.util.*; public abstract class MacroExpression { private static final String cvsid = "$Id: MacroExpression.java,v 1.1.1.1 2004/06/24 05:46:01 vona Exp $"; public abstract double getValue(final List actuals); public abstract String toString(); } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/MacroInstance.java000066400000000000000000000045251147500217100302010ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import java.util.*; import javax.media.j3d.GeometryArray; import visolate.misc.*; public class MacroInstance extends SimObject { private static final String cvsid = "$Id: MacroInstance.java,v 1.2 2004/06/30 17:26:29 vona Exp $"; public MacroInstance(final List primitives, final List modifiers) { for (MacroPrimitive mp : primitives) { PrimitiveInstance instance = mp.getInstance(modifiers); if (instance != null) { primInstances.add(instance); } } } protected void makeBounds() { bounds = new Rect(); for (PrimitiveInstance prim : this.primInstances) { bounds.add(prim.getBounds()); } } public double getWidth(double direction) { throw new UnsupportedOperationException("cannot draw with macro aperture"); } protected void makeGeometries() { geometries = new LinkedList(); for (Iterator it = primInstances.iterator(); it.hasNext(); ) { Collection primGeoms = it.next().getGeometries(); if (primGeoms != null) geometries.addAll(primGeoms); } } protected void offsetChanged() { for (PrimitiveInstance prim : this.primInstances) { prim.setOffset(offset); } } protected void inverseChanged() { for (PrimitiveInstance prim : this.primInstances) { prim.setInverse(inverse); } } protected List primInstances = new LinkedList(); } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/MacroPrimitive.java000066400000000000000000000042551147500217100304050ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import java.util.*; public abstract class MacroPrimitive { private static final String cvsid = "$Id: MacroPrimitive.java,v 1.2 2004/06/30 17:26:29 vona Exp $"; public static final int EXPOSURE_OFF = 0; public static final int EXPOSURE_ON = 1; public static final int EXPOSURE_REVERSE = 2; public MacroPrimitive(List exprs) { this.exprs = exprs; } public PrimitiveInstance getInstance(List modifiers) { List actuals = new ArrayList(); for (Iterator it = exprs.iterator(); it.hasNext(); ) actuals.add(new Double(((MacroExpression) it.next()). getValue(modifiers))); return getInstanceInternal(actuals); } public String toString() { StringBuffer buf = new StringBuffer(); buf.append(getName()); buf.append(" "); for (Iterator it = exprs.iterator(); it.hasNext(); ) { buf.append((it.next()).toString()); if (it.hasNext()) { buf.append(", "); } } return buf.toString(); } protected double getParam(int index, List actuals) { return (actuals.get(index)); } protected abstract String getName(); protected abstract PrimitiveInstance getInstanceInternal(List actuals); protected List exprs; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/MacroVariable.java000066400000000000000000000024361147500217100301610ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import java.util.*; public class MacroVariable extends MacroExpression { private static final String cvsid = "$Id: MacroVariable.java,v 1.1.1.1 2004/06/24 05:46:01 vona Exp $"; public MacroVariable(int index) { this.index = index; } public double getValue(final List actuals) { return actuals.get(index-1).doubleValue(); } public String toString() { return "$" + index; } private int index; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/MoireInstance.java000066400000000000000000000126121147500217100302070ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import java.util.*; import visolate.misc.*; import com.sun.j3d.utils.geometry.*; import javax.media.j3d.*; public class MoireInstance extends PrimitiveInstance { private static final String cvsid = "$Id: MoireInstance.java,v 1.2 2004/06/30 17:26:29 vona Exp $"; public MoireInstance(double x, double y, double od, double circleThickness, double gap, int n, double xHairThickness, double xHairLength, double rotation) { this.x = x; this.y = y; this.od = od; this.circleThickness = circleThickness; this.gap = gap; this.n = n; this.xHairThickness = xHairThickness; this.xHairLength = xHairLength; this.rotation = rotation; } protected void makeBounds() { double o = getOD(); bounds = new Rect(x-o/2, y-o/2, o, o); } private double getOD() { return Math.max(0.0, od + 2*signedOffset); } protected void makeGeometries() { geometries = new LinkedList(); double spokeDiameter = Math.max(0.0, xHairLength + 2*signedOffset); double spokeWidth = Math.max(0.0, xHairThickness + 2*signedOffset); for (int i = 0; i < 2; i++) geometries.addAll(makeSpokeGeometries(x, y, spokeDiameter, spokeWidth, rotation*(Math.PI/180) + i*(Math.PI/2))); double o = getOD(); double i = od - 2*(circleThickness + signedOffset); double diff = 2*(circleThickness + gap); for (int j = 0; (j < n) && (i >= 0); j++) { geometries.addAll(makeDonutGeometries(x, y, o/2, i/2)); o -= diff; i -= diff; } } public static Collection makeSpokeGeometries(double xCenter, double yCenter, double diameter, double width, double rotation) { Collection geometries = new LinkedList(); int segments = CircleAperture.SEGMENTS; float[] coords = new float[2*3*(segments + 1)]; double rad = diameter/2; double angle = Util.getOffsetAngle(rad, -width/2); double segment = (-2*angle)/segments; angle += rotation; double x, y; int i = 0; for (int k = 0; k < 2; k++) { for (int j = 0; j <= segments; j++) { x = rad*Math.cos(angle); y = rad*Math.sin(angle); coords[i++] = (float) (x+xCenter); coords[i++] = (float) (y+yCenter); coords[i++] = 0.0f; angle += segment; } angle = angle + Math.PI - segments*segment; } GeometryInfo gi = new GeometryInfo(GeometryInfo.POLYGON_ARRAY); gi.setCoordinates(coords); gi.setStripCounts(new int[] {2*(segments + 1)}); geometries.add((TriangleArray) gi.getGeometryArray(true, false, false)); return geometries; } public static Collection makeDonutGeometries(double xCenter, double yCenter, double ro, double ri) { Collection geometries = new LinkedList(); int segments = CircleAperture.SEGMENTS; double segment = (Math.PI*2.0)/segments; float[] coords = new float[2*3*segments]; double xo, yo; double xi, yi; double angle = 0.0; int i = 0; int k = 3*segments; for (int j = 0; j < segments; j++) { xo = ro*Math.cos(angle); yo = ro*Math.sin(angle); xi = ri*Math.cos(-angle); yi = ri*Math.sin(-angle); coords[i++] = (float) (xo+xCenter); coords[i++] = (float) (yo+yCenter); coords[i++] = 0.0f; coords[k++] = (float) (xi+xCenter); coords[k++] = (float) (yi+yCenter); coords[k++] = 0.0f; angle += segment; } GeometryInfo gi = new GeometryInfo(GeometryInfo.POLYGON_ARRAY); gi.setCoordinates(coords); gi.setStripCounts(new int[] {segments, segments}); gi.setContourCounts(new int[] {2}); geometries.add((TriangleArray) gi.getGeometryArray(true, false, false)); return geometries; } private double x, y; private double od; private double circleThickness; private double gap; private int n; private double xHairThickness; private double xHairLength; private double rotation; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/MoirePrimitive.java000066400000000000000000000037401147500217100304150ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import java.util.*; public class MoirePrimitive extends MacroPrimitive { private static final String cvsid = "$Id: MoirePrimitive.java,v 1.1.1.1 2004/06/24 05:46:01 vona Exp $"; public MoirePrimitive(final List exprs) { super(exprs); } protected PrimitiveInstance getInstanceInternal(final List actuals) { int i = 0; double x = getParam(i++, actuals); double y = getParam(i++, actuals); double od = getParam(i++, actuals); double circleThickness = getParam(i++, actuals); double gap = getParam(i++, actuals); int n = (int) getParam(i++, actuals); double xHairThickness = getParam(i++, actuals); double xHairLength = getParam(i++, actuals); double rotation = getParam(i++, actuals); return new MoireInstance(x, y, od, circleThickness, gap, n, xHairThickness, xHairLength, rotation); } protected String getName() { return "moire"; } } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/ObroundAperture.java000066400000000000000000000076661147500217100306040ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import java.util.*; import visolate.misc.*; import com.sun.j3d.utils.geometry.*; import javax.media.j3d.*; public class ObroundAperture extends StandardAperture { private static final String cvsid = "$Id: ObroundAperture.java,v 1.2 2004/06/30 17:26:29 vona Exp $"; public ObroundAperture(int number, double diameterX, double diameterY, double holeX, double holeY) { super(number, holeX, holeY); init(diameterX, diameterY); } private void init(double diameterX, double diameterY) { this.diameterX = diameterX; this.diameterY = diameterY; } public double getA() { return Math.max(0.0, 0.5*diameterX + signedOffset); } public double getB() { return Math.max(0.0, 0.5*diameterY + signedOffset); } public ObroundAperture(int number, double diameterX, double diameterY, double hole) { super(number, hole); init(diameterX, diameterY); } public ObroundAperture(int number, double diameterX, double diameterY) { super(number); init(diameterX, diameterY); } public String toString() { return "Aperture " + number + ": obround" + " diameterX = " + diameterX + " diameterY = " + diameterY + " holeX = " + holeX + " holeY = " + holeY; } protected void makeBounds() { double a = getA(); double b = getB(); bounds = new Rect(-a, -b, 2*a, 2*b); } public double getWidth(double direction) { //TBD this is for an ellipse... return 2*radius(direction+Math.PI/2); } private double radius(double theta) { double a = getA(); double b = getB(); double p = b*Math.cos(theta); double q = a*Math.sin(theta); return a*b/Math.sqrt(p*p+q*q); } protected void makeGeometries() { geometries = new LinkedList(); double a = getA(); double b = getB(); int segments = CircleAperture.SEGMENTS/2; double segment = Math.PI/segments; float[] coords = new float[2*3*(segments + 1)]; double rad = Math.min(a, b); double length = Math.max(2*a, 2*b)-2*rad; boolean flip = b > a; double xc = length/2; double x, y; int i = 0; double angle = -Math.PI/2; for (int k = 0; k < 2; k++) { for (int j = 0; j <= segments; j++) { x = rad*Math.cos(angle); y = rad*Math.sin(angle); if (!flip) { coords[i++] = (float) (x+xc); coords[i++] = (float) y; } else { coords[i++] = (float) y; coords[i++] = (float) (x+xc); } coords[i++] = 0.0f; angle += segment; } xc = -length/2; angle = Math.PI/2; } GeometryInfo gi = new GeometryInfo(GeometryInfo.POLYGON_ARRAY); gi.setCoordinates(coords); gi.setStripCounts(new int[] {2*(segments + 1)}); geometries.add(gi.getGeometryArray(true, false, false)); } private double diameterX; private double diameterY; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/OutlineInstance.java000066400000000000000000000110711147500217100305510ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import java.util.*; import visolate.misc.*; import javax.vecmath.*; import javax.media.j3d.*; import com.sun.j3d.utils.geometry.*; public class OutlineInstance extends PrimitiveInstance { private static final String cvsid = "$Id: OutlineInstance.java,v 1.2 2004/06/30 17:26:29 vona Exp $"; public static final Vector3d Z = new Vector3d(0.0, 0.0, 1.0); public static final double MIN_D_LENGTH = 1e-6; public OutlineInstance(final int aN, final List aPoints, double aRotation) { // this.myN = aN; this.myPoints = aPoints; this.myRotation = aRotation; numVerts = aPoints.size(); if (aN != numVerts) System.err.println("WARNING: amacro primitive type 4 num points (" + aN + ") disagrees with actual number of coordinates; " + "ignoring"); } private void getPerimeter() { if (x == null) { x = new float[numVerts]; y = new float[numVerts]; if (numVerts == 0) { return; } Transform3D t3d = new Transform3D(); t3d.rotZ(myRotation*(Math.PI/180)); Point2d p = null; if (myPoints.size() > 1) { p = (Point2d) myPoints.get(myPoints.size() - 1); } Point2d prev = null; if (myPoints.size() > 2) prev = (Point2d) myPoints.get(myPoints.size() - 2); Point2d next; Point3d p3 = new Point3d(); Vector3d d = new Vector3d(); Vector3d d0 = new Vector3d(); Vector3d d1 = new Vector3d(); int i = 0; for (Iterator it = myPoints.iterator(); it.hasNext(); ) { next = it.next(); if ((prev != null) && (p != null)) { d0.set(p.x-prev.x, p.y-prev.y, 0.0); d1.set(p.x-next.x, p.y-next.y, 0.0); d0.normalize(); d1.normalize(); d.set(0.5*(d0.x+d1.x), 0.5*(d0.y+d1.y), 0.0); d.normalize(); if (d.length() < MIN_D_LENGTH) d.cross(d0, Z); double angle = Util.angleCCW(d1, d0); if (angle > Math.PI) angle = Math.PI*2.0 - angle; d.scale(Util.vertexOffset(signedOffset, angle)); } else if (p != null) { //degenerate case: 2 points d.set(p.x-next.x, p.y-next.y, 0.0); d.normalize(); d.scale(signedOffset); } else { //degenerate case: 1 point p = next; d.set(0.0, 0.0, 0.0); } p3.set(p.x+d.x, p.y+d.y, 0.0); t3d.transform(p3); x[i] = (float) p3.x; y[i] = (float) p3.y; i++; prev = p; p = next; } } } protected void makeBounds() { getPerimeter(); bounds = new Rect(); for (int i = 0; i < numVerts; i++) bounds.add(x[i], y[i]); } protected void makeGeometries() { getPerimeter(); geometries = new LinkedList(); GeometryInfo gi = new GeometryInfo(GeometryInfo.POLYGON_ARRAY); float[] coords = new float[3*numVerts]; int j = 0; for (int i = 0; i < numVerts; i++) { coords[j++] = x[i]; coords[j++] = y[i]; coords[j++] = 0.0f; } gi.setCoordinates(coords); gi.setStripCounts(new int[] {numVerts}); geometries.add(gi.getGeometryArray(true, false, false)); } protected void offsetChanged() { super.offsetChanged(); x = y = null; } protected void inverseChanged() { super.inverseChanged(); x = y = null; } // private int myN; private List myPoints; private int numVerts; private double myRotation; private float[] x = null; private float[] y = null; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/OutlinePrimitive.java000066400000000000000000000033471147500217100307640ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import java.util.*; import javax.vecmath.*; public class OutlinePrimitive extends MacroPrimitive { private static final String cvsid = "$Id: OutlinePrimitive.java,v 1.1.1.1 2004/06/24 05:46:01 vona Exp $"; public OutlinePrimitive(List exprs) { super(exprs); } @Override protected PrimitiveInstance getInstanceInternal(List actuals) { int i = 0; int exposure = (int) getParam(i++, actuals); if (exposure != EXPOSURE_ON) { return null; } int n = (int) getParam(i++, actuals); List pts = new LinkedList(); while (i < (actuals.size()-1)) { pts.add(new Point2d(getParam(i++, actuals), getParam(i++, actuals))); } double rotation = getParam(i++, actuals); return new OutlineInstance(n, pts, rotation); } protected String getName() { return "outline"; } } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/PolygonAperture.java000066400000000000000000000123301147500217100306030ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import java.util.*; import javax.media.j3d.GeometryArray; import visolate.misc.*; public class PolygonAperture extends StandardAperture { private static final String cvsid = "$Id: PolygonAperture.java,v 1.2 2004/06/30 17:26:29 vona Exp $"; public PolygonAperture(int number, double od, int sides, double rotation, double holeX, double holeY) { super(number, holeX, holeY); init(od, sides, rotation); } private void init(double od, int sides, double rotation) { this.od = od; this.sides = sides; this.rotation = rotation; } private void getPerimeter() { if (x == null) { x = new float[sides]; y = new float[sides]; angle = new double[sides]; computeXYAngle(x, y, angle, getRadius(), sides, rotation); } } protected double getRadius() { return Math.max(0.0, od/2 + Util.vertexOffset(signedOffset, Math.PI*2.0/((double) sides))); } public static void computeXYAngle(float[] x, float[] y, double[] angle, double radius, int sides, double rotation) { rotation = rotation*(Math.PI/180); double sector = Math.PI*2.0/((double) sides); for (int i = 0; i < sides; i++) { double theta = Util.canonicalizeAngle(rotation + i*sector); if (angle != null) angle[i] = theta; x[i] = (float) (Math.cos(theta)*radius); y[i] = (float) (Math.sin(theta)*radius); } } public PolygonAperture(int number, double od, int sides, double rotation, double hole) { super(number, hole); init(od, sides, rotation); } public PolygonAperture(int number, double od, int sides, double rotation) { super(number); init(od, sides, rotation); } public PolygonAperture(int number, double od, int sides) { super(number); init(od, sides, 0.0); } public String toString() { return "Aperture " + number + ": polygon" + " od = " + od + " sides = " + sides + " rotation = " + rotation + " holeX = " + holeX + " holeY = " + holeY; } protected void makeBounds() { getPerimeter(); bounds = new Rect(x, y); } public double getWidth(double direction) { getPerimeter(); return Util.getPolyWidth(x, y, angle, direction + Math.PI/2); } protected void makeGeometries() { getPerimeter(); geometries = makeGeometriesFromXY(0.0, 0.0, x, y, sides, getRadius(), rotation); } public static Collection makeGeometriesFromXY(double xCenter, double yCenter, float[] x, float[] y, int sides, double radius, double rotation) { rotation = rotation*(Math.PI/180); Collection geometries = new LinkedList(); float[] coords = new float[3*(sides + 2)]; int i = 0; coords[i++] = (float) xCenter; coords[i++] = (float) yCenter; coords[i++] = 0.0f; for (int j = 0; j < sides; j++) { coords[i++] = (float) (x[j] + xCenter); coords[i++] = (float) (y[j] + yCenter); coords[i++] = 0.0f; } coords[i++] = (float) (x[0] + xCenter); coords[i++] = (float) (y[0] + yCenter); coords[i++] = 0.0f; geometries.add(makeTFA(coords)); return geometries; } protected void offsetChanged() { super.offsetChanged(); x = y = null; angle = null; } protected void inverseChanged() { super.inverseChanged(); x = y = null; angle = null; } private double od; private int sides; private double rotation; private float[] x = null; private float[] y = null; private double[] angle = null; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/PolygonFill.java000066400000000000000000000024661147500217100277130ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; public class PolygonFill extends Action { private static final String cvsid = "$Id: PolygonFill.java,v 1.2 2004/06/30 17:26:29 vona Exp $"; protected void makeBounds() { throw new UnsupportedOperationException("TBD Polygon bounds unimplimented"); } protected void makeGeometries() { throw new UnsupportedOperationException("TBD Polygon geometry not implemented"); } // private List vertices = new LinkedList(); } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/PolygonInstance.java000066400000000000000000000053131147500217100305630ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import visolate.misc.*; public class PolygonInstance extends PrimitiveInstance { private static final String cvsid = "$Id: PolygonInstance.java,v 1.2 2004/06/30 17:26:29 vona Exp $"; public PolygonInstance(int n, double x, double y, double diameter, double rotation) { this.n = n; this.x = x; this.y = y; this.diameter = diameter; this.rotation = rotation; } private void getPerimeter() { if (xCoord == null) { xCoord = new float[n]; yCoord = new float[n]; PolygonAperture.computeXYAngle(xCoord, yCoord, null, getRadius(), n, rotation); } } protected double getRadius() { return Math.max(0.0, diameter/2 + Util.vertexOffset(signedOffset, Math.PI*2.0/((double) n))); } protected void makeBounds() { getPerimeter(); bounds = new Rect(xCoord, yCoord); } protected void makeGeometries() { getPerimeter(); geometries = PolygonAperture.makeGeometriesFromXY(x, y, xCoord, yCoord, n, getRadius(), rotation); } protected void offsetChanged() { super.offsetChanged(); xCoord = yCoord = null; } protected void inverseChanged() { super.inverseChanged(); xCoord = yCoord = null; } private int n; private double x, y; private double diameter; private double rotation; private float[] xCoord = null; private float[] yCoord = null; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/PolygonPrimitive.java000066400000000000000000000032311147500217100307640ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import java.util.*; public class PolygonPrimitive extends MacroPrimitive { private static final String cvsid = "$Id: PolygonPrimitive.java,v 1.1.1.1 2004/06/24 05:46:01 vona Exp $"; public PolygonPrimitive(final List exprs) { super(exprs); } protected PrimitiveInstance getInstanceInternal(final List actuals) { int i = 0; int exposure = (int) getParam(i++, actuals); if (exposure != EXPOSURE_ON) return null; int n = (int) getParam(i++, actuals); double x = getParam(i++, actuals); double y = getParam(i++, actuals); double diameter = getParam(i++, actuals); double rotation = getParam(i++, actuals); return new PolygonInstance(n, x, y, diameter, rotation); } protected String getName() { return "polygon"; } } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/PrimitiveInstance.java000066400000000000000000000020251147500217100311010ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; public abstract class PrimitiveInstance extends SimObject { private static final String cvsid = "$Id: PrimitiveInstance.java,v 1.2 2004/06/30 17:26:29 vona Exp $"; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/RectangleAperture.java000066400000000000000000000075201147500217100310650ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import java.util.*; import javax.media.j3d.GeometryArray; import visolate.misc.*; public class RectangleAperture extends StandardAperture { private static final String cvsid = "$Id: RectangleAperture.java,v 1.2 2004/06/30 17:26:29 vona Exp $"; public RectangleAperture(int number, double dimensionX, double dimensionY, double holeX, double holeY) { super(number, holeX, holeY); init(dimensionX, dimensionY); } private void init(double dimensionX, double dimensionY) { this.dimensionX = dimensionX; this.dimensionY = dimensionY; } private void getPerimeter() { if (x == null) { x = new float[4]; y = new float[4]; angle = new double[4]; h = (float) Math.max(0.0, (dimensionX/2.0 + signedOffset)); v = (float) Math.max(0.0, (dimensionY/2.0 + signedOffset)); x[0] = h; y[0] = v; x[1] = -h; y[1] = v; x[2] = -h; y[2] = -v; x[3] = h; y[3] = -v; for (int i = 0; i < angle.length; i++) angle[i] = Util.canonicalAngle(x[i], y[i]); } } public RectangleAperture(int number, double dimensionX, double dimensionY, double hole) { super(number, hole); init(dimensionX, dimensionY); } public RectangleAperture(int number, double dimensionX, double dimensionY) { super(number); init(dimensionX, dimensionY); } public String toString() { return "Aperture " + number + ": rectangle" + " dimensionX = " + dimensionX + " dimensionY = " + dimensionY + " holeX = " + holeX + " holeY = " + holeY; } public double getWidth(double direction) { getPerimeter(); return Util.getPolyWidth(x, y, angle, direction + Math.PI/2); } protected void makeBounds() { getPerimeter(); bounds = new Rect(-h, -v, 2*h, 2*v); } protected void makeGeometries() { getPerimeter(); geometries = new LinkedList(); float[] coords = new float[3*6]; int i = 0; coords[i++] = 0.0f; coords[i++] = 0.0f; coords[i++] = 0.0f; for (int j = 0; j < 4; j++) { coords[i++] = x[j]; coords[i++] = y[j]; coords[i++] = 0.0f; } coords[i++] = x[0]; coords[i++] = y[0]; coords[i++] = 0.0f; geometries.add(makeTFA(coords)); } protected void offsetChanged() { super.offsetChanged(); x = y = null; h = v = Float.NaN; angle = null; } protected void inverseChanged() { super.inverseChanged(); x = y = null; h = v = Float.NaN; angle = null; } private float h = Float.NaN; private float v = Float.NaN; private float[] x = null; private float[] y = null; private double[] angle = null; private double dimensionX; private double dimensionY; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/Segment.java000066400000000000000000000114061147500217100270510ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import java.util.*; import visolate.misc.*; import javax.media.j3d.GeometryArray; import javax.vecmath.*; public class Segment extends Stroke { private static final String cvsid = "$Id: Segment.java,v 1.3 2004/08/05 02:57:53 vona Exp $"; public static final Vector3d Z = new Vector3d(0.0, 0.0, 1.0); public static final double MIN_LENGTH = 0.00001; public Segment(Aperture aperture, Vertex start, Vertex end) { super(aperture, start, end); double dx = end.x - start.x; double dy = end.y - start.y; double length = Math.sqrt(dx*dx + dy*dy); double s = dy/length; double c = dx/length; forwardDirection = Math.atan2(s, c); if (forwardDirection < 0.0) forwardDirection = 2*Math.PI + forwardDirection; reverseDirection = Math.atan2(-s, -c); if (reverseDirection < 0.0) reverseDirection = 2*Math.PI + reverseDirection; // System.out.println(toString()); } public double getLength() { if (lengthInches < 0.0) { lengthInches = 0.0; lengthInches = start.getInchCoordinates().distance(end.getInchCoordinates()); } return lengthInches; } public double getStartForwardDirection() { return forwardDirection; } public double getStartReverseDirection() { return reverseDirection; } public double getEndForwardDirection() { return forwardDirection; } public double getEndReverseDirection() { return reverseDirection; } protected void makeBounds() { bounds = new Rect(); Point2f s = start.getInchCoordinates(); Point2f e = end.getInchCoordinates(); Rect apBounds = aperture.getBounds(); bounds.add(new Rect(apBounds.x + s.x, apBounds.y + s.y, apBounds.width, apBounds.height)); bounds.add(new Rect(apBounds.x + e.x, apBounds.y + e.y, apBounds.width, apBounds.height)); getBodyRect(); //body rect is null if segment is 0 length if (bodyRect != null) { for (int i = 0; i < bodyRect.length; i++) bounds.add(bodyRect[i].x, bodyRect[i].y); } } protected Point2d[] getBodyRect() { if (bodyRect == null) { if (getLength() < MIN_LENGTH) return null; bodyRect = new Point2d[4]; double width = aperture.getWidth(forwardDirection); Point2f s = start.getInchCoordinates(); Point2f e = end.getInchCoordinates(); Vector3d d = new Vector3d(e.x - s.x, e.y - s.y, 0.0); d.normalize(); Vector3d n = new Vector3d(); n.cross(d, Z); n.scale(width/2); bodyRect[0] = new Point2d(s.x + n.x, s.y + n.y); bodyRect[1] = new Point2d(e.x + n.x, e.y + n.y); bodyRect[2] = new Point2d(e.x - n.x, e.y - n.y); bodyRect[3] = new Point2d(s.x - n.x, s.y - n.y); } return bodyRect; } protected void makeGeometries() { geometries = new LinkedList(); getBodyRect(); //body rect is null if segment is 0 length if (bodyRect != null) { float[] coords = new float[3*4]; for (int i = 0; i < 4; i++) { coords[3*i+0] = (float) bodyRect[i].x; coords[3*i+1] = (float) bodyRect[i].y; coords[3*i+2] = 0.0f; } geometries.add(makeTFA(coords)); addXlatedAperture(geometries, aperture, start); } addXlatedAperture(geometries, aperture, end); } public String toString() { return "segment from " + start + " to " + end + "; " + aperture; } protected void offsetChanged() { super.offsetChanged(); bodyRect = null; } protected void inverseChanged() { super.inverseChanged(); bodyRect = null; } private double lengthInches = -1.0; private double forwardDirection; private double reverseDirection; private Point2d[] bodyRect = null; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/SimObject.java000066400000000000000000000204331147500217100273260ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import java.util.*; import javax.media.j3d.*; import javax.vecmath.*; import visolate.misc.*; public abstract class SimObject { private static final String cvsid = "$Id: SimObject.java,v 1.2 2004/07/16 20:30:52 vona Exp $"; public Rect getBounds() { if (bounds == null) makeBounds(); return bounds; } protected abstract void makeBounds(); public Collection getGeometries() { if (geometries == null) { makeGeometries(); } return geometries; } protected abstract void makeGeometries(); public double computeSignedOffset(double offset, boolean inverse) { return offset * ((inverse) ? -1.0 : 1.0); } public double getOffset() { return offset; } public void setOffset(double offset) { boolean changed = (this.offset != offset); this.offset = offset; signedOffset = computeSignedOffset(offset, inverse); if (changed) { bounds = null; geometries = null; offsetChanged(); } } protected void offsetChanged() { } public boolean getInverse() { return inverse; } public void setInverse(boolean inverse) { boolean changed = (this.inverse != inverse); this.inverse = inverse; signedOffset = computeSignedOffset(offset, inverse); if (changed) { bounds = null; geometries = null; inverseChanged(); } } protected void inverseChanged() { } protected static TriangleArray makeTA(float[] vertices) { if (vertices == null) return null; int numVertices = vertices.length/3; if (numVertices < 3) return null; TriangleArray geometry = new MyTriangleArray(numVertices, GeometryArray.COORDINATES | GeometryArray.BY_REFERENCE); geometry.setCoordRefFloat(vertices); return geometry; } protected static TriangleArray makeTA() { return makeTA(null); } protected static TriangleFanArray makeTFA(final float[] vertices, int[] stripVertexCounts) { if (vertices == null) { return null; } int numVertices = vertices.length/3; if (numVertices < 3) { return null; } if (stripVertexCounts == null) { stripVertexCounts = new int[] {numVertices}; } TriangleFanArray geometry = new MyTriangleFanArray(numVertices, GeometryArray.COORDINATES | GeometryArray.BY_REFERENCE, stripVertexCounts); geometry.setCoordRefFloat(vertices); return geometry; } protected static TriangleFanArray makeTFA(float[] vertices) { return makeTFA(vertices, null); } protected static TriangleFanArray makeTFA() { return makeTFA(null); } protected static GeometryArray dupGeometry(final GeometryArray geometry, final float[] newCoords) { float[] coords = (newCoords != null) ? newCoords : geometry.getCoordRefFloat(); if (geometry instanceof TriangleArray) { return makeTA(coords); } else if (geometry instanceof TriangleFanArray) { return makeTFA(coords); } else { throw new UnsupportedOperationException(geometry.getClass() + " unhandled"); } } protected static GeometryArray xlateGeometry(final GeometryArray geometry, final Point2f t) { float[] coords = geometry.getCoordRefFloat(); float[] newCoords = new float[coords.length]; for (int i = 0; i < coords.length/3; i++) { newCoords[3*i+0] = coords[3*i+0] + t.x; newCoords[3*i+1] = coords[3*i+1] + t.y; newCoords[3*i+2] = coords[3*i+2]; } return dupGeometry(geometry, newCoords); } public static int hashCode(final int[] a) { int c = 0; for (int i = 0; i < a.length; i++) { c = 31*c + a[i]; } return c; } public static int hashCode(float[] a) { int c = 0; for (int i = 0; i < a.length; i++) { c = 31*c + Float.floatToRawIntBits(a[i]); } return c; } protected double offset = 0.0; protected double signedOffset = 0.0; protected boolean inverse = false; protected Rect bounds = null; protected Collection geometries = null; } class MyTriangleArray extends TriangleArray { public MyTriangleArray(int vertexCount, int vertexFormat) { super(vertexCount, vertexFormat); setupHash = vertexCount^(vertexFormat*31); hashCode = setupHash; } public MyTriangleArray(int vertexCount, int vertexFormat, int texCoordSetCount, int[] texCoordSetMap) { super(vertexCount, vertexFormat, texCoordSetCount, texCoordSetMap); setupHash = vertexCount^(vertexFormat*31); hashCode = setupHash; } public int hashCode() { return hashCode; } public boolean equals(Object o) { if (!(o instanceof MyTriangleArray)) return false; MyTriangleArray other = (MyTriangleArray) o; boolean ret = ((other.getVertexCount() == getVertexCount()) && (other.getVertexFormat() == getVertexFormat()) && Arrays.equals(myCoords, other.myCoords)); // System.out.println((ret) ? "eq" : "neq"); return ret; } public void setCoordRefFloat(float[] coords) { myCoords = coords; hashCode = SimObject.hashCode(myCoords)^(setupHash*31); super.setCoordRefFloat(coords); } protected float[] myCoords; protected int setupHash; protected int hashCode; } class MyTriangleFanArray extends TriangleFanArray { public MyTriangleFanArray(int vertexCount, int vertexFormat, int[] stripVertexCounts) { super(vertexCount, vertexFormat, stripVertexCounts); setupHash = vertexCount^(vertexFormat*31); setupHash = setupHash^(SimObject.hashCode(stripVertexCounts)*31); hashCode = setupHash; myStripVertexCounts = stripVertexCounts; } public MyTriangleFanArray(int vertexCount, int vertexFormat, int texCoordSetCount, int[] texCoordSetMap, int[] stripVertexCounts) { super(vertexCount, vertexFormat, texCoordSetCount, texCoordSetMap, stripVertexCounts); setupHash = vertexCount^(vertexFormat*31); setupHash = setupHash^(SimObject.hashCode(stripVertexCounts)*31); hashCode = setupHash; myStripVertexCounts = stripVertexCounts; } public int hashCode() { return hashCode; } public boolean equals(Object o) { if (!(o instanceof MyTriangleFanArray)) { return false; } MyTriangleFanArray other = (MyTriangleFanArray) o; boolean ret = ((other.getVertexCount() == getVertexCount()) && (other.getVertexFormat() == getVertexFormat()) && Arrays.equals(myStripVertexCounts, other.myStripVertexCounts) && Arrays.equals(myCoords, other.myCoords)); // System.out.println((ret) ? "eq" : "neq"); return ret; } public void setCoordRefFloat(float[] coords) { myCoords = coords; hashCode = SimObject.hashCode(myCoords)^(setupHash*31); super.setCoordRefFloat(coords); } protected int[] myStripVertexCounts; protected float[] myCoords; protected int setupHash; protected int hashCode; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/Simulator.java000066400000000000000000000302041147500217100274230ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import java.util.*; import visolate.misc.*; public class Simulator { private static final String cvsid = "$Id: Simulator.java,v 1.5 2006/08/29 00:13:03 vona Exp $"; public static final double ARC_RESOLUTION = Math.PI/128.0; public static final int MAX_FORMAT = 6; //modes public static final int RAPID = 0; public static final int LINEAR = 1; public static final int POLYGON = 2; public static final int CW = 3; public static final int CCW = 4; public static final String[] MODE_NAME = new String[] {"rapid", "linear", "polygon", "cw", "ccw"}; //exposures public static final int OPEN = 0; public static final int CLOSED = 1; public static final int FLASH = 2; public static final String[] EXPOSURE_NAME = new String[] {"open", "closed", "flash"}; //defaults public static final int DEF_MODE = LINEAR; public static final Aperture DEF_APERTURE = null; public static final int DEF_EXPOSURE = CLOSED; public static final int DEF_X = 0; public static final int DEF_Y = 0; public static final int DEF_I = 0; public static final int DEF_J = 0; public static final int DEF_XSCALE = 10000; public static final int DEF_YSCALE = 10000; public static final boolean DEF_INCREMENTAL = false; public static final boolean DEF_IGNORELEADING = true; public static final boolean DEF_IGNORETRAILING = false; public static final boolean DEF_METRIC = false; public static final boolean DEF_ARC360 = false; public static final int DEF_X_BEFORE = 2; public static final int DEF_X_AFTER = 4; public static final int DEF_Y_BEFORE = 2; public static final int DEF_Y_AFTER = 4; public Simulator(SimulatorUI ui) { this.ui = ui; } public Simulator() { this(new BasicSimulatorUI()); } public void reset() { // System.out.println("reset()"); macros.clear(); apertures.clear(); vertices.clear(); actions.clear(); mode = DEF_MODE; aperture = DEF_APERTURE; exposure = DEF_EXPOSURE; p = getVertex(DEF_X, DEF_Y); ci = DEF_I; cj = DEF_J; xScale = DEF_XSCALE; yScale = DEF_YSCALE; incremental = DEF_INCREMENTAL; ignoreTrailing = DEF_IGNORETRAILING; metric = DEF_METRIC; arc360 = DEF_ARC360; xBefore = DEF_X_BEFORE; xAfter = DEF_X_AFTER; xWidth = DEF_X_BEFORE + DEF_X_AFTER; yBefore = DEF_Y_BEFORE; yAfter = DEF_Y_AFTER; yWidth = DEF_Y_BEFORE + DEF_Y_AFTER; } public void setMetric() { // System.out.println("setMetric()"); metric = true; } public void ignoreTrailingZeros() { // System.out.println("setIgnoreTrailingZeros()"); ignoreTrailing = true; } public void setFormatX(int before, int after) { // System.out.println("setFormatX(" + before + ", " + after + ")"); if (!checkFormat(before) || !checkFormat(after)) throw new SimulatorException("bad X format: " + before + "." + after); xBefore = before; xAfter = after; xWidth = before + after; xScale = (int) Math.pow(10.0, after); // System.out.println("xScale = " + xScale); } private boolean checkFormat(int format) { return (format >= 0) && (format <= MAX_FORMAT); } public void setFormatY(int before, int after) { // System.out.println("setFormatY(" + before + ", " + after + ")"); if (!checkFormat(before) || !checkFormat(after)) throw new SimulatorException("bad Y format: " + before + "." + after); yBefore = before; yAfter = after; yWidth = before + after; yScale = (int) Math.pow(10.0, after); // System.out.println("yScale = " + yScale); } public void setIncremental(boolean incremental) { // System.out.println("setIncremental(" + incremental + ")"); this.incremental = incremental; } public void set360(boolean enabled) { // System.out.println("set360(" + enabled + ")"); arc360 = enabled; } public void setMode(int mode) { // System.out.println("setMode(" + MODE_NAME[mode] + ")"); if ((mode < 0) || (mode > 4)) throw new SimulatorException("unknown mode: " + mode); this.mode = mode; } public void setAperture(int aperture) { // System.out.println("setAperture(" + aperture + ")"); try { this.aperture = (Aperture) apertures.get(new Integer(aperture)); } catch (NoSuchElementException e) { throw new SimulatorException("unknown aperture: " + aperture); } } public void setExposure(int exposure) { // System.out.println("setExposure(" + EXPOSURE_NAME[exposure] + ")"); this.exposure = exposure; } public void setPosition(String x, String y) { // System.out.println("setPosition(" + x + ", " + y + ")"); int xp = p.x; if (x != null) xp = parseX(x); int yp = p.y; if (y != null) yp = parseY(y); int absX = toAbsoluteX(xp); int absY = toAbsoluteY(yp); // System.out.println("setting position to absolute coords (" + // absX + ", " + absY + ")"); Vertex newP = getVertex(absX, absY); if ((mode == RAPID) && (exposure != CLOSED)) System.out.println("WARNING: rapid move with exposure open or flash"); if (mode == POLYGON) { throw new UnsupportedOperationException("TBD polygon mode"); } else if ((exposure == FLASH) || ((exposure == OPEN) && p.equals(newP))) { actions.add(new Flash(aperture, newP)); } else if (exposure == OPEN) { switch (mode) { case RAPID: case LINEAR: actions.add(new Segment(aperture, p, newP)); break; case CCW: addArc(newP, 1); break; case CW: addArc(newP, -1); break; } } p = newP; } public void addFlash() { actions.add(new Flash(aperture, p)); } public void addArc(Vertex end, int dir) { // System.err.println(((arc360) ? "360 " : "quadrant ") + // ((dir > 0) ? "CCW" : "CW") + // " arc from " + p + " to " + end); // System.err.println(" (i, j) = (" + ci + ", " + cj + ")"); int cx = p.x + ci; int cy = p.y + cj; if (!arc360) { cx = p.x + abs(ci)*sign(p.y-end.y)*dir; cy = p.y + abs(cj)*sign(p.x-end.x)*dir; } // System.err.println(" center (" + cx + ", " + cy + ")"); int dx = p.x-cx; int dy = p.y-cy; double startT = Util.canonicalizeAngle(Math.atan2(dy, dx)); double radius = Math.sqrt(dx*dx+dy*dy); // System.err.println(" start angle: " + Math.toDegrees(startT) + " deg"); // System.err.println(" radius: " + radius + " mils"); double csT = Math.cos(startT); double ssT = Math.sin(startT); dx = end.x-cx; dy = end.y-cy; double standardEndX = dx*csT - dy*(-ssT); double standardEndY = dx*(-ssT) + dy*csT; double standardEndT = Util.canonicalizeAngle(Math.atan2(standardEndY, standardEndX)); // System.err.println(" end angle (standard pos): " + // Math.toDegrees(standardEndT) + " deg"); double x = 0.0; double y = 0.0; Vertex prev = p; Vertex current = p; for (double t = ((dir > 0 ) ? 0.0 : 2.0*Math.PI); ((dir > 0) ? (t < standardEndT) : (t > standardEndT)); t += (ARC_RESOLUTION*dir)) { x = radius*Math.cos(t); y = radius*Math.sin(t); // System.err.println(" current angle (standard pos): " + // Math.toDegrees(t) + " deg"); if (t > 0.0) { current = getVertex(cx+((int) Math.round(x*csT - y*ssT)), cy+((int) Math.round(x*ssT + y*csT))); // System.err.println(" adding segment from " + prev + " to " + current); actions.add(new Segment(aperture, prev, current)); } prev = current; } // System.err.println(" adding segment from " + prev + " to " + end); actions.add(new Segment(aperture, prev, end)); } private int sign(int i) { if (i >= 0) return 1; else return -1; } private int abs(int i) { if (i >= 0) return i; else return -i; } public void comment(int line, String comment) { System.out.println("Comment at line " + line + ": " + comment); } private int parseX(String coord) { int x = 0; if (!ignoreTrailing) { x = Integer.parseInt(coord); } else { StringBuffer buf = new StringBuffer(); buf.append(coord); for (int pad = xWidth - coord.length(); pad > 0; pad--) buf.append("0"); x = Integer.parseInt(buf.toString()); } // System.out.println("parsed x coord \"" + coord + "\" as " + x); return x; } private int parseY(String coord) { int y = 0; if (!ignoreTrailing) { y = Integer.parseInt(coord); } else { StringBuffer buf = new StringBuffer(); buf.append(coord); for (int pad = yWidth - coord.length(); pad > 0; pad--) buf.append("0"); y = Integer.parseInt(buf.toString()); } // System.out.println("parsed y coord \"" + coord + "\" as " + y); return y; } private int toAbsoluteX(int x) { if (incremental) return p.x + x; else return x; } private int toAbsoluteY(int y) { if (incremental) return p.y + y; else return y; } private Vertex getVertex(int x, int y) { Vertex v = new Vertex(x, y); if ((vertices.keySet()).contains(v)) { // System.out.println("using existing vertex " + v); return (Vertex) vertices.get(v); } else { vertices.put(v, v); return v; } } public void computeInchCoordinates() { for (Vertex vertex : vertices.values()) { vertex.computeInchCoordinates(xScale, yScale, metric); } } public void setCenter(String i, String j) { // System.out.println("setCenter(" + i + ", " + j + ")"); if (i != null) ci = parseX(i); if (j != null) cj = parseY(j); } public void addMacro(final Macro macro) { // System.out.println("addMacro(" + macro + ")"); macros.put(macro.getName(), macro); } public Macro getMacro(String name) { return (Macro) macros.get(name); } public Collection getActions() { return actions; } public void addAperture(Aperture aperture) { // System.out.println("addAperture(" + aperture + ")"); apertures.put(new Integer(aperture.getNumber()), aperture); } public boolean askContinue(int line, int seq) { return ui.askContinue(line, seq); } private Map macros = new LinkedHashMap(); private Map apertures = new LinkedHashMap(); private Map vertices = new LinkedHashMap(); private List actions = new LinkedList(); private int mode = DEF_MODE; private Aperture aperture = DEF_APERTURE; private int exposure = DEF_EXPOSURE; private Vertex p = getVertex(DEF_X, DEF_Y); private int ci = DEF_I; private int cj = DEF_J; private int xScale = DEF_XSCALE; private int yScale = DEF_YSCALE; private boolean incremental = DEF_INCREMENTAL; private boolean ignoreTrailing = DEF_IGNORETRAILING; private boolean metric = DEF_METRIC; private boolean arc360 = DEF_ARC360; private int xBefore = DEF_X_BEFORE; private int xAfter = DEF_X_AFTER; private int xWidth = DEF_X_BEFORE + DEF_X_AFTER; private int yBefore = DEF_Y_BEFORE; private int yAfter = DEF_Y_AFTER; private int yWidth = DEF_Y_BEFORE + DEF_Y_AFTER; private SimulatorUI ui; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/SimulatorException.java000066400000000000000000000021361147500217100313050ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; public class SimulatorException extends RuntimeException { private static final String cvsid = "$Id: SimulatorException.java,v 1.1.1.1 2004/06/24 05:46:01 vona Exp $"; public SimulatorException(String message) { super(message); } } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/SimulatorUI.java000066400000000000000000000016731147500217100276710ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; public interface SimulatorUI { public boolean askContinue(int line, int seq); } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/StandardAperture.java000066400000000000000000000026741147500217100307260ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; public abstract class StandardAperture extends Aperture { private static final String cvsid = "$Id: StandardAperture.java,v 1.1.1.1 2004/06/24 05:46:01 vona Exp $"; public StandardAperture(int number, double holeX, double holeY) { super(number); this.holeX = holeX; this.holeY = holeY; } public StandardAperture(int number, double hole) { super(number); this.holeX = hole; this.holeY = -1; } public StandardAperture(int number) { super(number); this.holeX = -1; this.holeY = -1; } protected double holeX; protected double holeY; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/Stroke.java000066400000000000000000000036371147500217100267250ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; public abstract class Stroke extends Action { private static final String cvsid = "$Id: Stroke.java,v 1.2 2004/06/30 17:26:29 vona Exp $"; public Stroke(Aperture aperture, Vertex start, Vertex end) { this.aperture = aperture; this.start = start; this.end = end; start.addIncidentAction(this); end.addIncidentAction(this); // System.out.println(toString()); } public Vertex getStart() { return start; } public Vertex getEnd() { return end; } public abstract String toString(); public abstract double getLength(); public abstract double getStartForwardDirection(); public abstract double getStartReverseDirection(); public abstract double getEndForwardDirection(); public abstract double getEndReverseDirection(); protected void offsetChanged() { aperture.setOffset(offset); } protected void inverseChanged() { aperture.setInverse(inverse); } protected Aperture aperture; protected Vertex start; protected Vertex end; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/ThermalInstance.java000066400000000000000000000075461147500217100305420ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import java.util.*; import visolate.misc.*; import com.sun.j3d.utils.geometry.*; import javax.media.j3d.*; public class ThermalInstance extends PrimitiveInstance { private static final String cvsid = "$Id: ThermalInstance.java,v 1.3 2004/07/06 23:32:51 vona Exp $"; public ThermalInstance(double x, double y, double od, double id, double xHairThickness, double rotation) { this.x = x; this.y = y; this.od = od; this.id = id; this.xHairThickness = xHairThickness; this.rotation = rotation; } protected void makeBounds() { double o = getOD(); bounds = new Rect(x-o/2, y-o/2, o, o); } private double getOD() { return Math.max(0.0, od + 2*signedOffset); } private double getID() { return Math.max(0.0, id - 2*signedOffset); } protected void makeGeometries() { geometries = new LinkedList(); for (int i = 0; i < 4; i++) geometries.addAll(makeArcGeometries(x, y, getOD()/2, getID()/2, Math.max(0.0, xHairThickness - 2*signedOffset), rotation*(Math.PI/180) + i*(Math.PI/2))); } public static Collection makeArcGeometries(double xCenter, double yCenter, double ro, double ri, double gapWidth, double rotation) { Collection geometries = new LinkedList(); int segments = CircleAperture.SEGMENTS; float[] coords = new float[2*3*(segments + 1)]; double angleo = Util.getOffsetAngle(ro, gapWidth/2); double segmento = (Math.PI/2 - 2*angleo)/segments; double anglei = Util.getOffsetAngle(ri, gapWidth/2); double segmenti = -(Math.PI/2 - 2*anglei)/segments; anglei = Math.PI/2 - anglei; angleo += rotation; anglei += rotation; double x, y; double angle = angleo; double rad = ro; double segment = segmento; int i = 0; for (int k = 0; k < 2; k++) { for (int j = 0; j <= segments; j++) { x = rad*Math.cos(angle); y = rad*Math.sin(angle); coords[i++] = (float) (x+xCenter); coords[i++] = (float) (y+yCenter); coords[i++] = 0.0f; angle += segment; } angle = anglei; rad = ri; segment = segmenti; } GeometryInfo gi = new GeometryInfo(GeometryInfo.POLYGON_ARRAY); gi.setCoordinates(coords); gi.setStripCounts(new int[] {2*(segments + 1)}); geometries.add((TriangleArray) gi.getGeometryArray(true, false, false)); return geometries; } private double x, y; private double od, id; private double xHairThickness; private double rotation; } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/ThermalPrimitive.java000066400000000000000000000033061147500217100307340ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import java.util.*; public class ThermalPrimitive extends MacroPrimitive { private static final String cvsid = "$Id: ThermalPrimitive.java,v 1.1.1.1 2004/06/24 05:46:01 vona Exp $"; public ThermalPrimitive(final List exprs) { super(exprs); } protected PrimitiveInstance getInstanceInternal(final List actuals) { int i = 0; double x = getParam(i++, actuals); double y = getParam(i++, actuals); double od = getParam(i++, actuals); double id = getParam(i++, actuals); double xHairThickness = getParam(i++, actuals); double rotation = getParam(i++, actuals); return new ThermalInstance(x, y, od, id, xHairThickness, rotation); } protected String getName() { return "thermal"; } } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/Vertex.java000066400000000000000000000073601147500217100267300ustar00rootroot00000000000000/** * "Visolate" -- compute (Voronoi) PCB isolation routing toolpaths * * Copyright (C) 2004 Marsette A. Vona, III * * 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 2 * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. **/ package visolate.simulator; import javax.vecmath.*; import visolate.model.*; import java.util.*; public class Vertex { private static final String cvsid = "$Id: Vertex.java,v 1.1.1.1 2004/06/24 05:46:01 vona Exp $"; public static final double MM_TO_IN = 1.0/25.4; public Vertex(int x, int y) { this.x = x; this.y = y; hashCode = x^(y*31); // System.out.println(toString()); } public void addIncidentAction(Action action) { incidentActions.add(action); } public Set getIncidentActions() { return incidentActions; } public int hashCode() { return hashCode; } public boolean equals(Object object) { if (!(object instanceof Vertex)) return false; Vertex other = (Vertex) object; return (x == other.x) && (y == other.y); } public String toString() { if (point2f != null) return "(" + point2f.x + ", " + point2f.y + ")"; else return "(" + x + ", " + y + ")"; } public String toStringInches() { return "(" + point2f.x + ", " + point2f.y + ")"; } public Point2f getInchCoordinates() { return point2f; } public void computeInchCoordinates(int xScale, int yScale, boolean metric) { double xi = ((double) x)/((double) xScale); double yi = ((double) y)/((double) yScale); if (metric) { xi *= MM_TO_IN; yi *= MM_TO_IN; } point2f = new Point2f((float) xi, (float) yi); // System.out.println("(" + x + ", " + y + ")->(" + point2f.x + ", " + point2f.y + ")"); } public void addOutgoingHalfEdge(HalfEdge e) { outgoingHalfEdges.add(e); } public void removeOutgoingHalfEdge(HalfEdge e) { outgoingHalfEdges.remove(e); } public HalfEdge getNextOutgoingHalfEdge(HalfEdge incomingHalfEdge) { HalfEdge next = null; if (outgoingHalfEdges.size() == 1) { next = (HalfEdge) (outgoingHalfEdges.iterator()).next(); } else { double min = Double.POSITIVE_INFINITY; // int dbg = 0; for ( HalfEdge he : outgoingHalfEdges) { //only want to double back when that's the only way out, and would have //caught that above if (he.getStroke() == incomingHalfEdge.getStroke()) { // assert ++dbg <= 1; continue; } double angle = incomingHalfEdge.angleTo(he); if (angle < min) { min = angle; next = he; } } //HACK apparrently it's possible to have (only) k > 1 outgoing half //edges which all have the same stroke as incomingHalfEdges if (next == null) next = (HalfEdge) (outgoingHalfEdges.iterator()).next(); } outgoingHalfEdges.remove(next); return next; } public int x; public int y; private Point2f point2f; private int hashCode; private Set incidentActions = new LinkedHashSet(); private Collection outgoingHalfEdges = new LinkedHashSet(); } visolate-2.1.6~svn8+dfsg1.orig/visolate/src/visolate/simulator/makefile.old000066400000000000000000000650421147500217100270660ustar00rootroot00000000000000# Vona's super-ninja makefile # # *** DO NOT EDIT THIS FILE EXCEPT IN THE PROJECT HOME DIRECTORY *** # # This makefile is auto-generated by "make makefiles" in the parent package # # You can (and should) edit makefile.project, which is included below, to # specify project-specific settings # # You can edit makefile.package, which is included below, to specify # package-specific targets and variables # # Copyright (C) 2004 Marsette A. Vona, III # # 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 2 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., 59 # Temple Place - Suite 330, Boston, MA 02111-1307, USA. # $Id: makefile 15 2008-01-23 21:56:45Z vona $ # Relative path to the directory containing the root package for the project. # For makefile in every directory other than $(PROJECT_HOME) this is # automatically set by "make makefiles" PROJECT_HOME = ../. -include $(PROJECT_HOME)/makefile.project ifndef BASE_PACKAGE BASE_PACKAGE := $(notdir $(shell $(CD) $(PROJECT_HOME) && pwd)) endif ifndef APPNAME APPNAME := $(BASE_PACKAGE) endif # The (full) name of this package. For makefile in every directory other than # $(PROJECT_HOME) this is automatically set by "make makefiles" PACKAGE = $(BASE_PACKAGE).simulator # the default target default: package #figure out arch SYSTEM = $(shell uname -s | tr " " "_") MACHINE = $(shell uname -m | tr " " "_") ARCH := $(SYSTEM)_$(MACHINE) #linux: Linux_i686 #OS X: Darwin_Power_Macintosh #cygwin: CYGWIN-5.1_NT # misc macros # these let $(COMMA) and $(SPACE) be lone arguments to make function calls COMMA := , EMPTY := SPACE := $(EMPTY) $(EMPTY) # whitespace regex WS = [ \t]* ifneq ($(findstring CYGWIN,$(SYSTEM)),CYGWIN) # make cd .. follow the Physical directory structure on Unix CD = cd -P else CD = cd # always use bash on cygwin, sh doesn't have pushd, but bash slows things down SHELL = `which bash` endif # tool finding functions #locate the target of a symlink # #works even if the starting point is not a symlink locate-target = $(shell f="$(1)"; while [ -L "$$f" ]; do f=`ls -l "$$f" | awk '{print $$NF}'`; done; echo "$$f") #try hard to find a command # #first arg is command name # #second arg is expected directory # #if cmd executable in directory, that is returned # #else if which knows where the command is, that is returned # #else empty string is returned locate-cmd = $(shell if [ -x "$(2)/$(1)" ]; then echo "$(2)/$(1)"; else cmd="$(shell which "$(1)" 2>/dev/null || true)" && if [ -x "$$cmd" ] ; then echo "$$cmd"; else echo ""; fi; fi) #get the parent directory name # #better than the make builtin function because this also works on a directory dirname = $(shell if [ "$(1)"x != x -a -e "$(1)" ] ; then dirname "$(1)"; else echo ""; fi) #default a dir # #first arg is the desired dir # #second is the default dir # #returns first arg iff it's a directory, else second arg default-dir = $(shell if [ ! -d "$(1)" ]; then echo "$(2)"; else echo "$(1)"; fi) # find tool directories ifndef TOOLS_HOME TOOLS_HOME := $(call default-dir,$(PROJECT_TOOLS_HOME),/usr) endif BIN := $(call default-dir,$(TOOLS_HOME)/bin/$(ARCH),/usr/bin) SCRIPTS := $(call default-dir,$(TOOLS_HOME)/scripts,$(BIN)) JDK_BASE := $(TOOLS_HOME)/java/$(ARCH) JDK_VERSION := newest JDK_HOME := $(call dirname,$(call dirname,$(call locate-target,$(call locate-cmd,javac,$(JDK_BASE)/$(JDK_VERSION)/bin)))) JDK_EXT := $(JDK_HOME)/jre/lib/ext ifeq ($(SYSTEM),Darwin) JDK_EXT := /Library/Java/Extensions endif TOOLS_EXT := $(TOOLS_HOME)/java/indep/lib # find pure java extension jars in the tools java/indep/lib dir if present, else in jre/lib/ext # NOTE the classes will come in on different classloaders in the two cases, which can lead to subtle CNFEs EXT_DIR := $(call default-dir,$(TOOLS_EXT),$(JDK_EXT)) # JDK executables JAVAC := $(call locate-cmd,javac,$(JDK_HOME)/bin) JAVA := $(call locate-cmd,java,$(JDK_HOME)/bin) JAVADOC := $(call locate-cmd,javadoc,$(JDK_HOME)/bin) JAR := $(call locate-cmd,jar,$(JDK_HOME)/bin) KEYTOOL := $(call locate-cmd,keytool,$(JDK_HOME)/bin) JARSIGNER := $(call locate-cmd,jarsigner,$(JDK_HOME)/bin) RMIC := $(call locate-cmd,rmic,$(JDK_HOME)/bin) #other executables JAVACC := $(call locate-cmd,javacc,$(BIN)) RSYNC := $(call locate-cmd,rsync,$(BIN)) WWWIMAGESIZE := $(call locate-cmd,wwwimagesize,$(SCRIPTS)) # CompileServer stuff # the CompileServer binary directory CS_BIN := $(call dirname,$(call locate-target,$(call locate-cmd,javac_submit,$(BIN)))) # the CompileServer scripts directory CS_SCRIPTS := $(call dirname,$(call locate-target,$(call locate-cmd,CompileServer-submit,$(SCRIPTS)))) # define NO_COMPILE_SERVER to disable compile server ifndef NO_COMPILE_SERVER CS_ENSURE := $(call locate-cmd,CompileServer-ensure-running,$(CS_SCRIPTS)) CS_SUBMIT := $(call locate-cmd,CompileServer-submit,$(CS_SCRIPTS)) ifdef CS_ENSURE ifeq ($(findstring OK,$(shell $(CS_ENSURE) nostart)),OK) ifdef CS_SUBMIT #ok CompileServer is all good! JAVAC := $(CS_SUBMIT) USING_COMPILE_SERVER := 1 endif endif #OK endif #CS_ENSURE endif #NO_COMPILE_SERVER # rmi stuff # generate commands to run RMIWrap # # first arg is the (simple) name of the API interface # # second arg is the (simple) name of the implementation class run-rmiwrap = if [ ! -f $(1)Remote.java -o ! -f $(2)Server.java -o ! -f $(2)Client.java -o \( $(1).java -nt $(1)Remote.java \) -o \( $(2).java -nt $(2)Client.java \) -o \( $(2).java -nt $(2)Server.java \) ]; then $(JAVA) $(RUN_JAVA_FLAGS) vona.rmi.rmiwrap.RMIWrap $(PACKAGE).$(1) $(PACKAGE).$(2) && $(JAVAC) $(JAVAC_FLAGS) *.java; fi # generate commands to run rmic # # first arg is the (simple) name of the remote class for which to generate a # stub RMIC_JRMP_VERSION = 1.1 run-rmic = if [ ! -f $(1)_Stub.class -o $(1).class -nt $(1)_Stub.class ]; then $(RMIC) -v$(RMIC_JRMP_VERSION) -d $(PROJECT_HOME)/.. $(CLASSPATH_FLAG) $(PACKAGE).$(1); fi # rsync stuff # flags for rsync # # excludes the usual suspects RSYNC_FLAGS := -rv --progress $(DBG) --copy-links --exclude "**~" --exclude ".\#**" --exclude CVS --exclude .svn --exclude "*.tmp" # rsync first arg to second arg, with cvs exclude rsync = $(RSYNC) $(RSYNC_FLAGS) --cvs-exclude $(1) $(2) # rsync a subproject # # first arg is filename extension to include (starting with ".", or empty for # all) # # second arg is the name of a subproject (i.e. the name of the base package of # the subproject). If it ends in "." then it is copied non-recursively, else # it is copied recursively. # # third arg is rsync dest, if not absolute then relative to $(PROJECT_HOME)/.. rsync-subproject = pushd $(PROJECT_HOME)/.. && $(RSYNC) $(RSYNC_FLAGS) --include "*/" --exclude "/$(BASE_PACKAGE)/$(JAVADOC_DIR_NAME)/**" --include $(if $(filter ".","$(suffix $(2))"),"/$(call package-to-path,$(basename $(2)))/*$(1)","/$(call package-to-path,$(2))/**$(1)") --exclude "*" $(BASE_PACKAGE) $(3) && popd # this should have dynamic binding so that makefile.package can override # JARFILE JAR_DIR = .$(JARFILE).tmp # make a jar # # does not include hidden files (any file with name beginning ".") # # arg 1: "true" to include javadoc tree, "false" otherwise # arg 2: the list of external jars (none if empty) # arg 3: the name of the jarfile # arg 4: the list of filename extensions to include (each beginning with ".", empty to include all) # arg 5: list of extra files to include (pathnames relative to parent of base package) # arg 6: includes only files in these subproject packages make-jar = \ $(RM) $(3) && \ $(RM) -r $(JAR_DIR) && \ mkdir $(JAR_DIR) && \ if [ $(1) ] && [ -d "$(JAVADOC_DIR)" ]; then $(call rsync,$(JAVADOC_DIR),$(JAR_DIR)); fi && \ if [ "$(4)foo" == "foo" ]; then \ $(foreach P,$(6),$(call rsync-subproject,,$(P),$(call package-to-path,$(PACKAGE))/$(JAR_DIR)) && ) true; \ else $(foreach E,$(4),$(foreach P,$(6),$(call rsync-subproject,$(E),$(P),$(call package-to-path,$(PACKAGE))/$(JAR_DIR)) && )) true; fi && \ $(foreach F,$(addprefix $(EXT_DIR)/,$(2)),cp $(F) $(JAR_DIR) &&) true && \ $(foreach F,$(5),cp $(addprefix $(PROJECT_HOME)/../,$(F)) $(JAR_DIR)/$(dir $(F)) &&) true && \ $(CD) $(JAR_DIR) && \ $(foreach F,$(2),$(JAR) xvf $(F) && rm $(F) &&) true && \ rm -rf META-INF && \ if [ "$(4)foo" == "foo" ]; then \ $(JAR) cvf $(3) `find . -not -type d -a -not -name ".*"` $(5); \ else $(JAR) cvf $(3) `find . -not -type d -a -not -name ".*" -a "(" -false $(foreach E,$(4),-o -name "*$(E)" ) ")"` $(5); fi && \ if [ -f ../$(JAR_MF) ]; then $(JAR) ufm $(3) ../$(JAR_MF); fi && \ if [ -f ../$(JAR_CRT) ]; then $(JARSIGNER) $(3) $(JARKEY); fi && \ mv $(3) .. && \ $(CD) .. && \ rm -rf $(JAR_DIR) # template file locations TEMPLATE_DIR = $(PROJECT_HOME)/templates JAVA_TEMPLATE = $(TEMPLATE_DIR)/Template.java EXCEPTION_TEMPLATE = $(TEMPLATE_DIR)/Exception.java PACKAGE_TEMPLATE = $(TEMPLATE_DIR)/package.html MAKEFILE_PACKAGE_TEMPLATE = $(TEMPLATE_DIR)/makefile.package template-m4-common = m4 -P "-DYEAR=`date +%Y`" "-DPACKAGE=$(PACKAGE)" template-m4-java = m4 -P "-DYEAR=`date +%Y`" "-DPACKAGE=$(PACKAGE)" "-DCLASS=$(notdir $(basename $(1)))" $(JAVA_TEMPLATE) > $(basename $(1)).java # compute short package name from fullname PACKAGE_NAME = $(subst .,,$(suffix .$(PACKAGE))) # compute project name (root package name) from package fullname PROJECT = $(firstword $(subst ., ,$(PACKAGE))) # heap size flag MEMORY_FLAG = -Xmx$(TOTAL_HEAP_SIZE) # compute the package path from the package full name # $(PROJECT_HOME)/../$(PACKAGE_PATH) is a path to this package PACKAGE_PATH = $(call package-to-path,$(PACKAGE)) # command to run make without generating any extraneous output MAKE_SILENT = $(MAKE) --silent --no-print-directory # is this the project root package? ifeq ($(PROJECT_HOME),.) ROOT_PACKAGE = yes endif # flag useful for various tools # put the parent of project home first on the classpath # that way if there are built checkouts of the source trees for any EXT_JARS # then we'll pick up those classes directly from there NINJA_CLASSPATH := $(PROJECT_HOME)/.. ifdef USING_COMPILE_SERVER NINJA_CLASSPATH := $(shell pwd)/$(NINJA_CLASSPATH) endif # now put each EXT_JAR on the classpath, in order, but only if we're finding # them in an EXT_DIR which is not the JDK installed extensions dir ifneq ($(EXT_DIR),$(JDK_EXT)) NINJA_CLASSPATH := $(subst $(SPACE),,$(NINJA_CLASSPATH)$(foreach JAR,$(EXT_JARS),:$(EXT_DIR)/$(JAR))) endif # next add the JDK tools jar to the classpath # in particular, for use by CompileServer NINJA_CLASSPATH := $(NINJA_CLASSPATH):$(JDK_HOME)/lib/tools.jar # finally append the user's externally defined CLASSPATH, if any ifdef CLASSPATH MAKE_CLASSPATH := $(NINJA_CLASSPATH):$(CLASSPATH) else #trailing colon breaks java under Windows MAKE_CLASSPATH := $(NINJA_CLASSPATH) endif ifeq ($(findstring CYGWIN,$(SYSTEM)),CYGWIN) MAKE_CLASSPATH := `cygpath -w -p "$(MAKE_CLASSPATH)"` endif CLASSPATH_FLAG = -classpath "$(MAKE_CLASSPATH)" DEPRECATION_FLAG = -deprecation # source the package-specific makefile -include makefile.package # always exclude these subdirs EXCLUDE_SUBDIRS += . .. CVS .svn # figure out our subdirs PACKAGE_SUBDIRS = $(filter-out $(EXCLUDE_SUBDIRS),$(notdir $(shell find . -maxdepth 1 -type d -not -name ".*.tmp" -a -not -name "javadoc-*"))) # always exclude these source files EXCLUDE_SOURCE += # figure out source files PACKAGE_SOURCE = $(filter-out $(wildcard $(EXCLUDE_SOURCE)),$(wildcard *.java)) PACKAGE_HTML_SOURCE = $(filter-out $(wildcard $(EXCLUDE_SOURCE)),$(wildcard *.phtml *.m4)) # ALL source SOURCE = \ $(wildcard *.java) \ $(wildcard *.scm) \ $(wildcard *.c *.cc *.h *.hh) \ $(wildcard *.mf) \ $(wildcard *.jj) \ $(wildcard *.xsd *.xml *.spp) \ $(wildcard *.txt *.tex *.html *.htm *.css README) \ $(wildcard *.properties *.conf *.xcf *.gif *.jpg *.png *.bmp *.ico) \ $(wildcard *.lws *.lwo *.wrl) \ $(wildcard *.sh *.csh *.bat *.iss) \ $(wildcard *.phtml *.m4) \ $(wildcard *.policy) \ package.html makefile.package ifdef ROOT_PACKAGE SOURCE += makefile makefile.project endif # compile-time flags JAVAC_FLAGS += $(DEPRECATION_FLAG) $(CLASSPATH_FLAG) -source $(SOURCE_VERSION) -target $(TARGET_VERSION) $(JAVAC_OPTIONS) # runtime flags RUN_JAVA_FLAGS += $(CLASSPATH_FLAG) $(MEMORY_FLAG) $(WORKAROUND_FLAGS) $(JAVA_OPTIONS) -ea # javadoc flags JAVADOC_FLAGS += $(CLASSPATH_FLAG) -source $(JAVADOC_SOURCE_VERSION) -private -use -author -doctitle $(APPNAME) `if [ -e overview.html ]; then echo -overview overview.html; else echo ""; fi` # subpackage makefiles SUBPACKAGE_MAKEFILES = $(addsuffix /makefile,$(PACKAGE_SUBDIRS)) # HTML stuff .SUFFIXES: .m4 .phtml .html WWWROOT = $(HOME)/www html-m4 = m4 -P "-DBUILD_DATE=`date`" "-DYEAR=`date +%Y`" "-I$(WWWROOT)/include" $(1) > $(2) html-cpp = gcc -E -P -traditional "-DBUILD_DATE=`date`" "-DYEAR=`date +%Y`" "-I$(WWWROOT)/include" - < $(1) > $(2) # function to generate a javadoc command line # # javadoc will be deposited in $(JAVADOC_DIR) # # first arg is list of base packages. Javadoc will be built for all # subpackages of the base packages. javadoc = $(JAVADOC) $(JAVADOC_FLAGS) -d $(JAVADOC_DIR) $(foreach P,$(1), -subpackages $(P)) # function to make a target recursively # first argument is target to make # second argument is "true" to continue on fail, "false" to stop on fail recursively-make = $(foreach DIR,$(PACKAGE_SUBDIRS),[ ! -d $(DIR) ] || pushd $(DIR) > /dev/null && ( $(MAKE) $(1) || $(2) ) && popd > /dev/null && ) true # function to make something from $(PROJECT_HOME) make-from-project-home = \ @echo making $(1) from $(PROJECT_HOME); \ $(CD) $(PROJECT_HOME) && $(MAKE) $(1) # function to convert a package name to a path package-to-path = $(subst .,/,$(1)) # function to extract the package part of a full class name (not including # the trailing .class) package-part = \ $(basename $(1)) # function to extract the class part of a full class name (not including the # trailing .class) class-part = \ $(subst .,,$(suffix $(1))) # use this target as a prereq to force another target .PHONY: FORCE FORCE: # pattern rules # initialize a new class file %.java-template: $(JAVA_TEMPLATE) if [ ! -f ./$(basename $@).java ] || [ ! -s ./$(basename $@).java ]; then $(call template-m4-java,$@); else echo ./$(basename $@).java exists and is non-empty, not overwriting; fi .PHONY: java-templates java-templates: $(foreach F,$(shell find . -maxdepth 1 -size 0 -name "*.java"),$(call template-m4-java,$F); ) # initialize a new Exception class file %.java-exception-template: $(EXCEPTION_TEMPLATE) if [ ! -f ./$(basename $@).java ]; then cp $(EXCEPTION_TEMPLATE) ./$(basename $@).java; else echo ./$(basename $@).java exists, not overwriting; fi # initialize a new package.html file .PHONY: package.html-template package.html-template: $(PACKAGE_TEMPLATE) if [ ! -f package.html ]; then cp $(PACKAGE_TEMPLATE) ./package.html; else echo ./package.html exists, not overwriting; fi # initialize a new makefile.package file .PHONY: makefile.package-template makefile.package-template: $(MAKEFILE_PACKAGE_TEMPLATE) if [ ! -f makefile.package ]; then cp $(MAKEFILE_PACKAGE_TEMPLATE) ./makefile.package; else echo ./makefile.package exists, not overwriting; fi # make html from m4 %.html: %.m4 $(call html-m4,$<,$@) if [ -x "$(WWWIMAGESIZE)" ]; then $(WWWIMAGESIZE) -MakeBackup no $@; fi # make html from phtml by sending it through the C pre-processor %.html: %.phtml $(call html-cpp,$<,$@) if [ -x "$(WWWIMAGESIZE)" ]; then $(WWWIMAGESIZE) -MakeBackup no $@; fi # build a .class file from a .java file ifeq ($(findstring CYGWIN,$(SYSTEM)),CYGWIN) #fix paths on cygwin. ARGH... ifdef USING_COMPILE_SERVER %.class: %.java $(JAVAC) $(JAVAC_FLAGS) "`cygpath -w "$(addprefix $(shell pwd)/,$<)"`" else %.class: %.java $(JAVAC) $(JAVAC_FLAGS) $< endif else # not on cygwin. Phew. %.class: %.java $(JAVAC) $(JAVAC_FLAGS) $< endif # build Java source files from a .jj grammar file %.java: %.jj $(JAVACC) $< # run a class in a specific package $(PROJECT).%.run: $(if BUILD_BEFORE_RUN,$(PROJECT).%.class,) $(JAVA) $(RUN_JAVA_FLAGS) $(basename $@) # run a class in the current package with a main() function directly %.run: $(if BUILD_BEFORE_RUN,%.class,) $(JAVA) $(RUN_JAVA_FLAGS) $(PACKAGE).$(basename $@) # run a class in appletviewer (specify html filename without path or extension) %.appletviewer: $(JDK_HOME)/bin/appletviewer $(basename $@).html # build a class in a specific package $(PROJECT).%.class: $(CD) $(PROJECT_HOME)/../$(call package-to-path,$(call package-part,$(basename $@))) && $(MAKE) $(call class-part,$(basename $@)).class # build a specific package $(PROJECT).%.package-make: @echo making package $@ $(CD) $(PROJECT_HOME)/../$(call package-to-path,$(basename $@)) && $(MAKE) package # recursive build of the base package is a project build # note the semicolon which makes this an "empty command"!! # without it the %.recursive pattern would get called after this runs # resulting in an infinite loop!! $(PROJECT).package-make.recursive: project ; # build a specific package and all descendant packages $(PROJECT).%.package-make.recursive: @echo making package $@ and all descendant packages $(CD) $(PROJECT_HOME)/../$(call package-to-path,$(basename $(basename $@))) && $(MAKE) package.recursive # trick make into building the base package when asked # if we don't do this then a spurious implicit rule gets invoked because the # base package has no .suffix $(PROJECT).package-make: @echo making base package $(CD) $(PROJECT_HOME) && $(MAKE) package # recursively make something %.recursive: # @echo recursively making $(basename $@) $(MAKE) $(basename $@) $(call recursively-make,$@,true) # fun targets .PHONY: love love: @echo not war .PHONY: pull-plug pull-plug: @echo My mind is going. I can FEEL it. .PHONY: open-the-pod-bay-doors-hal open-the-pod-bay-doors-hal: @echo I\'m sorry `finger \`whoami\` | sed -e '2,$$d' -e '1s/.*:.*:[ ]*\([^ ]*\).*/\1/'`, I\'m afraid I can\'t do that. # global targets # utility targets .PHONY: show-exclude-source show-exclude-source: @echo $(EXCLUDE_SOURCE) .PHONY: show-exclude-subdirs show-exclude-subdirs: @echo $(EXCLUDE_SUBDIRS) .PHONY: show-package show-package: @echo $(PACKAGE) .PHONY: show-project-home show-project-home: @echo $(PROJECT_HOME) .PHONY: show-classpath show-classpath: @echo $(MAKE_CLASSPATH) .PHONY: show-jdk-home show-jdk-home: @echo $(JDK_HOME) .PHONY: show-jdk-ext show-jdk-ext: @echo $(JDK_EXT) .PHONY: show-tools-ext show-tools-ext: @echo $(TOOLS_EXT) .PHONY: show-ext-dir show-ext-dir: @echo $(EXT_DIR) .PHONY: show-java show-java: @echo $(JAVA) .PHONY: show-run-java-flags show-run-java-flags: @echo $(RUN_JAVA_FLAGS) .PHONY: show-run-java-with-flags show-run-java-with-flags: @echo $(JAVA) $(RUN_JAVA_FLAGS) .PHONY: show-run-java-with-flags-and-package show-run-java-with-flags-and-package: @echo $(JAVA) $(RUN_JAVA_FLAGS) $(PACKAGE) .PHONY: show-bin show-bin: @echo $(BIN) .PHONY: show-cs-bin show-cs-bin: @echo $(CS_BIN) .PHONY: show-scripts show-scripts: @echo $(SCRIPTS) .PHONY: show-cs-scripts show-cs-scripts: @echo $(CS_SCRIPTS) .PHONY: show-settings show-settings: @echo Make settings: @echo APPNAME: $(APPNAME) @echo BASE_PACKAGE: $(BASE_PACKAGE) @echo ARCH: $(ARCH) @echo TOOLS_HOME: $(TOOLS_HOME) @echo SCRIPTS: $(SCRIPTS) @echo CS_SCRIPTS: $(CS_SCRIPTS) @echo CS_BIN: $(CS_BIN) @echo CS_ENSURE: $(CS_ENSURE) @echo CS_SUBMIT: $(CS_SUBMIT) @echo JDK_BASE: $(JDK_BASE) @echo JDK_HOME: $(JDK_HOME) @echo JDK_EXT: $(JDK_EXT) @echo TOOLS_EXT: $(TOOLS_EXT) @echo EXT_DIR: $(EXT_DIR) @echo JDK_VERSION: $(JDK_VERSION) @echo SOURCE_VERSION: $(SOURCE_VERSION) @echo TARGET_VERSION: $(TARGET_VERSION) @echo JAVAC: $(JAVAC) @echo JAVA: $(JAVA) @echo JAVADOC: $(JAVADOC) @echo JAVACC: $(JAVACC) @echo JAR: $(JAR) @echo NO_COMPILE_SERVER: "$(NO_COMPILE_SERVER)" @echo USING_COMPILE_SERVER: "$(USING_COMPILE_SERVER)" @echo SHELL: $(SHELL) @echo CD: $(CD) @echo PROJECT: $(PROJECT) @echo PROJECT_HOME: $(PROJECT_HOME) ifdef ROOT_PACKAGE @echo this is the root package else @echo this is not the root package endif @echo PACKAGE: $(PACKAGE) @echo PACKAGE_PATH: '$(PACKAGE_PATH)' @echo PACKAGE_NAME: $(PACKAGE_NAME) @echo EXCLUDE_SUBDIRS: $(EXCLUDE_SUBDIRS) @echo PACKAGE_SUBDIRS: $(PACKAGE_SUBDIRS) @echo EXCLUDE_SOURCE: $(EXCLUDE_SOURCE) @echo PACKAGE_SOURCE: $(PACKAGE_SOURCE) @echo PACKAGE_HTML_SOURCE: $(PACKAGE_HTML_SOURCE) @echo SOURCE: $(SOURCE) @echo SUBPROJECT_PACKAGES: $(SUBPROJECT_PACKAGES) @echo JAVAC_FLAGS: '$(JAVAC_FLAGS)' @echo JAVADOC_FLAGS: '$(JAVADOC_FLAGS)' @echo JAVADOC_DIR: $(JAVADOC_DIR) @echo JAR_DIR: $(JAR_DIR) @echo JAR_MF: $(JAR_MF) @echo JARKEY: $(JARKEY) @echo JAR_CRT: $(JAR_CRT) @echo EXT_JARS: $(EXT_JARS) @echo MAKE_CLASSPATH: '$(MAKE_CLASSPATH)' @echo SUBPACKAGE_MAKEFILES: $(SUBPACKAGE_MAKEFILES) @echo PUBLISH_DEST: $(PUBLISH_DEST) # package targets # make the current package .PHONY: package package: $(EXTRA_PACKAGE_DEPS) $(if $(NO_SOURCE_GEN),,package-source-gen) package-javacc-make $(addsuffix .class,$(basename $(PACKAGE_SOURCE))) $(addsuffix .html,$(basename $(PACKAGE_HTML_SOURCE))) $(EXTRA_PACKAGE_CMDS) # make javacc in the current package .PHONY: packge-javacc-make package-javacc-make: $(addsuffix .class,$(basename $(wildcard *.jj))) # make the makefile in the current package ifndef ROOT_PACKAGE makefile: $(PROJECT_HOME)/makefile @$(CD) .. && $(MAKE) $(PACKAGE_NAME)/makefile else makefile: FORCE endif .PHONY: clean clean: $(EXTRA_CLEAN_DEPS) @echo removing all .class files in this package $(RM) *.class .PHONY: c-clean c-clean: @echo removing all .o files in this package $(RM) *.o .PHONY: javacc-clean javacc-clean: @echo removing javacc-generated files $(RM) `ls *.java | xargs grep -l "Generated By:JavaCC"` .PHONY: rmiwrap-clean rmiwrap-clean: @echo removing RMIWrap-generated files $(RM) `ls *.java | xargs grep -l "generated by RMIWrap"` .PHONY: html-clean html-clean: @echo removing all generated html $(RM) $(addsuffix .html,$(basename $(PACKAGE_HTML_SOURCE))) .PHONY: jar-clean jar-clean: $(RM) $(JARFILE) $(JARFILE_LITE) $(JARFILE_XLITE) .PHONY: javadoc-clean javadoc-clean: $(RM) -r $(JAVADOC_DIR) .PHONY: realclean realclean: $(EXTRA_REALCLEAN_DEPS) clean rmiwrap-clean javacc-clean html-clean jar-clean javadoc-clean if [ -f core ]; then $(RM) core; fi .PHONY: package-javacc-gen package-javacc-gen: $(addsuffix .java,$(basename $(wildcard *.jj))) .PHONY: package-source-gen package-source-gen: package-javacc-gen # project targets .PHONY: project-announce project-announce: @echo making project .PHONY: project project: project-announce $(if $(NO_SOURCE_GEN),,project-source-gen) $(call make-from-project-home,package.recursive) .PHONY: project-javacc-gen project-javacc-gen: makefiles $(call make-from-project-home,package-javacc-gen.recursive) .PHONY: project-source-gen project-source-gen: makefiles $(call make-from-project-home,package-source-gen.recursive) .PHONY: project-javadoc project-javadoc: $(call make-from-project-home,subproject-javadoc) .PHONY: subproject-javadoc subproject-javadoc: if [ "$(SUBPROJECT_PACKAGES)" ]; then $(call javadoc,$(SUBPROJECT_PACKAGES)); fi .PHONY: project-clean project-clean: $(call make-from-project-home,clean.recursive) .PHONY: project-realclean project-realclean: $(call make-from-project-home,realclean.recursive) $(SUBPACKAGE_MAKEFILES): makefile @if [ -e $@ ] && [ `grep -c super-ninja $@ 2> /dev/null ` -eq 0 ]; \ then echo "$@ exists but is not super-ninja, skipping"; \ else echo "(re)making $@" && \ $(RM) $@ && \ sed \ -e 's|^$(WS)PROJECT_HOME$(WS)=$(WS)\(.*\)$(WS)|PROJECT_HOME = ../\1|' \ -e 's/^$(WS)PACKAGE$(WS)=$(WS)\(.*\)$(WS)/PACKAGE = \1.$(subst /,,$(dir $@))/' \ -e 's/^$(WS)if-root-package$(WS)=.*/if-root-package = $$(2)/' \ makefile > $@; fi .PHONY: makefiles makefiles: $(SUBPACKAGE_MAKEFILES) @echo making makefiles @$(call recursively-make,makefiles,true) # make the jar key .PHONY: keygen keygen: $(JDK_HOME)/bin/keytool -genkey -keyalg rsa -alias $(JARKEY) $(JDK_HOME)/bin/keytool -export -alias $(JARKEY) -file $(JAR_CRT) # make the jar # # the jar is built containing all rsync-able files in all # $(SUBPROJECT_PACKAGES), the subproject javadoc, and the makefile from the # base package. Subproject packages ending in "." are copied non-recursively, # else they are copied recursively. # # empty dirs will not be included in the jar # # all $(EXT_JARS), if any, are folded into the jarfile # # if $(JAR_MF) exists it is used as the jar manifest # # if $(JAR_CRT) exist the jar is signed with $(JARKEY) .PHONY: jar jar: $(call make-jar,true,$(EXT_JARS),$(JARFILE),$(JARFILE_EXTS),$(JAR_EXTRA),$(SUBPROJECT_PACKAGES)) # make the lite jar # # same as the "jar" target except uses LITE_SUBPROJECT_PACKAGES, EXT_JARS_LITE, # JARFILE_LITE_EXTS, JAR_LITE_EXTRA, and never includes the javadoc tree jar-lite: $(call make-jar,false,$(EXT_JARS_LITE),$(JARFILE_LITE),$(JARFILE_LITE_EXTS),$(JAR_LITE_EXTRA),$(LITE_SUBPROJECT_PACKAGES)) # make the xlite jar # # same as the "jar-lite" target except uses XLITE_SUBPROJECT_PACKAGES, # EXT_JARS_XLITE, JARFILE_XLITE_EXTS, and JAR_XLITE_EXTRA .PHONY: jar-xlite jar-xlite: $(call make-jar,false,$(EXT_JARS_XLITE),$(JARFILE_XLITE),$(JARFILE_XLITE_EXTS),$(JAR_XLITE_EXTRA),$(XLITE_SUBPROJECT_PACKAGES)) # publish to PUBLISH_DEST # # rsyncs $(JARFILE) (and $(JARFILE_LITE), and $(JARFILE_XLITE), if any) # there AND rsync's $(JARFILE_PUBLISH_UNPACK)'s contents there .PHONY: publish ifdef PUBLISH_DEST publish: @echo publishing to $(PUBLISH_DEST) if [ $(JARFILE_PUBLISH_UNPACK) ]; then \ mkdir .$(JARFILE_PUBLISH_UNPACK)-unpack.tmp; \ cd .$(JARFILE_PUBLISH_UNPACK)-unpack.tmp && $(JAR) xvf ../$(JARFILE_PUBLISH_UNPACK) && $(call rsync,*,$(PUBLISH_DEST)); \ cd .. && rm -rf .$(JARFILE_PUBLISH_UNPACK)-unpack.tmp; \ fi if [ $(JARFILE) -a -f $(JARFILE) ]; then $(call rsync,$(JARFILE),$(PUBLISH_DEST)); fi if [ $(JARFILE_LITE) -a -f $(JARFILE_LITE) ]; then $(call rsync,$(JARFILE_LITE),$(PUBLISH_DEST)); fi if [ $(JARFILE_XLITE) -a -f $(JARFILE_XLITE) ]; then $(call rsync,$(JARFILE_XLITE),$(PUBLISH_DEST)); fi $(EXTRA_PUBLISH_CMDS) else publish: $(JARFILE) @echo PUBLISH_DEST not set $(EXTRA_PUBLISH_CMDS) endif # publish to PUBLISH_DEST # # rsyncs $(JARFILE_LITE), there .PHONY: publish-lite ifdef PUBLISH_DEST publish-lite: $(JARFILE_LITE) @echo publishing to $(PUBLISH_DEST) $(call rsync,$(JARFILE_LITE),$(PUBLISH_DEST)) $(EXTRA_PUBLISH_CMDS) else publish-lite: $(JARFILE_LITE) @echo PUBLISH_DEST not set $(EXTRA_PUBLISH_CMDS) endif