polymaking-0.8.6/0000755000076600000240000000000014071427117012712 5ustar mhornstaffpolymaking-0.8.6/PackageInfo.g0000644000076600000240000000525514071427055015241 0ustar mhornstaffSetPackageInfo( rec( PackageName := "polymaking", Subtitle := "Interfacing the geometry software polymake", Version := "0.8.6", Date := "08/07/2021", # dd/mm/yyyy format License := "GPL-2.0-or-later", Persons := [ rec( LastName := "Roeder", FirstNames := "Marc", IsAuthor := true, IsMaintainer := true, Email := "roeder.marc@gmail.com", ), rec( LastName := "GAP Team", FirstNames := "The", IsAuthor := false, IsMaintainer := true, Email := "support@gap-system.org", ), ], Status := "deposited", PackageWWWHome := "https://gap-packages.github.io/polymaking/", README_URL := Concatenation( ~.PackageWWWHome, "README.md" ), PackageInfoURL := Concatenation( ~.PackageWWWHome, "PackageInfo.g" ), SourceRepository := rec( Type := "git", URL := "https://github.com/gap-packages/polymaking", ), IssueTrackerURL := Concatenation( ~.SourceRepository.URL, "/issues" ), ArchiveURL := Concatenation( ~.SourceRepository.URL, "/releases/download/v", ~.Version, "/polymaking-", ~.Version ), ArchiveFormats := ".tar.gz", AbstractHTML := "This package provides a very basic interface to the polymake program by Ewgenij Gawrilow, Michael Joswig et al.", PackageDoc := rec( BookName := "polymaking", ArchiveURLSubset := ["doc"], HTMLStart := "doc/chap0.html", PDFFile := "doc/manual.pdf", SixFile := "doc/manual.six", LongTitle := "A package for using polymake in GAP", ), Dependencies := rec( GAP := ">=4.8", NeededOtherPackages := [], SuggestedOtherPackages := [["GAPDoc", ">= 0.99"]], ExternalConditions := ["polymake (http://www.polymake.org) must be installed"] ), AvailabilityTest := ReturnTrue, TestFile := "tst/testall.g", Keywords := ["interface","polymake","computational geometry"], AutoDoc := rec( TitlePage := rec( Abstract := """ This package provides a very basic interface to the polymake program by Ewgenij Gawrilow, Michael Joswig et al. . The polymake program itself is not included. """, Acknowledgements := """ This work has been supported by Marie Curie Grant No. MTKD-CT-2006-042685 """, Copyright := """ ©right; 2007--2013 Marc Roeder.

This package is distributed under the terms of the GNU General Public License version 2 or later (at your convenience). See the file "LICENSE" or https://www.gnu.org/copyleft/gpl.html """, Version := Concatenation( "Version ", ~.Version ), ) ), )); polymaking-0.8.6/LICENSE0000644000076600000240000004310314071427055013721 0ustar mhornstaff GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser General Public License instead of this License. polymaking-0.8.6/README.md0000644000076600000240000000533614071427055014201 0ustar mhornstaff[![Build Status](https://github.com/gap-packages/polymaking/workflows/CI/badge.svg?branch=master)](https://github.com/gap-packages/polymaking/actions?query=workflow%3ACI+branch%3Amaster) [![Code Coverage](https://codecov.io/github/gap-packages/polymaking/coverage.svg?branch=master&token=)](https://codecov.io/gh/gap-packages/polymaking) polymak(e)inG(AP) ================== A very basic GAP-interface to the program "polymake" by Ewgenij Gawrilow and Michael Joswig which is available at Note that this package does not provide the program "polymake", which has to be installed separately. This package is distributed under the terms of the GNU general public license version 2 or later (at your descretion). (C)2007-2013 by Marc Roeder, National University of Ireland, Galway Requirements ------------ polymaking requires GAP version 4.8. It also needs polymake to be installed. The GAPDoc package is needed to display the documentation. polymaking was written for the "first generation" polymake which was called as a command-line tool. Using it with a current ("next generation") version of polymake will result in longer runtimes and fewer supported keywords/features. Installation ------------ 0. Install polymake 1. Download one of the archives - `polymaking.tar.bz2` - `polymaking.tar.gz` - `polymaking-win.zip` (where `` is some version number) to the directory pkg/ of the GAP home directory. If you do not have permission to do so, create a directory called gap/pkg in your home directory. 2. Change directory to pkg/ and unpack the archive using the according command: - `tar -xjf polymaking.tar.bz2` - `tar -xzf polymaking.tar.gz` - `unzip polymaking-win.zip` (replace `` with the version number) 3. Start GAP. If you have created the directory gap/pkg in your home directory, use `gap -l '/gap;'` where `` is the path of your home directory (use `pwd` to find out what it is, if you don't know). 4. Type `LoadPackage("polymaking");` to load the polymaking package. 5. Run `ReadPackage("polymaking","tst/test.gap");` for a quick test. If polymake is not found automatically (a warning will be printed at level 1 in this case), try this: 6. Tell GAP where to look for polymake by adding the following lines to your `.gaprc` file: POLYMAKE_COMMAND:=Filename(Directory("/home/mypolymakebindir/"),"polymake"); MakeImmutable(POLYMAKE_COMMAND); Note that you can also modify the value of the variable `POLYMAKE_COMMAND` in `lib/environment.gi`. Support ------- If you find a bug or strange behaviour, please submit a bug report to . polymaking-0.8.6/makedoc.g0000644000076600000240000000047114071427055014470 0ustar mhornstaff## this creates the documentation, needs: GAPDoc and AutoDoc packages, pdflatex ## ## Call this with GAP from within the package directory. ## if fail = LoadPackage("AutoDoc", ">= 2016.01.21") then Error("AutoDoc 2016.01.21 or newer is required"); fi; AutoDoc(rec( scaffold := rec( MainPage := false ))); polymaking-0.8.6/lib/0000755000076600000240000000000014071427055013461 5ustar mhornstaffpolymaking-0.8.6/lib/environment.gd0000644000076600000240000000236414071427055016346 0ustar mhornstaff############################################################################# ## #W environment.gd polymaking Package Marc Roeder ## ## ## ## #Y Copyright (C) 2006 Marc Roeder #Y #Y This program is free software; you can redistribute it and/or #Y modify it under the terms of the GNU General Public License #Y as published by the Free Software Foundation; either version 2 #Y of the License, or (at your option) any later version. #Y #Y This program is distributed in the hope that it will be useful, #Y but WITHOUT ANY WARRANTY; without even the implied warranty of #Y MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #Y GNU General Public License for more details. #Y #Y You should have received a copy of the GNU General Public License #Y along with this program; if not, write to the Free Software #Y Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ## DeclareInfoClass("InfoPolymaking"); DeclareOperation("SetPolymakeDataDirectory",[IsDirectory]); DeclareOperation("SetPolymakeCommand",[IsString]); ## ## keep track of the last thing tha caused Polymake to return fail: ## DeclareGlobalVariable("POLYMAKE_LAST_FAIL_REASON"); DeclareOperation("UpdatePolymakeFailReason",[IsString]); polymaking-0.8.6/lib/construct.gd0000644000076600000240000000405114071427055016021 0ustar mhornstaff############################################################################# ## #W construct.gd polymaking Package Marc Roeder ## ## ## ## #Y Copyright (C) 2006 Marc Roeder #Y #Y This program is free software; you can redistribute it and/or #Y modify it under the terms of the GNU General Public License #Y as published by the Free Software Foundation; either version 2 #Y of the License, or (at your option) any later version. #Y #Y This program is distributed in the hope that it will be useful, #Y but WITHOUT ANY WARRANTY; without even the implied warranty of #Y MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #Y GNU General Public License for more details. #Y #Y You should have received a copy of the GNU General Public License #Y along with this program; if not, write to the Free Software #Y Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ## DeclareOperation("CreateEmptyFile",[IsString]); DeclareOperation("InitPolymakeObject",[IsPolymakeObject]); DeclareOperation("CreatePolymakeObjectFromFile",[IsString]); DeclareOperation("CreatePolymakeObjectFromFile",[IsDirectory,IsString]); DeclareOperation("CreatePolymakeObject",[]); DeclareOperation("CreatePolymakeObject",[IsDenseList]); DeclareOperation("CreatePolymakeObject",[IsDirectory]); DeclareOperation("CreatePolymakeObject",[IsDirectory,IsDenseList]); DeclareOperation("CreatePolymakeObject",[IsString,IsDirectory]); DeclareOperation("CreatePolymakeObject",[IsString,IsDirectory,IsDenseList]); DeclareOperation("ConvertMatrixToPolymakeString",[IsString,IsDenseList]); DeclareOperation("AppendToPolymakeObject",[IsPolymakeObject,IsString]); DeclareOperation("AppendToPolymakeObject",[IsPolymakeObject,IsString,IsString]); DeclareOperation("AppendPointlistToPolymakeObject",[IsPolymakeObject,IsDenseList]); DeclareOperation("AppendVertexlistToPolymakeObject",[IsPolymakeObject,IsDenseList]); DeclareOperation("AppendInequalitiesToPolymakeObject",[IsPolymakeObject,IsDenseList]); DeclareOperation("Polymake",[IsPolymakeObject,IsString]); polymaking-0.8.6/lib/pm_script_arg.pl0000644000076600000240000000146214071427055016652 0ustar mhornstaff# This is a compatibility hack for polymake 4.1 # See https://polymake.org/doku.php/user_guide/tutorials/release/4.1/legacy # Copyright Joachim Zobel . # Licensed under the same license as GAP polymaking. my $file = shift(@ARGV); my $rtn = 0; $rtn = 1 if $#ARGV > 1; sub give_from { my ($c, $arg) = @_; no strict 'refs'; return $c->$arg; } my $c=load($file); my @rtn = (); foreach my $arg (@ARGV) { my @sargs = split(/\b\s+\b/, $arg); $rtn = 1 if $#sargs > 1; foreach my $sarg (@sargs) { my @ssargs = split('->', $sarg); my $given = $c; # We follow the arrows foreach my $ssarg (@ssargs) { $given = give_from($given, $ssarg); } # and return what the last one gave us push(@rtn, "$sarg\n$given\n"); } } print join("\n", @rtn); return $rtn; polymaking-0.8.6/lib/application_version_type.gd0000644000076600000240000000174614071427055021116 0ustar mhornstaff############################################################################# ## #W application_version_type.gd polymaking Package Marc Roeder ## ## ## ## #Y Copyright (C) 2006 Marc Roeder #Y #Y This program is free software; you can redistribute it and/or #Y modify it under the terms of the GNU General Public License #Y as published by the Free Software Foundation; either version 2 #Y of the License, or (at your option) any later version. #Y #Y This program is distributed in the hope that it will be useful, #Y but WITHOUT ANY WARRANTY; without even the implied warranty of #Y MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #Y GNU General Public License for more details. #Y #Y You should have received a copy of the GNU General Public License #Y along with this program; if not, write to the Free Software #Y Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ## DeclareOperation("CheckAppVerTypList",[IsDenseList]);polymaking-0.8.6/lib/ObjectConverters.gi0000644000076600000240000000713714071427055017273 0ustar mhornstaff############################################################################# ## #W ObjectConverters.gi polymaking Package Marc Roeder ## ## ## ## #Y Copyright (C) 2006 Marc Roeder #Y #Y This program is free software; you can redistribute it and/or #Y modify it under the terms of the GNU General Public License #Y as published by the Free Software Foundation; either version 2 #Y of the License, or (at your option) any later version. #Y #Y This program is distributed in the hope that it will be useful, #Y but WITHOUT ANY WARRANTY; without even the implied warranty of #Y MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #Y GNU General Public License for more details. #Y #Y You should have received a copy of the GNU General Public License #Y along with this program; if not, write to the Free Software #Y Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ## InstallValue(ObjectConverters, rec( ALTSHULER_DET:=ConvertPolymakeScalarToGAP, AMBIENT_DIM:=ConvertPolymakeScalarToGAP, BALANCED:=ConvertPolymakeBoolToGAP, BALANCE:=ConvertPolymakeScalarToGAP, BOUNDED:=ConvertPolymakeBoolToGAP, CENTERED:=ConvertPolymakeBoolToGAP, COCUBICAL:=ConvertPolymakeBoolToGAP, COMPLEXITY:=ConvertPolymakeScalarToGAP, CUBICAL:=ConvertPolymakeBoolToGAP, COCUBICALITY:=ConvertPolymakeScalarToGAP, COMPLEXITY:=ConvertPolymakeScalarToGAP, DIMS:=ConvertPolymakeVectorToGAP, ## done using mapping-hack DIM:=ConvertPolymakeScalarToGAP, DUAL_CONNECTIVITY:=ConvertPolymakeScalarToGAP, DUAL_DIAMETER:=ConvertPolymakeScalarToGAP, DUAL_EVEN:=ConvertPolymakeBoolToGAP, DUAL_GRAPH_SIGNATURE:=ConvertPolymakeScalarToGAP, DUAL_TRIANGLE_FREE:=ConvertPolymakeBoolToGAP, EQUATIONS:=ConvertPolymakeMatrixToGAP, ESSENTIALLY_GENERIC:=ConvertPolymakeBoolToGAP, EVEN:=ConvertPolymakeBoolToGAP, F_VECTOR:=ConvertPolymakeVectorToGAP, F2_VECTOR:=ConvertPolymakeMatrixToGAP, FACES:=ConvertPolymakeListOfSetsToGAPPlusOne, ADJACENCY:=ConvertPolymakeListOfSetsToGAPPlusOne, FACET_DEGREES:=ConvertPolymakeVectorToGAP, FACETS:=ConvertPolymakeMatrixOrListOfSetsToGAPPlusOne, FAR_HYPERPLANE:=ConvertPolymakeVectorToGAP, FATNESS:=ConvertPolymakeScalarToGAP, FEASIBLE:=ConvertPolymakeBoolToGAP, GRAPH:=ConvertPolymakeGraphToGAP, GRAPH_SIGNATURE:=ConvertPolymakeScalarToGAP, INEQUALITIES:=ConvertPolymakeMatrixToGAP, LATTICE:=ConvertPolymakeBoolToGAP, N_01POINTS:=ConvertPolymakeScalarToGAP, N_BOUNDED_VERTICES:=ConvertPolymakeScalarToGAP, N_FACETS:=ConvertPolymakeScalarToGAP, N_FLAGS:=ConvertPolymakeScalarToGAP, N_INEQUALITIES:=ConvertPolymakeScalarToGAP, N_POINTS:=ConvertPolymakeScalarToGAP, N_RIDGES:=ConvertPolymakeScalarToGAP, N_VERTEX_FACET_INC:=ConvertPolymakeScalarToGAP, N_VERTICES:=ConvertPolymakeScalarToGAP, NEIGHBORLINESS:=ConvertPolymakeScalarToGAP, NEIGHBORLY:=ConvertPolymakeBoolToGAP, MINIMAL_VERTEX_ANGLE:=ConvertPolymakeScalarToGAP, POINTED:=ConvertPolymakeBoolToGAP, POINTS:=ConvertPolymakeMatrixToGAPKillOnes, POSITIVE:=ConvertPolymakeBoolToGAP, REL_INT_POINT:=ConvertPolymakeVectorToGAPKillOne, SELF_DUAL:=ConvertPolymakeBoolToGAP, SIMPLE:=ConvertPolymakeBoolToGAP, SIMPLICIAL:=ConvertPolymakeBoolToGAP, VALID_POINT:=ConvertPolymakeVectorToGAPKillOne, VERTEX_BARYCENTER:=ConvertPolymakeVectorToGAPKillOne, VERTEX_DEGREES:=ConvertPolymakeVectorToGAP, VERTICES:=ConvertPolymakeMatrixToGAPKillOnes, VERTICES_IN_FACETS:=ConvertPolymakeListOfSetsToGAPPlusOne, VOLUME:=ConvertPolymakeScalarToGAP, )); polymaking-0.8.6/lib/workaround_maps.gd0000644000076600000240000000204014071427055017204 0ustar mhornstaff############################################################################# ## #W workaround_maps.gd polymaking Package Marc Roeder ## ## ## ## #Y Copyright (C) 2006 Marc Roeder #Y #Y This program is free software; you can redistribute it and/or #Y modify it under the terms of the GNU General Public License #Y as published by the Free Software Foundation; either version 2 #Y of the License, or (at your option) any later version. #Y #Y This program is distributed in the hope that it will be useful, #Y but WITHOUT ANY WARRANTY; without even the implied warranty of #Y MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #Y GNU General Public License for more details. #Y #Y You should have received a copy of the GNU General Public License #Y along with this program; if not, write to the Free Software #Y Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ## DeclareOperation("MapKeyWordToPolymakeFormat",[IsString]); DeclareOperation("MapKeyWordFromPolymakeFormat",[IsString]);polymaking-0.8.6/lib/Objects.gd0000644000076600000240000000367714071427055015403 0ustar mhornstaff############################################################################# ## #W Objects.gd polymaking Package Marc Roeder ## ## ## ## #Y Copyright (C) 2006 Marc Roeder #Y #Y This program is free software; you can redistribute it and/or #Y modify it under the terms of the GNU General Public License #Y as published by the Free Software Foundation; either version 2 #Y of the License, or (at your option) any later version. #Y #Y This program is distributed in the hope that it will be useful, #Y but WITHOUT ANY WARRANTY; without even the implied warranty of #Y MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #Y GNU General Public License for more details. #Y #Y You should have received a copy of the GNU General Public License #Y along with this program; if not, write to the Free Software #Y Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ## DeclareCategory("IsPolymakeObject",IsObject); DeclareRepresentation("IsPolymakeObjectRep", IsComponentObjectRep, ["dir", "filename", "knownProperties"] ); # #Extracting Information: ##################### DeclareOperation("DirectoryOfPolymakeObject",[IsPolymakeObject]); DeclareOperation("FilenameOfPolymakeObject",[IsPolymakeObject]); DeclareOperation("FullFilenameOfPolymakeObject",[IsPolymakeObject]); DeclareOperation("KnownPropertiesOfPolymakeObject",[IsPolymakeObject]); DeclareOperation("NamesKnownPropertiesOfPolymakeObject",[IsPolymakeObject]); DeclareOperation("PropertyOfPolymakeObject",[IsPolymakeObject,IsString]); # #Manipulating contents of a polygon: ############################### DeclareOperation("ClearPolymakeObject",[IsPolymakeObject]); DeclareOperation("ClearPolymakeObject",[IsPolymakeObject,IsDenseList]); DeclareOperation("UnbindKnownPropertyOfPolymakeObject",[IsPolymakeObject,IsString]); DeclareOperation("WriteKnownPropertyToPolymakeObject",[IsPolymakeObject,IsString,IsObject]);polymaking-0.8.6/lib/convert.gi0000644000076600000240000003150614071427055015467 0ustar mhornstaff############################################################################# ## #W convert.gi polymaking Package Marc Roeder ## ## ## ## #Y Copyright (C) 2006 Marc Roeder #Y #Y This program is free software; you can redistribute it and/or #Y modify it under the terms of the GNU General Public License #Y as published by the Free Software Foundation; either version 2 #Y of the License, or (at your option) any later version. #Y #Y This program is distributed in the hope that it will be useful, #Y but WITHOUT ANY WARRANTY; without even the implied warranty of #Y MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #Y GNU General Public License for more details. #Y #Y You should have received a copy of the GNU General Public License #Y along with this program; if not, write to the Free Software #Y Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ## InstallMethod(ConvertPolymakeOutputToGapNotation,[IsString], function(string) local split, blockpositions, splitblocks, returnlist, splitblock, name, rest, object; splitblocks:=SplitPolymakeOutputStringIntoBlocks(string); returnlist:=[]; for splitblock in splitblocks do name:=NormalizedWhitespace(splitblock[1]); if Size(splitblock) < 2 then Info(InfoPolymaking,2,"No data for ", name,". Record not updated for this block"); UpdatePolymakeFailReason(Concatenation("polymake returned ",name," empty")); Add(returnlist, rec(name:=name,object:=fail)); continue; fi; rest:=splitblock{[2..Maximum(Size(splitblock),2)]}; if rest[Size(rest)]="" then Unbind(rest[Size(rest)]); fi; # Apply(rest,NormalizedWhitespace); if rest=["==UNDEF=="] then Info(InfoPolymaking,1,Concatenation("polymake declares object ",name," undefined")); UpdatePolymakeFailReason(Concatenation("polymake declares ",name," undefined")); Add(returnlist,rec(name:=name,object:=fail)); elif IsBound(ObjectConverters.(name)) then object:=ObjectConverters.(name)(rest); if object<>fail then Add(returnlist,rec(name:=name,object:=object)); else Info(InfoPolymaking,1,"Conversion failed. Maybe invalid output from polymake. Record not updated for this block"); Add(returnlist, rec(name:=name,object:=fail)); fi; else Info(InfoPolymaking,1,"No Method to convert ", name,". Record not updated for this block"); UpdatePolymakeFailReason(Concatenation("polymaking doesn't know how to convert ",name," to GAP")); Add(returnlist, rec(name:=name,object:=fail)); fi; od; return returnlist; end); # #First the method to split polymake's output into different blocks by # recognizing lines which may be keyword-lines ############### InstallMethod(SplitPolymakeOutputStringIntoBlocks,[IsString], function(string) local blocks, newblock, lines, line; blocks:=[]; newblock:=[]; lines:=SplitString(string,"\n"); while lines<>[] do line:=Remove(lines,1); if not IsEmptyString(line) then if IsUpperAlphaChar(line[1]) and ForAll(line,c->IsUpperAlphaChar(c) or c in ['_','-','>'] or IsDigitChar(c)) then if blocks=[] and newblock=[] then newblock:=[MapKeyWordFromPolymakeFormat(line)]; else Add(blocks,ShallowCopy(newblock)); newblock:=[MapKeyWordFromPolymakeFormat(line)]; fi; else Add(newblock,line); fi; fi; od; if newblock<>[] then Add(blocks,newblock); fi; return blocks; end); ############################################################################# ## ## update the fail reason in case of syntax errors: ## InstallMethod(ConverterSyntaxError,[IsString], function(methname) UpdatePolymakeFailReason( Concatenation("input for converter method ",methname, " syntactically incorrect (cast an error and went into break loop)") ); Error("incorrect input"); end); ############################################################################# # Now the different conversion methods: ############################################################################# ## ## Basics, numbers and bools: ## InstallMethod(ConvertPolymakeNumber,[IsString], function(string) local sstring, denom, enum; if '.' in string then Info(InfoPolymaking,1,"Warnig!converting a floating point number"); sstring:=SplitString(string,"."); denom:=10^(Length(sstring[2])); enum:=Int(Concatenation(sstring)); return enum/denom; elif string="" then ConverterSyntaxError("ConvertPolymakeNumber"); return fail; else return Rat(string); fi; end); InstallMethod(ConvertPolymakeScalarToGAP,[IsDenseList], function(stringlist) if Size(stringlist)<>1 then ConverterSyntaxError("ConvertPolymakeScalarToGAP"); return fail; else return ConvertPolymakeNumber(stringlist[1]); fi; end); InstallMethod(ConvertPolymakeBoolToGAP,[IsDenseList], function(stringlist) if Size(stringlist)<>1 then ConverterSyntaxError("ConvertPolymakeBoolToGAP"); return fail; elif stringlist[1]="1" or stringlist[1]="true" then return true; elif stringlist[1]="0" or stringlist[1]="false" then return false; else UpdatePolymakeFailReason("Boolean conversion failed, the returned value wasn't 0, 1, true, or false. Error cast"); Error("Conversion failed"); fi; end); InstallMethod(ConvertPolymakeDescriptionToGAP,[IsDenseList], function(stringlist) return JoinStringsWithSeparator(stringlist," "); end); ############################################################################# ## ## MATRICES AND LISTS OF SETS: ## ## Unfortunately some of the keywords that return matrices ## might also return lists of sets (this is a polytope/topaz problem). ## So we try to guess the type if necessary. ## InstallMethod(ConvertPolymakeMatrixOrListOfSetsToGAP,[IsDenseList], function(stringlist) if ForAll(stringlist,i->i[1]='{') then return ConvertPolymakeListOfSetsToGAP(stringlist); elif ForAll(stringlist,i->not ('{' in i or '}' in i)) then return ConvertPolymakeMatrixToGAP(stringlist); else UpdatePolymakeFailReason("ConvertPolymakeMatrixOrListOfSetsToGAP couldn't decide what to do. Error cast"); Error("don't know if this is a matrix or a list of sets "); return fail; fi; end); InstallMethod(ConvertPolymakeMatrixOrListOfSetsToGAPPlusOne,[IsDenseList], function(stringlist) if ForAll(stringlist,i->i[1]='{') then return ConvertPolymakeListOfSetsToGAPPlusOne(stringlist); elif ForAll(stringlist,i->not ('{' in i or '}' in i)) then return ConvertPolymakeMatrixToGAP(stringlist); else UpdatePolymakeFailReason("ConvertPolymakeMatrixOrListOfSetsToGAP couldn't decide what to do. Error cast"); Error("don't know if this is a matrix or a list of sets "); return fail; fi; end); InstallMethod(ConvertPolymakeMatrixToGAP,[IsDenseList], function(stringlist) local returnmatrix, string, vector; returnmatrix:=[]; for string in stringlist do vector:=SplitString(string," "); Apply(vector,ConvertPolymakeNumber); Add(returnmatrix,vector); od; return returnmatrix; end); InstallMethod(ConvertPolymakeMatrixToGAPKillOnes,[IsDenseList], function(stringlist) local returnmatrix; returnmatrix:=ConvertPolymakeMatrixToGAP(stringlist); if not IsMatrix(returnmatrix) or Size(returnmatrix[1])<2 or not ForAll(returnmatrix,i->i[1]=1) then Error("returnmatrix is not a matrix or too small"); UpdatePolymakeFailReason("Error in ConvertPolymakeMatrixToGAPKillOnes. The returned object is either not a matrix, has fewer than 2 columns or doesn't have all ones in the first column. (Error cast)"); return fail; fi; if returnmatrix<>fail then return List(returnmatrix,i->i{[2..Size(i)]}); #kill leading ones else return fail; fi; end); ############################################################################# ## ## Vectors ## InstallMethod(ConvertPolymakeVectorToGAP,[IsDenseList], function(stringlist) local vector; if Size(stringlist)<>1 then ConverterSyntaxError("ConvertPolymakeVectorToGAP"); return fail; else vector:=SplitString(stringlist[1]," "); Apply(vector,ConvertPolymakeNumber); return vector; fi; end); InstallMethod(ConvertPolymakeVectorToGAPKillOne,[IsDenseList], function(stringlist) local vector; vector:=ConvertPolymakeVectorToGAP(stringlist); if not IsVector(vector) or Size(vector)<2 or vector[1]<>1 then Error("vector is not a vector or too small"); UpdatePolymakeFailReason("Error in ConvertPolymakeVectorToGAPKillOne. The returned object is either not a vector or has fewer than 2 columns or doesn't start with 1. (Error cast)"); return fail; fi; return vector{[2..Size(vector)]}; end); InstallMethod(ConvertPolymakeIntVectorToGAPPlusOne,[IsDenseList], function(stringlist) local vec; vec:=ConvertPolymakeVectorToGAP(stringlist); if not ForAll(vec,IsInt) then Error("Vector is not a vector of integers as expected"); UpdatePolymakeFailReason("Error in ConvertPolymakeIntVectorToGAPPlusOne. The returned vector did not consist of integers. Error cast"); return fail; else return vec+1; fi; end); ############################################################################# ## ## Sets, Sets of Sets, Lists of Sets ## InstallMethod(ConvertPolymakeSetToGAP,[IsDenseList], function(stringlist) local entries; if not Size(stringlist)=1 and IsString(stringlist[1]) then ConverterSyntaxError("ConvertPolymakeSetToGAP"); return fail; else entries:=ReplacedString(ReplacedString(stringlist[1],"{",""),"}",""); entries:=Set(SplitString(entries," ")); RemoveSet(entries,""); return Set(entries,ConvertPolymakeNumber); fi; end); InstallMethod(ConvertPolymakeSetOfSetsToGAP,[IsDenseList], function(stringlist) local returnlist, line, newlist, entry; returnlist:=[]; if Size(stringlist)<> 1 or not IsString(stringlist[1]) then ConverterSyntaxError("ConvertPolymakeSetOfSetsToGAP"); return fail; fi; line:=stringlist[1]; newlist:=ReplacedString(line{[2..Size(line)-1]},"} {","},{"); newlist:=SplitString(newlist,","); for entry in newlist do Add(returnlist,ConvertPolymakeSetToGAP([entry])); od; return returnlist; end); InstallMethod(ConvertPolymakeListOfSetsToGAP,[IsDenseList], function(stringlist) return List(stringlist,s->ConvertPolymakeSetToGAP([s])); end); InstallMethod(ConvertPolymakeListOfSetsToGAPPlusOne,[IsDenseList], function(stringlist) return List(stringlist,s->ConvertPolymakeSetToGAP([s])+1); end); ############################################################################# ## ## More complex stuff: ## ############################################################################# ## ## Graphs: ## InstallMethod(ConvertPolymakeGraphToGAP,[IsDenseList], function(stringlist) local edgelist, edge, vertices; edgelist:=[]; for edge in stringlist do # verts:=ReplacedString(ReplacedString(edge,"{",""),"}",""); # verts:=SplitString(verts," "); Add(edgelist,ConvertPolymakeSetToGAP(edge)); od; vertices:=Set(Flat(edgelist)); return rec(vertices:=vertices,edges:=Set(edgelist)); end); ############################################################################# ## ## Face Lattices: ## InstallMethod(ConvertPolymakeFaceLatticeToGAP,[IsDenseList], function(stringlist) local returnlist, line, faces; returnlist:=[]; for line in stringlist do if line<>"" and line[1]='{' then faces:=Set(ConvertPolymakeSetOfSetsToGAP([line])); Apply(faces,i->i+1); Add(returnlist,faces); fi; od; return returnlist; end); ############################################################################# ## #E END of file convert.gi ## polymaking-0.8.6/lib/construct.gi0000644000076600000240000002534514071427055016037 0ustar mhornstaff############################################################################# ## #W construct.gi polymaking Package Marc Roeder ## ## ## ## #Y Copyright (C) 2006 Marc Roeder #Y #Y This program is free software; you can redistribute it and/or #Y modify it under the terms of the GNU General Public License #Y as published by the Free Software Foundation; either version 2 #Y of the License, or (at your option) any later version. #Y #Y This program is distributed in the hope that it will be useful, #Y but WITHOUT ANY WARRANTY; without even the implied warranty of #Y MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #Y GNU General Public License for more details. #Y #Y You should have received a copy of the GNU General Public License #Y along with this program; if not, write to the Free Software #Y Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ## # just create an empty file: InstallMethod(CreateEmptyFile,[IsString], function(name) PrintTo(name,""); end); InstallMethod(InitPolymakeObject,[IsPolymakeObject], function(poly) local appstring; # In polymake 4.1 this is required. appstring:=Concatenation( "_application polytope\n", "_type Polytope\n\n" ); AppendToPolymakeObject(poly, appstring); return poly; end); # create a (possibly empty) polygon. # That is, a record just containing the name of a file to use with polymake. # If the file does not exist, it is created. #################### InstallMethod(CreatePolymakeObjectFromFile,[IsString], function(name) return CreatePolymakeObjectFromFile(POLYMAKE_DATA_DIR, name); end); InstallMethod(CreatePolymakeObjectFromFile,[IsDirectory,IsString], function(dir,name) local filename, rtn, polygon; rtn:=Objectify(PolymakeObject,rec(filename:=name,dir:=dir)); filename:=Filename(dir,name); if not IsExistingFile(filename) then CreateEmptyFile(filename); InitPolymakeObject(rtn); fi; return rtn; end); InstallMethod(CreatePolymakeObject,[IsString,IsDirectory], function(prefix,dir) local name, i, newname; name:=Concatenation(prefix,String(Runtime())); if IsExistingFile(Filename(dir,name)) then i:=1; repeat newname:=Concatenation([name,".",String(i)]); i:=i+1; until not IsExistingFile(Filename(dir,newname)); else newname:=name; fi; return CreatePolymakeObjectFromFile(dir,newname); end); InstallMethod(CreatePolymakeObject,[IsString,IsDirectory,IsDenseList], function(prefix,dir,appvertyp) local poly; poly:=CreatePolymakeObject(prefix,dir); ClearPolymakeObject(poly,appvertyp); return poly; end); InstallMethod(CreatePolymakeObject,[IsDirectory], function(dir) local name, i, newname; return CreatePolymakeObject("poly",dir); end); InstallMethod(CreatePolymakeObject,[IsDirectory,IsDenseList], function(dir,appvertyp) local poly; poly:=CreatePolymakeObject(dir); ClearPolymakeObject(poly,appvertyp); return poly; end); InstallMethod(CreatePolymakeObject,[], function() local dir, name; return CreatePolymakeObject(POLYMAKE_DATA_DIR); end); InstallMethod(CreatePolymakeObject,[IsDenseList], function(appvertyp) local poly; poly:=CreatePolymakeObject(); ClearPolymakeObject(poly,appvertyp); return poly; end); InstallMethod(AppendToPolymakeObject,[IsPolymakeObject,IsString,IsString], function(poly,keyword,data) local string; string:=ShallowCopy(keyword); while string[Size(string)] in ['\n','\r','\c'] do Unbind(string[Size(string)]); od; string:=Concatenation(keyword,"\n",data); while string[Size(string)] in ['\n','\r','\c'] do Unbind(string[Size(string)]); od; Add(string,'\n'); AppendToPolymakeObject(poly,string); end); InstallMethod(AppendToPolymakeObject,[IsPolymakeObject,IsString], function(poly,string) local file, retval; #file:=IO_File(record.filename,"w"); #retval:=IO_WriteFlush(file,string); file:=OutputTextFile(FullFilenameOfPolymakeObject(poly),true); #SetPrintFormattingStatus(file,false); retval:=WriteAll(file,string); if not retval then Error("Error writing file"); fi; CloseStream(file); end); InstallMethod(ConvertMatrixToPolymakeString,[IsString,IsDenseList], function(name,matrix) local dim, string, point, stringpoint; dim:=Size(matrix[1]); if not ForAll(matrix,point->Size(point)=dim) then Error("not all rows have the same dimension"); elif not ForAll(Concatenation(matrix),IsRat) then Error("matrix contains non-rational entries."); fi; string:=ShallowCopy(name); Append(string,"\n"); for point in matrix do stringpoint:=JoinStringsWithSeparator(List(point,String)," "); Append(string,stringpoint); Append(string,"\n"); od; Append(string,"\n"); return string; end); # Now a few functions for convenience: InstallMethod(AppendPointlistToPolymakeObject,[IsPolymakeObject,IsDenseList], function(polygon,pointlist) local list, point,string; list:=[]; for point in pointlist do Add(list,Concatenation([1],point)); od; string:=ConvertMatrixToPolymakeString("POINTS",list); AppendToPolymakeObject(polygon,string); end); InstallMethod(AppendVertexlistToPolymakeObject,[IsPolymakeObject,IsDenseList], function(polygon,pointlist) local list, point,string; list:=[]; for point in pointlist do Add(list,Concatenation([1],point)); od; string:= ConvertMatrixToPolymakeString("VERTICES",list); AppendToPolymakeObject(polygon,string); end); InstallMethod(AppendInequalitiesToPolymakeObject,[IsPolymakeObject,IsDenseList], function(polygon,ineqlist) AppendToPolymakeObject(polygon,ConvertMatrixToPolymakeString("INEQUALITIES",ineqlist)); end); ############################## # Call polymake. If the option "PolymakeNolookup" is true, # it is not checked, wheather Polymake has already been called # with this option (however, the polymake program will check # this by looking at the file associated to ). # InstallMethod(Polymake,"for PolymakeObject",[IsPolymakeObject,IsString], function(polygon,option) local callPolymake, gapobject, splitoption, knownProperties, returnval, returnedstring, block; callPolymake:=function(object,splitoption) local returnedstring, pkgdir, scriptarg, stdout, stdin, dir, exitstatus; returnedstring:=[]; scriptarg:=["--config-path","", "--script", Filename(DirectoriesPackageLibrary("polymaking"), "pm_script_arg.pl")]; stdout:=OutputTextString(returnedstring,false); stdin:=InputTextNone();; dir:=DirectoryOfPolymakeObject(object); if dir=fail then dir:=DirectoryCurrent(); fi; exitstatus:=Process( dir, POLYMAKE_COMMAND, stdin, stdout, Concatenation(scriptarg, [FullFilenameOfPolymakeObject(object)], splitoption) );; CloseStream(stdout); CloseStream(stdin); return rec(status:=exitstatus,string:=returnedstring); end; gapobject:=[]; option:=NormalizedWhitespace(option); splitoption:=SplitString(option," "); knownProperties:=NamesKnownPropertiesOfPolymakeObject(polygon); returnval:=[]; Info(InfoPolymaking,2,"option=",option); Info(InfoPolymaking,2,"Size(splitoption)=",Size(splitoption)); if Size(splitoption)=0 then Error("you must pass an option to polymake"); elif Size(splitoption)=1 then if ValueOption("PolymakeNolookup") in [fail,false] and knownProperties<>fail and splitoption[1] in knownProperties then returnval:=PropertyOfPolymakeObject(polygon,splitoption[1]); else Apply(splitoption, MapKeyWordToPolymakeFormat); returnedstring:=callPolymake(polygon,splitoption); Info(InfoPolymaking,2,String(returnedstring)); if returnedstring.status <>0 then Error("polymake returned an error (error code ", returnedstring.status, ")"); UpdatePolymakeFailReason(Concatenation("polymake terminated with exit status ",String(returnedstring.status))); returnval:=fail; elif returnedstring.string<>[] then Info(InfoPolymaking,2,returnedstring.string); gapobject:=ConvertPolymakeOutputToGapNotation(returnedstring.string); if gapobject[1].object<>fail then WriteKnownPropertyToPolymakeObject(polygon,gapobject[1].name,gapobject[1].object); returnval:=gapobject[1].object; else returnval:=fail; fi; else UpdatePolymakeFailReason("polymake did not return anything"); returnval:=fail; fi; fi; else # we return fail, whatever happens. ## only the reason may change... ### returnval:=fail; UpdatePolymakeFailReason("polymake called with multiple keywords"); if ValueOption("PolymakeNolookup") in [fail,false] and knownProperties<>fail then splitoption:=Filtered(splitoption,i->not i in knownProperties); fi; if Size(splitoption)>0 then Apply(splitoption, MapKeyWordToPolymakeFormat); returnedstring:=callPolymake(polygon,splitoption); if returnedstring.status <>0 then Error("polymake returned an error"); UpdatePolymakeFailReason(Concatenation("polymake terminated with exit status ",String(returnedstring.status))); elif returnedstring<>[] then Info(InfoPolymaking,2,returnedstring.string); gapobject:=ConvertPolymakeOutputToGapNotation(returnedstring.string); for block in Filtered(gapobject,i->i.object<>fail) do WriteKnownPropertyToPolymakeObject(polygon,block.name,block.object); od; else UpdatePolymakeFailReason("polymake didn't return anything. All keywords that would have triggered output were looked up."); fi; fi; fi; return returnval; end); polymaking-0.8.6/lib/environment.gi0000644000076600000240000000472314071427055016354 0ustar mhornstaff############################################################################# ## #W environment.gi polymaking Package Marc Roeder ## ## ## ## #Y Copyright (C) 2006 Marc Roeder #Y #Y This program is free software; you can redistribute it and/or #Y modify it under the terms of the GNU General Public License #Y as published by the Free Software Foundation; either version 2 #Y of the License, or (at your option) any later version. #Y #Y This program is distributed in the hope that it will be useful, #Y but WITHOUT ANY WARRANTY; without even the implied warranty of #Y MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #Y GNU General Public License for more details. #Y #Y You should have received a copy of the GNU General Public License #Y along with this program; if not, write to the Free Software #Y Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ## SetInfoLevel(InfoPolymaking,1); # give the command which calles polymake. You may need to include the full path #### if not IsBound(POLYMAKE_COMMAND) then POLYMAKE_COMMAND:=Filename( DirectoriesSystemPrograms( ), "polymake" ); fi; if POLYMAKE_COMMAND=fail or not IsExecutableFile(POLYMAKE_COMMAND) then Info(InfoWarning,1,"polymake command not found. Please set POLYMAKE_COMMAND by hand"); else MakeReadOnlyGlobal("POLYMAKE_COMMAND"); fi; InstallMethod(SetPolymakeCommand,[IsString], function(command) if not IsExecutableFile(command) then Error("polymake command must exist and be executable."); else MakeReadWriteGlobal("POLYMAKE_COMMAND"); POLYMAKE_COMMAND:=command; MakeReadOnlyGlobal("POLYMAKE_COMMAND"); fi; end); # # This directory will hold the files generated for polymake # It can be changed using "SetPolymakeDataDirectory" ### if not IsBound(POLYMAKE_DATA_DIR) then POLYMAKE_DATA_DIR:=DirectoryTemporary(); fi; MakeReadOnlyGlobal("POLYMAKE_DATA_DIR"); InstallMethod(SetPolymakeDataDirectory,[IsDirectory], function(dir) MakeReadWriteGlobal("POLYMAKE_DATA_DIR"); POLYMAKE_DATA_DIR:=dir; MakeReadOnlyGlobal("POLYMAKE_DATA_DIR"); end); #### ### ## Handling of last fail reason: # InstallValue(POLYMAKE_LAST_FAIL_REASON,""); InstallMethod(UpdatePolymakeFailReason,[IsString], function(reason) MakeReadWriteGlobal("POLYMAKE_LAST_FAIL_REASON"); POLYMAKE_LAST_FAIL_REASON:=reason; MakeReadOnlyGlobal("POLYMAKE_LAST_FAIL_REASON"); end); polymaking-0.8.6/lib/application_version_type.gi0000644000076600000240000000370114071427055021114 0ustar mhornstaff############################################################################# ## #W application_version_type.gi polymaking Package Marc Roeder ## ## ## ## #Y Copyright (C) 2006 Marc Roeder #Y #Y This program is free software; you can redistribute it and/or #Y modify it under the terms of the GNU General Public License #Y as published by the Free Software Foundation; either version 2 #Y of the License, or (at your option) any later version. #Y #Y This program is distributed in the hope that it will be useful, #Y but WITHOUT ANY WARRANTY; without even the implied warranty of #Y MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #Y GNU General Public License for more details. #Y #Y You should have received a copy of the GNU General Public License #Y along with this program; if not, write to the Free Software #Y Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ## InstallMethod(CheckAppVerTypList,[IsDenseList], function(appvertyp) local app, type; if Size(appvertyp)<>3 or not ForAll(appvertyp,IsString) then return false; fi; ## test applicateion and possible data types: app:=NormalizedWhitespace(appvertyp[1]); type:=NormalizedWhitespace(appvertyp[3]); if app = "polytope" then if not type in ["Polytope", "RationalPolytope", "FloatPolytope", "SchlegelDiagram", "VoronoiDiagram", "TightSpan", "PropagatedPolytope", "Framework" ] then return false; fi; elif app="surface" then if not type="Surface" then return false; fi; elif app="topaz" then if not type="SimplicialComplex" then return false; fi; fi; return true; end);polymaking-0.8.6/lib/ObjectConverters.gd0000644000076600000240000000203114071427055017252 0ustar mhornstaff############################################################################# ## #W ObjectConverters.gd polymaking Package Marc Roeder ## ## ## ## #Y Copyright (C) 2006 Marc Roeder #Y #Y This program is free software; you can redistribute it and/or #Y modify it under the terms of the GNU General Public License #Y as published by the Free Software Foundation; either version 2 #Y of the License, or (at your option) any later version. #Y #Y This program is distributed in the hope that it will be useful, #Y but WITHOUT ANY WARRANTY; without even the implied warranty of #Y MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #Y GNU General Public License for more details. #Y #Y You should have received a copy of the GNU General Public License #Y along with this program; if not, write to the Free Software #Y Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ## DeclareGlobalVariable("ObjectConverters","Functions to convert polymake output to gap"); polymaking-0.8.6/lib/workaround_maps.gi0000644000076600000240000000434614071427055017224 0ustar mhornstaff############################################################################# ## #W workaround_maps.gi polymaking Package Marc Roeder ## ## ## ## #Y Copyright (C) 2006 Marc Roeder #Y #Y This program is free software; you can redistribute it and/or #Y modify it under the terms of the GNU General Public License #Y as published by the Free Software Foundation; either version 2 #Y of the License, or (at your option) any later version. #Y #Y This program is distributed in the hope that it will be useful, #Y but WITHOUT ANY WARRANTY; without even the implied warranty of #Y MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #Y GNU General Public License for more details. #Y #Y You should have received a copy of the GNU General Public License #Y along with this program; if not, write to the Free Software #Y Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ## ########### # This is a workaround for the next-generation polymake # there we need to call keywords of the form "HASSE_DIAGRAM->FACES" # and that does not work as an entry of a record. So we have do do # some extra mapping (yes, it is a hack). ## # direction of the mapping: GAP keyword mapped to polymake keyword ####### InstallMethod(MapKeyWordToPolymakeFormat,"for PolymakeObject",[IsString], function(option) if option = "FACES" then return "HASSE_DIAGRAM->FACES"; elif option = "DIMS" then return "HASSE_DIAGRAM->DIMS"; elif option = "ADJACENCY" then return "HASSE_DIAGRAM->ADJACENCY"; else return option; fi; end); ########## # This is a workaround for the next-generation polymake # there we need to call keywords of the form "HASSE_DIAGRAM->FACES" # and that does not work as an entry of a record. So we have do do # some extra mapping (yes, it is a hack). ## # direction: Polymake output mapped to GAP keywords ####### InstallMethod(MapKeyWordFromPolymakeFormat,"for PolymakeObject",[IsString], function(option) if option = "HASSE_DIAGRAM->FACES" then return "FACES"; elif option = "HASSE_DIAGRAM->DIMS" then return "DIMS"; elif option = "HASSE_DIAGRAM->ADJACENCY" then return "ADJACENCY"; else return option; fi; end); polymaking-0.8.6/lib/convert.gd0000644000076600000240000000440714071427055015462 0ustar mhornstaff############################################################################# ## #W convert.gd polymaking Package Marc Roeder ## ## ## ## #Y Copyright (C) 2006 Marc Roeder #Y #Y This program is free software; you can redistribute it and/or #Y modify it under the terms of the GNU General Public License #Y as published by the Free Software Foundation; either version 2 #Y of the License, or (at your option) any later version. #Y #Y This program is distributed in the hope that it will be useful, #Y but WITHOUT ANY WARRANTY; without even the implied warranty of #Y MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #Y GNU General Public License for more details. #Y #Y You should have received a copy of the GNU General Public License #Y along with this program; if not, write to the Free Software #Y Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ## DeclareOperation("ConvertPolymakeOutputToGapNotation",[IsString]); DeclareOperation("SplitPolymakeOutputStringIntoBlocks",[IsString]); DeclareOperation("ConvertedObject",[IsString,IsDenseList]); DeclareOperation("ConverterSyntaxError",[IsString]); DeclareOperation("ConvertPolymakeNumber",[IsString]); DeclareOperation("ConvertPolymakeScalarToGAP",[IsDenseList]); DeclareOperation("ConvertPolymakeBoolToGAP",[IsDenseList]); DeclareOperation("ConvertPolymakeDescriptionToGAP",[IsDenseList]); DeclareOperation("ConvertPolymakeMatrixOrListOfSetsToGAP",[IsDenseList]); DeclareOperation("ConvertPolymakeMatrixOrListOfSetsToGAPPlusOne",[IsDenseList]); DeclareOperation("ConvertPolymakeMatrixToGAP",[IsDenseList]); DeclareOperation("ConvertPolymakeMatrixToGAPKillOnes",[IsDenseList]); DeclareOperation("ConvertPolymakeVectorToGAP",[IsDenseList]); DeclareOperation("ConvertPolymakeVectorToGAPKillOne",[IsDenseList]); DeclareOperation("ConvertPolymakeIntVectorToGAPPlusOne",[IsDenseList]); DeclareOperation("ConvertPolymakeSetToGAP",[IsDenseList]); DeclareOperation("ConvertPolymakeListOfSetsToGAP",[IsDenseList]); DeclareOperation("ConvertPolymakeListOfSetsToGAPPlusOne",[IsDenseList]); DeclareOperation("ConvertPolymakeSetOfSetsToGAP",[IsDenseList]); DeclareOperation("ConvertPolymakeGraphToGAP",[IsDenseList]); DeclareOperation("ConvertPolymakeFaceLatticeToGAP",[IsDenseList]); polymaking-0.8.6/lib/Objects.gi0000644000076600000240000001405314071427055015376 0ustar mhornstaff############################################################################# ## #W Objects.gi polymaking Package Marc Roeder ## ## ## ## #Y Copyright (C) 2006 Marc Roeder #Y #Y This program is free software; you can redistribute it and/or #Y modify it under the terms of the GNU General Public License #Y as published by the Free Software Foundation; either version 2 #Y of the License, or (at your option) any later version. #Y #Y This program is distributed in the hope that it will be useful, #Y but WITHOUT ANY WARRANTY; without even the implied warranty of #Y MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #Y GNU General Public License for more details. #Y #Y You should have received a copy of the GNU General Public License #Y along with this program; if not, write to the Free Software #Y Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA ## PolymakeObjectFamily:=NewFamily("PolymakeObjectFamily",IsPolymakeObject); PolymakeObject:=NewType(PolymakeObjectFamily,IsPolymakeObjectRep); ###################################################################### # The following methods are the only ones which manipulate the contents # of a PolymakeObject. # There are no other functions containing things like # ###################################################################### # Printing Polymake Objects nicely: # InstallMethod(ViewObj, "for PolymakeObject", [IsPolymakeObject], function(poly) local compnames; compnames:=NamesOfComponents(poly); if "knownProperties" in compnames and "DESCRIPTION" in NamesKnownPropertiesOfPolymakeObject(poly) then Print("<",PropertyOfPolymakeObject(poly,"DESCRIPTION")); else Print(""); end); InstallMethod(PrintObj, "for PolymakeObject", [IsPolymakeObject], function(poly) local compnames; compnames:=NamesOfComponents(poly); if "knownProperties" in compnames and "DESCRIPTION" in NamesKnownPropertiesOfPolymakeObject(poly) then Print("<",PropertyOfPolymakeObject(poly,"DESCRIPTION")); else Print("\n"); end); ###################################################################### # # Extracting data from objects: # # the DIRECTORY: InstallMethod(DirectoryOfPolymakeObject, "for PolymakeObject", [IsPolymakeObject], function(poly) return poly!.dir; end); # the FILENAME: InstallMethod(FilenameOfPolymakeObject, "for PolymakeObject", [IsPolymakeObject], function(poly) return poly!.filename; end); #the FILENAME with full path: InstallMethod(FullFilenameOfPolymakeObject, [IsPolymakeObject], function(poly) return Filename(DirectoryOfPolymakeObject(poly),FilenameOfPolymakeObject(poly)); end); # the KNOWN PROPERTIES: InstallMethod(KnownPropertiesOfPolymakeObject, "for PolymakeObject", [IsPolymakeObject], function(poly) if not "knownProperties" in NamesOfComponents(poly) then return fail; elif Size(RecNames(poly!.knownProperties))=0 then return fail; else return poly!.knownProperties; fi; end); # just the names of the KNOWN PROPERTIES: InstallMethod(NamesKnownPropertiesOfPolymakeObject, "for PolymakeObject", [IsPolymakeObject], function(poly) if not "knownProperties" in NamesOfComponents(poly) then return fail; elif Size(RecNames(poly!.knownProperties))=0 then return fail; else return RecNames(poly!.knownProperties); fi; end); # individual properties from KNOWN PROPERTIES: InstallMethod(PropertyOfPolymakeObject, [IsPolymakeObject,IsString], function(poly,name) local known; known:=NamesKnownPropertiesOfPolymakeObject(poly); if known=fail or not name in known then return fail; else return poly!.knownProperties.(name); fi; end); ###################################################################### # Changing the things we know about a object: # # Deleting files and clearing known data # InstallMethod(ClearPolymakeObject, [IsPolymakeObject], function(poly) CreateEmptyFile(FullFilenameOfPolymakeObject(poly)); Unbind(poly!.knownProperties); end); # clear known data. Clear file and then set application, version,type # information InstallMethod(ClearPolymakeObject, [IsPolymakeObject,IsDenseList], function(poly,appvertyp) local appendstring; if not CheckAppVerTypList(appvertyp) then Error("application, version, type not well-formed"); fi; CreateEmptyFile(FullFilenameOfPolymakeObject(poly)); Unbind(poly!.knownProperties); appendstring:=Concatenation(["_application ",appvertyp[1],"\n", "_version ",appvertyp[2],"\n", "_type ",appvertyp[3],"\n"] ); AppendToPolymakeObject(poly,appendstring); end); # Deleting a something known: # InstallMethod(UnbindKnownPropertyOfPolymakeObject, [IsPolymakeObject,IsString], function(poly,name) local knownProperties; knownProperties:=KnownPropertiesOfPolymakeObject(poly); if knownProperties=fail or not name in knownProperties then return fail; else Unbind(poly!.knownProperties.(name)); fi; end); # Write a property: # InstallMethod(WriteKnownPropertyToPolymakeObject, [IsPolymakeObject,IsString,IsObject], function(poly,name,data) if not "knownProperties" in NamesOfComponents(poly) then poly!.knownProperties:=rec(); fi; poly!.knownProperties.(name):=data; end); polymaking-0.8.6/CHANGES.md0000644000076600000240000001356714071427055014321 0ustar mhornstaff0.8.6 (2021-07-08) - restore DIM that was lost between 0.7.9 and 0.8.1 (thanks to GitHub user narc-Ontakac2) - fixed VISUAL (thanks to GitHub user narc-Ontakac2) ------------------ 0.8.5 (2021-04-14) - updated to recover from the previous faulty update ------------------ 0.8.4 (2021-04-11) - added functionality for the polymake command ADJACENCY ------------------ 0.8.3 (2021-04-07) - polymake 4.1 compatibility (thanks to GitHub user narc-Ontakac2) - various janitorial changes ------------------ 0.8.2 (2019-02-23) - move package to GitHub - add the GAP Team as maintainer - various janitorial changes ------------------ 0.8.1 (2013-11-16) no more support for "old" polymake features. This version is for next-generation polymake run in compatibility mode. More specifically: - use of clients is no longer supported - some keywords are no longer supported (e.g. HASSE_DIAGRAM) ------------------ 0.7.9 (2013-10-27) - support for two "next-generation" keywords: - "FACES" calls "HASSE_DIAGRAM->FACES" - "DIMS" calls "HASSE_DIAGRAM->DIMS" these two keywords cannot be used with old versions of polymake. - test changed: tests of unsupported features in recent polymake versions removed (clients, some keywords), "FACES DIMS" tested. ------------------ 0.7.8 (2010-06-03) ------------------ 0.7.7: - package homepage changed ------------------ 0.7.6 (2008-12-02) - bug fixed in SetPolymakeClientPaths - ClearPolymakeObject and CreatePolymakeObject can now be called with application and version information which will then be written to the new file. - Package moved from Galway to Kaiserslautern ------------------ 0.7.5 (2008-08-13) - changes in README.polymaking (thanks to Andreas Distler) - changed subtitle to something more descriptive ------------------ 0.7.4 (2008-07-16) - fixed the "warning on startup" bug - test file written ------------------ 0.7.3 (2008-05-12) - fixed an embarrassing bug. Now HASSE_DIAGRAM really does what it should. ------------------ 0.7.2: ATTENTION! change in output type: - Polymake(poly,"HASSE_DIAGRAM") now returns a record instead of a list. This change was necessary to make HASSE_DIAGRAM work with simplicial complexes. New features: - polymaking is now supporting some clients via PolymakeClient - variable POLYMAKE_LAST_FAIL_REASON introduced. It should contain information abut the reason of the last returned . Changes to existing methods: - Method Polymake rewritten - polymaking now returns an error if polymake returns one - Change in SplitPolymakeOutputStringIntoBlocks: keywords are now recognised by starting with an upper chase character and consisting of uppercase letters, numbers and "_" only. - PolymakeObjects now print their description instead of just if they know it. Converter things: - ConvertPolymakeBoolToGAP now also accepts "true" and "false" - converter ConvertPolymakeDescriptionToGAP added. - converter ConvertPolymakeMatrixOrListOfSetsToGAP added (for things like FACETS that exist in the polytope and topaz world) - converter ConvertPolymakeIntVectorToGAPPlusOne added. - A few more entries added to ObjectConverters (now supporting 105 keywords) Converter method assignment changed for: GRAPH, DUAL_GRAPH, FACETS, ------------------ 0.7.1 (2008-03-07) - polymaking now suggests GAPdoc - changed the way POLYMAKE_COMMAND is determined (thanks to Andreas Distler) polymaking now tries to guess the location of polymake using the system path variable via DirectoriesSystemPrograms(). - documentation now includes a couple of comments on the installation of polymake. ------------------ 0.7.0: - Package is now called "polymaking" instead of "polymake" to avoid confusion. - Added a few converters (FAR_HYPERPLANE, N_01POINTS, REL_INT_POINT) ------------------ 0.6.3: - changed PackageInfo.g to point to the new homepage - minor changes to the installation instructions in README.polymake and the manual. - ----------------- 0.6.2: - some changes in the manual. - AppendToPolymakeObject now has a 3-argument version to be called like AppendToPolymakeObject(poly,"KEYWORD","datastring"); - the converter for HASSE_DIAGRAM now returns a list of sets of triples of sets rather than the strange record. To be precise, only the ".hasse" part of the old version is returned. - set global variables POLYMAKE_PROGRAM and POLYMAKE_DATA_DIR to "read only" status (thanks to Alexander Konovalov for this hint). ------------------ 0.6.1: - more converters added to ObjectConverters.gi - PolymakeObject is not longer a sub category of Record. - added AppendInequalitiesToPolymakeObject for convenience ------------------ 0.6: - Added a few object converters and removed a - Rewrote most of the documentation ------------------ 0.5: - package does no longer depend on the IO package. - Conversion method for HASSE_DIAGRAM changed. Output has also changed and is not compatible with earlier versions. - Polymake can now be called with several keywords. In this case, fail is returned but the record is updated. If a part of the returned values are fail, these are not updated in the polygon record (but the others are!). Any line of polymake output starting with a capital letter will be treated as a line containing a single keyword. - Conversion method for FACE_LATTICE added. - The objects now have their own type "PolymakeObject". Lots of functions for manipulating them have been added. ------------------ 0.3: - Changes in CreatePolygon: can now take an existing directory as an argument, Change in naming convention for generated file. Number is appended if a file with the same name exists (can happen, if CreatePolygon(dir) is called several times without other calculations between the calls) ------------------ 0.2: - added conversion functions for polymake output. ------------------ 0.1: - packages started with very limited functionality ------------------ polymaking-0.8.6/doc/0000755000076600000240000000000014071427117013457 5ustar mhornstaffpolymaking-0.8.6/doc/manual.six0000644000076600000240000002401214071427117015460 0ustar mhornstaff#SIXFORMAT GapDocGAP HELPBOOKINFOSIXTMP := rec( encoding := "UTF-8", bookname := "polymaking", entries := [ [ "Title page", ".", [ 0, 0, 0 ], 1, 1, "title page", "X7D2C85EC87DD46E5" ], [ "Abstract", ".-1", [ 0, 0, 1 ], 23, 2, "abstract", "X7AA6C5737B711C89" ], [ "Copyright", ".-2", [ 0, 0, 2 ], 30, 2, "copyright", "X81488B807F2A1CF1" ], [ "Acknowledgements", ".-3", [ 0, 0, 3 ], 39, 2, "acknowledgements", "X82A988D47DFAFCFA" ], [ "Table of Contents", ".-4", [ 0, 0, 4 ], 44, 3, "table of contents", "X8537FEB07AF2BEC8" ], [ "\033[1X\033[33X\033[0;-2YInstallation and Preface\033[133X\033[101X", "1", [ 1, 0, 0 ], 1, 4, "installation and preface", "X8794FBB27B46C08E" ], [ "\ 033[1X\033[33X\033[0;-2YA few words about the installation of polymake\033[133\ X\033[101X", "1.1", [ 1, 1, 0 ], 25, 4, "a few words about the installation of polymake", "X7A02C64B7A3777FF" ], [ "\ 033[1X\033[33X\033[0;-2YSetting variables for external programs\033[133X\033[1\ 01X", "1.2", [ 1, 2, 0 ], 36, 4, "setting variables for external programs", "X851C596486F918F0" ], [ "\033[1X\033[33X\033[0;-2YSetting variables permanently\033[133X\033[101X", "1.2-3", [ 1, 2, 3 ], 59, 5, "setting variables permanently", "X7943B579846BDB76" ], [ "\033[1X\033[33X\033[0;-2YPolymake interaction\033[133X\033[101X", "2", [ 2, 0, 0 ], 1, 6, "polymake interaction", "X86C82DCF81362F41" ], [ "\033[1X\033[33X\033[0;-2YCreating Polymake Objects\033[133X\033[101X", "2.1", [ 2, 1, 0 ], 4, 6, "creating polymake objects", "X83D426D5855D1FD6" ], [ "\033[1X\033[33X\033[0;-2YAccessing Properties of Polymake Objects\033[133X\ \033[101X", "2.2", [ 2, 2, 0 ], 73, 7, "accessing properties of polymake objects", "X7D9EBB0383B9BD1C" ], [ "\ 033[1X\033[33X\033[0;-2YExample: Creating and Accessing Polymake Objects\033[1\ 33X\033[101X", "2.3", [ 2, 3, 0 ], 133, 8, "example: creating and accessing polymake objects", "X7CEF475187927AEA" ], [ "\033[1X\033[33X\033[0;-2YWriting to Polymake Objects\033[133X\033[101X", "2.4", [ 2, 4, 0 ], 169, 9, "writing to polymake objects", "X87BEE1B37D9F1F5E" ], [ "\ 033[1X\033[33X\033[0;-2YCalling Polymake and converting its output\033[133X\ \033[101X", "2.5", [ 2, 5, 0 ], 259, 10, "calling polymake and converting its output", "X8468E0E381642B14" ], [ "\033[1X\033[33X\033[0;-2YAn Example\033[133X\033[101X", "2.6", [ 2, 6, 0 ], 300, 11, "an example", "X7B5623E3821CC0D0" ], [ "\033[1X\033[33X\033[0;-2YGlobal Variables\033[133X\033[101X", "3", [ 3, 0, 0 ], 1, 13, "global variables", "X7D9044767BEB1523" ], [ "\ 033[1X\033[33X\033[0;-2YGetting information about polymake output\033[133X\033\ [101X", "3.1", [ 3, 1, 0 ], 4, 13, "getting information about polymake output" , "X86AC0C6B807BEBDE" ], [ "\ 033[1X\033[33X\033[0;-2YVariables for system interaction\033[133X\033[101X", "3.2", [ 3, 2, 0 ], 22, 13, "variables for system interaction", "X7B786DAF80136FF4" ], [ "\033[1X\033[33X\033[0;-2YConverting Polymake Output\033[133X\033[101X", "4", [ 4, 0, 0 ], 1, 15, "converting polymake output", "X7D23E80E841CDD67" ], [ "\033[1X\033[33X\033[0;-2YThe General Method\033[133X\033[101X", "4.1", [ 4, 1, 0 ], 4, 15, "the general method", "X862D57D87A244DE2" ], [ "\033[1X\033[33X\033[0;-2YConverter- Philosopy\033[133X\033[101X", "4.1-1", [ 4, 1, 1 ], 25, 15, "converter- philosopy", "X7CDBEA427EE69C71" ], [ "\033[1X\033[33X\033[0;-2YConversion Functions\033[133X\033[101X", "4.2", [ 4, 2, 0 ], 80, 16, "conversion functions", "X7FF4170183C83CC1" ], [ "Bibliography", "bib", [ "Bib", 0, 0 ], 1, 19, "bibliography", "X7A6F98FD85F02BFE" ], [ "References", "bib", [ "Bib", 0, 0 ], 1, 19, "references", "X7A6F98FD85F02BFE" ], [ "Index", "ind", [ "Ind", 0, 0 ], 1, 20, "index", "X83A0356F839C696F" ], [ "\033[2XSetPolymakeDataDirectory\033[102X", "1.2-1", [ 1, 2, 1 ], 44, 5, "setpolymakedatadirectory", "X794A38E981F9E76F" ], [ "\033[2XSetPolymakeCommand\033[102X", "1.2-2", [ 1, 2, 2 ], 52, 5, "setpolymakecommand", "X854645287BC9303E" ], [ "\033[2XCreateEmptyFile\033[102X", "2.1-1", [ 2, 1, 1 ], 17, 6, "createemptyfile", "X7C87B1807E036A85" ], [ "\033[2XCreatePolymakeObject\033[102X", "2.1-2", [ 2, 1, 2 ], 25, 6, "createpolymakeobject", "X8625E7E2845F1634" ], [ "\033[2XCreatePolymakeObject\033[102X", "2.1-2", [ 2, 1, 2 ], 25, 6, "createpolymakeobject", "X8625E7E2845F1634" ], [ "\033[2XCreatePolymakeObject\033[102X", "2.1-2", [ 2, 1, 2 ], 25, 6, "createpolymakeobject", "X8625E7E2845F1634" ], [ "\033[2XCreatePolymakeObject\033[102X", "2.1-2", [ 2, 1, 2 ], 25, 6, "createpolymakeobject", "X8625E7E2845F1634" ], [ "\033[2XCreatePolymakeObject\033[102X", "2.1-2", [ 2, 1, 2 ], 25, 6, "createpolymakeobject", "X8625E7E2845F1634" ], [ "\033[2XCreatePolymakeObject\033[102X", "2.1-2", [ 2, 1, 2 ], 25, 6, "createpolymakeobject", "X8625E7E2845F1634" ], [ "\033[2XCheckAppVerTypList\033[102X", "2.1-3", [ 2, 1, 3 ], 48, 7, "checkappvertyplist", "X8135E88E87DD1551" ], [ "\033[2XCreatePolymakeObjectFromFile\033[102X", "2.1-4", [ 2, 1, 4 ], 59, 7, "createpolymakeobjectfromfile", "X7801F05A81E23EED" ], [ "\033[2XCreatePolymakeObjectFromFile\033[102X", "2.1-4", [ 2, 1, 4 ], 59, 7, "createpolymakeobjectfromfile", "X7801F05A81E23EED" ], [ "\033[2XDirectoryOfPolymakeObject\033[102X", "2.2-1", [ 2, 2, 1 ], 85, 7, "directoryofpolymakeobject", "X86D967C684B27108" ], [ "\033[2XFilenameOfPolymakeObject\033[102X", "2.2-2", [ 2, 2, 2 ], 92, 7, "filenameofpolymakeobject", "X87470AB079A2F550" ], [ "\033[2XFullFilenameOfPolymakeObject\033[102X", "2.2-3", [ 2, 2, 3 ], 101, 8, "fullfilenameofpolymakeobject", "X809D309F7D31DD2C" ], [ "\033[2XNamesKnownPropertiesOfPolymakeObject\033[102X", "2.2-4", [ 2, 2, 4 ], 109, 8, "namesknownpropertiesofpolymakeobject", "X850B38F27F1BF7E8" ], [ "\033[2XKnownPropertiesOfPolymakeObject\033[102X", "2.2-5", [ 2, 2, 5 ], 118, 8, "knownpropertiesofpolymakeobject", "X7D79C5F1817041C5" ], [ "\033[2XPropertyOfPolymakeObject\033[102X", "2.2-6", [ 2, 2, 6 ], 126, 8, "propertyofpolymakeobject", "X7E538D1B7898C8E6" ], [ "\033[2XAppendToPolymakeObject\033[102X", "2.4-1", [ 2, 4, 1 ], 176, 9, "appendtopolymakeobject", "X785DCA4487F168F8" ], [ "\033[2XAppendPointlistToPolymakeObject\033[102X", "2.4-2", [ 2, 4, 2 ], 189, 9, "appendpointlisttopolymakeobject", "X7F5326338033B57C" ], [ "\033[2XAppendVertexlistToPolymakeObject\033[102X", "2.4-3", [ 2, 4, 3 ], 200, 9, "appendvertexlisttopolymakeobject", "X7E150BA67CEBC00E" ], [ "\033[2XAppendInequalitiesToPolymakeObject\033[102X", "2.4-4", [ 2, 4, 4 ], 208, 9, "appendinequalitiestopolymakeobject", "X7EBE5FB284FBFFE6" ], [ "\033[2XConvertMatrixToPolymakeString\033[102X", "2.4-5", [ 2, 4, 5 ], 217, 10, "convertmatrixtopolymakestring", "X83DC7FC280731B04" ], [ "\033[2XClearPolymakeObject\033[102X", "2.4-6", [ 2, 4, 6 ], 227, 10, "clearpolymakeobject", "X804AAE4882743E91" ], [ "\033[2XClearPolymakeObject\033[102X", "2.4-6", [ 2, 4, 6 ], 227, 10, "clearpolymakeobject", "X804AAE4882743E91" ], [ "\033[2XWriteKnownPropertyToPolymakeObject\033[102X", "2.4-7", [ 2, 4, 7 ], 243, 10, "writeknownpropertytopolymakeobject", "X840C02CD815FF766" ], [ "\033[2XUnbindKnownPropertyOfPolymakeObject\033[102X", "2.4-8", [ 2, 4, 8 ], 252, 10, "unbindknownpropertyofpolymakeobject", "X7A3FF18C7FD1A626" ], [ "\033[2XPolymake\033[102X", "2.5-1", [ 2, 5, 1 ], 262, 10, "polymake", "X7DBA99E87EC51D53" ], [ "\033[2XInfoPolymaking\033[102X", "3.1-1", [ 3, 1, 1 ], 7, 13, "infopolymaking", "X85BA7A3D7C698B68" ], [ "\033[2XPOLYMAKE_LAST_FAIL_REASON\033[102X", "3.1-2", [ 3, 1, 2 ], 15, 13, "polymake_last_fail_reason", "X79E1C63D8516D334" ], [ "\033[2XPOLYMAKE_COMMAND\033[102X", "3.2-1", [ 3, 2, 1 ], 31, 13, "polymake_command", "X7B35A5217C8C7B04" ], [ "\033[2XPOLYMAKE_DATA_DIR\033[102X", "3.2-2", [ 3, 2, 2 ], 39, 13, "polymake_data_dir", "X7C07B16B873BA46D" ], [ "\033[2XConvertPolymakeOutputToGapNotation\033[102X", "4.1-2", [ 4, 1, 2 ], 44, 15, "convertpolymakeoutputtogapnotation", "X7EB6D80C816CF667" ], [ "\033[2XSplitPolymakeOutputStringIntoBlocks\033[102X", "4.1-3", [ 4, 1, 3 ], 58, 16, "splitpolymakeoutputstringintoblocks", "X841D81327C6F6E29" ], [ "\033[2XObjectConverters\033[102X", "4.1-4", [ 4, 1, 4 ], 68, 16, "objectconverters", "X83199F737F4BE4FD" ], [ "\033[2XConvertPolymakeNumber\033[102X", "4.2-1", [ 4, 2, 1 ], 86, 16, "convertpolymakenumber", "X7FC98443862DB83F" ], [ "\033[2XConvertPolymakeScalarToGAP\033[102X", "4.2-2", [ 4, 2, 2 ], 94, 16, "convertpolymakescalartogap", "X7F2A1C2C808E4A07" ], [ "\033[2XConvertPolymakeMatrixOrListOfSetsToGAP\033[102X", "4.2-3", [ 4, 2, 3 ], 101, 16, "convertpolymakematrixorlistofsetstogap", "X82A7FF9983EB61E2" ], [ "\033[2XConvertPolymakeMatrixOrListOfSetsToGAPPlusOne\033[102X", "4.2-3", [ 4, 2, 3 ], 101, 16, "convertpolymakematrixorlistofsetstogapplusone", "X82A7FF9983EB61E2" ], [ "\033[2XConvertPolymakeMatrixToGAP\033[102X", "4.2-4", [ 4, 2, 4 ], 112, 17, "convertpolymakematrixtogap", "X817C6B4180BF6365" ], [ "\033[2XConvertPolymakeMatrixToGAPKillOnes\033[102X", "4.2-4", [ 4, 2, 4 ], 112, 17, "convertpolymakematrixtogapkillones", "X817C6B4180BF6365" ], [ "\033[2XConvertPolymakeVectorToGAP\033[102X", "4.2-5", [ 4, 2, 5 ], 120, 17, "convertpolymakevectortogap", "X85F7F6787D346CC0" ], [ "\033[2XConvertPolymakeVectorToGAPKillOne\033[102X", "4.2-5", [ 4, 2, 5 ], 120, 17, "convertpolymakevectortogapkillone", "X85F7F6787D346CC0" ], [ "\033[2XConvertPolymakeIntVectorToGAPPlusOne\033[102X", "4.2-5", [ 4, 2, 5 ], 120, 17, "convertpolymakeintvectortogapplusone", "X85F7F6787D346CC0" ], [ "\033[2XConvertPolymakeBoolToGAP\033[102X", "4.2-6", [ 4, 2, 6 ], 130, 17, "convertpolymakebooltogap", "X87B6F9867EE800C7" ], [ "\033[2XConvertPolymakeSetToGAP\033[102X", "4.2-7", [ 4, 2, 7 ], 137, 17, "convertpolymakesettogap", "X846B284085825FEA" ], [ "\033[2XConvertPolymakeListOfSetsToGAP\033[102X", "4.2-8", [ 4, 2, 8 ], 145, 17, "convertpolymakelistofsetstogap", "X7E7886D68356F592" ], [ "\033[2XConvertPolymakeListOfSetsToGAPPlusOne\033[102X", "4.2-8", [ 4, 2, 8 ], 145, 17, "convertpolymakelistofsetstogapplusone", "X7E7886D68356F592" ], [ "\033[2XConvertPolymakeGraphToGAP\033[102X", "4.2-9", [ 4, 2, 9 ], 155, 18, "convertpolymakegraphtogap", "X7EBECAA07F8B58D8" ] ] ); polymaking-0.8.6/doc/chapBib_mj.html0000644000076600000240000000465614071427117016376 0ustar mhornstaff GAP (polymaking) - References

Goto Chapter: Top 1 2 3 4 Bib Ind
 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 

References

[GJ] Gawrilow, E. and Joswig, M., polymake, \URL{http://polymake.org/}.

 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 
Goto Chapter: Top 1 2 3 4 Bib Ind

generated by GAPDoc2HTML

polymaking-0.8.6/doc/chap0_mj.html0000644000076600000240000003072414071427117016034 0ustar mhornstaff GAP (polymaking) - Contents
Goto Chapter: Top 1 2 3 4 Bib Ind
 [Top of Book]  [Contents]   [Next Chapter] 

polymaking

Interfacing the geometry software polymake

Version 0.8.6

8 July 2021

Marc Roeder
Email: roeder.marc@gmail.com

Abstract

This package provides a very basic interface to the polymake program by Ewgenij Gawrilow, Michael Joswig et al. [GJ]. The polymake program itself is not included.

Copyright

© 2007--2013 Marc Roeder.

This package is distributed under the terms of the GNU General Public License version 2 or later (at your convenience). See the file "LICENSE" or https://www.gnu.org/copyleft/gpl.html

Acknowledgements

This work has been supported by Marie Curie Grant No. MTKD-CT-2006-042685

Contents

1 Installation and Preface
2 Polymake interaction
3 Global Variables
4 Converting Polymake Output
References
Index

 [Top of Book]  [Contents]   [Next Chapter] 
Goto Chapter: Top 1 2 3 4 Bib Ind

generated by GAPDoc2HTML

polymaking-0.8.6/doc/chap2.html0000644000076600000240000007506114071427117015353 0ustar mhornstaff GAP (polymaking) - Chapter 2: Polymake interaction
Goto Chapter: Top 1 2 3 4 Bib Ind
 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 

2 Polymake interaction
 2.1 Creating Polymake Objects
 2.2 Accessing Properties of Polymake Objects
 2.3 Example: Creating and Accessing Polymake Objects
 2.4 Writing to Polymake Objects
 2.5 Calling Polymake and converting its output
 2.6 An Example

2 Polymake interaction

2.1 Creating Polymake Objects

The interaction with the polymake program is done via files. A PolymakeObject is mainly a pointer to a file and a list of known properties of the object. These properties need not be stored in the file. Whenever polymake is called, the returned value is read from standard output and stored in the PolymakeObject corresponding to the file for which polymake is called. The files for polymake are written in the old (non-xml) format. The first run of polymake converts them into the new (xml) format. This means that changes to the file by means of the methods outlined below after the first run of polymake will probably lead to corrupted files.

2.1-1 CreateEmptyFile
‣ CreateEmptyFile( filename )( method )

Returns: nothing

Creates an empty file with name filename. Note that filename has to include the full path and the directory for the file must exist.

2.1-2 CreatePolymakeObject
‣ CreatePolymakeObject( )( method )
‣ CreatePolymakeObject( appvertyp )( method )
‣ CreatePolymakeObject( dir )( method )
‣ CreatePolymakeObject( dir, appvertyp )( method )
‣ CreatePolymakeObject( prefix, dir )( method )
‣ CreatePolymakeObject( prefix, dir, appvertyp )( method )

Returns: PolymakeObject

If called without arguments, this method generates an empty file in the directory defined by POLYMAKE_DATA_DIR (3.2-2). If a directory dir is given (this directory must exist), an empty file is generated in this directory. If prefix is not given, the file is called polyN where N is the current runtime. If a file of this name already exists, a number is appended separated by a dot (example: "poly1340" and "poly1340.1"). If prefix is given, the filename starts with this prefix. Optionally, the file can be generated with a header specifying application, version and type of the object. This is done by passing the triple of strings appvertyp to CreatePolymakeObject. A valid triple is ["polytope","2.3","RationalPolytope"]. Validity is checked by CheckAppVerTypList (2.1-3).

2.1-3 CheckAppVerTypList
‣ CheckAppVerTypList( appvertyp )( method )

Returns: bool

Checks if the triple arppvertyp of strings specifies an application and type of polymake version 2.3. More specifically, the first entry has to be an application from ["polytope","surface","topaz"] and the third entry has to be a type corresponding to the application given in the first entry. The second entry is not checked.

2.1-4 CreatePolymakeObjectFromFile
‣ CreatePolymakeObjectFromFile( filename )( method )
‣ CreatePolymakeObjectFromFile( dir, filename )( method )

Returns: PolymakeObject

This method generates a PolymakeObject corresponding to the file filename in the directory dir. If dir is not given, the POLYMAKE_DATA_DIR is used.If no file with name filename exists in dir (or POLYMAKE_DATA_DIR, respectively), an empty file is created. Note that the contents of the file do not matter for the generation of the object. In particular, the object does not know any of the properties that might be encoded in the file. The only way to transfer information from files to PolymakeObjects is via Polymake (2.5-1).

2.2 Accessing Properties of Polymake Objects

A PolymakeObject contains information about the directory of its file, the name of its file and about properties calculated by calling Polymake (2.5-1). The properties returned by the polymake program are stored under the name polymake assigns to them (that is, the name of the data block in the corresponding file). The following methods can be used to access the information stored in a PolymakeObject. But be careful! All functions return the actual object. No copies are made. So if you change one of the returned objects, you change the PolymakeObject itself.

2.2-1 DirectoryOfPolymakeObject
‣ DirectoryOfPolymakeObject( poly )( method )

Returns: Directory

Returns the directory of the file associated with poly.

2.2-2 FilenameOfPolymakeObject
‣ FilenameOfPolymakeObject( poly )( method )

Returns: String

Returns the name of the file associated with poly. This does only mean the name of the file, not the full path. For the full path and file name see FullFilenameOfPolymakeObject (2.2-3)

2.2-3 FullFilenameOfPolymakeObject
‣ FullFilenameOfPolymakeObject( poly )( method )

Returns: String

Returns the file associated with the PolymakeObject poly with its complete path.

2.2-4 NamesKnownPropertiesOfPolymakeObject
‣ NamesKnownPropertiesOfPolymakeObject( poly )( method )

Returns: List of Strings

Returns a list of the names of all known properties. This does only include the properties returned by Polymake (2.5-1), "dir" and "filename" are not included. If no properties are known, fail is returned.

2.2-5 KnownPropertiesOfPolymakeObject
‣ KnownPropertiesOfPolymakeObject( poly )( method )

Returns: Record

Returns the record of all known properties. If no properties are known, fail is returned.

2.2-6 PropertyOfPolymakeObject
‣ PropertyOfPolymakeObject( poly, name )( method )

Returns the value of the property name if it is known. If the value is not known, fail is returned. name must be a String.

2.3 Example: Creating and Accessing Polymake Objects

Suppose the file /tmp/threecube.poly contains the three dimensional cube in polymake form. Now generate a PolymakeObject from this file and call Polymake (2.5-1) to make the vertices of the cube known to the object.


### suppose we have a polymake file /tmp/threecube.poly
### containing a cube in three dimensions
gap> cube:=CreatePolymakeObjectFromFile(Directory("/tmp"),"threecube.poly");
<polymake object. No properties known>
gap> FilenameOfPolymakeObject(cube);
"threecube.poly"
gap> FullFilenameOfPolymakeObject(cube);
"/tmp/threecube.poly"
   #nothing is known about the cube:
gap> NamesKnownPropertiesOfPolymakeObject(cube);  
fail
gap> Polymake(cube,"VERTICES");
[ [ -1, -1, -1 ], [ 1, -1, -1 ], [ -1, 1, -1 ], [ 1, 1, -1 ], [ -1, -1, 1 ], 
  [ 1, -1, 1 ], [ -1, 1, 1 ], [ 1, 1, 1 ] ]  
   # Now <cube> knows its vertices:
gap> Print(cube);
<polymake object threecube.poly. Properties known: [ "VERTICES" ]>
gap> PropertyOfPolymakeObject(cube,"VERTICES");
[ [ -1, -1, -1 ], [ 1, -1, -1 ], [ -1, 1, -1 ], [ 1, 1, -1 ], [ -1, -1, 1 ],
  [ 1, -1, 1 ], [ -1, 1, 1 ], [ 1, 1, 1 ] ]
gap> KnownPropertiesOfPolymakeObject(cube);
rec(
  VERTICES := [ [ -1, -1, -1 ], [ 1, -1, -1 ], [ -1, 1, -1 ], [ 1, 1, -1 ],
      [ -1, -1, 1 ], [ 1, -1, 1 ], [ -1, 1, 1 ], [ 1, 1, 1 ] ] )

2.4 Writing to Polymake Objects

To transfer data from GAP to polymake, the following methods can be used. But bear in mind that none of these functions test if the resulting polymake file is still consistent.

2.4-1 AppendToPolymakeObject
‣ AppendToPolymakeObject( poly, string )( method )

Returns: nothing

This appends the string string to the file associated to the PolymakeObject poly. It is not tested if the string is syntactically correct as a part of a polymake file. It is also not tested if the string is compatible with the data already contained in the file.

INEQUALITIES, POINTS and VERTICES can be appended to a polymake object using the following functions:

2.4-2 AppendPointlistToPolymakeObject
‣ AppendPointlistToPolymakeObject( poly, pointlist )( method )

Returns: nothing

Takes a list pointlist of vectors and converts it into a string which represents a polymake block labeled "POINTS". This string is then added to the file associated with poly. The "POINTS" block of the file associated with poly then contains points with leading ones, as polymake uses affine notation.

2.4-3 AppendVertexlistToPolymakeObject
‣ AppendVertexlistToPolymakeObject( poly, pointlist )( method )

Returns: nothing

Does the same as AppendPointlistToPolymakeObject, but with "VERTICES" instead of "POINTS".

2.4-4 AppendInequalitiesToPolymakeObject
‣ AppendInequalitiesToPolymakeObject( poly, ineqlist )( method )

Returns: nothing

Just appends the inequalities given in ineqlist to the polymake object poly (with caption "INEQUALITIES"). Note that this does not check if an "INEQUALITIES" section does already exist in the file associated with poly.

2.4-5 ConvertMatrixToPolymakeString
‣ ConvertMatrixToPolymakeString( name, matrix )( method )

Returns: String

This function takes a matrix matrix and converts it to a string. This string can then be appended to a polymake file via AppendToPolymakeObject (2.4-1) to form a block of data labeled name. This may be used to write blocks like INEQUALITIES or FACETS.

2.4-6 ClearPolymakeObject
‣ ClearPolymakeObject( poly )( method )
‣ ClearPolymakeObject( poly, appvertyp )( method )

Returns: nothing

Deletes all known properties of the PolymakeObject poly and replaces its file with an empty one.
If the triple of strings appvertyp specifying application, version and type (see CheckAppVerTypList (2.1-3)) is given, the file is replaced with a file that contains only a header specifying application, version and type of the polymake object.

There are also methods to manipulate the known values without touching the file of the PolymakeObject:

2.4-7 WriteKnownPropertyToPolymakeObject
‣ WriteKnownPropertyToPolymakeObject( poly, name, data )( method )

Takes the object data and writes it to the known properties section of the PolymakeObject poly. The string name is used as the name of the property. If a property with that name already exists, it is overwritten. Again, there is no check if data is consistent, correct or meaningful.

2.4-8 UnbindKnownPropertyOfPolymakeObject
‣ UnbindKnownPropertyOfPolymakeObject( poly, name )( method )

If the PolymakeObject poly has a property with name name, that property is unbound. If there is no such property, fail is returned.

2.5 Calling Polymake and converting its output

2.5-1 Polymake
‣ Polymake( poly, option: PolymakeNolookup )( method )

This method calls the polymake program (see POLYMAKE_COMMAND (3.2-1)) with the option option. You may use several keywords such as "FACETS VERTICES" as an option. The returned value is cut into blocks starting with keywords (which are taken from output and not looked up in option). Each block is then interpreted and translated into GAP readable form. This translation is done using the functions given in ObjectConverters (4.1-4). The first line of each block of polymake output is taken as a keyword and the according entry in ObjectConverters (4.1-4) is called to convert the block into GAP readable form. If no conversion function is known, an info string is printed and fail is returned. If only one keyword has been given as option, Polymake returns the result of the conversion operation. If more than one keyword has been given or the output consists of more than one block, Polymake returns fail. In any case, the calculated values for each block are stored as known properties of the PolymakeObject poly as long as they are not fail. If Polymake is called with an option that corresponds to a name of a known property of poly, the known property is returned. In this case, there is no call of the external program. (see below for suppression of this feature).

Note that the command Polymake returns fail if nothing is returned by the program polymake or more than one block of data is returned. For example, the returned value of Polymake(poly,"VISUAL") is always fail. Likewise, Polymake(poly,"POINTS VERTICES") will return fail (but may add new known properties to poly). For a description of the conversion functions, see chapter 4.

If the option PolymakeNolookup is set to anything else than false, the polymake program is called even if poly already has a known property with name option.

Note that whenever Polymake returns fail, a description of the problem is stored in POLYMAKE_LAST_FAIL_REASON (3.1-2). If you call Polymake with more than one keyword, POLYMAKE_LAST_FAIL_REASON (3.1-2) is changed before polymake is called. So any further reason to return fail will overwrite it.

2.6 An Example

Let's generate a three dimensional permutahedron.

    
    gap> S:=SymmetricGroup(3);
    Sym( [ 1 .. 3 ] )
    gap> v:=[1,2,3];
    [ 1, 2, 3 ]
    gap> points:=Orbit(S,v,Permuted);;
    gap> permutahedron:=CreatePolymakeObject();
    <polymake object. No properties known>
    gap> AppendPointlistToPolymakeObject(permutahedron,points);
    gap> Polymake(permutahedron,"VOLUME");
    3
    gap> Polymake(permutahedron,"N_VERTICES");
    6
          #Now <permutahedron> knows its number of vertices, but not the vertices:
    gap> PropertyOfPolymakeObject(permutahedron,"VERTICES");
    fail
    gap> NamesKnownPropertiesOfPolymakeObject(permutahedron);
    [ "VOLUME", "N_VERTICES" ]
        #Let's look at the object!
    gap> Polymake(permutahedron,"VISUAL");
    #I  There was no or wrong polymake output
    fail
    gap> Polymake(permutahedron,"DIM");
    2
    
    
 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 
Goto Chapter: Top 1 2 3 4 Bib Ind

generated by GAPDoc2HTML

polymaking-0.8.6/doc/polymaking.toc0000644000076600000240000001554114071427117016346 0ustar mhornstaff\contentsline {chapter}{\numberline {1}\leavevmode {\color {Chapter }Installation and Preface}}{4}{chapter.1} \contentsline {section}{\numberline {1.1}\leavevmode {\color {Chapter }A few words about the installation of polymake}}{4}{section.1.1} \contentsline {section}{\numberline {1.2}\leavevmode {\color {Chapter }Setting variables for external programs}}{4}{section.1.2} \contentsline {subsection}{\numberline {1.2.1}\leavevmode {\color {Chapter }SetPolymakeDataDirectory}}{5}{subsection.1.2.1} \contentsline {subsection}{\numberline {1.2.2}\leavevmode {\color {Chapter }SetPolymakeCommand}}{5}{subsection.1.2.2} \contentsline {subsection}{\numberline {1.2.3}\leavevmode {\color {Chapter }Setting variables permanently}}{5}{subsection.1.2.3} \contentsline {chapter}{\numberline {2}\leavevmode {\color {Chapter }Polymake interaction}}{6}{chapter.2} \contentsline {section}{\numberline {2.1}\leavevmode {\color {Chapter }Creating Polymake Objects}}{6}{section.2.1} \contentsline {subsection}{\numberline {2.1.1}\leavevmode {\color {Chapter }CreateEmptyFile}}{6}{subsection.2.1.1} \contentsline {subsection}{\numberline {2.1.2}\leavevmode {\color {Chapter }CreatePolymakeObject}}{6}{subsection.2.1.2} \contentsline {subsection}{\numberline {2.1.3}\leavevmode {\color {Chapter }CheckAppVerTypList}}{7}{subsection.2.1.3} \contentsline {subsection}{\numberline {2.1.4}\leavevmode {\color {Chapter }CreatePolymakeObjectFromFile}}{7}{subsection.2.1.4} \contentsline {section}{\numberline {2.2}\leavevmode {\color {Chapter }Accessing Properties of Polymake Objects}}{7}{section.2.2} \contentsline {subsection}{\numberline {2.2.1}\leavevmode {\color {Chapter }DirectoryOfPolymakeObject}}{7}{subsection.2.2.1} \contentsline {subsection}{\numberline {2.2.2}\leavevmode {\color {Chapter }FilenameOfPolymakeObject}}{7}{subsection.2.2.2} \contentsline {subsection}{\numberline {2.2.3}\leavevmode {\color {Chapter }FullFilenameOfPolymakeObject}}{8}{subsection.2.2.3} \contentsline {subsection}{\numberline {2.2.4}\leavevmode {\color {Chapter }NamesKnownPropertiesOfPolymakeObject}}{8}{subsection.2.2.4} \contentsline {subsection}{\numberline {2.2.5}\leavevmode {\color {Chapter }KnownPropertiesOfPolymakeObject}}{8}{subsection.2.2.5} \contentsline {subsection}{\numberline {2.2.6}\leavevmode {\color {Chapter }PropertyOfPolymakeObject}}{8}{subsection.2.2.6} \contentsline {section}{\numberline {2.3}\leavevmode {\color {Chapter }Example: Creating and Accessing Polymake Objects}}{8}{section.2.3} \contentsline {section}{\numberline {2.4}\leavevmode {\color {Chapter }Writing to Polymake Objects}}{9}{section.2.4} \contentsline {subsection}{\numberline {2.4.1}\leavevmode {\color {Chapter }AppendToPolymakeObject}}{9}{subsection.2.4.1} \contentsline {subsection}{\numberline {2.4.2}\leavevmode {\color {Chapter }AppendPointlistToPolymakeObject}}{9}{subsection.2.4.2} \contentsline {subsection}{\numberline {2.4.3}\leavevmode {\color {Chapter }AppendVertexlistToPolymakeObject}}{9}{subsection.2.4.3} \contentsline {subsection}{\numberline {2.4.4}\leavevmode {\color {Chapter }AppendInequalitiesToPolymakeObject}}{9}{subsection.2.4.4} \contentsline {subsection}{\numberline {2.4.5}\leavevmode {\color {Chapter }ConvertMatrixToPolymakeString}}{10}{subsection.2.4.5} \contentsline {subsection}{\numberline {2.4.6}\leavevmode {\color {Chapter }ClearPolymakeObject}}{10}{subsection.2.4.6} \contentsline {subsection}{\numberline {2.4.7}\leavevmode {\color {Chapter }WriteKnownPropertyToPolymakeObject}}{10}{subsection.2.4.7} \contentsline {subsection}{\numberline {2.4.8}\leavevmode {\color {Chapter }UnbindKnownPropertyOfPolymakeObject}}{10}{subsection.2.4.8} \contentsline {section}{\numberline {2.5}\leavevmode {\color {Chapter }Calling Polymake and converting its output}}{10}{section.2.5} \contentsline {subsection}{\numberline {2.5.1}\leavevmode {\color {Chapter }Polymake}}{10}{subsection.2.5.1} \contentsline {section}{\numberline {2.6}\leavevmode {\color {Chapter }An Example}}{11}{section.2.6} \contentsline {chapter}{\numberline {3}\leavevmode {\color {Chapter }Global Variables}}{13}{chapter.3} \contentsline {section}{\numberline {3.1}\leavevmode {\color {Chapter }Getting information about polymake output}}{13}{section.3.1} \contentsline {subsection}{\numberline {3.1.1}\leavevmode {\color {Chapter }InfoPolymaking}}{13}{subsection.3.1.1} \contentsline {subsection}{\numberline {3.1.2}\leavevmode {\color {Chapter }POLYMAKE{\textunderscore }LAST{\textunderscore }FAIL{\textunderscore }REASON}}{13}{subsection.3.1.2} \contentsline {section}{\numberline {3.2}\leavevmode {\color {Chapter }Variables for system interaction}}{13}{section.3.2} \contentsline {subsection}{\numberline {3.2.1}\leavevmode {\color {Chapter }POLYMAKE{\textunderscore }COMMAND}}{13}{subsection.3.2.1} \contentsline {subsection}{\numberline {3.2.2}\leavevmode {\color {Chapter }POLYMAKE{\textunderscore }DATA{\textunderscore }DIR}}{13}{subsection.3.2.2} \contentsline {chapter}{\numberline {4}\leavevmode {\color {Chapter }Converting Polymake Output}}{15}{chapter.4} \contentsline {section}{\numberline {4.1}\leavevmode {\color {Chapter }The General Method}}{15}{section.4.1} \contentsline {subsection}{\numberline {4.1.1}\leavevmode {\color {Chapter }Converter- Philosopy}}{15}{subsection.4.1.1} \contentsline {subsection}{\numberline {4.1.2}\leavevmode {\color {Chapter }ConvertPolymakeOutputToGapNotation}}{15}{subsection.4.1.2} \contentsline {subsection}{\numberline {4.1.3}\leavevmode {\color {Chapter }SplitPolymakeOutputStringIntoBlocks}}{16}{subsection.4.1.3} \contentsline {subsection}{\numberline {4.1.4}\leavevmode {\color {Chapter }ObjectConverters}}{16}{subsection.4.1.4} \contentsline {section}{\numberline {4.2}\leavevmode {\color {Chapter }Conversion Functions}}{16}{section.4.2} \contentsline {subsection}{\numberline {4.2.1}\leavevmode {\color {Chapter }ConvertPolymakeNumber}}{16}{subsection.4.2.1} \contentsline {subsection}{\numberline {4.2.2}\leavevmode {\color {Chapter }ConvertPolymakeScalarToGAP}}{16}{subsection.4.2.2} \contentsline {subsection}{\numberline {4.2.3}\leavevmode {\color {Chapter }ConvertPolymakeMatrixOrListOfSetsToGAP}}{16}{subsection.4.2.3} \contentsline {subsection}{\numberline {4.2.4}\leavevmode {\color {Chapter }ConvertPolymakeMatrixToGAP}}{17}{subsection.4.2.4} \contentsline {subsection}{\numberline {4.2.5}\leavevmode {\color {Chapter }ConvertPolymakeVectorToGAP}}{17}{subsection.4.2.5} \contentsline {subsection}{\numberline {4.2.6}\leavevmode {\color {Chapter }ConvertPolymakeBoolToGAP}}{17}{subsection.4.2.6} \contentsline {subsection}{\numberline {4.2.7}\leavevmode {\color {Chapter }ConvertPolymakeSetToGAP}}{17}{subsection.4.2.7} \contentsline {subsection}{\numberline {4.2.8}\leavevmode {\color {Chapter }ConvertPolymakeListOfSetsToGAP}}{17}{subsection.4.2.8} \contentsline {subsection}{\numberline {4.2.9}\leavevmode {\color {Chapter }ConvertPolymakeGraphToGAP}}{18}{subsection.4.2.9} \contentsline {chapter}{References}{19}{chapter*.5} \contentsline {chapter}{Index}{20}{section*.6} polymaking-0.8.6/doc/chap3.html0000644000076600000240000001401414071427117015343 0ustar mhornstaff GAP (polymaking) - Chapter 3: Global Variables
Goto Chapter: Top 1 2 3 4 Bib Ind
 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 

3 Global Variables
 3.1 Getting information about polymake output
 3.2 Variables for system interaction

3 Global Variables

3.1 Getting information about polymake output

3.1-1 InfoPolymaking
‣ InfoPolymaking( info class )

If set to at least 2, the output of polymake is shown. At level 1, warnings are shown. This is the default. And at level 0, the polymake package remains silent.

3.1-2 POLYMAKE_LAST_FAIL_REASON
‣ POLYMAKE_LAST_FAIL_REASON( global variable )

Contains a string that explains the last occurence of fail as a return value of Polymake (2.5-1).

3.2 Variables for system interaction

The variables for interaction with the system are contained in the file environment.gi. Each of these variables has a function to set it, see 1.2. If POLYMAKE_COMMAND or POLYMAKE_DATA_DIR are set at startup, they are not overwritten. So if you don't want (or don't have the rights) to modify environment.gi, you can set the variables in your .gaprc file.

3.2-1 POLYMAKE_COMMAND
‣ POLYMAKE_COMMAND( global variable )

This variable should contain the name of the polymake program in the form as returned by Filename So a probable value is Filename(Directory("/usr/local/bin"),"polymake").

3.2-2 POLYMAKE_DATA_DIR
‣ POLYMAKE_DATA_DIR( global variable )

In this directory the files for polymake will be created. By default, this generates a temporary directory using DirectoryTemporary

 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 
Goto Chapter: Top 1 2 3 4 Bib Ind

generated by GAPDoc2HTML

polymaking-0.8.6/doc/chap1_mj.html0000644000076600000240000002007414071427117016032 0ustar mhornstaff GAP (polymaking) - Chapter 1: Installation and Preface
Goto Chapter: Top 1 2 3 4 Bib Ind
 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 

1 Installation and Preface
 1.1 A few words about the installation of polymake
 1.2 Setting variables for external programs

1 Installation and Preface

To install the package, just unpack it in your packages directory (usually ~/gap/pkg for local installation). To use polymaking, you need a working installation of the program polymake https://polymake.org. The package has been tested on linux and Mac OS X (10.4, 10.5 and 10.6). But it should be as platform independent as GAP and polymake.

The interaction with polymake is restricted to writing files and carrying out simple operations. These looked like
polymake file KEYWORD1 KEYWORD2 KEYWORD3
on the command line for polymake versions before 4. The keywords are polymake methods without arguments. Since polymake no longer supports this interface the polymaking package provides the script lib/pm_script_arg.pl to emulate this.
polymake ––script lib/pm_script_arg.pl KEYWORD1 KEYWORD2 KEYWORD3
Using custom scripts is not supported.
Every call to polymake will re-start the program anew. This causes considerable overhead. The number of calls to polymake is reduced by caching the results in the so-called PolymakeObject in GAP. As of polymaking version 0.8.0, old versions of polymake (i.e. versions before 2.7.9) are not supported anymore.

1.1 A few words about the installation of polymake

polymaking will try to guess the location of polymake. If this fails, a warning is issued at load time (InfoWarning level 1). Note that the guessing procedure is suppressed when POLYMAKE_COMMAND (3.2-1) is set manually (see 1.2-3).
setenv PATH ${PATH}:<your polymakepath>
The general rule is: If polymaking finds polymake by itself, there is nothing to worry about.

1.2 Setting variables for external programs

As polymaking uses the program polymake, it needs to know where this program lives. The communication with polymake is done by writing files for polymake and reading its output (as returned to standard output "the prompt"). Note that the interface does not read any polymake file.

1.2-1 SetPolymakeDataDirectory
‣ SetPolymakeDataDirectory( dir )( method )

Sets the directory in which all polymake files are created to dir. The standard place for these files is a temporary directory generated when the package is loaded. This manipulates POLYMAKE_DATA_DIR (3.2-2).

1.2-2 SetPolymakeCommand
‣ SetPolymakeCommand( command )( method )

Sets the name for the polymake program to command. This manipulates POLYMAKE_COMMAND (3.2-1).

1.2-3 Setting variables permanently

To permanently set the values of POLYMAKE_COMMAND (3.2-1), and POLYMAKE_DATA_DIR (3.2-2), add the lines

POLYMAKE_DATA_DIR:=Directory("/home/mypolymakedatadir");
POLYMAKE_COMMAND:=Filename(Directory("/home/mypolymakebindir/"),"polymake");

to your .gaprc file (see ???). Note that these have to be before the LoadPackage("polymaking"); line. Or you can change the values of the above variables by editing lib/environment.gi

 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 
Goto Chapter: Top 1 2 3 4 Bib Ind

generated by GAPDoc2HTML

polymaking-0.8.6/doc/title.xml0000644000076600000240000000221714071427114015321 0ustar mhornstaff polymaking Interfacing the geometry software polymake Version 0.8.6 Marc Roeder
roeder.marc@gmail.com
8 July 2021 This package provides a very basic interface to the polymake program by Ewgenij Gawrilow, Michael Joswig et al. . The polymake program itself is not included. ©right; 2007--2013 Marc Roeder.

This package is distributed under the terms of the GNU General Public License version 2 or later (at your convenience). See the file "LICENSE" or https://www.gnu.org/copyleft/gpl.html This work has been supported by Marie Curie Grant No. MTKD-CT-2006-042685 polymaking-0.8.6/doc/manual.js0000644000076600000240000001011314071427117015266 0ustar mhornstaff/* manual.js Frank Lübeck */ /* This file contains a few javascript functions which allow to switch between display styles for GAPDoc HTML manuals. If javascript is switched off in a browser or this file in not available in a manual directory, this is no problem. Users just cannot switch between several styles and don't see the corresponding button. A style with name mystyle can be added by providing two files (or only one of them). mystyle.js: Additional javascript code for the style, it is read in the HTML pages after this current file. The additional code may adjust the preprocessing function jscontent() with is called onload of a file. This is done by appending functions to jscontentfuncs (jscontentfuncs.push(newfunc);). Make sure, that your style is still usable without javascript. mystyle.css: CSS configuration, read after manual.css (so it can just reconfigure a few details, or overwrite everything). Then adjust chooser.html such that users can switch on and off mystyle. A user can change the preferred style permanently by using the [Style] link and choosing one. Or one can append '?GAPDocStyle=mystyle' to the URL when loading any file of the manual (so the style can be configured in the GAP user preferences). */ /* generic helper function */ function deleteCookie(nam) { document.cookie = nam+"=;Path=/;expires=Thu, 01 Jan 1970 00:00:00 GMT"; } /* read a value from a "nam1=val1;nam2=val2;..." string (e.g., the search part of an URL or a cookie */ function valueString(str,nam) { var cs = str.split(";"); for (var i=0; i < cs.length; i++) { var pos = cs[i].search(nam+"="); if (pos > -1) { pos = cs[i].indexOf("="); return cs[i].slice(pos+1); } } return 0; } /* when a non-default style is chosen via URL or a cookie, then the cookie is reset and the styles .js and .css files are read */ function overwriteStyle() { /* style in URL? */ var style = valueString(window.location.search, "GAPDocStyle"); /* otherwise check cookie */ if (style == 0) style = valueString(document.cookie, "GAPDocStyle"); if (style == 0) return; if (style == "default") deleteCookie("GAPDocStyle"); else { /* ok, we set the cookie for path "/" */ var path = "/"; /* or better like this ??? var here = window.location.pathname.split("/"); for (var i=0; i+3 < here.length; i++) path = path+"/"+here[i]; */ document.cookie = "GAPDocStyle="+style+";Path="+path; /* split into names of style files */ var stlist = style.split(","); /* read style's css and js files */ for (var i=0; i < stlist.length; i++) { document.writeln(''); document.writeln(''); } } } /* this adds a "[Style]" link next to the MathJax switcher */ function addStyleLink() { var line = document.getElementById("mathjaxlink"); var el = document.createElement("a"); var oncl = document.createAttribute("href"); var back = window.location.protocol+"//" if (window.location.protocol == "http:" || window.location.protocol == "https:") { back = back+window.location.host; if (window.location.port != "") { back = back+":"+window.location.port; } } back = back+window.location.pathname; oncl.nodeValue = "chooser.html?BACK="+back; el.setAttributeNode(oncl); var cont = document.createTextNode(" [Style]"); el.appendChild(cont); line.appendChild(el); } var jscontentfuncs = new Array(); jscontentfuncs.push(addStyleLink); /* the default jscontent() only adds the [Style] link to the page */ function jscontent () { for (var i=0; i < jscontentfuncs.length; i++) jscontentfuncs[i](); } polymaking-0.8.6/doc/chapInd.html0000644000076600000240000001546314071427117015724 0ustar mhornstaff GAP (polymaking) - Index

Goto Chapter: Top 1 2 3 4 Bib Ind

Index

AppendInequalitiesToPolymakeObject 2.4-4
AppendPointlistToPolymakeObject 2.4-2
AppendToPolymakeObject 2.4-1
AppendVertexlistToPolymakeObject 2.4-3
CheckAppVerTypList 2.1-3
ClearPolymakeObject 2.4-6 2.4-6
ConvertMatrixToPolymakeString 2.4-5
ConvertPolymakeBoolToGAP 4.2-6
ConvertPolymakeGraphToGAP 4.2-9
ConvertPolymakeIntVectorToGAPPlusOne 4.2-5
ConvertPolymakeListOfSetsToGAP 4.2-8
ConvertPolymakeListOfSetsToGAPPlusOne 4.2-8
ConvertPolymakeMatrixOrListOfSetsToGAP 4.2-3
ConvertPolymakeMatrixOrListOfSetsToGAPPlusOne 4.2-3
ConvertPolymakeMatrixToGAP 4.2-4
ConvertPolymakeMatrixToGAPKillOnes 4.2-4
ConvertPolymakeNumber 4.2-1
ConvertPolymakeOutputToGapNotation 4.1-2
ConvertPolymakeScalarToGAP 4.2-2
ConvertPolymakeSetToGAP 4.2-7
ConvertPolymakeVectorToGAP 4.2-5
ConvertPolymakeVectorToGAPKillOne 4.2-5
CreateEmptyFile 2.1-1
CreatePolymakeObject 2.1-2 2.1-2 2.1-2 2.1-2 2.1-2 2.1-2
CreatePolymakeObjectFromFile 2.1-4 2.1-4
DirectoryOfPolymakeObject 2.2-1
FilenameOfPolymakeObject 2.2-2
FullFilenameOfPolymakeObject 2.2-3
InfoPolymaking 3.1-1
KnownPropertiesOfPolymakeObject 2.2-5
NamesKnownPropertiesOfPolymakeObject 2.2-4
ObjectConverters 4.1-4
Polymake 2.5-1
POLYMAKE_COMMAND 3.2-1
POLYMAKE_DATA_DIR 3.2-2
POLYMAKE_LAST_FAIL_REASON 3.1-2
PropertyOfPolymakeObject 2.2-6
SetPolymakeCommand 1.2-2
SetPolymakeDataDirectory 1.2-1
SplitPolymakeOutputStringIntoBlocks 4.1-3
UnbindKnownPropertyOfPolymakeObject 2.4-8
WriteKnownPropertyToPolymakeObject 2.4-7

Goto Chapter: Top 1 2 3 4 Bib Ind

generated by GAPDoc2HTML

polymaking-0.8.6/doc/chap3_mj.html0000644000076600000240000001440214071427117016032 0ustar mhornstaff GAP (polymaking) - Chapter 3: Global Variables
Goto Chapter: Top 1 2 3 4 Bib Ind

3 Global Variables

3.1 Getting information about polymake output

3.1-1 InfoPolymaking
‣ InfoPolymaking( info class )

If set to at least \(2\), the output of polymake is shown. At level \(1\), warnings are shown. This is the default. And at level \(0\), the polymake package remains silent.

3.1-2 POLYMAKE_LAST_FAIL_REASON
‣ POLYMAKE_LAST_FAIL_REASON( global variable )

Contains a string that explains the last occurence of fail as a return value of Polymake (2.5-1).

3.2 Variables for system interaction

The variables for interaction with the system are contained in the file environment.gi. Each of these variables has a function to set it, see 1.2. If POLYMAKE_COMMAND or POLYMAKE_DATA_DIR are set at startup, they are not overwritten. So if you don't want (or don't have the rights) to modify environment.gi, you can set the variables in your .gaprc file.

3.2-1 POLYMAKE_COMMAND
‣ POLYMAKE_COMMAND( global variable )

This variable should contain the name of the polymake program in the form as returned by Filename So a probable value is Filename(Directory("/usr/local/bin"),"polymake").

3.2-2 POLYMAKE_DATA_DIR
‣ POLYMAKE_DATA_DIR( global variable )

In this directory the files for polymake will be created. By default, this generates a temporary directory using DirectoryTemporary

Goto Chapter: Top 1 2 3 4 Bib Ind

generated by GAPDoc2HTML

polymaking-0.8.6/doc/chapInd.txt0000644000076600000240000000406014071427114015563 0ustar mhornstaff Index AppendInequalitiesToPolymakeObject 2.4-4 AppendPointlistToPolymakeObject 2.4-2 AppendToPolymakeObject 2.4-1 AppendVertexlistToPolymakeObject 2.4-3 CheckAppVerTypList 2.1-3 ClearPolymakeObject 2.4-6 2.4-6 ConvertMatrixToPolymakeString 2.4-5 ConvertPolymakeBoolToGAP 4.2-6 ConvertPolymakeGraphToGAP 4.2-9 ConvertPolymakeIntVectorToGAPPlusOne 4.2-5 ConvertPolymakeListOfSetsToGAP 4.2-8 ConvertPolymakeListOfSetsToGAPPlusOne 4.2-8 ConvertPolymakeMatrixOrListOfSetsToGAP 4.2-3 ConvertPolymakeMatrixOrListOfSetsToGAPPlusOne 4.2-3 ConvertPolymakeMatrixToGAP 4.2-4 ConvertPolymakeMatrixToGAPKillOnes 4.2-4 ConvertPolymakeNumber 4.2-1 ConvertPolymakeOutputToGapNotation 4.1-2 ConvertPolymakeScalarToGAP 4.2-2 ConvertPolymakeSetToGAP 4.2-7 ConvertPolymakeVectorToGAP 4.2-5 ConvertPolymakeVectorToGAPKillOne 4.2-5 CreateEmptyFile 2.1-1 CreatePolymakeObject 2.1-2 2.1-2 2.1-2 2.1-2 2.1-2 2.1-2 CreatePolymakeObjectFromFile 2.1-4 2.1-4 DirectoryOfPolymakeObject 2.2-1 FilenameOfPolymakeObject 2.2-2 FullFilenameOfPolymakeObject 2.2-3 InfoPolymaking 3.1-1 KnownPropertiesOfPolymakeObject 2.2-5 NamesKnownPropertiesOfPolymakeObject 2.2-4 ObjectConverters 4.1-4 Polymake 2.5-1 POLYMAKE_COMMAND 3.2-1 POLYMAKE_DATA_DIR 3.2-2 POLYMAKE_LAST_FAIL_REASON 3.1-2 PropertyOfPolymakeObject 2.2-6 SetPolymakeCommand 1.2-2 SetPolymakeDataDirectory 1.2-1 SplitPolymakeOutputStringIntoBlocks 4.1-3 UnbindKnownPropertyOfPolymakeObject 2.4-8 WriteKnownPropertyToPolymakeObject 2.4-7 ------------------------------------------------------- polymaking-0.8.6/doc/chap4.html0000644000076600000240000004051514071427117015351 0ustar mhornstaff GAP (polymaking) - Chapter 4: Converting Polymake Output
Goto Chapter: Top 1 2 3 4 Bib Ind

4 Converting Polymake Output

4.1 The General Method

When polymake is called, its output is read as a string and then processed as follows:

  1. the lines containing upper case letters are found. These are treated as lines containing the keywords. Each of those lines marks the beginning of a block of data.

  2. The string is then cut into a list of blocks (also strings). Each block starts with a line containing the keyword and continues with some lines of data.

  3. for each of the blocks, the appropriate function of ObjectConverters is called. Here "appropriate" just means, that the keyword of the block coincides with the name of the function.

  4. The output of the conversion function is then added to the known properties of the PolymakeObject for which Polymake was called.

4.1-1 Converter- Philosopy

The converter functions should take meaningful polymake data into meaningful GAP data. This sometimes means that the (mathematical) representation is changed. Here is an example: polymake writes vectors as augmented affine vectors of the form 1 a1 a2 a3... which does not go very well with the usual GAP conventions of column vectors and multiplying matrices from the right. So polymaking converts such a vector to [a1,a2,a3,...] and the user is left with the problem of augmentation and left or right multiplication.

Another area where the GAP object isn't a literal translation from the polymake world is combinatorics. In Polymake, list elements are enumerated starting from 0. GAP enumerates lists starting at 1. So the conversion process adds 1 to the numbers corresponding to vertices in facet lists, for example.

The conversion process is done by the following methods:

4.1-2 ConvertPolymakeOutputToGapNotation
‣ ConvertPolymakeOutputToGapNotation( string )( method )

Returns: Record having polymake keywords as entry names and the respective converted polymake output as entries.

Given a the output of the polymake program as a string string, this method first calls SplitPolymakeOutputStringIntoBlocks (4.1-3). For each of the returned blocks, the name (=first line) of the block is read and the record ObjectConverters (4.1-4) is looked up for an entry with that name. If such an entry exists, it (being a function!) is called and passed the block. The returned value is then given the name of the block and added to the record returned by ConvertPolymakeOutputToGapNotation.

4.1-3 SplitPolymakeOutputStringIntoBlocks
‣ SplitPolymakeOutputStringIntoBlocks( string )( method )

Returns: List of strings -- "blocks"--

The string string is cut at the lines starting with an upper case character and consisting only of upper case letters, numbers and underscore (_) characters. The parts are returned as a list of strings. The initial string string remains unchanged.

4.1-4 ObjectConverters
‣ ObjectConverters( global variable )

The entries of this record are labeled by polymake keywords. Each of the entries is a function which converts a string returned by polymake to GAP format. So far, only a few converters are implemented. To see which, try RecNames(ObjectConverters);

You can define new converters using the basic functions described in section 4.2.

4.2 Conversion Functions

The following functions are used for the functions in ObjectConverters (4.1-4).

4.2-1 ConvertPolymakeNumber
‣ ConvertPolymakeNumber( string )( method )

The string string is converted to a rational number. Unlike Rat, it tests, if the number represented by string is a floating point number an converts it correctly. If this is the case, a waring is issued.

4.2-2 ConvertPolymakeScalarToGAP
‣ ConvertPolymakeScalarToGAP( list )( method )

If list contains a single string, this string is converted into a number using ConvertPolymakeNumber (4.2-1).

4.2-3 ConvertPolymakeMatrixOrListOfSetsToGAP
‣ ConvertPolymakeMatrixOrListOfSetsToGAP( list )( method )
‣ ConvertPolymakeMatrixOrListOfSetsToGAPPlusOne( list )( method )

Tries to decide if the list list of strings represents a matrix or a list of sets by testing if they start with "{". It then calls either ConvertPolymakeMatrixToGAP (4.2-4) or ConvertPolymakeListOfSetsToGAP (4.2-8). The "PlusOne" version calls ConvertPolymakeListOfSetsToGAPPlusOne (4.2-8) if list represents a list of sets.

4.2-4 ConvertPolymakeMatrixToGAP
‣ ConvertPolymakeMatrixToGAP( list )( method )
‣ ConvertPolymakeMatrixToGAPKillOnes( list )( method )

The list list of strings is interpreted as a list of row vectors and converted into a matrix. The "KillOnes" version removes the leading ones.

4.2-5 ConvertPolymakeVectorToGAP
‣ ConvertPolymakeVectorToGAP( list )( method )
‣ ConvertPolymakeVectorToGAPKillOne( list )( method )
‣ ConvertPolymakeIntVectorToGAPPlusOne( list )( method )

As the corresponding "Matrix" version. Just for vectors. ConvertPolymakeIntVectorToGAPPlusOne requires the vector to contain integers. It also adds 1 to every entry.

4.2-6 ConvertPolymakeBoolToGAP
‣ ConvertPolymakeBoolToGAP( list )( method )

If list contains a single string, which is either 0,false,1, or true this function returns false or true, respectively.

4.2-7 ConvertPolymakeSetToGAP
‣ ConvertPolymakeSetToGAP( list )( method )

Let list be a list containing a single string, which is a list of numbers separated by whitespaces and enclosed by { and } . The returned value is then a set of rational numbers (in the GAP sense).

4.2-8 ConvertPolymakeListOfSetsToGAP
‣ ConvertPolymakeListOfSetsToGAP( list )( method )
‣ ConvertPolymakeListOfSetsToGAPPlusOne( list )( method )

Let list be a list containing several strings representing sets. Then each of these strings is converted to a set of rational numbers and the returned value is the list of all those sets. The "PlusOne" version adds 1 to every entry.

4.2-9 ConvertPolymakeGraphToGAP
‣ ConvertPolymakeGraphToGAP( list )( method )

Let list be a list of strings representing sets (that is, a list of integers enclosed by { and }). Then a record is returned containing two sets named .vertices and .edges.

Goto Chapter: Top 1 2 3 4 Bib Ind

generated by GAPDoc2HTML

polymaking-0.8.6/doc/nocolorprompt.css0000644000076600000240000000031314071427117017103 0ustar mhornstaff /* colors for ColorPrompt like examples */ span.GAPprompt { color: #000000; font-weight: normal; } span.GAPbrkprompt { color: #000000; font-weight: normal; } span.GAPinput { color: #000000; } polymaking-0.8.6/doc/lefttoc.css0000644000076600000240000000047414071427117015636 0ustar mhornstaff/* leftmenu.css Frank Lübeck */ /* Change default CSS to show section menu on left side */ body { padding-left: 28%; } body.chap0 { padding-left: 2%; } div.ChapSects div.ContSect:hover div.ContSSBlock { left: 15%; } div.ChapSects { left: 1%; width: 25%; } polymaking-0.8.6/doc/chap2_mj.html0000644000076600000240000007557314071427117016051 0ustar mhornstaff GAP (polymaking) - Chapter 2: Polymake interaction
Goto Chapter: Top 1 2 3 4 Bib Ind

2 Polymake interaction

2.1 Creating Polymake Objects

The interaction with the polymake program is done via files. A PolymakeObject is mainly a pointer to a file and a list of known properties of the object. These properties need not be stored in the file. Whenever polymake is called, the returned value is read from standard output and stored in the PolymakeObject corresponding to the file for which polymake is called. The files for polymake are written in the old (non-xml) format. The first run of polymake converts them into the new (xml) format. This means that changes to the file by means of the methods outlined below after the first run of polymake will probably lead to corrupted files.

2.1-1 CreateEmptyFile
‣ CreateEmptyFile( filename )( method )

Returns: nothing

Creates an empty file with name filename. Note that filename has to include the full path and the directory for the file must exist.

2.1-2 CreatePolymakeObject
‣ CreatePolymakeObject( )( method )
‣ CreatePolymakeObject( appvertyp )( method )
‣ CreatePolymakeObject( dir )( method )
‣ CreatePolymakeObject( dir, appvertyp )( method )
‣ CreatePolymakeObject( prefix, dir )( method )
‣ CreatePolymakeObject( prefix, dir, appvertyp )( method )

Returns: PolymakeObject

If called without arguments, this method generates an empty file in the directory defined by POLYMAKE_DATA_DIR (3.2-2). If a directory dir is given (this directory must exist), an empty file is generated in this directory. If prefix is not given, the file is called polyN where N is the current runtime. If a file of this name already exists, a number is appended separated by a dot (example: "poly1340" and "poly1340.1"). If prefix is given, the filename starts with this prefix. Optionally, the file can be generated with a header specifying application, version and type of the object. This is done by passing the triple of strings appvertyp to CreatePolymakeObject. A valid triple is ["polytope","2.3","RationalPolytope"]. Validity is checked by CheckAppVerTypList (2.1-3).

2.1-3 CheckAppVerTypList
‣ CheckAppVerTypList( appvertyp )( method )

Returns: bool

Checks if the triple arppvertyp of strings specifies an application and type of polymake version 2.3. More specifically, the first entry has to be an application from ["polytope","surface","topaz"] and the third entry has to be a type corresponding to the application given in the first entry. The second entry is not checked.

2.1-4 CreatePolymakeObjectFromFile
‣ CreatePolymakeObjectFromFile( filename )( method )
‣ CreatePolymakeObjectFromFile( dir, filename )( method )

Returns: PolymakeObject

This method generates a PolymakeObject corresponding to the file filename in the directory dir. If dir is not given, the POLYMAKE_DATA_DIR is used.If no file with name filename exists in dir (or POLYMAKE_DATA_DIR, respectively), an empty file is created. Note that the contents of the file do not matter for the generation of the object. In particular, the object does not know any of the properties that might be encoded in the file. The only way to transfer information from files to PolymakeObjects is via Polymake (2.5-1).

2.2 Accessing Properties of Polymake Objects

A PolymakeObject contains information about the directory of its file, the name of its file and about properties calculated by calling Polymake (2.5-1). The properties returned by the polymake program are stored under the name polymake assigns to them (that is, the name of the data block in the corresponding file). The following methods can be used to access the information stored in a PolymakeObject. But be careful! All functions return the actual object. No copies are made. So if you change one of the returned objects, you change the PolymakeObject itself.

2.2-1 DirectoryOfPolymakeObject
‣ DirectoryOfPolymakeObject( poly )( method )

Returns: Directory

Returns the directory of the file associated with poly.

2.2-2 FilenameOfPolymakeObject
‣ FilenameOfPolymakeObject( poly )( method )

Returns: String

Returns the name of the file associated with poly. This does only mean the name of the file, not the full path. For the full path and file name see FullFilenameOfPolymakeObject (2.2-3)

2.2-3 FullFilenameOfPolymakeObject
‣ FullFilenameOfPolymakeObject( poly )( method )

Returns: String

Returns the file associated with the PolymakeObject poly with its complete path.

2.2-4 NamesKnownPropertiesOfPolymakeObject
‣ NamesKnownPropertiesOfPolymakeObject( poly )( method )

Returns: List of Strings

Returns a list of the names of all known properties. This does only include the properties returned by Polymake (2.5-1), "dir" and "filename" are not included. If no properties are known, fail is returned.

2.2-5 KnownPropertiesOfPolymakeObject
‣ KnownPropertiesOfPolymakeObject( poly )( method )

Returns: Record

Returns the record of all known properties. If no properties are known, fail is returned.

2.2-6 PropertyOfPolymakeObject
‣ PropertyOfPolymakeObject( poly, name )( method )

Returns the value of the property name if it is known. If the value is not known, fail is returned. name must be a String.

2.3 Example: Creating and Accessing Polymake Objects

Suppose the file /tmp/threecube.poly contains the three dimensional cube in polymake form. Now generate a PolymakeObject from this file and call Polymake (2.5-1) to make the vertices of the cube known to the object.


### suppose we have a polymake file /tmp/threecube.poly
### containing a cube in three dimensions
gap> cube:=CreatePolymakeObjectFromFile(Directory("/tmp"),"threecube.poly");
<polymake object. No properties known>
gap> FilenameOfPolymakeObject(cube);
"threecube.poly"
gap> FullFilenameOfPolymakeObject(cube);
"/tmp/threecube.poly"
   #nothing is known about the cube:
gap> NamesKnownPropertiesOfPolymakeObject(cube);  
fail
gap> Polymake(cube,"VERTICES");
[ [ -1, -1, -1 ], [ 1, -1, -1 ], [ -1, 1, -1 ], [ 1, 1, -1 ], [ -1, -1, 1 ], 
  [ 1, -1, 1 ], [ -1, 1, 1 ], [ 1, 1, 1 ] ]  
   # Now <cube> knows its vertices:
gap> Print(cube);
<polymake object threecube.poly. Properties known: [ "VERTICES" ]>
gap> PropertyOfPolymakeObject(cube,"VERTICES");
[ [ -1, -1, -1 ], [ 1, -1, -1 ], [ -1, 1, -1 ], [ 1, 1, -1 ], [ -1, -1, 1 ],
  [ 1, -1, 1 ], [ -1, 1, 1 ], [ 1, 1, 1 ] ]
gap> KnownPropertiesOfPolymakeObject(cube);
rec(
  VERTICES := [ [ -1, -1, -1 ], [ 1, -1, -1 ], [ -1, 1, -1 ], [ 1, 1, -1 ],
      [ -1, -1, 1 ], [ 1, -1, 1 ], [ -1, 1, 1 ], [ 1, 1, 1 ] ] )

2.4 Writing to Polymake Objects

To transfer data from GAP to polymake, the following methods can be used. But bear in mind that none of these functions test if the resulting polymake file is still consistent.

2.4-1 AppendToPolymakeObject
‣ AppendToPolymakeObject( poly, string )( method )

Returns: nothing

This appends the string string to the file associated to the PolymakeObject poly. It is not tested if the string is syntactically correct as a part of a polymake file. It is also not tested if the string is compatible with the data already contained in the file.

INEQUALITIES, POINTS and VERTICES can be appended to a polymake object using the following functions:

2.4-2 AppendPointlistToPolymakeObject
‣ AppendPointlistToPolymakeObject( poly, pointlist )( method )

Returns: nothing

Takes a list pointlist of vectors and converts it into a string which represents a polymake block labeled "POINTS". This string is then added to the file associated with poly. The "POINTS" block of the file associated with poly then contains points with leading ones, as polymake uses affine notation.

2.4-3 AppendVertexlistToPolymakeObject
‣ AppendVertexlistToPolymakeObject( poly, pointlist )( method )

Returns: nothing

Does the same as AppendPointlistToPolymakeObject, but with "VERTICES" instead of "POINTS".

2.4-4 AppendInequalitiesToPolymakeObject
‣ AppendInequalitiesToPolymakeObject( poly, ineqlist )( method )

Returns: nothing

Just appends the inequalities given in ineqlist to the polymake object poly (with caption "INEQUALITIES"). Note that this does not check if an "INEQUALITIES" section does already exist in the file associated with poly.

2.4-5 ConvertMatrixToPolymakeString
‣ ConvertMatrixToPolymakeString( name, matrix )( method )

Returns: String

This function takes a matrix matrix and converts it to a string. This string can then be appended to a polymake file via AppendToPolymakeObject (2.4-1) to form a block of data labeled name. This may be used to write blocks like INEQUALITIES or FACETS.

2.4-6 ClearPolymakeObject
‣ ClearPolymakeObject( poly )( method )
‣ ClearPolymakeObject( poly, appvertyp )( method )

Returns: nothing

Deletes all known properties of the PolymakeObject poly and replaces its file with an empty one.
If the triple of strings appvertyp specifying application, version and type (see CheckAppVerTypList (2.1-3)) is given, the file is replaced with a file that contains only a header specifying application, version and type of the polymake object.

There are also methods to manipulate the known values without touching the file of the PolymakeObject:

2.4-7 WriteKnownPropertyToPolymakeObject
‣ WriteKnownPropertyToPolymakeObject( poly, name, data )( method )

Takes the object data and writes it to the known properties section of the PolymakeObject poly. The string name is used as the name of the property. If a property with that name already exists, it is overwritten. Again, there is no check if data is consistent, correct or meaningful.

2.4-8 UnbindKnownPropertyOfPolymakeObject
‣ UnbindKnownPropertyOfPolymakeObject( poly, name )( method )

If the PolymakeObject poly has a property with name name, that property is unbound. If there is no such property, fail is returned.

2.5 Calling Polymake and converting its output

2.5-1 Polymake
‣ Polymake( poly, option: PolymakeNolookup )( method )

This method calls the polymake program (see POLYMAKE_COMMAND (3.2-1)) with the option option. You may use several keywords such as "FACETS VERTICES" as an option. The returned value is cut into blocks starting with keywords (which are taken from output and not looked up in option). Each block is then interpreted and translated into GAP readable form. This translation is done using the functions given in ObjectConverters (4.1-4). The first line of each block of polymake output is taken as a keyword and the according entry in ObjectConverters (4.1-4) is called to convert the block into GAP readable form. If no conversion function is known, an info string is printed and fail is returned. If only one keyword has been given as option, Polymake returns the result of the conversion operation. If more than one keyword has been given or the output consists of more than one block, Polymake returns fail. In any case, the calculated values for each block are stored as known properties of the PolymakeObject poly as long as they are not fail. If Polymake is called with an option that corresponds to a name of a known property of poly, the known property is returned. In this case, there is no call of the external program. (see below for suppression of this feature).

Note that the command Polymake returns fail if nothing is returned by the program polymake or more than one block of data is returned. For example, the returned value of Polymake(poly,"VISUAL") is always fail. Likewise, Polymake(poly,"POINTS VERTICES") will return fail (but may add new known properties to poly). For a description of the conversion functions, see chapter 4.

If the option PolymakeNolookup is set to anything else than false, the polymake program is called even if poly already has a known property with name option.

Note that whenever Polymake returns fail, a description of the problem is stored in POLYMAKE_LAST_FAIL_REASON (3.1-2). If you call Polymake with more than one keyword, POLYMAKE_LAST_FAIL_REASON (3.1-2) is changed before polymake is called. So any further reason to return fail will overwrite it.

2.6 An Example

Let's generate a three dimensional permutahedron.

    
    gap> S:=SymmetricGroup(3);
    Sym( [ 1 .. 3 ] )
    gap> v:=[1,2,3];
    [ 1, 2, 3 ]
    gap> points:=Orbit(S,v,Permuted);;
    gap> permutahedron:=CreatePolymakeObject();
    <polymake object. No properties known>
    gap> AppendPointlistToPolymakeObject(permutahedron,points);
    gap> Polymake(permutahedron,"VOLUME");
    3
    gap> Polymake(permutahedron,"N_VERTICES");
    6
          #Now <permutahedron> knows its number of vertices, but not the vertices:
    gap> PropertyOfPolymakeObject(permutahedron,"VERTICES");
    fail
    gap> NamesKnownPropertiesOfPolymakeObject(permutahedron);
    [ "VOLUME", "N_VERTICES" ]
        #Let's look at the object!
    gap> Polymake(permutahedron,"VISUAL");
    #I  There was no or wrong polymake output
    fail
    gap> Polymake(permutahedron,"DIM");
    2
    
    
Goto Chapter: Top 1 2 3 4 Bib Ind

generated by GAPDoc2HTML

polymaking-0.8.6/doc/polymaking.xml0000644000076600000240000000070014071427055016351 0ustar mhornstaff <#Include SYSTEM "title.xml"> <#Include SYSTEM "environment.xml"> Polymake interaction <#Include SYSTEM "input.xml"> <#Include SYSTEM "output.xml"> <#Include SYSTEM "internals.xml"> polymaking-0.8.6/doc/manual.lab0000644000076600000240000001275114071427117015422 0ustar mhornstaff\GAPDocLabFile{polymaking} \makelabel{polymaking:Title page}{}{X7D2C85EC87DD46E5} \makelabel{polymaking:Abstract}{}{X7AA6C5737B711C89} \makelabel{polymaking:Copyright}{}{X81488B807F2A1CF1} \makelabel{polymaking:Acknowledgements}{}{X82A988D47DFAFCFA} \makelabel{polymaking:Table of Contents}{}{X8537FEB07AF2BEC8} \makelabel{polymaking:Installation and Preface}{1}{X8794FBB27B46C08E} \makelabel{polymaking:033[1XA few words about the installation of polymake}{1.1}{X7A02C64B7A3777FF} \makelabel{polymaking:033[1XSetting variables for external programs}{1.2}{X851C596486F918F0} \makelabel{polymaking:Setting variables permanently}{1.2.3}{X7943B579846BDB76} \makelabel{polymaking:Polymake interaction}{2}{X86C82DCF81362F41} \makelabel{polymaking:Creating Polymake Objects}{2.1}{X83D426D5855D1FD6} \makelabel{polymaking:Accessing Properties of Polymake Objects}{2.2}{X7D9EBB0383B9BD1C} \makelabel{polymaking:033[1XExample: Creating and Accessing Polymake Objects}{2.3}{X7CEF475187927AEA} \makelabel{polymaking:Writing to Polymake Objects}{2.4}{X87BEE1B37D9F1F5E} \makelabel{polymaking:033[1XCalling Polymake and converting its output}{2.5}{X8468E0E381642B14} \makelabel{polymaking:An Example}{2.6}{X7B5623E3821CC0D0} \makelabel{polymaking:Global Variables}{3}{X7D9044767BEB1523} \makelabel{polymaking:033[1XGetting information about polymake output}{3.1}{X86AC0C6B807BEBDE} \makelabel{polymaking:033[1XVariables for system interaction}{3.2}{X7B786DAF80136FF4} \makelabel{polymaking:Converting Polymake Output}{4}{X7D23E80E841CDD67} \makelabel{polymaking:The General Method}{4.1}{X862D57D87A244DE2} \makelabel{polymaking:Converter- Philosopy}{4.1.1}{X7CDBEA427EE69C71} \makelabel{polymaking:Conversion Functions}{4.2}{X7FF4170183C83CC1} \makelabel{polymaking:Bibliography}{Bib}{X7A6F98FD85F02BFE} \makelabel{polymaking:References}{Bib}{X7A6F98FD85F02BFE} \makelabel{polymaking:Index}{Ind}{X83A0356F839C696F} \makelabel{polymaking:SetPolymakeDataDirectory}{1.2.1}{X794A38E981F9E76F} \makelabel{polymaking:SetPolymakeCommand}{1.2.2}{X854645287BC9303E} \makelabel{polymaking:CreateEmptyFile}{2.1.1}{X7C87B1807E036A85} \makelabel{polymaking:CreatePolymakeObject}{2.1.2}{X8625E7E2845F1634} \makelabel{polymaking:CreatePolymakeObject}{2.1.2}{X8625E7E2845F1634} \makelabel{polymaking:CreatePolymakeObject}{2.1.2}{X8625E7E2845F1634} \makelabel{polymaking:CreatePolymakeObject}{2.1.2}{X8625E7E2845F1634} \makelabel{polymaking:CreatePolymakeObject}{2.1.2}{X8625E7E2845F1634} \makelabel{polymaking:CreatePolymakeObject}{2.1.2}{X8625E7E2845F1634} \makelabel{polymaking:CheckAppVerTypList}{2.1.3}{X8135E88E87DD1551} \makelabel{polymaking:CreatePolymakeObjectFromFile}{2.1.4}{X7801F05A81E23EED} \makelabel{polymaking:CreatePolymakeObjectFromFile}{2.1.4}{X7801F05A81E23EED} \makelabel{polymaking:DirectoryOfPolymakeObject}{2.2.1}{X86D967C684B27108} \makelabel{polymaking:FilenameOfPolymakeObject}{2.2.2}{X87470AB079A2F550} \makelabel{polymaking:FullFilenameOfPolymakeObject}{2.2.3}{X809D309F7D31DD2C} \makelabel{polymaking:NamesKnownPropertiesOfPolymakeObject}{2.2.4}{X850B38F27F1BF7E8} \makelabel{polymaking:KnownPropertiesOfPolymakeObject}{2.2.5}{X7D79C5F1817041C5} \makelabel{polymaking:PropertyOfPolymakeObject}{2.2.6}{X7E538D1B7898C8E6} \makelabel{polymaking:AppendToPolymakeObject}{2.4.1}{X785DCA4487F168F8} \makelabel{polymaking:AppendPointlistToPolymakeObject}{2.4.2}{X7F5326338033B57C} \makelabel{polymaking:AppendVertexlistToPolymakeObject}{2.4.3}{X7E150BA67CEBC00E} \makelabel{polymaking:AppendInequalitiesToPolymakeObject}{2.4.4}{X7EBE5FB284FBFFE6} \makelabel{polymaking:ConvertMatrixToPolymakeString}{2.4.5}{X83DC7FC280731B04} \makelabel{polymaking:ClearPolymakeObject}{2.4.6}{X804AAE4882743E91} \makelabel{polymaking:ClearPolymakeObject}{2.4.6}{X804AAE4882743E91} \makelabel{polymaking:WriteKnownPropertyToPolymakeObject}{2.4.7}{X840C02CD815FF766} \makelabel{polymaking:UnbindKnownPropertyOfPolymakeObject}{2.4.8}{X7A3FF18C7FD1A626} \makelabel{polymaking:Polymake}{2.5.1}{X7DBA99E87EC51D53} \makelabel{polymaking:InfoPolymaking}{3.1.1}{X85BA7A3D7C698B68} \makelabel{polymaking:POLYMAKELASTFAILREASON}{3.1.2}{X79E1C63D8516D334} \makelabel{polymaking:POLYMAKECOMMAND}{3.2.1}{X7B35A5217C8C7B04} \makelabel{polymaking:POLYMAKEDATADIR}{3.2.2}{X7C07B16B873BA46D} \makelabel{polymaking:ConvertPolymakeOutputToGapNotation}{4.1.2}{X7EB6D80C816CF667} \makelabel{polymaking:SplitPolymakeOutputStringIntoBlocks}{4.1.3}{X841D81327C6F6E29} \makelabel{polymaking:ObjectConverters}{4.1.4}{X83199F737F4BE4FD} \makelabel{polymaking:ConvertPolymakeNumber}{4.2.1}{X7FC98443862DB83F} \makelabel{polymaking:ConvertPolymakeScalarToGAP}{4.2.2}{X7F2A1C2C808E4A07} \makelabel{polymaking:ConvertPolymakeMatrixOrListOfSetsToGAP}{4.2.3}{X82A7FF9983EB61E2} \makelabel{polymaking:ConvertPolymakeMatrixOrListOfSetsToGAPPlusOne}{4.2.3}{X82A7FF9983EB61E2} \makelabel{polymaking:ConvertPolymakeMatrixToGAP}{4.2.4}{X817C6B4180BF6365} \makelabel{polymaking:ConvertPolymakeMatrixToGAPKillOnes}{4.2.4}{X817C6B4180BF6365} \makelabel{polymaking:ConvertPolymakeVectorToGAP}{4.2.5}{X85F7F6787D346CC0} \makelabel{polymaking:ConvertPolymakeVectorToGAPKillOne}{4.2.5}{X85F7F6787D346CC0} \makelabel{polymaking:ConvertPolymakeIntVectorToGAPPlusOne}{4.2.5}{X85F7F6787D346CC0} \makelabel{polymaking:ConvertPolymakeBoolToGAP}{4.2.6}{X87B6F9867EE800C7} \makelabel{polymaking:ConvertPolymakeSetToGAP}{4.2.7}{X846B284085825FEA} \makelabel{polymaking:ConvertPolymakeListOfSetsToGAP}{4.2.8}{X7E7886D68356F592} \makelabel{polymaking:ConvertPolymakeListOfSetsToGAPPlusOne}{4.2.8}{X7E7886D68356F592} \makelabel{polymaking:ConvertPolymakeGraphToGAP}{4.2.9}{X7EBECAA07F8B58D8} polymaking-0.8.6/doc/chapBib.txt0000644000076600000240000000023414071427114015544 0ustar mhornstaff References [GJ] Gawrilow, E. and Joswig, M., polymake, \URL{http://polymake.org/}.  polymaking-0.8.6/doc/output.xml0000644000076600000240000000731014071427055015543 0ustar mhornstaff
Calling Polymake and converting its output This method calls the polymake program (see ) with the option option. You may use several keywords such as "FACETS VERTICES" as an option. The returned value is cut into blocks starting with keywords (which are taken from output and not looked up in option). Each block is then interpreted and translated into &GAP; readable form. This translation is done using the functions given in . The first line of each block of polymake output is taken as a keyword and the according entry in is called to convert the block into &GAP; readable form. If no conversion function is known, an info string is printed and fail is returned. If only one keyword has been given as option, Polymake returns the result of the conversion operation. If more than one keyword has been given or the output consists of more than one block, Polymake returns fail. In any case, the calculated values for each block are stored as known properties of the PolymakeObject poly as long as they are not fail. If Polymake is called with an option that corresponds to a name of a known property of poly, the known property is returned. In this case, there is no call of the external program. (see below for suppression of this feature).

Note that the command Polymake returns fail if nothing is returned by the program polymake or more than one block of data is returned. For example, the returned value of Polymake(poly,"VISUAL") is always fail. Likewise, Polymake(poly,"POINTS VERTICES") will return fail (but may add new known properties to poly). For a description of the conversion functions, see chapter .

If the option PolymakeNolookup is set to anything else than false, the polymake program is called even if poly already has a known property with name option. Note that whenever returns fail, a description of the problem is stored in . If you call with more than one keyword, is changed before polymake is called. So any further reason to return fail will overwrite it.

An Example Let's generate a three dimensional permutahedron. S:=SymmetricGroup(3); Sym( [ 1 .. 3 ] ) gap> v:=[1,2,3]; [ 1, 2, 3 ] gap> points:=Orbit(S,v,Permuted);; gap> permutahedron:=CreatePolymakeObject(); gap> AppendPointlistToPolymakeObject(permutahedron,points); gap> Polymake(permutahedron,"VOLUME"); 3 gap> Polymake(permutahedron,"N_VERTICES"); 6 #Now knows its number of vertices, but not the vertices: gap> PropertyOfPolymakeObject(permutahedron,"VERTICES"); fail gap> NamesKnownPropertiesOfPolymakeObject(permutahedron); [ "VOLUME", "N_VERTICES" ] #Let's look at the object! gap> Polymake(permutahedron,"VISUAL"); #I There was no or wrong polymake output fail gap> Polymake(permutahedron,"DIM"); 2 ]]>
polymaking-0.8.6/doc/polymaking.bib0000644000076600000240000000126214071427055016311 0ustar mhornstaff@incollection{polymakeframework, author = "Ewgenij Gawrilow and Michael Joswig", title = {polymake: a Framework for Analyzing Convex Polytopes}, pages = {43-74}, editor = {Gil Kalai and G\"unter M. Ziegler}, booktitle = {Polytopes --- Combinatorics and Computation}, publisher = {Birkh\"auser}, year = {2000} } @unpublished{math.CO/0507273, author = "Ewgenij Gawrilow and Michael Joswig", title = {Geometric reasoning with polymake}, note = {\url{arXiv:math.CO/0507273}}, year = 2005 } @Misc{polymake, author = "Ewgenij Gawrilow and Michael Joswig", title = {polymake}, howpublished = {\URL{http://polymake.org/}} } polymaking-0.8.6/doc/rainbow.js0000644000076600000240000000533614071427117015465 0ustar mhornstaff function randchar(str) { var i = Math.floor(Math.random() * str.length); while (i == str.length) i = Math.floor(Math.random() * str.length); return str[i]; } hexdigits = "0123456789abcdef"; function randlight() { return randchar("cdef")+randchar(hexdigits)+ randchar("cdef")+randchar(hexdigits)+ randchar("cdef")+randchar(hexdigits) } function randdark() { return randchar("012345789")+randchar(hexdigits)+ randchar("012345789")+randchar(hexdigits)+ randchar("102345789")+randchar(hexdigits) } document.write('\n'); polymaking-0.8.6/doc/manual.pdf0000644000076600000240000060360714071427117015443 0ustar mhornstaff%PDF-1.5 % 78 0 obj << /Length 326 /Filter /FlateDecode >> stream xڅ=k0wWYJ! t K` 㢸VP:-LQ H*z dՠIQaݡ+ՌDc MHP:Löi'd%ç)viBA6S83 %WHB Pt@-VU6A>w!Z:f^F%$ugM{e($5+S|4S7>\hNG [FΘbvWXJD-feG) ۍr*jbf#Mh) ۡOM:| endstream endobj 89 0 obj << /Length 672 /Filter /FlateDecode >> stream xڍTo @=Lein;5=8D?HLԃ={F,'&e! ,3F1,p% x &c .4d NBc9\;kxe,(c !P#˭h oDPqZ7h0j,ZNV!fc*X =%zeNJbGȣ;YmhUnu7<v!ݽZ'' _g4𰜸9ǦMsSN&ȝ?WjZ0,b ‚6z0پc+c_ VPp-wT^zТ&X` ݋zz8grV٫(͏07>[P+u{䖓J.vR+Dnr{*B9ݛcXBU%G6kOK_!D _}2_?.;vHS ;?t: lTibM+ǂVlٷpkw' &]W/J|ZQ7b'AS\Ø͋׶> stream xXMS0Whvo4:Ӂz`zp%u- * 1Pv߾S˰S?p8>!/r)rY?_{Ї@mA?$>0<!tNJY˴]3XoKĉ8 ߡh!b)5^{>H0.fέ~utr\ՎZMby -9u|c*⯷(R7$08gkb-.L@qƣLLRos'EYBYLxV#@B(H,ᙪRdDYsz(d@q{(!M`+"^sg_"-ҍr&ҭb$UƬ,梔!]b 7Ip0&x6g#hVzb ^>S(uey\17J\>QZIT3 qЂ̑Ts^! i&ALAm:K-k6k(0ygM0Ez&2v#3O\^OC  ҡ~%Vu9JfzpM[ 8Ҭ~z0ȁ B饋zl+)f] M,|AcΥ_5_hϿg-3z1br⎡\%c͈߄.->xccR ~C!V+?ɗfΥBBLJ#2̋)A>zўϜli>wO7%6xa?Hm0' yU:! endstream endobj 124 0 obj << /Length 1970 /Filter /FlateDecode >> stream xڕXm6_aA\zMK{ih,ӶYD*[Z˫$Gp:\ճЍ_~#Yd-%QH"Q,/ׇ3_D|B.__/߽rBcGb,{jS6MijՒв_v;Huxʊ(HOg~D%éwKt]ݸw/|B Dќ{.:wQJ l,Yo7JDOep őRE,$Dq[!Epgu b>d7`fK'Lb,>SnzN@xxDmJ=8Ь,%O=w5gt_V< 'n<{|AuĶe'pѕM P^y|UC?>&H JC#+DRaA4Uys/[h_Ez7׏4ԍu2ʾlj>)JG1"{vll<4#uS?gL&"q++JG^PZC\?{X^dW>@wD#vO/ fNeSO/$%tfSë8(s&>s9KcF >S&; wu#c [o\y7|"ԗ8w&c[cg!}ˆ?Ot&Ȯ۬ZHoԄM}+%%,-ҋF)=E'OAqZI<]QgG">GJYwƝ80sK3Mbv^{I8b`cg8}R8EJ\O6H*y=U&Ɵ(MmViҜOX^uh endstream endobj 139 0 obj << /Length 1290 /Filter /FlateDecode >> stream xW[8~﯈)kBh2hYa/+@mL&L4~ω6 C۵?w1V^~BGMY4q-IeF <ǻrs_b589&bj86pl,8nHX4gsFZEQJw~34rvWcnYmOӰ haƄxxb/Uh0-Bݒ-{{3) n].v=MIU&Ԥ{eU\.Y Ηk?ߺRqVrY9[,\TY)FK &&M:\~]"UgpApAM 448ŵʢ]pc&\*$N]G]q/v?4LJTºsJ>epb,`!HcP?\5n1Ydߟ}e:~A޻CdtW Z M8(6%nVrUm7d "-f s{3B}]L9Ir;zFombyލ` 0D ڐ qbRs+ hڟDT M̓]SkQXyd6iϦrېB]m" gߎW"k %_2D("?A :N`H?~h{3`Nt?rT"N!H 9=cz) IU 'ķP@VvW-WA}z^#GN$65ӧO!Jǯ:׶Cߍk}7KZ.iw31{c7D3逍&cv_A{YcGiJI,!> stream xˎ60r!)zۦI>`H@i[, pHRmhh^/ xWOBrfԋ"1Lza`Ż!oz.WRH. g|v|U,IDb2YJ1_ӑȢۢ?VO8YLQ6?zmo9~\cU |ҘKd2$ YxYPiE?IKit̋#ιv "*6).V"fZӿ} )j{DewPKۊ>*mvc4gHpHdG+k=,6lՙ>*I3tn*NNY ޛ, `c mmj+_7H//OnS6>Ҫy%7v 4sRTM}f#}F,Qg6uڮ8 [́c!wz`z(5@(Sq~%阷h-V< u/\V%,1GSRўű^U*$IPU\\26ƨvuDŽ_q&2~fgSҌgi >rEQǩ&%[]`q?)g83GŬRu_e&0 0'TF.'--:dl:S&DN*~{E ԣgL9)Oہ_N.p`AU,)Ta),E n}"- ' mX8ɏ <6_iG=޿X]1}!0%Is¯&S:Q R27 Ըf,$-)@0Ys-A"c7 N&CpM6MkwGo{@x.R0]@.\dXJ"I#5jZw3>euD+k+V}R&%i+nKo4&N5^qH@B|uɃkn$1ɏMiOwCܣ Ba(/ΒXVt"W(grAx^q T*9pakhQ,69N=O?}ڡsQKTc`̱^7qMu$9`Mc}7{fF{.ךsṼ o3IŽqJ]@(uqWpy" l؎ 㘍![ 3Bzqw~ endstream endobj 2 0 obj << /Type /ObjStm /N 100 /First 801 /Length 2061 /Filter /FlateDecode >> stream xڽYrF}WL=JEqVZ&q  ``dA[ċL*`t id52LF d".a\; 8x;3X :OVyZ  p 1^$^+űu['0(<, 27tS͇𺜴T#7-55V:z2WO貺fz1򼙷^W4I3|SQ!/vT_tT]6S>n]i2mhz=o)Onr=UBMS lֽfG-JWַ+Pz]՘lLVus%;LV}:G˥}Uմ~4ߛ@#rwT3;>>O**ޖWՠ'1xW͚S=?6裖-={Ӓ3*bI]7PQ=l2kv Ysx3A0l#6 e{a_P,UJKBLbȽY2*N}woM9wE1m*̩n+y"G+m!FldXHZAVEO/QN鍁I .mwW $!-+tJ$޳ {KY.-֖6':S߱QUAZE+S5SY wBaV6E_MD_B}!)M 5Yvw붝IꪞfzU quWnoƫҮ"{*Qv ֫qQ0Y`rɏ]g V}6/5ŰXwb+}GGۏ}?~gz}gz}3Ym0RjM([=?1+5A@d2hX/U *Q/H%4`z-8p8FD˨K>z䔜F0 fOP=)Xh#VZISl}vNŸ p)('^+ n9na#bD kvMAq]6.!]I[pp؞#QF8x:*ȱh#gl gpAdeB)6R AkR΁ v çR%ErgTHSCz)! ٜsX!b~F.ag kp:"rd= pJ9p5Pؘ_ rc*G_u1u1^uv)5+e~ܣ6Fg$ Բn`#U2ĎbsHq5N;d`,;1+S;^#.1Y+н,InЧ=F>po[>8o{U7oVm8dibJ>i[RJ.sȽhöէcp[#Fe/rt]*h\*XqSbw>ZݒU5}~7ـ*][Mnx="({^g6E=8Zq4~zæ|1Mہ܍iZɍ؋' endstream endobj 168 0 obj << /Length 2268 /Filter /FlateDecode >> stream xYmoF_' 6%[ׇܵ (hP@RI_ߙ%ET-ߵ~Hܷ}5mg|W_,_SvfYl-73i5PXr={K>dv߯d<<%*bZHM8f Bf-aQhhRVNaIH&m_Ԧܧ$S"qG`Oj"l\$yΚ|D]1]} kx8N+7K\uV:)Jsf-bFǴGn8Y3FϪll>154B0/8l!c/IToq5J$g!8hsi8,S-V3vj/ZL5\y3ƃpewOiSr 9wzBk&.mu;38x:]0AQsJ' N'Os[ #l:hShl-$DYkjhĆ}/7y ۚDtȹL.IA<[Kr}Js`G NJ-SF M"e V;)උPPR$Ϗ +2P+l"-HǤFSkEMyOsB+PmU Ho&;t)U/lπ n߇$[z_kDޚ 8g@l3r8xΪUluȓj3V-V#O}>@,=?zˆx8N+i t 2zgNM0lQE~[$G/7ΪЛ`]kAvij{Wr:LTc6 pz&/eTdžgc8:2&feBrBFxZu2`%؇!Fzf9|B4͢9-24[4IV80. И:'m&4Wiz7>ZХqיW^s $ԎP!04Yo8m޽_lE .Rzp.H*T!+:E)c;Kwj +k5FݶJU $,QR>kH$p9,[.T.Dh[P'y+1-Dvk$Wu4  Hڡh_!BfE4 )tQ KyNɧL%>=ȡ|B,}r3H( @G7H-X_8|]FSCs*Z'7 d?#Zh /Թ*8w:|e%k-о$֣qYC)N j_VgP)Z T^f}Kx+[(ff㳾޶ԯ#WuLf#3J8]J~9] z =ԧ]UF]u6aUOɪ? HFLĒ 'v¿EM]VO ӈ3g .Qk lx>ƅg OhӚ)6/OG Qو-*ưK1;4@w*>Kj6:HS3|>vrmN}<;ރ{? t:8lLw==܁#˩C~|;R endstream endobj 186 0 obj << /Length 2047 /Filter /FlateDecode >> stream xZIs6Wp 5cAif4$$Ɂ蘍$e7 7RL[Iz|o#O^~1(&u@G⁒iƒYpE9]~x}rFu@0X#,BP h7Gf` $R&P$;CE̝C8(OA(qxywcC0y{w2-Zl'{rTS"L(<CNj){̔27OH<9~:WԷ/rKmOaq:q]Z "L4nL ɣ-`l5'i%f<)<뫸;0F iu>oSߗ$ Ui?`o1.?8B81~G.(k7:Xw]Cl{alXT`Ź ,vk784*$n}@ *IY%ڮ|3Ty"c<[OHu4dήzG8Q_{u!CM n e`} B*}vALV-^z}6%(tqntI 7񦘁8w7ֆu R WjyoHQQJK2nkٹDBoݰ'q9zƽ>$VSz\19¤|t27Cox-GKPeҢiH !c8zp)'Ǽ_dַۭ:Zqch}~ZeksHG} \b:)n$\%hWcDF.ٲSB͋--3,]$u-mҥWmu/h/5!y*q)Y&yl[1.v䧯mAONyp _Bw5ZdjYjHܫT=scCV"?5iEt F7p֠ R0ݲV/ ض8zq1gdD(D@X#fTLQpg7.Q*cO zlH K#$}.ڽQżEd P#ݡ }0$<4M"RpUN.CdCMRpc ɓ'PIew[o,vêt5d2w JeCBAA!5euYÇbZ^~n̄[3l&8G#`޻  6`` $W>=īg>s\\pټTsHࠜםA&0/zM`-v/WGUQZv@C2vb"|(rӶH*A2Ff?f f+1 >(9{05Hy`u8, UKW@hq(AVҶA`B`G>9GGɄNEPtK4`AbʯHK$܃t-d"H !$-60Ԝ_eIOH<ݮ 9bDP+7:Y N")X`|]ƹD\~IG Ur|׋W_?\6\%]2> XptQr:?1+nxX\WѩlwRIWvz0_d(bhID8iY{*_K߼GSjWh}H8Sb4ܹS9Ls 3/V_X Y endstream endobj 198 0 obj << /Length 2152 /Filter /FlateDecode >> stream xYs6_52Lzu;$nnhФBR俿]e[/ A\,~]z~;yyï44eZP O+F"&ڻE&?#QȾD0לP !%:ŽGk [WRzJ`dy7xN•HԊ@b{rEnV=^#O@b!4v \ٜ?:4d!=}#DF B#g;Y8~) F6)4Oyq.e_g542Gk()h,V۞$n"ˊ9895N$XWVUNd yW7bwԭI󵝩7qz (PZ"whWMR]"ܓ(ATvVQ37NNWIZI^vA+F$yaG+wMrqu-|C f 5vظ+Nq.qԍɓil8 T ޾qޗ * O*j=^p "EC5%1˩06Eq{ h nAw cQ.~``4B¡F!YTF*Vi\'kԙ9@^qVw>7;DGaHZB|VԡZd`/Zg<El"Z4pI05c`URfjU :v2۸DvLaL9ѩU}c:եS]4]Gv 񬊛m\ !ݦfDh6($^mynM ^k΁{3E@!?{s;Z=D1t `#?FI6p6,Fɘ8k/#1TxWY `hńT5/HQm ; wzFbK+>AS|9Y4ç9V`dº*\30CjPh-5ڃ-DWa4e&: [JWo7jcd .B޹̊էG|ŗIf 92A9܎`p]/ὡ ̃9YLdSd^]@o*_D(]ˆUz ҂@]!3GU]_!r "'F&_,OGP'_#*eRaZ{QKd_ t,]㠊o(&ϬITVgj2 l[1x [S fbff j#{Ӱ&DjxĎVhGY|Y:UCӴ O(7 e? }g8 хbD<,0H{3)f$J:m q.@QosT7uY -{3;{@1V{*Po di#MIskCI8M V$~z6fhfUi<epSÚcԠhzЋ]!4%I endstream endobj 216 0 obj << /Length 2394 /Filter /FlateDecode >> stream xYYsF~ׯ` 2sH.olKk3J%[[ V==f͌ޞ| NVG3 _ &pmq&|>gW̆OoOf.;ʹϽ/sn?m'ҫ{D SDxGwl!'ʈa8\CM Q5_)"Co͌N[nf6r [ 54)91E vpLtH5t*@j躼ٶQ7B4LKViin3e:[ODY1S}g7hsYCU}Eߢ#P г(q[Vsx%v#jL::ErC_^,zX F= q5U00HHteۆHy5,qF FLk!~"I6Q4jX f<+v0-ݾH[\ߎD>khڷJ͸_g'p=ǑQ% F޸¬!z Ó+ 94J7 䳝%&ڐW =1/2(HdDA%̏2K|Xe+}tO ujhftKi8ezNB|uDp#ǧE ofkF1 &lIY&$mV9g6A|m =7YNi`3qZh2 gnlQYپu62ʠ2p f_8'/uD/ӟ\;r\uݣL#J/S AT$BPr0VJ&#DP$.3rG3+[%d|d3]1`4Yg.h;8ޚu/cabJ'I61b$ p3͌;Mܤy|Jט.z`>S~H+By/-J˗!i65Itm:aӐow27.T% ,r(ȑ<%QP0:x&ƕ*vL@ :"8~Mnm֮ƹ NM?J`+5Wp.>|88,b]s'> stream xڭZmo_>}Kz ^=vc_" Zl#YJHE.WݙyfY|wG?W `Qn2dBÌ/X$nugLbƆF*bS:+J,Q||ϤxW׿gܖeUAPH9ú*OeVc׵2Ez$<@(-nY$բȒ10,}yi( ^qNu$h2Ko%fjf2)uR-sS6UL3(>OH)&3lےėuv/j9irrc. zY}Ʊ;~DU~bEԙbaU,P#n)*\_\݂D}>twVMM=Omګ:U`QFA9PcقbLf&]9m=gh0m\E'rTL] F;0]"EHU(-s"Fz,|}P< b?͖ j 2.`6oZ[vENOyQ#łmNSʤrb^͑eRf5&6R0+Degc])@])A f nL{YF-==N}]ALF捲/NeGCA?hX%F|dk*:hEWs7H{;lĦ[B"H~ݯJo&͛f'C9|i2[)Esy*$ 7חx3 ۻo..}:?TZ33b.n++h^ lסLMT6QFV7[ݨ ?LE n 0DDS=خ^ Bx)?8+4e(`NiF뙅:&\P@Zڣ\7G=i.) 2Bl/RR@UMsSޙ#sKl 1YιL 61v`"vz,?Β ة `d\|~w*o 4b0}c z"pplWn..?$|x apq4X:,Un (>Q y.j`D(~d '^A/I#{bHEI!> ȇxヘwlTt"_̑rH/-Y[@@nӲgPȒU ==huEޢ5ԃA+&M7oymUtBq\ =RڮToJAF ID)HiJӬ*߼.:؆.z[FK*hS˵,Zfo 5BubzV~́@7"/󺒵:V'F~z;C]J;4wٻ [G+7=ϓl|j6R:>,._Am @a` 4֠ ޚǟ/x~lk )h ՞ jؽlkƕ8~`oztq ޢ5qh[1H{[s{7Cbk {)pOW3ˊ" @݊%aN+7{7-ꉫw]GIʄ{;6G ovXm lܠ!vގ[‡@a-"DA>`住mK5B PPgId,@w"hB-E$a oZ·.F@-V .~xͥ7Rݟ6SOD4qy/;4-`[G?(zq?/W]m5%g?P0Jc%{PIG}m^?kˑ endstream endobj 242 0 obj << /Length 195 /Filter /FlateDecode >> stream xڥ1o0w7帻܊Hloj0U8@.eh{:?dF:,rDXߡIIlj!Cn9y3_C~T7VX xb%H )TJUDR%oCm9ۀ_0@ ( E1& qdJG3%X1}4I`4 endstream endobj 248 0 obj << /Length 1341 /Filter /FlateDecode >> stream xڽWn8}WyY ^DI|6d74v06m +K$7!R$Gm!rH͌fΜ`K$2X4!R *}kh% EJhM0~Jcf)Ji0ɘ@}WEu TWx\A9D Jd *A3< >42m˰wͫ:WN1NLjsK…{ާsξwh{1OJU]!9.dxp]t4cagS)Q)u%-Vw>SI!iY;ZLD`Jʼ5Ȳ16 Y F7-+x*5(q*(p7Ķ/I4+12oުu Aiʹ6o`D OAd쁲2kP@r^<$=}O$fzMmv:/4ya#)d?c?/no/~sb~O46f1ӌHۛU}YT c#ҪlӠ}6ںgvl/.,--ڔˎS1HeUkyIwK}M{a7f 4Svd\c~7)1:a.qP`b*Hx_qr'iͮk34ҵoA;&ga,5)fP;-9XQ:%"ЬN^R^ A$+ߞ7}|n/'U+YOk .1Hq;˜%5lZ] P ߮)vضHTx#_:bUE $nӖ~gAVQ mQ :l[DU|0Y:wd]nҞ0q2,קS4U}FS"5ө-N?ILd"}=hl5|@x_6Uר~Ek:ڶ^,HJ`B<+\{ƍ]zWvzuG@/xsz'ڠM#}mw%0N= _I}Sp012͔}lD{wms,۪~ӳCSRgwsR,}IS3hHl4~x> Hp⎪}L6S(_- IS' endstream endobj 162 0 obj << /Type /ObjStm /N 100 /First 873 /Length 1711 /Filter /FlateDecode >> stream xڽYn[7+l79>#@p[$F#A+ sV,Gx{u3yPC K0 RCV{|%)1M,$qqZ #  $XR*[1O:V rDb\!3$66w /ps~w.4H"VUD1i԰S%ӎ*;01 R;XnA1ݩR\P^:*ur tLT&H4f![C'Lf ҡ~N9-(Օ;>A_NNش1d !Lk3:M ͠a uig,!^ 'ЙVuCiI >+Iœ4w5r#P650S eΎfg$‹0?C-Aj 4?zѷ%lXP[8V{t!`!l*L6pt1&éVόza0C/g/W$̟?;WOWBӿS,8Di>X\.?^-.x4'O$QYjWKH_1/?}wldyvq1^2zr=&k5"UI'=2ZZˏo.1dw=fT*]SIOe}Kyư(IdmâXnejEk6ՆZǠr+ IiL "ٷ%2mZSdWɯ\RǿӒo4viI-jQAs&_e_6dKwg;d[7%-MC7%s켟*qPE!r(   2fv@ݠ(x'gzY 0k0oB]lRltZEt -Pp}˒aQX˞WCXLL?εrܠ7s77:7:7:7:7a^Z]^'MWC^eY-:N[J+OPy }M 3E1A6A7l3u39PBOnt<+Y1,"Qot٨6@]o3%&75SdDӻ4r-[ګ?dF*^y &G=TRfX[Srlބl[Cb|? M-dCXVk%i2rVQ1Zv_ endstream endobj 262 0 obj << /Length 260 /Filter /FlateDecode >> stream xMAo wĤ rtwӞ=]SW7 Oy3Kr4(e`jTFdD3^}~9(Tω,bJh\X0Ax{_!zS̅Fӭ[4yؠRuv j=FQd0rIK|vӋW4jloD2cp'$Ѿ38Ʌg9EqJ}W Bɵ5e<1C-[}y2r endstream endobj 268 0 obj << /Length 1910 /Filter /FlateDecode >> stream xڝ˒4_BjyP0@2U$=6w%Hd2 ˡ;,Kފ ܾW?DyIeQ<iYD]|;m>Je2!~}DB2'(TLKdid ]$C=GEз=O܎JDdOsRwGft͠;zGSܱHǦgWhGzV.]J3Dcì/3LՌc:|0]gvQ>_/Xdq7D2KT:&}훑n{'O3ңo,xCfk3G-=t|5RӅ`4af[4|zĥXǰ^WG6+ӌl7f˓>iqH>}?akwܩ+F6@Κ$?sxr[5B4NFLFscBmk˟hzL౵+~S!۩mfnlH'o!f1bN 70(lHrIÂQ>ClU`vʶ ǯ~Ȳ,ũPeB8T2'E;LNe,TSC% 4f?6nQ;RK ¿թxBUhK52m_sȽ}Fk_-2be%-gt|ff5Jl"kihiǞR4Fw0'q[V0JԀӠlJD'UQ\|SE8%-I. h+ӹ^B+QH*B1G%*&R{n4mgFs~zÛZcekM?kG3u5mٹ7 Heg1G)<52eW7".f$ʄAXCN^3c9PnS xuKM 42#.OpZ ?u۬fpع#n55H '1q fOc!9.R?#|f1B/Dh 1Y%Ѓ!5n9])مJ96O}i0 dk )b0=2ҙB7z-u:۞'{`lh+W(`0K b+7uRJ3Rܧ/"R\*'g"\l&qbAFwN]ȑXMKQ9@` B_CݹA'DALVM G7#Ds9q஁ a.ՁDs э*ƹ@H} ,R4k>!Wv)ݘ5=:H#4"R`o>-a7(=AX=+so{-JR؀?9+_}u;4, & WhNpKsxRl7*J$YCF?^3,9 ؎nRU߷Տ]u+d@{7<>9 ɩ9jsW}GnouN#}xօy\]7a> stream xY[o~ϯ`Dv/$Aڢ RC%Q6H*.%ҴFq]mfgfVM /~X敱*XmP$Jd* VTcY,~[+JLf"I#8NDT$LKX&1z].t~Z8,266̹o 4p]mrt*- HܴޝՍvPʑ ^[b );Vl_͖}R|WU&K3J,qׇK~, פכo~|f}!0+>X3 / MPŒ}GG(XfQBg5b%:,-G5iŖUb=}xdª TH$|1,!ضE^^oGqnӴ9hm57bԟ 4zٳHd:rGsfߧjFWߑGlPR$)[E[Q=Z^we˽6﹇ '͎-s=;@$Yv=Մ;o.0x+7c˦oEoSCu>3#.0pn5:9~}BɫDFcr_31#ƒ6g42JbaԈ9yiQ#KxB ݷs,KwcIƖo}ͼ5F) >`a[T(5`m=,1yy#sp(Zw^޹ۼ7PM݁gbdpPc"2Ed*p5bqXoaA8sߏ M0g>W8s5'VX;~>$Pr%zA"?9ϫ]}MTÉ*i%TA5o/ϳ2RPڳ]uۙS{_k\bI;- endstream endobj 302 0 obj << /Length 1666 /Filter /FlateDecode >> stream xXKo6W{ç$ .rI{Pvi[Vr%m(;CRvB`S$g3>I/.m.<IPlp$Čh&.xU}>/ol^=yu(TETB+~ Lt\+'Y ֹiQJ㰭\3|gw~n i "t0`)8*ik˛Q4l}?s>5 ?nUOfzni@XDLKs (>$akc fe*"Mխnp弋ITJ$g{E 6K:bi—mrflQ4g`aSϮ)Q4PL^Aj{3FӦzjΠkg$>SE]?dPӁ_!ކp")gUu͚Ɍ{  o'g&RJtj.!6Z84fa&J7pf|HO"]3vY3FU { N+d/D5gqP/*U%.zrN(z[|ý75-ae}d/AJSzL8;,\QLΏm=U6CߌJ[49-5<Lڛu 8p8<6"?Ehpdt4x41K!\= :HUAS"~Pg³L<*YUfQwX֘ ,[eJK>c, AX,r5%t ?[7n`;F/q!Y%?\[E{嶵CIt+}.F_ Op6>WH AHMx7^v5Osht!y,,~7B[J(µ\V)I̿%D>W1Iwx%^ls]'@{P9pa3^ڡ-wR^k؂lkk\/ l {pƶ{ffA(gR" VJd޿Oi!],@:K? :'jRN>sAN b L< 漦1jf{D.G7NB"IP5\ڿ˺žAn>"ɥĩC^(Ԗ8SδL8SDۨh;c'[_5#I-kNd`S ňܷ`J3jR_8`ڱ6thO00=pr(ּh(:1E6(Bz*qݤӄqs endstream endobj 316 0 obj << /Length 521 /Filter /FlateDecode >> stream xڍTM0WHd:Nh%ar[8do&UbqD)DC";2dͻrI,9+"Ppʚ=&z51Z~D8BE Lymp|Жq"Zt$QQXnt R qlG<~oc1yߵ%嘸?(THۇ;=],t2ʄ1KL4IKPԝӌ'AѨ&(#; e@|87_{Ij~܏E% /Οz/[sLPSc'W[T12ɥP"‡Ǡ{4cCtڻ>]v~ IS壿CFb1X$M]urto\{8wZ%%)\k@3!^d>7 mBIIyrm- !|TCnUR{XWVSɞB\$(5QsIu.)!_ oPn~`M* endstream endobj 323 0 obj << /Length 226 /Filter /FlateDecode >> stream xUPn0 >&'v!!Rz@mJTߏT)ӳ:@K62/r Xcef ph_Ux~rKaPXntA4T)چF";,/.4!Z-s?L\E@|kzz,}',4\!;t{>oiMyD" 20w㿔Њ]"H岤PUFpU endstream endobj 371 0 obj << /Length 1145 /Filter /FlateDecode >> stream x͙]s6+|)Z}X|I dh>N'uԈmdDƎ;Ȑ{tyvsu^/fgG93%1g6wyٯ?N7zԇ/7N߸:s0Qޫx@]wũPXIe P&}#P#A>FSux2q_\46C@|a \ʋ|K\ɪHgՍdA\6ڱ6#^rqDa^؎\u%ut~ m(qNEVL3BlaAȲd]'V@BݶuQ6uWyVIDDѨ1SE&ckI7uF6d 1#ƒͥeN-Y2H|]:J^gDj9qY{<$ ={ĻR+>&E=J"@ wi$.ϯ[2J ʅ;ry &{Nwތ; $ Ru!ZAuQv/6>ḣ*\e"Jahj>IwiTn"Մn:½ 5Jf5e< Et\ :+x)m V+jTёa\ ۫ųt<[V(%MuF4q\'6X(C}ְ׈HeV.`1{u-ᇦ6Ch$RgIZOPסXqE2^?$Vř:k>r;ψ9.h&~Co'n;vڈ_d)r†R/G ň$ E ƾ 5g4F<7/r7> stream xڽZnWp^|F<$@I/gpa@H2}Nq([Xs)Ӌ{UŪSa C-_p],g B=KP)(\m8rMK 5X %W|P1r"6h-BfjK6\0}K De2 p!@1= Pd6 =ipgnc`/(a`:q @Ց6knX@+n%* KLACrT/KaWp璄[ZFn`$||.I-%>"zܮAMjuan dAEnUJՅ[PKz!0{CȦ #*6\^q4)\`!aV`S*/ZsHu#!`w/O0˔3ֵpAA 0B!7r(XZ桘f(9POi0q6솃+ _0 7wvT͋ᜡ%_~Ů6Xzd"BbJTZ̔d)hnSZ#=gE؞X3K߲C5lܿ}agajupwWgwq}C7۟vWowW=~͗¹`͢nUlo.v[tkW[ZZ,ђ]_ZߑEJL53f9fe9Qbl9 k*sW&& 7S!Rh(.S#թ@c OeB}ήǻ>iWlCygɉCk#{]߿feG^o~ڈD)j wEpN/}>z})|Vbҳ4SJ*5q.FEKkITA4@r"H[ PrepJ@aktsSyGѷίu' mN`:5i$sꔬ!- <$|3'+>(63/9%JEIYCX},빕ӽHbĒ zkPeQ-YJO$]J YL/A(z4ud=d~܀ IDh4p']ё2X/˜:6%kZ5M19n9Pq'퀆:Z9YNɢŌI,[ɿ("l~:3wDOl%o@sa9.c+%z?Z0+Ye6YlqlŜR>"rWߖ%YAcN))VǵOuw#w\wQS>J#(c1>dӡO>ސ0}q>l賡φ>l賡φ>lC8> stream xڍwT6ҋH6&AIJHAzSzoUzP(ETJ >kݻV3gLX i"XaPf`@q P'籄1p$B?jhө8н@R[@ @ Dp'@ayԐ(?4ddn rxp(0c]aP ð~'ŢdEE}||D$E_ǺLal`iM` 6!>`4 Sx0rCpf:#  s9_x_#~9P' #\pHS_N@{`t0@Su?  Ga1"eap׬pRCzzX e}p4 w??uG }KpeNwQ] NEo J0_es?tBθ6`Apg<軰4S"Np(SÜ˸ ~ aNH߿F,jbbvGO2"}ba1I  S `.φ. o%P_.?_F_ie `Ow50@P+59zU ƭ GiaPфœXo[\.3Fb_6ܖAq M` n尿y)pK:4PIJh4؏7|$  Qsz8#䗃8qfEq5.m|aPSH\[}xa ʨ3{>Whҍ0쮭g`4_eðxۘ l.=#dꅁ^qW~pGbi4Y%Hj,g{of@7n.ooqvruLu}?bAЫf Wc>Gq (`,{/>FEMO-бy'dp^5ys$~_4 AaEy3|Vb6ҙe32!4jkM_HJoKtvN{!hfKoD_5B}<k|Ϫ&ԃ~~K껝v[cNuK5.-W 8б5r- /-G5-CrLW&"^{As ){dʁCr}g aSiLOJȌ?Q4{0{}<$9p)b8BAxiv%86M3qUS ~4Wqvñ l`Qe @v&L2~ 'O`&ԩ9DIؼ꣤ұ7MC)9A7Ikh)7JL&}^Pqۨ5o$ fnz&[=xv=d{ Wn1e1 cGL[aU@&otw7uPyEPF>Q9-rm56 ~'ZFaWڹnl{aiWRk# L'nbҌ;کy>kXPL-y扜_T=B}%AB16G2dZ/t{~AIu..Zצ;9aݻJ0U]_u 'U<}ujS(`k}5|W&;b\R'i"vG\1ePXjTK 6:F8>1܌; [lYϼ>ո Xhv]f@SodȓR\RFkARł€,kFœ|-n&G{|WIސ};כ9]PȲ0wW]kVڛNlȴ/Q5A,q;0s"2e򤮞ph G ZYG OΫiG^tqxT4ʘƋ[AB3lDj5p )]4Fr񊣦wBo[y*ao3;Ơ1^Ri׭|h "v?g `ql:?Y_b"TgrcvUYj4Tw HQ|1+o4S:C,>xwZ(d## - s Rsz٭{oqL[&~ |˵LGĂ,B̺ڌ:6L  <?WSx=n6#ĞCϊ6Olb3/gUtx`Sdt~A4&l{" }cjիf[(Ӯ9^S\M< 8|si9{N&:=>02xz0&;OQ?j|t\<xLH P)bgJeoσ7g[߿u3=T`8I4Iц_je"<>"V{x MEj_rZt|=\͒(  3K? Y8݌%)qSuZT(>m>ܱjStN̻@Y\5z/0v-+s^?ϤR(ry3),ɣw${5Ogá?NΤZ*ڢr}d$.{g}eloMIqr}W 맧r?g{ؑX=GZKaX޵P+DT ܥO(Ecȶ2h䏏J0ɻi)|u |?Tτi;.*rrǝ(ltP2{*2jDЪwFiuo)VKjć2s~Ţ>WZPDIo~VLo^V')-wޣƋ ![FڏY$r v)`>픚Q)EΚ[Z.2^R*pdhJ;tESqq*ֆ[T8h52GJAͥ X'^WFZkVQO^񳛟͝yy~?WP|/g&q:râINͅ^: aѥvvhyrwew'rfoRFfoِfK=k0 u_ HĽ4 Ű<}amf^OCiv 1h@i)R z*{tcuJ7ݚK^O$%vIڮʹQ8m ~Ơ[zu)u+T֋Oo\SNEۈ-d4t讳2-^F@qɲG%.0nf(g/Z#]!_*`dS!t4-347;}oiSYf $e C]Hg,X(:`PtN#vy+ԚiXtb>ie} )g5F2+*A#l)쩄|_< z{iRRug xI6vS?vxZ9Lā/}itz`p \XD7%>̻H1f _=[[oMwA0+ If8Ycӵԅ9[nx/R( zGj5[FrjR?;}%shU/H_c+;]K7Sxenvd%\4;)DP*nf(+/yR 9IS42%$sM1Vrw ?(kע\ËY|0&nQ9ݧZ ){/Y{ț1u+¦|d_$];ֶuD$p41.>q@:)ɁD$cZ}y\}zd4kSM ʅw#.K6PsN~SeI[7MZ}rV/Ff忘96G57mI 蘿J8=v: ޶za uͷc4HgV%Q:XRNu 8~|z0Ro~ƱK'Zc٨)-_(jcVBoI|0D~AI$pKY[{eE4õs5j&*G!C[cL׹{Y.~Gk`_ 5jjð6e}Q^"qCl]oKnnxZ=ϣg&O4#eߙ=G߀; } oz?^Mb3-l/)XF+TfP3:W)H&T;/1cؠ^, 륽<ߙr*Q>˴ҚC~ THg.ɓo`eU>ӻ%w#ԆXo$N9+̒Y]plxxsBvmkSjS5.]78[v2TZxcHi2xP% =MRV!6~U&zıC|y\y`,[%9-h endstream endobj 388 0 obj << /Length1 737 /Length2 22192 /Length3 0 /Length 22748 /Filter /FlateDecode >> stream xlspͲ6/m۶mXb۶m۶d{9vW?͙Ꞟ!%sQt0eec()02p蘡IIL ],D ]L&eS# ldin0fchbikPw4𸹹 99lj p0Yژ4%rqS;S'C1@ٔ`f03WLt̜m*br*Qaza @Fw;gM] )_(:hFF _Iڙ#6qu?9 )&fXښ(m\]L&Nvad/?t1A;`caYD]\M#V7OdMM,]m?Sa{;?i{OzuA9AmEM,.`kd -M[<.Nm ÿtJHÛ @`dfcp03WƮNNv..?2505^_7Jm --2ok[ ^K)iֱH#Cؖ5I\v3W7=Gn\"$'N}xyu\5D~Z_`d"ju{Hpg۝l-\K@ĉb"}#]Wy2mw;FB̃+R'Cp}d1I .w嫝Y1qMtJa E0wNbpr޵ӂN*"r"ki@S7ggN?X.$ [y$瘟njc6]wt3u>g^@fjz ~$B!QpH;jyWNEvBDҶ\0oCv `,œ]IB+c)9t`C[c[qqkpPbOu;t|}Q|tP ]&<ߺ/,sTRh٩pflyeiad&:* T][he݃mV(z&KSk9B_h߫bmB#YNP3_+{}:k56W'vbן ~C7u%p# `(m A{M$'U_C51c" KTlK بbo(^|>/j}ˤdHWr`t&TkA j K6vlnc@_e˄~U3Z|0XkOC+8rnS42M zWK^lh$5Ái\:[ИTӱ~>RXS@GQxym*Gjڻ~GT~Ewή| %(|Mf?ۏNQcfHgx; =-P5ғ)+"㽳n{ %T ROvz͝>)Zj xi])kG܎?;e(2}HD1.XeFSP45 Aq{tzA'G pod(z ?1T,iq P}#8-\f3Z7rj BFm, ͏pN@6Ā|q3Zwf${ᎃ`S݂ËBb.@f*bf]v4#!Bjme%䟟':s\RD)H_uZ I-^@ KoC 9s^=ENvbx@_* Bx*S# نBOs:{`7h녹+ۊy1S[ ou ;g UuQFg%9C%/ͪ Gp㴐O:W)?T}p[lEx -&מPi:la-zc/xHw5^nj~k7@ )qjmKXhVӦMAK1.}d{%| a8$<+hKObRN`C}@ߛ3t ;@|)4RܔZC'RWJ+PTg?86 uLjK_= 3$\\\qzXڕ(fK(J>|uxTQF#>Ztxg9b|&n$phiVC81>2-6@@OGen $ȋr؍Lmccg8ݢ:h4Ks忎|n-`p"iȏw Ci63c$7rYTd wh= ʓp)`ԢQxQՈS|ݛ$D"wv/#Wc?Ufp,۔F0%:V4GUrJvq0*C%UHu,K܎}JN̢ISpؼ2!sSyK3%+9pi,f,K;O7 | E`_(ӝ*:@d5U0.`p r2 N nNJ8g~! DAԅưM.L[s~|}b +kEA,.l@7Y,yPZ ߠn'vz@`D1FȀ:;R*mV?^XtB@2D![C)(k X52aL-wwO J.z q oEaCR|F,ójܵ}A‹:2䒊s!UX$2JLؽ80(.nw)% RH,˧{Rj Ww !^3!dO=m24.|CbZƅIm $ϚKEIM\dHofvZdyѭalm%@ 692{-IRV$Ndc &8Hk*׈KUB#1~ZMF `5xZ#޵)VqD$B9Jp&kKm#Z~nB+QzE rT5Si.ofܡi{?2 \N# H wքBnLOM{>ׇسW=,=ٵ(񯸝jBn0AŕE\暫K4p@LZ[( ߉gCއ\M̓.ٯE<]hV"VDD_+S#su2ԃ6 z3TLũ_J6@\t0Vo>To+`_0ث?T$uQx3e*?:oK?*ޕ%eǻ8+?) ;Bg %K]P(eQ୶%~՘;0fA(IU }e̺2A՛9\~W<,a%;{":SC--ObF-):F᤭.%XoSծ4.,w6k1{;ľ:XÑLFsp` fB[ǩAc=bꡲQ{az4A{w$Y,ãpp1{Ɣb.ʉuj}&:{ԇ`K e?rJX1t5Ȍ۟>.x)Z{?mIABIX8KT2 #U%Ť*Z~ȭbOv)V,*&Ǥ@(:P$ {5p ZKN(IuR]T#A&TQBmR )Rsi8*qĈylqPWKĮ:CGv~~BYԻ/>8GzLF%O޺W`lYz†FDυ,&IuvWya+ӴA^(8i}˟KJF>v~8~A?Kو`) "*46i> ;X'~&o _ϳ{YրHvW <wo:׻OQ0wcאyNA\vμ&T'τ:/WW{mX2m SҬAr>[/y?e5 cB;Q*hD [*U'mV/|hٌLNP:i%o\C!.oFȳK+_=_0;*iO%jULۑ/, o :w|d#ӌںHy%^<-xc&OoA;,5BxL,,4VwR303:\IYR r2GQJHB-Rupa%Y@6sbjlz.ۃ`_D&v3)-͔'ף݀2x,+M`>|irg,$0GrD8R̅5/iTzԾG1EQӮ/J{Mp"bb')+ɣ Bfi*!SOH Ŭ(.pK8'jrz 6hY `2 LA‹[g)za9Kvp)X~*ޫG(GK*tmER 30k֦ 3s8~0MG4l%|a!wwR4 Sp1*o)#b qOOȶպs^x.,)Aj _ v"*fG.R8[+.'g-n N?X&Mm O%`&/n}nչ6}椷g zVkYe4y0H;\0 |58R zAN5L&BD,Y^ALiDFguvn}SWx -~Ѥ&­L p7.'2!@AeKc> !lm"`iH xBޒP#t _@F:J"":Fsޑp`/3m-J7n&aFɶ:\z.ցđD0ch]xȵě|18ğ4{ħ Osko`'dO{M H-ϳ8Obc] zf"i ?D> }qqFXdkNmOoF˒־:ՂXPq&vKVħ9ɬEYföT ;.ظWcqLk$DTd۪:O2kCI=dIgMgJ GA#j ۥ'pNyw)).aQ".\>n3R3 jx'U.]b5'j,ʝr$ci6cρi>/.9{۪U\0,!w4YD2ͰKT]YK׽ZQ+VoTXdQ-rL8TW[@CZu XMfW&H7ݰ\|`,qy ]2 ]jVvo[[$ahZ"4B}\_:!HPDC3''wfÝN]tb>u*+qF i4`eTuqqMFt~SYg)4ǯ`ƔlNFG`v,4G7}M$D!ӿ#6#1BLҎ\D^u<[}P.L;<м f߳%yމ0-u;/q& .vAŠe$_2AчB5F{ )fmLɉAZ!'Wb' $VT@8՝!;+ p<CdVS*IoX-k~ i>),ˡ*=u-I]RMcn  O#фW:nJN<^w,g%d7 &*"xR jxHi &9E띲Kij(:Ov|WI`Ӂ%I p=tEJ$G_t!Zw߃G.B|4{VEy>‡zR%ns賰CPvJK̓/W*bAIR8aӝ78>1=P$l[R6 ʅ1cnHB.n)35-5-ek2l+Q eIdY5<[bxw}n]M5)޳y:$ȗu^-';rΟX=00N백YMศ`B*F"s~,Qfiy()N'wWډ3{66 :7]n Y-Ts3!^\.d*ysQ4rd׎;Aaz!X(G60>6C7Ç,o\-NRqì:$c~ 8awI:iF &l;W61\v__Z)oy.>ϭ"в}ǮK&H}Bw0 ςF!}~0˜[tƽ^>vfCHH^)b\wF=Cx_.юyʭV -٩o=_)kBeqA!bsW*RUX5.Fn=hB``^!F _ב#&+Y=&Q0.2~<ҳ֝B5}̓e6WťP@ٽ|zSuxvYO.듛ťjCԤjs '10H"!`4?@c(h \0UKńT{H>Wqlj=2Iʛ`(]@-:07A}wM[Spz!j/2"e|#<1yu1A$ZGSΤ*y&v-3cP7~/JD  gDxғrjj4FWvs6#M/W͂~m'.JixgJ͈i*^هdاsa,â"2e| D5Tȩ6|N3 'A%S$")'d;YopÏ%X;ܫ-d>fj?4!!)nvB1G!r]gDJK-K[]5umvc%;1u_WBn`]  Yձnrk>p'x>;V_6?,O^*~wGc̰M:v4 LzfAjk0[3 )L<5$ ?x0G[5"#}p22855v:IDUFO[疠=ò$6/{h/s&;~]aI2?j1/߻eNF㒗{]iIOCmww*#GDJ t텣] oKZ7Q7]B. 6e`p;]fE?ŔРi~{&utÿ.ԡtW kc!qv?1  x^ >e+ {nI8+h==dΦgWdKTe'.t.)!NRAۂzgY`J\&̃1gl]褃^*3s0n&ge~rUIU$1Ŵ7fezjѨAK%L\ؔ|9 EfفLMK'x;]Ä0eA0]i66a&kij%$?8=y.ٻ~.%LX pZ/!܋/ 2+Γ<lAnJU1όasa@MnŮ^G:&~P.Sh7z!*~c*j B0Uw'aC6\U'SY[ }tcetfUmD ,XhP]3bmi(Rn'9Cl:*/Wc0*"J'm/c ^gIj~h^G kà =ȕ~<%]p6bt%[_}sC?azDpNDE"M9;9h>Q{f&[1& y_*e{eDg+Bܦ_ahӖޘnoEhِC7 KEXԖ|+6pF\-9A1z DS{4-jZUܩf$ LƤOʄ$r1NUN'dlFu5)s_קQJv"r+/G~oc<Y\S \kO\쁧^QbUx@i}Sy+1.p1A+js2m9bV>nhR;87\L]͗Zbw,[HL $˻8 W H1ȇ{rNENo&$O`޿jHʣڱ!oZOÀh? ҟ -^hc3|˩e=QO}ҞZӈ{ "Q6AE%xW&KO)'RH/[QOV^gksjR=b=jG"'8`"cE*I;׶0Rf.f`L RفZN'9VBBN㨡O8-ٌ1yd J6z_A$b.av>0'7ðQd@ٿCA ~X%Q-kr.ݗ fc=qes륱їO-1bRTY3!wAax( W(Zgzx8ӫOk5ģbWÅV̆G8F1),lTpil-`(71=ô /PądB;56'\؞[#:xY*M1-gc4a* }L_~>>OgLSmU(lnI8\քQۆ83Tqd^:2m&(Zid{/̩%5$ 1 m%!Æ5 b?)ȅRA XϚqzxNbF:Ln|G< $X5U(R9\"=4,>3$9$ 蹜s_"+wP(b<6|yp8NQ}k(;)c3saOa+pԄ UJ_2I_M :.p[JRJƤeeCSWlccBB9 0⎞?ꓲKW/,0*d?k9_~5;Ѧ[bwEמRf0I/`]kQxT ԛa>c>y(t5{1b)8& +Y&\1TBiY%ݾUҍIyCR:`ϔDŵ [}Z2n`T4:_UD$3G u7er*MsQbXd]8AqMNb6EVQOIMȈUZՌG׷mtWhWkN#X s9ő),?yڄg [Z7$jR4?">`C}ؘ翀D2[5#?N֓dy^ךMǃchqt}V2yÏvs{+$_\q^̼ɓWR^6H6U<Ž􏃲JJhZ9=2!MEmZ-/'_f³<2<y~d? y, ߐ~X"my9>=#hzn>tQҖq)MXKИv[FVzx(: LuY"BAl`@撁CyuٵERX{NmE-Y= y/4.w8ݓjŠgZ-H{Q鎮-P+ݓV=QxHk .dŗ!RebxƐD&UWyNu}Z(=>a!椊$1kާ 7|n}#ϚtSDJ_} G98><TF86^ \/hGnr.k<Þ%Q<#Orw=nÅn\$<ʄ4"m]w7/ |yLjqKfvl٭PtJ) qY9i}b0PCTJmk\keIOvmjf(T.2uKb$SB.|Nگ{{ ޖ|a >',^qkp0wk7D@fUv B cx\iΓ܄3YL5$(NDG~M0{`,roKL"1bBAp71I/KOG[B, 4k&O䀋8P(̋rN,Q3;bZ_S˼KY< 9CΊ+]SE9@r4MvR82Z TQͨ đ. ;9Uu / 1wWhMQ**}1<"O|;!٪KI5 toü>F yLyA:ym\5lFzF`ً;([%6'MrnV@d&' 'ރZ +a ㎹FYU=rDXH[&mJ=Qa_Ȁ۴J<FBo^36L't $%kVdm0RcԆ*" Lբukw'];;^α 3%\A̔"݂Mn`97Jan=-t鷖L zn[}4!UF|+Ӯ?(%pn`++T;:uG* w*?̆͵)PI!_ {x+>3UWKk0YM`v$kJJV fH% 3W7` Vđ|'WQ^U.Aɞ-6JZ<b!x`8X_}?5UӾ >oW5E)xK DagiN3z ؙKгmԙ!>yYǵ:ko:?/6+̷:T,f\m[ebIJȶɳ"pG uIY^)9. 5v,X~jUsY w2^˭0Pat3 ?sFN .UEit a40ԫ3L0ũ]j e \lM/*>q́0-syZ2ǝsK0{#(FV^' 5Gok<)I/҉.+_ubaI`v&?F KHAMUR&H 䝼+ZZU,yx"BO~A MCpϵAĊ;$ܭ) ^' W?kST.j/%B#eg8[}sD_H9 g6k#krwW"x{}P 0LEyoE8hTsZt΄2Bt\6 /# 9f; ZYV,Ś!'O}O"r&D/Sx)@d4PsWۼf EY.w᪁n8M-u"a+,֖ɋ 78 Gu|z,mP|db[xXCHf?SO&RpӰue7]Mxj9v 2 %PA6H |DLmh'+` `K{%'rD,4!PV-_ݹG,BC+ L/be7IBH {`2PW EFYP?:P]}p*$D* ?Ⱥmvdj/|- 4q[aP- 120J:($r2t Xe;8[(j ]#y3ԁ÷51**%ShUvt7Mc 'HbgϗNIr4g@># 䡠EVhrYt4NGD6;(Ti#YoT5z.kM82WG[.Oe6gVgԙY=dKy͚Po"BHƏu݁ը+ouW LHxQd=7P %*S0/[/D>!'T!:1^V^-?[i2$X} U1{5[ EajAT/ڲwsZBZ(UZ+3c:gŒg&%V^<۴?o2w=^1otye3S 9p|f" `y- Ϟw6S:a%#./V>~J +agľO;L>ҙ2_h%D2U&vyXuX]VRUQ;3S 2pY_%7`5ἎhCg2Όpnbn(pڝ; l%iT-'edw#FϹwq.t<,<ǛX_8[Bc <sGdl|Xis⧬WP/*'j F-5SnA`\8&Z6Ѐڳ.LߜzV: u%ϟ]—?+dAdv~hqqJ7>-‚~ߎm 6|?aJwAQzcFh_{6gW1:]?ZUgy#⽾ 7TyԂ{.oe,&' kI^;B1?A~U:kҍ]ԐMLz)T[RIP=lw~XS6)Ve],,}/>" U-1XՐ\ر.;81|˻%CWlţ~tX^fp+sM٥m,(Mޓr X if\5j²37Zӂ<,GsD^'i'W( ϾeqZJ;mG= 4? QTb@ɴJӺ|Hֈ厝Knd* .ӉQZgk242 /MG9rʗs̭ႌ\h-J p͞˼1" g"/OV8Jլ(C3A A w63XrCXond@@htC 4u#ZW!'{〯E;p+4o!)S^_`x>왡5 F ғVϲyR <9- `Z\q/.4>ȹ;1b쁭M~9jq*n].y٣JK6aP UrUm"j\ѠRvLﮑ7u:;h]W7&p%'h,-KWiOy_O9h Ra"RQ_?W7 =%S~XQh!Oqk%ćm\!.JM\a o>EcZ鎽bst${ ] &}UN[W9mUE3Qd́4%M9]żX= xha]d&|}"d~]Klud #w?En;uOk16%V WrCXE~q&rC h9D_[/V?y;, Glxh 3camDҴv :hs(LbG~aTm/ӰKOuDLwv`PChzq)QWץbPylpkrz 9~}">qE56}U+f*22_Z[gճn8b+[`(”y{/)R ~F1Cf}#J?w8@Lb Qg/PFj+ƕWj/bLed 7NmpROmr^ T]3# wO0I%ζEo[P]pJH3:m;ӄkR:̠(e|/p!&;t49xq5k#+:rr|+G!P8:1GpM$ČU N1 6gA(<0~G*nDA. 9Vs7 !ZvjY|'G3_s$oPDǓ D@L/bV} /2pE3G]IM&y~Yw'37JvUgHI+/`0\ȍ0 :Vp8d !̅Sc_b\ [FptelvIɿɹ7:ߵ}L[YIMN?BG;NtTfAhpkpS[c]DT?{CG:kq2s)sSjH " >,ƹo-Na7E=^U>{:=xkjʌRf} W)ubƱ#اbUсHzN Or܋iO#i SzUgiX볣i4WhgaC/0ʴL"Ԯs:*ߛC|¿ן:#^G}mOap2죸)BTh`p(tY%EQv.ʿ }C EMel e4MX@ BTJ"Vb:' endstream endobj 390 0 obj << /Length1 725 /Length2 35012 /Length3 0 /Length 35565 /Filter /FlateDecode >> stream xlcpn-vضb۶mNV۶mΊ~O_}5\qճ$#sQt0ecg(0122Y`DL ],~rMMʦ&f3## @@iL @ focfilusstsvwrg)`fic WДP˩ML m F6KcS;gS*?_ `fNYQ!1y9 #p;gM]\-,,z&& _Iڙ6quo@P!jW9C[S@/ݝ,VHC?1'd,faj`.N gmdMM,]m3NYU{;;?{>Q)uM Ӣv&ve4t2 QWQ8Yz%=t_73#' d_p]L\M?LM=LaWyBZDUS &5-v%۔4؉W{eF!n˚$-so#L%|Ѿ;IKpМwffs<ŐOK]q,BXpvy }xsPs+rOM&h6]l+x2yy865P a&xo^/hSOs4(W`jR *}~#B3UA=Ћm1u硢 !2Y5&uU@O/Oʾ`ۂjc$ݎɰW0'Yv/y]jy6< %R|DCS`<[y7-u= 쓊ܨZZ$S`3Aﬗؒͼs,OcƱ;:8:[ _)p>GYGwrC^Ă?&ɶPI{6ҏ[P,]h큐cmֹ# *xJe|b3~ɱTF[Vp# n㯱/br `38/1'R˾xV:~:>Uqh6ɚ25a!!Hb\f\=\@Zy6k<~b @],HɈ0m3>0;44nK#ևݼSN?OS'WH x [ʹ ފjD: L w2C^f 9?'M{g􂑿6pʀLTwGi@+xtŻQ4%u#[LqExL Ӡ~faM=1![+87(R 4O vkEit\9PZ0h|1cozj{bʵutšF/o.ɧwF~e^:Yu>FOz*jr._[qr:5v]]g̃wofN{F>gQYR]Vը$Y)e2TrL r{heH-iy "cl]돛'ĉM%wv=xLvI?ZQU PlLΑ(r2fe4zhůY MgLL2IxlRsIZZvI^O~sa7ugVH>l`VNu{74P66#b04륕ѰE~!{ 䈺j&,} 6BڭmVT#5=l;.OYMV<,ۙqbYt)#X {tvw Q(NdS[[q6;*G~! %<+#M|/pm_i+0"AZ3NM[~1gG}pq_rKO}:]7oHc&ֽlc3/$*X߯ˎ~nXνw ֋P;yxAu odUu֤ٸꖢҝJP^08Voi#պ!'E`@/@]I%L~ EWޏD!ZHےZ[ss!] -73g) ྲྀ y؄={'Q* _܄&vҗ ҅=O?@p=ύD [.u3?.O+{js>Er&_Z8t\9\!bxB a;V͘e;#N' ʹiLSvWeE.b_uS$fϸ840a˥ko74ǼAnKj>kIU@oAS0Wup RWz$2A_wʅFy)!"oD˟by[T;'PuѦ !(#,Qgt2mRoRD.#|bCZJG b^VPiƽ lJ2|}3XA]653oWt#t"ݛ݇AlD8;!e#y=:Hs6r67@^VeE̯|J%s2{Nz;m- p1[]&}NކJHG*Eth3OlOq|#wS3&Q`&^Bݏxݩѹ#0 Iu(*cB*gs>gT _L& >x/c,2& }ڵ:24q xGT^#_Nb8@zwUSnq9>~N<CLU*c/*(HӗT}ML){d0]NV4J(McQp>럡5D8ď3bXl6}iB?~6~b_-L)VZ2C $'"qƼlG#2򛂔/՛3~֔SpOtTc,-@}v9yŰqG/7\EH.,nIu8\PuS0INUէqa֋#O1c@Vɭ'܄P7m#ȉ "}fG_Ô ]C]S2q:J_e[/1 +cIQN==~sN-q҆aTܕW)ݶCJZ@H2opZOWC ZGeQnA%SB`wKrߋ̬"McNcQV6s=.ܫBPgJ\5}fVB$"6cIHv 4Nuq g"x 5,rŅaiYZi(mB?+;J ږhl@6IYWCB}fpFbXSP(@^lYzf2Eg녘U`bQn\Z Ll4Ojmk-G^ɪ8نp,Wa! X|\3 y@craIZmiKgMC#H~|k=Z{5P1`!J7uImؿGaj$\-(w{t-PjBV ' /;vBdO5RhwOqj:|bMuG90Xȏp6xs)eZ6c6THק~׳..{8(Ц՛sђ wҋdA!#j7:P!z(j L'OE4nam[KKr -@sp; &}3WaU;(sn?k. L‡\>Pц#~fzTIf<S^<(. z*O<W|gjCɇ(rGVthຢК]yCh ҨMz4,M5ENlƩ }2Q$9-(.GSOs:U}yʟN4 ,2I 60!2>`5r]d?HxB(X'B̲:}4oZ’ :x$%EWc+w&yU*: sd~b LVFƉd{()w}jH@>}Gڃ>ecͅFolͬCciT֚L&Ϡ@,*|R~j7#xd=m4P),_[I#9!G7FӉk3̱ߚ-^;Xu= `F3k/88y!" ,ǀkݬ2=즆h}ftwuEXDz3xgTj۞ $I㐬u U *ȈS\u#'(@|"/ ܶw2EfY&z t9.:Y2m2{^-i{êݟqn!V kɺ⻮T4&Sk'?t6X Xk*]yEuizb$T=u igx*[WH!]|k( 9BZO(W-Gq ܟ6Tɮ9Ղ)F PU,OwxT 13ONpI8=,V+fv6Sqg+.B; oT&4a#"ə.-^&jt)xKVYFgI| q@* y]v+O⌇v纍m_\׊,X%fo@6D1^RYj5{wijqco.Oe0:D o/k 6fFC#D|hD0'ͩE1&iK_t`a+ddz1?Ocam Zqs h8MNZ'sJ{{n:_r< gOUz-#t+*yQRN_W(̍W l ( _1!׀׏oZV1woJd _(2.0n F{8Cஂ'}ޠIۿ3[O4&+]qO;S r~ a䡷34?<˿˕3%fRꊮm5oE4U.e¿DTCj$HIHWy CXRY#OӠ_]2=Q۸TڽV!%kp16E": !aQ>;aևAr%w^C$kF^fÓ 7IߵX0՞ X5O?`Hoɼא_7VF|R&o/kr?uřd3n~(ܝKwQRRJ0ף2g:IL74ި8o2hQn9zЪ%BɫDzf+fb^0WiݥV~(1gѯjZ"Ce'J˛! m$hQl_#&YQրr^8Ǚieȍe1ނqF[ w8օO8Nkzk+#Bz rսW3(b!Trq\63C0*|@#^A^}нv){p?}o?X5̞^K h^pM4R 'qz<}f HHo9 =R3݁# `&NseCϑD:ߜJ/kt _1əw%Jߧ IjS*gQ`myC$u3f#ik&/.2#d;bb;T+dz$!^`kO&gq*h/‚A/EA"X"ӊY~~AvSIܠ/Ա,S{mܝ@i&d:Qy2cbxnk@L2$q Ij%Go"Z$EF*a%QLy}Ehd]@Q"lQ[x>ʕV]B{#|\Q˜7fHoAmZ}Vc1;=Yksmtb>䘤= QO!ܞ5.kJ$ot?;ƗDZ{Zm'R,&Mddnk6Ϲ Q`/T}! :Sq/-U'd)ZRE\0[X-;ו6<}Y6,k4O=cq[ܾ蹲jCAΚ2QӺ?d>{8Nc,]MOBvj.oωm\*OP>F }"5'OGnZAO7}M/ MƝCݰwq\m%3H$QZzD xCk"cSZ"M0<9t"gtՐ-+]u|-* [CQ G{GMn"6ORt=5Ku2i M9z@>i]R{58]W<rJpWVx{Un`H1}7 Eĥ@4?:7셗`@<]g{֣QV ;a?F|K(UxR]i:!;͙H`XV^(xS%'õqO]}ӁW'IG8C}/2;_: {:]+6_*O ͱ`;ϫ1vO;T*ѼcpTNtSdX]j5J=RJ\Oj8in]eq']$$}̧iZnT1k|)u2@F{h!u4)I_ShiG= VUܣ 07KU{6[}lSz^+Z6NDф$8[wHiXF qO>'BfB)j$<j+ lXPX`Mo+*} y}Ruԏ Ҩ@iI4̎E@vAjXou;}U!a᜙łrzHeT \N}N97³ÛdaY X-rsWL60c2gf~`mu̍G 'Ɔ']X3ƞs349ڢ}.UZ8+~hz&ـVվB:_qd"w{bCߺěäB3# o*K .gvG+0JLjEb\&'Ԑ0H8 3a7Û1< tcH9L+*XFRg,^?e#4XOyH@M_oHIw(G$/g_zs!<$`.WeW=00 }cNyz YB]1"7']+eDÇzV鐚wxky ņd%;C,"Y:$Fw+` 6S-'F-'DwM xwhCAMWT`/n&1㯉P`2#F۰N$F.XIppkb =7 euޯ] Ӟ+!;sHcl|)%^14} g TG&lGs!Ap8/?Q EiH#uCSE 9 N hFΊ8Xxj'djnp% J kt?+4qVBp-rAbas.'fhs0/XТHP@Xy8t0T"Pՙ⺪{%8T4>-@, 2-ʎ4RMF1>?Ǝ4hl{cX*<}xvBe iQV <h#CnhL}ûYw|3ߧTW[?Cro%D=w+vƒ@wյOSMӯAs Ӱ߷j׷WPwjc ]2! \)ea QZAmF'-%{?j˒bN D|' Jp9 :SdQ d)&e; I43dV2zգ]X*TV-Mpq85՟ 3H}~F ,ϔ8px޷H}sEf$ZOЗmдS2,kjS9drG K*lph3Ľ©'_o CO7w, W'LTPݗQ *m8 y@B2]α! /@TlUݵ!,JLbsV́۶msźgqfsj%hP㙄kIgDžPKBWK#VrWtQZ42 Hmމ>0??)ksfK~6_] flPi#$@;gy}P>үj&]limǭ\dbS{,-17%~OͷnM@ Q4Y3i ojkM *>hS03c (b1)!A5Bb "7@ w7K!g U"*?[Q9wS"˕E#BZ\d!L˄ڝR]&l3fa C9ޝl_ H ٚZ[딿`Q:%~n" A6b=3zmQut5L?7Gj/t^PODz6} Bu΃ צ&a&64E? cœi+c2Ҡ%Zey6AJB [BG$7B g0nᡃ-yt/#G( Icein@s۷j1ygkL.V l~Bd+qoObK4Dx7$c@m"PQțEz=otI8][, #hz^xA=1W~-:d5Pwȇ%RAŬj8 n'qwQ_8cq:֒ I\bJ'R|<|q +x Fj$XvWɩ@Ӣ 7Z58GH ⧟xGQǠyxSK*FZfd]0 O%r`9%OSܰCͯNz㼃Ձ7"\焖?ԧ>[;Y=f? 4sTBﳏXifz\tO" …4vs+ %ed8 .[_j9F?z?AM?N~ʹ؎!XۺnO 2m"(Z3-J]xr72%HcܺE5(fv\"ɰz.)֔Y{o540c6і?hB Qv*5JKfB则o:#Z#ubi‰:si=:{q3?d2z- 'kFcˬ='>-B3Rv`\vΪ6MdQY8h₲ۊ)? oےAb{NO=v ff[fSeȭ^ˈj⻼G9?eOe$e}6.*:T> ٓP Koff^AƄ6Dt9l-"Q e↶zc@|o)!7٧FXGԕXڡu(/RI9mcTn=L* ګ*knËYNʒOGŌNmG(}Ԛx,m+j &b[ q&84m's-9Moay..DyCH#/F8v+dF.X!jY Aqc7'Վmk&|m$NTrJ1?9󙆒}?E/6vW49$LY[/B'+o;fA)PLh]Qhs$Ue4'9RNEy*E$9% %S ]j~)Lh(J/yFvsue]!'_ѵL'd؂; VdF1w!p@vH;O&`sP Y呞U됐$zIʄjzExק`E̥Аsnvr–ʘi(lٱW<5L $nWmb<qDն|b HxCnQۍ˕D+P1m< ,gq5vi ^ !&Ĺǐ:U$6$ӲzQ|A~p2jL80(M[dK?[գC[^coPcguڈ'n4i{2  SnJggm>|lXS!^iԺ$|LJ/5M&e!t SJ#bce׺"\[Jf<nEC^E3:~{ {+FBdG36PrJn nmW?QK.UۧC%>J6C P K +'<8͘Na>9- |3!}ށźL@lֺiZ*.AXnQCkdRwt9g^aFP j*即ۂ[Pc2~m\[ey6SX!Vغ^D% LQZqg G1Rh`MN!]s2Xjy0ڴ3ޖ{oˌX" )2ˈbƤ] G$)C!.H@A.d~9VE]-z63uHrȚj^5 4K"%eiF _+Nbe>7T:=EgnVTox)\YhV$Gz3m+5k.) F!&iQ9&F=o4_-5 r\k;jmM: eM$kQJnO[sIH95HS3Bs_k9*2ښH;ID7٠؆mo5+6LOu*%xSIЫK%DRӞJ #o,Fg1 4b7{ى_`Oamlq+9j}o }rۡ;A` pFݯy:{g3 K!gr8~;xt΢͇mI7U ~{՜ڨR7[Lt,a IHcLaTk+J3{[cVHlNC!:j>:U ǩP4̏Wۑ՟6 8!Qu.=3Ļ$s]_huG2F5G`*:&/\GA)"/ݼGPIn5OV]oD ɵӢ0*䬱JD[\#_@$W޺n&܍S㬭`k]RPL?se8Tu5InuBe1o4߁s~Ù$߅ĿTZu&ܲڋްk2PD"{ͦl,FVFa5\iH1laT:%5鏞ͤR@4F}a^ ,UnT#P9$<I5M|wBپFB*M=>6x1ޓC^pdPښQ/Mn%){ğbޗt/SXID R7<,OԬV:3+*$oe44H r`H̥EW%zQCy~-̉|-=9t86:e wVw.X$xCO?RP F;hy帏5h;Qo *M)J \15orV(zѕ_~e2SbM>fv;oh(B ukQM:pw_n 3!of`z̔'b/<>6咥=N(:])WNt2㷺O p'5mDշ^Qi:UJ:@+hݎ;e`5TyL1Q2&GFIcȭoХWbw LB#5.]PKpy|:``0A_6k:ȑ r*q[SRՠSG' } 3$`!QBnq0%G B?5 NmيLhD^,otmA AV0n xRbn%kIQĴ?$$6MC ao90!h rQ$3}sToZZGL\/0K𕲎vͫ2!-Soiߚz[j_*Z1G}EHBje"o <U S,w5},oe6W ťp{9Iz;0^*x-\*%OQCΫD ڐM A8u7@?"RxLzK񵀌kdOі,P6Q?ppre.HOL/SCy< VOsb6mYTgUqdfHLO @:y]<rL{/jL}0SBh&Gx:;_z>?A p>~J~i@h'5ǓSfL_ɜTp*uZ#kA9 yHACo3\we _O[8\-;U(ƥyuGjCWS1@Z9_͖a]{ipdkȰeV2k<ER\Ub _KW#T6a3` ^ܛ-9E@i7 .7$P*^Y 768d{`(( WQP:dOCz <}G>gFIro㙙BP o#i4`2eVb/IQ ~M^ع ֻs .~.o5!M8 rsBsZEQtm۶m۶m۶m۶m۶m'%HEgWJ¢rٰ'.)SNIzy~Qe@zC."@-'~%.E!kKy;Ǡ@g0qT>=i;Ag޺CY;Cgy6hQމ8WXyWRXjF$BR$ w;ޑiӫlDn2CM^ I`$jW@L]vLI|h1?SP_R3' :"/]lFWYSf]RĈv6 Q<]T:n ![dPQJ]YNC햟tb2by:M<+ApBqU JBK/٪Ld*;7>W!UJI{ƭ PKyf dn7_ (Iu,ܕɒom4slUI)ѢVkWUqMqIu'f™FaQ kцy` ĄA]wq X_I/Vr;cLMp-sL=G4>}q]sybUXltoUh=*( yo&J`#',ӡ3x<oW#CmS l`9s-8cGY4٣v U݆*&-CD'=Rk@lY%.=%/̲N{! ɷUPB*J_~^ wtN:dI ӁWdJ9;z* haTajF2_h /EԊa-ch=F1ۍp|ycdmC0`d۾=sMzesQqFr c3[o֩Pej2%JcSkMWr #UGqU6(/kb(c^Na֎6Mhu:ZFp(6l h%mfif)WO-WQVFi2noVYnW" |X /~(eF&1:p(@pސj# xhf noazPmo.hd“B[U@=1L4 !P]s) ۻamlZMΧ0^SCCQ ":d/'BK0mB f߯L8WRCFrVf_`g'laJ R ]LإKZNiHR!(kݺW~sϼ4hFj.).(Ej*c"Qo0\<]ĸoK@s}砮Fcm밚(_˳Us?ݪ8+ 2FP"H'ڀ4%J,pX[.W%{ ȨG.QQM~uA =*;AO:vR9- !2k.~ax˫>fC+'d|S:kQ {]Ill]ZWQ*)u <ߧnU2Y,{W $|!բ  YѪٵ$#F^<4'&0SG,. xKvzй.'ԳfMC"`nFτŐ_1{\ZeUo<ԙqOJUx6xZ ;i 'u@ty%[>LeQB IM0[u=ڗsK·c n{CeߙٹQb&,(2jsފ-f3$tꐙk1f;Xk@$b3y2>W1=l y;,(#8.#LgMiqѕ!.EQ# Yj<ޖ|ұ%{8 0>MU6Rl.ʀM4/aŎLs"o lp}+ PvCBMb Uu7uX9Ӆ͡ >MVY) F>gb nuwe ":?u{m©}"Y;)B%v0G.aw1J-Xa '%_k8ߎ.j5ZyָLB˓b9^8.[^ ok(ws?R#M3ҕ-  -V6%'G^Rs'v1ϋ:KeM_SlR\ Iq_ݻs@~q3cV}jJZ v|Y>$j|>ETWvB( {:e2!Ա %/"sƭ+j(΁ % hĴ3trxNWNsjIPrO*Ӓ3fhz|gDѴR@"\ 6T$Al31ո 8{v8RO:OgR\+{5' ދoC)!7u!ħA1,H+vrKGBݿrZjo,BQ_V-lo燿Le,IwsIU~'MuiE"lK-ka!QϊX$m P1RRlx6dI` P,8SI֕oy1^Pb+MY3πDMnHA8ʧ٘g.xؒ(INHGU*.bgzU-xA=46ȏfXuu*&MsXV86%fY,ǃ_R&Ժgb49,_<|C#t4" ]jI=dAPVWjV4i8ʺ>(&|g~чܘ X 8^ (.MߜZCq3 ܺ8D[CZɔCQ̘FƸ?to2N/-٤+`V.NzEfkT;yMu3OԫQyY</~P2>^`ox쎴Rv#yGߕBG^5b,rAm=Wv+x*[*yzTNm [ajdM(pʇIW٢%Qw)Ã-(R~2}FE6̤++Q]͊X0cuM^E iꑧzJ, }.35bNC׾2˳94XV\>*ë1U#)$ fR~Idp \.4-#ʗ7٠\UIP𶛣W8._0;Sg@YiM$*6{ع9d23y."]@Xt(n'5Wr>kV)q9 nTa7F RI/n}?Rw:7qՁ)GN cA]0|Č>"A hWH=H%hvkkc (úL&.OQ{Cĸ;iP[ȌM'x"Huai{ 5<*8Zzޏxs!f_o T|N3JRvԝ~% %0x,5c[[`lt4RM[ȋaK h110*5W>(0ɱܬxTn˨c4\8Y #"RV.ۃ.SjIMsj8 vן%/ޡzb;#с ӐBY'5xdѸ?Q+E%)~!~ĐyPw|xUҍEOڋe\&S!667fG@MGaGZ/x?\q B0a= n|p*i*A~e; 8,g>G$J%NhGK?9pݿ`:~VmꈕlP::׺ + KưpҌ,v@P.Gco=piYWg8C0Q[ |2*_u3,رp^}XITQs@t,ޮd] ]터˧0ێdTDOJ4&M)ľ% 66k2z}S|\ zzx5S NA3c4p#JkU'im͆/dRl|)$@X,q+L"'OϷm"]_Q Zg2Ԟzd>78wV;2ݪ lY{83Sَ)$3C*+L +djswA\ڙ"|sR<_-ֿhOJFztuCu!_\D<\ \t9F=vգdxzks O@bmh_;08i(8:ޯ&7FSۀ=eB+I6 aj&I!ȿo` q.qcEjcj<v8׺Mjj'!  4Ҳ&PG+~sִ9J'ÙvPר$ K&*ȒTCHfDHJ 6r<|kseQ3bTZodƣ)̵ `mmWW;7Wp8 c*00 )+jTRa핿sU} 7!:rgo;aLo8~~YZJuf\栚i;^m N7u{+78)]VN ^O~ GI"9 )&pƖ`(gK.hz/eEbjѶz\GZ=lqgPly_oyNN#[lS#/6ƜUz VEr<~2# / 5WlYTVULĖ(lqYw0bϽcNQ%֕sIafs(bӷb {7: >,c9E*˧ b[ώjQ$XFo ,{)1U٫08ڔ_cJ[Pm;T5FR%)- 0`+q,GRv ;QO/2,U\e3kē?~'M(faZH'Vr^6j;3#&dlk!Aݳ_o{Dr:< -i3;<D !|Spܷ Сn#B_H|,DMV n*ىBWm mP t =ua>dEʑpH;9!F4mDlJFz*;SJz]}_<"'m@1dYݫ'eGcuCdր(>e@#Z~P~ąwڻJ2a`U=?֍j#GOMdk7d"%士ꆮ]M  -7GܑZ}fVkl}uW䐯q%lGLL[h|[EidOUZr'CP#v)z&>Ԣ=s"_+ԬQ"!'ǁP#b4'~A,hUg=@%iʠmO.0Nnr1<˾jy4B-sCXBre3('͢]Z%%øŖ3Eh?>jA2DZLհ̱`-cJu;swCȸr<Hᄈk5nœU#^e-땧M?ӫ9}wM_ Y8TU . IM6HyI.#)8jm tQ7K%N9٦2`|"0S^m>&SE` N&'V&t` w 2OdP 7<^}D8Y5$Tx_Pyh )42n@3|a3FE# &@BăO9*9SbdǽͯP詁x&UѨ2 qwoNKipn30=߂w`KOа_cܦ#8wxܫ":z>pitK[ji%=ͅeo4@X?ڗ"b& !w03A2 h V^ScHQ)3$yVfAS(֬޹@rj(?嶎̩Gux3{ѫaYM*.P2U(YD@sOeŸ=&/`쏬>)UOQg@ E*Mׄë1$iYݴÚPt#AF ƪ:/XI\hͼUXWly07k特@Ez0`c V]b@|ȯrz7(_7u(m4EW)h.3ԂeSH.#6gHәQ$<# :x`CHV<<^n}AڭUY:!GVZZmQoLŋ5MYѻEQ^Y+S.ŽdOvB{HIu -VrS 0Y#BY|^^ΓqIjR- АϏ4ZQg dV9m>w Nz&hH It`+yYh[wi^>AJF z! nEn?`>kjRTԻ!J:~L+,2ɯŶ4Ai",tIS7]F{Ldi#œ)q7į"_2 Zv{IYa6?  +Y`'ɥ:sMղ@m\˃OXV8e^`ƜlKSN%(xӈ%kiLPFj,7)8;VK,WjFIqowJIoWx_ ~bLż7?eto$K@"_=5_]a]Og&ď,-Њ߶Z-xPhL^`87'{/:9/͟*WGTkl#w5=wɶK])xW),927Վ֫iKb7`ecCutg#+\r:%zXO'4|Z1WfV= {D4SMi}r MhLcfT"QmRݳ9'9J}% ںp[)UG0GZ8aqi{FJ j ЪE2vcN;r7J A e5Ow^t,om+ȁkh} H&ōezBnZs8qKqǍɚ2 X‚hǕYUuzxts26ϯV/b~}"ϦuDgֱM0^)(hxqrC" 7YHg|)Ё]~Jrހ&cJWI6“đ2>6տ)iqcYV2% 79iI9 Q7! <e.e Fn5cP԰@?m\&^g1Vei\*QPt,͒w MKI_ >*ďk=Z]dƖaZ0(I A[6c8p"ce SXlc(<@xA-}}||sAb7QM5PX ZqG-a]K޸q!?Y C[Jb!jDbΛmwk*$#٧ǫq+ԉaW.#WY螃D[|PMѪYШ WfQ :HRV zgzhʥ(0OACC` ѽw%\M?GqxpdB:ݏ b#e> :VZKHB]$ ec@dJhm׋=.zY^'e˶?CXwkM#AoRKR݉aLZ>;酒h]X⠌y3oʔ*סV 2ac?#,#G7Og}:lI;V>Rߔg6E y'd*L2|3Tz dfz{ %㫏,+~UşšL"J| lbIíyq*@ץYݬ:'b xPߚoӶ{WFFǞ@1?pʋ۰`{p Ҁ$]zgC͙4Bu5hҾN9Cw#(hC\%0O sPyD W8|ߺ _`eV:Zi=ѣ>ux3xT)?ȸmAl4`xy{ %[&<l¿9d=MQ)H-d<Ǯ@ _*dګyjchPo\ձ O™+(,WSgaN?}&:ozsQ7iK) 9 >UWr>#rbZz v0ݠ6yC*uW|>}@dvf hsɇij*uIs,ls>T¦ Q"U/ ޘ ?=WS50Sg<2'*ҦW*;gs4U ȤoNtѾ?ѡAWF$2/ ;ў3=Tm._ *Q劷 )N<.ڤ ]f^9ȍ?}"W J zݪYzODGG\D_kL G\>!0D[d̢) F@z+FsjfOCۿ2u_nנ}s KÊWNvߑ߬<,>vD Ķ G^Q9e6aLQf]k5%1oG]0L<26>KHZΎ) _/N'ex?$ F!XP ws8L1~ T(޴f܅]62KqZVqSOs`]F,)+Ԍ7ZlGa'vQHhfWиnu+µn*h0qqDpRã0Zc{t{ְ92G#1OG!f#H"5=1rbLRy_q|0OF?.Q:n'`p ㄝyk`Κ>ntg%Q{ab(W·̞GC?@>tjXUOڡNMgZ/C6FTt[UjIh)N2x5 ,2>R<+%qrV#/Pe- JŦZ=xh[)?Dn"ݼ<1 .Ef\6JnFH ?,iP]ڬ_+Ve[>`Z}Gyqpf ^UH+ /%.HD{"jMemAMT)a(W$B܎n@nׯIAuY?'Os|;UK=R='0'}f _#/¾7<2*ů`Iɥ%g'9&OAt^W&"4E{d`/r]F|3 N$6:]% QŦ|{hXK=:Yo>?mtLDԴ-JAhJzf>H/j1q:SZQܝrIQ=>c=PnP|/ؐ10vѕHg'@N|p:LHQ }aq&qfR֘ȅowoOWC Ҥ,# [mPP3΃sDl&gSTae3G;dh.Ir\-^ɅHaVbeޖ0'C'0NDdkuȡwT'!ƑvpW2&b⟋[k&ex]>(!<ۊW/{3Pn5{o]h¡dەW+30_64QG]#?]_;Up;wƫPjڻ/R䮌e+ c8.YT6=YMDKOcimrPxo9{we֭1dJ^fQL[eH(l 눫ɳ{)~`}ΠCU!w -xۊ&[׳JCWso"6m :L' uS;ˈ;K^ /!si@YdcrQ`PLgqf{[*J2Ts>Лl-dޏ }9_ڿ;.GGCߕUG3<,8!(<QΧ4IyQՍ$\aC'G)ǚ _fF1C -D|79c綾7t]>V#CO 3 .Hpu ~GhK 7I$cB=9FIA>t ȳ\dEz̚~_ ~UHṴ̊O-jKP~1 T7:@ _$84w @iưDlCPӟ8l2"tD[Sq_\2IX] B h4e)>j3)[RǃHSo9 "<Hg\{L/4Yyѵ]?3 uT3X;z^*MpVZ!ƓYDHr6H"n)!V(&CKt5,l4\t_=cBLhF+E_{4Tw =[\kf=v\NWC)G p}d$H I(\OQ]T;R~vw-`VoGg^H H,ծG4|mŻþBJ(11'6ǿDž!ZțRɟ7"?sl:~{}iR-|x|C8?5~v ull09 ;y,g4uvݝ^P ,G[*}# dT N^._pBCgzDW㍬IS" ז9Aˤr=O(>?.k[N~+&%.֧X*V8=VWofv\NS۶"rFЀBs4_ 0)ɰ$QJ&R ~7e_c7M>}4$)6{ud_F"^xMDЉ8 <@3σS Ck*'>|A|sݔg[V*V#()g 7tLo# 1Z*e`S4`jExM79#ZQw[d<ݬD[VyyB_l!2!lc"Dd.doζ@a ^\lo.hxAkeαSzNF;q:{ք*J}QOz?P95kxC~^tvc_ U3L@woFX̘m/s$3t[.R-*&~_ϴ>j-.s$$!wϿ۩@=_|p3e {bŒ%/ߩ /R?y>MŝOVGd͞Pa9dOq|ULI/d3j y!Yl ` )VvŭۖdEsHJ 9nHÏs\ ;9AJx'Z^x 6ta9\g(}B?dj\R3n)ݎ?Qa8gzJБ50ͩf·f8ar"9 ǻC cL^*gPCi5$y]'=U htbodj_9b1)O#D&S{P~Qy3οxtoQ˦w/f:sܯCVVi%S<=m29a{{wbl6AlYbWڳyhp9_Ik{g)A] S^5V@ ʓq`~z!Z.F Zmp$slrdzeErL?7 R WsYZSLP0|A9d@wMUD 2"ڥH3]$@:)e2s>ٌ asP^{ oͻc[աbrZENuoP{/ۜ\&iC}2SHb z 7g.{ Wj=Q. tOq^f4"Edv ^vqz!tǜ'Սz39tw}afl|xTE?t6rRVVws1>0;_#}G$;RRmvq9M\z2UOF92Yn9↗Ǔ]vj'?]-j|,S>/S 3? "p*: ]ԽLduY&qJ8Wo w-Su'|׏ϝI?X+zh*$|(3?f+f|h([x@~hkV=;߀OlO-AH1Yv1FQsԭ5 7~M񮝑uהgV-C`Ùp|D&3mdmۆUiy'~AjN H[%Y]`ض'4ڥtai3{kew+qyQ`1 偍wjE~.C:1G-A^S] 0),q?'.{fLJX# 2\ڥWbwOpr+ߞه. Pr!KyYOr(v>Bg7$>2h:)}ˎ3+ ~p8^ %A8C(R׹pKZ#(iqU"mI\X)<=m(ړ\0S6ٌt`4˔.oG*L5z_x/q>J"zWxsd|:)s x%Y~R ĭUU݃drYT8J.`3`R9 L,?AS7v7ӹ`э(}67֌g}EmæYWE <L'8$х){;0}?cd <b9KPb-ܐ^ __Ʈ2!ꐏ lϿ ֨Ҙ(Y;Aú(Q2ki!եO/:vÖP5Il7+%Cބ{IaS>BML!h<{^&1þm*/bר{ =ʧ-U!Yphz'12\ʐ,T >VRk2yu/)1g>6c;_>+RA~]P EyZch)'~i܈;W(>.Nb&b/!78ī_9Y.e;䩀`!GKշwLpM!bi8@$I8bDu/T/ض6c;k\>|KEN;u)=kcT V'ߦrrWHehE+oIV4(c9 ,h:vN_-|d*Z.;,ntzl?o endstream endobj 392 0 obj << /Length1 725 /Length2 36384 /Length3 0 /Length 36955 /Filter /FlateDecode >> stream xlspf.ۘ8yLl۶mmĘضm~{S﩯?7^ZMN,`hDD PWUebb0ҳ͌\E\̸f3G3  tPnkdjeg;:YXxݜ]遮$\,VfE-)y @ hd Pt52Z;;Q&VLonf@rbB 1U)@Vt{gL\\5;ZHF#?^$z8&& _Iٛ;c6uu@PO?ѮFvf*;GW3 @ h@, 5 ?R.F!do}1Y9[y*Z÷ ?f U5u?#3 "L?Eo@>c[?_,(\VF㿞Jz7JXÛ@`bacp0/&@˿Ig.]Lfff&pk&gYi#۹MA:Od:=nG8-vU \ h@PPculaָ# +!_1xJ |b3PDYK+]-k+8DQVpD]}B#o9LKUo&ϺO=joޛ޲cm-?psJ,x-Kr}pE~ύEYcep_UF"UڅwF_:Pl7 ;bpYyAΎ=R;^&ɻn6qeucgIX@̬ٟ<ɑ(seRP!!uCLSSَp*8h1rt8)dlEׁgn M9D b{*G ""-aCg N| fV$W>b},%H8t z9R [KKd>ǘ_ li4WAR [7_00{e^KvB n|?`E& t~BQc"<[~zQW):7a3gk&y v8'b6KLKE`z?>6:RceFN3fzJD:2q*SR:xS9ʣ4r93@KT^{F5!Tԋ94SJ #;r5iX?!A)~!8mIkŜ#;>E |!]W$3deԔ@ b_RێMSSΦJ:>B0b5^%]SC7}< gZx`% q )zI~h_t ^ Rqw hޟ*'lIn ]v9}>nV$~yGu=WAqE_.iDEh ۾0{N MLRqaέƁм*QISe8]TQz`|HOQ4' [P~$R5[M0Wc`8'Ǘ8U*e|zJ 7ڳ^̦(1<;L{CMX%Pt;)~yC`ʚ#tڻm/+N)rIl@P6 I8Bmyg7Ya\i;ԗK~(U& <2[M3azXeE}OvNb_y:uɰeM5 LIFo̺Q]R8|IEEc ˵fW:=7i\h۵h݇LbHͧ ߊŌ#[ ⰤhH~̈́Rd)\k bة!ߖ4Kuh_U$EZmaL v͡PJb1 {G?hKtu Oߩ9m3~zFp傥4q*jQ ۷ |U7H+˭[0^dY$L N"E"UgRQ;b5m_qDB: Mmg,ff`h uw"MD#l+|< c{1/2]x U!ݍ8>Q/gӕ A4%]3-cRG˥_$3nDBjw iԑ U7qCFտ} U%0"Aq]6[(,s<.}:t##tЬYnJ&o"~M]oo~!3q-Es"tY:XX;0.Y֌% +xG >Ϯ{Jq->ʊ f4'ñ d.Q`RS#FX8{Dcq}AybѪ ,k%Y6#4(z+$r (A3OiƜZWc0o%w 2DuW6 FNȠ˖,H, E [_6@_zXS~yF9v0<~Ll7 ڲDd`7SA[!X}'P۾[D!C|d\NwnN+ҷv;$'^VuoFm4jydžNB)m?H/CoxweM@*bW!,EG#>+[\e%o1N#W6/"@76s`A:/BPbL0GŊ aj,֕;P-)L#Xw=TN#h34PE+/\4v$Pd"ы? ?^HlB)`&99b(Su5cXGF{k&)~!7-$DN0.~F=SKٔB"6jlz]5W]}CUnIqE 0n\B/t`h8 |00QR᳏Lfܑ!\8t(3?,հnQRl-~! }pu:FP١8s4E! xIwQͣ ._ɱ{Iؿ *Tг>ŨBit[Tr{(Z4 > {4pt_`?lS( H j2&V] Ȑhw@:uSthֻE,frl͊&37UV,CW:H+(K g5[=]>2K [@sz/T.yI^hlR=M hٿm;l;^O!eAɳKbqq5E#+(Im&|A_M\`S)=Cb N>mǎ[&OlvrOaE~Cӝd:OqI T{FNڱѠ4Xj#B{8;6,H Ovqh妄 +̳ºPM ;P{ m>TY!8 ^9rVTKqrD5,dAKG~d0w9MZZloJRbsc%e+KR(S OTNp`_/yb\yzg)f³nvz: | 8O8) b6Gryr:ǀFxV Ao``8}7Q.ťpx.DI./L^)GM$KH0{sK!RqRtҶ N&y:N9p-cqwI6Z T&Sy,.buԝzO}v@LX+_Gf!Ո܋f𲶟$yy!ǎhXswI<*m]rڬV3&̬QN_ʐO-#h"aqhnA& qB@G2#{z P a} rDmay-e 0'A!W-G&ֻ- ,M5Bub /Ñ?+Ll9^6울7h9a1,7ێ6/bqb}L nå9ؙکUAdn&wǏF]D˟OTigJ ɉxjhnulbI`v>L69:cY?=(gc_lrMUA'q!OqI/,럛);!)v[ ǀ)PӾ%ajC_侔d{M*HBsScj(D@TOKe~!쳇HQks ڏK|qD""ꅥE@A_}|m+ '+ UxX,h +׀o&0@4`/f~|Y7:/ώjDSI@gg[Wd#^_\U.క6T*X ayrL>S S\brauM t2(-h g+1V5bdPEXV#uҦOb]Hea`VuhUz5W܎~zq6IutG/n!]^fCj,^JV>D%HEE搴\\Y,v[B^%ɠE:GIoIȒ֐2ǺQyᩪjTk6?e*>=NNs#±zROrK9A%=IhLݕo/VXpD&܈WA5~c7I bXE1jy$ʻ:5D' )Zܺk\_̤_KLoȶoGzV8Y^4tR,ىHaQNi$ltgs]mM̀C_#͜GujtEnO`.Műyc5]4. vs=kֺ|N=*T:w zm2@D 4JdڴHfRшstp?'mOe͵_&2:r8K z2$'Z0z<&R@wG0ϼެ+\lf?gb-H'Gv3LI3I]%hP'~ZK__ۆϹtMmy.1$ _ w-稬;F ;i":Rkr>k[ܭ)QP j?\5(I$b%߅z0Ӡ xHHJSUB̫V^V6=u3YdCl{ו*m!_zI3_p}{}fQXVSL/i&[A/oD4 Gm [d'(“}_#Q>xxuu,ovVqȪpc![`pW]H ˭abN"n Wra5Ó"o}#ܢFGt2Gb:l[7#rΚ;vrYNX]r|-@=|dL7%|j| 6۶:ZwhRՈ34Vd`L \ji@Rz!a֯26hYf盀.J]%/+aȽ·v)qҴ ;4^ao;@,L4MC&zrl&ҵll#!ƲfYh,0bB%7BtPfT?g  0)3}pQWYHr,yx]2kUK f`IJN">G,j~ hw9a0VIHf D' nQvO{1Sk7I|kOo}~mzG_&zWw+ynI0VragP,B>Jd,? 4b*ܦ_.`V ]{!!GC2b30yؤ~`.1Taq VDe_8(?LE\.!E ;>O4+a桷e)9Bekhnmp~衭IsA^%lQ7&D.Az1j$;s;Ჳ' PT嬧Bѿ\>{u֪[3gF㿔9Ix•ųp"FG 9"5}1;7j_6<[FFB+Op ѺwϞ9>.PɋG8N 7t<=5q^1 yԒ!H7!Dv+iBײg%տgJ ֞FzSG}Ac+X FW@{M۝feh;l'Yai}6|u%^\oZV*sV pALc/U2A3t}$KCn'NxQ\iCPr1Yc/i2uoPwQoN+ KepҒ4q\0ey JA[+w{jvWo$ބ'LTR S;흑I(q! dXЩV5H#u7 )H\=fx?L8R#c]'h:LQœYqpF&s_ .{aee 5\Zy:S_e{7exQq^ +zX9eY,T X˪^ 6Ur@aDD`Wa&h8̴fvT꿲9 Enpgbca::wY֮)!.^[vф׸aZE&8&&UCIoBvx]#O]~?Lp-_ccԎn%A@b]=lbf_D\)uDnq?m9cHR7όPڻy(ͱ%nbF֨dEucXAr#I+ó^6 ;|$AiN}ڗ Boal|C\CuZ2UL&Ah Qū>ぅJ$`Ʀ6`W/"7||w8pOx)ZɌoN]eNvuJEτD%'\O4#u#rt<{-MiV;Q.:Ɯ*E,;8 \i40e͚堢)pHHm`-i 7ttFoe<1iP(/4>eőZAh#<^1gc5 { ,_]gq9I,H7 [6 LIR&nbC?/ׅ!Qز87m7 :Ur+:' PY|?2;+\.ɜ4edgEdX@)s=Ppi!6Hppݠ{$׷I&ՠPֱ#oM*A rWC?WH9FOrBRK/]6u7Ai 8'[sMopxen2YIii-d֡ې^zDP1-XlCc6qAch)+)Q"8TK_]AcCaڵ2 @ \VjeosRJD$R iY÷D=O`9{cXgЫ 0c[`ep&WeEpg|珤?­sPuLmwuI:ܽ:'kFA|kVPoJ[6?Ex)BqP.!D A7 @u-!|)~*ƙ>!(dٸu@>02Nt[)k,yF;Ϊsk9<>8Ln;t7gOLbO4(PCیx/ES~.kj)cP&N;E^x.Z;ȳںsw7Ltu^OfST=~Jf : O$o*Ԙ{Ťx<Cc7t E;їT#>K="Gtl=LVu-rn]5&{9:Kt+c\{00rb=G}W~F>u/cز&ESU]}ܘ7ПO}u-"}yӵ0D0 j /VV}?)c"68{[νVDld]C: hBaPI8h!oFWߌP2y ȞDOܾ`[Y(~+@;n[:{(7>=Db|[˹tB&EJ: )ѫQ oa̘Qr KHg%~F?9Kf(*(+ωKL;7֚ LW^muu.(4Eg@FlhS @Q-#\ ԫI0 hh Sn3gf\'b9/ahOx4i2UAέSdבtD?tφAC8T jR-Ϝ F$=j=HPGpV/ə҃cVq7K k-'#HbGi$ޞR@ '5T1Wq7suϽ(55G]1e:*zNr\hs2&-5Ao)5~'!<=D[gN3lΓ/5,.;;DxHԫ?5~_dNyPCיdﺍ/h^`"!k\CL1aOȋ:({e'ێQ+ʻO]7_EˏsΆG<]b4G8ڜ-EC9gn]VJ4] = D,~2i<`Ud@v>LMNVͫzhJ[M(WV7e=s1OP_j2 `:I<гdeDٽ< Y:o{eN2A\B-j ~P>eεv t3{Q{L=wR_=^(Ӯ};l UW[+Q;ЖT;y-$lԯD-nF:*¬g5l\l|/RsFvWɿ,w7wsэXqC bSʼn!6Iy+B8Mj]L“[,Ư_6eTT a`)UҶlэX,&͞ s'M~_MHMJ!c(Q%ЌD؜/E Fy3 ƫM^.}jeQ䥪"2&NUZK{o6ÀȆom@7mC>G/IF8XYFvuea9jj=Ox:wywQ8ʷyzmrD`"9MBT7t;oph6K/e+~+*al)rylp#<"y [ÌhvM""t %Э~}4uf# u慜(͠ﺮ%_~iIqw {{Ma6TR\lm6og{Vm(ڍr0!@{L^V ĸy DȘZ|Q@Cye$I(_mtHu;_lTT7|~|ԨBf}`VyI2@G [Ɉ򃹻;D sY֢[8 \7aH Ě_=BKR[48X'+z֟􏛸>^FZE* k3|ZK)t-Б5N:I7 keCsBbmj*/ B0hC5`osp6@ 1cᄳssi QrGd1qi/)`Z#_<WZ/(ApL&42!D)GNhiz_tŧ|Y B5- N*.~rDY XC{Qw>FPLPwpG?Av^þwr8Clk+́4mŒzJ峃*@Yf'ҡPBRq>Chd[ 74G,J%'.bCBѷc˔;/O[ fdh~cfw30QTnAVnNU,2IF{RYo ,]u0>a4E$ ^+\z*Mp璕Ō_)o?#dז(&͢ns(}Ycu\c}pmWgS;dΙ ˽|`6`UG|`H: |KTv}h9KFCw}L9[Ük&P5>`L*:@I2H~jjn%) q+!c'j;ɝ!)BȮnOI0Vnە@i?j7ҧ3(=RD K09WMm ќA)?HY-?M8F8z ]4%2pNՒ![4ھRNp,+l4/>ՕGBeӯӡZdlz'w;cP%ŝ%93q [qly PX01FUn5o]F $qHfq-B8Tozpx[e3esmy(*0@/Op0L85~p7 gm[M'?gAM7ӬEs H|"M7{=m_(E3Бw4̾e\3淨ף(+Fo2Q KMQ_P$/o AƟH(ODo^"81X_:z> ,)QN ΨJ(Վ-{Õj/OӬAyw "_+@53lCr@5^ޏzaz|آ& ~Cl iEatɀ<,!T'Nƒ#f=DmՇ mQPj)鿃Y O/CqmMN5  ʽdi_M@GJkU4- "}XA[}] UDln8aoZyhrG}GB2gHtBqxKysƟ2fjw98?zQd_CU:}/ƝfX5`$ldP7<-D=~*_ ʣgc&)y@ N6gg ,l G2?]Z;nk"i3)|!Lkqy ?aBN -.!wz%ԟ@Ū2lW'(C*KbYwʚ-n)v٭6Hq'Md_vGȮ'BgI FSC^Ym[;dΰ|Iq(񛵖GՁ& Vo{V ulyPə C7ARqh׭w@GT~1|ֿhlF"stcvY(jЫ(S2d8*i2q6[/*ƙ XĿy=)Nm?§Z[VlR49ZNuT&}:& 3 i396$IlM'n8PwrarvU.糅 % ӂ~0&Pl!9e5Nyt8u߽r(v֫ `m9OQ=̥3rǟdrPOJm Di+Un` Ca?rc)D1ke^fv#凤m6 2L4E7Jf} )>GRPcD¦QFYFlU\P"7'Cy34΢? GPVچui|#p4f 0"S~z.0}b A fOOc}|м5"v"@a\?w';F,n)p+5WkH gQ"c(͚uoVrA(MSw/Y%Qx16TzG?Sz:G( GGN'g`Kx?,eֆwG#DIG4yDx4QJĨA)bU|w k mn qn 9mv[țڬ/l5 vƿ[qÌ6]Exbb{)R wfV[ AnĞYՙI LTa[bJEN%x`uݩO@8PL.yCejcqL:|p=vp;k# -EQ2N[rH-8JL: #{N2Sk|f20ss%u.\o& ҦH@+VBקqոĶY0, QڈXL[iJ3Y zV9&6o6=9v1cl^5ؼccD}k3>4PU&F_d^`}>uwv9!j#n7zޞ`4&,ρp|Ջm2ZvZ.ۙbI!I#̢8OWgm7,¢qLTOʼMqj)hQ9 <"/Ǔ<~!h5GWRU Oz:b?`29 %:TJ<]L_TwTQbb);=QxW8*X"1'#TE!꺅2U@7N5bCTJ Z` 8eVʧ0$~#%؏.k~v4RhlAbJ_拉a/J\cP)u9[8ov#Uf~80*>^6hcWN,XE#Jv1?6dZt,/`# $,tMD{yUL?aY>B&6rbu7󩨯-b4Ϩ7k G1H(FH;.lx㡗A7j1t  O(Vpc!tlMx;ў2,g5C0Tghk04E4Ո~?W冿'Etl9먮UL40_k+GqEe'MOu<~nPDZf̲(.y!G(Ѝs[2 \`[s+4mvlTnqLWQb;Ah/#_s8 O9u`dv" S%O"^0e?O#H]q0[j6&MLX֭vlɔg#B>=h(ݲ`@Vn6#$TQցp'ErkpoӉI݊ TTQy=[CLH!ݺd`|292":m&M!=T| G@&>e#,N7MWa HѸ/JJ24sc C ᬙ'g) 5`/*2)}[D\ݦ̌/:uq$Ԃ<]asTY%t#.DK5B0g-^R;VI4w Yq`w Y&OobfdJS'' =ѷfŁVZ̖Z'jla."tm . o"? Βқ]w(>oh1I ZEnOO˶+1ڬB0&qA_Z0yv$)+ĴP_;l"L~3w,DA۸a :U44$ j]. k\A!iE쟑lfӽ֥ ZL23aD&[!pWjrBrTALC7i]];,߰I8eFU ?w3:Ш6Vx BaNtl40/0&Lv R>}kdښ%Z'8;M)dEJ7~<>|h}F ;KR=W=ךkϹg!5g.V536Q|-zjfG4;bUجqZ E_+'a `oPL2gP>\:SumL JZ^]:Uf.$,fB!R^b _;x+H^`Yׄ.H<n!ΰL* 6 42\ _g/͑!:TT;""pCrZ6f~ۍ^*;Y/mٕ~CI B/ b3F' ANu56M!44R A_`sK.-M74J$xmۚ h\aauU|GA/P8 k \)dCْA:&.'|̼sāԱ}((٥D&hwZĢZϑ&#pDIk7V@1޺w`$;b[Ľ$5F,R)=5Ђ ;yDsM!A޳j$`^{@$¹&ƬXt_D_ww}}qjMkLى<-C.i=/2J`PwD.9|]6BCF4؎bЩ"Npy@߸{WZ14*DRl̅;nlhx,A'̺uU#CH^ #5˖,N}ܰH2Ks>D1hfImP2q΄Lq<.aad0Ѧw:mHl|n,1ID̑G( qUlT[,2'"wTO3mɡ5ȍawj;/wHVPUl7̉竔;hkȈe5'ێt6_ a_,̼& p)!\rT.^= 0fJYhh֤ʖǃOb6/2fH+>Q˴R7C>η !$cDHvxq 5G'jI@DO+ 흼4 z _75 ice45ޞY4h?!Pj-"cr,re'l^0'Z7vy~wg6>JPˈ[UzGmfW9~@` p3`%53C56Bx*QWx",glxG@9&0Ѧ1ȡ;B &5?EpƙɉTd_ ʛVcc\rBMLWLpxB{c}qDz`Wᕸ;5]fr4y"UvZ^H* >8L򈖰 fzAjR}־lÞ8d giF8Rn{E~oTv׷FT 'FwMm0}bB!ToT7g9Ϧ}m^ouT_dfO#.q9+&gv 1ڗvGUк(_l!R I\+@2|% @8!uY^'/'1` &p(,Gj𛿯O!d%̊+|cd[>FVԜ<.((ϼZSގx%|)\ x ;^{ NK{X#y4d}'ICާ Ʉlt1NczGZ͊ϖEZHW)W(uuM%< "_DdYANP!;V6G)RuUHJq.$.C d=|0;G*TPx{6Uʋ/W &]2m_<Xz 򼯸05 VP„c|xY1f(5UJ;b,^v f&VO*%oďFUݱ1&6L2xйR>6^kY8@؟4EKcKus1 _Rlk$aCUYވX'&V'hZ~h{*p\T];_+FdeUrRq8~W9{؏S; wG3yE|p{NXVtc"u˿Dd,*+dG[Q0Tx$Nn:VfF2I֒A/L.E(z0l]pٓ7Ј6p,LjKL6zo+{Z.4Gaux>.w5t)"=_~!|(nlAmpe\J6/khz=RaP|HQՁ ϲfqL yMtx}q$҅Z?[&vM0d~ 4m>}bDh8 _e)jF|$Oڛq[%ީv0mZ,]yQ˳V 9@oFۺ`^O"k0{ܴͰBVG 2֜/ \A/#x&0Ɏǃ"%p (.S _H/~Dv 7z/ FQA8~%.=qݯAY ޫPg’P6+~`X*5&*h ?fD+00/RsTTIjcmdvV#Ց,Cb5UxޞU48[@ҜѰ+BmZηc e؃= 륓(FYW;8KxlAqpKOzZXUqBbu7!& GWuW3}'&7)*;38ޓ }I')[3ժZ=MI!:¨Ej^$sa8i'{~&~ ă ֘fH*ɸFhgTVl_}ۅnp@{X׵Fв$X0]Xܤ òI sN3$g8K&'AZ{AQ 7־'-!%K&Z<.&g-vnNK>J7'>I{,(ױehK=P^XN'%Aƥ{[I`窐3K8fi0N&jt類OY|mf2RWO2,H4sZ6ha3(Sy7rG{SG7ŎG/&ZDٛK~MF)c$B_.Pfg*#Bgm8tc]WC^WiPCxv1 nQ<9WIT6生Ox)۲ [S?Ss.D[";iS9>#V䭜GZtSS8"`<Ǩ,&YhnZ|5ɟxq:)am*Sa4oÈ.;4[ 188g^|NIv@,Ty;:fJe萙mU^kŭaKxc]s4m!e3w7*F|GvC[{.=9>Uq:{JNސ?. {>CJU]%鯫Iu Y=VG3 OwῘ/Gؓ ⱨ:Cke'eN> gvaz!5ǍjPx-[qV9F3M[-62uZFb2iLRWl[^=N.?>pb퍣UcRN6PaD.q+yCt:i4)+m,!dBq e킽8aE/ $w+'pxZB$P'lFlR­ 5KQdteapyIw4\h:n2؈&G+T Ft7{ .4 k·_F疔>bXE>5xQP=p<\h7YۯOfWN:T ;9"XsW5YDkO˦.1 XI #8cL+A*6I*ͽe0iqkBˆ U:POW[ƦE|L~~uM i0eoY$u}YJ>W"U /1М+y|exu>e?x Obj!؝y.(~ș%Vf '.궙`K)U( )೥^ .*ym;.F$QRT#7*}P}4bzT8Sѻ w!G/vP'|-,"u{ 6e n%;:\`fINB} ug ' 4kscfa\@'9-"uE{&rzK,MdU)-cE%@69v+6ے.ϱ  x b"4q>`EtaWyyڇKa*EݝNfGYuy<`J\@zWF4H;,e Ћ=j;m~tkA^!%|.#r={U{3rcH}y˥Mะ(nM"$Z+fW"JsƄS*"%Cʫ^lk*8 +wl̾"{G̶Zm$p`hU#2P#̋UvȄou]C9v 94J X( ΓFJO9 5%J=T ]䴿A=YP&oKj[މv ,~Ιs":&ɧn?Xb{h"OpjgJʻ&?lM\)"5=0)?{R.uL 'טg: NJKPFT'żeρgry.GjXRLy Ȧ\LB]"qߗF`X/Gs_1.s;M- VJ2lA;(5\$oW\ЉyA"eb[vVc +ӇU.5)-:1B`RvUp[ 5Hu Kxslj Hyr#Qo OS̅DͿ5VyFܝM虣QkSrlLKfΜ.9[Mrv f HOna A8xF:]tP&aA4t@pQ% . S&b hF"syjv٥ޜqG'mЖ^`Ӗ/DCksȴ0,8lguDLq R^qǗ>w3u˓<`/] 9fBs-/kA̮o6&Nз!VUR- ‡+MVO*xOY4ݴ)󎞎 6%<;@qS$vj"ʼnɠK ads@Bd*+5ܚbrkaX , ^\<(hpBBИx&k9}}J}w{KsLɆ = e!ܥbG,a3^} &MЬ<_%E'mLHWkCjE塣b.N'ȼ0i.%` qBik(<"UnUj=އlxT$ LZ4CQ/Lxp ?\E\]2q+7⩘%oL@B!c=m>Q)PD)1HJ ^G-s˝ Dhޏ@Uǀ6=M"KVG c@D*?dr:eăN0*5;"G|%S"EymSN^lNJ \"k 95E\nքG!<~UL 8r; b7"΃Phn 2A$p"(ogUuy&B'cnTCiA82< [$f8ؘ:GWh˛άIfŞЃ{9dSc<<"FoQeM~W\3F0tSZJdOgZ: rATA鴷FSLD{sŁx^ukoOrQ -"fb]G]+bHX?wl,9ɧP8,ѐ]G,~/PvDD#Gfj::i1f0}"b)byKoW-'NiƜ.lRi(R ֊?{.TK#֭ WsQ Ӄ,FY:/'NE}) Pd[%L}}#(-}QS8[<5L[3UB)?T+gHDU $s~[=޳vpzQ'bLqq<4A/zm.$( IkOKvV@w{2UaK_uI{Dcr^- T4#WV?Bs3 PAU&揣1Aeq훜w8sTgcYk45 _Ih50R0nv1yTLYrtG 0j#kǖ M45cyʔ7۫8 Sihti_҇YWx%0N9ce)O)]'~xָmHT9Jo Z:bszP+h=qVLt"XE d8_%FBWtY?4.F+vV4)ԧŻёpGx#ћĦf7Acj0%ı֞B}wFItX_ur'xh2ǁJu v#d /g^֥(ċLMK+AtgPPC'n BvAWn:ضΛL2VYI~Cm2C~D4H9q3n. ?FRG[,?V9t5Kl6gJ.JMB}T 5I'/#*Sz-oB6GCܪY9 q;Bɬ Z9NuxLV[q=@ &;¦m!eЙxFS:z @gUQdRIfU7sdHzaR]F6Ppӏ]KL#"s\srX̓3FQ.‡j.dF;se,tӣ!Xv[y6I"4iOdm;/e-uX/? B=%}M31 lQ Be"nV:K~_ *̺ X֖6ۯ-"(aX'VH?&6@Z^qKpעQ߃$#Ƚ5(W~O⮕H#Ihs+Na'W8Yh\kd6Z/Lvt}֋nq>_ςnF0{1 ĴU'xXJti)w@<u[ t!|IF'lłu?Ӌ6,!>o⌣9=@kv0W:~4;F@߅ Ԩ/5& *G QMӈa;VĻ5KV< ;fUk 2z%( C xrǜq^.dk4.6%>GU],K}??C*JA+zwTXQ_g8#*moUG;Ox#yHOf߅IOR -b2U1(oşO]ńߴ)(3'-Co$Cad Y|mY*-QSXYԔ=>Ire yk: O'ksM$32^HaGe CUpIpdxb[v6vwpkiCR; kcus y1ZǨ$HZ缬:-옹y Y;[7e_7T;}^|~ -A`D͙𲠆++Y"UAۣCݡ_ΥRSMqKf|a{p#o5 KM{-TywyJ1d\ъCX<]Ԅjsxd(Ba.e'hq=_(^Q___k\@d|$3 a<_EH;FyQ;dI ?ؗB#I/MG=ѿN\pC ({mxK`hh%׷, &C{;1bd83}-L3%^?H]LFˮI68E Qs$:9ȇ5M 8wƳl5j{!/`o#q gܖ,*jޛutS|m=AH#˨Y̲ `{SWpvx}s{GOravanN=/w9YHܘ*G2Skah:4Xj?ZiE8s;;R&X}Rs8tG5l՚gP3"~[Jh9 "~Kdh~?% wep-X{&8}뭱B31wK096<2jmtE;PڱE]|$h6&kRW)qi'h8wDnZf!;]>z2m )PF.wwmM/u :4~{D{GbY[7J~?>'"k{*T,햝p ~臶s?!X\{(aCWue]F% *Eќ*\-E)El~D+0[aY3h.ofSQWrRͥDU_. E]6- ^*fA HbKx1 -9T 㥭TS_nj-n)PlP}b@#PZE cw,l#sR׿q3bbU=^ 2?. 0'Ef6I6ZX=[ڗ`J S7' #}.ˮӺLYb/ûB$}Y8!%޴3P⿙ ᶑ^NXGuSG"@[$}$E!c}A &smG<4 s2CWqFjxIW5,~1[K?S*rsB.$:b$ 6ڵΪ<] E\22e@wB[>La-|K\u۴pxq hO=1j 3~l&cuE0Wx٭Yyf,#CW-!I9<1(z{S>{!7',Gy1}5P5`Ol±\_g"Χ8Ԟ8JaҀ_[xݔ:YWTYRdM@`>@]Ǯ}ʖ oD ulYBU^ __: A=Wʼ~#4R_]l17O$C_{w7l '*Yn B *N,O5Jж 2#*Ȋ Ϧ^m@i-lY#`h ~vu+J D*t\:YoP5%Uy1?;+%eq97YV'alL6<:Ţ:IHw Yi{QjI{ S"C+}ACQU)[XR+d\Q5G 1ik|E'}=,La Y}֭fQ/Ի5?Kp*&X*>K"E!e`/-&[<93-&/.,V"Iﮯ6zc|]d!  l$+ HU^ڃ p &4)H1I? _j{KC#:i ,eO5INup[!;ƨ bL$e뇶vNMn_-{T]czkD JRL.-=-m{#S:btDZ`T{,;52MXbKHH$2?"mVBPMLB ӑ 7<ɲ4 "[y>x`|TV^,\ݵP1=جc>z~@:NͶ\|!,1A w joVTSxxC1ub \]4?1+˸mU ڌA 3\J6gQLo 9qsU7gHxI&WZPBB抭lSf$dIay"fT^_QX3X{ bU+" N(]J._/UэOuܦ8 Un[HD B\'x^Zzl+t;dg |[\tD=Aݕ鵶4`K&epoB(v'g T"0; z}P $b0_Z.%^NXTМ@UfDp%C~db`(iX'\u雐mr֎#YTUg5.ٶgDx|4ʓO GNw2\!A*ҵIuO6 VAFI@kmBk>熂Cd"_ %6)`#b'{靊&cjj̺C9(i j٤^[ bm3EH_/Ӑ:*쩢'9@ sSd|ڣ``  @ȫMD~;'mE09Z'5>_ⷧ|L#LaZ6mb44C 5$0u`bBF 9OwQ(3:APL=~f~{+}Qy&d%YK&(Tk BwYz1w &v7nw.®RjUM~/վ,7tƮA 6A V2=lHnzqDkglL9ZslA/mok<8HܧQK,jc7) n) [&h?Pѷyey ^^Yؖ7@^EjLZ _"!W)Xz\o1eRO!8 8!`O&-*wN4)66Wh}V*]Z[~@:m(53geQўq5Mwyr=cbFʈ dꎢ6xS1Q{W܂WWy ;t:'ODoN*t' u.݈0%70:F1Ătl1-JqZ\Cxv{CLϳ |"0I WhIz҅xpCo)d`BayV`5bGh68"36<#zLP'@q`y)ݼ+®?Xξ5f6A9 X} > stream xuSy%S,YRU^3{Lţ>Z hq!}K) g .J:ĐI|uyg%&YWcns,M \;Χ|PtM_6]acbG=߼̎77)g|R>y9?hjKݢ/0bm O!JDy[Y2tsrbrkM7ka.T_Ӷa7+ߵk߰T7ISa[uIs!'l4]@&WYtć5'g2$fzmݖT*]m :0QE2ϯl"Pʛ&%) A,:lfmAS>b5,.Ko-: Dǹsͺ(V@8V=4zOARw1c49;0yzxlUmKOpxvB,<-Vr0 B}\Rl_d#qڏo_ඪF]T7NsU#_dŗm6G3♷)MV{$⠯`, :xǧOEOHlR y@R"N[A%Ϲ12[e̙đ^[| >⾗N3#f؟Rц$rzdozaEy7/ 3=Zl寞d>; q͊0~q}+h ["_PgzEKP'9L2>'ys?Pf;rG/ezU?)ty\6 <90f,W{Իe}a lhLL{L,ySMQ)e/+59~rF͘LuD tCCNb7.-vf5;=Y[o%_ aYq9)?b %F햴=dnc3q@QIF۲TXrp~Ovߗ cU>b"f˕c?p~xVE ]k˄>| ĝHJ$2M3܈0vxhn-;"D1E i"߯%=:V;mhzYmE5dn6е`MTUy7\ft-fIM^.'aX+LoA&vRT2HؔG?>xqMv+̞7yo|sdO~PP^: xPfSpw42G 9)B% 'I&v @cCG\p2a~t&[W-12]9 T@ھ&bT-!|h@]8P2sL^ # xa޸{ IW_d wWb?$~IȏSBT#E_pHsmzEKݢDkբzFhGܘr#iu6^Ӆkjvlwo.n&}g@&_l!QP8eԸH;o=5/@LS-z/lKl>yd6aa5_VE0ʗs'9g;vhBj*GnъO&.xU-~& 9·NB!x~ k/Nv+up~G JlK/cu!q(#-}?ɝ͍}"X `kOк[z34,XM(NL.A{[AyiQpq !=b:7ҕ1One(W1sϬ]鳰[Lh%2ȥTA mP.K>RםLDT]jwWLϖqkǎai0sxnf§򍛬tBsxpu@ݘ#|JgK̏u9aL -Co?d2_f<~\0gŏ-",>hLv'g$vPɽgZgֵAɘ\PV,Lک0Q`Wه;wf{r?ߝGVL./ 0}z5JSy+:X|P;BMƬ/5KTk. ӊH2{Uz͓yU|qAdˇGgP#Z3oWc"++ko֛1-ˤ爾JJuWs(֪Xkk$**7$W{=vxP$-rD1$EӴ>a|"K#]!v3̔=jj m3?+;9ӟruixx?Fz#9%D`SR` G;IپrE3Oٶ6@2!(Mc,@5 ֮s?uwBv+~aT5˲ɲ Qz!-9DuhvH\IUnȻ0ݖbǝR|`&땤#4jGX'2n|)[4P]7n7'夃5~<"l+끒×c婡;c 3sΕo5c,j#QC]n.N6޴-e5 Uƣe}&7cbղ%^mԗ _4vwL'O_pKy)׼!?aCsHsPyKfN!yqV#BL SjDw2 4xwx r´AJlyT͘Qc] EN7w6QLwHC C 1ǣFo.Wn"ϊqY,L+McqD7x[Ongs $R#wn|~-F{㫰'oL˧jkv1yrD!u%EĵwbeKDUWӊGig士󧯺sF&~i&mNZTxA7> endstream endobj 396 0 obj << /Length1 1626 /Length2 14467 /Length3 0 /Length 15309 /Filter /FlateDecode >> stream xڭct&vX[ضضm۶:I>{fY2pu~EAB/dbod*nogf`[8+s˙X((DL v@S @`憣;x8Y[j4ttK ZF:[(;ؚT15-Lf6EM)y @bdci 46s6;l-L,i͙o.!g!o?oS'[KgKg K;c՛ _ۿ흁N@ߪ 0S`o埖ehhi ed 0tv1[o2'pq3/NN&6tOֽǿ0XMmY4mniϮHٙ7qq6WS `bj(o[@2 B?r}ZFC;;sh\l_!6_Ano6&i_Ztt75Q[ m_z5;S'K;ӿkzf&ZX[CMv& /UϨ.E8rT@UG+r&K'; @(D%,fbW/I?҈ۛ6*@C;])kMMMWyҳ2y#S?GBʚT k Bgx>;<>ilRM |h Q)83գdw!8~RR+}"bu~'s- t@5NkFiA/:;L:yz8ˍ5M9#Iz87Br:8hI0$tfʙle1h0Z}K-lX*Rw 64LIR?zdbgfo0G8'(qggaO-h0enyes?p #} v0lQQsK#ܵ3M#ϽI}3f4%xϛH3[gă=VHZC_;wa=cqqo^Mŏ0JT2/KwI),bZ&OXi0ImAKsineIY4~J0)H |cS\AK?T p!V9-4+8fG^Y3t {s R7W[eG^2hψa% .( zYJ]mǧ}Jz [->0T7YpTKyz}d*8u!dw{_k)?W(Z<,ИuzeAi7V=aYzr}B4Iif\㍿LaeԄFƭ{9!wm00ƀ0- _i\OXe9ס̯ACD6 n;;PS2DC|%k'NnO 4&4 L١=|~5wިSruŃ:wh92sV:oM ǐ+\g,?.'qo"pPe5P]>V9H#}*M:&`` 0Acq70C'=~k{XeqdR*94c/jX?$Ѱ铫Q4jfiVSHaB}xtկW6Aߥ SBTD9QI뇥q6z5\*) e;)T(EǴN3 95=#P*PpEY ͵e1"Vt8<~`,wiy}IV:XU?{zW >S9/[8bfM:4TG.?99ZXg E{v+x zM} 9Tz79IhiT%a}F _tSITaMS::SzS+tyl6}q] 8&_$&mg;l|_߮axUYM'TO|~%@T:7)׊} 6}ҸW&yxtl.j/V޵MSv{ :$ nm> ECC. yq4>{m -ÐU?g'GNl?;C?p~`Ęm`G撢I}FGs}54"M,-kw^i'.#@2K:L.A$q2;#7~Apײ?#e$%g~ɵM:Xt7{5!'ۍ0A*ٰH =sLmp4!7ᘱ竪p4Jh9zLՓ:Lӻ(F7&j[j?{b~ `VںO PBZNQuivۦh:L%?>_Y5viқCgfY߭fLn[0V (ON&C!7edb5>qrfeJqRX֩e g*3c m#p޴ 1, #mB߽yUkV&zɃ벤XSΞ8鎘 ];-f(.S|MpWEZ٩2"uq{3>BSًߨ-n}Aedc..$ јh8N?vUr>Br~aemJD,bL-R&q3}8"/cw3h۲Ʊ_o7Npd"u' jHXTTjU(XezcM38J*qg2s3iNP.x5fR,u9XUv p׿V~pdb6ND磎o9ZzQ; T^k^pG} , ^=˦c+O +"_'[=> F&$°Y,!6 #tN]Uq`Uzq* qͤJ(+]G#tp)R ?* _qR 7/ r}r] ,4aHDJxЂt| 3F8ghO :TjO?V\;=t`SO?i~x>0)dNSP(fŪ8r~J5Ȣ(ϝ?Y9ٹ9d7jpC! @ lDܠL.9$7t9gVnBsrF@KE1`JS b!LUJB~ԒcGէDGHZOLWJƟ fi I0K?~W^vR D 2/9O>>r+ yS_tChl K2~EZh`.&[TIr#r;SI|~DƦjDAcw )ڵK"6$=U;C c kpjc_*zµ0`)~n1Kn7DL<(ɖ4-V"됇nKޓf+$eL0d'+L8Vؚ Pެk|)Ε8j,a_e \})oȮ-TaPQV/x#?* '֧"nv4^-h&,2e b(\t'2[ked%Q,0:wNbkʂ֎q7KJoyNЛL>A5'hޯ7i$ ښ`=1w{ܛy7Xn|ԂPз SeƉcn[ _0wr46:zxm =>8׋Q2byCmh̠u*M)'V1غDŽX+9o5&C|=6~糘ec\;4ݬoD :(Fz?It`e0SuPނVsaV@Aj):t+nAcٴ|D'МI` \[Q(,}$k=QxЃ[Jp'}K7 g'Z\_1 9Z1d"N 8\gYb7(dm!$| ŁL4 `5ȡVn{1i+ZTNzC#t•MnPĹH+5832yE(pe 7IT?Yu`Vut}_gԵ5.mfM9V+ZM1$|L~td]ѷvObIkGF`gVg2gqT\ʟrd䲎CsKa ?{2Wr-N17vBj.IP1 FR#w OUaL2EykLZ=Ryd[)YKH ],$%u#rMEL60,}0!aDӲqG$V%rx*H C2?6HS*0E_Y~2A&R&G-4_L QΊziA[$aüJ)ÅjVmp"TvL;Fdo\r+N<>D՚JͳnL;DZV]3 ݼEG콛lǁ pweU恊[ S± ]۔٥#/!:UCcL@b)[+Lx b/ (gp/)h#ZTbBYJXN$Nܩ- k|Pٳ 57%93\\:j0"g v<.'x+5)iJc}˄1*H*F^ 7]RJ3d{)u/\1Ekgz+[ icc9aE,R嬳yCb6m+ac-$5s7]? PVͿE;/ʃ˛E SHu?]%ԡhG-혋=ǟZtI ɞK}g]l C;ıbp0k^*%h&5nJ(0<Ʋ^y>5ֹUo %\>F^GK,{o 7!}׋., .).y q11(74>88_絺t@ccGll_q^$_gN \ * eQhƒ%l%kD.I \BP&?xGg򻗮[C{,>D'2_@Όj@#SV*3=x![iU |wsuQA ٜ"WL hkh,kmwmл8V]1^@vaaӦcF2'ze^Q sn,P Y_ m?ТѨj-Jp 7C^W:ɰ jb4 %,2 5nzJ.fϋ;PXr;EFVo_h4֋x9t?ʡrb6[aMi3-•.O%5hNIZ+d30$ |uD"ByTLJɖc:g~nX٢U+ 6PȮnD=b;`W0KXKX(1 ƕy) 9闶˞$6cnDETptΫFSIK.iuggZ" t9tc$d};boi8xoOw˷)+Wv6| Ms&iL6_ӲDgQ^\y*Ze3UyK[X88q­`^=}d7ڹ 8:xH@Balf֟f|cƁ1uw);IZmFب#&*3[T{aGe}0v ZC=<{X˒+V`r nAbO^+(|l оbe2Ojj*hô}j(`䝪nR{ckvc6g=&Z+P45oW "Kf*9jZ(sf#azր hX2nj ӳ_-O*_WB,{')z)_iHޫ 焹c 5GVtkzOfbrӧ6" x )0o[tu|ܑ$J"js\M;oՏ{)\ӽ%X $*ZO͐:RQd V\bp([Ic&M5Rްw _P`xC(Vop$/jpA~bX}'yZ[bS )hX?>g'"Q0_0Ѧ ,4BĚQCCOL%iD#gd9JSW:q@S8`RC(3qW]aӫS~7GW n:xELΘʺ9'u&-2Iijn}P,-}݀)_bkfxF8?7'% /P,nOIFIWb!i6k/%lu ŧVCI] $ 3^#!Q^߽TUǶ1V&Bt)/Z:)vF+920Xts#Jz!c1͹4[&G$5#ʺ}vM#ŝ{6EMܔ# &yjf/b* Ck$+࣌bHXimLͮ[T9_7$l]BK7=-^n\/w+t$N ap9J@l%?'߾aH*(R #5xuGƋjM_ uR5 pI!ak_{cLimF %OBǏ+bT3@̶HiZP+⡌WY&O9'㺿<@0\wPv9.NjI >mscDB.MwhrNM;k՘ vTo+Ty]cJ{xCU0KcdsxA)B`R-%*5%4=PRNt01q (w EAs1X*b?᝼w[sLU;)̦xbBhcwLHD4"iVpc`&cuJߚv}4+Q&BPj=aߑN^ƷA'kIPv5GJcNy݅ΧB,~mYoҵ'<4:n:(RmdЙ};AՔ?v!ownC3).} J}jonN?+E 8CM0WћSRT|^"w;is.7뚢I_&J)1xOJi|ަfa行z_=ūn'Nf>6`أ|wM:x~9/TnJa 5nvz#[ew_ nVGkO`K5Rx+RnWB>Rxo~I'$M 68MPFs؈@vfvR[f*qn/ѺJ Yi~`M,q:}#SkE1C O+Ɔ6[Yn1FȡKXED2bҙq`JH9$9}}w9Lf廏 ?C?[/wQ ]gqϼWn2c>^C7=yЋMEK5m"CVwvHTSty*'Q*6&RPWvgȌwEDՄwrcjs)R-ZQDxdv5e&?KYL$k=Lq:'yW;kؖz zwc(Z!ϳ`<#ݦ2H!ZA}{,ME,jwCDE5jUoRQ(ߎ8'A ɬFR̷}E7oG0 ;[,P{!|rݟn H;|jZ% |ʖtMo{#GAS%vTS +:7rX``'-+ĝӞ> kMkƭez;+MUnRY08NbE*T"؟t"# 7ޝ 4g2퀡N{|Cm\q9qo6Z"rDkWb62XmjT"Y +fT2(BB lG^O,f{(@TZET:iSٍhHR hW|kth>-A һ YCxk~-Ġb<vB_u礇nmּJ7JMg\"KYʸ"^NgoG' 't>Ȉo?lg1?}۳lq)O*٩GSg.ju5eCI[(ס10zU "a`uU>sg$S#ʼ`j6+&w03w\X~X}h|7M(g OlĜX1R"#I/=y׉x"RY;˦v-ga^Z-Iv!ّJ7e#9ϫ_C7KD*), _8 GPx k̘uXu&NUU64Zr-6F$G'gNʹտuB੮z5SD{qpZrZfHag0(ʲ|plϚ3"38C/2^,e}=NL*#?v^ K|q+Oo1}^3}M19v!;Tf3s0oMi("<9ye<bW/˒;" O ehM5(剳ՓwvAz#h RߎR7kTL2ȱ"1_OrM YC4RXf[ɉ(xJzqO9DPHS=uO?a (bwf]C5@>b(XMgh3| uhR`c+N"&].E#BO(tWp=_~_I#, aB=?0P/O m#jɁϋ ^o8lYT\oݨk)^g9x s($,iv#qЋ\e>?|"ZUؑ"S },Lt ʄH F &$T" @=jIĻŒDk4.q4M(y$4 Lܳaa$(gG#?`ώKet`]!o><z- &) \g=~AnIޓl[T~Ni\#Pdtv{b+=>T|`]yZBvLP#+ts%Ya`X4k<@"2alCIi=7N[Px:蘄eأ|.8Pz:<>F[>sݟAXC14A˫0g iLvuЫ 뛾rs9J%:4 ξs9U$BMC_j+[%r:0qCd 'nvF3kUQ]0/[){?bEL.Q 'D[K9<-ANvCxTC=.޷<,֚Mb<9e|8{B$wގ^ QL Vz1_V \@Rr{Wd7}kfY?;&}]@⺦ZlZ.F+#H«: b)_ѷVbr9fUQl9<&E|J8YxNռa~@K}/|;jGD_RE)E&ʹ~EnwMT]HNz2/)ej?/z{V"Aa[Zr<+%e֗7 b v\V@3ճ?;1Kph87]#g悔]lY_8Gy'2G>HKJy!P30yܪ=GBW<}Ն<&~HE(a #e{ YYMv٢ ֭ G.["Z&֜Dfv-lsfѥF5`%%,50_A09rlhaWʗWg"ԮեV)s@^*w\@/ /08@:FBL,)L_ IcK^sR_eٿqru aJ\Lnq@(T@`#ygwZ.ncr3EF)Yr*ɠMyntpyEi3v:{jUb<$H g=V aT֌s{?VfJQt 1&_ʭL-iPjbHx$?{w>vs:A]'R]!$}8anM`UY񤿘PB5l]@. uV ﳊ C1գ6AGdyyVYbGt$I8}2cJ7]t,䮘&YNERyVp%OKe?!y4wEӶlbAQ-[b 4E}<;O ӊ\ZlixV endstream endobj 398 0 obj << /Length1 1630 /Length2 17760 /Length3 0 /Length 18587 /Filter /FlateDecode >> stream xڬctem&Tl;ٱYm6vlbTmvŶm|o>=c{⚸=Xc+ ]VvƮv\fr6Xrr'3#+{7@ jf`a0sqqD<,,]TjԴt)`V@73[{;3_kG33 %%/WH͜lƶV&Y+35 `hjOi Fg3nf&ffNvVV '#&$WnnZSwvq6qrp(*<],\lW 7kijoOIu1:\<\el0rv5/տpuZgt'3 #'S[3g0 _7rpgV.f ,cmaegVfM]CfQ3302zLa]P߱G-FB%c3Y?cdgefN&b-B@010[h,nafhbb 07۳ՀfNV@zf&S2CۿUf@Z_?4fP z:T#go? {9,߄XX}7!g9#'+ߺUIMM#i&NNI[5fff&K&iG{1m){R̮}IQ6):8hK5di3N*)$}L@NgZщZ[pvNxD9862r|peԲAs\+Nj و)\>e]97 %ۅR.sO ' ErӮ;Z*>YG;M-a^qL.gðd%H |kqPc#NԉN^VpJfO$^A&sM@-/eG |P-t&L=C; [Ǽ%/R,xe_;?XRFnC>[b|nN~Gkow2(lCCo7ȬxBcQjohS]JMxe9n6[OYJf<2>=UCEDz9#?y;3?+~Q4s=h"" ]jTAD~5U6S3͕_Zs@[*zp ldݍ[ﳦP*4Bf]WAeʆ^oAMӗd,pٟ2mho̯X^oIo~|)< l8mZ'6; [Q#lH7ևĨADhOb1mRcjOliJ,_{*5fv7w&)Pj^g`ct38+QgjhlV8iL sP~C.p$5 :*Q{_p5%&NwΓqJi[tRC<C(6l(~xC{yuQScBLnMq J w,En|_o`i,pcLVVڒoe BtK`0?šif™LU+h)s<Mod׀\'xv3ʪw+L0_?dɛ;w.m*|!yOtB weG;e Dg(iL d ]lEKBD^JH;xNJeh9 gٚE |Z/B[X!Tf{~A_>e}vKa2mݑTrY9LИ YssVP$I*,qww }}@5.hr,7ɀƲ!!fIH6l?v@a,b7tZ8=h񥵛VZt@I3]`uxL=*stT6%e䐼꾽F}خke!9HdԨւ N[T2N=ׇP@4Aޥ#V7-}C VƲARUve@4L: tyE'^7_65ƂZQ3{Pe@x:wa)D|*FO"U&B"?W rqCz-1fIu:KS,\@ ''; EUG*Y$0U5'NKBE|[8c; .zaTAp!&bhͱXKB,quաzQxnضWn}xzuaTCayIu7>4&G;{j$? /IVޘ}כE d WkW/ <^t '"Qý ƎYlIMt k'&[4 (fT@fw(tJ.;ngfftgyYYҒG* C)'+|oˬ #:۬p!ٙ'CdSSg(}*Sk[rvb~#NX|صr9'ҎW>\=l_9:^(,V_rь ڻ` þT; `ʐ,7t̖-^e㞺h>&52Q|1=Z'A7 Muv7s\(m ^4rftJ܄PM3rSR.&Klʏ(dנRx•3js%ŋ3A%P~ۨʣ]ݙYB{גl3Y(/oTrlMIb/|#-cVKPս"A{4Et~,Y: rrt 2~I6i8OoUD|J-;ߓYIX6PFܯfVQGƌ[sjxY2zsLIf{w޹ˎ l}V+M[52MB`z<]RE1uυxA8S fЕAtCBeK(Γt[yG C-"J}ʐ1ed'YB} ثWàJ7#F(@ 3jM| \FklVJ$\Ur`IL(a5c]ejJp`Fg!8~K#lF@)4JagiwTy[Sg zLK- ʍFPϐc6>Ղۡ331a!5!`b-v5!ْ97h m "og8O³ν7'~Ǿ$hX nCɌ֐HIFJ;w;D-ap.N.Xgow1ưH2񃗃 V:gDXQBWhҔv#w~д 0ی[ ^e>ZwjPP.mU͊/g uĭ@o=8X6ߣ+W*;Jq-++ك_*y g4vVԡrVkٕEe$)W0:ᖋ-{bzzW3^`^⺞o k#Vsy5x 73OU!z zBuhLJ6)8|k<ؑrF=%7RoJ,7σ6TQ:s0ttQRUUr+thrq]).!п/(4_/6C!{y$FwE90HRHs'5+[N+:lTcۀ"r'% /rގ)`yYI LQQ9wkجZT--i# ! Yl5,ٰ3STAZve R%fO]il<]^Ntȭ2\Xp 1E?6e 6 |Z27S _*S%̢ Jfr ;G<Ն,VZyj]}CxfT`ŘC*I=}YsJ;%_|E@"`5B»?|J8EiÃ*٥ xlps~(mpTZA0kZq!at}FU眉Gs y؄(GS F+ S0goVFSC)ܿ %]Vߡ1Nv֎ӔrՈ_$'&늎9vh6%'&+Qץ\iQ۟! u8foGәC@r0ޓ,>L:bV԰6-U-9{2cΣ(>V^?lnD_l QLh *՚0~5-<6~<iO!եBt)Rؖ ?1DO=o?o>lVo̻uWnC?yV0YDQaIX A>+ `1܋9kqʸ ]jX ۊBŭqJM?jPh)VPkF7i t`r$Q-oet*rW!bjO͕ki9=Ԉ{b4VΘj3My]Xř4v\ftnkuq)050b?ސD%)$Xʉ{}i?@';#ՅVaF#[3zI 6Evmmn . ٧Ve|I?IEEa% |u@۽T| 0fY 7:U m?h $ ,b\сDž)+)`Lk%wIk%D KEƽ+\tE?'=BX/9hX=iOT[|[؜5}ýe{C}$^yto,3HܣV&Fأ͔7-f/qW A=2C5)=IBTkNZ`rU! s]%һ~,py5["xև9Bar<M^c_W>`>lI, W#s[xi`" _E=.j(?n: <^igUw!Ġ[KJFI}! uK-E#},b N =rGz ~6k$/-g#KŸY w3L ~ut $iUnhzgRMYbީFV;  i5CTc+$BufMavЮĶ:l.+)>P-&cH."z^<S,.xv8wQsN : w1V\4(-[<]sZqY'xp? W?@C(cUAn#W^#zYn p:Fd:moXcHyG4 ܩ;'wHRJЩ^ oQԙܖbSetX8a3kdx~B7+,ۄC 6 r|Gs*߯#gl4${j0U7. c0<9n%*sf!#1\}k2VyD1wX΁件&iW 6nj^(?{)"j᱋IJ}ϻ̳Ab[NrI/ax߮g8$U˹ilپJ&_[=zCVDd5^zՉ@*};%m#~FAI>nwD@ÐP8ӐcmԴ֐)iXzמ"\|T@CI0.l'Nq9V!Ǻ+,2h]\/Z 4ϐt6|iu@k} k^\,k1<|Cr'7U.FkMFPRkEDmjWw~fگb BǯWyjQd7}!O;XIYBioK_l+U+,%Ze9MKM7鉃wx]=M#+mV'\o|xYTXNioE SGY;"Ww G'n]Ե}UY k䂆RQZO}S}':4MIkDC͍4[RKH l"KmiwO(=V^ &<1iwF1V~ၕ-ʔFuQNӑ'ҴA\^[iw8BM$h ǰ*+MY U` '.nf+*u.9 Q\[KW,I qqx9w $ ؄q<ȭHO{ H3QJK&ƨ &:2BG~?zpi7ql1ןyH,R~DWC1V*?;Sf|F<Ɇ~V:URj!N$r_M I}^ fz4ų9]$cmq޵O^0䑷2j1m'os!aQ1dixVlØR; NT`Pt;(\ _tEr캅YmkXd?XuDjrD'"PmbPWHk[~^b#+]Jޞɿal ˍIqt3ݠ(ӌp֠_|( (Ԉ'ox8|GN͠f0IbQ9Fdm.o&Έ rxג"VʌĀ}g|)7- wrIiyNE5(u/Bph1vՇsU< RXL qqޡ<;%0.vQv|JJ@g.Nj,0^eEC-.Xs*_+E0|nF5E@6Z2_ csCkN9Z=iu>^;2B<R<7UB]]k$e}`tx&(JݣTDpSQ,ݽKP+VP4%l8ҩBYwiYP\v6mAFW#( Vfjo>_N!pruaO`t ̈́ҁZ Q{O*E U(~NuSѬ[29uW\b2-=:טwK k;)w T:v.4Atce>/ nvBE)@Qx>딬2+L5J;X홻fQR}4 Utײc, c-YTDH})?(A^*UdwL_фMϟׇ`1T*Y_4sG {5=>p,ϙuBW.5js%6=aפIoZ5ߐ\Q/YP]vbQeI陸R#/똔k6Lr39f}zN{A"ޟ>&򢰂9h?v\m(,)b-.3B!=4ъiTAl[-.XCv^Y @T3*Ă?ECD}e<f#ܟ31anBm6%G,?]]4LY=voBQ1,$+E=tn45B! DP@%ق' 4Gʡ9 2DN@ \bcS.|u3ma3mu4v1OW`G\WZ^~ߢTM F* ACstt3tvA0ld 7z1Ξ}V,Q`[5>w-SwATvJ+evg7M5I/++؀KJlZO~$S/z+<kk_hr/αJج🢬kÁY{?igKIyYC\QC5x'pNǔbLM4e3 W'q^,RA!AgxU.>\ZJR_adž, sK,2FRBFf `\I] X'>Lι/[Yfd0()IwBl(h^x.@L3f ЪGQěZEJABܹZWSݼkNux."m X)(z}/vk6Tںoic{*Q˗)dD ZYQTX_KiϕGR9+! a@rl1RzLFSkv < r%?mTX/OhEbcC/;Z@*-_'ǔOB9=ˊȤʴ1 uLvTфh4"Vb'u7d.Ox\&_[T:~}dủJ.n0Y58H1~D۪:{+h9ܥk@r+J>Z"ڤݗ^X<ŦUꞴT>3TȌj+#2>snh]b %|Ңwt<}g +fWC9?m!Zķߊ~oIba靧~rC"MaXz;/?P <1K P[X=.0e s}2Cy ޕWh3rږm<7Ri#WHy3YCSg7jy $ WߤŔ\B%F̾qX {YD!.{{SX>|HNMw[AbߑR,Nh^:t2oi30{Z}T8-dx-՝z$fAKt'Px(OVK*R a-yk =}n]W\+Jog.ߕT?~`Xvx;'wGn1 GAͣ4u(zK)rG[C)*cq$ϘRI$xzF!궟K\BF/y0!`Q@kb}T5U (I~'I0B1 ֜PBj" TP;2r3؞Ig[\za^G(f̉gaA*ej!ÈnЩC .OϺ@U,;^X59>NZxGhѮ/PvtSز-5'>xx[83Q`("v1=ކUZuaU3HMX +a@ᅫC.l+)šܶPiwIô3/9= R kDa/8IfX=]|>|U{f#R\>qbx\Fq™hu$)C11mWQω9O/tl?!B(dy\1}BXڥ%?.fzV]s~|fnBdz5S0/C߱: aT!>MEzF^lx 陣}dN(5FCVH܎B5<u|!!\UkVN4Fh &e9]EmǼِG=y#CCNkGXni:$&ҕ‰yI,5j2vRұ+2序؆QsBTz̩=^'oӍc]\PY7p91<9y5f8)nʘT̙/XLjtp(&7!j!6={$E-"jBZ35n =sQ&z !vS1CB+*k'VHuwmssgQRm=..MtYIG6ߦS*V=&SW1sw%CyT,|SAGO Uu#a?t6]O6QVd|Ռ"&?dXvb d! 6 B sR2q^ DR\&XG/b}):~/HV/e/K@KXEFhI3t%7!S- $7냲WO^AJpDg!hu0L6Ξ`Q؀ rZ3c@FqvgvIEXm|KbJtXe'L푊OQWBCDML0rg:h8NhO%{{$R\@pua uV{`Pܢ<@,Ux?@d@GK $E|.Hk2}YmYs 7hO%i.ܠOI#>glδ%Xmoq0Z;uU30a=*>i@O )Еfn57}zd]6OԚ+V+t7W?nD\e9YRV ͼKy_~u;<eX$y7o v@{X2kLe<ђ.NzZs Kyj/[:bBM yKZYxblg=F< .Nv6sNY},S#+nIPH4^lL~Tr]{"ldn`̸([h8DܬInN>PDžNs "8᳎/'z܀{u)2u.V+Ad<6B/,֏&X>1ŝBB?J{diUܼ'_} j^ضnM|HXĚ~a!d>ٍa&a ¾޺ ;rZoRAQӡۗE:*:dԗw&wNW8?a! OlEo5o 0s YB5D=fr:`>\"Qj-cKgw|.ӵh*bho K;y ;LUD'Gs5l,oOo=t?U-`3$RqO3_gtݐ!&~szH=sPjԻwU'0)]`]+ L%zN#R31x&y]o{I~(}Ýnt2dKA;lњD(6Z=ߊ.׆H -ZMU;yVJ]&:6;Ӽ]p#Yڷȸ`R抿P~ўui+HW4$mXSsKXOnI m XJk9(/?2-Z(tXɃlбF]%x^*(R)ыp߶xytjwcW-W^CÈv ;n+|ZUp/R)8AMϵ{?:a{.H3 en= @/<60|xJS ̵$vJ$UСčU|EPm2TMeh#!|^5x@Z]$<cR~oq`g]To/G&bcy[O]N&~=ВMnKr@" |<7HlId,LZr̗|(usr觢Bw ;K2pdG̲"IT\x՘jdNA7oTK 4\d"Drt/gzA{!:*eÒKS*/7E[42ϹFQK1ofG00\g 6hLjoCkMomBYqOxr}Vn/3.A v}t=֢Sfhhx1k$7$>iBt'\rڎ"%kSuՆ޷WpmCgciγQ/ pXBN |{\ԚgE E{ 8QʟWp*Rb2@FӖ?s%̰GAal<:YCKR)/~N.Pjmt%m?K8g6V/RówS7/4f=$Di,ٝU (8$ϓ??w JNt%9LPԽ>T>HuY^GɆ|iQn-b騈Maolz2| 9^@h4Y=VeJ6v_bjcD!L(Ix{`*A/Gؔ(#/Kp-7E^xċ.yXByDh5jL9?,T_kCq7z(40&_:@lbw;ᥟ[i^NFX#ZPǢ1Boo`v ة=}ws" 徤@'~kMl&HByW'"]v-Uw &dYk}nVSR1aGPo>ʴ&׸T&l%8/<%2*u%A#va?RPFaMK}I. u4%Q6 5xx܄dErC8v6$|~fS)!ADGfBߓp$D t$V|4dhZGxlj 񾔮QFk7\0bw7 sVI:iMu$L87W-> stream xڭVuXmAFRp$EAFZBZFRDRSiXzw=~}>Ϲ屮n VP\|ܼmR ;B,, ` )Q`q P|bbb,8<17a?;O$`pC0 uGv4(G0ttԴUOT*`B!vM_. }%Hr#~CD} H+ n Bnawdp$ i AwQuDMwI;;;- P];2+OnH_p\@WDqο7ϭA!P{n|>v>YQ|An``? z{f0цBTo"E<{; tv na=^4P@^oJ!SC"sK[PW/TxA# vB`;}7b -_{wGPSA׀/Y.ݰY {7(C/L~=>\|¢.~Qx!"(W'/4F f$~vnwYw`; DSJz**狢Eg;fO00 x%Rܵ_om!ԟSBڒ{_0w%gmX*"L6\25^_oUxCIo%̧ۗ"?$hdy[۬Nٺ{{;8H'l\kn/Ee2>Tyxp{|DΗ+p++;aBş'UUNxsX`6bB%)_hjxyH,H՘W$U8BjHDVEI(Beeق7VM xRh)2uz \o6<Kʚ9<ݎ<Ž/YH7T63+RBCcoE&TuޥxZ6OߟV,ZZS dl6;k5 jzT[wъ5IGi &o_۾ﮭ崈nTJQ>)-\x%A>p/H.c03ܙh,LĚǁC^5@<¾<7\#vj_jpW?FB\N#"z=[LNvoAnu>Tf#Tܐ;NlRcs]I:t^:]g©fb)Vb*5W.T,r!q )B{BPCԋ(79/g$Vdq0@93~X wOtr/aHk'Rp9R(zAÉ^>vy#W &]Mޯ,fOuōУqFv+uKQnw\Ob >9S{cS?:_+^ Tjo lgxZ_?.5Ize!ODM+( T 9bXߝxV>^洘.4X_o'",`evz :;];R֋j4L04SÕBBi`c ԓ'Lp0#j科2 t6nvAdSYo'H nA' aOZ,FܚܺO_C^|_y~4BˤP$g),4`r%H sHQȦao{??[Mv$T3UQRr,w.jٗ{I K)D[b]R * _g|@_T+ju0=J9eA$C z߫O SxUXkRPKd)4Fpgz]M (>2<:ٹ DBV4a}Gzt{Ure.2Fq[J\Ў\fwl|Bnĥ7赨\1MӮZ;27 {G'kXPUq2eտ V@^ʓ;fjH%wpOnզ)IX:J Bc>?mE7FP92k1tL}N{d1P=7bV'ٓd9Z=?_ ?w}hs)L+B`@ d[m߷#eMR7Dc̥nJ~f&N:<6]ږF~?vكt|SmQ_nCYѽD^*|-Ӽ~3/O'5r:VR,S\5Qx=MuT{)=3ZǍ7~Ik46qZl8?=q8̌#W%y {sWXko/}V<A.LLuJVU04r0W' A6&t(Ԏ'mʽgxqʼg& S"񜿎rӉd vz^s:r(j!Nֽ:L!ɐK$V&\GBBxG  ]?7`̢Sx*~J+mo~zRz4łY(jiD>?I/Sܿ]LLWF|aSHЪ׿\& @B` \sGh)38ˑ"~QB-4MJ6Sr̢MU@ ]p/ CȡmcL}ޫ3LVupF|jlf㶡VUMҕ0GQ!ֱԵ.$1E%&\' -5lFBͷ.Ȓm2MI&3XHWΒO@JDqTE+唱9.7f²b܌j{ߎʕdE&X9>]#@tVFKO)$)L%R8,fkkT95.f!#aI 9wP<۠RlFA:=sKj<N'Mkv ѩuߐ I/↽-m @6 zi~dԮ eth,/Gі{6zB ,FF9L KmywnݲOpIwbvTJJTw ;(o "LKhXℹܳoI>pKmKca07Hɣ3as1<#*|J*|mk-bl)gE%Q9t+`z;GӦC_ϋ?t~|1qSl: 2{Hc^Hs4Ą>EQ&Bj, ma'ƸQ>ebu_SW8QED$CosXh\}0S3?6=~|OtK+=@HdIۃ/9 g_#_0K;|xR &OW̽w/N9n-+UQD 2n)q† wf#j^r\[}2A_ &&\)d>3KzSF/c4╞P7GrK#QZyi$>1 v. >3"ƺLgt?W4[R0Կҳ W,3|O*=R}:9uw'"MАTыNRsSZ`g2P}˚O-pwrFÇ=ܢ}9=oiBȊ~DQVe+4蚌'e~Q2 zĘğ}3K U2,?Xhچ/FZM hj21+Z15|Uy5"D\}y b=1x2|6=A\XDzQi$.BuLaf5hKv|G Km ZLItSdlPbC%c2BҺzEh,vKL-[Y$i=8`|^!u8  Y$_]f[{ Ȟz&{"=q>"/ rUЙcCɮjɛϺ}->{A 䝫~e=yri}[K}a8O$ɭ/~Я7ꞙ}ZعQ_]άh-'' z?wC s 1 cCyXDpWZJ Zs |3582A}:C 1*8qa,CW0k5=Z'jkXfD@;қ=I45&{+m=ؔ;1Է|4 GxPVhIN kkn0fZM::GkLJɠqȺ_, ]Mf l qAaki&N^g8\n)w=mV*ĢIh#L6!#ӆd >HE(~ gI: ({a0YhBau+Lf;.(n3;ꘓ[2{byZ|bux.$/sA~^9=] JSXϘ ".vt]s7spI9IKΎ9.VQ8%IQj! Dz NOv"[yQ.YJYv?]Ҏ,FŻ!{_F=_7p_wtĶBƧtPD{M??m- a?l6q.dul'QĆ'Y|؋ҝ|EMTE3XڟqM\'|!>ox!U8H8IK@=ISROoӡɭt#?@2;,^\ϩSX߱q&v,K*3kW+BtL@EG1hC[w<yp"Me[AgvD,e6OF5.=}RQ1Kb`aKI ,ٹ;XA x _U6VNol$'ϰ;Ifwlr,E,a\B^ jMQ;3ت ZesЉHl~'AbɽE@:ֶ3Gywo -X))t'xg|;6oJ?*Sfim|s>E=AM/P@MpѮQ2(irD`J>.$ML%$GC26ySΚ#DYxU 1;6NvbI݄b);9Z`֦םfE h ~1 S}zי՚dž,{{C I;&J_ {L:J1ȝQ>xSnttϗI7'Q'Is>?|XɲyIu" endstream endobj 402 0 obj << /Length1 1647 /Length2 5770 /Length3 0 /Length 6602 /Filter /FlateDecode >> stream xڭTgXE47#H/ww!@HB 6@J #tPQz/׷vϏzgyy D`DDF0Og i36@qXǤȹDhy5brrru$ a|fBv8Gb`P #QO4@X7ԍMi,o 00\hD~sb a_0 hO0(`8wx+OA(4d&H FPX>_ub@߹10< @=]``x<paPp>7 )!@@Ah8οA(O4?ka18>' !ȁEewyC. p? ĕhSo*D7Ho"Oܿk_=Z <מ Ѐ o O 5䯪_)TPBbR"Ra-/\Ap["\ h8 ~A,``o5 O@#U}[3eq6Og&kC?Ԑa1i9(1⟣dؿΆ , h4`92ǂ.7 ơxl|8y/L>5+-]P5F흂4 {2δv-.63u;ЕŭJ\&˵Y >k:yG7_soJ]J3YyESUѵ̼9Щ[LؽT6-)DN\DQ/Jh/4?}7(LT%¸^\TXqcRB61nOL)z(tGp= a{D/@~/`4z\\I,LkHn֋Йn1Uio#9w^O6\6̈́;uy_q0%_gPvhT%\&XYjK"ِgFg{iiwԄ[Z ?CJ9+| ;v?ި1uY,7(ݯ2uh(pBYY^p>*F-eϒrV[5,w^fʑ4oE:똫 4 ? . yF)GCuuF^sX-NM@֑w0oNWЖQqhf٘tuȕxBagu=v *LS?yɲxᶢMٵrsV b"Tެ3ZoFtd<`Xv7sJ'WƭZjJ p x:]cLw(sqNT<fW9/x8h,\C(|z MC =](tҶz~ 풊:HMFEL澞\N}֐Ç iA-)͛qE Zͽjg睊{NȞ4B~uMw^p{? SIZěb唭X9z&?]:'܅jW\mF_(+ӻ:ITl= 9"( I,:np>S1Й!Wi;fmOYwv9t\EyAlp9!䶗VıP(- e3RY[Sڷ6b xg.ZN-pP"J?WSQN] :.p2 "4nJi=:+oIx"'6fuU @kc=D4+>r8D]0Dȷ@{$?T^0y)($@3zeROF-怈OÑ˔O}N4ոGZ9DE#M+Bu,us4Rm5kwK(T-d\"G|4;U˗K _I~&qI6"̥I\czSP՝^?vH/xxot0\4SO϶F[#>~D6b]eCWͫM.=akyyI^D{H,$*<$9%P1ӈT춝VfqKbȚ+kݓR:h|4cSn$&6{>)#pȿg<$0 :ԝucے ʧ-ɸ#񬐌V~)"ƕs)r|CC ɞ~=N@ &ɚz*~$!r.u㔝$R E*ajk95/46V/Gd>{nFVq'<:TD} |xT?kux n\Zsȝ| zXeș%yFvZY.SP|\_6g}Ѹ^ e͝/TyՔ Լ3n ͵_J#Yyج3\tU7Au" /l][jh?2)/ ;?]y-Ow"r3L'm`?0Jp?,oDبm?T$Kf!^CN2t }O T'2&$$pkw\Ez[}Oce1_:4SkM(yW;n&_*/^92c Y賛dXJFojc >ϹK%oENbol JG΢PK{k"֫7bnM;|WE7dnL_nfη|yOm^6$M5yrc5g/#F5r?!^f!1]e?) \YN"heZny'..u1ך/d #Ic`r$'͂|4lv1CoغCm:X6?p3z}$2U"2g$h{z/mQt9+=۔u9oWՖF;b3!"ufZͫ}5/y"i\d9 :ޞ?y۾^{m!{&O2_=8`:+3h>y,PuvҦxy[`U|B$&^ֳvO0 Y;4VIӋKt Q`( M|@eJuo9V0k8}n-vLm`@m@;1turZ˔ˁ'2yTB1ޟmTC Zؽg^ Z~bsQ7)FTX%/8?44MnE(fr Qgfou81/>gC~nU v1*HX1XZ(s!$x!FRlG͝f)D$jfs'{; 58bl/ЙޏZV+3ՊrRV`XΝӢ/ f쾣QNKՔ= i5~/6q 3WRN/PU*յ]͎&TL>8^4KsA>w CS@tY>weZGAznsp b/dulOʥ8!'iфGGoԓf1Mܽv"S4U,oiz'oX-FLѨ30&AFʌyi*צ&yKcOcjEkP7) d퀌1MmOC^Luϙ/ X8Ș:/Xf.g}8f>_ |tk.Ac)VW,0geMDU{^ۺ4?5GK>kMo9A+d,e^8QZMϔ;xķJg3.|bNkT#͵$" I6C;I,3I Ѧw%O)@.)Km9H-n}+,kRM+͚v|1\7Bu$܏\U%hk0*\2>J&\7D#SZhq6%cF[jfp,~JuEz|v uPG!W`;䌝#ȕX^r[v*= lsJɥrTT9Pئ%DI1<էgtN<#j- + itTd7 ;}@R0ejLF$Q14I+mֈdbهm:.݊_K2[[ xhA끖샱d_أDY *2@1\"㌁Q%ác;^/v|L9Z,_$QgZTO`R-@C %Ξtr˖&?q_ QEGTMQj'>E֤ڴj <ƌqE&ިg5m뗺1Z >mlM]J[Rz9һ(nNއ`ˇ#nX(.H'̯CzMhPℹ> wOZeUtWQu9U? OmOv d5)?" 5*6s.鲛h䓁Qȕ-t.ONQ_ +>u^A;o5  W{4<=R2$58"cJ:JOe.2c])",~N{iE57Y@I[d8}O?i!xOǮILAU5B'|^MtuCe}ۯOŗ⯌JYpS%B {v4ddZ_whXf qΖrÒIwAӞ֮hヸ< -{WF\ii|W8dM. il'C1͖%Mº$I*-)s.$66Nt*_"~?g6k3_G ?7lIh VqOYsdBZlåO.lIFb5l##I,#g7J1w';o yGQcb :f3|~}r*󽃐whΓ0[t吭_gʍ=ΪKdv* QW[M0NYPWF9J%{ccztl[GH*)q\9Q'Յ  3X5,|F i4Tv|ǛcJBP1&2ׯRI}W3F-O 6 +_8Vk "N <=݆IӒL`tE.:X"/ԙnWp61T-nhOPEIQT8; p@ %-0e$RpY(#tFs9{;F"J:FgjDZa;>eJ.x=0PW3%ێ0.u6^΂z7ݔn3[v6cO^L#!Z if$H۲&,tTQpD 2 $҄b5p6TF> stream x\ksF_LQ* r$N\[ۼD{z0HKWnbt*c:j2a6^2-p}fecgD&I#3Ν;ͥK*-pc2č͸Xո;e-{u"WgsH@=;(n0 㤠AKft*SЄcSϴULB!8Žk- 9}f5(3ǰb2sRv9,9OT20W* P 7.Oû#K (O}YG1ڟ M<)$`_p;(qǁ,* _rNhZVp;#`aE [O^$Gmh !8Bp n<)3GW**FC4*zS(F<|'^Bk5d)KXV`rP3űR8y€Y`(!"'[q2:pk ( 2J% 0dgA:j҃ajsD02lZqkh$Z8dsK#9⋳7uO׻.{Ye#oZxLa/<˿\Xgy}vxWOܣ<ÿ  [n 8.?Ī 0)ݡY>񒂘O!!-Pń!c"ɉ'0Oom6TIXī'NP"z@`f(`ULऒA *QW&\n3  Z0N8C7s*G}BA}Qx Ǖx?aN>L~h1ʑEʲan6e9a]1H4=>Otl{ >qԎ.nRij1F!IvG[+ͱd?zĸuaL싌h4E{u⽏n[5eoYܲ=a̤"}l>aso`Qff6&{;]&fo&Ywċ!ć56-XX}" "k/~I릶Vjk,v6<|Ok3ڽ>26 ;tVjTKL|\Oϫy=WE'r2Ս %cO7ߪYKU{?E~^~u/:˗*ʯu~omofp1Ó7?fx9n\`0gy*2:6 y/a.,.~wbb.V`wz77kWvL}}{lYl .5nezW_Y57Mi[_-4|Zlww^Ëחsp.>.?}yt1f ȥK̾Kĩ_uOcnνѨwzZlחdC}''г^9k^|˫7wGR"py-\{syNO|KT?y]}<xzs B^_UhÏ34t i(mv;2v 2PH>KpcdKsM.8$/~M'8G>P;>H*܁sJ$|s2⎩b}GӾY!}2ruo~$P's,Wœٳ<>_-wc!>~.t_(MR%Cu1e]%}AzJCoe7l+/߾z+ZNMR捑bDG7$1 DW8 ˌ gAcWL%6&~;V5~*f|N?>::$S8ԓpo_̈́Iu`ʌ{R/dNnȜ?W+Zד|JbA? ˫fDp?Y$?-/w~/D><$'~4<, yއ$1HN~ HNC" M HG>2GfQc2}dJ>!ӟܩZn|b3>>\]`ONZ X=bq-J-nfygU~ݩUU{;}/GD҈v16+`#Lk&91?c9r}|eM}5(M d A% '1^1=u|.|^>Θ?Y^-w=s^AMrU^W;eb{ͽ㕟[SQo:wgFNsSJI i213ST׶M^YUlU+;~tSSyW^DQ!{ROve WX땦:SN+_ sgbLIIg9f#c1Gg*>+T ;?)yza)| ;gei,eI3 s0gJYcy tyEgDp5QbLR(>S3Zóܜ'd['GtK.”74Fi\Wp*VYG=8ͦSf+WhW:Ĕ17W>1KQ3J=%eKf J:#Ɋ&lA f47cj:+ScЏS1_J+[J^Hqs`ҲZsOz TTFYjNLN¹ȯޤTi+UUE1SFDqό)|Qe)ӺUItM zgB&%|p͐KuUYro5#SZb4eܜ!1rDiea^b*s ]Qn|CGG KW Eetdʹ7!yrW!os*4NnK&紝%u1RBq CN̢+[ *Ie'[vȎBnF=8"P٩P Ll3:Ⱦ%%7Μ(gjBؒ(nJh*$#ڤ*˦~**ɤ6 1UyBS|~tⶠ`Cp,Y>!3BbxCVx՛PŹ5"Qm*NԘ:LɔmR tXzQ֦oue6mRn_Aju7'ԁXws0FS'%l;ݨ#vvZN%-X3g[IH!R KNb;hU>*p1K) KxJ]qĶoAn6(L pu}d [ڷLmmo 4chIiߨFڶuCN$!V࣐% = ׾߈mlo$& S|hXcJF&9a]ŎwQhwըmhɲC VB jz]t3>+HW`|>LCyT!\J-Tz] 5!]T2 uRA5: ȆBѮZHWCGB g(˚ >EyTuBɹv{lVPPt)+ehWN(VIlO8yDѮP0.iN\*T6Uz?FIQ?qP͇\#nvԁA<*Tsh\Or7($m*~Q^E:+$N?sa endstream endobj 438 0 obj << /Author(Marc Roeder)/Title(polymaking)/Subject()/Creator(LaTeX with hyperref package / GAPDoc)/Producer(pdfTeX-1.40.19)/Keywords() /CreationDate (D:20210708004431+02'00') /ModDate (D:20210708004431+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.19 (TeX Live 2018) kpathsea version 6.3.0) >> endobj 435 0 obj << /Type /ObjStm /N 3 /First 21 /Length 176 /Filter /FlateDecode >> stream x=102H TT4ap!M% {KA{")f'4AiQ4?YD`ph 腱*WfxxǗ%}ΫP9hK3ZgLN\y 3C.tfN O>ğU䡡Prqo< endstream endobj 439 0 obj << /Type /XRef /Index [0 440] /Size 440 /W [1 3 1] /Root 437 0 R /Info 438 0 R /ID [ ] /Length 1011 /Filter /FlateDecode >> stream x9LVAFA~P\PUTpAq\@E@\A 6vF {)1X}kNf{wޝRWT$K#r($S2d T1PCvi-XNm-LWԶR;ƴQIjLW5Դ#LׂuԮQ;̴v jni^A fBZLA1jL7N.t`Tw l^v\ zcgo~n}`hڟ6wש"S Y XzmH=rL28cGsߚس 0 m0m 3n[YY.$bR㜖Cf̮XcCi MZYChHQ9!/Yo2E &K?2E@(((8$WÃmXXx@@@@@@@ 4K+KKKKKKKKKF! 7<&Ązn%0"J*nUVVdft7XfUA*(U~6Z ^ 62]]VU4>:փf <h}҃zM;P-;3gGed|ZzTU` 8KkipғArS`L dN<Y]2W s@I>|Mou<С_I;{- Zi@3]-=-J`Og'!S}\>J9JyoK5j5K=Q-/4갢FAN+Ѩˊo5'd'dspppp:u %W&'''%BY" _hY endstream endobj startxref 197268 %%EOF polymaking-0.8.6/doc/times.css0000644000076600000240000000026114071427117015311 0ustar mhornstaff/* times.css Frank Lübeck */ /* Change default CSS to use Times font. */ body { font-family: Times,Times New Roman,serif; } polymaking-0.8.6/doc/input.xml0000644000076600000240000002762114071427055015351 0ustar mhornstaff
Creating Polymake Objects The interaction with the polymake program is done via files. A PolymakeObject is mainly a pointer to a file and a list of known properties of the object. These properties need not be stored in the file. Whenever polymake is called, the returned value is read from standard output and stored in the PolymakeObject corresponding to the file for which polymake is called. The files for polymake are written in the old (non-xml) format. The first run of polymake converts them into the new (xml) format. This means that changes to the file by means of the methods outlined below after the first run of polymake will probably lead to corrupted files. nothing Creates an empty file with name filename. Note that filename has to include the full path and the directory for the file must exist. PolymakeObject If called without arguments, this method generates an empty file in the directory defined by . If a directory dir is given (this directory must exist), an empty file is generated in this directory. If prefix is not given, the file is called polyN where N is the current runtime. If a file of this name already exists, a number is appended separated by a dot (example: "poly1340" and "poly1340.1"). If prefix is given, the filename starts with this prefix. Optionally, the file can be generated with a header specifying application, version and type of the object. This is done by passing the triple of strings appvertyp to . A valid triple is ["polytope","2.3","RationalPolytope"]. Validity is checked by . bool Checks if the triple arppvertyp of strings specifies an application and type of polymake version 2.3. More specifically, the first entry has to be an application from ["polytope","surface","topaz"] and the third entry has to be a type corresponding to the application given in the first entry. The second entry is not checked.
PolymakeObject This method generates a PolymakeObject corresponding to the file filename in the directory dir. If dir is not given, the POLYMAKE&uscore;DATA&uscore;DIR is used.If no file with name filename exists in dir (or POLYMAKE&uscore;DATA&uscore;DIR, respectively), an empty file is created. Note that the contents of the file do not matter for the generation of the object. In particular, the object does not know any of the properties that might be encoded in the file. The only way to transfer information from files to PolymakeObjects is via .
Accessing Properties of Polymake Objects A PolymakeObject contains information about the directory of its file, the name of its file and about properties calculated by calling . The properties returned by the polymake program are stored under the name polymake assigns to them (that is, the name of the data block in the corresponding file). The following methods can be used to access the information stored in a PolymakeObject. But be careful! All functions return the actual object. No copies are made. So if you change one of the returned objects, you change the PolymakeObject itself. Directory Returns the directory of the file associated with poly. String Returns the name of the file associated with poly. This does only mean the name of the file, not the full path. For the full path and file name see String Returns the file associated with the PolymakeObject poly with its complete path. List of Strings Returns a list of the names of all known properties. This does only include the properties returned by , "dir" and "filename" are not included. If no properties are known, fail is returned. Record Returns the record of all known properties. If no properties are known, fail is returned. Returns the value of the property name if it is known. If the value is not known, fail is returned. name must be a String.
Example: Creating and Accessing Polymake Objects Suppose the file /tmp/threecube.poly contains the three dimensional cube in polymake form. Now generate a PolymakeObject from this file and call to make the vertices of the cube known to the object. cube:=CreatePolymakeObjectFromFile(Directory("/tmp"),"threecube.poly"); gap> FilenameOfPolymakeObject(cube); "threecube.poly" gap> FullFilenameOfPolymakeObject(cube); "/tmp/threecube.poly" #nothing is known about the cube: gap> NamesKnownPropertiesOfPolymakeObject(cube); fail gap> Polymake(cube,"VERTICES"); [ [ -1, -1, -1 ], [ 1, -1, -1 ], [ -1, 1, -1 ], [ 1, 1, -1 ], [ -1, -1, 1 ], [ 1, -1, 1 ], [ -1, 1, 1 ], [ 1, 1, 1 ] ] # Now knows its vertices: gap> Print(cube); gap> PropertyOfPolymakeObject(cube,"VERTICES"); [ [ -1, -1, -1 ], [ 1, -1, -1 ], [ -1, 1, -1 ], [ 1, 1, -1 ], [ -1, -1, 1 ], [ 1, -1, 1 ], [ -1, 1, 1 ], [ 1, 1, 1 ] ] gap> KnownPropertiesOfPolymakeObject(cube); rec( VERTICES := [ [ -1, -1, -1 ], [ 1, -1, -1 ], [ -1, 1, -1 ], [ 1, 1, -1 ], [ -1, -1, 1 ], [ 1, -1, 1 ], [ -1, 1, 1 ], [ 1, 1, 1 ] ] ) ]]>
Writing to Polymake Objects To transfer data from &GAP; to polymake, the following methods can be used. But bear in mind that none of these functions test if the resulting polymake file is still consistent. nothing This appends the string string to the file associated to the PolymakeObject poly. It is not tested if the string is syntactically correct as a part of a polymake file. It is also not tested if the string is compatible with the data already contained in the file. INEQUALITIES, POINTS and VERTICES can be appended to a polymake object using the following functions: nothing Takes a list pointlist of vectors and converts it into a string which represents a polymake block labeled "POINTS". This string is then added to the file associated with poly. The "POINTS" block of the file associated with poly then contains points with leading ones, as polymake uses affine notation. nothing Does the same as AppendPointlistToPolymakeObject, but with "VERTICES" instead of "POINTS". nothing Just appends the inequalities given in ineqlist to the polymake object poly (with caption "INEQUALITIES"). Note that this does not check if an "INEQUALITIES" section does already exist in the file associated with poly. String This function takes a matrix matrix and converts it to a string. This string can then be appended to a polymake file via to form a block of data labeled name. This may be used to write blocks like INEQUALITIES or FACETS. nothing Deletes all known properties of the PolymakeObject poly and replaces its file with an empty one.
If the triple of strings appvertyp specifying application, version and type (see ) is given, the file is replaced with a file that contains only a header specifying application, version and type of the polymake object.
There are also methods to manipulate the known values without touching the file of the PolymakeObject: Takes the object data and writes it to the known properties section of the PolymakeObject poly. The string name is used as the name of the property. If a property with that name already exists, it is overwritten. Again, there is no check if data is consistent, correct or meaningful. If the PolymakeObject poly has a property with name name, that property is unbound. If there is no such property, fail is returned.
polymaking-0.8.6/doc/toggless.css0000644000076600000240000000167214071427117016026 0ustar mhornstaff/* toggless.css Frank Lübeck */ /* Using javascript we change all div.ContSect to div.ContSectOpen or div.ContSectClosed. This way the config for div.ContSect in manual.css is no longer relevant. Here we add the CSS for the new elements. */ /* This layout is based on an idea by Burkhard Höfling. */ div.ContSectClosed { text-align: left; margin-left: 1em; } div.ContSectOpen { text-align: left; margin-left: 1em; } div.ContSectOpen div.ContSSBlock { display: block; text-align: left; margin-left: 1em; } div.ContSectOpen div.ContSSBlock a { display: block; width: 100%; margin-left: 1em; } span.tocline a:hover { display: inline; background: #eeeeee; } span.ContSS a:hover { display: inline; background: #eeeeee; } span.toctoggle { font-size: 80%; display: inline-block; width: 1.2em; } span.toctoggle:hover { background-color: #aaaaaa; } polymaking-0.8.6/doc/chap2.txt0000644000076600000240000004526014071427114015221 0ustar mhornstaff 2 Polymake interaction 2.1 Creating Polymake Objects The interaction with the polymake program is done via files. A PolymakeObject is mainly a pointer to a file and a list of known properties of the object. These properties need not be stored in the file. Whenever polymake is called, the returned value is read from standard output and stored in the PolymakeObject corresponding to the file for which polymake is called. The files for polymake are written in the old (non-xml) format. The first run of polymake converts them into the new (xml) format. This means that changes to the file by means of the methods outlined below after the first run of polymake will probably lead to corrupted files. 2.1-1 CreateEmptyFile CreateEmptyFile( filename )  method Returns: nothing Creates an empty file with name filename. Note that filename has to include the full path and the directory for the file must exist. 2.1-2 CreatePolymakeObject CreatePolymakeObject( )  method CreatePolymakeObject( appvertyp )  method CreatePolymakeObject( dir )  method CreatePolymakeObject( dir, appvertyp )  method CreatePolymakeObject( prefix, dir )  method CreatePolymakeObject( prefix, dir, appvertyp )  method Returns: PolymakeObject If called without arguments, this method generates an empty file in the directory defined by POLYMAKE_DATA_DIR (3.2-2). If a directory dir is given (this directory must exist), an empty file is generated in this directory. If prefix is not given, the file is called polyN where N is the current runtime. If a file of this name already exists, a number is appended separated by a dot (example: "poly1340" and "poly1340.1"). If prefix is given, the filename starts with this prefix. Optionally, the file can be generated with a header specifying application, version and type of the object. This is done by passing the triple of strings appvertyp to CreatePolymakeObject. A valid triple is ["polytope","2.3","RationalPolytope"]. Validity is checked by CheckAppVerTypList (2.1-3). 2.1-3 CheckAppVerTypList CheckAppVerTypList( appvertyp )  method Returns: bool Checks if the triple arppvertyp of strings specifies an application and type of polymake version 2.3. More specifically, the first entry has to be an application from ["polytope","surface","topaz"] and the third entry has to be a type corresponding to the application given in the first entry. The second entry is not checked. 2.1-4 CreatePolymakeObjectFromFile CreatePolymakeObjectFromFile( filename )  method CreatePolymakeObjectFromFile( dir, filename )  method Returns: PolymakeObject This method generates a PolymakeObject corresponding to the file filename in the directory dir. If dir is not given, the POLYMAKE_DATA_DIR is used.If no file with name filename exists in dir (or POLYMAKE_DATA_DIR, respectively), an empty file is created. Note that the contents of the file do not matter for the generation of the object. In particular, the object does not know any of the properties that might be encoded in the file. The only way to transfer information from files to PolymakeObjects is via Polymake (2.5-1). 2.2 Accessing Properties of Polymake Objects A PolymakeObject contains information about the directory of its file, the name of its file and about properties calculated by calling Polymake (2.5-1). The properties returned by the polymake program are stored under the name polymake assigns to them (that is, the name of the data block in the corresponding file). The following methods can be used to access the information stored in a PolymakeObject. But be careful! All functions return the actual object. No copies are made. So if you change one of the returned objects, you change the PolymakeObject itself. 2.2-1 DirectoryOfPolymakeObject DirectoryOfPolymakeObject( poly )  method Returns: Directory Returns the directory of the file associated with poly. 2.2-2 FilenameOfPolymakeObject FilenameOfPolymakeObject( poly )  method Returns: String Returns the name of the file associated with poly. This does only mean the name of the file, not the full path. For the full path and file name see FullFilenameOfPolymakeObject (2.2-3) 2.2-3 FullFilenameOfPolymakeObject FullFilenameOfPolymakeObject( poly )  method Returns: String Returns the file associated with the PolymakeObject poly with its complete path. 2.2-4 NamesKnownPropertiesOfPolymakeObject NamesKnownPropertiesOfPolymakeObject( poly )  method Returns: List of Strings Returns a list of the names of all known properties. This does only include the properties returned by Polymake (2.5-1), "dir" and "filename" are not included. If no properties are known, fail is returned. 2.2-5 KnownPropertiesOfPolymakeObject KnownPropertiesOfPolymakeObject( poly )  method Returns: Record Returns the record of all known properties. If no properties are known, fail is returned. 2.2-6 PropertyOfPolymakeObject PropertyOfPolymakeObject( poly, name )  method Returns the value of the property name if it is known. If the value is not known, fail is returned. name must be a String. 2.3 Example: Creating and Accessing Polymake Objects Suppose the file /tmp/threecube.poly contains the three dimensional cube in polymake form. Now generate a PolymakeObject from this file and call Polymake (2.5-1) to make the vertices of the cube known to the object.  Example   ### suppose we have a polymake file /tmp/threecube.poly ### containing a cube in three dimensions gap> cube:=CreatePolymakeObjectFromFile(Directory("/tmp"),"threecube.poly");  gap> FilenameOfPolymakeObject(cube); "threecube.poly" gap> FullFilenameOfPolymakeObject(cube); "/tmp/threecube.poly"  #nothing is known about the cube: gap> NamesKnownPropertiesOfPolymakeObject(cube);  fail gap> Polymake(cube,"VERTICES"); [ [ -1, -1, -1 ], [ 1, -1, -1 ], [ -1, 1, -1 ], [ 1, 1, -1 ], [ -1, -1, 1 ],   [ 1, -1, 1 ], [ -1, 1, 1 ], [ 1, 1, 1 ] ]   # Now knows its vertices: gap> Print(cube);  gap> PropertyOfPolymakeObject(cube,"VERTICES"); [ [ -1, -1, -1 ], [ 1, -1, -1 ], [ -1, 1, -1 ], [ 1, 1, -1 ], [ -1, -1, 1 ],  [ 1, -1, 1 ], [ -1, 1, 1 ], [ 1, 1, 1 ] ] gap> KnownPropertiesOfPolymakeObject(cube); rec(  VERTICES := [ [ -1, -1, -1 ], [ 1, -1, -1 ], [ -1, 1, -1 ], [ 1, 1, -1 ],  [ -1, -1, 1 ], [ 1, -1, 1 ], [ -1, 1, 1 ], [ 1, 1, 1 ] ] )   2.4 Writing to Polymake Objects To transfer data from GAP to polymake, the following methods can be used. But bear in mind that none of these functions test if the resulting polymake file is still consistent. 2.4-1 AppendToPolymakeObject AppendToPolymakeObject( poly, string )  method Returns: nothing This appends the string string to the file associated to the PolymakeObject poly. It is not tested if the string is syntactically correct as a part of a polymake file. It is also not tested if the string is compatible with the data already contained in the file. INEQUALITIES, POINTS and VERTICES can be appended to a polymake object using the following functions: 2.4-2 AppendPointlistToPolymakeObject AppendPointlistToPolymakeObject( poly, pointlist )  method Returns: nothing Takes a list pointlist of vectors and converts it into a string which represents a polymake block labeled "POINTS". This string is then added to the file associated with poly. The "POINTS" block of the file associated with poly then contains points with leading ones, as polymake uses affine notation. 2.4-3 AppendVertexlistToPolymakeObject AppendVertexlistToPolymakeObject( poly, pointlist )  method Returns: nothing Does the same as AppendPointlistToPolymakeObject, but with "VERTICES" instead of "POINTS". 2.4-4 AppendInequalitiesToPolymakeObject AppendInequalitiesToPolymakeObject( poly, ineqlist )  method Returns: nothing Just appends the inequalities given in ineqlist to the polymake object  poly (with caption "INEQUALITIES"). Note that this does not check if an "INEQUALITIES" section does already exist in the file associated with poly. 2.4-5 ConvertMatrixToPolymakeString ConvertMatrixToPolymakeString( name, matrix )  method Returns: String This function takes a matrix matrix and converts it to a string. This string can then be appended to a polymake file via AppendToPolymakeObject (2.4-1) to form a block of data labeled name. This may be used to write blocks like INEQUALITIES or FACETS. 2.4-6 ClearPolymakeObject ClearPolymakeObject( poly )  method ClearPolymakeObject( poly, appvertyp )  method Returns: nothing Deletes all known properties of the PolymakeObject poly and replaces its file with an empty one. If the triple of strings appvertyp specifying application, version and type (see CheckAppVerTypList (2.1-3)) is given, the file is replaced with a file that contains only a header specifying application, version and type of the polymake object. There are also methods to manipulate the known values without touching the file of the PolymakeObject: 2.4-7 WriteKnownPropertyToPolymakeObject WriteKnownPropertyToPolymakeObject( poly, name, data )  method Takes the object data and writes it to the known properties section of the PolymakeObject poly. The string name is used as the name of the property. If a property with that name already exists, it is overwritten. Again, there is no check if data is consistent, correct or meaningful. 2.4-8 UnbindKnownPropertyOfPolymakeObject UnbindKnownPropertyOfPolymakeObject( poly, name )  method If the PolymakeObject poly has a property with name name, that property is unbound. If there is no such property, fail is returned. 2.5 Calling Polymake and converting its output 2.5-1 Polymake Polymake( poly, option: PolymakeNolookup )  method This method calls the polymake program (see POLYMAKE_COMMAND (3.2-1)) with the option option. You may use several keywords such as "FACETS VERTICES" as an option. The returned value is cut into blocks starting with keywords (which are taken from output and not looked up in option). Each block is then interpreted and translated into GAP readable form. This translation is done using the functions given in ObjectConverters (4.1-4). The first line of each block of polymake output is taken as a keyword and the according entry in ObjectConverters (4.1-4) is called to convert the block into GAP readable form. If no conversion function is known, an info string is printed and fail is returned. If only one keyword has been given as option, Polymake returns the result of the conversion operation. If more than one keyword has been given or the output consists of more than one block, Polymake returns fail. In any case, the calculated values for each block are stored as known properties of the PolymakeObject poly as long as they are not fail. If Polymake is called with an option that corresponds to a name of a known property of poly, the known property is returned. In this case, there is no call of the external program. (see below for suppression of this feature). Note that the command Polymake returns fail if nothing is returned by the program polymake or more than one block of data is returned. For example, the returned value of Polymake(poly,"VISUAL") is always fail. Likewise, Polymake(poly,"POINTS VERTICES") will return fail (but may add new known properties to poly). For a description of the conversion functions, see chapter 4. If the option PolymakeNolookup is set to anything else than false, the polymake program is called even if poly already has a known property with name option. Note that whenever Polymake returns fail, a description of the problem is stored in POLYMAKE_LAST_FAIL_REASON (3.1-2). If you call Polymake with more than one keyword, POLYMAKE_LAST_FAIL_REASON (3.1-2) is changed before polymake is called. So any further reason to return fail will overwrite it. 2.6 An Example Let's generate a three dimensional permutahedron.  Example     gap> S:=SymmetricGroup(3);  Sym( [ 1 .. 3 ] )  gap> v:=[1,2,3];  [ 1, 2, 3 ]  gap> points:=Orbit(S,v,Permuted);;  gap> permutahedron:=CreatePolymakeObject();    gap> AppendPointlistToPolymakeObject(permutahedron,points);  gap> Polymake(permutahedron,"VOLUME");  3  gap> Polymake(permutahedron,"N_VERTICES");  6  #Now knows its number of vertices, but not the vertices:  gap> PropertyOfPolymakeObject(permutahedron,"VERTICES");  fail  gap> NamesKnownPropertiesOfPolymakeObject(permutahedron);  [ "VOLUME", "N_VERTICES" ]  #Let's look at the object!  gap> Polymake(permutahedron,"VISUAL");  #I There was no or wrong polymake output  fail  gap> Polymake(permutahedron,"DIM");  2      polymaking-0.8.6/doc/chap3.txt0000644000076600000240000000361514071427114015220 0ustar mhornstaff 3 Global Variables 3.1 Getting information about polymake output 3.1-1 InfoPolymaking InfoPolymaking  info class If set to at least 2, the output of polymake is shown. At level 1, warnings are shown. This is the default. And at level 0, the polymake package remains silent. 3.1-2 POLYMAKE_LAST_FAIL_REASON POLYMAKE_LAST_FAIL_REASON  global variable Contains a string that explains the last occurence of fail as a return value of Polymake (2.5-1). 3.2 Variables for system interaction The variables for interaction with the system are contained in the file environment.gi. Each of these variables has a function to set it, see 1.2. If POLYMAKE_COMMAND or POLYMAKE_DATA_DIR are set at startup, they are not overwritten. So if you don't want (or don't have the rights) to modify environment.gi, you can set the variables in your .gaprc file. 3.2-1 POLYMAKE_COMMAND POLYMAKE_COMMAND  global variable This variable should contain the name of the polymake program in the form as returned by Filename So a probable value is Filename(Directory("/usr/local/bin"),"polymake"). 3.2-2 POLYMAKE_DATA_DIR POLYMAKE_DATA_DIR  global variable In this directory the files for polymake will be created. By default, this generates a temporary directory using DirectoryTemporary polymaking-0.8.6/doc/chapBib.html0000644000076600000240000000433714071427117015704 0ustar mhornstaff GAP (polymaking) - References
Goto Chapter: Top 1 2 3 4 Bib Ind

References

[GJ] Gawrilow, E. and Joswig, M., polymake, \URL{http://polymake.org/}.

Goto Chapter: Top 1 2 3 4 Bib Ind

generated by GAPDoc2HTML

polymaking-0.8.6/doc/chap0.html0000644000076600000240000003013514071427117015342 0ustar mhornstaff GAP (polymaking) - Contents
Goto Chapter: Top 1 2 3 4 Bib Ind

polymaking

Interfacing the geometry software polymake

Version 0.8.6

8 July 2021

Marc Roeder
Email: roeder.marc@gmail.com

Abstract

This package provides a very basic interface to the polymake program by Ewgenij Gawrilow, Michael Joswig et al. [GJ]. The polymake program itself is not included.

Copyright

© 2007--2013 Marc Roeder.

This package is distributed under the terms of the GNU General Public License version 2 or later (at your convenience). See the file "LICENSE" or https://www.gnu.org/copyleft/gpl.html

Acknowledgements

This work has been supported by Marie Curie Grant No. MTKD-CT-2006-042685

Contents


Goto Chapter: Top 1 2 3 4 Bib Ind

generated by GAPDoc2HTML

polymaking-0.8.6/doc/chap1.txt0000644000076600000240000000755314071427114015223 0ustar mhornstaff 1 Installation and Preface To install the package, just unpack it in your packages directory (usually ~/gap/pkg for local installation). To use polymaking, you need a working installation of the program polymake https://polymake.org. The package has been tested on linux and Mac OS X (10.4, 10.5 and 10.6). But it should be as platform independent as GAP and polymake. The interaction with polymake is restricted to writing files and carrying out simple operations. These looked like polymake file KEYWORD1 KEYWORD2 KEYWORD3 on the command line for polymake versions before 4. The keywords are polymake methods without arguments. Since polymake no longer supports this interface the polymaking package provides the script lib/pm_script_arg.pl to emulate this. polymake ––script lib/pm_script_arg.pl KEYWORD1 KEYWORD2 KEYWORD3 Using custom scripts is not supported. Every call to polymake will re-start the program anew. This causes considerable overhead. The number of calls to polymake is reduced by caching the results in the so-called PolymakeObject in GAP. As of polymaking version 0.8.0, old versions of polymake (i.e. versions before 2.7.9) are not supported anymore. 1.1 A few words about the installation of polymake polymaking will try to guess the location of polymake. If this fails, a warning is issued at load time (InfoWarning level 1). Note that the guessing procedure is suppressed when POLYMAKE_COMMAND (3.2-1) is set manually (see 1.2-3). setenv PATH ${PATH}: The general rule is: If polymaking finds polymake by itself, there is nothing to worry about. 1.2 Setting variables for external programs As polymaking uses the program polymake, it needs to know where this program lives. The communication with polymake is done by writing files for polymake and reading its output (as returned to standard output "the prompt"). Note that the interface does not read any polymake file. 1.2-1 SetPolymakeDataDirectory SetPolymakeDataDirectory( dir )  method Sets the directory in which all polymake files are created to dir. The standard place for these files is a temporary directory generated when the package is loaded. This manipulates POLYMAKE_DATA_DIR (3.2-2). 1.2-2 SetPolymakeCommand SetPolymakeCommand( command )  method Sets the name for the polymake program to command. This manipulates POLYMAKE_COMMAND (3.2-1). 1.2-3 Setting variables permanently To permanently set the values of POLYMAKE_COMMAND (3.2-1), and POLYMAKE_DATA_DIR (3.2-2), add the lines  POLYMAKE_DATA_DIR:=Directory("/home/mypolymakedatadir"); POLYMAKE_COMMAND:=Filename(Directory("/home/mypolymakebindir/"),"polymake");  to your .gaprc file (see The .gaprc file???). Note that these have to be before the LoadPackage("polymaking"); line. Or you can change the values of the above variables by editing lib/environment.gi polymaking-0.8.6/doc/internals.xml0000644000076600000240000002217214071427055016205 0ustar mhornstaffGlobal Variables
Getting information about polymake output If set to at least 2, the output of polymake is shown. At level 1, warnings are shown. This is the default. And at level 0, the polymake package remains silent. Contains a string that explains the last occurence of fail as a return value of .
Variables for system interaction The variables for interaction with the system are contained in the file environment.gi. Each of these variables has a function to set it, see . If POLYMAKE&uscore;COMMAND or POLYMAKE&uscore;DATA&uscore;DIR are set at startup, they are not overwritten. So if you don't want (or don't have the rights) to modify environment.gi, you can set the variables in your .gaprc file. This variable should contain the name of the polymake program in the form as returned by Filename So a probable value is Filename(Directory("/usr/local/bin"),"polymake"). In this directory the files for polymake will be created. By default, this generates a temporary directory using DirectoryTemporary
Converting Polymake Output
The General Method When polymake is called, its output is read as a string and then processed as follows: the lines containing upper case letters are found. These are treated as lines containing the keywords. Each of those lines marks the beginning of a block of data. The string is then cut into a list of blocks (also strings). Each block starts with a line containing the keyword and continues with some lines of data. for each of the blocks, the appropriate function of ObjectConverters is called. Here "appropriate" just means, that the keyword of the block coincides with the name of the function. The output of the conversion function is then added to the known properties of the PolymakeObject for which Polymake was called. Converter- Philosopy The converter functions should take meaningful polymake data into meaningful &GAP; data. This sometimes means that the (mathematical) representation is changed. Here is an example: polymake writes vectors as augmented affine vectors of the form 1 a1 a2 a3... which does not go very well with the usual &GAP; conventions of column vectors and multiplying matrices from the right. So polymaking converts such a vector to [a1,a2,a3,...] and the user is left with the problem of augmentation and left or right multiplication.

Another area where the &GAP; object isn't a literal translation from the polymake world is combinatorics. In Polymake, list elements are enumerated starting from 0. &GAP; enumerates lists starting at 1. So the conversion process adds 1 to the numbers corresponding to vertices in facet lists, for example.

The conversion process is done by the following methods: Record having polymake keywords as entry names and the respective converted polymake output as entries. Given a the output of the polymake program as a string string, this method first calls . For each of the returned blocks, the name (=first line) of the block is read and the record is looked up for an entry with that name. If such an entry exists, it (being a function!) is called and passed the block. The returned value is then given the name of the block and added to the record returned by ConvertPolymakeOutputToGapNotation. List of strings -- "blocks"-- The string string is cut at the lines starting with an upper case character and consisting only of upper case letters, numbers and underscore (&uscore;) characters. The parts are returned as a list of strings. The initial string string remains unchanged. The entries of this record are labeled by polymake keywords. Each of the entries is a function which converts a string returned by polymake to &GAP; format. So far, only a few converters are implemented. To see which, try RecNames(ObjectConverters); You can define new converters using the basic functions described in section .

Conversion Functions The following functions are used for the functions in . The string string is converted to a rational number. Unlike Rat, it tests, if the number represented by string is a floating point number an converts it correctly. If this is the case, a waring is issued. If list contains a single string, this string is converted into a number using . Tries to decide if the list list of strings represents a matrix or a list of sets by testing if they start with "{". It then calls either or . The "PlusOne" version calls if list represents a list of sets. The list list of strings is interpreted as a list of row vectors and converted into a matrix. The "KillOnes" version removes the leading ones. As the corresponding "Matrix" version. Just for vectors. ConvertPolymakeIntVectorToGAPPlusOne requires the vector to contain integers. It also adds 1 to every entry. If list contains a single string, which is either 0,false,1, or true this function returns false or true, respectively. Let list be a list containing a single string, which is a list of numbers separated by whitespaces and enclosed by &obrace; and &cbrace; . The returned value is then a set of rational numbers (in the GAP sense). Let list be a list containing several strings representing sets. Then each of these strings is converted to a set of rational numbers and the returned value is the list of all those sets. The "PlusOne" version adds 1 to every entry. Let list be a list of strings representing sets (that is, a list of integers enclosed by &obrace; and &cbrace;). Then a record is returned containing two sets named .vertices and .edges.
polymaking-0.8.6/doc/chap0.txt0000644000076600000240000000720014071427114015207 0ustar mhornstaff  polymaking   Interfacing the geometry software polymake  Version 0.8.6 8 July 2021 Marc Roeder Marc Roeder Email: mailto:roeder.marc@gmail.com ------------------------------------------------------- Abstract This package provides a very basic interface to the polymake program by Ewgenij Gawrilow, Michael Joswig et al. [GJ]. The polymake program itself is not included. ------------------------------------------------------- Copyright © 2007--2013 Marc Roeder. This package is distributed under the terms of the GNU General Public License version 2 or later (at your convenience). See the file "LICENSE" or https://www.gnu.org/copyleft/gpl.html ------------------------------------------------------- Acknowledgements This work has been supported by Marie Curie Grant No. MTKD-CT-2006-042685 ------------------------------------------------------- Contents (polymaking) 1 Installation and Preface 1.1 A few words about the installation of polymake 1.2 Setting variables for external programs 1.2-1 SetPolymakeDataDirectory 1.2-2 SetPolymakeCommand 1.2-3 Setting variables permanently 2 Polymake interaction 2.1 Creating Polymake Objects 2.1-1 CreateEmptyFile 2.1-2 CreatePolymakeObject 2.1-3 CheckAppVerTypList 2.1-4 CreatePolymakeObjectFromFile 2.2 Accessing Properties of Polymake Objects 2.2-1 DirectoryOfPolymakeObject 2.2-2 FilenameOfPolymakeObject 2.2-3 FullFilenameOfPolymakeObject 2.2-4 NamesKnownPropertiesOfPolymakeObject 2.2-5 KnownPropertiesOfPolymakeObject 2.2-6 PropertyOfPolymakeObject 2.3 Example: Creating and Accessing Polymake Objects 2.4 Writing to Polymake Objects 2.4-1 AppendToPolymakeObject 2.4-2 AppendPointlistToPolymakeObject 2.4-3 AppendVertexlistToPolymakeObject 2.4-4 AppendInequalitiesToPolymakeObject 2.4-5 ConvertMatrixToPolymakeString 2.4-6 ClearPolymakeObject 2.4-7 WriteKnownPropertyToPolymakeObject 2.4-8 UnbindKnownPropertyOfPolymakeObject 2.5 Calling Polymake and converting its output 2.5-1 Polymake 2.6 An Example 3 Global Variables 3.1 Getting information about polymake output 3.1-1 InfoPolymaking 3.1-2 POLYMAKE_LAST_FAIL_REASON 3.2 Variables for system interaction 3.2-1 POLYMAKE_COMMAND 3.2-2 POLYMAKE_DATA_DIR 4 Converting Polymake Output 4.1 The General Method 4.1-1 Converter- Philosopy 4.1-2 ConvertPolymakeOutputToGapNotation 4.1-3 SplitPolymakeOutputStringIntoBlocks 4.1-4 ObjectConverters 4.2 Conversion Functions 4.2-1 ConvertPolymakeNumber 4.2-2 ConvertPolymakeScalarToGAP 4.2-3 ConvertPolymakeMatrixOrListOfSetsToGAP 4.2-4 ConvertPolymakeMatrixToGAP 4.2-5 ConvertPolymakeVectorToGAP 4.2-6 ConvertPolymakeBoolToGAP 4.2-7 ConvertPolymakeSetToGAP 4.2-8 ConvertPolymakeListOfSetsToGAP 4.2-9 ConvertPolymakeGraphToGAP  polymaking-0.8.6/doc/chap4_mj.html0000644000076600000240000004114414071427117016036 0ustar mhornstaff GAP (polymaking) - Chapter 4: Converting Polymake Output
Goto Chapter: Top 1 2 3 4 Bib Ind

4 Converting Polymake Output

4.1 The General Method

When polymake is called, its output is read as a string and then processed as follows:

  1. the lines containing upper case letters are found. These are treated as lines containing the keywords. Each of those lines marks the beginning of a block of data.

  2. The string is then cut into a list of blocks (also strings). Each block starts with a line containing the keyword and continues with some lines of data.

  3. for each of the blocks, the appropriate function of ObjectConverters is called. Here "appropriate" just means, that the keyword of the block coincides with the name of the function.

  4. The output of the conversion function is then added to the known properties of the PolymakeObject for which Polymake was called.

4.1-1 Converter- Philosopy

The converter functions should take meaningful polymake data into meaningful GAP data. This sometimes means that the (mathematical) representation is changed. Here is an example: polymake writes vectors as augmented affine vectors of the form 1 a1 a2 a3... which does not go very well with the usual GAP conventions of column vectors and multiplying matrices from the right. So polymaking converts such a vector to [a1,a2,a3,...] and the user is left with the problem of augmentation and left or right multiplication.

Another area where the GAP object isn't a literal translation from the polymake world is combinatorics. In Polymake, list elements are enumerated starting from 0. GAP enumerates lists starting at 1. So the conversion process adds 1 to the numbers corresponding to vertices in facet lists, for example.

The conversion process is done by the following methods:

4.1-2 ConvertPolymakeOutputToGapNotation
‣ ConvertPolymakeOutputToGapNotation( string )( method )

Returns: Record having polymake keywords as entry names and the respective converted polymake output as entries.

Given a the output of the polymake program as a string string, this method first calls SplitPolymakeOutputStringIntoBlocks (4.1-3). For each of the returned blocks, the name (=first line) of the block is read and the record ObjectConverters (4.1-4) is looked up for an entry with that name. If such an entry exists, it (being a function!) is called and passed the block. The returned value is then given the name of the block and added to the record returned by ConvertPolymakeOutputToGapNotation.

4.1-3 SplitPolymakeOutputStringIntoBlocks
‣ SplitPolymakeOutputStringIntoBlocks( string )( method )

Returns: List of strings -- "blocks"--

The string string is cut at the lines starting with an upper case character and consisting only of upper case letters, numbers and underscore (_) characters. The parts are returned as a list of strings. The initial string string remains unchanged.

4.1-4 ObjectConverters
‣ ObjectConverters( global variable )

The entries of this record are labeled by polymake keywords. Each of the entries is a function which converts a string returned by polymake to GAP format. So far, only a few converters are implemented. To see which, try RecNames(ObjectConverters);

You can define new converters using the basic functions described in section 4.2.

4.2 Conversion Functions

The following functions are used for the functions in ObjectConverters (4.1-4).

4.2-1 ConvertPolymakeNumber
‣ ConvertPolymakeNumber( string )( method )

The string string is converted to a rational number. Unlike Rat, it tests, if the number represented by string is a floating point number an converts it correctly. If this is the case, a waring is issued.

4.2-2 ConvertPolymakeScalarToGAP
‣ ConvertPolymakeScalarToGAP( list )( method )

If list contains a single string, this string is converted into a number using ConvertPolymakeNumber (4.2-1).

4.2-3 ConvertPolymakeMatrixOrListOfSetsToGAP
‣ ConvertPolymakeMatrixOrListOfSetsToGAP( list )( method )
‣ ConvertPolymakeMatrixOrListOfSetsToGAPPlusOne( list )( method )

Tries to decide if the list list of strings represents a matrix or a list of sets by testing if they start with "{". It then calls either ConvertPolymakeMatrixToGAP (4.2-4) or ConvertPolymakeListOfSetsToGAP (4.2-8). The "PlusOne" version calls ConvertPolymakeListOfSetsToGAPPlusOne (4.2-8) if list represents a list of sets.

4.2-4 ConvertPolymakeMatrixToGAP
‣ ConvertPolymakeMatrixToGAP( list )( method )
‣ ConvertPolymakeMatrixToGAPKillOnes( list )( method )

The list list of strings is interpreted as a list of row vectors and converted into a matrix. The "KillOnes" version removes the leading ones.

4.2-5 ConvertPolymakeVectorToGAP
‣ ConvertPolymakeVectorToGAP( list )( method )
‣ ConvertPolymakeVectorToGAPKillOne( list )( method )
‣ ConvertPolymakeIntVectorToGAPPlusOne( list )( method )

As the corresponding "Matrix" version. Just for vectors. ConvertPolymakeIntVectorToGAPPlusOne requires the vector to contain integers. It also adds 1 to every entry.

4.2-6 ConvertPolymakeBoolToGAP
‣ ConvertPolymakeBoolToGAP( list )( method )

If list contains a single string, which is either 0,false,1, or true this function returns false or true, respectively.

4.2-7 ConvertPolymakeSetToGAP
‣ ConvertPolymakeSetToGAP( list )( method )

Let list be a list containing a single string, which is a list of numbers separated by whitespaces and enclosed by { and } . The returned value is then a set of rational numbers (in the GAP sense).

4.2-8 ConvertPolymakeListOfSetsToGAP
‣ ConvertPolymakeListOfSetsToGAP( list )( method )
‣ ConvertPolymakeListOfSetsToGAPPlusOne( list )( method )

Let list be a list containing several strings representing sets. Then each of these strings is converted to a set of rational numbers and the returned value is the list of all those sets. The "PlusOne" version adds 1 to every entry.

4.2-9 ConvertPolymakeGraphToGAP
‣ ConvertPolymakeGraphToGAP( list )( method )

Let list be a list of strings representing sets (that is, a list of integers enclosed by { and }). Then a record is returned containing two sets named .vertices and .edges.

Goto Chapter: Top 1 2 3 4 Bib Ind

generated by GAPDoc2HTML

polymaking-0.8.6/doc/manual.css0000644000076600000240000001575414071427117015462 0ustar mhornstaff/* manual.css Frank Lübeck */ /* This is the default CSS style sheet for GAPDoc HTML manuals. */ /* basic settings, fonts, sizes, colors, ... */ body { position: relative; background: #ffffff; color: #000000; width: 70%; margin: 0pt; padding: 15pt; font-family: Helvetica,Verdana,Arial,sans-serif; text-align: justify; } /* no side toc on title page, bib and index */ body.chap0 { width: 95%; } body.chapBib { width: 95%; } body.chapInd { width: 95%; } h1 { font-size: 200%; } h2 { font-size: 160%; } h3 { font-size: 160%; } h4 { font-size: 130%; } h5 { font-size: 100%; } p.foot { font-size: 60%; font-style: normal; } a:link { color: #00008e; text-decoration: none; } a:visited { color: #00008e; text-decoration: none; } a:active { color: #000000; text-decoration: none; } a:hover { background: #eeeeee; } pre { font-family: "Courier New",Courier,monospace; font-size: 100%; color:#111111; } tt,code { font-family: "Courier New",Courier,monospace; font-size: 110%; color: #000000; } var { } /* general alignment classes */ .pcenter { text-align: center; } .pleft { text-align: left; } .pright { text-align: right; } /* layout for the definitions of functions, variables, ... */ div.func { background: #e0e0e0; margin: 0pt 0pt; } /* general and special table settings */ table { border-collapse: collapse; margin-left: auto; margin-right: auto; } td, th { border-style: none; } table.func { padding: 0pt 1ex; margin-left: 1ex; margin-right: 1ex; background: transparent; /* line-height: 1.1; */ width: 100%; } table.func td.tdright { padding-right: 2ex; } /* Example elements (for old converted manuals, now in div+pre */ table.example { background: #efefef; border-style: none; border-width: 0pt; padding: 0px; width: 100% } table.example td { border-style: none; border-width: 0pt; padding: 0ex 1ex; } /* becomes ... */ div.example { background: #efefef; padding: 0ex 1ex; /* overflow-x: auto; */ overflow: auto; } /* Links to chapters in all files at top and bottom. */ /* If there are too many chapters then use 'display: none' here. */ div.chlinktop { background: #dddddd; border-style: solid; border-width: thin; margin: 2px; text-align: center; } div.chlinktop a { margin: 3px; } div.chlinktop a:hover { background: #ffffff; } div.chlinkbot { background: #dddddd; border-style: solid; border-width: thin; margin: 2px; text-align: center; /* width: 100%; */ } div.chlinkbot a { margin: 3px; } span.chlink1 { } /* and this is for the "Top", "Prev", "Next" links */ div.chlinkprevnexttop { background: #dddddd; border-style: solid; border-width: thin; text-align: center; margin: 2px; } div.chlinkprevnexttop a:hover { background: #ffffff; } div.chlinkprevnextbot { background: #dddddd; border-style: solid; border-width: thin; text-align: center; margin: 2px; } div.chlinkprevnextbot a:hover { background: #ffffff; } /* table of contents, initially don't display subsections */ div.ContSSBlock { display: none; } div.ContSSBlock br { display: none; } /* format in separate lines */ span.tocline { display: block; width: 100%; } div.ContSSBlock a { display: block; } /* this is for the main table of contents */ div.ContChap { } div.ContChap div.ContSect:hover div.ContSSBlock { display: block; position: absolute; background: #eeeeee; border-style: solid; border-width: 1px 4px 4px 1px; border-color: #666666; padding-left: 0.5ex; color: #000000; left: 20%; width: 40%; z-index: 10000; } div.ContSSBlock a:hover { background: #ffffff; } /* and here for the side menu of contents in the chapter files */ div.ChapSects { } div.ChapSects a:hover { background: #eeeeee; } div.ChapSects a:hover { display: block; width: 100%; background: #eeeeee; color: #000000; } div.ChapSects div.ContSect:hover div.ContSSBlock { display: block; position: fixed; background: #eeeeee; border-style: solid; border-width: 1px 2px 2px 1px; border-color: #666666; padding-left: 0ex; padding-right: 0.5ex; color: #000000; left: 54%; width: 25%; z-index: 10000; } div.ChapSects div.ContSect:hover div.ContSSBlock a { display: block; margin-left: 3px; } div.ChapSects div.ContSect:hover div.ContSSBlock a:hover { display: block; background: #ffffff; } div.ContSect { text-align: left; margin-left: 1em; } div.ChapSects { position: fixed; left: 75%; font-size: 90%; overflow: auto; top: 10px; bottom: 0px; } /* Table elements */ table.GAPDocTable { border-collapse: collapse; border-style: none; border-color: black; } table.GAPDocTable td, table.GAPDocTable th { padding: 3pt; border-width: thin; border-style: solid; border-color: #555555; } caption.GAPDocTable { caption-side: bottom; width: 70%; margin-top: 1em; margin-left: auto; margin-right: auto; } td.tdleft { text-align: left; } table.GAPDocTablenoborder { border-collapse: collapse; border-style: none; border-color: black; } table.GAPDocTablenoborder td, table.GAPDocTable th { padding: 3pt; border-width: 0pt; border-style: solid; border-color: #555555; } caption.GAPDocTablenoborder { caption-side: bottom; width: 70%; margin-top: 1em; margin-left: auto; margin-right: auto; } td.tdleft { text-align: left; } td.tdright { text-align: right; } td.tdcenter { text-align: center; } /* Colors and fonts can be overwritten for some types of elements. */ /* Verb elements */ pre.normal { color: #000000; } /* Func-like elements and Ref to Func-like */ code.func { color: #000000; } /* K elements */ code.keyw { color: #770000; } /* F elements */ code.file { color: #8e4510; } /* C elements */ code.code { } /* Item elements */ code.i { } /* Button elements */ strong.button { } /* Headings */ span.Heading { } /* Arg elements */ var.Arg { color: #006600; } /* Example elements, is in tables, see above */ div.Example { } /* Package elements */ strong.pkg { } /* URL-like elements */ span.URL { } /* Mark elements */ strong.Mark { } /* Ref elements */ b.Ref { } span.Ref { } /* this contains the contents page */ div.contents { } /* this contains the index page */ div.index { } /* ignore some text for non-css layout */ span.nocss { display: none; } /* colors for ColorPrompt like examples */ span.GAPprompt { color: #000097; font-weight: normal; } span.GAPbrkprompt { color: #970000; font-weight: normal; } span.GAPinput { color: #970000; } /* Bib entries */ p.BibEntry { } span.BibKey { color: #005522; } span.BibKeyLink { } b.BibAuthor { } i.BibTitle { } i.BibBookTitle { } span.BibEditor { } span.BibJournal { } span.BibType { } span.BibPublisher { } span.BibSchool { } span.BibEdition { } span.BibVolume { } span.BibSeries { } span.BibNumber { } span.BibPages { } span.BibOrganization { } span.BibAddress { } span.BibYear { } span.BibPublisher { } span.BibNote { } span.BibHowpublished { } polymaking-0.8.6/doc/chap4.txt0000644000076600000240000002046714071427114015225 0ustar mhornstaff 4 Converting Polymake Output 4.1 The General Method When polymake is called, its output is read as a string and then processed as follows: 1 the lines containing upper case letters are found. These are treated as lines containing the keywords. Each of those lines marks the beginning of a block of data. 2 The string is then cut into a list of blocks (also strings). Each block starts with a line containing the keyword and continues with some lines of data. 3 for each of the blocks, the appropriate function of ObjectConverters is called. Here "appropriate" just means, that the keyword of the block coincides with the name of the function. 4 The output of the conversion function is then added to the known properties of the PolymakeObject for which Polymake was called. 4.1-1 Converter- Philosopy The converter functions should take meaningful polymake data into meaningful GAP data. This sometimes means that the (mathematical) representation is changed. Here is an example: polymake writes vectors as augmented affine vectors of the form 1 a1 a2 a3... which does not go very well with the usual GAP conventions of column vectors and multiplying matrices from the right. So polymaking converts such a vector to [a1,a2,a3,...] and the user is left with the problem of augmentation and left or right multiplication. Another area where the GAP object isn't a literal translation from the polymake world is combinatorics. In Polymake, list elements are enumerated starting from 0. GAP enumerates lists starting at 1. So the conversion process adds 1 to the numbers corresponding to vertices in facet lists, for example. The conversion process is done by the following methods: 4.1-2 ConvertPolymakeOutputToGapNotation ConvertPolymakeOutputToGapNotation( string )  method Returns: Record having polymake keywords as entry names and the respective converted polymake output as entries. Given a the output of the polymake program as a string string, this method first calls SplitPolymakeOutputStringIntoBlocks (4.1-3). For each of the returned blocks, the name (=first line) of the block is read and the record ObjectConverters (4.1-4) is looked up for an entry with that name. If such an entry exists, it (being a function!) is called and passed the block. The returned value is then given the name of the block and added to the record returned by ConvertPolymakeOutputToGapNotation. 4.1-3 SplitPolymakeOutputStringIntoBlocks SplitPolymakeOutputStringIntoBlocks( string )  method Returns: List of strings -- "blocks"-- The string string is cut at the lines starting with an upper case character and consisting only of upper case letters, numbers and underscore (_) characters. The parts are returned as a list of strings. The initial string string remains unchanged. 4.1-4 ObjectConverters ObjectConverters  global variable The entries of this record are labeled by polymake keywords. Each of the entries is a function which converts a string returned by polymake to GAP format. So far, only a few converters are implemented. To see which, try RecNames(ObjectConverters); You can define new converters using the basic functions described in section 4.2. 4.2 Conversion Functions The following functions are used for the functions in ObjectConverters (4.1-4). 4.2-1 ConvertPolymakeNumber ConvertPolymakeNumber( string )  method The string string is converted to a rational number. Unlike Rat, it tests, if the number represented by string is a floating point number an converts it correctly. If this is the case, a waring is issued. 4.2-2 ConvertPolymakeScalarToGAP ConvertPolymakeScalarToGAP( list )  method If list contains a single string, this string is converted into a number using ConvertPolymakeNumber (4.2-1). 4.2-3 ConvertPolymakeMatrixOrListOfSetsToGAP ConvertPolymakeMatrixOrListOfSetsToGAP( list )  method ConvertPolymakeMatrixOrListOfSetsToGAPPlusOne( list )  method Tries to decide if the list list of strings represents a matrix or a list of sets by testing if they start with "{". It then calls either ConvertPolymakeMatrixToGAP (4.2-4) or ConvertPolymakeListOfSetsToGAP (4.2-8). The "PlusOne" version calls ConvertPolymakeListOfSetsToGAPPlusOne (4.2-8) if list represents a list of sets. 4.2-4 ConvertPolymakeMatrixToGAP ConvertPolymakeMatrixToGAP( list )  method ConvertPolymakeMatrixToGAPKillOnes( list )  method The list list of strings is interpreted as a list of row vectors and converted into a matrix. The "KillOnes" version removes the leading ones. 4.2-5 ConvertPolymakeVectorToGAP ConvertPolymakeVectorToGAP( list )  method ConvertPolymakeVectorToGAPKillOne( list )  method ConvertPolymakeIntVectorToGAPPlusOne( list )  method As the corresponding "Matrix" version. Just for vectors. ConvertPolymakeIntVectorToGAPPlusOne requires the vector to contain integers. It also adds 1 to every entry. 4.2-6 ConvertPolymakeBoolToGAP ConvertPolymakeBoolToGAP( list )  method If list contains a single string, which is either 0,false,1, or true this function returns false or true, respectively. 4.2-7 ConvertPolymakeSetToGAP ConvertPolymakeSetToGAP( list )  method Let list be a list containing a single string, which is a list of numbers separated by whitespaces and enclosed by { and } . The returned value is then a set of rational numbers (in the GAP sense). 4.2-8 ConvertPolymakeListOfSetsToGAP ConvertPolymakeListOfSetsToGAP( list )  method ConvertPolymakeListOfSetsToGAPPlusOne( list )  method Let list be a list containing several strings representing sets. Then each of these strings is converted to a set of rational numbers and the returned value is the list of all those sets. The "PlusOne" version adds 1 to every entry. 4.2-9 ConvertPolymakeGraphToGAP ConvertPolymakeGraphToGAP( list )  method Let list be a list of strings representing sets (that is, a list of integers enclosed by { and }). Then a record is returned containing two sets named .vertices and .edges. polymaking-0.8.6/doc/ragged.css0000644000076600000240000000023114071427117015416 0ustar mhornstaff/* times.css Frank Lübeck */ /* Change default CSS to use Times font. */ body { text-align: left; } polymaking-0.8.6/doc/chap1.html0000644000076600000240000001751114071427117015346 0ustar mhornstaff GAP (polymaking) - Chapter 1: Installation and Preface
Goto Chapter: Top 1 2 3 4 Bib Ind

1 Installation and Preface

To install the package, just unpack it in your packages directory (usually ~/gap/pkg for local installation). To use polymaking, you need a working installation of the program polymake https://polymake.org. The package has been tested on linux and Mac OS X (10.4, 10.5 and 10.6). But it should be as platform independent as GAP and polymake.

The interaction with polymake is restricted to writing files and carrying out simple operations. These looked like
polymake file KEYWORD1 KEYWORD2 KEYWORD3
on the command line for polymake versions before 4. The keywords are polymake methods without arguments. Since polymake no longer supports this interface the polymaking package provides the script lib/pm_script_arg.pl to emulate this.
polymake ––script lib/pm_script_arg.pl KEYWORD1 KEYWORD2 KEYWORD3
Using custom scripts is not supported.
Every call to polymake will re-start the program anew. This causes considerable overhead. The number of calls to polymake is reduced by caching the results in the so-called PolymakeObject in GAP. As of polymaking version 0.8.0, old versions of polymake (i.e. versions before 2.7.9) are not supported anymore.

1.1 A few words about the installation of polymake

polymaking will try to guess the location of polymake. If this fails, a warning is issued at load time (InfoWarning level 1). Note that the guessing procedure is suppressed when POLYMAKE_COMMAND (3.2-1) is set manually (see 1.2-3).
setenv PATH ${PATH}:<your polymakepath>
The general rule is: If polymaking finds polymake by itself, there is nothing to worry about.

1.2 Setting variables for external programs

As polymaking uses the program polymake, it needs to know where this program lives. The communication with polymake is done by writing files for polymake and reading its output (as returned to standard output "the prompt"). Note that the interface does not read any polymake file.

1.2-1 SetPolymakeDataDirectory
‣ SetPolymakeDataDirectory( dir )( method )

Sets the directory in which all polymake files are created to dir. The standard place for these files is a temporary directory generated when the package is loaded. This manipulates POLYMAKE_DATA_DIR (3.2-2).

1.2-2 SetPolymakeCommand
‣ SetPolymakeCommand( command )( method )

Sets the name for the polymake program to command. This manipulates POLYMAKE_COMMAND (3.2-1).

1.2-3 Setting variables permanently

To permanently set the values of POLYMAKE_COMMAND (3.2-1), and POLYMAKE_DATA_DIR (3.2-2), add the lines

POLYMAKE_DATA_DIR:=Directory("/home/mypolymakedatadir");
POLYMAKE_COMMAND:=Filename(Directory("/home/mypolymakebindir/"),"polymake");

to your .gaprc file (see ???). Note that these have to be before the LoadPackage("polymaking"); line. Or you can change the values of the above variables by editing lib/environment.gi

Goto Chapter: Top 1 2 3 4 Bib Ind

generated by GAPDoc2HTML

polymaking-0.8.6/doc/environment.xml0000644000076600000240000000725014071427055016552 0ustar mhornstaff Installation and Preface To install the package, just unpack it in your packages directory (usually ~/gap/pkg for local installation). To use polymaking, you need a working installation of the program polymake https://polymake.org. The package has been tested on linux and Mac OS X (10.4, 10.5 and 10.6). But it should be as platform independent as &GAP; and polymake.

The interaction with polymake is restricted to writing files and carrying out simple operations. These looked like
polymake file KEYWORD1 KEYWORD2 KEYWORD3
on the command line for polymake versions before 4. The keywords are polymake methods without arguments. Since polymake no longer supports this interface the polymaking package provides the script lib/pm_script_arg.pl to emulate this.
polymake ––script lib/pm_script_arg.pl KEYWORD1 KEYWORD2 KEYWORD3
Using custom scripts is not supported.
Every call to polymake will re-start the program anew. This causes considerable overhead. The number of calls to polymake is reduced by caching the results in the so-called PolymakeObject in GAP. As of polymaking version 0.8.0, old versions of polymake (i.e. versions before 2.7.9) are not supported anymore.

A few words about the installation of polymake polymaking will try to guess the location of polymake. If this fails, a warning is issued at load time (InfoWarning level 1). Note that the guessing procedure is suppressed when is set manually (see ).
]]>
The general rule is: If polymaking finds polymake by itself, there is nothing to worry about.
Setting variables for external programs As polymaking uses the program polymake, it needs to know where this program lives. The communication with polymake is done by writing files for polymake and reading its output (as returned to standard output "the prompt"). Note that the interface does not read any polymake file. Sets the directory in which all polymake files are created to dir. The standard place for these files is a temporary directory generated when the package is loaded. This manipulates . Sets the name for the polymake program to command. This manipulates . Setting variables permanently To permanently set the values of , and , add the lines POLYMAKE_DATA_DIR:=Directory("/home/mypolymakedatadir"); POLYMAKE_COMMAND:=Filename(Directory("/home/mypolymakebindir/"),"polymake"); to your .gaprc file (see ). Note that these have to be before the LoadPackage("polymaking"); line. Or you can change the values of the above variables by editing lib/environment.gi
polymaking-0.8.6/doc/toggless.js0000644000076600000240000000420514071427117015645 0ustar mhornstaff/* toggless.js Frank Lübeck */ /* this file contains two functions: mergeSideTOCHooks: this changes div.ContSect elements to the class ContSectClosed and includes a hook to toggle between ContSectClosed and ContSectOpen. openclosetoc: this function does the toggling, the rest is done by CSS */ closedTOCMarker = "▶ "; openTOCMarker = "▼ "; noTOCMarker = " "; /* merge hooks into side toc for opening/closing subsections with openclosetoc */ function mergeSideTOCHooks() { var hlist = document.getElementsByTagName("div"); for (var i = 0; i < hlist.length; i++) { if (hlist[i].className == "ContSect") { var chlds = hlist[i].childNodes; var el = document.createElement("span"); var oncl = document.createAttribute("class"); oncl.nodeValue = "toctoggle"; el.setAttributeNode(oncl); var cont; if (chlds.length > 2) { var oncl = document.createAttribute("onclick"); oncl.nodeValue = "openclosetoc(event)"; el.setAttributeNode(oncl); cont = document.createTextNode(closedTOCMarker); } else { cont = document.createTextNode(noTOCMarker); } el.appendChild(cont); hlist[i].firstChild.insertBefore(el, hlist[i].firstChild.firstChild); hlist[i].className = "ContSectClosed"; } } } function openclosetoc (event) { /* first two steps to make it work in most browsers */ var evt=window.event || event; if (!evt.target) evt.target=evt.srcElement; var markClosed = document.createTextNode(closedTOCMarker); var markOpen = document.createTextNode(openTOCMarker); var par = evt.target.parentNode.parentNode; if (par.className == "ContSectOpen") { par.className = "ContSectClosed"; evt.target.replaceChild(markClosed, evt.target.firstChild); } else if (par.className == "ContSectClosed") { par.className = "ContSectOpen"; evt.target.replaceChild(markOpen, evt.target.firstChild); } } /* adjust jscontent which is called onload */ jscontentfuncs.push(mergeSideTOCHooks); polymaking-0.8.6/doc/chapInd_mj.html0000644000076600000240000001621714071427117016410 0ustar mhornstaff GAP (polymaking) - Index
Goto Chapter: Top 1 2 3 4 Bib Ind

Index

AppendInequalitiesToPolymakeObject 2.4-4
AppendPointlistToPolymakeObject 2.4-2
AppendToPolymakeObject 2.4-1
AppendVertexlistToPolymakeObject 2.4-3
CheckAppVerTypList 2.1-3
ClearPolymakeObject 2.4-6 2.4-6
ConvertMatrixToPolymakeString 2.4-5
ConvertPolymakeBoolToGAP 4.2-6
ConvertPolymakeGraphToGAP 4.2-9
ConvertPolymakeIntVectorToGAPPlusOne 4.2-5
ConvertPolymakeListOfSetsToGAP 4.2-8
ConvertPolymakeListOfSetsToGAPPlusOne 4.2-8
ConvertPolymakeMatrixOrListOfSetsToGAP 4.2-3
ConvertPolymakeMatrixOrListOfSetsToGAPPlusOne 4.2-3
ConvertPolymakeMatrixToGAP 4.2-4
ConvertPolymakeMatrixToGAPKillOnes 4.2-4
ConvertPolymakeNumber 4.2-1
ConvertPolymakeOutputToGapNotation 4.1-2
ConvertPolymakeScalarToGAP 4.2-2
ConvertPolymakeSetToGAP 4.2-7
ConvertPolymakeVectorToGAP 4.2-5
ConvertPolymakeVectorToGAPKillOne 4.2-5
CreateEmptyFile 2.1-1
CreatePolymakeObject 2.1-2 2.1-2 2.1-2 2.1-2 2.1-2 2.1-2
CreatePolymakeObjectFromFile 2.1-4 2.1-4
DirectoryOfPolymakeObject 2.2-1
FilenameOfPolymakeObject 2.2-2
FullFilenameOfPolymakeObject 2.2-3
InfoPolymaking 3.1-1
KnownPropertiesOfPolymakeObject 2.2-5
NamesKnownPropertiesOfPolymakeObject 2.2-4
ObjectConverters 4.1-4
Polymake 2.5-1
POLYMAKE_COMMAND 3.2-1
POLYMAKE_DATA_DIR 3.2-2
POLYMAKE_LAST_FAIL_REASON 3.1-2
PropertyOfPolymakeObject 2.2-6
SetPolymakeCommand 1.2-2
SetPolymakeDataDirectory 1.2-1
SplitPolymakeOutputStringIntoBlocks 4.1-3
UnbindKnownPropertyOfPolymakeObject 2.4-8
WriteKnownPropertyToPolymakeObject 2.4-7

Goto Chapter: Top 1 2 3 4 Bib Ind

generated by GAPDoc2HTML

polymaking-0.8.6/doc/chooser.html0000644000076600000240000000745614071427117016023 0ustar mhornstaff GAPDoc Style Chooser

Setting preferences for GAPDoc manuals

Unfold subsections in menus only by mouse clicks: no (default)     yes

Show GAP examples as in sessions with ColorPrompt(true): yes (default)     no

Display side of table of contents within chapters: right (default)     left

Main document font: Helvetica/sans serif (default)     Times/serif

Paragraph formatting: left-right justified (default)     ragged right

Apply settings to last page.

polymaking-0.8.6/tst/0000755000076600000240000000000014071427055013525 5ustar mhornstaffpolymaking-0.8.6/tst/visual.poly0000644000076600000240000000022414071427055015733 0ustar mhornstaff_application polytope _type Polytope POINTS 1 0 0 0 1 -4 0 4 1 -2 6 2 1 6 -2 6 1 4 4 8 1 8 4 4 1 4 8 4 1 6 -2 2 1 0 0 8 1 -2 6 6 1 4 4 0 1 0 -4 4 polymaking-0.8.6/tst/pplane.poly0000644000076600000240000000037514071427055015716 0ustar mhornstaff_application topaz _version 2.3 _type SimplicialComplex DESCRIPTION The projective plane. FACETS {0 1 4} {0 1 5} {0 2 3} {0 2 4} {0 3 5} {1 2 3} {1 2 5} {1 3 4} {2 4 5} {3 4 5} DIM 2 MANIFOLD 1 CLOSED_PSEUDO_MANIFOLD 1 ORIENTED_PSEUDO_MANIFOLD 0 polymaking-0.8.6/tst/visual.tst0000644000076600000240000000041714071427055015566 0ustar mhornstaffgap> LoadPackage("polymaking"); gap> dir:=DirectoriesPackageLibrary("polymaking", "tst")[1];; gap> SetPolymakeDataDirectory(dir);; gap> poly := CreatePolymakeObjectFromFile(dir, "visual.poly"); gap> Polymake(poly, "VISUAL"); fail polymaking-0.8.6/tst/polymaking.tst0000644000076600000240000001241714071427055016440 0ustar mhornstaffgap> START_TEST("polymaking tst file"); ## generate an empty file> ## gap> poly:=CreatePolymakeObject(); gap> polyfile:=FullFilenameOfPolymakeObject( poly );; gap> IsReadableFile(polyfile); true gap> IsWritableFile(polyfile); true gap> vs:=[ [ 1/4, 1/75, 1/22 ], [ 1/37, 1/62, 1/19 ], [ 1/91, 1/24, 1/88 ], > [ 1/59, 1/67, 1/5 ], [ 1/85, 1/31, 1/76 ], [ 1/4, 1/72, 1/44 ], > [ 1/47, 1/33, 1/55 ], [ 1/79, 1/21, 1/99 ], [ 1/3, 1/30, 1/12 ], > [ 1/71, 1/48, 1/71 ] ] > ;; ## Write random points to the file and do something ## gap> AppendPointlistToPolymakeObject(poly,vs); gap> Polymake(poly,"POINTS"); [ [ 1/4, 1/75, 1/22 ], [ 1/37, 1/62, 1/19 ], [ 1/91, 1/24, 1/88 ], [ 1/59, 1/67, 1/5 ], [ 1/85, 1/31, 1/76 ], [ 1/4, 1/72, 1/44 ], [ 1/47, 1/33, 1/55 ], [ 1/79, 1/21, 1/99 ], [ 1/3, 1/30, 1/12 ], [ 1/71, 1/48, 1/71 ] ] gap> last=vs; true gap> Polymake(poly,"N_FACETS"); 14 gap> Polymake(poly,"VOLUME"); 56551499691708521629/103286715323123543904000 gap> Polymake(poly,"DIM"); 3 gap> Polymake(poly,"ALTSHULER_DET"); 4032 gap> Polymake(poly,"AMBIENT_DIM"); 3 gap> Polymake(poly,"BALANCED"); true gap> Polymake(poly,"BALANCE"); 1 gap> Polymake(poly,"BOUNDED"); true gap> Polymake(poly,"COCUBICALITY"); 1 gap> Polymake(poly,"DUAL_CONNECTIVITY"); 3 gap> Polymake(poly,"DUAL_DIAMETER"); 4 gap> Polymake(poly,"ESSENTIALLY_GENERIC"); true gap> Polymake(poly,"F_VECTOR"); [ 9, 21, 14 ] gap> Polymake(poly,"F2_VECTOR"); [ [ 9, 42, 42 ], [ 42, 21, 42 ], [ 42, 42, 14 ] ] gap> Polymake(poly,"FACES"); [ [ ], [ 1 ], [ 2 ], [ 3 ], [ 4 ], [ 5 ], [ 6 ], [ 7 ], [ 8 ], [ 9 ], [ 1, 2 ], [ 1, 4 ], [ 1, 6 ], [ 1, 8 ], [ 2, 4 ], [ 2, 6 ], [ 2, 9 ], [ 3, 4 ], [ 3, 5 ], [ 3, 7 ], [ 3, 9 ], [ 4, 5 ], [ 4, 7 ], [ 4, 8 ], [ 4, 9 ], [ 5, 9 ], [ 6, 7 ], [ 6, 8 ], [ 6, 9 ], [ 7, 8 ], [ 7, 9 ], [ 1, 6, 8 ], [ 2, 4, 9 ], [ 3, 4, 7 ], [ 6, 7, 8 ], [ 4, 7, 8 ], [ 3, 7, 9 ], [ 6, 7, 9 ], [ 1, 4, 8 ], [ 1, 2, 4 ], [ 2, 6, 9 ], [ 1, 2, 6 ], [ 3, 5, 9 ], [ 4, 5, 9 ], [ 3, 4, 5 ], [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ] ] gap> Polymake(poly,"ADJACENCY"); [ [ 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 11, 12, 13, 14 ], [ 11, 15, 16, 17 ], [ 18, 19, 20, 21 ], [ 12, 15, 18, 22, 23, 24, 25 ], [ 19, 22, 26 ], [ 13, 16, 27, 28, 29 ], [ 20, 23, 27, 30, 31 ], [ 14, 24, 28, 30 ], [ 17, 21, 25, 26, 29, 31 ], [ 40, 42 ], [ 39, 40 ], [ 32, 42 ], [ 32, 39 ], [ 33, 40 ], [ 41, 42 ], [ 33, 41 ], [ 34, 45 ], [ 43, 45 ], [ 34, 37 ], [ 37, 43 ], [ 44, 45 ], [ 34, 36 ], [ 36, 39 ], [ 33, 44 ], [ 43, 44 ], [ 35, 38 ], [ 32, 35 ], [ 38, 41 ], [ 35, 36 ], [ 37, 38 ], [ 46 ], [ 46 ], [ 46 ], [ 46 ], [ 46 ], [ 46 ], [ 46 ], [ 46 ], [ 46 ], [ 46 ], [ 46 ], [ 46 ], [ 46 ], [ 46 ], [ ] ] gap> Polymake(poly,"FACET_DEGREES"); [ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 ] gap> Polymake(poly,"FACETS"); [ [ 87, -452, 1800, 44 ], [ -42443748, 474787219, 1685061792, 46231655 ], [ 1403725, 643437067, -190478253, -47332395 ], [ 27853, -108309, -630630, 351252 ], [ 13885273, -1477537, -280945070, -48335100 ], [ -145029, 1373099, 1147776, 7226208 ], [ -235790, -456383, 2076480, 14126013 ], [ 23349, -103132, 738675, -163130 ] , [ -1580061339, 1195816838, 93208905900, 843077785 ], [ -2006700, 2225735, 88056864, 9999187 ], [ -51826, 38850, 2915550, 71269 ], [ -574215, 16096535, 4705056, 17713168 ], [ -519350247, 28577972485, 5781969216, -256601080 ], [ -2303641863, 164204234285, 12897123192, -3359875640 ] ] gap> Polymake(poly,"FAR_HYPERPLANE"); [ 1, 0, 0, 0 ] gap> Polymake(poly,"FEASIBLE"); true gap> Polymake(poly,"N_BOUNDED_VERTICES"); 9 gap> Polymake(poly,"N_FLAGS"); 1 gap> Polymake(poly,"N_POINTS"); 10 gap> Polymake(poly,"N_RIDGES"); 21 gap> Polymake(poly,"N_VERTEX_FACET_INC"); 42 gap> Polymake(poly,"N_VERTICES"); 9 gap> Polymake(poly,"NEIGHBORLINESS"); 1 gap> Polymake(poly,"NEIGHBORLY"); true gap> Polymake(poly,"MINIMAL_VERTEX_ANGLE"); #I Warnig!converting a floating point number 314159265358979/100000000000000 gap> Polymake(poly,"POINTED"); true gap> Polymake(poly,"POSITIVE"); true gap> Polymake(poly,"REL_INT_POINT"); [ 526671192497/5114383067430, 12246977/471063600, 2419163/48078360 ] gap> Polymake(poly,"SIMPLICIAL"); true gap> Polymake(poly,"VALID_POINT"); [ 1/4, 1/75, 1/22 ] gap> Polymake(poly,"VERTEX_BARYCENTER"); [ 526671192497/5114383067430, 12246977/471063600, 2419163/48078360 ] gap> Polymake(poly,"VERTEX_DEGREES"); [ 4, 4, 4, 7, 3, 5, 5, 4, 6 ] gap> Polymake(poly,"VERTICES"); [ [ 1/4, 1/75, 1/22 ], [ 1/37, 1/62, 1/19 ], [ 1/91, 1/24, 1/88 ], [ 1/59, 1/67, 1/5 ], [ 1/85, 1/31, 1/76 ], [ 1/4, 1/72, 1/44 ], [ 1/79, 1/21, 1/99 ], [ 1/3, 1/30, 1/12 ], [ 1/71, 1/48, 1/71 ] ] gap> Polymake(poly,"VERTICES_IN_FACETS"); [ [ 1, 6, 8 ], [ 2, 4, 9 ], [ 3, 4, 7 ], [ 6, 7, 8 ], [ 4, 7, 8 ], [ 3, 7, 9 ], [ 6, 7, 9 ], [ 1, 4, 8 ], [ 1, 2, 4 ], [ 2, 6, 9 ], [ 1, 2, 6 ], [ 3, 5, 9 ], [ 4, 5, 9 ], [ 3, 4, 5 ] ] ## test external files: gap> dir:=DirectoriesPackageLibrary("polymaking", "tst")[1];; gap> SetPolymakeDataDirectory(dir);; gap> plane:=CreatePolymakeObjectFromFile("pplane.poly"); # gap> Polymake(plane,"FACES DIMS"); fail gap> Polymake(plane, "FACETS"); [ [ 1, 2, 5 ], [ 1, 2, 6 ], [ 1, 3, 4 ], [ 1, 3, 5 ], [ 1, 4, 6 ], [ 2, 3, 4 ], [ 2, 3, 6 ], [ 2, 4, 5 ], [ 3, 5, 6 ], [ 4, 5, 6 ] ] # gap> STOP_TEST("polymaking.tst", 10000); polymaking-0.8.6/tst/testall.g0000644000076600000240000000033514071427055015346 0ustar mhornstaffLoadPackage("polymaking"); # This needs to be done manually exclude:=["visual.tst"]; TestDirectory( DirectoriesPackageLibrary("polymaking", "tst"), rec(exclude := exclude, exitGAP := true)); FORCE_QUIT_GAP(1); polymaking-0.8.6/init.g0000644000076600000240000000053514071427055014031 0ustar mhornstaffReadPackage("polymaking","lib/environment.gd" ); ReadPackage("polymaking","lib/Objects.gd"); ReadPackage("polymaking","lib/construct.gd"); ReadPackage("polymaking","lib/workaround_maps.gd"); ReadPackage("polymaking","lib/convert.gd"); ReadPackage("polymaking","lib/ObjectConverters.gd"); ReadPackage("polymaking","lib/application_version_type.gd"); polymaking-0.8.6/read.g0000644000076600000240000000053414071427055014000 0ustar mhornstaffReadPackage("polymaking","lib/environment.gi"); ReadPackage("polymaking","lib/Objects.gi"); ReadPackage("polymaking","lib/construct.gi"); ReadPackage("polymaking","lib/workaround_maps.gi"); ReadPackage("polymaking","lib/convert.gi"); ReadPackage("polymaking","lib/ObjectConverters.gi"); ReadPackage("polymaking","lib/application_version_type.gi");